footprintjs 10.2.1 → 10.3.0

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 (49) hide show
  1. package/dist/esm/index.d.ts +1 -0
  2. package/dist/esm/index.js +1 -1
  3. package/dist/esm/lib/capture/nativeCoverage.d.ts +56 -0
  4. package/dist/esm/lib/capture/nativeCoverage.js +102 -0
  5. package/dist/esm/lib/memory/StageContext.d.ts +5 -0
  6. package/dist/esm/lib/memory/StageContext.js +27 -6
  7. package/dist/esm/lib/memory/attention.d.ts +2 -0
  8. package/dist/esm/lib/memory/attention.js +12 -5
  9. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +12 -1
  10. package/dist/esm/lib/recorder/ControlDepRecorder.js +23 -1
  11. package/dist/esm/lib/recorder/snapshot.d.ts +1 -1
  12. package/dist/esm/lib/recorder/snapshot.js +7 -2
  13. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +9 -0
  14. package/dist/esm/lib/runner/ExecutionRuntime.js +13 -1
  15. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +2 -0
  16. package/dist/esm/lib/runner/FlowChartExecutor.js +31 -2
  17. package/dist/esm/lib/runner/attach.js +4 -2
  18. package/dist/esm/lib/runner/options.d.ts +3 -0
  19. package/dist/esm/lib/runner/options.js +5 -1
  20. package/dist/esm/lib/runner/snapshot.d.ts +3 -1
  21. package/dist/esm/lib/runner/snapshot.js +35 -4
  22. package/dist/esm/lib/scope/ScopeFacade.js +4 -2
  23. package/dist/esm/lib/scope/runtime.d.ts +2 -0
  24. package/dist/esm/lib/scope/runtime.js +9 -1
  25. package/dist/index.js +1 -1
  26. package/dist/lib/capture/nativeCoverage.js +107 -0
  27. package/dist/lib/memory/StageContext.js +27 -6
  28. package/dist/lib/memory/attention.js +12 -5
  29. package/dist/lib/recorder/ControlDepRecorder.js +23 -1
  30. package/dist/lib/recorder/snapshot.js +7 -2
  31. package/dist/lib/runner/ExecutionRuntime.js +13 -1
  32. package/dist/lib/runner/FlowChartExecutor.js +34 -5
  33. package/dist/lib/runner/attach.js +3 -1
  34. package/dist/lib/runner/options.js +5 -1
  35. package/dist/lib/runner/snapshot.js +35 -4
  36. package/dist/lib/scope/ScopeFacade.js +3 -1
  37. package/dist/lib/scope/runtime.js +12 -2
  38. package/dist/types/index.d.ts +1 -0
  39. package/dist/types/lib/capture/nativeCoverage.d.ts +56 -0
  40. package/dist/types/lib/memory/StageContext.d.ts +5 -0
  41. package/dist/types/lib/memory/attention.d.ts +2 -0
  42. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +12 -1
  43. package/dist/types/lib/recorder/snapshot.d.ts +1 -1
  44. package/dist/types/lib/runner/ExecutionRuntime.d.ts +9 -0
  45. package/dist/types/lib/runner/FlowChartExecutor.d.ts +2 -0
  46. package/dist/types/lib/runner/options.d.ts +3 -0
  47. package/dist/types/lib/runner/snapshot.d.ts +3 -1
  48. package/dist/types/lib/scope/runtime.d.ts +2 -0
  49. package/package.json +1 -1
@@ -28,7 +28,7 @@ import { deadFrameMessage, lateAttemptMessage } from '../memory/borrowedMutation
28
28
  import { CLEAR, RedactionRule } from '../memory/redaction.js';
29
29
  import { fire, recorderFailureEvent } from '../recorder/hooks.js';
30
30
  import { assertNotReadonly, createFrozenArgs } from './protection/readonlyInput.js';
