footprintjs 9.4.0 → 9.6.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 (55) hide show
  1. package/CLAUDE.md +2 -0
  2. package/README.md +14 -0
  3. package/dist/esm/index.js +1 -1
  4. package/dist/esm/lib/builder/FlowChartBuilder.js +15 -2
  5. package/dist/esm/lib/capture/envelope.js +187 -0
  6. package/dist/esm/lib/capture/index.js +2 -2
  7. package/dist/esm/lib/engine/handlers/ContinuationResolver.js +23 -4
  8. package/dist/esm/lib/engine/types.js +1 -1
  9. package/dist/esm/lib/observer-queue/deferredDispatcher.js +226 -0
  10. package/dist/esm/lib/observer-queue/flushDriver.js +163 -0
  11. package/dist/esm/lib/observer-queue/index.js +22 -0
  12. package/dist/esm/lib/observer-queue/mergedQueue.js +91 -0
  13. package/dist/esm/lib/observer-queue/ring.js +122 -0
  14. package/dist/esm/lib/recorder/CombinedRecorder.js +4 -4
  15. package/dist/esm/lib/recorder/invokeHook.js +38 -0
  16. package/dist/esm/lib/runner/DeferredObserverTier.js +366 -0
  17. package/dist/esm/lib/runner/ExecutionRuntime.js +1 -1
  18. package/dist/esm/lib/runner/FlowChartExecutor.js +152 -22
  19. package/dist/esm/lib/runner/index.js +1 -1
  20. package/dist/esm/lib/scope/ScopeFacade.js +11 -8
  21. package/dist/index.js +1 -1
  22. package/dist/lib/builder/FlowChartBuilder.js +15 -2
  23. package/dist/lib/capture/envelope.js +192 -0
  24. package/dist/lib/capture/index.js +3 -3
  25. package/dist/lib/engine/handlers/ContinuationResolver.js +23 -4
  26. package/dist/lib/engine/types.js +1 -1
  27. package/dist/lib/observer-queue/deferredDispatcher.js +230 -0
  28. package/dist/lib/observer-queue/flushDriver.js +167 -0
  29. package/dist/lib/observer-queue/index.js +36 -0
  30. package/dist/lib/observer-queue/mergedQueue.js +95 -0
  31. package/dist/lib/observer-queue/ring.js +126 -0
  32. package/dist/lib/recorder/CombinedRecorder.js +8 -8
  33. package/dist/lib/recorder/invokeHook.js +42 -0
  34. package/dist/lib/runner/DeferredObserverTier.js +370 -0
  35. package/dist/lib/runner/ExecutionRuntime.js +1 -1
  36. package/dist/lib/runner/FlowChartExecutor.js +152 -22
  37. package/dist/lib/runner/index.js +1 -1
  38. package/dist/lib/scope/ScopeFacade.js +11 -8
  39. package/dist/types/index.d.ts +24 -0
  40. package/dist/types/lib/capture/envelope.d.ts +169 -0
  41. package/dist/types/lib/capture/index.d.ts +1 -1
  42. package/dist/types/lib/engine/handlers/ContinuationResolver.d.ts +15 -2
  43. package/dist/types/lib/engine/types.d.ts +3 -0
  44. package/dist/types/lib/observer-queue/deferredDispatcher.d.ts +169 -0
  45. package/dist/types/lib/observer-queue/flushDriver.d.ts +124 -0
  46. package/dist/types/lib/observer-queue/index.d.ts +25 -0
  47. package/dist/types/lib/observer-queue/mergedQueue.d.ts +85 -0
  48. package/dist/types/lib/observer-queue/ring.d.ts +99 -0
  49. package/dist/types/lib/recorder/CombinedRecorder.d.ts +36 -0
  50. package/dist/types/lib/recorder/invokeHook.d.ts +32 -0
  51. package/dist/types/lib/runner/DeferredObserverTier.d.ts +204 -0
  52. package/dist/types/lib/runner/ExecutionRuntime.d.ts +8 -0
  53. package/dist/types/lib/runner/FlowChartExecutor.d.ts +49 -10
  54. package/dist/types/lib/runner/index.d.ts +1 -0
  55. package/package.json +2 -1
@@ -826,15 +826,28 @@ class FlowChartBuilder {
826
826
  this._stepCounter++;
827
827
  this._stageStepMap.set(id, this._stepCounter);
828
828
  if (subflow.description) {
829
- this._descriptionParts.push(`${this._stepCounter}. [Sub-Execution: ${name}] — ${subflow.description}`);
830
829
  const lines = subflow.description.split('\n');
831
830
  const stepsIdx = lines.findIndex((l) => l.startsWith('Steps:'));
832
831
  if (stepsIdx >= 0) {
832
+ // Builder-composed description (`FlowChart: X\nSteps:\n...`).
833
+ // Inline ONLY the summary above `Steps:` on the mount line, then
834
+ // re-list the step lines once, indented. Embedding the FULL inner
835
+ // description here AND re-listing its steps doubled the text per
836
+ // nesting level — exponential growth, RangeError ("Invalid string
837
+ // length") at ~22 nesting levels of nested build().
838
+ const summary = lines.slice(0, stepsIdx).join(' ').trim();
839
+ this._descriptionParts.push(summary
840
+ ? `${this._stepCounter}. [Sub-Execution: ${name}] — ${summary}`
841
+ : `${this._stepCounter}. [Sub-Execution: ${name}]`);
833
842
  for (let i = stepsIdx + 1; i < lines.length; i++) {
834
843
  if (lines[i].trim())
835
844
  this._descriptionParts.push(` ${lines[i]}`);
836
845
  }
837
846
  }
847
+ else {
848
+ // Free-form (single-block) description — inline it whole, unchanged.
849
+ this._descriptionParts.push(`${this._stepCounter}. [Sub-Execution: ${name}] — ${subflow.description}`);
850
+ }
838
851
  }
839
852
  else {
840
853
  this._descriptionParts.push(`${this._stepCounter}. [Sub-Execution: ${name}]`);
@@ -1655,4 +1668,4 @@ function specToStageNode(spec) {
1655
1668
  return inflate(spec);
1656
1669
  }
1657
1670
  exports.specToStageNode = specToStageNode;
1658
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0QnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYnVpbGRlci9GbG93Q2hhcnRCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7O0dBWUc7OztBQUtILGlFQUFrRjtBQUVsRiwrRkFBeUY7QUFDekYsMkRBQXVGO0FBZ0J2RixnRkFBZ0Y7QUFDaEYsbUJBQW1CO0FBQ25CLGdGQUFnRjtBQUVoRixNQUFNLElBQUksR0FBRyxDQUFDLEdBQVcsRUFBUyxFQUFFO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUYsZ0ZBQWdGO0FBQ2hGLGNBQWM7QUFDZCxnRkFBZ0Y7QUFFaEY7OztHQUdHO0FBQ0gsTUFBYSxXQUFXO0lBQ0wsQ0FBQyxDQUFpQztJQUNsQyxPQUFPLENBQTBCO0lBQ2pDLE9BQU8sQ0FBOEI7SUFDckMsU0FBUyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDdkMsU0FBUyxDQUFVO0lBRVYsc0JBQXNCLENBQVc7SUFDakMsdUJBQXVCLENBQXNCO0lBQzdDLGtCQUFrQixDQUFTO0lBQzNCLGtCQUFrQixDQUFVO0lBQzVCLGNBQWMsR0FBZ0QsRUFBRSxDQUFDO0lBRWxGLFlBQ0UsT0FBdUMsRUFDdkMsT0FBZ0MsRUFDaEMsT0FBb0MsRUFDcEMseUJBQW1DLEVBQUUsRUFDckMsMEJBQStDLElBQUksR0FBRyxFQUFFLEVBQ3hELGtCQUFrQixHQUFHLENBQUMsRUFDdEIsa0JBQTJCO1FBRTNCLElBQUksQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxzQkFBc0IsQ0FBQztRQUNyRCxJQUFJLENB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QUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFO1FBQy9ELEdBQUcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxLQUFLLFNBQVMsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7S0FDdkUsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQWZELDhDQWVDO0FBRUQsZ0ZBQWdGO0FBQ2hGLDhCQUE4QjtBQUM5QixnRkFBZ0Y7QUFFaEYsU0FBZ0IsZUFBZSxDQUFDLElBQW1CO0lBQ2pELE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBZ0IsRUFBdUIsRUFBRSxDQUFDLENBQUM7UUFDMUQsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO1FBQ1osRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO1FBQ1IsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUNsRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztLQUMzQyxDQUFDLENBQUM7SUFDSCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2QixDQUFDO0FBUkQsMENBUUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZsb3dDaGFydEJ1aWxkZXIg4oCUIEZsdWVudCBBUEkgZm9yIGNvbnN0cnVjdGluZyBmbG93Y2hhcnQgZXhlY3V0aW9uIGdyYXBocy5cbiAqXG4gKiBCdWlsZHMgU3RhZ2VOb2RlIHRyZWVzIGFuZCBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgKEpTT04pIGluIHRhbmRlbS5cbiAqIFplcm8gZGVwZW5kZW5jaWVzIG9uIG9sZCBjb2RlIOKAlCBvbmx5IGltcG9ydHMgZnJvbSBsb2NhbCB0eXBlcy5cbiAqXG4gKiBUaGUgYnVpbGRlciBjcmVhdGVzIHR3byBwYXJhbGxlbCBzdHJ1Y3R1cmVzOlxuICogMS4gU3RhZ2VOb2RlIHRyZWUg4oCUIHJ1bnRpbWUgZ3JhcGggd2l0aCBlbWJlZGRlZCBmdW5jdGlvbnNcbiAqIDIuIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSDigJQgSlNPTi1zYWZlIHN0cnVjdHVyZSBmb3IgdmlzdWFsaXphdGlvblxuICpcbiAqIFRoZSBleGVjdXRlKCkgY29udmVuaWVuY2UgbWV0aG9kIGlzIGludGVudGlvbmFsbHkgb21pdHRlZCDigJRcbiAqIGl0IGJlbG9uZ3MgaW4gdGhlIHJ1bm5lciBsYXllciAoUGhhc2UgNSkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTY29wZUZhY3RvcnkgfSBmcm9tICcuLi9lbmdpbmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYXVzYWJsZUhhbmRsZXIgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFR5cGVkU2NvcGUgfSBmcm9tICcuLi9yZWFjdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyB0eXBlIFJ1bm5hYmxlRmxvd0NoYXJ0LCBtYWtlUnVubmFibGUgfSBmcm9tICcuLi9ydW5uZXIvUnVubmFibGVDaGFydC5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0cnVjdHVyZUVkZ2VLaW5kLCBTdHJ1Y3R1cmVSZWNvcmRlciB9IGZyb20gJy4vc3RydWN0dXJlL1N0cnVjdHVyZVJlY29yZGVyLmpzJztcbmltcG9ydCB7IFN0cnVjdHVyZVJlY29yZGVyRGlzcGF0Y2hlciB9IGZyb20gJy4vc3RydWN0dXJlL1N0cnVjdHVyZVJlY29yZGVyRGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgeyB0eXBlIFR5cGVkU3RhZ2VGdW5jdGlvbiwgY3JlYXRlVHlwZWRTY29wZUZhY3RvcnkgfSBmcm9tICcuL3R5cGVkRmxvd0NoYXJ0LmpzJztcbmltcG9ydCB0eXBlIHtcbiAgRmxvd0NoYXJ0LFxuICBGbG93Q2hhcnRPcHRpb25zLFxuICBGbG93Q2hhcnRTcGVjLFxuICBJTG9nZ2VyLFxuICBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIFNpbXBsaWZpZWRQYXJhbGxlbFNwZWMsXG4gIFN0YWdlRnVuY3Rpb24sXG4gIFN0YWdlTm9kZSxcbiAgU3RyZWFtSGFuZGxlcnMsXG4gIFN0cmVhbUxpZmVjeWNsZUhhbmRsZXIsXG4gIFN0cmVhbVRva2VuSGFuZGxlcixcbiAgU3ViZmxvd01vdW50T3B0aW9ucyxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gSW50ZXJuYWwgaGVscGVyc1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmNvbnN0IGZhaWwgPSAobXNnOiBzdHJpbmcpOiBuZXZlciA9PiB7XG4gIHRocm93IG5ldyBFcnJvcihgW0Zsb3dDaGFydEJ1aWxkZXJdICR7bXNnfWApO1xufTtcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBEZWNpZGVyTGlzdFxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogRmx1ZW50IGhlbHBlciByZXR1cm5lZCBieSBhZGREZWNpZGVyRnVuY3Rpb24gdG8gYWRkIGJyYW5jaGVzLlxuICogYGVuZCgpYCBzZXRzIGBkZWNpZGVyRm4gPSB0cnVlYCDigJQgdGhlIGZuIElTIHRoZSBkZWNpZGVyLlxuICovXG5leHBvcnQgY2xhc3MgRGVjaWRlckxpc3Q8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYjogRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IGN1ck5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IGN1clNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgcHJpdmF0ZSByZWFkb25seSBicmFuY2hJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBkZWZhdWx0SWQ/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnREZXNjcmlwdGlvblBhcnRzOiBzdHJpbmdbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRTdGFnZURlc2NyaXB0aW9uczogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgcHJpdmF0ZSByZWFkb25seSByZXNlcnZlZFN0ZXBOdW1iZXI6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWNpZGVyRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnJhbmNoRGVzY0luZm86IEFycmF5PHsgaWQ6IHN0cmluZzsgZGVzY3JpcHRpb24/OiBzdHJpbmcgfT4gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBidWlsZGVyOiBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4sXG4gICAgY3VyTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY3VyU3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICAgIHBhcmVudERlc2NyaXB0aW9uUGFydHM6IHN0cmluZ1tdID0gW10sXG4gICAgcGFyZW50U3RhZ2VEZXNjcmlwdGlvbnM6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCksXG4gICAgcmVzZXJ2ZWRTdGVwTnVtYmVyID0gMCxcbiAgICBkZWNpZGVyRGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICkge1xuICAgIHRoaXMuYiA9IGJ1aWxkZXI7XG4gICAgdGhpcy5jdXJOb2RlID0gY3VyTm9kZTtcbiAgICB0aGlzLmN1clNwZWMgPSBjdXJTcGVjO1xuICAgIHRoaXMucGFyZW50RGVzY3JpcHRpb25QYXJ0cyA9IHBhcmVudERlc2NyaXB0aW9uUGFydHM7XG4gICAgdGhpcy5wYXJlbnRTdGFnZURlc2NyaXB0aW9ucyA9IHBhcmVudFN0YWdlRGVzY3JpcHRpb25zO1xuICAgIHRoaXMucmVzZXJ2ZWRTdGVwTnVtYmVyID0gcmVzZXJ2ZWRTdGVwTnVtYmVyO1xuICAgIHRoaXMuZGVjaWRlckRlc2NyaXB0aW9uID0gZGVjaWRlckRlc2NyaXB0aW9uO1xuICB9XG5cbiAgYWRkRnVuY3Rpb25CcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm4/OiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgLyoqIGB7IGxvb3BUbyB9YCBkZWNsYXJlcyB0aGlzIGJyYW5jaCBsb29wcyBiYWNrIHRvIGFuIGFscmVhZHktZGVjbGFyZWRcbiAgICAgKiAgc3RhZ2Ug4oCUIHRoZSBsb29wIGlzIFNPVVJDRUQgRlJPTSBUSElTIEJSQU5DSCAobm90IHRoZSBkZWNpZGVyKS4gKi9cbiAgICBvcHRpb25zPzogeyByZWFkb25seSBsb29wVG8/OiBzdHJpbmcgfSxcbiAgKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgaWYgKHRoaXMuYnJhbmNoSWRzLmhhcyhpZCkpIGZhaWwoYGR1cGxpY2F0ZSBkZWNpZGVyIGJyYW5jaCBpZCAnJHtpZH0nIHVuZGVyICcke3RoaXMuY3VyTm9kZS5uYW1lfSdgKTtcbiAgICB0aGlzLmJyYW5jaElkcy5hZGQoaWQpO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWU6IG5hbWUgPz8gaWQsIGlkLCBicmFuY2hJZDogaWQgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBpZiAoZm4pIHtcbiAgICAgIG5vZGUuZm4gPSBmbjtcbiAgICAgIHRoaXMuYi5fYWRkVG9NYXAoaWQsIGZuKTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWU6IG5hbWUgPz8gaWQsIGlkLCB0eXBlOiAnc3RhZ2UnIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG5cbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuID0gdGhpcy5jdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuICAgIC8vIEw3LjMg4oCUIERlY2lkZXIgYnJhbmNoOiBzdGFnZSArIGRlY2lzaW9uLWJyYW5jaCBlZGdlIGtleWVkIGJ5IGlkLlxuICAgIHRoaXMuYi5fZmlyZVN0YWdlQWRkZWRGcm9tU3ViQnVpbGRlcihzcGVjKTtcbiAgICB0aGlzLmIuX2ZpcmVFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcih0aGlzLmN1clNwZWMuaWQsIHNwZWMuaWQsICdkZWNpc2lvbi1icmFuY2gnLCBpZCk7XG5cbiAgICB0aGlzLmJyYW5jaERlc2NJbmZvLnB1c2goeyBpZCwgZGVzY3JpcHRpb24gfSk7XG4gICAgaWYgKG9wdGlvbnM/Lmxvb3BUbykgdGhpcy5fYXBwbHlCcmFuY2hMb29wKG5vZGUsIHNwZWMsIG9wdGlvbnMubG9vcFRvKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBwYXVzYWJsZSBzdGFnZSBhcyBhIGRlY2lkZXIgYnJhbmNoLlxuICAgKlxuICAgKiBXaGVuIHRoaXMgYnJhbmNoIGlzIGNob3NlbiwgdGhlIGhhbmRsZXIncyBgZXhlY3V0ZWAgcnVucy4gSWYgaXQgcmV0dXJuc1xuICAgKiBkYXRhLCB0aGUgcGlwZWxpbmUgcGF1c2VzLiBPbiByZXN1bWUsIGBoYW5kbGVyLnJlc3VtZWAgcnVucyB3aXRoIHRoZVxuICAgKiBodW1hbidzIGlucHV0LiBJZiBgZXhlY3V0ZWAgcmV0dXJucyB2b2lkLCB0aGUgc3RhZ2UgY29udGludWVzIG5vcm1hbGx5XG4gICAqIChjb25kaXRpb25hbCBwYXVzZSkuXG4gICAqL1xuICBhZGRQYXVzYWJsZUZ1bmN0aW9uQnJhbmNoKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGhhbmRsZXI6IFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+LFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIC8qKiBgeyBsb29wVG8gfWAgZGVjbGFyZXMgdGhpcyBicmFuY2ggbG9vcHMgYmFjayB0byBhbiBhbHJlYWR5LWRlY2xhcmVkXG4gICAgICogIHN0YWdlIOKAlCB0aGUgbG9vcCBpcyBTT1VSQ0VEIEZST00gVEhJUyBCUkFOQ0ggKG5vdCB0aGUgZGVjaWRlcikuICovXG4gICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgbG9vcFRvPzogc3RyaW5nIH0sXG4gICk6IERlY2lkZXJMaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGlmICh0aGlzLmJyYW5jaElkcy5oYXMoaWQpKSBmYWlsKGBkdXBsaWNhdGUgZGVjaWRlciBicmFuY2ggaWQgJyR7aWR9JyB1bmRlciAnJHt0aGlzLmN1ck5vZGUubmFtZX0nYCk7XG4gICAgdGhpcy5icmFuY2hJZHMuYWRkKGlkKTtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZTogbmFtZSA/PyBpZCxcbiAgICAgIGlkLFxuICAgICAgYnJhbmNoSWQ6IGlkLFxuICAgICAgZm46IGhhbmRsZXIuZXhlY3V0ZSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgICBpc1BhdXNhYmxlOiB0cnVlLFxuICAgICAgcmVzdW1lRm46IGhhbmRsZXIucmVzdW1lLFxuICAgIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgdGhpcy5iLl9hZGRUb01hcChpZCwgaGFuZGxlci5leGVjdXRlIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPik7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWU6IG5hbWUgPz8gaWQsIGlkLCB0eXBlOiAnc3RhZ2UnLCBpc1BhdXNhYmxlOiB0cnVlIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG5cbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuID0gdGhpcy5jdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuICAgIC8vIEw3LjMg4oCUIFBhdXNhYmxlIGRlY2lkZXIgYnJhbmNoLlxuICAgIHRoaXMuYi5fZmlyZVN0YWdlQWRkZWRGcm9tU3ViQnVpbGRlcihzcGVjKTtcbiAgICB0aGlzLmIuX2ZpcmVFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcih0aGlzLmN1clNwZWMuaWQsIHNwZWMuaWQsICdkZWNpc2lvbi1icmFuY2gnLCBpZCk7XG5cbiAgICB0aGlzLmJyYW5jaERlc2NJbmZvLnB1c2goeyBpZCwgZGVzY3JpcHRpb24gfSk7XG4gICAgaWYgKG9wdGlvbnM/Lmxvb3BUbykgdGhpcy5fYXBwbHlCcmFuY2hMb29wKG5vZGUsIHNwZWMsIG9wdGlvbnMubG9vcFRvKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZFN1YkZsb3dDaGFydEJyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIHN1YmZsb3c6IEZsb3dDaGFydDxhbnksIGFueT4sXG4gICAgbW91bnROYW1lPzogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBTdWJmbG93TW91bnRPcHRpb25zLFxuICApOiBEZWNpZGVyTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBpZiAodGhpcy5icmFuY2hJZHMuaGFzKGlkKSkgZmFpbChgZHVwbGljYXRlIGRlY2lkZXIgYnJhbmNoIGlkICcke2lkfScgdW5kZXIgJyR7dGhpcy5jdXJOb2RlLm5hbWV9J2ApO1xuICAgIHRoaXMuYnJhbmNoSWRzLmFkZChpZCk7XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcbiAgICBjb25zdCBwcmVmaXhlZFJvb3QgPSB0aGlzLmIuX3ByZWZpeE5vZGVUcmVlKHN1YmZsb3cucm9vdCwgaWQpO1xuXG4gICAgaWYgKCF0aGlzLmIuX3N1YmZsb3dEZWZzLmhhcyhpZCkpIHtcbiAgICAgIHRoaXMuYi5fc3ViZmxvd0RlZnMuc2V0KGlkLCB7IHJvb3Q6IHByZWZpeGVkUm9vdCB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgaWQsXG4gICAgICBicmFuY2hJZDogaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMpIG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBzdWJmbG93U3RydWN0dXJlOiBzdWJmbG93LmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICB9O1xuICAgIC8vIFNUUlVDVFVSRS1PTkxZIGNvbnZlcmdlbmNlIG92ZXJyaWRlIOKAlCB0aGlzIGJyYW5jaCdzIGNvbnZlcmdlbmNlIGVkZ2VcbiAgICAvLyBwb2ludHMgYXQgYGNvbnZlcmdlQXRgIGluc3RlYWQgb2YgdGhlIHNoYXJlZCBuZXh0IHN0YWdlIChzZWVcbiAgICAvLyBgX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnRgKS4gQ2FycmllZCBvbiB0aGUgc3BlYyBzbyB0aGUgZWRnZS1maXJpbmdcbiAgICAvLyBjaG9rZXBvaW50ICh3aGljaCBpdGVyYXRlcyBjaGlsZCBzcGVjcykgY2FuIHJlYWQgaXQuXG4gICAgaWYgKG9wdGlvbnM/LmNvbnZlcmdlQXQpIHNwZWMuY29udmVyZ2VBdCA9IG9wdGlvbnMuY29udmVyZ2VBdDtcblxuICAgIHRoaXMuY3VyTm9kZS5jaGlsZHJlbiA9IHRoaXMuY3VyTm9kZS5jaGlsZHJlbiB8fCBbXTtcbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICB0aGlzLmN1clNwZWMuY2hpbGRyZW4gPSB0aGlzLmN1clNwZWMuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuLnB1c2goc3BlYyk7XG4gICAgLy8gTDcuMyDigJQgU3ViZmxvdyBhcyBkZWNpZGVyIGJyYW5jaDogc3RhZ2UgKyBkZWNpc2lvbiBlZGdlICsgbW91bnQuXG4gICAgdGhpcy5iLl9maXJlU3RhZ2VBZGRlZEZyb21TdWJCdWlsZGVyKHNwZWMpO1xuICAgIHRoaXMuYi5fZmlyZUVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyKHRoaXMuY3VyU3BlYy5pZCwgc3BlYy5pZCwgJ2RlY2lzaW9uLWJyYW5jaCcsIGlkKTtcbiAgICB0aGlzLmIuX2ZpcmVTdWJmbG93TW91bnRlZEZyb21TdWJCdWlsZGVyKGlkLCBzdWJmbG93TmFtZSwgaWQsIGZhbHNlLCBzdWJmbG93LmJ1aWxkVGltZVN0cnVjdHVyZSk7XG5cbiAgICB0aGlzLmIuX21lcmdlU3RhZ2VNYXAoc3ViZmxvdy5zdGFnZU1hcCwgaWQpO1xuICAgIHRoaXMuYi5fbWVyZ2VTdWJmbG93cyhzdWJmbG93LnN1YmZsb3dzLCBpZCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZExhenlTdWJGbG93Q2hhcnRCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICByZXNvbHZlcjogKCkgPT4gRmxvd0NoYXJ0PGFueSwgYW55PixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IERlY2lkZXJMaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGlmICh0aGlzLmJyYW5jaElkcy5oYXMoaWQpKSBmYWlsKGBkdXBsaWNhdGUgZGVjaWRlciBicmFuY2ggaWQgJyR7aWR9JyB1bmRlciAnJHt0aGlzLmN1ck5vZGUubmFtZX0nYCk7XG4gICAgdGhpcy5icmFuY2hJZHMuYWRkKGlkKTtcblxuICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gbW91bnROYW1lIHx8IGlkO1xuXG4gICAgLy8gU3RvcmUgcmVzb2x2ZXIgb24gdGhlIG5vZGUg4oCUIE5PIGVhZ2VyIHRyZWUgY2xvbmluZ1xuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICBpZCxcbiAgICAgIGJyYW5jaElkOiBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBzdWJmbG93UmVzb2x2ZXI6IHJlc29sdmVyIGFzIGFueSxcbiAgICB9O1xuICAgIGlmIChvcHRpb25zKSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgLy8gU3BlYyBzdHViIOKAlCBubyBzdWJmbG93U3RydWN0dXJlIChsYXp5KS4gVGhlIGxhenkgc3ViZmxvdydzXG4gICAgLy8gaW50ZXJuYWxzIHdpbGwgYmUgc2hhcGVkIGF0IHJlc29sdXRpb24gdGltZS5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBpc0xhenk6IHRydWUsXG4gICAgfTtcblxuICAgIHRoaXMuY3VyTm9kZS5jaGlsZHJlbiA9IHRoaXMuY3VyTm9kZS5jaGlsZHJlbiB8fCBbXTtcbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICB0aGlzLmN1clNwZWMuY2hpbGRyZW4gPSB0aGlzLmN1clNwZWMuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuLnB1c2goc3BlYyk7XG4gICAgLy8gTDcuMyDigJQgTGF6eSBzdWJmbG93IGFzIGRlY2lkZXIgYnJhbmNoLlxuICAgIHRoaXMuYi5fZmlyZVN0YWdlQWRkZWRGcm9tU3ViQnVpbGRlcihzcGVjKTtcbiAgICB0aGlzLmIuX2ZpcmVFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcih0aGlzLmN1clNwZWMuaWQsIHNwZWMuaWQsICdkZWNpc2lvbi1icmFuY2gnLCBpZCk7XG4gICAgdGhpcy5iLl9maXJlU3ViZmxvd01vdW50ZWRGcm9tU3ViQnVpbGRlcihpZCwgc3ViZmxvd05hbWUsIGlkLCB0cnVlKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkQnJhbmNoTGlzdChcbiAgICBicmFuY2hlczogQXJyYXk8e1xuICAgICAgaWQ6IHN0cmluZztcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGZuPzogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+O1xuICAgIH0+LFxuICApOiBEZWNpZGVyTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBmb3IgKGNvbnN0IHsgaWQsIG5hbWUsIGZuIH0gb2YgYnJhbmNoZXMpIHtcbiAgICAgIHRoaXMuYWRkRnVuY3Rpb25CcmFuY2goaWQsIG5hbWUsIGZuKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXREZWZhdWx0KGlkOiBzdHJpbmcpOiBEZWNpZGVyTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICB0aGlzLmRlZmF1bHRJZCA9IGlkO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIGxvb3AtYmFjayBlZGdlIHRvIHRoZSBMQVNULWFkZGVkIGJyYW5jaCwgc28gdGhlIGxvb3AgaXMgc291cmNlZFxuICAgKiBmcm9tIFRIQVQgYnJhbmNoIG5vZGUgKGUuZy4gYCd0b29sLWNhbGxzJyDihpIgbG9vcFRvKCdjb250ZXh0JylgKSByYXRoZXIgdGhhblxuICAgKiBmcm9tIHRoZSBkZWNpZGVyLiBUaGUgY2hhcnQgdGhlbiByZWFkcyBob25lc3RseTogdGhlIGRlY2lkZXIgc3BsaXRzIGludG8gYVxuICAgKiBsb29waW5nIGJyYW5jaCBgW1Rvb2xDYWxscyDihpIgYmFjayB0byBDb250ZXh0XWAgYW5kIGEgdGVybWluYXRpbmcgYnJhbmNoXG4gICAqIGBbRmluYWwg4oaSIGVuZF1gLCBpbnN0ZWFkIG9mIGEgc2luZ2xlIGxvb3AgaGFuZ2luZyBvZmYgdGhlIGRlY2lkZXIuXG4gICAqXG4gICAqIE5vIGVuZ2luZSBjaGFuZ2UgaXMgbmVlZGVkOiB0aGUgcnVudGltZSBydW5zIHRoZSBjaG9zZW4gYnJhbmNoIGFuZCB0aGVuXG4gICAqIGZvbGxvd3MgdGhhdCBicmFuY2ggbm9kZSdzIE9XTiBgbmV4dGAg4oCUIGFuZCBhIGBuZXh0YCBmbGFnZ2VkIGBpc0xvb3BSZWZgXG4gICAqIHJvdXRlcyBiYWNrIHRvIHRoZSB0YXJnZXQgZXhhY3RseSBsaWtlIHRoZSBkZWNpZGVyJ3Mgb3duIGxvb3AgZG9lcy4gVGhpc1xuICAgKiBtZXRob2QganVzdCBsZXRzIHRoZSBidWlsZGVyIGV4cHJlc3Mgd2hhdCB0aGUgZW5naW5lIGFscmVhZHkgc3VwcG9ydHMuXG4gICAqXG4gICAqIFRhcmdldHMgdGhlIGJyYW5jaCBhZGRlZCBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyBjYWxsIChjaGFpbiBpdCByaWdodCBhZnRlclxuICAgKiB0aGUgYnJhbmNoJ3MgYGFkZEZ1bmN0aW9uQnJhbmNoYC9gYWRkUGF1c2FibGVGdW5jdGlvbkJyYW5jaGAvXG4gICAqIGBhZGRTdWJGbG93Q2hhcnRCcmFuY2hgKS4gTWlycm9ycyBgRmxvd0NoYXJ0QnVpbGRlci5sb29wVG9gIHZhbGlkYXRpb24uXG4gICAqXG4gICAqIFdvcmtzIG9uIGEgU1VCRkxPVyBicmFuY2ggdG9vOiB0aGUgYnJhbmNoIG5vZGUgY2FycmllcyBib3RoIGl0cyBzdWJmbG93XG4gICAqIHJlc29sdmVyIEFORCB0aGUgbG9vcC1iYWNrIGBuZXh0YCDigJQgdGhleSBjb2V4aXN0IHNhZmVseSAodGhlIHJ1bnRpbWUgcnVuc1xuICAgKiB0aGUgc3ViZmxvdywgdGhlbiBmb2xsb3dzIHRoZSBsb29wIHJlZikuIFRoZSB0YXJnZXQgbXVzdCBiZSBhIHN0YWdlIGFscmVhZHlcbiAgICogZGVjbGFyZWQgQkVGT1JFIHRoZSBkZWNpZGVyIChlLmcuIGFuIHVwc3RyZWFtIGBjb250ZXh0YCk7IGJyYW5jaCBpZHMgYW5kIHRoZVxuICAgKiBzeW50aGV0aWMgYCdkZWZhdWx0J2AgY2xvbmUgYXJlIE5PVCB2YWxpZCBsb29wIHRhcmdldHMuXG4gICAqL1xuICBsb29wVG8oc3RhZ2VJZDogc3RyaW5nKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW47XG4gICAgY29uc3Qgc3BlY0NoaWxkcmVuID0gdGhpcy5jdXJTcGVjLmNoaWxkcmVuO1xuICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwIHx8ICFzcGVjQ2hpbGRyZW4gfHwgc3BlY0NoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZmFpbChgbG9vcFRvKCcke3N0YWdlSWR9JykgY2FsbGVkIGJlZm9yZSBhbnkgYnJhbmNoIHdhcyBhZGRlZCB1bmRlciAnJHt0aGlzLmN1ck5vZGUubmFtZX0nYCk7XG4gICAgfVxuICAgIC8vIGZhaWwoKSB0aHJvd3MsIHNvIGNoaWxkcmVuL3NwZWNDaGlsZHJlbiBhcmUgbm9uLWVtcHR5IGhlcmUuXG4gICAgdGhpcy5fYXBwbHlCcmFuY2hMb29wKGNoaWxkcmVuIVtjaGlsZHJlbiEubGVuZ3RoIC0gMV0hLCBzcGVjQ2hpbGRyZW4hW3NwZWNDaGlsZHJlbiEubGVuZ3RoIC0gMV0hLCBzdGFnZUlkKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvcmF0ZSBPTkUgYnJhbmNoIG5vZGUvc3BlYyB3aXRoIGEgbG9vcC1iYWNrIGVkZ2UgdG8gYHN0YWdlSWRgLiBTaGFyZWQgYnlcbiAgICogdGhlIHBvc2l0aW9uYWwgYGxvb3BUbygpYCAod2hpY2ggdGFyZ2V0cyB0aGUgbGFzdC1hZGRlZCBicmFuY2gpIEFORCB0aGVcbiAgICogcGVyLWJyYW5jaCBgeyBsb29wVG8gfWAgb3B0aW9uIG9uIGBhZGRGdW5jdGlvbkJyYW5jaGAgL1xuICAgKiBgYWRkUGF1c2FibGVGdW5jdGlvbkJyYW5jaGAgLyBgYWRkU3ViRmxvd0NoYXJ0QnJhbmNoYC4gRWl0aGVyIHdheSB0aGUgbG9vcFxuICAgKiBTT1VSQ0UgaXMgdGhlIGJyYW5jaCDigJQgc28gdmlzdWFsaXplcnMgcmVhZCBgdG9vbC1jYWxscyDihpIgY29udGV4dGAsIG5ldmVyXG4gICAqIGBSb3V0ZSDihpIgY29udGV4dGAuIFZhbGlkYXRlcyB0aGUgdGFyZ2V0IGlzIGEgc3RhZ2UgZGVjbGFyZWQgQkVGT1JFIHRoZVxuICAgKiBkZWNpZGVyIChicmFuY2ggaWRzIC8gdGhlIHN5bnRoZXRpYyAnZGVmYXVsdCcgY2xvbmUgYXJlIG5vdCB2YWxpZCB0YXJnZXRzKS5cbiAgICovXG4gIHByaXZhdGUgX2FwcGx5QnJhbmNoTG9vcChcbiAgICBicmFuY2hOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBicmFuY2hTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gICAgc3RhZ2VJZDogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICBpZiAoYnJhbmNoU3BlYy5sb29wVGFyZ2V0KSBmYWlsKGBsb29wVG8gYWxyZWFkeSBkZWZpbmVkIG9uIGJyYW5jaCAnJHticmFuY2hTcGVjLmlkfSdgKTtcbiAgICBpZiAoYnJhbmNoTm9kZS5uZXh0KSB7XG4gICAgICBmYWlsKGBjYW5ub3Qgc2V0IGxvb3BUbyBvbiBicmFuY2ggJyR7YnJhbmNoU3BlYy5pZH0nIOKAlCBpdCBhbHJlYWR5IGhhcyBhIGNvbnRpbnVhdGlvbmApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYi5fa25vd25TdGFnZUlkc0hhcyhzdGFnZUlkKSkge1xuICAgICAgZmFpbChcbiAgICAgICAgYGxvb3BUbygnJHtzdGFnZUlkfScpIHRhcmdldCBub3QgZm91bmQg4oCUIGEgYnJhbmNoIGxvb3AgbXVzdCB0YXJnZXQgYSBzdGFnZSBgICtcbiAgICAgICAgICBcImRlY2xhcmVkIEJFRk9SRSB0aGUgZGVjaWRlciAoYnJhbmNoIGlkcyBhbmQgdGhlIHN5bnRoZXRpYyAnZGVmYXVsdCcgYnJhbmNoIFwiICtcbiAgICAgICAgICAnYXJlIG5vdCB2YWxpZCBsb29wIHRhcmdldHM7IGRpZCB5b3UgcGFzcyBhIHN0YWdlIG5hbWUgaW5zdGVhZCBvZiBhbiBpZD8pJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYnJhbmNoTm9kZS5uZXh0ID0geyBuYW1lOiBzdGFnZUlkLCBpZDogc3RhZ2VJZCwgaXNMb29wUmVmOiB0cnVlIH07XG4gICAgYnJhbmNoU3BlYy5sb29wVGFyZ2V0ID0gc3RhZ2VJZDtcbiAgICBicmFuY2hTcGVjLm5leHQgPSB7IG5hbWU6IHN0YWdlSWQsIGlkOiBzdGFnZUlkLCB0eXBlOiAnbG9vcCcsIGlzTG9vcFJlZmVyZW5jZTogdHJ1ZSB9O1xuXG4gICAgLy8gQnJhbmNoLXNjb3BlZCBkZXNjcmlwdGlvbiDigJQgYXR0cmlidXRlIHRoZSBsb29wIHRvIHRoZSBicmFuY2gsIG5vdCB0aGVcbiAgICAvLyBkZWNpZGVyIChwYXJlbnREZXNjcmlwdGlvblBhcnRzIGlzIHRoZSBkZWNpZGVyJ3MgZGVzY3JpcHRpb24gY29udGV4dCkuXG4gICAgdGhpcy5wYXJlbnREZXNjcmlwdGlvblBhcnRzLnB1c2goYCAgIOKGkiBicmFuY2ggJyR7YnJhbmNoU3BlYy5pZH0nIGxvb3BzIGJhY2sgdG8gJHtzdGFnZUlkfWApO1xuXG4gICAgLy8gRmlyZSB0aGUgbG9vcCBiYWNrLWVkZ2UgU09VUkNFRCBGUk9NIFRIRSBCUkFOQ0ggc28gdmlzdWFsaXplcnMgcmVhZFxuICAgIC8vIGB0b29sLWNhbGxzIOKGkiBjb250ZXh0YCwgbm90IGBSb3V0ZSDihpIgY29udGV4dGAuXG4gICAgdGhpcy5iLl9maXJlTG9vcEVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyKGJyYW5jaFNwZWMuaWQsIHN0YWdlSWQpO1xuICB9XG5cbiAgZW5kKCk6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW47XG4gICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW0Zsb3dDaGFydEJ1aWxkZXJdIGRlY2lkZXIgYXQgJyR7dGhpcy5jdXJOb2RlLm5hbWV9JyByZXF1aXJlcyBhdCBsZWFzdCBvbmUgYnJhbmNoYCk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdGhhdCBldmVyeSBicmFuY2ggd2l0aCBubyBlbWJlZGRlZCBmbiBpcyByZXNvbHZhYmxlIGZyb20gdGhlIHN0YWdlTWFwXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgaWYgKCFjaGlsZC5mbiAmJiBjaGlsZC5pZCAmJiAhY2hpbGQuaXNTdWJmbG93Um9vdCAmJiAhY2hpbGQuc3ViZmxvd1Jlc29sdmVyKSB7XG4gICAgICAgIGNvbnN0IGhhc0luTWFwID0gdGhpcy5iLl9zdGFnZU1hcEhhcyhjaGlsZC5pZCkgfHwgdGhpcy5iLl9zdGFnZU1hcEhhcyhjaGlsZC5uYW1lKTtcbiAgICAgICAgaWYgKCFoYXNJbk1hcCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBbRmxvd0NoYXJ0QnVpbGRlcl0gZGVjaWRlciBicmFuY2ggJyR7Y2hpbGQuaWR9JyB1bmRlciAnJHt0aGlzLmN1ck5vZGUubmFtZX0nIGhhcyBubyBmdW5jdGlvbiDigJQgYCArXG4gICAgICAgICAgICAgIGBwcm92aWRlIGEgZm4gYXJndW1lbnQgdG8gYWRkRnVuY3Rpb25CcmFuY2goJyR7Y2hpbGQuaWR9JywgLi4uKWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY3VyTm9kZS5kZWNpZGVyRm4gPSB0cnVlO1xuXG4gICAgLy8gQnVpbGQgYnJhbmNoSWRzIEJFRk9SRSBhcHBlbmRpbmcgdGhlIHN5bnRoZXRpYyBkZWZhdWx0IOKAlCBvbmx5IHVzZXItc3BlY2lmaWVkIGJyYW5jaGVzXG4gICAgdGhpcy5jdXJTcGVjLmJyYW5jaElkcyA9IGNoaWxkcmVuXG4gICAgICAubWFwKChjKSA9PiBjLmlkKVxuICAgICAgLmZpbHRlcigoaWQpOiBpZCBpcyBzdHJpbmcgPT4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiBpZC5sZW5ndGggPiAwKTtcbiAgICB0aGlzLmN1clNwZWMudHlwZSA9ICdkZWNpZGVyJztcblxuICAgIGlmICh0aGlzLmRlZmF1bHRJZCkge1xuICAgICAgY29uc3QgZGVmYXVsdENoaWxkID0gY2hpbGRyZW4uZmluZCgoYykgPT4gYy5pZCA9PT0gdGhpcy5kZWZhdWx0SWQpO1xuICAgICAgaWYgKGRlZmF1bHRDaGlsZCkge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKHsgLi4uZGVmYXVsdENoaWxkLCBpZDogJ2RlZmF1bHQnLCBicmFuY2hJZDogJ2RlZmF1bHQnIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnJlc2VydmVkU3RlcE51bWJlciA+IDApIHtcbiAgICAgIGNvbnN0IGRlY2lkZXJMYWJlbCA9IHRoaXMuY3VyTm9kZS5uYW1lO1xuICAgICAgY29uc3QgYnJhbmNoSWRMaXN0ID0gdGhpcy5icmFuY2hEZXNjSW5mby5tYXAoKGIpID0+IGIuaWQpLmpvaW4oJywgJyk7XG4gICAgICBjb25zdCBtYWluTGluZSA9IHRoaXMuZGVjaWRlckRlc2NyaXB0aW9uXG4gICAgICAgID8gYCR7dGhpcy5yZXNlcnZlZFN0ZXBOdW1iZXJ9LiAke2RlY2lkZXJMYWJlbH0g4oCUICR7dGhpcy5kZWNpZGVyRGVzY3JpcHRpb259IChicmFuY2hlczogJHticmFuY2hJZExpc3R9KWBcbiAgICAgICAgOiBgJHt0aGlzLnJlc2VydmVkU3RlcE51bWJlcn0uICR7ZGVjaWRlckxhYmVsfSDigJQgRGVjaWRlcyBiZXR3ZWVuOiAke2JyYW5jaElkTGlzdH1gO1xuICAgICAgdGhpcy5wYXJlbnREZXNjcmlwdGlvblBhcnRzLnB1c2gobWFpbkxpbmUpO1xuXG4gICAgICBpZiAodGhpcy5kZWNpZGVyRGVzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5wYXJlbnRTdGFnZURlc2NyaXB0aW9ucy5zZXQodGhpcy5jdXJOb2RlLm5hbWUsIHRoaXMuZGVjaWRlckRlc2NyaXB0aW9uKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBicmFuY2ggb2YgdGhpcy5icmFuY2hEZXNjSW5mbykge1xuICAgICAgICBjb25zdCBicmFuY2hUZXh0ID0gYnJhbmNoLmRlc2NyaXB0aW9uO1xuICAgICAgICBpZiAoYnJhbmNoVGV4dCkge1xuICAgICAgICAgIHRoaXMucGFyZW50RGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAgICDihpIgJHticmFuY2guaWR9OiAke2JyYW5jaFRleHR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJyYW5jaC5kZXNjcmlwdGlvbikge1xuICAgICAgICAgIHRoaXMucGFyZW50U3RhZ2VEZXNjcmlwdGlvbnMuc2V0KGJyYW5jaC5pZCwgYnJhbmNoLmRlc2NyaXB0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEw3LjMg4oCUIGZpcmUgYG9uRGVjaWRlckNvbXBsZXRlYCBzbyBjb25zdW1lcnMgY2FuIHRydXN0IG5vIG1vcmVcbiAgICAvLyBicmFuY2hlcyB3aWxsIGFycml2ZSBmb3IgdGhpcyBkZWNpZGVyLiBCcmFuY2ggaXRlcmF0aW9uIG9yZGVyID1cbiAgICAvLyBhZGRpdGlvbiBvcmRlciA9IFNldCBpbnNlcnRpb24gb3JkZXIuXG4gICAgdGhpcy5iLl9maXJlRGVjaWRlckNvbXBsZXRlRnJvbVN1YkJ1aWxkZXIodGhpcy5jdXJTcGVjLmlkLCAnZGVjaWRlcicsIFsuLi50aGlzLmJyYW5jaElkc10sIHRoaXMuZGVmYXVsdElkKTtcbiAgICByZXR1cm4gdGhpcy5iO1xuICB9XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gU2VsZWN0b3JGbkxpc3QgKHNjb3BlLWJhc2VkIHNlbGVjdG9yIOKAlCBtaXJyb3JzIERlY2lkZXJMaXN0KVxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBjbGFzcyBTZWxlY3RvckZuTGlzdDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBiOiBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgY3VyTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgY3VyU3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlO1xuICBwcml2YXRlIHJlYWRvbmx5IGJyYW5jaElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50RGVzY3JpcHRpb25QYXJ0czogc3RyaW5nW107XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50U3RhZ2VEZXNjcmlwdGlvbnM6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzZXJ2ZWRTdGVwTnVtYmVyOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0b3JEZXNjcmlwdGlvbj86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBicmFuY2hEZXNjSW5mbzogQXJyYXk8eyBpZDogc3RyaW5nOyBkZXNjcmlwdGlvbj86IHN0cmluZyB9PiA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGJ1aWxkZXI6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPixcbiAgICBjdXJOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjdXJTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gICAgcGFyZW50RGVzY3JpcHRpb25QYXJ0czogc3RyaW5nW10gPSBbXSxcbiAgICBwYXJlbnRTdGFnZURlc2NyaXB0aW9uczogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKSxcbiAgICByZXNlcnZlZFN0ZXBOdW1iZXIgPSAwLFxuICAgIHNlbGVjdG9yRGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICkge1xuICAgIHRoaXMuYiA9IGJ1aWxkZXI7XG4gICAgdGhpcy5jdXJOb2RlID0gY3VyTm9kZTtcbiAgICB0aGlzLmN1clNwZWMgPSBjdXJTcGVjO1xuICAgIHRoaXMucGFyZW50RGVzY3JpcHRpb25QYXJ0cyA9IHBhcmVudERlc2NyaXB0aW9uUGFydHM7XG4gICAgdGhpcy5wYXJlbnRTdGFnZURlc2NyaXB0aW9ucyA9IHBhcmVudFN0YWdlRGVzY3JpcHRpb25zO1xuICAgIHRoaXMucmVzZXJ2ZWRTdGVwTnVtYmVyID0gcmVzZXJ2ZWRTdGVwTnVtYmVyO1xuICAgIHRoaXMuc2VsZWN0b3JEZXNjcmlwdGlvbiA9IHNlbGVjdG9yRGVzY3JpcHRpb247XG4gIH1cblxuICBhZGRGdW5jdGlvbkJyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbj86IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgaWYgKHRoaXMuYnJhbmNoSWRzLmhhcyhpZCkpIGZhaWwoYGR1cGxpY2F0ZSBzZWxlY3RvciBicmFuY2ggaWQgJyR7aWR9JyB1bmRlciAnJHt0aGlzLmN1ck5vZGUubmFtZX0nYCk7XG4gICAgdGhpcy5icmFuY2hJZHMuYWRkKGlkKTtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyBuYW1lOiBuYW1lID8/IGlkLCBpZCwgYnJhbmNoSWQ6IGlkIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgaWYgKGZuKSB7XG4gICAgICBub2RlLmZuID0gZm47XG4gICAgICB0aGlzLmIuX2FkZFRvTWFwKGlkLCBmbik7XG4gICAgfVxuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lOiBuYW1lID8/IGlkLCBpZCwgdHlwZTogJ3N0YWdlJyB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuXG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuID0gdGhpcy5jdXJOb2RlLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyTm9kZS5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbiA9IHRoaXMuY3VyU3BlYy5jaGlsZHJlbiB8fCBbXTtcbiAgICB0aGlzLmN1clNwZWMuY2hpbGRyZW4ucHVzaChzcGVjKTtcbiAgICAvLyBMNy4zIOKAlCBTZWxlY3RvciBicmFuY2guXG4gICAgdGhpcy5iLl9maXJlU3RhZ2VBZGRlZEZyb21TdWJCdWlsZGVyKHNwZWMpO1xuICAgIHRoaXMuYi5fZmlyZUVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyKHRoaXMuY3VyU3BlYy5pZCwgc3BlYy5pZCwgJ2RlY2lzaW9uLWJyYW5jaCcsIGlkKTtcblxuICAgIHRoaXMuYnJhbmNoRGVzY0luZm8ucHVzaCh7IGlkLCBkZXNjcmlwdGlvbiB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBwYXVzYWJsZSBzdGFnZSBhcyBhIHNlbGVjdG9yIGJyYW5jaC5cbiAgICpcbiAgICogV2hlbiB0aGlzIGJyYW5jaCBpcyBzZWxlY3RlZCwgdGhlIGhhbmRsZXIncyBgZXhlY3V0ZWAgcnVucy4gSWYgaXQgcmV0dXJuc1xuICAgKiBkYXRhLCB0aGUgcGlwZWxpbmUgcGF1c2VzLiBPbiByZXN1bWUsIGBoYW5kbGVyLnJlc3VtZWAgcnVucyB3aXRoIHRoZVxuICAgKiBodW1hbidzIGlucHV0LiBJZiBgZXhlY3V0ZWAgcmV0dXJucyB2b2lkLCB0aGUgc3RhZ2UgY29udGludWVzIG5vcm1hbGx5LlxuICAgKi9cbiAgYWRkUGF1c2FibGVGdW5jdGlvbkJyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBoYW5kbGVyOiBQYXVzYWJsZUhhbmRsZXI8VFNjb3BlPixcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgaWYgKHRoaXMuYnJhbmNoSWRzLmhhcyhpZCkpIGZhaWwoYGR1cGxpY2F0ZSBzZWxlY3RvciBicmFuY2ggaWQgJyR7aWR9JyB1bmRlciAnJHt0aGlzLmN1ck5vZGUubmFtZX0nYCk7XG4gICAgdGhpcy5icmFuY2hJZHMuYWRkKGlkKTtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZTogbmFtZSA/PyBpZCxcbiAgICAgIGlkLFxuICAgICAgYnJhbmNoSWQ6IGlkLFxuICAgICAgZm46IGhhbmRsZXIuZXhlY3V0ZSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgICBpc1BhdXNhYmxlOiB0cnVlLFxuICAgICAgcmVzdW1lRm46IGhhbmRsZXIucmVzdW1lLFxuICAgIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgdGhpcy5iLl9hZGRUb01hcChpZCwgaGFuZGxlci5leGVjdXRlIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPik7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWU6IG5hbWUgPz8gaWQsIGlkLCB0eXBlOiAnc3RhZ2UnLCBpc1BhdXNhYmxlOiB0cnVlIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG5cbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuID0gdGhpcy5jdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuICAgIC8vIEw3LjMg4oCUIFBhdXNhYmxlIHNlbGVjdG9yIGJyYW5jaC5cbiAgICB0aGlzLmIuX2ZpcmVTdGFnZUFkZGVkRnJvbVN1YkJ1aWxkZXIoc3BlYyk7XG4gICAgdGhpcy5iLl9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXIodGhpcy5jdXJTcGVjLmlkLCBzcGVjLmlkLCAnZGVjaXNpb24tYnJhbmNoJywgaWQpO1xuXG4gICAgdGhpcy5icmFuY2hEZXNjSW5mby5wdXNoKHsgaWQsIGRlc2NyaXB0aW9uIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkU3ViRmxvd0NoYXJ0QnJhbmNoKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgc3ViZmxvdzogRmxvd0NoYXJ0PGFueSwgYW55PixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGlmICh0aGlzLmJyYW5jaElkcy5oYXMoaWQpKSBmYWlsKGBkdXBsaWNhdGUgc2VsZWN0b3IgYnJhbmNoIGlkICcke2lkfScgdW5kZXIgJyR7dGhpcy5jdXJOb2RlLm5hbWV9J2ApO1xuICAgIHRoaXMuYnJhbmNoSWRzLmFkZChpZCk7XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcbiAgICBjb25zdCBwcmVmaXhlZFJvb3QgPSB0aGlzLmIuX3ByZWZpeE5vZGVUcmVlKHN1YmZsb3cucm9vdCwgaWQpO1xuXG4gICAgaWYgKCF0aGlzLmIuX3N1YmZsb3dEZWZzLmhhcyhpZCkpIHtcbiAgICAgIHRoaXMuYi5fc3ViZmxvd0RlZnMuc2V0KGlkLCB7IHJvb3Q6IHByZWZpeGVkUm9vdCB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgaWQsXG4gICAgICBicmFuY2hJZDogaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMpIG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBzdWJmbG93U3RydWN0dXJlOiBzdWJmbG93LmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICB9O1xuICAgIC8vIFNUUlVDVFVSRS1PTkxZIGNvbnZlcmdlbmNlIG92ZXJyaWRlIChzZWUgYF9maXJlTmV4dEVkZ2VGcm9tUGFyZW50YCArXG4gICAgLy8gYFN1YmZsb3dNb3VudE9wdGlvbnMuY29udmVyZ2VBdGApOiB0aGlzIGJyYW5jaCdzIGNvbnZlcmdlbmNlIGVkZ2UgcG9pbnRzIGF0XG4gICAgLy8gYGNvbnZlcmdlQXRgIChhIERPV05TVFJFQU0gc3RhZ2UpIGluc3RlYWQgb2YgdGhlIHNoYXJlZCBuZXh0IHN0YWdlIOKAlCBlLmcuIGFcbiAgICAvLyBgdG9vbHNgIHNsb3QgdGhhdCBieXBhc3NlcyBgbWVzc2FnZUFQSWAgdG8gcGFpciB3aXRoIGl0cyBvdXRwdXQgYXRcbiAgICAvLyBgY2FsbC1sbG1gLiBWaXN1YWxpemF0aW9uLW9ubHk6IE5PIHJ1bnRpbWUgam9pbiBiYXJyaWVyIChkYXRhIHJpZGVzIHNjb3BlKS5cbiAgICBpZiAob3B0aW9ucz8uY29udmVyZ2VBdCkgc3BlYy5jb252ZXJnZUF0ID0gb3B0aW9ucy5jb252ZXJnZUF0O1xuXG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuID0gdGhpcy5jdXJOb2RlLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyTm9kZS5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbiA9IHRoaXMuY3VyU3BlYy5jaGlsZHJlbiB8fCBbXTtcbiAgICB0aGlzLmN1clNwZWMuY2hpbGRyZW4ucHVzaChzcGVjKTtcbiAgICAvLyBMNy4zIOKAlCBTdWJmbG93IGFzIHNlbGVjdG9yIGJyYW5jaC5cbiAgICB0aGlzLmIuX2ZpcmVTdGFnZUFkZGVkRnJvbVN1YkJ1aWxkZXIoc3BlYyk7XG4gICAgdGhpcy5iLl9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXIodGhpcy5jdXJTcGVjLmlkLCBzcGVjLmlkLCAnZGVjaXNpb24tYnJhbmNoJywgaWQpO1xuICAgIHRoaXMuYi5fZmlyZVN1YmZsb3dNb3VudGVkRnJvbVN1YkJ1aWxkZXIoaWQsIHN1YmZsb3dOYW1lLCBpZCwgZmFsc2UsIHN1YmZsb3cuYnVpbGRUaW1lU3RydWN0dXJlKTtcblxuICAgIHRoaXMuYi5fbWVyZ2VTdGFnZU1hcChzdWJmbG93LnN0YWdlTWFwLCBpZCk7XG4gICAgdGhpcy5iLl9tZXJnZVN1YmZsb3dzKHN1YmZsb3cuc3ViZmxvd3MsIGlkKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkTGF6eVN1YkZsb3dDaGFydEJyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIHJlc29sdmVyOiAoKSA9PiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG1vdW50TmFtZT86IHN0cmluZyxcbiAgICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9ucyxcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgaWYgKHRoaXMuYnJhbmNoSWRzLmhhcyhpZCkpIGZhaWwoYGR1cGxpY2F0ZSBzZWxlY3RvciBicmFuY2ggaWQgJyR7aWR9JyB1bmRlciAnJHt0aGlzLmN1ck5vZGUubmFtZX0nYCk7XG4gICAgdGhpcy5icmFuY2hJZHMuYWRkKGlkKTtcblxuICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gbW91bnROYW1lIHx8IGlkO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIGlkLFxuICAgICAgYnJhbmNoSWQ6IGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHN1YmZsb3dSZXNvbHZlcjogcmVzb2x2ZXIgYXMgYW55LFxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMpIG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBpc0xhenk6IHRydWUsXG4gICAgfTtcblxuICAgIHRoaXMuY3VyTm9kZS5jaGlsZHJlbiA9IHRoaXMuY3VyTm9kZS5jaGlsZHJlbiB8fCBbXTtcbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICB0aGlzLmN1clNwZWMuY2hpbGRyZW4gPSB0aGlzLmN1clNwZWMuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuLnB1c2goc3BlYyk7XG4gICAgLy8gTDcuMyDigJQgTGF6eSBzdWJmbG93IGFzIHNlbGVjdG9yIGJyYW5jaC5cbiAgICB0aGlzLmIuX2ZpcmVTdGFnZUFkZGVkRnJvbVN1YkJ1aWxkZXIoc3BlYyk7XG4gICAgdGhpcy5iLl9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXIodGhpcy5jdXJTcGVjLmlkLCBzcGVjLmlkLCAnZGVjaXNpb24tYnJhbmNoJywgaWQpO1xuICAgIHRoaXMuYi5fZmlyZVN1YmZsb3dNb3VudGVkRnJvbVN1YkJ1aWxkZXIoaWQsIHN1YmZsb3dOYW1lLCBpZCwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZEJyYW5jaExpc3QoXG4gICAgYnJhbmNoZXM6IEFycmF5PHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBmbj86IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPjtcbiAgICB9PixcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgZm9yIChjb25zdCB7IGlkLCBuYW1lLCBmbiB9IG9mIGJyYW5jaGVzKSB7XG4gICAgICB0aGlzLmFkZEZ1bmN0aW9uQnJhbmNoKGlkLCBuYW1lLCBmbik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZW5kKCk6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW47XG4gICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW0Zsb3dDaGFydEJ1aWxkZXJdIHNlbGVjdG9yIGF0ICcke3RoaXMuY3VyTm9kZS5uYW1lfScgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGJyYW5jaGApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgZXZlcnkgYnJhbmNoIHdpdGggbm8gZW1iZWRkZWQgZm4gaXMgcmVzb2x2YWJsZSBmcm9tIHRoZSBzdGFnZU1hcFxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgIGlmICghY2hpbGQuZm4gJiYgY2hpbGQuaWQgJiYgIWNoaWxkLmlzU3ViZmxvd1Jvb3QgJiYgIWNoaWxkLnN1YmZsb3dSZXNvbHZlcikge1xuICAgICAgICBjb25zdCBoYXNJbk1hcCA9IHRoaXMuYi5fc3RhZ2VNYXBIYXMoY2hpbGQuaWQpIHx8IHRoaXMuYi5fc3RhZ2VNYXBIYXMoY2hpbGQubmFtZSk7XG4gICAgICAgIGlmICghaGFzSW5NYXApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgW0Zsb3dDaGFydEJ1aWxkZXJdIHNlbGVjdG9yIGJyYW5jaCAnJHtjaGlsZC5pZH0nIHVuZGVyICcke3RoaXMuY3VyTm9kZS5uYW1lfScgaGFzIG5vIGZ1bmN0aW9uIOKAlCBgICtcbiAgICAgICAgICAgICAgYHByb3ZpZGUgYSBmbiBhcmd1bWVudCB0byBhZGRGdW5jdGlvbkJyYW5jaCgnJHtjaGlsZC5pZH0nLCAuLi4pYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jdXJOb2RlLnNlbGVjdG9yRm4gPSB0cnVlO1xuXG4gICAgdGhpcy5jdXJTcGVjLmJyYW5jaElkcyA9IGNoaWxkcmVuXG4gICAgICAubWFwKChjKSA9PiBjLmlkKVxuICAgICAgLmZpbHRlcigoaWQpOiBpZCBpcyBzdHJpbmcgPT4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiBpZC5sZW5ndGggPiAwKTtcbiAgICB0aGlzLmN1clNwZWMudHlwZSA9ICdzZWxlY3Rvcic7IC8vIHdhcyAnZGVjaWRlcicg4oCUIGluY29ycmVjdDsgc2VsZWN0b3JzIGFyZSBkaXN0aW5jdCBmcm9tIGRlY2lkZXJzXG4gICAgdGhpcy5jdXJTcGVjLmhhc1NlbGVjdG9yID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLnJlc2VydmVkU3RlcE51bWJlciA+IDApIHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yTGFiZWwgPSB0aGlzLmN1ck5vZGUubmFtZTtcbiAgICAgIGNvbnN0IGJyYW5jaElkTGlzdCA9IHRoaXMuYnJhbmNoRGVzY0luZm8ubWFwKChiKSA9PiBiLmlkKS5qb2luKCcsICcpO1xuICAgICAgY29uc3QgbWFpbkxpbmUgPSB0aGlzLnNlbGVjdG9yRGVzY3JpcHRpb25cbiAgICAgICAgPyBgJHt0aGlzLnJlc2VydmVkU3RlcE51bWJlcn0uICR7c2VsZWN0b3JMYWJlbH0g4oCUICR7dGhpcy5zZWxlY3RvckRlc2NyaXB0aW9ufWBcbiAgICAgICAgOiBgJHt0aGlzLnJlc2VydmVkU3RlcE51bWJlcn0uICR7c2VsZWN0b3JMYWJlbH0g4oCUIFNlbGVjdHMgZnJvbTogJHticmFuY2hJZExpc3R9YDtcbiAgICAgIHRoaXMucGFyZW50RGVzY3JpcHRpb25QYXJ0cy5wdXNoKG1haW5MaW5lKTtcblxuICAgICAgaWYgKHRoaXMuc2VsZWN0b3JEZXNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLnBhcmVudFN0YWdlRGVzY3JpcHRpb25zLnNldCh0aGlzLmN1ck5vZGUubmFtZSwgdGhpcy5zZWxlY3RvckRlc2NyaXB0aW9uKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBicmFuY2ggb2YgdGhpcy5icmFuY2hEZXNjSW5mbykge1xuICAgICAgICBjb25zdCBicmFuY2hUZXh0ID0gYnJhbmNoLmRlc2NyaXB0aW9uO1xuICAgICAgICBpZiAoYnJhbmNoVGV4dCkgdGhpcy5wYXJlbnREZXNjcmlwdGlvblBhcnRzLnB1c2goYCAgIOKGkiAke2JyYW5jaC5pZH06ICR7YnJhbmNoVGV4dH1gKTtcbiAgICAgICAgaWYgKGJyYW5jaC5kZXNjcmlwdGlvbikgdGhpcy5wYXJlbnRTdGFnZURlc2NyaXB0aW9ucy5zZXQoYnJhbmNoLmlkLCBicmFuY2guZGVzY3JpcHRpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEw3LjMg4oCUIGZpcmUgYG9uRGVjaWRlckNvbXBsZXRlYCB3aXRoIHR5cGU9J3NlbGVjdG9yJy4gU2VsZWN0b3JzXG4gICAgLy8gaGF2ZSBubyBkZWZhdWx0IGJyYW5jaCAobXVsdGktc2VsZWN0IHNlbWFudGljcyBkaWZmZXIpOyBwYXNzXG4gICAgLy8gdW5kZWZpbmVkLlxuICAgIHRoaXMuYi5fZmlyZURlY2lkZXJDb21wbGV0ZUZyb21TdWJCdWlsZGVyKHRoaXMuY3VyU3BlYy5pZCwgJ3NlbGVjdG9yJywgWy4uLnRoaXMuYnJhbmNoSWRzXSk7XG4gICAgcmV0dXJuIHRoaXMuYjtcbiAgfVxufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEZsb3dDaGFydEJ1aWxkZXJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgY2xhc3MgRmxvd0NoYXJ0QnVpbGRlcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSBfcm9vdD86IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIF9yb290U3BlYz86IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgcHJpdmF0ZSBfY3Vyc29yPzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgX2N1cnNvclNwZWM/OiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmU7XG4gIHByaXZhdGUgX3N0YWdlTWFwID0gbmV3IE1hcDxzdHJpbmcsIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPj4oKTtcbiAgX3N1YmZsb3dEZWZzID0gbmV3IE1hcDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfT4oKTtcbiAgcHJpdmF0ZSBfc3RyZWFtSGFuZGxlcnM6IFN0cmVhbUhhbmRsZXJzID0ge307XG4gIC8qKlxuICAgKiBMNy4zIOKAlCBCdWlsZC10aW1lIG9ic2VydmVyIGZhbi1vdXQuIE93bmVkIGJ5IHRoZSBidWlsZGVyIHNvIGV2ZXJ5XG4gICAqIGBhZGRYKClgIG1ldGhvZCBjYW4gZmlyZSBgU3RydWN0dXJlUmVjb3JkZXJgIGV2ZW50cyBhdCB0aGUgbmF0dXJhbFxuICAgKiBtb21lbnQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgbXV0YXRpb24uIERpc3BhdGNoZXIgaXMgYWxsb2NhdGVkXG4gICAqIGxhemlseSBvbiBmaXJzdCBhdHRhY2ggdG8ga2VlcCB0aGUgemVyby1yZWNvcmRlciBwYXRoIGFsbG9jYXRpb24tXG4gICAqIGZyZWUuXG4gICAqL1xuICBwcml2YXRlIF9zdHJ1Y3R1cmVEaXNwYXRjaGVyPzogU3RydWN0dXJlUmVjb3JkZXJEaXNwYXRjaGVyO1xuICAvKipcbiAgICogTDcuMyDigJQgU2VhbGVkLWFmdGVyLWJ1aWxkIGZsYWcgKFBhbmVsIDIgcGhhc2UgaW52YXJpYW50KS4gRmxpcHNcbiAgICogdG8gYHRydWVgIHdoZW4gYC5idWlsZCgpYCByZXR1cm5zOyBzdWJzZXF1ZW50IGBhdHRhY2hTdHJ1Y3R1cmVSZWNvcmRlcmBcbiAgICogdGhyb3dzLiBQcmV2ZW50cyB0aGUgZm9vdGd1biB3aGVyZSBhIGNvbnN1bWVyIGF0dGFjaGVzIGEgcmVjb3JkZXJcbiAgICogbWlkLWV4ZWN1dGlvbiBhbmQgZ2V0cyBwYXJ0aWFsIHN0cnVjdHVyZSBkYXRhIChtaXNzZWQgZXZlcnkgZXZlbnRcbiAgICogYWxyZWFkeSBmaXJlZCBkdXJpbmcgY29uc3RydWN0aW9uKS5cbiAgICovXG4gIHByaXZhdGUgX3NlYWxlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9lbmFibGVOYXJyYXRpdmUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbG9nZ2VyPzogSUxvZ2dlcjtcbiAgcHJpdmF0ZSBfZGVzY3JpcHRpb25QYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBfc3RlcENvdW50ZXIgPSAwO1xuICAvLyBOT1RFOiBrZXllZCBieSBzdGFnZSBuYW1lIChmb3IgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb25zKSwgd2hpbGUgc3RhZ2VNYXBcbiAgLy8gYW5kIGtub3duU3RhZ2VJZHMgdXNlIGlkIChzdGFibGUgaWRlbnRpZmllcikuIFRoZXNlIGFyZSBpbnRlbnRpb25hbGx5IGRpZmZlcmVudFxuICAvLyBuYW1lc3BhY2VzIOKAlCBkZXNjcmlwdGlvbnMgYXJlIHByZXNlbnRhdGlvbmFsLCBsb29rdXBzIGFyZSBzdHJ1Y3R1cmFsLlxuICBwcml2YXRlIF9zdGFnZURlc2NyaXB0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIHByaXZhdGUgX3N0YWdlU3RlcE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIHByaXZhdGUgX2tub3duU3RhZ2VJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBfaW5wdXRTY2hlbWE/OiB1bmtub3duO1xuICBwcml2YXRlIF9vdXRwdXRTY2hlbWE/OiB1bmtub3duO1xuICBwcml2YXRlIF9vdXRwdXRNYXBwZXI/OiAoZmluYWxTY29wZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHVua25vd247XG4gIHByaXZhdGUgX3Njb3BlRmFjdG9yeT86IFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuXG4gIC8vIOKUgOKUgCBMNy4zIOKAlCBTdHJ1Y3R1cmVSZWNvcmRlciBhdHRhY2ggKyBkaXNwYXRjaCBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBgU3RydWN0dXJlUmVjb3JkZXJgIGZvciBidWlsZC1waGFzZSBvYnNlcnZhdGlvbi4gTXVsdGlwbGVcbiAgICogcmVjb3JkZXJzIGNvZXhpc3QgKHNhbWUgaWQgYWxsb3dlZDsgaXRlcmF0aW9uIG9yZGVyID0gYXR0YWNoXG4gICAqIG9yZGVyKS4gVGhyb3dzIGlmIGNhbGxlZCBhZnRlciBgLmJ1aWxkKClgIOKAlCB0aGUgY2hhcnQgaXMgc2VhbGVkIGF0XG4gICAqIHRoYXQgcG9pbnQgYW5kIGFueSByZWNvcmRlciBhdHRhY2hlZCBsYXRlIHdvdWxkIG1pc3MgZXZlcnkgZXZlbnRcbiAgICogZmlyZWQgZHVyaW5nIGNvbnN0cnVjdGlvbi5cbiAgICpcbiAgICogKipTZWVkIHJlcGxheSoqOiB3aGVuIHRoaXMgaXMgY2FsbGVkIEFGVEVSIGBzdGFydCgpYCBoYXMgYWxyZWFkeVxuICAgKiBmaXJlZCAoaS5lLiwgYWZ0ZXIgdGhlIGBmbG93Q2hhcnQoKWAgZmFjdG9yeSByZXR1cm5zKSwgdGhlXG4gICAqIGp1c3QtYXR0YWNoZWQgcmVjb3JkZXIgcmVjZWl2ZXMgYSBvbmUtdGltZSBgb25TdGFnZUFkZGVkYCBmb3IgdGhlXG4gICAqIHJvb3Qgc3RhZ2Ugc28gaXQgb2JzZXJ2ZXMgdGhlIHNlZWQuIE9ubHkgdGhlIG5ldyByZWNvcmRlciBzZWVzXG4gICAqIHRoZSByZXBsYXk7IGFscmVhZHktYXR0YWNoZWQgcmVjb3JkZXJzIGFyZSBub3QgcmUtZmlyZWQuXG4gICAqXG4gICAqICoqTWlkLWNoYWluIGF0dGFjaCBjYXZlYXQqKjogYSByZWNvcmRlciBhdHRhY2hlZCBBRlRFUiBvbmUgb3IgbW9yZVxuICAgKiBgYWRkWCgpYCBjYWxscyByZWNlaXZlcyB0aGUgc2VlZCByZXBsYXkgYnV0IE1JU1NFUyBldmVyeVxuICAgKiBpbnRlcm1lZGlhdGUgZXZlbnQuIEF0dGFjaCBCRUZPUkUgdGhlIGZpcnN0IGBhZGRYKClgIGZvciBjb21wbGV0ZVxuICAgKiBjYXB0dXJlLlxuICAgKlxuICAgKiBQdWJsaWMgZm9yIG5vdyB0byBlbmFibGUgZGlyZWN0IGF0dGFjaCBpbiB0ZXN0cyArIGVhcmx5IGNvbnN1bWVycy5cbiAgICogTDcuNCB3aWxsIHdpcmUgYGZsb3dDaGFydCguLi4sIHsgc3RydWN0dXJlUmVjb3JkZXJzOiBbLi4uXSB9KWAgYXNcbiAgICogYW4gYWRkaXRpb25hbCByZWdpc3RyYXRpb24gc2l0ZTsgdGhpcyBtZXRob2Qgd2lsbCByZW1haW4uXG4gICAqL1xuICBhdHRhY2hTdHJ1Y3R1cmVSZWNvcmRlcihyZWNvcmRlcjogU3RydWN0dXJlUmVjb3JkZXIpOiB0aGlzIHtcbiAgICBpZiAodGhpcy5fc2VhbGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBbRmxvd0NoYXJ0QnVpbGRlcl0gYXR0YWNoU3RydWN0dXJlUmVjb3JkZXIoJyR7cmVjb3JkZXIuaWR9JykgY2FsbGVkIGFmdGVyIC5idWlsZCgpIOKAlCBjaGFydCBpcyBzZWFsZWQ7IGAgK1xuICAgICAgICAgICd0aGUgcmVjb3JkZXIgd291bGQgbWlzcyBldmVyeSBzdHJ1Y3R1cmUgZXZlbnQgZnJvbSBjb25zdHJ1Y3Rpb24uIEF0dGFjaCBCRUZPUkUgLmJ1aWxkKCkuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikge1xuICAgICAgdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlciA9IG5ldyBTdHJ1Y3R1cmVSZWNvcmRlckRpc3BhdGNoZXIoKTtcbiAgICB9XG4gICAgdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlci5hdHRhY2gocmVjb3JkZXIpO1xuICAgIC8vIFRoZSBzZWVkIGZpcmVzIGluc2lkZSBgc3RhcnQoKWAg4oCUIHRoYXQgcnVucyBCRUZPUkUgdGhlIGNvbnN1bWVyXG4gICAgLy8gY2FuIHBvc3QtY29uc3RydWN0IGF0dGFjaC4gUmVwbGF5IHRoZSBzZWVkIGV2ZW50IE9OTFkgaW50byB0aGVcbiAgICAvLyBqdXN0LWF0dGFjaGVkIHJlY29yZGVyIHNvIG90aGVyIGFscmVhZHktYXR0YWNoZWQgcmVjb3JkZXJzIGRvbid0XG4gICAgLy8gc2VlIGEgZHVwbGljYXRlLiBFcnJvcnMgYXJlIHJvdXRlZCB0aHJvdWdoIHRoZSBkaXNwYXRjaGVyJ3NcbiAgICAvLyBhY2N1bXVsYXRvciBzbyB0aGUgY29udHJhY3Qgc3RheXMgdW5pZm9ybS5cbiAgICBpZiAodGhpcy5fcm9vdFNwZWMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlY29yZGVyLm9uU3RhZ2VBZGRlZD8uKHtcbiAgICAgICAgICBzdGFnZUlkOiB0aGlzLl9yb290U3BlYy5pZCxcbiAgICAgICAgICBuYW1lOiB0aGlzLl9yb290U3BlYy5uYW1lLFxuICAgICAgICAgIHR5cGU6IHRoaXMuX3Jvb3RTcGVjLnR5cGUgPz8gJ3N0YWdlJyxcbiAgICAgICAgICAuLi4odGhpcy5fcm9vdFNwZWMuaXNQYXVzYWJsZSA9PT0gdHJ1ZSAmJiB7IGlzUGF1c2FibGU6IHRydWUgfSksXG4gICAgICAgICAgc3BlYzogdGhpcy5fcm9vdFNwZWMgYXMgdW5rbm93biBhcyBGbG93Q2hhcnRTcGVjLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyLnJlY29yZEVycm9yRm9yUmVwbGF5KHJlY29yZGVyLmlkLCAnb25TdGFnZUFkZGVkJywgZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSW5zcGVjdCBhY2N1bXVsYXRlZCBgU3RydWN0dXJlQnVpbGRFcnJvcmBzLiBSZXR1cm5zIGVtcHR5IGFycmF5XG4gICAqIHdoZW4gbm8gcmVjb3JkZXJzIGF0dGFjaGVkIE9SIG5vIGVycm9ycyBvY2N1cnJlZC4gUmV0dXJucyBhXG4gICAqIGRlZmVuc2l2ZSBjb3B5IOKAlCBjYWxsZXIgbXV0YXRpb25zIGRvIG5vdCBhZmZlY3Qgc3Vic2VxdWVudCBjYWxscy5cbiAgICpcbiAgICogKipDYWxsIG9uIHRoZSBCVUlMREVSLCBub3QgdGhlIGNoYXJ0IHJldHVybmVkIGJ5IGAuYnVpbGQoKWAuKipcbiAgICogQ2FwdHVyZSB0aGUgYnVpbGRlciByZWZlcmVuY2UgYmVmb3JlIGAuYnVpbGQoKWAgaWYgeW91IG5lZWRcbiAgICogcG9zdC1idWlsZCBhY2Nlc3M6XG4gICAqIGBgYHRzXG4gICAqIGNvbnN0IGJ1aWxkZXIgPSBmbG93Q2hhcnQoLi4uKS5hdHRhY2hTdHJ1Y3R1cmVSZWNvcmRlcihyZWMpO1xuICAgKiBjb25zdCBjaGFydCA9IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICogY29uc3QgZXJyb3JzID0gYnVpbGRlci5nZXRTdHJ1Y3R1cmVCdWlsZEVycm9ycygpO1xuICAgKiBgYGBcbiAgICovXG4gIGdldFN0cnVjdHVyZUJ1aWxkRXJyb3JzKCk6IFJldHVyblR5cGU8U3RydWN0dXJlUmVjb3JkZXJEaXNwYXRjaGVyWydnZXRFcnJvcnMnXT4ge1xuICAgIHJldHVybiB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyPy5nZXRFcnJvcnMoKSA/PyBbXTtcbiAgfVxuXG4gIC8vIENvbnZlbmllbmNlIGZpcmUgaGVscGVycyDigJQgbm8tb3Agd2hlbiBubyBkaXNwYXRjaGVyIGF0dGFjaGVkLiBLZWVwc1xuICAvLyBldmVyeSBjYWxsIHNpdGUgYSBvbmUtbGluZXIgd2l0aG91dCB0aGUgYGlmICh0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyKWBcbiAgLy8gYm9pbGVycGxhdGUgZXZlcnl3aGVyZS5cbiAgcHJpdmF0ZSBfZmlyZVN0YWdlQWRkZWQoc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyKSByZXR1cm47XG4gICAgLy8gUmVhZCBgaXNQYXVzYWJsZWAgZGlyZWN0bHkgZnJvbSB0aGUgc3BlYyDigJQgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aC5cbiAgICAvLyBUaGUgcHJldmlvdXMgYGV4dHJhc2AgYXJndW1lbnQgd2FzIGEgc3ViLWJ1aWxkZXIgZm9vdGd1bjogYnJhbmNoXG4gICAgLy8gaGVscGVycyBpbiBEZWNpZGVyTGlzdC9TZWxlY3RvckZuTGlzdCB3ZW50IHRocm91Z2hcbiAgICAvLyBgX2ZpcmVTdGFnZUFkZGVkRnJvbVN1YkJ1aWxkZXJgIHdoaWNoIGRyb3BwZWQgdGhlIGV4dHJhcywgc2lsZW50bHlcbiAgICAvLyBsb3NpbmcgYGlzUGF1c2FibGU6IHRydWVgIG9uIHBhdXNhYmxlIGRlY2lkZXIvc2VsZWN0b3IgYnJhbmNoZXMuXG4gICAgY29uc3QgaXNQYXVzYWJsZSA9IHNwZWMuaXNQYXVzYWJsZSA9PT0gdHJ1ZTtcbiAgICB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyLmZpcmVTdGFnZUFkZGVkKHtcbiAgICAgIHN0YWdlSWQ6IHNwZWMuaWQsXG4gICAgICBuYW1lOiBzcGVjLm5hbWUsXG4gICAgICB0eXBlOiBzcGVjLnR5cGUgPz8gJ3N0YWdlJyxcbiAgICAgIC4uLihpc1BhdXNhYmxlICYmIHsgaXNQYXVzYWJsZTogdHJ1ZSB9KSxcbiAgICAgIHNwZWM6IHNwZWMgYXMgdW5rbm93biBhcyBGbG93Q2hhcnRTcGVjLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZUVkZ2VBZGRlZChmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGtpbmQ6IFN0cnVjdHVyZUVkZ2VLaW5kLCBsYWJlbD86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikgcmV0dXJuO1xuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuZmlyZUVkZ2VBZGRlZCh7XG4gICAgICBmcm9tLFxuICAgICAgdG8sXG4gICAgICBraW5kLFxuICAgICAgLi4uKGxhYmVsICE9PSB1bmRlZmluZWQgJiYgeyBsYWJlbCB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpcmVMb29wRWRnZUFkZGVkKGZyb206IHN0cmluZywgdG86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikgcmV0dXJuO1xuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuZmlyZUxvb3BFZGdlQWRkZWQoeyBmcm9tLCB0byB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlIHRoZSBgbmV4dGAgZWRnZShzKSBmcm9tIGEgcGFyZW50IHNwZWMgdG8gYSBmcmVzaGx5LWFkZGVkXG4gICAqIG5vZGUg4oCUIHdpdGggY29udmVyZ2VuY2UgZXhwYW5zaW9uIHdoZW4gdGhlIHBhcmVudCBpcyBhXG4gICAqIGZvcmsgLyBkZWNpZGVyIC8gc2VsZWN0b3Igd2l0aCBicmFuY2hlcy5cbiAgICpcbiAgICogQSBmb3JrIGF0IGBwYXJlbnRgIGlzIHNlbWFudGljYWxseSBgcGFyZW50IOKUgOKUgGZvcmstYnJhbmNo4pSA4pSA4pa6IGNoaWxkW2ldYFxuICAgKiBmb3IgZWFjaCBjaGlsZCwgYW5kIHRoZSBjaGFpbmVkIGAuYWRkRnVuY3Rpb24oWClgIGNvbnRpbnVlc1xuICAgKiBBRlRFUiB0aGUgZm9yayBjb252ZXJnZXMuIFRoZSBydW50aW1lIHNlbWFudGljcyBhcmUgdGhhdCBlYWNoXG4gICAqIGNoaWxkIElOREVQRU5ERU5UTFkgZmVlZHMgYFhgIChwYXJhbGxlbCBjb21wbGV0aW9uIOKGkiBqb2luKS4gVGhlXG4gICAqIGxpdGVyYWwgXCJlZGdlIGZyb20gcGFyZW50IHRvIFhcIiB3b3VsZCBtaXNyZXByZXNlbnQgdGhpcyDigJRcbiAgICogdmlzdWFsaXplcnMgYW5kIHRvcG9sb2dpY2FsIGFsZ29yaXRobXMgd291bGQgc2VlIG9uZSBlZGdlIHdoZXJlXG4gICAqIHRoZXJlIHNob3VsZCBiZSBOIGNvbnZlcmdlbmNlIGVkZ2VzLlxuICAgKlxuICAgKiBGaXg6IHdoZW4gYHBhcmVudFNwZWNgIGhhcyBicmFuY2ggY2hpbGRyZW4gKGZvcmsgb3IgYnJhbmNoZWRcbiAgICogZGVjaWRlci9zZWxlY3RvciksIGZpcmUgb25lIGBuZXh0YCBlZGdlIGZyb20gRUFDSCBjaGlsZCB0byB0aGVcbiAgICogdGFyZ2V0LiBPdGhlcndpc2UgZmlyZSB0aGUgc2luZ2xlIGVkZ2UgZnJvbSBgcGFyZW50U3BlY2AgaXRzZWxmLlxuICAgKlxuICAgKiBMb29wLXJlZmVyZW5jZSBjaGlsZHJlbiAoc3ludGhldGljIHNwZWMgbm9kZXMgY3JlYXRlZCBieVxuICAgKiBgLmxvb3BUbygpYCkgYXJlIGV4Y2x1ZGVkIOKAlCB0aGV5J3JlIGJhY2stZWRnZSBtYXJrZXJzLCBub3RcbiAgICogY29udmVyZ2VuY2Ugc291cmNlcy4gQSBicmFuY2ggdGhhdCBjYXJyaWVzIGFuIE9XTiBsb29wLWJhY2sgYG5leHRgXG4gICAqIChhIGJyYW5jaC1zb3VyY2VkIGBsb29wVG9gKSBpcyBsaWtld2lzZSBza2lwcGVkIOKAlCBpdCBsb29wcywgaXQgZG9lc1xuICAgKiBub3QgY29udmVyZ2UgYXQgdGhlIGxpbmVhciBuZXh0IHN0YWdlLlxuICAgKlxuICAgKiBBIGJyYW5jaCBjYXJyeWluZyBgY29udmVyZ2VBdGAgaXMgUkVESVJFQ1RFRDogaXRzIHNpbmdsZSBjb252ZXJnZW5jZVxuICAgKiBlZGdlIGZpcmVzIHRvIGl0cyBuYW1lZCB0YXJnZXQgaW5zdGVhZCBvZiBgdGFyZ2V0SWRgIOKAlCBleHByZXNzaW5nIGFuXG4gICAqIHVuZXF1YWwtZGVwdGggbWVyZ2UgKGUuZy4gYHRvb2xzIOKGkiBjYWxsLWxsbWAsIGJ5cGFzc2luZyBgbWVzc2FnZS1hcGlgKS5cbiAgICogVGhlIG5hbWVkIHRhcmdldCBpcyBhIGZvcndhcmQgc3RhZ2UsIHNvIGl0IGlzIE5PVCB2YWxpZGF0ZWQgaGVyZS5cbiAgICpcbiAgICogQ2FsbCBPUkRFUiBjb25zdHJhaW50OiBtdXN0IGJlIGNhbGxlZCBCRUZPUkUgdGhlIGN1cnNvciBhZHZhbmNlc1xuICAgKiB0byB0aGUgbmV3IHRhcmdldC4gVGhlIGNhbGxlciBwYXNzZXMgdGhlIFBSRS1BRFZBTkNFIHBhcmVudCBzcGVjLlxuICAgKi9cbiAgcHJpdmF0ZSBfZmlyZU5leHRFZGdlRnJvbVBhcmVudChwYXJlbnRTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsIHRhcmdldElkOiBzdHJpbmcsIGxhYmVsPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyKSByZXR1cm47XG4gICAgY29uc3QgY2hpbGRTcGVjcyA9IHBhcmVudFNwZWMuY2hpbGRyZW47XG4gICAgY29uc3QgaXNCcmFuY2hpbmdQYXJlbnQgPVxuICAgICAgKHBhcmVudFNwZWMudHlwZSA9PT0gJ2ZvcmsnIHx8IHBhcmVudFNwZWMudHlwZSA9PT0gJ2RlY2lkZXInIHx8IHBhcmVudFNwZWMudHlwZSA9PT0gJ3NlbGVjdG9yJykgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkoY2hpbGRTcGVjcykgJiZcbiAgICAgIGNoaWxkU3BlY3MubGVuZ3RoID4gMDtcbiAgICBpZiAoIWlzQnJhbmNoaW5nUGFyZW50KSB7XG4gICAgICB0aGlzLl9maXJlRWRnZUFkZGVkKHBhcmVudFNwZWMuaWQsIHRhcmdldElkLCAnbmV4dCcsIGxhYmVsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZFNwZWNzISkge1xuICAgICAgaWYgKGNoaWxkLmlzTG9vcFJlZmVyZW5jZSkgY29udGludWU7XG4gICAgICAvLyBBIGJyYW5jaCB3aXRoIGl0cyBvd24gbG9vcC1iYWNrIG5leHQgKGJyYW5jaC1zb3VyY2VkIGxvb3BUbykgbG9vcHMg4oCUXG4gICAgICAvLyBpdCBkb2VzIG5vdCBjb252ZXJnZSBhdCB0aGUgbGluZWFyIG5leHQgc3RhZ2UuXG4gICAgICBpZiAoY2hpbGQubmV4dD8uaXNMb29wUmVmZXJlbmNlKSBjb250aW51ZTtcbiAgICAgIGlmIChjaGlsZC5jb252ZXJnZUF0KSB7XG4gICAgICAgIC8vIFJlZGlyZWN0ZWQgY29udmVyZ2VuY2U6IHRoaXMgYnJhbmNoIHJlam9pbnMgYXQgaXRzIG5hbWVkIHRhcmdldC5cbiAgICAgICAgdGhpcy5fZmlyZUVkZ2VBZGRlZChjaGlsZC5pZCwgY2hpbGQuY29udmVyZ2VBdCwgJ25leHQnKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aGlzLl9maXJlRWRnZUFkZGVkKGNoaWxkLmlkLCB0YXJnZXRJZCwgJ25leHQnLCBsYWJlbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZURlY2lkZXJDb21wbGV0ZShcbiAgICBkZWNpZGVyOiBzdHJpbmcsXG4gICAgdHlwZTogJ2RlY2lkZXInIHwgJ3NlbGVjdG9yJyxcbiAgICBicmFuY2hJZHM6IHN0cmluZ1tdLFxuICAgIGRlZmF1bHRCcmFuY2g/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikgcmV0dXJuO1xuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuZmlyZURlY2lkZXJDb21wbGV0ZSh7XG4gICAgICBkZWNpZGVyLFxuICAgICAgdHlwZSxcbiAgICAgIGJyYW5jaElkcyxcbiAgICAgIC4uLihkZWZhdWx0QnJhbmNoICE9PSB1bmRlZmluZWQgJiYgeyBkZWZhdWx0QnJhbmNoIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZVN1YmZsb3dNb3VudGVkKFxuICAgIHN1YmZsb3dJZDogc3RyaW5nLFxuICAgIHN1YmZsb3dOYW1lOiBzdHJpbmcsXG4gICAgcm9vdFN0YWdlSWQ6IHN0cmluZyxcbiAgICBpc0xhenk/OiBib29sZWFuLFxuICAgIHN1YmZsb3dTcGVjPzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICAgIHN1YmZsb3dQYXRoPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIpIHJldHVybjtcbiAgICAvLyBzdWJmbG93UGF0aCBkZWZhdWx0cyB0byBzdWJmbG93SWQgd2hlbiB0aGUgcmVjb3JkZXIgaXMgYXR0YWNoZWRcbiAgICAvLyB0byB0aGUgaW1tZWRpYXRlIHBhcmVudCAodG9wLWxldmVsIG1vdW50KTsgY29tcG9zZWQgcGF0aHMgYXBwbHlcbiAgICAvLyBvbmx5IHdoZW4gdGhpcyBidWlsZGVyIGlzIGl0c2VsZiBhIG5lc3RlZCBzdWJmbG93IGJlaW5nXG4gICAgLy8gb2JzZXJ2ZWQgYnkgdGhlIGdyYW5kcGFyZW50J3MgcmVjb3JkZXIuXG4gICAgY29uc3QgcGF0aCA9IHN1YmZsb3dQYXRoID8/IHN1YmZsb3dJZDtcbiAgICB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyLmZpcmVTdWJmbG93TW91bnRlZCh7XG4gICAgICBzdWJmbG93SWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHJvb3RTdGFnZUlkLFxuICAgICAgLi4uKGlzTGF6eSA9PT0gdHJ1ZSAmJiB7IGlzTGF6eSB9KSxcbiAgICAgIC4uLihzdWJmbG93U3BlYyAhPT0gdW5kZWZpbmVkICYmIHsgc3ViZmxvd1NwZWMgfSksXG4gICAgICBzdWJmbG93UGF0aDogcGF0aCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTdWItYnVpbGRlciBhY2Nlc3MgKGAuYi5fZmlyZVh4eGApIGlzIG5lZWRlZCBieSBEZWNpZGVyTGlzdCAvXG4gICAqICBTZWxlY3RvckZuTGlzdDsgZXhwb3NlIHRoZSBkaXNwYXRjaGVyIHRocm91Z2ggaW50ZXJuYWwgaGVscGVyc1xuICAgKiAgdGhhdCBnbyB0aHJvdWdoIHRoZSBzYW1lIG5vLW9wLXdoZW4tYWJzZW50IGd1YXJkLlxuICAgKlxuICAgKiAgQGludGVybmFsIOKAlCB0aGVzZSBtZXRob2RzIGFyZSBleHBvc2VkIGJlY2F1c2UgVHlwZVNjcmlwdCBgcHJpdmF0ZWBcbiAgICogIGRvZXNuJ3QgdHJhdmVyc2UgY2xhc3MgYm91bmRhcmllcy4gQ29uc3VtZXIgY29kZSBNVVNUIE5PVCBjYWxsXG4gICAqICB0aGVtOyBjYWxsaW5nIHRoZW0gcG9zdC1jb25zdHJ1Y3Rpb24gbGV0cyBhIGhvc3RpbGUgY2FsbGVyXG4gICAqICBmYWJyaWNhdGUgc3RydWN0dXJlIGV2ZW50cyBhbmQgY29ycnVwdCBkb3duc3RyZWFtIHZpc3VhbGl6YXRpb25zXG4gICAqICBvciBhdWRpdCB0cmFpbHMuIFRoZSBgX2AgcHJlZml4IGlzIGludGVudGlvbmFsIGNvbnZlbnRpb24uICovXG4gIF9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXIoZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBraW5kOiBTdHJ1Y3R1cmVFZGdlS2luZCwgbGFiZWw/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9maXJlRWRnZUFkZGVkKGZyb20sIHRvLCBraW5kLCBsYWJlbCk7XG4gIH1cblxuICAvKiogQGludGVybmFsIOKAlCBzZWUgYF9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXJgLiAqL1xuICBfZmlyZVN0YWdlQWRkZWRGcm9tU3ViQnVpbGRlcihzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUpOiB2b2lkIHtcbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwg4oCUIHNlZSBgX2ZpcmVFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcmAuICovXG4gIF9maXJlRGVjaWRlckNvbXBsZXRlRnJvbVN1YkJ1aWxkZXIoXG4gICAgZGVjaWRlcjogc3RyaW5nLFxuICAgIHR5cGU6ICdkZWNpZGVyJyB8ICdzZWxlY3RvcicsXG4gICAgYnJhbmNoSWRzOiBzdHJpbmdbXSxcbiAgICBkZWZhdWx0QnJhbmNoPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9maXJlRGVjaWRlckNvbXBsZXRlKGRlY2lkZXIsIHR5cGUsIGJyYW5jaElkcywgZGVmYXVsdEJyYW5jaCk7XG4gIH1cblxuICAvKiogQGludGVybmFsIOKAlCBzZWUgYF9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXJgLiAqL1xuICBfZmlyZVN1YmZsb3dNb3VudGVkRnJvbVN1YkJ1aWxkZXIoXG4gICAgc3ViZmxvd0lkOiBzdHJpbmcsXG4gICAgc3ViZmxvd05hbWU6IHN0cmluZyxcbiAgICByb290U3RhZ2VJZDogc3RyaW5nLFxuICAgIGlzTGF6eT86IGJvb2xlYW4sXG4gICAgc3ViZmxvd1NwZWM/OiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gICAgc3ViZmxvd1BhdGg/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuX2ZpcmVTdWJmbG93TW91bnRlZChzdWJmbG93SWQsIHN1YmZsb3dOYW1lLCByb290U3RhZ2VJZCwgaXNMYXp5LCBzdWJmbG93U3BlYywgc3ViZmxvd1BhdGgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCDigJQgc2VlIGBfZmlyZUVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyYC4gVXNlZCBieSBgRGVjaWRlckxpc3QubG9vcFRvYFxuICAgKiAgdG8gdmFsaWRhdGUgYSBicmFuY2gtc291cmNlZCBsb29wIHRhcmdldCBhZ2FpbnN0IHRoZSBrbm93biBzdGFnZSBpZHNcbiAgICogIChtaXJyb3JzIGBGbG93Q2hhcnRCdWlsZGVyLmxvb3BUb2AncyBgX2tub3duU3RhZ2VJZHMuaGFzYCBndWFyZCkuICovXG4gIF9rbm93blN0YWdlSWRzSGFzKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fa25vd25TdGFnZUlkcy5oYXMoaWQpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCDigJQgc2VlIGBfZmlyZUVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyYC4gVXNlZCBieSBgRGVjaWRlckxpc3QubG9vcFRvYFxuICAgKiAgdG8gZmlyZSBhIGxvb3AgYmFjay1lZGdlIFNPVVJDRUQgRlJPTSBBIEJSQU5DSCBub2RlIChub3QgdGhlIGRlY2lkZXIpLiAqL1xuICBfZmlyZUxvb3BFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcihmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9maXJlTG9vcEVkZ2VBZGRlZChmcm9tLCB0byk7XG4gIH1cblxuICAvLyDilIDilIAgRGVzY3JpcHRpb24gaGVscGVycyDilIDilIBcblxuICBwcml2YXRlIF9hcHBlbmREZXNjcmlwdGlvbkxpbmUobmFtZTogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChuYW1lLCB0aGlzLl9zdGVwQ291bnRlcik7XG4gICAgY29uc3QgbGluZSA9IGRlc2NyaXB0aW9uID8gYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiAke25hbWV9IOKAlCAke2Rlc2NyaXB0aW9ufWAgOiBgJHt0aGlzLl9zdGVwQ291bnRlcn0uICR7bmFtZX1gO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChsaW5lKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX3N0YWdlRGVzY3JpcHRpb25zLnNldChuYW1lLCBkZXNjcmlwdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXBwZW5kU3ViZmxvd0Rlc2NyaXB0aW9uKGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgc3ViZmxvdzogRmxvd0NoYXJ0PGFueSwgYW55Pik6IHZvaWQge1xuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChpZCwgdGhpcy5fc3RlcENvdW50ZXIpO1xuICAgIGlmIChzdWJmbG93LmRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2goYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiBbU3ViLUV4ZWN1dGlvbjogJHtuYW1lfV0g4oCUICR7c3ViZmxvdy5kZXNjcmlwdGlvbn1gKTtcbiAgICAgIGNvbnN0IGxpbmVzID0gc3ViZmxvdy5kZXNjcmlwdGlvbi5zcGxpdCgnXFxuJyk7XG4gICAgICBjb25zdCBzdGVwc0lkeCA9IGxpbmVzLmZpbmRJbmRleCgobCkgPT4gbC5zdGFydHNXaXRoKCdTdGVwczonKSk7XG4gICAgICBpZiAoc3RlcHNJZHggPj0gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gc3RlcHNJZHggKyAxOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAobGluZXNbaV0udHJpbSgpKSB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2goYCAgICR7bGluZXNbaV19YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAke3RoaXMuX3N0ZXBDb3VudGVyfS4gW1N1Yi1FeGVjdXRpb246ICR7bmFtZX1dYCk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIENvbmZpZ3VyYXRpb24g4pSA4pSAXG5cbiAgc2V0TG9nZ2VyKGxvZ2dlcjogSUxvZ2dlcik6IHRoaXMge1xuICAgIHRoaXMuX2xvZ2dlciA9IGxvZ2dlcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNsYXJlIHRoZSBBUEkgY29udHJhY3Qg4oCUIGlucHV0IHZhbGlkYXRpb24sIG91dHB1dCBzaGFwZSwgYW5kIG91dHB1dCBtYXBwZXIuXG4gICAqIFJlcGxhY2VzIHNldElucHV0U2NoZW1hKCkgKyBzZXRPdXRwdXRTY2hlbWEoKSArIHNldE91dHB1dE1hcHBlcigpIGluIGEgc2luZ2xlIGNhbGwuXG4gICAqXG4gICAqIElmIGEgY29udHJhY3Qgd2l0aCBpbnB1dCBzY2hlbWEgaXMgZGVjbGFyZWQsIGNoYXJ0LnJ1bigpIHZhbGlkYXRlcyBpbnB1dCBhdXRvbWF0aWNhbGx5LlxuICAgKiBDb250cmFjdCBkYXRhIGlzIHVzZWQgYnkgY2hhcnQudG9PcGVuQVBJKCkgYW5kIGNoYXJ0LnRvTUNQVG9vbCgpLlxuICAgKi9cbiAgY29udHJhY3Qob3B0czoge1xuICAgIGlucHV0PzogdW5rbm93bjtcbiAgICBvdXRwdXQ/OiB1bmtub3duO1xuICAgIG1hcHBlcj86IChmaW5hbFNjb3BlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdW5rbm93bjtcbiAgfSk6IHRoaXMge1xuICAgIGlmIChvcHRzLmlucHV0KSB0aGlzLl9pbnB1dFNjaGVtYSA9IG9wdHMuaW5wdXQ7XG4gICAgaWYgKG9wdHMub3V0cHV0KSB0aGlzLl9vdXRwdXRTY2hlbWEgPSBvcHRzLm91dHB1dDtcbiAgICBpZiAob3B0cy5tYXBwZXIpIHRoaXMuX291dHB1dE1hcHBlciA9IG9wdHMubWFwcGVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIExpbmVhciBDaGFpbmluZyDilIDilIBcblxuICBzdGFydChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB8IFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICk6IHRoaXMge1xuICAgIGlmICh0aGlzLl9yb290KSBmYWlsKCdyb290IGFscmVhZHkgZGVmaW5lZDsgY3JlYXRlIGEgbmV3IGJ1aWxkZXInKTtcblxuICAgIC8vIERldGVjdCBQYXVzYWJsZUhhbmRsZXIgYnkgZHVjay10eXBpbmcgKGhhcyAuZXhlY3V0ZSBwcm9wZXJ0eSlcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICBjb25zdCBpc1BhdXNhYmxlID0gdHlwZW9mIGZuID09PSAnb2JqZWN0JyAmJiBmbiAhPT0gbnVsbCAmJiAnZXhlY3V0ZScgaW4gZm47XG4gICAgY29uc3Qgc3RhZ2VGbiA9IGlzUGF1c2FibGVcbiAgICAgID8gKChmbiBhcyBQYXVzYWJsZUhhbmRsZXI8VFNjb3BlPikuZXhlY3V0ZSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pXG4gICAgICA6IChmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWUsIGlkLCBmbjogc3RhZ2VGbiB9O1xuICAgIGlmIChpc1BhdXNhYmxlKSB7XG4gICAgICBub2RlLmlzUGF1c2FibGUgPSB0cnVlO1xuICAgICAgbm9kZS5yZXN1bWVGbiA9IChmbiBhcyBQYXVzYWJsZUhhbmRsZXI8VFNjb3BlPikucmVzdW1lO1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICB0aGlzLl9hZGRUb01hcChpZCwgc3RhZ2VGbik7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWUsIGlkLCB0eXBlOiAnc3RhZ2UnIH07XG4gICAgaWYgKGlzUGF1c2FibGUpIHNwZWMuaXNQYXVzYWJsZSA9IHRydWU7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG5cbiAgICB0aGlzLl9yb290ID0gbm9kZTtcbiAgICB0aGlzLl9yb290U3BlYyA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG5cbiAgICAvLyBMNy4zIOKAlCBTZWVkIG5vZGUgZmlyZXMgYG9uU3RhZ2VBZGRlZGAgKG5vIGVkZ2Ug4oCUIG5vIHByZWRlY2Vzc29yKS5cbiAgICAvLyBgaXNQYXVzYWJsZWAgaXMgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBzcGVjIGJ5IGBfZmlyZVN0YWdlQWRkZWRgLlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuXG4gICAgdGhpcy5fYXBwZW5kRGVzY3JpcHRpb25MaW5lKG5hbWUsIGRlc2NyaXB0aW9uKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCBhIGNoYXJ0IHdob3NlIFJPT1Qgc3RhZ2UgSVMgYSBzZWxlY3RvciDigJQgaXQgcnVucyBmaXJzdCAocmVhZGluZ1xuICAgKiBhcmdzLCBzZWVkaW5nIHN0YXRlLCByZXR1cm5pbmcgdGhlIGNob3NlbiBicmFuY2ggaWRzIHZpYSBgc2VsZWN0KClgKSxcbiAgICogYW5kIGl0cyBicmFuY2hlcyBhdHRhY2ggZGlyZWN0bHkgdG8gdGhlIHJvb3QuIE1pcnJvcnMgYHN0YXJ0KClgIGZvciB0aGVcbiAgICogcm9vdC1ub2RlIHNldHVwLCB0aGVuIHJldHVybnMgYSBgU2VsZWN0b3JGbkxpc3RgIGJvdW5kIHRvIHRoZSByb290IHNvXG4gICAqIGAuYWRkRnVuY3Rpb25CcmFuY2goKWAgLyBgLmFkZFN1YkZsb3dDaGFydEJyYW5jaCgpYCAvIGAuZW5kKClgIHdvcmtcbiAgICogZXhhY3RseSBhcyB0aGV5IGRvIGFmdGVyIGBhZGRTZWxlY3RvckZ1bmN0aW9uKClgLlxuICAgKlxuICAgKiBVc2Ugd2hlbiB0aGUgZmlyc3QgdGhpbmcgYSBjaGFydCBkb2VzIGlzIGNob29zZSBhbW9uZyBicmFuY2hlcyDigJQgZS5nLiBhXG4gICAqIGBDb250ZXh0YCBzZWxlY3RvciB0aGF0IGluaXRzICsgcGlja3Mgd2hpY2ggY29udGV4dCBzbG90cyB0byBlbmdpbmVlcixcbiAgICogd2l0aCBubyBzZXBhcmF0ZSBzZWVkIHN0YWdlIGJlZm9yZSBpdC5cbiAgICovXG4gIHN0YXJ0U2VsZWN0b3IoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZuOiBTdGFnZUZ1bmN0aW9uPGFueSwgVFNjb3BlPixcbiAgICBpZDogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IGZhaWxGYXN0PzogYm9vbGVhbiB9LFxuICApOiBTZWxlY3RvckZuTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBpZiAodGhpcy5fcm9vdCkgZmFpbCgncm9vdCBhbHJlYWR5IGRlZmluZWQ7IGNyZWF0ZSBhIG5ldyBidWlsZGVyJyk7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgbmFtZSwgaWQsIGZuOiBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4gfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICAvLyBTZWUgYGFkZFNlbGVjdG9yRnVuY3Rpb25gIOKAlCBgZmFpbEZhc3Q6IHRydWVgIG1ha2VzIGEgbXVsdGktYnJhbmNoXG4gICAgLy8gc2VsZWN0aW9uIGZhbiBvdXQgdmlhIGBQcm9taXNlLmFsbGAgKGZpcnN0IGVycm9yIGFib3J0cykgaW5zdGVhZCBvZiB0aGVcbiAgICAvLyBkZWZhdWx0IGBQcm9taXNlLmFsbFNldHRsZWRgIChiZXN0LWVmZm9ydCkuXG4gICAgaWYgKG9wdGlvbnM/LmZhaWxGYXN0KSBub2RlLmZhaWxGYXN0ID0gdHJ1ZTtcbiAgICB0aGlzLl9hZGRUb01hcChpZCwgZm4gYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+KTtcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZSwgaWQsIHR5cGU6ICdzdGFnZScsIGhhc1NlbGVjdG9yOiB0cnVlIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG5cbiAgICB0aGlzLl9yb290ID0gbm9kZTtcbiAgICB0aGlzLl9yb290U3BlYyA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG5cbiAgICAvLyBSb290IHNlbGVjdG9yIG5vZGUgZmlyZXMgb25TdGFnZUFkZGVkIHdpdGggTk8gcHJlZGVjZXNzb3IgZWRnZSAoaXQnc1xuICAgIC8vIHRoZSByb290KS4gQnJhbmNoZXMgKyBvbkRlY2lkZXJDb21wbGV0ZSBjb21lIGZyb20gdGhlIFNlbGVjdG9yRm5MaXN0LlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuXG4gICAgdGhpcy5fc3RlcENvdW50ZXIrKztcbiAgICB0aGlzLl9zdGFnZVN0ZXBNYXAuc2V0KG5hbWUsIHRoaXMuX3N0ZXBDb3VudGVyKTtcbiAgICB0aGlzLl9hcHBlbmREZXNjcmlwdGlvbkxpbmUobmFtZSwgZGVzY3JpcHRpb24pO1xuXG4gICAgcmV0dXJuIG5ldyBTZWxlY3RvckZuTGlzdDxUT3V0LCBUU2NvcGU+KFxuICAgICAgdGhpcyxcbiAgICAgIG5vZGUsXG4gICAgICBzcGVjLFxuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cyxcbiAgICAgIHRoaXMuX3N0YWdlRGVzY3JpcHRpb25zLFxuICAgICAgdGhpcy5fc3RlcENvdW50ZXIsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICApO1xuICB9XG5cbiAgYWRkRnVuY3Rpb24obmFtZTogc3RyaW5nLCBmbjogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LCBpZDogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcbiAgICAvLyBDYXB0dXJlIHRoZSBwYXJlbnQgU1BFQyByZWZlcmVuY2UgKG5vdCBqdXN0IGlkKSBCRUZPUkUgdGhlXG4gICAgLy8gY3Vyc29yIGFkdmFuY2VzIOKAlCB3ZSBuZWVkIGl0cyBgY2hpbGRyZW5gICsgYHR5cGVgIHRvIGRlY2lkZVxuICAgIC8vIHdoZXRoZXIgdGhlIGBuZXh0YCBlZGdlIGlzIGEgZm9yayBjb252ZXJnZW5jZSAoTiBlZGdlcyBmcm9tXG4gICAgLy8gZWFjaCBicmFuY2ggY2hpbGQpIHZzIGEgcGxhaW4gbGluZWFyIGNoYWluICgxIGVkZ2UgZnJvbSBwYXJlbnQpLlxuICAgIGNvbnN0IHBhcmVudFNwZWMgPSBjdXJTcGVjO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWUsIGlkLCBmbiB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHRoaXMuX2FkZFRvTWFwKGlkLCBmbik7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWUsIGlkLCB0eXBlOiAnc3RhZ2UnIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG5cbiAgICBjdXIubmV4dCA9IG5vZGU7XG4gICAgY3VyU3BlYy5uZXh0ID0gc3BlYztcbiAgICB0aGlzLl9jdXJzb3IgPSBub2RlO1xuICAgIHRoaXMuX2FkdmFuY2VDdXJzb3JTcGVjKHNwZWMpO1xuICAgIHRoaXMuX2tub3duU3RhZ2VJZHMuYWRkKGlkKTtcblxuICAgIC8vIEw3LjMg4oCUIExpbmVhciBub2RlOiBhbm5vdW5jZSB0aGUgbm9kZSBmaXJzdCwgdGhlbiB0aGUgZWRnZVxuICAgIC8vIGZyb20gdGhlIHByaW9yIGN1cnNvci4gT3JkZXIgbWF0dGVyczogZW5kcG9pbnRzIGFubm91bmNlZFxuICAgIC8vIGJlZm9yZSBhbnkgZWRnZSByZWZlcmVuY2luZyB0aGVtIChTdHJ1Y3R1cmVSZWNvcmRlciBjb250cmFjdCkuXG4gICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoc3BlYyk7XG4gICAgdGhpcy5fZmlyZU5leHRFZGdlRnJvbVBhcmVudChwYXJlbnRTcGVjLCBpZCk7XG5cbiAgICB0aGlzLl9hcHBlbmREZXNjcmlwdGlvbkxpbmUobmFtZSwgZGVzY3JpcHRpb24pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkU3RyZWFtaW5nRnVuY3Rpb24oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZuOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdHJlYW1JZD86IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuICAgIGNvbnN0IHBhcmVudFNwZWMgPSBjdXJTcGVjO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lLFxuICAgICAgaWQsXG4gICAgICBmbixcbiAgICAgIGlzU3RyZWFtaW5nOiB0cnVlLFxuICAgICAgc3RyZWFtSWQ6IHN0cmVhbUlkID8/IG5hbWUsXG4gICAgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICB0aGlzLl9hZGRUb01hcChpZCwgZm4pO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGlkLFxuICAgICAgdHlwZTogJ3N0cmVhbWluZycsXG4gICAgICBpc1N0cmVhbWluZzogdHJ1ZSxcbiAgICAgIHN0cmVhbUlkOiBzdHJlYW1JZCA/PyBuYW1lLFxuICAgIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG5cbiAgICBjdXIubmV4dCA9IG5vZGU7XG4gICAgY3VyU3BlYy5uZXh0ID0gc3BlYztcbiAgICB0aGlzLl9jdXJzb3IgPSBub2RlO1xuICAgIHRoaXMuX2FkdmFuY2VDdXJzb3JTcGVjKHNwZWMpO1xuICAgIHRoaXMuX2tub3duU3RhZ2VJZHMuYWRkKGlkKTtcblxuICAgIC8vIEw3LjMg4oCUIFN0cmVhbWluZyBzdGFnZTogc2FtZSBzaGFwZSBhcyBsaW5lYXIgYWRkRnVuY3Rpb24uXG4gICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoc3BlYyk7XG4gICAgdGhpcy5fZmlyZU5leHRFZGdlRnJvbVBhcmVudChwYXJlbnRTcGVjLCBpZCk7XG5cbiAgICB0aGlzLl9hcHBlbmREZXNjcmlwdGlvbkxpbmUobmFtZSwgZGVzY3JpcHRpb24pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHBhdXNhYmxlIHN0YWdlIOKAlCBjYW4gcGF1c2UgZXhlY3V0aW9uIGFuZCByZXN1bWUgbGF0ZXIgd2l0aCBpbnB1dC5cbiAgICpcbiAgICogVGhlIGhhbmRsZXIgaGFzIHR3byBwaGFzZXM6XG4gICAqIC0gYGV4ZWN1dGVgOiBydW5zIGZpcnN0IHRpbWUuIFJldHVybiBgeyBwYXVzZTogdHJ1ZSB9YCB0byBwYXVzZS5cbiAgICogLSBgcmVzdW1lYDogcnVucyB3aGVuIHRoZSBmbG93Y2hhcnQgaXMgcmVzdW1lZCB3aXRoIGlucHV0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC5hZGRQYXVzYWJsZUZ1bmN0aW9uKCdBcHByb3ZlT3JkZXInLCB7XG4gICAqICAgZXhlY3V0ZTogYXN5bmMgKHNjb3BlKSA9PiB7XG4gICAqICAgICBzY29wZS5vcmRlcklkID0gJzEyMyc7XG4gICAqICAgICByZXR1cm4geyBwYXVzZTogdHJ1ZSwgZGF0YTogeyBxdWVzdGlvbjogJ0FwcHJvdmU/JyB9IH07XG4gICAqICAgfSxcbiAgICogICByZXN1bWU6IGFzeW5jIChzY29wZSwgaW5wdXQpID0+IHtcbiAgICogICAgIHNjb3BlLmFwcHJvdmVkID0gaW5wdXQuYXBwcm92ZWQ7XG4gICAqICAgfSxcbiAgICogfSwgJ2FwcHJvdmUtb3JkZXInLCAnTWFuYWdlciBhcHByb3ZhbCBnYXRlJylcbiAgICogYGBgXG4gICAqL1xuICBhZGRQYXVzYWJsZUZ1bmN0aW9uKG5hbWU6IHN0cmluZywgaGFuZGxlcjogUGF1c2FibGVIYW5kbGVyPFRTY29wZT4sIGlkOiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdGhpcyB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuICAgIGNvbnN0IHBhcmVudFNwZWMgPSBjdXJTcGVjO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lLFxuICAgICAgaWQsXG4gICAgICBmbjogaGFuZGxlci5leGVjdXRlIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICAgIGlzUGF1c2FibGU6IHRydWUsXG4gICAgICByZXN1bWVGbjogaGFuZGxlci5yZXN1bWUsXG4gICAgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICB0aGlzLl9hZGRUb01hcChpZCwgaGFuZGxlci5leGVjdXRlIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPik7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lLFxuICAgICAgaWQsXG4gICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgaXNQYXVzYWJsZTogdHJ1ZSxcbiAgICB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuXG4gICAgY3VyLm5leHQgPSBub2RlO1xuICAgIGN1clNwZWMubmV4dCA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG5cbiAgICAvLyBMNy4zIOKAlCBQYXVzYWJsZSBzdGFnZTogYF9maXJlU3RhZ2VBZGRlZGAgcmVhZHMgYGlzUGF1c2FibGVgXG4gICAgLy8gZGlyZWN0bHkgZnJvbSBgc3BlYy5pc1BhdXNhYmxlYCAoc2V0IGFib3ZlKSwgc28gdmlzdWFsaXNlcnNcbiAgICAvLyBzZWUgaXQgb24gdGhlIGV2ZW50IHBheWxvYWQgd2l0aG91dCBhIHNlcGFyYXRlIHRocmVhZGluZyBhcmcuXG4gICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoc3BlYyk7XG4gICAgdGhpcy5fZmlyZU5leHRFZGdlRnJvbVBhcmVudChwYXJlbnRTcGVjLCBpZCk7XG5cbiAgICB0aGlzLl9hcHBlbmREZXNjcmlwdGlvbkxpbmUobmFtZSwgZGVzY3JpcHRpb24pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIERldGFjaCAoYnVpbGRlci1uYXRpdmUgY29tcG9zaXRpb24pIOKUgOKUgFxuICAvL1xuICAvLyBTdWdhciBvdmVyIGBhZGRGdW5jdGlvbmAgdGhhdCBnZW5lcmF0ZXMgYSBzdGFnZSB3aGljaCBjYWxsc1xuICAvLyBgc2NvcGUuJGRldGFjaEFuZEZvcmdldCguLi4pYCBvciBgc2NvcGUuJGRldGFjaEFuZEpvaW5MYXRlciguLi4pYFxuICAvLyBhdCBydW50aW1lLiBaRVJPIGVuZ2luZSBjaGFuZ2VzIOKAlCBwdXJlIGNvbXBvc2l0aW9uIG92ZXIgdGhlXG4gIC8vIGV4aXN0aW5nIHNjb3BlLW1ldGhvZCBwcmltaXRpdmVzLlxuICAvL1xuICAvLyBGb3IgYGFkZERldGFjaEFuZEpvaW5MYXRlcmAsIHRoZSByZXR1cm5lZCBoYW5kbGUgaXMgc3RvcmVkIGluXG4gIC8vIHNoYXJlZCBzdGF0ZSB2aWEgYCRzZXRWYWx1ZWAgKHdoaWNoIGJ5cGFzc2VzIHRoZSB0eXBlZC1wcm94eVxuICAvLyB1bndyYXAgdGhhdCB3b3VsZCBvdGhlcndpc2Ugc3RyaXAgdGhlIGhhbmRsZSdzIGNsYXNzIG1ldGhvZHMpLlxuICAvLyBEb3duc3RyZWFtIHN0YWdlcyByZWFkIGl0IHZpYSBgc2NvcGVbb3B0aW9ucy5oYW5kbGVLZXldYCBvclxuICAvLyBgc2NvcGUuJGdldFZhbHVlKG9wdGlvbnMuaGFuZGxlS2V5KWAg4oCUIGJvdGggcHJlc2VydmUgbWV0aG9kc1xuICAvLyBiZWNhdXNlIHRoZSB2YWx1ZSB3YXMgc3RvcmVkIHJhdy5cblxuICAvKipcbiAgICogQWRkIGEgc3RhZ2UgdGhhdCBmaXJlcyBhIGNoaWxkIGZsb3djaGFydCBvbiB0aGUgZ2l2ZW4gZHJpdmVyIGFuZFxuICAgKiBESVNDQVJEUyB0aGUgaGFuZGxlLiBQdXJlIGZpcmUtYW5kLWZvcmdldCDigJQgdXNlZnVsIGZvciB0ZWxlbWV0cnlcbiAgICogZXhwb3J0cywgYXVkaXQgbG9nIHNoaXBwaW5nLCBjYWNoZSB3YXJtLXVwLlxuICAgKlxuICAgKiBAcGFyYW0gaWQgU3RhYmxlIGlkIGZvciB0aGlzIHN0YWdlIChhbHNvIHRoZSBzdGFnZU1hcCBrZXkpLlxuICAgKiBAcGFyYW0gY2hpbGQgVGhlIGNoaWxkIGZsb3djaGFydCB0byBkZXRhY2guXG4gICAqIEBwYXJhbSBvcHRpb25zLmRyaXZlciBUaGUgZHJpdmVyIHRvIHNjaGVkdWxlIG9uIChlLmcuIGBtaWNyb3Rhc2tCYXRjaERyaXZlcmApLlxuICAgKiBAcGFyYW0gb3B0aW9ucy5pbnB1dE1hcHBlciBNYXBzIHRoZSBwYXJlbnQncyBzY29wZSB0byB0aGUgY2hpbGQncyBpbnB1dC5cbiAgICogICBEZWZhdWx0cyB0byBwYXNzaW5nIGB1bmRlZmluZWRgLlxuICAgKiBAcGFyYW0gb3B0aW9ucy5tb3VudE5hbWUgRGlzcGxheSBuYW1lOyBkZWZhdWx0cyB0byBgaWRgLlxuICAgKiBAcGFyYW0gb3B0aW9ucy5kZXNjcmlwdGlvbiBTdGFnZSBkZXNjcmlwdGlvbiBmb3IgbmFycmF0aXZlICsgdG9vbHMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGltcG9ydCB7IG1pY3JvdGFza0JhdGNoRHJpdmVyIH0gZnJvbSAnZm9vdHByaW50anMvZGV0YWNoJztcbiAgICpcbiAgICogZmxvd0NoYXJ0KCdwcm9jZXNzJywgcHJvY2Vzc0ZuLCAncHJvY2VzcycpXG4gICAqICAgLmFkZERldGFjaEFuZEZvcmdldCgndGVsZW1ldHJ5JywgdGVsZW1ldHJ5Q2hhcnQsIHtcbiAgICogICAgIGRyaXZlcjogbWljcm90YXNrQmF0Y2hEcml2ZXIsXG4gICAqICAgICBpbnB1dE1hcHBlcjogKHNjb3BlKSA9PiAoeyBldmVudDogJ3Byb2Nlc3NlZCcsIG9yZGVySWQ6IHNjb3BlLm9yZGVySWQgfSksXG4gICAqICAgfSlcbiAgICogICAuYWRkRnVuY3Rpb24oJ25leHQnLCBuZXh0Rm4sICduZXh0JylcbiAgICogICAuYnVpbGQoKTtcbiAgICogYGBgXG4gICAqL1xuICBhZGREZXRhY2hBbmRGb3JnZXQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBjaGlsZDogaW1wb3J0KCcuL3R5cGVzLmpzJykuRmxvd0NoYXJ0PGFueSwgYW55PixcbiAgICBvcHRpb25zOiB7XG4gICAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyO1xuICAgICAgaW5wdXRNYXBwZXI/OiAoc2NvcGU6IFRTY29wZSkgPT4gdW5rbm93bjtcbiAgICAgIG1vdW50TmFtZT86IHN0cmluZztcbiAgICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIH0sXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IG5hbWUgPSBvcHRpb25zLm1vdW50TmFtZSA/PyBpZDtcbiAgICByZXR1cm4gdGhpcy5hZGRGdW5jdGlvbihcbiAgICAgIG5hbWUsXG4gICAgICAoKHNjb3BlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBvcHRpb25zLmlucHV0TWFwcGVyID8gb3B0aW9ucy5pbnB1dE1hcHBlcihzY29wZSBhcyBUU2NvcGUpIDogdW5kZWZpbmVkO1xuICAgICAgICBzY29wZS4kZGV0YWNoQW5kRm9yZ2V0KG9wdGlvbnMuZHJpdmVyLCBjaGlsZCwgaW5wdXQpO1xuICAgICAgfSkgYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgICAgaWQsXG4gICAgICBvcHRpb25zLmRlc2NyaXB0aW9uLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgc3RhZ2UgdGhhdCBmaXJlcyBhIGNoaWxkIGZsb3djaGFydCBvbiB0aGUgZ2l2ZW4gZHJpdmVyIGFuZFxuICAgKiBkZWxpdmVycyB0aGUgcmVzdWx0aW5nIGBEZXRhY2hIYW5kbGVgIHRvIGEgY29uc3VtZXItc3VwcGxpZWRcbiAgICogYG9uSGFuZGxlYCBjYWxsYmFjay4gVGhlIGhhbmRsZSBDQU5OT1QgYmUgc3RvcmVkIGluIHNoYXJlZCBzdGF0ZVxuICAgKiDigJQgYFN0YWdlQ29udGV4dC5zZXRWYWx1ZWAgY2FsbHMgYHN0cnVjdHVyZWRDbG9uZWAgd2hpY2ggZHJvcHNcbiAgICogY2xhc3MgcHJvdG90eXBlcyAoYW5kIHRoZXJlZm9yZSB0aGUgaGFuZGxlJ3MgYC53YWl0KClgIG1ldGhvZCkuXG4gICAqXG4gICAqIFRoZSBjYWxsYmFjayBwYXR0ZXJuIGlzIHRoZSBleHBsaWNpdCBhbHRlcm5hdGl2ZToga2VlcCBoYW5kbGVzIGluXG4gICAqIGEgY2xvc3VyZS1sb2NhbCBhcnJheSAob3Igd2hhdGV2ZXIgc2hhcGUgc3VpdHMpIGFuZCBoYXZlIGFcbiAgICogZG93bnN0cmVhbSBzdGFnZSBgYXdhaXQgUHJvbWlzZS5hbGwoLi4uKWAgb3ZlciB0aGVtLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBpbXBvcnQgeyBtaWNyb3Rhc2tCYXRjaERyaXZlciB9IGZyb20gJ2Zvb3RwcmludGpzL2RldGFjaCc7XG4gICAqIGltcG9ydCB0eXBlIHsgRGV0YWNoSGFuZGxlIH0gZnJvbSAnZm9vdHByaW50anMvZGV0YWNoJztcbiAgICpcbiAgICogY29uc3QgaGFuZGxlczogRGV0YWNoSGFuZGxlW10gPSBbXTtcbiAgICpcbiAgICogY29uc3QgY2hhcnQgPSBmbG93Q2hhcnQoJ3NlZWQnLCBzZWVkRm4sICdzZWVkJylcbiAgICogICAuYWRkRGV0YWNoQW5kSm9pbkxhdGVyKCdldmFsLWEnLCBldmFsQ2hhcnQsIHtcbiAgICogICAgIGRyaXZlcjogbWljcm90YXNrQmF0Y2hEcml2ZXIsXG4gICAqICAgICBpbnB1dE1hcHBlcjogKHNjb3BlKSA9PiBzY29wZS5jb25maWdBLFxuICAgKiAgICAgb25IYW5kbGU6IChoKSA9PiBoYW5kbGVzLnB1c2goaCksXG4gICAqICAgfSlcbiAgICogICAuYWRkRGV0YWNoQW5kSm9pbkxhdGVyKCdldmFsLWInLCBldmFsQ2hhcnQsIHtcbiAgICogICAgIGRyaXZlcjogbWljcm90YXNrQmF0Y2hEcml2ZXIsXG4gICAqICAgICBpbnB1dE1hcHBlcjogKHNjb3BlKSA9PiBzY29wZS5jb25maWdCLFxuICAgKiAgICAgb25IYW5kbGU6IChoKSA9PiBoYW5kbGVzLnB1c2goaCksXG4gICAqICAgfSlcbiAgICogICAuYWRkRnVuY3Rpb24oJ2pvaW4nLCBhc3luYyAoc2NvcGUpID0+IHtcbiAgICogICAgIGNvbnN0IHNldHRsZWQgPSBhd2FpdCBQcm9taXNlLmFsbChoYW5kbGVzLm1hcCgoaCkgPT4gaC53YWl0KCkpKTtcbiAgICogICAgIHNjb3BlLnJlc3VsdHMgPSBzZXR0bGVkO1xuICAgKiAgIH0sICdqb2luJylcbiAgICogICAuYnVpbGQoKTtcbiAgICogYGBgXG4gICAqXG4gICAqIE5vdGU6IHB1dHRpbmcgYGhhbmRsZXNgIGluIGEgbW9kdWxlLWxldmVsIGNsb3N1cmUgaXMgZmluZSBmb3JcbiAgICogc2luZ2xlLXJ1biBzY3JpcHRzLiBGb3Igc2VydmVyIGNvZGUgdGhhdCBydW5zIHRoZSBzYW1lIGNoYXJ0XG4gICAqIGNvbmN1cnJlbnRseSBhY3Jvc3MgcmVxdWVzdHMsIGFsbG9jYXRlIGEgbmV3IGNsb3N1cmUgcGVyIHJ1blxuICAgKiAoZS5nLiwgd3JhcCBjaGFydCBjb25zdHJ1Y3Rpb24gaW4gYSBmYWN0b3J5IGZ1bmN0aW9uKSBzbyBoYW5kbGVzXG4gICAqIGZyb20gZGlmZmVyZW50IHJ1bnMgZG9uJ3QgYmxlZWQgaW50byBlYWNoIG90aGVyLlxuICAgKi9cbiAgYWRkRGV0YWNoQW5kSm9pbkxhdGVyKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgY2hpbGQ6IGltcG9ydCgnLi90eXBlcy5qcycpLkZsb3dDaGFydDxhbnksIGFueT4sXG4gICAgb3B0aW9uczoge1xuICAgICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcjtcbiAgICAgIG9uSGFuZGxlOiAoaGFuZGxlOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaEhhbmRsZSkgPT4gdm9pZDtcbiAgICAgIGlucHV0TWFwcGVyPzogKHNjb3BlOiBUU2NvcGUpID0+IHVua25vd247XG4gICAgICBtb3VudE5hbWU/OiBzdHJpbmc7XG4gICAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICB9LFxuICApOiB0aGlzIHtcbiAgICBjb25zdCBuYW1lID0gb3B0aW9ucy5tb3VudE5hbWUgPz8gaWQ7XG4gICAgcmV0dXJuIHRoaXMuYWRkRnVuY3Rpb24oXG4gICAgICBuYW1lLFxuICAgICAgKChzY29wZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gb3B0aW9ucy5pbnB1dE1hcHBlciA/IG9wdGlvbnMuaW5wdXRNYXBwZXIoc2NvcGUgYXMgVFNjb3BlKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgaGFuZGxlID0gc2NvcGUuJGRldGFjaEFuZEpvaW5MYXRlcihvcHRpb25zLmRyaXZlciwgY2hpbGQsIGlucHV0KTtcbiAgICAgICAgb3B0aW9ucy5vbkhhbmRsZShoYW5kbGUpO1xuICAgICAgfSkgYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgICAgaWQsXG4gICAgICBvcHRpb25zLmRlc2NyaXB0aW9uLFxuICAgICk7XG4gIH1cblxuICAvLyDilIDilIAgQnJhbmNoaW5nIOKUgOKUgFxuXG4gIGFkZERlY2lkZXJGdW5jdGlvbihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm46IFN0YWdlRnVuY3Rpb248YW55LCBUU2NvcGU+LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICk6IERlY2lkZXJMaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcbiAgICBjb25zdCBwYXJlbnRTcGVjID0gY3VyU3BlYztcblxuICAgIGlmIChjdXIuZGVjaWRlckZuKSBmYWlsKGBkZWNpZGVyIGFscmVhZHkgZGVmaW5lZCBhdCAnJHtjdXIubmFtZX0nYCk7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgbmFtZSwgaWQsIGZuIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgdGhpcy5fYWRkVG9NYXAoaWQsIGZuKTtcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZSwgaWQsIHR5cGU6ICdzdGFnZScsIGhhc0RlY2lkZXI6IHRydWUgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcblxuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuXG4gICAgLy8gTDcuMyDigJQgRGVjaWRlciBub2RlIGlzIHJlYWNoZWQgdmlhIGEgYG5leHRgIGVkZ2UgZnJvbSB0aGUgcHJpb3JcbiAgICAvLyBjdXJzb3IuIEJyYW5jaGVzIHRoZW1zZWx2ZXMgZmlyZSB2aWEgYGFkZEZ1bmN0aW9uQnJhbmNoYCBldGMuXG4gICAgLy8gYG9uRGVjaWRlckNvbXBsZXRlYCBmaXJlcyBmcm9tIHN1Yi1idWlsZGVyIGAuZW5kKClgLlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnQocGFyZW50U3BlYywgaWQpO1xuXG4gICAgdGhpcy5fc3RlcENvdW50ZXIrKztcbiAgICB0aGlzLl9zdGFnZVN0ZXBNYXAuc2V0KG5hbWUsIHRoaXMuX3N0ZXBDb3VudGVyKTtcblxuICAgIHJldHVybiBuZXcgRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPihcbiAgICAgIHRoaXMsXG4gICAgICBub2RlLFxuICAgICAgc3BlYyxcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMsXG4gICAgICB0aGlzLl9zdGFnZURlc2NyaXB0aW9ucyxcbiAgICAgIHRoaXMuX3N0ZXBDb3VudGVyLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgKTtcbiAgfVxuXG4gIGFkZFNlbGVjdG9yRnVuY3Rpb24oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZuOiBTdGFnZUZ1bmN0aW9uPGFueSwgVFNjb3BlPixcbiAgICBpZDogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IGZhaWxGYXN0PzogYm9vbGVhbiB9LFxuICApOiBTZWxlY3RvckZuTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG4gICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG5cbiAgICBpZiAoY3VyLnNlbGVjdG9yRm4pIGZhaWwoYHNlbGVjdG9yIGFscmVhZHkgZGVmaW5lZCBhdCAnJHtjdXIubmFtZX0nYCk7XG4gICAgaWYgKGN1ci5kZWNpZGVyRm4pIGZhaWwoYGRlY2lkZXIgYW5kIHNlbGVjdG9yIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWUsIGlkLCBmbiB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIC8vIGBmYWlsRmFzdGA6IHdoZW4gdGhlIHNlbGVjdG9yIHBpY2tzIOKJpTIgYnJhbmNoZXMgdGhleSBmYW4gb3V0IGluIHBhcmFsbGVsXG4gICAgLy8gdmlhIENoaWxkcmVuRXhlY3V0b3IuIERlZmF1bHQgPSBgUHJvbWlzZS5hbGxTZXR0bGVkYCAoYmVzdC1lZmZvcnQ6IGV2ZXJ5XG4gICAgLy8gYnJhbmNoIHJ1bnMgdG8gY29tcGxldGlvbiBldmVuIGlmIHNvbWUgZmFpbCkuIGBmYWlsRmFzdDogdHJ1ZWAgPSBgUHJvbWlzZS5hbGxgXG4gICAgLy8gKHRoZSBmaXJzdCBicmFuY2ggZXJyb3IgcmVqZWN0cyArIGFib3J0cykg4oCUIHVzZSB3aGVuIEFMTCBzZWxlY3RlZCBicmFuY2hlc1xuICAgIC8vIGFyZSBSRVFVSVJFRCAoZS5nLiBhc3NlbWJsaW5nIGEgcmVxdWVzdCBmcm9tIGluZGVwZW5kZW50LWJ1dC1yZXF1aXJlZCBwYXJ0cyksXG4gICAgLy8gbm90IGJlc3QtZWZmb3J0IGZhbi1vdXQuIFNhbWUgZmxhZyBgYWRkTGlzdE9mRnVuY3Rpb25gIGV4cG9zZXMuXG4gICAgaWYgKG9wdGlvbnM/LmZhaWxGYXN0KSBub2RlLmZhaWxGYXN0ID0gdHJ1ZTtcbiAgICB0aGlzLl9hZGRUb01hcChpZCwgZm4pO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lLCBpZCwgdHlwZTogJ3N0YWdlJywgaGFzU2VsZWN0b3I6IHRydWUgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcblxuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuXG4gICAgLy8gTDcuMyDigJQgU2VsZWN0b3Igbm9kZTogc2FtZSBhcyBkZWNpZGVyLiBCcmFuY2hlcyArIGNvbXBsZXRlIGV2ZW50XG4gICAgLy8gY29tZSBmcm9tIHRoZSBTZWxlY3RvckZuTGlzdCBzdWItYnVpbGRlci5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KHBhcmVudFNwZWMsIGlkKTtcblxuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChuYW1lLCB0aGlzLl9zdGVwQ291bnRlcik7XG5cbiAgICByZXR1cm4gbmV3IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4oXG4gICAgICB0aGlzLFxuICAgICAgbm9kZSxcbiAgICAgIHNwZWMsXG4gICAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLFxuICAgICAgdGhpcy5fc3RhZ2VEZXNjcmlwdGlvbnMsXG4gICAgICB0aGlzLl9zdGVwQ291bnRlcixcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICk7XG4gIH1cblxuICAvLyDilIDilIAgUGFyYWxsZWwgKEZvcmspIOKUgOKUgFxuXG4gIGFkZExpc3RPZkZ1bmN0aW9uKGNoaWxkcmVuOiBTaW1wbGlmaWVkUGFyYWxsZWxTcGVjPFRPdXQsIFRTY29wZT5bXSwgb3B0aW9ucz86IHsgZmFpbEZhc3Q/OiBib29sZWFuIH0pOiB0aGlzIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG4gICAgY29uc3QgZm9ya0lkID0gY3VyLmlkO1xuXG4gICAgY3VyU3BlYy50eXBlID0gJ2ZvcmsnO1xuICAgIGlmIChvcHRpb25zPy5mYWlsRmFzdCkgY3VyLmZhaWxGYXN0ID0gdHJ1ZTtcblxuICAgIGZvciAoY29uc3QgeyBpZCwgbmFtZSwgZm4gfSBvZiBjaGlsZHJlbikge1xuICAgICAgaWYgKCFpZCkgZmFpbChgY2hpbGQgaWQgcmVxdWlyZWQgdW5kZXIgJyR7Y3VyLm5hbWV9J2ApO1xuICAgICAgaWYgKGN1ci5jaGlsZHJlbj8uc29tZSgoYykgPT4gYy5pZCA9PT0gaWQpKSB7XG4gICAgICAgIGZhaWwoYGR1cGxpY2F0ZSBjaGlsZCBpZCAnJHtpZH0nIHVuZGVyICcke2N1ci5uYW1lfSdgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWU6IG5hbWUgPz8gaWQsIGlkIH07XG4gICAgICBpZiAoZm4pIHtcbiAgICAgICAgbm9kZS5mbiA9IGZuO1xuICAgICAgICB0aGlzLl9hZGRUb01hcChpZCwgZm4pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICAgIG5hbWU6IG5hbWUgPz8gaWQsXG4gICAgICAgIGlkLFxuICAgICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgICBpc1BhcmFsbGVsQ2hpbGQ6IHRydWUsXG4gICAgICAgIHBhcmFsbGVsR3JvdXBJZDogZm9ya0lkLFxuICAgICAgfTtcblxuICAgICAgY3VyLmNoaWxkcmVuID0gY3VyLmNoaWxkcmVuIHx8IFtdO1xuICAgICAgY3VyLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgICBjdXJTcGVjLmNoaWxkcmVuID0gY3VyU3BlYy5jaGlsZHJlbiB8fCBbXTtcbiAgICAgIGN1clNwZWMuY2hpbGRyZW4ucHVzaChzcGVjKTtcbiAgICAgIC8vIEw3LjMg4oCUIGZpcmUgc3RydWN0dXJlIGV2ZW50cyBmb3IgdGhlIGNoaWxkICsgdGhlIGZvcmsgZWRnZS5cbiAgICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgICAgdGhpcy5fZmlyZUVkZ2VBZGRlZChjdXJTcGVjLmlkLCBzcGVjLmlkLCAnZm9yay1icmFuY2gnKTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZE5hbWVzID0gY2hpbGRyZW4ubWFwKChjKSA9PiBjLm5hbWUgfHwgYy5pZCkuam9pbignLCAnKTtcbiAgICB0aGlzLl9zdGVwQ291bnRlcisrO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChgJHt0aGlzLl9zdGVwQ291bnRlcn0uIFJ1bnMgaW4gcGFyYWxsZWw6ICR7Y2hpbGROYW1lc31gKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIFN1YmZsb3cgTW91bnRpbmcg4pSA4pSAXG5cbiAgYWRkU3ViRmxvd0NoYXJ0KGlkOiBzdHJpbmcsIHN1YmZsb3c6IEZsb3dDaGFydDxhbnksIGFueT4sIG1vdW50TmFtZT86IHN0cmluZywgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMpOiB0aGlzIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG5cbiAgICBpZiAoY3VyLmNoaWxkcmVuPy5zb21lKChjKSA9PiBjLmlkID09PSBpZCkpIHtcbiAgICAgIGZhaWwoYGR1cGxpY2F0ZSBjaGlsZCBpZCAnJHtpZH0nIHVuZGVyICcke2N1ci5uYW1lfSdgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcbiAgICBjb25zdCBmb3JrSWQgPSBjdXIuaWQ7XG4gICAgY29uc3QgcHJlZml4ZWRSb290ID0gdGhpcy5fcHJlZml4Tm9kZVRyZWUoc3ViZmxvdy5yb290LCBpZCk7XG5cbiAgICBpZiAoIXRoaXMuX3N1YmZsb3dEZWZzLmhhcyhpZCkpIHtcbiAgICAgIHRoaXMuX3N1YmZsb3dEZWZzLnNldChpZCwgeyByb290OiBwcmVmaXhlZFJvb3QgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICB9O1xuICAgIGlmIChvcHRpb25zKSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgaXNQYXJhbGxlbENoaWxkOiB0cnVlLFxuICAgICAgcGFyYWxsZWxHcm91cElkOiBmb3JrSWQsXG4gICAgICBzdWJmbG93U3RydWN0dXJlOiBzdWJmbG93LmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICB9O1xuXG4gICAgY3VyU3BlYy50eXBlID0gJ2ZvcmsnO1xuICAgIGN1ci5jaGlsZHJlbiA9IGN1ci5jaGlsZHJlbiB8fCBbXTtcbiAgICBjdXIuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICBjdXJTcGVjLmNoaWxkcmVuID0gY3VyU3BlYy5jaGlsZHJlbiB8fCBbXTtcbiAgICBjdXJTcGVjLmNoaWxkcmVuLnB1c2goc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuICAgIC8vIEw3LjMg4oCUIFN1YmZsb3cgbW91bnQ6IHN0YWdlIGV2ZW50ICsgZm9yayBlZGdlICsgbW91bnQgbGlmZWN5Y2xlXG4gICAgLy8gZXZlbnQuIE1vdW50LW9ubHkgc2VtYW50aWNzOiBwYXJlbnQgcmVjb3JkZXJzIGRvIE5PVCByZXBsYXkgdGhlXG4gICAgLy8gc3ViZmxvdydzIG93biBpbnRlcm5hbCBzdHJ1Y3R1cmUgZXZlbnRzLlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVFZGdlQWRkZWQoY3VyU3BlYy5pZCwgaWQsICdmb3JrLWJyYW5jaCcpO1xuICAgIHRoaXMuX2ZpcmVTdWJmbG93TW91bnRlZChpZCwgc3ViZmxvd05hbWUsIGlkLCBmYWxzZSwgc3ViZmxvdy5idWlsZFRpbWVTdHJ1Y3R1cmUpO1xuXG4gICAgdGhpcy5fbWVyZ2VTdGFnZU1hcChzdWJmbG93LnN0YWdlTWFwLCBpZCk7XG4gICAgdGhpcy5fbWVyZ2VTdWJmbG93cyhzdWJmbG93LnN1YmZsb3dzLCBpZCk7XG4gICAgdGhpcy5fYXBwZW5kU3ViZmxvd0Rlc2NyaXB0aW9uKGlkLCBzdWJmbG93TmFtZSwgc3ViZmxvdyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZExhenlTdWJGbG93Q2hhcnQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICByZXNvbHZlcjogKCkgPT4gRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT4sXG4gICAgbW91bnROYW1lPzogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBTdWJmbG93TW91bnRPcHRpb25zLFxuICApOiB0aGlzIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG5cbiAgICBpZiAoY3VyLmNoaWxkcmVuPy5zb21lKChjKSA9PiBjLmlkID09PSBpZCkpIHtcbiAgICAgIGZhaWwoYGR1cGxpY2F0ZSBjaGlsZCBpZCAnJHtpZH0nIHVuZGVyICcke2N1ci5uYW1lfSdgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcbiAgICBjb25zdCBmb3JrSWQgPSBjdXIuaWQ7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgc3ViZmxvd1Jlc29sdmVyOiByZXNvbHZlciBhcyBhbnksXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucykgbm9kZS5zdWJmbG93TW91bnRPcHRpb25zID0gb3B0aW9ucztcblxuICAgIC8vIExhenkgbW91bnQgc3R1Yi4gVGhlIGxhenkgc3ViZmxvdydzIGludGVybmFscyB3aWxsIGJlIHNoYXBlZCBhdFxuICAgIC8vIHJlc29sdXRpb24gdGltZS5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBpc1BhcmFsbGVsQ2hpbGQ6IHRydWUsXG4gICAgICBwYXJhbGxlbEdyb3VwSWQ6IGZvcmtJZCxcbiAgICAgIGlzTGF6eTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgY3VyU3BlYy50eXBlID0gJ2ZvcmsnO1xuICAgIGN1ci5jaGlsZHJlbiA9IGN1ci5jaGlsZHJlbiB8fCBbXTtcbiAgICBjdXIuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICBjdXJTcGVjLmNoaWxkcmVuID0gY3VyU3BlYy5jaGlsZHJlbiB8fCBbXTtcbiAgICBjdXJTcGVjLmNoaWxkcmVuLnB1c2goc3BlYyk7XG4gICAgLy8gTDcuMyDigJQgTGF6eSBzdWJmbG93IHBhcmFsbGVsIG1vdW50LlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVFZGdlQWRkZWQoY3VyU3BlYy5pZCwgaWQsICdmb3JrLWJyYW5jaCcpO1xuICAgIHRoaXMuX2ZpcmVTdWJmbG93TW91bnRlZChpZCwgc3ViZmxvd05hbWUsIGlkLCB0cnVlKTtcblxuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChpZCwgdGhpcy5fc3RlcENvdW50ZXIpO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChgJHt0aGlzLl9zdGVwQ291bnRlcn0uIFtMYXp5IFN1Yi1FeGVjdXRpb246ICR7c3ViZmxvd05hbWV9XWApO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRMYXp5U3ViRmxvd0NoYXJ0TmV4dChcbiAgICBpZDogc3RyaW5nLFxuICAgIHJlc29sdmVyOiAoKSA9PiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcblxuICAgIGlmIChjdXIubmV4dCkge1xuICAgICAgZmFpbChgY2Fubm90IGFkZCBzdWJmbG93IGFzIG5leHQgd2hlbiBuZXh0IGlzIGFscmVhZHkgZGVmaW5lZCBhdCAnJHtjdXIubmFtZX0nYCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3ViZmxvd05hbWUgPSBtb3VudE5hbWUgfHwgaWQ7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgc3ViZmxvd1Jlc29sdmVyOiByZXNvbHZlciBhcyBhbnksXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucykgbm9kZS5zdWJmbG93TW91bnRPcHRpb25zID0gb3B0aW9ucztcblxuICAgIC8vIExhenkgbW91bnQgc3R1Yi4gVGhlIGxhenkgc3ViZmxvdydzIGludGVybmFscyB3aWxsIGJlIHNoYXBlZCBhdFxuICAgIC8vIHJlc29sdXRpb24gdGltZS5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBpc0xhenk6IHRydWUsXG4gICAgfTtcblxuICAgIGNvbnN0IHBhcmVudFNwZWMgPSBjdXJTcGVjO1xuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgLy8gTDcuMyDigJQgTGF6eSBsaW5lYXItbW91bnQgc3ViZmxvdy5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KHBhcmVudFNwZWMsIGlkKTtcbiAgICB0aGlzLl9maXJlU3ViZmxvd01vdW50ZWQoaWQsIHN1YmZsb3dOYW1lLCBpZCwgdHJ1ZSk7XG5cbiAgICB0aGlzLl9zdGVwQ291bnRlcisrO1xuICAgIHRoaXMuX3N0YWdlU3RlcE1hcC5zZXQoaWQsIHRoaXMuX3N0ZXBDb3VudGVyKTtcbiAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2goYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiBbTGF6eSBTdWItRXhlY3V0aW9uOiAke3N1YmZsb3dOYW1lfV1gKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkU3ViRmxvd0NoYXJ0TmV4dChcbiAgICBpZDogc3RyaW5nLFxuICAgIHN1YmZsb3c6IEZsb3dDaGFydDxhbnksIGFueT4sXG4gICAgbW91bnROYW1lPzogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBTdWJmbG93TW91bnRPcHRpb25zLFxuICApOiB0aGlzIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG5cbiAgICBpZiAoY3VyLm5leHQpIHtcbiAgICAgIGZhaWwoYGNhbm5vdCBhZGQgc3ViZmxvdyBhcyBuZXh0IHdoZW4gbmV4dCBpcyBhbHJlYWR5IGRlZmluZWQgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuICAgIH1cblxuICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gbW91bnROYW1lIHx8IGlkO1xuICAgIGNvbnN0IHByZWZpeGVkUm9vdCA9IHRoaXMuX3ByZWZpeE5vZGVUcmVlKHN1YmZsb3cucm9vdCwgaWQpO1xuXG4gICAgaWYgKCF0aGlzLl9zdWJmbG93RGVmcy5oYXMoaWQpKSB7XG4gICAgICB0aGlzLl9zdWJmbG93RGVmcy5zZXQoaWQsIHsgcm9vdDogcHJlZml4ZWRSb290IH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucykgbm9kZS5zdWJmbG93TW91bnRPcHRpb25zID0gb3B0aW9ucztcblxuICAgIGNvbnN0IGF0dGFjaGVkU3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgc3ViZmxvd1N0cnVjdHVyZTogc3ViZmxvdy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgfTtcblxuICAgIGNvbnN0IHBhcmVudFNwZWMgPSBjdXJTcGVjO1xuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBhdHRhY2hlZFNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhhdHRhY2hlZFNwZWMpO1xuICAgIHRoaXMuX2tub3duU3RhZ2VJZHMuYWRkKGlkKTtcbiAgICAvLyBMNy4zIOKAlCBMaW5lYXItbW91bnQgc3ViZmxvdy5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChhdHRhY2hlZFNwZWMpO1xuICAgIHRoaXMuX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnQocGFyZW50U3BlYywgaWQpO1xuICAgIHRoaXMuX2ZpcmVTdWJmbG93TW91bnRlZChpZCwgc3ViZmxvd05hbWUsIGlkLCBmYWxzZSwgc3ViZmxvdy5idWlsZFRpbWVTdHJ1Y3R1cmUpO1xuXG4gICAgdGhpcy5fbWVyZ2VTdGFnZU1hcChzdWJmbG93LnN0YWdlTWFwLCBpZCk7XG4gICAgdGhpcy5fbWVyZ2VTdWJmbG93cyhzdWJmbG93LnN1YmZsb3dzLCBpZCk7XG4gICAgdGhpcy5fYXBwZW5kU3ViZmxvd0Rlc2NyaXB0aW9uKGlkLCBzdWJmbG93TmFtZSwgc3ViZmxvdyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBMb29wIOKUgOKUgFxuXG4gIGxvb3BUbyhzdGFnZUlkOiBzdHJpbmcpOiB0aGlzIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG5cbiAgICBpZiAoY3VyU3BlYy5sb29wVGFyZ2V0KSBmYWlsKGBsb29wVG8gYWxyZWFkeSBkZWZpbmVkIGF0ICcke2N1ci5uYW1lfSdgKTtcbiAgICBpZiAoY3VyLm5leHQpIGZhaWwoYGNhbm5vdCBzZXQgbG9vcFRvIHdoZW4gbmV4dCBpcyBhbHJlYWR5IGRlZmluZWQgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuXG4gICAgaWYgKCF0aGlzLl9rbm93blN0YWdlSWRzLmhhcyhzdGFnZUlkKSkge1xuICAgICAgZmFpbChgbG9vcFRvKCcke3N0YWdlSWR9JykgdGFyZ2V0IG5vdCBmb3VuZCDigJQgZGlkIHlvdSBwYXNzIGEgc3RhZ2UgbmFtZSBpbnN0ZWFkIG9mIGlkP2ApO1xuICAgIH1cblxuICAgIGN1ci5uZXh0ID0geyBuYW1lOiBzdGFnZUlkLCBpZDogc3RhZ2VJZCwgaXNMb29wUmVmOiB0cnVlIH07XG4gICAgY3VyU3BlYy5sb29wVGFyZ2V0ID0gc3RhZ2VJZDtcbiAgICBjdXJTcGVjLm5leHQgPSB7IG5hbWU6IHN0YWdlSWQsIGlkOiBzdGFnZUlkLCB0eXBlOiAnbG9vcCcsIGlzTG9vcFJlZmVyZW5jZTogdHJ1ZSB9O1xuXG4gICAgY29uc3QgdGFyZ2V0U3RlcCA9IHRoaXMuX3N0YWdlU3RlcE1hcC5nZXQoc3RhZ2VJZCk7XG4gICAgaWYgKHRhcmdldFN0ZXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGDihpIgbG9vcHMgYmFjayB0byBzdGVwICR7dGFyZ2V0U3RlcH1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGDihpIgbG9vcHMgYmFjayB0byAke3N0YWdlSWR9YCk7XG4gICAgfVxuXG4gICAgLy8gTDcuMyDigJQgRmlyZSB0aGUgbG9vcCBiYWNrLWVkZ2UgZXZlbnQuIERpc3RpbmN0IGZyb20gYG9uRWRnZUFkZGVkYFxuICAgIC8vIGJlY2F1c2UgcnVudGltZSBgb25Mb29wYCBjYXJyaWVzIGBpdGVyYXRpb246IG51bWJlcmAgd2hpY2ggaGFzIG5vXG4gICAgLy8gYnVpbGQgbWVhbmluZyDigJQgc2VwYXJhdGUgZXZlbnQga2VlcHMgcGF5bG9hZHMgaG9uZXN0LlxuICAgIHRoaXMuX2ZpcmVMb29wRWRnZUFkZGVkKGN1ci5pZCwgc3RhZ2VJZCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgU3RyZWFtaW5nIOKUgOKUgFxuXG4gIG9uU3RyZWFtKGhhbmRsZXI6IFN0cmVhbVRva2VuSGFuZGxlcik6IHRoaXMge1xuICAgIHRoaXMuX3N0cmVhbUhhbmRsZXJzLm9uVG9rZW4gPSBoYW5kbGVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb25TdHJlYW1TdGFydChoYW5kbGVyOiBTdHJlYW1MaWZlY3ljbGVIYW5kbGVyKTogdGhpcyB7XG4gICAgdGhpcy5fc3RyZWFtSGFuZGxlcnMub25TdGFydCA9IGhhbmRsZXI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvblN0cmVhbUVuZChoYW5kbGVyOiBTdHJlYW1MaWZlY3ljbGVIYW5kbGVyKTogdGhpcyB7XG4gICAgdGhpcy5fc3RyZWFtSGFuZGxlcnMub25FbmQgPSBoYW5kbGVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIE91dHB1dCDilIDilIBcblxuICBidWlsZCgpOiBSdW5uYWJsZUZsb3dDaGFydDxUT3V0LCBUU2NvcGU+IHtcbiAgICAvLyBMNy4zIOKAlCBzZWFsIHRoZSBjaGFydCBzbyBwb3N0LWJ1aWxkIGF0dGFjaGVzIHRocm93LiBQcmV2ZW50c1xuICAgIC8vIHJlY29yZGVycyBhdHRhY2hlZCBtaWQtZXhlY3V0aW9uIGZyb20gZ2V0dGluZyBwYXJ0aWFsIGRhdGEuXG4gICAgdGhpcy5fc2VhbGVkID0gdHJ1ZTtcblxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9yb290ID8/IGZhaWwoJ2VtcHR5IHRyZWU7IGNhbGwgc3RhcnQoKSBmaXJzdCcpO1xuICAgIGNvbnN0IHJvb3RTcGVjID0gdGhpcy5fcm9vdFNwZWMgPz8gZmFpbCgnZW1wdHkgc3BlYzsgY2FsbCBzdGFydCgpIGZpcnN0Jyk7XG5cbiAgICBjb25zdCBzdWJmbG93czogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiB0aGlzLl9zdWJmbG93RGVmcykge1xuICAgICAgc3ViZmxvd3Nba2V5XSA9IGRlZjtcbiAgICB9XG5cbiAgICBjb25zdCByb290TmFtZSA9IHRoaXMuX3Jvb3Q/Lm5hbWUgPz8gJ0Zsb3dDaGFydCc7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPVxuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5sZW5ndGggPiAwID8gYEZsb3dDaGFydDogJHtyb290TmFtZX1cXG5TdGVwczpcXG4ke3RoaXMuX2Rlc2NyaXB0aW9uUGFydHMuam9pbignXFxuJyl9YCA6ICcnO1xuXG4gICAgY29uc3QgY2hhcnQ6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgcm9vdCxcbiAgICAgIHN0YWdlTWFwOiB0aGlzLl9zdGFnZU1hcCxcbiAgICAgIGJ1aWxkVGltZVN0cnVjdHVyZTogcm9vdFNwZWMsXG4gICAgICAuLi4oT2JqZWN0LmtleXMoc3ViZmxvd3MpLmxlbmd0aCA+IDAgPyB7IHN1YmZsb3dzIH0gOiB7fSksXG4gICAgICAuLi4odGhpcy5fZW5hYmxlTmFycmF0aXZlID8geyBlbmFibGVOYXJyYXRpdmU6IHRydWUgfSA6IHt9KSxcbiAgICAgIC4uLih0aGlzLl9sb2dnZXIgPyB7IGxvZ2dlcjogdGhpcy5fbG9nZ2VyIH0gOiB7fSksXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIHN0YWdlRGVzY3JpcHRpb25zOiBuZXcgTWFwKHRoaXMuX3N0YWdlRGVzY3JpcHRpb25zKSxcbiAgICAgIC4uLih0aGlzLl9pbnB1dFNjaGVtYSA/IHsgaW5wdXRTY2hlbWE6IHRoaXMuX2lucHV0U2NoZW1hIH0gOiB7fSksXG4gICAgICAuLi4odGhpcy5fb3V0cHV0U2NoZW1hID8geyBvdXRwdXRTY2hlbWE6IHRoaXMuX291dHB1dFNjaGVtYSB9IDoge30pLFxuICAgICAgLi4uKHRoaXMuX291dHB1dE1hcHBlciA/IHsgb3V0cHV0TWFwcGVyOiB0aGlzLl9vdXRwdXRNYXBwZXIgfSA6IHt9KSxcbiAgICAgIC8vIEF1dG8tZW1iZWQgVHlwZWRTY29wZSBmYWN0b3J5IGlmIG5vbmUgd2FzIGV4cGxpY2l0bHkgc2V0LlxuICAgICAgLy8gVGhpcyBtZWFucyBBTlkgd2F5IG9mIGNyZWF0aW5nIGEgRmxvd0NoYXJ0QnVpbGRlciAoZmxvd0NoYXJ0KCksIG5ldyBGbG93Q2hhcnRCdWlsZGVyKCksXG4gICAgICAvLyBvciBhbnkgc3ViY2xhc3MpIGF1dG9tYXRpY2FsbHkgZ2V0cyBUeXBlZFNjb3BlIOKAlCBubyBtYW51YWwgc2V0U2NvcGVGYWN0b3J5IG5lZWRlZC5cbiAgICAgIHNjb3BlRmFjdG9yeTogdGhpcy5fc2NvcGVGYWN0b3J5ID8/IChjcmVhdGVUeXBlZFNjb3BlRmFjdG9yeSgpIGFzIHVua25vd24gYXMgU2NvcGVGYWN0b3J5PFRTY29wZT4pLFxuICAgIH07XG5cbiAgICByZXR1cm4gbWFrZVJ1bm5hYmxlKGNoYXJ0KTtcbiAgfVxuXG4gIC8qKiBPdmVycmlkZSB0aGUgc2NvcGUgZmFjdG9yeS4gUmFyZWx5IG5lZWRlZCDigJQgYXV0by1lbWJlZHMgVHlwZWRTY29wZSBieSBkZWZhdWx0LiAqL1xuICBzZXRTY29wZUZhY3RvcnkoZmFjdG9yeTogU2NvcGVGYWN0b3J5PFRTY29wZT4pOiB0aGlzIHtcbiAgICB0aGlzLl9zY29wZUZhY3RvcnkgPSBmYWN0b3J5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdG9TcGVjPFRSZXN1bHQgPSBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmU+KCk6IFRSZXN1bHQge1xuICAgIGNvbnN0IHJvb3RTcGVjID0gdGhpcy5fcm9vdFNwZWMgPz8gZmFpbCgnZW1wdHkgdHJlZTsgY2FsbCBzdGFydCgpIGZpcnN0Jyk7XG4gICAgcmV0dXJuIHJvb3RTcGVjIGFzIFRSZXN1bHQ7XG4gIH1cblxuICB0b01lcm1haWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbJ2Zsb3djaGFydCBURCddO1xuICAgIGNvbnN0IGlkT2YgPSAoazogc3RyaW5nKSA9PiAoayB8fCAnJykucmVwbGFjZSgvW15hLXpBLVowLTlfXS9nLCAnXycpIHx8ICdfJztcbiAgICBjb25zdCByb290ID0gdGhpcy5fcm9vdCA/PyBmYWlsKCdlbXB0eSB0cmVlOyBjYWxsIHN0YXJ0KCkgZmlyc3QnKTtcblxuICAgIGNvbnN0IHdhbGsgPSAobjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pID0+IHtcbiAgICAgIGNvbnN0IG5pZCA9IGlkT2Yobi5pZCk7XG4gICAgICBsaW5lcy5wdXNoKGAke25pZH1bXCIke24ubmFtZX1cIl1gKTtcbiAgICAgIGZvciAoY29uc3QgYyBvZiBuLmNoaWxkcmVuIHx8IFtdKSB7XG4gICAgICAgIGNvbnN0IGNpZCA9IGlkT2YoYy5pZCk7XG4gICAgICAgIGxpbmVzLnB1c2goYCR7bmlkfSAtLT4gJHtjaWR9YCk7XG4gICAgICAgIHdhbGsoYyk7XG4gICAgICB9XG4gICAgICBpZiAobi5uZXh0KSB7XG4gICAgICAgIGNvbnN0IG1pZCA9IGlkT2Yobi5uZXh0LmlkKTtcbiAgICAgICAgbGluZXMucHVzaChgJHtuaWR9IC0tPiAke21pZH1gKTtcbiAgICAgICAgd2FsayhuLm5leHQpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2Fsayhyb290KTtcbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvLyDilIDilIAgSW50ZXJuYWxzIChleHBvc2VkIGZvciBoZWxwZXIgY2xhc3Nlcykg4pSA4pSAXG5cbiAgcHJpdmF0ZSBfbmVlZEN1cnNvcigpOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnNvciA/PyBmYWlsKCdjdXJzb3IgdW5kZWZpbmVkOyBjYWxsIHN0YXJ0KCkgZmlyc3QnKTtcbiAgfVxuXG4gIHByaXZhdGUgX25lZWRDdXJzb3JTcGVjKCk6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnNvclNwZWMgPz8gZmFpbCgnY3Vyc29yIHVuZGVmaW5lZDsgY2FsbCBzdGFydCgpIGZpcnN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogQWR2YW5jZSB0aGUgc3BlYyBjdXJzb3IuIFJldGFpbmVkIGFzIGEgbWV0aG9kIHNvIGNhbGwgc2l0ZXMgc3RheVxuICAgKiBvbmUtbGluZXJzIGFuZCBmdXR1cmUgY3Vyc29yLXJlbGF0ZWQgc2lkZSBlZmZlY3RzIGhhdmUgYSBob29rLlxuICAgKi9cbiAgcHJpdmF0ZSBfYWR2YW5jZUN1cnNvclNwZWMobmV3U3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5fY3Vyc29yU3BlYyA9IG5ld1NwZWM7XG4gIH1cblxuICBfc3RhZ2VNYXBIYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VNYXAuaGFzKGtleSk7XG4gIH1cblxuICBfYWRkVG9NYXAoaWQ6IHN0cmluZywgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPikge1xuICAgIGlmICh0aGlzLl9zdGFnZU1hcC5oYXMoaWQpKSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuX3N0YWdlTWFwLmdldChpZCk7XG4gICAgICBpZiAoZXhpc3RpbmcgIT09IGZuKSBmYWlsKGBzdGFnZU1hcCBjb2xsaXNpb24gZm9yIGlkICcke2lkfSdgKTtcbiAgICB9XG4gICAgdGhpcy5fc3RhZ2VNYXAuc2V0KGlkLCBmbik7XG4gIH1cblxuICBfbWVyZ2VTdGFnZU1hcChvdGhlcjogTWFwPHN0cmluZywgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+PiwgcHJlZml4Pzogc3RyaW5nKSB7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2Ygb3RoZXIpIHtcbiAgICAgIGNvbnN0IGtleSA9IHByZWZpeCA/IGAke3ByZWZpeH0vJHtrfWAgOiBrO1xuICAgICAgaWYgKHRoaXMuX3N0YWdlTWFwLmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5fc3RhZ2VNYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmIChleGlzdGluZyAhPT0gdikgZmFpbChgc3RhZ2VNYXAgY29sbGlzaW9uIHdoaWxlIG1vdW50aW5nIGZsb3djaGFydCBhdCAnJHtrZXl9J2ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc3RhZ2VNYXAuc2V0KGtleSwgdik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX3ByZWZpeE5vZGVUcmVlKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBwcmVmaXg6IHN0cmluZyk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHtcbiAgICBpZiAoIW5vZGUpIHJldHVybiBub2RlO1xuICAgIGNvbnN0IGNsb25lOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgLi4ubm9kZSB9O1xuICAgIGNsb25lLm5hbWUgPSBgJHtwcmVmaXh9LyR7bm9kZS5uYW1lfWA7XG4gICAgY2xvbmUuaWQgPSBgJHtwcmVmaXh9LyR7bm9kZS5pZH1gO1xuICAgIGlmIChjbG9uZS5zdWJmbG93SWQpIGNsb25lLnN1YmZsb3dJZCA9IGAke3ByZWZpeH0vJHtjbG9uZS5zdWJmbG93SWR9YDtcbiAgICBpZiAoY2xvbmUubmV4dCkgY2xvbmUubmV4dCA9IHRoaXMuX3ByZWZpeE5vZGVUcmVlKGNsb25lLm5leHQsIHByZWZpeCk7XG4gICAgaWYgKGNsb25lLmNoaWxkcmVuKSB7XG4gICAgICBjbG9uZS5jaGlsZHJlbiA9IGNsb25lLmNoaWxkcmVuLm1hcCgoYykgPT4gdGhpcy5fcHJlZml4Tm9kZVRyZWUoYywgcHJlZml4KSk7XG4gICAgfVxuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuXG4gIF9tZXJnZVN1YmZsb3dzKHN1YmZsb3dzOiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+IHwgdW5kZWZpbmVkLCBwcmVmaXg6IHN0cmluZykge1xuICAgIGlmICghc3ViZmxvd3MpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGRlZl0gb2YgT2JqZWN0LmVudHJpZXMoc3ViZmxvd3MpKSB7XG4gICAgICBjb25zdCBwcmVmaXhlZEtleSA9IGAke3ByZWZpeH0vJHtrZXl9YDtcbiAgICAgIGlmICghdGhpcy5fc3ViZmxvd0RlZnMuaGFzKHByZWZpeGVkS2V5KSkge1xuICAgICAgICB0aGlzLl9zdWJmbG93RGVmcy5zZXQocHJlZml4ZWRLZXksIHtcbiAgICAgICAgICByb290OiB0aGlzLl9wcmVmaXhOb2RlVHJlZShkZWYucm9vdCBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgcHJlZml4KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRmFjdG9yeSBGdW5jdGlvblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8vIE92ZXJsb2FkIDE6IHR5cGVkIHN0YXRlIHdpdGggb3B0aW9ucyBvYmplY3QuXG5leHBvcnQgZnVuY3Rpb24gZmxvd0NoYXJ0PFRTdGF0ZSBleHRlbmRzIG9iamVjdD4oXG4gIG5hbWU6IHN0cmluZyxcbiAgZm46IFR5cGVkU3RhZ2VGdW5jdGlvbjxUU3RhdGU+IHwgUGF1c2FibGVIYW5kbGVyPFR5cGVkU2NvcGU8VFN0YXRlPj4sXG4gIGlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBGbG93Q2hhcnRPcHRpb25zLFxuKTogRmxvd0NoYXJ0QnVpbGRlcjxhbnksIFR5cGVkU2NvcGU8VFN0YXRlPj47XG5cbi8vIE92ZXJsb2FkIDI6IGV4cGxpY2l0IGdlbmVyaWNzIHdpdGggb3B0aW9ucyBvYmplY3QuXG5leHBvcnQgZnVuY3Rpb24gZmxvd0NoYXJ0PFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4oXG4gIG5hbWU6IHN0cmluZyxcbiAgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB8IFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+LFxuICBpZDogc3RyaW5nLFxuICBvcHRpb25zPzogRmxvd0NoYXJ0T3B0aW9ucyxcbik6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPjtcblxuLy8gU2luZ2xlIGltcGxlbWVudGF0aW9uIOKAlCBhY2NlcHRzIHRoZSBvcHRpb25zIGJhZyAob3IgdW5kZWZpbmVkKS5cbmV4cG9ydCBmdW5jdGlvbiBmbG93Q2hhcnQ8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PihcbiAgbmFtZTogc3RyaW5nLFxuICBmbjogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+IHwgUGF1c2FibGVIYW5kbGVyPFRTY29wZT4sXG4gIGlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBGbG93Q2hhcnRPcHRpb25zLFxuKTogRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+IHtcbiAgY29uc3QgYnVpbGRlciA9IG5ldyBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4oKTtcbiAgLy8gQXR0YWNoIFN0cnVjdHVyZVJlY29yZGVycyBCRUZPUkUgc3RhcnQoKSBzbyB0aGUgc2VlZCBldmVudCBmaXJlcyB0aHJvdWdoXG4gIC8vIHRoZSBub3JtYWwgZGlzcGF0Y2hlciBwYXRoIChubyByZXBsYXkgbmVlZGVkKS4gSXRlcmF0aW9uIG9yZGVyIG1hdGNoZXNcbiAgLy8gYXJyYXkgb3JkZXIsIG1hdGNoaW5nIHRoZSBmbHVlbnQgYC5hdHRhY2hTdHJ1Y3R1cmVSZWNvcmRlcigpYCBjaGFpblxuICAvLyBzZW1hbnRpY3MuXG4gIGlmIChvcHRpb25zPy5zdHJ1Y3R1cmVSZWNvcmRlcnMpIHtcbiAgICBmb3IgKGNvbnN0IHJlYyBvZiBvcHRpb25zLnN0cnVjdHVyZVJlY29yZGVycykge1xuICAgICAgYnVpbGRlci5hdHRhY2hTdHJ1Y3R1cmVSZWNvcmRlcihyZWMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYnVpbGRlci5zdGFydChuYW1lLCBmbiBhcyBhbnksIGlkLCBvcHRpb25zPy5kZXNjcmlwdGlvbik7XG59XG5cbi8qKlxuICogTGlrZSBgZmxvd0NoYXJ0KClgLCBidXQgdGhlIFJPT1Qgc3RhZ2UgaXMgYSBTRUxFQ1RPUiDigJQgaXQgcnVucyBmaXJzdCBhbmRcbiAqIGl0cyBicmFuY2hlcyBhdHRhY2ggZGlyZWN0bHkgdG8gaXQgKG5vIHNlcGFyYXRlIHNlZWQgc3RhZ2UpLiBSZXR1cm5zIGFcbiAqIGBTZWxlY3RvckZuTGlzdGA7IGRlY2xhcmUgYnJhbmNoZXMgdGhlbiBjYWxsIGAuZW5kKClgIHRvIGdldCB0aGUgYnVpbGRlclxuICogYmFjayBmb3IgYW55IHN1YnNlcXVlbnQgc3RhZ2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIGZsb3dDaGFydFNlbGVjdG9yPE15U3RhdGU+KCdDb250ZXh0JywgY29udGV4dFNlbGVjdG9yRm4sICdjb250ZXh0JylcbiAqICAgICAuYWRkU3ViRmxvd0NoYXJ0QnJhbmNoKCdzZi1zeXN0ZW0tcHJvbXB0Jywgc3lzU2xvdCwgJ1N5c3RlbSBQcm9tcHQnLCB7Li4ufSlcbiAqICAgICAuYWRkU3ViRmxvd0NoYXJ0QnJhbmNoKCdzZi1tZXNzYWdlcycsIG1zZ1Nsb3QsICdNZXNzYWdlcycsIHsuLi59KVxuICogICAgIC5lbmQoKVxuICogICAgIC5hZGRGdW5jdGlvbignbWVzc2FnZUFQSScsIGFzc2VtYmxlRm4sICdtZXNzYWdlLWFwaScpXG4gKiAgICAgLmJ1aWxkKCk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbG93Q2hhcnRTZWxlY3RvcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+KFxuICBuYW1lOiBzdHJpbmcsXG4gIGZuOiBTdGFnZUZ1bmN0aW9uPGFueSwgVFNjb3BlPixcbiAgaWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IEZsb3dDaGFydE9wdGlvbnMsXG4pOiBTZWxlY3RvckZuTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgY29uc3QgYnVpbGRlciA9IG5ldyBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4oKTtcbiAgaWYgKG9wdGlvbnM/LnN0cnVjdHVyZVJlY29yZGVycykge1xuICAgIGZvciAoY29uc3QgcmVjIG9mIG9wdGlvbnMuc3RydWN0dXJlUmVjb3JkZXJzKSB7XG4gICAgICBidWlsZGVyLmF0dGFjaFN0cnVjdHVyZVJlY29yZGVyKHJlYyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBidWlsZGVyLnN0YXJ0U2VsZWN0b3IobmFtZSwgZm4sIGlkLCBvcHRpb25zPy5kZXNjcmlwdGlvbiwge1xuICAgIC4uLihvcHRpb25zPy5mYWlsRmFzdCAhPT0gdW5kZWZpbmVkICYmIHsgZmFpbEZhc3Q6IG9wdGlvbnMuZmFpbEZhc3QgfSksXG4gIH0pO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFNwZWMgdG8gU3RhZ2VOb2RlIENvbnZlcnRlclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBmdW5jdGlvbiBzcGVjVG9TdGFnZU5vZGUoc3BlYzogRmxvd0NoYXJ0U3BlYyk6IFN0YWdlTm9kZTxhbnksIGFueT4ge1xuICBjb25zdCBpbmZsYXRlID0gKHM6IEZsb3dDaGFydFNwZWMpOiBTdGFnZU5vZGU8YW55LCBhbnk+ID0+ICh7XG4gICAgbmFtZTogcy5uYW1lLFxuICAgIGlkOiBzLmlkLFxuICAgIGNoaWxkcmVuOiBzLmNoaWxkcmVuPy5sZW5ndGggPyBzLmNoaWxkcmVuLm1hcChpbmZsYXRlKSA6IHVuZGVmaW5lZCxcbiAgICBuZXh0OiBzLm5leHQgPyBpbmZsYXRlKHMubmV4dCkgOiB1bmRlZmluZWQsXG4gIH0pO1xuICByZXR1cm4gaW5mbGF0ZShzcGVjKTtcbn1cbiJdfQ==
1671
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0QnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYnVpbGRlci9GbG93Q2hhcnRCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7O0dBWUc7OztBQUtILGlFQUFrRjtBQUVsRiwrRkFBeUY7QUFDekYsMkRBQXVGO0FBZ0J2RixnRkFBZ0Y7QUFDaEYsbUJBQW1CO0FBQ25CLGdGQUFnRjtBQUVoRixNQUFNLElBQUksR0FBRyxDQUFDLEdBQVcsRUFBUyxFQUFFO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUYsZ0ZBQWdGO0FBQ2hGLGNBQWM7QUFDZCxnRkFBZ0Y7QUFFaEY7OztHQUdHO0FBQ0gsTUFBYSxXQUFXO0lBQ0wsQ0FBQyxDQUFpQztJQUNsQyxPQUFPLENBQTBCO0lBQ2pDLE9BQU8sQ0FBOEI7SUFDckMsU0FBUyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDdkMsU0FBUyxDQUFVO0lBRVYsc0JBQXNCLENBQVc7SUFDakMsdUJBQXVCLENBQXNCO0lBQzdDLGtCQUFrQixDQUFTO0lBQzNCLGtCQUFrQixDQUFVO0lBQzVCLGNBQWMsR0FBZ0QsRUFBRSxDQUFDO0lBRWxGLFlBQ0UsT0FBdUMsRUFDdkMsT0FBZ0MsRUFDaEMsT0FBb0MsRUFDcEMseUJBQW1DLEVBQUUsRUFDckMsMEJBQStDLElBQUksR0FBRyxFQUFFLEVBQ3hELGtCQUFrQixHQUFHLENBQUMsRUFDdEIsa0JBQTJCO1FBRTNCLElBQUksQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxzQkFBc0IsQ0FBQztRQUNyRCxJQUFJLENB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LENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztLQUMzQyxDQUFDLENBQUM7SUFDSCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2QixDQUFDO0FBUkQsMENBUUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZsb3dDaGFydEJ1aWxkZXIg4oCUIEZsdWVudCBBUEkgZm9yIGNvbnN0cnVjdGluZyBmbG93Y2hhcnQgZXhlY3V0aW9uIGdyYXBocy5cbiAqXG4gKiBCdWlsZHMgU3RhZ2VOb2RlIHRyZWVzIGFuZCBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgKEpTT04pIGluIHRhbmRlbS5cbiAqIFplcm8gZGVwZW5kZW5jaWVzIG9uIG9sZCBjb2RlIOKAlCBvbmx5IGltcG9ydHMgZnJvbSBsb2NhbCB0eXBlcy5cbiAqXG4gKiBUaGUgYnVpbGRlciBjcmVhdGVzIHR3byBwYXJhbGxlbCBzdHJ1Y3R1cmVzOlxuICogMS4gU3RhZ2VOb2RlIHRyZWUg4oCUIHJ1bnRpbWUgZ3JhcGggd2l0aCBlbWJlZGRlZCBmdW5jdGlvbnNcbiAqIDIuIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSDigJQgSlNPTi1zYWZlIHN0cnVjdHVyZSBmb3IgdmlzdWFsaXphdGlvblxuICpcbiAqIFRoZSBleGVjdXRlKCkgY29udmVuaWVuY2UgbWV0aG9kIGlzIGludGVudGlvbmFsbHkgb21pdHRlZCDigJRcbiAqIGl0IGJlbG9uZ3MgaW4gdGhlIHJ1bm5lciBsYXllciAoUGhhc2UgNSkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTY29wZUZhY3RvcnkgfSBmcm9tICcuLi9lbmdpbmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYXVzYWJsZUhhbmRsZXIgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFR5cGVkU2NvcGUgfSBmcm9tICcuLi9yZWFjdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyB0eXBlIFJ1bm5hYmxlRmxvd0NoYXJ0LCBtYWtlUnVubmFibGUgfSBmcm9tICcuLi9ydW5uZXIvUnVubmFibGVDaGFydC5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0cnVjdHVyZUVkZ2VLaW5kLCBTdHJ1Y3R1cmVSZWNvcmRlciB9IGZyb20gJy4vc3RydWN0dXJlL1N0cnVjdHVyZVJlY29yZGVyLmpzJztcbmltcG9ydCB7IFN0cnVjdHVyZVJlY29yZGVyRGlzcGF0Y2hlciB9IGZyb20gJy4vc3RydWN0dXJlL1N0cnVjdHVyZVJlY29yZGVyRGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgeyB0eXBlIFR5cGVkU3RhZ2VGdW5jdGlvbiwgY3JlYXRlVHlwZWRTY29wZUZhY3RvcnkgfSBmcm9tICcuL3R5cGVkRmxvd0NoYXJ0LmpzJztcbmltcG9ydCB0eXBlIHtcbiAgRmxvd0NoYXJ0LFxuICBGbG93Q2hhcnRPcHRpb25zLFxuICBGbG93Q2hhcnRTcGVjLFxuICBJTG9nZ2VyLFxuICBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIFNpbXBsaWZpZWRQYXJhbGxlbFNwZWMsXG4gIFN0YWdlRnVuY3Rpb24sXG4gIFN0YWdlTm9kZSxcbiAgU3RyZWFtSGFuZGxlcnMsXG4gIFN0cmVhbUxpZmVjeWNsZUhhbmRsZXIsXG4gIFN0cmVhbVRva2VuSGFuZGxlcixcbiAgU3ViZmxvd01vdW50T3B0aW9ucyxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gSW50ZXJuYWwgaGVscGVyc1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmNvbnN0IGZhaWwgPSAobXNnOiBzdHJpbmcpOiBuZXZlciA9PiB7XG4gIHRocm93IG5ldyBFcnJvcihgW0Zsb3dDaGFydEJ1aWxkZXJdICR7bXNnfWApO1xufTtcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBEZWNpZGVyTGlzdFxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogRmx1ZW50IGhlbHBlciByZXR1cm5lZCBieSBhZGREZWNpZGVyRnVuY3Rpb24gdG8gYWRkIGJyYW5jaGVzLlxuICogYGVuZCgpYCBzZXRzIGBkZWNpZGVyRm4gPSB0cnVlYCDigJQgdGhlIGZuIElTIHRoZSBkZWNpZGVyLlxuICovXG5leHBvcnQgY2xhc3MgRGVjaWRlckxpc3Q8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYjogRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IGN1ck5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IGN1clNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgcHJpdmF0ZSByZWFkb25seSBicmFuY2hJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBkZWZhdWx0SWQ/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnREZXNjcmlwdGlvblBhcnRzOiBzdHJpbmdbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRTdGFnZURlc2NyaXB0aW9uczogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgcHJpdmF0ZSByZWFkb25seSByZXNlcnZlZFN0ZXBOdW1iZXI6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWNpZGVyRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnJhbmNoRGVzY0luZm86IEFycmF5PHsgaWQ6IHN0cmluZzsgZGVzY3JpcHRpb24/OiBzdHJpbmcgfT4gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBidWlsZGVyOiBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4sXG4gICAgY3VyTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY3VyU3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICAgIHBhcmVudERlc2NyaXB0aW9uUGFydHM6IHN0cmluZ1tdID0gW10sXG4gICAgcGFyZW50U3RhZ2VEZXNjcmlwdGlvbnM6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCksXG4gICAgcmVzZXJ2ZWRTdGVwTnVtYmVyID0gMCxcbiAgICBkZWNpZGVyRGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICkge1xuICAgIHRoaXMuYiA9IGJ1aWxkZXI7XG4gICAgdGhpcy5jdXJOb2RlID0gY3VyTm9kZTtcbiAgICB0aGlzLmN1clNwZWMgPSBjdXJTcGVjO1xuICAgIHRoaXMucGFyZW50RGVzY3JpcHRpb25QYXJ0cyA9IHBhcmVudERlc2NyaXB0aW9uUGFydHM7XG4gICAgdGhpcy5wYXJlbnRTdGFnZURlc2NyaXB0aW9ucyA9IHBhcmVudFN0YWdlRGVzY3JpcHRpb25zO1xuICAgIHRoaXMucmVzZXJ2ZWRTdGVwTnVtYmVyID0gcmVzZXJ2ZWRTdGVwTnVtYmVyO1xuICAgIHRoaXMuZGVjaWRlckRlc2NyaXB0aW9uID0gZGVjaWRlckRlc2NyaXB0aW9uO1xuICB9XG5cbiAgYWRkRnVuY3Rpb25CcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm4/OiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgLyoqIGB7IGxvb3BUbyB9YCBkZWNsYXJlcyB0aGlzIGJyYW5jaCBsb29wcyBiYWNrIHRvIGFuIGFscmVhZHktZGVjbGFyZWRcbiAgICAgKiAgc3RhZ2Ug4oCUIHRoZSBsb29wIGlzIFNPVVJDRUQgRlJPTSBUSElTIEJSQU5DSCAobm90IHRoZSBkZWNpZGVyKS4gKi9cbiAgICBvcHRpb25zPzogeyByZWFkb25seSBsb29wVG8/OiBzdHJpbmcgfSxcbiAgKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgaWYgKHRoaXMuYnJhbmNoSWRzLmhhcyhpZCkpIGZhaWwoYGR1cGxpY2F0ZSBkZWNpZGVyIGJyYW5jaCBpZCAnJHtpZH0nIHVuZGVyICcke3RoaXMuY3VyTm9kZS5uYW1lfSdgKTtcbiAgICB0aGlzLmJyYW5jaElkcy5hZGQoaWQpO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWU6IG5hbWUgPz8gaWQsIGlkLCBicmFuY2hJZDogaWQgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBpZiAoZm4pIHtcbiAgICAgIG5vZGUuZm4gPSBmbjtcbiAgICAgIHRoaXMuYi5fYWRkVG9NYXAoaWQsIGZuKTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWU6IG5hbWUgPz8gaWQsIGlkLCB0eXBlOiAnc3RhZ2UnIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG5cbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuID0gdGhpcy5jdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuICAgIC8vIEw3LjMg4oCUIERlY2lkZXIgYnJhbmNoOiBzdGFnZSArIGRlY2lzaW9uLWJyYW5jaCBlZGdlIGtleWVkIGJ5IGlkLlxuICAgIHRoaXMuYi5fZmlyZVN0YWdlQWRkZWRGcm9tU3ViQnVpbGRlcihzcGVjKTtcbiAgICB0aGlzLmIuX2ZpcmVFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcih0aGlzLmN1clNwZWMuaWQsIHNwZWMuaWQsICdkZWNpc2lvbi1icmFuY2gnLCBpZCk7XG5cbiAgICB0aGlzLmJyYW5jaERlc2NJbmZvLnB1c2goeyBpZCwgZGVzY3JpcHRpb24gfSk7XG4gICAgaWYgKG9wdGlvbnM/Lmxvb3BUbykgdGhpcy5fYXBwbHlCcmFuY2hMb29wKG5vZGUsIHNwZWMsIG9wdGlvbnMubG9vcFRvKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBwYXVzYWJsZSBzdGFnZSBhcyBhIGRlY2lkZXIgYnJhbmNoLlxuICAgKlxuICAgKiBXaGVuIHRoaXMgYnJhbmNoIGlzIGNob3NlbiwgdGhlIGhhbmRsZXIncyBgZXhlY3V0ZWAgcnVucy4gSWYgaXQgcmV0dXJuc1xuICAgKiBkYXRhLCB0aGUgcGlwZWxpbmUgcGF1c2VzLiBPbiByZXN1bWUsIGBoYW5kbGVyLnJlc3VtZWAgcnVucyB3aXRoIHRoZVxuICAgKiBodW1hbidzIGlucHV0LiBJZiBgZXhlY3V0ZWAgcmV0dXJucyB2b2lkLCB0aGUgc3RhZ2UgY29udGludWVzIG5vcm1hbGx5XG4gICAqIChjb25kaXRpb25hbCBwYXVzZSkuXG4gICAqL1xuICBhZGRQYXVzYWJsZUZ1bmN0aW9uQnJhbmNoKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGhhbmRsZXI6IFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+LFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIC8qKiBgeyBsb29wVG8gfWAgZGVjbGFyZXMgdGhpcyBicmFuY2ggbG9vcHMgYmFjayB0byBhbiBhbHJlYWR5LWRlY2xhcmVkXG4gICAgICogIHN0YWdlIOKAlCB0aGUgbG9vcCBpcyBTT1VSQ0VEIEZST00gVEhJUyBCUkFOQ0ggKG5vdCB0aGUgZGVjaWRlcikuICovXG4gICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgbG9vcFRvPzogc3RyaW5nIH0sXG4gICk6IERlY2lkZXJMaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGlmICh0aGlzLmJyYW5jaElkcy5oYXMoaWQpKSBmYWlsKGBkdXBsaWNhdGUgZGVjaWRlciBicmFuY2ggaWQgJyR7aWR9JyB1bmRlciAnJHt0aGlzLmN1ck5vZGUubmFtZX0nYCk7XG4gICAgdGhpcy5icmFuY2hJZHMuYWRkKGlkKTtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZTogbmFtZSA/PyBpZCxcbiAgICAgIGlkLFxuICAgICAgYnJhbmNoSWQ6IGlkLFxuICAgICAgZm46IGhhbmRsZXIuZXhlY3V0ZSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgICBpc1BhdXNhYmxlOiB0cnVlLFxuICAgICAgcmVzdW1lRm46IGhhbmRsZXIucmVzdW1lLFxuICAgIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgdGhpcy5iLl9hZGRUb01hcChpZCwgaGFuZGxlci5leGVjdXRlIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPik7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWU6IG5hbWUgPz8gaWQsIGlkLCB0eXBlOiAnc3RhZ2UnLCBpc1BhdXNhYmxlOiB0cnVlIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG5cbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuID0gdGhpcy5jdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuICAgIC8vIEw3LjMg4oCUIFBhdXNhYmxlIGRlY2lkZXIgYnJhbmNoLlxuICAgIHRoaXMuYi5fZmlyZVN0YWdlQWRkZWRGcm9tU3ViQnVpbGRlcihzcGVjKTtcbiAgICB0aGlzLmIuX2ZpcmVFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcih0aGlzLmN1clNwZWMuaWQsIHNwZWMuaWQsICdkZWNpc2lvbi1icmFuY2gnLCBpZCk7XG5cbiAgICB0aGlzLmJyYW5jaERlc2NJbmZvLnB1c2goeyBpZCwgZGVzY3JpcHRpb24gfSk7XG4gICAgaWYgKG9wdGlvbnM/Lmxvb3BUbykgdGhpcy5fYXBwbHlCcmFuY2hMb29wKG5vZGUsIHNwZWMsIG9wdGlvbnMubG9vcFRvKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZFN1YkZsb3dDaGFydEJyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIHN1YmZsb3c6IEZsb3dDaGFydDxhbnksIGFueT4sXG4gICAgbW91bnROYW1lPzogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBTdWJmbG93TW91bnRPcHRpb25zLFxuICApOiBEZWNpZGVyTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBpZiAodGhpcy5icmFuY2hJZHMuaGFzKGlkKSkgZmFpbChgZHVwbGljYXRlIGRlY2lkZXIgYnJhbmNoIGlkICcke2lkfScgdW5kZXIgJyR7dGhpcy5jdXJOb2RlLm5hbWV9J2ApO1xuICAgIHRoaXMuYnJhbmNoSWRzLmFkZChpZCk7XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcbiAgICBjb25zdCBwcmVmaXhlZFJvb3QgPSB0aGlzLmIuX3ByZWZpeE5vZGVUcmVlKHN1YmZsb3cucm9vdCwgaWQpO1xuXG4gICAgaWYgKCF0aGlzLmIuX3N1YmZsb3dEZWZzLmhhcyhpZCkpIHtcbiAgICAgIHRoaXMuYi5fc3ViZmxvd0RlZnMuc2V0KGlkLCB7IHJvb3Q6IHByZWZpeGVkUm9vdCB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgaWQsXG4gICAgICBicmFuY2hJZDogaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMpIG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBzdWJmbG93U3RydWN0dXJlOiBzdWJmbG93LmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICB9O1xuICAgIC8vIFNUUlVDVFVSRS1PTkxZIGNvbnZlcmdlbmNlIG92ZXJyaWRlIOKAlCB0aGlzIGJyYW5jaCdzIGNvbnZlcmdlbmNlIGVkZ2VcbiAgICAvLyBwb2ludHMgYXQgYGNvbnZlcmdlQXRgIGluc3RlYWQgb2YgdGhlIHNoYXJlZCBuZXh0IHN0YWdlIChzZWVcbiAgICAvLyBgX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnRgKS4gQ2FycmllZCBvbiB0aGUgc3BlYyBzbyB0aGUgZWRnZS1maXJpbmdcbiAgICAvLyBjaG9rZXBvaW50ICh3aGljaCBpdGVyYXRlcyBjaGlsZCBzcGVjcykgY2FuIHJlYWQgaXQuXG4gICAgaWYgKG9wdGlvbnM/LmNvbnZlcmdlQXQpIHNwZWMuY29udmVyZ2VBdCA9IG9wdGlvbnMuY29udmVyZ2VBdDtcblxuICAgIHRoaXMuY3VyTm9kZS5jaGlsZHJlbiA9IHRoaXMuY3VyTm9kZS5jaGlsZHJlbiB8fCBbXTtcbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICB0aGlzLmN1clNwZWMuY2hpbGRyZW4gPSB0aGlzLmN1clNwZWMuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuLnB1c2goc3BlYyk7XG4gICAgLy8gTDcuMyDigJQgU3ViZmxvdyBhcyBkZWNpZGVyIGJyYW5jaDogc3RhZ2UgKyBkZWNpc2lvbiBlZGdlICsgbW91bnQuXG4gICAgdGhpcy5iLl9maXJlU3RhZ2VBZGRlZEZyb21TdWJCdWlsZGVyKHNwZWMpO1xuICAgIHRoaXMuYi5fZmlyZUVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyKHRoaXMuY3VyU3BlYy5pZCwgc3BlYy5pZCwgJ2RlY2lzaW9uLWJyYW5jaCcsIGlkKTtcbiAgICB0aGlzLmIuX2ZpcmVTdWJmbG93TW91bnRlZEZyb21TdWJCdWlsZGVyKGlkLCBzdWJmbG93TmFtZSwgaWQsIGZhbHNlLCBzdWJmbG93LmJ1aWxkVGltZVN0cnVjdHVyZSk7XG5cbiAgICB0aGlzLmIuX21lcmdlU3RhZ2VNYXAoc3ViZmxvdy5zdGFnZU1hcCwgaWQpO1xuICAgIHRoaXMuYi5fbWVyZ2VTdWJmbG93cyhzdWJmbG93LnN1YmZsb3dzLCBpZCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZExhenlTdWJGbG93Q2hhcnRCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICByZXNvbHZlcjogKCkgPT4gRmxvd0NoYXJ0PGFueSwgYW55PixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IERlY2lkZXJMaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGlmICh0aGlzLmJyYW5jaElkcy5oYXMoaWQpKSBmYWlsKGBkdXBsaWNhdGUgZGVjaWRlciBicmFuY2ggaWQgJyR7aWR9JyB1bmRlciAnJHt0aGlzLmN1ck5vZGUubmFtZX0nYCk7XG4gICAgdGhpcy5icmFuY2hJZHMuYWRkKGlkKTtcblxuICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gbW91bnROYW1lIHx8IGlkO1xuXG4gICAgLy8gU3RvcmUgcmVzb2x2ZXIgb24gdGhlIG5vZGUg4oCUIE5PIGVhZ2VyIHRyZWUgY2xvbmluZ1xuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICBpZCxcbiAgICAgIGJyYW5jaElkOiBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBzdWJmbG93UmVzb2x2ZXI6IHJlc29sdmVyIGFzIGFueSxcbiAgICB9O1xuICAgIGlmIChvcHRpb25zKSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgLy8gU3BlYyBzdHViIOKAlCBubyBzdWJmbG93U3RydWN0dXJlIChsYXp5KS4gVGhlIGxhenkgc3ViZmxvdydzXG4gICAgLy8gaW50ZXJuYWxzIHdpbGwgYmUgc2hhcGVkIGF0IHJlc29sdXRpb24gdGltZS5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBpc0xhenk6IHRydWUsXG4gICAgfTtcblxuICAgIHRoaXMuY3VyTm9kZS5jaGlsZHJlbiA9IHRoaXMuY3VyTm9kZS5jaGlsZHJlbiB8fCBbXTtcbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICB0aGlzLmN1clNwZWMuY2hpbGRyZW4gPSB0aGlzLmN1clNwZWMuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuLnB1c2goc3BlYyk7XG4gICAgLy8gTDcuMyDigJQgTGF6eSBzdWJmbG93IGFzIGRlY2lkZXIgYnJhbmNoLlxuICAgIHRoaXMuYi5fZmlyZVN0YWdlQWRkZWRGcm9tU3ViQnVpbGRlcihzcGVjKTtcbiAgICB0aGlzLmIuX2ZpcmVFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcih0aGlzLmN1clNwZWMuaWQsIHNwZWMuaWQsICdkZWNpc2lvbi1icmFuY2gnLCBpZCk7XG4gICAgdGhpcy5iLl9maXJlU3ViZmxvd01vdW50ZWRGcm9tU3ViQnVpbGRlcihpZCwgc3ViZmxvd05hbWUsIGlkLCB0cnVlKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkQnJhbmNoTGlzdChcbiAgICBicmFuY2hlczogQXJyYXk8e1xuICAgICAgaWQ6IHN0cmluZztcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGZuPzogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+O1xuICAgIH0+LFxuICApOiBEZWNpZGVyTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBmb3IgKGNvbnN0IHsgaWQsIG5hbWUsIGZuIH0gb2YgYnJhbmNoZXMpIHtcbiAgICAgIHRoaXMuYWRkRnVuY3Rpb25CcmFuY2goaWQsIG5hbWUsIGZuKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXREZWZhdWx0KGlkOiBzdHJpbmcpOiBEZWNpZGVyTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICB0aGlzLmRlZmF1bHRJZCA9IGlkO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIGxvb3AtYmFjayBlZGdlIHRvIHRoZSBMQVNULWFkZGVkIGJyYW5jaCwgc28gdGhlIGxvb3AgaXMgc291cmNlZFxuICAgKiBmcm9tIFRIQVQgYnJhbmNoIG5vZGUgKGUuZy4gYCd0b29sLWNhbGxzJyDihpIgbG9vcFRvKCdjb250ZXh0JylgKSByYXRoZXIgdGhhblxuICAgKiBmcm9tIHRoZSBkZWNpZGVyLiBUaGUgY2hhcnQgdGhlbiByZWFkcyBob25lc3RseTogdGhlIGRlY2lkZXIgc3BsaXRzIGludG8gYVxuICAgKiBsb29waW5nIGJyYW5jaCBgW1Rvb2xDYWxscyDihpIgYmFjayB0byBDb250ZXh0XWAgYW5kIGEgdGVybWluYXRpbmcgYnJhbmNoXG4gICAqIGBbRmluYWwg4oaSIGVuZF1gLCBpbnN0ZWFkIG9mIGEgc2luZ2xlIGxvb3AgaGFuZ2luZyBvZmYgdGhlIGRlY2lkZXIuXG4gICAqXG4gICAqIE5vIGVuZ2luZSBjaGFuZ2UgaXMgbmVlZGVkOiB0aGUgcnVudGltZSBydW5zIHRoZSBjaG9zZW4gYnJhbmNoIGFuZCB0aGVuXG4gICAqIGZvbGxvd3MgdGhhdCBicmFuY2ggbm9kZSdzIE9XTiBgbmV4dGAg4oCUIGFuZCBhIGBuZXh0YCBmbGFnZ2VkIGBpc0xvb3BSZWZgXG4gICAqIHJvdXRlcyBiYWNrIHRvIHRoZSB0YXJnZXQgZXhhY3RseSBsaWtlIHRoZSBkZWNpZGVyJ3Mgb3duIGxvb3AgZG9lcy4gVGhpc1xuICAgKiBtZXRob2QganVzdCBsZXRzIHRoZSBidWlsZGVyIGV4cHJlc3Mgd2hhdCB0aGUgZW5naW5lIGFscmVhZHkgc3VwcG9ydHMuXG4gICAqXG4gICAqIFRhcmdldHMgdGhlIGJyYW5jaCBhZGRlZCBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyBjYWxsIChjaGFpbiBpdCByaWdodCBhZnRlclxuICAgKiB0aGUgYnJhbmNoJ3MgYGFkZEZ1bmN0aW9uQnJhbmNoYC9gYWRkUGF1c2FibGVGdW5jdGlvbkJyYW5jaGAvXG4gICAqIGBhZGRTdWJGbG93Q2hhcnRCcmFuY2hgKS4gTWlycm9ycyBgRmxvd0NoYXJ0QnVpbGRlci5sb29wVG9gIHZhbGlkYXRpb24uXG4gICAqXG4gICAqIFdvcmtzIG9uIGEgU1VCRkxPVyBicmFuY2ggdG9vOiB0aGUgYnJhbmNoIG5vZGUgY2FycmllcyBib3RoIGl0cyBzdWJmbG93XG4gICAqIHJlc29sdmVyIEFORCB0aGUgbG9vcC1iYWNrIGBuZXh0YCDigJQgdGhleSBjb2V4aXN0IHNhZmVseSAodGhlIHJ1bnRpbWUgcnVuc1xuICAgKiB0aGUgc3ViZmxvdywgdGhlbiBmb2xsb3dzIHRoZSBsb29wIHJlZikuIFRoZSB0YXJnZXQgbXVzdCBiZSBhIHN0YWdlIGFscmVhZHlcbiAgICogZGVjbGFyZWQgQkVGT1JFIHRoZSBkZWNpZGVyIChlLmcuIGFuIHVwc3RyZWFtIGBjb250ZXh0YCk7IGJyYW5jaCBpZHMgYW5kIHRoZVxuICAgKiBzeW50aGV0aWMgYCdkZWZhdWx0J2AgY2xvbmUgYXJlIE5PVCB2YWxpZCBsb29wIHRhcmdldHMuXG4gICAqL1xuICBsb29wVG8oc3RhZ2VJZDogc3RyaW5nKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW47XG4gICAgY29uc3Qgc3BlY0NoaWxkcmVuID0gdGhpcy5jdXJTcGVjLmNoaWxkcmVuO1xuICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwIHx8ICFzcGVjQ2hpbGRyZW4gfHwgc3BlY0NoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZmFpbChgbG9vcFRvKCcke3N0YWdlSWR9JykgY2FsbGVkIGJlZm9yZSBhbnkgYnJhbmNoIHdhcyBhZGRlZCB1bmRlciAnJHt0aGlzLmN1ck5vZGUubmFtZX0nYCk7XG4gICAgfVxuICAgIC8vIGZhaWwoKSB0aHJvd3MsIHNvIGNoaWxkcmVuL3NwZWNDaGlsZHJlbiBhcmUgbm9uLWVtcHR5IGhlcmUuXG4gICAgdGhpcy5fYXBwbHlCcmFuY2hMb29wKGNoaWxkcmVuIVtjaGlsZHJlbiEubGVuZ3RoIC0gMV0hLCBzcGVjQ2hpbGRyZW4hW3NwZWNDaGlsZHJlbiEubGVuZ3RoIC0gMV0hLCBzdGFnZUlkKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvcmF0ZSBPTkUgYnJhbmNoIG5vZGUvc3BlYyB3aXRoIGEgbG9vcC1iYWNrIGVkZ2UgdG8gYHN0YWdlSWRgLiBTaGFyZWQgYnlcbiAgICogdGhlIHBvc2l0aW9uYWwgYGxvb3BUbygpYCAod2hpY2ggdGFyZ2V0cyB0aGUgbGFzdC1hZGRlZCBicmFuY2gpIEFORCB0aGVcbiAgICogcGVyLWJyYW5jaCBgeyBsb29wVG8gfWAgb3B0aW9uIG9uIGBhZGRGdW5jdGlvbkJyYW5jaGAgL1xuICAgKiBgYWRkUGF1c2FibGVGdW5jdGlvbkJyYW5jaGAgLyBgYWRkU3ViRmxvd0NoYXJ0QnJhbmNoYC4gRWl0aGVyIHdheSB0aGUgbG9vcFxuICAgKiBTT1VSQ0UgaXMgdGhlIGJyYW5jaCDigJQgc28gdmlzdWFsaXplcnMgcmVhZCBgdG9vbC1jYWxscyDihpIgY29udGV4dGAsIG5ldmVyXG4gICAqIGBSb3V0ZSDihpIgY29udGV4dGAuIFZhbGlkYXRlcyB0aGUgdGFyZ2V0IGlzIGEgc3RhZ2UgZGVjbGFyZWQgQkVGT1JFIHRoZVxuICAgKiBkZWNpZGVyIChicmFuY2ggaWRzIC8gdGhlIHN5bnRoZXRpYyAnZGVmYXVsdCcgY2xvbmUgYXJlIG5vdCB2YWxpZCB0YXJnZXRzKS5cbiAgICovXG4gIHByaXZhdGUgX2FwcGx5QnJhbmNoTG9vcChcbiAgICBicmFuY2hOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBicmFuY2hTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gICAgc3RhZ2VJZDogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICBpZiAoYnJhbmNoU3BlYy5sb29wVGFyZ2V0KSBmYWlsKGBsb29wVG8gYWxyZWFkeSBkZWZpbmVkIG9uIGJyYW5jaCAnJHticmFuY2hTcGVjLmlkfSdgKTtcbiAgICBpZiAoYnJhbmNoTm9kZS5uZXh0KSB7XG4gICAgICBmYWlsKGBjYW5ub3Qgc2V0IGxvb3BUbyBvbiBicmFuY2ggJyR7YnJhbmNoU3BlYy5pZH0nIOKAlCBpdCBhbHJlYWR5IGhhcyBhIGNvbnRpbnVhdGlvbmApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYi5fa25vd25TdGFnZUlkc0hhcyhzdGFnZUlkKSkge1xuICAgICAgZmFpbChcbiAgICAgICAgYGxvb3BUbygnJHtzdGFnZUlkfScpIHRhcmdldCBub3QgZm91bmQg4oCUIGEgYnJhbmNoIGxvb3AgbXVzdCB0YXJnZXQgYSBzdGFnZSBgICtcbiAgICAgICAgICBcImRlY2xhcmVkIEJFRk9SRSB0aGUgZGVjaWRlciAoYnJhbmNoIGlkcyBhbmQgdGhlIHN5bnRoZXRpYyAnZGVmYXVsdCcgYnJhbmNoIFwiICtcbiAgICAgICAgICAnYXJlIG5vdCB2YWxpZCBsb29wIHRhcmdldHM7IGRpZCB5b3UgcGFzcyBhIHN0YWdlIG5hbWUgaW5zdGVhZCBvZiBhbiBpZD8pJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYnJhbmNoTm9kZS5uZXh0ID0geyBuYW1lOiBzdGFnZUlkLCBpZDogc3RhZ2VJZCwgaXNMb29wUmVmOiB0cnVlIH07XG4gICAgYnJhbmNoU3BlYy5sb29wVGFyZ2V0ID0gc3RhZ2VJZDtcbiAgICBicmFuY2hTcGVjLm5leHQgPSB7IG5hbWU6IHN0YWdlSWQsIGlkOiBzdGFnZUlkLCB0eXBlOiAnbG9vcCcsIGlzTG9vcFJlZmVyZW5jZTogdHJ1ZSB9O1xuXG4gICAgLy8gQnJhbmNoLXNjb3BlZCBkZXNjcmlwdGlvbiDigJQgYXR0cmlidXRlIHRoZSBsb29wIHRvIHRoZSBicmFuY2gsIG5vdCB0aGVcbiAgICAvLyBkZWNpZGVyIChwYXJlbnREZXNjcmlwdGlvblBhcnRzIGlzIHRoZSBkZWNpZGVyJ3MgZGVzY3JpcHRpb24gY29udGV4dCkuXG4gICAgdGhpcy5wYXJlbnREZXNjcmlwdGlvblBhcnRzLnB1c2goYCAgIOKGkiBicmFuY2ggJyR7YnJhbmNoU3BlYy5pZH0nIGxvb3BzIGJhY2sgdG8gJHtzdGFnZUlkfWApO1xuXG4gICAgLy8gRmlyZSB0aGUgbG9vcCBiYWNrLWVkZ2UgU09VUkNFRCBGUk9NIFRIRSBCUkFOQ0ggc28gdmlzdWFsaXplcnMgcmVhZFxuICAgIC8vIGB0b29sLWNhbGxzIOKGkiBjb250ZXh0YCwgbm90IGBSb3V0ZSDihpIgY29udGV4dGAuXG4gICAgdGhpcy5iLl9maXJlTG9vcEVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyKGJyYW5jaFNwZWMuaWQsIHN0YWdlSWQpO1xuICB9XG5cbiAgZW5kKCk6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW47XG4gICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW0Zsb3dDaGFydEJ1aWxkZXJdIGRlY2lkZXIgYXQgJyR7dGhpcy5jdXJOb2RlLm5hbWV9JyByZXF1aXJlcyBhdCBsZWFzdCBvbmUgYnJhbmNoYCk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdGhhdCBldmVyeSBicmFuY2ggd2l0aCBubyBlbWJlZGRlZCBmbiBpcyByZXNvbHZhYmxlIGZyb20gdGhlIHN0YWdlTWFwXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgaWYgKCFjaGlsZC5mbiAmJiBjaGlsZC5pZCAmJiAhY2hpbGQuaXNTdWJmbG93Um9vdCAmJiAhY2hpbGQuc3ViZmxvd1Jlc29sdmVyKSB7XG4gICAgICAgIGNvbnN0IGhhc0luTWFwID0gdGhpcy5iLl9zdGFnZU1hcEhhcyhjaGlsZC5pZCkgfHwgdGhpcy5iLl9zdGFnZU1hcEhhcyhjaGlsZC5uYW1lKTtcbiAgICAgICAgaWYgKCFoYXNJbk1hcCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBbRmxvd0NoYXJ0QnVpbGRlcl0gZGVjaWRlciBicmFuY2ggJyR7Y2hpbGQuaWR9JyB1bmRlciAnJHt0aGlzLmN1ck5vZGUubmFtZX0nIGhhcyBubyBmdW5jdGlvbiDigJQgYCArXG4gICAgICAgICAgICAgIGBwcm92aWRlIGEgZm4gYXJndW1lbnQgdG8gYWRkRnVuY3Rpb25CcmFuY2goJyR7Y2hpbGQuaWR9JywgLi4uKWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY3VyTm9kZS5kZWNpZGVyRm4gPSB0cnVlO1xuXG4gICAgLy8gQnVpbGQgYnJhbmNoSWRzIEJFRk9SRSBhcHBlbmRpbmcgdGhlIHN5bnRoZXRpYyBkZWZhdWx0IOKAlCBvbmx5IHVzZXItc3BlY2lmaWVkIGJyYW5jaGVzXG4gICAgdGhpcy5jdXJTcGVjLmJyYW5jaElkcyA9IGNoaWxkcmVuXG4gICAgICAubWFwKChjKSA9PiBjLmlkKVxuICAgICAgLmZpbHRlcigoaWQpOiBpZCBpcyBzdHJpbmcgPT4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiBpZC5sZW5ndGggPiAwKTtcbiAgICB0aGlzLmN1clNwZWMudHlwZSA9ICdkZWNpZGVyJztcblxuICAgIGlmICh0aGlzLmRlZmF1bHRJZCkge1xuICAgICAgY29uc3QgZGVmYXVsdENoaWxkID0gY2hpbGRyZW4uZmluZCgoYykgPT4gYy5pZCA9PT0gdGhpcy5kZWZhdWx0SWQpO1xuICAgICAgaWYgKGRlZmF1bHRDaGlsZCkge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKHsgLi4uZGVmYXVsdENoaWxkLCBpZDogJ2RlZmF1bHQnLCBicmFuY2hJZDogJ2RlZmF1bHQnIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnJlc2VydmVkU3RlcE51bWJlciA+IDApIHtcbiAgICAgIGNvbnN0IGRlY2lkZXJMYWJlbCA9IHRoaXMuY3VyTm9kZS5uYW1lO1xuICAgICAgY29uc3QgYnJhbmNoSWRMaXN0ID0gdGhpcy5icmFuY2hEZXNjSW5mby5tYXAoKGIpID0+IGIuaWQpLmpvaW4oJywgJyk7XG4gICAgICBjb25zdCBtYWluTGluZSA9IHRoaXMuZGVjaWRlckRlc2NyaXB0aW9uXG4gICAgICAgID8gYCR7dGhpcy5yZXNlcnZlZFN0ZXBOdW1iZXJ9LiAke2RlY2lkZXJMYWJlbH0g4oCUICR7dGhpcy5kZWNpZGVyRGVzY3JpcHRpb259IChicmFuY2hlczogJHticmFuY2hJZExpc3R9KWBcbiAgICAgICAgOiBgJHt0aGlzLnJlc2VydmVkU3RlcE51bWJlcn0uICR7ZGVjaWRlckxhYmVsfSDigJQgRGVjaWRlcyBiZXR3ZWVuOiAke2JyYW5jaElkTGlzdH1gO1xuICAgICAgdGhpcy5wYXJlbnREZXNjcmlwdGlvblBhcnRzLnB1c2gobWFpbkxpbmUpO1xuXG4gICAgICBpZiAodGhpcy5kZWNpZGVyRGVzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5wYXJlbnRTdGFnZURlc2NyaXB0aW9ucy5zZXQodGhpcy5jdXJOb2RlLm5hbWUsIHRoaXMuZGVjaWRlckRlc2NyaXB0aW9uKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBicmFuY2ggb2YgdGhpcy5icmFuY2hEZXNjSW5mbykge1xuICAgICAgICBjb25zdCBicmFuY2hUZXh0ID0gYnJhbmNoLmRlc2NyaXB0aW9uO1xuICAgICAgICBpZiAoYnJhbmNoVGV4dCkge1xuICAgICAgICAgIHRoaXMucGFyZW50RGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAgICDihpIgJHticmFuY2guaWR9OiAke2JyYW5jaFRleHR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJyYW5jaC5kZXNjcmlwdGlvbikge1xuICAgICAgICAgIHRoaXMucGFyZW50U3RhZ2VEZXNjcmlwdGlvbnMuc2V0KGJyYW5jaC5pZCwgYnJhbmNoLmRlc2NyaXB0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEw3LjMg4oCUIGZpcmUgYG9uRGVjaWRlckNvbXBsZXRlYCBzbyBjb25zdW1lcnMgY2FuIHRydXN0IG5vIG1vcmVcbiAgICAvLyBicmFuY2hlcyB3aWxsIGFycml2ZSBmb3IgdGhpcyBkZWNpZGVyLiBCcmFuY2ggaXRlcmF0aW9uIG9yZGVyID1cbiAgICAvLyBhZGRpdGlvbiBvcmRlciA9IFNldCBpbnNlcnRpb24gb3JkZXIuXG4gICAgdGhpcy5iLl9maXJlRGVjaWRlckNvbXBsZXRlRnJvbVN1YkJ1aWxkZXIodGhpcy5jdXJTcGVjLmlkLCAnZGVjaWRlcicsIFsuLi50aGlzLmJyYW5jaElkc10sIHRoaXMuZGVmYXVsdElkKTtcbiAgICByZXR1cm4gdGhpcy5iO1xuICB9XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gU2VsZWN0b3JGbkxpc3QgKHNjb3BlLWJhc2VkIHNlbGVjdG9yIOKAlCBtaXJyb3JzIERlY2lkZXJMaXN0KVxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBjbGFzcyBTZWxlY3RvckZuTGlzdDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBiOiBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgY3VyTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgY3VyU3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlO1xuICBwcml2YXRlIHJlYWRvbmx5IGJyYW5jaElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50RGVzY3JpcHRpb25QYXJ0czogc3RyaW5nW107XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50U3RhZ2VEZXNjcmlwdGlvbnM6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzZXJ2ZWRTdGVwTnVtYmVyOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0b3JEZXNjcmlwdGlvbj86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBicmFuY2hEZXNjSW5mbzogQXJyYXk8eyBpZDogc3RyaW5nOyBkZXNjcmlwdGlvbj86IHN0cmluZyB9PiA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGJ1aWxkZXI6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPixcbiAgICBjdXJOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjdXJTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gICAgcGFyZW50RGVzY3JpcHRpb25QYXJ0czogc3RyaW5nW10gPSBbXSxcbiAgICBwYXJlbnRTdGFnZURlc2NyaXB0aW9uczogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKSxcbiAgICByZXNlcnZlZFN0ZXBOdW1iZXIgPSAwLFxuICAgIHNlbGVjdG9yRGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICkge1xuICAgIHRoaXMuYiA9IGJ1aWxkZXI7XG4gICAgdGhpcy5jdXJOb2RlID0gY3VyTm9kZTtcbiAgICB0aGlzLmN1clNwZWMgPSBjdXJTcGVjO1xuICAgIHRoaXMucGFyZW50RGVzY3JpcHRpb25QYXJ0cyA9IHBhcmVudERlc2NyaXB0aW9uUGFydHM7XG4gICAgdGhpcy5wYXJlbnRTdGFnZURlc2NyaXB0aW9ucyA9IHBhcmVudFN0YWdlRGVzY3JpcHRpb25zO1xuICAgIHRoaXMucmVzZXJ2ZWRTdGVwTnVtYmVyID0gcmVzZXJ2ZWRTdGVwTnVtYmVyO1xuICAgIHRoaXMuc2VsZWN0b3JEZXNjcmlwdGlvbiA9IHNlbGVjdG9yRGVzY3JpcHRpb247XG4gIH1cblxuICBhZGRGdW5jdGlvbkJyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbj86IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgaWYgKHRoaXMuYnJhbmNoSWRzLmhhcyhpZCkpIGZhaWwoYGR1cGxpY2F0ZSBzZWxlY3RvciBicmFuY2ggaWQgJyR7aWR9JyB1bmRlciAnJHt0aGlzLmN1ck5vZGUubmFtZX0nYCk7XG4gICAgdGhpcy5icmFuY2hJZHMuYWRkKGlkKTtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyBuYW1lOiBuYW1lID8/IGlkLCBpZCwgYnJhbmNoSWQ6IGlkIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgaWYgKGZuKSB7XG4gICAgICBub2RlLmZuID0gZm47XG4gICAgICB0aGlzLmIuX2FkZFRvTWFwKGlkLCBmbik7XG4gICAgfVxuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lOiBuYW1lID8/IGlkLCBpZCwgdHlwZTogJ3N0YWdlJyB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuXG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuID0gdGhpcy5jdXJOb2RlLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyTm9kZS5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbiA9IHRoaXMuY3VyU3BlYy5jaGlsZHJlbiB8fCBbXTtcbiAgICB0aGlzLmN1clNwZWMuY2hpbGRyZW4ucHVzaChzcGVjKTtcbiAgICAvLyBMNy4zIOKAlCBTZWxlY3RvciBicmFuY2guXG4gICAgdGhpcy5iLl9maXJlU3RhZ2VBZGRlZEZyb21TdWJCdWlsZGVyKHNwZWMpO1xuICAgIHRoaXMuYi5fZmlyZUVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyKHRoaXMuY3VyU3BlYy5pZCwgc3BlYy5pZCwgJ2RlY2lzaW9uLWJyYW5jaCcsIGlkKTtcblxuICAgIHRoaXMuYnJhbmNoRGVzY0luZm8ucHVzaCh7IGlkLCBkZXNjcmlwdGlvbiB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBwYXVzYWJsZSBzdGFnZSBhcyBhIHNlbGVjdG9yIGJyYW5jaC5cbiAgICpcbiAgICogV2hlbiB0aGlzIGJyYW5jaCBpcyBzZWxlY3RlZCwgdGhlIGhhbmRsZXIncyBgZXhlY3V0ZWAgcnVucy4gSWYgaXQgcmV0dXJuc1xuICAgKiBkYXRhLCB0aGUgcGlwZWxpbmUgcGF1c2VzLiBPbiByZXN1bWUsIGBoYW5kbGVyLnJlc3VtZWAgcnVucyB3aXRoIHRoZVxuICAgKiBodW1hbidzIGlucHV0LiBJZiBgZXhlY3V0ZWAgcmV0dXJucyB2b2lkLCB0aGUgc3RhZ2UgY29udGludWVzIG5vcm1hbGx5LlxuICAgKi9cbiAgYWRkUGF1c2FibGVGdW5jdGlvbkJyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBoYW5kbGVyOiBQYXVzYWJsZUhhbmRsZXI8VFNjb3BlPixcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgaWYgKHRoaXMuYnJhbmNoSWRzLmhhcyhpZCkpIGZhaWwoYGR1cGxpY2F0ZSBzZWxlY3RvciBicmFuY2ggaWQgJyR7aWR9JyB1bmRlciAnJHt0aGlzLmN1ck5vZGUubmFtZX0nYCk7XG4gICAgdGhpcy5icmFuY2hJZHMuYWRkKGlkKTtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZTogbmFtZSA/PyBpZCxcbiAgICAgIGlkLFxuICAgICAgYnJhbmNoSWQ6IGlkLFxuICAgICAgZm46IGhhbmRsZXIuZXhlY3V0ZSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgICBpc1BhdXNhYmxlOiB0cnVlLFxuICAgICAgcmVzdW1lRm46IGhhbmRsZXIucmVzdW1lLFxuICAgIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgdGhpcy5iLl9hZGRUb01hcChpZCwgaGFuZGxlci5leGVjdXRlIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPik7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWU6IG5hbWUgPz8gaWQsIGlkLCB0eXBlOiAnc3RhZ2UnLCBpc1BhdXNhYmxlOiB0cnVlIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG5cbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuID0gdGhpcy5jdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuICAgIC8vIEw3LjMg4oCUIFBhdXNhYmxlIHNlbGVjdG9yIGJyYW5jaC5cbiAgICB0aGlzLmIuX2ZpcmVTdGFnZUFkZGVkRnJvbVN1YkJ1aWxkZXIoc3BlYyk7XG4gICAgdGhpcy5iLl9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXIodGhpcy5jdXJTcGVjLmlkLCBzcGVjLmlkLCAnZGVjaXNpb24tYnJhbmNoJywgaWQpO1xuXG4gICAgdGhpcy5icmFuY2hEZXNjSW5mby5wdXNoKHsgaWQsIGRlc2NyaXB0aW9uIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkU3ViRmxvd0NoYXJ0QnJhbmNoKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgc3ViZmxvdzogRmxvd0NoYXJ0PGFueSwgYW55PixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGlmICh0aGlzLmJyYW5jaElkcy5oYXMoaWQpKSBmYWlsKGBkdXBsaWNhdGUgc2VsZWN0b3IgYnJhbmNoIGlkICcke2lkfScgdW5kZXIgJyR7dGhpcy5jdXJOb2RlLm5hbWV9J2ApO1xuICAgIHRoaXMuYnJhbmNoSWRzLmFkZChpZCk7XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcbiAgICBjb25zdCBwcmVmaXhlZFJvb3QgPSB0aGlzLmIuX3ByZWZpeE5vZGVUcmVlKHN1YmZsb3cucm9vdCwgaWQpO1xuXG4gICAgaWYgKCF0aGlzLmIuX3N1YmZsb3dEZWZzLmhhcyhpZCkpIHtcbiAgICAgIHRoaXMuYi5fc3ViZmxvd0RlZnMuc2V0KGlkLCB7IHJvb3Q6IHByZWZpeGVkUm9vdCB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgaWQsXG4gICAgICBicmFuY2hJZDogaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMpIG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBzdWJmbG93U3RydWN0dXJlOiBzdWJmbG93LmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICB9O1xuICAgIC8vIFNUUlVDVFVSRS1PTkxZIGNvbnZlcmdlbmNlIG92ZXJyaWRlIChzZWUgYF9maXJlTmV4dEVkZ2VGcm9tUGFyZW50YCArXG4gICAgLy8gYFN1YmZsb3dNb3VudE9wdGlvbnMuY29udmVyZ2VBdGApOiB0aGlzIGJyYW5jaCdzIGNvbnZlcmdlbmNlIGVkZ2UgcG9pbnRzIGF0XG4gICAgLy8gYGNvbnZlcmdlQXRgIChhIERPV05TVFJFQU0gc3RhZ2UpIGluc3RlYWQgb2YgdGhlIHNoYXJlZCBuZXh0IHN0YWdlIOKAlCBlLmcuIGFcbiAgICAvLyBgdG9vbHNgIHNsb3QgdGhhdCBieXBhc3NlcyBgbWVzc2FnZUFQSWAgdG8gcGFpciB3aXRoIGl0cyBvdXRwdXQgYXRcbiAgICAvLyBgY2FsbC1sbG1gLiBWaXN1YWxpemF0aW9uLW9ubHk6IE5PIHJ1bnRpbWUgam9pbiBiYXJyaWVyIChkYXRhIHJpZGVzIHNjb3BlKS5cbiAgICBpZiAob3B0aW9ucz8uY29udmVyZ2VBdCkgc3BlYy5jb252ZXJnZUF0ID0gb3B0aW9ucy5jb252ZXJnZUF0O1xuXG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuID0gdGhpcy5jdXJOb2RlLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyTm9kZS5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbiA9IHRoaXMuY3VyU3BlYy5jaGlsZHJlbiB8fCBbXTtcbiAgICB0aGlzLmN1clNwZWMuY2hpbGRyZW4ucHVzaChzcGVjKTtcbiAgICAvLyBMNy4zIOKAlCBTdWJmbG93IGFzIHNlbGVjdG9yIGJyYW5jaC5cbiAgICB0aGlzLmIuX2ZpcmVTdGFnZUFkZGVkRnJvbVN1YkJ1aWxkZXIoc3BlYyk7XG4gICAgdGhpcy5iLl9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXIodGhpcy5jdXJTcGVjLmlkLCBzcGVjLmlkLCAnZGVjaXNpb24tYnJhbmNoJywgaWQpO1xuICAgIHRoaXMuYi5fZmlyZVN1YmZsb3dNb3VudGVkRnJvbVN1YkJ1aWxkZXIoaWQsIHN1YmZsb3dOYW1lLCBpZCwgZmFsc2UsIHN1YmZsb3cuYnVpbGRUaW1lU3RydWN0dXJlKTtcblxuICAgIHRoaXMuYi5fbWVyZ2VTdGFnZU1hcChzdWJmbG93LnN0YWdlTWFwLCBpZCk7XG4gICAgdGhpcy5iLl9tZXJnZVN1YmZsb3dzKHN1YmZsb3cuc3ViZmxvd3MsIGlkKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkTGF6eVN1YkZsb3dDaGFydEJyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIHJlc29sdmVyOiAoKSA9PiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG1vdW50TmFtZT86IHN0cmluZyxcbiAgICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9ucyxcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgaWYgKHRoaXMuYnJhbmNoSWRzLmhhcyhpZCkpIGZhaWwoYGR1cGxpY2F0ZSBzZWxlY3RvciBicmFuY2ggaWQgJyR7aWR9JyB1bmRlciAnJHt0aGlzLmN1ck5vZGUubmFtZX0nYCk7XG4gICAgdGhpcy5icmFuY2hJZHMuYWRkKGlkKTtcblxuICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gbW91bnROYW1lIHx8IGlkO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIGlkLFxuICAgICAgYnJhbmNoSWQ6IGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHN1YmZsb3dSZXNvbHZlcjogcmVzb2x2ZXIgYXMgYW55LFxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMpIG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBpc0xhenk6IHRydWUsXG4gICAgfTtcblxuICAgIHRoaXMuY3VyTm9kZS5jaGlsZHJlbiA9IHRoaXMuY3VyTm9kZS5jaGlsZHJlbiB8fCBbXTtcbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICB0aGlzLmN1clNwZWMuY2hpbGRyZW4gPSB0aGlzLmN1clNwZWMuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuLnB1c2goc3BlYyk7XG4gICAgLy8gTDcuMyDigJQgTGF6eSBzdWJmbG93IGFzIHNlbGVjdG9yIGJyYW5jaC5cbiAgICB0aGlzLmIuX2ZpcmVTdGFnZUFkZGVkRnJvbVN1YkJ1aWxkZXIoc3BlYyk7XG4gICAgdGhpcy5iLl9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXIodGhpcy5jdXJTcGVjLmlkLCBzcGVjLmlkLCAnZGVjaXNpb24tYnJhbmNoJywgaWQpO1xuICAgIHRoaXMuYi5fZmlyZVN1YmZsb3dNb3VudGVkRnJvbVN1YkJ1aWxkZXIoaWQsIHN1YmZsb3dOYW1lLCBpZCwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZEJyYW5jaExpc3QoXG4gICAgYnJhbmNoZXM6IEFycmF5PHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBmbj86IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPjtcbiAgICB9PixcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgZm9yIChjb25zdCB7IGlkLCBuYW1lLCBmbiB9IG9mIGJyYW5jaGVzKSB7XG4gICAgICB0aGlzLmFkZEZ1bmN0aW9uQnJhbmNoKGlkLCBuYW1lLCBmbik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZW5kKCk6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW47XG4gICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW0Zsb3dDaGFydEJ1aWxkZXJdIHNlbGVjdG9yIGF0ICcke3RoaXMuY3VyTm9kZS5uYW1lfScgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGJyYW5jaGApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgZXZlcnkgYnJhbmNoIHdpdGggbm8gZW1iZWRkZWQgZm4gaXMgcmVzb2x2YWJsZSBmcm9tIHRoZSBzdGFnZU1hcFxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgIGlmICghY2hpbGQuZm4gJiYgY2hpbGQuaWQgJiYgIWNoaWxkLmlzU3ViZmxvd1Jvb3QgJiYgIWNoaWxkLnN1YmZsb3dSZXNvbHZlcikge1xuICAgICAgICBjb25zdCBoYXNJbk1hcCA9IHRoaXMuYi5fc3RhZ2VNYXBIYXMoY2hpbGQuaWQpIHx8IHRoaXMuYi5fc3RhZ2VNYXBIYXMoY2hpbGQubmFtZSk7XG4gICAgICAgIGlmICghaGFzSW5NYXApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgW0Zsb3dDaGFydEJ1aWxkZXJdIHNlbGVjdG9yIGJyYW5jaCAnJHtjaGlsZC5pZH0nIHVuZGVyICcke3RoaXMuY3VyTm9kZS5uYW1lfScgaGFzIG5vIGZ1bmN0aW9uIOKAlCBgICtcbiAgICAgICAgICAgICAgYHByb3ZpZGUgYSBmbiBhcmd1bWVudCB0byBhZGRGdW5jdGlvbkJyYW5jaCgnJHtjaGlsZC5pZH0nLCAuLi4pYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jdXJOb2RlLnNlbGVjdG9yRm4gPSB0cnVlO1xuXG4gICAgdGhpcy5jdXJTcGVjLmJyYW5jaElkcyA9IGNoaWxkcmVuXG4gICAgICAubWFwKChjKSA9PiBjLmlkKVxuICAgICAgLmZpbHRlcigoaWQpOiBpZCBpcyBzdHJpbmcgPT4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiBpZC5sZW5ndGggPiAwKTtcbiAgICB0aGlzLmN1clNwZWMudHlwZSA9ICdzZWxlY3Rvcic7IC8vIHdhcyAnZGVjaWRlcicg4oCUIGluY29ycmVjdDsgc2VsZWN0b3JzIGFyZSBkaXN0aW5jdCBmcm9tIGRlY2lkZXJzXG4gICAgdGhpcy5jdXJTcGVjLmhhc1NlbGVjdG9yID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLnJlc2VydmVkU3RlcE51bWJlciA+IDApIHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yTGFiZWwgPSB0aGlzLmN1ck5vZGUubmFtZTtcbiAgICAgIGNvbnN0IGJyYW5jaElkTGlzdCA9IHRoaXMuYnJhbmNoRGVzY0luZm8ubWFwKChiKSA9PiBiLmlkKS5qb2luKCcsICcpO1xuICAgICAgY29uc3QgbWFpbkxpbmUgPSB0aGlzLnNlbGVjdG9yRGVzY3JpcHRpb25cbiAgICAgICAgPyBgJHt0aGlzLnJlc2VydmVkU3RlcE51bWJlcn0uICR7c2VsZWN0b3JMYWJlbH0g4oCUICR7dGhpcy5zZWxlY3RvckRlc2NyaXB0aW9ufWBcbiAgICAgICAgOiBgJHt0aGlzLnJlc2VydmVkU3RlcE51bWJlcn0uICR7c2VsZWN0b3JMYWJlbH0g4oCUIFNlbGVjdHMgZnJvbTogJHticmFuY2hJZExpc3R9YDtcbiAgICAgIHRoaXMucGFyZW50RGVzY3JpcHRpb25QYXJ0cy5wdXNoKG1haW5MaW5lKTtcblxuICAgICAgaWYgKHRoaXMuc2VsZWN0b3JEZXNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLnBhcmVudFN0YWdlRGVzY3JpcHRpb25zLnNldCh0aGlzLmN1ck5vZGUubmFtZSwgdGhpcy5zZWxlY3RvckRlc2NyaXB0aW9uKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBicmFuY2ggb2YgdGhpcy5icmFuY2hEZXNjSW5mbykge1xuICAgICAgICBjb25zdCBicmFuY2hUZXh0ID0gYnJhbmNoLmRlc2NyaXB0aW9uO1xuICAgICAgICBpZiAoYnJhbmNoVGV4dCkgdGhpcy5wYXJlbnREZXNjcmlwdGlvblBhcnRzLnB1c2goYCAgIOKGkiAke2JyYW5jaC5pZH06ICR7YnJhbmNoVGV4dH1gKTtcbiAgICAgICAgaWYgKGJyYW5jaC5kZXNjcmlwdGlvbikgdGhpcy5wYXJlbnRTdGFnZURlc2NyaXB0aW9ucy5zZXQoYnJhbmNoLmlkLCBicmFuY2guZGVzY3JpcHRpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEw3LjMg4oCUIGZpcmUgYG9uRGVjaWRlckNvbXBsZXRlYCB3aXRoIHR5cGU9J3NlbGVjdG9yJy4gU2VsZWN0b3JzXG4gICAgLy8gaGF2ZSBubyBkZWZhdWx0IGJyYW5jaCAobXVsdGktc2VsZWN0IHNlbWFudGljcyBkaWZmZXIpOyBwYXNzXG4gICAgLy8gdW5kZWZpbmVkLlxuICAgIHRoaXMuYi5fZmlyZURlY2lkZXJDb21wbGV0ZUZyb21TdWJCdWlsZGVyKHRoaXMuY3VyU3BlYy5pZCwgJ3NlbGVjdG9yJywgWy4uLnRoaXMuYnJhbmNoSWRzXSk7XG4gICAgcmV0dXJuIHRoaXMuYjtcbiAgfVxufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEZsb3dDaGFydEJ1aWxkZXJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgY2xhc3MgRmxvd0NoYXJ0QnVpbGRlcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSBfcm9vdD86IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIF9yb290U3BlYz86IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgcHJpdmF0ZSBfY3Vyc29yPzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgX2N1cnNvclNwZWM/OiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmU7XG4gIHByaXZhdGUgX3N0YWdlTWFwID0gbmV3IE1hcDxzdHJpbmcsIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPj4oKTtcbiAgX3N1YmZsb3dEZWZzID0gbmV3IE1hcDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfT4oKTtcbiAgcHJpdmF0ZSBfc3RyZWFtSGFuZGxlcnM6IFN0cmVhbUhhbmRsZXJzID0ge307XG4gIC8qKlxuICAgKiBMNy4zIOKAlCBCdWlsZC10aW1lIG9ic2VydmVyIGZhbi1vdXQuIE93bmVkIGJ5IHRoZSBidWlsZGVyIHNvIGV2ZXJ5XG4gICAqIGBhZGRYKClgIG1ldGhvZCBjYW4gZmlyZSBgU3RydWN0dXJlUmVjb3JkZXJgIGV2ZW50cyBhdCB0aGUgbmF0dXJhbFxuICAgKiBtb21lbnQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgbXV0YXRpb24uIERpc3BhdGNoZXIgaXMgYWxsb2NhdGVkXG4gICAqIGxhemlseSBvbiBmaXJzdCBhdHRhY2ggdG8ga2VlcCB0aGUgemVyby1yZWNvcmRlciBwYXRoIGFsbG9jYXRpb24tXG4gICAqIGZyZWUuXG4gICAqL1xuICBwcml2YXRlIF9zdHJ1Y3R1cmVEaXNwYXRjaGVyPzogU3RydWN0dXJlUmVjb3JkZXJEaXNwYXRjaGVyO1xuICAvKipcbiAgICogTDcuMyDigJQgU2VhbGVkLWFmdGVyLWJ1aWxkIGZsYWcgKFBhbmVsIDIgcGhhc2UgaW52YXJpYW50KS4gRmxpcHNcbiAgICogdG8gYHRydWVgIHdoZW4gYC5idWlsZCgpYCByZXR1cm5zOyBzdWJzZXF1ZW50IGBhdHRhY2hTdHJ1Y3R1cmVSZWNvcmRlcmBcbiAgICogdGhyb3dzLiBQcmV2ZW50cyB0aGUgZm9vdGd1biB3aGVyZSBhIGNvbnN1bWVyIGF0dGFjaGVzIGEgcmVjb3JkZXJcbiAgICogbWlkLWV4ZWN1dGlvbiBhbmQgZ2V0cyBwYXJ0aWFsIHN0cnVjdHVyZSBkYXRhIChtaXNzZWQgZXZlcnkgZXZlbnRcbiAgICogYWxyZWFkeSBmaXJlZCBkdXJpbmcgY29uc3RydWN0aW9uKS5cbiAgICovXG4gIHByaXZhdGUgX3NlYWxlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9lbmFibGVOYXJyYXRpdmUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbG9nZ2VyPzogSUxvZ2dlcjtcbiAgcHJpdmF0ZSBfZGVzY3JpcHRpb25QYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBfc3RlcENvdW50ZXIgPSAwO1xuICAvLyBOT1RFOiBrZXllZCBieSBzdGFnZSBuYW1lIChmb3IgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb25zKSwgd2hpbGUgc3RhZ2VNYXBcbiAgLy8gYW5kIGtub3duU3RhZ2VJZHMgdXNlIGlkIChzdGFibGUgaWRlbnRpZmllcikuIFRoZXNlIGFyZSBpbnRlbnRpb25hbGx5IGRpZmZlcmVudFxuICAvLyBuYW1lc3BhY2VzIOKAlCBkZXNjcmlwdGlvbnMgYXJlIHByZXNlbnRhdGlvbmFsLCBsb29rdXBzIGFyZSBzdHJ1Y3R1cmFsLlxuICBwcml2YXRlIF9zdGFnZURlc2NyaXB0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIHByaXZhdGUgX3N0YWdlU3RlcE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIHByaXZhdGUgX2tub3duU3RhZ2VJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBfaW5wdXRTY2hlbWE/OiB1bmtub3duO1xuICBwcml2YXRlIF9vdXRwdXRTY2hlbWE/OiB1bmtub3duO1xuICBwcml2YXRlIF9vdXRwdXRNYXBwZXI/OiAoZmluYWxTY29wZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHVua25vd247XG4gIHByaXZhdGUgX3Njb3BlRmFjdG9yeT86IFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuXG4gIC8vIOKUgOKUgCBMNy4zIOKAlCBTdHJ1Y3R1cmVSZWNvcmRlciBhdHRhY2ggKyBkaXNwYXRjaCBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBgU3RydWN0dXJlUmVjb3JkZXJgIGZvciBidWlsZC1waGFzZSBvYnNlcnZhdGlvbi4gTXVsdGlwbGVcbiAgICogcmVjb3JkZXJzIGNvZXhpc3QgKHNhbWUgaWQgYWxsb3dlZDsgaXRlcmF0aW9uIG9yZGVyID0gYXR0YWNoXG4gICAqIG9yZGVyKS4gVGhyb3dzIGlmIGNhbGxlZCBhZnRlciBgLmJ1aWxkKClgIOKAlCB0aGUgY2hhcnQgaXMgc2VhbGVkIGF0XG4gICAqIHRoYXQgcG9pbnQgYW5kIGFueSByZWNvcmRlciBhdHRhY2hlZCBsYXRlIHdvdWxkIG1pc3MgZXZlcnkgZXZlbnRcbiAgICogZmlyZWQgZHVyaW5nIGNvbnN0cnVjdGlvbi5cbiAgICpcbiAgICogKipTZWVkIHJlcGxheSoqOiB3aGVuIHRoaXMgaXMgY2FsbGVkIEFGVEVSIGBzdGFydCgpYCBoYXMgYWxyZWFkeVxuICAgKiBmaXJlZCAoaS5lLiwgYWZ0ZXIgdGhlIGBmbG93Q2hhcnQoKWAgZmFjdG9yeSByZXR1cm5zKSwgdGhlXG4gICAqIGp1c3QtYXR0YWNoZWQgcmVjb3JkZXIgcmVjZWl2ZXMgYSBvbmUtdGltZSBgb25TdGFnZUFkZGVkYCBmb3IgdGhlXG4gICAqIHJvb3Qgc3RhZ2Ugc28gaXQgb2JzZXJ2ZXMgdGhlIHNlZWQuIE9ubHkgdGhlIG5ldyByZWNvcmRlciBzZWVzXG4gICAqIHRoZSByZXBsYXk7IGFscmVhZHktYXR0YWNoZWQgcmVjb3JkZXJzIGFyZSBub3QgcmUtZmlyZWQuXG4gICAqXG4gICAqICoqTWlkLWNoYWluIGF0dGFjaCBjYXZlYXQqKjogYSByZWNvcmRlciBhdHRhY2hlZCBBRlRFUiBvbmUgb3IgbW9yZVxuICAgKiBgYWRkWCgpYCBjYWxscyByZWNlaXZlcyB0aGUgc2VlZCByZXBsYXkgYnV0IE1JU1NFUyBldmVyeVxuICAgKiBpbnRlcm1lZGlhdGUgZXZlbnQuIEF0dGFjaCBCRUZPUkUgdGhlIGZpcnN0IGBhZGRYKClgIGZvciBjb21wbGV0ZVxuICAgKiBjYXB0dXJlLlxuICAgKlxuICAgKiBQdWJsaWMgZm9yIG5vdyB0byBlbmFibGUgZGlyZWN0IGF0dGFjaCBpbiB0ZXN0cyArIGVhcmx5IGNvbnN1bWVycy5cbiAgICogTDcuNCB3aWxsIHdpcmUgYGZsb3dDaGFydCguLi4sIHsgc3RydWN0dXJlUmVjb3JkZXJzOiBbLi4uXSB9KWAgYXNcbiAgICogYW4gYWRkaXRpb25hbCByZWdpc3RyYXRpb24gc2l0ZTsgdGhpcyBtZXRob2Qgd2lsbCByZW1haW4uXG4gICAqL1xuICBhdHRhY2hTdHJ1Y3R1cmVSZWNvcmRlcihyZWNvcmRlcjogU3RydWN0dXJlUmVjb3JkZXIpOiB0aGlzIHtcbiAgICBpZiAodGhpcy5fc2VhbGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBbRmxvd0NoYXJ0QnVpbGRlcl0gYXR0YWNoU3RydWN0dXJlUmVjb3JkZXIoJyR7cmVjb3JkZXIuaWR9JykgY2FsbGVkIGFmdGVyIC5idWlsZCgpIOKAlCBjaGFydCBpcyBzZWFsZWQ7IGAgK1xuICAgICAgICAgICd0aGUgcmVjb3JkZXIgd291bGQgbWlzcyBldmVyeSBzdHJ1Y3R1cmUgZXZlbnQgZnJvbSBjb25zdHJ1Y3Rpb24uIEF0dGFjaCBCRUZPUkUgLmJ1aWxkKCkuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikge1xuICAgICAgdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlciA9IG5ldyBTdHJ1Y3R1cmVSZWNvcmRlckRpc3BhdGNoZXIoKTtcbiAgICB9XG4gICAgdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlci5hdHRhY2gocmVjb3JkZXIpO1xuICAgIC8vIFRoZSBzZWVkIGZpcmVzIGluc2lkZSBgc3RhcnQoKWAg4oCUIHRoYXQgcnVucyBCRUZPUkUgdGhlIGNvbnN1bWVyXG4gICAgLy8gY2FuIHBvc3QtY29uc3RydWN0IGF0dGFjaC4gUmVwbGF5IHRoZSBzZWVkIGV2ZW50IE9OTFkgaW50byB0aGVcbiAgICAvLyBqdXN0LWF0dGFjaGVkIHJlY29yZGVyIHNvIG90aGVyIGFscmVhZHktYXR0YWNoZWQgcmVjb3JkZXJzIGRvbid0XG4gICAgLy8gc2VlIGEgZHVwbGljYXRlLiBFcnJvcnMgYXJlIHJvdXRlZCB0aHJvdWdoIHRoZSBkaXNwYXRjaGVyJ3NcbiAgICAvLyBhY2N1bXVsYXRvciBzbyB0aGUgY29udHJhY3Qgc3RheXMgdW5pZm9ybS5cbiAgICBpZiAodGhpcy5fcm9vdFNwZWMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlY29yZGVyLm9uU3RhZ2VBZGRlZD8uKHtcbiAgICAgICAgICBzdGFnZUlkOiB0aGlzLl9yb290U3BlYy5pZCxcbiAgICAgICAgICBuYW1lOiB0aGlzLl9yb290U3BlYy5uYW1lLFxuICAgICAgICAgIHR5cGU6IHRoaXMuX3Jvb3RTcGVjLnR5cGUgPz8gJ3N0YWdlJyxcbiAgICAgICAgICAuLi4odGhpcy5fcm9vdFNwZWMuaXNQYXVzYWJsZSA9PT0gdHJ1ZSAmJiB7IGlzUGF1c2FibGU6IHRydWUgfSksXG4gICAgICAgICAgc3BlYzogdGhpcy5fcm9vdFNwZWMgYXMgdW5rbm93biBhcyBGbG93Q2hhcnRTcGVjLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyLnJlY29yZEVycm9yRm9yUmVwbGF5KHJlY29yZGVyLmlkLCAnb25TdGFnZUFkZGVkJywgZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSW5zcGVjdCBhY2N1bXVsYXRlZCBgU3RydWN0dXJlQnVpbGRFcnJvcmBzLiBSZXR1cm5zIGVtcHR5IGFycmF5XG4gICAqIHdoZW4gbm8gcmVjb3JkZXJzIGF0dGFjaGVkIE9SIG5vIGVycm9ycyBvY2N1cnJlZC4gUmV0dXJucyBhXG4gICAqIGRlZmVuc2l2ZSBjb3B5IOKAlCBjYWxsZXIgbXV0YXRpb25zIGRvIG5vdCBhZmZlY3Qgc3Vic2VxdWVudCBjYWxscy5cbiAgICpcbiAgICogKipDYWxsIG9uIHRoZSBCVUlMREVSLCBub3QgdGhlIGNoYXJ0IHJldHVybmVkIGJ5IGAuYnVpbGQoKWAuKipcbiAgICogQ2FwdHVyZSB0aGUgYnVpbGRlciByZWZlcmVuY2UgYmVmb3JlIGAuYnVpbGQoKWAgaWYgeW91IG5lZWRcbiAgICogcG9zdC1idWlsZCBhY2Nlc3M6XG4gICAqIGBgYHRzXG4gICAqIGNvbnN0IGJ1aWxkZXIgPSBmbG93Q2hhcnQoLi4uKS5hdHRhY2hTdHJ1Y3R1cmVSZWNvcmRlcihyZWMpO1xuICAgKiBjb25zdCBjaGFydCA9IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICogY29uc3QgZXJyb3JzID0gYnVpbGRlci5nZXRTdHJ1Y3R1cmVCdWlsZEVycm9ycygpO1xuICAgKiBgYGBcbiAgICovXG4gIGdldFN0cnVjdHVyZUJ1aWxkRXJyb3JzKCk6IFJldHVyblR5cGU8U3RydWN0dXJlUmVjb3JkZXJEaXNwYXRjaGVyWydnZXRFcnJvcnMnXT4ge1xuICAgIHJldHVybiB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyPy5nZXRFcnJvcnMoKSA/PyBbXTtcbiAgfVxuXG4gIC8vIENvbnZlbmllbmNlIGZpcmUgaGVscGVycyDigJQgbm8tb3Agd2hlbiBubyBkaXNwYXRjaGVyIGF0dGFjaGVkLiBLZWVwc1xuICAvLyBldmVyeSBjYWxsIHNpdGUgYSBvbmUtbGluZXIgd2l0aG91dCB0aGUgYGlmICh0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyKWBcbiAgLy8gYm9pbGVycGxhdGUgZXZlcnl3aGVyZS5cbiAgcHJpdmF0ZSBfZmlyZVN0YWdlQWRkZWQoc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyKSByZXR1cm47XG4gICAgLy8gUmVhZCBgaXNQYXVzYWJsZWAgZGlyZWN0bHkgZnJvbSB0aGUgc3BlYyDigJQgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aC5cbiAgICAvLyBUaGUgcHJldmlvdXMgYGV4dHJhc2AgYXJndW1lbnQgd2FzIGEgc3ViLWJ1aWxkZXIgZm9vdGd1bjogYnJhbmNoXG4gICAgLy8gaGVscGVycyBpbiBEZWNpZGVyTGlzdC9TZWxlY3RvckZuTGlzdCB3ZW50IHRocm91Z2hcbiAgICAvLyBgX2ZpcmVTdGFnZUFkZGVkRnJvbVN1YkJ1aWxkZXJgIHdoaWNoIGRyb3BwZWQgdGhlIGV4dHJhcywgc2lsZW50bHlcbiAgICAvLyBsb3NpbmcgYGlzUGF1c2FibGU6IHRydWVgIG9uIHBhdXNhYmxlIGRlY2lkZXIvc2VsZWN0b3IgYnJhbmNoZXMuXG4gICAgY29uc3QgaXNQYXVzYWJsZSA9IHNwZWMuaXNQYXVzYWJsZSA9PT0gdHJ1ZTtcbiAgICB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyLmZpcmVTdGFnZUFkZGVkKHtcbiAgICAgIHN0YWdlSWQ6IHNwZWMuaWQsXG4gICAgICBuYW1lOiBzcGVjLm5hbWUsXG4gICAgICB0eXBlOiBzcGVjLnR5cGUgPz8gJ3N0YWdlJyxcbiAgICAgIC4uLihpc1BhdXNhYmxlICYmIHsgaXNQYXVzYWJsZTogdHJ1ZSB9KSxcbiAgICAgIHNwZWM6IHNwZWMgYXMgdW5rbm93biBhcyBGbG93Q2hhcnRTcGVjLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZUVkZ2VBZGRlZChmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGtpbmQ6IFN0cnVjdHVyZUVkZ2VLaW5kLCBsYWJlbD86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikgcmV0dXJuO1xuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuZmlyZUVkZ2VBZGRlZCh7XG4gICAgICBmcm9tLFxuICAgICAgdG8sXG4gICAgICBraW5kLFxuICAgICAgLi4uKGxhYmVsICE9PSB1bmRlZmluZWQgJiYgeyBsYWJlbCB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpcmVMb29wRWRnZUFkZGVkKGZyb206IHN0cmluZywgdG86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikgcmV0dXJuO1xuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuZmlyZUxvb3BFZGdlQWRkZWQoeyBmcm9tLCB0byB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlIHRoZSBgbmV4dGAgZWRnZShzKSBmcm9tIGEgcGFyZW50IHNwZWMgdG8gYSBmcmVzaGx5LWFkZGVkXG4gICAqIG5vZGUg4oCUIHdpdGggY29udmVyZ2VuY2UgZXhwYW5zaW9uIHdoZW4gdGhlIHBhcmVudCBpcyBhXG4gICAqIGZvcmsgLyBkZWNpZGVyIC8gc2VsZWN0b3Igd2l0aCBicmFuY2hlcy5cbiAgICpcbiAgICogQSBmb3JrIGF0IGBwYXJlbnRgIGlzIHNlbWFudGljYWxseSBgcGFyZW50IOKUgOKUgGZvcmstYnJhbmNo4pSA4pSA4pa6IGNoaWxkW2ldYFxuICAgKiBmb3IgZWFjaCBjaGlsZCwgYW5kIHRoZSBjaGFpbmVkIGAuYWRkRnVuY3Rpb24oWClgIGNvbnRpbnVlc1xuICAgKiBBRlRFUiB0aGUgZm9yayBjb252ZXJnZXMuIFRoZSBydW50aW1lIHNlbWFudGljcyBhcmUgdGhhdCBlYWNoXG4gICAqIGNoaWxkIElOREVQRU5ERU5UTFkgZmVlZHMgYFhgIChwYXJhbGxlbCBjb21wbGV0aW9uIOKGkiBqb2luKS4gVGhlXG4gICAqIGxpdGVyYWwgXCJlZGdlIGZyb20gcGFyZW50IHRvIFhcIiB3b3VsZCBtaXNyZXByZXNlbnQgdGhpcyDigJRcbiAgICogdmlzdWFsaXplcnMgYW5kIHRvcG9sb2dpY2FsIGFsZ29yaXRobXMgd291bGQgc2VlIG9uZSBlZGdlIHdoZXJlXG4gICAqIHRoZXJlIHNob3VsZCBiZSBOIGNvbnZlcmdlbmNlIGVkZ2VzLlxuICAgKlxuICAgKiBGaXg6IHdoZW4gYHBhcmVudFNwZWNgIGhhcyBicmFuY2ggY2hpbGRyZW4gKGZvcmsgb3IgYnJhbmNoZWRcbiAgICogZGVjaWRlci9zZWxlY3RvciksIGZpcmUgb25lIGBuZXh0YCBlZGdlIGZyb20gRUFDSCBjaGlsZCB0byB0aGVcbiAgICogdGFyZ2V0LiBPdGhlcndpc2UgZmlyZSB0aGUgc2luZ2xlIGVkZ2UgZnJvbSBgcGFyZW50U3BlY2AgaXRzZWxmLlxuICAgKlxuICAgKiBMb29wLXJlZmVyZW5jZSBjaGlsZHJlbiAoc3ludGhldGljIHNwZWMgbm9kZXMgY3JlYXRlZCBieVxuICAgKiBgLmxvb3BUbygpYCkgYXJlIGV4Y2x1ZGVkIOKAlCB0aGV5J3JlIGJhY2stZWRnZSBtYXJrZXJzLCBub3RcbiAgICogY29udmVyZ2VuY2Ugc291cmNlcy4gQSBicmFuY2ggdGhhdCBjYXJyaWVzIGFuIE9XTiBsb29wLWJhY2sgYG5leHRgXG4gICAqIChhIGJyYW5jaC1zb3VyY2VkIGBsb29wVG9gKSBpcyBsaWtld2lzZSBza2lwcGVkIOKAlCBpdCBsb29wcywgaXQgZG9lc1xuICAgKiBub3QgY29udmVyZ2UgYXQgdGhlIGxpbmVhciBuZXh0IHN0YWdlLlxuICAgKlxuICAgKiBBIGJyYW5jaCBjYXJyeWluZyBgY29udmVyZ2VBdGAgaXMgUkVESVJFQ1RFRDogaXRzIHNpbmdsZSBjb252ZXJnZW5jZVxuICAgKiBlZGdlIGZpcmVzIHRvIGl0cyBuYW1lZCB0YXJnZXQgaW5zdGVhZCBvZiBgdGFyZ2V0SWRgIOKAlCBleHByZXNzaW5nIGFuXG4gICAqIHVuZXF1YWwtZGVwdGggbWVyZ2UgKGUuZy4gYHRvb2xzIOKGkiBjYWxsLWxsbWAsIGJ5cGFzc2luZyBgbWVzc2FnZS1hcGlgKS5cbiAgICogVGhlIG5hbWVkIHRhcmdldCBpcyBhIGZvcndhcmQgc3RhZ2UsIHNvIGl0IGlzIE5PVCB2YWxpZGF0ZWQgaGVyZS5cbiAgICpcbiAgICogQ2FsbCBPUkRFUiBjb25zdHJhaW50OiBtdXN0IGJlIGNhbGxlZCBCRUZPUkUgdGhlIGN1cnNvciBhZHZhbmNlc1xuICAgKiB0byB0aGUgbmV3IHRhcmdldC4gVGhlIGNhbGxlciBwYXNzZXMgdGhlIFBSRS1BRFZBTkNFIHBhcmVudCBzcGVjLlxuICAgKi9cbiAgcHJpdmF0ZSBfZmlyZU5leHRFZGdlRnJvbVBhcmVudChwYXJlbnRTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsIHRhcmdldElkOiBzdHJpbmcsIGxhYmVsPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyKSByZXR1cm47XG4gICAgY29uc3QgY2hpbGRTcGVjcyA9IHBhcmVudFNwZWMuY2hpbGRyZW47XG4gICAgY29uc3QgaXNCcmFuY2hpbmdQYXJlbnQgPVxuICAgICAgKHBhcmVudFNwZWMudHlwZSA9PT0gJ2ZvcmsnIHx8IHBhcmVudFNwZWMudHlwZSA9PT0gJ2RlY2lkZXInIHx8IHBhcmVudFNwZWMudHlwZSA9PT0gJ3NlbGVjdG9yJykgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkoY2hpbGRTcGVjcykgJiZcbiAgICAgIGNoaWxkU3BlY3MubGVuZ3RoID4gMDtcbiAgICBpZiAoIWlzQnJhbmNoaW5nUGFyZW50KSB7XG4gICAgICB0aGlzLl9maXJlRWRnZUFkZGVkKHBhcmVudFNwZWMuaWQsIHRhcmdldElkLCAnbmV4dCcsIGxhYmVsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZFNwZWNzISkge1xuICAgICAgaWYgKGNoaWxkLmlzTG9vcFJlZmVyZW5jZSkgY29udGludWU7XG4gICAgICAvLyBBIGJyYW5jaCB3aXRoIGl0cyBvd24gbG9vcC1iYWNrIG5leHQgKGJyYW5jaC1zb3VyY2VkIGxvb3BUbykgbG9vcHMg4oCUXG4gICAgICAvLyBpdCBkb2VzIG5vdCBjb252ZXJnZSBhdCB0aGUgbGluZWFyIG5leHQgc3RhZ2UuXG4gICAgICBpZiAoY2hpbGQubmV4dD8uaXNMb29wUmVmZXJlbmNlKSBjb250aW51ZTtcbiAgICAgIGlmIChjaGlsZC5jb252ZXJnZUF0KSB7XG4gICAgICAgIC8vIFJlZGlyZWN0ZWQgY29udmVyZ2VuY2U6IHRoaXMgYnJhbmNoIHJlam9pbnMgYXQgaXRzIG5hbWVkIHRhcmdldC5cbiAgICAgICAgdGhpcy5fZmlyZUVkZ2VBZGRlZChjaGlsZC5pZCwgY2hpbGQuY29udmVyZ2VBdCwgJ25leHQnKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aGlzLl9maXJlRWRnZUFkZGVkKGNoaWxkLmlkLCB0YXJnZXRJZCwgJ25leHQnLCBsYWJlbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZURlY2lkZXJDb21wbGV0ZShcbiAgICBkZWNpZGVyOiBzdHJpbmcsXG4gICAgdHlwZTogJ2RlY2lkZXInIHwgJ3NlbGVjdG9yJyxcbiAgICBicmFuY2hJZHM6IHN0cmluZ1tdLFxuICAgIGRlZmF1bHRCcmFuY2g/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikgcmV0dXJuO1xuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuZmlyZURlY2lkZXJDb21wbGV0ZSh7XG4gICAgICBkZWNpZGVyLFxuICAgICAgdHlwZSxcbiAgICAgIGJyYW5jaElkcyxcbiAgICAgIC4uLihkZWZhdWx0QnJhbmNoICE9PSB1bmRlZmluZWQgJiYgeyBkZWZhdWx0QnJhbmNoIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZVN1YmZsb3dNb3VudGVkKFxuICAgIHN1YmZsb3dJZDogc3RyaW5nLFxuICAgIHN1YmZsb3dOYW1lOiBzdHJpbmcsXG4gICAgcm9vdFN0YWdlSWQ6IHN0cmluZyxcbiAgICBpc0xhenk/OiBib29sZWFuLFxuICAgIHN1YmZsb3dTcGVjPzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICAgIHN1YmZsb3dQYXRoPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIpIHJldHVybjtcbiAgICAvLyBzdWJmbG93UGF0aCBkZWZhdWx0cyB0byBzdWJmbG93SWQgd2hlbiB0aGUgcmVjb3JkZXIgaXMgYXR0YWNoZWRcbiAgICAvLyB0byB0aGUgaW1tZWRpYXRlIHBhcmVudCAodG9wLWxldmVsIG1vdW50KTsgY29tcG9zZWQgcGF0aHMgYXBwbHlcbiAgICAvLyBvbmx5IHdoZW4gdGhpcyBidWlsZGVyIGlzIGl0c2VsZiBhIG5lc3RlZCBzdWJmbG93IGJlaW5nXG4gICAgLy8gb2JzZXJ2ZWQgYnkgdGhlIGdyYW5kcGFyZW50J3MgcmVjb3JkZXIuXG4gICAgY29uc3QgcGF0aCA9IHN1YmZsb3dQYXRoID8/IHN1YmZsb3dJZDtcbiAgICB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyLmZpcmVTdWJmbG93TW91bnRlZCh7XG4gICAgICBzdWJmbG93SWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHJvb3RTdGFnZUlkLFxuICAgICAgLi4uKGlzTGF6eSA9PT0gdHJ1ZSAmJiB7IGlzTGF6eSB9KSxcbiAgICAgIC4uLihzdWJmbG93U3BlYyAhPT0gdW5kZWZpbmVkICYmIHsgc3ViZmxvd1NwZWMgfSksXG4gICAgICBzdWJmbG93UGF0aDogcGF0aCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTdWItYnVpbGRlciBhY2Nlc3MgKGAuYi5fZmlyZVh4eGApIGlzIG5lZWRlZCBieSBEZWNpZGVyTGlzdCAvXG4gICAqICBTZWxlY3RvckZuTGlzdDsgZXhwb3NlIHRoZSBkaXNwYXRjaGVyIHRocm91Z2ggaW50ZXJuYWwgaGVscGVyc1xuICAgKiAgdGhhdCBnbyB0aHJvdWdoIHRoZSBzYW1lIG5vLW9wLXdoZW4tYWJzZW50IGd1YXJkLlxuICAgKlxuICAgKiAgQGludGVybmFsIOKAlCB0aGVzZSBtZXRob2RzIGFyZSBleHBvc2VkIGJlY2F1c2UgVHlwZVNjcmlwdCBgcHJpdmF0ZWBcbiAgICogIGRvZXNuJ3QgdHJhdmVyc2UgY2xhc3MgYm91bmRhcmllcy4gQ29uc3VtZXIgY29kZSBNVVNUIE5PVCBjYWxsXG4gICAqICB0aGVtOyBjYWxsaW5nIHRoZW0gcG9zdC1jb25zdHJ1Y3Rpb24gbGV0cyBhIGhvc3RpbGUgY2FsbGVyXG4gICAqICBmYWJyaWNhdGUgc3RydWN0dXJlIGV2ZW50cyBhbmQgY29ycnVwdCBkb3duc3RyZWFtIHZpc3VhbGl6YXRpb25zXG4gICAqICBvciBhdWRpdCB0cmFpbHMuIFRoZSBgX2AgcHJlZml4IGlzIGludGVudGlvbmFsIGNvbnZlbnRpb24uICovXG4gIF9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXIoZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBraW5kOiBTdHJ1Y3R1cmVFZGdlS2luZCwgbGFiZWw/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9maXJlRWRnZUFkZGVkKGZyb20sIHRvLCBraW5kLCBsYWJlbCk7XG4gIH1cblxuICAvKiogQGludGVybmFsIOKAlCBzZWUgYF9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXJgLiAqL1xuICBfZmlyZVN0YWdlQWRkZWRGcm9tU3ViQnVpbGRlcihzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUpOiB2b2lkIHtcbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwg4oCUIHNlZSBgX2ZpcmVFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcmAuICovXG4gIF9maXJlRGVjaWRlckNvbXBsZXRlRnJvbVN1YkJ1aWxkZXIoXG4gICAgZGVjaWRlcjogc3RyaW5nLFxuICAgIHR5cGU6ICdkZWNpZGVyJyB8ICdzZWxlY3RvcicsXG4gICAgYnJhbmNoSWRzOiBzdHJpbmdbXSxcbiAgICBkZWZhdWx0QnJhbmNoPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9maXJlRGVjaWRlckNvbXBsZXRlKGRlY2lkZXIsIHR5cGUsIGJyYW5jaElkcywgZGVmYXVsdEJyYW5jaCk7XG4gIH1cblxuICAvKiogQGludGVybmFsIOKAlCBzZWUgYF9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXJgLiAqL1xuICBfZmlyZVN1YmZsb3dNb3VudGVkRnJvbVN1YkJ1aWxkZXIoXG4gICAgc3ViZmxvd0lkOiBzdHJpbmcsXG4gICAgc3ViZmxvd05hbWU6IHN0cmluZyxcbiAgICByb290U3RhZ2VJZDogc3RyaW5nLFxuICAgIGlzTGF6eT86IGJvb2xlYW4sXG4gICAgc3ViZmxvd1NwZWM/OiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gICAgc3ViZmxvd1BhdGg/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuX2ZpcmVTdWJmbG93TW91bnRlZChzdWJmbG93SWQsIHN1YmZsb3dOYW1lLCByb290U3RhZ2VJZCwgaXNMYXp5LCBzdWJmbG93U3BlYywgc3ViZmxvd1BhdGgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCDigJQgc2VlIGBfZmlyZUVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyYC4gVXNlZCBieSBgRGVjaWRlckxpc3QubG9vcFRvYFxuICAgKiAgdG8gdmFsaWRhdGUgYSBicmFuY2gtc291cmNlZCBsb29wIHRhcmdldCBhZ2FpbnN0IHRoZSBrbm93biBzdGFnZSBpZHNcbiAgICogIChtaXJyb3JzIGBGbG93Q2hhcnRCdWlsZGVyLmxvb3BUb2AncyBgX2tub3duU3RhZ2VJZHMuaGFzYCBndWFyZCkuICovXG4gIF9rbm93blN0YWdlSWRzSGFzKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fa25vd25TdGFnZUlkcy5oYXMoaWQpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCDigJQgc2VlIGBfZmlyZUVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyYC4gVXNlZCBieSBgRGVjaWRlckxpc3QubG9vcFRvYFxuICAgKiAgdG8gZmlyZSBhIGxvb3AgYmFjay1lZGdlIFNPVVJDRUQgRlJPTSBBIEJSQU5DSCBub2RlIChub3QgdGhlIGRlY2lkZXIpLiAqL1xuICBfZmlyZUxvb3BFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcihmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9maXJlTG9vcEVkZ2VBZGRlZChmcm9tLCB0byk7XG4gIH1cblxuICAvLyDilIDilIAgRGVzY3JpcHRpb24gaGVscGVycyDilIDilIBcblxuICBwcml2YXRlIF9hcHBlbmREZXNjcmlwdGlvbkxpbmUobmFtZTogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChuYW1lLCB0aGlzLl9zdGVwQ291bnRlcik7XG4gICAgY29uc3QgbGluZSA9IGRlc2NyaXB0aW9uID8gYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiAke25hbWV9IOKAlCAke2Rlc2NyaXB0aW9ufWAgOiBgJHt0aGlzLl9zdGVwQ291bnRlcn0uICR7bmFtZX1gO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChsaW5lKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX3N0YWdlRGVzY3JpcHRpb25zLnNldChuYW1lLCBkZXNjcmlwdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXBwZW5kU3ViZmxvd0Rlc2NyaXB0aW9uKGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgc3ViZmxvdzogRmxvd0NoYXJ0PGFueSwgYW55Pik6IHZvaWQge1xuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChpZCwgdGhpcy5fc3RlcENvdW50ZXIpO1xuICAgIGlmIChzdWJmbG93LmRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCBsaW5lcyA9IHN1YmZsb3cuZGVzY3JpcHRpb24uc3BsaXQoJ1xcbicpO1xuICAgICAgY29uc3Qgc3RlcHNJZHggPSBsaW5lcy5maW5kSW5kZXgoKGwpID0+IGwuc3RhcnRzV2l0aCgnU3RlcHM6JykpO1xuICAgICAgaWYgKHN0ZXBzSWR4ID49IDApIHtcbiAgICAgICAgLy8gQnVpbGRlci1jb21wb3NlZCBkZXNjcmlwdGlvbiAoYEZsb3dDaGFydDogWFxcblN0ZXBzOlxcbi4uLmApLlxuICAgICAgICAvLyBJbmxpbmUgT05MWSB0aGUgc3VtbWFyeSBhYm92ZSBgU3RlcHM6YCBvbiB0aGUgbW91bnQgbGluZSwgdGhlblxuICAgICAgICAvLyByZS1saXN0IHRoZSBzdGVwIGxpbmVzIG9uY2UsIGluZGVudGVkLiBFbWJlZGRpbmcgdGhlIEZVTEwgaW5uZXJcbiAgICAgICAgLy8gZGVzY3JpcHRpb24gaGVyZSBBTkQgcmUtbGlzdGluZyBpdHMgc3RlcHMgZG91YmxlZCB0aGUgdGV4dCBwZXJcbiAgICAgICAgLy8gbmVzdGluZyBsZXZlbCDigJQgZXhwb25lbnRpYWwgZ3Jvd3RoLCBSYW5nZUVycm9yIChcIkludmFsaWQgc3RyaW5nXG4gICAgICAgIC8vIGxlbmd0aFwiKSBhdCB+MjIgbmVzdGluZyBsZXZlbHMgb2YgbmVzdGVkIGJ1aWxkKCkuXG4gICAgICAgIGNvbnN0IHN1bW1hcnkgPSBsaW5lcy5zbGljZSgwLCBzdGVwc0lkeCkuam9pbignICcpLnRyaW0oKTtcbiAgICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKFxuICAgICAgICAgIHN1bW1hcnlcbiAgICAgICAgICAgID8gYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiBbU3ViLUV4ZWN1dGlvbjogJHtuYW1lfV0g4oCUICR7c3VtbWFyeX1gXG4gICAgICAgICAgICA6IGAke3RoaXMuX3N0ZXBDb3VudGVyfS4gW1N1Yi1FeGVjdXRpb246ICR7bmFtZX1dYCxcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0ZXBzSWR4ICsgMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGxpbmVzW2ldLnRyaW0oKSkgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAgICAke2xpbmVzW2ldfWApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGcmVlLWZvcm0gKHNpbmdsZS1ibG9jaykgZGVzY3JpcHRpb24g4oCUIGlubGluZSBpdCB3aG9sZSwgdW5jaGFuZ2VkLlxuICAgICAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2goYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiBbU3ViLUV4ZWN1dGlvbjogJHtuYW1lfV0g4oCUICR7c3ViZmxvdy5kZXNjcmlwdGlvbn1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAke3RoaXMuX3N0ZXBDb3VudGVyfS4gW1N1Yi1FeGVjdXRpb246ICR7bmFtZX1dYCk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIENvbmZpZ3VyYXRpb24g4pSA4pSAXG5cbiAgc2V0TG9nZ2VyKGxvZ2dlcjogSUxvZ2dlcik6IHRoaXMge1xuICAgIHRoaXMuX2xvZ2dlciA9IGxvZ2dlcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNsYXJlIHRoZSBBUEkgY29udHJhY3Qg4oCUIGlucHV0IHZhbGlkYXRpb24sIG91dHB1dCBzaGFwZSwgYW5kIG91dHB1dCBtYXBwZXIuXG4gICAqIFJlcGxhY2VzIHNldElucHV0U2NoZW1hKCkgKyBzZXRPdXRwdXRTY2hlbWEoKSArIHNldE91dHB1dE1hcHBlcigpIGluIGEgc2luZ2xlIGNhbGwuXG4gICAqXG4gICAqIElmIGEgY29udHJhY3Qgd2l0aCBpbnB1dCBzY2hlbWEgaXMgZGVjbGFyZWQsIGNoYXJ0LnJ1bigpIHZhbGlkYXRlcyBpbnB1dCBhdXRvbWF0aWNhbGx5LlxuICAgKiBDb250cmFjdCBkYXRhIGlzIHVzZWQgYnkgY2hhcnQudG9PcGVuQVBJKCkgYW5kIGNoYXJ0LnRvTUNQVG9vbCgpLlxuICAgKi9cbiAgY29udHJhY3Qob3B0czoge1xuICAgIGlucHV0PzogdW5rbm93bjtcbiAgICBvdXRwdXQ/OiB1bmtub3duO1xuICAgIG1hcHBlcj86IChmaW5hbFNjb3BlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdW5rbm93bjtcbiAgfSk6IHRoaXMge1xuICAgIGlmIChvcHRzLmlucHV0KSB0aGlzLl9pbnB1dFNjaGVtYSA9IG9wdHMuaW5wdXQ7XG4gICAgaWYgKG9wdHMub3V0cHV0KSB0aGlzLl9vdXRwdXRTY2hlbWEgPSBvcHRzLm91dHB1dDtcbiAgICBpZiAob3B0cy5tYXBwZXIpIHRoaXMuX291dHB1dE1hcHBlciA9IG9wdHMubWFwcGVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIExpbmVhciBDaGFpbmluZyDilIDilIBcblxuICBzdGFydChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB8IFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICk6IHRoaXMge1xuICAgIGlmICh0aGlzLl9yb290KSBmYWlsKCdyb290IGFscmVhZHkgZGVmaW5lZDsgY3JlYXRlIGEgbmV3IGJ1aWxkZXInKTtcblxuICAgIC8vIERldGVjdCBQYXVzYWJsZUhhbmRsZXIgYnkgZHVjay10eXBpbmcgKGhhcyAuZXhlY3V0ZSBwcm9wZXJ0eSlcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICBjb25zdCBpc1BhdXNhYmxlID0gdHlwZW9mIGZuID09PSAnb2JqZWN0JyAmJiBmbiAhPT0gbnVsbCAmJiAnZXhlY3V0ZScgaW4gZm47XG4gICAgY29uc3Qgc3RhZ2VGbiA9IGlzUGF1c2FibGVcbiAgICAgID8gKChmbiBhcyBQYXVzYWJsZUhhbmRsZXI8VFNjb3BlPikuZXhlY3V0ZSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pXG4gICAgICA6IChmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWUsIGlkLCBmbjogc3RhZ2VGbiB9O1xuICAgIGlmIChpc1BhdXNhYmxlKSB7XG4gICAgICBub2RlLmlzUGF1c2FibGUgPSB0cnVlO1xuICAgICAgbm9kZS5yZXN1bWVGbiA9IChmbiBhcyBQYXVzYWJsZUhhbmRsZXI8VFNjb3BlPikucmVzdW1lO1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICB0aGlzLl9hZGRUb01hcChpZCwgc3RhZ2VGbik7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWUsIGlkLCB0eXBlOiAnc3RhZ2UnIH07XG4gICAgaWYgKGlzUGF1c2FibGUpIHNwZWMuaXNQYXVzYWJsZSA9IHRydWU7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG5cbiAgICB0aGlzLl9yb290ID0gbm9kZTtcbiAgICB0aGlzLl9yb290U3BlYyA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG5cbiAgICAvLyBMNy4zIOKAlCBTZWVkIG5vZGUgZmlyZXMgYG9uU3RhZ2VBZGRlZGAgKG5vIGVkZ2Ug4oCUIG5vIHByZWRlY2Vzc29yKS5cbiAgICAvLyBgaXNQYXVzYWJsZWAgaXMgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBzcGVjIGJ5IGBfZmlyZVN0YWdlQWRkZWRgLlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuXG4gICAgdGhpcy5fYXBwZW5kRGVzY3JpcHRpb25MaW5lKG5hbWUsIGRlc2NyaXB0aW9uKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCBhIGNoYXJ0IHdob3NlIFJPT1Qgc3RhZ2UgSVMgYSBzZWxlY3RvciDigJQgaXQgcnVucyBmaXJzdCAocmVhZGluZ1xuICAgKiBhcmdzLCBzZWVkaW5nIHN0YXRlLCByZXR1cm5pbmcgdGhlIGNob3NlbiBicmFuY2ggaWRzIHZpYSBgc2VsZWN0KClgKSxcbiAgICogYW5kIGl0cyBicmFuY2hlcyBhdHRhY2ggZGlyZWN0bHkgdG8gdGhlIHJvb3QuIE1pcnJvcnMgYHN0YXJ0KClgIGZvciB0aGVcbiAgICogcm9vdC1ub2RlIHNldHVwLCB0aGVuIHJldHVybnMgYSBgU2VsZWN0b3JGbkxpc3RgIGJvdW5kIHRvIHRoZSByb290IHNvXG4gICAqIGAuYWRkRnVuY3Rpb25CcmFuY2goKWAgLyBgLmFkZFN1YkZsb3dDaGFydEJyYW5jaCgpYCAvIGAuZW5kKClgIHdvcmtcbiAgICogZXhhY3RseSBhcyB0aGV5IGRvIGFmdGVyIGBhZGRTZWxlY3RvckZ1bmN0aW9uKClgLlxuICAgKlxuICAgKiBVc2Ugd2hlbiB0aGUgZmlyc3QgdGhpbmcgYSBjaGFydCBkb2VzIGlzIGNob29zZSBhbW9uZyBicmFuY2hlcyDigJQgZS5nLiBhXG4gICAqIGBDb250ZXh0YCBzZWxlY3RvciB0aGF0IGluaXRzICsgcGlja3Mgd2hpY2ggY29udGV4dCBzbG90cyB0byBlbmdpbmVlcixcbiAgICogd2l0aCBubyBzZXBhcmF0ZSBzZWVkIHN0YWdlIGJlZm9yZSBpdC5cbiAgICovXG4gIHN0YXJ0U2VsZWN0b3IoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZuOiBTdGFnZUZ1bmN0aW9uPGFueSwgVFNjb3BlPixcbiAgICBpZDogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IGZhaWxGYXN0PzogYm9vbGVhbiB9LFxuICApOiBTZWxlY3RvckZuTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBpZiAodGhpcy5fcm9vdCkgZmFpbCgncm9vdCBhbHJlYWR5IGRlZmluZWQ7IGNyZWF0ZSBhIG5ldyBidWlsZGVyJyk7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgbmFtZSwgaWQsIGZuOiBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4gfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICAvLyBTZWUgYGFkZFNlbGVjdG9yRnVuY3Rpb25gIOKAlCBgZmFpbEZhc3Q6IHRydWVgIG1ha2VzIGEgbXVsdGktYnJhbmNoXG4gICAgLy8gc2VsZWN0aW9uIGZhbiBvdXQgdmlhIGBQcm9taXNlLmFsbGAgKGZpcnN0IGVycm9yIGFib3J0cykgaW5zdGVhZCBvZiB0aGVcbiAgICAvLyBkZWZhdWx0IGBQcm9taXNlLmFsbFNldHRsZWRgIChiZXN0LWVmZm9ydCkuXG4gICAgaWYgKG9wdGlvbnM/LmZhaWxGYXN0KSBub2RlLmZhaWxGYXN0ID0gdHJ1ZTtcbiAgICB0aGlzLl9hZGRUb01hcChpZCwgZm4gYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+KTtcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZSwgaWQsIHR5cGU6ICdzdGFnZScsIGhhc1NlbGVjdG9yOiB0cnVlIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG5cbiAgICB0aGlzLl9yb290ID0gbm9kZTtcbiAgICB0aGlzLl9yb290U3BlYyA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG5cbiAgICAvLyBSb290IHNlbGVjdG9yIG5vZGUgZmlyZXMgb25TdGFnZUFkZGVkIHdpdGggTk8gcHJlZGVjZXNzb3IgZWRnZSAoaXQnc1xuICAgIC8vIHRoZSByb290KS4gQnJhbmNoZXMgKyBvbkRlY2lkZXJDb21wbGV0ZSBjb21lIGZyb20gdGhlIFNlbGVjdG9yRm5MaXN0LlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuXG4gICAgdGhpcy5fc3RlcENvdW50ZXIrKztcbiAgICB0aGlzLl9zdGFnZVN0ZXBNYXAuc2V0KG5hbWUsIHRoaXMuX3N0ZXBDb3VudGVyKTtcbiAgICB0aGlzLl9hcHBlbmREZXNjcmlwdGlvbkxpbmUobmFtZSwgZGVzY3JpcHRpb24pO1xuXG4gICAgcmV0dXJuIG5ldyBTZWxlY3RvckZuTGlzdDxUT3V0LCBUU2NvcGU+KFxuICAgICAgdGhpcyxcbiAgICAgIG5vZGUsXG4gICAgICBzcGVjLFxuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cyxcbiAgICAgIHRoaXMuX3N0YWdlRGVzY3JpcHRpb25zLFxuICAgICAgdGhpcy5fc3RlcENvdW50ZXIsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICApO1xuICB9XG5cbiAgYWRkRnVuY3Rpb24obmFtZTogc3RyaW5nLCBmbjogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LCBpZDogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcbiAgICAvLyBDYXB0dXJlIHRoZSBwYXJlbnQgU1BFQyByZWZlcmVuY2UgKG5vdCBqdXN0IGlkKSBCRUZPUkUgdGhlXG4gICAgLy8gY3Vyc29yIGFkdmFuY2VzIOKAlCB3ZSBuZWVkIGl0cyBgY2hpbGRyZW5gICsgYHR5cGVgIHRvIGRlY2lkZVxuICAgIC8vIHdoZXRoZXIgdGhlIGBuZXh0YCBlZGdlIGlzIGEgZm9yayBjb252ZXJnZW5jZSAoTiBlZGdlcyBmcm9tXG4gICAgLy8gZWFjaCBicmFuY2ggY2hpbGQpIHZzIGEgcGxhaW4gbGluZWFyIGNoYWluICgxIGVkZ2UgZnJvbSBwYXJlbnQpLlxuICAgIGNvbnN0IHBhcmVudFNwZWMgPSBjdXJTcGVjO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWUsIGlkLCBmbiB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHRoaXMuX2FkZFRvTWFwKGlkLCBmbik7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWUsIGlkLCB0eXBlOiAnc3RhZ2UnIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG5cbiAgICBjdXIubmV4dCA9IG5vZGU7XG4gICAgY3VyU3BlYy5uZXh0ID0gc3BlYztcbiAgICB0aGlzLl9jdXJzb3IgPSBub2RlO1xuICAgIHRoaXMuX2FkdmFuY2VDdXJzb3JTcGVjKHNwZWMpO1xuICAgIHRoaXMuX2tub3duU3RhZ2VJZHMuYWRkKGlkKTtcblxuICAgIC8vIEw3LjMg4oCUIExpbmVhciBub2RlOiBhbm5vdW5jZSB0aGUgbm9kZSBmaXJzdCwgdGhlbiB0aGUgZWRnZVxuICAgIC8vIGZyb20gdGhlIHByaW9yIGN1cnNvci4gT3JkZXIgbWF0dGVyczogZW5kcG9pbnRzIGFubm91bmNlZFxuICAgIC8vIGJlZm9yZSBhbnkgZWRnZSByZWZlcmVuY2luZyB0aGVtIChTdHJ1Y3R1cmVSZWNvcmRlciBjb250cmFjdCkuXG4gICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoc3BlYyk7XG4gICAgdGhpcy5fZmlyZU5leHRFZGdlRnJvbVBhcmVudChwYXJlbnRTcGVjLCBpZCk7XG5cbiAgICB0aGlzLl9hcHBlbmREZXNjcmlwdGlvbkxpbmUobmFtZSwgZGVzY3JpcHRpb24pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkU3RyZWFtaW5nRnVuY3Rpb24oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZuOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdHJlYW1JZD86IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuICAgIGNvbnN0IHBhcmVudFNwZWMgPSBjdXJTcGVjO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lLFxuICAgICAgaWQsXG4gICAgICBmbixcbiAgICAgIGlzU3RyZWFtaW5nOiB0cnVlLFxuICAgICAgc3RyZWFtSWQ6IHN0cmVhbUlkID8/IG5hbWUsXG4gICAgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICB0aGlzLl9hZGRUb01hcChpZCwgZm4pO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGlkLFxuICAgICAgdHlwZTogJ3N0cmVhbWluZycsXG4gICAgICBpc1N0cmVhbWluZzogdHJ1ZSxcbiAgICAgIHN0cmVhbUlkOiBzdHJlYW1JZCA/PyBuYW1lLFxuICAgIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG5cbiAgICBjdXIubmV4dCA9IG5vZGU7XG4gICAgY3VyU3BlYy5uZXh0ID0gc3BlYztcbiAgICB0aGlzLl9jdXJzb3IgPSBub2RlO1xuICAgIHRoaXMuX2FkdmFuY2VDdXJzb3JTcGVjKHNwZWMpO1xuICAgIHRoaXMuX2tub3duU3RhZ2VJZHMuYWRkKGlkKTtcblxuICAgIC8vIEw3LjMg4oCUIFN0cmVhbWluZyBzdGFnZTogc2FtZSBzaGFwZSBhcyBsaW5lYXIgYWRkRnVuY3Rpb24uXG4gICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoc3BlYyk7XG4gICAgdGhpcy5fZmlyZU5leHRFZGdlRnJvbVBhcmVudChwYXJlbnRTcGVjLCBpZCk7XG5cbiAgICB0aGlzLl9hcHBlbmREZXNjcmlwdGlvbkxpbmUobmFtZSwgZGVzY3JpcHRpb24pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHBhdXNhYmxlIHN0YWdlIOKAlCBjYW4gcGF1c2UgZXhlY3V0aW9uIGFuZCByZXN1bWUgbGF0ZXIgd2l0aCBpbnB1dC5cbiAgICpcbiAgICogVGhlIGhhbmRsZXIgaGFzIHR3byBwaGFzZXM6XG4gICAqIC0gYGV4ZWN1dGVgOiBydW5zIGZpcnN0IHRpbWUuIFJldHVybiBgeyBwYXVzZTogdHJ1ZSB9YCB0byBwYXVzZS5cbiAgICogLSBgcmVzdW1lYDogcnVucyB3aGVuIHRoZSBmbG93Y2hhcnQgaXMgcmVzdW1lZCB3aXRoIGlucHV0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC5hZGRQYXVzYWJsZUZ1bmN0aW9uKCdBcHByb3ZlT3JkZXInLCB7XG4gICAqICAgZXhlY3V0ZTogYXN5bmMgKHNjb3BlKSA9PiB7XG4gICAqICAgICBzY29wZS5vcmRlcklkID0gJzEyMyc7XG4gICAqICAgICByZXR1cm4geyBwYXVzZTogdHJ1ZSwgZGF0YTogeyBxdWVzdGlvbjogJ0FwcHJvdmU/JyB9IH07XG4gICAqICAgfSxcbiAgICogICByZXN1bWU6IGFzeW5jIChzY29wZSwgaW5wdXQpID0+IHtcbiAgICogICAgIHNjb3BlLmFwcHJvdmVkID0gaW5wdXQuYXBwcm92ZWQ7XG4gICAqICAgfSxcbiAgICogfSwgJ2FwcHJvdmUtb3JkZXInLCAnTWFuYWdlciBhcHByb3ZhbCBnYXRlJylcbiAgICogYGBgXG4gICAqL1xuICBhZGRQYXVzYWJsZUZ1bmN0aW9uKG5hbWU6IHN0cmluZywgaGFuZGxlcjogUGF1c2FibGVIYW5kbGVyPFRTY29wZT4sIGlkOiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdGhpcyB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuICAgIGNvbnN0IHBhcmVudFNwZWMgPSBjdXJTcGVjO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lLFxuICAgICAgaWQsXG4gICAgICBmbjogaGFuZGxlci5leGVjdXRlIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICAgIGlzUGF1c2FibGU6IHRydWUsXG4gICAgICByZXN1bWVGbjogaGFuZGxlci5yZXN1bWUsXG4gICAgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICB0aGlzLl9hZGRUb01hcChpZCwgaGFuZGxlci5leGVjdXRlIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPik7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lLFxuICAgICAgaWQsXG4gICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgaXNQYXVzYWJsZTogdHJ1ZSxcbiAgICB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuXG4gICAgY3VyLm5leHQgPSBub2RlO1xuICAgIGN1clNwZWMubmV4dCA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG5cbiAgICAvLyBMNy4zIOKAlCBQYXVzYWJsZSBzdGFnZTogYF9maXJlU3RhZ2VBZGRlZGAgcmVhZHMgYGlzUGF1c2FibGVgXG4gICAgLy8gZGlyZWN0bHkgZnJvbSBgc3BlYy5pc1BhdXNhYmxlYCAoc2V0IGFib3ZlKSwgc28gdmlzdWFsaXNlcnNcbiAgICAvLyBzZWUgaXQgb24gdGhlIGV2ZW50IHBheWxvYWQgd2l0aG91dCBhIHNlcGFyYXRlIHRocmVhZGluZyBhcmcuXG4gICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoc3BlYyk7XG4gICAgdGhpcy5fZmlyZU5leHRFZGdlRnJvbVBhcmVudChwYXJlbnRTcGVjLCBpZCk7XG5cbiAgICB0aGlzLl9hcHBlbmREZXNjcmlwdGlvbkxpbmUobmFtZSwgZGVzY3JpcHRpb24pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIERldGFjaCAoYnVpbGRlci1uYXRpdmUgY29tcG9zaXRpb24pIOKUgOKUgFxuICAvL1xuICAvLyBTdWdhciBvdmVyIGBhZGRGdW5jdGlvbmAgdGhhdCBnZW5lcmF0ZXMgYSBzdGFnZSB3aGljaCBjYWxsc1xuICAvLyBgc2NvcGUuJGRldGFjaEFuZEZvcmdldCguLi4pYCBvciBgc2NvcGUuJGRldGFjaEFuZEpvaW5MYXRlciguLi4pYFxuICAvLyBhdCBydW50aW1lLiBaRVJPIGVuZ2luZSBjaGFuZ2VzIOKAlCBwdXJlIGNvbXBvc2l0aW9uIG92ZXIgdGhlXG4gIC8vIGV4aXN0aW5nIHNjb3BlLW1ldGhvZCBwcmltaXRpdmVzLlxuICAvL1xuICAvLyBGb3IgYGFkZERldGFjaEFuZEpvaW5MYXRlcmAsIHRoZSByZXR1cm5lZCBoYW5kbGUgaXMgc3RvcmVkIGluXG4gIC8vIHNoYXJlZCBzdGF0ZSB2aWEgYCRzZXRWYWx1ZWAgKHdoaWNoIGJ5cGFzc2VzIHRoZSB0eXBlZC1wcm94eVxuICAvLyB1bndyYXAgdGhhdCB3b3VsZCBvdGhlcndpc2Ugc3RyaXAgdGhlIGhhbmRsZSdzIGNsYXNzIG1ldGhvZHMpLlxuICAvLyBEb3duc3RyZWFtIHN0YWdlcyByZWFkIGl0IHZpYSBgc2NvcGVbb3B0aW9ucy5oYW5kbGVLZXldYCBvclxuICAvLyBgc2NvcGUuJGdldFZhbHVlKG9wdGlvbnMuaGFuZGxlS2V5KWAg4oCUIGJvdGggcHJlc2VydmUgbWV0aG9kc1xuICAvLyBiZWNhdXNlIHRoZSB2YWx1ZSB3YXMgc3RvcmVkIHJhdy5cblxuICAvKipcbiAgICogQWRkIGEgc3RhZ2UgdGhhdCBmaXJlcyBhIGNoaWxkIGZsb3djaGFydCBvbiB0aGUgZ2l2ZW4gZHJpdmVyIGFuZFxuICAgKiBESVNDQVJEUyB0aGUgaGFuZGxlLiBQdXJlIGZpcmUtYW5kLWZvcmdldCDigJQgdXNlZnVsIGZvciB0ZWxlbWV0cnlcbiAgICogZXhwb3J0cywgYXVkaXQgbG9nIHNoaXBwaW5nLCBjYWNoZSB3YXJtLXVwLlxuICAgKlxuICAgKiBAcGFyYW0gaWQgU3RhYmxlIGlkIGZvciB0aGlzIHN0YWdlIChhbHNvIHRoZSBzdGFnZU1hcCBrZXkpLlxuICAgKiBAcGFyYW0gY2hpbGQgVGhlIGNoaWxkIGZsb3djaGFydCB0byBkZXRhY2guXG4gICAqIEBwYXJhbSBvcHRpb25zLmRyaXZlciBUaGUgZHJpdmVyIHRvIHNjaGVkdWxlIG9uIChlLmcuIGBtaWNyb3Rhc2tCYXRjaERyaXZlcmApLlxuICAgKiBAcGFyYW0gb3B0aW9ucy5pbnB1dE1hcHBlciBNYXBzIHRoZSBwYXJlbnQncyBzY29wZSB0byB0aGUgY2hpbGQncyBpbnB1dC5cbiAgICogICBEZWZhdWx0cyB0byBwYXNzaW5nIGB1bmRlZmluZWRgLlxuICAgKiBAcGFyYW0gb3B0aW9ucy5tb3VudE5hbWUgRGlzcGxheSBuYW1lOyBkZWZhdWx0cyB0byBgaWRgLlxuICAgKiBAcGFyYW0gb3B0aW9ucy5kZXNjcmlwdGlvbiBTdGFnZSBkZXNjcmlwdGlvbiBmb3IgbmFycmF0aXZlICsgdG9vbHMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGltcG9ydCB7IG1pY3JvdGFza0JhdGNoRHJpdmVyIH0gZnJvbSAnZm9vdHByaW50anMvZGV0YWNoJztcbiAgICpcbiAgICogZmxvd0NoYXJ0KCdwcm9jZXNzJywgcHJvY2Vzc0ZuLCAncHJvY2VzcycpXG4gICAqICAgLmFkZERldGFjaEFuZEZvcmdldCgndGVsZW1ldHJ5JywgdGVsZW1ldHJ5Q2hhcnQsIHtcbiAgICogICAgIGRyaXZlcjogbWljcm90YXNrQmF0Y2hEcml2ZXIsXG4gICAqICAgICBpbnB1dE1hcHBlcjogKHNjb3BlKSA9PiAoeyBldmVudDogJ3Byb2Nlc3NlZCcsIG9yZGVySWQ6IHNjb3BlLm9yZGVySWQgfSksXG4gICAqICAgfSlcbiAgICogICAuYWRkRnVuY3Rpb24oJ25leHQnLCBuZXh0Rm4sICduZXh0JylcbiAgICogICAuYnVpbGQoKTtcbiAgICogYGBgXG4gICAqL1xuICBhZGREZXRhY2hBbmRGb3JnZXQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBjaGlsZDogaW1wb3J0KCcuL3R5cGVzLmpzJykuRmxvd0NoYXJ0PGFueSwgYW55PixcbiAgICBvcHRpb25zOiB7XG4gICAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyO1xuICAgICAgaW5wdXRNYXBwZXI/OiAoc2NvcGU6IFRTY29wZSkgPT4gdW5rbm93bjtcbiAgICAgIG1vdW50TmFtZT86IHN0cmluZztcbiAgICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIH0sXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IG5hbWUgPSBvcHRpb25zLm1vdW50TmFtZSA/PyBpZDtcbiAgICByZXR1cm4gdGhpcy5hZGRGdW5jdGlvbihcbiAgICAgIG5hbWUsXG4gICAgICAoKHNjb3BlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBvcHRpb25zLmlucHV0TWFwcGVyID8gb3B0aW9ucy5pbnB1dE1hcHBlcihzY29wZSBhcyBUU2NvcGUpIDogdW5kZWZpbmVkO1xuICAgICAgICBzY29wZS4kZGV0YWNoQW5kRm9yZ2V0KG9wdGlvbnMuZHJpdmVyLCBjaGlsZCwgaW5wdXQpO1xuICAgICAgfSkgYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgICAgaWQsXG4gICAgICBvcHRpb25zLmRlc2NyaXB0aW9uLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgc3RhZ2UgdGhhdCBmaXJlcyBhIGNoaWxkIGZsb3djaGFydCBvbiB0aGUgZ2l2ZW4gZHJpdmVyIGFuZFxuICAgKiBkZWxpdmVycyB0aGUgcmVzdWx0aW5nIGBEZXRhY2hIYW5kbGVgIHRvIGEgY29uc3VtZXItc3VwcGxpZWRcbiAgICogYG9uSGFuZGxlYCBjYWxsYmFjay4gVGhlIGhhbmRsZSBDQU5OT1QgYmUgc3RvcmVkIGluIHNoYXJlZCBzdGF0ZVxuICAgKiDigJQgYFN0YWdlQ29udGV4dC5zZXRWYWx1ZWAgY2FsbHMgYHN0cnVjdHVyZWRDbG9uZWAgd2hpY2ggZHJvcHNcbiAgICogY2xhc3MgcHJvdG90eXBlcyAoYW5kIHRoZXJlZm9yZSB0aGUgaGFuZGxlJ3MgYC53YWl0KClgIG1ldGhvZCkuXG4gICAqXG4gICAqIFRoZSBjYWxsYmFjayBwYXR0ZXJuIGlzIHRoZSBleHBsaWNpdCBhbHRlcm5hdGl2ZToga2VlcCBoYW5kbGVzIGluXG4gICAqIGEgY2xvc3VyZS1sb2NhbCBhcnJheSAob3Igd2hhdGV2ZXIgc2hhcGUgc3VpdHMpIGFuZCBoYXZlIGFcbiAgICogZG93bnN0cmVhbSBzdGFnZSBgYXdhaXQgUHJvbWlzZS5hbGwoLi4uKWAgb3ZlciB0aGVtLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBpbXBvcnQgeyBtaWNyb3Rhc2tCYXRjaERyaXZlciB9IGZyb20gJ2Zvb3RwcmludGpzL2RldGFjaCc7XG4gICAqIGltcG9ydCB0eXBlIHsgRGV0YWNoSGFuZGxlIH0gZnJvbSAnZm9vdHByaW50anMvZGV0YWNoJztcbiAgICpcbiAgICogY29uc3QgaGFuZGxlczogRGV0YWNoSGFuZGxlW10gPSBbXTtcbiAgICpcbiAgICogY29uc3QgY2hhcnQgPSBmbG93Q2hhcnQoJ3NlZWQnLCBzZWVkRm4sICdzZWVkJylcbiAgICogICAuYWRkRGV0YWNoQW5kSm9pbkxhdGVyKCdldmFsLWEnLCBldmFsQ2hhcnQsIHtcbiAgICogICAgIGRyaXZlcjogbWljcm90YXNrQmF0Y2hEcml2ZXIsXG4gICAqICAgICBpbnB1dE1hcHBlcjogKHNjb3BlKSA9PiBzY29wZS5jb25maWdBLFxuICAgKiAgICAgb25IYW5kbGU6IChoKSA9PiBoYW5kbGVzLnB1c2goaCksXG4gICAqICAgfSlcbiAgICogICAuYWRkRGV0YWNoQW5kSm9pbkxhdGVyKCdldmFsLWInLCBldmFsQ2hhcnQsIHtcbiAgICogICAgIGRyaXZlcjogbWljcm90YXNrQmF0Y2hEcml2ZXIsXG4gICAqICAgICBpbnB1dE1hcHBlcjogKHNjb3BlKSA9PiBzY29wZS5jb25maWdCLFxuICAgKiAgICAgb25IYW5kbGU6IChoKSA9PiBoYW5kbGVzLnB1c2goaCksXG4gICAqICAgfSlcbiAgICogICAuYWRkRnVuY3Rpb24oJ2pvaW4nLCBhc3luYyAoc2NvcGUpID0+IHtcbiAgICogICAgIGNvbnN0IHNldHRsZWQgPSBhd2FpdCBQcm9taXNlLmFsbChoYW5kbGVzLm1hcCgoaCkgPT4gaC53YWl0KCkpKTtcbiAgICogICAgIHNjb3BlLnJlc3VsdHMgPSBzZXR0bGVkO1xuICAgKiAgIH0sICdqb2luJylcbiAgICogICAuYnVpbGQoKTtcbiAgICogYGBgXG4gICAqXG4gICAqIE5vdGU6IHB1dHRpbmcgYGhhbmRsZXNgIGluIGEgbW9kdWxlLWxldmVsIGNsb3N1cmUgaXMgZmluZSBmb3JcbiAgICogc2luZ2xlLXJ1biBzY3JpcHRzLiBGb3Igc2VydmVyIGNvZGUgdGhhdCBydW5zIHRoZSBzYW1lIGNoYXJ0XG4gICAqIGNvbmN1cnJlbnRseSBhY3Jvc3MgcmVxdWVzdHMsIGFsbG9jYXRlIGEgbmV3IGNsb3N1cmUgcGVyIHJ1blxuICAgKiAoZS5nLiwgd3JhcCBjaGFydCBjb25zdHJ1Y3Rpb24gaW4gYSBmYWN0b3J5IGZ1bmN0aW9uKSBzbyBoYW5kbGVzXG4gICAqIGZyb20gZGlmZmVyZW50IHJ1bnMgZG9uJ3QgYmxlZWQgaW50byBlYWNoIG90aGVyLlxuICAgKi9cbiAgYWRkRGV0YWNoQW5kSm9pbkxhdGVyKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgY2hpbGQ6IGltcG9ydCgnLi90eXBlcy5qcycpLkZsb3dDaGFydDxhbnksIGFueT4sXG4gICAgb3B0aW9uczoge1xuICAgICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcjtcbiAgICAgIG9uSGFuZGxlOiAoaGFuZGxlOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaEhhbmRsZSkgPT4gdm9pZDtcbiAgICAgIGlucHV0TWFwcGVyPzogKHNjb3BlOiBUU2NvcGUpID0+IHVua25vd247XG4gICAgICBtb3VudE5hbWU/OiBzdHJpbmc7XG4gICAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICB9LFxuICApOiB0aGlzIHtcbiAgICBjb25zdCBuYW1lID0gb3B0aW9ucy5tb3VudE5hbWUgPz8gaWQ7XG4gICAgcmV0dXJuIHRoaXMuYWRkRnVuY3Rpb24oXG4gICAgICBuYW1lLFxuICAgICAgKChzY29wZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gb3B0aW9ucy5pbnB1dE1hcHBlciA/IG9wdGlvbnMuaW5wdXRNYXBwZXIoc2NvcGUgYXMgVFNjb3BlKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgaGFuZGxlID0gc2NvcGUuJGRldGFjaEFuZEpvaW5MYXRlcihvcHRpb25zLmRyaXZlciwgY2hpbGQsIGlucHV0KTtcbiAgICAgICAgb3B0aW9ucy5vbkhhbmRsZShoYW5kbGUpO1xuICAgICAgfSkgYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgICAgaWQsXG4gICAgICBvcHRpb25zLmRlc2NyaXB0aW9uLFxuICAgICk7XG4gIH1cblxuICAvLyDilIDilIAgQnJhbmNoaW5nIOKUgOKUgFxuXG4gIGFkZERlY2lkZXJGdW5jdGlvbihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm46IFN0YWdlRnVuY3Rpb248YW55LCBUU2NvcGU+LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICk6IERlY2lkZXJMaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcbiAgICBjb25zdCBwYXJlbnRTcGVjID0gY3VyU3BlYztcblxuICAgIGlmIChjdXIuZGVjaWRlckZuKSBmYWlsKGBkZWNpZGVyIGFscmVhZHkgZGVmaW5lZCBhdCAnJHtjdXIubmFtZX0nYCk7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgbmFtZSwgaWQsIGZuIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgdGhpcy5fYWRkVG9NYXAoaWQsIGZuKTtcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZSwgaWQsIHR5cGU6ICdzdGFnZScsIGhhc0RlY2lkZXI6IHRydWUgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcblxuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuXG4gICAgLy8gTDcuMyDigJQgRGVjaWRlciBub2RlIGlzIHJlYWNoZWQgdmlhIGEgYG5leHRgIGVkZ2UgZnJvbSB0aGUgcHJpb3JcbiAgICAvLyBjdXJzb3IuIEJyYW5jaGVzIHRoZW1zZWx2ZXMgZmlyZSB2aWEgYGFkZEZ1bmN0aW9uQnJhbmNoYCBldGMuXG4gICAgLy8gYG9uRGVjaWRlckNvbXBsZXRlYCBmaXJlcyBmcm9tIHN1Yi1idWlsZGVyIGAuZW5kKClgLlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnQocGFyZW50U3BlYywgaWQpO1xuXG4gICAgdGhpcy5fc3RlcENvdW50ZXIrKztcbiAgICB0aGlzLl9zdGFnZVN0ZXBNYXAuc2V0KG5hbWUsIHRoaXMuX3N0ZXBDb3VudGVyKTtcblxuICAgIHJldHVybiBuZXcgRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPihcbiAgICAgIHRoaXMsXG4gICAgICBub2RlLFxuICAgICAgc3BlYyxcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMsXG4gICAgICB0aGlzLl9zdGFnZURlc2NyaXB0aW9ucyxcbiAgICAgIHRoaXMuX3N0ZXBDb3VudGVyLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgKTtcbiAgfVxuXG4gIGFkZFNlbGVjdG9yRnVuY3Rpb24oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZuOiBTdGFnZUZ1bmN0aW9uPGFueSwgVFNjb3BlPixcbiAgICBpZDogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IGZhaWxGYXN0PzogYm9vbGVhbiB9LFxuICApOiBTZWxlY3RvckZuTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG4gICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG5cbiAgICBpZiAoY3VyLnNlbGVjdG9yRm4pIGZhaWwoYHNlbGVjdG9yIGFscmVhZHkgZGVmaW5lZCBhdCAnJHtjdXIubmFtZX0nYCk7XG4gICAgaWYgKGN1ci5kZWNpZGVyRm4pIGZhaWwoYGRlY2lkZXIgYW5kIHNlbGVjdG9yIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWUsIGlkLCBmbiB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIC8vIGBmYWlsRmFzdGA6IHdoZW4gdGhlIHNlbGVjdG9yIHBpY2tzIOKJpTIgYnJhbmNoZXMgdGhleSBmYW4gb3V0IGluIHBhcmFsbGVsXG4gICAgLy8gdmlhIENoaWxkcmVuRXhlY3V0b3IuIERlZmF1bHQgPSBgUHJvbWlzZS5hbGxTZXR0bGVkYCAoYmVzdC1lZmZvcnQ6IGV2ZXJ5XG4gICAgLy8gYnJhbmNoIHJ1bnMgdG8gY29tcGxldGlvbiBldmVuIGlmIHNvbWUgZmFpbCkuIGBmYWlsRmFzdDogdHJ1ZWAgPSBgUHJvbWlzZS5hbGxgXG4gICAgLy8gKHRoZSBmaXJzdCBicmFuY2ggZXJyb3IgcmVqZWN0cyArIGFib3J0cykg4oCUIHVzZSB3aGVuIEFMTCBzZWxlY3RlZCBicmFuY2hlc1xuICAgIC8vIGFyZSBSRVFVSVJFRCAoZS5nLiBhc3NlbWJsaW5nIGEgcmVxdWVzdCBmcm9tIGluZGVwZW5kZW50LWJ1dC1yZXF1aXJlZCBwYXJ0cyksXG4gICAgLy8gbm90IGJlc3QtZWZmb3J0IGZhbi1vdXQuIFNhbWUgZmxhZyBgYWRkTGlzdE9mRnVuY3Rpb25gIGV4cG9zZXMuXG4gICAgaWYgKG9wdGlvbnM/LmZhaWxGYXN0KSBub2RlLmZhaWxGYXN0ID0gdHJ1ZTtcbiAgICB0aGlzLl9hZGRUb01hcChpZCwgZm4pO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lLCBpZCwgdHlwZTogJ3N0YWdlJywgaGFzU2VsZWN0b3I6IHRydWUgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcblxuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuXG4gICAgLy8gTDcuMyDigJQgU2VsZWN0b3Igbm9kZTogc2FtZSBhcyBkZWNpZGVyLiBCcmFuY2hlcyArIGNvbXBsZXRlIGV2ZW50XG4gICAgLy8gY29tZSBmcm9tIHRoZSBTZWxlY3RvckZuTGlzdCBzdWItYnVpbGRlci5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KHBhcmVudFNwZWMsIGlkKTtcblxuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChuYW1lLCB0aGlzLl9zdGVwQ291bnRlcik7XG5cbiAgICByZXR1cm4gbmV3IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4oXG4gICAgICB0aGlzLFxuICAgICAgbm9kZSxcbiAgICAgIHNwZWMsXG4gICAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLFxuICAgICAgdGhpcy5fc3RhZ2VEZXNjcmlwdGlvbnMsXG4gICAgICB0aGlzLl9zdGVwQ291bnRlcixcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICk7XG4gIH1cblxuICAvLyDilIDilIAgUGFyYWxsZWwgKEZvcmspIOKUgOKUgFxuXG4gIGFkZExpc3RPZkZ1bmN0aW9uKGNoaWxkcmVuOiBTaW1wbGlmaWVkUGFyYWxsZWxTcGVjPFRPdXQsIFRTY29wZT5bXSwgb3B0aW9ucz86IHsgZmFpbEZhc3Q/OiBib29sZWFuIH0pOiB0aGlzIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG4gICAgY29uc3QgZm9ya0lkID0gY3VyLmlkO1xuXG4gICAgY3VyU3BlYy50eXBlID0gJ2ZvcmsnO1xuICAgIGlmIChvcHRpb25zPy5mYWlsRmFzdCkgY3VyLmZhaWxGYXN0ID0gdHJ1ZTtcblxuICAgIGZvciAoY29uc3QgeyBpZCwgbmFtZSwgZm4gfSBvZiBjaGlsZHJlbikge1xuICAgICAgaWYgKCFpZCkgZmFpbChgY2hpbGQgaWQgcmVxdWlyZWQgdW5kZXIgJyR7Y3VyLm5hbWV9J2ApO1xuICAgICAgaWYgKGN1ci5jaGlsZHJlbj8uc29tZSgoYykgPT4gYy5pZCA9PT0gaWQpKSB7XG4gICAgICAgIGZhaWwoYGR1cGxpY2F0ZSBjaGlsZCBpZCAnJHtpZH0nIHVuZGVyICcke2N1ci5uYW1lfSdgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWU6IG5hbWUgPz8gaWQsIGlkIH07XG4gICAgICBpZiAoZm4pIHtcbiAgICAgICAgbm9kZS5mbiA9IGZuO1xuICAgICAgICB0aGlzLl9hZGRUb01hcChpZCwgZm4pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICAgIG5hbWU6IG5hbWUgPz8gaWQsXG4gICAgICAgIGlkLFxuICAgICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgICBpc1BhcmFsbGVsQ2hpbGQ6IHRydWUsXG4gICAgICAgIHBhcmFsbGVsR3JvdXBJZDogZm9ya0lkLFxuICAgICAgfTtcblxuICAgICAgY3VyLmNoaWxkcmVuID0gY3VyLmNoaWxkcmVuIHx8IFtdO1xuICAgICAgY3VyLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgICBjdXJTcGVjLmNoaWxkcmVuID0gY3VyU3BlYy5jaGlsZHJlbiB8fCBbXTtcbiAgICAgIGN1clNwZWMuY2hpbGRyZW4ucHVzaChzcGVjKTtcbiAgICAgIC8vIEw3LjMg4oCUIGZpcmUgc3RydWN0dXJlIGV2ZW50cyBmb3IgdGhlIGNoaWxkICsgdGhlIGZvcmsgZWRnZS5cbiAgICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgICAgdGhpcy5fZmlyZUVkZ2VBZGRlZChjdXJTcGVjLmlkLCBzcGVjLmlkLCAnZm9yay1icmFuY2gnKTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZE5hbWVzID0gY2hpbGRyZW4ubWFwKChjKSA9PiBjLm5hbWUgfHwgYy5pZCkuam9pbignLCAnKTtcbiAgICB0aGlzLl9zdGVwQ291bnRlcisrO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChgJHt0aGlzLl9zdGVwQ291bnRlcn0uIFJ1bnMgaW4gcGFyYWxsZWw6ICR7Y2hpbGROYW1lc31gKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIFN1YmZsb3cgTW91bnRpbmcg4pSA4pSAXG5cbiAgYWRkU3ViRmxvd0NoYXJ0KGlkOiBzdHJpbmcsIHN1YmZsb3c6IEZsb3dDaGFydDxhbnksIGFueT4sIG1vdW50TmFtZT86IHN0cmluZywgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMpOiB0aGlzIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG5cbiAgICBpZiAoY3VyLmNoaWxkcmVuPy5zb21lKChjKSA9PiBjLmlkID09PSBpZCkpIHtcbiAgICAgIGZhaWwoYGR1cGxpY2F0ZSBjaGlsZCBpZCAnJHtpZH0nIHVuZGVyICcke2N1ci5uYW1lfSdgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcbiAgICBjb25zdCBmb3JrSWQgPSBjdXIuaWQ7XG4gICAgY29uc3QgcHJlZml4ZWRSb290ID0gdGhpcy5fcHJlZml4Tm9kZVRyZWUoc3ViZmxvdy5yb290LCBpZCk7XG5cbiAgICBpZiAoIXRoaXMuX3N1YmZsb3dEZWZzLmhhcyhpZCkpIHtcbiAgICAgIHRoaXMuX3N1YmZsb3dEZWZzLnNldChpZCwgeyByb290OiBwcmVmaXhlZFJvb3QgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICB9O1xuICAgIGlmIChvcHRpb25zKSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgaXNQYXJhbGxlbENoaWxkOiB0cnVlLFxuICAgICAgcGFyYWxsZWxHcm91cElkOiBmb3JrSWQsXG4gICAgICBzdWJmbG93U3RydWN0dXJlOiBzdWJmbG93LmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICB9O1xuXG4gICAgY3VyU3BlYy50eXBlID0gJ2ZvcmsnO1xuICAgIGN1ci5jaGlsZHJlbiA9IGN1ci5jaGlsZHJlbiB8fCBbXTtcbiAgICBjdXIuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICBjdXJTcGVjLmNoaWxkcmVuID0gY3VyU3BlYy5jaGlsZHJlbiB8fCBbXTtcbiAgICBjdXJTcGVjLmNoaWxkcmVuLnB1c2goc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuICAgIC8vIEw3LjMg4oCUIFN1YmZsb3cgbW91bnQ6IHN0YWdlIGV2ZW50ICsgZm9yayBlZGdlICsgbW91bnQgbGlmZWN5Y2xlXG4gICAgLy8gZXZlbnQuIE1vdW50LW9ubHkgc2VtYW50aWNzOiBwYXJlbnQgcmVjb3JkZXJzIGRvIE5PVCByZXBsYXkgdGhlXG4gICAgLy8gc3ViZmxvdydzIG93biBpbnRlcm5hbCBzdHJ1Y3R1cmUgZXZlbnRzLlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVFZGdlQWRkZWQoY3VyU3BlYy5pZCwgaWQsICdmb3JrLWJyYW5jaCcpO1xuICAgIHRoaXMuX2ZpcmVTdWJmbG93TW91bnRlZChpZCwgc3ViZmxvd05hbWUsIGlkLCBmYWxzZSwgc3ViZmxvdy5idWlsZFRpbWVTdHJ1Y3R1cmUpO1xuXG4gICAgdGhpcy5fbWVyZ2VTdGFnZU1hcChzdWJmbG93LnN0YWdlTWFwLCBpZCk7XG4gICAgdGhpcy5fbWVyZ2VTdWJmbG93cyhzdWJmbG93LnN1YmZsb3dzLCBpZCk7XG4gICAgdGhpcy5fYXBwZW5kU3ViZmxvd0Rlc2NyaXB0aW9uKGlkLCBzdWJmbG93TmFtZSwgc3ViZmxvdyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZExhenlTdWJGbG93Q2hhcnQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICByZXNvbHZlcjogKCkgPT4gRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT4sXG4gICAgbW91bnROYW1lPzogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBTdWJmbG93TW91bnRPcHRpb25zLFxuICApOiB0aGlzIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG5cbiAgICBpZiAoY3VyLmNoaWxkcmVuPy5zb21lKChjKSA9PiBjLmlkID09PSBpZCkpIHtcbiAgICAgIGZhaWwoYGR1cGxpY2F0ZSBjaGlsZCBpZCAnJHtpZH0nIHVuZGVyICcke2N1ci5uYW1lfSdgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcbiAgICBjb25zdCBmb3JrSWQgPSBjdXIuaWQ7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgc3ViZmxvd1Jlc29sdmVyOiByZXNvbHZlciBhcyBhbnksXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucykgbm9kZS5zdWJmbG93TW91bnRPcHRpb25zID0gb3B0aW9ucztcblxuICAgIC8vIExhenkgbW91bnQgc3R1Yi4gVGhlIGxhenkgc3ViZmxvdydzIGludGVybmFscyB3aWxsIGJlIHNoYXBlZCBhdFxuICAgIC8vIHJlc29sdXRpb24gdGltZS5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBpc1BhcmFsbGVsQ2hpbGQ6IHRydWUsXG4gICAgICBwYXJhbGxlbEdyb3VwSWQ6IGZvcmtJZCxcbiAgICAgIGlzTGF6eTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgY3VyU3BlYy50eXBlID0gJ2ZvcmsnO1xuICAgIGN1ci5jaGlsZHJlbiA9IGN1ci5jaGlsZHJlbiB8fCBbXTtcbiAgICBjdXIuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICBjdXJTcGVjLmNoaWxkcmVuID0gY3VyU3BlYy5jaGlsZHJlbiB8fCBbXTtcbiAgICBjdXJTcGVjLmNoaWxkcmVuLnB1c2goc3BlYyk7XG4gICAgLy8gTDcuMyDigJQgTGF6eSBzdWJmbG93IHBhcmFsbGVsIG1vdW50LlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVFZGdlQWRkZWQoY3VyU3BlYy5pZCwgaWQsICdmb3JrLWJyYW5jaCcpO1xuICAgIHRoaXMuX2ZpcmVTdWJmbG93TW91bnRlZChpZCwgc3ViZmxvd05hbWUsIGlkLCB0cnVlKTtcblxuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChpZCwgdGhpcy5fc3RlcENvdW50ZXIpO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChgJHt0aGlzLl9zdGVwQ291bnRlcn0uIFtMYXp5IFN1Yi1FeGVjdXRpb246ICR7c3ViZmxvd05hbWV9XWApO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRMYXp5U3ViRmxvd0NoYXJ0TmV4dChcbiAgICBpZDogc3RyaW5nLFxuICAgIHJlc29sdmVyOiAoKSA9PiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcblxuICAgIGlmIChjdXIubmV4dCkge1xuICAgICAgZmFpbChgY2Fubm90IGFkZCBzdWJmbG93IGFzIG5leHQgd2hlbiBuZXh0IGlzIGFscmVhZHkgZGVmaW5lZCBhdCAnJHtjdXIubmFtZX0nYCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3ViZmxvd05hbWUgPSBtb3VudE5hbWUgfHwgaWQ7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgc3ViZmxvd1Jlc29sdmVyOiByZXNvbHZlciBhcyBhbnksXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucykgbm9kZS5zdWJmbG93TW91bnRPcHRpb25zID0gb3B0aW9ucztcblxuICAgIC8vIExhenkgbW91bnQgc3R1Yi4gVGhlIGxhenkgc3ViZmxvdydzIGludGVybmFscyB3aWxsIGJlIHNoYXBlZCBhdFxuICAgIC8vIHJlc29sdXRpb24gdGltZS5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBpc0xhenk6IHRydWUsXG4gICAgfTtcblxuICAgIGNvbnN0IHBhcmVudFNwZWMgPSBjdXJTcGVjO1xuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgLy8gTDcuMyDigJQgTGF6eSBsaW5lYXItbW91bnQgc3ViZmxvdy5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KHBhcmVudFNwZWMsIGlkKTtcbiAgICB0aGlzLl9maXJlU3ViZmxvd01vdW50ZWQoaWQsIHN1YmZsb3dOYW1lLCBpZCwgdHJ1ZSk7XG5cbiAgICB0aGlzLl9zdGVwQ291bnRlcisrO1xuICAgIHRoaXMuX3N0YWdlU3RlcE1hcC5zZXQoaWQsIHRoaXMuX3N0ZXBDb3VudGVyKTtcbiAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2goYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiBbTGF6eSBTdWItRXhlY3V0aW9uOiAke3N1YmZsb3dOYW1lfV1gKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkU3ViRmxvd0NoYXJ0TmV4dChcbiAgICBpZDogc3RyaW5nLFxuICAgIHN1YmZsb3c6IEZsb3dDaGFydDxhbnksIGFueT4sXG4gICAgbW91bnROYW1lPzogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBTdWJmbG93TW91bnRPcHRpb25zLFxuICApOiB0aGlzIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG5cbiAgICBpZiAoY3VyLm5leHQpIHtcbiAgICAgIGZhaWwoYGNhbm5vdCBhZGQgc3ViZmxvdyBhcyBuZXh0IHdoZW4gbmV4dCBpcyBhbHJlYWR5IGRlZmluZWQgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuICAgIH1cblxuICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gbW91bnROYW1lIHx8IGlkO1xuICAgIGNvbnN0IHByZWZpeGVkUm9vdCA9IHRoaXMuX3ByZWZpeE5vZGVUcmVlKHN1YmZsb3cucm9vdCwgaWQpO1xuXG4gICAgaWYgKCF0aGlzLl9zdWJmbG93RGVmcy5oYXMoaWQpKSB7XG4gICAgICB0aGlzLl9zdWJmbG93RGVmcy5zZXQoaWQsIHsgcm9vdDogcHJlZml4ZWRSb290IH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucykgbm9kZS5zdWJmbG93TW91bnRPcHRpb25zID0gb3B0aW9ucztcblxuICAgIGNvbnN0IGF0dGFjaGVkU3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgc3ViZmxvd1N0cnVjdHVyZTogc3ViZmxvdy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgfTtcblxuICAgIGNvbnN0IHBhcmVudFNwZWMgPSBjdXJTcGVjO1xuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBhdHRhY2hlZFNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhhdHRhY2hlZFNwZWMpO1xuICAgIHRoaXMuX2tub3duU3RhZ2VJZHMuYWRkKGlkKTtcbiAgICAvLyBMNy4zIOKAlCBMaW5lYXItbW91bnQgc3ViZmxvdy5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChhdHRhY2hlZFNwZWMpO1xuICAgIHRoaXMuX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnQocGFyZW50U3BlYywgaWQpO1xuICAgIHRoaXMuX2ZpcmVTdWJmbG93TW91bnRlZChpZCwgc3ViZmxvd05hbWUsIGlkLCBmYWxzZSwgc3ViZmxvdy5idWlsZFRpbWVTdHJ1Y3R1cmUpO1xuXG4gICAgdGhpcy5fbWVyZ2VTdGFnZU1hcChzdWJmbG93LnN0YWdlTWFwLCBpZCk7XG4gICAgdGhpcy5fbWVyZ2VTdWJmbG93cyhzdWJmbG93LnN1YmZsb3dzLCBpZCk7XG4gICAgdGhpcy5fYXBwZW5kU3ViZmxvd0Rlc2NyaXB0aW9uKGlkLCBzdWJmbG93TmFtZSwgc3ViZmxvdyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBMb29wIOKUgOKUgFxuXG4gIGxvb3BUbyhzdGFnZUlkOiBzdHJpbmcpOiB0aGlzIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG5cbiAgICBpZiAoY3VyU3BlYy5sb29wVGFyZ2V0KSBmYWlsKGBsb29wVG8gYWxyZWFkeSBkZWZpbmVkIGF0ICcke2N1ci5uYW1lfSdgKTtcbiAgICBpZiAoY3VyLm5leHQpIGZhaWwoYGNhbm5vdCBzZXQgbG9vcFRvIHdoZW4gbmV4dCBpcyBhbHJlYWR5IGRlZmluZWQgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuXG4gICAgaWYgKCF0aGlzLl9rbm93blN0YWdlSWRzLmhhcyhzdGFnZUlkKSkge1xuICAgICAgZmFpbChgbG9vcFRvKCcke3N0YWdlSWR9JykgdGFyZ2V0IG5vdCBmb3VuZCDigJQgZGlkIHlvdSBwYXNzIGEgc3RhZ2UgbmFtZSBpbnN0ZWFkIG9mIGlkP2ApO1xuICAgIH1cblxuICAgIGN1ci5uZXh0ID0geyBuYW1lOiBzdGFnZUlkLCBpZDogc3RhZ2VJZCwgaXNMb29wUmVmOiB0cnVlIH07XG4gICAgY3VyU3BlYy5sb29wVGFyZ2V0ID0gc3RhZ2VJZDtcbiAgICBjdXJTcGVjLm5leHQgPSB7IG5hbWU6IHN0YWdlSWQsIGlkOiBzdGFnZUlkLCB0eXBlOiAnbG9vcCcsIGlzTG9vcFJlZmVyZW5jZTogdHJ1ZSB9O1xuXG4gICAgY29uc3QgdGFyZ2V0U3RlcCA9IHRoaXMuX3N0YWdlU3RlcE1hcC5nZXQoc3RhZ2VJZCk7XG4gICAgaWYgKHRhcmdldFN0ZXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGDihpIgbG9vcHMgYmFjayB0byBzdGVwICR7dGFyZ2V0U3RlcH1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGDihpIgbG9vcHMgYmFjayB0byAke3N0YWdlSWR9YCk7XG4gICAgfVxuXG4gICAgLy8gTDcuMyDigJQgRmlyZSB0aGUgbG9vcCBiYWNrLWVkZ2UgZXZlbnQuIERpc3RpbmN0IGZyb20gYG9uRWRnZUFkZGVkYFxuICAgIC8vIGJlY2F1c2UgcnVudGltZSBgb25Mb29wYCBjYXJyaWVzIGBpdGVyYXRpb246IG51bWJlcmAgd2hpY2ggaGFzIG5vXG4gICAgLy8gYnVpbGQgbWVhbmluZyDigJQgc2VwYXJhdGUgZXZlbnQga2VlcHMgcGF5bG9hZHMgaG9uZXN0LlxuICAgIHRoaXMuX2ZpcmVMb29wRWRnZUFkZGVkKGN1ci5pZCwgc3RhZ2VJZCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgU3RyZWFtaW5nIOKUgOKUgFxuXG4gIG9uU3RyZWFtKGhhbmRsZXI6IFN0cmVhbVRva2VuSGFuZGxlcik6IHRoaXMge1xuICAgIHRoaXMuX3N0cmVhbUhhbmRsZXJzLm9uVG9rZW4gPSBoYW5kbGVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb25TdHJlYW1TdGFydChoYW5kbGVyOiBTdHJlYW1MaWZlY3ljbGVIYW5kbGVyKTogdGhpcyB7XG4gICAgdGhpcy5fc3RyZWFtSGFuZGxlcnMub25TdGFydCA9IGhhbmRsZXI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvblN0cmVhbUVuZChoYW5kbGVyOiBTdHJlYW1MaWZlY3ljbGVIYW5kbGVyKTogdGhpcyB7XG4gICAgdGhpcy5fc3RyZWFtSGFuZGxlcnMub25FbmQgPSBoYW5kbGVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIE91dHB1dCDilIDilIBcblxuICBidWlsZCgpOiBSdW5uYWJsZUZsb3dDaGFydDxUT3V0LCBUU2NvcGU+IHtcbiAgICAvLyBMNy4zIOKAlCBzZWFsIHRoZSBjaGFydCBzbyBwb3N0LWJ1aWxkIGF0dGFjaGVzIHRocm93LiBQcmV2ZW50c1xuICAgIC8vIHJlY29yZGVycyBhdHRhY2hlZCBtaWQtZXhlY3V0aW9uIGZyb20gZ2V0dGluZyBwYXJ0aWFsIGRhdGEuXG4gICAgdGhpcy5fc2VhbGVkID0gdHJ1ZTtcblxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9yb290ID8/IGZhaWwoJ2VtcHR5IHRyZWU7IGNhbGwgc3RhcnQoKSBmaXJzdCcpO1xuICAgIGNvbnN0IHJvb3RTcGVjID0gdGhpcy5fcm9vdFNwZWMgPz8gZmFpbCgnZW1wdHkgc3BlYzsgY2FsbCBzdGFydCgpIGZpcnN0Jyk7XG5cbiAgICBjb25zdCBzdWJmbG93czogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiB0aGlzLl9zdWJmbG93RGVmcykge1xuICAgICAgc3ViZmxvd3Nba2V5XSA9IGRlZjtcbiAgICB9XG5cbiAgICBjb25zdCByb290TmFtZSA9IHRoaXMuX3Jvb3Q/Lm5hbWUgPz8gJ0Zsb3dDaGFydCc7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPVxuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5sZW5ndGggPiAwID8gYEZsb3dDaGFydDogJHtyb290TmFtZX1cXG5TdGVwczpcXG4ke3RoaXMuX2Rlc2NyaXB0aW9uUGFydHMuam9pbignXFxuJyl9YCA6ICcnO1xuXG4gICAgY29uc3QgY2hhcnQ6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgcm9vdCxcbiAgICAgIHN0YWdlTWFwOiB0aGlzLl9zdGFnZU1hcCxcbiAgICAgIGJ1aWxkVGltZVN0cnVjdHVyZTogcm9vdFNwZWMsXG4gICAgICAuLi4oT2JqZWN0LmtleXMoc3ViZmxvd3MpLmxlbmd0aCA+IDAgPyB7IHN1YmZsb3dzIH0gOiB7fSksXG4gICAgICAuLi4odGhpcy5fZW5hYmxlTmFycmF0aXZlID8geyBlbmFibGVOYXJyYXRpdmU6IHRydWUgfSA6IHt9KSxcbiAgICAgIC4uLih0aGlzLl9sb2dnZXIgPyB7IGxvZ2dlcjogdGhpcy5fbG9nZ2VyIH0gOiB7fSksXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIHN0YWdlRGVzY3JpcHRpb25zOiBuZXcgTWFwKHRoaXMuX3N0YWdlRGVzY3JpcHRpb25zKSxcbiAgICAgIC4uLih0aGlzLl9pbnB1dFNjaGVtYSA/IHsgaW5wdXRTY2hlbWE6IHRoaXMuX2lucHV0U2NoZW1hIH0gOiB7fSksXG4gICAgICAuLi4odGhpcy5fb3V0cHV0U2NoZW1hID8geyBvdXRwdXRTY2hlbWE6IHRoaXMuX291dHB1dFNjaGVtYSB9IDoge30pLFxuICAgICAgLi4uKHRoaXMuX291dHB1dE1hcHBlciA/IHsgb3V0cHV0TWFwcGVyOiB0aGlzLl9vdXRwdXRNYXBwZXIgfSA6IHt9KSxcbiAgICAgIC8vIEF1dG8tZW1iZWQgVHlwZWRTY29wZSBmYWN0b3J5IGlmIG5vbmUgd2FzIGV4cGxpY2l0bHkgc2V0LlxuICAgICAgLy8gVGhpcyBtZWFucyBBTlkgd2F5IG9mIGNyZWF0aW5nIGEgRmxvd0NoYXJ0QnVpbGRlciAoZmxvd0NoYXJ0KCksIG5ldyBGbG93Q2hhcnRCdWlsZGVyKCksXG4gICAgICAvLyBvciBhbnkgc3ViY2xhc3MpIGF1dG9tYXRpY2FsbHkgZ2V0cyBUeXBlZFNjb3BlIOKAlCBubyBtYW51YWwgc2V0U2NvcGVGYWN0b3J5IG5lZWRlZC5cbiAgICAgIHNjb3BlRmFjdG9yeTogdGhpcy5fc2NvcGVGYWN0b3J5ID8/IChjcmVhdGVUeXBlZFNjb3BlRmFjdG9yeSgpIGFzIHVua25vd24gYXMgU2NvcGVGYWN0b3J5PFRTY29wZT4pLFxuICAgIH07XG5cbiAgICByZXR1cm4gbWFrZVJ1bm5hYmxlKGNoYXJ0KTtcbiAgfVxuXG4gIC8qKiBPdmVycmlkZSB0aGUgc2NvcGUgZmFjdG9yeS4gUmFyZWx5IG5lZWRlZCDigJQgYXV0by1lbWJlZHMgVHlwZWRTY29wZSBieSBkZWZhdWx0LiAqL1xuICBzZXRTY29wZUZhY3RvcnkoZmFjdG9yeTogU2NvcGVGYWN0b3J5PFRTY29wZT4pOiB0aGlzIHtcbiAgICB0aGlzLl9zY29wZUZhY3RvcnkgPSBmYWN0b3J5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdG9TcGVjPFRSZXN1bHQgPSBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmU+KCk6IFRSZXN1bHQge1xuICAgIGNvbnN0IHJvb3RTcGVjID0gdGhpcy5fcm9vdFNwZWMgPz8gZmFpbCgnZW1wdHkgdHJlZTsgY2FsbCBzdGFydCgpIGZpcnN0Jyk7XG4gICAgcmV0dXJuIHJvb3RTcGVjIGFzIFRSZXN1bHQ7XG4gIH1cblxuICB0b01lcm1haWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbJ2Zsb3djaGFydCBURCddO1xuICAgIGNvbnN0IGlkT2YgPSAoazogc3RyaW5nKSA9PiAoayB8fCAnJykucmVwbGFjZSgvW15hLXpBLVowLTlfXS9nLCAnXycpIHx8ICdfJztcbiAgICBjb25zdCByb290ID0gdGhpcy5fcm9vdCA/PyBmYWlsKCdlbXB0eSB0cmVlOyBjYWxsIHN0YXJ0KCkgZmlyc3QnKTtcblxuICAgIGNvbnN0IHdhbGsgPSAobjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pID0+IHtcbiAgICAgIGNvbnN0IG5pZCA9IGlkT2Yobi5pZCk7XG4gICAgICBsaW5lcy5wdXNoKGAke25pZH1bXCIke24ubmFtZX1cIl1gKTtcbiAgICAgIGZvciAoY29uc3QgYyBvZiBuLmNoaWxkcmVuIHx8IFtdKSB7XG4gICAgICAgIGNvbnN0IGNpZCA9IGlkT2YoYy5pZCk7XG4gICAgICAgIGxpbmVzLnB1c2goYCR7bmlkfSAtLT4gJHtjaWR9YCk7XG4gICAgICAgIHdhbGsoYyk7XG4gICAgICB9XG4gICAgICBpZiAobi5uZXh0KSB7XG4gICAgICAgIGNvbnN0IG1pZCA9IGlkT2Yobi5uZXh0LmlkKTtcbiAgICAgICAgbGluZXMucHVzaChgJHtuaWR9IC0tPiAke21pZH1gKTtcbiAgICAgICAgd2FsayhuLm5leHQpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2Fsayhyb290KTtcbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvLyDilIDilIAgSW50ZXJuYWxzIChleHBvc2VkIGZvciBoZWxwZXIgY2xhc3Nlcykg4pSA4pSAXG5cbiAgcHJpdmF0ZSBfbmVlZEN1cnNvcigpOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnNvciA/PyBmYWlsKCdjdXJzb3IgdW5kZWZpbmVkOyBjYWxsIHN0YXJ0KCkgZmlyc3QnKTtcbiAgfVxuXG4gIHByaXZhdGUgX25lZWRDdXJzb3JTcGVjKCk6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnNvclNwZWMgPz8gZmFpbCgnY3Vyc29yIHVuZGVmaW5lZDsgY2FsbCBzdGFydCgpIGZpcnN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogQWR2YW5jZSB0aGUgc3BlYyBjdXJzb3IuIFJldGFpbmVkIGFzIGEgbWV0aG9kIHNvIGNhbGwgc2l0ZXMgc3RheVxuICAgKiBvbmUtbGluZXJzIGFuZCBmdXR1cmUgY3Vyc29yLXJlbGF0ZWQgc2lkZSBlZmZlY3RzIGhhdmUgYSBob29rLlxuICAgKi9cbiAgcHJpdmF0ZSBfYWR2YW5jZUN1cnNvclNwZWMobmV3U3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5fY3Vyc29yU3BlYyA9IG5ld1NwZWM7XG4gIH1cblxuICBfc3RhZ2VNYXBIYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VNYXAuaGFzKGtleSk7XG4gIH1cblxuICBfYWRkVG9NYXAoaWQ6IHN0cmluZywgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPikge1xuICAgIGlmICh0aGlzLl9zdGFnZU1hcC5oYXMoaWQpKSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuX3N0YWdlTWFwLmdldChpZCk7XG4gICAgICBpZiAoZXhpc3RpbmcgIT09IGZuKSBmYWlsKGBzdGFnZU1hcCBjb2xsaXNpb24gZm9yIGlkICcke2lkfSdgKTtcbiAgICB9XG4gICAgdGhpcy5fc3RhZ2VNYXAuc2V0KGlkLCBmbik7XG4gIH1cblxuICBfbWVyZ2VTdGFnZU1hcChvdGhlcjogTWFwPHN0cmluZywgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+PiwgcHJlZml4Pzogc3RyaW5nKSB7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2Ygb3RoZXIpIHtcbiAgICAgIGNvbnN0IGtleSA9IHByZWZpeCA/IGAke3ByZWZpeH0vJHtrfWAgOiBrO1xuICAgICAgaWYgKHRoaXMuX3N0YWdlTWFwLmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5fc3RhZ2VNYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmIChleGlzdGluZyAhPT0gdikgZmFpbChgc3RhZ2VNYXAgY29sbGlzaW9uIHdoaWxlIG1vdW50aW5nIGZsb3djaGFydCBhdCAnJHtrZXl9J2ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc3RhZ2VNYXAuc2V0KGtleSwgdik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX3ByZWZpeE5vZGVUcmVlKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBwcmVmaXg6IHN0cmluZyk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHtcbiAgICBpZiAoIW5vZGUpIHJldHVybiBub2RlO1xuICAgIGNvbnN0IGNsb25lOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgLi4ubm9kZSB9O1xuICAgIGNsb25lLm5hbWUgPSBgJHtwcmVmaXh9LyR7bm9kZS5uYW1lfWA7XG4gICAgY2xvbmUuaWQgPSBgJHtwcmVmaXh9LyR7bm9kZS5pZH1gO1xuICAgIGlmIChjbG9uZS5zdWJmbG93SWQpIGNsb25lLnN1YmZsb3dJZCA9IGAke3ByZWZpeH0vJHtjbG9uZS5zdWJmbG93SWR9YDtcbiAgICBpZiAoY2xvbmUubmV4dCkgY2xvbmUubmV4dCA9IHRoaXMuX3ByZWZpeE5vZGVUcmVlKGNsb25lLm5leHQsIHByZWZpeCk7XG4gICAgaWYgKGNsb25lLmNoaWxkcmVuKSB7XG4gICAgICBjbG9uZS5jaGlsZHJlbiA9IGNsb25lLmNoaWxkcmVuLm1hcCgoYykgPT4gdGhpcy5fcHJlZml4Tm9kZVRyZWUoYywgcHJlZml4KSk7XG4gICAgfVxuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuXG4gIF9tZXJnZVN1YmZsb3dzKHN1YmZsb3dzOiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+IHwgdW5kZWZpbmVkLCBwcmVmaXg6IHN0cmluZykge1xuICAgIGlmICghc3ViZmxvd3MpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGRlZl0gb2YgT2JqZWN0LmVudHJpZXMoc3ViZmxvd3MpKSB7XG4gICAgICBjb25zdCBwcmVmaXhlZEtleSA9IGAke3ByZWZpeH0vJHtrZXl9YDtcbiAgICAgIGlmICghdGhpcy5fc3ViZmxvd0RlZnMuaGFzKHByZWZpeGVkS2V5KSkge1xuICAgICAgICB0aGlzLl9zdWJmbG93RGVmcy5zZXQocHJlZml4ZWRLZXksIHtcbiAgICAgICAgICByb290OiB0aGlzLl9wcmVmaXhOb2RlVHJlZShkZWYucm9vdCBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgcHJlZml4KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRmFjdG9yeSBGdW5jdGlvblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8vIE92ZXJsb2FkIDE6IHR5cGVkIHN0YXRlIHdpdGggb3B0aW9ucyBvYmplY3QuXG5leHBvcnQgZnVuY3Rpb24gZmxvd0NoYXJ0PFRTdGF0ZSBleHRlbmRzIG9iamVjdD4oXG4gIG5hbWU6IHN0cmluZyxcbiAgZm46IFR5cGVkU3RhZ2VGdW5jdGlvbjxUU3RhdGU+IHwgUGF1c2FibGVIYW5kbGVyPFR5cGVkU2NvcGU8VFN0YXRlPj4sXG4gIGlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBGbG93Q2hhcnRPcHRpb25zLFxuKTogRmxvd0NoYXJ0QnVpbGRlcjxhbnksIFR5cGVkU2NvcGU8VFN0YXRlPj47XG5cbi8vIE92ZXJsb2FkIDI6IGV4cGxpY2l0IGdlbmVyaWNzIHdpdGggb3B0aW9ucyBvYmplY3QuXG5leHBvcnQgZnVuY3Rpb24gZmxvd0NoYXJ0PFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4oXG4gIG5hbWU6IHN0cmluZyxcbiAgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB8IFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+LFxuICBpZDogc3RyaW5nLFxuICBvcHRpb25zPzogRmxvd0NoYXJ0T3B0aW9ucyxcbik6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPjtcblxuLy8gU2luZ2xlIGltcGxlbWVudGF0aW9uIOKAlCBhY2NlcHRzIHRoZSBvcHRpb25zIGJhZyAob3IgdW5kZWZpbmVkKS5cbmV4cG9ydCBmdW5jdGlvbiBmbG93Q2hhcnQ8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PihcbiAgbmFtZTogc3RyaW5nLFxuICBmbjogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+IHwgUGF1c2FibGVIYW5kbGVyPFRTY29wZT4sXG4gIGlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBGbG93Q2hhcnRPcHRpb25zLFxuKTogRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+IHtcbiAgY29uc3QgYnVpbGRlciA9IG5ldyBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4oKTtcbiAgLy8gQXR0YWNoIFN0cnVjdHVyZVJlY29yZGVycyBCRUZPUkUgc3RhcnQoKSBzbyB0aGUgc2VlZCBldmVudCBmaXJlcyB0aHJvdWdoXG4gIC8vIHRoZSBub3JtYWwgZGlzcGF0Y2hlciBwYXRoIChubyByZXBsYXkgbmVlZGVkKS4gSXRlcmF0aW9uIG9yZGVyIG1hdGNoZXNcbiAgLy8gYXJyYXkgb3JkZXIsIG1hdGNoaW5nIHRoZSBmbHVlbnQgYC5hdHRhY2hTdHJ1Y3R1cmVSZWNvcmRlcigpYCBjaGFpblxuICAvLyBzZW1hbnRpY3MuXG4gIGlmIChvcHRpb25zPy5zdHJ1Y3R1cmVSZWNvcmRlcnMpIHtcbiAgICBmb3IgKGNvbnN0IHJlYyBvZiBvcHRpb25zLnN0cnVjdHVyZVJlY29yZGVycykge1xuICAgICAgYnVpbGRlci5hdHRhY2hTdHJ1Y3R1cmVSZWNvcmRlcihyZWMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYnVpbGRlci5zdGFydChuYW1lLCBmbiBhcyBhbnksIGlkLCBvcHRpb25zPy5kZXNjcmlwdGlvbik7XG59XG5cbi8qKlxuICogTGlrZSBgZmxvd0NoYXJ0KClgLCBidXQgdGhlIFJPT1Qgc3RhZ2UgaXMgYSBTRUxFQ1RPUiDigJQgaXQgcnVucyBmaXJzdCBhbmRcbiAqIGl0cyBicmFuY2hlcyBhdHRhY2ggZGlyZWN0bHkgdG8gaXQgKG5vIHNlcGFyYXRlIHNlZWQgc3RhZ2UpLiBSZXR1cm5zIGFcbiAqIGBTZWxlY3RvckZuTGlzdGA7IGRlY2xhcmUgYnJhbmNoZXMgdGhlbiBjYWxsIGAuZW5kKClgIHRvIGdldCB0aGUgYnVpbGRlclxuICogYmFjayBmb3IgYW55IHN1YnNlcXVlbnQgc3RhZ2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIGZsb3dDaGFydFNlbGVjdG9yPE15U3RhdGU+KCdDb250ZXh0JywgY29udGV4dFNlbGVjdG9yRm4sICdjb250ZXh0JylcbiAqICAgICAuYWRkU3ViRmxvd0NoYXJ0QnJhbmNoKCdzZi1zeXN0ZW0tcHJvbXB0Jywgc3lzU2xvdCwgJ1N5c3RlbSBQcm9tcHQnLCB7Li4ufSlcbiAqICAgICAuYWRkU3ViRmxvd0NoYXJ0QnJhbmNoKCdzZi1tZXNzYWdlcycsIG1zZ1Nsb3QsICdNZXNzYWdlcycsIHsuLi59KVxuICogICAgIC5lbmQoKVxuICogICAgIC5hZGRGdW5jdGlvbignbWVzc2FnZUFQSScsIGFzc2VtYmxlRm4sICdtZXNzYWdlLWFwaScpXG4gKiAgICAgLmJ1aWxkKCk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbG93Q2hhcnRTZWxlY3RvcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+KFxuICBuYW1lOiBzdHJpbmcsXG4gIGZuOiBTdGFnZUZ1bmN0aW9uPGFueSwgVFNjb3BlPixcbiAgaWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IEZsb3dDaGFydE9wdGlvbnMsXG4pOiBTZWxlY3RvckZuTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgY29uc3QgYnVpbGRlciA9IG5ldyBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4oKTtcbiAgaWYgKG9wdGlvbnM/LnN0cnVjdHVyZVJlY29yZGVycykge1xuICAgIGZvciAoY29uc3QgcmVjIG9mIG9wdGlvbnMuc3RydWN0dXJlUmVjb3JkZXJzKSB7XG4gICAgICBidWlsZGVyLmF0dGFjaFN0cnVjdHVyZVJlY29yZGVyKHJlYyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBidWlsZGVyLnN0YXJ0U2VsZWN0b3IobmFtZSwgZm4sIGlkLCBvcHRpb25zPy5kZXNjcmlwdGlvbiwge1xuICAgIC4uLihvcHRpb25zPy5mYWlsRmFzdCAhPT0gdW5kZWZpbmVkICYmIHsgZmFpbEZhc3Q6IG9wdGlvbnMuZmFpbEZhc3QgfSksXG4gIH0pO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFNwZWMgdG8gU3RhZ2VOb2RlIENvbnZlcnRlclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBmdW5jdGlvbiBzcGVjVG9TdGFnZU5vZGUoc3BlYzogRmxvd0NoYXJ0U3BlYyk6IFN0YWdlTm9kZTxhbnksIGFueT4ge1xuICBjb25zdCBpbmZsYXRlID0gKHM6IEZsb3dDaGFydFNwZWMpOiBTdGFnZU5vZGU8YW55LCBhbnk+ID0+ICh7XG4gICAgbmFtZTogcy5uYW1lLFxuICAgIGlkOiBzLmlkLFxuICAgIGNoaWxkcmVuOiBzLmNoaWxkcmVuPy5sZW5ndGggPyBzLmNoaWxkcmVuLm1hcChpbmZsYXRlKSA6IHVuZGVmaW5lZCxcbiAgICBuZXh0OiBzLm5leHQgPyBpbmZsYXRlKHMubmV4dCkgOiB1bmRlZmluZWQsXG4gIH0pO1xuICByZXR1cm4gaW5mbGF0ZShzcGVjKTtcbn1cbiJdfQ==