igniteui-angular 17.2.25 → 17.2.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/esm2022/lib/avatar/avatar.component.mjs +17 -2
  2. package/esm2022/lib/calendar/common/calendar-view.directive.mjs +3 -2
  3. package/esm2022/lib/calendar/common/model.mjs +3 -2
  4. package/esm2022/lib/core/utils.mjs +30 -11
  5. package/esm2022/lib/date-picker/date-picker.component.mjs +7 -3
  6. package/esm2022/lib/date-range-picker/date-range-picker.component.mjs +2 -2
  7. package/esm2022/lib/directives/drag-drop/drag-drop.directive.mjs +20 -22
  8. package/esm2022/lib/directives/for-of/for_of.directive.mjs +5 -3
  9. package/esm2022/lib/grids/grid-base.directive.mjs +2 -2
  10. package/esm2022/lib/grids/moving/moving.drag.directive.mjs +3 -3
  11. package/esm2022/lib/query-builder/query-builder.component.mjs +9 -19
  12. package/esm2022/lib/services/animation/angular-animation-player.mjs +4 -2
  13. package/esm2022/lib/tabs/tabs/tab-header.component.mjs +7 -5
  14. package/esm2022/lib/tabs/tabs/tabs.component.mjs +15 -11
  15. package/fesm2022/igniteui-angular.mjs +106 -71
  16. package/fesm2022/igniteui-angular.mjs.map +1 -1
  17. package/lib/avatar/avatar.component.d.ts +3 -1
  18. package/lib/core/styles/components/action-strip/_action-strip-component.scss +1 -1
  19. package/lib/core/styles/components/grid/_grid-component.scss +1 -0
  20. package/lib/core/styles/components/paginator/_paginator-component.scss +1 -1
  21. package/lib/core/styles/components/query-builder/_query-builder-component.scss +9 -1
  22. package/lib/core/utils.d.ts +5 -0
  23. package/lib/date-picker/date-picker.component.d.ts +2 -1
  24. package/lib/directives/drag-drop/drag-drop.directive.d.ts +1 -0
  25. package/lib/tabs/tabs/tabs.component.d.ts +3 -1
  26. package/package.json +1 -1
@@ -510,7 +510,6 @@ export class IgxDateRangePickerComponent extends PickerBaseDirective {
510
510
  // input click
511
511
  if (this.hasProjectedInputs && this._focusedInput) {
512
512
  this._focusedInput.setFocus();
513
- this._focusedInput = null;
514
513
  }
515
514
  if (this.inputDirective) {
516
515
  this.inputDirective.focus();
@@ -554,6 +553,7 @@ export class IgxDateRangePickerComponent extends PickerBaseDirective {
554
553
  this.updateCalendar();
555
554
  }
556
555
  updateValidityOnBlur() {
556
+ this._focusedInput = null;
557
557
  this.onTouchCallback();
558
558
  if (this._ngControl) {
559
559
  if (this.hasProjectedInputs) {
@@ -902,4 +902,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImpor
902
902
  type: HostListener,
903
903
  args: ['keydown', ['$event']]
904
904
  }] } });