31
- import { registerScopeRuntime } from './runtime.js';
31
+ import { registerNativeCaptureTarget, registerScopeRuntime } from './runtime.js';
32
32
  export class ScopeFacade {
33
33
  static BRAND = Symbol.for('ScopeFacade@v1');
34
34
  /**
@@ -119,6 +119,8 @@ export class ScopeFacade {
119
119
  this._onCommitFired(mutations);
120
120
  });
121
121
  registerScopeRuntime(this, { target: this, handlesAssignments: false });
122
+ if (context.capture)
123
+ registerNativeCaptureTarget(this, context);
122
124
  }
123
125
  /**
124
126
  * The redaction rule this facade decides with — the SAME object its
@@ -921,4 +923,4 @@ function detachKey(child) {
921
923
  const id = child?.root?.id;
922
924
  return typeof id === 'string' ? `detach:${id}` : 'detach';
923
925
  }
924
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NvcGVGYWNhZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Njb3BlL1Njb3BlRmFjYWRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRyxPQUFPLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQVdyRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RCxPQUFPLEVBQ0wsZUFBZSxJQUFJLG9CQUFvQixFQUN2QyxrQkFBa0IsSUFBSSx1QkFBdUIsR0FDOUMsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHOUQsT0FBTyxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxpQkFBaUIs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Q0FBQyxXQUFXLENBQ2QsU0FBUyxFQUNULG9CQUFvQixDQUNsQjtZQUNFLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMxQixPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPO1lBQ25DLGNBQWMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWM7WUFDakQsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSztTQUNyQyxFQUNELEtBQUssRUFDTCxJQUFJLENBQ0wsQ0FDRixDQUFDO0lBQ0osQ0FBQyxDQUFDOztBQUdKLHVHQUF1RztBQUN2RyxNQUFNLGFBQWEsR0FBZ0IsSUFBSSxlQUFlLEVBQUUsQ0FBQyxNQUFNLENBQUM7QUFFaEUscUdBQXFHO0FBQ3JHLFNBQVMsU0FBUyxDQUFDLEtBQWdCO0lBQ2pDLE1BQU0sRUFBRSxHQUFJLEtBQWlELEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztJQUN4RSxPQUFPLE9BQU8sRUFBRSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0FBQzVELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNjb3BlRmFjYWRlIOKAlCBCYXNlIGNsYXNzIHRoYXQgbGlicmFyeSBjb25zdW1lcnMgZXh0ZW5kIHRvIGNyZWF0ZSBjdXN0b20gc2NvcGUgY2xhc3Nlc1xuICpcbiAqIFdyYXBzIFN0YWdlQ29udGV4dCAoZnJvbSBtZW1vcnkvKSB0byBwcm92aWRlIGEgY29uc3VtZXItZnJpZW5kbHkgQVBJIGZvclxuICogc3RhdGUgYWNjZXNzLCBkZWJ1ZyBsb2dnaW5nLCBtZXRyaWNzLCBhbmQgcmVjb3JkZXIgaG9va3MuXG4gKlxuICogQ29uc3VtZXJzIGV4dGVuZCB0aGlzIGNsYXNzIHRvIGFkZCBkb21haW4tc3BlY2lmaWMgcHJvcGVydGllczpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBNeVNjb3BlIGV4dGVuZHMgU2NvcGVGYWNhZGUge1xuICogICBnZXQgdXNlck5hbWUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoJ25hbWUnKSBhcyBzdHJpbmc7IH1cbiAqICAgc2V0IHVzZXJOYW1lKHZhbHVlOiBzdHJpbmcpIHsgdGhpcy5zZXRWYWx1ZSgnbmFtZScsIHZhbHVlKTsgfVxuICogfVxuICogYGBgXG4gKi9cblxuaW1wb3J0IHsgc3ViZmxvd1NlZ21lbnRzT2YgfSBmcm9tICdmb290dHJhY2UnO1xuXG5pbXBvcnQgeyBjYWxsU2VyaWVzLCBydW5DYWxsIH0gZnJvbSAnLi4vYXR0ZW1wdC9jYWxsLmpzJztcbmltcG9ydCB7IGNhbGxUb3VjaGVzIH0gZnJvbSAnLi4vYXR0ZW1wdC9lZmZlY3QuanMnO1xuaW1wb3J0IHsgYWRtaXRBdHRlbXB0TmFtZSB9IGZyb20gJy4uL2F0dGVtcHQvbmFtZS5qcyc7XG5pbXBvcnQgeyBvYnNlcnZlZFJlY29yZCwgT2JzZXJ2ZWRTZXJpZXNCb29rLCByZWFkT2JzZXJ2ZWRSZXBvcnQgfSBmcm9tICcuLi9hdHRlbXB0L29ic2VydmVkLmpzJztcbmltcG9ydCB7IGFkbWl0Q2FsbFBvbGljeSwgYXR0ZW1wdENlaWxpbmcgfSBmcm9tICcuLi9hdHRlbXB0L3BvbGljeS5qcyc7XG5pbXBvcnQgeyB0YWtlUmV0cnlMb29wQ2FsbCB9IGZyb20gJy4uL2F0dGVtcHQvcmV0cnlMb29wQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBhdHRlbXB0RW5kc0F0IH0gZnJvbSAnLi4vYXR0ZW1wdC9ydW5uZXIuanMnO1xuaW1wb3J0IHR5cGUge1xuICBBdHRlbXB0Q29udGV4dCxcbiAgQXR0ZW1wdEVycm9yLFxuICBDYWxsT3B0aW9ucyxcbiAgTGF0ZVdyaXRlLFxuICBPYnNlcnZlZEF0dGVtcHQsXG4gIFJldHJ5UG9saWN5LFxuICBSdW5Db3JyZWxhdGlvbixcbn0gZnJvbSAnLi4vYXR0ZW1wdC90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3dDaGFydCB9IGZyb20gJy4uL2J1aWxkZXIvdHlwZXMuanMnO1xuaW1wb3J0IHsgaGFzQ2lyY3VsYXJSZWZlcmVuY2UgfSBmcm9tICcuLi9jYXB0dXJlL2NpcmN1bGFyLmpzJztcbmltcG9ydCB7XG4gIGRldGFjaEFuZEZvcmdldCBhcyBkZXRhY2hBbmRGb3JnZXRTcGF3bixcbiAgZGV0YWNoQW5kSm9pbkxhdGVyIGFzIGRldGFjaEFuZEpvaW5MYXRlclNwYXduLFxufSBmcm9tICcuLi9kZXRhY2gvc3Bhd24uanMnO1xuaW1wb3J0IHR5cGUgeyBEZXRhY2hEcml2ZXIsIERldGFjaEhhbmRsZSB9IGZyb20gJy4uL2RldGFjaC90eXBlcy5qcyc7XG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9kZXZNb2RlLmpzJztcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uRW52IH0gZnJvbSAnLi4vZW5naW5lL3R5cGVzLmpzJztcbmltcG9ydCB7IGRlYWRGcmFtZU1lc3NhZ2UsIGxhdGVBdHRlbXB0TWVzc2FnZSB9IGZyb20gJy4uL21lbW9yeS9ib3Jyb3dlZE11dGF0aW9uLmpzJztcbmltcG9ydCB7IENMRUFSLCBSZWRhY3Rpb25SdWxlIH0gZnJvbSAnLi4vbWVtb3J5L3JlZGFjdGlvbi5qcyc7XG5pbXBvcnQgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHsgSG9va0ZhaWx1cmUsIEhvb2tQYXlsb2FkLCBTY29wZUhvb2tOYW1lIH0gZnJvbSAnLi4vcmVjb3JkZXIvaG9va3MuanMnO1xuaW1wb3J0IHsgZmlyZSwgcmVjb3JkZXJGYWlsdXJlRXZlbnQgfSBmcm9tICcuLi9yZWNvcmRlci9ob29rcy5qcyc7XG5pbXBvcnQgeyBhc3NlcnROb3RSZWFkb25seSwgY3JlYXRlRnJvemVuQXJncyB9IGZyb20gJy4vcHJvdGVjdGlvbi9yZWFkb25seUlucHV0LmpzJztcbmltcG9ydCB7IHJlZ2lzdGVyU2NvcGVSdW50aW1lIH0gZnJvbSAnLi9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0RXZlbnQsIFJlZGFjdGlvblBvbGljeSwgUmVkYWN0aW9uUmVwb3J0LCBTY29wZVJlY29yZGVyIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBTY29wZUZhY2FkZSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQlJBTkQgPSBTeW1ib2wuZm9yKCdTY29wZUZhY2FkZUB2MScpO1xuXG4gIC8qKlxuICAgKiBTaGFyZWQgc2VudGluZWwgcmV0dXJuZWQgYnkgYF9nZXRTdWJmbG93UGF0aCgpYCBmb3Igcm9vdC1sZXZlbCBzdGFnZXNcbiAgICogKG5vIHN1YmZsb3cgbmVzdGluZykuIEF2b2lkcyBwZXItY2FsbCBhbGxvY2F0aW9uIG9mIGEgZnJlc2hcbiAgICogYE9iamVjdC5mcmVlemUoW10pYCBvbiBldmVyeSBgZW1pdEV2ZW50YCBpbiB0aGUgY29tbW9uIG5vLXN1YmZsb3cgY2FzZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IF9FTVBUWV9TVUJGTE9XX1BBVEg6IHJlYWRvbmx5IHN0cmluZ1tdID0gT2JqZWN0LmZyZWV6ZShbXSk7XG5cbiAgcHJvdGVjdGVkIF9zdGFnZUNvbnRleHQ6IFN0YWdlQ29udGV4dDtcbiAgcHJvdGVjdGVkIF9zdGFnZU5hbWU6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9yZWFkT25seVZhbHVlcz86IHVua25vd247XG5cbiAgLyoqIENhY2hlZCBkZWVwbHktZnJvemVuIGNvcHkgb2YgcmVhZE9ubHlWYWx1ZXMgZm9yIGdldEFyZ3MoKS4gQ3JlYXRlZCBvbmNlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9mcm96ZW5BcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvKiogRXhlY3V0aW9uIGVudmlyb25tZW50IOKAlCByZWFkLW9ubHksIGluaGVyaXRlZCBmcm9tIHBhcmVudCBleGVjdXRvci4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZXhlY3V0aW9uRW52OiBSZWFkb25seTxFeGVjdXRpb25FbnY+O1xuXG4gIC8qKiBSRkMtMDAzIEQyOiB0cnVlIHdoZW4gYGdldEFyZ3MoKWAgY2FuIHJldHVybiBhY3R1YWwgZGF0YSDigJQgYW4gZW1wdHlcbiAgICogIGB7fWAgcmVhZCBjYXJyaWVzIG5vIGluZm9ybWF0aW9uLCBzbyBpdCBpcyBuZXZlciBmbGFnZ2VkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9oYXNBcmdzOiBib29sZWFuO1xuXG4gIC8qKiBSRkMtMDAzIEQyOiB0cnVlIHdoZW4gYGdldEVudigpYCBjYW4gcmV0dXJuIGFjdHVhbCBkYXRhLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9oYXNFbnY6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFJGQy0wMDMgRDI6IGtleXMgdGhpcyBzdGFnZSBoYXMgVFJBQ0tFRC1yZWFkICh2aWEgYGdldFZhbHVlKGtleSlgKS5cbiAgICogQSBzaWxlbnQgcmVhZCBvZiBhIGtleSBpbiB0aGlzIHNldCBpcyBTSEFET1dFRCDigJQgaXRzIHJlYWTihpJ3cml0ZSBlZGdlIGlzXG4gICAqIGFscmVhZHkgY2FwdHVyZWQsIHNvIGl0IGlzIG5vdCBmbGFnZ2VkIGFzIGFuIHVudHJhY2tlZCBzb3VyY2UuIFRoaXMgaXNcbiAgICogd2hhdCBrZWVwcyBUeXBlZFNjb3BlIGFycmF5LXByb3h5IGludGVybmFscyAod2hpY2ggYWx3YXlzIGZvbGxvdyBhXG4gICAqIHRyYWNrZWQgcHJvcGVydHkgcmVhZCkgYW5kIGAkYmF0Y2hBcnJheWAgaG9uZXN0LWJ1dC1xdWlldC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3RyYWNrZWRSZWFkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgX3JlY29yZGVyczogU2NvcGVSZWNvcmRlcltdID0gW107XG5cbiAgLyoqXG4gICAqIFNldCBieSB0aGUgY29tbWl0IG9ic2VydmVyOiB0aGlzIHN0YWdlJ3MgZnJhbWUgaGFzIGZsdXNoZWQuIEEgZmFjYWRlIGlzXG4gICAqIE9ORSBzdGFnZSBleGVjdXRpb24ncyBoYW5kbGUg4oCUIHRoZSBlbmdpbmUgYnVpbGRzIGEgZnJlc2ggb25lIHBlciBzdGFnZSDigJRcbiAgICogYW5kIGV2ZXJ5IHByb3h5IHRoZSB0eXBlZCBzY29wZSBoYW5kcyBvdXQgaXMgYm91bmQgdG8gaXQuIEEgd3JpdGUgYXJyaXZpbmdcbiAgICogYWZ0ZXIgdGhlIGNvbW1pdCBjb21lcyBmcm9tIGEgaGFuZGxlIGhlbGQgcGFzdCBpdHMgc3RhZ2UgKGEgY2xvc3VyZSwgYVxuICAgKiBtb2R1bGUtbGV2ZWwgYGxldGApIGFuZCB3b3VsZCBsYW5kIGluIGEgYnVmZmVyIG5vdGhpbmcgZXZlciBjb21taXRzOiBub1xuICAgKiB0cmFjZSByb3csIHN0YXRlIHVuY2hhbmdlZC4gU28gaXQgaXMgcmVmdXNlZCAoe0BsaW5rIGFzc2VydExpdmV9KSBpbnN0ZWFkXG4gICAqIG9mIGxvc3QuIFNlYWxpbmcgaGVyZSBhbmQgbm90IG9uIGBTdGFnZUNvbnRleHRgIGlzIGRlbGliZXJhdGU6IHRoZSBmcmFtZVxuICAgKiBzdGF5cyByZS11c2FibGUgYWZ0ZXIgY29tbWl0IGJ5IGRlc2lnbiAoIzEzYiDigJQgdGhlIGVuZ2luZSdzIGRvdWJsZS1jb21taXRcbiAgICogcGF0aHMgYW5kIHRoZSBzdWJmbG93IG1lcmdlLWJhY2sgaW50byBhIGJyYW5jaCBwYXJlbnQgbmVlZCBpdCkuXG4gICAqL1xuICBwcml2YXRlIF9jb21taXR0ZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogQSBydWxlIG9mIHRoaXMgZmFjYWRlJ3Mgb3duIOKAlCBPTkxZIHdoZW4gaXRzIGNvbnRleHQgY2FycmllcyBub25lIChiYXJlXG4gICAqIGNvbnRleHRzIGluIHVuaXQgdGVzdHMpLiBVbmRlciBhbiBleGVjdXRvciB0aGUgcnVsZSBsaXZlcyBvbiB0aGUgY29udGV4dFxuICAgKiB0cmVlIGFuZCB0aGlzIHN0YXlzIHVuc2V0OyBzZWUge0BsaW5rIHJ1bGV9LlxuICAgKi9cbiAgcHJpdmF0ZSBfbG9jYWxSdWxlPzogUmVkYWN0aW9uUnVsZTtcblxuICAvKipcbiAgICogVGhlIHJ1bidzIGNvcnJlbGF0aW9uICgxMC4xKSwgaW5zdGFsbGVkIGJ5IHRoZSBleGVjdXRvcidzIGNvbXBvc2VkIHNjb3BlIGZhY3RvcnlcbiAgICogKGBSdW5PYnNlcnZlcnMgwrcgY29tcG9zZVNjb3BlRmFjdG9yeWApIOKAlCBzdGFtcGVkIExBU1Qgb24gZXZlcnkgc2NvcGUgYW5kIGVtaXQgZXZlbnQgdGhpcyBmYWNhZGUgZmlyZXMsXG4gICAqIG9ubHkgd2hlbiBwcmVzZW50LCBzbyBhIHJ1biB3aXRob3V0IG9uZSBmaXJlcyBieXRlLWlkZW50aWNhbCBldmVudHMuXG4gICAqL1xuICBwcml2YXRlIF9jb3JyZWxhdGlvbj86IFJ1bkNvcnJlbGF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgYXR0ZW1wdCB0aGlzIGZhY2FkZSB3YXMgYnVpbHQgZm9yIChQMWIpIOKAlCB0aGUgcnVubmVyJ3MsIHJlYWQgb2ZmIHRoZVxuICAgKiBjb250ZXh0IGF0IGNvbnN0cnVjdGlvbi4gQSBmYWNhZGUgaXMgT05FIGF0dGVtcHQncyBoYW5kbGU6IG9uY2UgdGhhdFxuICAgKiBhdHRlbXB0IGVuZHMgd2l0aG91dCBhbiBhbnN3ZXIgKGl0cyBjYXAsIHRoZSBkZWFkbGluZSwgYSBjYW5jZWxsYXRpb24sIGFcbiAgICogdGhyb3cpLCB0aGUgZnVuY3Rpb24gYmVoaW5kIGl0IG1heSBzdGlsbCBiZSBydW5uaW5nLCBhbmQgYW55dGhpbmcgaXRcbiAgICogdG91Y2hlcyB0aHJvdWdoIHRoaXMgZmFjYWRlIGlzIHJlZnVzZWQgKHtAbGluayByZWZ1c2VJZkF0dGVtcHRFbmRlZH0pIOKAlFxuICAgKiBhIHdyaXRlIG9yIGFuIGVtaXQgaXMgYWxzbyByZWNvcmRlZCBvbiB0aGUgc3RhZ2UuIEFic2VudCBmb3IgYSBzdGFnZSB0aGVcbiAgICogcnVubmVyIGRvZXMgbm90IHJ1bjogbm90aGluZyBpcyBmZW5jZWQsIGFzIGJlZm9yZS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2F0dGVtcHQ/OiBBdHRlbXB0Q29udGV4dDtcblxuICAvKiogVGhlIHJ1bidzIHNpZ25hbCwgZm9yIGAkYXR0ZW1wdCgpYCBvZiBhIHN0YWdlIHRoZSBydW5uZXIgZG9lcyBub3QgcnVuLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9ydW5TaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKiogYCRjYWxsYHMgd2l0aCBgb2YgPiAxYCBpbiBmbGlnaHQgdGhyb3VnaCB0aGlzIGZhY2FkZSDigJQgYSBrZXlsZXNzIHRvdWNoaW5nIGNhbGwgaW5zaWRlIG9uZSBpcyByZWZ1c2VkIChQMykuICovXG4gIHByaXZhdGUgX3JldHJ5aW5nQ2FsbHMgPSAwO1xuXG4gIC8qKiBUaGlzIGF0dGVtcHQncyBvYnNlcnZlZCByZXBvcnRzLCBncm91cGVkIGludG8gc2VyaWVzIChQMikg4oCUIG1hZGUgb24gdGhlIGZpcnN0IHJlcG9ydC4gKi9cbiAgcHJpdmF0ZSBfb2JzZXJ2ZWRCb29rPzogT2JzZXJ2ZWRTZXJpZXNCb29rO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQ6IFN0YWdlQ29udGV4dCwgc3RhZ2VOYW1lOiBzdHJpbmcsIHJlYWRPbmx5VmFsdWVzPzogdW5rbm93biwgZXhlY3V0aW9uRW52PzogRXhlY3V0aW9uRW52KSB7XG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0ID0gY29udGV4dDtcbiAgICB0aGlzLl9zdGFnZU5hbWUgPSBzdGFnZU5hbWU7XG4gICAgdGhpcy5fcmVhZE9ubHlWYWx1ZXMgPSByZWFkT25seVZhbHVlcztcbiAgICB0aGlzLl9mcm96ZW5BcmdzID0gY3JlYXRlRnJvemVuQXJncyhyZWFkT25seVZhbHVlcyk7XG4gICAgdGhpcy5fZXhlY3V0aW9uRW52ID0gT2JqZWN0LmZyZWV6ZSh7IC4uLmV4ZWN1dGlvbkVudiB9KTtcbiAgICB0aGlzLl9oYXNBcmdzID0gT2JqZWN0LmtleXModGhpcy5fZnJvemVuQXJncykubGVuZ3RoID4gMDtcbiAgICB0aGlzLl9oYXNFbnYgPSBPYmplY3Qua2V5cyh0aGlzLl9leGVjdXRpb25FbnYpLmxlbmd0aCA+IDA7XG4gICAgdGhpcy5fYXR0ZW1wdCA9IGNvbnRleHQuYXR0ZW1wdDtcbiAgICB0aGlzLl9ydW5TaWduYWwgPSBjb250ZXh0LnJ1blNpZ25hbDtcbiAgICAvLyBUaGUgY29udGV4dCBtdXN0IGNhcnJ5IHRoZSBydWxlIEJFRk9SRSB0aGUgZmlyc3Qgd3JpdGUsIHNpbmNlIHRoZVxuICAgIC8vIGNvbnRleHQncyB3cml0ZSBmdW5uZWwgaXMgd2hhdCBtYXJrcyBhIHBlci1jYWxsIHJlZGFjdGVkIGtleSBvbiBpdC5cbiAgICAvLyBVbmRlciBhbiBleGVjdXRvciB0aGUgY29udGV4dCBhbHJlYWR5IGhhcyB0aGUgcnVuJ3MgcnVsZSAoaW5zdGFsbGVkIG9uXG4gICAgLy8gdGhlIHJvb3QsIGluaGVyaXRlZCBkb3duKSBhbmQgdGhpcyByZS1pbnN0YWxscyB0aGUgc2FtZSBvYmplY3Q7IG9uIGFcbiAgICAvLyBiYXJlIGNvbnRleHQgaXQgaW5zdGFsbHMgYSBmcmVzaCBvbmUuXG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0LnVzZVJlZGFjdGlvblJ1bGUodGhpcy5ydWxlKTtcblxuICAgIC8vIFJlZ2lzdGVyIGFzIGNvbW1pdCBvYnNlcnZlciBzbyBTY29wZVJlY29yZGVyLm9uQ29tbWl0IGZpcmVzIHdoZW4gU3RhZ2VDb250ZXh0LmNvbW1pdCgpIGlzIGNhbGxlZFxuICAgIHRoaXMuX3N0YWdlQ29udGV4dC5zZXRDb21taXRPYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG4gICAgICB0aGlzLl9vbkNvbW1pdEZpcmVkKG11dGF0aW9ucyk7XG4gICAgfSk7XG4gICAgcmVnaXN0ZXJTY29wZVJ1bnRpbWUodGhpcywgeyB0YXJnZXQ6IHRoaXMsIGhhbmRsZXNBc3NpZ25tZW50czogZmFsc2UgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlZGFjdGlvbiBydWxlIHRoaXMgZmFjYWRlIGRlY2lkZXMgd2l0aCDigJQgdGhlIFNBTUUgb2JqZWN0IGl0c1xuICAgKiBgU3RhZ2VDb250ZXh0YCByZXRhaW5zIHdpdGggKGBtZW1vcnkvcmVkYWN0aW9uLnRzYCwgdGhlIG9uZSBvd25lcikuIFVuZGVyXG4gICAqIGFuIGV4ZWN1dG9yIHRoZSBydWxlIGlzIGluc3RhbGxlZCBvbiB0aGUgcnVudGltZSByb290IGFuZCBpbmhlcml0ZWQgYnlcbiAgICogZXZlcnkgY29udGV4dCwgc28gdGhlIGZhY2FkZSBzaW1wbHkgcmVhZHMgaXQuIE9uIGEgYmFyZSBjb250ZXh0ICh1bml0XG4gICAqIHRlc3RzLCBoYW5kLWJ1aWx0IHNjb3BlcykgdGhlIGZhY2FkZSBjcmVhdGVzIG9uZSBhbmQgaW5zdGFsbHMgaXQgb24gdGhlXG4gICAqIGNvbnRleHQsIHNvIHRoZSBjb250ZXh0J3MgcmV0ZW50aW9uIGFuZCB0aGUgZmFjYWRlJ3MgcmVjb3JkZXIgdmlld3NcbiAgICogc3RpbGwgc2hhcmUgYSBzaW5nbGUgdmVyZGljdC5cbiAgICovXG4gIHByaXZhdGUgZ2V0IHJ1bGUoKTogUmVkYWN0aW9uUnVsZSB7XG4gICAgY29uc3Qgc2hhcmVkID0gdGhpcy5fc3RhZ2VDb250ZXh0LmdldFJlZGFjdGlvblJ1bGUoKTtcbiAgICBpZiAoc2hhcmVkKSByZXR1cm4gc2hhcmVkO1xuICAgIGlmICghdGhpcy5fbG9jYWxSdWxlKSB7XG4gICAgICB0aGlzLl9sb2NhbFJ1bGUgPSBuZXcgUmVkYWN0aW9uUnVsZSgpO1xuICAgICAgdGhpcy5fc3RhZ2VDb250ZXh0LnVzZVJlZGFjdGlvblJ1bGUodGhpcy5fbG9jYWxSdWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2xvY2FsUnVsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaGFyZSBhIHJlZGFjdGVkLWtleXMgc2V0IGFjcm9zcyBtdWx0aXBsZSBTY29wZUZhY2FkZSBpbnN0YW5jZXMuXG4gICAqIENhbGwgdGhpcyB0byBtYWtlIHJlZGFjdGlvbiBwZXJzaXN0IGFjcm9zcyBzdGFnZXMgaW4gdGhlIHNhbWUgcGlwZWxpbmUuXG4gICAqIChVbmRlciBhbiBleGVjdXRvciB0aGUgcnVuJ3MgcnVsZSBhbHJlYWR5IHNoYXJlcyBvbmUgc2V0OyB0aGlzIGNhbGwgaXNcbiAgICogdGhlbiBhIG5vLW9wLilcbiAgICogQGludGVybmFsXG4gICAqL1xuICB1c2VTaGFyZWRSZWRhY3RlZEtleXMoc2hhcmVkU2V0OiBTZXQ8c3RyaW5nPik6IHZvaWQge1xuICAgIHRoaXMucnVsZS51c2VNYXJrZWRLZXlzKHNoYXJlZFNldCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCByZWRhY3RlZC1rZXlzIHNldCAoZm9yIHNoYXJpbmcgd2l0aCBvdGhlciBzY29wZXMpLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGdldFJlZGFjdGVkS2V5cygpOiBTZXQ8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMucnVsZS5tYXJrZWRLZXlzKCk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgYSBkZWNsYXJhdGl2ZSByZWRhY3Rpb24gcG9saWN5LiBUaGUgcG9saWN5IGlzIGFkZGl0aXZlIOKAlFxuICAgKiBpdCB3b3JrcyBhbG9uZ3NpZGUgbWFudWFsIGBzZXRWYWx1ZSguLi4sIHRydWUpYCBjYWxscy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICB1c2VSZWRhY3Rpb25Qb2xpY3kocG9saWN5OiBSZWRhY3Rpb25Qb2xpY3kpOiB2b2lkIHtcbiAgICB0aGlzLnJ1bGUuc2V0UG9saWN5KHBvbGljeSk7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCB0aGUgcnVuJ3MgY29ycmVsYXRpb24g4oCUIGV2ZXJ5IHNjb3BlIGFuZCBlbWl0IGV2ZW50IHRoaXMgZmFjYWRlIGZpcmVzIGNhcnJpZXMgaXQ7IGB1bmRlZmluZWRgIGNsZWFyc1xuICAgKiBpdC4gRW5naW5lLW9ubHkgKHRoZSBjb21wb3NlZCBzY29wZSBmYWN0b3J5IGNhbGxzIGl0IG9uY2UgcGVyIHN0YWdlKSwgbGlrZSBgdXNlUmVkYWN0aW9uUG9saWN5YC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICB1c2VDb3JyZWxhdGlvbihjb3JyZWxhdGlvbjogUnVuQ29ycmVsYXRpb24gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLl9jb3JyZWxhdGlvbiA9IGNvcnJlbGF0aW9uO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSZWRhY3Rpb25Qb2xpY3koKTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5ydWxlLmdldFBvbGljeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb21wbGlhbmNlLWZyaWVuZGx5IHJlcG9ydCBvZiBhbGwgcmVkYWN0aW9uIGFjdGl2aXR5LlxuICAgKiBOZXZlciBpbmNsdWRlcyBhY3R1YWwgdmFsdWVzIOKAlCBvbmx5IGtleSBuYW1lcywgZmllbGQgbmFtZXMsIGFuZCBwYXR0ZXJucy5cbiAgICovXG4gIGdldFJlZGFjdGlvblJlcG9ydCgpOiBSZWRhY3Rpb25SZXBvcnQge1xuICAgIHJldHVybiB0aGlzLnJ1bGUucmVwb3J0KCk7XG4gIH1cblxuICAvLyDilIDilIAgU2NvcGVSZWNvcmRlciBNYW5hZ2VtZW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGF0dGFjaFNjb3BlUmVjb3JkZXIocmVjb3JkZXI6IFNjb3BlUmVjb3JkZXIpOiB2b2lkIHtcbiAgICAvLyBSZXBsYWNlIGV4aXN0aW5nIHJlY29yZGVyIHdpdGggc2FtZSBJRCAoaWRlbXBvdGVudCDigJQgcHJldmVudHMgZG91YmxlLWNvdW50aW5nKVxuICAgIHRoaXMuX3JlY29yZGVycyA9IHRoaXMuX3JlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IHJlY29yZGVyLmlkKTtcbiAgICB0aGlzLl9yZWNvcmRlcnMucHVzaChyZWNvcmRlcik7XG4gIH1cblxuICBkZXRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVySWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3JlY29yZGVycyA9IHRoaXMuX3JlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IHJlY29yZGVySWQpO1xuICB9XG5cbiAgZ2V0U2NvcGVSZWNvcmRlcnMoKTogU2NvcGVSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX3JlY29yZGVyc107XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG5vdGlmeVN0YWdlU3RhcnQoKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25TdGFnZVN0YXJ0Jywge1xuICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG5vdGlmeVN0YWdlRW5kKGR1cmF0aW9uPzogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25TdGFnZUVuZCcsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgZHVyYXRpb24sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG5vdGlmeVBhdXNlKHBhdXNlRGF0YT86IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLl9pbnZva2VIb29rKCdvblBhdXNlJywge1xuICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBwYXVzZURhdGEsXG4gICAgICBjaGFubmVsOiAnc2NvcGUnIGFzIGNvbnN0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlSZXN1bWUoaGFzSW5wdXQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9pbnZva2VIb29rKCdvblJlc3VtZScsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgaGFzSW5wdXQsXG4gICAgICBjaGFubmVsOiAnc2NvcGUnIGFzIGNvbnN0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlDb21taXQobXV0YXRpb25zOiBDb21taXRFdmVudFsnbXV0YXRpb25zJ10pOiB2b2lkIHtcbiAgICB0aGlzLl9pbnZva2VIb29rKCdvbkNvbW1pdCcsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgbXV0YXRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnVzZSBhIHdyaXRlIGZyb20gYSBoYW5kbGUgaGVsZCBwYXN0IGl0cyBzdGFnZSAoOS4yMi4wKS4gVGhyb3dzIHdpdGggdGhlXG4gICAqIHN0YWdlIHRoZSBoYW5kbGUgY2FtZSBmcm9tOyB0aGUgZW5naW5lJ3MgZXJyb3IgcGF0aCBhdHRyaWJ1dGVzIHRoZSB0aHJvd1xuICAgKiB0byB0aGUgc3RhZ2UgdGhhdCBtYWRlIHRoZSB3cml0ZS5cbiAgICovXG4gIHByaXZhdGUgYXNzZXJ0TGl2ZShrZXk6IHN0cmluZywgY2hhbm5lbDogTGF0ZVdyaXRlWydjaGFubmVsJ10gPSAnc3RhdGUnKTogdm9pZCB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChrZXksIGNoYW5uZWwpO1xuICAgIGlmICh0aGlzLl9jb21taXR0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihkZWFkRnJhbWVNZXNzYWdlKHRoaXMuX3N0YWdlTmFtZSwgdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLCBrZXkpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGF0dGVtcHQgZmVuY2UgKFAxYik6IHRoaXMgZmFjYWRlJ3MgYXR0ZW1wdCBoYXMgZW5kZWQsIHNvIHdoYXRldmVyIHRoZVxuICAgKiBhYmFuZG9uZWQgZnVuY3Rpb24gZG9lcyBub3cgbXVzdCBub3QgcmVhY2ggdGhlIHN0YWdlIOKAlCBub3QgaXRzIGJ1ZmZlciwgaXRzXG4gICAqIHJlYWRzLCBpdHMgdW50cmFja2VkIHNvdXJjZXMgb3IgYSByZWNvcmRlci4gUmVmdXNlZDsgYSB3cml0ZSBvciBhbiBlbWl0IGlzXG4gICAqIHJlY29yZGVkIG9uIHRoZSBzdGFnZSBmaXJzdCAoYFN0YWdlU25hcHNob3QubGF0ZVdyaXRlc2AsIHRoZSBuYW1lIG9ubHkpLFxuICAgKiBhIHJlYWQgKGBjaGFubmVsYCB1bmRlZmluZWQpIGlzIG5vdC5cbiAgICovXG4gIHByaXZhdGUgcmVmdXNlSWZBdHRlbXB0RW5kZWQoa2V5OiBzdHJpbmcsIGNoYW5uZWw/OiBMYXRlV3JpdGVbJ2NoYW5uZWwnXSk6IHZvaWQge1xuICAgIGNvbnN0IGF0dGVtcHQgPSB0aGlzLl9hdHRlbXB0O1xuICAgIGlmIChhdHRlbXB0ID09PSB1bmRlZmluZWQgfHwgIXRoaXMuX3N0YWdlQ29udGV4dC5oYXNBdHRlbXB0RW5kZWQoYXR0ZW1wdC5hdHRlbXB0KSkgcmV0dXJuO1xuICAgIGlmIChjaGFubmVsICE9PSB1bmRlZmluZWQpIHRoaXMuX3N0YWdlQ29udGV4dC5yZWNvcmRMYXRlV3JpdGUoeyBhdHRlbXB0OiBhdHRlbXB0LmF0dGVtcHQsIGtleSwgY2hhbm5lbCB9KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IobGF0ZUF0dGVtcHRNZXNzYWdlKHRoaXMuX3N0YWdlTmFtZSwgYXR0ZW1wdC5zZXJpZXMsIGF0dGVtcHQuYXR0ZW1wdCwga2V5KSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGF0dGVtcHQgdGhpcyBzdGFnZSBmdW5jdGlvbiBydW5zIGluIOKAlCBgc2NvcGUuJGF0dGVtcHQoKWAgKGRlc2lnblxuICAgKiDCpzMuMSkuIEl0cyBgc2lnbmFsYCBhYm9ydHMgd2hlbiB0aGUgYXR0ZW1wdCBtdXN0IHN0b3AgKGl0cyBjYXAsIHRoZSBydW4nc1xuICAgKiBkZWFkbGluZSwgYSBjYW5jZWxsYXRpb24pOiBwYXNzIGl0IHRvIGBmZXRjaGAgYW5kIFNESyBjYWxscy4gSXRzXG4gICAqIGB0aW1lTGVmdE1zKClgIHJlYWRzIHRoZSBydW4ncyBkZWFkbGluZSDigJQgdGltZSBpcyBhbiBpbnB1dCB0aGUgcmVjb3JkXG4gICAqIGNhbm5vdCByZXBsYXksIHNvIHdpdGggYSBkZWFkbGluZSB0aGUgcmVhZCBtYXJrcyB0aGUgc3RhZ2UncyBjb21taXRcbiAgICogYHVudHJhY2tlZFNvdXJjZXM6IFsnZW52J11gLCBhcyBgZ2V0RW52KClgIGRvZXMuXG4gICAqXG4gICAqIEEgc3RhZ2UgdGhlIGF0dGVtcHQgcnVubmVyIGRvZXMgbm90IHJ1biAobm8gcmV0cnkgcG9saWN5LCBubyBgdGltZW91dE1zYCxcbiAgICogbm8gZGVhZGxpbmUpIGlzIGF0dGVtcHQgMSBvZiAxLCB3aXRoIHRoZSBydW4ncyBzaWduYWwgYW5kIGBJbmZpbml0eWAgbGVmdC5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB0ID0gc2NvcGUuJGF0dGVtcHQoKTtcbiAgICogY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7IHNpZ25hbDogdC5zaWduYWwgfSk7XG4gICAqIGlmICh0LnRpbWVMZWZ0TXMoKSA8IDFfMDAwKSBzY29wZS5zdW1tYXJ5ID0gJ3BhcnRpYWwnO1xuICAgKiBgYGBcbiAgICovXG4gIGdldEF0dGVtcHQoKTogQXR0ZW1wdENvbnRleHQge1xuICAgIGNvbnN0IGF0dGVtcHQgPSB0aGlzLl9hdHRlbXB0O1xuICAgIGNvbnN0IG9ic2VydmVkID0gKHJlcG9ydDogT2JzZXJ2ZWRBdHRlbXB0KSA9PiB0aGlzLnJlY29yZE9ic2VydmVkKHJlcG9ydCk7XG4gICAgaWYgKGF0dGVtcHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgICAgICBzZXJpZXM6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgYXR0ZW1wdDogMSxcbiAgICAgICAgb2Y6IDEsXG4gICAgICAgIHNpZ25hbDogdGhpcy5fcnVuU2lnbmFsID8/IE5FVkVSX0FCT1JURUQsXG4gICAgICAgIHRpbWVMZWZ0TXM6ICgpID0+IEluZmluaXR5LFxuICAgICAgICBvYnNlcnZlZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKCckYXR0ZW1wdCcpO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9zdGFnZUNvbnRleHQ7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgICAgLi4uYXR0ZW1wdCxcbiAgICAgIHRpbWVMZWZ0TXM6ICgpID0+IHtcbiAgICAgICAgLy8gUmVhZCB0aHJvdWdoIGEgaGFuZGxlIGhlbGQgcGFzdCBpdHMgYXR0ZW1wdCwgaXQgbXVzdCBub3QgbWFyayBhIExBVEVSIGF0dGVtcHQncyBjb21taXQuXG4gICAgICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoJyRhdHRlbXB0Jyk7XG4gICAgICAgIGlmIChhdHRlbXB0LmRlYWRsaW5lICE9PSB1bmRlZmluZWQpIGNvbnRleHQubWFya1VudHJhY2tlZFNvdXJjZSgnZW52Jyk7XG4gICAgICAgIHJldHVybiBhdHRlbXB0LnRpbWVMZWZ0TXMoKTtcbiAgICAgIH0sXG4gICAgICBvYnNlcnZlZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGNhbGwgdG8gYW4gb3V0c2lkZSBzeXN0ZW0sIG1hZGUgaW5zaWRlIHRoaXMgc3RhZ2Ug4oCUIGBzY29wZS4kY2FsbCh0YXJnZXQsIGZuLCBwb2xpY3k/KWAgKGRlc2lnbiDCpzMuNiwgUDIpLlxuICAgKiBgZm5gIHJ1bnMgb24gdGhlIGF0dGVtcHQgcnVubmVyIHVuZGVyIGBwb2xpY3lgIChub25lID0gT05FIGF0dGVtcHQsIHN0aWxsIHJlY29yZGVkOiBhIHNpbmdsZSBjYWxsIGlzIGV2aWRlbmNlXG4gICAqIHRvbyksIGFuZCBldmVyeSBhdHRlbXB0IGlzIGFuIGBBdHRlbXB0UmVjb3JkYCBvZiBraW5kIGAnY2FsbCdgIG9uIHRoaXMgc3RhZ2UncyBleGVjdXRpb24tdHJlZSBub2RlIGFuZCBvblxuICAgKiBgb25BdHRlbXB0YCDigJQgaXRzIHRpbWluZywgb3V0Y29tZSwgZmFpbHVyZSBjYXRlZ29yeSBhbmQgdGhlIHJldHJ5LW9yLXN0b3AgZGVjaXNpb24sIGl0cyBlcnJvciBzZXJ2ZWQgdW5kZXIgdGhlXG4gICAqIHJ1bidzIHJlZGFjdGlvbiBydWxlLlxuICAgKlxuICAgKiBUaGUgY2FsbCBsaXZlcyB3aXRoaW4gdGhpcyBzdGFnZSBhdHRlbXB0OiBpdCBpcyBjYXBwZWQgYnkgdGhlIHRpbWUgdGhlIGF0dGVtcHQgaGFzIGxlZnQgKGl0cyBjYXAsIHRoZSBydW4nc1xuICAgKiBkZWFkbGluZSkgYW5kIGBmbmAncyBgc2lnbmFsYCBhYm9ydHMgd2hlbiB0aGUgYXR0ZW1wdCBkb2VzOyBvbmNlIHRoZSBhdHRlbXB0IGlzIG92ZXIgbm90aGluZyBvZiB0aGUgY2FsbCBsYW5kc1xuICAgKiBhbmQgbm8gZnVydGhlciBhdHRlbXB0IG9mIGl0IHN0YXJ0cyAoYGF0dGVtcHQvY2FsbC50c2ApLiBgdGFyZ2V0YCBpcyBhIE5BTUUgZnJvbSBjb2RlIOKAlCBuZXZlciBhIHZhbHVlLlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHF1b3RlID0gYXdhaXQgc2NvcGUuJGNhbGwoJ3N0cmlwZS5xdW90ZXMuY3JlYXRlJywgKHQpID0+IHN0cmlwZS5xdW90ZXMuY3JlYXRlKGJvZHksIHsgc2lnbmFsOiB0LnNpZ25hbCB9KSxcbiAgICogICB7IGF0dGVtcHRzOiAzLCB0aW1lb3V0TXM6IDEwXzAwMCwgYmFja29mZk1zOiAobikgPT4gNTAwICogbiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEEgY2FsbCB0aGF0IENIQU5HRVMgYW4gb3V0c2lkZSBzeXN0ZW0gZGVjbGFyZXMgaXQgKFAzKTogYG9wdGlvbnMudG91Y2hlc2AgbmFtZXMgdGhlIHN5c3RlbSBhbmRcbiAgICogYG9wdGlvbnMuaWRlbXBvdGVuY3lLZXlgIHRoZSBrZXkgZXZlcnkgYXR0ZW1wdCBpcyBtYWRlIHVuZGVyIChgdC5pZGVtcG90ZW5jeUtleWApIOKAlCBhIHZhbHVlIGZyb20gdGhlIHN0YWdlJ3NcbiAgICogaW5wdXQgb3Igc3RhdGUsIG5ldmVyIGZyb20gbW9kZWwgb3V0cHV0LiBBIHRvdWNoaW5nIGNhbGwgdGhhdCBtYXkgcmV0cnkgd2l0aG91dCBhIGtleSBpcyByZWZ1c2VkIGhlcmUsXG4gICAqIGJlZm9yZSBhbnl0aGluZyBpcyBzZW50OyBlYWNoIHJlY29yZCBzYXlzIHdoYXQgaXRzIGF0dGVtcHQgZGlkIChgZWZmZWN0YCksIGFuZCBhIGNhbGwgdGhhdCBlbmRzIHdpdGhvdXQgYW4gYW5zd2VyIGFmdGVyIGFueSBhdHRlbXB0IGxlZnQgdGhlXG4gICAqIGVmZmVjdCB1bmtub3duIHJlamVjdHMgd2l0aCBgVW5rbm93bkVmZmVjdEVycm9yYCDigJQgcmVjb25jaWxlIGJ5IHRoZSBrZXksIGRvIG5vdCByZXRyeSBibGluZGx5LlxuICAgKi9cbiAgY2FsbDxUPihcbiAgICB0YXJnZXQ6IHN0cmluZyxcbiAgICBmbjogKGF0dGVtcHQ6IEF0dGVtcHRDb250ZXh0KSA9PiBQcm9taXNlPFQ+IHwgVCxcbiAgICBwb2xpY3k/OiBSZXRyeVBvbGljeSxcbiAgICBvcHRpb25zPzogQ2FsbE9wdGlvbnMsXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IG5hbWUgPSBhZG1pdEF0dGVtcHROYW1lKCckY2FsbCcsICd0YXJnZXQnLCB0YXJnZXQpO1xuICAgIGNvbnN0IHdoZXJlID0gYCRjYWxsKCcke25hbWV9JylgO1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7d2hlcmV9OiBmbiBtdXN0IGJlIGEgZnVuY3Rpb25gKTtcbiAgICBjb25zdCBhZG1pdHRlZCA9IGFkbWl0Q2FsbFBvbGljeSh3aGVyZSwgcG9saWN5KTtcbiAgICBjb25zdCB0b3VjaGVzID0gY2FsbFRvdWNoZXMod2hlcmUsIG9wdGlvbnMsIGFkbWl0dGVkKTtcbiAgICAvLyBBIGtleWxlc3MgdG91Y2hpbmcgY2FsbCBpcyBzZW50IG9uY2Ugb25seSBpZiB0aGUgc3RhZ2UgYXR0ZW1wdCB0aGF0IG1ha2VzIGl0IG5ldmVyIHJ1bnMgYWdhaW4gKFAzKTogYSBzdGFnZVxuICAgIC8vIHRoYXQgbWF5IHJldHJ5IHdvdWxkIHJlLXNlbmQgaXQgd2l0aG91dCBhIGtleSDigJQgcmVmdXNlZCBoZXJlLCBiZWZvcmUgYW55dGhpbmcgaXMgc2VudC5cbiAgICAvLyBTbyBpcyBvbmUgaW5zaWRlIGFuIGVuY2xvc2luZyBgJGNhbGxgIHRoYXQgbWF5IHJldHJ5IChpdHMgZnVuY3Rpb24gcnVucyBvbmNlIHBlciBvdXRlciBhdHRlbXB0KS5cbiAgICBpZiAodG91Y2hlcyAhPT0gdW5kZWZpbmVkICYmIHRvdWNoZXMuaWRlbXBvdGVuY3lLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZW5jbG9zaW5nID0gKHRoaXMuX2F0dGVtcHQ/Lm9mID8/IDEpID4gMSA/ICdhIHN0YWdlJyA6IHRoaXMuX3JldHJ5aW5nQ2FsbHMgPiAwID8gJ2EgJGNhbGwnIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGVuY2xvc2luZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgYCR7d2hlcmV9OiB0b3VjaGVzIFwiJHt0b3VjaGVzLnN5c3RlbX1cIiB3aXRoIG5vIGlkZW1wb3RlbmN5S2V5LCBpbnNpZGUgJHtlbmNsb3Npbmd9IHRoYXQgbWF5IHJldHJ5IOKAlCBhIGAgK1xuICAgICAgICAgICAgJ3JldHJ5IHdvdWxkIHNlbmQgaXQgYWdhaW4gd2l0aG91dCBhIGtleS4gR2l2ZSB0aGUgY2FsbCBhIGtleS4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5fc3RhZ2VDb250ZXh0Lm1hcmtLZXlsZXNzRWZmZWN0KCk7XG4gICAgfVxuICAgIC8vIEZyb20gYW4gZW5kZWQgYXR0ZW1wdCBvciBhIGNvbW1pdHRlZCBmcmFtZTogcmVmdXNlZCAoYW5kIHJlY29yZGVkIGJ5IG5hbWUpIGJlZm9yZSBhbnl0aGluZyByZWFjaGVzIG91dHNpZGUuXG4gICAgdGhpcy5yZWZ1c2VMYXRlQ2FsbChgY2FsbDoke25hbWV9YCk7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuX3N0YWdlQ29udGV4dDtcbiAgICBjb25zdCBzdGFnZUF0dGVtcHQgPSB0aGlzLl9hdHRlbXB0Py5hdHRlbXB0ID8/IDE7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5fYXR0ZW1wdD8uc2lnbmFsID8/IHRoaXMuX3J1blNpZ25hbDtcbiAgICBjb25zdCBkZWFkbGluZSA9IGF0dGVtcHRFbmRzQXQodGhpcy5fYXR0ZW1wdCk7XG4gICAgY29uc3QgZW5kZWQgPSBjb250ZXh0LmNhbGxzRW5kZWRTaWduYWwoc3RhZ2VBdHRlbXB0KTtcbiAgICAvLyBXaGlsZSBhIGNhbGwgdGhhdCBtYXkgcmV0cnkgaXMgaW4gZmxpZ2h0LCBhIGtleWxlc3MgdG91Y2hpbmcgY2FsbCBtYWRlIGluc2lkZSBpdCBpcyByZWZ1c2VkIChhYm92ZSkuXG4gICAgY29uc3QgcmV0cnlpbmcgPSBhdHRlbXB0Q2VpbGluZyhhZG1pdHRlZC5hdHRlbXB0cykgPiAxO1xuICAgIGlmIChyZXRyeWluZykgdGhpcy5fcmV0cnlpbmdDYWxscyArPSAxO1xuICAgIGxldCByZXN1bHQ6IFByb21pc2U8VD47XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuc3RhcnRDYWxsKG5hbWUsIGZuLCBhZG1pdHRlZCwgdG91Y2hlcywgc3RhZ2VBdHRlbXB0LCBzaWduYWwsIGRlYWRsaW5lLCBlbmRlZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChyZXRyeWluZykgdGhpcy5fcmV0cnlpbmdDYWxscyAtPSAxO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGlmICghcmV0cnlpbmcpIHJldHVybiByZXN1bHQ7XG4gICAgY29uc3QgcmVsZWFzZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuX3JldHJ5aW5nQ2FsbHMgLT0gMTtcbiAgICB9O1xuICAgIHJlc3VsdC50aGVuKHJlbGVhc2UsIHJlbGVhc2UpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKiogYHJ1bkNhbGxgIHdpdGggdGhpcyBzdGFnZSBhdHRlbXB0IGFzIGl0cyBob3N0IChgY2FsbGApLiAqL1xuICBwcml2YXRlIHN0YXJ0Q2FsbDxUPihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm46IChhdHRlbXB0OiBBdHRlbXB0Q29udGV4dCkgPT4gUHJvbWlzZTxUPiB8IFQsXG4gICAgYWRtaXR0ZWQ6IFJldHJ5UG9saWN5LFxuICAgIHRvdWNoZXM6IHsgcmVhZG9ubHkgc3lzdGVtOiBzdHJpbmc7IHJlYWRvbmx5IGlkZW1wb3RlbmN5S2V5Pzogc3RyaW5nIH0gfCB1bmRlZmluZWQsXG4gICAgc3RhZ2VBdHRlbXB0OiBudW1iZXIsXG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCxcbiAgICBkZWFkbGluZTogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGVuZGVkOiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuX3N0YWdlQ29udGV4dDtcbiAgICBjb25zdCBsb29wID0gdGFrZVJldHJ5TG9vcENhbGwodGhpcyk7XG4gICAgcmV0dXJuIHJ1bkNhbGwobmFtZSwgZm4sIGFkbWl0dGVkLCB7XG4gICAgICBvcGVuU2VyaWVzOiAoKSA9PiBjYWxsU2VyaWVzKGNvbnRleHQucnVudGltZVN0YWdlSWQsIHN0YWdlQXR0ZW1wdCwgY29udGV4dC5uZXh0Q2FsbE9yZGluYWwoc3RhZ2VBdHRlbXB0KSksXG4gICAgICAuLi4oc2lnbmFsICE9PSB1bmRlZmluZWQgJiYgeyBzaWduYWwgfSksXG4gICAgICAuLi4oZGVhZGxpbmUgIT09IHVuZGVmaW5lZCAmJiB7IGRlYWRsaW5lIH0pLFxuICAgICAgZW5kZWQsXG4gICAgICAuLi4odG91Y2hlcyAhPT0gdW5kZWZpbmVkICYmIHsgZWZmZWN0OiB0aGlzLmNhbGxFZmZlY3QodG91Y2hlcykgfSksXG4gICAgICAvLyBUaGUgZnJhbWUncyBvd24gY29tbWl0IHN0YXRlIChldmVyeSBhdHRlbXB0J3MgZmFjYWRlIHJlYWRzIHRoZSBzYW1lKSwgbmV2ZXIgYSBmYWNhZGUgZmxhZy5cbiAgICAgIGFkbWl0czogKGN1dCkgPT4gIWNvbnRleHQuY29tbWl0dGVkICYmIChjdXQgfHwgIShlbmRlZC5hYm9ydGVkIHx8IHRoaXMuYXR0ZW1wdEhhc0VuZGVkKCkpKSxcbiAgICAgIHNlcnZlOiAoZXJyb3IpID0+IHRoaXMucnVsZS5zZXJ2ZWRFcnJvcihlcnJvciksXG4gICAgICByZXBvcnQ6IChyZWNvcmQsIHN0cnVjdHVyZWRFcnJvcikgPT4ge1xuICAgICAgICBjb25zdCBzZXJ2ZWQgPSBsb29wID8gT2JqZWN0LmZyZWV6ZSh7IC4uLnJlY29yZCwgcmV0cnlMb29wOiBsb29wLmlkZW50aXR5IH0pIDogcmVjb3JkO1xuICAgICAgICBjb250ZXh0LnJlcG9ydENhbGxBdHRlbXB0KHNlcnZlZCwgc3RydWN0dXJlZEVycm9yKTtcbiAgICAgICAgbG9vcD8ucmVjb3JkKHNlcnZlZCk7XG4gICAgICB9LFxuICAgICAgcmVmdXNlZDogKCkgPT4gY29udGV4dC5yZWNvcmRMYXRlV3JpdGUoeyBhdHRlbXB0OiBzdGFnZUF0dGVtcHQsIGtleTogYGNhbGw6JHtuYW1lfWAsIGNoYW5uZWw6ICdhdHRlbXB0JyB9KSxcbiAgICAgIG9ic2VydmU6IChyZXBvcnQsIGF0KSA9PiB0aGlzLnJlY29yZE9ic2VydmVkKHJlcG9ydCwgYXQuZW5kZWQpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCBUaGUgZXhwbGljaXQgcmV0cnkgaGVscGVyIG93bnMgdGhpcyBzdGF0ZTsgdGhlIG5vcm1hbCB3cml0ZSBwYXRoIHN0aWxsIG93bnMgcmV0ZW50aW9uL2NvbW1pdC4gKi9cbiAgd3JpdGVSZXRyeUxvb3BTdGF0ZShrZXk6IHN0cmluZywgc3RhdGU6IHsgcmVhZG9ubHkgaWRlbXBvdGVuY3lLZXk6IHN0cmluZyB9KTogdm9pZCB7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMuc2VydmVSZXRyeUxvb3BLZXkoc3RhdGUuaWRlbXBvdGVuY3lLZXkpO1xuICAgIGlmIChrZXB0ICE9PSBzdGF0ZS5pZGVtcG90ZW5jeUtleSkgdGhpcy5ydWxlLmluaGVyaXRGaWVsZHMoa2V5LCBbJ2lkZW1wb3RlbmN5S2V5J10pO1xuICAgIHRoaXMuc2V0VmFsdWUoa2V5LCBzdGF0ZSk7XG4gIH1cblxuICAvKiogQGludGVybmFsIEV4YWN0bHkgdGhlIGV4aXN0aW5nIFAzIGtleS1yZXRlbnRpb24gbGF3OyBvcGVyYXRpb25hbCBzdGF0ZSBrZWVwcyB0aGUgcmVhbCBrZXkuICovXG4gIHNlcnZlUmV0cnlMb29wS2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5ydWxlLnJldGFpbklkZW1wb3RlbmN5S2V5KGtleSwge1xuICAgICAgaW5wdXQ6IHRoaXMuX3JlYWRPbmx5VmFsdWVzLFxuICAgICAgc2VsZWN0ZWRSZWFkczogdGhpcy5fc3RhZ2VDb250ZXh0LnNlbGVjdGVkUmVhZHMgKyAodGhpcy5fc3RhZ2VDb250ZXh0LmVmZmVjdEtleVRhaW50ZWQgPyAxIDogMCksXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsIExvb3Agc3RhdGUgaXMgZHVyYWJsZSBkYXRhOiBuZXZlciBwZXJzaXN0IHRoZSB0aHJvd24gdmFsdWUsIHN0YWNrLCBjYXVzZSBvciBwYXlsb2FkLiAqL1xuICBzZXJ2ZVJldHJ5TG9vcEVycm9yKGVycm9yOiB1bmtub3duKTogQXR0ZW1wdEVycm9yIHtcbiAgICBjb25zdCBzZXJ2ZWQgPSB0aGlzLnJ1bGUuc2VydmVkRXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiBzZXJ2ZWQubWVzc2FnZSxcbiAgICAgIC4uLihzZXJ2ZWQubmFtZSAhPT0gdW5kZWZpbmVkID8geyBuYW1lOiBzZXJ2ZWQubmFtZSB9IDoge30pLFxuICAgICAgLi4uKHNlcnZlZC5jb2RlICE9PSB1bmRlZmluZWQgPyB7IGNvZGU6IHNlcnZlZC5jb2RlIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBBIHRvdWNoaW5nIGNhbGwncyB0YXJnZXQsIGl0cyBrZXkgc2VydmVkIGZvciB0aGUgcmVjb3JkcyAoYFJlZGFjdGlvblJ1bGUgwrcgcmV0YWluSWRlbXBvdGVuY3lLZXlgOiBieSBuYW1lIGFuZCBieSBpdHMgc291cmNlcykuICovXG4gIHByaXZhdGUgY2FsbEVmZmVjdCh0b3VjaGVzOiB7IHJlYWRvbmx5IHN5c3RlbTogc3RyaW5nOyByZWFkb25seSBpZGVtcG90ZW5jeUtleT86IHN0cmluZyB9KToge1xuICAgIHJlYWRvbmx5IHN5c3RlbTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGlkZW1wb3RlbmN5S2V5Pzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHJlY29yZGVkS2V5Pzogc3RyaW5nO1xuICB9IHtcbiAgICBjb25zdCBrZXkgPSB0b3VjaGVzLmlkZW1wb3RlbmN5S2V5O1xuICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRvdWNoZXM7XG4gICAgLy8gQSBrZXkgdGhlIHN0YWdlIGJ1aWx0IGFmdGVyIHJlYWRpbmcgYSBzZWxlY3RlZCB2YWx1ZSDigJQgb3IgZnJvbSBhbiBpbnB1dCBob2xkaW5nIG9uZSDigJQgaXMgc2VydmVkIHdob2xlLlxuICAgIGNvbnN0IHJlY29yZGVkS2V5ID0gdGhpcy5ydWxlLnJldGFpbklkZW1wb3RlbmN5S2V5KGtleSwge1xuICAgICAgaW5wdXQ6IHRoaXMuX3JlYWRPbmx5VmFsdWVzLFxuICAgICAgLy8gVGhlIHN0YWdlJ3Mgb3duIGtleSBtYXkgYmUgbWFkZSBvZiBhIHNlbGVjdGVkIHZhbHVlOiBhIGtleSBwYXNzZWQgb24gZnJvbSBpdCBpcyBzZXJ2ZWQgdGhlIHNhbWUgd2F5LlxuICAgICAgc2VsZWN0ZWRSZWFkczogdGhpcy5fc3RhZ2VDb250ZXh0LnNlbGVjdGVkUmVhZHMgKyAodGhpcy5fc3RhZ2VDb250ZXh0LmVmZmVjdEtleVRhaW50ZWQgPyAxIDogMCksXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgLi4udG91Y2hlcywgcmVjb3JkZWRLZXkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGAkY2FsbGAgZnJvbSBhbiBlbmRlZCBhdHRlbXB0LCBvciBmcm9tIGEgZnJhbWUgdGhhdCBoYXMgY29tbWl0dGVkOiByZWNvcmRlZCBieSBuYW1lIChgbGF0ZVdyaXRlc2AsIGNoYW5uZWxcbiAgICogYCdhdHRlbXB0J2ApIGFuZCByZWZ1c2VkIOKAlCBiZWZvcmUgYW55dGhpbmcgcmVhY2hlcyBvdXRzaWRlLiBUaGUgUDFiIGZlbmNlIGZpcnN0LCBzbyBpdHMgbWVzc2FnZSBhbmQgcmVjb3JkIGFyZVxuICAgKiB0aGUgc2FtZS5cbiAgICovXG4gIHByaXZhdGUgcmVmdXNlTGF0ZUNhbGwoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKGtleSwgJ2F0dGVtcHQnKTtcbiAgICBpZiAoIXRoaXMuX3N0YWdlQ29udGV4dC5jb21taXR0ZWQgJiYgIXRoaXMuX2NvbW1pdHRlZCkgcmV0dXJuO1xuICAgIHRoaXMuX3N0YWdlQ29udGV4dC5yZWNvcmRMYXRlV3JpdGUoeyBhdHRlbXB0OiB0aGlzLl9hdHRlbXB0Py5hdHRlbXB0ID8/IDEsIGtleSwgY2hhbm5lbDogJ2F0dGVtcHQnIH0pO1xuICAgIHRocm93IG5ldyBFcnJvcihkZWFkRnJhbWVNZXNzYWdlKHRoaXMuX3N0YWdlTmFtZSwgdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLCBrZXkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBvdXRzaWRlIGF0dGVtcHQgYW4gYWRhcHRlciByZXBvcnRlZCDigJQgYEF0dGVtcHRDb250ZXh0Lm9ic2VydmVkYCBvbiB0aGlzIHN0YWdlJ3MgYXR0ZW1wdCBvciBvbiBvbmUgb2YgaXRzXG4gICAqIGNhbGxzJyAoUDIpLiBSZWFkIGFuZCB2YWxpZGF0ZWQgZmlyc3QgKGEgbWFsZm9ybWVkIHJlcG9ydCBpcyB0aGUgYWRhcHRlcidzIGJ1ZzogYSBgVHlwZUVycm9yYCwgYW5kIGl0IG5ldmVyXG4gICAqIHJlYWNoZXMgdGhlIHJlY29yZCkuIEEgcmVwb3J0IHRoYXQgY29tZXMgYWZ0ZXIgaXRzIGF0dGVtcHQgZW5kZWQg4oCUIHRoZSBjYWxsIGF0dGVtcHQgaXQgd2FzIG1hZGUgdGhyb3VnaCwgdGhpc1xuICAgKiBzdGFnZSBhdHRlbXB0LCBvciB0aGUgZnJhbWUncyBjb21taXQg4oCUIGlzIHJlY29yZGVkIGJ5IG5hbWUgKGBsYXRlV3JpdGVzYCwgY2hhbm5lbCBgJ2F0dGVtcHQnYCkgYW5kIERST1BQRUQsXG4gICAqIG5ldmVyIHRocm93bjogYWRhcHRlcnMgcmVwb3J0IGZyb20gYW4gU0RLJ3Mgb3duIGNhbGxiYWNrcywgd2hpY2ggbWF5IGZpcmUgYWZ0ZXIgdGhlIHN0YWdlIG1vdmVkIG9uLCBhbmQgYW5cbiAgICogb2JzZXJ2ZWQgYXR0ZW1wdCBuZXZlciBjaGFuZ2VzIGNvbnRyb2wgZmxvdyDigJQgaW4gZWl0aGVyIGRpcmVjdGlvbi4gSXRzIHNlcmllcyBvcGVucyBhdCB0aGlzIHN0YWdlIGF0dGVtcHQncyBjYWxsXG4gICAqIGxldmVsOiBhbiBTREsncyBjYWxsIGlzIGEgY2FsbCB0aGUgc3RhZ2UgYXR0ZW1wdCBtYWRlLCBzbyBhIHJlcG9ydCBtYWRlIHRocm91Z2ggYSBgJGNhbGxgIGlzIHRoYXQgY2FsbCdzIHNpYmxpbmcuXG4gICAqL1xuICBwcml2YXRlIHJlY29yZE9ic2VydmVkKHJlcG9ydDogT2JzZXJ2ZWRBdHRlbXB0LCBjYWxsQXR0ZW1wdEVuZGVkID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCByZWFkID0gcmVhZE9ic2VydmVkUmVwb3J0KHJlcG9ydCk7XG4gICAgY29uc3Qga2V5ID0gYG9ic2VydmVkOiR7cmVhZC50YXJnZXR9YDtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5fc3RhZ2VDb250ZXh0O1xuICAgIGNvbnN0IHN0YWdlQXR0ZW1wdCA9IHRoaXMuX2F0dGVtcHQ/LmF0dGVtcHQgPz8gMTtcbiAgICBpZiAoY2FsbEF0dGVtcHRFbmRlZCB8fCB0aGlzLmF0dGVtcHRIYXNFbmRlZCgpIHx8IGNvbnRleHQuY29tbWl0dGVkIHx8IHRoaXMuX2NvbW1pdHRlZCkge1xuICAgICAgY29udGV4dC5yZWNvcmRMYXRlV3JpdGUoeyBhdHRlbXB0OiBzdGFnZUF0dGVtcHQsIGtleSwgY2hhbm5lbDogJ2F0dGVtcHQnIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBib29rID0gKHRoaXMuX29ic2VydmVkQm9vayA/Pz0gbmV3IE9ic2VydmVkU2VyaWVzQm9vaygoKSA9PlxuICAgICAgY2FsbFNlcmllcyhjb250ZXh0LnJ1bnRpbWVTdGFnZUlkLCBzdGFnZUF0dGVtcHQsIGNvbnRleHQubmV4dENhbGxPcmRpbmFsKHN0YWdlQXR0ZW1wdCkpLFxuICAgICkpO1xuICAgIGNvbnN0IHsgcmVjb3JkLCBzdHJ1Y3R1cmVkRXJyb3IgfSA9IG9ic2VydmVkUmVjb3JkKHJlYWQsIHtcbiAgICAgIHNlcmllczogYm9vay5zZXJpZXNGb3IocmVhZCksXG4gICAgICBub3c6IERhdGUubm93LFxuICAgICAgc2VydmU6IChlcnJvcikgPT4gdGhpcy5ydWxlLnNlcnZlZEVycm9yKGVycm9yKSxcbiAgICB9KTtcbiAgICBjb250ZXh0LnJlcG9ydENhbGxBdHRlbXB0KHJlY29yZCwgc3RydWN0dXJlZEVycm9yKTtcbiAgfVxuXG4gIC8qKiBUaGlzIGZhY2FkZSdzIGF0dGVtcHQgaGFzIGVuZGVkIOKAlCB0aGUgUDFiIGZlbmNlIGlzIGNsb3NlZC4gKi9cbiAgcHJpdmF0ZSBhdHRlbXB0SGFzRW5kZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYXR0ZW1wdCA9IHRoaXMuX2F0dGVtcHQ7XG4gICAgcmV0dXJuIGF0dGVtcHQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLl9zdGFnZUNvbnRleHQuaGFzQXR0ZW1wdEVuZGVkKGF0dGVtcHQuYXR0ZW1wdCk7XG4gIH1cblxuICAvKiogQ2FsbGVkIGJ5IFN0YWdlQ29udGV4dC5jb21taXQoKSBvYnNlcnZlci4gQ29udmVydHMgdHJhY2tlZCB3cml0ZXMgdG8gQ29tbWl0RXZlbnQgZm9ybWF0LlxuICAgKiAgRXJyb3JzIGFyZSBjYXVnaHQgdG8gcHJldmVudCByZWNvcmRlciBpc3N1ZXMgZnJvbSBhYm9ydGluZyB0aGUgdHJhdmVyc2FsLiAqL1xuICBwcml2YXRlIF9vbkNvbW1pdEZpcmVkKG11dGF0aW9uczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4pOiB2b2lkIHtcbiAgICB0aGlzLl9jb21taXR0ZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLl9yZWNvcmRlcnMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgLy8gYF9zdGFnZVdyaXRlc2AgYWxyZWFkeSBob2xkcyB0aGUgcmV0YWluZWQgZm9ybSAodGhlIGNvbnRleHQgcmV0YWluc1xuICAgICAgLy8gdW5kZXIgdGhlIHNhbWUgcnVsZSk7IGFwcGx5aW5nIHRoZSB2ZXJkaWN0IGFnYWluIGhlcmUgaXMgaWRlbXBvdGVudFxuICAgICAgLy8gYW5kIGtlZXBzIGEga2V5IG1hcmtlZCBBRlRFUiBpdHMgd3JpdGUgc2NydWJiZWQgYXQgY29tbWl0IHRpbWUuXG4gICAgICBjb25zdCBjb21taXRNdXRhdGlvbnM6IENvbW1pdEV2ZW50WydtdXRhdGlvbnMnXSA9IE9iamVjdC5lbnRyaWVzKG11dGF0aW9ucykubWFwKChba2V5LCBlbnRyeV0pID0+ICh7XG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IHRoaXMucnVsZS5yZXRhaW4oW2tleV0sIGVudHJ5LnZhbHVlKSxcbiAgICAgICAgb3BlcmF0aW9uOiBlbnRyeS5vcGVyYXRpb24sXG4gICAgICB9KSk7XG5cbiAgICAgIHRoaXMubm90aWZ5Q29tbWl0KGNvbW1pdE11dGF0aW9ucyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTd2FsbG93IOKAlCByZWNvcmRlciBlcnJvcnMgbXVzdCBub3QgYWJvcnQgdGhlIHRyYXZlcnNhbC5cbiAgICAgIC8vIEluZGl2aWR1YWwgcmVjb3JkZXIgZXJyb3JzIGFyZSBhbHJlYWR5IGlzb2xhdGVkIGJ5IF9pbnZva2VIb29rLlxuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBEZWJ1ZyAvIERpYWdub3N0aWNzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvL1xuICAvLyBUaGVzZSBsZWdhY3kgbWV0aG9kcyBzdGlsbCB3cml0ZSB0byB0aGUgYFN0YWdlQ29udGV4dGAgZGlhZ25vc3RpY1xuICAvLyBzaWRlIGJhZ3MgKGxvZ0NvbnRleHQgLyBlcnJvckNvbnRleHQgLyBtZXRyaWNDb250ZXh0IC8gZXZhbENvbnRleHQpIGZvclxuICAvLyBzbmFwc2hvdCBpbmNsdXNpb24uIFRoZXkgQUxTTyBmaXJlIHRocm91Z2ggdGhlIEVtaXQgY2hhbm5lbCBzbyBhbnlcbiAgLy8gYXR0YWNoZWQgYEVtaXRSZWNvcmRlcmAgc2VlcyB0aGVtIGluIHJlYWwgdGltZSDigJQgY2xvc2luZyB0aGVcbiAgLy8gbG9uZy1zdGFuZGluZyBnYXAgd2hlcmUgYCRkZWJ1Z2AvYCRtZXRyaWNgIHdlbnQgdG8gdW5vYnNlcnZlZCBiYWdzLlxuXG4gIGFkZERlYnVnSW5mbyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKGBsb2cuZGVidWcuJHtrZXl9YCwgJ2VtaXQnKTtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LmFkZERpYWdub3N0aWMoJ2xvZ3MnLCBrZXksIHZhbHVlKTtcbiAgICB0aGlzLmVtaXRFdmVudChgbG9nLmRlYnVnLiR7a2V5fWAsIHsga2V5LCB2YWx1ZToga2VwdCwgbGV2ZWw6ICdkZWJ1ZycgfSk7XG4gIH1cblxuICBhZGREZWJ1Z01lc3NhZ2UodmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKCdsb2cuZGVidWcubWVzc2FnZXMnLCAnZW1pdCcpO1xuICAgIGNvbnN0IGtlcHQgPSB0aGlzLl9zdGFnZUNvbnRleHQuYWRkRGlhZ25vc3RpYygnbG9ncycsICdtZXNzYWdlcycsIFt2YWx1ZV0pO1xuICAgIHRoaXMuZW1pdEV2ZW50KCdsb2cuZGVidWcubWVzc2FnZXMnLCB7IHZhbHVlOiBBcnJheS5pc0FycmF5KGtlcHQpID8ga2VwdFswXSA6IGtlcHQsIGxldmVsOiAnZGVidWcnIH0pO1xuICB9XG5cbiAgYWRkRXJyb3JJbmZvKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoYGxvZy5lcnJvci4ke2tleX1gLCAnZW1pdCcpO1xuICAgIGNvbnN0IGtlcHQgPSB0aGlzLl9zdGFnZUNvbnRleHQuYWRkRGlhZ25vc3RpYygnZXJyb3JzJywga2V5LCB2YWx1ZSk7XG4gICAgdGhpcy5lbWl0RXZlbnQoYGxvZy5lcnJvci4ke2tleX1gLCB7IGtleSwgdmFsdWU6IGtlcHQsIGxldmVsOiAnZXJyb3InIH0pO1xuICB9XG5cbiAgYWRkTWV0cmljKG1ldHJpY05hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKGBtZXRyaWMuJHttZXRyaWNOYW1lfWAsICdlbWl0Jyk7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMuX3N0YWdlQ29udGV4dC5hZGREaWFnbm9zdGljKCdtZXRyaWNzJywgbWV0cmljTmFtZSwgdmFsdWUpO1xuICAgIHRoaXMuZW1pdEV2ZW50KGBtZXRyaWMuJHttZXRyaWNOYW1lfWAsIHsgbmFtZTogbWV0cmljTmFtZSwgdmFsdWU6IGtlcHQgfSk7XG4gIH1cblxuICBhZGRFdmFsKG1ldHJpY05hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKGBldmFsLiR7bWV0cmljTmFtZX1gLCAnZW1pdCcpO1xuICAgIGNvbnN0IGtlcHQgPSB0aGlzLl9zdGFnZUNvbnRleHQuYWRkRGlhZ25vc3RpYygnZXZhbHMnLCBtZXRyaWNOYW1lLCB2YWx1ZSk7XG4gICAgdGhpcy5lbWl0RXZlbnQoYGV2YWwuJHttZXRyaWNOYW1lfWAsIHsgbmFtZTogbWV0cmljTmFtZSwgdmFsdWU6IGtlcHQgfSk7XG4gIH1cblxuICAvLyDilIDilIAgRW1pdCDigJQgUGhhc2UgMyBwcmltYXJ5IHByaW1pdGl2ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogRmlyZSBhIHN0cnVjdHVyZWQgZXZlbnQgdG8gZXZlcnkgYXR0YWNoZWQgcmVjb3JkZXIgaW1wbGVtZW50aW5nXG4gICAqIGBvbkVtaXRgLiBTeW5jaHJvbm91cywgaW4tb3JkZXIsIHBhc3MtdGhyb3VnaCDigJQgbm8gYnVmZmVyaW5nLlxuICAgKlxuICAgKiAtICoqRmFzdC1wYXRoKio6IHplcm8gYWxsb2NhdGlvbiArIHplcm8gY29zdCB3aGVuIG5vIHJlY29yZGVycyBhcmVcbiAgICogICBhdHRhY2hlZCAoZWFybHkgcmV0dXJuIG9uIGVtcHR5IGxpc3QpLlxuICAgKiAtICoqRW5yaWNobWVudCoqOiBsaWJyYXJ5IGF1dG8tYWRkcyBgc3RhZ2VOYW1lYCwgYHJ1bnRpbWVTdGFnZUlkYCxcbiAgICogICBgc3ViZmxvd1BhdGhgLCBgcGlwZWxpbmVJZGAsIGB0aW1lc3RhbXBgIHRvIHRoZSBldmVudC5cbiAgICogLSAqKlJlZGFjdGlvbioqOiBgUmVkYWN0aW9uUG9saWN5LmVtaXRQYXR0ZXJuc2AgcmVnZXhlcyBhcmUgbWF0Y2hlZFxuICAgKiAgIGFnYWluc3QgYG5hbWVgIOKAlCBtYXRjaGVkIGV2ZW50cyBoYXZlIHRoZWlyIHBheWxvYWQgcmVwbGFjZWQgd2l0aFxuICAgKiAgIGAnW1JFREFDVEVEXSdgIGJlZm9yZSBkaXNwYXRjaC5cbiAgICogLSAqKkVycm9yIGlzb2xhdGlvbioqOiBhIHRocm93aW5nIGBvbkVtaXRgIGRvZXMgbm90IHByb3BhZ2F0ZSDigJQgaXQgaXNcbiAgICogICBjYXVnaHQgYW5kIHJvdXRlZCB0byBgb25FcnJvcmAgb24gcmVtYWluaW5nIHJlY29yZGVycywgbWF0Y2hpbmcgdGhlXG4gICAqICAgcGF0dGVybiB1c2VkIGJ5IG90aGVyIHNjb3BlIGV2ZW50cy5cbiAgICpcbiAgICogQ29uc3VtZXJzIGNhbGwgdGhpcyB2aWEgdGhlIGBzY29wZS4kZW1pdChuYW1lLCBwYXlsb2FkKWAgc2NvcGUgbWV0aG9kO1xuICAgKiB0aGUgbWV0aG9kIHJvdXRlcyBoZXJlIHZpYSBgY3JlYXRlVHlwZWRTY29wZWAuXG4gICAqL1xuICBlbWl0RXZlbnQobmFtZTogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKTogdm9pZCB7XG4gICAgLy8gQW4gZW5kZWQgYXR0ZW1wdCBlbWl0cyBub3RoaW5nIOKAlCByZWZ1c2VkIChhbmQgcmVjb3JkZWQpIGJlZm9yZSB0aGUgZmFzdCBwYXRoLCBzbyB0aGUgcmVjb3JkIGRvZXMgbm90IGRlcGVuZFxuICAgIC8vIG9uIHdoZXRoZXIgYSByZWNvcmRlciBoYXBwZW5lZCB0byBiZSBhdHRhY2hlZC5cbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKG5hbWUsICdlbWl0Jyk7XG4gICAgLy8gRmFzdC1wYXRoOiB6ZXJvIHdvcmsgd2hlbiBubyByZWNvcmRlcnMgYXJlIGF0dGFjaGVkLlxuICAgIGlmICh0aGlzLl9yZWNvcmRlcnMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAvLyBSZWRhY3Rpb246IGlmIHRoZSBldmVudCBuYW1lIG1hdGNoZXMgYW55IGVtaXRQYXR0ZXJuLCByZXBsYWNlIHBheWxvYWRcbiAgICAvLyB3aXRoICdbUkVEQUNURURdJyBCRUZPUkUgY29uc3RydWN0aW5nIHRoZSBldmVudCAobm8gbGVhayB0aHJvdWdoXG4gICAgLy8gY29weS1vbi13cml0ZSwgbm8gd2F5IGZvciByZWNvcmRlcnMgdG8gc2VlIHRoZSByYXcgdmFsdWUpLlxuICAgIGNvbnN0IGZpbmFsUGF5bG9hZCA9IHRoaXMucnVsZS5yZXRhaW5FbWl0KG5hbWUsIHBheWxvYWQpO1xuICAgIGNvbnN0IHNvdXJjZVBvc2l0aW9uID0gdGhpcy5fc3RhZ2VDb250ZXh0LmNhcHR1cmVFbWl0UG9zaXRpb24oKTtcblxuICAgIC8vIEJ1aWxkIHRoZSBlbnJpY2hlZCBldmVudCBvbmNlOyBwYXNzIHRoZSBzYW1lIHJlZmVyZW5jZSB0byBhbGxcbiAgICAvLyByZWNvcmRlcnMgdW5kZXIgdGhlaXIgcmVhZC1vbmx5IGNvbnRyYWN0LiBTb3VyY2UgY29vcmRpbmF0ZXMgYXJlXG4gICAgLy8gY2FwdHVyZWQgYmVmb3JlIGFueSBpbmxpbmUgaG9vayBvciBkZWZlcnJlZCB0YXAgb2JzZXJ2ZXMgdGhlIGV2ZW50LlxuICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgbmFtZSxcbiAgICAgIHBheWxvYWQ6IGZpbmFsUGF5bG9hZCxcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dQYXRoOiB0aGlzLl9nZXRTdWJmbG93UGF0aCgpLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgLi4uKHNvdXJjZVBvc2l0aW9uID09PSB1bmRlZmluZWQgPyB7fSA6IHsgc291cmNlUG9zaXRpb24gfSksXG4gICAgfSBhcyBjb25zdDtcblxuICAgIC8vIERpc3BhdGNoIHdpdGggZXJyb3IgaXNvbGF0aW9uIOKAlCB0aGUgc2FtZSBgZmlyZWAgbG9vcCBhbmQgdGhlIHNhbWUgZmFpbHVyZSByb3V0aW5nIGFzXG4gICAgLy8gZXZlcnkgb3RoZXIgc2NvcGUgZXZlbnQ6IGEgdGhyb3dpbmcgcmVjb3JkZXIncyBlcnJvciByZWFjaGVzIG9uRXJyb3Igb24gdGhlIHJlY29yZGVycztcbiAgICAvLyB0aGUgZW1pdCBsb29wIGNvbnRpbnVlcyB1bmFmZmVjdGVkLlxuICAgIGZpcmUodGhpcy5fcmVjb3JkZXJzLCAnb25FbWl0JywgdGhpcy5fY29ycmVsYXRlZChldmVudCksIHRoaXMuX3JvdXRlRmFpbHVyZSk7XG4gIH1cblxuICAvLyDilIDilIAgRGV0YWNoIOKAlCBmaXJlLWFuZC1mb3JnZXQgY2hpbGQgZmxvd2NoYXJ0IGV4ZWN1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy9cbiAgLy8gRGVsZWdhdGVzIHRvIHRoZSBzaGFyZWQgYGRldGFjaC9zcGF3bmAgaGVscGVyLCB3aGljaCBtaW50cyBhIHJlZklkXG4gIC8vIGZyb20gdGhpcyBzdGFnZSdzIGBydW50aW1lU3RhZ2VJZGAgYW5kIGNhbGxzIGBkcml2ZXIuc2NoZWR1bGUoKWAuXG4gIC8vIFJvdXRlZCB0aHJvdWdoIGBjcmVhdGVUeXBlZFNjb3BlYCBhcyBgc2NvcGUuJGRldGFjaEFuZEpvaW5MYXRlciguLi4pYFxuICAvLyBhbmQgYHNjb3BlLiRkZXRhY2hBbmRGb3JnZXQoLi4uKWAuXG5cbiAgLyoqIFNlZSBgU2NvcGVNZXRob2RzLiRkZXRhY2hBbmRKb2luTGF0ZXJgLiAqL1xuICBkZXRhY2hBbmRKb2luTGF0ZXIoZHJpdmVyOiBEZXRhY2hEcml2ZXIsIGNoaWxkOiBGbG93Q2hhcnQsIGlucHV0PzogdW5rbm93bik6IERldGFjaEhhbmRsZSB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChkZXRhY2hLZXkoY2hpbGQpLCAnZGV0YWNoJyk7XG4gICAgcmV0dXJuIGRldGFjaEFuZEpvaW5MYXRlclNwYXduKGRyaXZlciwgY2hpbGQsIGlucHV0LCB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQpO1xuICB9XG5cbiAgLyoqIFNlZSBgU2NvcGVNZXRob2RzLiRkZXRhY2hBbmRGb3JnZXRgLiAqL1xuICBkZXRhY2hBbmRGb3JnZXQoZHJpdmVyOiBEZXRhY2hEcml2ZXIsIGNoaWxkOiBGbG93Q2hhcnQsIGlucHV0PzogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoZGV0YWNoS2V5KGNoaWxkKSwgJ2RldGFjaCcpO1xuICAgIGRldGFjaEFuZEZvcmdldFNwYXduKGRyaXZlciwgY2hpbGQsIGlucHV0LCB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBzdWJmbG93UGF0aCAob3V0ZXIg4oaSIGlubmVyKSBmb3IgZXZlbnQgZW5yaWNobWVudC5cbiAgICpcbiAgICogUGFyc2VzIGZyb20gYHJ1bnRpbWVTdGFnZUlkYCB3aGljaCBoYXMgdGhlIGZvcm1hdFxuICAgKiBgW3N1YmZsb3dQYXRoL11zdGFnZUlkI2V4ZWN1dGlvbkluZGV4YCAoc2VlIGBsaWIvaWRzL3J1bnRpbWVTdGFnZUlkLnRzYCkuXG4gICAqIFN1YmZsb3cgaXNvbGF0aW9uIHByZXZlbnRzIHdhbGtpbmcgdGhlIHBhcmVudC1jaGFpbiBhY3Jvc3MgYm91bmRhcmllcyxcbiAgICogc28gdGhlIHJ1bnRpbWVTdGFnZUlkIOKAlCBnbG9iYWxseSB1bmlxdWUsIGluY2x1ZGVzIGZ1bGwgcGF0aCDigJQgaXMgdGhlXG4gICAqIGNhbm9uaWNhbCBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBzdWJmbG93IGhpZXJhcmNoeSBhdCBlbWl0IHRpbWUuXG4gICAqXG4gICAqIEV4YW1wbGVzOlxuICAgKiAgICdzZWVkIzAnICAgICAgICAgICAgICAgICDihpIgW10gICAgICAgICAgICAgICAgICAgIChyb290KVxuICAgKiAgICdzZi1pbm5lci9pbm5lciM1JyAgICAgICDihpIgWydzZi1pbm5lciddXG4gICAqICAgJ3NmLWEvc2YtYi9zdGFnZSMzJyAgICAgIOKGkiBbJ3NmLWEnLCAnc2YtYiddICAgICAgKG5lc3RlZClcbiAgICovXG4gIHByaXZhdGUgX2dldFN1YmZsb3dQYXRoKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICBjb25zdCBydGlkID0gdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkO1xuICAgIGlmICghcnRpZCkgcmV0dXJuIFNjb3BlRmFjYWRlLl9FTVBUWV9TVUJGTE9XX1BBVEg7XG4gICAgLy8gVGhlIGdyYW1tYXIncyBvbmUgb3duZXIgcmVhZHMgdGhlIHBhdGggcG9ydGlvbiAoYGlkcy9ydW50aW1lU3RhZ2VJZC50c2ApLlxuICAgIGNvbnN0IHNlZ21lbnRzID0gc3ViZmxvd1NlZ21lbnRzT2YocnRpZCk7XG4gICAgaWYgKHNlZ21lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFNjb3BlRmFjYWRlLl9FTVBUWV9TVUJGTE9XX1BBVEg7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoc2VnbWVudHMpO1xuICB9XG5cbiAgLy8g4pSA4pSAIE5vbi1UcmFja2luZyBTdGF0ZSBJbnNwZWN0aW9uIChmb3IgVHlwZWRTY29wZSBwcm94eSBpbnRlcm5hbHMpIOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBSZXR1cm5zIGFsbCBzdGF0ZSBrZXlzIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBUeXBlZFNjb3BlIG93bktleXMvaGFzIHRyYXBzLiAqL1xuICBnZXRTdGF0ZUtleXMoKTogc3RyaW5nW10ge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoJyonKTtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuX3N0YWdlQ29udGV4dC5nZXRWYWx1ZShbXSwgdW5kZWZpbmVkKTtcbiAgICBpZiAoIXNuYXBzaG90IHx8IHR5cGVvZiBzbmFwc2hvdCAhPT0gJ29iamVjdCcpIHJldHVybiBbXTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc25hcHNob3QgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICB9XG5cbiAgLyoqIENoZWNrIGtleSBleGlzdGVuY2Ugd2l0aG91dCBmaXJpbmcgb25SZWFkLiBVc2VkIGJ5IFR5cGVkU2NvcGUgaGFzIHRyYXAuXG4gICAqICBDb250cmFjdDogcmV0dXJucyBmYWxzZSBmb3Iga2V5cyBuZXZlciBzZXQgT1Iga2V5cyBzZXQgdG8gdW5kZWZpbmVkLlxuICAgKiAgVGhpcyBtYXRjaGVzIGRlbGV0ZVZhbHVlKCkgc2VtYW50aWNzIChzZXRzIHRvIHVuZGVmaW5lZCA9IGRlbGV0ZWQpLiAqL1xuICBoYXNLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKGtleSk7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRWYWx1ZShbXSwga2V5KSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFJlYWQgc3RhdGUgd2l0aG91dCBmaXJpbmcgb25SZWFkLiBVc2VkIGJ5IGFycmF5IHByb3h5IGdldEN1cnJlbnQoKSB0byBhdm9pZFxuICAgKiAgcGhhbnRvbSByZWFkcyBvbiBpbnRlcm5hbCBhcnJheSBvcGVyYXRpb25zICgubGVuZ3RoLCAuaGFzLCBpdGVyYXRpb24sIGV0Yy4pLlxuICAgKiAgVGhlIGluaXRpYWwgcHJvcGVydHkgYWNjZXNzIGZpcmVzIG9uZSB0cmFja2VkIG9uUmVhZCB2aWEgZ2V0VmFsdWUoKTsgc3Vic2VxdWVudFxuICAgKiAgaW50ZXJuYWwgYXJyYXkgb3BlcmF0aW9ucyB1c2UgdGhpcyBtZXRob2QgdG8gc3RheSBzaWxlbnQuXG4gICAqICBOT1RFOiBMaWtlIGdldFZhbHVlKCksIHJldHVybnMgdGhlIHJhdyB2YWx1ZSB0byB0aGUgY2FsbGVyLiBSZWRhY3Rpb24gYXBwbGllc1xuICAgKiAgb25seSB0byByZWNvcmRlciBkaXNwYXRjaCDigJQgaXQgZG9lcyBub3QgZmlsdGVyIHRoZSByZXR1cm5lZCB2YWx1ZS4gVGhpcyBtYXRjaGVzXG4gICAqICB0aGUgZXhpc3RpbmcgZ2V0VmFsdWUoKSBjb250cmFjdCB3aGVyZSB1c2VyIGNvZGUgYWx3YXlzIHJlY2VpdmVzIHJhdyBkYXRhLlxuICAgKlxuICAgKiAgUkZDLTAwMyBEMjogYSBzaWxlbnQgcmVhZCBvZiBhIGtleSB0aGlzIHN0YWdlIG5ldmVyIFRSQUNLRUQtcmVhZCBtYXJrc1xuICAgKiAgdGhlIHN0YWdlJ3MgY29tbWl0IHdpdGggYHVudHJhY2tlZFNvdXJjZXM6IFsnc2lsZW50J11gIOKAlCBhIGNhdXNhbCBzbGljZVxuICAgKiAgYnVpbHQgZnJvbSBvblJlYWQgZXZlbnRzIHdvdWxkIG1pc3MgdGhpcyBkZXBlbmRlbmN5LCBhbmQgY29uc3VtZXJzIG11c3RcbiAgICogIGJlIHRvbGQuIFNpbGVudCByZWFkcyBzaGFkb3dlZCBieSBhIHRyYWNrZWQgcmVhZCBvZiB0aGUgc2FtZSBrZXkgKHRoZVxuICAgKiAgYXJyYXktcHJveHkgcGF0dGVybiBhYm92ZSkgYXJlIG5vdCBmbGFnZ2VkOiB0aGVpciBlZGdlIGlzIGNhcHR1cmVkLiBBXG4gICAqICB3aG9sZS1zdGF0ZSBzaWxlbnQgcmVhZCAobm8ga2V5KSBpcyBhbHdheXMgZmxhZ2dlZC4gKi9cbiAgZ2V0VmFsdWVTaWxlbnQoa2V5Pzogc3RyaW5nKTogdW5rbm93biB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChrZXkgPz8gJyonKTtcbiAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwgIXRoaXMuX3RyYWNrZWRSZWFkS2V5cy5oYXMoa2V5KSkge1xuICAgICAgdGhpcy5fc3RhZ2VDb250ZXh0Lm1hcmtVbnRyYWNrZWRTb3VyY2UoJ3NpbGVudCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VDb250ZXh0LmdldFZhbHVlRGlyZWN0KFtdLCBrZXkpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFN0YXRlIEFjY2VzcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBnZXRJbml0aWFsVmFsdWVGb3Ioa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VDb250ZXh0LmdldEdsb2JhbD8uKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhY2tlZCByZWFkIG9mIHNoYXJlZCBzdGF0ZS5cbiAgICpcbiAgICogKipSZWFkIHZhbHVlcyBhcmUgQk9SUk9XRUQg4oCUIGRvIG5vdCBtdXRhdGUgdGhlbS4qKiBTaW5jZSB0aGUgbGF6eSBidWZmZXJcbiAgICogKCMxMyksIHJlYWRzIGJlZm9yZSB0aGUgc3RhZ2UncyBmaXJzdCB3cml0ZSByZXR1cm4gcmVmZXJlbmNlcyBJTlRPXG4gICAqIENPTU1JVFRFRCBTSEFSRUQgU1RBVEUsIGFuZCByZWFkcyBhZnRlciBhIHdyaXRlIHJldHVybiByZWZlcmVuY2VzIGludG9cbiAgICogdGhlIHN0YWdlJ3MgcHJpdmF0ZSB0cmFuc2FjdGlvbi1idWZmZXIgd29ya2luZyBjb3B5ICh0aGUgZWFnZXIgZW5naW5lXG4gICAqIHJldHVybmVkIHJlZmVyZW5jZXMgaW50byB0aGF0IHdvcmtpbmcgY29weSBmb3IgQUxMIHJlYWRzKS4gTXV0YXRpbmcgYVxuICAgKiByZXR1cm5lZCB2YWx1ZSBpbiBwbGFjZSB3b3VsZCBjb3JydXB0IHN0YXRlIHdpdGhvdXQgYSBjb21taXQgcmVjb3JkIOKAlFxuICAgKiB3cml0ZSBjaGFuZ2VzIGJhY2sgdmlhIGBzZXRWYWx1ZWAvYHVwZGF0ZVZhbHVlYCBpbnN0ZWFkLiBUeXBlZFNjb3BlXG4gICAqIGNvbnN1bWVycyBhcmUgc2FmZSBhdXRvbWF0aWNhbGx5OiB0aGUgcHJveHkgcm91dGVzIGV2ZXJ5IG11dGF0aW9uXG4gICAqIHRocm91Z2ggYHNldFZhbHVlYC9gdXBkYXRlVmFsdWVgL2NvcHktb24td3JpdGUgYXJyYXkgb3BzLlxuICAgKlxuICAgKiBUaGVyZSBpcyBkZWxpYmVyYXRlbHkgTk8gZGV2LW1vZGUgZnJlZXplIGd1YXJkIGhlcmU6IGRlZXAtZnJlZXppbmcgYVxuICAgKiBidWZmZXItc2VydmVkIHJlYWQgd291bGQgZnJlZXplIHRoZSBzdGFnZSdzIG93biB3b3JraW5nIGNvcHkgYW5kIG1ha2UgYVxuICAgKiBsZWdpdGltYXRlIHJlYWQtdGhlbi1kZWVwLXdyaXRlIHRocm93LCBhbmQgZnJlZXppbmcgYSBjb21taXR0ZWQtc3RhdGVcbiAgICogcmVhZCBtdXRhdGVzIGFuIG9iamVjdCBzaGFyZWQgd2l0aCBldmVyeSBvdGhlciBjb25zdW1lciBvZiB0aGUgbGl2ZVxuICAgKiBzdGF0ZS4gU2VlIGBzcmMvbGliL21lbW9yeS9SRUFETUUubWRgIChcIlJlYWQgdmFsdWVzIGFyZSBib3Jyb3dlZFwiKS5cbiAgICpcbiAgICogUmVjb3JkZXIgbm90ZTogdGhlIGBvblJlYWRgIGV2ZW50IGJlbG93IHBhc3NlcyB0aGUgU0FNRSBsaXZlIHJlZmVyZW5jZVxuICAgKiAobm8gY2xvbmUpIHVubGVzcyBmaWVsZC1sZXZlbCByZWRhY3Rpb24gc2NydWJzIGEgY29weSDigJQgcmVjb3JkZXJzIG11c3RcbiAgICogdHJlYXQgZXZlbnQgdmFsdWVzIGFzIHJlYWQtb25seSB0b28uXG4gICAqL1xuICBnZXRWYWx1ZShrZXk/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZUF0KFtdLCBrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhdGgtYXdhcmUgYWRhcHRlciBhY2Nlc3MuIFNlZ21lbnRzIHN0YXkgc2VwYXJhdGUgZnJvbSBsaXRlcmFsIGRvdHRlZCBrZXlzIGluIFNUQVRFO1xuICAgKiB0aGUgcmVjb3JkZXIgZXZlbnQncyBga2V5YCBpcyBvbmx5IGEgZG90LWpvaW5lZCBkaXNwbGF5IGxhYmVsLCBzbyBgWyd1c2VyJywnc3NuJ11gIGFuZFxuICAgKiBhIGxpdGVyYWwgdG9wLWxldmVsIGAndXNlci5zc24nYCBwcm9kdWNlIHRoZSBzYW1lIGV2ZW50IGtleSAoc2FtZSBmb3IgdGhlIHdyaXRlcyBiZWxvdykuXG4gICAqL1xuICBnZXRWYWx1ZUF0KHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcpIHtcbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKGtleSA9PT0gdW5kZWZpbmVkID8gcGF0aC5qb2luKCcuJykgfHwgJyonIDogWy4uLnBhdGgsIGtleV0uam9pbignLicpKTtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3N0YWdlQ29udGV4dC5nZXRWYWx1ZShwYXRoLCBrZXkpO1xuXG4gICAgLy8gUkZDLTAwMyBEMjogcmVtZW1iZXIgdHJhY2tlZCBrZXlzIHNvIGxhdGVyIFNJTEVOVCByZWFkcyBvZiB0aGUgc2FtZVxuICAgIC8vIGtleSBjb3VudCBhcyBzaGFkb3dlZCAoZWRnZSBhbHJlYWR5IGNhcHR1cmVkKSBpbnN0ZWFkIG9mIHVudHJhY2tlZC5cbiAgICAvLyBPbmx5IGEgd2hvbGUgdG9wLWxldmVsIHZhbHVlIHNoYWRvd3MgYSBsYXRlciBzaWxlbnQgcmVhZCBvZiB0aGF0IHZhbHVlLlxuICAgIC8vIFJlYWRpbmcgb25lIG5lc3RlZCBmaWVsZCBtdXN0IG5vdCBjbGFpbSB0byBoYXZlIG9ic2VydmVkIGl0cyBzaWJsaW5ncy5cbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDAgJiYga2V5ICE9PSB1bmRlZmluZWQpIHRoaXMuX3RyYWNrZWRSZWFkS2V5cy5hZGQoa2V5KTtcbiAgICBlbHNlIGlmIChwYXRoLmxlbmd0aCA9PT0gMSAmJiBrZXkgPT09IHVuZGVmaW5lZCkgdGhpcy5fdHJhY2tlZFJlYWRLZXlzLmFkZChwYXRoWzBdISk7XG5cbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEEgd2hvbGUtc3RhdGUgcmVhZCAobm8ga2V5KSBpcyBzZXJ2ZWQgd2l0aCBldmVyeSByZWRhY3RlZCBrZXkgaW5zaWRlXG4gICAgICAvLyBpdCBzY3J1YmJlZDsgYSBrZXllZCByZWFkIGlzIHNlcnZlZCB1bmRlciB0aGUga2V5J3MgdmVyZGljdC5cbiAgICAgIGNvbnN0IHdob2xlU3RhdGUgPSBwYXRoLmxlbmd0aCA9PT0gMCAmJiBrZXkgPT09IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHZlcmRpY3QgPSB3aG9sZVN0YXRlID8gQ0xFQVIgOiBrZXkgPT09IHVuZGVmaW5lZCA/IHRoaXMucnVsZS52ZXJkaWN0KHBhdGgpIDogdGhpcy5ydWxlLnZlcmRpY3RBdChwYXRoLCBrZXkpO1xuICAgICAgY29uc3QgcmVjb3JkZXJWYWx1ZSA9IHdob2xlU3RhdGUgPyB0aGlzLnJ1bGUucmV0YWluUmVjb3JkKHZhbHVlKSA6IFJlZGFjdGlvblJ1bGUuYXBwbHkodmVyZGljdCwgdmFsdWUpO1xuICAgICAgY29uc3QgZXZlbnRLZXkgPSBwYXRoLmxlbmd0aCA9PT0gMCA/IGtleSA6IChrZXkgPT09IHVuZGVmaW5lZCA/IHBhdGggOiBbLi4ucGF0aCwga2V5XSkuam9pbignLicpO1xuXG4gICAgICB0aGlzLl9pbnZva2VIb29rKCdvblJlYWQnLCB7XG4gICAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgIGtleTogZXZlbnRLZXksXG4gICAgICAgIHZhbHVlOiByZWNvcmRlclZhbHVlLFxuICAgICAgICByZWRhY3RlZDogdmVyZGljdC5raW5kICE9PSAnY2xlYXInIHx8IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHNldFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgc2hvdWxkUmVkYWN0PzogYm9vbGVhbiwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRWYWx1ZUF0KFtdLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8qKiBQYXRoLWF3YXJlIHdyaXRlcyBzaGFyZSByZWNvcmRpbmcsIHJlZGFjdGlvbiBhbmQgbGlmZXRpbWUgcG9saWN5IHdpdGggZmxhdCB3cml0ZXMuICovXG4gIHNldFZhbHVlQXQocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgc2hvdWxkUmVkYWN0PzogYm9vbGVhbiwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBldmVudEtleSA9IHBhdGgubGVuZ3RoID09PSAwID8ga2V5IDogWy4uLnBhdGgsIGtleV0uam9pbignLicpO1xuICAgIGFzc2VydE5vdFJlYWRvbmx5KHRoaXMuX3JlYWRPbmx5VmFsdWVzLCBwYXRoWzBdID8/IGtleSwgJ3dyaXRlJyk7XG4gICAgdGhpcy5hc3NlcnRMaXZlKGV2ZW50S2V5KTtcblxuICAgIC8vIERldi1tb2RlOiB3YXJuIGlmIHRoZSB2YWx1ZSBjb250YWlucyBjaXJjdWxhciByZWZlcmVuY2VzLlxuICAgIC8vIENoZWNrIEFGVEVSIGFzc2VydE5vdFJlYWRvbmx5IOKAlCBkb24ndCB3YXJuIGZvciB3cml0ZXMgdGhhdCB3aWxsIGJlIGJsb2NrZWQuXG4gICAgLy8gQ2lyY3VsYXIgdmFsdWVzIHdvcmsgKHRlcm1pbmFsIHByb3h5IGhhbmRsZXMgdGhlbSkgYnV0IGNhbiBwcm9kdWNlXG4gICAgLy8gc3VycHJpc2luZyBiZWhhdmlvciBpbiBuYXJyYXRpdmUsIEpTT04gc2VyaWFsaXphdGlvbiwgYW5kIHNuYXBzaG90cy5cbiAgICBpZiAoaXNEZXZNb2RlKCkgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKGhhc0NpcmN1bGFyUmVmZXJlbmNlKHZhbHVlKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtmb290cHJpbnRdIENpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiBzZXRWYWx1ZSgnJHtldmVudEtleX0nKS4gYCArXG4gICAgICAgICAgICAnV3JpdGVzIHBhc3QgdGhlIGN5Y2xlIGRlcHRoIHdpbGwgdXNlIHRlcm1pbmFsIHByb3h5IHRyYWNraW5nLiAnICtcbiAgICAgICAgICAgICdDb25zaWRlciBmbGF0dGVuaW5nIHRoZSBkYXRhIHN0cnVjdHVyZS4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBjb250ZXh0IGlzIHRoZSBPTkUgZnVubmVsOiBpdCBkZWNpZGVzIHRoZSB2ZXJkaWN0IChleHBsaWNpdCBmbGFnLFxuICAgIC8vIHBvbGljeSBrZXkvcGF0dGVybiwgcGVyLXJ1biBtYXJrLCBvciBmaWVsZC1sZXZlbCBzY3J1YiksIHN0YWdlcyB0aGVcbiAgICAvLyB3cml0ZSB3aXRoIHRoZSBwYXRocyB0aGUgbG9nIHdpbGwgc2NydWIsIGFuZCBoYW5kcyB0aGUgdmVyZGljdCBiYWNrIHNvXG4gICAgLy8gcmVjb3JkZXJzIHNlZSB0aGUgc2FtZSBkZWNpc2lvbiB0aGUgcmV0YWluZWQgcmVjb3JkIGhvbGRzLlxuICAgIGNvbnN0IHZlcmRpY3QgPSB0aGlzLl9zdGFnZUNvbnRleHQuc2V0T2JqZWN0KHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCwgZGVzY3JpcHRpb24pO1xuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9pbnZva2VIb29rKCdvbldyaXRlJywge1xuICAgICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAgICB2YWx1ZTogUmVkYWN0aW9uUnVsZS5hcHBseSh2ZXJkaWN0LCB2YWx1ZSksXG4gICAgICAgIG9wZXJhdGlvbjogJ3NldCcsXG4gICAgICAgIHJlZGFjdGVkOiB2ZXJkaWN0LmtpbmQgIT09ICdjbGVhcicgfHwgdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZVZhbHVlQXQoW10sIGtleSwgdmFsdWUsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8qKiBQYXRoLWF3YXJlIG1lcmdlcyB1c2UgdGhlIHNhbWUgd3JpdGUgZnVubmVsIGFzIHJlcGxhY2VtZW50cy4gKi9cbiAgdXBkYXRlVmFsdWVBdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGNvbnN0IGV2ZW50S2V5ID0gcGF0aC5sZW5ndGggPT09IDAgPyBrZXkgOiBbLi4ucGF0aCwga2V5XS5qb2luKCcuJyk7XG4gICAgYXNzZXJ0Tm90UmVhZG9ubHkodGhpcy5fcmVhZE9ubHlWYWx1ZXMsIHBhdGhbMF0gPz8ga2V5LCAnd3JpdGUnKTtcbiAgICB0aGlzLmFzc2VydExpdmUoZXZlbnRLZXkpO1xuXG4gICAgLy8gRGV2LW1vZGU6IHNhbWUgY2lyY3VsYXIgY2hlY2sgYXMgc2V0VmFsdWUgKG1lcmdlIHRhcmdldHMgY2FuIGJlIGNpcmN1bGFyIHRvbylcbiAgICBpZiAoaXNEZXZNb2RlKCkgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKGhhc0NpcmN1bGFyUmVmZXJlbmNlKHZhbHVlKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtmb290cHJpbnRdIENpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiB1cGRhdGVWYWx1ZSgnJHtldmVudEtleX0nKS4gYCArXG4gICAgICAgICAgICAnQ29uc2lkZXIgZmxhdHRlbmluZyB0aGUgZGF0YSBzdHJ1Y3R1cmUuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB2ZXJkaWN0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LnVwZGF0ZU9iamVjdChwYXRoLCBrZXksIHZhbHVlLCBkZXNjcmlwdGlvbik7XG5cbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX2ludm9rZUhvb2soJ29uV3JpdGUnLCB7XG4gICAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgIGtleTogZXZlbnRLZXksXG4gICAgICAgIHZhbHVlOiBSZWRhY3Rpb25SdWxlLmFwcGx5KHZlcmRpY3QsIHZhbHVlKSxcbiAgICAgICAgb3BlcmF0aW9uOiAndXBkYXRlJyxcbiAgICAgICAgcmVkYWN0ZWQ6IHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJyB8fCB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBkZWxldGVWYWx1ZShrZXk6IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBhc3NlcnROb3RSZWFkb25seSh0aGlzLl9yZWFkT25seVZhbHVlcywga2V5LCAnZGVsZXRlJyk7XG4gICAgdGhpcy5hc3NlcnRMaXZlKGtleSk7XG5cbiAgICAvLyBEZWxldGluZyBhIGtleSBjbGVhcnMgaXRzIHBlci1jYWxsIHJlZGFjdGlvbiBtYXJrICh0aGUgY29udGV4dCdzXG4gICAgLy8gZnVubmVsIGRvZXMgdGhhdCk7IGEgcG9saWN5IHZlcmRpY3Qgb24gdGhlIGtleSBzdXJ2aXZlcy5cbiAgICB0aGlzLl9zdGFnZUNvbnRleHQuc2V0T2JqZWN0KFtdLCBrZXksIHVuZGVmaW5lZCwgZmFsc2UsIGRlc2NyaXB0aW9uID8/IGBkZWxldGVkICR7a2V5fWAsICdkZWxldGUnKTtcblxuICAgIGlmICh0aGlzLl9yZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5faW52b2tlSG9vaygnb25Xcml0ZScsIHtcbiAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBvcGVyYXRpb246ICdkZWxldGUnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzZXRHbG9iYWwoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIHRoaXMuYXNzZXJ0TGl2ZShrZXkpO1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQuc2V0R2xvYmFsPy4oa2V5LCB2YWx1ZSwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRHbG9iYWwoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VDb250ZXh0LmdldEdsb2JhbD8uKGtleSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHNldE9iamVjdEluUm9vdChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLmFzc2VydExpdmUoa2V5KTtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VDb250ZXh0LnNldFJvb3Q/LihrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWFkLW9ubHkgKyBtaXNjIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByZWFkb25seSBpbnB1dCB2YWx1ZXMgcGFzc2VkIHRvIHRoaXMgcGlwZWxpbmUsIGNhc3QgdG8gYFRgLlxuICAgKiBPcmRpbmFyeSBtdXRhYmxlIHJlY29yZHMvYXJyYXlzIGFyZSBjb3BpZWQgYW5kIGZyb3plbiwgbm90IGZyb3plbiBpbiBwbGFjZS5cbiAgICogT3BhcXVlIGNhcGFiaWxpdGllcyBhbmQgZXhwbGljaXRseSBmcm96ZW4gd3JhcHBlcnMgcmVtYWluIGJvcnJvd2VkL2xpdmU7XG4gICAqIHNlZSBgcHJvdGVjdGlvbi9yZWFkb25seUlucHV0LnRzIMK3IGNyZWF0ZUZyb3plbkFyZ3NgIGZvciB0aGUgb3duZXJzaGlwIHJ1bGUuXG4gICAqIENhY2hlZCBhdCBjb25zdHJ1Y3Rpb24gdGltZSBmb3IgemVyby1hbGxvY2F0aW9uIHJlcGVhdGVkIGFjY2Vzcy5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB7IGFwcGxpY2FudE5hbWUsIGluY29tZSB9ID0gc2NvcGUuZ2V0QXJnczx7IGFwcGxpY2FudE5hbWU6IHN0cmluZzsgaW5jb21lOiBudW1iZXIgfT4oKTtcbiAgICogYGBgXG4gICAqXG4gICAqIFJGQy0wMDMgRDI6IGFyZ3MgYXJlIHVudHJhY2tlZCBCWSBERVNJR04sIHNvIGNhbGxpbmcgdGhpcyAod2l0aCBhY3R1YWxcbiAgICogaW5wdXQgcHJlc2VudCkgbWFya3MgdGhlIHN0YWdlJ3MgY29tbWl0IHdpdGggYHVudHJhY2tlZFNvdXJjZXM6IFsnYXJncyddYFxuICAgKiDigJQgdGVsbGluZyBjYXVzYWwtc2xpY2UgY29uc3VtZXJzIHRoZSBiYWNrd2FyZCBzbGljZSBtYXkgYmUgaW5jb21wbGV0ZVxuICAgKiBoZXJlLiBBbiBlbXB0eS1hcmdzIHJlYWQgY2FycmllcyBubyBpbmZvcm1hdGlvbiBhbmQgaXMgbm90IGZsYWdnZWQuXG4gICAqL1xuICBnZXRBcmdzPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTogVCB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZCgnJGFyZ3MnKTtcbiAgICBpZiAodGhpcy5faGFzQXJncykgdGhpcy5fc3RhZ2VDb250ZXh0Lm1hcmtVbnRyYWNrZWRTb3VyY2UoJ2FyZ3MnKTtcbiAgICByZXR1cm4gdGhpcy5fZnJvemVuQXJncyBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCDigJQgcmVhZC1vbmx5IGluZnJhc3RydWN0dXJlIHZhbHVlc1xuICAgKiB0aGF0IHByb3BhZ2F0ZSB0aHJvdWdoIG5lc3RlZCBleGVjdXRvcnMgKGxpa2UgYHByb2Nlc3MuZW52YCBmb3IgZmxvd2NoYXJ0cykuXG4gICAqXG4gICAqIENvbnRhaW5zOiBzaWduYWwgKGFib3J0IOKAlCB0aGUgcnVuJ3Mgb25lIGVmZmVjdGl2ZSBzaWduYWwpLCB0aW1lb3V0TXMsIHRyYWNlSWQsIG9wZXJhdGlvbklkLCB0cmFjZXBhcmVudCxcbiAgICogZGVhZGxpbmUgKGVwb2NoIG1zKSDigJQgdGhlIHJ1bidzIGVudiBhcyBhZG1pdHRlZCAoYGF0dGVtcHQvY29ycmVsYXRpb24udHMgwrcgYWRtaXRSdW5FbnZgOiBvbmUgb3duLWZpZWxkXG4gICAqIHNuYXBzaG90OyBgdHJhY2VwYXJlbnRgIGlzIHRoZSBjYW5vbmljYWwgaGVhZGVyIHRoZSBydW4ncyBjb3JyZWxhdGlvbiBjYXJyaWVzLCBuZXZlciB0aGUgcmVjZWl2ZWQgYnl0ZXMpLCB0aGVuXG4gICAqIGFybWVkIChgcnVubmVyL2RlYWRsaW5lLnRzIMK3IGFybVJ1bmApLiBGcm96ZW4gYXQgY29uc3RydWN0aW9uIHRpbWUuIEluaGVyaXRlZCBieSBzdWJmbG93cyBhdXRvbWF0aWNhbGx5LlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHsgc2lnbmFsLCB0cmFjZUlkIH0gPSBzY29wZS5nZXRFbnYoKTtcbiAgICogYGBgXG4gICAqXG4gICAqIFJGQy0wMDMgRDI6IGVudiBpcyB1bnRyYWNrZWQgQlkgREVTSUdOLCBzbyBjYWxsaW5nIHRoaXMgKHdpdGggYVxuICAgKiBub24tZW1wdHkgZW52aXJvbm1lbnQpIG1hcmtzIHRoZSBzdGFnZSdzIGNvbW1pdCB3aXRoXG4gICAqIGB1bnRyYWNrZWRTb3VyY2VzOiBbJ2VudiddYCDigJQgc2VlIHtAbGluayBnZXRBcmdzfS5cbiAgICovXG4gIGdldEVudigpOiBSZWFkb25seTxFeGVjdXRpb25FbnY+IHtcbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKCckZW52Jyk7XG4gICAgaWYgKHRoaXMuX2hhc0VudikgdGhpcy5fc3RhZ2VDb250ZXh0Lm1hcmtVbnRyYWNrZWRTb3VyY2UoJ2VudicpO1xuICAgIHJldHVybiB0aGlzLl9leGVjdXRpb25FbnY7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFBpcGVsaW5lSWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJbnRlcm5hbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIF9pbnZva2VIb29rPEsgZXh0ZW5kcyBTY29wZUhvb2tOYW1lPihob29rOiBLLCBldmVudDogSG9va1BheWxvYWQ8Sz4pOiB2b2lkIHtcbiAgICAvLyBUaGUgb25lIHBlci1yZWNvcmRlciBsb29wIChgcmVjb3JkZXIvaG9va3MudHMgwrcgZmlyZWApIOKAlCB0aGUgU0FNRSBpbnZva2UgcHJpbWl0aXZlIHRoZVxuICAgIC8vIGRlZmVycmVkIHRpZXIgdXNlcyBhdCBkZWxpdmVyeSB0aW1lLCBzbyB0aGUgaW5saW5lIGFuZCBkZWZlcnJlZCBwYXRocyBjYW5ub3QgZHJpZnQuXG4gICAgZmlyZSh0aGlzLl9yZWNvcmRlcnMsIGhvb2ssIHRoaXMuX2NvcnJlbGF0ZWQoZXZlbnQgYXMgb2JqZWN0KSBhcyBIb29rUGF5bG9hZDxLPiwgdGhpcy5fcm91dGVGYWlsdXJlKTtcbiAgfVxuXG4gIC8qKiBUaGUgZXZlbnQgYXMgZmlyZWQ6IHVuY2hhbmdlZCB3aXRob3V0IGEgY29ycmVsYXRpb24sIGVsc2Ugd2l0aCB0aGUgcnVuJ3MgY29ycmVsYXRpb24gYXMgaXRzIGxhc3Qga2V5LiAqL1xuICBwcml2YXRlIF9jb3JyZWxhdGVkPEUgZXh0ZW5kcyBvYmplY3Q+KGV2ZW50OiBFKTogRSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvcnJlbGF0aW9uID09PSB1bmRlZmluZWQgPyBldmVudCA6IHsgLi4uZXZlbnQsIGNvcnJlbGF0aW9uOiB0aGlzLl9jb3JyZWxhdGlvbiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzY29wZSBjaGFubmVsJ3MgaXNvbGF0aW9uOiBhIHJlY29yZGVyJ3MgdGhyb3cgYmVjb21lcyBhbiBgb25FcnJvcmAgb24gZXZlcnkgcmVjb3JkZXJcbiAgICogKHN0YW1wZWQgd2l0aCB0aGlzIHN0YWdlKSwgYW5kIGEgdGhyb3cgZnJvbSBgb25FcnJvcmAgaXRzZWxmIGlzIGRyb3BwZWQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9yb3V0ZUZhaWx1cmU6IEhvb2tGYWlsdXJlID0gKGVycm9yLCBfcmVjb3JkZXIsIGhvb2spID0+IHtcbiAgICBpZiAoaG9vayA9PT0gJ29uRXJyb3InKSByZXR1cm47XG4gICAgdGhpcy5faW52b2tlSG9vayhcbiAgICAgICdvbkVycm9yJyxcbiAgICAgIHJlY29yZGVyRmFpbHVyZUV2ZW50KFxuICAgICAgICB7XG4gICAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yLFxuICAgICAgICBob29rLFxuICAgICAgKSxcbiAgICApO1xuICB9O1xufVxuXG4vKiogVGhlIHNpZ25hbCBvZiBhIHN0YWdlIG91dHNpZGUgdGhlIHJ1bm5lciBpbiBhIHJ1biB3aXRoIG5vIHNpZ25hbDogb25lIHRoYXQgbmV2ZXIgYWJvcnRzLCBzaGFyZWQuICovXG5jb25zdCBORVZFUl9BQk9SVEVEOiBBYm9ydFNpZ25hbCA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKS5zaWduYWw7XG5cbi8qKiBUaGUgbmFtZSBhIGxhdGUgZGV0YWNoIGlzIHJlY29yZGVkIHVuZGVyOiB0aGUgY2hpbGQgY2hhcnQncyByb290IGlkIOKAlCBhIG5hbWUsIG5ldmVyIGl0cyBpbnB1dC4gKi9cbmZ1bmN0aW9uIGRldGFjaEtleShjaGlsZDogRmxvd0NoYXJ0KTogc3RyaW5nIHtcbiAgY29uc3QgaWQgPSAoY2hpbGQgYXMgeyByb290PzogeyBpZD86IHVua25vd24gfSB9IHwgdW5kZWZpbmVkKT8ucm9vdD8uaWQ7XG4gIHJldHVybiB0eXBlb2YgaWQgPT09ICdzdHJpbmcnID8gYGRldGFjaDoke2lkfWAgOiAnZGV0YWNoJztcbn1cbiJdfQ==
926
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NvcGVGYWNhZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Njb3BlL1Njb3BlRmFjYWRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRyxPQUFPLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQVdyRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RCxPQUFPLEVBQ0wsZUFBZSxJQUFJLG9CQUFvQixFQUN2QyxrQkFBa0IsSUFBSSx1QkFBdUIsR0FDOUMsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHOUQsT0FBTyxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxpQkFBaUIs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QUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDdkUsSUFBSSxJQUFJLEtBQUssU0FBUztZQUFFLE9BQU87UUFDL0IsSUFBSSxDQUFDLFdBQVcsQ0FDZCxTQUFTLEVBQ1Qsb0JBQW9CLENBQ2xCO1lBQ0UsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzFCLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU87WUFDbkMsY0FBYyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYztZQUNqRCxVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLO1NBQ3JDLEVBQ0QsS0FBSyxFQUNMLElBQUksQ0FDTCxDQUNGLENBQUM7SUFDSixDQUFDLENBQUM7O0FBR0osdUdBQXVHO0FBQ3ZHLE1BQU0sYUFBYSxHQUFnQixJQUFJLGVBQWUsRUFBRSxDQUFDLE1BQU0sQ0FBQztBQUVoRSxxR0FBcUc7QUFDckcsU0FBUyxTQUFTLENBQUMsS0FBZ0I7SUFDakMsTUFBTSxFQUFFLEdBQUksS0FBaUQsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO0lBQ3hFLE9BQU8sT0FBTyxFQUFFLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7QUFDNUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2NvcGVGYWNhZGUg4oCUIEJhc2UgY2xhc3MgdGhhdCBsaWJyYXJ5IGNvbnN1bWVycyBleHRlbmQgdG8gY3JlYXRlIGN1c3RvbSBzY29wZSBjbGFzc2VzXG4gKlxuICogV3JhcHMgU3RhZ2VDb250ZXh0IChmcm9tIG1lbW9yeS8pIHRvIHByb3ZpZGUgYSBjb25zdW1lci1mcmllbmRseSBBUEkgZm9yXG4gKiBzdGF0ZSBhY2Nlc3MsIGRlYnVnIGxvZ2dpbmcsIG1ldHJpY3MsIGFuZCByZWNvcmRlciBob29rcy5cbiAqXG4gKiBDb25zdW1lcnMgZXh0ZW5kIHRoaXMgY2xhc3MgdG8gYWRkIGRvbWFpbi1zcGVjaWZpYyBwcm9wZXJ0aWVzOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIE15U2NvcGUgZXh0ZW5kcyBTY29wZUZhY2FkZSB7XG4gKiAgIGdldCB1c2VyTmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRWYWx1ZSgnbmFtZScpIGFzIHN0cmluZzsgfVxuICogICBzZXQgdXNlck5hbWUodmFsdWU6IHN0cmluZykgeyB0aGlzLnNldFZhbHVlKCduYW1lJywgdmFsdWUpOyB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBzdWJmbG93U2VnbWVudHNPZiB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB7IGNhbGxTZXJpZXMsIHJ1bkNhbGwgfSBmcm9tICcuLi9hdHRlbXB0L2NhbGwuanMnO1xuaW1wb3J0IHsgY2FsbFRvdWNoZXMgfSBmcm9tICcuLi9hdHRlbXB0L2VmZmVjdC5qcyc7XG5pbXBvcnQgeyBhZG1pdEF0dGVtcHROYW1lIH0gZnJvbSAnLi4vYXR0ZW1wdC9uYW1lLmpzJztcbmltcG9ydCB7IG9ic2VydmVkUmVjb3JkLCBPYnNlcnZlZFNlcmllc0Jvb2ssIHJlYWRPYnNlcnZlZFJlcG9ydCB9IGZyb20gJy4uL2F0dGVtcHQvb2JzZXJ2ZWQuanMnO1xuaW1wb3J0IHsgYWRtaXRDYWxsUG9saWN5LCBhdHRlbXB0Q2VpbGluZyB9IGZyb20gJy4uL2F0dGVtcHQvcG9saWN5LmpzJztcbmltcG9ydCB7IHRha2VSZXRyeUxvb3BDYWxsIH0gZnJvbSAnLi4vYXR0ZW1wdC9yZXRyeUxvb3BDb250ZXh0LmpzJztcbmltcG9ydCB7IGF0dGVtcHRFbmRzQXQgfSBmcm9tICcuLi9hdHRlbXB0L3J1bm5lci5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEF0dGVtcHRDb250ZXh0LFxuICBBdHRlbXB0RXJyb3IsXG4gIENhbGxPcHRpb25zLFxuICBMYXRlV3JpdGUsXG4gIE9ic2VydmVkQXR0ZW1wdCxcbiAgUmV0cnlQb2xpY3ksXG4gIFJ1bkNvcnJlbGF0aW9uLFxufSBmcm9tICcuLi9hdHRlbXB0L3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd0NoYXJ0IH0gZnJvbSAnLi4vYnVpbGRlci90eXBlcy5qcyc7XG5pbXBvcnQgeyBoYXNDaXJjdWxhclJlZmVyZW5jZSB9IGZyb20gJy4uL2NhcHR1cmUvY2lyY3VsYXIuanMnO1xuaW1wb3J0IHtcbiAgZGV0YWNoQW5kRm9yZ2V0IGFzIGRldGFjaEFuZEZvcmdldFNwYXduLFxuICBkZXRhY2hBbmRKb2luTGF0ZXIgYXMgZGV0YWNoQW5kSm9pbkxhdGVyU3Bhd24sXG59IGZyb20gJy4uL2RldGFjaC9zcGF3bi5qcyc7XG5pbXBvcnQgdHlwZSB7IERldGFjaERyaXZlciwgRGV0YWNoSGFuZGxlIH0gZnJvbSAnLi4vZGV0YWNoL3R5cGVzLmpzJztcbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL2Rldk1vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25FbnYgfSBmcm9tICcuLi9lbmdpbmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgZGVhZEZyYW1lTWVzc2FnZSwgbGF0ZUF0dGVtcHRNZXNzYWdlIH0gZnJvbSAnLi4vbWVtb3J5L2JvcnJvd2VkTXV0YXRpb24uanMnO1xuaW1wb3J0IHsgQ0xFQVIsIFJlZGFjdGlvblJ1bGUgfSBmcm9tICcuLi9tZW1vcnkvcmVkYWN0aW9uLmpzJztcbmltcG9ydCB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgeyBIb29rRmFpbHVyZSwgSG9va1BheWxvYWQsIFNjb3BlSG9va05hbWUgfSBmcm9tICcuLi9yZWNvcmRlci9ob29rcy5qcyc7XG5pbXBvcnQgeyBmaXJlLCByZWNvcmRlckZhaWx1cmVFdmVudCB9IGZyb20gJy4uL3JlY29yZGVyL2hvb2tzLmpzJztcbmltcG9ydCB7IGFzc2VydE5vdFJlYWRvbmx5LCBjcmVhdGVGcm96ZW5BcmdzIH0gZnJvbSAnLi9wcm90ZWN0aW9uL3JlYWRvbmx5SW5wdXQuanMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJOYXRpdmVDYXB0dXJlVGFyZ2V0LCByZWdpc3RlclNjb3BlUnVudGltZSB9IGZyb20gJy4vcnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEV2ZW50LCBSZWRhY3Rpb25Qb2xpY3ksIFJlZGFjdGlvblJlcG9ydCwgU2NvcGVSZWNvcmRlciB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgY2xhc3MgU2NvcGVGYWNhZGUge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJSQU5EID0gU3ltYm9sLmZvcignU2NvcGVGYWNhZGVAdjEnKTtcblxuICAvKipcbiAgICogU2hhcmVkIHNlbnRpbmVsIHJldHVybmVkIGJ5IGBfZ2V0U3ViZmxvd1BhdGgoKWAgZm9yIHJvb3QtbGV2ZWwgc3RhZ2VzXG4gICAqIChubyBzdWJmbG93IG5lc3RpbmcpLiBBdm9pZHMgcGVyLWNhbGwgYWxsb2NhdGlvbiBvZiBhIGZyZXNoXG4gICAqIGBPYmplY3QuZnJlZXplKFtdKWAgb24gZXZlcnkgYGVtaXRFdmVudGAgaW4gdGhlIGNvbW1vbiBuby1zdWJmbG93IGNhc2UuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBfRU1QVFlfU1VCRkxPV19QQVRIOiByZWFkb25seSBzdHJpbmdbXSA9IE9iamVjdC5mcmVlemUoW10pO1xuXG4gIHByb3RlY3RlZCBfc3RhZ2VDb250ZXh0OiBTdGFnZUNvbnRleHQ7XG4gIHByb3RlY3RlZCBfc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBfcmVhZE9ubHlWYWx1ZXM/OiB1bmtub3duO1xuXG4gIC8qKiBDYWNoZWQgZGVlcGx5LWZyb3plbiBjb3B5IG9mIHJlYWRPbmx5VmFsdWVzIGZvciBnZXRBcmdzKCkuIENyZWF0ZWQgb25jZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZnJvemVuQXJnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqIEV4ZWN1dGlvbiBlbnZpcm9ubWVudCDigJQgcmVhZC1vbmx5LCBpbmhlcml0ZWQgZnJvbSBwYXJlbnQgZXhlY3V0b3IuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2V4ZWN1dGlvbkVudjogUmVhZG9ubHk8RXhlY3V0aW9uRW52PjtcblxuICAvKiogUkZDLTAwMyBEMjogdHJ1ZSB3aGVuIGBnZXRBcmdzKClgIGNhbiByZXR1cm4gYWN0dWFsIGRhdGEg4oCUIGFuIGVtcHR5XG4gICAqICBge31gIHJlYWQgY2FycmllcyBubyBpbmZvcm1hdGlvbiwgc28gaXQgaXMgbmV2ZXIgZmxhZ2dlZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfaGFzQXJnczogYm9vbGVhbjtcblxuICAvKiogUkZDLTAwMyBEMjogdHJ1ZSB3aGVuIGBnZXRFbnYoKWAgY2FuIHJldHVybiBhY3R1YWwgZGF0YS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfaGFzRW52OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBSRkMtMDAzIEQyOiBrZXlzIHRoaXMgc3RhZ2UgaGFzIFRSQUNLRUQtcmVhZCAodmlhIGBnZXRWYWx1ZShrZXkpYCkuXG4gICAqIEEgc2lsZW50IHJlYWQgb2YgYSBrZXkgaW4gdGhpcyBzZXQgaXMgU0hBRE9XRUQg4oCUIGl0cyByZWFk4oaSd3JpdGUgZWRnZSBpc1xuICAgKiBhbHJlYWR5IGNhcHR1cmVkLCBzbyBpdCBpcyBub3QgZmxhZ2dlZCBhcyBhbiB1bnRyYWNrZWQgc291cmNlLiBUaGlzIGlzXG4gICAqIHdoYXQga2VlcHMgVHlwZWRTY29wZSBhcnJheS1wcm94eSBpbnRlcm5hbHMgKHdoaWNoIGFsd2F5cyBmb2xsb3cgYVxuICAgKiB0cmFja2VkIHByb3BlcnR5IHJlYWQpIGFuZCBgJGJhdGNoQXJyYXlgIGhvbmVzdC1idXQtcXVpZXQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF90cmFja2VkUmVhZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBwcml2YXRlIF9yZWNvcmRlcnM6IFNjb3BlUmVjb3JkZXJbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBTZXQgYnkgdGhlIGNvbW1pdCBvYnNlcnZlcjogdGhpcyBzdGFnZSdzIGZyYW1lIGhhcyBmbHVzaGVkLiBBIGZhY2FkZSBpc1xuICAgKiBPTkUgc3RhZ2UgZXhlY3V0aW9uJ3MgaGFuZGxlIOKAlCB0aGUgZW5naW5lIGJ1aWxkcyBhIGZyZXNoIG9uZSBwZXIgc3RhZ2Ug4oCUXG4gICAqIGFuZCBldmVyeSBwcm94eSB0aGUgdHlwZWQgc2NvcGUgaGFuZHMgb3V0IGlzIGJvdW5kIHRvIGl0LiBBIHdyaXRlIGFycml2aW5nXG4gICAqIGFmdGVyIHRoZSBjb21taXQgY29tZXMgZnJvbSBhIGhhbmRsZSBoZWxkIHBhc3QgaXRzIHN0YWdlIChhIGNsb3N1cmUsIGFcbiAgICogbW9kdWxlLWxldmVsIGBsZXRgKSBhbmQgd291bGQgbGFuZCBpbiBhIGJ1ZmZlciBub3RoaW5nIGV2ZXIgY29tbWl0czogbm9cbiAgICogdHJhY2Ugcm93LCBzdGF0ZSB1bmNoYW5nZWQuIFNvIGl0IGlzIHJlZnVzZWQgKHtAbGluayBhc3NlcnRMaXZlfSkgaW5zdGVhZFxuICAgKiBvZiBsb3N0LiBTZWFsaW5nIGhlcmUgYW5kIG5vdCBvbiBgU3RhZ2VDb250ZXh0YCBpcyBkZWxpYmVyYXRlOiB0aGUgZnJhbWVcbiAgICogc3RheXMgcmUtdXNhYmxlIGFmdGVyIGNvbW1pdCBieSBkZXNpZ24gKCMxM2Ig4oCUIHRoZSBlbmdpbmUncyBkb3VibGUtY29tbWl0XG4gICAqIHBhdGhzIGFuZCB0aGUgc3ViZmxvdyBtZXJnZS1iYWNrIGludG8gYSBicmFuY2ggcGFyZW50IG5lZWQgaXQpLlxuICAgKi9cbiAgcHJpdmF0ZSBfY29tbWl0dGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEEgcnVsZSBvZiB0aGlzIGZhY2FkZSdzIG93biDigJQgT05MWSB3aGVuIGl0cyBjb250ZXh0IGNhcnJpZXMgbm9uZSAoYmFyZVxuICAgKiBjb250ZXh0cyBpbiB1bml0IHRlc3RzKS4gVW5kZXIgYW4gZXhlY3V0b3IgdGhlIHJ1bGUgbGl2ZXMgb24gdGhlIGNvbnRleHRcbiAgICogdHJlZSBhbmQgdGhpcyBzdGF5cyB1bnNldDsgc2VlIHtAbGluayBydWxlfS5cbiAgICovXG4gIHByaXZhdGUgX2xvY2FsUnVsZT86IFJlZGFjdGlvblJ1bGU7XG5cbiAgLyoqXG4gICAqIFRoZSBydW4ncyBjb3JyZWxhdGlvbiAoMTAuMSksIGluc3RhbGxlZCBieSB0aGUgZXhlY3V0b3IncyBjb21wb3NlZCBzY29wZSBmYWN0b3J5XG4gICAqIChgUnVuT2JzZXJ2ZXJzIMK3IGNvbXBvc2VTY29wZUZhY3RvcnlgKSDigJQgc3RhbXBlZCBMQVNUIG9uIGV2ZXJ5IHNjb3BlIGFuZCBlbWl0IGV2ZW50IHRoaXMgZmFjYWRlIGZpcmVzLFxuICAgKiBvbmx5IHdoZW4gcHJlc2VudCwgc28gYSBydW4gd2l0aG91dCBvbmUgZmlyZXMgYnl0ZS1pZGVudGljYWwgZXZlbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBfY29ycmVsYXRpb24/OiBSdW5Db3JyZWxhdGlvbjtcblxuICAvKipcbiAgICogVGhlIGF0dGVtcHQgdGhpcyBmYWNhZGUgd2FzIGJ1aWx0IGZvciAoUDFiKSDigJQgdGhlIHJ1bm5lcidzLCByZWFkIG9mZiB0aGVcbiAgICogY29udGV4dCBhdCBjb25zdHJ1Y3Rpb24uIEEgZmFjYWRlIGlzIE9ORSBhdHRlbXB0J3MgaGFuZGxlOiBvbmNlIHRoYXRcbiAgICogYXR0ZW1wdCBlbmRzIHdpdGhvdXQgYW4gYW5zd2VyIChpdHMgY2FwLCB0aGUgZGVhZGxpbmUsIGEgY2FuY2VsbGF0aW9uLCBhXG4gICAqIHRocm93KSwgdGhlIGZ1bmN0aW9uIGJlaGluZCBpdCBtYXkgc3RpbGwgYmUgcnVubmluZywgYW5kIGFueXRoaW5nIGl0XG4gICAqIHRvdWNoZXMgdGhyb3VnaCB0aGlzIGZhY2FkZSBpcyByZWZ1c2VkICh7QGxpbmsgcmVmdXNlSWZBdHRlbXB0RW5kZWR9KSDigJRcbiAgICogYSB3cml0ZSBvciBhbiBlbWl0IGlzIGFsc28gcmVjb3JkZWQgb24gdGhlIHN0YWdlLiBBYnNlbnQgZm9yIGEgc3RhZ2UgdGhlXG4gICAqIHJ1bm5lciBkb2VzIG5vdCBydW46IG5vdGhpbmcgaXMgZmVuY2VkLCBhcyBiZWZvcmUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9hdHRlbXB0PzogQXR0ZW1wdENvbnRleHQ7XG5cbiAgLyoqIFRoZSBydW4ncyBzaWduYWwsIGZvciBgJGF0dGVtcHQoKWAgb2YgYSBzdGFnZSB0aGUgcnVubmVyIGRvZXMgbm90IHJ1bi4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfcnVuU2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqIGAkY2FsbGBzIHdpdGggYG9mID4gMWAgaW4gZmxpZ2h0IHRocm91Z2ggdGhpcyBmYWNhZGUg4oCUIGEga2V5bGVzcyB0b3VjaGluZyBjYWxsIGluc2lkZSBvbmUgaXMgcmVmdXNlZCAoUDMpLiAqL1xuICBwcml2YXRlIF9yZXRyeWluZ0NhbGxzID0gMDtcblxuICAvKiogVGhpcyBhdHRlbXB0J3Mgb2JzZXJ2ZWQgcmVwb3J0cywgZ3JvdXBlZCBpbnRvIHNlcmllcyAoUDIpIOKAlCBtYWRlIG9uIHRoZSBmaXJzdCByZXBvcnQuICovXG4gIHByaXZhdGUgX29ic2VydmVkQm9vaz86IE9ic2VydmVkU2VyaWVzQm9vaztcblxuICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBTdGFnZUNvbnRleHQsIHN0YWdlTmFtZTogc3RyaW5nLCByZWFkT25seVZhbHVlcz86IHVua25vd24sIGV4ZWN1dGlvbkVudj86IEV4ZWN1dGlvbkVudikge1xuICAgIHRoaXMuX3N0YWdlQ29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy5fc3RhZ2VOYW1lID0gc3RhZ2VOYW1lO1xuICAgIHRoaXMuX3JlYWRPbmx5VmFsdWVzID0gcmVhZE9ubHlWYWx1ZXM7XG4gICAgdGhpcy5fZnJvemVuQXJncyA9IGNyZWF0ZUZyb3plbkFyZ3MocmVhZE9ubHlWYWx1ZXMpO1xuICAgIHRoaXMuX2V4ZWN1dGlvbkVudiA9IE9iamVjdC5mcmVlemUoeyAuLi5leGVjdXRpb25FbnYgfSk7XG4gICAgdGhpcy5faGFzQXJncyA9IE9iamVjdC5rZXlzKHRoaXMuX2Zyb3plbkFyZ3MpLmxlbmd0aCA+IDA7XG4gICAgdGhpcy5faGFzRW52ID0gT2JqZWN0LmtleXModGhpcy5fZXhlY3V0aW9uRW52KS5sZW5ndGggPiAwO1xuICAgIHRoaXMuX2F0dGVtcHQgPSBjb250ZXh0LmF0dGVtcHQ7XG4gICAgdGhpcy5fcnVuU2lnbmFsID0gY29udGV4dC5ydW5TaWduYWw7XG4gICAgLy8gVGhlIGNvbnRleHQgbXVzdCBjYXJyeSB0aGUgcnVsZSBCRUZPUkUgdGhlIGZpcnN0IHdyaXRlLCBzaW5jZSB0aGVcbiAgICAvLyBjb250ZXh0J3Mgd3JpdGUgZnVubmVsIGlzIHdoYXQgbWFya3MgYSBwZXItY2FsbCByZWRhY3RlZCBrZXkgb24gaXQuXG4gICAgLy8gVW5kZXIgYW4gZXhlY3V0b3IgdGhlIGNvbnRleHQgYWxyZWFkeSBoYXMgdGhlIHJ1bidzIHJ1bGUgKGluc3RhbGxlZCBvblxuICAgIC8vIHRoZSByb290LCBpbmhlcml0ZWQgZG93bikgYW5kIHRoaXMgcmUtaW5zdGFsbHMgdGhlIHNhbWUgb2JqZWN0OyBvbiBhXG4gICAgLy8gYmFyZSBjb250ZXh0IGl0IGluc3RhbGxzIGEgZnJlc2ggb25lLlxuICAgIHRoaXMuX3N0YWdlQ29udGV4dC51c2VSZWRhY3Rpb25SdWxlKHRoaXMucnVsZSk7XG5cbiAgICAvLyBSZWdpc3RlciBhcyBjb21taXQgb2JzZXJ2ZXIgc28gU2NvcGVSZWNvcmRlci5vbkNvbW1pdCBmaXJlcyB3aGVuIFN0YWdlQ29udGV4dC5jb21taXQoKSBpcyBjYWxsZWRcbiAgICB0aGlzLl9zdGFnZUNvbnRleHQuc2V0Q29tbWl0T2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xuICAgICAgdGhpcy5fb25Db21taXRGaXJlZChtdXRhdGlvbnMpO1xuICAgIH0pO1xuICAgIHJlZ2lzdGVyU2NvcGVSdW50aW1lKHRoaXMsIHsgdGFyZ2V0OiB0aGlzLCBoYW5kbGVzQXNzaWdubWVudHM6IGZhbHNlIH0pO1xuICAgIGlmIChjb250ZXh0LmNhcHR1cmUpIHJlZ2lzdGVyTmF0aXZlQ2FwdHVyZVRhcmdldCh0aGlzLCBjb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVkYWN0aW9uIHJ1bGUgdGhpcyBmYWNhZGUgZGVjaWRlcyB3aXRoIOKAlCB0aGUgU0FNRSBvYmplY3QgaXRzXG4gICAqIGBTdGFnZUNvbnRleHRgIHJldGFpbnMgd2l0aCAoYG1lbW9yeS9yZWRhY3Rpb24udHNgLCB0aGUgb25lIG93bmVyKS4gVW5kZXJcbiAgICogYW4gZXhlY3V0b3IgdGhlIHJ1bGUgaXMgaW5zdGFsbGVkIG9uIHRoZSBydW50aW1lIHJvb3QgYW5kIGluaGVyaXRlZCBieVxuICAgKiBldmVyeSBjb250ZXh0LCBzbyB0aGUgZmFjYWRlIHNpbXBseSByZWFkcyBpdC4gT24gYSBiYXJlIGNvbnRleHQgKHVuaXRcbiAgICogdGVzdHMsIGhhbmQtYnVpbHQgc2NvcGVzKSB0aGUgZmFjYWRlIGNyZWF0ZXMgb25lIGFuZCBpbnN0YWxscyBpdCBvbiB0aGVcbiAgICogY29udGV4dCwgc28gdGhlIGNvbnRleHQncyByZXRlbnRpb24gYW5kIHRoZSBmYWNhZGUncyByZWNvcmRlciB2aWV3c1xuICAgKiBzdGlsbCBzaGFyZSBhIHNpbmdsZSB2ZXJkaWN0LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgcnVsZSgpOiBSZWRhY3Rpb25SdWxlIHtcbiAgICBjb25zdCBzaGFyZWQgPSB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0UmVkYWN0aW9uUnVsZSgpO1xuICAgIGlmIChzaGFyZWQpIHJldHVybiBzaGFyZWQ7XG4gICAgaWYgKCF0aGlzLl9sb2NhbFJ1bGUpIHtcbiAgICAgIHRoaXMuX2xvY2FsUnVsZSA9IG5ldyBSZWRhY3Rpb25SdWxlKCk7XG4gICAgICB0aGlzLl9zdGFnZUNvbnRleHQudXNlUmVkYWN0aW9uUnVsZSh0aGlzLl9sb2NhbFJ1bGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbG9jYWxSdWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlIGEgcmVkYWN0ZWQta2V5cyBzZXQgYWNyb3NzIG11bHRpcGxlIFNjb3BlRmFjYWRlIGluc3RhbmNlcy5cbiAgICogQ2FsbCB0aGlzIHRvIG1ha2UgcmVkYWN0aW9uIHBlcnNpc3QgYWNyb3NzIHN0YWdlcyBpbiB0aGUgc2FtZSBwaXBlbGluZS5cbiAgICogKFVuZGVyIGFuIGV4ZWN1dG9yIHRoZSBydW4ncyBydWxlIGFscmVhZHkgc2hhcmVzIG9uZSBzZXQ7IHRoaXMgY2FsbCBpc1xuICAgKiB0aGVuIGEgbm8tb3AuKVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHVzZVNoYXJlZFJlZGFjdGVkS2V5cyhzaGFyZWRTZXQ6IFNldDxzdHJpbmc+KTogdm9pZCB7XG4gICAgdGhpcy5ydWxlLnVzZU1hcmtlZEtleXMoc2hhcmVkU2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHJlZGFjdGVkLWtleXMgc2V0IChmb3Igc2hhcmluZyB3aXRoIG90aGVyIHNjb3BlcykuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0UmVkYWN0ZWRLZXlzKCk6IFNldDxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5ydWxlLm1hcmtlZEtleXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhIGRlY2xhcmF0aXZlIHJlZGFjdGlvbiBwb2xpY3kuIFRoZSBwb2xpY3kgaXMgYWRkaXRpdmUg4oCUXG4gICAqIGl0IHdvcmtzIGFsb25nc2lkZSBtYW51YWwgYHNldFZhbHVlKC4uLiwgdHJ1ZSlgIGNhbGxzLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHVzZVJlZGFjdGlvblBvbGljeShwb2xpY3k6IFJlZGFjdGlvblBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucnVsZS5zZXRQb2xpY3kocG9saWN5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIHRoZSBydW4ncyBjb3JyZWxhdGlvbiDigJQgZXZlcnkgc2NvcGUgYW5kIGVtaXQgZXZlbnQgdGhpcyBmYWNhZGUgZmlyZXMgY2FycmllcyBpdDsgYHVuZGVmaW5lZGAgY2xlYXJzXG4gICAqIGl0LiBFbmdpbmUtb25seSAodGhlIGNvbXBvc2VkIHNjb3BlIGZhY3RvcnkgY2FsbHMgaXQgb25jZSBwZXIgc3RhZ2UpLCBsaWtlIGB1c2VSZWRhY3Rpb25Qb2xpY3lgLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHVzZUNvcnJlbGF0aW9uKGNvcnJlbGF0aW9uOiBSdW5Db3JyZWxhdGlvbiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMuX2NvcnJlbGF0aW9uID0gY29ycmVsYXRpb247XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFJlZGFjdGlvblBvbGljeSgpOiBSZWRhY3Rpb25Qb2xpY3kgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJ1bGUuZ2V0UG9saWN5KCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNvbXBsaWFuY2UtZnJpZW5kbHkgcmVwb3J0IG9mIGFsbCByZWRhY3Rpb24gYWN0aXZpdHkuXG4gICAqIE5ldmVyIGluY2x1ZGVzIGFjdHVhbCB2YWx1ZXMg4oCUIG9ubHkga2V5IG5hbWVzLCBmaWVsZCBuYW1lcywgYW5kIHBhdHRlcm5zLlxuICAgKi9cbiAgZ2V0UmVkYWN0aW9uUmVwb3J0KCk6IFJlZGFjdGlvblJlcG9ydCB7XG4gICAgcmV0dXJuIHRoaXMucnVsZS5yZXBvcnQoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTY29wZVJlY29yZGVyIE1hbmFnZW1lbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXR0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlcjogU2NvcGVSZWNvcmRlcik6IHZvaWQge1xuICAgIC8vIFJlcGxhY2UgZXhpc3RpbmcgcmVjb3JkZXIgd2l0aCBzYW1lIElEIChpZGVtcG90ZW50IOKAlCBwcmV2ZW50cyBkb3VibGUtY291bnRpbmcpXG4gICAgdGhpcy5fcmVjb3JkZXJzID0gdGhpcy5fcmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gcmVjb3JkZXIuaWQpO1xuICAgIHRoaXMuX3JlY29yZGVycy5wdXNoKHJlY29yZGVyKTtcbiAgfVxuXG4gIGRldGFjaFNjb3BlUmVjb3JkZXIocmVjb3JkZXJJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fcmVjb3JkZXJzID0gdGhpcy5fcmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gcmVjb3JkZXJJZCk7XG4gIH1cblxuICBnZXRTY29wZVJlY29yZGVycygpOiBTY29wZVJlY29yZGVyW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5fcmVjb3JkZXJzXTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbm90aWZ5U3RhZ2VTdGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLl9pbnZva2VIb29rKCdvblN0YWdlU3RhcnQnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbm90aWZ5U3RhZ2VFbmQoZHVyYXRpb24/OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9pbnZva2VIb29rKCdvblN0YWdlRW5kJywge1xuICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBkdXJhdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbm90aWZ5UGF1c2UocGF1c2VEYXRhPzogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uUGF1c2UnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIHBhdXNlRGF0YSxcbiAgICAgIGNoYW5uZWw6ICdzY29wZScgYXMgY29uc3QsXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG5vdGlmeVJlc3VtZShoYXNJbnB1dDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uUmVzdW1lJywge1xuICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBoYXNJbnB1dCxcbiAgICAgIGNoYW5uZWw6ICdzY29wZScgYXMgY29uc3QsXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG5vdGlmeUNvbW1pdChtdXRhdGlvbnM6IENvbW1pdEV2ZW50WydtdXRhdGlvbnMnXSk6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uQ29tbWl0Jywge1xuICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBtdXRhdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVmdXNlIGEgd3JpdGUgZnJvbSBhIGhhbmRsZSBoZWxkIHBhc3QgaXRzIHN0YWdlICg5LjIyLjApLiBUaHJvd3Mgd2l0aCB0aGVcbiAgICogc3RhZ2UgdGhlIGhhbmRsZSBjYW1lIGZyb207IHRoZSBlbmdpbmUncyBlcnJvciBwYXRoIGF0dHJpYnV0ZXMgdGhlIHRocm93XG4gICAqIHRvIHRoZSBzdGFnZSB0aGF0IG1hZGUgdGhlIHdyaXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3NlcnRMaXZlKGtleTogc3RyaW5nLCBjaGFubmVsOiBMYXRlV3JpdGVbJ2NoYW5uZWwnXSA9ICdzdGF0ZScpOiB2b2lkIHtcbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKGtleSwgY2hhbm5lbCk7XG4gICAgaWYgKHRoaXMuX2NvbW1pdHRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGRlYWRGcmFtZU1lc3NhZ2UodGhpcy5fc3RhZ2VOYW1lLCB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsIGtleSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYXR0ZW1wdCBmZW5jZSAoUDFiKTogdGhpcyBmYWNhZGUncyBhdHRlbXB0IGhhcyBlbmRlZCwgc28gd2hhdGV2ZXIgdGhlXG4gICAqIGFiYW5kb25lZCBmdW5jdGlvbiBkb2VzIG5vdyBtdXN0IG5vdCByZWFjaCB0aGUgc3RhZ2Ug4oCUIG5vdCBpdHMgYnVmZmVyLCBpdHNcbiAgICogcmVhZHMsIGl0cyB1bnRyYWNrZWQgc291cmNlcyBvciBhIHJlY29yZGVyLiBSZWZ1c2VkOyBhIHdyaXRlIG9yIGFuIGVtaXQgaXNcbiAgICogcmVjb3JkZWQgb24gdGhlIHN0YWdlIGZpcnN0IChgU3RhZ2VTbmFwc2hvdC5sYXRlV3JpdGVzYCwgdGhlIG5hbWUgb25seSksXG4gICAqIGEgcmVhZCAoYGNoYW5uZWxgIHVuZGVmaW5lZCkgaXMgbm90LlxuICAgKi9cbiAgcHJpdmF0ZSByZWZ1c2VJZkF0dGVtcHRFbmRlZChrZXk6IHN0cmluZywgY2hhbm5lbD86IExhdGVXcml0ZVsnY2hhbm5lbCddKTogdm9pZCB7XG4gICAgY29uc3QgYXR0ZW1wdCA9IHRoaXMuX2F0dGVtcHQ7XG4gICAgaWYgKGF0dGVtcHQgPT09IHVuZGVmaW5lZCB8fCAhdGhpcy5fc3RhZ2VDb250ZXh0Lmhhc0F0dGVtcHRFbmRlZChhdHRlbXB0LmF0dGVtcHQpKSByZXR1cm47XG4gICAgaWYgKGNoYW5uZWwgIT09IHVuZGVmaW5lZCkgdGhpcy5fc3RhZ2VDb250ZXh0LnJlY29yZExhdGVXcml0ZSh7IGF0dGVtcHQ6IGF0dGVtcHQuYXR0ZW1wdCwga2V5LCBjaGFubmVsIH0pO1xuICAgIHRocm93IG5ldyBFcnJvcihsYXRlQXR0ZW1wdE1lc3NhZ2UodGhpcy5fc3RhZ2VOYW1lLCBhdHRlbXB0LnNlcmllcywgYXR0ZW1wdC5hdHRlbXB0LCBrZXkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYXR0ZW1wdCB0aGlzIHN0YWdlIGZ1bmN0aW9uIHJ1bnMgaW4g4oCUIGBzY29wZS4kYXR0ZW1wdCgpYCAoZGVzaWduXG4gICAqIMKnMy4xKS4gSXRzIGBzaWduYWxgIGFib3J0cyB3aGVuIHRoZSBhdHRlbXB0IG11c3Qgc3RvcCAoaXRzIGNhcCwgdGhlIHJ1bidzXG4gICAqIGRlYWRsaW5lLCBhIGNhbmNlbGxhdGlvbik6IHBhc3MgaXQgdG8gYGZldGNoYCBhbmQgU0RLIGNhbGxzLiBJdHNcbiAgICogYHRpbWVMZWZ0TXMoKWAgcmVhZHMgdGhlIHJ1bidzIGRlYWRsaW5lIOKAlCB0aW1lIGlzIGFuIGlucHV0IHRoZSByZWNvcmRcbiAgICogY2Fubm90IHJlcGxheSwgc28gd2l0aCBhIGRlYWRsaW5lIHRoZSByZWFkIG1hcmtzIHRoZSBzdGFnZSdzIGNvbW1pdFxuICAgKiBgdW50cmFja2VkU291cmNlczogWydlbnYnXWAsIGFzIGBnZXRFbnYoKWAgZG9lcy5cbiAgICpcbiAgICogQSBzdGFnZSB0aGUgYXR0ZW1wdCBydW5uZXIgZG9lcyBub3QgcnVuIChubyByZXRyeSBwb2xpY3ksIG5vIGB0aW1lb3V0TXNgLFxuICAgKiBubyBkZWFkbGluZSkgaXMgYXR0ZW1wdCAxIG9mIDEsIHdpdGggdGhlIHJ1bidzIHNpZ25hbCBhbmQgYEluZmluaXR5YCBsZWZ0LlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHQgPSBzY29wZS4kYXR0ZW1wdCgpO1xuICAgKiBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHsgc2lnbmFsOiB0LnNpZ25hbCB9KTtcbiAgICogaWYgKHQudGltZUxlZnRNcygpIDwgMV8wMDApIHNjb3BlLnN1bW1hcnkgPSAncGFydGlhbCc7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0QXR0ZW1wdCgpOiBBdHRlbXB0Q29udGV4dCB7XG4gICAgY29uc3QgYXR0ZW1wdCA9IHRoaXMuX2F0dGVtcHQ7XG4gICAgY29uc3Qgb2JzZXJ2ZWQgPSAocmVwb3J0OiBPYnNlcnZlZEF0dGVtcHQpID0+IHRoaXMucmVjb3JkT2JzZXJ2ZWQocmVwb3J0KTtcbiAgICBpZiAoYXR0ZW1wdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIHNlcmllczogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBhdHRlbXB0OiAxLFxuICAgICAgICBvZjogMSxcbiAgICAgICAgc2lnbmFsOiB0aGlzLl9ydW5TaWduYWwgPz8gTkVWRVJfQUJPUlRFRCxcbiAgICAgICAgdGltZUxlZnRNczogKCkgPT4gSW5maW5pdHksXG4gICAgICAgIG9ic2VydmVkLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoJyRhdHRlbXB0Jyk7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuX3N0YWdlQ29udGV4dDtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAuLi5hdHRlbXB0LFxuICAgICAgdGltZUxlZnRNczogKCkgPT4ge1xuICAgICAgICAvLyBSZWFkIHRocm91Z2ggYSBoYW5kbGUgaGVsZCBwYXN0IGl0cyBhdHRlbXB0LCBpdCBtdXN0IG5vdCBtYXJrIGEgTEFURVIgYXR0ZW1wdCdzIGNvbW1pdC5cbiAgICAgICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZCgnJGF0dGVtcHQnKTtcbiAgICAgICAgaWYgKGF0dGVtcHQuZGVhZGxpbmUgIT09IHVuZGVmaW5lZCkgY29udGV4dC5tYXJrVW50cmFja2VkU291cmNlKCdlbnYnKTtcbiAgICAgICAgcmV0dXJuIGF0dGVtcHQudGltZUxlZnRNcygpO1xuICAgICAgfSxcbiAgICAgIG9ic2VydmVkLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgY2FsbCB0byBhbiBvdXRzaWRlIHN5c3RlbSwgbWFkZSBpbnNpZGUgdGhpcyBzdGFnZSDigJQgYHNjb3BlLiRjYWxsKHRhcmdldCwgZm4sIHBvbGljeT8pYCAoZGVzaWduIMKnMy42LCBQMikuXG4gICAqIGBmbmAgcnVucyBvbiB0aGUgYXR0ZW1wdCBydW5uZXIgdW5kZXIgYHBvbGljeWAgKG5vbmUgPSBPTkUgYXR0ZW1wdCwgc3RpbGwgcmVjb3JkZWQ6IGEgc2luZ2xlIGNhbGwgaXMgZXZpZGVuY2VcbiAgICogdG9vKSwgYW5kIGV2ZXJ5IGF0dGVtcHQgaXMgYW4gYEF0dGVtcHRSZWNvcmRgIG9mIGtpbmQgYCdjYWxsJ2Agb24gdGhpcyBzdGFnZSdzIGV4ZWN1dGlvbi10cmVlIG5vZGUgYW5kIG9uXG4gICAqIGBvbkF0dGVtcHRgIOKAlCBpdHMgdGltaW5nLCBvdXRjb21lLCBmYWlsdXJlIGNhdGVnb3J5IGFuZCB0aGUgcmV0cnktb3Itc3RvcCBkZWNpc2lvbiwgaXRzIGVycm9yIHNlcnZlZCB1bmRlciB0aGVcbiAgICogcnVuJ3MgcmVkYWN0aW9uIHJ1bGUuXG4gICAqXG4gICAqIFRoZSBjYWxsIGxpdmVzIHdpdGhpbiB0aGlzIHN0YWdlIGF0dGVtcHQ6IGl0IGlzIGNhcHBlZCBieSB0aGUgdGltZSB0aGUgYXR0ZW1wdCBoYXMgbGVmdCAoaXRzIGNhcCwgdGhlIHJ1bidzXG4gICAqIGRlYWRsaW5lKSBhbmQgYGZuYCdzIGBzaWduYWxgIGFib3J0cyB3aGVuIHRoZSBhdHRlbXB0IGRvZXM7IG9uY2UgdGhlIGF0dGVtcHQgaXMgb3ZlciBub3RoaW5nIG9mIHRoZSBjYWxsIGxhbmRzXG4gICAqIGFuZCBubyBmdXJ0aGVyIGF0dGVtcHQgb2YgaXQgc3RhcnRzIChgYXR0ZW1wdC9jYWxsLnRzYCkuIGB0YXJnZXRgIGlzIGEgTkFNRSBmcm9tIGNvZGUg4oCUIG5ldmVyIGEgdmFsdWUuXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcXVvdGUgPSBhd2FpdCBzY29wZS4kY2FsbCgnc3RyaXBlLnF1b3Rlcy5jcmVhdGUnLCAodCkgPT4gc3RyaXBlLnF1b3Rlcy5jcmVhdGUoYm9keSwgeyBzaWduYWw6IHQuc2lnbmFsIH0pLFxuICAgKiAgIHsgYXR0ZW1wdHM6IDMsIHRpbWVvdXRNczogMTBfMDAwLCBiYWNrb2ZmTXM6IChuKSA9PiA1MDAgKiBuIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogQSBjYWxsIHRoYXQgQ0hBTkdFUyBhbiBvdXRzaWRlIHN5c3RlbSBkZWNsYXJlcyBpdCAoUDMpOiBgb3B0aW9ucy50b3VjaGVzYCBuYW1lcyB0aGUgc3lzdGVtIGFuZFxuICAgKiBgb3B0aW9ucy5pZGVtcG90ZW5jeUtleWAgdGhlIGtleSBldmVyeSBhdHRlbXB0IGlzIG1hZGUgdW5kZXIgKGB0LmlkZW1wb3RlbmN5S2V5YCkg4oCUIGEgdmFsdWUgZnJvbSB0aGUgc3RhZ2Unc1xuICAgKiBpbnB1dCBvciBzdGF0ZSwgbmV2ZXIgZnJvbSBtb2RlbCBvdXRwdXQuIEEgdG91Y2hpbmcgY2FsbCB0aGF0IG1heSByZXRyeSB3aXRob3V0IGEga2V5IGlzIHJlZnVzZWQgaGVyZSxcbiAgICogYmVmb3JlIGFueXRoaW5nIGlzIHNlbnQ7IGVhY2ggcmVjb3JkIHNheXMgd2hhdCBpdHMgYXR0ZW1wdCBkaWQgKGBlZmZlY3RgKSwgYW5kIGEgY2FsbCB0aGF0IGVuZHMgd2l0aG91dCBhbiBhbnN3ZXIgYWZ0ZXIgYW55IGF0dGVtcHQgbGVmdCB0aGVcbiAgICogZWZmZWN0IHVua25vd24gcmVqZWN0cyB3aXRoIGBVbmtub3duRWZmZWN0RXJyb3JgIOKAlCByZWNvbmNpbGUgYnkgdGhlIGtleSwgZG8gbm90IHJldHJ5IGJsaW5kbHkuXG4gICAqL1xuICBjYWxsPFQ+KFxuICAgIHRhcmdldDogc3RyaW5nLFxuICAgIGZuOiAoYXR0ZW1wdDogQXR0ZW1wdENvbnRleHQpID0+IFByb21pc2U8VD4gfCBULFxuICAgIHBvbGljeT86IFJldHJ5UG9saWN5LFxuICAgIG9wdGlvbnM/OiBDYWxsT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgbmFtZSA9IGFkbWl0QXR0ZW1wdE5hbWUoJyRjYWxsJywgJ3RhcmdldCcsIHRhcmdldCk7XG4gICAgY29uc3Qgd2hlcmUgPSBgJGNhbGwoJyR7bmFtZX0nKWA7XG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt3aGVyZX06IGZuIG11c3QgYmUgYSBmdW5jdGlvbmApO1xuICAgIGNvbnN0IGFkbWl0dGVkID0gYWRtaXRDYWxsUG9saWN5KHdoZXJlLCBwb2xpY3kpO1xuICAgIGNvbnN0IHRvdWNoZXMgPSBjYWxsVG91Y2hlcyh3aGVyZSwgb3B0aW9ucywgYWRtaXR0ZWQpO1xuICAgIC8vIEEga2V5bGVzcyB0b3VjaGluZyBjYWxsIGlzIHNlbnQgb25jZSBvbmx5IGlmIHRoZSBzdGFnZSBhdHRlbXB0IHRoYXQgbWFrZXMgaXQgbmV2ZXIgcnVucyBhZ2FpbiAoUDMpOiBhIHN0YWdlXG4gICAgLy8gdGhhdCBtYXkgcmV0cnkgd291bGQgcmUtc2VuZCBpdCB3aXRob3V0IGEga2V5IOKAlCByZWZ1c2VkIGhlcmUsIGJlZm9yZSBhbnl0aGluZyBpcyBzZW50LlxuICAgIC8vIFNvIGlzIG9uZSBpbnNpZGUgYW4gZW5jbG9zaW5nIGAkY2FsbGAgdGhhdCBtYXkgcmV0cnkgKGl0cyBmdW5jdGlvbiBydW5zIG9uY2UgcGVyIG91dGVyIGF0dGVtcHQpLlxuICAgIGlmICh0b3VjaGVzICE9PSB1bmRlZmluZWQgJiYgdG91Y2hlcy5pZGVtcG90ZW5jeUtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBlbmNsb3NpbmcgPSAodGhpcy5fYXR0ZW1wdD8ub2YgPz8gMSkgPiAxID8gJ2Egc3RhZ2UnIDogdGhpcy5fcmV0cnlpbmdDYWxscyA+IDAgPyAnYSAkY2FsbCcgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoZW5jbG9zaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBgJHt3aGVyZX06IHRvdWNoZXMgXCIke3RvdWNoZXMuc3lzdGVtfVwiIHdpdGggbm8gaWRlbXBvdGVuY3lLZXksIGluc2lkZSAke2VuY2xvc2luZ30gdGhhdCBtYXkgcmV0cnkg4oCUIGEgYCArXG4gICAgICAgICAgICAncmV0cnkgd291bGQgc2VuZCBpdCBhZ2FpbiB3aXRob3V0IGEga2V5LiBHaXZlIHRoZSBjYWxsIGEga2V5LicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLl9zdGFnZUNvbnRleHQubWFya0tleWxlc3NFZmZlY3QoKTtcbiAgICB9XG4gICAgLy8gRnJvbSBhbiBlbmRlZCBhdHRlbXB0IG9yIGEgY29tbWl0dGVkIGZyYW1lOiByZWZ1c2VkIChhbmQgcmVjb3JkZWQgYnkgbmFtZSkgYmVmb3JlIGFueXRoaW5nIHJlYWNoZXMgb3V0c2lkZS5cbiAgICB0aGlzLnJlZnVzZUxhdGVDYWxsKGBjYWxsOiR7bmFtZX1gKTtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5fc3RhZ2VDb250ZXh0O1xuICAgIGNvbnN0IHN0YWdlQXR0ZW1wdCA9IHRoaXMuX2F0dGVtcHQ/LmF0dGVtcHQgPz8gMTtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLl9hdHRlbXB0Py5zaWduYWwgPz8gdGhpcy5fcnVuU2lnbmFsO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gYXR0ZW1wdEVuZHNBdCh0aGlzLl9hdHRlbXB0KTtcbiAgICBjb25zdCBlbmRlZCA9IGNvbnRleHQuY2FsbHNFbmRlZFNpZ25hbChzdGFnZUF0dGVtcHQpO1xuICAgIC8vIFdoaWxlIGEgY2FsbCB0aGF0IG1heSByZXRyeSBpcyBpbiBmbGlnaHQsIGEga2V5bGVzcyB0b3VjaGluZyBjYWxsIG1hZGUgaW5zaWRlIGl0IGlzIHJlZnVzZWQgKGFib3ZlKS5cbiAgICBjb25zdCByZXRyeWluZyA9IGF0dGVtcHRDZWlsaW5nKGFkbWl0dGVkLmF0dGVtcHRzKSA+IDE7XG4gICAgaWYgKHJldHJ5aW5nKSB0aGlzLl9yZXRyeWluZ0NhbGxzICs9IDE7XG4gICAgbGV0IHJlc3VsdDogUHJvbWlzZTxUPjtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gdGhpcy5zdGFydENhbGwobmFtZSwgZm4sIGFkbWl0dGVkLCB0b3VjaGVzLCBzdGFnZUF0dGVtcHQsIHNpZ25hbCwgZGVhZGxpbmUsIGVuZGVkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKHJldHJ5aW5nKSB0aGlzLl9yZXRyeWluZ0NhbGxzIC09IDE7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgaWYgKCFyZXRyeWluZykgcmV0dXJuIHJlc3VsdDtcbiAgICBjb25zdCByZWxlYXNlID0gKCkgPT4ge1xuICAgICAgdGhpcy5fcmV0cnlpbmdDYWxscyAtPSAxO1xuICAgIH07XG4gICAgcmVzdWx0LnRoZW4ocmVsZWFzZSwgcmVsZWFzZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKiBgcnVuQ2FsbGAgd2l0aCB0aGlzIHN0YWdlIGF0dGVtcHQgYXMgaXRzIGhvc3QgKGBjYWxsYCkuICovXG4gIHByaXZhdGUgc3RhcnRDYWxsPFQ+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbjogKGF0dGVtcHQ6IEF0dGVtcHRDb250ZXh0KSA9PiBQcm9taXNlPFQ+IHwgVCxcbiAgICBhZG1pdHRlZDogUmV0cnlQb2xpY3ksXG4gICAgdG91Y2hlczogeyByZWFkb25seSBzeXN0ZW06IHN0cmluZzsgcmVhZG9ubHkgaWRlbXBvdGVuY3lLZXk/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCxcbiAgICBzdGFnZUF0dGVtcHQ6IG51bWJlcixcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkLFxuICAgIGRlYWRsaW5lOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgZW5kZWQ6IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5fc3RhZ2VDb250ZXh0O1xuICAgIGNvbnN0IGxvb3AgPSB0YWtlUmV0cnlMb29wQ2FsbCh0aGlzKTtcbiAgICByZXR1cm4gcnVuQ2FsbChuYW1lLCBmbiwgYWRtaXR0ZWQsIHtcbiAgICAgIG9wZW5TZXJpZXM6ICgpID0+IGNhbGxTZXJpZXMoY29udGV4dC5ydW50aW1lU3RhZ2VJZCwgc3RhZ2VBdHRlbXB0LCBjb250ZXh0Lm5leHRDYWxsT3JkaW5hbChzdGFnZUF0dGVtcHQpKSxcbiAgICAgIC4uLihzaWduYWwgIT09IHVuZGVmaW5lZCAmJiB7IHNpZ25hbCB9KSxcbiAgICAgIC4uLihkZWFkbGluZSAhPT0gdW5kZWZpbmVkICYmIHsgZGVhZGxpbmUgfSksXG4gICAgICBlbmRlZCxcbiAgICAgIC4uLih0b3VjaGVzICE9PSB1bmRlZmluZWQgJiYgeyBlZmZlY3Q6IHRoaXMuY2FsbEVmZmVjdCh0b3VjaGVzKSB9KSxcbiAgICAgIC8vIFRoZSBmcmFtZSdzIG93biBjb21taXQgc3RhdGUgKGV2ZXJ5IGF0dGVtcHQncyBmYWNhZGUgcmVhZHMgdGhlIHNhbWUpLCBuZXZlciBhIGZhY2FkZSBmbGFnLlxuICAgICAgYWRtaXRzOiAoY3V0KSA9PiAhY29udGV4dC5jb21taXR0ZWQgJiYgKGN1dCB8fCAhKGVuZGVkLmFib3J0ZWQgfHwgdGhpcy5hdHRlbXB0SGFzRW5kZWQoKSkpLFxuICAgICAgc2VydmU6IChlcnJvcikgPT4gdGhpcy5ydWxlLnNlcnZlZEVycm9yKGVycm9yKSxcbiAgICAgIHJlcG9ydDogKHJlY29yZCwgc3RydWN0dXJlZEVycm9yKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlcnZlZCA9IGxvb3AgPyBPYmplY3QuZnJlZXplKHsgLi4ucmVjb3JkLCByZXRyeUxvb3A6IGxvb3AuaWRlbnRpdHkgfSkgOiByZWNvcmQ7XG4gICAgICAgIGNvbnRleHQucmVwb3J0Q2FsbEF0dGVtcHQoc2VydmVkLCBzdHJ1Y3R1cmVkRXJyb3IpO1xuICAgICAgICBsb29wPy5yZWNvcmQoc2VydmVkKTtcbiAgICAgIH0sXG4gICAgICByZWZ1c2VkOiAoKSA9PiBjb250ZXh0LnJlY29yZExhdGVXcml0ZSh7IGF0dGVtcHQ6IHN0YWdlQXR0ZW1wdCwga2V5OiBgY2FsbDoke25hbWV9YCwgY2hhbm5lbDogJ2F0dGVtcHQnIH0pLFxuICAgICAgb2JzZXJ2ZTogKHJlcG9ydCwgYXQpID0+IHRoaXMucmVjb3JkT2JzZXJ2ZWQocmVwb3J0LCBhdC5lbmRlZCksXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsIFRoZSBleHBsaWNpdCByZXRyeSBoZWxwZXIgb3ducyB0aGlzIHN0YXRlOyB0aGUgbm9ybWFsIHdyaXRlIHBhdGggc3RpbGwgb3ducyByZXRlbnRpb24vY29tbWl0LiAqL1xuICB3cml0ZVJldHJ5TG9vcFN0YXRlKGtleTogc3RyaW5nLCBzdGF0ZTogeyByZWFkb25seSBpZGVtcG90ZW5jeUtleTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5zZXJ2ZVJldHJ5TG9vcEtleShzdGF0ZS5pZGVtcG90ZW5jeUtleSk7XG4gICAgaWYgKGtlcHQgIT09IHN0YXRlLmlkZW1wb3RlbmN5S2V5KSB0aGlzLnJ1bGUuaW5oZXJpdEZpZWxkcyhrZXksIFsnaWRlbXBvdGVuY3lLZXknXSk7XG4gICAgdGhpcy5zZXRWYWx1ZShrZXksIHN0YXRlKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgRXhhY3RseSB0aGUgZXhpc3RpbmcgUDMga2V5LXJldGVudGlvbiBsYXc7IG9wZXJhdGlvbmFsIHN0YXRlIGtlZXBzIHRoZSByZWFsIGtleS4gKi9cbiAgc2VydmVSZXRyeUxvb3BLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJ1bGUucmV0YWluSWRlbXBvdGVuY3lLZXkoa2V5LCB7XG4gICAgICBpbnB1dDogdGhpcy5fcmVhZE9ubHlWYWx1ZXMsXG4gICAgICBzZWxlY3RlZFJlYWRzOiB0aGlzLl9zdGFnZUNvbnRleHQuc2VsZWN0ZWRSZWFkcyArICh0aGlzLl9zdGFnZUNvbnRleHQuZWZmZWN0S2V5VGFpbnRlZCA/IDEgOiAwKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgTG9vcCBzdGF0ZSBpcyBkdXJhYmxlIGRhdGE6IG5ldmVyIHBlcnNpc3QgdGhlIHRocm93biB2YWx1ZSwgc3RhY2ssIGNhdXNlIG9yIHBheWxvYWQuICovXG4gIHNlcnZlUmV0cnlMb29wRXJyb3IoZXJyb3I6IHVua25vd24pOiBBdHRlbXB0RXJyb3Ige1xuICAgIGNvbnN0IHNlcnZlZCA9IHRoaXMucnVsZS5zZXJ2ZWRFcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IHNlcnZlZC5tZXNzYWdlLFxuICAgICAgLi4uKHNlcnZlZC5uYW1lICE9PSB1bmRlZmluZWQgPyB7IG5hbWU6IHNlcnZlZC5uYW1lIH0gOiB7fSksXG4gICAgICAuLi4oc2VydmVkLmNvZGUgIT09IHVuZGVmaW5lZCA/IHsgY29kZTogc2VydmVkLmNvZGUgfSA6IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEEgdG91Y2hpbmcgY2FsbCdzIHRhcmdldCwgaXRzIGtleSBzZXJ2ZWQgZm9yIHRoZSByZWNvcmRzIChgUmVkYWN0aW9uUnVsZSDCtyByZXRhaW5JZGVtcG90ZW5jeUtleWA6IGJ5IG5hbWUgYW5kIGJ5IGl0cyBzb3VyY2VzKS4gKi9cbiAgcHJpdmF0ZSBjYWxsRWZmZWN0KHRvdWNoZXM6IHsgcmVhZG9ubHkgc3lzdGVtOiBzdHJpbmc7IHJlYWRvbmx5IGlkZW1wb3RlbmN5S2V5Pzogc3RyaW5nIH0pOiB7XG4gICAgcmVhZG9ubHkgc3lzdGVtOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgaWRlbXBvdGVuY3lLZXk/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgcmVjb3JkZWRLZXk/OiBzdHJpbmc7XG4gIH0ge1xuICAgIGNvbnN0IGtleSA9IHRvdWNoZXMuaWRlbXBvdGVuY3lLZXk7XG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdG91Y2hlcztcbiAgICAvLyBBIGtleSB0aGUgc3RhZ2UgYnVpbHQgYWZ0ZXIgcmVhZGluZyBhIHNlbGVjdGVkIHZhbHVlIOKAlCBvciBmcm9tIGFuIGlucHV0IGhvbGRpbmcgb25lIOKAlCBpcyBzZXJ2ZWQgd2hvbGUuXG4gICAgY29uc3QgcmVjb3JkZWRLZXkgPSB0aGlzLnJ1bGUucmV0YWluSWRlbXBvdGVuY3lLZXkoa2V5LCB7XG4gICAgICBpbnB1dDogdGhpcy5fcmVhZE9ubHlWYWx1ZXMsXG4gICAgICAvLyBUaGUgc3RhZ2UncyBvd24ga2V5IG1heSBiZSBtYWRlIG9mIGEgc2VsZWN0ZWQgdmFsdWU6IGEga2V5IHBhc3NlZCBvbiBmcm9tIGl0IGlzIHNlcnZlZCB0aGUgc2FtZSB3YXkuXG4gICAgICBzZWxlY3RlZFJlYWRzOiB0aGlzLl9zdGFnZUNvbnRleHQuc2VsZWN0ZWRSZWFkcyArICh0aGlzLl9zdGFnZUNvbnRleHQuZWZmZWN0S2V5VGFpbnRlZCA/IDEgOiAwKSxcbiAgICB9KTtcbiAgICByZXR1cm4geyAuLi50b3VjaGVzLCByZWNvcmRlZEtleSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgYCRjYWxsYCBmcm9tIGFuIGVuZGVkIGF0dGVtcHQsIG9yIGZyb20gYSBmcmFtZSB0aGF0IGhhcyBjb21taXR0ZWQ6IHJlY29yZGVkIGJ5IG5hbWUgKGBsYXRlV3JpdGVzYCwgY2hhbm5lbFxuICAgKiBgJ2F0dGVtcHQnYCkgYW5kIHJlZnVzZWQg4oCUIGJlZm9yZSBhbnl0aGluZyByZWFjaGVzIG91dHNpZGUuIFRoZSBQMWIgZmVuY2UgZmlyc3QsIHNvIGl0cyBtZXNzYWdlIGFuZCByZWNvcmQgYXJlXG4gICAqIHRoZSBzYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSByZWZ1c2VMYXRlQ2FsbChrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoa2V5LCAnYXR0ZW1wdCcpO1xuICAgIGlmICghdGhpcy5fc3RhZ2VDb250ZXh0LmNvbW1pdHRlZCAmJiAhdGhpcy5fY29tbWl0dGVkKSByZXR1cm47XG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0LnJlY29yZExhdGVXcml0ZSh7IGF0dGVtcHQ6IHRoaXMuX2F0dGVtcHQ/LmF0dGVtcHQgPz8gMSwga2V5LCBjaGFubmVsOiAnYXR0ZW1wdCcgfSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGRlYWRGcmFtZU1lc3NhZ2UodGhpcy5fc3RhZ2VOYW1lLCB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsIGtleSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIG91dHNpZGUgYXR0ZW1wdCBhbiBhZGFwdGVyIHJlcG9ydGVkIOKAlCBgQXR0ZW1wdENvbnRleHQub2JzZXJ2ZWRgIG9uIHRoaXMgc3RhZ2UncyBhdHRlbXB0IG9yIG9uIG9uZSBvZiBpdHNcbiAgICogY2FsbHMnIChQMikuIFJlYWQgYW5kIHZhbGlkYXRlZCBmaXJzdCAoYSBtYWxmb3JtZWQgcmVwb3J0IGlzIHRoZSBhZGFwdGVyJ3MgYnVnOiBhIGBUeXBlRXJyb3JgLCBhbmQgaXQgbmV2ZXJcbiAgICogcmVhY2hlcyB0aGUgcmVjb3JkKS4gQSByZXBvcnQgdGhhdCBjb21lcyBhZnRlciBpdHMgYXR0ZW1wdCBlbmRlZCDigJQgdGhlIGNhbGwgYXR0ZW1wdCBpdCB3YXMgbWFkZSB0aHJvdWdoLCB0aGlzXG4gICAqIHN0YWdlIGF0dGVtcHQsIG9yIHRoZSBmcmFtZSdzIGNvbW1pdCDigJQgaXMgcmVjb3JkZWQgYnkgbmFtZSAoYGxhdGVXcml0ZXNgLCBjaGFubmVsIGAnYXR0ZW1wdCdgKSBhbmQgRFJPUFBFRCxcbiAgICogbmV2ZXIgdGhyb3duOiBhZGFwdGVycyByZXBvcnQgZnJvbSBhbiBTREsncyBvd24gY2FsbGJhY2tzLCB3aGljaCBtYXkgZmlyZSBhZnRlciB0aGUgc3RhZ2UgbW92ZWQgb24sIGFuZCBhblxuICAgKiBvYnNlcnZlZCBhdHRlbXB0IG5ldmVyIGNoYW5nZXMgY29udHJvbCBmbG93IOKAlCBpbiBlaXRoZXIgZGlyZWN0aW9uLiBJdHMgc2VyaWVzIG9wZW5zIGF0IHRoaXMgc3RhZ2UgYXR0ZW1wdCdzIGNhbGxcbiAgICogbGV2ZWw6IGFuIFNESydzIGNhbGwgaXMgYSBjYWxsIHRoZSBzdGFnZSBhdHRlbXB0IG1hZGUsIHNvIGEgcmVwb3J0IG1hZGUgdGhyb3VnaCBhIGAkY2FsbGAgaXMgdGhhdCBjYWxsJ3Mgc2libGluZy5cbiAgICovXG4gIHByaXZhdGUgcmVjb3JkT2JzZXJ2ZWQocmVwb3J0OiBPYnNlcnZlZEF0dGVtcHQsIGNhbGxBdHRlbXB0RW5kZWQgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IHJlYWQgPSByZWFkT2JzZXJ2ZWRSZXBvcnQocmVwb3J0KTtcbiAgICBjb25zdCBrZXkgPSBgb2JzZXJ2ZWQ6JHtyZWFkLnRhcmdldH1gO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9zdGFnZUNvbnRleHQ7XG4gICAgY29uc3Qgc3RhZ2VBdHRlbXB0ID0gdGhpcy5fYXR0ZW1wdD8uYXR0ZW1wdCA/PyAxO1xuICAgIGlmIChjYWxsQXR0ZW1wdEVuZGVkIHx8IHRoaXMuYXR0ZW1wdEhhc0VuZGVkKCkgfHwgY29udGV4dC5jb21taXR0ZWQgfHwgdGhpcy5fY29tbWl0dGVkKSB7XG4gICAgICBjb250ZXh0LnJlY29yZExhdGVXcml0ZSh7IGF0dGVtcHQ6IHN0YWdlQXR0ZW1wdCwga2V5LCBjaGFubmVsOiAnYXR0ZW1wdCcgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGJvb2sgPSAodGhpcy5fb2JzZXJ2ZWRCb29rID8/PSBuZXcgT2JzZXJ2ZWRTZXJpZXNCb29rKCgpID0+XG4gICAgICBjYWxsU2VyaWVzKGNvbnRleHQucnVudGltZVN0YWdlSWQsIHN0YWdlQXR0ZW1wdCwgY29udGV4dC5uZXh0Q2FsbE9yZGluYWwoc3RhZ2VBdHRlbXB0KSksXG4gICAgKSk7XG4gICAgY29uc3QgeyByZWNvcmQsIHN0cnVjdHVyZWRFcnJvciB9ID0gb2JzZXJ2ZWRSZWNvcmQocmVhZCwge1xuICAgICAgc2VyaWVzOiBib29rLnNlcmllc0ZvcihyZWFkKSxcbiAgICAgIG5vdzogRGF0ZS5ub3csXG4gICAgICBzZXJ2ZTogKGVycm9yKSA9PiB0aGlzLnJ1bGUuc2VydmVkRXJyb3IoZXJyb3IpLFxuICAgIH0pO1xuICAgIGNvbnRleHQucmVwb3J0Q2FsbEF0dGVtcHQocmVjb3JkLCBzdHJ1Y3R1cmVkRXJyb3IpO1xuICB9XG5cbiAgLyoqIFRoaXMgZmFjYWRlJ3MgYXR0ZW1wdCBoYXMgZW5kZWQg4oCUIHRoZSBQMWIgZmVuY2UgaXMgY2xvc2VkLiAqL1xuICBwcml2YXRlIGF0dGVtcHRIYXNFbmRlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBhdHRlbXB0ID0gdGhpcy5fYXR0ZW1wdDtcbiAgICByZXR1cm4gYXR0ZW1wdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX3N0YWdlQ29udGV4dC5oYXNBdHRlbXB0RW5kZWQoYXR0ZW1wdC5hdHRlbXB0KTtcbiAgfVxuXG4gIC8qKiBDYWxsZWQgYnkgU3RhZ2VDb250ZXh0LmNvbW1pdCgpIG9ic2VydmVyLiBDb252ZXJ0cyB0cmFja2VkIHdyaXRlcyB0byBDb21taXRFdmVudCBmb3JtYXQuXG4gICAqICBFcnJvcnMgYXJlIGNhdWdodCB0byBwcmV2ZW50IHJlY29yZGVyIGlzc3VlcyBmcm9tIGFib3J0aW5nIHRoZSB0cmF2ZXJzYWwuICovXG4gIHByaXZhdGUgX29uQ29tbWl0RmlyZWQobXV0YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9Pik6IHZvaWQge1xuICAgIHRoaXMuX2NvbW1pdHRlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICAvLyBgX3N0YWdlV3JpdGVzYCBhbHJlYWR5IGhvbGRzIHRoZSByZXRhaW5lZCBmb3JtICh0aGUgY29udGV4dCByZXRhaW5zXG4gICAgICAvLyB1bmRlciB0aGUgc2FtZSBydWxlKTsgYXBwbHlpbmcgdGhlIHZlcmRpY3QgYWdhaW4gaGVyZSBpcyBpZGVtcG90ZW50XG4gICAgICAvLyBhbmQga2VlcHMgYSBrZXkgbWFya2VkIEFGVEVSIGl0cyB3cml0ZSBzY3J1YmJlZCBhdCBjb21taXQgdGltZS5cbiAgICAgIGNvbnN0IGNvbW1pdE11dGF0aW9uczogQ29tbWl0RXZlbnRbJ211dGF0aW9ucyddID0gT2JqZWN0LmVudHJpZXMobXV0YXRpb25zKS5tYXAoKFtrZXksIGVudHJ5XSkgPT4gKHtcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZTogdGhpcy5ydWxlLnJldGFpbihba2V5XSwgZW50cnkudmFsdWUpLFxuICAgICAgICBvcGVyYXRpb246IGVudHJ5Lm9wZXJhdGlvbixcbiAgICAgIH0pKTtcblxuICAgICAgdGhpcy5ub3RpZnlDb21taXQoY29tbWl0TXV0YXRpb25zKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFN3YWxsb3cg4oCUIHJlY29yZGVyIGVycm9ycyBtdXN0IG5vdCBhYm9ydCB0aGUgdHJhdmVyc2FsLlxuICAgICAgLy8gSW5kaXZpZHVhbCByZWNvcmRlciBlcnJvcnMgYXJlIGFscmVhZHkgaXNvbGF0ZWQgYnkgX2ludm9rZUhvb2suXG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIERlYnVnIC8gRGlhZ25vc3RpY3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vXG4gIC8vIFRoZXNlIGxlZ2FjeSBtZXRob2RzIHN0aWxsIHdyaXRlIHRvIHRoZSBgU3RhZ2VDb250ZXh0YCBkaWFnbm9zdGljXG4gIC8vIHNpZGUgYmFncyAobG9nQ29udGV4dCAvIGVycm9yQ29udGV4dCAvIG1ldHJpY0NvbnRleHQgLyBldmFsQ29udGV4dCkgZm9yXG4gIC8vIHNuYXBzaG90IGluY2x1c2lvbi4gVGhleSBBTFNPIGZpcmUgdGhyb3VnaCB0aGUgRW1pdCBjaGFubmVsIHNvIGFueVxuICAvLyBhdHRhY2hlZCBgRW1pdFJlY29yZGVyYCBzZWVzIHRoZW0gaW4gcmVhbCB0aW1lIOKAlCBjbG9zaW5nIHRoZVxuICAvLyBsb25nLXN0YW5kaW5nIGdhcCB3aGVyZSBgJGRlYnVnYC9gJG1ldHJpY2Agd2VudCB0byB1bm9ic2VydmVkIGJhZ3MuXG5cbiAgYWRkRGVidWdJbmZvKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoYGxvZy5kZWJ1Zy4ke2tleX1gLCAnZW1pdCcpO1xuICAgIGNvbnN0IGtlcHQgPSB0aGlzLl9zdGFnZUNvbnRleHQuYWRkRGlhZ25vc3RpYygnbG9ncycsIGtleSwgdmFsdWUpO1xuICAgIHRoaXMuZW1pdEV2ZW50KGBsb2cuZGVidWcuJHtrZXl9YCwgeyBrZXksIHZhbHVlOiBrZXB0LCBsZXZlbDogJ2RlYnVnJyB9KTtcbiAgfVxuXG4gIGFkZERlYnVnTWVzc2FnZSh2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoJ2xvZy5kZWJ1Zy5tZXNzYWdlcycsICdlbWl0Jyk7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMuX3N0YWdlQ29udGV4dC5hZGREaWFnbm9zdGljKCdsb2dzJywgJ21lc3NhZ2VzJywgW3ZhbHVlXSk7XG4gICAgdGhpcy5lbWl0RXZlbnQoJ2xvZy5kZWJ1Zy5tZXNzYWdlcycsIHsgdmFsdWU6IEFycmF5LmlzQXJyYXkoa2VwdCkgPyBrZXB0WzBdIDoga2VwdCwgbGV2ZWw6ICdkZWJ1ZycgfSk7XG4gIH1cblxuICBhZGRFcnJvckluZm8oa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChgbG9nLmVycm9yLiR7a2V5fWAsICdlbWl0Jyk7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMuX3N0YWdlQ29udGV4dC5hZGREaWFnbm9zdGljKCdlcnJvcnMnLCBrZXksIHZhbHVlKTtcbiAgICB0aGlzLmVtaXRFdmVudChgbG9nLmVycm9yLiR7a2V5fWAsIHsga2V5LCB2YWx1ZToga2VwdCwgbGV2ZWw6ICdlcnJvcicgfSk7XG4gIH1cblxuICBhZGRNZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoYG1ldHJpYy4ke21ldHJpY05hbWV9YCwgJ2VtaXQnKTtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LmFkZERpYWdub3N0aWMoJ21ldHJpY3MnLCBtZXRyaWNOYW1lLCB2YWx1ZSk7XG4gICAgdGhpcy5lbWl0RXZlbnQoYG1ldHJpYy4ke21ldHJpY05hbWV9YCwgeyBuYW1lOiBtZXRyaWNOYW1lLCB2YWx1ZToga2VwdCB9KTtcbiAgfVxuXG4gIGFkZEV2YWwobWV0cmljTmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoYGV2YWwuJHttZXRyaWNOYW1lfWAsICdlbWl0Jyk7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMuX3N0YWdlQ29udGV4dC5hZGREaWFnbm9zdGljKCdldmFscycsIG1ldHJpY05hbWUsIHZhbHVlKTtcbiAgICB0aGlzLmVtaXRFdmVudChgZXZhbC4ke21ldHJpY05hbWV9YCwgeyBuYW1lOiBtZXRyaWNOYW1lLCB2YWx1ZToga2VwdCB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBFbWl0IOKAlCBQaGFzZSAzIHByaW1hcnkgcHJpbWl0aXZlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBGaXJlIGEgc3RydWN0dXJlZCBldmVudCB0byBldmVyeSBhdHRhY2hlZCByZWNvcmRlciBpbXBsZW1lbnRpbmdcbiAgICogYG9uRW1pdGAuIFN5bmNocm9ub3VzLCBpbi1vcmRlciwgcGFzcy10aHJvdWdoIOKAlCBubyBidWZmZXJpbmcuXG4gICAqXG4gICAqIC0gKipGYXN0LXBhdGgqKjogemVybyBhbGxvY2F0aW9uICsgemVybyBjb3N0IHdoZW4gbm8gcmVjb3JkZXJzIGFyZVxuICAgKiAgIGF0dGFjaGVkIChlYXJseSByZXR1cm4gb24gZW1wdHkgbGlzdCkuXG4gICAqIC0gKipFbnJpY2htZW50Kio6IGxpYnJhcnkgYXV0by1hZGRzIGBzdGFnZU5hbWVgLCBgcnVudGltZVN0YWdlSWRgLFxuICAgKiAgIGBzdWJmbG93UGF0aGAsIGBwaXBlbGluZUlkYCwgYHRpbWVzdGFtcGAgdG8gdGhlIGV2ZW50LlxuICAgKiAtICoqUmVkYWN0aW9uKio6IGBSZWRhY3Rpb25Qb2xpY3kuZW1pdFBhdHRlcm5zYCByZWdleGVzIGFyZSBtYXRjaGVkXG4gICAqICAgYWdhaW5zdCBgbmFtZWAg4oCUIG1hdGNoZWQgZXZlbnRzIGhhdmUgdGhlaXIgcGF5bG9hZCByZXBsYWNlZCB3aXRoXG4gICAqICAgYCdbUkVEQUNURURdJ2AgYmVmb3JlIGRpc3BhdGNoLlxuICAgKiAtICoqRXJyb3IgaXNvbGF0aW9uKio6IGEgdGhyb3dpbmcgYG9uRW1pdGAgZG9lcyBub3QgcHJvcGFnYXRlIOKAlCBpdCBpc1xuICAgKiAgIGNhdWdodCBhbmQgcm91dGVkIHRvIGBvbkVycm9yYCBvbiByZW1haW5pbmcgcmVjb3JkZXJzLCBtYXRjaGluZyB0aGVcbiAgICogICBwYXR0ZXJuIHVzZWQgYnkgb3RoZXIgc2NvcGUgZXZlbnRzLlxuICAgKlxuICAgKiBDb25zdW1lcnMgY2FsbCB0aGlzIHZpYSB0aGUgYHNjb3BlLiRlbWl0KG5hbWUsIHBheWxvYWQpYCBzY29wZSBtZXRob2Q7XG4gICAqIHRoZSBtZXRob2Qgcm91dGVzIGhlcmUgdmlhIGBjcmVhdGVUeXBlZFNjb3BlYC5cbiAgICovXG4gIGVtaXRFdmVudChuYW1lOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pOiB2b2lkIHtcbiAgICAvLyBBbiBlbmRlZCBhdHRlbXB0IGVtaXRzIG5vdGhpbmcg4oCUIHJlZnVzZWQgKGFuZCByZWNvcmRlZCkgYmVmb3JlIHRoZSBmYXN0IHBhdGgsIHNvIHRoZSByZWNvcmQgZG9lcyBub3QgZGVwZW5kXG4gICAgLy8gb24gd2hldGhlciBhIHJlY29yZGVyIGhhcHBlbmVkIHRvIGJlIGF0dGFjaGVkLlxuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQobmFtZSwgJ2VtaXQnKTtcbiAgICAvLyBGYXN0LXBhdGg6IHplcm8gd29yayB3aGVuIG5vIHJlY29yZGVycyBhcmUgYXR0YWNoZWQuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIC8vIFJlZGFjdGlvbjogaWYgdGhlIGV2ZW50IG5hbWUgbWF0Y2hlcyBhbnkgZW1pdFBhdHRlcm4sIHJlcGxhY2UgcGF5bG9hZFxuICAgIC8vIHdpdGggJ1tSRURBQ1RFRF0nIEJFRk9SRSBjb25zdHJ1Y3RpbmcgdGhlIGV2ZW50IChubyBsZWFrIHRocm91Z2hcbiAgICAvLyBjb3B5LW9uLXdyaXRlLCBubyB3YXkgZm9yIHJlY29yZGVycyB0byBzZWUgdGhlIHJhdyB2YWx1ZSkuXG4gICAgY29uc3QgZmluYWxQYXlsb2FkID0gdGhpcy5ydWxlLnJldGFpbkVtaXQobmFtZSwgcGF5bG9hZCk7XG4gICAgY29uc3Qgc291cmNlUG9zaXRpb24gPSB0aGlzLl9zdGFnZUNvbnRleHQuY2FwdHVyZUVtaXRQb3NpdGlvbigpO1xuXG4gICAgLy8gQnVpbGQgdGhlIGVucmljaGVkIGV2ZW50IG9uY2U7IHBhc3MgdGhlIHNhbWUgcmVmZXJlbmNlIHRvIGFsbFxuICAgIC8vIHJlY29yZGVycyB1bmRlciB0aGVpciByZWFkLW9ubHkgY29udHJhY3QuIFNvdXJjZSBjb29yZGluYXRlcyBhcmVcbiAgICAvLyBjYXB0dXJlZCBiZWZvcmUgYW55IGlubGluZSBob29rIG9yIGRlZmVycmVkIHRhcCBvYnNlcnZlcyB0aGUgZXZlbnQuXG4gICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICBuYW1lLFxuICAgICAgcGF5bG9hZDogZmluYWxQYXlsb2FkLFxuICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd1BhdGg6IHRoaXMuX2dldFN1YmZsb3dQYXRoKCksXG4gICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAuLi4oc291cmNlUG9zaXRpb24gPT09IHVuZGVmaW5lZCA/IHt9IDogeyBzb3VyY2VQb3NpdGlvbiB9KSxcbiAgICB9IGFzIGNvbnN0O1xuXG4gICAgLy8gRGlzcGF0Y2ggd2l0aCBlcnJvciBpc29sYXRpb24g4oCUIHRoZSBzYW1lIGBmaXJlYCBsb29wIGFuZCB0aGUgc2FtZSBmYWlsdXJlIHJvdXRpbmcgYXNcbiAgICAvLyBldmVyeSBvdGhlciBzY29wZSBldmVudDogYSB0aHJvd2luZyByZWNvcmRlcidzIGVycm9yIHJlYWNoZXMgb25FcnJvciBvbiB0aGUgcmVjb3JkZXJzO1xuICAgIC8vIHRoZSBlbWl0IGxvb3AgY29udGludWVzIHVuYWZmZWN0ZWQuXG4gICAgZmlyZSh0aGlzLl9yZWNvcmRlcnMsICdvbkVtaXQnLCB0aGlzLl9jb3JyZWxhdGVkKGV2ZW50KSwgdGhpcy5fcm91dGVGYWlsdXJlKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBEZXRhY2gg4oCUIGZpcmUtYW5kLWZvcmdldCBjaGlsZCBmbG93Y2hhcnQgZXhlY3V0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvL1xuICAvLyBEZWxlZ2F0ZXMgdG8gdGhlIHNoYXJlZCBgZGV0YWNoL3NwYXduYCBoZWxwZXIsIHdoaWNoIG1pbnRzIGEgcmVmSWRcbiAgLy8gZnJvbSB0aGlzIHN0YWdlJ3MgYHJ1bnRpbWVTdGFnZUlkYCBhbmQgY2FsbHMgYGRyaXZlci5zY2hlZHVsZSgpYC5cbiAgLy8gUm91dGVkIHRocm91Z2ggYGNyZWF0ZVR5cGVkU2NvcGVgIGFzIGBzY29wZS4kZGV0YWNoQW5kSm9pbkxhdGVyKC4uLilgXG4gIC8vIGFuZCBgc2NvcGUuJGRldGFjaEFuZEZvcmdldCguLi4pYC5cblxuICAvKiogU2VlIGBTY29wZU1ldGhvZHMuJGRldGFjaEFuZEpvaW5MYXRlcmAuICovXG4gIGRldGFjaEFuZEpvaW5MYXRlcihkcml2ZXI6IERldGFjaERyaXZlciwgY2hpbGQ6IEZsb3dDaGFydCwgaW5wdXQ/OiB1bmtub3duKTogRGV0YWNoSGFuZGxlIHtcbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKGRldGFjaEtleShjaGlsZCksICdkZXRhY2gnKTtcbiAgICByZXR1cm4gZGV0YWNoQW5kSm9pbkxhdGVyU3Bhd24oZHJpdmVyLCBjaGlsZCwgaW5wdXQsIHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCk7XG4gIH1cblxuICAvKiogU2VlIGBTY29wZU1ldGhvZHMuJGRldGFjaEFuZEZvcmdldGAuICovXG4gIGRldGFjaEFuZEZvcmdldChkcml2ZXI6IERldGFjaERyaXZlciwgY2hpbGQ6IEZsb3dDaGFydCwgaW5wdXQ/OiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChkZXRhY2hLZXkoY2hpbGQpLCAnZGV0YWNoJyk7XG4gICAgZGV0YWNoQW5kRm9yZ2V0U3Bhd24oZHJpdmVyLCBjaGlsZCwgaW5wdXQsIHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIHN1YmZsb3dQYXRoIChvdXRlciDihpIgaW5uZXIpIGZvciBldmVudCBlbnJpY2htZW50LlxuICAgKlxuICAgKiBQYXJzZXMgZnJvbSBgcnVudGltZVN0YWdlSWRgIHdoaWNoIGhhcyB0aGUgZm9ybWF0XG4gICAqIGBbc3ViZmxvd1BhdGgvXXN0YWdlSWQjZXhlY3V0aW9uSW5kZXhgIChzZWUgYGxpYi9pZHMvcnVudGltZVN0YWdlSWQudHNgKS5cbiAgICogU3ViZmxvdyBpc29sYXRpb24gcHJldmVudHMgd2Fsa2luZyB0aGUgcGFyZW50LWNoYWluIGFjcm9zcyBib3VuZGFyaWVzLFxuICAgKiBzbyB0aGUgcnVudGltZVN0YWdlSWQg4oCUIGdsb2JhbGx5IHVuaXF1ZSwgaW5jbHVkZXMgZnVsbCBwYXRoIOKAlCBpcyB0aGVcbiAgICogY2Fub25pY2FsIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIHN1YmZsb3cgaGllcmFyY2h5IGF0IGVtaXQgdGltZS5cbiAgICpcbiAgICogRXhhbXBsZXM6XG4gICAqICAgJ3NlZWQjMCcgICAgICAgICAgICAgICAgIOKGkiBbXSAgICAgICAgICAgICAgICAgICAgKHJvb3QpXG4gICAqICAgJ3NmLWlubmVyL2lubmVyIzUnICAgICAgIOKGkiBbJ3NmLWlubmVyJ11cbiAgICogICAnc2YtYS9zZi1iL3N0YWdlIzMnICAgICAg4oaSIFsnc2YtYScsICdzZi1iJ10gICAgICAobmVzdGVkKVxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0U3ViZmxvd1BhdGgoKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICAgIGNvbnN0IHJ0aWQgPSB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQ7XG4gICAgaWYgKCFydGlkKSByZXR1cm4gU2NvcGVGYWNhZGUuX0VNUFRZX1NVQkZMT1dfUEFUSDtcbiAgICAvLyBUaGUgZ3JhbW1hcidzIG9uZSBvd25lciByZWFkcyB0aGUgcGF0aCBwb3J0aW9uIChgaWRzL3J1bnRpbWVTdGFnZUlkLnRzYCkuXG4gICAgY29uc3Qgc2VnbWVudHMgPSBzdWJmbG93U2VnbWVudHNPZihydGlkKTtcbiAgICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gU2NvcGVGYWNhZGUuX0VNUFRZX1NVQkZMT1dfUEFUSDtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShzZWdtZW50cyk7XG4gIH1cblxuICAvLyDilIDilIAgTm9uLVRyYWNraW5nIFN0YXRlIEluc3BlY3Rpb24gKGZvciBUeXBlZFNjb3BlIHByb3h5IGludGVybmFscykg4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFJldHVybnMgYWxsIHN0YXRlIGtleXMgd2l0aG91dCBmaXJpbmcgb25SZWFkLiBVc2VkIGJ5IFR5cGVkU2NvcGUgb3duS2V5cy9oYXMgdHJhcHMuICovXG4gIGdldFN0YXRlS2V5cygpOiBzdHJpbmdbXSB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZCgnKicpO1xuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy5fc3RhZ2VDb250ZXh0LmdldFZhbHVlKFtdLCB1bmRlZmluZWQpO1xuICAgIGlmICghc25hcHNob3QgfHwgdHlwZW9mIHNuYXBzaG90ICE9PSAnb2JqZWN0JykgcmV0dXJuIFtdO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhzbmFwc2hvdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gIH1cblxuICAvKiogQ2hlY2sga2V5IGV4aXN0ZW5jZSB3aXRob3V0IGZpcmluZyBvblJlYWQuIFVzZWQgYnkgVHlwZWRTY29wZSBoYXMgdHJhcC5cbiAgICogIENvbnRyYWN0OiByZXR1cm5zIGZhbHNlIGZvciBrZXlzIG5ldmVyIHNldCBPUiBrZXlzIHNldCB0byB1bmRlZmluZWQuXG4gICAqICBUaGlzIG1hdGNoZXMgZGVsZXRlVmFsdWUoKSBzZW1hbnRpY3MgKHNldHMgdG8gdW5kZWZpbmVkID0gZGVsZXRlZCkuICovXG4gIGhhc0tleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoa2V5KTtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VDb250ZXh0LmdldFZhbHVlKFtdLCBrZXkpICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogUmVhZCBzdGF0ZSB3aXRob3V0IGZpcmluZyBvblJlYWQuIFVzZWQgYnkgYXJyYXkgcHJveHkgZ2V0Q3VycmVudCgpIHRvIGF2b2lkXG4gICAqICBwaGFudG9tIHJlYWRzIG9uIGludGVybmFsIGFycmF5IG9wZXJhdGlvbnMgKC5sZW5ndGgsIC5oYXMsIGl0ZXJhdGlvbiwgZXRjLikuXG4gICAqICBUaGUgaW5pdGlhbCBwcm9wZXJ0eSBhY2Nlc3MgZmlyZXMgb25lIHRyYWNrZWQgb25SZWFkIHZpYSBnZXRWYWx1ZSgpOyBzdWJzZXF1ZW50XG4gICAqICBpbnRlcm5hbCBhcnJheSBvcGVyYXRpb25zIHVzZSB0aGlzIG1ldGhvZCB0byBzdGF5IHNpbGVudC5cbiAgICogIE5PVEU6IExpa2UgZ2V0VmFsdWUoKSwgcmV0dXJucyB0aGUgcmF3IHZhbHVlIHRvIHRoZSBjYWxsZXIuIFJlZGFjdGlvbiBhcHBsaWVzXG4gICAqICBvbmx5IHRvIHJlY29yZGVyIGRpc3BhdGNoIOKAlCBpdCBkb2VzIG5vdCBmaWx0ZXIgdGhlIHJldHVybmVkIHZhbHVlLiBUaGlzIG1hdGNoZXNcbiAgICogIHRoZSBleGlzdGluZyBnZXRWYWx1ZSgpIGNvbnRyYWN0IHdoZXJlIHVzZXIgY29kZSBhbHdheXMgcmVjZWl2ZXMgcmF3IGRhdGEuXG4gICAqXG4gICAqICBSRkMtMDAzIEQyOiBhIHNpbGVudCByZWFkIG9mIGEga2V5IHRoaXMgc3RhZ2UgbmV2ZXIgVFJBQ0tFRC1yZWFkIG1hcmtzXG4gICAqICB0aGUgc3RhZ2UncyBjb21taXQgd2l0aCBgdW50cmFja2VkU291cmNlczogWydzaWxlbnQnXWAg4oCUIGEgY2F1c2FsIHNsaWNlXG4gICAqICBidWlsdCBmcm9tIG9uUmVhZCBldmVudHMgd291bGQgbWlzcyB0aGlzIGRlcGVuZGVuY3ksIGFuZCBjb25zdW1lcnMgbXVzdFxuICAgKiAgYmUgdG9sZC4gU2lsZW50IHJlYWRzIHNoYWRvd2VkIGJ5IGEgdHJhY2tlZCByZWFkIG9mIHRoZSBzYW1lIGtleSAodGhlXG4gICAqICBhcnJheS1wcm94eSBwYXR0ZXJuIGFib3ZlKSBhcmUgbm90IGZsYWdnZWQ6IHRoZWlyIGVkZ2UgaXMgY2FwdHVyZWQuIEFcbiAgICogIHdob2xlLXN0YXRlIHNpbGVudCByZWFkIChubyBrZXkpIGlzIGFsd2F5cyBmbGFnZ2VkLiAqL1xuICBnZXRWYWx1ZVNpbGVudChrZXk/OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKGtleSA/PyAnKicpO1xuICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCAhdGhpcy5fdHJhY2tlZFJlYWRLZXlzLmhhcyhrZXkpKSB7XG4gICAgICB0aGlzLl9zdGFnZUNvbnRleHQubWFya1VudHJhY2tlZFNvdXJjZSgnc2lsZW50Jyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWVEaXJlY3QoW10sIGtleSk7XG4gIH1cblxuICAvLyDilIDilIAgU3RhdGUgQWNjZXNzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGdldEluaXRpYWxWYWx1ZUZvcihrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0R2xvYmFsPy4oa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFja2VkIHJlYWQgb2Ygc2hhcmVkIHN0YXRlLlxuICAgKlxuICAgKiAqKlJlYWQgdmFsdWVzIGFyZSBCT1JST1dFRCDigJQgZG8gbm90IG11dGF0ZSB0aGVtLioqIFNpbmNlIHRoZSBsYXp5IGJ1ZmZlclxuICAgKiAoIzEzKSwgcmVhZHMgYmVmb3JlIHRoZSBzdGFnZSdzIGZpcnN0IHdyaXRlIHJldHVybiByZWZlcmVuY2VzIElOVE9cbiAgICogQ09NTUlUVEVEIFNIQVJFRCBTVEFURSwgYW5kIHJlYWRzIGFmdGVyIGEgd3JpdGUgcmV0dXJuIHJlZmVyZW5jZXMgaW50b1xuICAgKiB0aGUgc3RhZ2UncyBwcml2YXRlIHRyYW5zYWN0aW9uLWJ1ZmZlciB3b3JraW5nIGNvcHkgKHRoZSBlYWdlciBlbmdpbmVcbiAgICogcmV0dXJuZWQgcmVmZXJlbmNlcyBpbnRvIHRoYXQgd29ya2luZyBjb3B5IGZvciBBTEwgcmVhZHMpLiBNdXRhdGluZyBhXG4gICAqIHJldHVybmVkIHZhbHVlIGluIHBsYWNlIHdvdWxkIGNvcnJ1cHQgc3RhdGUgd2l0aG91dCBhIGNvbW1pdCByZWNvcmQg4oCUXG4gICAqIHdyaXRlIGNoYW5nZXMgYmFjayB2aWEgYHNldFZhbHVlYC9gdXBkYXRlVmFsdWVgIGluc3RlYWQuIFR5cGVkU2NvcGVcbiAgICogY29uc3VtZXJzIGFyZSBzYWZlIGF1dG9tYXRpY2FsbHk6IHRoZSBwcm94eSByb3V0ZXMgZXZlcnkgbXV0YXRpb25cbiAgICogdGhyb3VnaCBgc2V0VmFsdWVgL2B1cGRhdGVWYWx1ZWAvY29weS1vbi13cml0ZSBhcnJheSBvcHMuXG4gICAqXG4gICAqIFRoZXJlIGlzIGRlbGliZXJhdGVseSBOTyBkZXYtbW9kZSBmcmVlemUgZ3VhcmQgaGVyZTogZGVlcC1mcmVlemluZyBhXG4gICAqIGJ1ZmZlci1zZXJ2ZWQgcmVhZCB3b3VsZCBmcmVlemUgdGhlIHN0YWdlJ3Mgb3duIHdvcmtpbmcgY29weSBhbmQgbWFrZSBhXG4gICAqIGxlZ2l0aW1hdGUgcmVhZC10aGVuLWRlZXAtd3JpdGUgdGhyb3csIGFuZCBmcmVlemluZyBhIGNvbW1pdHRlZC1zdGF0ZVxuICAgKiByZWFkIG11dGF0ZXMgYW4gb2JqZWN0IHNoYXJlZCB3aXRoIGV2ZXJ5IG90aGVyIGNvbnN1bWVyIG9mIHRoZSBsaXZlXG4gICAqIHN0YXRlLiBTZWUgYHNyYy9saWIvbWVtb3J5L1JFQURNRS5tZGAgKFwiUmVhZCB2YWx1ZXMgYXJlIGJvcnJvd2VkXCIpLlxuICAgKlxuICAgKiBSZWNvcmRlciBub3RlOiB0aGUgYG9uUmVhZGAgZXZlbnQgYmVsb3cgcGFzc2VzIHRoZSBTQU1FIGxpdmUgcmVmZXJlbmNlXG4gICAqIChubyBjbG9uZSkgdW5sZXNzIGZpZWxkLWxldmVsIHJlZGFjdGlvbiBzY3J1YnMgYSBjb3B5IOKAlCByZWNvcmRlcnMgbXVzdFxuICAgKiB0cmVhdCBldmVudCB2YWx1ZXMgYXMgcmVhZC1vbmx5IHRvby5cbiAgICovXG4gIGdldFZhbHVlKGtleT86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlQXQoW10sIGtleSk7XG4gIH1cblxuICAvKipcbiAgICogUGF0aC1hd2FyZSBhZGFwdGVyIGFjY2Vzcy4gU2VnbWVudHMgc3RheSBzZXBhcmF0ZSBmcm9tIGxpdGVyYWwgZG90dGVkIGtleXMgaW4gU1RBVEU7XG4gICAqIHRoZSByZWNvcmRlciBldmVudCdzIGBrZXlgIGlzIG9ubHkgYSBkb3Qtam9pbmVkIGRpc3BsYXkgbGFiZWwsIHNvIGBbJ3VzZXInLCdzc24nXWAgYW5kXG4gICAqIGEgbGl0ZXJhbCB0b3AtbGV2ZWwgYCd1c2VyLnNzbidgIHByb2R1Y2UgdGhlIHNhbWUgZXZlbnQga2V5IChzYW1lIGZvciB0aGUgd3JpdGVzIGJlbG93KS5cbiAgICovXG4gIGdldFZhbHVlQXQocGF0aDogc3RyaW5nW10sIGtleT86IHN0cmluZykge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoa2V5ID09PSB1bmRlZmluZWQgPyBwYXRoLmpvaW4oJy4nKSB8fCAnKicgOiBbLi4ucGF0aCwga2V5XS5qb2luKCcuJykpO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fc3RhZ2VDb250ZXh0LmdldFZhbHVlKHBhdGgsIGtleSk7XG5cbiAgICAvLyBSRkMtMDAzIEQyOiByZW1lbWJlciB0cmFja2VkIGtleXMgc28gbGF0ZXIgU0lMRU5UIHJlYWRzIG9mIHRoZSBzYW1lXG4gICAgLy8ga2V5IGNvdW50IGFzIHNoYWRvd2VkIChlZGdlIGFscmVhZHkgY2FwdHVyZWQpIGluc3RlYWQgb2YgdW50cmFja2VkLlxuICAgIC8vIE9ubHkgYSB3aG9sZSB0b3AtbGV2ZWwgdmFsdWUgc2hhZG93cyBhIGxhdGVyIHNpbGVudCByZWFkIG9mIHRoYXQgdmFsdWUuXG4gICAgLy8gUmVhZGluZyBvbmUgbmVzdGVkIGZpZWxkIG11c3Qgbm90IGNsYWltIHRvIGhhdmUgb2JzZXJ2ZWQgaXRzIHNpYmxpbmdzLlxuICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCAmJiBrZXkgIT09IHVuZGVmaW5lZCkgdGhpcy5fdHJhY2tlZFJlYWRLZXlzLmFkZChrZXkpO1xuICAgIGVsc2UgaWYgKHBhdGgubGVuZ3RoID09PSAxICYmIGtleSA9PT0gdW5kZWZpbmVkKSB0aGlzLl90cmFja2VkUmVhZEtleXMuYWRkKHBhdGhbMF0hKTtcblxuICAgIGlmICh0aGlzLl9yZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQSB3aG9sZS1zdGF0ZSByZWFkIChubyBrZXkpIGlzIHNlcnZlZCB3aXRoIGV2ZXJ5IHJlZGFjdGVkIGtleSBpbnNpZGVcbiAgICAgIC8vIGl0IHNjcnViYmVkOyBhIGtleWVkIHJlYWQgaXMgc2VydmVkIHVuZGVyIHRoZSBrZXkncyB2ZXJkaWN0LlxuICAgICAgY29uc3Qgd2hvbGVTdGF0ZSA9IHBhdGgubGVuZ3RoID09PSAwICYmIGtleSA9PT0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgdmVyZGljdCA9IHdob2xlU3RhdGUgPyBDTEVBUiA6IGtleSA9PT0gdW5kZWZpbmVkID8gdGhpcy5ydWxlLnZlcmRpY3QocGF0aCkgOiB0aGlzLnJ1bGUudmVyZGljdEF0KHBhdGgsIGtleSk7XG4gICAgICBjb25zdCByZWNvcmRlclZhbHVlID0gd2hvbGVTdGF0ZSA/IHRoaXMucnVsZS5yZXRhaW5SZWNvcmQodmFsdWUpIDogUmVkYWN0aW9uUnVsZS5hcHBseSh2ZXJkaWN0LCB2YWx1ZSk7XG4gICAgICBjb25zdCBldmVudEtleSA9IHBhdGgubGVuZ3RoID09PSAwID8ga2V5IDogKGtleSA9PT0gdW5kZWZpbmVkID8gcGF0aCA6IFsuLi5wYXRoLCBrZXldKS5qb2luKCcuJyk7XG5cbiAgICAgIHRoaXMuX2ludm9rZUhvb2soJ29uUmVhZCcsIHtcbiAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAga2V5OiBldmVudEtleSxcbiAgICAgICAgdmFsdWU6IHJlY29yZGVyVmFsdWUsXG4gICAgICAgIHJlZGFjdGVkOiB2ZXJkaWN0LmtpbmQgIT09ICdjbGVhcicgfHwgdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgc2V0VmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3Q/OiBib29sZWFuLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnNldFZhbHVlQXQoW10sIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgLyoqIFBhdGgtYXdhcmUgd3JpdGVzIHNoYXJlIHJlY29yZGluZywgcmVkYWN0aW9uIGFuZCBsaWZldGltZSBwb2xpY3kgd2l0aCBmbGF0IHdyaXRlcy4gKi9cbiAgc2V0VmFsdWVBdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3Q/OiBib29sZWFuLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGNvbnN0IGV2ZW50S2V5ID0gcGF0aC5sZW5ndGggPT09IDAgPyBrZXkgOiBbLi4ucGF0aCwga2V5XS5qb2luKCcuJyk7XG4gICAgYXNzZXJ0Tm90UmVhZG9ubHkodGhpcy5fcmVhZE9ubHlWYWx1ZXMsIHBhdGhbMF0gPz8ga2V5LCAnd3JpdGUnKTtcbiAgICB0aGlzLmFzc2VydExpdmUoZXZlbnRLZXkpO1xuXG4gICAgLy8gRGV2LW1vZGU6IHdhcm4gaWYgdGhlIHZhbHVlIGNvbnRhaW5zIGNpcmN1bGFyIHJlZmVyZW5jZXMuXG4gICAgLy8gQ2hlY2sgQUZURVIgYXNzZXJ0Tm90UmVhZG9ubHkg4oCUIGRvbid0IHdhcm4gZm9yIHdyaXRlcyB0aGF0IHdpbGwgYmUgYmxvY2tlZC5cbiAgICAvLyBDaXJjdWxhciB2YWx1ZXMgd29yayAodGVybWluYWwgcHJveHkgaGFuZGxlcyB0aGVtKSBidXQgY2FuIHByb2R1Y2VcbiAgICAvLyBzdXJwcmlzaW5nIGJlaGF2aW9yIGluIG5hcnJhdGl2ZSwgSlNPTiBzZXJpYWxpemF0aW9uLCBhbmQgc25hcHNob3RzLlxuICAgIGlmIChpc0Rldk1vZGUoKSAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoaGFzQ2lyY3VsYXJSZWZlcmVuY2UodmFsdWUpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW2Zvb3RwcmludF0gQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGluIHNldFZhbHVlKCcke2V2ZW50S2V5fScpLiBgICtcbiAgICAgICAgICAgICdXcml0ZXMgcGFzdCB0aGUgY3ljbGUgZGVwdGggd2lsbCB1c2UgdGVybWluYWwgcHJveHkgdHJhY2tpbmcuICcgK1xuICAgICAgICAgICAgJ0NvbnNpZGVyIGZsYXR0ZW5pbmcgdGhlIGRhdGEgc3RydWN0dXJlLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIGNvbnRleHQgaXMgdGhlIE9ORSBmdW5uZWw6IGl0IGRlY2lkZXMgdGhlIHZlcmRpY3QgKGV4cGxpY2l0IGZsYWcsXG4gICAgLy8gcG9saWN5IGtleS9wYXR0ZXJuLCBwZXItcnVuIG1hcmssIG9yIGZpZWxkLWxldmVsIHNjcnViKSwgc3RhZ2VzIHRoZVxuICAgIC8vIHdyaXRlIHdpdGggdGhlIHBhdGhzIHRoZSBsb2cgd2lsbCBzY3J1YiwgYW5kIGhhbmRzIHRoZSB2ZXJkaWN0IGJhY2sgc29cbiAgICAvLyByZWNvcmRlcnMgc2VlIHRoZSBzYW1lIGRlY2lzaW9uIHRoZSByZXRhaW5lZCByZWNvcmQgaG9sZHMuXG4gICAgY29uc3QgdmVyZGljdCA9IHRoaXMuX3N0YWdlQ29udGV4dC5zZXRPYmplY3QocGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCBkZXNjcmlwdGlvbik7XG5cbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX2ludm9rZUhvb2soJ29uV3JpdGUnLCB7XG4gICAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgIGtleTogZXZlbnRLZXksXG4gICAgICAgIHZhbHVlOiBSZWRhY3Rpb25SdWxlLmFwcGx5KHZlcmRpY3QsIHZhbHVlKSxcbiAgICAgICAgb3BlcmF0aW9uOiAnc2V0JyxcbiAgICAgICAgcmVkYWN0ZWQ6IHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJyB8fCB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlVmFsdWVBdChbXSwga2V5LCB2YWx1ZSwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgLyoqIFBhdGgtYXdhcmUgbWVyZ2VzIHVzZSB0aGUgc2FtZSB3cml0ZSBmdW5uZWwgYXMgcmVwbGFjZW1lbnRzLiAqL1xuICB1cGRhdGVWYWx1ZUF0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXZlbnRLZXkgPSBwYXRoLmxlbmd0aCA9PT0gMCA/IGtleSA6IFsuLi5wYXRoLCBrZXldLmpvaW4oJy4nKTtcbiAgICBhc3NlcnROb3RSZWFkb25seSh0aGlzLl9yZWFkT25seVZhbHVlcywgcGF0aFswXSA/PyBrZXksICd3cml0ZScpO1xuICAgIHRoaXMuYXNzZXJ0TGl2ZShldmVudEtleSk7XG5cbiAgICAvLyBEZXYtbW9kZTogc2FtZSBjaXJjdWxhciBjaGVjayBhcyBzZXRWYWx1ZSAobWVyZ2UgdGFyZ2V0cyBjYW4gYmUgY2lyY3VsYXIgdG9vKVxuICAgIGlmIChpc0Rldk1vZGUoKSAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoaGFzQ2lyY3VsYXJSZWZlcmVuY2UodmFsdWUpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW2Zvb3RwcmludF0gQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGluIHVwZGF0ZVZhbHVlKCcke2V2ZW50S2V5fScpLiBgICtcbiAgICAgICAgICAgICdDb25zaWRlciBmbGF0dGVuaW5nIHRoZSBkYXRhIHN0cnVjdHVyZS4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHZlcmRpY3QgPSB0aGlzLl9zdGFnZUNvbnRleHQudXBkYXRlT2JqZWN0KHBhdGgsIGtleSwgdmFsdWUsIGRlc2NyaXB0aW9uKTtcblxuICAgIGlmICh0aGlzLl9yZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5faW52b2tlSG9vaygnb25Xcml0ZScsIHtcbiAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAga2V5OiBldmVudEtleSxcbiAgICAgICAgdmFsdWU6IFJlZGFjdGlvblJ1bGUuYXBwbHkodmVyZGljdCwgdmFsdWUpLFxuICAgICAgICBvcGVyYXRpb246ICd1cGRhdGUnLFxuICAgICAgICByZWRhY3RlZDogdmVyZGljdC5raW5kICE9PSAnY2xlYXInIHx8IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZVZhbHVlKGtleTogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGFzc2VydE5vdFJlYWRvbmx5KHRoaXMuX3JlYWRPbmx5VmFsdWVzLCBrZXksICdkZWxldGUnKTtcbiAgICB0aGlzLmFzc2VydExpdmUoa2V5KTtcblxuICAgIC8vIERlbGV0aW5nIGEga2V5IGNsZWFycyBpdHMgcGVyLWNhbGwgcmVkYWN0aW9uIG1hcmsgKHRoZSBjb250ZXh0J3NcbiAgICAvLyBmdW5uZWwgZG9lcyB0aGF0KTsgYSBwb2xpY3kgdmVyZGljdCBvbiB0aGUga2V5IHN1cnZpdmVzLlxuICAgIHRoaXMuX3N0YWdlQ29udGV4dC5zZXRPYmplY3QoW10sIGtleSwgdW5kZWZpbmVkLCBmYWxzZSwgZGVzY3JpcHRpb24gPz8gYGRlbGV0ZWQgJHtrZXl9YCwgJ2RlbGV0ZScpO1xuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9pbnZva2VIb29rKCdvbldyaXRlJywge1xuICAgICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIG9wZXJhdGlvbjogJ2RlbGV0ZScsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHNldEdsb2JhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgdGhpcy5hc3NlcnRMaXZlKGtleSk7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5zZXRHbG9iYWw/LihrZXksIHZhbHVlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldEdsb2JhbChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0R2xvYmFsPy4oa2V5KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc2V0T2JqZWN0SW5Sb290KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuYXNzZXJ0TGl2ZShrZXkpO1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQuc2V0Um9vdD8uKGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJlYWQtb25seSArIG1pc2Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJlYWRvbmx5IGlucHV0IHZhbHVlcyBwYXNzZWQgdG8gdGhpcyBwaXBlbGluZSwgY2FzdCB0byBgVGAuXG4gICAqIE9yZGluYXJ5IG11dGFibGUgcmVjb3Jkcy9hcnJheXMgYXJlIGNvcGllZCBhbmQgZnJvemVuLCBub3QgZnJvemVuIGluIHBsYWNlLlxuICAgKiBPcGFxdWUgY2FwYWJpbGl0aWVzIGFuZCBleHBsaWNpdGx5IGZyb3plbiB3cmFwcGVycyByZW1haW4gYm9ycm93ZWQvbGl2ZTtcbiAgICogc2VlIGBwcm90ZWN0aW9uL3JlYWRvbmx5SW5wdXQudHMgwrcgY3JlYXRlRnJvemVuQXJnc2AgZm9yIHRoZSBvd25lcnNoaXAgcnVsZS5cbiAgICogQ2FjaGVkIGF0IGNvbnN0cnVjdGlvbiB0aW1lIGZvciB6ZXJvLWFsbG9jYXRpb24gcmVwZWF0ZWQgYWNjZXNzLlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHsgYXBwbGljYW50TmFtZSwgaW5jb21lIH0gPSBzY29wZS5nZXRBcmdzPHsgYXBwbGljYW50TmFtZTogc3RyaW5nOyBpbmNvbWU6IG51bWJlciB9PigpO1xuICAgKiBgYGBcbiAgICpcbiAgICogUkZDLTAwMyBEMjogYXJncyBhcmUgdW50cmFja2VkIEJZIERFU0lHTiwgc28gY2FsbGluZyB0aGlzICh3aXRoIGFjdHVhbFxuICAgKiBpbnB1dCBwcmVzZW50KSBtYXJrcyB0aGUgc3RhZ2UncyBjb21taXQgd2l0aCBgdW50cmFja2VkU291cmNlczogWydhcmdzJ11gXG4gICAqIOKAlCB0ZWxsaW5nIGNhdXNhbC1zbGljZSBjb25zdW1lcnMgdGhlIGJhY2t3YXJkIHNsaWNlIG1heSBiZSBpbmNvbXBsZXRlXG4gICAqIGhlcmUuIEFuIGVtcHR5LWFyZ3MgcmVhZCBjYXJyaWVzIG5vIGluZm9ybWF0aW9uIGFuZCBpcyBub3QgZmxhZ2dlZC5cbiAgICovXG4gIGdldEFyZ3M8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpOiBUIHtcbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKCckYXJncycpO1xuICAgIGlmICh0aGlzLl9oYXNBcmdzKSB0aGlzLl9zdGFnZUNvbnRleHQubWFya1VudHJhY2tlZFNvdXJjZSgnYXJncycpO1xuICAgIHJldHVybiB0aGlzLl9mcm96ZW5BcmdzIGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50IOKAlCByZWFkLW9ubHkgaW5mcmFzdHJ1Y3R1cmUgdmFsdWVzXG4gICAqIHRoYXQgcHJvcGFnYXRlIHRocm91Z2ggbmVzdGVkIGV4ZWN1dG9ycyAobGlrZSBgcHJvY2Vzcy5lbnZgIGZvciBmbG93Y2hhcnRzKS5cbiAgICpcbiAgICogQ29udGFpbnM6IHNpZ25hbCAoYWJvcnQg4oCUIHRoZSBydW4ncyBvbmUgZWZmZWN0aXZlIHNpZ25hbCksIHRpbWVvdXRNcywgdHJhY2VJZCwgb3BlcmF0aW9uSWQsIHRyYWNlcGFyZW50LFxuICAgKiBkZWFkbGluZSAoZXBvY2ggbXMpIOKAlCB0aGUgcnVuJ3MgZW52IGFzIGFkbWl0dGVkIChgYXR0ZW1wdC9jb3JyZWxhdGlvbi50cyDCtyBhZG1pdFJ1bkVudmA6IG9uZSBvd24tZmllbGRcbiAgICogc25hcHNob3Q7IGB0cmFjZXBhcmVudGAgaXMgdGhlIGNhbm9uaWNhbCBoZWFkZXIgdGhlIHJ1bidzIGNvcnJlbGF0aW9uIGNhcnJpZXMsIG5ldmVyIHRoZSByZWNlaXZlZCBieXRlcyksIHRoZW5cbiAgICogYXJtZWQgKGBydW5uZXIvZGVhZGxpbmUudHMgwrcgYXJtUnVuYCkuIEZyb3plbiBhdCBjb25zdHJ1Y3Rpb24gdGltZS4gSW5oZXJpdGVkIGJ5IHN1YmZsb3dzIGF1dG9tYXRpY2FsbHkuXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgeyBzaWduYWwsIHRyYWNlSWQgfSA9IHNjb3BlLmdldEVudigpO1xuICAgKiBgYGBcbiAgICpcbiAgICogUkZDLTAwMyBEMjogZW52IGlzIHVudHJhY2tlZCBCWSBERVNJR04sIHNvIGNhbGxpbmcgdGhpcyAod2l0aCBhXG4gICAqIG5vbi1lbXB0eSBlbnZpcm9ubWVudCkgbWFya3MgdGhlIHN0YWdlJ3MgY29tbWl0IHdpdGhcbiAgICogYHVudHJhY2tlZFNvdXJjZXM6IFsnZW52J11gIOKAlCBzZWUge0BsaW5rIGdldEFyZ3N9LlxuICAgKi9cbiAgZ2V0RW52KCk6IFJlYWRvbmx5PEV4ZWN1dGlvbkVudj4ge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoJyRlbnYnKTtcbiAgICBpZiAodGhpcy5faGFzRW52KSB0aGlzLl9zdGFnZUNvbnRleHQubWFya1VudHJhY2tlZFNvdXJjZSgnZW52Jyk7XG4gICAgcmV0dXJuIHRoaXMuX2V4ZWN1dGlvbkVudjtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UGlwZWxpbmVJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkO1xuICB9XG5cbiAgLy8g4pSA4pSAIEludGVybmFsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgX2ludm9rZUhvb2s8SyBleHRlbmRzIFNjb3BlSG9va05hbWU+KGhvb2s6IEssIGV2ZW50OiBIb29rUGF5bG9hZDxLPik6IHZvaWQge1xuICAgIC8vIFRoZSBvbmUgcGVyLXJlY29yZGVyIGxvb3AgKGByZWNvcmRlci9ob29rcy50cyDCtyBmaXJlYCkg4oCUIHRoZSBTQU1FIGludm9rZSBwcmltaXRpdmUgdGhlXG4gICAgLy8gZGVmZXJyZWQgdGllciB1c2VzIGF0IGRlbGl2ZXJ5IHRpbWUsIHNvIHRoZSBpbmxpbmUgYW5kIGRlZmVycmVkIHBhdGhzIGNhbm5vdCBkcmlmdC5cbiAgICBmaXJlKHRoaXMuX3JlY29yZGVycywgaG9vaywgdGhpcy5fY29ycmVsYXRlZChldmVudCBhcyBvYmplY3QpIGFzIEhvb2tQYXlsb2FkPEs+LCB0aGlzLl9yb3V0ZUZhaWx1cmUpO1xuICB9XG5cbiAgLyoqIFRoZSBldmVudCBhcyBmaXJlZDogdW5jaGFuZ2VkIHdpdGhvdXQgYSBjb3JyZWxhdGlvbiwgZWxzZSB3aXRoIHRoZSBydW4ncyBjb3JyZWxhdGlvbiBhcyBpdHMgbGFzdCBrZXkuICovXG4gIHByaXZhdGUgX2NvcnJlbGF0ZWQ8RSBleHRlbmRzIG9iamVjdD4oZXZlbnQ6IEUpOiBFIHtcbiAgICByZXR1cm4gdGhpcy5fY29ycmVsYXRpb24gPT09IHVuZGVmaW5lZCA/IGV2ZW50IDogeyAuLi5ldmVudCwgY29ycmVsYXRpb246IHRoaXMuX2NvcnJlbGF0aW9uIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNjb3BlIGNoYW5uZWwncyBpc29sYXRpb246IGEgcmVjb3JkZXIncyB0aHJvdyBiZWNvbWVzIGFuIGBvbkVycm9yYCBvbiBldmVyeSByZWNvcmRlclxuICAgKiAoc3RhbXBlZCB3aXRoIHRoaXMgc3RhZ2UpLCBhbmQgYSB0aHJvdyBmcm9tIGBvbkVycm9yYCBpdHNlbGYgaXMgZHJvcHBlZC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3JvdXRlRmFpbHVyZTogSG9va0ZhaWx1cmUgPSAoZXJyb3IsIF9yZWNvcmRlciwgaG9vaykgPT4ge1xuICAgIGlmIChob29rID09PSAnb25FcnJvcicpIHJldHVybjtcbiAgICB0aGlzLl9pbnZva2VIb29rKFxuICAgICAgJ29uRXJyb3InLFxuICAgICAgcmVjb3JkZXJGYWlsdXJlRXZlbnQoXG4gICAgICAgIHtcbiAgICAgICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIGhvb2ssXG4gICAgICApLFxuICAgICk7XG4gIH07XG59XG5cbi8qKiBUaGUgc2lnbmFsIG9mIGEgc3RhZ2Ugb3V0c2lkZSB0aGUgcnVubmVyIGluIGEgcnVuIHdpdGggbm8gc2lnbmFsOiBvbmUgdGhhdCBuZXZlciBhYm9ydHMsIHNoYXJlZC4gKi9cbmNvbnN0IE5FVkVSX0FCT1JURUQ6IEFib3J0U2lnbmFsID0gbmV3IEFib3J0Q29udHJvbGxlcigpLnNpZ25hbDtcblxuLyoqIFRoZSBuYW1lIGEgbGF0ZSBkZXRhY2ggaXMgcmVjb3JkZWQgdW5kZXI6IHRoZSBjaGlsZCBjaGFydCdzIHJvb3QgaWQg4oCUIGEgbmFtZSwgbmV2ZXIgaXRzIGlucHV0LiAqL1xuZnVuY3Rpb24gZGV0YWNoS2V5KGNoaWxkOiBGbG93Q2hhcnQpOiBzdHJpbmcge1xuICBjb25zdCBpZCA9IChjaGlsZCBhcyB7IHJvb3Q/OiB7IGlkPzogdW5rbm93biB9IH0gfCB1bmRlZmluZWQpPy5yb290Py5pZDtcbiAgcmV0dXJuIHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgPyBgZGV0YWNoOiR7aWR9YCA6ICdkZXRhY2gnO1xufVxuIl19
@@ -49,3 +49,5 @@ export declare function scopeRuntimeFor(scope: unknown): Readonly<ScopeRuntime>
49
49
  export declare function requireScopeRuntime(scope: unknown, message?: string): Readonly<ScopeRuntime>;
50
50
  /** @internal decide()/select() asked outside a stage: name THEM, not the custom-factory migration. */
51
51
  export declare function requireDecisionScopeRuntime(scope: unknown): Readonly<ScopeRuntime>;
52
+ export declare function registerNativeCaptureTarget(target: object, context: object): void;
53
+ export declare function hasNativeCaptureTarget(target: object, context: object): boolean;
@@ -57,4 +57,12 @@ export function requireScopeRuntime(scope, message = UNREGISTERED) {
57
57
  export function requireDecisionScopeRuntime(scope) {
58
58
  return requireScopeRuntime(scope, UNREGISTERED_DECISION);
59
59
  }
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc2NvcGUvcnVudGltZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQThCSCxNQUFNLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBa0MsQ0FBQztBQUUvRCxTQUFTLFFBQVEsQ0FBQyxLQUFjO0lBQzlCLE9BQU8sQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFVBQVUsQ0FBQztBQUN0RixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFtQixLQUFRLEVBQUUsT0FBcUI7SUFDcEYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLCtDQUErQyxDQUFDLENBQUM7SUFDM0YsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksT0FBTyxPQUFPLENBQUMsa0JBQWtCLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDN0YsTUFBTSxJQUFJLFNBQVMsQ0FBQyw0RUFBNEUsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLE9BQU8sT0FBTyxDQUFDLFFBQVEsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUM3RSxNQUFNLElBQUksU0FBUyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUNELFFBQVEsQ0FBQyxHQUFHLENBQ1YsS0FBSyxFQUNMLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDWixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07UUFDdEIsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLGtCQUFrQjtRQUM5QyxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7S0FDM0IsQ0FBQyxDQUNILENBQUM7SUFDRixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsTUFBTSxVQUFVLGVBQWUsQ0FBQyxLQUFjO0lBQzVDLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDM0QsQ0FBQztBQUVELE1BQU0sWUFBWSxHQUNoQiwrRkFBK0Y7SUFDL0YsNkhBQTZILENBQUM7QUFFaEksTUFBTSxxQkFBcUIsR0FDekIsbUdBQW1HO0lBQ25HLDZGQUE2RjtJQUM3Riw0REFBNEQsQ0FBQztBQUUvRCxnR0FBZ0c7QUFDaEcsTUFBTSxVQUFVLG1CQUFtQixDQUFDLEtBQWMsRUFBRSxVQUFrQixZQUFZO0lBQ2hGLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxJQUFJLE9BQU87UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUM1QixNQUFNLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFFRCxzR0FBc0c7QUFDdEcsTUFBTSxVQUFVLDJCQUEyQixDQUFDLEtBQWM7SUFDeEQsT0FBTyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUscUJBQXFCLENBQUMsQ0FBQztBQUMzRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgc2NvcGUg4oaUIGVuZ2luZSBwcm90b2NvbC4gQSB1c2VyLWZhY2luZyBzY29wZSBtYXkgYmUgYSBzdHJpY3Qgc2NoZW1hXG4gKiBwcm94eTogYXNraW5nIGl0IGZvciBhbiBpbmZyYXN0cnVjdHVyZSBtZW1iZXIgaXMgYSBzdGF0ZSBhY2Nlc3MsIG5vdCBhXG4gKiBjYXBhYmlsaXR5IGNoZWNrLiBSZWdpc3RyYXRpb24ga2VlcHMgdGhhdCBib3VuZGFyeSBlbnRpcmVseSBvdXQgb2YgYmFuZC5cbiAqXG4gKiBUaGlzIG1vZHVsZSBvd25zIGlkZW50aXR5IGFuZCBjYXBhYmlsaXRpZXMsIG5vdCB0aGVpciBpbXBsZW1lbnRhdGlvbi5cbiAqIFNjb3BlRmFjYWRlIG93bnMgcmVjb3JkaW5nLCByZWRhY3Rpb24gYW5kIHN0YXRlIGFjY2VzczsgY3VzdG9tIHNjb3BlcyBtYXlcbiAqIGV4cGxpY2l0bHkgc3VwcGx5IGEgc21hbGxlciBwb3J0IChpbmNsdWRpbmcgYHt9YCBmb3IgZGF0YS1vbmx5IHNjb3BlcykuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBSdW5Db3JyZWxhdGlvbiB9IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWRhY3Rpb25Qb2xpY3ksIFNjb3BlUmVjb3JkZXIgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIEVuZ2luZS1mYWNpbmcgY2FwYWJpbGl0aWVzLiBOZXZlciB1c2UgYSBzdHJpY3QgdXNlci1maWVsZCBwcm94eSBhcyB0aGlzIHBvcnQuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjb3BlUnVudGltZVRhcmdldCB7XG4gIGF0dGFjaFNjb3BlUmVjb3JkZXI/KHJlY29yZGVyOiBTY29wZVJlY29yZGVyKTogdm9pZDtcbiAgZGV0YWNoU2NvcGVSZWNvcmRlcj8ocmVjb3JkZXJJZDogc3RyaW5nKTogdm9pZDtcbiAgZ2V0U2NvcGVSZWNvcmRlcnM/KCk6IFNjb3BlUmVjb3JkZXJbXTtcbiAgdXNlU2hhcmVkUmVkYWN0ZWRLZXlzPyhrZXlzOiBTZXQ8c3RyaW5nPik6IHZvaWQ7XG4gIHVzZVJlZGFjdGlvblBvbGljeT8ocG9saWN5OiBSZWRhY3Rpb25Qb2xpY3kpOiB2b2lkO1xuICAvKiogVGhlIHJ1bidzIGNvcnJlbGF0aW9uLCBzdGFtcGVkIG9uIGV2ZXJ5IHNjb3BlIGFuZCBlbWl0IGV2ZW50IHRoaXMgc2NvcGUgZmlyZXMgKDEwLjEpLiAqL1xuICB1c2VDb3JyZWxhdGlvbj8oY29ycmVsYXRpb246IFJ1bkNvcnJlbGF0aW9uIHwgdW5kZWZpbmVkKTogdm9pZDtcbiAgZ2V0UmVkYWN0ZWRLZXlzPygpOiBTZXQ8c3RyaW5nPjtcbiAgbm90aWZ5U3RhZ2VTdGFydD8oKTogdm9pZDtcbiAgbm90aWZ5U3RhZ2VFbmQ/KGR1cmF0aW9uPzogbnVtYmVyKTogdm9pZDtcbiAgbm90aWZ5UGF1c2U/KGRhdGE/OiB1bmtub3duKTogdm9pZDtcbiAgZ2V0VmFsdWU/KGtleT86IHN0cmluZyk6IHVua25vd247XG4gIHNldFZhbHVlPyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY29wZVJ1bnRpbWUge1xuICByZWFkb25seSB0YXJnZXQ6IFNjb3BlUnVudGltZVRhcmdldDtcbiAgLyoqIFRoZSBzY29wZSBhbHJlYWR5IHJvdXRlcyBwcm9wZXJ0eSBhc3NpZ25tZW50cyBpbnRvIG1hbmFnZWQgc3RhdGUuICovXG4gIHJlYWRvbmx5IGhhbmRsZXNBc3NpZ25tZW50czogYm9vbGVhbjtcbiAgLyoqIEluc3RhbGwgdGhpcyBleGVjdXRpb24ncyBicmVhayBjYWxsYmFjaywgaWYgdGhlIHNjb3BlIGV4cG9zZXMgb25lLiAqL1xuICByZWFkb25seSBzZXRCcmVhaz86IChicmVha1BpcGVsaW5lOiAocmVhc29uPzogc3RyaW5nKSA9PiB2b2lkKSA9PiB2b2lkO1xufVxuXG5jb25zdCBydW50aW1lcyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgUmVhZG9ubHk8U2NvcGVSdW50aW1lPj4oKTtcblxuZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBvYmplY3Qge1xuICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIGN1c3RvbSBzY29wZSdzIGVuZ2luZS1mYWNpbmcgcG9ydCBhbmQgcmV0dXJuIHRoZSBTQU1FIHNjb3BlLlxuICogUmVnaXN0cmF0aW9uIG5ldmVyIHJlYWRzLCB3cml0ZXMgb3IgZW51bWVyYXRlcyBwcm9wZXJ0aWVzIG9uIGBzY29wZWAuXG4gKiBSZS1yZWdpc3RlcmluZyBleHBsaWNpdGx5IHJlcGxhY2VzIGl0cyBiaW5kaW5nLiBUaGUgZGVzY3JpcHRvciBpcyBjb3BpZWRcbiAqIGFuZCBmcm96ZW47IHRoZSB0YXJnZXQgaXRzZWxmIHJlbWFpbnMgbGl2ZSBhbmQgYmVsb25ncyB0byBpdHMgcHJvdmlkZXIuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGZhY2FkZSA9IG5ldyBTY29wZUZhY2FkZShjb250ZXh0LCBzdGFnZU5hbWUsIGlucHV0LCBlbnYpO1xuICogcmV0dXJuIHJlZ2lzdGVyU2NvcGVSdW50aW1lKG15UHJveHksIHsgdGFyZ2V0OiBmYWNhZGUsIGhhbmRsZXNBc3NpZ25tZW50czogdHJ1ZSB9KTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyU2NvcGVSdW50aW1lPFQgZXh0ZW5kcyBvYmplY3Q+KHNjb3BlOiBULCBydW50aW1lOiBTY29wZVJ1bnRpbWUpOiBUIHtcbiAgaWYgKCFpc09iamVjdChzY29wZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlZ2lzdGVyU2NvcGVSdW50aW1lOiBzY29wZSBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICBpZiAoIXJ1bnRpbWUgfHwgIWlzT2JqZWN0KHJ1bnRpbWUudGFyZ2V0KSB8fCB0eXBlb2YgcnVudGltZS5oYW5kbGVzQXNzaWdubWVudHMgIT09ICdib29sZWFuJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlZ2lzdGVyU2NvcGVSdW50aW1lOiBwcm92aWRlIGEgdGFyZ2V0IHBvcnQgYW5kIGJvb2xlYW4gaGFuZGxlc0Fzc2lnbm1lbnRzJyk7XG4gIH1cbiAgaWYgKHJ1bnRpbWUuc2V0QnJlYWsgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgcnVudGltZS5zZXRCcmVhayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlZ2lzdGVyU2NvcGVSdW50aW1lOiBzZXRCcmVhayBtdXN0IGJlIGEgZnVuY3Rpb24gd2hlbiBzdXBwbGllZCcpO1xuICB9XG4gIHJ1bnRpbWVzLnNldChcbiAgICBzY29wZSxcbiAgICBPYmplY3QuZnJlZXplKHtcbiAgICAgIHRhcmdldDogcnVudGltZS50YXJnZXQsXG4gICAgICBoYW5kbGVzQXNzaWdubWVudHM6IHJ1bnRpbWUuaGFuZGxlc0Fzc2lnbm1lbnRzLFxuICAgICAgc2V0QnJlYWs6IHJ1bnRpbWUuc2V0QnJlYWssXG4gICAgfSksXG4gICk7XG4gIHJldHVybiBzY29wZTtcbn1cblxuLyoqIEBpbnRlcm5hbCBPcHRpb25hbCBvbmx5IGZvciB3cmFwcGVycyB0aGF0IGFsc28gd29yayBvdXRzaWRlIHRoZSBlbmdpbmUuICovXG5leHBvcnQgZnVuY3Rpb24gc2NvcGVSdW50aW1lRm9yKHNjb3BlOiB1bmtub3duKTogUmVhZG9ubHk8U2NvcGVSdW50aW1lPiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBpc09iamVjdChzY29wZSkgPyBydW50aW1lcy5nZXQoc2NvcGUpIDogdW5kZWZpbmVkO1xufVxuXG5jb25zdCBVTlJFR0lTVEVSRUQgPVxuICAnW2Zvb3RwcmludF0gVW5yZWdpc3RlcmVkIHNjb3BlLiBDdXN0b20gc2NvcGUgZmFjdG9yaWVzIG11c3QgY2FsbCByZWdpc3RlclNjb3BlUnVudGltZShzY29wZSwgJyArXG4gICd7IHRhcmdldCwgaGFuZGxlc0Fzc2lnbm1lbnRzIH0pIGZyb20gZm9vdHByaW50anMvYWR2YW5jZWQuIFNjb3BlRmFjYWRlIGFuZCBidWlsdC1pbiBzY29wZSBmYWN0b3JpZXMgcmVnaXN0ZXIgYXV0b21hdGljYWxseS4nO1xuXG5jb25zdCBVTlJFR0lTVEVSRURfREVDSVNJT04gPVxuICBcIltmb290cHJpbnRdIGRlY2lkZSgpL3NlbGVjdCgpIG5lZWRzIHRoZSBzdGFnZSdzIHNjb3BlICh0aGUgb2JqZWN0IHlvdXIgc3RhZ2UgZnVuY3Rpb24gcmVjZWl2ZXMpLCBcIiArXG4gICdub3QgYSBwbGFpbiBvYmplY3QuIEEgaGFuZC1idWlsdCBzY29wZSBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCByZWdpc3RlclNjb3BlUnVudGltZShzY29wZSwgJyArXG4gICd7IHRhcmdldCwgaGFuZGxlc0Fzc2lnbm1lbnRzIH0pIGZyb20gZm9vdHByaW50anMvYWR2YW5jZWQuJztcblxuLyoqIEBpbnRlcm5hbCBObyBtZXRob2QtbmFtZSBndWVzc2luZzogYSBtaXNzaW5nIHJlZ2lzdHJhdGlvbiBpcyBhbiBleHBsaWNpdCBtaWdyYXRpb24gZXJyb3IuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZVNjb3BlUnVudGltZShzY29wZTogdW5rbm93biwgbWVzc2FnZTogc3RyaW5nID0gVU5SRUdJU1RFUkVEKTogUmVhZG9ubHk8U2NvcGVSdW50aW1lPiB7XG4gIGNvbnN0IHJ1bnRpbWUgPSBzY29wZVJ1bnRpbWVGb3Ioc2NvcGUpO1xuICBpZiAocnVudGltZSkgcmV0dXJuIHJ1bnRpbWU7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IobWVzc2FnZSk7XG59XG5cbi8qKiBAaW50ZXJuYWwgZGVjaWRlKCkvc2VsZWN0KCkgYXNrZWQgb3V0c2lkZSBhIHN0YWdlOiBuYW1lIFRIRU0sIG5vdCB0aGUgY3VzdG9tLWZhY3RvcnkgbWlncmF0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVEZWNpc2lvblNjb3BlUnVudGltZShzY29wZTogdW5rbm93bik6IFJlYWRvbmx5PFNjb3BlUnVudGltZT4ge1xuICByZXR1cm4gcmVxdWlyZVNjb3BlUnVudGltZShzY29wZSwgVU5SRUdJU1RFUkVEX0RFQ0lTSU9OKTtcbn1cbiJdfQ==
60
+ /** @internal Explicit native target registration; no class tests or probing user proxies. */
61
+ const nativeTargets = new WeakMap();
62
+ export function registerNativeCaptureTarget(target, context) {
63
+ nativeTargets.set(target, context);
64
+ }
65
+ export function hasNativeCaptureTarget(target, context) {
66
+ return nativeTargets.get(target) === context;
67
+ }
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc2NvcGUvcnVudGltZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQThCSCxNQUFNLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBa0MsQ0FBQztBQUUvRCxTQUFTLFFBQVEsQ0FBQyxLQUFjO0lBQzlCLE9BQU8sQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFVBQVUsQ0FBQztBQUN0RixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFtQixLQUFRLEVBQUUsT0FBcUI7SUFDcEYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLCtDQUErQyxDQUFDLENBQUM7SUFDM0YsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksT0FBTyxPQUFPLENBQUMsa0JBQWtCLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDN0YsTUFBTSxJQUFJLFNBQVMsQ0FBQyw0RUFBNEUsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLE9BQU8sT0FBTyxDQUFDLFFBQVEsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUM3RSxNQUFNLElBQUksU0FBUyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUNELFFBQVEsQ0FBQyxHQUFHLENBQ1YsS0FBSyxFQUNMLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDWixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07UUFDdEIsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLGtCQUFrQjtRQUM5QyxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7S0FDM0IsQ0FBQyxDQUNILENBQUM7SUFDRixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsTUFBTSxVQUFVLGVBQWUsQ0FBQyxLQUFjO0lBQzVDLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDM0QsQ0FBQztBQUVELE1BQU0sWUFBWSxHQUNoQiwrRkFBK0Y7SUFDL0YsNkhBQTZILENBQUM7QUFFaEksTUFBTSxxQkFBcUIsR0FDekIsbUdBQW1HO0lBQ25HLDZGQUE2RjtJQUM3Riw0REFBNEQsQ0FBQztBQUUvRCxnR0FBZ0c7QUFDaEcsTUFBTSxVQUFVLG1CQUFtQixDQUFDLEtBQWMsRUFBRSxVQUFrQixZQUFZO0lBQ2hGLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxJQUFJLE9BQU87UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUM1QixNQUFNLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFFRCxzR0FBc0c7QUFDdEcsTUFBTSxVQUFVLDJCQUEyQixDQUFDLEtBQWM7SUFDeEQsT0FBTyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUscUJBQXFCLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsNkZBQTZGO0FBQzdGLE1BQU0sYUFBYSxHQUFHLElBQUksT0FBTyxFQUFrQixDQUFDO0FBQ3BELE1BQU0sVUFBVSwyQkFBMkIsQ0FBQyxNQUFjLEVBQUUsT0FBZTtJQUN6RSxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNyQyxDQUFDO0FBQ0QsTUFBTSxVQUFVLHNCQUFzQixDQUFDLE1BQWMsRUFBRSxPQUFlO0lBQ3BFLE9BQU8sYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxPQUFPLENBQUM7QUFDL0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIHNjb3BlIOKGlCBlbmdpbmUgcHJvdG9jb2wuIEEgdXNlci1mYWNpbmcgc2NvcGUgbWF5IGJlIGEgc3RyaWN0IHNjaGVtYVxuICogcHJveHk6IGFza2luZyBpdCBmb3IgYW4gaW5mcmFzdHJ1Y3R1cmUgbWVtYmVyIGlzIGEgc3RhdGUgYWNjZXNzLCBub3QgYVxuICogY2FwYWJpbGl0eSBjaGVjay4gUmVnaXN0cmF0aW9uIGtlZXBzIHRoYXQgYm91bmRhcnkgZW50aXJlbHkgb3V0IG9mIGJhbmQuXG4gKlxuICogVGhpcyBtb2R1bGUgb3ducyBpZGVudGl0eSBhbmQgY2FwYWJpbGl0aWVzLCBub3QgdGhlaXIgaW1wbGVtZW50YXRpb24uXG4gKiBTY29wZUZhY2FkZSBvd25zIHJlY29yZGluZywgcmVkYWN0aW9uIGFuZCBzdGF0ZSBhY2Nlc3M7IGN1c3RvbSBzY29wZXMgbWF5XG4gKiBleHBsaWNpdGx5IHN1cHBseSBhIHNtYWxsZXIgcG9ydCAoaW5jbHVkaW5nIGB7fWAgZm9yIGRhdGEtb25seSBzY29wZXMpLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUnVuQ29ycmVsYXRpb24gfSBmcm9tICcuLi9hdHRlbXB0L3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVkYWN0aW9uUG9saWN5LCBTY29wZVJlY29yZGVyIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKiBFbmdpbmUtZmFjaW5nIGNhcGFiaWxpdGllcy4gTmV2ZXIgdXNlIGEgc3RyaWN0IHVzZXItZmllbGQgcHJveHkgYXMgdGhpcyBwb3J0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY29wZVJ1bnRpbWVUYXJnZXQge1xuICBhdHRhY2hTY29wZVJlY29yZGVyPyhyZWNvcmRlcjogU2NvcGVSZWNvcmRlcik6IHZvaWQ7XG4gIGRldGFjaFNjb3BlUmVjb3JkZXI/KHJlY29yZGVySWQ6IHN0cmluZyk6IHZvaWQ7XG4gIGdldFNjb3BlUmVjb3JkZXJzPygpOiBTY29wZVJlY29yZGVyW107XG4gIHVzZVNoYXJlZFJlZGFjdGVkS2V5cz8oa2V5czogU2V0PHN0cmluZz4pOiB2b2lkO1xuICB1c2VSZWRhY3Rpb25Qb2xpY3k/KHBvbGljeTogUmVkYWN0aW9uUG9saWN5KTogdm9pZDtcbiAgLyoqIFRoZSBydW4ncyBjb3JyZWxhdGlvbiwgc3RhbXBlZCBvbiBldmVyeSBzY29wZSBhbmQgZW1pdCBldmVudCB0aGlzIHNjb3BlIGZpcmVzICgxMC4xKS4gKi9cbiAgdXNlQ29ycmVsYXRpb24/KGNvcnJlbGF0aW9uOiBSdW5Db3JyZWxhdGlvbiB8IHVuZGVmaW5lZCk6IHZvaWQ7XG4gIGdldFJlZGFjdGVkS2V5cz8oKTogU2V0PHN0cmluZz47XG4gIG5vdGlmeVN0YWdlU3RhcnQ/KCk6IHZvaWQ7XG4gIG5vdGlmeVN0YWdlRW5kPyhkdXJhdGlvbj86IG51bWJlcik6IHZvaWQ7XG4gIG5vdGlmeVBhdXNlPyhkYXRhPzogdW5rbm93bik6IHZvaWQ7XG4gIGdldFZhbHVlPyhrZXk/OiBzdHJpbmcpOiB1bmtub3duO1xuICBzZXRWYWx1ZT8oa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3Q/OiBib29sZWFuLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NvcGVSdW50aW1lIHtcbiAgcmVhZG9ubHkgdGFyZ2V0OiBTY29wZVJ1bnRpbWVUYXJnZXQ7XG4gIC8qKiBUaGUgc2NvcGUgYWxyZWFkeSByb3V0ZXMgcHJvcGVydHkgYXNzaWdubWVudHMgaW50byBtYW5hZ2VkIHN0YXRlLiAqL1xuICByZWFkb25seSBoYW5kbGVzQXNzaWdubWVudHM6IGJvb2xlYW47XG4gIC8qKiBJbnN0YWxsIHRoaXMgZXhlY3V0aW9uJ3MgYnJlYWsgY2FsbGJhY2ssIGlmIHRoZSBzY29wZSBleHBvc2VzIG9uZS4gKi9cbiAgcmVhZG9ubHkgc2V0QnJlYWs/OiAoYnJlYWtQaXBlbGluZTogKHJlYXNvbj86IHN0cmluZykgPT4gdm9pZCkgPT4gdm9pZDtcbn1cblxuY29uc3QgcnVudGltZXMgPSBuZXcgV2Vha01hcDxvYmplY3QsIFJlYWRvbmx5PFNjb3BlUnVudGltZT4+KCk7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgb2JqZWN0IHtcbiAgcmV0dXJuICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB8fCB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBjdXN0b20gc2NvcGUncyBlbmdpbmUtZmFjaW5nIHBvcnQgYW5kIHJldHVybiB0aGUgU0FNRSBzY29wZS5cbiAqIFJlZ2lzdHJhdGlvbiBuZXZlciByZWFkcywgd3JpdGVzIG9yIGVudW1lcmF0ZXMgcHJvcGVydGllcyBvbiBgc2NvcGVgLlxuICogUmUtcmVnaXN0ZXJpbmcgZXhwbGljaXRseSByZXBsYWNlcyBpdHMgYmluZGluZy4gVGhlIGRlc2NyaXB0b3IgaXMgY29waWVkXG4gKiBhbmQgZnJvemVuOyB0aGUgdGFyZ2V0IGl0c2VsZiByZW1haW5zIGxpdmUgYW5kIGJlbG9uZ3MgdG8gaXRzIHByb3ZpZGVyLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBmYWNhZGUgPSBuZXcgU2NvcGVGYWNhZGUoY29udGV4dCwgc3RhZ2VOYW1lLCBpbnB1dCwgZW52KTtcbiAqIHJldHVybiByZWdpc3RlclNjb3BlUnVudGltZShteVByb3h5LCB7IHRhcmdldDogZmFjYWRlLCBoYW5kbGVzQXNzaWdubWVudHM6IHRydWUgfSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclNjb3BlUnVudGltZTxUIGV4dGVuZHMgb2JqZWN0PihzY29wZTogVCwgcnVudGltZTogU2NvcGVSdW50aW1lKTogVCB7XG4gIGlmICghaXNPYmplY3Qoc2NvcGUpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWdpc3RlclNjb3BlUnVudGltZTogc2NvcGUgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgaWYgKCFydW50aW1lIHx8ICFpc09iamVjdChydW50aW1lLnRhcmdldCkgfHwgdHlwZW9mIHJ1bnRpbWUuaGFuZGxlc0Fzc2lnbm1lbnRzICE9PSAnYm9vbGVhbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWdpc3RlclNjb3BlUnVudGltZTogcHJvdmlkZSBhIHRhcmdldCBwb3J0IGFuZCBib29sZWFuIGhhbmRsZXNBc3NpZ25tZW50cycpO1xuICB9XG4gIGlmIChydW50aW1lLnNldEJyZWFrICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHJ1bnRpbWUuc2V0QnJlYWsgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWdpc3RlclNjb3BlUnVudGltZTogc2V0QnJlYWsgbXVzdCBiZSBhIGZ1bmN0aW9uIHdoZW4gc3VwcGxpZWQnKTtcbiAgfVxuICBydW50aW1lcy5zZXQoXG4gICAgc2NvcGUsXG4gICAgT2JqZWN0LmZyZWV6ZSh7XG4gICAgICB0YXJnZXQ6IHJ1bnRpbWUudGFyZ2V0LFxuICAgICAgaGFuZGxlc0Fzc2lnbm1lbnRzOiBydW50aW1lLmhhbmRsZXNBc3NpZ25tZW50cyxcbiAgICAgIHNldEJyZWFrOiBydW50aW1lLnNldEJyZWFrLFxuICAgIH0pLFxuICApO1xuICByZXR1cm4gc2NvcGU7XG59XG5cbi8qKiBAaW50ZXJuYWwgT3B0aW9uYWwgb25seSBmb3Igd3JhcHBlcnMgdGhhdCBhbHNvIHdvcmsgb3V0c2lkZSB0aGUgZW5naW5lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjb3BlUnVudGltZUZvcihzY29wZTogdW5rbm93bik6IFJlYWRvbmx5PFNjb3BlUnVudGltZT4gfCB1bmRlZmluZWQge1xuICByZXR1cm4gaXNPYmplY3Qoc2NvcGUpID8gcnVudGltZXMuZ2V0KHNjb3BlKSA6IHVuZGVmaW5lZDtcbn1cblxuY29uc3QgVU5SRUdJU1RFUkVEID1cbiAgJ1tmb290cHJpbnRdIFVucmVnaXN0ZXJlZCBzY29wZS4gQ3VzdG9tIHNjb3BlIGZhY3RvcmllcyBtdXN0IGNhbGwgcmVnaXN0ZXJTY29wZVJ1bnRpbWUoc2NvcGUsICcgK1xuICAneyB0YXJnZXQsIGhhbmRsZXNBc3NpZ25tZW50cyB9KSBmcm9tIGZvb3RwcmludGpzL2FkdmFuY2VkLiBTY29wZUZhY2FkZSBhbmQgYnVpbHQtaW4gc2NvcGUgZmFjdG9yaWVzIHJlZ2lzdGVyIGF1dG9tYXRpY2FsbHkuJztcblxuY29uc3QgVU5SRUdJU1RFUkVEX0RFQ0lTSU9OID1cbiAgXCJbZm9vdHByaW50XSBkZWNpZGUoKS9zZWxlY3QoKSBuZWVkcyB0aGUgc3RhZ2UncyBzY29wZSAodGhlIG9iamVjdCB5b3VyIHN0YWdlIGZ1bmN0aW9uIHJlY2VpdmVzKSwgXCIgK1xuICAnbm90IGEgcGxhaW4gb2JqZWN0LiBBIGhhbmQtYnVpbHQgc2NvcGUgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggcmVnaXN0ZXJTY29wZVJ1bnRpbWUoc2NvcGUsICcgK1xuICAneyB0YXJnZXQsIGhhbmRsZXNBc3NpZ25tZW50cyB9KSBmcm9tIGZvb3RwcmludGpzL2FkdmFuY2VkLic7XG5cbi8qKiBAaW50ZXJuYWwgTm8gbWV0aG9kLW5hbWUgZ3Vlc3Npbmc6IGEgbWlzc2luZyByZWdpc3RyYXRpb24gaXMgYW4gZXhwbGljaXQgbWlncmF0aW9uIGVycm9yLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVTY29wZVJ1bnRpbWUoc2NvcGU6IHVua25vd24sIG1lc3NhZ2U6IHN0cmluZyA9IFVOUkVHSVNURVJFRCk6IFJlYWRvbmx5PFNjb3BlUnVudGltZT4ge1xuICBjb25zdCBydW50aW1lID0gc2NvcGVSdW50aW1lRm9yKHNjb3BlKTtcbiAgaWYgKHJ1bnRpbWUpIHJldHVybiBydW50aW1lO1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKG1lc3NhZ2UpO1xufVxuXG4vKiogQGludGVybmFsIGRlY2lkZSgpL3NlbGVjdCgpIGFza2VkIG91dHNpZGUgYSBzdGFnZTogbmFtZSBUSEVNLCBub3QgdGhlIGN1c3RvbS1mYWN0b3J5IG1pZ3JhdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlRGVjaXNpb25TY29wZVJ1bnRpbWUoc2NvcGU6IHVua25vd24pOiBSZWFkb25seTxTY29wZVJ1bnRpbWU+IHtcbiAgcmV0dXJuIHJlcXVpcmVTY29wZVJ1bnRpbWUoc2NvcGUsIFVOUkVHSVNURVJFRF9ERUNJU0lPTik7XG59XG5cbi8qKiBAaW50ZXJuYWwgRXhwbGljaXQgbmF0aXZlIHRhcmdldCByZWdpc3RyYXRpb247IG5vIGNsYXNzIHRlc3RzIG9yIHByb2JpbmcgdXNlciBwcm94aWVzLiAqL1xuY29uc3QgbmF0aXZlVGFyZ2V0cyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgb2JqZWN0PigpO1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyTmF0aXZlQ2FwdHVyZVRhcmdldCh0YXJnZXQ6IG9iamVjdCwgY29udGV4dDogb2JqZWN0KTogdm9pZCB7XG4gIG5hdGl2ZVRhcmdldHMuc2V0KHRhcmdldCwgY29udGV4dCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaGFzTmF0aXZlQ2FwdHVyZVRhcmdldCh0YXJnZXQ6IG9iamVjdCwgY29udGV4dDogb2JqZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiBuYXRpdmVUYXJnZXRzLmdldCh0YXJnZXQpID09PSBjb250ZXh0O1xufVxuIl19