@jax-data-science/sci-image-visualizer 0.2.0 → 0.2.1

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.
@@ -220,6 +220,11 @@ export class VisualizerComponent {
220
220
  const caps = this.plotService.capabilities;
221
221
  const isStack = !!this.imageInfo?.isStack;
222
222
  const isGrayscale = !!this.imageInfo?.isGrayscale;
223
+ // A multichannel image's bands are each single-band (scalar), so the scalar
224
+ // plot modes (Heatmap / Surface / Volume / Isosurface) apply per channel even
225
+ // though the RGB composite isn't grayscale — don't gate them out.
226
+ const m0 = this.imageInfo?.imageMeta?.[0];
227
+ const isMultichannel = (m0?.channelCount ?? 1) > 1 && (m0?.rgbChannels ?? 1) < 3;
223
228
  this.plotTypeOptions = this.plotService.getPlotTypeDescriptors()
224
229
  .filter((d) => {
225
230
  // Outside test mode, only the curated set (those with a productionLabel)
@@ -230,7 +235,7 @@ export class VisualizerComponent {
230
235
  return false;
231
236
  if (d.requiresStack && !isStack)
232
237
  return false;
233
- if (d.requiresGrayscale && !isGrayscale)
238
+ if (d.requiresGrayscale && !isGrayscale && !isMultichannel)
234
239
  return false;
235
240
  return true;
236
241
  })
@@ -1594,4 +1599,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
1594
1599
  type: HostListener,
1595
1600
  args: ['window:keydown', ['$event']]
1596
1601
  }] } });
1597
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsaXplci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Zpc3VhbGl6ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vc3JjL2xpYi92aXN1YWxpemVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQWlCLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWdDLFFBQVEsRUFBRSxNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6TSxPQUFPLEVBQW1CLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBWSxjQUFjLEVBQVksTUFBTSxhQUFhLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWxELE9BQU8sRUFBa0IsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFFLE9BQU8sRUFDTCxRQUFRLEVBRVIsVUFBVSxFQUNWLHVCQUF1QixHQUN4QixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNsRSxPQUFPLEVBQWlDLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxD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LENBQUM7UUFDeEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QyxDQUFDOzhHQTFtRFUsbUJBQW1CLGtCQW9NcEIsZ0JBQWdCLGFBQ2hCLFVBQVUsd1FBU0UsVUFBVTtrR0E5TXJCLG1CQUFtQiwyWEMxQ2hDLDZzU0FpTEE7OzJGRHZJYSxtQkFBbUI7a0JBUC9CLFNBQVM7K0JBR0UsWUFBWTs7MEJBd01uQixNQUFNOzJCQUFDLGdCQUFnQjs7MEJBQ3ZCLE1BQU07MkJBQUMsVUFBVTs7MEJBU2pCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsVUFBVTt5Q0F0TWhDLFlBQVk7c0JBRFgsTUFBTTtnQkFHUCxnQkFBZ0I7c0JBRGYsTUFBTTtnQkFNSCxZQUFZO3NCQURmLEtBQUs7Z0JBY04sUUFBUTtzQkFEUCxLQUFLO2dCQXFDVyxXQUFXO3NCQUEzQixTQUFTO3VCQUFDLElBQUk7Z0JBbTVCZixTQUFTO3NCQURSLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBBZnRlclZpZXdJbml0LCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5qZWN0LCBJbnB1dCwgTmdab25lLCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTWVudUl0ZW0sIE1lc3NhZ2VTZXJ2aWNlLCBUcmVlTm9kZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IENvbnRleHRNZW51IH0gZnJvbSAncHJpbWVuZy9jb250ZXh0bWVudSc7XG5pbXBvcnQgeyBJSW1hZ2VJbmZvIH0gZnJvbSAnLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgSW1hZ2VTdGF0ZVBvcnQsIElNQUdFX1NUQVRFX1BPUlQgfSBmcm9tICcuL2NvbnRyYWN0cy9wb3J0cy9pbWFnZS1zdGF0ZS5wb3J0JztcbmltcG9ydCB7IFBvbHlnb24sIFJlY3RhbmdsZSwgTXVsdGlQb2x5Z29uLCBSZWdpb24gfSBmcm9tICcuL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgUmVnaW9uT3BzU2VydmljZSB9IGZyb20gJy4vcmVnaW9uLW9wcy5zZXJ2aWNlJztcbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlbmRlck9yY2hlc3RyYXRvciwgU2xpY2VTY3J1YmJlciB9IGZyb20gJy4vcmVuZGVyLW9yY2hlc3RyYXRvcic7XG5pbXBvcnQge1xuICBQbG90VHlwZSxcbiAgUGxvdFR5cGVEZXNjcmlwdG9yLFxuICBpc05hcGFyaTNkLFxuICBOQVBBUklfREVGQVVMVF9ERUNJTUFURSxcbn0gZnJvbSAnLi9jb250cmFjdHMvcGxvdC10eXBlJztcbmltcG9ydCB7IFZpZXdlckZlYXR1cmUgfSBmcm9tICcuL2NvbnRyYWN0cy9jYXBhYmlsaXRpZXMuY29udHJhY3QnO1xuaW1wb3J0IHsgSW50ZW5zaXR5UHJvZmlsZSwgSVZpc3VhbGl6ZXIsIFZJU1VBTElaRVIgfSBmcm9tICcuL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFNBTV9NT0RFTFMsIGdldERlZmF1bHRTYW1Nb2RlbElkLCBpc1NhbU1vZGVsUmVhZHkgfSBmcm9tICcuL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS1tb2RlbC1yZWdpc3RyeSc7XG5pbXBvcnQgeyBTYW1Ub29sU2VydmljZSB9IGZyb20gJy4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Qb2ludFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tcG9pbnQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxTZWdtZW50VG9vbFNlcnZpY2UgfSBmcm9tICcuL3Rvb2xiYXIvc2VnbWVudGF0aW9uL2NlbGwtc2VnbWVudC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVnaW9uVG9vbE1vZGUgfSBmcm9tICcuL2NvbnRyYWN0cy9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5pbXBvcnQgeyBUb29sYmFyVG9vbFZpc2liaWxpdHksIEFMTF9UT09MQkFSX1RPT0xTIH0gZnJvbSAnLi9jb250cmFjdHMvdG9vbGJhci1jb25maWcnO1xuaW1wb3J0IHsgVklaX0NPTkZJRywgVml6Q29uZmlnIH0gZnJvbSAnLi9jb250cmFjdHMvdml6LWNvbmZpZyc7XG5cbi8qKiBQZXItaW5zdGFuY2UgcGxvdC1kaXYgaWQgc291cmNlLiBUaGUgbW91bnQgZWxlbWVudCdzIGlkIG11c3QgYmUgdW5pcXVlIHNvIHR3b1xuICogIGxpdmUgdmlld2VycyAoZS5nLiB0aGUgbWFpbiBkaWFncmFtICsgYSBtb2RhbCBwcmV2aWV3KSBkb24ndCBjb2xsaWRlIG9uIHRoZVxuICogIHNhbWUgRE9NIGlkIOKAlCBgZ2V0RWxlbWVudEJ5SWRgIHdvdWxkIG90aGVyd2lzZSByZXR1cm4gd2hpY2hldmVyIGNhbWUgZmlyc3QuXG4gKiAgU3R5bGluZyBoYW5ncyBvZmYgdGhlIGAudml6LXBsb3RgIGNsYXNzIGluc3RlYWQgb2YgdGhlIGlkLiAqL1xubGV0IHBsb3RJbnN0YW5jZVNlcSA9IDA7XG5cbkBDb21wb25lbnQoe1xuICAvLyBDYW5vbmljYWwgcHJlZml4ZWQgc2VsZWN0b3IgZmlyc3Q7IHRoZSB1bnByZWZpeGVkIG9yaWdpbmFsIGlzIGtlcHQgYXMgYW5cbiAgLy8gYWxpYXMgZm9yIG9uZSByZWxlYXNlIChwcmUtcHVibGljYXRpb24gYmFjay1jb21wYXQpLlxuICBzZWxlY3RvcjogJ3Zpc3VhbGl6ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vdmlzdWFsaXplci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Zpc3VhbGl6ZXIuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVmlzdWFsaXplckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKiogUGVyLWluc3RhbmNlIHRvYXN0IGtleS4gTWVzc2FnZVNlcnZpY2UgaXMgYSBnbG9iYWwgc2luZ2xldG9uLCBzbyB0d28gbGl2ZVxuICAgKiAgYDx2aXN1YWxpemVyPmAgaW5zdGFuY2VzIChtYWluIHZpZXdlciArIHBpcGVsaW5lLWRpYWxvZyBwcmV2aWV3KSBzaGFyaW5nXG4gICAqICBvbmUga2V5IHdvdWxkIGVhY2ggcmVuZGVyIHRoZSBzYW1lIG1lc3NhZ2Ug4oCUIGEgZHVwbGljYXRlIHRvYXN0LiBBIHVuaXF1ZVxuICAgKiAga2V5IHBlciBpbnN0YW5jZSBzY29wZXMgdGhlIHRvYXN0IHRvIHRoZSBjb21wb25lbnQgdGhhdCByYWlzZWQgaXQuICovXG4gIHByaXZhdGUgc3RhdGljIG5leHRUb2FzdElkID0gMDtcblxuICBAT3V0cHV0KClcbiAgaXNTdGFja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSk7XG4gIEBPdXRwdXQoKVxuICBpc0dyYXlzY2FsZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSk7XG5cbiAgLyoqIFdoaWNoIHRvb2xiYXIgZ3JvdXBzIHRvIHNob3cuIEEgcGFydGlhbCBvdmVycmlkZSBtZXJnZXMgb3ZlciB0aGUgZnVsbCBzZXQsXG4gICAqICBzbyBgeyBzcGVjaWFsVG9vbHM6IGZhbHNlIH1gIGhpZGVzIG9ubHkgdGhhdCBncm91cC4gRGVmYXVsdHMgdG8gZXZlcnl0aGluZy4gKi9cbiAgQElucHV0KClcbiAgc2V0IHRvb2xiYXJUb29scyh2OiBUb29sYmFyVG9vbFZpc2liaWxpdHkgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl90b29sYmFyVG9vbHMgPSB7IC4uLkFMTF9UT09MQkFSX1RPT0xTLCAuLi4odiA/PyB7fSkgfTtcbiAgfVxuXG4gIGdldCB0b29sYmFyVG9vbHMoKTogUmVxdWlyZWQ8VG9vbGJhclRvb2xWaXNpYmlsaXR5PiB7XG4gICAgcmV0dXJuIHRoaXMuX3Rvb2xiYXJUb29scztcbiAgfVxuICBwcml2YXRlIF90b29sYmFyVG9vbHM6IFJlcXVpcmVkPFRvb2xiYXJUb29sVmlzaWJpbGl0eT4gPSBBTExfVE9PTEJBUl9UT09MUztcblxuICAvKiogRXhwb3NlIHRlc3Qtb25seSBwbG90IG1vZGVzIGluIHRoZSBzZWxlY3RvciAoZS5nLiB0aGUgbmFwYXJpIGBJbWFnZWBcbiAgICogIG1vZGUsIG90aGVyd2lzZSBoaWRkZW4pLiBUaGUgaG9zdCBhcHAgc2V0cyB0aGlzIGZyb20gYSBgP3Rlc3Q9MWAgVVJMXG4gICAqICB0b2dnbGUuIE9mZiBieSBkZWZhdWx0LCBzbyBwcm9kdWN0aW9uIHVzZXJzIG5ldmVyIHNlZSB0aGVtLiAqL1xuICBASW5wdXQoKVxuICB0ZXN0TW9kZSA9IGZhbHNlO1xuXG4gIC8qKiBJbWFnZS1zbW9vdGhpbmcgc3RhdGUgZm9yIHRoZSB0b29sYmFyJ3MgU21vb3RoZW4gdG9nZ2xlIChPU0Qgb25seSkuXG4gICAqICBEZWZhdWx0cyB0byBgZmFsc2VgIHNvIE9TRCBzaG93cyByYXcgcGl4ZWxzIChuZWFyZXN0LW5laWdoYm91cikuICovXG4gIGltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuICBsb2FkaW5nTWVzc2FnZSA9ICdMb2FkaW5nIGltYWdlLi4uJztcbiAgem9vbSA9IGZhbHNlO1xuICBmaWxlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGxvYWRlZEZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGltYWdlSW5mbzogSUltYWdlSW5mbyB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHVuc3ViID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBwcmV2aWV3U3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIHB1YmxpYyBzdGFja0xvYWRpbmcgPSBmYWxzZTtcbiAgcHVibGljIGltZ0xvYWRpbmcgPSBmYWxzZTtcbiAgcHVibGljIGxvYWRpbmdQZXJjZW50YWdlID0gMDtcbiAgLy8gTm9uLW51bGwgKDAuLjEwMCkgd2hpbGUgaml0LXNlcnZpY2UgaXMgY29weWluZyB0aGUgc291cmNlIGZpbGUgaW50byB0aGVcbiAgLy8gbG9jYWwgY2FjaGUgUFZDIG9uIGZpcnN0IGNsaWNrLiBXaGVuIHNldCwgdGhlIGxvYWRpbmcgb3ZlcmxheSBzd2FwcyB0aGVcbiAgLy8gc3Bpbm5lciBmb3IgYSBkZXRlcm1pbmF0ZSBwcm9ncmVzcyBiYXIgd2l0aCBhIFwiQ2FjaGluZyBpbWFnZVwiIG1lc3NhZ2UuXG4gIHB1YmxpYyBjYWNoZVByb2dyZXNzOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgLy8gVHJ1ZSBiZXR3ZWVuIHRoZSBzbWFsbC10aWVyIHJlbmRlciBsYW5kaW5nIGFuZCB0aGUgbGFyZ2UtdGllciByZW5kZXJcbiAgLy8gbGFuZGluZyBpbiB0aGUgbXVsdGktdGllciByZW5kZXJpbmcgcGF0aC4gVGhlIHRlbXBsYXRlIHVzZXMgdGhpcyB0b1xuICAvLyBvdmVybGF5IGEgdHJhbnNsdWNlbnQgc3Bpbm5lciBvbiB0b3Agb2YgdGhlIGJsdXJyeSBzbWFsbC10aWVyIGltYWdlIHNvXG4gIC8vIHRoZSB1c2VyIGRvZXNuJ3QgbWlzdGFrZSBpdCBmb3IgdGhlIGZpbmFsIHByZXZpZXcuXG4gIHB1YmxpYyBzaGFycGVuaW5nID0gZmFsc2U7XG4gIC8qKiBBIGppdC1zZXJ2aWNlIGNhY2hlIGNvcHkgaXMgYWN0aXZlbHkgaW4gcHJvZ3Jlc3MgKGRldGVybWluYXRlIDAuLjk5KS4gRHJpdmVzIHRoZSBjYWNoZVxuICAgKiAgcHJvZ3Jlc3MgYmFyIGluZGVwZW5kZW50bHkgb2YgYGltZ0xvYWRpbmdgIHNvIHRoZSBiYXIgY2FuJ3QgYmUgZHJvcHBlZCDigJQgb3IgbWFza2VkIGJ5IHRoZVxuICAgKiAgXCJTaGFycGVuaW5nIHByZXZpZXcuLi5cIiBvdmVybGF5IOKAlCBtaWQtZG93bmxvYWQgaWYgdGhlIGxvYWRpbmcgZmxhZyBmbGlwcyBlYXJseS4gKi9cbiAgZ2V0IGlzQ2FjaGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jYWNoZVByb2dyZXNzICE9PSBudWxsICYmIHRoaXMuY2FjaGVQcm9ncmVzcyA8IDEwMDtcbiAgfVxuICBwcml2YXRlIHJ1bm5pbmcgPSBmYWxzZTtcbiAgcHVibGljIHpJbmRleCA9IDA7XG4gIHB1YmxpYyBtYXhJbmRleCA9IDA7XG5cbiAgQFZpZXdDaGlsZCgnY20nKSBjb250ZXh0TWVudSE6IENvbnRleHRNZW51O1xuICBjb250ZXh0TWVudUl0ZW1zOiBNZW51SXRlbVtdID0gW107XG5cbiAgYWN0aXZlRHJhZ01vZGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBXaGV0aGVyIGEgcmVnaW9uIGFjdGlvbiBpcyBhdmFpbGFibGUgdG8gdW5kbyAoaml0LXVpIzg1KS4gTWlycm9ycyB0aGVcbiAgICogIHNoYXJlZCBSZWdpb25TdG9yZSdzIGhpc3RvcnkgZGVwdGg7IGRyaXZlcyB0aGUgdG9vbGJhciBVbmRvIGJ1dHRvbi4gKi9cbiAgY2FuVW5kb1JlZ2lvbiA9IGZhbHNlO1xuICAvKiogV2hldGhlciBhbiB1bmRvbmUgcmVnaW9uIGFjdGlvbiBpcyBhdmFpbGFibGUgdG8gcmVkbyAoaml0LXVpIzg1KS4gKi9cbiAgY2FuUmVkb1JlZ2lvbiA9IGZhbHNlO1xuXG4gIC8qKiBDdXN0b20tdGhyZXNob2xkIFNpbXBsaWZ5IGRpYWxvZyAoaml0LXVpIzg1KS4gKi9cbiAgZGlzcGxheVNpbXBsaWZ5RGlhbG9nID0gZmFsc2U7XG4gIHNpbXBsaWZ5VGhyZXNob2xkID0gMztcbiAgLyoqIEN1cnJlbnQgcmVnaW9uIHNlbGVjdGlvbiAoYXJyYXkgaW5kaWNlcykg4oCUIG1pcnJvcmVkIGZyb20gdGhlIHN0b3JlIHNvIHRoZVxuICAgKiAgY29udGV4dC1tZW51IHJlZ2lvbiBhY3Rpb25zIGNhbiByZWFkIGl0IHN5bmNocm9ub3VzbHkgKGppdC11aSM4NSkuICovXG4gIHByaXZhdGUgc2VsZWN0ZWRJbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuXG4gIC8qKiBXYW5kIHNlbnNpdGl2aXR5IOKAlCBoaWdoZXIgPSBzdHJpY3RlciAoc21hbGxlciBzZWxlY3Rpb24pLiBNYXRjaGVzIFF1UGF0aCBkZWZhdWx0LiAqL1xuICB3YW5kU2Vuc2l0aXZpdHkgPSAyLjA7XG4gIC8qKiBCcnVzaCBkaWFtZXRlciBpbiBpbWFnZS1waXhlbCBjb29yZGluYXRlcyAoZHJpdmVzIHRoZSBwYWludGVkIGRpc2Mgc2l6ZSkuICovXG4gIGJydXNoU2l6ZSA9IDQwO1xuICAvKiogU0FNIG1vZGVsIHBpY2tlciBvcHRpb25zICsgY3VycmVudCBzZWxlY3Rpb24gKGppdC11aSM5MCBQMSkuIE9ubHkgbW9kZWxzXG4gICAqICB3aXRoIGEgaG9zdGVkIE9OTlggcGFpciAoY29uZmlndXJlZCB2aWEgc2V0U2FtTW9kZWxVcmxzIGF0IGFwcCBpbml0KSBhcmVcbiAgICogIG9mZmVyZWQsIHNvIHRoZSBwaWNrZXIgY2FuJ3Qgc2VsZWN0IGEgbW9kZWwgdGhhdCBjYW4ndCBydW4uICovXG4gIHNhbU1vZGVscyA9IFNBTV9NT0RFTFMuZmlsdGVyKGlzU2FtTW9kZWxSZWFkeSkubWFwKChtKSA9PiAoeyBpZDogbS5pZCwgbGFiZWw6IG0ubGFiZWwgfSkpO1xuICBzYW1Nb2RlbElkID0gZ2V0RGVmYXVsdFNhbU1vZGVsSWQoKTtcbiAgLyoqIFNBTSBkb3dubG9hZC9zZWdtZW50IHRvYXN0IHN0YXRlIChib3VuZCBieSB0aGUgYHNhbWAgcC10b2FzdCB0ZW1wbGF0ZSkuICovXG4gIHNhbVN0YXR1cyA9ICcnO1xuICBzYW1Qcm9ncmVzcyA9IDA7IC8vIDAuLjEwMCwgZW5jb2RlciBkb3dubG9hZFxuICBzYW1Eb3dubG9hZGluZyA9IGZhbHNlO1xuICBzYW1CdXN5ID0gZmFsc2U7IC8vIGFueSBTQU0gd29yayBpbiBmbGlnaHQgKGRyaXZlcyB0aGUgaW5kZXRlcm1pbmF0ZSBzcGlubmVyKVxuICAvKiogV2hldGhlciB0aGUgc2hhcmVkIGBzYW1gIHRvYXN0IGlzIGN1cnJlbnRseSBzaG93biAoYXZvaWRzIHN0YWNraW5nIGl0IG9uXG4gICAqICBldmVyeSBwb2ludCBjbGljaywgd2hpY2ggcmUtcnVucyBpbmZlcmVuY2UpLiAqL1xuICBwcml2YXRlIHNhbVRvYXN0U2hvd24gPSBmYWxzZTtcblxuICByZWFkb25seSBzYW1Ub2FzdEtleSA9IGBzYW0tJHtWaXN1YWxpemVyQ29tcG9uZW50Lm5leHRUb2FzdElkKyt9YDtcbiAgLyoqIFN1YnNjcmlwdGlvbnMgdG8gdGhlIHBvaW50IHRvb2wncyBsaXZlIGZlZWRzIChzdGF0dXMvYnVzeS9kb3dubG9hZCkuICovXG4gIHByaXZhdGUgc2FtUG9pbnRTdWIgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIC8qKiBWZXJ0ZXggZXJhc2VyIHJhZGl1cyBpbiBpbWFnZS1waXhlbCBjb29yZGluYXRlcy4gKi9cbiAgdmVydGV4RXJhc2VyUmFkaXVzID0gMjA7XG5cbiAgY29sb3JtYXBzT3B0aW9ucyE6IGFueTtcbiAgcmV2ZXJzZXNjYWxlID0gZmFsc2U7XG4gIHNlbGVjdGVkQ29sb3JtYXAhOiBhbnk7XG4gIC8qKiBDaGFubmVscyAmIEhpc3RvZ3JhbSBkaWFsb2cgdmlzaWJpbGl0eSAob3BlbmVkIGZyb20gdGhlIHRvb2xiYXIpLiAqL1xuICBzaG93Q2hhbm5lbEhpc3RvZ3JhbSA9IGZhbHNlO1xuICAvKiogUmVnaW9uIEVkaXRvciBkaWFsb2cgdmlzaWJpbGl0eSAob3BlbmVkIGZyb20gdGhlIHRvb2xiYXIpLiAqL1xuICBzaG93UmVnaW9uRWRpdG9yID0gZmFsc2U7XG4gIC8qKiBSZWdpb24gRWRpdG9yIGRpYWxvZyB3aWR0aC4gT24gb3BlbiBpdCBpcyBzZXQgdG8gdGhlIGNvbmZpZ3VyZWQgaG9zdFxuICAgKiAgZWxlbWVudCdzIGN1cnJlbnQgd2lkdGgsIG9yIOKAlCB3aGVuIG5vIHNlbGVjdG9yIGlzIGNvbmZpZ3VyZWQgLyB0aGUgZWxlbWVudFxuICAgKiAgaXNuJ3QgZm91bmQg4oCUIHRvIGEgcXVhcnRlciBvZiB0aGUgcGFnZSAoc2VlIG9wZW5SZWdpb25FZGl0b3IpLiAqL1xuICByZWdpb25FZGl0b3JXaWR0aCA9ICcyNXZ3JztcbiAgc3RhY2tPcHRpb25zID0gW1xuICAgIHsgbmFtZTogJ1NpbmdsZSBpbWFnZScsIHZhbDogJ2ZhbHNlJyB9LFxuICAgIHsgbmFtZTogJ1N0YWNrJywgdmFsOiAndHJ1ZScgfSxcbiAgXTtcbiAgc2VsZWN0ZWRTdGFja09wdGlvbjogeyBuYW1lOiBzdHJpbmc7IHZhbDogc3RyaW5nIH0gfCB1bmRlZmluZWQgPSB0aGlzLnN0YWNrT3B0aW9uc1swXTtcbiAgcmVhZG9ubHkgcGxvdERpdk5hbWUgPSBgdml6LXBsb3QtJHtwbG90SW5zdGFuY2VTZXErK31gO1xuICBwbG90VHlwZSA9IFBsb3RUeXBlLklNQUdFO1xuICBpc0hlYXRtYXAgPSB0cnVlO1xuICBhY3RpdmVTdXJmYWNlM2RNb2RlID0gJ3R1cm50YWJsZSc7XG4gIC8qKiBXaGV0aGVyIHRoZSBuYXBhcmkgM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gaXMgc2hvd24gKHZvbHVtZS9pc29zdXJmYWNlKS4gKi9cbiAgYXhlc1Zpc2libGUgPSB0cnVlO1xuICB3aXJlZnJhbWVBY3RpdmUgPSBmYWxzZTtcbiAgLyoqIG5hcGFyaSAzRCBkZWNpbWF0ZSBmYWN0b3IgKDEgPSBGdWxsIOKApiA4ID0g4oWbOyBkZWZhdWx0IMK9KTsgY2hhbmdpbmcgaXQgcmUtcGxvdHMuICovXG4gIHJlc29sdXRpb25TY2FsZSA9IE5BUEFSSV9ERUZBVUxUX0RFQ0lNQVRFO1xuXG4gIC8qKiBQbG90IHR5cGVzIHRoZSBhY3RpdmUgYmFja2VuZCBhZHZlcnRpc2VzICgzRCBnYXRlZCBieSBjYXBhYmlsaXR5KS4gKi9cbiAgcGxvdFR5cGVPcHRpb25zOiBQbG90VHlwZURlc2NyaXB0b3JbXSA9IFtdO1xuICBzZWxlY3RlZFBsb3RUeXBlOiBQbG90VHlwZSA9IFBsb3RUeXBlLklNQUdFO1xuXG4gIC8qKiBGbG9hdGluZyBpbnRlbnNpdHktcHJvZmlsZSBpbnNldCAoTElORSBtb2RlKS4gKi9cbiAgcmVhZG9ubHkgaW50ZW5zaXR5SW5zZXREaXYgPSAnaW50ZW5zaXR5LWluc2V0LXBsb3QnO1xuICBwcm9maWxlUGFuZWxQb3MgPSB7IHg6IDIwLCB5OiA3MCB9O1xuICBwcml2YXRlIHByb2ZpbGVQYW5lbERyYWdnaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgcHJvZmlsZVBhbmVsU3RhcnQgPSB7IG14OiAwLCBteTogMCwgeDogMCwgeTogMCB9O1xuXG4gIC8qKiBUb29sYmFyIGRvY2tpbmc6IGRvY2tlZCBhY3Jvc3MgdGhlIHRvcCBieSBkZWZhdWx0OyBkcmFnZ2luZyBpdHMgaGFuZGxlXG4gICAqICBkZXRhY2hlcyBpdCBpbnRvIGEgZmxvYXRpbmcsIG1vdmFibGUgd2luZG93IChmcmVlcyB0aGUgdG9wIHJvdyBmb3IgdGhlXG4gICAqICB2aXN1YWxpemF0aW9uKS4gKi9cbiAgdG9vbGJhckZsb2F0aW5nID0gZmFsc2U7XG4gIHRvb2xiYXJQb3MgPSB7IHg6IDgsIHk6IDggfTtcbiAgcHJpdmF0ZSB0b29sYmFyRHJhZ2dpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSB0b29sYmFyU3RhcnQgPSB7IG14OiAwLCBteTogMCwgeDogMCwgeTogMCB9O1xuICBwcml2YXRlIGxhdGVzdFByb2ZpbGVzOiBJbnRlbnNpdHlQcm9maWxlW10gPSBbXTtcbiAgLyoqIERyaXZlcyB0aGUgaW50ZW5zaXR5IGluc2V0IHBhbmVsJ3MgdmlzaWJpbGl0eSDigJQgdHJ1ZSB3aGVuZXZlciBhbnlcbiAgICogIGludGVuc2l0eS1wcm9maWxlIGxpbmUgZXhpc3RzIChpbmRlcGVuZGVudCBvZiB0aGUgY3VycmVudCBwbG90IHR5cGUpLiAqL1xuICBoYXNQcm9maWxlcyA9IGZhbHNlO1xuICBwcml2YXRlIGludGVuc2l0eVByb2ZpbGVTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgdmlld3BvcnRDaGFuZ2VTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgcHJvZmlsZURyYWdNb3ZlTGlzdGVuZXI/OiAoZTogTW91c2VFdmVudCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBwcm9maWxlRHJhZ1VwTGlzdGVuZXI/OiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHByb2ZpbGVSZXNpemVMaXN0ZW5lcj86ICgpID0+IHZvaWQ7XG5cbiAgLyoqIExJTkUgcGxvdCB0eXBlIHNob3dzIHRoZSBpbWFnZSArIGRyYWdnYWJsZSBsaW5lIFJPSSArIGludGVuc2l0eSBpbnNldC4gKi9cbiAgZ2V0IGlzUHJvZmlsZU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRQbG90VHlwZSA9PT0gUGxvdFR5cGUuTElORTtcbiAgfVxuXG4gIC8qKiBUcnVlIGZvciB0aGUgSW1hZ2UgcGxvdCB0eXBlLCB3aGljaCByZW5kZXJzIGFzIGEgbmF0aXZlbHkgcGFuL3pvb20tYWJsZVxuICAgKiAgcmFzdGVyIOKAlCBzbyB0aGUgYmFja2VuZC1hZ25vc3RpYyB6b29tL3BhbiB0b29sYmFyIHRvb2xzIGFyZSBoaWRkZW4uIFRoZVxuICAgKiAgY29tcG9uZW50IGRyaXZlcyB0aGlzIG9mZiB0aGUgcGxvdCB0eXBlLCBub3QgdGhlIGFjdGl2ZSBiYWNrZW5kLiAqL1xuICBnZXQgaXNJbWFnZVZpZXcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRQbG90VHlwZSA9PT0gUGxvdFR5cGUuSU1BR0U7XG4gIH1cblxuICAvKiogSXNvc3VyZmFjZSBiYW5kIGFzIGEgMOKAkzI1NSBzbGlkZXIgcG9zaXRpb24sIG1hcHBlZCBvbnRvIHRoZSB2b2x1bWUncyByZWFsXG4gICAqICBpbnRlbnNpdHkgcmFuZ2UgYnkgdGhlIHJlbmRlcmVyLiBEZWZhdWx0cyB0byB0aGUgZnVsbCByYW5nZS4gKi9cbiAgaXNvUmFuZ2U6IG51bWJlcltdID0gWzAsIDI1NV07XG5cbiAgcGxvdFdpZHRoU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBpbWFnZUxvYWRpbmdTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIGltZ0xvYWRpbmdNZXNzYWdlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBpc1pvb21TdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIGZpbGVuYW1lU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBhdXRvc2NhbGVTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgcHJpdmF0ZSBwbG90Q29udGV4dE1lbnVMaXN0ZW5lcj86IChlOiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xuICBwcml2YXRlIGtleWRvd25MaXN0ZW5lcj86IChlOiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkO1xuICBwcml2YXRlIHdoZWVsTGlzdGVuZXI/OiAoZTogV2hlZWxFdmVudCkgPT4gdm9pZDtcblxuICAvKiogRGVib3VuY2VkIHotc2xpY2Ugc2NydWJiaW5nIChzZWUgU2xpY2VTY3J1YmJlciDigJQgcmVmYWN0b3JpbmcgcGxhbiBTdGVwIDcpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNjcnViYmVyID0gbmV3IFNsaWNlU2NydWJiZXIoKHopID0+IHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFpJbmRleCh6KTtcbiAgICAvLyBJbiBhIHBlci1zbGljZSB6LXN0YWNrIHNlc3Npb24gdGhlIHN0b3JlIHN3YXBzIHRoZSBsaXZlIHJlZ2lvbiBzZXQgdG8gdGhpc1xuICAgIC8vIHNsaWNlIChwcmVzZXJ2aW5nIGVkaXRzIG1hZGUgb24gdGhlIHByZXZpb3VzIG9uZSk7IG91dHNpZGUgc3RhY2sgbW9kZSB0aGlzXG4gICAgLy8ganVzdCByZWNvcmRzIHRoZSBzbGljZSwgbGVhdmluZyBzaW5nbGUtcGxhbmUgcmVnaW9ucyB1bnRvdWNoZWQgKGppdC11aSM5MykuXG4gICAgdGhpcy5wbG90U2VydmljZS5zZXREaXNwbGF5U2xpY2Uoeik7XG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoSU1BR0VfU1RBVEVfUE9SVCkgcHJpdmF0ZSBzdGF0ZTogSW1hZ2VTdGF0ZVBvcnQsXG4gICAgQEluamVjdChWSVNVQUxJWkVSKSBwdWJsaWMgcGxvdFNlcnZpY2U6IElWaXN1YWxpemVyLFxuICAgIHB1YmxpYyBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBzZXNzaW9uOiBWaXN1YWxpemVyU3RvcmUsXG4gICAgcHJpdmF0ZSBzYW1Ub29sOiBTYW1Ub29sU2VydmljZSxcbiAgICBwcml2YXRlIGNlbGxTZWdtZW50VG9vbDogQ2VsbFNlZ21lbnRUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHNhbVBvaW50VG9vbDogU2FtUG9pbnRUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHJlZ2lvbk9wczogUmVnaW9uT3BzU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFZJWl9DT05GSUcpIHByaXZhdGUgdml6Q29uZmlnPzogVml6Q29uZmlnLFxuICApIHtcbiAgICB0aGlzLmNvbG9ybWFwc09wdGlvbnMgPSBwbG90U2VydmljZS5nZXRDb2xvcm1hcE9wdGlvbnMoKTtcbiAgICB0aGlzLmNvbXB1dGVQbG90VHlwZU9wdGlvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbG90IHR5cGVzIG9mZmVyZWQgaW4gdGhlIHNlbGVjdG9yIGZvciB0aGUgY3VycmVudCBpbWFnZTpcbiAgICogIC0gT3V0c2lkZSAqKnRlc3QgbW9kZSoqLCBvbmx5IHRoZSBjdXJhdGVkIGRlZmF1bHQgc2V0IChkZXNjcmlwdG9ycyB3aXRoIGFcbiAgICogICAgYHByb2R1Y3Rpb25MYWJlbGApIGlzIG9mZmVyZWQsIHNob3duIHVuZGVyIHN1ZmZpeC1mcmVlIG5hbWVzIOKAlCBJbWFnZSxcbiAgICogICAgSGVhdG1hcCwgQ29udG91ciBhbmQgdGhlIG5hcGFyaSBTdXJmYWNlIC8gVm9sdW1lIC8gSXNvc3VyZmFjZS4gVGVzdCBtb2RlXG4gICAqICAgIGV4cG9zZXMgZXZlcnkgYmFja2VuZCdzIHR5cGUgdW5kZXIgaXRzIGZ1bGwgKGJhY2tlbmQtc3VmZml4ZWQpIGxhYmVsLlxuICAgKiAgLSAzRCB0eXBlcyBoaWRkZW4gd2hlbiB0aGUgYmFja2VuZCBjYW4ndCByZW5kZXIgYSAzRCBzY2VuZS5cbiAgICogIC0gc3RhY2stb25seSB0eXBlcyAodm9sdW1lLCBpc29zdXJmYWNlKSBoaWRkZW4gdW5sZXNzIHRoZSBmaWxlIGlzIGEgc3RhY2sg4oCUXG4gICAqICAgIGEgdm9sdW1lIG5lZWRzIG11bHRpcGxlIHotc2xpY2VzLlxuICAgKiAgLSBzY2FsYXItaW50ZW5zaXR5IHR5cGVzIChjb250b3VyLCBzdXJmYWNlLCBpc29zdXJmYWNlKSBoaWRkZW4gZm9yIFJHQlxuICAgKiAgICBpbWFnZXMg4oCUIHRoZXkgbWFwIGEgc2luZ2xlIGludGVuc2l0eSBwZXIgcGl4ZWwuIEltYWdlIGFuZCBIZWF0bWFwIHJlbmRlclxuICAgKiAgICBhbnkgaW1hZ2UuXG4gICAqL1xuICBwcml2YXRlIGNvbXB1dGVQbG90VHlwZU9wdGlvbnMoKSB7XG4gICAgY29uc3QgY2FwcyA9IHRoaXMucGxvdFNlcnZpY2UuY2FwYWJpbGl0aWVzO1xuICAgIGNvbnN0IGlzU3RhY2sgPSAhIXRoaXMuaW1hZ2VJbmZvPy5pc1N0YWNrO1xuICAgIGNvbnN0IGlzR3JheXNjYWxlID0gISF0aGlzLmltYWdlSW5mbz8uaXNHcmF5c2NhbGU7XG4gICAgdGhpcy5wbG90VHlwZU9wdGlvbnMgPSB0aGlzLnBsb3RTZXJ2aWNlLmdldFBsb3RUeXBlRGVzY3JpcHRvcnMoKVxuICAgICAgLmZpbHRlcigoZCkgPT4ge1xuICAgICAgICAvLyBPdXRzaWRlIHRlc3QgbW9kZSwgb25seSB0aGUgY3VyYXRlZCBzZXQgKHRob3NlIHdpdGggYSBwcm9kdWN0aW9uTGFiZWwpXG4gICAgICAgIC8vIGlzIG9mZmVyZWQ7IHRlc3QgbW9kZSBleHBvc2VzIGV2ZXJ5IGJhY2tlbmQncyB0eXBlLlxuICAgICAgICBpZiAoIXRoaXMudGVzdE1vZGUgJiYgIWQucHJvZHVjdGlvbkxhYmVsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkLmRpbWVuc2lvbnMgPT09ICczZCcgJiYgIWNhcHMuaGFzKFZpZXdlckZlYXR1cmUuU3VyZmFjZTNEKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZC5yZXF1aXJlc1N0YWNrICYmICFpc1N0YWNrKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkLnJlcXVpcmVzR3JheXNjYWxlICYmICFpc0dyYXlzY2FsZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pXG4gICAgICAvLyBEZWZhdWx0IHNlbGVjdG9yIHNob3dzIHRoZSBzdWZmaXgtZnJlZSBwcm9kdWN0aW9uTGFiZWw7IHRlc3QgbW9kZSBrZWVwc1xuICAgICAgLy8gdGhlIGZ1bGwgYmFja2VuZC1zdWZmaXhlZCBsYWJlbCBzbyBzYW1lLW5hbWVkIG1vZGVzIHN0YXkgZGlzdGluZ3Vpc2hhYmxlLlxuICAgICAgLm1hcCgoZCkgPT4gKHRoaXMudGVzdE1vZGUgPyBkIDogeyAuLi5kLCBsYWJlbDogZC5wcm9kdWN0aW9uTGFiZWwhIH0pKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBUaGUgY29uc3RydWN0b3IgY29tcHV0ZXMgdGhlIG9wdGlvbnMgd2l0aCB0ZXN0TW9kZSBzdGlsbCBhdCBpdHMgZGVmYXVsdDtcbiAgICAvLyByZWNvbXB1dGUgb25jZSB0aGUgaG9zdCBiaW5kcyBpdCAoYW5kIG9uIGFueSBsYXRlciBjaGFuZ2UpIHNvIHRoZSBzZWxlY3RvclxuICAgIC8vIHJlZmxlY3RzIHRlc3QgbW9kZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIGZvciBhbiBpbWFnZSB0byAocmUpbG9hZC5cbiAgICBpZiAoY2hhbmdlc1sndGVzdE1vZGUnXSkge1xuICAgICAgdGhpcy5jb21wdXRlUGxvdFR5cGVPcHRpb25zKCk7XG4gICAgICAvLyBJZiB0ZXN0IG1vZGUgaXMgdHVybmVkIG9mZiB3aGlsZSBhIHRlc3Qtb25seSB0eXBlIChlLmcuIE5BUEFSSV9JTUFHRSkgaXNcbiAgICAgIC8vIGFjdGl2ZSwgdGhhdCB0eXBlIGlzIG5vIGxvbmdlciBvZmZlcmVkIOKAlCBmYWxsIGJhY2sgdG8gSW1hZ2UuXG4gICAgICB0aGlzLnJlY29uY2lsZVNlbGVjdGVkUGxvdFR5cGUoKTtcbiAgICB9XG4gIH1cblxuICAvKiogSWYgdGhlIGFjdGl2ZSBwbG90IHR5cGUgaXMgbm8gbG9uZ2VyIGluIHRoZSBvZmZlcmVkIG9wdGlvbnMgKGUuZy4gdGVzdCBtb2RlXG4gICAqICB0dXJuZWQgb2ZmIHdoaWxlIGEgdGVzdC1vbmx5IHR5cGUgd2FzIGFjdGl2ZSwgb3IgYSBzY2FsYXIgdHlwZSBjYXJyaWVkIG9udG9cbiAgICogIGFuIFJHQiBpbWFnZSksIGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdCAyRCBJbWFnZSB2aWV3LiAqL1xuICBwcml2YXRlIHJlY29uY2lsZVNlbGVjdGVkUGxvdFR5cGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBsb3RUeXBlT3B0aW9ucy5zb21lKChkKSA9PiBkLnR5cGUgPT09IHRoaXMuc2VsZWN0ZWRQbG90VHlwZSkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQbG90VHlwZSA9IFBsb3RUeXBlLklNQUdFO1xuICAgICAgdGhpcy5wbG90VHlwZSA9IFBsb3RUeXBlLklNQUdFO1xuICAgICAgdGhpcy5pc0hlYXRtYXAgPSB0cnVlO1xuICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRQbG90VHlwZShQbG90VHlwZS5JTUFHRSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZS5zZXREaWFncmFtKHRoaXMpO1xuICAgIHRoaXMuc2VsZWN0ZWRDb2xvcm1hcCA9XG4gICAgICB0aGlzLmNvbG9ybWFwc09wdGlvbnNbMF0uY2hpbGRyZW4uZmluZCgoYzogYW55KSA9PiBjLmxhYmVsID09PSAnR3JleXMgSW52JykgPz9cbiAgICAgIHRoaXMuY29sb3JtYXBzT3B0aW9uc1swXS5jaGlsZHJlblswXTtcbiAgICB0aGlzLnN0YWNrT3B0aW9ucyA9IFtcbiAgICAgIHsgbmFtZTogJ1NpbmdsZSBpbWFnZScsIHZhbDogJ2ZhbHNlJyB9LFxuICAgICAgeyBuYW1lOiAnU3RhY2snLCB2YWw6ICd0cnVlJyB9LFxuICAgIF07XG4gICAgdGhpcy5zZWxlY3RlZFN0YWNrT3B0aW9uID0gdGhpcy5zdGFja09wdGlvbnNbMF07XG4gICAgdGhpcy5hdXRvc2NhbGVTdWJzY3JpcHRpb24gPSB0aGlzLnBsb3RTZXJ2aWNlLmdldEF1dG9zY2FsZUV2ZW50KCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIC8vIHJlc2V0IHRoZSBpbWFnZSBtb2RlIHRvIHNpbmdsZSBpbWFnZVxuICAgICAgdGhpcy5zZWxlY3RlZFN0YWNrT3B0aW9uID0geyBuYW1lOiAnU2luZ2xlIGltYWdlJywgdmFsOiAnZmFsc2UnIH07XG4gICAgICB0aGlzLmFjdGl2ZURyYWdNb2RlID0gbnVsbDtcbiAgICAgIHRoaXMuc2Vzc2lvbi5zZXRBY3RpdmVUb29sKG51bGwpO1xuICAgIH0pO1xuICAgIHRoaXMuaW1hZ2VMb2FkaW5nU3Vic2NyaXB0aW9uID0gdGhpcy5zdGF0ZS5pc0ltYWdlTG9hZGluZyQoKS5zdWJzY3JpYmUoKGlzSW1hZ2VMb2FkaW5nKSA9PiB7XG4gICAgICB0aGlzLmltZ0xvYWRpbmcgPSBpc0ltYWdlTG9hZGluZztcbiAgICB9KTtcbiAgICAvLyBVbmRvIGF2YWlsYWJpbGl0eSAoaml0LXVpIzg1KTogdGhlIHNoYXJlZCBSZWdpb25TdG9yZSBlbWl0cyB3aGVuZXZlciBpdHNcbiAgICAvLyBoaXN0b3J5IGRlcHRoIGNoYW5nZXM7IGdyZXlzIG91dCB0aGUgdG9vbGJhciBVbmRvIGJ1dHRvbiBhY2NvcmRpbmdseS5cbiAgICB0aGlzLnBsb3RTZXJ2aWNlXG4gICAgICAuZ2V0Q2FuVW5kbyQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWIpKVxuICAgICAgLnN1YnNjcmliZSgoY2FuVW5kbykgPT4ge1xuICAgICAgICB0aGlzLmNhblVuZG9SZWdpb24gPSBjYW5VbmRvO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlXG4gICAgICAuZ2V0Q2FuUmVkbyQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWIpKVxuICAgICAgLnN1YnNjcmliZSgoY2FuUmVkbykgPT4ge1xuICAgICAgICB0aGlzLmNhblJlZG9SZWdpb24gPSBjYW5SZWRvO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KTtcbiAgICAvLyBNaXJyb3IgdGhlIHJlZ2lvbiBzZWxlY3Rpb24gc28gdGhlIHJpZ2h0LWNsaWNrIGFjdGlvbiBncm91cCAoaml0LXVpIzg1KVxuICAgIC8vIGNhbiByZWFkIGl0IHN5bmNocm9ub3VzbHkgd2hlbiB0aGUgbWVudSBpcyBidWlsdC5cbiAgICB0aGlzLnBsb3RTZXJ2aWNlXG4gICAgICAuZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3ViKSlcbiAgICAgIC5zdWJzY3JpYmUoKGluZGljZXMpID0+IHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEluZGljZXMgPSBpbmRpY2VzIHx8IFtdO1xuICAgICAgfSk7XG4gICAgLy8gSW50ZXJhY3RpdmUgcG9pbnQtcHJvbXB0IHNlZ21lbnRhdGlvbiBydW5zIGluc2lkZSB0aGUgcmVuZGVyZXIgb24gZWFjaFxuICAgIC8vIGNsaWNrOyBzdXJmYWNlIGl0cyBsaXZlIHN0YXR1cyArIGRvd25sb2FkIHByb2dyZXNzIGluIHRoZSBzaGFyZWQgYHNhbWBcbiAgICAvLyB0b2FzdCBzbyB0aGUgdXNlciBzZWVzIGl0IHdvcmtpbmcgKHRoZSBmaXJzdCBjbGljayBwdWxscyB0aGUgZW5jb2RlcikuXG4gICAgdGhpcy5zYW1Qb2ludFN1Yi5hZGQoXG4gICAgICB0aGlzLnNhbVBvaW50VG9vbC5wcm9ncmVzcyQuc3Vic2NyaWJlKChmKSA9PiB7XG4gICAgICAgIHRoaXMuc2FtRG93bmxvYWRpbmcgPSBmID49IDAgJiYgZiA8IDE7XG4gICAgICAgIGlmIChmID49IDApIHRoaXMuc2FtUHJvZ3Jlc3MgPSBNYXRoLm1pbigxMDAsIE1hdGgucm91bmQoZiAqIDEwMCkpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KSxcbiAgICApO1xuICAgIHRoaXMuc2FtUG9pbnRTdWIuYWRkKFxuICAgICAgdGhpcy5zYW1Qb2ludFRvb2wuc3RhdHVzJC5zdWJzY3JpYmUoKG0pID0+IHtcbiAgICAgICAgdGhpcy5zYW1TdGF0dXMgPSBtO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KSxcbiAgICApO1xuICAgIHRoaXMuc2FtUG9pbnRTdWIuYWRkKFxuICAgICAgdGhpcy5zYW1Qb2ludFRvb2wuYnVzeSQuc3Vic2NyaWJlKChidXN5KSA9PiB7XG4gICAgICAgIHRoaXMuc2FtQnVzeSA9IGJ1c3k7XG4gICAgICAgIGlmIChidXN5KSB0aGlzLnNob3dTYW1Ub2FzdCgnU0FNIHBvaW50IHNlZ21lbnRhdGlvbicpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KSxcbiAgICApO1xuICAgIHRoaXMucGxvdFNlcnZpY2UuZ2V0U3RhY2tMb2FkaW5nUHJvZ3Jlc3MoKS5zdWJzY3JpYmUoKGxvYWRpbmdQcm9ncmVzcykgPT4ge1xuICAgICAgdGhpcy5sb2FkaW5nUGVyY2VudGFnZSA9IGxvYWRpbmdQcm9ncmVzcztcbiAgICB9KTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmlzU3RhY2tMb2FkaW5nKCkuc3Vic2NyaWJlKChzdGFja0xvYWRpbmcpID0+IHtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nID0gc3RhY2tMb2FkaW5nO1xuICAgIH0pO1xuICAgIHRoaXMucGxvdFdpZHRoU3Vic2NyaXB0aW9uID0gdGhpcy5zdGF0ZS5nZXRQYW5lbFdpZHRoJCgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnBsb3RTZXJ2aWNlLnJlbGF5b3V0KCk7XG4gICAgICAvLyBUaGUgaW50ZW5zaXR5IGluc2V0IGlzIGEgc2VwYXJhdGUgUGxvdGx5IGNoYXJ0IGluIGEgZmxvYXRpbmcgcGFuZWw7IHJlZmxvd1xuICAgICAgLy8gaXQgdG8gaXRzIGN1cnJlbnQgc2l6ZSB3aGVuIHRoZSBjYW52YXMgcmVzaXplcywgZWxzZSBpdCBrZWVwcyB0aGUgc3RhbGVcbiAgICAgIC8vIHNpemUgYW5kIGJsYW5rcyBvdXQuIERlZmVyIGEgdGljayBzbyB0aGUgcGFuZWwgbGF5b3V0IGhhcyBzZXR0bGVkLlxuICAgICAgaWYgKHRoaXMuaGFzUHJvZmlsZXMpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlbmRlckludGVuc2l0eUluc2V0KCksIDApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuaW1nTG9hZGluZ01lc3NhZ2VTdWJzY3JpcHRpb24gPSB0aGlzLnN0YXRlLmdldEltYWdlTG9hZGluZ01lc3NhZ2UkKCkuc3Vic2NyaWJlKChtZXNzYWdlKSA9PiB7XG4gICAgICB0aGlzLmxvYWRpbmdNZXNzYWdlID0gbWVzc2FnZTtcbiAgICB9KTtcbiAgICB0aGlzLnN0YXRlXG4gICAgICAuZ2V0Q2FjaGVQcm9ncmVzcyQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWIpKVxuICAgICAgLnN1YnNjcmliZSgocHJvZ3Jlc3MpID0+IHtcbiAgICAgICAgdGhpcy5jYWNoZVByb2dyZXNzID0gcHJvZ3Jlc3M7XG4gICAgICB9KTtcbiAgICB0aGlzLmlzWm9vbVN1YnNjcmlwdGlvbiA9IHRoaXMuc3RhdGUuaXNab29tJCgpLnN1YnNjcmliZSgoem9vbSkgPT4ge1xuICAgICAgdGhpcy56b29tID0gem9vbTtcbiAgICB9KTtcbiAgICB0aGlzLmZpbGVuYW1lU3Vic2NyaXB0aW9uID0gdGhpcy5zdGF0ZS5nZXRGaWxlbmFtZSQoKS5zdWJzY3JpYmUoKGZpbGVuYW1lKSA9PiB7XG4gICAgICBpZiAoZmlsZW5hbWUpIHtcbiAgICAgICAgdGhpcy5maWxlTmFtZSA9IGZpbGVuYW1lO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucGxvdFNlcnZpY2UuZ2V0Q29sb3JtYXAoKS5zdWJzY3JpYmUoKGNvbG9ybWFwKSA9PiB7XG4gICAgICB0aGlzLnNlbGVjdGVkQ29sb3JtYXAgPSBjb2xvcm1hcDtcbiAgICB9KTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldFJldmVyc2VTY2FsZSgpLnN1YnNjcmliZSgocmV2ZXJzZXNjYWxlKSA9PiB7XG4gICAgICB0aGlzLnJldmVyc2VzY2FsZSA9IHJldmVyc2VzY2FsZTtcbiAgICB9KTtcbiAgICB0aGlzLmludGVuc2l0eVByb2ZpbGVTdWIgPSB0aGlzLnBsb3RTZXJ2aWNlLmdldEludGVuc2l0eVByb2ZpbGUkKCkuc3Vic2NyaWJlKChwcm9maWxlcykgPT4ge1xuICAgICAgdGhpcy5sYXRlc3RQcm9maWxlcyA9IHByb2ZpbGVzO1xuICAgICAgdGhpcy5oYXNQcm9maWxlcyA9IHByb2ZpbGVzLmxlbmd0aCA+IDA7XG4gICAgICAvLyBUaGUgcGFuZWwgZGl2IGlzIGJlaGluZCAqbmdJZj1cImhhc1Byb2ZpbGVzXCIuIGRldGVjdENoYW5nZXMoKSBtYXRlcmlhbGl6ZXNcbiAgICAgIC8vIGl0IHN5bmNocm9ub3VzbHkgKHRoZSBzdWJzY3JpcHRpb24gbWF5IGZpcmUgb3V0c2lkZSBBbmd1bGFyJ3Mgem9uZSDigJQgZS5nLlxuICAgICAgLy8gZnJvbSBhbiBPU0QgZHJhZyDigJQgc28gQ0Qgd291bGRuJ3QgcnVuIG9uIGl0cyBvd24pLiBUaGVuIHJlbmRlciBvbiB0aGUgbmV4dFxuICAgICAgLy8gYW5pbWF0aW9uIGZyYW1lLCBBRlRFUiB0aGUgYnJvd3NlciBsYXlzIHRoZSBwYW5lbCBvdXQ6IGEgc3luY2hyb25vdXMgZHJhd1xuICAgICAgLy8gaGl0cyBhIHplcm8tc2l6ZSBjb250YWluZXIgb24gZmlyc3QgY3JlYXRlIGFuZCBQbG90bHkga2VlcHMgdGhhdCBzaXplLCBzb1xuICAgICAgLy8gdGhlIGluc2V0IHN0YXlzIGJsYW5rIGFuZCBsaXZlIHVwZGF0ZXMgcmVkcmF3IGludG8gdGhlIHNhbWUgemVybyBib3guXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5yZW5kZXJJbnRlbnNpdHlJbnNldCgpKTtcbiAgICB9KTtcbiAgICAvLyBXaGVuIHRoZSBPU0QgdmlldyBzZXR0bGVzIGF0IGEgbmV3IHpvb20vcGFuLCByZS1zYW1wbGUgdGhlIGludGVuc2l0eSBsaW5lc1xuICAgIC8vIGZyb20gYSBjcm9wIG9mIHRoZSB2aXNpYmxlIHJlZ2lvbiBzbyB0aGUgaW5zZXQgcmVmbGVjdHMgdGhlIHpvb20tbGV2ZWxcbiAgICAvLyByZXNvbHV0aW9uIChQbG90bHkncyBvd24gaGlnaC1kZWYgem9vbSB1cGRhdGVzIHRoZSBzYW1wbGluZyBjYWNoZSBpbmxpbmUpLlxuICAgIHRoaXMudmlld3BvcnRDaGFuZ2VTdWIgPSB0aGlzLnBsb3RTZXJ2aWNlLmdldFZpZXdwb3J0Q2hhbmdlJCgpLnN1YnNjcmliZSgocm9pKSA9PiB7XG4gICAgICBpZiAodGhpcy5oYXNQcm9maWxlcyAmJiB0aGlzLmlzSW1hZ2VWaWV3KSB7XG4gICAgICAgIHRoaXMucGxvdFNlcnZpY2UucmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKHJvaS54LCByb2kueSwgcm9pLndpZHRoLCByb2kuaGVpZ2h0LCB0aGlzLnpJbmRleCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5wcmV2aWV3U3Vic2NyaXB0aW9uID0gdGhpcy5zdGF0ZS5nZXRJbWFnZUluZm8kKCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChpbWdJbmZvKSA9PiB7XG4gICAgICAgIGlmIChpbWdJbmZvKSB7XG4gICAgICAgICAgdGhpcy5pbWFnZUluZm8gPSBpbWdJbmZvO1xuICAgICAgICAgIC8vIFN0YWNrLW9ubHkgcGxvdCB0eXBlcyAoaXNvc3VyZmFjZSwgc2NhdHRlcjNkKSBkZXBlbmQgb24gd2hldGhlciB0aGlzXG4gICAgICAgICAgLy8gZmlsZSBpcyBhIHN0YWNrIOKAlCByZWNvbXB1dGUgdGhlIHNlbGVjdG9yIG9wdGlvbnMuXG4gICAgICAgICAgdGhpcy5jb21wdXRlUGxvdFR5cGVPcHRpb25zKCk7XG4gICAgICAgICAgLy8gSWYgdGhlIGFjdGl2ZSBwbG90IHR5cGUgaXNuJ3QgdmFsaWQgZm9yIHRoaXMgaW1hZ2UgKGUuZy4gYSBzY2FsYXJcbiAgICAgICAgICAvLyB0eXBlIGxpa2UgQ29udG91ciBjYXJyaWVkIG92ZXIgdG8gYW4gUkdCIGltYWdlKSwgZmFsbCBiYWNrIHRvIEltYWdlLlxuICAgICAgICAgIHRoaXMucmVjb25jaWxlU2VsZWN0ZWRQbG90VHlwZSgpO1xuICAgICAgICAgIC8vIHJlc2V0IHN0YWNrIG9wdGlvbnMgc2VsZWN0aW9uXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFN0YWNrT3B0aW9uID0gaW1nSW5mby5zaG93U3RhY2sgPyB0aGlzLnN0YWNrT3B0aW9uc1sxXSA6IHRoaXMuc3RhY2tPcHRpb25zWzBdO1xuXG4gICAgICAgICAgdGhpcy5pc0dyYXlzY2FsZUV2ZW50LmVtaXQodGhpcy5pbWFnZUluZm8uaXNHcmF5c2NhbGUpO1xuICAgICAgICAgIHRoaXMuaXNTdGFja0V2ZW50LmVtaXQodGhpcy5pbWFnZUluZm8uaXNTdGFjayk7XG4gICAgICAgICAgLy8gUmVzZXQgdG8gdGhlIGRlZmF1bHQgMkQgSW1hZ2UgdmlldyB3aGVuIGEgZGlmZmVyZW50IGltYWdlIGlzXG4gICAgICAgICAgLy8gc2VsZWN0ZWQgd2hpbGUgYSAzRCB0eXBlIGlzIGFjdGl2ZS5cbiAgICAgICAgICBpZiAoIXRoaXMuaXNIZWF0bWFwICYmIGltZ0luZm8uZmlsZU5hbWUgIT09IHRoaXMubG9hZGVkRmlsZU5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuaXNIZWF0bWFwID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucGxvdFR5cGUgPSBQbG90VHlwZS5JTUFHRTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQbG90VHlwZSA9IFBsb3RUeXBlLklNQUdFO1xuICAgICAgICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRQbG90VHlwZSh0aGlzLnBsb3RUeXBlKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlU3VyZmFjZTNkTW9kZSA9ICd0dXJudGFibGUnO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmxvYWRlZEZpbGVOYW1lID0gaW1nSW5mby5maWxlTmFtZTtcbiAgICAgICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldEltYWdlTWV0YSh0aGlzLmltYWdlSW5mby5pbWFnZU1ldGEpO1xuICAgICAgICAgIGNvbnN0IHVybHMgPSBpbWdJbmZvLnVybHM7XG4gICAgICAgICAgaWYgKCF0aGlzLnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIC8vIGltYWdlIHNpemUg4oCUIG1lYXN1cmUgdGhlIHBsb3QgZGl2IGRpcmVjdGx5IHNvIHRoZSB0b29sYmFyIGhlaWdodCBpcyBleGNsdWRlZFxuICAgICAgICAgICAgY29uc3QgcGxvdERpdjogSFRNTEVsZW1lbnQgfCBudWxsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2TmFtZSk7XG4gICAgICAgICAgICBjb25zdCBzY3JlZW5IZWlnaHQgPSBwbG90RGl2Py5vZmZzZXRIZWlnaHQgfHwgNTAwO1xuICAgICAgICAgICAgaWYgKHVybHMpIHtcbiAgICAgICAgICAgICAgdGhpcy5wbG90U2VydmljZS5yZXNldCgpO1xuICAgICAgICAgICAgICB0aGlzLnN0YWNrTG9hZGluZyA9IGltZ0luZm8uaXNTdGFjayAmJiBpbWdJbmZvLnNob3dTdGFjaztcbiAgICAgICAgICAgICAgLy8gc2V0IG1heCBpbmRleCBvZiBzdGFjayDigJQgY29tcHV0ZWQgYmVmb3JlIHVwZGF0ZVpJbmRleCBzbyBhXG4gICAgICAgICAgICAgIC8vIGZyZXNoIHN0YWNrIChzaG9ydGVyIG9yIGxvbmdlciB0aGFuIHdoYXRldmVyIHdhcyBwcmV2aW91c2x5XG4gICAgICAgICAgICAgIC8vIGxvYWRlZCkgY2xhbXBzIGFnYWluc3QgSVRTIGJvdW5kcywgbm90IHRoZSBzdGFsZSBvbmVzLlxuICAgICAgICAgICAgICAvLyBPbmUgVVJMIHBlciBzbGljZSAoMC1pbmRleGVkKSwgc28gdGhlIGxhc3QgcmVhY2hhYmxlIGluZGV4IGlzXG4gICAgICAgICAgICAgIC8vIGxlbmd0aC0xIOKAlCBlYXJsaWVyIGBsZW5ndGgtMmAgZHJvcHBlZCB0aGUgZmluYWwgc2xpY2UuXG4gICAgICAgICAgICAgIHRoaXMubWF4SW5kZXggPSB1cmxzLmxlbmd0aCA+IDEgPyB1cmxzLmxlbmd0aCAtIDEgOiAwO1xuICAgICAgICAgICAgICAvLyBPbmUtc2hvdCBoaW50OiBqdW1wIHN0cmFpZ2h0IHRvIGEgc3BlY2lmaWMgc2xpY2UgKGUuZy4gdGhlXG4gICAgICAgICAgICAgIC8vIGZpbGUgdGhlIHVzZXIgYWN0dWFsbHkgY2xpY2tlZCB3aXRoaW4gYSBudW1iZXJlZCBzZXJpZXMpLlxuICAgICAgICAgICAgICAvLyBDb25zdW1lZCBpbW1lZGlhdGVseSBzbyByZWRlbGl2ZXJpbmcgdGhlIHNhbWUgSW1hZ2VJbmZvIGxhdGVyXG4gICAgICAgICAgICAgIC8vIChhIHBsb3QtdHlwZSBzd2l0Y2gsIHJlbG9hZEFuZFBsb3QpIGRvZXNuJ3QgcmVzZXQgdGhlIHVzZXInc1xuICAgICAgICAgICAgICAvLyBjdXJyZW50IHNjcnViIHBvc2l0aW9uIGJhY2sgdG8gaXQuXG4gICAgICAgICAgICAgIGlmIChpbWdJbmZvLmluaXRpYWxaSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuekluZGV4ID0gaW1nSW5mby5pbml0aWFsWkluZGV4O1xuICAgICAgICAgICAgICAgIGltZ0luZm8uaW5pdGlhbFpJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHppbmRleCBpcyB3aXRoaW4gYm91bmRzXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlWkluZGV4KHVybHMpO1xuICAgICAgICAgICAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAvLyBNdWx0aS10aWVyIHJlbmRlcmluZyAoc21hbGwgYmx1cnJ5IHRpZXIgZmlyc3QsIHRoZW4gc2hhcnBlbiBpblxuICAgICAgICAgICAgICAvLyBwbGFjZSkg4oCUIHNlcXVlbmNpbmcgbGl2ZXMgaW4gUmVuZGVyT3JjaGVzdHJhdG9yOyB0aGlzIGNvbXBvbmVudFxuICAgICAgICAgICAgICAvLyBzdXBwbGllcyB0aGUgcGhhc2UgcmVuZGVyIGFuZCBvd25zIHRoZSBVSSBmbGFncyB2aWEgY2FsbGJhY2tzLlxuICAgICAgICAgICAgICAvLyAzRCBwbG90IHR5cGVzIHJlbmRlciBzaW5nbGUtcGFzczogdGhlIGluLXBsYWNlIGxhcmdlIHBhc3MgZG9lc24ndFxuICAgICAgICAgICAgICAvLyByZWJ1aWxkIGEgM0QgZ2wtbWVzaCBpc29zdXJmYWNlLCBzbyB0aGUgc2hhcnBlbiBzdGVwIGJsYW5rZWQgaXQuXG4gICAgICAgICAgICAgIGNvbnN0IGhhc1NtYWxsVGllciA9XG4gICAgICAgICAgICAgICAgdGhpcy5pc0hlYXRtYXAgJiZcbiAgICAgICAgICAgICAgICAoaW1nSW5mby5zbWFsbFVybHM/Lmxlbmd0aCA/PyAwKSA9PT0gdXJscy5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAoaW1nSW5mby5zbWFsbFVybHM/Lmxlbmd0aCA/PyAwKSA+IDA7XG4gICAgICAgICAgICAgIGNvbnN0IHNtYWxsSW1nSW5mbyA9IGhhc1NtYWxsVGllciA/IHsgLi4uaW1nSW5mbywgdXJsczogaW1nSW5mby5zbWFsbFVybHMgYXMgc3RyaW5nW10gfSA6IG51bGw7XG5cbiAgICAgICAgICAgICAgLy8gRW50ZXIgcGVyLXNsaWNlIHN0YWNrIG1vZGUgd2l0aCB0aGUgZ2l2ZW4gc2xpY2XihpJyZWdpb25zIG1hcCBhbmRcbiAgICAgICAgICAgICAgLy8gc2VlZCB0aGUgXCJwcmV2aW91cyBzaGFwZXNcIiBmcm9tIHRoZSBub3ctbGl2ZSBzbGljZS4gZW50ZXJTdGFja01vZGVcbiAgICAgICAgICAgICAgLy8gbWFrZXMgekluZGV4J3Mgc2xpY2UgbGl2ZSBhbmQgcmVzZXRzIHVuZG8gKGppdC11aSM5MykuXG4gICAgICAgICAgICAgIGNvbnN0IGVudGVyU3RhY2sgPSAoXG4gICAgICAgICAgICAgICAgc2xpY2VzOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4sXG4gICAgICAgICAgICAgICAgbGF5b3V0OiAnY29tYmluZWQnIHwgJ3Blci1zbGljZS1maWxlJyxcbiAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbG90U2VydmljZS5lbnRlclN0YWNrTW9kZShzbGljZXMsIHRoaXMuekluZGV4LCBsYXlvdXQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNoYXBlcyA9IHRoaXMucGxvdFNlcnZpY2VcbiAgICAgICAgICAgICAgICAgIC5nZXRSZWdpb25zKClcbiAgICAgICAgICAgICAgICAgIC5tYXAoKHJlZ2lvbikgPT4gcmVnaW9uLmdldFNoYXBlKHRoaXMucGxvdFNlcnZpY2UuZ2V0U2hvd1NoYXBlTGFiZWwoKSkpO1xuICAgICAgICAgICAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0UHJldmlvdXNTaGFwZXMoc2hhcGVzKTtcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICBjb25zdCBhcHBseVJvaSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBGb2xkZXIgc3RhY2s6IGEgc3RhY2sgb2Ygc2VsZi1jb250YWluZWQgcGVyLXNsaWNlIGZpbGVzXG4gICAgICAgICAgICAgICAgLy8gKHRpbGVkID09PSBmYWxzZTsgc2VlIGxvYWRTZXJpZXNBc1N0YWNrKS4gRWFjaCBzbGljZS1maWxlIG1heVxuICAgICAgICAgICAgICAgIC8vIGNhcnJ5IGl0cyBvd24gc2libGluZyBcIjxzdGVtPi5nZW9qc29uXCIgKHJvaUpzb25TdHJzW3pdKSwgYnV0IGFcbiAgICAgICAgICAgICAgICAvLyBmcmVzaCBmb2xkZXIgd2l0aCBub25lIHlldCBsZWF2ZXMgcm9pSnNvblN0cnMgdW5kZWZpbmVkIOKAlCBrZXlcbiAgICAgICAgICAgICAgICAvLyBvZmYgYHRpbGVkID09PSBmYWxzZWAsIE5PVCByb2lKc29uU3Rycywgc28gYW4gdW5hbm5vdGF0ZWRcbiAgICAgICAgICAgICAgICAvLyBmb2xkZXIgc3RhY2sgc3RpbGwgZW50ZXJzIHRoZSBwZXItc2xpY2UtZmlsZSBsYXlvdXQgKGFuZCBzYXZlc1xuICAgICAgICAgICAgICAgIC8vIGJhY2sgb25lIGdlb2pzb24gcGVyIHNsaWNlLWZpbGUpIHJhdGhlciB0aGFuIGZhbGxpbmcgdGhyb3VnaCB0b1xuICAgICAgICAgICAgICAgIC8vIHRoZSBzaW5nbGUtZmlsZSBjb21iaW5lZCBwYXRoIChqaXQtdWkjOTMpLlxuICAgICAgICAgICAgICAgIGlmIChpbWdJbmZvLmlzU3RhY2sgJiYgaW1nSW5mby50aWxlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHBlclNsaWNlID0gaW1nSW5mby5yb2lKc29uU3RycztcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNsaWNlQ291bnQgPSBpbWdJbmZvLnVybHM/Lmxlbmd0aCA/PyBwZXJTbGljZT8ubGVuZ3RoID8/IDA7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzbGljZXMgPSBuZXcgTWFwPG51bWJlciwgUmVnaW9uW10+KCk7XG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCB6ID0gMDsgeiA8IHNsaWNlQ291bnQ7IHorKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gcGVyU2xpY2U/Llt6XSA/PyBudWxsO1xuICAgICAgICAgICAgICAgICAgICBzbGljZXMuc2V0KHosIGpzb24gPyB0aGlzLnBsb3RTZXJ2aWNlLmltcG9ydFJlZ2lvbnMoanNvbikgOiBbXSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBlbnRlclN0YWNrKHNsaWNlcywgJ3Blci1zbGljZS1maWxlJyk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFNpbmdsZS1maWxlIHotc3RhY2s6IG9uZSBzaWJsaW5nIGdlb2pzb24gaG9sZGluZyBldmVyeSBzbGljZSdzXG4gICAgICAgICAgICAgICAgLy8gcmVnaW9ucyBpbmRleGVkIGJ5IFF1UGF0aCdzIGdlb21ldHJ5LnBsYW5lLnouIEVudGVyIHBlci1zbGljZVxuICAgICAgICAgICAgICAgIC8vIG1vZGUgKHNhdmluZyBiYWNrIG9uZSBjb21iaW5lZCB6LWluZGV4ZWQgZ2VvanNvbikgd2hlbiB0aGVcbiAgICAgICAgICAgICAgICAvLyBnZW9qc29uIGFjdHVhbGx5IGNhcnJpZXMgc2xpY2UgaW5kaWNlcywgb3Igd2hlbiB0aGVyZSdzIG5vdGhpbmdcbiAgICAgICAgICAgICAgICAvLyB5ZXQgdG8gYXV0aG9yIGFnYWluc3QuIEEgbGVnYWN5IGdlb2pzb24gd2hvc2UgcmVnaW9ucyBhcmUgYWxsIG9uXG4gICAgICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQgcGxhbmUgc3RheXMgZ2xvYmFsIChzaG93biBvbiBldmVyeSBzbGljZSkgc29cbiAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBzaW5nbGUtcGxhbmUgYW5ub3RhdGlvbnMgYXJlbid0IGNvbmZpbmVkIHRvIHNsaWNlIDAuXG4gICAgICAgICAgICAgICAgY29uc3Qgcm9pSnNvbiA9IGltZ0luZm8ucm9pSnNvblN0cjtcbiAgICAgICAgICAgICAgICBpZiAoaW1nSW5mby5pc1N0YWNrKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZWdpb25zID0gcm9pSnNvbiA/IHRoaXMucGxvdFNlcnZpY2UuaW1wb3J0UmVnaW9ucyhyb2lKc29uKSA6IFtdO1xuICAgICAgICAgICAgICAgICAgY29uc3QgaGFzU2xpY2VJbmZvID0gcmVnaW9ucy5zb21lKChyKSA9PiAoci56ID8/IDApICE9PSAwKTtcbiAgICAgICAgICAgICAgICAgIGlmICghcm9pSnNvbiB8fCBoYXNTbGljZUluZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2xpY2VzID0gbmV3IE1hcDxudW1iZXIsIFJlZ2lvbltdPigpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHIgb2YgcmVnaW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHogPSByLnogPz8gMDtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBidWNrZXQgPSBzbGljZXMuZ2V0KHopO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChidWNrZXQpIGJ1Y2tldC5wdXNoKHIpO1xuICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugc2xpY2VzLnNldCh6LCBbcl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVudGVyU3RhY2soc2xpY2VzLCAnY29tYmluZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBTaW5nbGUtcGxhbmUgaW1hZ2UgKG9yIGEgbGVnYWN5IGdsb2JhbCB6LXN0YWNrIGdlb2pzb24pOiBvbmVcbiAgICAgICAgICAgICAgICAvLyByZWdpb24gc2V0IGZvciB0aGUgd2hvbGUgaW1hZ2UuXG4gICAgICAgICAgICAgICAgaWYgKHJvaUpzb24pIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2lvbnMgPSB0aGlzLnBsb3RTZXJ2aWNlLmltcG9ydFJlZ2lvbnMocm9pSnNvbik7XG4gICAgICAgICAgICAgICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFJlZ2lvbnMocmVnaW9ucyk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzaGFwZXMgPSByZWdpb25zLm1hcCgocmVnaW9uKSA9PlxuICAgICAgICAgICAgICAgICAgICByZWdpb24uZ2V0U2hhcGUodGhpcy5wbG90U2VydmljZS5nZXRTaG93U2hhcGVMYWJlbCgpKSxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFByZXZpb3VzU2hhcGVzKHNoYXBlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIExvYWRpbmcgYW4gaW1hZ2UncyBzYXZlZCBST0lzIGlzIG5vdCBhIHVzZXIgZWRpdCDigJQgc3RhcnQgdGhlXG4gICAgICAgICAgICAgICAgLy8gdW5kbyBoaXN0b3J5IGZyZXNoIHNvIHRoZSBmaXJzdCB1bmRvIGNhbid0IHdpcGUgdGhlbSAoaml0LXVpIzg1KS5cbiAgICAgICAgICAgICAgICB0aGlzLnBsb3RTZXJ2aWNlLnJlc2V0VW5kb0hpc3RvcnkoKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgbGV0IG92ZXJsYXlSZWxlYXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICBjb25zdCByZWxlYXNlT3ZlcmxheSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAob3ZlcmxheVJlbGVhc2VkKSByZXR1cm47XG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlbGVhc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoaW1nSW5mby5pc1N0YWNrICYmIGltZ0luZm8uc2hvd1N0YWNrKSB0aGlzLnN0YWNrTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUuc2V0SW1hZ2VMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICBuZXcgUmVuZGVyT3JjaGVzdHJhdG9yKHtcbiAgICAgICAgICAgICAgICAvLyBpblBsYWNlPXRydWUgdXBkYXRlcyB0aGUgZXhpc3RpbmcgcmVuZGVyIGluc3RlYWQgb2YgcmVidWlsZGluZ1xuICAgICAgICAgICAgICAgIC8vIGl0LCBzbyB0aGUgY2FudmFzIGRvZXNuJ3QgYmxhbmsgZHVyaW5nIHRoZSBzbWFsbOKGkmxhcmdlIHN3YXAuXG4gICAgICAgICAgICAgICAgcmVuZGVyUGhhc2U6IChwaGFzZUluZm8sIGluUGxhY2UpID0+XG4gICAgICAgICAgICAgICAgICB0aGlzLnBsb3RTZXJ2aWNlLmxvYWQocGhhc2VJbmZvLCB0aGlzLnpJbmRleCkudGhlbigobG9hZGVkSW1hZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCBhIG5ld2VyIGNsaWNrIHJlYWNoaW5nIHVzIG1pZC1yZW5kZXIuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwaGFzZUluZm8uZmlsZU5hbWUgIT09IGxvYWRlZEltYWdlLmZpbGVuYW1lKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGxvdFNlcnZpY2UucGxvdChcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsb3REaXZOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZEltYWdlLFxuICAgICAgICAgICAgICAgICAgICAgIHBoYXNlSW5mbyxcbiAgICAgICAgICAgICAgICAgICAgICBzY3JlZW5IZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbG90VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICBpblBsYWNlLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgc21hbGxTaG93bjogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGZpbGUgaXMgc3RpbGwgYmVpbmcgY2FjaGVkL3ByZXBhcmVkIHNlcnZlci1zaWRlLCBrZWVwIHRoZSBmdWxsXG4gICAgICAgICAgICAgICAgICAvLyBjYWNoZS1wcm9ncmVzcyBvdmVybGF5IHVwIGluc3RlYWQgb2YgZHJvcHBpbmcgdG8gdGhlIHRyYW5zbHVjZW50IFwiU2hhcnBlbmluZ1xuICAgICAgICAgICAgICAgICAgLy8gcHJldmlldy4uLlwiIHNwaW5uZXIgb3ZlciBhIGJsYW5rIGNhbnZhcyAoYSBsYXJnZSB1bmNhY2hlZCBpbWFnZSByZW5kZXJzIGl0c1xuICAgICAgICAgICAgICAgICAgLy8gc21hbGwgcHJldmlldyBiZWZvcmUgaXRzIHRpbGVzIGV4aXN0KS4gZmluaXNoZWQoKSByZWxlYXNlcyB0aGUgb3ZlcmxheSBvbmNlXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgcmVhbCByZW5kZXIgbGFuZHMuXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0NhY2hpbmcpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIC8vIFNtYWxsIHRpZXIgb24gc2NyZWVuIOKAlCBkcm9wIHRoZSBmdWxsIG92ZXJsYXkgYnV0IGtlZXAgYSB0cmFuc2x1Y2VudCBzcGlubmVyIHNvXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgYmx1cnJ5IHJlbmRlciBpc24ndCBtaXN0YWtlbiBmb3IgdGhlIGZpbmFsIGltYWdlLlxuICAgICAgICAgICAgICAgICAgcmVsZWFzZU92ZXJsYXkoKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2hhcnBlbmluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaGFycGVuU2V0dGxlZDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5zaGFycGVuaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBmaW5pc2hlZDogKF92aWFTbWFsbCwgbG9nVGFnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAvLyBJZGVtcG90ZW50IOKAlCByZWxlYXNlcyBub3cgaWYgc21hbGxTaG93biBkZWZlcnJlZCBpdCAoY2FjaGluZykgb3Igd2FzIHNraXBwZWQuXG4gICAgICAgICAgICAgICAgICByZWxlYXNlT3ZlcmxheSgpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICBhcHBseVJvaSgpO1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobG9nVGFnKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNoYXJwZW5GYWlsZWQ6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gVGhlIHNtYWxsIHRpZXIgc3RheXMgb24gc2NyZWVuIGFzIHRoZSBmYWxsYmFjayDigJQgdGVsbCB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIHVzZXIgdGhlIHNoYXJwZXIgdmVyc2lvbiBpc24ndCBjb21pbmcuXG4gICAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IGVycj8ubWVzc2FnZSB8fCBlcnI/LnN0YXR1c1RleHQgfHwgU3RyaW5nKGVycik7XG4gICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgICAgICAgICAgIGtleTogJ2NlbnRlci10b2FzdCcsXG4gICAgICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnd2FybicsXG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6ICdQcmV2aWV3IG5vdCBzaGFycGVuZWQnLFxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IGBUaGUgZnVsbC1yZXNvbHV0aW9uIHByZXZpZXcgZGlkIG5vdCBsb2FkICgke21zZ30pLiBUaGUgbG93LXJlc29sdXRpb24gcHJldmlldyBpcyBzdGlsbCBzaG93bi4gVHJ5IGNsaWNraW5nIHRoZSBpbWFnZSBhZ2Fpbi5gLFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIGFwcGx5Um9pKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSkucmVuZGVyKGltZ0luZm8sIHNtYWxsSW1nSW5mbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgY29uc3QgbXNnID0gZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnI/Lm1lc3NhZ2UgfHwgZXJyPy5zdGF0dXNUZXh0IHx8IFN0cmluZyhlcnIpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cmVkIHdoZW4gZ2V0dGluZyBpbWFnZSBpbmZvJywgZXJyKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgIGtleTogJ2NlbnRlci10b2FzdCcsXG4gICAgICAgICAgc3RpY2t5OiB0cnVlLFxuICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgIHN1bW1hcnk6ICdBbiBlcnJvciBvY2N1cmVkJyxcbiAgICAgICAgICBkZXRhaWw6IGBUaGUgZm9sbG93aW5nIGVycm9yIG9jY3VyZWQgd2hpbGUgZ2V0dGluZyBpbWFnZSBpbmZvOiAke21zZ30uXG4gICAgICAgICAgICAgICAgICAgUGxlYXNlIHRyeSB0byBvcGVuIHRoZSBpbWFnZSBhZ2FpbiB0aHJvdWdoIHRoZSBmaWxlIG5hdmlnYXRvci5gLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zdGFja0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcoZmFsc2UpO1xuICAgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wbG90U2VydmljZS5yZXNldCgpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnBsb3RDb250ZXh0TWVudUxpc3RlbmVyID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBwbG90RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXZOYW1lKTtcbiAgICAgIGlmICghcGxvdEVsPy5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHJldHVybjtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgIHRoaXMuY29udGV4dE1lbnVJdGVtcyA9IHRoaXMuYnVpbGRDb250ZXh0TWVudUl0ZW1zKCk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0TWVudS5zaG93KGV2ZW50KTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5wbG90Q29udGV4dE1lbnVMaXN0ZW5lciwgdHJ1ZSk7XG5cbiAgICB0aGlzLmtleWRvd25MaXN0ZW5lciA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgaWYgKHRhcmdldC50YWdOYW1lID09PSAnSU5QVVQnIHx8IHRhcmdldC50YWdOYW1lID09PSAnVEVYVEFSRUEnIHx8IHRhcmdldC5pc0NvbnRlbnRFZGl0YWJsZSkgcmV0dXJuO1xuICAgICAgLy8gU0FNIHBvaW50IG1vZGU6IEVudGVyIGNvbW1pdHMgdGhlIG9iamVjdCwgRXNjIGNsZWFycyB0aGUgcHJvbXB0LlxuICAgICAgaWYgKHRoaXMuYWN0aXZlRHJhZ01vZGUgPT09ICdzYW1Qb2ludCcgJiYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyB8fCBldmVudC5rZXkgPT09ICdFc2NhcGUnKSkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHRoaXMucGxvdFNlcnZpY2UuY29tbWl0U2FtUG9pbnRzKCk7XG4gICAgICAgICAgZWxzZSB0aGlzLnBsb3RTZXJ2aWNlLmNsZWFyU2FtUG9pbnRzKCk7XG4gICAgICAgICAgdGhpcy5oaWRlU2FtVG9hc3QoKTsgLy8gcHJvbXB0IHJlc29sdmVkIOKGkiBkaXNtaXNzIHRoZSBzdGF0dXMgdG9hc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFJlZ2lvbiBoaXN0b3J5IChqaXQtdWkjODUpOiBDdHJsL0NtZCtaIHVuZG9lczsgQ3RybC9DbWQrU2hpZnQrWiBvclxuICAgICAgLy8gQ3RybC9DbWQrWSByZWRvZXMuXG4gICAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSB7XG4gICAgICAgIGNvbnN0IGsgPSBldmVudC5rZXkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGsgPT09ICd6JyAmJiAhZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnVuZG9SZWdpb24oKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoayA9PT0gJ3onICYmIGV2ZW50LnNoaWZ0S2V5KSB8fCBrID09PSAneScpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnJlZG9SZWdpb24oKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnRGVsZXRlJyB8fCBldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnIHx8IGV2ZW50LmtleSA9PT0gJ2QnIHx8IGV2ZW50LmtleSA9PT0gJ0QnKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLmRlbGV0ZVJlZ2lvbigpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnKycgfHwgZXZlbnQua2V5ID09PSAnPScpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuem9vbUluKCkpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICctJyB8fCBldmVudC5rZXkgPT09ICdfJykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy56b29tT3V0KCkpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdwJykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgncGFuJykpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdiJykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnem9vbVRvQm94JykpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdyJykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnZHJhd3JlY3QnKSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ2YnKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdkcmF3Y2xvc2VkcGF0aCcpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAndycpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ3dhbmQnKSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ2UnKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdlcmFzZVZlcnRleCcpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAncycpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ3NlbGVjdCcpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnbCcpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ2RyYXdvcGVucGF0aCcpKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duTGlzdGVuZXIpO1xuXG4gICAgdGhpcy53aGVlbExpc3RlbmVyID0gKGV2ZW50OiBXaGVlbEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBwbG90RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXZOYW1lKTtcbiAgICAgIGlmICghcGxvdEVsPy5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHJldHVybjtcbiAgICAgIC8vIFRoZSBJbWFnZSB2aWV3IGhhbmRsZXMgc2Nyb2xsLXpvb20gbmF0aXZlbHkgKGl0IHJlc3BlY3RzIHRoZSBzY3JvbGxcbiAgICAgIC8vIGRlbHRhKS4gSW50ZXJjZXB0aW5nIGhlcmUgd291bGQgZmlyZSBhIGZpeGVkIHpvb20gc3RlcCBwZXIgd2hlZWxcbiAgICAgIC8vIGV2ZW50IOKAlCBmYXIgdG9vIHNlbnNpdGl2ZSDigJQgc28gbGV0IHRoZSByZW5kZXJlciBvd24gaXQuXG4gICAgICBpZiAodGhpcy5pc0ltYWdlVmlldykgcmV0dXJuO1xuICAgICAgLy8gM0QgcGxvdCB0eXBlcyAoc3VyZmFjZSwgc2NhdHRlcjNkLCBpc29zdXJmYWNlKSByZW5kZXIgaW4gYSBQbG90bHkgc2NlbmVcbiAgICAgIC8vIHRoYXQgb3JiaXRzL3pvb21zIG5hdGl2ZWx5IG9uIHNjcm9sbC4gVGhlIDJEIHN0ZXAtem9vbSBkb2Vzbid0IGFwcGx5IGFuZFxuICAgICAgLy8gd291bGQgdGhyb3cgKG5vIHhheGlzIG9uIGEgc2NlbmUpLCBzbyBsZXQgUGxvdGx5IGhhbmRsZSB0aGUgd2hlZWwuXG4gICAgICBpZiAoIXRoaXMuaXNIZWF0bWFwKSByZXR1cm47XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICBpZiAoZXZlbnQuZGVsdGFZIDwgMCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy56b29tSW4oKSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmRlbHRhWSA+IDApIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuem9vbU91dCgpKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIHRoaXMud2hlZWxMaXN0ZW5lciwgeyBjYXB0dXJlOiB0cnVlLCBwYXNzaXZlOiBmYWxzZSB9KTtcblxuICAgIC8vIERyYWcgaGFuZGxpbmcgZm9yIHRoZSBmbG9hdGluZyBpbnRlbnNpdHktcHJvZmlsZSBwYW5lbC5cbiAgICB0aGlzLnByb2ZpbGVEcmFnTW92ZUxpc3RlbmVyID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICh0aGlzLnByb2ZpbGVQYW5lbERyYWdnaW5nKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wcm9maWxlUGFuZWxQb3MgPSB7XG4gICAgICAgICAgICB4OiB0aGlzLnByb2ZpbGVQYW5lbFN0YXJ0LnggKyAoZS5jbGllbnRYIC0gdGhpcy5wcm9maWxlUGFuZWxTdGFydC5teCksXG4gICAgICAgICAgICB5OiB0aGlzLnByb2ZpbGVQYW5lbFN0YXJ0LnkgKyAoZS5jbGllbnRZIC0gdGhpcy5wcm9maWxlUGFuZWxTdGFydC5teSksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudG9vbGJhckRyYWdnaW5nKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy50b29sYmFyUG9zID0ge1xuICAgICAgICAgICAgeDogdGhpcy50b29sYmFyU3RhcnQueCArIChlLmNsaWVudFggLSB0aGlzLnRvb2xiYXJTdGFydC5teCksXG4gICAgICAgICAgICB5OiB0aGlzLnRvb2xiYXJTdGFydC55ICsgKGUuY2xpZW50WSAtIHRoaXMudG9vbGJhclN0YXJ0Lm15KSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMucHJvZmlsZURyYWdVcExpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5wcm9maWxlUGFuZWxEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgdGhpcy50b29sYmFyRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLnByb2ZpbGVEcmFnTW92ZUxpc3RlbmVyKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMucHJvZmlsZURyYWdVcExpc3RlbmVyKTtcblxuICAgIC8vIE9uIGFueSB3aW5kb3cgcmVzaXplLCByZWZsb3cgdGhlIGludGVuc2l0eSBpbnNldCB0byBpdHMgKGZpeGVkKSBwYW5lbCBzaXplXG4gICAgLy8gb24gdGhlIG5leHQgZnJhbWUsIG9uY2UgbGF5b3V0IGhhcyBzZXR0bGVkLiBXaXRob3V0IHRoaXMgdGhlIGluc2V0IGNhbiBiZVxuICAgIC8vIGxlZnQgYXQgYSBzdGFsZS96ZXJvIHNpemUgYnkgYSBtaWQtcmVmbG93IHJlc2l6ZSBhbmQgc3RvcCBzaG93aW5nLlxuICAgIHRoaXMucHJvZmlsZVJlc2l6ZUxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmhhc1Byb2ZpbGVzKSByZXR1cm47XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5yZW5kZXJJbnRlbnNpdHlJbnNldCgpKTtcbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnByb2ZpbGVSZXNpemVMaXN0ZW5lcik7XG4gIH1cblxuICBvblByb2ZpbGVQYW5lbERyYWdTdGFydChlOiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5wcm9maWxlUGFuZWxEcmFnZ2luZyA9IHRydWU7XG4gICAgdGhpcy5wcm9maWxlUGFuZWxTdGFydCA9IHtcbiAgICAgIG14OiBlLmNsaWVudFgsXG4gICAgICBteTogZS5jbGllbnRZLFxuICAgICAgeDogdGhpcy5wcm9maWxlUGFuZWxQb3MueCxcbiAgICAgIHk6IHRoaXMucHJvZmlsZVBhbmVsUG9zLnksXG4gICAgfTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICAvKiogR3JhYiB0aGUgdG9vbGJhciBoYW5kbGU6IGRldGFjaCBpdCBpbnRvIGEgZmxvYXRpbmcgd2luZG93IChpZiBzdGlsbCBkb2NrZWQpXG4gICAqICBhbmQgc3RhcnQgZHJhZ2dpbmcuICovXG4gIG9uVG9vbGJhckRyYWdTdGFydChlOiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLnRvb2xiYXJGbG9hdGluZykge1xuICAgICAgdGhpcy50b29sYmFyRmxvYXRpbmcgPSB0cnVlO1xuICAgICAgdGhpcy50b29sYmFyUG9zID0geyB4OiA4LCB5OiA4IH07XG4gICAgfVxuICAgIHRoaXMudG9vbGJhckRyYWdnaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnRvb2xiYXJTdGFydCA9IHtcbiAgICAgIG14OiBlLmNsaWVudFgsXG4gICAgICBteTogZS5jbGllbnRZLFxuICAgICAgeDogdGhpcy50b29sYmFyUG9zLngsXG4gICAgICB5OiB0aGlzLnRvb2xiYXJQb3MueSxcbiAgICB9O1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIC8qKiBTbmFwIHRoZSBmbG9hdGluZyB0b29sYmFyIGJhY2sgdG8gaXRzIGRvY2tlZCBwb3NpdGlvbiBhY3Jvc3MgdGhlIHRvcC4gKi9cbiAgZG9ja1Rvb2xiYXIoKSB7XG4gICAgdGhpcy50b29sYmFyRmxvYXRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBSZW5kZXIgdGhlIGludGVuc2l0eSBpbnNldCBjaGFydCBmcm9tIHRoZSBsYXRlc3QgcHJvZmlsZSBkYXRhLiBUaGUgYWN0dWFsXG4gICAqICBjaGFydGluZyBpcyBvd25lZCBieSB0aGUgdmlzdWFsaXplciBzZXJ2aWNlIOKAlCB0aGUgY29tcG9uZW50IGp1c3QgZGVjaWRlc1xuICAgKiAgd2hlbiAocHJvZmlsZSBtb2RlICsgYSBmcmVzaCBwcm9maWxlKS4gKi9cbiAgcHJpdmF0ZSByZW5kZXJJbnRlbnNpdHlJbnNldCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzUHJvZmlsZXMpIHJldHVybjtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnJlbmRlckludGVuc2l0eUluc2V0KHRoaXMuaW50ZW5zaXR5SW5zZXREaXYsIHRoaXMubGF0ZXN0UHJvZmlsZXMpO1xuICB9XG5cbiAgLyoqIFRvb2xiYXIgXCJJbnRlbnNpdHlcIiBncm91cDogYWRkIGFub3RoZXIgbGluZSBST0kgKG5leHQgYnJpZ2h0IGNvbG91cikuICovXG4gIGFzeW5jIGFkZFByb2ZpbGVMaW5lKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFBhcmsgdGhlIGZsb2F0aW5nIGluc2V0IG5lYXIgdGhlIHBsb3QncyB0b3AtcmlnaHQgd2hlbiB0aGUgZmlyc3QgbGluZSBpc1xuICAgIC8vIGFkZGVkIChpdCdzIHBvc2l0aW9uOmZpeGVkLCBzbyB1c2Ugdmlld3BvcnQgY29vcmRzIGZyb20gdGhlIHBsb3QgcmVjdCkuXG4gICAgaWYgKCF0aGlzLmhhc1Byb2ZpbGVzKSB7XG4gICAgICBjb25zdCByZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2TmFtZSk/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdGhpcy5wcm9maWxlUGFuZWxQb3MgPSByZWN0XG4gICAgICAgID8geyB4OiBNYXRoLm1heCgxMCwgcmVjdC5yaWdodCAtIDMwMCksIHk6IHJlY3QudG9wICsgMTAgfVxuICAgICAgICA6IHsgeDogMjAsIHk6IDcwIH07XG4gICAgfVxuICAgIC8vIEltYWdlIChPU0QpIG1vZGU6IFBsb3RseSBuZXZlciByZW5kZXJlZCwgc28gaXQgaGFzIG5vIHBpeGVsIGNhY2hlIC8gZXh0ZW50LlxuICAgIC8vIExvYWQgdGhlIGN1cnJlbnQgc2xpY2UncyBmcmFtZXMgZm9yIHNhbXBsaW5nICsgbGluZSBwbGFjZW1lbnQgZmlyc3QuXG4gICAgaWYgKHRoaXMuaXNJbWFnZVZpZXcgJiYgdGhpcy5pbWFnZUluZm8pIHtcbiAgICAgIGF3YWl0IHRoaXMucGxvdFNlcnZpY2UuZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcodGhpcy5pbWFnZUluZm8sIHRoaXMuekluZGV4KTtcbiAgICB9XG4gICAgY29uc3QgcmVnaW9uID0gdGhpcy5wbG90U2VydmljZS5nZXRJbnRlbnNpdHlDb250cm9scygpPy5hZGRQcm9maWxlTGluZSgpO1xuICAgIC8vIEF1dG8tc2VsZWN0IHRoZSBuZXcgbGluZSBvbiB0aGUgYWN0aXZlIGJhY2tlbmQgKFBsb3RseSBoYW5kbGVzIC8gT1NEXG4gICAgLy8gaGlnaGxpZ2h0KSBzbyBpdCdzIHJlYWR5IHRvIG1vdmUgb3IgZGVsZXRlIGltbWVkaWF0ZWx5LlxuICAgIGlmIChyZWdpb24pIHtcbiAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2VsZWN0UmVnaW9uKHJlZ2lvbik7XG4gICAgICAvLyBPU0Qgb25seSBkcmF3cyBhIHNlbGVjdGVkIHJlZ2lvbidzIGhhbmRsZXMgaW4gYW4gZWRpdCBtb2RlLCBzbyBhIGxpbmUgaW5cbiAgICAgIC8vICdub25lJyBtb2RlIGxvb2tzIHVuc2VsZWN0ZWQuIFN3aXRjaCB0byAnc2VsZWN0JyBzbyB0aGUgbmV3IGxpbmUgc2hvd3NcbiAgICAgIC8vIGl0cyBlbmRwb2ludCBoYW5kbGVzIGFuZCBjYW4gYmUgZHJhZ2dlZC9kZWxldGVkIHJpZ2h0IGF3YXkuXG4gICAgICBpZiAodGhpcy5pc0ltYWdlVmlldyAmJiB0aGlzLmFjdGl2ZURyYWdNb2RlICE9PSAnc2VsZWN0Jykge1xuICAgICAgICB0aGlzLnRvZ2dsZURyYWdNb2RlKCdzZWxlY3QnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnNjcnViYmVyLmNhbmNlbCgpO1xuICAgIHRoaXMuc2FtUG9pbnRTdWIudW5zdWJzY3JpYmUoKTtcbiAgICBpZiAodGhpcy5wbG90Q29udGV4dE1lbnVMaXN0ZW5lcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5wbG90Q29udGV4dE1lbnVMaXN0ZW5lciwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmtleWRvd25MaXN0ZW5lcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd25MaXN0ZW5lcik7XG4gICAgfVxuICAgIGlmICh0aGlzLndoZWVsTGlzdGVuZXIpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd3aGVlbCcsIHRoaXMud2hlZWxMaXN0ZW5lciwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb2ZpbGVEcmFnTW92ZUxpc3RlbmVyKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5wcm9maWxlRHJhZ01vdmVMaXN0ZW5lcik7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb2ZpbGVEcmFnVXBMaXN0ZW5lcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLnByb2ZpbGVEcmFnVXBMaXN0ZW5lcik7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb2ZpbGVSZXNpemVMaXN0ZW5lcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMucHJvZmlsZVJlc2l6ZUxpc3RlbmVyKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaW50ZW5zaXR5UHJvZmlsZVN1Yikge1xuICAgICAgdGhpcy5pbnRlbnNpdHlQcm9maWxlU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnZpZXdwb3J0Q2hhbmdlU3ViKSB7XG4gICAgICB0aGlzLnZpZXdwb3J0Q2hhbmdlU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMudW5zdWIubmV4dCgpO1xuICAgIHRoaXMudW5zdWIuY29tcGxldGUoKTtcbiAgICBpZiAodGhpcy5wcmV2aWV3U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnByZXZpZXdTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGxvdFdpZHRoU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnBsb3RXaWR0aFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbWFnZUxvYWRpbmdTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuaW1hZ2VMb2FkaW5nU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmltZ0xvYWRpbmdNZXNzYWdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmltZ0xvYWRpbmdNZXNzYWdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzWm9vbVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5pc1pvb21TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYXV0b3NjYWxlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmF1dG9zY2FsZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5maWxlbmFtZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5maWxlbmFtZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwdWJsaWMgaGFzUmVnaW9ucygpOiBib29sZWFuIHtcbiAgICAvLyBVc2UgdGhlIGNvbnRyYWN0J3MgZnJhbWV3b3JrLW5ldXRyYWwgcmVnaW9uIGFjY2Vzc29yLCBub3QgdGhlIHJhd1xuICAgIC8vIFBsb3RseS1zaGFwZWQgZ2V0U2hhcGVzKCkg4oCUIHRoZSBjb21wb25lbnQgb25seSBuZWVkcyB0byBrbm93IHdoZXRoZXIgYW55XG4gICAgLy8gcmVnaW9uIGV4aXN0cywgYW5kIG11c3Qgbm90IGRlcGVuZCBvbiBhIGJhY2tlbmQncyB3aXJlIGZvcm1hdC5cbiAgICByZXR1cm4gdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25zKCkubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaW4gbWFpbkZhY2FkZS5jb25maWdSZXF1ZXN0KCkgLSBETyBOT1QgREVMRVRFXG4gICAqL1xuICBwdWJsaWMgZ2V0UmVnaW9uUG9seWdvbnMoKTogUG9seWdvbltdIHtcbiAgICByZXR1cm4gdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25Qb2x5Z29ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCB0aGUgY29sb3Igc2NhbGUgdHlwZTogY2FsbGVkIGJ5IHRoZSBjb2xvciBzY2FsZSBzZWxlY3QgYnV0dG9uXG4gICAqIEBwYXJhbSBldmVudFxuICAgKi9cbiAgdG9nZ2xlUmV2ZXJzZVNjYWxlKCkge1xuICAgIHRoaXMucmV2ZXJzZXNjYWxlID0gIXRoaXMucmV2ZXJzZXNjYWxlO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0UmV2ZXJzZVNjYWxlKHRoaXMucmV2ZXJzZXNjYWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgYSBjb2xvciBtYXA6IGNhbGxlZCBieSB0aGUgY29sb3IgbWFwIGRyb3Bkb3duIGJ1dHRvblxuICAgKiBAcGFyYW0gY29sb3JtYXBOb2RlXG4gICAqL1xuICBzZWxlY3RDb2xvcm1hcChjb2xvcm1hcE5vZGU6IFRyZWVOb2RlKSB7XG4gICAgaWYgKCFjb2xvcm1hcE5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0Q29sb3JtYXAoY29sb3JtYXBOb2RlKTtcbiAgICB9XG4gIH1cblxuICAvKiogT3BlbiB0aGUgQ2hhbm5lbHMgJiBIaXN0b2dyYW0gZGlhbG9nICh0b29sYmFyIGJ1dHRvbikuICovXG4gIG9wZW5DaGFubmVsSGlzdG9ncmFtKCkge1xuICAgIHRoaXMuc2hvd0NoYW5uZWxIaXN0b2dyYW0gPSB0cnVlO1xuICB9XG5cbiAgLyoqIE9wZW4gdGhlIFJlZ2lvbiBFZGl0b3IgZGlhbG9nICh0b29sYmFyIGJ1dHRvbikuIFRoZSBlZGl0b3Igc3RheXMgbGlua2VkIHRvXG4gICAqICB0aGlzIHBsb3R0aW5nIGluc3RhbmNlIHRocm91Z2ggdGhlIHJvb3QgUmVnaW9uU3RvcmUgc2luZ2xldG9uLCBzbyBpdCB3b3Jrc1xuICAgKiAgdGhlIHNhbWUgYXMgdGhlIGZvcm1lciByaWdodC1wYW5lbCBSZWdpb25zIHRhYi4gKi9cbiAgb3BlblJlZ2lvbkVkaXRvcigpIHtcbiAgICAvLyBTaXplIHRoZSBkaWFsb2cgdG8gbWF0Y2ggdGhlIGhvc3QncyBjb25maWd1cmVkIGVsZW1lbnQgKGUuZy4gdGhlIGFwcCdzXG4gICAgLy8gcmlnaHQgcGFuZWwpIGF0IG9wZW4gdGltZS4gTWVhc3VyZWQgb25jZSDigJQgaXQgaW50ZW50aW9uYWxseSBkb2VzIG5vdFxuICAgIC8vIHRyYWNrIGxhdGVyIGJyb3dzZXIvc3BsaXQgcmVzaXplcy4gRmFsbHMgYmFjayB0byBhIHF1YXJ0ZXIgb2YgdGhlIHBhZ2VcbiAgICAvLyB3aGVuIG5vIHNlbGVjdG9yIGlzIGNvbmZpZ3VyZWQgb3IgdGhlIGVsZW1lbnQgaXNuJ3QgcHJlc2VudC5cbiAgICBjb25zdCBzZWxlY3RvciA9IHRoaXMudml6Q29uZmlnPy5yZWdpb25FZGl0b3JXaWR0aFNlbGVjdG9yO1xuICAgIGNvbnN0IHdpZHRoID0gc2VsZWN0b3JcbiAgICAgID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oc2VsZWN0b3IpPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aFxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5yZWdpb25FZGl0b3JXaWR0aCA9IHdpZHRoICYmIHdpZHRoID4gMCA/IGAke01hdGgucm91bmQod2lkdGgpfXB4YCA6ICcyNXZ3JztcbiAgICB0aGlzLnNob3dSZWdpb25FZGl0b3IgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBieSB0aGUgc3RhY2svc2luZ2xlIGltYWdlIGRyb3Bkb3duIGJ1dHRvblxuICAgKiBAcGFyYW0gc2hvd3N0YWNrXG4gICAqL1xuICBzZWxlY3RTdGFja09wdGlvbihzZWxlY3RlZFN0YWNrT3B0aW9uOiBhbnkpIHtcbiAgICBjb25zdCBzaG93c3RhY2sgPSBzZWxlY3RlZFN0YWNrT3B0aW9uLnZhbCA9PT0gJ3RydWUnO1xuICAgIHRoaXMuc2VsZWN0ZWRTdGFja09wdGlvbiA9IHNlbGVjdGVkU3RhY2tPcHRpb247XG4gICAgY29uc29sZS5sb2coJ3NlbGVjdGVkIHN0YWNrIG9wdGlvbicgKyBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkU3RhY2tPcHRpb24pKTtcbiAgICB0aGlzLnN0YWNrTG9hZGluZyA9IHNob3dzdGFjaztcbiAgICB0aGlzLnN0YXRlLnNldEltYWdlTG9hZGluZyghc2hvd3N0YWNrKTtcbiAgICAvLyBTdGFjayBtb2RlIGlzIGFsd2F5cyBhIDJEIGhlYXRtYXAg4oCUIHJlc2V0IHN1cmZhY2UgbW9kZSBpZiBhY3RpdmVcbiAgICBpZiAoIXRoaXMuaXNIZWF0bWFwKSB7XG4gICAgICB0aGlzLmlzSGVhdG1hcCA9IHRydWU7XG4gICAgICB0aGlzLnBsb3RUeXBlID0gUGxvdFR5cGUuSEVBVE1BUDtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQbG90VHlwZSA9IFBsb3RUeXBlLkhFQVRNQVA7XG4gICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFBsb3RUeXBlKHRoaXMucGxvdFR5cGUpO1xuICAgIH1cbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFNob3dTdGFjayhzaG93c3RhY2spO1xuICB9XG5cbiAgdXBkYXRlWkluZGV4KHVybHM/OiBzdHJpbmdbXSkge1xuICAgIGlmICh0aGlzLnpJbmRleCA+IHRoaXMubWF4SW5kZXgpIHtcbiAgICAgIHRoaXMuekluZGV4ID0gdGhpcy5tYXhJbmRleDtcbiAgICB9XG4gICAgaWYgKHRoaXMuekluZGV4IDwgMCkge1xuICAgICAgdGhpcy56SW5kZXggPSAwO1xuICAgIH1cbiAgICBpZiAodXJscykge1xuICAgICAgaWYgKHRoaXMuekluZGV4ID4gdXJscz8ubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuekluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5tYXhJbmRleCA9IHVybHMubGVuZ3RoIC0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRaSW5kZXgodGhpcy56SW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpdmUgei1zbGljZSBzY3J1YiBmb3IgdGhlIEltYWdlIHZpZXc6IHRoZSByZW5kZXJlciBzd2FwcyB0aGUgZGlzcGxheWVkXG4gICAqIHNsaWNlIGluIHBsYWNlIChubyByZS1tb3VudCksIHNvIGRyYWdnaW5nIHRoZSBzbGlkZXIgc3RlcHMgdGhyb3VnaCB0aGVcbiAgICogc3RhY2sgdGhlIHNhbWUgd2F5IHRoZSBoZWF0bWFwIGZyYW1lIHNsaWRlciBkb2VzLlxuICAgKi9cbiAgb25aU2xpZGUoejogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHogPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHRoaXMuekluZGV4ID0gejtcbiAgICB0aGlzLnNjcnViYmVyLmNvbW1pdCh6KTtcbiAgICAvLyBLZWVwIHRoZSBpbnRlbnNpdHkgaW5zZXQgaW4gc3luYyB3aXRoIHRoZSBkaXNwbGF5ZWQgc2xpY2UgKEltYWdlL09TRCBtb2RlLFxuICAgIC8vIHdoZXJlIHRoZSBwcm9maWxlIHNhbXBsZXIgaXMgZmVkIGZyb20gdGhlIGxvYWRlZCBwcmV2aWV3IGZyYW1lcykuXG4gICAgaWYgKHRoaXMuaGFzUHJvZmlsZXMgJiYgdGhpcy5pc0ltYWdlVmlldyAmJiB0aGlzLmltYWdlSW5mbykge1xuICAgICAgdGhpcy5wbG90U2VydmljZS5lbnN1cmVJbnRlbnNpdHlTYW1wbGluZyh0aGlzLmltYWdlSW5mbywgeik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpdmUgKGRlYm91bmNlZCkgc2NydWIgd2hpbGUgZHJhZ2dpbmcgdGhlIEltYWdlLXZpZXcgei1zbGlkZXI6IHVwZGF0ZSB0aGVcbiAgICogc2xpY2UgYXMgdGhlIHVzZXIgZHJhZ3MsIGJ1dCBjb2FsZXNjZSByYXBpZCBjaGFuZ2VzIHNvIHdlIGRvbid0IGZpcmUgYVxuICAgKiBzbGljZSBzd2FwIG9uIGV2ZXJ5IHBpeGVsLiBUaGUgZmluYWwgdmFsdWUgYWxzbyBsYW5kcyB2aWEgb25aU2xpZGUgKG9uU2xpZGVFbmQpLlxuICAgKi9cbiAgb25aU2NydWIoejogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHogPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHRoaXMuekluZGV4ID0gejtcbiAgICB0aGlzLnNjcnViYmVyLnNjcnViKHopO1xuICB9XG5cbiAgLyoqXG4gICAqIEtleWJvYXJkIHN0YWNrIG5hdmlnYXRpb246IOKGkC/ihpIgc3RlcCB0aGUgei1zbGljZSBpbiB0aGUgSW1hZ2UgdmlldywgdGhlIHNhbWVcbiAgICogd2F5IHRoZSBzbGlkZXIgZG9lcy4gT25seSBhY3RpdmUgZm9yIGEgbG9hZGVkIHN0YWNrIGluIEltYWdlIHZpZXcsIGFuZFxuICAgKiBpZ25vcmVkIHdoaWxlIGEgZm9ybSBmaWVsZCBpcyBmb2N1c2VkIHNvIHR5cGluZyBpc24ndCBoaWphY2tlZC4gVXAvRG93biBhcmVcbiAgICogbGVmdCB0byBPcGVuU2VhZHJhZ29uIChwYW5uaW5nKS5cbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duJywgWyckZXZlbnQnXSlcbiAgb25LZXlkb3duKGU6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZS5rZXkgIT09ICdBcnJvd0xlZnQnICYmIGUua2V5ICE9PSAnQXJyb3dSaWdodCcpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuaW1hZ2VJbmZvPy5pc1N0YWNrIHx8ICF0aGlzLmlzSW1hZ2VWaWV3KSByZXR1cm47XG4gICAgY29uc3QgdCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAodCAmJiAoL14oSU5QVVR8VEVYVEFSRUF8U0VMRUNUKSQvLnRlc3QodC50YWdOYW1lKSB8fCB0LmlzQ29udGVudEVkaXRhYmxlKSkgcmV0dXJuO1xuICAgIC8vIFRoZSBzbGljZSBzbGlkZXIgaGFuZGxlcyBhcnJvd3MgbmF0aXZlbHkgd2hlbiBmb2N1c2VkIChhbHNvIGEgKzEgc3RlcCkg4oCUXG4gICAgLy8gc2tpcCBoZXJlIHNvIHdlIGRvbid0IGRvdWJsZS1zdGVwIGl0LlxuICAgIGlmICh0ICYmICh0LmdldEF0dHJpYnV0ZSgncm9sZScpID09PSAnc2xpZGVyJyB8fCB0LmNsb3Nlc3QoJy5wLXNsaWRlcicpKSkgcmV0dXJuO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnN0ZXBTbGljZShlLmtleSA9PT0gJ0Fycm93UmlnaHQnID8gMSA6IC0xKTtcbiAgfVxuXG4gIC8qKiBNb3ZlIHRoZSBkaXNwbGF5ZWQgc2xpY2UgYnkgYGRlbHRhYCwgY2xhbXBlZCB0byB0aGUgc3RhY2sgYm91bmRzLiAqL1xuICBzdGVwU2xpY2UoZGVsdGE6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSBNYXRoLm1pbih0aGlzLm1heEluZGV4LCBNYXRoLm1heCgwLCB0aGlzLnpJbmRleCArIGRlbHRhKSk7XG4gICAgaWYgKG5leHQgPT09IHRoaXMuekluZGV4KSByZXR1cm47XG4gICAgdGhpcy5vblpTbGlkZShuZXh0KTtcbiAgfVxuXG4gIHJlbG9hZEFuZFBsb3QoKSB7XG4gICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcodHJ1ZSk7XG4gICAgLy8gUmUtZHJpdmUgdGhlIHJlbmRlciBwaXBlbGluZSBmcm9tIHRoZSBjdXJyZW50IGltYWdlIGluZm8gKHRoZSBzb3VyY2Ugb2ZcbiAgICAvLyB0cnV0aCwgd2l0aCByZWFsIHVybHMvZmlsZU5hbWUpLiBEb24ndCB1c2UgcGxvdFNlcnZpY2UucmVsb2FkQW5kUGxvdCgpOlxuICAgIC8vIHRoYXQgcmVidWlsZHMgdGhlIGluZm8gZnJvbSB0aGUgcmVuZGVyZXIncyBpbnRlcm5hbCBzdGF0ZSwgd2hpY2ggY2FuIGJlXG4gICAgLy8gc3RhbGUgKGUuZy4gYWZ0ZXIgc3dpdGNoaW5nIHBsb3QgdHlwZSBJbWFnZSAtPiBIZWF0bWFwKSBhbmQgcmUtZW1pdFxuICAgIC8vIGVtcHR5L29sZCB1cmxzLCBmYWlsaW5nIHRvIGhhbmQgdGhlIGRpdiBvdmVyIHRvIHRoZSBuZXcgcmVuZGVyZXIuXG4gICAgaWYgKHRoaXMuaW1hZ2VJbmZvKSB7XG4gICAgICB0aGlzLnN0YXRlLnNldEltYWdlSW5mbyh0aGlzLmltYWdlSW5mbyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGxvdFNlcnZpY2UucmVsb2FkQW5kUGxvdCgpO1xuICAgIH1cbiAgfVxuICBjYW5jZWxMb2FkaW5nKCkge1xuICAgIC8vIFN0b3AgYW55IGluLWZsaWdodCBmcmFtZSBzdHJlYW1pbmcgKG5hcGFyaS1qcyB2b2x1bWUvc3VyZmFjZSBwcmVsb2FkKSBzbyB0aGUgZmV0Y2ggbG9vcHNcbiAgICAvLyBhY3R1YWxseSBhYm9ydCDigJQgY2xlYXJpbmcgdGhlIGZsYWcgYWxvbmUgb25seSByb3V0ZWQgdG8gUGxvdGx5IGFuZCBsZWZ0IG5hcGFyaSBmZXRjaGluZy5cbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmNhbmNlbExvYWRpbmc/LigpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5pbWdMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcoZmFsc2UpO1xuICAgIHRoaXMuekluZGV4ID0gMDtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFpJbmRleCh0aGlzLnpJbmRleCk7XG4gICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRTdGFja0xvYWRpbmcoZmFsc2UpO1xuICB9XG5cbiAgZG93bmxvYWRJbWFnZSgpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmRvd25sb2FkSW1hZ2UoKTtcbiAgfVxuXG4gIGF1dG9zY2FsZUltYWdlKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2UuYXV0b3NjYWxlKCk7XG4gIH1cblxuICAvKiogVG9vbGJhciBwaXhlbC9zbW9vdGggdG9nZ2xlOiBmbGlwIHNtb290aGluZyBhbmQgYXBwbHkgdG8gdGhlIGFjdGl2ZSBiYWNrZW5kLiAqL1xuICBvblRvZ2dsZUltYWdlU21vb3RoaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gIXRoaXMuaW1hZ2VTbW9vdGhpbmdFbmFibGVkO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKHRoaXMuaW1hZ2VTbW9vdGhpbmdFbmFibGVkKTtcbiAgfVxuXG4gIHJlc2V0QXhlcygpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnJlc2V0QXhlcygpO1xuICB9XG5cbiAgdG9nZ2xlRHJhZ01vZGUobW9kZTogc3RyaW5nKSB7XG4gICAgLy8gVG9nZ2xlIG9mZiBpZiB0aGUgc2FtZSBtb2RlIGlzIHJlLXNlbGVjdGVkLlxuICAgIHRoaXMuYWN0aXZlRHJhZ01vZGUgPSB0aGlzLmFjdGl2ZURyYWdNb2RlID09PSBtb2RlID8gbnVsbCA6IG1vZGU7XG4gICAgY29uc3QgYWN0aXZlID0gdGhpcy5hY3RpdmVEcmFnTW9kZTtcbiAgICAvLyBSZWNvcmQgdGhlIGFybWVkIHRvb2wgaW4gdGhlIHNoYXJlZCBzZXNzaW9uIHN0b3JlLlxuICAgIHRoaXMuc2Vzc2lvbi5zZXRBY3RpdmVUb29sKGFjdGl2ZSk7XG5cbiAgICAvLyBSZWdpb24gZHJhdy9zZWxlY3QgcnVuIHRocm91Z2ggdGhlIHJlbmRlcmVyJ3MgcmVnaW9uIG92ZXJsYXkuXG4gICAgdGhpcy5wbG90U2VydmljZVxuICAgICAgLmdldFJlZ2lvbk92ZXJsYXkoKVxuICAgICAgPy5zZXRNb2RlKHRoaXMuaXNSZWdpb25Nb2RlKGFjdGl2ZSkgPyAoYWN0aXZlIGFzIFJlZ2lvblRvb2xNb2RlKSA6ICdub25lJyk7XG5cbiAgICAvLyBWaWV3cG9ydCBkcmFnIG1vZGVzIChwYW4vYm94LXpvb20pLiBSZWdpb24gbW9kZXMgb3duIHRoZSBkcmFnIG1vZGUgdmlhXG4gICAgLy8gdGhlIG92ZXJsYXksIHNvIGRvbid0IGFsc28gc2V0IG9uZSBoZXJlLlxuICAgIGlmICghdGhpcy5pc1JlZ2lvbk1vZGUoYWN0aXZlKSkge1xuICAgICAgY29uc3Qgdmlld3BvcnREcmFnID0gYWN0aXZlID09PSAncGFuJyB8fCBhY3RpdmUgPT09ICd6b29tJztcbiAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0RHJhZ01vZGUodmlld3BvcnREcmFnID8gYWN0aXZlIDogZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIE9uLWNhbnZhcyB0b29sIG92ZXJsYXlzLlxuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0Wm9vbVRvQm94TW9kZShhY3RpdmUgPT09ICd6b29tVG9Cb3gnKTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFdhbmRNb2RlKGFjdGl2ZSA9PT0gJ3dhbmQnLCB7IHNlbnNpdGl2aXR5OiB0aGlzLndhbmRTZW5zaXRpdml0eSB9KTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldEJydXNoTW9kZShhY3RpdmUgPT09ICdicnVzaCcsIHsgc2l6ZTogdGhpcy5icnVzaFNpemUgfSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRTYW1Qb2ludE1vZGUoYWN0aXZlID09PSAnc2FtUG9pbnQnKTtcbiAgICAvLyBMZWF2aW5nIHBvaW50IG1vZGUgZGlzbWlzc2VzIGFueSBsaW5nZXJpbmcgc3RhdHVzIHRvYXN0LlxuICAgIGlmIChhY3RpdmUgIT09ICdzYW1Qb2ludCcpIHRoaXMuaGlkZVNhbVRvYXN0KCk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRWZXJ0ZXhFcmFzZXJNb2RlKGFjdGl2ZSA9PT0gJ2VyYXNlVmVydGV4Jyk7XG4gICAgaWYgKGFjdGl2ZSA9PT0gJ2VyYXNlVmVydGV4Jykge1xuICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRWZXJ0ZXhFcmFzZXJSYWRpdXModGhpcy52ZXJ0ZXhFcmFzZXJSYWRpdXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZWdpb24gZHJhdy9zZWxlY3QvZWRpdCBtb2RlcyByb3V0ZWQgdGhyb3VnaCB0aGUgcmVnaW9uIG92ZXJsYXkuIFRoZVxuICAgKiAgVGhlIHZlcnRleCB0b29scyAoZHJhd3BvbHlnb24vYWRkcG9pbnQvZGVsZXRlcG9pbnQvbW92ZSkgYXJlXG4gICAqICBoYW5kbGVkIGJ5IHRoZSBPcGVuU2VhZHJhZ29uIG92ZXJsYXk7IFBsb3RseSdzIG92ZXJsYXkgbWFwcyB0aGVtIHRvIG5vLW9wLiAqL1xuICBwcml2YXRlIGlzUmVnaW9uTW9kZShtb2RlOiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIG1vZGUgPT09ICdkcmF3cmVjdCcgfHxcbiAgICAgIG1vZGUgPT09ICdkcmF3Y2xvc2VkcGF0aCcgfHxcbiAgICAgIG1vZGUgPT09ICdkcmF3b3BlbnBhdGgnIHx8XG4gICAgICBtb2RlID09PSAnc2VsZWN0JyB8fFxuICAgICAgbW9kZSA9PT0gJ2RyYXdwb2x5Z29uJyB8fFxuICAgICAgbW9kZSA9PT0gJ2FkZHBvaW50JyB8fFxuICAgICAgbW9kZSA9PT0gJ2RlbGV0ZXBvaW50JyB8fFxuICAgICAgbW9kZSA9PT0gJ21vdmUnXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBMaXZlLXVwZGF0ZSB0aGUgaXNvc3VyZmFjZSBhcyB0aGUgcmFuZ2Ugc2xpZGVyIG1vdmVzLiBUaGUgY29udHJvbCBpcyBvbmx5XG4gICAqICBhdmFpbGFibGUgd2hlbiB0aGUgYWN0aXZlIGJhY2tlbmQgcmVuZGVycyBpc29zdXJmYWNlcyAoSVNPU1VSRkFDRSBtb2RlKS4gKi9cbiAgb25Jc29SYW5nZUNoYW5nZSh2YWx1ZXM6IG51bWJlcltdIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCF2YWx1ZXMgfHwgdmFsdWVzLmxlbmd0aCA8IDIpIHJldHVybjtcbiAgICB0aGlzLmlzb1JhbmdlID0gdmFsdWVzO1xuICAgIHRoaXMucGxvdFNlcnZpY2UuZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk/LnNldElzb1JhbmdlKHZhbHVlc1swXSwgdmFsdWVzWzFdKTtcbiAgfVxuXG4gIG9uV2FuZFNlbnNpdGl2aXR5Q2hhbmdlKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCAhTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkgcmV0dXJuO1xuICAgIHRoaXMud2FuZFNlbnNpdGl2aXR5ID0gdmFsdWU7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRXYW5kT3B0aW9ucyh7IHNlbnNpdGl2aXR5OiB2YWx1ZSB9KTtcbiAgfVxuXG4gIG9uQnJ1c2hTaXplQ2hhbmdlKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCAhTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkgcmV0dXJuO1xuICAgIHRoaXMuYnJ1c2hTaXplID0gdmFsdWU7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRCcnVzaE9wdGlvbnMoeyBzaXplOiB2YWx1ZSB9KTtcbiAgfVxuXG4gIG9uVmVydGV4RXJhc2VyUmFkaXVzQ2hhbmdlKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCAhTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkgcmV0dXJuO1xuICAgIHRoaXMudmVydGV4RXJhc2VyUmFkaXVzID0gdmFsdWU7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRWZXJ0ZXhFcmFzZXJSYWRpdXModmFsdWUpO1xuICB9XG5cbiAgem9vbUluKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuem9vbUluKCk7XG4gIH1cblxuICB6b29tT3V0KCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuem9vbU91dCgpO1xuICB9XG5cbiAgZGVsZXRlUmVnaW9uKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2UuZGVsZXRlQWN0aXZlU2hhcGUoKTtcbiAgfVxuXG4gIC8qKiBVbmRvIHRoZSBtb3N0IHJlY2VudCByZWdpb24gYWN0aW9uIChqaXQtdWkjODUpLiBVcCB0byAxMCBzdGVwcyBiYWNrLiAqL1xuICB1bmRvUmVnaW9uKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2UudW5kbygpO1xuICB9XG5cbiAgLyoqIFJlZG8gdGhlIG1vc3QgcmVjZW50bHkgdW5kb25lIHJlZ2lvbiBhY3Rpb24gKGppdC11aSM4NSkuICovXG4gIHJlZG9SZWdpb24oKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS5yZWRvKCk7XG4gIH1cblxuICAvLyDilIDilIAgUmVnaW9uIHNldC1vcGVyYXRpb25zIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbiAoaml0LXVpIzg1KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogVGhlIGN1cnJlbnRseS1zZWxlY3RlZCByZWdpb25zIChsaXZlIHN0b3JlIGluc3RhbmNlcykuICovXG4gIHByaXZhdGUgZ2V0IHNlbGVjdGVkUmVnaW9ucygpOiBSZWdpb25bXSB7XG4gICAgY29uc3QgYWxsID0gdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25zKCk7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJbmRpY2VzXG4gICAgICAubWFwKChpKSA9PiBhbGxbaV0pXG4gICAgICAuZmlsdGVyKChyKTogciBpcyBSZWdpb24gPT4gISFyKTtcbiAgfVxuXG4gIC8qKiBSZWdpb25zIGVsaWdpYmxlIGZvciBzZXQtb3BzOiBjbG9zZWQgYXJlYXMgKHJlY3QgLyBjbG9zZWQgcG9seWdvbiAvXG4gICAqICBtdWx0aS1wb2x5Z29uKSwgZXhjbHVkaW5nIGludGVuc2l0eS1wcm9maWxlIGxpbmVzLiAqL1xuICBwcml2YXRlIG9wRWxpZ2libGUocmVnaW9uczogUmVnaW9uW10pOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHJlZ2lvbnMuZmlsdGVyKChyKSA9PiByLmtpbmQgIT09ICdwcm9maWxlJyAmJiAoXG4gICAgICByLmJvdW5kcyBpbnN0YW5jZW9mIFJlY3RhbmdsZSB8fFxuICAgICAgci5ib3VuZHMgaW5zdGFuY2VvZiBNdWx0aVBvbHlnb24gfHxcbiAgICAgIChyLmJvdW5kcyBpbnN0YW5jZW9mIFBvbHlnb24gJiYgci5ib3VuZHMuY2xvc2VkICE9PSBmYWxzZSlcbiAgICApKTtcbiAgfVxuXG4gIC8qKiBJbWFnZSBwaXhlbCBkaW1lbnNpb25zIGZvciB0aGUgcmFzdGVyIG9wczsgZmFsbHMgYmFjayB0byB0aGUgc2VsZWN0aW9uJ3NcbiAgICogIGV4dGVudCB3aGVuIHRoZSBpbWFnZSBzaXplIGlzbid0IGtub3duIChrZWVwcyBjbGFtcGluZyBzYW5lKS4gKi9cbiAgcHJpdmF0ZSBvcEltYWdlRGltcyhyZWdpb25zOiBSZWdpb25bXSk6IHsgdzogbnVtYmVyOyBoOiBudW1iZXIgfSB7XG4gICAgbGV0IFt3LCBoXSA9IHRoaXMuaW1hZ2VJbmZvPy50cnVlSW1hZ2VTaXplID8/IFswLCAwXTtcbiAgICBpZiAoISh3ID4gMCkgfHwgIShoID4gMCkpIHtcbiAgICAgIGxldCBtYXhYID0gMCwgbWF4WSA9IDA7XG4gICAgICBjb25zdCBzY2FuID0gKHhzOiBudW1iZXJbXSwgeXM6IG51bWJlcltdKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgeCBvZiB4cykgbWF4WCA9IE1hdGgubWF4KG1heFgsIHgpO1xuICAgICAgICBmb3IgKGNvbnN0IHkgb2YgeXMpIG1heFkgPSBNYXRoLm1heChtYXhZLCB5KTtcbiAgICAgIH07XG4gICAgICBmb3IgKGNvbnN0IHIgb2YgcmVnaW9ucykge1xuICAgICAgICBjb25zdCBiID0gci5ib3VuZHM7XG4gICAgICAgIGlmIChiIGluc3RhbmNlb2YgUmVjdGFuZ2xlKSBzY2FuKFtiLnggKyBiLndpZHRoXSwgW2IueSArIGIuaGVpZ2h0XSk7XG4gICAgICAgIGVsc2UgaWYgKGIgaW5zdGFuY2VvZiBQb2x5Z29uKSBzY2FuKGIueHBvaW50cywgYi55cG9pbnRzKTtcbiAgICAgICAgZWxzZSBpZiAoYiBpbnN0YW5jZW9mIE11bHRpUG9seWdvbikgZm9yIChjb25zdCBwIG9mIGIucG9seWdvbnMpIHNjYW4ocC54cG9pbnRzLCBwLnlwb2ludHMpO1xuICAgICAgfVxuICAgICAgdyA9IE1hdGgubWF4KHcsIE1hdGguY2VpbChtYXhYKSArIDIpO1xuICAgICAgaCA9IE1hdGgubWF4KGgsIE1hdGguY2VpbChtYXhZKSArIDIpO1xuICAgIH1cbiAgICByZXR1cm4geyB3LCBoIH07XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIOKJpTIgZWxpZ2libGUgcmVnaW9ucyBhcmUgc2VsZWN0ZWQgKE1lcmdlIGF2YWlsYWJsZSkuICovXG4gIGdldCBjYW5NZXJnZVJlZ2lvbnMoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm9wRWxpZ2libGUodGhpcy5zZWxlY3RlZFJlZ2lvbnMpLmxlbmd0aCA+PSAyOyB9XG4gIC8qKiBUcnVlIHdoZW4gYW55IHNlbGVjdGVkIHJlZ2lvbiBpcyBtdWx0aS1wYXJ0IChVbmdyb3VwIGF2YWlsYWJsZSkuICovXG4gIGdldCBjYW5Vbmdyb3VwUmVnaW9ucygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuc2VsZWN0ZWRSZWdpb25zLnNvbWUoKHIpID0+IHRoaXMucmVnaW9uT3BzLmNhblVuZ3JvdXAocikpOyB9XG4gIC8qKiBUcnVlIHdoZW4g4omlMSBlbGlnaWJsZSByZWdpb24gaXMgc2VsZWN0ZWQgKEludmVyc2UgLyBTaW1wbGlmeSBhdmFpbGFibGUpLiAqL1xuICBnZXQgaGFzRWxpZ2libGVTZWxlY3Rpb24oKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm9wRWxpZ2libGUodGhpcy5zZWxlY3RlZFJlZ2lvbnMpLmxlbmd0aCA+PSAxOyB9XG5cbiAgLyoqIFNlbGVjdCBldmVyeSByZWdpb24gb24gdGhlIGltYWdlIChleGNsdWRlcyBpbnRlbnNpdHktcHJvZmlsZSBsaW5lcykuICovXG4gIHNlbGVjdEFsbFJlZ2lvbnMoKTogdm9pZCB7XG4gICAgY29uc3QgYWxsID0gdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25zKCk7XG4gICAgY29uc3QgaW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgICBhbGwuZm9yRWFjaCgociwgaSkgPT4geyBpZiAoci5raW5kICE9PSAncHJvZmlsZScpIGluZGljZXMucHVzaChpKTsgfSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhpbmRpY2VzKTtcbiAgfVxuXG4gIC8qKiBNZXJnZSB0aGUgc2VsZWN0ZWQgcmVnaW9ucyBpbnRvIGEgc2luZ2xlIChwb3NzaWJseSBtdWx0aS1wYXJ0KSByZWdpb24uICovXG4gIG1lcmdlUmVnaW9ucygpOiB2b2lkIHtcbiAgICBjb25zdCBzZWwgPSB0aGlzLm9wRWxpZ2libGUodGhpcy5zZWxlY3RlZFJlZ2lvbnMpO1xuICAgIGlmIChzZWwubGVuZ3RoIDwgMikgcmV0dXJuO1xuICAgIGNvbnN0IHsgdywgaCB9ID0gdGhpcy5vcEltYWdlRGltcyhzZWwpO1xuICAgIGNvbnN0IG1lcmdlZCA9IHRoaXMucmVnaW9uT3BzLm1lcmdlKHNlbCwgdywgaCk7XG4gICAgaWYgKG1lcmdlZCkgdGhpcy5yZXBsYWNlUmVnaW9ucyhzZWwsIFttZXJnZWRdKTtcbiAgfVxuXG4gIC8qKiBTcGxpdCBlYWNoIHNlbGVjdGVkIG11bHRpLXBhcnQgcmVnaW9uIGludG8gb25lIHJlZ2lvbiBwZXIgcGFydC4gKi9cbiAgdW5ncm91cFJlZ2lvbnMoKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsID0gdGhpcy5zZWxlY3RlZFJlZ2lvbnMuZmlsdGVyKChyKSA9PiB0aGlzLnJlZ2lvbk9wcy5jYW5Vbmdyb3VwKHIpKTtcbiAgICBpZiAoc2VsLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IHJlc3VsdHM6IFJlZ2lvbltdID0gW107XG4gICAgZm9yIChjb25zdCByIG9mIHNlbCkgcmVzdWx0cy5wdXNoKC4uLnRoaXMucmVnaW9uT3BzLnVuZ3JvdXAocikpO1xuICAgIHRoaXMucmVwbGFjZVJlZ2lvbnMoc2VsLCByZXN1bHRzKTtcbiAgfVxuXG4gIC8qKiBSZXBsYWNlIHRoZSBzZWxlY3Rpb24gd2l0aCBpdHMgaW52ZXJzZSBpbnNpZGUgdGhlIGltYWdlIHJlY3RhbmdsZS4gKi9cbiAgaW52ZXJzZVJlZ2lvbnMoKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsID0gdGhpcy5vcEVsaWdpYmxlKHRoaXMuc2VsZWN0ZWRSZWdpb25zKTtcbiAgICBpZiAoc2VsLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IHsgdywgaCB9ID0gdGhpcy5vcEltYWdlRGltcyhzZWwpO1xuICAgIGNvbnN0IGludiA9IHRoaXMucmVnaW9uT3BzLmludmVyc2Uoc2VsLCB3LCBoKTtcbiAgICBpZiAoIWludikge1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICBzZXZlcml0eTogJ3dhcm4nLCBzdW1tYXJ5OiAnSW52ZXJzZScsXG4gICAgICAgIGRldGFpbDogJ05vdGhpbmcgdG8gaW52ZXJ0IOKAlCBzZWxlY3Qgb25lIG9yIG1vcmUgY2xvc2VkIHJlZ2lvbnMgZmlyc3QuJyxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlcGxhY2VSZWdpb25zKHNlbCwgW2ludl0pO1xuICB9XG5cbiAgLyoqIERvdWdsYXPigJNQZXVja2VyIHNpbXBsaWZ5IGVhY2ggc2VsZWN0ZWQgcmVnaW9uIGJ5IGB0aHJlc2hvbGRQeGAuICovXG4gIHNpbXBsaWZ5UmVnaW9ucyh0aHJlc2hvbGRQeDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsID0gdGhpcy5vcEVsaWdpYmxlKHRoaXMuc2VsZWN0ZWRSZWdpb25zKTtcbiAgICBpZiAoc2VsLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMucmVwbGFjZVJlZ2lvbnMoc2VsLCBzZWwubWFwKChyKSA9PiB0aGlzLnJlZ2lvbk9wcy5zaW1wbGlmeShyLCB0aHJlc2hvbGRQeCkpKTtcbiAgICB0aGlzLmRpc3BsYXlTaW1wbGlmeURpYWxvZyA9IGZhbHNlO1xuICB9XG5cbiAgLyoqIE9wZW4gdGhlIGN1c3RvbS10aHJlc2hvbGQgc2ltcGxpZnkgZGlhbG9nLiAqL1xuICBvcGVuU2ltcGxpZnlEaWFsb2coKTogdm9pZCB7IHRoaXMuZGlzcGxheVNpbXBsaWZ5RGlhbG9nID0gdHJ1ZTsgfVxuXG4gIC8qKlxuICAgKiBDb21taXQgYSBzZXQtb3A6IGRyb3AgdGhlIGByZW1vdmVgIHJlZ2lvbnMsIGFwcGVuZCBgYWRkYCwgYW5kIHNlbGVjdCB0aGVcbiAgICogcmVzdWx0cy4gR29lcyB0aHJvdWdoIHNldFJlZ2lvbnMgc28gaXQncyB1bmRvLXRyYWNrZWQgYW5kIHJlLXJlbmRlcmVkO1xuICAgKiBwcm9maWxlIGxpbmVzIGFuZCB1bnNlbGVjdGVkIHJlZ2lvbnMgYXJlIHByZXNlcnZlZC5cbiAgICovXG4gIHByaXZhdGUgcmVwbGFjZVJlZ2lvbnMocmVtb3ZlOiBSZWdpb25bXSwgYWRkOiBSZWdpb25bXSk6IHZvaWQge1xuICAgIGlmIChhZGQubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgcmVtb3ZlU2V0ID0gbmV3IFNldChyZW1vdmUpO1xuICAgIGNvbnN0IGtlcHQgPSB0aGlzLnBsb3RTZXJ2aWNlLmdldFJlZ2lvbnMoKS5maWx0ZXIoKHIpID0+ICFyZW1vdmVTZXQuaGFzKHIpKTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFJlZ2lvbnMoWy4uLmtlcHQsIC4uLmFkZF0pOyAvLyBtaW50cyBpZHMgb24gYGFkZGAsIHJlY29yZHMgdW5kb1xuICAgIGNvbnN0IHN0b3JlZCA9IHRoaXMucGxvdFNlcnZpY2UuZ2V0UmVnaW9ucygpO1xuICAgIGNvbnN0IHNlbCA9IGFkZC5tYXAoKHIpID0+IHN0b3JlZC5pbmRleE9mKHIpKS5maWx0ZXIoKGkpID0+IGkgPj0gMCk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhzZWwpO1xuICB9XG5cbiAgLyoqIEJveC1wcm9tcHRlZCBTQU0gc2VnbWVudGF0aW9uIG9mIHRoZSBkcmF3biByZWN0YW5nbGVzIChqaXQtdWkjOTApLiBBIHN0aWNreVxuICAgKiAgYHNhbWAgdG9hc3Qgc2hvd3MgbGl2ZSBzdGF0dXMgKyBhIGRvd25sb2FkIHByb2dyZXNzIGJhciAoZmlyc3QgcnVuIHB1bGxzIHRoZVxuICAgKiAgZW5jb2RlciwgfjE3MCBNQik7IGl0IHN0YXlzIG9wZW4gdW50aWwgdGhlIHJ1biBmaW5pc2hlcyAoYmFyIGhpdHMgMTAwJSkuICovXG4gIGFzeW5jIHNlZ21lbnRSZWdpb25zKCkge1xuICAgIGF3YWl0IHRoaXMucnVuU2VnbWVudFdpdGhUb2FzdCgnU0FNJywgdGhpcy5zYW1Ub29sLCAoKSA9PiB0aGlzLnBsb3RTZXJ2aWNlLnNlZ21lbnRSZWN0YW5nbGVzKCkpO1xuICB9XG5cbiAgLyoqIEF1dG8tc2VnbWVudCBjZWxscyBpbnNpZGUgZWFjaCBkcmF3biByZWN0YW5nbGUgd2l0aCBjZWxscG9zZS1TQU0sIGNsaWVudC1zaWRlXG4gICAqICAoaml0LXVpIzkwKS4gRWFjaCBib3ggaXMgY3JvcHBlZCAoYnJvd3NlciBzbGlkZS1jcm9wKSB0aGVuIHJ1biB0aHJvdWdoIHRoZVxuICAgKiAgY2VsbHBvc2UtanMgbW9kZWw7IHRoZSBzYW1lIHN0aWNreSBgc2FtYCB0b2FzdCArIHByb2dyZXNzIGJhciBpcyByZXVzZWQuICovXG4gIGFzeW5jIHNlZ21lbnRDZWxscG9zZSgpIHtcbiAgICBhd2FpdCB0aGlzLnJ1blNlZ21lbnRXaXRoVG9hc3QoJ0NlbGxwb3NlJywgdGhpcy5jZWxsU2VnbWVudFRvb2wsICgpID0+XG4gICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNlZ21lbnRSZWN0YW5nbGVzQ2VsbHBvc2UoKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIFNoYXJlZCBkcml2ZXIgZm9yIHRoZSBib3gtcHJvbXB0IHNlZ21lbnQgdG9vbHM6IHdpcmVzIHRoZSB0b29sJ3Mgc3RhdHVzICtcbiAgICogIGRvd25sb2FkIHByb2dyZXNzIGludG8gdGhlIHN0aWNreSBgc2FtYCB0b2FzdCwgcnVucyBgb3BgLCBhbmQgcmVwb3J0cyB0aGVcbiAgICogIHJlZ2lvbiBjb3VudC4gS2VlcHMgdGhlIHRvYXN0IG9wZW4gdW50aWwgdGhlIHJ1biBzZXR0bGVzIChiYXIgaGl0cyAxMDAlKS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBydW5TZWdtZW50V2l0aFRvYXN0KFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgdG9vbDogeyBzdGF0dXMkOiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPjsgcHJvZ3Jlc3MkOiBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPiB9LFxuICAgIG9wOiAoKSA9PiBQcm9taXNlPG51bWJlcj4sXG4gICkge1xuICAgIHRoaXMuc2FtU3RhdHVzID0gJ1N0YXJ0aW5n4oCmJztcbiAgICB0aGlzLnNhbVByb2dyZXNzID0gMDtcbiAgICB0aGlzLnNhbURvd25sb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5zYW1CdXN5ID0gdHJ1ZTtcbiAgICBjb25zdCBwc3ViID0gdG9vbC5wcm9ncmVzcyQuc3Vic2NyaWJlKChmKSA9PiB7XG4gICAgICB0aGlzLnNhbURvd25sb2FkaW5nID0gZiA+PSAwICYmIGYgPCAxO1xuICAgICAgaWYgKGYgPj0gMCkgdGhpcy5zYW1Qcm9ncmVzcyA9IE1hdGgubWluKDEwMCwgTWF0aC5yb3VuZChmICogMTAwKSk7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG4gICAgY29uc3Qgc3N1YiA9IHRvb2wuc3RhdHVzJC5zdWJzY3JpYmUoKG0pID0+IHtcbiAgICAgIGlmIChtKSB7XG4gICAgICAgIHRoaXMuc2FtU3RhdHVzID0gbTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuc2hvd1NhbVRvYXN0KGxhYmVsKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbiA9IGF3YWl0IG9wKCk7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgIHNldmVyaXR5OiBuID4gMCA/ICdzdWNjZXNzJyA6ICd3YXJuJyxcbiAgICAgICAgc3VtbWFyeTogbGFiZWwsXG4gICAgICAgIGRldGFpbDogdG9vbC5zdGF0dXMkLnZhbHVlIHx8IChuID4gMCA/IGBBZGRlZCAke259IHJlZ2lvbihzKS5gIDogJ05vIHJlZ2lvbnMgYWRkZWQuJyksXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiBgJHtsYWJlbH0gZmFpbGVkYCwgZGV0YWlsOiBTdHJpbmcoZSkgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIHNzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuaGlkZVNhbVRvYXN0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNob3cgdGhlIHNoYXJlZCBzdGlja3kgYHNhbWAgdG9hc3Qgb25jZSAoaWRlbXBvdGVudCDigJQgcmUtYWRkaW5nIHdvdWxkIHN0YWNrXG4gICAqICBhIG5ldyB0b2FzdCBvbiBldmVyeSBwb2ludCBjbGljaykuICovXG4gIHByaXZhdGUgc2hvd1NhbVRvYXN0KHN1bW1hcnk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNhbVRvYXN0U2hvd24pIHJldHVybjtcbiAgICB0aGlzLnNhbVRvYXN0U2hvd24gPSB0cnVlO1xuICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsga2V5OiB0aGlzLnNhbVRvYXN0S2V5LCBzdGlja3k6IHRydWUsIHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnkgfSk7XG4gIH1cblxuICAvKiogRGlzbWlzcyB0aGUgc2hhcmVkIGBzYW1gIHRvYXN0IGFuZCByZXNldCBpdHMgcHJvZ3Jlc3Mvc3Bpbm5lciBzdGF0ZS4gKi9cbiAgcHJpdmF0ZSBoaWRlU2FtVG9hc3QoKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Ub2FzdFNob3duID0gZmFsc2U7XG4gICAgdGhpcy5zYW1CdXN5ID0gZmFsc2U7XG4gICAgdGhpcy5zYW1Eb3dubG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuc2FtUHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuY2xlYXIodGhpcy5zYW1Ub2FzdEtleSk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqIFBpY2sgdGhlIFNBTSBtb2RlbCB0aGUgc2VnbWVudCB0b29scyB1c2UgKGppdC11aSM5MCBQMSkuICovXG4gIG9uU2FtTW9kZWxDaGFuZ2UoaWQ6IHN0cmluZykge1xuICAgIHRoaXMuc2FtTW9kZWxJZCA9IGlkO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0U2FtTW9kZWwoaWQpO1xuICB9XG5cbiAgLyoqIENvbnZlcnQgdGhlIHNlbGVjdGVkIHJlZ2lvbiB0byBhIHNtb290aCBiZXppZXIgY3VydmUuICovXG4gIHRvQmV6aWVyUmVnaW9uKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2UuZ2V0UmVnaW9uT3ZlcmxheSgpPy5zZXRTZWxlY3RlZEJlemllcih0cnVlKTtcbiAgfVxuXG4gIC8qKiBDb252ZXJ0IHRoZSBzZWxlY3RlZCByZWdpb24gYmFjayB0byBhIHN0cmFpZ2h0LWVkZ2VkIHBvbHlnb24uICovXG4gIHRvUG9seWdvblJlZ2lvbigpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldFJlZ2lvbk92ZXJsYXkoKT8uc2V0U2VsZWN0ZWRCZXppZXIoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltbWVkaWF0ZSByZWdpb24gYWN0aW9ucyBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24gKGppdC11aSM4NSk6IG1lcmdlLFxuICAgKiB1bmdyb3VwLCBpbnZlcnNlLCBzaW1wbGlmeSwgdGhlIELDqXppZXIgY29udmVyc2lvbnMsIGFuZCBkZWxldGUg4oCUIHRoZVxuICAgKiBvbmUtc2hvdCBnZW9tZXRyeSB0cmFuc2Zvcm1zLCBncm91cGVkIGFwYXJ0IGZyb20gdGhlIHRvb2wvbW9kZSB0b2dnbGVzIGFuZFxuICAgKiBzaG93biBvbmx5IHdoZW4gc29tZXRoaW5nIGlzIHNlbGVjdGVkLiBFYWNoIGl0ZW0gaXMgZ2F0ZWQgb24gd2hhdCB0aGVcbiAgICogc2VsZWN0aW9uIHN1cHBvcnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFJlZ2lvbkFjdGlvbkl0ZW1zKCk6IE1lbnVJdGVtW10ge1xuICAgIGNvbnN0IGFsbCA9IHRoaXMucGxvdFNlcnZpY2UuZ2V0UmVnaW9ucygpO1xuICAgIGNvbnN0IHNlbGVjdGFibGUgPSBhbGwuZmlsdGVyKChyKSA9PiByLmtpbmQgIT09ICdwcm9maWxlJyk7XG4gICAgaWYgKHNlbGVjdGFibGUubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgaXRlbXM6IE1lbnVJdGVtW10gPSBbXTtcblxuICAgIC8vIFNlbGVjdCBhbGwg4oCUIGF2YWlsYWJsZSB3aGVuZXZlciB0aGUgaW1hZ2UgaGFzIHJlZ2lvbnMsIHJlZ2FyZGxlc3Mgb2YgdGhlXG4gICAgLy8gY3VycmVudCBzZWxlY3Rpb24uXG4gICAgaXRlbXMucHVzaCh7XG4gICAgICBsYWJlbDogJ1NlbGVjdCBhbGwgcmVnaW9ucycsIGljb246ICdwaSBwaS1jaGVjay1zcXVhcmUnLFxuICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy5zZWxlY3RBbGxSZWdpb25zKCksXG4gICAgfSk7XG5cbiAgICBjb25zdCBzZWxBbGwgPSB0aGlzLnNlbGVjdGVkUmVnaW9ucztcbiAgICBpZiAoc2VsQWxsLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGl0ZW1zO1xuICAgIGNvbnN0IGVsaWdpYmxlID0gdGhpcy5vcEVsaWdpYmxlKHNlbEFsbCk7XG5cbiAgICBpZiAoZWxpZ2libGUubGVuZ3RoID49IDIpIHtcbiAgICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogJ01lcmdlIC8gZ3JvdXAnLCBpY29uOiAncGkgcGktbGluaycsIGNvbW1hbmQ6ICgpID0+IHRoaXMubWVyZ2VSZWdpb25zKCkgfSk7XG4gICAgfVxuICAgIGlmIChzZWxBbGwuc29tZSgocikgPT4gdGhpcy5yZWdpb25PcHMuY2FuVW5ncm91cChyKSkpIHtcbiAgICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogJ1VuZ3JvdXAnLCBpY29uOiAncGkgcGktc2l0ZW1hcCcsIGNvbW1hbmQ6ICgpID0+IHRoaXMudW5ncm91cFJlZ2lvbnMoKSB9KTtcbiAgICB9XG4gICAgaWYgKGVsaWdpYmxlLmxlbmd0aCA+PSAxKSB7XG4gICAgICBpdGVtcy5wdXNoKFxuICAgICAgICB7IGxhYmVsOiAnSW52ZXJzZScsIGljb246ICdwaSBwaS1jbG9uZScsIGNvbW1hbmQ6ICgpID0+IHRoaXMuaW52ZXJzZVJlZ2lvbnMoKSB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdTaW1wbGlmeScsIGljb246ICdwaSBwaS1jaGFydC1saW5lJyxcbiAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgeyBsYWJlbDogJ0xpZ2h0ICgxIHB4KScsIGNvbW1hbmQ6ICgpID0+IHRoaXMuc2ltcGxpZnlSZWdpb25zKDEpIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnTWVkaXVtICgzIHB4KScsIGNvbW1hbmQ6ICgpID0+IHRoaXMuc2ltcGxpZnlSZWdpb25zKDMpIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnU3Ryb25nICg4IHB4KScsIGNvbW1hbmQ6ICgpID0+IHRoaXMuc2ltcGxpZnlSZWdpb25zKDgpIH0sXG4gICAgICAgICAgICB7IHNlcGFyYXRvcjogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0N1c3RvbeKApicsIGNvbW1hbmQ6ICgpID0+IHRoaXMub3BlblNpbXBsaWZ5RGlhbG9nKCkgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gQsOpemllciBjb252ZXJzaW9ucyBhcmUgdmVydGV4LWxldmVsIGVkaXRzIOKAlCBJbWFnZSAoT3BlblNlYWRyYWdvbikgdmlld1xuICAgIC8vIG9ubHkg4oCUIGdhdGVkIG9uIHRoZSBzZWxlY3Rpb24ncyBjdXJyZW50IGZvcm0uXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRQbG90VHlwZSA9PT0gUGxvdFR5cGUuSU1BR0UpIHtcbiAgICAgIGNvbnN0IGhhc1N0cmFpZ2h0ID0gc2VsQWxsLnNvbWUoKHIpID0+XG4gICAgICAgIChyLmJvdW5kcyBpbnN0YW5jZW9mIFBvbHlnb24gJiYgIXIuYm91bmRzLmJlemllcikgfHwgci5ib3VuZHMgaW5zdGFuY2VvZiBSZWN0YW5nbGUpO1xuICAgICAgY29uc3QgaGFzQmV6aWVyID0gc2VsQWxsLnNvbWUoKHIpID0+IHIuYm91bmRzIGluc3RhbmNlb2YgUG9seWdvbiAmJiByLmJvdW5kcy5iZXppZXIpO1xuICAgICAgaWYgKGhhc1N0cmFpZ2h0KSB7XG4gICAgICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogJ0NvbnZlcnQgdG8gQsOpemllcicsIGljb246ICd0by1iZXppZXItaWNvbicsIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9CZXppZXJSZWdpb24oKSB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChoYXNCZXppZXIpIHtcbiAgICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnQ29udmVydCB0byBwb2x5Z29uJywgaWNvbjogJ3RvLXBvbHlnb24taWNvbicsIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9Qb2x5Z29uUmVnaW9uKCkgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogJ0RlbGV0ZSByZWdpb24nLCBpY29uOiAncGkgcGktdHJhc2gnLCBjb21tYW5kOiAoKSA9PiB0aGlzLmRlbGV0ZVJlZ2lvbigpIH0pO1xuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRDb250ZXh0TWVudUl0ZW1zKCk6IE1lbnVJdGVtW10ge1xuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuYWN0aXZlRHJhZ01vZGU7XG4gICAgY29uc3QgYWN0aXZlQ2xhc3MgPSAnY29udGV4dC1tZW51LWFjdGl2ZSc7XG4gICAgY29uc3QgaXRlbXM6IE1lbnVJdGVtW10gPSBbXTtcbiAgICAvLyBTZWxlY3RlZC1yZWdpb24gYWN0aW9ucyBsZWFkIHRoZSBtZW51IChzZXBhcmF0ZWQgZnJvbSB0aGUgdG9vbCB0b2dnbGVzKS5cbiAgICBpZiAodGhpcy5pc0hlYXRtYXApIHtcbiAgICAgIGNvbnN0IGFjdGlvbnMgPSB0aGlzLmJ1aWxkUmVnaW9uQWN0aW9uSXRlbXMoKTtcbiAgICAgIGlmIChhY3Rpb25zLmxlbmd0aCkgaXRlbXMucHVzaCguLi5hY3Rpb25zLCB7IHNlcGFyYXRvcjogdHJ1ZSB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNIZWF0bWFwKSB7XG4gICAgICBpdGVtcy5wdXNoKFxuICAgICAgICB7IGxhYmVsOiAnQXV0b3NjYWxlJywgaWNvbjogJ3BpIHBpLXdpbmRvdy1tYXhpbWl6ZScsIGNvbW1hbmQ6ICgpID0+IHRoaXMuYXV0b3NjYWxlSW1hZ2UoKSB9LFxuICAgICAgICB7IHNlcGFyYXRvcjogdHJ1ZSB9LFxuICAgICAgKTtcbiAgICAgIC8vICdab29tIHNlbGVjdGlvbicgaXMgUGxvdGx5J3MgcnViYmVyLWJhbmQgem9vbTsgaXQgZG9lc24ndCBhcHBseSB0byB0aGVcbiAgICAgIC8vIE9wZW5TZWFkcmFnb24tYmFja2VkIEltYWdlIHZpZXcgKHVzZSAnWm9vbSB0byBib3gnIHRoZXJlIGluc3RlYWQpLlxuICAgICAgaWYgKCF0aGlzLmlzSW1hZ2VWaWV3KSB7XG4gICAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICAgIGxhYmVsOiAnWm9vbSBzZWxlY3Rpb24nLFxuICAgICAgICAgIGljb246ICdwaSBwaS1zZWFyY2gnLFxuICAgICAgICAgIHN0eWxlQ2xhc3M6IGFjdGl2ZSA9PT0gJ3pvb20nID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCd6b29tJyksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaXRlbXMucHVzaCh7XG4gICAgICAgIGxhYmVsOiAnWm9vbSB0byBib3gnLFxuICAgICAgICBpY29uOiAnem9vbS1ib3gtb2ZmLWljb24nLFxuICAgICAgICBzdHlsZUNsYXNzOiBhY3RpdmUgPT09ICd6b29tVG9Cb3gnID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnem9vbVRvQm94JyksXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNIZWF0bWFwKSB7XG4gICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgbGFiZWw6ICdQYW4nLFxuICAgICAgICBpY29uOiAncGkgcGktYXJyb3dzLWFsdCcsXG4gICAgICAgIHN0eWxlQ2xhc3M6IGFjdGl2ZSA9PT0gJ3BhbicgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdwYW4nKSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzM2QgPSB0aGlzLmFjdGl2ZVN1cmZhY2UzZE1vZGU7XG4gICAgICBpdGVtcy5wdXNoKFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdab29tJyxcbiAgICAgICAgICBpY29uOiAncGkgcGktc2VhcmNoJyxcbiAgICAgICAgICBzdHlsZUNsYXNzOiBzM2QgPT09ICd6b29tJyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVTdXJmYWNlM2RNb2RlKCd6b29tJyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1BhbicsXG4gICAgICAgICAgaWNvbjogJ3BpIHBpLWFycm93cy1hbHQnLFxuICAgICAgICAgIHN0eWxlQ2xhc3M6IHMzZCA9PT0gJ3BhbicgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlU3VyZmFjZTNkTW9kZSgncGFuJyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ09yYml0YWwgcm90YXRpb24nLFxuICAgICAgICAgIGljb246ICdwaSBwaS1nbG9iZScsXG4gICAgICAgICAgc3R5bGVDbGFzczogczNkID09PSAnb3JiaXQnID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZVN1cmZhY2UzZE1vZGUoJ29yYml0JyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1R1cm50YWJsZSByb3RhdGlvbicsXG4gICAgICAgICAgaWNvbjogJ3BpIHBpLXN5bmMnLFxuICAgICAgICAgIHN0eWxlQ2xhc3M6IHMzZCA9PT0gJ3R1cm50YWJsZScgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlU3VyZmFjZTNkTW9kZSgndHVybnRhYmxlJyksXG4gICAgICAgIH0sXG4gICAgICAgIHsgc2VwYXJhdG9yOiB0cnVlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdSZXNldCBjYW1lcmEnLCBpY29uOiAncGkgcGktaG9tZScsIGNvbW1hbmQ6ICgpID0+IHRoaXMucmVzZXRTdXJmYWNlQ2FtZXJhKCkgfSxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzSGVhdG1hcCkge1xuICAgICAgaXRlbXMucHVzaChcbiAgICAgICAgeyBsYWJlbDogJ1pvb20gaW4nLCBpY29uOiAncGkgcGktc2VhcmNoLXBsdXMnLCBjb21tYW5kOiAoKSA9PiB0aGlzLnpvb21JbigpIH0sXG4gICAgICAgIHsgbGFiZWw6ICdab29tIG91dCcsIGljb246ICdwaSBwaS1zZWFyY2gtbWludXMnLCBjb21tYW5kOiAoKSA9PiB0aGlzLnpvb21PdXQoKSB9LFxuICAgICAgICB7IHNlcGFyYXRvcjogdHJ1ZSB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdTZWxlY3QnLFxuICAgICAgICAgIGljb246ICdwaSBwaS1hcnJvdy11cC1yaWdodCcsXG4gICAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnc2VsZWN0JyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnc2VsZWN0JyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZyZWVmb3JtJyxcbiAgICAgICAgICBpY29uOiAncGkgcGktcGVuY2lsJyxcbiAgICAgICAgICBzdHlsZUNsYXNzOiBhY3RpdmUgPT09ICdkcmF3Y2xvc2VkcGF0aCcgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ2RyYXdjbG9zZWRwYXRoJyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0JydXNoJyxcbiAgICAgICAgICBpY29uOiAnYnJ1c2gtaWNvbicsXG4gICAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnYnJ1c2gnID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdicnVzaCcpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdQb2x5bGluZScsXG4gICAgICAgICAgaWNvbjogJ3BvbHlsaW5lLWljb24nLFxuICAgICAgICAgIHN0eWxlQ2xhc3M6IGFjdGl2ZSA9PT0gJ2RyYXdvcGVucGF0aCcgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ2RyYXdvcGVucGF0aCcpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdSZWN0YW5nbGUnLFxuICAgICAgICAgIGljb246ICdwaSBwaS1zdG9wJyxcbiAgICAgICAgICBzdHlsZUNsYXNzOiBhY3RpdmUgPT09ICdkcmF3cmVjdCcgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ2RyYXdyZWN0JyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1dhbmQnLFxuICAgICAgICAgIGljb246ICd3YW5kLWljb24nLFxuICAgICAgICAgIHN0eWxlQ2xhc3M6IGFjdGl2ZSA9PT0gJ3dhbmQnID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCd3YW5kJyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1ZlcnRleCBlcmFzZXInLFxuICAgICAgICAgIGljb246ICdwaSBwaS1lcmFzZXInLFxuICAgICAgICAgIHN0eWxlQ2xhc3M6IGFjdGl2ZSA9PT0gJ2VyYXNlVmVydGV4JyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnZXJhc2VWZXJ0ZXgnKSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICAvLyBWZXJ0ZXggZWRpdGluZyBydW5zIG9uIHRoZSBPcGVuU2VhZHJhZ29uIG92ZXJsYXksIHdoaWNoXG4gICAgICAvLyBiYWNrcyB0aGUgSW1hZ2UgcGxvdCB0eXBlLiBIaWRkZW4gZm9yIG90aGVyIDJEIHR5cGVzIChQbG90bHkpLCB3aGVyZVxuICAgICAgLy8gdGhlc2UgbW9kZXMgYXJlIG5vLW9wcy5cbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkUGxvdFR5cGUgPT09IFBsb3RUeXBlLklNQUdFKSB7XG4gICAgICAgIGl0ZW1zLnB1c2goXG4gICAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICdQb2x5Z29uIChjbGljayB2ZXJ0aWNlcyknLFxuICAgICAgICAgICAgaWNvbjogJ3BvbHlnb24tdmVydGljZXMtaWNvbicsXG4gICAgICAgICAgICBzdHlsZUNsYXNzOiBhY3RpdmUgPT09ICdkcmF3cG9seWdvbicgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnZHJhd3BvbHlnb24nKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnQWRkIHZlcnRleCcsXG4gICAgICAgICAgICBpY29uOiAndmVydGV4LWFkZC1pY29uJyxcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M6IGFjdGl2ZSA9PT0gJ2FkZHBvaW50JyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdhZGRwb2ludCcpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICdEZWxldGUgdmVydGV4JyxcbiAgICAgICAgICAgIGljb246ICd2ZXJ0ZXgtZGVsZXRlLWljb24nLFxuICAgICAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnZGVsZXRlcG9pbnQnID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ2RlbGV0ZXBvaW50JyksXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIELDqXppZXIgY29udmVyc2lvbnMgKyBEZWxldGUgYXJlIGltbWVkaWF0ZSBzZWxlY3Rpb24gKmFjdGlvbnMqLCBub3cgaW4gdGhlXG4gICAgICAvLyBcIlNlbGVjdGVkIHJlZ2lvbihzKVwiIGdyb3VwIGF0IHRoZSB0b3AgKHNlZSBidWlsZFJlZ2lvbkFjdGlvbkl0ZW1zKS5cbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgdG9nZ2xlU3VyZmFjZTNkTW9kZShtb2RlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFjdGl2ZVN1cmZhY2UzZE1vZGUgPSBtb2RlO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0U3VyZmFjZURyYWdNb2RlKG1vZGUpO1xuICB9XG5cbiAgcmVzZXRTdXJmYWNlQ2FtZXJhKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2UucmVzZXRTdXJmYWNlQ2FtZXJhKCk7XG4gIH1cblxuICAvKiogVG9nZ2xlIHRoZSBuYXBhcmkgM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gKHZvbHVtZS9pc29zdXJmYWNlKS4gTm8tb3Agb24gYmFja2VuZHNcbiAgICogIHRoYXQgZG9uJ3QgcmVuZGVyIG9uZSAodGhlIGNvbnRyb2wgbWV0aG9kIGlzIG9wdGlvbmFsKS4gKi9cbiAgdG9nZ2xlQXhlcygpIHtcbiAgICB0aGlzLmF4ZXNWaXNpYmxlID0gIXRoaXMuYXhlc1Zpc2libGU7XG4gICAgdGhpcy5wbG90U2VydmljZS5nZXRTdXJmYWNlM2RDb250cm9scygpPy5zZXRBeGVzVmlzaWJsZT8uKHRoaXMuYXhlc1Zpc2libGUpO1xuICB9XG5cbiAgLyoqIFRvZ2dsZSB0aGUgbmFwYXJpIHN1cmZhY2Ugd2lyZWZyYW1lIChlZGdlcyB2cyBmaWxsZWQpLiBOby1vcCBvbiBiYWNrZW5kcyB3aXRob3V0IGEgc3VyZmFjZS4gKi9cbiAgdG9nZ2xlV2lyZWZyYW1lKCkge1xuICAgIHRoaXMud2lyZWZyYW1lQWN0aXZlID0gIXRoaXMud2lyZWZyYW1lQWN0aXZlO1xuICAgIHRoaXMucGxvdFNlcnZpY2UuZ2V0U3VyZmFjZTNkQ29udHJvbHMoKT8uc2V0V2lyZWZyYW1lPy4odGhpcy53aXJlZnJhbWVBY3RpdmUpO1xuICB9XG5cbiAgLyoqIENoYW5nZSB0aGUgbmFwYXJpIDNEIGRlY2ltYXRlIGZhY3Rvci4gRGVjaW1hdGlvbiBjaGFuZ2VzIHRoZSBmZXRjaGVkL2Fzc2VtYmxlZCBkYXRhLCBzbyB0aGlzXG4gICAqICByZS1wbG90cyB0aGUgY3VycmVudCAzRCB0eXBlIGF0IHRoZSBuZXcgcmVzb2x1dGlvbiAodW5saWtlIGF4ZXMvd2lyZWZyYW1lLCB3aGljaCBhcmUgbGl2ZSkuICovXG4gIHNlbGVjdFJlc29sdXRpb24oc2NhbGU6IG51bWJlcikge1xuICAgIGlmIChzY2FsZSA9PT0gdGhpcy5yZXNvbHV0aW9uU2NhbGUpIHJldHVybjtcbiAgICB0aGlzLnJlc29sdXRpb25TY2FsZSA9IHNjYWxlO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0UmVzb2x1dGlvblNjYWxlPy4oc2NhbGUpO1xuICAgIHRoaXMucmVsb2FkQW5kUGxvdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN3aXRjaCB0aGUgYWN0aXZlIHBsb3QgdHlwZSAoaGVhdG1hcCwgc3VyZmFjZSwgY29udG91ciwgc2NhdHRlciwgbGluZSxcbiAgICogc2NhdHRlcjNkLCBpc29zdXJmYWNlKS4gS2VlcHMgYGlzSGVhdG1hcGAgYXMgdGhlIDJELXZzLTNEIGZsYWcgdGhlIHJlc3Qgb2ZcbiAgICogdGhlIHRvb2xiYXIvY29udGV4dC1tZW51IGxvZ2ljIHJlbGllcyBvbiwgZGVhY3RpdmF0ZXMgMkQtb25seSB0b29scyB3aGVuXG4gICAqIG1vdmluZyB0byBhIDNEIHR5cGUsIHRoZW4gcmUtcGxvdHMuXG4gICAqL1xuICBvblNlbGVjdFBsb3RUeXBlKHR5cGU6IFBsb3RUeXBlKSB7XG4gICAgdGhpcy5wbG90VHlwZSA9IHR5cGU7XG4gICAgdGhpcy5zZWxlY3RlZFBsb3RUeXBlID0gdHlwZTtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gdGhpcy5wbG90VHlwZU9wdGlvbnMuZmluZCgoZCkgPT4gZC50eXBlID09PSB0eXBlKTtcbiAgICBjb25zdCBpczNkID0gZGVzY3JpcHRvcj8uZGltZW5zaW9ucyA9PT0gJzNkJztcbiAgICB0aGlzLmlzSGVhdG1hcCA9ICFpczNkO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0UGxvdFR5cGUodHlwZSk7XG4gICAgLy8gU3dpdGNoaW5nIHBsb3QgdHlwZSBjYW5jZWxzIHRoZSBhY3RpdmUgdG9vbCDigJQgbm90IGV2ZXJ5IHR5cGUgc3VwcG9ydHMgdGhlXG4gICAgLy8gc2FtZSB0b29scyAobGluZS9zY2F0dGVyIGNoYXJ0cyBhbmQgM0Qgc2NlbmVzIGhhdmUgbm8gYm94IHpvb20gb3IgcmVnaW9uXG4gICAgLy8gZHJhd2luZyksIHNvIGxlYXZpbmcgYSB0b29sIGFybWVkIHdvdWxkIG1pc2JlaGF2ZSBvbiB0aGUgbmV3IHBsb3QuXG4gICAgdGhpcy5kZWFjdGl2YXRlQWN0aXZlVG9vbCgpO1xuICAgIGlmIChpczNkKSB7XG4gICAgICB0aGlzLmFjdGl2ZVN1cmZhY2UzZE1vZGUgPSAndHVybnRhYmxlJztcbiAgICB9XG4gICAgLy8gbmFwYXJpLWpzIHZvbHVtZS9pc29zdXJmYWNlIGFzc2VtYmxlIHRoZWlyIG93biAzRCB0ZXh0dXJlIGZyb20gdGhlIHNsaWNlIGVuZHBvaW50LCBzb1xuICAgIC8vIHRoZXkgdGFrZSB0aGUgbm9ybWFsIHJlLXBsb3QgcGF0aCDigJQgTk9UIFBsb3RseSdzIHN0YWNrLWZyYW1lIGxvYWRlciAod2hvc2UgXCJMb2FkaW5nXG4gICAgLy8gZnJhbWVzXCIgb3ZlcmxheSB3b3VsZCBuZXZlciBjbGVhciwgc2luY2UgUGxvdGx5IGlzbid0IHRoZSBhY3RpdmUgYmFja2VuZCkgKGppdC11aSMxMDIpLlxuICAgIGNvbnN0IGlzTmFwYXJpID0gdHlwZSA9PT0gUGxvdFR5cGUuTkFQQVJJX0lNQUdFIHx8IGlzTmFwYXJpM2QodHlwZSk7XG4gICAgaWYgKGRlc2NyaXB0b3I/LnJlcXVpcmVzU3RhY2sgJiYgIWlzTmFwYXJpKSB7XG4gICAgICAvLyBWb2x1bWUgdHlwZXMgKGlzb3N1cmZhY2UsIHNjYXR0ZXIzZCkgbmVlZCB0aGUgd2hvbGUgei1zdGFjayBsb2FkZWQgYXMgYVxuICAgICAgLy8gM0QgYXJyYXksIGFuZCB0aGV5IGFsd2F5cyByZW5kZXIgb24gUGxvdGx5LiBEcml2ZSB0aGUgc3RhY2sgcmVsb2FkXG4gICAgICAvLyBkaXJlY3RseSB0aHJvdWdoIHRoZSBpbWFnZS1pbmZvIHN0cmVhbSByYXRoZXIgdGhhbiB0aGUgYWN0aXZlIHJlbmRlcmVyJ3NcbiAgICAgIC8vIHNldFNob3dTdGFjazogd2hlbiBPcGVuU2VhZHJhZ29uIG93bnMgdGhlIEltYWdlIHZpZXcgaXRzIHNldFNob3dTdGFjayBpc1xuICAgICAgLy8gYSBuby1vcCwgc28gdGhlIHJlbG9hZCBuZXZlciBmaXJlZCBhbmQgdGhlIGxvYWRlciBzcHVuIGZvcmV2ZXIuIFdlIGFybVxuICAgICAgLy8gUGxvdGx5J3Mgc3RhY2stbG9hZGluZyBmbGFnIChrZWVwcyBpdHMgZnJhbWUtZmV0Y2ggbG9vcCBhbGl2ZSkgYW5kXG4gICAgICAvLyByZS1lbWl0IHRoZSBpbWFnZSBpbmZvIHdpdGggc2hvd1N0YWNrIG9uIHNvIHRoZSBwaXBlbGluZSByZWxvYWRzIG9uXG4gICAgICAvLyBQbG90bHkgcmVnYXJkbGVzcyBvZiB3aGljaCBiYWNrZW5kIHdhcyBvbiBzY3JlZW4uXG4gICAgICB0aGlzLnNlbGVjdGVkU3RhY2tPcHRpb24gPSB0aGlzLnN0YWNrT3B0aW9uc1sxXTtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0U3RhY2tMb2FkaW5nKHRydWUpO1xuICAgICAgaWYgKHRoaXMuaW1hZ2VJbmZvKSB7XG4gICAgICAgIHRoaXMuaW1hZ2VJbmZvLnNob3dTdGFjayA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RhdGUuc2V0SW1hZ2VJbmZvKHRoaXMuaW1hZ2VJbmZvKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZWxvYWRBbmRQbG90KCk7XG4gIH1cblxuICAvKiogRGVhY3RpdmF0ZSB3aGF0ZXZlciB0b29sIGlzIGFybWVkIGFuZCBjbGVhciBldmVyeSB0b29sIG1vZGUuICovXG4gIHByaXZhdGUgZGVhY3RpdmF0ZUFjdGl2ZVRvb2woKSB7XG4gICAgdGhpcy5hY3RpdmVEcmFnTW9kZSA9IG51bGw7XG4gICAgdGhpcy5zZXNzaW9uLnNldEFjdGl2ZVRvb2wobnVsbCk7XG4gICAgdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25PdmVybGF5KCk/LnNldE1vZGUoJ25vbmUnKTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldERyYWdNb2RlKGZhbHNlKTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFpvb21Ub0JveE1vZGUoZmFsc2UpO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0V2FuZE1vZGUoZmFsc2UpO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0QnJ1c2hNb2RlKGZhbHNlKTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFNhbVBvaW50TW9kZShmYWxzZSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRWZXJ0ZXhFcmFzZXJNb2RlKGZhbHNlKTtcbiAgfVxufVxuXG4iLCI8IS0tIFNBTSB0b2FzdDogbGl2ZSBzdGF0dXMgKyBlbmNvZGVyLWRvd25sb2FkIHByb2dyZXNzIGJhciAoaml0LXVpIzkwKS4gU3RpY2t5XG4gICAgIHdoaWxlIGEgc2VnbWVudCBydW5zOyBzdGF5cyBvcGVuIHVudGlsIHRoZSBiYXIgcmVhY2hlcyAxMDAlIGFuZCB0aGUgcnVuIGVuZHMuIC0tPlxuPHAtdG9hc3QgW2tleV09XCJzYW1Ub2FzdEtleVwiIHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCI+XG4gIDxuZy10ZW1wbGF0ZSBsZXQtbWVzc2FnZSBwVGVtcGxhdGU9XCJtZXNzYWdlXCI+XG4gICAgPGRpdiBzdHlsZT1cImZsZXg6IDE7IG1pbi13aWR0aDogMTZyZW1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb250LWJvbGQgbWItMVwiPnt7IG1lc3NhZ2Uuc3VtbWFyeSB9fTwvZGl2PlxuICAgICAgPGRpdj57eyBzYW1TdGF0dXMgfHwgbWVzc2FnZS5kZXRhaWwgfX08L2Rpdj5cbiAgICAgIDxwLXByb2dyZXNzQmFyICpuZ0lmPVwic2FtRG93bmxvYWRpbmdcIiBbdmFsdWVdPVwic2FtUHJvZ3Jlc3NcIiBzdHlsZUNsYXNzPVwibXQtMiBzYW0tcHJvZ3Jlc3NcIj48L3AtcHJvZ3Jlc3NCYXI+XG4gICAgICA8cC1wcm9ncmVzc0JhciAqbmdJZj1cInNhbUJ1c3kgJiYgIXNhbURvd25sb2FkaW5nXCIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiBzdHlsZUNsYXNzPVwibXQtMlwiXG4gICAgICAgICAgICAgICAgICAgICBbc3R5bGVdPVwieyBoZWlnaHQ6ICc0cHgnIH1cIj48L3AtcHJvZ3Jlc3NCYXI+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L3AtdG9hc3Q+XG5cbjwhLS0gVG9vbGJhciBkb2NrOiBkb2NrZWQgYWNyb3NzIHRoZSB0b3AgYnkgZGVmYXVsdDsgZHJhZyB0aGUgaGFuZGxlIHRvIGRldGFjaFxuICAgICBpdCBpbnRvIGEgZmxvYXRpbmcsIG1vdmFibGUgd2luZG93IChmcmVlcyB0aGUgdG9wIHJvdyBmb3IgdGhlIGltYWdlKS4gLS0+XG48ZGl2IGNsYXNzPVwidG9vbGJhci1kb2NrXCIgW2NsYXNzLmZsb2F0aW5nXT1cInRvb2xiYXJGbG9hdGluZ1wiXG4gICAgIFtzdHlsZS5sZWZ0LnB4XT1cInRvb2xiYXJGbG9hdGluZyA/IHRvb2xiYXJQb3MueCA6IG51bGxcIlxuICAgICBbc3R5bGUudG9wLnB4XT1cInRvb2xiYXJGbG9hdGluZyA/IHRvb2xiYXJQb3MueSA6IG51bGxcIj5cbiAgPGRpdiBjbGFzcz1cInRvb2xiYXItZHJhZy1oYW5kbGVcIiAobW91c2Vkb3duKT1cIm9uVG9vbGJhckRyYWdTdGFydCgkZXZlbnQpXCJcbiAgICAgICBwVG9vbHRpcD1cIkRyYWcgdG8gZmxvYXQgdGhlIHRvb2xiYXJcIiB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIj5cbiAgICA8aSBjbGFzcz1cInBpIHBpLWJhcnNcIj48L2k+XG4gIDwvZGl2PlxuPHBsb3R0aW5nLXRvb2xiYXJcbiAgW2ltYWdlSW5mb109XCJpbWFnZUluZm9cIlxuICBbcGxvdFR5cGVPcHRpb25zXT1cInBsb3RUeXBlT3B0aW9uc1wiXG4gIFtzZWxlY3RlZFBsb3RUeXBlXT1cInNlbGVjdGVkUGxvdFR5cGVcIlxuICBbaXNvUmFuZ2VdPVwiaXNvUmFuZ2VcIlxuICBbbWF4SW5kZXhdPVwibWF4SW5kZXhcIlxuICBbekluZGV4XT1cInpJbmRleFwiXG4gIFtpc0hlYXRtYXBdPVwiaXNIZWF0bWFwXCJcbiAgW2FjdGl2ZURyYWdNb2RlXT1cImFjdGl2ZURyYWdNb2RlXCJcbiAgW2FjdGl2ZVN1cmZhY2UzZE1vZGVdPVwiYWN0aXZlU3VyZmFjZTNkTW9kZVwiXG4gIFtheGVzVmlzaWJsZV09XCJheGVzVmlzaWJsZVwiXG4gIFt3aXJlZnJhbWVBY3RpdmVdPVwid2lyZWZyYW1lQWN0aXZlXCJcbiAgW3Jlc29sdXRpb25TY2FsZV09XCJyZXNvbHV0aW9uU2NhbGVcIlxuICBbd2FuZFNlbnNpdGl2aXR5XT1cIndhbmRTZW5zaXRpdml0eVwiXG4gIFticnVzaFNpemVdPVwiYnJ1c2hTaXplXCJcbiAgW3NhbU1vZGVsc109XCJzYW1Nb2RlbHNcIlxuICBbc2FtTW9kZWxJZF09XCJzYW1Nb2RlbElkXCJcbiAgW3ZlcnRleEVyYXNlclJhZGl1c109XCJ2ZXJ0ZXhFcmFzZXJSYWRpdXNcIlxuICBbY2FuVW5kb109XCJjYW5VbmRvUmVnaW9uXCJcbiAgW2NhblJlZG9dPVwiY2FuUmVkb1JlZ2lvblwiXG4gIFtzdGFja09wdGlvbnNdPVwic3RhY2tPcHRpb25zXCJcbiAgW3Rvb2xzXT1cInRvb2xiYXJUb29sc1wiXG4gIFtpbWFnZVNtb290aGluZ0VuYWJsZWRdPVwiaW1hZ2VTbW9vdGhpbmdFbmFibGVkXCJcbiAgKHNlbGVjdFBsb3RUeXBlKT1cIm9uU2VsZWN0UGxvdFR5cGUoJGV2ZW50KVwiXG4gICh0b2dnbGVJbWFnZVNtb290aGluZyk9XCJvblRvZ2dsZUltYWdlU21vb3RoaW5nKClcIlxuICAoYWRkUHJvZmlsZUxpbmUpPVwiYWRkUHJvZmlsZUxpbmUoKVwiXG4gIChpc29SYW5nZUNoYW5nZSk9XCJvbklzb1JhbmdlQ2hhbmdlKCRldmVudClcIlxuICAob3BlbkNoYW5uZWxIaXN0b2dyYW0pPVwib3BlbkNoYW5uZWxIaXN0b2dyYW0oKVwiXG4gIChvcGVuUmVnaW9uRWRpdG9yKT1cIm9wZW5SZWdpb25FZGl0b3IoKVwiXG4gIChzZWxlY3RTdGFja09wdGlvbik9XCJzZWxlY3RTdGFja09wdGlvbigkZXZlbnQpXCJcbiAgKHpTY3J1Yik9XCJvblpTY3J1YigkZXZlbnQpXCJcbiAgKHpTbGlkZSk9XCJvblpTbGlkZSgkZXZlbnQpXCJcbiAgKHpJbmRleElucHV0KT1cInpJbmRleCA9ICRldmVudDsgdXBkYXRlWkluZGV4KClcIlxuICAocmVsb2FkQW5kUGxvdCk9XCJyZWxvYWRBbmRQbG90KClcIlxuICAoZG93bmxvYWRJbWFnZSk9XCJkb3dubG9hZEltYWdlKClcIlxuICAoYXV0b3NjYWxlSW1hZ2UpPVwiYXV0b3NjYWxlSW1hZ2UoKVwiXG4gICh0b2dnbGVEcmFnTW9kZSk9XCJ0b2dnbGVEcmFnTW9kZSgkZXZlbnQpXCJcbiAgKHpvb21Jbik9XCJ6b29tSW4oKVwiXG4gICh6b29tT3V0KT1cInpvb21PdXQoKVwiXG4gICh0b2dnbGVTdXJmYWNlM2RNb2RlKT1cInRvZ2dsZVN1cmZhY2UzZE1vZGUoJGV2ZW50KVwiXG4gIChyZXNldFN1cmZhY2VDYW1lcmEpPVwicmVzZXRTdXJmYWNlQ2FtZXJhKClcIlxuICAodG9nZ2xlQXhlcyk9XCJ0b2dnbGVBeGVzKClcIlxuICAodG9nZ2xlV2lyZWZyYW1lKT1cInRvZ2dsZVdpcmVmcmFtZSgpXCJcbiAgKHNlbGVjdFJlc29sdXRpb24pPVwic2VsZWN0UmVzb2x1dGlvbigkZXZlbnQpXCJcbiAgKGRlbGV0ZVJlZ2lvbik9XCJkZWxldGVSZWdpb24oKVwiXG4gICh1bmRvUmVnaW9uKT1cInVuZG9SZWdpb24oKVwiXG4gIChyZWRvUmVnaW9uKT1cInJlZG9SZWdpb24oKVwiXG4gIChzZWdtZW50UmVnaW9ucyk9XCJzZWdtZW50UmVnaW9ucygpXCJcbiAgKHNlZ21lbnRDZWxscG9zZSk9XCJzZWdtZW50Q2VsbHBvc2UoKVwiXG4gIChzYW1Nb2RlbENoYW5nZSk9XCJvblNhbU1vZGVsQ2hhbmdlKCRldmVudClcIlxuICAod2FuZFNlbnNpdGl2aXR5Q2hhbmdlKT1cIm9uV2FuZFNlbnNpdGl2aXR5Q2hhbmdlKCRldmVudClcIlxuICAoYnJ1c2hTaXplQ2hhbmdlKT1cIm9uQnJ1c2hTaXplQ2hhbmdlKCRldmVudClcIlxuICAodmVydGV4RXJhc2VyUmFkaXVzQ2hhbmdlKT1cIm9uVmVydGV4RXJhc2VyUmFkaXVzQ2hhbmdlKCRldmVudClcIj5cbiAgPCEtLSBIb3N0LXByb2plY3RlZCBjdXN0b20gdG9vbGJhciBidXR0b25zLCBmb3J3YXJkZWQgaW50byB0aGUgdG9vbGJhci4gLS0+XG4gIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvcGxvdHRpbmctdG9vbGJhcj5cbiAgPHAtYnV0dG9uICpuZ0lmPVwidG9vbGJhckZsb2F0aW5nXCIgY2xhc3M9XCJ0b29sYmFyLWRvY2stYnRuXCIgaWNvbj1cInBpIHBpLXRodW1idGFja1wiIHNpemU9XCJzbWFsbFwiIFt0ZXh0XT1cInRydWVcIlxuICAgICAgICAgICAgcFRvb2x0aXA9XCJEb2NrIHRvIHRvcFwiIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiIChvbkNsaWNrKT1cImRvY2tUb29sYmFyKClcIj5cbiAgPC9wLWJ1dHRvbj5cbjwvZGl2PlxuXG48cC1jb250ZXh0TWVudSAjY20gW21vZGVsXT1cImNvbnRleHRNZW51SXRlbXNcIiBhcHBlbmRUbz1cImJvZHlcIj48L3AtY29udGV4dE1lbnU+XG48IS0tIE5vIGBoLWZ1bGxgIGhlcmU6IFByaW1lRmxleCdzIGhlaWdodDoxMDAlICFpbXBvcnRhbnQgbWFkZSAjcGxvdCBhcyB0YWxsIGFzXG4gICAgIHRoZSB3aG9sZSBob3N0LCBzbyB1bmRlciB0aGUgZG9ja2VkIHRvb2xiYXIgaXRzIGJvdHRvbSB0b29sYmFyLWhlaWdodCBzdHJpcFxuICAgICAoaW5jbC4gdGhlIE9TRCBzY2FsZSBiYXIgYXQgYm90dG9tLWxlZnQpIHdhcyBjbGlwcGVkIGJ5IHRoZSBob3N0J3NcbiAgICAgb3ZlcmZsb3c6aGlkZGVuLiBUaGUgY29tcG9uZW50IHN0eWxlc2hlZXQgc2l6ZXMgaXQgKC52aXotcGxvdCB7IGZsZXg6IDEgfSkuIC0tPlxuPGRpdiBjbGFzcz1cInctZnVsbCByZWxhdGl2ZSB2aXotcGxvdFwiIFtpZF09XCJwbG90RGl2TmFtZVwiPlxuICA8ZGl2ICpuZ0lmPVwiaW1nTG9hZGluZyB8fCBzdGFja0xvYWRpbmcgfHwgaXNDYWNoaW5nXCIgaWQ9XCJvdmVybGF5XCI+XG4gICAgPCEtLSBEZXRlcm1pbmF0ZSBzdGFjay92b2x1bWUgcHJvZ3Jlc3MgdGFrZXMgcHJlY2VkZW5jZTogd2hpbGUgaXQncyBhY3RpdmUgc2hvdyBPTkxZIHRoZVxuICAgICAgICAgcHJvZ3Jlc3MgYmFyICsgXCJMb2FkaW5nIGZyYW1lcy4uLlwiLCBub3QgdGhlIGdlbmVyaWMgc3Bpbm5lci9cIkxvYWRpbmcgaW1hZ2UuLi5cIiBvbiB0b3Agb2ZcbiAgICAgICAgIGl0IChib3RoIHdlcmUgcmVuZGVyaW5nIGF0IG9uY2UgZm9yIG5hcGFyaSB2b2x1bWUvaXNvc3VyZmFjZSBsb2FkcykuIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdGFja0xvYWRpbmc7IGVsc2UgaW1nTG9hZGluZ1RwbFwiPlxuICAgICAgPHAtcHJvZ3Jlc3NCYXIgY2xhc3M9XCJwcm9ncmVzc1wiIFt2YWx1ZV09XCJsb2FkaW5nUGVyY2VudGFnZVwiPjwvcC1wcm9ncmVzc0Jhcj5cbiAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sb2FkaW5nXCI+TG9hZGluZyBmcmFtZXMuLi48L3NwYW4+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLXRlbXBsYXRlICNpbWdMb2FkaW5nVHBsPlxuICAgICAgPCEtLSBDYWNoZS1jb3B5IHByb2dyZXNzIGlzIHNob3duIHdoZW5ldmVyIGEgY2FjaGUgZG93bmxvYWQgaXMgYWN0aXZlIChpc0NhY2hpbmcpLCBpbmRlcGVuZGVudFxuICAgICAgICAgICBvZiBgaW1nTG9hZGluZ2AsIHNvIGl0J3MgbmV2ZXIgZHJvcHBlZC9tYXNrZWQgbWlkLWRvd25sb2FkLiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0NhY2hpbmc7IGVsc2Ugc3Bpbm5lckxvYWRpbmdcIj5cbiAgICAgICAgPCEtLSBTdGFnZS1hd2FyZSBtZXNzYWdlIGNvbWVzIGZyb20gQ2FjaGVQcm9ncmVzc1NlcnZpY2UgdXBkYXRpbmdcbiAgICAgICAgICAgICBpbWFnZUxvYWRpbmdNZXNzYWdlJCAoXCJDYWNoaW5nIGltYWdlLi4uXCIgZHVyaW5nIHRoZSBHQ1MgZG93bmxvYWQsXG4gICAgICAgICAgICAgdGhlbiBcIkdlbmVyYXRpbmcgcHJldmlldy4uLlwiIGR1cmluZyBwZXItc2xpY2UgdGh1bWJuYWlsIGdlbikuIE9uY2UgdGhlXG4gICAgICAgICAgICAgZG93bmxvYWQgaGl0cyAxMDAlIHRoZSByZW1haW5pbmcgd29yayAoc2VydmVyIHByZXZpZXcvdGlsZSBnZW5lcmF0aW9uKVxuICAgICAgICAgICAgIGhhcyBubyBkZXRlcm1pbmF0ZSBwcm9ncmVzcywgc28gZmFsbCB0aHJvdWdoIHRvIHRoZSBzcGlubmVyIHRlbXBsYXRlXG4gICAgICAgICAgICAgcmF0aGVyIHRoYW4gcGFya2luZyBhIGZ1bGwgYmFyIHVuZGVyIFwiTG9hZGluZyBpbWFnZS4uLlwiLiAtLT5cbiAgICAgICAgPHAtcHJvZ3Jlc3NCYXIgY2xhc3M9XCJwcm9ncmVzc1wiIFt2YWx1ZV09XCJjYWNoZVByb2dyZXNzXCI+PC9wLXByb2dyZXNzQmFyPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbG9hZGluZ1wiPnt7bG9hZGluZ01lc3NhZ2V9fTwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNzcGlubmVyTG9hZGluZz5cbiAgICAgICAgPGRpdiAqbmdJZj1cImltZ0xvYWRpbmdcIiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJpbWdMb2FkaW5nICYmICF6b29tXCIgY2xhc3M9XCJ0ZXh0LWxvYWRpbmdcIj57e2xvYWRpbmdNZXNzYWdlfX08L3NwYW4+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaW1nTG9hZGluZyAmJiB6b29tXCIgY2xhc3M9XCJ6b29tLXRleHQtbG9hZGluZ1wiPnt7bG9hZGluZ01lc3NhZ2V9fTwvc3Bhbj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8cC1idXR0b24gKm5nSWY9XCJzdGFja0xvYWRpbmcgfHwgaW1nTG9hZGluZ1wiIGNsYXNzPVwiY2FuY2VsLWxvYWRpbmcgXCIgbGFiZWw9XCJDYW5jZWxcIlxuICAgICAgICAgICAgICAob25DbGljayk9XCJjYW5jZWxMb2FkaW5nKClcIj5cbiAgICA8L3AtYnV0dG9uPlxuICA8L2Rpdj5cbiAgPCEtLSBUcmFuc2x1Y2VudCBcInNoYXJwZW5pbmdcIiBvdmVybGF5IHNob3duIGFmdGVyIHRoZSBzbWFsbC10aWVyIHByZXZpZXcgaXNcbiAgICAgICBvbiBzY3JlZW4gd2hpbGUgdGhlIGxhcmdlLXRpZXIgcmVuZGVyIGlzIHN0aWxsIGxvYWRpbmcgaW4gdGhlXG4gICAgICAgYmFja2dyb3VuZC4gTGV0cyB0aGUgdXNlciBzZWUgdGhlIGJsdXJyeSBpbWFnZSB1bmRlcm5lYXRoIGJ1dCBtYWtlc1xuICAgICAgIGl0IGNsZWFyIHNvbWV0aGluZyBpcyBzdGlsbCBsb2FkaW5nIHNvIHRoZXkgZG9uJ3QgbWlzdGFrZSB0aGVcbiAgICAgICBsb3ctcmVzIHJlbmRlciBmb3IgdGhlIGZpbmFsIGltYWdlLiAtLT5cbiAgPGRpdiAqbmdJZj1cInNoYXJwZW5pbmcgJiYgIWltZ0xvYWRpbmcgJiYgIXN0YWNrTG9hZGluZyAmJiAhaXNDYWNoaW5nXCIgaWQ9XCJzaGFycGVuaW5nLW92ZXJsYXlcIj5cbiAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PlxuICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sb2FkaW5nXCI+U2hhcnBlbmluZyBwcmV2aWV3Li4uPC9zcGFuPlxuICA8L2Rpdj5cblxuPC9kaXY+XG5cbjwhLS0gRmxvYXRpbmcsIGRyYWdnYWJsZSBpbnRlbnNpdHktcHJvZmlsZSBpbnNldC4gU2hvd24gaW4gTElORSBtb2RlOyB0aGUgY2hhcnRcbiAgICAgdXBkYXRlcyBsaXZlIGFzIHRoZSBsaW5lIFJPSSBvbiB0aGUgaW1hZ2UgaXMgbW92ZWQuIEtlcHQgT1VUU0lERSAjcGxvdCBhbmRcbiAgICAgcG9zaXRpb25lZCBmaXhlZCBzbyBpdCBmbG9hdHMgb3ZlciB0aGUgd2hvbGUgcGFnZSAobm90IGNsaXBwZWQgdG8gdGhlXG4gICAgIGRpYWdyYW0vY2FudmFzIGFyZWEpLiAtLT5cbjxkaXYgKm5nSWY9XCJoYXNQcm9maWxlc1wiIGNsYXNzPVwiaW50ZW5zaXR5LXBhbmVsXCJcbiAgICAgW3N0eWxlLmxlZnQucHhdPVwicHJvZmlsZVBhbmVsUG9zLnhcIiBbc3R5bGUudG9wLnB4XT1cInByb2ZpbGVQYW5lbFBvcy55XCI+XG4gIDxkaXYgY2xhc3M9XCJpbnRlbnNpdHktcGFuZWwtaGVhZGVyXCIgKG1vdXNlZG93bik9XCJvblByb2ZpbGVQYW5lbERyYWdTdGFydCgkZXZlbnQpXCI+XG4gICAgPHNwYW4+SW50ZW5zaXR5IHByb2ZpbGU8L3NwYW4+XG4gICAgPGkgY2xhc3M9XCJwaSBwaS1hcnJvd3MtYWx0XCI+PC9pPlxuICA8L2Rpdj5cbiAgPGRpdiBbaWRdPVwiaW50ZW5zaXR5SW5zZXREaXZcIiBjbGFzcz1cImludGVuc2l0eS1wYW5lbC1wbG90XCI+PC9kaXY+XG48L2Rpdj5cblxuPCEtLSBDaGFubmVscyAmIEhpc3RvZ3JhbTogbm9uLW1vZGFsIGZsb2F0aW5nIGRpYWxvZyBvcGVuZWQgZnJvbSB0aGUgdG9vbGJhci4gLS0+XG48Y2hhbm5lbC1oaXN0b2dyYW0gWyh2aXNpYmxlKV09XCJzaG93Q2hhbm5lbEhpc3RvZ3JhbVwiPjwvY2hhbm5lbC1oaXN0b2dyYW0+XG5cbjwhLS0gUmVnaW9uIEVkaXRvcjogbm9uLW1vZGFsLCBkcmFnZ2FibGUsIHJlc2l6YWJsZSBmbG9hdGluZyBkaWFsb2cgb3BlbmVkIGZyb21cbiAgICAgdGhlIHRvb2xiYXIgKGZvcm1lcmx5IHRoZSByaWdodC1wYW5lbCBSZWdpb25zIHRhYikuIE1vZGVsZXNzIHNvIHJlZ2lvbnMgY2FuXG4gICAgIHN0aWxsIGJlIGRyYXduL3NlbGVjdGVkIG9uIHRoZSBwbG90IHdoaWxlIGl0J3Mgb3Blbjsgc3RheXMgbGlua2VkIHRvIHRoaXNcbiAgICAgcGxvdHRpbmcgaW5zdGFuY2UgdmlhIHRoZSByb290IFJlZ2lvblN0b3JlIHNpbmdsZXRvbi4gT3BlbnMgb3ZlciB0aGUgcmlnaHRcbiAgICAgc2lkZSBvZiB0aGUgdmlldy4gLS0+XG48cC1kaWFsb2cgaGVhZGVyPVwiUmVnaW9uIEVkaXRvclwiIFsodmlzaWJsZSldPVwic2hvd1JlZ2lvbkVkaXRvclwiXG4gICAgICAgICAgW21vZGFsXT1cImZhbHNlXCIgW3Jlc2l6YWJsZV09XCJ0cnVlXCIgW2RyYWdnYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICBbbWF4aW1pemFibGVdPVwidHJ1ZVwiIGFwcGVuZFRvPVwiYm9keVwiIHBvc2l0aW9uPVwicmlnaHRcIlxuICAgICAgICAgIFtzdHlsZV09XCJ7IHdpZHRoOiByZWdpb25FZGl0b3JXaWR0aCwgaGVpZ2h0OiAnODV2aCcgfVwiXG4gICAgICAgICAgW2NvbnRlbnRTdHlsZV09XCJ7IG92ZXJmbG93OiAnYXV0bycgfVwiPlxuICA8cmVnaW9uLWVkaXRvcj48L3JlZ2lvbi1lZGl0b3I+XG48L3AtZGlhbG9nPlxuXG48IS0tIFNpbXBsaWZ5IChEb3VnbGFz4oCTUGV1Y2tlcik6IGN1c3RvbSBweC10aHJlc2hvbGQgcGlja2VyIGZvciB0aGUgc2VsZWN0ZWRcbiAgICAgcmVnaW9uKHMpLCBvcGVuZWQgZnJvbSB0aGUgcmlnaHQtY2xpY2sgXCJTaW1wbGlmeSDilrggQ3VzdG9t4oCmXCIgYWN0aW9uLiAtLT5cbjxwLWRpYWxvZyBoZWFkZXI9XCJTaW1wbGlmeSByZWdpb24ocylcIiBbKHZpc2libGUpXT1cImRpc3BsYXlTaW1wbGlmeURpYWxvZ1wiIFttb2RhbF09XCJ0cnVlXCJcbiAgICAgICAgICBbc3R5bGVdPVwie3dpZHRoOiAnMjJyZW0nfVwiIFtkcmFnZ2FibGVdPVwiZmFsc2VcIiBbcmVzaXphYmxlXT1cImZhbHNlXCI+XG4gIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uIGdhcC0yXCI+XG4gICAgPHNwYW4+QWx0aXR1ZGUgdGhyZXNob2xkOiA8Yj57eyBzaW1wbGlmeVRocmVzaG9sZCB9fSBweDwvYj48L3NwYW4+XG4gICAgPHAtc2xpZGVyIFsobmdNb2RlbCldPVwic2ltcGxpZnlUaHJlc2hvbGRcIiBbbWluXT1cIjFcIiBbbWF4XT1cIjIwXCIgW3N0ZXBdPVwiMVwiPjwvcC1zbGlkZXI+XG4gICAgPHNtYWxsPlZlcnRpY2VzIHdpdGhpbiB0aGlzIGRpc3RhbmNlIG9mIHRoZSBsaW5lIGJldHdlZW4gdGhlaXIgbmVpZ2hib3VycyBhcmUgcmVtb3ZlZC48L3NtYWxsPlxuICA8L2Rpdj5cbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZvb3RlclwiPlxuICAgIDxwLWJ1dHRvbiBsYWJlbD1cIkNhbmNlbFwiIFt0ZXh0XT1cInRydWVcIiAob25DbGljayk9XCJkaXNwbGF5U2ltcGxpZnlEaWFsb2cgPSBmYWxzZVwiPjwvcC1idXR0b24+XG4gICAgPHAtYnV0dG9uIGxhYmVsPVwiQXBwbHlcIiBpY29uPVwicGkgcGktY2hlY2tcIiAob25DbGljayk9XCJzaW1wbGlmeVJlZ2lvbnMoc2ltcGxpZnlUaHJlc2hvbGQpXCI+PC9wLWJ1dHRvbj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvcC1kaWFsb2c+XG5cbiJdfQ==
1602
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsaXplci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Zpc3VhbGl6ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vc3JjL2xpYi92aXN1YWxpemVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQWlCLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWdDLFFBQVEsRUFBRSxNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6TSxPQUFPLEVBQW1CLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBWSxjQUFjLEVBQVksTUFBTSxhQUFhLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWxELE9BQU8sRUFBa0IsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFFLE9BQU8sRUFDTCxRQUFRLEVBRVIsVUFBVSxFQUNWLHVCQUF1QixHQUN4QixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNsRSxPQUFPLEVBQWlDLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxD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LElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QyxDQUFDOzhHQS9tRFUsbUJBQW1CLGtCQW9NcEIsZ0JBQWdCLGFBQ2hCLFVBQVUsd1FBU0UsVUFBVTtrR0E5TXJCLG1CQUFtQiwyWEMxQ2hDLDZzU0FpTEE7OzJGRHZJYSxtQkFBbUI7a0JBUC9CLFNBQVM7K0JBR0UsWUFBWTs7MEJBd01uQixNQUFNOzJCQUFDLGdCQUFnQjs7MEJBQ3ZCLE1BQU07MkJBQUMsVUFBVTs7MEJBU2pCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsVUFBVTt5Q0F0TWhDLFlBQVk7c0JBRFgsTUFBTTtnQkFHUCxnQkFBZ0I7c0JBRGYsTUFBTTtnQkFNSCxZQUFZO3NCQURmLEtBQUs7Z0JBY04sUUFBUTtzQkFEUCxLQUFLO2dCQXFDVyxXQUFXO3NCQUEzQixTQUFTO3VCQUFDLElBQUk7Z0JBdzVCZixTQUFTO3NCQURSLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBBZnRlclZpZXdJbml0LCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5qZWN0LCBJbnB1dCwgTmdab25lLCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTWVudUl0ZW0sIE1lc3NhZ2VTZXJ2aWNlLCBUcmVlTm9kZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IENvbnRleHRNZW51IH0gZnJvbSAncHJpbWVuZy9jb250ZXh0bWVudSc7XG5pbXBvcnQgeyBJSW1hZ2VJbmZvIH0gZnJvbSAnLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgSW1hZ2VTdGF0ZVBvcnQsIElNQUdFX1NUQVRFX1BPUlQgfSBmcm9tICcuL2NvbnRyYWN0cy9wb3J0cy9pbWFnZS1zdGF0ZS5wb3J0JztcbmltcG9ydCB7IFBvbHlnb24sIFJlY3RhbmdsZSwgTXVsdGlQb2x5Z29uLCBSZWdpb24gfSBmcm9tICcuL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgUmVnaW9uT3BzU2VydmljZSB9IGZyb20gJy4vcmVnaW9uLW9wcy5zZXJ2aWNlJztcbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlbmRlck9yY2hlc3RyYXRvciwgU2xpY2VTY3J1YmJlciB9IGZyb20gJy4vcmVuZGVyLW9yY2hlc3RyYXRvcic7XG5pbXBvcnQge1xuICBQbG90VHlwZSxcbiAgUGxvdFR5cGVEZXNjcmlwdG9yLFxuICBpc05hcGFyaTNkLFxuICBOQVBBUklfREVGQVVMVF9ERUNJTUFURSxcbn0gZnJvbSAnLi9jb250cmFjdHMvcGxvdC10eXBlJztcbmltcG9ydCB7IFZpZXdlckZlYXR1cmUgfSBmcm9tICcuL2NvbnRyYWN0cy9jYXBhYmlsaXRpZXMuY29udHJhY3QnO1xuaW1wb3J0IHsgSW50ZW5zaXR5UHJvZmlsZSwgSVZpc3VhbGl6ZXIsIFZJU1VBTElaRVIgfSBmcm9tICcuL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFNBTV9NT0RFTFMsIGdldERlZmF1bHRTYW1Nb2RlbElkLCBpc1NhbU1vZGVsUmVhZHkgfSBmcm9tICcuL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS1tb2RlbC1yZWdpc3RyeSc7XG5pbXBvcnQgeyBTYW1Ub29sU2VydmljZSB9IGZyb20gJy4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Qb2ludFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tcG9pbnQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxTZWdtZW50VG9vbFNlcnZpY2UgfSBmcm9tICcuL3Rvb2xiYXIvc2VnbWVudGF0aW9uL2NlbGwtc2VnbWVudC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVnaW9uVG9vbE1vZGUgfSBmcm9tICcuL2NvbnRyYWN0cy9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5pbXBvcnQgeyBUb29sYmFyVG9vbFZpc2liaWxpdHksIEFMTF9UT09MQkFSX1RPT0xTIH0gZnJvbSAnLi9jb250cmFjdHMvdG9vbGJhci1jb25maWcnO1xuaW1wb3J0IHsgVklaX0NPTkZJRywgVml6Q29uZmlnIH0gZnJvbSAnLi9jb250cmFjdHMvdml6LWNvbmZpZyc7XG5cbi8qKiBQZXItaW5zdGFuY2UgcGxvdC1kaXYgaWQgc291cmNlLiBUaGUgbW91bnQgZWxlbWVudCdzIGlkIG11c3QgYmUgdW5pcXVlIHNvIHR3b1xuICogIGxpdmUgdmlld2VycyAoZS5nLiB0aGUgbWFpbiBkaWFncmFtICsgYSBtb2RhbCBwcmV2aWV3KSBkb24ndCBjb2xsaWRlIG9uIHRoZVxuICogIHNhbWUgRE9NIGlkIOKAlCBgZ2V0RWxlbWVudEJ5SWRgIHdvdWxkIG90aGVyd2lzZSByZXR1cm4gd2hpY2hldmVyIGNhbWUgZmlyc3QuXG4gKiAgU3R5bGluZyBoYW5ncyBvZmYgdGhlIGAudml6LXBsb3RgIGNsYXNzIGluc3RlYWQgb2YgdGhlIGlkLiAqL1xubGV0IHBsb3RJbnN0YW5jZVNlcSA9IDA7XG5cbkBDb21wb25lbnQoe1xuICAvLyBDYW5vbmljYWwgcHJlZml4ZWQgc2VsZWN0b3IgZmlyc3Q7IHRoZSB1bnByZWZpeGVkIG9yaWdpbmFsIGlzIGtlcHQgYXMgYW5cbiAgLy8gYWxpYXMgZm9yIG9uZSByZWxlYXNlIChwcmUtcHVibGljYXRpb24gYmFjay1jb21wYXQpLlxuICBzZWxlY3RvcjogJ3Zpc3VhbGl6ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vdmlzdWFsaXplci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Zpc3VhbGl6ZXIuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVmlzdWFsaXplckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKiogUGVyLWluc3RhbmNlIHRvYXN0IGtleS4gTWVzc2FnZVNlcnZpY2UgaXMgYSBnbG9iYWwgc2luZ2xldG9uLCBzbyB0d28gbGl2ZVxuICAgKiAgYDx2aXN1YWxpemVyPmAgaW5zdGFuY2VzIChtYWluIHZpZXdlciArIHBpcGVsaW5lLWRpYWxvZyBwcmV2aWV3KSBzaGFyaW5nXG4gICAqICBvbmUga2V5IHdvdWxkIGVhY2ggcmVuZGVyIHRoZSBzYW1lIG1lc3NhZ2Ug4oCUIGEgZHVwbGljYXRlIHRvYXN0LiBBIHVuaXF1ZVxuICAgKiAga2V5IHBlciBpbnN0YW5jZSBzY29wZXMgdGhlIHRvYXN0IHRvIHRoZSBjb21wb25lbnQgdGhhdCByYWlzZWQgaXQuICovXG4gIHByaXZhdGUgc3RhdGljIG5leHRUb2FzdElkID0gMDtcblxuICBAT3V0cHV0KClcbiAgaXNTdGFja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSk7XG4gIEBPdXRwdXQoKVxuICBpc0dyYXlzY2FsZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSk7XG5cbiAgLyoqIFdoaWNoIHRvb2xiYXIgZ3JvdXBzIHRvIHNob3cuIEEgcGFydGlhbCBvdmVycmlkZSBtZXJnZXMgb3ZlciB0aGUgZnVsbCBzZXQsXG4gICAqICBzbyBgeyBzcGVjaWFsVG9vbHM6IGZhbHNlIH1gIGhpZGVzIG9ubHkgdGhhdCBncm91cC4gRGVmYXVsdHMgdG8gZXZlcnl0aGluZy4gKi9cbiAgQElucHV0KClcbiAgc2V0IHRvb2xiYXJUb29scyh2OiBUb29sYmFyVG9vbFZpc2liaWxpdHkgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl90b29sYmFyVG9vbHMgPSB7IC4uLkFMTF9UT09MQkFSX1RPT0xTLCAuLi4odiA/PyB7fSkgfTtcbiAgfVxuXG4gIGdldCB0b29sYmFyVG9vbHMoKTogUmVxdWlyZWQ8VG9vbGJhclRvb2xWaXNpYmlsaXR5PiB7XG4gICAgcmV0dXJuIHRoaXMuX3Rvb2xiYXJUb29scztcbiAgfVxuICBwcml2YXRlIF90b29sYmFyVG9vbHM6IFJlcXVpcmVkPFRvb2xiYXJUb29sVmlzaWJpbGl0eT4gPSBBTExfVE9PTEJBUl9UT09MUztcblxuICAvKiogRXhwb3NlIHRlc3Qtb25seSBwbG90IG1vZGVzIGluIHRoZSBzZWxlY3RvciAoZS5nLiB0aGUgbmFwYXJpIGBJbWFnZWBcbiAgICogIG1vZGUsIG90aGVyd2lzZSBoaWRkZW4pLiBUaGUgaG9zdCBhcHAgc2V0cyB0aGlzIGZyb20gYSBgP3Rlc3Q9MWAgVVJMXG4gICAqICB0b2dnbGUuIE9mZiBieSBkZWZhdWx0LCBzbyBwcm9kdWN0aW9uIHVzZXJzIG5ldmVyIHNlZSB0aGVtLiAqL1xuICBASW5wdXQoKVxuICB0ZXN0TW9kZSA9IGZhbHNlO1xuXG4gIC8qKiBJbWFnZS1zbW9vdGhpbmcgc3RhdGUgZm9yIHRoZSB0b29sYmFyJ3MgU21vb3RoZW4gdG9nZ2xlIChPU0Qgb25seSkuXG4gICAqICBEZWZhdWx0cyB0byBgZmFsc2VgIHNvIE9TRCBzaG93cyByYXcgcGl4ZWxzIChuZWFyZXN0LW5laWdoYm91cikuICovXG4gIGltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuICBsb2FkaW5nTWVzc2FnZSA9ICdMb2FkaW5nIGltYWdlLi4uJztcbiAgem9vbSA9IGZhbHNlO1xuICBmaWxlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGxvYWRlZEZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGltYWdlSW5mbzogSUltYWdlSW5mbyB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHVuc3ViID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBwcmV2aWV3U3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIHB1YmxpYyBzdGFja0xvYWRpbmcgPSBmYWxzZTtcbiAgcHVibGljIGltZ0xvYWRpbmcgPSBmYWxzZTtcbiAgcHVibGljIGxvYWRpbmdQZXJjZW50YWdlID0gMDtcbiAgLy8gTm9uLW51bGwgKDAuLjEwMCkgd2hpbGUgaml0LXNlcnZpY2UgaXMgY29weWluZyB0aGUgc291cmNlIGZpbGUgaW50byB0aGVcbiAgLy8gbG9jYWwgY2FjaGUgUFZDIG9uIGZpcnN0IGNsaWNrLiBXaGVuIHNldCwgdGhlIGxvYWRpbmcgb3ZlcmxheSBzd2FwcyB0aGVcbiAgLy8gc3Bpbm5lciBmb3IgYSBkZXRlcm1pbmF0ZSBwcm9ncmVzcyBiYXIgd2l0aCBhIFwiQ2FjaGluZyBpbWFnZVwiIG1lc3NhZ2UuXG4gIHB1YmxpYyBjYWNoZVByb2dyZXNzOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgLy8gVHJ1ZSBiZXR3ZWVuIHRoZSBzbWFsbC10aWVyIHJlbmRlciBsYW5kaW5nIGFuZCB0aGUgbGFyZ2UtdGllciByZW5kZXJcbiAgLy8gbGFuZGluZyBpbiB0aGUgbXVsdGktdGllciByZW5kZXJpbmcgcGF0aC4gVGhlIHRlbXBsYXRlIHVzZXMgdGhpcyB0b1xuICAvLyBvdmVybGF5IGEgdHJhbnNsdWNlbnQgc3Bpbm5lciBvbiB0b3Agb2YgdGhlIGJsdXJyeSBzbWFsbC10aWVyIGltYWdlIHNvXG4gIC8vIHRoZSB1c2VyIGRvZXNuJ3QgbWlzdGFrZSBpdCBmb3IgdGhlIGZpbmFsIHByZXZpZXcuXG4gIHB1YmxpYyBzaGFycGVuaW5nID0gZmFsc2U7XG4gIC8qKiBBIGppdC1zZXJ2aWNlIGNhY2hlIGNvcHkgaXMgYWN0aXZlbHkgaW4gcHJvZ3Jlc3MgKGRldGVybWluYXRlIDAuLjk5KS4gRHJpdmVzIHRoZSBjYWNoZVxuICAgKiAgcHJvZ3Jlc3MgYmFyIGluZGVwZW5kZW50bHkgb2YgYGltZ0xvYWRpbmdgIHNvIHRoZSBiYXIgY2FuJ3QgYmUgZHJvcHBlZCDigJQgb3IgbWFza2VkIGJ5IHRoZVxuICAgKiAgXCJTaGFycGVuaW5nIHByZXZpZXcuLi5cIiBvdmVybGF5IOKAlCBtaWQtZG93bmxvYWQgaWYgdGhlIGxvYWRpbmcgZmxhZyBmbGlwcyBlYXJseS4gKi9cbiAgZ2V0IGlzQ2FjaGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jYWNoZVByb2dyZXNzICE9PSBudWxsICYmIHRoaXMuY2FjaGVQcm9ncmVzcyA8IDEwMDtcbiAgfVxuICBwcml2YXRlIHJ1bm5pbmcgPSBmYWxzZTtcbiAgcHVibGljIHpJbmRleCA9IDA7XG4gIHB1YmxpYyBtYXhJbmRleCA9IDA7XG5cbiAgQFZpZXdDaGlsZCgnY20nKSBjb250ZXh0TWVudSE6IENvbnRleHRNZW51O1xuICBjb250ZXh0TWVudUl0ZW1zOiBNZW51SXRlbVtdID0gW107XG5cbiAgYWN0aXZlRHJhZ01vZGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBXaGV0aGVyIGEgcmVnaW9uIGFjdGlvbiBpcyBhdmFpbGFibGUgdG8gdW5kbyAoaml0LXVpIzg1KS4gTWlycm9ycyB0aGVcbiAgICogIHNoYXJlZCBSZWdpb25TdG9yZSdzIGhpc3RvcnkgZGVwdGg7IGRyaXZlcyB0aGUgdG9vbGJhciBVbmRvIGJ1dHRvbi4gKi9cbiAgY2FuVW5kb1JlZ2lvbiA9IGZhbHNlO1xuICAvKiogV2hldGhlciBhbiB1bmRvbmUgcmVnaW9uIGFjdGlvbiBpcyBhdmFpbGFibGUgdG8gcmVkbyAoaml0LXVpIzg1KS4gKi9cbiAgY2FuUmVkb1JlZ2lvbiA9IGZhbHNlO1xuXG4gIC8qKiBDdXN0b20tdGhyZXNob2xkIFNpbXBsaWZ5IGRpYWxvZyAoaml0LXVpIzg1KS4gKi9cbiAgZGlzcGxheVNpbXBsaWZ5RGlhbG9nID0gZmFsc2U7XG4gIHNpbXBsaWZ5VGhyZXNob2xkID0gMztcbiAgLyoqIEN1cnJlbnQgcmVnaW9uIHNlbGVjdGlvbiAoYXJyYXkgaW5kaWNlcykg4oCUIG1pcnJvcmVkIGZyb20gdGhlIHN0b3JlIHNvIHRoZVxuICAgKiAgY29udGV4dC1tZW51IHJlZ2lvbiBhY3Rpb25zIGNhbiByZWFkIGl0IHN5bmNocm9ub3VzbHkgKGppdC11aSM4NSkuICovXG4gIHByaXZhdGUgc2VsZWN0ZWRJbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuXG4gIC8qKiBXYW5kIHNlbnNpdGl2aXR5IOKAlCBoaWdoZXIgPSBzdHJpY3RlciAoc21hbGxlciBzZWxlY3Rpb24pLiBNYXRjaGVzIFF1UGF0aCBkZWZhdWx0LiAqL1xuICB3YW5kU2Vuc2l0aXZpdHkgPSAyLjA7XG4gIC8qKiBCcnVzaCBkaWFtZXRlciBpbiBpbWFnZS1waXhlbCBjb29yZGluYXRlcyAoZHJpdmVzIHRoZSBwYWludGVkIGRpc2Mgc2l6ZSkuICovXG4gIGJydXNoU2l6ZSA9IDQwO1xuICAvKiogU0FNIG1vZGVsIHBpY2tlciBvcHRpb25zICsgY3VycmVudCBzZWxlY3Rpb24gKGppdC11aSM5MCBQMSkuIE9ubHkgbW9kZWxzXG4gICAqICB3aXRoIGEgaG9zdGVkIE9OTlggcGFpciAoY29uZmlndXJlZCB2aWEgc2V0U2FtTW9kZWxVcmxzIGF0IGFwcCBpbml0KSBhcmVcbiAgICogIG9mZmVyZWQsIHNvIHRoZSBwaWNrZXIgY2FuJ3Qgc2VsZWN0IGEgbW9kZWwgdGhhdCBjYW4ndCBydW4uICovXG4gIHNhbU1vZGVscyA9IFNBTV9NT0RFTFMuZmlsdGVyKGlzU2FtTW9kZWxSZWFkeSkubWFwKChtKSA9PiAoeyBpZDogbS5pZCwgbGFiZWw6IG0ubGFiZWwgfSkpO1xuICBzYW1Nb2RlbElkID0gZ2V0RGVmYXVsdFNhbU1vZGVsSWQoKTtcbiAgLyoqIFNBTSBkb3dubG9hZC9zZWdtZW50IHRvYXN0IHN0YXRlIChib3VuZCBieSB0aGUgYHNhbWAgcC10b2FzdCB0ZW1wbGF0ZSkuICovXG4gIHNhbVN0YXR1cyA9ICcnO1xuICBzYW1Qcm9ncmVzcyA9IDA7IC8vIDAuLjEwMCwgZW5jb2RlciBkb3dubG9hZFxuICBzYW1Eb3dubG9hZGluZyA9IGZhbHNlO1xuICBzYW1CdXN5ID0gZmFsc2U7IC8vIGFueSBTQU0gd29yayBpbiBmbGlnaHQgKGRyaXZlcyB0aGUgaW5kZXRlcm1pbmF0ZSBzcGlubmVyKVxuICAvKiogV2hldGhlciB0aGUgc2hhcmVkIGBzYW1gIHRvYXN0IGlzIGN1cnJlbnRseSBzaG93biAoYXZvaWRzIHN0YWNraW5nIGl0IG9uXG4gICAqICBldmVyeSBwb2ludCBjbGljaywgd2hpY2ggcmUtcnVucyBpbmZlcmVuY2UpLiAqL1xuICBwcml2YXRlIHNhbVRvYXN0U2hvd24gPSBmYWxzZTtcblxuICByZWFkb25seSBzYW1Ub2FzdEtleSA9IGBzYW0tJHtWaXN1YWxpemVyQ29tcG9uZW50Lm5leHRUb2FzdElkKyt9YDtcbiAgLyoqIFN1YnNjcmlwdGlvbnMgdG8gdGhlIHBvaW50IHRvb2wncyBsaXZlIGZlZWRzIChzdGF0dXMvYnVzeS9kb3dubG9hZCkuICovXG4gIHByaXZhdGUgc2FtUG9pbnRTdWIgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIC8qKiBWZXJ0ZXggZXJhc2VyIHJhZGl1cyBpbiBpbWFnZS1waXhlbCBjb29yZGluYXRlcy4gKi9cbiAgdmVydGV4RXJhc2VyUmFkaXVzID0gMjA7XG5cbiAgY29sb3JtYXBzT3B0aW9ucyE6IGFueTtcbiAgcmV2ZXJzZXNjYWxlID0gZmFsc2U7XG4gIHNlbGVjdGVkQ29sb3JtYXAhOiBhbnk7XG4gIC8qKiBDaGFubmVscyAmIEhpc3RvZ3JhbSBkaWFsb2cgdmlzaWJpbGl0eSAob3BlbmVkIGZyb20gdGhlIHRvb2xiYXIpLiAqL1xuICBzaG93Q2hhbm5lbEhpc3RvZ3JhbSA9IGZhbHNlO1xuICAvKiogUmVnaW9uIEVkaXRvciBkaWFsb2cgdmlzaWJpbGl0eSAob3BlbmVkIGZyb20gdGhlIHRvb2xiYXIpLiAqL1xuICBzaG93UmVnaW9uRWRpdG9yID0gZmFsc2U7XG4gIC8qKiBSZWdpb24gRWRpdG9yIGRpYWxvZyB3aWR0aC4gT24gb3BlbiBpdCBpcyBzZXQgdG8gdGhlIGNvbmZpZ3VyZWQgaG9zdFxuICAgKiAgZWxlbWVudCdzIGN1cnJlbnQgd2lkdGgsIG9yIOKAlCB3aGVuIG5vIHNlbGVjdG9yIGlzIGNvbmZpZ3VyZWQgLyB0aGUgZWxlbWVudFxuICAgKiAgaXNuJ3QgZm91bmQg4oCUIHRvIGEgcXVhcnRlciBvZiB0aGUgcGFnZSAoc2VlIG9wZW5SZWdpb25FZGl0b3IpLiAqL1xuICByZWdpb25FZGl0b3JXaWR0aCA9ICcyNXZ3JztcbiAgc3RhY2tPcHRpb25zID0gW1xuICAgIHsgbmFtZTogJ1NpbmdsZSBpbWFnZScsIHZhbDogJ2ZhbHNlJyB9LFxuICAgIHsgbmFtZTogJ1N0YWNrJywgdmFsOiAndHJ1ZScgfSxcbiAgXTtcbiAgc2VsZWN0ZWRTdGFja09wdGlvbjogeyBuYW1lOiBzdHJpbmc7IHZhbDogc3RyaW5nIH0gfCB1bmRlZmluZWQgPSB0aGlzLnN0YWNrT3B0aW9uc1swXTtcbiAgcmVhZG9ubHkgcGxvdERpdk5hbWUgPSBgdml6LXBsb3QtJHtwbG90SW5zdGFuY2VTZXErK31gO1xuICBwbG90VHlwZSA9IFBsb3RUeXBlLklNQUdFO1xuICBpc0hlYXRtYXAgPSB0cnVlO1xuICBhY3RpdmVTdXJmYWNlM2RNb2RlID0gJ3R1cm50YWJsZSc7XG4gIC8qKiBXaGV0aGVyIHRoZSBuYXBhcmkgM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gaXMgc2hvd24gKHZvbHVtZS9pc29zdXJmYWNlKS4gKi9cbiAgYXhlc1Zpc2libGUgPSB0cnVlO1xuICB3aXJlZnJhbWVBY3RpdmUgPSBmYWxzZTtcbiAgLyoqIG5hcGFyaSAzRCBkZWNpbWF0ZSBmYWN0b3IgKDEgPSBGdWxsIOKApiA4ID0g4oWbOyBkZWZhdWx0IMK9KTsgY2hhbmdpbmcgaXQgcmUtcGxvdHMuICovXG4gIHJlc29sdXRpb25TY2FsZSA9IE5BUEFSSV9ERUZBVUxUX0RFQ0lNQVRFO1xuXG4gIC8qKiBQbG90IHR5cGVzIHRoZSBhY3RpdmUgYmFja2VuZCBhZHZlcnRpc2VzICgzRCBnYXRlZCBieSBjYXBhYmlsaXR5KS4gKi9cbiAgcGxvdFR5cGVPcHRpb25zOiBQbG90VHlwZURlc2NyaXB0b3JbXSA9IFtdO1xuICBzZWxlY3RlZFBsb3RUeXBlOiBQbG90VHlwZSA9IFBsb3RUeXBlLklNQUdFO1xuXG4gIC8qKiBGbG9hdGluZyBpbnRlbnNpdHktcHJvZmlsZSBpbnNldCAoTElORSBtb2RlKS4gKi9cbiAgcmVhZG9ubHkgaW50ZW5zaXR5SW5zZXREaXYgPSAnaW50ZW5zaXR5LWluc2V0LXBsb3QnO1xuICBwcm9maWxlUGFuZWxQb3MgPSB7IHg6IDIwLCB5OiA3MCB9O1xuICBwcml2YXRlIHByb2ZpbGVQYW5lbERyYWdnaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgcHJvZmlsZVBhbmVsU3RhcnQgPSB7IG14OiAwLCBteTogMCwgeDogMCwgeTogMCB9O1xuXG4gIC8qKiBUb29sYmFyIGRvY2tpbmc6IGRvY2tlZCBhY3Jvc3MgdGhlIHRvcCBieSBkZWZhdWx0OyBkcmFnZ2luZyBpdHMgaGFuZGxlXG4gICAqICBkZXRhY2hlcyBpdCBpbnRvIGEgZmxvYXRpbmcsIG1vdmFibGUgd2luZG93IChmcmVlcyB0aGUgdG9wIHJvdyBmb3IgdGhlXG4gICAqICB2aXN1YWxpemF0aW9uKS4gKi9cbiAgdG9vbGJhckZsb2F0aW5nID0gZmFsc2U7XG4gIHRvb2xiYXJQb3MgPSB7IHg6IDgsIHk6IDggfTtcbiAgcHJpdmF0ZSB0b29sYmFyRHJhZ2dpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSB0b29sYmFyU3RhcnQgPSB7IG14OiAwLCBteTogMCwgeDogMCwgeTogMCB9O1xuICBwcml2YXRlIGxhdGVzdFByb2ZpbGVzOiBJbnRlbnNpdHlQcm9maWxlW10gPSBbXTtcbiAgLyoqIERyaXZlcyB0aGUgaW50ZW5zaXR5IGluc2V0IHBhbmVsJ3MgdmlzaWJpbGl0eSDigJQgdHJ1ZSB3aGVuZXZlciBhbnlcbiAgICogIGludGVuc2l0eS1wcm9maWxlIGxpbmUgZXhpc3RzIChpbmRlcGVuZGVudCBvZiB0aGUgY3VycmVudCBwbG90IHR5cGUpLiAqL1xuICBoYXNQcm9maWxlcyA9IGZhbHNlO1xuICBwcml2YXRlIGludGVuc2l0eVByb2ZpbGVTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgdmlld3BvcnRDaGFuZ2VTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgcHJvZmlsZURyYWdNb3ZlTGlzdGVuZXI/OiAoZTogTW91c2VFdmVudCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBwcm9maWxlRHJhZ1VwTGlzdGVuZXI/OiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHByb2ZpbGVSZXNpemVMaXN0ZW5lcj86ICgpID0+IHZvaWQ7XG5cbiAgLyoqIExJTkUgcGxvdCB0eXBlIHNob3dzIHRoZSBpbWFnZSArIGRyYWdnYWJsZSBsaW5lIFJPSSArIGludGVuc2l0eSBpbnNldC4gKi9cbiAgZ2V0IGlzUHJvZmlsZU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRQbG90VHlwZSA9PT0gUGxvdFR5cGUuTElORTtcbiAgfVxuXG4gIC8qKiBUcnVlIGZvciB0aGUgSW1hZ2UgcGxvdCB0eXBlLCB3aGljaCByZW5kZXJzIGFzIGEgbmF0aXZlbHkgcGFuL3pvb20tYWJsZVxuICAgKiAgcmFzdGVyIOKAlCBzbyB0aGUgYmFja2VuZC1hZ25vc3RpYyB6b29tL3BhbiB0b29sYmFyIHRvb2xzIGFyZSBoaWRkZW4uIFRoZVxuICAgKiAgY29tcG9uZW50IGRyaXZlcyB0aGlzIG9mZiB0aGUgcGxvdCB0eXBlLCBub3QgdGhlIGFjdGl2ZSBiYWNrZW5kLiAqL1xuICBnZXQgaXNJbWFnZVZpZXcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRQbG90VHlwZSA9PT0gUGxvdFR5cGUuSU1BR0U7XG4gIH1cblxuICAvKiogSXNvc3VyZmFjZSBiYW5kIGFzIGEgMOKAkzI1NSBzbGlkZXIgcG9zaXRpb24sIG1hcHBlZCBvbnRvIHRoZSB2b2x1bWUncyByZWFsXG4gICAqICBpbnRlbnNpdHkgcmFuZ2UgYnkgdGhlIHJlbmRlcmVyLiBEZWZhdWx0cyB0byB0aGUgZnVsbCByYW5nZS4gKi9cbiAgaXNvUmFuZ2U6IG51bWJlcltdID0gWzAsIDI1NV07XG5cbiAgcGxvdFdpZHRoU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBpbWFnZUxvYWRpbmdTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIGltZ0xvYWRpbmdNZXNzYWdlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBpc1pvb21TdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIGZpbGVuYW1lU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBhdXRvc2NhbGVTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgcHJpdmF0ZSBwbG90Q29udGV4dE1lbnVMaXN0ZW5lcj86IChlOiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xuICBwcml2YXRlIGtleWRvd25MaXN0ZW5lcj86IChlOiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkO1xuICBwcml2YXRlIHdoZWVsTGlzdGVuZXI/OiAoZTogV2hlZWxFdmVudCkgPT4gdm9pZDtcblxuICAvKiogRGVib3VuY2VkIHotc2xpY2Ugc2NydWJiaW5nIChzZWUgU2xpY2VTY3J1YmJlciDigJQgcmVmYWN0b3JpbmcgcGxhbiBTdGVwIDcpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNjcnViYmVyID0gbmV3IFNsaWNlU2NydWJiZXIoKHopID0+IHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFpJbmRleCh6KTtcbiAgICAvLyBJbiBhIHBlci1zbGljZSB6LXN0YWNrIHNlc3Npb24gdGhlIHN0b3JlIHN3YXBzIHRoZSBsaXZlIHJlZ2lvbiBzZXQgdG8gdGhpc1xuICAgIC8vIHNsaWNlIChwcmVzZXJ2aW5nIGVkaXRzIG1hZGUgb24gdGhlIHByZXZpb3VzIG9uZSk7IG91dHNpZGUgc3RhY2sgbW9kZSB0aGlzXG4gICAgLy8ganVzdCByZWNvcmRzIHRoZSBzbGljZSwgbGVhdmluZyBzaW5nbGUtcGxhbmUgcmVnaW9ucyB1bnRvdWNoZWQgKGppdC11aSM5MykuXG4gICAgdGhpcy5wbG90U2VydmljZS5zZXREaXNwbGF5U2xpY2Uoeik7XG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoSU1BR0VfU1RBVEVfUE9SVCkgcHJpdmF0ZSBzdGF0ZTogSW1hZ2VTdGF0ZVBvcnQsXG4gICAgQEluamVjdChWSVNVQUxJWkVSKSBwdWJsaWMgcGxvdFNlcnZpY2U6IElWaXN1YWxpemVyLFxuICAgIHB1YmxpYyBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBzZXNzaW9uOiBWaXN1YWxpemVyU3RvcmUsXG4gICAgcHJpdmF0ZSBzYW1Ub29sOiBTYW1Ub29sU2VydmljZSxcbiAgICBwcml2YXRlIGNlbGxTZWdtZW50VG9vbDogQ2VsbFNlZ21lbnRUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHNhbVBvaW50VG9vbDogU2FtUG9pbnRUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHJlZ2lvbk9wczogUmVnaW9uT3BzU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFZJWl9DT05GSUcpIHByaXZhdGUgdml6Q29uZmlnPzogVml6Q29uZmlnLFxuICApIHtcbiAgICB0aGlzLmNvbG9ybWFwc09wdGlvbnMgPSBwbG90U2VydmljZS5nZXRDb2xvcm1hcE9wdGlvbnMoKTtcbiAgICB0aGlzLmNvbXB1dGVQbG90VHlwZU9wdGlvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbG90IHR5cGVzIG9mZmVyZWQgaW4gdGhlIHNlbGVjdG9yIGZvciB0aGUgY3VycmVudCBpbWFnZTpcbiAgICogIC0gT3V0c2lkZSAqKnRlc3QgbW9kZSoqLCBvbmx5IHRoZSBjdXJhdGVkIGRlZmF1bHQgc2V0IChkZXNjcmlwdG9ycyB3aXRoIGFcbiAgICogICAgYHByb2R1Y3Rpb25MYWJlbGApIGlzIG9mZmVyZWQsIHNob3duIHVuZGVyIHN1ZmZpeC1mcmVlIG5hbWVzIOKAlCBJbWFnZSxcbiAgICogICAgSGVhdG1hcCwgQ29udG91ciBhbmQgdGhlIG5hcGFyaSBTdXJmYWNlIC8gVm9sdW1lIC8gSXNvc3VyZmFjZS4gVGVzdCBtb2RlXG4gICAqICAgIGV4cG9zZXMgZXZlcnkgYmFja2VuZCdzIHR5cGUgdW5kZXIgaXRzIGZ1bGwgKGJhY2tlbmQtc3VmZml4ZWQpIGxhYmVsLlxuICAgKiAgLSAzRCB0eXBlcyBoaWRkZW4gd2hlbiB0aGUgYmFja2VuZCBjYW4ndCByZW5kZXIgYSAzRCBzY2VuZS5cbiAgICogIC0gc3RhY2stb25seSB0eXBlcyAodm9sdW1lLCBpc29zdXJmYWNlKSBoaWRkZW4gdW5sZXNzIHRoZSBmaWxlIGlzIGEgc3RhY2sg4oCUXG4gICAqICAgIGEgdm9sdW1lIG5lZWRzIG11bHRpcGxlIHotc2xpY2VzLlxuICAgKiAgLSBzY2FsYXItaW50ZW5zaXR5IHR5cGVzIChjb250b3VyLCBzdXJmYWNlLCBpc29zdXJmYWNlKSBoaWRkZW4gZm9yIFJHQlxuICAgKiAgICBpbWFnZXMg4oCUIHRoZXkgbWFwIGEgc2luZ2xlIGludGVuc2l0eSBwZXIgcGl4ZWwuIEltYWdlIGFuZCBIZWF0bWFwIHJlbmRlclxuICAgKiAgICBhbnkgaW1hZ2UuXG4gICAqL1xuICBwcml2YXRlIGNvbXB1dGVQbG90VHlwZU9wdGlvbnMoKSB7XG4gICAgY29uc3QgY2FwcyA9IHRoaXMucGxvdFNlcnZpY2UuY2FwYWJpbGl0aWVzO1xuICAgIGNvbnN0IGlzU3RhY2sgPSAhIXRoaXMuaW1hZ2VJbmZvPy5pc1N0YWNrO1xuICAgIGNvbnN0IGlzR3JheXNjYWxlID0gISF0aGlzLmltYWdlSW5mbz8uaXNHcmF5c2NhbGU7XG4gICAgLy8gQSBtdWx0aWNoYW5uZWwgaW1hZ2UncyBiYW5kcyBhcmUgZWFjaCBzaW5nbGUtYmFuZCAoc2NhbGFyKSwgc28gdGhlIHNjYWxhclxuICAgIC8vIHBsb3QgbW9kZXMgKEhlYXRtYXAgLyBTdXJmYWNlIC8gVm9sdW1lIC8gSXNvc3VyZmFjZSkgYXBwbHkgcGVyIGNoYW5uZWwgZXZlblxuICAgIC8vIHRob3VnaCB0aGUgUkdCIGNvbXBvc2l0ZSBpc24ndCBncmF5c2NhbGUg4oCUIGRvbid0IGdhdGUgdGhlbSBvdXQuXG4gICAgY29uc3QgbTAgPSB0aGlzLmltYWdlSW5mbz8uaW1hZ2VNZXRhPy5bMF07XG4gICAgY29uc3QgaXNNdWx0aWNoYW5uZWwgPSAobTA/LmNoYW5uZWxDb3VudCA/PyAxKSA+IDEgJiYgKG0wPy5yZ2JDaGFubmVscyA/PyAxKSA8IDM7XG4gICAgdGhpcy5wbG90VHlwZU9wdGlvbnMgPSB0aGlzLnBsb3RTZXJ2aWNlLmdldFBsb3RUeXBlRGVzY3JpcHRvcnMoKVxuICAgICAgLmZpbHRlcigoZCkgPT4ge1xuICAgICAgICAvLyBPdXRzaWRlIHRlc3QgbW9kZSwgb25seSB0aGUgY3VyYXRlZCBzZXQgKHRob3NlIHdpdGggYSBwcm9kdWN0aW9uTGFiZWwpXG4gICAgICAgIC8vIGlzIG9mZmVyZWQ7IHRlc3QgbW9kZSBleHBvc2VzIGV2ZXJ5IGJhY2tlbmQncyB0eXBlLlxuICAgICAgICBpZiAoIXRoaXMudGVzdE1vZGUgJiYgIWQucHJvZHVjdGlvbkxhYmVsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkLmRpbWVuc2lvbnMgPT09ICczZCcgJiYgIWNhcHMuaGFzKFZpZXdlckZlYXR1cmUuU3VyZmFjZTNEKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZC5yZXF1aXJlc1N0YWNrICYmICFpc1N0YWNrKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkLnJlcXVpcmVzR3JheXNjYWxlICYmICFpc0dyYXlzY2FsZSAmJiAhaXNNdWx0aWNoYW5uZWwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KVxuICAgICAgLy8gRGVmYXVsdCBzZWxlY3RvciBzaG93cyB0aGUgc3VmZml4LWZyZWUgcHJvZHVjdGlvbkxhYmVsOyB0ZXN0IG1vZGUga2VlcHNcbiAgICAgIC8vIHRoZSBmdWxsIGJhY2tlbmQtc3VmZml4ZWQgbGFiZWwgc28gc2FtZS1uYW1lZCBtb2RlcyBzdGF5IGRpc3Rpbmd1aXNoYWJsZS5cbiAgICAgIC5tYXAoKGQpID0+ICh0aGlzLnRlc3RNb2RlID8gZCA6IHsgLi4uZCwgbGFiZWw6IGQucHJvZHVjdGlvbkxhYmVsISB9KSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgLy8gVGhlIGNvbnN0cnVjdG9yIGNvbXB1dGVzIHRoZSBvcHRpb25zIHdpdGggdGVzdE1vZGUgc3RpbGwgYXQgaXRzIGRlZmF1bHQ7XG4gICAgLy8gcmVjb21wdXRlIG9uY2UgdGhlIGhvc3QgYmluZHMgaXQgKGFuZCBvbiBhbnkgbGF0ZXIgY2hhbmdlKSBzbyB0aGUgc2VsZWN0b3JcbiAgICAvLyByZWZsZWN0cyB0ZXN0IG1vZGUgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBmb3IgYW4gaW1hZ2UgdG8gKHJlKWxvYWQuXG4gICAgaWYgKGNoYW5nZXNbJ3Rlc3RNb2RlJ10pIHtcbiAgICAgIHRoaXMuY29tcHV0ZVBsb3RUeXBlT3B0aW9ucygpO1xuICAgICAgLy8gSWYgdGVzdCBtb2RlIGlzIHR1cm5lZCBvZmYgd2hpbGUgYSB0ZXN0LW9ubHkgdHlwZSAoZS5nLiBOQVBBUklfSU1BR0UpIGlzXG4gICAgICAvLyBhY3RpdmUsIHRoYXQgdHlwZSBpcyBubyBsb25nZXIgb2ZmZXJlZCDigJQgZmFsbCBiYWNrIHRvIEltYWdlLlxuICAgICAgdGhpcy5yZWNvbmNpbGVTZWxlY3RlZFBsb3RUeXBlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIElmIHRoZSBhY3RpdmUgcGxvdCB0eXBlIGlzIG5vIGxvbmdlciBpbiB0aGUgb2ZmZXJlZCBvcHRpb25zIChlLmcuIHRlc3QgbW9kZVxuICAgKiAgdHVybmVkIG9mZiB3aGlsZSBhIHRlc3Qtb25seSB0eXBlIHdhcyBhY3RpdmUsIG9yIGEgc2NhbGFyIHR5cGUgY2FycmllZCBvbnRvXG4gICAqICBhbiBSR0IgaW1hZ2UpLCBmYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgMkQgSW1hZ2Ugdmlldy4gKi9cbiAgcHJpdmF0ZSByZWNvbmNpbGVTZWxlY3RlZFBsb3RUeXBlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wbG90VHlwZU9wdGlvbnMuc29tZSgoZCkgPT4gZC50eXBlID09PSB0aGlzLnNlbGVjdGVkUGxvdFR5cGUpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUGxvdFR5cGUgPSBQbG90VHlwZS5JTUFHRTtcbiAgICAgIHRoaXMucGxvdFR5cGUgPSBQbG90VHlwZS5JTUFHRTtcbiAgICAgIHRoaXMuaXNIZWF0bWFwID0gdHJ1ZTtcbiAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0UGxvdFR5cGUoUGxvdFR5cGUuSU1BR0UpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUuc2V0RGlhZ3JhbSh0aGlzKTtcbiAgICB0aGlzLnNlbGVjdGVkQ29sb3JtYXAgPVxuICAgICAgdGhpcy5jb2xvcm1hcHNPcHRpb25zWzBdLmNoaWxkcmVuLmZpbmQoKGM6IGFueSkgPT4gYy5sYWJlbCA9PT0gJ0dyZXlzIEludicpID8/XG4gICAgICB0aGlzLmNvbG9ybWFwc09wdGlvbnNbMF0uY2hpbGRyZW5bMF07XG4gICAgdGhpcy5zdGFja09wdGlvbnMgPSBbXG4gICAgICB7IG5hbWU6ICdTaW5nbGUgaW1hZ2UnLCB2YWw6ICdmYWxzZScgfSxcbiAgICAgIHsgbmFtZTogJ1N0YWNrJywgdmFsOiAndHJ1ZScgfSxcbiAgICBdO1xuICAgIHRoaXMuc2VsZWN0ZWRTdGFja09wdGlvbiA9IHRoaXMuc3RhY2tPcHRpb25zWzBdO1xuICAgIHRoaXMuYXV0b3NjYWxlU3Vic2NyaXB0aW9uID0gdGhpcy5wbG90U2VydmljZS5nZXRBdXRvc2NhbGVFdmVudCgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAvLyByZXNldCB0aGUgaW1hZ2UgbW9kZSB0byBzaW5nbGUgaW1hZ2VcbiAgICAgIHRoaXMuc2VsZWN0ZWRTdGFja09wdGlvbiA9IHsgbmFtZTogJ1NpbmdsZSBpbWFnZScsIHZhbDogJ2ZhbHNlJyB9O1xuICAgICAgdGhpcy5hY3RpdmVEcmFnTW9kZSA9IG51bGw7XG4gICAgICB0aGlzLnNlc3Npb24uc2V0QWN0aXZlVG9vbChudWxsKTtcbiAgICB9KTtcbiAgICB0aGlzLmltYWdlTG9hZGluZ1N1YnNjcmlwdGlvbiA9IHRoaXMuc3RhdGUuaXNJbWFnZUxvYWRpbmckKCkuc3Vic2NyaWJlKChpc0ltYWdlTG9hZGluZykgPT4ge1xuICAgICAgdGhpcy5pbWdMb2FkaW5nID0gaXNJbWFnZUxvYWRpbmc7XG4gICAgfSk7XG4gICAgLy8gVW5kbyBhdmFpbGFiaWxpdHkgKGppdC11aSM4NSk6IHRoZSBzaGFyZWQgUmVnaW9uU3RvcmUgZW1pdHMgd2hlbmV2ZXIgaXRzXG4gICAgLy8gaGlzdG9yeSBkZXB0aCBjaGFuZ2VzOyBncmV5cyBvdXQgdGhlIHRvb2xiYXIgVW5kbyBidXR0b24gYWNjb3JkaW5nbHkuXG4gICAgdGhpcy5wbG90U2VydmljZVxuICAgICAgLmdldENhblVuZG8kKClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3ViKSlcbiAgICAgIC5zdWJzY3JpYmUoKGNhblVuZG8pID0+IHtcbiAgICAgICAgdGhpcy5jYW5VbmRvUmVnaW9uID0gY2FuVW5kbztcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgdGhpcy5wbG90U2VydmljZVxuICAgICAgLmdldENhblJlZG8kKClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3ViKSlcbiAgICAgIC5zdWJzY3JpYmUoKGNhblJlZG8pID0+IHtcbiAgICAgICAgdGhpcy5jYW5SZWRvUmVnaW9uID0gY2FuUmVkbztcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgLy8gTWlycm9yIHRoZSByZWdpb24gc2VsZWN0aW9uIHNvIHRoZSByaWdodC1jbGljayBhY3Rpb24gZ3JvdXAgKGppdC11aSM4NSlcbiAgICAvLyBjYW4gcmVhZCBpdCBzeW5jaHJvbm91c2x5IHdoZW4gdGhlIG1lbnUgaXMgYnVpbHQuXG4gICAgdGhpcy5wbG90U2VydmljZVxuICAgICAgLmdldFNlbGVjdGVkU2hhcGVJbmRpY2VzJCgpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YikpXG4gICAgICAuc3Vic2NyaWJlKChpbmRpY2VzKSA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRpY2VzID0gaW5kaWNlcyB8fCBbXTtcbiAgICAgIH0pO1xuICAgIC8vIEludGVyYWN0aXZlIHBvaW50LXByb21wdCBzZWdtZW50YXRpb24gcnVucyBpbnNpZGUgdGhlIHJlbmRlcmVyIG9uIGVhY2hcbiAgICAvLyBjbGljazsgc3VyZmFjZSBpdHMgbGl2ZSBzdGF0dXMgKyBkb3dubG9hZCBwcm9ncmVzcyBpbiB0aGUgc2hhcmVkIGBzYW1gXG4gICAgLy8gdG9hc3Qgc28gdGhlIHVzZXIgc2VlcyBpdCB3b3JraW5nICh0aGUgZmlyc3QgY2xpY2sgcHVsbHMgdGhlIGVuY29kZXIpLlxuICAgIHRoaXMuc2FtUG9pbnRTdWIuYWRkKFxuICAgICAgdGhpcy5zYW1Qb2ludFRvb2wucHJvZ3Jlc3MkLnN1YnNjcmliZSgoZikgPT4ge1xuICAgICAgICB0aGlzLnNhbURvd25sb2FkaW5nID0gZiA+PSAwICYmIGYgPCAxO1xuICAgICAgICBpZiAoZiA+PSAwKSB0aGlzLnNhbVByb2dyZXNzID0gTWF0aC5taW4oMTAwLCBNYXRoLnJvdW5kKGYgKiAxMDApKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB0aGlzLnNhbVBvaW50U3ViLmFkZChcbiAgICAgIHRoaXMuc2FtUG9pbnRUb29sLnN0YXR1cyQuc3Vic2NyaWJlKChtKSA9PiB7XG4gICAgICAgIHRoaXMuc2FtU3RhdHVzID0gbTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB0aGlzLnNhbVBvaW50U3ViLmFkZChcbiAgICAgIHRoaXMuc2FtUG9pbnRUb29sLmJ1c3kkLnN1YnNjcmliZSgoYnVzeSkgPT4ge1xuICAgICAgICB0aGlzLnNhbUJ1c3kgPSBidXN5O1xuICAgICAgICBpZiAoYnVzeSkgdGhpcy5zaG93U2FtVG9hc3QoJ1NBTSBwb2ludCBzZWdtZW50YXRpb24nKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldFN0YWNrTG9hZGluZ1Byb2dyZXNzKCkuc3Vic2NyaWJlKChsb2FkaW5nUHJvZ3Jlc3MpID0+IHtcbiAgICAgIHRoaXMubG9hZGluZ1BlcmNlbnRhZ2UgPSBsb2FkaW5nUHJvZ3Jlc3M7XG4gICAgfSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5pc1N0YWNrTG9hZGluZygpLnN1YnNjcmliZSgoc3RhY2tMb2FkaW5nKSA9PiB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZyA9IHN0YWNrTG9hZGluZztcbiAgICB9KTtcbiAgICB0aGlzLnBsb3RXaWR0aFN1YnNjcmlwdGlvbiA9IHRoaXMuc3RhdGUuZ2V0UGFuZWxXaWR0aCQoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5wbG90U2VydmljZS5yZWxheW91dCgpO1xuICAgICAgLy8gVGhlIGludGVuc2l0eSBpbnNldCBpcyBhIHNlcGFyYXRlIFBsb3RseSBjaGFydCBpbiBhIGZsb2F0aW5nIHBhbmVsOyByZWZsb3dcbiAgICAgIC8vIGl0IHRvIGl0cyBjdXJyZW50IHNpemUgd2hlbiB0aGUgY2FudmFzIHJlc2l6ZXMsIGVsc2UgaXQga2VlcHMgdGhlIHN0YWxlXG4gICAgICAvLyBzaXplIGFuZCBibGFua3Mgb3V0LiBEZWZlciBhIHRpY2sgc28gdGhlIHBhbmVsIGxheW91dCBoYXMgc2V0dGxlZC5cbiAgICAgIGlmICh0aGlzLmhhc1Byb2ZpbGVzKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZW5kZXJJbnRlbnNpdHlJbnNldCgpLCAwKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmltZ0xvYWRpbmdNZXNzYWdlU3Vic2NyaXB0aW9uID0gdGhpcy5zdGF0ZS5nZXRJbWFnZUxvYWRpbmdNZXNzYWdlJCgpLnN1YnNjcmliZSgobWVzc2FnZSkgPT4ge1xuICAgICAgdGhpcy5sb2FkaW5nTWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgfSk7XG4gICAgdGhpcy5zdGF0ZVxuICAgICAgLmdldENhY2hlUHJvZ3Jlc3MkKClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3ViKSlcbiAgICAgIC5zdWJzY3JpYmUoKHByb2dyZXNzKSA9PiB7XG4gICAgICAgIHRoaXMuY2FjaGVQcm9ncmVzcyA9IHByb2dyZXNzO1xuICAgICAgfSk7XG4gICAgdGhpcy5pc1pvb21TdWJzY3JpcHRpb24gPSB0aGlzLnN0YXRlLmlzWm9vbSQoKS5zdWJzY3JpYmUoKHpvb20pID0+IHtcbiAgICAgIHRoaXMuem9vbSA9IHpvb207XG4gICAgfSk7XG4gICAgdGhpcy5maWxlbmFtZVN1YnNjcmlwdGlvbiA9IHRoaXMuc3RhdGUuZ2V0RmlsZW5hbWUkKCkuc3Vic2NyaWJlKChmaWxlbmFtZSkgPT4ge1xuICAgICAgaWYgKGZpbGVuYW1lKSB7XG4gICAgICAgIHRoaXMuZmlsZU5hbWUgPSBmaWxlbmFtZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldENvbG9ybWFwKCkuc3Vic2NyaWJlKChjb2xvcm1hcCkgPT4ge1xuICAgICAgdGhpcy5zZWxlY3RlZENvbG9ybWFwID0gY29sb3JtYXA7XG4gICAgfSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5nZXRSZXZlcnNlU2NhbGUoKS5zdWJzY3JpYmUoKHJldmVyc2VzY2FsZSkgPT4ge1xuICAgICAgdGhpcy5yZXZlcnNlc2NhbGUgPSByZXZlcnNlc2NhbGU7XG4gICAgfSk7XG4gICAgdGhpcy5pbnRlbnNpdHlQcm9maWxlU3ViID0gdGhpcy5wbG90U2VydmljZS5nZXRJbnRlbnNpdHlQcm9maWxlJCgpLnN1YnNjcmliZSgocHJvZmlsZXMpID0+IHtcbiAgICAgIHRoaXMubGF0ZXN0UHJvZmlsZXMgPSBwcm9maWxlcztcbiAgICAgIHRoaXMuaGFzUHJvZmlsZXMgPSBwcm9maWxlcy5sZW5ndGggPiAwO1xuICAgICAgLy8gVGhlIHBhbmVsIGRpdiBpcyBiZWhpbmQgKm5nSWY9XCJoYXNQcm9maWxlc1wiLiBkZXRlY3RDaGFuZ2VzKCkgbWF0ZXJpYWxpemVzXG4gICAgICAvLyBpdCBzeW5jaHJvbm91c2x5ICh0aGUgc3Vic2NyaXB0aW9uIG1heSBmaXJlIG91dHNpZGUgQW5ndWxhcidzIHpvbmUg4oCUIGUuZy5cbiAgICAgIC8vIGZyb20gYW4gT1NEIGRyYWcg4oCUIHNvIENEIHdvdWxkbid0IHJ1biBvbiBpdHMgb3duKS4gVGhlbiByZW5kZXIgb24gdGhlIG5leHRcbiAgICAgIC8vIGFuaW1hdGlvbiBmcmFtZSwgQUZURVIgdGhlIGJyb3dzZXIgbGF5cyB0aGUgcGFuZWwgb3V0OiBhIHN5bmNocm9ub3VzIGRyYXdcbiAgICAgIC8vIGhpdHMgYSB6ZXJvLXNpemUgY29udGFpbmVyIG9uIGZpcnN0IGNyZWF0ZSBhbmQgUGxvdGx5IGtlZXBzIHRoYXQgc2l6ZSwgc29cbiAgICAgIC8vIHRoZSBpbnNldCBzdGF5cyBibGFuayBhbmQgbGl2ZSB1cGRhdGVzIHJlZHJhdyBpbnRvIHRoZSBzYW1lIHplcm8gYm94LlxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMucmVuZGVySW50ZW5zaXR5SW5zZXQoKSk7XG4gICAgfSk7XG4gICAgLy8gV2hlbiB0aGUgT1NEIHZpZXcgc2V0dGxlcyBhdCBhIG5ldyB6b29tL3BhbiwgcmUtc2FtcGxlIHRoZSBpbnRlbnNpdHkgbGluZXNcbiAgICAvLyBmcm9tIGEgY3JvcCBvZiB0aGUgdmlzaWJsZSByZWdpb24gc28gdGhlIGluc2V0IHJlZmxlY3RzIHRoZSB6b29tLWxldmVsXG4gICAgLy8gcmVzb2x1dGlvbiAoUGxvdGx5J3Mgb3duIGhpZ2gtZGVmIHpvb20gdXBkYXRlcyB0aGUgc2FtcGxpbmcgY2FjaGUgaW5saW5lKS5cbiAgICB0aGlzLnZpZXdwb3J0Q2hhbmdlU3ViID0gdGhpcy5wbG90U2VydmljZS5nZXRWaWV3cG9ydENoYW5nZSQoKS5zdWJzY3JpYmUoKHJvaSkgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzUHJvZmlsZXMgJiYgdGhpcy5pc0ltYWdlVmlldykge1xuICAgICAgICB0aGlzLnBsb3RTZXJ2aWNlLnJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaShyb2kueCwgcm9pLnksIHJvaS53aWR0aCwgcm9pLmhlaWdodCwgdGhpcy56SW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucHJldmlld1N1YnNjcmlwdGlvbiA9IHRoaXMuc3RhdGUuZ2V0SW1hZ2VJbmZvJCgpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoaW1nSW5mbykgPT4ge1xuICAgICAgICBpZiAoaW1nSW5mbykge1xuICAgICAgICAgIHRoaXMuaW1hZ2VJbmZvID0gaW1nSW5mbztcbiAgICAgICAgICAvLyBTdGFjay1vbmx5IHBsb3QgdHlwZXMgKGlzb3N1cmZhY2UsIHNjYXR0ZXIzZCkgZGVwZW5kIG9uIHdoZXRoZXIgdGhpc1xuICAgICAgICAgIC8vIGZpbGUgaXMgYSBzdGFjayDigJQgcmVjb21wdXRlIHRoZSBzZWxlY3RvciBvcHRpb25zLlxuICAgICAgICAgIHRoaXMuY29tcHV0ZVBsb3RUeXBlT3B0aW9ucygpO1xuICAgICAgICAgIC8vIElmIHRoZSBhY3RpdmUgcGxvdCB0eXBlIGlzbid0IHZhbGlkIGZvciB0aGlzIGltYWdlIChlLmcuIGEgc2NhbGFyXG4gICAgICAgICAgLy8gdHlwZSBsaWtlIENvbnRvdXIgY2FycmllZCBvdmVyIHRvIGFuIFJHQiBpbWFnZSksIGZhbGwgYmFjayB0byBJbWFnZS5cbiAgICAgICAgICB0aGlzLnJlY29uY2lsZVNlbGVjdGVkUGxvdFR5cGUoKTtcbiAgICAgICAgICAvLyByZXNldCBzdGFjayBvcHRpb25zIHNlbGVjdGlvblxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdGFja09wdGlvbiA9IGltZ0luZm8uc2hvd1N0YWNrID8gdGhpcy5zdGFja09wdGlvbnNbMV0gOiB0aGlzLnN0YWNrT3B0aW9uc1swXTtcblxuICAgICAgICAgIHRoaXMuaXNHcmF5c2NhbGVFdmVudC5lbWl0KHRoaXMuaW1hZ2VJbmZvLmlzR3JheXNjYWxlKTtcbiAgICAgICAgICB0aGlzLmlzU3RhY2tFdmVudC5lbWl0KHRoaXMuaW1hZ2VJbmZvLmlzU3RhY2spO1xuICAgICAgICAgIC8vIFJlc2V0IHRvIHRoZSBkZWZhdWx0IDJEIEltYWdlIHZpZXcgd2hlbiBhIGRpZmZlcmVudCBpbWFnZSBpc1xuICAgICAgICAgIC8vIHNlbGVjdGVkIHdoaWxlIGEgM0QgdHlwZSBpcyBhY3RpdmUuXG4gICAgICAgICAgaWYgKCF0aGlzLmlzSGVhdG1hcCAmJiBpbWdJbmZvLmZpbGVOYW1lICE9PSB0aGlzLmxvYWRlZEZpbGVOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmlzSGVhdG1hcCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnBsb3RUeXBlID0gUGxvdFR5cGUuSU1BR0U7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGxvdFR5cGUgPSBQbG90VHlwZS5JTUFHRTtcbiAgICAgICAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0UGxvdFR5cGUodGhpcy5wbG90VHlwZSk7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVN1cmZhY2UzZE1vZGUgPSAndHVybnRhYmxlJztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5sb2FkZWRGaWxlTmFtZSA9IGltZ0luZm8uZmlsZU5hbWU7XG4gICAgICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRJbWFnZU1ldGEodGhpcy5pbWFnZUluZm8uaW1hZ2VNZXRhKTtcbiAgICAgICAgICBjb25zdCB1cmxzID0gaW1nSW5mby51cmxzO1xuICAgICAgICAgIGlmICghdGhpcy5ydW5uaW5nKSB7XG4gICAgICAgICAgICAvLyBpbWFnZSBzaXplIOKAlCBtZWFzdXJlIHRoZSBwbG90IGRpdiBkaXJlY3RseSBzbyB0aGUgdG9vbGJhciBoZWlnaHQgaXMgZXhjbHVkZWRcbiAgICAgICAgICAgIGNvbnN0IHBsb3REaXY6IEhUTUxFbGVtZW50IHwgbnVsbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdk5hbWUpO1xuICAgICAgICAgICAgY29uc3Qgc2NyZWVuSGVpZ2h0ID0gcGxvdERpdj8ub2Zmc2V0SGVpZ2h0IHx8IDUwMDtcbiAgICAgICAgICAgIGlmICh1cmxzKSB7XG4gICAgICAgICAgICAgIHRoaXMucGxvdFNlcnZpY2UucmVzZXQoKTtcbiAgICAgICAgICAgICAgdGhpcy5zdGFja0xvYWRpbmcgPSBpbWdJbmZvLmlzU3RhY2sgJiYgaW1nSW5mby5zaG93U3RhY2s7XG4gICAgICAgICAgICAgIC8vIHNldCBtYXggaW5kZXggb2Ygc3RhY2sg4oCUIGNvbXB1dGVkIGJlZm9yZSB1cGRhdGVaSW5kZXggc28gYVxuICAgICAgICAgICAgICAvLyBmcmVzaCBzdGFjayAoc2hvcnRlciBvciBsb25nZXIgdGhhbiB3aGF0ZXZlciB3YXMgcHJldmlvdXNseVxuICAgICAgICAgICAgICAvLyBsb2FkZWQpIGNsYW1wcyBhZ2FpbnN0IElUUyBib3VuZHMsIG5vdCB0aGUgc3RhbGUgb25lcy5cbiAgICAgICAgICAgICAgLy8gT25lIFVSTCBwZXIgc2xpY2UgKDAtaW5kZXhlZCksIHNvIHRoZSBsYXN0IHJlYWNoYWJsZSBpbmRleCBpc1xuICAgICAgICAgICAgICAvLyBsZW5ndGgtMSDigJQgZWFybGllciBgbGVuZ3RoLTJgIGRyb3BwZWQgdGhlIGZpbmFsIHNsaWNlLlxuICAgICAgICAgICAgICB0aGlzLm1heEluZGV4ID0gdXJscy5sZW5ndGggPiAxID8gdXJscy5sZW5ndGggLSAxIDogMDtcbiAgICAgICAgICAgICAgLy8gT25lLXNob3QgaGludDoganVtcCBzdHJhaWdodCB0byBhIHNwZWNpZmljIHNsaWNlIChlLmcuIHRoZVxuICAgICAgICAgICAgICAvLyBmaWxlIHRoZSB1c2VyIGFjdHVhbGx5IGNsaWNrZWQgd2l0aGluIGEgbnVtYmVyZWQgc2VyaWVzKS5cbiAgICAgICAgICAgICAgLy8gQ29uc3VtZWQgaW1tZWRpYXRlbHkgc28gcmVkZWxpdmVyaW5nIHRoZSBzYW1lIEltYWdlSW5mbyBsYXRlclxuICAgICAgICAgICAgICAvLyAoYSBwbG90LXR5cGUgc3dpdGNoLCByZWxvYWRBbmRQbG90KSBkb2Vzbid0IHJlc2V0IHRoZSB1c2VyJ3NcbiAgICAgICAgICAgICAgLy8gY3VycmVudCBzY3J1YiBwb3NpdGlvbiBiYWNrIHRvIGl0LlxuICAgICAgICAgICAgICBpZiAoaW1nSW5mby5pbml0aWFsWkluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnpJbmRleCA9IGltZ0luZm8uaW5pdGlhbFpJbmRleDtcbiAgICAgICAgICAgICAgICBpbWdJbmZvLmluaXRpYWxaSW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSB6aW5kZXggaXMgd2l0aGluIGJvdW5kc1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVpJbmRleCh1cmxzKTtcbiAgICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgLy8gTXVsdGktdGllciByZW5kZXJpbmcgKHNtYWxsIGJsdXJyeSB0aWVyIGZpcnN0LCB0aGVuIHNoYXJwZW4gaW5cbiAgICAgICAgICAgICAgLy8gcGxhY2UpIOKAlCBzZXF1ZW5jaW5nIGxpdmVzIGluIFJlbmRlck9yY2hlc3RyYXRvcjsgdGhpcyBjb21wb25lbnRcbiAgICAgICAgICAgICAgLy8gc3VwcGxpZXMgdGhlIHBoYXNlIHJlbmRlciBhbmQgb3ducyB0aGUgVUkgZmxhZ3MgdmlhIGNhbGxiYWNrcy5cbiAgICAgICAgICAgICAgLy8gM0QgcGxvdCB0eXBlcyByZW5kZXIgc2luZ2xlLXBhc3M6IHRoZSBpbi1wbGFjZSBsYXJnZSBwYXNzIGRvZXNuJ3RcbiAgICAgICAgICAgICAgLy8gcmVidWlsZCBhIDNEIGdsLW1lc2ggaXNvc3VyZmFjZSwgc28gdGhlIHNoYXJwZW4gc3RlcCBibGFua2VkIGl0LlxuICAgICAgICAgICAgICBjb25zdCBoYXNTbWFsbFRpZXIgPVxuICAgICAgICAgICAgICAgIHRoaXMuaXNIZWF0bWFwICYmXG4gICAgICAgICAgICAgICAgKGltZ0luZm8uc21hbGxVcmxzPy5sZW5ndGggPz8gMCkgPT09IHVybHMubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgKGltZ0luZm8uc21hbGxVcmxzPy5sZW5ndGggPz8gMCkgPiAwO1xuICAgICAgICAgICAgICBjb25zdCBzbWFsbEltZ0luZm8gPSBoYXNTbWFsbFRpZXIgPyB7IC4uLmltZ0luZm8sIHVybHM6IGltZ0luZm8uc21hbGxVcmxzIGFzIHN0cmluZ1tdIH0gOiBudWxsO1xuXG4gICAgICAgICAgICAgIC8vIEVudGVyIHBlci1zbGljZSBzdGFjayBtb2RlIHdpdGggdGhlIGdpdmVuIHNsaWNl4oaScmVnaW9ucyBtYXAgYW5kXG4gICAgICAgICAgICAgIC8vIHNlZWQgdGhlIFwicHJldmlvdXMgc2hhcGVzXCIgZnJvbSB0aGUgbm93LWxpdmUgc2xpY2UuIGVudGVyU3RhY2tNb2RlXG4gICAgICAgICAgICAgIC8vIG1ha2VzIHpJbmRleCdzIHNsaWNlIGxpdmUgYW5kIHJlc2V0cyB1bmRvIChqaXQtdWkjOTMpLlxuICAgICAgICAgICAgICBjb25zdCBlbnRlclN0YWNrID0gKFxuICAgICAgICAgICAgICAgIHNsaWNlczogTWFwPG51bWJlciwgUmVnaW9uW10+LFxuICAgICAgICAgICAgICAgIGxheW91dDogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZScsXG4gICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucGxvdFNlcnZpY2UuZW50ZXJTdGFja01vZGUoc2xpY2VzLCB0aGlzLnpJbmRleCwgbGF5b3V0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBzaGFwZXMgPSB0aGlzLnBsb3RTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAuZ2V0UmVnaW9ucygpXG4gICAgICAgICAgICAgICAgICAubWFwKChyZWdpb24pID0+IHJlZ2lvbi5nZXRTaGFwZSh0aGlzLnBsb3RTZXJ2aWNlLmdldFNob3dTaGFwZUxhYmVsKCkpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFByZXZpb3VzU2hhcGVzKHNoYXBlcyk7XG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgY29uc3QgYXBwbHlSb2kgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gRm9sZGVyIHN0YWNrOiBhIHN0YWNrIG9mIHNlbGYtY29udGFpbmVkIHBlci1zbGljZSBmaWxlc1xuICAgICAgICAgICAgICAgIC8vICh0aWxlZCA9PT0gZmFsc2U7IHNlZSBsb2FkU2VyaWVzQXNTdGFjaykuIEVhY2ggc2xpY2UtZmlsZSBtYXlcbiAgICAgICAgICAgICAgICAvLyBjYXJyeSBpdHMgb3duIHNpYmxpbmcgXCI8c3RlbT4uZ2VvanNvblwiIChyb2lKc29uU3Ryc1t6XSksIGJ1dCBhXG4gICAgICAgICAgICAgICAgLy8gZnJlc2ggZm9sZGVyIHdpdGggbm9uZSB5ZXQgbGVhdmVzIHJvaUpzb25TdHJzIHVuZGVmaW5lZCDigJQga2V5XG4gICAgICAgICAgICAgICAgLy8gb2ZmIGB0aWxlZCA9PT0gZmFsc2VgLCBOT1Qgcm9pSnNvblN0cnMsIHNvIGFuIHVuYW5ub3RhdGVkXG4gICAgICAgICAgICAgICAgLy8gZm9sZGVyIHN0YWNrIHN0aWxsIGVudGVycyB0aGUgcGVyLXNsaWNlLWZpbGUgbGF5b3V0IChhbmQgc2F2ZXNcbiAgICAgICAgICAgICAgICAvLyBiYWNrIG9uZSBnZW9qc29uIHBlciBzbGljZS1maWxlKSByYXRoZXIgdGhhbiBmYWxsaW5nIHRocm91Z2ggdG9cbiAgICAgICAgICAgICAgICAvLyB0aGUgc2luZ2xlLWZpbGUgY29tYmluZWQgcGF0aCAoaml0LXVpIzkzKS5cbiAgICAgICAgICAgICAgICBpZiAoaW1nSW5mby5pc1N0YWNrICYmIGltZ0luZm8udGlsZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBwZXJTbGljZSA9IGltZ0luZm8ucm9pSnNvblN0cnM7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzbGljZUNvdW50ID0gaW1nSW5mby51cmxzPy5sZW5ndGggPz8gcGVyU2xpY2U/Lmxlbmd0aCA/PyAwO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2xpY2VzID0gbmV3IE1hcDxudW1iZXIsIFJlZ2lvbltdPigpO1xuICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeiA9IDA7IHogPCBzbGljZUNvdW50OyB6KyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IHBlclNsaWNlPy5bel0gPz8gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgc2xpY2VzLnNldCh6LCBqc29uID8gdGhpcy5wbG90U2VydmljZS5pbXBvcnRSZWdpb25zKGpzb24pIDogW10pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZW50ZXJTdGFjayhzbGljZXMsICdwZXItc2xpY2UtZmlsZScpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBTaW5nbGUtZmlsZSB6LXN0YWNrOiBvbmUgc2libGluZyBnZW9qc29uIGhvbGRpbmcgZXZlcnkgc2xpY2Unc1xuICAgICAgICAgICAgICAgIC8vIHJlZ2lvbnMgaW5kZXhlZCBieSBRdVBhdGgncyBnZW9tZXRyeS5wbGFuZS56LiBFbnRlciBwZXItc2xpY2VcbiAgICAgICAgICAgICAgICAvLyBtb2RlIChzYXZpbmcgYmFjayBvbmUgY29tYmluZWQgei1pbmRleGVkIGdlb2pzb24pIHdoZW4gdGhlXG4gICAgICAgICAgICAgICAgLy8gZ2VvanNvbiBhY3R1YWxseSBjYXJyaWVzIHNsaWNlIGluZGljZXMsIG9yIHdoZW4gdGhlcmUncyBub3RoaW5nXG4gICAgICAgICAgICAgICAgLy8geWV0IHRvIGF1dGhvciBhZ2FpbnN0LiBBIGxlZ2FjeSBnZW9qc29uIHdob3NlIHJlZ2lvbnMgYXJlIGFsbCBvblxuICAgICAgICAgICAgICAgIC8vIHRoZSBkZWZhdWx0IHBsYW5lIHN0YXlzIGdsb2JhbCAoc2hvd24gb24gZXZlcnkgc2xpY2UpIHNvXG4gICAgICAgICAgICAgICAgLy8gZXhpc3Rpbmcgc2luZ2xlLXBsYW5lIGFubm90YXRpb25zIGFyZW4ndCBjb25maW5lZCB0byBzbGljZSAwLlxuICAgICAgICAgICAgICAgIGNvbnN0IHJvaUpzb24gPSBpbWdJbmZvLnJvaUpzb25TdHI7XG4gICAgICAgICAgICAgICAgaWYgKGltZ0luZm8uaXNTdGFjaykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVnaW9ucyA9IHJvaUpzb24gPyB0aGlzLnBsb3RTZXJ2aWNlLmltcG9ydFJlZ2lvbnMocm9pSnNvbikgOiBbXTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc1NsaWNlSW5mbyA9IHJlZ2lvbnMuc29tZSgocikgPT4gKHIueiA/PyAwKSAhPT0gMCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIXJvaUpzb24gfHwgaGFzU2xpY2VJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNsaWNlcyA9IG5ldyBNYXA8bnVtYmVyLCBSZWdpb25bXT4oKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCByIG9mIHJlZ2lvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6ID0gci56ID8/IDA7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnVja2V0ID0gc2xpY2VzLmdldCh6KTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVja2V0KSBidWNrZXQucHVzaChyKTtcbiAgICAgICAgICAgICAgICAgICAgICBlbHNlIHNsaWNlcy5zZXQoeiwgW3JdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbnRlclN0YWNrKHNsaWNlcywgJ2NvbWJpbmVkJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gU2luZ2xlLXBsYW5lIGltYWdlIChvciBhIGxlZ2FjeSBnbG9iYWwgei1zdGFjayBnZW9qc29uKTogb25lXG4gICAgICAgICAgICAgICAgLy8gcmVnaW9uIHNldCBmb3IgdGhlIHdob2xlIGltYWdlLlxuICAgICAgICAgICAgICAgIGlmIChyb2lKc29uKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZWdpb25zID0gdGhpcy5wbG90U2VydmljZS5pbXBvcnRSZWdpb25zKHJvaUpzb24pO1xuICAgICAgICAgICAgICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRSZWdpb25zKHJlZ2lvbnMpO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcGVzID0gcmVnaW9ucy5tYXAoKHJlZ2lvbikgPT5cbiAgICAgICAgICAgICAgICAgICAgcmVnaW9uLmdldFNoYXBlKHRoaXMucGxvdFNlcnZpY2UuZ2V0U2hvd1NoYXBlTGFiZWwoKSksXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRQcmV2aW91c1NoYXBlcyhzaGFwZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBMb2FkaW5nIGFuIGltYWdlJ3Mgc2F2ZWQgUk9JcyBpcyBub3QgYSB1c2VyIGVkaXQg4oCUIHN0YXJ0IHRoZVxuICAgICAgICAgICAgICAgIC8vIHVuZG8gaGlzdG9yeSBmcmVzaCBzbyB0aGUgZmlyc3QgdW5kbyBjYW4ndCB3aXBlIHRoZW0gKGppdC11aSM4NSkuXG4gICAgICAgICAgICAgICAgdGhpcy5wbG90U2VydmljZS5yZXNldFVuZG9IaXN0b3J5KCk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGxldCBvdmVybGF5UmVsZWFzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgY29uc3QgcmVsZWFzZU92ZXJsYXkgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG92ZXJsYXlSZWxlYXNlZCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIG92ZXJsYXlSZWxlYXNlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGltZ0luZm8uaXNTdGFjayAmJiBpbWdJbmZvLnNob3dTdGFjaykgdGhpcy5zdGFja0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnNldEltYWdlTG9hZGluZyhmYWxzZSk7XG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgbmV3IFJlbmRlck9yY2hlc3RyYXRvcih7XG4gICAgICAgICAgICAgICAgLy8gaW5QbGFjZT10cnVlIHVwZGF0ZXMgdGhlIGV4aXN0aW5nIHJlbmRlciBpbnN0ZWFkIG9mIHJlYnVpbGRpbmdcbiAgICAgICAgICAgICAgICAvLyBpdCwgc28gdGhlIGNhbnZhcyBkb2Vzbid0IGJsYW5rIGR1cmluZyB0aGUgc21hbGzihpJsYXJnZSBzd2FwLlxuICAgICAgICAgICAgICAgIHJlbmRlclBoYXNlOiAocGhhc2VJbmZvLCBpblBsYWNlKSA9PlxuICAgICAgICAgICAgICAgICAgdGhpcy5wbG90U2VydmljZS5sb2FkKHBoYXNlSW5mbywgdGhpcy56SW5kZXgpLnRoZW4oKGxvYWRlZEltYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEd1YXJkIGFnYWluc3QgYSBuZXdlciBjbGljayByZWFjaGluZyB1cyBtaWQtcmVuZGVyLlxuICAgICAgICAgICAgICAgICAgICBpZiAocGhhc2VJbmZvLmZpbGVOYW1lICE9PSBsb2FkZWRJbWFnZS5maWxlbmFtZSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBsb3RTZXJ2aWNlLnBsb3QoXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbG90RGl2TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRJbWFnZSxcbiAgICAgICAgICAgICAgICAgICAgICBwaGFzZUluZm8sXG4gICAgICAgICAgICAgICAgICAgICAgc2NyZWVuSGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxvdFR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgaW5QbGFjZSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHNtYWxsU2hvd246ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaWxlIGlzIHN0aWxsIGJlaW5nIGNhY2hlZC9wcmVwYXJlZCBzZXJ2ZXItc2lkZSwga2VlcCB0aGUgZnVsbFxuICAgICAgICAgICAgICAgICAgLy8gY2FjaGUtcHJvZ3Jlc3Mgb3ZlcmxheSB1cCBpbnN0ZWFkIG9mIGRyb3BwaW5nIHRvIHRoZSB0cmFuc2x1Y2VudCBcIlNoYXJwZW5pbmdcbiAgICAgICAgICAgICAgICAgIC8vIHByZXZpZXcuLi5cIiBzcGlubmVyIG92ZXIgYSBibGFuayBjYW52YXMgKGEgbGFyZ2UgdW5jYWNoZWQgaW1hZ2UgcmVuZGVycyBpdHNcbiAgICAgICAgICAgICAgICAgIC8vIHNtYWxsIHByZXZpZXcgYmVmb3JlIGl0cyB0aWxlcyBleGlzdCkuIGZpbmlzaGVkKCkgcmVsZWFzZXMgdGhlIG92ZXJsYXkgb25jZVxuICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlYWwgcmVuZGVyIGxhbmRzLlxuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNDYWNoaW5nKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAvLyBTbWFsbCB0aWVyIG9uIHNjcmVlbiDigJQgZHJvcCB0aGUgZnVsbCBvdmVybGF5IGJ1dCBrZWVwIGEgdHJhbnNsdWNlbnQgc3Bpbm5lciBzb1xuICAgICAgICAgICAgICAgICAgLy8gdGhlIGJsdXJyeSByZW5kZXIgaXNuJ3QgbWlzdGFrZW4gZm9yIHRoZSBmaW5hbCBpbWFnZS5cbiAgICAgICAgICAgICAgICAgIHJlbGVhc2VPdmVybGF5KCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNoYXJwZW5pbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2hhcnBlblNldHRsZWQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2hhcnBlbmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZmluaXNoZWQ6IChfdmlhU21hbGwsIGxvZ1RhZykgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gSWRlbXBvdGVudCDigJQgcmVsZWFzZXMgbm93IGlmIHNtYWxsU2hvd24gZGVmZXJyZWQgaXQgKGNhY2hpbmcpIG9yIHdhcyBza2lwcGVkLlxuICAgICAgICAgICAgICAgICAgcmVsZWFzZU92ZXJsYXkoKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgYXBwbHlSb2koKTtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGxvZ1RhZyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaGFycGVuRmFpbGVkOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoZSBzbWFsbCB0aWVyIHN0YXlzIG9uIHNjcmVlbiBhcyB0aGUgZmFsbGJhY2sg4oCUIHRlbGwgdGhlXG4gICAgICAgICAgICAgICAgICAvLyB1c2VyIHRoZSBzaGFycGVyIHZlcnNpb24gaXNuJ3QgY29taW5nLlxuICAgICAgICAgICAgICAgICAgY29uc3QgbXNnID0gZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnI/Lm1lc3NhZ2UgfHwgZXJyPy5zdGF0dXNUZXh0IHx8IFN0cmluZyhlcnIpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgICAgICBrZXk6ICdjZW50ZXItdG9hc3QnLFxuICAgICAgICAgICAgICAgICAgICBzZXZlcml0eTogJ3dhcm4nLFxuICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiAnUHJldmlldyBub3Qgc2hhcnBlbmVkJyxcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBgVGhlIGZ1bGwtcmVzb2x1dGlvbiBwcmV2aWV3IGRpZCBub3QgbG9hZCAoJHttc2d9KS4gVGhlIGxvdy1yZXNvbHV0aW9uIHByZXZpZXcgaXMgc3RpbGwgc2hvd24uIFRyeSBjbGlja2luZyB0aGUgaW1hZ2UgYWdhaW4uYCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICBhcHBseVJvaSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pLnJlbmRlcihpbWdJbmZvLCBzbWFsbEltZ0luZm8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnN0IG1zZyA9IGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyPy5tZXNzYWdlIHx8IGVycj8uc3RhdHVzVGV4dCB8fCBTdHJpbmcoZXJyKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igb2NjdXJlZCB3aGVuIGdldHRpbmcgaW1hZ2UgaW5mbycsIGVycik7XG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICBrZXk6ICdjZW50ZXItdG9hc3QnLFxuICAgICAgICAgIHN0aWNreTogdHJ1ZSxcbiAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICBzdW1tYXJ5OiAnQW4gZXJyb3Igb2NjdXJlZCcsXG4gICAgICAgICAgZGV0YWlsOiBgVGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cmVkIHdoaWxlIGdldHRpbmcgaW1hZ2UgaW5mbzogJHttc2d9LlxuICAgICAgICAgICAgICAgICAgIFBsZWFzZSB0cnkgdG8gb3BlbiB0aGUgaW1hZ2UgYWdhaW4gdGhyb3VnaCB0aGUgZmlsZSBuYXZpZ2F0b3IuYCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc3RhY2tMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc3RhdGUuc2V0SW1hZ2VMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGxvdFNlcnZpY2UucmVzZXQoKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5wbG90Q29udGV4dE1lbnVMaXN0ZW5lciA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgY29uc3QgcGxvdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2TmFtZSk7XG4gICAgICBpZiAoIXBsb3RFbD8uY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKSByZXR1cm47XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbnRleHRNZW51SXRlbXMgPSB0aGlzLmJ1aWxkQ29udGV4dE1lbnVJdGVtcygpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuY29udGV4dE1lbnUuc2hvdyhldmVudCk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIHRoaXMucGxvdENvbnRleHRNZW51TGlzdGVuZXIsIHRydWUpO1xuXG4gICAgdGhpcy5rZXlkb3duTGlzdGVuZXIgPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGlmICh0YXJnZXQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCB0YXJnZXQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyB8fCB0YXJnZXQuaXNDb250ZW50RWRpdGFibGUpIHJldHVybjtcbiAgICAgIC8vIFNBTSBwb2ludCBtb2RlOiBFbnRlciBjb21taXRzIHRoZSBvYmplY3QsIEVzYyBjbGVhcnMgdGhlIHByb21wdC5cbiAgICAgIGlmICh0aGlzLmFjdGl2ZURyYWdNb2RlID09PSAnc2FtUG9pbnQnICYmIChldmVudC5rZXkgPT09ICdFbnRlcicgfHwgZXZlbnQua2V5ID09PSAnRXNjYXBlJykpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB0aGlzLnBsb3RTZXJ2aWNlLmNvbW1pdFNhbVBvaW50cygpO1xuICAgICAgICAgIGVsc2UgdGhpcy5wbG90U2VydmljZS5jbGVhclNhbVBvaW50cygpO1xuICAgICAgICAgIHRoaXMuaGlkZVNhbVRvYXN0KCk7IC8vIHByb21wdCByZXNvbHZlZCDihpIgZGlzbWlzcyB0aGUgc3RhdHVzIHRvYXN0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBSZWdpb24gaGlzdG9yeSAoaml0LXVpIzg1KTogQ3RybC9DbWQrWiB1bmRvZXM7IEN0cmwvQ21kK1NoaWZ0K1ogb3JcbiAgICAgIC8vIEN0cmwvQ21kK1kgcmVkb2VzLlxuICAgICAgaWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkge1xuICAgICAgICBjb25zdCBrID0gZXZlbnQua2V5LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChrID09PSAneicgJiYgIWV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy51bmRvUmVnaW9uKCkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGsgPT09ICd6JyAmJiBldmVudC5zaGlmdEtleSkgfHwgayA9PT0gJ3knKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5yZWRvUmVnaW9uKCkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0RlbGV0ZScgfHwgZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJyB8fCBldmVudC5rZXkgPT09ICdkJyB8fCBldmVudC5rZXkgPT09ICdEJykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5kZWxldGVSZWdpb24oKSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJysnIHx8IGV2ZW50LmtleSA9PT0gJz0nKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnpvb21JbigpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnLScgfHwgZXZlbnQua2V5ID09PSAnXycpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuem9vbU91dCgpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAncCcpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ3BhbicpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnYicpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ3pvb21Ub0JveCcpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAncicpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ2RyYXdyZWN0JykpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdmJykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnZHJhd2Nsb3NlZHBhdGgnKSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ3cnKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCd3YW5kJykpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdlJykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnZXJhc2VWZXJ0ZXgnKSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ3MnKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdzZWxlY3QnKSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ2wnKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdkcmF3b3BlbnBhdGgnKSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5ZG93bkxpc3RlbmVyKTtcblxuICAgIHRoaXMud2hlZWxMaXN0ZW5lciA9IChldmVudDogV2hlZWxFdmVudCkgPT4ge1xuICAgICAgY29uc3QgcGxvdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2TmFtZSk7XG4gICAgICBpZiAoIXBsb3RFbD8uY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKSByZXR1cm47XG4gICAgICAvLyBUaGUgSW1hZ2UgdmlldyBoYW5kbGVzIHNjcm9sbC16b29tIG5hdGl2ZWx5IChpdCByZXNwZWN0cyB0aGUgc2Nyb2xsXG4gICAgICAvLyBkZWx0YSkuIEludGVyY2VwdGluZyBoZXJlIHdvdWxkIGZpcmUgYSBmaXhlZCB6b29tIHN0ZXAgcGVyIHdoZWVsXG4gICAgICAvLyBldmVudCDigJQgZmFyIHRvbyBzZW5zaXRpdmUg4oCUIHNvIGxldCB0aGUgcmVuZGVyZXIgb3duIGl0LlxuICAgICAgaWYgKHRoaXMuaXNJbWFnZVZpZXcpIHJldHVybjtcbiAgICAgIC8vIDNEIHBsb3QgdHlwZXMgKHN1cmZhY2UsIHNjYXR0ZXIzZCwgaXNvc3VyZmFjZSkgcmVuZGVyIGluIGEgUGxvdGx5IHNjZW5lXG4gICAgICAvLyB0aGF0IG9yYml0cy96b29tcyBuYXRpdmVseSBvbiBzY3JvbGwuIFRoZSAyRCBzdGVwLXpvb20gZG9lc24ndCBhcHBseSBhbmRcbiAgICAgIC8vIHdvdWxkIHRocm93IChubyB4YXhpcyBvbiBhIHNjZW5lKSwgc28gbGV0IFBsb3RseSBoYW5kbGUgdGhlIHdoZWVsLlxuICAgICAgaWYgKCF0aGlzLmlzSGVhdG1hcCkgcmV0dXJuO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgaWYgKGV2ZW50LmRlbHRhWSA8IDApIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuem9vbUluKCkpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5kZWx0YVkgPiAwKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnpvb21PdXQoKSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLndoZWVsTGlzdGVuZXIsIHsgY2FwdHVyZTogdHJ1ZSwgcGFzc2l2ZTogZmFsc2UgfSk7XG5cbiAgICAvLyBEcmFnIGhhbmRsaW5nIGZvciB0aGUgZmxvYXRpbmcgaW50ZW5zaXR5LXByb2ZpbGUgcGFuZWwuXG4gICAgdGhpcy5wcm9maWxlRHJhZ01vdmVMaXN0ZW5lciA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBpZiAodGhpcy5wcm9maWxlUGFuZWxEcmFnZ2luZykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMucHJvZmlsZVBhbmVsUG9zID0ge1xuICAgICAgICAgICAgeDogdGhpcy5wcm9maWxlUGFuZWxTdGFydC54ICsgKGUuY2xpZW50WCAtIHRoaXMucHJvZmlsZVBhbmVsU3RhcnQubXgpLFxuICAgICAgICAgICAgeTogdGhpcy5wcm9maWxlUGFuZWxTdGFydC55ICsgKGUuY2xpZW50WSAtIHRoaXMucHJvZmlsZVBhbmVsU3RhcnQubXkpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnRvb2xiYXJEcmFnZ2luZykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMudG9vbGJhclBvcyA9IHtcbiAgICAgICAgICAgIHg6IHRoaXMudG9vbGJhclN0YXJ0LnggKyAoZS5jbGllbnRYIC0gdGhpcy50b29sYmFyU3RhcnQubXgpLFxuICAgICAgICAgICAgeTogdGhpcy50b29sYmFyU3RhcnQueSArIChlLmNsaWVudFkgLSB0aGlzLnRvb2xiYXJTdGFydC5teSksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLnByb2ZpbGVEcmFnVXBMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgIHRoaXMucHJvZmlsZVBhbmVsRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMudG9vbGJhckRyYWdnaW5nID0gZmFsc2U7XG4gICAgfTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5wcm9maWxlRHJhZ01vdmVMaXN0ZW5lcik7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLnByb2ZpbGVEcmFnVXBMaXN0ZW5lcik7XG5cbiAgICAvLyBPbiBhbnkgd2luZG93IHJlc2l6ZSwgcmVmbG93IHRoZSBpbnRlbnNpdHkgaW5zZXQgdG8gaXRzIChmaXhlZCkgcGFuZWwgc2l6ZVxuICAgIC8vIG9uIHRoZSBuZXh0IGZyYW1lLCBvbmNlIGxheW91dCBoYXMgc2V0dGxlZC4gV2l0aG91dCB0aGlzIHRoZSBpbnNldCBjYW4gYmVcbiAgICAvLyBsZWZ0IGF0IGEgc3RhbGUvemVybyBzaXplIGJ5IGEgbWlkLXJlZmxvdyByZXNpemUgYW5kIHN0b3Agc2hvd2luZy5cbiAgICB0aGlzLnByb2ZpbGVSZXNpemVMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5oYXNQcm9maWxlcykgcmV0dXJuO1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMucmVuZGVySW50ZW5zaXR5SW5zZXQoKSk7XG4gICAgfTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5wcm9maWxlUmVzaXplTGlzdGVuZXIpO1xuICB9XG5cbiAgb25Qcm9maWxlUGFuZWxEcmFnU3RhcnQoZTogTW91c2VFdmVudCkge1xuICAgIHRoaXMucHJvZmlsZVBhbmVsRHJhZ2dpbmcgPSB0cnVlO1xuICAgIHRoaXMucHJvZmlsZVBhbmVsU3RhcnQgPSB7XG4gICAgICBteDogZS5jbGllbnRYLFxuICAgICAgbXk6IGUuY2xpZW50WSxcbiAgICAgIHg6IHRoaXMucHJvZmlsZVBhbmVsUG9zLngsXG4gICAgICB5OiB0aGlzLnByb2ZpbGVQYW5lbFBvcy55LFxuICAgIH07XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgLyoqIEdyYWIgdGhlIHRvb2xiYXIgaGFuZGxlOiBkZXRhY2ggaXQgaW50byBhIGZsb2F0aW5nIHdpbmRvdyAoaWYgc3RpbGwgZG9ja2VkKVxuICAgKiAgYW5kIHN0YXJ0IGRyYWdnaW5nLiAqL1xuICBvblRvb2xiYXJEcmFnU3RhcnQoZTogTW91c2VFdmVudCkge1xuICAgIGlmICghdGhpcy50b29sYmFyRmxvYXRpbmcpIHtcbiAgICAgIHRoaXMudG9vbGJhckZsb2F0aW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMudG9vbGJhclBvcyA9IHsgeDogOCwgeTogOCB9O1xuICAgIH1cbiAgICB0aGlzLnRvb2xiYXJEcmFnZ2luZyA9IHRydWU7XG4gICAgdGhpcy50b29sYmFyU3RhcnQgPSB7XG4gICAgICBteDogZS5jbGllbnRYLFxuICAgICAgbXk6IGUuY2xpZW50WSxcbiAgICAgIHg6IHRoaXMudG9vbGJhclBvcy54LFxuICAgICAgeTogdGhpcy50b29sYmFyUG9zLnksXG4gICAgfTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICAvKiogU25hcCB0aGUgZmxvYXRpbmcgdG9vbGJhciBiYWNrIHRvIGl0cyBkb2NrZWQgcG9zaXRpb24gYWNyb3NzIHRoZSB0b3AuICovXG4gIGRvY2tUb29sYmFyKCkge1xuICAgIHRoaXMudG9vbGJhckZsb2F0aW5nID0gZmFsc2U7XG4gIH1cblxuICAvKiogUmVuZGVyIHRoZSBpbnRlbnNpdHkgaW5zZXQgY2hhcnQgZnJvbSB0aGUgbGF0ZXN0IHByb2ZpbGUgZGF0YS4gVGhlIGFjdHVhbFxuICAgKiAgY2hhcnRpbmcgaXMgb3duZWQgYnkgdGhlIHZpc3VhbGl6ZXIgc2VydmljZSDigJQgdGhlIGNvbXBvbmVudCBqdXN0IGRlY2lkZXNcbiAgICogIHdoZW4gKHByb2ZpbGUgbW9kZSArIGEgZnJlc2ggcHJvZmlsZSkuICovXG4gIHByaXZhdGUgcmVuZGVySW50ZW5zaXR5SW5zZXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc1Byb2ZpbGVzKSByZXR1cm47XG4gICAgdGhpcy5wbG90U2VydmljZS5yZW5kZXJJbnRlbnNpdHlJbnNldCh0aGlzLmludGVuc2l0eUluc2V0RGl2LCB0aGlzLmxhdGVzdFByb2ZpbGVzKTtcbiAgfVxuXG4gIC8qKiBUb29sYmFyIFwiSW50ZW5zaXR5XCIgZ3JvdXA6IGFkZCBhbm90aGVyIGxpbmUgUk9JIChuZXh0IGJyaWdodCBjb2xvdXIpLiAqL1xuICBhc3luYyBhZGRQcm9maWxlTGluZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBQYXJrIHRoZSBmbG9hdGluZyBpbnNldCBuZWFyIHRoZSBwbG90J3MgdG9wLXJpZ2h0IHdoZW4gdGhlIGZpcnN0IGxpbmUgaXNcbiAgICAvLyBhZGRlZCAoaXQncyBwb3NpdGlvbjpmaXhlZCwgc28gdXNlIHZpZXdwb3J0IGNvb3JkcyBmcm9tIHRoZSBwbG90IHJlY3QpLlxuICAgIGlmICghdGhpcy5oYXNQcm9maWxlcykge1xuICAgICAgY29uc3QgcmVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdk5hbWUpPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMucHJvZmlsZVBhbmVsUG9zID0gcmVjdFxuICAgICAgICA/IHsgeDogTWF0aC5tYXgoMTAsIHJlY3QucmlnaHQgLSAzMDApLCB5OiByZWN0LnRvcCArIDEwIH1cbiAgICAgICAgOiB7IHg6IDIwLCB5OiA3MCB9O1xuICAgIH1cbiAgICAvLyBJbWFnZSAoT1NEKSBtb2RlOiBQbG90bHkgbmV2ZXIgcmVuZGVyZWQsIHNvIGl0IGhhcyBubyBwaXhlbCBjYWNoZSAvIGV4dGVudC5cbiAgICAvLyBMb2FkIHRoZSBjdXJyZW50IHNsaWNlJ3MgZnJhbWVzIGZvciBzYW1wbGluZyArIGxpbmUgcGxhY2VtZW50IGZpcnN0LlxuICAgIGlmICh0aGlzLmlzSW1hZ2VWaWV3ICYmIHRoaXMuaW1hZ2VJbmZvKSB7XG4gICAgICBhd2FpdCB0aGlzLnBsb3RTZXJ2aWNlLmVuc3VyZUludGVuc2l0eVNhbXBsaW5nKHRoaXMuaW1hZ2VJbmZvLCB0aGlzLnpJbmRleCk7XG4gICAgfVxuICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMucGxvdFNlcnZpY2UuZ2V0SW50ZW5zaXR5Q29udHJvbHMoKT8uYWRkUHJvZmlsZUxpbmUoKTtcbiAgICAvLyBBdXRvLXNlbGVjdCB0aGUgbmV3IGxpbmUgb24gdGhlIGFjdGl2ZSBiYWNrZW5kIChQbG90bHkgaGFuZGxlcyAvIE9TRFxuICAgIC8vIGhpZ2hsaWdodCkgc28gaXQncyByZWFkeSB0byBtb3ZlIG9yIGRlbGV0ZSBpbW1lZGlhdGVseS5cbiAgICBpZiAocmVnaW9uKSB7XG4gICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNlbGVjdFJlZ2lvbihyZWdpb24pO1xuICAgICAgLy8gT1NEIG9ubHkgZHJhd3MgYSBzZWxlY3RlZCByZWdpb24ncyBoYW5kbGVzIGluIGFuIGVkaXQgbW9kZSwgc28gYSBsaW5lIGluXG4gICAgICAvLyAnbm9uZScgbW9kZSBsb29rcyB1bnNlbGVjdGVkLiBTd2l0Y2ggdG8gJ3NlbGVjdCcgc28gdGhlIG5ldyBsaW5lIHNob3dzXG4gICAgICAvLyBpdHMgZW5kcG9pbnQgaGFuZGxlcyBhbmQgY2FuIGJlIGRyYWdnZWQvZGVsZXRlZCByaWdodCBhd2F5LlxuICAgICAgaWYgKHRoaXMuaXNJbWFnZVZpZXcgJiYgdGhpcy5hY3RpdmVEcmFnTW9kZSAhPT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgdGhpcy50b2dnbGVEcmFnTW9kZSgnc2VsZWN0Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zY3J1YmJlci5jYW5jZWwoKTtcbiAgICB0aGlzLnNhbVBvaW50U3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgaWYgKHRoaXMucGxvdENvbnRleHRNZW51TGlzdGVuZXIpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIHRoaXMucGxvdENvbnRleHRNZW51TGlzdGVuZXIsIHRydWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5rZXlkb3duTGlzdGVuZXIpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duTGlzdGVuZXIpO1xuICAgIH1cbiAgICBpZiAodGhpcy53aGVlbExpc3RlbmVyKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLndoZWVsTGlzdGVuZXIsIHRydWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9maWxlRHJhZ01vdmVMaXN0ZW5lcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMucHJvZmlsZURyYWdNb3ZlTGlzdGVuZXIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9maWxlRHJhZ1VwTGlzdGVuZXIpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5wcm9maWxlRHJhZ1VwTGlzdGVuZXIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9maWxlUmVzaXplTGlzdGVuZXIpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnByb2ZpbGVSZXNpemVMaXN0ZW5lcik7XG4gICAgfVxuICAgIGlmICh0aGlzLmludGVuc2l0eVByb2ZpbGVTdWIpIHtcbiAgICAgIHRoaXMuaW50ZW5zaXR5UHJvZmlsZVN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy52aWV3cG9ydENoYW5nZVN1Yikge1xuICAgICAgdGhpcy52aWV3cG9ydENoYW5nZVN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLnVuc3ViLm5leHQoKTtcbiAgICB0aGlzLnVuc3ViLmNvbXBsZXRlKCk7XG4gICAgaWYgKHRoaXMucHJldmlld1N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5wcmV2aWV3U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnBsb3RXaWR0aFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5wbG90V2lkdGhTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaW1hZ2VMb2FkaW5nU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmltYWdlTG9hZGluZ1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbWdMb2FkaW5nTWVzc2FnZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5pbWdMb2FkaW5nTWVzc2FnZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1pvb21TdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuaXNab29tU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmF1dG9zY2FsZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5hdXRvc2NhbGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZmlsZW5hbWVTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZmlsZW5hbWVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5wbG90U2VydmljZS51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIGhhc1JlZ2lvbnMoKTogYm9vbGVhbiB7XG4gICAgLy8gVXNlIHRoZSBjb250cmFjdCdzIGZyYW1ld29yay1uZXV0cmFsIHJlZ2lvbiBhY2Nlc3Nvciwgbm90IHRoZSByYXdcbiAgICAvLyBQbG90bHktc2hhcGVkIGdldFNoYXBlcygpIOKAlCB0aGUgY29tcG9uZW50IG9ubHkgbmVlZHMgdG8ga25vdyB3aGV0aGVyIGFueVxuICAgIC8vIHJlZ2lvbiBleGlzdHMsIGFuZCBtdXN0IG5vdCBkZXBlbmQgb24gYSBiYWNrZW5kJ3Mgd2lyZSBmb3JtYXQuXG4gICAgcmV0dXJuIHRoaXMucGxvdFNlcnZpY2UuZ2V0UmVnaW9ucygpLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGluIG1haW5GYWNhZGUuY29uZmlnUmVxdWVzdCgpIC0gRE8gTk9UIERFTEVURVxuICAgKi9cbiAgcHVibGljIGdldFJlZ2lvblBvbHlnb25zKCk6IFBvbHlnb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucGxvdFNlcnZpY2UuZ2V0UmVnaW9uUG9seWdvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgdGhlIGNvbG9yIHNjYWxlIHR5cGU6IGNhbGxlZCBieSB0aGUgY29sb3Igc2NhbGUgc2VsZWN0IGJ1dHRvblxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICovXG4gIHRvZ2dsZVJldmVyc2VTY2FsZSgpIHtcbiAgICB0aGlzLnJldmVyc2VzY2FsZSA9ICF0aGlzLnJldmVyc2VzY2FsZTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFJldmVyc2VTY2FsZSh0aGlzLnJldmVyc2VzY2FsZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IGEgY29sb3IgbWFwOiBjYWxsZWQgYnkgdGhlIGNvbG9yIG1hcCBkcm9wZG93biBidXR0b25cbiAgICogQHBhcmFtIGNvbG9ybWFwTm9kZVxuICAgKi9cbiAgc2VsZWN0Q29sb3JtYXAoY29sb3JtYXBOb2RlOiBUcmVlTm9kZSkge1xuICAgIGlmICghY29sb3JtYXBOb2RlLmNoaWxkcmVuKSB7XG4gICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldENvbG9ybWFwKGNvbG9ybWFwTm9kZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIE9wZW4gdGhlIENoYW5uZWxzICYgSGlzdG9ncmFtIGRpYWxvZyAodG9vbGJhciBidXR0b24pLiAqL1xuICBvcGVuQ2hhbm5lbEhpc3RvZ3JhbSgpIHtcbiAgICB0aGlzLnNob3dDaGFubmVsSGlzdG9ncmFtID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBPcGVuIHRoZSBSZWdpb24gRWRpdG9yIGRpYWxvZyAodG9vbGJhciBidXR0b24pLiBUaGUgZWRpdG9yIHN0YXlzIGxpbmtlZCB0b1xuICAgKiAgdGhpcyBwbG90dGluZyBpbnN0YW5jZSB0aHJvdWdoIHRoZSByb290IFJlZ2lvblN0b3JlIHNpbmdsZXRvbiwgc28gaXQgd29ya3NcbiAgICogIHRoZSBzYW1lIGFzIHRoZSBmb3JtZXIgcmlnaHQtcGFuZWwgUmVnaW9ucyB0YWIuICovXG4gIG9wZW5SZWdpb25FZGl0b3IoKSB7XG4gICAgLy8gU2l6ZSB0aGUgZGlhbG9nIHRvIG1hdGNoIHRoZSBob3N0J3MgY29uZmlndXJlZCBlbGVtZW50IChlLmcuIHRoZSBhcHAnc1xuICAgIC8vIHJpZ2h0IHBhbmVsKSBhdCBvcGVuIHRpbWUuIE1lYXN1cmVkIG9uY2Ug4oCUIGl0IGludGVudGlvbmFsbHkgZG9lcyBub3RcbiAgICAvLyB0cmFjayBsYXRlciBicm93c2VyL3NwbGl0IHJlc2l6ZXMuIEZhbGxzIGJhY2sgdG8gYSBxdWFydGVyIG9mIHRoZSBwYWdlXG4gICAgLy8gd2hlbiBubyBzZWxlY3RvciBpcyBjb25maWd1cmVkIG9yIHRoZSBlbGVtZW50IGlzbid0IHByZXNlbnQuXG4gICAgY29uc3Qgc2VsZWN0b3IgPSB0aGlzLnZpekNvbmZpZz8ucmVnaW9uRWRpdG9yV2lkdGhTZWxlY3RvcjtcbiAgICBjb25zdCB3aWR0aCA9IHNlbGVjdG9yXG4gICAgICA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KHNlbGVjdG9yKT8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGhcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMucmVnaW9uRWRpdG9yV2lkdGggPSB3aWR0aCAmJiB3aWR0aCA+IDAgPyBgJHtNYXRoLnJvdW5kKHdpZHRoKX1weGAgOiAnMjV2dyc7XG4gICAgdGhpcy5zaG93UmVnaW9uRWRpdG9yID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIHN0YWNrL3NpbmdsZSBpbWFnZSBkcm9wZG93biBidXR0b25cbiAgICogQHBhcmFtIHNob3dzdGFja1xuICAgKi9cbiAgc2VsZWN0U3RhY2tPcHRpb24oc2VsZWN0ZWRTdGFja09wdGlvbjogYW55KSB7XG4gICAgY29uc3Qgc2hvd3N0YWNrID0gc2VsZWN0ZWRTdGFja09wdGlvbi52YWwgPT09ICd0cnVlJztcbiAgICB0aGlzLnNlbGVjdGVkU3RhY2tPcHRpb24gPSBzZWxlY3RlZFN0YWNrT3B0aW9uO1xuICAgIGNvbnNvbGUubG9nKCdzZWxlY3RlZCBzdGFjayBvcHRpb24nICsgSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZFN0YWNrT3B0aW9uKSk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmcgPSBzaG93c3RhY2s7XG4gICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcoIXNob3dzdGFjayk7XG4gICAgLy8gU3RhY2sgbW9kZSBpcyBhbHdheXMgYSAyRCBoZWF0bWFwIOKAlCByZXNldCBzdXJmYWNlIG1vZGUgaWYgYWN0aXZlXG4gICAgaWYgKCF0aGlzLmlzSGVhdG1hcCkge1xuICAgICAgdGhpcy5pc0hlYXRtYXAgPSB0cnVlO1xuICAgICAgdGhpcy5wbG90VHlwZSA9IFBsb3RUeXBlLkhFQVRNQVA7XG4gICAgICB0aGlzLnNlbGVjdGVkUGxvdFR5cGUgPSBQbG90VHlwZS5IRUFUTUFQO1xuICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRQbG90VHlwZSh0aGlzLnBsb3RUeXBlKTtcbiAgICB9XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRTaG93U3RhY2soc2hvd3N0YWNrKTtcbiAgfVxuXG4gIHVwZGF0ZVpJbmRleCh1cmxzPzogc3RyaW5nW10pIHtcbiAgICBpZiAodGhpcy56SW5kZXggPiB0aGlzLm1heEluZGV4KSB7XG4gICAgICB0aGlzLnpJbmRleCA9IHRoaXMubWF4SW5kZXg7XG4gICAgfVxuICAgIGlmICh0aGlzLnpJbmRleCA8IDApIHtcbiAgICAgIHRoaXMuekluZGV4ID0gMDtcbiAgICB9XG4gICAgaWYgKHVybHMpIHtcbiAgICAgIGlmICh0aGlzLnpJbmRleCA+IHVybHM/Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLnpJbmRleCA9IDA7XG4gICAgICAgIHRoaXMubWF4SW5kZXggPSB1cmxzLmxlbmd0aCAtIDE7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0WkluZGV4KHRoaXMuekluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXZlIHotc2xpY2Ugc2NydWIgZm9yIHRoZSBJbWFnZSB2aWV3OiB0aGUgcmVuZGVyZXIgc3dhcHMgdGhlIGRpc3BsYXllZFxuICAgKiBzbGljZSBpbiBwbGFjZSAobm8gcmUtbW91bnQpLCBzbyBkcmFnZ2luZyB0aGUgc2xpZGVyIHN0ZXBzIHRocm91Z2ggdGhlXG4gICAqIHN0YWNrIHRoZSBzYW1lIHdheSB0aGUgaGVhdG1hcCBmcmFtZSBzbGlkZXIgZG9lcy5cbiAgICovXG4gIG9uWlNsaWRlKHo6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh6ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICB0aGlzLnpJbmRleCA9IHo7XG4gICAgdGhpcy5zY3J1YmJlci5jb21taXQoeik7XG4gICAgLy8gS2VlcCB0aGUgaW50ZW5zaXR5IGluc2V0IGluIHN5bmMgd2l0aCB0aGUgZGlzcGxheWVkIHNsaWNlIChJbWFnZS9PU0QgbW9kZSxcbiAgICAvLyB3aGVyZSB0aGUgcHJvZmlsZSBzYW1wbGVyIGlzIGZlZCBmcm9tIHRoZSBsb2FkZWQgcHJldmlldyBmcmFtZXMpLlxuICAgIGlmICh0aGlzLmhhc1Byb2ZpbGVzICYmIHRoaXMuaXNJbWFnZVZpZXcgJiYgdGhpcy5pbWFnZUluZm8pIHtcbiAgICAgIHRoaXMucGxvdFNlcnZpY2UuZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcodGhpcy5pbWFnZUluZm8sIHopO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaXZlIChkZWJvdW5jZWQpIHNjcnViIHdoaWxlIGRyYWdnaW5nIHRoZSBJbWFnZS12aWV3IHotc2xpZGVyOiB1cGRhdGUgdGhlXG4gICAqIHNsaWNlIGFzIHRoZSB1c2VyIGRyYWdzLCBidXQgY29hbGVzY2UgcmFwaWQgY2hhbmdlcyBzbyB3ZSBkb24ndCBmaXJlIGFcbiAgICogc2xpY2Ugc3dhcCBvbiBldmVyeSBwaXhlbC4gVGhlIGZpbmFsIHZhbHVlIGFsc28gbGFuZHMgdmlhIG9uWlNsaWRlIChvblNsaWRlRW5kKS5cbiAgICovXG4gIG9uWlNjcnViKHo6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh6ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICB0aGlzLnpJbmRleCA9IHo7XG4gICAgdGhpcy5zY3J1YmJlci5zY3J1Yih6KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBLZXlib2FyZCBzdGFjayBuYXZpZ2F0aW9uOiDihpAv4oaSIHN0ZXAgdGhlIHotc2xpY2UgaW4gdGhlIEltYWdlIHZpZXcsIHRoZSBzYW1lXG4gICAqIHdheSB0aGUgc2xpZGVyIGRvZXMuIE9ubHkgYWN0aXZlIGZvciBhIGxvYWRlZCBzdGFjayBpbiBJbWFnZSB2aWV3LCBhbmRcbiAgICogaWdub3JlZCB3aGlsZSBhIGZvcm0gZmllbGQgaXMgZm9jdXNlZCBzbyB0eXBpbmcgaXNuJ3QgaGlqYWNrZWQuIFVwL0Rvd24gYXJlXG4gICAqIGxlZnQgdG8gT3BlblNlYWRyYWdvbiAocGFubmluZykuXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIG9uS2V5ZG93bihlOiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGUua2V5ICE9PSAnQXJyb3dMZWZ0JyAmJiBlLmtleSAhPT0gJ0Fycm93UmlnaHQnKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmltYWdlSW5mbz8uaXNTdGFjayB8fCAhdGhpcy5pc0ltYWdlVmlldykgcmV0dXJuO1xuICAgIGNvbnN0IHQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKHQgJiYgKC9eKElOUFVUfFRFWFRBUkVBfFNFTEVDVCkkLy50ZXN0KHQudGFnTmFtZSkgfHwgdC5pc0NvbnRlbnRFZGl0YWJsZSkpIHJldHVybjtcbiAgICAvLyBUaGUgc2xpY2Ugc2xpZGVyIGhhbmRsZXMgYXJyb3dzIG5hdGl2ZWx5IHdoZW4gZm9jdXNlZCAoYWxzbyBhICsxIHN0ZXApIOKAlFxuICAgIC8vIHNraXAgaGVyZSBzbyB3ZSBkb24ndCBkb3VibGUtc3RlcCBpdC5cbiAgICBpZiAodCAmJiAodC5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ3NsaWRlcicgfHwgdC5jbG9zZXN0KCcucC1zbGlkZXInKSkpIHJldHVybjtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5zdGVwU2xpY2UoZS5rZXkgPT09ICdBcnJvd1JpZ2h0JyA/IDEgOiAtMSk7XG4gIH1cblxuICAvKiogTW92ZSB0aGUgZGlzcGxheWVkIHNsaWNlIGJ5IGBkZWx0YWAsIGNsYW1wZWQgdG8gdGhlIHN0YWNrIGJvdW5kcy4gKi9cbiAgc3RlcFNsaWNlKGRlbHRhOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gTWF0aC5taW4odGhpcy5tYXhJbmRleCwgTWF0aC5tYXgoMCwgdGhpcy56SW5kZXggKyBkZWx0YSkpO1xuICAgIGlmIChuZXh0ID09PSB0aGlzLnpJbmRleCkgcmV0dXJuO1xuICAgIHRoaXMub25aU2xpZGUobmV4dCk7XG4gIH1cblxuICByZWxvYWRBbmRQbG90KCkge1xuICAgIHRoaXMuc3RhdGUuc2V0SW1hZ2VMb2FkaW5nKHRydWUpO1xuICAgIC8vIFJlLWRyaXZlIHRoZSByZW5kZXIgcGlwZWxpbmUgZnJvbSB0aGUgY3VycmVudCBpbWFnZSBpbmZvICh0aGUgc291cmNlIG9mXG4gICAgLy8gdHJ1dGgsIHdpdGggcmVhbCB1cmxzL2ZpbGVOYW1lKS4gRG9uJ3QgdXNlIHBsb3RTZXJ2aWNlLnJlbG9hZEFuZFBsb3QoKTpcbiAgICAvLyB0aGF0IHJlYnVpbGRzIHRoZSBpbmZvIGZyb20gdGhlIHJlbmRlcmVyJ3MgaW50ZXJuYWwgc3RhdGUsIHdoaWNoIGNhbiBiZVxuICAgIC8vIHN0YWxlIChlLmcuIGFmdGVyIHN3aXRjaGluZyBwbG90IHR5cGUgSW1hZ2UgLT4gSGVhdG1hcCkgYW5kIHJlLWVtaXRcbiAgICAvLyBlbXB0eS9vbGQgdXJscywgZmFpbGluZyB0byBoYW5kIHRoZSBkaXYgb3ZlciB0byB0aGUgbmV3IHJlbmRlcmVyLlxuICAgIGlmICh0aGlzLmltYWdlSW5mbykge1xuICAgICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUluZm8odGhpcy5pbWFnZUluZm8pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBsb3RTZXJ2aWNlLnJlbG9hZEFuZFBsb3QoKTtcbiAgICB9XG4gIH1cbiAgY2FuY2VsTG9hZGluZygpIHtcbiAgICAvLyBTdG9wIGFueSBpbi1mbGlnaHQgZnJhbWUgc3RyZWFtaW5nIChuYXBhcmktanMgdm9sdW1lL3N1cmZhY2UgcHJlbG9hZCkgc28gdGhlIGZldGNoIGxvb3BzXG4gICAgLy8gYWN0dWFsbHkgYWJvcnQg4oCUIGNsZWFyaW5nIHRoZSBmbGFnIGFsb25lIG9ubHkgcm91dGVkIHRvIFBsb3RseSBhbmQgbGVmdCBuYXBhcmkgZmV0Y2hpbmcuXG4gICAgdGhpcy5wbG90U2VydmljZS5jYW5jZWxMb2FkaW5nPy4oKTtcbiAgICB0aGlzLnN0YWNrTG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuaW1nTG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuc3RhdGUuc2V0SW1hZ2VMb2FkaW5nKGZhbHNlKTtcbiAgICB0aGlzLnpJbmRleCA9IDA7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRaSW5kZXgodGhpcy56SW5kZXgpO1xuICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0U3RhY2tMb2FkaW5nKGZhbHNlKTtcbiAgfVxuXG4gIGRvd25sb2FkSW1hZ2UoKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS5kb3dubG9hZEltYWdlKCk7XG4gIH1cblxuICBhdXRvc2NhbGVJbWFnZSgpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmF1dG9zY2FsZSgpO1xuICB9XG5cbiAgLyoqIFRvb2xiYXIgcGl4ZWwvc21vb3RoIHRvZ2dsZTogZmxpcCBzbW9vdGhpbmcgYW5kIGFwcGx5IHRvIHRoZSBhY3RpdmUgYmFja2VuZC4gKi9cbiAgb25Ub2dnbGVJbWFnZVNtb290aGluZygpOiB2b2lkIHtcbiAgICB0aGlzLmltYWdlU21vb3RoaW5nRW5hYmxlZCA9ICF0aGlzLmltYWdlU21vb3RoaW5nRW5hYmxlZDtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldEltYWdlU21vb3RoaW5nRW5hYmxlZCh0aGlzLmltYWdlU21vb3RoaW5nRW5hYmxlZCk7XG4gIH1cblxuICByZXNldEF4ZXMoKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS5yZXNldEF4ZXMoKTtcbiAgfVxuXG4gIHRvZ2dsZURyYWdNb2RlKG1vZGU6IHN0cmluZykge1xuICAgIC8vIFRvZ2dsZSBvZmYgaWYgdGhlIHNhbWUgbW9kZSBpcyByZS1zZWxlY3RlZC5cbiAgICB0aGlzLmFjdGl2ZURyYWdNb2RlID0gdGhpcy5hY3RpdmVEcmFnTW9kZSA9PT0gbW9kZSA/IG51bGwgOiBtb2RlO1xuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuYWN0aXZlRHJhZ01vZGU7XG4gICAgLy8gUmVjb3JkIHRoZSBhcm1lZCB0b29sIGluIHRoZSBzaGFyZWQgc2Vzc2lvbiBzdG9yZS5cbiAgICB0aGlzLnNlc3Npb24uc2V0QWN0aXZlVG9vbChhY3RpdmUpO1xuXG4gICAgLy8gUmVnaW9uIGRyYXcvc2VsZWN0IHJ1biB0aHJvdWdoIHRoZSByZW5kZXJlcidzIHJlZ2lvbiBvdmVybGF5LlxuICAgIHRoaXMucGxvdFNlcnZpY2VcbiAgICAgIC5nZXRSZWdpb25PdmVybGF5KClcbiAgICAgID8uc2V0TW9kZSh0aGlzLmlzUmVnaW9uTW9kZShhY3RpdmUpID8gKGFjdGl2ZSBhcyBSZWdpb25Ub29sTW9kZSkgOiAnbm9uZScpO1xuXG4gICAgLy8gVmlld3BvcnQgZHJhZyBtb2RlcyAocGFuL2JveC16b29tKS4gUmVnaW9uIG1vZGVzIG93biB0aGUgZHJhZyBtb2RlIHZpYVxuICAgIC8vIHRoZSBvdmVybGF5LCBzbyBkb24ndCBhbHNvIHNldCBvbmUgaGVyZS5cbiAgICBpZiAoIXRoaXMuaXNSZWdpb25Nb2RlKGFjdGl2ZSkpIHtcbiAgICAgIGNvbnN0IHZpZXdwb3J0RHJhZyA9IGFjdGl2ZSA9PT0gJ3BhbicgfHwgYWN0aXZlID09PSAnem9vbSc7XG4gICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldERyYWdNb2RlKHZpZXdwb3J0RHJhZyA/IGFjdGl2ZSA6IGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBPbi1jYW52YXMgdG9vbCBvdmVybGF5cy5cbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFpvb21Ub0JveE1vZGUoYWN0aXZlID09PSAnem9vbVRvQm94Jyk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRXYW5kTW9kZShhY3RpdmUgPT09ICd3YW5kJywgeyBzZW5zaXRpdml0eTogdGhpcy53YW5kU2Vuc2l0aXZpdHkgfSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRCcnVzaE1vZGUoYWN0aXZlID09PSAnYnJ1c2gnLCB7IHNpemU6IHRoaXMuYnJ1c2hTaXplIH0pO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0U2FtUG9pbnRNb2RlKGFjdGl2ZSA9PT0gJ3NhbVBvaW50Jyk7XG4gICAgLy8gTGVhdmluZyBwb2ludCBtb2RlIGRpc21pc3NlcyBhbnkgbGluZ2VyaW5nIHN0YXR1cyB0b2FzdC5cbiAgICBpZiAoYWN0aXZlICE9PSAnc2FtUG9pbnQnKSB0aGlzLmhpZGVTYW1Ub2FzdCgpO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0VmVydGV4RXJhc2VyTW9kZShhY3RpdmUgPT09ICdlcmFzZVZlcnRleCcpO1xuICAgIGlmIChhY3RpdmUgPT09ICdlcmFzZVZlcnRleCcpIHtcbiAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0VmVydGV4RXJhc2VyUmFkaXVzKHRoaXMudmVydGV4RXJhc2VyUmFkaXVzKTtcbiAgICB9XG4gIH1cblxuICAvKiogUmVnaW9uIGRyYXcvc2VsZWN0L2VkaXQgbW9kZXMgcm91dGVkIHRocm91Z2ggdGhlIHJlZ2lvbiBvdmVybGF5LiBUaGVcbiAgICogIFRoZSB2ZXJ0ZXggdG9vbHMgKGRyYXdwb2x5Z29uL2FkZHBvaW50L2RlbGV0ZXBvaW50L21vdmUpIGFyZVxuICAgKiAgaGFuZGxlZCBieSB0aGUgT3BlblNlYWRyYWdvbiBvdmVybGF5OyBQbG90bHkncyBvdmVybGF5IG1hcHMgdGhlbSB0byBuby1vcC4gKi9cbiAgcHJpdmF0ZSBpc1JlZ2lvbk1vZGUobW9kZTogc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBtb2RlID09PSAnZHJhd3JlY3QnIHx8XG4gICAgICBtb2RlID09PSAnZHJhd2Nsb3NlZHBhdGgnIHx8XG4gICAgICBtb2RlID09PSAnZHJhd29wZW5wYXRoJyB8fFxuICAgICAgbW9kZSA9PT0gJ3NlbGVjdCcgfHxcbiAgICAgIG1vZGUgPT09ICdkcmF3cG9seWdvbicgfHxcbiAgICAgIG1vZGUgPT09ICdhZGRwb2ludCcgfHxcbiAgICAgIG1vZGUgPT09ICdkZWxldGVwb2ludCcgfHxcbiAgICAgIG1vZGUgPT09ICdtb3ZlJ1xuICAgICk7XG4gIH1cblxuICAvKiogTGl2ZS11cGRhdGUgdGhlIGlzb3N1cmZhY2UgYXMgdGhlIHJhbmdlIHNsaWRlciBtb3Zlcy4gVGhlIGNvbnRyb2wgaXMgb25seVxuICAgKiAgYXZhaWxhYmxlIHdoZW4gdGhlIGFjdGl2ZSBiYWNrZW5kIHJlbmRlcnMgaXNvc3VyZmFjZXMgKElTT1NVUkZBQ0UgbW9kZSkuICovXG4gIG9uSXNvUmFuZ2VDaGFuZ2UodmFsdWVzOiBudW1iZXJbXSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghdmFsdWVzIHx8IHZhbHVlcy5sZW5ndGggPCAyKSByZXR1cm47XG4gICAgdGhpcy5pc29SYW5nZSA9IHZhbHVlcztcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldElzb3N1cmZhY2VDb250cm9scygpPy5zZXRJc29SYW5nZSh2YWx1ZXNbMF0sIHZhbHVlc1sxXSk7XG4gIH1cblxuICBvbldhbmRTZW5zaXRpdml0eUNoYW5nZSh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHJldHVybjtcbiAgICB0aGlzLndhbmRTZW5zaXRpdml0eSA9IHZhbHVlO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0V2FuZE9wdGlvbnMoeyBzZW5zaXRpdml0eTogdmFsdWUgfSk7XG4gIH1cblxuICBvbkJydXNoU2l6ZUNoYW5nZSh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHJldHVybjtcbiAgICB0aGlzLmJydXNoU2l6ZSA9IHZhbHVlO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0QnJ1c2hPcHRpb25zKHsgc2l6ZTogdmFsdWUgfSk7XG4gIH1cblxuICBvblZlcnRleEVyYXNlclJhZGl1c0NoYW5nZSh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHJldHVybjtcbiAgICB0aGlzLnZlcnRleEVyYXNlclJhZGl1cyA9IHZhbHVlO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0VmVydGV4RXJhc2VyUmFkaXVzKHZhbHVlKTtcbiAgfVxuXG4gIHpvb21JbigpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnpvb21JbigpO1xuICB9XG5cbiAgem9vbU91dCgpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnpvb21PdXQoKTtcbiAgfVxuXG4gIGRlbGV0ZVJlZ2lvbigpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmRlbGV0ZUFjdGl2ZVNoYXBlKCk7XG4gIH1cblxuICAvKiogVW5kbyB0aGUgbW9zdCByZWNlbnQgcmVnaW9uIGFjdGlvbiAoaml0LXVpIzg1KS4gVXAgdG8gMTAgc3RlcHMgYmFjay4gKi9cbiAgdW5kb1JlZ2lvbigpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnVuZG8oKTtcbiAgfVxuXG4gIC8qKiBSZWRvIHRoZSBtb3N0IHJlY2VudGx5IHVuZG9uZSByZWdpb24gYWN0aW9uIChqaXQtdWkjODUpLiAqL1xuICByZWRvUmVnaW9uKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2UucmVkbygpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJlZ2lvbiBzZXQtb3BlcmF0aW9ucyBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24gKGppdC11aSM4NSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFRoZSBjdXJyZW50bHktc2VsZWN0ZWQgcmVnaW9ucyAobGl2ZSBzdG9yZSBpbnN0YW5jZXMpLiAqL1xuICBwcml2YXRlIGdldCBzZWxlY3RlZFJlZ2lvbnMoKTogUmVnaW9uW10ge1xuICAgIGNvbnN0IGFsbCA9IHRoaXMucGxvdFNlcnZpY2UuZ2V0UmVnaW9ucygpO1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSW5kaWNlc1xuICAgICAgLm1hcCgoaSkgPT4gYWxsW2ldKVxuICAgICAgLmZpbHRlcigocik6IHIgaXMgUmVnaW9uID0+ICEhcik7XG4gIH1cblxuICAvKiogUmVnaW9ucyBlbGlnaWJsZSBmb3Igc2V0LW9wczogY2xvc2VkIGFyZWFzIChyZWN0IC8gY2xvc2VkIHBvbHlnb24gL1xuICAgKiAgbXVsdGktcG9seWdvbiksIGV4Y2x1ZGluZyBpbnRlbnNpdHktcHJvZmlsZSBsaW5lcy4gKi9cbiAgcHJpdmF0ZSBvcEVsaWdpYmxlKHJlZ2lvbnM6IFJlZ2lvbltdKTogUmVnaW9uW10ge1xuICAgIHJldHVybiByZWdpb25zLmZpbHRlcigocikgPT4gci5raW5kICE9PSAncHJvZmlsZScgJiYgKFxuICAgICAgci5ib3VuZHMgaW5zdGFuY2VvZiBSZWN0YW5nbGUgfHxcbiAgICAgIHIuYm91bmRzIGluc3RhbmNlb2YgTXVsdGlQb2x5Z29uIHx8XG4gICAgICAoci5ib3VuZHMgaW5zdGFuY2VvZiBQb2x5Z29uICYmIHIuYm91bmRzLmNsb3NlZCAhPT0gZmFsc2UpXG4gICAgKSk7XG4gIH1cblxuICAvKiogSW1hZ2UgcGl4ZWwgZGltZW5zaW9ucyBmb3IgdGhlIHJhc3RlciBvcHM7IGZhbGxzIGJhY2sgdG8gdGhlIHNlbGVjdGlvbidzXG4gICAqICBleHRlbnQgd2hlbiB0aGUgaW1hZ2Ugc2l6ZSBpc24ndCBrbm93biAoa2VlcHMgY2xhbXBpbmcgc2FuZSkuICovXG4gIHByaXZhdGUgb3BJbWFnZURpbXMocmVnaW9uczogUmVnaW9uW10pOiB7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0ge1xuICAgIGxldCBbdywgaF0gPSB0aGlzLmltYWdlSW5mbz8udHJ1ZUltYWdlU2l6ZSA/PyBbMCwgMF07XG4gICAgaWYgKCEodyA+IDApIHx8ICEoaCA+IDApKSB7XG4gICAgICBsZXQgbWF4WCA9IDAsIG1heFkgPSAwO1xuICAgICAgY29uc3Qgc2NhbiA9ICh4czogbnVtYmVyW10sIHlzOiBudW1iZXJbXSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHggb2YgeHMpIG1heFggPSBNYXRoLm1heChtYXhYLCB4KTtcbiAgICAgICAgZm9yIChjb25zdCB5IG9mIHlzKSBtYXhZID0gTWF0aC5tYXgobWF4WSwgeSk7XG4gICAgICB9O1xuICAgICAgZm9yIChjb25zdCByIG9mIHJlZ2lvbnMpIHtcbiAgICAgICAgY29uc3QgYiA9IHIuYm91bmRzO1xuICAgICAgICBpZiAoYiBpbnN0YW5jZW9mIFJlY3RhbmdsZSkgc2NhbihbYi54ICsgYi53aWR0aF0sIFtiLnkgKyBiLmhlaWdodF0pO1xuICAgICAgICBlbHNlIGlmIChiIGluc3RhbmNlb2YgUG9seWdvbikgc2NhbihiLnhwb2ludHMsIGIueXBvaW50cyk7XG4gICAgICAgIGVsc2UgaWYgKGIgaW5zdGFuY2VvZiBNdWx0aVBvbHlnb24pIGZvciAoY29uc3QgcCBvZiBiLnBvbHlnb25zKSBzY2FuKHAueHBvaW50cywgcC55cG9pbnRzKTtcbiAgICAgIH1cbiAgICAgIHcgPSBNYXRoLm1heCh3LCBNYXRoLmNlaWwobWF4WCkgKyAyKTtcbiAgICAgIGggPSBNYXRoLm1heChoLCBNYXRoLmNlaWwobWF4WSkgKyAyKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdywgaCB9O1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiDiiaUyIGVsaWdpYmxlIHJlZ2lvbnMgYXJlIHNlbGVjdGVkIChNZXJnZSBhdmFpbGFibGUpLiAqL1xuICBnZXQgY2FuTWVyZ2VSZWdpb25zKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5vcEVsaWdpYmxlKHRoaXMuc2VsZWN0ZWRSZWdpb25zKS5sZW5ndGggPj0gMjsgfVxuICAvKiogVHJ1ZSB3aGVuIGFueSBzZWxlY3RlZCByZWdpb24gaXMgbXVsdGktcGFydCAoVW5ncm91cCBhdmFpbGFibGUpLiAqL1xuICBnZXQgY2FuVW5ncm91cFJlZ2lvbnMoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnNlbGVjdGVkUmVnaW9ucy5zb21lKChyKSA9PiB0aGlzLnJlZ2lvbk9wcy5jYW5Vbmdyb3VwKHIpKTsgfVxuICAvKiogVHJ1ZSB3aGVuIOKJpTEgZWxpZ2libGUgcmVnaW9uIGlzIHNlbGVjdGVkIChJbnZlcnNlIC8gU2ltcGxpZnkgYXZhaWxhYmxlKS4gKi9cbiAgZ2V0IGhhc0VsaWdpYmxlU2VsZWN0aW9uKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5vcEVsaWdpYmxlKHRoaXMuc2VsZWN0ZWRSZWdpb25zKS5sZW5ndGggPj0gMTsgfVxuXG4gIC8qKiBTZWxlY3QgZXZlcnkgcmVnaW9uIG9uIHRoZSBpbWFnZSAoZXhjbHVkZXMgaW50ZW5zaXR5LXByb2ZpbGUgbGluZXMpLiAqL1xuICBzZWxlY3RBbGxSZWdpb25zKCk6IHZvaWQge1xuICAgIGNvbnN0IGFsbCA9IHRoaXMucGxvdFNlcnZpY2UuZ2V0UmVnaW9ucygpO1xuICAgIGNvbnN0IGluZGljZXM6IG51bWJlcltdID0gW107XG4gICAgYWxsLmZvckVhY2goKHIsIGkpID0+IHsgaWYgKHIua2luZCAhPT0gJ3Byb2ZpbGUnKSBpbmRpY2VzLnB1c2goaSk7IH0pO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlcyk7XG4gIH1cblxuICAvKiogTWVyZ2UgdGhlIHNlbGVjdGVkIHJlZ2lvbnMgaW50byBhIHNpbmdsZSAocG9zc2libHkgbXVsdGktcGFydCkgcmVnaW9uLiAqL1xuICBtZXJnZVJlZ2lvbnMoKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsID0gdGhpcy5vcEVsaWdpYmxlKHRoaXMuc2VsZWN0ZWRSZWdpb25zKTtcbiAgICBpZiAoc2VsLmxlbmd0aCA8IDIpIHJldHVybjtcbiAgICBjb25zdCB7IHcsIGggfSA9IHRoaXMub3BJbWFnZURpbXMoc2VsKTtcbiAgICBjb25zdCBtZXJnZWQgPSB0aGlzLnJlZ2lvbk9wcy5tZXJnZShzZWwsIHcsIGgpO1xuICAgIGlmIChtZXJnZWQpIHRoaXMucmVwbGFjZVJlZ2lvbnMoc2VsLCBbbWVyZ2VkXSk7XG4gIH1cblxuICAvKiogU3BsaXQgZWFjaCBzZWxlY3RlZCBtdWx0aS1wYXJ0IHJlZ2lvbiBpbnRvIG9uZSByZWdpb24gcGVyIHBhcnQuICovXG4gIHVuZ3JvdXBSZWdpb25zKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbCA9IHRoaXMuc2VsZWN0ZWRSZWdpb25zLmZpbHRlcigocikgPT4gdGhpcy5yZWdpb25PcHMuY2FuVW5ncm91cChyKSk7XG4gICAgaWYgKHNlbC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCByZXN1bHRzOiBSZWdpb25bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgciBvZiBzZWwpIHJlc3VsdHMucHVzaCguLi50aGlzLnJlZ2lvbk9wcy51bmdyb3VwKHIpKTtcbiAgICB0aGlzLnJlcGxhY2VSZWdpb25zKHNlbCwgcmVzdWx0cyk7XG4gIH1cblxuICAvKiogUmVwbGFjZSB0aGUgc2VsZWN0aW9uIHdpdGggaXRzIGludmVyc2UgaW5zaWRlIHRoZSBpbWFnZSByZWN0YW5nbGUuICovXG4gIGludmVyc2VSZWdpb25zKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbCA9IHRoaXMub3BFbGlnaWJsZSh0aGlzLnNlbGVjdGVkUmVnaW9ucyk7XG4gICAgaWYgKHNlbC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCB7IHcsIGggfSA9IHRoaXMub3BJbWFnZURpbXMoc2VsKTtcbiAgICBjb25zdCBpbnYgPSB0aGlzLnJlZ2lvbk9wcy5pbnZlcnNlKHNlbCwgdywgaCk7XG4gICAgaWYgKCFpbnYpIHtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgc2V2ZXJpdHk6ICd3YXJuJywgc3VtbWFyeTogJ0ludmVyc2UnLFxuICAgICAgICBkZXRhaWw6ICdOb3RoaW5nIHRvIGludmVydCDigJQgc2VsZWN0IG9uZSBvciBtb3JlIGNsb3NlZCByZWdpb25zIGZpcnN0LicsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZXBsYWNlUmVnaW9ucyhzZWwsIFtpbnZdKTtcbiAgfVxuXG4gIC8qKiBEb3VnbGFz4oCTUGV1Y2tlciBzaW1wbGlmeSBlYWNoIHNlbGVjdGVkIHJlZ2lvbiBieSBgdGhyZXNob2xkUHhgLiAqL1xuICBzaW1wbGlmeVJlZ2lvbnModGhyZXNob2xkUHg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHNlbCA9IHRoaXMub3BFbGlnaWJsZSh0aGlzLnNlbGVjdGVkUmVnaW9ucyk7XG4gICAgaWYgKHNlbC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLnJlcGxhY2VSZWdpb25zKHNlbCwgc2VsLm1hcCgocikgPT4gdGhpcy5yZWdpb25PcHMuc2ltcGxpZnkociwgdGhyZXNob2xkUHgpKSk7XG4gICAgdGhpcy5kaXNwbGF5U2ltcGxpZnlEaWFsb2cgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBPcGVuIHRoZSBjdXN0b20tdGhyZXNob2xkIHNpbXBsaWZ5IGRpYWxvZy4gKi9cbiAgb3BlblNpbXBsaWZ5RGlhbG9nKCk6IHZvaWQgeyB0aGlzLmRpc3BsYXlTaW1wbGlmeURpYWxvZyA9IHRydWU7IH1cblxuICAvKipcbiAgICogQ29tbWl0IGEgc2V0LW9wOiBkcm9wIHRoZSBgcmVtb3ZlYCByZWdpb25zLCBhcHBlbmQgYGFkZGAsIGFuZCBzZWxlY3QgdGhlXG4gICAqIHJlc3VsdHMuIEdvZXMgdGhyb3VnaCBzZXRSZWdpb25zIHNvIGl0J3MgdW5kby10cmFja2VkIGFuZCByZS1yZW5kZXJlZDtcbiAgICogcHJvZmlsZSBsaW5lcyBhbmQgdW5zZWxlY3RlZCByZWdpb25zIGFyZSBwcmVzZXJ2ZWQuXG4gICAqL1xuICBwcml2YXRlIHJlcGxhY2VSZWdpb25zKHJlbW92ZTogUmVnaW9uW10sIGFkZDogUmVnaW9uW10pOiB2b2lkIHtcbiAgICBpZiAoYWRkLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IHJlbW92ZVNldCA9IG5ldyBTZXQocmVtb3ZlKTtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25zKCkuZmlsdGVyKChyKSA9PiAhcmVtb3ZlU2V0LmhhcyhyKSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRSZWdpb25zKFsuLi5rZXB0LCAuLi5hZGRdKTsgLy8gbWludHMgaWRzIG9uIGBhZGRgLCByZWNvcmRzIHVuZG9cbiAgICBjb25zdCBzdG9yZWQgPSB0aGlzLnBsb3RTZXJ2aWNlLmdldFJlZ2lvbnMoKTtcbiAgICBjb25zdCBzZWwgPSBhZGQubWFwKChyKSA9PiBzdG9yZWQuaW5kZXhPZihyKSkuZmlsdGVyKChpKSA9PiBpID49IDApO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoc2VsKTtcbiAgfVxuXG4gIC8qKiBCb3gtcHJvbXB0ZWQgU0FNIHNlZ21lbnRhdGlvbiBvZiB0aGUgZHJhd24gcmVjdGFuZ2xlcyAoaml0LXVpIzkwKS4gQSBzdGlja3lcbiAgICogIGBzYW1gIHRvYXN0IHNob3dzIGxpdmUgc3RhdHVzICsgYSBkb3dubG9hZCBwcm9ncmVzcyBiYXIgKGZpcnN0IHJ1biBwdWxscyB0aGVcbiAgICogIGVuY29kZXIsIH4xNzAgTUIpOyBpdCBzdGF5cyBvcGVuIHVudGlsIHRoZSBydW4gZmluaXNoZXMgKGJhciBoaXRzIDEwMCUpLiAqL1xuICBhc3luYyBzZWdtZW50UmVnaW9ucygpIHtcbiAgICBhd2FpdCB0aGlzLnJ1blNlZ21lbnRXaXRoVG9hc3QoJ1NBTScsIHRoaXMuc2FtVG9vbCwgKCkgPT4gdGhpcy5wbG90U2VydmljZS5zZWdtZW50UmVjdGFuZ2xlcygpKTtcbiAgfVxuXG4gIC8qKiBBdXRvLXNlZ21lbnQgY2VsbHMgaW5zaWRlIGVhY2ggZHJhd24gcmVjdGFuZ2xlIHdpdGggY2VsbHBvc2UtU0FNLCBjbGllbnQtc2lkZVxuICAgKiAgKGppdC11aSM5MCkuIEVhY2ggYm94IGlzIGNyb3BwZWQgKGJyb3dzZXIgc2xpZGUtY3JvcCkgdGhlbiBydW4gdGhyb3VnaCB0aGVcbiAgICogIGNlbGxwb3NlLWpzIG1vZGVsOyB0aGUgc2FtZSBzdGlja3kgYHNhbWAgdG9hc3QgKyBwcm9ncmVzcyBiYXIgaXMgcmV1c2VkLiAqL1xuICBhc3luYyBzZWdtZW50Q2VsbHBvc2UoKSB7XG4gICAgYXdhaXQgdGhpcy5ydW5TZWdtZW50V2l0aFRvYXN0KCdDZWxscG9zZScsIHRoaXMuY2VsbFNlZ21lbnRUb29sLCAoKSA9PlxuICAgICAgdGhpcy5wbG90U2VydmljZS5zZWdtZW50UmVjdGFuZ2xlc0NlbGxwb3NlKCksXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBTaGFyZWQgZHJpdmVyIGZvciB0aGUgYm94LXByb21wdCBzZWdtZW50IHRvb2xzOiB3aXJlcyB0aGUgdG9vbCdzIHN0YXR1cyArXG4gICAqICBkb3dubG9hZCBwcm9ncmVzcyBpbnRvIHRoZSBzdGlja3kgYHNhbWAgdG9hc3QsIHJ1bnMgYG9wYCwgYW5kIHJlcG9ydHMgdGhlXG4gICAqICByZWdpb24gY291bnQuIEtlZXBzIHRoZSB0b2FzdCBvcGVuIHVudGlsIHRoZSBydW4gc2V0dGxlcyAoYmFyIGhpdHMgMTAwJSkuICovXG4gIHByaXZhdGUgYXN5bmMgcnVuU2VnbWVudFdpdGhUb2FzdChcbiAgICBsYWJlbDogc3RyaW5nLFxuICAgIHRvb2w6IHsgc3RhdHVzJDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz47IHByb2dyZXNzJDogQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4gfSxcbiAgICBvcDogKCkgPT4gUHJvbWlzZTxudW1iZXI+LFxuICApIHtcbiAgICB0aGlzLnNhbVN0YXR1cyA9ICdTdGFydGluZ+KApic7XG4gICAgdGhpcy5zYW1Qcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5zYW1Eb3dubG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuc2FtQnVzeSA9IHRydWU7XG4gICAgY29uc3QgcHN1YiA9IHRvb2wucHJvZ3Jlc3MkLnN1YnNjcmliZSgoZikgPT4ge1xuICAgICAgdGhpcy5zYW1Eb3dubG9hZGluZyA9IGYgPj0gMCAmJiBmIDwgMTtcbiAgICAgIGlmIChmID49IDApIHRoaXMuc2FtUHJvZ3Jlc3MgPSBNYXRoLm1pbigxMDAsIE1hdGgucm91bmQoZiAqIDEwMCkpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pO1xuICAgIGNvbnN0IHNzdWIgPSB0b29sLnN0YXR1cyQuc3Vic2NyaWJlKChtKSA9PiB7XG4gICAgICBpZiAobSkge1xuICAgICAgICB0aGlzLnNhbVN0YXR1cyA9IG07XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnNob3dTYW1Ub2FzdChsYWJlbCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG4gPSBhd2FpdCBvcCgpO1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICBzZXZlcml0eTogbiA+IDAgPyAnc3VjY2VzcycgOiAnd2FybicsXG4gICAgICAgIHN1bW1hcnk6IGxhYmVsLFxuICAgICAgICBkZXRhaWw6IHRvb2wuc3RhdHVzJC52YWx1ZSB8fCAobiA+IDAgPyBgQWRkZWQgJHtufSByZWdpb24ocykuYCA6ICdObyByZWdpb25zIGFkZGVkLicpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogYCR7bGFiZWx9IGZhaWxlZGAsIGRldGFpbDogU3RyaW5nKGUpIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBwc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICBzc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLmhpZGVTYW1Ub2FzdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTaG93IHRoZSBzaGFyZWQgc3RpY2t5IGBzYW1gIHRvYXN0IG9uY2UgKGlkZW1wb3RlbnQg4oCUIHJlLWFkZGluZyB3b3VsZCBzdGFja1xuICAgKiAgYSBuZXcgdG9hc3Qgb24gZXZlcnkgcG9pbnQgY2xpY2spLiAqL1xuICBwcml2YXRlIHNob3dTYW1Ub2FzdChzdW1tYXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zYW1Ub2FzdFNob3duKSByZXR1cm47XG4gICAgdGhpcy5zYW1Ub2FzdFNob3duID0gdHJ1ZTtcbiAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IGtleTogdGhpcy5zYW1Ub2FzdEtleSwgc3RpY2t5OiB0cnVlLCBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5IH0pO1xuICB9XG5cbiAgLyoqIERpc21pc3MgdGhlIHNoYXJlZCBgc2FtYCB0b2FzdCBhbmQgcmVzZXQgaXRzIHByb2dyZXNzL3NwaW5uZXIgc3RhdGUuICovXG4gIHByaXZhdGUgaGlkZVNhbVRvYXN0KCk6IHZvaWQge1xuICAgIHRoaXMuc2FtVG9hc3RTaG93biA9IGZhbHNlO1xuICAgIHRoaXMuc2FtQnVzeSA9IGZhbHNlO1xuICAgIHRoaXMuc2FtRG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnNhbVByb2dyZXNzID0gMDtcbiAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmNsZWFyKHRoaXMuc2FtVG9hc3RLZXkpO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKiBQaWNrIHRoZSBTQU0gbW9kZWwgdGhlIHNlZ21lbnQgdG9vbHMgdXNlIChqaXQtdWkjOTAgUDEpLiAqL1xuICBvblNhbU1vZGVsQ2hhbmdlKGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNhbU1vZGVsSWQgPSBpZDtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFNhbU1vZGVsKGlkKTtcbiAgfVxuXG4gIC8qKiBDb252ZXJ0IHRoZSBzZWxlY3RlZCByZWdpb24gdG8gYSBzbW9vdGggYmV6aWVyIGN1cnZlLiAqL1xuICB0b0JlemllclJlZ2lvbigpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldFJlZ2lvbk92ZXJsYXkoKT8uc2V0U2VsZWN0ZWRCZXppZXIodHJ1ZSk7XG4gIH1cblxuICAvKiogQ29udmVydCB0aGUgc2VsZWN0ZWQgcmVnaW9uIGJhY2sgdG8gYSBzdHJhaWdodC1lZGdlZCBwb2x5Z29uLiAqL1xuICB0b1BvbHlnb25SZWdpb24oKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25PdmVybGF5KCk/LnNldFNlbGVjdGVkQmV6aWVyKGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbW1lZGlhdGUgcmVnaW9uIGFjdGlvbnMgb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIChqaXQtdWkjODUpOiBtZXJnZSxcbiAgICogdW5ncm91cCwgaW52ZXJzZSwgc2ltcGxpZnksIHRoZSBCw6l6aWVyIGNvbnZlcnNpb25zLCBhbmQgZGVsZXRlIOKAlCB0aGVcbiAgICogb25lLXNob3QgZ2VvbWV0cnkgdHJhbnNmb3JtcywgZ3JvdXBlZCBhcGFydCBmcm9tIHRoZSB0b29sL21vZGUgdG9nZ2xlcyBhbmRcbiAgICogc2hvd24gb25seSB3aGVuIHNvbWV0aGluZyBpcyBzZWxlY3RlZC4gRWFjaCBpdGVtIGlzIGdhdGVkIG9uIHdoYXQgdGhlXG4gICAqIHNlbGVjdGlvbiBzdXBwb3J0cy5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRSZWdpb25BY3Rpb25JdGVtcygpOiBNZW51SXRlbVtdIHtcbiAgICBjb25zdCBhbGwgPSB0aGlzLnBsb3RTZXJ2aWNlLmdldFJlZ2lvbnMoKTtcbiAgICBjb25zdCBzZWxlY3RhYmxlID0gYWxsLmZpbHRlcigocikgPT4gci5raW5kICE9PSAncHJvZmlsZScpO1xuICAgIGlmIChzZWxlY3RhYmxlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGl0ZW1zOiBNZW51SXRlbVtdID0gW107XG5cbiAgICAvLyBTZWxlY3QgYWxsIOKAlCBhdmFpbGFibGUgd2hlbmV2ZXIgdGhlIGltYWdlIGhhcyByZWdpb25zLCByZWdhcmRsZXNzIG9mIHRoZVxuICAgIC8vIGN1cnJlbnQgc2VsZWN0aW9uLlxuICAgIGl0ZW1zLnB1c2goe1xuICAgICAgbGFiZWw6ICdTZWxlY3QgYWxsIHJlZ2lvbnMnLCBpY29uOiAncGkgcGktY2hlY2stc3F1YXJlJyxcbiAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMuc2VsZWN0QWxsUmVnaW9ucygpLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2VsQWxsID0gdGhpcy5zZWxlY3RlZFJlZ2lvbnM7XG4gICAgaWYgKHNlbEFsbC5sZW5ndGggPT09IDApIHJldHVybiBpdGVtcztcbiAgICBjb25zdCBlbGlnaWJsZSA9IHRoaXMub3BFbGlnaWJsZShzZWxBbGwpO1xuXG4gICAgaWYgKGVsaWdpYmxlLmxlbmd0aCA+PSAyKSB7XG4gICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdNZXJnZSAvIGdyb3VwJywgaWNvbjogJ3BpIHBpLWxpbmsnLCBjb21tYW5kOiAoKSA9PiB0aGlzLm1lcmdlUmVnaW9ucygpIH0pO1xuICAgIH1cbiAgICBpZiAoc2VsQWxsLnNvbWUoKHIpID0+IHRoaXMucmVnaW9uT3BzLmNhblVuZ3JvdXAocikpKSB7XG4gICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdVbmdyb3VwJywgaWNvbjogJ3BpIHBpLXNpdGVtYXAnLCBjb21tYW5kOiAoKSA9PiB0aGlzLnVuZ3JvdXBSZWdpb25zKCkgfSk7XG4gICAgfVxuICAgIGlmIChlbGlnaWJsZS5sZW5ndGggPj0gMSkge1xuICAgICAgaXRlbXMucHVzaChcbiAgICAgICAgeyBsYWJlbDogJ0ludmVyc2UnLCBpY29uOiAncGkgcGktY2xvbmUnLCBjb21tYW5kOiAoKSA9PiB0aGlzLmludmVyc2VSZWdpb25zKCkgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnU2ltcGxpZnknLCBpY29uOiAncGkgcGktY2hhcnQtbGluZScsXG4gICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdMaWdodCAoMSBweCknLCBjb21tYW5kOiAoKSA9PiB0aGlzLnNpbXBsaWZ5UmVnaW9ucygxKSB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ01lZGl1bSAoMyBweCknLCBjb21tYW5kOiAoKSA9PiB0aGlzLnNpbXBsaWZ5UmVnaW9ucygzKSB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ1N0cm9uZyAoOCBweCknLCBjb21tYW5kOiAoKSA9PiB0aGlzLnNpbXBsaWZ5UmVnaW9ucyg4KSB9LFxuICAgICAgICAgICAgeyBzZXBhcmF0b3I6IHRydWUgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdDdXN0b23igKYnLCBjb21tYW5kOiAoKSA9PiB0aGlzLm9wZW5TaW1wbGlmeURpYWxvZygpIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIELDqXppZXIgY29udmVyc2lvbnMgYXJlIHZlcnRleC1sZXZlbCBlZGl0cyDigJQgSW1hZ2UgKE9wZW5TZWFkcmFnb24pIHZpZXdcbiAgICAvLyBvbmx5IOKAlCBnYXRlZCBvbiB0aGUgc2VsZWN0aW9uJ3MgY3VycmVudCBmb3JtLlxuICAgIGlmICh0aGlzLnNlbGVjdGVkUGxvdFR5cGUgPT09IFBsb3RUeXBlLklNQUdFKSB7XG4gICAgICBjb25zdCBoYXNTdHJhaWdodCA9IHNlbEFsbC5zb21lKChyKSA9PlxuICAgICAgICAoci5ib3VuZHMgaW5zdGFuY2VvZiBQb2x5Z29uICYmICFyLmJvdW5kcy5iZXppZXIpIHx8IHIuYm91bmRzIGluc3RhbmNlb2YgUmVjdGFuZ2xlKTtcbiAgICAgIGNvbnN0IGhhc0JlemllciA9IHNlbEFsbC5zb21lKChyKSA9PiByLmJvdW5kcyBpbnN0YW5jZW9mIFBvbHlnb24gJiYgci5ib3VuZHMuYmV6aWVyKTtcbiAgICAgIGlmIChoYXNTdHJhaWdodCkge1xuICAgICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdDb252ZXJ0IHRvIELDqXppZXInLCBpY29uOiAndG8tYmV6aWVyLWljb24nLCBjb21tYW5kOiAoKSA9PiB0aGlzLnRvQmV6aWVyUmVnaW9uKCkgfSk7XG4gICAgICB9XG4gICAgICBpZiAoaGFzQmV6aWVyKSB7XG4gICAgICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogJ0NvbnZlcnQgdG8gcG9seWdvbicsIGljb246ICd0by1wb2x5Z29uLWljb24nLCBjb21tYW5kOiAoKSA9PiB0aGlzLnRvUG9seWdvblJlZ2lvbigpIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdEZWxldGUgcmVnaW9uJywgaWNvbjogJ3BpIHBpLXRyYXNoJywgY29tbWFuZDogKCkgPT4gdGhpcy5kZWxldGVSZWdpb24oKSB9KTtcbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQ29udGV4dE1lbnVJdGVtcygpOiBNZW51SXRlbVtdIHtcbiAgICBjb25zdCBhY3RpdmUgPSB0aGlzLmFjdGl2ZURyYWdNb2RlO1xuICAgIGNvbnN0IGFjdGl2ZUNsYXNzID0gJ2NvbnRleHQtbWVudS1hY3RpdmUnO1xuICAgIGNvbnN0IGl0ZW1zOiBNZW51SXRlbVtdID0gW107XG4gICAgLy8gU2VsZWN0ZWQtcmVnaW9uIGFjdGlvbnMgbGVhZCB0aGUgbWVudSAoc2VwYXJhdGVkIGZyb20gdGhlIHRvb2wgdG9nZ2xlcykuXG4gICAgaWYgKHRoaXMuaXNIZWF0bWFwKSB7XG4gICAgICBjb25zdCBhY3Rpb25zID0gdGhpcy5idWlsZFJlZ2lvbkFjdGlvbkl0ZW1zKCk7XG4gICAgICBpZiAoYWN0aW9ucy5sZW5ndGgpIGl0ZW1zLnB1c2goLi4uYWN0aW9ucywgeyBzZXBhcmF0b3I6IHRydWUgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzSGVhdG1hcCkge1xuICAgICAgaXRlbXMucHVzaChcbiAgICAgICAgeyBsYWJlbDogJ0F1dG9zY2FsZScsIGljb246ICdwaSBwaS13aW5kb3ctbWF4aW1pemUnLCBjb21tYW5kOiAoKSA9PiB0aGlzLmF1dG9zY2FsZUltYWdlKCkgfSxcbiAgICAgICAgeyBzZXBhcmF0b3I6IHRydWUgfSxcbiAgICAgICk7XG4gICAgICAvLyAnWm9vbSBzZWxlY3Rpb24nIGlzIFBsb3RseSdzIHJ1YmJlci1iYW5kIHpvb207IGl0IGRvZXNuJ3QgYXBwbHkgdG8gdGhlXG4gICAgICAvLyBPcGVuU2VhZHJhZ29uLWJhY2tlZCBJbWFnZSB2aWV3ICh1c2UgJ1pvb20gdG8gYm94JyB0aGVyZSBpbnN0ZWFkKS5cbiAgICAgIGlmICghdGhpcy5pc0ltYWdlVmlldykge1xuICAgICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgICBsYWJlbDogJ1pvb20gc2VsZWN0aW9uJyxcbiAgICAgICAgICBpY29uOiAncGkgcGktc2VhcmNoJyxcbiAgICAgICAgICBzdHlsZUNsYXNzOiBhY3RpdmUgPT09ICd6b29tJyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnem9vbScpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICBsYWJlbDogJ1pvb20gdG8gYm94JyxcbiAgICAgICAgaWNvbjogJ3pvb20tYm94LW9mZi1pY29uJyxcbiAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnem9vbVRvQm94JyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ3pvb21Ub0JveCcpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzSGVhdG1hcCkge1xuICAgICAgaXRlbXMucHVzaCh7XG4gICAgICAgIGxhYmVsOiAnUGFuJyxcbiAgICAgICAgaWNvbjogJ3BpIHBpLWFycm93cy1hbHQnLFxuICAgICAgICBzdHlsZUNsYXNzOiBhY3RpdmUgPT09ICdwYW4nID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgncGFuJyksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgczNkID0gdGhpcy5hY3RpdmVTdXJmYWNlM2RNb2RlO1xuICAgICAgaXRlbXMucHVzaChcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnWm9vbScsXG4gICAgICAgICAgaWNvbjogJ3BpIHBpLXNlYXJjaCcsXG4gICAgICAgICAgc3R5bGVDbGFzczogczNkID09PSAnem9vbScgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlU3VyZmFjZTNkTW9kZSgnem9vbScpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdQYW4nLFxuICAgICAgICAgIGljb246ICdwaSBwaS1hcnJvd3MtYWx0JyxcbiAgICAgICAgICBzdHlsZUNsYXNzOiBzM2QgPT09ICdwYW4nID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZVN1cmZhY2UzZE1vZGUoJ3BhbicpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdPcmJpdGFsIHJvdGF0aW9uJyxcbiAgICAgICAgICBpY29uOiAncGkgcGktZ2xvYmUnLFxuICAgICAgICAgIHN0eWxlQ2xhc3M6IHMzZCA9PT0gJ29yYml0JyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVTdXJmYWNlM2RNb2RlKCdvcmJpdCcpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdUdXJudGFibGUgcm90YXRpb24nLFxuICAgICAgICAgIGljb246ICdwaSBwaS1zeW5jJyxcbiAgICAgICAgICBzdHlsZUNsYXNzOiBzM2QgPT09ICd0dXJudGFibGUnID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZVN1cmZhY2UzZE1vZGUoJ3R1cm50YWJsZScpLFxuICAgICAgICB9LFxuICAgICAgICB7IHNlcGFyYXRvcjogdHJ1ZSB9LFxuICAgICAgICB7IGxhYmVsOiAnUmVzZXQgY2FtZXJhJywgaWNvbjogJ3BpIHBpLWhvbWUnLCBjb21tYW5kOiAoKSA9PiB0aGlzLnJlc2V0U3VyZmFjZUNhbWVyYSgpIH0sXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0hlYXRtYXApIHtcbiAgICAgIGl0ZW1zLnB1c2goXG4gICAgICAgIHsgbGFiZWw6ICdab29tIGluJywgaWNvbjogJ3BpIHBpLXNlYXJjaC1wbHVzJywgY29tbWFuZDogKCkgPT4gdGhpcy56b29tSW4oKSB9LFxuICAgICAgICB7IGxhYmVsOiAnWm9vbSBvdXQnLCBpY29uOiAncGkgcGktc2VhcmNoLW1pbnVzJywgY29tbWFuZDogKCkgPT4gdGhpcy56b29tT3V0KCkgfSxcbiAgICAgICAgeyBzZXBhcmF0b3I6IHRydWUgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnU2VsZWN0JyxcbiAgICAgICAgICBpY29uOiAncGkgcGktYXJyb3ctdXAtcmlnaHQnLFxuICAgICAgICAgIHN0eWxlQ2xhc3M6IGFjdGl2ZSA9PT0gJ3NlbGVjdCcgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ3NlbGVjdCcpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdGcmVlZm9ybScsXG4gICAgICAgICAgaWNvbjogJ3BpIHBpLXBlbmNpbCcsXG4gICAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnZHJhd2Nsb3NlZHBhdGgnID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdkcmF3Y2xvc2VkcGF0aCcpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdCcnVzaCcsXG4gICAgICAgICAgaWNvbjogJ2JydXNoLWljb24nLFxuICAgICAgICAgIHN0eWxlQ2xhc3M6IGFjdGl2ZSA9PT0gJ2JydXNoJyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnYnJ1c2gnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnUG9seWxpbmUnLFxuICAgICAgICAgIGljb246ICdwb2x5bGluZS1pY29uJyxcbiAgICAgICAgICBzdHlsZUNsYXNzOiBhY3RpdmUgPT09ICdkcmF3b3BlbnBhdGgnID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdkcmF3b3BlbnBhdGgnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnUmVjdGFuZ2xlJyxcbiAgICAgICAgICBpY29uOiAncGkgcGktc3RvcCcsXG4gICAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnZHJhd3JlY3QnID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdkcmF3cmVjdCcpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdXYW5kJyxcbiAgICAgICAgICBpY29uOiAnd2FuZC1pY29uJyxcbiAgICAgICAgICBzdHlsZUNsYXNzOiBhY3RpdmUgPT09ICd3YW5kJyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnd2FuZCcpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdWZXJ0ZXggZXJhc2VyJyxcbiAgICAgICAgICBpY29uOiAncGkgcGktZXJhc2VyJyxcbiAgICAgICAgICBzdHlsZUNsYXNzOiBhY3RpdmUgPT09ICdlcmFzZVZlcnRleCcgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ2VyYXNlVmVydGV4JyksXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgLy8gVmVydGV4IGVkaXRpbmcgcnVucyBvbiB0aGUgT3BlblNlYWRyYWdvbiBvdmVybGF5LCB3aGljaFxuICAgICAgLy8gYmFja3MgdGhlIEltYWdlIHBsb3QgdHlwZS4gSGlkZGVuIGZvciBvdGhlciAyRCB0eXBlcyAoUGxvdGx5KSwgd2hlcmVcbiAgICAgIC8vIHRoZXNlIG1vZGVzIGFyZSBuby1vcHMuXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFBsb3RUeXBlID09PSBQbG90VHlwZS5JTUFHRSkge1xuICAgICAgICBpdGVtcy5wdXNoKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnUG9seWdvbiAoY2xpY2sgdmVydGljZXMpJyxcbiAgICAgICAgICAgIGljb246ICdwb2x5Z29uLXZlcnRpY2VzLWljb24nLFxuICAgICAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnZHJhd3BvbHlnb24nID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ2RyYXdwb2x5Z29uJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ0FkZCB2ZXJ0ZXgnLFxuICAgICAgICAgICAgaWNvbjogJ3ZlcnRleC1hZGQtaWNvbicsXG4gICAgICAgICAgICBzdHlsZUNsYXNzOiBhY3RpdmUgPT09ICdhZGRwb2ludCcgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnYWRkcG9pbnQnKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnRGVsZXRlIHZlcnRleCcsXG4gICAgICAgICAgICBpY29uOiAndmVydGV4LWRlbGV0ZS1pY29uJyxcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M6IGFjdGl2ZSA9PT0gJ2RlbGV0ZXBvaW50JyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdkZWxldGVwb2ludCcpLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBCw6l6aWVyIGNvbnZlcnNpb25zICsgRGVsZXRlIGFyZSBpbW1lZGlhdGUgc2VsZWN0aW9uICphY3Rpb25zKiwgbm93IGluIHRoZVxuICAgICAgLy8gXCJTZWxlY3RlZCByZWdpb24ocylcIiBncm91cCBhdCB0aGUgdG9wIChzZWUgYnVpbGRSZWdpb25BY3Rpb25JdGVtcykuXG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIHRvZ2dsZVN1cmZhY2UzZE1vZGUobW9kZTogc3RyaW5nKSB7XG4gICAgdGhpcy5hY3RpdmVTdXJmYWNlM2RNb2RlID0gbW9kZTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFN1cmZhY2VEcmFnTW9kZShtb2RlKTtcbiAgfVxuXG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnJlc2V0U3VyZmFjZUNhbWVyYSgpO1xuICB9XG5cbiAgLyoqIFRvZ2dsZSB0aGUgbmFwYXJpIDNEIGNvb3JkaW5hdGUtYXhlcyAvIHNjYWxlIGdpem1vICh2b2x1bWUvaXNvc3VyZmFjZSkuIE5vLW9wIG9uIGJhY2tlbmRzXG4gICAqICB0aGF0IGRvbid0IHJlbmRlciBvbmUgKHRoZSBjb250cm9sIG1ldGhvZCBpcyBvcHRpb25hbCkuICovXG4gIHRvZ2dsZUF4ZXMoKSB7XG4gICAgdGhpcy5heGVzVmlzaWJsZSA9ICF0aGlzLmF4ZXNWaXNpYmxlO1xuICAgIHRoaXMucGxvdFNlcnZpY2UuZ2V0U3VyZmFjZTNkQ29udHJvbHMoKT8uc2V0QXhlc1Zpc2libGU/Lih0aGlzLmF4ZXNWaXNpYmxlKTtcbiAgfVxuXG4gIC8qKiBUb2dnbGUgdGhlIG5hcGFyaSBzdXJmYWNlIHdpcmVmcmFtZSAoZWRnZXMgdnMgZmlsbGVkKS4gTm8tb3Agb24gYmFja2VuZHMgd2l0aG91dCBhIHN1cmZhY2UuICovXG4gIHRvZ2dsZVdpcmVmcmFtZSgpIHtcbiAgICB0aGlzLndpcmVmcmFtZUFjdGl2ZSA9ICF0aGlzLndpcmVmcmFtZUFjdGl2ZTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldFN1cmZhY2UzZENvbnRyb2xzKCk/LnNldFdpcmVmcmFtZT8uKHRoaXMud2lyZWZyYW1lQWN0aXZlKTtcbiAgfVxuXG4gIC8qKiBDaGFuZ2UgdGhlIG5hcGFyaSAzRCBkZWNpbWF0ZSBmYWN0b3IuIERlY2ltYXRpb24gY2hhbmdlcyB0aGUgZmV0Y2hlZC9hc3NlbWJsZWQgZGF0YSwgc28gdGhpc1xuICAgKiAgcmUtcGxvdHMgdGhlIGN1cnJlbnQgM0QgdHlwZSBhdCB0aGUgbmV3IHJlc29sdXRpb24gKHVubGlrZSBheGVzL3dpcmVmcmFtZSwgd2hpY2ggYXJlIGxpdmUpLiAqL1xuICBzZWxlY3RSZXNvbHV0aW9uKHNjYWxlOiBudW1iZXIpIHtcbiAgICBpZiAoc2NhbGUgPT09IHRoaXMucmVzb2x1dGlvblNjYWxlKSByZXR1cm47XG4gICAgdGhpcy5yZXNvbHV0aW9uU2NhbGUgPSBzY2FsZTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFJlc29sdXRpb25TY2FsZT8uKHNjYWxlKTtcbiAgICB0aGlzLnJlbG9hZEFuZFBsb3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2l0Y2ggdGhlIGFjdGl2ZSBwbG90IHR5cGUgKGhlYXRtYXAsIHN1cmZhY2UsIGNvbnRvdXIsIHNjYXR0ZXIsIGxpbmUsXG4gICAqIHNjYXR0ZXIzZCwgaXNvc3VyZmFjZSkuIEtlZXBzIGBpc0hlYXRtYXBgIGFzIHRoZSAyRC12cy0zRCBmbGFnIHRoZSByZXN0IG9mXG4gICAqIHRoZSB0b29sYmFyL2NvbnRleHQtbWVudSBsb2dpYyByZWxpZXMgb24sIGRlYWN0aXZhdGVzIDJELW9ubHkgdG9vbHMgd2hlblxuICAgKiBtb3ZpbmcgdG8gYSAzRCB0eXBlLCB0aGVuIHJlLXBsb3RzLlxuICAgKi9cbiAgb25TZWxlY3RQbG90VHlwZSh0eXBlOiBQbG90VHlwZSkge1xuICAgIHRoaXMucGxvdFR5cGUgPSB0eXBlO1xuICAgIHRoaXMuc2VsZWN0ZWRQbG90VHlwZSA9IHR5cGU7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IHRoaXMucGxvdFR5cGVPcHRpb25zLmZpbmQoKGQpID0+IGQudHlwZSA9PT0gdHlwZSk7XG4gICAgY29uc3QgaXMzZCA9IGRlc2NyaXB0b3I/LmRpbWVuc2lvbnMgPT09ICczZCc7XG4gICAgdGhpcy5pc0hlYXRtYXAgPSAhaXMzZDtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFBsb3RUeXBlKHR5cGUpO1xuICAgIC8vIFN3aXRjaGluZyBwbG90IHR5cGUgY2FuY2VscyB0aGUgYWN0aXZlIHRvb2wg4oCUIG5vdCBldmVyeSB0eXBlIHN1cHBvcnRzIHRoZVxuICAgIC8vIHNhbWUgdG9vbHMgKGxpbmUvc2NhdHRlciBjaGFydHMgYW5kIDNEIHNjZW5lcyBoYXZlIG5vIGJveCB6b29tIG9yIHJlZ2lvblxuICAgIC8vIGRyYXdpbmcpLCBzbyBsZWF2aW5nIGEgdG9vbCBhcm1lZCB3b3VsZCBtaXNiZWhhdmUgb24gdGhlIG5ldyBwbG90LlxuICAgIHRoaXMuZGVhY3RpdmF0ZUFjdGl2ZVRvb2woKTtcbiAgICBpZiAoaXMzZCkge1xuICAgICAgdGhpcy5hY3RpdmVTdXJmYWNlM2RNb2RlID0gJ3R1cm50YWJsZSc7XG4gICAgfVxuICAgIC8vIG5hcGFyaS1qcyB2b2x1bWUvaXNvc3VyZmFjZSBhc3NlbWJsZSB0aGVpciBvd24gM0QgdGV4dHVyZSBmcm9tIHRoZSBzbGljZSBlbmRwb2ludCwgc29cbiAgICAvLyB0aGV5IHRha2UgdGhlIG5vcm1hbCByZS1wbG90IHBhdGgg4oCUIE5PVCBQbG90bHkncyBzdGFjay1mcmFtZSBsb2FkZXIgKHdob3NlIFwiTG9hZGluZ1xuICAgIC8vIGZyYW1lc1wiIG92ZXJsYXkgd291bGQgbmV2ZXIgY2xlYXIsIHNpbmNlIFBsb3RseSBpc24ndCB0aGUgYWN0aXZlIGJhY2tlbmQpIChqaXQtdWkjMTAyKS5cbiAgICBjb25zdCBpc05hcGFyaSA9IHR5cGUgPT09IFBsb3RUeXBlLk5BUEFSSV9JTUFHRSB8fCBpc05hcGFyaTNkKHR5cGUpO1xuICAgIGlmIChkZXNjcmlwdG9yPy5yZXF1aXJlc1N0YWNrICYmICFpc05hcGFyaSkge1xuICAgICAgLy8gVm9sdW1lIHR5cGVzIChpc29zdXJmYWNlLCBzY2F0dGVyM2QpIG5lZWQgdGhlIHdob2xlIHotc3RhY2sgbG9hZGVkIGFzIGFcbiAgICAgIC8vIDNEIGFycmF5LCBhbmQgdGhleSBhbHdheXMgcmVuZGVyIG9uIFBsb3RseS4gRHJpdmUgdGhlIHN0YWNrIHJlbG9hZFxuICAgICAgLy8gZGlyZWN0bHkgdGhyb3VnaCB0aGUgaW1hZ2UtaW5mbyBzdHJlYW0gcmF0aGVyIHRoYW4gdGhlIGFjdGl2ZSByZW5kZXJlcidzXG4gICAgICAvLyBzZXRTaG93U3RhY2s6IHdoZW4gT3BlblNlYWRyYWdvbiBvd25zIHRoZSBJbWFnZSB2aWV3IGl0cyBzZXRTaG93U3RhY2sgaXNcbiAgICAgIC8vIGEgbm8tb3AsIHNvIHRoZSByZWxvYWQgbmV2ZXIgZmlyZWQgYW5kIHRoZSBsb2FkZXIgc3B1biBmb3JldmVyLiBXZSBhcm1cbiAgICAgIC8vIFBsb3RseSdzIHN0YWNrLWxvYWRpbmcgZmxhZyAoa2VlcHMgaXRzIGZyYW1lLWZldGNoIGxvb3AgYWxpdmUpIGFuZFxuICAgICAgLy8gcmUtZW1pdCB0aGUgaW1hZ2UgaW5mbyB3aXRoIHNob3dTdGFjayBvbiBzbyB0aGUgcGlwZWxpbmUgcmVsb2FkcyBvblxuICAgICAgLy8gUGxvdGx5IHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggYmFja2VuZCB3YXMgb24gc2NyZWVuLlxuICAgICAgdGhpcy5zZWxlY3RlZFN0YWNrT3B0aW9uID0gdGhpcy5zdGFja09wdGlvbnNbMV07XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZyA9IHRydWU7XG4gICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFN0YWNrTG9hZGluZyh0cnVlKTtcbiAgICAgIGlmICh0aGlzLmltYWdlSW5mbykge1xuICAgICAgICB0aGlzLmltYWdlSW5mby5zaG93U3RhY2sgPSB0cnVlO1xuICAgICAgICB0aGlzLnN0YXRlLnNldEltYWdlSW5mbyh0aGlzLmltYWdlSW5mbyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVsb2FkQW5kUGxvdCgpO1xuICB9XG5cbiAgLyoqIERlYWN0aXZhdGUgd2hhdGV2ZXIgdG9vbCBpcyBhcm1lZCBhbmQgY2xlYXIgZXZlcnkgdG9vbCBtb2RlLiAqL1xuICBwcml2YXRlIGRlYWN0aXZhdGVBY3RpdmVUb29sKCkge1xuICAgIHRoaXMuYWN0aXZlRHJhZ01vZGUgPSBudWxsO1xuICAgIHRoaXMuc2Vzc2lvbi5zZXRBY3RpdmVUb29sKG51bGwpO1xuICAgIHRoaXMucGxvdFNlcnZpY2UuZ2V0UmVnaW9uT3ZlcmxheSgpPy5zZXRNb2RlKCdub25lJyk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXREcmFnTW9kZShmYWxzZSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRab29tVG9Cb3hNb2RlKGZhbHNlKTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFdhbmRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldEJydXNoTW9kZShmYWxzZSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRTYW1Qb2ludE1vZGUoZmFsc2UpO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0VmVydGV4RXJhc2VyTW9kZShmYWxzZSk7XG4gIH1cbn1cblxuIiwiPCEtLSBTQU0gdG9hc3Q6IGxpdmUgc3RhdHVzICsgZW5jb2Rlci1kb3dubG9hZCBwcm9ncmVzcyBiYXIgKGppdC11aSM5MCkuIFN0aWNreVxuICAgICB3aGlsZSBhIHNlZ21lbnQgcnVuczsgc3RheXMgb3BlbiB1bnRpbCB0aGUgYmFyIHJlYWNoZXMgMTAwJSBhbmQgdGhlIHJ1biBlbmRzLiAtLT5cbjxwLXRvYXN0IFtrZXldPVwic2FtVG9hc3RLZXlcIiBwb3NpdGlvbj1cImJvdHRvbS1yaWdodFwiPlxuICA8bmctdGVtcGxhdGUgbGV0LW1lc3NhZ2UgcFRlbXBsYXRlPVwibWVzc2FnZVwiPlxuICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxOyBtaW4td2lkdGg6IDE2cmVtXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9udC1ib2xkIG1iLTFcIj57eyBtZXNzYWdlLnN1bW1hcnkgfX08L2Rpdj5cbiAgICAgIDxkaXY+e3sgc2FtU3RhdHVzIHx8IG1lc3NhZ2UuZGV0YWlsIH19PC9kaXY+XG4gICAgICA8cC1wcm9ncmVzc0JhciAqbmdJZj1cInNhbURvd25sb2FkaW5nXCIgW3ZhbHVlXT1cInNhbVByb2dyZXNzXCIgc3R5bGVDbGFzcz1cIm10LTIgc2FtLXByb2dyZXNzXCI+PC9wLXByb2dyZXNzQmFyPlxuICAgICAgPHAtcHJvZ3Jlc3NCYXIgKm5nSWY9XCJzYW1CdXN5ICYmICFzYW1Eb3dubG9hZGluZ1wiIG1vZGU9XCJpbmRldGVybWluYXRlXCIgc3R5bGVDbGFzcz1cIm10LTJcIlxuICAgICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cInsgaGVpZ2h0OiAnNHB4JyB9XCI+PC9wLXByb2dyZXNzQmFyPlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9wLXRvYXN0PlxuXG48IS0tIFRvb2xiYXIgZG9jazogZG9ja2VkIGFjcm9zcyB0aGUgdG9wIGJ5IGRlZmF1bHQ7IGRyYWcgdGhlIGhhbmRsZSB0byBkZXRhY2hcbiAgICAgaXQgaW50byBhIGZsb2F0aW5nLCBtb3ZhYmxlIHdpbmRvdyAoZnJlZXMgdGhlIHRvcCByb3cgZm9yIHRoZSBpbWFnZSkuIC0tPlxuPGRpdiBjbGFzcz1cInRvb2xiYXItZG9ja1wiIFtjbGFzcy5mbG9hdGluZ109XCJ0b29sYmFyRmxvYXRpbmdcIlxuICAgICBbc3R5bGUubGVmdC5weF09XCJ0b29sYmFyRmxvYXRpbmcgPyB0b29sYmFyUG9zLnggOiBudWxsXCJcbiAgICAgW3N0eWxlLnRvcC5weF09XCJ0b29sYmFyRmxvYXRpbmcgPyB0b29sYmFyUG9zLnkgOiBudWxsXCI+XG4gIDxkaXYgY2xhc3M9XCJ0b29sYmFyLWRyYWctaGFuZGxlXCIgKG1vdXNlZG93bik9XCJvblRvb2xiYXJEcmFnU3RhcnQoJGV2ZW50KVwiXG4gICAgICAgcFRvb2x0aXA9XCJEcmFnIHRvIGZsb2F0IHRoZSB0b29sYmFyXCIgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCI+XG4gICAgPGkgY2xhc3M9XCJwaSBwaS1iYXJzXCI+PC9pPlxuICA8L2Rpdj5cbjxwbG90dGluZy10b29sYmFyXG4gIFtpbWFnZUluZm9dPVwiaW1hZ2VJbmZvXCJcbiAgW3Bsb3RUeXBlT3B0aW9uc109XCJwbG90VHlwZU9wdGlvbnNcIlxuICBbc2VsZWN0ZWRQbG90VHlwZV09XCJzZWxlY3RlZFBsb3RUeXBlXCJcbiAgW2lzb1JhbmdlXT1cImlzb1JhbmdlXCJcbiAgW21heEluZGV4XT1cIm1heEluZGV4XCJcbiAgW3pJbmRleF09XCJ6SW5kZXhcIlxuICBbaXNIZWF0bWFwXT1cImlzSGVhdG1hcFwiXG4gIFthY3RpdmVEcmFnTW9kZV09XCJhY3RpdmVEcmFnTW9kZVwiXG4gIFthY3RpdmVTdXJmYWNlM2RNb2RlXT1cImFjdGl2ZVN1cmZhY2UzZE1vZGVcIlxuICBbYXhlc1Zpc2libGVdPVwiYXhlc1Zpc2libGVcIlxuICBbd2lyZWZyYW1lQWN0aXZlXT1cIndpcmVmcmFtZUFjdGl2ZVwiXG4gIFtyZXNvbHV0aW9uU2NhbGVdPVwicmVzb2x1dGlvblNjYWxlXCJcbiAgW3dhbmRTZW5zaXRpdml0eV09XCJ3YW5kU2Vuc2l0aXZpdHlcIlxuICBbYnJ1c2hTaXplXT1cImJydXNoU2l6ZVwiXG4gIFtzYW1Nb2RlbHNdPVwic2FtTW9kZWxzXCJcbiAgW3NhbU1vZGVsSWRdPVwic2FtTW9kZWxJZFwiXG4gIFt2ZXJ0ZXhFcmFzZXJSYWRpdXNdPVwidmVydGV4RXJhc2VyUmFkaXVzXCJcbiAgW2NhblVuZG9dPVwiY2FuVW5kb1JlZ2lvblwiXG4gIFtjYW5SZWRvXT1cImNhblJlZG9SZWdpb25cIlxuICBbc3RhY2tPcHRpb25zXT1cInN0YWNrT3B0aW9uc1wiXG4gIFt0b29sc109XCJ0b29sYmFyVG9vbHNcIlxuICBbaW1hZ2VTbW9vdGhpbmdFbmFibGVkXT1cImltYWdlU21vb3RoaW5nRW5hYmxlZFwiXG4gIChzZWxlY3RQbG90VHlwZSk9XCJvblNlbGVjdFBsb3RUeXBlKCRldmVudClcIlxuICAodG9nZ2xlSW1hZ2VTbW9vdGhpbmcpPVwib25Ub2dnbGVJbWFnZVNtb290aGluZygpXCJcbiAgKGFkZFByb2ZpbGVMaW5lKT1cImFkZFByb2ZpbGVMaW5lKClcIlxuICAoaXNvUmFuZ2VDaGFuZ2UpPVwib25Jc29SYW5nZUNoYW5nZSgkZXZlbnQpXCJcbiAgKG9wZW5DaGFubmVsSGlzdG9ncmFtKT1cIm9wZW5DaGFubmVsSGlzdG9ncmFtKClcIlxuICAob3BlblJlZ2lvbkVkaXRvcik9XCJvcGVuUmVnaW9uRWRpdG9yKClcIlxuICAoc2VsZWN0U3RhY2tPcHRpb24pPVwic2VsZWN0U3RhY2tPcHRpb24oJGV2ZW50KVwiXG4gICh6U2NydWIpPVwib25aU2NydWIoJGV2ZW50KVwiXG4gICh6U2xpZGUpPVwib25aU2xpZGUoJGV2ZW50KVwiXG4gICh6SW5kZXhJbnB1dCk9XCJ6SW5kZXggPSAkZXZlbnQ7IHVwZGF0ZVpJbmRleCgpXCJcbiAgKHJlbG9hZEFuZFBsb3QpPVwicmVsb2FkQW5kUGxvdCgpXCJcbiAgKGRvd25sb2FkSW1hZ2UpPVwiZG93bmxvYWRJbWFnZSgpXCJcbiAgKGF1dG9zY2FsZUltYWdlKT1cImF1dG9zY2FsZUltYWdlKClcIlxuICAodG9nZ2xlRHJhZ01vZGUpPVwidG9nZ2xlRHJhZ01vZGUoJGV2ZW50KVwiXG4gICh6b29tSW4pPVwiem9vbUluKClcIlxuICAoem9vbU91dCk9XCJ6b29tT3V0KClcIlxuICAodG9nZ2xlU3VyZmFjZTNkTW9kZSk9XCJ0b2dnbGVTdXJmYWNlM2RNb2RlKCRldmVudClcIlxuICAocmVzZXRTdXJmYWNlQ2FtZXJhKT1cInJlc2V0U3VyZmFjZUNhbWVyYSgpXCJcbiAgKHRvZ2dsZUF4ZXMpPVwidG9nZ2xlQXhlcygpXCJcbiAgKHRvZ2dsZVdpcmVmcmFtZSk9XCJ0b2dnbGVXaXJlZnJhbWUoKVwiXG4gIChzZWxlY3RSZXNvbHV0aW9uKT1cInNlbGVjdFJlc29sdXRpb24oJGV2ZW50KVwiXG4gIChkZWxldGVSZWdpb24pPVwiZGVsZXRlUmVnaW9uKClcIlxuICAodW5kb1JlZ2lvbik9XCJ1bmRvUmVnaW9uKClcIlxuICAocmVkb1JlZ2lvbik9XCJyZWRvUmVnaW9uKClcIlxuICAoc2VnbWVudFJlZ2lvbnMpPVwic2VnbWVudFJlZ2lvbnMoKVwiXG4gIChzZWdtZW50Q2VsbHBvc2UpPVwic2VnbWVudENlbGxwb3NlKClcIlxuICAoc2FtTW9kZWxDaGFuZ2UpPVwib25TYW1Nb2RlbENoYW5nZSgkZXZlbnQpXCJcbiAgKHdhbmRTZW5zaXRpdml0eUNoYW5nZSk9XCJvbldhbmRTZW5zaXRpdml0eUNoYW5nZSgkZXZlbnQpXCJcbiAgKGJydXNoU2l6ZUNoYW5nZSk9XCJvbkJydXNoU2l6ZUNoYW5nZSgkZXZlbnQpXCJcbiAgKHZlcnRleEVyYXNlclJhZGl1c0NoYW5nZSk9XCJvblZlcnRleEVyYXNlclJhZGl1c0NoYW5nZSgkZXZlbnQpXCI+XG4gIDwhLS0gSG9zdC1wcm9qZWN0ZWQgY3VzdG9tIHRvb2xiYXIgYnV0dG9ucywgZm9yd2FyZGVkIGludG8gdGhlIHRvb2xiYXIuIC0tPlxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L3Bsb3R0aW5nLXRvb2xiYXI+XG4gIDxwLWJ1dHRvbiAqbmdJZj1cInRvb2xiYXJGbG9hdGluZ1wiIGNsYXNzPVwidG9vbGJhci1kb2NrLWJ0blwiIGljb249XCJwaSBwaS10aHVtYnRhY2tcIiBzaXplPVwic21hbGxcIiBbdGV4dF09XCJ0cnVlXCJcbiAgICAgICAgICAgIHBUb29sdGlwPVwiRG9jayB0byB0b3BcIiB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIiAob25DbGljayk9XCJkb2NrVG9vbGJhcigpXCI+XG4gIDwvcC1idXR0b24+XG48L2Rpdj5cblxuPHAtY29udGV4dE1lbnUgI2NtIFttb2RlbF09XCJjb250ZXh0TWVudUl0ZW1zXCIgYXBwZW5kVG89XCJib2R5XCI+PC9wLWNvbnRleHRNZW51PlxuPCEtLSBObyBgaC1mdWxsYCBoZXJlOiBQcmltZUZsZXgncyBoZWlnaHQ6MTAwJSAhaW1wb3J0YW50IG1hZGUgI3Bsb3QgYXMgdGFsbCBhc1xuICAgICB0aGUgd2hvbGUgaG9zdCwgc28gdW5kZXIgdGhlIGRvY2tlZCB0b29sYmFyIGl0cyBib3R0b20gdG9vbGJhci1oZWlnaHQgc3RyaXBcbiAgICAgKGluY2wuIHRoZSBPU0Qgc2NhbGUgYmFyIGF0IGJvdHRvbS1sZWZ0KSB3YXMgY2xpcHBlZCBieSB0aGUgaG9zdCdzXG4gICAgIG92ZXJmbG93OmhpZGRlbi4gVGhlIGNvbXBvbmVudCBzdHlsZXNoZWV0IHNpemVzIGl0ICgudml6LXBsb3QgeyBmbGV4OiAxIH0pLiAtLT5cbjxkaXYgY2xhc3M9XCJ3LWZ1bGwgcmVsYXRpdmUgdml6LXBsb3RcIiBbaWRdPVwicGxvdERpdk5hbWVcIj5cbiAgPGRpdiAqbmdJZj1cImltZ0xvYWRpbmcgfHwgc3RhY2tMb2FkaW5nIHx8IGlzQ2FjaGluZ1wiIGlkPVwib3ZlcmxheVwiPlxuICAgIDwhLS0gRGV0ZXJtaW5hdGUgc3RhY2svdm9sdW1lIHByb2dyZXNzIHRha2VzIHByZWNlZGVuY2U6IHdoaWxlIGl0J3MgYWN0aXZlIHNob3cgT05MWSB0aGVcbiAgICAgICAgIHByb2dyZXNzIGJhciArIFwiTG9hZGluZyBmcmFtZXMuLi5cIiwgbm90IHRoZSBnZW5lcmljIHNwaW5uZXIvXCJMb2FkaW5nIGltYWdlLi4uXCIgb24gdG9wIG9mXG4gICAgICAgICBpdCAoYm90aCB3ZXJlIHJlbmRlcmluZyBhdCBvbmNlIGZvciBuYXBhcmkgdm9sdW1lL2lzb3N1cmZhY2UgbG9hZHMpLiAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RhY2tMb2FkaW5nOyBlbHNlIGltZ0xvYWRpbmdUcGxcIj5cbiAgICAgIDxwLXByb2dyZXNzQmFyIGNsYXNzPVwicHJvZ3Jlc3NcIiBbdmFsdWVdPVwibG9hZGluZ1BlcmNlbnRhZ2VcIj48L3AtcHJvZ3Jlc3NCYXI+XG4gICAgICA8c3BhbiBjbGFzcz1cInRleHQtbG9hZGluZ1wiPkxvYWRpbmcgZnJhbWVzLi4uPC9zcGFuPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjaW1nTG9hZGluZ1RwbD5cbiAgICAgIDwhLS0gQ2FjaGUtY29weSBwcm9ncmVzcyBpcyBzaG93biB3aGVuZXZlciBhIGNhY2hlIGRvd25sb2FkIGlzIGFjdGl2ZSAoaXNDYWNoaW5nKSwgaW5kZXBlbmRlbnRcbiAgICAgICAgICAgb2YgYGltZ0xvYWRpbmdgLCBzbyBpdCdzIG5ldmVyIGRyb3BwZWQvbWFza2VkIG1pZC1kb3dubG9hZC4gLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDYWNoaW5nOyBlbHNlIHNwaW5uZXJMb2FkaW5nXCI+XG4gICAgICAgIDwhLS0gU3RhZ2UtYXdhcmUgbWVzc2FnZSBjb21lcyBmcm9tIENhY2hlUHJvZ3Jlc3NTZXJ2aWNlIHVwZGF0aW5nXG4gICAgICAgICAgICAgaW1hZ2VMb2FkaW5nTWVzc2FnZSQgKFwiQ2FjaGluZyBpbWFnZS4uLlwiIGR1cmluZyB0aGUgR0NTIGRvd25sb2FkLFxuICAgICAgICAgICAgIHRoZW4gXCJHZW5lcmF0aW5nIHByZXZpZXcuLi5cIiBkdXJpbmcgcGVyLXNsaWNlIHRodW1ibmFpbCBnZW4pLiBPbmNlIHRoZVxuICAgICAgICAgICAgIGRvd25sb2FkIGhpdHMgMTAwJSB0aGUgcmVtYWluaW5nIHdvcmsgKHNlcnZlciBwcmV2aWV3L3RpbGUgZ2VuZXJhdGlvbilcbiAgICAgICAgICAgICBoYXMgbm8gZGV0ZXJtaW5hdGUgcHJvZ3Jlc3MsIHNvIGZhbGwgdGhyb3VnaCB0byB0aGUgc3Bpbm5lciB0ZW1wbGF0ZVxuICAgICAgICAgICAgIHJhdGhlciB0aGFuIHBhcmtpbmcgYSBmdWxsIGJhciB1bmRlciBcIkxvYWRpbmcgaW1hZ2UuLi5cIi4gLS0+XG4gICAgICAgIDxwLXByb2dyZXNzQmFyIGNsYXNzPVwicHJvZ3Jlc3NcIiBbdmFsdWVdPVwiY2FjaGVQcm9ncmVzc1wiPjwvcC1wcm9ncmVzc0Jhcj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxvYWRpbmdcIj57e2xvYWRpbmdNZXNzYWdlfX08L3NwYW4+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjc3Bpbm5lckxvYWRpbmc+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpbWdMb2FkaW5nXCIgY2xhc3M9XCJzcGlubmVyXCI+PC9kaXY+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaW1nTG9hZGluZyAmJiAhem9vbVwiIGNsYXNzPVwidGV4dC1sb2FkaW5nXCI+e3tsb2FkaW5nTWVzc2FnZX19PC9zcGFuPlxuICAgICAgICA8c3BhbiAqbmdJZj1cImltZ0xvYWRpbmcgJiYgem9vbVwiIGNsYXNzPVwiem9vbS10ZXh0LWxvYWRpbmdcIj57e2xvYWRpbmdNZXNzYWdlfX08L3NwYW4+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPHAtYnV0dG9uICpuZ0lmPVwic3RhY2tMb2FkaW5nIHx8IGltZ0xvYWRpbmdcIiBjbGFzcz1cImNhbmNlbC1sb2FkaW5nIFwiIGxhYmVsPVwiQ2FuY2VsXCJcbiAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiY2FuY2VsTG9hZGluZygpXCI+XG4gICAgPC9wLWJ1dHRvbj5cbiAgPC9kaXY+XG4gIDwhLS0gVHJhbnNsdWNlbnQgXCJzaGFycGVuaW5nXCIgb3ZlcmxheSBzaG93biBhZnRlciB0aGUgc21hbGwtdGllciBwcmV2aWV3IGlzXG4gICAgICAgb24gc2NyZWVuIHdoaWxlIHRoZSBsYXJnZS10aWVyIHJlbmRlciBpcyBzdGlsbCBsb2FkaW5nIGluIHRoZVxuICAgICAgIGJhY2tncm91bmQuIExldHMgdGhlIHVzZXIgc2VlIHRoZSBibHVycnkgaW1hZ2UgdW5kZXJuZWF0aCBidXQgbWFrZXNcbiAgICAgICBpdCBjbGVhciBzb21ldGhpbmcgaXMgc3RpbGwgbG9hZGluZyBzbyB0aGV5IGRvbid0IG1pc3Rha2UgdGhlXG4gICAgICAgbG93LXJlcyByZW5kZXIgZm9yIHRoZSBmaW5hbCBpbWFnZS4gLS0+XG4gIDxkaXYgKm5nSWY9XCJzaGFycGVuaW5nICYmICFpbWdMb2FkaW5nICYmICFzdGFja0xvYWRpbmcgJiYgIWlzQ2FjaGluZ1wiIGlkPVwic2hhcnBlbmluZy1vdmVybGF5XCI+XG4gICAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj5cbiAgICA8c3BhbiBjbGFzcz1cInRleHQtbG9hZGluZ1wiPlNoYXJwZW5pbmcgcHJldmlldy4uLjwvc3Bhbj5cbiAgPC9kaXY+XG5cbjwvZGl2PlxuXG48IS0tIEZsb2F0aW5nLCBkcmFnZ2FibGUgaW50ZW5zaXR5LXByb2ZpbGUgaW5zZXQuIFNob3duIGluIExJTkUgbW9kZTsgdGhlIGNoYXJ0XG4gICAgIHVwZGF0ZXMgbGl2ZSBhcyB0aGUgbGluZSBST0kgb24gdGhlIGltYWdlIGlzIG1vdmVkLiBLZXB0IE9VVFNJREUgI3Bsb3QgYW5kXG4gICAgIHBvc2l0aW9uZWQgZml4ZWQgc28gaXQgZmxvYXRzIG92ZXIgdGhlIHdob2xlIHBhZ2UgKG5vdCBjbGlwcGVkIHRvIHRoZVxuICAgICBkaWFncmFtL2NhbnZhcyBhcmVhKS4gLS0+XG48ZGl2ICpuZ0lmPVwiaGFzUHJvZmlsZXNcIiBjbGFzcz1cImludGVuc2l0eS1wYW5lbFwiXG4gICAgIFtzdHlsZS5sZWZ0LnB4XT1cInByb2ZpbGVQYW5lbFBvcy54XCIgW3N0eWxlLnRvcC5weF09XCJwcm9maWxlUGFuZWxQb3MueVwiPlxuICA8ZGl2IGNsYXNzPVwiaW50ZW5zaXR5LXBhbmVsLWhlYWRlclwiIChtb3VzZWRvd24pPVwib25Qcm9maWxlUGFuZWxEcmFnU3RhcnQoJGV2ZW50KVwiPlxuICAgIDxzcGFuPkludGVuc2l0eSBwcm9maWxlPC9zcGFuPlxuICAgIDxpIGNsYXNzPVwicGkgcGktYXJyb3dzLWFsdFwiPjwvaT5cbiAgPC9kaXY+XG4gIDxkaXYgW2lkXT1cImludGVuc2l0eUluc2V0RGl2XCIgY2xhc3M9XCJpbnRlbnNpdHktcGFuZWwtcGxvdFwiPjwvZGl2PlxuPC9kaXY+XG5cbjwhLS0gQ2hhbm5lbHMgJiBIaXN0b2dyYW06IG5vbi1tb2RhbCBmbG9hdGluZyBkaWFsb2cgb3BlbmVkIGZyb20gdGhlIHRvb2xiYXIuIC0tPlxuPGNoYW5uZWwtaGlzdG9ncmFtIFsodmlzaWJsZSldPVwic2hvd0NoYW5uZWxIaXN0b2dyYW1cIj48L2NoYW5uZWwtaGlzdG9ncmFtPlxuXG48IS0tIFJlZ2lvbiBFZGl0b3I6IG5vbi1tb2RhbCwgZHJhZ2dhYmxlLCByZXNpemFibGUgZmxvYXRpbmcgZGlhbG9nIG9wZW5lZCBmcm9tXG4gICAgIHRoZSB0b29sYmFyIChmb3JtZXJseSB0aGUgcmlnaHQtcGFuZWwgUmVnaW9ucyB0YWIpLiBNb2RlbGVzcyBzbyByZWdpb25zIGNhblxuICAgICBzdGlsbCBiZSBkcmF3bi9zZWxlY3RlZCBvbiB0aGUgcGxvdCB3aGlsZSBpdCdzIG9wZW47IHN0YXlzIGxpbmtlZCB0byB0aGlzXG4gICAgIHBsb3R0aW5nIGluc3RhbmNlIHZpYSB0aGUgcm9vdCBSZWdpb25TdG9yZSBzaW5nbGV0b24uIE9wZW5zIG92ZXIgdGhlIHJpZ2h0XG4gICAgIHNpZGUgb2YgdGhlIHZpZXcuIC0tPlxuPHAtZGlhbG9nIGhlYWRlcj1cIlJlZ2lvbiBFZGl0b3JcIiBbKHZpc2libGUpXT1cInNob3dSZWdpb25FZGl0b3JcIlxuICAgICAgICAgIFttb2RhbF09XCJmYWxzZVwiIFtyZXNpemFibGVdPVwidHJ1ZVwiIFtkcmFnZ2FibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgW21heGltaXphYmxlXT1cInRydWVcIiBhcHBlbmRUbz1cImJvZHlcIiBwb3NpdGlvbj1cInJpZ2h0XCJcbiAgICAgICAgICBbc3R5bGVdPVwieyB3aWR0aDogcmVnaW9uRWRpdG9yV2lkdGgsIGhlaWdodDogJzg1dmgnIH1cIlxuICAgICAgICAgIFtjb250ZW50U3R5bGVdPVwieyBvdmVyZmxvdzogJ2F1dG8nIH1cIj5cbiAgPHJlZ2lvbi1lZGl0b3I+PC9yZWdpb24tZWRpdG9yPlxuPC9wLWRpYWxvZz5cblxuPCEtLSBTaW1wbGlmeSAoRG91Z2xhc+KAk1BldWNrZXIpOiBjdXN0b20gcHgtdGhyZXNob2xkIHBpY2tlciBmb3IgdGhlIHNlbGVjdGVkXG4gICAgIHJlZ2lvbihzKSwgb3BlbmVkIGZyb20gdGhlIHJpZ2h0LWNsaWNrIFwiU2ltcGxpZnkg4pa4IEN1c3RvbeKAplwiIGFjdGlvbi4gLS0+XG48cC1kaWFsb2cgaGVhZGVyPVwiU2ltcGxpZnkgcmVnaW9uKHMpXCIgWyh2aXNpYmxlKV09XCJkaXNwbGF5U2ltcGxpZnlEaWFsb2dcIiBbbW9kYWxdPVwidHJ1ZVwiXG4gICAgICAgICAgW3N0eWxlXT1cInt3aWR0aDogJzIycmVtJ31cIiBbZHJhZ2dhYmxlXT1cImZhbHNlXCIgW3Jlc2l6YWJsZV09XCJmYWxzZVwiPlxuICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtbiBnYXAtMlwiPlxuICAgIDxzcGFuPkFsdGl0dWRlIHRocmVzaG9sZDogPGI+e3sgc2ltcGxpZnlUaHJlc2hvbGQgfX0gcHg8L2I+PC9zcGFuPlxuICAgIDxwLXNsaWRlciBbKG5nTW9kZWwpXT1cInNpbXBsaWZ5VGhyZXNob2xkXCIgW21pbl09XCIxXCIgW21heF09XCIyMFwiIFtzdGVwXT1cIjFcIj48L3Atc2xpZGVyPlxuICAgIDxzbWFsbD5WZXJ0aWNlcyB3aXRoaW4gdGhpcyBkaXN0YW5jZSBvZiB0aGUgbGluZSBiZXR3ZWVuIHRoZWlyIG5laWdoYm91cnMgYXJlIHJlbW92ZWQuPC9zbWFsbD5cbiAgPC9kaXY+XG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmb290ZXJcIj5cbiAgICA8cC1idXR0b24gbGFiZWw9XCJDYW5jZWxcIiBbdGV4dF09XCJ0cnVlXCIgKG9uQ2xpY2spPVwiZGlzcGxheVNpbXBsaWZ5RGlhbG9nID0gZmFsc2VcIj48L3AtYnV0dG9uPlxuICAgIDxwLWJ1dHRvbiBsYWJlbD1cIkFwcGx5XCIgaWNvbj1cInBpIHBpLWNoZWNrXCIgKG9uQ2xpY2spPVwic2ltcGxpZnlSZWdpb25zKHNpbXBsaWZ5VGhyZXNob2xkKVwiPjwvcC1idXR0b24+XG4gIDwvbmctdGVtcGxhdGU+XG48L3AtZGlhbG9nPlxuXG4iXX0=