905
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2RhdGUtcmFuZ2UtcGlja2VyL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9kYXRlLXJhbmdlLXBpY2tlci9kYXRlLXJhbmdlLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ1ksZ0JBQWdCLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUM1RixZQUFZLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQVksS0FBSyxFQUFFLFNBQVMsRUFDN0MsUUFBUSxFQUFFLE1BQU0sRUFDL0IsV0FBVyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFDMUQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFDb0MsU0FBUyxFQUNoRCxhQUFhLEVBQUUsaUJBQWlCLEVBQ25DLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQTRCLElBQUksRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDdEYsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsaUJBQWlCLEVBQXdCLE1BQU0sd0JBQXdCLENBQUM7QUFDakYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5QyxPQUFPLEVBQUUsbUJBQW1CLEVBQTBCLE1BQU0saUJBQWlCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGdDQUFnQyxFQUFtQyxNQUFN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U0FBUzt1QkFBQyxpQkFBaUI7Z0JBS3JCLGVBQWU7c0JBRHJCLGVBQWU7dUJBQUMsK0JBQStCO2dCQUl6QyxLQUFLO3NCQURYLFlBQVk7dUJBQUMsaUJBQWlCO2dCQUl4QixhQUFhO3NCQURuQixZQUFZO3VCQUFDLHlCQUF5QjtnQkFLaEMscUJBQXFCO3NCQUQzQixZQUFZO3VCQUFDLDhCQUE4QixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkF1RHhELEtBQUs7c0JBRGYsS0FBSztnQkF1RkMsU0FBUztzQkFGZixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCwgYm9vbGVhbkF0dHJpYnV0ZSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBDb250ZW50Q2hpbGRyZW4sIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyLCBJbmplY3QsIEluamVjdG9yLCBJbnB1dCwgTE9DQUxFX0lELFxuICAgIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsLCBPdXRwdXQsIFF1ZXJ5TGlzdCxcbiAgICBTaW1wbGVDaGFuZ2VzLCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFic3RyYWN0Q29udHJvbCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5nQ29udHJvbCxcbiAgICBOR19WQUxJREFUT1JTLCBOR19WQUxVRV9BQ0NFU1NPUiwgVmFsaWRhdGlvbkVycm9ycywgVmFsaWRhdG9yXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgZnJvbUV2ZW50LCBtZXJnZSwgTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uLCBub29wLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBDYWxlbmRhclNlbGVjdGlvbiwgSWd4Q2FsZW5kYXJDb21wb25lbnQgfSBmcm9tICcuLi9jYWxlbmRhci9wdWJsaWNfYXBpJztcbmltcG9ydCB7IERhdGVSYW5nZVR5cGUgfSBmcm9tICcuLi9jb3JlL2RhdGVzJztcbmltcG9ydCB7IERpc3BsYXlEZW5zaXR5VG9rZW4sIElEaXNwbGF5RGVuc2l0eU9wdGlvbnMgfSBmcm9tICcuLi9jb3JlL2RlbnNpdHknO1xuaW1wb3J0IHsgRGF0ZVJhbmdlUGlja2VyUmVzb3VyY2VTdHJpbmdzRU4sIElEYXRlUmFuZ2VQaWNrZXJSZXNvdXJjZVN0cmluZ3MgfSBmcm9tICcuLi9jb3JlL2kxOG4vZGF0ZS1yYW5nZS1waWNrZXItcmVzb3VyY2VzJztcbmltcG9ydCB7IElCYXNlQ2FuY2VsYWJsZUJyb3dzZXJFdmVudEFyZ3MsIGlzRGF0ZSwgcGFyc2VEYXRlLCBQbGF0Zm9ybVV0aWwgfSBmcm9tICcuLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IElneENhbGVuZGFyQ29udGFpbmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vZGF0ZS1jb21tb24vY2FsZW5kYXItY29udGFpbmVyL2NhbGVuZGFyLWNvbnRhaW5lci5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGlja2VyQmFzZURpcmVjdGl2ZSB9IGZyb20gJy4uL2RhdGUtY29tbW9uL3BpY2tlci1iYXNlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hQaWNrZXJBY3Rpb25zRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGF0ZS1jb21tb24vcGlja2VyLWljb25zLmNvbW1vbic7XG5pbXBvcnQgeyBEYXRlVGltZVV0aWwgfSBmcm9tICcuLi9kYXRlLWNvbW1vbi91dGlsL2RhdGUtdGltZS51dGlsJztcbmltcG9ydCB7IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3RvZ2dsZS90b2dnbGUuZGlyZWN0aXZlJztcbmltcG9ydCB7XG4gICAgSWd4SW5wdXREaXJlY3RpdmUsIElneElucHV0R3JvdXBDb21wb25lbnQsIElneElucHV0R3JvdXBUeXBlLCBJZ3hJbnB1dFN0YXRlLFxuICAgIElneExhYmVsRGlyZWN0aXZlLCBJR1hfSU5QVVRfR1JPVVBfVFlQRVxufSBmcm9tICcuLi9pbnB1dC1ncm91cC9wdWJsaWNfYXBpJztcbmltcG9ydCB7XG4gICAgQXV0b1Bvc2l0aW9uU3RyYXRlZ3ksIElneE92ZXJsYXlTZXJ2aWNlLCBPdmVybGF5Q2FuY2VsYWJsZUV2ZW50QXJncywgT3ZlcmxheUV2ZW50QXJncyxcbiAgICBPdmVybGF5U2V0dGluZ3MsIFBvc2l0aW9uU2V0dGluZ3Ncbn0gZnJvbSAnLi4vc2VydmljZXMvcHVibGljX2FwaSc7XG5pbXBvcnQgeyBEYXRlUmFuZ2UsIElneERhdGVSYW5nZUVuZENvbXBvbmVudCwgSWd4RGF0ZVJhbmdlSW5wdXRzQmFzZUNvbXBvbmVudCwgSWd4RGF0ZVJhbmdlU2VwYXJhdG9yRGlyZWN0aXZlLCBJZ3hEYXRlUmFuZ2VTdGFydENvbXBvbmVudCwgRGF0ZVJhbmdlUGlja2VyRm9ybWF0UGlwZSB9IGZyb20gJy4vZGF0ZS1yYW5nZS1waWNrZXItaW5wdXRzLmNvbW1vbic7XG5pbXBvcnQgeyBJZ3hQcmVmaXhEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3ByZWZpeC9wcmVmaXguZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEljb25Db21wb25lbnQgfSBmcm9tICcuLi9pY29uL2ljb24uY29tcG9uZW50JztcbmltcG9ydCB7IGdldEN1cnJlbnRSZXNvdXJjZVN0cmluZ3MgfSBmcm9tICcuLi9jb3JlL2kxOG4vcmVzb3VyY2VzJztcbmltcG9ydCB7IGZhZGVJbiwgZmFkZU91dCB9IGZyb20gJ2lnbml0ZXVpLWFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5cbmNvbnN0IFNpbmdsZUlucHV0RGF0ZXNDb25jYXRlbmF0aW9uU3RyaW5nID0gJyAtICc7XG5cbi8qKlxuICogUHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gc2VsZWN0IGEgcmFuZ2Ugb2YgZGF0ZXMgZnJvbSBhIGNhbGVuZGFyIFVJIG9yIGVkaXRhYmxlIGlucHV0cy5cbiAqXG4gKiBAaWd4TW9kdWxlIElneERhdGVSYW5nZU1vZHVsZVxuICpcbiAqIEBpZ3hUaGVtZSBpZ3gtaW5wdXQtZ3JvdXAtdGhlbWUsIGlneC1jYWxlbmRhci10aGVtZSwgaWd4LWRhdGUtcmFuZ2UtcGlja2VyLXRoZW1lXG4gKlxuICogQGlneEtleXdvcmRzIGRhdGUsIHJhbmdlLCBkYXRlIHJhbmdlLCBkYXRlIHBpY2tlclxuICpcbiAqIEBpZ3hHcm91cCBzY2hlZHVsaW5nXG4gKlxuICogQHJlbWFya3NcbiAqIEl0IGRpc3BsYXlzIHRoZSByYW5nZSBzZWxlY3Rpb24gaW4gYSBzaW5nbGUgb3IgdHdvIGlucHV0IGZpZWxkcy5cbiAqIFRoZSBkZWZhdWx0IHRlbXBsYXRlIGRpc3BsYXlzIGEgc2luZ2xlICpyZWFkb25seSogaW5wdXQgZmllbGRcbiAqIHdoaWxlIHByb2plY3RpbmcgYGlneC1kYXRlLXJhbmdlLXN0YXJ0YCBhbmQgYGlneC1kYXRlLXJhbmdlLWVuZGBcbiAqIGRpc3BsYXlzIHR3byAqZWRpdGFibGUqIGlucHV0IGZpZWxkcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPGlneC1kYXRlLXJhbmdlLXBpY2tlciBtb2RlPVwiZHJvcGRvd25cIj48L2lneC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2lneC1kYXRlLXJhbmdlLXBpY2tlcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgeyBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwgdXNlRXhpc3Rpbmc6IElneERhdGVSYW5nZVBpY2tlckNvbXBvbmVudCwgbXVsdGk6IHRydWUgfSxcbiAgICAgICAgeyBwcm92aWRlOiBOR19WQUxJREFUT1JTLCB1c2VFeGlzdGluZzogSWd4RGF0ZVJhbmdlUGlja2VyQ29tcG9uZW50LCBtdWx0aTogdHJ1ZSB9XG4gICAgXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgTmdJZixcbiAgICAgICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICAgICAgSWd4SWNvbkNvbXBvbmVudCxcbiAgICAgICAgSWd4SW5wdXRHcm91cENvbXBvbmVudCxcbiAgICAgICAgSWd4SW5wdXREaXJlY3RpdmUsXG4gICAgICAgIElneFByZWZpeERpcmVjdGl2ZSxcbiAgICAgICAgRGF0ZVJhbmdlUGlja2VyRm9ybWF0UGlwZVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgSWd4RGF0ZVJhbmdlUGlja2VyQ29tcG9uZW50IGV4dGVuZHMgUGlja2VyQmFzZURpcmVjdGl2ZVxuICAgIGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciB7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3BsYXllZCBtb250aCB2aWV3cy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRGVmYXVsdCBpcyBgMmAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyIFtkaXNwbGF5TW9udGhzQ291bnRdPVwiM1wiPjwvaWd4LWRhdGUtcmFuZ2UtcGlja2VyPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRpc3BsYXlNb250aHNDb3VudCA9IDI7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgd2hldGhlciBkYXRlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgY3VycmVudCBtb250aCB3aWxsIGJlIGRpc3BsYXllZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1kYXRlLXJhbmdlLXBpY2tlciBbaGlkZU91dHNpZGVEYXlzXT1cInRydWVcIj48L2lneC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgICBwdWJsaWMgaGlkZU91dHNpZGVEYXlzOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQSBjdXN0b20gZm9ybWF0dGVyIGZ1bmN0aW9uLCBhcHBsaWVkIG9uIHRoZSBzZWxlY3RlZCBvciBwYXNzZWQgaW4gZGF0ZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHByaXZhdGUgZGF5Rm9ybWF0dGVyID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoXCJlblwiLCB7IHdlZWtkYXk6IFwibG9uZ1wiIH0pO1xuICAgICAqIHByaXZhdGUgbW9udGhGb3JtYXR0ZXIgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChcImVuXCIsIHsgbW9udGg6IFwibG9uZ1wiIH0pO1xuICAgICAqXG4gICAgICogcHVibGljIGZvcm1hdHRlcihkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICAgKiAgcmV0dXJuIGAke3RoaXMuZGF5Rm9ybWF0dGVyLmZvcm1hdChkYXRlKX0gLSAke3RoaXMubW9udGhGb3JtYXR0ZXIuZm9ybWF0KGRhdGUpfSAtICR7ZGF0ZS5nZXRGdWxsWWVhcigpfWA7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyIFtmb3JtYXR0ZXJdPVwiZm9ybWF0dGVyXCI+PC9pZ3gtZGF0ZS1yYW5nZS1waWNrZXI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZm9ybWF0dGVyOiAodmFsOiBEYXRlUmFuZ2UpID0+IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCB0ZXh0IG9mIHRoZSBjYWxlbmRhciBkaWFsb2cgKipEb25lKiogYnV0dG9uLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBEZWZhdWx0cyB0byB0aGUgdmFsdWUgZnJvbSByZXNvdXJjZSBzdHJpbmdzLCBgXCJEb25lXCJgIGZvciB0aGUgYnVpbHQtaW4gRU4uXG4gICAgICogVGhlIGJ1dHRvbiB3aWxsIG9ubHkgc2hvdyB1cCBpbiBgZGlhbG9nYCBtb2RlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1kYXRlLXJhbmdlLXBpY2tlciBkb25lQnV0dG9uVGV4dD1cIuWujOS6hlwiPjwvaWd4LWRhdGUtcmFuZ2UtcGlja2VyPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBkb25lQnV0dG9uVGV4dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2RvbmVCdXR0b25UZXh0ID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkb25lQnV0dG9uVGV4dCgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5fZG9uZUJ1dHRvblRleHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfZGF0ZV9yYW5nZV9waWNrZXJfZG9uZV9idXR0b247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2RvbmVCdXR0b25UZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDdXN0b20gb3ZlcmxheSBzZXR0aW5ncyB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGRpc3BsYXkgdGhlIGNhbGVuZGFyLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1kYXRlLXJhbmdlLXBpY2tlciBbb3ZlcmxheVNldHRpbmdzXT1cImN1c3RvbU92ZXJsYXlTZXR0aW5nc1wiPjwvaWd4LWRhdGUtcmFuZ2UtcGlja2VyPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG92ZXJyaWRlIG92ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZvcm1hdCB1c2VkIHdoZW4gZWRpdGFibGUgaW5wdXRzIGFyZSBub3QgZm9jdXNlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVXNlcyBBbmd1bGFyJ3MgRGF0ZVBpcGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyIGRpc3BsYXlGb3JtYXQ9XCJFRS9NL3l5XCI+PC9pZ3gtZGF0ZS1yYW5nZS1waWNrZXI+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBvdmVycmlkZSBkaXNwbGF5Rm9ybWF0OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZXhwZWN0ZWQgdXNlciBpbnB1dCBmb3JtYXQgYW5kIHBsYWNlaG9sZGVyLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBEZWZhdWx0IGlzIGBcIidNTS9kZC95eXl5J1wiYFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1kYXRlLXJhbmdlLXBpY2tlciBpbnB1dEZvcm1hdD1cImRkL01NL3l5XCI+PC9pZ3gtZGF0ZS1yYW5nZS1waWNrZXI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgb3ZlcnJpZGUgaW5wdXRGb3JtYXQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIHZhbHVlIGluIGEgdmFsaWQgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIDxpZ3gtZGF0ZS1yYW5nZS1waWNrZXIgW21pblZhbHVlXT1cIm1pbkRhdGVcIj48L2lneC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgbWluVmFsdWUodmFsdWU6IERhdGUgfCBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fbWluVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWluVmFsdWUoKTogRGF0ZSB8IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9taW5WYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSB2YWx1ZSBpbiBhIHZhbGlkIHJhbmdlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyIFttYXhWYWx1ZV09XCJtYXhEYXRlXCI+PC9pZ3gtZGF0ZS1yYW5nZS1waWNrZXI+XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IG1heFZhbHVlKHZhbHVlOiBEYXRlIHwgc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX21heFZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1heFZhbHVlKCk6IERhdGUgfCBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF4VmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gYWNjZXNzb3IgdGhhdCBzZXRzIHRoZSByZXNvdXJjZSBzdHJpbmdzLlxuICAgICAqIEJ5IGRlZmF1bHQgaXQgdXNlcyBFTiByZXNvdXJjZXMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHJlc291cmNlU3RyaW5ncyh2YWx1ZTogSURhdGVSYW5nZVBpY2tlclJlc291cmNlU3RyaW5ncykge1xuICAgICAgICB0aGlzLl9yZXNvdXJjZVN0cmluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9yZXNvdXJjZVN0cmluZ3MsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBhY2Nlc3NvciB0aGF0IHJldHVybnMgdGhlIHJlc291cmNlIHN0cmluZ3MuXG4gICAgICovXG4gICAgcHVibGljIGdldCByZXNvdXJjZVN0cmluZ3MoKTogSURhdGVSYW5nZVBpY2tlclJlc291cmNlU3RyaW5ncyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNvdXJjZVN0cmluZ3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYHBsYWNlaG9sZGVyYCBmb3Igc2luZ2xlLWlucHV0IGBJZ3hEYXRlUmFuZ2VQaWNrZXJDb21wb25lbnRgLlxuICAgICAqXG4gICAgICogICBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyIFtwbGFjZWhvbGRlcl09XCInQ2hvb3NlIHlvdXIgZGF0ZXMnXCI+PC9pZ3gtZGF0ZS1yYW5nZS1waWNrZXI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgb3ZlcnJpZGUgcGxhY2Vob2xkZXIgPSAnJztcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgY29udGFpbmVyIHVzZWQgZm9yIHRoZSBwb3B1cCBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiAgYG91dGxldGAgaXMgYW4gaW5zdGFuY2Ugb2YgYElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmVgIG9yIGFuIGBFbGVtZW50UmVmYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8ZGl2IGlneE92ZXJsYXlPdXRsZXQgI291dGxldD1cIm92ZXJsYXktb3V0bGV0XCI+PC9kaXY+XG4gICAgICogLy8uLlxuICAgICAqIDxpZ3gtZGF0ZS1yYW5nZS1waWNrZXIgW291dGxldF09XCJvdXRsZXRcIj48L2lneC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAgICAgKiAvLy4uXG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgb3ZlcnJpZGUgb3V0bGV0OiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlIHwgRWxlbWVudFJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogU2hvdy9oaWRlIHdlZWsgbnVtYmVyc1xuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyIFtzaG93V2Vla051bWJlcnNdPVwidHJ1ZVwiPjwvaWd4LWRhdGUtcmFuZ2UtcGlja2VyPlxuICAgICAqIGBgXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIHNob3dXZWVrTnVtYmVycyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBwaWNrZXIncyB2YWx1ZSBjaGFuZ2VzLiBVc2VkIGZvciB0d28td2F5IGJpbmRpbmcuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyIFsodmFsdWUpXT1cImRhdGVcIj48L2lneC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGVSYW5nZT4oKTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWRhdGUtcmFuZ2UtcGlja2VyJylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSAnaWd4LWRhdGUtcmFuZ2UtcGlja2VyJztcblxuICAgIEBWaWV3Q2hpbGQoSWd4SW5wdXRHcm91cENvbXBvbmVudCwgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQFZpZXdDaGlsZChJZ3hJbnB1dERpcmVjdGl2ZSlcbiAgICBwdWJsaWMgaW5wdXREaXJlY3RpdmU6IElneElucHV0RGlyZWN0aXZlO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hEYXRlUmFuZ2VJbnB1dHNCYXNlQ29tcG9uZW50KVxuICAgIHB1YmxpYyBwcm9qZWN0ZWRJbnB1dHM6IFF1ZXJ5TGlzdDxJZ3hEYXRlUmFuZ2VJbnB1dHNCYXNlQ29tcG9uZW50PjtcblxuICAgIEBDb250ZW50Q2hpbGQoSWd4TGFiZWxEaXJlY3RpdmUpXG4gICAgcHVibGljIGxhYmVsOiBJZ3hMYWJlbERpcmVjdGl2ZTtcblxuICAgIEBDb250ZW50Q2hpbGQoSWd4UGlja2VyQWN0aW9uc0RpcmVjdGl2ZSlcbiAgICBwdWJsaWMgcGlja2VyQWN0aW9uczogSWd4UGlja2VyQWN0aW9uc0RpcmVjdGl2ZTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4RGF0ZVJhbmdlU2VwYXJhdG9yRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIGRhdGVTZXBhcmF0b3JUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgZGF0ZVNlcGFyYXRvcigpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5fZGF0ZVNlcGFyYXRvciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9kYXRlX3JhbmdlX3BpY2tlcl9kYXRlX3NlcGFyYXRvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVNlcGFyYXRvcjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGFwcGxpZWRGb3JtYXQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIERhdGVUaW1lVXRpbC5nZXRMb2NhbGVEYXRlRm9ybWF0KHRoaXMubG9jYWxlLCB0aGlzLmRpc3BsYXlGb3JtYXQpXG4gICAgICAgICAgICB8fCBEYXRlVGltZVV0aWwuREVGQVVMVF9JTlBVVF9GT1JNQVQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBzaW5nbGVJbnB1dEZvcm1hdCgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5wbGFjZWhvbGRlciAhPT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBsYWNlaG9sZGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9ybWF0ID0gdGhpcy5hcHBsaWVkRm9ybWF0O1xuICAgICAgICByZXR1cm4gYCR7Zm9ybWF0fSR7U2luZ2xlSW5wdXREYXRlc0NvbmNhdGVuYXRpb25TdHJpbmd9JHtmb3JtYXR9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGNhbGVuZGFyIHN0YXRlLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBzdGF0ZSA9IHRoaXMuZGF0ZVJhbmdlLmNvbGxhcHNlZDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IGNvbGxhcHNlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbGxhcHNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIHZhbHVlIC8gcmFuZ2UgZnJvbSB0aGUgY2FsZW5kYXJcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIGN1cnJlbnQgdmFsdWUgaXMgb2YgdHlwZSBgRGF0ZVJhbmdlYFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbmV3VmFsdWU6IERhdGVSYW5nZSA9IHsgc3RhcnQ6IG5ldyBEYXRlKFwiMi8yLzIwMTJcIiksIGVuZDogbmV3IERhdGUoXCIzLzMvMjAxM1wiKX07XG4gICAgICogdGhpcy5kYXRlUmFuZ2VQaWNrZXIudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZhbHVlKCk6IERhdGVSYW5nZSB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBEYXRlUmFuZ2UgfCBudWxsKSB7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUodmFsdWUpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sodmFsdWUpO1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgaGFzUHJvamVjdGVkSW5wdXRzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9qZWN0ZWRJbnB1dHM/Lmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBzZXBhcmF0b3JDbGFzcygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ2lneC1kYXRlLXJhbmdlLXBpY2tlcl9fbGFiZWwnO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBnZXQgdG9nZ2xlQ29udGFpbmVyKCk6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGVuZGFyQ29udGFpbmVyO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IHJlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5fbmdDb250cm9sICYmIHRoaXMuX25nQ29udHJvbC5jb250cm9sICYmIHRoaXMuX25nQ29udHJvbC5jb250cm9sLnZhbGlkYXRvcikge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9uZ0NvbnRyb2wuY29udHJvbC52YWxpZGF0b3Ioe30gYXMgQWJzdHJhY3RDb250cm9sKTtcbiAgICAgICAgICAgIHJldHVybiAoZXJyb3IgJiYgZXJyb3IucmVxdWlyZWQpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGNhbGVuZGFyKCk6IElneENhbGVuZGFyQ29tcG9uZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGVuZGFyO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGRyb3Bkb3duT3ZlcmxheVNldHRpbmdzKCk6IE92ZXJsYXlTZXR0aW5ncyB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9kcm9wRG93bk92ZXJsYXlTZXR0aW5ncywgdGhpcy5vdmVybGF5U2V0dGluZ3MpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGRpYWxvZ092ZXJsYXlTZXR0aW5ncygpOiBPdmVybGF5U2V0dGluZ3Mge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fZGlhbG9nT3ZlcmxheVNldHRpbmdzLCB0aGlzLm92ZXJsYXlTZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVzb3VyY2VTdHJpbmdzID0gZ2V0Q3VycmVudFJlc291cmNlU3RyaW5ncyhEYXRlUmFuZ2VQaWNrZXJSZXNvdXJjZVN0cmluZ3NFTik7XG4gICAgcHJpdmF0ZSBfZG9uZUJ1dHRvblRleHQgPSBudWxsO1xuICAgIHByaXZhdGUgX2RhdGVTZXBhcmF0b3IgPSBudWxsO1xuICAgIHByaXZhdGUgX3ZhbHVlOiBEYXRlUmFuZ2UgfCBudWxsO1xuICAgIHByaXZhdGUgX292ZXJsYXlJZDogc3RyaW5nO1xuICAgIHByaXZhdGUgX25nQ29udHJvbDogTmdDb250cm9sO1xuICAgIHByaXZhdGUgX3N0YXR1c0NoYW5nZXMkOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBfY2FsZW5kYXI6IElneENhbGVuZGFyQ29tcG9uZW50O1xuICAgIHByaXZhdGUgX2NhbGVuZGFyQ29udGFpbmVyPzogSFRNTEVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBfcG9zaXRpb25TZXR0aW5nczogUG9zaXRpb25TZXR0aW5ncztcbiAgICBwcml2YXRlIF9mb2N1c2VkSW5wdXQ6IElneERhdGVSYW5nZUlucHV0c0Jhc2VDb21wb25lbnQ7XG4gICAgcHJpdmF0ZSBfb3ZlcmxheVN1YkZpbHRlcjpcbiAgICAgICAgW01vbm9UeXBlT3BlcmF0b3JGdW5jdGlvbjxPdmVybGF5RXZlbnRBcmdzPiwgTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uPE92ZXJsYXlFdmVudEFyZ3MgfCBPdmVybGF5Q2FuY2VsYWJsZUV2ZW50QXJncz5dID0gW1xuICAgICAgICAgICAgZmlsdGVyKHggPT4geC5pZCA9PT0gdGhpcy5fb3ZlcmxheUlkKSxcbiAgICAgICAgICAgIHRha2VVbnRpbChtZXJnZSh0aGlzLl9kZXN0cm95JCwgdGhpcy5jbG9zZWQpKVxuICAgICAgICBdO1xuICAgIHByaXZhdGUgX2RpYWxvZ092ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiB0cnVlLFxuICAgICAgICBtb2RhbDogdHJ1ZSxcbiAgICAgICAgY2xvc2VPbkVzY2FwZTogdHJ1ZVxuICAgIH07XG4gICAgcHJpdmF0ZSBfZHJvcERvd25PdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogdHJ1ZSxcbiAgICAgICAgbW9kYWw6IGZhbHNlLFxuICAgICAgICBjbG9zZU9uRXNjYXBlOiB0cnVlXG4gICAgfTtcbiAgICBwcml2YXRlIG9uQ2hhbmdlQ2FsbGJhY2s6IChkYXRlUmFuZ2U6IERhdGVSYW5nZSkgPT4gdm9pZCA9IG5vb3A7XG4gICAgcHJpdmF0ZSBvblRvdWNoQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSBub29wO1xuICAgIHByaXZhdGUgb25WYWxpZGF0b3JDaGFuZ2U6ICgpID0+IHZvaWQgPSBub29wO1xuXG4gICAgY29uc3RydWN0b3IoZWxlbWVudDogRWxlbWVudFJlZixcbiAgICAgICAgQEluamVjdChMT0NBTEVfSUQpIF9sb2NhbGVJZDogc3RyaW5nLFxuICAgICAgICBwcm90ZWN0ZWQgcGxhdGZvcm06IFBsYXRmb3JtVXRpbCxcbiAgICAgICAgcHJpdmF0ZSBfaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBwcml2YXRlIF9jZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBASW5qZWN0KElneE92ZXJsYXlTZXJ2aWNlKSBwcml2YXRlIF9vdmVybGF5U2VydmljZTogSWd4T3ZlcmxheVNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRGlzcGxheURlbnNpdHlUb2tlbikgX2Rpc3BsYXlEZW5zaXR5T3B0aW9ucz86IElEaXNwbGF5RGVuc2l0eU9wdGlvbnMsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoSUdYX0lOUFVUX0dST1VQX1RZUEUpIF9pbnB1dEdyb3VwVHlwZT86IElneElucHV0R3JvdXBUeXBlKSB7XG4gICAgICAgIHN1cGVyKGVsZW1lbnQsIF9sb2NhbGVJZCwgX2Rpc3BsYXlEZW5zaXR5T3B0aW9ucywgX2lucHV0R3JvdXBUeXBlKTtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSB0aGlzLmxvY2FsZSB8fCB0aGlzLl9sb2NhbGVJZDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICAgICAgICBjYXNlIHRoaXMucGxhdGZvcm0uS0VZTUFQLkFSUk9XX1VQOlxuICAgICAgICAgICAgICAgIGlmIChldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgdGhpcy5wbGF0Zm9ybS5LRVlNQVAuQVJST1dfRE9XTjpcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIHRoZSBkYXRlIHJhbmdlIHBpY2tlcidzIGRyb3Bkb3duIG9yIGRpYWxvZy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZGF0ZS1yYW5nZS1waWNrZXIgI2RhdGVSYW5nZT48L2lneC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAgICAgKlxuICAgICAqIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlneEJ1dHRvbiAoY2xpY2spPVwiZGF0ZVJhbmdlLm9wZW4oKVwiPk9wZW4gRGlhbG9nPC9idXR0b25cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgb3BlbihvdmVybGF5U2V0dGluZ3M/OiBPdmVybGF5U2V0dGluZ3MpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbGxhcHNlZCB8fCB0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuaXNEcm9wZG93blxuICAgICAgICAgICAgPyB0aGlzLmRyb3Bkb3duT3ZlcmxheVNldHRpbmdzXG4gICAgICAgICAgICA6IHRoaXMuZGlhbG9nT3ZlcmxheVNldHRpbmdzXG4gICAgICAgICAgICAsIG92ZXJsYXlTZXR0aW5ncyk7XG5cbiAgICAgICAgdGhpcy5fb3ZlcmxheUlkID0gdGhpcy5fb3ZlcmxheVNlcnZpY2VcbiAgICAgICAgICAgIC5hdHRhY2goSWd4Q2FsZW5kYXJDb250YWluZXJDb21wb25lbnQsIHRoaXMudmlld0NvbnRhaW5lclJlZiwgc2V0dGluZ3MpO1xuICAgICAgICB0aGlzLnN1YnNjcmliZVRvT3ZlcmxheUV2ZW50cygpO1xuICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5zaG93KHRoaXMuX292ZXJsYXlJZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBkYXRlIHJhbmdlIHBpY2tlcidzIGRyb3Bkb3duIG9yIGRpYWxvZy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZGF0ZS1yYW5nZS1waWNrZXIgI2RhdGVSYW5nZT48L2lneC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAgICAgKlxuICAgICAqIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlneEJ1dHRvbiAoY2xpY2spPVwiZGF0ZVJhbmdlLmNsb3NlKClcIj5DbG9zZSBEaWFsb2c8L2J1dHRvbj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLmhpZGUodGhpcy5fb3ZlcmxheUlkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhlIGRhdGUgcmFuZ2UgcGlja2VyJ3MgZHJvcGRvd24gb3IgZGlhbG9nXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyICNkYXRlUmFuZ2U+PC9pZ3gtZGF0ZS1yYW5nZS1waWNrZXI+XG4gICAgICpcbiAgICAgKiA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZ3hCdXR0b24gKGNsaWNrKT1cImRhdGVSYW5nZS50b2dnbGUoKVwiPlRvZ2dsZSBEaWFsb2c8L2J1dHRvbj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlKG92ZXJsYXlTZXR0aW5ncz86IE92ZXJsYXlTZXR0aW5ncyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4ob3ZlcmxheVNldHRpbmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjdHMgYSByYW5nZSBvZiBkYXRlcy4gSWYgbm8gYGVuZERhdGVgIGlzIHBhc3NlZCwgcmFuZ2UgaXMgMSBkYXkgKG9ubHkgYHN0YXJ0RGF0ZWApXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBwdWJsaWMgc2VsZWN0Rml2ZURheVJhbmdlKCkge1xuICAgICAqICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgICogIGNvbnN0IGluRml2ZURheXMgPSBuZXcgRGF0ZShuZXcgRGF0ZSgpLnNldERhdGUodG9kYXkuZ2V0RGF0ZSgpICsgNSkpO1xuICAgICAqICB0aGlzLmRhdGVSYW5nZS5zZWxlY3QodG9kYXksIGluRml2ZURheXMpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0KHN0YXJ0RGF0ZTogRGF0ZSwgZW5kRGF0ZT86IERhdGUpOiB2b2lkIHtcbiAgICAgICAgZW5kRGF0ZSA9IGVuZERhdGUgPz8gc3RhcnREYXRlO1xuICAgICAgICBjb25zdCBkYXRlUmFuZ2UgPSBbc3RhcnREYXRlLCBlbmREYXRlXTtcbiAgICAgICAgdGhpcy5oYW5kbGVTZWxlY3Rpb24oZGF0ZVJhbmdlKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogRGF0ZVJhbmdlKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrID0gZm47XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoQ2FsbGJhY2sgPSBmbjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgICAgICBjb25zdCB2YWx1ZTogRGF0ZVJhbmdlID0gY29udHJvbC52YWx1ZTtcbiAgICAgICAgY29uc3QgZXJyb3JzID0ge307XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzUHJvamVjdGVkSW5wdXRzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRJbnB1dCA9IHRoaXMucHJvamVjdGVkSW5wdXRzLmZpbmQoaSA9PiBpIGluc3RhbmNlb2YgSWd4RGF0ZVJhbmdlU3RhcnRDb21wb25lbnQpIGFzIElneERhdGVSYW5nZVN0YXJ0Q29tcG9uZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuZElucHV0ID0gdGhpcy5wcm9qZWN0ZWRJbnB1dHMuZmluZChpID0+IGkgaW5zdGFuY2VvZiBJZ3hEYXRlUmFuZ2VFbmRDb21wb25lbnQpIGFzIElneERhdGVSYW5nZUVuZENvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0SW5wdXQuZGF0ZVRpbWVFZGl0b3IudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvcnMsIHsgc3RhcnRWYWx1ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFlbmRJbnB1dC5kYXRlVGltZUVkaXRvci52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGVycm9ycywgeyBlbmRWYWx1ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG1pbiA9IHBhcnNlRGF0ZSh0aGlzLm1pblZhbHVlKTtcbiAgICAgICAgICAgIGNvbnN0IG1heCA9IHBhcnNlRGF0ZSh0aGlzLm1heFZhbHVlKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gcGFyc2VEYXRlKHZhbHVlLnN0YXJ0KTtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHBhcnNlRGF0ZSh2YWx1ZS5lbmQpO1xuICAgICAgICAgICAgaWYgKChtaW4gJiYgc3RhcnQgJiYgRGF0ZVRpbWVVdGlsLmxlc3NUaGFuTWluVmFsdWUoc3RhcnQsIG1pbiwgZmFsc2UpKVxuICAgICAgICAgICAgICAgIHx8IChtaW4gJiYgZW5kICYmIERhdGVUaW1lVXRpbC5sZXNzVGhhbk1pblZhbHVlKGVuZCwgbWluLCBmYWxzZSkpKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvcnMsIHsgbWluVmFsdWU6IHRydWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKG1heCAmJiBzdGFydCAmJiBEYXRlVGltZVV0aWwuZ3JlYXRlclRoYW5NYXhWYWx1ZShzdGFydCwgbWF4LCBmYWxzZSkpXG4gICAgICAgICAgICAgICAgfHwgKG1heCAmJiBlbmQgJiYgRGF0ZVRpbWVVdGlsLmdyZWF0ZXJUaGFuTWF4VmFsdWUoZW5kLCBtYXgsIGZhbHNlKSkpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGVycm9ycywgeyBtYXhWYWx1ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhlcnJvcnMpLmxlbmd0aCA+IDAgPyBlcnJvcnMgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlPyhmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZT8oaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbmdDb250cm9sID0gdGhpcy5faW5qZWN0b3IuZ2V0PE5nQ29udHJvbD4oTmdDb250cm9sLCBudWxsKTtcblxuICAgICAgICB0aGlzLmxvY2FsZSA9IHRoaXMubG9jYWxlIHx8IHRoaXMuX2xvY2FsZUlkO1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHVibGljIG92ZXJyaWRlIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlVG9EYXRlRWRpdG9yRXZlbnRzKCk7XG4gICAgICAgIHRoaXMuY29uZmlnUG9zaXRpb25TdHJhdGVneSgpO1xuICAgICAgICB0aGlzLmNvbmZpZ092ZXJsYXlTZXR0aW5ncygpO1xuICAgICAgICB0aGlzLmNhY2hlRm9jdXNlZElucHV0KCk7XG4gICAgICAgIHRoaXMuYXR0YWNoT25Ub3VjaGVkKCk7XG5cbiAgICAgICAgdGhpcy5zZXRSZXF1aXJlZFRvSW5wdXRzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX25nQ29udHJvbCkge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzQ2hhbmdlcyQgPSB0aGlzLl9uZ0NvbnRyb2wuc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUodGhpcy5vblN0YXR1c0NoYW5nZWQuYmluZCh0aGlzKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkZWxheSBpbnZvY2F0aW9ucyB1bnRpbCB0aGUgY3VycmVudCBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlIGhhcyBjb21wbGV0ZWRcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURpc2FibGVkU3RhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbFNldFZhbHVlKCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUlucHV0cygpO1xuICAgICAgICAgICAgLy8gQi5QLiAwNyBKdWx5IDIwMjEgLSBJZ3hEYXRlUmFuZ2VQaWNrZXIgbm90IHNob3dpbmcgaW5pdGlhbCBkaXNhYmxlZCBzdGF0ZSB3aXRoIENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCAjOTc3NlxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBpZiBkaXNhYmxlZCBpcyBwbGFjZWQgb24gdGhlIHJhbmdlIHBpY2tlciBlbGVtZW50IGFuZCB0aGVyZSBhcmUgcHJvamVjdGVkIGlucHV0c1xuICAgICAgICAgICAgICogcnVuIGNoYW5nZSBkZXRlY3Rpb24gc2luY2UgaWd4SW5wdXQgd2lsbCBpbml0aWFsbHkgc2V0IHRoZSBwcm9qZWN0ZWQgaW5wdXRzJyBkaXNhYmxlZCB0byBmYWxzZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBpZiAodGhpcy5oYXNQcm9qZWN0ZWRJbnB1dHMgJiYgdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXBkYXRlRGlzcGxheUZvcm1hdCgpO1xuICAgICAgICB0aGlzLnVwZGF0ZUlucHV0Rm9ybWF0KCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXNbJ2Rpc3BsYXlGb3JtYXQnXSAmJiB0aGlzLmhhc1Byb2plY3RlZElucHV0cykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5Rm9ybWF0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZXNbJ2lucHV0Rm9ybWF0J10gJiYgdGhpcy5oYXNQcm9qZWN0ZWRJbnB1dHMpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW5wdXRGb3JtYXQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlc1snZGlzYWJsZWQnXSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEaXNhYmxlZFN0YXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgICAgIGlmICh0aGlzLl9zdGF0dXNDaGFuZ2VzJCkge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzQ2hhbmdlcyQudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3ZlcmxheUlkKSB7XG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5kZXRhY2godGhpcy5fb3ZlcmxheUlkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXRFZGl0RWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXREaXJlY3RpdmUubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25TdGF0dXNDaGFuZ2VkID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pbnB1dEdyb3VwKSB7XG4gICAgICAgICAgICB0aGlzLnNldFZhbGlkaXR5U3RhdGUodGhpcy5pbnB1dERpcmVjdGl2ZSwgdGhpcy5pbnB1dEdyb3VwLmlzRm9jdXNlZCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5oYXNQcm9qZWN0ZWRJbnB1dHMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvamVjdGVkSW5wdXRzXG4gICAgICAgICAgICAgICAgLmZvckVhY2goKGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWYWxpZGl0eVN0YXRlKGkuaW5wdXREaXJlY3RpdmUsIGkuaXNGb2N1c2VkKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFJlcXVpcmVkVG9JbnB1dHMoKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzZXRWYWxpZGl0eVN0YXRlKGlucHV0RGlyZWN0aXZlOiBJZ3hJbnB1dERpcmVjdGl2ZSwgaXNGb2N1c2VkOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9uZ0NvbnRyb2wgJiYgIXRoaXMuX25nQ29udHJvbC5kaXNhYmxlZCAmJiB0aGlzLmlzVG91Y2hlZE9yRGlydHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc1ZhbGlkYXRvcnMgJiYgaXNGb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgaW5wdXREaXJlY3RpdmUudmFsaWQgPSB0aGlzLl9uZ0NvbnRyb2wudmFsaWQgPyBJZ3hJbnB1dFN0YXRlLlZBTElEIDogSWd4SW5wdXRTdGF0ZS5JTlZBTElEO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnB1dERpcmVjdGl2ZS52YWxpZCA9IHRoaXMuX25nQ29udHJvbC52YWxpZCA/IElneElucHV0U3RhdGUuSU5JVElBTCA6IElneElucHV0U3RhdGUuSU5WQUxJRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlucHV0RGlyZWN0aXZlLnZhbGlkID0gSWd4SW5wdXRTdGF0ZS5JTklUSUFMO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgaXNUb3VjaGVkT3JEaXJ0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLl9uZ0NvbnRyb2wuY29udHJvbC50b3VjaGVkIHx8IHRoaXMuX25nQ29udHJvbC5jb250cm9sLmRpcnR5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBoYXNWYWxpZGF0b3JzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKCEhdGhpcy5fbmdDb250cm9sLmNvbnRyb2wudmFsaWRhdG9yIHx8ICEhdGhpcy5fbmdDb250cm9sLmNvbnRyb2wuYXN5bmNWYWxpZGF0b3IpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlU2VsZWN0aW9uKHNlbGVjdGlvbkRhdGE6IERhdGVbXSk6IHZvaWQge1xuICAgICAgICBsZXQgbmV3VmFsdWUgPSB0aGlzLmV4dHJhY3RSYW5nZShzZWxlY3Rpb25EYXRhKTtcbiAgICAgICAgaWYgKCFuZXdWYWx1ZS5zdGFydCAmJiAhbmV3VmFsdWUuZW5kKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICBpZiAodGhpcy5pc0Ryb3Bkb3duICYmIHNlbGVjdGlvbkRhdGE/Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQ2xvc2luZyhlOiBJQmFzZUNhbmNlbGFibGVCcm93c2VyRXZlbnRBcmdzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSB7IG93bmVyOiB0aGlzLCBjYW5jZWw6IGU/LmNhbmNlbCwgZXZlbnQ6IGU/LmV2ZW50IH07XG4gICAgICAgIHRoaXMuY2xvc2luZy5lbWl0KGFyZ3MpO1xuICAgICAgICBlLmNhbmNlbCA9IGFyZ3MuY2FuY2VsO1xuICAgICAgICBpZiAoYXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzRHJvcGRvd24gJiYgZT8uZXZlbnQgJiYgIXRoaXMuaXNGb2N1c2VkKSB7XG4gICAgICAgICAgICAvLyBvdXRzaWRlIGNsaWNrXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbGlkaXR5T25CbHVyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uVG91Y2hDYWxsYmFjaygpO1xuICAgICAgICAgICAgLy8gaW5wdXQgY2xpY2tcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc1Byb2plY3RlZElucHV0cyAmJiB0aGlzLl9mb2N1c2VkSW5wdXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c2VkSW5wdXQuc2V0Rm9jdXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c2VkSW5wdXQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXREaXJlY3RpdmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0RGlyZWN0aXZlLmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN1YnNjcmliZVRvT3ZlcmxheUV2ZW50cygpIHtcbiAgICAgICAgdGhpcy5fb3ZlcmxheVNlcnZpY2Uub3BlbmluZy5waXBlKC4uLnRoaXMuX292ZXJsYXlTdWJGaWx0ZXIpLnN1YnNjcmliZSgoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmxheUV2ZW50ID0gZSBhcyBPdmVybGF5Q2FuY2VsYWJsZUV2ZW50QXJncztcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSB7IG93bmVyOiB0aGlzLCBjYW5jZWw6IG92ZXJsYXlFdmVudD8uY2FuY2VsLCBldmVudDogZS5ldmVudCB9O1xuICAgICAgICAgICAgdGhpcy5vcGVuaW5nLmVtaXQoYXJncyk7XG4gICAgICAgICAgICBpZiAoYXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5kZXRhY2godGhpcy5fb3ZlcmxheUlkKTtcbiAgICAgICAgICAgICAgICBvdmVybGF5RXZlbnQuY2FuY2VsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxpemVDYWxlbmRhckNvbnRhaW5lcihlLmNvbXBvbmVudFJlZi5pbnN0YW5jZSk7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhckNvbnRhaW5lciA9IGUuY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLl9jb2xsYXBzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FsZW5kYXIoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fb3ZlcmxheVNlcnZpY2Uub3BlbmVkLnBpcGUoLi4udGhpcy5fb3ZlcmxheVN1YkZpbHRlcikuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXIud3JhcHBlci5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB0aGlzLm9wZW5lZC5lbWl0KHsgb3duZXI6IHRoaXMgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLmNsb3NpbmcucGlwZSguLi50aGlzLl9vdmVybGF5U3ViRmlsdGVyKS5zdWJzY3JpYmUoKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2xvc2luZyhlIGFzIE92ZXJsYXlDYW5jZWxhYmxlRXZlbnRBcmdzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fb3ZlcmxheVNlcnZpY2UuY2xvc2VkLnBpcGUoLi4udGhpcy5fb3ZlcmxheVN1YkZpbHRlcikuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLmRldGFjaCh0aGlzLl9vdmVybGF5SWQpO1xuICAgICAgICAgICAgdGhpcy5fY29sbGFwc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlJZCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhciA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhckNvbnRhaW5lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VkLmVtaXQoeyBvd25lcjogdGhpcyB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVWYWx1ZSh2YWx1ZTogRGF0ZVJhbmdlKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWUgPyB2YWx1ZSA6IG51bGw7XG4gICAgICAgIHRoaXMudXBkYXRlSW5wdXRzKCk7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FsZW5kYXIoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVZhbGlkaXR5T25CbHVyKCkge1xuICAgICAgICB0aGlzLm9uVG91Y2hDYWxsYmFjaygpO1xuICAgICAgICBpZiAodGhpcy5fbmdDb250cm9sKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNQcm9qZWN0ZWRJbnB1dHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2plY3RlZElucHV0cy5mb3JFYWNoKGkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX25nQ29udHJvbC52YWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaS51cGRhdGVJbnB1dFZhbGlkaXR5KElneElucHV0U3RhdGUuSU5WQUxJRCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpLnVwZGF0ZUlucHV0VmFsaWRpdHkoSWd4SW5wdXRTdGF0ZS5JTklUSUFMKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5pbnB1dERpcmVjdGl2ZSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbmdDb250cm9sLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXREaXJlY3RpdmUudmFsaWQgPSBJZ3hJbnB1dFN0YXRlLklOVkFMSUQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dERpcmVjdGl2ZS52YWxpZCA9IElneElucHV0U3RhdGUuSU5JVElBTDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZURpc2FibGVkU3RhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc1Byb2plY3RlZElucHV0cykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnByb2plY3RlZElucHV0cy5maW5kKGkgPT4gaSBpbnN0YW5jZW9mIElneERhdGVSYW5nZVN0YXJ0Q29tcG9uZW50KSBhcyBJZ3hEYXRlUmFuZ2VTdGFydENvbXBvbmVudDtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRoaXMucHJvamVjdGVkSW5wdXRzLmZpbmQoaSA9PiBpIGluc3RhbmNlb2YgSWd4RGF0ZVJhbmdlRW5kQ29tcG9uZW50KSBhcyBJZ3hEYXRlUmFuZ2VFbmRDb21wb25lbnQ7XG4gICAgICAgICAgICBzdGFydC5pbnB1dERpcmVjdGl2ZS5kaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQ7XG4gICAgICAgICAgICBlbmQuaW5wdXREaXJlY3RpdmUuZGlzYWJsZWQgPSB0aGlzLmRpc2FibGVkO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRSZXF1aXJlZFRvSW5wdXRzKCk6IHZvaWQge1xuICAgICAgICAvLyB3b3JrYXJvdW5kIGZvciBpZ3hJbnB1dCBzZXR0aW5nIHJlcXVpcmVkXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXNSZXF1aXJlZCA9IHRoaXMucmVxdWlyZWQ7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnB1dEdyb3VwICYmIHRoaXMuaW5wdXRHcm91cC5pc1JlcXVpcmVkICE9PSBpc1JlcXVpcmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dEdyb3VwLmlzUmVxdWlyZWQgPSBpc1JlcXVpcmVkO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhhc1Byb2plY3RlZElucHV0cyAmJiB0aGlzLl9uZ0NvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2plY3RlZElucHV0cy5mb3JFYWNoKGkgPT4gaS5pc1JlcXVpcmVkID0gaXNSZXF1aXJlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VNaW5WYWx1ZSh2YWx1ZTogc3RyaW5nIHwgRGF0ZSk6IERhdGUgfCBudWxsIHtcbiAgICAgICAgbGV0IG1pblZhbHVlOiBEYXRlID0gcGFyc2VEYXRlKHZhbHVlKTtcbiAgICAgICAgaWYgKCFtaW5WYWx1ZSAmJiB0aGlzLmhhc1Byb2plY3RlZElucHV0cykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnByb2plY3RlZElucHV0cy5maWx0ZXIoaSA9PiBpIGluc3RhbmNlb2YgSWd4RGF0ZVJhbmdlU3RhcnRDb21wb25lbnQpWzBdO1xuICAgICAgICAgICAgaWYgKHN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgbWluVmFsdWUgPSBwYXJzZURhdGUoc3RhcnQuZGF0ZVRpbWVFZGl0b3IubWluVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1pblZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VNYXhWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgRGF0ZSk6IERhdGUgfCBudWxsIHtcbiAgICAgICAgbGV0IG1heFZhbHVlOiBEYXRlID0gcGFyc2VEYXRlKHZhbHVlKTtcbiAgICAgICAgaWYgKCFtYXhWYWx1ZSAmJiB0aGlzLnByb2plY3RlZElucHV0cykge1xuICAgICAgICAgICAgY29uc3QgZW5kID0gdGhpcy5wcm9qZWN0ZWRJbnB1dHMuZmlsdGVyKGkgPT4gaSBpbnN0YW5jZW9mIElneERhdGVSYW5nZUVuZENvbXBvbmVudClbMF07XG4gICAgICAgICAgICBpZiAoZW5kKSB7XG4gICAgICAgICAgICAgICAgbWF4VmFsdWUgPSBwYXJzZURhdGUoZW5kLmRhdGVUaW1lRWRpdG9yLm1heFZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXhWYWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUNhbGVuZGFyKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY2FsZW5kYXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhbGVuZGFyLmRpc2FibGVkRGF0ZXMgPSBbXTtcbiAgICAgICAgY29uc3QgbWluVmFsdWUgPSB0aGlzLnBhcnNlTWluVmFsdWUodGhpcy5taW5WYWx1ZSk7XG4gICAgICAgIGlmIChtaW5WYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5jYWxlbmRhci5kaXNhYmxlZERhdGVzLnB1c2goeyB0eXBlOiBEYXRlUmFuZ2VUeXBlLkJlZm9yZSwgZGF0ZVJhbmdlOiBbbWluVmFsdWVdIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1heFZhbHVlID0gdGhpcy5wYXJzZU1heFZhbHVlKHRoaXMubWF4VmFsdWUpO1xuICAgICAgICBpZiAobWF4VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXIuZGlzYWJsZWREYXRlcy5wdXNoKHsgdHlwZTogRGF0ZVJhbmdlVHlwZS5BZnRlciwgZGF0ZVJhbmdlOiBbbWF4VmFsdWVdIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmFuZ2U6IERhdGVbXSA9IFtdO1xuICAgICAgICBpZiAodGhpcy52YWx1ZT8uc3RhcnQgJiYgdGhpcy52YWx1ZT8uZW5kKSB7XG4gICAgICAgICAgICBjb25zdCBfdmFsdWUgPSB0aGlzLnRvUmFuZ2VPZkRhdGVzKHRoaXMudmFsdWUpO1xuICAgICAgICAgICAgaWYgKERhdGVUaW1lVXRpbC5ncmVhdGVyVGhhbk1heFZhbHVlKF92YWx1ZS5zdGFydCwgX3ZhbHVlLmVuZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN3YXBFZGl0b3JEYXRlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVJblJhbmdlKHRoaXMudmFsdWUsIG1pblZhbHVlLCBtYXhWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByYW5nZS5wdXNoKF92YWx1ZS5zdGFydCwgX3ZhbHVlLmVuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmFuZ2UubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5jYWxlbmRhci5zZWxlY3REYXRlKHJhbmdlKTtcbiAgICAgICAgfSBlbHNlIGlmIChyYW5nZS5sZW5ndGggPT09IDAgJiYgdGhpcy5jYWxlbmRhci5tb250aFZpZXdzKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGVuZGFyLmRlc2VsZWN0RGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2FsZW5kYXIudmlld0RhdGUgPSByYW5nZVswXSB8fCBuZXcgRGF0ZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3dhcEVkaXRvckRhdGVzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5oYXNQcm9qZWN0ZWRJbnB1dHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5wcm9qZWN0ZWRJbnB1dHMuZmluZChpID0+IGkgaW5zdGFuY2VvZiBJZ3hEYXRlUmFuZ2VTdGFydENvbXBvbmVudCkgYXMgSWd4RGF0ZVJhbmdlU3RhcnRDb21wb25lbnQ7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0aGlzLnByb2plY3RlZElucHV0cy5maW5kKGkgPT4gaSBpbnN0YW5jZW9mIElneERhdGVSYW5nZUVuZENvbXBvbmVudCkgYXMgSWd4RGF0ZVJhbmdlRW5kQ29tcG9uZW50O1xuICAgICAgICAgICAgW3N0YXJ0LmRhdGVUaW1lRWRpdG9yLnZhbHVlLCBlbmQuZGF0ZVRpbWVFZGl0b3IudmFsdWVdID0gW2VuZC5kYXRlVGltZUVkaXRvci52YWx1ZSwgc3RhcnQuZGF0ZVRpbWVFZGl0b3IudmFsdWVdO1xuICAgICAgICAgICAgW3RoaXMudmFsdWUuc3RhcnQsIHRoaXMudmFsdWUuZW5kXSA9IFt0aGlzLnZhbHVlLmVuZCwgdGhpcy52YWx1ZS5zdGFydF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHZhbHVlSW5SYW5nZSh2YWx1ZTogRGF0ZVJhbmdlLCBtaW5WYWx1ZT86IERhdGUsIG1heFZhbHVlPzogRGF0ZSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBfdmFsdWUgPSB0aGlzLnRvUmFuZ2VPZkRhdGVzKHZhbHVlKTtcbiAgICAgICAgaWYgKG1pblZhbHVlICYmIERhdGVUaW1lVXRpbC5sZXNzVGhhbk1pblZhbHVlKF92YWx1ZS5zdGFydCwgbWluVmFsdWUsIGZhbHNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXhWYWx1ZSAmJiBEYXRlVGltZVV0aWwuZ3JlYXRlclRoYW5NYXhWYWx1ZShfdmFsdWUuZW5kLCBtYXhWYWx1ZSwgZmFsc2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGV4dHJhY3RSYW5nZShzZWxlY3Rpb246IERhdGVbXSk6IERhdGVSYW5nZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGFydDogc2VsZWN0aW9uWzBdIHx8IG51bGwsXG4gICAgICAgICAgICBlbmQ6IHNlbGVjdGlvbi5sZW5ndGggPiAwID8gc2VsZWN0aW9uW3NlbGVjdGlvbi5sZW5ndGggLSAxXSA6IG51bGxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvUmFuZ2VPZkRhdGVzKHJhbmdlOiBEYXRlUmFuZ2UpOiB7IHN0YXJ0OiBEYXRlOyBlbmQ6IERhdGUgfSB7XG4gICAgICAgIGxldCBzdGFydDtcbiAgICAgICAgbGV0IGVuZDtcbiAgICAgICAgaWYgKCFpc0RhdGUocmFuZ2Uuc3RhcnQpKSB7XG4gICAgICAgICAgICBzdGFydCA9IERhdGVUaW1lVXRpbC5wYXJzZUlzb0RhdGUocmFuZ2Uuc3RhcnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNEYXRlKHJhbmdlLmVuZCkpIHtcbiAgICAgICAgICAgIGVuZCA9IERhdGVUaW1lVXRpbC5wYXJzZUlzb0RhdGUocmFuZ2UuZW5kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGFydCB8fCBlbmQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiByYW5nZS5zdGFydCBhcyBEYXRlLCBlbmQ6IHJhbmdlLmVuZCBhcyBEYXRlIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdWJzY3JpYmVUb0RhdGVFZGl0b3JFdmVudHMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmhhc1Byb2plY3RlZElucHV0cykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnByb2plY3RlZElucHV0cy5maW5kKGkgPT4gaSBpbnN0YW5jZW9mIElneERhdGVSYW5nZVN0YXJ0Q29tcG9uZW50KSBhcyBJZ3hEYXRlUmFuZ2VTdGFydENvbXBvbmVudDtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRoaXMucHJvamVjdGVkSW5wdXRzLmZpbmQoaSA9PiBpIGluc3RhbmNlb2YgSWd4RGF0ZVJhbmdlRW5kQ29tcG9uZW50KSBhcyBJZ3hEYXRlUmFuZ2VFbmRDb21wb25lbnQ7XG4gICAgICAgICAgICBpZiAoc3RhcnQgJiYgZW5kKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQuZGF0ZVRpbWVFZGl0b3IudmFsdWVDaGFuZ2VcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB7IHN0YXJ0OiB2YWx1ZSwgZW5kOiB0aGlzLnZhbHVlLmVuZCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0geyBzdGFydDogdmFsdWUsIGVuZDogbnVsbCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBlbmQuZGF0ZVRpbWVFZGl0b3IudmFsdWVDaGFuZ2VcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB7IHN0YXJ0OiB0aGlzLnZhbHVlLnN0YXJ0LCBlbmQ6IHZhbHVlIGFzIERhdGUgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHsgc3RhcnQ6IG51bGwsIGVuZDogdmFsdWUgYXMgRGF0ZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXR0YWNoT25Ub3VjaGVkKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5oYXNQcm9qZWN0ZWRJbnB1dHMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvamVjdGVkSW5wdXRzLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICAgICAgZnJvbUV2ZW50KGkuZGF0ZVRpbWVFZGl0b3IubmF0aXZlRWxlbWVudCwgJ2JsdXInKVxuICAgICAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbGxhcHNlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsaWRpdHlPbkJsdXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyb21FdmVudCh0aGlzLmlucHV0RGlyZWN0aXZlLm5hdGl2ZUVsZW1lbnQsICdibHVyJylcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsaWRpdHlPbkJsdXIoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWNoZUZvY3VzZWRJbnB1dCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzUHJvamVjdGVkSW5wdXRzKSB7XG4gICAgICAgICAgICB0aGlzLnByb2plY3RlZElucHV0cy5mb3JFYWNoKGkgPT4ge1xuICAgICAgICAgICAgICAgIGZyb21FdmVudChpLmRhdGVUaW1lRWRpdG9yLm5hdGl2ZUVsZW1lbnQsICdmb2N1cycpXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fZm9jdXNlZElucHV0ID0gaSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY29uZmlnUG9zaXRpb25TdHJhdGVneSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcG9zaXRpb25TZXR0aW5ncyA9IHtcbiAgICAgICAgICAgIG9wZW5BbmltYXRpb246IGZhZGVJbixcbiAgICAgICAgICAgIGNsb3NlQW5pbWF0aW9uOiBmYWRlT3V0XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2Ryb3BEb3duT3ZlcmxheVNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kgPSBuZXcgQXV0b1Bvc2l0aW9uU3RyYXRlZ3kodGhpcy5fcG9zaXRpb25TZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuX2Ryb3BEb3duT3ZlcmxheVNldHRpbmdzLnRhcmdldCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgY29uZmlnT3ZlcmxheVNldHRpbmdzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vdmVybGF5U2V0dGluZ3MgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX2Ryb3BEb3duT3ZlcmxheVNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fZHJvcERvd25PdmVybGF5U2V0dGluZ3MsIHRoaXMub3ZlcmxheVNldHRpbmdzKTtcbiAgICAgICAgICAgIHRoaXMuX2RpYWxvZ092ZXJsYXlTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX2RpYWxvZ092ZXJsYXlTZXR0aW5ncywgdGhpcy5vdmVybGF5U2V0dGluZ3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsU2V0VmFsdWUoKSB7XG4gICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIHZhbHVlIGFuZCBubyBuZ0NvbnRyb2wgb24gdGhlIHBpY2tlciBidXQgd2UgaGF2ZSBpbnB1dHMgd2UgbWF5IGhhdmUgdmFsdWUgc2V0IHRocm91Z2hcbiAgICAgICAgLy8gdGhlaXIgbmdNb2RlbHMgLSB3ZSBzaG91bGQgZ2VuZXJhdGUgb3VyIGluaXRpYWwgY29udHJvbCB2YWx1ZVxuICAgICAgICBpZiAoKCF0aGlzLnZhbHVlIHx8ICghdGhpcy52YWx1ZS5zdGFydCAmJiAhdGhpcy52YWx1ZS5lbmQpKSAmJiB0aGlzLmhhc1Byb2plY3RlZElucHV0cyAmJiAhdGhpcy5fbmdDb250cm9sKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMucHJvamVjdGVkSW5wdXRzLmZpbmQoaSA9PiBpIGluc3RhbmNlb2YgSWd4RGF0ZVJhbmdlU3RhcnRDb21wb25lbnQpO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gdGhpcy5wcm9qZWN0ZWRJbnB1dHMuZmluZChpID0+IGkgaW5zdGFuY2VvZiBJZ3hEYXRlUmFuZ2VFbmRDb21wb25lbnQpO1xuICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LmRhdGVUaW1lRWRpdG9yLnZhbHVlIGFzIERhdGUsXG4gICAgICAgICAgICAgICAgZW5kOiBlbmQuZGF0ZVRpbWVFZGl0b3IudmFsdWUgYXMgRGF0ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlSW5wdXRzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMucHJvamVjdGVkSW5wdXRzPy5maW5kKGkgPT4gaSBpbnN0YW5jZW9mIElneERhdGVSYW5nZVN0YXJ0Q29tcG9uZW50KSBhcyBJZ3hEYXRlUmFuZ2VTdGFydENvbXBvbmVudDtcbiAgICAgICAgY29uc3QgZW5kID0gdGhpcy5wcm9qZWN0ZWRJbnB1dHM/LmZpbmQoaSA9PiBpIGluc3RhbmNlb2YgSWd4RGF0ZVJhbmdlRW5kQ29tcG9uZW50KSBhcyBJZ3hEYXRlUmFuZ2VFbmRDb21wb25lbnQ7XG4gICAgICAgIGlmIChzdGFydCAmJiBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IF92YWx1ZSA9IHRoaXMudmFsdWUgPyB0aGlzLnRvUmFuZ2VPZkRhdGVzKHRoaXMudmFsdWUpIDogbnVsbDtcbiAgICAgICAgICAgIHN0YXJ0LnVwZGF0ZUlucHV0VmFsdWUoX3ZhbHVlPy5zdGFydCB8fCBudWxsKTtcbiAgICAgICAgICAgIGVuZC51cGRhdGVJbnB1dFZhbHVlKF92YWx1ZT8uZW5kIHx8IG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVEaXNwbGF5Rm9ybWF0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnByb2plY3RlZElucHV0cy5mb3JFYWNoKGkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBpIGFzIElneERhdGVSYW5nZUlucHV0c0Jhc2VDb21wb25lbnQ7XG4gICAgICAgICAgICBpbnB1dC5kYXRlVGltZUVkaXRvci5kaXNwbGF5Rm9ybWF0ID0gdGhpcy5kaXNwbGF5Rm9ybWF0O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUlucHV0Rm9ybWF0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnByb2plY3RlZElucHV0cy5mb3JFYWNoKGkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBpIGFzIElneERhdGVSYW5nZUlucHV0c0Jhc2VDb21wb25lbnQ7XG4gICAgICAgICAgICBpZiAoaW5wdXQuZGF0ZVRpbWVFZGl0b3IuaW5wdXRGb3JtYXQgIT09IHRoaXMuaW5wdXRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICBpbnB1dC5kYXRlVGltZUVkaXRvci5pbnB1dEZvcm1hdCA9IHRoaXMuaW5wdXRGb3JtYXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2luaXRpYWxpemVDYWxlbmRhckNvbnRhaW5lcihjb21wb25lbnRJbnN0YW5jZTogSWd4Q2FsZW5kYXJDb250YWluZXJDb21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5fY2FsZW5kYXIgPSBjb21wb25lbnRJbnN0YW5jZS5jYWxlbmRhcjtcbiAgICAgICAgdGhpcy5jYWxlbmRhci5oYXNIZWFkZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYWxlbmRhci5sb2NhbGUgPSB0aGlzLmxvY2FsZTtcbiAgICAgICAgdGhpcy5jYWxlbmRhci5zZWxlY3Rpb24gPSBDYWxlbmRhclNlbGVjdGlvbi5SQU5HRTtcbiAgICAgICAgdGhpcy5jYWxlbmRhci53ZWVrU3RhcnQgPSB0aGlzLndlZWtTdGFydDtcbiAgICAgICAgdGhpcy5jYWxlbmRhci5oaWRlT3V0c2lkZURheXMgPSB0aGlzLmhpZGVPdXRzaWRlRGF5cztcbiAgICAgICAgdGhpcy5jYWxlbmRhci5tb250aHNWaWV3TnVtYmVyID0gdGhpcy5kaXNwbGF5TW9udGhzQ291bnQ7XG4gICAgICAgIHRoaXMuY2FsZW5kYXIuc2hvd1dlZWtOdW1iZXJzID0gdGhpcy5zaG93V2Vla051bWJlcnM7XG4gICAgICAgIHRoaXMuY2FsZW5kYXIuc2VsZWN0ZWQucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKGV2OiBEYXRlW10pID0+IHRoaXMuaGFuZGxlU2VsZWN0aW9uKGV2KSk7XG5cbiAgICAgICAgY29tcG9uZW50SW5zdGFuY2UubW9kZSA9IHRoaXMubW9kZTtcbiAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuY2xvc2VCdXR0b25MYWJlbCA9ICF0aGlzLmlzRHJvcGRvd24gPyB0aGlzLmRvbmVCdXR0b25UZXh0IDogbnVsbDtcbiAgICAgICAgY29tcG9uZW50SW5zdGFuY2UucGlja2VyQWN0aW9ucyA9IHRoaXMucGlja2VyQWN0aW9ucztcbiAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuY2FsZW5kYXJDbG9zZS5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNsb3NlKCkpO1xuICAgIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoYXNQcm9qZWN0ZWRJbnB1dHMgPyBzdGFydEVuZFRlbXBsYXRlIDogZGVmVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNzaW5nbGVUZW1wbGF0ZT5cbiAgICA8ZGl2IChjbGljayk9XCJvcGVuKClcIiBjbGFzcz1cImNvbnRlbnQtd3JhcFwiPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJpZ3gtZGF0ZS1zaW5nbGVcIj48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3N0YXJ0RW5kVGVtcGxhdGU+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiaWd4LWRhdGUtcmFuZ2Utc3RhcnRcIj48L25nLWNvbnRlbnQ+XG4gICAgPGRpdiBbY2xhc3NOYW1lXT1cInNlcGFyYXRvckNsYXNzXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkYXRlU2VwYXJhdG9yVGVtcGxhdGUgfHwgZGVmRGF0ZVNlcGFyYXRvclRlbXBsYXRlO1wiPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJpZ3gtZGF0ZS1yYW5nZS1lbmRcIj48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZkljb24+XG4gICAgPGlneC1pY29uPlxuICAgICAgICBkYXRlX3JhbmdlXG4gICAgPC9pZ3gtaWNvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmRGF0ZVNlcGFyYXRvclRlbXBsYXRlPnt7IGRhdGVTZXBhcmF0b3IgfX08L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZlRlbXBsYXRlPlxuICAgIDxpZ3gtaW5wdXQtZ3JvdXAgW3R5cGVdPVwidHlwZVwiIFtkaXNwbGF5RGVuc2l0eV09XCJkaXNwbGF5RGVuc2l0eVwiIChjbGljayk9XCJvcGVuKClcIj5cbiAgICAgICAgPCEtLSBvbmx5IHNldCBtYXNrIHBsYWNlaG9sZGVyIHdoZW4gZW1wdHksIG90aGVyd2lzZSBpbnB1dCBncm91cCBtaWdodCB1c2UgaXQgYXMgbGFiZWwgaWYgbm9uZSBpcyBzZXQgLS0+XG4gICAgICAgIDxpbnB1dCAjc2luZ2xlSW5wdXQgaWd4SW5wdXQgdHlwZT1cInRleHRcIiByZWFkb25seSBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbcGxhY2Vob2xkZXJdPVwidmFsdWUgPyAnJyA6IHNpbmdsZUlucHV0Rm9ybWF0XCJcbiAgICAgICAgICAgIHJvbGU9XCJjb21ib2JveFwiIGFyaWEtaGFzcG9wdXA9XCJncmlkXCIgW2F0dHIuYXJpYS1leHBhbmRlZF09XCIhY29sbGFwc2VkXCIgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImxhYmVsPy5pZFwiXG4gICAgICAgICAgICBbdmFsdWVdPVwidmFsdWUgfCBkYXRlUmFuZ2U6IGFwcGxpZWRGb3JtYXQgOiBsb2NhbGUgOiBmb3JtYXR0ZXJcIiAvPlxuXG4gICAgICAgIDxpZ3gtcHJlZml4ICpuZ0lmPVwiIXRvZ2dsZUNvbXBvbmVudHMubGVuZ3RoXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZGVmSWNvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2lneC1wcmVmaXg+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBuZ1Byb2plY3RBcz1cIltpZ3hMYWJlbF1cIj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltpZ3hMYWJlbF1cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyIG5nUHJvamVjdEFzPVwiaWd4LXByZWZpeFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiaWd4LXByZWZpeCxbaWd4UHJlZml4XVwiPjwvbmctY29udGVudD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgbmdQcm9qZWN0QXM9XCJpZ3gtc3VmZml4XCI+XG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJpZ3gtc3VmZml4LFtpZ3hTdWZmaXhdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBuZ1Byb2plY3RBcz1cImlneC1oaW50XCI+XG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJpZ3gtaGludCxbaWd4SGludF1cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvaWd4LWlucHV0LWdyb3VwPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
905
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2RhdGUtcmFuZ2UtcGlja2VyL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9kYXRlLXJhbmdlLXBpY2tlci9kYXRlLXJhbmdlLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ1ksZ0JBQWdCLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUM1RixZQUFZLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQVksS0FBSyxFQUFFLFNBQVMsRUFDN0MsUUFBUSxFQUFFLE1BQU0sRUFDL0IsV0FBVyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFDMUQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFDb0MsU0FBUyxFQUNoRCxhQUFhLEVBQUUsaUJBQWlCLEVBQ25DLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQTRCLElBQUksRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDdEYsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsaUJBQWlCLEVBQXdCLE1BQU0sd0JBQXdCLENBQUM7QUFDakYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5QyxPQUFPLEVBQUUsbUJBQW1CLEVBQTBCLE1BQU0saUJBQWlCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGdDQUFnQyxFQUFtQyxNQUFN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QUFTO3VCQUFDLGlCQUFpQjtnQkFLckIsZUFBZTtzQkFEckIsZUFBZTt1QkFBQywrQkFBK0I7Z0JBSXpDLEtBQUs7c0JBRFgsWUFBWTt1QkFBQyxpQkFBaUI7Z0JBSXhCLGFBQWE7c0JBRG5CLFlBQVk7dUJBQUMseUJBQXlCO2dCQUtoQyxxQkFBcUI7c0JBRDNCLFlBQVk7dUJBQUMsOEJBQThCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQXVEeEQsS0FBSztzQkFEZixLQUFLO2dCQXVGQyxTQUFTO3NCQUZmLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LCBib29sZWFuQXR0cmlidXRlLCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIENvbnRlbnRDaGlsZHJlbiwgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIsIEluamVjdCwgSW5qZWN0b3IsIElucHV0LCBMT0NBTEVfSUQsXG4gICAgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCwgUXVlcnlMaXN0LFxuICAgIFNpbXBsZUNoYW5nZXMsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0LCBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQWJzdHJhY3RDb250cm9sLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sLFxuICAgIE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SLCBWYWxpZGF0aW9uRXJyb3JzLCBWYWxpZGF0b3Jcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBmcm9tRXZlbnQsIG1lcmdlLCBNb25vVHlwZU9wZXJhdG9yRnVuY3Rpb24sIG5vb3AsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IENhbGVuZGFyU2VsZWN0aW9uLCBJZ3hDYWxlbmRhckNvbXBvbmVudCB9IGZyb20gJy4uL2NhbGVuZGFyL3B1YmxpY19hcGknO1xuaW1wb3J0IHsgRGF0ZVJhbmdlVHlwZSB9IGZyb20gJy4uL2NvcmUvZGF0ZXMnO1xuaW1wb3J0IHsgRGlzcGxheURlbnNpdHlUb2tlbiwgSURpc3BsYXlEZW5zaXR5T3B0aW9ucyB9IGZyb20gJy4uL2NvcmUvZGVuc2l0eSc7XG5pbXBvcnQgeyBEYXRlUmFuZ2VQaWNrZXJSZXNvdXJjZVN0cmluZ3NFTiwgSURhdGVSYW5nZVBpY2tlclJlc291cmNlU3RyaW5ncyB9IGZyb20gJy4uL2NvcmUvaTE4bi9kYXRlLXJhbmdlLXBpY2tlci1yZXNvdXJjZXMnO1xuaW1wb3J0IHsgSUJhc2VDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncywgaXNEYXRlLCBwYXJzZURhdGUsIFBsYXRmb3JtVXRpbCB9IGZyb20gJy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgSWd4Q2FsZW5kYXJDb250YWluZXJDb21wb25lbnQgfSBmcm9tICcuLi9kYXRlLWNvbW1vbi9jYWxlbmRhci1jb250YWluZXIvY2FsZW5kYXItY29udGFpbmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQaWNrZXJCYXNlRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGF0ZS1jb21tb24vcGlja2VyLWJhc2UuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneFBpY2tlckFjdGlvbnNEaXJlY3RpdmUgfSBmcm9tICcuLi9kYXRlLWNvbW1vbi9waWNrZXItaWNvbnMuY29tbW9uJztcbmltcG9ydCB7IERhdGVUaW1lVXRpbCB9IGZyb20gJy4uL2RhdGUtY29tbW9uL3V0aWwvZGF0ZS10aW1lLnV0aWwnO1xuaW1wb3J0IHsgSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvdG9nZ2xlL3RvZ2dsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHtcbiAgICBJZ3hJbnB1dERpcmVjdGl2ZSwgSWd4SW5wdXRHcm91cENvbXBvbmVudCwgSWd4SW5wdXRHcm91cFR5cGUsIElneElucHV0U3RhdGUsXG4gICAgSWd4TGFiZWxEaXJlY3RpdmUsIElHWF9JTlBVVF9HUk9VUF9UWVBFXG59IGZyb20gJy4uL2lucHV0LWdyb3VwL3B1YmxpY19hcGknO1xuaW1wb3J0IHtcbiAgICBBdXRvUG9zaXRpb25TdHJhdGVneSwgSWd4T3ZlcmxheVNlcnZpY2UsIE92ZXJsYXlDYW5jZWxhYmxlRXZlbnRBcmdzLCBPdmVybGF5RXZlbnRBcmdzLFxuICAgIE92ZXJsYXlTZXR0aW5ncywgUG9zaXRpb25TZXR0aW5nc1xufSBmcm9tICcuLi9zZXJ2aWNlcy9wdWJsaWNfYXBpJztcbmltcG9ydCB7IERhdGVSYW5nZSwgSWd4RGF0ZVJhbmdlRW5kQ29tcG9uZW50LCBJZ3hEYXRlUmFuZ2VJbnB1dHNCYXNlQ29tcG9uZW50LCBJZ3hEYXRlUmFuZ2VTZXBhcmF0b3JEaXJlY3RpdmUsIElneERhdGVSYW5nZVN0YXJ0Q29tcG9uZW50LCBEYXRlUmFuZ2VQaWNrZXJGb3JtYXRQaXBlIH0gZnJvbSAnLi9kYXRlLXJhbmdlLXBpY2tlci1pbnB1dHMuY29tbW9uJztcbmltcG9ydCB7IElneFByZWZpeERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvcHJlZml4L3ByZWZpeC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uL2ljb24vaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgZ2V0Q3VycmVudFJlc291cmNlU3RyaW5ncyB9IGZyb20gJy4uL2NvcmUvaTE4bi9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgZmFkZUluLCBmYWRlT3V0IH0gZnJvbSAnaWduaXRldWktYW5ndWxhci9hbmltYXRpb25zJztcblxuY29uc3QgU2luZ2xlSW5wdXREYXRlc0NvbmNhdGVuYXRpb25TdHJpbmcgPSAnIC0gJztcblxuLyoqXG4gKiBQcm92aWRlcyB0aGUgYWJpbGl0eSB0byBzZWxlY3QgYSByYW5nZSBvZiBkYXRlcyBmcm9tIGEgY2FsZW5kYXIgVUkgb3IgZWRpdGFibGUgaW5wdXRzLlxuICpcbiAqIEBpZ3hNb2R1bGUgSWd4RGF0ZVJhbmdlTW9kdWxlXG4gKlxuICogQGlneFRoZW1lIGlneC1pbnB1dC1ncm91cC10aGVtZSwgaWd4LWNhbGVuZGFyLXRoZW1lLCBpZ3gtZGF0ZS1yYW5nZS1waWNrZXItdGhlbWVcbiAqXG4gKiBAaWd4S2V5d29yZHMgZGF0ZSwgcmFuZ2UsIGRhdGUgcmFuZ2UsIGRhdGUgcGlja2VyXG4gKlxuICogQGlneEdyb3VwIHNjaGVkdWxpbmdcbiAqXG4gKiBAcmVtYXJrc1xuICogSXQgZGlzcGxheXMgdGhlIHJhbmdlIHNlbGVjdGlvbiBpbiBhIHNpbmdsZSBvciB0d28gaW5wdXQgZmllbGRzLlxuICogVGhlIGRlZmF1bHQgdGVtcGxhdGUgZGlzcGxheXMgYSBzaW5nbGUgKnJlYWRvbmx5KiBpbnB1dCBmaWVsZFxuICogd2hpbGUgcHJvamVjdGluZyBgaWd4LWRhdGUtcmFuZ2Utc3RhcnRgIGFuZCBgaWd4LWRhdGUtcmFuZ2UtZW5kYFxuICogZGlzcGxheXMgdHdvICplZGl0YWJsZSogaW5wdXQgZmllbGRzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyIG1vZGU9XCJkcm9wZG93blwiPjwvaWd4LWRhdGUtcmFuZ2UtcGlja2VyPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnaWd4LWRhdGUtcmFuZ2UtcGlja2VyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS1yYW5nZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7IHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLCB1c2VFeGlzdGluZzogSWd4RGF0ZVJhbmdlUGlja2VyQ29tcG9uZW50LCBtdWx0aTogdHJ1ZSB9LFxuICAgICAgICB7IHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsIHVzZUV4aXN0aW5nOiBJZ3hEYXRlUmFuZ2VQaWNrZXJDb21wb25lbnQsIG11bHRpOiB0cnVlIH1cbiAgICBdLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0lmLFxuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgICAgICBJZ3hJY29uQ29tcG9uZW50LFxuICAgICAgICBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50LFxuICAgICAgICBJZ3hJbnB1dERpcmVjdGl2ZSxcbiAgICAgICAgSWd4UHJlZml4RGlyZWN0aXZlLFxuICAgICAgICBEYXRlUmFuZ2VQaWNrZXJGb3JtYXRQaXBlXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hEYXRlUmFuZ2VQaWNrZXJDb21wb25lbnQgZXh0ZW5kcyBQaWNrZXJCYXNlRGlyZWN0aXZlXG4gICAgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yIHtcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzcGxheWVkIG1vbnRoIHZpZXdzLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBEZWZhdWx0IGlzIGAyYC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZGF0ZS1yYW5nZS1waWNrZXIgW2Rpc3BsYXlNb250aHNDb3VudF09XCIzXCI+PC9pZ3gtZGF0ZS1yYW5nZS1waWNrZXI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZGlzcGxheU1vbnRoc0NvdW50ID0gMjtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIGRhdGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBjdXJyZW50IG1vbnRoIHdpbGwgYmUgZGlzcGxheWVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyIFtoaWRlT3V0c2lkZURheXNdPVwidHJ1ZVwiPjwvaWd4LWRhdGUtcmFuZ2UtcGlja2VyPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIHB1YmxpYyBoaWRlT3V0c2lkZURheXM6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBBIGN1c3RvbSBmb3JtYXR0ZXIgZnVuY3Rpb24sIGFwcGxpZWQgb24gdGhlIHNlbGVjdGVkIG9yIHBhc3NlZCBpbiBkYXRlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogcHJpdmF0ZSBkYXlGb3JtYXR0ZXIgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChcImVuXCIsIHsgd2Vla2RheTogXCJsb25nXCIgfSk7XG4gICAgICogcHJpdmF0ZSBtb250aEZvcm1hdHRlciA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KFwiZW5cIiwgeyBtb250aDogXCJsb25nXCIgfSk7XG4gICAgICpcbiAgICAgKiBwdWJsaWMgZm9ybWF0dGVyKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgICAqICByZXR1cm4gYCR7dGhpcy5kYXlGb3JtYXR0ZXIuZm9ybWF0KGRhdGUpfSAtICR7dGhpcy5tb250aEZvcm1hdHRlci5mb3JtYXQoZGF0ZSl9IC0gJHtkYXRlLmdldEZ1bGxZZWFyKCl9YDtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZGF0ZS1yYW5nZS1waWNrZXIgW2Zvcm1hdHRlcl09XCJmb3JtYXR0ZXJcIj48L2lneC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBmb3JtYXR0ZXI6ICh2YWw6IERhdGVSYW5nZSkgPT4gc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHRleHQgb2YgdGhlIGNhbGVuZGFyIGRpYWxvZyAqKkRvbmUqKiBidXR0b24uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIERlZmF1bHRzIHRvIHRoZSB2YWx1ZSBmcm9tIHJlc291cmNlIHN0cmluZ3MsIGBcIkRvbmVcImAgZm9yIHRoZSBidWlsdC1pbiBFTi5cbiAgICAgKiBUaGUgYnV0dG9uIHdpbGwgb25seSBzaG93IHVwIGluIGBkaWFsb2dgIG1vZGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyIGRvbmVCdXR0b25UZXh0PVwi5a6M5LqGXCI+PC9pZ3gtZGF0ZS1yYW5nZS1waWNrZXI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGRvbmVCdXR0b25UZXh0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZG9uZUJ1dHRvblRleHQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRvbmVCdXR0b25UZXh0KCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLl9kb25lQnV0dG9uVGV4dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9kYXRlX3JhbmdlX3BpY2tlcl9kb25lX2J1dHRvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZG9uZUJ1dHRvblRleHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEN1c3RvbSBvdmVybGF5IHNldHRpbmdzIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gZGlzcGxheSB0aGUgY2FsZW5kYXIuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyIFtvdmVybGF5U2V0dGluZ3NdPVwiY3VzdG9tT3ZlcmxheVNldHRpbmdzXCI+PC9pZ3gtZGF0ZS1yYW5nZS1waWNrZXI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgb3ZlcnJpZGUgb3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3M7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZm9ybWF0IHVzZWQgd2hlbiBlZGl0YWJsZSBpbnB1dHMgYXJlIG5vdCBmb2N1c2VkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBVc2VzIEFuZ3VsYXIncyBEYXRlUGlwZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZGF0ZS1yYW5nZS1waWNrZXIgZGlzcGxheUZvcm1hdD1cIkVFL00veXlcIj48L2lneC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG92ZXJyaWRlIGRpc3BsYXlGb3JtYXQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBleHBlY3RlZCB1c2VyIGlucHV0IGZvcm1hdCBhbmQgcGxhY2Vob2xkZXIuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIERlZmF1bHQgaXMgYFwiJ01NL2RkL3l5eXknXCJgXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyIGlucHV0Rm9ybWF0PVwiZGQvTU0veXlcIj48L2lneC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBvdmVycmlkZSBpbnB1dEZvcm1hdDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1pbmltdW0gdmFsdWUgaW4gYSB2YWxpZCByYW5nZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogPGlneC1kYXRlLXJhbmdlLXBpY2tlciBbbWluVmFsdWVdPVwibWluRGF0ZVwiPjwvaWd4LWRhdGUtcmFuZ2UtcGlja2VyPlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBtaW5WYWx1ZSh2YWx1ZTogRGF0ZSB8IHN0cmluZykge1xuICAgICAgICB0aGlzLl9taW5WYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtaW5WYWx1ZSgpOiBEYXRlIHwgc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21pblZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIHZhbHVlIGluIGEgdmFsaWQgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIDxpZ3gtZGF0ZS1yYW5nZS1waWNrZXIgW21heFZhbHVlXT1cIm1heERhdGVcIj48L2lneC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgbWF4VmFsdWUodmFsdWU6IERhdGUgfCBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fbWF4VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWF4VmFsdWUoKTogRGF0ZSB8IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXhWYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBhY2Nlc3NvciB0aGF0IHNldHMgdGhlIHJlc291cmNlIHN0cmluZ3MuXG4gICAgICogQnkgZGVmYXVsdCBpdCB1c2VzIEVOIHJlc291cmNlcy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgcmVzb3VyY2VTdHJpbmdzKHZhbHVlOiBJRGF0ZVJhbmdlUGlja2VyUmVzb3VyY2VTdHJpbmdzKSB7XG4gICAgICAgIHRoaXMuX3Jlc291cmNlU3RyaW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3Jlc291cmNlU3RyaW5ncywgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIGFjY2Vzc29yIHRoYXQgcmV0dXJucyB0aGUgcmVzb3VyY2Ugc3RyaW5ncy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJlc291cmNlU3RyaW5ncygpOiBJRGF0ZVJhbmdlUGlja2VyUmVzb3VyY2VTdHJpbmdzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc291cmNlU3RyaW5ncztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgcGxhY2Vob2xkZXJgIGZvciBzaW5nbGUtaW5wdXQgYElneERhdGVSYW5nZVBpY2tlckNvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiAgIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZGF0ZS1yYW5nZS1waWNrZXIgW3BsYWNlaG9sZGVyXT1cIidDaG9vc2UgeW91ciBkYXRlcydcIj48L2lneC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBvdmVycmlkZSBwbGFjZWhvbGRlciA9ICcnO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBjb250YWluZXIgdXNlZCBmb3IgdGhlIHBvcHVwIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqICBgb3V0bGV0YCBpcyBhbiBpbnN0YW5jZSBvZiBgSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZWAgb3IgYW4gYEVsZW1lbnRSZWZgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxkaXYgaWd4T3ZlcmxheU91dGxldCAjb3V0bGV0PVwib3ZlcmxheS1vdXRsZXRcIj48L2Rpdj5cbiAgICAgKiAvLy4uXG4gICAgICogPGlneC1kYXRlLXJhbmdlLXBpY2tlciBbb3V0bGV0XT1cIm91dGxldFwiPjwvaWd4LWRhdGUtcmFuZ2UtcGlja2VyPlxuICAgICAqIC8vLi5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBvdmVycmlkZSBvdXRsZXQ6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUgfCBFbGVtZW50UmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBTaG93L2hpZGUgd2VlayBudW1iZXJzXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIERlZmF1bHQgaXMgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZGF0ZS1yYW5nZS1waWNrZXIgW3Nob3dXZWVrTnVtYmVyc109XCJ0cnVlXCI+PC9pZ3gtZGF0ZS1yYW5nZS1waWNrZXI+XG4gICAgICogYGBcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgICBwdWJsaWMgc2hvd1dlZWtOdW1iZXJzID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHBpY2tlcidzIHZhbHVlIGNoYW5nZXMuIFVzZWQgZm9yIHR3by13YXkgYmluZGluZy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZGF0ZS1yYW5nZS1waWNrZXIgWyh2YWx1ZSldPVwiZGF0ZVwiPjwvaWd4LWRhdGUtcmFuZ2UtcGlja2VyPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZVJhbmdlPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZGF0ZS1yYW5nZS1waWNrZXInKVxuICAgIHB1YmxpYyBjc3NDbGFzcyA9ICdpZ3gtZGF0ZS1yYW5nZS1waWNrZXInO1xuXG4gICAgQFZpZXdDaGlsZChJZ3hJbnB1dEdyb3VwQ29tcG9uZW50LCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAVmlld0NoaWxkKElneElucHV0RGlyZWN0aXZlKVxuICAgIHB1YmxpYyBpbnB1dERpcmVjdGl2ZTogSWd4SW5wdXREaXJlY3RpdmU7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneERhdGVSYW5nZUlucHV0c0Jhc2VDb21wb25lbnQpXG4gICAgcHVibGljIHByb2plY3RlZElucHV0czogUXVlcnlMaXN0PElneERhdGVSYW5nZUlucHV0c0Jhc2VDb21wb25lbnQ+O1xuXG4gICAgQENvbnRlbnRDaGlsZChJZ3hMYWJlbERpcmVjdGl2ZSlcbiAgICBwdWJsaWMgbGFiZWw6IElneExhYmVsRGlyZWN0aXZlO1xuXG4gICAgQENvbnRlbnRDaGlsZChJZ3hQaWNrZXJBY3Rpb25zRGlyZWN0aXZlKVxuICAgIHB1YmxpYyBwaWNrZXJBY3Rpb25zOiBJZ3hQaWNrZXJBY3Rpb25zRGlyZWN0aXZlO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hEYXRlUmFuZ2VTZXBhcmF0b3JEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgZGF0ZVNlcGFyYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBkYXRlU2VwYXJhdG9yKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLl9kYXRlU2VwYXJhdG9yID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X2RhdGVfcmFuZ2VfcGlja2VyX2RhdGVfc2VwYXJhdG9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlU2VwYXJhdG9yO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgYXBwbGllZEZvcm1hdCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gRGF0ZVRpbWVVdGlsLmdldExvY2FsZURhdGVGb3JtYXQodGhpcy5sb2NhbGUsIHRoaXMuZGlzcGxheUZvcm1hdClcbiAgICAgICAgICAgIHx8IERhdGVUaW1lVXRpbC5ERUZBVUxUX0lOUFVUX0ZPUk1BVDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IHNpbmdsZUlucHV0Rm9ybWF0KCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLnBsYWNlaG9sZGVyICE9PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGxhY2Vob2xkZXI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmb3JtYXQgPSB0aGlzLmFwcGxpZWRGb3JtYXQ7XG4gICAgICAgIHJldHVybiBgJHtmb3JtYXR9JHtTaW5nbGVJbnB1dERhdGVzQ29uY2F0ZW5hdGlvblN0cmluZ30ke2Zvcm1hdH1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgY2FsZW5kYXIgc3RhdGUuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHN0YXRlID0gdGhpcy5kYXRlUmFuZ2UuY29sbGFwc2VkO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBnZXQgY29sbGFwc2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sbGFwc2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdmFsdWUgLyByYW5nZSBmcm9tIHRoZSBjYWxlbmRhclxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUgY3VycmVudCB2YWx1ZSBpcyBvZiB0eXBlIGBEYXRlUmFuZ2VgXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBuZXdWYWx1ZTogRGF0ZVJhbmdlID0geyBzdGFydDogbmV3IERhdGUoXCIyLzIvMjAxMlwiKSwgZW5kOiBuZXcgRGF0ZShcIjMvMy8yMDEzXCIpfTtcbiAgICAgKiB0aGlzLmRhdGVSYW5nZVBpY2tlci52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmFsdWUoKTogRGF0ZVJhbmdlIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IERhdGVSYW5nZSB8IG51bGwpIHtcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayh2YWx1ZSk7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBoYXNQcm9qZWN0ZWRJbnB1dHMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2plY3RlZElucHV0cz8ubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IHNlcGFyYXRvckNsYXNzKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnaWd4LWRhdGUtcmFuZ2UtcGlja2VyX19sYWJlbCc7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldCB0b2dnbGVDb250YWluZXIoKTogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXJDb250YWluZXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgcmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLl9uZ0NvbnRyb2wgJiYgdGhpcy5fbmdDb250cm9sLmNvbnRyb2wgJiYgdGhpcy5fbmdDb250cm9sLmNvbnRyb2wudmFsaWRhdG9yKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX25nQ29udHJvbC5jb250cm9sLnZhbGlkYXRvcih7fSBhcyBBYnN0cmFjdENvbnRyb2wpO1xuICAgICAgICAgICAgcmV0dXJuIChlcnJvciAmJiBlcnJvci5yZXF1aXJlZCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgY2FsZW5kYXIoKTogSWd4Q2FsZW5kYXJDb21wb25lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgZHJvcGRvd25PdmVybGF5U2V0dGluZ3MoKTogT3ZlcmxheVNldHRpbmdzIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX2Ryb3BEb3duT3ZlcmxheVNldHRpbmdzLCB0aGlzLm92ZXJsYXlTZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgZGlhbG9nT3ZlcmxheVNldHRpbmdzKCk6IE92ZXJsYXlTZXR0aW5ncyB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9kaWFsb2dPdmVybGF5U2V0dGluZ3MsIHRoaXMub3ZlcmxheVNldHRpbmdzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZXNvdXJjZVN0cmluZ3MgPSBnZXRDdXJyZW50UmVzb3VyY2VTdHJpbmdzKERhdGVSYW5nZVBpY2tlclJlc291cmNlU3RyaW5nc0VOKTtcbiAgICBwcml2YXRlIF9kb25lQnV0dG9uVGV4dCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfZGF0ZVNlcGFyYXRvciA9IG51bGw7XG4gICAgcHJpdmF0ZSBfdmFsdWU6IERhdGVSYW5nZSB8IG51bGw7XG4gICAgcHJpdmF0ZSBfb3ZlcmxheUlkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfbmdDb250cm9sOiBOZ0NvbnRyb2w7XG4gICAgcHJpdmF0ZSBfc3RhdHVzQ2hhbmdlcyQ6IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIF9jYWxlbmRhcjogSWd4Q2FsZW5kYXJDb21wb25lbnQ7XG4gICAgcHJpdmF0ZSBfY2FsZW5kYXJDb250YWluZXI/OiBIVE1MRWxlbWVudDtcbiAgICBwcml2YXRlIF9wb3NpdGlvblNldHRpbmdzOiBQb3NpdGlvblNldHRpbmdzO1xuICAgIHByaXZhdGUgX2ZvY3VzZWRJbnB1dDogSWd4RGF0ZVJhbmdlSW5wdXRzQmFzZUNvbXBvbmVudDtcbiAgICBwcml2YXRlIF9vdmVybGF5U3ViRmlsdGVyOlxuICAgICAgICBbTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uPE92ZXJsYXlFdmVudEFyZ3M+LCBNb25vVHlwZU9wZXJhdG9yRnVuY3Rpb248T3ZlcmxheUV2ZW50QXJncyB8IE92ZXJsYXlDYW5jZWxhYmxlRXZlbnRBcmdzPl0gPSBbXG4gICAgICAgICAgICBmaWx0ZXIoeCA9PiB4LmlkID09PSB0aGlzLl9vdmVybGF5SWQpLFxuICAgICAgICAgICAgdGFrZVVudGlsKG1lcmdlKHRoaXMuX2Rlc3Ryb3kkLCB0aGlzLmNsb3NlZCkpXG4gICAgICAgIF07XG4gICAgcHJpdmF0ZSBfZGlhbG9nT3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWUsXG4gICAgICAgIG1vZGFsOiB0cnVlLFxuICAgICAgICBjbG9zZU9uRXNjYXBlOiB0cnVlXG4gICAgfTtcbiAgICBwcml2YXRlIF9kcm9wRG93bk92ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiB0cnVlLFxuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIGNsb3NlT25Fc2NhcGU6IHRydWVcbiAgICB9O1xuICAgIHByaXZhdGUgb25DaGFuZ2VDYWxsYmFjazogKGRhdGVSYW5nZTogRGF0ZVJhbmdlKSA9PiB2b2lkID0gbm9vcDtcbiAgICBwcml2YXRlIG9uVG91Y2hDYWxsYmFjazogKCkgPT4gdm9pZCA9IG5vb3A7XG4gICAgcHJpdmF0ZSBvblZhbGlkYXRvckNoYW5nZTogKCkgPT4gdm9pZCA9IG5vb3A7XG5cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50OiBFbGVtZW50UmVmLFxuICAgICAgICBASW5qZWN0KExPQ0FMRV9JRCkgX2xvY2FsZUlkOiBzdHJpbmcsXG4gICAgICAgIHByb3RlY3RlZCBwbGF0Zm9ybTogUGxhdGZvcm1VdGlsLFxuICAgICAgICBwcml2YXRlIF9pbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgX2NkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIEBJbmplY3QoSWd4T3ZlcmxheVNlcnZpY2UpIHByaXZhdGUgX292ZXJsYXlTZXJ2aWNlOiBJZ3hPdmVybGF5U2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChEaXNwbGF5RGVuc2l0eVRva2VuKSBfZGlzcGxheURlbnNpdHlPcHRpb25zPzogSURpc3BsYXlEZW5zaXR5T3B0aW9ucyxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChJR1hfSU5QVVRfR1JPVVBfVFlQRSkgX2lucHV0R3JvdXBUeXBlPzogSWd4SW5wdXRHcm91cFR5cGUpIHtcbiAgICAgICAgc3VwZXIoZWxlbWVudCwgX2xvY2FsZUlkLCBfZGlzcGxheURlbnNpdHlPcHRpb25zLCBfaW5wdXRHcm91cFR5cGUpO1xuICAgICAgICB0aGlzLmxvY2FsZSA9IHRoaXMubG9jYWxlIHx8IHRoaXMuX2xvY2FsZUlkO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgdGhpcy5wbGF0Zm9ybS5LRVlNQVAuQVJST1dfVVA6XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSB0aGlzLnBsYXRmb3JtLktFWU1BUC5BUlJPV19ET1dOOlxuICAgICAgICAgICAgICAgIGlmIChldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIGRhdGUgcmFuZ2UgcGlja2VyJ3MgZHJvcGRvd24gb3IgZGlhbG9nLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1kYXRlLXJhbmdlLXBpY2tlciAjZGF0ZVJhbmdlPjwvaWd4LWRhdGUtcmFuZ2UtcGlja2VyPlxuICAgICAqXG4gICAgICogPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWd4QnV0dG9uIChjbGljayk9XCJkYXRlUmFuZ2Uub3BlbigpXCI+T3BlbiBEaWFsb2c8L2J1dHRvblxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuKG92ZXJsYXlTZXR0aW5ncz86IE92ZXJsYXlTZXR0aW5ncyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY29sbGFwc2VkIHx8IHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5pc0Ryb3Bkb3duXG4gICAgICAgICAgICA/IHRoaXMuZHJvcGRvd25PdmVybGF5U2V0dGluZ3NcbiAgICAgICAgICAgIDogdGhpcy5kaWFsb2dPdmVybGF5U2V0dGluZ3NcbiAgICAgICAgICAgICwgb3ZlcmxheVNldHRpbmdzKTtcblxuICAgICAgICB0aGlzLl9vdmVybGF5SWQgPSB0aGlzLl9vdmVybGF5U2VydmljZVxuICAgICAgICAgICAgLmF0dGFjaChJZ3hDYWxlbmRhckNvbnRhaW5lckNvbXBvbmVudCwgdGhpcy52aWV3Q29udGFpbmVyUmVmLCBzZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlVG9PdmVybGF5RXZlbnRzKCk7XG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLnNob3codGhpcy5fb3ZlcmxheUlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGRhdGUgcmFuZ2UgcGlja2VyJ3MgZHJvcGRvd24gb3IgZGlhbG9nLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1kYXRlLXJhbmdlLXBpY2tlciAjZGF0ZVJhbmdlPjwvaWd4LWRhdGUtcmFuZ2UtcGlja2VyPlxuICAgICAqXG4gICAgICogPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWd4QnV0dG9uIChjbGljayk9XCJkYXRlUmFuZ2UuY2xvc2UoKVwiPkNsb3NlIERpYWxvZzwvYnV0dG9uPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbGxhcHNlZCkge1xuICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVNlcnZpY2UuaGlkZSh0aGlzLl9vdmVybGF5SWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgZGF0ZSByYW5nZSBwaWNrZXIncyBkcm9wZG93biBvciBkaWFsb2dcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZGF0ZS1yYW5nZS1waWNrZXIgI2RhdGVSYW5nZT48L2lneC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAgICAgKlxuICAgICAqIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlneEJ1dHRvbiAoY2xpY2spPVwiZGF0ZVJhbmdlLnRvZ2dsZSgpXCI+VG9nZ2xlIERpYWxvZzwvYnV0dG9uPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGUob3ZlcmxheVNldHRpbmdzPzogT3ZlcmxheVNldHRpbmdzKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub3BlbihvdmVybGF5U2V0dGluZ3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0cyBhIHJhbmdlIG9mIGRhdGVzLiBJZiBubyBgZW5kRGF0ZWAgaXMgcGFzc2VkLCByYW5nZSBpcyAxIGRheSAob25seSBgc3RhcnREYXRlYClcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBzZWxlY3RGaXZlRGF5UmFuZ2UoKSB7XG4gICAgICogIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICAgKiAgY29uc3QgaW5GaXZlRGF5cyA9IG5ldyBEYXRlKG5ldyBEYXRlKCkuc2V0RGF0ZSh0b2RheS5nZXREYXRlKCkgKyA1KSk7XG4gICAgICogIHRoaXMuZGF0ZVJhbmdlLnNlbGVjdCh0b2RheSwgaW5GaXZlRGF5cyk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3Qoc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlPzogRGF0ZSk6IHZvaWQge1xuICAgICAgICBlbmREYXRlID0gZW5kRGF0ZSA/PyBzdGFydERhdGU7XG4gICAgICAgIGNvbnN0IGRhdGVSYW5nZSA9IFtzdGFydERhdGUsIGVuZERhdGVdO1xuICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdGlvbihkYXRlUmFuZ2UpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBEYXRlUmFuZ2UpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVG91Y2hDYWxsYmFjayA9IGZuO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHZhbHVlOiBEYXRlUmFuZ2UgPSBjb250cm9sLnZhbHVlO1xuICAgICAgICBjb25zdCBlcnJvcnMgPSB7fTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNQcm9qZWN0ZWRJbnB1dHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydElucHV0ID0gdGhpcy5wcm9qZWN0ZWRJbnB1dHMuZmluZChpID0+IGkgaW5zdGFuY2VvZiBJZ3hEYXRlUmFuZ2VTdGFydENvbXBvbmVudCkgYXMgSWd4RGF0ZVJhbmdlU3RhcnRDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kSW5wdXQgPSB0aGlzLnByb2plY3RlZElucHV0cy5maW5kKGkgPT4gaSBpbnN0YW5jZW9mIElneERhdGVSYW5nZUVuZENvbXBvbmVudCkgYXMgSWd4RGF0ZVJhbmdlRW5kQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIGlmICghc3RhcnRJbnB1dC5kYXRlVGltZUVkaXRvci52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGVycm9ycywgeyBzdGFydFZhbHVlOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWVuZElucHV0LmRhdGVUaW1lRWRpdG9yLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3JzLCB7IGVuZFZhbHVlOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbWluID0gcGFyc2VEYXRlKHRoaXMubWluVmFsdWUpO1xuICAgICAgICAgICAgY29uc3QgbWF4ID0gcGFyc2VEYXRlKHRoaXMubWF4VmFsdWUpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBwYXJzZURhdGUodmFsdWUuc3RhcnQpO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gcGFyc2VEYXRlKHZhbHVlLmVuZCk7XG4gICAgICAgICAgICBpZiAoKG1pbiAmJiBzdGFydCAmJiBEYXRlVGltZVV0aWwubGVzc1RoYW5NaW5WYWx1ZShzdGFydCwgbWluLCBmYWxzZSkpXG4gICAgICAgICAgICAgICAgfHwgKG1pbiAmJiBlbmQgJiYgRGF0ZVRpbWVVdGlsLmxlc3NUaGFuTWluVmFsdWUoZW5kLCBtaW4sIGZhbHNlKSkpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGVycm9ycywgeyBtaW5WYWx1ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgobWF4ICYmIHN0YXJ0ICYmIERhdGVUaW1lVXRpbC5ncmVhdGVyVGhhbk1heFZhbHVlKHN0YXJ0LCBtYXgsIGZhbHNlKSlcbiAgICAgICAgICAgICAgICB8fCAobWF4ICYmIGVuZCAmJiBEYXRlVGltZVV0aWwuZ3JlYXRlclRoYW5NYXhWYWx1ZShlbmQsIG1heCwgZmFsc2UpKSkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3JzLCB7IG1heFZhbHVlOiB0cnVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGVycm9ycykubGVuZ3RoID4gMCA/IGVycm9ycyA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2U/KGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSA9IGZuO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHVibGljIG92ZXJyaWRlIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9uZ0NvbnRyb2wgPSB0aGlzLl9pbmplY3Rvci5nZXQ8TmdDb250cm9sPihOZ0NvbnRyb2wsIG51bGwpO1xuXG4gICAgICAgIHRoaXMubG9jYWxlID0gdGhpcy5sb2NhbGUgfHwgdGhpcy5fbG9jYWxlSWQ7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVUb0RhdGVFZGl0b3JFdmVudHMoKTtcbiAgICAgICAgdGhpcy5jb25maWdQb3NpdGlvblN0cmF0ZWd5KCk7XG4gICAgICAgIHRoaXMuY29uZmlnT3ZlcmxheVNldHRpbmdzKCk7XG4gICAgICAgIHRoaXMuY2FjaGVGb2N1c2VkSW5wdXQoKTtcbiAgICAgICAgdGhpcy5hdHRhY2hPblRvdWNoZWQoKTtcblxuICAgICAgICB0aGlzLnNldFJlcXVpcmVkVG9JbnB1dHMoKTtcblxuICAgICAgICBpZiAodGhpcy5fbmdDb250cm9sKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0dXNDaGFuZ2VzJCA9IHRoaXMuX25nQ29udHJvbC5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSh0aGlzLm9uU3RhdHVzQ2hhbmdlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGRlbGF5IGludm9jYXRpb25zIHVudGlsIHRoZSBjdXJyZW50IGNoYW5nZSBkZXRlY3Rpb24gY3ljbGUgaGFzIGNvbXBsZXRlZFxuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRGlzYWJsZWRTdGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsU2V0VmFsdWUoKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW5wdXRzKCk7XG4gICAgICAgICAgICAvLyBCLlAuIDA3IEp1bHkgMjAyMSAtIElneERhdGVSYW5nZVBpY2tlciBub3Qgc2hvd2luZyBpbml0aWFsIGRpc2FibGVkIHN0YXRlIHdpdGggQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoICM5Nzc2XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIGlmIGRpc2FibGVkIGlzIHBsYWNlZCBvbiB0aGUgcmFuZ2UgcGlja2VyIGVsZW1lbnQgYW5kIHRoZXJlIGFyZSBwcm9qZWN0ZWQgaW5wdXRzXG4gICAgICAgICAgICAgKiBydW4gY2hhbmdlIGRldGVjdGlvbiBzaW5jZSBpZ3hJbnB1dCB3aWxsIGluaXRpYWxseSBzZXQgdGhlIHByb2plY3RlZCBpbnB1dHMnIGRpc2FibGVkIHRvIGZhbHNlXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmICh0aGlzLmhhc1Byb2plY3RlZElucHV0cyAmJiB0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5Rm9ybWF0KCk7XG4gICAgICAgIHRoaXMudXBkYXRlSW5wdXRGb3JtYXQoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoY2hhbmdlc1snZGlzcGxheUZvcm1hdCddICYmIHRoaXMuaGFzUHJvamVjdGVkSW5wdXRzKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlGb3JtYXQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlc1snaW5wdXRGb3JtYXQnXSAmJiB0aGlzLmhhc1Byb2plY3RlZElucHV0cykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVJbnB1dEZvcm1hdCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzWydkaXNhYmxlZCddKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURpc2FibGVkU3RhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXR1c0NoYW5nZXMkKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0dXNDaGFuZ2VzJC51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9vdmVybGF5SWQpIHtcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLmRldGFjaCh0aGlzLl9vdmVybGF5SWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldEVkaXRFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnB1dERpcmVjdGl2ZS5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvblN0YXR1c0NoYW5nZWQgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlucHV0R3JvdXApIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsaWRpdHlTdGF0ZSh0aGlzLmlucHV0RGlyZWN0aXZlLCB0aGlzLmlucHV0R3JvdXAuaXNGb2N1c2VkKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhhc1Byb2plY3RlZElucHV0cykge1xuICAgICAgICAgICAgdGhpcy5wcm9qZWN0ZWRJbnB1dHNcbiAgICAgICAgICAgICAgICAuZm9yRWFjaCgoaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZhbGlkaXR5U3RhdGUoaS5pbnB1dERpcmVjdGl2ZSwgaS5pc0ZvY3VzZWQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0UmVxdWlyZWRUb0lucHV0cygpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIHNldFZhbGlkaXR5U3RhdGUoaW5wdXREaXJlY3RpdmU6IElneElucHV0RGlyZWN0aXZlLCBpc0ZvY3VzZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX25nQ29udHJvbCAmJiAhdGhpcy5fbmdDb250cm9sLmRpc2FibGVkICYmIHRoaXMuaXNUb3VjaGVkT3JEaXJ0eSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzVmFsaWRhdG9ycyAmJiBpc0ZvY3VzZWQpIHtcbiAgICAgICAgICAgICAgICBpbnB1dERpcmVjdGl2ZS52YWxpZCA9IHRoaXMuX25nQ29udHJvbC52YWxpZCA/IElneElucHV0U3RhdGUuVkFMSUQgOiBJZ3hJbnB1dFN0YXRlLklOVkFMSUQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlucHV0RGlyZWN0aXZlLnZhbGlkID0gdGhpcy5fbmdDb250cm9sLnZhbGlkID8gSWd4SW5wdXRTdGF0ZS5JTklUSUFMIDogSWd4SW5wdXRTdGF0ZS5JTlZBTElEO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5wdXREaXJlY3RpdmUudmFsaWQgPSBJZ3hJbnB1dFN0YXRlLklOSVRJQUw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBpc1RvdWNoZWRPckRpcnR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuX25nQ29udHJvbC5jb250cm9sLnRvdWNoZWQgfHwgdGhpcy5fbmdDb250cm9sLmNvbnRyb2wuZGlydHkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGhhc1ZhbGlkYXRvcnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoISF0aGlzLl9uZ0NvbnRyb2wuY29udHJvbC52YWxpZGF0b3IgfHwgISF0aGlzLl9uZ0NvbnRyb2wuY29udHJvbC5hc3luY1ZhbGlkYXRvcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVTZWxlY3Rpb24oc2VsZWN0aW9uRGF0YTogRGF0ZVtdKTogdm9pZCB7XG4gICAgICAgIGxldCBuZXdWYWx1ZSA9IHRoaXMuZXh0cmFjdFJhbmdlKHNlbGVjdGlvbkRhdGEpO1xuICAgICAgICBpZiAoIW5ld1ZhbHVlLnN0YXJ0ICYmICFuZXdWYWx1ZS5lbmQpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIGlmICh0aGlzLmlzRHJvcGRvd24gJiYgc2VsZWN0aW9uRGF0YT8ubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVDbG9zaW5nKGU6IElCYXNlQ2FuY2VsYWJsZUJyb3dzZXJFdmVudEFyZ3MpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYXJncyA9IHsgb3duZXI6IHRoaXMsIGNhbmNlbDogZT8uY2FuY2VsLCBldmVudDogZT8uZXZlbnQgfTtcbiAgICAgICAgdGhpcy5jbG9zaW5nLmVtaXQoYXJncyk7XG4gICAgICAgIGUuY2FuY2VsID0gYXJncy5jYW5jZWw7XG4gICAgICAgIGlmIChhcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNEcm9wZG93biAmJiBlPy5ldmVudCAmJiAhdGhpcy5pc0ZvY3VzZWQpIHtcbiAgICAgICAgICAgIC8vIG91dHNpZGUgY2xpY2tcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsaWRpdHlPbkJsdXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub25Ub3VjaENhbGxiYWNrKCk7XG4gICAgICAgICAgICAvLyBpbnB1dCBjbGlja1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzUHJvamVjdGVkSW5wdXRzICYmIHRoaXMuX2ZvY3VzZWRJbnB1dCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzZWRJbnB1dC5zZXRGb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXREaXJlY3RpdmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0RGlyZWN0aXZlLmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN1YnNjcmliZVRvT3ZlcmxheUV2ZW50cygpIHtcbiAgICAgICAgdGhpcy5fb3ZlcmxheVNlcnZpY2Uub3BlbmluZy5waXBlKC4uLnRoaXMuX292ZXJsYXlTdWJGaWx0ZXIpLnN1YnNjcmliZSgoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmxheUV2ZW50ID0gZSBhcyBPdmVybGF5Q2FuY2VsYWJsZUV2ZW50QXJncztcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSB7IG93bmVyOiB0aGlzLCBjYW5jZWw6IG92ZXJsYXlFdmVudD8uY2FuY2VsLCBldmVudDogZS5ldmVudCB9O1xuICAgICAgICAgICAgdGhpcy5vcGVuaW5nLmVtaXQoYXJncyk7XG4gICAgICAgICAgICBpZiAoYXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5kZXRhY2godGhpcy5fb3ZlcmxheUlkKTtcbiAgICAgICAgICAgICAgICBvdmVybGF5RXZlbnQuY2FuY2VsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxpemVDYWxlbmRhckNvbnRhaW5lcihlLmNvbXBvbmVudFJlZi5pbnN0YW5jZSk7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhckNvbnRhaW5lciA9IGUuY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLl9jb2xsYXBzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FsZW5kYXIoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fb3ZlcmxheVNlcnZpY2Uub3BlbmVkLnBpcGUoLi4udGhpcy5fb3ZlcmxheVN1YkZpbHRlcikuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXIud3JhcHBlci5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB0aGlzLm9wZW5lZC5lbWl0KHsgb3duZXI6IHRoaXMgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLmNsb3NpbmcucGlwZSguLi50aGlzLl9vdmVybGF5U3ViRmlsdGVyKS5zdWJzY3JpYmUoKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2xvc2luZyhlIGFzIE92ZXJsYXlDYW5jZWxhYmxlRXZlbnRBcmdzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fb3ZlcmxheVNlcnZpY2UuY2xvc2VkLnBpcGUoLi4udGhpcy5fb3ZlcmxheVN1YkZpbHRlcikuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLmRldGFjaCh0aGlzLl9vdmVybGF5SWQpO1xuICAgICAgICAgICAgdGhpcy5fY29sbGFwc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlJZCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhciA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhckNvbnRhaW5lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VkLmVtaXQoeyBvd25lcjogdGhpcyB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVWYWx1ZSh2YWx1ZTogRGF0ZVJhbmdlKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWUgPyB2YWx1ZSA6IG51bGw7XG4gICAgICAgIHRoaXMudXBkYXRlSW5wdXRzKCk7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FsZW5kYXIoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVZhbGlkaXR5T25CbHVyKCkge1xuICAgICAgICB0aGlzLl9mb2N1c2VkSW5wdXQgPSBudWxsO1xuICAgICAgICB0aGlzLm9uVG91Y2hDYWxsYmFjaygpO1xuICAgICAgICBpZiAodGhpcy5fbmdDb250cm9sKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNQcm9qZWN0ZWRJbnB1dHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2plY3RlZElucHV0cy5mb3JFYWNoKGkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX25nQ29udHJvbC52YWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaS51cGRhdGVJbnB1dFZhbGlkaXR5KElneElucHV0U3RhdGUuSU5WQUxJRCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpLnVwZGF0ZUlucHV0VmFsaWRpdHkoSWd4SW5wdXRTdGF0ZS5JTklUSUFMKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5pbnB1dERpcmVjdGl2ZSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbmdDb250cm9sLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXREaXJlY3RpdmUudmFsaWQgPSBJZ3hJbnB1dFN0YXRlLklOVkFMSUQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dERpcmVjdGl2ZS52YWxpZCA9IElneElucHV0U3RhdGUuSU5JVElBTDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZURpc2FibGVkU3RhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc1Byb2plY3RlZElucHV0cykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnByb2plY3RlZElucHV0cy5maW5kKGkgPT4gaSBpbnN0YW5jZW9mIElneERhdGVSYW5nZVN0YXJ0Q29tcG9uZW50KSBhcyBJZ3hEYXRlUmFuZ2VTdGFydENvbXBvbmVudDtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRoaXMucHJvamVjdGVkSW5wdXRzLmZpbmQoaSA9PiBpIGluc3RhbmNlb2YgSWd4RGF0ZVJhbmdlRW5kQ29tcG9uZW50KSBhcyBJZ3hEYXRlUmFuZ2VFbmRDb21wb25lbnQ7XG4gICAgICAgICAgICBzdGFydC5pbnB1dERpcmVjdGl2ZS5kaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQ7XG4gICAgICAgICAgICBlbmQuaW5wdXREaXJlY3RpdmUuZGlzYWJsZWQgPSB0aGlzLmRpc2FibGVkO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRSZXF1aXJlZFRvSW5wdXRzKCk6IHZvaWQge1xuICAgICAgICAvLyB3b3JrYXJvdW5kIGZvciBpZ3hJbnB1dCBzZXR0aW5nIHJlcXVpcmVkXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXNSZXF1aXJlZCA9IHRoaXMucmVxdWlyZWQ7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnB1dEdyb3VwICYmIHRoaXMuaW5wdXRHcm91cC5pc1JlcXVpcmVkICE9PSBpc1JlcXVpcmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dEdyb3VwLmlzUmVxdWlyZWQgPSBpc1JlcXVpcmVkO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhhc1Byb2plY3RlZElucHV0cyAmJiB0aGlzLl9uZ0NvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2plY3RlZElucHV0cy5mb3JFYWNoKGkgPT4gaS5pc1JlcXVpcmVkID0gaXNSZXF1aXJlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VNaW5WYWx1ZSh2YWx1ZTogc3RyaW5nIHwgRGF0ZSk6IERhdGUgfCBudWxsIHtcbiAgICAgICAgbGV0IG1pblZhbHVlOiBEYXRlID0gcGFyc2VEYXRlKHZhbHVlKTtcbiAgICAgICAgaWYgKCFtaW5WYWx1ZSAmJiB0aGlzLmhhc1Byb2plY3RlZElucHV0cykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnByb2plY3RlZElucHV0cy5maWx0ZXIoaSA9PiBpIGluc3RhbmNlb2YgSWd4RGF0ZVJhbmdlU3RhcnRDb21wb25lbnQpWzBdO1xuICAgICAgICAgICAgaWYgKHN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgbWluVmFsdWUgPSBwYXJzZURhdGUoc3RhcnQuZGF0ZVRpbWVFZGl0b3IubWluVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1pblZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VNYXhWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgRGF0ZSk6IERhdGUgfCBudWxsIHtcbiAgICAgICAgbGV0IG1heFZhbHVlOiBEYXRlID0gcGFyc2VEYXRlKHZhbHVlKTtcbiAgICAgICAgaWYgKCFtYXhWYWx1ZSAmJiB0aGlzLnByb2plY3RlZElucHV0cykge1xuICAgICAgICAgICAgY29uc3QgZW5kID0gdGhpcy5wcm9qZWN0ZWRJbnB1dHMuZmlsdGVyKGkgPT4gaSBpbnN0YW5jZW9mIElneERhdGVSYW5nZUVuZENvbXBvbmVudClbMF07XG4gICAgICAgICAgICBpZiAoZW5kKSB7XG4gICAgICAgICAgICAgICAgbWF4VmFsdWUgPSBwYXJzZURhdGUoZW5kLmRhdGVUaW1lRWRpdG9yLm1heFZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXhWYWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUNhbGVuZGFyKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY2FsZW5kYXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhbGVuZGFyLmRpc2FibGVkRGF0ZXMgPSBbXTtcbiAgICAgICAgY29uc3QgbWluVmFsdWUgPSB0aGlzLnBhcnNlTWluVmFsdWUodGhpcy5taW5WYWx1ZSk7XG4gICAgICAgIGlmIChtaW5WYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5jYWxlbmRhci5kaXNhYmxlZERhdGVzLnB1c2goeyB0eXBlOiBEYXRlUmFuZ2VUeXBlLkJlZm9yZSwgZGF0ZVJhbmdlOiBbbWluVmFsdWVdIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1heFZhbHVlID0gdGhpcy5wYXJzZU1heFZhbHVlKHRoaXMubWF4VmFsdWUpO1xuICAgICAgICBpZiAobWF4VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXIuZGlzYWJsZWREYXRlcy5wdXNoKHsgdHlwZTogRGF0ZVJhbmdlVHlwZS5BZnRlciwgZGF0ZVJhbmdlOiBbbWF4VmFsdWVdIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmFuZ2U6IERhdGVbXSA9IFtdO1xuICAgICAgICBpZiAodGhpcy52YWx1ZT8uc3RhcnQgJiYgdGhpcy52YWx1ZT8uZW5kKSB7XG4gICAgICAgICAgICBjb25zdCBfdmFsdWUgPSB0aGlzLnRvUmFuZ2VPZkRhdGVzKHRoaXMudmFsdWUpO1xuICAgICAgICAgICAgaWYgKERhdGVUaW1lVXRpbC5ncmVhdGVyVGhhbk1heFZhbHVlKF92YWx1ZS5zdGFydCwgX3ZhbHVlLmVuZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN3YXBFZGl0b3JEYXRlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVJblJhbmdlKHRoaXMudmFsdWUsIG1pblZhbHVlLCBtYXhWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByYW5nZS5wdXNoKF92YWx1ZS5zdGFydCwgX3ZhbHVlLmVuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmFuZ2UubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5jYWxlbmRhci5zZWxlY3REYXRlKHJhbmdlKTtcbiAgICAgICAgfSBlbHNlIGlmIChyYW5nZS5sZW5ndGggPT09IDAgJiYgdGhpcy5jYWxlbmRhci5tb250aFZpZXdzKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGVuZGFyLmRlc2VsZWN0RGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2FsZW5kYXIudmlld0RhdGUgPSByYW5nZVswXSB8fCBuZXcgRGF0ZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3dhcEVkaXRvckRhdGVzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5oYXNQcm9qZWN0ZWRJbnB1dHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5wcm9qZWN0ZWRJbnB1dHMuZmluZChpID0+IGkgaW5zdGFuY2VvZiBJZ3hEYXRlUmFuZ2VTdGFydENvbXBvbmVudCkgYXMgSWd4RGF0ZVJhbmdlU3RhcnRDb21wb25lbnQ7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0aGlzLnByb2plY3RlZElucHV0cy5maW5kKGkgPT4gaSBpbnN0YW5jZW9mIElneERhdGVSYW5nZUVuZENvbXBvbmVudCkgYXMgSWd4RGF0ZVJhbmdlRW5kQ29tcG9uZW50O1xuICAgICAgICAgICAgW3N0YXJ0LmRhdGVUaW1lRWRpdG9yLnZhbHVlLCBlbmQuZGF0ZVRpbWVFZGl0b3IudmFsdWVdID0gW2VuZC5kYXRlVGltZUVkaXRvci52YWx1ZSwgc3RhcnQuZGF0ZVRpbWVFZGl0b3IudmFsdWVdO1xuICAgICAgICAgICAgW3RoaXMudmFsdWUuc3RhcnQsIHRoaXMudmFsdWUuZW5kXSA9IFt0aGlzLnZhbHVlLmVuZCwgdGhpcy52YWx1ZS5zdGFydF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHZhbHVlSW5SYW5nZSh2YWx1ZTogRGF0ZVJhbmdlLCBtaW5WYWx1ZT86IERhdGUsIG1heFZhbHVlPzogRGF0ZSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBfdmFsdWUgPSB0aGlzLnRvUmFuZ2VPZkRhdGVzKHZhbHVlKTtcbiAgICAgICAgaWYgKG1pblZhbHVlICYmIERhdGVUaW1lVXRpbC5sZXNzVGhhbk1pblZhbHVlKF92YWx1ZS5zdGFydCwgbWluVmFsdWUsIGZhbHNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXhWYWx1ZSAmJiBEYXRlVGltZVV0aWwuZ3JlYXRlclRoYW5NYXhWYWx1ZShfdmFsdWUuZW5kLCBtYXhWYWx1ZSwgZmFsc2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGV4dHJhY3RSYW5nZShzZWxlY3Rpb246IERhdGVbXSk6IERhdGVSYW5nZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGFydDogc2VsZWN0aW9uWzBdIHx8IG51bGwsXG4gICAgICAgICAgICBlbmQ6IHNlbGVjdGlvbi5sZW5ndGggPiAwID8gc2VsZWN0aW9uW3NlbGVjdGlvbi5sZW5ndGggLSAxXSA6IG51bGxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvUmFuZ2VPZkRhdGVzKHJhbmdlOiBEYXRlUmFuZ2UpOiB7IHN0YXJ0OiBEYXRlOyBlbmQ6IERhdGUgfSB7XG4gICAgICAgIGxldCBzdGFydDtcbiAgICAgICAgbGV0IGVuZDtcbiAgICAgICAgaWYgKCFpc0RhdGUocmFuZ2Uuc3RhcnQpKSB7XG4gICAgICAgICAgICBzdGFydCA9IERhdGVUaW1lVXRpbC5wYXJzZUlzb0RhdGUocmFuZ2Uuc3RhcnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNEYXRlKHJhbmdlLmVuZCkpIHtcbiAgICAgICAgICAgIGVuZCA9IERhdGVUaW1lVXRpbC5wYXJzZUlzb0RhdGUocmFuZ2UuZW5kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGFydCB8fCBlbmQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiByYW5nZS5zdGFydCBhcyBEYXRlLCBlbmQ6IHJhbmdlLmVuZCBhcyBEYXRlIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdWJzY3JpYmVUb0RhdGVFZGl0b3JFdmVudHMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmhhc1Byb2plY3RlZElucHV0cykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnByb2plY3RlZElucHV0cy5maW5kKGkgPT4gaSBpbnN0YW5jZW9mIElneERhdGVSYW5nZVN0YXJ0Q29tcG9uZW50KSBhcyBJZ3hEYXRlUmFuZ2VTdGFydENvbXBvbmVudDtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRoaXMucHJvamVjdGVkSW5wdXRzLmZpbmQoaSA9PiBpIGluc3RhbmNlb2YgSWd4RGF0ZVJhbmdlRW5kQ29tcG9uZW50KSBhcyBJZ3hEYXRlUmFuZ2VFbmRDb21wb25lbnQ7XG4gICAgICAgICAgICBpZiAoc3RhcnQgJiYgZW5kKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQuZGF0ZVRpbWVFZGl0b3IudmFsdWVDaGFuZ2VcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB7IHN0YXJ0OiB2YWx1ZSwgZW5kOiB0aGlzLnZhbHVlLmVuZCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0geyBzdGFydDogdmFsdWUsIGVuZDogbnVsbCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBlbmQuZGF0ZVRpbWVFZGl0b3IudmFsdWVDaGFuZ2VcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB7IHN0YXJ0OiB0aGlzLnZhbHVlLnN0YXJ0LCBlbmQ6IHZhbHVlIGFzIERhdGUgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHsgc3RhcnQ6IG51bGwsIGVuZDogdmFsdWUgYXMgRGF0ZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXR0YWNoT25Ub3VjaGVkKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5oYXNQcm9qZWN0ZWRJbnB1dHMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvamVjdGVkSW5wdXRzLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICAgICAgZnJvbUV2ZW50KGkuZGF0ZVRpbWVFZGl0b3IubmF0aXZlRWxlbWVudCwgJ2JsdXInKVxuICAgICAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbGxhcHNlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsaWRpdHlPbkJsdXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyb21FdmVudCh0aGlzLmlucHV0RGlyZWN0aXZlLm5hdGl2ZUVsZW1lbnQsICdibHVyJylcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsaWRpdHlPbkJsdXIoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWNoZUZvY3VzZWRJbnB1dCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzUHJvamVjdGVkSW5wdXRzKSB7XG4gICAgICAgICAgICB0aGlzLnByb2plY3RlZElucHV0cy5mb3JFYWNoKGkgPT4ge1xuICAgICAgICAgICAgICAgIGZyb21FdmVudChpLmRhdGVUaW1lRWRpdG9yLm5hdGl2ZUVsZW1lbnQsICdmb2N1cycpXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fZm9jdXNlZElucHV0ID0gaSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY29uZmlnUG9zaXRpb25TdHJhdGVneSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcG9zaXRpb25TZXR0aW5ncyA9IHtcbiAgICAgICAgICAgIG9wZW5BbmltYXRpb246IGZhZGVJbixcbiAgICAgICAgICAgIGNsb3NlQW5pbWF0aW9uOiBmYWRlT3V0XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2Ryb3BEb3duT3ZlcmxheVNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kgPSBuZXcgQXV0b1Bvc2l0aW9uU3RyYXRlZ3kodGhpcy5fcG9zaXRpb25TZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuX2Ryb3BEb3duT3ZlcmxheVNldHRpbmdzLnRhcmdldCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgY29uZmlnT3ZlcmxheVNldHRpbmdzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vdmVybGF5U2V0dGluZ3MgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX2Ryb3BEb3duT3ZlcmxheVNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fZHJvcERvd25PdmVybGF5U2V0dGluZ3MsIHRoaXMub3ZlcmxheVNldHRpbmdzKTtcbiAgICAgICAgICAgIHRoaXMuX2RpYWxvZ092ZXJsYXlTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX2RpYWxvZ092ZXJsYXlTZXR0aW5ncywgdGhpcy5vdmVybGF5U2V0dGluZ3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsU2V0VmFsdWUoKSB7XG4gICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIHZhbHVlIGFuZCBubyBuZ0NvbnRyb2wgb24gdGhlIHBpY2tlciBidXQgd2UgaGF2ZSBpbnB1dHMgd2UgbWF5IGhhdmUgdmFsdWUgc2V0IHRocm91Z2hcbiAgICAgICAgLy8gdGhlaXIgbmdNb2RlbHMgLSB3ZSBzaG91bGQgZ2VuZXJhdGUgb3VyIGluaXRpYWwgY29udHJvbCB2YWx1ZVxuICAgICAgICBpZiAoKCF0aGlzLnZhbHVlIHx8ICghdGhpcy52YWx1ZS5zdGFydCAmJiAhdGhpcy52YWx1ZS5lbmQpKSAmJiB0aGlzLmhhc1Byb2plY3RlZElucHV0cyAmJiAhdGhpcy5fbmdDb250cm9sKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMucHJvamVjdGVkSW5wdXRzLmZpbmQoaSA9PiBpIGluc3RhbmNlb2YgSWd4RGF0ZVJhbmdlU3RhcnRDb21wb25lbnQpO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gdGhpcy5wcm9qZWN0ZWRJbnB1dHMuZmluZChpID0+IGkgaW5zdGFuY2VvZiBJZ3hEYXRlUmFuZ2VFbmRDb21wb25lbnQpO1xuICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LmRhdGVUaW1lRWRpdG9yLnZhbHVlIGFzIERhdGUsXG4gICAgICAgICAgICAgICAgZW5kOiBlbmQuZGF0ZVRpbWVFZGl0b3IudmFsdWUgYXMgRGF0ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlSW5wdXRzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMucHJvamVjdGVkSW5wdXRzPy5maW5kKGkgPT4gaSBpbnN0YW5jZW9mIElneERhdGVSYW5nZVN0YXJ0Q29tcG9uZW50KSBhcyBJZ3hEYXRlUmFuZ2VTdGFydENvbXBvbmVudDtcbiAgICAgICAgY29uc3QgZW5kID0gdGhpcy5wcm9qZWN0ZWRJbnB1dHM/LmZpbmQoaSA9PiBpIGluc3RhbmNlb2YgSWd4RGF0ZVJhbmdlRW5kQ29tcG9uZW50KSBhcyBJZ3hEYXRlUmFuZ2VFbmRDb21wb25lbnQ7XG4gICAgICAgIGlmIChzdGFydCAmJiBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IF92YWx1ZSA9IHRoaXMudmFsdWUgPyB0aGlzLnRvUmFuZ2VPZkRhdGVzKHRoaXMudmFsdWUpIDogbnVsbDtcbiAgICAgICAgICAgIHN0YXJ0LnVwZGF0ZUlucHV0VmFsdWUoX3ZhbHVlPy5zdGFydCB8fCBudWxsKTtcbiAgICAgICAgICAgIGVuZC51cGRhdGVJbnB1dFZhbHVlKF92YWx1ZT8uZW5kIHx8IG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVEaXNwbGF5Rm9ybWF0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnByb2plY3RlZElucHV0cy5mb3JFYWNoKGkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBpIGFzIElneERhdGVSYW5nZUlucHV0c0Jhc2VDb21wb25lbnQ7XG4gICAgICAgICAgICBpbnB1dC5kYXRlVGltZUVkaXRvci5kaXNwbGF5Rm9ybWF0ID0gdGhpcy5kaXNwbGF5Rm9ybWF0O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUlucHV0Rm9ybWF0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnByb2plY3RlZElucHV0cy5mb3JFYWNoKGkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBpIGFzIElneERhdGVSYW5nZUlucHV0c0Jhc2VDb21wb25lbnQ7XG4gICAgICAgICAgICBpZiAoaW5wdXQuZGF0ZVRpbWVFZGl0b3IuaW5wdXRGb3JtYXQgIT09IHRoaXMuaW5wdXRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICBpbnB1dC5kYXRlVGltZUVkaXRvci5pbnB1dEZvcm1hdCA9IHRoaXMuaW5wdXRGb3JtYXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2luaXRpYWxpemVDYWxlbmRhckNvbnRhaW5lcihjb21wb25lbnRJbnN0YW5jZTogSWd4Q2FsZW5kYXJDb250YWluZXJDb21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5fY2FsZW5kYXIgPSBjb21wb25lbnRJbnN0YW5jZS5jYWxlbmRhcjtcbiAgICAgICAgdGhpcy5jYWxlbmRhci5oYXNIZWFkZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYWxlbmRhci5sb2NhbGUgPSB0aGlzLmxvY2FsZTtcbiAgICAgICAgdGhpcy5jYWxlbmRhci5zZWxlY3Rpb24gPSBDYWxlbmRhclNlbGVjdGlvbi5SQU5HRTtcbiAgICAgICAgdGhpcy5jYWxlbmRhci53ZWVrU3RhcnQgPSB0aGlzLndlZWtTdGFydDtcbiAgICAgICAgdGhpcy5jYWxlbmRhci5oaWRlT3V0c2lkZURheXMgPSB0aGlzLmhpZGVPdXRzaWRlRGF5cztcbiAgICAgICAgdGhpcy5jYWxlbmRhci5tb250aHNWaWV3TnVtYmVyID0gdGhpcy5kaXNwbGF5TW9udGhzQ291bnQ7XG4gICAgICAgIHRoaXMuY2FsZW5kYXIuc2hvd1dlZWtOdW1iZXJzID0gdGhpcy5zaG93V2Vla051bWJlcnM7XG4gICAgICAgIHRoaXMuY2FsZW5kYXIuc2VsZWN0ZWQucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKGV2OiBEYXRlW10pID0+IHRoaXMuaGFuZGxlU2VsZWN0aW9uKGV2KSk7XG5cbiAgICAgICAgY29tcG9uZW50SW5zdGFuY2UubW9kZSA9IHRoaXMubW9kZTtcbiAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuY2xvc2VCdXR0b25MYWJlbCA9ICF0aGlzLmlzRHJvcGRvd24gPyB0aGlzLmRvbmVCdXR0b25UZXh0IDogbnVsbDtcbiAgICAgICAgY29tcG9uZW50SW5zdGFuY2UucGlja2VyQWN0aW9ucyA9IHRoaXMucGlja2VyQWN0aW9ucztcbiAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuY2FsZW5kYXJDbG9zZS5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNsb3NlKCkpO1xuICAgIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoYXNQcm9qZWN0ZWRJbnB1dHMgPyBzdGFydEVuZFRlbXBsYXRlIDogZGVmVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNzaW5nbGVUZW1wbGF0ZT5cbiAgICA8ZGl2IChjbGljayk9XCJvcGVuKClcIiBjbGFzcz1cImNvbnRlbnQtd3JhcFwiPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJpZ3gtZGF0ZS1zaW5nbGVcIj48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3N0YXJ0RW5kVGVtcGxhdGU+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiaWd4LWRhdGUtcmFuZ2Utc3RhcnRcIj48L25nLWNvbnRlbnQ+XG4gICAgPGRpdiBbY2xhc3NOYW1lXT1cInNlcGFyYXRvckNsYXNzXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkYXRlU2VwYXJhdG9yVGVtcGxhdGUgfHwgZGVmRGF0ZVNlcGFyYXRvclRlbXBsYXRlO1wiPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJpZ3gtZGF0ZS1yYW5nZS1lbmRcIj48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZkljb24+XG4gICAgPGlneC1pY29uPlxuICAgICAgICBkYXRlX3JhbmdlXG4gICAgPC9pZ3gtaWNvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmRGF0ZVNlcGFyYXRvclRlbXBsYXRlPnt7IGRhdGVTZXBhcmF0b3IgfX08L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZlRlbXBsYXRlPlxuICAgIDxpZ3gtaW5wdXQtZ3JvdXAgW3R5cGVdPVwidHlwZVwiIFtkaXNwbGF5RGVuc2l0eV09XCJkaXNwbGF5RGVuc2l0eVwiIChjbGljayk9XCJvcGVuKClcIj5cbiAgICAgICAgPCEtLSBvbmx5IHNldCBtYXNrIHBsYWNlaG9sZGVyIHdoZW4gZW1wdHksIG90aGVyd2lzZSBpbnB1dCBncm91cCBtaWdodCB1c2UgaXQgYXMgbGFiZWwgaWYgbm9uZSBpcyBzZXQgLS0+XG4gICAgICAgIDxpbnB1dCAjc2luZ2xlSW5wdXQgaWd4SW5wdXQgdHlwZT1cInRleHRcIiByZWFkb25seSBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbcGxhY2Vob2xkZXJdPVwidmFsdWUgPyAnJyA6IHNpbmdsZUlucHV0Rm9ybWF0XCJcbiAgICAgICAgICAgIHJvbGU9XCJjb21ib2JveFwiIGFyaWEtaGFzcG9wdXA9XCJncmlkXCIgW2F0dHIuYXJpYS1leHBhbmRlZF09XCIhY29sbGFwc2VkXCIgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImxhYmVsPy5pZFwiXG4gICAgICAgICAgICBbdmFsdWVdPVwidmFsdWUgfCBkYXRlUmFuZ2U6IGFwcGxpZWRGb3JtYXQgOiBsb2NhbGUgOiBmb3JtYXR0ZXJcIiAvPlxuXG4gICAgICAgIDxpZ3gtcHJlZml4ICpuZ0lmPVwiIXRvZ2dsZUNvbXBvbmVudHMubGVuZ3RoXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZGVmSWNvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2lneC1wcmVmaXg+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBuZ1Byb2plY3RBcz1cIltpZ3hMYWJlbF1cIj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltpZ3hMYWJlbF1cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyIG5nUHJvamVjdEFzPVwiaWd4LXByZWZpeFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiaWd4LXByZWZpeCxbaWd4UHJlZml4XVwiPjwvbmctY29udGVudD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgbmdQcm9qZWN0QXM9XCJpZ3gtc3VmZml4XCI+XG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJpZ3gtc3VmZml4LFtpZ3hTdWZmaXhdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBuZ1Byb2plY3RBcz1cImlneC1oaW50XCI+XG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJpZ3gtaGludCxbaWd4SGludF1cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvaWd4LWlucHV0LWdyb3VwPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==