@smarterplan/ngx-smarterplan-core 1.4.10 → 1.4.12

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 (28) hide show
  1. package/esm2022/lib/services/matterport-import.service.mjs +13 -62
  2. package/esm2022/lib/services/matterport-navigation.service.mjs +131 -1
  3. package/esm2022/lib/services/matterport-tag-copy.service.mjs +865 -0
  4. package/esm2022/lib/services/matterport-tag.service.mjs +13 -1
  5. package/esm2022/lib/services/matterport.service.mjs +55 -4
  6. package/esm2022/lib/services/models/equipment.service.mjs +16 -1
  7. package/esm2022/lib/services/models/navigation.service.mjs +4 -1
  8. package/esm2022/lib/services/models/poi.service.mjs +86 -8
  9. package/esm2022/lib/services/models/ticket.service.mjs +3 -2
  10. package/esm2022/lib/services/s3.service.mjs +12 -1
  11. package/esm2022/lib/services/utils/matterport-transform.util.mjs +39 -0
  12. package/esm2022/lib/services/viewer.service.mjs +12 -6
  13. package/esm2022/lib/tokens/matterport-sdk-key.token.mjs +8 -0
  14. package/esm2022/public-api.mjs +6 -1
  15. package/fesm2022/smarterplan-ngx-smarterplan-core.mjs +1227 -78
  16. package/fesm2022/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
  17. package/lib/services/matterport-import.service.d.ts +2 -1
  18. package/lib/services/matterport-navigation.service.d.ts +25 -0
  19. package/lib/services/matterport-tag-copy.service.d.ts +129 -0
  20. package/lib/services/matterport.service.d.ts +27 -1
  21. package/lib/services/models/equipment.service.d.ts +8 -0
  22. package/lib/services/models/poi.service.d.ts +14 -0
  23. package/lib/services/s3.service.d.ts +8 -0
  24. package/lib/services/utils/matterport-transform.util.d.ts +21 -0
  25. package/lib/services/viewer.service.d.ts +2 -1
  26. package/lib/tokens/matterport-sdk-key.token.d.ts +7 -0
  27. package/package.json +1 -1
  28. package/public-api.d.ts +3 -0
@@ -50,6 +50,12 @@ export class MatterportTagService {
50
50
  async addMattertagToViewer(sdk, mattertagData) {
51
51
  if (!sdk)
52
52
  return null;
53
+ console.log('---------------');
54
+ console.log('element id ' + mattertagData.elementID);
55
+ console.log('position: ', mattertagData.getPosition());
56
+ console.log('rotation: ', mattertagData.getRotation());
57
+ console.log('sweep id: ', mattertagData.getSweepID());
58
+ console.log('---------------');
53
59
  this.tagAddQueue = this.tagAddQueue.then(async () => {
54
60
  const data = mattertagData.getData();
55
61
  const existingId = data?.id || null;
@@ -303,6 +309,12 @@ export class MatterportTagService {
303
309
  }
304
310
  mattertagData.setPoi(poi);
305
311
  const createdTagID = await this.addMattertagToViewer(sdk, mattertagData);
312
+ console.log('---------------');
313
+ console.log('element id ' + mattertagData.elementID);
314
+ console.log('position: ', mattertagData.getPosition());
315
+ console.log('rotation: ', mattertagData.getRotation());
316
+ console.log('sweep id: ', mattertagData.getSweepID());
317
+ console.log('---------------');
306
318
  if (createdTagID && sdk) {
307
319
  await wait(100);
308
320
  await setTagIconAndOpacity(createdTagID, mattertagData);
@@ -470,4 +482,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
470
482
  providedIn: 'root',
471
483
  }]
472
484
  }], ctorParameters: () => [{ type: i1.MatterportNavigationService }] });
