@whereby.com/camera-effects 1.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. package/dist/index.cjs +14 -2
  2. package/dist/index.mjs +14 -2
  3. package/dist/legacy-esm.js +14 -2
  4. package/package.json +3 -3
  5. /package/dist/cdn/{v1-1-0 → v1-1-1}/assets/backgrounds/brick-720p.jpg +0 -0
  6. /package/dist/cdn/{v1-1-0 → v1-1-1}/assets/backgrounds/bubbles.mp4 +0 -0
  7. /package/dist/cdn/{v1-1-0 → v1-1-1}/assets/backgrounds/cabin-720p.jpg +0 -0
  8. /package/dist/cdn/{v1-1-0 → v1-1-1}/assets/backgrounds/clay-720p.jpg +0 -0
  9. /package/dist/cdn/{v1-1-0 → v1-1-1}/assets/backgrounds/concrete-720p.jpg +0 -0
  10. /package/dist/cdn/{v1-1-0 → v1-1-1}/assets/backgrounds/day-720p.png +0 -0
  11. /package/dist/cdn/{v1-1-0 → v1-1-1}/assets/backgrounds/focus-720p.jpg +0 -0
  12. /package/dist/cdn/{v1-1-0 → v1-1-1}/assets/backgrounds/glow-720p.jpg +0 -0
  13. /package/dist/cdn/{v1-1-0 → v1-1-1}/assets/backgrounds/haven-720p.jpg +0 -0
  14. /package/dist/cdn/{v1-1-0 → v1-1-1}/assets/backgrounds/neon.mp4 +0 -0
  15. /package/dist/cdn/{v1-1-0 → v1-1-1}/assets/backgrounds/night-720p.png +0 -0
  16. /package/dist/cdn/{v1-1-0 → v1-1-1}/assets/backgrounds/pulse-720p.jpg +0 -0
  17. /package/dist/cdn/{v1-1-0 → v1-1-1}/assets/backgrounds/studio-720p.jpg +0 -0
  18. /package/dist/cdn/{v1-1-0 → v1-1-1}/assets/backgrounds/sunrise-720p.png +0 -0
  19. /package/dist/cdn/{v1-1-0 → v1-1-1}/assets/tflite/models/segm_full_v679.tflite +0 -0
  20. /package/dist/cdn/{v1-1-0 → v1-1-1}/assets/tflite/models/segm_lite_v681.tflite +0 -0
  21. /package/dist/cdn/{v1-1-0 → v1-1-1}/assets/tflite/models/selfiesegmentation_mlkit-256x256-2021_01_19-v1215.f16.tflite +0 -0
  22. /package/dist/cdn/{v1-1-0 → v1-1-1}/assets/tflite/tflite-simd.wasm +0 -0
  23. /package/dist/cdn/{v1-1-0 → v1-1-1}/assets/tflite/tflite.wasm +0 -0
package/dist/index.cjs CHANGED
@@ -646,7 +646,7 @@ function createCanvas(width, height) {
646
646
  }
647
647
  }
648
648
 
649
- const CDN_BASE_URL = "https://cdn.srv.whereby.com/camera-effects/v1-1-0";
649
+ const CDN_BASE_URL = "https://cdn.srv.whereby.com/camera-effects/v1-1-1";
650
650
  const getAssetUrl = (path) => {
651
651
  {
652
652
  return `${CDN_BASE_URL}/${path}`;
@@ -1611,6 +1611,7 @@ class Processor extends eventsExports.EventEmitter {
1611
1611
  this.params = params;
1612
1612
  this.videoWidth = videoWidth;
1613
1613
  this.videoHeight = videoHeight;
1614
+ this.status = "new";
1614
1615
  if (emit)
1615
1616
  this.emit = emit;
1616
1617
  }
@@ -1633,12 +1634,22 @@ class Processor extends eventsExports.EventEmitter {
1633
1634
  const oldBackgroundFrame = this.currentBackgroundFrame;
1634
1635
  this.currentBackgroundFrame = null;
1635
1636
  const oldEngine = this.engine;
1637
+ if (this.status === "new") {
1638
+ console.warn("Video size updated before engine was initialized.");
1639
+ this.videoWidth = videoWidth;
1640
+ this.videoHeight = videoHeight;
1641
+ return;
1642
+ }
1643
+ if (this.status === "init") {
1644
+ console.warn("Video size updated while engine was initializating.");
1645
+ }
1636
1646
  yield this.setupEngine(videoWidth, videoHeight, this.effectCanvas, oldBackgroundFrame);
1637
1647
  oldEngine.dispose();
1638
1648
  });
1639
1649
  }
1640
1650
  init(_a) {
1641
1651
  return __awaiter(this, arguments, void 0, function* ({ initialBackgroundFrame, useInsertableStreams, effectCanvas }) {
1652
+ this.status = "init";
1642
1653
  yield this.setupEngine(this.videoWidth, this.videoHeight, effectCanvas, initialBackgroundFrame);
1643
1654
  if (useInsertableStreams) {
1644
1655
  let dropFirst = 5;
@@ -1686,6 +1697,7 @@ class Processor extends eventsExports.EventEmitter {
1686
1697
  this.emit("output", { frame: this.currentOutputFrame }, [this.currentOutputFrame]);
1687
1698
  });
1688
1699
  }
1700
+ this.status = "ready";
1689
1701
  this.emit("ready");
1690
1702
  });
1691
1703
  }
@@ -1852,7 +1864,7 @@ class ProcessorProxy extends eventsExports.EventEmitter {
1852
1864
  }
1853
1865
  }
1854
1866
 
1855
- var WorkerFactory = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKHdhc21GZWF0dXJlRGV0ZWN0KSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgdmFyIF9kb2N1bWVudEN1cnJlbnRTY3JpcHQgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gZG9jdW1lbnQuY3VycmVudFNjcmlwdCA6IG51bGw7CiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uDQoNCiAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkNCiAgICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuDQoNCiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSA0KICAgIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQ0KICAgIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwNCiAgICBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00NCiAgICBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUg0KICAgIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1INCiAgICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLg0KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQogICAgLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqLw0KDQoNCiAgICBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7DQogICAgICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfQ0KICAgICAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsNCiAgICAgICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0NCiAgICAgICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yWyJ0aHJvdyJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0NCiAgICAgICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9DQogICAgICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7DQogICAgICAgIH0pOw0KICAgIH0NCg0KICAgIHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09ICJmdW5jdGlvbiIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHsNCiAgICAgICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7DQogICAgICAgIHJldHVybiBlLm5hbWUgPSAiU3VwcHJlc3NlZEVycm9yIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlOw0KICAgIH07CgogICAgdmFyIGV2ZW50cyA9IHtleHBvcnRzOiB7fX07CgogICAgdmFyIFIgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgPyBSZWZsZWN0IDogbnVsbDsKICAgIHZhciBSZWZsZWN0QXBwbHkgPSBSICYmIHR5cGVvZiBSLmFwcGx5ID09PSAnZnVuY3Rpb24nCiAgICAgID8gUi5hcHBseQogICAgICA6IGZ1bmN0aW9uIFJlZmxlY3RBcHBseSh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKSB7CiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpOwogICAgICB9OwoKICAgIHZhciBSZWZsZWN0T3duS2V5czsKICAgIGlmIChSICYmIHR5cGVvZiBSLm93bktleXMgPT09ICdmdW5jdGlvbicpIHsKICAgICAgUmVmbGVjdE93bktleXMgPSBSLm93bktleXM7CiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgICAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KQogICAgICAgICAgLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkpOwogICAgICB9OwogICAgfSBlbHNlIHsKICAgICAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBQcm9jZXNzRW1pdFdhcm5pbmcod2FybmluZykgewogICAgICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIGNvbnNvbGUud2Fybih3YXJuaW5nKTsKICAgIH0KCiAgICB2YXIgTnVtYmVySXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gTnVtYmVySXNOYU4odmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTsKICAgIH07CgogICAgZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkgewogICAgICBFdmVudEVtaXR0ZXIuaW5pdC5jYWxsKHRoaXMpOwogICAgfQogICAgZXZlbnRzLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7CiAgICBldmVudHMuZXhwb3J0cy5vbmNlID0gb25jZTsKCiAgICAvLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLngKICAgIEV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkOwogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzQ291bnQgPSAwOwogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkOwoKICAgIC8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZQogICAgLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy4KICAgIHZhciBkZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7CgogICAgZnVuY3Rpb24gY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcikgewogICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgbGlzdGVuZXIpOwogICAgICB9CiAgICB9CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50RW1pdHRlciwgJ2RlZmF1bHRNYXhMaXN0ZW5lcnMnLCB7CiAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGRlZmF1bHRNYXhMaXN0ZW5lcnM7CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24oYXJnKSB7CiAgICAgICAgaWYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInIHx8IGFyZyA8IDAgfHwgTnVtYmVySXNOYU4oYXJnKSkgewogICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiAiZGVmYXVsdE1heExpc3RlbmVycyIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIGFyZyArICcuJyk7CiAgICAgICAgfQogICAgICAgIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSBhcmc7CiAgICAgIH0KICAgIH0pOwoKICAgIEV2ZW50RW1pdHRlci5pbml0ID0gZnVuY3Rpb24oKSB7CgogICAgICBpZiAodGhpcy5fZXZlbnRzID09PSB1bmRlZmluZWQgfHwKICAgICAgICAgIHRoaXMuX2V2ZW50cyA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpIHsKICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgfQoKICAgICAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDsKICAgIH07CgogICAgLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzCiAgICAvLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC4KICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHsKICAgICAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCB8fCBOdW1iZXJJc05hTihuKSkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgIm4iIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBuICsgJy4nKTsKICAgICAgfQogICAgICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuOwogICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgZnVuY3Rpb24gX2dldE1heExpc3RlbmVycyh0aGF0KSB7CiAgICAgIGlmICh0aGF0Ll9tYXhMaXN0ZW5lcnMgPT09IHVuZGVmaW5lZCkKICAgICAgICByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7CiAgICAgIHJldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7CiAgICB9CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKSB7CiAgICAgIHJldHVybiBfZ2V0TWF4TGlzdGVuZXJzKHRoaXMpOwogICAgfTsKCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KHR5cGUpIHsKICAgICAgdmFyIGFyZ3MgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwogICAgICB2YXIgZG9FcnJvciA9ICh0eXBlID09PSAnZXJyb3InKTsKCiAgICAgIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7CiAgICAgIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkKICAgICAgICBkb0Vycm9yID0gKGRvRXJyb3IgJiYgZXZlbnRzLmVycm9yID09PSB1bmRlZmluZWQpOwogICAgICBlbHNlIGlmICghZG9FcnJvcikKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuCiAgICAgIGlmIChkb0Vycm9yKSB7CiAgICAgICAgdmFyIGVyOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApCiAgICAgICAgICBlciA9IGFyZ3NbMF07CiAgICAgICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHsKICAgICAgICAgIC8vIE5vdGU6IFRoZSBjb21tZW50cyBvbiB0aGUgYHRocm93YCBsaW5lcyBhcmUgaW50ZW50aW9uYWwsIHRoZXkgc2hvdwogICAgICAgICAgLy8gdXAgaW4gTm9kZSdzIG91dHB1dCBpZiB0aGlzIHJlc3VsdHMgaW4gYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi4KICAgICAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudAogICAgICAgIH0KICAgICAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyCiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5oYW5kbGVkIGVycm9yLicgKyAoZXIgPyAnICgnICsgZXIubWVzc2FnZSArICcpJyA6ICcnKSk7CiAgICAgICAgZXJyLmNvbnRleHQgPSBlcjsKICAgICAgICB0aHJvdyBlcnI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50CiAgICAgIH0KCiAgICAgIHZhciBoYW5kbGVyID0gZXZlbnRzW3R5cGVdOwoKICAgICAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZCkKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBSZWZsZWN0QXBwbHkoaGFuZGxlciwgdGhpcywgYXJncyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoOwogICAgICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkKICAgICAgICAgIFJlZmxlY3RBcHBseShsaXN0ZW5lcnNbaV0sIHRoaXMsIGFyZ3MpOwogICAgICB9CgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH07CgogICAgZnVuY3Rpb24gX2FkZExpc3RlbmVyKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIHByZXBlbmQpIHsKICAgICAgdmFyIG07CiAgICAgIHZhciBldmVudHM7CiAgICAgIHZhciBleGlzdGluZzsKCiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwoKICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7CiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICB0YXJnZXQuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSAibmV3TGlzdGVuZXIiISBCZWZvcmUKICAgICAgICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCAibmV3TGlzdGVuZXIiLgogICAgICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgdGFyZ2V0LmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyID8gbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7CgogICAgICAgICAgLy8gUmUtYXNzaWduIGBldmVudHNgIGJlY2F1c2UgYSBuZXdMaXN0ZW5lciBoYW5kbGVyIGNvdWxkIGhhdmUgY2F1c2VkIHRoZQogICAgICAgICAgLy8gdGhpcy5fZXZlbnRzIHRvIGJlIGFzc2lnbmVkIHRvIGEgbmV3IG9iamVjdAogICAgICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7CiAgICAgICAgfQogICAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdOwogICAgICB9CgogICAgICBpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCkgewogICAgICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LgogICAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7CiAgICAgICAgKyt0YXJnZXQuX2V2ZW50c0NvdW50OwogICAgICB9IGVsc2UgewogICAgICAgIGlmICh0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LgogICAgICAgICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPQogICAgICAgICAgICBwcmVwZW5kID8gW2xpc3RlbmVyLCBleGlzdGluZ10gOiBbZXhpc3RpbmcsIGxpc3RlbmVyXTsKICAgICAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC4KICAgICAgICB9IGVsc2UgaWYgKHByZXBlbmQpIHsKICAgICAgICAgIGV4aXN0aW5nLnVuc2hpZnQobGlzdGVuZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBleGlzdGluZy5wdXNoKGxpc3RlbmVyKTsKICAgICAgICB9CgogICAgICAgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrCiAgICAgICAgbSA9IF9nZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTsKICAgICAgICBpZiAobSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSAmJiAhZXhpc3Rpbmcud2FybmVkKSB7CiAgICAgICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlOwogICAgICAgICAgLy8gTm8gZXJyb3IgY29kZSBmb3IgdGhpcyBzaW5jZSBpdCBpcyBhIFdhcm5pbmcKICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheAogICAgICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmxlbmd0aCArICcgJyArIFN0cmluZyh0eXBlKSArICcgbGlzdGVuZXJzICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jcmVhc2UgbGltaXQnKTsKICAgICAgICAgIHcubmFtZSA9ICdNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmcnOwogICAgICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0OwogICAgICAgICAgdy50eXBlID0gdHlwZTsKICAgICAgICAgIHcuY291bnQgPSBleGlzdGluZy5sZW5ndGg7CiAgICAgICAgICBQcm9jZXNzRW1pdFdhcm5pbmcodyk7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiBhZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikgewogICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7CiAgICB9OwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyOwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyID0KICAgICAgICBmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHsKICAgICAgICAgIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIHRydWUpOwogICAgICAgIH07CgogICAgZnVuY3Rpb24gb25jZVdyYXBwZXIoKSB7CiAgICAgIGlmICghdGhpcy5maXJlZCkgewogICAgICAgIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSwgdGhpcy53cmFwRm4pOwogICAgICAgIHRoaXMuZmlyZWQgPSB0cnVlOwogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKQogICAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk7CiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsIGFyZ3VtZW50cyk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikgewogICAgICB2YXIgc3RhdGUgPSB7IGZpcmVkOiBmYWxzZSwgd3JhcEZuOiB1bmRlZmluZWQsIHRhcmdldDogdGFyZ2V0LCB0eXBlOiB0eXBlLCBsaXN0ZW5lcjogbGlzdGVuZXIgfTsKICAgICAgdmFyIHdyYXBwZWQgPSBvbmNlV3JhcHBlci5iaW5kKHN0YXRlKTsKICAgICAgd3JhcHBlZC5saXN0ZW5lciA9IGxpc3RlbmVyOwogICAgICBzdGF0ZS53cmFwRm4gPSB3cmFwcGVkOwogICAgICByZXR1cm4gd3JhcHBlZDsKICAgIH0KCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7CiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwogICAgICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpOwogICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyID0KICAgICAgICBmdW5jdGlvbiBwcmVwZW5kT25jZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7CiAgICAgICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTsKICAgICAgICAgIHRoaXMucHJlcGVuZExpc3RlbmVyKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpOwogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKCiAgICAvLyBFbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkLgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9CiAgICAgICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHsKICAgICAgICAgIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyOwoKICAgICAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwoKICAgICAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50czsKICAgICAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CgogICAgICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTsKICAgICAgICAgIGlmIChsaXN0ID09PSB1bmRlZmluZWQpCiAgICAgICAgICAgIHJldHVybiB0aGlzOwoKICAgICAgICAgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikgewogICAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMCkKICAgICAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdOwogICAgICAgICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpCiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdC5saXN0ZW5lciB8fCBsaXN0ZW5lcik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgcG9zaXRpb24gPSAtMTsKCiAgICAgICAgICAgIGZvciAoaSA9IGxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHwgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHsKICAgICAgICAgICAgICAgIG9yaWdpbmFsTGlzdGVuZXIgPSBsaXN0W2ldLmxpc3RlbmVyOwogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocG9zaXRpb24gPCAwKQogICAgICAgICAgICAgIHJldHVybiB0aGlzOwoKICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09PSAwKQogICAgICAgICAgICAgIGxpc3Quc2hpZnQoKTsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgc3BsaWNlT25lKGxpc3QsIHBvc2l0aW9uKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKQogICAgICAgICAgICAgIGV2ZW50c1t0eXBlXSA9IGxpc3RbMF07CgogICAgICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpCiAgICAgICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpOwogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyOwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0KICAgICAgICBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkgewogICAgICAgICAgdmFyIGxpc3RlbmVycywgZXZlbnRzLCBpOwoKICAgICAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50czsKICAgICAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CgogICAgICAgICAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdAogICAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzW3R5cGVdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMCkKICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHMKICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRzKTsKICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICBrZXkgPSBrZXlzW2ldOwogICAgICAgICAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlOwogICAgICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7CiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICB9CgogICAgICAgICAgbGlzdGVuZXJzID0gZXZlbnRzW3R5cGVdOwoKICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTsKICAgICAgICAgIH0gZWxzZSBpZiAobGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgLy8gTElGTyBvcmRlcgogICAgICAgICAgICBmb3IgKGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwoKICAgIGZ1bmN0aW9uIF9saXN0ZW5lcnModGFyZ2V0LCB0eXBlLCB1bndyYXApIHsKICAgICAgdmFyIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzOwoKICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKQogICAgICAgIHJldHVybiBbXTsKCiAgICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdOwogICAgICBpZiAoZXZsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKQogICAgICAgIHJldHVybiBbXTsKCiAgICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykKICAgICAgICByZXR1cm4gdW53cmFwID8gW2V2bGlzdGVuZXIubGlzdGVuZXIgfHwgZXZsaXN0ZW5lcl0gOiBbZXZsaXN0ZW5lcl07CgogICAgICByZXR1cm4gdW53cmFwID8KICAgICAgICB1bndyYXBMaXN0ZW5lcnMoZXZsaXN0ZW5lcikgOiBhcnJheUNsb25lKGV2bGlzdGVuZXIsIGV2bGlzdGVuZXIubGVuZ3RoKTsKICAgIH0KCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7CiAgICAgIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIHRydWUpOwogICAgfTsKCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJhd0xpc3RlbmVycyA9IGZ1bmN0aW9uIHJhd0xpc3RlbmVycyh0eXBlKSB7CiAgICAgIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIGZhbHNlKTsKICAgIH07CgogICAgRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7CiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbGlzdGVuZXJDb3VudC5jYWxsKGVtaXR0ZXIsIHR5cGUpOwogICAgICB9CiAgICB9OwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7CiAgICBmdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHsKICAgICAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50czsKCiAgICAgIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdOwoKICAgICAgICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0gZWxzZSBpZiAoZXZsaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkgewogICAgICByZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQgPiAwID8gUmVmbGVjdE93bktleXModGhpcy5fZXZlbnRzKSA6IFtdOwogICAgfTsKCiAgICBmdW5jdGlvbiBhcnJheUNsb25lKGFyciwgbikgewogICAgICB2YXIgY29weSA9IG5ldyBBcnJheShuKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpCiAgICAgICAgY29weVtpXSA9IGFycltpXTsKICAgICAgcmV0dXJuIGNvcHk7CiAgICB9CgogICAgZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7CiAgICAgIGZvciAoOyBpbmRleCArIDEgPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKykKICAgICAgICBsaXN0W2luZGV4XSA9IGxpc3RbaW5kZXggKyAxXTsKICAgICAgbGlzdC5wb3AoKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1bndyYXBMaXN0ZW5lcnMoYXJyKSB7CiAgICAgIHZhciByZXQgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgcmV0W2ldID0gYXJyW2ldLmxpc3RlbmVyIHx8IGFycltpXTsKICAgICAgfQogICAgICByZXR1cm4gcmV0OwogICAgfQoKICAgIGZ1bmN0aW9uIG9uY2UoZW1pdHRlciwgbmFtZSkgewogICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgIGZ1bmN0aW9uIGVycm9yTGlzdGVuZXIoZXJyKSB7CiAgICAgICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIHJlc29sdmVyKTsKICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZXIoKSB7CiAgICAgICAgICBpZiAodHlwZW9mIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBlcnJvckxpc3RlbmVyKTsKICAgICAgICAgIH0KICAgICAgICAgIHJlc29sdmUoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKTsKICAgICAgICB9CiAgICAgICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIHJlc29sdmVyLCB7IG9uY2U6IHRydWUgfSk7CiAgICAgICAgaWYgKG5hbWUgIT09ICdlcnJvcicpIHsKICAgICAgICAgIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGVycm9yTGlzdGVuZXIsIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGhhbmRsZXIsIGZsYWdzKSB7CiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCAnZXJyb3InLCBoYW5kbGVyLCBmbGFncyk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgbGlzdGVuZXIsIGZsYWdzKSB7CiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGlmIChmbGFncy5vbmNlKSB7CiAgICAgICAgICBlbWl0dGVyLm9uY2UobmFtZSwgbGlzdGVuZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlbWl0dGVyLm9uKG5hbWUsIGxpc3RlbmVyKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIC8vIEV2ZW50VGFyZ2V0IGRvZXMgbm90IGhhdmUgYGVycm9yYCBldmVudCBzZW1hbnRpY3MgbGlrZSBOb2RlCiAgICAgICAgLy8gRXZlbnRFbWl0dGVycywgd2UgZG8gbm90IGxpc3RlbiBmb3IgYGVycm9yYCBldmVudHMgaGVyZS4KICAgICAgICBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZnVuY3Rpb24gd3JhcExpc3RlbmVyKGFyZykgewogICAgICAgICAgLy8gSUUgZG9lcyBub3QgaGF2ZSBidWlsdGluIGB7IG9uY2U6IHRydWUgfWAgc3VwcG9ydCBzbyB3ZQogICAgICAgICAgLy8gaGF2ZSB0byBkbyBpdCBtYW51YWxseS4KICAgICAgICAgIGlmIChmbGFncy5vbmNlKSB7CiAgICAgICAgICAgIGVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCB3cmFwTGlzdGVuZXIpOwogICAgICAgICAgfQogICAgICAgICAgbGlzdGVuZXIoYXJnKTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImVtaXR0ZXIiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBlbWl0dGVyKTsKICAgICAgfQogICAgfQoKICAgIHZhciBldmVudHNFeHBvcnRzID0gZXZlbnRzLmV4cG9ydHM7CgogICAgZnVuY3Rpb24gY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICBpZiAoc2VsZi5kb2N1bWVudCkgewogICAgICAgICAgICBjb25zdCBjYW52YXMgPSBzZWxmLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDsKICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDsKICAgICAgICAgICAgcmV0dXJuIGNhbnZhczsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoc2VsZi5PZmZzY3JlZW5DYW52YXMpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7CiAgICAgICAgfQogICAgfQoKICAgIGNvbnN0IENETl9CQVNFX1VSTCA9ICJodHRwczovL2Nkbi5zcnYud2hlcmVieS5jb20vY2FtZXJhLWVmZmVjdHMvdjEtMS0wIjsKICAgIGNvbnN0IGdldEFzc2V0VXJsID0gKHBhdGgpID0+IHsKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBgJHtDRE5fQkFTRV9VUkx9LyR7cGF0aH1gOwogICAgICAgIH0KICAgIH07CiAgICBjb25zdCBhc3NldFVybHMgPSB7CiAgICAgICAgdGZsaXRlOiB7CiAgICAgICAgICAgIHdhc206IGdldEFzc2V0VXJsKCJhc3NldHMvdGZsaXRlL3RmbGl0ZS53YXNtIikgLAogICAgICAgICAgICB3YXNtU2ltZDogZ2V0QXNzZXRVcmwoImFzc2V0cy90ZmxpdGUvdGZsaXRlLXNpbWQud2FzbSIpICwKICAgICAgICB9LAogICAgICAgIG1vZGVsczogewogICAgICAgICAgICBzZWdtTGl0ZTogZ2V0QXNzZXRVcmwoImFzc2V0cy90ZmxpdGUvbW9kZWxzL3NlZ21fbGl0ZV92NjgxLnRmbGl0ZSIpICwKICAgICAgICAgICAgc2VnbUZ1bGw6IGdldEFzc2V0VXJsKCJhc3NldHMvdGZsaXRlL21vZGVscy9zZWdtX2Z1bGxfdjY3OS50ZmxpdGUiKSAsCiAgICAgICAgICAgIG1sa2l0OiBnZXRBc3NldFVybCgiYXNzZXRzL3RmbGl0ZS9tb2RlbHMvc2VsZmllc2VnbWVudGF0aW9uX21sa2l0LTI1NngyNTYtMjAyMV8wMV8xOS12MTIxNS5mMTYudGZsaXRlIikKICAgICAgICAgICAgICAgICwKICAgICAgICB9fTsKCiAgICBjb25zdCBsb2FkVGZsaXRlTW9kdWxlID0gKGlzU2ltZCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgY29uc3QgY3JlYXRlVGZsaXRlTW9kdWxlID0gaXNTaW1kCiAgICAgICAgICAgID8geWllbGQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB0ZmxpdGVTaW1kOyB9KS50aGVuKChtKSA9PiBtLmRlZmF1bHQpCiAgICAgICAgICAgIDogeWllbGQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB0ZmxpdGU7IH0pLnRoZW4oKG0pID0+IG0uZGVmYXVsdCk7CiAgICAgICAgcmV0dXJuIGNyZWF0ZVRmbGl0ZU1vZHVsZTsKICAgIH0pOwogICAgY29uc3QgZ2V0TW9kZWxVcmwgPSAobW9kZWxJZCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgewogICAgICAgICAgICBzd2l0Y2ggKG1vZGVsSWQpIHsKICAgICAgICAgICAgICAgIGNhc2UgIm1lZXRsaXRlIjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzZXRVcmxzLm1vZGVscy5zZWdtTGl0ZTsKICAgICAgICAgICAgICAgIGNhc2UgIm1lZXRmdWxsIjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzZXRVcmxzLm1vZGVscy5zZWdtRnVsbDsKICAgICAgICAgICAgICAgIGNhc2UgIm1sa2l0IjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzZXRVcmxzLm1vZGVscy5tbGtpdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwogICAgY29uc3QgZ2V0V2FzbVVybCA9IChpc1NpbWQpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGlzU2ltZCA/IGFzc2V0VXJscy50ZmxpdGUud2FzbVNpbWQgOiBhc3NldFVybHMudGZsaXRlLndhc207CiAgICAgICAgfQogICAgfSk7CiAgICBjb25zdCBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX0JBQ0tHUk9VTkRfUEVSU09OID0gMTsKICAgIGNvbnN0IFNFR01FTlRBVElPTk1PREVMX1RZUEVfUEVSU09OID0gMjsKICAgIGNvbnN0IHJlc29sdmVBc3NldFVybCA9ICh1cmwpID0+IHsKICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSB8fCB1cmwuc3RhcnRzV2l0aCgiaHR0cHM6Ly8iKSB8fCB1cmwuc3RhcnRzV2l0aCgiYmxvYjoiKSB8fCB1cmwuc3RhcnRzV2l0aCgiZGF0YToiKSkgewogICAgICAgICAgICByZXR1cm4gdXJsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IFVSTCh1cmwsIChfZG9jdW1lbnRDdXJyZW50U2NyaXB0ICYmIF9kb2N1bWVudEN1cnJlbnRTY3JpcHQudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnU0NSSVBUJyAmJiBfZG9jdW1lbnRDdXJyZW50U2NyaXB0LnNyYyB8fCBuZXcgVVJMKCdQcm9jZXNzb3JQcm94eS53b3JrZXIuanMnLCBkb2N1bWVudC5iYXNlVVJJKS5ocmVmKSkuaHJlZjsKICAgIH07CiAgICBjb25zdCBtb2RlbHMgPSB7CiAgICAgICAgbWVldGxpdGU6IHsKICAgICAgICAgICAgaWQ6ICJtZWV0bGl0ZSIsCiAgICAgICAgICAgIHR5cGU6IFNFR01FTlRBVElPTk1PREVMX1RZUEVfQkFDS0dST1VORF9QRVJTT04sCiAgICAgICAgfSwKICAgICAgICBtZWV0ZnVsbDogewogICAgICAgICAgICBpZDogIm1lZXRmdWxsIiwKICAgICAgICAgICAgdHlwZTogU0VHTUVOVEFUSU9OTU9ERUxfVFlQRV9CQUNLR1JPVU5EX1BFUlNPTiwKICAgICAgICB9LAogICAgICAgIG1sa2l0OiB7CiAgICAgICAgICAgIGlkOiAibWxraXQiLAogICAgICAgICAgICB0eXBlOiBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX1BFUlNPTiwKICAgICAgICB9LAogICAgfTsKICAgIGxldCBfdGZsaXRlID0gbnVsbDsKICAgIGNvbnN0IGxvYWRURkxpdGUgPSAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICBpZiAoX3RmbGl0ZSkKICAgICAgICAgICAgcmV0dXJuIF90ZmxpdGU7CiAgICAgICAgY29uc3Qgc2ltZElzU3VwcG9ydGVkID0geWllbGQgd2FzbUZlYXR1cmVEZXRlY3Quc2ltZCgpOwogICAgICAgIGNvbnN0IGNyZWF0ZVRmbGl0ZU1vZHVsZSA9IHlpZWxkIGxvYWRUZmxpdGVNb2R1bGUoc2ltZElzU3VwcG9ydGVkKTsKICAgICAgICBjb25zdCB3YXNtVXJsID0geWllbGQgZ2V0V2FzbVVybChzaW1kSXNTdXBwb3J0ZWQpOwogICAgICAgIF90ZmxpdGUgPSB5aWVsZCBjcmVhdGVUZmxpdGVNb2R1bGUoewogICAgICAgICAgICBsb2NhdGVGaWxlKHBhdGgpIHsKICAgICAgICAgICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCIud2FzbSIpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVBc3NldFVybCh3YXNtVXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBwYXRoOwogICAgICAgICAgICB9LAogICAgICAgIH0pOwogICAgICAgIHJldHVybiBfdGZsaXRlOwogICAgfSk7CiAgICBsZXQgX2N1cnJlbnRNb2RlbEFuZEluZm87CiAgICBjb25zdCBsb2FkU2VnbWVudGF0aW9uTW9kZWwgPSAoc2VnbWVudGF0aW9uTW9kZWxJZCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgY29uc3QgbW9kZWwgPSBtb2RlbHNbc2VnbWVudGF0aW9uTW9kZWxJZF07CiAgICAgICAgY29uc3QgbW9kZWxVcmwgPSByZXNvbHZlQXNzZXRVcmwoeWllbGQgZ2V0TW9kZWxVcmwobW9kZWwuaWQpKTsKICAgICAgICBjb25zdCB0ZmxpdGUgPSB5aWVsZCBsb2FkVEZMaXRlKCk7CiAgICAgICAgaWYgKChfY3VycmVudE1vZGVsQW5kSW5mbyA9PT0gbnVsbCB8fCBfY3VycmVudE1vZGVsQW5kSW5mbyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2N1cnJlbnRNb2RlbEFuZEluZm8udXJsKSA9PT0gbW9kZWxVcmwpCiAgICAgICAgICAgIHJldHVybiBfY3VycmVudE1vZGVsQW5kSW5mbzsKICAgICAgICBjb25zdCBtb2RlbFJlc3BvbnNlID0geWllbGQgZmV0Y2gobW9kZWxVcmwpOwogICAgICAgIGNvbnN0IG1vZGVsQnVmZmVyID0geWllbGQgbW9kZWxSZXNwb25zZS5hcnJheUJ1ZmZlcigpOwogICAgICAgIGNvbnN0IG1vZGVsQnVmZmVyT2Zmc2V0ID0gdGZsaXRlLl9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldCgpOwogICAgICAgIHRmbGl0ZS5IRUFQVTguc2V0KG5ldyBVaW50OEFycmF5KG1vZGVsQnVmZmVyKSwgbW9kZWxCdWZmZXJPZmZzZXQpOwogICAgICAgIHRmbGl0ZS5fbG9hZE1vZGVsKG1vZGVsQnVmZmVyLmJ5dGVMZW5ndGgpOwogICAgICAgIGNvbnN0IGlucHV0SGVpZ2h0ID0gdGZsaXRlLl9nZXRJbnB1dEhlaWdodCgpOwogICAgICAgIGNvbnN0IGlucHV0V2lkdGggPSB0ZmxpdGUuX2dldElucHV0V2lkdGgoKTsKICAgICAgICBjb25zdCBpbnB1dE1lbW9yeU9mZnNldCA9IHRmbGl0ZS5fZ2V0SW5wdXRNZW1vcnlPZmZzZXQoKSAvIDQ7CiAgICAgICAgY29uc3Qgb3V0cHV0TWVtb3J5T2Zmc2V0ID0gdGZsaXRlLl9nZXRPdXRwdXRNZW1vcnlPZmZzZXQoKSAvIDQ7CiAgICAgICAgY29uc3Qgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCA9IGlucHV0V2lkdGggKiBpbnB1dEhlaWdodDsKICAgICAgICB0ZmxpdGUuX3J1bkluZmVyZW5jZSgpOwogICAgICAgIF9jdXJyZW50TW9kZWxBbmRJbmZvID0gewogICAgICAgICAgICB0ZmxpdGUsCiAgICAgICAgICAgIG1vZGVsLAogICAgICAgICAgICB1cmw6IG1vZGVsVXJsLAogICAgICAgICAgICBpbnB1dEhlaWdodCwKICAgICAgICAgICAgaW5wdXRXaWR0aCwKICAgICAgICAgICAgaW5wdXRNZW1vcnlPZmZzZXQsCiAgICAgICAgICAgIG91dHB1dE1lbW9yeU9mZnNldCwKICAgICAgICAgICAgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCwKICAgICAgICB9OwogICAgICAgIHJldHVybiBfY3VycmVudE1vZGVsQW5kSW5mbzsKICAgIH0pOwoKICAgIGNvbnN0IGJhc2VDYW52YXNQYXJhbXMgPSB7CiAgICAgICAgbWFza09wZXJhdGlvbjogImNvcHkiLAogICAgICAgIG1hc2tGaWx0ZXI6ICJibHVyKDRweCkiLAogICAgICAgIHBlcnNvbk9wZXJhdGlvbjogInNvdXJjZS1pbiIsCiAgICAgICAgcGVyc29uRmlsdGVyOiAibm9uZSIsCiAgICAgICAgYmFja2dyb3VuZE9wZXJhdGlvbjogImRlc3RpbmF0aW9uLW92ZXIiLAogICAgICAgIGJhY2tncm91bmRGaWx0ZXI6ICJub25lIiwKICAgIH07CiAgICBmdW5jdGlvbiBnZXRCbHVyQ2FudmFzUGFyYW1zKGFtb3VudCkgewogICAgICAgIHN3aXRjaCAoYW1vdW50KSB7CiAgICAgICAgICAgIGNhc2UgInNsaWdodCI6IHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDYW52YXNQYXJhbXMpLCB7IGJhY2tncm91bmRGaWx0ZXI6ICJibHVyKDRweCkiLCBjcm9wOiA0IH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImhlYXZ5IjogewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNhbnZhc1BhcmFtcyksIHsgbWFza0ZpbHRlcjogImJsdXIoOHB4KSIsIGJhY2tncm91bmRGaWx0ZXI6ICJibHVyKDE2cHgpIiwgY3JvcDogMTYgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNhbnZhc1BhcmFtcyksIHsgbWFza0ZpbHRlcjogImJsdXIoOHB4KSIsIGJhY2tncm91bmRGaWx0ZXI6ICJibHVyKDhweCkiLCBjcm9wOiA4IH0pOwogICAgfQogICAgZnVuY3Rpb24gZ2V0Q2FudmFzUGFyYW1zKHBhcmFtcykgewogICAgICAgIGlmIChwYXJhbXMuYmFja2dyb3VuZEJsdXIpCiAgICAgICAgICAgIHJldHVybiBnZXRCbHVyQ2FudmFzUGFyYW1zKHBhcmFtcy5iYWNrZ3JvdW5kQmx1ci5hbW91bnQpOwogICAgICAgIHJldHVybiBiYXNlQ2FudmFzUGFyYW1zOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlQ2FudmFzRW5naW5lKHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCBzZXR1cCwgZWZmZWN0Q2FudmFzLCBwYXJhbXMpIHsKICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICBjb25zdCB7IHRmbGl0ZSwgbW9kZWw6IHNlZ21lbnRhdGlvbk1vZGVsLCBpbnB1dEhlaWdodCwgaW5wdXRXaWR0aCwgaW5wdXRNZW1vcnlPZmZzZXQsIG91dHB1dE1lbW9yeU9mZnNldCwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCwgfSA9IHlpZWxkIGxvYWRTZWdtZW50YXRpb25Nb2RlbChzZXR1cC5zZWdtZW50YXRpb25Nb2RlbElkKTsKICAgICAgICAgICAgbGV0IGNhbnZhc1BhcmFtcyA9IGdldENhbnZhc1BhcmFtcyhwYXJhbXMpOwogICAgICAgICAgICBjb25zdCBzZWdtZW50YXRpb25DYW52YXMgPSBjcmVhdGVDYW52YXMoaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICBjb25zdCBzZWdtZW50YXRpb25DdHggPSBzZWdtZW50YXRpb25DYW52YXMuZ2V0Q29udGV4dCgiMmQiLCB7CiAgICAgICAgICAgICAgICB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb25zdCBzZWdtZW50YXRpb25NYXNrID0gbmV3IEltYWdlRGF0YShpbnB1dFdpZHRoLCBpbnB1dEhlaWdodCk7CiAgICAgICAgICAgIGxldCBjdXJyZW50QmFja2dyb3VuZEZyYW1lID0gbnVsbDsKICAgICAgICAgICAgbGV0IGJhY2tncm91bmREaW1lbnNpb25zID0geyB4OiAwLCB5OiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH07CiAgICAgICAgICAgIGNvbnN0IHZpZGVvQXNwZWN0UmF0aW8gPSB2aWRlb1dpZHRoIC8gdmlkZW9IZWlnaHQ7CiAgICAgICAgICAgIGxldCBjcm9wWCA9IDA7CiAgICAgICAgICAgIGxldCBjcm9wWSA9IDA7CiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZUNyb3AgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBjcm9wID0gY2FudmFzUGFyYW1zLmNyb3AgfHwgMDsKICAgICAgICAgICAgICAgIGlmIChjcm9wKSB7CiAgICAgICAgICAgICAgICAgICAgY3JvcFggPSB2aWRlb0FzcGVjdFJhdGlvID4gMSA/IE1hdGgucm91bmQoY3JvcCAqIHZpZGVvQXNwZWN0UmF0aW8pIDogY3JvcDsKICAgICAgICAgICAgICAgICAgICBjcm9wWSA9IHZpZGVvQXNwZWN0UmF0aW8gPCAxID8gTWF0aC5yb3VuZChjcm9wIC8gdmlkZW9Bc3BlY3RSYXRpbykgOiBjcm9wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY3JvcFggPSAwOwogICAgICAgICAgICAgICAgICAgIGNyb3BZID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdXBkYXRlQ3JvcCgpOwogICAgICAgICAgICBjb25zdCBlZmZlY3RDdHggPSBlZmZlY3RDYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGVmZmVjdEN0eCwKICAgICAgICAgICAgICAgIHVwZGF0ZUJhY2tncm91bmRGcmFtZShmcmFtZSwgZGltZW5zaW9ucykgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUgPSBmcmFtZTsKICAgICAgICAgICAgICAgICAgICBpZiAoZGltZW5zaW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZERpbWVuc2lvbnMgPSBkaW1lbnNpb25zOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHVwZGF0ZVBhcmFtcyh1cGRhdGVkUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgY2FudmFzUGFyYW1zID0gZ2V0Q2FudmFzUGFyYW1zKHVwZGF0ZWRQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNyb3AoKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzRnJhbWUoZnJhbWUpIHsKICAgICAgICAgICAgICAgICAgICBzZWdtZW50YXRpb25DdHguZHJhd0ltYWdlKGZyYW1lLCAwLCAwLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgMCwgMCwgaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlRGF0YSA9IHNlZ21lbnRhdGlvbkN0eC5nZXRJbWFnZURhdGEoMCwgMCwgaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRmbGl0ZS5IRUFQRjMyW2lucHV0TWVtb3J5T2Zmc2V0ICsgaSAqIDNdID0gaW1hZ2VEYXRhLmRhdGFbaSAqIDRdIC8gMjU1OwogICAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGUuSEVBUEYzMltpbnB1dE1lbW9yeU9mZnNldCArIGkgKiAzICsgMV0gPSBpbWFnZURhdGEuZGF0YVtpICogNCArIDFdIC8gMjU1OwogICAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGUuSEVBUEYzMltpbnB1dE1lbW9yeU9mZnNldCArIGkgKiAzICsgMl0gPSBpbWFnZURhdGEuZGF0YVtpICogNCArIDJdIC8gMjU1OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0ZmxpdGUuX3J1bkluZmVyZW5jZSgpOwogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50YXRpb25Nb2RlbC50eXBlID09PSBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX0JBQ0tHUk9VTkRfUEVSU09OKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kID0gdGZsaXRlLkhFQVBGMzJbb3V0cHV0TWVtb3J5T2Zmc2V0ICsgaSAqIDJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyc29uID0gdGZsaXRlLkhFQVBGMzJbb3V0cHV0TWVtb3J5T2Zmc2V0ICsgaSAqIDIgKyAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoaWZ0ID0gTWF0aC5tYXgoYmFja2dyb3VuZCwgcGVyc29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tncm91bmRFeHAgPSBNYXRoLmV4cChiYWNrZ3JvdW5kIC0gc2hpZnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyc29uRXhwID0gTWF0aC5leHAocGVyc29uIC0gc2hpZnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudGF0aW9uTWFzay5kYXRhW2kgKiA0ICsgM10gPSAoMjU1ICogcGVyc29uRXhwKSAvIChiYWNrZ3JvdW5kRXhwICsgcGVyc29uRXhwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWdtZW50YXRpb25Nb2RlbC50eXBlID09PSBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX1BFUlNPTikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyc29uID0gdGZsaXRlLkhFQVBGMzJbb3V0cHV0TWVtb3J5T2Zmc2V0ICsgaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50YXRpb25NYXNrLmRhdGFbaSAqIDQgKyAzXSA9IDI1NSAqIHBlcnNvbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZWdtZW50YXRpb25DdHgucHV0SW1hZ2VEYXRhKHNlZ21lbnRhdGlvbk1hc2ssIDAsIDApOwogICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBjYW52YXNQYXJhbXMubWFza09wZXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICBlZmZlY3RDdHguZmlsdGVyID0gY2FudmFzUGFyYW1zLm1hc2tGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4LmRyYXdJbWFnZShzZWdtZW50YXRpb25DYW52YXMsIDAsIDAsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0LCAwLCAwLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGNhbnZhc1BhcmFtcy5wZXJzb25PcGVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4LmZpbHRlciA9IGNhbnZhc1BhcmFtcy5wZXJzb25GaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4LmRyYXdJbWFnZShmcmFtZSwgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGNhbnZhc1BhcmFtcy5iYWNrZ3JvdW5kT3BlcmF0aW9uOwogICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5maWx0ZXIgPSBjYW52YXNQYXJhbXMuYmFja2dyb3VuZEZpbHRlcjsKICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEJhY2tncm91bmRGcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RDdHguZHJhd0ltYWdlKGN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUsIGJhY2tncm91bmREaW1lbnNpb25zLngsIGJhY2tncm91bmREaW1lbnNpb25zLnksIGJhY2tncm91bmREaW1lbnNpb25zLndpZHRoLCBiYWNrZ3JvdW5kRGltZW5zaW9ucy5oZWlnaHQsIDAsIDAsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5kcmF3SW1hZ2UoZnJhbWUsIDAsIDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoY3JvcFggfHwgY3JvcFkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICJzb3VyY2Utb3ZlciI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5maWx0ZXIgPSAibm9uZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5kcmF3SW1hZ2UoZWZmZWN0Q2FudmFzLCBjcm9wWCwgY3JvcFksIHZpZGVvV2lkdGggLSBjcm9wWCAqIDIsIHZpZGVvSGVpZ2h0IC0gY3JvcFkgKiAyLCAwLCAwLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7IH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICB9CgogICAgY29uc3QgZ2xzbCA9IFN0cmluZy5yYXc7CiAgICBmdW5jdGlvbiBjcmVhdGVQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyKSB7CiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTsKICAgICAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgdmVydGV4U2hhZGVyKTsKICAgICAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgZnJhZ21lbnRTaGFkZXIpOwogICAgICAgIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pOwogICAgICAgIGlmICghZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUykpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbGluayBXZWJHTCBwcm9ncmFtOiAke2dsLmdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pfWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcHJvZ3JhbTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVBpcGxlbGluZVN0YWdlUHJvZ3JhbShnbCwgdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyKSB7CiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGNyZWF0ZVByb2dyYW0oZ2wsIHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXIpOwogICAgICAgIGNvbnN0IHBvc2l0aW9uQXR0cmlidXRlTG9jYXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAiYV9wb3NpdGlvbiIpOwogICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uQXR0cmlidXRlTG9jYXRpb24pOwogICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBwb3NpdGlvbkJ1ZmZlcik7CiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihwb3NpdGlvbkF0dHJpYnV0ZUxvY2F0aW9uLCAyLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApOwogICAgICAgIGNvbnN0IHRleENvb3JkQXR0cmlidXRlTG9jYXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAiYV90ZXhDb29yZCIpOwogICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHRleENvb3JkQXR0cmlidXRlTG9jYXRpb24pOwogICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcih0ZXhDb29yZEF0dHJpYnV0ZUxvY2F0aW9uLCAyLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApOwogICAgICAgIHJldHVybiBwcm9ncmFtOwogICAgfQogICAgZnVuY3Rpb24gY29tcGlsZVNoYWRlcihnbCwgc2hhZGVyVHlwZSwgc2hhZGVyU291cmNlKSB7CiAgICAgICAgY29uc3Qgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKHNoYWRlclR5cGUpOwogICAgICAgIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsIHNoYWRlclNvdXJjZSk7CiAgICAgICAgZ2wuY29tcGlsZVNoYWRlcihzaGFkZXIpOwogICAgICAgIGlmICghZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGNvbXBpbGUgc2hhZGVyOiAke2dsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKX1gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNoYWRlcjsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVRleHR1cmUoZ2wsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBtaW5GaWx0ZXIgPSBnbC5ORUFSRVNULCBtYWdGaWx0ZXIgPSBnbC5ORUFSRVNUKSB7CiAgICAgICAgY29uc3QgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTsKICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgbWluRmlsdGVyKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgbWFnRmlsdGVyKTsKICAgICAgICBnbC50ZXhTdG9yYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMSwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwogICAgICAgIHJldHVybiB0ZXh0dXJlOwogICAgfQoKICAgIGZ1bmN0aW9uIGdlbmVyYXRlT3B0aW1pemVkR2F1c3NpYW5LZXJuZWwoc2lnbWEpIHsKICAgICAgICBjb25zdCBnID0gKHgpID0+IE1hdGguZXhwKC0oeCAqIHgpIC8gKDIgKiBzaWdtYSAqIHNpZ21hKSk7CiAgICAgICAgY29uc3QgbnVtYmVycyA9IFtdOwogICAgICAgIGxldCB4ID0gMDsKICAgICAgICBsZXQgY3VycmVudFN1bSA9IDA7CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgY29uc3QgbiA9IGcoeCk7CiAgICAgICAgICAgIGNvbnN0IG5leHRTdW0gPSBjdXJyZW50U3VtICsgKGN1cnJlbnRTdW0gPyBuICogMiA6IG4pOwogICAgICAgICAgICBpZiAoY3VycmVudFN1bSAmJiBuIC8gbmV4dFN1bSA8IDAuMDEgJiYgbnVtYmVycy5sZW5ndGggJSAyKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGN1cnJlbnRTdW0gPSBuZXh0U3VtOwogICAgICAgICAgICBudW1iZXJzLnB1c2gobik7CiAgICAgICAgICAgIHgrKzsKICAgICAgICB9CiAgICAgICAgY29uc3Qgd2VpZ2h0cyA9IG51bWJlcnMubWFwKChuKSA9PiBuIC8gY3VycmVudFN1bSk7CiAgICAgICAgY29uc3Qgb3B0aW1pemVkV2VpZ2h0cyA9IFt3ZWlnaHRzWzBdXTsKICAgICAgICBjb25zdCBvcHRpbWl6ZWRQb3NpdGlvbnMgPSBbMF07CiAgICAgICAgaWYgKHdlaWdodHMubGVuZ3RoID49IDMgJiYgd2VpZ2h0cy5sZW5ndGggJSAyID09PSAxKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgd2VpZ2h0cy5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgICAgICAgY29uc3QgdzEgPSB3ZWlnaHRzW2ldOwogICAgICAgICAgICAgICAgY29uc3QgdzIgPSB3ZWlnaHRzW2kgKyAxXTsKICAgICAgICAgICAgICAgIGNvbnN0IHcgPSB3MSArIHcyOwogICAgICAgICAgICAgICAgY29uc3QgcCA9IHcyIC8gKHcxICsgdzIpOwogICAgICAgICAgICAgICAgb3B0aW1pemVkV2VpZ2h0cy5wdXNoKHcpOwogICAgICAgICAgICAgICAgb3B0aW1pemVkUG9zaXRpb25zLnB1c2goaSArIHApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHdlaWdodHM6IG9wdGltaXplZFdlaWdodHMsCiAgICAgICAgICAgIHBvc2l0aW9uczogb3B0aW1pemVkUG9zaXRpb25zLAogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBidWlsZEJsdXJQYXNzKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgcGVyc29uTWFza1RleHR1cmUsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcykgewogICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyU291cmNlID0gZ2xzbCBgI3ZlcnNpb24gMzAwIGVzCiAgICAgICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfaW5wdXRGcmFtZTsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X3BlcnNvbk1hc2s7CiAgICAgICAgdW5pZm9ybSBmbG9hdCB1X3dlaWdodFsyMF07CiAgICAgICAgdW5pZm9ybSBmbG9hdCB1X29mZnNldFsyMF07CiAgICAgICAgdW5pZm9ybSBpbnQgdV9rc2l6ZTsKICAgICAgICB1bmlmb3JtIHZlYzIgdV90ZXhlbFNpemU7CiAgICAgICAgaW4gdmVjMiB2X3RleENvb3JkOwogICAgICAgIG91dCB2ZWM0IG91dENvbG9yOwogICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgdmVjNCBjZW50ZXJDb2xvciA9IHRleHR1cmUodV9pbnB1dEZyYW1lLCB2X3RleENvb3JkKTsKICAgICAgICAgICAgZmxvYXQgcGVyc29uTWFzayA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hOwogICAgICAgICAgICB2ZWM0IGZyYW1lQ29sb3IgPSBjZW50ZXJDb2xvciAqIHVfd2VpZ2h0WzBdICogKDEuMCAtIHBlcnNvbk1hc2spOwogICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHVfa3NpemU7IGkrKykgewogICAgICAgICAgICAgICAgdmVjMiBvZmZzZXQgPSB2ZWMyKHVfb2Zmc2V0W2ldKSAqIHVfdGV4ZWxTaXplOwogICAgICAgICAgICAgICAgdmVjMiB0ZXhDb29yZCA9IHZfdGV4Q29vcmQgKyBvZmZzZXQ7CiAgICAgICAgICAgICAgICBmcmFtZUNvbG9yICs9IHRleHR1cmUodV9pbnB1dEZyYW1lLCB0ZXhDb29yZCkgKiB1X3dlaWdodFtpXSAqCiAgICAgICAgICAgICAgICAgICAgKDEuMCAtIHRleHR1cmUodV9wZXJzb25NYXNrLCB0ZXhDb29yZCkuYSk7CiAgICAgICAgICAgICAgICB0ZXhDb29yZCA9IHZfdGV4Q29vcmQgLSBvZmZzZXQ7CiAgICAgICAgICAgICAgICBmcmFtZUNvbG9yICs9IHRleHR1cmUodV9pbnB1dEZyYW1lLCB0ZXhDb29yZCkgKiB1X3dlaWdodFtpXSAqCiAgICAgICAgICAgICAgICAgICAgKDEuMCAtIHRleHR1cmUodV9wZXJzb25NYXNrLCB0ZXhDb29yZCkuYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3V0Q29sb3IgPSB2ZWM0KGZyYW1lQ29sb3IucmdiICsgKDEuMCAtIGZyYW1lQ29sb3IuYSkgKiBjZW50ZXJDb2xvci5yZ2IsIDEuMCk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3Qgc2NhbGUgPSBwYXJhbXMuYmFja2dyb3VuZFJlc2FtcGxlU2NhbGUgfHwgMC4yOwogICAgICAgIGNvbnN0IGJsdXJyZWRCYWNrZ3JvdW5kV2lkdGggPSBNYXRoLnJvdW5kKG91dHB1dFdpZHRoICogc2NhbGUpOwogICAgICAgIGNvbnN0IGJsdXJyZWRCYWNrZ3JvdW5kSGVpZ2h0ID0gTWF0aC5yb3VuZChvdXRwdXRIZWlnaHQgKiBzY2FsZSk7CiAgICAgICAgY29uc3QgdGV4ZWxXaWR0aCA9IDEgLyBibHVycmVkQmFja2dyb3VuZFdpZHRoOwogICAgICAgIGNvbnN0IHRleGVsSGVpZ2h0ID0gMSAvIGJsdXJyZWRCYWNrZ3JvdW5kSGVpZ2h0OwogICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyID0gY29tcGlsZVNoYWRlcihnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCBmcmFnbWVudFNoYWRlclNvdXJjZSk7CiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGNyZWF0ZVBpcGxlbGluZVN0YWdlUHJvZ3JhbShnbCwgdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyKTsKICAgICAgICBjb25zdCBpbnB1dEZyYW1lTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfaW5wdXRGcmFtZSIpOwogICAgICAgIGNvbnN0IHBlcnNvbk1hc2tMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9wZXJzb25NYXNrIik7CiAgICAgICAgY29uc3QgdGV4ZWxTaXplTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfdGV4ZWxTaXplIik7CiAgICAgICAgY29uc3Qgd2VpZ2h0TG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfd2VpZ2h0Iik7CiAgICAgICAgY29uc3Qgb2Zmc2V0TG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfb2Zmc2V0Iik7CiAgICAgICAgY29uc3Qga2VybmVsc2l6ZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2tzaXplIik7CiAgICAgICAgY29uc3QgdGV4dHVyZTEgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgYmx1cnJlZEJhY2tncm91bmRXaWR0aCwgYmx1cnJlZEJhY2tncm91bmRIZWlnaHQsIGdsLk5FQVJFU1QsIGdsLkxJTkVBUik7CiAgICAgICAgY29uc3QgdGV4dHVyZTIgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgYmx1cnJlZEJhY2tncm91bmRXaWR0aCwgYmx1cnJlZEJhY2tncm91bmRIZWlnaHQsIGdsLk5FQVJFU1QsIGdsLkxJTkVBUik7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIxID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMSk7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlMSwgMCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMik7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlMiwgMCk7CiAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICBnbC51bmlmb3JtMWkocGVyc29uTWFza0xvY2F0aW9uLCAxKTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVLZXJuZWwoa2VybmVsID0gIjV4NSIpIHsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgaWYgKGtlcm5lbCA9PT0gIjl4OSIpIHsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShrZXJuZWxzaXplTG9jYXRpb24sIDUpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdih3ZWlnaHRMb2NhdGlvbiwgWzAuMjI3MDI3MDI3LCAwLjE5NDU5NDU5NDYsIDAuMTIxNjIxNjIxNiwgMC4wNTQwNTQwNTQxLCAwLjAxNjIxNjIxNjJdKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYob2Zmc2V0TG9jYXRpb24sIFswLjAsIDEuMCwgMi4wLCAzLjAsIDQuMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGtlcm5lbCA9PT0gIjl4OW8iKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCAzKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFswLjI3MzQzNzUsIDAuMzI4MTI1LCAwLjAzNTE1NjI1XSk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWZ2KG9mZnNldExvY2F0aW9uLCBbMC4wLCAxLjMzMzMzMzMzMzMzMzMzMzMsIDMuMTExMTExMTExMTExMTExXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoa2VybmVsID09PSAiN3g3IikgewogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFpKGtlcm5lbHNpemVMb2NhdGlvbiwgNCk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWZ2KHdlaWdodExvY2F0aW9uLCBbMC4zMTI1LCAwLjIzNDM3NSwgMC4wOTM3NSwgMC4wMTU2MjVdKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYob2Zmc2V0TG9jYXRpb24sIFswLjAsIDEuMCwgMi4wLCAzLjBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChrZXJuZWwgPT09ICI1eDUiKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCAzKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFswLjM3MTUsIDAuMjUsIDAuMDYyNV0pOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgWzAuMCwgMS4wLCAyLjBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChrZXJuZWwgPT09ICIzeDMiKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCAyKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFswLjUsIDAuMjVdKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYob2Zmc2V0TG9jYXRpb24sIFswLjAsIDEuMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGtlcm5lbCA9PT0gIjEwMW8iKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCA2KTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFsKICAgICAgICAgICAgICAgICAgICAwLjA4MjQ5MzAwNzc3NzUwNzcsIDAuMTU3MDg1MTAxNTM3MTA5MywgMC4xMjkwOTI5OTc0ODk2MTYwNiwgMC4wOTA2MTY1NzgxMDc5NzA3NSwKICAgICAgICAgICAgICAgICAgICAwLjA1NDI3MTI3MTgyNTEwMDQ0LCAwLjAyNzY4NzU0NzE1MTQ0OTU0NCwKICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgWzAsIDEuNDg1MTQ4NTE0ODUxNDg1MSwgMy40NjUzNDY1MzQ2NTM0NjUzLCA1LjQ0NTU0NDU1NDQ1NTQ0NiwgNy40MjU3NDI1NzQyNTc0MjYsIDkuNDA1OTQwNTk0MDU5NDA1XSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoa2VybmVsID09PSAiMTcxbyIpIHsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShrZXJuZWxzaXplTG9jYXRpb24sIDcpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdih3ZWlnaHRMb2NhdGlvbiwgWwogICAgICAgICAgICAgICAgICAgIDAuMDY0NjUyMTgwMDU4MTExODUsIDAuMTI1NTk3MzU4NjEzMjkyNywgMC4xMTE4MDYwMjQ1NDY5NzA5OSwgMC4wOTA2NzM0NTcyNjk5NjEwNywKICAgICAgICAgICAgICAgICAgICAwLjA2Njk3NzEyMTMxMjA3OTcxLCAwLjA0NTA0NjQyNjcxODk2NDI1LCAwLjAyNzU3MzUyMTUwOTY3NTI3OCwKICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgWwogICAgICAgICAgICAgICAgICAgIDAsIDEuNDkxMjI4MDcwMTc1NDM4OCwgMy40Nzk1MzIxNjM3NDI2OTA0LCA1LjQ2NzgzNjI1NzMwOTk0MTUsIDcuNDU2MTQwMzUwODc3MTkzLCA5LjQ0NDQ0NDQ0NDQ0NDQ0NSwKICAgICAgICAgICAgICAgICAgICAxMS40MzI3NDg1MzgwMTE2OTYsCiAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChrZXJuZWwuc3RhcnRzV2l0aCgib2ciKSkgewogICAgICAgICAgICAgICAgY29uc3QgcyA9IHBhcnNlRmxvYXQoa2VybmVsLnN1YnN0cmluZygyKSk7CiAgICAgICAgICAgICAgICBjb25zdCB7IHdlaWdodHMsIHBvc2l0aW9ucyB9ID0gZ2VuZXJhdGVPcHRpbWl6ZWRHYXVzc2lhbktlcm5lbChzKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShrZXJuZWxzaXplTG9jYXRpb24sIHdlaWdodHMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIHdlaWdodHMpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgcG9zaXRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZXQgbnVtUGFzc2VzID0gMTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgICAgIHVwZGF0ZUtlcm5lbChwYXJhbXMua2VybmVsKTsKICAgICAgICAgICAgbnVtUGFzc2VzID0gcGFyYW1zLm51bVBhc3NlcyB8fCAxOwogICAgICAgIH0KICAgICAgICB1cGRhdGVQYXJhbXMocGFyYW1zKTsKICAgICAgICBmdW5jdGlvbiByZW5kZXIoKSB7CiAgICAgICAgICAgIGdsLnZpZXdwb3J0KDAsIDAsIGJsdXJyZWRCYWNrZ3JvdW5kV2lkdGgsIGJsdXJyZWRCYWNrZ3JvdW5kSGVpZ2h0KTsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wudW5pZm9ybTFpKGlucHV0RnJhbWVMb2NhdGlvbiwgMCk7CiAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTEpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBwZXJzb25NYXNrVGV4dHVyZSk7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUGFzc2VzOyBpKyspIHsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0yZih0ZXhlbFNpemVMb2NhdGlvbiwgMCwgdGV4ZWxIZWlnaHQpOwogICAgICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcjEpOwogICAgICAgICAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRV9TVFJJUCwgMCwgNCk7CiAgICAgICAgICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUyKTsKICAgICAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUxKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShpbnB1dEZyYW1lTG9jYXRpb24sIDIpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTJmKHRleGVsU2l6ZUxvY2F0aW9uLCB0ZXhlbFdpZHRoLCAwKTsKICAgICAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIyKTsKICAgICAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZTIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMik7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZTIpOwogICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKHRleHR1cmUxKTsKICAgICAgICAgICAgZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wuZGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGJ1aWxkQmxlbmRQYXNzKGdsLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcykgewogICAgICAgIGNvbnN0IHZlcnRleFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIGluIHZlYzIgYV9wb3NpdGlvbjsKICAgICAgICBpbiB2ZWMyIGFfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzIgdl90ZXhDb29yZDsKICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgIC8vIEZsaXBwaW5nIFkgaXMgcmVxdWlyZWQgd2hlbiByZW5kZXJpbmcgdG8gY2FudmFzCiAgICAgICAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChhX3Bvc2l0aW9uICogdmVjMigxLjAsIC0xLjApLCAwLjAsIDEuMCk7CiAgICAgICAgICAgIHZfdGV4Q29vcmQgPSBhX3RleENvb3JkOwogICAgICAgIH1gOwogICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyU291cmNlID0gZ2xzbCBgI3ZlcnNpb24gMzAwIGVzCiAgICAgICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfaW5wdXRGcmFtZTsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X3BlcnNvbk1hc2s7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9ibHVycmVkSW5wdXRGcmFtZTsKICAgICAgICB1bmlmb3JtIHZlYzIgdV9jb3ZlcmFnZTsKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CiAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICB2ZWMzIGNvbG9yID0gdGV4dHVyZSh1X2lucHV0RnJhbWUsIHZfdGV4Q29vcmQpLnJnYjsKICAgICAgICAgICAgdmVjMyBibHVycmVkQ29sb3IgPSB0ZXh0dXJlKHVfYmx1cnJlZElucHV0RnJhbWUsIHZfdGV4Q29vcmQpLnJnYjsKICAgICAgICAgICAgZmxvYXQgcGVyc29uTWFzayA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hOwogICAgICAgICAgICBwZXJzb25NYXNrID0gc21vb3Roc3RlcCh1X2NvdmVyYWdlLngsIHVfY292ZXJhZ2UueSwgcGVyc29uTWFzayk7CiAgICAgICAgICAgIG91dENvbG9yID0gdmVjNChtaXgoYmx1cnJlZENvbG9yLCBjb2xvciwgcGVyc29uTWFzayksIDEuMCk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyID0gY29tcGlsZVNoYWRlcihnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdmVydGV4U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlciA9IGNvbXBpbGVTaGFkZXIoZ2wsIGdsLkZSQUdNRU5UX1NIQURFUiwgZnJhZ21lbnRTaGFkZXJTb3VyY2UpOwogICAgICAgIGNvbnN0IHByb2dyYW0gPSBjcmVhdGVQaXBsZWxpbmVTdGFnZVByb2dyYW0oZ2wsIHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgY29uc3QgaW5wdXRGcmFtZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2lucHV0RnJhbWUiKTsKICAgICAgICBjb25zdCBwZXJzb25NYXNrTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfcGVyc29uTWFzayIpOwogICAgICAgIGNvbnN0IGJsdXJyZWRJbnB1dEZyYW1lID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2JsdXJyZWRJbnB1dEZyYW1lIik7CiAgICAgICAgY29uc3QgY292ZXJhZ2VMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9jb3ZlcmFnZSIpOwogICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgZ2wudW5pZm9ybTFpKGlucHV0RnJhbWVMb2NhdGlvbiwgMCk7CiAgICAgICAgZ2wudW5pZm9ybTFpKHBlcnNvbk1hc2tMb2NhdGlvbiwgMSk7CiAgICAgICAgZ2wudW5pZm9ybTFpKGJsdXJyZWRJbnB1dEZyYW1lLCAyKTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGNvbnN0IGNvdmVyYWdlID0gcGFyYW1zLmNvdmVyYWdlIHx8IFswLCAxXTsKICAgICAgICAgICAgZ2wudW5pZm9ybTJmKGNvdmVyYWdlTG9jYXRpb24sIGNvdmVyYWdlWzBdLCBjb3ZlcmFnZVsxXSk7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZVBhcmFtcyhwYXJhbXMpOwogICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgICAgICAgZ2wudmlld3BvcnQoMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCk7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgICAgICAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGJ1aWxkQmFja2dyb3VuZEJsdXJTdGFnZShnbCwgdmVydGV4U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIHBlcnNvbk1hc2tUZXh0dXJlLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0LCBwYXJhbXMpIHsKICAgICAgICBsZXQgYmx1clBhc3MgPSBidWlsZEJsdXJQYXNzKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgcGVyc29uTWFza1RleHR1cmUsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcyk7CiAgICAgICAgY29uc3QgYmxlbmRQYXNzID0gYnVpbGRCbGVuZFBhc3MoZ2wsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgcGFyYW1zKTsKICAgICAgICBmdW5jdGlvbiByZW5kZXIoKSB7CiAgICAgICAgICAgIGJsdXJQYXNzLnJlbmRlcigpOwogICAgICAgICAgICBibGVuZFBhc3MucmVuZGVyKCk7CiAgICAgICAgfQogICAgICAgIGxldCBjdXJyZW50UmVzYW1wbGVTY2FsZSA9IHBhcmFtcy5iYWNrZ3JvdW5kUmVzYW1wbGVTY2FsZTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgICAgIGlmIChjdXJyZW50UmVzYW1wbGVTY2FsZSAhPT0gcGFyYW1zLmJhY2tncm91bmRSZXNhbXBsZVNjYWxlKSB7CiAgICAgICAgICAgICAgICBibHVyUGFzcy5jbGVhblVwKCk7CiAgICAgICAgICAgICAgICBibHVyUGFzcyA9IGJ1aWxkQmx1clBhc3MoZ2wsIHZlcnRleFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCBwZXJzb25NYXNrVGV4dHVyZSwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgcGFyYW1zKTsKICAgICAgICAgICAgICAgIGN1cnJlbnRSZXNhbXBsZVNjYWxlID0gcGFyYW1zLmJhY2tncm91bmRSZXNhbXBsZVNjYWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJsdXJQYXNzLnVwZGF0ZVBhcmFtcyhwYXJhbXMpOwogICAgICAgICAgICBibGVuZFBhc3MudXBkYXRlUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGJsZW5kUGFzcy5jbGVhblVwKCk7CiAgICAgICAgICAgIGJsdXJQYXNzLmNsZWFuVXAoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBidWlsZEJhY2tncm91bmRJbWFnZVN0YWdlKGdsLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIHBlcnNvbk1hc2tUZXh0dXJlLCBiYWNrZ3JvdW5kSW1hZ2UsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcykgewogICAgICAgIGNvbnN0IHZlcnRleFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIHVuaWZvcm0gdmVjMiB1X2JhY2tncm91bmRTY2FsZTsKICAgICAgICB1bmlmb3JtIHZlYzIgdV9iYWNrZ3JvdW5kT2Zmc2V0OwogICAgICAgIGluIHZlYzIgYV9wb3NpdGlvbjsKICAgICAgICBpbiB2ZWMyIGFfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzIgdl90ZXhDb29yZDsKICAgICAgICBvdXQgdmVjMiB2X2JhY2tncm91bmRDb29yZDsKICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgIC8vIEZsaXBwaW5nIFkgZm9yIGNhbnZhcwogICAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoYV9wb3NpdGlvbiAqIHZlYzIoMS4wLCAtMS4wKSwgMC4wLCAxLjApOwogICAgICAgICAgICB2X3RleENvb3JkID0gYV90ZXhDb29yZDsKICAgICAgICAgICAgdl9iYWNrZ3JvdW5kQ29vcmQgPSBhX3RleENvb3JkICogdV9iYWNrZ3JvdW5kU2NhbGUgKyB1X2JhY2tncm91bmRPZmZzZXQ7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXJTb3VyY2UgPSBnbHNsIGAjdmVyc2lvbiAzMDAgZXMKICAgICAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9pbnB1dEZyYW1lOwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfcGVyc29uTWFzazsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X2JhY2tncm91bmQ7CiAgICAgICAgdW5pZm9ybSB2ZWMyIHVfY292ZXJhZ2U7CiAgICAgICAgaW4gdmVjMiB2X3RleENvb3JkOwogICAgICAgIGluIHZlYzIgdl9iYWNrZ3JvdW5kQ29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CgogICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgdmVjMyBmcmFtZUNvbG9yID0gdGV4dHVyZSh1X2lucHV0RnJhbWUsIHZfdGV4Q29vcmQpLnJnYjsKICAgICAgICAgICAgdmVjMyBiYWNrZ3JvdW5kQ29sb3IgPSB0ZXh0dXJlKHVfYmFja2dyb3VuZCwgdl9iYWNrZ3JvdW5kQ29vcmQpLnJnYjsKICAgICAgICAgICAgZmxvYXQgcGVyc29uTWFzayA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hOwogICAgICAgICAgICBwZXJzb25NYXNrID0gc21vb3Roc3RlcCh1X2NvdmVyYWdlLngsIHVfY292ZXJhZ2UueSwgcGVyc29uTWFzayk7CiAgICAgICAgICAgIG91dENvbG9yID0gdmVjNChmcmFtZUNvbG9yICogcGVyc29uTWFzayArIGJhY2tncm91bmRDb2xvciAqICgxLjAgLSBwZXJzb25NYXNrKSwgMS4wKTsKICAgICAgICB9YDsKICAgICAgICBjb25zdCBvdXRwdXRSYXRpbyA9IG91dHB1dFdpZHRoIC8gb3V0cHV0SGVpZ2h0OwogICAgICAgIGNvbnN0IHZlcnRleFNoYWRlciA9IGNvbXBpbGVTaGFkZXIoZ2wsIGdsLlZFUlRFWF9TSEFERVIsIHZlcnRleFNoYWRlclNvdXJjZSk7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IGJhY2tncm91bmRTY2FsZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2JhY2tncm91bmRTY2FsZSIpOwogICAgICAgIGNvbnN0IGJhY2tncm91bmRPZmZzZXRMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9iYWNrZ3JvdW5kT2Zmc2V0Iik7CiAgICAgICAgY29uc3QgaW5wdXRGcmFtZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2lucHV0RnJhbWUiKTsKICAgICAgICBjb25zdCBwZXJzb25NYXNrTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfcGVyc29uTWFzayIpOwogICAgICAgIGNvbnN0IGJhY2tncm91bmRMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9iYWNrZ3JvdW5kIik7CiAgICAgICAgY29uc3QgY292ZXJhZ2VMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9jb3ZlcmFnZSIpOwogICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgZ2wudW5pZm9ybTJmKGJhY2tncm91bmRTY2FsZUxvY2F0aW9uLCAxLCAxKTsKICAgICAgICBnbC51bmlmb3JtMmYoYmFja2dyb3VuZE9mZnNldExvY2F0aW9uLCAwLCAwKTsKICAgICAgICBnbC51bmlmb3JtMWkoaW5wdXRGcmFtZUxvY2F0aW9uLCAwKTsKICAgICAgICBnbC51bmlmb3JtMWkocGVyc29uTWFza0xvY2F0aW9uLCAxKTsKICAgICAgICBsZXQgYmFja2dyb3VuZFRleHR1cmUgPSBudWxsOwogICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgICAgICAgZ2wudmlld3BvcnQoMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCk7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTEpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBwZXJzb25NYXNrVGV4dHVyZSk7CiAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kVGV4dHVyZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMik7CiAgICAgICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBiYWNrZ3JvdW5kVGV4dHVyZSk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoYmFja2dyb3VuZExvY2F0aW9uLCAyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpOwogICAgICAgICAgICBnbC5kcmF3QXJyYXlzKGdsLlRSSUFOR0xFX1NUUklQLCAwLCA0KTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gaW5pdEJhY2tncm91bmRJbWFnZShiYWNrZ3JvdW5kSW1hZ2UpIHsKICAgICAgICAgICAgY29uc3Qgc291cmNlV2lkdGggPSBiYWNrZ3JvdW5kSW1hZ2UubmF0dXJhbFdpZHRoIHx8IGJhY2tncm91bmRJbWFnZS52aWRlb1dpZHRoIHx8IGJhY2tncm91bmRJbWFnZS53aWR0aDsKICAgICAgICAgICAgY29uc3Qgc291cmNlSGVpZ2h0ID0gYmFja2dyb3VuZEltYWdlLm5hdHVyYWxIZWlnaHQgfHwgYmFja2dyb3VuZEltYWdlLnZpZGVvSGVpZ2h0IHx8IGJhY2tncm91bmRJbWFnZS5oZWlnaHQ7CiAgICAgICAgICAgIGJhY2tncm91bmRUZXh0dXJlID0gY3JlYXRlVGV4dHVyZShnbCwgZ2wuUkdCQTgsIHNvdXJjZVdpZHRoLCBzb3VyY2VIZWlnaHQsIGdsLkxJTkVBUiwgZ2wuTElORUFSKTsKICAgICAgICAgICAgZ2wudGV4U3ViSW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCAwLCAwLCBzb3VyY2VXaWR0aCwgc291cmNlSGVpZ2h0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgICAgICBsZXQgeE9mZnNldCA9IDA7CiAgICAgICAgICAgIGxldCB5T2Zmc2V0ID0gMDsKICAgICAgICAgICAgbGV0IGJhY2tncm91bmRXaWR0aCA9IHNvdXJjZVdpZHRoOwogICAgICAgICAgICBsZXQgYmFja2dyb3VuZEhlaWdodCA9IHNvdXJjZUhlaWdodDsKICAgICAgICAgICAgY29uc3QgYmFja2dyb3VuZFJhdGlvID0gYmFja2dyb3VuZFdpZHRoIC8gYmFja2dyb3VuZEhlaWdodDsKICAgICAgICAgICAgaWYgKGJhY2tncm91bmRSYXRpbyA8IG91dHB1dFJhdGlvKSB7CiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kSGVpZ2h0ID0gYmFja2dyb3VuZFdpZHRoIC8gb3V0cHV0UmF0aW87CiAgICAgICAgICAgICAgICB5T2Zmc2V0ID0gKHNvdXJjZUhlaWdodCAtIGJhY2tncm91bmRIZWlnaHQpIC8gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGJhY2tncm91bmRXaWR0aCA9IGJhY2tncm91bmRIZWlnaHQgKiBvdXRwdXRSYXRpbzsKICAgICAgICAgICAgICAgIHhPZmZzZXQgPSAoc291cmNlV2lkdGggLSBiYWNrZ3JvdW5kV2lkdGgpIC8gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCB4U2NhbGUgPSBiYWNrZ3JvdW5kV2lkdGggLyBzb3VyY2VXaWR0aDsKICAgICAgICAgICAgY29uc3QgeVNjYWxlID0gYmFja2dyb3VuZEhlaWdodCAvIHNvdXJjZUhlaWdodDsKICAgICAgICAgICAgeE9mZnNldCAvPSBzb3VyY2VXaWR0aDsKICAgICAgICAgICAgeU9mZnNldCAvPSBzb3VyY2VIZWlnaHQ7CiAgICAgICAgICAgIGdsLnVuaWZvcm0yZihiYWNrZ3JvdW5kU2NhbGVMb2NhdGlvbiwgeFNjYWxlLCB5U2NhbGUpOwogICAgICAgICAgICBnbC51bmlmb3JtMmYoYmFja2dyb3VuZE9mZnNldExvY2F0aW9uLCB4T2Zmc2V0LCB5T2Zmc2V0KTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gdXBkYXRlQmFja2dyb3VuZEltYWdlKGJhY2tncm91bmRJbWFnZSwgcmVJbml0KSB7CiAgICAgICAgICAgIGlmIChyZUluaXQpIHsKICAgICAgICAgICAgICAgIGJhY2tncm91bmRUZXh0dXJlID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJhY2tncm91bmRJbWFnZSkgewogICAgICAgICAgICAgICAgaWYgKGJhY2tncm91bmRUZXh0dXJlKQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRUZXh0dXJlID0gbnVsbDsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYmFja2dyb3VuZFRleHR1cmUpIHsKICAgICAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGJhY2tncm91bmRUZXh0dXJlKTsKICAgICAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgYmFja2dyb3VuZEltYWdlLm5hdHVyYWxXaWR0aCB8fCBiYWNrZ3JvdW5kSW1hZ2UudmlkZW9XaWR0aCB8fCBiYWNrZ3JvdW5kSW1hZ2Uud2lkdGgsIGJhY2tncm91bmRJbWFnZS5uYXR1cmFsSGVpZ2h0IHx8IGJhY2tncm91bmRJbWFnZS52aWRlb0hlaWdodCB8fCBiYWNrZ3JvdW5kSW1hZ2UuaGVpZ2h0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaW5pdEJhY2tncm91bmRJbWFnZShiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVBhcmFtcyhwYXJhbXMpIHsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgY29uc3QgY292ZXJhZ2UgPSBwYXJhbXMuY292ZXJhZ2UgfHwgWzAsIDFdOwogICAgICAgICAgICBnbC51bmlmb3JtMmYoY292ZXJhZ2VMb2NhdGlvbiwgY292ZXJhZ2VbMF0sIGNvdmVyYWdlWzFdKTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgaWYgKGJhY2tncm91bmRJbWFnZSkKICAgICAgICAgICAgaW5pdEJhY2tncm91bmRJbWFnZShiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUoYmFja2dyb3VuZFRleHR1cmUpOwogICAgICAgICAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgICAgIHVwZGF0ZUJhY2tncm91bmRJbWFnZSwKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGJ1aWxkSW1wcm92ZU1hc2tTdGFnZShnbCwgdmVydGV4U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIHBlcnNvbk1hc2tUZXh0dXJlLCBpbXByb3ZlZE1hc2tUZXh0dXJlLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0KSB7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXJTb3VyY2UgPSBnbHNsIGAjdmVyc2lvbiAzMDAgZXMKICAgICAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9wZXJzb25NYXNrOwogICAgICAgIHVuaWZvcm0gdmVjMiB1X3RleGVsU2l6ZTsKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CiAgICAgICAgY29uc3QgZmxvYXQgb2Zmc2V0WzNdID0gZmxvYXRbXSgwLjAsIDEuMCwgMi4wKTsKICAgICAgICBjb25zdCBmbG9hdCB3ZWlnaHRbM10gPSBmbG9hdFtdKDAuMzg3NzQsIDAuMjQ0NzcsIDAuMDYxMzYpOwogICAgICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgIGZsb2F0IGJsdXJyZWRBbHBoYSA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hICogd2VpZ2h0WzBdOwogICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDM7IGkrKykgewogICAgICAgICAgICAgICAgdmVjMiBvZmZzZXQgPSB2ZWMyKG9mZnNldFtpXSkgKiB1X3RleGVsU2l6ZTsKICAgICAgICAgICAgICAgIHZlYzIgdGV4Q29vcmQgPSB2X3RleENvb3JkICsgb2Zmc2V0OwogICAgICAgICAgICAgICAgYmx1cnJlZEFscGhhICs9IHRleHR1cmUodV9wZXJzb25NYXNrLCB0ZXhDb29yZCkuYSAqIHdlaWdodFtpXTsKICAgICAgICAgICAgICAgIHRleENvb3JkID0gdl90ZXhDb29yZCAtIG9mZnNldDsKICAgICAgICAgICAgICAgIGJsdXJyZWRBbHBoYSArPSB0ZXh0dXJlKHVfcGVyc29uTWFzaywgdGV4Q29vcmQpLmEgKiB3ZWlnaHRbaV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3V0Q29sb3IgPSB2ZWM0KDAsMCwwLGJsdXJyZWRBbHBoYSk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgdGV4ZWxXaWR0aCA9IDEgLyBvdXRwdXRXaWR0aDsKICAgICAgICBjb25zdCB0ZXhlbEhlaWdodCA9IDEgLyBvdXRwdXRIZWlnaHQ7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IHBlcnNvbk1hc2tMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9wZXJzb25NYXNrIik7CiAgICAgICAgY29uc3QgdGV4ZWxTaXplTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfdGV4ZWxTaXplIik7CiAgICAgICAgY29uc3QgdGV4dHVyZTEgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgZ2wuTkVBUkVTVCwgZ2wuTkVBUkVTVCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIxID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMSk7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlMSwgMCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMik7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCBpbXByb3ZlZE1hc2tUZXh0dXJlLCAwKTsKICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgIGdsLnVuaWZvcm0xaShwZXJzb25NYXNrTG9jYXRpb24sIDEpOwogICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgICAgICAgZ2wudmlld3BvcnQoMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCk7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTEpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBwZXJzb25NYXNrVGV4dHVyZSk7CiAgICAgICAgICAgIGdsLnVuaWZvcm0yZih0ZXhlbFNpemVMb2NhdGlvbiwgMCwgdGV4ZWxIZWlnaHQpOwogICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMSk7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlMSk7CiAgICAgICAgICAgIGdsLnVuaWZvcm0yZih0ZXhlbFNpemVMb2NhdGlvbiwgdGV4ZWxXaWR0aCwgMCk7CiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIyKTsKICAgICAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRV9TVFJJUCwgMCwgNCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMik7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZTEpOwogICAgICAgICAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyByZW5kZXIsIGNsZWFuVXAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBidWlsZFRGTGl0ZU91dHB1dFRvTWFza1N0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgb3V0cHV0VGV4dHVyZSwgdGZsaXRlLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0LCBvdXRwdXRNZW1vcnlPZmZzZXQpIHsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X2lucHV0U2VnbWVudGF0aW9uOwoKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CgogICAgICAgIGZsb2F0IGdldE1hc2sodmVjMiBzZWdtZW50YXRpb24pIHsKICAgICAgICAgICAgZmxvYXQgc2hpZnQgPSBtYXgoc2VnbWVudGF0aW9uLnIsIHNlZ21lbnRhdGlvbi5nKTsKICAgICAgICAgICAgZmxvYXQgYmFja2dyb3VuZEV4cCA9IGV4cChzZWdtZW50YXRpb24uciAtIHNoaWZ0KTsKICAgICAgICAgICAgZmxvYXQgcGVyc29uRXhwID0gZXhwKHNlZ21lbnRhdGlvbi5nIC0gc2hpZnQpOwogICAgICAgICAgICByZXR1cm4gcGVyc29uRXhwIC8gKGJhY2tncm91bmRFeHAgKyBwZXJzb25FeHApOwogICAgICAgIH0KCiAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICBmbG9hdCBtYXNrID0gZ2V0TWFzayh0ZXh0dXJlKHVfaW5wdXRTZWdtZW50YXRpb24sIHZfdGV4Q29vcmQpLnJnKTsKICAgICAgICAgICAgb3V0Q29sb3IgPSB2ZWM0KHZlYzMoMC4wKSwgbWFzayk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IGlucHV0TG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfaW5wdXRTZWdtZW50YXRpb24iKTsKICAgICAgICBjb25zdCBpbnB1dFRleHR1cmUgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SRzMyRiwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgZ2wuTkVBUkVTVCwgZ2wuTkVBUkVTVCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpOwogICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIpOwogICAgICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuVEVYVFVSRV8yRCwgb3V0cHV0VGV4dHVyZSwgMCk7CiAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICBnbC51bmlmb3JtMWkoaW5wdXRMb2NhdGlvbiwgMSk7CiAgICAgICAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgICAgICAgICBnbC52aWV3cG9ydCgwLCAwLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0KTsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMSk7CiAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGlucHV0VGV4dHVyZSk7CiAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgZ2wuUkcsIGdsLkZMT0FULCB0ZmxpdGUuSEVBUEYzMiwgb3V0cHV0TWVtb3J5T2Zmc2V0KTsKICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgICAgICAgICBnbC5kZWxldGVGcmFtZWJ1ZmZlcihmcmFtZUJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUoaW5wdXRUZXh0dXJlKTsKICAgICAgICAgICAgZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wuZGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgcmVuZGVyLCBjbGVhblVwIH07CiAgICB9CgogICAgZnVuY3Rpb24gYnVpbGRURkxpdGVJbnB1dFN0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgdGZsaXRlLCBpbnB1dFdpZHRoLCBpbnB1dEhlaWdodCwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCwgaW5wdXRNZW1vcnlPZmZzZXQpIHsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X2lucHV0RnJhbWU7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9mbG9hdGx1dDsKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgdW5pZm9ybSBmbG9hdCB1X3BpeGVsU2l6ZTsKICAgICAgICBvdXQgdmVjNCBvdXRDb2xvcjsKCiAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICBmbG9hdCB4ID0gdl90ZXhDb29yZC54OwogICAgICAgICAgICB2ZWM0IGNvbG9yID0gdGV4dHVyZSh1X2lucHV0RnJhbWUsIHZfdGV4Q29vcmQpOwogICAgICAgICAgICBmbG9hdCByID0gbW9kKHggKiB1X3BpeGVsU2l6ZSwgMy4wKTsKICAgICAgICAgICAgZmxvYXQgYyA9IDAuMDsKICAgICAgICAgICAgaWYgKHIgPj0gMi4wICkgYyA9IGNvbG9yLmI7CiAgICAgICAgICAgIGVsc2UgaWYgKHIgPj0gMS4wKSBjID0gY29sb3IuZzsKICAgICAgICAgICAgZWxzZSBjID0gY29sb3IucjsKICAgICAgICAgICAgb3V0Q29sb3IgPSB0ZXh0dXJlKHVfZmxvYXRsdXQsIHZlYzIoYywgMC41KSk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IGlucHV0RnJhbWVMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9pbnB1dEZyYW1lIik7CiAgICAgICAgY29uc3QgcGl4ZWxTaXplTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfcGl4ZWxTaXplIik7CiAgICAgICAgY29uc3QgZmxvYXRsdXRMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9mbG9hdGx1dCIpOwogICAgICAgIGNvbnN0IG91dHB1dFRleHR1cmUgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgaW5wdXRXaWR0aCAqIDMsIGlucHV0SGVpZ2h0KTsKICAgICAgICBjb25zdCBmcmFtZUJ1ZmZlciA9IGdsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7CiAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcik7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCBvdXRwdXRUZXh0dXJlLCAwKTsKICAgICAgICBjb25zdCBvdXRwdXRQaXhlbHMgPSBuZXcgVWludDhBcnJheSh0ZmxpdGUuSEVBUEYzMi5idWZmZXIsIGlucHV0TWVtb3J5T2Zmc2V0ICogNCwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCAqIDQgKiAzKTsKICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgIGdsLnVuaWZvcm0xaShpbnB1dEZyYW1lTG9jYXRpb24sIDApOwogICAgICAgIGdsLnVuaWZvcm0xZihwaXhlbFNpemVMb2NhdGlvbiwgaW5wdXRXaWR0aCAqIDMpOwogICAgICAgIGdsLnVuaWZvcm0xaShmbG9hdGx1dExvY2F0aW9uLCAzKTsKICAgICAgICBjb25zdCBmbG9hdEx1dFRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7CiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgZmxvYXRMdXRUZXh0dXJlKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7CiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpOwogICAgICAgIGNvbnN0IGx1dCA9IG5ldyBGbG9hdDMyQXJyYXkoMjU2KTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKQogICAgICAgICAgICBsdXRbaV0gPSBpIC8gMjU2OwogICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgMjU2LCAxLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBuZXcgVWludDhBcnJheShsdXQuYnVmZmVyLCAwLCAyNTYgKiA0KSk7CiAgICAgICAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgICAgICAgICBnbC52aWV3cG9ydCgwLCAwLCBpbnB1dFdpZHRoICogMywgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUzKTsKICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgZmxvYXRMdXRUZXh0dXJlKTsKICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgICAgICBnbC5yZWFkUGl4ZWxzKDAsIDAsIGlucHV0V2lkdGggKiAzLCBpbnB1dEhlaWdodCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgb3V0cHV0UGl4ZWxzKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgICAgICAgICAgZ2wuZGVsZXRlRnJhbWVidWZmZXIoZnJhbWVCdWZmZXIpOwogICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKG91dHB1dFRleHR1cmUpOwogICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKGZsb2F0THV0VGV4dHVyZSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVNoYWRlcihmcmFnbWVudFNoYWRlcik7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHJlbmRlciwgY2xlYW5VcCB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGdldEJsdXJFbmdpbmVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgc3dpdGNoIChwYXJhbXMuYW1vdW50KSB7CiAgICAgICAgICAgIGNhc2UgInNsaWdodCI6IHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsga2VybmVsOiAib2c1IiwgbnVtUGFzc2VzOiAxLCBiYWNrZ3JvdW5kUmVzYW1wbGVTY2FsZTogMSB9LCBwYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImhlYXZ5IjogewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyBrZXJuZWw6ICJvZzEwIiwgbnVtUGFzc2VzOiAxLCBiYWNrZ3JvdW5kUmVzYW1wbGVTY2FsZTogMC41IH0sIHBhcmFtcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyBrZXJuZWw6ICJvZzUiLCBudW1QYXNzZXM6IDEsIGJhY2tncm91bmRSZXNhbXBsZVNjYWxlOiAwLjUgfSwgcGFyYW1zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGdldEVuZ2luZVBhcmFtcyhwYXJhbXMpIHsKICAgICAgICBjb25zdCBiYXNlRW5naW5lUGFyYW1zID0gewogICAgICAgICAgICBjb3ZlcmFnZTogcGFyYW1zLmNvdmVyYWdlLAogICAgICAgIH07CiAgICAgICAgaWYgKHBhcmFtcy5iYWNrZ3JvdW5kQmx1cikgewogICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7IGJhc2VFbmdpbmVQYXJhbXMgfSwgZ2V0Qmx1ckVuZ2luZVBhcmFtcyhwYXJhbXMuYmFja2dyb3VuZEJsdXIpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJhc2VFbmdpbmVQYXJhbXM7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVXZWJHTEVuZ2luZSh2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgc2V0dXAsIGVmZmVjdENhbnZhcywgcGFyYW1zLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgY29uc3QgeyB0ZmxpdGUsIGlucHV0SGVpZ2h0LCBpbnB1dFdpZHRoLCBpbnB1dE1lbW9yeU9mZnNldCwgb3V0cHV0TWVtb3J5T2Zmc2V0LCBzZWdtZW50YXRpb25QaXhlbENvdW50IH0gPSB5aWVsZCBsb2FkU2VnbWVudGF0aW9uTW9kZWwoc2V0dXAuc2VnbWVudGF0aW9uTW9kZWxJZCk7CiAgICAgICAgICAgIGxldCBlbmdpbmVQYXJhbXMgPSBnZXRFbmdpbmVQYXJhbXMocGFyYW1zKTsKICAgICAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyU291cmNlID0gZ2xzbCBgI3ZlcnNpb24gMzAwIGVzCiAgICAgICAgaW4gdmVjMiBhX3Bvc2l0aW9uOwogICAgICAgIGluIHZlYzIgYV90ZXhDb29yZDsKICAgICAgICBvdXQgdmVjMiB2X3RleENvb3JkOwogICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KGFfcG9zaXRpb24sIDAuMCwgMS4wKTsKICAgICAgICAgICAgdl90ZXhDb29yZCA9IGFfdGV4Q29vcmQ7CiAgICAgICAgfWA7CiAgICAgICAgICAgIGNvbnN0IGdsID0gZWZmZWN0Q2FudmFzLmdldENvbnRleHQoIndlYmdsMiIsIHNldHVwLndlYmdsQ29udGV4dFNldHRpbmdzKTsKICAgICAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyID0gY29tcGlsZVNoYWRlcihnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdmVydGV4U2hhZGVyU291cmNlKTsKICAgICAgICAgICAgY29uc3QgdmVydGV4QXJyYXkgPSBnbC5jcmVhdGVWZXJ0ZXhBcnJheSgpOwogICAgICAgICAgICBnbC5iaW5kVmVydGV4QXJyYXkodmVydGV4QXJyYXkpOwogICAgICAgICAgICBjb25zdCBwb3NpdGlvbkJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpOwogICAgICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgcG9zaXRpb25CdWZmZXIpOwogICAgICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheShbLTEsIC0xLCAxLjAsIC0xLCAtMSwgMS4wLCAxLjAsIDEuMF0pLCBnbC5TVEFUSUNfRFJBVyk7CiAgICAgICAgICAgIGNvbnN0IHRleENvb3JkQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7CiAgICAgICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KFswLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCwgMS4wLCAxLjAsIDEuMF0pLCBnbC5TVEFUSUNfRFJBVyk7CiAgICAgICAgICAgIGNvbnN0IGlucHV0RnJhbWVUZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBpbnB1dEZyYW1lVGV4dHVyZSk7CiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpOwogICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QpOwogICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7CiAgICAgICAgICAgIGNvbnN0IG1hc2tUZXh0dXJlID0gY3JlYXRlVGV4dHVyZShnbCwgZ2wuUkdCQTgsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0KTsKICAgICAgICAgICAgY29uc3QgaW1wcm92ZWRNYXNrV2lkdGggPSBpbnB1dFdpZHRoOwogICAgICAgICAgICBjb25zdCBpbXByb3ZlZE1hc2tIZWlnaHQgPSBpbnB1dEhlaWdodDsKICAgICAgICAgICAgY29uc3QgaW1wcm92ZWRNYXNrVGV4dHVyZSA9IGNyZWF0ZVRleHR1cmUoZ2wsIGdsLlJHQkE4LCBpbXByb3ZlZE1hc2tXaWR0aCwgaW1wcm92ZWRNYXNrSGVpZ2h0LCBnbC5MSU5FQVIsIGdsLkxJTkVBUik7CiAgICAgICAgICAgIGNvbnN0IHRmbGl0ZUlucHV0U3RhZ2UgPSBidWlsZFRGTGl0ZUlucHV0U3RhZ2UoZ2wsIHZlcnRleFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCB0ZmxpdGUsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0LCBzZWdtZW50YXRpb25QaXhlbENvdW50LCBpbnB1dE1lbW9yeU9mZnNldCk7CiAgICAgICAgICAgIGNvbnN0IHRmbGl0ZU91dHB1dFRvTWFza1N0YWdlID0gYnVpbGRURkxpdGVPdXRwdXRUb01hc2tTdGFnZShnbCwgdmVydGV4U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIG1hc2tUZXh0dXJlLCB0ZmxpdGUsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0LCBvdXRwdXRNZW1vcnlPZmZzZXQpOwogICAgICAgICAgICBjb25zdCBpbXByb3ZlTWFza1N0YWdlID0gYnVpbGRJbXByb3ZlTWFza1N0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgbWFza1RleHR1cmUsIGltcHJvdmVkTWFza1RleHR1cmUsIGltcHJvdmVkTWFza1dpZHRoLCBpbXByb3ZlZE1hc2tIZWlnaHQpOwogICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kQmx1clN0YWdlID0gYnVpbGRCYWNrZ3JvdW5kQmx1clN0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgaW1wcm92ZWRNYXNrVGV4dHVyZSwgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQsIGVuZ2luZVBhcmFtcyk7CiAgICAgICAgICAgIGNvbnN0IGJhY2tncm91bmRJbWFnZVN0YWdlID0gYnVpbGRCYWNrZ3JvdW5kSW1hZ2VTdGFnZShnbCwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCBpbXByb3ZlZE1hc2tUZXh0dXJlLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgZW5naW5lUGFyYW1zKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGVmZmVjdEN0eDogZ2wsCiAgICAgICAgICAgICAgICB1cGRhdGVCYWNrZ3JvdW5kRnJhbWUoZnJhbWUsIF8sIHJlSW5pdCkgewogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRJbWFnZVN0YWdlLnVwZGF0ZUJhY2tncm91bmRJbWFnZShmcmFtZSwgcmVJbml0KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB1cGRhdGVQYXJhbXModXBkYXRlZFBhcmFtcykgewogICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IHVwZGF0ZWRQYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgZW5naW5lUGFyYW1zID0gZ2V0RW5naW5lUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZEJsdXJTdGFnZS51cGRhdGVQYXJhbXMoZW5naW5lUGFyYW1zKTsKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2VTdGFnZS51cGRhdGVQYXJhbXMoZW5naW5lUGFyYW1zKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzRnJhbWUoZnJhbWUpIHsKICAgICAgICAgICAgICAgICAgICBnbC5jbGVhckNvbG9yKDAsIDAsIDAsIDApOwogICAgICAgICAgICAgICAgICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQpOwogICAgICAgICAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTApOwogICAgICAgICAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGlucHV0RnJhbWVUZXh0dXJlKTsKICAgICAgICAgICAgICAgICAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGZyYW1lKTsKICAgICAgICAgICAgICAgICAgICBnbC5iaW5kVmVydGV4QXJyYXkodmVydGV4QXJyYXkpOwogICAgICAgICAgICAgICAgICAgIHRmbGl0ZUlucHV0U3RhZ2UucmVuZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgdGZsaXRlLl9ydW5JbmZlcmVuY2UoKTsKICAgICAgICAgICAgICAgICAgICB0ZmxpdGVPdXRwdXRUb01hc2tTdGFnZS5yZW5kZXIoKTsKICAgICAgICAgICAgICAgICAgICBpbXByb3ZlTWFza1N0YWdlLnJlbmRlcigpOwogICAgICAgICAgICAgICAgICAgIHBhcmFtcy5iYWNrZ3JvdW5kVXJsID8gYmFja2dyb3VuZEltYWdlU3RhZ2UucmVuZGVyKCkgOiBiYWNrZ3JvdW5kQmx1clN0YWdlLnJlbmRlcigpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7CiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZEltYWdlU3RhZ2UuY2xlYW5VcCgpOwogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRCbHVyU3RhZ2UuY2xlYW5VcCgpOwogICAgICAgICAgICAgICAgICAgIGltcHJvdmVNYXNrU3RhZ2UuY2xlYW5VcCgpOwogICAgICAgICAgICAgICAgICAgIHRmbGl0ZU91dHB1dFRvTWFza1N0YWdlLmNsZWFuVXAoKTsKICAgICAgICAgICAgICAgICAgICB0ZmxpdGVJbnB1dFN0YWdlLmNsZWFuVXAoKTsKICAgICAgICAgICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKGltcHJvdmVkTWFza1RleHR1cmUpOwogICAgICAgICAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUobWFza1RleHR1cmUpOwogICAgICAgICAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUoaW5wdXRGcmFtZVRleHR1cmUpOwogICAgICAgICAgICAgICAgICAgIGdsLmRlbGV0ZUJ1ZmZlcih0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgZ2wuZGVsZXRlQnVmZmVyKHBvc2l0aW9uQnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICBnbC5kZWxldGVWZXJ0ZXhBcnJheSh2ZXJ0ZXhBcnJheSk7CiAgICAgICAgICAgICAgICAgICAgZ2wuZGVsZXRlU2hhZGVyKHZlcnRleFNoYWRlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlY29kZUJhc2U2NChiYXNlNjQsIGVuYWJsZVVuaWNvZGUpIHsKICAgICAgICB2YXIgYmluYXJ5U3RyaW5nID0gYXRvYihiYXNlNjQpOwogICAgICAgIHJldHVybiBiaW5hcnlTdHJpbmc7CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlVVJMKGJhc2U2NCwgc291cmNlbWFwQXJnLCBlbmFibGVVbmljb2RlQXJnKSB7CiAgICAgICAgdmFyIHNvdXJjZSA9IGRlY29kZUJhc2U2NChiYXNlNjQpOwogICAgICAgIHZhciBzdGFydCA9IHNvdXJjZS5pbmRleE9mKCdcbicsIDEwKSArIDE7CiAgICAgICAgdmFyIGJvZHkgPSBzb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0KSArICgnJyk7CiAgICAgICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbYm9keV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnIH0pOwogICAgICAgIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZUJhc2U2NFdvcmtlckZhY3RvcnkoYmFzZTY0LCBzb3VyY2VtYXBBcmcsIGVuYWJsZVVuaWNvZGVBcmcpIHsKICAgICAgICB2YXIgdXJsOwogICAgICAgIHJldHVybiBmdW5jdGlvbiBXb3JrZXJGYWN0b3J5KG9wdGlvbnMpIHsKICAgICAgICAgICAgdXJsID0gdXJsIHx8IGNyZWF0ZVVSTChiYXNlNjQpOwogICAgICAgICAgICByZXR1cm4gbmV3IFdvcmtlcih1cmwsIG9wdGlvbnMpOwogICAgICAgIH07CiAgICB9CgogICAgdmFyIFdvcmtlckZhY3RvcnkgPSAvKiNfX1BVUkVfXyovY3JlYXRlQmFzZTY0V29ya2VyRmFjdG9yeSgnTHlvZ2NtOXNiSFZ3TFhCc2RXZHBiaTEzWldJdGQyOXlhMlZ5TFd4dllXUmxjaUFxTHdvb1puVnVZM1JwYjI0Z0tDa2dld29nSUNBZ0ozVnpaU0J6ZEhKcFkzUW5Pd29LSUNBZ0lHeGxkQ0IwYVcxbGNpQTlJRzUxYkd3N0NpQWdJQ0J2Ym0xbGMzTmhaMlVnUFNCbWRXNWpkR2x2YmlBb2NtVnhkV1Z6ZENrZ2V3b2dJQ0FnSUNBZ0lHTnZibk4wSUhScGJXVWdQU0J5WlhGMVpYTjBMbVJoZEdFN0NpQWdJQ0FnSUNBZ2FXWWdLSFJwYldVZ1BqMGdNQ2tLSUNBZ0lDQWdJQ0FnSUNBZ2RHbHRaWElnUFNCelpYUlVhVzFsYjNWMEtDZ3BJRDArSUhCdmMzUk5aWE56WVdkbEtDSWlLU3dnZEdsdFpTazdDaUFnSUNBZ0lDQWdaV3h6WlNCcFppQW9kR2x0WlhJcENpQWdJQ0FnSUNBZ0lDQWdJR05zWldGeVZHbHRaVzkxZENoMGFXMWxjaWs3Q2lBZ0lDQjlPd29LZlNrb0tUc0tMeThqSUhOdmRYSmpaVTFoY0hCcGJtZFZVa3c5ZEdsdFpYSXVkMjl5YTJWeUxtcHpMbTFoY0FvSycpOwogICAgLyogZXNsaW50LWVuYWJsZSAqLwoKICAgIGNsYXNzIFByb2Nlc3NvciBleHRlbmRzIGV2ZW50c0V4cG9ydHMuRXZlbnRFbWl0dGVyIHsKICAgICAgICBjb25zdHJ1Y3Rvcih7IHNldHVwLCBwYXJhbXMsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCBlbWl0IH0pIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5zZXR1cCA9IHNldHVwOwogICAgICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICAgICAgICAgICAgdGhpcy52aWRlb1dpZHRoID0gdmlkZW9XaWR0aDsKICAgICAgICAgICAgdGhpcy52aWRlb0hlaWdodCA9IHZpZGVvSGVpZ2h0OwogICAgICAgICAgICBpZiAoZW1pdCkKICAgICAgICAgICAgICAgIHRoaXMuZW1pdCA9IGVtaXQ7CiAgICAgICAgfQogICAgICAgIHNldHVwRW5naW5lKHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCBlZmZlY3RDYW52YXMsIGluaXRpYWxCYWNrZ3JvdW5kRnJhbWUpIHsKICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgICAgIHRoaXMudmlkZW9XaWR0aCA9IHZpZGVvV2lkdGg7CiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvSGVpZ2h0ID0gdmlkZW9IZWlnaHQ7CiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvQXNwZWN0UmF0aW8gPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0OwogICAgICAgICAgICAgICAgdGhpcy5lZmZlY3RDYW52YXMgPSBlZmZlY3RDYW52YXMgfHwgY3JlYXRlQ2FudmFzKHRoaXMudmlkZW9XaWR0aCwgdGhpcy52aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGVFbmdpbmUgPSB0aGlzLnNldHVwLnVzZVdlYkdMID8gY3JlYXRlV2ViR0xFbmdpbmUgOiBjcmVhdGVDYW52YXNFbmdpbmU7CiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZSA9IHlpZWxkIGNyZWF0ZUVuZ2luZSh0aGlzLnZpZGVvV2lkdGgsIHRoaXMudmlkZW9IZWlnaHQsIHRoaXMuc2V0dXAsIHRoaXMuZWZmZWN0Q2FudmFzLCB0aGlzLnBhcmFtcywgaW5pdGlhbEJhY2tncm91bmRGcmFtZSk7CiAgICAgICAgICAgICAgICB0aGlzLmVmZmVjdEN0eCA9IHRoaXMuZW5naW5lLmVmZmVjdEN0eDsKICAgICAgICAgICAgICAgIGlmIChpbml0aWFsQmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVCYWNrZ3JvdW5kRnJhbWUoeyBmcmFtZTogaW5pdGlhbEJhY2tncm91bmRGcmFtZSB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZVZpZGVvU2l6ZShfYSkgewogICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIGFyZ3VtZW50cywgdm9pZCAwLCBmdW5jdGlvbiogKHsgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQgfSkgewogICAgICAgICAgICAgICAgY29uc3Qgb2xkQmFja2dyb3VuZEZyYW1lID0gdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lOwogICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lID0gbnVsbDsKICAgICAgICAgICAgICAgIGNvbnN0IG9sZEVuZ2luZSA9IHRoaXMuZW5naW5lOwogICAgICAgICAgICAgICAgeWllbGQgdGhpcy5zZXR1cEVuZ2luZSh2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgdGhpcy5lZmZlY3RDYW52YXMsIG9sZEJhY2tncm91bmRGcmFtZSk7CiAgICAgICAgICAgICAgICBvbGRFbmdpbmUuZGlzcG9zZSgpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaW5pdChfYSkgewogICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIGFyZ3VtZW50cywgdm9pZCAwLCBmdW5jdGlvbiogKHsgaW5pdGlhbEJhY2tncm91bmRGcmFtZSwgdXNlSW5zZXJ0YWJsZVN0cmVhbXMsIGVmZmVjdENhbnZhcyB9KSB7CiAgICAgICAgICAgICAgICB5aWVsZCB0aGlzLnNldHVwRW5naW5lKHRoaXMudmlkZW9XaWR0aCwgdGhpcy52aWRlb0hlaWdodCwgZWZmZWN0Q2FudmFzLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lKTsKICAgICAgICAgICAgICAgIGlmICh1c2VJbnNlcnRhYmxlU3RyZWFtcykgewogICAgICAgICAgICAgICAgICAgIGxldCBkcm9wRmlyc3QgPSA1OwogICAgICAgICAgICAgICAgICAgIGxldCBsb2NhbFN0YXJ0VGltZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgbGV0IGZyYW1lU3RhcnRUaW1lID0gMDsKICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3RGcmFtZVJlbmRlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lciA9IG5ldyBUcmFuc2Zvcm1TdHJlYW0oewogICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IChmcmFtZSwgY29udHJvbGxlcikgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Db250cm9sbGVyID0gY29udHJvbGxlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1lVGltZXN0YW1wID0gZnJhbWUudGltZXN0YW1wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxvY2FsU3RhcnRUaW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdGFydFRpbWUgPSBub3c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTdGFydFRpbWUgPSBmcmFtZVRpbWVzdGFtcCAvIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGFwc2VkRnJhbWVUaW1lID0gZnJhbWVUaW1lc3RhbXAgLyAxMDAwIC0gZnJhbWVTdGFydFRpbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGFwc2VkTG9jYWxUaW1lID0gbm93IC0gbG9jYWxTdGFydFRpbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcEZpcnN0ID4gMCB8fCBlbGFwc2VkTG9jYWxUaW1lIDwgZWxhcHNlZEZyYW1lVGltZSArIDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0FuZFJlbmRlckZyYW1lKGZyYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc1ZpZGVvQmFja2dyb3VuZCAmJiB0aGlzLnNldHVwLnRyYW5zZmVyVHlwZSAhPT0gImNhbnZhcyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJnZXRiYWNrZ3JvdW5kZnJhbWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcm9wRmlyc3QgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcEZpcnN0LS07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdGFydFRpbWUgPSBub3c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTdGFydFRpbWUgPSBmcmFtZVRpbWVzdGFtcCAvIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFZpZGVvRnJhbWUodGhpcy5lZmZlY3RDYW52YXMsIHsgdGltZXN0YW1wOiBmcmFtZVRpbWVzdGFtcCB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0RnJhbWVSZW5kZXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RnJhbWVSZW5kZXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJmaXJzdGZyYW1lcmVuZGVyZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICghdGhpcy5zZXR1cC51c2VCYWNrZ3JvdW5kV29ya2VyKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcldvcmtlciA9IG5ldyBXb3JrZXJGYWN0b3J5KCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcldvcmtlci5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoIm91dHB1dCIsIHsgZnJhbWU6IHRoaXMuY3VycmVudE91dHB1dEZyYW1lIH0sIFt0aGlzLmN1cnJlbnRPdXRwdXRGcmFtZV0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJyZWFkeSIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlUGFyYW1zKHsgcGFyYW1zLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lIH0pIHsKICAgICAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CiAgICAgICAgICAgIHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZSA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZUN0eCA9IG51bGw7CiAgICAgICAgICAgIGlmIChpbml0aWFsQmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUJhY2tncm91bmRGcmFtZSh7IGZyYW1lOiBpbml0aWFsQmFja2dyb3VuZEZyYW1lLCByZUluaXQ6IHRydWUgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS51cGRhdGVCYWNrZ3JvdW5kRnJhbWUobnVsbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5lbmdpbmUudXBkYXRlUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZUJhY2tncm91bmRGcmFtZSh7IGZyYW1lLCByZUluaXQgfSkgewogICAgICAgICAgICBsZXQgdXBkYXRlZERpbWVuc2lvbnM7CiAgICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgICAgICAgICB0aGlzLmhhc1ZpZGVvQmFja2dyb3VuZCA9IHRoaXMucGFyYW1zLmJhY2tncm91bmRVcmwgJiYgdGhpcy5wYXJhbXMuYmFja2dyb3VuZFR5cGUgPT09ICJ2aWRlbyI7CiAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucyA9IHsgeDogMCwgeTogMCwgd2lkdGg6IHRoaXMudmlkZW9XaWR0aCwgaGVpZ2h0OiB0aGlzLnZpZGVvSGVpZ2h0IH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNldHVwLnRyYW5zZmVyVHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSAiaW1hZ2ViaXRtYXAiOiB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lID0gZnJhbWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXNlICJpbWFnZWRhdGEiOiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lID0gY3JlYXRlQ2FudmFzKHRoaXMudmlkZW9XaWR0aCwgdGhpcy52aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZUN0eCA9IHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZS5nZXRDb250ZXh0KCIyZCIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmcmFtZSA9IG5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGZyYW1lKSwgdGhpcy52aWRlb1dpZHRoLCB0aGlzLnZpZGVvSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWVDdHgucHV0SW1hZ2VEYXRhKGZyYW1lLCAwLCAwKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhc2UgImNhbnZhcyI6IHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucy53aWR0aCA9IGZyYW1lLnZpZGVvV2lkdGggfHwgZnJhbWUubmF0dXJhbFdpZHRoIHx8IGZyYW1lLndpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucy5oZWlnaHQgPSBmcmFtZS52aWRlb0hlaWdodCB8fCBmcmFtZS5uYXR1cmFsSGVpZ2h0IHx8IGZyYW1lLmhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFja2dyb3VuZEFzcGVjdFJhdGlvID0gdXBkYXRlZERpbWVuc2lvbnMud2lkdGggLyB1cGRhdGVkRGltZW5zaW9ucy5oZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kQXNwZWN0UmF0aW8gPiB0aGlzLnZpZGVvQXNwZWN0UmF0aW8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dHNpZGVYID0gdXBkYXRlZERpbWVuc2lvbnMud2lkdGggLSB1cGRhdGVkRGltZW5zaW9ucy5oZWlnaHQgKiB0aGlzLnZpZGVvQXNwZWN0UmF0aW87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucy53aWR0aCAtPSBvdXRzaWRlWDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWREaW1lbnNpb25zLnggPSBNYXRoLmZsb29yKG91dHNpZGVYIC8gMik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYmFja2dyb3VuZEFzcGVjdFJhdGlvIDwgdGhpcy52aWRlb0FzcGVjdFJhdGlvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRzaWRlWSA9IHVwZGF0ZWREaW1lbnNpb25zLmhlaWdodCAtIHVwZGF0ZWREaW1lbnNpb25zLndpZHRoIC8gdGhpcy52aWRlb0FzcGVjdFJhdGlvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZERpbWVuc2lvbnMuaGVpZ2h0IC09IG91dHNpZGVZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZERpbWVuc2lvbnMueSA9IE1hdGguZmxvb3Iob3V0c2lkZVkgLyAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUgPSBmcmFtZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmVuZ2luZS51cGRhdGVCYWNrZ3JvdW5kRnJhbWUodGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lLCB1cGRhdGVkRGltZW5zaW9ucywgcmVJbml0KTsKICAgICAgICB9CiAgICAgICAgdGVybWluYXRlKCkgewogICAgICAgICAgICBpZiAodGhpcy50cmFuc2Zvcm1Db250cm9sbGVyKQogICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Db250cm9sbGVyLnRlcm1pbmF0ZSgpOwogICAgICAgICAgICBpZiAodGhpcy50aW1lcldvcmtlcikKICAgICAgICAgICAgICAgIHRoaXMudGltZXJXb3JrZXIudGVybWluYXRlKCk7CiAgICAgICAgICAgIGlmICh0aGlzLmVuZ2luZSkgewogICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUuZGlzcG9zZSgpOwogICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmF0ZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLmVtaXQoInRlcm1pbmF0ZWQiKTsKICAgICAgICB9CiAgICAgICAgc3RhcnQoeyBpbnB1dFN0cmVhbSwgb3V0cHV0U3RyZWFtIH0pIHsKICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtKQogICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0ucGlwZVRocm91Z2godGhpcy50cmFuc2Zvcm1lcikucGlwZVRvKG91dHB1dFN0cmVhbSk7CiAgICAgICAgICAgIHRoaXMuZnJhbWVDb3VudGVyID0gMDsKICAgICAgICAgICAgdGhpcy5mcmFtZUNvdW50ZXJUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgICAgfQogICAgICAgIGlucHV0KF9hKSB7CiAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgYXJndW1lbnRzLCB2b2lkIDAsIGZ1bmN0aW9uKiAoeyB2aWRlb0ZyYW1lLCBiYWNrZ3JvdW5kRnJhbWUsIHJlcXVlc3RUaW1lLCBsYXN0UmVuZGVyVGltZSwgZGVsYXkgfSkgewogICAgICAgICAgICAgICAgdmFyIF9iOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmF0ZWQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgY29uc3QgcnR0ID0gKERhdGUubm93KCkgLSByZXF1ZXN0VGltZSkgKiAyOwogICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuVGltZSA9IGxhc3RSZW5kZXJUaW1lICsgZGVsYXkgLSBydHQ7CiAgICAgICAgICAgICAgICBpZiAoYmFja2dyb3VuZEZyYW1lKQogICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQmFja2dyb3VuZEZyYW1lKHsgZnJhbWU6IGJhY2tncm91bmRGcmFtZSB9KTsKICAgICAgICAgICAgICAgIGxldCBmcmFtZTsKICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zZXR1cC50cmFuc2ZlclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICJpbWFnZWJpdG1hcCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgKF9iID0gdGhpcy5wcmV2VmlkZW9GcmFtZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJldlZpZGVvRnJhbWUgPSB2aWRlb0ZyYW1lOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NBbmRSZW5kZXJGcmFtZSh2aWRlb0ZyYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgPSB5aWVsZCBjcmVhdGVJbWFnZUJpdG1hcCh0aGlzLmVmZmVjdENhbnZhcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXNlICJpbWFnZWRhdGEiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUgPSBuZXcgSW1hZ2VEYXRhKG5ldyBVaW50OENsYW1wZWRBcnJheSh2aWRlb0ZyYW1lKSwgdGhpcy52aWRlb1dpZHRoLCB0aGlzLnZpZGVvSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlucHV0Q2FudmFzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0Q2FudmFzID0gY3JlYXRlQ2FudmFzKHRoaXMudmlkZW9XaWR0aCwgdGhpcy52aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0Q2FudmFzQ3R4ID0gdGhpcy5pbnB1dENhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRDYW52YXNDdHgucHV0SW1hZ2VEYXRhKHZpZGVvRnJhbWUsIDAsIDApOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NBbmRSZW5kZXJGcmFtZSh0aGlzLmlucHV0Q2FudmFzKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgPSB0aGlzLmVmZmVjdEN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdGhpcy52aWRlb1dpZHRoLCB0aGlzLnZpZGVvSGVpZ2h0KS5kYXRhLmJ1ZmZlcjsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhc2UgImNhbnZhcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQW5kUmVuZGVyRnJhbWUodmlkZW9GcmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lID0gdGhpcy5lZmZlY3RDYW52YXM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuRGVsYXkgPSBNYXRoLm1heCgwLCByZXR1cm5UaW1lIC0gRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy50aW1lcldvcmtlcikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE91dHB1dEZyYW1lID0gZnJhbWU7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcldvcmtlci5wb3N0TWVzc2FnZShyZXR1cm5EZWxheSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJvdXRwdXQiLCB7IGZyYW1lIH0sIFtmcmFtZV0pOwogICAgICAgICAgICAgICAgICAgIH0sIHJldHVybkRlbGF5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHByb2Nlc3NBbmRSZW5kZXJGcmFtZShmcmFtZSkgewogICAgICAgICAgICB0aGlzLmVuZ2luZS5wcm9jZXNzRnJhbWUoZnJhbWUpOwogICAgICAgICAgICBpZiAodGhpcy5zZXR1cC5sb2dUb0NvbnNvbGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZnJhbWVDb3VudGVyKys7CiAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgICAgICAgICAgICAgIGlmIChub3cgLSB0aGlzLmZyYW1lQ291bnRlclRpbWUgPiAxMDAwKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJ1bm5pbmcgY2FtZXJhIGVmZmVjdHMsICR7TWF0aC5yb3VuZCgodGhpcy5mcmFtZUNvdW50ZXIgKiAxMDAwKSAvIChub3cgLSB0aGlzLmZyYW1lQ291bnRlclRpbWUpKX0gZnBzYCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmFtZUNvdW50ZXIgPSAwOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZnJhbWVDb3VudGVyVGltZSA9IG5vdzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBjb25zdCBwcm9jZXNzb3JzID0ge307CiAgICBvbm1lc3NhZ2UgPSBmdW5jdGlvbiAocmVxdWVzdCkgewogICAgICAgIHZhciBfYTsKICAgICAgICBjb25zdCBwcm9jZXNzb3JJZCA9IHJlcXVlc3QuZGF0YS5wcm9jZXNzb3JJZDsKICAgICAgICBpZiAocmVxdWVzdC5kYXRhLnR5cGUgPT09ICJjcmVhdGUiKSB7CiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NvciA9IG5ldyBQcm9jZXNzb3IoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXF1ZXN0LmRhdGEpLCB7IGVtaXQ6ICh0eXBlLCBkYXRhLCB0cmFuc2ZlcikgPT4gcG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbih7IHByb2Nlc3NvcklkLCB0eXBlIH0sIGRhdGEpLCB0cmFuc2ZlcikgfSkpOwogICAgICAgICAgICBwcm9jZXNzb3JzW3Byb2Nlc3NvcklkXSA9IHByb2Nlc3NvcjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIChfYSA9IHByb2Nlc3NvcnNbcHJvY2Vzc29ySWRdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbcmVxdWVzdC5kYXRhLnR5cGVdKHJlcXVlc3QuZGF0YSk7CiAgICAgICAgICAgIGlmIChyZXF1ZXN0LmRhdGEudHlwZSA9PT0gInRlcm1pbmF0ZSIpIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBwcm9jZXNzb3JzW3Byb2Nlc3NvcklkXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgY29uc3QgY3JlYXRlVEZMaXRlU0lNRE1vZHVsZSA9IChmdW5jdGlvbiAoKSB7CiAgICAgICAgbGV0IF9zY3JpcHREaXIgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICJ1bmRlZmluZWQiICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgPyBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyA6IHVuZGVmaW5lZDsKICAgICAgICBpZiAodHlwZW9mIF9fZmlsZW5hbWUgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICBfc2NyaXB0RGlyID0gX3NjcmlwdERpciB8fCBfX2ZpbGVuYW1lOwogICAgICAgIHJldHVybiBmdW5jdGlvbiAoY3JlYXRlVEZMaXRlU0lNRE1vZHVsZSkgewogICAgICAgICAgICBjcmVhdGVURkxpdGVTSU1ETW9kdWxlID0gY3JlYXRlVEZMaXRlU0lNRE1vZHVsZSB8fCB7fTsKICAgICAgICAgICAgdmFyIE1vZHVsZSA9IHR5cGVvZiBjcmVhdGVURkxpdGVTSU1ETW9kdWxlICE9PSAidW5kZWZpbmVkIiA/IGNyZWF0ZVRGTGl0ZVNJTURNb2R1bGUgOiB7fTsKICAgICAgICAgICAgdmFyIHJlYWR5UHJvbWlzZVJlc29sdmUsIHJlYWR5UHJvbWlzZVJlamVjdDsKICAgICAgICAgICAgTW9kdWxlWyJyZWFkeSJdID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgcmVhZHlQcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7CiAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZWplY3QgPSByZWplY3Q7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgbW9kdWxlT3ZlcnJpZGVzID0ge307CiAgICAgICAgICAgIHZhciBrZXk7CiAgICAgICAgICAgIGZvciAoa2V5IGluIE1vZHVsZSkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgbW9kdWxlT3ZlcnJpZGVzW2tleV0gPSBNb2R1bGVba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdGhpc1Byb2dyYW0gPSAiLi90aGlzLnByb2dyYW0iOwogICAgICAgICAgICB2YXIgcXVpdF8gPSBmdW5jdGlvbiAoc3RhdHVzLCB0b1Rocm93KSB7CiAgICAgICAgICAgICAgICB0aHJvdyB0b1Rocm93OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgRU5WSVJPTk1FTlRfSVNfV0VCID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBFTlZJUk9OTUVOVF9JU19XT1JLRVIgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX05PREUgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX1NIRUxMID0gZmFsc2U7CiAgICAgICAgICAgIEVOVklST05NRU5UX0lTX1dFQiA9IHR5cGVvZiB3aW5kb3cgPT09ICJvYmplY3QiOwogICAgICAgICAgICBFTlZJUk9OTUVOVF9JU19XT1JLRVIgPSB0eXBlb2YgaW1wb3J0U2NyaXB0cyA9PT0gImZ1bmN0aW9uIjsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfTk9ERSA9CiAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2VzcyA9PT0gIm9iamVjdCIgJiYKICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucyA9PT0gIm9iamVjdCIgJiYKICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlID09PSAic3RyaW5nIjsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfU0hFTEwgPSAhRU5WSVJPTk1FTlRfSVNfV0VCICYmICFFTlZJUk9OTUVOVF9JU19OT0RFICYmICFFTlZJUk9OTUVOVF9JU19XT1JLRVI7CiAgICAgICAgICAgIHZhciBzY3JpcHREaXJlY3RvcnkgPSAiIjsKICAgICAgICAgICAgZnVuY3Rpb24gbG9jYXRlRmlsZShwYXRoKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJsb2NhdGVGaWxlIl0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTW9kdWxlWyJsb2NhdGVGaWxlIl0ocGF0aCwgc2NyaXB0RGlyZWN0b3J5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBzY3JpcHREaXJlY3RvcnkgKyBwYXRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciByZWFkXywgcmVhZEFzeW5jLCByZWFkQmluYXJ5OwogICAgICAgICAgICB2YXIgbm9kZUZTOwogICAgICAgICAgICB2YXIgbm9kZVBhdGg7CiAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19OT0RFKSB7CiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gcmVxdWlyZSgicGF0aCIpLmRpcm5hbWUoc2NyaXB0RGlyZWN0b3J5KSArICIvIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IF9fZGlybmFtZSArICIvIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gc2hlbGxfcmVhZChmaWxlbmFtZSwgYmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlRlMpCiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVGUyA9IHJlcXVpcmUoImZzIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlUGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVBhdGggPSByZXF1aXJlKCJwYXRoIik7CiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBub2RlUGF0aFsibm9ybWFsaXplIl0oZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlRlNbInJlYWRGaWxlU3luYyJdKGZpbGVuYW1lLCBiaW5hcnkgPyBudWxsIDogInV0ZjgiKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gcmVhZEJpbmFyeShmaWxlbmFtZSkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSByZWFkXyhmaWxlbmFtZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXQuYnVmZmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBVaW50OEFycmF5KHJldCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzWyJhcmd2Il0ubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICAgIHRoaXNQcm9ncmFtID0gcHJvY2Vzc1siYXJndiJdWzFdLnJlcGxhY2UoL1xcL2csICIvIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJhcmd2Il0uc2xpY2UoMik7CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJvbiJdKCJ1bmNhdWdodEV4Y2VwdGlvbiIsIGZ1bmN0aW9uIChleCkgewogICAgICAgICAgICAgICAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgRXhpdFN0YXR1cykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJvbiJdKCJ1bmhhbmRsZWRSZWplY3Rpb24iLCBhYm9ydCk7CiAgICAgICAgICAgICAgICBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICBwcm9jZXNzWyJleGl0Il0oc3RhdHVzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBNb2R1bGVbImluc3BlY3QiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdIjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoRU5WSVJPTk1FTlRfSVNfU0hFTEwpIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVhZCAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gc2hlbGxfcmVhZChmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkKGYpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gcmVhZEJpbmFyeShmKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGE7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZWFkYnVmZmVyID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShyZWFkYnVmZmVyKGYpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlYWQoZiwgImJpbmFyeSIpOwogICAgICAgICAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgZGF0YSA9PT0gIm9iamVjdCIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2NyaXB0QXJncyAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdEFyZ3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHF1aXQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcXVpdChzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHByaW50ICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyA9IHByaW50OwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiA9IGNvbnNvbGUuZXJyb3IgPSB0eXBlb2YgcHJpbnRFcnIgIT09ICJ1bmRlZmluZWQiID8gcHJpbnRFcnIgOiBwcmludDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChFTlZJUk9OTUVOVF9JU19XRUIgfHwgRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gc2VsZi5sb2NhdGlvbi5ocmVmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0KSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoX3NjcmlwdERpcikgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IF9zY3JpcHREaXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2NyaXB0RGlyZWN0b3J5LmluZGV4T2YoImJsb2I6IikgIT09IDApIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBzY3JpcHREaXJlY3Rvcnkuc3Vic3RyKDAsIHNjcmlwdERpcmVjdG9yeS5sYXN0SW5kZXhPZigiLyIpICsgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZWFkXyA9IGZ1bmN0aW9uICh1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub3BlbigiR0VUIiwgdXJsLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5zZW5kKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGhyLnJlc3BvbnNlVGV4dDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEJpbmFyeSA9IGZ1bmN0aW9uICh1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5vcGVuKCJHRVQiLCB1cmwsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnNlbmQobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeGhyLnJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVhZEFzeW5jID0gZnVuY3Rpb24gKHVybCwgb25sb2FkLCBvbmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwIHx8ICh4aHIuc3RhdHVzID09IDAgJiYgeGhyLnJlc3BvbnNlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubG9hZCh4aHIucmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9uZXJyb3IgPSBvbmVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIuc2VuZChudWxsKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgOwogICAgICAgICAgICB2YXIgb3V0ID0gTW9kdWxlWyJwcmludCJdIHx8IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7CiAgICAgICAgICAgIHZhciBlcnIgPSBNb2R1bGVbInByaW50RXJyIl0gfHwgY29uc29sZS53YXJuLmJpbmQoY29uc29sZSk7CiAgICAgICAgICAgIGZvciAoa2V5IGluIG1vZHVsZU92ZXJyaWRlcykgewogICAgICAgICAgICAgICAgaWYgKG1vZHVsZU92ZXJyaWRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlW2tleV0gPSBtb2R1bGVPdmVycmlkZXNba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBtb2R1bGVPdmVycmlkZXMgPSBudWxsOwogICAgICAgICAgICBpZiAoTW9kdWxlWyJhcmd1bWVudHMiXSkKICAgICAgICAgICAgICAgIE1vZHVsZVsiYXJndW1lbnRzIl07CiAgICAgICAgICAgIGlmIChNb2R1bGVbInRoaXNQcm9ncmFtIl0pCiAgICAgICAgICAgICAgICB0aGlzUHJvZ3JhbSA9IE1vZHVsZVsidGhpc1Byb2dyYW0iXTsKICAgICAgICAgICAgaWYgKE1vZHVsZVsicXVpdCJdKQogICAgICAgICAgICAgICAgcXVpdF8gPSBNb2R1bGVbInF1aXQiXTsKICAgICAgICAgICAgdmFyIHdhc21CaW5hcnk7CiAgICAgICAgICAgIGlmIChNb2R1bGVbIndhc21CaW5hcnkiXSkKICAgICAgICAgICAgICAgIHdhc21CaW5hcnkgPSBNb2R1bGVbIndhc21CaW5hcnkiXTsKICAgICAgICAgICAgTW9kdWxlWyJub0V4aXRSdW50aW1lIl0gfHwgdHJ1ZTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBXZWJBc3NlbWJseSAhPT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgICAgIGFib3J0KCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHdhc21NZW1vcnk7CiAgICAgICAgICAgIHZhciBBQk9SVCA9IGZhbHNlOwogICAgICAgICAgICBmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLCB0ZXh0KSB7CiAgICAgICAgICAgICAgICBpZiAoIWNvbmRpdGlvbikgewogICAgICAgICAgICAgICAgICAgIGFib3J0KCJBc3NlcnRpb24gZmFpbGVkOiAiICsgdGV4dCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIFVURjhEZWNvZGVyID0gdHlwZW9mIFRleHREZWNvZGVyICE9PSAidW5kZWZpbmVkIiA/IG5ldyBUZXh0RGVjb2RlcigidXRmOCIpIDogdW5kZWZpbmVkOwogICAgICAgICAgICBmdW5jdGlvbiBVVEY4QXJyYXlUb1N0cmluZyhoZWFwLCBpZHgsIG1heEJ5dGVzVG9SZWFkKSB7CiAgICAgICAgICAgICAgICB2YXIgZW5kSWR4ID0gaWR4ICsgbWF4Qnl0ZXNUb1JlYWQ7CiAgICAgICAgICAgICAgICB2YXIgZW5kUHRyID0gaWR4OwogICAgICAgICAgICAgICAgd2hpbGUgKGhlYXBbZW5kUHRyXSAmJiAhKGVuZFB0ciA+PSBlbmRJZHgpKQogICAgICAgICAgICAgICAgICAgICsrZW5kUHRyOwogICAgICAgICAgICAgICAgaWYgKGVuZFB0ciAtIGlkeCA+IDE2ICYmIGhlYXAuc3ViYXJyYXkgJiYgVVRGOERlY29kZXIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVVRGOERlY29kZXIuZGVjb2RlKGhlYXAuc3ViYXJyYXkoaWR4LCBlbmRQdHIpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBzdHIgPSAiIjsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaWR4IDwgZW5kUHRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MCA9IGhlYXBbaWR4KytdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh1MCAmIDEyOCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHUwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MSA9IGhlYXBbaWR4KytdICYgNjM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodTAgJiAyMjQpID09IDE5MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKCh1MCAmIDMxKSA8PCA2KSB8IHUxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MiA9IGhlYXBbaWR4KytdICYgNjM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodTAgJiAyNDApID09IDIyNCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTAgPSAoKHUwICYgMTUpIDw8IDEyKSB8ICh1MSA8PCA2KSB8IHUyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTAgPSAoKHUwICYgNykgPDwgMTgpIHwgKHUxIDw8IDEyKSB8ICh1MiA8PCA2KSB8IChoZWFwW2lkeCsrXSAmIDYzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodTAgPCA2NTUzNikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoID0gdTAgLSA2NTUzNjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2IHwgKGNoID4+IDEwKSwgNTYzMjAgfCAoY2ggJiAxMDIzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIFVURjhUb1N0cmluZyhwdHIsIG1heEJ5dGVzVG9SZWFkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcHRyID8gVVRGOEFycmF5VG9TdHJpbmcoSEVBUFU4LCBwdHIsIG1heEJ5dGVzVG9SZWFkKSA6ICIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHdyaXRlQXNjaWlUb01lbW9yeShzdHIsIGJ1ZmZlciwgZG9udEFkZE51bGwpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgSEVBUDhbYnVmZmVyKysgPj4gMF0gPSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEhFQVA4W2J1ZmZlciA+PiAwXSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gYWxpZ25VcCh4LCBtdWx0aXBsZSkgewogICAgICAgICAgICAgICAgaWYgKHggJSBtdWx0aXBsZSA+IDApIHsKICAgICAgICAgICAgICAgICAgICB4ICs9IG11bHRpcGxlIC0gKHggJSBtdWx0aXBsZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgYnVmZmVyLCBIRUFQOCwgSEVBUFU4LCBIRUFQMzI7CiAgICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKGJ1ZikgewogICAgICAgICAgICAgICAgYnVmZmVyID0gYnVmOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQOCJdID0gSEVBUDggPSBuZXcgSW50OEFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVAxNiJdID0gbmV3IEludDE2QXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUDMyIl0gPSBIRUFQMzIgPSBuZXcgSW50MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQVTgiXSA9IEhFQVBVOCA9IG5ldyBVaW50OEFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBVMTYiXSA9IG5ldyBVaW50MTZBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQVTMyIl0gPSBuZXcgVWludDMyQXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUEYzMiJdID0gbmV3IEZsb2F0MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQRjY0Il0gPSBuZXcgRmxvYXQ2NEFycmF5KGJ1Zik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTW9kdWxlWyJJTklUSUFMX01FTU9SWSJdIHx8IDE2Nzc3MjE2OwogICAgICAgICAgICB2YXIgd2FzbVRhYmxlOwogICAgICAgICAgICB2YXIgX19BVFBSRVJVTl9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUSU5JVF9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUTUFJTl9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUUE9TVFJVTl9fID0gW107CiAgICAgICAgICAgIF9fQVRJTklUX18ucHVzaCh7CiAgICAgICAgICAgICAgICBmdW5jOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgX19fd2FzbV9jYWxsX2N0b3JzKCk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZnVuY3Rpb24gcHJlUnVuKCkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsicHJlUnVuIl0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicHJlUnVuIl0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJwcmVSdW4iXSA9IFtNb2R1bGVbInByZVJ1biJdXTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwcmVSdW4iXS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkT25QcmVSdW4oTW9kdWxlWyJwcmVSdW4iXS5zaGlmdCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUFJFUlVOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGluaXRSdW50aW1lKCkgewogICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVElOSVRfXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcHJlTWFpbigpIHsKICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRNQUlOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHBvc3RSdW4oKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJwb3N0UnVuIl0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicG9zdFJ1biJdID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZVsicG9zdFJ1biJdID0gW01vZHVsZVsicG9zdFJ1biJdXTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwb3N0UnVuIl0ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE9uUG9zdFJ1bihNb2R1bGVbInBvc3RSdW4iXS5zaGlmdCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUE9TVFJVTl9fKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBhZGRPblByZVJ1bihjYikgewogICAgICAgICAgICAgICAgX19BVFBSRVJVTl9fLnVuc2hpZnQoY2IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZE9uUG9zdFJ1bihjYikgewogICAgICAgICAgICAgICAgX19BVFBPU1RSVU5fXy51bnNoaWZ0KGNiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcnVuRGVwZW5kZW5jaWVzID0gMDsKICAgICAgICAgICAgdmFyIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IG51bGw7CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZFJ1bkRlcGVuZGVuY3koaWQpIHsKICAgICAgICAgICAgICAgIHJ1bkRlcGVuZGVuY2llcysrOwogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0ocnVuRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiByZW1vdmVSdW5EZXBlbmRlbmN5KGlkKSB7CiAgICAgICAgICAgICAgICBydW5EZXBlbmRlbmNpZXMtLTsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKHJ1bkRlcGVuZGVuY2llcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID09IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzRnVsZmlsbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGRlcGVuZGVuY2llc0Z1bGZpbGxlZDsKICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTW9kdWxlWyJwcmVsb2FkZWRJbWFnZXMiXSA9IHt9OwogICAgICAgICAgICBNb2R1bGVbInByZWxvYWRlZEF1ZGlvcyJdID0ge307CiAgICAgICAgICAgIGZ1bmN0aW9uIGFib3J0KHdoYXQpIHsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbIm9uQWJvcnQiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsib25BYm9ydCJdKHdoYXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hhdCArPSAiIjsKICAgICAgICAgICAgICAgIGVycih3aGF0KTsKICAgICAgICAgICAgICAgIEFCT1JUID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHdoYXQgPSAiYWJvcnQoIiArIHdoYXQgKyAiKS4gQnVpbGQgd2l0aCAtcyBBU1NFUlRJT05TPTEgZm9yIG1vcmUgaW5mby4iOwogICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKHdoYXQpOwogICAgICAgICAgICAgICAgcmVhZHlQcm9taXNlUmVqZWN0KGUpOwogICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBoYXNQcmVmaXgoc3RyLCBwcmVmaXgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGggPyBzdHIuc3RhcnRzV2l0aChwcmVmaXgpIDogc3RyLmluZGV4T2YocHJlZml4KSA9PT0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZGF0YVVSSVByZWZpeCA9ICJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIjsKICAgICAgICAgICAgZnVuY3Rpb24gaXNEYXRhVVJJKGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLCBkYXRhVVJJUHJlZml4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZmlsZVVSSVByZWZpeCA9ICJmaWxlOi8vIjsKICAgICAgICAgICAgZnVuY3Rpb24gaXNGaWxlVVJJKGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLCBmaWxlVVJJUHJlZml4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd2FzbUJpbmFyeUZpbGUgPSAidGZsaXRlLXNpbWQud2FzbSI7CiAgICAgICAgICAgIGlmICghaXNEYXRhVVJJKHdhc21CaW5hcnlGaWxlKSkgewogICAgICAgICAgICAgICAgd2FzbUJpbmFyeUZpbGUgPSBsb2NhdGVGaWxlKHdhc21CaW5hcnlGaWxlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBnZXRCaW5hcnkoZmlsZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSA9PSB3YXNtQmluYXJ5RmlsZSAmJiB3YXNtQmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh3YXNtQmluYXJ5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRCaW5hcnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRCaW5hcnkoZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAiYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWQiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBhYm9ydChlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEJpbmFyeVByb21pc2UoKSB7CiAgICAgICAgICAgICAgICBpZiAoIXdhc21CaW5hcnkgJiYgKEVOVklST05NRU5UX0lTX1dFQiB8fCBFTlZJUk9OTUVOVF9JU19XT1JLRVIpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmZXRjaCA9PT0gImZ1bmN0aW9uIiAmJiAhaXNGaWxlVVJJKHdhc21CaW5hcnlGaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUsIHsgY3JlZGVudGlhbHM6ICJzYW1lLW9yaWdpbiIgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZVsib2siXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICciICsgd2FzbUJpbmFyeUZpbGUgKyAiJyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VbImFycmF5QnVmZmVyIl0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmluYXJ5KHdhc21CaW5hcnlGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZEFzeW5jKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRBc3luYyh3YXNtQmluYXJ5RmlsZSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByZWplY3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJpbmFyeSh3YXNtQmluYXJ5RmlsZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBjcmVhdGVXYXNtKCkgewogICAgICAgICAgICAgICAgdmFyIGluZm8gPSB7IGE6IGFzbUxpYnJhcnlBcmcgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJlY2VpdmVJbnN0YW5jZShpbnN0YW5jZSwgbW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGV4cG9ydHMgPSBpbnN0YW5jZS5leHBvcnRzOwogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsiYXNtIl0gPSBleHBvcnRzOwogICAgICAgICAgICAgICAgICAgIHdhc21NZW1vcnkgPSBNb2R1bGVbImFzbSJdWyJxIl07CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgIHdhc21UYWJsZSA9IE1vZHVsZVsiYXNtIl1bIkQiXTsKICAgICAgICAgICAgICAgICAgICByZW1vdmVSdW5EZXBlbmRlbmN5KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhZGRSdW5EZXBlbmRlbmN5KCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKG91dHB1dCkgewogICAgICAgICAgICAgICAgICAgIHJlY2VpdmVJbnN0YW5jZShvdXRwdXRbImluc3RhbmNlIl0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCaW5hcnlQcm9taXNlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGJpbmFyeSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoYmluYXJ5LCBpbmZvKTsKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZWNlaXZlciwgZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgICAgICAgICAgICBlcnIoImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIgKyByZWFzb24pOwogICAgICAgICAgICAgICAgICAgICAgICBhYm9ydChyZWFzb24pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaW5zdGFudGlhdGVBc3luYygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdhc21CaW5hcnkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nID09PSAiZnVuY3Rpb24iICYmCiAgICAgICAgICAgICAgICAgICAgICAgICFpc0RhdGFVUkkod2FzbUJpbmFyeUZpbGUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICFpc0ZpbGVVUkkod2FzbUJpbmFyeUZpbGUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBmZXRjaCA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUsIHsgY3JlZGVudGlhbHM6ICJzYW1lLW9yaWdpbiIgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhyZXNwb25zZSwgaW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4ocmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZSwgZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycigid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICIgKyByZWFzb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycigiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbImluc3RhbnRpYXRlV2FzbSJdKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4cG9ydHMgPSBNb2R1bGVbImluc3RhbnRpYXRlV2FzbSJdKGluZm8sIHJlY2VpdmVJbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleHBvcnRzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlcnIoIk1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6ICIgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlQXN5bmMoKS5jYXRjaChyZWFkeVByb21pc2VSZWplY3QpOwogICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGNhbGxSdW50aW1lQ2FsbGJhY2tzKGNhbGxiYWNrcykgewogICAgICAgICAgICAgICAgd2hpbGUgKGNhbGxiYWNrcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKE1vZHVsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGNhbGxiYWNrLmZ1bmM7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmdW5jID09PSAibnVtYmVyIikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2suYXJnID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhc21UYWJsZS5nZXQoZnVuYykoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhc21UYWJsZS5nZXQoZnVuYykoY2FsbGJhY2suYXJnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyhjYWxsYmFjay5hcmcgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjay5hcmcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfYWJvcnQoKSB7CiAgICAgICAgICAgICAgICBhYm9ydCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfZW1zY3JpcHRlbl9nZXRfbm93OwogICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkgewogICAgICAgICAgICAgICAgX2Vtc2NyaXB0ZW5fZ2V0X25vdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHByb2Nlc3NbImhydGltZSJdKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbMF0gKiAxZTMgKyB0WzFdIC8gMWU2OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZGF0ZU5vdyAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIF9lbXNjcmlwdGVuX2dldF9ub3cgPSBkYXRlTm93OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIF9lbXNjcmlwdGVuX2dldF9ub3cgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIF9lbXNjcmlwdGVuX2dldF9ub3dfaXNfbW9ub3RvbmljID0gdHJ1ZTsKICAgICAgICAgICAgZnVuY3Rpb24gc2V0RXJyTm8odmFsdWUpIHsKICAgICAgICAgICAgICAgIEhFQVAzMltfX19lcnJub19sb2NhdGlvbigpID4+IDJdID0gdmFsdWU7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Nsb2NrX2dldHRpbWUoY2xrX2lkLCB0cCkgewogICAgICAgICAgICAgICAgdmFyIG5vdzsKICAgICAgICAgICAgICAgIGlmIChjbGtfaWQgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBub3cgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoKGNsa19pZCA9PT0gMSB8fCBjbGtfaWQgPT09IDQpICYmIF9lbXNjcmlwdGVuX2dldF9ub3dfaXNfbW9ub3RvbmljKSB7CiAgICAgICAgICAgICAgICAgICAgbm93ID0gX2Vtc2NyaXB0ZW5fZ2V0X25vdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2V0RXJyTm8oMjgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEhFQVAzMlt0cCA+PiAyXSA9IChub3cgLyAxZTMpIHwgMDsKICAgICAgICAgICAgICAgIEhFQVAzMlsodHAgKyA0KSA+PiAyXSA9ICgobm93ICUgMWUzKSAqIDFlMyAqIDFlMykgfCAwOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Rsb3BlbihmaWxlbmFtZSwgZmxhZykgewogICAgICAgICAgICAgICAgYWJvcnQoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9kbHN5bShoYW5kbGUsIHN5bWJvbCkgewogICAgICAgICAgICAgICAgYWJvcnQoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbXNjcmlwdGVuX21lbWNweV9iaWcoZGVzdCwgc3JjLCBudW0pIHsKICAgICAgICAgICAgICAgIEhFQVBVOC5jb3B5V2l0aGluKGRlc3QsIHNyYywgc3JjICsgbnVtKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZW1zY3JpcHRlbl9nZXRfaGVhcF9zaXplKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEhFQVBVOC5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZW1zY3JpcHRlbl9yZWFsbG9jX2J1ZmZlcihzaXplKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHdhc21NZW1vcnkuZ3Jvdygoc2l6ZSAtIGJ1ZmZlci5ieXRlTGVuZ3RoICsgNjU1MzUpID4+PiAxNik7CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwKHJlcXVlc3RlZFNpemUpIHsKICAgICAgICAgICAgICAgIHZhciBvbGRTaXplID0gX2Vtc2NyaXB0ZW5fZ2V0X2hlYXBfc2l6ZSgpOwogICAgICAgICAgICAgICAgdmFyIG1heEhlYXBTaXplID0gMjE0NzQ4MzY0ODsKICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWRTaXplID4gbWF4SGVhcFNpemUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKHZhciBjdXREb3duID0gMTsgY3V0RG93biA8PSA0OyBjdXREb3duICo9IDIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb3Zlckdyb3duSGVhcFNpemUgPSBvbGRTaXplICogKDEgKyAwLjIgLyBjdXREb3duKTsKICAgICAgICAgICAgICAgICAgICBvdmVyR3Jvd25IZWFwU2l6ZSA9IE1hdGgubWluKG92ZXJHcm93bkhlYXBTaXplLCByZXF1ZXN0ZWRTaXplICsgMTAwNjYzMjk2KTsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3U2l6ZSA9IE1hdGgubWluKG1heEhlYXBTaXplLCBhbGlnblVwKE1hdGgubWF4KHJlcXVlc3RlZFNpemUsIG92ZXJHcm93bkhlYXBTaXplKSwgNjU1MzYpKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBlbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyKG5ld1NpemUpOwogICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fdGhyZWFkX3NsZWVwKG1zZWNzKSB7CiAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBfZW1zY3JpcHRlbl9nZXRfbm93KCk7CiAgICAgICAgICAgICAgICB3aGlsZSAoX2Vtc2NyaXB0ZW5fZ2V0X25vdygpIC0gc3RhcnQgPCBtc2VjcykgeyB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIEVOViA9IHt9OwogICAgICAgICAgICBmdW5jdGlvbiBnZXRFeGVjdXRhYmxlTmFtZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzUHJvZ3JhbSB8fCAiLi90aGlzLnByb2dyYW0iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEVudlN0cmluZ3MoKSB7CiAgICAgICAgICAgICAgICBpZiAoIWdldEVudlN0cmluZ3Muc3RyaW5ncykgewogICAgICAgICAgICAgICAgICAgIHZhciBsYW5nID0gKCh0eXBlb2YgbmF2aWdhdG9yID09PSAib2JqZWN0IiAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzICYmIG5hdmlnYXRvci5sYW5ndWFnZXNbMF0pIHx8ICJDIikucmVwbGFjZSgiLSIsICJfIikgKyAiLlVURi04IjsKICAgICAgICAgICAgICAgICAgICB2YXIgZW52ID0gewogICAgICAgICAgICAgICAgICAgICAgICBVU0VSOiAid2ViX3VzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBMT0dOQU1FOiAid2ViX3VzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBQQVRIOiAiLyIsCiAgICAgICAgICAgICAgICAgICAgICAgIFBXRDogIi8iLAogICAgICAgICAgICAgICAgICAgICAgICBIT01FOiAiL2hvbWUvd2ViX3VzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBMQU5HOiBsYW5nLAogICAgICAgICAgICAgICAgICAgICAgICBfOiBnZXRFeGVjdXRhYmxlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeCBpbiBFTlYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW52W3hdID0gRU5WW3hdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgc3RyaW5ncyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHggaW4gZW52KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MucHVzaCh4ICsgIj0iICsgZW52W3hdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0RW52U3RyaW5ncy5zdHJpbmdzID0gc3RyaW5nczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBnZXRFbnZTdHJpbmdzLnN0cmluZ3M7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIFNZU0NBTExTID0gewogICAgICAgICAgICAgICAgbWFwcGluZ3M6IHt9LAogICAgICAgICAgICAgICAgYnVmZmVyczogW251bGwsIFtdLCBbXV0sCiAgICAgICAgICAgICAgICBwcmludENoYXI6IGZ1bmN0aW9uIChzdHJlYW0sIGN1cnIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gU1lTQ0FMTFMuYnVmZmVyc1tzdHJlYW1dOwogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyID09PSAwIHx8IGN1cnIgPT09IDEwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIChzdHJlYW0gPT09IDEgPyBvdXQgOiBlcnIpKFVURjhBcnJheVRvU3RyaW5nKGJ1ZmZlciwgMCkpOwogICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGN1cnIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB2YXJhcmdzOiB1bmRlZmluZWQsCiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBTWVNDQUxMUy52YXJhcmdzICs9IDQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IEhFQVAzMlsoU1lTQ0FMTFMudmFyYXJncyAtIDQpID4+IDJdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0U3RyOiBmdW5jdGlvbiAocHRyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IFVURjhUb1N0cmluZyhwdHIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0NjQ6IGZ1bmN0aW9uIChsb3csIGhpZ2gpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG93OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZnVuY3Rpb24gX2Vudmlyb25fZ2V0KF9fZW52aXJvbiwgZW52aXJvbl9idWYpIHsKICAgICAgICAgICAgICAgIHZhciBidWZTaXplID0gMDsKICAgICAgICAgICAgICAgIGdldEVudlN0cmluZ3MoKS5mb3JFYWNoKGZ1bmN0aW9uIChzdHJpbmcsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHRyID0gZW52aXJvbl9idWYgKyBidWZTaXplOwogICAgICAgICAgICAgICAgICAgIEhFQVAzMlsoX19lbnZpcm9uICsgaSAqIDQpID4+IDJdID0gcHRyOwogICAgICAgICAgICAgICAgICAgIHdyaXRlQXNjaWlUb01lbW9yeShzdHJpbmcsIHB0cik7CiAgICAgICAgICAgICAgICAgICAgYnVmU2l6ZSArPSBzdHJpbmcubGVuZ3RoICsgMTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vudmlyb25fc2l6ZXNfZ2V0KHBlbnZpcm9uX2NvdW50LCBwZW52aXJvbl9idWZfc2l6ZSkgewogICAgICAgICAgICAgICAgdmFyIHN0cmluZ3MgPSBnZXRFbnZTdHJpbmdzKCk7CiAgICAgICAgICAgICAgICBIRUFQMzJbcGVudmlyb25fY291bnQgPj4gMl0gPSBzdHJpbmdzLmxlbmd0aDsKICAgICAgICAgICAgICAgIHZhciBidWZTaXplID0gMDsKICAgICAgICAgICAgICAgIHN0cmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoc3RyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgYnVmU2l6ZSArPSBzdHJpbmcubGVuZ3RoICsgMTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgSEVBUDMyW3BlbnZpcm9uX2J1Zl9zaXplID4+IDJdID0gYnVmU2l6ZTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9leGl0KHN0YXR1cykgewogICAgICAgICAgICAgICAgZXhpdChzdGF0dXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9mZF9jbG9zZShmZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2ZkX3NlZWsoZmQsIG9mZnNldF9sb3csIG9mZnNldF9oaWdoLCB3aGVuY2UsIG5ld09mZnNldCkgeyB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9mZF93cml0ZShmZCwgaW92LCBpb3ZjbnQsIHBudW0pIHsKICAgICAgICAgICAgICAgIHZhciBudW0gPSAwOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpb3ZjbnQ7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBwdHIgPSBIRUFQMzJbKGlvdiArIGkgKiA4KSA+PiAyXTsKICAgICAgICAgICAgICAgICAgICB2YXIgbGVuID0gSEVBUDMyWyhpb3YgKyAoaSAqIDggKyA0KSkgPj4gMl07CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW47IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICBTWVNDQUxMUy5wcmludENoYXIoZmQsIEhFQVBVOFtwdHIgKyBqXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG51bSArPSBsZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBIRUFQMzJbcG51bSA+PiAyXSA9IG51bTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9wdGhyZWFkX2NyZWF0ZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiA2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9wdGhyZWFkX2pvaW4oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMjg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX3N5c2NvbmYobmFtZSkgewogICAgICAgICAgICAgICAgc3dpdGNoIChuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE2Mzg0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgODU6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXhIZWFwU2l6ZSA9IDIxNDc0ODM2NDg7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXhIZWFwU2l6ZSAvIDE2Mzg0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIzNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjM2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTUzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDc3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDY4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDI5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDk1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNTI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ2OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjAwODA5OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTYwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTYxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTg0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTY1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDk3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDM1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgODA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDc5OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyNjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDkyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDkxOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDc0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDcwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEwMjQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzMjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIxNDc0ODM2NDc7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA0NzgzOTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzY6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA5OTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMDQ4OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIwOTcxNTI7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjU1MzY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyODoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMyNzY4OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzMjc2NzsKICAgICAgICAgICAgICAgICAgICBjYXNlIDc1OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTYzODQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDFlMzsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg5OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzAwOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNzE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyNTY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI1NTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMDA7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA2NDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjA7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDczOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAib2JqZWN0IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXZpZ2F0b3JbImhhcmR3YXJlQ29uY3VycmVuY3kiXSB8fCAxOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZXRFcnJObygyOCk7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGFzbUxpYnJhcnlBcmcgPSB7CiAgICAgICAgICAgICAgICBhOiBfYWJvcnQsCiAgICAgICAgICAgICAgICBuOiBfY2xvY2tfZ2V0dGltZSwKICAgICAgICAgICAgICAgIGk6IF9kbG9wZW4sCiAgICAgICAgICAgICAgICBlOiBfZGxzeW0sCiAgICAgICAgICAgICAgICBsOiBfZW1zY3JpcHRlbl9tZW1jcHlfYmlnLAogICAgICAgICAgICAgICAgbTogX2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAsCiAgICAgICAgICAgICAgICBvOiBfZW1zY3JpcHRlbl90aHJlYWRfc2xlZXAsCiAgICAgICAgICAgICAgICBwOiBfZW52aXJvbl9nZXQsCiAgICAgICAgICAgICAgICBnOiBfZW52aXJvbl9zaXplc19nZXQsCiAgICAgICAgICAgICAgICBqOiBfZXhpdCwKICAgICAgICAgICAgICAgIGg6IF9mZF9jbG9zZSwKICAgICAgICAgICAgICAgIGs6IF9mZF9zZWVrLAogICAgICAgICAgICAgICAgYzogX2ZkX3dyaXRlLAogICAgICAgICAgICAgICAgZDogX3B0aHJlYWRfY3JlYXRlLAogICAgICAgICAgICAgICAgZjogX3B0aHJlYWRfam9pbiwKICAgICAgICAgICAgICAgIGI6IF9zeXNjb25mLAogICAgICAgICAgICB9OwogICAgICAgICAgICBjcmVhdGVXYXNtKCk7CiAgICAgICAgICAgIHZhciBfX193YXNtX2NhbGxfY3RvcnMgPSAoTW9kdWxlWyJfX193YXNtX2NhbGxfY3RvcnMiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoX19fd2FzbV9jYWxsX2N0b3JzID0gTW9kdWxlWyJfX193YXNtX2NhbGxfY3RvcnMiXSA9IE1vZHVsZVsiYXNtIl1bInIiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldCJdID0gTW9kdWxlWyJhc20iXVsicyJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldElucHV0TWVtb3J5T2Zmc2V0Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldElucHV0TWVtb3J5T2Zmc2V0Il0gPSBNb2R1bGVbImFzbSJdWyJ0Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0SW5wdXRIZWlnaHQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0SW5wdXRIZWlnaHQiXSA9IE1vZHVsZVsiYXNtIl1bInUiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRJbnB1dFdpZHRoIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldElucHV0V2lkdGgiXSA9IE1vZHVsZVsiYXNtIl1bInYiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRJbnB1dENoYW5uZWxDb3VudCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRJbnB1dENoYW5uZWxDb3VudCJdID0gTW9kdWxlWyJhc20iXVsidyJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldE91dHB1dE1lbW9yeU9mZnNldCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRPdXRwdXRNZW1vcnlPZmZzZXQiXSA9IE1vZHVsZVsiYXNtIl1bIngiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRPdXRwdXRIZWlnaHQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0SGVpZ2h0Il0gPSBNb2R1bGVbImFzbSJdWyJ5Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0T3V0cHV0V2lkdGgiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0V2lkdGgiXSA9IE1vZHVsZVsiYXNtIl1bInoiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRPdXRwdXRDaGFubmVsQ291bnQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0Q2hhbm5lbENvdW50Il0gPSBNb2R1bGVbImFzbSJdWyJBIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfbG9hZE1vZGVsIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2xvYWRNb2RlbCJdID0gTW9kdWxlWyJhc20iXVsiQiJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX3J1bkluZmVyZW5jZSJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9ydW5JbmZlcmVuY2UiXSA9IE1vZHVsZVsiYXNtIl1bIkMiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBfX19lcnJub19sb2NhdGlvbiA9IChNb2R1bGVbIl9fX2Vycm5vX2xvY2F0aW9uIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKF9fX2Vycm5vX2xvY2F0aW9uID0gTW9kdWxlWyJfX19lcnJub19sb2NhdGlvbiJdID0gTW9kdWxlWyJhc20iXVsiRSJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIGNhbGxlZFJ1bjsKICAgICAgICAgICAgZnVuY3Rpb24gRXhpdFN0YXR1cyhzdGF0dXMpIHsKICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9ICJFeGl0U3RhdHVzIjsKICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9ICJQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCIgKyBzdGF0dXMgKyAiKSI7CiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBmdW5jdGlvbiBydW5DYWxsZXIoKSB7CiAgICAgICAgICAgICAgICBpZiAoIWNhbGxlZFJ1bikKICAgICAgICAgICAgICAgICAgICBydW4oKTsKICAgICAgICAgICAgICAgIGlmICghY2FsbGVkUnVuKQogICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IHJ1bkNhbGxlcjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZnVuY3Rpb24gcnVuKGFyZ3MpIHsKICAgICAgICAgICAgICAgIGlmIChydW5EZXBlbmRlbmNpZXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHJlUnVuKCk7CiAgICAgICAgICAgICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID4gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRvUnVuKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsZWRSdW4pCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBjYWxsZWRSdW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsiY2FsbGVkUnVuIl0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGlmIChBQk9SVCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGluaXRSdW50aW1lKCk7CiAgICAgICAgICAgICAgICAgICAgcHJlTWFpbigpOwogICAgICAgICAgICAgICAgICAgIHJlYWR5UHJvbWlzZVJlc29sdmUoTW9kdWxlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJvblJ1bnRpbWVJbml0aWFsaXplZCJdKQogICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVbIm9uUnVudGltZUluaXRpYWxpemVkIl0oKTsKICAgICAgICAgICAgICAgICAgICBwb3N0UnVuKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJzZXRTdGF0dXMiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsic2V0U3RhdHVzIl0oIlJ1bm5pbmcuLi4iKTsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInNldFN0YXR1cyJdKCIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvUnVuKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBkb1J1bigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIE1vZHVsZVsicnVuIl0gPSBydW47CiAgICAgICAgICAgIGZ1bmN0aW9uIGV4aXQoc3RhdHVzLCBpbXBsaWNpdCkgewogICAgICAgICAgICAgICAgcXVpdF8oc3RhdHVzLCBuZXcgRXhpdFN0YXR1cyhzdGF0dXMpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoTW9kdWxlWyJwcmVJbml0Il0pIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwcmVJbml0Il0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInByZUluaXQiXSA9IFtNb2R1bGVbInByZUluaXQiXV07CiAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwcmVJbml0Il0ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsicHJlSW5pdCJdLnBvcCgpKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcnVuKCk7CiAgICAgICAgICAgIHJldHVybiBjcmVhdGVURkxpdGVTSU1ETW9kdWxlLnJlYWR5OwogICAgICAgIH07CiAgICB9KSgpOwoKICAgIHZhciB0ZmxpdGVTaW1kID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoewogICAgICAgIF9fcHJvdG9fXzogbnVsbCwKICAgICAgICBkZWZhdWx0OiBjcmVhdGVURkxpdGVTSU1ETW9kdWxlCiAgICB9KTsKCiAgICB2YXIgY3JlYXRlVEZMaXRlTW9kdWxlID0gKGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX3NjcmlwdERpciA9IHR5cGVvZiBkb2N1bWVudCAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdCA/IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjIDogdW5kZWZpbmVkOwogICAgICAgIGlmICh0eXBlb2YgX19maWxlbmFtZSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIF9zY3JpcHREaXIgPSBfc2NyaXB0RGlyIHx8IF9fZmlsZW5hbWU7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjcmVhdGVURkxpdGVNb2R1bGUpIHsKICAgICAgICAgICAgY3JlYXRlVEZMaXRlTW9kdWxlID0gY3JlYXRlVEZMaXRlTW9kdWxlIHx8IHt9OwogICAgICAgICAgICB2YXIgTW9kdWxlID0gdHlwZW9mIGNyZWF0ZVRGTGl0ZU1vZHVsZSAhPT0gInVuZGVmaW5lZCIgPyBjcmVhdGVURkxpdGVNb2R1bGUgOiB7fTsKICAgICAgICAgICAgdmFyIHJlYWR5UHJvbWlzZVJlc29sdmUsIHJlYWR5UHJvbWlzZVJlamVjdDsKICAgICAgICAgICAgTW9kdWxlWyJyZWFkeSJdID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgcmVhZHlQcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7CiAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZWplY3QgPSByZWplY3Q7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgbW9kdWxlT3ZlcnJpZGVzID0ge307CiAgICAgICAgICAgIHZhciBrZXk7CiAgICAgICAgICAgIGZvciAoa2V5IGluIE1vZHVsZSkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgbW9kdWxlT3ZlcnJpZGVzW2tleV0gPSBNb2R1bGVba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdGhpc1Byb2dyYW0gPSAiLi90aGlzLnByb2dyYW0iOwogICAgICAgICAgICB2YXIgcXVpdF8gPSBmdW5jdGlvbiAoc3RhdHVzLCB0b1Rocm93KSB7CiAgICAgICAgICAgICAgICB0aHJvdyB0b1Rocm93OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgRU5WSVJPTk1FTlRfSVNfV0VCID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBFTlZJUk9OTUVOVF9JU19XT1JLRVIgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX05PREUgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX1NIRUxMID0gZmFsc2U7CiAgICAgICAgICAgIEVOVklST05NRU5UX0lTX1dFQiA9IHR5cGVvZiB3aW5kb3cgPT09ICJvYmplY3QiOwogICAgICAgICAgICBFTlZJUk9OTUVOVF9JU19XT1JLRVIgPSB0eXBlb2YgaW1wb3J0U2NyaXB0cyA9PT0gImZ1bmN0aW9uIjsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfTk9ERSA9CiAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2VzcyA9PT0gIm9iamVjdCIgJiYKICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucyA9PT0gIm9iamVjdCIgJiYKICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlID09PSAic3RyaW5nIjsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfU0hFTEwgPSAhRU5WSVJPTk1FTlRfSVNfV0VCICYmICFFTlZJUk9OTUVOVF9JU19OT0RFICYmICFFTlZJUk9OTUVOVF9JU19XT1JLRVI7CiAgICAgICAgICAgIHZhciBzY3JpcHREaXJlY3RvcnkgPSAiIjsKICAgICAgICAgICAgZnVuY3Rpb24gbG9jYXRlRmlsZShwYXRoKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJsb2NhdGVGaWxlIl0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTW9kdWxlWyJsb2NhdGVGaWxlIl0ocGF0aCwgc2NyaXB0RGlyZWN0b3J5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBzY3JpcHREaXJlY3RvcnkgKyBwYXRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciByZWFkXywgcmVhZEFzeW5jLCByZWFkQmluYXJ5OwogICAgICAgICAgICB2YXIgbm9kZUZTOwogICAgICAgICAgICB2YXIgbm9kZVBhdGg7CiAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19OT0RFKSB7CiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gcmVxdWlyZSgicGF0aCIpLmRpcm5hbWUoc2NyaXB0RGlyZWN0b3J5KSArICIvIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IF9fZGlybmFtZSArICIvIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gc2hlbGxfcmVhZChmaWxlbmFtZSwgYmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlRlMpCiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVGUyA9IHJlcXVpcmUoImZzIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlUGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVBhdGggPSByZXF1aXJlKCJwYXRoIik7CiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBub2RlUGF0aFsibm9ybWFsaXplIl0oZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlRlNbInJlYWRGaWxlU3luYyJdKGZpbGVuYW1lLCBiaW5hcnkgPyBudWxsIDogInV0ZjgiKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gcmVhZEJpbmFyeShmaWxlbmFtZSkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSByZWFkXyhmaWxlbmFtZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXQuYnVmZmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBVaW50OEFycmF5KHJldCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzWyJhcmd2Il0ubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICAgIHRoaXNQcm9ncmFtID0gcHJvY2Vzc1siYXJndiJdWzFdLnJlcGxhY2UoL1xcL2csICIvIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJhcmd2Il0uc2xpY2UoMik7CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJvbiJdKCJ1bmNhdWdodEV4Y2VwdGlvbiIsIGZ1bmN0aW9uIChleCkgewogICAgICAgICAgICAgICAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgRXhpdFN0YXR1cykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJvbiJdKCJ1bmhhbmRsZWRSZWplY3Rpb24iLCBhYm9ydCk7CiAgICAgICAgICAgICAgICBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICBwcm9jZXNzWyJleGl0Il0oc3RhdHVzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBNb2R1bGVbImluc3BlY3QiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdIjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoRU5WSVJPTk1FTlRfSVNfU0hFTEwpIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVhZCAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gc2hlbGxfcmVhZChmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkKGYpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gcmVhZEJpbmFyeShmKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGE7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZWFkYnVmZmVyID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShyZWFkYnVmZmVyKGYpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlYWQoZiwgImJpbmFyeSIpOwogICAgICAgICAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgZGF0YSA9PT0gIm9iamVjdCIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2NyaXB0QXJncyAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdEFyZ3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHF1aXQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcXVpdChzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHByaW50ICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyA9IHByaW50OwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiA9IGNvbnNvbGUuZXJyb3IgPSB0eXBlb2YgcHJpbnRFcnIgIT09ICJ1bmRlZmluZWQiID8gcHJpbnRFcnIgOiBwcmludDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChFTlZJUk9OTUVOVF9JU19XRUIgfHwgRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gc2VsZi5sb2NhdGlvbi5ocmVmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0KSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoX3NjcmlwdERpcikgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IF9zY3JpcHREaXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2NyaXB0RGlyZWN0b3J5LmluZGV4T2YoImJsb2I6IikgIT09IDApIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBzY3JpcHREaXJlY3Rvcnkuc3Vic3RyKDAsIHNjcmlwdERpcmVjdG9yeS5sYXN0SW5kZXhPZigiLyIpICsgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZWFkXyA9IGZ1bmN0aW9uICh1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub3BlbigiR0VUIiwgdXJsLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5zZW5kKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGhyLnJlc3BvbnNlVGV4dDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEJpbmFyeSA9IGZ1bmN0aW9uICh1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5vcGVuKCJHRVQiLCB1cmwsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnNlbmQobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeGhyLnJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVhZEFzeW5jID0gZnVuY3Rpb24gKHVybCwgb25sb2FkLCBvbmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwIHx8ICh4aHIuc3RhdHVzID09IDAgJiYgeGhyLnJlc3BvbnNlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubG9hZCh4aHIucmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9uZXJyb3IgPSBvbmVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIuc2VuZChudWxsKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgOwogICAgICAgICAgICB2YXIgb3V0ID0gTW9kdWxlWyJwcmludCJdIHx8IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7CiAgICAgICAgICAgIHZhciBlcnIgPSBNb2R1bGVbInByaW50RXJyIl0gfHwgY29uc29sZS53YXJuLmJpbmQoY29uc29sZSk7CiAgICAgICAgICAgIGZvciAoa2V5IGluIG1vZHVsZU92ZXJyaWRlcykgewogICAgICAgICAgICAgICAgaWYgKG1vZHVsZU92ZXJyaWRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlW2tleV0gPSBtb2R1bGVPdmVycmlkZXNba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBtb2R1bGVPdmVycmlkZXMgPSBudWxsOwogICAgICAgICAgICBpZiAoTW9kdWxlWyJhcmd1bWVudHMiXSkKICAgICAgICAgICAgICAgIE1vZHVsZVsiYXJndW1lbnRzIl07CiAgICAgICAgICAgIGlmIChNb2R1bGVbInRoaXNQcm9ncmFtIl0pCiAgICAgICAgICAgICAgICB0aGlzUHJvZ3JhbSA9IE1vZHVsZVsidGhpc1Byb2dyYW0iXTsKICAgICAgICAgICAgaWYgKE1vZHVsZVsicXVpdCJdKQogICAgICAgICAgICAgICAgcXVpdF8gPSBNb2R1bGVbInF1aXQiXTsKICAgICAgICAgICAgdmFyIHdhc21CaW5hcnk7CiAgICAgICAgICAgIGlmIChNb2R1bGVbIndhc21CaW5hcnkiXSkKICAgICAgICAgICAgICAgIHdhc21CaW5hcnkgPSBNb2R1bGVbIndhc21CaW5hcnkiXTsKICAgICAgICAgICAgTW9kdWxlWyJub0V4aXRSdW50aW1lIl0gfHwgdHJ1ZTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBXZWJBc3NlbWJseSAhPT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgICAgIGFib3J0KCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHdhc21NZW1vcnk7CiAgICAgICAgICAgIHZhciBBQk9SVCA9IGZhbHNlOwogICAgICAgICAgICBmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLCB0ZXh0KSB7CiAgICAgICAgICAgICAgICBpZiAoIWNvbmRpdGlvbikgewogICAgICAgICAgICAgICAgICAgIGFib3J0KCJBc3NlcnRpb24gZmFpbGVkOiAiICsgdGV4dCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIFVURjhEZWNvZGVyID0gdHlwZW9mIFRleHREZWNvZGVyICE9PSAidW5kZWZpbmVkIiA/IG5ldyBUZXh0RGVjb2RlcigidXRmOCIpIDogdW5kZWZpbmVkOwogICAgICAgICAgICBmdW5jdGlvbiBVVEY4QXJyYXlUb1N0cmluZyhoZWFwLCBpZHgsIG1heEJ5dGVzVG9SZWFkKSB7CiAgICAgICAgICAgICAgICB2YXIgZW5kSWR4ID0gaWR4ICsgbWF4Qnl0ZXNUb1JlYWQ7CiAgICAgICAgICAgICAgICB2YXIgZW5kUHRyID0gaWR4OwogICAgICAgICAgICAgICAgd2hpbGUgKGhlYXBbZW5kUHRyXSAmJiAhKGVuZFB0ciA+PSBlbmRJZHgpKQogICAgICAgICAgICAgICAgICAgICsrZW5kUHRyOwogICAgICAgICAgICAgICAgaWYgKGVuZFB0ciAtIGlkeCA+IDE2ICYmIGhlYXAuc3ViYXJyYXkgJiYgVVRGOERlY29kZXIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVVRGOERlY29kZXIuZGVjb2RlKGhlYXAuc3ViYXJyYXkoaWR4LCBlbmRQdHIpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBzdHIgPSAiIjsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaWR4IDwgZW5kUHRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MCA9IGhlYXBbaWR4KytdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh1MCAmIDEyOCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHUwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MSA9IGhlYXBbaWR4KytdICYgNjM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodTAgJiAyMjQpID09IDE5MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKCh1MCAmIDMxKSA8PCA2KSB8IHUxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MiA9IGhlYXBbaWR4KytdICYgNjM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodTAgJiAyNDApID09IDIyNCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTAgPSAoKHUwICYgMTUpIDw8IDEyKSB8ICh1MSA8PCA2KSB8IHUyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTAgPSAoKHUwICYgNykgPDwgMTgpIHwgKHUxIDw8IDEyKSB8ICh1MiA8PCA2KSB8IChoZWFwW2lkeCsrXSAmIDYzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodTAgPCA2NTUzNikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoID0gdTAgLSA2NTUzNjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2IHwgKGNoID4+IDEwKSwgNTYzMjAgfCAoY2ggJiAxMDIzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIFVURjhUb1N0cmluZyhwdHIsIG1heEJ5dGVzVG9SZWFkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcHRyID8gVVRGOEFycmF5VG9TdHJpbmcoSEVBUFU4LCBwdHIsIG1heEJ5dGVzVG9SZWFkKSA6ICIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHdyaXRlQXNjaWlUb01lbW9yeShzdHIsIGJ1ZmZlciwgZG9udEFkZE51bGwpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgSEVBUDhbYnVmZmVyKysgPj4gMF0gPSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEhFQVA4W2J1ZmZlciA+PiAwXSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gYWxpZ25VcCh4LCBtdWx0aXBsZSkgewogICAgICAgICAgICAgICAgaWYgKHggJSBtdWx0aXBsZSA+IDApIHsKICAgICAgICAgICAgICAgICAgICB4ICs9IG11bHRpcGxlIC0gKHggJSBtdWx0aXBsZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgYnVmZmVyLCBIRUFQOCwgSEVBUFU4LCBIRUFQMzI7CiAgICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKGJ1ZikgewogICAgICAgICAgICAgICAgYnVmZmVyID0gYnVmOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQOCJdID0gSEVBUDggPSBuZXcgSW50OEFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVAxNiJdID0gbmV3IEludDE2QXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUDMyIl0gPSBIRUFQMzIgPSBuZXcgSW50MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQVTgiXSA9IEhFQVBVOCA9IG5ldyBVaW50OEFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBVMTYiXSA9IG5ldyBVaW50MTZBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQVTMyIl0gPSBuZXcgVWludDMyQXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUEYzMiJdID0gbmV3IEZsb2F0MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQRjY0Il0gPSBuZXcgRmxvYXQ2NEFycmF5KGJ1Zik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTW9kdWxlWyJJTklUSUFMX01FTU9SWSJdIHx8IDE2Nzc3MjE2OwogICAgICAgICAgICB2YXIgd2FzbVRhYmxlOwogICAgICAgICAgICB2YXIgX19BVFBSRVJVTl9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUSU5JVF9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUTUFJTl9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUUE9TVFJVTl9fID0gW107CiAgICAgICAgICAgIF9fQVRJTklUX18ucHVzaCh7CiAgICAgICAgICAgICAgICBmdW5jOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgX19fd2FzbV9jYWxsX2N0b3JzKCk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZnVuY3Rpb24gcHJlUnVuKCkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsicHJlUnVuIl0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicHJlUnVuIl0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJwcmVSdW4iXSA9IFtNb2R1bGVbInByZVJ1biJdXTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwcmVSdW4iXS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkT25QcmVSdW4oTW9kdWxlWyJwcmVSdW4iXS5zaGlmdCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUFJFUlVOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGluaXRSdW50aW1lKCkgewogICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVElOSVRfXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcHJlTWFpbigpIHsKICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRNQUlOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHBvc3RSdW4oKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJwb3N0UnVuIl0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicG9zdFJ1biJdID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZVsicG9zdFJ1biJdID0gW01vZHVsZVsicG9zdFJ1biJdXTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwb3N0UnVuIl0ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE9uUG9zdFJ1bihNb2R1bGVbInBvc3RSdW4iXS5zaGlmdCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUE9TVFJVTl9fKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBhZGRPblByZVJ1bihjYikgewogICAgICAgICAgICAgICAgX19BVFBSRVJVTl9fLnVuc2hpZnQoY2IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZE9uUG9zdFJ1bihjYikgewogICAgICAgICAgICAgICAgX19BVFBPU1RSVU5fXy51bnNoaWZ0KGNiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcnVuRGVwZW5kZW5jaWVzID0gMDsKICAgICAgICAgICAgdmFyIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IG51bGw7CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZFJ1bkRlcGVuZGVuY3koaWQpIHsKICAgICAgICAgICAgICAgIHJ1bkRlcGVuZGVuY2llcysrOwogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0ocnVuRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiByZW1vdmVSdW5EZXBlbmRlbmN5KGlkKSB7CiAgICAgICAgICAgICAgICBydW5EZXBlbmRlbmNpZXMtLTsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKHJ1bkRlcGVuZGVuY2llcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID09IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzRnVsZmlsbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGRlcGVuZGVuY2llc0Z1bGZpbGxlZDsKICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTW9kdWxlWyJwcmVsb2FkZWRJbWFnZXMiXSA9IHt9OwogICAgICAgICAgICBNb2R1bGVbInByZWxvYWRlZEF1ZGlvcyJdID0ge307CiAgICAgICAgICAgIGZ1bmN0aW9uIGFib3J0KHdoYXQpIHsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbIm9uQWJvcnQiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsib25BYm9ydCJdKHdoYXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hhdCArPSAiIjsKICAgICAgICAgICAgICAgIGVycih3aGF0KTsKICAgICAgICAgICAgICAgIEFCT1JUID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHdoYXQgPSAiYWJvcnQoIiArIHdoYXQgKyAiKS4gQnVpbGQgd2l0aCAtcyBBU1NFUlRJT05TPTEgZm9yIG1vcmUgaW5mby4iOwogICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKHdoYXQpOwogICAgICAgICAgICAgICAgcmVhZHlQcm9taXNlUmVqZWN0KGUpOwogICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBoYXNQcmVmaXgoc3RyLCBwcmVmaXgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGggPyBzdHIuc3RhcnRzV2l0aChwcmVmaXgpIDogc3RyLmluZGV4T2YocHJlZml4KSA9PT0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZGF0YVVSSVByZWZpeCA9ICJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIjsKICAgICAgICAgICAgZnVuY3Rpb24gaXNEYXRhVVJJKGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLCBkYXRhVVJJUHJlZml4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZmlsZVVSSVByZWZpeCA9ICJmaWxlOi8vIjsKICAgICAgICAgICAgZnVuY3Rpb24gaXNGaWxlVVJJKGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLCBmaWxlVVJJUHJlZml4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd2FzbUJpbmFyeUZpbGUgPSAidGZsaXRlLndhc20iOwogICAgICAgICAgICBpZiAoIWlzRGF0YVVSSSh3YXNtQmluYXJ5RmlsZSkpIHsKICAgICAgICAgICAgICAgIHdhc21CaW5hcnlGaWxlID0gbG9jYXRlRmlsZSh3YXNtQmluYXJ5RmlsZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZ2V0QmluYXJ5KGZpbGUpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUgPT0gd2FzbUJpbmFyeUZpbGUgJiYgd2FzbUJpbmFyeSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkod2FzbUJpbmFyeSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChyZWFkQmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkQmluYXJ5KGZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgYWJvcnQoZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBnZXRCaW5hcnlQcm9taXNlKCkgewogICAgICAgICAgICAgICAgaWYgKCF3YXNtQmluYXJ5ICYmIChFTlZJUk9OTUVOVF9JU19XRUIgfHwgRU5WSVJPTk1FTlRfSVNfV09SS0VSKSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmV0Y2ggPT09ICJmdW5jdGlvbiIgJiYgIWlzRmlsZVVSSSh3YXNtQmluYXJ5RmlsZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoKHdhc21CaW5hcnlGaWxlLCB7IGNyZWRlbnRpYWxzOiAic2FtZS1vcmlnaW4iIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2VbIm9rIl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAiZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCAnIiArIHdhc21CaW5hcnlGaWxlICsgIiciOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlWyJhcnJheUJ1ZmZlciJdKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJpbmFyeSh3YXNtQmluYXJ5RmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRBc3luYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQXN5bmMod2FzbUJpbmFyeUZpbGUsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBVaW50OEFycmF5KHJlc3BvbnNlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcmVqZWN0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCaW5hcnkod2FzbUJpbmFyeUZpbGUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gY3JlYXRlV2FzbSgpIHsKICAgICAgICAgICAgICAgIHZhciBpbmZvID0geyBhOiBhc21MaWJyYXJ5QXJnIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByZWNlaXZlSW5zdGFuY2UoaW5zdGFuY2UsIG1vZHVsZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBleHBvcnRzID0gaW5zdGFuY2UuZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbImFzbSJdID0gZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICB3YXNtTWVtb3J5ID0gTW9kdWxlWyJhc20iXVsicSJdOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKHdhc21NZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICB3YXNtVGFibGUgPSBNb2R1bGVbImFzbSJdWyJEIl07CiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUnVuRGVwZW5kZW5jeSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYWRkUnVuRGVwZW5kZW5jeSgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZShvdXRwdXQpIHsKICAgICAgICAgICAgICAgICAgICByZWNlaXZlSW5zdGFuY2Uob3V0cHV0WyJpbnN0YW5jZSJdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIocmVjZWl2ZXIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmluYXJ5UHJvbWlzZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChiaW5hcnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJpbmFyeSwgaW5mbyk7CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVjZWl2ZXIsIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyKCJmYWlsZWQgdG8gYXN5bmNocm9ub3VzbHkgcHJlcGFyZSB3YXNtOiAiICsgcmVhc29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQocmVhc29uKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGluc3RhbnRpYXRlQXN5bmMoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3YXNtQmluYXJ5ICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyA9PT0gImZ1bmN0aW9uIiAmJgogICAgICAgICAgICAgICAgICAgICAgICAhaXNEYXRhVVJJKHdhc21CaW5hcnlGaWxlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAhaXNGaWxlVVJJKHdhc21CaW5hcnlGaWxlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZmV0Y2ggPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoKHdhc21CaW5hcnlGaWxlLCB7IGNyZWRlbnRpYWxzOiAic2FtZS1vcmlnaW4iIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcocmVzcG9uc2UsIGluZm8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UsIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIoIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAiICsgcmVhc29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIocmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJpbnN0YW50aWF0ZVdhc20iXSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleHBvcnRzID0gTW9kdWxlWyJpbnN0YW50aWF0ZVdhc20iXShpbmZvLCByZWNlaXZlSW5zdGFuY2UpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyKCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZUFzeW5jKCkuY2F0Y2gocmVhZHlQcm9taXNlUmVqZWN0KTsKICAgICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBjYWxsUnVudGltZUNhbGxiYWNrcyhjYWxsYmFja3MpIHsKICAgICAgICAgICAgICAgIHdoaWxlIChjYWxsYmFja3MubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGNhbGxiYWNrcy5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhNb2R1bGUpOwogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmMgPSBjYWxsYmFjay5mdW5jOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuYyA9PT0gIm51bWJlciIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrLmFyZyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNtVGFibGUuZ2V0KGZ1bmMpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNtVGFibGUuZ2V0KGZ1bmMpKGNhbGxiYWNrLmFyZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMoY2FsbGJhY2suYXJnID09PSB1bmRlZmluZWQgPyBudWxsIDogY2FsbGJhY2suYXJnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Fib3J0KCkgewogICAgICAgICAgICAgICAgYWJvcnQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgX2Vtc2NyaXB0ZW5fZ2V0X25vdzsKICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHsKICAgICAgICAgICAgICAgIF9lbXNjcmlwdGVuX2dldF9ub3cgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBwcm9jZXNzWyJocnRpbWUiXSgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0WzBdICogMWUzICsgdFsxXSAvIDFlNjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRhdGVOb3cgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBfZW1zY3JpcHRlbl9nZXRfbm93ID0gZGF0ZU5vdzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBfZW1zY3JpcHRlbl9nZXRfbm93ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBfZW1zY3JpcHRlbl9nZXRfbm93X2lzX21vbm90b25pYyA9IHRydWU7CiAgICAgICAgICAgIGZ1bmN0aW9uIHNldEVyck5vKHZhbHVlKSB7CiAgICAgICAgICAgICAgICBIRUFQMzJbX19fZXJybm9fbG9jYXRpb24oKSA+PiAyXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9jbG9ja19nZXR0aW1lKGNsa19pZCwgdHApIHsKICAgICAgICAgICAgICAgIHZhciBub3c7CiAgICAgICAgICAgICAgICBpZiAoY2xrX2lkID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgbm93ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKChjbGtfaWQgPT09IDEgfHwgY2xrX2lkID09PSA0KSAmJiBfZW1zY3JpcHRlbl9nZXRfbm93X2lzX21vbm90b25pYykgewogICAgICAgICAgICAgICAgICAgIG5vdyA9IF9lbXNjcmlwdGVuX2dldF9ub3coKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNldEVyck5vKDI4KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBIRUFQMzJbdHAgPj4gMl0gPSAobm93IC8gMWUzKSB8IDA7CiAgICAgICAgICAgICAgICBIRUFQMzJbKHRwICsgNCkgPj4gMl0gPSAoKG5vdyAlIDFlMykgKiAxZTMgKiAxZTMpIHwgMDsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9kbG9wZW4oZmlsZW5hbWUsIGZsYWcpIHsKICAgICAgICAgICAgICAgIGFib3J0KCJUbyB1c2UgZGxvcGVuLCB5b3UgbmVlZCB0byB1c2UgRW1zY3JpcHRlbidzIGxpbmtpbmcgc3VwcG9ydCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbXNjcmlwdGVuLWNvcmUvZW1zY3JpcHRlbi93aWtpL0xpbmtpbmciKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZGxzeW0oaGFuZGxlLCBzeW1ib2wpIHsKICAgICAgICAgICAgICAgIGFib3J0KCJUbyB1c2UgZGxvcGVuLCB5b3UgbmVlZCB0byB1c2UgRW1zY3JpcHRlbidzIGxpbmtpbmcgc3VwcG9ydCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbXNjcmlwdGVuLWNvcmUvZW1zY3JpcHRlbi93aWtpL0xpbmtpbmciKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZW1zY3JpcHRlbl9tZW1jcHlfYmlnKGRlc3QsIHNyYywgbnVtKSB7CiAgICAgICAgICAgICAgICBIRUFQVTguY29weVdpdGhpbihkZXN0LCBzcmMsIHNyYyArIG51bSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fZ2V0X2hlYXBfc2l6ZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBIRUFQVTgubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGVtc2NyaXB0ZW5fcmVhbGxvY19idWZmZXIoc2l6ZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB3YXNtTWVtb3J5Lmdyb3coKHNpemUgLSBidWZmZXIuYnl0ZUxlbmd0aCArIDY1NTM1KSA+Pj4gMTYpOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKHdhc21NZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZW1zY3JpcHRlbl9yZXNpemVfaGVhcChyZXF1ZXN0ZWRTaXplKSB7CiAgICAgICAgICAgICAgICB2YXIgb2xkU2l6ZSA9IF9lbXNjcmlwdGVuX2dldF9oZWFwX3NpemUoKTsKICAgICAgICAgICAgICAgIHZhciBtYXhIZWFwU2l6ZSA9IDIxNDc0ODM2NDg7CiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdGVkU2l6ZSA+IG1heEhlYXBTaXplKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgY3V0RG93biA9IDE7IGN1dERvd24gPD0gNDsgY3V0RG93biAqPSAyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG92ZXJHcm93bkhlYXBTaXplID0gb2xkU2l6ZSAqICgxICsgMC4yIC8gY3V0RG93bik7CiAgICAgICAgICAgICAgICAgICAgb3Zlckdyb3duSGVhcFNpemUgPSBNYXRoLm1pbihvdmVyR3Jvd25IZWFwU2l6ZSwgcmVxdWVzdGVkU2l6ZSArIDEwMDY2MzI5Nik7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1NpemUgPSBNYXRoLm1pbihtYXhIZWFwU2l6ZSwgYWxpZ25VcChNYXRoLm1heChyZXF1ZXN0ZWRTaXplLCBvdmVyR3Jvd25IZWFwU2l6ZSksIDY1NTM2KSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gZW1zY3JpcHRlbl9yZWFsbG9jX2J1ZmZlcihuZXdTaXplKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbXNjcmlwdGVuX3RocmVhZF9zbGVlcChtc2VjcykgewogICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gX2Vtc2NyaXB0ZW5fZ2V0X25vdygpOwogICAgICAgICAgICAgICAgd2hpbGUgKF9lbXNjcmlwdGVuX2dldF9ub3coKSAtIHN0YXJ0IDwgbXNlY3MpIHsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBFTlYgPSB7fTsKICAgICAgICAgICAgZnVuY3Rpb24gZ2V0RXhlY3V0YWJsZU5hbWUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1Byb2dyYW0gfHwgIi4vdGhpcy5wcm9ncmFtIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBnZXRFbnZTdHJpbmdzKCkgewogICAgICAgICAgICAgICAgaWYgKCFnZXRFbnZTdHJpbmdzLnN0cmluZ3MpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbGFuZyA9ICgodHlwZW9mIG5hdmlnYXRvciA9PT0gIm9iamVjdCIgJiYgbmF2aWdhdG9yLmxhbmd1YWdlcyAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdKSB8fCAiQyIpLnJlcGxhY2UoIi0iLCAiXyIpICsgIi5VVEYtOCI7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVudiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgVVNFUjogIndlYl91c2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgTE9HTkFNRTogIndlYl91c2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgUEFUSDogIi8iLAogICAgICAgICAgICAgICAgICAgICAgICBQV0Q6ICIvIiwKICAgICAgICAgICAgICAgICAgICAgICAgSE9NRTogIi9ob21lL3dlYl91c2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgTEFORzogbGFuZywKICAgICAgICAgICAgICAgICAgICAgICAgXzogZ2V0RXhlY3V0YWJsZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHggaW4gRU5WKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudlt4XSA9IEVOVlt4XTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmluZ3MgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB4IGluIGVudikgewogICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzLnB1c2goeCArICI9IiArIGVudlt4XSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEVudlN0cmluZ3Muc3RyaW5ncyA9IHN0cmluZ3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RW52U3RyaW5ncy5zdHJpbmdzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBTWVNDQUxMUyA9IHsKICAgICAgICAgICAgICAgIG1hcHBpbmdzOiB7fSwKICAgICAgICAgICAgICAgIGJ1ZmZlcnM6IFtudWxsLCBbXSwgW11dLAogICAgICAgICAgICAgICAgcHJpbnRDaGFyOiBmdW5jdGlvbiAoc3RyZWFtLCBjdXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IFNZU0NBTExTLmJ1ZmZlcnNbc3RyZWFtXTsKICAgICAgICAgICAgICAgICAgICBpZiAoY3VyciA9PT0gMCB8fCBjdXJyID09PSAxMCkgewogICAgICAgICAgICAgICAgICAgICAgICAoc3RyZWFtID09PSAxID8gb3V0IDogZXJyKShVVEY4QXJyYXlUb1N0cmluZyhidWZmZXIsIDApKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIucHVzaChjdXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgdmFyYXJnczogdW5kZWZpbmVkLAogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgU1lTQ0FMTFMudmFyYXJncyArPSA0OwogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBIRUFQMzJbKFNZU0NBTExTLnZhcmFyZ3MgLSA0KSA+PiAyXTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGdldFN0cjogZnVuY3Rpb24gKHB0cikgewogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBVVEY4VG9TdHJpbmcocHRyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGdldDY0OiBmdW5jdGlvbiAobG93LCBoaWdoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvdzsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbnZpcm9uX2dldChfX2Vudmlyb24sIGVudmlyb25fYnVmKSB7CiAgICAgICAgICAgICAgICB2YXIgYnVmU2l6ZSA9IDA7CiAgICAgICAgICAgICAgICBnZXRFbnZTdHJpbmdzKCkuZm9yRWFjaChmdW5jdGlvbiAoc3RyaW5nLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHB0ciA9IGVudmlyb25fYnVmICsgYnVmU2l6ZTsKICAgICAgICAgICAgICAgICAgICBIRUFQMzJbKF9fZW52aXJvbiArIGkgKiA0KSA+PiAyXSA9IHB0cjsKICAgICAgICAgICAgICAgICAgICB3cml0ZUFzY2lpVG9NZW1vcnkoc3RyaW5nLCBwdHIpOwogICAgICAgICAgICAgICAgICAgIGJ1ZlNpemUgKz0gc3RyaW5nLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbnZpcm9uX3NpemVzX2dldChwZW52aXJvbl9jb3VudCwgcGVudmlyb25fYnVmX3NpemUpIHsKICAgICAgICAgICAgICAgIHZhciBzdHJpbmdzID0gZ2V0RW52U3RyaW5ncygpOwogICAgICAgICAgICAgICAgSEVBUDMyW3BlbnZpcm9uX2NvdW50ID4+IDJdID0gc3RyaW5ncy5sZW5ndGg7CiAgICAgICAgICAgICAgICB2YXIgYnVmU2l6ZSA9IDA7CiAgICAgICAgICAgICAgICBzdHJpbmdzLmZvckVhY2goZnVuY3Rpb24gKHN0cmluZykgewogICAgICAgICAgICAgICAgICAgIGJ1ZlNpemUgKz0gc3RyaW5nLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIEhFQVAzMltwZW52aXJvbl9idWZfc2l6ZSA+PiAyXSA9IGJ1ZlNpemU7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZXhpdChzdGF0dXMpIHsKICAgICAgICAgICAgICAgIGV4aXQoc3RhdHVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZmRfY2xvc2UoZmQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9mZF9zZWVrKGZkLCBvZmZzZXRfbG93LCBvZmZzZXRfaGlnaCwgd2hlbmNlLCBuZXdPZmZzZXQpIHsgfQogICAgICAgICAgICBmdW5jdGlvbiBfZmRfd3JpdGUoZmQsIGlvdiwgaW92Y250LCBwbnVtKSB7CiAgICAgICAgICAgICAgICB2YXIgbnVtID0gMDsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW92Y250OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHRyID0gSEVBUDMyWyhpb3YgKyBpICogOCkgPj4gMl07CiAgICAgICAgICAgICAgICAgICAgdmFyIGxlbiA9IEhFQVAzMlsoaW92ICsgKGkgKiA4ICsgNCkpID4+IDJdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgU1lTQ0FMTFMucHJpbnRDaGFyKGZkLCBIRUFQVThbcHRyICsgal0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBudW0gKz0gbGVuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgSEVBUDMyW3BudW0gPj4gMl0gPSBudW07CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfcHRocmVhZF9jcmVhdGUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gNjsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfcHRocmVhZF9qb2luKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDI4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9zeXNjb25mKG5hbWUpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAobmFtZSkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMzA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNjM4NDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg1OgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF4SGVhcFNpemUgPSAyMTQ3NDgzNjQ4OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF4SGVhcFNpemUgLyAxNjM4NDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzMjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzMzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTM3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTM4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDIzNjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDc4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTM5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgODI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDY3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTY0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDUyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNTE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0NjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIwMDgwOTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNTA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDc2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDgwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgODE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDkzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5MToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDYwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMDI0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDcyOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzI7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzM6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMTQ3NDgzNjQ3OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDc4Mzk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDM2OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOTk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDM3OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjA0ODsKICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMDk3MTUyOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY1NTM2OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjg6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzMjc2ODsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ0OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzI3Njc7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3NToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE2Mzg0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxZTM7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDcwMDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDcxOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjU2OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyNTU7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTAwOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgwOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIwOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE2OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3MzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4NDogewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5hdmlnYXRvciA9PT0gIm9iamVjdCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF2aWdhdG9yWyJoYXJkd2FyZUNvbmN1cnJlbmN5Il0gfHwgMTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2V0RXJyTm8oMjgpOwogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBhc21MaWJyYXJ5QXJnID0gewogICAgICAgICAgICAgICAgYTogX2Fib3J0LAogICAgICAgICAgICAgICAgbjogX2Nsb2NrX2dldHRpbWUsCiAgICAgICAgICAgICAgICBpOiBfZGxvcGVuLAogICAgICAgICAgICAgICAgZTogX2Rsc3ltLAogICAgICAgICAgICAgICAgbDogX2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZywKICAgICAgICAgICAgICAgIG06IF9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwLAogICAgICAgICAgICAgICAgbzogX2Vtc2NyaXB0ZW5fdGhyZWFkX3NsZWVwLAogICAgICAgICAgICAgICAgcDogX2Vudmlyb25fZ2V0LAogICAgICAgICAgICAgICAgZzogX2Vudmlyb25fc2l6ZXNfZ2V0LAogICAgICAgICAgICAgICAgajogX2V4aXQsCiAgICAgICAgICAgICAgICBoOiBfZmRfY2xvc2UsCiAgICAgICAgICAgICAgICBrOiBfZmRfc2VlaywKICAgICAgICAgICAgICAgIGM6IF9mZF93cml0ZSwKICAgICAgICAgICAgICAgIGQ6IF9wdGhyZWFkX2NyZWF0ZSwKICAgICAgICAgICAgICAgIGY6IF9wdGhyZWFkX2pvaW4sCiAgICAgICAgICAgICAgICBiOiBfc3lzY29uZiwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgY3JlYXRlV2FzbSgpOwogICAgICAgICAgICB2YXIgX19fd2FzbV9jYWxsX2N0b3JzID0gKE1vZHVsZVsiX19fd2FzbV9jYWxsX2N0b3JzIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKF9fX3dhc21fY2FsbF9jdG9ycyA9IE1vZHVsZVsiX19fd2FzbV9jYWxsX2N0b3JzIl0gPSBNb2R1bGVbImFzbSJdWyJyIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0TW9kZWxCdWZmZXJNZW1vcnlPZmZzZXQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0TW9kZWxCdWZmZXJNZW1vcnlPZmZzZXQiXSA9IE1vZHVsZVsiYXNtIl1bInMiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRJbnB1dE1lbW9yeU9mZnNldCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRJbnB1dE1lbW9yeU9mZnNldCJdID0gTW9kdWxlWyJhc20iXVsidCJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldElucHV0SGVpZ2h0Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldElucHV0SGVpZ2h0Il0gPSBNb2R1bGVbImFzbSJdWyJ1Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0SW5wdXRXaWR0aCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRJbnB1dFdpZHRoIl0gPSBNb2R1bGVbImFzbSJdWyJ2Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0SW5wdXRDaGFubmVsQ291bnQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0SW5wdXRDaGFubmVsQ291bnQiXSA9IE1vZHVsZVsiYXNtIl1bInciXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRPdXRwdXRNZW1vcnlPZmZzZXQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0TWVtb3J5T2Zmc2V0Il0gPSBNb2R1bGVbImFzbSJdWyJ4Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0T3V0cHV0SGVpZ2h0Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldE91dHB1dEhlaWdodCJdID0gTW9kdWxlWyJhc20iXVsieSJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldE91dHB1dFdpZHRoIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldE91dHB1dFdpZHRoIl0gPSBNb2R1bGVbImFzbSJdWyJ6Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0T3V0cHV0Q2hhbm5lbENvdW50Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldE91dHB1dENoYW5uZWxDb3VudCJdID0gTW9kdWxlWyJhc20iXVsiQSJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2xvYWRNb2RlbCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9sb2FkTW9kZWwiXSA9IE1vZHVsZVsiYXNtIl1bIkIiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9ydW5JbmZlcmVuY2UiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfcnVuSW5mZXJlbmNlIl0gPSBNb2R1bGVbImFzbSJdWyJDIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgX19fZXJybm9fbG9jYXRpb24gPSAoTW9kdWxlWyJfX19lcnJub19sb2NhdGlvbiJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChfX19lcnJub19sb2NhdGlvbiA9IE1vZHVsZVsiX19fZXJybm9fbG9jYXRpb24iXSA9IE1vZHVsZVsiYXNtIl1bIkUiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBjYWxsZWRSdW47CiAgICAgICAgICAgIGZ1bmN0aW9uIEV4aXRTdGF0dXMoc3RhdHVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSAiRXhpdFN0YXR1cyI7CiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSAiUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggZXhpdCgiICsgc3RhdHVzICsgIikiOwogICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gZnVuY3Rpb24gcnVuQ2FsbGVyKCkgewogICAgICAgICAgICAgICAgaWYgKCFjYWxsZWRSdW4pCiAgICAgICAgICAgICAgICAgICAgcnVuKCk7CiAgICAgICAgICAgICAgICBpZiAoIWNhbGxlZFJ1bikKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBydW5DYWxsZXI7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZ1bmN0aW9uIHJ1bihhcmdzKSB7CiAgICAgICAgICAgICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID4gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHByZVJ1bigpOwogICAgICAgICAgICAgICAgaWYgKHJ1bkRlcGVuZGVuY2llcyA+IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkb1J1bigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGVkUnVuKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgY2FsbGVkUnVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbImNhbGxlZFJ1biJdID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBpZiAoQUJPUlQpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBpbml0UnVudGltZSgpOwogICAgICAgICAgICAgICAgICAgIHByZU1haW4oKTsKICAgICAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZXNvbHZlKE1vZHVsZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsib25SdW50aW1lSW5pdGlhbGl6ZWQiXSkKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJvblJ1bnRpbWVJbml0aWFsaXplZCJdKCk7CiAgICAgICAgICAgICAgICAgICAgcG9zdFJ1bigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsic2V0U3RhdHVzIl0pIHsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInNldFN0YXR1cyJdKCJSdW5uaW5nLi4uIik7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJzZXRTdGF0dXMiXSgiIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBkb1J1bigpOwogICAgICAgICAgICAgICAgICAgIH0sIDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZG9SdW4oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBNb2R1bGVbInJ1biJdID0gcnVuOwogICAgICAgICAgICBmdW5jdGlvbiBleGl0KHN0YXR1cywgaW1wbGljaXQpIHsKICAgICAgICAgICAgICAgIHF1aXRfKHN0YXR1cywgbmV3IEV4aXRTdGF0dXMoc3RhdHVzKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKE1vZHVsZVsicHJlSW5pdCJdKSB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicHJlSW5pdCJdID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJwcmVJbml0Il0gPSBbTW9kdWxlWyJwcmVJbml0Il1dOwogICAgICAgICAgICAgICAgd2hpbGUgKE1vZHVsZVsicHJlSW5pdCJdLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInByZUluaXQiXS5wb3AoKSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJ1bigpOwogICAgICAgICAgICByZXR1cm4gY3JlYXRlVEZMaXRlTW9kdWxlLnJlYWR5OwogICAgICAgIH07CiAgICB9KSgpOwoKICAgIHZhciB0ZmxpdGUgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7CiAgICAgICAgX19wcm90b19fOiBudWxsLAogICAgICAgIGRlZmF1bHQ6IGNyZWF0ZVRGTGl0ZU1vZHVsZQogICAgfSk7Cgp9KSh3YXNtRmVhdHVyZURldGVjdCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPVByb2Nlc3NvclByb3h5Lndvcmtlci5qcy5tYXAKCg==');
1867
+ var WorkerFactory = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKHdhc21GZWF0dXJlRGV0ZWN0KSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgdmFyIF9kb2N1bWVudEN1cnJlbnRTY3JpcHQgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gZG9jdW1lbnQuY3VycmVudFNjcmlwdCA6IG51bGw7CiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uDQoNCiAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkNCiAgICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuDQoNCiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSA0KICAgIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQ0KICAgIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwNCiAgICBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00NCiAgICBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUg0KICAgIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1INCiAgICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLg0KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQogICAgLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqLw0KDQoNCiAgICBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7DQogICAgICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfQ0KICAgICAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsNCiAgICAgICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0NCiAgICAgICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yWyJ0aHJvdyJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0NCiAgICAgICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9DQogICAgICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7DQogICAgICAgIH0pOw0KICAgIH0NCg0KICAgIHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09ICJmdW5jdGlvbiIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHsNCiAgICAgICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7DQogICAgICAgIHJldHVybiBlLm5hbWUgPSAiU3VwcHJlc3NlZEVycm9yIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlOw0KICAgIH07CgogICAgdmFyIGV2ZW50cyA9IHtleHBvcnRzOiB7fX07CgogICAgdmFyIFIgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgPyBSZWZsZWN0IDogbnVsbDsKICAgIHZhciBSZWZsZWN0QXBwbHkgPSBSICYmIHR5cGVvZiBSLmFwcGx5ID09PSAnZnVuY3Rpb24nCiAgICAgID8gUi5hcHBseQogICAgICA6IGZ1bmN0aW9uIFJlZmxlY3RBcHBseSh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKSB7CiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpOwogICAgICB9OwoKICAgIHZhciBSZWZsZWN0T3duS2V5czsKICAgIGlmIChSICYmIHR5cGVvZiBSLm93bktleXMgPT09ICdmdW5jdGlvbicpIHsKICAgICAgUmVmbGVjdE93bktleXMgPSBSLm93bktleXM7CiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgICAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KQogICAgICAgICAgLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkpOwogICAgICB9OwogICAgfSBlbHNlIHsKICAgICAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBQcm9jZXNzRW1pdFdhcm5pbmcod2FybmluZykgewogICAgICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIGNvbnNvbGUud2Fybih3YXJuaW5nKTsKICAgIH0KCiAgICB2YXIgTnVtYmVySXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gTnVtYmVySXNOYU4odmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTsKICAgIH07CgogICAgZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkgewogICAgICBFdmVudEVtaXR0ZXIuaW5pdC5jYWxsKHRoaXMpOwogICAgfQogICAgZXZlbnRzLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7CiAgICBldmVudHMuZXhwb3J0cy5vbmNlID0gb25jZTsKCiAgICAvLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLngKICAgIEV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkOwogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzQ291bnQgPSAwOwogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkOwoKICAgIC8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZQogICAgLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy4KICAgIHZhciBkZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7CgogICAgZnVuY3Rpb24gY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcikgewogICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgbGlzdGVuZXIpOwogICAgICB9CiAgICB9CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50RW1pdHRlciwgJ2RlZmF1bHRNYXhMaXN0ZW5lcnMnLCB7CiAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGRlZmF1bHRNYXhMaXN0ZW5lcnM7CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24oYXJnKSB7CiAgICAgICAgaWYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInIHx8IGFyZyA8IDAgfHwgTnVtYmVySXNOYU4oYXJnKSkgewogICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiAiZGVmYXVsdE1heExpc3RlbmVycyIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIGFyZyArICcuJyk7CiAgICAgICAgfQogICAgICAgIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSBhcmc7CiAgICAgIH0KICAgIH0pOwoKICAgIEV2ZW50RW1pdHRlci5pbml0ID0gZnVuY3Rpb24oKSB7CgogICAgICBpZiAodGhpcy5fZXZlbnRzID09PSB1bmRlZmluZWQgfHwKICAgICAgICAgIHRoaXMuX2V2ZW50cyA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpIHsKICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgfQoKICAgICAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDsKICAgIH07CgogICAgLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzCiAgICAvLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC4KICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHsKICAgICAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCB8fCBOdW1iZXJJc05hTihuKSkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgIm4iIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBuICsgJy4nKTsKICAgICAgfQogICAgICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuOwogICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgZnVuY3Rpb24gX2dldE1heExpc3RlbmVycyh0aGF0KSB7CiAgICAgIGlmICh0aGF0Ll9tYXhMaXN0ZW5lcnMgPT09IHVuZGVmaW5lZCkKICAgICAgICByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7CiAgICAgIHJldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7CiAgICB9CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKSB7CiAgICAgIHJldHVybiBfZ2V0TWF4TGlzdGVuZXJzKHRoaXMpOwogICAgfTsKCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KHR5cGUpIHsKICAgICAgdmFyIGFyZ3MgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwogICAgICB2YXIgZG9FcnJvciA9ICh0eXBlID09PSAnZXJyb3InKTsKCiAgICAgIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7CiAgICAgIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkKICAgICAgICBkb0Vycm9yID0gKGRvRXJyb3IgJiYgZXZlbnRzLmVycm9yID09PSB1bmRlZmluZWQpOwogICAgICBlbHNlIGlmICghZG9FcnJvcikKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuCiAgICAgIGlmIChkb0Vycm9yKSB7CiAgICAgICAgdmFyIGVyOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApCiAgICAgICAgICBlciA9IGFyZ3NbMF07CiAgICAgICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHsKICAgICAgICAgIC8vIE5vdGU6IFRoZSBjb21tZW50cyBvbiB0aGUgYHRocm93YCBsaW5lcyBhcmUgaW50ZW50aW9uYWwsIHRoZXkgc2hvdwogICAgICAgICAgLy8gdXAgaW4gTm9kZSdzIG91dHB1dCBpZiB0aGlzIHJlc3VsdHMgaW4gYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi4KICAgICAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudAogICAgICAgIH0KICAgICAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyCiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5oYW5kbGVkIGVycm9yLicgKyAoZXIgPyAnICgnICsgZXIubWVzc2FnZSArICcpJyA6ICcnKSk7CiAgICAgICAgZXJyLmNvbnRleHQgPSBlcjsKICAgICAgICB0aHJvdyBlcnI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50CiAgICAgIH0KCiAgICAgIHZhciBoYW5kbGVyID0gZXZlbnRzW3R5cGVdOwoKICAgICAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZCkKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBSZWZsZWN0QXBwbHkoaGFuZGxlciwgdGhpcywgYXJncyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoOwogICAgICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkKICAgICAgICAgIFJlZmxlY3RBcHBseShsaXN0ZW5lcnNbaV0sIHRoaXMsIGFyZ3MpOwogICAgICB9CgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH07CgogICAgZnVuY3Rpb24gX2FkZExpc3RlbmVyKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIHByZXBlbmQpIHsKICAgICAgdmFyIG07CiAgICAgIHZhciBldmVudHM7CiAgICAgIHZhciBleGlzdGluZzsKCiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwoKICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7CiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICB0YXJnZXQuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSAibmV3TGlzdGVuZXIiISBCZWZvcmUKICAgICAgICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCAibmV3TGlzdGVuZXIiLgogICAgICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgdGFyZ2V0LmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyID8gbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7CgogICAgICAgICAgLy8gUmUtYXNzaWduIGBldmVudHNgIGJlY2F1c2UgYSBuZXdMaXN0ZW5lciBoYW5kbGVyIGNvdWxkIGhhdmUgY2F1c2VkIHRoZQogICAgICAgICAgLy8gdGhpcy5fZXZlbnRzIHRvIGJlIGFzc2lnbmVkIHRvIGEgbmV3IG9iamVjdAogICAgICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7CiAgICAgICAgfQogICAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdOwogICAgICB9CgogICAgICBpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCkgewogICAgICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LgogICAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7CiAgICAgICAgKyt0YXJnZXQuX2V2ZW50c0NvdW50OwogICAgICB9IGVsc2UgewogICAgICAgIGlmICh0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LgogICAgICAgICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPQogICAgICAgICAgICBwcmVwZW5kID8gW2xpc3RlbmVyLCBleGlzdGluZ10gOiBbZXhpc3RpbmcsIGxpc3RlbmVyXTsKICAgICAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC4KICAgICAgICB9IGVsc2UgaWYgKHByZXBlbmQpIHsKICAgICAgICAgIGV4aXN0aW5nLnVuc2hpZnQobGlzdGVuZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBleGlzdGluZy5wdXNoKGxpc3RlbmVyKTsKICAgICAgICB9CgogICAgICAgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrCiAgICAgICAgbSA9IF9nZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTsKICAgICAgICBpZiAobSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSAmJiAhZXhpc3Rpbmcud2FybmVkKSB7CiAgICAgICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlOwogICAgICAgICAgLy8gTm8gZXJyb3IgY29kZSBmb3IgdGhpcyBzaW5jZSBpdCBpcyBhIFdhcm5pbmcKICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheAogICAgICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmxlbmd0aCArICcgJyArIFN0cmluZyh0eXBlKSArICcgbGlzdGVuZXJzICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jcmVhc2UgbGltaXQnKTsKICAgICAgICAgIHcubmFtZSA9ICdNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmcnOwogICAgICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0OwogICAgICAgICAgdy50eXBlID0gdHlwZTsKICAgICAgICAgIHcuY291bnQgPSBleGlzdGluZy5sZW5ndGg7CiAgICAgICAgICBQcm9jZXNzRW1pdFdhcm5pbmcodyk7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiBhZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikgewogICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7CiAgICB9OwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyOwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyID0KICAgICAgICBmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHsKICAgICAgICAgIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIHRydWUpOwogICAgICAgIH07CgogICAgZnVuY3Rpb24gb25jZVdyYXBwZXIoKSB7CiAgICAgIGlmICghdGhpcy5maXJlZCkgewogICAgICAgIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSwgdGhpcy53cmFwRm4pOwogICAgICAgIHRoaXMuZmlyZWQgPSB0cnVlOwogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKQogICAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk7CiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsIGFyZ3VtZW50cyk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikgewogICAgICB2YXIgc3RhdGUgPSB7IGZpcmVkOiBmYWxzZSwgd3JhcEZuOiB1bmRlZmluZWQsIHRhcmdldDogdGFyZ2V0LCB0eXBlOiB0eXBlLCBsaXN0ZW5lcjogbGlzdGVuZXIgfTsKICAgICAgdmFyIHdyYXBwZWQgPSBvbmNlV3JhcHBlci5iaW5kKHN0YXRlKTsKICAgICAgd3JhcHBlZC5saXN0ZW5lciA9IGxpc3RlbmVyOwogICAgICBzdGF0ZS53cmFwRm4gPSB3cmFwcGVkOwogICAgICByZXR1cm4gd3JhcHBlZDsKICAgIH0KCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7CiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwogICAgICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpOwogICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyID0KICAgICAgICBmdW5jdGlvbiBwcmVwZW5kT25jZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7CiAgICAgICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTsKICAgICAgICAgIHRoaXMucHJlcGVuZExpc3RlbmVyKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpOwogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKCiAgICAvLyBFbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkLgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9CiAgICAgICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHsKICAgICAgICAgIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyOwoKICAgICAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwoKICAgICAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50czsKICAgICAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CgogICAgICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTsKICAgICAgICAgIGlmIChsaXN0ID09PSB1bmRlZmluZWQpCiAgICAgICAgICAgIHJldHVybiB0aGlzOwoKICAgICAgICAgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikgewogICAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMCkKICAgICAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdOwogICAgICAgICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpCiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdC5saXN0ZW5lciB8fCBsaXN0ZW5lcik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgcG9zaXRpb24gPSAtMTsKCiAgICAgICAgICAgIGZvciAoaSA9IGxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHwgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHsKICAgICAgICAgICAgICAgIG9yaWdpbmFsTGlzdGVuZXIgPSBsaXN0W2ldLmxpc3RlbmVyOwogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocG9zaXRpb24gPCAwKQogICAgICAgICAgICAgIHJldHVybiB0aGlzOwoKICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09PSAwKQogICAgICAgICAgICAgIGxpc3Quc2hpZnQoKTsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgc3BsaWNlT25lKGxpc3QsIHBvc2l0aW9uKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKQogICAgICAgICAgICAgIGV2ZW50c1t0eXBlXSA9IGxpc3RbMF07CgogICAgICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpCiAgICAgICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpOwogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyOwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0KICAgICAgICBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkgewogICAgICAgICAgdmFyIGxpc3RlbmVycywgZXZlbnRzLCBpOwoKICAgICAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50czsKICAgICAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CgogICAgICAgICAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdAogICAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzW3R5cGVdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMCkKICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHMKICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRzKTsKICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICBrZXkgPSBrZXlzW2ldOwogICAgICAgICAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlOwogICAgICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7CiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICB9CgogICAgICAgICAgbGlzdGVuZXJzID0gZXZlbnRzW3R5cGVdOwoKICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTsKICAgICAgICAgIH0gZWxzZSBpZiAobGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgLy8gTElGTyBvcmRlcgogICAgICAgICAgICBmb3IgKGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwoKICAgIGZ1bmN0aW9uIF9saXN0ZW5lcnModGFyZ2V0LCB0eXBlLCB1bndyYXApIHsKICAgICAgdmFyIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzOwoKICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKQogICAgICAgIHJldHVybiBbXTsKCiAgICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdOwogICAgICBpZiAoZXZsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKQogICAgICAgIHJldHVybiBbXTsKCiAgICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykKICAgICAgICByZXR1cm4gdW53cmFwID8gW2V2bGlzdGVuZXIubGlzdGVuZXIgfHwgZXZsaXN0ZW5lcl0gOiBbZXZsaXN0ZW5lcl07CgogICAgICByZXR1cm4gdW53cmFwID8KICAgICAgICB1bndyYXBMaXN0ZW5lcnMoZXZsaXN0ZW5lcikgOiBhcnJheUNsb25lKGV2bGlzdGVuZXIsIGV2bGlzdGVuZXIubGVuZ3RoKTsKICAgIH0KCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7CiAgICAgIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIHRydWUpOwogICAgfTsKCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJhd0xpc3RlbmVycyA9IGZ1bmN0aW9uIHJhd0xpc3RlbmVycyh0eXBlKSB7CiAgICAgIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIGZhbHNlKTsKICAgIH07CgogICAgRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7CiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbGlzdGVuZXJDb3VudC5jYWxsKGVtaXR0ZXIsIHR5cGUpOwogICAgICB9CiAgICB9OwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7CiAgICBmdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHsKICAgICAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50czsKCiAgICAgIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdOwoKICAgICAgICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0gZWxzZSBpZiAoZXZsaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkgewogICAgICByZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQgPiAwID8gUmVmbGVjdE93bktleXModGhpcy5fZXZlbnRzKSA6IFtdOwogICAgfTsKCiAgICBmdW5jdGlvbiBhcnJheUNsb25lKGFyciwgbikgewogICAgICB2YXIgY29weSA9IG5ldyBBcnJheShuKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpCiAgICAgICAgY29weVtpXSA9IGFycltpXTsKICAgICAgcmV0dXJuIGNvcHk7CiAgICB9CgogICAgZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7CiAgICAgIGZvciAoOyBpbmRleCArIDEgPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKykKICAgICAgICBsaXN0W2luZGV4XSA9IGxpc3RbaW5kZXggKyAxXTsKICAgICAgbGlzdC5wb3AoKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1bndyYXBMaXN0ZW5lcnMoYXJyKSB7CiAgICAgIHZhciByZXQgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgcmV0W2ldID0gYXJyW2ldLmxpc3RlbmVyIHx8IGFycltpXTsKICAgICAgfQogICAgICByZXR1cm4gcmV0OwogICAgfQoKICAgIGZ1bmN0aW9uIG9uY2UoZW1pdHRlciwgbmFtZSkgewogICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgIGZ1bmN0aW9uIGVycm9yTGlzdGVuZXIoZXJyKSB7CiAgICAgICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIHJlc29sdmVyKTsKICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZXIoKSB7CiAgICAgICAgICBpZiAodHlwZW9mIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBlcnJvckxpc3RlbmVyKTsKICAgICAgICAgIH0KICAgICAgICAgIHJlc29sdmUoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKTsKICAgICAgICB9CiAgICAgICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIHJlc29sdmVyLCB7IG9uY2U6IHRydWUgfSk7CiAgICAgICAgaWYgKG5hbWUgIT09ICdlcnJvcicpIHsKICAgICAgICAgIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGVycm9yTGlzdGVuZXIsIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGhhbmRsZXIsIGZsYWdzKSB7CiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCAnZXJyb3InLCBoYW5kbGVyLCBmbGFncyk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgbGlzdGVuZXIsIGZsYWdzKSB7CiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGlmIChmbGFncy5vbmNlKSB7CiAgICAgICAgICBlbWl0dGVyLm9uY2UobmFtZSwgbGlzdGVuZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlbWl0dGVyLm9uKG5hbWUsIGxpc3RlbmVyKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIC8vIEV2ZW50VGFyZ2V0IGRvZXMgbm90IGhhdmUgYGVycm9yYCBldmVudCBzZW1hbnRpY3MgbGlrZSBOb2RlCiAgICAgICAgLy8gRXZlbnRFbWl0dGVycywgd2UgZG8gbm90IGxpc3RlbiBmb3IgYGVycm9yYCBldmVudHMgaGVyZS4KICAgICAgICBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZnVuY3Rpb24gd3JhcExpc3RlbmVyKGFyZykgewogICAgICAgICAgLy8gSUUgZG9lcyBub3QgaGF2ZSBidWlsdGluIGB7IG9uY2U6IHRydWUgfWAgc3VwcG9ydCBzbyB3ZQogICAgICAgICAgLy8gaGF2ZSB0byBkbyBpdCBtYW51YWxseS4KICAgICAgICAgIGlmIChmbGFncy5vbmNlKSB7CiAgICAgICAgICAgIGVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCB3cmFwTGlzdGVuZXIpOwogICAgICAgICAgfQogICAgICAgICAgbGlzdGVuZXIoYXJnKTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImVtaXR0ZXIiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBlbWl0dGVyKTsKICAgICAgfQogICAgfQoKICAgIHZhciBldmVudHNFeHBvcnRzID0gZXZlbnRzLmV4cG9ydHM7CgogICAgZnVuY3Rpb24gY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICBpZiAoc2VsZi5kb2N1bWVudCkgewogICAgICAgICAgICBjb25zdCBjYW52YXMgPSBzZWxmLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDsKICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDsKICAgICAgICAgICAgcmV0dXJuIGNhbnZhczsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoc2VsZi5PZmZzY3JlZW5DYW52YXMpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7CiAgICAgICAgfQogICAgfQoKICAgIGNvbnN0IENETl9CQVNFX1VSTCA9ICJodHRwczovL2Nkbi5zcnYud2hlcmVieS5jb20vY2FtZXJhLWVmZmVjdHMvdjEtMS0xIjsKICAgIGNvbnN0IGdldEFzc2V0VXJsID0gKHBhdGgpID0+IHsKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBgJHtDRE5fQkFTRV9VUkx9LyR7cGF0aH1gOwogICAgICAgIH0KICAgIH07CiAgICBjb25zdCBhc3NldFVybHMgPSB7CiAgICAgICAgdGZsaXRlOiB7CiAgICAgICAgICAgIHdhc206IGdldEFzc2V0VXJsKCJhc3NldHMvdGZsaXRlL3RmbGl0ZS53YXNtIikgLAogICAgICAgICAgICB3YXNtU2ltZDogZ2V0QXNzZXRVcmwoImFzc2V0cy90ZmxpdGUvdGZsaXRlLXNpbWQud2FzbSIpICwKICAgICAgICB9LAogICAgICAgIG1vZGVsczogewogICAgICAgICAgICBzZWdtTGl0ZTogZ2V0QXNzZXRVcmwoImFzc2V0cy90ZmxpdGUvbW9kZWxzL3NlZ21fbGl0ZV92NjgxLnRmbGl0ZSIpICwKICAgICAgICAgICAgc2VnbUZ1bGw6IGdldEFzc2V0VXJsKCJhc3NldHMvdGZsaXRlL21vZGVscy9zZWdtX2Z1bGxfdjY3OS50ZmxpdGUiKSAsCiAgICAgICAgICAgIG1sa2l0OiBnZXRBc3NldFVybCgiYXNzZXRzL3RmbGl0ZS9tb2RlbHMvc2VsZmllc2VnbWVudGF0aW9uX21sa2l0LTI1NngyNTYtMjAyMV8wMV8xOS12MTIxNS5mMTYudGZsaXRlIikKICAgICAgICAgICAgICAgICwKICAgICAgICB9fTsKCiAgICBjb25zdCBsb2FkVGZsaXRlTW9kdWxlID0gKGlzU2ltZCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgY29uc3QgY3JlYXRlVGZsaXRlTW9kdWxlID0gaXNTaW1kCiAgICAgICAgICAgID8geWllbGQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB0ZmxpdGVTaW1kOyB9KS50aGVuKChtKSA9PiBtLmRlZmF1bHQpCiAgICAgICAgICAgIDogeWllbGQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB0ZmxpdGU7IH0pLnRoZW4oKG0pID0+IG0uZGVmYXVsdCk7CiAgICAgICAgcmV0dXJuIGNyZWF0ZVRmbGl0ZU1vZHVsZTsKICAgIH0pOwogICAgY29uc3QgZ2V0TW9kZWxVcmwgPSAobW9kZWxJZCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgewogICAgICAgICAgICBzd2l0Y2ggKG1vZGVsSWQpIHsKICAgICAgICAgICAgICAgIGNhc2UgIm1lZXRsaXRlIjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzZXRVcmxzLm1vZGVscy5zZWdtTGl0ZTsKICAgICAgICAgICAgICAgIGNhc2UgIm1lZXRmdWxsIjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzZXRVcmxzLm1vZGVscy5zZWdtRnVsbDsKICAgICAgICAgICAgICAgIGNhc2UgIm1sa2l0IjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzZXRVcmxzLm1vZGVscy5tbGtpdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwogICAgY29uc3QgZ2V0V2FzbVVybCA9IChpc1NpbWQpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGlzU2ltZCA/IGFzc2V0VXJscy50ZmxpdGUud2FzbVNpbWQgOiBhc3NldFVybHMudGZsaXRlLndhc207CiAgICAgICAgfQogICAgfSk7CiAgICBjb25zdCBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX0JBQ0tHUk9VTkRfUEVSU09OID0gMTsKICAgIGNvbnN0IFNFR01FTlRBVElPTk1PREVMX1RZUEVfUEVSU09OID0gMjsKICAgIGNvbnN0IHJlc29sdmVBc3NldFVybCA9ICh1cmwpID0+IHsKICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSB8fCB1cmwuc3RhcnRzV2l0aCgiaHR0cHM6Ly8iKSB8fCB1cmwuc3RhcnRzV2l0aCgiYmxvYjoiKSB8fCB1cmwuc3RhcnRzV2l0aCgiZGF0YToiKSkgewogICAgICAgICAgICByZXR1cm4gdXJsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IFVSTCh1cmwsIChfZG9jdW1lbnRDdXJyZW50U2NyaXB0ICYmIF9kb2N1bWVudEN1cnJlbnRTY3JpcHQudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnU0NSSVBUJyAmJiBfZG9jdW1lbnRDdXJyZW50U2NyaXB0LnNyYyB8fCBuZXcgVVJMKCdQcm9jZXNzb3JQcm94eS53b3JrZXIuanMnLCBkb2N1bWVudC5iYXNlVVJJKS5ocmVmKSkuaHJlZjsKICAgIH07CiAgICBjb25zdCBtb2RlbHMgPSB7CiAgICAgICAgbWVldGxpdGU6IHsKICAgICAgICAgICAgaWQ6ICJtZWV0bGl0ZSIsCiAgICAgICAgICAgIHR5cGU6IFNFR01FTlRBVElPTk1PREVMX1RZUEVfQkFDS0dST1VORF9QRVJTT04sCiAgICAgICAgfSwKICAgICAgICBtZWV0ZnVsbDogewogICAgICAgICAgICBpZDogIm1lZXRmdWxsIiwKICAgICAgICAgICAgdHlwZTogU0VHTUVOVEFUSU9OTU9ERUxfVFlQRV9CQUNLR1JPVU5EX1BFUlNPTiwKICAgICAgICB9LAogICAgICAgIG1sa2l0OiB7CiAgICAgICAgICAgIGlkOiAibWxraXQiLAogICAgICAgICAgICB0eXBlOiBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX1BFUlNPTiwKICAgICAgICB9LAogICAgfTsKICAgIGxldCBfdGZsaXRlID0gbnVsbDsKICAgIGNvbnN0IGxvYWRURkxpdGUgPSAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICBpZiAoX3RmbGl0ZSkKICAgICAgICAgICAgcmV0dXJuIF90ZmxpdGU7CiAgICAgICAgY29uc3Qgc2ltZElzU3VwcG9ydGVkID0geWllbGQgd2FzbUZlYXR1cmVEZXRlY3Quc2ltZCgpOwogICAgICAgIGNvbnN0IGNyZWF0ZVRmbGl0ZU1vZHVsZSA9IHlpZWxkIGxvYWRUZmxpdGVNb2R1bGUoc2ltZElzU3VwcG9ydGVkKTsKICAgICAgICBjb25zdCB3YXNtVXJsID0geWllbGQgZ2V0V2FzbVVybChzaW1kSXNTdXBwb3J0ZWQpOwogICAgICAgIF90ZmxpdGUgPSB5aWVsZCBjcmVhdGVUZmxpdGVNb2R1bGUoewogICAgICAgICAgICBsb2NhdGVGaWxlKHBhdGgpIHsKICAgICAgICAgICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCIud2FzbSIpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVBc3NldFVybCh3YXNtVXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBwYXRoOwogICAgICAgICAgICB9LAogICAgICAgIH0pOwogICAgICAgIHJldHVybiBfdGZsaXRlOwogICAgfSk7CiAgICBsZXQgX2N1cnJlbnRNb2RlbEFuZEluZm87CiAgICBjb25zdCBsb2FkU2VnbWVudGF0aW9uTW9kZWwgPSAoc2VnbWVudGF0aW9uTW9kZWxJZCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgY29uc3QgbW9kZWwgPSBtb2RlbHNbc2VnbWVudGF0aW9uTW9kZWxJZF07CiAgICAgICAgY29uc3QgbW9kZWxVcmwgPSByZXNvbHZlQXNzZXRVcmwoeWllbGQgZ2V0TW9kZWxVcmwobW9kZWwuaWQpKTsKICAgICAgICBjb25zdCB0ZmxpdGUgPSB5aWVsZCBsb2FkVEZMaXRlKCk7CiAgICAgICAgaWYgKChfY3VycmVudE1vZGVsQW5kSW5mbyA9PT0gbnVsbCB8fCBfY3VycmVudE1vZGVsQW5kSW5mbyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2N1cnJlbnRNb2RlbEFuZEluZm8udXJsKSA9PT0gbW9kZWxVcmwpCiAgICAgICAgICAgIHJldHVybiBfY3VycmVudE1vZGVsQW5kSW5mbzsKICAgICAgICBjb25zdCBtb2RlbFJlc3BvbnNlID0geWllbGQgZmV0Y2gobW9kZWxVcmwpOwogICAgICAgIGNvbnN0IG1vZGVsQnVmZmVyID0geWllbGQgbW9kZWxSZXNwb25zZS5hcnJheUJ1ZmZlcigpOwogICAgICAgIGNvbnN0IG1vZGVsQnVmZmVyT2Zmc2V0ID0gdGZsaXRlLl9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldCgpOwogICAgICAgIHRmbGl0ZS5IRUFQVTguc2V0KG5ldyBVaW50OEFycmF5KG1vZGVsQnVmZmVyKSwgbW9kZWxCdWZmZXJPZmZzZXQpOwogICAgICAgIHRmbGl0ZS5fbG9hZE1vZGVsKG1vZGVsQnVmZmVyLmJ5dGVMZW5ndGgpOwogICAgICAgIGNvbnN0IGlucHV0SGVpZ2h0ID0gdGZsaXRlLl9nZXRJbnB1dEhlaWdodCgpOwogICAgICAgIGNvbnN0IGlucHV0V2lkdGggPSB0ZmxpdGUuX2dldElucHV0V2lkdGgoKTsKICAgICAgICBjb25zdCBpbnB1dE1lbW9yeU9mZnNldCA9IHRmbGl0ZS5fZ2V0SW5wdXRNZW1vcnlPZmZzZXQoKSAvIDQ7CiAgICAgICAgY29uc3Qgb3V0cHV0TWVtb3J5T2Zmc2V0ID0gdGZsaXRlLl9nZXRPdXRwdXRNZW1vcnlPZmZzZXQoKSAvIDQ7CiAgICAgICAgY29uc3Qgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCA9IGlucHV0V2lkdGggKiBpbnB1dEhlaWdodDsKICAgICAgICB0ZmxpdGUuX3J1bkluZmVyZW5jZSgpOwogICAgICAgIF9jdXJyZW50TW9kZWxBbmRJbmZvID0gewogICAgICAgICAgICB0ZmxpdGUsCiAgICAgICAgICAgIG1vZGVsLAogICAgICAgICAgICB1cmw6IG1vZGVsVXJsLAogICAgICAgICAgICBpbnB1dEhlaWdodCwKICAgICAgICAgICAgaW5wdXRXaWR0aCwKICAgICAgICAgICAgaW5wdXRNZW1vcnlPZmZzZXQsCiAgICAgICAgICAgIG91dHB1dE1lbW9yeU9mZnNldCwKICAgICAgICAgICAgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCwKICAgICAgICB9OwogICAgICAgIHJldHVybiBfY3VycmVudE1vZGVsQW5kSW5mbzsKICAgIH0pOwoKICAgIGNvbnN0IGJhc2VDYW52YXNQYXJhbXMgPSB7CiAgICAgICAgbWFza09wZXJhdGlvbjogImNvcHkiLAogICAgICAgIG1hc2tGaWx0ZXI6ICJibHVyKDRweCkiLAogICAgICAgIHBlcnNvbk9wZXJhdGlvbjogInNvdXJjZS1pbiIsCiAgICAgICAgcGVyc29uRmlsdGVyOiAibm9uZSIsCiAgICAgICAgYmFja2dyb3VuZE9wZXJhdGlvbjogImRlc3RpbmF0aW9uLW92ZXIiLAogICAgICAgIGJhY2tncm91bmRGaWx0ZXI6ICJub25lIiwKICAgIH07CiAgICBmdW5jdGlvbiBnZXRCbHVyQ2FudmFzUGFyYW1zKGFtb3VudCkgewogICAgICAgIHN3aXRjaCAoYW1vdW50KSB7CiAgICAgICAgICAgIGNhc2UgInNsaWdodCI6IHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDYW52YXNQYXJhbXMpLCB7IGJhY2tncm91bmRGaWx0ZXI6ICJibHVyKDRweCkiLCBjcm9wOiA0IH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImhlYXZ5IjogewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNhbnZhc1BhcmFtcyksIHsgbWFza0ZpbHRlcjogImJsdXIoOHB4KSIsIGJhY2tncm91bmRGaWx0ZXI6ICJibHVyKDE2cHgpIiwgY3JvcDogMTYgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNhbnZhc1BhcmFtcyksIHsgbWFza0ZpbHRlcjogImJsdXIoOHB4KSIsIGJhY2tncm91bmRGaWx0ZXI6ICJibHVyKDhweCkiLCBjcm9wOiA4IH0pOwogICAgfQogICAgZnVuY3Rpb24gZ2V0Q2FudmFzUGFyYW1zKHBhcmFtcykgewogICAgICAgIGlmIChwYXJhbXMuYmFja2dyb3VuZEJsdXIpCiAgICAgICAgICAgIHJldHVybiBnZXRCbHVyQ2FudmFzUGFyYW1zKHBhcmFtcy5iYWNrZ3JvdW5kQmx1ci5hbW91bnQpOwogICAgICAgIHJldHVybiBiYXNlQ2FudmFzUGFyYW1zOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlQ2FudmFzRW5naW5lKHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCBzZXR1cCwgZWZmZWN0Q2FudmFzLCBwYXJhbXMpIHsKICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICBjb25zdCB7IHRmbGl0ZSwgbW9kZWw6IHNlZ21lbnRhdGlvbk1vZGVsLCBpbnB1dEhlaWdodCwgaW5wdXRXaWR0aCwgaW5wdXRNZW1vcnlPZmZzZXQsIG91dHB1dE1lbW9yeU9mZnNldCwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCwgfSA9IHlpZWxkIGxvYWRTZWdtZW50YXRpb25Nb2RlbChzZXR1cC5zZWdtZW50YXRpb25Nb2RlbElkKTsKICAgICAgICAgICAgbGV0IGNhbnZhc1BhcmFtcyA9IGdldENhbnZhc1BhcmFtcyhwYXJhbXMpOwogICAgICAgICAgICBjb25zdCBzZWdtZW50YXRpb25DYW52YXMgPSBjcmVhdGVDYW52YXMoaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICBjb25zdCBzZWdtZW50YXRpb25DdHggPSBzZWdtZW50YXRpb25DYW52YXMuZ2V0Q29udGV4dCgiMmQiLCB7CiAgICAgICAgICAgICAgICB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb25zdCBzZWdtZW50YXRpb25NYXNrID0gbmV3IEltYWdlRGF0YShpbnB1dFdpZHRoLCBpbnB1dEhlaWdodCk7CiAgICAgICAgICAgIGxldCBjdXJyZW50QmFja2dyb3VuZEZyYW1lID0gbnVsbDsKICAgICAgICAgICAgbGV0IGJhY2tncm91bmREaW1lbnNpb25zID0geyB4OiAwLCB5OiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH07CiAgICAgICAgICAgIGNvbnN0IHZpZGVvQXNwZWN0UmF0aW8gPSB2aWRlb1dpZHRoIC8gdmlkZW9IZWlnaHQ7CiAgICAgICAgICAgIGxldCBjcm9wWCA9IDA7CiAgICAgICAgICAgIGxldCBjcm9wWSA9IDA7CiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZUNyb3AgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBjcm9wID0gY2FudmFzUGFyYW1zLmNyb3AgfHwgMDsKICAgICAgICAgICAgICAgIGlmIChjcm9wKSB7CiAgICAgICAgICAgICAgICAgICAgY3JvcFggPSB2aWRlb0FzcGVjdFJhdGlvID4gMSA/IE1hdGgucm91bmQoY3JvcCAqIHZpZGVvQXNwZWN0UmF0aW8pIDogY3JvcDsKICAgICAgICAgICAgICAgICAgICBjcm9wWSA9IHZpZGVvQXNwZWN0UmF0aW8gPCAxID8gTWF0aC5yb3VuZChjcm9wIC8gdmlkZW9Bc3BlY3RSYXRpbykgOiBjcm9wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY3JvcFggPSAwOwogICAgICAgICAgICAgICAgICAgIGNyb3BZID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdXBkYXRlQ3JvcCgpOwogICAgICAgICAgICBjb25zdCBlZmZlY3RDdHggPSBlZmZlY3RDYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGVmZmVjdEN0eCwKICAgICAgICAgICAgICAgIHVwZGF0ZUJhY2tncm91bmRGcmFtZShmcmFtZSwgZGltZW5zaW9ucykgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUgPSBmcmFtZTsKICAgICAgICAgICAgICAgICAgICBpZiAoZGltZW5zaW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZERpbWVuc2lvbnMgPSBkaW1lbnNpb25zOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHVwZGF0ZVBhcmFtcyh1cGRhdGVkUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgY2FudmFzUGFyYW1zID0gZ2V0Q2FudmFzUGFyYW1zKHVwZGF0ZWRQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNyb3AoKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzRnJhbWUoZnJhbWUpIHsKICAgICAgICAgICAgICAgICAgICBzZWdtZW50YXRpb25DdHguZHJhd0ltYWdlKGZyYW1lLCAwLCAwLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgMCwgMCwgaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlRGF0YSA9IHNlZ21lbnRhdGlvbkN0eC5nZXRJbWFnZURhdGEoMCwgMCwgaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRmbGl0ZS5IRUFQRjMyW2lucHV0TWVtb3J5T2Zmc2V0ICsgaSAqIDNdID0gaW1hZ2VEYXRhLmRhdGFbaSAqIDRdIC8gMjU1OwogICAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGUuSEVBUEYzMltpbnB1dE1lbW9yeU9mZnNldCArIGkgKiAzICsgMV0gPSBpbWFnZURhdGEuZGF0YVtpICogNCArIDFdIC8gMjU1OwogICAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGUuSEVBUEYzMltpbnB1dE1lbW9yeU9mZnNldCArIGkgKiAzICsgMl0gPSBpbWFnZURhdGEuZGF0YVtpICogNCArIDJdIC8gMjU1OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0ZmxpdGUuX3J1bkluZmVyZW5jZSgpOwogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50YXRpb25Nb2RlbC50eXBlID09PSBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX0JBQ0tHUk9VTkRfUEVSU09OKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kID0gdGZsaXRlLkhFQVBGMzJbb3V0cHV0TWVtb3J5T2Zmc2V0ICsgaSAqIDJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyc29uID0gdGZsaXRlLkhFQVBGMzJbb3V0cHV0TWVtb3J5T2Zmc2V0ICsgaSAqIDIgKyAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoaWZ0ID0gTWF0aC5tYXgoYmFja2dyb3VuZCwgcGVyc29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tncm91bmRFeHAgPSBNYXRoLmV4cChiYWNrZ3JvdW5kIC0gc2hpZnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyc29uRXhwID0gTWF0aC5leHAocGVyc29uIC0gc2hpZnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudGF0aW9uTWFzay5kYXRhW2kgKiA0ICsgM10gPSAoMjU1ICogcGVyc29uRXhwKSAvIChiYWNrZ3JvdW5kRXhwICsgcGVyc29uRXhwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWdtZW50YXRpb25Nb2RlbC50eXBlID09PSBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX1BFUlNPTikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyc29uID0gdGZsaXRlLkhFQVBGMzJbb3V0cHV0TWVtb3J5T2Zmc2V0ICsgaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50YXRpb25NYXNrLmRhdGFbaSAqIDQgKyAzXSA9IDI1NSAqIHBlcnNvbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZWdtZW50YXRpb25DdHgucHV0SW1hZ2VEYXRhKHNlZ21lbnRhdGlvbk1hc2ssIDAsIDApOwogICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBjYW52YXNQYXJhbXMubWFza09wZXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICBlZmZlY3RDdHguZmlsdGVyID0gY2FudmFzUGFyYW1zLm1hc2tGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4LmRyYXdJbWFnZShzZWdtZW50YXRpb25DYW52YXMsIDAsIDAsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0LCAwLCAwLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGNhbnZhc1BhcmFtcy5wZXJzb25PcGVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4LmZpbHRlciA9IGNhbnZhc1BhcmFtcy5wZXJzb25GaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4LmRyYXdJbWFnZShmcmFtZSwgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGNhbnZhc1BhcmFtcy5iYWNrZ3JvdW5kT3BlcmF0aW9uOwogICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5maWx0ZXIgPSBjYW52YXNQYXJhbXMuYmFja2dyb3VuZEZpbHRlcjsKICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEJhY2tncm91bmRGcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RDdHguZHJhd0ltYWdlKGN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUsIGJhY2tncm91bmREaW1lbnNpb25zLngsIGJhY2tncm91bmREaW1lbnNpb25zLnksIGJhY2tncm91bmREaW1lbnNpb25zLndpZHRoLCBiYWNrZ3JvdW5kRGltZW5zaW9ucy5oZWlnaHQsIDAsIDAsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5kcmF3SW1hZ2UoZnJhbWUsIDAsIDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoY3JvcFggfHwgY3JvcFkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICJzb3VyY2Utb3ZlciI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5maWx0ZXIgPSAibm9uZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5kcmF3SW1hZ2UoZWZmZWN0Q2FudmFzLCBjcm9wWCwgY3JvcFksIHZpZGVvV2lkdGggLSBjcm9wWCAqIDIsIHZpZGVvSGVpZ2h0IC0gY3JvcFkgKiAyLCAwLCAwLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7IH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICB9CgogICAgY29uc3QgZ2xzbCA9IFN0cmluZy5yYXc7CiAgICBmdW5jdGlvbiBjcmVhdGVQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyKSB7CiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTsKICAgICAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgdmVydGV4U2hhZGVyKTsKICAgICAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgZnJhZ21lbnRTaGFkZXIpOwogICAgICAgIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pOwogICAgICAgIGlmICghZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUykpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbGluayBXZWJHTCBwcm9ncmFtOiAke2dsLmdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pfWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcHJvZ3JhbTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVBpcGxlbGluZVN0YWdlUHJvZ3JhbShnbCwgdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyKSB7CiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGNyZWF0ZVByb2dyYW0oZ2wsIHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXIpOwogICAgICAgIGNvbnN0IHBvc2l0aW9uQXR0cmlidXRlTG9jYXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAiYV9wb3NpdGlvbiIpOwogICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uQXR0cmlidXRlTG9jYXRpb24pOwogICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBwb3NpdGlvbkJ1ZmZlcik7CiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihwb3NpdGlvbkF0dHJpYnV0ZUxvY2F0aW9uLCAyLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApOwogICAgICAgIGNvbnN0IHRleENvb3JkQXR0cmlidXRlTG9jYXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAiYV90ZXhDb29yZCIpOwogICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHRleENvb3JkQXR0cmlidXRlTG9jYXRpb24pOwogICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcih0ZXhDb29yZEF0dHJpYnV0ZUxvY2F0aW9uLCAyLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApOwogICAgICAgIHJldHVybiBwcm9ncmFtOwogICAgfQogICAgZnVuY3Rpb24gY29tcGlsZVNoYWRlcihnbCwgc2hhZGVyVHlwZSwgc2hhZGVyU291cmNlKSB7CiAgICAgICAgY29uc3Qgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKHNoYWRlclR5cGUpOwogICAgICAgIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsIHNoYWRlclNvdXJjZSk7CiAgICAgICAgZ2wuY29tcGlsZVNoYWRlcihzaGFkZXIpOwogICAgICAgIGlmICghZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGNvbXBpbGUgc2hhZGVyOiAke2dsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKX1gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNoYWRlcjsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVRleHR1cmUoZ2wsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBtaW5GaWx0ZXIgPSBnbC5ORUFSRVNULCBtYWdGaWx0ZXIgPSBnbC5ORUFSRVNUKSB7CiAgICAgICAgY29uc3QgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTsKICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgbWluRmlsdGVyKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgbWFnRmlsdGVyKTsKICAgICAgICBnbC50ZXhTdG9yYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMSwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwogICAgICAgIHJldHVybiB0ZXh0dXJlOwogICAgfQoKICAgIGZ1bmN0aW9uIGdlbmVyYXRlT3B0aW1pemVkR2F1c3NpYW5LZXJuZWwoc2lnbWEpIHsKICAgICAgICBjb25zdCBnID0gKHgpID0+IE1hdGguZXhwKC0oeCAqIHgpIC8gKDIgKiBzaWdtYSAqIHNpZ21hKSk7CiAgICAgICAgY29uc3QgbnVtYmVycyA9IFtdOwogICAgICAgIGxldCB4ID0gMDsKICAgICAgICBsZXQgY3VycmVudFN1bSA9IDA7CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgY29uc3QgbiA9IGcoeCk7CiAgICAgICAgICAgIGNvbnN0IG5leHRTdW0gPSBjdXJyZW50U3VtICsgKGN1cnJlbnRTdW0gPyBuICogMiA6IG4pOwogICAgICAgICAgICBpZiAoY3VycmVudFN1bSAmJiBuIC8gbmV4dFN1bSA8IDAuMDEgJiYgbnVtYmVycy5sZW5ndGggJSAyKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGN1cnJlbnRTdW0gPSBuZXh0U3VtOwogICAgICAgICAgICBudW1iZXJzLnB1c2gobik7CiAgICAgICAgICAgIHgrKzsKICAgICAgICB9CiAgICAgICAgY29uc3Qgd2VpZ2h0cyA9IG51bWJlcnMubWFwKChuKSA9PiBuIC8gY3VycmVudFN1bSk7CiAgICAgICAgY29uc3Qgb3B0aW1pemVkV2VpZ2h0cyA9IFt3ZWlnaHRzWzBdXTsKICAgICAgICBjb25zdCBvcHRpbWl6ZWRQb3NpdGlvbnMgPSBbMF07CiAgICAgICAgaWYgKHdlaWdodHMubGVuZ3RoID49IDMgJiYgd2VpZ2h0cy5sZW5ndGggJSAyID09PSAxKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgd2VpZ2h0cy5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgICAgICAgY29uc3QgdzEgPSB3ZWlnaHRzW2ldOwogICAgICAgICAgICAgICAgY29uc3QgdzIgPSB3ZWlnaHRzW2kgKyAxXTsKICAgICAgICAgICAgICAgIGNvbnN0IHcgPSB3MSArIHcyOwogICAgICAgICAgICAgICAgY29uc3QgcCA9IHcyIC8gKHcxICsgdzIpOwogICAgICAgICAgICAgICAgb3B0aW1pemVkV2VpZ2h0cy5wdXNoKHcpOwogICAgICAgICAgICAgICAgb3B0aW1pemVkUG9zaXRpb25zLnB1c2goaSArIHApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHdlaWdodHM6IG9wdGltaXplZFdlaWdodHMsCiAgICAgICAgICAgIHBvc2l0aW9uczogb3B0aW1pemVkUG9zaXRpb25zLAogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBidWlsZEJsdXJQYXNzKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgcGVyc29uTWFza1RleHR1cmUsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcykgewogICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyU291cmNlID0gZ2xzbCBgI3ZlcnNpb24gMzAwIGVzCiAgICAgICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfaW5wdXRGcmFtZTsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X3BlcnNvbk1hc2s7CiAgICAgICAgdW5pZm9ybSBmbG9hdCB1X3dlaWdodFsyMF07CiAgICAgICAgdW5pZm9ybSBmbG9hdCB1X29mZnNldFsyMF07CiAgICAgICAgdW5pZm9ybSBpbnQgdV9rc2l6ZTsKICAgICAgICB1bmlmb3JtIHZlYzIgdV90ZXhlbFNpemU7CiAgICAgICAgaW4gdmVjMiB2X3RleENvb3JkOwogICAgICAgIG91dCB2ZWM0IG91dENvbG9yOwogICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgdmVjNCBjZW50ZXJDb2xvciA9IHRleHR1cmUodV9pbnB1dEZyYW1lLCB2X3RleENvb3JkKTsKICAgICAgICAgICAgZmxvYXQgcGVyc29uTWFzayA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hOwogICAgICAgICAgICB2ZWM0IGZyYW1lQ29sb3IgPSBjZW50ZXJDb2xvciAqIHVfd2VpZ2h0WzBdICogKDEuMCAtIHBlcnNvbk1hc2spOwogICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHVfa3NpemU7IGkrKykgewogICAgICAgICAgICAgICAgdmVjMiBvZmZzZXQgPSB2ZWMyKHVfb2Zmc2V0W2ldKSAqIHVfdGV4ZWxTaXplOwogICAgICAgICAgICAgICAgdmVjMiB0ZXhDb29yZCA9IHZfdGV4Q29vcmQgKyBvZmZzZXQ7CiAgICAgICAgICAgICAgICBmcmFtZUNvbG9yICs9IHRleHR1cmUodV9pbnB1dEZyYW1lLCB0ZXhDb29yZCkgKiB1X3dlaWdodFtpXSAqCiAgICAgICAgICAgICAgICAgICAgKDEuMCAtIHRleHR1cmUodV9wZXJzb25NYXNrLCB0ZXhDb29yZCkuYSk7CiAgICAgICAgICAgICAgICB0ZXhDb29yZCA9IHZfdGV4Q29vcmQgLSBvZmZzZXQ7CiAgICAgICAgICAgICAgICBmcmFtZUNvbG9yICs9IHRleHR1cmUodV9pbnB1dEZyYW1lLCB0ZXhDb29yZCkgKiB1X3dlaWdodFtpXSAqCiAgICAgICAgICAgICAgICAgICAgKDEuMCAtIHRleHR1cmUodV9wZXJzb25NYXNrLCB0ZXhDb29yZCkuYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3V0Q29sb3IgPSB2ZWM0KGZyYW1lQ29sb3IucmdiICsgKDEuMCAtIGZyYW1lQ29sb3IuYSkgKiBjZW50ZXJDb2xvci5yZ2IsIDEuMCk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3Qgc2NhbGUgPSBwYXJhbXMuYmFja2dyb3VuZFJlc2FtcGxlU2NhbGUgfHwgMC4yOwogICAgICAgIGNvbnN0IGJsdXJyZWRCYWNrZ3JvdW5kV2lkdGggPSBNYXRoLnJvdW5kKG91dHB1dFdpZHRoICogc2NhbGUpOwogICAgICAgIGNvbnN0IGJsdXJyZWRCYWNrZ3JvdW5kSGVpZ2h0ID0gTWF0aC5yb3VuZChvdXRwdXRIZWlnaHQgKiBzY2FsZSk7CiAgICAgICAgY29uc3QgdGV4ZWxXaWR0aCA9IDEgLyBibHVycmVkQmFja2dyb3VuZFdpZHRoOwogICAgICAgIGNvbnN0IHRleGVsSGVpZ2h0ID0gMSAvIGJsdXJyZWRCYWNrZ3JvdW5kSGVpZ2h0OwogICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyID0gY29tcGlsZVNoYWRlcihnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCBmcmFnbWVudFNoYWRlclNvdXJjZSk7CiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGNyZWF0ZVBpcGxlbGluZVN0YWdlUHJvZ3JhbShnbCwgdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyKTsKICAgICAgICBjb25zdCBpbnB1dEZyYW1lTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfaW5wdXRGcmFtZSIpOwogICAgICAgIGNvbnN0IHBlcnNvbk1hc2tMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9wZXJzb25NYXNrIik7CiAgICAgICAgY29uc3QgdGV4ZWxTaXplTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfdGV4ZWxTaXplIik7CiAgICAgICAgY29uc3Qgd2VpZ2h0TG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfd2VpZ2h0Iik7CiAgICAgICAgY29uc3Qgb2Zmc2V0TG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfb2Zmc2V0Iik7CiAgICAgICAgY29uc3Qga2VybmVsc2l6ZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2tzaXplIik7CiAgICAgICAgY29uc3QgdGV4dHVyZTEgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgYmx1cnJlZEJhY2tncm91bmRXaWR0aCwgYmx1cnJlZEJhY2tncm91bmRIZWlnaHQsIGdsLk5FQVJFU1QsIGdsLkxJTkVBUik7CiAgICAgICAgY29uc3QgdGV4dHVyZTIgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgYmx1cnJlZEJhY2tncm91bmRXaWR0aCwgYmx1cnJlZEJhY2tncm91bmRIZWlnaHQsIGdsLk5FQVJFU1QsIGdsLkxJTkVBUik7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIxID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMSk7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlMSwgMCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMik7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlMiwgMCk7CiAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICBnbC51bmlmb3JtMWkocGVyc29uTWFza0xvY2F0aW9uLCAxKTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVLZXJuZWwoa2VybmVsID0gIjV4NSIpIHsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgaWYgKGtlcm5lbCA9PT0gIjl4OSIpIHsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShrZXJuZWxzaXplTG9jYXRpb24sIDUpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdih3ZWlnaHRMb2NhdGlvbiwgWzAuMjI3MDI3MDI3LCAwLjE5NDU5NDU5NDYsIDAuMTIxNjIxNjIxNiwgMC4wNTQwNTQwNTQxLCAwLjAxNjIxNjIxNjJdKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYob2Zmc2V0TG9jYXRpb24sIFswLjAsIDEuMCwgMi4wLCAzLjAsIDQuMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGtlcm5lbCA9PT0gIjl4OW8iKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCAzKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFswLjI3MzQzNzUsIDAuMzI4MTI1LCAwLjAzNTE1NjI1XSk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWZ2KG9mZnNldExvY2F0aW9uLCBbMC4wLCAxLjMzMzMzMzMzMzMzMzMzMzMsIDMuMTExMTExMTExMTExMTExXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoa2VybmVsID09PSAiN3g3IikgewogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFpKGtlcm5lbHNpemVMb2NhdGlvbiwgNCk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWZ2KHdlaWdodExvY2F0aW9uLCBbMC4zMTI1LCAwLjIzNDM3NSwgMC4wOTM3NSwgMC4wMTU2MjVdKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYob2Zmc2V0TG9jYXRpb24sIFswLjAsIDEuMCwgMi4wLCAzLjBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChrZXJuZWwgPT09ICI1eDUiKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCAzKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFswLjM3MTUsIDAuMjUsIDAuMDYyNV0pOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgWzAuMCwgMS4wLCAyLjBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChrZXJuZWwgPT09ICIzeDMiKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCAyKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFswLjUsIDAuMjVdKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYob2Zmc2V0TG9jYXRpb24sIFswLjAsIDEuMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGtlcm5lbCA9PT0gIjEwMW8iKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCA2KTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFsKICAgICAgICAgICAgICAgICAgICAwLjA4MjQ5MzAwNzc3NzUwNzcsIDAuMTU3MDg1MTAxNTM3MTA5MywgMC4xMjkwOTI5OTc0ODk2MTYwNiwgMC4wOTA2MTY1NzgxMDc5NzA3NSwKICAgICAgICAgICAgICAgICAgICAwLjA1NDI3MTI3MTgyNTEwMDQ0LCAwLjAyNzY4NzU0NzE1MTQ0OTU0NCwKICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgWzAsIDEuNDg1MTQ4NTE0ODUxNDg1MSwgMy40NjUzNDY1MzQ2NTM0NjUzLCA1LjQ0NTU0NDU1NDQ1NTQ0NiwgNy40MjU3NDI1NzQyNTc0MjYsIDkuNDA1OTQwNTk0MDU5NDA1XSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoa2VybmVsID09PSAiMTcxbyIpIHsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShrZXJuZWxzaXplTG9jYXRpb24sIDcpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdih3ZWlnaHRMb2NhdGlvbiwgWwogICAgICAgICAgICAgICAgICAgIDAuMDY0NjUyMTgwMDU4MTExODUsIDAuMTI1NTk3MzU4NjEzMjkyNywgMC4xMTE4MDYwMjQ1NDY5NzA5OSwgMC4wOTA2NzM0NTcyNjk5NjEwNywKICAgICAgICAgICAgICAgICAgICAwLjA2Njk3NzEyMTMxMjA3OTcxLCAwLjA0NTA0NjQyNjcxODk2NDI1LCAwLjAyNzU3MzUyMTUwOTY3NTI3OCwKICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgWwogICAgICAgICAgICAgICAgICAgIDAsIDEuNDkxMjI4MDcwMTc1NDM4OCwgMy40Nzk1MzIxNjM3NDI2OTA0LCA1LjQ2NzgzNjI1NzMwOTk0MTUsIDcuNDU2MTQwMzUwODc3MTkzLCA5LjQ0NDQ0NDQ0NDQ0NDQ0NSwKICAgICAgICAgICAgICAgICAgICAxMS40MzI3NDg1MzgwMTE2OTYsCiAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChrZXJuZWwuc3RhcnRzV2l0aCgib2ciKSkgewogICAgICAgICAgICAgICAgY29uc3QgcyA9IHBhcnNlRmxvYXQoa2VybmVsLnN1YnN0cmluZygyKSk7CiAgICAgICAgICAgICAgICBjb25zdCB7IHdlaWdodHMsIHBvc2l0aW9ucyB9ID0gZ2VuZXJhdGVPcHRpbWl6ZWRHYXVzc2lhbktlcm5lbChzKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShrZXJuZWxzaXplTG9jYXRpb24sIHdlaWdodHMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIHdlaWdodHMpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgcG9zaXRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZXQgbnVtUGFzc2VzID0gMTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgICAgIHVwZGF0ZUtlcm5lbChwYXJhbXMua2VybmVsKTsKICAgICAgICAgICAgbnVtUGFzc2VzID0gcGFyYW1zLm51bVBhc3NlcyB8fCAxOwogICAgICAgIH0KICAgICAgICB1cGRhdGVQYXJhbXMocGFyYW1zKTsKICAgICAgICBmdW5jdGlvbiByZW5kZXIoKSB7CiAgICAgICAgICAgIGdsLnZpZXdwb3J0KDAsIDAsIGJsdXJyZWRCYWNrZ3JvdW5kV2lkdGgsIGJsdXJyZWRCYWNrZ3JvdW5kSGVpZ2h0KTsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wudW5pZm9ybTFpKGlucHV0RnJhbWVMb2NhdGlvbiwgMCk7CiAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTEpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBwZXJzb25NYXNrVGV4dHVyZSk7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUGFzc2VzOyBpKyspIHsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0yZih0ZXhlbFNpemVMb2NhdGlvbiwgMCwgdGV4ZWxIZWlnaHQpOwogICAgICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcjEpOwogICAgICAgICAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRV9TVFJJUCwgMCwgNCk7CiAgICAgICAgICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUyKTsKICAgICAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUxKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShpbnB1dEZyYW1lTG9jYXRpb24sIDIpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTJmKHRleGVsU2l6ZUxvY2F0aW9uLCB0ZXhlbFdpZHRoLCAwKTsKICAgICAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIyKTsKICAgICAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZTIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMik7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZTIpOwogICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKHRleHR1cmUxKTsKICAgICAgICAgICAgZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wuZGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGJ1aWxkQmxlbmRQYXNzKGdsLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcykgewogICAgICAgIGNvbnN0IHZlcnRleFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIGluIHZlYzIgYV9wb3NpdGlvbjsKICAgICAgICBpbiB2ZWMyIGFfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzIgdl90ZXhDb29yZDsKICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgIC8vIEZsaXBwaW5nIFkgaXMgcmVxdWlyZWQgd2hlbiByZW5kZXJpbmcgdG8gY2FudmFzCiAgICAgICAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChhX3Bvc2l0aW9uICogdmVjMigxLjAsIC0xLjApLCAwLjAsIDEuMCk7CiAgICAgICAgICAgIHZfdGV4Q29vcmQgPSBhX3RleENvb3JkOwogICAgICAgIH1gOwogICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyU291cmNlID0gZ2xzbCBgI3ZlcnNpb24gMzAwIGVzCiAgICAgICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfaW5wdXRGcmFtZTsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X3BlcnNvbk1hc2s7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9ibHVycmVkSW5wdXRGcmFtZTsKICAgICAgICB1bmlmb3JtIHZlYzIgdV9jb3ZlcmFnZTsKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CiAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICB2ZWMzIGNvbG9yID0gdGV4dHVyZSh1X2lucHV0RnJhbWUsIHZfdGV4Q29vcmQpLnJnYjsKICAgICAgICAgICAgdmVjMyBibHVycmVkQ29sb3IgPSB0ZXh0dXJlKHVfYmx1cnJlZElucHV0RnJhbWUsIHZfdGV4Q29vcmQpLnJnYjsKICAgICAgICAgICAgZmxvYXQgcGVyc29uTWFzayA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hOwogICAgICAgICAgICBwZXJzb25NYXNrID0gc21vb3Roc3RlcCh1X2NvdmVyYWdlLngsIHVfY292ZXJhZ2UueSwgcGVyc29uTWFzayk7CiAgICAgICAgICAgIG91dENvbG9yID0gdmVjNChtaXgoYmx1cnJlZENvbG9yLCBjb2xvciwgcGVyc29uTWFzayksIDEuMCk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyID0gY29tcGlsZVNoYWRlcihnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdmVydGV4U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlciA9IGNvbXBpbGVTaGFkZXIoZ2wsIGdsLkZSQUdNRU5UX1NIQURFUiwgZnJhZ21lbnRTaGFkZXJTb3VyY2UpOwogICAgICAgIGNvbnN0IHByb2dyYW0gPSBjcmVhdGVQaXBsZWxpbmVTdGFnZVByb2dyYW0oZ2wsIHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgY29uc3QgaW5wdXRGcmFtZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2lucHV0RnJhbWUiKTsKICAgICAgICBjb25zdCBwZXJzb25NYXNrTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfcGVyc29uTWFzayIpOwogICAgICAgIGNvbnN0IGJsdXJyZWRJbnB1dEZyYW1lID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2JsdXJyZWRJbnB1dEZyYW1lIik7CiAgICAgICAgY29uc3QgY292ZXJhZ2VMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9jb3ZlcmFnZSIpOwogICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgZ2wudW5pZm9ybTFpKGlucHV0RnJhbWVMb2NhdGlvbiwgMCk7CiAgICAgICAgZ2wudW5pZm9ybTFpKHBlcnNvbk1hc2tMb2NhdGlvbiwgMSk7CiAgICAgICAgZ2wudW5pZm9ybTFpKGJsdXJyZWRJbnB1dEZyYW1lLCAyKTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGNvbnN0IGNvdmVyYWdlID0gcGFyYW1zLmNvdmVyYWdlIHx8IFswLCAxXTsKICAgICAgICAgICAgZ2wudW5pZm9ybTJmKGNvdmVyYWdlTG9jYXRpb24sIGNvdmVyYWdlWzBdLCBjb3ZlcmFnZVsxXSk7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZVBhcmFtcyhwYXJhbXMpOwogICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgICAgICAgZ2wudmlld3BvcnQoMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCk7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgICAgICAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGJ1aWxkQmFja2dyb3VuZEJsdXJTdGFnZShnbCwgdmVydGV4U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIHBlcnNvbk1hc2tUZXh0dXJlLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0LCBwYXJhbXMpIHsKICAgICAgICBsZXQgYmx1clBhc3MgPSBidWlsZEJsdXJQYXNzKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgcGVyc29uTWFza1RleHR1cmUsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcyk7CiAgICAgICAgY29uc3QgYmxlbmRQYXNzID0gYnVpbGRCbGVuZFBhc3MoZ2wsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgcGFyYW1zKTsKICAgICAgICBmdW5jdGlvbiByZW5kZXIoKSB7CiAgICAgICAgICAgIGJsdXJQYXNzLnJlbmRlcigpOwogICAgICAgICAgICBibGVuZFBhc3MucmVuZGVyKCk7CiAgICAgICAgfQogICAgICAgIGxldCBjdXJyZW50UmVzYW1wbGVTY2FsZSA9IHBhcmFtcy5iYWNrZ3JvdW5kUmVzYW1wbGVTY2FsZTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgICAgIGlmIChjdXJyZW50UmVzYW1wbGVTY2FsZSAhPT0gcGFyYW1zLmJhY2tncm91bmRSZXNhbXBsZVNjYWxlKSB7CiAgICAgICAgICAgICAgICBibHVyUGFzcy5jbGVhblVwKCk7CiAgICAgICAgICAgICAgICBibHVyUGFzcyA9IGJ1aWxkQmx1clBhc3MoZ2wsIHZlcnRleFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCBwZXJzb25NYXNrVGV4dHVyZSwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgcGFyYW1zKTsKICAgICAgICAgICAgICAgIGN1cnJlbnRSZXNhbXBsZVNjYWxlID0gcGFyYW1zLmJhY2tncm91bmRSZXNhbXBsZVNjYWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJsdXJQYXNzLnVwZGF0ZVBhcmFtcyhwYXJhbXMpOwogICAgICAgICAgICBibGVuZFBhc3MudXBkYXRlUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGJsZW5kUGFzcy5jbGVhblVwKCk7CiAgICAgICAgICAgIGJsdXJQYXNzLmNsZWFuVXAoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBidWlsZEJhY2tncm91bmRJbWFnZVN0YWdlKGdsLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIHBlcnNvbk1hc2tUZXh0dXJlLCBiYWNrZ3JvdW5kSW1hZ2UsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcykgewogICAgICAgIGNvbnN0IHZlcnRleFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIHVuaWZvcm0gdmVjMiB1X2JhY2tncm91bmRTY2FsZTsKICAgICAgICB1bmlmb3JtIHZlYzIgdV9iYWNrZ3JvdW5kT2Zmc2V0OwogICAgICAgIGluIHZlYzIgYV9wb3NpdGlvbjsKICAgICAgICBpbiB2ZWMyIGFfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzIgdl90ZXhDb29yZDsKICAgICAgICBvdXQgdmVjMiB2X2JhY2tncm91bmRDb29yZDsKICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgIC8vIEZsaXBwaW5nIFkgZm9yIGNhbnZhcwogICAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoYV9wb3NpdGlvbiAqIHZlYzIoMS4wLCAtMS4wKSwgMC4wLCAxLjApOwogICAgICAgICAgICB2X3RleENvb3JkID0gYV90ZXhDb29yZDsKICAgICAgICAgICAgdl9iYWNrZ3JvdW5kQ29vcmQgPSBhX3RleENvb3JkICogdV9iYWNrZ3JvdW5kU2NhbGUgKyB1X2JhY2tncm91bmRPZmZzZXQ7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXJTb3VyY2UgPSBnbHNsIGAjdmVyc2lvbiAzMDAgZXMKICAgICAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9pbnB1dEZyYW1lOwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfcGVyc29uTWFzazsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X2JhY2tncm91bmQ7CiAgICAgICAgdW5pZm9ybSB2ZWMyIHVfY292ZXJhZ2U7CiAgICAgICAgaW4gdmVjMiB2X3RleENvb3JkOwogICAgICAgIGluIHZlYzIgdl9iYWNrZ3JvdW5kQ29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CgogICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgdmVjMyBmcmFtZUNvbG9yID0gdGV4dHVyZSh1X2lucHV0RnJhbWUsIHZfdGV4Q29vcmQpLnJnYjsKICAgICAgICAgICAgdmVjMyBiYWNrZ3JvdW5kQ29sb3IgPSB0ZXh0dXJlKHVfYmFja2dyb3VuZCwgdl9iYWNrZ3JvdW5kQ29vcmQpLnJnYjsKICAgICAgICAgICAgZmxvYXQgcGVyc29uTWFzayA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hOwogICAgICAgICAgICBwZXJzb25NYXNrID0gc21vb3Roc3RlcCh1X2NvdmVyYWdlLngsIHVfY292ZXJhZ2UueSwgcGVyc29uTWFzayk7CiAgICAgICAgICAgIG91dENvbG9yID0gdmVjNChmcmFtZUNvbG9yICogcGVyc29uTWFzayArIGJhY2tncm91bmRDb2xvciAqICgxLjAgLSBwZXJzb25NYXNrKSwgMS4wKTsKICAgICAgICB9YDsKICAgICAgICBjb25zdCBvdXRwdXRSYXRpbyA9IG91dHB1dFdpZHRoIC8gb3V0cHV0SGVpZ2h0OwogICAgICAgIGNvbnN0IHZlcnRleFNoYWRlciA9IGNvbXBpbGVTaGFkZXIoZ2wsIGdsLlZFUlRFWF9TSEFERVIsIHZlcnRleFNoYWRlclNvdXJjZSk7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IGJhY2tncm91bmRTY2FsZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2JhY2tncm91bmRTY2FsZSIpOwogICAgICAgIGNvbnN0IGJhY2tncm91bmRPZmZzZXRMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9iYWNrZ3JvdW5kT2Zmc2V0Iik7CiAgICAgICAgY29uc3QgaW5wdXRGcmFtZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2lucHV0RnJhbWUiKTsKICAgICAgICBjb25zdCBwZXJzb25NYXNrTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfcGVyc29uTWFzayIpOwogICAgICAgIGNvbnN0IGJhY2tncm91bmRMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9iYWNrZ3JvdW5kIik7CiAgICAgICAgY29uc3QgY292ZXJhZ2VMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9jb3ZlcmFnZSIpOwogICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgZ2wudW5pZm9ybTJmKGJhY2tncm91bmRTY2FsZUxvY2F0aW9uLCAxLCAxKTsKICAgICAgICBnbC51bmlmb3JtMmYoYmFja2dyb3VuZE9mZnNldExvY2F0aW9uLCAwLCAwKTsKICAgICAgICBnbC51bmlmb3JtMWkoaW5wdXRGcmFtZUxvY2F0aW9uLCAwKTsKICAgICAgICBnbC51bmlmb3JtMWkocGVyc29uTWFza0xvY2F0aW9uLCAxKTsKICAgICAgICBsZXQgYmFja2dyb3VuZFRleHR1cmUgPSBudWxsOwogICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgICAgICAgZ2wudmlld3BvcnQoMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCk7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTEpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBwZXJzb25NYXNrVGV4dHVyZSk7CiAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kVGV4dHVyZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMik7CiAgICAgICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBiYWNrZ3JvdW5kVGV4dHVyZSk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoYmFja2dyb3VuZExvY2F0aW9uLCAyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpOwogICAgICAgICAgICBnbC5kcmF3QXJyYXlzKGdsLlRSSUFOR0xFX1NUUklQLCAwLCA0KTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gaW5pdEJhY2tncm91bmRJbWFnZShiYWNrZ3JvdW5kSW1hZ2UpIHsKICAgICAgICAgICAgY29uc3Qgc291cmNlV2lkdGggPSBiYWNrZ3JvdW5kSW1hZ2UubmF0dXJhbFdpZHRoIHx8IGJhY2tncm91bmRJbWFnZS52aWRlb1dpZHRoIHx8IGJhY2tncm91bmRJbWFnZS53aWR0aDsKICAgICAgICAgICAgY29uc3Qgc291cmNlSGVpZ2h0ID0gYmFja2dyb3VuZEltYWdlLm5hdHVyYWxIZWlnaHQgfHwgYmFja2dyb3VuZEltYWdlLnZpZGVvSGVpZ2h0IHx8IGJhY2tncm91bmRJbWFnZS5oZWlnaHQ7CiAgICAgICAgICAgIGJhY2tncm91bmRUZXh0dXJlID0gY3JlYXRlVGV4dHVyZShnbCwgZ2wuUkdCQTgsIHNvdXJjZVdpZHRoLCBzb3VyY2VIZWlnaHQsIGdsLkxJTkVBUiwgZ2wuTElORUFSKTsKICAgICAgICAgICAgZ2wudGV4U3ViSW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCAwLCAwLCBzb3VyY2VXaWR0aCwgc291cmNlSGVpZ2h0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgICAgICBsZXQgeE9mZnNldCA9IDA7CiAgICAgICAgICAgIGxldCB5T2Zmc2V0ID0gMDsKICAgICAgICAgICAgbGV0IGJhY2tncm91bmRXaWR0aCA9IHNvdXJjZVdpZHRoOwogICAgICAgICAgICBsZXQgYmFja2dyb3VuZEhlaWdodCA9IHNvdXJjZUhlaWdodDsKICAgICAgICAgICAgY29uc3QgYmFja2dyb3VuZFJhdGlvID0gYmFja2dyb3VuZFdpZHRoIC8gYmFja2dyb3VuZEhlaWdodDsKICAgICAgICAgICAgaWYgKGJhY2tncm91bmRSYXRpbyA8IG91dHB1dFJhdGlvKSB7CiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kSGVpZ2h0ID0gYmFja2dyb3VuZFdpZHRoIC8gb3V0cHV0UmF0aW87CiAgICAgICAgICAgICAgICB5T2Zmc2V0ID0gKHNvdXJjZUhlaWdodCAtIGJhY2tncm91bmRIZWlnaHQpIC8gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGJhY2tncm91bmRXaWR0aCA9IGJhY2tncm91bmRIZWlnaHQgKiBvdXRwdXRSYXRpbzsKICAgICAgICAgICAgICAgIHhPZmZzZXQgPSAoc291cmNlV2lkdGggLSBiYWNrZ3JvdW5kV2lkdGgpIC8gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCB4U2NhbGUgPSBiYWNrZ3JvdW5kV2lkdGggLyBzb3VyY2VXaWR0aDsKICAgICAgICAgICAgY29uc3QgeVNjYWxlID0gYmFja2dyb3VuZEhlaWdodCAvIHNvdXJjZUhlaWdodDsKICAgICAgICAgICAgeE9mZnNldCAvPSBzb3VyY2VXaWR0aDsKICAgICAgICAgICAgeU9mZnNldCAvPSBzb3VyY2VIZWlnaHQ7CiAgICAgICAgICAgIGdsLnVuaWZvcm0yZihiYWNrZ3JvdW5kU2NhbGVMb2NhdGlvbiwgeFNjYWxlLCB5U2NhbGUpOwogICAgICAgICAgICBnbC51bmlmb3JtMmYoYmFja2dyb3VuZE9mZnNldExvY2F0aW9uLCB4T2Zmc2V0LCB5T2Zmc2V0KTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gdXBkYXRlQmFja2dyb3VuZEltYWdlKGJhY2tncm91bmRJbWFnZSwgcmVJbml0KSB7CiAgICAgICAgICAgIGlmIChyZUluaXQpIHsKICAgICAgICAgICAgICAgIGJhY2tncm91bmRUZXh0dXJlID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJhY2tncm91bmRJbWFnZSkgewogICAgICAgICAgICAgICAgaWYgKGJhY2tncm91bmRUZXh0dXJlKQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRUZXh0dXJlID0gbnVsbDsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYmFja2dyb3VuZFRleHR1cmUpIHsKICAgICAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGJhY2tncm91bmRUZXh0dXJlKTsKICAgICAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgYmFja2dyb3VuZEltYWdlLm5hdHVyYWxXaWR0aCB8fCBiYWNrZ3JvdW5kSW1hZ2UudmlkZW9XaWR0aCB8fCBiYWNrZ3JvdW5kSW1hZ2Uud2lkdGgsIGJhY2tncm91bmRJbWFnZS5uYXR1cmFsSGVpZ2h0IHx8IGJhY2tncm91bmRJbWFnZS52aWRlb0hlaWdodCB8fCBiYWNrZ3JvdW5kSW1hZ2UuaGVpZ2h0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaW5pdEJhY2tncm91bmRJbWFnZShiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVBhcmFtcyhwYXJhbXMpIHsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgY29uc3QgY292ZXJhZ2UgPSBwYXJhbXMuY292ZXJhZ2UgfHwgWzAsIDFdOwogICAgICAgICAgICBnbC51bmlmb3JtMmYoY292ZXJhZ2VMb2NhdGlvbiwgY292ZXJhZ2VbMF0sIGNvdmVyYWdlWzFdKTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgaWYgKGJhY2tncm91bmRJbWFnZSkKICAgICAgICAgICAgaW5pdEJhY2tncm91bmRJbWFnZShiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUoYmFja2dyb3VuZFRleHR1cmUpOwogICAgICAgICAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgICAgIHVwZGF0ZUJhY2tncm91bmRJbWFnZSwKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGJ1aWxkSW1wcm92ZU1hc2tTdGFnZShnbCwgdmVydGV4U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIHBlcnNvbk1hc2tUZXh0dXJlLCBpbXByb3ZlZE1hc2tUZXh0dXJlLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0KSB7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXJTb3VyY2UgPSBnbHNsIGAjdmVyc2lvbiAzMDAgZXMKICAgICAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9wZXJzb25NYXNrOwogICAgICAgIHVuaWZvcm0gdmVjMiB1X3RleGVsU2l6ZTsKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CiAgICAgICAgY29uc3QgZmxvYXQgb2Zmc2V0WzNdID0gZmxvYXRbXSgwLjAsIDEuMCwgMi4wKTsKICAgICAgICBjb25zdCBmbG9hdCB3ZWlnaHRbM10gPSBmbG9hdFtdKDAuMzg3NzQsIDAuMjQ0NzcsIDAuMDYxMzYpOwogICAgICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgIGZsb2F0IGJsdXJyZWRBbHBoYSA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hICogd2VpZ2h0WzBdOwogICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDM7IGkrKykgewogICAgICAgICAgICAgICAgdmVjMiBvZmZzZXQgPSB2ZWMyKG9mZnNldFtpXSkgKiB1X3RleGVsU2l6ZTsKICAgICAgICAgICAgICAgIHZlYzIgdGV4Q29vcmQgPSB2X3RleENvb3JkICsgb2Zmc2V0OwogICAgICAgICAgICAgICAgYmx1cnJlZEFscGhhICs9IHRleHR1cmUodV9wZXJzb25NYXNrLCB0ZXhDb29yZCkuYSAqIHdlaWdodFtpXTsKICAgICAgICAgICAgICAgIHRleENvb3JkID0gdl90ZXhDb29yZCAtIG9mZnNldDsKICAgICAgICAgICAgICAgIGJsdXJyZWRBbHBoYSArPSB0ZXh0dXJlKHVfcGVyc29uTWFzaywgdGV4Q29vcmQpLmEgKiB3ZWlnaHRbaV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3V0Q29sb3IgPSB2ZWM0KDAsMCwwLGJsdXJyZWRBbHBoYSk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgdGV4ZWxXaWR0aCA9IDEgLyBvdXRwdXRXaWR0aDsKICAgICAgICBjb25zdCB0ZXhlbEhlaWdodCA9IDEgLyBvdXRwdXRIZWlnaHQ7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IHBlcnNvbk1hc2tMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9wZXJzb25NYXNrIik7CiAgICAgICAgY29uc3QgdGV4ZWxTaXplTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfdGV4ZWxTaXplIik7CiAgICAgICAgY29uc3QgdGV4dHVyZTEgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgZ2wuTkVBUkVTVCwgZ2wuTkVBUkVTVCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIxID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMSk7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlMSwgMCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMik7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCBpbXByb3ZlZE1hc2tUZXh0dXJlLCAwKTsKICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgIGdsLnVuaWZvcm0xaShwZXJzb25NYXNrTG9jYXRpb24sIDEpOwogICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgICAgICAgZ2wudmlld3BvcnQoMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCk7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTEpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBwZXJzb25NYXNrVGV4dHVyZSk7CiAgICAgICAgICAgIGdsLnVuaWZvcm0yZih0ZXhlbFNpemVMb2NhdGlvbiwgMCwgdGV4ZWxIZWlnaHQpOwogICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMSk7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlMSk7CiAgICAgICAgICAgIGdsLnVuaWZvcm0yZih0ZXhlbFNpemVMb2NhdGlvbiwgdGV4ZWxXaWR0aCwgMCk7CiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIyKTsKICAgICAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRV9TVFJJUCwgMCwgNCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMik7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZTEpOwogICAgICAgICAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyByZW5kZXIsIGNsZWFuVXAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBidWlsZFRGTGl0ZU91dHB1dFRvTWFza1N0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgb3V0cHV0VGV4dHVyZSwgdGZsaXRlLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0LCBvdXRwdXRNZW1vcnlPZmZzZXQpIHsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X2lucHV0U2VnbWVudGF0aW9uOwoKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CgogICAgICAgIGZsb2F0IGdldE1hc2sodmVjMiBzZWdtZW50YXRpb24pIHsKICAgICAgICAgICAgZmxvYXQgc2hpZnQgPSBtYXgoc2VnbWVudGF0aW9uLnIsIHNlZ21lbnRhdGlvbi5nKTsKICAgICAgICAgICAgZmxvYXQgYmFja2dyb3VuZEV4cCA9IGV4cChzZWdtZW50YXRpb24uciAtIHNoaWZ0KTsKICAgICAgICAgICAgZmxvYXQgcGVyc29uRXhwID0gZXhwKHNlZ21lbnRhdGlvbi5nIC0gc2hpZnQpOwogICAgICAgICAgICByZXR1cm4gcGVyc29uRXhwIC8gKGJhY2tncm91bmRFeHAgKyBwZXJzb25FeHApOwogICAgICAgIH0KCiAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICBmbG9hdCBtYXNrID0gZ2V0TWFzayh0ZXh0dXJlKHVfaW5wdXRTZWdtZW50YXRpb24sIHZfdGV4Q29vcmQpLnJnKTsKICAgICAgICAgICAgb3V0Q29sb3IgPSB2ZWM0KHZlYzMoMC4wKSwgbWFzayk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IGlucHV0TG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfaW5wdXRTZWdtZW50YXRpb24iKTsKICAgICAgICBjb25zdCBpbnB1dFRleHR1cmUgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SRzMyRiwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgZ2wuTkVBUkVTVCwgZ2wuTkVBUkVTVCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpOwogICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIpOwogICAgICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuVEVYVFVSRV8yRCwgb3V0cHV0VGV4dHVyZSwgMCk7CiAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICBnbC51bmlmb3JtMWkoaW5wdXRMb2NhdGlvbiwgMSk7CiAgICAgICAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgICAgICAgICBnbC52aWV3cG9ydCgwLCAwLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0KTsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMSk7CiAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGlucHV0VGV4dHVyZSk7CiAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgZ2wuUkcsIGdsLkZMT0FULCB0ZmxpdGUuSEVBUEYzMiwgb3V0cHV0TWVtb3J5T2Zmc2V0KTsKICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgICAgICAgICBnbC5kZWxldGVGcmFtZWJ1ZmZlcihmcmFtZUJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUoaW5wdXRUZXh0dXJlKTsKICAgICAgICAgICAgZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wuZGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgcmVuZGVyLCBjbGVhblVwIH07CiAgICB9CgogICAgZnVuY3Rpb24gYnVpbGRURkxpdGVJbnB1dFN0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgdGZsaXRlLCBpbnB1dFdpZHRoLCBpbnB1dEhlaWdodCwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCwgaW5wdXRNZW1vcnlPZmZzZXQpIHsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X2lucHV0RnJhbWU7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9mbG9hdGx1dDsKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgdW5pZm9ybSBmbG9hdCB1X3BpeGVsU2l6ZTsKICAgICAgICBvdXQgdmVjNCBvdXRDb2xvcjsKCiAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICBmbG9hdCB4ID0gdl90ZXhDb29yZC54OwogICAgICAgICAgICB2ZWM0IGNvbG9yID0gdGV4dHVyZSh1X2lucHV0RnJhbWUsIHZfdGV4Q29vcmQpOwogICAgICAgICAgICBmbG9hdCByID0gbW9kKHggKiB1X3BpeGVsU2l6ZSwgMy4wKTsKICAgICAgICAgICAgZmxvYXQgYyA9IDAuMDsKICAgICAgICAgICAgaWYgKHIgPj0gMi4wICkgYyA9IGNvbG9yLmI7CiAgICAgICAgICAgIGVsc2UgaWYgKHIgPj0gMS4wKSBjID0gY29sb3IuZzsKICAgICAgICAgICAgZWxzZSBjID0gY29sb3IucjsKICAgICAgICAgICAgb3V0Q29sb3IgPSB0ZXh0dXJlKHVfZmxvYXRsdXQsIHZlYzIoYywgMC41KSk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IGlucHV0RnJhbWVMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9pbnB1dEZyYW1lIik7CiAgICAgICAgY29uc3QgcGl4ZWxTaXplTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfcGl4ZWxTaXplIik7CiAgICAgICAgY29uc3QgZmxvYXRsdXRMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9mbG9hdGx1dCIpOwogICAgICAgIGNvbnN0IG91dHB1dFRleHR1cmUgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgaW5wdXRXaWR0aCAqIDMsIGlucHV0SGVpZ2h0KTsKICAgICAgICBjb25zdCBmcmFtZUJ1ZmZlciA9IGdsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7CiAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcik7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCBvdXRwdXRUZXh0dXJlLCAwKTsKICAgICAgICBjb25zdCBvdXRwdXRQaXhlbHMgPSBuZXcgVWludDhBcnJheSh0ZmxpdGUuSEVBUEYzMi5idWZmZXIsIGlucHV0TWVtb3J5T2Zmc2V0ICogNCwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCAqIDQgKiAzKTsKICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgIGdsLnVuaWZvcm0xaShpbnB1dEZyYW1lTG9jYXRpb24sIDApOwogICAgICAgIGdsLnVuaWZvcm0xZihwaXhlbFNpemVMb2NhdGlvbiwgaW5wdXRXaWR0aCAqIDMpOwogICAgICAgIGdsLnVuaWZvcm0xaShmbG9hdGx1dExvY2F0aW9uLCAzKTsKICAgICAgICBjb25zdCBmbG9hdEx1dFRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7CiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgZmxvYXRMdXRUZXh0dXJlKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7CiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpOwogICAgICAgIGNvbnN0IGx1dCA9IG5ldyBGbG9hdDMyQXJyYXkoMjU2KTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKQogICAgICAgICAgICBsdXRbaV0gPSBpIC8gMjU2OwogICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgMjU2LCAxLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBuZXcgVWludDhBcnJheShsdXQuYnVmZmVyLCAwLCAyNTYgKiA0KSk7CiAgICAgICAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgICAgICAgICBnbC52aWV3cG9ydCgwLCAwLCBpbnB1dFdpZHRoICogMywgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUzKTsKICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgZmxvYXRMdXRUZXh0dXJlKTsKICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgICAgICBnbC5yZWFkUGl4ZWxzKDAsIDAsIGlucHV0V2lkdGggKiAzLCBpbnB1dEhlaWdodCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgb3V0cHV0UGl4ZWxzKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgICAgICAgICAgZ2wuZGVsZXRlRnJhbWVidWZmZXIoZnJhbWVCdWZmZXIpOwogICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKG91dHB1dFRleHR1cmUpOwogICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKGZsb2F0THV0VGV4dHVyZSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVNoYWRlcihmcmFnbWVudFNoYWRlcik7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHJlbmRlciwgY2xlYW5VcCB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGdldEJsdXJFbmdpbmVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgc3dpdGNoIChwYXJhbXMuYW1vdW50KSB7CiAgICAgICAgICAgIGNhc2UgInNsaWdodCI6IHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsga2VybmVsOiAib2c1IiwgbnVtUGFzc2VzOiAxLCBiYWNrZ3JvdW5kUmVzYW1wbGVTY2FsZTogMSB9LCBwYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImhlYXZ5IjogewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyBrZXJuZWw6ICJvZzEwIiwgbnVtUGFzc2VzOiAxLCBiYWNrZ3JvdW5kUmVzYW1wbGVTY2FsZTogMC41IH0sIHBhcmFtcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyBrZXJuZWw6ICJvZzUiLCBudW1QYXNzZXM6IDEsIGJhY2tncm91bmRSZXNhbXBsZVNjYWxlOiAwLjUgfSwgcGFyYW1zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGdldEVuZ2luZVBhcmFtcyhwYXJhbXMpIHsKICAgICAgICBjb25zdCBiYXNlRW5naW5lUGFyYW1zID0gewogICAgICAgICAgICBjb3ZlcmFnZTogcGFyYW1zLmNvdmVyYWdlLAogICAgICAgIH07CiAgICAgICAgaWYgKHBhcmFtcy5iYWNrZ3JvdW5kQmx1cikgewogICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7IGJhc2VFbmdpbmVQYXJhbXMgfSwgZ2V0Qmx1ckVuZ2luZVBhcmFtcyhwYXJhbXMuYmFja2dyb3VuZEJsdXIpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJhc2VFbmdpbmVQYXJhbXM7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVXZWJHTEVuZ2luZSh2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgc2V0dXAsIGVmZmVjdENhbnZhcywgcGFyYW1zLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgY29uc3QgeyB0ZmxpdGUsIGlucHV0SGVpZ2h0LCBpbnB1dFdpZHRoLCBpbnB1dE1lbW9yeU9mZnNldCwgb3V0cHV0TWVtb3J5T2Zmc2V0LCBzZWdtZW50YXRpb25QaXhlbENvdW50IH0gPSB5aWVsZCBsb2FkU2VnbWVudGF0aW9uTW9kZWwoc2V0dXAuc2VnbWVudGF0aW9uTW9kZWxJZCk7CiAgICAgICAgICAgIGxldCBlbmdpbmVQYXJhbXMgPSBnZXRFbmdpbmVQYXJhbXMocGFyYW1zKTsKICAgICAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyU291cmNlID0gZ2xzbCBgI3ZlcnNpb24gMzAwIGVzCiAgICAgICAgaW4gdmVjMiBhX3Bvc2l0aW9uOwogICAgICAgIGluIHZlYzIgYV90ZXhDb29yZDsKICAgICAgICBvdXQgdmVjMiB2X3RleENvb3JkOwogICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KGFfcG9zaXRpb24sIDAuMCwgMS4wKTsKICAgICAgICAgICAgdl90ZXhDb29yZCA9IGFfdGV4Q29vcmQ7CiAgICAgICAgfWA7CiAgICAgICAgICAgIGNvbnN0IGdsID0gZWZmZWN0Q2FudmFzLmdldENvbnRleHQoIndlYmdsMiIsIHNldHVwLndlYmdsQ29udGV4dFNldHRpbmdzKTsKICAgICAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyID0gY29tcGlsZVNoYWRlcihnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdmVydGV4U2hhZGVyU291cmNlKTsKICAgICAgICAgICAgY29uc3QgdmVydGV4QXJyYXkgPSBnbC5jcmVhdGVWZXJ0ZXhBcnJheSgpOwogICAgICAgICAgICBnbC5iaW5kVmVydGV4QXJyYXkodmVydGV4QXJyYXkpOwogICAgICAgICAgICBjb25zdCBwb3NpdGlvbkJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpOwogICAgICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgcG9zaXRpb25CdWZmZXIpOwogICAgICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheShbLTEsIC0xLCAxLjAsIC0xLCAtMSwgMS4wLCAxLjAsIDEuMF0pLCBnbC5TVEFUSUNfRFJBVyk7CiAgICAgICAgICAgIGNvbnN0IHRleENvb3JkQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7CiAgICAgICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KFswLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCwgMS4wLCAxLjAsIDEuMF0pLCBnbC5TVEFUSUNfRFJBVyk7CiAgICAgICAgICAgIGNvbnN0IGlucHV0RnJhbWVUZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBpbnB1dEZyYW1lVGV4dHVyZSk7CiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpOwogICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QpOwogICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7CiAgICAgICAgICAgIGNvbnN0IG1hc2tUZXh0dXJlID0gY3JlYXRlVGV4dHVyZShnbCwgZ2wuUkdCQTgsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0KTsKICAgICAgICAgICAgY29uc3QgaW1wcm92ZWRNYXNrV2lkdGggPSBpbnB1dFdpZHRoOwogICAgICAgICAgICBjb25zdCBpbXByb3ZlZE1hc2tIZWlnaHQgPSBpbnB1dEhlaWdodDsKICAgICAgICAgICAgY29uc3QgaW1wcm92ZWRNYXNrVGV4dHVyZSA9IGNyZWF0ZVRleHR1cmUoZ2wsIGdsLlJHQkE4LCBpbXByb3ZlZE1hc2tXaWR0aCwgaW1wcm92ZWRNYXNrSGVpZ2h0LCBnbC5MSU5FQVIsIGdsLkxJTkVBUik7CiAgICAgICAgICAgIGNvbnN0IHRmbGl0ZUlucHV0U3RhZ2UgPSBidWlsZFRGTGl0ZUlucHV0U3RhZ2UoZ2wsIHZlcnRleFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCB0ZmxpdGUsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0LCBzZWdtZW50YXRpb25QaXhlbENvdW50LCBpbnB1dE1lbW9yeU9mZnNldCk7CiAgICAgICAgICAgIGNvbnN0IHRmbGl0ZU91dHB1dFRvTWFza1N0YWdlID0gYnVpbGRURkxpdGVPdXRwdXRUb01hc2tTdGFnZShnbCwgdmVydGV4U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIG1hc2tUZXh0dXJlLCB0ZmxpdGUsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0LCBvdXRwdXRNZW1vcnlPZmZzZXQpOwogICAgICAgICAgICBjb25zdCBpbXByb3ZlTWFza1N0YWdlID0gYnVpbGRJbXByb3ZlTWFza1N0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgbWFza1RleHR1cmUsIGltcHJvdmVkTWFza1RleHR1cmUsIGltcHJvdmVkTWFza1dpZHRoLCBpbXByb3ZlZE1hc2tIZWlnaHQpOwogICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kQmx1clN0YWdlID0gYnVpbGRCYWNrZ3JvdW5kQmx1clN0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgaW1wcm92ZWRNYXNrVGV4dHVyZSwgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQsIGVuZ2luZVBhcmFtcyk7CiAgICAgICAgICAgIGNvbnN0IGJhY2tncm91bmRJbWFnZVN0YWdlID0gYnVpbGRCYWNrZ3JvdW5kSW1hZ2VTdGFnZShnbCwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCBpbXByb3ZlZE1hc2tUZXh0dXJlLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgZW5naW5lUGFyYW1zKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGVmZmVjdEN0eDogZ2wsCiAgICAgICAgICAgICAgICB1cGRhdGVCYWNrZ3JvdW5kRnJhbWUoZnJhbWUsIF8sIHJlSW5pdCkgewogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRJbWFnZVN0YWdlLnVwZGF0ZUJhY2tncm91bmRJbWFnZShmcmFtZSwgcmVJbml0KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB1cGRhdGVQYXJhbXModXBkYXRlZFBhcmFtcykgewogICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IHVwZGF0ZWRQYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgZW5naW5lUGFyYW1zID0gZ2V0RW5naW5lUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZEJsdXJTdGFnZS51cGRhdGVQYXJhbXMoZW5naW5lUGFyYW1zKTsKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2VTdGFnZS51cGRhdGVQYXJhbXMoZW5naW5lUGFyYW1zKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzRnJhbWUoZnJhbWUpIHsKICAgICAgICAgICAgICAgICAgICBnbC5jbGVhckNvbG9yKDAsIDAsIDAsIDApOwogICAgICAgICAgICAgICAgICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQpOwogICAgICAgICAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTApOwogICAgICAgICAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGlucHV0RnJhbWVUZXh0dXJlKTsKICAgICAgICAgICAgICAgICAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGZyYW1lKTsKICAgICAgICAgICAgICAgICAgICBnbC5iaW5kVmVydGV4QXJyYXkodmVydGV4QXJyYXkpOwogICAgICAgICAgICAgICAgICAgIHRmbGl0ZUlucHV0U3RhZ2UucmVuZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgdGZsaXRlLl9ydW5JbmZlcmVuY2UoKTsKICAgICAgICAgICAgICAgICAgICB0ZmxpdGVPdXRwdXRUb01hc2tTdGFnZS5yZW5kZXIoKTsKICAgICAgICAgICAgICAgICAgICBpbXByb3ZlTWFza1N0YWdlLnJlbmRlcigpOwogICAgICAgICAgICAgICAgICAgIHBhcmFtcy5iYWNrZ3JvdW5kVXJsID8gYmFja2dyb3VuZEltYWdlU3RhZ2UucmVuZGVyKCkgOiBiYWNrZ3JvdW5kQmx1clN0YWdlLnJlbmRlcigpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7CiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZEltYWdlU3RhZ2UuY2xlYW5VcCgpOwogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRCbHVyU3RhZ2UuY2xlYW5VcCgpOwogICAgICAgICAgICAgICAgICAgIGltcHJvdmVNYXNrU3RhZ2UuY2xlYW5VcCgpOwogICAgICAgICAgICAgICAgICAgIHRmbGl0ZU91dHB1dFRvTWFza1N0YWdlLmNsZWFuVXAoKTsKICAgICAgICAgICAgICAgICAgICB0ZmxpdGVJbnB1dFN0YWdlLmNsZWFuVXAoKTsKICAgICAgICAgICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKGltcHJvdmVkTWFza1RleHR1cmUpOwogICAgICAgICAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUobWFza1RleHR1cmUpOwogICAgICAgICAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUoaW5wdXRGcmFtZVRleHR1cmUpOwogICAgICAgICAgICAgICAgICAgIGdsLmRlbGV0ZUJ1ZmZlcih0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgZ2wuZGVsZXRlQnVmZmVyKHBvc2l0aW9uQnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICBnbC5kZWxldGVWZXJ0ZXhBcnJheSh2ZXJ0ZXhBcnJheSk7CiAgICAgICAgICAgICAgICAgICAgZ2wuZGVsZXRlU2hhZGVyKHZlcnRleFNoYWRlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlY29kZUJhc2U2NChiYXNlNjQsIGVuYWJsZVVuaWNvZGUpIHsKICAgICAgICB2YXIgYmluYXJ5U3RyaW5nID0gYXRvYihiYXNlNjQpOwogICAgICAgIHJldHVybiBiaW5hcnlTdHJpbmc7CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlVVJMKGJhc2U2NCwgc291cmNlbWFwQXJnLCBlbmFibGVVbmljb2RlQXJnKSB7CiAgICAgICAgdmFyIHNvdXJjZSA9IGRlY29kZUJhc2U2NChiYXNlNjQpOwogICAgICAgIHZhciBzdGFydCA9IHNvdXJjZS5pbmRleE9mKCdcbicsIDEwKSArIDE7CiAgICAgICAgdmFyIGJvZHkgPSBzb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0KSArICgnJyk7CiAgICAgICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbYm9keV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnIH0pOwogICAgICAgIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZUJhc2U2NFdvcmtlckZhY3RvcnkoYmFzZTY0LCBzb3VyY2VtYXBBcmcsIGVuYWJsZVVuaWNvZGVBcmcpIHsKICAgICAgICB2YXIgdXJsOwogICAgICAgIHJldHVybiBmdW5jdGlvbiBXb3JrZXJGYWN0b3J5KG9wdGlvbnMpIHsKICAgICAgICAgICAgdXJsID0gdXJsIHx8IGNyZWF0ZVVSTChiYXNlNjQpOwogICAgICAgICAgICByZXR1cm4gbmV3IFdvcmtlcih1cmwsIG9wdGlvbnMpOwogICAgICAgIH07CiAgICB9CgogICAgdmFyIFdvcmtlckZhY3RvcnkgPSAvKiNfX1BVUkVfXyovY3JlYXRlQmFzZTY0V29ya2VyRmFjdG9yeSgnTHlvZ2NtOXNiSFZ3TFhCc2RXZHBiaTEzWldJdGQyOXlhMlZ5TFd4dllXUmxjaUFxTHdvb1puVnVZM1JwYjI0Z0tDa2dld29nSUNBZ0ozVnpaU0J6ZEhKcFkzUW5Pd29LSUNBZ0lHeGxkQ0IwYVcxbGNpQTlJRzUxYkd3N0NpQWdJQ0J2Ym0xbGMzTmhaMlVnUFNCbWRXNWpkR2x2YmlBb2NtVnhkV1Z6ZENrZ2V3b2dJQ0FnSUNBZ0lHTnZibk4wSUhScGJXVWdQU0J5WlhGMVpYTjBMbVJoZEdFN0NpQWdJQ0FnSUNBZ2FXWWdLSFJwYldVZ1BqMGdNQ2tLSUNBZ0lDQWdJQ0FnSUNBZ2RHbHRaWElnUFNCelpYUlVhVzFsYjNWMEtDZ3BJRDArSUhCdmMzUk5aWE56WVdkbEtDSWlLU3dnZEdsdFpTazdDaUFnSUNBZ0lDQWdaV3h6WlNCcFppQW9kR2x0WlhJcENpQWdJQ0FnSUNBZ0lDQWdJR05zWldGeVZHbHRaVzkxZENoMGFXMWxjaWs3Q2lBZ0lDQjlPd29LZlNrb0tUc0tMeThqSUhOdmRYSmpaVTFoY0hCcGJtZFZVa3c5ZEdsdFpYSXVkMjl5YTJWeUxtcHpMbTFoY0FvSycpOwogICAgLyogZXNsaW50LWVuYWJsZSAqLwoKICAgIGNsYXNzIFByb2Nlc3NvciBleHRlbmRzIGV2ZW50c0V4cG9ydHMuRXZlbnRFbWl0dGVyIHsKICAgICAgICBjb25zdHJ1Y3Rvcih7IHNldHVwLCBwYXJhbXMsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCBlbWl0IH0pIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5zZXR1cCA9IHNldHVwOwogICAgICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICAgICAgICAgICAgdGhpcy52aWRlb1dpZHRoID0gdmlkZW9XaWR0aDsKICAgICAgICAgICAgdGhpcy52aWRlb0hlaWdodCA9IHZpZGVvSGVpZ2h0OwogICAgICAgICAgICB0aGlzLnN0YXR1cyA9ICJuZXciOwogICAgICAgICAgICBpZiAoZW1pdCkKICAgICAgICAgICAgICAgIHRoaXMuZW1pdCA9IGVtaXQ7CiAgICAgICAgfQogICAgICAgIHNldHVwRW5naW5lKHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCBlZmZlY3RDYW52YXMsIGluaXRpYWxCYWNrZ3JvdW5kRnJhbWUpIHsKICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgICAgIHRoaXMudmlkZW9XaWR0aCA9IHZpZGVvV2lkdGg7CiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvSGVpZ2h0ID0gdmlkZW9IZWlnaHQ7CiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvQXNwZWN0UmF0aW8gPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0OwogICAgICAgICAgICAgICAgdGhpcy5lZmZlY3RDYW52YXMgPSBlZmZlY3RDYW52YXMgfHwgY3JlYXRlQ2FudmFzKHRoaXMudmlkZW9XaWR0aCwgdGhpcy52aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGVFbmdpbmUgPSB0aGlzLnNldHVwLnVzZVdlYkdMID8gY3JlYXRlV2ViR0xFbmdpbmUgOiBjcmVhdGVDYW52YXNFbmdpbmU7CiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZSA9IHlpZWxkIGNyZWF0ZUVuZ2luZSh0aGlzLnZpZGVvV2lkdGgsIHRoaXMudmlkZW9IZWlnaHQsIHRoaXMuc2V0dXAsIHRoaXMuZWZmZWN0Q2FudmFzLCB0aGlzLnBhcmFtcywgaW5pdGlhbEJhY2tncm91bmRGcmFtZSk7CiAgICAgICAgICAgICAgICB0aGlzLmVmZmVjdEN0eCA9IHRoaXMuZW5naW5lLmVmZmVjdEN0eDsKICAgICAgICAgICAgICAgIGlmIChpbml0aWFsQmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVCYWNrZ3JvdW5kRnJhbWUoeyBmcmFtZTogaW5pdGlhbEJhY2tncm91bmRGcmFtZSB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZVZpZGVvU2l6ZShfYSkgewogICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIGFyZ3VtZW50cywgdm9pZCAwLCBmdW5jdGlvbiogKHsgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQgfSkgewogICAgICAgICAgICAgICAgY29uc3Qgb2xkQmFja2dyb3VuZEZyYW1lID0gdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lOwogICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lID0gbnVsbDsKICAgICAgICAgICAgICAgIGNvbnN0IG9sZEVuZ2luZSA9IHRoaXMuZW5naW5lOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAibmV3IikgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybigiVmlkZW8gc2l6ZSB1cGRhdGVkIGJlZm9yZSBlbmdpbmUgd2FzIGluaXRpYWxpemVkLiIpOwogICAgICAgICAgICAgICAgICAgIHRoaXMudmlkZW9XaWR0aCA9IHZpZGVvV2lkdGg7CiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWRlb0hlaWdodCA9IHZpZGVvSGVpZ2h0OwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gImluaXQiKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCJWaWRlbyBzaXplIHVwZGF0ZWQgd2hpbGUgZW5naW5lIHdhcyBpbml0aWFsaXphdGluZy4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuc2V0dXBFbmdpbmUodmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQsIHRoaXMuZWZmZWN0Q2FudmFzLCBvbGRCYWNrZ3JvdW5kRnJhbWUpOwogICAgICAgICAgICAgICAgb2xkRW5naW5lLmRpc3Bvc2UoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGluaXQoX2EpIHsKICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCBhcmd1bWVudHMsIHZvaWQgMCwgZnVuY3Rpb24qICh7IGluaXRpYWxCYWNrZ3JvdW5kRnJhbWUsIHVzZUluc2VydGFibGVTdHJlYW1zLCBlZmZlY3RDYW52YXMgfSkgewogICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAiaW5pdCI7CiAgICAgICAgICAgICAgICB5aWVsZCB0aGlzLnNldHVwRW5naW5lKHRoaXMudmlkZW9XaWR0aCwgdGhpcy52aWRlb0hlaWdodCwgZWZmZWN0Q2FudmFzLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lKTsKICAgICAgICAgICAgICAgIGlmICh1c2VJbnNlcnRhYmxlU3RyZWFtcykgewogICAgICAgICAgICAgICAgICAgIGxldCBkcm9wRmlyc3QgPSA1OwogICAgICAgICAgICAgICAgICAgIGxldCBsb2NhbFN0YXJ0VGltZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgbGV0IGZyYW1lU3RhcnRUaW1lID0gMDsKICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3RGcmFtZVJlbmRlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lciA9IG5ldyBUcmFuc2Zvcm1TdHJlYW0oewogICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IChmcmFtZSwgY29udHJvbGxlcikgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Db250cm9sbGVyID0gY29udHJvbGxlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1lVGltZXN0YW1wID0gZnJhbWUudGltZXN0YW1wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxvY2FsU3RhcnRUaW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdGFydFRpbWUgPSBub3c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTdGFydFRpbWUgPSBmcmFtZVRpbWVzdGFtcCAvIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGFwc2VkRnJhbWVUaW1lID0gZnJhbWVUaW1lc3RhbXAgLyAxMDAwIC0gZnJhbWVTdGFydFRpbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGFwc2VkTG9jYWxUaW1lID0gbm93IC0gbG9jYWxTdGFydFRpbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcEZpcnN0ID4gMCB8fCBlbGFwc2VkTG9jYWxUaW1lIDwgZWxhcHNlZEZyYW1lVGltZSArIDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0FuZFJlbmRlckZyYW1lKGZyYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc1ZpZGVvQmFja2dyb3VuZCAmJiB0aGlzLnNldHVwLnRyYW5zZmVyVHlwZSAhPT0gImNhbnZhcyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJnZXRiYWNrZ3JvdW5kZnJhbWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcm9wRmlyc3QgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcEZpcnN0LS07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdGFydFRpbWUgPSBub3c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTdGFydFRpbWUgPSBmcmFtZVRpbWVzdGFtcCAvIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFZpZGVvRnJhbWUodGhpcy5lZmZlY3RDYW52YXMsIHsgdGltZXN0YW1wOiBmcmFtZVRpbWVzdGFtcCB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0RnJhbWVSZW5kZXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RnJhbWVSZW5kZXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJmaXJzdGZyYW1lcmVuZGVyZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICghdGhpcy5zZXR1cC51c2VCYWNrZ3JvdW5kV29ya2VyKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcldvcmtlciA9IG5ldyBXb3JrZXJGYWN0b3J5KCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcldvcmtlci5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoIm91dHB1dCIsIHsgZnJhbWU6IHRoaXMuY3VycmVudE91dHB1dEZyYW1lIH0sIFt0aGlzLmN1cnJlbnRPdXRwdXRGcmFtZV0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAicmVhZHkiOwogICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJyZWFkeSIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlUGFyYW1zKHsgcGFyYW1zLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lIH0pIHsKICAgICAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CiAgICAgICAgICAgIHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZSA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZUN0eCA9IG51bGw7CiAgICAgICAgICAgIGlmIChpbml0aWFsQmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUJhY2tncm91bmRGcmFtZSh7IGZyYW1lOiBpbml0aWFsQmFja2dyb3VuZEZyYW1lLCByZUluaXQ6IHRydWUgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS51cGRhdGVCYWNrZ3JvdW5kRnJhbWUobnVsbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5lbmdpbmUudXBkYXRlUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZUJhY2tncm91bmRGcmFtZSh7IGZyYW1lLCByZUluaXQgfSkgewogICAgICAgICAgICBsZXQgdXBkYXRlZERpbWVuc2lvbnM7CiAgICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgICAgICAgICB0aGlzLmhhc1ZpZGVvQmFja2dyb3VuZCA9IHRoaXMucGFyYW1zLmJhY2tncm91bmRVcmwgJiYgdGhpcy5wYXJhbXMuYmFja2dyb3VuZFR5cGUgPT09ICJ2aWRlbyI7CiAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucyA9IHsgeDogMCwgeTogMCwgd2lkdGg6IHRoaXMudmlkZW9XaWR0aCwgaGVpZ2h0OiB0aGlzLnZpZGVvSGVpZ2h0IH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNldHVwLnRyYW5zZmVyVHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSAiaW1hZ2ViaXRtYXAiOiB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lID0gZnJhbWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXNlICJpbWFnZWRhdGEiOiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lID0gY3JlYXRlQ2FudmFzKHRoaXMudmlkZW9XaWR0aCwgdGhpcy52aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZUN0eCA9IHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZS5nZXRDb250ZXh0KCIyZCIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmcmFtZSA9IG5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGZyYW1lKSwgdGhpcy52aWRlb1dpZHRoLCB0aGlzLnZpZGVvSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWVDdHgucHV0SW1hZ2VEYXRhKGZyYW1lLCAwLCAwKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhc2UgImNhbnZhcyI6IHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucy53aWR0aCA9IGZyYW1lLnZpZGVvV2lkdGggfHwgZnJhbWUubmF0dXJhbFdpZHRoIHx8IGZyYW1lLndpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucy5oZWlnaHQgPSBmcmFtZS52aWRlb0hlaWdodCB8fCBmcmFtZS5uYXR1cmFsSGVpZ2h0IHx8IGZyYW1lLmhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFja2dyb3VuZEFzcGVjdFJhdGlvID0gdXBkYXRlZERpbWVuc2lvbnMud2lkdGggLyB1cGRhdGVkRGltZW5zaW9ucy5oZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kQXNwZWN0UmF0aW8gPiB0aGlzLnZpZGVvQXNwZWN0UmF0aW8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dHNpZGVYID0gdXBkYXRlZERpbWVuc2lvbnMud2lkdGggLSB1cGRhdGVkRGltZW5zaW9ucy5oZWlnaHQgKiB0aGlzLnZpZGVvQXNwZWN0UmF0aW87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucy53aWR0aCAtPSBvdXRzaWRlWDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWREaW1lbnNpb25zLnggPSBNYXRoLmZsb29yKG91dHNpZGVYIC8gMik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYmFja2dyb3VuZEFzcGVjdFJhdGlvIDwgdGhpcy52aWRlb0FzcGVjdFJhdGlvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRzaWRlWSA9IHVwZGF0ZWREaW1lbnNpb25zLmhlaWdodCAtIHVwZGF0ZWREaW1lbnNpb25zLndpZHRoIC8gdGhpcy52aWRlb0FzcGVjdFJhdGlvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZERpbWVuc2lvbnMuaGVpZ2h0IC09IG91dHNpZGVZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZERpbWVuc2lvbnMueSA9IE1hdGguZmxvb3Iob3V0c2lkZVkgLyAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUgPSBmcmFtZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmVuZ2luZS51cGRhdGVCYWNrZ3JvdW5kRnJhbWUodGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lLCB1cGRhdGVkRGltZW5zaW9ucywgcmVJbml0KTsKICAgICAgICB9CiAgICAgICAgdGVybWluYXRlKCkgewogICAgICAgICAgICBpZiAodGhpcy50cmFuc2Zvcm1Db250cm9sbGVyKQogICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Db250cm9sbGVyLnRlcm1pbmF0ZSgpOwogICAgICAgICAgICBpZiAodGhpcy50aW1lcldvcmtlcikKICAgICAgICAgICAgICAgIHRoaXMudGltZXJXb3JrZXIudGVybWluYXRlKCk7CiAgICAgICAgICAgIGlmICh0aGlzLmVuZ2luZSkgewogICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUuZGlzcG9zZSgpOwogICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmF0ZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLmVtaXQoInRlcm1pbmF0ZWQiKTsKICAgICAgICB9CiAgICAgICAgc3RhcnQoeyBpbnB1dFN0cmVhbSwgb3V0cHV0U3RyZWFtIH0pIHsKICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtKQogICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0ucGlwZVRocm91Z2godGhpcy50cmFuc2Zvcm1lcikucGlwZVRvKG91dHB1dFN0cmVhbSk7CiAgICAgICAgICAgIHRoaXMuZnJhbWVDb3VudGVyID0gMDsKICAgICAgICAgICAgdGhpcy5mcmFtZUNvdW50ZXJUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgICAgfQogICAgICAgIGlucHV0KF9hKSB7CiAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgYXJndW1lbnRzLCB2b2lkIDAsIGZ1bmN0aW9uKiAoeyB2aWRlb0ZyYW1lLCBiYWNrZ3JvdW5kRnJhbWUsIHJlcXVlc3RUaW1lLCBsYXN0UmVuZGVyVGltZSwgZGVsYXkgfSkgewogICAgICAgICAgICAgICAgdmFyIF9iOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmF0ZWQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgY29uc3QgcnR0ID0gKERhdGUubm93KCkgLSByZXF1ZXN0VGltZSkgKiAyOwogICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuVGltZSA9IGxhc3RSZW5kZXJUaW1lICsgZGVsYXkgLSBydHQ7CiAgICAgICAgICAgICAgICBpZiAoYmFja2dyb3VuZEZyYW1lKQogICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQmFja2dyb3VuZEZyYW1lKHsgZnJhbWU6IGJhY2tncm91bmRGcmFtZSB9KTsKICAgICAgICAgICAgICAgIGxldCBmcmFtZTsKICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zZXR1cC50cmFuc2ZlclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICJpbWFnZWJpdG1hcCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgKF9iID0gdGhpcy5wcmV2VmlkZW9GcmFtZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJldlZpZGVvRnJhbWUgPSB2aWRlb0ZyYW1lOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NBbmRSZW5kZXJGcmFtZSh2aWRlb0ZyYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgPSB5aWVsZCBjcmVhdGVJbWFnZUJpdG1hcCh0aGlzLmVmZmVjdENhbnZhcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXNlICJpbWFnZWRhdGEiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUgPSBuZXcgSW1hZ2VEYXRhKG5ldyBVaW50OENsYW1wZWRBcnJheSh2aWRlb0ZyYW1lKSwgdGhpcy52aWRlb1dpZHRoLCB0aGlzLnZpZGVvSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlucHV0Q2FudmFzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0Q2FudmFzID0gY3JlYXRlQ2FudmFzKHRoaXMudmlkZW9XaWR0aCwgdGhpcy52aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0Q2FudmFzQ3R4ID0gdGhpcy5pbnB1dENhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRDYW52YXNDdHgucHV0SW1hZ2VEYXRhKHZpZGVvRnJhbWUsIDAsIDApOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NBbmRSZW5kZXJGcmFtZSh0aGlzLmlucHV0Q2FudmFzKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgPSB0aGlzLmVmZmVjdEN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdGhpcy52aWRlb1dpZHRoLCB0aGlzLnZpZGVvSGVpZ2h0KS5kYXRhLmJ1ZmZlcjsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhc2UgImNhbnZhcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQW5kUmVuZGVyRnJhbWUodmlkZW9GcmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lID0gdGhpcy5lZmZlY3RDYW52YXM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuRGVsYXkgPSBNYXRoLm1heCgwLCByZXR1cm5UaW1lIC0gRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy50aW1lcldvcmtlcikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE91dHB1dEZyYW1lID0gZnJhbWU7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcldvcmtlci5wb3N0TWVzc2FnZShyZXR1cm5EZWxheSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJvdXRwdXQiLCB7IGZyYW1lIH0sIFtmcmFtZV0pOwogICAgICAgICAgICAgICAgICAgIH0sIHJldHVybkRlbGF5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHByb2Nlc3NBbmRSZW5kZXJGcmFtZShmcmFtZSkgewogICAgICAgICAgICB0aGlzLmVuZ2luZS5wcm9jZXNzRnJhbWUoZnJhbWUpOwogICAgICAgICAgICBpZiAodGhpcy5zZXR1cC5sb2dUb0NvbnNvbGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZnJhbWVDb3VudGVyKys7CiAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgICAgICAgICAgICAgIGlmIChub3cgLSB0aGlzLmZyYW1lQ291bnRlclRpbWUgPiAxMDAwKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJ1bm5pbmcgY2FtZXJhIGVmZmVjdHMsICR7TWF0aC5yb3VuZCgodGhpcy5mcmFtZUNvdW50ZXIgKiAxMDAwKSAvIChub3cgLSB0aGlzLmZyYW1lQ291bnRlclRpbWUpKX0gZnBzYCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmFtZUNvdW50ZXIgPSAwOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZnJhbWVDb3VudGVyVGltZSA9IG5vdzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBjb25zdCBwcm9jZXNzb3JzID0ge307CiAgICBvbm1lc3NhZ2UgPSBmdW5jdGlvbiAocmVxdWVzdCkgewogICAgICAgIHZhciBfYTsKICAgICAgICBjb25zdCBwcm9jZXNzb3JJZCA9IHJlcXVlc3QuZGF0YS5wcm9jZXNzb3JJZDsKICAgICAgICBpZiAocmVxdWVzdC5kYXRhLnR5cGUgPT09ICJjcmVhdGUiKSB7CiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NvciA9IG5ldyBQcm9jZXNzb3IoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXF1ZXN0LmRhdGEpLCB7IGVtaXQ6ICh0eXBlLCBkYXRhLCB0cmFuc2ZlcikgPT4gcG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbih7IHByb2Nlc3NvcklkLCB0eXBlIH0sIGRhdGEpLCB0cmFuc2ZlcikgfSkpOwogICAgICAgICAgICBwcm9jZXNzb3JzW3Byb2Nlc3NvcklkXSA9IHByb2Nlc3NvcjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIChfYSA9IHByb2Nlc3NvcnNbcHJvY2Vzc29ySWRdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbcmVxdWVzdC5kYXRhLnR5cGVdKHJlcXVlc3QuZGF0YSk7CiAgICAgICAgICAgIGlmIChyZXF1ZXN0LmRhdGEudHlwZSA9PT0gInRlcm1pbmF0ZSIpIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBwcm9jZXNzb3JzW3Byb2Nlc3NvcklkXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgY29uc3QgY3JlYXRlVEZMaXRlU0lNRE1vZHVsZSA9IChmdW5jdGlvbiAoKSB7CiAgICAgICAgbGV0IF9zY3JpcHREaXIgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICJ1bmRlZmluZWQiICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgPyBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyA6IHVuZGVmaW5lZDsKICAgICAgICBpZiAodHlwZW9mIF9fZmlsZW5hbWUgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICBfc2NyaXB0RGlyID0gX3NjcmlwdERpciB8fCBfX2ZpbGVuYW1lOwogICAgICAgIHJldHVybiBmdW5jdGlvbiAoY3JlYXRlVEZMaXRlU0lNRE1vZHVsZSkgewogICAgICAgICAgICBjcmVhdGVURkxpdGVTSU1ETW9kdWxlID0gY3JlYXRlVEZMaXRlU0lNRE1vZHVsZSB8fCB7fTsKICAgICAgICAgICAgdmFyIE1vZHVsZSA9IHR5cGVvZiBjcmVhdGVURkxpdGVTSU1ETW9kdWxlICE9PSAidW5kZWZpbmVkIiA/IGNyZWF0ZVRGTGl0ZVNJTURNb2R1bGUgOiB7fTsKICAgICAgICAgICAgdmFyIHJlYWR5UHJvbWlzZVJlc29sdmUsIHJlYWR5UHJvbWlzZVJlamVjdDsKICAgICAgICAgICAgTW9kdWxlWyJyZWFkeSJdID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgcmVhZHlQcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7CiAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZWplY3QgPSByZWplY3Q7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgbW9kdWxlT3ZlcnJpZGVzID0ge307CiAgICAgICAgICAgIHZhciBrZXk7CiAgICAgICAgICAgIGZvciAoa2V5IGluIE1vZHVsZSkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgbW9kdWxlT3ZlcnJpZGVzW2tleV0gPSBNb2R1bGVba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdGhpc1Byb2dyYW0gPSAiLi90aGlzLnByb2dyYW0iOwogICAgICAgICAgICB2YXIgcXVpdF8gPSBmdW5jdGlvbiAoc3RhdHVzLCB0b1Rocm93KSB7CiAgICAgICAgICAgICAgICB0aHJvdyB0b1Rocm93OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgRU5WSVJPTk1FTlRfSVNfV0VCID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBFTlZJUk9OTUVOVF9JU19XT1JLRVIgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX05PREUgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX1NIRUxMID0gZmFsc2U7CiAgICAgICAgICAgIEVOVklST05NRU5UX0lTX1dFQiA9IHR5cGVvZiB3aW5kb3cgPT09ICJvYmplY3QiOwogICAgICAgICAgICBFTlZJUk9OTUVOVF9JU19XT1JLRVIgPSB0eXBlb2YgaW1wb3J0U2NyaXB0cyA9PT0gImZ1bmN0aW9uIjsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfTk9ERSA9CiAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2VzcyA9PT0gIm9iamVjdCIgJiYKICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucyA9PT0gIm9iamVjdCIgJiYKICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlID09PSAic3RyaW5nIjsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfU0hFTEwgPSAhRU5WSVJPTk1FTlRfSVNfV0VCICYmICFFTlZJUk9OTUVOVF9JU19OT0RFICYmICFFTlZJUk9OTUVOVF9JU19XT1JLRVI7CiAgICAgICAgICAgIHZhciBzY3JpcHREaXJlY3RvcnkgPSAiIjsKICAgICAgICAgICAgZnVuY3Rpb24gbG9jYXRlRmlsZShwYXRoKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJsb2NhdGVGaWxlIl0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTW9kdWxlWyJsb2NhdGVGaWxlIl0ocGF0aCwgc2NyaXB0RGlyZWN0b3J5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBzY3JpcHREaXJlY3RvcnkgKyBwYXRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciByZWFkXywgcmVhZEFzeW5jLCByZWFkQmluYXJ5OwogICAgICAgICAgICB2YXIgbm9kZUZTOwogICAgICAgICAgICB2YXIgbm9kZVBhdGg7CiAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19OT0RFKSB7CiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gcmVxdWlyZSgicGF0aCIpLmRpcm5hbWUoc2NyaXB0RGlyZWN0b3J5KSArICIvIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IF9fZGlybmFtZSArICIvIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gc2hlbGxfcmVhZChmaWxlbmFtZSwgYmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlRlMpCiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVGUyA9IHJlcXVpcmUoImZzIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlUGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVBhdGggPSByZXF1aXJlKCJwYXRoIik7CiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBub2RlUGF0aFsibm9ybWFsaXplIl0oZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlRlNbInJlYWRGaWxlU3luYyJdKGZpbGVuYW1lLCBiaW5hcnkgPyBudWxsIDogInV0ZjgiKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gcmVhZEJpbmFyeShmaWxlbmFtZSkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSByZWFkXyhmaWxlbmFtZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXQuYnVmZmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBVaW50OEFycmF5KHJldCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzWyJhcmd2Il0ubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICAgIHRoaXNQcm9ncmFtID0gcHJvY2Vzc1siYXJndiJdWzFdLnJlcGxhY2UoL1xcL2csICIvIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJhcmd2Il0uc2xpY2UoMik7CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJvbiJdKCJ1bmNhdWdodEV4Y2VwdGlvbiIsIGZ1bmN0aW9uIChleCkgewogICAgICAgICAgICAgICAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgRXhpdFN0YXR1cykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJvbiJdKCJ1bmhhbmRsZWRSZWplY3Rpb24iLCBhYm9ydCk7CiAgICAgICAgICAgICAgICBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICBwcm9jZXNzWyJleGl0Il0oc3RhdHVzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBNb2R1bGVbImluc3BlY3QiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdIjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoRU5WSVJPTk1FTlRfSVNfU0hFTEwpIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVhZCAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gc2hlbGxfcmVhZChmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkKGYpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gcmVhZEJpbmFyeShmKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGE7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZWFkYnVmZmVyID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShyZWFkYnVmZmVyKGYpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlYWQoZiwgImJpbmFyeSIpOwogICAgICAgICAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgZGF0YSA9PT0gIm9iamVjdCIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2NyaXB0QXJncyAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdEFyZ3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHF1aXQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcXVpdChzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHByaW50ICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyA9IHByaW50OwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiA9IGNvbnNvbGUuZXJyb3IgPSB0eXBlb2YgcHJpbnRFcnIgIT09ICJ1bmRlZmluZWQiID8gcHJpbnRFcnIgOiBwcmludDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChFTlZJUk9OTUVOVF9JU19XRUIgfHwgRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gc2VsZi5sb2NhdGlvbi5ocmVmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0KSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoX3NjcmlwdERpcikgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IF9zY3JpcHREaXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2NyaXB0RGlyZWN0b3J5LmluZGV4T2YoImJsb2I6IikgIT09IDApIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBzY3JpcHREaXJlY3Rvcnkuc3Vic3RyKDAsIHNjcmlwdERpcmVjdG9yeS5sYXN0SW5kZXhPZigiLyIpICsgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZWFkXyA9IGZ1bmN0aW9uICh1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub3BlbigiR0VUIiwgdXJsLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5zZW5kKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGhyLnJlc3BvbnNlVGV4dDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEJpbmFyeSA9IGZ1bmN0aW9uICh1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5vcGVuKCJHRVQiLCB1cmwsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnNlbmQobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeGhyLnJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVhZEFzeW5jID0gZnVuY3Rpb24gKHVybCwgb25sb2FkLCBvbmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwIHx8ICh4aHIuc3RhdHVzID09IDAgJiYgeGhyLnJlc3BvbnNlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubG9hZCh4aHIucmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9uZXJyb3IgPSBvbmVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIuc2VuZChudWxsKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgOwogICAgICAgICAgICB2YXIgb3V0ID0gTW9kdWxlWyJwcmludCJdIHx8IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7CiAgICAgICAgICAgIHZhciBlcnIgPSBNb2R1bGVbInByaW50RXJyIl0gfHwgY29uc29sZS53YXJuLmJpbmQoY29uc29sZSk7CiAgICAgICAgICAgIGZvciAoa2V5IGluIG1vZHVsZU92ZXJyaWRlcykgewogICAgICAgICAgICAgICAgaWYgKG1vZHVsZU92ZXJyaWRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlW2tleV0gPSBtb2R1bGVPdmVycmlkZXNba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBtb2R1bGVPdmVycmlkZXMgPSBudWxsOwogICAgICAgICAgICBpZiAoTW9kdWxlWyJhcmd1bWVudHMiXSkKICAgICAgICAgICAgICAgIE1vZHVsZVsiYXJndW1lbnRzIl07CiAgICAgICAgICAgIGlmIChNb2R1bGVbInRoaXNQcm9ncmFtIl0pCiAgICAgICAgICAgICAgICB0aGlzUHJvZ3JhbSA9IE1vZHVsZVsidGhpc1Byb2dyYW0iXTsKICAgICAgICAgICAgaWYgKE1vZHVsZVsicXVpdCJdKQogICAgICAgICAgICAgICAgcXVpdF8gPSBNb2R1bGVbInF1aXQiXTsKICAgICAgICAgICAgdmFyIHdhc21CaW5hcnk7CiAgICAgICAgICAgIGlmIChNb2R1bGVbIndhc21CaW5hcnkiXSkKICAgICAgICAgICAgICAgIHdhc21CaW5hcnkgPSBNb2R1bGVbIndhc21CaW5hcnkiXTsKICAgICAgICAgICAgTW9kdWxlWyJub0V4aXRSdW50aW1lIl0gfHwgdHJ1ZTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBXZWJBc3NlbWJseSAhPT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgICAgIGFib3J0KCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHdhc21NZW1vcnk7CiAgICAgICAgICAgIHZhciBBQk9SVCA9IGZhbHNlOwogICAgICAgICAgICBmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLCB0ZXh0KSB7CiAgICAgICAgICAgICAgICBpZiAoIWNvbmRpdGlvbikgewogICAgICAgICAgICAgICAgICAgIGFib3J0KCJBc3NlcnRpb24gZmFpbGVkOiAiICsgdGV4dCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIFVURjhEZWNvZGVyID0gdHlwZW9mIFRleHREZWNvZGVyICE9PSAidW5kZWZpbmVkIiA/IG5ldyBUZXh0RGVjb2RlcigidXRmOCIpIDogdW5kZWZpbmVkOwogICAgICAgICAgICBmdW5jdGlvbiBVVEY4QXJyYXlUb1N0cmluZyhoZWFwLCBpZHgsIG1heEJ5dGVzVG9SZWFkKSB7CiAgICAgICAgICAgICAgICB2YXIgZW5kSWR4ID0gaWR4ICsgbWF4Qnl0ZXNUb1JlYWQ7CiAgICAgICAgICAgICAgICB2YXIgZW5kUHRyID0gaWR4OwogICAgICAgICAgICAgICAgd2hpbGUgKGhlYXBbZW5kUHRyXSAmJiAhKGVuZFB0ciA+PSBlbmRJZHgpKQogICAgICAgICAgICAgICAgICAgICsrZW5kUHRyOwogICAgICAgICAgICAgICAgaWYgKGVuZFB0ciAtIGlkeCA+IDE2ICYmIGhlYXAuc3ViYXJyYXkgJiYgVVRGOERlY29kZXIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVVRGOERlY29kZXIuZGVjb2RlKGhlYXAuc3ViYXJyYXkoaWR4LCBlbmRQdHIpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBzdHIgPSAiIjsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaWR4IDwgZW5kUHRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MCA9IGhlYXBbaWR4KytdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh1MCAmIDEyOCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHUwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MSA9IGhlYXBbaWR4KytdICYgNjM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodTAgJiAyMjQpID09IDE5MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKCh1MCAmIDMxKSA8PCA2KSB8IHUxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MiA9IGhlYXBbaWR4KytdICYgNjM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodTAgJiAyNDApID09IDIyNCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTAgPSAoKHUwICYgMTUpIDw8IDEyKSB8ICh1MSA8PCA2KSB8IHUyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTAgPSAoKHUwICYgNykgPDwgMTgpIHwgKHUxIDw8IDEyKSB8ICh1MiA8PCA2KSB8IChoZWFwW2lkeCsrXSAmIDYzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodTAgPCA2NTUzNikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoID0gdTAgLSA2NTUzNjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2IHwgKGNoID4+IDEwKSwgNTYzMjAgfCAoY2ggJiAxMDIzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIFVURjhUb1N0cmluZyhwdHIsIG1heEJ5dGVzVG9SZWFkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcHRyID8gVVRGOEFycmF5VG9TdHJpbmcoSEVBUFU4LCBwdHIsIG1heEJ5dGVzVG9SZWFkKSA6ICIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHdyaXRlQXNjaWlUb01lbW9yeShzdHIsIGJ1ZmZlciwgZG9udEFkZE51bGwpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgSEVBUDhbYnVmZmVyKysgPj4gMF0gPSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEhFQVA4W2J1ZmZlciA+PiAwXSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gYWxpZ25VcCh4LCBtdWx0aXBsZSkgewogICAgICAgICAgICAgICAgaWYgKHggJSBtdWx0aXBsZSA+IDApIHsKICAgICAgICAgICAgICAgICAgICB4ICs9IG11bHRpcGxlIC0gKHggJSBtdWx0aXBsZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgYnVmZmVyLCBIRUFQOCwgSEVBUFU4LCBIRUFQMzI7CiAgICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKGJ1ZikgewogICAgICAgICAgICAgICAgYnVmZmVyID0gYnVmOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQOCJdID0gSEVBUDggPSBuZXcgSW50OEFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVAxNiJdID0gbmV3IEludDE2QXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUDMyIl0gPSBIRUFQMzIgPSBuZXcgSW50MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQVTgiXSA9IEhFQVBVOCA9IG5ldyBVaW50OEFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBVMTYiXSA9IG5ldyBVaW50MTZBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQVTMyIl0gPSBuZXcgVWludDMyQXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUEYzMiJdID0gbmV3IEZsb2F0MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQRjY0Il0gPSBuZXcgRmxvYXQ2NEFycmF5KGJ1Zik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTW9kdWxlWyJJTklUSUFMX01FTU9SWSJdIHx8IDE2Nzc3MjE2OwogICAgICAgICAgICB2YXIgd2FzbVRhYmxlOwogICAgICAgICAgICB2YXIgX19BVFBSRVJVTl9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUSU5JVF9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUTUFJTl9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUUE9TVFJVTl9fID0gW107CiAgICAgICAgICAgIF9fQVRJTklUX18ucHVzaCh7CiAgICAgICAgICAgICAgICBmdW5jOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgX19fd2FzbV9jYWxsX2N0b3JzKCk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZnVuY3Rpb24gcHJlUnVuKCkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsicHJlUnVuIl0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicHJlUnVuIl0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJwcmVSdW4iXSA9IFtNb2R1bGVbInByZVJ1biJdXTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwcmVSdW4iXS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkT25QcmVSdW4oTW9kdWxlWyJwcmVSdW4iXS5zaGlmdCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUFJFUlVOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGluaXRSdW50aW1lKCkgewogICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVElOSVRfXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcHJlTWFpbigpIHsKICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRNQUlOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHBvc3RSdW4oKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJwb3N0UnVuIl0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicG9zdFJ1biJdID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZVsicG9zdFJ1biJdID0gW01vZHVsZVsicG9zdFJ1biJdXTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwb3N0UnVuIl0ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE9uUG9zdFJ1bihNb2R1bGVbInBvc3RSdW4iXS5zaGlmdCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUE9TVFJVTl9fKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBhZGRPblByZVJ1bihjYikgewogICAgICAgICAgICAgICAgX19BVFBSRVJVTl9fLnVuc2hpZnQoY2IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZE9uUG9zdFJ1bihjYikgewogICAgICAgICAgICAgICAgX19BVFBPU1RSVU5fXy51bnNoaWZ0KGNiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcnVuRGVwZW5kZW5jaWVzID0gMDsKICAgICAgICAgICAgdmFyIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IG51bGw7CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZFJ1bkRlcGVuZGVuY3koaWQpIHsKICAgICAgICAgICAgICAgIHJ1bkRlcGVuZGVuY2llcysrOwogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0ocnVuRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiByZW1vdmVSdW5EZXBlbmRlbmN5KGlkKSB7CiAgICAgICAgICAgICAgICBydW5EZXBlbmRlbmNpZXMtLTsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKHJ1bkRlcGVuZGVuY2llcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID09IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzRnVsZmlsbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGRlcGVuZGVuY2llc0Z1bGZpbGxlZDsKICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTW9kdWxlWyJwcmVsb2FkZWRJbWFnZXMiXSA9IHt9OwogICAgICAgICAgICBNb2R1bGVbInByZWxvYWRlZEF1ZGlvcyJdID0ge307CiAgICAgICAgICAgIGZ1bmN0aW9uIGFib3J0KHdoYXQpIHsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbIm9uQWJvcnQiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsib25BYm9ydCJdKHdoYXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hhdCArPSAiIjsKICAgICAgICAgICAgICAgIGVycih3aGF0KTsKICAgICAgICAgICAgICAgIEFCT1JUID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHdoYXQgPSAiYWJvcnQoIiArIHdoYXQgKyAiKS4gQnVpbGQgd2l0aCAtcyBBU1NFUlRJT05TPTEgZm9yIG1vcmUgaW5mby4iOwogICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKHdoYXQpOwogICAgICAgICAgICAgICAgcmVhZHlQcm9taXNlUmVqZWN0KGUpOwogICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBoYXNQcmVmaXgoc3RyLCBwcmVmaXgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGggPyBzdHIuc3RhcnRzV2l0aChwcmVmaXgpIDogc3RyLmluZGV4T2YocHJlZml4KSA9PT0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZGF0YVVSSVByZWZpeCA9ICJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIjsKICAgICAgICAgICAgZnVuY3Rpb24gaXNEYXRhVVJJKGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLCBkYXRhVVJJUHJlZml4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZmlsZVVSSVByZWZpeCA9ICJmaWxlOi8vIjsKICAgICAgICAgICAgZnVuY3Rpb24gaXNGaWxlVVJJKGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLCBmaWxlVVJJUHJlZml4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd2FzbUJpbmFyeUZpbGUgPSAidGZsaXRlLXNpbWQud2FzbSI7CiAgICAgICAgICAgIGlmICghaXNEYXRhVVJJKHdhc21CaW5hcnlGaWxlKSkgewogICAgICAgICAgICAgICAgd2FzbUJpbmFyeUZpbGUgPSBsb2NhdGVGaWxlKHdhc21CaW5hcnlGaWxlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBnZXRCaW5hcnkoZmlsZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSA9PSB3YXNtQmluYXJ5RmlsZSAmJiB3YXNtQmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh3YXNtQmluYXJ5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRCaW5hcnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRCaW5hcnkoZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAiYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWQiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBhYm9ydChlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEJpbmFyeVByb21pc2UoKSB7CiAgICAgICAgICAgICAgICBpZiAoIXdhc21CaW5hcnkgJiYgKEVOVklST05NRU5UX0lTX1dFQiB8fCBFTlZJUk9OTUVOVF9JU19XT1JLRVIpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmZXRjaCA9PT0gImZ1bmN0aW9uIiAmJiAhaXNGaWxlVVJJKHdhc21CaW5hcnlGaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUsIHsgY3JlZGVudGlhbHM6ICJzYW1lLW9yaWdpbiIgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZVsib2siXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICciICsgd2FzbUJpbmFyeUZpbGUgKyAiJyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VbImFycmF5QnVmZmVyIl0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmluYXJ5KHdhc21CaW5hcnlGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZEFzeW5jKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRBc3luYyh3YXNtQmluYXJ5RmlsZSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByZWplY3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJpbmFyeSh3YXNtQmluYXJ5RmlsZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBjcmVhdGVXYXNtKCkgewogICAgICAgICAgICAgICAgdmFyIGluZm8gPSB7IGE6IGFzbUxpYnJhcnlBcmcgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJlY2VpdmVJbnN0YW5jZShpbnN0YW5jZSwgbW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGV4cG9ydHMgPSBpbnN0YW5jZS5leHBvcnRzOwogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsiYXNtIl0gPSBleHBvcnRzOwogICAgICAgICAgICAgICAgICAgIHdhc21NZW1vcnkgPSBNb2R1bGVbImFzbSJdWyJxIl07CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgIHdhc21UYWJsZSA9IE1vZHVsZVsiYXNtIl1bIkQiXTsKICAgICAgICAgICAgICAgICAgICByZW1vdmVSdW5EZXBlbmRlbmN5KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhZGRSdW5EZXBlbmRlbmN5KCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKG91dHB1dCkgewogICAgICAgICAgICAgICAgICAgIHJlY2VpdmVJbnN0YW5jZShvdXRwdXRbImluc3RhbmNlIl0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCaW5hcnlQcm9taXNlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGJpbmFyeSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoYmluYXJ5LCBpbmZvKTsKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZWNlaXZlciwgZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgICAgICAgICAgICBlcnIoImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIgKyByZWFzb24pOwogICAgICAgICAgICAgICAgICAgICAgICBhYm9ydChyZWFzb24pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaW5zdGFudGlhdGVBc3luYygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdhc21CaW5hcnkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nID09PSAiZnVuY3Rpb24iICYmCiAgICAgICAgICAgICAgICAgICAgICAgICFpc0RhdGFVUkkod2FzbUJpbmFyeUZpbGUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICFpc0ZpbGVVUkkod2FzbUJpbmFyeUZpbGUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBmZXRjaCA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUsIHsgY3JlZGVudGlhbHM6ICJzYW1lLW9yaWdpbiIgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhyZXNwb25zZSwgaW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4ocmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZSwgZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycigid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICIgKyByZWFzb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycigiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbImluc3RhbnRpYXRlV2FzbSJdKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4cG9ydHMgPSBNb2R1bGVbImluc3RhbnRpYXRlV2FzbSJdKGluZm8sIHJlY2VpdmVJbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleHBvcnRzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlcnIoIk1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6ICIgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlQXN5bmMoKS5jYXRjaChyZWFkeVByb21pc2VSZWplY3QpOwogICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGNhbGxSdW50aW1lQ2FsbGJhY2tzKGNhbGxiYWNrcykgewogICAgICAgICAgICAgICAgd2hpbGUgKGNhbGxiYWNrcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKE1vZHVsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGNhbGxiYWNrLmZ1bmM7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmdW5jID09PSAibnVtYmVyIikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2suYXJnID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhc21UYWJsZS5nZXQoZnVuYykoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhc21UYWJsZS5nZXQoZnVuYykoY2FsbGJhY2suYXJnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyhjYWxsYmFjay5hcmcgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjay5hcmcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfYWJvcnQoKSB7CiAgICAgICAgICAgICAgICBhYm9ydCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfZW1zY3JpcHRlbl9nZXRfbm93OwogICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkgewogICAgICAgICAgICAgICAgX2Vtc2NyaXB0ZW5fZ2V0X25vdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHByb2Nlc3NbImhydGltZSJdKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbMF0gKiAxZTMgKyB0WzFdIC8gMWU2OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZGF0ZU5vdyAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIF9lbXNjcmlwdGVuX2dldF9ub3cgPSBkYXRlTm93OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIF9lbXNjcmlwdGVuX2dldF9ub3cgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIF9lbXNjcmlwdGVuX2dldF9ub3dfaXNfbW9ub3RvbmljID0gdHJ1ZTsKICAgICAgICAgICAgZnVuY3Rpb24gc2V0RXJyTm8odmFsdWUpIHsKICAgICAgICAgICAgICAgIEhFQVAzMltfX19lcnJub19sb2NhdGlvbigpID4+IDJdID0gdmFsdWU7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Nsb2NrX2dldHRpbWUoY2xrX2lkLCB0cCkgewogICAgICAgICAgICAgICAgdmFyIG5vdzsKICAgICAgICAgICAgICAgIGlmIChjbGtfaWQgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBub3cgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoKGNsa19pZCA9PT0gMSB8fCBjbGtfaWQgPT09IDQpICYmIF9lbXNjcmlwdGVuX2dldF9ub3dfaXNfbW9ub3RvbmljKSB7CiAgICAgICAgICAgICAgICAgICAgbm93ID0gX2Vtc2NyaXB0ZW5fZ2V0X25vdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2V0RXJyTm8oMjgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEhFQVAzMlt0cCA+PiAyXSA9IChub3cgLyAxZTMpIHwgMDsKICAgICAgICAgICAgICAgIEhFQVAzMlsodHAgKyA0KSA+PiAyXSA9ICgobm93ICUgMWUzKSAqIDFlMyAqIDFlMykgfCAwOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Rsb3BlbihmaWxlbmFtZSwgZmxhZykgewogICAgICAgICAgICAgICAgYWJvcnQoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9kbHN5bShoYW5kbGUsIHN5bWJvbCkgewogICAgICAgICAgICAgICAgYWJvcnQoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbXNjcmlwdGVuX21lbWNweV9iaWcoZGVzdCwgc3JjLCBudW0pIHsKICAgICAgICAgICAgICAgIEhFQVBVOC5jb3B5V2l0aGluKGRlc3QsIHNyYywgc3JjICsgbnVtKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZW1zY3JpcHRlbl9nZXRfaGVhcF9zaXplKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEhFQVBVOC5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZW1zY3JpcHRlbl9yZWFsbG9jX2J1ZmZlcihzaXplKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHdhc21NZW1vcnkuZ3Jvdygoc2l6ZSAtIGJ1ZmZlci5ieXRlTGVuZ3RoICsgNjU1MzUpID4+PiAxNik7CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwKHJlcXVlc3RlZFNpemUpIHsKICAgICAgICAgICAgICAgIHZhciBvbGRTaXplID0gX2Vtc2NyaXB0ZW5fZ2V0X2hlYXBfc2l6ZSgpOwogICAgICAgICAgICAgICAgdmFyIG1heEhlYXBTaXplID0gMjE0NzQ4MzY0ODsKICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWRTaXplID4gbWF4SGVhcFNpemUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKHZhciBjdXREb3duID0gMTsgY3V0RG93biA8PSA0OyBjdXREb3duICo9IDIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb3Zlckdyb3duSGVhcFNpemUgPSBvbGRTaXplICogKDEgKyAwLjIgLyBjdXREb3duKTsKICAgICAgICAgICAgICAgICAgICBvdmVyR3Jvd25IZWFwU2l6ZSA9IE1hdGgubWluKG92ZXJHcm93bkhlYXBTaXplLCByZXF1ZXN0ZWRTaXplICsgMTAwNjYzMjk2KTsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3U2l6ZSA9IE1hdGgubWluKG1heEhlYXBTaXplLCBhbGlnblVwKE1hdGgubWF4KHJlcXVlc3RlZFNpemUsIG92ZXJHcm93bkhlYXBTaXplKSwgNjU1MzYpKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBlbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyKG5ld1NpemUpOwogICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fdGhyZWFkX3NsZWVwKG1zZWNzKSB7CiAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBfZW1zY3JpcHRlbl9nZXRfbm93KCk7CiAgICAgICAgICAgICAgICB3aGlsZSAoX2Vtc2NyaXB0ZW5fZ2V0X25vdygpIC0gc3RhcnQgPCBtc2VjcykgeyB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIEVOViA9IHt9OwogICAgICAgICAgICBmdW5jdGlvbiBnZXRFeGVjdXRhYmxlTmFtZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzUHJvZ3JhbSB8fCAiLi90aGlzLnByb2dyYW0iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEVudlN0cmluZ3MoKSB7CiAgICAgICAgICAgICAgICBpZiAoIWdldEVudlN0cmluZ3Muc3RyaW5ncykgewogICAgICAgICAgICAgICAgICAgIHZhciBsYW5nID0gKCh0eXBlb2YgbmF2aWdhdG9yID09PSAib2JqZWN0IiAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzICYmIG5hdmlnYXRvci5sYW5ndWFnZXNbMF0pIHx8ICJDIikucmVwbGFjZSgiLSIsICJfIikgKyAiLlVURi04IjsKICAgICAgICAgICAgICAgICAgICB2YXIgZW52ID0gewogICAgICAgICAgICAgICAgICAgICAgICBVU0VSOiAid2ViX3VzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBMT0dOQU1FOiAid2ViX3VzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBQQVRIOiAiLyIsCiAgICAgICAgICAgICAgICAgICAgICAgIFBXRDogIi8iLAogICAgICAgICAgICAgICAgICAgICAgICBIT01FOiAiL2hvbWUvd2ViX3VzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBMQU5HOiBsYW5nLAogICAgICAgICAgICAgICAgICAgICAgICBfOiBnZXRFeGVjdXRhYmxlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeCBpbiBFTlYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW52W3hdID0gRU5WW3hdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgc3RyaW5ncyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHggaW4gZW52KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MucHVzaCh4ICsgIj0iICsgZW52W3hdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0RW52U3RyaW5ncy5zdHJpbmdzID0gc3RyaW5nczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBnZXRFbnZTdHJpbmdzLnN0cmluZ3M7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIFNZU0NBTExTID0gewogICAgICAgICAgICAgICAgbWFwcGluZ3M6IHt9LAogICAgICAgICAgICAgICAgYnVmZmVyczogW251bGwsIFtdLCBbXV0sCiAgICAgICAgICAgICAgICBwcmludENoYXI6IGZ1bmN0aW9uIChzdHJlYW0sIGN1cnIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gU1lTQ0FMTFMuYnVmZmVyc1tzdHJlYW1dOwogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyID09PSAwIHx8IGN1cnIgPT09IDEwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIChzdHJlYW0gPT09IDEgPyBvdXQgOiBlcnIpKFVURjhBcnJheVRvU3RyaW5nKGJ1ZmZlciwgMCkpOwogICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGN1cnIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB2YXJhcmdzOiB1bmRlZmluZWQsCiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBTWVNDQUxMUy52YXJhcmdzICs9IDQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IEhFQVAzMlsoU1lTQ0FMTFMudmFyYXJncyAtIDQpID4+IDJdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0U3RyOiBmdW5jdGlvbiAocHRyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IFVURjhUb1N0cmluZyhwdHIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0NjQ6IGZ1bmN0aW9uIChsb3csIGhpZ2gpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG93OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZnVuY3Rpb24gX2Vudmlyb25fZ2V0KF9fZW52aXJvbiwgZW52aXJvbl9idWYpIHsKICAgICAgICAgICAgICAgIHZhciBidWZTaXplID0gMDsKICAgICAgICAgICAgICAgIGdldEVudlN0cmluZ3MoKS5mb3JFYWNoKGZ1bmN0aW9uIChzdHJpbmcsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHRyID0gZW52aXJvbl9idWYgKyBidWZTaXplOwogICAgICAgICAgICAgICAgICAgIEhFQVAzMlsoX19lbnZpcm9uICsgaSAqIDQpID4+IDJdID0gcHRyOwogICAgICAgICAgICAgICAgICAgIHdyaXRlQXNjaWlUb01lbW9yeShzdHJpbmcsIHB0cik7CiAgICAgICAgICAgICAgICAgICAgYnVmU2l6ZSArPSBzdHJpbmcubGVuZ3RoICsgMTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vudmlyb25fc2l6ZXNfZ2V0KHBlbnZpcm9uX2NvdW50LCBwZW52aXJvbl9idWZfc2l6ZSkgewogICAgICAgICAgICAgICAgdmFyIHN0cmluZ3MgPSBnZXRFbnZTdHJpbmdzKCk7CiAgICAgICAgICAgICAgICBIRUFQMzJbcGVudmlyb25fY291bnQgPj4gMl0gPSBzdHJpbmdzLmxlbmd0aDsKICAgICAgICAgICAgICAgIHZhciBidWZTaXplID0gMDsKICAgICAgICAgICAgICAgIHN0cmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoc3RyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgYnVmU2l6ZSArPSBzdHJpbmcubGVuZ3RoICsgMTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgSEVBUDMyW3BlbnZpcm9uX2J1Zl9zaXplID4+IDJdID0gYnVmU2l6ZTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9leGl0KHN0YXR1cykgewogICAgICAgICAgICAgICAgZXhpdChzdGF0dXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9mZF9jbG9zZShmZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2ZkX3NlZWsoZmQsIG9mZnNldF9sb3csIG9mZnNldF9oaWdoLCB3aGVuY2UsIG5ld09mZnNldCkgeyB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9mZF93cml0ZShmZCwgaW92LCBpb3ZjbnQsIHBudW0pIHsKICAgICAgICAgICAgICAgIHZhciBudW0gPSAwOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpb3ZjbnQ7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBwdHIgPSBIRUFQMzJbKGlvdiArIGkgKiA4KSA+PiAyXTsKICAgICAgICAgICAgICAgICAgICB2YXIgbGVuID0gSEVBUDMyWyhpb3YgKyAoaSAqIDggKyA0KSkgPj4gMl07CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW47IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICBTWVNDQUxMUy5wcmludENoYXIoZmQsIEhFQVBVOFtwdHIgKyBqXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG51bSArPSBsZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBIRUFQMzJbcG51bSA+PiAyXSA9IG51bTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9wdGhyZWFkX2NyZWF0ZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiA2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9wdGhyZWFkX2pvaW4oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMjg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX3N5c2NvbmYobmFtZSkgewogICAgICAgICAgICAgICAgc3dpdGNoIChuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE2Mzg0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgODU6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXhIZWFwU2l6ZSA9IDIxNDc0ODM2NDg7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXhIZWFwU2l6ZSAvIDE2Mzg0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIzNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjM2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTUzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDc3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDY4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDI5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDk1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNTI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ2OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjAwODA5OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTYwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTYxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTg0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTY1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDk3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDM1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgODA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDc5OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyNjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDkyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDkxOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDc0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDcwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEwMjQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzMjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIxNDc0ODM2NDc7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA0NzgzOTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzY6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA5OTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMDQ4OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIwOTcxNTI7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjU1MzY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyODoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMyNzY4OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzMjc2NzsKICAgICAgICAgICAgICAgICAgICBjYXNlIDc1OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTYzODQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDFlMzsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg5OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzAwOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNzE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyNTY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI1NTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMDA7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA2NDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjA7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDczOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAib2JqZWN0IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXZpZ2F0b3JbImhhcmR3YXJlQ29uY3VycmVuY3kiXSB8fCAxOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZXRFcnJObygyOCk7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGFzbUxpYnJhcnlBcmcgPSB7CiAgICAgICAgICAgICAgICBhOiBfYWJvcnQsCiAgICAgICAgICAgICAgICBuOiBfY2xvY2tfZ2V0dGltZSwKICAgICAgICAgICAgICAgIGk6IF9kbG9wZW4sCiAgICAgICAgICAgICAgICBlOiBfZGxzeW0sCiAgICAgICAgICAgICAgICBsOiBfZW1zY3JpcHRlbl9tZW1jcHlfYmlnLAogICAgICAgICAgICAgICAgbTogX2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAsCiAgICAgICAgICAgICAgICBvOiBfZW1zY3JpcHRlbl90aHJlYWRfc2xlZXAsCiAgICAgICAgICAgICAgICBwOiBfZW52aXJvbl9nZXQsCiAgICAgICAgICAgICAgICBnOiBfZW52aXJvbl9zaXplc19nZXQsCiAgICAgICAgICAgICAgICBqOiBfZXhpdCwKICAgICAgICAgICAgICAgIGg6IF9mZF9jbG9zZSwKICAgICAgICAgICAgICAgIGs6IF9mZF9zZWVrLAogICAgICAgICAgICAgICAgYzogX2ZkX3dyaXRlLAogICAgICAgICAgICAgICAgZDogX3B0aHJlYWRfY3JlYXRlLAogICAgICAgICAgICAgICAgZjogX3B0aHJlYWRfam9pbiwKICAgICAgICAgICAgICAgIGI6IF9zeXNjb25mLAogICAgICAgICAgICB9OwogICAgICAgICAgICBjcmVhdGVXYXNtKCk7CiAgICAgICAgICAgIHZhciBfX193YXNtX2NhbGxfY3RvcnMgPSAoTW9kdWxlWyJfX193YXNtX2NhbGxfY3RvcnMiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoX19fd2FzbV9jYWxsX2N0b3JzID0gTW9kdWxlWyJfX193YXNtX2NhbGxfY3RvcnMiXSA9IE1vZHVsZVsiYXNtIl1bInIiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldCJdID0gTW9kdWxlWyJhc20iXVsicyJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldElucHV0TWVtb3J5T2Zmc2V0Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldElucHV0TWVtb3J5T2Zmc2V0Il0gPSBNb2R1bGVbImFzbSJdWyJ0Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0SW5wdXRIZWlnaHQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0SW5wdXRIZWlnaHQiXSA9IE1vZHVsZVsiYXNtIl1bInUiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRJbnB1dFdpZHRoIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldElucHV0V2lkdGgiXSA9IE1vZHVsZVsiYXNtIl1bInYiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRJbnB1dENoYW5uZWxDb3VudCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRJbnB1dENoYW5uZWxDb3VudCJdID0gTW9kdWxlWyJhc20iXVsidyJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldE91dHB1dE1lbW9yeU9mZnNldCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRPdXRwdXRNZW1vcnlPZmZzZXQiXSA9IE1vZHVsZVsiYXNtIl1bIngiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRPdXRwdXRIZWlnaHQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0SGVpZ2h0Il0gPSBNb2R1bGVbImFzbSJdWyJ5Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0T3V0cHV0V2lkdGgiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0V2lkdGgiXSA9IE1vZHVsZVsiYXNtIl1bInoiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRPdXRwdXRDaGFubmVsQ291bnQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0Q2hhbm5lbENvdW50Il0gPSBNb2R1bGVbImFzbSJdWyJBIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfbG9hZE1vZGVsIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2xvYWRNb2RlbCJdID0gTW9kdWxlWyJhc20iXVsiQiJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX3J1bkluZmVyZW5jZSJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9ydW5JbmZlcmVuY2UiXSA9IE1vZHVsZVsiYXNtIl1bIkMiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBfX19lcnJub19sb2NhdGlvbiA9IChNb2R1bGVbIl9fX2Vycm5vX2xvY2F0aW9uIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKF9fX2Vycm5vX2xvY2F0aW9uID0gTW9kdWxlWyJfX19lcnJub19sb2NhdGlvbiJdID0gTW9kdWxlWyJhc20iXVsiRSJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIGNhbGxlZFJ1bjsKICAgICAgICAgICAgZnVuY3Rpb24gRXhpdFN0YXR1cyhzdGF0dXMpIHsKICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9ICJFeGl0U3RhdHVzIjsKICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9ICJQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCIgKyBzdGF0dXMgKyAiKSI7CiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBmdW5jdGlvbiBydW5DYWxsZXIoKSB7CiAgICAgICAgICAgICAgICBpZiAoIWNhbGxlZFJ1bikKICAgICAgICAgICAgICAgICAgICBydW4oKTsKICAgICAgICAgICAgICAgIGlmICghY2FsbGVkUnVuKQogICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IHJ1bkNhbGxlcjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZnVuY3Rpb24gcnVuKGFyZ3MpIHsKICAgICAgICAgICAgICAgIGlmIChydW5EZXBlbmRlbmNpZXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHJlUnVuKCk7CiAgICAgICAgICAgICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID4gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRvUnVuKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsZWRSdW4pCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBjYWxsZWRSdW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsiY2FsbGVkUnVuIl0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGlmIChBQk9SVCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGluaXRSdW50aW1lKCk7CiAgICAgICAgICAgICAgICAgICAgcHJlTWFpbigpOwogICAgICAgICAgICAgICAgICAgIHJlYWR5UHJvbWlzZVJlc29sdmUoTW9kdWxlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJvblJ1bnRpbWVJbml0aWFsaXplZCJdKQogICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVbIm9uUnVudGltZUluaXRpYWxpemVkIl0oKTsKICAgICAgICAgICAgICAgICAgICBwb3N0UnVuKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJzZXRTdGF0dXMiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsic2V0U3RhdHVzIl0oIlJ1bm5pbmcuLi4iKTsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInNldFN0YXR1cyJdKCIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvUnVuKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBkb1J1bigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIE1vZHVsZVsicnVuIl0gPSBydW47CiAgICAgICAgICAgIGZ1bmN0aW9uIGV4aXQoc3RhdHVzLCBpbXBsaWNpdCkgewogICAgICAgICAgICAgICAgcXVpdF8oc3RhdHVzLCBuZXcgRXhpdFN0YXR1cyhzdGF0dXMpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoTW9kdWxlWyJwcmVJbml0Il0pIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwcmVJbml0Il0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInByZUluaXQiXSA9IFtNb2R1bGVbInByZUluaXQiXV07CiAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwcmVJbml0Il0ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsicHJlSW5pdCJdLnBvcCgpKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcnVuKCk7CiAgICAgICAgICAgIHJldHVybiBjcmVhdGVURkxpdGVTSU1ETW9kdWxlLnJlYWR5OwogICAgICAgIH07CiAgICB9KSgpOwoKICAgIHZhciB0ZmxpdGVTaW1kID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoewogICAgICAgIF9fcHJvdG9fXzogbnVsbCwKICAgICAgICBkZWZhdWx0OiBjcmVhdGVURkxpdGVTSU1ETW9kdWxlCiAgICB9KTsKCiAgICB2YXIgY3JlYXRlVEZMaXRlTW9kdWxlID0gKGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX3NjcmlwdERpciA9IHR5cGVvZiBkb2N1bWVudCAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdCA/IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjIDogdW5kZWZpbmVkOwogICAgICAgIGlmICh0eXBlb2YgX19maWxlbmFtZSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIF9zY3JpcHREaXIgPSBfc2NyaXB0RGlyIHx8IF9fZmlsZW5hbWU7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjcmVhdGVURkxpdGVNb2R1bGUpIHsKICAgICAgICAgICAgY3JlYXRlVEZMaXRlTW9kdWxlID0gY3JlYXRlVEZMaXRlTW9kdWxlIHx8IHt9OwogICAgICAgICAgICB2YXIgTW9kdWxlID0gdHlwZW9mIGNyZWF0ZVRGTGl0ZU1vZHVsZSAhPT0gInVuZGVmaW5lZCIgPyBjcmVhdGVURkxpdGVNb2R1bGUgOiB7fTsKICAgICAgICAgICAgdmFyIHJlYWR5UHJvbWlzZVJlc29sdmUsIHJlYWR5UHJvbWlzZVJlamVjdDsKICAgICAgICAgICAgTW9kdWxlWyJyZWFkeSJdID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgcmVhZHlQcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7CiAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZWplY3QgPSByZWplY3Q7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgbW9kdWxlT3ZlcnJpZGVzID0ge307CiAgICAgICAgICAgIHZhciBrZXk7CiAgICAgICAgICAgIGZvciAoa2V5IGluIE1vZHVsZSkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgbW9kdWxlT3ZlcnJpZGVzW2tleV0gPSBNb2R1bGVba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdGhpc1Byb2dyYW0gPSAiLi90aGlzLnByb2dyYW0iOwogICAgICAgICAgICB2YXIgcXVpdF8gPSBmdW5jdGlvbiAoc3RhdHVzLCB0b1Rocm93KSB7CiAgICAgICAgICAgICAgICB0aHJvdyB0b1Rocm93OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgRU5WSVJPTk1FTlRfSVNfV0VCID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBFTlZJUk9OTUVOVF9JU19XT1JLRVIgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX05PREUgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX1NIRUxMID0gZmFsc2U7CiAgICAgICAgICAgIEVOVklST05NRU5UX0lTX1dFQiA9IHR5cGVvZiB3aW5kb3cgPT09ICJvYmplY3QiOwogICAgICAgICAgICBFTlZJUk9OTUVOVF9JU19XT1JLRVIgPSB0eXBlb2YgaW1wb3J0U2NyaXB0cyA9PT0gImZ1bmN0aW9uIjsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfTk9ERSA9CiAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2VzcyA9PT0gIm9iamVjdCIgJiYKICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucyA9PT0gIm9iamVjdCIgJiYKICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlID09PSAic3RyaW5nIjsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfU0hFTEwgPSAhRU5WSVJPTk1FTlRfSVNfV0VCICYmICFFTlZJUk9OTUVOVF9JU19OT0RFICYmICFFTlZJUk9OTUVOVF9JU19XT1JLRVI7CiAgICAgICAgICAgIHZhciBzY3JpcHREaXJlY3RvcnkgPSAiIjsKICAgICAgICAgICAgZnVuY3Rpb24gbG9jYXRlRmlsZShwYXRoKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJsb2NhdGVGaWxlIl0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTW9kdWxlWyJsb2NhdGVGaWxlIl0ocGF0aCwgc2NyaXB0RGlyZWN0b3J5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBzY3JpcHREaXJlY3RvcnkgKyBwYXRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciByZWFkXywgcmVhZEFzeW5jLCByZWFkQmluYXJ5OwogICAgICAgICAgICB2YXIgbm9kZUZTOwogICAgICAgICAgICB2YXIgbm9kZVBhdGg7CiAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19OT0RFKSB7CiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gcmVxdWlyZSgicGF0aCIpLmRpcm5hbWUoc2NyaXB0RGlyZWN0b3J5KSArICIvIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IF9fZGlybmFtZSArICIvIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gc2hlbGxfcmVhZChmaWxlbmFtZSwgYmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlRlMpCiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVGUyA9IHJlcXVpcmUoImZzIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlUGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVBhdGggPSByZXF1aXJlKCJwYXRoIik7CiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBub2RlUGF0aFsibm9ybWFsaXplIl0oZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlRlNbInJlYWRGaWxlU3luYyJdKGZpbGVuYW1lLCBiaW5hcnkgPyBudWxsIDogInV0ZjgiKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gcmVhZEJpbmFyeShmaWxlbmFtZSkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSByZWFkXyhmaWxlbmFtZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXQuYnVmZmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBVaW50OEFycmF5KHJldCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzWyJhcmd2Il0ubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICAgIHRoaXNQcm9ncmFtID0gcHJvY2Vzc1siYXJndiJdWzFdLnJlcGxhY2UoL1xcL2csICIvIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJhcmd2Il0uc2xpY2UoMik7CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJvbiJdKCJ1bmNhdWdodEV4Y2VwdGlvbiIsIGZ1bmN0aW9uIChleCkgewogICAgICAgICAgICAgICAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgRXhpdFN0YXR1cykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJvbiJdKCJ1bmhhbmRsZWRSZWplY3Rpb24iLCBhYm9ydCk7CiAgICAgICAgICAgICAgICBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICBwcm9jZXNzWyJleGl0Il0oc3RhdHVzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBNb2R1bGVbImluc3BlY3QiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdIjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoRU5WSVJPTk1FTlRfSVNfU0hFTEwpIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVhZCAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gc2hlbGxfcmVhZChmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkKGYpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gcmVhZEJpbmFyeShmKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGE7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZWFkYnVmZmVyID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShyZWFkYnVmZmVyKGYpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlYWQoZiwgImJpbmFyeSIpOwogICAgICAgICAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgZGF0YSA9PT0gIm9iamVjdCIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2NyaXB0QXJncyAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdEFyZ3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHF1aXQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcXVpdChzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHByaW50ICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyA9IHByaW50OwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiA9IGNvbnNvbGUuZXJyb3IgPSB0eXBlb2YgcHJpbnRFcnIgIT09ICJ1bmRlZmluZWQiID8gcHJpbnRFcnIgOiBwcmludDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChFTlZJUk9OTUVOVF9JU19XRUIgfHwgRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gc2VsZi5sb2NhdGlvbi5ocmVmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0KSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoX3NjcmlwdERpcikgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IF9zY3JpcHREaXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2NyaXB0RGlyZWN0b3J5LmluZGV4T2YoImJsb2I6IikgIT09IDApIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBzY3JpcHREaXJlY3Rvcnkuc3Vic3RyKDAsIHNjcmlwdERpcmVjdG9yeS5sYXN0SW5kZXhPZigiLyIpICsgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZWFkXyA9IGZ1bmN0aW9uICh1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub3BlbigiR0VUIiwgdXJsLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5zZW5kKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGhyLnJlc3BvbnNlVGV4dDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEJpbmFyeSA9IGZ1bmN0aW9uICh1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5vcGVuKCJHRVQiLCB1cmwsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnNlbmQobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeGhyLnJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVhZEFzeW5jID0gZnVuY3Rpb24gKHVybCwgb25sb2FkLCBvbmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwIHx8ICh4aHIuc3RhdHVzID09IDAgJiYgeGhyLnJlc3BvbnNlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubG9hZCh4aHIucmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9uZXJyb3IgPSBvbmVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIuc2VuZChudWxsKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgOwogICAgICAgICAgICB2YXIgb3V0ID0gTW9kdWxlWyJwcmludCJdIHx8IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7CiAgICAgICAgICAgIHZhciBlcnIgPSBNb2R1bGVbInByaW50RXJyIl0gfHwgY29uc29sZS53YXJuLmJpbmQoY29uc29sZSk7CiAgICAgICAgICAgIGZvciAoa2V5IGluIG1vZHVsZU92ZXJyaWRlcykgewogICAgICAgICAgICAgICAgaWYgKG1vZHVsZU92ZXJyaWRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlW2tleV0gPSBtb2R1bGVPdmVycmlkZXNba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBtb2R1bGVPdmVycmlkZXMgPSBudWxsOwogICAgICAgICAgICBpZiAoTW9kdWxlWyJhcmd1bWVudHMiXSkKICAgICAgICAgICAgICAgIE1vZHVsZVsiYXJndW1lbnRzIl07CiAgICAgICAgICAgIGlmIChNb2R1bGVbInRoaXNQcm9ncmFtIl0pCiAgICAgICAgICAgICAgICB0aGlzUHJvZ3JhbSA9IE1vZHVsZVsidGhpc1Byb2dyYW0iXTsKICAgICAgICAgICAgaWYgKE1vZHVsZVsicXVpdCJdKQogICAgICAgICAgICAgICAgcXVpdF8gPSBNb2R1bGVbInF1aXQiXTsKICAgICAgICAgICAgdmFyIHdhc21CaW5hcnk7CiAgICAgICAgICAgIGlmIChNb2R1bGVbIndhc21CaW5hcnkiXSkKICAgICAgICAgICAgICAgIHdhc21CaW5hcnkgPSBNb2R1bGVbIndhc21CaW5hcnkiXTsKICAgICAgICAgICAgTW9kdWxlWyJub0V4aXRSdW50aW1lIl0gfHwgdHJ1ZTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBXZWJBc3NlbWJseSAhPT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgICAgIGFib3J0KCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHdhc21NZW1vcnk7CiAgICAgICAgICAgIHZhciBBQk9SVCA9IGZhbHNlOwogICAgICAgICAgICBmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLCB0ZXh0KSB7CiAgICAgICAgICAgICAgICBpZiAoIWNvbmRpdGlvbikgewogICAgICAgICAgICAgICAgICAgIGFib3J0KCJBc3NlcnRpb24gZmFpbGVkOiAiICsgdGV4dCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIFVURjhEZWNvZGVyID0gdHlwZW9mIFRleHREZWNvZGVyICE9PSAidW5kZWZpbmVkIiA/IG5ldyBUZXh0RGVjb2RlcigidXRmOCIpIDogdW5kZWZpbmVkOwogICAgICAgICAgICBmdW5jdGlvbiBVVEY4QXJyYXlUb1N0cmluZyhoZWFwLCBpZHgsIG1heEJ5dGVzVG9SZWFkKSB7CiAgICAgICAgICAgICAgICB2YXIgZW5kSWR4ID0gaWR4ICsgbWF4Qnl0ZXNUb1JlYWQ7CiAgICAgICAgICAgICAgICB2YXIgZW5kUHRyID0gaWR4OwogICAgICAgICAgICAgICAgd2hpbGUgKGhlYXBbZW5kUHRyXSAmJiAhKGVuZFB0ciA+PSBlbmRJZHgpKQogICAgICAgICAgICAgICAgICAgICsrZW5kUHRyOwogICAgICAgICAgICAgICAgaWYgKGVuZFB0ciAtIGlkeCA+IDE2ICYmIGhlYXAuc3ViYXJyYXkgJiYgVVRGOERlY29kZXIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVVRGOERlY29kZXIuZGVjb2RlKGhlYXAuc3ViYXJyYXkoaWR4LCBlbmRQdHIpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBzdHIgPSAiIjsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaWR4IDwgZW5kUHRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MCA9IGhlYXBbaWR4KytdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh1MCAmIDEyOCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHUwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MSA9IGhlYXBbaWR4KytdICYgNjM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodTAgJiAyMjQpID09IDE5MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKCh1MCAmIDMxKSA8PCA2KSB8IHUxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MiA9IGhlYXBbaWR4KytdICYgNjM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodTAgJiAyNDApID09IDIyNCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTAgPSAoKHUwICYgMTUpIDw8IDEyKSB8ICh1MSA8PCA2KSB8IHUyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTAgPSAoKHUwICYgNykgPDwgMTgpIHwgKHUxIDw8IDEyKSB8ICh1MiA8PCA2KSB8IChoZWFwW2lkeCsrXSAmIDYzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodTAgPCA2NTUzNikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoID0gdTAgLSA2NTUzNjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2IHwgKGNoID4+IDEwKSwgNTYzMjAgfCAoY2ggJiAxMDIzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIFVURjhUb1N0cmluZyhwdHIsIG1heEJ5dGVzVG9SZWFkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcHRyID8gVVRGOEFycmF5VG9TdHJpbmcoSEVBUFU4LCBwdHIsIG1heEJ5dGVzVG9SZWFkKSA6ICIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHdyaXRlQXNjaWlUb01lbW9yeShzdHIsIGJ1ZmZlciwgZG9udEFkZE51bGwpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgSEVBUDhbYnVmZmVyKysgPj4gMF0gPSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEhFQVA4W2J1ZmZlciA+PiAwXSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gYWxpZ25VcCh4LCBtdWx0aXBsZSkgewogICAgICAgICAgICAgICAgaWYgKHggJSBtdWx0aXBsZSA+IDApIHsKICAgICAgICAgICAgICAgICAgICB4ICs9IG11bHRpcGxlIC0gKHggJSBtdWx0aXBsZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgYnVmZmVyLCBIRUFQOCwgSEVBUFU4LCBIRUFQMzI7CiAgICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKGJ1ZikgewogICAgICAgICAgICAgICAgYnVmZmVyID0gYnVmOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQOCJdID0gSEVBUDggPSBuZXcgSW50OEFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVAxNiJdID0gbmV3IEludDE2QXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUDMyIl0gPSBIRUFQMzIgPSBuZXcgSW50MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQVTgiXSA9IEhFQVBVOCA9IG5ldyBVaW50OEFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBVMTYiXSA9IG5ldyBVaW50MTZBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQVTMyIl0gPSBuZXcgVWludDMyQXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUEYzMiJdID0gbmV3IEZsb2F0MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQRjY0Il0gPSBuZXcgRmxvYXQ2NEFycmF5KGJ1Zik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTW9kdWxlWyJJTklUSUFMX01FTU9SWSJdIHx8IDE2Nzc3MjE2OwogICAgICAgICAgICB2YXIgd2FzbVRhYmxlOwogICAgICAgICAgICB2YXIgX19BVFBSRVJVTl9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUSU5JVF9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUTUFJTl9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUUE9TVFJVTl9fID0gW107CiAgICAgICAgICAgIF9fQVRJTklUX18ucHVzaCh7CiAgICAgICAgICAgICAgICBmdW5jOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgX19fd2FzbV9jYWxsX2N0b3JzKCk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZnVuY3Rpb24gcHJlUnVuKCkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsicHJlUnVuIl0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicHJlUnVuIl0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJwcmVSdW4iXSA9IFtNb2R1bGVbInByZVJ1biJdXTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwcmVSdW4iXS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkT25QcmVSdW4oTW9kdWxlWyJwcmVSdW4iXS5zaGlmdCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUFJFUlVOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGluaXRSdW50aW1lKCkgewogICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVElOSVRfXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcHJlTWFpbigpIHsKICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRNQUlOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHBvc3RSdW4oKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJwb3N0UnVuIl0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicG9zdFJ1biJdID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZVsicG9zdFJ1biJdID0gW01vZHVsZVsicG9zdFJ1biJdXTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwb3N0UnVuIl0ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE9uUG9zdFJ1bihNb2R1bGVbInBvc3RSdW4iXS5zaGlmdCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUE9TVFJVTl9fKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBhZGRPblByZVJ1bihjYikgewogICAgICAgICAgICAgICAgX19BVFBSRVJVTl9fLnVuc2hpZnQoY2IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZE9uUG9zdFJ1bihjYikgewogICAgICAgICAgICAgICAgX19BVFBPU1RSVU5fXy51bnNoaWZ0KGNiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcnVuRGVwZW5kZW5jaWVzID0gMDsKICAgICAgICAgICAgdmFyIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IG51bGw7CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZFJ1bkRlcGVuZGVuY3koaWQpIHsKICAgICAgICAgICAgICAgIHJ1bkRlcGVuZGVuY2llcysrOwogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0ocnVuRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiByZW1vdmVSdW5EZXBlbmRlbmN5KGlkKSB7CiAgICAgICAgICAgICAgICBydW5EZXBlbmRlbmNpZXMtLTsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKHJ1bkRlcGVuZGVuY2llcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID09IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzRnVsZmlsbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGRlcGVuZGVuY2llc0Z1bGZpbGxlZDsKICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTW9kdWxlWyJwcmVsb2FkZWRJbWFnZXMiXSA9IHt9OwogICAgICAgICAgICBNb2R1bGVbInByZWxvYWRlZEF1ZGlvcyJdID0ge307CiAgICAgICAgICAgIGZ1bmN0aW9uIGFib3J0KHdoYXQpIHsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbIm9uQWJvcnQiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsib25BYm9ydCJdKHdoYXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hhdCArPSAiIjsKICAgICAgICAgICAgICAgIGVycih3aGF0KTsKICAgICAgICAgICAgICAgIEFCT1JUID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHdoYXQgPSAiYWJvcnQoIiArIHdoYXQgKyAiKS4gQnVpbGQgd2l0aCAtcyBBU1NFUlRJT05TPTEgZm9yIG1vcmUgaW5mby4iOwogICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKHdoYXQpOwogICAgICAgICAgICAgICAgcmVhZHlQcm9taXNlUmVqZWN0KGUpOwogICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBoYXNQcmVmaXgoc3RyLCBwcmVmaXgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGggPyBzdHIuc3RhcnRzV2l0aChwcmVmaXgpIDogc3RyLmluZGV4T2YocHJlZml4KSA9PT0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZGF0YVVSSVByZWZpeCA9ICJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIjsKICAgICAgICAgICAgZnVuY3Rpb24gaXNEYXRhVVJJKGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLCBkYXRhVVJJUHJlZml4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZmlsZVVSSVByZWZpeCA9ICJmaWxlOi8vIjsKICAgICAgICAgICAgZnVuY3Rpb24gaXNGaWxlVVJJKGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLCBmaWxlVVJJUHJlZml4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd2FzbUJpbmFyeUZpbGUgPSAidGZsaXRlLndhc20iOwogICAgICAgICAgICBpZiAoIWlzRGF0YVVSSSh3YXNtQmluYXJ5RmlsZSkpIHsKICAgICAgICAgICAgICAgIHdhc21CaW5hcnlGaWxlID0gbG9jYXRlRmlsZSh3YXNtQmluYXJ5RmlsZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZ2V0QmluYXJ5KGZpbGUpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUgPT0gd2FzbUJpbmFyeUZpbGUgJiYgd2FzbUJpbmFyeSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkod2FzbUJpbmFyeSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChyZWFkQmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkQmluYXJ5KGZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgYWJvcnQoZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBnZXRCaW5hcnlQcm9taXNlKCkgewogICAgICAgICAgICAgICAgaWYgKCF3YXNtQmluYXJ5ICYmIChFTlZJUk9OTUVOVF9JU19XRUIgfHwgRU5WSVJPTk1FTlRfSVNfV09SS0VSKSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmV0Y2ggPT09ICJmdW5jdGlvbiIgJiYgIWlzRmlsZVVSSSh3YXNtQmluYXJ5RmlsZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoKHdhc21CaW5hcnlGaWxlLCB7IGNyZWRlbnRpYWxzOiAic2FtZS1vcmlnaW4iIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2VbIm9rIl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAiZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCAnIiArIHdhc21CaW5hcnlGaWxlICsgIiciOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlWyJhcnJheUJ1ZmZlciJdKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJpbmFyeSh3YXNtQmluYXJ5RmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRBc3luYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQXN5bmMod2FzbUJpbmFyeUZpbGUsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBVaW50OEFycmF5KHJlc3BvbnNlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcmVqZWN0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCaW5hcnkod2FzbUJpbmFyeUZpbGUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gY3JlYXRlV2FzbSgpIHsKICAgICAgICAgICAgICAgIHZhciBpbmZvID0geyBhOiBhc21MaWJyYXJ5QXJnIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByZWNlaXZlSW5zdGFuY2UoaW5zdGFuY2UsIG1vZHVsZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBleHBvcnRzID0gaW5zdGFuY2UuZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbImFzbSJdID0gZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICB3YXNtTWVtb3J5ID0gTW9kdWxlWyJhc20iXVsicSJdOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKHdhc21NZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICB3YXNtVGFibGUgPSBNb2R1bGVbImFzbSJdWyJEIl07CiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUnVuRGVwZW5kZW5jeSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYWRkUnVuRGVwZW5kZW5jeSgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZShvdXRwdXQpIHsKICAgICAgICAgICAgICAgICAgICByZWNlaXZlSW5zdGFuY2Uob3V0cHV0WyJpbnN0YW5jZSJdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIocmVjZWl2ZXIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmluYXJ5UHJvbWlzZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChiaW5hcnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJpbmFyeSwgaW5mbyk7CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVjZWl2ZXIsIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyKCJmYWlsZWQgdG8gYXN5bmNocm9ub3VzbHkgcHJlcGFyZSB3YXNtOiAiICsgcmVhc29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQocmVhc29uKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGluc3RhbnRpYXRlQXN5bmMoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3YXNtQmluYXJ5ICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyA9PT0gImZ1bmN0aW9uIiAmJgogICAgICAgICAgICAgICAgICAgICAgICAhaXNEYXRhVVJJKHdhc21CaW5hcnlGaWxlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAhaXNGaWxlVVJJKHdhc21CaW5hcnlGaWxlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZmV0Y2ggPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoKHdhc21CaW5hcnlGaWxlLCB7IGNyZWRlbnRpYWxzOiAic2FtZS1vcmlnaW4iIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcocmVzcG9uc2UsIGluZm8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UsIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIoIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAiICsgcmVhc29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIocmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJpbnN0YW50aWF0ZVdhc20iXSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleHBvcnRzID0gTW9kdWxlWyJpbnN0YW50aWF0ZVdhc20iXShpbmZvLCByZWNlaXZlSW5zdGFuY2UpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyKCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZUFzeW5jKCkuY2F0Y2gocmVhZHlQcm9taXNlUmVqZWN0KTsKICAgICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBjYWxsUnVudGltZUNhbGxiYWNrcyhjYWxsYmFja3MpIHsKICAgICAgICAgICAgICAgIHdoaWxlIChjYWxsYmFja3MubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGNhbGxiYWNrcy5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhNb2R1bGUpOwogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmMgPSBjYWxsYmFjay5mdW5jOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuYyA9PT0gIm51bWJlciIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrLmFyZyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNtVGFibGUuZ2V0KGZ1bmMpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNtVGFibGUuZ2V0KGZ1bmMpKGNhbGxiYWNrLmFyZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMoY2FsbGJhY2suYXJnID09PSB1bmRlZmluZWQgPyBudWxsIDogY2FsbGJhY2suYXJnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Fib3J0KCkgewogICAgICAgICAgICAgICAgYWJvcnQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgX2Vtc2NyaXB0ZW5fZ2V0X25vdzsKICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHsKICAgICAgICAgICAgICAgIF9lbXNjcmlwdGVuX2dldF9ub3cgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBwcm9jZXNzWyJocnRpbWUiXSgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0WzBdICogMWUzICsgdFsxXSAvIDFlNjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRhdGVOb3cgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBfZW1zY3JpcHRlbl9nZXRfbm93ID0gZGF0ZU5vdzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBfZW1zY3JpcHRlbl9nZXRfbm93ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBfZW1zY3JpcHRlbl9nZXRfbm93X2lzX21vbm90b25pYyA9IHRydWU7CiAgICAgICAgICAgIGZ1bmN0aW9uIHNldEVyck5vKHZhbHVlKSB7CiAgICAgICAgICAgICAgICBIRUFQMzJbX19fZXJybm9fbG9jYXRpb24oKSA+PiAyXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9jbG9ja19nZXR0aW1lKGNsa19pZCwgdHApIHsKICAgICAgICAgICAgICAgIHZhciBub3c7CiAgICAgICAgICAgICAgICBpZiAoY2xrX2lkID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgbm93ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKChjbGtfaWQgPT09IDEgfHwgY2xrX2lkID09PSA0KSAmJiBfZW1zY3JpcHRlbl9nZXRfbm93X2lzX21vbm90b25pYykgewogICAgICAgICAgICAgICAgICAgIG5vdyA9IF9lbXNjcmlwdGVuX2dldF9ub3coKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNldEVyck5vKDI4KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBIRUFQMzJbdHAgPj4gMl0gPSAobm93IC8gMWUzKSB8IDA7CiAgICAgICAgICAgICAgICBIRUFQMzJbKHRwICsgNCkgPj4gMl0gPSAoKG5vdyAlIDFlMykgKiAxZTMgKiAxZTMpIHwgMDsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9kbG9wZW4oZmlsZW5hbWUsIGZsYWcpIHsKICAgICAgICAgICAgICAgIGFib3J0KCJUbyB1c2UgZGxvcGVuLCB5b3UgbmVlZCB0byB1c2UgRW1zY3JpcHRlbidzIGxpbmtpbmcgc3VwcG9ydCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbXNjcmlwdGVuLWNvcmUvZW1zY3JpcHRlbi93aWtpL0xpbmtpbmciKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZGxzeW0oaGFuZGxlLCBzeW1ib2wpIHsKICAgICAgICAgICAgICAgIGFib3J0KCJUbyB1c2UgZGxvcGVuLCB5b3UgbmVlZCB0byB1c2UgRW1zY3JpcHRlbidzIGxpbmtpbmcgc3VwcG9ydCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbXNjcmlwdGVuLWNvcmUvZW1zY3JpcHRlbi93aWtpL0xpbmtpbmciKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZW1zY3JpcHRlbl9tZW1jcHlfYmlnKGRlc3QsIHNyYywgbnVtKSB7CiAgICAgICAgICAgICAgICBIRUFQVTguY29weVdpdGhpbihkZXN0LCBzcmMsIHNyYyArIG51bSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fZ2V0X2hlYXBfc2l6ZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBIRUFQVTgubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGVtc2NyaXB0ZW5fcmVhbGxvY19idWZmZXIoc2l6ZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB3YXNtTWVtb3J5Lmdyb3coKHNpemUgLSBidWZmZXIuYnl0ZUxlbmd0aCArIDY1NTM1KSA+Pj4gMTYpOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKHdhc21NZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZW1zY3JpcHRlbl9yZXNpemVfaGVhcChyZXF1ZXN0ZWRTaXplKSB7CiAgICAgICAgICAgICAgICB2YXIgb2xkU2l6ZSA9IF9lbXNjcmlwdGVuX2dldF9oZWFwX3NpemUoKTsKICAgICAgICAgICAgICAgIHZhciBtYXhIZWFwU2l6ZSA9IDIxNDc0ODM2NDg7CiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdGVkU2l6ZSA+IG1heEhlYXBTaXplKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgY3V0RG93biA9IDE7IGN1dERvd24gPD0gNDsgY3V0RG93biAqPSAyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG92ZXJHcm93bkhlYXBTaXplID0gb2xkU2l6ZSAqICgxICsgMC4yIC8gY3V0RG93bik7CiAgICAgICAgICAgICAgICAgICAgb3Zlckdyb3duSGVhcFNpemUgPSBNYXRoLm1pbihvdmVyR3Jvd25IZWFwU2l6ZSwgcmVxdWVzdGVkU2l6ZSArIDEwMDY2MzI5Nik7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1NpemUgPSBNYXRoLm1pbihtYXhIZWFwU2l6ZSwgYWxpZ25VcChNYXRoLm1heChyZXF1ZXN0ZWRTaXplLCBvdmVyR3Jvd25IZWFwU2l6ZSksIDY1NTM2KSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gZW1zY3JpcHRlbl9yZWFsbG9jX2J1ZmZlcihuZXdTaXplKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbXNjcmlwdGVuX3RocmVhZF9zbGVlcChtc2VjcykgewogICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gX2Vtc2NyaXB0ZW5fZ2V0X25vdygpOwogICAgICAgICAgICAgICAgd2hpbGUgKF9lbXNjcmlwdGVuX2dldF9ub3coKSAtIHN0YXJ0IDwgbXNlY3MpIHsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBFTlYgPSB7fTsKICAgICAgICAgICAgZnVuY3Rpb24gZ2V0RXhlY3V0YWJsZU5hbWUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1Byb2dyYW0gfHwgIi4vdGhpcy5wcm9ncmFtIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBnZXRFbnZTdHJpbmdzKCkgewogICAgICAgICAgICAgICAgaWYgKCFnZXRFbnZTdHJpbmdzLnN0cmluZ3MpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbGFuZyA9ICgodHlwZW9mIG5hdmlnYXRvciA9PT0gIm9iamVjdCIgJiYgbmF2aWdhdG9yLmxhbmd1YWdlcyAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdKSB8fCAiQyIpLnJlcGxhY2UoIi0iLCAiXyIpICsgIi5VVEYtOCI7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVudiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgVVNFUjogIndlYl91c2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgTE9HTkFNRTogIndlYl91c2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgUEFUSDogIi8iLAogICAgICAgICAgICAgICAgICAgICAgICBQV0Q6ICIvIiwKICAgICAgICAgICAgICAgICAgICAgICAgSE9NRTogIi9ob21lL3dlYl91c2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgTEFORzogbGFuZywKICAgICAgICAgICAgICAgICAgICAgICAgXzogZ2V0RXhlY3V0YWJsZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHggaW4gRU5WKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudlt4XSA9IEVOVlt4XTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmluZ3MgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB4IGluIGVudikgewogICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzLnB1c2goeCArICI9IiArIGVudlt4XSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEVudlN0cmluZ3Muc3RyaW5ncyA9IHN0cmluZ3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RW52U3RyaW5ncy5zdHJpbmdzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBTWVNDQUxMUyA9IHsKICAgICAgICAgICAgICAgIG1hcHBpbmdzOiB7fSwKICAgICAgICAgICAgICAgIGJ1ZmZlcnM6IFtudWxsLCBbXSwgW11dLAogICAgICAgICAgICAgICAgcHJpbnRDaGFyOiBmdW5jdGlvbiAoc3RyZWFtLCBjdXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IFNZU0NBTExTLmJ1ZmZlcnNbc3RyZWFtXTsKICAgICAgICAgICAgICAgICAgICBpZiAoY3VyciA9PT0gMCB8fCBjdXJyID09PSAxMCkgewogICAgICAgICAgICAgICAgICAgICAgICAoc3RyZWFtID09PSAxID8gb3V0IDogZXJyKShVVEY4QXJyYXlUb1N0cmluZyhidWZmZXIsIDApKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIucHVzaChjdXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgdmFyYXJnczogdW5kZWZpbmVkLAogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgU1lTQ0FMTFMudmFyYXJncyArPSA0OwogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBIRUFQMzJbKFNZU0NBTExTLnZhcmFyZ3MgLSA0KSA+PiAyXTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGdldFN0cjogZnVuY3Rpb24gKHB0cikgewogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBVVEY4VG9TdHJpbmcocHRyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGdldDY0OiBmdW5jdGlvbiAobG93LCBoaWdoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvdzsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbnZpcm9uX2dldChfX2Vudmlyb24sIGVudmlyb25fYnVmKSB7CiAgICAgICAgICAgICAgICB2YXIgYnVmU2l6ZSA9IDA7CiAgICAgICAgICAgICAgICBnZXRFbnZTdHJpbmdzKCkuZm9yRWFjaChmdW5jdGlvbiAoc3RyaW5nLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHB0ciA9IGVudmlyb25fYnVmICsgYnVmU2l6ZTsKICAgICAgICAgICAgICAgICAgICBIRUFQMzJbKF9fZW52aXJvbiArIGkgKiA0KSA+PiAyXSA9IHB0cjsKICAgICAgICAgICAgICAgICAgICB3cml0ZUFzY2lpVG9NZW1vcnkoc3RyaW5nLCBwdHIpOwogICAgICAgICAgICAgICAgICAgIGJ1ZlNpemUgKz0gc3RyaW5nLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbnZpcm9uX3NpemVzX2dldChwZW52aXJvbl9jb3VudCwgcGVudmlyb25fYnVmX3NpemUpIHsKICAgICAgICAgICAgICAgIHZhciBzdHJpbmdzID0gZ2V0RW52U3RyaW5ncygpOwogICAgICAgICAgICAgICAgSEVBUDMyW3BlbnZpcm9uX2NvdW50ID4+IDJdID0gc3RyaW5ncy5sZW5ndGg7CiAgICAgICAgICAgICAgICB2YXIgYnVmU2l6ZSA9IDA7CiAgICAgICAgICAgICAgICBzdHJpbmdzLmZvckVhY2goZnVuY3Rpb24gKHN0cmluZykgewogICAgICAgICAgICAgICAgICAgIGJ1ZlNpemUgKz0gc3RyaW5nLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIEhFQVAzMltwZW52aXJvbl9idWZfc2l6ZSA+PiAyXSA9IGJ1ZlNpemU7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZXhpdChzdGF0dXMpIHsKICAgICAgICAgICAgICAgIGV4aXQoc3RhdHVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZmRfY2xvc2UoZmQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9mZF9zZWVrKGZkLCBvZmZzZXRfbG93LCBvZmZzZXRfaGlnaCwgd2hlbmNlLCBuZXdPZmZzZXQpIHsgfQogICAgICAgICAgICBmdW5jdGlvbiBfZmRfd3JpdGUoZmQsIGlvdiwgaW92Y250LCBwbnVtKSB7CiAgICAgICAgICAgICAgICB2YXIgbnVtID0gMDsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW92Y250OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHRyID0gSEVBUDMyWyhpb3YgKyBpICogOCkgPj4gMl07CiAgICAgICAgICAgICAgICAgICAgdmFyIGxlbiA9IEhFQVAzMlsoaW92ICsgKGkgKiA4ICsgNCkpID4+IDJdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgU1lTQ0FMTFMucHJpbnRDaGFyKGZkLCBIRUFQVThbcHRyICsgal0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBudW0gKz0gbGVuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgSEVBUDMyW3BudW0gPj4gMl0gPSBudW07CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfcHRocmVhZF9jcmVhdGUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gNjsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfcHRocmVhZF9qb2luKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDI4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9zeXNjb25mKG5hbWUpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAobmFtZSkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMzA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNjM4NDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg1OgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF4SGVhcFNpemUgPSAyMTQ3NDgzNjQ4OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF4SGVhcFNpemUgLyAxNjM4NDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzMjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzMzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTM3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTM4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDIzNjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDc4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTM5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgODI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDY3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTY0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDUyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNTE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0NjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIwMDgwOTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNTA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDc2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDgwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgODE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDkzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5MToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDYwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMDI0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDcyOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzI7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzM6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMTQ3NDgzNjQ3OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDc4Mzk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDM2OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOTk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDM3OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjA0ODsKICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMDk3MTUyOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY1NTM2OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjg6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzMjc2ODsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ0OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzI3Njc7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3NToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE2Mzg0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxZTM7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDcwMDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDcxOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjU2OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyNTU7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTAwOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgwOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIwOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE2OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3MzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4NDogewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5hdmlnYXRvciA9PT0gIm9iamVjdCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF2aWdhdG9yWyJoYXJkd2FyZUNvbmN1cnJlbmN5Il0gfHwgMTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2V0RXJyTm8oMjgpOwogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBhc21MaWJyYXJ5QXJnID0gewogICAgICAgICAgICAgICAgYTogX2Fib3J0LAogICAgICAgICAgICAgICAgbjogX2Nsb2NrX2dldHRpbWUsCiAgICAgICAgICAgICAgICBpOiBfZGxvcGVuLAogICAgICAgICAgICAgICAgZTogX2Rsc3ltLAogICAgICAgICAgICAgICAgbDogX2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZywKICAgICAgICAgICAgICAgIG06IF9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwLAogICAgICAgICAgICAgICAgbzogX2Vtc2NyaXB0ZW5fdGhyZWFkX3NsZWVwLAogICAgICAgICAgICAgICAgcDogX2Vudmlyb25fZ2V0LAogICAgICAgICAgICAgICAgZzogX2Vudmlyb25fc2l6ZXNfZ2V0LAogICAgICAgICAgICAgICAgajogX2V4aXQsCiAgICAgICAgICAgICAgICBoOiBfZmRfY2xvc2UsCiAgICAgICAgICAgICAgICBrOiBfZmRfc2VlaywKICAgICAgICAgICAgICAgIGM6IF9mZF93cml0ZSwKICAgICAgICAgICAgICAgIGQ6IF9wdGhyZWFkX2NyZWF0ZSwKICAgICAgICAgICAgICAgIGY6IF9wdGhyZWFkX2pvaW4sCiAgICAgICAgICAgICAgICBiOiBfc3lzY29uZiwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgY3JlYXRlV2FzbSgpOwogICAgICAgICAgICB2YXIgX19fd2FzbV9jYWxsX2N0b3JzID0gKE1vZHVsZVsiX19fd2FzbV9jYWxsX2N0b3JzIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKF9fX3dhc21fY2FsbF9jdG9ycyA9IE1vZHVsZVsiX19fd2FzbV9jYWxsX2N0b3JzIl0gPSBNb2R1bGVbImFzbSJdWyJyIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0TW9kZWxCdWZmZXJNZW1vcnlPZmZzZXQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0TW9kZWxCdWZmZXJNZW1vcnlPZmZzZXQiXSA9IE1vZHVsZVsiYXNtIl1bInMiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRJbnB1dE1lbW9yeU9mZnNldCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRJbnB1dE1lbW9yeU9mZnNldCJdID0gTW9kdWxlWyJhc20iXVsidCJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldElucHV0SGVpZ2h0Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldElucHV0SGVpZ2h0Il0gPSBNb2R1bGVbImFzbSJdWyJ1Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0SW5wdXRXaWR0aCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRJbnB1dFdpZHRoIl0gPSBNb2R1bGVbImFzbSJdWyJ2Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0SW5wdXRDaGFubmVsQ291bnQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0SW5wdXRDaGFubmVsQ291bnQiXSA9IE1vZHVsZVsiYXNtIl1bInciXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRPdXRwdXRNZW1vcnlPZmZzZXQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0TWVtb3J5T2Zmc2V0Il0gPSBNb2R1bGVbImFzbSJdWyJ4Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0T3V0cHV0SGVpZ2h0Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldE91dHB1dEhlaWdodCJdID0gTW9kdWxlWyJhc20iXVsieSJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldE91dHB1dFdpZHRoIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldE91dHB1dFdpZHRoIl0gPSBNb2R1bGVbImFzbSJdWyJ6Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0T3V0cHV0Q2hhbm5lbENvdW50Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldE91dHB1dENoYW5uZWxDb3VudCJdID0gTW9kdWxlWyJhc20iXVsiQSJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2xvYWRNb2RlbCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9sb2FkTW9kZWwiXSA9IE1vZHVsZVsiYXNtIl1bIkIiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9ydW5JbmZlcmVuY2UiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfcnVuSW5mZXJlbmNlIl0gPSBNb2R1bGVbImFzbSJdWyJDIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgX19fZXJybm9fbG9jYXRpb24gPSAoTW9kdWxlWyJfX19lcnJub19sb2NhdGlvbiJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChfX19lcnJub19sb2NhdGlvbiA9IE1vZHVsZVsiX19fZXJybm9fbG9jYXRpb24iXSA9IE1vZHVsZVsiYXNtIl1bIkUiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBjYWxsZWRSdW47CiAgICAgICAgICAgIGZ1bmN0aW9uIEV4aXRTdGF0dXMoc3RhdHVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSAiRXhpdFN0YXR1cyI7CiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSAiUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggZXhpdCgiICsgc3RhdHVzICsgIikiOwogICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gZnVuY3Rpb24gcnVuQ2FsbGVyKCkgewogICAgICAgICAgICAgICAgaWYgKCFjYWxsZWRSdW4pCiAgICAgICAgICAgICAgICAgICAgcnVuKCk7CiAgICAgICAgICAgICAgICBpZiAoIWNhbGxlZFJ1bikKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBydW5DYWxsZXI7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZ1bmN0aW9uIHJ1bihhcmdzKSB7CiAgICAgICAgICAgICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID4gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHByZVJ1bigpOwogICAgICAgICAgICAgICAgaWYgKHJ1bkRlcGVuZGVuY2llcyA+IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkb1J1bigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGVkUnVuKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgY2FsbGVkUnVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbImNhbGxlZFJ1biJdID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBpZiAoQUJPUlQpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBpbml0UnVudGltZSgpOwogICAgICAgICAgICAgICAgICAgIHByZU1haW4oKTsKICAgICAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZXNvbHZlKE1vZHVsZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsib25SdW50aW1lSW5pdGlhbGl6ZWQiXSkKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJvblJ1bnRpbWVJbml0aWFsaXplZCJdKCk7CiAgICAgICAgICAgICAgICAgICAgcG9zdFJ1bigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsic2V0U3RhdHVzIl0pIHsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInNldFN0YXR1cyJdKCJSdW5uaW5nLi4uIik7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJzZXRTdGF0dXMiXSgiIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBkb1J1bigpOwogICAgICAgICAgICAgICAgICAgIH0sIDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZG9SdW4oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBNb2R1bGVbInJ1biJdID0gcnVuOwogICAgICAgICAgICBmdW5jdGlvbiBleGl0KHN0YXR1cywgaW1wbGljaXQpIHsKICAgICAgICAgICAgICAgIHF1aXRfKHN0YXR1cywgbmV3IEV4aXRTdGF0dXMoc3RhdHVzKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKE1vZHVsZVsicHJlSW5pdCJdKSB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicHJlSW5pdCJdID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJwcmVJbml0Il0gPSBbTW9kdWxlWyJwcmVJbml0Il1dOwogICAgICAgICAgICAgICAgd2hpbGUgKE1vZHVsZVsicHJlSW5pdCJdLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInByZUluaXQiXS5wb3AoKSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJ1bigpOwogICAgICAgICAgICByZXR1cm4gY3JlYXRlVEZMaXRlTW9kdWxlLnJlYWR5OwogICAgICAgIH07CiAgICB9KSgpOwoKICAgIHZhciB0ZmxpdGUgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7CiAgICAgICAgX19wcm90b19fOiBudWxsLAogICAgICAgIGRlZmF1bHQ6IGNyZWF0ZVRGTGl0ZU1vZHVsZQogICAgfSk7Cgp9KSh3YXNtRmVhdHVyZURldGVjdCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPVByb2Nlc3NvclByb3h5Lndvcmtlci5qcy5tYXAKCg==');
1856
1868
  /* eslint-enable */
1857
1869
 
1858
1870
  let sharedWorker;