@smarterplan/ngx-smarterplan-core 1.4.21 → 1.4.22
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.
- package/README.md +24 -24
- package/esm2022/lib/components/csv-export/csv-export.component.mjs +3 -3
- package/esm2022/lib/components/loader/loader.component.mjs +3 -3
- package/esm2022/lib/components/menu-bar/avatar/avatar.component.mjs +1 -1
- package/esm2022/lib/components/menu-bar/menu-bar.component.mjs +3 -3
- package/esm2022/lib/components/menu-bar/navigation-bar/navigation-bar.component.mjs +3 -3
- package/esm2022/lib/components/modal-switch-visit/modal-switch-visit.component.mjs +3 -3
- package/esm2022/lib/components/search-bar/search-bar.component.mjs +3 -3
- package/esm2022/lib/components/splat-viewer/splat-viewer.component.mjs +361 -0
- package/esm2022/lib/components/support-modal/support-modal.component.mjs +3 -3
- package/esm2022/lib/config.mjs +1 -1
- package/esm2022/lib/helpers.service.mjs +1 -1
- package/esm2022/lib/matterport-extensions/nest-thermostat/CanvasImage.mjs +1 -1
- package/esm2022/lib/matterport-extensions/nest-thermostat/CanvasRenderer.mjs +1 -1
- package/esm2022/lib/matterport-extensions/nest-thermostat/NestThermostat.mjs +1 -1
- package/esm2022/lib/matterport-extensions/nest-thermostat/PlaneRenderer.mjs +1 -1
- package/esm2022/lib/matterport-extensions/scene-component/SceneComponent.mjs +1 -1
- package/esm2022/lib/matterport-extensions/security-camera/SecurityCamera.mjs +22 -22
- package/esm2022/lib/matterport-extensions/tv-player/TvPlayer.mjs +1 -1
- package/esm2022/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.mjs +22 -22
- package/esm2022/lib/mattertagData.mjs +1 -1
- package/esm2022/lib/ngx-smarterplan-core.module.mjs +9 -4
- package/esm2022/lib/ngx-smarterplan-core.service.mjs +1 -1
- package/esm2022/lib/pipes/duration-to-string.pipe.mjs +1 -1
- package/esm2022/lib/pipes/format-date-number-to-digits.pipe.mjs +1 -1
- package/esm2022/lib/pipes/hashtag-from-id.pipe.mjs +1 -1
- package/esm2022/lib/pipes/safe-url.pipe.mjs +1 -1
- package/esm2022/lib/pipes/time-date-to-local-string.pipe.mjs +1 -1
- package/esm2022/lib/pipes/username-from-id.pipe.mjs +1 -1
- package/esm2022/lib/services/amplify-cache.service.mjs +1 -1
- package/esm2022/lib/services/base-tab.service.mjs +1 -1
- package/esm2022/lib/services/baseVisibility.service.mjs +1 -1
- package/esm2022/lib/services/content.service.mjs +1 -1
- package/esm2022/lib/services/filter.service.mjs +1 -1
- package/esm2022/lib/services/intervention.service.mjs +1 -1
- package/esm2022/lib/services/locale.service.mjs +1 -1
- package/esm2022/lib/services/matterport-import.service.mjs +1 -1
- package/esm2022/lib/services/matterport-measurement.service.mjs +1 -1
- package/esm2022/lib/services/matterport-navigation.service.mjs +1 -1
- package/esm2022/lib/services/matterport-pointer.service.mjs +6 -6
- package/esm2022/lib/services/matterport-tag-copy.service.mjs +1 -1
- package/esm2022/lib/services/matterport-tag.service.mjs +12 -7
- package/esm2022/lib/services/matterport.service.mjs +17 -17
- package/esm2022/lib/services/models/affectation.service.mjs +1 -1
- package/esm2022/lib/services/models/base-object.service.mjs +1 -1
- package/esm2022/lib/services/models/capture.service.mjs +1 -1
- package/esm2022/lib/services/models/comment.service.mjs +1 -1
- package/esm2022/lib/services/models/domain.service.mjs +1 -1
- package/esm2022/lib/services/models/equipment.service.mjs +1 -1
- package/esm2022/lib/services/models/event.service.mjs +1 -1
- package/esm2022/lib/services/models/feature.service.mjs +1 -1
- package/esm2022/lib/services/models/hashtag.service.mjs +1 -1
- package/esm2022/lib/services/models/layer.service.mjs +1 -1
- package/esm2022/lib/services/models/measurement.service.mjs +1 -1
- package/esm2022/lib/services/models/mission.service.mjs +1 -1
- package/esm2022/lib/services/models/navigation.service.mjs +1 -1
- package/esm2022/lib/services/models/node.service.mjs +1 -1
- package/esm2022/lib/services/models/object3D.service.mjs +1 -1
- package/esm2022/lib/services/models/operation.service.mjs +1 -1
- package/esm2022/lib/services/models/organisation.service.mjs +1 -1
- package/esm2022/lib/services/models/plan.service.mjs +1 -1
- package/esm2022/lib/services/models/poi.service.mjs +27 -27
- package/esm2022/lib/services/models/profile.service.mjs +1 -1
- package/esm2022/lib/services/models/property.service.mjs +1 -1
- package/esm2022/lib/services/models/space.service.mjs +1 -1
- package/esm2022/lib/services/models/template.service.mjs +1 -1
- package/esm2022/lib/services/models/ticket.service.mjs +1 -1
- package/esm2022/lib/services/models/visit.service.mjs +1 -1
- package/esm2022/lib/services/models/zone.service.mjs +1 -1
- package/esm2022/lib/services/navigator.service.mjs +1 -1
- package/esm2022/lib/services/obj-to-glb.mjs +649 -0
- package/esm2022/lib/services/s3.service.mjs +43 -3
- package/esm2022/lib/services/search.service.mjs +1 -1
- package/esm2022/lib/services/support.service.mjs +1 -1
- package/esm2022/lib/services/sweep-locator.service.mjs +1 -1
- package/esm2022/lib/services/tag.service.mjs +16 -16
- package/esm2022/lib/services/threejs-import.service.mjs +6 -4
- package/esm2022/lib/services/threejs.service.mjs +867 -95
- package/esm2022/lib/services/user.service.mjs +1 -1
- package/esm2022/lib/services/utils/matterport-transform.util.mjs +1 -1
- package/esm2022/lib/services/validators.service.mjs +1 -1
- package/esm2022/lib/services/viewer.service.mjs +189 -7
- package/esm2022/lib/services/zone-drawer.service.mjs +1 -1
- package/esm2022/lib/services/zoneChange.service.mjs +1 -1
- package/esm2022/lib/tokens/matterport-sdk-key.token.mjs +1 -1
- package/esm2022/lib/validators/email.directive.mjs +1 -1
- package/esm2022/lib/validators/no-empty.directive.mjs +1 -1
- package/esm2022/lib/validators/number.directive.mjs +1 -1
- package/esm2022/lib/validators/text.directive.mjs +1 -1
- package/esm2022/public-api.mjs +3 -1
- package/fesm2022/smarterplan-ngx-smarterplan-core.mjs +2239 -233
- package/fesm2022/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
- package/lib/components/splat-viewer/splat-viewer.component.d.ts +98 -0
- package/lib/ngx-smarterplan-core.module.d.ts +7 -6
- package/lib/services/matterport-tag.service.d.ts +5 -5
- package/lib/services/obj-to-glb.d.ts +66 -0
- package/lib/services/s3.service.d.ts +7 -0
- package/lib/services/threejs.service.d.ts +336 -16
- package/lib/services/viewer.service.d.ts +110 -8
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
- package/src/assets/viewers/splat/chunk-BYLI4YBI.js +17037 -0
- package/src/assets/viewers/splat/chunk-LDV6YPMG.js +1 -0
- package/src/assets/viewers/splat/chunk-WZ5Z4TU3.js +105719 -0
- package/src/assets/viewers/splat/convert-4DRLH77X.js +1 -0
- package/src/assets/viewers/splat/convert.html +11 -0
- package/src/assets/viewers/splat/converter-SLBB5MHG.js +1 -0
- package/src/assets/viewers/splat/index.html +90 -0
- package/src/assets/viewers/splat/spz-DEYRea_v-QE6YSGIB.js +5292 -0
- package/src/assets/viewers/splat/viewer-W4X3FWQJ.js +2704 -0
- package/src/assets/viewers/splat/viewer.css +1096 -0
- package/src/assets/viewers/splat/webp.wasm +0 -0
- package/src/assets/viewers/splat/worker.mjs +1383 -0
- package/src/assets/vs-app.json +67 -67
|
@@ -863,22 +863,22 @@ export class MatterportService {
|
|
|
863
863
|
);
|
|
864
864
|
}*/
|
|
865
865
|
addCustomCss() {
|
|
866
|
-
const css = `
|
|
867
|
-
.footer-ui,
|
|
868
|
-
.showcase-footer,
|
|
869
|
-
.mp-nova-btn-group,
|
|
870
|
-
.footer-divider,
|
|
871
|
-
.logo-link,
|
|
872
|
-
.footer-logo,
|
|
873
|
-
.bottom-ui,
|
|
874
|
-
img.logo-image,
|
|
875
|
-
img[class^="logo-image"],
|
|
876
|
-
img[class*=" logo-image"],
|
|
877
|
-
[data-testid="showcase-footer"] {
|
|
878
|
-
opacity: 0 !important;
|
|
879
|
-
visibility: hidden !important;
|
|
880
|
-
pointer-events: none !important;
|
|
881
|
-
}
|
|
866
|
+
const css = `
|
|
867
|
+
.footer-ui,
|
|
868
|
+
.showcase-footer,
|
|
869
|
+
.mp-nova-btn-group,
|
|
870
|
+
.footer-divider,
|
|
871
|
+
.logo-link,
|
|
872
|
+
.footer-logo,
|
|
873
|
+
.bottom-ui,
|
|
874
|
+
img.logo-image,
|
|
875
|
+
img[class^="logo-image"],
|
|
876
|
+
img[class*=" logo-image"],
|
|
877
|
+
[data-testid="showcase-footer"] {
|
|
878
|
+
opacity: 0 !important;
|
|
879
|
+
visibility: hidden !important;
|
|
880
|
+
pointer-events: none !important;
|
|
881
|
+
}
|
|
882
882
|
`;
|
|
883
883
|
// 1st method: Via Scene SDK
|
|
884
884
|
if (this.sdk?.Scene?.addStyle) {
|
|
@@ -1747,4 +1747,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
1747
1747
|
type: Inject,
|
|
1748
1748
|
args: [MATTERPORT_SDK_KEY]
|
|
1749
1749
|
}] }, { type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.BaseVisibilityService }, { type: i0.NgZone }, { type: i3.MatterportMeasurementService }, { type: i4.MatterportNavigationService }, { type: i5.MatterportPointerService }, { type: i6.MatterportObject3DService }, { type: i7.MatterportTagService }] });
|
|
1750
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9tYXR0ZXJwb3J0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHNCQUFzQixFQUFFLDRCQUE0QixFQUFFLFdBQVcsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzFJLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFxQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFeEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQ0wsZUFBZSxFQUNmLElBQUksRUFDTCxNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBRUwsV0FBVyxFQUlYLG1CQUFtQixFQUluQixrQkFBa0IsRUFNbEIsT0FBTyxFQUVQLFFBQVEsRUFDUixrQkFBa0IsR0FDbkIsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7Ozs7OztBQTRCMUIsNkZBQTZGO0FBQzdGLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO0FBS2xGLE1BQU0sT0FBTyxpQkFBaUI7SUFzUW1CO0lBQ3JDO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQTdRSCxHQUFHLENBQU07SUFFUixTQUFTLENBQU07SUFFdkIsa0JBQWtCO0lBQ1YsY0FBYyxDQUFNO0lBRXJCLFVBQVUsQ0FBK0M7SUFFekQsa0JBQWtCLEdBQVEsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUs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QUMsQ0FBQyxJQUFJLENBQUM7UUFDNUMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN2QixPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7WUFDdEQsR0FBRyxFQUFFLElBQUk7WUFDVCxhQUFhLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDaEcsQ0FBQztJQUNKLENBQUM7d0dBaGlFVSxpQkFBaUIsa0JBcVFsQixRQUFRLGFBQ1Isa0JBQWtCOzRHQXRRakIsaUJBQWlCLGNBRmhCLE1BQU07OzRGQUVQLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQXNRSSxNQUFNOzJCQUFDLFFBQVE7OzBCQUNmLE1BQU07MkJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29tcHV0ZUZyYW1pbmdSb3RhdGlvbiwgcGlja05lYXJlc3RTd2VlcE9uU2FtZVN0b3JleSwgc3dlZXBGbG9vclksIHZpc2libGVDZW50ZXJTY3JlZW5YIH0gZnJvbSAnLi91dGlscy9tYXR0ZXJwb3J0LWZyYW1pbmcudXRpbCc7XHJcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgTmdab25lLCBPbkRlc3Ryb3ksIGlzRGV2TW9kZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNQVRURVJQT1JUX1NES19LRVkgfSBmcm9tICcuLi90b2tlbnMvbWF0dGVycG9ydC1zZGsta2V5LnRva2VuJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtcclxuICBwb2lUeXBlVG9TdHJpbmcsXHJcbiAgd2FpdFxyXG59IGZyb20gJy4uL2hlbHBlcnMuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hdHRlcnRhZ0RhdGEgfSBmcm9tICcuLi9tYXR0ZXJ0YWdEYXRhJztcclxuaW1wb3J0IHtcclxuICBEYk9iamVjdFR5cGUsXHJcbiAgRmVhdHVyZVR5cGUsXHJcbiAgR2l6bW9Nb2RlLFxyXG4gIEdpem1vU25hcCxcclxuICBJT2JqZWN0M0QsXHJcbiAgTWF0dGVydGFnQWN0aW9uTW9kZSxcclxuICBNYXR0ZXJwb3J0U3Vic2NyaXB0aW9uLFxyXG4gIE1hdHRlcnBvcnRWaWV3LFxyXG4gIE1hdHRlcnBvcnRWaWV3Q29sbGVjdGlvbixcclxuICBNYXR0ZXJwb3J0Vmlld1R5cGUsXHJcbiAgT2JqZWN0M0RCb3VuZGluZ0JveCxcclxuICBPYmplY3QzRFBsYWNlbWVudFJlc3VsdCxcclxuICBPYmplY3QzRFRyYW5zZm9ybSxcclxuICBPYmplY3QzRFRyYW5zZm9ybUNoYW5nZSxcclxuICBQT0ksXHJcbiAgUG9pVHlwZSxcclxuICBQb2ludDNELFxyXG4gIFNwTW9kdWxlLFxyXG4gIFZpZXdlckludGVyYWN0aW9ucyxcclxufSBmcm9tICcuLi90eXBlcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFzZVRhZ1NlcnZpY2UgfSBmcm9tICcuL3RhZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFzZVZpc2liaWxpdHlTZXJ2aWNlIH0gZnJvbSAnLi9iYXNlVmlzaWJpbGl0eS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnJztcclxuaW1wb3J0IHsgQ2FtZXJhTW9kZSB9IGZyb20gJy4uL3R5cGVzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNYXR0ZXJwb3J0TWVhc3VyZW1lbnRTZXJ2aWNlIH0gZnJvbSAnLi9tYXR0ZXJwb3J0LW1lYXN1cmVtZW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNYXR0ZXJwb3J0TmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICcuL21hdHRlcnBvcnQtbmF2aWdhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWF0dGVycG9ydFBvaW50ZXJTZXJ2aWNlIH0gZnJvbSAnLi9tYXR0ZXJwb3J0LXBvaW50ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hdHRlcnBvcnRPYmplY3QzRFNlcnZpY2UgfSBmcm9tICcuL21hdHRlcnBvcnQtb2JqZWN0M2Quc2VydmljZSc7XHJcbmltcG9ydCB7IE1hdHRlcnBvcnRUYWdTZXJ2aWNlIH0gZnJvbSAnLi9tYXR0ZXJwb3J0LXRhZy5zZXJ2aWNlJztcclxuXHJcbi8qKlxyXG4gKiBDdXN0b20gVGhyZWVqcyBPYmplY3QgM0QgaW50ZXJmYWNlXHJcbiAqL1xyXG5pbnRlcmZhY2UgVGhyZWVKU09iamVjdDNEIHtcclxuICBpZDogc3RyaW5nO1xyXG4gIHV1aWQ/OiBzdHJpbmc7XHJcbiAgcG9zaXRpb24/OiB7IHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIgfVxyXG4gIHJvdGF0aW9uPzogeyB4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyIH1cclxuICBzY2FsZT86IHsgeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlciB9XHJcbn1cclxuXHJcbmRlY2xhcmUgZ2xvYmFsIHtcclxuICBpbnRlcmZhY2UgV2luZG93IHtcclxuICAgIE1QX1NESzogeyBjb25uZWN0OiBGdW5jdGlvbiB9O1xyXG4gIH1cclxufVxyXG5cclxuLyoqIFBvaW50ZXIgaW50ZXJzZWN0aW9ucyBhIDNEIG9iamVjdCBjYW4gYmUgcGxhY2VkIG9uIChQb2ludGVyLkNvbGxpZGVycyBNT0RFTCBhbmQgU1dFRVApICovXHJcbmNvbnN0IFBMQUNFTUVOVF9TVVJGQUNFUyA9IFsnaW50ZXJzZWN0ZWRvYmplY3QubW9kZWwnLCAnaW50ZXJzZWN0ZWRvYmplY3Quc3dlZXAnXTtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYXR0ZXJwb3J0U2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG4gIHB1YmxpYyBzZGs6IGFueTtcclxuXHJcbiAgcHJpdmF0ZSBjb250YWluZXI6IGFueTtcclxuXHJcbiAgLy8gUG9zaXRpb24gY2FtZXJhXHJcbiAgcHJpdmF0ZSBwb3NlTWF0dGVycG9ydDogYW55O1xyXG5cclxuICBwdWJsaWMgcG9zZUNhbWVyYTogeyByb3RhdGlvbjogYW55OyBwb3NpdGlvbjogYW55OyBzd2VlcDogYW55IH07XHJcblxyXG4gIHB1YmxpYyBsYXN0Q2FtZXJhUG9zaXRpb246IGFueSA9IHsgeDogMC4wLCB5OiAwLjAsIHo6IDAuMCB9O1xyXG5cclxuICBwcml2YXRlIGlzTWVhc3VyZU1vZGVPbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGludGVyYWN0aW9uTW9kZTogbnVtYmVyID0gVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFQ7XHJcblxyXG4gIHByaXZhdGUgY2FtZXJhTW9kZTogc3RyaW5nID0gJ0lOU0lERSc7XHJcblxyXG4gIC8qKiBFbWl0dGVkIHdoZW4gYSBwbGFjZW1lbnQgKHRhZyBmb2xsb3dpbmcgdGhlIGN1cnNvciwgb3IgM0Qgb2JqZWN0IHByZXZpZXcpIGlzIGNhbmNlbGxlZCBieSByaWdodCBjbGljayBvciBFc2NhcGUgKi9cclxuICBwdWJsaWMgcmVhZG9ubHkgcGxhY2VtZW50Q2FuY2VsbGVkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIC8qKiBQZW5kaW5nIGludGVyYWN0aXZlIHBsYWNlbWVudCBvZiBhIDNEIG9iamVjdCAoc2VlIHN0YXJ0T2JqZWN0M0RQbGFjZW1lbnQpICovXHJcbiAgcHJpdmF0ZSBvYmplY3QzRFBsYWNlbWVudDoge1xyXG4gICAgdXVpZDogc3RyaW5nO1xyXG4gICAgcmVzb2x2ZTogKHJlc3VsdDogT2JqZWN0M0RQbGFjZW1lbnRSZXN1bHQgfCBudWxsKSA9PiB2b2lkO1xyXG4gICAgbGFzdFBvaW50OiBQb2ludDNEIHwgbnVsbDtcclxuICAgIGxhc3ROb3JtYWw6IFBvaW50M0QgfCBudWxsO1xyXG4gICAgLyoqIHNlZSBwbGFjZU9iamVjdDNET25TdXJmYWNlICovXHJcbiAgICBmcm9udFlhd09mZnNldDogbnVtYmVyO1xyXG4gIH0gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqIFN3ZWVwcyBzbmFwc2hvdCB0YWtlbiB3aGVuIG5hdmlnYXRpb24gaXMgbG9ja2VkIChkaXNhYmxlZCBzd2VlcHMgdmFuaXNoIGZyb20gU3dlZXAuZGF0YSkgKi9cclxuICBwcml2YXRlIGxvY2tlZFN3ZWVwc1NuYXBzaG90OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZXJ5IHN3ZWVwIHNlZW4gaW4gU3dlZXAuZGF0YS4gQWZ0ZXIgYW4gdW5sb2NrIHRoZSBTREsgcmUtZW1pdHMgdGhlIHJlLWVuYWJsZWQgc3dlZXBzIGxpdHRsZSBieVxyXG4gICAqIGxpdHRsZTogYSBsb2NrIGFza2VkIG1lYW53aGlsZSBtdXN0IHN0aWxsIGtub3cgYWxsIG9mIHRoZW0gKGl0IGZvdW5kIG5vdGhpbmcgdG8gZGlzYWJsZSkuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBrbm93blN3ZWVwczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xyXG5cclxuICBwcml2YXRlIGtleWRvd25UYXJnZXRzOiB7IHRhcmdldDogRXZlbnRUYXJnZXQ7IGhhbmRsZXI6IChlOiBFdmVudCkgPT4gdm9pZCB9W10gPSBbXTtcclxuXHJcbiAgcHVibGljIGdldCBtYXR0ZXJ0YWdJRHMoKTogQXJyYXk8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5tYXR0ZXJ0YWdJRHM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IG1hdHRlcnRhZ0lEcyh2YWx1ZTogQXJyYXk8c3RyaW5nPikge1xyXG4gICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5tYXR0ZXJ0YWdJRHMgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZGljdGlvbm5hcnlUYWdzKCk6IE1hcDxzdHJpbmcsIE1hdHRlcnRhZ0RhdGE+IHtcclxuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmRpY3Rpb25uYXJ5VGFncztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZGljdGlvbm5hcnlPYmplY3RzM0QoKTogTWFwPHN0cmluZywgYW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UuZGljdGlvbm5hcnlPYmplY3RzM0Q7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGRpY3Rpb25uYXJ5U2NlbmVPYmplY3RzM0QoKTogTWFwPHN0cmluZywgYW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UuZGljdGlvbm5hcnlTY2VuZU9iamVjdHMzRDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgdGhyZWVKU1NjZW5lKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UudGhyZWVKU1NjZW5lO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCB0aHJlZUpTU2NlbmUodmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy5vYmplY3QzRFNlcnZpY2UudGhyZWVKU1NjZW5lID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGF6aW11dGhhbENyb3duKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UuYXppbXV0aGFsQ3Jvd247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGF6aW11dGhhbENyb3duKHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmF6aW11dGhhbENyb3duID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHRhZ3NBdHRhY2htZW50cygpOiBPYmplY3Qge1xyXG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UudGFnc0F0dGFjaG1lbnRzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBzd2VlcHMoKTogQXJyYXk8c3RyaW5nPiB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2Uuc3dlZXBzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBzd2VlcHModmFsdWU6IEFycmF5PHN0cmluZz4gfCBudWxsKSB7XHJcbiAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnN3ZWVwcyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBzd2VlcENvbGxlY3Rpb24oKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnN3ZWVwQ29sbGVjdGlvbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgc3dlZXBDb2xsZWN0aW9uKHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2Uuc3dlZXBDb2xsZWN0aW9uID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnRTd2VlcCgpOiBTdWJqZWN0PHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudFN3ZWVwO1xyXG4gIH1cclxuXHJcbiAgLy9jYW1lcmEgcG9zaXRpb24gd2l0aCByb3RhdGlvblxyXG4gIHB1YmxpYyBjdXJyZW50Q2FtZXJhUG9zZTogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgcHVibGljIGdldCBmbG9vcnMoKTogQXJyYXk8eyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHNlcXVlbmNlOiBudW1iZXIgfT4gfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmZsb29ycztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgZmxvb3JzKHZhbHVlOiBBcnJheTx7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgc2VxdWVuY2U6IG51bWJlciB9PiB8IG51bGwpIHtcclxuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZmxvb3JzID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jdXJyZW50U3BhY2VJRDogc3RyaW5nO1xyXG5cclxuICBwdWJsaWMgZ2V0IGxhc3RPYmplY3QzRCgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmxhc3RPYmplY3QzRDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgbGFzdE9iamVjdDNEKHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmxhc3RPYmplY3QzRCA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXJyZW50Um9vbXMoKTogYW55W10ge1xyXG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudFJvb21zO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBjdXJyZW50Um9vbXModmFsdWU6IGFueVtdKSB7XHJcbiAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRSb29tcyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXJyZW50U3BhY2VJRCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRTcGFjZUlEO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBjdXJyZW50U3BhY2VJRCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9jdXJyZW50U3BhY2VJRCA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBmb3JiaWRkZW5Td2VlcHMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZm9yYmlkZGVuU3dlZXBzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBmb3JiaWRkZW5Td2VlcHModmFsdWU6IHN0cmluZ1tdKSB7XHJcbiAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmZvcmJpZGRlblN3ZWVwcyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRhZ0FjdGlvbjogU3ViamVjdDx7IGFjdGlvbjogc3RyaW5nOyBkYXRhOiBzdHJpbmcgfT4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICAvKiogVmlld3MgKGZ1cm5pc2hlZCwgZGVmdXJuaXNoZWQuLi4pIGV4cG9zZWQgYnkgdGhlIFNESyBmb3IgdGhlIGN1cnJlbnQgc3BhY2UuICovXHJcbiAgcHJpdmF0ZSB2aWV3c0J5VHlwZTogTWFwPE1hdHRlcnBvcnRWaWV3VHlwZSwgTWF0dGVycG9ydFZpZXc+ID0gbmV3IE1hcCgpO1xyXG4gIC8qKiBTZXR0bGVzIG9uY2UgZXZlcnkgc3RhdGljIGljb24gdGV4dHVyZSBoYXMgYmVlbiByZWdpc3RlcmVkIChvciBmYWlsZWQpLiAqL1xyXG4gIHByaXZhdGUgaWNvbnNSZWdpc3RlcmVkOiBQcm9taXNlPHZvaWQ+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgLyoqIE5hbWVzIG9mIHRoZSB0ZXh0dXJlcyBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZCBpbiB0aGUgY3VycmVudCBTREsgc2Vzc2lvbi4gKi9cclxuICBwcml2YXRlIHJlZ2lzdGVyZWRJY29uczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XHJcbiAgLyoqIHRhZ0lkIC0+IHNpZ25lZCBzb3VyY2UgbGFzdCByZWdpc3RlcmVkIGFzIGEgY3VzdG9tIHRleHR1cmUsIGFuZCBpdHMgdGV4dHVyZSBuYW1lLiAqL1xyXG4gIHByaXZhdGUgY3VzdG9tSWNvbkNhY2hlOiBNYXA8c3RyaW5nLCB7IHNyYzogc3RyaW5nOyBpY29uTmFtZTogc3RyaW5nIH0+ID0gbmV3IE1hcCgpO1xyXG5cclxuICBwcml2YXRlIGN1cnJlbnRWaWV3OiBNYXR0ZXJwb3J0VmlldyB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIHZpZXdTdWJzY3JpcHRpb25zOiBNYXR0ZXJwb3J0U3Vic2NyaXB0aW9uW10gPSBbXTtcclxuXHJcbiAgLyoqIEVtaXRzIHRoZSBhY3RpdmUgdmlldyBldmVyeSB0aW1lIHRoZSB1c2VyIHN3aXRjaGVzIGJldHdlZW4gZnVybmlzaGVkL2RlZnVybmlzaGVkLiAqL1xyXG4gIHB1YmxpYyBvblZpZXdDaGFuZ2VkOiBTdWJqZWN0PE1hdHRlcnBvcnRWaWV3IHwgbnVsbD4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICAvKiogRGVsYXkgbGVmdCB0byB0aGUgU0RLIHRvIHJlYnVpbGQgdGhlIGxheWVyJ3MgdGFncyBhZnRlciBhIHZpZXcgc3dpdGNoLiAqL1xyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFZJRVdfU1dJVENIX1JFRlJFU0hfREVMQVlfTVMgPSA4MDA7XHJcblxyXG4gIHByaXZhdGUgdmlld1N3aXRjaFJlc3RvcmVUaW1lcjogYW55ID0gbnVsbDtcclxuXHJcbiAgcHVibGljIGdldCBtYXR0ZXJ0YWdUb0ZvbGxvdygpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLm1hdHRlcnRhZ1RvRm9sbG93O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBtYXR0ZXJ0YWdUb0ZvbGxvdyh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xyXG4gICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5tYXR0ZXJ0YWdUb0ZvbGxvdyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBpblRyYW5zaXRpb25Nb2RlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuaW5UcmFuc2l0aW9uTW9kZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgaW5UcmFuc2l0aW9uTW9kZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pblRyYW5zaXRpb25Nb2RlID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGluVHJhbnNpdGlvblN3ZWVwKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuaW5UcmFuc2l0aW9uU3dlZXA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGluVHJhbnNpdGlvblN3ZWVwKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmluVHJhbnNpdGlvblN3ZWVwID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG5vTGlnaHRGb3JPYmplY3RzID0gdHJ1ZTtcclxuXHJcbiAgcHVibGljIGdldCBjdXJyZW50Q2FtZXJhTW9kZSgpOiBDYW1lcmFNb2RlIHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRDYW1lcmFNb2RlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBjdXJyZW50Q2FtZXJhTW9kZSh2YWx1ZTogQ2FtZXJhTW9kZSkge1xyXG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Q2FtZXJhTW9kZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBvbkNhbWVyYU1vZGVDaGFuZ2VkKCk6IFN1YmplY3Q8Q2FtZXJhTW9kZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2Uub25DYW1lcmFNb2RlQ2hhbmdlZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgb25Sb29tQ2hhbmdlZCgpOiBTdWJqZWN0PGFueVtdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5vblJvb21DaGFuZ2VkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBvbkdvVG9UYWcoKTogU3ViamVjdDxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLm9uR29Ub1RhZztcclxuICB9XHJcblxyXG4gIHRhZ1NlcnZpY2U6IEJhc2VUYWdTZXJ2aWNlO1xyXG5cclxuICBjb25maWc6IENvbmZpZztcclxuXHJcbiAgU1BNb2R1bGU6IFNwTW9kdWxlO1xyXG5cclxuICBwdWJsaWMgZ2V0IG9iamVjdENvbnRyb2woKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5vYmplY3RDb250cm9sO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBzZWN1cml0eUNhbWVyYUFuaW1hdG9yKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2Uuc2VjdXJpdHlDYW1lcmFBbmltYXRvcjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFjdGlvbnMgb24gbGVmdCBjbGljayB3aGVuIHBvc2l0aW9uaW5nIG1hdHRlcnRhZyBpbiB2aXNpdFxyXG4gICAqL1xyXG4gIHBvaW50ZXJMZWZ0Q2xpY2tIYW5kbGVyID0gKGV2dDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgaWYgKHRoaXMub2JqZWN0M0RQbGFjZW1lbnQpIHtcclxuICAgICAgdGhpcy52YWxpZGF0ZU9iamVjdDNEUGxhY2VtZW50KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm1hdHRlcnRhZ1RvRm9sbG93KSB7XHJcbiAgICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGEgPSB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQodGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdyk7XHJcbiAgICAgIGlmIChtYXR0ZXJ0YWdEYXRhKSB7XHJcbiAgICAgICAgbWF0dGVydGFnRGF0YS5zZXRQb3NpdGlvbih7IC4uLnRoaXMucG9zZU1hdHRlcnBvcnQucG9zaXRpb24gfSk7XHJcbiAgICAgICAgbWF0dGVydGFnRGF0YS5zZXROb3JtYWwoeyAuLi50aGlzLnBvc2VNYXR0ZXJwb3J0Lm5vcm1hbCB9KTtcclxuICAgICAgICB0aGlzLmRpY3Rpb25uYXJ5VGFncy5zZXQodGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdywgbWF0dGVydGFnRGF0YSk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVNYXR0ZXJUYWdDb250ZW50Rm9yVGFnSUQodGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMub25WYWxpZGF0ZWRNYXR0ZXJ0YWcoKTtcclxuICB9O1xyXG5cclxuICBwb2ludGVyUmlnaHRDbGlja0hhbmRsZXIgPSAoZSkgPT4ge1xyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy5jYW5jZWxDdXJyZW50UGxhY2VtZW50KCk7XHJcbiAgfTtcclxuXHJcbiAgcG9pbnRlck1pZGRsZUNsaWNrSGFuZGxlciA9IChlKSA9PiB7XHJcbiAgICB0aGlzLnBvaW50ZXJTZXJ2aWNlLnVwZGF0ZUN1cnNvckRpc3BsYXkodGhpcy5wb3NlTWF0dGVycG9ydCk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoJ2NvbmZpZycpIGNvbmZpZzogQ29uZmlnLFxyXG4gICAgQEluamVjdChNQVRURVJQT1JUX1NES19LRVkpIHByaXZhdGUgcmVhZG9ubHkgc2RrS2V5OiBzdHJpbmcsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBhY3RpdmVSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIHZpc2liaWxpdHlTZXJ2aWNlOiBCYXNlVmlzaWJpbGl0eVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxyXG4gICAgcHJpdmF0ZSBtZWFzdXJlbWVudFNlcnZpY2U6IE1hdHRlcnBvcnRNZWFzdXJlbWVudFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG5hdmlnYXRpb25TZXJ2aWNlOiBNYXR0ZXJwb3J0TmF2aWdhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHBvaW50ZXJTZXJ2aWNlOiBNYXR0ZXJwb3J0UG9pbnRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG9iamVjdDNEU2VydmljZTogTWF0dGVycG9ydE9iamVjdDNEU2VydmljZSxcclxuICAgIHByaXZhdGUgbWF0dGVycG9ydFRhZ1NlcnZpY2U6IE1hdHRlcnBvcnRUYWdTZXJ2aWNlLFxyXG4gICkge1xyXG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbml0aWFsaXplcyB0aGUgTWF0dGVycG9ydCBTREssIHNldHMgdXAgZXZlbnQgbGlzdGVuZXJzLCBhbmQgY29uZmlndXJlcyBhc3NldHMuXHJcbiAgICogQHBhcmFtIHRhZ1NlcnZpY2UgU2VydmljZSB1c2VkIHRvIGdlbmVyYXRlIGFuZCBpbmplY3QgSFRNTCBpbnRvIHRhZ3MuXHJcbiAgICogQHBhcmFtIG1vZHVsZSBBcHBsaWNhdGlvbiBtb2R1bGUgKGUuZy4sIElNTU8sIE1VU0VVTSkgdG8gZW5hYmxlIHNwZWNpZmljIGZlYXR1cmVzLlxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRydWUgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZS5cclxuICAgKi9cclxuICBhc3luYyBpbml0U2RrKFxyXG4gICAgdGFnU2VydmljZTogQmFzZVRhZ1NlcnZpY2UsXHJcbiAgICBtb2R1bGU6IFNwTW9kdWxlID0gU3BNb2R1bGUuSU1NT1xyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKHRoaXMuc2RrKSB7XHJcbiAgICAgIC8vIGNsZWFuIGlmIHNkayBpcyBydW5uaW5nIGFscmVhZHlcclxuICAgICAgYXdhaXQgdGhpcy5hY3Rpb25fZGVsZXRlX2FsbF9tYXR0ZXJ0YWdzKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnRhZ1NlcnZpY2UgPSB0YWdTZXJ2aWNlO1xyXG4gICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5zZXRUYWdTZXJ2aWNlKHRhZ1NlcnZpY2UpO1xyXG4gICAgdGhpcy5TUE1vZHVsZSA9IG1vZHVsZTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIC8vIFJldHJpZXZlIERPTSBlbGVtZW50c1xyXG4gICAgICBjb25zdCBwb2ludGVyQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcclxuICAgICAgICAnI3ZpZXdlci1wb2ludGVyLXRyaWNrJ1xyXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICB0aGlzLmNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN2aWV3ZXItbW9kdWxlJykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgJyN2aWV3ZXItbW9kdWxlJ1xyXG4gICAgICApIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xyXG4gICAgICBpZiAoIWlmcmFtZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBjdXJzb3JCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICAgICcjYnV0dG9uJ1xyXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICBjb25zdCB0ZXh0UGFuZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICAgICcjdGV4dCdcclxuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgIHRoaXMucG9pbnRlclNlcnZpY2UuaW5pdCh0aGlzLmNvbnRhaW5lciwgcG9pbnRlckJ0biwgY3Vyc29yQnRuLCB0ZXh0UGFuZWwsIHtcclxuICAgICAgICBvbkxlZnRDbGljazogdGhpcy5wb2ludGVyTGVmdENsaWNrSGFuZGxlci5iaW5kKHRoaXMpLFxyXG4gICAgICAgIG9uUmlnaHRDbGljazogdGhpcy5wb2ludGVyUmlnaHRDbGlja0hhbmRsZXIuYmluZCh0aGlzKSxcclxuICAgICAgICBvbk1pZGRsZUNsaWNrOiB0aGlzLnBvaW50ZXJNaWRkbGVDbGlja0hhbmRsZXIuYmluZCh0aGlzKSxcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMucmVnaXN0ZXJFc2NhcGVMaXN0ZW5lcihpZnJhbWUpO1xyXG5cclxuICAgICAgLy8gTG9hZCBTREtcclxuICAgICAgY29uc3Qgc2hvd2Nhc2VXaW5kb3cgPSBpZnJhbWUuY29udGVudFdpbmRvdztcclxuICAgICAgaWZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHRoaXMuc2RrID0gYXdhaXQgKHNob3djYXNlV2luZG93IGFzIGFueSkuTVBfU0RLLmNvbm5lY3QoXHJcbiAgICAgICAgICAgIHNob3djYXNlV2luZG93LFxyXG4gICAgICAgICAgICB0aGlzLnNka0tleSxcclxuICAgICAgICAgICAgJydcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hZGRDdXN0b21Dc3MoKTtcclxuXHJcbiAgICAgICAgdGhpcy5wb2ludGVyU2VydmljZS5zdGFydEFkbWluQ3Vyc29yVHJhY2tlcihcclxuICAgICAgICAgIHRoaXMuc2RrLFxyXG4gICAgICAgICAgdGhpcy5jb250YWluZXIsXHJcbiAgICAgICAgICAoKSA9PiB0aGlzLnBvc2VNYXR0ZXJwb3J0LFxyXG4gICAgICAgICAgKCkgPT4gdGhpcy5wb3NlQ2FtZXJhXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gTG9hZCBNYXR0ZXJ0YWcgaWNvbnMgYW5kIGN1c3RvbSBzdWJzY3JpcHRpb25zXHJcbiAgICAgICAgdGhpcy5yZWdpc3RlcmVkSWNvbnMuY2xlYXIoKTtcclxuICAgICAgICB0aGlzLmN1c3RvbUljb25DYWNoZS5jbGVhcigpO1xyXG4gICAgICAgIGNvbnN0IGljb25SZWdpc3RyYXRpb25zOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcclxuICAgICAgICBzd2l0Y2ggKG1vZHVsZSkge1xyXG4gICAgICAgICAgY2FzZSBTcE1vZHVsZS5JTU1POlxyXG4gICAgICAgICAgICBpY29uUmVnaXN0cmF0aW9ucy5wdXNoKHRoaXMucmVnaXN0ZXJJY29uKCdpY29uLXRpY2tldCcsIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX3RpY2tldCkpO1xyXG4gICAgICAgICAgICBpY29uUmVnaXN0cmF0aW9ucy5wdXNoKHRoaXMucmVnaXN0ZXJJY29uKCdpY29uLWVxdWlwbWVudCcsIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX2VxdWlwbWVudCkpO1xyXG4gICAgICAgICAgICBpY29uUmVnaXN0cmF0aW9ucy5wdXNoKHRoaXMucmVnaXN0ZXJJY29uKCdpY29uLW1lYXN1cmUnLCB0aGlzLmNvbmZpZy5teV9jb25maWcuaWNvbl9tZWFzdXJlKSk7XHJcbiAgICAgICAgICAgIGljb25SZWdpc3RyYXRpb25zLnB1c2godGhpcy5yZWdpc3Rlckljb24oJ2ljb24tZGF0YScsIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX2RhdGEpKTtcclxuICAgICAgICAgICAgaWNvblJlZ2lzdHJhdGlvbnMucHVzaCh0aGlzLnJlZ2lzdGVySWNvbignaWNvbi1vYmplY3QzZCcsIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX29iamVjdDNkKSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNkay5NZWFzdXJlbWVudHMuZGF0YS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgIG9uQWRkZWQ6IGZ1bmN0aW9uIChcclxuICAgICAgICAgICAgICAgIGluZGV4OiBhbnksXHJcbiAgICAgICAgICAgICAgICBpdGVtOiB7IHBvaW50czogYW55IH0sXHJcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBhbnlcclxuICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVhc3VyZW1lbnRTZXJ2aWNlLnNldExhc3RNZWFzdXJlKGl0ZW0ucG9pbnRzKTtcclxuICAgICAgICAgICAgICB9LmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgICAgb25Db2xsZWN0aW9uVXBkYXRlZDogZnVuY3Rpb24gKGNvbGxlY3Rpb246IGFueSkge1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ3RoZSBlbnRpcmUgdXAtdG8tZGF0ZSBjb2xsZWN0aW9uJywgY29sbGVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lYXN1cmVtZW50U2VydmljZS5nZXREaXN0YW5jZUZvckxhc3RNZWFzdXJlbWVudCh0aGlzLnNkaywgdGhpcy5jdXJyZW50U3BhY2VJRCk7XHJcbiAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5zZGsuTWVhc3VyZW1lbnRzLm1vZGUuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIChtZWFzdXJlbWVudE1vZGVTdGF0ZTogeyBhY3RpdmU6IGFueSB9KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBtZWFzdXJlbWVudCBtb2RlIHN0YXRlIGhhcyBjaGFuZ2VkXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzTWVhc3VyZU1vZGVPbiA9IG1lYXN1cmVtZW50TW9kZVN0YXRlLmFjdGl2ZTtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdJcyBtZWFzdXJlbWVudCBtb2RlIGN1cnJlbnRseSBhY3RpdmU/ICcsIG1lYXN1cmVtZW50TW9kZVN0YXRlLmFjdGl2ZSk7XHJcbiAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBTcE1vZHVsZS5NVVNFVU06XHJcbiAgICAgICAgICAgIGljb25SZWdpc3RyYXRpb25zLnB1c2godGhpcy5yZWdpc3Rlckljb24oJ2ljb24tZGF0YScsIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX2RhdGEpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFNwTW9kdWxlLkhPVEVMOlxyXG4gICAgICAgICAgICBpY29uUmVnaXN0cmF0aW9ucy5wdXNoKHRoaXMucmVnaXN0ZXJJY29uKCdpY29uX3Jvb21fYXZhaWxhYmxlJywgdGhpcy5jb25maWcubXlfY29uZmlnLmljb25fcm9vbV9hdmFpbGFibGUpKTtcclxuICAgICAgICAgICAgaWNvblJlZ2lzdHJhdGlvbnMucHVzaCh0aGlzLnJlZ2lzdGVySWNvbignaWNvbl9yb29tX3VuYXZhaWxhYmxlJywgdGhpcy5jb25maWcubXlfY29uZmlnLmljb25fcm9vbV91bmF2YWlsYWJsZSkpO1xyXG4gICAgICAgICAgICBpY29uUmVnaXN0cmF0aW9ucy5wdXNoKHRoaXMucmVnaXN0ZXJJY29uKCdpY29uX3Jvb21fY2hvc2VuJywgdGhpcy5jb25maWcubXlfY29uZmlnLmljb25fcm9vbV9jaG9zZW4pKTtcclxuICAgICAgICAgICAgaWNvblJlZ2lzdHJhdGlvbnMucHVzaCh0aGlzLnJlZ2lzdGVySWNvbignaWNvbl9yb29tX3ZpZXdlZCcsIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX3Jvb21fdmlld2VkKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpY29uUmVnaXN0cmF0aW9ucy5wdXNoKHRoaXMucmVnaXN0ZXJJY29uKCdpY29uLXBvc2l0aW9uJywgdGhpcy5jb25maWcubXlfY29uZmlnLmljb25fcG9zaXRpb24pKTtcclxuICAgICAgICB0aGlzLmljb25zUmVnaXN0ZXJlZCA9IFByb21pc2UuYWxsU2V0dGxlZChpY29uUmVnaXN0cmF0aW9ucykudGhlbigoKSA9PiB1bmRlZmluZWQpO1xyXG5cclxuICAgICAgICAvLyBDdXJyZW50IFJvb20gKHVzZWQgZm9yIGdldHRpbmcgYm91bmRpbmcgYm94IGFuZCBldmVudHVhbGx5IGxhenkgbG9hZCBtYXR0ZXJ0YWcgb3Igb2JqZWN0M0QgaW5zaWRlIGN1cnJlbnQgUm9vbSlcclxuICAgICAgICB0aGlzLnNkay5Sb29tLmN1cnJlbnQuc3Vic2NyaWJlKChjdXJyZW50Um9vbSkgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgcm9vbXMgPSBBcnJheS5pc0FycmF5KGN1cnJlbnRSb29tKSA/IGN1cnJlbnRSb29tIDogKGN1cnJlbnRSb29tID8gW2N1cnJlbnRSb29tXSA6IFtdKTtcclxuICAgICAgICAgIHRoaXMuY3VycmVudFJvb21zID0gcm9vbXM7XHJcbiAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLm9uUm9vbUNoYW5nZWQubmV4dChyb29tcyk7XHJcbiAgICAgICAgICAvLyBSZWZyZXNoIHRhZyB2aXNpYmlsaXR5IHdoZW5ldmVyIHRoZSByb29tIGNvbnRleHQgY2hhbmdlc1xyXG4gICAgICAgICAgdGhpcy5yZWZyZXNoVGFnc1Zpc2liaWxpdHkoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gM0QgcG9zaXRpb24ncyBwb2ludGVyXHJcbiAgICAgICAgdGhpcy5zZGsuUG9pbnRlci5pbnRlcnNlY3Rpb24uc3Vic2NyaWJlKFxyXG4gICAgICAgICAgZnVuY3Rpb24gKGludGVyc2VjdGlvbjogYW55KSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9zZU1hdHRlcnBvcnQgPSBpbnRlcnNlY3Rpb247XHJcbiAgICAgICAgICAgIHRoaXMucG9zZU1hdHRlcnBvcnQudGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMub2xkUG9zZU1hdHRlcnBvcnRQb3NpdGlvbikge1xyXG4gICAgICAgICAgICAgIHRoaXMub2xkUG9zZU1hdHRlcnBvcnRQb3NpdGlvbiA9IHtcclxuICAgICAgICAgICAgICAgIHg6IDAsXHJcbiAgICAgICAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgICAgICAgejogMCxcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlcmFjdGlvbk1vZGUgIT09IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUICYmIHRoaXMubWF0dGVydGFnVG9Gb2xsb3cpIHtcclxuICAgICAgICAgICAgICAvLyBmb2xsb3cgdGhlIHBvaW50ZXIgYW5kIGNoYW5nZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0IHRhZ1xyXG4gICAgICAgICAgICAgIC8vICh3ZSBhcmUgYWJvdXQgdG8gdmFsaWRhdGUsIGJ1dCBpdCBleGlzdHMgaW4gc2RrIGFscmVhZHkpXHJcbiAgICAgICAgICAgICAgdGhpcy5lbmFibGVfZm9sbG93aW5nX3RhZyh0aGlzLm1hdHRlcnRhZ1RvRm9sbG93KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub2JqZWN0M0RQbGFjZW1lbnQpIHtcclxuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU9iamVjdDNEUGxhY2VtZW50UHJldmlldyhpbnRlcnNlY3Rpb24pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5wb2ludGVyU2VydmljZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMucG9pbnRlclNlcnZpY2Uuc2V0Q3Vyc29yUG9zaXRpb25CdXR0b25EaXNwbGF5ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LmJpbmQodGhpcylcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvL0NhbWVyYSBtb2RlXHJcbiAgICAgICAgdGhpcy5zZGsuTW9kZS5jdXJyZW50LnN1YnNjcmliZSgobW9kZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMubmF2aWdhdGlvblNlcnZpY2UuaXNVbnJlcXVlc3RlZEZsb29ycGxhblN3aXRjaCh0aGlzLmNhbWVyYU1vZGUsIG1vZGUpKSB7XHJcbiAgICAgICAgICAgIC8vIFRvcC1kb3duIGRvbGxob3VzZSBjYW1lcmEgcmVwb3J0ZWQgYXMgZmxvb3JwbGFuOiBzdGlsbCBkb2xsaG91c2UsIGlnbm9yZSBpdFxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodGhpcy5jYW1lcmFNb2RlICE9PSBtb2RlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2Uuc2V0Q2FtZXJhTW9kZShtb2RlKTtcclxuICAgICAgICAgICAgLy8gUmVmcmVzaCB0YWcgdmlzaWJpbGl0eSBvbiBldmVyeSBtb2RlIGNoYW5nZSAoSU5TSURFIHZzIERPTExIT1VTRSB2cyBGTE9PUlBMQU4pXHJcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFRhZ3NWaXNpYmlsaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FtZXJhTW9kZSA9IG1vZGU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2RrICYmIHRoaXMucG9zZUNhbWVyYSkge1xyXG4gICAgICAgICAgICB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLnVwZGF0ZVRhZ3NWaXNpYmlsaXR5Rm9yQ29udGV4dChcclxuICAgICAgICAgICAgICB0aGlzLnNkayxcclxuICAgICAgICAgICAgICB0aGlzLnN3ZWVwQ29sbGVjdGlvbixcclxuICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRDYW1lcmFNb2RlLFxyXG4gICAgICAgICAgICAgIHRoaXMubWF0dGVydGFnVG9Gb2xsb3csXHJcbiAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Rmxvb3JTZXF1ZW5jZSxcclxuICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRSb29tc1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIDEwMDApO1xyXG5cclxuICAgICAgICAvLyBzdWJzY3JpYmUgdG8gc3dlZXBzXHJcbiAgICAgICAgdGhpcy5zZGsuU3dlZXAuZGF0YS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgb25Db2xsZWN0aW9uVXBkYXRlZDogZnVuY3Rpb24gc3Vic2NyKGNvbGxlY3Rpb246IHt9KSB7XHJcbiAgICAgICAgICAgIHRoaXMua25vd25Td2VlcHMgPSB7IC4uLnRoaXMua25vd25Td2VlcHMsIC4uLmNvbGxlY3Rpb24gfTtcclxuICAgICAgICAgICAgaWYgKHRoaXMub2JqZWN0M0RTZXJ2aWNlLmlzTmF2aWdhdGlvbkxvY2tlZCgpKSB7XHJcbiAgICAgICAgICAgICAgLy8gc3dlZXBzIGRpc2FibGVkIGJ5IHRoZSBsb2NrIGFyZSBubyBsb25nZXIgaW4gdGhlIGNvbGxlY3Rpb246IGtlZXAgdGhlbSBrbm93blxyXG4gICAgICAgICAgICAgIGNvbGxlY3Rpb24gPSB7IC4uLnRoaXMubG9ja2VkU3dlZXBzU25hcHNob3QsIC4uLmNvbGxlY3Rpb24gfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnN3ZWVwcyA9IE9iamVjdC5rZXlzKGNvbGxlY3Rpb24pO1xyXG4gICAgICAgICAgICB0aGlzLnN3ZWVwQ29sbGVjdGlvbiA9IGNvbGxlY3Rpb247XHJcbiAgICAgICAgICAgIC8vIFJlYnVpbGQgc2lkIOKGlCB1dWlkIG1hcHMgd2hlbmV2ZXIgdGhlIGNvbGxlY3Rpb24gdXBkYXRlc1xyXG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmJ1aWxkU3dlZXBJZE1hcHMoY29sbGVjdGlvbik7XHJcbiAgICAgICAgICB9LmJpbmQodGhpcyksXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIHN1YnNjcmliZSB0byBjdXJyZW50IHN3ZWVwIOKAkyBlbWl0IHV1aWQgKERCIGZvcm1hdCkgaW5zdGVhZCBvZiByYXcgc2lkXHJcbiAgICAgICAgdGhpcy5zZGsuU3dlZXAuY3VycmVudC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICBmdW5jdGlvbiBzdWJzY3IoY3VycmVudFN3ZWVwOiB7IHNpZDogc3RyaW5nIH0pIHtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRTd2VlcC5zaWQgPT09ICcnKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IHV1aWQgPSB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnJlc29sdmVTd2VlcFV1aWQoY3VycmVudFN3ZWVwLnNpZCk7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN3ZWVwLm5leHQodXVpZCk7XHJcbiAgICAgICAgICB9LmJpbmQodGhpcylcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyBTdWJzY3JpYmUgdG8gRmxvb3IgZGF0YVxyXG4gICAgICAgIHRoaXMuc2RrLkZsb29yLmRhdGEuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG9uQ29sbGVjdGlvblVwZGF0ZWQ6IGZ1bmN0aW9uIHVwZCh0aGlzOiBhbnksIGNvbGxlY3Rpb246IGFueSkge1xyXG4gICAgICAgICAgICB0aGlzLmZsb29ycyA9IE9iamVjdC52YWx1ZXMoY29sbGVjdGlvbik7XHJcbiAgICAgICAgICB9LmJpbmQodGhpcyksXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIFN1YnNjcmliZSB0byBjdXJyZW50IGZsb29yIOKAkyBhdXRob3JpdGF0aXZlIHNvdXJjZSBmb3IgbXVsdGktZmxvb3IgZmlsdGVyaW5nXHJcbiAgICAgICAgdGhpcy5zZGsuRmxvb3IuY3VycmVudC5zdWJzY3JpYmUoKGN1cnJlbnRGbG9vcjogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBzZXEgPSBjdXJyZW50Rmxvb3I/LnNlcXVlbmNlID8/IG51bGw7XHJcbiAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRGbG9vclNlcXVlbmNlID0gc2VxO1xyXG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbRmxvb3IuY3VycmVudF0gc2VxdWVuY2UgPScsIHNlcSwgJ3wgZnVsbCA9JywgY3VycmVudEZsb29yKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMucmVmcmVzaFRhZ3NWaXNpYmlsaXR5KCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIEdlbmVyaWMgaGFuZGxlciBmb3IgdGFnIHNlbGVjdGlvbiBldmVudHNcclxuICAgICAgICBjb25zdCBoYW5kbGVUYWdTZWxlY3Rpb24gPSBhc3luYyAoc2lkOiBzdHJpbmcsIHNvdXJjZTogc3RyaW5nLCBldnQ/OiBhbnkpID0+IHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGEgPSB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQoc2lkKTtcclxuICAgICAgICAgICAgaWYgKCFtYXR0ZXJ0YWdEYXRhKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHRhZ1NlcnZpY2UuZ2V0VXJsRm9yU2VlRGV0YWlscyhcclxuICAgICAgICAgICAgICBtYXR0ZXJ0YWdEYXRhLmdldE9iamVjdCgpLFxyXG4gICAgICAgICAgICAgIG1hdHRlcnRhZ0RhdGEuZ2V0VHlwZSgpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGlmICh1cmwgIT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy52aXNpYmlsaXR5U2VydmljZS5kZXRhaWxTaG93aW5nLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt1cmxdKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0Nhbm5vdCBzaG93IGRldGFpbHMgZm9yIHRhZycsIGVycm9yKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyBEaXNhYmxlIG5hdGl2ZSBNYXR0ZXJwb3J0IGFjdGlvbnNcclxuICAgICAgICBjb25zdCBkaXNhYmxlTmF0aXZlQWN0aW9ucyA9IChzaWQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLnNkayB8fCBzaWQgPT09IHRoaXMubWF0dGVydGFnVG9Gb2xsb3cpIHJldHVybjsgLy8gaWdub3JlIHdoZW4gd2UgYXJlIGluIHBvc2l0aW9uaW5nIG1vZGVcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhZ01vZHVsZSA9IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZ2V0VGFnTW9kdWxlKHRoaXMuc2RrLCBzaWQpO1xyXG4gICAgICAgICAgICBpZiAodGFnTW9kdWxlPy5hbGxvd0FjdGlvbikge1xyXG4gICAgICAgICAgICAgIHRhZ01vZHVsZS5hbGxvd0FjdGlvbihzaWQsIHsgb3BlbmluZzogdHJ1ZSwgbmF2aWdhdGluZzogdHJ1ZSwgZG9ja2luZzogZmFsc2UgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgICAgICAvLyBzaWxlbnRseSBpZ25vcmUgYWxyZWFkeSByZW1vdmVkIHRhZ3NcclxuICAgICAgICAgICAgaWYgKGlzRGV2TW9kZSgpICYmICFlPy5tZXNzYWdlPy5pbmNsdWRlcygnbm90IGZvdW5kJykpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ01hdHRlcnBvcnRTZXJ2aWNlOiBFcnJvciBkaXNhYmxpbmcgYWN0aW9ucyBmb3InLCBzaWQsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIHJlYWNoIFBMQVlJTkcgcGhhc2VcclxuICAgICAgICBpZiAodGhpcy5zZGsuQXBwICYmIHRoaXMuc2RrLkFwcC5zdGF0ZSkge1xyXG4gICAgICAgICAgdGhpcy5zZGsuQXBwLnN0YXRlLndhaXRVbnRpbCgoczogYW55KSA9PiBzLnBoYXNlID09PSB0aGlzLnNkay5BcHAuUGhhc2UuUExBWUlORykudGhlbihhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgY29tbW9uIGxheWVyIGhvbGRpbmcgZXZlcnkgdGFnIGJlZm9yZSBhbnkgdGFnIGlzIGFkZGVkLCBzbyB0aGF0XHJcbiAgICAgICAgICAgIC8vIHRhZ3MgYXJlIHNoYXJlZCBiZXR3ZWVuIHRoZSBmdXJuaXNoZWQgYW5kIHRoZSBkZWZ1cm5pc2hlZCB2aWV3cy5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5lbnN1cmVTaGFyZWRUYWdMYXllcih0aGlzLnNkayk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFZpZXdzKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNkay5DYW1lcmEucG9zZS5zdWJzY3JpYmUoKHBvc2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMucG9zZUNhbWVyYSA9IHBvc2U7XHJcbiAgICAgICAgICAgICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS51cGRhdGVUYWdzVmlzaWJpbGl0eUZvckNvbnRleHQoXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNkayxcclxuICAgICAgICAgICAgICAgIHRoaXMuc3dlZXBDb2xsZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Q2FtZXJhTW9kZSxcclxuICAgICAgICAgICAgICAgIHRoaXMubWF0dGVydGFnVG9Gb2xsb3csXHJcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRGbG9vclNlcXVlbmNlLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Um9vbXNcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UudXBkYXRlVGFnc1Zpc2liaWxpdHlGb3JDb250ZXh0KFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZGssXHJcbiAgICAgICAgICAgICAgICB0aGlzLnN3ZWVwQ29sbGVjdGlvbixcclxuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudENhbWVyYU1vZGUsXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93LFxyXG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Rmxvb3JTZXF1ZW5jZSxcclxuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudFJvb21zXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSwgMTUwMCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlcmFjdGlvbk1vZGUgPT09IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5hY3Rpb25fdG9vbGJveF9pbnNpZGVfdmlldyh0aGlzLnNkayk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNkay5UYWcgJiYgdGhpcy5zZGsuVGFnLmRhdGEpIHtcclxuICAgICAgICAgICAgICB0aGlzLnNkay5UYWcuZGF0YS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgb25BZGRlZDogKHNpZDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVOYXRpdmVBY3Rpb25zKHNpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgb25VcGRhdGVkOiAoc2lkOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgICAgZGlzYWJsZU5hdGl2ZUFjdGlvbnMoc2lkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBvbkNvbGxlY3Rpb25VcGRhdGVkOiAoY29sbGVjdGlvbjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGNvbGxlY3Rpb24pLmZvckVhY2goKHNpZCkgPT4gZGlzYWJsZU5hdGl2ZUFjdGlvbnMoc2lkKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRmFsbGJhY2sgcG91ciBsJ8OpdsOpbmVtZW50IGdsb2JhbCB0YWcuY2xpY2tcclxuICAgICAgICB0aGlzLnNkay5vbigndGFnLmNsaWNrJywgKHNpZDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYFtNYXR0ZXJwb3J0U2VydmljZV0gc2RrLm9uKCd0YWcuY2xpY2snKSByZWNlaXZlZCBmb3Igc2lkOiAke3NpZH1gKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGhhbmRsZVRhZ1NlbGVjdGlvbihzaWQsICdnbG9iYWwudGFnLmNsaWNrJyk7XHJcbiAgICAgICAgICBkaXNhYmxlTmF0aXZlQWN0aW9ucyhzaWQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIFBvaW50ZXIgdHJpY2tcclxuICAgICAgICAvLyBDcmVhdGUgYSBkaXYgdGhhdCB3aWxsIGFwcGVhciB3aGVuIHRoZSBjdXJzb3IgaXMgc3RpbGxcclxuICAgICAgICAvLyBJdCB3aWxsIGludGVyY2VwdCB0aGUgY2xpY2sgb2YgdGhlIG1vdXNlIGJlZm9yZSBpdCB0cmlnZXJyaW5nIHRoZSBNYXR0ZXJwb3J0J3MgdG91ciBuYXZpZ2F0aW9uXHJcbiAgICAgICAgdGhpcy5wb2ludGVyU2VydmljZS5zdGFydFBvaW50ZXJUcmljayhcclxuICAgICAgICAgIHRoaXMuc2RrLFxyXG4gICAgICAgICAgdGhpcy5jb250YWluZXIsXHJcbiAgICAgICAgICAoKSA9PiB0aGlzLnBvc2VNYXR0ZXJwb3J0LFxyXG4gICAgICAgICAgKCkgPT4gdGhpcy5wb3NlQ2FtZXJhLFxyXG4gICAgICAgICAgKCkgPT4gdGhpcy5pbnRlcmFjdGlvbk1vZGUsXHJcbiAgICAgICAgICAoKSA9PiB0aGlzLmdldEZvbGxvd1RhcmdldCgpXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgKiBUcmFuc2l0aW9uc1xyXG4gICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zZGsub24oXHJcbiAgICAgICAgICAndmlld21vZGUuY2hhbmdlc3RhcnQnLFxyXG4gICAgICAgICAgZnVuY3Rpb24gKHRvLCBmcm9tKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1N0YXJ0aW5nIHRvIG1vdmUgdG8gJyArIHRvICsgJyBmcm9tICcgKyBmcm9tKTtcclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pblRyYW5zaXRpb25Nb2RlID0gdHJ1ZTtcclxuICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5zZGsub24oXHJcbiAgICAgICAgICAndmlld21vZGUuY2hhbmdlZW5kJyxcclxuICAgICAgICAgIGZ1bmN0aW9uIChvbGRNb2RlLCBuZXdNb2RlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ0VuZGVkIHRvIG1vdmUgdG8gJyArIG5ld01vZGUgKyAnIGZyb20gJyArIG9sZE1vZGUpO1xyXG4gICAgICAgICAgICBpZiAobmV3TW9kZSAhPT0gJ21vZGUudHJhbnNpdGlvbmluZycpIHtcclxuICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmluVHJhbnNpdGlvbk1vZGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnNkay5vbihcclxuICAgICAgICAgIHRoaXMuc2RrLlN3ZWVwLkV2ZW50LkVOVEVSLFxyXG4gICAgICAgICAgZnVuY3Rpb24gKG9sZFN3ZWVwLCBuZXdTd2VlcCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdMZWF2aW5nIHN3ZWVwICcgKyBvbGRTd2VlcCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ0VudGVyaW5nIHN3ZWVwICcgKyBuZXdTd2VlcCk7XHJcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuaW5UcmFuc2l0aW9uU3dlZXAgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5kaXNwbGF5QXppbXV0YWxDcm93bigpO1xyXG4gICAgICAgICAgICAvLyBSZWZyZXNoIG9uIHN3ZWVwIGlzIHJlbW92ZWQgYmVjYXVzZSB3ZSBvbmx5IHVwZGF0ZSBvbiByb29tIG9yIGZsb29yIGNoYW5nZXMgbm93LlxyXG4gICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnNkay5vbihcclxuICAgICAgICAgIHRoaXMuc2RrLlN3ZWVwLkV2ZW50LkVYSVQsXHJcbiAgICAgICAgICBmdW5jdGlvbiAoZnJvbVN3ZWVwLCB0b1N3ZWVwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ0xlYXZpbmcgc3dlZXAgJyArIGZyb21Td2VlcCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1RyYW5zaXRpb25pbmcgdG8gc3dlZXAgJyArIHRvU3dlZXApO1xyXG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmluVHJhbnNpdGlvblN3ZWVwID0gdHJ1ZTtcclxuICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0M0RPYmplY3RWaWV3ZXIoKTtcclxuXHJcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXByZWNhdGVkIFVzZSBuYXZpZ2F0aW9uU2VydmljZS5yZXNvbHZlU3dlZXBVdWlkKCkgaW5zdGVhZC5cclxuICAgKiBLZXB0IHRlbXBvcmFyaWx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cclxuICAgKi9cclxuICBnZXRTd2VlcFVVSURGb3JTaWQoc2lkOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnJlc29sdmVTd2VlcFV1aWQoc2lkKSAhPT0gc2lkXHJcbiAgICAgID8gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5yZXNvbHZlU3dlZXBVdWlkKHNpZClcclxuICAgICAgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgc2V0TGlnaHRpbmdPZmYoKSB7XHJcbiAgICB0aGlzLm5vTGlnaHRGb3JPYmplY3RzID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGdldERpc3RhbmNlRm9yTGFzdE1lYXN1cmVtZW50KCkge1xyXG4gICAgdGhpcy5tZWFzdXJlbWVudFNlcnZpY2UuZ2V0RGlzdGFuY2VGb3JMYXN0TWVhc3VyZW1lbnQodGhpcy5zZGssIHRoaXMuY3VycmVudFNwYWNlSUQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TGFzdERpc3RhbmNlcygpIHtcclxuICAgIHJldHVybiB0aGlzLm1lYXN1cmVtZW50U2VydmljZS5nZXRMYXN0RGlzdGFuY2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUYWtlcyBzY3JlZW5zaG90IGFuZCBzYXZlcyBiYXNlNjQgaW4gbGFzdFNjcmVlbnNob3RVcmlcclxuICAgKiBAcmV0dXJucyBQcm9taXNlXHJcbiAgICovXHJcbiAgdGFrZVNjcmVlblNob3QoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLm1lYXN1cmVtZW50U2VydmljZS50YWtlU2NyZWVuU2hvdCh0aGlzLnNkayk7XHJcbiAgfVxyXG5cclxuICBnZXRTY3JlZW5TaG90VXJpKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubWVhc3VyZW1lbnRTZXJ2aWNlLmdldFNjcmVlblNob3RVcmkoKTtcclxuICB9XHJcblxyXG4gIGdldExhc3RNZWFzdXJlbWVudCgpOiBPYmplY3Qge1xyXG4gICAgcmV0dXJuIHRoaXMubWVhc3VyZW1lbnRTZXJ2aWNlLmdldExhc3RNZWFzdXJlbWVudCh0aGlzLnBvc2VDYW1lcmEpO1xyXG4gIH1cclxuXHJcbiAgLy9cclxuICAvLyAtLS0tLS0tLS0tIFV0aWxzIC0tLS0tLS0tLS1cclxuICAvL1xyXG4gIHByaXZhdGUgZ2V0Rmxvb3JJZEZvclRhZyhtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5nZXRGbG9vcklkRm9yVGFnKG1hdHRlcnRhZ0RhdGEsIHRoaXMuc3dlZXBDb2xsZWN0aW9uKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU3R5bGluZyBvZiBwb2ludGVyXHJcbiAgICovXHJcbiAgdXBkYXRlUG9pbnRlclRyaWNrKCkge1xyXG4gICAgdGhpcy5wb2ludGVyU2VydmljZS51cGRhdGVQb2ludGVyVHJpY2sodGhpcy5zZGssIHRoaXMuY29udGFpbmVyLCB0aGlzLnBvc2VNYXR0ZXJwb3J0LCB0aGlzLnBvc2VDYW1lcmEsIHRoaXMuaW50ZXJhY3Rpb25Nb2RlLCB0aGlzLmdldEZvbGxvd1RhcmdldCgpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyaWdnZXJzIGEgdGFnIHZpc2liaWxpdHkgcmVmcmVzaCBiYXNlZCBvbiBjdXJyZW50IGNhbWVyYSBtb2RlLCBmbG9vciBhbmQgc3dlZXAuXHJcbiAgICogRGVsZWdhdGVzIGFsbCBsb2dpYyB0byBNYXR0ZXJwb3J0VGFnU2VydmljZS51cGRhdGVUYWdzVmlzaWJpbGl0eUZvckNvbnRleHQoKS5cclxuICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSBvbiBNb2RlLCBTd2VlcCwgRmxvb3IgYW5kIFJvb20gY2hhbmdlcy5cclxuICAgKi9cclxuICBwdWJsaWMgcmVmcmVzaFRhZ3NWaXNpYmlsaXR5KCk6IHZvaWQge1xyXG4gICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XHJcbiAgICAgIGlmIChpc0Rldk1vZGUoKSAmJiB0aGlzLnN3ZWVwQ29sbGVjdGlvbiAmJiB0aGlzLnBvc2VDYW1lcmE/LnN3ZWVwKSB7XHJcbiAgICAgICAgY29uc3Qgc3dlZXBEYXRhID0gdGhpcy5zd2VlcENvbGxlY3Rpb25bdGhpcy5wb3NlQ2FtZXJhLnN3ZWVwXTtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKCdbcmVmcmVzaFRhZ3NWaXNpYmlsaXR5XSBzd2VlcERhdGEgZm9yIGN1cnJlbnQgc3dlZXA6JywgSlNPTi5zdHJpbmdpZnkoc3dlZXBEYXRhKSk7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnW3JlZnJlc2hUYWdzVmlzaWJpbGl0eV0gY3VycmVudEZsb29yU2VxdWVuY2U6JywgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Rmxvb3JTZXF1ZW5jZSk7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnW3JlZnJlc2hUYWdzVmlzaWJpbGl0eV0gY3VycmVudENhbWVyYU1vZGU6JywgdGhpcy5jdXJyZW50Q2FtZXJhTW9kZSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS51cGRhdGVUYWdzVmlzaWJpbGl0eUZvckNvbnRleHQoXHJcbiAgICAgICAgdGhpcy5zZGssXHJcbiAgICAgICAgdGhpcy5zd2VlcENvbGxlY3Rpb24sXHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q2FtZXJhTW9kZSxcclxuICAgICAgICB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93LFxyXG4gICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudEZsb29yU2VxdWVuY2UsXHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Um9vbXNcclxuICAgICAgKS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFNlcnZpY2VdIHJlZnJlc2hUYWdzVmlzaWJpbGl0eSBlcnJvcicsIGVycik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWFsdGltZSBtYXR0ZXJ0YWcgZm9sbG93aW5nIHRoZSBjdXJzb3JcclxuICAgKiBAcGFyYW0gbWF0dGVydGFnIHN0cmluZ1xyXG4gICAqL1xyXG4gIGVuYWJsZV9mb2xsb3dpbmdfdGFnKG1hdHRlcnRhZzogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBPRkZTRVQgPSAwLjAwMDE7IC8vIHF1YXNpLWludmlzaWJsZSBtYWlzIHN1ZmZpdCDDoCDDqXZpdGVyIGwnaW50ZXJjZXB0aW9uXHJcbiAgICB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmdldFRhZ01vZHVsZSh0aGlzLnNkaywgbWF0dGVydGFnKS5lZGl0UG9zaXRpb24obWF0dGVydGFnLCB7XHJcbiAgICAgIGFuY2hvclBvc2l0aW9uOiB7XHJcbiAgICAgICAgeDogdGhpcy5wb3NlTWF0dGVycG9ydC5wb3NpdGlvbi54ICsgT0ZGU0VULFxyXG4gICAgICAgIHk6IHRoaXMucG9zZU1hdHRlcnBvcnQucG9zaXRpb24ueSxcclxuICAgICAgICB6OiB0aGlzLnBvc2VNYXR0ZXJwb3J0LnBvc2l0aW9uLnogKyBPRkZTRVQsXHJcbiAgICAgIH0sXHJcbiAgICAgIHN0ZW1WZWN0b3I6IHtcclxuICAgICAgICB4OiB0aGlzLnBvc2VNYXR0ZXJwb3J0Lm5vcm1hbC54ICogMC4zLFxyXG4gICAgICAgIHk6IHRoaXMucG9zZU1hdHRlcnBvcnQubm9ybWFsLnkgKiAwLjMsXHJcbiAgICAgICAgejogdGhpcy5wb3NlTWF0dGVycG9ydC5ub3JtYWwueiAqIDAuMyxcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGRpc3RhbmNlIGJldHd3ZWVuIHR3byAzRCBwb3NpdGlvbnNcclxuICAgKiBVc2VkIGluIG9yZGVyIHRvIHNlZSBob3cgbXVjaCB0aGUgY3Vyc29yIGhhcyBtb3ZlZCBmcm9tIHRoZSBwcmV2aW91cyBwb3NpdGlvblxyXG4gICAqIEBwYXJhbSBwb3MxXHJcbiAgICogQHBhcmFtIHBvczJcclxuICAgKi9cclxuICBnZXREaXN0UG9zaXRpb24ocG9zMTogYW55LCBwb3MyOiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLnBvaW50ZXJTZXJ2aWNlLmdldERpc3RQb3NpdGlvbih0aGlzLnNkaywgdGhpcy5jb250YWluZXIsIHRoaXMucG9zZUNhbWVyYSwgcG9zMSwgcG9zMik7XHJcbiAgfVxyXG5cclxuICAvL1xyXG4gIC8vIC0tLS0tLS0tLS0gTWF0dGVydGFnIHJlbGF0ZWQgLS0tLS0tLS0tLVxyXG4gIC8vXHJcbiAgLyoqIENyZWF0ZXMgYSB0ZW1wb3JhcnkgTWF0dGVydGFnIHRoYXQgZm9sbG93cyB0aGUgdXNlcidzIGN1cnNvciBmb3IgcG9zaXRpb25pbmcuICovXHJcbiAgYXN5bmMgYWRkQ3Vyc29yTWF0dGVydGFnKG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEpIHtcclxuICAgIGlmICghdGhpcy5wb3NlTWF0dGVycG9ydCAmJiB0aGlzLnBvc2VDYW1lcmEpIHtcclxuICAgICAgdGhpcy5wb3NlTWF0dGVycG9ydCA9IHtcclxuICAgICAgICBwb3NpdGlvbjogeyAuLi50aGlzLnBvc2VDYW1lcmEucG9zaXRpb24gfSxcclxuICAgICAgICBub3JtYWw6IHsgeDogMCwgeTogLTAuMTUsIHo6IDAgfSxcclxuICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLmdldFRpbWUoKVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnBvc2VNYXR0ZXJwb3J0KSB7XHJcbiAgICAgIC8vIEJvdGggcG9zZXMgY29tZSBmcm9tIFNESyBzdWJzY3JpcHRpb25zIHRoYXQgb25seSBzdGFydCBvbmNlIHRoZSBhcHAgcmVhY2hlcyBQTEFZSU5HLCBzbyBhblxyXG4gICAgICAvLyBlYXJseSBjbGljayBsYW5kcyBoZXJlLiBUaGUgY2FsbGVyIGFscmVhZHkgc3dpdGNoZWQgdG8gQURESU5HLCBhbmQgbGVhdmluZyBpdCB0aGVyZSBsb2Nrc1xyXG4gICAgICAvLyB0aGUgdmlld2VyIG91dCBvZiBpdHMgb3duIGd1YXJkIC0gZXZlcnkgbGF0ZXIgY2xpY2sgaXMgc2tpcHBlZCBiZWZvcmUgcmVhY2hpbmcgYW55IGNvZGUsXHJcbiAgICAgIC8vIHdoaWNoIHJlYWRzIGFzIGEgcGVybWFuZW50bHkgZGVhZCBidXR0b24gcmF0aGVyIHRoYW4gb25lIGZhaWxlZCBhdHRlbXB0LlxyXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICAnYWRkQ3Vyc29yTWF0dGVydGFnOiBubyBwb2ludGVyIG9yIGNhbWVyYSBwb3NlIHlldCAtIHRoZSBNYXR0ZXJwb3J0IFNESyBoYXMgbm90IHJlYWNoZWQgJyArXHJcbiAgICAgICAgICAnUExBWUlORywgc28gdGhlcmUgaXMgbm93aGVyZSB0byBhbmNob3IgdGhlIHRhZy4gV2FpdCBmb3IgdGhlIG1vZGVsIHRvIGZpbmlzaCBsb2FkaW5nLicsXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNldEludGVyYWN0aW9uTW9kZShWaWV3ZXJJbnRlcmFjdGlvbnMuREVGQVVMVCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93ID0gYXdhaXQgdGhpcy5hZGRNYXR0ZXJ0YWdUb1ZpZXdlcihtYXR0ZXJ0YWdEYXRhKTtcclxuXHJcbiAgICBpZiAoIXRoaXMubWF0dGVydGFnVG9Gb2xsb3cpIHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ2FkZEN1cnNvck1hdHRlcnRhZzogdGFnIGNyZWF0aW9uIGZhaWxlZCwgbWF0dGVydGFnVG9Gb2xsb3cgaXMgbnVsbCcpO1xyXG4gICAgICB0aGlzLnNldEludGVyYWN0aW9uTW9kZShWaWV3ZXJJbnRlcmFjdGlvbnMuREVGQVVMVCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCB3YWl0KDUwKTtcclxuICAgIGNvbnN0IHRhZ01vZHVsZSA9IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZ2V0VGFnTW9kdWxlKHRoaXMuc2RrLCB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93KTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IHRhZ01vZHVsZS5lZGl0SWNvbih0aGlzLm1hdHRlcnRhZ1RvRm9sbG93LCAnaWNvbi1wb3NpdGlvbicpO1xyXG4gICAgICBhd2FpdCB0YWdNb2R1bGUuZWRpdE9wYWNpdHkodGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdywgMSk7XHJcbiAgICAgIGF3YWl0IHRhZ01vZHVsZS5lZGl0UG9zaXRpb24odGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdywge1xyXG4gICAgICAgIGFuY2hvclBvc2l0aW9uOiB7IC4uLnRoaXMucG9zZU1hdHRlcnBvcnQucG9zaXRpb24gfSxcclxuICAgICAgICBzdGVtVmVjdG9yOiB7XHJcbiAgICAgICAgICB4OiAodGhpcy5wb3NlTWF0dGVycG9ydC5ub3JtYWw/LnggPz8gMCkgKiAwLjMsXHJcbiAgICAgICAgICB5OiAodGhpcy5wb3NlTWF0dGVycG9ydC5ub3JtYWw/LnkgPz8gLTAuMTUpICogMC4zLFxyXG4gICAgICAgICAgejogKHRoaXMucG9zZU1hdHRlcnBvcnQubm9ybWFsPy56ID8/IDApICogMC4zLFxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGF3YWl0IHRhZ01vZHVsZS5hbGxvd0FjdGlvbih0aGlzLm1hdHRlcnRhZ1RvRm9sbG93LCB7XHJcbiAgICAgICAgb3BlbmluZzogdHJ1ZSwgbmF2aWdhdGluZzogZmFsc2UsIGRvY2tpbmc6IGZhbHNlXHJcbiAgICAgIH0pO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignYWRkQ3Vyc29yTWF0dGVydGFnOiBlcnJvciBjb25maWd1cmluZyBjdXJzb3IgdGFnJywgZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHRhZ0FkZFF1ZXVlKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS50YWdBZGRRdWV1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgdGFnQWRkUXVldWUodmFsdWU6IFByb21pc2U8YW55Pikge1xyXG4gICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS50YWdBZGRRdWV1ZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkTWF0dGVydGFnVG9WaWV3ZXIobWF0dGVydGFnRGF0YTogTWF0dGVydGFnRGF0YSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xyXG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuYWRkTWF0dGVydGFnVG9WaWV3ZXIodGhpcy5zZGssIG1hdHRlcnRhZ0RhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRyaWdnZXJzIGNhbGxiYWNrIGFjdGlvbnMgYWZ0ZXIgYSB0YWcncyBwb3NpdGlvbiBpcyB2YWxpZGF0ZWQgYnkgYSBsZWZ0IGNsaWNrLiAqL1xyXG4gIG9uVmFsaWRhdGVkTWF0dGVydGFnKCkge1xyXG4gICAgdGhpcy5zZXRJbnRlcmFjdGlvbk1vZGUoVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFQpO1xyXG4gICAgY29uc3QgbGFzdFRhZyA9IHRoaXMuZ2V0TGFzdFRhZygpO1xyXG4gICAgaWYgKGxhc3RUYWcpIHtcclxuICAgICAgY29uc3QgY2FsbGJhY2tNb2RlID0gdGhpcy5kaWN0aW9ubmFyeVRhZ3NcclxuICAgICAgICAuZ2V0KGxhc3RUYWcpXHJcbiAgICAgICAgLmdldENhbGxiYWNrQWN0aW9uTW9kZSgpO1xyXG4gICAgICB0aGlzLmNhbGxiYWNrQWZ0ZXJNYXR0ZXJ0YWdWYWxpZGF0aW9uKGNhbGxiYWNrTW9kZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogUmVnaXN0ZXJzIGEgbmV3IGljb24gdGV4dHVyZSBhbmQgYXBwbGllcyBpdCB0byBhIHNwZWNpZmljIE1hdHRlcnRhZy4gKi9cclxuICBhc3luYyBhZGROZXdJY29uQW5kU2V0Rm9yVGFnKG1hdHRlcnRhZ0lEOiBzdHJpbmcsIGljb25QYXRoOiBzdHJpbmcpIHtcclxuICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuYWRkTmV3SWNvbkFuZFNldEZvclRhZyhcclxuICAgICAgdGhpcy5zZGssXHJcbiAgICAgIG1hdHRlcnRhZ0lELFxyXG4gICAgICBpY29uUGF0aCxcclxuICAgICAgZmFsc2UsXHJcbiAgICAgIDFcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKiogQXBwbGllcyBhIHByZS1yZWdpc3RlcmVkIGljb24gdG8gYSBNYXR0ZXJ0YWcuICovXHJcbiAgYXN5bmMgc2V0UmVnaXN0cmVkSWNvbkZvclRhZyhtYXR0ZXJ0YWdJRDogc3RyaW5nLCBpY29uTmFtZTogc3RyaW5nKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmVkaXRUYWdJY29uKHRoaXMuc2RrLCBtYXR0ZXJ0YWdJRCwgaWNvbk5hbWUpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignQ291bGQgbm90IGVkaXQgaWNvbicsIGljb25OYW1lLCBlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBSZWdpc3RlcnMgYSBzdGF0aWMgdGV4dHVyZSBhbmQgcmVtZW1iZXJzIGl0cyBuYW1lIG9uY2UgdGhlIFNESyBhY2NlcHRlZCBpdC4gKi9cclxuICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVySWNvbihpY29uTmFtZTogc3RyaW5nLCBpY29uUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIWljb25QYXRoKSByZXR1cm47XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLnNkay5Bc3NldC5yZWdpc3RlclRleHR1cmUoaWNvbk5hbWUsIGljb25QYXRoKTtcclxuICAgICAgdGhpcy5yZWdpc3RlcmVkSWNvbnMuYWRkKGljb25OYW1lKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oYFtNYXR0ZXJwb3J0U2VydmljZV0gJHtpY29uTmFtZX0gdGV4dHVyZSByZWdpc3RyYXRpb24gZmFpbGVkYCwgZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqIFNldHMgdGhlIGFwcHJvcHJpYXRlIGljb24gZm9yIGEgdGFnIGJhc2VkIG9uIGl0cyB0eXBlIGFuZCBQT0kgbWV0YWRhdGEuICovXHJcbiAgYXN5bmMgc2V0VGFnSWNvbkFuZE9wYWNpdHkoXHJcbiAgICBtYXR0ZXJ0YWdJRDogc3RyaW5nLFxyXG4gICAgbWF0dGVydGFnRGF0YTogTWF0dGVydGFnRGF0YVxyXG4gICkge1xyXG4gICAgYXdhaXQgdGhpcy5pY29uc1JlZ2lzdGVyZWQ7XHJcbiAgICBpZiAodGhpcy5TUE1vZHVsZSA9PT0gU3BNb2R1bGUuSE9URUwpIHtcclxuICAgICAgY29uc3Qgcm9vbSA9IG1hdHRlcnRhZ0RhdGEuZ2V0T2JqZWN0KCk7XHJcbiAgICAgIGxldCBpY29uTmFtZSA9IGBpY29uX3Jvb21gO1xyXG4gICAgICBpZiAocm9vbS5hdmFpbGFibGUpIHtcclxuICAgICAgICBpY29uTmFtZSA9IGAke2ljb25OYW1lfV9hdmFpbGFibGVgO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGljb25OYW1lID0gYCR7aWNvbk5hbWV9X3VuYXZhaWxhYmxlYDtcclxuICAgICAgfVxyXG4gICAgICBhd2FpdCB0aGlzLmVkaXRUYWdJY29uKG1hdHRlcnRhZ0lELCBpY29uTmFtZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHN0cmluZ1RhZ1R5cGUgPSBwb2lUeXBlVG9TdHJpbmcobWF0dGVydGFnRGF0YS5nZXRUeXBlKCkpO1xyXG4gICAgbGV0IGljb25OYW1lID0gYGljb24tJHtzdHJpbmdUYWdUeXBlfWA7XHJcbiAgICBjb25zdCBwb2kgPSBtYXR0ZXJ0YWdEYXRhLmdldFBvaSgpO1xyXG4gICAgaWYgKHBvaSAmJiBwb2kudGFnSWNvbikge1xyXG4gICAgICBjb25zdCB0YWdJY29uID0gSlNPTi5wYXJzZShwb2kudGFnSWNvbik7XHJcbiAgICAgIGlmIChtYXR0ZXJ0YWdEYXRhLmdldFR5cGUoKSA9PT0gUG9pVHlwZS5EQVRBKSB7XHJcbiAgICAgICAgY29uc3QgZmVhdHVyZSA9IG1hdHRlcnRhZ0RhdGEuZ2V0T2JqZWN0KCk7XHJcbiAgICAgICAgaWYgKGZlYXR1cmUudHlwZSA9PT0gRmVhdHVyZVR5cGUuSU5ESUNBVE9SX1RFTVApIHtcclxuICAgICAgICAgIHRhZ0ljb24uc3JjID0gdGhpcy50YWdTZXJ2aWNlLmdldEljb25UYWdJbWFnZUZvckZlYXR1cmUoZmVhdHVyZSwgcG9pKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRhZ0ljb24uc3JjKSB7XHJcbiAgICAgICAgLy8ga2V5ZWQgb24gdGhlIHN0b3JlZCBzb3VyY2UsIG5vdCBvbiB0aGUgc2lnbmVkIFVSTDogYSBuZXcgc2lnbmF0dXJlIGV2ZXJ5IGNhbGxcclxuICAgICAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmN1c3RvbUljb25DYWNoZS5nZXQobWF0dGVydGFnSUQpO1xyXG4gICAgICAgIGlmIChjYWNoZWQgJiYgY2FjaGVkLnNyYyA9PT0gdGFnSWNvbi5zcmMpIHtcclxuICAgICAgICAgIGljb25OYW1lID0gY2FjaGVkLmljb25OYW1lO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBwYXRoU2lnbmVkID0gYXdhaXQgdGhpcy50YWdTZXJ2aWNlLmdldFNpZ25lZFRhZ0ljb25Tb3VyY2UoXHJcbiAgICAgICAgICAgIHRhZ0ljb24uc3JjXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKHBhdGhTaWduZWQpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICBjb25zdCBjdXN0b21JY29uTmFtZSA9IGBpY29uLSR7c3RyaW5nVGFnVHlwZX0tJHttYXR0ZXJ0YWdJRH0tJHttYXR0ZXJ0YWdEYXRhLmN1c3RvbUljb25JbmRleH1gO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2RrLkFzc2V0LnJlZ2lzdGVyVGV4dHVyZShjdXN0b21JY29uTmFtZSwgcGF0aFNpZ25lZCk7XHJcbiAgICAgICAgICAgICAgbWF0dGVydGFnRGF0YS5jdXN0b21JY29uSW5kZXggKz0gMTtcclxuICAgICAgICAgICAgICB0aGlzLmN1c3RvbUljb25DYWNoZS5zZXQobWF0dGVydGFnSUQsIHsgc3JjOiB0YWdJY29uLnNyYywgaWNvbk5hbWU6IGN1c3RvbUljb25OYW1lIH0pO1xyXG4gICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJlZEljb25zLmFkZChjdXN0b21JY29uTmFtZSk7XHJcbiAgICAgICAgICAgICAgaWNvbk5hbWUgPSBjdXN0b21JY29uTmFtZTtcclxuICAgICAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yIHJlZ2lzdGVySWNvbicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLmVkaXRUYWdJY29uKG1hdHRlcnRhZ0lELCBpY29uTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBcHBsaWVzIGFuIGljb24gdG8gYSB0YWcsIHVubGVzcyB0aGF0IGljb24gaXMgYWxyZWFkeSB0aGUgb25lIGFwcGxpZWQuIFRoZSBjYWxsIGlzXHJcbiAgICogYXdhaXRlZCBhbmQgaXRzIHJlamVjdGlvbiByZXBvcnRlZDogYSBzaWxlbnRseSBkcm9wcGVkIHByb21pc2UgaGVyZSBsZWF2ZXMgdGhlIHBpblxyXG4gICAqIHdpdGggaXRzIGRlZmF1bHQgd2hpdGUgbG9vay5cclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGVkaXRUYWdJY29uKG1hdHRlcnRhZ0lEOiBzdHJpbmcsIGljb25OYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmdldENhY2hlZFRhZ0ljb24obWF0dGVydGFnSUQpID09PSBpY29uTmFtZSkgcmV0dXJuO1xyXG4gICAgLy8gQSB0ZXh0dXJlIHRoYXQgd2FzIG5ldmVyIHJlZ2lzdGVyZWQgKG5vIGljb24gY29uZmlndXJlZCBmb3IgdGhpcyB0eXBlKSBjYW4gb25seSBmYWlsOlxyXG4gICAgLy8gdGhlIHBpbiBrZWVwcyBpdHMgZGVmYXVsdCBsb29rLCBhcyBiZWZvcmUsIHdpdGhvdXQgYSBkb29tZWQgU0RLIGNhbGwuXHJcbiAgICBpZiAoIXRoaXMucmVnaXN0ZXJlZEljb25zLmhhcyhpY29uTmFtZSkpIHJldHVybjtcclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZWRpdFRhZ0ljb24odGhpcy5zZGssIG1hdHRlcnRhZ0lELCBpY29uTmFtZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignW01hdHRlcnBvcnRTZXJ2aWNlXSBlZGl0SWNvbiBmYWlsZWQgZm9yJywgbWF0dGVydGFnSUQsIGljb25OYW1lLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogTmF2aWdhdGVzIHRoZSBjYW1lcmEgdG8gdGhlIG1vc3QgcmVjZW50bHkgY3JlYXRlZCB0YWcuICovXHJcbiAgYXN5bmMgZ29Ub0xhc3RUYWcoKSB7XHJcbiAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmdvVG9MYXN0VGFnKHRoaXMuc2RrKTtcclxuICB9XHJcblxyXG4gIC8qKiBOYXZpZ2F0ZXMgdGhlIGNhbWVyYSB0byBhIHNwZWNpZmljIE1hdHRlcnRhZyBieSBpdHMgSUQuICovXHJcbiAgYXN5bmMgZ29Ub1RhZyhtYXR0ZXJ0YWdJRDogc3RyaW5nKSB7XHJcbiAgICBpZiAoIW1hdHRlcnRhZ0lELyogfHwgdGhpcy5pblRyYW5zaXRpb25Td2VlcCovKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMub25Hb1RvVGFnLm5leHQobWF0dGVydGFnSUQpO1xyXG4gICAgICBhd2FpdCB0aGlzLnNkay5Td2VlcC5jdXJyZW50LndhaXRVbnRpbChcclxuICAgICAgICAoY3VycmVudFN3ZWVwKSA9PiBjdXJyZW50U3dlZXAgIT09ICcnXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IG10RGF0YSA9IHRoaXMuZGljdGlvbm5hcnlUYWdzLmdldChtYXR0ZXJ0YWdJRCk7XHJcbiAgICAgIGlmIChtdERhdGEpIHtcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IG10RGF0YS5nZXRQb3NpdGlvbigpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2RrLkNhbWVyYS5sb29rQXQocG9zaXRpb24sIHtcclxuICAgICAgICAgIHRyYW5zaXRpb246IHRoaXMuc2RrLkNhbWVyYS5UcmFuc2l0aW9uVHlwZS5GTFlcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICAvLyBgb3BlbmAgb25seSBleGlzdHMgb24gdGhlIGdsb2JhbCBUYWcgbW9kdWxlLCBuZXZlciBvbiBhIGxheWVyLXNjb3BlZCBvbmUuXHJcbiAgICAgIGF3YWl0IHRoaXMuc2RrLlRhZy5vcGVuKG1hdHRlcnRhZ0lEKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdDYW5ub3QgbmF2aWdhdGUgdG8gdGFnJywgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTW92ZSB0aGUgdmlld2VyIGNhbWVyYSB0byBhIHNwZWNpZmljIDNEIHBvc2l0aW9uIGFuZCBhcHBseSBhIHJvdGF0aW9uLlxyXG4gICAqIERlbGVnYXRlcyB0aGUgaGVhdnkgbGlmdGluZyB0byBNYXR0ZXJwb3J0TmF2aWdhdGlvblNlcnZpY2UubW92ZV90b19wb3NpdGlvbi5cclxuICAgKiAtIHBvc2l0aW9uOiB7IHgsIHksIHogfVxyXG4gICAqIC0gcm90YXRpb246IHsgeWF3LCBwaXRjaD8sIHJvbGw/IH0gaW4gZGVncmVlcyBieSBkZWZhdWx0XHJcbiAgICogLSBvcHRpb25zOiBvcHRpb25hbCB0cmFuc2l0aW9uIGFuZCBjb252ZXJzaW9uIHNldHRpbmdzIChzZWUgbmF2aWdhdGlvbiBzZXJ2aWNlKVxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBnb1RvUG9zaXRpb24oXHJcbiAgICBwb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH0sXHJcbiAgICByb3RhdGlvbjogeyB5YXc6IG51bWJlcjsgcGl0Y2g/OiBudW1iZXI7IHJvbGw/OiBudW1iZXIgfSB8IG51bGwgPSBudWxsLFxyXG4gICAgb3B0aW9ucz86IHtcclxuICAgICAgdHJhbnNpdGlvbj86ICdGTFknIHwgJ0lOU1RBTlQnIHwgJ0lNTUVESUFURSc7XHJcbiAgICAgIGR1cmF0aW9uTXM/OiBudW1iZXI7XHJcbiAgICAgIGFuZ2xlc0luRGVncmVlcz86IGJvb2xlYW47XHJcbiAgICAgIG9mZnNldD86IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xyXG4gICAgfVxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gRW5zdXJlIFNESyBpcyBpbml0aWFsaXplZFxyXG4gICAgaWYgKCF0aGlzLnNkaykge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hdHRlcnBvcnQgU0RLIGlzIG5vdCBpbml0aWFsaXplZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFByZXZlbnQgY29uY3VycmVudCBuYXZpZ2F0aW9uIGlmIGFscmVhZHkgaW4gYSBzd2VlcC9tb2RlIHRyYW5zaXRpb25cclxuICAgIGlmICh0aGlzLmluVHJhbnNpdGlvbk1vZGUgfHwgdGhpcy5pblRyYW5zaXRpb25Td2VlcCkge1xyXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUuZGVidWcoJ2dvVG9Qb3NpdGlvbiBhYm9ydGVkOiB2aWV3ZXIgaXMgaW4gdHJhbnNpdGlvbicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gTWFyayB0cmFuc2l0aW9uIHN0YXRlIG9uIG5hdmlnYXRpb24gc2VydmljZSAobW92ZV90b19wb3NpdGlvbiB3aWxsIGFsc28gbWFuYWdlIGZsYWdzKVxyXG4gICAgICB0aGlzLmluVHJhbnNpdGlvbk1vZGUgPSB0cnVlO1xyXG5cclxuICAgICAgLy8gRGVsZWdhdGUgdG8gbmF2aWdhdGlvbiBzZXJ2aWNlIHdoaWNoIGNvbnRhaW5zIHRoZSByb2J1c3QgbW92ZV90b19wb3NpdGlvbiBpbXBsZW1lbnRhdGlvblxyXG4gICAgICBhd2FpdCB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLm1vdmVfdG9fcG9zaXRpb24odGhpcy5zZGssIHBvc2l0aW9uLCByb3RhdGlvbiwgb3B0aW9ucyk7XHJcblxyXG4gICAgICAvLyBVcGRhdGUgbG9jYWwgY2FjaGVkIGNhbWVyYSBpbmZvXHJcbiAgICAgIHRoaXMubGFzdENhbWVyYVBvc2l0aW9uID0geyAuLi5wb3NpdGlvbiB9O1xyXG4gICAgICAvLyBFbWl0IGEgc2ltcGxpZmllZCBjdXJyZW50IGNhbWVyYSBwb3NlIGZvciBzdWJzY3JpYmVyc1xyXG4gICAgICB0aGlzLmN1cnJlbnRDYW1lcmFQb3NlLm5leHQoe1xyXG4gICAgICAgIHBvc2l0aW9uOiB7IC4uLnBvc2l0aW9uIH0sXHJcbiAgICAgICAgcm90YXRpb246IHJvdGF0aW9uID8geyAuLi5yb3RhdGlvbiB9IDogbnVsbCxcclxuICAgICAgICBzd2VlcDogdGhpcy5wb3NlQ2FtZXJhPy5zd2VlcCA/PyBudWxsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnZ29Ub1Bvc2l0aW9uIGNvbXBsZXRlZCcsIHsgcG9zaXRpb24sIHJvdGF0aW9uLCBvcHRpb25zIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLmVycm9yKCdnb1RvUG9zaXRpb24gZXJyb3InLCBlcnIpO1xyXG4gICAgICB0aHJvdyBlcnI7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICAvLyBFbnN1cmUgdHJhbnNpdGlvbiBmbGFnIGlzIGNsZWFyZWQgKG5hdmlnYXRpb24gc2VydmljZSBtYXkgYWxzbyBjbGVhciBpdClcclxuICAgICAgdGhpcy5pblRyYW5zaXRpb25Nb2RlID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgICogQ29tcHV0ZXMgdGhlIGNvbnRleHQtYXdhcmUgb3BhY2l0eSBmb3IgYSBzaW5nbGUgdGFnIGF0IHRoZSBtb21lbnQgaXQgaXMgcmVuZGVyZWQuXHJcbiAgICAqIC0gQ3Vyc29yIHRhZzogYWx3YXlzIHVzZSBwcm92aWRlZCBkZWZhdWx0T3BhY2l0eS5cclxuICAgICogLSBET0xMSE9VU0UgLyBGTE9PUlBMQU46IDAgKGhpZGRlbikuXHJcbiAgICAqIC0gSU5TSURFOiBmbG9vci1maWx0ZXJlZCBwcm94aW1pdHkgb3BhY2l0eSB2aWEgTWF0dGVycG9ydFRhZ1NlcnZpY2UuXHJcbiAgICAqIC0gT3RoZXIgLyB1bmtub3duOiBkZWZhdWx0T3BhY2l0eS5cclxuICAgICovXHJcbiAgLypwcml2YXRlIF9jb21wdXRlQ29udGV4dE9wYWNpdHlGb3JUYWcoXHJcbiAgICBtYXR0ZXJ0YWdJRDogc3RyaW5nLFxyXG4gICAgbWF0dGVydGFnRGF0YTogTWF0dGVydGFnRGF0YSxcclxuICAgIGRlZmF1bHRPcGFjaXR5OiBudW1iZXJcclxuICApOiBudW1iZXIge1xyXG4gICAgaWYgKG1hdHRlcnRhZ0lEID09PSB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93KSB7XHJcbiAgICAgIHJldHVybiBkZWZhdWx0T3BhY2l0eTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmNvbXB1dGVTaW5nbGVUYWdDb250ZXh0T3BhY2l0eShcclxuICAgICAgbWF0dGVydGFnRGF0YSxcclxuICAgICAgdGhpcy5wb3NlQ2FtZXJhLFxyXG4gICAgICB0aGlzLnN3ZWVwQ29sbGVjdGlvbixcclxuICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Rmxvb3JTZXF1ZW5jZSxcclxuICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Um9vbXNcclxuICAgICk7XHJcbiAgfSovXHJcblxyXG4gIHByaXZhdGUgYWRkQ3VzdG9tQ3NzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY3NzID0gYFxyXG4gICAgICAuZm9vdGVyLXVpLFxyXG4gICAgICAuc2hvd2Nhc2UtZm9vdGVyLFxyXG4gICAgICAubXAtbm92YS1idG4tZ3JvdXAsXHJcbiAgICAgIC5mb290ZXItZGl2aWRlcixcclxuICAgICAgLmxvZ28tbGluayxcclxuICAgICAgLmZvb3Rlci1sb2dvLFxyXG4gICAgICAuYm90dG9tLXVpLFxyXG4gICAgICBpbWcubG9nby1pbWFnZSxcclxuICAgICAgaW1nW2NsYXNzXj1cImxvZ28taW1hZ2VcIl0sXHJcbiAgICAgIGltZ1tjbGFzcyo9XCIgbG9nby1pbWFnZVwiXSxcclxuICAgICAgW2RhdGEtdGVzdGlkPVwic2hvd2Nhc2UtZm9vdGVyXCJdIHtcclxuICAgICAgICBvcGFjaXR5OiAwICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmUgIWltcG9ydGFudDtcclxuICAgICAgfVxyXG4gICAgYDtcclxuXHJcbiAgICAvLyAxc3QgbWV0aG9kOiBWaWEgU2NlbmUgU0RLXHJcbiAgICBpZiAodGhpcy5zZGs/LlNjZW5lPy5hZGRTdHlsZSkge1xyXG4gICAgICB0aGlzLnNkay5TY2VuZS5hZGRTdHlsZShjc3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDJuZCBtZXRob2Q6IERpcmVjdCBpbmplY3Rpb24gaW4gaUZyYW1lIERPTSAoRmFsbGJhY2spXHJcbiAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdmlld2VyLW1vZHVsZScpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xyXG4gICAgaWYgKGlmcmFtZT8uY29udGVudFdpbmRvdz8uZG9jdW1lbnQpIHtcclxuICAgICAgY29uc3Qgc3R5bGUgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xyXG4gICAgICBzdHlsZS50ZXh0Q29udGVudCA9IGNzcztcclxuICAgICAgaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIGNvbnRlbnQgb2YgTWF0dGVydGFnIHdpdGggbWF0dGVydGFnSUQgKGJpbGxib2FyZCwgaW5qZWN0ZWQgaHRtbCwgdGFnIGljb24pXHJcbiAgICogQHBhcmFtIG1hdHRlcnRhZ0lEIHN0cmluZ1xyXG4gICAqIEBwYXJhbSBvYmplY3QgVGlja2V0LCBFcXVpcG1lbnQsIEZlYXR1cmUsIGV0Y1xyXG4gICAqIEBwYXJhbSB0YWdUeXBlIFBvaVR5cGVcclxuICAgKi9cclxuICBhc3luYyB1cGRhdGVNYXR0ZXJUYWdDb250ZW50Rm9yVGFnSUQoXHJcbiAgICBtYXR0ZXJ0YWdJRDogc3RyaW5nLFxyXG4gICAgb2JqZWN0OiBEYk9iamVjdFR5cGUgPSBudWxsLFxyXG4gICAgdGFnVHlwZTogUG9pVHlwZSA9IG51bGxcclxuICApIHtcclxuICAgIGlmICh0aGlzLnNkaykge1xyXG4gICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmdldFRhZ01vZHVsZSh0aGlzLnNkaywgbWF0dGVydGFnSUQpLmVkaXRCaWxsYm9hcmQoXHJcbiAgICAgICAgbWF0dGVydGFnSUQsXHJcbiAgICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZ2V0KG1hdHRlcnRhZ0lEKS5nZXREYXRhKClcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBNaXNlIMOgIGpvdXIgZGUgbCdpY8O0bmUgaW1tw6lkaWF0ZVxyXG4gICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS51cGRhdGVNYXR0ZXJUYWdDb250ZW50Rm9yVGFnSUQoXHJcbiAgICAgIHRoaXMuc2RrLFxyXG4gICAgICBtYXR0ZXJ0YWdJRCxcclxuICAgICAgb2JqZWN0LFxyXG4gICAgICB0YWdUeXBlLFxyXG4gICAgICB0aGlzLnNldFRhZ0ljb25BbmRPcGFjaXR5LmJpbmQodGhpcyksXHJcbiAgICAgIC8vIE9uIHBhc3NlIHVuZSBmb25jdGlvbiB3cmFwcGVyIHF1aSBleMOpY3V0ZSBsJ2luamVjdGlvbiBIVE1MIHNhbnMgYmxvcXVlclxyXG4gICAgICBhc3luYyAodHlwZSwgb2JqLCBzaWQpID0+IHtcclxuICAgICAgICB0aGlzLmluamVjdEh0bWxJblRhZyh0eXBlLCBvYmosIHNpZCkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdBc3luYyBIVE1MIHVwZGF0ZSBmYWlsZWQgZm9yJywgc2lkLCBlcnIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlcyBpbmplY3RlZCBodG1sIGZvciBNYXR0ZXJ0YWdcclxuICAgKiBAcGFyYW0gbWF0dGVydGFnSUQgc3RyaW5nXHJcbiAgICogQHBhcmFtIG9iamVjdCBUaWNrZXQsIEVxdWlwbWVudCwgRmVhdHVyZSwgZXRjXHJcbiAgICogQHBhcmFtIHRhZ1R5cGUgUG9pVHlwZVxyXG4gICAqL1xyXG4gIGFzeW5jIHVwZGF0ZUluamVjdGVkSHRtbEZvclRhZ0lEKFxyXG4gICAgbWF0dGVydGFnSUQ6IHN0cmluZyxcclxuICAgIG9iamVjdDogYW55LFxyXG4gICAgdGFnVHlwZTogUG9pVHlwZVxyXG4gICkge1xyXG4gICAgYXdhaXQgdGhpcy5pbmplY3RIdG1sSW5UYWcodGFnVHlwZSwgb2JqZWN0LCBtYXR0ZXJ0YWdJRCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGVzIE1hdHRlcnRhZyBmcm9tIFZpZXdlciBieSBpdHMgSURcclxuICAgKiBAcGFyYW0gbWF0dGVydGFnSUQgc3RyaW5nXHJcbiAgICovXHJcbiAgZGVsZXRlTWF0dGVydGFnRnJvbUlkKG1hdHRlcnRhZ0lEOiBzdHJpbmcpIHtcclxuICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZGVsZXRlTWF0dGVydGFnRnJvbUlkKHRoaXMuc2RrLCBtYXR0ZXJ0YWdJRCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGVzIGxhdGVzdCBjcmVhdGVkIG1hdHRlcnRhZ1xyXG4gICAqL1xyXG4gIGFzeW5jIGRlbGV0ZUxhc3RNYXR0ZXJ0YWcoKSB7XHJcbiAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmRlbGV0ZUxhc3RNYXR0ZXJ0YWcodGhpcy5zZGspO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTGVnYWN5OiB1c2VkIHRvIGJlIGNhbGxlZCBhY3Rpb25fYWRkX21hdHRlcnRhZ19mcm9tX1BPSVxyXG4gICAqIEFkZHMgYW5kIGNvbmZpZ3VyZXMgTWF0dGVydGFnIGZvciBhbiBvYmplY3QgKFRpY2tldCwgRXF1aXBtZW50LCBGZWF0dXJlLCBldGMpIHRoYXQgY29ycmVzcG9uZHMgdG8gUE9JIChjb29yZGluYXRlcywgdGFnSWNvbilcclxuICAgKiBAcGFyYW0gdGFnVHlwZSBQb2lUeXBlXHJcbiAgICogQHBhcmFtIG9iamVjdCBUaWNrZXQsIEVxdWlwbWVudCwgRmVhdHVyZS4uLlxyXG4gICAqIEBwYXJhbSBwb2kgUE9JXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBhc3luYyBjcmVhdGVNYXR0ZXJ0YWdGcm9tUE9JKFxyXG4gICAgdGFnVHlwZTogUG9pVHlwZSxcclxuICAgIG9iamVjdDogRGJPYmplY3RUeXBlLFxyXG4gICAgcG9pOiBQT0lcclxuICApOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuY3JlYXRlTWF0dGVydGFnRnJvbVBPSShcclxuICAgICAgdGhpcy5zZGssXHJcbiAgICAgIHRhZ1R5cGUsXHJcbiAgICAgIG9iamVjdCxcclxuICAgICAgcG9pLFxyXG4gICAgICB0aGlzLmdldFRhZ0Zyb21FbGVtZW50SWQuYmluZCh0aGlzKSxcclxuICAgICAgdGhpcy5zZXRUYWdJY29uQW5kT3BhY2l0eS5iaW5kKHRoaXMpLFxyXG4gICAgICB0aGlzLmluamVjdEh0bWxJblRhZy5iaW5kKHRoaXMpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5qZWN0IGN1c3RvbSBIVE1MIGFzIE1hdHRlcnRhZyBjb250ZW50XHJcbiAgICogQHBhcmFtIHRhZ1R5cGUgUG9pVHlwZVxyXG4gICAqIEBwYXJhbSBvYmplY3QgVGlja2V0LCBFcXVpcG1lbnQsIEZlYXR1cmUgZXRjXHJcbiAgICogQHBhcmFtIHRhZ0lEIHN0cmluZ1xyXG4gICAqL1xyXG4gIGFzeW5jIGluamVjdEh0bWxJblRhZyh0YWdUeXBlOiBQb2lUeXBlLCBvYmplY3Q6IERiT2JqZWN0VHlwZSwgdGFnSUQ6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuaW5qZWN0SHRtbEluVGFnKHRoaXMuc2RrLCB0YWdUeXBlLCBvYmplY3QsIHRhZ0lEKTtcclxuICB9XHJcblxyXG5cclxuICBhc3luYyBhY3Rpb25fZGVsZXRlX2FsbF9tYXR0ZXJ0YWdzKCkge1xyXG4gICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5hY3Rpb25fZGVsZXRlX2FsbF9tYXR0ZXJ0YWdzKHRoaXMuc2RrKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZXMgTWF0dGVydGFnIGZyb20gdmlzaXQgYXNzb2NpYXRlZCB3aXRoIG9iamVjdCBJRCAodGlja2V0SUQsIGV0YylcclxuICAgKiBAcGFyYW0gZWxlbWVudElEIHN0cmluZ1xyXG4gICAqL1xyXG4gIGFzeW5jIGRlbGV0ZU1hdHRlcnRhZ0Zvck9iamVjdChlbGVtZW50SUQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgbWF0dGVyVGFnSUQgPSB0aGlzLmdldFRhZ0Zyb21FbGVtZW50SWQoZWxlbWVudElEKS50YWc7XHJcbiAgICBpZiAobWF0dGVyVGFnSUQpIHtcclxuICAgICAgdGhpcy50YWdBZGRRdWV1ZSA9IHRoaXMudGFnQWRkUXVldWUudGhlbihhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5kZWxldGVNYXR0ZXJ0YWdGcm9tSWQodGhpcy5zZGssIG1hdHRlclRhZ0lEKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy50YWdBZGRRdWV1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHV1aWQgZnJvbSB0aHJlZWpzXHJcbiAgICogQHBhcmFtIHV1aWRcclxuICAgKi9cclxuICBhc3luYyBkZWxldGVPYmplY3QzRCh1dWlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLm9iamVjdDNEUGxhY2VtZW50Py51dWlkID09PSB1dWlkKSB7XHJcbiAgICAgIHRoaXMuY2FuY2VsT2JqZWN0M0RQbGFjZW1lbnQoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5kZWxldGVPYmplY3QzRCh1dWlkKTtcclxuICB9XHJcblxyXG4gIGdldE9iamVjdDNETW9kZWxOb2RlRnJvbURpY3Rpb25uYXJ5KHV1aWQ6IHN0cmluZyk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UuZ2V0T2JqZWN0M0RNb2RlbE5vZGVGcm9tRGljdGlvbm5hcnkodXVpZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzICBNYXR0ZXJ0YWdEYXRhIGFuZCBzdGFydCByZXBvc2l0aW9uaW5nIChjcmVhdGVzIHRlbXBvcmFyeSBtYXR0ZXJ0YWcgdGhhdCBmb2xsb3dzIHRoZSBjdXJzb3IpXHJcbiAgICogQHBhcmFtIHBvaVR5cGUgUG9pVHlwZVxyXG4gICAqIEBwYXJhbSBlbGVtZW50IFRpY2tldCwgRXF1aXBtZW50LCBGZWF0dXJlLCBldGNcclxuICAgKi9cclxuICBhc3luYyBhZGRNYXR0ZXJ0YWdXaGVuUmVwb3NpdGlvbmluZyhwb2lUeXBlOiBQb2lUeXBlLCBlbGVtZW50OiBEYk9iamVjdFR5cGUpIHtcclxuICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGEgPSBuZXcgTWF0dGVydGFnRGF0YShwb2lUeXBlKTtcclxuICAgIC8vIHNldCB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGV4aXN0aW5nIHRhZ1xyXG4gICAgY29uc3QgW3BvaV0gPSBlbGVtZW50LnBvaXMuaXRlbXM7XHJcbiAgICBpZiAocG9pICYmIHBvaS5jb29yZGluYXRlKSB7XHJcbiAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0UG9zaXRpb24oSlNPTi5wYXJzZShwb2kuY29vcmRpbmF0ZSkpO1xyXG4gICAgICBtYXR0ZXJ0YWdEYXRhLnNldFBvaShwb2kpOyAvLyB0byBrZWVwIGN1c3RvbSB0YWdJY29uIGFuZCBvcGFjaXR5XHJcbiAgICB9XHJcbiAgICBtYXR0ZXJ0YWdEYXRhLnNldFN3ZWVwSUQodGhpcy5uYXZpZ2F0aW9uU2VydmljZS5yZXNvbHZlU3dlZXBVdWlkKHRoaXMucG9zZUNhbWVyYS5zd2VlcCkpO1xyXG4gICAgbWF0dGVydGFnRGF0YS5zZXRSb3RhdGlvbih0aGlzLnBvc2VDYW1lcmEucm90YXRpb24pO1xyXG4gICAgbWF0dGVydGFnRGF0YS5zZXRPYmplY3QoZWxlbWVudCwgcG9pVHlwZSk7XHJcbiAgICB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93ID0gYXdhaXQgdGhpcy5hZGRNYXR0ZXJ0YWdUb1ZpZXdlcihtYXR0ZXJ0YWdEYXRhKTtcclxuXHJcbiAgICB0aGlzLnNldEludGVyYWN0aW9uTW9kZShWaWV3ZXJJbnRlcmFjdGlvbnMuUE9TSVRJT05JTkcpO1xyXG4gICAgYXdhaXQgdGhpcy5hZGRDdXJzb3JNYXR0ZXJ0YWcobWF0dGVydGFnRGF0YSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzIE1hdHRlcnRhZ0RhdGEgYW5kIG1hdHRlcnRhZyB0aGF0IGZvbGxvd3MgdGhlIGN1cnNvciB3aGVuIGNob29zaW5nIHBvc2l0aW9uIGZvciBhIG5ldyBvYmplY3RcclxuICAgKiBAcGFyYW0gcG9pVHlwZVxyXG4gICAqL1xyXG4gIGFzeW5jIGFkZE1hdHRlcnRhZ1doZW5BZGRpbmcocG9pVHlwZTogUG9pVHlwZSkge1xyXG4gICAgY29uc3QgbWF0dGVydGFnRGF0YSA9IG5ldyBNYXR0ZXJ0YWdEYXRhKHBvaVR5cGUpO1xyXG4gICAgbWF0dGVydGFnRGF0YS5zZXRTd2VlcElEKHRoaXMubmF2aWdhdGlvblNlcnZpY2UucmVzb2x2ZVN3ZWVwVXVpZCh0aGlzLnBvc2VDYW1lcmEuc3dlZXApKTtcclxuICAgIG1hdHRlcnRhZ0RhdGEuc2V0Um90YXRpb24odGhpcy5wb3NlQ2FtZXJhLnJvdGF0aW9uKTtcclxuXHJcbiAgICBjb25zdCBpbml0aWFsUG9zaXRpb24gPSB0aGlzLnBvc2VNYXR0ZXJwb3J0Py5wb3NpdGlvbiA/PyB0aGlzLnBvc2VDYW1lcmEucG9zaXRpb247XHJcbiAgICBjb25zdCBpbml0aWFsTm9ybWFsID0gdGhpcy5wb3NlTWF0dGVycG9ydD8ubm9ybWFsID8/IHsgeDogMCwgeTogLTAuMTUsIHo6IDAgfTtcclxuICAgIG1hdHRlcnRhZ0RhdGEuc2V0UG9zaXRpb24oeyAuLi5pbml0aWFsUG9zaXRpb24gfSk7XHJcbiAgICBtYXR0ZXJ0YWdEYXRhLnNldE5vcm1hbCh7IC4uLmluaXRpYWxOb3JtYWwgfSk7XHJcblxyXG4gICAgdGhpcy5zZXRJbnRlcmFjdGlvbk1vZGUoVmlld2VySW50ZXJhY3Rpb25zLkFERElORyk7XHJcbiAgICBhd2FpdCB0aGlzLmFkZEN1cnNvck1hdHRlcnRhZyhtYXR0ZXJ0YWdEYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbmNlbHMgZm9sbG93aW5nIG9mIGN1cnNvciAobWVhbmluZyBkZWxldGluZyBsYXN0IE1hdHRlcnRhZylcclxuICAgKi9cclxuICBjYW5jZWxGb2xsb3dpbmdDdXJzb3IoKSB7XHJcbiAgICBpZiAodGhpcy5vYmplY3QzRFBsYWNlbWVudCkge1xyXG4gICAgICAvLyBnZW5lcmljIGNhbmNlbCAodG9vbGJveCBidXR0b25zLi4uKSB3aGlsZSBhIDNEIG9iamVjdCBmb2xsb3dzIHRoZSBjdXJzb3JcclxuICAgICAgdGhpcy5jYW5jZWxPYmplY3QzRFBsYWNlbWVudCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmRlbGV0ZUxhc3RNYXR0ZXJ0YWcoKTtcclxuICAgIHRoaXMuc2V0SW50ZXJhY3Rpb25Nb2RlKFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUKTtcclxuICB9XHJcblxyXG4gIHNldExhc3RPYmplY3QzRChsYXN0T2JqZWN0M0Q6IFRocmVlSlNPYmplY3QzRCkge1xyXG4gICAgdGhpcy5vYmplY3QzRFNlcnZpY2UubGFzdE9iamVjdDNEID0gbGFzdE9iamVjdDNEO1xyXG4gIH1cclxuXHJcbiAgZ2V0TGFzdE9iamVjdDNEKCk6IFRocmVlSlNPYmplY3QzRCB7XHJcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UubGFzdE9iamVjdDNEO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVyZm9ybXMgY2FsbGJhY2sgYWZ0ZXIgbWF0dGVydGFnIHBvc2l0aW9uIHdhcyB2YWxpZGF0ZWQgKGNyZWF0aW9uIG9mIG9iamVjdCBvciByZXBvc2l0aW9uaW5nKVxyXG4gICAqIEBwYXJhbSBtb2RlIE1hdHRlcnRhZ0FjdGlvbk1vZGVcclxuICAgKi9cclxuICBjYWxsYmFja0FmdGVyTWF0dGVydGFnVmFsaWRhdGlvbihtb2RlOiBNYXR0ZXJ0YWdBY3Rpb25Nb2RlKSB7XHJcbiAgICB0aGlzLnZpc2liaWxpdHlTZXJ2aWNlLmRldGFpbFNob3dpbmcubmV4dCh0cnVlKTtcclxuICAgIGNvbnN0IGxhc3RUYWcgPSB0aGlzLmdldExhc3RUYWcoKTtcclxuICAgIHN3aXRjaCAobW9kZSkge1xyXG4gICAgICBjYXNlIE1hdHRlcnRhZ0FjdGlvbk1vZGUuQUREX0VRVUlQTUVOVDpcclxuICAgICAgICB0aGlzLmdvVG9MYXN0VGFnKCk7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2B2aXNpdC8ke3RoaXMuY3VycmVudFNwYWNlSUR9L2FkZF9lcXVpcGBdKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBNYXR0ZXJ0YWdBY3Rpb25Nb2RlLkFERF9USUNLRVQ6XHJcbiAgICAgICAgdGhpcy5nb1RvTGFzdFRhZygpO1xyXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgdmlzaXQvJHt0aGlzLmN1cnJlbnRTcGFjZUlEfS9hZGRfdGlja2V0YF0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIE1hdHRlcnRhZ0FjdGlvbk1vZGUuQUREX09CSkVDVDNEOlxyXG4gICAgICAgIHRoaXMuZ29Ub0xhc3RUYWcoKTtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYHZpc2l0LyR7dGhpcy5jdXJyZW50U3BhY2VJRH0vYWRkX29iamVjdDNkYF0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIE1hdHRlcnRhZ0FjdGlvbk1vZGUuQUREX0RBVEE6XHJcbiAgICAgICAgdGhpcy5nb1RvTGFzdFRhZygpO1xyXG4gICAgICAgIGxldCB1cmw6IHN0cmluZztcclxuICAgICAgICBpZiAodGhpcy5yb3V0ZXIudXJsLmluY2x1ZGVzKCc/JykpIHtcclxuICAgICAgICAgIHVybCA9IHRoaXMucm91dGVyLnVybC5zdWJzdHJpbmcoMCwgdGhpcy5yb3V0ZXIudXJsLmluZGV4T2YoJz8nKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHVybCA9IHRoaXMucm91dGVyLnVybDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2Ake3VybH0vYWRkX2ZlYXR1cmVgXSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTWF0dGVydGFnQWN0aW9uTW9kZS5BRERfREVTSzpcclxuICAgICAgICB0aGlzLmdvVG9MYXN0VGFnKCk7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2B2aXNpdC8ke3RoaXMuY3VycmVudFNwYWNlSUR9L2FkZF9mZWF0dXJlYF0sIHtcclxuICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IGlzRGVzazogdHJ1ZSB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIE1hdHRlcnRhZ0FjdGlvbk1vZGUuQUREX1JPT006XHJcbiAgICAgICAgdGhpcy5nb1RvTGFzdFRhZygpO1xyXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgdmlzaXQvJHt0aGlzLmN1cnJlbnRTcGFjZUlEfS9hZGRfcm9vbWBdKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBNYXR0ZXJ0YWdBY3Rpb25Nb2RlLlBPU0lUSU9OX09CSkVDVDNEOlxyXG4gICAgICAgIGlmIChsYXN0VGFnKSB7XHJcbiAgICAgICAgICAvLyBETyBOb3RoaW5nIChyb3V0aW5nKSwganVzdFxyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoXHJcbiAgICAgICAgICAgIFtgdmlzaXQvJHt0aGlzLmN1cnJlbnRTcGFjZUlEfS9vYmplY3QzZC8ke3RoaXMubGFzdE9iamVjdDNELmlkfWBdLFxyXG4gICAgICAgICAgICB7IHF1ZXJ5UGFyYW1zOiB7IHBvc2l0aW9uaW5nOiB0cnVlIH0gfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTWF0dGVydGFnQWN0aW9uTW9kZS5QT1NJVElPTl9USUNLRVQ6XHJcbiAgICAgICAgaWYgKGxhc3RUYWcpIHtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFxyXG4gICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgYHZpc2l0LyR7dGhpcy5jdXJyZW50U3BhY2VJRH0vZGV0YWlsLyR7dGhpcy5kaWN0aW9ubmFyeVRhZ3MuZ2V0KGxhc3RUYWcpLmVsZW1lbnRJRFxyXG4gICAgICAgICAgICAgIH1gLFxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICB7IHF1ZXJ5UGFyYW1zOiB7IHBvc2l0aW9uaW5nOiB0cnVlIH0gfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTWF0dGVydGFnQWN0aW9uTW9kZS5QT1NJVElPTl9FUVVJUE1FTlQ6XHJcbiAgICAgICAgaWYgKGxhc3RUYWcpIHtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFxyXG4gICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgYHZpc2l0LyR7dGhpcy5jdXJyZW50U3BhY2VJRH0vZXF1aXAvJHt0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQobGFzdFRhZykuZWxlbWVudElEXHJcbiAgICAgICAgICAgICAgfWAsXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgIHsgcXVlcnlQYXJhbXM6IHsgcG9zaXRpb25pbmc6IHRydWUgfSB9XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBNYXR0ZXJ0YWdBY3Rpb25Nb2RlLlBPU0lUSU9OX0RBVEE6XHJcbiAgICAgICAgaWYgKGxhc3RUYWcpIHtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCB7XHJcbiAgICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMuYWN0aXZlUm91dGUsXHJcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IHBvc2l0aW9uaW5nOiB0cnVlIH0sIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6IFwibWVyZ2VcIlxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIE1hdHRlcnRhZ0FjdGlvbk1vZGUuUE9TSVRJT05fUk9PTTpcclxuICAgICAgICBpZiAobGFzdFRhZykge1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcclxuICAgICAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5hY3RpdmVSb3V0ZSxcclxuICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHsgcG9zaXRpb25pbmc6IHRydWUgfSwgcXVlcnlQYXJhbXNIYW5kbGluZzogXCJtZXJnZVwiXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGdWxseSB1cGRhdGVzIGV4aXN0aW5nIE1hdHRlcnRhZyBjb250ZW50IHdpdGggZGF0YSBvZiBvYmplY3QgKFRpY2tldCwgRXF1aXBtZW50LCBEZXNrKVxyXG4gICAqIEBwYXJhbSBtYXR0ZXJ0YWdJRCBzdHJpbmdcclxuICAgKiBAcGFyYW0gb2JqZWN0IFRpY2tldCwgRXF1aXBtZW50LCBGZWF0dXJlLCBEZXNrXHJcbiAgICogQHBhcmFtIHBvaVR5cGUgUG9pVHlwZVxyXG4gICAqIEBwYXJhbSBwb2kgUE9JXHJcbiAgICovXHJcbiAgYXN5bmMgc2V0T2JqZWN0QW5kUG9pSW5UYWcoXHJcbiAgICBtYXR0ZXJ0YWdJRDogc3RyaW5nLFxyXG4gICAgb2JqZWN0OiBEYk9iamVjdFR5cGUsXHJcbiAgICBwb2lUeXBlOiBQb2lUeXBlLFxyXG4gICAgcG9pOiBQT0kgfCBudWxsID0gbnVsbFxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZ2V0KG1hdHRlcnRhZ0lEKS5zZXRPYmplY3Qob2JqZWN0LCBwb2lUeXBlKTtcclxuICAgIGlmIChwb2kpIHtcclxuICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZ2V0KG1hdHRlcnRhZ0lEKS5zZXRQb2kocG9pKTtcclxuICAgIH1cclxuICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLmdldChtYXR0ZXJ0YWdJRCkuZWxlbWVudElEID0gb2JqZWN0LmlkO1xyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgdGhpcy51cGRhdGVNYXR0ZXJUYWdDb250ZW50Rm9yVGFnSUQobWF0dGVydGFnSUQsIG9iamVjdCwgcG9pVHlwZSk7XHJcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlTWF0dGVyVGFnUG9zSW5TZGtWaWV3ZXIoXHJcbiAgICAgICAgbWF0dGVydGFnSUQsXHJcbiAgICAgICAgb2JqZWN0LFxyXG4gICAgICAgIHBvaVR5cGUsXHJcbiAgICAgICAgcG9pXHJcbiAgICAgICk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBlcnJvciBpbiBzZXRPYmplY3RBbmRQb2lJblRhZzogJHtlfWApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgdXBkYXRlTWF0dGVyVGFnUG9zSW5TZGtWaWV3ZXIoXHJcbiAgICBtYXR0ZXJ0YWdJRDogc3RyaW5nLFxyXG4gICAgb2JqZWN0OiBEYk9iamVjdFR5cGUsXHJcbiAgICBwb2lUeXBlOiBQb2lUeXBlLFxyXG4gICAgcG9pOiBQT0kgfCBudWxsID0gbnVsbFxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCFwb2kgfHwgIXBvaS5jb29yZGluYXRlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybigndXBkYXRlTWF0dGVyVGFnUG9zSW5TZGtWaWV3ZXI6IHBvaSBvciBwb2kuY29vcmRpbmF0ZSBpcyBtaXNzaW5nJywgcG9pKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgSW5kZXhUb1VwZGF0ZSA9IG9iamVjdC5wb2lzPy5pdGVtcyA/IG9iamVjdC5wb2lzLml0ZW1zLmZpbmRJbmRleCgodSkgPT4gdT8uaWQgPT09IHBvaS5pZCkgOiAtMTtcclxuICAgIGlmIChJbmRleFRvVXBkYXRlICE9PSAtMSAmJiBvYmplY3QucG9pcz8uaXRlbXMpIHtcclxuICAgICAgb2JqZWN0LnBvaXMuaXRlbXNbSW5kZXhUb1VwZGF0ZV0gPSBwb2k7XHJcbiAgICB9XHJcbiAgICBjb25zdCB7IHgsIHksIHogfSA9IEpTT04ucGFyc2UocG9pLmNvb3JkaW5hdGUpO1xyXG4gICAgY29uc3QgbmV3UG9zaXRpb24gPSB7XHJcbiAgICAgIGFuY2hvclBvc2l0aW9uOiB7XHJcbiAgICAgICAgeDogeCxcclxuICAgICAgICB5OiB5LFxyXG4gICAgICAgIHo6IHosXHJcbiAgICAgIH0sXHJcbiAgICAgIHN0ZW1WZWN0b3I6IHtcclxuICAgICAgICAvLyBtYWtlIHRoZSBUYWcgc3RpY2sgc3RyYWlnaHQgdXAgYW5kIG1ha2UgaXQgMC4zMCBtZXRlcnMgKH4xIGZvb3QpIHRhbGxcclxuICAgICAgICB4OiAwLFxyXG4gICAgICAgIHk6IDAuMyxcclxuICAgICAgICB6OiAwLFxyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZ2V0VGFnTW9kdWxlKHRoaXMuc2RrLCBtYXR0ZXJ0YWdJRCkuZWRpdFBvc2l0aW9uKG1hdHRlcnRhZ0lELCBuZXdQb3NpdGlvbik7XHJcbiAgICB0aGlzLmRpY3Rpb25uYXJ5VGFnc1xyXG4gICAgICAuZ2V0KG1hdHRlcnRhZ0lEKVxyXG4gICAgICAuc2V0UG9zaXRpb24obmV3UG9zaXRpb24uYW5jaG9yUG9zaXRpb24pO1xyXG5cclxuICAgIGZvciAobGV0IHRhZ0lkIG9mIHRoaXMubWF0dGVydGFnSURzKSB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRUYWcgPSB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQodGFnSWQpO1xyXG4gICAgICBpZiAoIWN1cnJlbnRUYWcpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY3VycmVudFRhZy5lbGVtZW50SUQgPT09IG9iamVjdC5pZCAmJiB0YWdJZCAhPT0gbWF0dGVydGFnSUQpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmRlbGV0ZU1hdHRlcnRhZ0Zyb21JZCh0aGlzLnNkaywgdGFnSWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXRzIG1hdHRlclRhZ0lEIGFuZCBpdHMgc3dlZXAgZm9yIGFuIG9iamVjdCBJRCAodGlja2V0IElELCBldGMpXHJcbiAgICogQHBhcmFtIGVsZW1lbnRJRCBzdHJpbmdcclxuICAgKiBAcmV0dXJucyB7dGFnOiBzdHJpbmcgfCBudWxsLCBzd2VlcDogc3RyaW5nIHwgbnVsbH1cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0VGFnRnJvbUVsZW1lbnRJZChlbGVtZW50SUQ6IHN0cmluZyk6IHsgdGFnOiBzdHJpbmcgfCBudWxsOyBzd2VlcDogc3RyaW5nIHwgbnVsbCB9IHtcclxuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmdldFRhZ0Zyb21FbGVtZW50SWQoZWxlbWVudElELCB0aGlzLnN3ZWVwcyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXRzIGxhdGVzdCB0YWcgY3JlYXRlZCBpbiB0aGUgdmlzaXQgKHdoZW4gZm9sbG93aW5nIHRoZSBjdXJzb3IgdG8gcG9zaXRpb24pXHJcbiAgICogQHJldHVybnMgc3RyaW5nIG1hdHRlcnRhZ0lEXHJcbiAgICovXHJcbiAgZ2V0TGFzdFRhZygpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGlmICh0aGlzLm1hdHRlcnRhZ1RvRm9sbG93KSB7XHJcbiAgICAgIHJldHVybiB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMubWF0dGVydGFnSURzLmxlbmd0aCA9PT0gMFxyXG4gICAgICAgID8gbnVsbFxyXG4gICAgICAgIDogdGhpcy5tYXR0ZXJ0YWdJRHNbdGhpcy5tYXR0ZXJ0YWdJRHMubGVuZ3RoIC0gMV07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXRzIE1hdHRlcnRhZ0RhdGEgZm9yIE1hdHRlcnRhZyAocmVwbGFjZXMgZ2V0VGFnRGF0YUZyb21JZClcclxuICAgKiBAcGFyYW0gbWF0dGVydGFnSURcclxuICAgKiBAcmV0dXJucyBNYXR0ZXJ0YWdEYXRhXHJcbiAgICovXHJcbiAgZ2V0TWF0dGVyVGFnRGF0YUZvck1hdHRlcnRhZyhtYXR0ZXJ0YWdJRDogc3RyaW5nKTogTWF0dGVydGFnRGF0YSB8IG51bGwge1xyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGljdGlvbm5hcnlUYWdzLmdldChtYXR0ZXJ0YWdJRCk7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgY29uc29sZS5sb2coJ2Nhbm5vdCByZXRyaWV2ZSBtYXR0ZXJ0YWdEYXRhIGZvciB0YWcnLCBtYXR0ZXJ0YWdJRCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vXHJcbiAgLy8gLS0tLS0tLS0tLSBWaWV3cyAoZnVybmlzaGVkIC8gZGVmdXJuaXNoZWQpIC0tLS0tLS0tLS1cclxuICAvL1xyXG5cclxuICAvKipcclxuICAgKiBTdWJzY3JpYmVzIHRvIHRoZSBTREsgVmlldyBBUEkgdG8ga2VlcCB0cmFjayBvZiB0aGUgdmlld3MgYXZhaWxhYmxlIGZvciB0aGUgc3BhY2VcclxuICAgKiBhbmQgb2YgdGhlIGFjdGl2ZSBvbmUuIFRhZ3MgbGl2ZSBpbiBhIHNoYXJlZCBjb21tb24gbGF5ZXIsIHNvIGEgdmlldyBjaGFuZ2Ugb25seVxyXG4gICAqIHJlcXVpcmVzIHJlLWFwcGx5aW5nIHRoZWlyIHZpc2liaWxpdHksIG5ldmVyIHJlLWNyZWF0aW5nIHRoZW0uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpbml0Vmlld3MoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsZWFyVmlld1N1YnNjcmlwdGlvbnMoKTtcclxuICAgIHRoaXMudmlld3NCeVR5cGUuY2xlYXIoKTtcclxuICAgIHRoaXMuY3VycmVudFZpZXcgPSBudWxsO1xyXG5cclxuICAgIGlmICghdGhpcy5zZGs/LlZpZXc/LnZpZXdzKSB7XHJcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFNlcnZpY2VdIFZpZXcgQVBJIHVuYXZhaWxhYmxlIG9uIHRoaXMgU0RLIHZlcnNpb24nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudmlld1N1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgdGhpcy5zZGsuVmlldy52aWV3cy5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG9uQ29sbGVjdGlvblVwZGF0ZWQ6IChjb2xsZWN0aW9uOiBNYXR0ZXJwb3J0Vmlld0NvbGxlY3Rpb24pID0+IHtcclxuICAgICAgICAgIC8vIFNESyBjYWxsYmFja3MgcnVuIG91dHNpZGUgQW5ndWxhcjogcmUtZW50ZXIgdGhlIHpvbmUgc28gdGhlIHZpZXdzIG1hZGVcclxuICAgICAgICAgIC8vIGF2YWlsYWJsZSBoZXJlIChkZWZ1cm5pc2ggYnV0dG9uLi4uKSBhcmUgcGlja2VkIHVwIGJ5IGNoYW5nZSBkZXRlY3Rpb24uXHJcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnZpZXdzQnlUeXBlLmNsZWFyKCk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmlldyBvZiBPYmplY3QudmFsdWVzKGNvbGxlY3Rpb24pKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy52aWV3c0J5VHlwZS5zZXQodmlldy50eXBlLCB2aWV3KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICAvLyBWaWV3cyBhcmUgZGlzY292ZXJlZCBwcm9ncmVzc2l2ZWx5OiBtYWtlIHN1cmUgZWFjaCBvbmUgY2FycmllcyB0aGUgc2hhcmVkXHJcbiAgICAgICAgICAvLyB0YWcgbGF5ZXIsIG90aGVyd2lzZSBpdHMgdGFncyB3b3VsZCBub3QgZXhpc3QgaW4gdGhhdCB2aWV3LlxyXG4gICAgICAgICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5hdHRhY2hTaGFyZWRUYWdMYXllclRvVmlld3ModGhpcy5zZGssIE9iamVjdC52YWx1ZXMoY29sbGVjdGlvbikpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMudmlld1N1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgdGhpcy5zZGsuVmlldy5jdXJyZW50LnN1YnNjcmliZSgodmlldzogTWF0dGVycG9ydFZpZXcpID0+IHtcclxuICAgICAgICBjb25zdCBjaGFuZ2VkID0gdGhpcy5jdXJyZW50Vmlldz8uaWQgIT09IHZpZXc/LmlkO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFZpZXcgPSB2aWV3O1xyXG4gICAgICAgIGlmICghY2hhbmdlZCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucmVzdG9yZVRhZ3NGb3JBY3RpdmVWaWV3KHZpZXcpO1xyXG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLm9uVmlld0NoYW5nZWQubmV4dCh2aWV3KSk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9yY2VzIHRoZSBvcGFjaXR5L2VuYWJsZWQgc3RhdGUgdG8gYmUgcHVzaGVkIGFnYWluIHRvIGV2ZXJ5IHRhZy4gVGhlIFNES1xyXG4gICAqIHJlLXJlbmRlcnMgdGhlIHNoYXJlZCBsYXllcidzIHRhZ3Mgb24gYSB2aWV3IHN3YXAsIGFuZCB0aGUgbWVtb2l6ZWQgdmFsdWVzIHdvdWxkXHJcbiAgICogb3RoZXJ3aXNlIG1ha2UgdXBkYXRlVGFnc1Zpc2liaWxpdHlGb3JDb250ZXh0KCkgc2tpcCB0aGVtLCBsZWF2aW5nIHRhZ3MgaW52aXNpYmxlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVhcHBseVRhZ3NWaXNpYmlsaXR5KCk6IHZvaWQge1xyXG4gICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5yZXNldFZpc2liaWxpdHlDYWNoZSgpO1xyXG4gICAgdGhpcy5yZWZyZXNoVGFnc1Zpc2liaWxpdHkoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFB1dHMgdGhlIHRhZ3MgYmFjayBpbiBzaGFwZSBpbiB0aGUgdmlldyB0aGF0IGp1c3QgYmVjYW1lIGFjdGl2ZS5cclxuICAgKlxyXG4gICAqIEFjdGl2YXRpbmcgYSB2aWV3IHJlLW1hdGVyaWFsaXplcyB0aGUgc2hhcmVkIGxheWVyJ3MgdGFncyBmcm9tIHRoZSBkZXNjcmlwdG9yc1xyXG4gICAqIHJlY29yZGVkIHdoZW4gdGhleSB3ZXJlIGFkZGVkLCBzbyBldmVyeXRoaW5nIGFwcGxpZWQgdG8gYSB0YWcgKmFmdGVyd2FyZHMqIHRocm91Z2hcclxuICAgKiB0aGUgZ2xvYmFsIFRhZyBtb2R1bGUgaXMgZHJvcHBlZCBhbG9uZyB0aGUgd2F5OiB0aGUgY3VzdG9tIGljb24gKHRoZSBwaW4gZmFsbHMgYmFja1xyXG4gICAqIHRvIHRoZSBkZXNjcmlwdG9yJ3Mgd2hpdGUpIGFuZCB0aGUgc2FuZGJveCBjYXJyeWluZyB0aGUgaG92ZXIgY29udGVudC4gVGhleSBoYXZlIHRvXHJcbiAgICogYmUgYXBwbGllZCBhZ2FpbiBvbiB0aGUgZnJlc2hseSByZWJ1aWx0IHRhZ3MuXHJcbiAgICpcclxuICAgKiBWaXNpYmlsaXR5IGlzIHJlZnJlc2hlZCBzdHJhaWdodCBhd2F5IHNvIHRoZSB0YWdzIHNob3cgdXAgd2l0aG91dCB3YWl0aW5nLCB0aGVuXHJcbiAgICogY29udGVudCBpcyByZS1hcHBsaWVkIG9uY2UgdGhlIHRyYW5zaXRpb24gaXMgb3ZlciDigJQgcmUtYXBwbHlpbmcgaXQgdG9vIGVhcmx5IHdvdWxkXHJcbiAgICogdGFyZ2V0IHRhZ3MgdGhlIFNESyBoYXMgbm90IHJlYnVpbHQgeWV0LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVzdG9yZVRhZ3NGb3JBY3RpdmVWaWV3KHZpZXc6IE1hdHRlcnBvcnRWaWV3KTogdm9pZCB7XHJcbiAgICAvLyBBIHZpZXcgb25seSBtYXRlcmlhbGl6ZXMgaXRzIGxheWVycyBvbmNlIGFjdGl2YXRlZDogKHJlKWF0dGFjaCB0aGUgc2hhcmVkIG9uZS5cclxuICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuYXR0YWNoU2hhcmVkVGFnTGF5ZXJUb1ZpZXdzKHRoaXMuc2RrLCBbdmlld10pXHJcbiAgICAgIC50aGVuKCgpID0+IHRoaXMucmVhcHBseVRhZ3NWaXNpYmlsaXR5KCkpO1xyXG4gICAgdGhpcy5yZWFwcGx5VGFnc1Zpc2liaWxpdHkoKTtcclxuXHJcbiAgICBjbGVhclRpbWVvdXQodGhpcy52aWV3U3dpdGNoUmVzdG9yZVRpbWVyKTtcclxuICAgIHRoaXMudmlld1N3aXRjaFJlc3RvcmVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnJlZnJlc2hUYWdzQ29udGVudCgpXHJcbiAgICAgICAgLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignW01hdHRlcnBvcnRTZXJ2aWNlXSBDYW5ub3QgcmVzdG9yZSB0YWdzIGZvciB2aWV3Jywgdmlldz8uaWQsIGUpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5yZWFwcGx5VGFnc1Zpc2liaWxpdHkoKSk7XHJcbiAgICB9LCBNYXR0ZXJwb3J0U2VydmljZS5WSUVXX1NXSVRDSF9SRUZSRVNIX0RFTEFZX01TKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlLWFwcGxpZXMgdGhlIGljb24gYW5kIHRoZSBpbmplY3RlZCBIVE1MIG9mIGV2ZXJ5IHRhZyB3ZSBvd24uIFVzZWQgYWZ0ZXIgYSB2aWV3XHJcbiAgICogc3dpdGNoLCBzZWUgcmVzdG9yZVRhZ3NGb3JBY3RpdmVWaWV3KCkuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoVGFnc0NvbnRlbnQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMuc2RrKSByZXR1cm47XHJcblxyXG4gICAgLy8gU25hcHNob3Q6IHRoZSBkaWN0aW9uYXJ5IGNhbiBiZSBtdXRhdGVkIHdoaWxlIHRoZSBhd2FpdHMgYmVsb3cgYXJlIHBlbmRpbmcuXHJcbiAgICBmb3IgKGNvbnN0IFtzaWQsIG1hdHRlcnRhZ0RhdGFdIG9mIFsuLi50aGlzLmRpY3Rpb25uYXJ5VGFnc10pIHtcclxuICAgICAgaWYgKHNpZCA9PT0gdGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdykgY29udGludWU7XHJcbiAgICAgIGF3YWl0IHRoaXMuc2V0VGFnSWNvbkFuZE9wYWNpdHkoc2lkLCBtYXR0ZXJ0YWdEYXRhKTtcclxuICAgICAgdGhpcy5pbmplY3RIdG1sSW5UYWcobWF0dGVydGFnRGF0YS5nZXRUeXBlKCksIG1hdHRlcnRhZ0RhdGEuZ2V0T2JqZWN0KCksIHNpZClcclxuICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ1tNYXR0ZXJwb3J0U2VydmljZV0gSFRNTCByZS1pbmplY3Rpb24gZmFpbGVkIGZvcicsIHNpZCwgZXJyKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJWaWV3U3Vic2NyaXB0aW9ucygpOiB2b2lkIHtcclxuICAgIGNsZWFyVGltZW91dCh0aGlzLnZpZXdTd2l0Y2hSZXN0b3JlVGltZXIpO1xyXG4gICAgdGhpcy52aWV3U3dpdGNoUmVzdG9yZVRpbWVyID0gbnVsbDtcclxuICAgIGZvciAoY29uc3Qgc3Vic2NyaXB0aW9uIG9mIHRoaXMudmlld1N1YnNjcmlwdGlvbnMpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBzdWJzY3JpcHRpb24uY2FuY2VsKCk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignW01hdHRlcnBvcnRTZXJ2aWNlXSBDYW5ub3QgY2FuY2VsIHZpZXcgc3Vic2NyaXB0aW9uJywgZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMudmlld1N1YnNjcmlwdGlvbnMgPSBbXTtcclxuICB9XHJcblxyXG4gIC8qKiBUcnVlIHdoZW4gdGhlIHNwYWNlIHByb3ZpZGVzIGEgZGVmdXJuaXNoZWQgdmlldy4gKi9cclxuICBnZXQgaGFzRGVmdXJuaXNoVmlldygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnZpZXdzQnlUeXBlLmhhcyhNYXR0ZXJwb3J0Vmlld1R5cGUuREVGVVJOSVNIKTtcclxuICB9XHJcblxyXG4gIC8qKiBUcnVlIHdoZW4gdGhlIGRlZnVybmlzaGVkIHZpZXcgaXMgdGhlIGFjdGl2ZSBvbmUuICovXHJcbiAgZ2V0IGlzRGVmdXJuaXNoZWRWaWV3KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFZpZXc/LnR5cGUgPT09IE1hdHRlcnBvcnRWaWV3VHlwZS5ERUZVUk5JU0g7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTd2l0Y2hlcyBiZXR3ZWVuIHRoZSBkZWZ1cm5pc2hlZCB2aWV3IGFuZCB0aGUgZnVybmlzaGVkIG9uZS5cclxuICAgKiBAcGFyYW0gcmV0dXJuVG9TdGFydCBNb3ZlIHRoZSBjYW1lcmEgYmFjayB0byB0aGUgdmlldydzIHN0YXJ0IGxvY2F0aW9uLlxyXG4gICAqL1xyXG4gIGFzeW5jIHRvZ2dsZURlZnVybmlzaFZpZXcocmV0dXJuVG9TdGFydDogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmlzRGVmdXJuaXNoZWRWaWV3XHJcbiAgICAgID8gdGhpcy52aWV3c0J5VHlwZS5nZXQoTWF0dGVycG9ydFZpZXdUeXBlLkxBWUVSRURfQkFTRSkgPz8gdGhpcy52aWV3c0J5VHlwZS5nZXQoTWF0dGVycG9ydFZpZXdUeXBlLkJBU0UpXHJcbiAgICAgIDogdGhpcy52aWV3c0J5VHlwZS5nZXQoTWF0dGVycG9ydFZpZXdUeXBlLkRFRlVSTklTSCk7XHJcblxyXG4gICAgaWYgKCF0YXJnZXQpIHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ1tNYXR0ZXJwb3J0U2VydmljZV0gTm8gdGFyZ2V0IHZpZXcgdG8gc3dpdGNoIHRvJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGF3YWl0IHRhcmdldC5zZXRBY3RpdmUocmV0dXJuVG9TdGFydCk7XHJcbiAgfVxyXG5cclxuICAvL1xyXG4gIC8vIC0tLS0tLS0tLS0gVmlld2VyIHJlbGF0ZWQgKHN3aXRjaCB2aWV3cywgZ28gdG8pIC0tLS0tLS0tLS1cclxuICAvL1xyXG4gIGFzeW5jIGFjdGlvbl90b29sYm94X2Zsb29ycGxhbigpIHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmFjdGlvbl90b29sYm94X2Zsb29ycGxhbih0aGlzLnNkayk7XHJcbiAgfVxyXG5cclxuICBhY3Rpb25fdG9vbGJveF9pbnNpZGVfdmlldygpIHtcclxuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuYWN0aW9uX3Rvb2xib3hfaW5zaWRlX3ZpZXcodGhpcy5zZGspO1xyXG4gIH1cclxuXHJcbiAgYWN0aW9uU2hvd0FsbEZsb29ycygpIHtcclxuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuYWN0aW9uU2hvd0FsbEZsb29ycyh0aGlzLnNkayk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhY3Rpb25fdG9vbGJveF9kb2xsaG91c2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5hY3Rpb25fdG9vbGJveF9kb2xsaG91c2UodGhpcy5zZGspO1xyXG4gIH1cclxuXHJcbiAgYWN0aW9uX3Rvb2xib3hfbWVzdXJlKCkge1xyXG4gICAgY29uc3QgbmV3U3RhdGUgPSAhdGhpcy5pc01lYXN1cmVNb2RlT247XHJcbiAgICB0aGlzLnNkay5NZWFzdXJlbWVudHMudG9nZ2xlTW9kZShuZXdTdGF0ZSkudGhlbigoKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgIGBNZWFzdXJlbWVudCBtb2RlIGlzIG5vdyAke25ld1N0YXRlID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJ31gXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFjdGlvbl90b29sYm94X2NhbmNlbF9tZXN1cmUoKSB7XHJcbiAgICBpZiAodGhpcy5pc01lYXN1cmVNb2RlT24pIHtcclxuICAgICAgdGhpcy5hY3Rpb25fdG9vbGJveF9tZXN1cmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGFjdGlvbl9nb190b19mbG9vcihcclxuICAgIGZsb29yTmFtZTogc3RyaW5nLFxyXG4gICAgbWF0dGVycG9ydEZsb29yU2VxdWVuY2U6IG51bWJlciA9IG51bGxcclxuICApIHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmFjdGlvbl9nb190b19mbG9vcih0aGlzLnNkaywgZmxvb3JOYW1lLCBtYXR0ZXJwb3J0Rmxvb3JTZXF1ZW5jZSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhY3Rpb25fZ29fdG9fc3dlZXAoc3dlZXA6IHN0cmluZywgcm90YXRpb24/OiB7IHg6IG51bWJlciwgeTogbnVtYmVyIH0gfCBudWxsKSB7XHJcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5hY3Rpb25fZ29fdG9fc3dlZXAodGhpcy5zZGssIHN3ZWVwLCByb3RhdGlvbik7XHJcbiAgfVxyXG5cclxuICBnZXRDdXJyZW50U3dlZXAoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5nZXRDdXJyZW50U3dlZXAodGhpcy5wb3NlQ2FtZXJhKTtcclxuICB9XHJcblxyXG4gIGdldEN1cnJlbnRDYW1lcmFQb3NpdGlvbigpOiB7XHJcbiAgICByb3RhdGlvbjogYW55O1xyXG4gICAgcG9zaXRpb246IGFueTtcclxuICAgIHN3ZWVwOiBhbnk7XHJcbiAgfSB8IG51bGwge1xyXG4gICAgaWYgKHRoaXMucG9zZUNhbWVyYSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5wb3NlQ2FtZXJhO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBzZXRJbnRlcmFjdGlvbk1vZGUoaW50ZXJhY3Rpb25Nb2RlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuaW50ZXJhY3Rpb25Nb2RlID0gaW50ZXJhY3Rpb25Nb2RlO1xyXG4gIH1cclxuXHJcbiAgZ2V0SW50ZXJhY3Rpb25Nb2RlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaW50ZXJhY3Rpb25Nb2RlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgYWxsIHZhcmlhYmxlcywgZGVsZXRlcyBhbGwgdGFncyAod2hlbiB2aWV3ZXIgaXMgcmVtb3ZlciBvciBtb2RlbCBjaGFuZ2VkPXJlbG9hZCBuZWVkZWQpXHJcbiAgICovXHJcbiAgYXN5bmMgY2xlYXJBbGwoKSB7XHJcbiAgICB0aGlzLmNhbmNlbE9iamVjdDNEUGxhY2VtZW50KCk7XHJcbiAgICB0aGlzLnJlbW92ZUVzY2FwZUxpc3RlbmVyKCk7XHJcbiAgICB0aGlzLmxvY2tlZFN3ZWVwc1NuYXBzaG90ID0ge307XHJcbiAgICB0aGlzLmtub3duU3dlZXBzID0ge307XHJcbiAgICB0aGlzLmNsZWFyVmlld1N1YnNjcmlwdGlvbnMoKTtcclxuICAgIHRoaXMudmlld3NCeVR5cGUuY2xlYXIoKTtcclxuICAgIHRoaXMuY3VycmVudFZpZXcgPSBudWxsO1xyXG4gICAgYXdhaXQgdGhpcy5hY3Rpb25fZGVsZXRlX2FsbF9tYXR0ZXJ0YWdzKCk7XHJcbiAgICB0aGlzLmZsb29ycyA9IG51bGw7XHJcbiAgICB0aGlzLnN3ZWVwcyA9IG51bGw7XHJcbiAgICB0aGlzLnNkayA9IG51bGw7XHJcblxyXG4gICAgdGhpcy5wb2ludGVyU2VydmljZS5jbGVhcih7XHJcbiAgICAgIG9uTGVmdENsaWNrOiB0aGlzLnBvaW50ZXJMZWZ0Q2xpY2tIYW5kbGVyLmJpbmQodGhpcyksXHJcbiAgICAgIG9uUmlnaHRDbGljazogdGhpcy5wb2ludGVyUmlnaHRDbGlja0hhbmRsZXIuYmluZCh0aGlzKSxcclxuICAgICAgb25NaWRkbGVDbGljazogdGhpcy5wb2ludGVyTWlkZGxlQ2xpY2tIYW5kbGVyLmJpbmQodGhpcyksXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZvcmJpZGRlblN3ZWVwcyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVtb3ZlRm9yYmlkZGVuU3dlZXBzKGZvcmJpZGRlblN3ZWVwczogc3RyaW5nW10pIHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnJlbW92ZUZvcmJpZGRlblN3ZWVwcyh0aGlzLnNkaywgZm9yYmlkZGVuU3dlZXBzKTtcclxuICB9XHJcblxyXG4gIC8vXHJcbiAgLy8gLS0tLS0tLS0tLSAzRCBvYmplY3RzIChTREsgQnVuZGxlIG9ubHkpIC0tLS0tLS0tLS1cclxuICAvL1xyXG4gIGFzeW5jIGluaXQzRE9iamVjdFZpZXdlcigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5pbml0M0RPYmplY3RWaWV3ZXIodGhpcy5zZGspO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkcyBhIDNEIG1vZGVsOyByZXNvbHZlcyBvbmNlIGl0IGlzIGxvYWRlZCwgcmVqZWN0cyBvbiB1bmtub3duIGZvcm1hdCBvciBsb2FkIHRpbWVvdXQgKH4xNSBzKS5cclxuICAgKi9cclxuICBhc3luYyBhZGQzRE9iamVjdChcclxuICAgIG9iajogSU9iamVjdDNELFxyXG4gICAgbW9kZT86IEdpem1vTW9kZVxyXG4gICk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UuYWRkM0RPYmplY3QodGhpcy5zZGssIG9iaiwgbW9kZSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVPYmplY3RWaXNpYmlsaXR5KG9iamVjdElkOiBhbnkpIHtcclxuICAgIHRoaXMub2JqZWN0M0RTZXJ2aWNlLnRvZ2dsZU9iamVjdFZpc2liaWxpdHkob2JqZWN0SWQpO1xyXG4gIH1cclxuXHJcbiAgaXNPYmplY3RWaXNpYmxlKG9iamVjdElkOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5pc09iamVjdFZpc2libGUob2JqZWN0SWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqIE1vdmVzIHRoZSBjYW1lcmEgdG8gdGhlIG9iamVjdCAoY2VudGVyZWQgb24gaXRzIGJvdW5kaW5nIGJveCkuIFJlc29sdmVzIGZhbHNlIHdoZW4gdGhlIG9iamVjdCBpcyB1bmtub3duLiAqL1xyXG4gIC8qKlxyXG4gICAqIE1vdmVzIHRoZSBjYW1lcmEgdG8gdGhlIHN3ZWVwIGNsb3Nlc3QgdG8gYSAzRCBvYmplY3QgYW5kIHR1cm5zIGl0IHRvd2FyZCB0aGUgb2JqZWN0LlxyXG4gICAqIEBwYXJhbSB2aXNpYmxlQXJlYSBjbGllbnQgWCBib3VuZHMgb2YgdGhlIHBhcnQgb2YgdGhlIHZpZXdlciBub3QgY292ZXJlZCBieSBvdGhlciBwYW5lbHNcclxuICAgKiAgICAgICAgICAgICAgICAgICAgKHRoZSBsYXRlcmFsIG1lbnUgY292ZXJzIHRoZSByaWdodCBvZiB0aGUgdmlld2VyKTogdGhlIG9iamVjdCBpcyBjZW50ZXJlZCB0aGVyZS5cclxuICAgKiBGYWxscyBiYWNrIHRvIHRoZSB0ZW1wb3JhcnkgdGFnIG5hdmlnYXRpb24gd2hlbiBubyBzd2VlcCBjYW4gYmUgdXNlZC5cclxuICAgKi9cclxuICBhc3luYyBwb2ludENhbWVyYVRvM0RPYmplY3Qob2JqZWN0SWQ6IGFueSwgdmlzaWJsZUFyZWE/OiB7IGxlZnQ6IG51bWJlcjsgcmlnaHQ6IG51bWJlciB9KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBib3ggPSB0aGlzLm9iamVjdDNEU2VydmljZS5nZXRPYmplY3QzREJvdW5kaW5nQm94KG9iamVjdElkKTtcclxuICAgIGNvbnN0IHN3ZWVwID0gYm94ID8gdGhpcy5maW5kTmVhcmVzdFN3ZWVwKGJveC5jZW50ZXIpIDogbnVsbDtcclxuICAgIGNvbnN0IHN3ZWVwRGF0YSA9IHN3ZWVwID8geyAuLi50aGlzLmxvY2tlZFN3ZWVwc1NuYXBzaG90LCAuLi4odGhpcy5zd2VlcENvbGxlY3Rpb24gPz8ge30pIH1bc3dlZXAuc2lkXSA6IG51bGw7XHJcbiAgICBpZiAoYm94ICYmIHN3ZWVwRGF0YT8ucG9zaXRpb24gJiYgdGhpcy5zZGs/LlN3ZWVwKSB7XHJcbiAgICAgIGNvbnN0IHByb2plY3Rpb24gPSAodGhpcy5wb3NlQ2FtZXJhIGFzIGFueSk/LnByb2plY3Rpb247XHJcbiAgICAgIGNvbnN0IHRhbkhhbGZGb3YgPSBwcm9qZWN0aW9uPy5bMF0gPyAxIC8gcHJvamVjdGlvblswXSA6IDE7XHJcbiAgICAgIGxldCBzY3JlZW5YID0gMDtcclxuICAgICAgY29uc3Qgdmlld2VyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3ZpZXdlci1tb2R1bGUnKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XHJcbiAgICAgIGlmICh2aXNpYmxlQXJlYSAmJiB2aWV3ZXIpIHtcclxuICAgICAgICBjb25zdCByZWN0ID0gdmlld2VyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIHNjcmVlblggPSB2aXNpYmxlQ2VudGVyU2NyZWVuWChyZWN0LCB2aXNpYmxlQXJlYS5sZWZ0LCB2aXNpYmxlQXJlYS5yaWdodCk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3Qgcm90YXRpb24gPSBjb21wdXRlRnJhbWluZ1JvdGF0aW9uKHN3ZWVwRGF0YS5wb3NpdGlvbiwgYm94LmNlbnRlciwgdGFuSGFsZkZvdiwgc2NyZWVuWCk7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgaWYgKHRoaXMucG9zZUNhbWVyYT8uc3dlZXAgPT09IHN3ZWVwLnNpZCkge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zZGsuQ2FtZXJhLnNldFJvdGF0aW9uKHJvdGF0aW9uLCB7IHNwZWVkOiA4MCB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zZGsuU3dlZXAubW92ZVRvKHN3ZWVwLnNpZCwge1xyXG4gICAgICAgICAgICByb3RhdGlvbixcclxuICAgICAgICAgICAgdHJhbnNpdGlvbjogdGhpcy5zZGsuU3dlZXAuVHJhbnNpdGlvbj8uRkxZLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIC8vIGRpc2FibGVkIG9yIHVucmVhY2hhYmxlIHN3ZWVwOiB1c2UgdGhlIHRhZyBuYXZpZ2F0aW9uIGJlbG93XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5wb2ludENhbWVyYVRvM0RPYmplY3QoXHJcbiAgICAgIHRoaXMuc2RrLFxyXG4gICAgICBvYmplY3RJZCxcclxuICAgICAgdGhpcy5jcmVhdGVNYXR0ZXJ0YWdGcm9tUE9JLmJpbmQodGhpcyksXHJcbiAgICAgIHRoaXMuZ29Ub1RhZy5iaW5kKHRoaXMpLFxyXG4gICAgICB0aGlzLmRlbGV0ZUxhc3RNYXR0ZXJ0YWcuYmluZCh0aGlzKSxcclxuICAgICAgdGhpcy5nZXRUYWdGcm9tRWxlbWVudElkLmJpbmQodGhpcylcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXRTY2VuZU5vZGVGcm9tT2JqZWN0M0RJZCh1dWlkOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmdldFNjZW5lTm9kZUZyb21PYmplY3QzRElkKHV1aWQpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZGlzcGxheUF6aW11dGFsQ3Jvd24oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UuZGlzcGxheUF6aW11dGFsQ3Jvd24odGhpcy5wb3NlQ2FtZXJhKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGF0dGFjaEdpem1vQ29udHJvbFRvM0RPYmplY3QoXHJcbiAgICBtb2RlbE5vZGU6IGFueSxcclxuICAgIHNjZW5lT2JqZWN0OiBhbnksXHJcbiAgICBtb2RlOiBHaXptb01vZGUsXHJcbiAgICB2aXNpYmxlOiBib29sZWFuLFxyXG4gICAgaXNOZXdPYmplY3Q6IGJvb2xlYW5cclxuICApOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmF0dGFjaEdpem1vQ29udHJvbFRvM0RPYmplY3QodGhpcy5zZGssIG1vZGVsTm9kZSwgc2NlbmVPYmplY3QsIG1vZGUsIHZpc2libGUsIGlzTmV3T2JqZWN0KTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUdpem1vRnJvbUxhc3RPYmplY3QoKTogdm9pZCB7XHJcbiAgICB0aGlzLm9iamVjdDNEU2VydmljZS5yZW1vdmVHaXptb0Zyb21MYXN0T2JqZWN0KCk7XHJcbiAgfVxyXG5cclxuICAvKiogVG9nZ2xlcyB0aGUgZnJ1c3R1bSBvZiB0aGUgc2VjdXJpdHkgY2FtZXJhIGB1dWlkYCAoZGVmYXVsdDogdGhlIGxhc3QgbG9hZGVkIG9uZSkgKi9cclxuICB0b2dnbGVWaWV3RnJ1c3R1bSh1dWlkPzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLm9iamVjdDNEU2VydmljZS50b2dnbGVWaWV3RnJ1c3R1bSh1dWlkKTtcclxuICB9XHJcblxyXG4gIHNldFZpZXdGcnVzdHVtKHV1aWQ6IHN0cmluZywgdmlzaWJsZTogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLnNldFZpZXdGcnVzdHVtKHV1aWQsIHZpc2libGUpO1xyXG4gIH1cclxuXHJcbiAgaXNWaWV3RnJ1c3R1bVZpc2libGUodXVpZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UuaXNWaWV3RnJ1c3R1bVZpc2libGUodXVpZCk7XHJcbiAgfVxyXG5cclxuICAvL1xyXG4gIC8vIC0tLS0tLS0tLS0gM0Qgb2JqZWN0czogZ2VvbWV0cnksIHRyYW5zZm9ybSwgZ2l6bW8gLS0tLS0tLS0tLVxyXG4gIC8vXHJcbiAgLyoqIEVtaXRzIG9uIGdpem1vIGNoYW5nZXMgYW5kIG9uIHNldE9iamVjdDNEVHJhbnNmb3JtIC8gcGxhY2VPYmplY3QzRE9uU3VyZmFjZSAvIG5vcm1hbGl6ZU9iamVjdDNEU2l6ZSAqL1xyXG4gIHB1YmxpYyBnZXQgb2JqZWN0M0RUcmFuc2Zvcm1DaGFuZ2VkJCgpOiBTdWJqZWN0PE9iamVjdDNEVHJhbnNmb3JtQ2hhbmdlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2Uub2JqZWN0M0RUcmFuc2Zvcm1DaGFuZ2VkJDtcclxuICB9XHJcblxyXG4gIC8qKiBXb3JsZC1zcGFjZSBib3VuZGluZyBib3gsIG51bGwgd2hlbiB0aGUgb2JqZWN0IGlzIHVua25vd24gb3Igbm90IGxvYWRlZCAqL1xyXG4gIGdldE9iamVjdDNEQm91bmRpbmdCb3godXVpZDogc3RyaW5nKTogT2JqZWN0M0RCb3VuZGluZ0JveCB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmdldE9iamVjdDNEQm91bmRpbmdCb3godXVpZCk7XHJcbiAgfVxyXG5cclxuICAvKiogRGltZW5zaW9ucyBvZiB0aGUgbW9kZWwgaW4gbWV0ZXJzLCB3aXRob3V0IGl0cyByb3RhdGlvbiAqL1xyXG4gIGdldE9iamVjdDNERGltZW5zaW9ucyh1dWlkOiBzdHJpbmcpOiBQb2ludDNEIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UuZ2V0T2JqZWN0M0REaW1lbnNpb25zKHV1aWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFVuaWZvcm0gc2NhbGUgc28gdGhlIGxhcmdlc3QgZGltZW5zaW9uIGVxdWFscyBgdGFyZ2V0U2l6ZU1ldGVyc2A7IHJldHVybnMgdGhlIG5ldyBzY2FsZSBvciBudWxsICovXHJcbiAgbm9ybWFsaXplT2JqZWN0M0RTaXplKHV1aWQ6IHN0cmluZywgdGFyZ2V0U2l6ZU1ldGVyczogbnVtYmVyKTogUG9pbnQzRCB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLm5vcm1hbGl6ZU9iamVjdDNEU2l6ZSh1dWlkLCB0YXJnZXRTaXplTWV0ZXJzKTtcclxuICB9XHJcblxyXG4gIC8qKiBNb3ZlcyB0aGUgb2JqZWN0IHNvIGl0cyBib3VuZGluZyBib3ggYm90dG9tLWNlbnRlciAodG9wLWNlbnRlciBvbiBhIGNlaWxpbmcpIGxpZXMgb24gYHBvaW50YCAqL1xyXG4gIHBsYWNlT2JqZWN0M0RPblN1cmZhY2UodXVpZDogc3RyaW5nLCBwb2ludDogUG9pbnQzRCwgbm9ybWFsPzogUG9pbnQzRCwgZnJvbnRZYXdPZmZzZXQgPSAwKTogT2JqZWN0M0RUcmFuc2Zvcm0gfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5wbGFjZU9iamVjdDNET25TdXJmYWNlKHV1aWQsIHBvaW50LCBub3JtYWwsIGZyb250WWF3T2Zmc2V0KTtcclxuICB9XHJcblxyXG4gIGdldE9iamVjdDNEVHJhbnNmb3JtKHV1aWQ6IHN0cmluZyk6IE9iamVjdDNEVHJhbnNmb3JtIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UuZ2V0T2JqZWN0M0RUcmFuc2Zvcm0odXVpZCk7XHJcbiAgfVxyXG5cclxuICAvKiogUm90YXRpb24gaW4gcmFkaWFucyAqL1xyXG4gIHNldE9iamVjdDNEVHJhbnNmb3JtKHV1aWQ6IHN0cmluZywgdHJhbnNmb3JtOiBQYXJ0aWFsPE9iamVjdDNEVHJhbnNmb3JtPik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLnNldE9iamVjdDNEVHJhbnNmb3JtKHV1aWQsIHRyYW5zZm9ybSk7XHJcbiAgfVxyXG5cclxuICBhdHRhY2hHaXptbyh1dWlkOiBzdHJpbmcsIG1vZGU6IEdpem1vTW9kZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmF0dGFjaEdpem1vKHV1aWQsIG1vZGUsIHRoaXMuc2RrKTtcclxuICB9XHJcblxyXG4gIHNldEdpem1vTW9kZShtb2RlOiBHaXptb01vZGUpOiB2b2lkIHtcclxuICAgIHRoaXMub2JqZWN0M0RTZXJ2aWNlLnNldEdpem1vTW9kZShtb2RlKTtcclxuICB9XHJcblxyXG4gIGRldGFjaEdpem1vKHV1aWQ/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmRldGFjaEdpem1vKHV1aWQpO1xyXG4gIH1cclxuXHJcbiAgaXNHaXptb0F0dGFjaGVkKHV1aWQ/OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5pc0dpem1vQXR0YWNoZWQodXVpZCk7XHJcbiAgfVxyXG5cclxuICAvKiogbnVsbCBkaXNhYmxlcyBzbmFwcGluZyAoZGVmYXVsdCkgKi9cclxuICBzZXRHaXptb1NuYXAoc25hcDogR2l6bW9TbmFwIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgdGhpcy5vYmplY3QzRFNlcnZpY2Uuc2V0R2l6bW9TbmFwKHNuYXApO1xyXG4gIH1cclxuXHJcbiAgLyoqIExpbWl0cyBvZiBhIHRyYW5zbGF0ZSBkcmFnIGZyb20gaXRzIHN0YXJ0IChkZWZhdWx0IDIgbSwgKy8tIDEuNSBtIHZlcnRpY2FsbHkpICovXHJcbiAgc2V0R2l6bW9NYXhEcmFnRGlzdGFuY2UobWF4RGlzdGFuY2U6IG51bWJlciwgbWF4SGVpZ2h0PzogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLm9iamVjdDNEU2VydmljZS5zZXRHaXptb01heERyYWdEaXN0YW5jZShtYXhEaXN0YW5jZSwgbWF4SGVpZ2h0KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvY2tzIC8gdW5sb2NrcyBjYW1lcmEgbmF2aWdhdGlvbiB0byBvdGhlciBzd2VlcHMgd2hpbGUgYSBnaXptbyBpcyBlZGl0ZWQ6IGV2ZXJ5IGVuYWJsZWQgc3dlZXBcclxuICAgKiBleGNlcHQgdGhlIGN1cnJlbnQgb25lIGlzIGRpc2FibGVkLCBhbmQgZXhhY3RseSB0aG9zZSBhcmUgcmUtZW5hYmxlZCBvbiB1bmxvY2suXHJcbiAgICogQHJldHVybnMgZmFsc2Ugd2hlbiB0aGUgbG9jayBjb3VsZCBub3QgYmUgYXBwbGllZCAoU0RLIG5vdCByZWFkeSwgY3VycmVudCBzd2VlcCB1bmtub3duKVxyXG4gICAqL1xyXG4gIGFzeW5jIHNldE5hdmlnYXRpb25Mb2NrZWQobG9ja2VkOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIXRoaXMuc2RrKSByZXR1cm4gZmFsc2U7XHJcbiAgICBjb25zdCBjdXJyZW50U3dlZXAgPSB0aGlzLnBvc2VDYW1lcmE/LnN3ZWVwID8/IG51bGw7XHJcbiAgICBjb25zdCBzd2VlcHMgPSB7IC4uLnRoaXMua25vd25Td2VlcHMsIC4uLih0aGlzLnN3ZWVwQ29sbGVjdGlvbiA/PyB7fSkgfTtcclxuICAgIGlmIChsb2NrZWQgJiYgIXRoaXMub2JqZWN0M0RTZXJ2aWNlLmlzTmF2aWdhdGlvbkxvY2tlZCgpKSB7XHJcbiAgICAgIHRoaXMubG9ja2VkU3dlZXBzU25hcHNob3QgPSBzd2VlcHM7XHJcbiAgICB9XHJcbiAgICBjb25zdCBrZWVwRGlzYWJsZWQgPSAodGhpcy5mb3JiaWRkZW5Td2VlcHMgPz8gW10pLm1hcCgocykgPT4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5yZXNvbHZlU3dlZXBTaWQocykpO1xyXG4gICAgY29uc3QgZG9uZSA9IGF3YWl0IHRoaXMub2JqZWN0M0RTZXJ2aWNlLnNldE5hdmlnYXRpb25Mb2NrZWQoXHJcbiAgICAgIHRoaXMuc2RrLCBsb2NrZWQsIHN3ZWVwcywgY3VycmVudFN3ZWVwLCBrZWVwRGlzYWJsZWRcclxuICAgICk7XHJcbiAgICBpZiAoIWxvY2tlZCB8fCAhZG9uZSkge1xyXG4gICAgICB0aGlzLmxvY2tlZFN3ZWVwc1NuYXBzaG90ID0ge307XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZG9uZTtcclxuICB9XHJcblxyXG4gIGlzTmF2aWdhdGlvbkxvY2tlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5pc05hdmlnYXRpb25Mb2NrZWQoKTtcclxuICB9XHJcblxyXG4gIC8vXHJcbiAgLy8gLS0tLS0tLS0tLSAzRCBvYmplY3RzOiBpbnRlcmFjdGl2ZSBwbGFjZW1lbnQgLS0tLS0tLS0tLVxyXG4gIC8vXHJcbiAgLyoqXHJcbiAgICogTWFrZXMgYW4gYWxyZWFkeSBsb2FkZWQgbW9kZWwgZm9sbG93IHRoZSBjdXJzb3Igb24gdGhlIHN1cmZhY2VzIG9mIHRoZSB2aXNpdC5cclxuICAgKiBMZWZ0IGNsaWNrIHJlc29sdmVzIHdpdGggdGhlIHN1cmZhY2UgcG9pbnQgLyBub3JtYWwgdW5kZXIgdGhlIGN1cnNvciAocmVhZCB0aGUgb2JqZWN0IG9yaWdpblxyXG4gICAqIHdpdGggZ2V0T2JqZWN0M0RUcmFuc2Zvcm0pOyByaWdodCBjbGljayBvciBFc2NhcGUgaGlkZXMgdGhlIG1vZGVsIGFuZCByZXNvbHZlcyBudWxsXHJcbiAgICogKGRlbGV0aW5nIGl0IGlzIHVwIHRvIHRoZSBjYWxsZXIpLiBSZXNvbHZlcyBudWxsIHJpZ2h0IGF3YXkgaWYgYW5vdGhlciBpbnRlcmFjdGlvbiBpcyBydW5uaW5nLlxyXG4gICAqL1xyXG4gIHN0YXJ0T2JqZWN0M0RQbGFjZW1lbnQodXVpZDogc3RyaW5nLCBvcHRpb25zOiB7IGZyb250WWF3T2Zmc2V0PzogbnVtYmVyIH0gPSB7fSk6IFByb21pc2U8T2JqZWN0M0RQbGFjZW1lbnRSZXN1bHQgfCBudWxsPiB7XHJcbiAgICBpZiAoIXRoaXMub2JqZWN0M0RTZXJ2aWNlLmdldE9iamVjdDNETW9kZWxOb2RlRnJvbURpY3Rpb25uYXJ5KHV1aWQpKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vYmplY3QzRFBsYWNlbWVudCkge1xyXG4gICAgICB0aGlzLmNhbmNlbE9iamVjdDNEUGxhY2VtZW50KCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pbnRlcmFjdGlvbk1vZGUgIT09IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgdGhpcy5vYmplY3QzRFBsYWNlbWVudCA9IHsgdXVpZCwgcmVzb2x2ZSwgbGFzdFBvaW50OiBudWxsLCBsYXN0Tm9ybWFsOiBudWxsLCBmcm9udFlhd09mZnNldDogb3B0aW9ucy5mcm9udFlhd09mZnNldCA/PyAwIH07XHJcbiAgICAgIHRoaXMub2JqZWN0M0RTZXJ2aWNlLnNldE9iamVjdDNEQ29sbGlkZXJFbmFibGVkKHV1aWQsIGZhbHNlKTtcclxuICAgICAgdGhpcy5vYmplY3QzRFNlcnZpY2Uuc2V0T2JqZWN0M0RWaXNpYmxlKHV1aWQsIGZhbHNlKTtcclxuICAgICAgdGhpcy5zZXRJbnRlcmFjdGlvbk1vZGUoVmlld2VySW50ZXJhY3Rpb25zLlBMQUNJTkdfT0JKRUNUM0QpO1xyXG4gICAgICBpZiAodGhpcy5wb3NlTWF0dGVycG9ydD8ucG9zaXRpb24pIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZU9iamVjdDNEUGxhY2VtZW50UHJldmlldyh0aGlzLnBvc2VNYXR0ZXJwb3J0KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBpc1BsYWNpbmdPYmplY3QzRCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhIXRoaXMub2JqZWN0M0RQbGFjZW1lbnQ7XHJcbiAgfVxyXG5cclxuICAvKiogQ2FuY2VscyB0aGUgcnVubmluZyBvYmplY3QgcGxhY2VtZW50IChtb2RlbCBoaWRkZW4sIHByb21pc2UgcmVzb2x2ZXMgbnVsbCkgKi9cclxuICBjYW5jZWxPYmplY3QzRFBsYWNlbWVudCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHBsYWNlbWVudCA9IHRoaXMub2JqZWN0M0RQbGFjZW1lbnQ7XHJcbiAgICBpZiAoIXBsYWNlbWVudCkgcmV0dXJuO1xyXG4gICAgdGhpcy5lbmRPYmplY3QzRFBsYWNlbWVudCgpO1xyXG4gICAgdGhpcy5vYmplY3QzRFNlcnZpY2Uuc2V0T2JqZWN0M0RWaXNpYmxlKHBsYWNlbWVudC51dWlkLCBmYWxzZSk7XHJcbiAgICBwbGFjZW1lbnQucmVzb2x2ZShudWxsKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERyb3BzIHRoZSBvYmplY3Qgd2hlcmUgaXQgaXMgcHJldmlld2VkIChzYW1lIGFzIGEgbGVmdCBjbGljaykuIFRvdWNoIHNjcmVlbnMgaGF2ZSBubyBob3ZlcjogZWFjaFxyXG4gICAqIHRhcCBtb3ZlcyB0aGUgcHJldmlldywgYW5kIHRoZSBhcHAgY29uZmlybXMgd2l0aCBhIGJ1dHRvbi5cclxuICAgKiBAcmV0dXJucyBmYWxzZSB3aGVuIG5vIHN1cmZhY2Ugd2FzIHBvaW50ZWQgeWV0XHJcbiAgICovXHJcbiAgY29uZmlybU9iamVjdDNEUGxhY2VtZW50KCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLm9iamVjdDNEUGxhY2VtZW50Py5sYXN0UG9pbnQpIHJldHVybiBmYWxzZTtcclxuICAgIHRoaXMudmFsaWRhdGVPYmplY3QzRFBsYWNlbWVudCgpO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKiogVHJ1ZSBvbmNlIHRoZSBwcmV2aWV3IHN0YW5kcyBvbiBhIHN1cmZhY2UgKHRoZSBwbGFjZW1lbnQgY2FuIGJlIGNvbmZpcm1lZCkgKi9cclxuICBoYXNPYmplY3QzRFBsYWNlbWVudFBvaW50KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhdGhpcy5vYmplY3QzRFBsYWNlbWVudD8ubGFzdFBvaW50O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB2YWxpZGF0ZU9iamVjdDNEUGxhY2VtZW50KCk6IHZvaWQge1xyXG4gICAgY29uc3QgcGxhY2VtZW50ID0gdGhpcy5vYmplY3QzRFBsYWNlbWVudDtcclxuICAgIGlmICghcGxhY2VtZW50IHx8ICFwbGFjZW1lbnQubGFzdFBvaW50KSByZXR1cm47IC8vIG5vIHN1cmZhY2UgdW5kZXIgdGhlIGN1cnNvciB5ZXRcclxuICAgIHRoaXMuZW5kT2JqZWN0M0RQbGFjZW1lbnQoKTtcclxuICAgIHBsYWNlbWVudC5yZXNvbHZlKHtcclxuICAgICAgcG9zaXRpb246IHBsYWNlbWVudC5sYXN0UG9pbnQsXHJcbiAgICAgIG5vcm1hbDogcGxhY2VtZW50Lmxhc3ROb3JtYWwgPz8geyB4OiAwLCB5OiAxLCB6OiAwIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW5kT2JqZWN0M0RQbGFjZW1lbnQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBwbGFjZW1lbnQgPSB0aGlzLm9iamVjdDNEUGxhY2VtZW50O1xyXG4gICAgaWYgKCFwbGFjZW1lbnQpIHJldHVybjtcclxuICAgIHRoaXMub2JqZWN0M0RQbGFjZW1lbnQgPSBudWxsO1xyXG4gICAgdGhpcy5vYmplY3QzRFNlcnZpY2Uuc2V0T2JqZWN0M0RDb2xsaWRlckVuYWJsZWQocGxhY2VtZW50LnV1aWQsIHRydWUpO1xyXG4gICAgdGhpcy5zZXRJbnRlcmFjdGlvbk1vZGUoVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVPYmplY3QzRFBsYWNlbWVudFByZXZpZXcoaW50ZXJzZWN0aW9uOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IHBsYWNlbWVudCA9IHRoaXMub2JqZWN0M0RQbGFjZW1lbnQ7XHJcbiAgICBpZiAoIXBsYWNlbWVudCB8fCAhaW50ZXJzZWN0aW9uPy5wb3NpdGlvbikgcmV0dXJuO1xyXG4gICAgLy8gT25seSB0aGUgc2Nhbm5lZCBzdXJmYWNlczogaGl0dGluZyB0aGUgcHJldmlldyBpdHNlbGYgKHJlcG9ydGVkIGFzIFwidW5rbm93blwiKSB3b3VsZCBwdXNoIGl0IGF3YXlcclxuICAgIC8vIGFsb25nIHRoZSByYXkgYXQgZWFjaCBtb3ZlLCB1bnRpbCBpdCBsYW5kcyBraWxvbWV0ZXJzIGZyb20gdGhlIGNhbWVyYVxyXG4gICAgaWYgKHR5cGVvZiBpbnRlcnNlY3Rpb24ub2JqZWN0ID09PSAnc3RyaW5nJyAmJiAhUExBQ0VNRU5UX1NVUkZBQ0VTLmluY2x1ZGVzKGludGVyc2VjdGlvbi5vYmplY3QpKSByZXR1cm47XHJcbiAgICBjb25zdCBwb2ludCA9IHsgeDogaW50ZXJzZWN0aW9uLnBvc2l0aW9uLngsIHk6IGludGVyc2VjdGlvbi5wb3NpdGlvbi55LCB6OiBpbnRlcnNlY3Rpb24ucG9zaXRpb24ueiB9O1xyXG4gICAgY29uc3Qgbm9ybWFsID0gaW50ZXJzZWN0aW9uLm5vcm1hbFxyXG4gICAgICA/IHsgeDogaW50ZXJzZWN0aW9uLm5vcm1hbC54LCB5OiBpbnRlcnNlY3Rpb24ubm9ybWFsLnksIHo6IGludGVyc2VjdGlvbi5ub3JtYWwueiB9XHJcbiAgICAgIDogeyB4OiAwLCB5OiAxLCB6OiAwIH07XHJcbiAgICBpZiAoIXBsYWNlbWVudC5sYXN0UG9pbnQpIHtcclxuICAgICAgLy8gaGlkZGVuIHVudGlsIGl0IGlzIG9uIGEgc3VyZmFjZSAoaXQgd2FzIGxvYWRlZCBhdCB0aGUgY2FtZXJhIHBvc2l0aW9uKVxyXG4gICAgICB0aGlzLm9iamVjdDNEU2VydmljZS5zZXRPYmplY3QzRFZpc2libGUocGxhY2VtZW50LnV1aWQsIHRydWUpO1xyXG4gICAgfVxyXG4gICAgcGxhY2VtZW50Lmxhc3RQb2ludCA9IHBvaW50O1xyXG4gICAgcGxhY2VtZW50Lmxhc3ROb3JtYWwgPSBub3JtYWw7XHJcbiAgICB0aGlzLm9iamVjdDNEU2VydmljZS5wbGFjZU9iamVjdDNET25TdXJmYWNlKHBsYWNlbWVudC51dWlkLCBwb2ludCwgbm9ybWFsLCBwbGFjZW1lbnQuZnJvbnRZYXdPZmZzZXQpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRva2VuIGZvciB0aGUgcG9pbnRlciB0cmljazogdHJ1dGh5IHdoaWxlIHNvbWV0aGluZyBmb2xsb3dzIHRoZSBjdXJzb3IgKHRhZyBvciAzRCBvYmplY3QpICovXHJcbiAgcHJpdmF0ZSBnZXRGb2xsb3dUYXJnZXQoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdyA/PyB0aGlzLm9iamVjdDNEUGxhY2VtZW50Py51dWlkID8/IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYW5jZWxzIHdoYXRldmVyIGZvbGxvd3MgdGhlIGN1cnNvciAocmlnaHQgY2xpY2sgLyBFc2NhcGUpOiB0aGUgM0Qgb2JqZWN0IHByZXZpZXcsIG9yIHRoZSB0YWcuXHJcbiAgICogRW1pdHMgcGxhY2VtZW50Q2FuY2VsbGVkJCB3aGVuIHNvbWV0aGluZyB3YXMgYWN0dWFsbHkgcnVubmluZy5cclxuICAgKi9cclxuICBwcml2YXRlIGNhbmNlbEN1cnJlbnRQbGFjZW1lbnQoKTogdm9pZCB7XHJcbiAgICBjb25zdCB3YXNSdW5uaW5nID0gdGhpcy5pbnRlcmFjdGlvbk1vZGUgIT09IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUIHx8ICEhdGhpcy5vYmplY3QzRFBsYWNlbWVudDtcclxuICAgIC8vIG5vdGhpbmcgZm9sbG93cyB0aGUgY3Vyc29yOiBhIHBsYWluIHJpZ2h0IGNsaWNrIG11c3Qgbm90IHJlbW92ZSB0aGUgbGFzdCAoZXhpc3RpbmcpIHRhZ1xyXG4gICAgaWYgKCF3YXNSdW5uaW5nKSByZXR1cm47XHJcbiAgICBpZiAodGhpcy5vYmplY3QzRFBsYWNlbWVudCkge1xyXG4gICAgICB0aGlzLmNhbmNlbE9iamVjdDNEUGxhY2VtZW50KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNhbmNlbEZvbGxvd2luZ0N1cnNvcigpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wbGFjZW1lbnRDYW5jZWxsZWQkLm5leHQoKTtcclxuICB9XHJcblxyXG4gIC8qKiBFc2NhcGUgY2FuY2VscyBhbnkgcGxhY2VtZW50LiBMaXN0ZW5zIG9uIHRoZSBwYWdlIGFuZCBvbiB0aGUgKHNhbWUtb3JpZ2luKSBTaG93Y2FzZSBpZnJhbWUsIHdoaWNoIHRha2VzIHRoZSBmb2N1cyBvbiBjbGljay4gKi9cclxuICBwcml2YXRlIHJlZ2lzdGVyRXNjYXBlTGlzdGVuZXIoaWZyYW1lPzogSFRNTElGcmFtZUVsZW1lbnQgfCBudWxsKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlbW92ZUVzY2FwZUxpc3RlbmVyKCk7XHJcbiAgICBjb25zdCBoYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XHJcbiAgICAgIGlmICgoZSBhcyBLZXlib2FyZEV2ZW50KS5rZXkgIT09ICdFc2NhcGUnKSByZXR1cm47XHJcbiAgICAgIGlmICh0aGlzLmludGVyYWN0aW9uTW9kZSAhPT0gVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFQgfHwgdGhpcy5vYmplY3QzRFBsYWNlbWVudCkge1xyXG4gICAgICAgIHRoaXMuY2FuY2VsQ3VycmVudFBsYWNlbWVudCgpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgY29uc3QgdGFyZ2V0czogRXZlbnRUYXJnZXRbXSA9IFtkb2N1bWVudF07XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoaWZyYW1lPy5jb250ZW50V2luZG93KSB0YXJnZXRzLnB1c2goaWZyYW1lLmNvbnRlbnRXaW5kb3cpO1xyXG4gICAgfSBjYXRjaCB7IC8qIGNyb3NzLW9yaWdpbiBpZnJhbWU6IHBhZ2UgbGlzdGVuZXIgb25seSAqLyB9XHJcbiAgICB0YXJnZXRzLmZvckVhY2goKHRhcmdldCkgPT4ge1xyXG4gICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZXIpO1xyXG4gICAgICB0aGlzLmtleWRvd25UYXJnZXRzLnB1c2goeyB0YXJnZXQsIGhhbmRsZXIgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlRXNjYXBlTGlzdGVuZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLmtleWRvd25UYXJnZXRzLmZvckVhY2goKHsgdGFyZ2V0LCBoYW5kbGVyIH0pID0+IHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgaGFuZGxlcikpO1xyXG4gICAgdGhpcy5rZXlkb3duVGFyZ2V0cyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmNhbmNlbE9iamVjdDNEUGxhY2VtZW50KCk7XHJcbiAgICB0aGlzLnJlbW92ZUVzY2FwZUxpc3RlbmVyKCk7XHJcbiAgfVxyXG5cclxuICAvL1xyXG4gIC8vIC0tLS0tLS0tLS0gU3dlZXBzIC0tLS0tLS0tLS1cclxuICAvL1xyXG4gIC8qKlxyXG4gICAqIENsb3Nlc3QgZW5hYmxlZCBzd2VlcCB0byBhIHdvcmxkIHBvc2l0aW9uIChmb3IgaW5zdGFuY2UgdG8gcmUtYXNzaWduIHRoZSB6b25lIG9mIGEgbW92ZWQgb2JqZWN0KS5cclxuICAgKiBgc3dlZXBJZGAgaXMgdGhlIERCLWZvcm1hdCBpZCAobGlrZSBjdXJyZW50U3dlZXApLCBgc2lkYCB0aGUgU0RLIGlkLiBudWxsIHdoZW4gbm8gc3dlZXAgaXMga25vd24uXHJcbiAgICovXHJcbiAgZmluZE5lYXJlc3RTd2VlcChwb3NpdGlvbjogUG9pbnQzRCk6IHsgc3dlZXBJZDogc3RyaW5nOyBzaWQ6IHN0cmluZzsgZmxvb3JTZXF1ZW5jZTogbnVtYmVyIHwgbnVsbCB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCBjb2xsZWN0aW9uID0geyAuLi50aGlzLmxvY2tlZFN3ZWVwc1NuYXBzaG90LCAuLi4odGhpcy5zd2VlcENvbGxlY3Rpb24gPz8ge30pIH07XHJcbiAgICBjb25zdCBzaWRzID0gT2JqZWN0LmtleXMoY29sbGVjdGlvbikuZmlsdGVyKChzaWQpID0+IGNvbGxlY3Rpb25bc2lkXT8ucG9zaXRpb24gJiYgY29sbGVjdGlvbltzaWRdLmVuYWJsZWQgIT09IGZhbHNlKTtcclxuICAgIGNvbnN0IGJlc3QgPSBwaWNrTmVhcmVzdFN3ZWVwT25TYW1lU3RvcmV5KFxyXG4gICAgICBzaWRzLm1hcCgoc2lkKSA9PiAoeyBzaWQsIHBvc2l0aW9uOiBjb2xsZWN0aW9uW3NpZF0ucG9zaXRpb24sIGZsb29yWTogc3dlZXBGbG9vclkoY29sbGVjdGlvbltzaWRdKSB9KSksXHJcbiAgICAgIHBvc2l0aW9uXHJcbiAgICApO1xyXG4gICAgY29uc3QgZGF0YSA9IGJlc3QgPyBjb2xsZWN0aW9uW2Jlc3RdIDogbnVsbDtcclxuICAgIGlmICghYmVzdCkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzd2VlcElkOiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnJlc29sdmVTd2VlcFV1aWQoYmVzdCksXHJcbiAgICAgIHNpZDogYmVzdCxcclxuICAgICAgZmxvb3JTZXF1ZW5jZTogZGF0YS5mbG9vckluZm8/LnNlcXVlbmNlID8/ICh0eXBlb2YgZGF0YS5mbG9vciA9PT0gJ251bWJlcicgPyBkYXRhLmZsb29yIDogbnVsbCksXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
1750
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9tYXR0ZXJwb3J0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHNCQUFzQixFQUFFLDRCQUE0QixFQUFFLFdBQVcsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzFJLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFxQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFeEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQ0wsZUFBZSxFQUNmLElBQUksRUFDTCxNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBRUwsV0FBVyxFQUlYLG1CQUFtQixFQUluQixrQkFBa0IsRUFNbEIsT0FBTyxFQUVQLFFBQVEsRUFDUixrQkFBa0IsR0FDbkIsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7Ozs7OztBQTRCMUIsNkZBQTZGO0FBQzdGLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO0FBS2xGLE1BQU0sT0FBTyxpQkFBaUI7SUFzUW1CO0lBQ3JDO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQTdRSCxHQUFHLENBQU07SUFFUixTQUFTLENBQU07SUFFdkIsa0JBQWtCO0lBQ1YsY0FBYyxDQUFNO0lBRXJCLFVBQVUsQ0FBK0M7SUFFekQsa0JBQWtCLEdBQVEsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUs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QUMsQ0FBQyxJQUFJLENBQUM7UUFDNUMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN2QixPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7WUFDdEQsR0FBRyxFQUFFLElBQUk7WUFDVCxhQUFhLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDaEcsQ0FBQztJQUNKLENBQUM7d0dBaGlFVSxpQkFBaUIsa0JBcVFsQixRQUFRLGFBQ1Isa0JBQWtCOzRHQXRRakIsaUJBQWlCLGNBRmhCLE1BQU07OzRGQUVQLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQXNRSSxNQUFNOzJCQUFDLFFBQVE7OzBCQUNmLE1BQU07MkJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29tcHV0ZUZyYW1pbmdSb3RhdGlvbiwgcGlja05lYXJlc3RTd2VlcE9uU2FtZVN0b3JleSwgc3dlZXBGbG9vclksIHZpc2libGVDZW50ZXJTY3JlZW5YIH0gZnJvbSAnLi91dGlscy9tYXR0ZXJwb3J0LWZyYW1pbmcudXRpbCc7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE5nWm9uZSwgT25EZXN0cm95LCBpc0Rldk1vZGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1BVFRFUlBPUlRfU0RLX0tFWSB9IGZyb20gJy4uL3Rva2Vucy9tYXR0ZXJwb3J0LXNkay1rZXkudG9rZW4nO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBwb2lUeXBlVG9TdHJpbmcsXG4gIHdhaXRcbn0gZnJvbSAnLi4vaGVscGVycy5zZXJ2aWNlJztcbmltcG9ydCB7IE1hdHRlcnRhZ0RhdGEgfSBmcm9tICcuLi9tYXR0ZXJ0YWdEYXRhJztcbmltcG9ydCB7XG4gIERiT2JqZWN0VHlwZSxcbiAgRmVhdHVyZVR5cGUsXG4gIEdpem1vTW9kZSxcbiAgR2l6bW9TbmFwLFxuICBJT2JqZWN0M0QsXG4gIE1hdHRlcnRhZ0FjdGlvbk1vZGUsXG4gIE1hdHRlcnBvcnRTdWJzY3JpcHRpb24sXG4gIE1hdHRlcnBvcnRWaWV3LFxuICBNYXR0ZXJwb3J0Vmlld0NvbGxlY3Rpb24sXG4gIE1hdHRlcnBvcnRWaWV3VHlwZSxcbiAgT2JqZWN0M0RCb3VuZGluZ0JveCxcbiAgT2JqZWN0M0RQbGFjZW1lbnRSZXN1bHQsXG4gIE9iamVjdDNEVHJhbnNmb3JtLFxuICBPYmplY3QzRFRyYW5zZm9ybUNoYW5nZSxcbiAgUE9JLFxuICBQb2lUeXBlLFxuICBQb2ludDNELFxuICBTcE1vZHVsZSxcbiAgVmlld2VySW50ZXJhY3Rpb25zLFxufSBmcm9tICcuLi90eXBlcy5zZXJ2aWNlJztcbmltcG9ydCB7IEJhc2VUYWdTZXJ2aWNlIH0gZnJvbSAnLi90YWcuc2VydmljZSc7XG5pbXBvcnQgeyBCYXNlVmlzaWJpbGl0eVNlcnZpY2UgfSBmcm9tICcuL2Jhc2VWaXNpYmlsaXR5LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7IENhbWVyYU1vZGUgfSBmcm9tICcuLi90eXBlcy5zZXJ2aWNlJztcbmltcG9ydCB7IE1hdHRlcnBvcnRNZWFzdXJlbWVudFNlcnZpY2UgfSBmcm9tICcuL21hdHRlcnBvcnQtbWVhc3VyZW1lbnQuc2VydmljZSc7XG5pbXBvcnQgeyBNYXR0ZXJwb3J0TmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICcuL21hdHRlcnBvcnQtbmF2aWdhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IE1hdHRlcnBvcnRQb2ludGVyU2VydmljZSB9IGZyb20gJy4vbWF0dGVycG9ydC1wb2ludGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWF0dGVycG9ydE9iamVjdDNEU2VydmljZSB9IGZyb20gJy4vbWF0dGVycG9ydC1vYmplY3QzZC5zZXJ2aWNlJztcbmltcG9ydCB7IE1hdHRlcnBvcnRUYWdTZXJ2aWNlIH0gZnJvbSAnLi9tYXR0ZXJwb3J0LXRhZy5zZXJ2aWNlJztcblxuLyoqXG4gKiBDdXN0b20gVGhyZWVqcyBPYmplY3QgM0QgaW50ZXJmYWNlXG4gKi9cbmludGVyZmFjZSBUaHJlZUpTT2JqZWN0M0Qge1xuICBpZDogc3RyaW5nO1xuICB1dWlkPzogc3RyaW5nO1xuICBwb3NpdGlvbj86IHsgeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlciB9XG4gIHJvdGF0aW9uPzogeyB4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyIH1cbiAgc2NhbGU/OiB7IHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIE1QX1NESzogeyBjb25uZWN0OiBGdW5jdGlvbiB9O1xuICB9XG59XG5cbi8qKiBQb2ludGVyIGludGVyc2VjdGlvbnMgYSAzRCBvYmplY3QgY2FuIGJlIHBsYWNlZCBvbiAoUG9pbnRlci5Db2xsaWRlcnMgTU9ERUwgYW5kIFNXRUVQKSAqL1xuY29uc3QgUExBQ0VNRU5UX1NVUkZBQ0VTID0gWydpbnRlcnNlY3RlZG9iamVjdC5tb2RlbCcsICdpbnRlcnNlY3RlZG9iamVjdC5zd2VlcCddO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTWF0dGVycG9ydFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIHB1YmxpYyBzZGs6IGFueTtcblxuICBwcml2YXRlIGNvbnRhaW5lcjogYW55O1xuXG4gIC8vIFBvc2l0aW9uIGNhbWVyYVxuICBwcml2YXRlIHBvc2VNYXR0ZXJwb3J0OiBhbnk7XG5cbiAgcHVibGljIHBvc2VDYW1lcmE6IHsgcm90YXRpb246IGFueTsgcG9zaXRpb246IGFueTsgc3dlZXA6IGFueSB9O1xuXG4gIHB1YmxpYyBsYXN0Q2FtZXJhUG9zaXRpb246IGFueSA9IHsgeDogMC4wLCB5OiAwLjAsIHo6IDAuMCB9O1xuXG4gIHByaXZhdGUgaXNNZWFzdXJlTW9kZU9uID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBpbnRlcmFjdGlvbk1vZGU6IG51bWJlciA9IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUO1xuXG4gIHByaXZhdGUgY2FtZXJhTW9kZTogc3RyaW5nID0gJ0lOU0lERSc7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiBhIHBsYWNlbWVudCAodGFnIGZvbGxvd2luZyB0aGUgY3Vyc29yLCBvciAzRCBvYmplY3QgcHJldmlldykgaXMgY2FuY2VsbGVkIGJ5IHJpZ2h0IGNsaWNrIG9yIEVzY2FwZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGxhY2VtZW50Q2FuY2VsbGVkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLyoqIFBlbmRpbmcgaW50ZXJhY3RpdmUgcGxhY2VtZW50IG9mIGEgM0Qgb2JqZWN0IChzZWUgc3RhcnRPYmplY3QzRFBsYWNlbWVudCkgKi9cbiAgcHJpdmF0ZSBvYmplY3QzRFBsYWNlbWVudDoge1xuICAgIHV1aWQ6IHN0cmluZztcbiAgICByZXNvbHZlOiAocmVzdWx0OiBPYmplY3QzRFBsYWNlbWVudFJlc3VsdCB8IG51bGwpID0+IHZvaWQ7XG4gICAgbGFzdFBvaW50OiBQb2ludDNEIHwgbnVsbDtcbiAgICBsYXN0Tm9ybWFsOiBQb2ludDNEIHwgbnVsbDtcbiAgICAvKiogc2VlIHBsYWNlT2JqZWN0M0RPblN1cmZhY2UgKi9cbiAgICBmcm9udFlhd09mZnNldDogbnVtYmVyO1xuICB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFN3ZWVwcyBzbmFwc2hvdCB0YWtlbiB3aGVuIG5hdmlnYXRpb24gaXMgbG9ja2VkIChkaXNhYmxlZCBzd2VlcHMgdmFuaXNoIGZyb20gU3dlZXAuZGF0YSkgKi9cbiAgcHJpdmF0ZSBsb2NrZWRTd2VlcHNTbmFwc2hvdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIC8qKlxuICAgKiBFdmVyeSBzd2VlcCBzZWVuIGluIFN3ZWVwLmRhdGEuIEFmdGVyIGFuIHVubG9jayB0aGUgU0RLIHJlLWVtaXRzIHRoZSByZS1lbmFibGVkIHN3ZWVwcyBsaXR0bGUgYnlcbiAgICogbGl0dGxlOiBhIGxvY2sgYXNrZWQgbWVhbndoaWxlIG11c3Qgc3RpbGwga25vdyBhbGwgb2YgdGhlbSAoaXQgZm91bmQgbm90aGluZyB0byBkaXNhYmxlKS5cbiAgICovXG4gIHByaXZhdGUga25vd25Td2VlcHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICBwcml2YXRlIGtleWRvd25UYXJnZXRzOiB7IHRhcmdldDogRXZlbnRUYXJnZXQ7IGhhbmRsZXI6IChlOiBFdmVudCkgPT4gdm9pZCB9W10gPSBbXTtcblxuICBwdWJsaWMgZ2V0IG1hdHRlcnRhZ0lEcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5tYXR0ZXJ0YWdJRHM7XG4gIH1cblxuICBwdWJsaWMgc2V0IG1hdHRlcnRhZ0lEcyh2YWx1ZTogQXJyYXk8c3RyaW5nPikge1xuICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UubWF0dGVydGFnSURzID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpY3Rpb25uYXJ5VGFncygpOiBNYXA8c3RyaW5nLCBNYXR0ZXJ0YWdEYXRhPiB7XG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZGljdGlvbm5hcnlUYWdzO1xuICB9XG5cbiAgcHVibGljIGdldCBkaWN0aW9ubmFyeU9iamVjdHMzRCgpOiBNYXA8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UuZGljdGlvbm5hcnlPYmplY3RzM0Q7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpY3Rpb25uYXJ5U2NlbmVPYmplY3RzM0QoKTogTWFwPHN0cmluZywgYW55PiB7XG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmRpY3Rpb25uYXJ5U2NlbmVPYmplY3RzM0Q7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRocmVlSlNTY2VuZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS50aHJlZUpTU2NlbmU7XG4gIH1cblxuICBwdWJsaWMgc2V0IHRocmVlSlNTY2VuZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5vYmplY3QzRFNlcnZpY2UudGhyZWVKU1NjZW5lID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGF6aW11dGhhbENyb3duKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmF6aW11dGhhbENyb3duO1xuICB9XG5cbiAgcHVibGljIHNldCBhemltdXRoYWxDcm93bih2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5vYmplY3QzRFNlcnZpY2UuYXppbXV0aGFsQ3Jvd24gPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdGFnc0F0dGFjaG1lbnRzKCk6IE9iamVjdCB7XG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UudGFnc0F0dGFjaG1lbnRzO1xuICB9XG5cbiAgcHVibGljIGdldCBzd2VlcHMoKTogQXJyYXk8c3RyaW5nPiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnN3ZWVwcztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgc3dlZXBzKHZhbHVlOiBBcnJheTxzdHJpbmc+IHwgbnVsbCkge1xuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2Uuc3dlZXBzID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHN3ZWVwQ29sbGVjdGlvbigpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnN3ZWVwQ29sbGVjdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgc3dlZXBDb2xsZWN0aW9uKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnN3ZWVwQ29sbGVjdGlvbiA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBjdXJyZW50U3dlZXAoKTogU3ViamVjdDxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50U3dlZXA7XG4gIH1cblxuICAvL2NhbWVyYSBwb3NpdGlvbiB3aXRoIHJvdGF0aW9uXG4gIHB1YmxpYyBjdXJyZW50Q2FtZXJhUG9zZTogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcblxuICBwdWJsaWMgZ2V0IGZsb29ycygpOiBBcnJheTx7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgc2VxdWVuY2U6IG51bWJlciB9PiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmZsb29ycztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgZmxvb3JzKHZhbHVlOiBBcnJheTx7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgc2VxdWVuY2U6IG51bWJlciB9PiB8IG51bGwpIHtcbiAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmZsb29ycyA9IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3VycmVudFNwYWNlSUQ6IHN0cmluZztcblxuICBwdWJsaWMgZ2V0IGxhc3RPYmplY3QzRCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5sYXN0T2JqZWN0M0Q7XG4gIH1cblxuICBwdWJsaWMgc2V0IGxhc3RPYmplY3QzRCh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5vYmplY3QzRFNlcnZpY2UubGFzdE9iamVjdDNEID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGN1cnJlbnRSb29tcygpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudFJvb21zO1xuICB9XG5cbiAgcHVibGljIHNldCBjdXJyZW50Um9vbXModmFsdWU6IGFueVtdKSB7XG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Um9vbXMgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VycmVudFNwYWNlSUQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFNwYWNlSUQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGN1cnJlbnRTcGFjZUlEKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jdXJyZW50U3BhY2VJRCA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBmb3JiaWRkZW5Td2VlcHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmZvcmJpZGRlblN3ZWVwcztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgZm9yYmlkZGVuU3dlZXBzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZm9yYmlkZGVuU3dlZXBzID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgdGFnQWN0aW9uOiBTdWJqZWN0PHsgYWN0aW9uOiBzdHJpbmc7IGRhdGE6IHN0cmluZyB9PiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgLyoqIFZpZXdzIChmdXJuaXNoZWQsIGRlZnVybmlzaGVkLi4uKSBleHBvc2VkIGJ5IHRoZSBTREsgZm9yIHRoZSBjdXJyZW50IHNwYWNlLiAqL1xuICBwcml2YXRlIHZpZXdzQnlUeXBlOiBNYXA8TWF0dGVycG9ydFZpZXdUeXBlLCBNYXR0ZXJwb3J0Vmlldz4gPSBuZXcgTWFwKCk7XG4gIC8qKiBTZXR0bGVzIG9uY2UgZXZlcnkgc3RhdGljIGljb24gdGV4dHVyZSBoYXMgYmVlbiByZWdpc3RlcmVkIChvciBmYWlsZWQpLiAqL1xuICBwcml2YXRlIGljb25zUmVnaXN0ZXJlZDogUHJvbWlzZTx2b2lkPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAvKiogTmFtZXMgb2YgdGhlIHRleHR1cmVzIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkIGluIHRoZSBjdXJyZW50IFNESyBzZXNzaW9uLiAqL1xuICBwcml2YXRlIHJlZ2lzdGVyZWRJY29uczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIC8qKiB0YWdJZCAtPiBzaWduZWQgc291cmNlIGxhc3QgcmVnaXN0ZXJlZCBhcyBhIGN1c3RvbSB0ZXh0dXJlLCBhbmQgaXRzIHRleHR1cmUgbmFtZS4gKi9cbiAgcHJpdmF0ZSBjdXN0b21JY29uQ2FjaGU6IE1hcDxzdHJpbmcsIHsgc3JjOiBzdHJpbmc7IGljb25OYW1lOiBzdHJpbmcgfT4gPSBuZXcgTWFwKCk7XG5cbiAgcHJpdmF0ZSBjdXJyZW50VmlldzogTWF0dGVycG9ydFZpZXcgfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHZpZXdTdWJzY3JpcHRpb25zOiBNYXR0ZXJwb3J0U3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICAvKiogRW1pdHMgdGhlIGFjdGl2ZSB2aWV3IGV2ZXJ5IHRpbWUgdGhlIHVzZXIgc3dpdGNoZXMgYmV0d2VlbiBmdXJuaXNoZWQvZGVmdXJuaXNoZWQuICovXG4gIHB1YmxpYyBvblZpZXdDaGFuZ2VkOiBTdWJqZWN0PE1hdHRlcnBvcnRWaWV3IHwgbnVsbD4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIC8qKiBEZWxheSBsZWZ0IHRvIHRoZSBTREsgdG8gcmVidWlsZCB0aGUgbGF5ZXIncyB0YWdzIGFmdGVyIGEgdmlldyBzd2l0Y2guICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFZJRVdfU1dJVENIX1JFRlJFU0hfREVMQVlfTVMgPSA4MDA7XG5cbiAgcHJpdmF0ZSB2aWV3U3dpdGNoUmVzdG9yZVRpbWVyOiBhbnkgPSBudWxsO1xuXG4gIHB1YmxpYyBnZXQgbWF0dGVydGFnVG9Gb2xsb3coKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UubWF0dGVydGFnVG9Gb2xsb3c7XG4gIH1cblxuICBwdWJsaWMgc2V0IG1hdHRlcnRhZ1RvRm9sbG93KHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5tYXR0ZXJ0YWdUb0ZvbGxvdyA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBpblRyYW5zaXRpb25Nb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmluVHJhbnNpdGlvbk1vZGU7XG4gIH1cblxuICBwdWJsaWMgc2V0IGluVHJhbnNpdGlvbk1vZGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmluVHJhbnNpdGlvbk1vZGUgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5UcmFuc2l0aW9uU3dlZXAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuaW5UcmFuc2l0aW9uU3dlZXA7XG4gIH1cblxuICBwdWJsaWMgc2V0IGluVHJhbnNpdGlvblN3ZWVwKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pblRyYW5zaXRpb25Td2VlcCA9IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBub0xpZ2h0Rm9yT2JqZWN0cyA9IHRydWU7XG5cbiAgcHVibGljIGdldCBjdXJyZW50Q2FtZXJhTW9kZSgpOiBDYW1lcmFNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Q2FtZXJhTW9kZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgY3VycmVudENhbWVyYU1vZGUodmFsdWU6IENhbWVyYU1vZGUpIHtcbiAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRDYW1lcmFNb2RlID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9uQ2FtZXJhTW9kZUNoYW5nZWQoKTogU3ViamVjdDxDYW1lcmFNb2RlPiB7XG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2Uub25DYW1lcmFNb2RlQ2hhbmdlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb25Sb29tQ2hhbmdlZCgpOiBTdWJqZWN0PGFueVtdPiB7XG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2Uub25Sb29tQ2hhbmdlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb25Hb1RvVGFnKCk6IFN1YmplY3Q8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2Uub25Hb1RvVGFnO1xuICB9XG5cbiAgdGFnU2VydmljZTogQmFzZVRhZ1NlcnZpY2U7XG5cbiAgY29uZmlnOiBDb25maWc7XG5cbiAgU1BNb2R1bGU6IFNwTW9kdWxlO1xuXG4gIHB1YmxpYyBnZXQgb2JqZWN0Q29udHJvbCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5vYmplY3RDb250cm9sO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWN1cml0eUNhbWVyYUFuaW1hdG9yKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLnNlY3VyaXR5Q2FtZXJhQW5pbWF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQWN0aW9ucyBvbiBsZWZ0IGNsaWNrIHdoZW4gcG9zaXRpb25pbmcgbWF0dGVydGFnIGluIHZpc2l0XG4gICAqL1xuICBwb2ludGVyTGVmdENsaWNrSGFuZGxlciA9IChldnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICBpZiAodGhpcy5vYmplY3QzRFBsYWNlbWVudCkge1xuICAgICAgdGhpcy52YWxpZGF0ZU9iamVjdDNEUGxhY2VtZW50KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm1hdHRlcnRhZ1RvRm9sbG93KSB7XG4gICAgICBjb25zdCBtYXR0ZXJ0YWdEYXRhID0gdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZ2V0KHRoaXMubWF0dGVydGFnVG9Gb2xsb3cpO1xuICAgICAgaWYgKG1hdHRlcnRhZ0RhdGEpIHtcbiAgICAgICAgbWF0dGVydGFnRGF0YS5zZXRQb3NpdGlvbih7IC4uLnRoaXMucG9zZU1hdHRlcnBvcnQucG9zaXRpb24gfSk7XG4gICAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0Tm9ybWFsKHsgLi4udGhpcy5wb3NlTWF0dGVycG9ydC5ub3JtYWwgfSk7XG4gICAgICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLnNldCh0aGlzLm1hdHRlcnRhZ1RvRm9sbG93LCBtYXR0ZXJ0YWdEYXRhKTtcbiAgICAgICAgdGhpcy51cGRhdGVNYXR0ZXJUYWdDb250ZW50Rm9yVGFnSUQodGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdyk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub25WYWxpZGF0ZWRNYXR0ZXJ0YWcoKTtcbiAgfTtcblxuICBwb2ludGVyUmlnaHRDbGlja0hhbmRsZXIgPSAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmNhbmNlbEN1cnJlbnRQbGFjZW1lbnQoKTtcbiAgfTtcblxuICBwb2ludGVyTWlkZGxlQ2xpY2tIYW5kbGVyID0gKGUpID0+IHtcbiAgICB0aGlzLnBvaW50ZXJTZXJ2aWNlLnVwZGF0ZUN1cnNvckRpc3BsYXkodGhpcy5wb3NlTWF0dGVycG9ydCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KCdjb25maWcnKSBjb25maWc6IENvbmZpZyxcbiAgICBASW5qZWN0KE1BVFRFUlBPUlRfU0RLX0tFWSkgcHJpdmF0ZSByZWFkb25seSBzZGtLZXk6IHN0cmluZyxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgYWN0aXZlUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgdmlzaWJpbGl0eVNlcnZpY2U6IEJhc2VWaXNpYmlsaXR5U2VydmljZSxcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgbWVhc3VyZW1lbnRTZXJ2aWNlOiBNYXR0ZXJwb3J0TWVhc3VyZW1lbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgbmF2aWdhdGlvblNlcnZpY2U6IE1hdHRlcnBvcnROYXZpZ2F0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHBvaW50ZXJTZXJ2aWNlOiBNYXR0ZXJwb3J0UG9pbnRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBvYmplY3QzRFNlcnZpY2U6IE1hdHRlcnBvcnRPYmplY3QzRFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtYXR0ZXJwb3J0VGFnU2VydmljZTogTWF0dGVycG9ydFRhZ1NlcnZpY2UsXG4gICkge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBNYXR0ZXJwb3J0IFNESywgc2V0cyB1cCBldmVudCBsaXN0ZW5lcnMsIGFuZCBjb25maWd1cmVzIGFzc2V0cy5cbiAgICogQHBhcmFtIHRhZ1NlcnZpY2UgU2VydmljZSB1c2VkIHRvIGdlbmVyYXRlIGFuZCBpbmplY3QgSFRNTCBpbnRvIHRhZ3MuXG4gICAqIEBwYXJhbSBtb2R1bGUgQXBwbGljYXRpb24gbW9kdWxlIChlLmcuLCBJTU1PLCBNVVNFVU0pIHRvIGVuYWJsZSBzcGVjaWZpYyBmZWF0dXJlcy5cbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdHJ1ZSB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgaW5pdFNkayhcbiAgICB0YWdTZXJ2aWNlOiBCYXNlVGFnU2VydmljZSxcbiAgICBtb2R1bGU6IFNwTW9kdWxlID0gU3BNb2R1bGUuSU1NT1xuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5zZGspIHtcbiAgICAgIC8vIGNsZWFuIGlmIHNkayBpcyBydW5uaW5nIGFscmVhZHlcbiAgICAgIGF3YWl0IHRoaXMuYWN0aW9uX2RlbGV0ZV9hbGxfbWF0dGVydGFncygpO1xuICAgIH1cbiAgICB0aGlzLnRhZ1NlcnZpY2UgPSB0YWdTZXJ2aWNlO1xuICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2Uuc2V0VGFnU2VydmljZSh0YWdTZXJ2aWNlKTtcbiAgICB0aGlzLlNQTW9kdWxlID0gbW9kdWxlO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBSZXRyaWV2ZSBET00gZWxlbWVudHNcbiAgICAgIGNvbnN0IHBvaW50ZXJCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAnI3ZpZXdlci1wb2ludGVyLXRyaWNrJ1xuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3ZpZXdlci1tb2R1bGUnKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICcjdmlld2VyLW1vZHVsZSdcbiAgICAgICkgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICBpZiAoIWlmcmFtZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBjdXJzb3JCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAnI2J1dHRvbidcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjb25zdCB0ZXh0UGFuZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAnI3RleHQnXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICB0aGlzLnBvaW50ZXJTZXJ2aWNlLmluaXQodGhpcy5jb250YWluZXIsIHBvaW50ZXJCdG4sIGN1cnNvckJ0biwgdGV4dFBhbmVsLCB7XG4gICAgICAgIG9uTGVmdENsaWNrOiB0aGlzLnBvaW50ZXJMZWZ0Q2xpY2tIYW5kbGVyLmJpbmQodGhpcyksXG4gICAgICAgIG9uUmlnaHRDbGljazogdGhpcy5wb2ludGVyUmlnaHRDbGlja0hhbmRsZXIuYmluZCh0aGlzKSxcbiAgICAgICAgb25NaWRkbGVDbGljazogdGhpcy5wb2ludGVyTWlkZGxlQ2xpY2tIYW5kbGVyLmJpbmQodGhpcyksXG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVnaXN0ZXJFc2NhcGVMaXN0ZW5lcihpZnJhbWUpO1xuXG4gICAgICAvLyBMb2FkIFNES1xuICAgICAgY29uc3Qgc2hvd2Nhc2VXaW5kb3cgPSBpZnJhbWUuY29udGVudFdpbmRvdztcbiAgICAgIGlmcmFtZS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuc2RrID0gYXdhaXQgKHNob3djYXNlV2luZG93IGFzIGFueSkuTVBfU0RLLmNvbm5lY3QoXG4gICAgICAgICAgICBzaG93Y2FzZVdpbmRvdyxcbiAgICAgICAgICAgIHRoaXMuc2RrS2V5LFxuICAgICAgICAgICAgJydcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRDdXN0b21Dc3MoKTtcblxuICAgICAgICB0aGlzLnBvaW50ZXJTZXJ2aWNlLnN0YXJ0QWRtaW5DdXJzb3JUcmFja2VyKFxuICAgICAgICAgIHRoaXMuc2RrLFxuICAgICAgICAgIHRoaXMuY29udGFpbmVyLFxuICAgICAgICAgICgpID0+IHRoaXMucG9zZU1hdHRlcnBvcnQsXG4gICAgICAgICAgKCkgPT4gdGhpcy5wb3NlQ2FtZXJhXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gTG9hZCBNYXR0ZXJ0YWcgaWNvbnMgYW5kIGN1c3RvbSBzdWJzY3JpcHRpb25zXG4gICAgICAgIHRoaXMucmVnaXN0ZXJlZEljb25zLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuY3VzdG9tSWNvbkNhY2hlLmNsZWFyKCk7XG4gICAgICAgIGNvbnN0IGljb25SZWdpc3RyYXRpb25zOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICAgICAgc3dpdGNoIChtb2R1bGUpIHtcbiAgICAgICAgICBjYXNlIFNwTW9kdWxlLklNTU86XG4gICAgICAgICAgICBpY29uUmVnaXN0cmF0aW9ucy5wdXNoKHRoaXMucmVnaXN0ZXJJY29uKCdpY29uLXRpY2tldCcsIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX3RpY2tldCkpO1xuICAgICAgICAgICAgaWNvblJlZ2lzdHJhdGlvbnMucHVzaCh0aGlzLnJlZ2lzdGVySWNvbignaWNvbi1lcXVpcG1lbnQnLCB0aGlzLmNvbmZpZy5teV9jb25maWcuaWNvbl9lcXVpcG1lbnQpKTtcbiAgICAgICAgICAgIGljb25SZWdpc3RyYXRpb25zLnB1c2godGhpcy5yZWdpc3Rlckljb24oJ2ljb24tbWVhc3VyZScsIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX21lYXN1cmUpKTtcbiAgICAgICAgICAgIGljb25SZWdpc3RyYXRpb25zLnB1c2godGhpcy5yZWdpc3Rlckljb24oJ2ljb24tZGF0YScsIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX2RhdGEpKTtcbiAgICAgICAgICAgIGljb25SZWdpc3RyYXRpb25zLnB1c2godGhpcy5yZWdpc3Rlckljb24oJ2ljb24tb2JqZWN0M2QnLCB0aGlzLmNvbmZpZy5teV9jb25maWcuaWNvbl9vYmplY3QzZCkpO1xuXG4gICAgICAgICAgICB0aGlzLnNkay5NZWFzdXJlbWVudHMuZGF0YS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICBvbkFkZGVkOiBmdW5jdGlvbiAoXG4gICAgICAgICAgICAgICAgaW5kZXg6IGFueSxcbiAgICAgICAgICAgICAgICBpdGVtOiB7IHBvaW50czogYW55IH0sXG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbjogYW55XG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMubWVhc3VyZW1lbnRTZXJ2aWNlLnNldExhc3RNZWFzdXJlKGl0ZW0ucG9pbnRzKTtcbiAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgICBvbkNvbGxlY3Rpb25VcGRhdGVkOiBmdW5jdGlvbiAoY29sbGVjdGlvbjogYW55KSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ3RoZSBlbnRpcmUgdXAtdG8tZGF0ZSBjb2xsZWN0aW9uJywgY29sbGVjdGlvbik7XG4gICAgICAgICAgICAgICAgdGhpcy5tZWFzdXJlbWVudFNlcnZpY2UuZ2V0RGlzdGFuY2VGb3JMYXN0TWVhc3VyZW1lbnQodGhpcy5zZGssIHRoaXMuY3VycmVudFNwYWNlSUQpO1xuICAgICAgICAgICAgICB9LmJpbmQodGhpcyksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuc2RrLk1lYXN1cmVtZW50cy5tb2RlLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgZnVuY3Rpb24gKG1lYXN1cmVtZW50TW9kZVN0YXRlOiB7IGFjdGl2ZTogYW55IH0pIHtcbiAgICAgICAgICAgICAgICAvLyBtZWFzdXJlbWVudCBtb2RlIHN0YXRlIGhhcyBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgdGhpcy5pc01lYXN1cmVNb2RlT24gPSBtZWFzdXJlbWVudE1vZGVTdGF0ZS5hY3RpdmU7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ0lzIG1lYXN1cmVtZW50IG1vZGUgY3VycmVudGx5IGFjdGl2ZT8gJywgbWVhc3VyZW1lbnRNb2RlU3RhdGUuYWN0aXZlKTtcbiAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBTcE1vZHVsZS5NVVNFVU06XG4gICAgICAgICAgICBpY29uUmVnaXN0cmF0aW9ucy5wdXNoKHRoaXMucmVnaXN0ZXJJY29uKCdpY29uLWRhdGEnLCB0aGlzLmNvbmZpZy5teV9jb25maWcuaWNvbl9kYXRhKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFNwTW9kdWxlLkhPVEVMOlxuICAgICAgICAgICAgaWNvblJlZ2lzdHJhdGlvbnMucHVzaCh0aGlzLnJlZ2lzdGVySWNvbignaWNvbl9yb29tX2F2YWlsYWJsZScsIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX3Jvb21fYXZhaWxhYmxlKSk7XG4gICAgICAgICAgICBpY29uUmVnaXN0cmF0aW9ucy5wdXNoKHRoaXMucmVnaXN0ZXJJY29uKCdpY29uX3Jvb21fdW5hdmFpbGFibGUnLCB0aGlzLmNvbmZpZy5teV9jb25maWcuaWNvbl9yb29tX3VuYXZhaWxhYmxlKSk7XG4gICAgICAgICAgICBpY29uUmVnaXN0cmF0aW9ucy5wdXNoKHRoaXMucmVnaXN0ZXJJY29uKCdpY29uX3Jvb21fY2hvc2VuJywgdGhpcy5jb25maWcubXlfY29uZmlnLmljb25fcm9vbV9jaG9zZW4pKTtcbiAgICAgICAgICAgIGljb25SZWdpc3RyYXRpb25zLnB1c2godGhpcy5yZWdpc3Rlckljb24oJ2ljb25fcm9vbV92aWV3ZWQnLCB0aGlzLmNvbmZpZy5teV9jb25maWcuaWNvbl9yb29tX3ZpZXdlZCkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWNvblJlZ2lzdHJhdGlvbnMucHVzaCh0aGlzLnJlZ2lzdGVySWNvbignaWNvbi1wb3NpdGlvbicsIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX3Bvc2l0aW9uKSk7XG4gICAgICAgIHRoaXMuaWNvbnNSZWdpc3RlcmVkID0gUHJvbWlzZS5hbGxTZXR0bGVkKGljb25SZWdpc3RyYXRpb25zKS50aGVuKCgpID0+IHVuZGVmaW5lZCk7XG5cbiAgICAgICAgLy8gQ3VycmVudCBSb29tICh1c2VkIGZvciBnZXR0aW5nIGJvdW5kaW5nIGJveCBhbmQgZXZlbnR1YWxseSBsYXp5IGxvYWQgbWF0dGVydGFnIG9yIG9iamVjdDNEIGluc2lkZSBjdXJyZW50IFJvb20pXG4gICAgICAgIHRoaXMuc2RrLlJvb20uY3VycmVudC5zdWJzY3JpYmUoKGN1cnJlbnRSb29tKSA9PiB7XG4gICAgICAgICAgY29uc3Qgcm9vbXMgPSBBcnJheS5pc0FycmF5KGN1cnJlbnRSb29tKSA/IGN1cnJlbnRSb29tIDogKGN1cnJlbnRSb29tID8gW2N1cnJlbnRSb29tXSA6IFtdKTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRSb29tcyA9IHJvb21zO1xuICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2Uub25Sb29tQ2hhbmdlZC5uZXh0KHJvb21zKTtcbiAgICAgICAgICAvLyBSZWZyZXNoIHRhZyB2aXNpYmlsaXR5IHdoZW5ldmVyIHRoZSByb29tIGNvbnRleHQgY2hhbmdlc1xuICAgICAgICAgIHRoaXMucmVmcmVzaFRhZ3NWaXNpYmlsaXR5KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIDNEIHBvc2l0aW9uJ3MgcG9pbnRlclxuICAgICAgICB0aGlzLnNkay5Qb2ludGVyLmludGVyc2VjdGlvbi5zdWJzY3JpYmUoXG4gICAgICAgICAgZnVuY3Rpb24gKGludGVyc2VjdGlvbjogYW55KSB7XG4gICAgICAgICAgICB0aGlzLnBvc2VNYXR0ZXJwb3J0ID0gaW50ZXJzZWN0aW9uO1xuICAgICAgICAgICAgdGhpcy5wb3NlTWF0dGVycG9ydC50aW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMub2xkUG9zZU1hdHRlcnBvcnRQb3NpdGlvbikge1xuICAgICAgICAgICAgICB0aGlzLm9sZFBvc2VNYXR0ZXJwb3J0UG9zaXRpb24gPSB7XG4gICAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgICAgIHo6IDAsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmludGVyYWN0aW9uTW9kZSAhPT0gVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFQgJiYgdGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdykge1xuICAgICAgICAgICAgICAvLyBmb2xsb3cgdGhlIHBvaW50ZXIgYW5kIGNoYW5nZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0IHRhZ1xuICAgICAgICAgICAgICAvLyAod2UgYXJlIGFib3V0IHRvIHZhbGlkYXRlLCBidXQgaXQgZXhpc3RzIGluIHNkayBhbHJlYWR5KVxuICAgICAgICAgICAgICB0aGlzLmVuYWJsZV9mb2xsb3dpbmdfdGFnKHRoaXMubWF0dGVydGFnVG9Gb2xsb3cpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5vYmplY3QzRFBsYWNlbWVudCkge1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU9iamVjdDNEUGxhY2VtZW50UHJldmlldyhpbnRlcnNlY3Rpb24pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5wb2ludGVyU2VydmljZSkge1xuICAgICAgICAgICAgICB0aGlzLnBvaW50ZXJTZXJ2aWNlLnNldEN1cnNvclBvc2l0aW9uQnV0dG9uRGlzcGxheWVkKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcblxuICAgICAgICAvL0NhbWVyYSBtb2RlXG4gICAgICAgIHRoaXMuc2RrLk1vZGUuY3VycmVudC5zdWJzY3JpYmUoKG1vZGUpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pc1VucmVxdWVzdGVkRmxvb3JwbGFuU3dpdGNoKHRoaXMuY2FtZXJhTW9kZSwgbW9kZSkpIHtcbiAgICAgICAgICAgIC8vIFRvcC1kb3duIGRvbGxob3VzZSBjYW1lcmEgcmVwb3J0ZWQgYXMgZmxvb3JwbGFuOiBzdGlsbCBkb2xsaG91c2UsIGlnbm9yZSBpdFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5jYW1lcmFNb2RlICE9PSBtb2RlKSB7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnNldENhbWVyYU1vZGUobW9kZSk7XG4gICAgICAgICAgICAvLyBSZWZyZXNoIHRhZyB2aXNpYmlsaXR5IG9uIGV2ZXJ5IG1vZGUgY2hhbmdlIChJTlNJREUgdnMgRE9MTEhPVVNFIHZzIEZMT09SUExBTilcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFRhZ3NWaXNpYmlsaXR5KCk7XG4gICAgICAgICAgICB0aGlzLmNhbWVyYU1vZGUgPSBtb2RlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuc2RrICYmIHRoaXMucG9zZUNhbWVyYSkge1xuICAgICAgICAgICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS51cGRhdGVUYWdzVmlzaWJpbGl0eUZvckNvbnRleHQoXG4gICAgICAgICAgICAgIHRoaXMuc2RrLFxuICAgICAgICAgICAgICB0aGlzLnN3ZWVwQ29sbGVjdGlvbixcbiAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Q2FtZXJhTW9kZSxcbiAgICAgICAgICAgICAgdGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdyxcbiAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Rmxvb3JTZXF1ZW5jZSxcbiAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Um9vbXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDAwKTtcblxuICAgICAgICAvLyBzdWJzY3JpYmUgdG8gc3dlZXBzXG4gICAgICAgIHRoaXMuc2RrLlN3ZWVwLmRhdGEuc3Vic2NyaWJlKHtcbiAgICAgICAgICBvbkNvbGxlY3Rpb25VcGRhdGVkOiBmdW5jdGlvbiBzdWJzY3IoY29sbGVjdGlvbjoge30pIHtcbiAgICAgICAgICAgIHRoaXMua25vd25Td2VlcHMgPSB7IC4uLnRoaXMua25vd25Td2VlcHMsIC4uLmNvbGxlY3Rpb24gfTtcbiAgICAgICAgICAgIGlmICh0aGlzLm9iamVjdDNEU2VydmljZS5pc05hdmlnYXRpb25Mb2NrZWQoKSkge1xuICAgICAgICAgICAgICAvLyBzd2VlcHMgZGlzYWJsZWQgYnkgdGhlIGxvY2sgYXJlIG5vIGxvbmdlciBpbiB0aGUgY29sbGVjdGlvbjoga2VlcCB0aGVtIGtub3duXG4gICAgICAgICAgICAgIGNvbGxlY3Rpb24gPSB7IC4uLnRoaXMubG9ja2VkU3dlZXBzU25hcHNob3QsIC4uLmNvbGxlY3Rpb24gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3dlZXBzID0gT2JqZWN0LmtleXMoY29sbGVjdGlvbik7XG4gICAgICAgICAgICB0aGlzLnN3ZWVwQ29sbGVjdGlvbiA9IGNvbGxlY3Rpb247XG4gICAgICAgICAgICAvLyBSZWJ1aWxkIHNpZCDihpQgdXVpZCBtYXBzIHdoZW5ldmVyIHRoZSBjb2xsZWN0aW9uIHVwZGF0ZXNcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuYnVpbGRTd2VlcElkTWFwcyhjb2xsZWN0aW9uKTtcbiAgICAgICAgICB9LmJpbmQodGhpcyksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHN1YnNjcmliZSB0byBjdXJyZW50IHN3ZWVwIOKAkyBlbWl0IHV1aWQgKERCIGZvcm1hdCkgaW5zdGVhZCBvZiByYXcgc2lkXG4gICAgICAgIHRoaXMuc2RrLlN3ZWVwLmN1cnJlbnQuc3Vic2NyaWJlKFxuICAgICAgICAgIGZ1bmN0aW9uIHN1YnNjcihjdXJyZW50U3dlZXA6IHsgc2lkOiBzdHJpbmcgfSkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRTd2VlcC5zaWQgPT09ICcnKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCB1dWlkID0gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5yZXNvbHZlU3dlZXBVdWlkKGN1cnJlbnRTd2VlcC5zaWQpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3dlZXAubmV4dCh1dWlkKTtcbiAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBTdWJzY3JpYmUgdG8gRmxvb3IgZGF0YVxuICAgICAgICB0aGlzLnNkay5GbG9vci5kYXRhLnN1YnNjcmliZSh7XG4gICAgICAgICAgb25Db2xsZWN0aW9uVXBkYXRlZDogZnVuY3Rpb24gdXBkKHRoaXM6IGFueSwgY29sbGVjdGlvbjogYW55KSB7XG4gICAgICAgICAgICB0aGlzLmZsb29ycyA9IE9iamVjdC52YWx1ZXMoY29sbGVjdGlvbik7XG4gICAgICAgICAgfS5iaW5kKHRoaXMpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTdWJzY3JpYmUgdG8gY3VycmVudCBmbG9vciDigJMgYXV0aG9yaXRhdGl2ZSBzb3VyY2UgZm9yIG11bHRpLWZsb29yIGZpbHRlcmluZ1xuICAgICAgICB0aGlzLnNkay5GbG9vci5jdXJyZW50LnN1YnNjcmliZSgoY3VycmVudEZsb29yOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBzZXEgPSBjdXJyZW50Rmxvb3I/LnNlcXVlbmNlID8/IG51bGw7XG4gICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Rmxvb3JTZXF1ZW5jZSA9IHNlcTtcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbRmxvb3IuY3VycmVudF0gc2VxdWVuY2UgPScsIHNlcSwgJ3wgZnVsbCA9JywgY3VycmVudEZsb29yKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5yZWZyZXNoVGFnc1Zpc2liaWxpdHkoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gR2VuZXJpYyBoYW5kbGVyIGZvciB0YWcgc2VsZWN0aW9uIGV2ZW50c1xuICAgICAgICBjb25zdCBoYW5kbGVUYWdTZWxlY3Rpb24gPSBhc3luYyAoc2lkOiBzdHJpbmcsIHNvdXJjZTogc3RyaW5nLCBldnQ/OiBhbnkpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbWF0dGVydGFnRGF0YSA9IHRoaXMuZGljdGlvbm5hcnlUYWdzLmdldChzaWQpO1xuICAgICAgICAgICAgaWYgKCFtYXR0ZXJ0YWdEYXRhKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCB1cmwgPSB0YWdTZXJ2aWNlLmdldFVybEZvclNlZURldGFpbHMoXG4gICAgICAgICAgICAgIG1hdHRlcnRhZ0RhdGEuZ2V0T2JqZWN0KCksXG4gICAgICAgICAgICAgIG1hdHRlcnRhZ0RhdGEuZ2V0VHlwZSgpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHVybCAhPT0gJycpIHtcbiAgICAgICAgICAgICAgdGhpcy52aXNpYmlsaXR5U2VydmljZS5kZXRhaWxTaG93aW5nLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3VybF0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0Nhbm5vdCBzaG93IGRldGFpbHMgZm9yIHRhZycsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRGlzYWJsZSBuYXRpdmUgTWF0dGVycG9ydCBhY3Rpb25zXG4gICAgICAgIGNvbnN0IGRpc2FibGVOYXRpdmVBY3Rpb25zID0gKHNpZDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLnNkayB8fCBzaWQgPT09IHRoaXMubWF0dGVydGFnVG9Gb2xsb3cpIHJldHVybjsgLy8gaWdub3JlIHdoZW4gd2UgYXJlIGluIHBvc2l0aW9uaW5nIG1vZGVcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdGFnTW9kdWxlID0gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5nZXRUYWdNb2R1bGUodGhpcy5zZGssIHNpZCk7XG4gICAgICAgICAgICBpZiAodGFnTW9kdWxlPy5hbGxvd0FjdGlvbikge1xuICAgICAgICAgICAgICB0YWdNb2R1bGUuYWxsb3dBY3Rpb24oc2lkLCB7IG9wZW5pbmc6IHRydWUsIG5hdmlnYXRpbmc6IHRydWUsIGRvY2tpbmc6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgLy8gc2lsZW50bHkgaWdub3JlIGFscmVhZHkgcmVtb3ZlZCB0YWdzXG4gICAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkgJiYgIWU/Lm1lc3NhZ2U/LmluY2x1ZGVzKCdub3QgZm91bmQnKSkge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ01hdHRlcnBvcnRTZXJ2aWNlOiBFcnJvciBkaXNhYmxpbmcgYWN0aW9ucyBmb3InLCBzaWQsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBXYWl0IGZvciB0aGUgYXBwbGljYXRpb24gdG8gcmVhY2ggUExBWUlORyBwaGFzZVxuICAgICAgICBpZiAodGhpcy5zZGsuQXBwICYmIHRoaXMuc2RrLkFwcC5zdGF0ZSkge1xuICAgICAgICAgIHRoaXMuc2RrLkFwcC5zdGF0ZS53YWl0VW50aWwoKHM6IGFueSkgPT4gcy5waGFzZSA9PT0gdGhpcy5zZGsuQXBwLlBoYXNlLlBMQVlJTkcpLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb21tb24gbGF5ZXIgaG9sZGluZyBldmVyeSB0YWcgYmVmb3JlIGFueSB0YWcgaXMgYWRkZWQsIHNvIHRoYXRcbiAgICAgICAgICAgIC8vIHRhZ3MgYXJlIHNoYXJlZCBiZXR3ZWVuIHRoZSBmdXJuaXNoZWQgYW5kIHRoZSBkZWZ1cm5pc2hlZCB2aWV3cy5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZW5zdXJlU2hhcmVkVGFnTGF5ZXIodGhpcy5zZGspO1xuICAgICAgICAgICAgdGhpcy5pbml0Vmlld3MoKTtcblxuICAgICAgICAgICAgdGhpcy5zZGsuQ2FtZXJhLnBvc2Uuc3Vic2NyaWJlKChwb3NlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5wb3NlQ2FtZXJhID0gcG9zZTtcbiAgICAgICAgICAgICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS51cGRhdGVUYWdzVmlzaWJpbGl0eUZvckNvbnRleHQoXG4gICAgICAgICAgICAgICAgdGhpcy5zZGssXG4gICAgICAgICAgICAgICAgdGhpcy5zd2VlcENvbGxlY3Rpb24sXG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Q2FtZXJhTW9kZSxcbiAgICAgICAgICAgICAgICB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93LFxuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudEZsb29yU2VxdWVuY2UsXG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Um9vbXNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS51cGRhdGVUYWdzVmlzaWJpbGl0eUZvckNvbnRleHQoXG4gICAgICAgICAgICAgICAgdGhpcy5zZGssXG4gICAgICAgICAgICAgICAgdGhpcy5zd2VlcENvbGxlY3Rpb24sXG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Q2FtZXJhTW9kZSxcbiAgICAgICAgICAgICAgICB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93LFxuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudEZsb29yU2VxdWVuY2UsXG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Um9vbXNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sIDE1MDApO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlcmFjdGlvbk1vZGUgPT09IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUKSB7XG4gICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuYWN0aW9uX3Rvb2xib3hfaW5zaWRlX3ZpZXcodGhpcy5zZGspO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5zZGsuVGFnICYmIHRoaXMuc2RrLlRhZy5kYXRhKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2RrLlRhZy5kYXRhLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgb25BZGRlZDogKHNpZDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICBkaXNhYmxlTmF0aXZlQWN0aW9ucyhzaWQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25VcGRhdGVkOiAoc2lkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVOYXRpdmVBY3Rpb25zKHNpZCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvbkNvbGxlY3Rpb25VcGRhdGVkOiAoY29sbGVjdGlvbjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhjb2xsZWN0aW9uKS5mb3JFYWNoKChzaWQpID0+IGRpc2FibGVOYXRpdmVBY3Rpb25zKHNpZCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGYWxsYmFjayBwb3VyIGwnw6l2w6luZW1lbnQgZ2xvYmFsIHRhZy5jbGlja1xuICAgICAgICB0aGlzLnNkay5vbigndGFnLmNsaWNrJywgKHNpZDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW01hdHRlcnBvcnRTZXJ2aWNlXSBzZGsub24oJ3RhZy5jbGljaycpIHJlY2VpdmVkIGZvciBzaWQ6ICR7c2lkfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYW5kbGVUYWdTZWxlY3Rpb24oc2lkLCAnZ2xvYmFsLnRhZy5jbGljaycpO1xuICAgICAgICAgIGRpc2FibGVOYXRpdmVBY3Rpb25zKHNpZCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBQb2ludGVyIHRyaWNrXG4gICAgICAgIC8vIENyZWF0ZSBhIGRpdiB0aGF0IHdpbGwgYXBwZWFyIHdoZW4gdGhlIGN1cnNvciBpcyBzdGlsbFxuICAgICAgICAvLyBJdCB3aWxsIGludGVyY2VwdCB0aGUgY2xpY2sgb2YgdGhlIG1vdXNlIGJlZm9yZSBpdCB0cmlnZXJyaW5nIHRoZSBNYXR0ZXJwb3J0J3MgdG91ciBuYXZpZ2F0aW9uXG4gICAgICAgIHRoaXMucG9pbnRlclNlcnZpY2Uuc3RhcnRQb2ludGVyVHJpY2soXG4gICAgICAgICAgdGhpcy5zZGssXG4gICAgICAgICAgdGhpcy5jb250YWluZXIsXG4gICAgICAgICAgKCkgPT4gdGhpcy5wb3NlTWF0dGVycG9ydCxcbiAgICAgICAgICAoKSA9PiB0aGlzLnBvc2VDYW1lcmEsXG4gICAgICAgICAgKCkgPT4gdGhpcy5pbnRlcmFjdGlvbk1vZGUsXG4gICAgICAgICAgKCkgPT4gdGhpcy5nZXRGb2xsb3dUYXJnZXQoKVxuICAgICAgICApO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFRyYW5zaXRpb25zXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuc2RrLm9uKFxuICAgICAgICAgICd2aWV3bW9kZS5jaGFuZ2VzdGFydCcsXG4gICAgICAgICAgZnVuY3Rpb24gKHRvLCBmcm9tKSB7XG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdTdGFydGluZyB0byBtb3ZlIHRvICcgKyB0byArICcgZnJvbSAnICsgZnJvbSk7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmluVHJhbnNpdGlvbk1vZGUgPSB0cnVlO1xuICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNkay5vbihcbiAgICAgICAgICAndmlld21vZGUuY2hhbmdlZW5kJyxcbiAgICAgICAgICBmdW5jdGlvbiAob2xkTW9kZSwgbmV3TW9kZSkge1xuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygnRW5kZWQgdG8gbW92ZSB0byAnICsgbmV3TW9kZSArICcgZnJvbSAnICsgb2xkTW9kZSk7XG4gICAgICAgICAgICBpZiAobmV3TW9kZSAhPT0gJ21vZGUudHJhbnNpdGlvbmluZycpIHtcbiAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pblRyYW5zaXRpb25Nb2RlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2RrLm9uKFxuICAgICAgICAgIHRoaXMuc2RrLlN3ZWVwLkV2ZW50LkVOVEVSLFxuICAgICAgICAgIGZ1bmN0aW9uIChvbGRTd2VlcCwgbmV3U3dlZXApIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ0xlYXZpbmcgc3dlZXAgJyArIG9sZFN3ZWVwKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ0VudGVyaW5nIHN3ZWVwICcgKyBuZXdTd2VlcCk7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmluVHJhbnNpdGlvblN3ZWVwID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlBemltdXRhbENyb3duKCk7XG4gICAgICAgICAgICAvLyBSZWZyZXNoIG9uIHN3ZWVwIGlzIHJlbW92ZWQgYmVjYXVzZSB3ZSBvbmx5IHVwZGF0ZSBvbiByb29tIG9yIGZsb29yIGNoYW5nZXMgbm93LlxuICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNkay5vbihcbiAgICAgICAgICB0aGlzLnNkay5Td2VlcC5FdmVudC5FWElULFxuICAgICAgICAgIGZ1bmN0aW9uIChmcm9tU3dlZXAsIHRvU3dlZXApIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ0xlYXZpbmcgc3dlZXAgJyArIGZyb21Td2VlcCk7XG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdUcmFuc2l0aW9uaW5nIHRvIHN3ZWVwICcgKyB0b1N3ZWVwKTtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuaW5UcmFuc2l0aW9uU3dlZXAgPSB0cnVlO1xuICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQzRE9iamVjdFZpZXdlcigpO1xuXG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgbmF2aWdhdGlvblNlcnZpY2UucmVzb2x2ZVN3ZWVwVXVpZCgpIGluc3RlYWQuXG4gICAqIEtlcHQgdGVtcG9yYXJpbHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICAgKi9cbiAgZ2V0U3dlZXBVVUlERm9yU2lkKHNpZDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UucmVzb2x2ZVN3ZWVwVXVpZChzaWQpICE9PSBzaWRcbiAgICAgID8gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5yZXNvbHZlU3dlZXBVdWlkKHNpZClcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIHNldExpZ2h0aW5nT2ZmKCkge1xuICAgIHRoaXMubm9MaWdodEZvck9iamVjdHMgPSB0cnVlO1xuICB9XG5cbiAgZ2V0RGlzdGFuY2VGb3JMYXN0TWVhc3VyZW1lbnQoKSB7XG4gICAgdGhpcy5tZWFzdXJlbWVudFNlcnZpY2UuZ2V0RGlzdGFuY2VGb3JMYXN0TWVhc3VyZW1lbnQodGhpcy5zZGssIHRoaXMuY3VycmVudFNwYWNlSUQpO1xuICB9XG5cbiAgZ2V0TGFzdERpc3RhbmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy5tZWFzdXJlbWVudFNlcnZpY2UuZ2V0TGFzdERpc3RhbmNlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIHNjcmVlbnNob3QgYW5kIHNhdmVzIGJhc2U2NCBpbiBsYXN0U2NyZWVuc2hvdFVyaVxuICAgKiBAcmV0dXJucyBQcm9taXNlXG4gICAqL1xuICB0YWtlU2NyZWVuU2hvdCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLm1lYXN1cmVtZW50U2VydmljZS50YWtlU2NyZWVuU2hvdCh0aGlzLnNkayk7XG4gIH1cblxuICBnZXRTY3JlZW5TaG90VXJpKCkge1xuICAgIHJldHVybiB0aGlzLm1lYXN1cmVtZW50U2VydmljZS5nZXRTY3JlZW5TaG90VXJpKCk7XG4gIH1cblxuICBnZXRMYXN0TWVhc3VyZW1lbnQoKTogT2JqZWN0IHtcbiAgICByZXR1cm4gdGhpcy5tZWFzdXJlbWVudFNlcnZpY2UuZ2V0TGFzdE1lYXN1cmVtZW50KHRoaXMucG9zZUNhbWVyYSk7XG4gIH1cblxuICAvL1xuICAvLyAtLS0tLS0tLS0tIFV0aWxzIC0tLS0tLS0tLS1cbiAgLy9cbiAgcHJpdmF0ZSBnZXRGbG9vcklkRm9yVGFnKG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5nZXRGbG9vcklkRm9yVGFnKG1hdHRlcnRhZ0RhdGEsIHRoaXMuc3dlZXBDb2xsZWN0aW9uKTtcbiAgfVxuICAvKipcbiAgICogU3R5bGluZyBvZiBwb2ludGVyXG4gICAqL1xuICB1cGRhdGVQb2ludGVyVHJpY2soKSB7XG4gICAgdGhpcy5wb2ludGVyU2VydmljZS51cGRhdGVQb2ludGVyVHJpY2sodGhpcy5zZGssIHRoaXMuY29udGFpbmVyLCB0aGlzLnBvc2VNYXR0ZXJwb3J0LCB0aGlzLnBvc2VDYW1lcmEsIHRoaXMuaW50ZXJhY3Rpb25Nb2RlLCB0aGlzLmdldEZvbGxvd1RhcmdldCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIHRhZyB2aXNpYmlsaXR5IHJlZnJlc2ggYmFzZWQgb24gY3VycmVudCBjYW1lcmEgbW9kZSwgZmxvb3IgYW5kIHN3ZWVwLlxuICAgKiBEZWxlZ2F0ZXMgYWxsIGxvZ2ljIHRvIE1hdHRlcnBvcnRUYWdTZXJ2aWNlLnVwZGF0ZVRhZ3NWaXNpYmlsaXR5Rm9yQ29udGV4dCgpLlxuICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSBvbiBNb2RlLCBTd2VlcCwgRmxvb3IgYW5kIFJvb20gY2hhbmdlcy5cbiAgICovXG4gIHB1YmxpYyByZWZyZXNoVGFnc1Zpc2liaWxpdHkoKTogdm9pZCB7XG4gICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkgJiYgdGhpcy5zd2VlcENvbGxlY3Rpb24gJiYgdGhpcy5wb3NlQ2FtZXJhPy5zd2VlcCkge1xuICAgICAgICBjb25zdCBzd2VlcERhdGEgPSB0aGlzLnN3ZWVwQ29sbGVjdGlvblt0aGlzLnBvc2VDYW1lcmEuc3dlZXBdO1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdbcmVmcmVzaFRhZ3NWaXNpYmlsaXR5XSBzd2VlcERhdGEgZm9yIGN1cnJlbnQgc3dlZXA6JywgSlNPTi5zdHJpbmdpZnkoc3dlZXBEYXRhKSk7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ1tyZWZyZXNoVGFnc1Zpc2liaWxpdHldIGN1cnJlbnRGbG9vclNlcXVlbmNlOicsIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudEZsb29yU2VxdWVuY2UpO1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdbcmVmcmVzaFRhZ3NWaXNpYmlsaXR5XSBjdXJyZW50Q2FtZXJhTW9kZTonLCB0aGlzLmN1cnJlbnRDYW1lcmFNb2RlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UudXBkYXRlVGFnc1Zpc2liaWxpdHlGb3JDb250ZXh0KFxuICAgICAgICB0aGlzLnNkayxcbiAgICAgICAgdGhpcy5zd2VlcENvbGxlY3Rpb24sXG4gICAgICAgIHRoaXMuY3VycmVudENhbWVyYU1vZGUsXG4gICAgICAgIHRoaXMubWF0dGVydGFnVG9Gb2xsb3csXG4gICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudEZsb29yU2VxdWVuY2UsXG4gICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudFJvb21zXG4gICAgICApLmNhdGNoKGVyciA9PiB7XG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFNlcnZpY2VdIHJlZnJlc2hUYWdzVmlzaWJpbGl0eSBlcnJvcicsIGVycik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFsdGltZSBtYXR0ZXJ0YWcgZm9sbG93aW5nIHRoZSBjdXJzb3JcbiAgICogQHBhcmFtIG1hdHRlcnRhZyBzdHJpbmdcbiAgICovXG4gIGVuYWJsZV9mb2xsb3dpbmdfdGFnKG1hdHRlcnRhZzogc3RyaW5nKSB7XG4gICAgY29uc3QgT0ZGU0VUID0gMC4wMDAxOyAvLyBxdWFzaS1pbnZpc2libGUgbWFpcyBzdWZmaXQgw6Agw6l2aXRlciBsJ2ludGVyY2VwdGlvblxuICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZ2V0VGFnTW9kdWxlKHRoaXMuc2RrLCBtYXR0ZXJ0YWcpLmVkaXRQb3NpdGlvbihtYXR0ZXJ0YWcsIHtcbiAgICAgIGFuY2hvclBvc2l0aW9uOiB7XG4gICAgICAgIHg6IHRoaXMucG9zZU1hdHRlcnBvcnQucG9zaXRpb24ueCArIE9GRlNFVCxcbiAgICAgICAgeTogdGhpcy5wb3NlTWF0dGVycG9ydC5wb3NpdGlvbi55LFxuICAgICAgICB6OiB0aGlzLnBvc2VNYXR0ZXJwb3J0LnBvc2l0aW9uLnogKyBPRkZTRVQsXG4gICAgICB9LFxuICAgICAgc3RlbVZlY3Rvcjoge1xuICAgICAgICB4OiB0aGlzLnBvc2VNYXR0ZXJwb3J0Lm5vcm1hbC54ICogMC4zLFxuICAgICAgICB5OiB0aGlzLnBvc2VNYXR0ZXJwb3J0Lm5vcm1hbC55ICogMC4zLFxuICAgICAgICB6OiB0aGlzLnBvc2VNYXR0ZXJwb3J0Lm5vcm1hbC56ICogMC4zLFxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGlzdGFuY2UgYmV0d3dlZW4gdHdvIDNEIHBvc2l0aW9uc1xuICAgKiBVc2VkIGluIG9yZGVyIHRvIHNlZSBob3cgbXVjaCB0aGUgY3Vyc29yIGhhcyBtb3ZlZCBmcm9tIHRoZSBwcmV2aW91cyBwb3NpdGlvblxuICAgKiBAcGFyYW0gcG9zMVxuICAgKiBAcGFyYW0gcG9zMlxuICAgKi9cbiAgZ2V0RGlzdFBvc2l0aW9uKHBvczE6IGFueSwgcG9zMjogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMucG9pbnRlclNlcnZpY2UuZ2V0RGlzdFBvc2l0aW9uKHRoaXMuc2RrLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5wb3NlQ2FtZXJhLCBwb3MxLCBwb3MyKTtcbiAgfVxuXG4gIC8vXG4gIC8vIC0tLS0tLS0tLS0gTWF0dGVydGFnIHJlbGF0ZWQgLS0tLS0tLS0tLVxuICAvL1xuICAvKiogQ3JlYXRlcyBhIHRlbXBvcmFyeSBNYXR0ZXJ0YWcgdGhhdCBmb2xsb3dzIHRoZSB1c2VyJ3MgY3Vyc29yIGZvciBwb3NpdGlvbmluZy4gKi9cbiAgYXN5bmMgYWRkQ3Vyc29yTWF0dGVydGFnKG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEpIHtcbiAgICBpZiAoIXRoaXMucG9zZU1hdHRlcnBvcnQgJiYgdGhpcy5wb3NlQ2FtZXJhKSB7XG4gICAgICB0aGlzLnBvc2VNYXR0ZXJwb3J0ID0ge1xuICAgICAgICBwb3NpdGlvbjogeyAuLi50aGlzLnBvc2VDYW1lcmEucG9zaXRpb24gfSxcbiAgICAgICAgbm9ybWFsOiB7IHg6IDAsIHk6IC0wLjE1LCB6OiAwIH0sXG4gICAgICAgIHRpbWU6IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoIXRoaXMucG9zZU1hdHRlcnBvcnQpIHtcbiAgICAgIC8vIEJvdGggcG9zZXMgY29tZSBmcm9tIFNESyBzdWJzY3JpcHRpb25zIHRoYXQgb25seSBzdGFydCBvbmNlIHRoZSBhcHAgcmVhY2hlcyBQTEFZSU5HLCBzbyBhblxuICAgICAgLy8gZWFybHkgY2xpY2sgbGFuZHMgaGVyZS4gVGhlIGNhbGxlciBhbHJlYWR5IHN3aXRjaGVkIHRvIEFERElORywgYW5kIGxlYXZpbmcgaXQgdGhlcmUgbG9ja3NcbiAgICAgIC8vIHRoZSB2aWV3ZXIgb3V0IG9mIGl0cyBvd24gZ3VhcmQgLSBldmVyeSBsYXRlciBjbGljayBpcyBza2lwcGVkIGJlZm9yZSByZWFjaGluZyBhbnkgY29kZSxcbiAgICAgIC8vIHdoaWNoIHJlYWRzIGFzIGEgcGVybWFuZW50bHkgZGVhZCBidXR0b24gcmF0aGVyIHRoYW4gb25lIGZhaWxlZCBhdHRlbXB0LlxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnYWRkQ3Vyc29yTWF0dGVydGFnOiBubyBwb2ludGVyIG9yIGNhbWVyYSBwb3NlIHlldCAtIHRoZSBNYXR0ZXJwb3J0IFNESyBoYXMgbm90IHJlYWNoZWQgJyArXG4gICAgICAgICAgJ1BMQVlJTkcsIHNvIHRoZXJlIGlzIG5vd2hlcmUgdG8gYW5jaG9yIHRoZSB0YWcuIFdhaXQgZm9yIHRoZSBtb2RlbCB0byBmaW5pc2ggbG9hZGluZy4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRJbnRlcmFjdGlvbk1vZGUoVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubWF0dGVydGFnVG9Gb2xsb3cgPSBhd2FpdCB0aGlzLmFkZE1hdHRlcnRhZ1RvVmlld2VyKG1hdHRlcnRhZ0RhdGEpO1xuXG4gICAgaWYgKCF0aGlzLm1hdHRlcnRhZ1RvRm9sbG93KSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignYWRkQ3Vyc29yTWF0dGVydGFnOiB0YWcgY3JlYXRpb24gZmFpbGVkLCBtYXR0ZXJ0YWdUb0ZvbGxvdyBpcyBudWxsJyk7XG4gICAgICB0aGlzLnNldEludGVyYWN0aW9uTW9kZShWaWV3ZXJJbnRlcmFjdGlvbnMuREVGQVVMVCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgd2FpdCg1MCk7XG4gICAgY29uc3QgdGFnTW9kdWxlID0gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5nZXRUYWdNb2R1bGUodGhpcy5zZGssIHRoaXMubWF0dGVydGFnVG9Gb2xsb3cpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0YWdNb2R1bGUuZWRpdEljb24odGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdywgJ2ljb24tcG9zaXRpb24nKTtcbiAgICAgIGF3YWl0IHRhZ01vZHVsZS5lZGl0T3BhY2l0eSh0aGlzLm1hdHRlcnRhZ1RvRm9sbG93LCAxKTtcbiAgICAgIGF3YWl0IHRhZ01vZHVsZS5lZGl0UG9zaXRpb24odGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdywge1xuICAgICAgICBhbmNob3JQb3NpdGlvbjogeyAuLi50aGlzLnBvc2VNYXR0ZXJwb3J0LnBvc2l0aW9uIH0sXG4gICAgICAgIHN0ZW1WZWN0b3I6IHtcbiAgICAgICAgICB4OiAodGhpcy5wb3NlTWF0dGVycG9ydC5ub3JtYWw/LnggPz8gMCkgKiAwLjMsXG4gICAgICAgICAgeTogKHRoaXMucG9zZU1hdHRlcnBvcnQubm9ybWFsPy55ID8/IC0wLjE1KSAqIDAuMyxcbiAgICAgICAgICB6OiAodGhpcy5wb3NlTWF0dGVycG9ydC5ub3JtYWw/LnogPz8gMCkgKiAwLjMsXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGFnTW9kdWxlLmFsbG93QWN0aW9uKHRoaXMubWF0dGVydGFnVG9Gb2xsb3csIHtcbiAgICAgICAgb3BlbmluZzogdHJ1ZSwgbmF2aWdhdGluZzogZmFsc2UsIGRvY2tpbmc6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignYWRkQ3Vyc29yTWF0dGVydGFnOiBlcnJvciBjb25maWd1cmluZyBjdXJzb3IgdGFnJywgZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCB0YWdBZGRRdWV1ZSgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLnRhZ0FkZFF1ZXVlO1xuICB9XG5cbiAgcHVibGljIHNldCB0YWdBZGRRdWV1ZSh2YWx1ZTogUHJvbWlzZTxhbnk+KSB7XG4gICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS50YWdBZGRRdWV1ZSA9IHZhbHVlO1xuICB9XG5cbiAgYXN5bmMgYWRkTWF0dGVydGFnVG9WaWV3ZXIobWF0dGVydGFnRGF0YTogTWF0dGVydGFnRGF0YSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmFkZE1hdHRlcnRhZ1RvVmlld2VyKHRoaXMuc2RrLCBtYXR0ZXJ0YWdEYXRhKTtcbiAgfVxuXG4gIC8qKiBUcmlnZ2VycyBjYWxsYmFjayBhY3Rpb25zIGFmdGVyIGEgdGFnJ3MgcG9zaXRpb24gaXMgdmFsaWRhdGVkIGJ5IGEgbGVmdCBjbGljay4gKi9cbiAgb25WYWxpZGF0ZWRNYXR0ZXJ0YWcoKSB7XG4gICAgdGhpcy5zZXRJbnRlcmFjdGlvbk1vZGUoVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFQpO1xuICAgIGNvbnN0IGxhc3RUYWcgPSB0aGlzLmdldExhc3RUYWcoKTtcbiAgICBpZiAobGFzdFRhZykge1xuICAgICAgY29uc3QgY2FsbGJhY2tNb2RlID0gdGhpcy5kaWN0aW9ubmFyeVRhZ3NcbiAgICAgICAgLmdldChsYXN0VGFnKVxuICAgICAgICAuZ2V0Q2FsbGJhY2tBY3Rpb25Nb2RlKCk7XG4gICAgICB0aGlzLmNhbGxiYWNrQWZ0ZXJNYXR0ZXJ0YWdWYWxpZGF0aW9uKGNhbGxiYWNrTW9kZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlZ2lzdGVycyBhIG5ldyBpY29uIHRleHR1cmUgYW5kIGFwcGxpZXMgaXQgdG8gYSBzcGVjaWZpYyBNYXR0ZXJ0YWcuICovXG4gIGFzeW5jIGFkZE5ld0ljb25BbmRTZXRGb3JUYWcobWF0dGVydGFnSUQ6IHN0cmluZywgaWNvblBhdGg6IHN0cmluZykge1xuICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuYWRkTmV3SWNvbkFuZFNldEZvclRhZyhcbiAgICAgIHRoaXMuc2RrLFxuICAgICAgbWF0dGVydGFnSUQsXG4gICAgICBpY29uUGF0aCxcbiAgICAgIGZhbHNlLFxuICAgICAgMVxuICAgICk7XG4gIH1cblxuICAvKiogQXBwbGllcyBhIHByZS1yZWdpc3RlcmVkIGljb24gdG8gYSBNYXR0ZXJ0YWcuICovXG4gIGFzeW5jIHNldFJlZ2lzdHJlZEljb25Gb3JUYWcobWF0dGVydGFnSUQ6IHN0cmluZywgaWNvbk5hbWU6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmVkaXRUYWdJY29uKHRoaXMuc2RrLCBtYXR0ZXJ0YWdJRCwgaWNvbk5hbWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZWRpdCBpY29uJywgaWNvbk5hbWUsIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZWdpc3RlcnMgYSBzdGF0aWMgdGV4dHVyZSBhbmQgcmVtZW1iZXJzIGl0cyBuYW1lIG9uY2UgdGhlIFNESyBhY2NlcHRlZCBpdC4gKi9cbiAgcHJpdmF0ZSBhc3luYyByZWdpc3Rlckljb24oaWNvbk5hbWU6IHN0cmluZywgaWNvblBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghaWNvblBhdGgpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zZGsuQXNzZXQucmVnaXN0ZXJUZXh0dXJlKGljb25OYW1lLCBpY29uUGF0aCk7XG4gICAgICB0aGlzLnJlZ2lzdGVyZWRJY29ucy5hZGQoaWNvbk5hbWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKGBbTWF0dGVycG9ydFNlcnZpY2VdICR7aWNvbk5hbWV9IHRleHR1cmUgcmVnaXN0cmF0aW9uIGZhaWxlZGAsIGUpO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqIFNldHMgdGhlIGFwcHJvcHJpYXRlIGljb24gZm9yIGEgdGFnIGJhc2VkIG9uIGl0cyB0eXBlIGFuZCBQT0kgbWV0YWRhdGEuICovXG4gIGFzeW5jIHNldFRhZ0ljb25BbmRPcGFjaXR5KFxuICAgIG1hdHRlcnRhZ0lEOiBzdHJpbmcsXG4gICAgbWF0dGVydGFnRGF0YTogTWF0dGVydGFnRGF0YVxuICApIHtcbiAgICBhd2FpdCB0aGlzLmljb25zUmVnaXN0ZXJlZDtcbiAgICBpZiAodGhpcy5TUE1vZHVsZSA9PT0gU3BNb2R1bGUuSE9URUwpIHtcbiAgICAgIGNvbnN0IHJvb20gPSBtYXR0ZXJ0YWdEYXRhLmdldE9iamVjdCgpO1xuICAgICAgbGV0IGljb25OYW1lID0gYGljb25fcm9vbWA7XG4gICAgICBpZiAocm9vbS5hdmFpbGFibGUpIHtcbiAgICAgICAgaWNvbk5hbWUgPSBgJHtpY29uTmFtZX1fYXZhaWxhYmxlYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGljb25OYW1lID0gYCR7aWNvbk5hbWV9X3VuYXZhaWxhYmxlYDtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuZWRpdFRhZ0ljb24obWF0dGVydGFnSUQsIGljb25OYW1lKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RyaW5nVGFnVHlwZSA9IHBvaVR5cGVUb1N0cmluZyhtYXR0ZXJ0YWdEYXRhLmdldFR5cGUoKSk7XG4gICAgbGV0IGljb25OYW1lID0gYGljb24tJHtzdHJpbmdUYWdUeXBlfWA7XG4gICAgY29uc3QgcG9pID0gbWF0dGVydGFnRGF0YS5nZXRQb2koKTtcbiAgICBpZiAocG9pICYmIHBvaS50YWdJY29uKSB7XG4gICAgICBjb25zdCB0YWdJY29uID0gSlNPTi5wYXJzZShwb2kudGFnSWNvbik7XG4gICAgICBpZiAobWF0dGVydGFnRGF0YS5nZXRUeXBlKCkgPT09IFBvaVR5cGUuREFUQSkge1xuICAgICAgICBjb25zdCBmZWF0dXJlID0gbWF0dGVydGFnRGF0YS5nZXRPYmplY3QoKTtcbiAgICAgICAgaWYgKGZlYXR1cmUudHlwZSA9PT0gRmVhdHVyZVR5cGUuSU5ESUNBVE9SX1RFTVApIHtcbiAgICAgICAgICB0YWdJY29uLnNyYyA9IHRoaXMudGFnU2VydmljZS5nZXRJY29uVGFnSW1hZ2VGb3JGZWF0dXJlKGZlYXR1cmUsIHBvaSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0YWdJY29uLnNyYykge1xuICAgICAgICAvLyBrZXllZCBvbiB0aGUgc3RvcmVkIHNvdXJjZSwgbm90IG9uIHRoZSBzaWduZWQgVVJMOiBhIG5ldyBzaWduYXR1cmUgZXZlcnkgY2FsbFxuICAgICAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmN1c3RvbUljb25DYWNoZS5nZXQobWF0dGVydGFnSUQpO1xuICAgICAgICBpZiAoY2FjaGVkICYmIGNhY2hlZC5zcmMgPT09IHRhZ0ljb24uc3JjKSB7XG4gICAgICAgICAgaWNvbk5hbWUgPSBjYWNoZWQuaWNvbk5hbWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcGF0aFNpZ25lZCA9IGF3YWl0IHRoaXMudGFnU2VydmljZS5nZXRTaWduZWRUYWdJY29uU291cmNlKFxuICAgICAgICAgICAgdGFnSWNvbi5zcmNcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChwYXRoU2lnbmVkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBjdXN0b21JY29uTmFtZSA9IGBpY29uLSR7c3RyaW5nVGFnVHlwZX0tJHttYXR0ZXJ0YWdJRH0tJHttYXR0ZXJ0YWdEYXRhLmN1c3RvbUljb25JbmRleH1gO1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNkay5Bc3NldC5yZWdpc3RlclRleHR1cmUoY3VzdG9tSWNvbk5hbWUsIHBhdGhTaWduZWQpO1xuICAgICAgICAgICAgICBtYXR0ZXJ0YWdEYXRhLmN1c3RvbUljb25JbmRleCArPSAxO1xuICAgICAgICAgICAgICB0aGlzLmN1c3RvbUljb25DYWNoZS5zZXQobWF0dGVydGFnSUQsIHsgc3JjOiB0YWdJY29uLnNyYywgaWNvbk5hbWU6IGN1c3RvbUljb25OYW1lIH0pO1xuICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyZWRJY29ucy5hZGQoY3VzdG9tSWNvbk5hbWUpO1xuICAgICAgICAgICAgICBpY29uTmFtZSA9IGN1c3RvbUljb25OYW1lO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciByZWdpc3Rlckljb24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgdGhpcy5lZGl0VGFnSWNvbihtYXR0ZXJ0YWdJRCwgaWNvbk5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYW4gaWNvbiB0byBhIHRhZywgdW5sZXNzIHRoYXQgaWNvbiBpcyBhbHJlYWR5IHRoZSBvbmUgYXBwbGllZC4gVGhlIGNhbGwgaXNcbiAgICogYXdhaXRlZCBhbmQgaXRzIHJlamVjdGlvbiByZXBvcnRlZDogYSBzaWxlbnRseSBkcm9wcGVkIHByb21pc2UgaGVyZSBsZWF2ZXMgdGhlIHBpblxuICAgKiB3aXRoIGl0cyBkZWZhdWx0IHdoaXRlIGxvb2suXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVkaXRUYWdJY29uKG1hdHRlcnRhZ0lEOiBzdHJpbmcsIGljb25OYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5nZXRDYWNoZWRUYWdJY29uKG1hdHRlcnRhZ0lEKSA9PT0gaWNvbk5hbWUpIHJldHVybjtcbiAgICAvLyBBIHRleHR1cmUgdGhhdCB3YXMgbmV2ZXIgcmVnaXN0ZXJlZCAobm8gaWNvbiBjb25maWd1cmVkIGZvciB0aGlzIHR5cGUpIGNhbiBvbmx5IGZhaWw6XG4gICAgLy8gdGhlIHBpbiBrZWVwcyBpdHMgZGVmYXVsdCBsb29rLCBhcyBiZWZvcmUsIHdpdGhvdXQgYSBkb29tZWQgU0RLIGNhbGwuXG4gICAgaWYgKCF0aGlzLnJlZ2lzdGVyZWRJY29ucy5oYXMoaWNvbk5hbWUpKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZWRpdFRhZ0ljb24odGhpcy5zZGssIG1hdHRlcnRhZ0lELCBpY29uTmFtZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFNlcnZpY2VdIGVkaXRJY29uIGZhaWxlZCBmb3InLCBtYXR0ZXJ0YWdJRCwgaWNvbk5hbWUsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKiogTmF2aWdhdGVzIHRoZSBjYW1lcmEgdG8gdGhlIG1vc3QgcmVjZW50bHkgY3JlYXRlZCB0YWcuICovXG4gIGFzeW5jIGdvVG9MYXN0VGFnKCkge1xuICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZ29Ub0xhc3RUYWcodGhpcy5zZGspO1xuICB9XG5cbiAgLyoqIE5hdmlnYXRlcyB0aGUgY2FtZXJhIHRvIGEgc3BlY2lmaWMgTWF0dGVydGFnIGJ5IGl0cyBJRC4gKi9cbiAgYXN5bmMgZ29Ub1RhZyhtYXR0ZXJ0YWdJRDogc3RyaW5nKSB7XG4gICAgaWYgKCFtYXR0ZXJ0YWdJRC8qIHx8IHRoaXMuaW5UcmFuc2l0aW9uU3dlZXAqLykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy5vbkdvVG9UYWcubmV4dChtYXR0ZXJ0YWdJRCk7XG4gICAgICBhd2FpdCB0aGlzLnNkay5Td2VlcC5jdXJyZW50LndhaXRVbnRpbChcbiAgICAgICAgKGN1cnJlbnRTd2VlcCkgPT4gY3VycmVudFN3ZWVwICE9PSAnJ1xuICAgICAgKTtcbiAgICAgIGNvbnN0IG10RGF0YSA9IHRoaXMuZGljdGlvbm5hcnlUYWdzLmdldChtYXR0ZXJ0YWdJRCk7XG4gICAgICBpZiAobXREYXRhKSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gbXREYXRhLmdldFBvc2l0aW9uKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2RrLkNhbWVyYS5sb29rQXQocG9zaXRpb24sIHtcbiAgICAgICAgICB0cmFuc2l0aW9uOiB0aGlzLnNkay5DYW1lcmEuVHJhbnNpdGlvblR5cGUuRkxZXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gYG9wZW5gIG9ubHkgZXhpc3RzIG9uIHRoZSBnbG9iYWwgVGFnIG1vZHVsZSwgbmV2ZXIgb24gYSBsYXllci1zY29wZWQgb25lLlxuICAgICAgYXdhaXQgdGhpcy5zZGsuVGFnLm9wZW4obWF0dGVydGFnSUQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignQ2Fubm90IG5hdmlnYXRlIHRvIHRhZycsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTW92ZSB0aGUgdmlld2VyIGNhbWVyYSB0byBhIHNwZWNpZmljIDNEIHBvc2l0aW9uIGFuZCBhcHBseSBhIHJvdGF0aW9uLlxuICAgKiBEZWxlZ2F0ZXMgdGhlIGhlYXZ5IGxpZnRpbmcgdG8gTWF0dGVycG9ydE5hdmlnYXRpb25TZXJ2aWNlLm1vdmVfdG9fcG9zaXRpb24uXG4gICAqIC0gcG9zaXRpb246IHsgeCwgeSwgeiB9XG4gICAqIC0gcm90YXRpb246IHsgeWF3LCBwaXRjaD8sIHJvbGw/IH0gaW4gZGVncmVlcyBieSBkZWZhdWx0XG4gICAqIC0gb3B0aW9uczogb3B0aW9uYWwgdHJhbnNpdGlvbiBhbmQgY29udmVyc2lvbiBzZXR0aW5ncyAoc2VlIG5hdmlnYXRpb24gc2VydmljZSlcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnb1RvUG9zaXRpb24oXG4gICAgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9LFxuICAgIHJvdGF0aW9uOiB7IHlhdzogbnVtYmVyOyBwaXRjaD86IG51bWJlcjsgcm9sbD86IG51bWJlciB9IHwgbnVsbCA9IG51bGwsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHRyYW5zaXRpb24/OiAnRkxZJyB8ICdJTlNUQU5UJyB8ICdJTU1FRElBVEUnO1xuICAgICAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgICAgIGFuZ2xlc0luRGVncmVlcz86IGJvb2xlYW47XG4gICAgICBvZmZzZXQ/OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcbiAgICB9XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEVuc3VyZSBTREsgaXMgaW5pdGlhbGl6ZWRcbiAgICBpZiAoIXRoaXMuc2RrKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hdHRlcnBvcnQgU0RLIGlzIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cblxuICAgIC8vIFByZXZlbnQgY29uY3VycmVudCBuYXZpZ2F0aW9uIGlmIGFscmVhZHkgaW4gYSBzd2VlcC9tb2RlIHRyYW5zaXRpb25cbiAgICBpZiAodGhpcy5pblRyYW5zaXRpb25Nb2RlIHx8IHRoaXMuaW5UcmFuc2l0aW9uU3dlZXApIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS5kZWJ1ZygnZ29Ub1Bvc2l0aW9uIGFib3J0ZWQ6IHZpZXdlciBpcyBpbiB0cmFuc2l0aW9uJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIE1hcmsgdHJhbnNpdGlvbiBzdGF0ZSBvbiBuYXZpZ2F0aW9uIHNlcnZpY2UgKG1vdmVfdG9fcG9zaXRpb24gd2lsbCBhbHNvIG1hbmFnZSBmbGFncylcbiAgICAgIHRoaXMuaW5UcmFuc2l0aW9uTW9kZSA9IHRydWU7XG5cbiAgICAgIC8vIERlbGVnYXRlIHRvIG5hdmlnYXRpb24gc2VydmljZSB3aGljaCBjb250YWlucyB0aGUgcm9idXN0IG1vdmVfdG9fcG9zaXRpb24gaW1wbGVtZW50YXRpb25cbiAgICAgIGF3YWl0IHRoaXMubmF2aWdhdGlvblNlcnZpY2UubW92ZV90b19wb3NpdGlvbih0aGlzLnNkaywgcG9zaXRpb24sIHJvdGF0aW9uLCBvcHRpb25zKTtcblxuICAgICAgLy8gVXBkYXRlIGxvY2FsIGNhY2hlZCBjYW1lcmEgaW5mb1xuICAgICAgdGhpcy5sYXN0Q2FtZXJhUG9zaXRpb24gPSB7IC4uLnBvc2l0aW9uIH07XG4gICAgICAvLyBFbWl0IGEgc2ltcGxpZmllZCBjdXJyZW50IGNhbWVyYSBwb3NlIGZvciBzdWJzY3JpYmVyc1xuICAgICAgdGhpcy5jdXJyZW50Q2FtZXJhUG9zZS5uZXh0KHtcbiAgICAgICAgcG9zaXRpb246IHsgLi4ucG9zaXRpb24gfSxcbiAgICAgICAgcm90YXRpb246IHJvdGF0aW9uID8geyAuLi5yb3RhdGlvbiB9IDogbnVsbCxcbiAgICAgICAgc3dlZXA6IHRoaXMucG9zZUNhbWVyYT8uc3dlZXAgPz8gbnVsbFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdnb1RvUG9zaXRpb24gY29tcGxldGVkJywgeyBwb3NpdGlvbiwgcm90YXRpb24sIG9wdGlvbnMgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUuZXJyb3IoJ2dvVG9Qb3NpdGlvbiBlcnJvcicsIGVycik7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIEVuc3VyZSB0cmFuc2l0aW9uIGZsYWcgaXMgY2xlYXJlZCAobmF2aWdhdGlvbiBzZXJ2aWNlIG1heSBhbHNvIGNsZWFyIGl0KVxuICAgICAgdGhpcy5pblRyYW5zaXRpb25Nb2RlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAgKiBDb21wdXRlcyB0aGUgY29udGV4dC1hd2FyZSBvcGFjaXR5IGZvciBhIHNpbmdsZSB0YWcgYXQgdGhlIG1vbWVudCBpdCBpcyByZW5kZXJlZC5cbiAgICAqIC0gQ3Vyc29yIHRhZzogYWx3YXlzIHVzZSBwcm92aWRlZCBkZWZhdWx0T3BhY2l0eS5cbiAgICAqIC0gRE9MTEhPVVNFIC8gRkxPT1JQTEFOOiAwIChoaWRkZW4pLlxuICAgICogLSBJTlNJREU6IGZsb29yLWZpbHRlcmVkIHByb3hpbWl0eSBvcGFjaXR5IHZpYSBNYXR0ZXJwb3J0VGFnU2VydmljZS5cbiAgICAqIC0gT3RoZXIgLyB1bmtub3duOiBkZWZhdWx0T3BhY2l0eS5cbiAgICAqL1xuICAvKnByaXZhdGUgX2NvbXB1dGVDb250ZXh0T3BhY2l0eUZvclRhZyhcbiAgICBtYXR0ZXJ0YWdJRDogc3RyaW5nLFxuICAgIG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEsXG4gICAgZGVmYXVsdE9wYWNpdHk6IG51bWJlclxuICApOiBudW1iZXIge1xuICAgIGlmIChtYXR0ZXJ0YWdJRCA9PT0gdGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdykge1xuICAgICAgcmV0dXJuIGRlZmF1bHRPcGFjaXR5O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5jb21wdXRlU2luZ2xlVGFnQ29udGV4dE9wYWNpdHkoXG4gICAgICBtYXR0ZXJ0YWdEYXRhLFxuICAgICAgdGhpcy5wb3NlQ2FtZXJhLFxuICAgICAgdGhpcy5zd2VlcENvbGxlY3Rpb24sXG4gICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRGbG9vclNlcXVlbmNlLFxuICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Um9vbXNcbiAgICApO1xuICB9Ki9cblxuICBwcml2YXRlIGFkZEN1c3RvbUNzcygpOiB2b2lkIHtcbiAgICBjb25zdCBjc3MgPSBgXG4gICAgICAuZm9vdGVyLXVpLFxuICAgICAgLnNob3djYXNlLWZvb3RlcixcbiAgICAgIC5tcC1ub3ZhLWJ0bi1ncm91cCxcbiAgICAgIC5mb290ZXItZGl2aWRlcixcbiAgICAgIC5sb2dvLWxpbmssXG4gICAgICAuZm9vdGVyLWxvZ28sXG4gICAgICAuYm90dG9tLXVpLFxuICAgICAgaW1nLmxvZ28taW1hZ2UsXG4gICAgICBpbWdbY2xhc3NePVwibG9nby1pbWFnZVwiXSxcbiAgICAgIGltZ1tjbGFzcyo9XCIgbG9nby1pbWFnZVwiXSxcbiAgICAgIFtkYXRhLXRlc3RpZD1cInNob3djYXNlLWZvb3RlclwiXSB7XG4gICAgICAgIG9wYWNpdHk6IDAgIWltcG9ydGFudDtcbiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuICFpbXBvcnRhbnQ7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lICFpbXBvcnRhbnQ7XG4gICAgICB9XG4gICAgYDtcblxuICAgIC8vIDFzdCBtZXRob2Q6IFZpYSBTY2VuZSBTREtcbiAgICBpZiAodGhpcy5zZGs/LlNjZW5lPy5hZGRTdHlsZSkge1xuICAgICAgdGhpcy5zZGsuU2NlbmUuYWRkU3R5bGUoY3NzKTtcbiAgICB9XG5cbiAgICAvLyAybmQgbWV0aG9kOiBEaXJlY3QgaW5qZWN0aW9uIGluIGlGcmFtZSBET00gKEZhbGxiYWNrKVxuICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN2aWV3ZXItbW9kdWxlJykgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgaWYgKGlmcmFtZT8uY29udGVudFdpbmRvdz8uZG9jdW1lbnQpIHtcbiAgICAgIGNvbnN0IHN0eWxlID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHN0eWxlLnRleHRDb250ZW50ID0gY3NzO1xuICAgICAgaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgY29udGVudCBvZiBNYXR0ZXJ0YWcgd2l0aCBtYXR0ZXJ0YWdJRCAoYmlsbGJvYXJkLCBpbmplY3RlZCBodG1sLCB0YWcgaWNvbilcbiAgICogQHBhcmFtIG1hdHRlcnRhZ0lEIHN0cmluZ1xuICAgKiBAcGFyYW0gb2JqZWN0IFRpY2tldCwgRXF1aXBtZW50LCBGZWF0dXJlLCBldGNcbiAgICogQHBhcmFtIHRhZ1R5cGUgUG9pVHlwZVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlTWF0dGVyVGFnQ29udGVudEZvclRhZ0lEKFxuICAgIG1hdHRlcnRhZ0lEOiBzdHJpbmcsXG4gICAgb2JqZWN0OiBEYk9iamVjdFR5cGUgPSBudWxsLFxuICAgIHRhZ1R5cGU6IFBvaVR5cGUgPSBudWxsXG4gICkge1xuICAgIGlmICh0aGlzLnNkaykge1xuICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5nZXRUYWdNb2R1bGUodGhpcy5zZGssIG1hdHRlcnRhZ0lEKS5lZGl0QmlsbGJvYXJkKFxuICAgICAgICBtYXR0ZXJ0YWdJRCxcbiAgICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZ2V0KG1hdHRlcnRhZ0lEKS5nZXREYXRhKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTWlzZSDDoCBqb3VyIGRlIGwnaWPDtG5lIGltbcOpZGlhdGVcbiAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLnVwZGF0ZU1hdHRlclRhZ0NvbnRlbnRGb3JUYWdJRChcbiAgICAgIHRoaXMuc2RrLFxuICAgICAgbWF0dGVydGFnSUQsXG4gICAgICBvYmplY3QsXG4gICAgICB0YWdUeXBlLFxuICAgICAgdGhpcy5zZXRUYWdJY29uQW5kT3BhY2l0eS5iaW5kKHRoaXMpLFxuICAgICAgLy8gT24gcGFzc2UgdW5lIGZvbmN0aW9uIHdyYXBwZXIgcXVpIGV4w6ljdXRlIGwnaW5qZWN0aW9uIEhUTUwgc2FucyBibG9xdWVyXG4gICAgICBhc3luYyAodHlwZSwgb2JqLCBzaWQpID0+IHtcbiAgICAgICAgdGhpcy5pbmplY3RIdG1sSW5UYWcodHlwZSwgb2JqLCBzaWQpLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0FzeW5jIEhUTUwgdXBkYXRlIGZhaWxlZCBmb3InLCBzaWQsIGVycik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBpbmplY3RlZCBodG1sIGZvciBNYXR0ZXJ0YWdcbiAgICogQHBhcmFtIG1hdHRlcnRhZ0lEIHN0cmluZ1xuICAgKiBAcGFyYW0gb2JqZWN0IFRpY2tldCwgRXF1aXBtZW50LCBGZWF0dXJlLCBldGNcbiAgICogQHBhcmFtIHRhZ1R5cGUgUG9pVHlwZVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlSW5qZWN0ZWRIdG1sRm9yVGFnSUQoXG4gICAgbWF0dGVydGFnSUQ6IHN0cmluZyxcbiAgICBvYmplY3Q6IGFueSxcbiAgICB0YWdUeXBlOiBQb2lUeXBlXG4gICkge1xuICAgIGF3YWl0IHRoaXMuaW5qZWN0SHRtbEluVGFnKHRhZ1R5cGUsIG9iamVjdCwgbWF0dGVydGFnSUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgTWF0dGVydGFnIGZyb20gVmlld2VyIGJ5IGl0cyBJRFxuICAgKiBAcGFyYW0gbWF0dGVydGFnSUQgc3RyaW5nXG4gICAqL1xuICBkZWxldGVNYXR0ZXJ0YWdGcm9tSWQobWF0dGVydGFnSUQ6IHN0cmluZykge1xuICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZGVsZXRlTWF0dGVydGFnRnJvbUlkKHRoaXMuc2RrLCBtYXR0ZXJ0YWdJRCk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBsYXRlc3QgY3JlYXRlZCBtYXR0ZXJ0YWdcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUxhc3RNYXR0ZXJ0YWcoKSB7XG4gICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5kZWxldGVMYXN0TWF0dGVydGFnKHRoaXMuc2RrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMZWdhY3k6IHVzZWQgdG8gYmUgY2FsbGVkIGFjdGlvbl9hZGRfbWF0dGVydGFnX2Zyb21fUE9JXG4gICAqIEFkZHMgYW5kIGNvbmZpZ3VyZXMgTWF0dGVydGFnIGZvciBhbiBvYmplY3QgKFRpY2tldCwgRXF1aXBtZW50LCBGZWF0dXJlLCBldGMpIHRoYXQgY29ycmVzcG9uZHMgdG8gUE9JIChjb29yZGluYXRlcywgdGFnSWNvbilcbiAgICogQHBhcmFtIHRhZ1R5cGUgUG9pVHlwZVxuICAgKiBAcGFyYW0gb2JqZWN0IFRpY2tldCwgRXF1aXBtZW50LCBGZWF0dXJlLi4uXG4gICAqIEBwYXJhbSBwb2kgUE9JXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBjcmVhdGVNYXR0ZXJ0YWdGcm9tUE9JKFxuICAgIHRhZ1R5cGU6IFBvaVR5cGUsXG4gICAgb2JqZWN0OiBEYk9iamVjdFR5cGUsXG4gICAgcG9pOiBQT0lcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5jcmVhdGVNYXR0ZXJ0YWdGcm9tUE9JKFxuICAgICAgdGhpcy5zZGssXG4gICAgICB0YWdUeXBlLFxuICAgICAgb2JqZWN0LFxuICAgICAgcG9pLFxuICAgICAgdGhpcy5nZXRUYWdGcm9tRWxlbWVudElkLmJpbmQodGhpcyksXG4gICAgICB0aGlzLnNldFRhZ0ljb25BbmRPcGFjaXR5LmJpbmQodGhpcyksXG4gICAgICB0aGlzLmluamVjdEh0bWxJblRhZy5iaW5kKHRoaXMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmplY3QgY3VzdG9tIEhUTUwgYXMgTWF0dGVydGFnIGNvbnRlbnRcbiAgICogQHBhcmFtIHRhZ1R5cGUgUG9pVHlwZVxuICAgKiBAcGFyYW0gb2JqZWN0IFRpY2tldCwgRXF1aXBtZW50LCBGZWF0dXJlIGV0Y1xuICAgKiBAcGFyYW0gdGFnSUQgc3RyaW5nXG4gICAqL1xuICBhc3luYyBpbmplY3RIdG1sSW5UYWcodGFnVHlwZTogUG9pVHlwZSwgb2JqZWN0OiBEYk9iamVjdFR5cGUsIHRhZ0lEOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5pbmplY3RIdG1sSW5UYWcodGhpcy5zZGssIHRhZ1R5cGUsIG9iamVjdCwgdGFnSUQpO1xuICB9XG5cblxuICBhc3luYyBhY3Rpb25fZGVsZXRlX2FsbF9tYXR0ZXJ0YWdzKCkge1xuICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuYWN0aW9uX2RlbGV0ZV9hbGxfbWF0dGVydGFncyh0aGlzLnNkayk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBNYXR0ZXJ0YWcgZnJvbSB2aXNpdCBhc3NvY2lhdGVkIHdpdGggb2JqZWN0IElEICh0aWNrZXRJRCwgZXRjKVxuICAgKiBAcGFyYW0gZWxlbWVudElEIHN0cmluZ1xuICAgKi9cbiAgYXN5bmMgZGVsZXRlTWF0dGVydGFnRm9yT2JqZWN0KGVsZW1lbnRJRDogc3RyaW5nKSB7XG4gICAgY29uc3QgbWF0dGVyVGFnSUQgPSB0aGlzLmdldFRhZ0Zyb21FbGVtZW50SWQoZWxlbWVudElEKS50YWc7XG4gICAgaWYgKG1hdHRlclRhZ0lEKSB7XG4gICAgICB0aGlzLnRhZ0FkZFF1ZXVlID0gdGhpcy50YWdBZGRRdWV1ZS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5kZWxldGVNYXR0ZXJ0YWdGcm9tSWQodGhpcy5zZGssIG1hdHRlclRhZ0lEKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50YWdBZGRRdWV1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiB1dWlkIGZyb20gdGhyZWVqc1xuICAgKiBAcGFyYW0gdXVpZFxuICAgKi9cbiAgYXN5bmMgZGVsZXRlT2JqZWN0M0QodXVpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMub2JqZWN0M0RQbGFjZW1lbnQ/LnV1aWQgPT09IHV1aWQpIHtcbiAgICAgIHRoaXMuY2FuY2VsT2JqZWN0M0RQbGFjZW1lbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmRlbGV0ZU9iamVjdDNEKHV1aWQpO1xuICB9XG5cbiAgZ2V0T2JqZWN0M0RNb2RlbE5vZGVGcm9tRGljdGlvbm5hcnkodXVpZDogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UuZ2V0T2JqZWN0M0RNb2RlbE5vZGVGcm9tRGljdGlvbm5hcnkodXVpZCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyAgTWF0dGVydGFnRGF0YSBhbmQgc3RhcnQgcmVwb3NpdGlvbmluZyAoY3JlYXRlcyB0ZW1wb3JhcnkgbWF0dGVydGFnIHRoYXQgZm9sbG93cyB0aGUgY3Vyc29yKVxuICAgKiBAcGFyYW0gcG9pVHlwZSBQb2lUeXBlXG4gICAqIEBwYXJhbSBlbGVtZW50IFRpY2tldCwgRXF1aXBtZW50LCBGZWF0dXJlLCBldGNcbiAgICovXG4gIGFzeW5jIGFkZE1hdHRlcnRhZ1doZW5SZXBvc2l0aW9uaW5nKHBvaVR5cGU6IFBvaVR5cGUsIGVsZW1lbnQ6IERiT2JqZWN0VHlwZSkge1xuICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGEgPSBuZXcgTWF0dGVydGFnRGF0YShwb2lUeXBlKTtcbiAgICAvLyBzZXQgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBleGlzdGluZyB0YWdcbiAgICBjb25zdCBbcG9pXSA9IGVsZW1lbnQucG9pcy5pdGVtcztcbiAgICBpZiAocG9pICYmIHBvaS5jb29yZGluYXRlKSB7XG4gICAgICBtYXR0ZXJ0YWdEYXRhLnNldFBvc2l0aW9uKEpTT04ucGFyc2UocG9pLmNvb3JkaW5hdGUpKTtcbiAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0UG9pKHBvaSk7IC8vIHRvIGtlZXAgY3VzdG9tIHRhZ0ljb24gYW5kIG9wYWNpdHlcbiAgICB9XG4gICAgbWF0dGVydGFnRGF0YS5zZXRTd2VlcElEKHRoaXMubmF2aWdhdGlvblNlcnZpY2UucmVzb2x2ZVN3ZWVwVXVpZCh0aGlzLnBvc2VDYW1lcmEuc3dlZXApKTtcbiAgICBtYXR0ZXJ0YWdEYXRhLnNldFJvdGF0aW9uKHRoaXMucG9zZUNhbWVyYS5yb3RhdGlvbik7XG4gICAgbWF0dGVydGFnRGF0YS5zZXRPYmplY3QoZWxlbWVudCwgcG9pVHlwZSk7XG4gICAgdGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdyA9IGF3YWl0IHRoaXMuYWRkTWF0dGVydGFnVG9WaWV3ZXIobWF0dGVydGFnRGF0YSk7XG5cbiAgICB0aGlzLnNldEludGVyYWN0aW9uTW9kZShWaWV3ZXJJbnRlcmFjdGlvbnMuUE9TSVRJT05JTkcpO1xuICAgIGF3YWl0IHRoaXMuYWRkQ3Vyc29yTWF0dGVydGFnKG1hdHRlcnRhZ0RhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgTWF0dGVydGFnRGF0YSBhbmQgbWF0dGVydGFnIHRoYXQgZm9sbG93cyB0aGUgY3Vyc29yIHdoZW4gY2hvb3NpbmcgcG9zaXRpb24gZm9yIGEgbmV3IG9iamVjdFxuICAgKiBAcGFyYW0gcG9pVHlwZVxuICAgKi9cbiAgYXN5bmMgYWRkTWF0dGVydGFnV2hlbkFkZGluZyhwb2lUeXBlOiBQb2lUeXBlKSB7XG4gICAgY29uc3QgbWF0dGVydGFnRGF0YSA9IG5ldyBNYXR0ZXJ0YWdEYXRhKHBvaVR5cGUpO1xuICAgIG1hdHRlcnRhZ0RhdGEuc2V0U3dlZXBJRCh0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnJlc29sdmVTd2VlcFV1aWQodGhpcy5wb3NlQ2FtZXJhLnN3ZWVwKSk7XG4gICAgbWF0dGVydGFnRGF0YS5zZXRSb3RhdGlvbih0aGlzLnBvc2VDYW1lcmEucm90YXRpb24pO1xuXG4gICAgY29uc3QgaW5pdGlhbFBvc2l0aW9uID0gdGhpcy5wb3NlTWF0dGVycG9ydD8ucG9zaXRpb24gPz8gdGhpcy5wb3NlQ2FtZXJhLnBvc2l0aW9uO1xuICAgIGNvbnN0IGluaXRpYWxOb3JtYWwgPSB0aGlzLnBvc2VNYXR0ZXJwb3J0Py5ub3JtYWwgPz8geyB4OiAwLCB5OiAtMC4xNSwgejogMCB9O1xuICAgIG1hdHRlcnRhZ0RhdGEuc2V0UG9zaXRpb24oeyAuLi5pbml0aWFsUG9zaXRpb24gfSk7XG4gICAgbWF0dGVydGFnRGF0YS5zZXROb3JtYWwoeyAuLi5pbml0aWFsTm9ybWFsIH0pO1xuXG4gICAgdGhpcy5zZXRJbnRlcmFjdGlvbk1vZGUoVmlld2VySW50ZXJhY3Rpb25zLkFERElORyk7XG4gICAgYXdhaXQgdGhpcy5hZGRDdXJzb3JNYXR0ZXJ0YWcobWF0dGVydGFnRGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VscyBmb2xsb3dpbmcgb2YgY3Vyc29yIChtZWFuaW5nIGRlbGV0aW5nIGxhc3QgTWF0dGVydGFnKVxuICAgKi9cbiAgY2FuY2VsRm9sbG93aW5nQ3Vyc29yKCkge1xuICAgIGlmICh0aGlzLm9iamVjdDNEUGxhY2VtZW50KSB7XG4gICAgICAvLyBnZW5lcmljIGNhbmNlbCAodG9vbGJveCBidXR0b25zLi4uKSB3aGlsZSBhIDNEIG9iamVjdCBmb2xsb3dzIHRoZSBjdXJzb3JcbiAgICAgIHRoaXMuY2FuY2VsT2JqZWN0M0RQbGFjZW1lbnQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kZWxldGVMYXN0TWF0dGVydGFnKCk7XG4gICAgdGhpcy5zZXRJbnRlcmFjdGlvbk1vZGUoVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFQpO1xuICB9XG5cbiAgc2V0TGFzdE9iamVjdDNEKGxhc3RPYmplY3QzRDogVGhyZWVKU09iamVjdDNEKSB7XG4gICAgdGhpcy5vYmplY3QzRFNlcnZpY2UubGFzdE9iamVjdDNEID0gbGFzdE9iamVjdDNEO1xuICB9XG5cbiAgZ2V0TGFzdE9iamVjdDNEKCk6IFRocmVlSlNPYmplY3QzRCB7XG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmxhc3RPYmplY3QzRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBjYWxsYmFjayBhZnRlciBtYXR0ZXJ0YWcgcG9zaXRpb24gd2FzIHZhbGlkYXRlZCAoY3JlYXRpb24gb2Ygb2JqZWN0IG9yIHJlcG9zaXRpb25pbmcpXG4gICAqIEBwYXJhbSBtb2RlIE1hdHRlcnRhZ0FjdGlvbk1vZGVcbiAgICovXG4gIGNhbGxiYWNrQWZ0ZXJNYXR0ZXJ0YWdWYWxpZGF0aW9uKG1vZGU6IE1hdHRlcnRhZ0FjdGlvbk1vZGUpIHtcbiAgICB0aGlzLnZpc2liaWxpdHlTZXJ2aWNlLmRldGFpbFNob3dpbmcubmV4dCh0cnVlKTtcbiAgICBjb25zdCBsYXN0VGFnID0gdGhpcy5nZXRMYXN0VGFnKCk7XG4gICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICBjYXNlIE1hdHRlcnRhZ0FjdGlvbk1vZGUuQUREX0VRVUlQTUVOVDpcbiAgICAgICAgdGhpcy5nb1RvTGFzdFRhZygpO1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYHZpc2l0LyR7dGhpcy5jdXJyZW50U3BhY2VJRH0vYWRkX2VxdWlwYF0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTWF0dGVydGFnQWN0aW9uTW9kZS5BRERfVElDS0VUOlxuICAgICAgICB0aGlzLmdvVG9MYXN0VGFnKCk7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgdmlzaXQvJHt0aGlzLmN1cnJlbnRTcGFjZUlEfS9hZGRfdGlja2V0YF0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTWF0dGVydGFnQWN0aW9uTW9kZS5BRERfT0JKRUNUM0Q6XG4gICAgICAgIHRoaXMuZ29Ub0xhc3RUYWcoKTtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2B2aXNpdC8ke3RoaXMuY3VycmVudFNwYWNlSUR9L2FkZF9vYmplY3QzZGBdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE1hdHRlcnRhZ0FjdGlvbk1vZGUuQUREX0RBVEE6XG4gICAgICAgIHRoaXMuZ29Ub0xhc3RUYWcoKTtcbiAgICAgICAgbGV0IHVybDogc3RyaW5nO1xuICAgICAgICBpZiAodGhpcy5yb3V0ZXIudXJsLmluY2x1ZGVzKCc/JykpIHtcbiAgICAgICAgICB1cmwgPSB0aGlzLnJvdXRlci51cmwuc3Vic3RyaW5nKDAsIHRoaXMucm91dGVyLnVybC5pbmRleE9mKCc/JykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVybCA9IHRoaXMucm91dGVyLnVybDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYCR7dXJsfS9hZGRfZmVhdHVyZWBdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE1hdHRlcnRhZ0FjdGlvbk1vZGUuQUREX0RFU0s6XG4gICAgICAgIHRoaXMuZ29Ub0xhc3RUYWcoKTtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2B2aXNpdC8ke3RoaXMuY3VycmVudFNwYWNlSUR9L2FkZF9mZWF0dXJlYF0sIHtcbiAgICAgICAgICBxdWVyeVBhcmFtczogeyBpc0Rlc2s6IHRydWUgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBNYXR0ZXJ0YWdBY3Rpb25Nb2RlLkFERF9ST09NOlxuICAgICAgICB0aGlzLmdvVG9MYXN0VGFnKCk7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgdmlzaXQvJHt0aGlzLmN1cnJlbnRTcGFjZUlEfS9hZGRfcm9vbWBdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE1hdHRlcnRhZ0FjdGlvbk1vZGUuUE9TSVRJT05fT0JKRUNUM0Q6XG4gICAgICAgIGlmIChsYXN0VGFnKSB7XG4gICAgICAgICAgLy8gRE8gTm90aGluZyAocm91dGluZyksIGp1c3RcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShcbiAgICAgICAgICAgIFtgdmlzaXQvJHt0aGlzLmN1cnJlbnRTcGFjZUlEfS9vYmplY3QzZC8ke3RoaXMubGFzdE9iamVjdDNELmlkfWBdLFxuICAgICAgICAgICAgeyBxdWVyeVBhcmFtczogeyBwb3NpdGlvbmluZzogdHJ1ZSB9IH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBNYXR0ZXJ0YWdBY3Rpb25Nb2RlLlBPU0lUSU9OX1RJQ0tFVDpcbiAgICAgICAgaWYgKGxhc3RUYWcpIHtcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgYHZpc2l0LyR7dGhpcy5jdXJyZW50U3BhY2VJRH0vZGV0YWlsLyR7dGhpcy5kaWN0aW9ubmFyeVRhZ3MuZ2V0KGxhc3RUYWcpLmVsZW1lbnRJRFxuICAgICAgICAgICAgICB9YCxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IHF1ZXJ5UGFyYW1zOiB7IHBvc2l0aW9uaW5nOiB0cnVlIH0gfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE1hdHRlcnRhZ0FjdGlvbk1vZGUuUE9TSVRJT05fRVFVSVBNRU5UOlxuICAgICAgICBpZiAobGFzdFRhZykge1xuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBgdmlzaXQvJHt0aGlzLmN1cnJlbnRTcGFjZUlEfS9lcXVpcC8ke3RoaXMuZGljdGlvbm5hcnlUYWdzLmdldChsYXN0VGFnKS5lbGVtZW50SURcbiAgICAgICAgICAgICAgfWAsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBxdWVyeVBhcmFtczogeyBwb3NpdGlvbmluZzogdHJ1ZSB9IH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBNYXR0ZXJ0YWdBY3Rpb25Nb2RlLlBPU0lUSU9OX0RBVEE6XG4gICAgICAgIGlmIChsYXN0VGFnKSB7XG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcbiAgICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMuYWN0aXZlUm91dGUsXG4gICAgICAgICAgICBxdWVyeVBhcmFtczogeyBwb3NpdGlvbmluZzogdHJ1ZSB9LCBxdWVyeVBhcmFtc0hhbmRsaW5nOiBcIm1lcmdlXCJcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTWF0dGVydGFnQWN0aW9uTW9kZS5QT1NJVElPTl9ST09NOlxuICAgICAgICBpZiAobGFzdFRhZykge1xuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCB7XG4gICAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLmFjdGl2ZVJvdXRlLFxuICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHsgcG9zaXRpb25pbmc6IHRydWUgfSwgcXVlcnlQYXJhbXNIYW5kbGluZzogXCJtZXJnZVwiXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZ1bGx5IHVwZGF0ZXMgZXhpc3RpbmcgTWF0dGVydGFnIGNvbnRlbnQgd2l0aCBkYXRhIG9mIG9iamVjdCAoVGlja2V0LCBFcXVpcG1lbnQsIERlc2spXG4gICAqIEBwYXJhbSBtYXR0ZXJ0YWdJRCBzdHJpbmdcbiAgICogQHBhcmFtIG9iamVjdCBUaWNrZXQsIEVxdWlwbWVudCwgRmVhdHVyZSwgRGVza1xuICAgKiBAcGFyYW0gcG9pVHlwZSBQb2lUeXBlXG4gICAqIEBwYXJhbSBwb2kgUE9JXG4gICAqL1xuICBhc3luYyBzZXRPYmplY3RBbmRQb2lJblRhZyhcbiAgICBtYXR0ZXJ0YWdJRDogc3RyaW5nLFxuICAgIG9iamVjdDogRGJPYmplY3RUeXBlLFxuICAgIHBvaVR5cGU6IFBvaVR5cGUsXG4gICAgcG9pOiBQT0kgfCBudWxsID0gbnVsbFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQobWF0dGVydGFnSUQpLnNldE9iamVjdChvYmplY3QsIHBvaVR5cGUpO1xuICAgIGlmIChwb2kpIHtcbiAgICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLmdldChtYXR0ZXJ0YWdJRCkuc2V0UG9pKHBvaSk7XG4gICAgfVxuICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLmdldChtYXR0ZXJ0YWdJRCkuZWxlbWVudElEID0gb2JqZWN0LmlkO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZU1hdHRlclRhZ0NvbnRlbnRGb3JUYWdJRChtYXR0ZXJ0YWdJRCwgb2JqZWN0LCBwb2lUeXBlKTtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlTWF0dGVyVGFnUG9zSW5TZGtWaWV3ZXIoXG4gICAgICAgIG1hdHRlcnRhZ0lELFxuICAgICAgICBvYmplY3QsXG4gICAgICAgIHBvaVR5cGUsXG4gICAgICAgIHBvaVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmxvZyhgZXJyb3IgaW4gc2V0T2JqZWN0QW5kUG9pSW5UYWc6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGRhdGVNYXR0ZXJUYWdQb3NJblNka1ZpZXdlcihcbiAgICBtYXR0ZXJ0YWdJRDogc3RyaW5nLFxuICAgIG9iamVjdDogRGJPYmplY3RUeXBlLFxuICAgIHBvaVR5cGU6IFBvaVR5cGUsXG4gICAgcG9pOiBQT0kgfCBudWxsID0gbnVsbFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXBvaSB8fCAhcG9pLmNvb3JkaW5hdGUpIHtcbiAgICAgIGNvbnNvbGUud2FybigndXBkYXRlTWF0dGVyVGFnUG9zSW5TZGtWaWV3ZXI6IHBvaSBvciBwb2kuY29vcmRpbmF0ZSBpcyBtaXNzaW5nJywgcG9pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgSW5kZXhUb1VwZGF0ZSA9IG9iamVjdC5wb2lzPy5pdGVtcyA/IG9iamVjdC5wb2lzLml0ZW1zLmZpbmRJbmRleCgodSkgPT4gdT8uaWQgPT09IHBvaS5pZCkgOiAtMTtcbiAgICBpZiAoSW5kZXhUb1VwZGF0ZSAhPT0gLTEgJiYgb2JqZWN0LnBvaXM/Lml0ZW1zKSB7XG4gICAgICBvYmplY3QucG9pcy5pdGVtc1tJbmRleFRvVXBkYXRlXSA9IHBvaTtcbiAgICB9XG4gICAgY29uc3QgeyB4LCB5LCB6IH0gPSBKU09OLnBhcnNlKHBvaS5jb29yZGluYXRlKTtcbiAgICBjb25zdCBuZXdQb3NpdGlvbiA9IHtcbiAgICAgIGFuY2hvclBvc2l0aW9uOiB7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHksXG4gICAgICAgIHo6IHosXG4gICAgICB9LFxuICAgICAgc3RlbVZlY3Rvcjoge1xuICAgICAgICAvLyBtYWtlIHRoZSBUYWcgc3RpY2sgc3RyYWlnaHQgdXAgYW5kIG1ha2UgaXQgMC4zMCBtZXRlcnMgKH4xIGZvb3QpIHRhbGxcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMC4zLFxuICAgICAgICB6OiAwLFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZ2V0VGFnTW9kdWxlKHRoaXMuc2RrLCBtYXR0ZXJ0YWdJRCkuZWRpdFBvc2l0aW9uKG1hdHRlcnRhZ0lELCBuZXdQb3NpdGlvbik7XG4gICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3NcbiAgICAgIC5nZXQobWF0dGVydGFnSUQpXG4gICAgICAuc2V0UG9zaXRpb24obmV3UG9zaXRpb24uYW5jaG9yUG9zaXRpb24pO1xuXG4gICAgZm9yIChsZXQgdGFnSWQgb2YgdGhpcy5tYXR0ZXJ0YWdJRHMpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRUYWcgPSB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQodGFnSWQpO1xuICAgICAgaWYgKCFjdXJyZW50VGFnKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRUYWcuZWxlbWVudElEID09PSBvYmplY3QuaWQgJiYgdGFnSWQgIT09IG1hdHRlcnRhZ0lEKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZGVsZXRlTWF0dGVydGFnRnJvbUlkKHRoaXMuc2RrLCB0YWdJZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG1hdHRlclRhZ0lEIGFuZCBpdHMgc3dlZXAgZm9yIGFuIG9iamVjdCBJRCAodGlja2V0IElELCBldGMpXG4gICAqIEBwYXJhbSBlbGVtZW50SUQgc3RyaW5nXG4gICAqIEByZXR1cm5zIHt0YWc6IHN0cmluZyB8IG51bGwsIHN3ZWVwOiBzdHJpbmcgfCBudWxsfVxuICAgKi9cbiAgcHVibGljIGdldFRhZ0Zyb21FbGVtZW50SWQoZWxlbWVudElEOiBzdHJpbmcpOiB7IHRhZzogc3RyaW5nIHwgbnVsbDsgc3dlZXA6IHN0cmluZyB8IG51bGwgfSB7XG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZ2V0VGFnRnJvbUVsZW1lbnRJZChlbGVtZW50SUQsIHRoaXMuc3dlZXBzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGxhdGVzdCB0YWcgY3JlYXRlZCBpbiB0aGUgdmlzaXQgKHdoZW4gZm9sbG93aW5nIHRoZSBjdXJzb3IgdG8gcG9zaXRpb24pXG4gICAqIEByZXR1cm5zIHN0cmluZyBtYXR0ZXJ0YWdJRFxuICAgKi9cbiAgZ2V0TGFzdFRhZygpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAodGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdykge1xuICAgICAgcmV0dXJuIHRoaXMubWF0dGVydGFnVG9Gb2xsb3c7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLm1hdHRlcnRhZ0lEcy5sZW5ndGggPT09IDBcbiAgICAgICAgPyBudWxsXG4gICAgICAgIDogdGhpcy5tYXR0ZXJ0YWdJRHNbdGhpcy5tYXR0ZXJ0YWdJRHMubGVuZ3RoIC0gMV07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgTWF0dGVydGFnRGF0YSBmb3IgTWF0dGVydGFnIChyZXBsYWNlcyBnZXRUYWdEYXRhRnJvbUlkKVxuICAgKiBAcGFyYW0gbWF0dGVydGFnSURcbiAgICogQHJldHVybnMgTWF0dGVydGFnRGF0YVxuICAgKi9cbiAgZ2V0TWF0dGVyVGFnRGF0YUZvck1hdHRlcnRhZyhtYXR0ZXJ0YWdJRDogc3RyaW5nKTogTWF0dGVydGFnRGF0YSB8IG51bGwge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZ2V0KG1hdHRlcnRhZ0lEKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGNvbnNvbGUubG9nKCdjYW5ub3QgcmV0cmlldmUgbWF0dGVydGFnRGF0YSBmb3IgdGFnJywgbWF0dGVydGFnSUQpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vXG4gIC8vIC0tLS0tLS0tLS0gVmlld3MgKGZ1cm5pc2hlZCAvIGRlZnVybmlzaGVkKSAtLS0tLS0tLS0tXG4gIC8vXG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgdG8gdGhlIFNESyBWaWV3IEFQSSB0byBrZWVwIHRyYWNrIG9mIHRoZSB2aWV3cyBhdmFpbGFibGUgZm9yIHRoZSBzcGFjZVxuICAgKiBhbmQgb2YgdGhlIGFjdGl2ZSBvbmUuIFRhZ3MgbGl2ZSBpbiBhIHNoYXJlZCBjb21tb24gbGF5ZXIsIHNvIGEgdmlldyBjaGFuZ2Ugb25seVxuICAgKiByZXF1aXJlcyByZS1hcHBseWluZyB0aGVpciB2aXNpYmlsaXR5LCBuZXZlciByZS1jcmVhdGluZyB0aGVtLlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0Vmlld3MoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclZpZXdTdWJzY3JpcHRpb25zKCk7XG4gICAgdGhpcy52aWV3c0J5VHlwZS5jbGVhcigpO1xuICAgIHRoaXMuY3VycmVudFZpZXcgPSBudWxsO1xuXG4gICAgaWYgKCF0aGlzLnNkaz8uVmlldz8udmlld3MpIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFNlcnZpY2VdIFZpZXcgQVBJIHVuYXZhaWxhYmxlIG9uIHRoaXMgU0RLIHZlcnNpb24nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnZpZXdTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLnNkay5WaWV3LnZpZXdzLnN1YnNjcmliZSh7XG4gICAgICAgIG9uQ29sbGVjdGlvblVwZGF0ZWQ6IChjb2xsZWN0aW9uOiBNYXR0ZXJwb3J0Vmlld0NvbGxlY3Rpb24pID0+IHtcbiAgICAgICAgICAvLyBTREsgY2FsbGJhY2tzIHJ1biBvdXRzaWRlIEFuZ3VsYXI6IHJlLWVudGVyIHRoZSB6b25lIHNvIHRoZSB2aWV3cyBtYWRlXG4gICAgICAgICAgLy8gYXZhaWxhYmxlIGhlcmUgKGRlZnVybmlzaCBidXR0b24uLi4pIGFyZSBwaWNrZWQgdXAgYnkgY2hhbmdlIGRldGVjdGlvbi5cbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy52aWV3c0J5VHlwZS5jbGVhcigpO1xuICAgICAgICAgICAgZm9yIChjb25zdCB2aWV3IG9mIE9iamVjdC52YWx1ZXMoY29sbGVjdGlvbikpIHtcbiAgICAgICAgICAgICAgdGhpcy52aWV3c0J5VHlwZS5zZXQodmlldy50eXBlLCB2aWV3KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBWaWV3cyBhcmUgZGlzY292ZXJlZCBwcm9ncmVzc2l2ZWx5OiBtYWtlIHN1cmUgZWFjaCBvbmUgY2FycmllcyB0aGUgc2hhcmVkXG4gICAgICAgICAgLy8gdGFnIGxheWVyLCBvdGhlcndpc2UgaXRzIHRhZ3Mgd291bGQgbm90IGV4aXN0IGluIHRoYXQgdmlldy5cbiAgICAgICAgICB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmF0dGFjaFNoYXJlZFRhZ0xheWVyVG9WaWV3cyh0aGlzLnNkaywgT2JqZWN0LnZhbHVlcyhjb2xsZWN0aW9uKSk7XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnZpZXdTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLnNkay5WaWV3LmN1cnJlbnQuc3Vic2NyaWJlKCh2aWV3OiBNYXR0ZXJwb3J0VmlldykgPT4ge1xuICAgICAgICBjb25zdCBjaGFuZ2VkID0gdGhpcy5jdXJyZW50Vmlldz8uaWQgIT09IHZpZXc/LmlkO1xuICAgICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdmlldztcbiAgICAgICAgaWYgKCFjaGFuZ2VkKSByZXR1cm47XG4gICAgICAgIHRoaXMucmVzdG9yZVRhZ3NGb3JBY3RpdmVWaWV3KHZpZXcpO1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5vblZpZXdDaGFuZ2VkLm5leHQodmlldykpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlcyB0aGUgb3BhY2l0eS9lbmFibGVkIHN0YXRlIHRvIGJlIHB1c2hlZCBhZ2FpbiB0byBldmVyeSB0YWcuIFRoZSBTREtcbiAgICogcmUtcmVuZGVycyB0aGUgc2hhcmVkIGxheWVyJ3MgdGFncyBvbiBhIHZpZXcgc3dhcCwgYW5kIHRoZSBtZW1vaXplZCB2YWx1ZXMgd291bGRcbiAgICogb3RoZXJ3aXNlIG1ha2UgdXBkYXRlVGFnc1Zpc2liaWxpdHlGb3JDb250ZXh0KCkgc2tpcCB0aGVtLCBsZWF2aW5nIHRhZ3MgaW52aXNpYmxlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFwcGx5VGFnc1Zpc2liaWxpdHkoKTogdm9pZCB7XG4gICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5yZXNldFZpc2liaWxpdHlDYWNoZSgpO1xuICAgIHRoaXMucmVmcmVzaFRhZ3NWaXNpYmlsaXR5KCk7XG4gIH1cblxuICAvKipcbiAgICogUHV0cyB0aGUgdGFncyBiYWNrIGluIHNoYXBlIGluIHRoZSB2aWV3IHRoYXQganVzdCBiZWNhbWUgYWN0aXZlLlxuICAgKlxuICAgKiBBY3RpdmF0aW5nIGEgdmlldyByZS1tYXRlcmlhbGl6ZXMgdGhlIHNoYXJlZCBsYXllcidzIHRhZ3MgZnJvbSB0aGUgZGVzY3JpcHRvcnNcbiAgICogcmVjb3JkZWQgd2hlbiB0aGV5IHdlcmUgYWRkZWQsIHNvIGV2ZXJ5dGhpbmcgYXBwbGllZCB0byBhIHRhZyAqYWZ0ZXJ3YXJkcyogdGhyb3VnaFxuICAgKiB0aGUgZ2xvYmFsIFRhZyBtb2R1bGUgaXMgZHJvcHBlZCBhbG9uZyB0aGUgd2F5OiB0aGUgY3VzdG9tIGljb24gKHRoZSBwaW4gZmFsbHMgYmFja1xuICAgKiB0byB0aGUgZGVzY3JpcHRvcidzIHdoaXRlKSBhbmQgdGhlIHNhbmRib3ggY2FycnlpbmcgdGhlIGhvdmVyIGNvbnRlbnQuIFRoZXkgaGF2ZSB0b1xuICAgKiBiZSBhcHBsaWVkIGFnYWluIG9uIHRoZSBmcmVzaGx5IHJlYnVpbHQgdGFncy5cbiAgICpcbiAgICogVmlzaWJpbGl0eSBpcyByZWZyZXNoZWQgc3RyYWlnaHQgYXdheSBzbyB0aGUgdGFncyBzaG93IHVwIHdpdGhvdXQgd2FpdGluZywgdGhlblxuICAgKiBjb250ZW50IGlzIHJlLWFwcGxpZWQgb25jZSB0aGUgdHJhbnNpdGlvbiBpcyBvdmVyIOKAlCByZS1hcHBseWluZyBpdCB0b28gZWFybHkgd291bGRcbiAgICogdGFyZ2V0IHRhZ3MgdGhlIFNESyBoYXMgbm90IHJlYnVpbHQgeWV0LlxuICAgKi9cbiAgcHJpdmF0ZSByZXN0b3JlVGFnc0ZvckFjdGl2ZVZpZXcodmlldzogTWF0dGVycG9ydFZpZXcpOiB2b2lkIHtcbiAgICAvLyBBIHZpZXcgb25seSBtYXRlcmlhbGl6ZXMgaXRzIGxheWVycyBvbmNlIGFjdGl2YXRlZDogKHJlKWF0dGFjaCB0aGUgc2hhcmVkIG9uZS5cbiAgICB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmF0dGFjaFNoYXJlZFRhZ0xheWVyVG9WaWV3cyh0aGlzLnNkaywgW3ZpZXddKVxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5yZWFwcGx5VGFnc1Zpc2liaWxpdHkoKSk7XG4gICAgdGhpcy5yZWFwcGx5VGFnc1Zpc2liaWxpdHkoKTtcblxuICAgIGNsZWFyVGltZW91dCh0aGlzLnZpZXdTd2l0Y2hSZXN0b3JlVGltZXIpO1xuICAgIHRoaXMudmlld1N3aXRjaFJlc3RvcmVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZWZyZXNoVGFnc0NvbnRlbnQoKVxuICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignW01hdHRlcnBvcnRTZXJ2aWNlXSBDYW5ub3QgcmVzdG9yZSB0YWdzIGZvciB2aWV3Jywgdmlldz8uaWQsIGUpO1xuICAgICAgICB9KVxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLnJlYXBwbHlUYWdzVmlzaWJpbGl0eSgpKTtcbiAgICB9LCBNYXR0ZXJwb3J0U2VydmljZS5WSUVXX1NXSVRDSF9SRUZSRVNIX0RFTEFZX01TKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1hcHBsaWVzIHRoZSBpY29uIGFuZCB0aGUgaW5qZWN0ZWQgSFRNTCBvZiBldmVyeSB0YWcgd2Ugb3duLiBVc2VkIGFmdGVyIGEgdmlld1xuICAgKiBzd2l0Y2gsIHNlZSByZXN0b3JlVGFnc0ZvckFjdGl2ZVZpZXcoKS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaFRhZ3NDb250ZW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5zZGspIHJldHVybjtcblxuICAgIC8vIFNuYXBzaG90OiB0aGUgZGljdGlvbmFyeSBjYW4gYmUgbXV0YXRlZCB3aGlsZSB0aGUgYXdhaXRzIGJlbG93IGFyZSBwZW5kaW5nLlxuICAgIGZvciAoY29uc3QgW3NpZCwgbWF0dGVydGFnRGF0YV0gb2YgWy4uLnRoaXMuZGljdGlvbm5hcnlUYWdzXSkge1xuICAgICAgaWYgKHNpZCA9PT0gdGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdykgY29udGludWU7XG4gICAgICBhd2FpdCB0aGlzLnNldFRhZ0ljb25BbmRPcGFjaXR5KHNpZCwgbWF0dGVydGFnRGF0YSk7XG4gICAgICB0aGlzLmluamVjdEh0bWxJblRhZyhtYXR0ZXJ0YWdEYXRhLmdldFR5cGUoKSwgbWF0dGVydGFnRGF0YS5nZXRPYmplY3QoKSwgc2lkKVxuICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFNlcnZpY2VdIEhUTUwgcmUtaW5qZWN0aW9uIGZhaWxlZCBmb3InLCBzaWQsIGVycik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJWaWV3U3Vic2NyaXB0aW9ucygpOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy52aWV3U3dpdGNoUmVzdG9yZVRpbWVyKTtcbiAgICB0aGlzLnZpZXdTd2l0Y2hSZXN0b3JlVGltZXIgPSBudWxsO1xuICAgIGZvciAoY29uc3Qgc3Vic2NyaXB0aW9uIG9mIHRoaXMudmlld1N1YnNjcmlwdGlvbnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN1YnNjcmlwdGlvbi5jYW5jZWwoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ1tNYXR0ZXJwb3J0U2VydmljZV0gQ2Fubm90IGNhbmNlbCB2aWV3IHN1YnNjcmlwdGlvbicsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnZpZXdTdWJzY3JpcHRpb25zID0gW107XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIHRoZSBzcGFjZSBwcm92aWRlcyBhIGRlZnVybmlzaGVkIHZpZXcuICovXG4gIGdldCBoYXNEZWZ1cm5pc2hWaWV3KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZpZXdzQnlUeXBlLmhhcyhNYXR0ZXJwb3J0Vmlld1R5cGUuREVGVVJOSVNIKTtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gdGhlIGRlZnVybmlzaGVkIHZpZXcgaXMgdGhlIGFjdGl2ZSBvbmUuICovXG4gIGdldCBpc0RlZnVybmlzaGVkVmlldygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50Vmlldz8udHlwZSA9PT0gTWF0dGVycG9ydFZpZXdUeXBlLkRFRlVSTklTSDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2l0Y2hlcyBiZXR3ZWVuIHRoZSBkZWZ1cm5pc2hlZCB2aWV3IGFuZCB0aGUgZnVybmlzaGVkIG9uZS5cbiAgICogQHBhcmFtIHJldHVyblRvU3RhcnQgTW92ZSB0aGUgY2FtZXJhIGJhY2sgdG8gdGhlIHZpZXcncyBzdGFydCBsb2NhdGlvbi5cbiAgICovXG4gIGFzeW5jIHRvZ2dsZURlZnVybmlzaFZpZXcocmV0dXJuVG9TdGFydDogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5pc0RlZnVybmlzaGVkVmlld1xuICAgICAgPyB0aGlzLnZpZXdzQnlUeXBlLmdldChNYXR0ZXJwb3J0Vmlld1R5cGUuTEFZRVJFRF9CQVNFKSA/PyB0aGlzLnZpZXdzQnlUeXBlLmdldChNYXR0ZXJwb3J0Vmlld1R5cGUuQkFTRSlcbiAgICAgIDogdGhpcy52aWV3c0J5VHlwZS5nZXQoTWF0dGVycG9ydFZpZXdUeXBlLkRFRlVSTklTSCk7XG5cbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ1tNYXR0ZXJwb3J0U2VydmljZV0gTm8gdGFyZ2V0IHZpZXcgdG8gc3dpdGNoIHRvJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHRhcmdldC5zZXRBY3RpdmUocmV0dXJuVG9TdGFydCk7XG4gIH1cblxuICAvL1xuICAvLyAtLS0tLS0tLS0tIFZpZXdlciByZWxhdGVkIChzd2l0Y2ggdmlld3MsIGdvIHRvKSAtLS0tLS0tLS0tXG4gIC8vXG4gIGFzeW5jIGFjdGlvbl90b29sYm94X2Zsb29ycGxhbigpIHtcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5hY3Rpb25fdG9vbGJveF9mbG9vcnBsYW4odGhpcy5zZGspO1xuICB9XG5cbiAgYWN0aW9uX3Rvb2xib3hfaW5zaWRlX3ZpZXcoKSB7XG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5hY3Rpb25fdG9vbGJveF9pbnNpZGVfdmlldyh0aGlzLnNkayk7XG4gIH1cblxuICBhY3Rpb25TaG93QWxsRmxvb3JzKCkge1xuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuYWN0aW9uU2hvd0FsbEZsb29ycyh0aGlzLnNkayk7XG4gIH1cblxuICBhc3luYyBhY3Rpb25fdG9vbGJveF9kb2xsaG91c2UoKSB7XG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuYWN0aW9uX3Rvb2xib3hfZG9sbGhvdXNlKHRoaXMuc2RrKTtcbiAgfVxuXG4gIGFjdGlvbl90b29sYm94X21lc3VyZSgpIHtcbiAgICBjb25zdCBuZXdTdGF0ZSA9ICF0aGlzLmlzTWVhc3VyZU1vZGVPbjtcbiAgICB0aGlzLnNkay5NZWFzdXJlbWVudHMudG9nZ2xlTW9kZShuZXdTdGF0ZSkudGhlbigoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYE1lYXN1cmVtZW50IG1vZGUgaXMgbm93ICR7bmV3U3RhdGUgPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfWBcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBhY3Rpb25fdG9vbGJveF9jYW5jZWxfbWVzdXJlKCkge1xuICAgIGlmICh0aGlzLmlzTWVhc3VyZU1vZGVPbikge1xuICAgICAgdGhpcy5hY3Rpb25fdG9vbGJveF9tZXN1cmUoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhY3Rpb25fZ29fdG9fZmxvb3IoXG4gICAgZmxvb3JOYW1lOiBzdHJpbmcsXG4gICAgbWF0dGVycG9ydEZsb29yU2VxdWVuY2U6IG51bWJlciA9IG51bGxcbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuYWN0aW9uX2dvX3RvX2Zsb29yKHRoaXMuc2RrLCBmbG9vck5hbWUsIG1hdHRlcnBvcnRGbG9vclNlcXVlbmNlKTtcbiAgfVxuXG4gIGFzeW5jIGFjdGlvbl9nb190b19zd2VlcChzd2VlcDogc3RyaW5nLCByb3RhdGlvbj86IHsgeDogbnVtYmVyLCB5OiBudW1iZXIgfSB8IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5hY3Rpb25fZ29fdG9fc3dlZXAodGhpcy5zZGssIHN3ZWVwLCByb3RhdGlvbik7XG4gIH1cblxuICBnZXRDdXJyZW50U3dlZXAoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZ2V0Q3VycmVudFN3ZWVwKHRoaXMucG9zZUNhbWVyYSk7XG4gIH1cblxuICBnZXRDdXJyZW50Q2FtZXJhUG9zaXRpb24oKToge1xuICAgIHJvdGF0aW9uOiBhbnk7XG4gICAgcG9zaXRpb246IGFueTtcbiAgICBzd2VlcDogYW55O1xuICB9IHwgbnVsbCB7XG4gICAgaWYgKHRoaXMucG9zZUNhbWVyYSkge1xuICAgICAgcmV0dXJuIHRoaXMucG9zZUNhbWVyYTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzZXRJbnRlcmFjdGlvbk1vZGUoaW50ZXJhY3Rpb25Nb2RlOiBudW1iZXIpIHtcbiAgICB0aGlzLmludGVyYWN0aW9uTW9kZSA9IGludGVyYWN0aW9uTW9kZTtcbiAgfVxuXG4gIGdldEludGVyYWN0aW9uTW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlcmFjdGlvbk1vZGU7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIHZhcmlhYmxlcywgZGVsZXRlcyBhbGwgdGFncyAod2hlbiB2aWV3ZXIgaXMgcmVtb3ZlciBvciBtb2RlbCBjaGFuZ2VkPXJlbG9hZCBuZWVkZWQpXG4gICAqL1xuICBhc3luYyBjbGVhckFsbCgpIHtcbiAgICB0aGlzLmNhbmNlbE9iamVjdDNEUGxhY2VtZW50KCk7XG4gICAgdGhpcy5yZW1vdmVFc2NhcGVMaXN0ZW5lcigpO1xuICAgIHRoaXMubG9ja2VkU3dlZXBzU25hcHNob3QgPSB7fTtcbiAgICB0aGlzLmtub3duU3dlZXBzID0ge307XG4gICAgdGhpcy5jbGVhclZpZXdTdWJzY3JpcHRpb25zKCk7XG4gICAgdGhpcy52aWV3c0J5VHlwZS5jbGVhcigpO1xuICAgIHRoaXMuY3VycmVudFZpZXcgPSBudWxsO1xuICAgIGF3YWl0IHRoaXMuYWN0aW9uX2RlbGV0ZV9hbGxfbWF0dGVydGFncygpO1xuICAgIHRoaXMuZmxvb3JzID0gbnVsbDtcbiAgICB0aGlzLnN3ZWVwcyA9IG51bGw7XG4gICAgdGhpcy5zZGsgPSBudWxsO1xuXG4gICAgdGhpcy5wb2ludGVyU2VydmljZS5jbGVhcih7XG4gICAgICBvbkxlZnRDbGljazogdGhpcy5wb2ludGVyTGVmdENsaWNrSGFuZGxlci5iaW5kKHRoaXMpLFxuICAgICAgb25SaWdodENsaWNrOiB0aGlzLnBvaW50ZXJSaWdodENsaWNrSGFuZGxlci5iaW5kKHRoaXMpLFxuICAgICAgb25NaWRkbGVDbGljazogdGhpcy5wb2ludGVyTWlkZGxlQ2xpY2tIYW5kbGVyLmJpbmQodGhpcyksXG4gICAgfSk7XG5cbiAgICB0aGlzLmZvcmJpZGRlblN3ZWVwcyA9IFtdO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlRm9yYmlkZGVuU3dlZXBzKGZvcmJpZGRlblN3ZWVwczogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5yZW1vdmVGb3JiaWRkZW5Td2VlcHModGhpcy5zZGssIGZvcmJpZGRlblN3ZWVwcyk7XG4gIH1cblxuICAvL1xuICAvLyAtLS0tLS0tLS0tIDNEIG9iamVjdHMgKFNESyBCdW5kbGUgb25seSkgLS0tLS0tLS0tLVxuICAvL1xuICBhc3luYyBpbml0M0RPYmplY3RWaWV3ZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmluaXQzRE9iamVjdFZpZXdlcih0aGlzLnNkayk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIDNEIG1vZGVsOyByZXNvbHZlcyBvbmNlIGl0IGlzIGxvYWRlZCwgcmVqZWN0cyBvbiB1bmtub3duIGZvcm1hdCBvciBsb2FkIHRpbWVvdXQgKH4xNSBzKS5cbiAgICovXG4gIGFzeW5jIGFkZDNET2JqZWN0KFxuICAgIG9iajogSU9iamVjdDNELFxuICAgIG1vZGU/OiBHaXptb01vZGVcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UuYWRkM0RPYmplY3QodGhpcy5zZGssIG9iaiwgbW9kZSk7XG4gIH1cblxuICB0b2dnbGVPYmplY3RWaXNpYmlsaXR5KG9iamVjdElkOiBhbnkpIHtcbiAgICB0aGlzLm9iamVjdDNEU2VydmljZS50b2dnbGVPYmplY3RWaXNpYmlsaXR5KG9iamVjdElkKTtcbiAgfVxuXG4gIGlzT2JqZWN0VmlzaWJsZShvYmplY3RJZDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmlzT2JqZWN0VmlzaWJsZShvYmplY3RJZCk7XG4gIH1cblxuICAvKiogTW92ZXMgdGhlIGNhbWVyYSB0byB0aGUgb2JqZWN0IChjZW50ZXJlZCBvbiBpdHMgYm91bmRpbmcgYm94KS4gUmVzb2x2ZXMgZmFsc2Ugd2hlbiB0aGUgb2JqZWN0IGlzIHVua25vd24uICovXG4gIC8qKlxuICAgKiBNb3ZlcyB0aGUgY2FtZXJhIHRvIHRoZSBzd2VlcCBjbG9zZXN0IHRvIGEgM0Qgb2JqZWN0IGFuZCB0dXJucyBpdCB0b3dhcmQgdGhlIG9iamVjdC5cbiAgICogQHBhcmFtIHZpc2libGVBcmVhIGNsaWVudCBYIGJvdW5kcyBvZiB0aGUgcGFydCBvZiB0aGUgdmlld2VyIG5vdCBjb3ZlcmVkIGJ5IG90aGVyIHBhbmVsc1xuICAgKiAgICAgICAgICAgICAgICAgICAgKHRoZSBsYXRlcmFsIG1lbnUgY292ZXJzIHRoZSByaWdodCBvZiB0aGUgdmlld2VyKTogdGhlIG9iamVjdCBpcyBjZW50ZXJlZCB0aGVyZS5cbiAgICogRmFsbHMgYmFjayB0byB0aGUgdGVtcG9yYXJ5IHRhZyBuYXZpZ2F0aW9uIHdoZW4gbm8gc3dlZXAgY2FuIGJlIHVzZWQuXG4gICAqL1xuICBhc3luYyBwb2ludENhbWVyYVRvM0RPYmplY3Qob2JqZWN0SWQ6IGFueSwgdmlzaWJsZUFyZWE/OiB7IGxlZnQ6IG51bWJlcjsgcmlnaHQ6IG51bWJlciB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgYm94ID0gdGhpcy5vYmplY3QzRFNlcnZpY2UuZ2V0T2JqZWN0M0RCb3VuZGluZ0JveChvYmplY3RJZCk7XG4gICAgY29uc3Qgc3dlZXAgPSBib3ggPyB0aGlzLmZpbmROZWFyZXN0U3dlZXAoYm94LmNlbnRlcikgOiBudWxsO1xuICAgIGNvbnN0IHN3ZWVwRGF0YSA9IHN3ZWVwID8geyAuLi50aGlzLmxvY2tlZFN3ZWVwc1NuYXBzaG90LCAuLi4odGhpcy5zd2VlcENvbGxlY3Rpb24gPz8ge30pIH1bc3dlZXAuc2lkXSA6IG51bGw7XG4gICAgaWYgKGJveCAmJiBzd2VlcERhdGE/LnBvc2l0aW9uICYmIHRoaXMuc2RrPy5Td2VlcCkge1xuICAgICAgY29uc3QgcHJvamVjdGlvbiA9ICh0aGlzLnBvc2VDYW1lcmEgYXMgYW55KT8ucHJvamVjdGlvbjtcbiAgICAgIGNvbnN0IHRhbkhhbGZGb3YgPSBwcm9qZWN0aW9uPy5bMF0gPyAxIC8gcHJvamVjdGlvblswXSA6IDE7XG4gICAgICBsZXQgc2NyZWVuWCA9IDA7XG4gICAgICBjb25zdCB2aWV3ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdmlld2VyLW1vZHVsZScpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgIGlmICh2aXNpYmxlQXJlYSAmJiB2aWV3ZXIpIHtcbiAgICAgICAgY29uc3QgcmVjdCA9IHZpZXdlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgc2NyZWVuWCA9IHZpc2libGVDZW50ZXJTY3JlZW5YKHJlY3QsIHZpc2libGVBcmVhLmxlZnQsIHZpc2libGVBcmVhLnJpZ2h0KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJvdGF0aW9uID0gY29tcHV0ZUZyYW1pbmdSb3RhdGlvbihzd2VlcERhdGEucG9zaXRpb24sIGJveC5jZW50ZXIsIHRhbkhhbGZGb3YsIHNjcmVlblgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHRoaXMucG9zZUNhbWVyYT8uc3dlZXAgPT09IHN3ZWVwLnNpZCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuc2RrLkNhbWVyYS5zZXRSb3RhdGlvbihyb3RhdGlvbiwgeyBzcGVlZDogODAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zZGsuU3dlZXAubW92ZVRvKHN3ZWVwLnNpZCwge1xuICAgICAgICAgICAgcm90YXRpb24sXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiB0aGlzLnNkay5Td2VlcC5UcmFuc2l0aW9uPy5GTFksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBkaXNhYmxlZCBvciB1bnJlYWNoYWJsZSBzd2VlcDogdXNlIHRoZSB0YWcgbmF2aWdhdGlvbiBiZWxvd1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UucG9pbnRDYW1lcmFUbzNET2JqZWN0KFxuICAgICAgdGhpcy5zZGssXG4gICAgICBvYmplY3RJZCxcbiAgICAgIHRoaXMuY3JlYXRlTWF0dGVydGFnRnJvbVBPSS5iaW5kKHRoaXMpLFxuICAgICAgdGhpcy5nb1RvVGFnLmJpbmQodGhpcyksXG4gICAgICB0aGlzLmRlbGV0ZUxhc3RNYXR0ZXJ0YWcuYmluZCh0aGlzKSxcbiAgICAgIHRoaXMuZ2V0VGFnRnJvbUVsZW1lbnRJZC5iaW5kKHRoaXMpXG4gICAgKTtcbiAgfVxuXG4gIGdldFNjZW5lTm9kZUZyb21PYmplY3QzRElkKHV1aWQ6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmdldFNjZW5lTm9kZUZyb21PYmplY3QzRElkKHV1aWQpO1xuICB9XG5cbiAgYXN5bmMgZGlzcGxheUF6aW11dGFsQ3Jvd24oKSB7XG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmRpc3BsYXlBemltdXRhbENyb3duKHRoaXMucG9zZUNhbWVyYSk7XG4gIH1cblxuICBhc3luYyBhdHRhY2hHaXptb0NvbnRyb2xUbzNET2JqZWN0KFxuICAgIG1vZGVsTm9kZTogYW55LFxuICAgIHNjZW5lT2JqZWN0OiBhbnksXG4gICAgbW9kZTogR2l6bW9Nb2RlLFxuICAgIHZpc2libGU6IGJvb2xlYW4sXG4gICAgaXNOZXdPYmplY3Q6IGJvb2xlYW5cbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UuYXR0YWNoR2l6bW9Db250cm9sVG8zRE9iamVjdCh0aGlzLnNkaywgbW9kZWxOb2RlLCBzY2VuZU9iamVjdCwgbW9kZSwgdmlzaWJsZSwgaXNOZXdPYmplY3QpO1xuICB9XG5cbiAgcmVtb3ZlR2l6bW9Gcm9tTGFzdE9iamVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLm9iamVjdDNEU2VydmljZS5yZW1vdmVHaXptb0Zyb21MYXN0T2JqZWN0KCk7XG4gIH1cblxuICAvKiogVG9nZ2xlcyB0aGUgZnJ1c3R1bSBvZiB0aGUgc2VjdXJpdHkgY2FtZXJhIGB1dWlkYCAoZGVmYXVsdDogdGhlIGxhc3QgbG9hZGVkIG9uZSkgKi9cbiAgdG9nZ2xlVmlld0ZydXN0dW0odXVpZD86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub2JqZWN0M0RTZXJ2aWNlLnRvZ2dsZVZpZXdGcnVzdHVtKHV1aWQpO1xuICB9XG5cbiAgc2V0Vmlld0ZydXN0dW0odXVpZDogc3RyaW5nLCB2aXNpYmxlOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLnNldFZpZXdGcnVzdHVtKHV1aWQsIHZpc2libGUpO1xuICB9XG5cbiAgaXNWaWV3RnJ1c3R1bVZpc2libGUodXVpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmlzVmlld0ZydXN0dW1WaXNpYmxlKHV1aWQpO1xuICB9XG5cbiAgLy9cbiAgLy8gLS0tLS0tLS0tLSAzRCBvYmplY3RzOiBnZW9tZXRyeSwgdHJhbnNmb3JtLCBnaXptbyAtLS0tLS0tLS0tXG4gIC8vXG4gIC8qKiBFbWl0cyBvbiBnaXptbyBjaGFuZ2VzIGFuZCBvbiBzZXRPYmplY3QzRFRyYW5zZm9ybSAvIHBsYWNlT2JqZWN0M0RPblN1cmZhY2UgLyBub3JtYWxpemVPYmplY3QzRFNpemUgKi9cbiAgcHVibGljIGdldCBvYmplY3QzRFRyYW5zZm9ybUNoYW5nZWQkKCk6IFN1YmplY3Q8T2JqZWN0M0RUcmFuc2Zvcm1DaGFuZ2U+IHtcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2Uub2JqZWN0M0RUcmFuc2Zvcm1DaGFuZ2VkJDtcbiAgfVxuXG4gIC8qKiBXb3JsZC1zcGFjZSBib3VuZGluZyBib3gsIG51bGwgd2hlbiB0aGUgb2JqZWN0IGlzIHVua25vd24gb3Igbm90IGxvYWRlZCAqL1xuICBnZXRPYmplY3QzREJvdW5kaW5nQm94KHV1aWQ6IHN0cmluZyk6IE9iamVjdDNEQm91bmRpbmdCb3ggfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UuZ2V0T2JqZWN0M0RCb3VuZGluZ0JveCh1dWlkKTtcbiAgfVxuXG4gIC8qKiBEaW1lbnNpb25zIG9mIHRoZSBtb2RlbCBpbiBtZXRlcnMsIHdpdGhvdXQgaXRzIHJvdGF0aW9uICovXG4gIGdldE9iamVjdDNERGltZW5zaW9ucyh1dWlkOiBzdHJpbmcpOiBQb2ludDNEIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmdldE9iamVjdDNERGltZW5zaW9ucyh1dWlkKTtcbiAgfVxuXG4gIC8qKiBVbmlmb3JtIHNjYWxlIHNvIHRoZSBsYXJnZXN0IGRpbWVuc2lvbiBlcXVhbHMgYHRhcmdldFNpemVNZXRlcnNgOyByZXR1cm5zIHRoZSBuZXcgc2NhbGUgb3IgbnVsbCAqL1xuICBub3JtYWxpemVPYmplY3QzRFNpemUodXVpZDogc3RyaW5nLCB0YXJnZXRTaXplTWV0ZXJzOiBudW1iZXIpOiBQb2ludDNEIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLm5vcm1hbGl6ZU9iamVjdDNEU2l6ZSh1dWlkLCB0YXJnZXRTaXplTWV0ZXJzKTtcbiAgfVxuXG4gIC8qKiBNb3ZlcyB0aGUgb2JqZWN0IHNvIGl0cyBib3VuZGluZyBib3ggYm90dG9tLWNlbnRlciAodG9wLWNlbnRlciBvbiBhIGNlaWxpbmcpIGxpZXMgb24gYHBvaW50YCAqL1xuICBwbGFjZU9iamVjdDNET25TdXJmYWNlKHV1aWQ6IHN0cmluZywgcG9pbnQ6IFBvaW50M0QsIG5vcm1hbD86IFBvaW50M0QsIGZyb250WWF3T2Zmc2V0ID0gMCk6IE9iamVjdDNEVHJhbnNmb3JtIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLnBsYWNlT2JqZWN0M0RPblN1cmZhY2UodXVpZCwgcG9pbnQsIG5vcm1hbCwgZnJvbnRZYXdPZmZzZXQpO1xuICB9XG5cbiAgZ2V0T2JqZWN0M0RUcmFuc2Zvcm0odXVpZDogc3RyaW5nKTogT2JqZWN0M0RUcmFuc2Zvcm0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UuZ2V0T2JqZWN0M0RUcmFuc2Zvcm0odXVpZCk7XG4gIH1cblxuICAvKiogUm90YXRpb24gaW4gcmFkaWFucyAqL1xuICBzZXRPYmplY3QzRFRyYW5zZm9ybSh1dWlkOiBzdHJpbmcsIHRyYW5zZm9ybTogUGFydGlhbDxPYmplY3QzRFRyYW5zZm9ybT4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2Uuc2V0T2JqZWN0M0RUcmFuc2Zvcm0odXVpZCwgdHJhbnNmb3JtKTtcbiAgfVxuXG4gIGF0dGFjaEdpem1vKHV1aWQ6IHN0cmluZywgbW9kZTogR2l6bW9Nb2RlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmF0dGFjaEdpem1vKHV1aWQsIG1vZGUsIHRoaXMuc2RrKTtcbiAgfVxuXG4gIHNldEdpem1vTW9kZShtb2RlOiBHaXptb01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLm9iamVjdDNEU2VydmljZS5zZXRHaXptb01vZGUobW9kZSk7XG4gIH1cblxuICBkZXRhY2hHaXptbyh1dWlkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5vYmplY3QzRFNlcnZpY2UuZGV0YWNoR2l6bW8odXVpZCk7XG4gIH1cblxuICBpc0dpem1vQXR0YWNoZWQodXVpZD86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5pc0dpem1vQXR0YWNoZWQodXVpZCk7XG4gIH1cblxuICAvKiogbnVsbCBkaXNhYmxlcyBzbmFwcGluZyAoZGVmYXVsdCkgKi9cbiAgc2V0R2l6bW9TbmFwKHNuYXA6IEdpem1vU25hcCB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLm9iamVjdDNEU2VydmljZS5zZXRHaXptb1NuYXAoc25hcCk7XG4gIH1cblxuICAvKiogTGltaXRzIG9mIGEgdHJhbnNsYXRlIGRyYWcgZnJvbSBpdHMgc3RhcnQgKGRlZmF1bHQgMiBtLCArLy0gMS41IG0gdmVydGljYWxseSkgKi9cbiAgc2V0R2l6bW9NYXhEcmFnRGlzdGFuY2UobWF4RGlzdGFuY2U6IG51bWJlciwgbWF4SGVpZ2h0PzogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5vYmplY3QzRFNlcnZpY2Uuc2V0R2l6bW9NYXhEcmFnRGlzdGFuY2UobWF4RGlzdGFuY2UsIG1heEhlaWdodCk7XG4gIH1cblxuICAvKipcbiAgICogTG9ja3MgLyB1bmxvY2tzIGNhbWVyYSBuYXZpZ2F0aW9uIHRvIG90aGVyIHN3ZWVwcyB3aGlsZSBhIGdpem1vIGlzIGVkaXRlZDogZXZlcnkgZW5hYmxlZCBzd2VlcFxuICAgKiBleGNlcHQgdGhlIGN1cnJlbnQgb25lIGlzIGRpc2FibGVkLCBhbmQgZXhhY3RseSB0aG9zZSBhcmUgcmUtZW5hYmxlZCBvbiB1bmxvY2suXG4gICAqIEByZXR1cm5zIGZhbHNlIHdoZW4gdGhlIGxvY2sgY291bGQgbm90IGJlIGFwcGxpZWQgKFNESyBub3QgcmVhZHksIGN1cnJlbnQgc3dlZXAgdW5rbm93bilcbiAgICovXG4gIGFzeW5jIHNldE5hdmlnYXRpb25Mb2NrZWQobG9ja2VkOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLnNkaykgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGN1cnJlbnRTd2VlcCA9IHRoaXMucG9zZUNhbWVyYT8uc3dlZXAgPz8gbnVsbDtcbiAgICBjb25zdCBzd2VlcHMgPSB7IC4uLnRoaXMua25vd25Td2VlcHMsIC4uLih0aGlzLnN3ZWVwQ29sbGVjdGlvbiA/PyB7fSkgfTtcbiAgICBpZiAobG9ja2VkICYmICF0aGlzLm9iamVjdDNEU2VydmljZS5pc05hdmlnYXRpb25Mb2NrZWQoKSkge1xuICAgICAgdGhpcy5sb2NrZWRTd2VlcHNTbmFwc2hvdCA9IHN3ZWVwcztcbiAgICB9XG4gICAgY29uc3Qga2VlcERpc2FibGVkID0gKHRoaXMuZm9yYmlkZGVuU3dlZXBzID8/IFtdKS5tYXAoKHMpID0+IHRoaXMubmF2aWdhdGlvblNlcnZpY2UucmVzb2x2ZVN3ZWVwU2lkKHMpKTtcbiAgICBjb25zdCBkb25lID0gYXdhaXQgdGhpcy5vYmplY3QzRFNlcnZpY2Uuc2V0TmF2aWdhdGlvbkxvY2tlZChcbiAgICAgIHRoaXMuc2RrLCBsb2NrZWQsIHN3ZWVwcywgY3VycmVudFN3ZWVwLCBrZWVwRGlzYWJsZWRcbiAgICApO1xuICAgIGlmICghbG9ja2VkIHx8ICFkb25lKSB7XG4gICAgICB0aGlzLmxvY2tlZFN3ZWVwc1NuYXBzaG90ID0ge307XG4gICAgfVxuICAgIHJldHVybiBkb25lO1xuICB9XG5cbiAgaXNOYXZpZ2F0aW9uTG9ja2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5pc05hdmlnYXRpb25Mb2NrZWQoKTtcbiAgfVxuXG4gIC8vXG4gIC8vIC0tLS0tLS0tLS0gM0Qgb2JqZWN0czogaW50ZXJhY3RpdmUgcGxhY2VtZW50IC0tLS0tLS0tLS1cbiAgLy9cbiAgLyoqXG4gICAqIE1ha2VzIGFuIGFscmVhZHkgbG9hZGVkIG1vZGVsIGZvbGxvdyB0aGUgY3Vyc29yIG9uIHRoZSBzdXJmYWNlcyBvZiB0aGUgdmlzaXQuXG4gICAqIExlZnQgY2xpY2sgcmVzb2x2ZXMgd2l0aCB0aGUgc3VyZmFjZSBwb2ludCAvIG5vcm1hbCB1bmRlciB0aGUgY3Vyc29yIChyZWFkIHRoZSBvYmplY3Qgb3JpZ2luXG4gICAqIHdpdGggZ2V0T2JqZWN0M0RUcmFuc2Zvcm0pOyByaWdodCBjbGljayBvciBFc2NhcGUgaGlkZXMgdGhlIG1vZGVsIGFuZCByZXNvbHZlcyBudWxsXG4gICAqIChkZWxldGluZyBpdCBpcyB1cCB0byB0aGUgY2FsbGVyKS4gUmVzb2x2ZXMgbnVsbCByaWdodCBhd2F5IGlmIGFub3RoZXIgaW50ZXJhY3Rpb24gaXMgcnVubmluZy5cbiAgICovXG4gIHN0YXJ0T2JqZWN0M0RQbGFjZW1lbnQodXVpZDogc3RyaW5nLCBvcHRpb25zOiB7IGZyb250WWF3T2Zmc2V0PzogbnVtYmVyIH0gPSB7fSk6IFByb21pc2U8T2JqZWN0M0RQbGFjZW1lbnRSZXN1bHQgfCBudWxsPiB7XG4gICAgaWYgKCF0aGlzLm9iamVjdDNEU2VydmljZS5nZXRPYmplY3QzRE1vZGVsTm9kZUZyb21EaWN0aW9ubmFyeSh1dWlkKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub2JqZWN0M0RQbGFjZW1lbnQpIHtcbiAgICAgIHRoaXMuY2FuY2VsT2JqZWN0M0RQbGFjZW1lbnQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaW50ZXJhY3Rpb25Nb2RlICE9PSBWaWV3ZXJJbnRlcmFjdGlvbnMuREVGQVVMVCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLm9iamVjdDNEUGxhY2VtZW50ID0geyB1dWlkLCByZXNvbHZlLCBsYXN0UG9pbnQ6IG51bGwsIGxhc3ROb3JtYWw6IG51bGwsIGZyb250WWF3T2Zmc2V0OiBvcHRpb25zLmZyb250WWF3T2Zmc2V0ID8/IDAgfTtcbiAgICAgIHRoaXMub2JqZWN0M0RTZXJ2aWNlLnNldE9iamVjdDNEQ29sbGlkZXJFbmFibGVkKHV1aWQsIGZhbHNlKTtcbiAgICAgIHRoaXMub2JqZWN0M0RTZXJ2aWNlLnNldE9iamVjdDNEVmlzaWJsZSh1dWlkLCBmYWxzZSk7XG4gICAgICB0aGlzLnNldEludGVyYWN0aW9uTW9kZShWaWV3ZXJJbnRlcmFjdGlvbnMuUExBQ0lOR19PQkpFQ1QzRCk7XG4gICAgICBpZiAodGhpcy5wb3NlTWF0dGVycG9ydD8ucG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy51cGRhdGVPYmplY3QzRFBsYWNlbWVudFByZXZpZXcodGhpcy5wb3NlTWF0dGVycG9ydCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpc1BsYWNpbmdPYmplY3QzRCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLm9iamVjdDNEUGxhY2VtZW50O1xuICB9XG5cbiAgLyoqIENhbmNlbHMgdGhlIHJ1bm5pbmcgb2JqZWN0IHBsYWNlbWVudCAobW9kZWwgaGlkZGVuLCBwcm9taXNlIHJlc29sdmVzIG51bGwpICovXG4gIGNhbmNlbE9iamVjdDNEUGxhY2VtZW50KCk6IHZvaWQge1xuICAgIGNvbnN0IHBsYWNlbWVudCA9IHRoaXMub2JqZWN0M0RQbGFjZW1lbnQ7XG4gICAgaWYgKCFwbGFjZW1lbnQpIHJldHVybjtcbiAgICB0aGlzLmVuZE9iamVjdDNEUGxhY2VtZW50KCk7XG4gICAgdGhpcy5vYmplY3QzRFNlcnZpY2Uuc2V0T2JqZWN0M0RWaXNpYmxlKHBsYWNlbWVudC51dWlkLCBmYWxzZSk7XG4gICAgcGxhY2VtZW50LnJlc29sdmUobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogRHJvcHMgdGhlIG9iamVjdCB3aGVyZSBpdCBpcyBwcmV2aWV3ZWQgKHNhbWUgYXMgYSBsZWZ0IGNsaWNrKS4gVG91Y2ggc2NyZWVucyBoYXZlIG5vIGhvdmVyOiBlYWNoXG4gICAqIHRhcCBtb3ZlcyB0aGUgcHJldmlldywgYW5kIHRoZSBhcHAgY29uZmlybXMgd2l0aCBhIGJ1dHRvbi5cbiAgICogQHJldHVybnMgZmFsc2Ugd2hlbiBubyBzdXJmYWNlIHdhcyBwb2ludGVkIHlldFxuICAgKi9cbiAgY29uZmlybU9iamVjdDNEUGxhY2VtZW50KCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5vYmplY3QzRFBsYWNlbWVudD8ubGFzdFBvaW50KSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy52YWxpZGF0ZU9iamVjdDNEUGxhY2VtZW50KCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogVHJ1ZSBvbmNlIHRoZSBwcmV2aWV3IHN0YW5kcyBvbiBhIHN1cmZhY2UgKHRoZSBwbGFjZW1lbnQgY2FuIGJlIGNvbmZpcm1lZCkgKi9cbiAgaGFzT2JqZWN0M0RQbGFjZW1lbnRQb2ludCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLm9iamVjdDNEUGxhY2VtZW50Py5sYXN0UG9pbnQ7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlT2JqZWN0M0RQbGFjZW1lbnQoKTogdm9pZCB7XG4gICAgY29uc3QgcGxhY2VtZW50ID0gdGhpcy5vYmplY3QzRFBsYWNlbWVudDtcbiAgICBpZiAoIXBsYWNlbWVudCB8fCAhcGxhY2VtZW50Lmxhc3RQb2ludCkgcmV0dXJuOyAvLyBubyBzdXJmYWNlIHVuZGVyIHRoZSBjdXJzb3IgeWV0XG4gICAgdGhpcy5lbmRPYmplY3QzRFBsYWNlbWVudCgpO1xuICAgIHBsYWNlbWVudC5yZXNvbHZlKHtcbiAgICAgIHBvc2l0aW9uOiBwbGFjZW1lbnQubGFzdFBvaW50LFxuICAgICAgbm9ybWFsOiBwbGFjZW1lbnQubGFzdE5vcm1hbCA/PyB7IHg6IDAsIHk6IDEsIHo6IDAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZW5kT2JqZWN0M0RQbGFjZW1lbnQoKTogdm9pZCB7XG4gICAgY29uc3QgcGxhY2VtZW50ID0gdGhpcy5vYmplY3QzRFBsYWNlbWVudDtcbiAgICBpZiAoIXBsYWNlbWVudCkgcmV0dXJuO1xuICAgIHRoaXMub2JqZWN0M0RQbGFjZW1lbnQgPSBudWxsO1xuICAgIHRoaXMub2JqZWN0M0RTZXJ2aWNlLnNldE9iamVjdDNEQ29sbGlkZXJFbmFibGVkKHBsYWNlbWVudC51dWlkLCB0cnVlKTtcbiAgICB0aGlzLnNldEludGVyYWN0aW9uTW9kZShWaWV3ZXJJbnRlcmFjdGlvbnMuREVGQVVMVCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZU9iamVjdDNEUGxhY2VtZW50UHJldmlldyhpbnRlcnNlY3Rpb246IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHBsYWNlbWVudCA9IHRoaXMub2JqZWN0M0RQbGFjZW1lbnQ7XG4gICAgaWYgKCFwbGFjZW1lbnQgfHwgIWludGVyc2VjdGlvbj8ucG9zaXRpb24pIHJldHVybjtcbiAgICAvLyBPbmx5IHRoZSBzY2FubmVkIHN1cmZhY2VzOiBoaXR0aW5nIHRoZSBwcmV2aWV3IGl0c2VsZiAocmVwb3J0ZWQgYXMgXCJ1bmtub3duXCIpIHdvdWxkIHB1c2ggaXQgYXdheVxuICAgIC8vIGFsb25nIHRoZSByYXkgYXQgZWFjaCBtb3ZlLCB1bnRpbCBpdCBsYW5kcyBraWxvbWV0ZXJzIGZyb20gdGhlIGNhbWVyYVxuICAgIGlmICh0eXBlb2YgaW50ZXJzZWN0aW9uLm9iamVjdCA9PT0gJ3N0cmluZycgJiYgIVBMQUNFTUVOVF9TVVJGQUNFUy5pbmNsdWRlcyhpbnRlcnNlY3Rpb24ub2JqZWN0KSkgcmV0dXJuO1xuICAgIGNvbnN0IHBvaW50ID0geyB4OiBpbnRlcnNlY3Rpb24ucG9zaXRpb24ueCwgeTogaW50ZXJzZWN0aW9uLnBvc2l0aW9uLnksIHo6IGludGVyc2VjdGlvbi5wb3NpdGlvbi56IH07XG4gICAgY29uc3Qgbm9ybWFsID0gaW50ZXJzZWN0aW9uLm5vcm1hbFxuICAgICAgPyB7IHg6IGludGVyc2VjdGlvbi5ub3JtYWwueCwgeTogaW50ZXJzZWN0aW9uLm5vcm1hbC55LCB6OiBpbnRlcnNlY3Rpb24ubm9ybWFsLnogfVxuICAgICAgOiB7IHg6IDAsIHk6IDEsIHo6IDAgfTtcbiAgICBpZiAoIXBsYWNlbWVudC5sYXN0UG9pbnQpIHtcbiAgICAgIC8vIGhpZGRlbiB1bnRpbCBpdCBpcyBvbiBhIHN1cmZhY2UgKGl0IHdhcyBsb2FkZWQgYXQgdGhlIGNhbWVyYSBwb3NpdGlvbilcbiAgICAgIHRoaXMub2JqZWN0M0RTZXJ2aWNlLnNldE9iamVjdDNEVmlzaWJsZShwbGFjZW1lbnQudXVpZCwgdHJ1ZSk7XG4gICAgfVxuICAgIHBsYWNlbWVudC5sYXN0UG9pbnQgPSBwb2ludDtcbiAgICBwbGFjZW1lbnQubGFzdE5vcm1hbCA9IG5vcm1hbDtcbiAgICB0aGlzLm9iamVjdDNEU2VydmljZS5wbGFjZU9iamVjdDNET25TdXJmYWNlKHBsYWNlbWVudC51dWlkLCBwb2ludCwgbm9ybWFsLCBwbGFjZW1lbnQuZnJvbnRZYXdPZmZzZXQpO1xuICB9XG5cbiAgLyoqIFRva2VuIGZvciB0aGUgcG9pbnRlciB0cmljazogdHJ1dGh5IHdoaWxlIHNvbWV0aGluZyBmb2xsb3dzIHRoZSBjdXJzb3IgKHRhZyBvciAzRCBvYmplY3QpICovXG4gIHByaXZhdGUgZ2V0Rm9sbG93VGFyZ2V0KCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93ID8/IHRoaXMub2JqZWN0M0RQbGFjZW1lbnQ/LnV1aWQgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWxzIHdoYXRldmVyIGZvbGxvd3MgdGhlIGN1cnNvciAocmlnaHQgY2xpY2sgLyBFc2NhcGUpOiB0aGUgM0Qgb2JqZWN0IHByZXZpZXcsIG9yIHRoZSB0YWcuXG4gICAqIEVtaXRzIHBsYWNlbWVudENhbmNlbGxlZCQgd2hlbiBzb21ldGhpbmcgd2FzIGFjdHVhbGx5IHJ1bm5pbmcuXG4gICAqL1xuICBwcml2YXRlIGNhbmNlbEN1cnJlbnRQbGFjZW1lbnQoKTogdm9pZCB7XG4gICAgY29uc3Qgd2FzUnVubmluZyA9IHRoaXMuaW50ZXJhY3Rpb25Nb2RlICE9PSBWaWV3ZXJJbnRlcmFjdGlvbnMuREVGQVVMVCB8fCAhIXRoaXMub2JqZWN0M0RQbGFjZW1lbnQ7XG4gICAgLy8gbm90aGluZyBmb2xsb3dzIHRoZSBjdXJzb3I6IGEgcGxhaW4gcmlnaHQgY2xpY2sgbXVzdCBub3QgcmVtb3ZlIHRoZSBsYXN0IChleGlzdGluZykgdGFnXG4gICAgaWYgKCF3YXNSdW5uaW5nKSByZXR1cm47XG4gICAgaWYgKHRoaXMub2JqZWN0M0RQbGFjZW1lbnQpIHtcbiAgICAgIHRoaXMuY2FuY2VsT2JqZWN0M0RQbGFjZW1lbnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYW5jZWxGb2xsb3dpbmdDdXJzb3IoKTtcbiAgICB9XG4gICAgdGhpcy5wbGFjZW1lbnRDYW5jZWxsZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8qKiBFc2NhcGUgY2FuY2VscyBhbnkgcGxhY2VtZW50LiBMaXN0ZW5zIG9uIHRoZSBwYWdlIGFuZCBvbiB0aGUgKHNhbWUtb3JpZ2luKSBTaG93Y2FzZSBpZnJhbWUsIHdoaWNoIHRha2VzIHRoZSBmb2N1cyBvbiBjbGljay4gKi9cbiAgcHJpdmF0ZSByZWdpc3RlckVzY2FwZUxpc3RlbmVyKGlmcmFtZT86IEhUTUxJRnJhbWVFbGVtZW50IHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlRXNjYXBlTGlzdGVuZXIoKTtcbiAgICBjb25zdCBoYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICBpZiAoKGUgYXMgS2V5Ym9hcmRFdmVudCkua2V5ICE9PSAnRXNjYXBlJykgcmV0dXJuO1xuICAgICAgaWYgKHRoaXMuaW50ZXJhY3Rpb25Nb2RlICE9PSBWaWV3ZXJJbnRlcmFjdGlvbnMuREVGQVVMVCB8fCB0aGlzLm9iamVjdDNEUGxhY2VtZW50KSB7XG4gICAgICAgIHRoaXMuY2FuY2VsQ3VycmVudFBsYWNlbWVudCgpO1xuICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgdGFyZ2V0czogRXZlbnRUYXJnZXRbXSA9IFtkb2N1bWVudF07XG4gICAgdHJ5IHtcbiAgICAgIGlmIChpZnJhbWU/LmNvbnRlbnRXaW5kb3cpIHRhcmdldHMucHVzaChpZnJhbWUuY29udGVudFdpbmRvdyk7XG4gICAgfSBjYXRjaCB7IC8qIGNyb3NzLW9yaWdpbiBpZnJhbWU6IHBhZ2UgbGlzdGVuZXIgb25seSAqLyB9XG4gICAgdGFyZ2V0cy5mb3JFYWNoKCh0YXJnZXQpID0+IHtcbiAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgaGFuZGxlcik7XG4gICAgICB0aGlzLmtleWRvd25UYXJnZXRzLnB1c2goeyB0YXJnZXQsIGhhbmRsZXIgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUVzY2FwZUxpc3RlbmVyKCk6IHZvaWQge1xuICAgIHRoaXMua2V5ZG93blRhcmdldHMuZm9yRWFjaCgoeyB0YXJnZXQsIGhhbmRsZXIgfSkgPT4gdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVyKSk7XG4gICAgdGhpcy5rZXlkb3duVGFyZ2V0cyA9IFtdO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWxPYmplY3QzRFBsYWNlbWVudCgpO1xuICAgIHRoaXMucmVtb3ZlRXNjYXBlTGlzdGVuZXIoKTtcbiAgfVxuXG4gIC8vXG4gIC8vIC0tLS0tLS0tLS0gU3dlZXBzIC0tLS0tLS0tLS1cbiAgLy9cbiAgLyoqXG4gICAqIENsb3Nlc3QgZW5hYmxlZCBzd2VlcCB0byBhIHdvcmxkIHBvc2l0aW9uIChmb3IgaW5zdGFuY2UgdG8gcmUtYXNzaWduIHRoZSB6b25lIG9mIGEgbW92ZWQgb2JqZWN0KS5cbiAgICogYHN3ZWVwSWRgIGlzIHRoZSBEQi1mb3JtYXQgaWQgKGxpa2UgY3VycmVudFN3ZWVwKSwgYHNpZGAgdGhlIFNESyBpZC4gbnVsbCB3aGVuIG5vIHN3ZWVwIGlzIGtub3duLlxuICAgKi9cbiAgZmluZE5lYXJlc3RTd2VlcChwb3NpdGlvbjogUG9pbnQzRCk6IHsgc3dlZXBJZDogc3RyaW5nOyBzaWQ6IHN0cmluZzsgZmxvb3JTZXF1ZW5jZTogbnVtYmVyIHwgbnVsbCB9IHwgbnVsbCB7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IHsgLi4udGhpcy5sb2NrZWRTd2VlcHNTbmFwc2hvdCwgLi4uKHRoaXMuc3dlZXBDb2xsZWN0aW9uID8/IHt9KSB9O1xuICAgIGNvbnN0IHNpZHMgPSBPYmplY3Qua2V5cyhjb2xsZWN0aW9uKS5maWx0ZXIoKHNpZCkgPT4gY29sbGVjdGlvbltzaWRdPy5wb3NpdGlvbiAmJiBjb2xsZWN0aW9uW3NpZF0uZW5hYmxlZCAhPT0gZmFsc2UpO1xuICAgIGNvbnN0IGJlc3QgPSBwaWNrTmVhcmVzdFN3ZWVwT25TYW1lU3RvcmV5KFxuICAgICAgc2lkcy5tYXAoKHNpZCkgPT4gKHsgc2lkLCBwb3NpdGlvbjogY29sbGVjdGlvbltzaWRdLnBvc2l0aW9uLCBmbG9vclk6IHN3ZWVwRmxvb3JZKGNvbGxlY3Rpb25bc2lkXSkgfSkpLFxuICAgICAgcG9zaXRpb25cbiAgICApO1xuICAgIGNvbnN0IGRhdGEgPSBiZXN0ID8gY29sbGVjdGlvbltiZXN0XSA6IG51bGw7XG4gICAgaWYgKCFiZXN0KSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgc3dlZXBJZDogdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5yZXNvbHZlU3dlZXBVdWlkKGJlc3QpLFxuICAgICAgc2lkOiBiZXN0LFxuICAgICAgZmxvb3JTZXF1ZW5jZTogZGF0YS5mbG9vckluZm8/LnNlcXVlbmNlID8/ICh0eXBlb2YgZGF0YS5mbG9vciA9PT0gJ251bWJlcicgPyBkYXRhLmZsb29yIDogbnVsbCksXG4gICAgfTtcbiAgfVxufVxuIl19
|