473
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC10YWcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvc2VydmljZXMvbWF0dGVycG9ydC10YWcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQWtELFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV6RyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7OztBQU0xQyxNQUFNLE9BQU8sb0JBQW9CO0lBYXJCO0lBWkgsZUFBZSxHQUErQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3hELFdBQVcsR0FBaUIsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzlDLGlCQUFpQixHQUFrQixJQUFJLENBQUM7SUFDeEMsU0FBUyxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7SUFDbEMsWUFBWSxHQUFrQixFQUFFLENBQUM7SUFDakMsZUFBZSxHQUFXLEVBQUUsQ0FBQztJQUM3QixjQUFjLEdBQVksS0FBSyxDQUFDO0lBQ2hDLFVBQVUsR0FBMEIsSUFBSSxDQUFDO0lBQ3hDLGtCQUFrQixHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3BELGtCQUFrQixHQUF5QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRTdELFlBQ1UsaUJBQThDO1FBQTlDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBNkI7SUFDcEQsQ0FBQztJQUVMLGFBQWEsQ0FBQyxPQUF1QjtRQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQztJQUM1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QUMsYUFBYSxDQUFDLEtBQUssRUFBRTt3QkFDakMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLElBQUksT0FBTzt3QkFDOUIsV0FBVyxFQUFFLGNBQWMsSUFBSSxFQUFFO3dCQUNqQyxLQUFLLEVBQUU7NEJBQ0wsSUFBSSxFQUFFLFNBQVM7NEJBQ2YsR0FBRyxFQUFFLE9BQU8sQ0FBQyxZQUFZO3lCQUMxQjtxQkFDRixDQUFDLENBQUM7b0JBRUgsNEJBQTRCO29CQUM1QixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHO3dCQUM1QixZQUFZO3dCQUNaLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxJQUFJLE9BQU87d0JBQzlCLFdBQVcsRUFBRSxjQUFjLElBQUksRUFBRTt3QkFDakMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxZQUFZO3dCQUM5QixTQUFTO3FCQUNWLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0RBQWtELEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0UsQ0FBQztJQUNILENBQUM7SUFFRCwrREFBK0Q7SUFDL0QsS0FBSztRQUNILElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztJQUN6QixDQUFDO3dHQXRnQlUsb0JBQW9COzRHQUFwQixvQkFBb0IsY0FGbkIsTUFBTTs7NEZBRVAsb0JBQW9CO2tCQUhoQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzRGV2TW9kZSwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1hdHRlcnRhZ0RhdGEgfSBmcm9tICcuLi9tYXR0ZXJ0YWdEYXRhJztcclxuaW1wb3J0IHsgUG9pVHlwZSwgRGJPYmplY3RUeXBlLCBQT0ksIFZpZXdlckludGVyYWN0aW9ucywgVGFnQWN0aW9uLCBDYW1lcmFNb2RlIH0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hdHRlcnBvcnROYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4vbWF0dGVycG9ydC1uYXZpZ2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyB3YWl0IH0gZnJvbSAnLi4vaGVscGVycy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFzZVRhZ1NlcnZpY2UgfSBmcm9tICcuL3RhZy5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYXR0ZXJwb3J0VGFnU2VydmljZSB7XHJcbiAgcHVibGljIGRpY3Rpb25uYXJ5VGFnczogTWFwPHN0cmluZywgTWF0dGVydGFnRGF0YT4gPSBuZXcgTWFwKCk7XHJcbiAgcHVibGljIHRhZ0FkZFF1ZXVlOiBQcm9taXNlPGFueT4gPSBQcm9taXNlLnJlc29sdmUoKTtcclxuICBwdWJsaWMgbWF0dGVydGFnVG9Gb2xsb3c6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIHB1YmxpYyBvbkdvVG9UYWcgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XHJcbiAgcHVibGljIG1hdHRlcnRhZ0lEczogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gIHB1YmxpYyB0YWdzQXR0YWNobWVudHM6IE9iamVjdCA9IHt9O1xyXG4gIHB1YmxpYyB0YWdNZXNzZW5nZXJPbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyB0YWdTZXJ2aWNlOiBCYXNlVGFnU2VydmljZSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgdGFnc0N1cnJlbnRPcGFjaXR5OiBNYXA8c3RyaW5nLCBudW1iZXI+ID0gbmV3IE1hcCgpO1xyXG4gIHByaXZhdGUgdGFnc0N1cnJlbnRFbmFibGVkOiBNYXA8c3RyaW5nLCBib29sZWFuPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG5hdmlnYXRpb25TZXJ2aWNlOiBNYXR0ZXJwb3J0TmF2aWdhdGlvblNlcnZpY2VcclxuICApIHsgfVxyXG5cclxuICBzZXRUYWdTZXJ2aWNlKHNlcnZpY2U6IEJhc2VUYWdTZXJ2aWNlKTogdm9pZCB7XHJcbiAgICB0aGlzLnRhZ1NlcnZpY2UgPSBzZXJ2aWNlO1xyXG4gIH1cclxuXHJcbiAgLyoqIE9wZW5zIGEgc3BlY2lmaWMgdGFnIGluIHRoZSBNYXR0ZXJwb3J0IHZpZXdlciBieSBpdHMgSUQuICovXHJcbiAgYXN5bmMgZ29Ub1RhZyhzZGs6IGFueSwgc2lkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgaWYgKCFzZGspIHJldHVybjtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMub25Hb1RvVGFnLm5leHQoc2lkKTtcclxuICAgICAgYXdhaXQgc2RrLlRhZy5vcGVuKHNpZCk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdDYW5ub3Qgb3BlbiB0YWcnLCBzaWQsIGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIE9wZW5zIHRoZSBtb3N0IHJlY2VudGx5IGNyZWF0ZWQgdGFnIGluIHRoZSB2aWV3ZXIuICovXHJcbiAgYXN5bmMgZ29Ub0xhc3RUYWcoc2RrOiBhbnkpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgaWYgKCFzZGsgfHwgdGhpcy5tYXR0ZXJ0YWdJRHMubGVuZ3RoID09PSAwKSByZXR1cm47XHJcbiAgICBjb25zdCBsYXN0U2lkID0gdGhpcy5tYXR0ZXJ0YWdJRHNbdGhpcy5tYXR0ZXJ0YWdJRHMubGVuZ3RoIC0gMV07XHJcbiAgICByZXR1cm4gdGhpcy5nb1RvVGFnKHNkaywgbGFzdFNpZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGRzIGEgTWF0dGVydGFnIHRvIHRoZSB2aWV3ZXIsIHNlcmlhbGl6aW5nIGNhbGxzIHRvIHByZXZlbnQgU0RLIHJhY2UgY29uZGl0aW9ucy5cclxuICAgKiBSZXVzZXMgZXhpc3RpbmcgSURzIGlmIHRoZSB0YWcgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBzZXNzaW9uLlxyXG4gICAqL1xyXG4gIGFzeW5jIGFkZE1hdHRlcnRhZ1RvVmlld2VyKHNkazogYW55LCBtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XHJcbiAgICBpZiAoIXNkaykgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgdGhpcy50YWdBZGRRdWV1ZSA9IHRoaXMudGFnQWRkUXVldWUudGhlbihhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSBtYXR0ZXJ0YWdEYXRhLmdldERhdGEoKSBhcyBhbnk7XHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nSWQgPSBkYXRhPy5pZCB8fCBudWxsO1xyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBzaWRMaXN0ID0gYXdhaXQgc2RrLlRhZy5hZGQoZGF0YSk7XHJcbiAgICAgICAgaWYgKHNpZExpc3QgJiYgc2lkTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjb25zdCBtYXR0ZXJ0YWdJRCA9IHNpZExpc3RbMF07XHJcbiAgICAgICAgICB0aGlzLm1hdHRlcnRhZ0lEcy5wdXNoKG1hdHRlcnRhZ0lEKTtcclxuICAgICAgICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLnNldChtYXR0ZXJ0YWdJRCwgbWF0dGVydGFnRGF0YSk7XHJcbiAgICAgICAgICByZXR1cm4gbWF0dGVydGFnSUQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcbiAgICAgICAgaWYgKGVycm9yPy5tZXNzYWdlPy5pbmNsdWRlcygnYWxyZWFkeSBpbiB1c2UnKSAmJiBleGlzdGluZ0lkKSB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuZGljdGlvbm5hcnlUYWdzLmhhcyhleGlzdGluZ0lkKSkge1xyXG4gICAgICAgICAgICB0aGlzLm1hdHRlcnRhZ0lEcy5wdXNoKGV4aXN0aW5nSWQpO1xyXG4gICAgICAgICAgICB0aGlzLmRpY3Rpb25uYXJ5VGFncy5zZXQoZXhpc3RpbmdJZCwgbWF0dGVydGFnRGF0YSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gZXhpc3RpbmdJZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBhZGQgdGFnIHRvIHZpZXdlcicsIGVycm9yKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnRhZ0FkZFF1ZXVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGFkZCBhbmQgY29uZmlndXJlIGEgTWF0dGVydGFnIHdpdGggaWNvbiwgb3BhY2l0eSwgYW5kIEhUTUwgY29udGVudC5cclxuICAgKiBIYW5kbGVzIGV4aXN0aW5nIHRhZ3MgZ3JhY2VmdWxseSBhbmQgcXVldWVzIG9wZXJhdGlvbnMgdG8gYXZvaWQgU0RLIGNvbmZsaWN0cy5cclxuICAgKi9cclxuICBhc3luYyBfZG9BZGRNYXR0ZXJ0YWcoXHJcbiAgICBzZGs6IGFueSxcclxuICAgIG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEsXHJcbiAgICBzZXRUYWdJY29uQW5kT3BhY2l0eTogKHNpZDogc3RyaW5nLCBtdDogTWF0dGVydGFnRGF0YSkgPT4gUHJvbWlzZTx2b2lkPixcclxuICAgIGluamVjdEh0bWxJblRhZzogKHR5cGU6IFBvaVR5cGUsIG9iajogRGJPYmplY3RUeXBlLCBzaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxyXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gbWF0dGVydGFnRGF0YS5nZXRNYXR0ZXJ0YWdEZXNjcmlwdG9yKCk7XHJcbiAgICAvL2NvbnNvbGUubG9nKCdkZXNjcmlwdG9yJywgZGVzY3JpcHRvcik7XHJcbiAgICBjb25zdCBzaWQgPSBkZXNjcmlwdG9yWzBdWydpZCddO1xyXG5cclxuICAgIGlmIChzaWQgJiYgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuaGFzKHNpZCkpIHtcclxuICAgICAgYXdhaXQgc2V0VGFnSWNvbkFuZE9wYWNpdHkoc2lkLCBtYXR0ZXJ0YWdEYXRhKTtcclxuICAgICAgYXdhaXQgaW5qZWN0SHRtbEluVGFnKG1hdHRlcnRhZ0RhdGEuZ2V0VHlwZSgpLCBtYXR0ZXJ0YWdEYXRhLmdldE9iamVjdCgpLCBzaWQpO1xyXG4gICAgICByZXR1cm4gc2lkO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGFnQWRkUXVldWUgPSB0aGlzLnRhZ0FkZFF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IFtjcmVhdGVkU2lkXSA9IGF3YWl0IHNkay5UYWcuYWRkKC4uLmRlc2NyaXB0b3IpO1xyXG4gICAgICAgIHRoaXMubWF0dGVydGFnSURzLnB1c2goY3JlYXRlZFNpZCk7XHJcbiAgICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3Muc2V0KGNyZWF0ZWRTaWQsIG1hdHRlcnRhZ0RhdGEpO1xyXG5cclxuICAgICAgICBhd2FpdCB3YWl0KDEwMCk7XHJcbiAgICAgICAgYXdhaXQgc2V0VGFnSWNvbkFuZE9wYWNpdHkoY3JlYXRlZFNpZCwgbWF0dGVydGFnRGF0YSk7XHJcblxyXG4gICAgICAgIGluamVjdEh0bWxJblRhZyhtYXR0ZXJ0YWdEYXRhLmdldFR5cGUoKSwgbWF0dGVydGFnRGF0YS5nZXRPYmplY3QoKSwgY3JlYXRlZFNpZCkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdIVE1MIGluamVjdGlvbiBmYWlsZWQgZm9yJywgY3JlYXRlZFNpZCwgZXJyKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNyZWF0ZWRTaWQ7XHJcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgIGlmIChlPy5tZXNzYWdlPy5pbmNsdWRlcygnYWxyZWFkeSBpbiB1c2UnKSAmJiBzaWQpIHtcclxuICAgICAgICAgIGlmICghdGhpcy5kaWN0aW9ubmFyeVRhZ3MuaGFzKHNpZCkpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXR0ZXJ0YWdJRHMucHVzaChzaWQpO1xyXG4gICAgICAgICAgICB0aGlzLmRpY3Rpb25uYXJ5VGFncy5zZXQoc2lkLCBtYXR0ZXJ0YWdEYXRhKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGF3YWl0IHNldFRhZ0ljb25BbmRPcGFjaXR5KHNpZCwgbWF0dGVydGFnRGF0YSk7XHJcbiAgICAgICAgICBhd2FpdCBpbmplY3RIdG1sSW5UYWcobWF0dGVydGFnRGF0YS5nZXRUeXBlKCksIG1hdHRlcnRhZ0RhdGEuZ2V0T2JqZWN0KCksIHNpZCk7XHJcbiAgICAgICAgICByZXR1cm4gc2lkO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy50YWdBZGRRdWV1ZTtcclxuICB9XHJcblxyXG4gIGdldERpc3RhbmNlKHAxOiBhbnksIHAyOiBhbnkpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhwMi54IC0gcDEueCwgMikgKyBNYXRoLnBvdyhwMi55IC0gcDEueSwgMikgKyBNYXRoLnBvdyhwMi56IC0gcDEueiwgMikpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2tzIGlmIGEgdGFnIGlzIHdpdGhpbiB0aGUgYm91bmRpbmcgYm94IG9mIGFueSBhY3RpdmUgcm9vbSAoYWRkaW5nIGEgc2xpZ2h0IG1hcmdpbiB0byBhY2NvdW50IGZvciB3YWxsLW1vdW50ZWQgdGFncykuXHJcbiAgICogSWYgdGhlcmUgYXJlIG5vIGFjdGl2ZSByb29tcyAoZS5nLiwgaGFsbHdheSksIGZhbGxzIGJhY2sgdG8gcmV0dXJuaW5nIHRydWUuXHJcbiAgICovXHJcbiAgaXNUYWdJblJvb21zKG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEsIHJvb21zOiBhbnlbXSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFyb29tcyB8fCByb29tcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBjb25zdCB0YWdQb3MgPSBtYXR0ZXJ0YWdEYXRhLmdldFBvc2l0aW9uKCk7XHJcbiAgICBjb25zdCBtYXJnaW4gPSAxLjU7XHJcblxyXG4gICAgcmV0dXJuIHJvb21zLnNvbWUoKHJvb20pID0+IHtcclxuICAgICAgaWYgKCFyb29tLmJvdW5kcykgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBjb25zdCB7IG1pbiwgbWF4IH0gPSByb29tLmJvdW5kcztcclxuXHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgdGFnUG9zLnggPj0gbWluLnggLSBtYXJnaW4gJiYgdGFnUG9zLnggPD0gbWF4LnggKyBtYXJnaW4gJiZcclxuICAgICAgICB0YWdQb3MueSA+PSBtaW4ueSAtIG1hcmdpbiAmJiB0YWdQb3MueSA8PSBtYXgueSArIG1hcmdpbiAmJlxyXG4gICAgICAgIHRhZ1Bvcy56ID49IG1pbi56IC0gbWFyZ2luICYmIHRhZ1Bvcy56IDw9IG1heC56ICsgbWFyZ2luXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbXB1dGVzIHRoZSBmaW5hbCBjb250ZXh0LWF3YXJlIG9wYWNpdHkgZm9yIGEgc2luZ2xlIHRhZy5cclxuICAgKiBAcGFyYW0gY3VycmVudEZsb29yU2VxdWVuY2UgIEF1dGhvcml0YXRpdmUgY3VycmVudCBmbG9vciBzZXF1ZW5jZSBmcm9tIHNkay5GbG9vci5jdXJyZW50XHJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCA9IHNpbmdsZS1mbG9vciBtb2RlbCBvciB1bmtub3duKS5cclxuICAgKiBAcGFyYW0gY3VycmVudFJvb21zICAgICAgICAgIEFycmF5IG9mIGFjdGl2ZSByb29tcyB0aGUgY2FtZXJhIGlzIGluLlxyXG4gICAqL1xyXG4gIC8qY29tcHV0ZVNpbmdsZVRhZ0NvbnRleHRPcGFjaXR5KFxyXG4gICAgbWF0dGVydGFnRGF0YTogTWF0dGVydGFnRGF0YSxcclxuICAgIHBvc2VDYW1lcmE6IGFueSxcclxuICAgIHN3ZWVwQ29sbGVjdGlvbjogYW55LFxyXG4gICAgY3VycmVudEZsb29yU2VxdWVuY2U6IG51bWJlciB8IG51bGwsXHJcbiAgICBjdXJyZW50Um9vbXM6IGFueVtdXHJcbiAgKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IG1vZGUgPSB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRDYW1lcmFNb2RlO1xyXG5cclxuICAgIC8vIDEuIENoZWNrIEZsb29yXHJcbiAgICBjb25zdCB0YWdGbG9vcklkID0gdGhpcy5nZXRGbG9vcklkRm9yVGFnKG1hdHRlcnRhZ0RhdGEsIHN3ZWVwQ29sbGVjdGlvbik7XHJcbiAgICBjb25zdCBjdXJyZW50Rmxvb3JJZCA9IGN1cnJlbnRGbG9vclNlcXVlbmNlPy50b1N0cmluZygpO1xyXG4gICAgaWYgKHRhZ0Zsb29ySWQgJiYgY3VycmVudEZsb29ySWQgJiYgdGFnRmxvb3JJZCAhPT0gY3VycmVudEZsb29ySWQpIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMi4gU2kgRG9sbGhvdXNlIC0+IFBsZWluZSBvcGFjaXTDqVxyXG4gICAgLy9pZiAobW9kZSAhPT0gQ2FtZXJhTW9kZS5JTlNJREUpIHJldHVybiAxO1xyXG5cclxuICAgIC8vIDMuIFNpIEluc2lkZSAtPiBDaGVjayBwacOoY2UgKyBEaXN0YW5jZSBwcm9ncmVzc2l2ZVxyXG4gICAgLy9pZiAoIXRoaXMuaXNUYWdJblJvb21zKG1hdHRlcnRhZ0RhdGEsIGN1cnJlbnRSb29tcykpIHJldHVybiAwO1xyXG5cclxuICAgIHJldHVybiAxO1xyXG4gIH0qL1xyXG5cclxuICAvKiogUmV0dXJucyB0aGUgSUQgb2YgdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQgdGFnLiAqL1xyXG4gIGdldExhc3RUYWcoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBpZiAodGhpcy5tYXR0ZXJ0YWdJRHMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB0aGlzLm1hdHRlcnRhZ0lEc1t0aGlzLm1hdHRlcnRhZ0lEcy5sZW5ndGggLSAxXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgdGhlIHZpc2liaWxpdHkgKG9wYWNpdHkpIG9mIGFsbCB0YWdzIGJhc2VkIG9uIHRoZSBjdXJyZW50IGNhbWVyYSBtb2RlLFxyXG4gICAqIGZsb29yIGFuZCByb29tIGNvbnRleHQuIE11c3QgYmUgY2FsbGVkIGFmdGVyIGVhY2ggc3dlZXAsIGZsb29yIG9yIG1vZGUgY2hhbmdlLlxyXG4gICAqXHJcbiAgICogUnVsZXM6XHJcbiAgICogIC0gRE9MTEhPVVNFIC8gRkxPT1JQTEFOIOKGkiBhbGwgdGFncyBoaWRkZW4gKG9wYWNpdHkgMCkuXHJcbiAgICogIC0gSU5TSURFIOKGkiBvbmx5IHRhZ3Mgd2hvc2Ugc3dlZXAgYmVsb25ncyB0byB0aGUgY3VycmVudCBmbG9vciBhcmUgc2hvd247XHJcbiAgICogICAgcHJveGltaXR5LWJhc2VkIG9wYWNpdHkgaXMgYXBwbGllZCB2aWEgY29tcHV0ZVRhZ09wYWNpdHkoKS5cclxuICAgKiAgICBUYWdzIG9uIG90aGVyIGZsb29ycyBhcmUgaGlkZGVuIChvcGFjaXR5IDApLlxyXG4gICAqICAtIFRSQU5TSVRJT05JTkcg4oaSIG5vIGNoYW5nZSAoc2tpcCB1cGRhdGUgdG8gYXZvaWQgZmxpY2tlcmluZykuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gc2RrICAgICAgICAgIE1hdHRlcnBvcnQgU0RLIGluc3RhbmNlLlxyXG4gICAqIEBwYXJhbSBwb3NlQ2FtZXJhICAgQ3VycmVudCBjYW1lcmEgcG9zZS5cclxuICAgKiBAcGFyYW0gc3dlZXBDb2xsZWN0aW9uICBGdWxsIGNvbGxlY3Rpb24gb2Ygc3dlZXBzLlxyXG4gICAqIEBwYXJhbSBjdXJyZW50Q2FtZXJhTW9kZSAgQ3VycmVudCBjYW1lcmEgbW9kZS5cclxuICAgKiBAcGFyYW0gbWF0dGVydGFnVG9Gb2xsb3cgIElEIG9mIHRoZSBjdXJzb3IgdGFnIChuZXZlciB0b3VjaGVkKS5cclxuICAgKi9cclxuICBhc3luYyB1cGRhdGVUYWdzVmlzaWJpbGl0eUZvckNvbnRleHQoXHJcbiAgICBzZGs6IGFueSxcclxuICAgIHN3ZWVwQ29sbGVjdGlvbjogYW55LFxyXG4gICAgY3VycmVudENhbWVyYU1vZGU6IENhbWVyYU1vZGUsXHJcbiAgICBtYXR0ZXJ0YWdUb0ZvbGxvdzogc3RyaW5nIHwgbnVsbCxcclxuICAgIGN1cnJlbnRGbG9vclNlcXVlbmNlOiBudW1iZXIgfCBudWxsID0gbnVsbCxcclxuICAgIGN1cnJlbnRSb29tczogYW55W10gPSBbXVxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCFzZGsgfHwgdGhpcy5kaWN0aW9ubmFyeVRhZ3Muc2l6ZSA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGlzSW50ZXJpb3JNb2RlID0gY3VycmVudENhbWVyYU1vZGUgPT09IENhbWVyYU1vZGUuSU5TSURFO1xyXG4gICAgY29uc3QgY3VycmVudEZsb29ySWQgPSBjdXJyZW50Rmxvb3JTZXF1ZW5jZSAhPT0gbnVsbCA/IGN1cnJlbnRGbG9vclNlcXVlbmNlLnRvU3RyaW5nKCkgOiBudWxsO1xyXG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IFt0YWdJZCwgbWF0dGVydGFnRGF0YV0gb2YgdGhpcy5kaWN0aW9ubmFyeVRhZ3MpIHtcclxuICAgICAgaWYgKHRhZ0lkID09PSBtYXR0ZXJ0YWdUb0ZvbGxvdykgY29udGludWU7XHJcblxyXG4gICAgICBjb25zdCB0YWdGbG9vcklkID0gdGhpcy5nZXRGbG9vcklkRm9yVGFnKG1hdHRlcnRhZ0RhdGEsIHN3ZWVwQ29sbGVjdGlvbik7XHJcbiAgICAgIGNvbnN0IGlzT25DdXJyZW50Rmxvb3IgPSAhdGFnRmxvb3JJZCB8fCAhY3VycmVudEZsb29ySWQgfHwgdGFnRmxvb3JJZCA9PT0gY3VycmVudEZsb29ySWQ7XHJcblxyXG4gICAgICBsZXQgdGFyZ2V0T3BhY2l0eSA9IDA7XHJcbiAgICAgIGxldCBzaG91bGRCZUVuYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgIC8vIENhbGN1bGF0aW9uIG9mIG9wYWNpdHkgYW5kIGVuYWJsZSBzdGF0dXNcclxuICAgICAgaWYgKGlzT25DdXJyZW50Rmxvb3IpIHtcclxuICAgICAgICBpZiAoIWlzSW50ZXJpb3JNb2RlKSB7XHJcbiAgICAgICAgICB0YXJnZXRPcGFjaXR5ID0gMTtcclxuICAgICAgICAgIHNob3VsZEJlRW5hYmxlZCA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRhcmdldE9wYWNpdHkgPSAwLjk7XHJcbiAgICAgICAgICBzaG91bGRCZUVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBBcHBseSBjaGFuZ2VzXHJcblxyXG4gICAgICAvLyBUb29sdGlwIGFuZCBjbGljayBtYW5hZ2VtZW50XHJcbiAgICAgIGNvbnN0IGxhc3RFbmFibGVkID0gdGhpcy50YWdzQ3VycmVudEVuYWJsZWQuZ2V0KHRhZ0lkKTtcclxuICAgICAgaWYgKGxhc3RFbmFibGVkICE9PSBzaG91bGRCZUVuYWJsZWQpIHtcclxuICAgICAgICB0aGlzLnRhZ3NDdXJyZW50RW5hYmxlZC5zZXQodGFnSWQsIHNob3VsZEJlRW5hYmxlZCk7XHJcbiAgICAgICAgcHJvbWlzZXMucHVzaChzZGsuVGFnLmFsbG93QWN0aW9uKHRhZ0lkLCB7XHJcbiAgICAgICAgICBvcGVuaW5nOiBzaG91bGRCZUVuYWJsZWQsXHJcbiAgICAgICAgICBuYXZpZ2F0aW5nOiBzaG91bGRCZUVuYWJsZWQsXHJcbiAgICAgICAgICBkb2NraW5nOiBmYWxzZVxyXG4gICAgICAgIH0pLmNhdGNoKCgpID0+IHsgfSkpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIE9wYWNpdHkgbWFuYWdlbWVudFxyXG4gICAgICBjb25zdCBsYXN0T3BhY2l0eSA9IHRoaXMudGFnc0N1cnJlbnRPcGFjaXR5LmdldCh0YWdJZCkgPz8gLTE7XHJcbiAgICAgIGlmIChNYXRoLmFicyhsYXN0T3BhY2l0eSAtIHRhcmdldE9wYWNpdHkpID4gMC4wNSkge1xyXG4gICAgICAgIHRoaXMudGFnc0N1cnJlbnRPcGFjaXR5LnNldCh0YWdJZCwgdGFyZ2V0T3BhY2l0eSk7XHJcbiAgICAgICAgcHJvbWlzZXMucHVzaChzZGsuVGFnLmVkaXRPcGFjaXR5KHRhZ0lkLCB0YXJnZXRPcGFjaXR5KS5jYXRjaCgoKSA9PiB7IH0pKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcclxuICB9XHJcblxyXG4gIC8qKiBSZW1vdmVzIGEgc3BlY2lmaWMgdGFnIGZyb20gdGhlIHZpZXdlciBhbmQgbG9jYWwgZGljdGlvbmFyaWVzLiAqL1xyXG4gIGFzeW5jIGRlbGV0ZU1hdHRlcnRhZ0Zyb21JZChzZGs6IGFueSwgbWF0dGVydGFnSUQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHNkaykgYXdhaXQgc2RrLlRhZy5yZW1vdmUobWF0dGVydGFnSUQpO1xyXG4gICAgICB0aGlzLmRpY3Rpb25uYXJ5VGFncy5kZWxldGUobWF0dGVydGFnSUQpO1xyXG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMubWF0dGVydGFnSURzLmluZGV4T2YobWF0dGVydGFnSUQpO1xyXG4gICAgICBpZiAoaW5kZXggPiAtMSkgdGhpcy5tYXR0ZXJ0YWdJRHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignQ2Fubm90IGRlbGV0ZSB0YWcnLCBtYXR0ZXJ0YWdJRCwgZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogUmVtb3ZlcyB0aGUgbGFzdCBhZGRlZCB0YWcgZnJvbSB0aGUgdmlld2VyLiAqL1xyXG4gIGFzeW5jIGRlbGV0ZUxhc3RNYXR0ZXJ0YWcoc2RrOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGxhc3RTaWQgPSB0aGlzLmdldExhc3RUYWcoKTtcclxuICAgIGlmIChsYXN0U2lkKSBhd2FpdCB0aGlzLmRlbGV0ZU1hdHRlcnRhZ0Zyb21JZChzZGssIGxhc3RTaWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqIENsZWFycyBhbGwgdGFncyBmcm9tIHRoZSB2aWV3ZXIgYW5kIHJlc2V0cyBsb2NhbCBzdGF0ZS4gKi9cclxuICBhc3luYyBhY3Rpb25fZGVsZXRlX2FsbF9tYXR0ZXJ0YWdzKHNkazogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoc2RrKSB7XHJcbiAgICAgIGNvbnN0IHNpZHNUb1JlbW92ZSA9IFsuLi50aGlzLm1hdHRlcnRhZ0lEc107XHJcbiAgICAgIGZvciAoY29uc3Qgc2lkIG9mIHNpZHNUb1JlbW92ZSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBhd2FpdCBzZGsuVGFnLnJlbW92ZShzaWQpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzIGFuZCBjb25maWd1cmVzIGEgTWF0dGVydGFnIGZyb20gYSBQT0ksIGhhbmRsaW5nIGNvb3JkaW5hdGVzLCBub3JtYWxzLCBhbmQgc3dlZXAgSUQuXHJcbiAgICogU2tpcHMgY3JlYXRpb24gaWYgYSB0YWcgZm9yIHRoZSBvYmplY3QgYWxyZWFkeSBleGlzdHMuXHJcbiAgICovXHJcbiAgYXN5bmMgY3JlYXRlTWF0dGVydGFnRnJvbVBPSShcclxuICAgIHNkazogYW55LFxyXG4gICAgdGFnVHlwZTogUG9pVHlwZSxcclxuICAgIG9iamVjdDogRGJPYmplY3RUeXBlLFxyXG4gICAgcG9pOiBQT0ksXHJcbiAgICBwb3NlQ2FtZXJhOiBhbnksXHJcbiAgICBnZXRUYWdGcm9tRWxlbWVudElkOiAoaWQ6IHN0cmluZykgPT4geyB0YWc6IHN0cmluZzsgc3dlZXA6IHN0cmluZyB9LFxyXG4gICAgc2V0VGFnSWNvbkFuZE9wYWNpdHk6IChzaWQ6IHN0cmluZywgbXQ6IE1hdHRlcnRhZ0RhdGEpID0+IFByb21pc2U8dm9pZD4sXHJcbiAgICBpbmplY3RIdG1sSW5UYWc6ICh0eXBlOiBQb2lUeXBlLCBvYmo6IERiT2JqZWN0VHlwZSwgc2lkOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cclxuICApOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgeyB0YWcgfSA9IGdldFRhZ0Zyb21FbGVtZW50SWQob2JqZWN0LmlkKTtcclxuICAgIGlmICh0YWcpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhID0gbmV3IE1hdHRlcnRhZ0RhdGEodGFnVHlwZSk7XHJcbiAgICBtYXR0ZXJ0YWdEYXRhLnNldE9iamVjdChvYmplY3QsIHRhZ1R5cGUpO1xyXG5cclxuICAgIGlmIChwb2kuY29vcmRpbmF0ZSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0UG9zaXRpb24oSlNPTi5wYXJzZShwb2kuY29vcmRpbmF0ZSkpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0Vycm9yIHBhcnNpbmcgUE9JIGNvb3JkaW5hdGVzJywgcG9pLmNvb3JkaW5hdGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHBvaS5tZXRhZGF0YSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHRhZ01ldGFkYXRhID0gSlNPTi5wYXJzZShwb2kubWV0YWRhdGEpO1xyXG4gICAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0Tm9ybWFsKHRhZ01ldGFkYXRhLm5vcm1hbCB8fCB7IHg6IDAsIHk6IC0wLjE1LCB6OiAwIH0pO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgbWF0dGVydGFnRGF0YS5zZXROb3JtYWwoeyB4OiAwLCB5OiAtMC4xNSwgejogMCB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChwb2kubWF0dGVycG9ydFN3ZWVwSUQpIHtcclxuICAgICAgbWF0dGVydGFnRGF0YS5zZXRTd2VlcElEKHBvaS5tYXR0ZXJwb3J0U3dlZXBJRCk7XHJcbiAgICB9XHJcbiAgICBtYXR0ZXJ0YWdEYXRhLnNldFBvaShwb2kpO1xyXG5cclxuICAgIGNvbnN0IGNyZWF0ZWRUYWdJRCA9IGF3YWl0IHRoaXMuYWRkTWF0dGVydGFnVG9WaWV3ZXIoc2RrLCBtYXR0ZXJ0YWdEYXRhKTtcclxuXHJcbiAgICBpZiAoY3JlYXRlZFRhZ0lEICYmIHNkaykge1xyXG4gICAgICBhd2FpdCB3YWl0KDEwMCk7XHJcbiAgICAgIGF3YWl0IHNldFRhZ0ljb25BbmRPcGFjaXR5KGNyZWF0ZWRUYWdJRCwgbWF0dGVydGFnRGF0YSk7XHJcbiAgICAgIGluamVjdEh0bWxJblRhZyh0YWdUeXBlLCBvYmplY3QsIGNyZWF0ZWRUYWdJRCkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignSFRNTCBpbmplY3Rpb24gZmFpbGVkIGZvcicsIGNyZWF0ZWRUYWdJRCwgZXJyKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNyZWF0ZWRUYWdJRDtcclxuICB9XHJcblxyXG4gIC8qKiBVcGRhdGVzIHRoZSBpY29uLCBvcGFjaXR5LCBhbmQgSFRNTCBjb250ZW50IG9mIGFuIGV4aXN0aW5nIHRhZy4gKi9cclxuICBhc3luYyB1cGRhdGVNYXR0ZXJUYWdDb250ZW50Rm9yVGFnSUQoXHJcbiAgICBzZGs6IGFueSxcclxuICAgIG1hdHRlcnRhZ0lEOiBzdHJpbmcsXHJcbiAgICBvYmplY3Q6IERiT2JqZWN0VHlwZSxcclxuICAgIHBvaVR5cGU6IFBvaVR5cGUsXHJcbiAgICBzZXRUYWdJY29uQW5kT3BhY2l0eTogKHNpZDogc3RyaW5nLCBtdDogTWF0dGVydGFnRGF0YSkgPT4gUHJvbWlzZTx2b2lkPixcclxuICAgIGluamVjdEh0bWxJblRhZzogKHR5cGU6IFBvaVR5cGUsIG9iajogRGJPYmplY3RUeXBlLCBzaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxyXG4gICk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBtYXR0ZXJ0YWdEYXRhID0gdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZ2V0KG1hdHRlcnRhZ0lEKTtcclxuICAgIGlmICghbWF0dGVydGFnRGF0YSkgcmV0dXJuO1xyXG5cclxuICAgIGlmIChvYmplY3QpIHtcclxuICAgICAgbWF0dGVydGFnRGF0YS5zZXRPYmplY3Qob2JqZWN0LCBwb2lUeXBlKTtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCBzZXRUYWdJY29uQW5kT3BhY2l0eShtYXR0ZXJ0YWdJRCwgbWF0dGVydGFnRGF0YSk7XHJcbiAgICBhd2FpdCBpbmplY3RIdG1sSW5UYWcocG9pVHlwZSwgb2JqZWN0LCBtYXR0ZXJ0YWdJRCk7XHJcbiAgfVxyXG5cclxuICAvKiogUmVnaXN0ZXJzIGEgY3VzdG9tIHRleHR1cmUgYW5kIGFwcGxpZXMgaXQgdG8gYSB0YWcsIG9wdGlvbmFsbHkgYWRqdXN0aW5nIG9wYWNpdHkuICovXHJcbiAgYXN5bmMgYWRkTmV3SWNvbkFuZFNldEZvclRhZyhcclxuICAgIHNkazogYW55LFxyXG4gICAgbWF0dGVydGFnSUQ6IHN0cmluZyxcclxuICAgIGljb25QYXRoOiBzdHJpbmcsXHJcbiAgICBhcHBseU9wYWNpdHk6IGJvb2xlYW4sXHJcbiAgICBvcGFjaXR5OiBudW1iZXJcclxuICApIHtcclxuICAgIGlmICghc2RrKSByZXR1cm47XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBpY29uTmFtZSA9IGBjdXN0b20taWNvbi0ke21hdHRlcnRhZ0lEfWA7XHJcbiAgICAgIGF3YWl0IHNkay5Bc3NldC5yZWdpc3RlclRleHR1cmUoaWNvbk5hbWUsIGljb25QYXRoKTtcclxuICAgICAgYXdhaXQgc2RrLlRhZy5lZGl0SWNvbihtYXR0ZXJ0YWdJRCwgaWNvbk5hbWUpO1xyXG5cclxuICAgICAgaWYgKGFwcGx5T3BhY2l0eSkge1xyXG4gICAgICAgIGF3YWl0IHNkay5UYWcuZWRpdE9wYWNpdHkobWF0dGVydGFnSUQsIG9wYWNpdHkpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignRXJyb3Igc2V0dGluZyBjdXN0b20gaWNvbiBvciBvcGFjaXR5JywgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEZpbmRzIHRoZSB0YWcgSUQgYW5kIHN3ZWVwIElEIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIGVsZW1lbnQgSUQuICovXHJcbiAgZ2V0VGFnRnJvbUVsZW1lbnRJZChlbGVtZW50SUQ6IHN0cmluZywgc3dlZXBzOiBzdHJpbmdbXSB8IG51bGwpOiB7IHRhZzogc3RyaW5nIHwgbnVsbDsgc3dlZXA6IHN0cmluZyB8IG51bGwgfSB7XHJcbiAgICBsZXQgdGFnSUQgPSBudWxsO1xyXG4gICAgbGV0IHN3ZWVwSUQgPSBudWxsO1xyXG4gICAgZm9yIChsZXQgW21hdHRlcnRhZ0lELCBtYXR0ZXJ0YWdEYXRhXSBvZiB0aGlzLmRpY3Rpb25uYXJ5VGFncykge1xyXG4gICAgICBpZiAobWF0dGVydGFnRGF0YS5lbGVtZW50SUQgPT09IGVsZW1lbnRJRCkge1xyXG4gICAgICAgIHRhZ0lEID0gbWF0dGVydGFnSUQ7XHJcbiAgICAgICAgY29uc3Qgc3dlZXAgPSBtYXR0ZXJ0YWdEYXRhLmdldFN3ZWVwSUQoKTtcclxuICAgICAgICBpZiAoc3dlZXAgJiYgc3dlZXBzKSB7XHJcbiAgICAgICAgICAvLyBzd2VlcCBpcyBhIHV1aWQ7IHN3ZWVwcyBhcnJheSBjb250YWlucyBzaWRzIOKAkyBjaGVjayBib3RoIGZvcm1hdHNcclxuICAgICAgICAgIGNvbnN0IHJlc29sdmVkU2lkID0gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5yZXNvbHZlU3dlZXBTaWQoc3dlZXApO1xyXG4gICAgICAgICAgaWYgKHN3ZWVwcy5pbmNsdWRlcyhzd2VlcCkgfHwgc3dlZXBzLmluY2x1ZGVzKHJlc29sdmVkU2lkKSkge1xyXG4gICAgICAgICAgICBzd2VlcElEID0gc3dlZXA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyB0YWc6IHRhZ0lELCBzd2VlcDogc3dlZXBJRCB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIFJldHJpZXZlcyB0aGUgZmxvb3IgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggYSB0YWcgYmFzZWQgb24gaXRzIHN3ZWVwIGRhdGEuXHJcbiAgICogIEhhbmRsZXMgYm90aCB0aGUgb2JqZWN0IGZvcm0gKHsgZmxvb3JJbmZvOiB7IGlkLCBzZXF1ZW5jZSB9LCBmbG9vcjogeyBpZCB9IH0pXHJcbiAgICogIGFuZCB0aGUgcHJpbWl0aXZlIGZvcm0gKGZsb29yOiBudW1iZXIpIHVzZWQgYnkgTWF0dGVycG9ydCBTREsgdjMuXHJcbiAgICovXHJcbiAgZ2V0Rmxvb3JJZEZvclRhZyhtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhLCBzd2VlcENvbGxlY3Rpb246IGFueSk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3Qgc3dlZXBJZCA9IG1hdHRlcnRhZ0RhdGEuZ2V0U3dlZXBJRCgpO1xyXG4gICAgaWYgKCFzd2VlcElkIHx8ICFzd2VlcENvbGxlY3Rpb24pIHJldHVybiBudWxsO1xyXG5cclxuICAgIGNvbnN0IHN3ZWVwRGF0YSA9IHN3ZWVwQ29sbGVjdGlvbltzd2VlcElkXTtcclxuICAgIGlmICghc3dlZXBEYXRhKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAvLyBTREsgdjM6IHN3ZWVwLmZsb29yIGlzIGEgcHJpbWl0aXZlIG51bWJlciAodGhlIHNlcXVlbmNlIGluZGV4KVxyXG4gICAgaWYgKHR5cGVvZiBzd2VlcERhdGEuZmxvb3IgPT09ICdudW1iZXInKSB7XHJcbiAgICAgIHJldHVybiBzd2VlcERhdGEuZmxvb3IudG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBPbGRlciAvIGV4dGVuZGVkIGZvcm1hdHNcclxuICAgIHJldHVybiBzd2VlcERhdGE/LmZsb29ySW5mbz8uaWRcclxuICAgICAgPz8gc3dlZXBEYXRhPy5mbG9vckluZm8/LnNlcXVlbmNlPy50b1N0cmluZygpXHJcbiAgICAgID8/IHN3ZWVwRGF0YT8uZmxvb3JJZFxyXG4gICAgICA/PyBzd2VlcERhdGE/LmZsb29yPy5pZFxyXG4gICAgICA/PyBzd2VlcERhdGE/LmZsb29yPy5zZXF1ZW5jZT8udG9TdHJpbmcoKVxyXG4gICAgICA/PyBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5qZWN0cyBjdXN0b20gSFRNTCBvciBmYWxsYmFjayBiaWxsYm9hcmQgbWVkaWEgaW50byBhIE1hdHRlcnRhZyBzYW5kYm94LlxyXG4gICAqIEF0dGFjaGVzIGV2ZW50IGxpc3RlbmVycyBmb3IgaW50ZXJhY3RpdmUgZWxlbWVudHMgd2l0aGluIHRoZSB0YWcuXHJcbiAgICovXHJcbiAgYXN5bmMgaW5qZWN0SHRtbEluVGFnKHNkazogYW55LCB0YWdUeXBlOiBQb2lUeXBlLCBvYmplY3Q6IERiT2JqZWN0VHlwZSwgdGFnSUQ6IHN0cmluZykge1xyXG4gICAgaWYgKCF0aGlzLnRhZ1NlcnZpY2UpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignW01hdHRlcnBvcnRUYWdTZXJ2aWNlXSB0YWdTZXJ2aWNlIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGh0bWwgPSBhd2FpdCB0aGlzLnRhZ1NlcnZpY2UuZ2V0SHRtbFRvSW5qZWN0KHRhZ1R5cGUsIG9iamVjdCk7XHJcblxyXG4gICAgICBpZiAoaHRtbCAmJiBodG1sLnRyaW0oKS5sZW5ndGggPiAwICYmIHNkaykge1xyXG4gICAgICAgIGNvbnN0IHNjcmlwdFRhZyA9IHRoaXMudGFnU2VydmljZS5nZXRTY3JpcHRGb3JUYWcob2JqZWN0LCB0YWdUeXBlKTtcclxuICAgICAgICBodG1sICs9IGAke3NjcmlwdFRhZ31gO1xyXG5cclxuICAgICAgICBjb25zdCBbc2FuZGJveElkLCBtZXNzZW5nZXJdID0gYXdhaXQgc2RrLlRhZy5yZWdpc3RlclNhbmRib3goaHRtbCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGF0dGFjaG1lbnRJRCA9IHRoaXMudGFnc0F0dGFjaG1lbnRzW3RhZ0lEXTtcclxuICAgICAgICBpZiAoYXR0YWNobWVudElEKSB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCBzZGsuVGFnLmRldGFjaCh0YWdJRCwgYXR0YWNobWVudElEKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy50YWdzQXR0YWNobWVudHNbdGFnSURdID0gc2FuZGJveElkO1xyXG4gICAgICAgIGF3YWl0IHNkay5UYWcuYXR0YWNoKHRhZ0lELCBzYW5kYm94SWQpO1xyXG5cclxuICAgICAgICAvLyBBdHRhY2ggdGhlIFwiVmlldyBpbmZvcm1hdGlvbnNcIiBoYW5kbGVyIGluIHRvb2x0aXBcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLkRFVEFJTF9DTElDSywgdGhpcy50YWdTZXJ2aWNlLm9uQWN0aW9uRGV0YWlsQ2xpY2suYmluZCh0aGlzLnRhZ1NlcnZpY2UpKTtcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLlRJQ0tFVF9DTElDSywgdGhpcy50YWdTZXJ2aWNlLm9uQWN0aW9uRGV0YWlsQ2xpY2suYmluZCh0aGlzLnRhZ1NlcnZpY2UpKTtcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLkFVRElPX0NMSUNLLCAoYXVkaW9Db21tZW50SUQ6IHN0cmluZykgPT4gdGhpcy50YWdTZXJ2aWNlLm9uQWN0aW9uQXVkaW9DbGljayhhdWRpb0NvbW1lbnRJRCkpO1xyXG4gICAgICAgIG1lc3Nlbmdlci5vbihUYWdBY3Rpb24uVklERU9fQ0xJQ0ssICh2aWRlb1VybDogc3RyaW5nKSA9PiB0aGlzLnRhZ1NlcnZpY2Uub25BY3Rpb25WaWRlb0NsaWNrKHZpZGVvVXJsKSk7XHJcbiAgICAgICAgbWVzc2VuZ2VyLm9uKFRhZ0FjdGlvbi5JTUFHRV9DTElDSywgKGltYWdlQ29tbWVudElEOiBzdHJpbmcpID0+IHRoaXMudGFnU2VydmljZS5vbkFjdGlvbkltYWdlQ2xpY2soaW1hZ2VDb21tZW50SUQpKTtcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLkRPQ19DTElDSywgKGRvY1VybDogc3RyaW5nKSA9PiB0aGlzLnRhZ1NlcnZpY2Uub25BY3Rpb25Eb2NDbGljayhkb2NVcmwpKTtcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLllPVVRVQkVfQ0xJQ0ssICh5b3V0dWJlVXJsOiBzdHJpbmcpID0+IHRoaXMudGFnU2VydmljZS5vbkFjdGlvbllvdXR1YmVDbGljayh5b3V0dWJlVXJsKSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoc2RrKSB7XHJcbiAgICAgICAgY29uc3QgeyBjb21tZW50LCB0YWdEZXNjcmlwdGlvbiB9ID0gdGhpcy50YWdTZXJ2aWNlLmdldEJpbGxib2FyZE1lZGlhVG9FbWJlZChvYmplY3QpO1xyXG5cclxuICAgICAgICBpZiAoY29tbWVudCkge1xyXG4gICAgICAgICAgLy8gMSkgUmVnaXN0ZXIgdGhlIG1lZGlhIGF0dGFjaG1lbnQgYnkgcGFzc2luZyB0aGUgVVJMIHN0cmluZyhzKS5cclxuICAgICAgICAgIC8vICAgIHJlZ2lzdGVyQXR0YWNobWVudCByZXR1cm5zIGFuIGFycmF5IG9mIGF0dGFjaG1lbnQgSURzLlxyXG4gICAgICAgICAgY29uc3QgW2F0dGFjaG1lbnRJRF0gPSBhd2FpdCBzZGsuVGFnLnJlZ2lzdGVyQXR0YWNobWVudChjb21tZW50LmV4dGVybmFsTGluayk7XHJcblxyXG4gICAgICAgICAgLy8gMikgQXR0YWNoIHRoZSByZWdpc3RlcmVkIG1lZGlhIHRvIHRoZSB0YWcuXHJcbiAgICAgICAgICBhd2FpdCBzZGsuVGFnLmF0dGFjaCh0YWdJRCwgYXR0YWNobWVudElEKTtcclxuXHJcbiAgICAgICAgICAvLyAzKSBEZXRlcm1pbmUgbWVkaWEgdHlwZSBmb3IgdGhlIGJpbGxib2FyZCAoUEhPVE8gb3IgVklERU8pLlxyXG4gICAgICAgICAgLy8gICAgVXNlIGEgc2ltcGxlIGhldXJpc3RpYzogWW91VHViZS9WaW1lbyAtPiBWSURFTywgb3RoZXJ3aXNlIFBIT1RPLlxyXG4gICAgICAgICAgLy8gICAgVGhlIFNESyBleHBvc2VzIE1lZGlhVHlwZSBvbiB0aGUgVGFnIG5hbWVzcGFjZS5cclxuICAgICAgICAgIGNvbnN0IGlzVmlkZW8gPSAveW91dHViZVxcLmNvbXx5b3V0dVxcLmJlfHZpbWVvXFwuY29tL2kudGVzdChjb21tZW50LmV4dGVybmFsTGluayk7XHJcbiAgICAgICAgICBjb25zdCBtZWRpYVR5cGUgPSBpc1ZpZGVvID8gc2RrLk1hdHRlcnRhZy5NZWRpYVR5cGUuVklERU8gOiBzZGsuTWF0dGVydGFnLk1lZGlhVHlwZS5QSE9UTztcclxuXHJcbiAgICAgICAgICAvLyA0KSBVcGRhdGUgdGhlIGJpbGxib2FyZCB0ZXh0IGFuZCBtZWRpYSB1c2luZyBlZGl0QmlsbGJvYXJkLlxyXG4gICAgICAgICAgLy8gICAgZWRpdEJpbGxib2FyZCBhY2NlcHRzIFBhcnRpYWw8VGFnLkVkaXRhYmxlUHJvcGVydGllcz4gc3VjaCBhcyBsYWJlbCwgZGVzY3JpcHRpb24sIG1lZGlhLlxyXG4gICAgICAgICAgYXdhaXQgc2RrLlRhZy5lZGl0QmlsbGJvYXJkKHRhZ0lELCB7XHJcbiAgICAgICAgICAgIGxhYmVsOiBvYmplY3QudGl0bGUgfHwgJ01lZGlhJyxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHRhZ0Rlc2NyaXB0aW9uIHx8ICcnLFxyXG4gICAgICAgICAgICBtZWRpYToge1xyXG4gICAgICAgICAgICAgIHR5cGU6IG1lZGlhVHlwZSxcclxuICAgICAgICAgICAgICBzcmM6IGNvbW1lbnQuZXh0ZXJuYWxMaW5rLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgLy8gNSkgS2VlcCBhIGxvY2FsIHJlZmVyZW5jZVxyXG4gICAgICAgICAgdGhpcy50YWdzQXR0YWNobWVudHNbdGFnSURdID0ge1xyXG4gICAgICAgICAgICBhdHRhY2htZW50SUQsXHJcbiAgICAgICAgICAgIHRpdGxlOiBvYmplY3QudGl0bGUgfHwgJ01lZGlhJyxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHRhZ0Rlc2NyaXB0aW9uIHx8ICcnLFxyXG4gICAgICAgICAgICBtZWRpYVNyYzogY29tbWVudC5leHRlcm5hbExpbmssXHJcbiAgICAgICAgICAgIG1lZGlhVHlwZSxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIEVycm9yIGluIGluamVjdEh0bWxJblRhZzonLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogQ2xlYXJzIGFsbCBsb2NhbCB0YWcgZGF0YSBhbmQgcmVzZXRzIHRoZSBhZGRpdGlvbiBxdWV1ZS4gKi9cclxuICBjbGVhcigpIHtcclxuICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLmNsZWFyKCk7XHJcbiAgICB0aGlzLnRhZ0FkZFF1ZXVlID0gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93ID0gbnVsbDtcclxuICAgIHRoaXMubWF0dGVydGFnSURzID0gW107XHJcbiAgfVxyXG59XHJcbiJdfQ==
485
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC10YWcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvc2VydmljZXMvbWF0dGVycG9ydC10YWcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQWtELFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV6RyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7OztBQU0xQyxNQUFNLE9BQU8sb0JBQW9CO0lBYXJCO0lBWkgsZUFBZSxHQUErQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3hELFdBQVcsR0FBaUIsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzlDLGlCQUFpQixHQUFrQixJQUFJLENBQUM7SUFDeEMsU0FBUyxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7SUFDbEMsWUFBWSxHQUFrQixFQUFFLENBQUM7SUFDakMsZUFBZSxHQUFXLEVBQUUsQ0FBQztJQUM3QixjQUFjLEdBQVksS0FBSyxDQUFDO0lBQ2hDLFVBQVUsR0FBMEIsSUFBSSxDQUFDO0lBQ3hDLGtCQUFrQixHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3BELGtCQUFrQixHQUF5QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRTdELFlBQ1UsaUJBQThDO1FBQTlDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBNkI7SUFDcEQsQ0FBQztJQUVMLGFBQWEsQ0FBQyxPQUF1QjtRQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQztJQUM1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QUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHO3dCQUM1QixZQUFZO3dCQUNaLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxJQUFJLE9BQU87d0JBQzlCLFdBQVcsRUFBRSxjQUFjLElBQUksRUFBRTt3QkFDakMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxZQUFZO3dCQUM5QixTQUFTO3FCQUNWLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0RBQWtELEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0UsQ0FBQztJQUNILENBQUM7SUFFRCwrREFBK0Q7SUFDL0QsS0FBSztRQUNILElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztJQUN6QixDQUFDO3dHQXJoQlUsb0JBQW9COzRHQUFwQixvQkFBb0IsY0FGbkIsTUFBTTs7NEZBRVAsb0JBQW9CO2tCQUhoQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzRGV2TW9kZSwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1hdHRlcnRhZ0RhdGEgfSBmcm9tICcuLi9tYXR0ZXJ0YWdEYXRhJztcclxuaW1wb3J0IHsgUG9pVHlwZSwgRGJPYmplY3RUeXBlLCBQT0ksIFZpZXdlckludGVyYWN0aW9ucywgVGFnQWN0aW9uLCBDYW1lcmFNb2RlIH0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hdHRlcnBvcnROYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4vbWF0dGVycG9ydC1uYXZpZ2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyB3YWl0IH0gZnJvbSAnLi4vaGVscGVycy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFzZVRhZ1NlcnZpY2UgfSBmcm9tICcuL3RhZy5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYXR0ZXJwb3J0VGFnU2VydmljZSB7XHJcbiAgcHVibGljIGRpY3Rpb25uYXJ5VGFnczogTWFwPHN0cmluZywgTWF0dGVydGFnRGF0YT4gPSBuZXcgTWFwKCk7XHJcbiAgcHVibGljIHRhZ0FkZFF1ZXVlOiBQcm9taXNlPGFueT4gPSBQcm9taXNlLnJlc29sdmUoKTtcclxuICBwdWJsaWMgbWF0dGVydGFnVG9Gb2xsb3c6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIHB1YmxpYyBvbkdvVG9UYWcgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XHJcbiAgcHVibGljIG1hdHRlcnRhZ0lEczogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gIHB1YmxpYyB0YWdzQXR0YWNobWVudHM6IE9iamVjdCA9IHt9O1xyXG4gIHB1YmxpYyB0YWdNZXNzZW5nZXJPbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyB0YWdTZXJ2aWNlOiBCYXNlVGFnU2VydmljZSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgdGFnc0N1cnJlbnRPcGFjaXR5OiBNYXA8c3RyaW5nLCBudW1iZXI+ID0gbmV3IE1hcCgpO1xyXG4gIHByaXZhdGUgdGFnc0N1cnJlbnRFbmFibGVkOiBNYXA8c3RyaW5nLCBib29sZWFuPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG5hdmlnYXRpb25TZXJ2aWNlOiBNYXR0ZXJwb3J0TmF2aWdhdGlvblNlcnZpY2VcclxuICApIHsgfVxyXG5cclxuICBzZXRUYWdTZXJ2aWNlKHNlcnZpY2U6IEJhc2VUYWdTZXJ2aWNlKTogdm9pZCB7XHJcbiAgICB0aGlzLnRhZ1NlcnZpY2UgPSBzZXJ2aWNlO1xyXG4gIH1cclxuXHJcbiAgLyoqIE9wZW5zIGEgc3BlY2lmaWMgdGFnIGluIHRoZSBNYXR0ZXJwb3J0IHZpZXdlciBieSBpdHMgSUQuICovXHJcbiAgYXN5bmMgZ29Ub1RhZyhzZGs6IGFueSwgc2lkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgaWYgKCFzZGspIHJldHVybjtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMub25Hb1RvVGFnLm5leHQoc2lkKTtcclxuICAgICAgYXdhaXQgc2RrLlRhZy5vcGVuKHNpZCk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdDYW5ub3Qgb3BlbiB0YWcnLCBzaWQsIGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIE9wZW5zIHRoZSBtb3N0IHJlY2VudGx5IGNyZWF0ZWQgdGFnIGluIHRoZSB2aWV3ZXIuICovXHJcbiAgYXN5bmMgZ29Ub0xhc3RUYWcoc2RrOiBhbnkpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgaWYgKCFzZGsgfHwgdGhpcy5tYXR0ZXJ0YWdJRHMubGVuZ3RoID09PSAwKSByZXR1cm47XHJcbiAgICBjb25zdCBsYXN0U2lkID0gdGhpcy5tYXR0ZXJ0YWdJRHNbdGhpcy5tYXR0ZXJ0YWdJRHMubGVuZ3RoIC0gMV07XHJcbiAgICByZXR1cm4gdGhpcy5nb1RvVGFnKHNkaywgbGFzdFNpZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGRzIGEgTWF0dGVydGFnIHRvIHRoZSB2aWV3ZXIsIHNlcmlhbGl6aW5nIGNhbGxzIHRvIHByZXZlbnQgU0RLIHJhY2UgY29uZGl0aW9ucy5cclxuICAgKiBSZXVzZXMgZXhpc3RpbmcgSURzIGlmIHRoZSB0YWcgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBzZXNzaW9uLlxyXG4gICAqL1xyXG4gIGFzeW5jIGFkZE1hdHRlcnRhZ1RvVmlld2VyKHNkazogYW55LCBtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XHJcbiAgICBpZiAoIXNkaykgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLScpO1xyXG4gICAgY29uc29sZS5sb2coJ2VsZW1lbnQgaWQgJyArIG1hdHRlcnRhZ0RhdGEuZWxlbWVudElEKTtcclxuICAgIGNvbnNvbGUubG9nKCdwb3NpdGlvbjogJywgbWF0dGVydGFnRGF0YS5nZXRQb3NpdGlvbigpKTtcclxuICAgIGNvbnNvbGUubG9nKCdyb3RhdGlvbjogJywgbWF0dGVydGFnRGF0YS5nZXRSb3RhdGlvbigpKTtcclxuICAgIGNvbnNvbGUubG9nKCdzd2VlcCBpZDogJywgbWF0dGVydGFnRGF0YS5nZXRTd2VlcElEKCkpO1xyXG4gICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLScpO1xyXG5cclxuICAgIHRoaXMudGFnQWRkUXVldWUgPSB0aGlzLnRhZ0FkZFF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBkYXRhID0gbWF0dGVydGFnRGF0YS5nZXREYXRhKCkgYXMgYW55O1xyXG4gICAgICBjb25zdCBleGlzdGluZ0lkID0gZGF0YT8uaWQgfHwgbnVsbDtcclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3Qgc2lkTGlzdCA9IGF3YWl0IHNkay5UYWcuYWRkKGRhdGEpO1xyXG4gICAgICAgIGlmIChzaWRMaXN0ICYmIHNpZExpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgY29uc3QgbWF0dGVydGFnSUQgPSBzaWRMaXN0WzBdO1xyXG4gICAgICAgICAgdGhpcy5tYXR0ZXJ0YWdJRHMucHVzaChtYXR0ZXJ0YWdJRCk7XHJcbiAgICAgICAgICB0aGlzLmRpY3Rpb25uYXJ5VGFncy5zZXQobWF0dGVydGFnSUQsIG1hdHRlcnRhZ0RhdGEpO1xyXG4gICAgICAgICAgcmV0dXJuIG1hdHRlcnRhZ0lEO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICAgIGlmIChlcnJvcj8ubWVzc2FnZT8uaW5jbHVkZXMoJ2FscmVhZHkgaW4gdXNlJykgJiYgZXhpc3RpbmdJZCkge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmRpY3Rpb25uYXJ5VGFncy5oYXMoZXhpc3RpbmdJZCkpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXR0ZXJ0YWdJRHMucHVzaChleGlzdGluZ0lkKTtcclxuICAgICAgICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3Muc2V0KGV4aXN0aW5nSWQsIG1hdHRlcnRhZ0RhdGEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nSWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gYWRkIHRhZyB0byB2aWV3ZXInLCBlcnJvcik7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy50YWdBZGRRdWV1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBhZGQgYW5kIGNvbmZpZ3VyZSBhIE1hdHRlcnRhZyB3aXRoIGljb24sIG9wYWNpdHksIGFuZCBIVE1MIGNvbnRlbnQuXHJcbiAgICogSGFuZGxlcyBleGlzdGluZyB0YWdzIGdyYWNlZnVsbHkgYW5kIHF1ZXVlcyBvcGVyYXRpb25zIHRvIGF2b2lkIFNESyBjb25mbGljdHMuXHJcbiAgICovXHJcbiAgYXN5bmMgX2RvQWRkTWF0dGVydGFnKFxyXG4gICAgc2RrOiBhbnksXHJcbiAgICBtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhLFxyXG4gICAgc2V0VGFnSWNvbkFuZE9wYWNpdHk6IChzaWQ6IHN0cmluZywgbXQ6IE1hdHRlcnRhZ0RhdGEpID0+IFByb21pc2U8dm9pZD4sXHJcbiAgICBpbmplY3RIdG1sSW5UYWc6ICh0eXBlOiBQb2lUeXBlLCBvYmo6IERiT2JqZWN0VHlwZSwgc2lkOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cclxuICApOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgY29uc3QgZGVzY3JpcHRvciA9IG1hdHRlcnRhZ0RhdGEuZ2V0TWF0dGVydGFnRGVzY3JpcHRvcigpO1xyXG4gICAgLy9jb25zb2xlLmxvZygnZGVzY3JpcHRvcicsIGRlc2NyaXB0b3IpO1xyXG4gICAgY29uc3Qgc2lkID0gZGVzY3JpcHRvclswXVsnaWQnXTtcclxuXHJcbiAgICBpZiAoc2lkICYmIHRoaXMuZGljdGlvbm5hcnlUYWdzLmhhcyhzaWQpKSB7XHJcbiAgICAgIGF3YWl0IHNldFRhZ0ljb25BbmRPcGFjaXR5KHNpZCwgbWF0dGVydGFnRGF0YSk7XHJcbiAgICAgIGF3YWl0IGluamVjdEh0bWxJblRhZyhtYXR0ZXJ0YWdEYXRhLmdldFR5cGUoKSwgbWF0dGVydGFnRGF0YS5nZXRPYmplY3QoKSwgc2lkKTtcclxuICAgICAgcmV0dXJuIHNpZDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnRhZ0FkZFF1ZXVlID0gdGhpcy50YWdBZGRRdWV1ZS50aGVuKGFzeW5jICgpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBbY3JlYXRlZFNpZF0gPSBhd2FpdCBzZGsuVGFnLmFkZCguLi5kZXNjcmlwdG9yKTtcclxuICAgICAgICB0aGlzLm1hdHRlcnRhZ0lEcy5wdXNoKGNyZWF0ZWRTaWQpO1xyXG4gICAgICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLnNldChjcmVhdGVkU2lkLCBtYXR0ZXJ0YWdEYXRhKTtcclxuXHJcbiAgICAgICAgYXdhaXQgd2FpdCgxMDApO1xyXG4gICAgICAgIGF3YWl0IHNldFRhZ0ljb25BbmRPcGFjaXR5KGNyZWF0ZWRTaWQsIG1hdHRlcnRhZ0RhdGEpO1xyXG5cclxuICAgICAgICBpbmplY3RIdG1sSW5UYWcobWF0dGVydGFnRGF0YS5nZXRUeXBlKCksIG1hdHRlcnRhZ0RhdGEuZ2V0T2JqZWN0KCksIGNyZWF0ZWRTaWQpLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignSFRNTCBpbmplY3Rpb24gZmFpbGVkIGZvcicsIGNyZWF0ZWRTaWQsIGVycik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBjcmVhdGVkU2lkO1xyXG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICBpZiAoZT8ubWVzc2FnZT8uaW5jbHVkZXMoJ2FscmVhZHkgaW4gdXNlJykgJiYgc2lkKSB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuZGljdGlvbm5hcnlUYWdzLmhhcyhzaWQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF0dGVydGFnSURzLnB1c2goc2lkKTtcclxuICAgICAgICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3Muc2V0KHNpZCwgbWF0dGVydGFnRGF0YSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhd2FpdCBzZXRUYWdJY29uQW5kT3BhY2l0eShzaWQsIG1hdHRlcnRhZ0RhdGEpO1xyXG4gICAgICAgICAgYXdhaXQgaW5qZWN0SHRtbEluVGFnKG1hdHRlcnRhZ0RhdGEuZ2V0VHlwZSgpLCBtYXR0ZXJ0YWdEYXRhLmdldE9iamVjdCgpLCBzaWQpO1xyXG4gICAgICAgICAgcmV0dXJuIHNpZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMudGFnQWRkUXVldWU7XHJcbiAgfVxyXG5cclxuICBnZXREaXN0YW5jZShwMTogYW55LCBwMjogYW55KTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3cocDIueCAtIHAxLngsIDIpICsgTWF0aC5wb3cocDIueSAtIHAxLnksIDIpICsgTWF0aC5wb3cocDIueiAtIHAxLnosIDIpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrcyBpZiBhIHRhZyBpcyB3aXRoaW4gdGhlIGJvdW5kaW5nIGJveCBvZiBhbnkgYWN0aXZlIHJvb20gKGFkZGluZyBhIHNsaWdodCBtYXJnaW4gdG8gYWNjb3VudCBmb3Igd2FsbC1tb3VudGVkIHRhZ3MpLlxyXG4gICAqIElmIHRoZXJlIGFyZSBubyBhY3RpdmUgcm9vbXMgKGUuZy4sIGhhbGx3YXkpLCBmYWxscyBiYWNrIHRvIHJldHVybmluZyB0cnVlLlxyXG4gICAqL1xyXG4gIGlzVGFnSW5Sb29tcyhtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhLCByb29tczogYW55W10pOiBib29sZWFuIHtcclxuICAgIGlmICghcm9vbXMgfHwgcm9vbXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgdGFnUG9zID0gbWF0dGVydGFnRGF0YS5nZXRQb3NpdGlvbigpO1xyXG4gICAgY29uc3QgbWFyZ2luID0gMS41O1xyXG5cclxuICAgIHJldHVybiByb29tcy5zb21lKChyb29tKSA9PiB7XHJcbiAgICAgIGlmICghcm9vbS5ib3VuZHMpIHJldHVybiBmYWxzZTtcclxuICAgICAgY29uc3QgeyBtaW4sIG1heCB9ID0gcm9vbS5ib3VuZHM7XHJcblxyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIHRhZ1Bvcy54ID49IG1pbi54IC0gbWFyZ2luICYmIHRhZ1Bvcy54IDw9IG1heC54ICsgbWFyZ2luICYmXHJcbiAgICAgICAgdGFnUG9zLnkgPj0gbWluLnkgLSBtYXJnaW4gJiYgdGFnUG9zLnkgPD0gbWF4LnkgKyBtYXJnaW4gJiZcclxuICAgICAgICB0YWdQb3MueiA+PSBtaW4ueiAtIG1hcmdpbiAmJiB0YWdQb3MueiA8PSBtYXgueiArIG1hcmdpblxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb21wdXRlcyB0aGUgZmluYWwgY29udGV4dC1hd2FyZSBvcGFjaXR5IGZvciBhIHNpbmdsZSB0YWcuXHJcbiAgICogQHBhcmFtIGN1cnJlbnRGbG9vclNlcXVlbmNlICBBdXRob3JpdGF0aXZlIGN1cnJlbnQgZmxvb3Igc2VxdWVuY2UgZnJvbSBzZGsuRmxvb3IuY3VycmVudFxyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwgPSBzaW5nbGUtZmxvb3IgbW9kZWwgb3IgdW5rbm93bikuXHJcbiAgICogQHBhcmFtIGN1cnJlbnRSb29tcyAgICAgICAgICBBcnJheSBvZiBhY3RpdmUgcm9vbXMgdGhlIGNhbWVyYSBpcyBpbi5cclxuICAgKi9cclxuICAvKmNvbXB1dGVTaW5nbGVUYWdDb250ZXh0T3BhY2l0eShcclxuICAgIG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEsXHJcbiAgICBwb3NlQ2FtZXJhOiBhbnksXHJcbiAgICBzd2VlcENvbGxlY3Rpb246IGFueSxcclxuICAgIGN1cnJlbnRGbG9vclNlcXVlbmNlOiBudW1iZXIgfCBudWxsLFxyXG4gICAgY3VycmVudFJvb21zOiBhbnlbXVxyXG4gICk6IG51bWJlciB7XHJcbiAgICBjb25zdCBtb2RlID0gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Q2FtZXJhTW9kZTtcclxuXHJcbiAgICAvLyAxLiBDaGVjayBGbG9vclxyXG4gICAgY29uc3QgdGFnRmxvb3JJZCA9IHRoaXMuZ2V0Rmxvb3JJZEZvclRhZyhtYXR0ZXJ0YWdEYXRhLCBzd2VlcENvbGxlY3Rpb24pO1xyXG4gICAgY29uc3QgY3VycmVudEZsb29ySWQgPSBjdXJyZW50Rmxvb3JTZXF1ZW5jZT8udG9TdHJpbmcoKTtcclxuICAgIGlmICh0YWdGbG9vcklkICYmIGN1cnJlbnRGbG9vcklkICYmIHRhZ0Zsb29ySWQgIT09IGN1cnJlbnRGbG9vcklkKSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDIuIFNpIERvbGxob3VzZSAtPiBQbGVpbmUgb3BhY2l0w6lcclxuICAgIC8vaWYgKG1vZGUgIT09IENhbWVyYU1vZGUuSU5TSURFKSByZXR1cm4gMTtcclxuXHJcbiAgICAvLyAzLiBTaSBJbnNpZGUgLT4gQ2hlY2sgcGnDqGNlICsgRGlzdGFuY2UgcHJvZ3Jlc3NpdmVcclxuICAgIC8vaWYgKCF0aGlzLmlzVGFnSW5Sb29tcyhtYXR0ZXJ0YWdEYXRhLCBjdXJyZW50Um9vbXMpKSByZXR1cm4gMDtcclxuXHJcbiAgICByZXR1cm4gMTtcclxuICB9Ki9cclxuXHJcbiAgLyoqIFJldHVybnMgdGhlIElEIG9mIHRoZSBtb3N0IHJlY2VudGx5IGFkZGVkIHRhZy4gKi9cclxuICBnZXRMYXN0VGFnKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgaWYgKHRoaXMubWF0dGVydGFnSURzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJ0YWdJRHNbdGhpcy5tYXR0ZXJ0YWdJRHMubGVuZ3RoIC0gMV07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIHRoZSB2aXNpYmlsaXR5IChvcGFjaXR5KSBvZiBhbGwgdGFncyBiYXNlZCBvbiB0aGUgY3VycmVudCBjYW1lcmEgbW9kZSxcclxuICAgKiBmbG9vciBhbmQgcm9vbSBjb250ZXh0LiBNdXN0IGJlIGNhbGxlZCBhZnRlciBlYWNoIHN3ZWVwLCBmbG9vciBvciBtb2RlIGNoYW5nZS5cclxuICAgKlxyXG4gICAqIFJ1bGVzOlxyXG4gICAqICAtIERPTExIT1VTRSAvIEZMT09SUExBTiDihpIgYWxsIHRhZ3MgaGlkZGVuIChvcGFjaXR5IDApLlxyXG4gICAqICAtIElOU0lERSDihpIgb25seSB0YWdzIHdob3NlIHN3ZWVwIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgZmxvb3IgYXJlIHNob3duO1xyXG4gICAqICAgIHByb3hpbWl0eS1iYXNlZCBvcGFjaXR5IGlzIGFwcGxpZWQgdmlhIGNvbXB1dGVUYWdPcGFjaXR5KCkuXHJcbiAgICogICAgVGFncyBvbiBvdGhlciBmbG9vcnMgYXJlIGhpZGRlbiAob3BhY2l0eSAwKS5cclxuICAgKiAgLSBUUkFOU0lUSU9OSU5HIOKGkiBubyBjaGFuZ2UgKHNraXAgdXBkYXRlIHRvIGF2b2lkIGZsaWNrZXJpbmcpLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHNkayAgICAgICAgICBNYXR0ZXJwb3J0IFNESyBpbnN0YW5jZS5cclxuICAgKiBAcGFyYW0gcG9zZUNhbWVyYSAgIEN1cnJlbnQgY2FtZXJhIHBvc2UuXHJcbiAgICogQHBhcmFtIHN3ZWVwQ29sbGVjdGlvbiAgRnVsbCBjb2xsZWN0aW9uIG9mIHN3ZWVwcy5cclxuICAgKiBAcGFyYW0gY3VycmVudENhbWVyYU1vZGUgIEN1cnJlbnQgY2FtZXJhIG1vZGUuXHJcbiAgICogQHBhcmFtIG1hdHRlcnRhZ1RvRm9sbG93ICBJRCBvZiB0aGUgY3Vyc29yIHRhZyAobmV2ZXIgdG91Y2hlZCkuXHJcbiAgICovXHJcbiAgYXN5bmMgdXBkYXRlVGFnc1Zpc2liaWxpdHlGb3JDb250ZXh0KFxyXG4gICAgc2RrOiBhbnksXHJcbiAgICBzd2VlcENvbGxlY3Rpb246IGFueSxcclxuICAgIGN1cnJlbnRDYW1lcmFNb2RlOiBDYW1lcmFNb2RlLFxyXG4gICAgbWF0dGVydGFnVG9Gb2xsb3c6IHN0cmluZyB8IG51bGwsXHJcbiAgICBjdXJyZW50Rmxvb3JTZXF1ZW5jZTogbnVtYmVyIHwgbnVsbCA9IG51bGwsXHJcbiAgICBjdXJyZW50Um9vbXM6IGFueVtdID0gW11cclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghc2RrIHx8IHRoaXMuZGljdGlvbm5hcnlUYWdzLnNpemUgPT09IDApIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBpc0ludGVyaW9yTW9kZSA9IGN1cnJlbnRDYW1lcmFNb2RlID09PSBDYW1lcmFNb2RlLklOU0lERTtcclxuICAgIGNvbnN0IGN1cnJlbnRGbG9vcklkID0gY3VycmVudEZsb29yU2VxdWVuY2UgIT09IG51bGwgPyBjdXJyZW50Rmxvb3JTZXF1ZW5jZS50b1N0cmluZygpIDogbnVsbDtcclxuICAgIGNvbnN0IHByb21pc2VzID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBbdGFnSWQsIG1hdHRlcnRhZ0RhdGFdIG9mIHRoaXMuZGljdGlvbm5hcnlUYWdzKSB7XHJcbiAgICAgIGlmICh0YWdJZCA9PT0gbWF0dGVydGFnVG9Gb2xsb3cpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgY29uc3QgdGFnRmxvb3JJZCA9IHRoaXMuZ2V0Rmxvb3JJZEZvclRhZyhtYXR0ZXJ0YWdEYXRhLCBzd2VlcENvbGxlY3Rpb24pO1xyXG4gICAgICBjb25zdCBpc09uQ3VycmVudEZsb29yID0gIXRhZ0Zsb29ySWQgfHwgIWN1cnJlbnRGbG9vcklkIHx8IHRhZ0Zsb29ySWQgPT09IGN1cnJlbnRGbG9vcklkO1xyXG5cclxuICAgICAgbGV0IHRhcmdldE9wYWNpdHkgPSAwO1xyXG4gICAgICBsZXQgc2hvdWxkQmVFbmFibGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAvLyBDYWxjdWxhdGlvbiBvZiBvcGFjaXR5IGFuZCBlbmFibGUgc3RhdHVzXHJcbiAgICAgIGlmIChpc09uQ3VycmVudEZsb29yKSB7XHJcbiAgICAgICAgaWYgKCFpc0ludGVyaW9yTW9kZSkge1xyXG4gICAgICAgICAgdGFyZ2V0T3BhY2l0eSA9IDE7XHJcbiAgICAgICAgICBzaG91bGRCZUVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0YXJnZXRPcGFjaXR5ID0gMC45O1xyXG4gICAgICAgICAgc2hvdWxkQmVFbmFibGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gQXBwbHkgY2hhbmdlc1xyXG5cclxuICAgICAgLy8gVG9vbHRpcCBhbmQgY2xpY2sgbWFuYWdlbWVudFxyXG4gICAgICBjb25zdCBsYXN0RW5hYmxlZCA9IHRoaXMudGFnc0N1cnJlbnRFbmFibGVkLmdldCh0YWdJZCk7XHJcbiAgICAgIGlmIChsYXN0RW5hYmxlZCAhPT0gc2hvdWxkQmVFbmFibGVkKSB7XHJcbiAgICAgICAgdGhpcy50YWdzQ3VycmVudEVuYWJsZWQuc2V0KHRhZ0lkLCBzaG91bGRCZUVuYWJsZWQpO1xyXG4gICAgICAgIHByb21pc2VzLnB1c2goc2RrLlRhZy5hbGxvd0FjdGlvbih0YWdJZCwge1xyXG4gICAgICAgICAgb3BlbmluZzogc2hvdWxkQmVFbmFibGVkLFxyXG4gICAgICAgICAgbmF2aWdhdGluZzogc2hvdWxkQmVFbmFibGVkLFxyXG4gICAgICAgICAgZG9ja2luZzogZmFsc2VcclxuICAgICAgICB9KS5jYXRjaCgoKSA9PiB7IH0pKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBPcGFjaXR5IG1hbmFnZW1lbnRcclxuICAgICAgY29uc3QgbGFzdE9wYWNpdHkgPSB0aGlzLnRhZ3NDdXJyZW50T3BhY2l0eS5nZXQodGFnSWQpID8/IC0xO1xyXG4gICAgICBpZiAoTWF0aC5hYnMobGFzdE9wYWNpdHkgLSB0YXJnZXRPcGFjaXR5KSA+IDAuMDUpIHtcclxuICAgICAgICB0aGlzLnRhZ3NDdXJyZW50T3BhY2l0eS5zZXQodGFnSWQsIHRhcmdldE9wYWNpdHkpO1xyXG4gICAgICAgIHByb21pc2VzLnB1c2goc2RrLlRhZy5lZGl0T3BhY2l0eSh0YWdJZCwgdGFyZ2V0T3BhY2l0eSkuY2F0Y2goKCkgPT4geyB9KSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XHJcbiAgfVxyXG5cclxuICAvKiogUmVtb3ZlcyBhIHNwZWNpZmljIHRhZyBmcm9tIHRoZSB2aWV3ZXIgYW5kIGxvY2FsIGRpY3Rpb25hcmllcy4gKi9cclxuICBhc3luYyBkZWxldGVNYXR0ZXJ0YWdGcm9tSWQoc2RrOiBhbnksIG1hdHRlcnRhZ0lEOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChzZGspIGF3YWl0IHNkay5UYWcucmVtb3ZlKG1hdHRlcnRhZ0lEKTtcclxuICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZGVsZXRlKG1hdHRlcnRhZ0lEKTtcclxuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm1hdHRlcnRhZ0lEcy5pbmRleE9mKG1hdHRlcnRhZ0lEKTtcclxuICAgICAgaWYgKGluZGV4ID4gLTEpIHRoaXMubWF0dGVydGFnSURzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0Nhbm5vdCBkZWxldGUgdGFnJywgbWF0dGVydGFnSUQsIGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFJlbW92ZXMgdGhlIGxhc3QgYWRkZWQgdGFnIGZyb20gdGhlIHZpZXdlci4gKi9cclxuICBhc3luYyBkZWxldGVMYXN0TWF0dGVydGFnKHNkazogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBsYXN0U2lkID0gdGhpcy5nZXRMYXN0VGFnKCk7XHJcbiAgICBpZiAobGFzdFNpZCkgYXdhaXQgdGhpcy5kZWxldGVNYXR0ZXJ0YWdGcm9tSWQoc2RrLCBsYXN0U2lkKTtcclxuICB9XHJcblxyXG4gIC8qKiBDbGVhcnMgYWxsIHRhZ3MgZnJvbSB0aGUgdmlld2VyIGFuZCByZXNldHMgbG9jYWwgc3RhdGUuICovXHJcbiAgYXN5bmMgYWN0aW9uX2RlbGV0ZV9hbGxfbWF0dGVydGFncyhzZGs6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHNkaykge1xyXG4gICAgICBjb25zdCBzaWRzVG9SZW1vdmUgPSBbLi4udGhpcy5tYXR0ZXJ0YWdJRHNdO1xyXG4gICAgICBmb3IgKGNvbnN0IHNpZCBvZiBzaWRzVG9SZW1vdmUpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgYXdhaXQgc2RrLlRhZy5yZW1vdmUoc2lkKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5jbGVhcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhbmQgY29uZmlndXJlcyBhIE1hdHRlcnRhZyBmcm9tIGEgUE9JLCBoYW5kbGluZyBjb29yZGluYXRlcywgbm9ybWFscywgYW5kIHN3ZWVwIElELlxyXG4gICAqIFNraXBzIGNyZWF0aW9uIGlmIGEgdGFnIGZvciB0aGUgb2JqZWN0IGFscmVhZHkgZXhpc3RzLlxyXG4gICAqL1xyXG4gIGFzeW5jIGNyZWF0ZU1hdHRlcnRhZ0Zyb21QT0koXHJcbiAgICBzZGs6IGFueSxcclxuICAgIHRhZ1R5cGU6IFBvaVR5cGUsXHJcbiAgICBvYmplY3Q6IERiT2JqZWN0VHlwZSxcclxuICAgIHBvaTogUE9JLFxyXG4gICAgcG9zZUNhbWVyYTogYW55LFxyXG4gICAgZ2V0VGFnRnJvbUVsZW1lbnRJZDogKGlkOiBzdHJpbmcpID0+IHsgdGFnOiBzdHJpbmc7IHN3ZWVwOiBzdHJpbmcgfSxcclxuICAgIHNldFRhZ0ljb25BbmRPcGFjaXR5OiAoc2lkOiBzdHJpbmcsIG10OiBNYXR0ZXJ0YWdEYXRhKSA9PiBQcm9taXNlPHZvaWQ+LFxyXG4gICAgaW5qZWN0SHRtbEluVGFnOiAodHlwZTogUG9pVHlwZSwgb2JqOiBEYk9iamVjdFR5cGUsIHNpZDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XHJcbiAgKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IHsgdGFnIH0gPSBnZXRUYWdGcm9tRWxlbWVudElkKG9iamVjdC5pZCk7XHJcbiAgICBpZiAodGFnKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgbWF0dGVydGFnRGF0YTogTWF0dGVydGFnRGF0YSA9IG5ldyBNYXR0ZXJ0YWdEYXRhKHRhZ1R5cGUpO1xyXG4gICAgbWF0dGVydGFnRGF0YS5zZXRPYmplY3Qob2JqZWN0LCB0YWdUeXBlKTtcclxuXHJcbiAgICBpZiAocG9pLmNvb3JkaW5hdGUpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBtYXR0ZXJ0YWdEYXRhLnNldFBvc2l0aW9uKEpTT04ucGFyc2UocG9pLmNvb3JkaW5hdGUpKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdFcnJvciBwYXJzaW5nIFBPSSBjb29yZGluYXRlcycsIHBvaS5jb29yZGluYXRlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChwb2kubWV0YWRhdGEpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCB0YWdNZXRhZGF0YSA9IEpTT04ucGFyc2UocG9pLm1ldGFkYXRhKTtcclxuICAgICAgICBtYXR0ZXJ0YWdEYXRhLnNldE5vcm1hbCh0YWdNZXRhZGF0YS5ub3JtYWwgfHwgeyB4OiAwLCB5OiAtMC4xNSwgejogMCB9KTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0Tm9ybWFsKHsgeDogMCwgeTogLTAuMTUsIHo6IDAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAocG9pLm1hdHRlcnBvcnRTd2VlcElEKSB7XHJcbiAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0U3dlZXBJRChwb2kubWF0dGVycG9ydFN3ZWVwSUQpO1xyXG4gICAgfVxyXG4gICAgbWF0dGVydGFnRGF0YS5zZXRQb2kocG9pKTtcclxuXHJcbiAgICBjb25zdCBjcmVhdGVkVGFnSUQgPSBhd2FpdCB0aGlzLmFkZE1hdHRlcnRhZ1RvVmlld2VyKHNkaywgbWF0dGVydGFnRGF0YSk7XHJcblxyXG4gICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLScpO1xyXG4gICAgY29uc29sZS5sb2coJ2VsZW1lbnQgaWQgJyArIG1hdHRlcnRhZ0RhdGEuZWxlbWVudElEKTtcclxuICAgIGNvbnNvbGUubG9nKCdwb3NpdGlvbjogJywgbWF0dGVydGFnRGF0YS5nZXRQb3NpdGlvbigpKTtcclxuICAgIGNvbnNvbGUubG9nKCdyb3RhdGlvbjogJywgbWF0dGVydGFnRGF0YS5nZXRSb3RhdGlvbigpKTtcclxuICAgIGNvbnNvbGUubG9nKCdzd2VlcCBpZDogJywgbWF0dGVydGFnRGF0YS5nZXRTd2VlcElEKCkpO1xyXG4gICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLScpO1xyXG5cclxuXHJcbiAgICBpZiAoY3JlYXRlZFRhZ0lEICYmIHNkaykge1xyXG4gICAgICBhd2FpdCB3YWl0KDEwMCk7XHJcbiAgICAgIGF3YWl0IHNldFRhZ0ljb25BbmRPcGFjaXR5KGNyZWF0ZWRUYWdJRCwgbWF0dGVydGFnRGF0YSk7XHJcbiAgICAgIGluamVjdEh0bWxJblRhZyh0YWdUeXBlLCBvYmplY3QsIGNyZWF0ZWRUYWdJRCkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignSFRNTCBpbmplY3Rpb24gZmFpbGVkIGZvcicsIGNyZWF0ZWRUYWdJRCwgZXJyKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNyZWF0ZWRUYWdJRDtcclxuICB9XHJcblxyXG4gIC8qKiBVcGRhdGVzIHRoZSBpY29uLCBvcGFjaXR5LCBhbmQgSFRNTCBjb250ZW50IG9mIGFuIGV4aXN0aW5nIHRhZy4gKi9cclxuICBhc3luYyB1cGRhdGVNYXR0ZXJUYWdDb250ZW50Rm9yVGFnSUQoXHJcbiAgICBzZGs6IGFueSxcclxuICAgIG1hdHRlcnRhZ0lEOiBzdHJpbmcsXHJcbiAgICBvYmplY3Q6IERiT2JqZWN0VHlwZSxcclxuICAgIHBvaVR5cGU6IFBvaVR5cGUsXHJcbiAgICBzZXRUYWdJY29uQW5kT3BhY2l0eTogKHNpZDogc3RyaW5nLCBtdDogTWF0dGVydGFnRGF0YSkgPT4gUHJvbWlzZTx2b2lkPixcclxuICAgIGluamVjdEh0bWxJblRhZzogKHR5cGU6IFBvaVR5cGUsIG9iajogRGJPYmplY3RUeXBlLCBzaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxyXG4gICk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBtYXR0ZXJ0YWdEYXRhID0gdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZ2V0KG1hdHRlcnRhZ0lEKTtcclxuICAgIGlmICghbWF0dGVydGFnRGF0YSkgcmV0dXJuO1xyXG5cclxuICAgIGlmIChvYmplY3QpIHtcclxuICAgICAgbWF0dGVydGFnRGF0YS5zZXRPYmplY3Qob2JqZWN0LCBwb2lUeXBlKTtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCBzZXRUYWdJY29uQW5kT3BhY2l0eShtYXR0ZXJ0YWdJRCwgbWF0dGVydGFnRGF0YSk7XHJcbiAgICBhd2FpdCBpbmplY3RIdG1sSW5UYWcocG9pVHlwZSwgb2JqZWN0LCBtYXR0ZXJ0YWdJRCk7XHJcbiAgfVxyXG5cclxuICAvKiogUmVnaXN0ZXJzIGEgY3VzdG9tIHRleHR1cmUgYW5kIGFwcGxpZXMgaXQgdG8gYSB0YWcsIG9wdGlvbmFsbHkgYWRqdXN0aW5nIG9wYWNpdHkuICovXHJcbiAgYXN5bmMgYWRkTmV3SWNvbkFuZFNldEZvclRhZyhcclxuICAgIHNkazogYW55LFxyXG4gICAgbWF0dGVydGFnSUQ6IHN0cmluZyxcclxuICAgIGljb25QYXRoOiBzdHJpbmcsXHJcbiAgICBhcHBseU9wYWNpdHk6IGJvb2xlYW4sXHJcbiAgICBvcGFjaXR5OiBudW1iZXJcclxuICApIHtcclxuICAgIGlmICghc2RrKSByZXR1cm47XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBpY29uTmFtZSA9IGBjdXN0b20taWNvbi0ke21hdHRlcnRhZ0lEfWA7XHJcbiAgICAgIGF3YWl0IHNkay5Bc3NldC5yZWdpc3RlclRleHR1cmUoaWNvbk5hbWUsIGljb25QYXRoKTtcclxuICAgICAgYXdhaXQgc2RrLlRhZy5lZGl0SWNvbihtYXR0ZXJ0YWdJRCwgaWNvbk5hbWUpO1xyXG5cclxuICAgICAgaWYgKGFwcGx5T3BhY2l0eSkge1xyXG4gICAgICAgIGF3YWl0IHNkay5UYWcuZWRpdE9wYWNpdHkobWF0dGVydGFnSUQsIG9wYWNpdHkpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignRXJyb3Igc2V0dGluZyBjdXN0b20gaWNvbiBvciBvcGFjaXR5JywgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEZpbmRzIHRoZSB0YWcgSUQgYW5kIHN3ZWVwIElEIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIGVsZW1lbnQgSUQuICovXHJcbiAgZ2V0VGFnRnJvbUVsZW1lbnRJZChlbGVtZW50SUQ6IHN0cmluZywgc3dlZXBzOiBzdHJpbmdbXSB8IG51bGwpOiB7IHRhZzogc3RyaW5nIHwgbnVsbDsgc3dlZXA6IHN0cmluZyB8IG51bGwgfSB7XHJcbiAgICBsZXQgdGFnSUQgPSBudWxsO1xyXG4gICAgbGV0IHN3ZWVwSUQgPSBudWxsO1xyXG4gICAgZm9yIChsZXQgW21hdHRlcnRhZ0lELCBtYXR0ZXJ0YWdEYXRhXSBvZiB0aGlzLmRpY3Rpb25uYXJ5VGFncykge1xyXG4gICAgICBpZiAobWF0dGVydGFnRGF0YS5lbGVtZW50SUQgPT09IGVsZW1lbnRJRCkge1xyXG4gICAgICAgIHRhZ0lEID0gbWF0dGVydGFnSUQ7XHJcbiAgICAgICAgY29uc3Qgc3dlZXAgPSBtYXR0ZXJ0YWdEYXRhLmdldFN3ZWVwSUQoKTtcclxuICAgICAgICBpZiAoc3dlZXAgJiYgc3dlZXBzKSB7XHJcbiAgICAgICAgICAvLyBzd2VlcCBpcyBhIHV1aWQ7IHN3ZWVwcyBhcnJheSBjb250YWlucyBzaWRzIOKAkyBjaGVjayBib3RoIGZvcm1hdHNcclxuICAgICAgICAgIGNvbnN0IHJlc29sdmVkU2lkID0gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5yZXNvbHZlU3dlZXBTaWQoc3dlZXApO1xyXG4gICAgICAgICAgaWYgKHN3ZWVwcy5pbmNsdWRlcyhzd2VlcCkgfHwgc3dlZXBzLmluY2x1ZGVzKHJlc29sdmVkU2lkKSkge1xyXG4gICAgICAgICAgICBzd2VlcElEID0gc3dlZXA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyB0YWc6IHRhZ0lELCBzd2VlcDogc3dlZXBJRCB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIFJldHJpZXZlcyB0aGUgZmxvb3IgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggYSB0YWcgYmFzZWQgb24gaXRzIHN3ZWVwIGRhdGEuXHJcbiAgICogIEhhbmRsZXMgYm90aCB0aGUgb2JqZWN0IGZvcm0gKHsgZmxvb3JJbmZvOiB7IGlkLCBzZXF1ZW5jZSB9LCBmbG9vcjogeyBpZCB9IH0pXHJcbiAgICogIGFuZCB0aGUgcHJpbWl0aXZlIGZvcm0gKGZsb29yOiBudW1iZXIpIHVzZWQgYnkgTWF0dGVycG9ydCBTREsgdjMuXHJcbiAgICovXHJcbiAgZ2V0Rmxvb3JJZEZvclRhZyhtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhLCBzd2VlcENvbGxlY3Rpb246IGFueSk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3Qgc3dlZXBJZCA9IG1hdHRlcnRhZ0RhdGEuZ2V0U3dlZXBJRCgpO1xyXG4gICAgaWYgKCFzd2VlcElkIHx8ICFzd2VlcENvbGxlY3Rpb24pIHJldHVybiBudWxsO1xyXG5cclxuICAgIGNvbnN0IHN3ZWVwRGF0YSA9IHN3ZWVwQ29sbGVjdGlvbltzd2VlcElkXTtcclxuICAgIGlmICghc3dlZXBEYXRhKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAvLyBTREsgdjM6IHN3ZWVwLmZsb29yIGlzIGEgcHJpbWl0aXZlIG51bWJlciAodGhlIHNlcXVlbmNlIGluZGV4KVxyXG4gICAgaWYgKHR5cGVvZiBzd2VlcERhdGEuZmxvb3IgPT09ICdudW1iZXInKSB7XHJcbiAgICAgIHJldHVybiBzd2VlcERhdGEuZmxvb3IudG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBPbGRlciAvIGV4dGVuZGVkIGZvcm1hdHNcclxuICAgIHJldHVybiBzd2VlcERhdGE/LmZsb29ySW5mbz8uaWRcclxuICAgICAgPz8gc3dlZXBEYXRhPy5mbG9vckluZm8/LnNlcXVlbmNlPy50b1N0cmluZygpXHJcbiAgICAgID8/IHN3ZWVwRGF0YT8uZmxvb3JJZFxyXG4gICAgICA/PyBzd2VlcERhdGE/LmZsb29yPy5pZFxyXG4gICAgICA/PyBzd2VlcERhdGE/LmZsb29yPy5zZXF1ZW5jZT8udG9TdHJpbmcoKVxyXG4gICAgICA/PyBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5qZWN0cyBjdXN0b20gSFRNTCBvciBmYWxsYmFjayBiaWxsYm9hcmQgbWVkaWEgaW50byBhIE1hdHRlcnRhZyBzYW5kYm94LlxyXG4gICAqIEF0dGFjaGVzIGV2ZW50IGxpc3RlbmVycyBmb3IgaW50ZXJhY3RpdmUgZWxlbWVudHMgd2l0aGluIHRoZSB0YWcuXHJcbiAgICovXHJcbiAgYXN5bmMgaW5qZWN0SHRtbEluVGFnKHNkazogYW55LCB0YWdUeXBlOiBQb2lUeXBlLCBvYmplY3Q6IERiT2JqZWN0VHlwZSwgdGFnSUQ6IHN0cmluZykge1xyXG4gICAgaWYgKCF0aGlzLnRhZ1NlcnZpY2UpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignW01hdHRlcnBvcnRUYWdTZXJ2aWNlXSB0YWdTZXJ2aWNlIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGh0bWwgPSBhd2FpdCB0aGlzLnRhZ1NlcnZpY2UuZ2V0SHRtbFRvSW5qZWN0KHRhZ1R5cGUsIG9iamVjdCk7XHJcblxyXG4gICAgICBpZiAoaHRtbCAmJiBodG1sLnRyaW0oKS5sZW5ndGggPiAwICYmIHNkaykge1xyXG4gICAgICAgIGNvbnN0IHNjcmlwdFRhZyA9IHRoaXMudGFnU2VydmljZS5nZXRTY3JpcHRGb3JUYWcob2JqZWN0LCB0YWdUeXBlKTtcclxuICAgICAgICBodG1sICs9IGAke3NjcmlwdFRhZ31gO1xyXG5cclxuICAgICAgICBjb25zdCBbc2FuZGJveElkLCBtZXNzZW5nZXJdID0gYXdhaXQgc2RrLlRhZy5yZWdpc3RlclNhbmRib3goaHRtbCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGF0dGFjaG1lbnRJRCA9IHRoaXMudGFnc0F0dGFjaG1lbnRzW3RhZ0lEXTtcclxuICAgICAgICBpZiAoYXR0YWNobWVudElEKSB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCBzZGsuVGFnLmRldGFjaCh0YWdJRCwgYXR0YWNobWVudElEKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy50YWdzQXR0YWNobWVudHNbdGFnSURdID0gc2FuZGJveElkO1xyXG4gICAgICAgIGF3YWl0IHNkay5UYWcuYXR0YWNoKHRhZ0lELCBzYW5kYm94SWQpO1xyXG5cclxuICAgICAgICAvLyBBdHRhY2ggdGhlIFwiVmlldyBpbmZvcm1hdGlvbnNcIiBoYW5kbGVyIGluIHRvb2x0aXBcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLkRFVEFJTF9DTElDSywgdGhpcy50YWdTZXJ2aWNlLm9uQWN0aW9uRGV0YWlsQ2xpY2suYmluZCh0aGlzLnRhZ1NlcnZpY2UpKTtcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLlRJQ0tFVF9DTElDSywgdGhpcy50YWdTZXJ2aWNlLm9uQWN0aW9uRGV0YWlsQ2xpY2suYmluZCh0aGlzLnRhZ1NlcnZpY2UpKTtcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLkFVRElPX0NMSUNLLCAoYXVkaW9Db21tZW50SUQ6IHN0cmluZykgPT4gdGhpcy50YWdTZXJ2aWNlLm9uQWN0aW9uQXVkaW9DbGljayhhdWRpb0NvbW1lbnRJRCkpO1xyXG4gICAgICAgIG1lc3Nlbmdlci5vbihUYWdBY3Rpb24uVklERU9fQ0xJQ0ssICh2aWRlb1VybDogc3RyaW5nKSA9PiB0aGlzLnRhZ1NlcnZpY2Uub25BY3Rpb25WaWRlb0NsaWNrKHZpZGVvVXJsKSk7XHJcbiAgICAgICAgbWVzc2VuZ2VyLm9uKFRhZ0FjdGlvbi5JTUFHRV9DTElDSywgKGltYWdlQ29tbWVudElEOiBzdHJpbmcpID0+IHRoaXMudGFnU2VydmljZS5vbkFjdGlvbkltYWdlQ2xpY2soaW1hZ2VDb21tZW50SUQpKTtcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLkRPQ19DTElDSywgKGRvY1VybDogc3RyaW5nKSA9PiB0aGlzLnRhZ1NlcnZpY2Uub25BY3Rpb25Eb2NDbGljayhkb2NVcmwpKTtcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLllPVVRVQkVfQ0xJQ0ssICh5b3V0dWJlVXJsOiBzdHJpbmcpID0+IHRoaXMudGFnU2VydmljZS5vbkFjdGlvbllvdXR1YmVDbGljayh5b3V0dWJlVXJsKSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoc2RrKSB7XHJcbiAgICAgICAgY29uc3QgeyBjb21tZW50LCB0YWdEZXNjcmlwdGlvbiB9ID0gdGhpcy50YWdTZXJ2aWNlLmdldEJpbGxib2FyZE1lZGlhVG9FbWJlZChvYmplY3QpO1xyXG5cclxuICAgICAgICBpZiAoY29tbWVudCkge1xyXG4gICAgICAgICAgLy8gMSkgUmVnaXN0ZXIgdGhlIG1lZGlhIGF0dGFjaG1lbnQgYnkgcGFzc2luZyB0aGUgVVJMIHN0cmluZyhzKS5cclxuICAgICAgICAgIC8vICAgIHJlZ2lzdGVyQXR0YWNobWVudCByZXR1cm5zIGFuIGFycmF5IG9mIGF0dGFjaG1lbnQgSURzLlxyXG4gICAgICAgICAgY29uc3QgW2F0dGFjaG1lbnRJRF0gPSBhd2FpdCBzZGsuVGFnLnJlZ2lzdGVyQXR0YWNobWVudChjb21tZW50LmV4dGVybmFsTGluayk7XHJcblxyXG4gICAgICAgICAgLy8gMikgQXR0YWNoIHRoZSByZWdpc3RlcmVkIG1lZGlhIHRvIHRoZSB0YWcuXHJcbiAgICAgICAgICBhd2FpdCBzZGsuVGFnLmF0dGFjaCh0YWdJRCwgYXR0YWNobWVudElEKTtcclxuXHJcbiAgICAgICAgICAvLyAzKSBEZXRlcm1pbmUgbWVkaWEgdHlwZSBmb3IgdGhlIGJpbGxib2FyZCAoUEhPVE8gb3IgVklERU8pLlxyXG4gICAgICAgICAgLy8gICAgVXNlIGEgc2ltcGxlIGhldXJpc3RpYzogWW91VHViZS9WaW1lbyAtPiBWSURFTywgb3RoZXJ3aXNlIFBIT1RPLlxyXG4gICAgICAgICAgLy8gICAgVGhlIFNESyBleHBvc2VzIE1lZGlhVHlwZSBvbiB0aGUgVGFnIG5hbWVzcGFjZS5cclxuICAgICAgICAgIGNvbnN0IGlzVmlkZW8gPSAveW91dHViZVxcLmNvbXx5b3V0dVxcLmJlfHZpbWVvXFwuY29tL2kudGVzdChjb21tZW50LmV4dGVybmFsTGluayk7XHJcbiAgICAgICAgICBjb25zdCBtZWRpYVR5cGUgPSBpc1ZpZGVvID8gc2RrLk1hdHRlcnRhZy5NZWRpYVR5cGUuVklERU8gOiBzZGsuTWF0dGVydGFnLk1lZGlhVHlwZS5QSE9UTztcclxuXHJcbiAgICAgICAgICAvLyA0KSBVcGRhdGUgdGhlIGJpbGxib2FyZCB0ZXh0IGFuZCBtZWRpYSB1c2luZyBlZGl0QmlsbGJvYXJkLlxyXG4gICAgICAgICAgLy8gICAgZWRpdEJpbGxib2FyZCBhY2NlcHRzIFBhcnRpYWw8VGFnLkVkaXRhYmxlUHJvcGVydGllcz4gc3VjaCBhcyBsYWJlbCwgZGVzY3JpcHRpb24sIG1lZGlhLlxyXG4gICAgICAgICAgYXdhaXQgc2RrLlRhZy5lZGl0QmlsbGJvYXJkKHRhZ0lELCB7XHJcbiAgICAgICAgICAgIGxhYmVsOiBvYmplY3QudGl0bGUgfHwgJ01lZGlhJyxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHRhZ0Rlc2NyaXB0aW9uIHx8ICcnLFxyXG4gICAgICAgICAgICBtZWRpYToge1xyXG4gICAgICAgICAgICAgIHR5cGU6IG1lZGlhVHlwZSxcclxuICAgICAgICAgICAgICBzcmM6IGNvbW1lbnQuZXh0ZXJuYWxMaW5rLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgLy8gNSkgS2VlcCBhIGxvY2FsIHJlZmVyZW5jZVxyXG4gICAgICAgICAgdGhpcy50YWdzQXR0YWNobWVudHNbdGFnSURdID0ge1xyXG4gICAgICAgICAgICBhdHRhY2htZW50SUQsXHJcbiAgICAgICAgICAgIHRpdGxlOiBvYmplY3QudGl0bGUgfHwgJ01lZGlhJyxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHRhZ0Rlc2NyaXB0aW9uIHx8ICcnLFxyXG4gICAgICAgICAgICBtZWRpYVNyYzogY29tbWVudC5leHRlcm5hbExpbmssXHJcbiAgICAgICAgICAgIG1lZGlhVHlwZSxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIEVycm9yIGluIGluamVjdEh0bWxJblRhZzonLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogQ2xlYXJzIGFsbCBsb2NhbCB0YWcgZGF0YSBhbmQgcmVzZXRzIHRoZSBhZGRpdGlvbiBxdWV1ZS4gKi9cclxuICBjbGVhcigpIHtcclxuICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLmNsZWFyKCk7XHJcbiAgICB0aGlzLnRhZ0FkZFF1ZXVlID0gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93ID0gbnVsbDtcclxuICAgIHRoaXMubWF0dGVydGFnSURzID0gW107XHJcbiAgfVxyXG59XHJcbiJdfQ==