@smarterplan/ngx-smarterplan-core 1.4.14 → 1.4.16

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 (105) hide show
  1. package/README.md +24 -24
  2. package/esm2022/lib/components/csv-export/csv-export.component.mjs +3 -3
  3. package/esm2022/lib/components/loader/loader.component.mjs +3 -3
  4. package/esm2022/lib/components/menu-bar/avatar/avatar.component.mjs +1 -1
  5. package/esm2022/lib/components/menu-bar/menu-bar.component.mjs +3 -3
  6. package/esm2022/lib/components/menu-bar/navigation-bar/navigation-bar.component.mjs +3 -3
  7. package/esm2022/lib/components/modal-switch-visit/modal-switch-visit.component.mjs +3 -3
  8. package/esm2022/lib/components/search-bar/search-bar.component.mjs +3 -3
  9. package/esm2022/lib/components/support-modal/support-modal.component.mjs +3 -3
  10. package/esm2022/lib/config.mjs +1 -1
  11. package/esm2022/lib/helpers.service.mjs +46 -1
  12. package/esm2022/lib/matterport-extensions/nest-thermostat/CanvasImage.mjs +1 -1
  13. package/esm2022/lib/matterport-extensions/nest-thermostat/CanvasRenderer.mjs +1 -1
  14. package/esm2022/lib/matterport-extensions/nest-thermostat/NestThermostat.mjs +1 -1
  15. package/esm2022/lib/matterport-extensions/nest-thermostat/PlaneRenderer.mjs +1 -1
  16. package/esm2022/lib/matterport-extensions/scene-component/SceneComponent.mjs +1 -1
  17. package/esm2022/lib/matterport-extensions/security-camera/SecurityCamera.mjs +22 -22
  18. package/esm2022/lib/matterport-extensions/tv-player/TvPlayer.mjs +1 -1
  19. package/esm2022/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.mjs +22 -22
  20. package/esm2022/lib/mattertagData.mjs +1 -1
  21. package/esm2022/lib/ngx-smarterplan-core.module.mjs +1 -1
  22. package/esm2022/lib/ngx-smarterplan-core.service.mjs +1 -1
  23. package/esm2022/lib/pipes/duration-to-string.pipe.mjs +1 -1
  24. package/esm2022/lib/pipes/format-date-number-to-digits.pipe.mjs +1 -1
  25. package/esm2022/lib/pipes/safe-url.pipe.mjs +1 -1
  26. package/esm2022/lib/pipes/time-date-to-local-string.pipe.mjs +1 -1
  27. package/esm2022/lib/pipes/username-from-id.pipe.mjs +1 -1
  28. package/esm2022/lib/services/amplify-cache.service.mjs +1 -1
  29. package/esm2022/lib/services/base-tab.service.mjs +1 -1
  30. package/esm2022/lib/services/baseVisibility.service.mjs +1 -1
  31. package/esm2022/lib/services/content.service.mjs +1 -1
  32. package/esm2022/lib/services/filter.service.mjs +1 -1
  33. package/esm2022/lib/services/intervention.service.mjs +1 -1
  34. package/esm2022/lib/services/locale.service.mjs +1 -1
  35. package/esm2022/lib/services/matterport-import.service.mjs +1 -1
  36. package/esm2022/lib/services/matterport-measurement.service.mjs +1 -1
  37. package/esm2022/lib/services/matterport-navigation.service.mjs +1 -1
  38. package/esm2022/lib/services/matterport-object3d.service.mjs +1 -1
  39. package/esm2022/lib/services/matterport-pointer.service.mjs +6 -6
  40. package/esm2022/lib/services/matterport-tag-copy.service.mjs +448 -62
  41. package/esm2022/lib/services/matterport-tag.service.mjs +1 -1
  42. package/esm2022/lib/services/matterport.service.mjs +17 -17
  43. package/esm2022/lib/services/models/affectation.service.mjs +1 -1
  44. package/esm2022/lib/services/models/base-object.service.mjs +1 -1
  45. package/esm2022/lib/services/models/capture.service.mjs +1 -1
  46. package/esm2022/lib/services/models/comment.service.mjs +1 -1
  47. package/esm2022/lib/services/models/domain.service.mjs +20 -1
  48. package/esm2022/lib/services/models/equipment.service.mjs +4 -2
  49. package/esm2022/lib/services/models/event.service.mjs +1 -1
  50. package/esm2022/lib/services/models/feature.service.mjs +1 -7
  51. package/esm2022/lib/services/models/hashtag.service.mjs +1 -1
  52. package/esm2022/lib/services/models/layer.service.mjs +1 -1
  53. package/esm2022/lib/services/models/measurement.service.mjs +1 -1
  54. package/esm2022/lib/services/models/mission.service.mjs +17 -1
  55. package/esm2022/lib/services/models/navigation.service.mjs +1 -1
  56. package/esm2022/lib/services/models/node.service.mjs +1 -1
  57. package/esm2022/lib/services/models/object3D.service.mjs +1 -1
  58. package/esm2022/lib/services/models/operation.service.mjs +1 -1
  59. package/esm2022/lib/services/models/organisation.service.mjs +1 -1
  60. package/esm2022/lib/services/models/plan.service.mjs +1 -1
  61. package/esm2022/lib/services/models/poi.service.mjs +27 -27
  62. package/esm2022/lib/services/models/profile.service.mjs +1 -1
  63. package/esm2022/lib/services/models/property.service.mjs +1 -1
  64. package/esm2022/lib/services/models/space.service.mjs +25 -6
  65. package/esm2022/lib/services/models/template.service.mjs +1 -1
  66. package/esm2022/lib/services/models/ticket.service.mjs +1 -1
  67. package/esm2022/lib/services/models/visit.service.mjs +17 -5
  68. package/esm2022/lib/services/models/zone.service.mjs +1 -1
  69. package/esm2022/lib/services/navigator.service.mjs +1 -1
  70. package/esm2022/lib/services/s3.service.mjs +18 -1
  71. package/esm2022/lib/services/search.service.mjs +1 -1
  72. package/esm2022/lib/services/support.service.mjs +1 -1
  73. package/esm2022/lib/services/tag.service.mjs +16 -16
  74. package/esm2022/lib/services/threejs-import.service.mjs +151 -0
  75. package/esm2022/lib/services/threejs.service.mjs +1306 -0
  76. package/esm2022/lib/services/user.service.mjs +1 -1
  77. package/esm2022/lib/services/utils/matterport-transform.util.mjs +1 -1
  78. package/esm2022/lib/services/validators.service.mjs +1 -1
  79. package/esm2022/lib/services/viewer.service.mjs +263 -5
  80. package/esm2022/lib/services/zone-drawer.service.mjs +1 -1
  81. package/esm2022/lib/services/zoneChange.service.mjs +1 -1
  82. package/esm2022/lib/tokens/matterport-sdk-key.token.mjs +1 -1
  83. package/esm2022/lib/types.service.mjs +2 -1
  84. package/esm2022/lib/validators/email.directive.mjs +1 -1
  85. package/esm2022/lib/validators/no-empty.directive.mjs +1 -1
  86. package/esm2022/lib/validators/number.directive.mjs +1 -1
  87. package/esm2022/lib/validators/text.directive.mjs +1 -1
  88. package/esm2022/public-api.mjs +3 -1
  89. package/fesm2022/smarterplan-ngx-smarterplan-core.mjs +2759 -551
  90. package/fesm2022/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
  91. package/lib/helpers.service.d.ts +43 -0
  92. package/lib/services/matterport-tag-copy.service.d.ts +137 -17
  93. package/lib/services/models/domain.service.d.ts +8 -0
  94. package/lib/services/models/feature.service.d.ts +0 -6
  95. package/lib/services/models/mission.service.d.ts +5 -0
  96. package/lib/services/models/space.service.d.ts +15 -1
  97. package/lib/services/models/visit.service.d.ts +9 -1
  98. package/lib/services/s3.service.d.ts +8 -0
  99. package/lib/services/threejs-import.service.d.ts +31 -0
  100. package/lib/services/threejs.service.d.ts +423 -0
  101. package/lib/services/viewer.service.d.ts +114 -1
  102. package/lib/types.service.d.ts +7 -1
  103. package/package.json +1 -1
  104. package/public-api.d.ts +2 -0
  105. package/src/assets/vs-app.json +67 -67
@@ -591,4 +591,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
591
591
  providedIn: 'root',
592
592
  }]
593
593
  }], ctorParameters: () => [{ type: i1.MatterportNavigationService }] });
594
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC10YWcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvc2VydmljZXMvbWF0dGVycG9ydC10YWcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQWtELFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV6RyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7OztBQU0xQyxNQUFNLE9BQU8sb0JBQW9CO0lBZ0NyQjtJQS9CVixvRUFBb0U7SUFDNUQsTUFBTSxDQUFVLHFCQUFxQixHQUFHLHlCQUF5QixDQUFDO0lBRW5FLGVBQWUsR0FBK0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUN4RCxXQUFXLEdBQWlCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM5QyxpQkFBaUIsR0FBa0IsSUFBSSxDQUFDO0lBQ3hDLFNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO0lBQ2xDLFlBQVksR0FBa0IsRUFBRSxDQUFDO0lBQ2pDLGVBQWUsR0FBVyxFQUFFLENBQUM7SUFDN0IsY0FBYyxHQUFZLEtBQUssQ0FBQztJQUNoQyxVQUFVLEdBQTBCLElBQUksQ0FBQztJQUN4QyxrQkFBa0IsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNwRCxrQkFBa0IsR0FBeUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUM3RDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0ssY0FBYyxHQUFRLElBQUksQ0FBQztJQUMzQixxQkFBcUIsR0FBd0Is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Q0FBQyxDQUFDO29CQUVILDRCQUE0QjtvQkFDNUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsR0FBRzt3QkFDNUIsWUFBWTt3QkFDWixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssSUFBSSxPQUFPO3dCQUM5QixXQUFXLEVBQUUsY0FBYyxJQUFJLEVBQUU7d0JBQ2pDLFFBQVEsRUFBRSxPQUFPLENBQUMsWUFBWTt3QkFDOUIsU0FBUztxQkFDVixDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLGtEQUFrRCxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNFLENBQUM7SUFDSCxDQUFDO0lBRUQsK0RBQStEO0lBQy9ELEtBQUs7UUFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QiwyRUFBMkU7UUFDM0UsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztJQUNwQyxDQUFDO3dHQW5vQlUsb0JBQW9COzRHQUFwQixvQkFBb0IsY0FGbkIsTUFBTTs7NEZBRVAsb0JBQW9CO2tCQUhoQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzRGV2TW9kZSwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1hdHRlcnRhZ0RhdGEgfSBmcm9tICcuLi9tYXR0ZXJ0YWdEYXRhJztcclxuaW1wb3J0IHsgUG9pVHlwZSwgRGJPYmplY3RUeXBlLCBQT0ksIFZpZXdlckludGVyYWN0aW9ucywgVGFnQWN0aW9uLCBDYW1lcmFNb2RlIH0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hdHRlcnBvcnROYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4vbWF0dGVycG9ydC1uYXZpZ2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyB3YWl0IH0gZnJvbSAnLi4vaGVscGVycy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFzZVRhZ1NlcnZpY2UgfSBmcm9tICcuL3RhZy5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYXR0ZXJwb3J0VGFnU2VydmljZSB7XHJcbiAgLyoqIE5hbWUgb2YgdGhlIGNvbW1vbiBsYXllciBldmVyeSBTbWFydGVycGxhbiB0YWcgaXMgY3JlYXRlZCBpbi4gKi9cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTSEFSRURfVEFHX0xBWUVSX05BTUUgPSAnc21hcnRlcnBsYW4tc2hhcmVkLXRhZ3MnO1xyXG5cclxuICBwdWJsaWMgZGljdGlvbm5hcnlUYWdzOiBNYXA8c3RyaW5nLCBNYXR0ZXJ0YWdEYXRhPiA9IG5ldyBNYXAoKTtcclxuICBwdWJsaWMgdGFnQWRkUXVldWU6IFByb21pc2U8YW55PiA9IFByb21pc2UucmVzb2x2ZSgpO1xyXG4gIHB1YmxpYyBtYXR0ZXJ0YWdUb0ZvbGxvdzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgcHVibGljIG9uR29Ub1RhZyA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuICBwdWJsaWMgbWF0dGVydGFnSURzOiBBcnJheTxzdHJpbmc+ID0gW107XHJcbiAgcHVibGljIHRhZ3NBdHRhY2htZW50czogT2JqZWN0ID0ge307XHJcbiAgcHVibGljIHRhZ01lc3Nlbmdlck9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHRhZ1NlcnZpY2U6IEJhc2VUYWdTZXJ2aWNlIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSB0YWdzQ3VycmVudE9wYWNpdHk6IE1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKCk7XHJcbiAgcHJpdmF0ZSB0YWdzQ3VycmVudEVuYWJsZWQ6IE1hcDxzdHJpbmcsIGJvb2xlYW4+ID0gbmV3IE1hcCgpO1xyXG4gIC8qKlxyXG4gICAqIFNpbmdsZSBsYXllciBob2xkaW5nIGV2ZXJ5IFNtYXJ0ZXJwbGFuIHRhZywgYWRkZWQgdG8gZXZlcnkgdmlldyBvZiB0aGUgc3BhY2Ugc28gYVxyXG4gICAqIHRhZyBzdGF5cyBpbiBwbGFjZSDigJQgc2FtZSBzaWQsIHNhbWUgY29udGVudCDigJQgd2hlbiB0aGUgdXNlciBzd2l0Y2hlcyBiZXR3ZWVuIHRoZVxyXG4gICAqIGZ1cm5pc2hlZCBhbmQgdGhlIERlZnVybmlzaGVkIHZpZXcuIFRhZ3MgYWRkZWQgdG8gdGhlIGdsb2JhbCBzZGsuVGFnIChvciB0byBhXHJcbiAgICogdmlldydzIG93biBsYXllcikgYmVsb25nIHRvIHRoYXQgdmlldyBvbmx5LCB3aGljaCBpcyB3aGF0IG1hZGUgdGhlbSBwb3AgaW4gYW5kIG91dFxyXG4gICAqIG9uIGV2ZXJ5IHZpZXcgY2hhbmdlLlxyXG4gICAqXHJcbiAgICogRGVsaWJlcmF0ZWx5IE5PVCBjcmVhdGVkIHdpdGggYHsgY29tbW9uOiB0cnVlIH1gOiBpbiBTREsgMjYuNy41IGEgY29tbW9uIGxheWVyIGlzXHJcbiAgICogcHVzaGVkIGludG8gYGdldE9yZGVyZWRNb2RlbFZpZXdzKClgIGF0IGNyZWF0aW9uIHRpbWUsIGFuZCB0aGF0IGNhbGwgZGVmYXVsdHMgdG9cclxuICAgKiBgaW5jbHVkZURlZnVybmlzaDogZmFsc2VgLCBzbyB0aGUgRGVmdXJuaXNoZWQgdmlldyBuZXZlciByZWNlaXZlcyBpdCDigJQgd2hpbGVcclxuICAgKiBgVmlldy5hZGRMYXllcigpYCByZWZ1c2VzIHRvIHJlcGFpciBpdCAoXCJMYXllciBpcyBjb21tb24uIE5vIG5lZWQgdG8gYWRkLlwiKS4gQVxyXG4gICAqIHBsYWluIGxheWVyIHdlIGF0dGFjaCB0byBlYWNoIHZpZXcgb3Vyc2VsdmVzIHJlYWNoZXMgZXZlcnkgdmlldywgRGVmdXJuaXNoZWRcclxuICAgKiBpbmNsdWRlZC4gU2VlIGF0dGFjaFNoYXJlZFRhZ0xheWVyVG9WaWV3cygpLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2hhcmVkVGFnTGF5ZXI6IGFueSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzaGFyZWRUYWdMYXllclByb21pc2U6IFByb21pc2U8YW55PiB8IG51bGwgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgbmF2aWdhdGlvblNlcnZpY2U6IE1hdHRlcnBvcnROYXZpZ2F0aW9uU2VydmljZVxyXG4gICkgeyB9XHJcblxyXG4gIHNldFRhZ1NlcnZpY2Uoc2VydmljZTogQmFzZVRhZ1NlcnZpY2UpOiB2b2lkIHtcclxuICAgIHRoaXMudGFnU2VydmljZSA9IHNlcnZpY2U7XHJcbiAgfVxyXG5cclxuICAvKiogT3BlbnMgYSBzcGVjaWZpYyB0YWcgaW4gdGhlIE1hdHRlcnBvcnQgdmlld2VyIGJ5IGl0cyBJRC4gKi9cclxuICBhc3luYyBnb1RvVGFnKHNkazogYW55LCBzaWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICBpZiAoIXNkaykgcmV0dXJuO1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5vbkdvVG9UYWcubmV4dChzaWQpO1xyXG4gICAgICAvLyBgb3BlbmAgb25seSBleGlzdHMgb24gdGhlIGdsb2JhbCBUYWcgbW9kdWxlLCBuZXZlciBvbiBhIGxheWVyLXNjb3BlZCBvbmUuXHJcbiAgICAgIGF3YWl0IHNkay5UYWcub3BlbihzaWQpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignQ2Fubm90IG9wZW4gdGFnJywgc2lkLCBlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIFNESyBUYWcgbW9kdWxlIHRvIHVzZSBmb3IgYW4gb3BlcmF0aW9uIGFkZHJlc3NpbmcgYW4gZXhpc3RpbmcgdGFnIGJ5IElEXHJcbiAgICogKGljb24sIG9wYWNpdHksIHBvc2l0aW9uLCBhdHRhY2htZW50cywgcmVtb3ZhbC4uLik6IGFsd2F5cyB0aGUgZ2xvYmFsIHNkay5UYWcuXHJcbiAgICpcclxuICAgKiBBIGxheWVyLXNjb3BlZCBUYWcgbW9kdWxlIG9ubHkgZXhwb3NlcyB0aGUgKnJlcGxheWFibGUqIG11dGF0aW9ucywgbWVhbnQgdG8gYnVpbGRcclxuICAgKiB0aGUgbGF5ZXIncyBvd24gY29udGVudDsgYXBwbHlpbmcgdGhlbSB0byBhbiBhbHJlYWR5LWNyZWF0ZWQgdGFnIHNpbGVudGx5IGRvZXNcclxuICAgKiBub3RoaW5nIOKAlCB3aGljaCBpcyB3aGF0IGxlZnQgZXZlcnkgcGluIHdoaXRlIGluc3RlYWQgb2YgY2FycnlpbmcgaXRzIGljb24uIE9ubHlcclxuICAgKiBgYWRkYCBoYXMgdG8gZ28gdGhyb3VnaCB0aGUgbGF5ZXIsIHNlZSBnZXRUYWdDcmVhdGlvbk1vZHVsZSgpLlxyXG4gICAqL1xyXG4gIGdldFRhZ01vZHVsZShzZGs6IGFueSwgdGFnSWQ6IHN0cmluZyk6IGFueSB7XHJcbiAgICByZXR1cm4gc2RrPy5UYWc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBUYWcgbW9kdWxlIGV2ZXJ5IG5ldyB0YWcgbXVzdCBiZSBjcmVhdGVkIHRocm91Z2g6IHRoZSBzaGFyZWQgbGF5ZXJcclxuICAgKiB3aGVuIHRoZSBWaWV3IEFQSSBpcyBhdmFpbGFibGUsIHRoZSBnbG9iYWwgc2RrLlRhZyBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0VGFnQ3JlYXRpb25Nb2R1bGUoc2RrOiBhbnkpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgbGF5ZXIgPSBhd2FpdCB0aGlzLmVuc3VyZVNoYXJlZFRhZ0xheWVyKHNkayk7XHJcbiAgICByZXR1cm4gbGF5ZXI/LlRhZyB8fCBzZGs/LlRhZztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgKG9uY2UgcGVyIFNESyBzZXNzaW9uKSBhbmQgcmV0dXJucyB0aGUgc2hhcmVkIHRhZyBsYXllci5cclxuICAgKiBSZXNvbHZlcyB0byBudWxsIHdoZW4gdGhlIFZpZXcgQVBJIGlzIHVuYXZhaWxhYmxlLCBzbyBjYWxsZXJzIHRyYW5zcGFyZW50bHkgZmFsbFxyXG4gICAqIGJhY2sgdG8gdGhlIGdsb2JhbCBzZGsuVGFnLlxyXG4gICAqL1xyXG4gIGFzeW5jIGVuc3VyZVNoYXJlZFRhZ0xheWVyKHNkazogYW55KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGlmICh0aGlzLnNoYXJlZFRhZ0xheWVyKSByZXR1cm4gdGhpcy5zaGFyZWRUYWdMYXllcjtcclxuICAgIGlmICghc2RrPy5WaWV3Py5jcmVhdGVMYXllcikgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgaWYgKCF0aGlzLnNoYXJlZFRhZ0xheWVyUHJvbWlzZSkge1xyXG4gICAgICB0aGlzLnNoYXJlZFRhZ0xheWVyUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShcclxuICAgICAgICBzZGsuVmlldy5jcmVhdGVMYXllcihNYXR0ZXJwb3J0VGFnU2VydmljZS5TSEFSRURfVEFHX0xBWUVSX05BTUUpXHJcbiAgICAgIClcclxuICAgICAgICAudGhlbihhc3luYyAobGF5ZXI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zaGFyZWRUYWdMYXllciA9IGxheWVyO1xyXG4gICAgICAgICAgLy8gQSBmcmVzaGx5IGNyZWF0ZWQgbGF5ZXIgY2FuIGNvbWUgYmFjayB0b2dnbGVkIG9mZiwgd2hpY2ggaGlkZXMgaXRzIHRhZ3MuXHJcbiAgICAgICAgICBpZiAobGF5ZXIgJiYgbGF5ZXIudG9nZ2xlZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgYXdhaXQgbGF5ZXIudG9nZ2xlKHRydWUpLmNhdGNoKCgpID0+IHsgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gbGF5ZXI7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2goKGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgLy8gQWxsb3cgYSBsYXRlciByZXRyeSAoZS5nLiB0aGUgU0RLIHdhcyBub3QgZnVsbHkgcmVhZHkgeWV0KS5cclxuICAgICAgICAgIHRoaXMuc2hhcmVkVGFnTGF5ZXJQcm9taXNlID0gbnVsbDtcclxuICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIENvdWxkIG5vdCBjcmVhdGUgdGhlIHNoYXJlZCB0YWcgbGF5ZXInLCBlKTtcclxuICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnNoYXJlZFRhZ0xheWVyUHJvbWlzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ha2VzIHN1cmUgdGhlIHNoYXJlZCBsYXllciBpcyBwYXJ0IG9mIGV2ZXJ5IHZpZXcgb2YgdGhlIHNwYWNlLCBEZWZ1cm5pc2hlZFxyXG4gICAqIGluY2x1ZGVkLiBUaGlzIGlzIHdoYXQgYWN0dWFsbHkgc2hhcmVzIHRoZSB0YWdzIGFjcm9zcyB2aWV3cywgYW5kIHRoZSByZWFzb24gdGhlXHJcbiAgICogbGF5ZXIgbXVzdCBub3QgYmUgYSBjb21tb24gb25lOiB0aGUgU0RLIG9ubHkgcGVyZm9ybXMgdGhlIGF0dGFjaG1lbnQgZm9yXHJcbiAgICogbm9uLWNvbW1vbiBsYXllcnMuIElkZW1wb3RlbnQsIHNvIGl0IGNhbiBydW4gb24gZXZlcnkgdmlldyBjb2xsZWN0aW9uIHVwZGF0ZS5cclxuICAgKi9cclxuICBhc3luYyBhdHRhY2hTaGFyZWRUYWdMYXllclRvVmlld3Moc2RrOiBhbnksIHZpZXdzOiBJdGVyYWJsZTxhbnk+KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBsYXllciA9IGF3YWl0IHRoaXMuZW5zdXJlU2hhcmVkVGFnTGF5ZXIoc2RrKTtcclxuICAgIGlmICghbGF5ZXIpIHJldHVybjtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHZpZXcgb2Ygdmlld3MpIHtcclxuICAgICAgaWYgKCF2aWV3Py5hZGRMYXllciB8fCB2aWV3Lmhhc0xheWVyPy4obGF5ZXIpKSBjb250aW51ZTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhd2FpdCB2aWV3LmFkZExheWVyKGxheWVyKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIENhbm5vdCBhZGQgdGhlIHNoYXJlZCB0YWcgbGF5ZXIgdG8gdmlldycsIHZpZXc/LmlkLCBlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkcyBhIHRhZyB0aHJvdWdoIHRoZSBzaGFyZWQgbGF5ZXIgc28gaXQgZXhpc3RzIGluIGV2ZXJ5IHZpZXcuIEZhbGxzIGJhY2tcclxuICAgKiB0byB0aGUgZ2xvYmFsIHNkay5UYWcgd2hlbiB0aGUgVmlldyBBUEkgaXMgdW5hdmFpbGFibGU7IHRoYXQgY2FsbCBpcyByYWNlZCBhZ2FpbnN0XHJcbiAgICogYSB0aW1lb3V0IGFzIGEgc2FmZXR5IG5ldCwgc2luY2UgaXQgbmV2ZXIgcmVzb2x2ZXMgd2hpbGUgYSBEZWZ1cm5pc2hlZCB2aWV3IGlzXHJcbiAgICogYWN0aXZlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgYWRkVGFnVG9TZGsoc2RrOiBhbnksIGRlc2NyaXB0b3I6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcclxuICAgIGNvbnN0IHNoYXJlZFRhZ01vZHVsZSA9IGF3YWl0IHRoaXMuZ2V0VGFnQ3JlYXRpb25Nb2R1bGUoc2RrKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBzaWRMaXN0ID0gKGF3YWl0IFByb21pc2UucmFjZShbXHJcbiAgICAgICAgc2hhcmVkVGFnTW9kdWxlLmFkZChkZXNjcmlwdG9yKSxcclxuICAgICAgICBuZXcgUHJvbWlzZTxuZXZlcj4oKF8sIHJlamVjdCkgPT5cclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcignVGFnLmFkZCB0aW1lZCBvdXQnKSksIDQwMDApXHJcbiAgICAgICAgKSxcclxuICAgICAgXSkpIGFzIHN0cmluZ1tdO1xyXG4gICAgICBpZiAoc2lkTGlzdD8ubGVuZ3RoKSByZXR1cm4gc2lkTGlzdFswXTtcclxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgaWYgKGVycm9yPy5tZXNzYWdlPy5pbmNsdWRlcygnYWxyZWFkeSBpbiB1c2UnKSkgdGhyb3cgZXJyb3I7XHJcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIFRhZy5hZGQgZmFpbGVkL3RpbWVkIG91dCcsIGVycm9yPy5tZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKiBPcGVucyB0aGUgbW9zdCByZWNlbnRseSBjcmVhdGVkIHRhZyBpbiB0aGUgdmlld2VyLiAqL1xyXG4gIGFzeW5jIGdvVG9MYXN0VGFnKHNkazogYW55KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGlmICghc2RrIHx8IHRoaXMubWF0dGVydGFnSURzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgY29uc3QgbGFzdFNpZCA9IHRoaXMubWF0dGVydGFnSURzW3RoaXMubWF0dGVydGFnSURzLmxlbmd0aCAtIDFdO1xyXG4gICAgcmV0dXJuIHRoaXMuZ29Ub1RhZyhzZGssIGxhc3RTaWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkcyBhIE1hdHRlcnRhZyB0byB0aGUgdmlld2VyLCBzZXJpYWxpemluZyBjYWxscyB0byBwcmV2ZW50IFNESyByYWNlIGNvbmRpdGlvbnMuXHJcbiAgICogUmV1c2VzIGV4aXN0aW5nIElEcyBpZiB0aGUgdGFnIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgc2Vzc2lvbi5cclxuICAgKi9cclxuICBhc3luYyBhZGRNYXR0ZXJ0YWdUb1ZpZXdlcihzZGs6IGFueSwgbWF0dGVydGFnRGF0YTogTWF0dGVydGFnRGF0YSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xyXG4gICAgaWYgKCFzZGspIHJldHVybiBudWxsO1xyXG5cclxuICAgIHRoaXMudGFnQWRkUXVldWUgPSB0aGlzLnRhZ0FkZFF1ZXVlXHJcbiAgICAgIC50aGVuKGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gbWF0dGVydGFnRGF0YS5nZXRNYXR0ZXJ0YWdEZXNjcmlwdG9yKClbMF07XHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdJZCA9IGRlc2NyaXB0b3I/LmlkIHx8IG51bGw7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBzaWQgPSBhd2FpdCB0aGlzLmFkZFRhZ1RvU2RrKHNkaywgZGVzY3JpcHRvcik7XHJcbiAgICAgICAgICBpZiAoc2lkKSB7XHJcbiAgICAgICAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0TWF0dGVycG9ydFNpZChzaWQpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMubWF0dGVydGFnSURzLmluY2x1ZGVzKHNpZCkpIHtcclxuICAgICAgICAgICAgICB0aGlzLm1hdHRlcnRhZ0lEcy5wdXNoKHNpZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3Muc2V0KHNpZCwgbWF0dGVydGFnRGF0YSk7XHJcbiAgICAgICAgICAgIHJldHVybiBzaWQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignW01hdHRlcnBvcnRUYWdTZXJ2aWNlXSBUYWcuYWRkIHJldHVybmVkIG5vIHNpZCcsIGRlc2NyaXB0b3IpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgICAgIGlmIChlcnJvcj8ubWVzc2FnZT8uaW5jbHVkZXMoJ2FscmVhZHkgaW4gdXNlJykgJiYgZXhpc3RpbmdJZCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZGljdGlvbm5hcnlUYWdzLmhhcyhleGlzdGluZ0lkKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMubWF0dGVydGFnSURzLnB1c2goZXhpc3RpbmdJZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3Muc2V0KGV4aXN0aW5nSWQsIG1hdHRlcnRhZ0RhdGEpO1xyXG4gICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdJZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIGFkZE1hdHRlcnRhZ1RvVmlld2VyIGZhaWxlZCcsIGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIHRhZ0FkZFF1ZXVlIHJlamVjdGVkJywgZSk7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnRhZ0FkZFF1ZXVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGFkZCBhbmQgY29uZmlndXJlIGEgTWF0dGVydGFnIHdpdGggaWNvbiwgb3BhY2l0eSwgYW5kIEhUTUwgY29udGVudC5cclxuICAgKiBIYW5kbGVzIGV4aXN0aW5nIHRhZ3MgZ3JhY2VmdWxseSBhbmQgcXVldWVzIG9wZXJhdGlvbnMgdG8gYXZvaWQgU0RLIGNvbmZsaWN0cy5cclxuICAgKi9cclxuICBhc3luYyBfZG9BZGRNYXR0ZXJ0YWcoXHJcbiAgICBzZGs6IGFueSxcclxuICAgIG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEsXHJcbiAgICBzZXRUYWdJY29uQW5kT3BhY2l0eTogKHNpZDogc3RyaW5nLCBtdDogTWF0dGVydGFnRGF0YSkgPT4gUHJvbWlzZTx2b2lkPixcclxuICAgIGluamVjdEh0bWxJblRhZzogKHR5cGU6IFBvaVR5cGUsIG9iajogRGJPYmplY3RUeXBlLCBzaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxyXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gbWF0dGVydGFnRGF0YS5nZXRNYXR0ZXJ0YWdEZXNjcmlwdG9yKCk7XHJcbiAgICAvL2NvbnNvbGUubG9nKCdkZXNjcmlwdG9yJywgZGVzY3JpcHRvcik7XHJcbiAgICBjb25zdCBzaWQgPSBkZXNjcmlwdG9yWzBdWydpZCddO1xyXG5cclxuICAgIGlmIChzaWQgJiYgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuaGFzKHNpZCkpIHtcclxuICAgICAgYXdhaXQgc2V0VGFnSWNvbkFuZE9wYWNpdHkoc2lkLCBtYXR0ZXJ0YWdEYXRhKTtcclxuICAgICAgYXdhaXQgaW5qZWN0SHRtbEluVGFnKG1hdHRlcnRhZ0RhdGEuZ2V0VHlwZSgpLCBtYXR0ZXJ0YWdEYXRhLmdldE9iamVjdCgpLCBzaWQpO1xyXG4gICAgICByZXR1cm4gc2lkO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGFnQWRkUXVldWUgPSB0aGlzLnRhZ0FkZFF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHRhZ01vZHVsZSA9IGF3YWl0IHRoaXMuZ2V0VGFnQ3JlYXRpb25Nb2R1bGUoc2RrKTtcclxuICAgICAgICBjb25zdCBbY3JlYXRlZFNpZF0gPSBhd2FpdCB0YWdNb2R1bGUuYWRkKC4uLmRlc2NyaXB0b3IpO1xyXG5cclxuICAgICAgICB0aGlzLm1hdHRlcnRhZ0lEcy5wdXNoKGNyZWF0ZWRTaWQpO1xyXG4gICAgICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLnNldChjcmVhdGVkU2lkLCBtYXR0ZXJ0YWdEYXRhKTtcclxuXHJcbiAgICAgICAgYXdhaXQgd2FpdCgxMDApO1xyXG4gICAgICAgIGF3YWl0IHNldFRhZ0ljb25BbmRPcGFjaXR5KGNyZWF0ZWRTaWQsIG1hdHRlcnRhZ0RhdGEpO1xyXG5cclxuICAgICAgICBpbmplY3RIdG1sSW5UYWcobWF0dGVydGFnRGF0YS5nZXRUeXBlKCksIG1hdHRlcnRhZ0RhdGEuZ2V0T2JqZWN0KCksIGNyZWF0ZWRTaWQpLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignSFRNTCBpbmplY3Rpb24gZmFpbGVkIGZvcicsIGNyZWF0ZWRTaWQsIGVycik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBjcmVhdGVkU2lkO1xyXG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICBpZiAoZT8ubWVzc2FnZT8uaW5jbHVkZXMoJ2FscmVhZHkgaW4gdXNlJykgJiYgc2lkKSB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuZGljdGlvbm5hcnlUYWdzLmhhcyhzaWQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF0dGVydGFnSURzLnB1c2goc2lkKTtcclxuICAgICAgICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3Muc2V0KHNpZCwgbWF0dGVydGFnRGF0YSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhd2FpdCBzZXRUYWdJY29uQW5kT3BhY2l0eShzaWQsIG1hdHRlcnRhZ0RhdGEpO1xyXG4gICAgICAgICAgYXdhaXQgaW5qZWN0SHRtbEluVGFnKG1hdHRlcnRhZ0RhdGEuZ2V0VHlwZSgpLCBtYXR0ZXJ0YWdEYXRhLmdldE9iamVjdCgpLCBzaWQpO1xyXG4gICAgICAgICAgcmV0dXJuIHNpZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMudGFnQWRkUXVldWU7XHJcbiAgfVxyXG5cclxuICBnZXREaXN0YW5jZShwMTogYW55LCBwMjogYW55KTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3cocDIueCAtIHAxLngsIDIpICsgTWF0aC5wb3cocDIueSAtIHAxLnksIDIpICsgTWF0aC5wb3cocDIueiAtIHAxLnosIDIpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrcyBpZiBhIHRhZyBpcyB3aXRoaW4gdGhlIGJvdW5kaW5nIGJveCBvZiBhbnkgYWN0aXZlIHJvb20gKGFkZGluZyBhIHNsaWdodCBtYXJnaW4gdG8gYWNjb3VudCBmb3Igd2FsbC1tb3VudGVkIHRhZ3MpLlxyXG4gICAqIElmIHRoZXJlIGFyZSBubyBhY3RpdmUgcm9vbXMgKGUuZy4sIGhhbGx3YXkpLCBmYWxscyBiYWNrIHRvIHJldHVybmluZyB0cnVlLlxyXG4gICAqL1xyXG4gIGlzVGFnSW5Sb29tcyhtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhLCByb29tczogYW55W10pOiBib29sZWFuIHtcclxuICAgIGlmICghcm9vbXMgfHwgcm9vbXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgdGFnUG9zID0gbWF0dGVydGFnRGF0YS5nZXRQb3NpdGlvbigpO1xyXG4gICAgY29uc3QgbWFyZ2luID0gMS41O1xyXG5cclxuICAgIHJldHVybiByb29tcy5zb21lKChyb29tKSA9PiB7XHJcbiAgICAgIGlmICghcm9vbS5ib3VuZHMpIHJldHVybiBmYWxzZTtcclxuICAgICAgY29uc3QgeyBtaW4sIG1heCB9ID0gcm9vbS5ib3VuZHM7XHJcblxyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIHRhZ1Bvcy54ID49IG1pbi54IC0gbWFyZ2luICYmIHRhZ1Bvcy54IDw9IG1heC54ICsgbWFyZ2luICYmXHJcbiAgICAgICAgdGFnUG9zLnkgPj0gbWluLnkgLSBtYXJnaW4gJiYgdGFnUG9zLnkgPD0gbWF4LnkgKyBtYXJnaW4gJiZcclxuICAgICAgICB0YWdQb3MueiA+PSBtaW4ueiAtIG1hcmdpbiAmJiB0YWdQb3MueiA8PSBtYXgueiArIG1hcmdpblxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogUmV0dXJucyB0aGUgSUQgb2YgdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQgdGFnLiAqL1xyXG4gIGdldExhc3RUYWcoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBpZiAodGhpcy5tYXR0ZXJ0YWdJRHMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB0aGlzLm1hdHRlcnRhZ0lEc1t0aGlzLm1hdHRlcnRhZ0lEcy5sZW5ndGggLSAxXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgdGhlIHZpc2liaWxpdHkgKG9wYWNpdHkpIG9mIGFsbCB0YWdzIGJhc2VkIG9uIHRoZSBjdXJyZW50IGNhbWVyYSBtb2RlLFxyXG4gICAqIGZsb29yIGFuZCByb29tIGNvbnRleHQuIE11c3QgYmUgY2FsbGVkIGFmdGVyIGVhY2ggc3dlZXAsIGZsb29yIG9yIG1vZGUgY2hhbmdlLlxyXG4gICAqXHJcbiAgICogUnVsZXM6XHJcbiAgICogIC0gRE9MTEhPVVNFIC8gRkxPT1JQTEFOIOKGkiBhbGwgdGFncyBoaWRkZW4gKG9wYWNpdHkgMCkuXHJcbiAgICogIC0gSU5TSURFIOKGkiBvbmx5IHRhZ3Mgd2hvc2Ugc3dlZXAgYmVsb25ncyB0byB0aGUgY3VycmVudCBmbG9vciBhcmUgc2hvd247XHJcbiAgICogICAgcHJveGltaXR5LWJhc2VkIG9wYWNpdHkgaXMgYXBwbGllZCB2aWEgY29tcHV0ZVRhZ09wYWNpdHkoKS5cclxuICAgKiAgICBUYWdzIG9uIG90aGVyIGZsb29ycyBhcmUgaGlkZGVuIChvcGFjaXR5IDApLlxyXG4gICAqICAtIFRSQU5TSVRJT05JTkcg4oaSIG5vIGNoYW5nZSAoc2tpcCB1cGRhdGUgdG8gYXZvaWQgZmxpY2tlcmluZykuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gc2RrICAgICAgICAgIE1hdHRlcnBvcnQgU0RLIGluc3RhbmNlLlxyXG4gICAqIEBwYXJhbSBwb3NlQ2FtZXJhICAgQ3VycmVudCBjYW1lcmEgcG9zZS5cclxuICAgKiBAcGFyYW0gc3dlZXBDb2xsZWN0aW9uICBGdWxsIGNvbGxlY3Rpb24gb2Ygc3dlZXBzLlxyXG4gICAqIEBwYXJhbSBjdXJyZW50Q2FtZXJhTW9kZSAgQ3VycmVudCBjYW1lcmEgbW9kZS5cclxuICAgKiBAcGFyYW0gbWF0dGVydGFnVG9Gb2xsb3cgIElEIG9mIHRoZSBjdXJzb3IgdGFnIChuZXZlciB0b3VjaGVkKS5cclxuICAgKi9cclxuICBhc3luYyB1cGRhdGVUYWdzVmlzaWJpbGl0eUZvckNvbnRleHQoXHJcbiAgICBzZGs6IGFueSxcclxuICAgIHN3ZWVwQ29sbGVjdGlvbjogYW55LFxyXG4gICAgY3VycmVudENhbWVyYU1vZGU6IENhbWVyYU1vZGUsXHJcbiAgICBtYXR0ZXJ0YWdUb0ZvbGxvdzogc3RyaW5nIHwgbnVsbCxcclxuICAgIGN1cnJlbnRGbG9vclNlcXVlbmNlOiBudW1iZXIgfCBudWxsID0gbnVsbCxcclxuICAgIGN1cnJlbnRSb29tczogYW55W10gPSBbXVxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCFzZGsgfHwgdGhpcy5kaWN0aW9ubmFyeVRhZ3Muc2l6ZSA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGlzSW50ZXJpb3JNb2RlID0gY3VycmVudENhbWVyYU1vZGUgPT09IENhbWVyYU1vZGUuSU5TSURFO1xyXG4gICAgY29uc3QgY3VycmVudEZsb29ySWQgPSBjdXJyZW50Rmxvb3JTZXF1ZW5jZSAhPT0gbnVsbCA/IGN1cnJlbnRGbG9vclNlcXVlbmNlLnRvU3RyaW5nKCkgOiBudWxsO1xyXG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IFt0YWdJZCwgbWF0dGVydGFnRGF0YV0gb2YgdGhpcy5kaWN0aW9ubmFyeVRhZ3MpIHtcclxuICAgICAgaWYgKHRhZ0lkID09PSBtYXR0ZXJ0YWdUb0ZvbGxvdykgY29udGludWU7XHJcblxyXG4gICAgICBjb25zdCB0YWdGbG9vcklkID0gdGhpcy5nZXRGbG9vcklkRm9yVGFnKG1hdHRlcnRhZ0RhdGEsIHN3ZWVwQ29sbGVjdGlvbik7XHJcbiAgICAgIGNvbnN0IGlzT25DdXJyZW50Rmxvb3IgPSAhdGFnRmxvb3JJZCB8fCAhY3VycmVudEZsb29ySWQgfHwgdGFnRmxvb3JJZCA9PT0gY3VycmVudEZsb29ySWQ7XHJcblxyXG4gICAgICBsZXQgdGFyZ2V0T3BhY2l0eSA9IDA7XHJcbiAgICAgIGxldCBzaG91bGRCZUVuYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgIC8vIENhbGN1bGF0aW9uIG9mIG9wYWNpdHkgYW5kIGVuYWJsZSBzdGF0dXNcclxuICAgICAgaWYgKGlzT25DdXJyZW50Rmxvb3IpIHtcclxuICAgICAgICBpZiAoIWlzSW50ZXJpb3JNb2RlKSB7XHJcbiAgICAgICAgICB0YXJnZXRPcGFjaXR5ID0gMTtcclxuICAgICAgICAgIHNob3VsZEJlRW5hYmxlZCA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRhcmdldE9wYWNpdHkgPSAwLjk7XHJcbiAgICAgICAgICBzaG91bGRCZUVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBBcHBseSBjaGFuZ2VzXHJcblxyXG4gICAgICAvLyBUb29sdGlwIGFuZCBjbGljayBtYW5hZ2VtZW50XHJcbiAgICAgIGNvbnN0IHRhZ01vZHVsZSA9IHRoaXMuZ2V0VGFnTW9kdWxlKHNkaywgdGFnSWQpO1xyXG4gICAgICBjb25zdCBsYXN0RW5hYmxlZCA9IHRoaXMudGFnc0N1cnJlbnRFbmFibGVkLmdldCh0YWdJZCk7XHJcbiAgICAgIGlmIChsYXN0RW5hYmxlZCAhPT0gc2hvdWxkQmVFbmFibGVkKSB7XHJcbiAgICAgICAgdGhpcy50YWdzQ3VycmVudEVuYWJsZWQuc2V0KHRhZ0lkLCBzaG91bGRCZUVuYWJsZWQpO1xyXG4gICAgICAgIHByb21pc2VzLnB1c2godGFnTW9kdWxlLmFsbG93QWN0aW9uKHRhZ0lkLCB7XHJcbiAgICAgICAgICBvcGVuaW5nOiBzaG91bGRCZUVuYWJsZWQsXHJcbiAgICAgICAgICBuYXZpZ2F0aW5nOiBzaG91bGRCZUVuYWJsZWQsXHJcbiAgICAgICAgICBkb2NraW5nOiBmYWxzZVxyXG4gICAgICAgIH0pLmNhdGNoKCgpID0+IHsgfSkpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIE9wYWNpdHkgbWFuYWdlbWVudFxyXG4gICAgICBjb25zdCBsYXN0T3BhY2l0eSA9IHRoaXMudGFnc0N1cnJlbnRPcGFjaXR5LmdldCh0YWdJZCkgPz8gLTE7XHJcbiAgICAgIGlmIChNYXRoLmFicyhsYXN0T3BhY2l0eSAtIHRhcmdldE9wYWNpdHkpID4gMC4wNSkge1xyXG4gICAgICAgIHRoaXMudGFnc0N1cnJlbnRPcGFjaXR5LnNldCh0YWdJZCwgdGFyZ2V0T3BhY2l0eSk7XHJcbiAgICAgICAgcHJvbWlzZXMucHVzaCh0YWdNb2R1bGUuZWRpdE9wYWNpdHkodGFnSWQsIHRhcmdldE9wYWNpdHkpLmNhdGNoKCgpID0+IHsgfSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRHJvcHMgdGhlIG1lbW9pemVkIG9wYWNpdHkvZW5hYmxlZCBzdGF0ZSBzbyB0aGUgbmV4dCB2aXNpYmlsaXR5IHBhc3MgcmUtYXBwbGllcyBpdFxyXG4gICAqIHRvIGV2ZXJ5IHRhZy4gTmVlZGVkIGFmdGVyIGEgdmlldyBzd2l0Y2ggKGZ1cm5pc2hlZCA8LT4gZGVmdXJuaXNoZWQpOiB0aGUgU0RLXHJcbiAgICogcmUtcmVuZGVycyB0aGUgc2hhcmVkIGxheWVyJ3MgdGFncyBhbmQgdGhlIGNhY2hlZCB2YWx1ZXMgd291bGQgb3RoZXJ3aXNlIG1ha2VcclxuICAgKiB1cGRhdGVUYWdzVmlzaWJpbGl0eUZvckNvbnRleHQoKSBza2lwIHRoZW0sIGxlYXZpbmcgdGFncyBzdHVjayBpbnZpc2libGUuXHJcbiAgICovXHJcbiAgcmVzZXRWaXNpYmlsaXR5Q2FjaGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLnRhZ3NDdXJyZW50T3BhY2l0eS5jbGVhcigpO1xyXG4gICAgdGhpcy50YWdzQ3VycmVudEVuYWJsZWQuY2xlYXIoKTtcclxuICB9XHJcblxyXG4gIC8qKiBSZW1vdmVzIGEgc3BlY2lmaWMgdGFnIGZyb20gdGhlIHZpZXdlciBhbmQgbG9jYWwgZGljdGlvbmFyaWVzLiAqL1xyXG4gIGFzeW5jIGRlbGV0ZU1hdHRlcnRhZ0Zyb21JZChzZGs6IGFueSwgbWF0dGVydGFnSUQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHNkaykgYXdhaXQgdGhpcy5nZXRUYWdNb2R1bGUoc2RrLCBtYXR0ZXJ0YWdJRCkucmVtb3ZlKG1hdHRlcnRhZ0lEKTtcclxuICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZGVsZXRlKG1hdHRlcnRhZ0lEKTtcclxuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm1hdHRlcnRhZ0lEcy5pbmRleE9mKG1hdHRlcnRhZ0lEKTtcclxuICAgICAgaWYgKGluZGV4ID4gLTEpIHRoaXMubWF0dGVydGFnSURzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0Nhbm5vdCBkZWxldGUgdGFnJywgbWF0dGVydGFnSUQsIGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFJlbW92ZXMgdGhlIGxhc3QgYWRkZWQgdGFnIGZyb20gdGhlIHZpZXdlci4gKi9cclxuICBhc3luYyBkZWxldGVMYXN0TWF0dGVydGFnKHNkazogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBsYXN0U2lkID0gdGhpcy5nZXRMYXN0VGFnKCk7XHJcbiAgICBpZiAobGFzdFNpZCkgYXdhaXQgdGhpcy5kZWxldGVNYXR0ZXJ0YWdGcm9tSWQoc2RrLCBsYXN0U2lkKTtcclxuICB9XHJcblxyXG4gIC8qKiBDbGVhcnMgYWxsIHRhZ3MgZnJvbSB0aGUgdmlld2VyIGFuZCByZXNldHMgbG9jYWwgc3RhdGUuICovXHJcbiAgYXN5bmMgYWN0aW9uX2RlbGV0ZV9hbGxfbWF0dGVydGFncyhzZGs6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHNkaykge1xyXG4gICAgICBjb25zdCBzaWRzVG9SZW1vdmUgPSBbLi4udGhpcy5tYXR0ZXJ0YWdJRHNdO1xyXG4gICAgICBmb3IgKGNvbnN0IHNpZCBvZiBzaWRzVG9SZW1vdmUpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5nZXRUYWdNb2R1bGUoc2RrLCBzaWQpLnJlbW92ZShzaWQpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzIGFuZCBjb25maWd1cmVzIGEgTWF0dGVydGFnIGZyb20gYSBQT0ksIGhhbmRsaW5nIGNvb3JkaW5hdGVzLCBub3JtYWxzLCBhbmQgc3dlZXAgSUQuXHJcbiAgICogU2tpcHMgY3JlYXRpb24gaWYgYSB0YWcgZm9yIHRoZSBvYmplY3QgYWxyZWFkeSBleGlzdHMuXHJcbiAgICovXHJcbiAgYXN5bmMgY3JlYXRlTWF0dGVydGFnRnJvbVBPSShcclxuICAgIHNkazogYW55LFxyXG4gICAgdGFnVHlwZTogUG9pVHlwZSxcclxuICAgIG9iamVjdDogRGJPYmplY3RUeXBlLFxyXG4gICAgcG9pOiBQT0ksXHJcbiAgICBnZXRUYWdGcm9tRWxlbWVudElkOiAoaWQ6IHN0cmluZykgPT4geyB0YWc6IHN0cmluZzsgc3dlZXA6IHN0cmluZyB9LFxyXG4gICAgc2V0VGFnSWNvbkFuZE9wYWNpdHk6IChzaWQ6IHN0cmluZywgbXQ6IE1hdHRlcnRhZ0RhdGEpID0+IFByb21pc2U8dm9pZD4sXHJcbiAgICBpbmplY3RIdG1sSW5UYWc6ICh0eXBlOiBQb2lUeXBlLCBvYmo6IERiT2JqZWN0VHlwZSwgc2lkOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cclxuICApOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgeyB0YWcgfSA9IGdldFRhZ0Zyb21FbGVtZW50SWQob2JqZWN0LmlkKTtcclxuICAgIGlmICh0YWcpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhID0gbmV3IE1hdHRlcnRhZ0RhdGEodGFnVHlwZSk7XHJcbiAgICBtYXR0ZXJ0YWdEYXRhLnNldE9iamVjdChvYmplY3QsIHRhZ1R5cGUpO1xyXG5cclxuICAgIGlmIChwb2kuY29vcmRpbmF0ZSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0UG9zaXRpb24oSlNPTi5wYXJzZShwb2kuY29vcmRpbmF0ZSkpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0Vycm9yIHBhcnNpbmcgUE9JIGNvb3JkaW5hdGVzJywgcG9pLmNvb3JkaW5hdGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHBvaS5tZXRhZGF0YSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHRhZ01ldGFkYXRhID0gSlNPTi5wYXJzZShwb2kubWV0YWRhdGEpO1xyXG4gICAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0Tm9ybWFsKHRhZ01ldGFkYXRhLm5vcm1hbCB8fCB7IHg6IDAsIHk6IC0wLjE1LCB6OiAwIH0pO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgbWF0dGVydGFnRGF0YS5zZXROb3JtYWwoeyB4OiAwLCB5OiAtMC4xNSwgejogMCB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChwb2kubWF0dGVycG9ydFN3ZWVwSUQpIHtcclxuICAgICAgbWF0dGVydGFnRGF0YS5zZXRTd2VlcElEKHBvaS5tYXR0ZXJwb3J0U3dlZXBJRCk7XHJcbiAgICB9XHJcbiAgICBtYXR0ZXJ0YWdEYXRhLnNldFBvaShwb2kpO1xyXG5cclxuICAgIGNvbnN0IGNyZWF0ZWRUYWdJRCA9IGF3YWl0IHRoaXMuYWRkTWF0dGVydGFnVG9WaWV3ZXIoc2RrLCBtYXR0ZXJ0YWdEYXRhKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tJyk7XHJcbiAgICBjb25zb2xlLmxvZygnZWxlbWVudCBpZCAnICsgbWF0dGVydGFnRGF0YS5lbGVtZW50SUQpO1xyXG4gICAgY29uc29sZS5sb2coJ3Bvc2l0aW9uOiAnLCBtYXR0ZXJ0YWdEYXRhLmdldFBvc2l0aW9uKCkpO1xyXG4gICAgY29uc29sZS5sb2coJ3JvdGF0aW9uOiAnLCBtYXR0ZXJ0YWdEYXRhLmdldFJvdGF0aW9uKCkpO1xyXG4gICAgY29uc29sZS5sb2coJ3N3ZWVwIGlkOiAnLCBtYXR0ZXJ0YWdEYXRhLmdldFN3ZWVwSUQoKSk7XHJcbiAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tJyk7XHJcblxyXG5cclxuICAgIGlmIChjcmVhdGVkVGFnSUQgJiYgc2RrKSB7XHJcbiAgICAgIGF3YWl0IHdhaXQoMTAwKTtcclxuICAgICAgYXdhaXQgc2V0VGFnSWNvbkFuZE9wYWNpdHkoY3JlYXRlZFRhZ0lELCBtYXR0ZXJ0YWdEYXRhKTtcclxuICAgICAgaW5qZWN0SHRtbEluVGFnKHRhZ1R5cGUsIG9iamVjdCwgY3JlYXRlZFRhZ0lEKS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdIVE1MIGluamVjdGlvbiBmYWlsZWQgZm9yJywgY3JlYXRlZFRhZ0lELCBlcnIpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY3JlYXRlZFRhZ0lEO1xyXG4gIH1cclxuXHJcbiAgLyoqIFVwZGF0ZXMgdGhlIGljb24sIG9wYWNpdHksIGFuZCBIVE1MIGNvbnRlbnQgb2YgYW4gZXhpc3RpbmcgdGFnLiAqL1xyXG4gIGFzeW5jIHVwZGF0ZU1hdHRlclRhZ0NvbnRlbnRGb3JUYWdJRChcclxuICAgIHNkazogYW55LFxyXG4gICAgbWF0dGVydGFnSUQ6IHN0cmluZyxcclxuICAgIG9iamVjdDogRGJPYmplY3RUeXBlLFxyXG4gICAgcG9pVHlwZTogUG9pVHlwZSxcclxuICAgIHNldFRhZ0ljb25BbmRPcGFjaXR5OiAoc2lkOiBzdHJpbmcsIG10OiBNYXR0ZXJ0YWdEYXRhKSA9PiBQcm9taXNlPHZvaWQ+LFxyXG4gICAgaW5qZWN0SHRtbEluVGFnOiAodHlwZTogUG9pVHlwZSwgb2JqOiBEYk9iamVjdFR5cGUsIHNpZDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XHJcbiAgKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGEgPSB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQobWF0dGVydGFnSUQpO1xyXG4gICAgaWYgKCFtYXR0ZXJ0YWdEYXRhKSByZXR1cm47XHJcblxyXG4gICAgaWYgKG9iamVjdCkge1xyXG4gICAgICBtYXR0ZXJ0YWdEYXRhLnNldE9iamVjdChvYmplY3QsIHBvaVR5cGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IHNldFRhZ0ljb25BbmRPcGFjaXR5KG1hdHRlcnRhZ0lELCBtYXR0ZXJ0YWdEYXRhKTtcclxuICAgIGF3YWl0IGluamVjdEh0bWxJblRhZyhwb2lUeXBlLCBvYmplY3QsIG1hdHRlcnRhZ0lEKTtcclxuICB9XHJcblxyXG4gIC8qKiBSZWdpc3RlcnMgYSBjdXN0b20gdGV4dHVyZSBhbmQgYXBwbGllcyBpdCB0byBhIHRhZywgb3B0aW9uYWxseSBhZGp1c3Rpbmcgb3BhY2l0eS4gKi9cclxuICBhc3luYyBhZGROZXdJY29uQW5kU2V0Rm9yVGFnKFxyXG4gICAgc2RrOiBhbnksXHJcbiAgICBtYXR0ZXJ0YWdJRDogc3RyaW5nLFxyXG4gICAgaWNvblBhdGg6IHN0cmluZyxcclxuICAgIGFwcGx5T3BhY2l0eTogYm9vbGVhbixcclxuICAgIG9wYWNpdHk6IG51bWJlclxyXG4gICkge1xyXG4gICAgaWYgKCFzZGspIHJldHVybjtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGljb25OYW1lID0gYGN1c3RvbS1pY29uLSR7bWF0dGVydGFnSUR9YDtcclxuICAgICAgY29uc3QgdGFnTW9kdWxlID0gdGhpcy5nZXRUYWdNb2R1bGUoc2RrLCBtYXR0ZXJ0YWdJRCk7XHJcbiAgICAgIGF3YWl0IHNkay5Bc3NldC5yZWdpc3RlclRleHR1cmUoaWNvbk5hbWUsIGljb25QYXRoKTtcclxuICAgICAgYXdhaXQgdGFnTW9kdWxlLmVkaXRJY29uKG1hdHRlcnRhZ0lELCBpY29uTmFtZSk7XHJcblxyXG4gICAgICBpZiAoYXBwbHlPcGFjaXR5KSB7XHJcbiAgICAgICAgYXdhaXQgdGFnTW9kdWxlLmVkaXRPcGFjaXR5KG1hdHRlcnRhZ0lELCBvcGFjaXR5KTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0Vycm9yIHNldHRpbmcgY3VzdG9tIGljb24gb3Igb3BhY2l0eScsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBGaW5kcyB0aGUgdGFnIElEIGFuZCBzd2VlcCBJRCBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBlbGVtZW50IElELiAqL1xyXG4gIGdldFRhZ0Zyb21FbGVtZW50SWQoZWxlbWVudElEOiBzdHJpbmcsIHN3ZWVwczogc3RyaW5nW10gfCBudWxsKTogeyB0YWc6IHN0cmluZyB8IG51bGw7IHN3ZWVwOiBzdHJpbmcgfCBudWxsIH0ge1xyXG4gICAgbGV0IHRhZ0lEID0gbnVsbDtcclxuICAgIGxldCBzd2VlcElEID0gbnVsbDtcclxuICAgIGZvciAobGV0IFttYXR0ZXJ0YWdJRCwgbWF0dGVydGFnRGF0YV0gb2YgdGhpcy5kaWN0aW9ubmFyeVRhZ3MpIHtcclxuICAgICAgaWYgKG1hdHRlcnRhZ0RhdGEuZWxlbWVudElEID09PSBlbGVtZW50SUQpIHtcclxuICAgICAgICB0YWdJRCA9IG1hdHRlcnRhZ0lEO1xyXG4gICAgICAgIGNvbnN0IHN3ZWVwID0gbWF0dGVydGFnRGF0YS5nZXRTd2VlcElEKCk7XHJcbiAgICAgICAgaWYgKHN3ZWVwICYmIHN3ZWVwcykge1xyXG4gICAgICAgICAgLy8gc3dlZXAgaXMgYSB1dWlkOyBzd2VlcHMgYXJyYXkgY29udGFpbnMgc2lkcyDigJMgY2hlY2sgYm90aCBmb3JtYXRzXHJcbiAgICAgICAgICBjb25zdCByZXNvbHZlZFNpZCA9IHRoaXMubmF2aWdhdGlvblNlcnZpY2UucmVzb2x2ZVN3ZWVwU2lkKHN3ZWVwKTtcclxuICAgICAgICAgIGlmIChzd2VlcHMuaW5jbHVkZXMoc3dlZXApIHx8IHN3ZWVwcy5pbmNsdWRlcyhyZXNvbHZlZFNpZCkpIHtcclxuICAgICAgICAgICAgc3dlZXBJRCA9IHN3ZWVwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgdGFnOiB0YWdJRCwgc3dlZXA6IHN3ZWVwSUQgfTtcclxuICB9XHJcblxyXG4gIC8qKiBSZXRyaWV2ZXMgdGhlIGZsb29yIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIGEgdGFnIGJhc2VkIG9uIGl0cyBzd2VlcCBkYXRhLlxyXG4gICAqICBIYW5kbGVzIGJvdGggdGhlIG9iamVjdCBmb3JtICh7IGZsb29ySW5mbzogeyBpZCwgc2VxdWVuY2UgfSwgZmxvb3I6IHsgaWQgfSB9KVxyXG4gICAqICBhbmQgdGhlIHByaW1pdGl2ZSBmb3JtIChmbG9vcjogbnVtYmVyKSB1c2VkIGJ5IE1hdHRlcnBvcnQgU0RLIHYzLlxyXG4gICAqL1xyXG4gIGdldEZsb29ySWRGb3JUYWcobWF0dGVydGFnRGF0YTogTWF0dGVydGFnRGF0YSwgc3dlZXBDb2xsZWN0aW9uOiBhbnkpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGNvbnN0IHN3ZWVwSWQgPSBtYXR0ZXJ0YWdEYXRhLmdldFN3ZWVwSUQoKTtcclxuICAgIGlmICghc3dlZXBJZCB8fCAhc3dlZXBDb2xsZWN0aW9uKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBjb25zdCBzd2VlcERhdGEgPSBzd2VlcENvbGxlY3Rpb25bc3dlZXBJZF07XHJcbiAgICBpZiAoIXN3ZWVwRGF0YSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgLy8gU0RLIHYzOiBzd2VlcC5mbG9vciBpcyBhIHByaW1pdGl2ZSBudW1iZXIgKHRoZSBzZXF1ZW5jZSBpbmRleClcclxuICAgIGlmICh0eXBlb2Ygc3dlZXBEYXRhLmZsb29yID09PSAnbnVtYmVyJykge1xyXG4gICAgICByZXR1cm4gc3dlZXBEYXRhLmZsb29yLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gT2xkZXIgLyBleHRlbmRlZCBmb3JtYXRzXHJcbiAgICByZXR1cm4gc3dlZXBEYXRhPy5mbG9vckluZm8/LmlkXHJcbiAgICAgID8/IHN3ZWVwRGF0YT8uZmxvb3JJbmZvPy5zZXF1ZW5jZT8udG9TdHJpbmcoKVxyXG4gICAgICA/PyBzd2VlcERhdGE/LmZsb29ySWRcclxuICAgICAgPz8gc3dlZXBEYXRhPy5mbG9vcj8uaWRcclxuICAgICAgPz8gc3dlZXBEYXRhPy5mbG9vcj8uc2VxdWVuY2U/LnRvU3RyaW5nKClcclxuICAgICAgPz8gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluamVjdHMgY3VzdG9tIEhUTUwgb3IgZmFsbGJhY2sgYmlsbGJvYXJkIG1lZGlhIGludG8gYSBNYXR0ZXJ0YWcgc2FuZGJveC5cclxuICAgKiBBdHRhY2hlcyBldmVudCBsaXN0ZW5lcnMgZm9yIGludGVyYWN0aXZlIGVsZW1lbnRzIHdpdGhpbiB0aGUgdGFnLlxyXG4gICAqL1xyXG4gIGFzeW5jIGluamVjdEh0bWxJblRhZyhzZGs6IGFueSwgdGFnVHlwZTogUG9pVHlwZSwgb2JqZWN0OiBEYk9iamVjdFR5cGUsIHRhZ0lEOiBzdHJpbmcpIHtcclxuICAgIGlmICghdGhpcy50YWdTZXJ2aWNlKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tNYXR0ZXJwb3J0VGFnU2VydmljZV0gdGFnU2VydmljZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCBodG1sID0gYXdhaXQgdGhpcy50YWdTZXJ2aWNlLmdldEh0bWxUb0luamVjdCh0YWdUeXBlLCBvYmplY3QpO1xyXG5cclxuICAgICAgaWYgKGh0bWwgJiYgaHRtbC50cmltKCkubGVuZ3RoID4gMCAmJiBzZGspIHtcclxuICAgICAgICBjb25zdCBzY3JpcHRUYWcgPSB0aGlzLnRhZ1NlcnZpY2UuZ2V0U2NyaXB0Rm9yVGFnKG9iamVjdCwgdGFnVHlwZSk7XHJcbiAgICAgICAgaHRtbCArPSBgJHtzY3JpcHRUYWd9YDtcclxuXHJcbiAgICAgICAgY29uc3QgdGFnTW9kdWxlID0gdGhpcy5nZXRUYWdNb2R1bGUoc2RrLCB0YWdJRCk7XHJcbiAgICAgICAgY29uc3QgW3NhbmRib3hJZCwgbWVzc2VuZ2VyXSA9IGF3YWl0IHNkay5UYWcucmVnaXN0ZXJTYW5kYm94KGh0bWwpO1xyXG5cclxuICAgICAgICBjb25zdCBhdHRhY2htZW50SUQgPSB0aGlzLnRhZ3NBdHRhY2htZW50c1t0YWdJRF07XHJcbiAgICAgICAgaWYgKGF0dGFjaG1lbnRJRCkge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGFnTW9kdWxlLmRldGFjaCh0YWdJRCwgYXR0YWNobWVudElEKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy50YWdzQXR0YWNobWVudHNbdGFnSURdID0gc2FuZGJveElkO1xyXG4gICAgICAgIGF3YWl0IHRhZ01vZHVsZS5hdHRhY2godGFnSUQsIHNhbmRib3hJZCk7XHJcblxyXG4gICAgICAgIC8vIEF0dGFjaCB0aGUgXCJWaWV3IGluZm9ybWF0aW9uc1wiIGhhbmRsZXIgaW4gdG9vbHRpcFxyXG4gICAgICAgIG1lc3Nlbmdlci5vbihUYWdBY3Rpb24uREVUQUlMX0NMSUNLLCB0aGlzLnRhZ1NlcnZpY2Uub25BY3Rpb25EZXRhaWxDbGljay5iaW5kKHRoaXMudGFnU2VydmljZSkpO1xyXG4gICAgICAgIG1lc3Nlbmdlci5vbihUYWdBY3Rpb24uVElDS0VUX0NMSUNLLCB0aGlzLnRhZ1NlcnZpY2Uub25BY3Rpb25EZXRhaWxDbGljay5iaW5kKHRoaXMudGFnU2VydmljZSkpO1xyXG4gICAgICAgIG1lc3Nlbmdlci5vbihUYWdBY3Rpb24uQVVESU9fQ0xJQ0ssIChhdWRpb0NvbW1lbnRJRDogc3RyaW5nKSA9PiB0aGlzLnRhZ1NlcnZpY2Uub25BY3Rpb25BdWRpb0NsaWNrKGF1ZGlvQ29tbWVudElEKSk7XHJcbiAgICAgICAgbWVzc2VuZ2VyLm9uKFRhZ0FjdGlvbi5WSURFT19DTElDSywgKHZpZGVvVXJsOiBzdHJpbmcpID0+IHRoaXMudGFnU2VydmljZS5vbkFjdGlvblZpZGVvQ2xpY2sodmlkZW9VcmwpKTtcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLklNQUdFX0NMSUNLLCAoaW1hZ2VDb21tZW50SUQ6IHN0cmluZykgPT4gdGhpcy50YWdTZXJ2aWNlLm9uQWN0aW9uSW1hZ2VDbGljayhpbWFnZUNvbW1lbnRJRCkpO1xyXG4gICAgICAgIG1lc3Nlbmdlci5vbihUYWdBY3Rpb24uRE9DX0NMSUNLLCAoZG9jVXJsOiBzdHJpbmcpID0+IHRoaXMudGFnU2VydmljZS5vbkFjdGlvbkRvY0NsaWNrKGRvY1VybCkpO1xyXG4gICAgICAgIG1lc3Nlbmdlci5vbihUYWdBY3Rpb24uWU9VVFVCRV9DTElDSywgKHlvdXR1YmVVcmw6IHN0cmluZykgPT4gdGhpcy50YWdTZXJ2aWNlLm9uQWN0aW9uWW91dHViZUNsaWNrKHlvdXR1YmVVcmwpKTtcclxuICAgICAgfSBlbHNlIGlmIChzZGspIHtcclxuICAgICAgICBjb25zdCB7IGNvbW1lbnQsIHRhZ0Rlc2NyaXB0aW9uIH0gPSB0aGlzLnRhZ1NlcnZpY2UuZ2V0QmlsbGJvYXJkTWVkaWFUb0VtYmVkKG9iamVjdCk7XHJcblxyXG4gICAgICAgIGlmIChjb21tZW50KSB7XHJcbiAgICAgICAgICBjb25zdCB0YWdNb2R1bGUgPSB0aGlzLmdldFRhZ01vZHVsZShzZGssIHRhZ0lEKTtcclxuICAgICAgICAgIC8vIDEpIFJlZ2lzdGVyIHRoZSBtZWRpYSBhdHRhY2htZW50IGJ5IHBhc3NpbmcgdGhlIFVSTCBzdHJpbmcocykuXHJcbiAgICAgICAgICAvLyAgICByZWdpc3RlckF0dGFjaG1lbnQgcmV0dXJucyBhbiBhcnJheSBvZiBhdHRhY2htZW50IElEcy5cclxuICAgICAgICAgIGNvbnN0IFthdHRhY2htZW50SURdID0gYXdhaXQgc2RrLlRhZy5yZWdpc3RlckF0dGFjaG1lbnQoY29tbWVudC5leHRlcm5hbExpbmspO1xyXG5cclxuICAgICAgICAgIC8vIDIpIEF0dGFjaCB0aGUgcmVnaXN0ZXJlZCBtZWRpYSB0byB0aGUgdGFnLlxyXG4gICAgICAgICAgYXdhaXQgdGFnTW9kdWxlLmF0dGFjaCh0YWdJRCwgYXR0YWNobWVudElEKTtcclxuXHJcbiAgICAgICAgICAvLyAzKSBEZXRlcm1pbmUgbWVkaWEgdHlwZSBmb3IgdGhlIGJpbGxib2FyZCAoUEhPVE8gb3IgVklERU8pLlxyXG4gICAgICAgICAgLy8gICAgVXNlIGEgc2ltcGxlIGhldXJpc3RpYzogWW91VHViZS9WaW1lbyAtPiBWSURFTywgb3RoZXJ3aXNlIFBIT1RPLlxyXG4gICAgICAgICAgLy8gICAgVGhlIFNESyBleHBvc2VzIE1lZGlhVHlwZSBvbiB0aGUgVGFnIG5hbWVzcGFjZS5cclxuICAgICAgICAgIGNvbnN0IGlzVmlkZW8gPSAveW91dHViZVxcLmNvbXx5b3V0dVxcLmJlfHZpbWVvXFwuY29tL2kudGVzdChjb21tZW50LmV4dGVybmFsTGluayk7XHJcbiAgICAgICAgICBjb25zdCBtZWRpYVR5cGUgPSBpc1ZpZGVvID8gc2RrLk1hdHRlcnRhZy5NZWRpYVR5cGUuVklERU8gOiBzZGsuTWF0dGVydGFnLk1lZGlhVHlwZS5QSE9UTztcclxuXHJcbiAgICAgICAgICAvLyA0KSBVcGRhdGUgdGhlIGJpbGxib2FyZCB0ZXh0IGFuZCBtZWRpYSB1c2luZyBlZGl0QmlsbGJvYXJkLlxyXG4gICAgICAgICAgLy8gICAgZWRpdEJpbGxib2FyZCBhY2NlcHRzIFBhcnRpYWw8VGFnLkVkaXRhYmxlUHJvcGVydGllcz4gc3VjaCBhcyBsYWJlbCwgZGVzY3JpcHRpb24sIG1lZGlhLlxyXG4gICAgICAgICAgYXdhaXQgdGFnTW9kdWxlLmVkaXRCaWxsYm9hcmQodGFnSUQsIHtcclxuICAgICAgICAgICAgbGFiZWw6IG9iamVjdC50aXRsZSB8fCAnTWVkaWEnLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGFnRGVzY3JpcHRpb24gfHwgJycsXHJcbiAgICAgICAgICAgIG1lZGlhOiB7XHJcbiAgICAgICAgICAgICAgdHlwZTogbWVkaWFUeXBlLFxyXG4gICAgICAgICAgICAgIHNyYzogY29tbWVudC5leHRlcm5hbExpbmssXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAvLyA1KSBLZWVwIGEgbG9jYWwgcmVmZXJlbmNlXHJcbiAgICAgICAgICB0aGlzLnRhZ3NBdHRhY2htZW50c1t0YWdJRF0gPSB7XHJcbiAgICAgICAgICAgIGF0dGFjaG1lbnRJRCxcclxuICAgICAgICAgICAgdGl0bGU6IG9iamVjdC50aXRsZSB8fCAnTWVkaWEnLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGFnRGVzY3JpcHRpb24gfHwgJycsXHJcbiAgICAgICAgICAgIG1lZGlhU3JjOiBjb21tZW50LmV4dGVybmFsTGluayxcclxuICAgICAgICAgICAgbWVkaWFUeXBlLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tNYXR0ZXJwb3J0VGFnU2VydmljZV0gRXJyb3IgaW4gaW5qZWN0SHRtbEluVGFnOicsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBDbGVhcnMgYWxsIGxvY2FsIHRhZyBkYXRhIGFuZCByZXNldHMgdGhlIGFkZGl0aW9uIHF1ZXVlLiAqL1xyXG4gIGNsZWFyKCkge1xyXG4gICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuY2xlYXIoKTtcclxuICAgIHRoaXMudGFnc0N1cnJlbnRPcGFjaXR5LmNsZWFyKCk7XHJcbiAgICB0aGlzLnRhZ3NDdXJyZW50RW5hYmxlZC5jbGVhcigpO1xyXG4gICAgdGhpcy50YWdBZGRRdWV1ZSA9IFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgdGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdyA9IG51bGw7XHJcbiAgICB0aGlzLm1hdHRlcnRhZ0lEcyA9IFtdO1xyXG4gICAgLy8gQSBuZXcgc3BhY2UgbWVhbnMgYSBuZXcgU0RLIHNlc3Npb24sIGhlbmNlIGEgbmV3IHNoYXJlZCBsYXllciB0byBjcmVhdGUuXHJcbiAgICB0aGlzLnNoYXJlZFRhZ0xheWVyID0gbnVsbDtcclxuICAgIHRoaXMuc2hhcmVkVGFnTGF5ZXJQcm9taXNlID0gbnVsbDtcclxuICB9XHJcbn1cclxuIl19
594
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC10YWcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvc2VydmljZXMvbWF0dGVycG9ydC10YWcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQWtELFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV6RyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7OztBQU0xQyxNQUFNLE9BQU8sb0JBQW9CO0lBZ0NyQjtJQS9CVixvRUFBb0U7SUFDNUQsTUFBTSxDQUFVLHFCQUFxQixHQUFHLHlCQUF5QixDQUFDO0lBRW5FLGVBQWUsR0FBK0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUN4RCxXQUFXLEdBQWlCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM5QyxpQkFBaUIsR0FBa0IsSUFBSSxDQUFDO0lBQ3hDLFNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO0lBQ2xDLFlBQVksR0FBa0IsRUFBRSxDQUFDO0lBQ2pDLGVBQWUsR0FBVyxFQUFFLENBQUM7SUFDN0IsY0FBYyxHQUFZLEtBQUssQ0FBQztJQUNoQyxVQUFVLEdBQTBCLElBQUksQ0FBQztJQUN4QyxrQkFBa0IsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNwRCxrQkFBa0IsR0FBeUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUM3RDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0ssY0FBYyxHQUFRLElBQUksQ0FBQztJQUMzQixxQkFBcUIsR0FBd0Is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Q0FBQyxDQUFDO29CQUVILDRCQUE0QjtvQkFDNUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsR0FBRzt3QkFDNUIsWUFBWTt3QkFDWixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssSUFBSSxPQUFPO3dCQUM5QixXQUFXLEVBQUUsY0FBYyxJQUFJLEVBQUU7d0JBQ2pDLFFBQVEsRUFBRSxPQUFPLENBQUMsWUFBWTt3QkFDOUIsU0FBUztxQkFDVixDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLGtEQUFrRCxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNFLENBQUM7SUFDSCxDQUFDO0lBRUQsK0RBQStEO0lBQy9ELEtBQUs7UUFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QiwyRUFBMkU7UUFDM0UsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztJQUNwQyxDQUFDO3dHQW5vQlUsb0JBQW9COzRHQUFwQixvQkFBb0IsY0FGbkIsTUFBTTs7NEZBRVAsb0JBQW9CO2tCQUhoQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzRGV2TW9kZSwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTWF0dGVydGFnRGF0YSB9IGZyb20gJy4uL21hdHRlcnRhZ0RhdGEnO1xuaW1wb3J0IHsgUG9pVHlwZSwgRGJPYmplY3RUeXBlLCBQT0ksIFZpZXdlckludGVyYWN0aW9ucywgVGFnQWN0aW9uLCBDYW1lcmFNb2RlIH0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XG5pbXBvcnQgeyBNYXR0ZXJwb3J0TmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICcuL21hdHRlcnBvcnQtbmF2aWdhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IHdhaXQgfSBmcm9tICcuLi9oZWxwZXJzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQmFzZVRhZ1NlcnZpY2UgfSBmcm9tICcuL3RhZy5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIE1hdHRlcnBvcnRUYWdTZXJ2aWNlIHtcbiAgLyoqIE5hbWUgb2YgdGhlIGNvbW1vbiBsYXllciBldmVyeSBTbWFydGVycGxhbiB0YWcgaXMgY3JlYXRlZCBpbi4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU0hBUkVEX1RBR19MQVlFUl9OQU1FID0gJ3NtYXJ0ZXJwbGFuLXNoYXJlZC10YWdzJztcblxuICBwdWJsaWMgZGljdGlvbm5hcnlUYWdzOiBNYXA8c3RyaW5nLCBNYXR0ZXJ0YWdEYXRhPiA9IG5ldyBNYXAoKTtcbiAgcHVibGljIHRhZ0FkZFF1ZXVlOiBQcm9taXNlPGFueT4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgcHVibGljIG1hdHRlcnRhZ1RvRm9sbG93OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIG9uR29Ub1RhZyA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgcHVibGljIG1hdHRlcnRhZ0lEczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICBwdWJsaWMgdGFnc0F0dGFjaG1lbnRzOiBPYmplY3QgPSB7fTtcbiAgcHVibGljIHRhZ01lc3Nlbmdlck9uOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyB0YWdTZXJ2aWNlOiBCYXNlVGFnU2VydmljZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHRhZ3NDdXJyZW50T3BhY2l0eTogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSB0YWdzQ3VycmVudEVuYWJsZWQ6IE1hcDxzdHJpbmcsIGJvb2xlYW4+ID0gbmV3IE1hcCgpO1xuICAvKipcbiAgICogU2luZ2xlIGxheWVyIGhvbGRpbmcgZXZlcnkgU21hcnRlcnBsYW4gdGFnLCBhZGRlZCB0byBldmVyeSB2aWV3IG9mIHRoZSBzcGFjZSBzbyBhXG4gICAqIHRhZyBzdGF5cyBpbiBwbGFjZSDigJQgc2FtZSBzaWQsIHNhbWUgY29udGVudCDigJQgd2hlbiB0aGUgdXNlciBzd2l0Y2hlcyBiZXR3ZWVuIHRoZVxuICAgKiBmdXJuaXNoZWQgYW5kIHRoZSBEZWZ1cm5pc2hlZCB2aWV3LiBUYWdzIGFkZGVkIHRvIHRoZSBnbG9iYWwgc2RrLlRhZyAob3IgdG8gYVxuICAgKiB2aWV3J3Mgb3duIGxheWVyKSBiZWxvbmcgdG8gdGhhdCB2aWV3IG9ubHksIHdoaWNoIGlzIHdoYXQgbWFkZSB0aGVtIHBvcCBpbiBhbmQgb3V0XG4gICAqIG9uIGV2ZXJ5IHZpZXcgY2hhbmdlLlxuICAgKlxuICAgKiBEZWxpYmVyYXRlbHkgTk9UIGNyZWF0ZWQgd2l0aCBgeyBjb21tb246IHRydWUgfWA6IGluIFNESyAyNi43LjUgYSBjb21tb24gbGF5ZXIgaXNcbiAgICogcHVzaGVkIGludG8gYGdldE9yZGVyZWRNb2RlbFZpZXdzKClgIGF0IGNyZWF0aW9uIHRpbWUsIGFuZCB0aGF0IGNhbGwgZGVmYXVsdHMgdG9cbiAgICogYGluY2x1ZGVEZWZ1cm5pc2g6IGZhbHNlYCwgc28gdGhlIERlZnVybmlzaGVkIHZpZXcgbmV2ZXIgcmVjZWl2ZXMgaXQg4oCUIHdoaWxlXG4gICAqIGBWaWV3LmFkZExheWVyKClgIHJlZnVzZXMgdG8gcmVwYWlyIGl0IChcIkxheWVyIGlzIGNvbW1vbi4gTm8gbmVlZCB0byBhZGQuXCIpLiBBXG4gICAqIHBsYWluIGxheWVyIHdlIGF0dGFjaCB0byBlYWNoIHZpZXcgb3Vyc2VsdmVzIHJlYWNoZXMgZXZlcnkgdmlldywgRGVmdXJuaXNoZWRcbiAgICogaW5jbHVkZWQuIFNlZSBhdHRhY2hTaGFyZWRUYWdMYXllclRvVmlld3MoKS5cbiAgICovXG4gIHByaXZhdGUgc2hhcmVkVGFnTGF5ZXI6IGFueSA9IG51bGw7XG4gIHByaXZhdGUgc2hhcmVkVGFnTGF5ZXJQcm9taXNlOiBQcm9taXNlPGFueT4gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5hdmlnYXRpb25TZXJ2aWNlOiBNYXR0ZXJwb3J0TmF2aWdhdGlvblNlcnZpY2VcbiAgKSB7IH1cblxuICBzZXRUYWdTZXJ2aWNlKHNlcnZpY2U6IEJhc2VUYWdTZXJ2aWNlKTogdm9pZCB7XG4gICAgdGhpcy50YWdTZXJ2aWNlID0gc2VydmljZTtcbiAgfVxuXG4gIC8qKiBPcGVucyBhIHNwZWNpZmljIHRhZyBpbiB0aGUgTWF0dGVycG9ydCB2aWV3ZXIgYnkgaXRzIElELiAqL1xuICBhc3luYyBnb1RvVGFnKHNkazogYW55LCBzaWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFzZGspIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgdGhpcy5vbkdvVG9UYWcubmV4dChzaWQpO1xuICAgICAgLy8gYG9wZW5gIG9ubHkgZXhpc3RzIG9uIHRoZSBnbG9iYWwgVGFnIG1vZHVsZSwgbmV2ZXIgb24gYSBsYXllci1zY29wZWQgb25lLlxuICAgICAgYXdhaXQgc2RrLlRhZy5vcGVuKHNpZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0Nhbm5vdCBvcGVuIHRhZycsIHNpZCwgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFNESyBUYWcgbW9kdWxlIHRvIHVzZSBmb3IgYW4gb3BlcmF0aW9uIGFkZHJlc3NpbmcgYW4gZXhpc3RpbmcgdGFnIGJ5IElEXG4gICAqIChpY29uLCBvcGFjaXR5LCBwb3NpdGlvbiwgYXR0YWNobWVudHMsIHJlbW92YWwuLi4pOiBhbHdheXMgdGhlIGdsb2JhbCBzZGsuVGFnLlxuICAgKlxuICAgKiBBIGxheWVyLXNjb3BlZCBUYWcgbW9kdWxlIG9ubHkgZXhwb3NlcyB0aGUgKnJlcGxheWFibGUqIG11dGF0aW9ucywgbWVhbnQgdG8gYnVpbGRcbiAgICogdGhlIGxheWVyJ3Mgb3duIGNvbnRlbnQ7IGFwcGx5aW5nIHRoZW0gdG8gYW4gYWxyZWFkeS1jcmVhdGVkIHRhZyBzaWxlbnRseSBkb2VzXG4gICAqIG5vdGhpbmcg4oCUIHdoaWNoIGlzIHdoYXQgbGVmdCBldmVyeSBwaW4gd2hpdGUgaW5zdGVhZCBvZiBjYXJyeWluZyBpdHMgaWNvbi4gT25seVxuICAgKiBgYWRkYCBoYXMgdG8gZ28gdGhyb3VnaCB0aGUgbGF5ZXIsIHNlZSBnZXRUYWdDcmVhdGlvbk1vZHVsZSgpLlxuICAgKi9cbiAgZ2V0VGFnTW9kdWxlKHNkazogYW55LCB0YWdJZDogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gc2RrPy5UYWc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgVGFnIG1vZHVsZSBldmVyeSBuZXcgdGFnIG11c3QgYmUgY3JlYXRlZCB0aHJvdWdoOiB0aGUgc2hhcmVkIGxheWVyXG4gICAqIHdoZW4gdGhlIFZpZXcgQVBJIGlzIGF2YWlsYWJsZSwgdGhlIGdsb2JhbCBzZGsuVGFnIG90aGVyd2lzZS5cbiAgICovXG4gIGFzeW5jIGdldFRhZ0NyZWF0aW9uTW9kdWxlKHNkazogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBsYXllciA9IGF3YWl0IHRoaXMuZW5zdXJlU2hhcmVkVGFnTGF5ZXIoc2RrKTtcbiAgICByZXR1cm4gbGF5ZXI/LlRhZyB8fCBzZGs/LlRhZztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIChvbmNlIHBlciBTREsgc2Vzc2lvbikgYW5kIHJldHVybnMgdGhlIHNoYXJlZCB0YWcgbGF5ZXIuXG4gICAqIFJlc29sdmVzIHRvIG51bGwgd2hlbiB0aGUgVmlldyBBUEkgaXMgdW5hdmFpbGFibGUsIHNvIGNhbGxlcnMgdHJhbnNwYXJlbnRseSBmYWxsXG4gICAqIGJhY2sgdG8gdGhlIGdsb2JhbCBzZGsuVGFnLlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlU2hhcmVkVGFnTGF5ZXIoc2RrOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLnNoYXJlZFRhZ0xheWVyKSByZXR1cm4gdGhpcy5zaGFyZWRUYWdMYXllcjtcbiAgICBpZiAoIXNkaz8uVmlldz8uY3JlYXRlTGF5ZXIpIHJldHVybiBudWxsO1xuXG4gICAgaWYgKCF0aGlzLnNoYXJlZFRhZ0xheWVyUHJvbWlzZSkge1xuICAgICAgdGhpcy5zaGFyZWRUYWdMYXllclByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgIHNkay5WaWV3LmNyZWF0ZUxheWVyKE1hdHRlcnBvcnRUYWdTZXJ2aWNlLlNIQVJFRF9UQUdfTEFZRVJfTkFNRSlcbiAgICAgIClcbiAgICAgICAgLnRoZW4oYXN5bmMgKGxheWVyOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnNoYXJlZFRhZ0xheWVyID0gbGF5ZXI7XG4gICAgICAgICAgLy8gQSBmcmVzaGx5IGNyZWF0ZWQgbGF5ZXIgY2FuIGNvbWUgYmFjayB0b2dnbGVkIG9mZiwgd2hpY2ggaGlkZXMgaXRzIHRhZ3MuXG4gICAgICAgICAgaWYgKGxheWVyICYmIGxheWVyLnRvZ2dsZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBhd2FpdCBsYXllci50b2dnbGUodHJ1ZSkuY2F0Y2goKCkgPT4geyB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGxheWVyO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGU6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIEFsbG93IGEgbGF0ZXIgcmV0cnkgKGUuZy4gdGhlIFNESyB3YXMgbm90IGZ1bGx5IHJlYWR5IHlldCkuXG4gICAgICAgICAgdGhpcy5zaGFyZWRUYWdMYXllclByb21pc2UgPSBudWxsO1xuICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIENvdWxkIG5vdCBjcmVhdGUgdGhlIHNoYXJlZCB0YWcgbGF5ZXInLCBlKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkVGFnTGF5ZXJQcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIHN1cmUgdGhlIHNoYXJlZCBsYXllciBpcyBwYXJ0IG9mIGV2ZXJ5IHZpZXcgb2YgdGhlIHNwYWNlLCBEZWZ1cm5pc2hlZFxuICAgKiBpbmNsdWRlZC4gVGhpcyBpcyB3aGF0IGFjdHVhbGx5IHNoYXJlcyB0aGUgdGFncyBhY3Jvc3Mgdmlld3MsIGFuZCB0aGUgcmVhc29uIHRoZVxuICAgKiBsYXllciBtdXN0IG5vdCBiZSBhIGNvbW1vbiBvbmU6IHRoZSBTREsgb25seSBwZXJmb3JtcyB0aGUgYXR0YWNobWVudCBmb3JcbiAgICogbm9uLWNvbW1vbiBsYXllcnMuIElkZW1wb3RlbnQsIHNvIGl0IGNhbiBydW4gb24gZXZlcnkgdmlldyBjb2xsZWN0aW9uIHVwZGF0ZS5cbiAgICovXG4gIGFzeW5jIGF0dGFjaFNoYXJlZFRhZ0xheWVyVG9WaWV3cyhzZGs6IGFueSwgdmlld3M6IEl0ZXJhYmxlPGFueT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsYXllciA9IGF3YWl0IHRoaXMuZW5zdXJlU2hhcmVkVGFnTGF5ZXIoc2RrKTtcbiAgICBpZiAoIWxheWVyKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IHZpZXcgb2Ygdmlld3MpIHtcbiAgICAgIGlmICghdmlldz8uYWRkTGF5ZXIgfHwgdmlldy5oYXNMYXllcj8uKGxheWVyKSkgY29udGludWU7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB2aWV3LmFkZExheWVyKGxheWVyKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ1tNYXR0ZXJwb3J0VGFnU2VydmljZV0gQ2Fubm90IGFkZCB0aGUgc2hhcmVkIHRhZyBsYXllciB0byB2aWV3Jywgdmlldz8uaWQsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgdGFnIHRocm91Z2ggdGhlIHNoYXJlZCBsYXllciBzbyBpdCBleGlzdHMgaW4gZXZlcnkgdmlldy4gRmFsbHMgYmFja1xuICAgKiB0byB0aGUgZ2xvYmFsIHNkay5UYWcgd2hlbiB0aGUgVmlldyBBUEkgaXMgdW5hdmFpbGFibGU7IHRoYXQgY2FsbCBpcyByYWNlZCBhZ2FpbnN0XG4gICAqIGEgdGltZW91dCBhcyBhIHNhZmV0eSBuZXQsIHNpbmNlIGl0IG5ldmVyIHJlc29sdmVzIHdoaWxlIGEgRGVmdXJuaXNoZWQgdmlldyBpc1xuICAgKiBhY3RpdmUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFkZFRhZ1RvU2RrKHNkazogYW55LCBkZXNjcmlwdG9yOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgY29uc3Qgc2hhcmVkVGFnTW9kdWxlID0gYXdhaXQgdGhpcy5nZXRUYWdDcmVhdGlvbk1vZHVsZShzZGspO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpZExpc3QgPSAoYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgc2hhcmVkVGFnTW9kdWxlLmFkZChkZXNjcmlwdG9yKSxcbiAgICAgICAgbmV3IFByb21pc2U8bmV2ZXI+KChfLCByZWplY3QpID0+XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKCdUYWcuYWRkIHRpbWVkIG91dCcpKSwgNDAwMClcbiAgICAgICAgKSxcbiAgICAgIF0pKSBhcyBzdHJpbmdbXTtcbiAgICAgIGlmIChzaWRMaXN0Py5sZW5ndGgpIHJldHVybiBzaWRMaXN0WzBdO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmIChlcnJvcj8ubWVzc2FnZT8uaW5jbHVkZXMoJ2FscmVhZHkgaW4gdXNlJykpIHRocm93IGVycm9yO1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ1tNYXR0ZXJwb3J0VGFnU2VydmljZV0gVGFnLmFkZCBmYWlsZWQvdGltZWQgb3V0JywgZXJyb3I/Lm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIE9wZW5zIHRoZSBtb3N0IHJlY2VudGx5IGNyZWF0ZWQgdGFnIGluIHRoZSB2aWV3ZXIuICovXG4gIGFzeW5jIGdvVG9MYXN0VGFnKHNkazogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXNkayB8fCB0aGlzLm1hdHRlcnRhZ0lEcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCBsYXN0U2lkID0gdGhpcy5tYXR0ZXJ0YWdJRHNbdGhpcy5tYXR0ZXJ0YWdJRHMubGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIHRoaXMuZ29Ub1RhZyhzZGssIGxhc3RTaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBNYXR0ZXJ0YWcgdG8gdGhlIHZpZXdlciwgc2VyaWFsaXppbmcgY2FsbHMgdG8gcHJldmVudCBTREsgcmFjZSBjb25kaXRpb25zLlxuICAgKiBSZXVzZXMgZXhpc3RpbmcgSURzIGlmIHRoZSB0YWcgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBzZXNzaW9uLlxuICAgKi9cbiAgYXN5bmMgYWRkTWF0dGVydGFnVG9WaWV3ZXIoc2RrOiBhbnksIG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBpZiAoIXNkaykgcmV0dXJuIG51bGw7XG5cbiAgICB0aGlzLnRhZ0FkZFF1ZXVlID0gdGhpcy50YWdBZGRRdWV1ZVxuICAgICAgLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gbWF0dGVydGFnRGF0YS5nZXRNYXR0ZXJ0YWdEZXNjcmlwdG9yKClbMF07XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSWQgPSBkZXNjcmlwdG9yPy5pZCB8fCBudWxsO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc2lkID0gYXdhaXQgdGhpcy5hZGRUYWdUb1NkayhzZGssIGRlc2NyaXB0b3IpO1xuICAgICAgICAgIGlmIChzaWQpIHtcbiAgICAgICAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0TWF0dGVycG9ydFNpZChzaWQpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLm1hdHRlcnRhZ0lEcy5pbmNsdWRlcyhzaWQpKSB7XG4gICAgICAgICAgICAgIHRoaXMubWF0dGVydGFnSURzLnB1c2goc2lkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLnNldChzaWQsIG1hdHRlcnRhZ0RhdGEpO1xuICAgICAgICAgICAgcmV0dXJuIHNpZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ1tNYXR0ZXJwb3J0VGFnU2VydmljZV0gVGFnLmFkZCByZXR1cm5lZCBubyBzaWQnLCBkZXNjcmlwdG9yKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgIGlmIChlcnJvcj8ubWVzc2FnZT8uaW5jbHVkZXMoJ2FscmVhZHkgaW4gdXNlJykgJiYgZXhpc3RpbmdJZCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRpY3Rpb25uYXJ5VGFncy5oYXMoZXhpc3RpbmdJZCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5tYXR0ZXJ0YWdJRHMucHVzaChleGlzdGluZ0lkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLnNldChleGlzdGluZ0lkLCBtYXR0ZXJ0YWdEYXRhKTtcbiAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0lkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignW01hdHRlcnBvcnRUYWdTZXJ2aWNlXSBhZGRNYXR0ZXJ0YWdUb1ZpZXdlciBmYWlsZWQnLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIHRhZ0FkZFF1ZXVlIHJlamVjdGVkJywgZSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy50YWdBZGRRdWV1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gYWRkIGFuZCBjb25maWd1cmUgYSBNYXR0ZXJ0YWcgd2l0aCBpY29uLCBvcGFjaXR5LCBhbmQgSFRNTCBjb250ZW50LlxuICAgKiBIYW5kbGVzIGV4aXN0aW5nIHRhZ3MgZ3JhY2VmdWxseSBhbmQgcXVldWVzIG9wZXJhdGlvbnMgdG8gYXZvaWQgU0RLIGNvbmZsaWN0cy5cbiAgICovXG4gIGFzeW5jIF9kb0FkZE1hdHRlcnRhZyhcbiAgICBzZGs6IGFueSxcbiAgICBtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhLFxuICAgIHNldFRhZ0ljb25BbmRPcGFjaXR5OiAoc2lkOiBzdHJpbmcsIG10OiBNYXR0ZXJ0YWdEYXRhKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIGluamVjdEh0bWxJblRhZzogKHR5cGU6IFBvaVR5cGUsIG9iajogRGJPYmplY3RUeXBlLCBzaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBtYXR0ZXJ0YWdEYXRhLmdldE1hdHRlcnRhZ0Rlc2NyaXB0b3IoKTtcbiAgICAvL2NvbnNvbGUubG9nKCdkZXNjcmlwdG9yJywgZGVzY3JpcHRvcik7XG4gICAgY29uc3Qgc2lkID0gZGVzY3JpcHRvclswXVsnaWQnXTtcblxuICAgIGlmIChzaWQgJiYgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuaGFzKHNpZCkpIHtcbiAgICAgIGF3YWl0IHNldFRhZ0ljb25BbmRPcGFjaXR5KHNpZCwgbWF0dGVydGFnRGF0YSk7XG4gICAgICBhd2FpdCBpbmplY3RIdG1sSW5UYWcobWF0dGVydGFnRGF0YS5nZXRUeXBlKCksIG1hdHRlcnRhZ0RhdGEuZ2V0T2JqZWN0KCksIHNpZCk7XG4gICAgICByZXR1cm4gc2lkO1xuICAgIH1cblxuICAgIHRoaXMudGFnQWRkUXVldWUgPSB0aGlzLnRhZ0FkZFF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGFnTW9kdWxlID0gYXdhaXQgdGhpcy5nZXRUYWdDcmVhdGlvbk1vZHVsZShzZGspO1xuICAgICAgICBjb25zdCBbY3JlYXRlZFNpZF0gPSBhd2FpdCB0YWdNb2R1bGUuYWRkKC4uLmRlc2NyaXB0b3IpO1xuXG4gICAgICAgIHRoaXMubWF0dGVydGFnSURzLnB1c2goY3JlYXRlZFNpZCk7XG4gICAgICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLnNldChjcmVhdGVkU2lkLCBtYXR0ZXJ0YWdEYXRhKTtcblxuICAgICAgICBhd2FpdCB3YWl0KDEwMCk7XG4gICAgICAgIGF3YWl0IHNldFRhZ0ljb25BbmRPcGFjaXR5KGNyZWF0ZWRTaWQsIG1hdHRlcnRhZ0RhdGEpO1xuXG4gICAgICAgIGluamVjdEh0bWxJblRhZyhtYXR0ZXJ0YWdEYXRhLmdldFR5cGUoKSwgbWF0dGVydGFnRGF0YS5nZXRPYmplY3QoKSwgY3JlYXRlZFNpZCkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignSFRNTCBpbmplY3Rpb24gZmFpbGVkIGZvcicsIGNyZWF0ZWRTaWQsIGVycik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVkU2lkO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGlmIChlPy5tZXNzYWdlPy5pbmNsdWRlcygnYWxyZWFkeSBpbiB1c2UnKSAmJiBzaWQpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuZGljdGlvbm5hcnlUYWdzLmhhcyhzaWQpKSB7XG4gICAgICAgICAgICB0aGlzLm1hdHRlcnRhZ0lEcy5wdXNoKHNpZCk7XG4gICAgICAgICAgICB0aGlzLmRpY3Rpb25uYXJ5VGFncy5zZXQoc2lkLCBtYXR0ZXJ0YWdEYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgc2V0VGFnSWNvbkFuZE9wYWNpdHkoc2lkLCBtYXR0ZXJ0YWdEYXRhKTtcbiAgICAgICAgICBhd2FpdCBpbmplY3RIdG1sSW5UYWcobWF0dGVydGFnRGF0YS5nZXRUeXBlKCksIG1hdHRlcnRhZ0RhdGEuZ2V0T2JqZWN0KCksIHNpZCk7XG4gICAgICAgICAgcmV0dXJuIHNpZDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMudGFnQWRkUXVldWU7XG4gIH1cblxuICBnZXREaXN0YW5jZShwMTogYW55LCBwMjogYW55KTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHAyLnggLSBwMS54LCAyKSArIE1hdGgucG93KHAyLnkgLSBwMS55LCAyKSArIE1hdGgucG93KHAyLnogLSBwMS56LCAyKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgdGFnIGlzIHdpdGhpbiB0aGUgYm91bmRpbmcgYm94IG9mIGFueSBhY3RpdmUgcm9vbSAoYWRkaW5nIGEgc2xpZ2h0IG1hcmdpbiB0byBhY2NvdW50IGZvciB3YWxsLW1vdW50ZWQgdGFncykuXG4gICAqIElmIHRoZXJlIGFyZSBubyBhY3RpdmUgcm9vbXMgKGUuZy4sIGhhbGx3YXkpLCBmYWxscyBiYWNrIHRvIHJldHVybmluZyB0cnVlLlxuICAgKi9cbiAgaXNUYWdJblJvb21zKG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEsIHJvb21zOiBhbnlbXSk6IGJvb2xlYW4ge1xuICAgIGlmICghcm9vbXMgfHwgcm9vbXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCB0YWdQb3MgPSBtYXR0ZXJ0YWdEYXRhLmdldFBvc2l0aW9uKCk7XG4gICAgY29uc3QgbWFyZ2luID0gMS41O1xuXG4gICAgcmV0dXJuIHJvb21zLnNvbWUoKHJvb20pID0+IHtcbiAgICAgIGlmICghcm9vbS5ib3VuZHMpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHsgbWluLCBtYXggfSA9IHJvb20uYm91bmRzO1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICB0YWdQb3MueCA+PSBtaW4ueCAtIG1hcmdpbiAmJiB0YWdQb3MueCA8PSBtYXgueCArIG1hcmdpbiAmJlxuICAgICAgICB0YWdQb3MueSA+PSBtaW4ueSAtIG1hcmdpbiAmJiB0YWdQb3MueSA8PSBtYXgueSArIG1hcmdpbiAmJlxuICAgICAgICB0YWdQb3MueiA+PSBtaW4ueiAtIG1hcmdpbiAmJiB0YWdQb3MueiA8PSBtYXgueiArIG1hcmdpblxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCB0YWcuICovXG4gIGdldExhc3RUYWcoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMubWF0dGVydGFnSURzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMubWF0dGVydGFnSURzW3RoaXMubWF0dGVydGFnSURzLmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHZpc2liaWxpdHkgKG9wYWNpdHkpIG9mIGFsbCB0YWdzIGJhc2VkIG9uIHRoZSBjdXJyZW50IGNhbWVyYSBtb2RlLFxuICAgKiBmbG9vciBhbmQgcm9vbSBjb250ZXh0LiBNdXN0IGJlIGNhbGxlZCBhZnRlciBlYWNoIHN3ZWVwLCBmbG9vciBvciBtb2RlIGNoYW5nZS5cbiAgICpcbiAgICogUnVsZXM6XG4gICAqICAtIERPTExIT1VTRSAvIEZMT09SUExBTiDihpIgYWxsIHRhZ3MgaGlkZGVuIChvcGFjaXR5IDApLlxuICAgKiAgLSBJTlNJREUg4oaSIG9ubHkgdGFncyB3aG9zZSBzd2VlcCBiZWxvbmdzIHRvIHRoZSBjdXJyZW50IGZsb29yIGFyZSBzaG93bjtcbiAgICogICAgcHJveGltaXR5LWJhc2VkIG9wYWNpdHkgaXMgYXBwbGllZCB2aWEgY29tcHV0ZVRhZ09wYWNpdHkoKS5cbiAgICogICAgVGFncyBvbiBvdGhlciBmbG9vcnMgYXJlIGhpZGRlbiAob3BhY2l0eSAwKS5cbiAgICogIC0gVFJBTlNJVElPTklORyDihpIgbm8gY2hhbmdlIChza2lwIHVwZGF0ZSB0byBhdm9pZCBmbGlja2VyaW5nKS5cbiAgICpcbiAgICogQHBhcmFtIHNkayAgICAgICAgICBNYXR0ZXJwb3J0IFNESyBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBvc2VDYW1lcmEgICBDdXJyZW50IGNhbWVyYSBwb3NlLlxuICAgKiBAcGFyYW0gc3dlZXBDb2xsZWN0aW9uICBGdWxsIGNvbGxlY3Rpb24gb2Ygc3dlZXBzLlxuICAgKiBAcGFyYW0gY3VycmVudENhbWVyYU1vZGUgIEN1cnJlbnQgY2FtZXJhIG1vZGUuXG4gICAqIEBwYXJhbSBtYXR0ZXJ0YWdUb0ZvbGxvdyAgSUQgb2YgdGhlIGN1cnNvciB0YWcgKG5ldmVyIHRvdWNoZWQpLlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlVGFnc1Zpc2liaWxpdHlGb3JDb250ZXh0KFxuICAgIHNkazogYW55LFxuICAgIHN3ZWVwQ29sbGVjdGlvbjogYW55LFxuICAgIGN1cnJlbnRDYW1lcmFNb2RlOiBDYW1lcmFNb2RlLFxuICAgIG1hdHRlcnRhZ1RvRm9sbG93OiBzdHJpbmcgfCBudWxsLFxuICAgIGN1cnJlbnRGbG9vclNlcXVlbmNlOiBudW1iZXIgfCBudWxsID0gbnVsbCxcbiAgICBjdXJyZW50Um9vbXM6IGFueVtdID0gW11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFzZGsgfHwgdGhpcy5kaWN0aW9ubmFyeVRhZ3Muc2l6ZSA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaXNJbnRlcmlvck1vZGUgPSBjdXJyZW50Q2FtZXJhTW9kZSA9PT0gQ2FtZXJhTW9kZS5JTlNJREU7XG4gICAgY29uc3QgY3VycmVudEZsb29ySWQgPSBjdXJyZW50Rmxvb3JTZXF1ZW5jZSAhPT0gbnVsbCA/IGN1cnJlbnRGbG9vclNlcXVlbmNlLnRvU3RyaW5nKCkgOiBudWxsO1xuICAgIGNvbnN0IHByb21pc2VzID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFt0YWdJZCwgbWF0dGVydGFnRGF0YV0gb2YgdGhpcy5kaWN0aW9ubmFyeVRhZ3MpIHtcbiAgICAgIGlmICh0YWdJZCA9PT0gbWF0dGVydGFnVG9Gb2xsb3cpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCB0YWdGbG9vcklkID0gdGhpcy5nZXRGbG9vcklkRm9yVGFnKG1hdHRlcnRhZ0RhdGEsIHN3ZWVwQ29sbGVjdGlvbik7XG4gICAgICBjb25zdCBpc09uQ3VycmVudEZsb29yID0gIXRhZ0Zsb29ySWQgfHwgIWN1cnJlbnRGbG9vcklkIHx8IHRhZ0Zsb29ySWQgPT09IGN1cnJlbnRGbG9vcklkO1xuXG4gICAgICBsZXQgdGFyZ2V0T3BhY2l0eSA9IDA7XG4gICAgICBsZXQgc2hvdWxkQmVFbmFibGVkID0gZmFsc2U7XG5cbiAgICAgIC8vIENhbGN1bGF0aW9uIG9mIG9wYWNpdHkgYW5kIGVuYWJsZSBzdGF0dXNcbiAgICAgIGlmIChpc09uQ3VycmVudEZsb29yKSB7XG4gICAgICAgIGlmICghaXNJbnRlcmlvck1vZGUpIHtcbiAgICAgICAgICB0YXJnZXRPcGFjaXR5ID0gMTtcbiAgICAgICAgICBzaG91bGRCZUVuYWJsZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldE9wYWNpdHkgPSAwLjk7XG4gICAgICAgICAgc2hvdWxkQmVFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQXBwbHkgY2hhbmdlc1xuXG4gICAgICAvLyBUb29sdGlwIGFuZCBjbGljayBtYW5hZ2VtZW50XG4gICAgICBjb25zdCB0YWdNb2R1bGUgPSB0aGlzLmdldFRhZ01vZHVsZShzZGssIHRhZ0lkKTtcbiAgICAgIGNvbnN0IGxhc3RFbmFibGVkID0gdGhpcy50YWdzQ3VycmVudEVuYWJsZWQuZ2V0KHRhZ0lkKTtcbiAgICAgIGlmIChsYXN0RW5hYmxlZCAhPT0gc2hvdWxkQmVFbmFibGVkKSB7XG4gICAgICAgIHRoaXMudGFnc0N1cnJlbnRFbmFibGVkLnNldCh0YWdJZCwgc2hvdWxkQmVFbmFibGVkKTtcbiAgICAgICAgcHJvbWlzZXMucHVzaCh0YWdNb2R1bGUuYWxsb3dBY3Rpb24odGFnSWQsIHtcbiAgICAgICAgICBvcGVuaW5nOiBzaG91bGRCZUVuYWJsZWQsXG4gICAgICAgICAgbmF2aWdhdGluZzogc2hvdWxkQmVFbmFibGVkLFxuICAgICAgICAgIGRvY2tpbmc6IGZhbHNlXG4gICAgICAgIH0pLmNhdGNoKCgpID0+IHsgfSkpO1xuICAgICAgfVxuICAgICAgLy8gT3BhY2l0eSBtYW5hZ2VtZW50XG4gICAgICBjb25zdCBsYXN0T3BhY2l0eSA9IHRoaXMudGFnc0N1cnJlbnRPcGFjaXR5LmdldCh0YWdJZCkgPz8gLTE7XG4gICAgICBpZiAoTWF0aC5hYnMobGFzdE9wYWNpdHkgLSB0YXJnZXRPcGFjaXR5KSA+IDAuMDUpIHtcbiAgICAgICAgdGhpcy50YWdzQ3VycmVudE9wYWNpdHkuc2V0KHRhZ0lkLCB0YXJnZXRPcGFjaXR5KTtcbiAgICAgICAgcHJvbWlzZXMucHVzaCh0YWdNb2R1bGUuZWRpdE9wYWNpdHkodGFnSWQsIHRhcmdldE9wYWNpdHkpLmNhdGNoKCgpID0+IHsgfSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcm9wcyB0aGUgbWVtb2l6ZWQgb3BhY2l0eS9lbmFibGVkIHN0YXRlIHNvIHRoZSBuZXh0IHZpc2liaWxpdHkgcGFzcyByZS1hcHBsaWVzIGl0XG4gICAqIHRvIGV2ZXJ5IHRhZy4gTmVlZGVkIGFmdGVyIGEgdmlldyBzd2l0Y2ggKGZ1cm5pc2hlZCA8LT4gZGVmdXJuaXNoZWQpOiB0aGUgU0RLXG4gICAqIHJlLXJlbmRlcnMgdGhlIHNoYXJlZCBsYXllcidzIHRhZ3MgYW5kIHRoZSBjYWNoZWQgdmFsdWVzIHdvdWxkIG90aGVyd2lzZSBtYWtlXG4gICAqIHVwZGF0ZVRhZ3NWaXNpYmlsaXR5Rm9yQ29udGV4dCgpIHNraXAgdGhlbSwgbGVhdmluZyB0YWdzIHN0dWNrIGludmlzaWJsZS5cbiAgICovXG4gIHJlc2V0VmlzaWJpbGl0eUNhY2hlKCk6IHZvaWQge1xuICAgIHRoaXMudGFnc0N1cnJlbnRPcGFjaXR5LmNsZWFyKCk7XG4gICAgdGhpcy50YWdzQ3VycmVudEVuYWJsZWQuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmVzIGEgc3BlY2lmaWMgdGFnIGZyb20gdGhlIHZpZXdlciBhbmQgbG9jYWwgZGljdGlvbmFyaWVzLiAqL1xuICBhc3luYyBkZWxldGVNYXR0ZXJ0YWdGcm9tSWQoc2RrOiBhbnksIG1hdHRlcnRhZ0lEOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHNkaykgYXdhaXQgdGhpcy5nZXRUYWdNb2R1bGUoc2RrLCBtYXR0ZXJ0YWdJRCkucmVtb3ZlKG1hdHRlcnRhZ0lEKTtcbiAgICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLmRlbGV0ZShtYXR0ZXJ0YWdJRCk7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMubWF0dGVydGFnSURzLmluZGV4T2YobWF0dGVydGFnSUQpO1xuICAgICAgaWYgKGluZGV4ID4gLTEpIHRoaXMubWF0dGVydGFnSURzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignQ2Fubm90IGRlbGV0ZSB0YWcnLCBtYXR0ZXJ0YWdJRCwgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlbW92ZXMgdGhlIGxhc3QgYWRkZWQgdGFnIGZyb20gdGhlIHZpZXdlci4gKi9cbiAgYXN5bmMgZGVsZXRlTGFzdE1hdHRlcnRhZyhzZGs6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxhc3RTaWQgPSB0aGlzLmdldExhc3RUYWcoKTtcbiAgICBpZiAobGFzdFNpZCkgYXdhaXQgdGhpcy5kZWxldGVNYXR0ZXJ0YWdGcm9tSWQoc2RrLCBsYXN0U2lkKTtcbiAgfVxuXG4gIC8qKiBDbGVhcnMgYWxsIHRhZ3MgZnJvbSB0aGUgdmlld2VyIGFuZCByZXNldHMgbG9jYWwgc3RhdGUuICovXG4gIGFzeW5jIGFjdGlvbl9kZWxldGVfYWxsX21hdHRlcnRhZ3Moc2RrOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoc2RrKSB7XG4gICAgICBjb25zdCBzaWRzVG9SZW1vdmUgPSBbLi4udGhpcy5tYXR0ZXJ0YWdJRHNdO1xuICAgICAgZm9yIChjb25zdCBzaWQgb2Ygc2lkc1RvUmVtb3ZlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5nZXRUYWdNb2R1bGUoc2RrLCBzaWQpLnJlbW92ZShzaWQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7IH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIGNvbmZpZ3VyZXMgYSBNYXR0ZXJ0YWcgZnJvbSBhIFBPSSwgaGFuZGxpbmcgY29vcmRpbmF0ZXMsIG5vcm1hbHMsIGFuZCBzd2VlcCBJRC5cbiAgICogU2tpcHMgY3JlYXRpb24gaWYgYSB0YWcgZm9yIHRoZSBvYmplY3QgYWxyZWFkeSBleGlzdHMuXG4gICAqL1xuICBhc3luYyBjcmVhdGVNYXR0ZXJ0YWdGcm9tUE9JKFxuICAgIHNkazogYW55LFxuICAgIHRhZ1R5cGU6IFBvaVR5cGUsXG4gICAgb2JqZWN0OiBEYk9iamVjdFR5cGUsXG4gICAgcG9pOiBQT0ksXG4gICAgZ2V0VGFnRnJvbUVsZW1lbnRJZDogKGlkOiBzdHJpbmcpID0+IHsgdGFnOiBzdHJpbmc7IHN3ZWVwOiBzdHJpbmcgfSxcbiAgICBzZXRUYWdJY29uQW5kT3BhY2l0eTogKHNpZDogc3RyaW5nLCBtdDogTWF0dGVydGFnRGF0YSkgPT4gUHJvbWlzZTx2b2lkPixcbiAgICBpbmplY3RIdG1sSW5UYWc6ICh0eXBlOiBQb2lUeXBlLCBvYmo6IERiT2JqZWN0VHlwZSwgc2lkOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCB7IHRhZyB9ID0gZ2V0VGFnRnJvbUVsZW1lbnRJZChvYmplY3QuaWQpO1xuICAgIGlmICh0YWcpIHJldHVybjtcblxuICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEgPSBuZXcgTWF0dGVydGFnRGF0YSh0YWdUeXBlKTtcbiAgICBtYXR0ZXJ0YWdEYXRhLnNldE9iamVjdChvYmplY3QsIHRhZ1R5cGUpO1xuXG4gICAgaWYgKHBvaS5jb29yZGluYXRlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBtYXR0ZXJ0YWdEYXRhLnNldFBvc2l0aW9uKEpTT04ucGFyc2UocG9pLmNvb3JkaW5hdGUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0Vycm9yIHBhcnNpbmcgUE9JIGNvb3JkaW5hdGVzJywgcG9pLmNvb3JkaW5hdGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwb2kubWV0YWRhdGEpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRhZ01ldGFkYXRhID0gSlNPTi5wYXJzZShwb2kubWV0YWRhdGEpO1xuICAgICAgICBtYXR0ZXJ0YWdEYXRhLnNldE5vcm1hbCh0YWdNZXRhZGF0YS5ub3JtYWwgfHwgeyB4OiAwLCB5OiAtMC4xNSwgejogMCB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbWF0dGVydGFnRGF0YS5zZXROb3JtYWwoeyB4OiAwLCB5OiAtMC4xNSwgejogMCB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocG9pLm1hdHRlcnBvcnRTd2VlcElEKSB7XG4gICAgICBtYXR0ZXJ0YWdEYXRhLnNldFN3ZWVwSUQocG9pLm1hdHRlcnBvcnRTd2VlcElEKTtcbiAgICB9XG4gICAgbWF0dGVydGFnRGF0YS5zZXRQb2kocG9pKTtcblxuICAgIGNvbnN0IGNyZWF0ZWRUYWdJRCA9IGF3YWl0IHRoaXMuYWRkTWF0dGVydGFnVG9WaWV3ZXIoc2RrLCBtYXR0ZXJ0YWdEYXRhKTtcblxuICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0nKTtcbiAgICBjb25zb2xlLmxvZygnZWxlbWVudCBpZCAnICsgbWF0dGVydGFnRGF0YS5lbGVtZW50SUQpO1xuICAgIGNvbnNvbGUubG9nKCdwb3NpdGlvbjogJywgbWF0dGVydGFnRGF0YS5nZXRQb3NpdGlvbigpKTtcbiAgICBjb25zb2xlLmxvZygncm90YXRpb246ICcsIG1hdHRlcnRhZ0RhdGEuZ2V0Um90YXRpb24oKSk7XG4gICAgY29uc29sZS5sb2coJ3N3ZWVwIGlkOiAnLCBtYXR0ZXJ0YWdEYXRhLmdldFN3ZWVwSUQoKSk7XG4gICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLScpO1xuXG5cbiAgICBpZiAoY3JlYXRlZFRhZ0lEICYmIHNkaykge1xuICAgICAgYXdhaXQgd2FpdCgxMDApO1xuICAgICAgYXdhaXQgc2V0VGFnSWNvbkFuZE9wYWNpdHkoY3JlYXRlZFRhZ0lELCBtYXR0ZXJ0YWdEYXRhKTtcbiAgICAgIGluamVjdEh0bWxJblRhZyh0YWdUeXBlLCBvYmplY3QsIGNyZWF0ZWRUYWdJRCkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0hUTUwgaW5qZWN0aW9uIGZhaWxlZCBmb3InLCBjcmVhdGVkVGFnSUQsIGVycik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlZFRhZ0lEO1xuICB9XG5cbiAgLyoqIFVwZGF0ZXMgdGhlIGljb24sIG9wYWNpdHksIGFuZCBIVE1MIGNvbnRlbnQgb2YgYW4gZXhpc3RpbmcgdGFnLiAqL1xuICBhc3luYyB1cGRhdGVNYXR0ZXJUYWdDb250ZW50Rm9yVGFnSUQoXG4gICAgc2RrOiBhbnksXG4gICAgbWF0dGVydGFnSUQ6IHN0cmluZyxcbiAgICBvYmplY3Q6IERiT2JqZWN0VHlwZSxcbiAgICBwb2lUeXBlOiBQb2lUeXBlLFxuICAgIHNldFRhZ0ljb25BbmRPcGFjaXR5OiAoc2lkOiBzdHJpbmcsIG10OiBNYXR0ZXJ0YWdEYXRhKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIGluamVjdEh0bWxJblRhZzogKHR5cGU6IFBvaVR5cGUsIG9iajogRGJPYmplY3RUeXBlLCBzaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGEgPSB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQobWF0dGVydGFnSUQpO1xuICAgIGlmICghbWF0dGVydGFnRGF0YSkgcmV0dXJuO1xuXG4gICAgaWYgKG9iamVjdCkge1xuICAgICAgbWF0dGVydGFnRGF0YS5zZXRPYmplY3Qob2JqZWN0LCBwb2lUeXBlKTtcbiAgICB9XG5cbiAgICBhd2FpdCBzZXRUYWdJY29uQW5kT3BhY2l0eShtYXR0ZXJ0YWdJRCwgbWF0dGVydGFnRGF0YSk7XG4gICAgYXdhaXQgaW5qZWN0SHRtbEluVGFnKHBvaVR5cGUsIG9iamVjdCwgbWF0dGVydGFnSUQpO1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVycyBhIGN1c3RvbSB0ZXh0dXJlIGFuZCBhcHBsaWVzIGl0IHRvIGEgdGFnLCBvcHRpb25hbGx5IGFkanVzdGluZyBvcGFjaXR5LiAqL1xuICBhc3luYyBhZGROZXdJY29uQW5kU2V0Rm9yVGFnKFxuICAgIHNkazogYW55LFxuICAgIG1hdHRlcnRhZ0lEOiBzdHJpbmcsXG4gICAgaWNvblBhdGg6IHN0cmluZyxcbiAgICBhcHBseU9wYWNpdHk6IGJvb2xlYW4sXG4gICAgb3BhY2l0eTogbnVtYmVyXG4gICkge1xuICAgIGlmICghc2RrKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGljb25OYW1lID0gYGN1c3RvbS1pY29uLSR7bWF0dGVydGFnSUR9YDtcbiAgICAgIGNvbnN0IHRhZ01vZHVsZSA9IHRoaXMuZ2V0VGFnTW9kdWxlKHNkaywgbWF0dGVydGFnSUQpO1xuICAgICAgYXdhaXQgc2RrLkFzc2V0LnJlZ2lzdGVyVGV4dHVyZShpY29uTmFtZSwgaWNvblBhdGgpO1xuICAgICAgYXdhaXQgdGFnTW9kdWxlLmVkaXRJY29uKG1hdHRlcnRhZ0lELCBpY29uTmFtZSk7XG5cbiAgICAgIGlmIChhcHBseU9wYWNpdHkpIHtcbiAgICAgICAgYXdhaXQgdGFnTW9kdWxlLmVkaXRPcGFjaXR5KG1hdHRlcnRhZ0lELCBvcGFjaXR5KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0Vycm9yIHNldHRpbmcgY3VzdG9tIGljb24gb3Igb3BhY2l0eScsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKiogRmluZHMgdGhlIHRhZyBJRCBhbmQgc3dlZXAgSUQgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgZWxlbWVudCBJRC4gKi9cbiAgZ2V0VGFnRnJvbUVsZW1lbnRJZChlbGVtZW50SUQ6IHN0cmluZywgc3dlZXBzOiBzdHJpbmdbXSB8IG51bGwpOiB7IHRhZzogc3RyaW5nIHwgbnVsbDsgc3dlZXA6IHN0cmluZyB8IG51bGwgfSB7XG4gICAgbGV0IHRhZ0lEID0gbnVsbDtcbiAgICBsZXQgc3dlZXBJRCA9IG51bGw7XG4gICAgZm9yIChsZXQgW21hdHRlcnRhZ0lELCBtYXR0ZXJ0YWdEYXRhXSBvZiB0aGlzLmRpY3Rpb25uYXJ5VGFncykge1xuICAgICAgaWYgKG1hdHRlcnRhZ0RhdGEuZWxlbWVudElEID09PSBlbGVtZW50SUQpIHtcbiAgICAgICAgdGFnSUQgPSBtYXR0ZXJ0YWdJRDtcbiAgICAgICAgY29uc3Qgc3dlZXAgPSBtYXR0ZXJ0YWdEYXRhLmdldFN3ZWVwSUQoKTtcbiAgICAgICAgaWYgKHN3ZWVwICYmIHN3ZWVwcykge1xuICAgICAgICAgIC8vIHN3ZWVwIGlzIGEgdXVpZDsgc3dlZXBzIGFycmF5IGNvbnRhaW5zIHNpZHMg4oCTIGNoZWNrIGJvdGggZm9ybWF0c1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkU2lkID0gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5yZXNvbHZlU3dlZXBTaWQoc3dlZXApO1xuICAgICAgICAgIGlmIChzd2VlcHMuaW5jbHVkZXMoc3dlZXApIHx8IHN3ZWVwcy5pbmNsdWRlcyhyZXNvbHZlZFNpZCkpIHtcbiAgICAgICAgICAgIHN3ZWVwSUQgPSBzd2VlcDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgdGFnOiB0YWdJRCwgc3dlZXA6IHN3ZWVwSUQgfTtcbiAgfVxuXG4gIC8qKiBSZXRyaWV2ZXMgdGhlIGZsb29yIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIGEgdGFnIGJhc2VkIG9uIGl0cyBzd2VlcCBkYXRhLlxuICAgKiAgSGFuZGxlcyBib3RoIHRoZSBvYmplY3QgZm9ybSAoeyBmbG9vckluZm86IHsgaWQsIHNlcXVlbmNlIH0sIGZsb29yOiB7IGlkIH0gfSlcbiAgICogIGFuZCB0aGUgcHJpbWl0aXZlIGZvcm0gKGZsb29yOiBudW1iZXIpIHVzZWQgYnkgTWF0dGVycG9ydCBTREsgdjMuXG4gICAqL1xuICBnZXRGbG9vcklkRm9yVGFnKG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEsIHN3ZWVwQ29sbGVjdGlvbjogYW55KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3Qgc3dlZXBJZCA9IG1hdHRlcnRhZ0RhdGEuZ2V0U3dlZXBJRCgpO1xuICAgIGlmICghc3dlZXBJZCB8fCAhc3dlZXBDb2xsZWN0aW9uKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHN3ZWVwRGF0YSA9IHN3ZWVwQ29sbGVjdGlvbltzd2VlcElkXTtcbiAgICBpZiAoIXN3ZWVwRGF0YSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBTREsgdjM6IHN3ZWVwLmZsb29yIGlzIGEgcHJpbWl0aXZlIG51bWJlciAodGhlIHNlcXVlbmNlIGluZGV4KVxuICAgIGlmICh0eXBlb2Ygc3dlZXBEYXRhLmZsb29yID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHN3ZWVwRGF0YS5mbG9vci50b1N0cmluZygpO1xuICAgIH1cblxuICAgIC8vIE9sZGVyIC8gZXh0ZW5kZWQgZm9ybWF0c1xuICAgIHJldHVybiBzd2VlcERhdGE/LmZsb29ySW5mbz8uaWRcbiAgICAgID8/IHN3ZWVwRGF0YT8uZmxvb3JJbmZvPy5zZXF1ZW5jZT8udG9TdHJpbmcoKVxuICAgICAgPz8gc3dlZXBEYXRhPy5mbG9vcklkXG4gICAgICA/PyBzd2VlcERhdGE/LmZsb29yPy5pZFxuICAgICAgPz8gc3dlZXBEYXRhPy5mbG9vcj8uc2VxdWVuY2U/LnRvU3RyaW5nKClcbiAgICAgID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogSW5qZWN0cyBjdXN0b20gSFRNTCBvciBmYWxsYmFjayBiaWxsYm9hcmQgbWVkaWEgaW50byBhIE1hdHRlcnRhZyBzYW5kYm94LlxuICAgKiBBdHRhY2hlcyBldmVudCBsaXN0ZW5lcnMgZm9yIGludGVyYWN0aXZlIGVsZW1lbnRzIHdpdGhpbiB0aGUgdGFnLlxuICAgKi9cbiAgYXN5bmMgaW5qZWN0SHRtbEluVGFnKHNkazogYW55LCB0YWdUeXBlOiBQb2lUeXBlLCBvYmplY3Q6IERiT2JqZWN0VHlwZSwgdGFnSUQ6IHN0cmluZykge1xuICAgIGlmICghdGhpcy50YWdTZXJ2aWNlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIHRhZ1NlcnZpY2UgaXMgbm90IGluaXRpYWxpemVkLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgbGV0IGh0bWwgPSBhd2FpdCB0aGlzLnRhZ1NlcnZpY2UuZ2V0SHRtbFRvSW5qZWN0KHRhZ1R5cGUsIG9iamVjdCk7XG5cbiAgICAgIGlmIChodG1sICYmIGh0bWwudHJpbSgpLmxlbmd0aCA+IDAgJiYgc2RrKSB7XG4gICAgICAgIGNvbnN0IHNjcmlwdFRhZyA9IHRoaXMudGFnU2VydmljZS5nZXRTY3JpcHRGb3JUYWcob2JqZWN0LCB0YWdUeXBlKTtcbiAgICAgICAgaHRtbCArPSBgJHtzY3JpcHRUYWd9YDtcblxuICAgICAgICBjb25zdCB0YWdNb2R1bGUgPSB0aGlzLmdldFRhZ01vZHVsZShzZGssIHRhZ0lEKTtcbiAgICAgICAgY29uc3QgW3NhbmRib3hJZCwgbWVzc2VuZ2VyXSA9IGF3YWl0IHNkay5UYWcucmVnaXN0ZXJTYW5kYm94KGh0bWwpO1xuXG4gICAgICAgIGNvbnN0IGF0dGFjaG1lbnRJRCA9IHRoaXMudGFnc0F0dGFjaG1lbnRzW3RhZ0lEXTtcbiAgICAgICAgaWYgKGF0dGFjaG1lbnRJRCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0YWdNb2R1bGUuZGV0YWNoKHRhZ0lELCBhdHRhY2htZW50SUQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50YWdzQXR0YWNobWVudHNbdGFnSURdID0gc2FuZGJveElkO1xuICAgICAgICBhd2FpdCB0YWdNb2R1bGUuYXR0YWNoKHRhZ0lELCBzYW5kYm94SWQpO1xuXG4gICAgICAgIC8vIEF0dGFjaCB0aGUgXCJWaWV3IGluZm9ybWF0aW9uc1wiIGhhbmRsZXIgaW4gdG9vbHRpcFxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLkRFVEFJTF9DTElDSywgdGhpcy50YWdTZXJ2aWNlLm9uQWN0aW9uRGV0YWlsQ2xpY2suYmluZCh0aGlzLnRhZ1NlcnZpY2UpKTtcbiAgICAgICAgbWVzc2VuZ2VyLm9uKFRhZ0FjdGlvbi5USUNLRVRfQ0xJQ0ssIHRoaXMudGFnU2VydmljZS5vbkFjdGlvbkRldGFpbENsaWNrLmJpbmQodGhpcy50YWdTZXJ2aWNlKSk7XG4gICAgICAgIG1lc3Nlbmdlci5vbihUYWdBY3Rpb24uQVVESU9fQ0xJQ0ssIChhdWRpb0NvbW1lbnRJRDogc3RyaW5nKSA9PiB0aGlzLnRhZ1NlcnZpY2Uub25BY3Rpb25BdWRpb0NsaWNrKGF1ZGlvQ29tbWVudElEKSk7XG4gICAgICAgIG1lc3Nlbmdlci5vbihUYWdBY3Rpb24uVklERU9fQ0xJQ0ssICh2aWRlb1VybDogc3RyaW5nKSA9PiB0aGlzLnRhZ1NlcnZpY2Uub25BY3Rpb25WaWRlb0NsaWNrKHZpZGVvVXJsKSk7XG4gICAgICAgIG1lc3Nlbmdlci5vbihUYWdBY3Rpb24uSU1BR0VfQ0xJQ0ssIChpbWFnZUNvbW1lbnRJRDogc3RyaW5nKSA9PiB0aGlzLnRhZ1NlcnZpY2Uub25BY3Rpb25JbWFnZUNsaWNrKGltYWdlQ29tbWVudElEKSk7XG4gICAgICAgIG1lc3Nlbmdlci5vbihUYWdBY3Rpb24uRE9DX0NMSUNLLCAoZG9jVXJsOiBzdHJpbmcpID0+IHRoaXMudGFnU2VydmljZS5vbkFjdGlvbkRvY0NsaWNrKGRvY1VybCkpO1xuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLllPVVRVQkVfQ0xJQ0ssICh5b3V0dWJlVXJsOiBzdHJpbmcpID0+IHRoaXMudGFnU2VydmljZS5vbkFjdGlvbllvdXR1YmVDbGljayh5b3V0dWJlVXJsKSk7XG4gICAgICB9IGVsc2UgaWYgKHNkaykge1xuICAgICAgICBjb25zdCB7IGNvbW1lbnQsIHRhZ0Rlc2NyaXB0aW9uIH0gPSB0aGlzLnRhZ1NlcnZpY2UuZ2V0QmlsbGJvYXJkTWVkaWFUb0VtYmVkKG9iamVjdCk7XG5cbiAgICAgICAgaWYgKGNvbW1lbnQpIHtcbiAgICAgICAgICBjb25zdCB0YWdNb2R1bGUgPSB0aGlzLmdldFRhZ01vZHVsZShzZGssIHRhZ0lEKTtcbiAgICAgICAgICAvLyAxKSBSZWdpc3RlciB0aGUgbWVkaWEgYXR0YWNobWVudCBieSBwYXNzaW5nIHRoZSBVUkwgc3RyaW5nKHMpLlxuICAgICAgICAgIC8vICAgIHJlZ2lzdGVyQXR0YWNobWVudCByZXR1cm5zIGFuIGFycmF5IG9mIGF0dGFjaG1lbnQgSURzLlxuICAgICAgICAgIGNvbnN0IFthdHRhY2htZW50SURdID0gYXdhaXQgc2RrLlRhZy5yZWdpc3RlckF0dGFjaG1lbnQoY29tbWVudC5leHRlcm5hbExpbmspO1xuXG4gICAgICAgICAgLy8gMikgQXR0YWNoIHRoZSByZWdpc3RlcmVkIG1lZGlhIHRvIHRoZSB0YWcuXG4gICAgICAgICAgYXdhaXQgdGFnTW9kdWxlLmF0dGFjaCh0YWdJRCwgYXR0YWNobWVudElEKTtcblxuICAgICAgICAgIC8vIDMpIERldGVybWluZSBtZWRpYSB0eXBlIGZvciB0aGUgYmlsbGJvYXJkIChQSE9UTyBvciBWSURFTykuXG4gICAgICAgICAgLy8gICAgVXNlIGEgc2ltcGxlIGhldXJpc3RpYzogWW91VHViZS9WaW1lbyAtPiBWSURFTywgb3RoZXJ3aXNlIFBIT1RPLlxuICAgICAgICAgIC8vICAgIFRoZSBTREsgZXhwb3NlcyBNZWRpYVR5cGUgb24gdGhlIFRhZyBuYW1lc3BhY2UuXG4gICAgICAgICAgY29uc3QgaXNWaWRlbyA9IC95b3V0dWJlXFwuY29tfHlvdXR1XFwuYmV8dmltZW9cXC5jb20vaS50ZXN0KGNvbW1lbnQuZXh0ZXJuYWxMaW5rKTtcbiAgICAgICAgICBjb25zdCBtZWRpYVR5cGUgPSBpc1ZpZGVvID8gc2RrLk1hdHRlcnRhZy5NZWRpYVR5cGUuVklERU8gOiBzZGsuTWF0dGVydGFnLk1lZGlhVHlwZS5QSE9UTztcblxuICAgICAgICAgIC8vIDQpIFVwZGF0ZSB0aGUgYmlsbGJvYXJkIHRleHQgYW5kIG1lZGlhIHVzaW5nIGVkaXRCaWxsYm9hcmQuXG4gICAgICAgICAgLy8gICAgZWRpdEJpbGxib2FyZCBhY2NlcHRzIFBhcnRpYWw8VGFnLkVkaXRhYmxlUHJvcGVydGllcz4gc3VjaCBhcyBsYWJlbCwgZGVzY3JpcHRpb24sIG1lZGlhLlxuICAgICAgICAgIGF3YWl0IHRhZ01vZHVsZS5lZGl0QmlsbGJvYXJkKHRhZ0lELCB7XG4gICAgICAgICAgICBsYWJlbDogb2JqZWN0LnRpdGxlIHx8ICdNZWRpYScsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGFnRGVzY3JpcHRpb24gfHwgJycsXG4gICAgICAgICAgICBtZWRpYToge1xuICAgICAgICAgICAgICB0eXBlOiBtZWRpYVR5cGUsXG4gICAgICAgICAgICAgIHNyYzogY29tbWVudC5leHRlcm5hbExpbmssXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gNSkgS2VlcCBhIGxvY2FsIHJlZmVyZW5jZVxuICAgICAgICAgIHRoaXMudGFnc0F0dGFjaG1lbnRzW3RhZ0lEXSA9IHtcbiAgICAgICAgICAgIGF0dGFjaG1lbnRJRCxcbiAgICAgICAgICAgIHRpdGxlOiBvYmplY3QudGl0bGUgfHwgJ01lZGlhJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0YWdEZXNjcmlwdGlvbiB8fCAnJyxcbiAgICAgICAgICAgIG1lZGlhU3JjOiBjb21tZW50LmV4dGVybmFsTGluayxcbiAgICAgICAgICAgIG1lZGlhVHlwZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tNYXR0ZXJwb3J0VGFnU2VydmljZV0gRXJyb3IgaW4gaW5qZWN0SHRtbEluVGFnOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2xlYXJzIGFsbCBsb2NhbCB0YWcgZGF0YSBhbmQgcmVzZXRzIHRoZSBhZGRpdGlvbiBxdWV1ZS4gKi9cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuY2xlYXIoKTtcbiAgICB0aGlzLnRhZ3NDdXJyZW50T3BhY2l0eS5jbGVhcigpO1xuICAgIHRoaXMudGFnc0N1cnJlbnRFbmFibGVkLmNsZWFyKCk7XG4gICAgdGhpcy50YWdBZGRRdWV1ZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIHRoaXMubWF0dGVydGFnVG9Gb2xsb3cgPSBudWxsO1xuICAgIHRoaXMubWF0dGVydGFnSURzID0gW107XG4gICAgLy8gQSBuZXcgc3BhY2UgbWVhbnMgYSBuZXcgU0RLIHNlc3Npb24sIGhlbmNlIGEgbmV3IHNoYXJlZCBsYXllciB0byBjcmVhdGUuXG4gICAgdGhpcy5zaGFyZWRUYWdMYXllciA9IG51bGw7XG4gICAgdGhpcy5zaGFyZWRUYWdMYXllclByb21pc2UgPSBudWxsO1xuICB9XG59XG4iXX0=