@getopenpay/openpay-js 0.5.7-alpha.589ead1 → 0.5.7

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 (27) hide show
  1. package/dist/{ExportResult-Bo1QOwfo.js → ExportResult-B-YLKMaU.js} +1 -1
  2. package/dist/{Resource-ByOJ8tkj.js → Resource-Bx_VuhUk.js} +3 -3
  3. package/dist/{SimpleSpanProcessor-D_sHKsSn.js → SimpleSpanProcessor-Bh5q0GmE.js} +8 -8
  4. package/dist/{_commonjsHelpers-DnMzE-71.js → _commonjsHelpers-f76XedMs.js} +1 -1
  5. package/dist/{detect-resources-CaWtElZr.js → detect-resources-DNU1_3GE.js} +8 -8
  6. package/dist/{diag-api-DAsRXs3b.js → diag-api-D9IWSUsW.js} +2 -2
  7. package/dist/{index-DLb2g5Bf.js → index-30ZlhcLu.js} +5 -5
  8. package/dist/{index-DLeOxeWp.js → index-B5mFO64c.js} +5 -5
  9. package/dist/{index-CF-DSTKu.js → index-BEPYQb8x.js} +2 -2
  10. package/dist/{index-Die4Lhdg.js → index-C3xfmnuK.js} +7 -7
  11. package/dist/{index-Bih9tP98.js → index-DQ3qlDEd.js} +7 -7
  12. package/dist/{index-CAXewtIL.js → index-DsU78E0F.js} +1 -1
  13. package/dist/{index-BVePm1pB.js → index-DyyV4YDA.js} +4 -4
  14. package/dist/index-Xxndn7Y1.js +6823 -0
  15. package/dist/{index-BValH8xN.js → index-upVsoy_P.js} +6 -6
  16. package/dist/{index-OfX0TVSj.js → index-zbYl1-1s.js} +2 -2
  17. package/dist/index.es.js +2 -2
  18. package/dist/index.umd.js +56 -43
  19. package/dist/lifecycle-BjQ-7GLm.js +119 -0
  20. package/dist/{metrics-api-_5uS60q1.js → metrics-api-DMMrpfD3.js} +2 -2
  21. package/dist/{sdk-info-CKnpG_QI.js → sdk-info-DiazhyI_.js} +3 -3
  22. package/dist/{url-CwONqRT7.js → url-Cnrlns-i.js} +3 -3
  23. package/dist/{utils-BGeftTvk.js → utils-CX5YT7yI.js} +1 -1
  24. package/dist/{utils-DDk98YyS.js → utils-DAwtFC1B.js} +2 -2
  25. package/dist/{utils-CzFaFOLd.js → utils-DWQb1oMe.js} +4 -4
  26. package/package.json +2 -1
  27. package/dist/index-DlrGfmQY.js +0 -6800
@@ -1,4 +1,4 @@
1
- import { R as Le } from "./index-DlrGfmQY.js";
1
+ import { R as Le } from "./index-Xxndn7Y1.js";
2
2
  function Et(e) {
3
3
  return e === void 0 && (e = {}), typeof e.addEventListener == "function" && typeof e.removeEventListener == "function";
4
4
  }
@@ -1596,4 +1596,4 @@ Mt(dt);
1596
1596
  export {
1597
1597
  Vt as ZoneContextManager
1598
1598
  };
1599
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiaW5kZXgtIX57MDBkfX4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IFIgYXMgUk9PVF9DT05URVhUIH0gZnJvbSAnLi9pbmRleC0hfnswMDV9fi5qcyc7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIGNoZWNrIGlmIGFuIG9iamVjdCBoYXMgYWRkRXZlbnRMaXN0ZW5lciBhbmQgcmVtb3ZlRXZlbnRMaXN0ZW5lciBmdW5jdGlvbnMgdGhlbiBpdCB3aWxsIHJldHVybiB0cnVlLlxuICogR2VuZXJhbGx5IG9ubHkgY2FsbGVkIHdpdGggYSBgVGFyZ2V0V2l0aEV2ZW50c2AgYnV0IG1heSBiZSBjYWxsZWQgd2l0aCBhbiB1bmtub3duIC8gYW55LlxuICogQHBhcmFtIG9iaiAtIFRoZSBvYmplY3QgdG8gY2hlY2suXG4gKi9cbmZ1bmN0aW9uIGlzTGlzdGVuZXJPYmplY3Qob2JqKSB7XG4gICAgaWYgKG9iaiA9PT0gdm9pZCAwKSB7IG9iaiA9IHt9OyB9XG4gICAgcmV0dXJuICh0eXBlb2Ygb2JqLmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgdHlwZW9mIG9iai5yZW1vdmVFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiem9uZS5qc1wiIC8+XG4vKiBLZXkgbmFtZSB0byBiZSB1c2VkIHRvIHNhdmUgYSBjb250ZXh0IHJlZmVyZW5jZSBpbiBab25lICovXG52YXIgWk9ORV9DT05URVhUX0tFWSA9ICdPVF9aT05FX0NPTlRFWFQnO1xuLyoqXG4gKiBab25lQ29udGV4dE1hbmFnZXJcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGFuIGVhc3kgZnVuY3Rpb25hbGl0eSBmb3IgdHJhY2luZyBhY3Rpb24gYmV0d2VlbiBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBpbiB3ZWIuXG4gKiBJdCB3YXMgbm90IHBvc3NpYmxlIHdpdGggc3RhbmRhcmQgW1N0YWNrQ29udGV4dE1hbmFnZXJde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuLXRlbGVtZXRyeS9vcGVudGVsZW1ldHJ5LWpzL2Jsb2IvbWFpbi9wYWNrYWdlcy9vcGVudGVsZW1ldHJ5LXNkay10cmFjZS13ZWIvc3JjL1N0YWNrQ29udGV4dE1hbmFnZXIudHN9LlxuICogSXQgaGVhdmlseSBkZXBlbmRzIG9uIFt6b25lLmpzXXtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS96b25lLmpzfS5cbiAqIEl0IHN0b3JlcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgY29udGV4dCBpbiB6b25lLiBFYWNoIENvbnRleHQgd2lsbCBoYXZlIGFsd2F5cyBuZXcgWm9uZTtcbiAqIEl0IGFsc28gc3VwcG9ydHMgYmluZGluZyBhIGNlcnRhaW4gU3BhbiB0byBhIHRhcmdldCB0aGF0IGhhcyBcImFkZEV2ZW50TGlzdGVuZXJcIiBhbmQgXCJyZW1vdmVFdmVudExpc3RlbmVyXCIuXG4gKiBXaGVuIHRoaXMgaGFwcGVucyBhIG5ldyB6b25lIGlzIGJlaW5nIGNyZWF0ZWQgYW5kIHRoZSBwcm92aWRlZCBTcGFuIGlzIGJlaW5nIGFzc2lnbmVkIHRvIHRoaXMgem9uZS5cbiAqL1xudmFyIFpvbmVDb250ZXh0TWFuYWdlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBab25lQ29udGV4dE1hbmFnZXIoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB3aGV0aGVyIHRoZSBjb250ZXh0IG1hbmFnZXIgaXMgZW5hYmxlZCBvciBub3RcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhlbHBzIHRvIGNyZWF0ZSBhIHVuaXF1ZSBuYW1lIGZvciB0aGUgem9uZXMgLSBwYXJ0IG9mIHpvbmUgbmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fem9uZUNvdW50ZXIgPSAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhY3RpdmUgY29udGV4dCBmcm9tIGNlcnRhaW4gem9uZSBuYW1lXG4gICAgICogQHBhcmFtIGFjdGl2ZVpvbmVcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLl9hY3RpdmVDb250ZXh0RnJvbVpvbmUgPSBmdW5jdGlvbiAoYWN0aXZlWm9uZSkge1xuICAgICAgICByZXR1cm4gKGFjdGl2ZVpvbmUgJiYgYWN0aXZlWm9uZS5nZXQoWk9ORV9DT05URVhUX0tFWSkpIHx8IFJPT1RfQ09OVEVYVDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBjb250ZXh0IEEgY29udGV4dCAoc3BhbikgdG8gYmUgZXhlY3V0ZWQgd2l0aGluIHRhcmdldCBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB0YXJnZXQgRnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgd2l0aGluIHRoZSBjb250ZXh0XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLl9iaW5kRnVuY3Rpb24gPSBmdW5jdGlvbiAoY29udGV4dCwgdGFyZ2V0KSB7XG4gICAgICAgIHZhciBtYW5hZ2VyID0gdGhpcztcbiAgICAgICAgdmFyIGNvbnRleHRXcmFwcGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYW5hZ2VyLndpdGgoY29udGV4dCwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGFyZ2V0LmFwcGx5KF90aGlzLCBhcmdzKTsgfSk7XG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250ZXh0V3JhcHBlciwgJ2xlbmd0aCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IHRhcmdldC5sZW5ndGgsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29udGV4dFdyYXBwZXI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gY29udGV4dCBBIGNvbnRleHQgKHNwYW4pIHRvIGJlIGJpbmQgdG8gdGFyZ2V0XG4gICAgICogQHBhcmFtIG9iaiB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBsaXN0ZW5lcnMgd2lsbCBiZSBwYXRjaGVkXG4gICAgICovXG4gICAgWm9uZUNvbnRleHRNYW5hZ2VyLnByb3RvdHlwZS5fYmluZExpc3RlbmVyID0gZnVuY3Rpb24gKGNvbnRleHQsIG9iaikge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gb2JqO1xuICAgICAgICBpZiAodGFyZ2V0Ll9fb3RfbGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0Ll9fb3RfbGlzdGVuZXJzID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyID0gdGhpcy5fcGF0Y2hBZGRFdmVudExpc3RlbmVyKHRhcmdldCwgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyID0gdGhpcy5fcGF0Y2hSZW1vdmVFdmVudExpc3RlbmVyKHRhcmdldCwgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHVuaXF1ZSB6b25lIG5hbWVcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLl9jcmVhdGVab25lTmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fem9uZUNvdW50ZXIrKztcbiAgICAgICAgdmFyIHJhbmRvbSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl96b25lQ291bnRlciArIFwiLVwiICsgcmFuZG9tO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyB6b25lXG4gICAgICogQHBhcmFtIHpvbmVOYW1lIHpvbmUgbmFtZVxuICAgICAqIEBwYXJhbSBjb250ZXh0IEEgY29udGV4dCAoc3BhbikgdG8gYmUgYmluZCB3aXRoIFpvbmVcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLl9jcmVhdGVab25lID0gZnVuY3Rpb24gKHpvbmVOYW1lLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIFpvbmUuY3VycmVudC5mb3JrKHtcbiAgICAgICAgICAgIG5hbWU6IHpvbmVOYW1lLFxuICAgICAgICAgICAgcHJvcGVydGllczogKF9hID0ge30sXG4gICAgICAgICAgICAgICAgX2FbWk9ORV9DT05URVhUX0tFWV0gPSBjb250ZXh0LFxuICAgICAgICAgICAgICAgIF9hKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhY3RpdmUgem9uZVxuICAgICAqL1xuICAgIFpvbmVDb250ZXh0TWFuYWdlci5wcm90b3R5cGUuX2dldEFjdGl2ZVpvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBab25lLmN1cnJlbnQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQYXRjaGVzIGFkZEV2ZW50TGlzdGVuZXIgbWV0aG9kXG4gICAgICogQHBhcmFtIHRhcmdldCBhbnkgdGFyZ2V0IHRoYXQgaGFzIFwiYWRkRXZlbnRMaXN0ZW5lclwiIG1ldGhvZFxuICAgICAqIEBwYXJhbSBvcmlnaW5hbCByZWZlcmVuY2UgdG8gdGhlIHBhdGNoZWQgbWV0aG9kXG4gICAgICogQHBhcmFtIFtjb250ZXh0XSBjb250ZXh0IHRvIGJlIGJpbmQgdG8gdGhlIGxpc3RlbmVyXG4gICAgICovXG4gICAgWm9uZUNvbnRleHRNYW5hZ2VyLnByb3RvdHlwZS5fcGF0Y2hBZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHRhcmdldCwgb3JpZ2luYWwsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGNvbnRleHRNYW5hZ2VyID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCwgbGlzdGVuZXIsIG9wdHMpIHtcbiAgICAgICAgICAgIGlmICh0YXJnZXQuX19vdF9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRhcmdldC5fX290X2xpc3RlbmVycyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRhcmdldC5fX290X2xpc3RlbmVyc1tldmVudF07XG4gICAgICAgICAgICBpZiAobGlzdGVuZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnMgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICAgICAgICAgIHRhcmdldC5fX290X2xpc3RlbmVyc1tldmVudF0gPSBsaXN0ZW5lcnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcGF0Y2hlZExpc3RlbmVyID0gY29udGV4dE1hbmFnZXIuYmluZChjb250ZXh0LCBsaXN0ZW5lcik7XG4gICAgICAgICAgICAvLyBzdG9yZSBhIHdlYWsgcmVmZXJlbmNlIG9mIHRoZSB1c2VyIGxpc3RlbmVyIHRvIG91cnNcbiAgICAgICAgICAgIGxpc3RlbmVycy5zZXQobGlzdGVuZXIsIHBhdGNoZWRMaXN0ZW5lcik7XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuY2FsbCh0aGlzLCBldmVudCwgcGF0Y2hlZExpc3RlbmVyLCBvcHRzKTtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFBhdGNoZXMgcmVtb3ZlRXZlbnRMaXN0ZW5lciBtZXRob2RcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IGFueSB0YXJnZXQgdGhhdCBoYXMgXCJyZW1vdmVFdmVudExpc3RlbmVyXCIgbWV0aG9kXG4gICAgICogQHBhcmFtIG9yaWdpbmFsIHJlZmVyZW5jZSB0byB0aGUgcGF0Y2hlZCBtZXRob2RcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLl9wYXRjaFJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAodGFyZ2V0LCBvcmlnaW5hbCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgICAgICAgaWYgKHRhcmdldC5fX290X2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgICAgdGFyZ2V0Ll9fb3RfbGlzdGVuZXJzW2V2ZW50XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLmNhbGwodGhpcywgZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBldmVudHMgPSB0YXJnZXQuX19vdF9saXN0ZW5lcnNbZXZlbnRdO1xuICAgICAgICAgICAgdmFyIHBhdGNoZWRMaXN0ZW5lciA9IGV2ZW50cy5nZXQobGlzdGVuZXIpO1xuICAgICAgICAgICAgZXZlbnRzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuY2FsbCh0aGlzLCBldmVudCwgcGF0Y2hlZExpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGFjdGl2ZSBjb250ZXh0XG4gICAgICovXG4gICAgWm9uZUNvbnRleHRNYW5hZ2VyLnByb3RvdHlwZS5hY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJPT1RfQ09OVEVYVDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYWN0aXZlWm9uZSA9IHRoaXMuX2dldEFjdGl2ZVpvbmUoKTtcbiAgICAgICAgdmFyIGFjdGl2ZSA9IHRoaXMuX2FjdGl2ZUNvbnRleHRGcm9tWm9uZShhY3RpdmVab25lKTtcbiAgICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGFjdGl2ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUk9PVF9DT05URVhUO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQmluZHMgYSB0aGUgY2VydGFpbiBjb250ZXh0IG9yIHRoZSBhY3RpdmUgb25lIHRvIHRoZSB0YXJnZXQgZnVuY3Rpb24gYW5kIHRoZW4gcmV0dXJucyB0aGUgdGFyZ2V0XG4gICAgICogQHBhcmFtIGNvbnRleHQgQSBjb250ZXh0IChzcGFuKSB0byBiZSBiaW5kIHRvIHRhcmdldFxuICAgICAqIEBwYXJhbSB0YXJnZXQgYSBmdW5jdGlvbiBvciBldmVudCBlbWl0dGVyLiBXaGVuIHRhcmdldCBvciBvbmUgb2YgaXRzIGNhbGxiYWNrcyBpcyBjYWxsZWQsXG4gICAgICogIHRoZSBwcm92aWRlZCBjb250ZXh0IHdpbGwgYmUgdXNlZCBhcyB0aGUgYWN0aXZlIGNvbnRleHQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY2FsbC5cbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAoY29udGV4dCwgdGFyZ2V0KSB7XG4gICAgICAgIC8vIGlmIG5vIHNwZWNpZmljIGNvbnRleHQgdG8gcHJvcGFnYXRlIGlzIGdpdmVuLCB3ZSB1c2UgdGhlIGN1cnJlbnQgb25lXG4gICAgICAgIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnRleHQgPSB0aGlzLmFjdGl2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYmluZEZ1bmN0aW9uKGNvbnRleHQsIHRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNMaXN0ZW5lck9iamVjdCh0YXJnZXQpKSB7XG4gICAgICAgICAgICB0aGlzLl9iaW5kTGlzdGVuZXIoY29udGV4dCwgdGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGlzYWJsZSB0aGUgY29udGV4dCBtYW5hZ2VyIChjbGVhcnMgYWxsIHRoZSBjb250ZXh0cylcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBjb250ZXh0IG1hbmFnZXIgYW5kIGNyZWF0ZXMgYSBkZWZhdWx0KHJvb3QpIGNvbnRleHRcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2FsbHMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIFtmbl0gd2l0aCB0aGUgcHJvdmlkZWQgW2NvbnRleHRdLlxuICAgICAqICAgICBJZiBbY29udGV4dF0gaXMgdW5kZWZpbmVkIHRoZW4gaXQgd2lsbCB1c2UgdGhlIGFjdGl2ZSBjb250ZXh0LlxuICAgICAqICAgICBUaGUgY29udGV4dCB3aWxsIGJlIHNldCBhcyBhY3RpdmVcbiAgICAgKiBAcGFyYW0gY29udGV4dCBBIGNvbnRleHQgKHNwYW4pIHRvIGJlIGNhbGxlZCB3aXRoIHByb3ZpZGVkIGNhbGxiYWNrXG4gICAgICogQHBhcmFtIGZuIENhbGxiYWNrIGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHRoaXNBcmcgb3B0aW9uYWwgcmVjZWl2ZXIgdG8gYmUgdXNlZCBmb3IgY2FsbGluZyBmblxuICAgICAqIEBwYXJhbSBhcmdzIG9wdGlvbmFsIGFyZ3VtZW50cyBmb3J3YXJkZWQgdG8gZm5cbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLndpdGggPSBmdW5jdGlvbiAoY29udGV4dCwgZm4sIHRoaXNBcmcpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAzOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2kgLSAzXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHpvbmVOYW1lID0gdGhpcy5fY3JlYXRlWm9uZU5hbWUoKTtcbiAgICAgICAgdmFyIG5ld1pvbmUgPSB0aGlzLl9jcmVhdGVab25lKHpvbmVOYW1lLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIG5ld1pvbmUucnVuKGZuLCB0aGlzQXJnLCBhcmdzKTtcbiAgICB9O1xuICAgIHJldHVybiBab25lQ29udGV4dE1hbmFnZXI7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlIEFuZ3VsYXIgdjx1bmtub3duPlxuICogKGMpIDIwMTAtMjAyNCBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vXG4gKiBMaWNlbnNlOiBNSVRcbiAqL1xuY29uc3QgZ2xvYmFsID0gZ2xvYmFsVGhpcztcbi8vIF9fWm9uZV9zeW1ib2xfcHJlZml4IGdsb2JhbCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB6b25lXG4vLyBzeW1ib2wgcHJlZml4IHdpdGggYSBjdXN0b20gb25lIGlmIG5lZWRlZC5cbmZ1bmN0aW9uIF9fc3ltYm9sX18obmFtZSkge1xuICAgIGNvbnN0IHN5bWJvbFByZWZpeCA9IGdsb2JhbFsnX19ab25lX3N5bWJvbF9wcmVmaXgnXSB8fCAnX196b25lX3N5bWJvbF9fJztcbiAgICByZXR1cm4gc3ltYm9sUHJlZml4ICsgbmFtZTtcbn1cbmZ1bmN0aW9uIGluaXRab25lKCkge1xuICAgIGNvbnN0IHBlcmZvcm1hbmNlID0gZ2xvYmFsWydwZXJmb3JtYW5jZSddO1xuICAgIGZ1bmN0aW9uIG1hcmsobmFtZSkge1xuICAgICAgICBwZXJmb3JtYW5jZSAmJiBwZXJmb3JtYW5jZVsnbWFyayddICYmIHBlcmZvcm1hbmNlWydtYXJrJ10obmFtZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBlcmZvcm1hbmNlTWVhc3VyZShuYW1lLCBsYWJlbCkge1xuICAgICAgICBwZXJmb3JtYW5jZSAmJiBwZXJmb3JtYW5jZVsnbWVhc3VyZSddICYmIHBlcmZvcm1hbmNlWydtZWFzdXJlJ10obmFtZSwgbGFiZWwpO1xuICAgIH1cbiAgICBtYXJrKCdab25lJyk7XG4gICAgY2xhc3MgWm9uZUltcGwge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6cmVxdWlyZS1pbnRlcm5hbC13aXRoLXVuZGVyc2NvcmVcbiAgICAgICAgc3RhdGljIHsgdGhpcy5fX3N5bWJvbF9fID0gX19zeW1ib2xfXzsgfVxuICAgICAgICBzdGF0aWMgYXNzZXJ0Wm9uZVBhdGNoZWQoKSB7XG4gICAgICAgICAgICBpZiAoZ2xvYmFsWydQcm9taXNlJ10gIT09IHBhdGNoZXNbJ1pvbmVBd2FyZVByb21pc2UnXSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWm9uZS5qcyBoYXMgZGV0ZWN0ZWQgdGhhdCBab25lQXdhcmVQcm9taXNlIGAod2luZG93fGdsb2JhbCkuUHJvbWlzZWAgJyArXG4gICAgICAgICAgICAgICAgICAgICdoYXMgYmVlbiBvdmVyd3JpdHRlbi5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJ01vc3QgbGlrZWx5IGNhdXNlIGlzIHRoYXQgYSBQcm9taXNlIHBvbHlmaWxsIGhhcyBiZWVuIGxvYWRlZCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2FmdGVyIFpvbmUuanMgKFBvbHlmaWxsaW5nIFByb21pc2UgYXBpIGlzIG5vdCBuZWNlc3Nhcnkgd2hlbiB6b25lLmpzIGlzIGxvYWRlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICdJZiB5b3UgbXVzdCBsb2FkIG9uZSwgZG8gc28gYmVmb3JlIGxvYWRpbmcgem9uZS5qcy4pJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGdldCByb290KCkge1xuICAgICAgICAgICAgbGV0IHpvbmUgPSBab25lSW1wbC5jdXJyZW50O1xuICAgICAgICAgICAgd2hpbGUgKHpvbmUucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgem9uZSA9IHpvbmUucGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHpvbmU7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGdldCBjdXJyZW50KCkge1xuICAgICAgICAgICAgcmV0dXJuIF9jdXJyZW50Wm9uZUZyYW1lLnpvbmU7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGdldCBjdXJyZW50VGFzaygpIHtcbiAgICAgICAgICAgIHJldHVybiBfY3VycmVudFRhc2s7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnJlcXVpcmUtaW50ZXJuYWwtd2l0aC11bmRlcnNjb3JlXG4gICAgICAgIHN0YXRpYyBfX2xvYWRfcGF0Y2gobmFtZSwgZm4sIGlnbm9yZUR1cGxpY2F0ZSA9IGZhbHNlKSB7XG4gICAgICAgICAgICBpZiAocGF0Y2hlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgICAgICAgIC8vIGBjaGVja0R1cGxpY2F0ZWAgb3B0aW9uIGlzIGRlZmluZWQgZnJvbSBnbG9iYWwgdmFyaWFibGVcbiAgICAgICAgICAgICAgICAvLyBzbyBpdCB3b3JrcyBmb3IgYWxsIG1vZHVsZXMuXG4gICAgICAgICAgICAgICAgLy8gYGlnbm9yZUR1cGxpY2F0ZWAgY2FuIHdvcmsgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlXG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2tEdXBsaWNhdGUgPSBnbG9iYWxbX19zeW1ib2xfXygnZm9yY2VEdXBsaWNhdGVab25lQ2hlY2snKV0gPT09IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKCFpZ25vcmVEdXBsaWNhdGUgJiYgY2hlY2tEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0FscmVhZHkgbG9hZGVkIHBhdGNoOiAnICsgbmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIWdsb2JhbFsnX19ab25lX2Rpc2FibGVfJyArIG5hbWVdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGVyZk5hbWUgPSAnWm9uZTonICsgbmFtZTtcbiAgICAgICAgICAgICAgICBtYXJrKHBlcmZOYW1lKTtcbiAgICAgICAgICAgICAgICBwYXRjaGVzW25hbWVdID0gZm4oZ2xvYmFsLCBab25lSW1wbCwgX2FwaSk7XG4gICAgICAgICAgICAgICAgcGVyZm9ybWFuY2VNZWFzdXJlKHBlcmZOYW1lLCBwZXJmTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHBhcmVudCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIHpvbmVTcGVjKSB7XG4gICAgICAgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgICAgICB0aGlzLl9uYW1lID0gem9uZVNwZWMgPyB6b25lU3BlYy5uYW1lIHx8ICd1bm5hbWVkJyA6ICc8cm9vdD4nO1xuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9ICh6b25lU3BlYyAmJiB6b25lU3BlYy5wcm9wZXJ0aWVzKSB8fCB7fTtcbiAgICAgICAgICAgIHRoaXMuX3pvbmVEZWxlZ2F0ZSA9IG5ldyBfWm9uZURlbGVnYXRlKHRoaXMsIHRoaXMuX3BhcmVudCAmJiB0aGlzLl9wYXJlbnQuX3pvbmVEZWxlZ2F0ZSwgem9uZVNwZWMpO1xuICAgICAgICB9XG4gICAgICAgIGdldChrZXkpIHtcbiAgICAgICAgICAgIGNvbnN0IHpvbmUgPSB0aGlzLmdldFpvbmVXaXRoKGtleSk7XG4gICAgICAgICAgICBpZiAoem9uZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gem9uZS5fcHJvcGVydGllc1trZXldO1xuICAgICAgICB9XG4gICAgICAgIGdldFpvbmVXaXRoKGtleSkge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzO1xuICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudC5fcHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5fcGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZm9yayh6b25lU3BlYykge1xuICAgICAgICAgICAgaWYgKCF6b25lU3BlYylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1pvbmVTcGVjIHJlcXVpcmVkIScpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5mb3JrKHRoaXMsIHpvbmVTcGVjKTtcbiAgICAgICAgfVxuICAgICAgICB3cmFwKGNhbGxiYWNrLCBzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGluZyBmdW5jdGlvbiBnb3Q6ICcgKyBjYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBfY2FsbGJhY2sgPSB0aGlzLl96b25lRGVsZWdhdGUuaW50ZXJjZXB0KHRoaXMsIGNhbGxiYWNrLCBzb3VyY2UpO1xuICAgICAgICAgICAgY29uc3Qgem9uZSA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB6b25lLnJ1bkd1YXJkZWQoX2NhbGxiYWNrLCB0aGlzLCBhcmd1bWVudHMsIHNvdXJjZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJ1bihjYWxsYmFjaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MsIHNvdXJjZSkge1xuICAgICAgICAgICAgX2N1cnJlbnRab25lRnJhbWUgPSB7IHBhcmVudDogX2N1cnJlbnRab25lRnJhbWUsIHpvbmU6IHRoaXMgfTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnZva2UodGhpcywgY2FsbGJhY2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzLCBzb3VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgX2N1cnJlbnRab25lRnJhbWUgPSBfY3VycmVudFpvbmVGcmFtZS5wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcnVuR3VhcmRlZChjYWxsYmFjaywgYXBwbHlUaGlzID0gbnVsbCwgYXBwbHlBcmdzLCBzb3VyY2UpIHtcbiAgICAgICAgICAgIF9jdXJyZW50Wm9uZUZyYW1lID0geyBwYXJlbnQ6IF9jdXJyZW50Wm9uZUZyYW1lLCB6b25lOiB0aGlzIH07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl96b25lRGVsZWdhdGUuaW52b2tlKHRoaXMsIGNhbGxiYWNrLCBhcHBseVRoaXMsIGFwcGx5QXJncywgc291cmNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl96b25lRGVsZWdhdGUuaGFuZGxlRXJyb3IodGhpcywgZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIF9jdXJyZW50Wm9uZUZyYW1lID0gX2N1cnJlbnRab25lRnJhbWUucGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJ1blRhc2sodGFzaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MpIHtcbiAgICAgICAgICAgIGlmICh0YXNrLnpvbmUgIT0gdGhpcykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQSB0YXNrIGNhbiBvbmx5IGJlIHJ1biBpbiB0aGUgem9uZSBvZiBjcmVhdGlvbiEgKENyZWF0aW9uOiAnICtcbiAgICAgICAgICAgICAgICAgICAgKHRhc2suem9uZSB8fCBOT19aT05FKS5uYW1lICtcbiAgICAgICAgICAgICAgICAgICAgJzsgRXhlY3V0aW9uOiAnICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lICtcbiAgICAgICAgICAgICAgICAgICAgJyknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHpvbmVUYXNrID0gdGFzaztcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3pvbmUuanMvaXNzdWVzLzc3OCwgc29tZXRpbWVzIGV2ZW50VGFza1xuICAgICAgICAgICAgLy8gd2lsbCBydW4gaW4gbm90U2NoZWR1bGVkKGNhbmNlbGVkKSBzdGF0ZSwgd2Ugc2hvdWxkIG5vdCB0cnkgdG9cbiAgICAgICAgICAgIC8vIHJ1biBzdWNoIGtpbmQgb2YgdGFzayBidXQganVzdCByZXR1cm5cbiAgICAgICAgICAgIGNvbnN0IHsgdHlwZSwgZGF0YTogeyBpc1BlcmlvZGljID0gZmFsc2UsIGlzUmVmcmVzaGFibGUgPSBmYWxzZSB9ID0ge30gfSA9IHRhc2s7XG4gICAgICAgICAgICBpZiAodGFzay5zdGF0ZSA9PT0gbm90U2NoZWR1bGVkICYmICh0eXBlID09PSBldmVudFRhc2sgfHwgdHlwZSA9PT0gbWFjcm9UYXNrKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlRW50cnlHdWFyZCA9IHRhc2suc3RhdGUgIT0gcnVubmluZztcbiAgICAgICAgICAgIHJlRW50cnlHdWFyZCAmJiB6b25lVGFzay5fdHJhbnNpdGlvblRvKHJ1bm5pbmcsIHNjaGVkdWxlZCk7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c1Rhc2sgPSBfY3VycmVudFRhc2s7XG4gICAgICAgICAgICBfY3VycmVudFRhc2sgPSB6b25lVGFzaztcbiAgICAgICAgICAgIF9jdXJyZW50Wm9uZUZyYW1lID0geyBwYXJlbnQ6IF9jdXJyZW50Wm9uZUZyYW1lLCB6b25lOiB0aGlzIH07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlID09IG1hY3JvVGFzayAmJiB0YXNrLmRhdGEgJiYgIWlzUGVyaW9kaWMgJiYgIWlzUmVmcmVzaGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFzay5jYW5jZWxGbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnZva2VUYXNrKHRoaXMsIHpvbmVUYXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fem9uZURlbGVnYXRlLmhhbmRsZUVycm9yKHRoaXMsIGVycm9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdGFzaydzIHN0YXRlIGlzIG5vdFNjaGVkdWxlZCBvciB1bmtub3duLCB0aGVuIGl0IGhhcyBhbHJlYWR5IGJlZW4gY2FuY2VsbGVkXG4gICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIG5vdCByZXNldCB0aGUgc3RhdGUgdG8gc2NoZWR1bGVkXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSB0YXNrLnN0YXRlO1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gbm90U2NoZWR1bGVkICYmIHN0YXRlICE9PSB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IGV2ZW50VGFzayB8fCBpc1BlcmlvZGljIHx8IChpc1JlZnJlc2hhYmxlICYmIHN0YXRlID09PSBzY2hlZHVsaW5nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVFbnRyeUd1YXJkICYmIHpvbmVUYXNrLl90cmFuc2l0aW9uVG8oc2NoZWR1bGVkLCBydW5uaW5nLCBzY2hlZHVsaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHpvbmVEZWxlZ2F0ZXMgPSB6b25lVGFzay5fem9uZURlbGVnYXRlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRhc2tDb3VudCh6b25lVGFzaywgLTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVFbnRyeUd1YXJkICYmIHpvbmVUYXNrLl90cmFuc2l0aW9uVG8obm90U2NoZWR1bGVkLCBydW5uaW5nLCBub3RTY2hlZHVsZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVmcmVzaGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b25lVGFzay5fem9uZURlbGVnYXRlcyA9IHpvbmVEZWxlZ2F0ZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX2N1cnJlbnRab25lRnJhbWUgPSBfY3VycmVudFpvbmVGcmFtZS5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgX2N1cnJlbnRUYXNrID0gcHJldmlvdXNUYXNrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNjaGVkdWxlVGFzayh0YXNrKSB7XG4gICAgICAgICAgICBpZiAodGFzay56b25lICYmIHRhc2suem9uZSAhPT0gdGhpcykge1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSB0YXNrIHdhcyByZXNjaGVkdWxlZCwgdGhlIG5ld1pvbmVcbiAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IGJlIHRoZSBjaGlsZHJlbiBvZiB0aGUgb3JpZ2luYWwgem9uZVxuICAgICAgICAgICAgICAgIGxldCBuZXdab25lID0gdGhpcztcbiAgICAgICAgICAgICAgICB3aGlsZSAobmV3Wm9uZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV3Wm9uZSA9PT0gdGFzay56b25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgY2FuIG5vdCByZXNjaGVkdWxlIHRhc2sgdG8gJHt0aGlzLm5hbWV9IHdoaWNoIGlzIGRlc2NlbmRhbnRzIG9mIHRoZSBvcmlnaW5hbCB6b25lICR7dGFzay56b25lLm5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbmV3Wm9uZSA9IG5ld1pvbmUucGFyZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRhc2suX3RyYW5zaXRpb25UbyhzY2hlZHVsaW5nLCBub3RTY2hlZHVsZWQpO1xuICAgICAgICAgICAgY29uc3Qgem9uZURlbGVnYXRlcyA9IFtdO1xuICAgICAgICAgICAgdGFzay5fem9uZURlbGVnYXRlcyA9IHpvbmVEZWxlZ2F0ZXM7XG4gICAgICAgICAgICB0YXNrLl96b25lID0gdGhpcztcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGFzayA9IHRoaXMuX3pvbmVEZWxlZ2F0ZS5zY2hlZHVsZVRhc2sodGhpcywgdGFzayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgLy8gc2hvdWxkIHNldCB0YXNrJ3Mgc3RhdGUgdG8gdW5rbm93biB3aGVuIHNjaGVkdWxlVGFzayB0aHJvdyBlcnJvclxuICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIGVyciBtYXkgZnJvbSByZXNjaGVkdWxlLCBzbyB0aGUgZnJvbVN0YXRlIG1heWJlIG5vdFNjaGVkdWxlZFxuICAgICAgICAgICAgICAgIHRhc2suX3RyYW5zaXRpb25Ubyh1bmtub3duLCBzY2hlZHVsaW5nLCBub3RTY2hlZHVsZWQpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IEBKaWFMaVBhc3Npb24sIHNob3VsZCB3ZSBjaGVjayB0aGUgcmVzdWx0IGZyb20gaGFuZGxlRXJyb3I/XG4gICAgICAgICAgICAgICAgdGhpcy5fem9uZURlbGVnYXRlLmhhbmRsZUVycm9yKHRoaXMsIGVycik7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRhc2suX3pvbmVEZWxlZ2F0ZXMgPT09IHpvbmVEZWxlZ2F0ZXMpIHtcbiAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIGNoZWNrIGJlY2F1c2UgaW50ZXJuYWxseSB0aGUgZGVsZWdhdGUgY2FuIHJlc2NoZWR1bGUgdGhlIHRhc2suXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlVGFza0NvdW50KHRhc2ssIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRhc2suc3RhdGUgPT0gc2NoZWR1bGluZykge1xuICAgICAgICAgICAgICAgIHRhc2suX3RyYW5zaXRpb25UbyhzY2hlZHVsZWQsIHNjaGVkdWxpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhc2s7XG4gICAgICAgIH1cbiAgICAgICAgc2NoZWR1bGVNaWNyb1Rhc2soc291cmNlLCBjYWxsYmFjaywgZGF0YSwgY3VzdG9tU2NoZWR1bGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlVGFzayhuZXcgWm9uZVRhc2sobWljcm9UYXNrLCBzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgdW5kZWZpbmVkKSk7XG4gICAgICAgIH1cbiAgICAgICAgc2NoZWR1bGVNYWNyb1Rhc2soc291cmNlLCBjYWxsYmFjaywgZGF0YSwgY3VzdG9tU2NoZWR1bGUsIGN1c3RvbUNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVUYXNrKG5ldyBab25lVGFzayhtYWNyb1Rhc2ssIHNvdXJjZSwgY2FsbGJhY2ssIGRhdGEsIGN1c3RvbVNjaGVkdWxlLCBjdXN0b21DYW5jZWwpKTtcbiAgICAgICAgfVxuICAgICAgICBzY2hlZHVsZUV2ZW50VGFzayhzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgY3VzdG9tQ2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZVRhc2sobmV3IFpvbmVUYXNrKGV2ZW50VGFzaywgc291cmNlLCBjYWxsYmFjaywgZGF0YSwgY3VzdG9tU2NoZWR1bGUsIGN1c3RvbUNhbmNlbCkpO1xuICAgICAgICB9XG4gICAgICAgIGNhbmNlbFRhc2sodGFzaykge1xuICAgICAgICAgICAgaWYgKHRhc2suem9uZSAhPSB0aGlzKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQSB0YXNrIGNhbiBvbmx5IGJlIGNhbmNlbGxlZCBpbiB0aGUgem9uZSBvZiBjcmVhdGlvbiEgKENyZWF0aW9uOiAnICtcbiAgICAgICAgICAgICAgICAgICAgKHRhc2suem9uZSB8fCBOT19aT05FKS5uYW1lICtcbiAgICAgICAgICAgICAgICAgICAgJzsgRXhlY3V0aW9uOiAnICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lICtcbiAgICAgICAgICAgICAgICAgICAgJyknKTtcbiAgICAgICAgICAgIGlmICh0YXNrLnN0YXRlICE9PSBzY2hlZHVsZWQgJiYgdGFzay5zdGF0ZSAhPT0gcnVubmluZykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRhc2suX3RyYW5zaXRpb25UbyhjYW5jZWxpbmcsIHNjaGVkdWxlZCwgcnVubmluZyk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3pvbmVEZWxlZ2F0ZS5jYW5jZWxUYXNrKHRoaXMsIHRhc2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIC8vIGlmIGVycm9yIG9jY3VycyB3aGVuIGNhbmNlbFRhc2ssIHRyYW5zaXQgdGhlIHN0YXRlIHRvIHVua25vd25cbiAgICAgICAgICAgICAgICB0YXNrLl90cmFuc2l0aW9uVG8odW5rbm93biwgY2FuY2VsaW5nKTtcbiAgICAgICAgICAgICAgICB0aGlzLl96b25lRGVsZWdhdGUuaGFuZGxlRXJyb3IodGhpcywgZXJyKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVUYXNrQ291bnQodGFzaywgLTEpO1xuICAgICAgICAgICAgdGFzay5fdHJhbnNpdGlvblRvKG5vdFNjaGVkdWxlZCwgY2FuY2VsaW5nKTtcbiAgICAgICAgICAgIHRhc2sucnVuQ291bnQgPSAtMTtcbiAgICAgICAgICAgIHJldHVybiB0YXNrO1xuICAgICAgICB9XG4gICAgICAgIF91cGRhdGVUYXNrQ291bnQodGFzaywgY291bnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHpvbmVEZWxlZ2F0ZXMgPSB0YXNrLl96b25lRGVsZWdhdGVzO1xuICAgICAgICAgICAgaWYgKGNvdW50ID09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGFzay5fem9uZURlbGVnYXRlcyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHpvbmVEZWxlZ2F0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB6b25lRGVsZWdhdGVzW2ldLl91cGRhdGVUYXNrQ291bnQodGFzay50eXBlLCBjb3VudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgREVMRUdBVEVfWlMgPSB7XG4gICAgICAgIG5hbWU6ICcnLFxuICAgICAgICBvbkhhc1Rhc2s6IChkZWxlZ2F0ZSwgXywgdGFyZ2V0LCBoYXNUYXNrU3RhdGUpID0+IGRlbGVnYXRlLmhhc1Rhc2sodGFyZ2V0LCBoYXNUYXNrU3RhdGUpLFxuICAgICAgICBvblNjaGVkdWxlVGFzazogKGRlbGVnYXRlLCBfLCB0YXJnZXQsIHRhc2spID0+IGRlbGVnYXRlLnNjaGVkdWxlVGFzayh0YXJnZXQsIHRhc2spLFxuICAgICAgICBvbkludm9rZVRhc2s6IChkZWxlZ2F0ZSwgXywgdGFyZ2V0LCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncykgPT4gZGVsZWdhdGUuaW52b2tlVGFzayh0YXJnZXQsIHRhc2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzKSxcbiAgICAgICAgb25DYW5jZWxUYXNrOiAoZGVsZWdhdGUsIF8sIHRhcmdldCwgdGFzaykgPT4gZGVsZWdhdGUuY2FuY2VsVGFzayh0YXJnZXQsIHRhc2spLFxuICAgIH07XG4gICAgY2xhc3MgX1pvbmVEZWxlZ2F0ZSB7XG4gICAgICAgIGdldCB6b25lKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3RydWN0b3Ioem9uZSwgcGFyZW50RGVsZWdhdGUsIHpvbmVTcGVjKSB7XG4gICAgICAgICAgICB0aGlzLl90YXNrQ291bnRzID0ge1xuICAgICAgICAgICAgICAgICdtaWNyb1Rhc2snOiAwLFxuICAgICAgICAgICAgICAgICdtYWNyb1Rhc2snOiAwLFxuICAgICAgICAgICAgICAgICdldmVudFRhc2snOiAwLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX3pvbmUgPSB6b25lO1xuICAgICAgICAgICAgdGhpcy5fcGFyZW50RGVsZWdhdGUgPSBwYXJlbnREZWxlZ2F0ZTtcbiAgICAgICAgICAgIHRoaXMuX2ZvcmtaUyA9IHpvbmVTcGVjICYmICh6b25lU3BlYyAmJiB6b25lU3BlYy5vbkZvcmsgPyB6b25lU3BlYyA6IHBhcmVudERlbGVnYXRlLl9mb3JrWlMpO1xuICAgICAgICAgICAgdGhpcy5fZm9ya0RsZ3QgPSB6b25lU3BlYyAmJiAoem9uZVNwZWMub25Gb3JrID8gcGFyZW50RGVsZWdhdGUgOiBwYXJlbnREZWxlZ2F0ZS5fZm9ya0RsZ3QpO1xuICAgICAgICAgICAgdGhpcy5fZm9ya0N1cnJab25lID1cbiAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25Gb3JrID8gdGhpcy5fem9uZSA6IHBhcmVudERlbGVnYXRlLl9mb3JrQ3VyclpvbmUpO1xuICAgICAgICAgICAgdGhpcy5faW50ZXJjZXB0WlMgPVxuICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkludGVyY2VwdCA/IHpvbmVTcGVjIDogcGFyZW50RGVsZWdhdGUuX2ludGVyY2VwdFpTKTtcbiAgICAgICAgICAgIHRoaXMuX2ludGVyY2VwdERsZ3QgPVxuICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkludGVyY2VwdCA/IHBhcmVudERlbGVnYXRlIDogcGFyZW50RGVsZWdhdGUuX2ludGVyY2VwdERsZ3QpO1xuICAgICAgICAgICAgdGhpcy5faW50ZXJjZXB0Q3VyclpvbmUgPVxuICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkludGVyY2VwdCA/IHRoaXMuX3pvbmUgOiBwYXJlbnREZWxlZ2F0ZS5faW50ZXJjZXB0Q3VyclpvbmUpO1xuICAgICAgICAgICAgdGhpcy5faW52b2tlWlMgPSB6b25lU3BlYyAmJiAoem9uZVNwZWMub25JbnZva2UgPyB6b25lU3BlYyA6IHBhcmVudERlbGVnYXRlLl9pbnZva2VaUyk7XG4gICAgICAgICAgICB0aGlzLl9pbnZva2VEbGd0ID1cbiAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25JbnZva2UgPyBwYXJlbnREZWxlZ2F0ZSA6IHBhcmVudERlbGVnYXRlLl9pbnZva2VEbGd0KTtcbiAgICAgICAgICAgIHRoaXMuX2ludm9rZUN1cnJab25lID1cbiAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25JbnZva2UgPyB0aGlzLl96b25lIDogcGFyZW50RGVsZWdhdGUuX2ludm9rZUN1cnJab25lKTtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZUVycm9yWlMgPVxuICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkhhbmRsZUVycm9yID8gem9uZVNwZWMgOiBwYXJlbnREZWxlZ2F0ZS5faGFuZGxlRXJyb3JaUyk7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVFcnJvckRsZ3QgPVxuICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkhhbmRsZUVycm9yID8gcGFyZW50RGVsZWdhdGUgOiBwYXJlbnREZWxlZ2F0ZS5faGFuZGxlRXJyb3JEbGd0KTtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZUVycm9yQ3VyclpvbmUgPVxuICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkhhbmRsZUVycm9yID8gdGhpcy5fem9uZSA6IHBhcmVudERlbGVnYXRlLl9oYW5kbGVFcnJvckN1cnJab25lKTtcbiAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlVGFza1pTID1cbiAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25TY2hlZHVsZVRhc2sgPyB6b25lU3BlYyA6IHBhcmVudERlbGVnYXRlLl9zY2hlZHVsZVRhc2taUyk7XG4gICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVRhc2tEbGd0ID1cbiAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25TY2hlZHVsZVRhc2sgPyBwYXJlbnREZWxlZ2F0ZSA6IHBhcmVudERlbGVnYXRlLl9zY2hlZHVsZVRhc2tEbGd0KTtcbiAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlVGFza0N1cnJab25lID1cbiAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25TY2hlZHVsZVRhc2sgPyB0aGlzLl96b25lIDogcGFyZW50RGVsZWdhdGUuX3NjaGVkdWxlVGFza0N1cnJab25lKTtcbiAgICAgICAgICAgIHRoaXMuX2ludm9rZVRhc2taUyA9XG4gICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW52b2tlVGFzayA/IHpvbmVTcGVjIDogcGFyZW50RGVsZWdhdGUuX2ludm9rZVRhc2taUyk7XG4gICAgICAgICAgICB0aGlzLl9pbnZva2VUYXNrRGxndCA9XG4gICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW52b2tlVGFzayA/IHBhcmVudERlbGVnYXRlIDogcGFyZW50RGVsZWdhdGUuX2ludm9rZVRhc2tEbGd0KTtcbiAgICAgICAgICAgIHRoaXMuX2ludm9rZVRhc2tDdXJyWm9uZSA9XG4gICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW52b2tlVGFzayA/IHRoaXMuX3pvbmUgOiBwYXJlbnREZWxlZ2F0ZS5faW52b2tlVGFza0N1cnJab25lKTtcbiAgICAgICAgICAgIHRoaXMuX2NhbmNlbFRhc2taUyA9XG4gICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uQ2FuY2VsVGFzayA/IHpvbmVTcGVjIDogcGFyZW50RGVsZWdhdGUuX2NhbmNlbFRhc2taUyk7XG4gICAgICAgICAgICB0aGlzLl9jYW5jZWxUYXNrRGxndCA9XG4gICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uQ2FuY2VsVGFzayA/IHBhcmVudERlbGVnYXRlIDogcGFyZW50RGVsZWdhdGUuX2NhbmNlbFRhc2tEbGd0KTtcbiAgICAgICAgICAgIHRoaXMuX2NhbmNlbFRhc2tDdXJyWm9uZSA9XG4gICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uQ2FuY2VsVGFzayA/IHRoaXMuX3pvbmUgOiBwYXJlbnREZWxlZ2F0ZS5fY2FuY2VsVGFza0N1cnJab25lKTtcbiAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2taUyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9oYXNUYXNrRGxndCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9oYXNUYXNrRGxndE93bmVyID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2tDdXJyWm9uZSA9IG51bGw7XG4gICAgICAgICAgICBjb25zdCB6b25lU3BlY0hhc1Rhc2sgPSB6b25lU3BlYyAmJiB6b25lU3BlYy5vbkhhc1Rhc2s7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRIYXNUYXNrID0gcGFyZW50RGVsZWdhdGUgJiYgcGFyZW50RGVsZWdhdGUuX2hhc1Rhc2taUztcbiAgICAgICAgICAgIGlmICh6b25lU3BlY0hhc1Rhc2sgfHwgcGFyZW50SGFzVGFzaykge1xuICAgICAgICAgICAgICAgIC8vIElmIHdlIG5lZWQgdG8gcmVwb3J0IGhhc1Rhc2ssIHRoYW4gdGhpcyBaUyBuZWVkcyB0byBkbyByZWYgY291bnRpbmcgb24gdGFza3MuIEluIHN1Y2hcbiAgICAgICAgICAgICAgICAvLyBhIGNhc2UgYWxsIHRhc2sgcmVsYXRlZCBpbnRlcmNlcHRvcnMgbXVzdCBnbyB0aHJvdWdoIHRoaXMgWkQuIFdlIGNhbid0IHNob3J0IGNpcmN1aXQgaXQuXG4gICAgICAgICAgICAgICAgdGhpcy5faGFzVGFza1pTID0gem9uZVNwZWNIYXNUYXNrID8gem9uZVNwZWMgOiBERUxFR0FURV9aUztcbiAgICAgICAgICAgICAgICB0aGlzLl9oYXNUYXNrRGxndCA9IHBhcmVudERlbGVnYXRlO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2tEbGd0T3duZXIgPSB0aGlzO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2tDdXJyWm9uZSA9IHRoaXMuX3pvbmU7XG4gICAgICAgICAgICAgICAgaWYgKCF6b25lU3BlYy5vblNjaGVkdWxlVGFzaykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVRhc2taUyA9IERFTEVHQVRFX1pTO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVRhc2tEbGd0ID0gcGFyZW50RGVsZWdhdGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlVGFza0N1cnJab25lID0gdGhpcy5fem9uZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF6b25lU3BlYy5vbkludm9rZVRhc2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW52b2tlVGFza1pTID0gREVMRUdBVEVfWlM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZVRhc2tEbGd0ID0gcGFyZW50RGVsZWdhdGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZVRhc2tDdXJyWm9uZSA9IHRoaXMuX3pvbmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghem9uZVNwZWMub25DYW5jZWxUYXNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbmNlbFRhc2taUyA9IERFTEVHQVRFX1pTO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYW5jZWxUYXNrRGxndCA9IHBhcmVudERlbGVnYXRlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYW5jZWxUYXNrQ3VyclpvbmUgPSB0aGlzLl96b25lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3JrKHRhcmdldFpvbmUsIHpvbmVTcGVjKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZm9ya1pTXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9mb3JrWlMub25Gb3JrKHRoaXMuX2ZvcmtEbGd0LCB0aGlzLnpvbmUsIHRhcmdldFpvbmUsIHpvbmVTcGVjKVxuICAgICAgICAgICAgICAgIDogbmV3IFpvbmVJbXBsKHRhcmdldFpvbmUsIHpvbmVTcGVjKTtcbiAgICAgICAgfVxuICAgICAgICBpbnRlcmNlcHQodGFyZ2V0Wm9uZSwgY2FsbGJhY2ssIHNvdXJjZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludGVyY2VwdFpTXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9pbnRlcmNlcHRaUy5vbkludGVyY2VwdCh0aGlzLl9pbnRlcmNlcHREbGd0LCB0aGlzLl9pbnRlcmNlcHRDdXJyWm9uZSwgdGFyZ2V0Wm9uZSwgY2FsbGJhY2ssIHNvdXJjZSlcbiAgICAgICAgICAgICAgICA6IGNhbGxiYWNrO1xuICAgICAgICB9XG4gICAgICAgIGludm9rZSh0YXJnZXRab25lLCBjYWxsYmFjaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MsIHNvdXJjZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZVpTXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9pbnZva2VaUy5vbkludm9rZSh0aGlzLl9pbnZva2VEbGd0LCB0aGlzLl9pbnZva2VDdXJyWm9uZSwgdGFyZ2V0Wm9uZSwgY2FsbGJhY2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzLCBzb3VyY2UpXG4gICAgICAgICAgICAgICAgOiBjYWxsYmFjay5hcHBseShhcHBseVRoaXMsIGFwcGx5QXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgaGFuZGxlRXJyb3IodGFyZ2V0Wm9uZSwgZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVFcnJvclpTXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9oYW5kbGVFcnJvclpTLm9uSGFuZGxlRXJyb3IodGhpcy5faGFuZGxlRXJyb3JEbGd0LCB0aGlzLl9oYW5kbGVFcnJvckN1cnJab25lLCB0YXJnZXRab25lLCBlcnJvcilcbiAgICAgICAgICAgICAgICA6IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgc2NoZWR1bGVUYXNrKHRhcmdldFpvbmUsIHRhc2spIHtcbiAgICAgICAgICAgIGxldCByZXR1cm5UYXNrID0gdGFzaztcbiAgICAgICAgICAgIGlmICh0aGlzLl9zY2hlZHVsZVRhc2taUykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9oYXNUYXNrWlMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVGFzay5fem9uZURlbGVnYXRlcy5wdXNoKHRoaXMuX2hhc1Rhc2tEbGd0T3duZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm5UYXNrID0gdGhpcy5fc2NoZWR1bGVUYXNrWlMub25TY2hlZHVsZVRhc2sodGhpcy5fc2NoZWR1bGVUYXNrRGxndCwgdGhpcy5fc2NoZWR1bGVUYXNrQ3VyclpvbmUsIHRhcmdldFpvbmUsIHRhc2spO1xuICAgICAgICAgICAgICAgIGlmICghcmV0dXJuVGFzaylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVGFzayA9IHRhc2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGFzay5zY2hlZHVsZUZuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhc2suc2NoZWR1bGVGbih0YXNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGFzay50eXBlID09IG1pY3JvVGFzaykge1xuICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZU1pY3JvVGFzayh0YXNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGFzayBpcyBtaXNzaW5nIHNjaGVkdWxlRm4uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldHVyblRhc2s7XG4gICAgICAgIH1cbiAgICAgICAgaW52b2tlVGFzayh0YXJnZXRab25lLCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZVRhc2taU1xuICAgICAgICAgICAgICAgID8gdGhpcy5faW52b2tlVGFza1pTLm9uSW52b2tlVGFzayh0aGlzLl9pbnZva2VUYXNrRGxndCwgdGhpcy5faW52b2tlVGFza0N1cnJab25lLCB0YXJnZXRab25lLCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncylcbiAgICAgICAgICAgICAgICA6IHRhc2suY2FsbGJhY2suYXBwbHkoYXBwbHlUaGlzLCBhcHBseUFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGNhbmNlbFRhc2sodGFyZ2V0Wm9uZSwgdGFzaykge1xuICAgICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NhbmNlbFRhc2taUykge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5fY2FuY2VsVGFza1pTLm9uQ2FuY2VsVGFzayh0aGlzLl9jYW5jZWxUYXNrRGxndCwgdGhpcy5fY2FuY2VsVGFza0N1cnJab25lLCB0YXJnZXRab25lLCB0YXNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghdGFzay5jYW5jZWxGbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignVGFzayBpcyBub3QgY2FuY2VsYWJsZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRhc2suY2FuY2VsRm4odGFzayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaGFzVGFzayh0YXJnZXRab25lLCBpc0VtcHR5KSB7XG4gICAgICAgICAgICAvLyBoYXNUYXNrIHNob3VsZCBub3QgdGhyb3cgZXJyb3Igc28gb3RoZXIgWm9uZURlbGVnYXRlXG4gICAgICAgICAgICAvLyBjYW4gc3RpbGwgdHJpZ2dlciBoYXNUYXNrIGNhbGxiYWNrXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2taUyAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYXNUYXNrWlMub25IYXNUYXNrKHRoaXMuX2hhc1Rhc2tEbGd0LCB0aGlzLl9oYXNUYXNrQ3VyclpvbmUsIHRhcmdldFpvbmUsIGlzRW1wdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IodGFyZ2V0Wm9uZSwgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6cmVxdWlyZS1pbnRlcm5hbC13aXRoLXVuZGVyc2NvcmVcbiAgICAgICAgX3VwZGF0ZVRhc2tDb3VudCh0eXBlLCBjb3VudCkge1xuICAgICAgICAgICAgY29uc3QgY291bnRzID0gdGhpcy5fdGFza0NvdW50cztcbiAgICAgICAgICAgIGNvbnN0IHByZXYgPSBjb3VudHNbdHlwZV07XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gKGNvdW50c1t0eXBlXSA9IHByZXYgKyBjb3VudCk7XG4gICAgICAgICAgICBpZiAobmV4dCA8IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01vcmUgdGFza3MgZXhlY3V0ZWQgdGhlbiB3ZXJlIHNjaGVkdWxlZC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcmV2ID09IDAgfHwgbmV4dCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNFbXB0eSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbWljcm9UYXNrOiBjb3VudHNbJ21pY3JvVGFzayddID4gMCxcbiAgICAgICAgICAgICAgICAgICAgbWFjcm9UYXNrOiBjb3VudHNbJ21hY3JvVGFzayddID4gMCxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUYXNrOiBjb3VudHNbJ2V2ZW50VGFzayddID4gMCxcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlOiB0eXBlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNUYXNrKHRoaXMuX3pvbmUsIGlzRW1wdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNsYXNzIFpvbmVUYXNrIHtcbiAgICAgICAgY29uc3RydWN0b3IodHlwZSwgc291cmNlLCBjYWxsYmFjaywgb3B0aW9ucywgc2NoZWR1bGVGbiwgY2FuY2VsRm4pIHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpyZXF1aXJlLWludGVybmFsLXdpdGgtdW5kZXJzY29yZVxuICAgICAgICAgICAgdGhpcy5fem9uZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnJ1bkNvdW50ID0gMDtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpyZXF1aXJlLWludGVybmFsLXdpdGgtdW5kZXJzY29yZVxuICAgICAgICAgICAgdGhpcy5fem9uZURlbGVnYXRlcyA9IG51bGw7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6cmVxdWlyZS1pbnRlcm5hbC13aXRoLXVuZGVyc2NvcmVcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ25vdFNjaGVkdWxlZCc7XG4gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBvcHRpb25zO1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUZuID0gc2NoZWR1bGVGbjtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsRm4gPSBjYW5jZWxGbjtcbiAgICAgICAgICAgIGlmICghY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxiYWNrIGlzIG5vdCBkZWZpbmVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgICAgIC8vIFRPRE86IEBKaWFMaVBhc3Npb24gb3B0aW9ucyBzaG91bGQgaGF2ZSBpbnRlcmZhY2VcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBldmVudFRhc2sgJiYgb3B0aW9ucyAmJiBvcHRpb25zLnVzZUcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmludm9rZSA9IFpvbmVUYXNrLmludm9rZVRhc2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmludm9rZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFpvbmVUYXNrLmludm9rZVRhc2suY2FsbChnbG9iYWwsIHNlbGYsIHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgaW52b2tlVGFzayh0YXNrLCB0YXJnZXQsIGFyZ3MpIHtcbiAgICAgICAgICAgIGlmICghdGFzaykge1xuICAgICAgICAgICAgICAgIHRhc2sgPSB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcysrO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0YXNrLnJ1bkNvdW50Kys7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhc2suem9uZS5ydW5UYXNrKHRhc2ssIHRhcmdldCwgYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBpZiAoX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcyA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGRyYWluTWljcm9UYXNrUXVldWUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcy0tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldCB6b25lKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHN0YXRlKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICAgICAgICB9XG4gICAgICAgIGNhbmNlbFNjaGVkdWxlUmVxdWVzdCgpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25Ubyhub3RTY2hlZHVsZWQsIHNjaGVkdWxpbmcpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpyZXF1aXJlLWludGVybmFsLXdpdGgtdW5kZXJzY29yZVxuICAgICAgICBfdHJhbnNpdGlvblRvKHRvU3RhdGUsIGZyb21TdGF0ZTEsIGZyb21TdGF0ZTIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gZnJvbVN0YXRlMSB8fCB0aGlzLl9zdGF0ZSA9PT0gZnJvbVN0YXRlMikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gdG9TdGF0ZTtcbiAgICAgICAgICAgICAgICBpZiAodG9TdGF0ZSA9PSBub3RTY2hlZHVsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fem9uZURlbGVnYXRlcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMudHlwZX0gJyR7dGhpcy5zb3VyY2V9JzogY2FuIG5vdCB0cmFuc2l0aW9uIHRvICcke3RvU3RhdGV9JywgZXhwZWN0aW5nIHN0YXRlICcke2Zyb21TdGF0ZTF9JyR7ZnJvbVN0YXRlMiA/IFwiIG9yICdcIiArIGZyb21TdGF0ZTIgKyBcIidcIiA6ICcnfSwgd2FzICcke3RoaXMuX3N0YXRlfScuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdG9TdHJpbmcoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhICYmIHR5cGVvZiB0aGlzLmRhdGEuaGFuZGxlSWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5oYW5kbGVJZC50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBhZGQgdG9KU09OIG1ldGhvZCB0byBwcmV2ZW50IGN5Y2xpYyBlcnJvciB3aGVuXG4gICAgICAgIC8vIGNhbGwgSlNPTi5zdHJpbmdpZnkoem9uZVRhc2spXG4gICAgICAgIHRvSlNPTigpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgICAgIHN0YXRlOiB0aGlzLnN0YXRlLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICAgICAgem9uZTogdGhpcy56b25lLm5hbWUsXG4gICAgICAgICAgICAgICAgcnVuQ291bnQ6IHRoaXMucnVuQ291bnQsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vLyAgTUlDUk9UQVNLIFFVRVVFXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgY29uc3Qgc3ltYm9sU2V0VGltZW91dCA9IF9fc3ltYm9sX18oJ3NldFRpbWVvdXQnKTtcbiAgICBjb25zdCBzeW1ib2xQcm9taXNlID0gX19zeW1ib2xfXygnUHJvbWlzZScpO1xuICAgIGNvbnN0IHN5bWJvbFRoZW4gPSBfX3N5bWJvbF9fKCd0aGVuJyk7XG4gICAgbGV0IF9taWNyb1Rhc2tRdWV1ZSA9IFtdO1xuICAgIGxldCBfaXNEcmFpbmluZ01pY3JvdGFza1F1ZXVlID0gZmFsc2U7XG4gICAgbGV0IG5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZTtcbiAgICBmdW5jdGlvbiBuYXRpdmVTY2hlZHVsZU1pY3JvVGFzayhmdW5jKSB7XG4gICAgICAgIGlmICghbmF0aXZlTWljcm9UYXNrUXVldWVQcm9taXNlKSB7XG4gICAgICAgICAgICBpZiAoZ2xvYmFsW3N5bWJvbFByb21pc2VdKSB7XG4gICAgICAgICAgICAgICAgbmF0aXZlTWljcm9UYXNrUXVldWVQcm9taXNlID0gZ2xvYmFsW3N5bWJvbFByb21pc2VdLnJlc29sdmUoMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZSkge1xuICAgICAgICAgICAgbGV0IG5hdGl2ZVRoZW4gPSBuYXRpdmVNaWNyb1Rhc2tRdWV1ZVByb21pc2Vbc3ltYm9sVGhlbl07XG4gICAgICAgICAgICBpZiAoIW5hdGl2ZVRoZW4pIHtcbiAgICAgICAgICAgICAgICAvLyBuYXRpdmUgUHJvbWlzZSBpcyBub3QgcGF0Y2hhYmxlLCB3ZSBuZWVkIHRvIHVzZSBgdGhlbmAgZGlyZWN0bHlcbiAgICAgICAgICAgICAgICAvLyBpc3N1ZSAxMDc4XG4gICAgICAgICAgICAgICAgbmF0aXZlVGhlbiA9IG5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZVsndGhlbiddO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmF0aXZlVGhlbi5jYWxsKG5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZSwgZnVuYyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBnbG9iYWxbc3ltYm9sU2V0VGltZW91dF0oZnVuYywgMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gc2NoZWR1bGVNaWNyb1Rhc2sodGFzaykge1xuICAgICAgICAvLyBpZiB3ZSBhcmUgbm90IHJ1bm5pbmcgaW4gYW55IHRhc2ssIGFuZCB0aGVyZSBoYXMgbm90IGJlZW4gYW55dGhpbmcgc2NoZWR1bGVkXG4gICAgICAgIC8vIHdlIG11c3QgYm9vdHN0cmFwIHRoZSBpbml0aWFsIHRhc2sgY3JlYXRpb24gYnkgbWFudWFsbHkgc2NoZWR1bGluZyB0aGUgZHJhaW5cbiAgICAgICAgaWYgKF9udW1iZXJPZk5lc3RlZFRhc2tGcmFtZXMgPT09IDAgJiYgX21pY3JvVGFza1F1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gV2UgYXJlIG5vdCBydW5uaW5nIGluIFRhc2ssIHNvIHdlIG5lZWQgdG8ga2lja3N0YXJ0IHRoZSBtaWNyb3Rhc2sgcXVldWUuXG4gICAgICAgICAgICBuYXRpdmVTY2hlZHVsZU1pY3JvVGFzayhkcmFpbk1pY3JvVGFza1F1ZXVlKTtcbiAgICAgICAgfVxuICAgICAgICB0YXNrICYmIF9taWNyb1Rhc2tRdWV1ZS5wdXNoKHRhc2spO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkcmFpbk1pY3JvVGFza1F1ZXVlKCkge1xuICAgICAgICBpZiAoIV9pc0RyYWluaW5nTWljcm90YXNrUXVldWUpIHtcbiAgICAgICAgICAgIF9pc0RyYWluaW5nTWljcm90YXNrUXVldWUgPSB0cnVlO1xuICAgICAgICAgICAgd2hpbGUgKF9taWNyb1Rhc2tRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBxdWV1ZSA9IF9taWNyb1Rhc2tRdWV1ZTtcbiAgICAgICAgICAgICAgICBfbWljcm9UYXNrUXVldWUgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhc2sgPSBxdWV1ZVtpXTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suem9uZS5ydW5UYXNrKHRhc2ssIG51bGwsIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2FwaS5vblVuaGFuZGxlZEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9hcGkubWljcm90YXNrRHJhaW5Eb25lKCk7XG4gICAgICAgICAgICBfaXNEcmFpbmluZ01pY3JvdGFza1F1ZXVlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8vICBCT09UU1RSQVBcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICBjb25zdCBOT19aT05FID0geyBuYW1lOiAnTk8gWk9ORScgfTtcbiAgICBjb25zdCBub3RTY2hlZHVsZWQgPSAnbm90U2NoZWR1bGVkJywgc2NoZWR1bGluZyA9ICdzY2hlZHVsaW5nJywgc2NoZWR1bGVkID0gJ3NjaGVkdWxlZCcsIHJ1bm5pbmcgPSAncnVubmluZycsIGNhbmNlbGluZyA9ICdjYW5jZWxpbmcnLCB1bmtub3duID0gJ3Vua25vd24nO1xuICAgIGNvbnN0IG1pY3JvVGFzayA9ICdtaWNyb1Rhc2snLCBtYWNyb1Rhc2sgPSAnbWFjcm9UYXNrJywgZXZlbnRUYXNrID0gJ2V2ZW50VGFzayc7XG4gICAgY29uc3QgcGF0Y2hlcyA9IHt9O1xuICAgIGNvbnN0IF9hcGkgPSB7XG4gICAgICAgIHN5bWJvbDogX19zeW1ib2xfXyxcbiAgICAgICAgY3VycmVudFpvbmVGcmFtZTogKCkgPT4gX2N1cnJlbnRab25lRnJhbWUsXG4gICAgICAgIG9uVW5oYW5kbGVkRXJyb3I6IG5vb3AsXG4gICAgICAgIG1pY3JvdGFza0RyYWluRG9uZTogbm9vcCxcbiAgICAgICAgc2NoZWR1bGVNaWNyb1Rhc2s6IHNjaGVkdWxlTWljcm9UYXNrLFxuICAgICAgICBzaG93VW5jYXVnaHRFcnJvcjogKCkgPT4gIVpvbmVJbXBsW19fc3ltYm9sX18oJ2lnbm9yZUNvbnNvbGVFcnJvclVuY2F1Z2h0RXJyb3InKV0sXG4gICAgICAgIHBhdGNoRXZlbnRUYXJnZXQ6ICgpID0+IFtdLFxuICAgICAgICBwYXRjaE9uUHJvcGVydGllczogbm9vcCxcbiAgICAgICAgcGF0Y2hNZXRob2Q6ICgpID0+IG5vb3AsXG4gICAgICAgIGJpbmRBcmd1bWVudHM6ICgpID0+IFtdLFxuICAgICAgICBwYXRjaFRoZW46ICgpID0+IG5vb3AsXG4gICAgICAgIHBhdGNoTWFjcm9UYXNrOiAoKSA9PiBub29wLFxuICAgICAgICBwYXRjaEV2ZW50UHJvdG90eXBlOiAoKSA9PiBub29wLFxuICAgICAgICBpc0lFT3JFZGdlOiAoKSA9PiBmYWxzZSxcbiAgICAgICAgZ2V0R2xvYmFsT2JqZWN0czogKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgICBPYmplY3REZWZpbmVQcm9wZXJ0eTogKCkgPT4gbm9vcCxcbiAgICAgICAgT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAoKSA9PiB1bmRlZmluZWQsXG4gICAgICAgIE9iamVjdENyZWF0ZTogKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgICBBcnJheVNsaWNlOiAoKSA9PiBbXSxcbiAgICAgICAgcGF0Y2hDbGFzczogKCkgPT4gbm9vcCxcbiAgICAgICAgd3JhcFdpdGhDdXJyZW50Wm9uZTogKCkgPT4gbm9vcCxcbiAgICAgICAgZmlsdGVyUHJvcGVydGllczogKCkgPT4gW10sXG4gICAgICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZDogKCkgPT4gbm9vcCxcbiAgICAgICAgX3JlZGVmaW5lUHJvcGVydHk6ICgpID0+IG5vb3AsXG4gICAgICAgIHBhdGNoQ2FsbGJhY2tzOiAoKSA9PiBub29wLFxuICAgICAgICBuYXRpdmVTY2hlZHVsZU1pY3JvVGFzazogbmF0aXZlU2NoZWR1bGVNaWNyb1Rhc2ssXG4gICAgfTtcbiAgICBsZXQgX2N1cnJlbnRab25lRnJhbWUgPSB7IHBhcmVudDogbnVsbCwgem9uZTogbmV3IFpvbmVJbXBsKG51bGwsIG51bGwpIH07XG4gICAgbGV0IF9jdXJyZW50VGFzayA9IG51bGw7XG4gICAgbGV0IF9udW1iZXJPZk5lc3RlZFRhc2tGcmFtZXMgPSAwO1xuICAgIGZ1bmN0aW9uIG5vb3AoKSB7IH1cbiAgICBwZXJmb3JtYW5jZU1lYXN1cmUoJ1pvbmUnLCAnWm9uZScpO1xuICAgIHJldHVybiBab25lSW1wbDtcbn1cblxuZnVuY3Rpb24gbG9hZFpvbmUoKSB7XG4gICAgLy8gaWYgZ2xvYmFsWydab25lJ10gYWxyZWFkeSBleGlzdHMgKG1heWJlIHpvbmUuanMgd2FzIGFscmVhZHkgbG9hZGVkIG9yXG4gICAgLy8gc29tZSBvdGhlciBsaWIgYWxzbyByZWdpc3RlcmVkIGEgZ2xvYmFsIG9iamVjdCBuYW1lZCBab25lKSwgd2UgbWF5IG5lZWRcbiAgICAvLyB0byB0aHJvdyBhbiBlcnJvciwgYnV0IHNvbWV0aW1lcyB1c2VyIG1heSBub3Qgd2FudCB0aGlzIGVycm9yLlxuICAgIC8vIEZvciBleGFtcGxlLFxuICAgIC8vIHdlIGhhdmUgdHdvIHdlYiBwYWdlcywgcGFnZTEgaW5jbHVkZXMgem9uZS5qcywgcGFnZTIgZG9lc24ndC5cbiAgICAvLyBhbmQgdGhlIDFzdCB0aW1lIHVzZXIgbG9hZCBwYWdlMSBhbmQgcGFnZTIsIGV2ZXJ5dGhpbmcgd29yayBmaW5lLFxuICAgIC8vIGJ1dCB3aGVuIHVzZXIgbG9hZCBwYWdlMiBhZ2FpbiwgZXJyb3Igb2NjdXJzIGJlY2F1c2UgZ2xvYmFsWydab25lJ10gYWxyZWFkeSBleGlzdHMuXG4gICAgLy8gc28gd2UgYWRkIGEgZmxhZyB0byBsZXQgdXNlciBjaG9vc2Ugd2hldGhlciB0byB0aHJvdyB0aGlzIGVycm9yIG9yIG5vdC5cbiAgICAvLyBCeSBkZWZhdWx0LCBpZiBleGlzdGluZyBab25lIGlzIGZyb20gem9uZS5qcywgd2Ugd2lsbCBub3QgdGhyb3cgdGhlIGVycm9yLlxuICAgIGNvbnN0IGdsb2JhbCA9IGdsb2JhbFRoaXM7XG4gICAgY29uc3QgY2hlY2tEdXBsaWNhdGUgPSBnbG9iYWxbX19zeW1ib2xfXygnZm9yY2VEdXBsaWNhdGVab25lQ2hlY2snKV0gPT09IHRydWU7XG4gICAgaWYgKGdsb2JhbFsnWm9uZSddICYmIChjaGVja0R1cGxpY2F0ZSB8fCB0eXBlb2YgZ2xvYmFsWydab25lJ10uX19zeW1ib2xfXyAhPT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdab25lIGFscmVhZHkgbG9hZGVkLicpO1xuICAgIH1cbiAgICAvLyBJbml0aWFsaXplIGdsb2JhbCBgWm9uZWAgY29uc3RhbnQuXG4gICAgZ2xvYmFsWydab25lJ10gPz89IGluaXRab25lKCk7XG4gICAgcmV0dXJuIGdsb2JhbFsnWm9uZSddO1xufVxuXG4vKipcbiAqIFN1cHByZXNzIGNsb3N1cmUgY29tcGlsZXIgZXJyb3JzIGFib3V0IHVua25vd24gJ1pvbmUnIHZhcmlhYmxlXG4gKiBAZmlsZW92ZXJ2aWV3XG4gKiBAc3VwcHJlc3Mge3VuZGVmaW5lZFZhcnMsZ2xvYmFsVGhpcyxtaXNzaW5nUmVxdWlyZX1cbiAqL1xuLy8gaXNzdWUgIzk4OSwgdG8gcmVkdWNlIGJ1bmRsZSBzaXplLCB1c2Ugc2hvcnQgbmFtZVxuLyoqIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgKi9cbmNvbnN0IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4vKiogT2JqZWN0LmRlZmluZVByb3BlcnR5ICovXG5jb25zdCBPYmplY3REZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbi8qKiBPYmplY3QuZ2V0UHJvdG90eXBlT2YgKi9cbmNvbnN0IE9iamVjdEdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuLyoqIE9iamVjdC5jcmVhdGUgKi9cbmNvbnN0IE9iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGU7XG4vKiogQXJyYXkucHJvdG90eXBlLnNsaWNlICovXG5jb25zdCBBcnJheVNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuLyoqIGFkZEV2ZW50TGlzdGVuZXIgc3RyaW5nIGNvbnN0ICovXG5jb25zdCBBRERfRVZFTlRfTElTVEVORVJfU1RSID0gJ2FkZEV2ZW50TGlzdGVuZXInO1xuLyoqIHJlbW92ZUV2ZW50TGlzdGVuZXIgc3RyaW5nIGNvbnN0ICovXG5jb25zdCBSRU1PVkVfRVZFTlRfTElTVEVORVJfU1RSID0gJ3JlbW92ZUV2ZW50TGlzdGVuZXInO1xuLyoqIHpvbmVTeW1ib2wgYWRkRXZlbnRMaXN0ZW5lciAqL1xuY29uc3QgWk9ORV9TWU1CT0xfQUREX0VWRU5UX0xJU1RFTkVSID0gX19zeW1ib2xfXyhBRERfRVZFTlRfTElTVEVORVJfU1RSKTtcbi8qKiB6b25lU3ltYm9sIHJlbW92ZUV2ZW50TGlzdGVuZXIgKi9cbmNvbnN0IFpPTkVfU1lNQk9MX1JFTU9WRV9FVkVOVF9MSVNURU5FUiA9IF9fc3ltYm9sX18oUkVNT1ZFX0VWRU5UX0xJU1RFTkVSX1NUUik7XG4vKiogdHJ1ZSBzdHJpbmcgY29uc3QgKi9cbmNvbnN0IFRSVUVfU1RSID0gJ3RydWUnO1xuLyoqIGZhbHNlIHN0cmluZyBjb25zdCAqL1xuY29uc3QgRkFMU0VfU1RSID0gJ2ZhbHNlJztcbi8qKiBab25lIHN5bWJvbCBwcmVmaXggc3RyaW5nIGNvbnN0LiAqL1xuY29uc3QgWk9ORV9TWU1CT0xfUFJFRklYID0gX19zeW1ib2xfXygnJyk7XG5mdW5jdGlvbiB3cmFwV2l0aEN1cnJlbnRab25lKGNhbGxiYWNrLCBzb3VyY2UpIHtcbiAgICByZXR1cm4gWm9uZS5jdXJyZW50LndyYXAoY2FsbGJhY2ssIHNvdXJjZSk7XG59XG5mdW5jdGlvbiBzY2hlZHVsZU1hY3JvVGFza1dpdGhDdXJyZW50Wm9uZShzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgY3VzdG9tQ2FuY2VsKSB7XG4gICAgcmV0dXJuIFpvbmUuY3VycmVudC5zY2hlZHVsZU1hY3JvVGFzayhzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgY3VzdG9tQ2FuY2VsKTtcbn1cbmNvbnN0IHpvbmVTeW1ib2wgPSBfX3N5bWJvbF9fO1xuY29uc3QgaXNXaW5kb3dFeGlzdHMgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJztcbmNvbnN0IGludGVybmFsV2luZG93ID0gaXNXaW5kb3dFeGlzdHMgPyB3aW5kb3cgOiB1bmRlZmluZWQ7XG5jb25zdCBfZ2xvYmFsID0gKGlzV2luZG93RXhpc3RzICYmIGludGVybmFsV2luZG93KSB8fCBnbG9iYWxUaGlzO1xuY29uc3QgUkVNT1ZFX0FUVFJJQlVURSA9ICdyZW1vdmVBdHRyaWJ1dGUnO1xuZnVuY3Rpb24gYmluZEFyZ3VtZW50cyhhcmdzLCBzb3VyY2UpIHtcbiAgICBmb3IgKGxldCBpID0gYXJncy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBpZiAodHlwZW9mIGFyZ3NbaV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGFyZ3NbaV0gPSB3cmFwV2l0aEN1cnJlbnRab25lKGFyZ3NbaV0sIHNvdXJjZSArICdfJyArIGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xufVxuZnVuY3Rpb24gcGF0Y2hQcm90b3R5cGUocHJvdG90eXBlLCBmbk5hbWVzKSB7XG4gICAgY29uc3Qgc291cmNlID0gcHJvdG90eXBlLmNvbnN0cnVjdG9yWyduYW1lJ107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmbk5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBmbk5hbWVzW2ldO1xuICAgICAgICBjb25zdCBkZWxlZ2F0ZSA9IHByb3RvdHlwZVtuYW1lXTtcbiAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBwcm90b3R5cGVEZXNjID0gT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvdHlwZSwgbmFtZSk7XG4gICAgICAgICAgICBpZiAoIWlzUHJvcGVydHlXcml0YWJsZShwcm90b3R5cGVEZXNjKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJvdG90eXBlW25hbWVdID0gKChkZWxlZ2F0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGNoZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5hcHBseSh0aGlzLCBiaW5kQXJndW1lbnRzKGFyZ3VtZW50cywgc291cmNlICsgJy4nICsgbmFtZSkpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYXR0YWNoT3JpZ2luVG9QYXRjaGVkKHBhdGNoZWQsIGRlbGVnYXRlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF0Y2hlZDtcbiAgICAgICAgICAgIH0pKGRlbGVnYXRlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGlzUHJvcGVydHlXcml0YWJsZShwcm9wZXJ0eURlc2MpIHtcbiAgICBpZiAoIXByb3BlcnR5RGVzYykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHByb3BlcnR5RGVzYy53cml0YWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gISh0eXBlb2YgcHJvcGVydHlEZXNjLmdldCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgcHJvcGVydHlEZXNjLnNldCA9PT0gJ3VuZGVmaW5lZCcpO1xufVxuY29uc3QgaXNXZWJXb3JrZXIgPSB0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT09ICd1bmRlZmluZWQnICYmIHNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZTtcbi8vIE1ha2Ugc3VyZSB0byBhY2Nlc3MgYHByb2Nlc3NgIHRocm91Z2ggYF9nbG9iYWxgIHNvIHRoYXQgV2ViUGFjayBkb2VzIG5vdCBhY2NpZGVudGFsbHkgYnJvd3NlcmlmeVxuLy8gdGhpcyBjb2RlLlxuY29uc3QgaXNOb2RlID0gISgnbncnIGluIF9nbG9iYWwpICYmXG4gICAgdHlwZW9mIF9nbG9iYWwucHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICBfZ2xvYmFsLnByb2Nlc3MudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgcHJvY2Vzc10nO1xuY29uc3QgaXNCcm93c2VyID0gIWlzTm9kZSAmJiAhaXNXZWJXb3JrZXIgJiYgISEoaXNXaW5kb3dFeGlzdHMgJiYgaW50ZXJuYWxXaW5kb3dbJ0hUTUxFbGVtZW50J10pO1xuLy8gd2UgYXJlIGluIGVsZWN0cm9uIG9mIG53LCBzbyB3ZSBhcmUgYm90aCBicm93c2VyIGFuZCBub2RlanNcbi8vIE1ha2Ugc3VyZSB0byBhY2Nlc3MgYHByb2Nlc3NgIHRocm91Z2ggYF9nbG9iYWxgIHNvIHRoYXQgV2ViUGFjayBkb2VzIG5vdCBhY2NpZGVudGFsbHkgYnJvd3NlcmlmeVxuLy8gdGhpcyBjb2RlLlxuY29uc3QgaXNNaXggPSB0eXBlb2YgX2dsb2JhbC5wcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIF9nbG9iYWwucHJvY2Vzcy50b1N0cmluZygpID09PSAnW29iamVjdCBwcm9jZXNzXScgJiZcbiAgICAhaXNXZWJXb3JrZXIgJiZcbiAgICAhIShpc1dpbmRvd0V4aXN0cyAmJiBpbnRlcm5hbFdpbmRvd1snSFRNTEVsZW1lbnQnXSk7XG5jb25zdCB6b25lU3ltYm9sRXZlbnROYW1lcyQxID0ge307XG5jb25zdCBlbmFibGVCZWZvcmV1bmxvYWRTeW1ib2wgPSB6b25lU3ltYm9sKCdlbmFibGVfYmVmb3JldW5sb2FkJyk7XG5jb25zdCB3cmFwRm4gPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy85MTEsIGluIElFLCBzb21ldGltZXNcbiAgICAvLyBldmVudCB3aWxsIGJlIHVuZGVmaW5lZCwgc28gd2UgbmVlZCB0byB1c2Ugd2luZG93LmV2ZW50XG4gICAgZXZlbnQgPSBldmVudCB8fCBfZ2xvYmFsLmV2ZW50O1xuICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgZXZlbnROYW1lU3ltYm9sID0gem9uZVN5bWJvbEV2ZW50TmFtZXMkMVtldmVudC50eXBlXTtcbiAgICBpZiAoIWV2ZW50TmFtZVN5bWJvbCkge1xuICAgICAgICBldmVudE5hbWVTeW1ib2wgPSB6b25lU3ltYm9sRXZlbnROYW1lcyQxW2V2ZW50LnR5cGVdID0gem9uZVN5bWJvbCgnT05fUFJPUEVSVFknICsgZXZlbnQudHlwZSk7XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMgfHwgZXZlbnQudGFyZ2V0IHx8IF9nbG9iYWw7XG4gICAgY29uc3QgbGlzdGVuZXIgPSB0YXJnZXRbZXZlbnROYW1lU3ltYm9sXTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmIChpc0Jyb3dzZXIgJiYgdGFyZ2V0ID09PSBpbnRlcm5hbFdpbmRvdyAmJiBldmVudC50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAgIC8vIHdpbmRvdy5vbmVycm9yIGhhdmUgZGlmZmVyZW50IHNpZ25hdHVyZVxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvR2xvYmFsRXZlbnRIYW5kbGVycy9vbmVycm9yI3dpbmRvdy5vbmVycm9yXG4gICAgICAgIC8vIGFuZCBvbmVycm9yIGNhbGxiYWNrIHdpbGwgcHJldmVudCBkZWZhdWx0IHdoZW4gY2FsbGJhY2sgcmV0dXJuIHRydWVcbiAgICAgICAgY29uc3QgZXJyb3JFdmVudCA9IGV2ZW50O1xuICAgICAgICByZXN1bHQgPVxuICAgICAgICAgICAgbGlzdGVuZXIgJiZcbiAgICAgICAgICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGVycm9yRXZlbnQubWVzc2FnZSwgZXJyb3JFdmVudC5maWxlbmFtZSwgZXJyb3JFdmVudC5saW5lbm8sIGVycm9yRXZlbnQuY29sbm8sIGVycm9yRXZlbnQuZXJyb3IpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBsaXN0ZW5lciAmJiBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICBpZiAoXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzQ3NTc5XG4gICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDExL1dELWh0bWw1LTIwMTEwNTI1L2hpc3RvcnkuaHRtbCNiZWZvcmV1bmxvYWRldmVudFxuICAgICAgICAvLyBUaGlzIGlzIHRoZSBvbmx5IHNwZWNpZmljIGNhc2Ugd2Ugc2hvdWxkIGNoZWNrIGZvci4gVGhlIHNwZWMgZGVmaW5lcyB0aGF0IHRoZVxuICAgICAgICAvLyBgcmV0dXJuVmFsdWVgIGF0dHJpYnV0ZSByZXByZXNlbnRzIHRoZSBtZXNzYWdlIHRvIHNob3cgdGhlIHVzZXIuIFdoZW4gdGhlIGV2ZW50XG4gICAgICAgIC8vIGlzIGNyZWF0ZWQsIHRoaXMgYXR0cmlidXRlIG11c3QgYmUgc2V0IHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gICAgICAgIGV2ZW50LnR5cGUgPT09ICdiZWZvcmV1bmxvYWQnICYmXG4gICAgICAgICAgICAvLyBUbyBwcmV2ZW50IGFueSBicmVha2luZyBjaGFuZ2VzIHJlc3VsdGluZyBmcm9tIHRoaXMgY2hhbmdlLCBnaXZlbiB0aGF0XG4gICAgICAgICAgICAvLyBpdCB3YXMgYWxyZWFkeSBjYXVzaW5nIGEgc2lnbmlmaWNhbnQgbnVtYmVyIG9mIGZhaWx1cmVzIGluIEczLCB3ZSBoYXZlIGhpZGRlblxuICAgICAgICAgICAgLy8gdGhhdCBiZWhhdmlvciBiZWhpbmQgYSBnbG9iYWwgY29uZmlndXJhdGlvbiBmbGFnLiBDb25zdW1lcnMgY2FuIGVuYWJsZSB0aGlzXG4gICAgICAgICAgICAvLyBmbGFnIGV4cGxpY2l0bHkgaWYgdGhleSB3YW50IHRoZSBgYmVmb3JldW5sb2FkYCBldmVudCB0byBiZSBoYW5kbGVkIGFzIGRlZmluZWRcbiAgICAgICAgICAgIC8vIGluIHRoZSBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgICAgX2dsb2JhbFtlbmFibGVCZWZvcmV1bmxvYWRTeW1ib2xdICYmXG4gICAgICAgICAgICAvLyBUaGUgSURMIGV2ZW50IGRlZmluaXRpb24gaXMgYGF0dHJpYnV0ZSBET01TdHJpbmcgcmV0dXJuVmFsdWVgLCBzbyB3ZSBjaGVjayB3aGV0aGVyXG4gICAgICAgICAgICAvLyBgdHlwZW9mIHJlc3VsdGAgaXMgYSBzdHJpbmcuXG4gICAgICAgICAgICB0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVzdWx0ICE9IHVuZGVmaW5lZCAmJiAhcmVzdWx0KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuZnVuY3Rpb24gcGF0Y2hQcm9wZXJ0eShvYmosIHByb3AsIHByb3RvdHlwZSkge1xuICAgIGxldCBkZXNjID0gT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgcHJvcCk7XG4gICAgaWYgKCFkZXNjICYmIHByb3RvdHlwZSkge1xuICAgICAgICAvLyB3aGVuIHBhdGNoIHdpbmRvdyBvYmplY3QsIHVzZSBwcm90b3R5cGUgdG8gY2hlY2sgcHJvcCBleGlzdCBvciBub3RcbiAgICAgICAgY29uc3QgcHJvdG90eXBlRGVzYyA9IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90b3R5cGUsIHByb3ApO1xuICAgICAgICBpZiAocHJvdG90eXBlRGVzYykge1xuICAgICAgICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gaWYgdGhlIGRlc2NyaXB0b3Igbm90IGV4aXN0cyBvciBpcyBub3QgY29uZmlndXJhYmxlXG4gICAgLy8ganVzdCByZXR1cm5cbiAgICBpZiAoIWRlc2MgfHwgIWRlc2MuY29uZmlndXJhYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb25Qcm9wUGF0Y2hlZFN5bWJvbCA9IHpvbmVTeW1ib2woJ29uJyArIHByb3AgKyAncGF0Y2hlZCcpO1xuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkob25Qcm9wUGF0Y2hlZFN5bWJvbCkgJiYgb2JqW29uUHJvcFBhdGNoZWRTeW1ib2xdKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGNhbm5vdCBoYXZlIGdldHRlci9zZXR0ZXIgYW5kIGJlIHdyaXRhYmxlXG4gICAgLy8gZGVsZXRpbmcgdGhlIHdyaXRhYmxlIGFuZCB2YWx1ZSBwcm9wZXJ0aWVzIGF2b2lkcyB0aGlzIGVycm9yOlxuICAgIC8vXG4gICAgLy8gVHlwZUVycm9yOiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBtdXN0IG5vdCBzcGVjaWZ5IGEgdmFsdWUgb3IgYmUgd3JpdGFibGUgd2hlbiBhXG4gICAgLy8gZ2V0dGVyIG9yIHNldHRlciBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICBkZWxldGUgZGVzYy53cml0YWJsZTtcbiAgICBkZWxldGUgZGVzYy52YWx1ZTtcbiAgICBjb25zdCBvcmlnaW5hbERlc2NHZXQgPSBkZXNjLmdldDtcbiAgICBjb25zdCBvcmlnaW5hbERlc2NTZXQgPSBkZXNjLnNldDtcbiAgICAvLyBzbGljZSgyKSBjdXogJ29uY2xpY2snIC0+ICdjbGljaycsIGV0Y1xuICAgIGNvbnN0IGV2ZW50TmFtZSA9IHByb3Auc2xpY2UoMik7XG4gICAgbGV0IGV2ZW50TmFtZVN5bWJvbCA9IHpvbmVTeW1ib2xFdmVudE5hbWVzJDFbZXZlbnROYW1lXTtcbiAgICBpZiAoIWV2ZW50TmFtZVN5bWJvbCkge1xuICAgICAgICBldmVudE5hbWVTeW1ib2wgPSB6b25lU3ltYm9sRXZlbnROYW1lcyQxW2V2ZW50TmFtZV0gPSB6b25lU3ltYm9sKCdPTl9QUk9QRVJUWScgKyBldmVudE5hbWUpO1xuICAgIH1cbiAgICBkZXNjLnNldCA9IGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgICAvLyBpbiBzb21lIG9mIHdpbmRvd3MncyBvbnByb3BlcnR5IGNhbGxiYWNrLCB0aGlzIGlzIHVuZGVmaW5lZFxuICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIGNoZWNrIGl0XG4gICAgICAgIGxldCB0YXJnZXQgPSB0aGlzO1xuICAgICAgICBpZiAoIXRhcmdldCAmJiBvYmogPT09IF9nbG9iYWwpIHtcbiAgICAgICAgICAgIHRhcmdldCA9IF9nbG9iYWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gdGFyZ2V0W2V2ZW50TmFtZVN5bWJvbF07XG4gICAgICAgIGlmICh0eXBlb2YgcHJldmlvdXNWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCB3cmFwRm4pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlzc3VlICM5NzgsIHdoZW4gb25sb2FkIGhhbmRsZXIgd2FzIGFkZGVkIGJlZm9yZSBsb2FkaW5nIHpvbmUuanNcbiAgICAgICAgLy8gd2Ugc2hvdWxkIHJlbW92ZSBpdCB3aXRoIG9yaWdpbmFsRGVzY1NldFxuICAgICAgICBvcmlnaW5hbERlc2NTZXQgJiYgb3JpZ2luYWxEZXNjU2V0LmNhbGwodGFyZ2V0LCBudWxsKTtcbiAgICAgICAgdGFyZ2V0W2V2ZW50TmFtZVN5bWJvbF0gPSBuZXdWYWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCB3cmFwRm4sIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gVGhlIGdldHRlciB3b3VsZCByZXR1cm4gdW5kZWZpbmVkIGZvciB1bmFzc2lnbmVkIHByb3BlcnRpZXMgYnV0IHRoZSBkZWZhdWx0IHZhbHVlIG9mIGFuXG4gICAgLy8gdW5hc3NpZ25lZCBwcm9wZXJ0eSBpcyBudWxsXG4gICAgZGVzYy5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGluIHNvbWUgb2Ygd2luZG93cydzIG9ucHJvcGVydHkgY2FsbGJhY2ssIHRoaXMgaXMgdW5kZWZpbmVkXG4gICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gY2hlY2sgaXRcbiAgICAgICAgbGV0IHRhcmdldCA9IHRoaXM7XG4gICAgICAgIGlmICghdGFyZ2V0ICYmIG9iaiA9PT0gX2dsb2JhbCkge1xuICAgICAgICAgICAgdGFyZ2V0ID0gX2dsb2JhbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGlzdGVuZXIgPSB0YXJnZXRbZXZlbnROYW1lU3ltYm9sXTtcbiAgICAgICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbGlzdGVuZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3JpZ2luYWxEZXNjR2V0KSB7XG4gICAgICAgICAgICAvLyByZXN1bHQgd2lsbCBiZSBudWxsIHdoZW4gdXNlIGlubGluZSBldmVudCBhdHRyaWJ1dGUsXG4gICAgICAgICAgICAvLyBzdWNoIGFzIDxidXR0b24gb25jbGljaz1cImZ1bmMoKTtcIj5PSzwvYnV0dG9uPlxuICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgb25jbGljayBmdW5jdGlvbiBpcyBpbnRlcm5hbCByYXcgdW5jb21waWxlZCBoYW5kbGVyXG4gICAgICAgICAgICAvLyB0aGUgb25jbGljayB3aWxsIGJlIGV2YWx1YXRlZCB3aGVuIGZpcnN0IHRpbWUgZXZlbnQgd2FzIHRyaWdnZXJlZCBvclxuICAgICAgICAgICAgLy8gdGhlIHByb3BlcnR5IGlzIGFjY2Vzc2VkLCBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy81MjVcbiAgICAgICAgICAgIC8vIHNvIHdlIHNob3VsZCB1c2Ugb3JpZ2luYWwgbmF0aXZlIGdldCB0byByZXRyaWV2ZSB0aGUgaGFuZGxlclxuICAgICAgICAgICAgbGV0IHZhbHVlID0gb3JpZ2luYWxEZXNjR2V0LmNhbGwodGhpcyk7XG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBkZXNjLnNldC5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtSRU1PVkVfQVRUUklCVVRFXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKHByb3ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBPYmplY3REZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIGRlc2MpO1xuICAgIG9ialtvblByb3BQYXRjaGVkU3ltYm9sXSA9IHRydWU7XG59XG5mdW5jdGlvbiBwYXRjaE9uUHJvcGVydGllcyhvYmosIHByb3BlcnRpZXMsIHByb3RvdHlwZSkge1xuICAgIGlmIChwcm9wZXJ0aWVzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcGF0Y2hQcm9wZXJ0eShvYmosICdvbicgKyBwcm9wZXJ0aWVzW2ldLCBwcm90b3R5cGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBvblByb3BlcnRpZXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIG9iaikge1xuICAgICAgICAgICAgaWYgKHByb3Auc2xpY2UoMCwgMikgPT0gJ29uJykge1xuICAgICAgICAgICAgICAgIG9uUHJvcGVydGllcy5wdXNoKHByb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgb25Qcm9wZXJ0aWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBwYXRjaFByb3BlcnR5KG9iaiwgb25Qcm9wZXJ0aWVzW2pdLCBwcm90b3R5cGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuY29uc3Qgb3JpZ2luYWxJbnN0YW5jZUtleSA9IHpvbmVTeW1ib2woJ29yaWdpbmFsSW5zdGFuY2UnKTtcbi8vIHdyYXAgc29tZSBuYXRpdmUgQVBJIG9uIGB3aW5kb3dgXG5mdW5jdGlvbiBwYXRjaENsYXNzKGNsYXNzTmFtZSkge1xuICAgIGNvbnN0IE9yaWdpbmFsQ2xhc3MgPSBfZ2xvYmFsW2NsYXNzTmFtZV07XG4gICAgaWYgKCFPcmlnaW5hbENsYXNzKVxuICAgICAgICByZXR1cm47XG4gICAgLy8ga2VlcCBvcmlnaW5hbCBjbGFzcyBpbiBnbG9iYWxcbiAgICBfZ2xvYmFsW3pvbmVTeW1ib2woY2xhc3NOYW1lKV0gPSBPcmlnaW5hbENsYXNzO1xuICAgIF9nbG9iYWxbY2xhc3NOYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYSA9IGJpbmRBcmd1bWVudHMoYXJndW1lbnRzLCBjbGFzc05hbWUpO1xuICAgICAgICBzd2l0Y2ggKGEubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XSA9IG5ldyBPcmlnaW5hbENsYXNzKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XSA9IG5ldyBPcmlnaW5hbENsYXNzKGFbMF0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV0gPSBuZXcgT3JpZ2luYWxDbGFzcyhhWzBdLCBhWzFdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICB0aGlzW29yaWdpbmFsSW5zdGFuY2VLZXldID0gbmV3IE9yaWdpbmFsQ2xhc3MoYVswXSwgYVsxXSwgYVsyXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XSA9IG5ldyBPcmlnaW5hbENsYXNzKGFbMF0sIGFbMV0sIGFbMl0sIGFbM10pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FyZyBsaXN0IHRvbyBsb25nLicpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBhdHRhY2ggb3JpZ2luYWwgZGVsZWdhdGUgdG8gcGF0Y2hlZCBmdW5jdGlvblxuICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChfZ2xvYmFsW2NsYXNzTmFtZV0sIE9yaWdpbmFsQ2xhc3MpO1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IE9yaWdpbmFsQ2xhc3MoZnVuY3Rpb24gKCkgeyB9KTtcbiAgICBsZXQgcHJvcDtcbiAgICBmb3IgKHByb3AgaW4gaW5zdGFuY2UpIHtcbiAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ0NzIxXG4gICAgICAgIGlmIChjbGFzc05hbWUgPT09ICdYTUxIdHRwUmVxdWVzdCcgJiYgcHJvcCA9PT0gJ3Jlc3BvbnNlQmxvYicpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlW3Byb3BdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgX2dsb2JhbFtjbGFzc05hbWVdLnByb3RvdHlwZVtwcm9wXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV1bcHJvcF0uYXBwbHkodGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XSwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0RGVmaW5lUHJvcGVydHkoX2dsb2JhbFtjbGFzc05hbWVdLnByb3RvdHlwZSwgcHJvcCwge1xuICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV1bcHJvcF0gPSB3cmFwV2l0aEN1cnJlbnRab25lKGZuLCBjbGFzc05hbWUgKyAnLicgKyBwcm9wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIGNhbGxiYWNrIGluIHdyYXBwZWQgZnVuY3Rpb24gc28gd2UgY2FuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGl0IGluIEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyB0byByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbmF0aXZlIG9uZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQodGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XVtwcm9wXSwgZm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XVtwcm9wXSA9IGZuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW29yaWdpbmFsSW5zdGFuY2VLZXldW3Byb3BdO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KShwcm9wKTtcbiAgICB9XG4gICAgZm9yIChwcm9wIGluIE9yaWdpbmFsQ2xhc3MpIHtcbiAgICAgICAgaWYgKHByb3AgIT09ICdwcm90b3R5cGUnICYmIE9yaWdpbmFsQ2xhc3MuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgIF9nbG9iYWxbY2xhc3NOYW1lXVtwcm9wXSA9IE9yaWdpbmFsQ2xhc3NbcHJvcF07XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBwYXRjaE1ldGhvZCh0YXJnZXQsIG5hbWUsIHBhdGNoRm4pIHtcbiAgICBsZXQgcHJvdG8gPSB0YXJnZXQ7XG4gICAgd2hpbGUgKHByb3RvICYmICFwcm90by5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICBwcm90byA9IE9iamVjdEdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICB9XG4gICAgaWYgKCFwcm90byAmJiB0YXJnZXRbbmFtZV0pIHtcbiAgICAgICAgLy8gc29tZWhvdyB3ZSBkaWQgbm90IGZpbmQgaXQsIGJ1dCB3ZSBjYW4gc2VlIGl0LiBUaGlzIGhhcHBlbnMgb24gSUUgZm9yIFdpbmRvdyBwcm9wZXJ0aWVzLlxuICAgICAgICBwcm90byA9IHRhcmdldDtcbiAgICB9XG4gICAgY29uc3QgZGVsZWdhdGVOYW1lID0gem9uZVN5bWJvbChuYW1lKTtcbiAgICBsZXQgZGVsZWdhdGUgPSBudWxsO1xuICAgIGlmIChwcm90byAmJiAoIShkZWxlZ2F0ZSA9IHByb3RvW2RlbGVnYXRlTmFtZV0pIHx8ICFwcm90by5oYXNPd25Qcm9wZXJ0eShkZWxlZ2F0ZU5hbWUpKSkge1xuICAgICAgICBkZWxlZ2F0ZSA9IHByb3RvW2RlbGVnYXRlTmFtZV0gPSBwcm90b1tuYW1lXTtcbiAgICAgICAgLy8gY2hlY2sgd2hldGhlciBwcm90b1tuYW1lXSBpcyB3cml0YWJsZVxuICAgICAgICAvLyBzb21lIHByb3BlcnR5IGlzIHJlYWRvbmx5IGluIHNhZmFyaSwgc3VjaCBhcyBIdG1sQ2FudmFzRWxlbWVudC5wcm90b3R5cGUudG9CbG9iXG4gICAgICAgIGNvbnN0IGRlc2MgPSBwcm90byAmJiBPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIG5hbWUpO1xuICAgICAgICBpZiAoaXNQcm9wZXJ0eVdyaXRhYmxlKGRlc2MpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXRjaERlbGVnYXRlID0gcGF0Y2hGbihkZWxlZ2F0ZSwgZGVsZWdhdGVOYW1lLCBuYW1lKTtcbiAgICAgICAgICAgIHByb3RvW25hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXRjaERlbGVnYXRlKHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXR0YWNoT3JpZ2luVG9QYXRjaGVkKHByb3RvW25hbWVdLCBkZWxlZ2F0ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlbGVnYXRlO1xufVxuLy8gVE9ETzogQEppYUxpUGFzc2lvbiwgc3VwcG9ydCBjYW5jZWwgdGFzayBsYXRlciBpZiBuZWNlc3NhcnlcbmZ1bmN0aW9uIHBhdGNoTWFjcm9UYXNrKG9iaiwgZnVuY05hbWUsIG1ldGFDcmVhdG9yKSB7XG4gICAgbGV0IHNldE5hdGl2ZSA9IG51bGw7XG4gICAgZnVuY3Rpb24gc2NoZWR1bGVUYXNrKHRhc2spIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRhc2suZGF0YTtcbiAgICAgICAgZGF0YS5hcmdzW2RhdGEuY2JJZHhdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGFzay5pbnZva2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgICAgc2V0TmF0aXZlLmFwcGx5KGRhdGEudGFyZ2V0LCBkYXRhLmFyZ3MpO1xuICAgICAgICByZXR1cm4gdGFzaztcbiAgICB9XG4gICAgc2V0TmF0aXZlID0gcGF0Y2hNZXRob2Qob2JqLCBmdW5jTmFtZSwgKGRlbGVnYXRlKSA9PiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuICAgICAgICBjb25zdCBtZXRhID0gbWV0YUNyZWF0b3Ioc2VsZiwgYXJncyk7XG4gICAgICAgIGlmIChtZXRhLmNiSWR4ID49IDAgJiYgdHlwZW9mIGFyZ3NbbWV0YS5jYklkeF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBzY2hlZHVsZU1hY3JvVGFza1dpdGhDdXJyZW50Wm9uZShtZXRhLm5hbWUsIGFyZ3NbbWV0YS5jYklkeF0sIG1ldGEsIHNjaGVkdWxlVGFzayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBjYXVzZSBhbiBlcnJvciBieSBjYWxsaW5nIGl0IGRpcmVjdGx5LlxuICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQocGF0Y2hlZCwgb3JpZ2luYWwpIHtcbiAgICBwYXRjaGVkW3pvbmVTeW1ib2woJ09yaWdpbmFsRGVsZWdhdGUnKV0gPSBvcmlnaW5hbDtcbn1cbmxldCBpc0RldGVjdGVkSUVPckVkZ2UgPSBmYWxzZTtcbmxldCBpZU9yRWRnZSA9IGZhbHNlO1xuZnVuY3Rpb24gaXNJRSgpIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCB1YSA9IGludGVybmFsV2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7XG4gICAgICAgIGlmICh1YS5pbmRleE9mKCdNU0lFICcpICE9PSAtMSB8fCB1YS5pbmRleE9mKCdUcmlkZW50LycpICE9PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7IH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc0lFT3JFZGdlKCkge1xuICAgIGlmIChpc0RldGVjdGVkSUVPckVkZ2UpIHtcbiAgICAgICAgcmV0dXJuIGllT3JFZGdlO1xuICAgIH1cbiAgICBpc0RldGVjdGVkSUVPckVkZ2UgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVhID0gaW50ZXJuYWxXaW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDtcbiAgICAgICAgaWYgKHVhLmluZGV4T2YoJ01TSUUgJykgIT09IC0xIHx8IHVhLmluZGV4T2YoJ1RyaWRlbnQvJykgIT09IC0xIHx8IHVhLmluZGV4T2YoJ0VkZ2UvJykgIT09IC0xKSB7XG4gICAgICAgICAgICBpZU9yRWRnZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7IH1cbiAgICByZXR1cm4gaWVPckVkZ2U7XG59XG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG59XG5cbi8qKlxuICogQGZpbGVvdmVydmlld1xuICogQHN1cHByZXNzIHttaXNzaW5nUmVxdWlyZX1cbiAqL1xuLy8gTm90ZSB0aGF0IHBhc3NpdmUgZXZlbnQgbGlzdGVuZXJzIGFyZSBub3cgc3VwcG9ydGVkIGJ5IG1vc3QgbW9kZXJuIGJyb3dzZXJzLFxuLy8gaW5jbHVkaW5nIENocm9tZSwgRmlyZWZveCwgU2FmYXJpLCBhbmQgRWRnZS4gVGhlcmUncyBhIHBlbmRpbmcgY2hhbmdlIHRoYXRcbi8vIHdvdWxkIHJlbW92ZSBzdXBwb3J0IGZvciBsZWdhY3kgYnJvd3NlcnMgYnkgem9uZS5qcy4gUmVtb3ZpbmcgYHBhc3NpdmVTdXBwb3J0ZWRgXG4vLyBmcm9tIHRoZSBjb2RlYmFzZSB3aWxsIHJlZHVjZSB0aGUgZmluYWwgY29kZSBzaXplIGZvciBleGlzdGluZyBhcHBzIHRoYXQgc3RpbGwgdXNlIHpvbmUuanMuXG5sZXQgcGFzc2l2ZVN1cHBvcnRlZCA9IGZhbHNlO1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3Bhc3NpdmUnLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBwYXNzaXZlU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBOb3RlOiBXZSBwYXNzIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGFzIHRoZSBldmVudCBoYW5kbGVyIHRvby4gVGhpcyBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZVxuICAgICAgICAvLyBzaWduYXR1cmUgb2YgYGFkZEV2ZW50TGlzdGVuZXJgIG9yIGByZW1vdmVFdmVudExpc3RlbmVyYCBidXQgZW5hYmxlcyB1cyB0byByZW1vdmUgdGhlIGhhbmRsZXJcbiAgICAgICAgLy8gd2l0aG91dCBhbiBhY3R1YWwgaGFuZGxlci5cbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBwYXNzaXZlU3VwcG9ydGVkID0gZmFsc2U7XG4gICAgfVxufVxuLy8gYW4gaWRlbnRpZmllciB0byB0ZWxsIFpvbmVUYXNrIGRvIG5vdCBjcmVhdGUgYSBuZXcgaW52b2tlIGNsb3N1cmVcbmNvbnN0IE9QVElNSVpFRF9aT05FX0VWRU5UX1RBU0tfREFUQSA9IHtcbiAgICB1c2VHOiB0cnVlLFxufTtcbmNvbnN0IHpvbmVTeW1ib2xFdmVudE5hbWVzID0ge307XG5jb25zdCBnbG9iYWxTb3VyY2VzID0ge307XG5jb25zdCBFVkVOVF9OQU1FX1NZTUJPTF9SRUdYID0gbmV3IFJlZ0V4cCgnXicgKyBaT05FX1NZTUJPTF9QUkVGSVggKyAnKFxcXFx3KykodHJ1ZXxmYWxzZSkkJyk7XG5jb25zdCBJTU1FRElBVEVfUFJPUEFHQVRJT05fU1lNQk9MID0gem9uZVN5bWJvbCgncHJvcGFnYXRpb25TdG9wcGVkJyk7XG5mdW5jdGlvbiBwcmVwYXJlRXZlbnROYW1lcyhldmVudE5hbWUsIGV2ZW50TmFtZVRvU3RyaW5nKSB7XG4gICAgY29uc3QgZmFsc2VFdmVudE5hbWUgPSAoZXZlbnROYW1lVG9TdHJpbmcgPyBldmVudE5hbWVUb1N0cmluZyhldmVudE5hbWUpIDogZXZlbnROYW1lKSArIEZBTFNFX1NUUjtcbiAgICBjb25zdCB0cnVlRXZlbnROYW1lID0gKGV2ZW50TmFtZVRvU3RyaW5nID8gZXZlbnROYW1lVG9TdHJpbmcoZXZlbnROYW1lKSA6IGV2ZW50TmFtZSkgKyBUUlVFX1NUUjtcbiAgICBjb25zdCBzeW1ib2wgPSBaT05FX1NZTUJPTF9QUkVGSVggKyBmYWxzZUV2ZW50TmFtZTtcbiAgICBjb25zdCBzeW1ib2xDYXB0dXJlID0gWk9ORV9TWU1CT0xfUFJFRklYICsgdHJ1ZUV2ZW50TmFtZTtcbiAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdID0ge307XG4gICAgem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXVtGQUxTRV9TVFJdID0gc3ltYm9sO1xuICAgIHpvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50TmFtZV1bVFJVRV9TVFJdID0gc3ltYm9sQ2FwdHVyZTtcbn1cbmZ1bmN0aW9uIHBhdGNoRXZlbnRUYXJnZXQoX2dsb2JhbCwgYXBpLCBhcGlzLCBwYXRjaE9wdGlvbnMpIHtcbiAgICBjb25zdCBBRERfRVZFTlRfTElTVEVORVIgPSAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5hZGQpIHx8IEFERF9FVkVOVF9MSVNURU5FUl9TVFI7XG4gICAgY29uc3QgUkVNT1ZFX0VWRU5UX0xJU1RFTkVSID0gKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMucm0pIHx8IFJFTU9WRV9FVkVOVF9MSVNURU5FUl9TVFI7XG4gICAgY29uc3QgTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSID0gKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMubGlzdGVuZXJzKSB8fCAnZXZlbnRMaXN0ZW5lcnMnO1xuICAgIGNvbnN0IFJFTU9WRV9BTExfTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSID0gKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMucm1BbGwpIHx8ICdyZW1vdmVBbGxMaXN0ZW5lcnMnO1xuICAgIGNvbnN0IHpvbmVTeW1ib2xBZGRFdmVudExpc3RlbmVyID0gem9uZVN5bWJvbChBRERfRVZFTlRfTElTVEVORVIpO1xuICAgIGNvbnN0IEFERF9FVkVOVF9MSVNURU5FUl9TT1VSQ0UgPSAnLicgKyBBRERfRVZFTlRfTElTVEVORVIgKyAnOic7XG4gICAgY29uc3QgUFJFUEVORF9FVkVOVF9MSVNURU5FUiA9ICdwcmVwZW5kTGlzdGVuZXInO1xuICAgIGNvbnN0IFBSRVBFTkRfRVZFTlRfTElTVEVORVJfU09VUkNFID0gJy4nICsgUFJFUEVORF9FVkVOVF9MSVNURU5FUiArICc6JztcbiAgICBjb25zdCBpbnZva2VUYXNrID0gZnVuY3Rpb24gKHRhc2ssIHRhcmdldCwgZXZlbnQpIHtcbiAgICAgICAgLy8gZm9yIGJldHRlciBwZXJmb3JtYW5jZSwgY2hlY2sgaXNSZW1vdmVkIHdoaWNoIGlzIHNldFxuICAgICAgICAvLyBieSByZW1vdmVFdmVudExpc3RlbmVyXG4gICAgICAgIGlmICh0YXNrLmlzUmVtb3ZlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlbGVnYXRlID0gdGFzay5jYWxsYmFjaztcbiAgICAgICAgaWYgKHR5cGVvZiBkZWxlZ2F0ZSA9PT0gJ29iamVjdCcgJiYgZGVsZWdhdGUuaGFuZGxlRXZlbnQpIHtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgYmluZCB2ZXJzaW9uIG9mIGhhbmRsZUV2ZW50IHdoZW4gaW52b2tlXG4gICAgICAgICAgICB0YXNrLmNhbGxiYWNrID0gKGV2ZW50KSA9PiBkZWxlZ2F0ZS5oYW5kbGVFdmVudChldmVudCk7XG4gICAgICAgICAgICB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgPSBkZWxlZ2F0ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbnZva2Ugc3RhdGljIHRhc2suaW52b2tlXG4gICAgICAgIC8vIG5lZWQgdG8gdHJ5L2NhdGNoIGVycm9yIGhlcmUsIG90aGVyd2lzZSwgdGhlIGVycm9yIGluIG9uZSBldmVudCBsaXN0ZW5lclxuICAgICAgICAvLyB3aWxsIGJyZWFrIHRoZSBleGVjdXRpb25zIG9mIHRoZSBvdGhlciBldmVudCBsaXN0ZW5lcnMuIEFsc28gZXJyb3Igd2lsbFxuICAgICAgICAvLyBub3QgcmVtb3ZlIHRoZSBldmVudCBsaXN0ZW5lciB3aGVuIGBvbmNlYCBvcHRpb25zIGlzIHRydWUuXG4gICAgICAgIGxldCBlcnJvcjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRhc2suaW52b2tlKHRhc2ssIHRhcmdldCwgW2V2ZW50XSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRhc2sub3B0aW9ucztcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMub25jZSkge1xuICAgICAgICAgICAgLy8gaWYgb3B0aW9ucy5vbmNlIGlzIHRydWUsIGFmdGVyIGludm9rZSBvbmNlIHJlbW92ZSBsaXN0ZW5lciBoZXJlXG4gICAgICAgICAgICAvLyBvbmx5IGJyb3dzZXIgbmVlZCB0byBkbyB0aGlzLCBub2RlanMgZXZlbnRFbWl0dGVyIHdpbGwgY2FsIHJlbW92ZUxpc3RlbmVyXG4gICAgICAgICAgICAvLyBpbnNpZGUgRXZlbnRFbWl0dGVyLm9uY2VcbiAgICAgICAgICAgIGNvbnN0IGRlbGVnYXRlID0gdGFzay5vcmlnaW5hbERlbGVnYXRlID8gdGFzay5vcmlnaW5hbERlbGVnYXRlIDogdGFzay5jYWxsYmFjaztcbiAgICAgICAgICAgIHRhcmdldFtSRU1PVkVfRVZFTlRfTElTVEVORVJdLmNhbGwodGFyZ2V0LCBldmVudC50eXBlLCBkZWxlZ2F0ZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH07XG4gICAgZnVuY3Rpb24gZ2xvYmFsQ2FsbGJhY2soY29udGV4dCwgZXZlbnQsIGlzQ2FwdHVyZSkge1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy85MTEsIGluIElFLCBzb21ldGltZXNcbiAgICAgICAgLy8gZXZlbnQgd2lsbCBiZSB1bmRlZmluZWQsIHNvIHdlIG5lZWQgdG8gdXNlIHdpbmRvdy5ldmVudFxuICAgICAgICBldmVudCA9IGV2ZW50IHx8IF9nbG9iYWwuZXZlbnQ7XG4gICAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBldmVudC50YXJnZXQgaXMgbmVlZGVkIGZvciBTYW1zdW5nIFRWIGFuZCBTb3VyY2VCdWZmZXJcbiAgICAgICAgLy8gfHwgZ2xvYmFsIGlzIG5lZWRlZCBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy8xOTBcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gY29udGV4dCB8fCBldmVudC50YXJnZXQgfHwgX2dsb2JhbDtcbiAgICAgICAgY29uc3QgdGFza3MgPSB0YXJnZXRbem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnQudHlwZV1baXNDYXB0dXJlID8gVFJVRV9TVFIgOiBGQUxTRV9TVFJdXTtcbiAgICAgICAgaWYgKHRhc2tzKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICAgICAgICAgIC8vIGludm9rZSBhbGwgdGFza3Mgd2hpY2ggYXR0YWNoZWQgdG8gY3VycmVudCB0YXJnZXQgd2l0aCBnaXZlbiBldmVudC50eXBlIGFuZCBjYXB0dXJlID0gZmFsc2VcbiAgICAgICAgICAgIC8vIGZvciBwZXJmb3JtYW5jZSBjb25jZXJuLCBpZiB0YXNrLmxlbmd0aCA9PT0gMSwganVzdCBpbnZva2VcbiAgICAgICAgICAgIGlmICh0YXNrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBpbnZva2VUYXNrKHRhc2tzWzBdLCB0YXJnZXQsIGV2ZW50KTtcbiAgICAgICAgICAgICAgICBlcnIgJiYgZXJyb3JzLnB1c2goZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3pvbmUuanMvaXNzdWVzLzgzNlxuICAgICAgICAgICAgICAgIC8vIGNvcHkgdGhlIHRhc2tzIGFycmF5IGJlZm9yZSBpbnZva2UsIHRvIGF2b2lkXG4gICAgICAgICAgICAgICAgLy8gdGhlIGNhbGxiYWNrIHdpbGwgcmVtb3ZlIGl0c2VsZiBvciBvdGhlciBsaXN0ZW5lclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvcHlUYXNrcyA9IHRhc2tzLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3B5VGFza3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50W0lNTUVESUFURV9QUk9QQUdBVElPTl9TWU1CT0xdID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBpbnZva2VUYXNrKGNvcHlUYXNrc1tpXSwgdGFyZ2V0LCBldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGVyciAmJiBlcnJvcnMucHVzaChlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNpbmNlIHRoZXJlIGlzIG9ubHkgb25lIGVycm9yLCB3ZSBkb24ndCBuZWVkIHRvIHNjaGVkdWxlIG1pY3JvVGFza1xuICAgICAgICAgICAgLy8gdG8gdGhyb3cgdGhlIGVycm9yLlxuICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcnNbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBlcnJvcnNbaV07XG4gICAgICAgICAgICAgICAgICAgIGFwaS5uYXRpdmVTY2hlZHVsZU1pY3JvVGFzaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBnbG9iYWwgc2hhcmVkIHpvbmVBd2FyZUNhbGxiYWNrIHRvIGhhbmRsZSBhbGwgZXZlbnQgY2FsbGJhY2sgd2l0aCBjYXB0dXJlID0gZmFsc2VcbiAgICBjb25zdCBnbG9iYWxab25lQXdhcmVDYWxsYmFjayA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICByZXR1cm4gZ2xvYmFsQ2FsbGJhY2sodGhpcywgZXZlbnQsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8vIGdsb2JhbCBzaGFyZWQgem9uZUF3YXJlQ2FsbGJhY2sgdG8gaGFuZGxlIGFsbCBldmVudCBjYWxsYmFjayB3aXRoIGNhcHR1cmUgPSB0cnVlXG4gICAgY29uc3QgZ2xvYmFsWm9uZUF3YXJlQ2FwdHVyZUNhbGxiYWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBnbG9iYWxDYWxsYmFjayh0aGlzLCBldmVudCwgdHJ1ZSk7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBwYXRjaEV2ZW50VGFyZ2V0TWV0aG9kcyhvYmosIHBhdGNoT3B0aW9ucykge1xuICAgICAgICBpZiAoIW9iaikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCB1c2VHbG9iYWxDYWxsYmFjayA9IHRydWU7XG4gICAgICAgIGlmIChwYXRjaE9wdGlvbnMgJiYgcGF0Y2hPcHRpb25zLnVzZUcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdXNlR2xvYmFsQ2FsbGJhY2sgPSBwYXRjaE9wdGlvbnMudXNlRztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWxpZGF0ZUhhbmRsZXIgPSBwYXRjaE9wdGlvbnMgJiYgcGF0Y2hPcHRpb25zLnZoO1xuICAgICAgICBsZXQgY2hlY2tEdXBsaWNhdGUgPSB0cnVlO1xuICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5jaGtEdXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2hlY2tEdXBsaWNhdGUgPSBwYXRjaE9wdGlvbnMuY2hrRHVwO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXR1cm5UYXJnZXQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMucnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuVGFyZ2V0ID0gcGF0Y2hPcHRpb25zLnJ0O1xuICAgICAgICB9XG4gICAgICAgIGxldCBwcm90byA9IG9iajtcbiAgICAgICAgd2hpbGUgKHByb3RvICYmICFwcm90by5oYXNPd25Qcm9wZXJ0eShBRERfRVZFTlRfTElTVEVORVIpKSB7XG4gICAgICAgICAgICBwcm90byA9IE9iamVjdEdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXByb3RvICYmIG9ialtBRERfRVZFTlRfTElTVEVORVJdKSB7XG4gICAgICAgICAgICAvLyBzb21laG93IHdlIGRpZCBub3QgZmluZCBpdCwgYnV0IHdlIGNhbiBzZWUgaXQuIFRoaXMgaGFwcGVucyBvbiBJRSBmb3IgV2luZG93IHByb3BlcnRpZXMuXG4gICAgICAgICAgICBwcm90byA9IG9iajtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXByb3RvKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3RvW3pvbmVTeW1ib2xBZGRFdmVudExpc3RlbmVyXSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50TmFtZVRvU3RyaW5nID0gcGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5ldmVudE5hbWVUb1N0cmluZztcbiAgICAgICAgLy8gV2UgdXNlIGEgc2hhcmVkIGdsb2JhbCBgdGFza0RhdGFgIHRvIHBhc3MgZGF0YSBmb3IgYHNjaGVkdWxlRXZlbnRUYXNrYCxcbiAgICAgICAgLy8gZWxpbWluYXRpbmcgdGhlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IG9iamVjdCBzb2xlbHkgZm9yIHBhc3NpbmcgZGF0YS5cbiAgICAgICAgLy8gV0FSTklORzogVGhpcyBvYmplY3QgaGFzIGEgc3RhdGljIGxpZmV0aW1lLCBtZWFuaW5nIGl0IGlzIG5vdCBjcmVhdGVkXG4gICAgICAgIC8vIGVhY2ggdGltZSBgYWRkRXZlbnRMaXN0ZW5lcmAgaXMgY2FsbGVkLiBJdCBpcyBpbnN0YW50aWF0ZWQgb25seSBvbmNlXG4gICAgICAgIC8vIGFuZCBjYXB0dXJlZCBieSByZWZlcmVuY2UgaW5zaWRlIHRoZSBgYWRkRXZlbnRMaXN0ZW5lcmAgYW5kXG4gICAgICAgIC8vIGByZW1vdmVFdmVudExpc3RlbmVyYCBmdW5jdGlvbnMuIERvIG5vdCBhZGQgYW55IG5ldyBwcm9wZXJ0aWVzIHRvIHRoaXNcbiAgICAgICAgLy8gb2JqZWN0LCBhcyBkb2luZyBzbyB3b3VsZCBuZWNlc3NpdGF0ZSBtYWludGFpbmluZyB0aGUgaW5mb3JtYXRpb25cbiAgICAgICAgLy8gYmV0d2VlbiBgYWRkRXZlbnRMaXN0ZW5lcmAgY2FsbHMuXG4gICAgICAgIGNvbnN0IHRhc2tEYXRhID0ge307XG4gICAgICAgIGNvbnN0IG5hdGl2ZUFkZEV2ZW50TGlzdGVuZXIgPSAocHJvdG9bem9uZVN5bWJvbEFkZEV2ZW50TGlzdGVuZXJdID0gcHJvdG9bQUREX0VWRU5UX0xJU1RFTkVSXSk7XG4gICAgICAgIGNvbnN0IG5hdGl2ZVJlbW92ZUV2ZW50TGlzdGVuZXIgPSAocHJvdG9bem9uZVN5bWJvbChSRU1PVkVfRVZFTlRfTElTVEVORVIpXSA9XG4gICAgICAgICAgICBwcm90b1tSRU1PVkVfRVZFTlRfTElTVEVORVJdKTtcbiAgICAgICAgY29uc3QgbmF0aXZlTGlzdGVuZXJzID0gKHByb3RvW3pvbmVTeW1ib2woTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSKV0gPVxuICAgICAgICAgICAgcHJvdG9bTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSXSk7XG4gICAgICAgIGNvbnN0IG5hdGl2ZVJlbW92ZUFsbExpc3RlbmVycyA9IChwcm90b1t6b25lU3ltYm9sKFJFTU9WRV9BTExfTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSKV0gPVxuICAgICAgICAgICAgcHJvdG9bUkVNT1ZFX0FMTF9MSVNURU5FUlNfRVZFTlRfTElTVEVORVJdKTtcbiAgICAgICAgbGV0IG5hdGl2ZVByZXBlbmRFdmVudExpc3RlbmVyO1xuICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5wcmVwZW5kKSB7XG4gICAgICAgICAgICBuYXRpdmVQcmVwZW5kRXZlbnRMaXN0ZW5lciA9IHByb3RvW3pvbmVTeW1ib2wocGF0Y2hPcHRpb25zLnByZXBlbmQpXSA9XG4gICAgICAgICAgICAgICAgcHJvdG9bcGF0Y2hPcHRpb25zLnByZXBlbmRdO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIHV0aWwgZnVuY3Rpb24gd2lsbCBidWlsZCBhbiBvcHRpb24gb2JqZWN0IHdpdGggcGFzc2l2ZSBvcHRpb25cbiAgICAgICAgICogdG8gaGFuZGxlIGFsbCBwb3NzaWJsZSBpbnB1dCBmcm9tIHRoZSB1c2VyLlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gYnVpbGRFdmVudExpc3RlbmVyT3B0aW9ucyhvcHRpb25zLCBwYXNzaXZlKSB7XG4gICAgICAgICAgICBpZiAoIXBhc3NpdmVTdXBwb3J0ZWQgJiYgdHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAvLyBkb2Vzbid0IHN1cHBvcnQgcGFzc2l2ZSBidXQgdXNlciB3YW50IHRvIHBhc3MgYW4gb2JqZWN0IGFzIG9wdGlvbnMuXG4gICAgICAgICAgICAgICAgLy8gdGhpcyB3aWxsIG5vdCB3b3JrIG9uIHNvbWUgb2xkIGJyb3dzZXIsIHNvIHdlIGp1c3QgcGFzcyBhIGJvb2xlYW5cbiAgICAgICAgICAgICAgICAvLyBhcyB1c2VDYXB0dXJlIHBhcmFtZXRlclxuICAgICAgICAgICAgICAgIHJldHVybiAhIW9wdGlvbnMuY2FwdHVyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGFzc2l2ZVN1cHBvcnRlZCB8fCAhcGFzc2l2ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBjYXB0dXJlOiBvcHRpb25zLCBwYXNzaXZlOiB0cnVlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBwYXNzaXZlOiB0cnVlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMucGFzc2l2ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5vcHRpb25zLCBwYXNzaXZlOiB0cnVlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXN0b21TY2hlZHVsZUdsb2JhbCA9IGZ1bmN0aW9uICh0YXNrKSB7XG4gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgdGFzayBmb3IgdGhlIGV2ZW50TmFtZSArIGNhcHR1cmUsXG4gICAgICAgICAgICAvLyBqdXN0IHJldHVybiwgYmVjYXVzZSB3ZSB1c2UgdGhlIHNoYXJlZCBnbG9iYWxab25lQXdhcmVDYWxsYmFjayBoZXJlLlxuICAgICAgICAgICAgaWYgKHRhc2tEYXRhLmlzRXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmF0aXZlQWRkRXZlbnRMaXN0ZW5lci5jYWxsKHRhc2tEYXRhLnRhcmdldCwgdGFza0RhdGEuZXZlbnROYW1lLCB0YXNrRGF0YS5jYXB0dXJlID8gZ2xvYmFsWm9uZUF3YXJlQ2FwdHVyZUNhbGxiYWNrIDogZ2xvYmFsWm9uZUF3YXJlQ2FsbGJhY2ssIHRhc2tEYXRhLm9wdGlvbnMpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogSW4gdGhlIGNvbnRleHQgb2YgZXZlbnRzIGFuZCBsaXN0ZW5lcnMsIHRoaXMgZnVuY3Rpb24gd2lsbCBiZVxuICAgICAgICAgKiBjYWxsZWQgYXQgdGhlIGVuZCBieSBgY2FuY2VsVGFza2AsIHdoaWNoLCBpbiB0dXJuLCBjYWxscyBgdGFzay5jYW5jZWxGbmAuXG4gICAgICAgICAqIENhbmNlbGxpbmcgYSB0YXNrIGlzIHByaW1hcmlseSB1c2VkIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgZnJvbVxuICAgICAgICAgKiB0aGUgdGFzayB0YXJnZXQuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBjdXN0b21DYW5jZWxHbG9iYWwgPSBmdW5jdGlvbiAodGFzaykge1xuICAgICAgICAgICAgLy8gaWYgdGFzayBpcyBub3QgbWFya2VkIGFzIGlzUmVtb3ZlZCwgdGhpcyBjYWxsIGlzIGRpcmVjdGx5XG4gICAgICAgICAgICAvLyBmcm9tIFpvbmUucHJvdG90eXBlLmNhbmNlbFRhc2ssIHdlIHNob3VsZCByZW1vdmUgdGhlIHRhc2tcbiAgICAgICAgICAgIC8vIGZyb20gdGFza3NMaXN0IG9mIHRhcmdldCBmaXJzdFxuICAgICAgICAgICAgaWYgKCF0YXNrLmlzUmVtb3ZlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN5bWJvbEV2ZW50TmFtZXMgPSB6b25lU3ltYm9sRXZlbnROYW1lc1t0YXNrLmV2ZW50TmFtZV07XG4gICAgICAgICAgICAgICAgbGV0IHN5bWJvbEV2ZW50TmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoc3ltYm9sRXZlbnROYW1lcykge1xuICAgICAgICAgICAgICAgICAgICBzeW1ib2xFdmVudE5hbWUgPSBzeW1ib2xFdmVudE5hbWVzW3Rhc2suY2FwdHVyZSA/IFRSVUVfU1RSIDogRkFMU0VfU1RSXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdUYXNrcyA9IHN5bWJvbEV2ZW50TmFtZSAmJiB0YXNrLnRhcmdldFtzeW1ib2xFdmVudE5hbWVdO1xuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1Rhc2tzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhpc3RpbmdUYXNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdUYXNrID0gZXhpc3RpbmdUYXNrc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1Rhc2sgPT09IHRhc2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgaXNSZW1vdmVkIHRvIGRhdGEgZm9yIGZhc3RlciBpbnZva2VUYXNrIGNoZWNrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5pc1JlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXNrLnJlbW92ZUFib3J0TGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5yZW1vdmVBYm9ydExpc3RlbmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sucmVtb3ZlQWJvcnRMaXN0ZW5lciA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1Rhc2tzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgdGFza3MgZm9yIHRoZSBldmVudE5hbWUgKyBjYXB0dXJlIGhhdmUgZ29uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGdsb2JhbFpvbmVBd2FyZUNhbGxiYWNrIGFuZCByZW1vdmUgdGhlIHRhc2sgY2FjaGUgZnJvbSB0YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5hbGxSZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay50YXJnZXRbc3ltYm9sRXZlbnROYW1lXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgYWxsIHRhc2tzIGZvciB0aGUgZXZlbnROYW1lICsgY2FwdHVyZSBoYXZlIGdvbmUsXG4gICAgICAgICAgICAvLyB3ZSB3aWxsIHJlYWxseSByZW1vdmUgdGhlIGdsb2JhbCBldmVudCBjYWxsYmFjayxcbiAgICAgICAgICAgIC8vIGlmIG5vdCwgcmV0dXJuXG4gICAgICAgICAgICBpZiAoIXRhc2suYWxsUmVtb3ZlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyLmNhbGwodGFzay50YXJnZXQsIHRhc2suZXZlbnROYW1lLCB0YXNrLmNhcHR1cmUgPyBnbG9iYWxab25lQXdhcmVDYXB0dXJlQ2FsbGJhY2sgOiBnbG9iYWxab25lQXdhcmVDYWxsYmFjaywgdGFzay5vcHRpb25zKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY3VzdG9tU2NoZWR1bGVOb25HbG9iYWwgPSBmdW5jdGlvbiAodGFzaykge1xuICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZUFkZEV2ZW50TGlzdGVuZXIuY2FsbCh0YXNrRGF0YS50YXJnZXQsIHRhc2tEYXRhLmV2ZW50TmFtZSwgdGFzay5pbnZva2UsIHRhc2tEYXRhLm9wdGlvbnMpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBjdXN0b21TY2hlZHVsZVByZXBlbmQgPSBmdW5jdGlvbiAodGFzaykge1xuICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZVByZXBlbmRFdmVudExpc3RlbmVyLmNhbGwodGFza0RhdGEudGFyZ2V0LCB0YXNrRGF0YS5ldmVudE5hbWUsIHRhc2suaW52b2tlLCB0YXNrRGF0YS5vcHRpb25zKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY3VzdG9tQ2FuY2VsTm9uR2xvYmFsID0gZnVuY3Rpb24gKHRhc2spIHtcbiAgICAgICAgICAgIHJldHVybiBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyLmNhbGwodGFzay50YXJnZXQsIHRhc2suZXZlbnROYW1lLCB0YXNrLmludm9rZSwgdGFzay5vcHRpb25zKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY3VzdG9tU2NoZWR1bGUgPSB1c2VHbG9iYWxDYWxsYmFjayA/IGN1c3RvbVNjaGVkdWxlR2xvYmFsIDogY3VzdG9tU2NoZWR1bGVOb25HbG9iYWw7XG4gICAgICAgIGNvbnN0IGN1c3RvbUNhbmNlbCA9IHVzZUdsb2JhbENhbGxiYWNrID8gY3VzdG9tQ2FuY2VsR2xvYmFsIDogY3VzdG9tQ2FuY2VsTm9uR2xvYmFsO1xuICAgICAgICBjb25zdCBjb21wYXJlVGFza0NhbGxiYWNrVnNEZWxlZ2F0ZSA9IGZ1bmN0aW9uICh0YXNrLCBkZWxlZ2F0ZSkge1xuICAgICAgICAgICAgY29uc3QgdHlwZU9mRGVsZWdhdGUgPSB0eXBlb2YgZGVsZWdhdGU7XG4gICAgICAgICAgICByZXR1cm4gKCh0eXBlT2ZEZWxlZ2F0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0YXNrLmNhbGxiYWNrID09PSBkZWxlZ2F0ZSkgfHxcbiAgICAgICAgICAgICAgICAodHlwZU9mRGVsZWdhdGUgPT09ICdvYmplY3QnICYmIHRhc2sub3JpZ2luYWxEZWxlZ2F0ZSA9PT0gZGVsZWdhdGUpKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY29tcGFyZSA9IHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMuZGlmZiA/IHBhdGNoT3B0aW9ucy5kaWZmIDogY29tcGFyZVRhc2tDYWxsYmFja1ZzRGVsZWdhdGU7XG4gICAgICAgIGNvbnN0IHVucGF0Y2hlZEV2ZW50cyA9IFpvbmVbem9uZVN5bWJvbCgnVU5QQVRDSEVEX0VWRU5UUycpXTtcbiAgICAgICAgY29uc3QgcGFzc2l2ZUV2ZW50cyA9IF9nbG9iYWxbem9uZVN5bWJvbCgnUEFTU0lWRV9FVkVOVFMnKV07XG4gICAgICAgIGZ1bmN0aW9uIGNvcHlFdmVudExpc3RlbmVyT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGRlc3RydWN0dXJlIHRoZSB0YXJnZXQgYG9wdGlvbnNgIG9iamVjdCBzaW5jZSBpdCBtYXlcbiAgICAgICAgICAgICAgICAvLyBiZSBmcm96ZW4gb3Igc2VhbGVkIChwb3NzaWJseSBwcm92aWRlZCBpbXBsaWNpdGx5IGJ5IGEgdGhpcmQtcGFydHlcbiAgICAgICAgICAgICAgICAvLyBsaWJyYXJ5KSwgb3IgaXRzIHByb3BlcnRpZXMgbWF5IGJlIHJlYWRvbmx5LlxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld09wdGlvbnMgPSB7IC4uLm9wdGlvbnMgfTtcbiAgICAgICAgICAgICAgICAvLyBUaGUgYHNpZ25hbGAgb3B0aW9uIHdhcyByZWNlbnRseSBpbnRyb2R1Y2VkLCB3aGljaCBjYXVzZWQgcmVncmVzc2lvbnMgaW5cbiAgICAgICAgICAgICAgICAvLyB0aGlyZC1wYXJ0eSBzY2VuYXJpb3Mgd2hlcmUgYEFib3J0Q29udHJvbGxlcmAgd2FzIGRpcmVjdGx5IHByb3ZpZGVkIHRvXG4gICAgICAgICAgICAgICAgLy8gYGFkZEV2ZW50TGlzdGVuZXJgIGFzIG9wdGlvbnMuIEZvciBpbnN0YW5jZSwgaW4gY2FzZXMgbGlrZVxuICAgICAgICAgICAgICAgIC8vIGBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgY2FsbGJhY2ssIGFib3J0Q29udHJvbGxlckluc3RhbmNlKWAsXG4gICAgICAgICAgICAgICAgLy8gd2hpY2ggaXMgdmFsaWQgYmVjYXVzZSBgQWJvcnRDb250cm9sbGVyYCBpbmNsdWRlcyBhIGBzaWduYWxgIGdldHRlciwgc3ByZWFkaW5nXG4gICAgICAgICAgICAgICAgLy8gYHsuLi5vcHRpb25zfWAgd291bGRuJ3QgY29weSB0aGUgYHNpZ25hbGAuIEFkZGl0aW9uYWxseSwgdXNpbmcgYE9iamVjdC5jcmVhdGVgXG4gICAgICAgICAgICAgICAgLy8gaXNuJ3QgZmVhc2libGUgc2luY2UgYEFib3J0Q29udHJvbGxlcmAgaXMgYSBidWlsdC1pbiBvYmplY3QgdHlwZSwgYW5kIGF0dGVtcHRpbmdcbiAgICAgICAgICAgICAgICAvLyB0byBjcmVhdGUgYSBuZXcgb2JqZWN0IGRpcmVjdGx5IHdpdGggaXQgYXMgdGhlIHByb3RvdHlwZSBtaWdodCByZXN1bHQgaW5cbiAgICAgICAgICAgICAgICAvLyB1bmV4cGVjdGVkIGJlaGF2aW9yLlxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnNpZ25hbCkge1xuICAgICAgICAgICAgICAgICAgICBuZXdPcHRpb25zLnNpZ25hbCA9IG9wdGlvbnMuc2lnbmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3T3B0aW9ucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ha2VBZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIChuYXRpdmVMaXN0ZW5lciwgYWRkU291cmNlLCBjdXN0b21TY2hlZHVsZUZuLCBjdXN0b21DYW5jZWxGbiwgcmV0dXJuVGFyZ2V0ID0gZmFsc2UsIHByZXBlbmQgPSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzIHx8IF9nbG9iYWw7XG4gICAgICAgICAgICAgICAgbGV0IGV2ZW50TmFtZSA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBldmVudE5hbWUgPSBwYXRjaE9wdGlvbnMudHJhbnNmZXJFdmVudE5hbWUoZXZlbnROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGRlbGVnYXRlID0gYXJndW1lbnRzWzFdO1xuICAgICAgICAgICAgICAgIGlmICghZGVsZWdhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZUxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpc05vZGUgJiYgZXZlbnROYW1lID09PSAndW5jYXVnaHRFeGNlcHRpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHBhdGNoIHVuY2F1Z2h0RXhjZXB0aW9uIG9mIG5vZGVqcyB0byBwcmV2ZW50IGVuZGxlc3MgbG9vcFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF0aXZlTGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZG9uJ3QgY3JlYXRlIHRoZSBiaW5kIGRlbGVnYXRlIGZ1bmN0aW9uIGZvciBoYW5kbGVFdmVudFxuICAgICAgICAgICAgICAgIC8vIGNhc2UgaGVyZSB0byBpbXByb3ZlIGFkZEV2ZW50TGlzdGVuZXIgcGVyZm9ybWFuY2VcbiAgICAgICAgICAgICAgICAvLyB3ZSB3aWxsIGNyZWF0ZSB0aGUgYmluZCBkZWxlZ2F0ZSB3aGVuIGludm9rZVxuICAgICAgICAgICAgICAgIGxldCBpc0hhbmRsZUV2ZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZWxlZ2F0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRlbGVnYXRlLmhhbmRsZUV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF0aXZlTGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpc0hhbmRsZUV2ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlSGFuZGxlciAmJiAhdmFsaWRhdGVIYW5kbGVyKG5hdGl2ZUxpc3RlbmVyLCBkZWxlZ2F0ZSwgdGFyZ2V0LCBhcmd1bWVudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFzc2l2ZSA9IHBhc3NpdmVTdXBwb3J0ZWQgJiYgISFwYXNzaXZlRXZlbnRzICYmIHBhc3NpdmVFdmVudHMuaW5kZXhPZihldmVudE5hbWUpICE9PSAtMTtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gY29weUV2ZW50TGlzdGVuZXJPcHRpb25zKGJ1aWxkRXZlbnRMaXN0ZW5lck9wdGlvbnMoYXJndW1lbnRzWzJdLCBwYXNzaXZlKSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgICAgICAgICAgICAgIGlmIChzaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNpZ25hbCBpcyBhbiBhYm9ydGVkIG9uZSwganVzdCByZXR1cm4gd2l0aG91dCBhdHRhY2hpbmcgdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh1bnBhdGNoZWRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdW5wYXRjaGVkIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bnBhdGNoZWRFdmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudE5hbWUgPT09IHVucGF0Y2hlZEV2ZW50c1tpXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzaXZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVMaXN0ZW5lci5jYWxsKHRhcmdldCwgZXZlbnROYW1lLCBkZWxlZ2F0ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF0aXZlTGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY2FwdHVyZSA9ICFvcHRpb25zID8gZmFsc2UgOiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Jvb2xlYW4nID8gdHJ1ZSA6IG9wdGlvbnMuY2FwdHVyZTtcbiAgICAgICAgICAgICAgICBjb25zdCBvbmNlID0gb3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgPyBvcHRpb25zLm9uY2UgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCB6b25lID0gWm9uZS5jdXJyZW50O1xuICAgICAgICAgICAgICAgIGxldCBzeW1ib2xFdmVudE5hbWVzID0gem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoIXN5bWJvbEV2ZW50TmFtZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJlcGFyZUV2ZW50TmFtZXMoZXZlbnROYW1lLCBldmVudE5hbWVUb1N0cmluZyk7XG4gICAgICAgICAgICAgICAgICAgIHN5bWJvbEV2ZW50TmFtZXMgPSB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBzeW1ib2xFdmVudE5hbWUgPSBzeW1ib2xFdmVudE5hbWVzW2NhcHR1cmUgPyBUUlVFX1NUUiA6IEZBTFNFX1NUUl07XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0aW5nVGFza3MgPSB0YXJnZXRbc3ltYm9sRXZlbnROYW1lXTtcbiAgICAgICAgICAgICAgICBsZXQgaXNFeGlzdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1Rhc2tzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaGF2ZSB0YXNrIHJlZ2lzdGVyZWRcbiAgICAgICAgICAgICAgICAgICAgaXNFeGlzdGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGlzdGluZ1Rhc2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmUoZXhpc3RpbmdUYXNrc1tpXSwgZGVsZWdhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgY2FsbGJhY2ssIHNhbWUgY2FwdHVyZSwgc2FtZSBldmVudCBuYW1lLCBqdXN0IHJldHVyblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2tzID0gdGFyZ2V0W3N5bWJvbEV2ZW50TmFtZV0gPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHNvdXJjZTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3Rvck5hbWUgPSB0YXJnZXQuY29uc3RydWN0b3JbJ25hbWUnXTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRTb3VyY2UgPSBnbG9iYWxTb3VyY2VzW2NvbnN0cnVjdG9yTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldFNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSB0YXJnZXRTb3VyY2VbZXZlbnROYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yTmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkU291cmNlICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnROYW1lVG9TdHJpbmcgPyBldmVudE5hbWVUb1N0cmluZyhldmVudE5hbWUpIDogZXZlbnROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNvZGUgYmVsb3csIGBvcHRpb25zYCBzaG91bGQgbm8gbG9uZ2VyIGJlIHJlYXNzaWduZWQ7IGluc3RlYWQsIGl0XG4gICAgICAgICAgICAgICAgLy8gc2hvdWxkIG9ubHkgYmUgbXV0YXRlZC4gVGhpcyBpcyBiZWNhdXNlIHdlIHBhc3MgdGhhdCBvYmplY3QgdG8gdGhlIG5hdGl2ZVxuICAgICAgICAgICAgICAgIC8vIGBhZGRFdmVudExpc3RlbmVyYC5cbiAgICAgICAgICAgICAgICAvLyBJdCdzIGdlbmVyYWxseSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIHNhbWUgb2JqZWN0IHJlZmVyZW5jZSBmb3Igb3B0aW9ucy5cbiAgICAgICAgICAgICAgICAvLyBUaGlzIGVuc3VyZXMgY29uc2lzdGVuY3kgYW5kIGF2b2lkcyBwb3RlbnRpYWwgaXNzdWVzLlxuICAgICAgICAgICAgICAgIHRhc2tEYXRhLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgIGlmIChvbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYGFkZEV2ZW50TGlzdGVuZXJgIHdpdGggdGhlIGBvbmNlYCBvcHRpb24sIHdlIGRvbid0IHBhc3NcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGBvbmNlYCBvcHRpb24gZGlyZWN0bHkgdG8gdGhlIG5hdGl2ZSBgYWRkRXZlbnRMaXN0ZW5lcmAgbWV0aG9kLlxuICAgICAgICAgICAgICAgICAgICAvLyBJbnN0ZWFkLCB3ZSBrZWVwIHRoZSBgb25jZWAgc2V0dGluZyBhbmQgaGFuZGxlIGl0IG91cnNlbHZlcy5cbiAgICAgICAgICAgICAgICAgICAgdGFza0RhdGEub3B0aW9ucy5vbmNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRhc2tEYXRhLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgICAgICAgICB0YXNrRGF0YS5jYXB0dXJlID0gY2FwdHVyZTtcbiAgICAgICAgICAgICAgICB0YXNrRGF0YS5ldmVudE5hbWUgPSBldmVudE5hbWU7XG4gICAgICAgICAgICAgICAgdGFza0RhdGEuaXNFeGlzdGluZyA9IGlzRXhpc3Rpbmc7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHVzZUdsb2JhbENhbGxiYWNrID8gT1BUSU1JWkVEX1pPTkVfRVZFTlRfVEFTS19EQVRBIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIC8vIGtlZXAgdGFza0RhdGEgaW50byBkYXRhIHRvIGFsbG93IG9uU2NoZWR1bGVFdmVudFRhc2sgdG8gYWNjZXNzIHRoZSB0YXNrIGluZm9ybWF0aW9uXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS50YXNrRGF0YSA9IHRhc2tEYXRhO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2lnbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYGFkZEV2ZW50TGlzdGVuZXJgIHdpdGggdGhlIGBzaWduYWxgIG9wdGlvbiwgd2UgZG9uJ3QgcGFzc1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYHNpZ25hbGAgb3B0aW9uIGRpcmVjdGx5IHRvIHRoZSBuYXRpdmUgYGFkZEV2ZW50TGlzdGVuZXJgIG1ldGhvZC5cbiAgICAgICAgICAgICAgICAgICAgLy8gSW5zdGVhZCwgd2Uga2VlcCB0aGUgYHNpZ25hbGAgc2V0dGluZyBhbmQgaGFuZGxlIGl0IG91cnNlbHZlcy5cbiAgICAgICAgICAgICAgICAgICAgdGFza0RhdGEub3B0aW9ucy5zaWduYWwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRoZSBgc2NoZWR1bGVFdmVudFRhc2tgIGZ1bmN0aW9uIHdpbGwgdWx0aW1hdGVseSBjYWxsIGBjdXN0b21TY2hlZHVsZUdsb2JhbGAsXG4gICAgICAgICAgICAgICAgLy8gd2hpY2ggaW4gdHVybiBjYWxscyB0aGUgbmF0aXZlIGBhZGRFdmVudExpc3RlbmVyYC4gVGhpcyBpcyB3aHkgYHRhc2tEYXRhLm9wdGlvbnNgXG4gICAgICAgICAgICAgICAgLy8gaXMgdXBkYXRlZCBiZWZvcmUgc2NoZWR1bGluZyB0aGUgdGFzaywgYXMgYGN1c3RvbVNjaGVkdWxlR2xvYmFsYCB1c2VzXG4gICAgICAgICAgICAgICAgLy8gYHRhc2tEYXRhLm9wdGlvbnNgIHRvIHBhc3MgaXQgdG8gdGhlIG5hdGl2ZSBgYWRkRXZlbnRMaXN0ZW5lcmAuXG4gICAgICAgICAgICAgICAgY29uc3QgdGFzayA9IHpvbmUuc2NoZWR1bGVFdmVudFRhc2soc291cmNlLCBkZWxlZ2F0ZSwgZGF0YSwgY3VzdG9tU2NoZWR1bGVGbiwgY3VzdG9tQ2FuY2VsRm4pO1xuICAgICAgICAgICAgICAgIGlmIChzaWduYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgdGFzayBpcyBzY2hlZHVsZWQsIHdlIG5lZWQgdG8gc3RvcmUgdGhlIHNpZ25hbCBiYWNrIHRvIHRhc2sub3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICB0YXNrRGF0YS5vcHRpb25zLnNpZ25hbCA9IHNpZ25hbDtcbiAgICAgICAgICAgICAgICAgICAgLy8gV3JhcHBpbmcgYHRhc2tgIGluIGEgd2VhayByZWZlcmVuY2Ugd291bGQgbm90IHByZXZlbnQgbWVtb3J5IGxlYWtzLiBXZWFrIHJlZmVyZW5jZXMgYXJlXG4gICAgICAgICAgICAgICAgICAgIC8vIHByaW1hcmlseSB1c2VkIGZvciBwcmV2ZW50aW5nIHN0cm9uZyByZWZlcmVuY2VzIGN5Y2xlcy4gYG9uQWJvcnRgIGlzIGFsd2F5cyByZWFjaGFibGVcbiAgICAgICAgICAgICAgICAgICAgLy8gYXMgaXQncyBhbiBldmVudCBsaXN0ZW5lciwgc28gaXRzIGNsb3N1cmUgcmV0YWlucyBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhlIGB0YXNrYC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb25BYm9ydCA9ICgpID0+IHRhc2suem9uZS5jYW5jZWxUYXNrKHRhc2spO1xuICAgICAgICAgICAgICAgICAgICBuYXRpdmVMaXN0ZW5lci5jYWxsKHNpZ25hbCwgJ2Fib3J0Jywgb25BYm9ydCwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHJlbW92ZSB0aGUgYGFib3J0YCBsaXN0ZW5lciB3aGVuIHRoZSBldmVudCBsaXN0ZW5lciBpcyBnb2luZyB0byBiZSByZW1vdmVkLFxuICAgICAgICAgICAgICAgICAgICAvLyBhcyBpdCBjcmVhdGVzIGEgY2xvc3VyZSB0aGF0IGNhcHR1cmVzIGB0YXNrYC4gVGhpcyBjbG9zdXJlIHJldGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGB0YXNrYCBvYmplY3QgZXZlbiBhZnRlciBpdCBnb2VzIG91dCBvZiBzY29wZSwgcHJldmVudGluZyBgdGFza2AgZnJvbSBiZWluZyBnYXJiYWdlXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbGxlY3RlZC5cbiAgICAgICAgICAgICAgICAgICAgdGFzay5yZW1vdmVBYm9ydExpc3RlbmVyID0gKCkgPT4gc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHNob3VsZCBjbGVhciB0YXNrRGF0YS50YXJnZXQgdG8gYXZvaWQgbWVtb3J5IGxlYWtcbiAgICAgICAgICAgICAgICAvLyBpc3N1ZSwgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMjA0NDJcbiAgICAgICAgICAgICAgICB0YXNrRGF0YS50YXJnZXQgPSBudWxsO1xuICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gY2xlYXIgdXAgdGFza0RhdGEgYmVjYXVzZSBpdCBpcyBhIGdsb2JhbCBvYmplY3RcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLnRhc2tEYXRhID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gaGF2ZSB0byBzYXZlIHRob3NlIGluZm9ybWF0aW9uIHRvIHRhc2sgaW4gY2FzZVxuICAgICAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uIG1heSBjYWxsIHRhc2suem9uZS5jYW5jZWxUYXNrKCkgZGlyZWN0bHlcbiAgICAgICAgICAgICAgICBpZiAob25jZSkge1xuICAgICAgICAgICAgICAgICAgICB0YXNrRGF0YS5vcHRpb25zLm9uY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoISghcGFzc2l2ZVN1cHBvcnRlZCAmJiB0eXBlb2YgdGFzay5vcHRpb25zID09PSAnYm9vbGVhbicpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vdCBzdXBwb3J0IHBhc3NpdmUsIGFuZCB3ZSBwYXNzIGFuIG9wdGlvbiBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgLy8gdG8gYWRkRXZlbnRMaXN0ZW5lciwgd2Ugc2hvdWxkIHNhdmUgdGhlIG9wdGlvbnMgdG8gdGFza1xuICAgICAgICAgICAgICAgICAgICB0YXNrLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0YXNrLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgICAgICAgICB0YXNrLmNhcHR1cmUgPSBjYXB0dXJlO1xuICAgICAgICAgICAgICAgIHRhc2suZXZlbnROYW1lID0gZXZlbnROYW1lO1xuICAgICAgICAgICAgICAgIGlmIChpc0hhbmRsZUV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgb3JpZ2luYWwgZGVsZWdhdGUgZm9yIGNvbXBhcmUgdG8gY2hlY2sgZHVwbGljYXRlXG4gICAgICAgICAgICAgICAgICAgIHRhc2sub3JpZ2luYWxEZWxlZ2F0ZSA9IGRlbGVnYXRlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXByZXBlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdUYXNrcy5wdXNoKHRhc2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdUYXNrcy51bnNoaWZ0KHRhc2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmV0dXJuVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgcHJvdG9bQUREX0VWRU5UX0xJU1RFTkVSXSA9IG1ha2VBZGRMaXN0ZW5lcihuYXRpdmVBZGRFdmVudExpc3RlbmVyLCBBRERfRVZFTlRfTElTVEVORVJfU09VUkNFLCBjdXN0b21TY2hlZHVsZSwgY3VzdG9tQ2FuY2VsLCByZXR1cm5UYXJnZXQpO1xuICAgICAgICBpZiAobmF0aXZlUHJlcGVuZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHByb3RvW1BSRVBFTkRfRVZFTlRfTElTVEVORVJdID0gbWFrZUFkZExpc3RlbmVyKG5hdGl2ZVByZXBlbmRFdmVudExpc3RlbmVyLCBQUkVQRU5EX0VWRU5UX0xJU1RFTkVSX1NPVVJDRSwgY3VzdG9tU2NoZWR1bGVQcmVwZW5kLCBjdXN0b21DYW5jZWwsIHJldHVyblRhcmdldCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcHJvdG9bUkVNT1ZFX0VWRU5UX0xJU1RFTkVSXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMgfHwgX2dsb2JhbDtcbiAgICAgICAgICAgIGxldCBldmVudE5hbWUgPSBhcmd1bWVudHNbMF07XG4gICAgICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZSkge1xuICAgICAgICAgICAgICAgIGV2ZW50TmFtZSA9IHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZShldmVudE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGFyZ3VtZW50c1syXTtcbiAgICAgICAgICAgIGNvbnN0IGNhcHR1cmUgPSAhb3B0aW9ucyA/IGZhbHNlIDogdHlwZW9mIG9wdGlvbnMgPT09ICdib29sZWFuJyA/IHRydWUgOiBvcHRpb25zLmNhcHR1cmU7XG4gICAgICAgICAgICBjb25zdCBkZWxlZ2F0ZSA9IGFyZ3VtZW50c1sxXTtcbiAgICAgICAgICAgIGlmICghZGVsZWdhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmF0aXZlUmVtb3ZlRXZlbnRMaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbGlkYXRlSGFuZGxlciAmJlxuICAgICAgICAgICAgICAgICF2YWxpZGF0ZUhhbmRsZXIobmF0aXZlUmVtb3ZlRXZlbnRMaXN0ZW5lciwgZGVsZWdhdGUsIHRhcmdldCwgYXJndW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEV2ZW50TmFtZXMgPSB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdO1xuICAgICAgICAgICAgbGV0IHN5bWJvbEV2ZW50TmFtZTtcbiAgICAgICAgICAgIGlmIChzeW1ib2xFdmVudE5hbWVzKSB7XG4gICAgICAgICAgICAgICAgc3ltYm9sRXZlbnROYW1lID0gc3ltYm9sRXZlbnROYW1lc1tjYXB0dXJlID8gVFJVRV9TVFIgOiBGQUxTRV9TVFJdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdUYXNrcyA9IHN5bWJvbEV2ZW50TmFtZSAmJiB0YXJnZXRbc3ltYm9sRXZlbnROYW1lXTtcbiAgICAgICAgICAgIC8vIGBleGlzdGluZ1Rhc2tzYCBtYXkgbm90IGV4aXN0IGlmIHRoZSBgYWRkRXZlbnRMaXN0ZW5lcmAgd2FzIGNhbGxlZCBiZWZvcmVcbiAgICAgICAgICAgIC8vIGl0IHdhcyBwYXRjaGVkIGJ5IHpvbmUuanMuIFBsZWFzZSByZWZlciB0byB0aGUgYXR0YWNoZWQgaXNzdWUgZm9yXG4gICAgICAgICAgICAvLyBjbGFyaWZpY2F0aW9uLCBwYXJ0aWN1bGFybHkgYWZ0ZXIgdGhlIGBpZmAgY29uZGl0aW9uLCBiZWZvcmUgY2FsbGluZ1xuICAgICAgICAgICAgLy8gdGhlIG5hdGl2ZSBgcmVtb3ZlRXZlbnRMaXN0ZW5lcmAuXG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdUYXNrcykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhpc3RpbmdUYXNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1Rhc2sgPSBleGlzdGluZ1Rhc2tzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGFyZShleGlzdGluZ1Rhc2ssIGRlbGVnYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdUYXNrcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgaXNSZW1vdmVkIHRvIGRhdGEgZm9yIGZhc3RlciBpbnZva2VUYXNrIGNoZWNrXG4gICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2suaXNSZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1Rhc2tzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCB0YXNrcyBmb3IgdGhlIGV2ZW50TmFtZSArIGNhcHR1cmUgaGF2ZSBnb25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBnbG9iYWxab25lQXdhcmVDYWxsYmFjayBhbmQgcmVtb3ZlIHRoZSB0YXNrIGNhY2hlIGZyb20gdGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdUYXNrLmFsbFJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtzeW1ib2xFdmVudE5hbWVdID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgdGFyZ2V0LCB3ZSBoYXZlIGFuIGV2ZW50IGxpc3RlbmVyIHdoaWNoIGlzIGFkZGVkIGJ5IG9uX3Byb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VjaCBhcyB0YXJnZXQub25jbGljayA9IGZ1bmN0aW9uKCkge30sIHNvIHdlIG5lZWQgdG8gY2xlYXIgdGhpcyBpbnRlcm5hbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IHRvbyBpZiBhbGwgZGVsZWdhdGVzIHdpdGggY2FwdHVyZT1mYWxzZSB3ZXJlIHJlbW92ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovLyBnaXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMzE2NDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy81NDU4MVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FwdHVyZSAmJiB0eXBlb2YgZXZlbnROYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvblByb3BlcnR5U3ltYm9sID0gWk9ORV9TWU1CT0xfUFJFRklYICsgJ09OX1BST1BFUlRZJyArIGV2ZW50TmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W29uUHJvcGVydHlTeW1ib2xdID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBhbGwgb3RoZXIgY29uZGl0aW9ucywgd2hlbiBgYWRkRXZlbnRMaXN0ZW5lcmAgaXMgY2FsbGVkIGFmdGVyIGJlaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXRjaGVkIGJ5IHpvbmUuanMsIHdlIHdvdWxkIGFsd2F5cyBmaW5kIGFuIGV2ZW50IHRhc2sgb24gdGhlIGBFdmVudFRhcmdldGAuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgdHJpZ2dlciBgY2FuY2VsRm5gIG9uIHRoZSBgZXhpc3RpbmdUYXNrYCwgbGVhZGluZyB0byBgY3VzdG9tQ2FuY2VsR2xvYmFsYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIHVsdGltYXRlbHkgcmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBhbmQgY2xlYW5zIHVwIHRoZSBhYm9ydCBsaXN0ZW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGlmIGFuIGBBYm9ydFNpZ25hbGAgd2FzIHByb3ZpZGVkIHdoZW4gc2NoZWR1bGluZyBhIHRhc2spLlxuICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdUYXNrLnpvbmUuY2FuY2VsVGFzayhleGlzdGluZ1Rhc2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy85MzBcbiAgICAgICAgICAgIC8vIFdlIG1heSBlbmNvdW50ZXIgYSBzaXR1YXRpb24gd2hlcmUgdGhlIGBhZGRFdmVudExpc3RlbmVyYCB3YXNcbiAgICAgICAgICAgIC8vIGNhbGxlZCBvbiB0aGUgZXZlbnQgdGFyZ2V0IGJlZm9yZSB6b25lLmpzIGlzIGxvYWRlZCwgcmVzdWx0aW5nXG4gICAgICAgICAgICAvLyBpbiBubyB0YXNrIGJlaW5nIHN0b3JlZCBvbiB0aGUgZXZlbnQgdGFyZ2V0IGR1ZSB0byBpdHMgaW52b2NhdGlvblxuICAgICAgICAgICAgLy8gb2YgdGhlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbi4gSW4gdGhpcyBzY2VuYXJpbywgd2Ugc2ltcGx5IG5lZWQgdG9cbiAgICAgICAgICAgIC8vIGludm9rZSB0aGUgbmF0aXZlIGByZW1vdmVFdmVudExpc3RlbmVyYC5cbiAgICAgICAgICAgIHJldHVybiBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICAgIHByb3RvW0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzIHx8IF9nbG9iYWw7XG4gICAgICAgICAgICBsZXQgZXZlbnROYW1lID0gYXJndW1lbnRzWzBdO1xuICAgICAgICAgICAgaWYgKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMudHJhbnNmZXJFdmVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICBldmVudE5hbWUgPSBwYXRjaE9wdGlvbnMudHJhbnNmZXJFdmVudE5hbWUoZXZlbnROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgdGFza3MgPSBmaW5kRXZlbnRUYXNrcyh0YXJnZXQsIGV2ZW50TmFtZVRvU3RyaW5nID8gZXZlbnROYW1lVG9TdHJpbmcoZXZlbnROYW1lKSA6IGV2ZW50TmFtZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhc2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFzayA9IHRhc2tzW2ldO1xuICAgICAgICAgICAgICAgIGxldCBkZWxlZ2F0ZSA9IHRhc2sub3JpZ2luYWxEZWxlZ2F0ZSA/IHRhc2sub3JpZ2luYWxEZWxlZ2F0ZSA6IHRhc2suY2FsbGJhY2s7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzLnB1c2goZGVsZWdhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGxpc3RlbmVycztcbiAgICAgICAgfTtcbiAgICAgICAgcHJvdG9bUkVNT1ZFX0FMTF9MSVNURU5FUlNfRVZFTlRfTElTVEVORVJdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcyB8fCBfZ2xvYmFsO1xuICAgICAgICAgICAgbGV0IGV2ZW50TmFtZSA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgICAgIGlmICghZXZlbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRhcmdldCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3AgPSBrZXlzW2ldO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IEVWRU5UX05BTUVfU1lNQk9MX1JFR1guZXhlYyhwcm9wKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGV2dE5hbWUgPSBtYXRjaCAmJiBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaW4gbm9kZWpzIEV2ZW50RW1pdHRlciwgcmVtb3ZlTGlzdGVuZXIgZXZlbnQgaXNcbiAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCBmb3IgbW9uaXRvcmluZyB0aGUgcmVtb3ZlTGlzdGVuZXIgY2FsbCxcbiAgICAgICAgICAgICAgICAgICAgLy8gc28ganVzdCBrZWVwIHJlbW92ZUxpc3RlbmVyIGV2ZW50TGlzdGVuZXIgdW50aWxcbiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIG90aGVyIGV2ZW50TGlzdGVuZXJzIGFyZSByZW1vdmVkXG4gICAgICAgICAgICAgICAgICAgIGlmIChldnROYW1lICYmIGV2dE5hbWUgIT09ICdyZW1vdmVMaXN0ZW5lcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbUkVNT1ZFX0FMTF9MSVNURU5FUlNfRVZFTlRfTElTVEVORVJdLmNhbGwodGhpcywgZXZ0TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHJlbW92ZUxpc3RlbmVyIGxpc3RlbmVyIGZpbmFsbHlcbiAgICAgICAgICAgICAgICB0aGlzW1JFTU9WRV9BTExfTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSXS5jYWxsKHRoaXMsICdyZW1vdmVMaXN0ZW5lcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMudHJhbnNmZXJFdmVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lID0gcGF0Y2hPcHRpb25zLnRyYW5zZmVyRXZlbnROYW1lKGV2ZW50TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHN5bWJvbEV2ZW50TmFtZXMgPSB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdO1xuICAgICAgICAgICAgICAgIGlmIChzeW1ib2xFdmVudE5hbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN5bWJvbEV2ZW50TmFtZSA9IHN5bWJvbEV2ZW50TmFtZXNbRkFMU0VfU1RSXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ltYm9sQ2FwdHVyZUV2ZW50TmFtZSA9IHN5bWJvbEV2ZW50TmFtZXNbVFJVRV9TVFJdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXNrcyA9IHRhcmdldFtzeW1ib2xFdmVudE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXB0dXJlVGFza3MgPSB0YXJnZXRbc3ltYm9sQ2FwdHVyZUV2ZW50TmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXNrcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlVGFza3MgPSB0YXNrcy5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZW1vdmVUYXNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhc2sgPSByZW1vdmVUYXNrc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGVsZWdhdGUgPSB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgPyB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgOiB0YXNrLmNhbGxiYWNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbUkVNT1ZFX0VWRU5UX0xJU1RFTkVSXS5jYWxsKHRoaXMsIGV2ZW50TmFtZSwgZGVsZWdhdGUsIHRhc2sub3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhcHR1cmVUYXNrcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlVGFza3MgPSBjYXB0dXJlVGFza3Muc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVtb3ZlVGFza3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXNrID0gcmVtb3ZlVGFza3NbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRlbGVnYXRlID0gdGFzay5vcmlnaW5hbERlbGVnYXRlID8gdGFzay5vcmlnaW5hbERlbGVnYXRlIDogdGFzay5jYWxsYmFjaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW1JFTU9WRV9FVkVOVF9MSVNURU5FUl0uY2FsbCh0aGlzLCBldmVudE5hbWUsIGRlbGVnYXRlLCB0YXNrLm9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJldHVyblRhcmdldCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBmb3IgbmF0aXZlIHRvU3RyaW5nIHBhdGNoXG4gICAgICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChwcm90b1tBRERfRVZFTlRfTElTVEVORVJdLCBuYXRpdmVBZGRFdmVudExpc3RlbmVyKTtcbiAgICAgICAgYXR0YWNoT3JpZ2luVG9QYXRjaGVkKHByb3RvW1JFTU9WRV9FVkVOVF9MSVNURU5FUl0sIG5hdGl2ZVJlbW92ZUV2ZW50TGlzdGVuZXIpO1xuICAgICAgICBpZiAobmF0aXZlUmVtb3ZlQWxsTGlzdGVuZXJzKSB7XG4gICAgICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQocHJvdG9bUkVNT1ZFX0FMTF9MSVNURU5FUlNfRVZFTlRfTElTVEVORVJdLCBuYXRpdmVSZW1vdmVBbGxMaXN0ZW5lcnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYXRpdmVMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChwcm90b1tMSVNURU5FUlNfRVZFTlRfTElTVEVORVJdLCBuYXRpdmVMaXN0ZW5lcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXBpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHRzW2ldID0gcGF0Y2hFdmVudFRhcmdldE1ldGhvZHMoYXBpc1tpXSwgcGF0Y2hPcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG59XG5mdW5jdGlvbiBmaW5kRXZlbnRUYXNrcyh0YXJnZXQsIGV2ZW50TmFtZSkge1xuICAgIGlmICghZXZlbnROYW1lKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kVGFza3MgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gRVZFTlRfTkFNRV9TWU1CT0xfUkVHWC5leGVjKHByb3ApO1xuICAgICAgICAgICAgbGV0IGV2dE5hbWUgPSBtYXRjaCAmJiBtYXRjaFsxXTtcbiAgICAgICAgICAgIGlmIChldnROYW1lICYmICghZXZlbnROYW1lIHx8IGV2dE5hbWUgPT09IGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXNrcyA9IHRhcmdldFtwcm9wXTtcbiAgICAgICAgICAgICAgICBpZiAodGFza3MpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRUYXNrcy5wdXNoKHRhc2tzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm91bmRUYXNrcztcbiAgICB9XG4gICAgbGV0IHN5bWJvbEV2ZW50TmFtZSA9IHpvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50TmFtZV07XG4gICAgaWYgKCFzeW1ib2xFdmVudE5hbWUpIHtcbiAgICAgICAgcHJlcGFyZUV2ZW50TmFtZXMoZXZlbnROYW1lKTtcbiAgICAgICAgc3ltYm9sRXZlbnROYW1lID0gem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcbiAgICB9XG4gICAgY29uc3QgY2FwdHVyZUZhbHNlVGFza3MgPSB0YXJnZXRbc3ltYm9sRXZlbnROYW1lW0ZBTFNFX1NUUl1dO1xuICAgIGNvbnN0IGNhcHR1cmVUcnVlVGFza3MgPSB0YXJnZXRbc3ltYm9sRXZlbnROYW1lW1RSVUVfU1RSXV07XG4gICAgaWYgKCFjYXB0dXJlRmFsc2VUYXNrcykge1xuICAgICAgICByZXR1cm4gY2FwdHVyZVRydWVUYXNrcyA/IGNhcHR1cmVUcnVlVGFza3Muc2xpY2UoKSA6IFtdO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNhcHR1cmVUcnVlVGFza3NcbiAgICAgICAgICAgID8gY2FwdHVyZUZhbHNlVGFza3MuY29uY2F0KGNhcHR1cmVUcnVlVGFza3MpXG4gICAgICAgICAgICA6IGNhcHR1cmVGYWxzZVRhc2tzLnNsaWNlKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gcGF0Y2hFdmVudFByb3RvdHlwZShnbG9iYWwsIGFwaSkge1xuICAgIGNvbnN0IEV2ZW50ID0gZ2xvYmFsWydFdmVudCddO1xuICAgIGlmIChFdmVudCAmJiBFdmVudC5wcm90b3R5cGUpIHtcbiAgICAgICAgYXBpLnBhdGNoTWV0aG9kKEV2ZW50LnByb3RvdHlwZSwgJ3N0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbicsIChkZWxlZ2F0ZSkgPT4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHtcbiAgICAgICAgICAgIHNlbGZbSU1NRURJQVRFX1BST1BBR0FUSU9OX1NZTUJPTF0gPSB0cnVlO1xuICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBjYWxsIHRoZSBuYXRpdmUgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uXG4gICAgICAgICAgICAvLyBpbiBjYXNlIGluIHNvbWUgaHlicmlkIGFwcGxpY2F0aW9uLCBzb21lIHBhcnQgb2ZcbiAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uIHdpbGwgYmUgY29udHJvbGxlZCBieSB6b25lLCBzb21lIGFyZSBub3RcbiAgICAgICAgICAgIGRlbGVnYXRlICYmIGRlbGVnYXRlLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8qKlxuICogQGZpbGVvdmVydmlld1xuICogQHN1cHByZXNzIHttaXNzaW5nUmVxdWlyZX1cbiAqL1xuZnVuY3Rpb24gcGF0Y2hRdWV1ZU1pY3JvdGFzayhnbG9iYWwsIGFwaSkge1xuICAgIGFwaS5wYXRjaE1ldGhvZChnbG9iYWwsICdxdWV1ZU1pY3JvdGFzaycsIChkZWxlZ2F0ZSkgPT4ge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHtcbiAgICAgICAgICAgIFpvbmUuY3VycmVudC5zY2hlZHVsZU1pY3JvVGFzaygncXVldWVNaWNyb3Rhc2snLCBhcmdzWzBdKTtcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3XG4gKiBAc3VwcHJlc3Mge21pc3NpbmdSZXF1aXJlfVxuICovXG5jb25zdCB0YXNrU3ltYm9sID0gem9uZVN5bWJvbCgnem9uZVRhc2snKTtcbmZ1bmN0aW9uIHBhdGNoVGltZXIod2luZG93LCBzZXROYW1lLCBjYW5jZWxOYW1lLCBuYW1lU3VmZml4KSB7XG4gICAgbGV0IHNldE5hdGl2ZSA9IG51bGw7XG4gICAgbGV0IGNsZWFyTmF0aXZlID0gbnVsbDtcbiAgICBzZXROYW1lICs9IG5hbWVTdWZmaXg7XG4gICAgY2FuY2VsTmFtZSArPSBuYW1lU3VmZml4O1xuICAgIGNvbnN0IHRhc2tzQnlIYW5kbGVJZCA9IHt9O1xuICAgIGZ1bmN0aW9uIHNjaGVkdWxlVGFzayh0YXNrKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0YXNrLmRhdGE7XG4gICAgICAgIGRhdGEuYXJnc1swXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0YXNrLmludm9rZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBoYW5kbGVPcklkID0gc2V0TmF0aXZlLmFwcGx5KHdpbmRvdywgZGF0YS5hcmdzKTtcbiAgICAgICAgLy8gV2hsaXN0IG9uIE5vZGUuanMgd2hlbiBnZXQgY2FuIHRoZSBJRCBieSB1c2luZyBgW1N5bWJvbC50b1ByaW1pdGl2ZV0oKWAgd2UgZG9cbiAgICAgICAgLy8gdG8gdGhpcyBzbyB0aGF0IHdlIGRvIG5vdCBjYXVzZSBwb3RlbnRhbGx5IGxlYWtzIHdoZW4gdXNpbmcgYHNldFRpbWVvdXRgXG4gICAgICAgIC8vIHNpbmNlIHRoaXMgY2FuIGJlIHBlcmlvZGljIHdoZW4gdXNpbmcgYC5yZWZyZXNoYC5cbiAgICAgICAgaWYgKGlzTnVtYmVyKGhhbmRsZU9ySWQpKSB7XG4gICAgICAgICAgICBkYXRhLmhhbmRsZUlkID0gaGFuZGxlT3JJZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRhdGEuaGFuZGxlID0gaGFuZGxlT3JJZDtcbiAgICAgICAgICAgIC8vIE9uIE5vZGUuanMgYSB0aW1lb3V0IGFuZCBpbnRlcnZhbCBjYW4gYmUgcmVzdGFydGVkIG92ZXIgYW5kIG92ZXIgYWdhaW4gYnkgdXNpbmcgdGhlIGAucmVmcmVzaGAgbWV0aG9kLlxuICAgICAgICAgICAgZGF0YS5pc1JlZnJlc2hhYmxlID0gaXNGdW5jdGlvbihoYW5kbGVPcklkLnJlZnJlc2gpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXNrO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjbGVhclRhc2sodGFzaykge1xuICAgICAgICBjb25zdCB7IGhhbmRsZSwgaGFuZGxlSWQgfSA9IHRhc2suZGF0YTtcbiAgICAgICAgcmV0dXJuIGNsZWFyTmF0aXZlLmNhbGwod2luZG93LCBoYW5kbGUgPz8gaGFuZGxlSWQpO1xuICAgIH1cbiAgICBzZXROYXRpdmUgPSBwYXRjaE1ldGhvZCh3aW5kb3csIHNldE5hbWUsIChkZWxlZ2F0ZSkgPT4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oYXJnc1swXSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgaXNSZWZyZXNoYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNQZXJpb2RpYzogbmFtZVN1ZmZpeCA9PT0gJ0ludGVydmFsJyxcbiAgICAgICAgICAgICAgICBkZWxheTogbmFtZVN1ZmZpeCA9PT0gJ1RpbWVvdXQnIHx8IG5hbWVTdWZmaXggPT09ICdJbnRlcnZhbCcgPyBhcmdzWzFdIHx8IDAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgYXJnczogYXJncyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3NbMF07XG4gICAgICAgICAgICBhcmdzWzBdID0gZnVuY3Rpb24gdGltZXIoKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpc3N1ZS05MzQsIHRhc2sgd2lsbCBiZSBjYW5jZWxsZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBpdCBpcyBhIHBlcmlvZGljIHRhc2sgc3VjaCBhc1xuICAgICAgICAgICAgICAgICAgICAvLyBzZXRJbnRlcnZhbFxuICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy80MDM4N1xuICAgICAgICAgICAgICAgICAgICAvLyBDbGVhbnVwIHRhc2tzQnlIYW5kbGVJZCBzaG91bGQgYmUgaGFuZGxlZCBiZWZvcmUgc2NoZWR1bGVUYXNrXG4gICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIHNvbWUgem9uZVNwZWMgbWF5IGludGVyY2VwdCBhbmQgZG9lc24ndCB0cmlnZ2VyXG4gICAgICAgICAgICAgICAgICAgIC8vIHNjaGVkdWxlRm4oc2NoZWR1bGVUYXNrKSBwcm92aWRlZCBoZXJlLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGhhbmRsZSwgaGFuZGxlSWQsIGlzUGVyaW9kaWMsIGlzUmVmcmVzaGFibGUgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNQZXJpb2RpYyAmJiAhaXNSZWZyZXNoYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZUlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gbm9uLW5vZGVqcyBlbnYsIHdlIHJlbW92ZSB0aW1lcklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBsb2NhbCBjYWNoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlSWRbaGFuZGxlSWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9kZSByZXR1cm5zIGNvbXBsZXggb2JqZWN0cyBhcyBoYW5kbGVJZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSByZW1vdmUgdGFzayByZWZlcmVuY2UgZnJvbSB0aW1lciBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVbdGFza1N5bWJvbF0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHRhc2sgPSBzY2hlZHVsZU1hY3JvVGFza1dpdGhDdXJyZW50Wm9uZShzZXROYW1lLCBhcmdzWzBdLCBvcHRpb25zLCBzY2hlZHVsZVRhc2ssIGNsZWFyVGFzayk7XG4gICAgICAgICAgICBpZiAoIXRhc2spIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFzaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE5vZGUuanMgbXVzdCBhZGRpdGlvbmFsbHkgc3VwcG9ydCB0aGUgcmVmIGFuZCB1bnJlZiBmdW5jdGlvbnMuXG4gICAgICAgICAgICBjb25zdCB7IGhhbmRsZUlkLCBoYW5kbGUsIGlzUmVmcmVzaGFibGUsIGlzUGVyaW9kaWMgfSA9IHRhc2suZGF0YTtcbiAgICAgICAgICAgIGlmIChoYW5kbGVJZCkge1xuICAgICAgICAgICAgICAgIC8vIGZvciBub24gbm9kZWpzIGVudiwgd2Ugc2F2ZSBoYW5kbGVJZDogdGFza1xuICAgICAgICAgICAgICAgIC8vIG1hcHBpbmcgaW4gbG9jYWwgY2FjaGUgZm9yIGNsZWFyVGltZW91dFxuICAgICAgICAgICAgICAgIHRhc2tzQnlIYW5kbGVJZFtoYW5kbGVJZF0gPSB0YXNrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgLy8gZm9yIG5vZGVqcyBlbnYsIHdlIHNhdmUgdGFza1xuICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBpbiB0aW1lcklkIE9iamVjdCBmb3IgY2xlYXJUaW1lb3V0XG4gICAgICAgICAgICAgICAgaGFuZGxlW3Rhc2tTeW1ib2xdID0gdGFzaztcbiAgICAgICAgICAgICAgICBpZiAoaXNSZWZyZXNoYWJsZSAmJiAhaXNQZXJpb2RpYykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbFJlZnJlc2ggPSBoYW5kbGUucmVmcmVzaDtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlLnJlZnJlc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHpvbmUsIHN0YXRlIH0gPSB0YXNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09PSAnbm90U2NoZWR1bGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suX3N0YXRlID0gJ3NjaGVkdWxlZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgem9uZS5fdXBkYXRlVGFza0NvdW50KHRhc2ssIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT09ICdydW5uaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suX3N0YXRlID0gJ3NjaGVkdWxpbmcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmVmcmVzaC5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBoYW5kbGUgPz8gaGFuZGxlSWQgPz8gdGFzaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGNhdXNlIGFuIGVycm9yIGJ5IGNhbGxpbmcgaXQgZGlyZWN0bHkuXG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuYXBwbHkod2luZG93LCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNsZWFyTmF0aXZlID0gcGF0Y2hNZXRob2Qod2luZG93LCBjYW5jZWxOYW1lLCAoZGVsZWdhdGUpID0+IGZ1bmN0aW9uIChzZWxmLCBhcmdzKSB7XG4gICAgICAgIGNvbnN0IGlkID0gYXJnc1swXTtcbiAgICAgICAgbGV0IHRhc2s7XG4gICAgICAgIGlmIChpc051bWJlcihpZCkpIHtcbiAgICAgICAgICAgIC8vIG5vbiBub2RlanMgZW52LlxuICAgICAgICAgICAgdGFzayA9IHRhc2tzQnlIYW5kbGVJZFtpZF07XG4gICAgICAgICAgICBkZWxldGUgdGFza3NCeUhhbmRsZUlkW2lkXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIG5vZGVqcyBlbnYgPz8gb3RoZXIgZW52aXJvbm1lbnRzLlxuICAgICAgICAgICAgdGFzayA9IGlkPy5bdGFza1N5bWJvbF07XG4gICAgICAgICAgICBpZiAodGFzaykge1xuICAgICAgICAgICAgICAgIGlkW3Rhc2tTeW1ib2xdID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhc2sgPSBpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGFzaz8udHlwZSkge1xuICAgICAgICAgICAgaWYgKHRhc2suY2FuY2VsRm4pIHtcbiAgICAgICAgICAgICAgICAvLyBEbyBub3QgY2FuY2VsIGFscmVhZHkgY2FuY2VsZWQgZnVuY3Rpb25zXG4gICAgICAgICAgICAgICAgdGFzay56b25lLmNhbmNlbFRhc2sodGFzayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBjYXVzZSBhbiBlcnJvciBieSBjYWxsaW5nIGl0IGRpcmVjdGx5LlxuICAgICAgICAgICAgZGVsZWdhdGUuYXBwbHkod2luZG93LCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBwYXRjaEN1c3RvbUVsZW1lbnRzKF9nbG9iYWwsIGFwaSkge1xuICAgIGNvbnN0IHsgaXNCcm93c2VyLCBpc01peCB9ID0gYXBpLmdldEdsb2JhbE9iamVjdHMoKTtcbiAgICBpZiAoKCFpc0Jyb3dzZXIgJiYgIWlzTWl4KSB8fCAhX2dsb2JhbFsnY3VzdG9tRWxlbWVudHMnXSB8fCAhKCdjdXN0b21FbGVtZW50cycgaW4gX2dsb2JhbCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9jdXN0b20tZWxlbWVudHMuaHRtbCNjb25jZXB0LWN1c3RvbS1lbGVtZW50LWRlZmluaXRpb24tbGlmZWN5Y2xlLWNhbGxiYWNrc1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IFtcbiAgICAgICAgJ2Nvbm5lY3RlZENhbGxiYWNrJyxcbiAgICAgICAgJ2Rpc2Nvbm5lY3RlZENhbGxiYWNrJyxcbiAgICAgICAgJ2Fkb3B0ZWRDYWxsYmFjaycsXG4gICAgICAgICdhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2snLFxuICAgICAgICAnZm9ybUFzc29jaWF0ZWRDYWxsYmFjaycsXG4gICAgICAgICdmb3JtRGlzYWJsZWRDYWxsYmFjaycsXG4gICAgICAgICdmb3JtUmVzZXRDYWxsYmFjaycsXG4gICAgICAgICdmb3JtU3RhdGVSZXN0b3JlQ2FsbGJhY2snLFxuICAgIF07XG4gICAgYXBpLnBhdGNoQ2FsbGJhY2tzKGFwaSwgX2dsb2JhbC5jdXN0b21FbGVtZW50cywgJ2N1c3RvbUVsZW1lbnRzJywgJ2RlZmluZScsIGNhbGxiYWNrcyk7XG59XG5cbmZ1bmN0aW9uIGV2ZW50VGFyZ2V0UGF0Y2goX2dsb2JhbCwgYXBpKSB7XG4gICAgaWYgKFpvbmVbYXBpLnN5bWJvbCgncGF0Y2hFdmVudFRhcmdldCcpXSkge1xuICAgICAgICAvLyBFdmVudFRhcmdldCBpcyBhbHJlYWR5IHBhdGNoZWQuXG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyBldmVudE5hbWVzLCB6b25lU3ltYm9sRXZlbnROYW1lcywgVFJVRV9TVFIsIEZBTFNFX1NUUiwgWk9ORV9TWU1CT0xfUFJFRklYIH0gPSBhcGkuZ2V0R2xvYmFsT2JqZWN0cygpO1xuICAgIC8vICBwcmVkZWZpbmUgYWxsIF9fem9uZV9zeW1ib2xfXyArIGV2ZW50TmFtZSArIHRydWUvZmFsc2Ugc3RyaW5nXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGV2ZW50TmFtZXNbaV07XG4gICAgICAgIGNvbnN0IGZhbHNlRXZlbnROYW1lID0gZXZlbnROYW1lICsgRkFMU0VfU1RSO1xuICAgICAgICBjb25zdCB0cnVlRXZlbnROYW1lID0gZXZlbnROYW1lICsgVFJVRV9TVFI7XG4gICAgICAgIGNvbnN0IHN5bWJvbCA9IFpPTkVfU1lNQk9MX1BSRUZJWCArIGZhbHNlRXZlbnROYW1lO1xuICAgICAgICBjb25zdCBzeW1ib2xDYXB0dXJlID0gWk9ORV9TWU1CT0xfUFJFRklYICsgdHJ1ZUV2ZW50TmFtZTtcbiAgICAgICAgem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXSA9IHt9O1xuICAgICAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdW0ZBTFNFX1NUUl0gPSBzeW1ib2w7XG4gICAgICAgIHpvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50TmFtZV1bVFJVRV9TVFJdID0gc3ltYm9sQ2FwdHVyZTtcbiAgICB9XG4gICAgY29uc3QgRVZFTlRfVEFSR0VUID0gX2dsb2JhbFsnRXZlbnRUYXJnZXQnXTtcbiAgICBpZiAoIUVWRU5UX1RBUkdFVCB8fCAhRVZFTlRfVEFSR0VULnByb3RvdHlwZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGFwaS5wYXRjaEV2ZW50VGFyZ2V0KF9nbG9iYWwsIGFwaSwgW0VWRU5UX1RBUkdFVCAmJiBFVkVOVF9UQVJHRVQucHJvdG90eXBlXSk7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBwYXRjaEV2ZW50KGdsb2JhbCwgYXBpKSB7XG4gICAgYXBpLnBhdGNoRXZlbnRQcm90b3R5cGUoZ2xvYmFsLCBhcGkpO1xufVxuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXdcbiAqIEBzdXBwcmVzcyB7Z2xvYmFsVGhpc31cbiAqL1xuZnVuY3Rpb24gZmlsdGVyUHJvcGVydGllcyh0YXJnZXQsIG9uUHJvcGVydGllcywgaWdub3JlUHJvcGVydGllcykge1xuICAgIGlmICghaWdub3JlUHJvcGVydGllcyB8fCBpZ25vcmVQcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb25Qcm9wZXJ0aWVzO1xuICAgIH1cbiAgICBjb25zdCB0aXAgPSBpZ25vcmVQcm9wZXJ0aWVzLmZpbHRlcigoaXApID0+IGlwLnRhcmdldCA9PT0gdGFyZ2V0KTtcbiAgICBpZiAoIXRpcCB8fCB0aXAubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvblByb3BlcnRpZXM7XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldElnbm9yZVByb3BlcnRpZXMgPSB0aXBbMF0uaWdub3JlUHJvcGVydGllcztcbiAgICByZXR1cm4gb25Qcm9wZXJ0aWVzLmZpbHRlcigob3ApID0+IHRhcmdldElnbm9yZVByb3BlcnRpZXMuaW5kZXhPZihvcCkgPT09IC0xKTtcbn1cbmZ1bmN0aW9uIHBhdGNoRmlsdGVyZWRQcm9wZXJ0aWVzKHRhcmdldCwgb25Qcm9wZXJ0aWVzLCBpZ25vcmVQcm9wZXJ0aWVzLCBwcm90b3R5cGUpIHtcbiAgICAvLyBjaGVjayB3aGV0aGVyIHRhcmdldCBpcyBhdmFpbGFibGUsIHNvbWV0aW1lcyB0YXJnZXQgd2lsbCBiZSB1bmRlZmluZWRcbiAgICAvLyBiZWNhdXNlIGRpZmZlcmVudCBicm93c2VyIG9yIHNvbWUgM3JkIHBhcnR5IHBsdWdpbi5cbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlcmVkUHJvcGVydGllcyA9IGZpbHRlclByb3BlcnRpZXModGFyZ2V0LCBvblByb3BlcnRpZXMsIGlnbm9yZVByb3BlcnRpZXMpO1xuICAgIHBhdGNoT25Qcm9wZXJ0aWVzKHRhcmdldCwgZmlsdGVyZWRQcm9wZXJ0aWVzLCBwcm90b3R5cGUpO1xufVxuLyoqXG4gKiBHZXQgYWxsIGV2ZW50IG5hbWUgcHJvcGVydGllcyB3aGljaCB0aGUgZXZlbnQgbmFtZSBzdGFydHNXaXRoIGBvbmBcbiAqIGZyb20gdGhlIHRhcmdldCBvYmplY3QgaXRzZWxmLCBpbmhlcml0ZWQgcHJvcGVydGllcyBhcmUgbm90IGNvbnNpZGVyZWQuXG4gKi9cbmZ1bmN0aW9uIGdldE9uRXZlbnROYW1lcyh0YXJnZXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KVxuICAgICAgICAuZmlsdGVyKChuYW1lKSA9PiBuYW1lLnN0YXJ0c1dpdGgoJ29uJykgJiYgbmFtZS5sZW5ndGggPiAyKVxuICAgICAgICAubWFwKChuYW1lKSA9PiBuYW1lLnN1YnN0cmluZygyKSk7XG59XG5mdW5jdGlvbiBwcm9wZXJ0eURlc2NyaXB0b3JQYXRjaChhcGksIF9nbG9iYWwpIHtcbiAgICBpZiAoaXNOb2RlICYmICFpc01peCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChab25lW2FwaS5zeW1ib2woJ3BhdGNoRXZlbnRzJyldKSB7XG4gICAgICAgIC8vIGV2ZW50cyBhcmUgYWxyZWFkeSBiZWVuIHBhdGNoZWQgYnkgbGVnYWN5IHBhdGNoLlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlnbm9yZVByb3BlcnRpZXMgPSBfZ2xvYmFsWydfX1pvbmVfaWdub3JlX29uX3Byb3BlcnRpZXMnXTtcbiAgICAvLyBmb3IgYnJvd3NlcnMgdGhhdCB3ZSBjYW4gcGF0Y2ggdGhlIGRlc2NyaXB0b3I6ICBDaHJvbWUgJiBGaXJlZm94XG4gICAgbGV0IHBhdGNoVGFyZ2V0cyA9IFtdO1xuICAgIGlmIChpc0Jyb3dzZXIpIHtcbiAgICAgICAgY29uc3QgaW50ZXJuYWxXaW5kb3cgPSB3aW5kb3c7XG4gICAgICAgIHBhdGNoVGFyZ2V0cyA9IHBhdGNoVGFyZ2V0cy5jb25jYXQoW1xuICAgICAgICAgICAgJ0RvY3VtZW50JyxcbiAgICAgICAgICAgICdTVkdFbGVtZW50JyxcbiAgICAgICAgICAgICdFbGVtZW50JyxcbiAgICAgICAgICAgICdIVE1MRWxlbWVudCcsXG4gICAgICAgICAgICAnSFRNTEJvZHlFbGVtZW50JyxcbiAgICAgICAgICAgICdIVE1MTWVkaWFFbGVtZW50JyxcbiAgICAgICAgICAgICdIVE1MRnJhbWVTZXRFbGVtZW50JyxcbiAgICAgICAgICAgICdIVE1MRnJhbWVFbGVtZW50JyxcbiAgICAgICAgICAgICdIVE1MSUZyYW1lRWxlbWVudCcsXG4gICAgICAgICAgICAnSFRNTE1hcnF1ZWVFbGVtZW50JyxcbiAgICAgICAgICAgICdXb3JrZXInLFxuICAgICAgICBdKTtcbiAgICAgICAgY29uc3QgaWdub3JlRXJyb3JQcm9wZXJ0aWVzID0gaXNJRSgpXG4gICAgICAgICAgICA/IFt7IHRhcmdldDogaW50ZXJuYWxXaW5kb3csIGlnbm9yZVByb3BlcnRpZXM6IFsnZXJyb3InXSB9XVxuICAgICAgICAgICAgOiBbXTtcbiAgICAgICAgLy8gaW4gSUUvRWRnZSwgb25Qcm9wIG5vdCBleGlzdCBpbiB3aW5kb3cgb2JqZWN0LCBidXQgaW4gV2luZG93UHJvdG90eXBlXG4gICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gcGFzcyBXaW5kb3dQcm90b3R5cGUgdG8gY2hlY2sgb25Qcm9wIGV4aXN0IG9yIG5vdFxuICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhpbnRlcm5hbFdpbmRvdywgZ2V0T25FdmVudE5hbWVzKGludGVybmFsV2luZG93KSwgaWdub3JlUHJvcGVydGllcyA/IGlnbm9yZVByb3BlcnRpZXMuY29uY2F0KGlnbm9yZUVycm9yUHJvcGVydGllcykgOiBpZ25vcmVQcm9wZXJ0aWVzLCBPYmplY3RHZXRQcm90b3R5cGVPZihpbnRlcm5hbFdpbmRvdykpO1xuICAgIH1cbiAgICBwYXRjaFRhcmdldHMgPSBwYXRjaFRhcmdldHMuY29uY2F0KFtcbiAgICAgICAgJ1hNTEh0dHBSZXF1ZXN0JyxcbiAgICAgICAgJ1hNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQnLFxuICAgICAgICAnSURCSW5kZXgnLFxuICAgICAgICAnSURCUmVxdWVzdCcsXG4gICAgICAgICdJREJPcGVuREJSZXF1ZXN0JyxcbiAgICAgICAgJ0lEQkRhdGFiYXNlJyxcbiAgICAgICAgJ0lEQlRyYW5zYWN0aW9uJyxcbiAgICAgICAgJ0lEQkN1cnNvcicsXG4gICAgICAgICdXZWJTb2NrZXQnLFxuICAgIF0pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0Y2hUYXJnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IF9nbG9iYWxbcGF0Y2hUYXJnZXRzW2ldXTtcbiAgICAgICAgdGFyZ2V0ICYmXG4gICAgICAgICAgICB0YXJnZXQucHJvdG90eXBlICYmXG4gICAgICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyh0YXJnZXQucHJvdG90eXBlLCBnZXRPbkV2ZW50TmFtZXModGFyZ2V0LnByb3RvdHlwZSksIGlnbm9yZVByb3BlcnRpZXMpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3XG4gKiBAc3VwcHJlc3Mge21pc3NpbmdSZXF1aXJlfVxuICovXG5mdW5jdGlvbiBwYXRjaEJyb3dzZXIoWm9uZSkge1xuICAgIFpvbmUuX19sb2FkX3BhdGNoKCdsZWdhY3knLCAoZ2xvYmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IGxlZ2FjeVBhdGNoID0gZ2xvYmFsW1pvbmUuX19zeW1ib2xfXygnbGVnYWN5UGF0Y2gnKV07XG4gICAgICAgIGlmIChsZWdhY3lQYXRjaCkge1xuICAgICAgICAgICAgbGVnYWN5UGF0Y2goKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFpvbmUuX19sb2FkX3BhdGNoKCd0aW1lcnMnLCAoZ2xvYmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IHNldCA9ICdzZXQnO1xuICAgICAgICBjb25zdCBjbGVhciA9ICdjbGVhcic7XG4gICAgICAgIHBhdGNoVGltZXIoZ2xvYmFsLCBzZXQsIGNsZWFyLCAnVGltZW91dCcpO1xuICAgICAgICBwYXRjaFRpbWVyKGdsb2JhbCwgc2V0LCBjbGVhciwgJ0ludGVydmFsJyk7XG4gICAgICAgIHBhdGNoVGltZXIoZ2xvYmFsLCBzZXQsIGNsZWFyLCAnSW1tZWRpYXRlJyk7XG4gICAgfSk7XG4gICAgWm9uZS5fX2xvYWRfcGF0Y2goJ3JlcXVlc3RBbmltYXRpb25GcmFtZScsIChnbG9iYWwpID0+IHtcbiAgICAgICAgcGF0Y2hUaW1lcihnbG9iYWwsICdyZXF1ZXN0JywgJ2NhbmNlbCcsICdBbmltYXRpb25GcmFtZScpO1xuICAgICAgICBwYXRjaFRpbWVyKGdsb2JhbCwgJ21velJlcXVlc3QnLCAnbW96Q2FuY2VsJywgJ0FuaW1hdGlvbkZyYW1lJyk7XG4gICAgICAgIHBhdGNoVGltZXIoZ2xvYmFsLCAnd2Via2l0UmVxdWVzdCcsICd3ZWJraXRDYW5jZWwnLCAnQW5pbWF0aW9uRnJhbWUnKTtcbiAgICB9KTtcbiAgICBab25lLl9fbG9hZF9wYXRjaCgnYmxvY2tpbmcnLCAoZ2xvYmFsLCBab25lKSA9PiB7XG4gICAgICAgIGNvbnN0IGJsb2NraW5nTWV0aG9kcyA9IFsnYWxlcnQnLCAncHJvbXB0JywgJ2NvbmZpcm0nXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibG9ja2luZ01ldGhvZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBibG9ja2luZ01ldGhvZHNbaV07XG4gICAgICAgICAgICBwYXRjaE1ldGhvZChnbG9iYWwsIG5hbWUsIChkZWxlZ2F0ZSwgc3ltYm9sLCBuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzLCBhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBab25lLmN1cnJlbnQucnVuKGRlbGVnYXRlLCBnbG9iYWwsIGFyZ3MsIG5hbWUpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFpvbmUuX19sb2FkX3BhdGNoKCdFdmVudFRhcmdldCcsIChnbG9iYWwsIFpvbmUsIGFwaSkgPT4ge1xuICAgICAgICBwYXRjaEV2ZW50KGdsb2JhbCwgYXBpKTtcbiAgICAgICAgZXZlbnRUYXJnZXRQYXRjaChnbG9iYWwsIGFwaSk7XG4gICAgICAgIC8vIHBhdGNoIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQncyBhZGRFdmVudExpc3RlbmVyL3JlbW92ZUV2ZW50TGlzdGVuZXJcbiAgICAgICAgY29uc3QgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCA9IGdsb2JhbFsnWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCddO1xuICAgICAgICBpZiAoWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCAmJiBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0LnByb3RvdHlwZSkge1xuICAgICAgICAgICAgYXBpLnBhdGNoRXZlbnRUYXJnZXQoZ2xvYmFsLCBhcGksIFtYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0LnByb3RvdHlwZV0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgWm9uZS5fX2xvYWRfcGF0Y2goJ011dGF0aW9uT2JzZXJ2ZXInLCAoZ2xvYmFsLCBab25lLCBhcGkpID0+IHtcbiAgICAgICAgcGF0Y2hDbGFzcygnTXV0YXRpb25PYnNlcnZlcicpO1xuICAgICAgICBwYXRjaENsYXNzKCdXZWJLaXRNdXRhdGlvbk9ic2VydmVyJyk7XG4gICAgfSk7XG4gICAgWm9uZS5fX2xvYWRfcGF0Y2goJ0ludGVyc2VjdGlvbk9ic2VydmVyJywgKGdsb2JhbCwgWm9uZSwgYXBpKSA9PiB7XG4gICAgICAgIHBhdGNoQ2xhc3MoJ0ludGVyc2VjdGlvbk9ic2VydmVyJyk7XG4gICAgfSk7XG4gICAgWm9uZS5fX2xvYWRfcGF0Y2goJ0ZpbGVSZWFkZXInLCAoZ2xvYmFsLCBab25lLCBhcGkpID0+IHtcbiAgICAgICAgcGF0Y2hDbGFzcygnRmlsZVJlYWRlcicpO1xuICAgIH0pO1xuICAgIFpvbmUuX19sb2FkX3BhdGNoKCdvbl9wcm9wZXJ0eScsIChnbG9iYWwsIFpvbmUsIGFwaSkgPT4ge1xuICAgICAgICBwcm9wZXJ0eURlc2NyaXB0b3JQYXRjaChhcGksIGdsb2JhbCk7XG4gICAgfSk7XG4gICAgWm9uZS5fX2xvYWRfcGF0Y2goJ2N1c3RvbUVsZW1lbnRzJywgKGdsb2JhbCwgWm9uZSwgYXBpKSA9PiB7XG4gICAgICAgIHBhdGNoQ3VzdG9tRWxlbWVudHMoZ2xvYmFsLCBhcGkpO1xuICAgIH0pO1xuICAgIFpvbmUuX19sb2FkX3BhdGNoKCdYSFInLCAoZ2xvYmFsLCBab25lKSA9PiB7XG4gICAgICAgIC8vIFRyZWF0IFhNTEh0dHBSZXF1ZXN0IGFzIGEgbWFjcm90YXNrLlxuICAgICAgICBwYXRjaFhIUihnbG9iYWwpO1xuICAgICAgICBjb25zdCBYSFJfVEFTSyA9IHpvbmVTeW1ib2woJ3hoclRhc2snKTtcbiAgICAgICAgY29uc3QgWEhSX1NZTkMgPSB6b25lU3ltYm9sKCd4aHJTeW5jJyk7XG4gICAgICAgIGNvbnN0IFhIUl9MSVNURU5FUiA9IHpvbmVTeW1ib2woJ3hockxpc3RlbmVyJyk7XG4gICAgICAgIGNvbnN0IFhIUl9TQ0hFRFVMRUQgPSB6b25lU3ltYm9sKCd4aHJTY2hlZHVsZWQnKTtcbiAgICAgICAgY29uc3QgWEhSX1VSTCA9IHpvbmVTeW1ib2woJ3hoclVSTCcpO1xuICAgICAgICBjb25zdCBYSFJfRVJST1JfQkVGT1JFX1NDSEVEVUxFRCA9IHpvbmVTeW1ib2woJ3hockVycm9yQmVmb3JlU2NoZWR1bGVkJyk7XG4gICAgICAgIGZ1bmN0aW9uIHBhdGNoWEhSKHdpbmRvdykge1xuICAgICAgICAgICAgY29uc3QgWE1MSHR0cFJlcXVlc3QgPSB3aW5kb3dbJ1hNTEh0dHBSZXF1ZXN0J107XG4gICAgICAgICAgICBpZiAoIVhNTEh0dHBSZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgLy8gWE1MSHR0cFJlcXVlc3QgaXMgbm90IGF2YWlsYWJsZSBpbiBzZXJ2aWNlIHdvcmtlclxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlID0gWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlO1xuICAgICAgICAgICAgZnVuY3Rpb24gZmluZFBlbmRpbmdUYXNrKHRhcmdldCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbWEhSX1RBU0tdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG9yaUFkZExpc3RlbmVyID0gWE1MSHR0cFJlcXVlc3RQcm90b3R5cGVbWk9ORV9TWU1CT0xfQUREX0VWRU5UX0xJU1RFTkVSXTtcbiAgICAgICAgICAgIGxldCBvcmlSZW1vdmVMaXN0ZW5lciA9IFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlW1pPTkVfU1lNQk9MX1JFTU9WRV9FVkVOVF9MSVNURU5FUl07XG4gICAgICAgICAgICBpZiAoIW9yaUFkZExpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCA9IHdpbmRvd1snWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCddO1xuICAgICAgICAgICAgICAgIGlmIChYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXRQcm90b3R5cGUgPSBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0LnByb3RvdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgb3JpQWRkTGlzdGVuZXIgPSBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0UHJvdG90eXBlW1pPTkVfU1lNQk9MX0FERF9FVkVOVF9MSVNURU5FUl07XG4gICAgICAgICAgICAgICAgICAgIG9yaVJlbW92ZUxpc3RlbmVyID0gWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldFByb3RvdHlwZVtaT05FX1NZTUJPTF9SRU1PVkVfRVZFTlRfTElTVEVORVJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IFJFQURZX1NUQVRFX0NIQU5HRSA9ICdyZWFkeXN0YXRlY2hhbmdlJztcbiAgICAgICAgICAgIGNvbnN0IFNDSEVEVUxFRCA9ICdzY2hlZHVsZWQnO1xuICAgICAgICAgICAgZnVuY3Rpb24gc2NoZWR1bGVUYXNrKHRhc2spIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gdGFzay5kYXRhO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGRhdGEudGFyZ2V0O1xuICAgICAgICAgICAgICAgIHRhcmdldFtYSFJfU0NIRURVTEVEXSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRhcmdldFtYSFJfRVJST1JfQkVGT1JFX1NDSEVEVUxFRF0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgZXhpc3RpbmcgZXZlbnQgbGlzdGVuZXJcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ZW5lciA9IHRhcmdldFtYSFJfTElTVEVORVJdO1xuICAgICAgICAgICAgICAgIGlmICghb3JpQWRkTGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpQWRkTGlzdGVuZXIgPSB0YXJnZXRbWk9ORV9TWU1CT0xfQUREX0VWRU5UX0xJU1RFTkVSXTtcbiAgICAgICAgICAgICAgICAgICAgb3JpUmVtb3ZlTGlzdGVuZXIgPSB0YXJnZXRbWk9ORV9TWU1CT0xfUkVNT1ZFX0VWRU5UX0xJU1RFTkVSXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaVJlbW92ZUxpc3RlbmVyLmNhbGwodGFyZ2V0LCBSRUFEWV9TVEFURV9DSEFOR0UsIGxpc3RlbmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3TGlzdGVuZXIgPSAodGFyZ2V0W1hIUl9MSVNURU5FUl0gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQucmVhZHlTdGF0ZSA9PT0gdGFyZ2V0LkRPTkUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWV0aW1lcyBvbiBzb21lIGJyb3dzZXJzIFhNTEh0dHBSZXF1ZXN0IHdpbGwgZmlyZSBvbnJlYWR5c3RhdGVjaGFuZ2Ugd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVhZHlTdGF0ZT00IG11bHRpcGxlIHRpbWVzLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIHRhc2sgc3RhdGUgaGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLmFib3J0ZWQgJiYgdGFyZ2V0W1hIUl9TQ0hFRFVMRURdICYmIHRhc2suc3RhdGUgPT09IFNDSEVEVUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIHhociBoYXMgcmVnaXN0ZXJlZCBvbmxvYWQgbGlzdGVuZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGF0IGlzIHRoZSBjYXNlLCB0aGUgdGFzayBzaG91bGQgaW52b2tlIGFmdGVyIGFsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubG9hZCBsaXN0ZW5lcnMgZmluaXNoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsc28gaWYgdGhlIHJlcXVlc3QgZmFpbGVkIHdpdGhvdXQgcmVzcG9uc2UgKHN0YXR1cyA9IDApLCB0aGUgbG9hZCBldmVudCBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBub3QgYmUgdHJpZ2dlcmVkLCBpbiB0aGF0IGNhc2UsIHdlIHNob3VsZCBhbHNvIGludm9rZSB0aGUgcGxhY2Vob2xkZXIgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBjbG9zZSB0aGUgWE1MSHR0cFJlcXVlc3Q6OnNlbmQgbWFjcm9UYXNrLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzM4Nzk1XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZFRhc2tzID0gdGFyZ2V0W1pvbmUuX19zeW1ib2xfXygnbG9hZGZhbHNlJyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuc3RhdHVzICE9PSAwICYmIGxvYWRUYXNrcyAmJiBsb2FkVGFza3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlJbnZva2UgPSB0YXNrLmludm9rZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5pbnZva2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGxvYWQgdGhlIHRhc2tzIGFnYWluLCBiZWNhdXNlIGluIG90aGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIGxpc3RlbmVyLCB0aGV5IG1heSByZW1vdmUgdGhlbXNlbHZlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZFRhc2tzID0gdGFyZ2V0W1pvbmUuX19zeW1ib2xfXygnbG9hZGZhbHNlJyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2FkVGFza3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZFRhc2tzW2ldID09PSB0YXNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRUYXNrcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLmFib3J0ZWQgJiYgdGFzay5zdGF0ZSA9PT0gU0NIRURVTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpSW52b2tlLmNhbGwodGFzayk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRUYXNrcy5wdXNoKHRhc2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5pbnZva2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghZGF0YS5hYm9ydGVkICYmIHRhcmdldFtYSFJfU0NIRURVTEVEXSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciBvY2N1cnMgd2hlbiB4aHIuc2VuZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W1hIUl9FUlJPUl9CRUZPUkVfU0NIRURVTEVEXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBvcmlBZGRMaXN0ZW5lci5jYWxsKHRhcmdldCwgUkVBRFlfU1RBVEVfQ0hBTkdFLCBuZXdMaXN0ZW5lcik7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RvcmVkVGFzayA9IHRhcmdldFtYSFJfVEFTS107XG4gICAgICAgICAgICAgICAgaWYgKCFzdG9yZWRUYXNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtYSFJfVEFTS10gPSB0YXNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZW5kTmF0aXZlLmFwcGx5KHRhcmdldCwgZGF0YS5hcmdzKTtcbiAgICAgICAgICAgICAgICB0YXJnZXRbWEhSX1NDSEVEVUxFRF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXNrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gcGxhY2Vob2xkZXJDYWxsYmFjaygpIHsgfVxuICAgICAgICAgICAgZnVuY3Rpb24gY2xlYXJUYXNrKHRhc2spIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gdGFzay5kYXRhO1xuICAgICAgICAgICAgICAgIC8vIE5vdGUgLSBpZGVhbGx5LCB3ZSB3b3VsZCBjYWxsIGRhdGEudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIgaGVyZSwgYnV0IGl0J3MgdG9vIGxhdGVcbiAgICAgICAgICAgICAgICAvLyB0byBwcmV2ZW50IGl0IGZyb20gZmlyaW5nLiBTbyBpbnN0ZWFkLCB3ZSBzdG9yZSBpbmZvIGZvciB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAgICAgICAgICAgICAgZGF0YS5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWJvcnROYXRpdmUuYXBwbHkoZGF0YS50YXJnZXQsIGRhdGEuYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvcGVuTmF0aXZlID0gcGF0Y2hNZXRob2QoWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUsICdvcGVuJywgKCkgPT4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICBzZWxmW1hIUl9TWU5DXSA9IGFyZ3NbMl0gPT0gZmFsc2U7XG4gICAgICAgICAgICAgICAgc2VsZltYSFJfVVJMXSA9IGFyZ3NbMV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wZW5OYXRpdmUuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IFhNTEhUVFBSRVFVRVNUX1NPVVJDRSA9ICdYTUxIdHRwUmVxdWVzdC5zZW5kJztcbiAgICAgICAgICAgIGNvbnN0IGZldGNoVGFza0Fib3J0aW5nID0gem9uZVN5bWJvbCgnZmV0Y2hUYXNrQWJvcnRpbmcnKTtcbiAgICAgICAgICAgIGNvbnN0IGZldGNoVGFza1NjaGVkdWxpbmcgPSB6b25lU3ltYm9sKCdmZXRjaFRhc2tTY2hlZHVsaW5nJyk7XG4gICAgICAgICAgICBjb25zdCBzZW5kTmF0aXZlID0gcGF0Y2hNZXRob2QoWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUsICdzZW5kJywgKCkgPT4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICBpZiAoWm9uZS5jdXJyZW50W2ZldGNoVGFza1NjaGVkdWxpbmddID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGEgZmV0Y2ggaXMgc2NoZWR1bGluZywgc28gd2UgYXJlIHVzaW5nIHhociB0byBwb2x5ZmlsbCBmZXRjaFxuICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYmVjYXVzZSB3ZSBhbHJlYWR5IHNjaGVkdWxlIG1hY3JvVGFzayBmb3IgZmV0Y2gsIHdlIHNob3VsZFxuICAgICAgICAgICAgICAgICAgICAvLyBub3Qgc2NoZWR1bGUgYSBtYWNyb1Rhc2sgZm9yIHhociBhZ2FpblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VuZE5hdGl2ZS5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNlbGZbWEhSX1NZTkNdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBYSFIgaXMgc3luYyB0aGVyZSBpcyBubyB0YXNrIHRvIHNjaGVkdWxlLCBqdXN0IGV4ZWN1dGUgdGhlIGNvZGUuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZW5kTmF0aXZlLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogc2VsZixcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogc2VsZltYSFJfVVJMXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzUGVyaW9kaWM6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogYXJncyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXNrID0gc2NoZWR1bGVNYWNyb1Rhc2tXaXRoQ3VycmVudFpvbmUoWE1MSFRUUFJFUVVFU1RfU09VUkNFLCBwbGFjZWhvbGRlckNhbGxiYWNrLCBvcHRpb25zLCBzY2hlZHVsZVRhc2ssIGNsZWFyVGFzayk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxmICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmW1hIUl9FUlJPUl9CRUZPUkVfU0NIRURVTEVEXSA9PT0gdHJ1ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIW9wdGlvbnMuYWJvcnRlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5zdGF0ZSA9PT0gU0NIRURVTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB4aHIgcmVxdWVzdCB0aHJvdyBlcnJvciB3aGVuIHNlbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCBpbnZva2UgdGFzayBpbnN0ZWFkIG9mIGxlYXZpbmcgYSBzY2hlZHVsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlbmRpbmcgbWFjcm9UYXNrXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmludm9rZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBhYm9ydE5hdGl2ZSA9IHBhdGNoTWV0aG9kKFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlLCAnYWJvcnQnLCAoKSA9PiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhc2sgPSBmaW5kUGVuZGluZ1Rhc2soc2VsZik7XG4gICAgICAgICAgICAgICAgaWYgKHRhc2sgJiYgdHlwZW9mIHRhc2sudHlwZSA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgWEhSIGhhcyBhbHJlYWR5IGNvbXBsZXRlZCwgZG8gbm90aGluZy5cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIFhIUiBoYXMgYWxyZWFkeSBiZWVuIGFib3J0ZWQsIGRvIG5vdGhpbmcuXG4gICAgICAgICAgICAgICAgICAgIC8vIEZpeCAjNTY5LCBjYWxsIGFib3J0IG11bHRpcGxlIHRpbWVzIGJlZm9yZSBkb25lIHdpbGwgY2F1c2VcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFjcm9UYXNrIHRhc2sgY291bnQgYmUgbmVnYXRpdmUgbnVtYmVyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXNrLmNhbmNlbEZuID09IG51bGwgfHwgKHRhc2suZGF0YSAmJiB0YXNrLmRhdGEuYWJvcnRlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0YXNrLnpvbmUuY2FuY2VsVGFzayh0YXNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoWm9uZS5jdXJyZW50W2ZldGNoVGFza0Fib3J0aW5nXSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWJvcnQgaXMgY2FsbGVkIGZyb20gZmV0Y2ggcG9seWZpbGwsIHdlIG5lZWQgdG8gY2FsbCBuYXRpdmUgYWJvcnQgb2YgWEhSLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWJvcnROYXRpdmUuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UgYXJlIHRyeWluZyB0byBhYm9ydCBhbiBYSFIgd2hpY2ggaGFzIG5vdCB5ZXQgYmVlbiBzZW50LCBzbyB0aGVyZSBpcyBub1xuICAgICAgICAgICAgICAgIC8vIHRhc2tcbiAgICAgICAgICAgICAgICAvLyB0byBjYW5jZWwuIERvIG5vdGhpbmcuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFpvbmUuX19sb2FkX3BhdGNoKCdnZW9sb2NhdGlvbicsIChnbG9iYWwpID0+IHtcbiAgICAgICAgLy8vIEdFT19MT0NBVElPTlxuICAgICAgICBpZiAoZ2xvYmFsWyduYXZpZ2F0b3InXSAmJiBnbG9iYWxbJ25hdmlnYXRvciddLmdlb2xvY2F0aW9uKSB7XG4gICAgICAgICAgICBwYXRjaFByb3RvdHlwZShnbG9iYWxbJ25hdmlnYXRvciddLmdlb2xvY2F0aW9uLCBbJ2dldEN1cnJlbnRQb3NpdGlvbicsICd3YXRjaFBvc2l0aW9uJ10pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgWm9uZS5fX2xvYWRfcGF0Y2goJ1Byb21pc2VSZWplY3Rpb25FdmVudCcsIChnbG9iYWwsIFpvbmUpID0+IHtcbiAgICAgICAgLy8gaGFuZGxlIHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvblxuICAgICAgICBmdW5jdGlvbiBmaW5kUHJvbWlzZVJlamVjdGlvbkhhbmRsZXIoZXZ0TmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRUYXNrcyA9IGZpbmRFdmVudFRhc2tzKGdsb2JhbCwgZXZ0TmFtZSk7XG4gICAgICAgICAgICAgICAgZXZlbnRUYXNrcy5mb3JFYWNoKChldmVudFRhc2spID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gd2luZG93cyBoYXMgYWRkZWQgdW5oYW5kbGVkcmVqZWN0aW9uIGV2ZW50IGxpc3RlbmVyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdGhlIGV2ZW50IGxpc3RlbmVyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb21pc2VSZWplY3Rpb25FdmVudCA9IGdsb2JhbFsnUHJvbWlzZVJlamVjdGlvbkV2ZW50J107XG4gICAgICAgICAgICAgICAgICAgIGlmIChQcm9taXNlUmVqZWN0aW9uRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2dCA9IG5ldyBQcm9taXNlUmVqZWN0aW9uRXZlbnQoZXZ0TmFtZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2U6IGUucHJvbWlzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IGUucmVqZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFRhc2suaW52b2tlKGV2dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdsb2JhbFsnUHJvbWlzZVJlamVjdGlvbkV2ZW50J10pIHtcbiAgICAgICAgICAgIFpvbmVbem9uZVN5bWJvbCgndW5oYW5kbGVkUHJvbWlzZVJlamVjdGlvbkhhbmRsZXInKV0gPVxuICAgICAgICAgICAgICAgIGZpbmRQcm9taXNlUmVqZWN0aW9uSGFuZGxlcigndW5oYW5kbGVkcmVqZWN0aW9uJyk7XG4gICAgICAgICAgICBab25lW3pvbmVTeW1ib2woJ3JlamVjdGlvbkhhbmRsZWRIYW5kbGVyJyldID1cbiAgICAgICAgICAgICAgICBmaW5kUHJvbWlzZVJlamVjdGlvbkhhbmRsZXIoJ3JlamVjdGlvbmhhbmRsZWQnKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFpvbmUuX19sb2FkX3BhdGNoKCdxdWV1ZU1pY3JvdGFzaycsIChnbG9iYWwsIFpvbmUsIGFwaSkgPT4ge1xuICAgICAgICBwYXRjaFF1ZXVlTWljcm90YXNrKGdsb2JhbCwgYXBpKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gcGF0Y2hQcm9taXNlKFpvbmUpIHtcbiAgICBab25lLl9fbG9hZF9wYXRjaCgnWm9uZUF3YXJlUHJvbWlzZScsIChnbG9iYWwsIFpvbmUsIGFwaSkgPT4ge1xuICAgICAgICBjb25zdCBPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuICAgICAgICBjb25zdCBPYmplY3REZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbiAgICAgICAgZnVuY3Rpb24gcmVhZGFibGVPYmplY3RUb1N0cmluZyhvYmopIHtcbiAgICAgICAgICAgIGlmIChvYmogJiYgb2JqLnRvU3RyaW5nID09PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gb2JqLmNvbnN0cnVjdG9yICYmIG9iai5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICAgICAgICAgIHJldHVybiAoY2xhc3NOYW1lID8gY2xhc3NOYW1lIDogJycpICsgJzogJyArIEpTT04uc3RyaW5naWZ5KG9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb2JqID8gb2JqLnRvU3RyaW5nKCkgOiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBfX3N5bWJvbF9fID0gYXBpLnN5bWJvbDtcbiAgICAgICAgY29uc3QgX3VuY2F1Z2h0UHJvbWlzZUVycm9ycyA9IFtdO1xuICAgICAgICBjb25zdCBpc0Rpc2FibGVXcmFwcGluZ1VuY2F1Z2h0UHJvbWlzZVJlamVjdGlvbiA9IGdsb2JhbFtfX3N5bWJvbF9fKCdESVNBQkxFX1dSQVBQSU5HX1VOQ0FVR0hUX1BST01JU0VfUkVKRUNUSU9OJyldICE9PSBmYWxzZTtcbiAgICAgICAgY29uc3Qgc3ltYm9sUHJvbWlzZSA9IF9fc3ltYm9sX18oJ1Byb21pc2UnKTtcbiAgICAgICAgY29uc3Qgc3ltYm9sVGhlbiA9IF9fc3ltYm9sX18oJ3RoZW4nKTtcbiAgICAgICAgY29uc3QgY3JlYXRpb25UcmFjZSA9ICdfX2NyZWF0aW9uVHJhY2VfXyc7XG4gICAgICAgIGFwaS5vblVuaGFuZGxlZEVycm9yID0gKGUpID0+IHtcbiAgICAgICAgICAgIGlmIChhcGkuc2hvd1VuY2F1Z2h0RXJyb3IoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlamVjdGlvbiA9IGUgJiYgZS5yZWplY3Rpb247XG4gICAgICAgICAgICAgICAgaWYgKHJlamVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmhhbmRsZWQgUHJvbWlzZSByZWplY3Rpb246JywgcmVqZWN0aW9uIGluc3RhbmNlb2YgRXJyb3IgPyByZWplY3Rpb24ubWVzc2FnZSA6IHJlamVjdGlvbiwgJzsgWm9uZTonLCBlLnpvbmUubmFtZSwgJzsgVGFzazonLCBlLnRhc2sgJiYgZS50YXNrLnNvdXJjZSwgJzsgVmFsdWU6JywgcmVqZWN0aW9uLCByZWplY3Rpb24gaW5zdGFuY2VvZiBFcnJvciA/IHJlamVjdGlvbi5zdGFjayA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgYXBpLm1pY3JvdGFza0RyYWluRG9uZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHdoaWxlIChfdW5jYXVnaHRQcm9taXNlRXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVuY2F1Z2h0UHJvbWlzZUVycm9yID0gX3VuY2F1Z2h0UHJvbWlzZUVycm9ycy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHVuY2F1Z2h0UHJvbWlzZUVycm9yLnpvbmUucnVuR3VhcmRlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5jYXVnaHRQcm9taXNlRXJyb3IudGhyb3dPcmlnaW5hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHVuY2F1Z2h0UHJvbWlzZUVycm9yLnJlamVjdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHVuY2F1Z2h0UHJvbWlzZUVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZVVuaGFuZGxlZFJlamVjdGlvbihlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBVTkhBTkRMRURfUFJPTUlTRV9SRUpFQ1RJT05fSEFORExFUl9TWU1CT0wgPSBfX3N5bWJvbF9fKCd1bmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uSGFuZGxlcicpO1xuICAgICAgICBmdW5jdGlvbiBoYW5kbGVVbmhhbmRsZWRSZWplY3Rpb24oZSkge1xuICAgICAgICAgICAgYXBpLm9uVW5oYW5kbGVkRXJyb3IoZSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBab25lW1VOSEFORExFRF9QUk9NSVNFX1JFSkVDVElPTl9IQU5ETEVSX1NZTUJPTF07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7IH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpc1RoZW5hYmxlKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgJiYgdmFsdWUudGhlbjtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBmb3J3YXJkUmVzb2x1dGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGZvcndhcmRSZWplY3Rpb24ocmVqZWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gWm9uZUF3YXJlUHJvbWlzZS5yZWplY3QocmVqZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzeW1ib2xTdGF0ZSA9IF9fc3ltYm9sX18oJ3N0YXRlJyk7XG4gICAgICAgIGNvbnN0IHN5bWJvbFZhbHVlID0gX19zeW1ib2xfXygndmFsdWUnKTtcbiAgICAgICAgY29uc3Qgc3ltYm9sRmluYWxseSA9IF9fc3ltYm9sX18oJ2ZpbmFsbHknKTtcbiAgICAgICAgY29uc3Qgc3ltYm9sUGFyZW50UHJvbWlzZVZhbHVlID0gX19zeW1ib2xfXygncGFyZW50UHJvbWlzZVZhbHVlJyk7XG4gICAgICAgIGNvbnN0IHN5bWJvbFBhcmVudFByb21pc2VTdGF0ZSA9IF9fc3ltYm9sX18oJ3BhcmVudFByb21pc2VTdGF0ZScpO1xuICAgICAgICBjb25zdCBzb3VyY2UgPSAnUHJvbWlzZS50aGVuJztcbiAgICAgICAgY29uc3QgVU5SRVNPTFZFRCA9IG51bGw7XG4gICAgICAgIGNvbnN0IFJFU09MVkVEID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgUkVKRUNURUQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgUkVKRUNURURfTk9fQ0FUQ0ggPSAwO1xuICAgICAgICBmdW5jdGlvbiBtYWtlUmVzb2x2ZXIocHJvbWlzZSwgc3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiAodikgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKHByb21pc2UsIHN0YXRlLCB2KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShwcm9taXNlLCBmYWxzZSwgZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IHJldHVybiB2YWx1ZSBvciB5b3Ugd2lsbCBicmVhayB0aGUgUHJvbWlzZSBzcGVjLlxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IHdhc0NhbGxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHdyYXBwZXIod3JhcHBlZEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdhc0NhbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHdhc0NhbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHdyYXBwZWRGdW5jdGlvbi5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBUWVBFX0VSUk9SID0gJ1Byb21pc2UgcmVzb2x2ZWQgd2l0aCBpdHNlbGYnO1xuICAgICAgICBjb25zdCBDVVJSRU5UX1RBU0tfVFJBQ0VfU1lNQk9MID0gX19zeW1ib2xfXygnY3VycmVudFRhc2tUcmFjZScpO1xuICAgICAgICAvLyBQcm9taXNlIFJlc29sdXRpb25cbiAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgc3RhdGUsIHZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBvbmNlV3JhcHBlciA9IG9uY2UoKTtcbiAgICAgICAgICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoVFlQRV9FUlJPUik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJvbWlzZVtzeW1ib2xTdGF0ZV0gPT09IFVOUkVTT0xWRUQpIHtcbiAgICAgICAgICAgICAgICAvLyBzaG91bGQgb25seSBnZXQgdmFsdWUudGhlbiBvbmNlIGJhc2VkIG9uIHByb21pc2Ugc3BlYy5cbiAgICAgICAgICAgICAgICBsZXQgdGhlbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGVuID0gdmFsdWUgJiYgdmFsdWUudGhlbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uY2VXcmFwcGVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKHByb21pc2UsIGZhbHNlLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gaWYgKHZhbHVlIGluc3RhbmNlb2YgWm9uZUF3YXJlUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gUkVKRUNURUQgJiZcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBab25lQXdhcmVQcm9taXNlICYmXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLmhhc093blByb3BlcnR5KHN5bWJvbFN0YXRlKSAmJlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5oYXNPd25Qcm9wZXJ0eShzeW1ib2xWYWx1ZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVbc3ltYm9sU3RhdGVdICE9PSBVTlJFU09MVkVEKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyUmVqZWN0ZWROb0NhdGNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgdmFsdWVbc3ltYm9sU3RhdGVdLCB2YWx1ZVtzeW1ib2xWYWx1ZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSAhPT0gUkVKRUNURUQgJiYgdHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgb25jZVdyYXBwZXIobWFrZVJlc29sdmVyKHByb21pc2UsIHN0YXRlKSksIG9uY2VXcmFwcGVyKG1ha2VSZXNvbHZlcihwcm9taXNlLCBmYWxzZSkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbmNlV3JhcHBlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgZmFsc2UsIGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwcm9taXNlW3N5bWJvbFN0YXRlXSA9IHN0YXRlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWV1ZSA9IHByb21pc2Vbc3ltYm9sVmFsdWVdO1xuICAgICAgICAgICAgICAgICAgICBwcm9taXNlW3N5bWJvbFZhbHVlXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvbWlzZVtzeW1ib2xGaW5hbGx5XSA9PT0gc3ltYm9sRmluYWxseSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb21pc2UgaXMgZ2VuZXJhdGVkIGJ5IFByb21pc2UucHJvdG90eXBlLmZpbmFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gUkVTT0xWRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RhdGUgaXMgcmVzb2x2ZWQsIHNob3VsZCBpZ25vcmUgdGhlIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHVzZSBwYXJlbnQgcHJvbWlzZSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2Vbc3ltYm9sU3RhdGVdID0gcHJvbWlzZVtzeW1ib2xQYXJlbnRQcm9taXNlU3RhdGVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2Vbc3ltYm9sVmFsdWVdID0gcHJvbWlzZVtzeW1ib2xQYXJlbnRQcm9taXNlVmFsdWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlY29yZCB0YXNrIGluZm9ybWF0aW9uIGluIHZhbHVlIHdoZW4gZXJyb3Igb2NjdXJzLCBzbyB3ZSBjYW5cbiAgICAgICAgICAgICAgICAgICAgLy8gZG8gc29tZSBhZGRpdGlvbmFsIHdvcmsgc3VjaCBhcyByZW5kZXIgbG9uZ1N0YWNrVHJhY2VcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09PSBSRUpFQ1RFRCAmJiB2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBsb25nU3RhY2tUcmFjZVpvbmUgaXMgaGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhY2UgPSBab25lLmN1cnJlbnRUYXNrICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWm9uZS5jdXJyZW50VGFzay5kYXRhICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWm9uZS5jdXJyZW50VGFzay5kYXRhW2NyZWF0aW9uVHJhY2VdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBrZWVwIHRoZSBsb25nIHN0YWNrIHRyYWNlIGludG8gZXJyb3Igd2hlbiBpbiBsb25nU3RhY2tUcmFjZVpvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3REZWZpbmVQcm9wZXJ0eSh2YWx1ZSwgQ1VSUkVOVF9UQVNLX1RSQUNFX1NZTUJPTCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRyYWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVSZXNvbHZlT3JSZWplY3QocHJvbWlzZSwgcXVldWVbaSsrXSwgcXVldWVbaSsrXSwgcXVldWVbaSsrXSwgcXVldWVbaSsrXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmxlbmd0aCA9PSAwICYmIHN0YXRlID09IFJFSkVDVEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlW3N5bWJvbFN0YXRlXSA9IFJFSkVDVEVEX05PX0NBVENIO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVuY2F1Z2h0UHJvbWlzZUVycm9yID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlcmUgd2UgdGhyb3dzIGEgbmV3IEVycm9yIHRvIHByaW50IG1vcmUgcmVhZGFibGUgZXJyb3IgbG9nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGlmIHRoZSB2YWx1ZSBpcyBub3QgYW4gZXJyb3IsIHpvbmUuanMgYnVpbGRzIGFuIGBFcnJvcmBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPYmplY3QgaGVyZSB0byBhdHRhY2ggdGhlIHN0YWNrIGluZm9ybWF0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5jYXVnaHQgKGluIHByb21pc2UpOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGFibGVPYmplY3RUb1N0cmluZyh2YWx1ZSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUgJiYgdmFsdWUuc3RhY2sgPyAnXFxuJyArIHZhbHVlLnN0YWNrIDogJycpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmNhdWdodFByb21pc2VFcnJvciA9IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Rpc2FibGVXcmFwcGluZ1VuY2F1Z2h0UHJvbWlzZVJlamVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGRpc2FibGUgd3JhcHBpbmcgdW5jYXVnaHQgcHJvbWlzZSByZWplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIHZhbHVlIGluc3RlYWQgb2Ygd3JhcHBpbmcgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jYXVnaHRQcm9taXNlRXJyb3IudGhyb3dPcmlnaW5hbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmNhdWdodFByb21pc2VFcnJvci5yZWplY3Rpb24gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuY2F1Z2h0UHJvbWlzZUVycm9yLnByb21pc2UgPSBwcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5jYXVnaHRQcm9taXNlRXJyb3Iuem9uZSA9IFpvbmUuY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuY2F1Z2h0UHJvbWlzZUVycm9yLnRhc2sgPSBab25lLmN1cnJlbnRUYXNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3VuY2F1Z2h0UHJvbWlzZUVycm9ycy5wdXNoKHVuY2F1Z2h0UHJvbWlzZUVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwaS5zY2hlZHVsZU1pY3JvVGFzaygpOyAvLyB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBydW5uaW5nXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZXNvbHZpbmcgYW4gYWxyZWFkeSByZXNvbHZlZCBwcm9taXNlIGlzIGEgbm9vcC5cbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IFJFSkVDVElPTl9IQU5ETEVEX0hBTkRMRVIgPSBfX3N5bWJvbF9fKCdyZWplY3Rpb25IYW5kbGVkSGFuZGxlcicpO1xuICAgICAgICBmdW5jdGlvbiBjbGVhclJlamVjdGVkTm9DYXRjaChwcm9taXNlKSB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZVtzeW1ib2xTdGF0ZV0gPT09IFJFSkVDVEVEX05PX0NBVENIKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHByb21pc2UgaXMgcmVqZWN0ZWQgbm8gY2F0Y2ggc3RhdHVzXG4gICAgICAgICAgICAgICAgLy8gYW5kIHF1ZXVlLmxlbmd0aCA+IDAsIG1lYW5zIHRoZXJlIGlzIGEgZXJyb3IgaGFuZGxlclxuICAgICAgICAgICAgICAgIC8vIGhlcmUgdG8gaGFuZGxlIHRoZSByZWplY3RlZCBwcm9taXNlLCB3ZSBzaG91bGQgdHJpZ2dlclxuICAgICAgICAgICAgICAgIC8vIHdpbmRvd3MucmVqZWN0aW9uaGFuZGxlZCBldmVudEhhbmRsZXIgb3Igbm9kZWpzIHJlamVjdGlvbkhhbmRsZWRcbiAgICAgICAgICAgICAgICAvLyBldmVudEhhbmRsZXJcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gWm9uZVtSRUpFQ1RJT05fSEFORExFRF9IQU5ETEVSXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgJiYgdHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCB7IHJlamVjdGlvbjogcHJvbWlzZVtzeW1ib2xWYWx1ZV0sIHByb21pc2U6IHByb21pc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikgeyB9XG4gICAgICAgICAgICAgICAgcHJvbWlzZVtzeW1ib2xTdGF0ZV0gPSBSRUpFQ1RFRDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IF91bmNhdWdodFByb21pc2VFcnJvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb21pc2UgPT09IF91bmNhdWdodFByb21pc2VFcnJvcnNbaV0ucHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3VuY2F1Z2h0UHJvbWlzZUVycm9ycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2NoZWR1bGVSZXNvbHZlT3JSZWplY3QocHJvbWlzZSwgem9uZSwgY2hhaW5Qcm9taXNlLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgICAgICAgY2xlYXJSZWplY3RlZE5vQ2F0Y2gocHJvbWlzZSk7XG4gICAgICAgICAgICBjb25zdCBwcm9taXNlU3RhdGUgPSBwcm9taXNlW3N5bWJvbFN0YXRlXTtcbiAgICAgICAgICAgIGNvbnN0IGRlbGVnYXRlID0gcHJvbWlzZVN0YXRlXG4gICAgICAgICAgICAgICAgPyB0eXBlb2Ygb25GdWxmaWxsZWQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICAgICAgICAgPyBvbkZ1bGZpbGxlZFxuICAgICAgICAgICAgICAgICAgICA6IGZvcndhcmRSZXNvbHV0aW9uXG4gICAgICAgICAgICAgICAgOiB0eXBlb2Ygb25SZWplY3RlZCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICA/IG9uUmVqZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgOiBmb3J3YXJkUmVqZWN0aW9uO1xuICAgICAgICAgICAgem9uZS5zY2hlZHVsZU1pY3JvVGFzayhzb3VyY2UsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRQcm9taXNlVmFsdWUgPSBwcm9taXNlW3N5bWJvbFZhbHVlXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNGaW5hbGx5UHJvbWlzZSA9ICEhY2hhaW5Qcm9taXNlICYmIHN5bWJvbEZpbmFsbHkgPT09IGNoYWluUHJvbWlzZVtzeW1ib2xGaW5hbGx5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmluYWxseVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwcm9taXNlIGlzIGdlbmVyYXRlZCBmcm9tIGZpbmFsbHkgY2FsbCwga2VlcCBwYXJlbnQgcHJvbWlzZSdzIHN0YXRlIGFuZCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW5Qcm9taXNlW3N5bWJvbFBhcmVudFByb21pc2VWYWx1ZV0gPSBwYXJlbnRQcm9taXNlVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFpblByb21pc2Vbc3ltYm9sUGFyZW50UHJvbWlzZVN0YXRlXSA9IHByb21pc2VTdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IHBhc3MgdmFsdWUgdG8gZmluYWxseSBjYWxsYmFja1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHpvbmUucnVuKGRlbGVnYXRlLCB1bmRlZmluZWQsIGlzRmluYWxseVByb21pc2UgJiYgZGVsZWdhdGUgIT09IGZvcndhcmRSZWplY3Rpb24gJiYgZGVsZWdhdGUgIT09IGZvcndhcmRSZXNvbHV0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFtwYXJlbnRQcm9taXNlVmFsdWVdKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UoY2hhaW5Qcm9taXNlLCB0cnVlLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBlcnJvciBvY2N1cnMsIHNob3VsZCBhbHdheXMgcmV0dXJuIHRoaXMgZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UoY2hhaW5Qcm9taXNlLCBmYWxzZSwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGNoYWluUHJvbWlzZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgWk9ORV9BV0FSRV9QUk9NSVNFX1RPX1NUUklORyA9ICdmdW5jdGlvbiBab25lQXdhcmVQcm9taXNlKCkgeyBbbmF0aXZlIGNvZGVdIH0nO1xuICAgICAgICBjb25zdCBub29wID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgICBjb25zdCBBZ2dyZWdhdGVFcnJvciA9IGdsb2JhbC5BZ2dyZWdhdGVFcnJvcjtcbiAgICAgICAgY2xhc3MgWm9uZUF3YXJlUHJvbWlzZSB7XG4gICAgICAgICAgICBzdGF0aWMgdG9TdHJpbmcoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFpPTkVfQVdBUkVfUFJPTUlTRV9UT19TVFJJTkc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0aWMgcmVzb2x2ZSh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFpvbmVBd2FyZVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVByb21pc2UobmV3IHRoaXMobnVsbCksIFJFU09MVkVELCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0aWMgcmVqZWN0KGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVQcm9taXNlKG5ldyB0aGlzKG51bGwpLCBSRUpFQ1RFRCwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdGljIHdpdGhSZXNvbHZlcnMoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgICAgICAgICAgcmVzdWx0LnByb21pc2UgPSBuZXcgWm9uZUF3YXJlUHJvbWlzZSgocmVzLCByZWopID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlc29sdmUgPSByZXM7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZWplY3QgPSByZWo7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRpYyBhbnkodmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZXMgfHwgdHlwZW9mIHZhbHVlc1tTeW1ib2wuaXRlcmF0b3JdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgQWdncmVnYXRlRXJyb3IoW10sICdBbGwgcHJvbWlzZXMgd2VyZSByZWplY3RlZCcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHYgb2YgdmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChab25lQXdhcmVQcm9taXNlLnJlc29sdmUodikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBBZ2dyZWdhdGVFcnJvcihbXSwgJ0FsbCBwcm9taXNlcyB3ZXJlIHJlamVjdGVkJykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBBZ2dyZWdhdGVFcnJvcihbXSwgJ0FsbCBwcm9taXNlcyB3ZXJlIHJlamVjdGVkJykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFpvbmVBd2FyZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb21pc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlc1tpXS50aGVuKCh2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgQWdncmVnYXRlRXJyb3IoZXJyb3JzLCAnQWxsIHByb21pc2VzIHdlcmUgcmVqZWN0ZWQnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRpYyByYWNlKHZhbHVlcykge1xuICAgICAgICAgICAgICAgIGxldCByZXNvbHZlO1xuICAgICAgICAgICAgICAgIGxldCByZWplY3Q7XG4gICAgICAgICAgICAgICAgbGV0IHByb21pc2UgPSBuZXcgdGhpcygocmVzLCByZWopID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSA9IHJlcztcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0ID0gcmVqO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9uUmVzb2x2ZSh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gb25SZWplY3QoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNUaGVuYWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS50aGVuKG9uUmVzb2x2ZSwgb25SZWplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRpYyBhbGwodmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFpvbmVBd2FyZVByb21pc2UuYWxsV2l0aENhbGxiYWNrKHZhbHVlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0aWMgYWxsU2V0dGxlZCh2YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBQID0gdGhpcyAmJiB0aGlzLnByb3RvdHlwZSBpbnN0YW5jZW9mIFpvbmVBd2FyZVByb21pc2UgPyB0aGlzIDogWm9uZUF3YXJlUHJvbWlzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUC5hbGxXaXRoQ2FsbGJhY2sodmFsdWVzLCB7XG4gICAgICAgICAgICAgICAgICAgIHRoZW5DYWxsYmFjazogKHZhbHVlKSA9PiAoeyBzdGF0dXM6ICdmdWxmaWxsZWQnLCB2YWx1ZSB9KSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JDYWxsYmFjazogKGVycikgPT4gKHsgc3RhdHVzOiAncmVqZWN0ZWQnLCByZWFzb246IGVyciB9KSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRpYyBhbGxXaXRoQ2FsbGJhY2sodmFsdWVzLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGxldCByZXNvbHZlO1xuICAgICAgICAgICAgICAgIGxldCByZWplY3Q7XG4gICAgICAgICAgICAgICAgbGV0IHByb21pc2UgPSBuZXcgdGhpcygocmVzLCByZWopID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSA9IHJlcztcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0ID0gcmVqO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGF0IDIgdG8gcHJldmVudCBwcmVtYXR1cmVseSByZXNvbHZpbmcgaWYgLnRoZW4gaXMgY2FsbGVkIGltbWVkaWF0ZWx5LlxuICAgICAgICAgICAgICAgIGxldCB1bnJlc29sdmVkQ291bnQgPSAyO1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZUluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZFZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVGhlbmFibGUodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VyVmFsdWVJbmRleCA9IHZhbHVlSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkVmFsdWVzW2N1clZhbHVlSW5kZXhdID0gY2FsbGJhY2sgPyBjYWxsYmFjay50aGVuQ2FsbGJhY2sodmFsdWUpIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5yZXNvbHZlZENvdW50LS07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVucmVzb2x2ZWRDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc29sdmVkVmFsdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkVmFsdWVzW2N1clZhbHVlSW5kZXhdID0gY2FsbGJhY2suZXJyb3JDYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnJlc29sdmVkQ291bnQtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVucmVzb2x2ZWRDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNvbHZlZFZhbHVlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAodGhlbkVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHRoZW5FcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHVucmVzb2x2ZWRDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZUluZGV4Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIE1ha2UgdGhlIHVucmVzb2x2ZWRDb3VudCB6ZXJvLWJhc2VkIGFnYWluLlxuICAgICAgICAgICAgICAgIHVucmVzb2x2ZWRDb3VudCAtPSAyO1xuICAgICAgICAgICAgICAgIGlmICh1bnJlc29sdmVkQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNvbHZlZFZhbHVlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3RydWN0b3IoZXhlY3V0b3IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcztcbiAgICAgICAgICAgICAgICBpZiAoIShwcm9taXNlIGluc3RhbmNlb2YgWm9uZUF3YXJlUHJvbWlzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IGJlIGFuIGluc3RhbmNlb2YgUHJvbWlzZS4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvbWlzZVtzeW1ib2xTdGF0ZV0gPSBVTlJFU09MVkVEO1xuICAgICAgICAgICAgICAgIHByb21pc2Vbc3ltYm9sVmFsdWVdID0gW107IC8vIHF1ZXVlO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9uY2VXcmFwcGVyID0gb25jZSgpO1xuICAgICAgICAgICAgICAgICAgICBleGVjdXRvciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3Iob25jZVdyYXBwZXIobWFrZVJlc29sdmVyKHByb21pc2UsIFJFU09MVkVEKSksIG9uY2VXcmFwcGVyKG1ha2VSZXNvbHZlcihwcm9taXNlLCBSRUpFQ1RFRCkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKHByb21pc2UsIGZhbHNlLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnUHJvbWlzZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnZXQgW1N5bWJvbC5zcGVjaWVzXSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWm9uZUF3YXJlUHJvbWlzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IHJlYWQgYFN5bWJvbC5zcGVjaWVzYCBzYWZlbHkgYmVjYXVzZSBgdGhpc2AgbWF5IGJlIGFueXRoaW5nLiBGb3IgaW5zdGFuY2UsIGB0aGlzYFxuICAgICAgICAgICAgICAgIC8vIG1heSBiZSBhbiBvYmplY3Qgd2l0aG91dCBhIHByb3RvdHlwZSAoY3JlYXRlZCB0aHJvdWdoIGBPYmplY3QuY3JlYXRlKG51bGwpYCk7IHRodXNcbiAgICAgICAgICAgICAgICAvLyBgdGhpcy5jb25zdHJ1Y3RvcmAgd2lsbCBiZSB1bmRlZmluZWQuIE9uZSBvZiB0aGUgdXNlIGNhc2VzIGlzIFN5c3RlbUpTIGNyZWF0aW5nXG4gICAgICAgICAgICAgICAgLy8gcHJvdG90eXBlLWxlc3Mgb2JqZWN0cyAobW9kdWxlcykgdmlhIGBPYmplY3QuY3JlYXRlKG51bGwpYC4gVGhlIFN5c3RlbUpTIGNyZWF0ZXMgYW4gZW1wdHlcbiAgICAgICAgICAgICAgICAvLyBvYmplY3QgYW5kIGNvcGllcyBwcm9taXNlIHByb3BlcnRpZXMgaW50byB0aGF0IG9iamVjdCAod2l0aGluIHRoZSBgZ2V0T3JDcmVhdGVMb2FkYFxuICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uKS4gVGhlIHpvbmUuanMgdGhlbiBjaGVja3MgaWYgdGhlIHJlc29sdmVkIHZhbHVlIGhhcyB0aGUgYHRoZW5gIG1ldGhvZCBhbmRcbiAgICAgICAgICAgICAgICAvLyBpbnZva2VzIGl0IHdpdGggdGhlIGB2YWx1ZWAgY29udGV4dC4gT3RoZXJ3aXNlLCB0aGlzIHdpbGwgdGhyb3cgYW4gZXJyb3I6IGBUeXBlRXJyb3I6XG4gICAgICAgICAgICAgICAgLy8gQ2Fubm90IHJlYWQgcHJvcGVydGllcyBvZiB1bmRlZmluZWQgKHJlYWRpbmcgJ1N5bWJvbChTeW1ib2wuc3BlY2llcyknKWAuXG4gICAgICAgICAgICAgICAgbGV0IEMgPSB0aGlzLmNvbnN0cnVjdG9yPy5bU3ltYm9sLnNwZWNpZXNdO1xuICAgICAgICAgICAgICAgIGlmICghQyB8fCB0eXBlb2YgQyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBDID0gdGhpcy5jb25zdHJ1Y3RvciB8fCBab25lQXdhcmVQcm9taXNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBjaGFpblByb21pc2UgPSBuZXcgQyhub29wKTtcbiAgICAgICAgICAgICAgICBjb25zdCB6b25lID0gWm9uZS5jdXJyZW50O1xuICAgICAgICAgICAgICAgIGlmICh0aGlzW3N5bWJvbFN0YXRlXSA9PSBVTlJFU09MVkVEKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbc3ltYm9sVmFsdWVdLnB1c2goem9uZSwgY2hhaW5Qcm9taXNlLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVJlc29sdmVPclJlamVjdCh0aGlzLCB6b25lLCBjaGFpblByb21pc2UsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoYWluUHJvbWlzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoKG9uUmVqZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50aGVuKG51bGwsIG9uUmVqZWN0ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseShvbkZpbmFsbHkpIHtcbiAgICAgICAgICAgICAgICAvLyBTZWUgY29tbWVudCBvbiB0aGUgY2FsbCB0byBgdGhlbmAgYWJvdXQgd2h5IHRoZWUgYFN5bWJvbC5zcGVjaWVzYCBpcyBzYWZlbHkgYWNjZXNzZWQuXG4gICAgICAgICAgICAgICAgbGV0IEMgPSB0aGlzLmNvbnN0cnVjdG9yPy5bU3ltYm9sLnNwZWNpZXNdO1xuICAgICAgICAgICAgICAgIGlmICghQyB8fCB0eXBlb2YgQyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBDID0gWm9uZUF3YXJlUHJvbWlzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhaW5Qcm9taXNlID0gbmV3IEMobm9vcCk7XG4gICAgICAgICAgICAgICAgY2hhaW5Qcm9taXNlW3N5bWJvbEZpbmFsbHldID0gc3ltYm9sRmluYWxseTtcbiAgICAgICAgICAgICAgICBjb25zdCB6b25lID0gWm9uZS5jdXJyZW50O1xuICAgICAgICAgICAgICAgIGlmICh0aGlzW3N5bWJvbFN0YXRlXSA9PSBVTlJFU09MVkVEKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbc3ltYm9sVmFsdWVdLnB1c2goem9uZSwgY2hhaW5Qcm9taXNlLCBvbkZpbmFsbHksIG9uRmluYWxseSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVJlc29sdmVPclJlamVjdCh0aGlzLCB6b25lLCBjaGFpblByb21pc2UsIG9uRmluYWxseSwgb25GaW5hbGx5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoYWluUHJvbWlzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBQcm90ZWN0IGFnYWluc3QgYWdncmVzc2l2ZSBvcHRpbWl6ZXJzIGRyb3BwaW5nIHNlZW1pbmdseSB1bnVzZWQgcHJvcGVydGllcy5cbiAgICAgICAgLy8gRS5nLiBDbG9zdXJlIENvbXBpbGVyIGluIGFkdmFuY2VkIG1vZGUuXG4gICAgICAgIFpvbmVBd2FyZVByb21pc2VbJ3Jlc29sdmUnXSA9IFpvbmVBd2FyZVByb21pc2UucmVzb2x2ZTtcbiAgICAgICAgWm9uZUF3YXJlUHJvbWlzZVsncmVqZWN0J10gPSBab25lQXdhcmVQcm9taXNlLnJlamVjdDtcbiAgICAgICAgWm9uZUF3YXJlUHJvbWlzZVsncmFjZSddID0gWm9uZUF3YXJlUHJvbWlzZS5yYWNlO1xuICAgICAgICBab25lQXdhcmVQcm9taXNlWydhbGwnXSA9IFpvbmVBd2FyZVByb21pc2UuYWxsO1xuICAgICAgICBjb25zdCBOYXRpdmVQcm9taXNlID0gKGdsb2JhbFtzeW1ib2xQcm9taXNlXSA9IGdsb2JhbFsnUHJvbWlzZSddKTtcbiAgICAgICAgZ2xvYmFsWydQcm9taXNlJ10gPSBab25lQXdhcmVQcm9taXNlO1xuICAgICAgICBjb25zdCBzeW1ib2xUaGVuUGF0Y2hlZCA9IF9fc3ltYm9sX18oJ3RoZW5QYXRjaGVkJyk7XG4gICAgICAgIGZ1bmN0aW9uIHBhdGNoVGhlbihDdG9yKSB7XG4gICAgICAgICAgICBjb25zdCBwcm90byA9IEN0b3IucHJvdG90eXBlO1xuICAgICAgICAgICAgY29uc3QgcHJvcCA9IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgJ3RoZW4nKTtcbiAgICAgICAgICAgIGlmIChwcm9wICYmIChwcm9wLndyaXRhYmxlID09PSBmYWxzZSB8fCAhcHJvcC5jb25maWd1cmFibGUpKSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgQ3Rvci5wcm90b3R5cGUudGhlbiBwcm9wZXJ0eURlc2NyaXB0b3IgaXMgd3JpdGFibGUgb3Igbm90XG4gICAgICAgICAgICAgICAgLy8gaW4gbWV0ZW9yIGVudiwgd3JpdGFibGUgaXMgZmFsc2UsIHdlIHNob3VsZCBpZ25vcmUgc3VjaCBjYXNlXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxUaGVuID0gcHJvdG8udGhlbjtcbiAgICAgICAgICAgIC8vIEtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIG1ldGhvZC5cbiAgICAgICAgICAgIHByb3RvW3N5bWJvbFRoZW5dID0gb3JpZ2luYWxUaGVuO1xuICAgICAgICAgICAgQ3Rvci5wcm90b3R5cGUudGhlbiA9IGZ1bmN0aW9uIChvblJlc29sdmUsIG9uUmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd3JhcHBlZCA9IG5ldyBab25lQXdhcmVQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxUaGVuLmNhbGwodGhpcywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC50aGVuKG9uUmVzb2x2ZSwgb25SZWplY3QpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIEN0b3Jbc3ltYm9sVGhlblBhdGNoZWRdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBhcGkucGF0Y2hUaGVuID0gcGF0Y2hUaGVuO1xuICAgICAgICBmdW5jdGlvbiB6b25laWZ5KGZuKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0UHJvbWlzZSA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHRQcm9taXNlIGluc3RhbmNlb2YgWm9uZUF3YXJlUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0UHJvbWlzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGN0b3IgPSByZXN1bHRQcm9taXNlLmNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgICAgIGlmICghY3RvcltzeW1ib2xUaGVuUGF0Y2hlZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0Y2hUaGVuKGN0b3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0UHJvbWlzZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE5hdGl2ZVByb21pc2UpIHtcbiAgICAgICAgICAgIHBhdGNoVGhlbihOYXRpdmVQcm9taXNlKTtcbiAgICAgICAgICAgIHBhdGNoTWV0aG9kKGdsb2JhbCwgJ2ZldGNoJywgKGRlbGVnYXRlKSA9PiB6b25laWZ5KGRlbGVnYXRlKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhpcyBpcyBub3QgcGFydCBvZiBwdWJsaWMgQVBJLCBidXQgaXQgaXMgdXNlZnVsIGZvciB0ZXN0cywgc28gd2UgZXhwb3NlIGl0LlxuICAgICAgICBQcm9taXNlW1pvbmUuX19zeW1ib2xfXygndW5jYXVnaHRQcm9taXNlRXJyb3JzJyldID0gX3VuY2F1Z2h0UHJvbWlzZUVycm9ycztcbiAgICAgICAgcmV0dXJuIFpvbmVBd2FyZVByb21pc2U7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHBhdGNoVG9TdHJpbmcoWm9uZSkge1xuICAgIC8vIG92ZXJyaWRlIEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyB0byBtYWtlIHpvbmUuanMgcGF0Y2hlZCBmdW5jdGlvblxuICAgIC8vIGxvb2sgbGlrZSBuYXRpdmUgZnVuY3Rpb25cbiAgICBab25lLl9fbG9hZF9wYXRjaCgndG9TdHJpbmcnLCAoZ2xvYmFsKSA9PiB7XG4gICAgICAgIC8vIHBhdGNoIEZ1bmMucHJvdG90eXBlLnRvU3RyaW5nIHRvIGxldCB0aGVtIGxvb2sgbGlrZSBuYXRpdmVcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xuICAgICAgICBjb25zdCBPUklHSU5BTF9ERUxFR0FURV9TWU1CT0wgPSB6b25lU3ltYm9sKCdPcmlnaW5hbERlbGVnYXRlJyk7XG4gICAgICAgIGNvbnN0IFBST01JU0VfU1lNQk9MID0gem9uZVN5bWJvbCgnUHJvbWlzZScpO1xuICAgICAgICBjb25zdCBFUlJPUl9TWU1CT0wgPSB6b25lU3ltYm9sKCdFcnJvcicpO1xuICAgICAgICBjb25zdCBuZXdGdW5jdGlvblRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbERlbGVnYXRlID0gdGhpc1tPUklHSU5BTF9ERUxFR0FURV9TWU1CT0xdO1xuICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbERlbGVnYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3JpZ2luYWxEZWxlZ2F0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZy5jYWxsKG9yaWdpbmFsRGVsZWdhdGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvcmlnaW5hbERlbGVnYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcyA9PT0gUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVQcm9taXNlID0gZ2xvYmFsW1BST01JU0VfU1lNQk9MXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hdGl2ZVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEZ1bmN0aW9uVG9TdHJpbmcuY2FsbChuYXRpdmVQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcyA9PT0gRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlRXJyb3IgPSBnbG9iYWxbRVJST1JfU1lNQk9MXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hdGl2ZUVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nLmNhbGwobmF0aXZlRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZy5jYWxsKHRoaXMpO1xuICAgICAgICB9O1xuICAgICAgICBuZXdGdW5jdGlvblRvU3RyaW5nW09SSUdJTkFMX0RFTEVHQVRFX1NZTUJPTF0gPSBvcmlnaW5hbEZ1bmN0aW9uVG9TdHJpbmc7XG4gICAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IG5ld0Z1bmN0aW9uVG9TdHJpbmc7XG4gICAgICAgIC8vIHBhdGNoIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcgdG8gbGV0IHRoZW0gbG9vayBsaWtlIG5hdGl2ZVxuICAgICAgICBjb25zdCBvcmlnaW5hbE9iamVjdFRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbiAgICAgICAgY29uc3QgUFJPTUlTRV9PQkpFQ1RfVE9fU1RSSU5HID0gJ1tvYmplY3QgUHJvbWlzZV0nO1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBQcm9taXNlID09PSAnZnVuY3Rpb24nICYmIHRoaXMgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBST01JU0VfT0JKRUNUX1RPX1NUUklORztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbE9iamVjdFRvU3RyaW5nLmNhbGwodGhpcyk7XG4gICAgICAgIH07XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHBhdGNoQ2FsbGJhY2tzKGFwaSwgdGFyZ2V0LCB0YXJnZXROYW1lLCBtZXRob2QsIGNhbGxiYWNrcykge1xuICAgIGNvbnN0IHN5bWJvbCA9IFpvbmUuX19zeW1ib2xfXyhtZXRob2QpO1xuICAgIGlmICh0YXJnZXRbc3ltYm9sXSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5hdGl2ZURlbGVnYXRlID0gKHRhcmdldFtzeW1ib2xdID0gdGFyZ2V0W21ldGhvZF0pO1xuICAgIHRhcmdldFttZXRob2RdID0gZnVuY3Rpb24gKG5hbWUsIG9wdHMsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdHMgJiYgb3B0cy5wcm90b3R5cGUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGAke3RhcmdldE5hbWV9LiR7bWV0aG9kfTo6YCArIGNhbGxiYWNrO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb3RvdHlwZSA9IG9wdHMucHJvdG90eXBlO1xuICAgICAgICAgICAgICAgIC8vIE5vdGU6IHRoZSBgcGF0Y2hDYWxsYmFja3NgIGlzIHVzZWQgZm9yIHBhdGNoaW5nIHRoZSBgZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50YCBhbmRcbiAgICAgICAgICAgICAgICAvLyBgY3VzdG9tRWxlbWVudHMuZGVmaW5lYC4gV2UgZXhwbGljaXRseSB3cmFwIHRoZSBwYXRjaGluZyBjb2RlIGludG8gdHJ5LWNhdGNoIHNpbmNlXG4gICAgICAgICAgICAgICAgLy8gY2FsbGJhY2tzIG1heSBiZSBhbHJlYWR5IHBhdGNoZWQgYnkgb3RoZXIgd2ViIGNvbXBvbmVudHMgZnJhbWV3b3JrcyAoZS5nLiBMV0MpLCBhbmQgdGhleVxuICAgICAgICAgICAgICAgIC8vIG1ha2UgdGhvc2UgcHJvcGVydGllcyBub24td3JpdGFibGUuIFRoaXMgbWVhbnMgdGhhdCBwYXRjaGluZyBjYWxsYmFjayB3aWxsIHRocm93IGFuIGVycm9yXG4gICAgICAgICAgICAgICAgLy8gYGNhbm5vdCBhc3NpZ24gdG8gcmVhZC1vbmx5IHByb3BlcnR5YC4gU2VlIHRoaXMgY29kZSBhcyBhbiBleGFtcGxlOlxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zYWxlc2ZvcmNlL2x3Yy9ibG9iL21hc3Rlci9wYWNrYWdlcy9AbHdjL2VuZ2luZS1jb3JlL3NyYy9mcmFtZXdvcmsvYmFzZS1icmlkZ2UtZWxlbWVudC50cyNMMTgwLUwxODZcbiAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIHN0b3AgdGhlIGFwcGxpY2F0aW9uIHJlbmRlcmluZyBpZiB3ZSBjb3VsZG4ndCBwYXRjaCBzb21lXG4gICAgICAgICAgICAgICAgLy8gY2FsbGJhY2ssIGUuZy4gYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2AuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShjYWxsYmFjaykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBhcGkuT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvdHlwZSwgY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBhcGkud3JhcFdpdGhDdXJyZW50Wm9uZShkZXNjcmlwdG9yLnZhbHVlLCBzb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaS5fcmVkZWZpbmVQcm9wZXJ0eShvcHRzLnByb3RvdHlwZSwgY2FsbGJhY2ssIGRlc2NyaXB0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvdG90eXBlW2NhbGxiYWNrXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvdHlwZVtjYWxsYmFja10gPSBhcGkud3JhcFdpdGhDdXJyZW50Wm9uZShwcm90b3R5cGVbY2FsbGJhY2tdLCBzb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByb3RvdHlwZVtjYWxsYmFja10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvdHlwZVtjYWxsYmFja10gPSBhcGkud3JhcFdpdGhDdXJyZW50Wm9uZShwcm90b3R5cGVbY2FsbGJhY2tdLCBzb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogd2UgbGVhdmUgdGhlIGNhdGNoIGJsb2NrIGVtcHR5IHNpbmNlIHRoZXJlJ3Mgbm8gd2F5IHRvIGhhbmRsZSB0aGUgZXJyb3IgcmVsYXRlZFxuICAgICAgICAgICAgICAgICAgICAvLyB0byBub24td3JpdGFibGUgcHJvcGVydHkuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5hdGl2ZURlbGVnYXRlLmNhbGwodGFyZ2V0LCBuYW1lLCBvcHRzLCBvcHRpb25zKTtcbiAgICB9O1xuICAgIGFwaS5hdHRhY2hPcmlnaW5Ub1BhdGNoZWQodGFyZ2V0W21ldGhvZF0sIG5hdGl2ZURlbGVnYXRlKTtcbn1cblxuZnVuY3Rpb24gcGF0Y2hVdGlsKFpvbmUpIHtcbiAgICBab25lLl9fbG9hZF9wYXRjaCgndXRpbCcsIChnbG9iYWwsIFpvbmUsIGFwaSkgPT4ge1xuICAgICAgICAvLyBDb2xsZWN0IG5hdGl2ZSBldmVudCBuYW1lcyBieSBsb29raW5nIGF0IHByb3BlcnRpZXNcbiAgICAgICAgLy8gb24gdGhlIGdsb2JhbCBuYW1lc3BhY2UsIGUuZy4gJ29uY2xpY2snLlxuICAgICAgICBjb25zdCBldmVudE5hbWVzID0gZ2V0T25FdmVudE5hbWVzKGdsb2JhbCk7XG4gICAgICAgIGFwaS5wYXRjaE9uUHJvcGVydGllcyA9IHBhdGNoT25Qcm9wZXJ0aWVzO1xuICAgICAgICBhcGkucGF0Y2hNZXRob2QgPSBwYXRjaE1ldGhvZDtcbiAgICAgICAgYXBpLmJpbmRBcmd1bWVudHMgPSBiaW5kQXJndW1lbnRzO1xuICAgICAgICBhcGkucGF0Y2hNYWNyb1Rhc2sgPSBwYXRjaE1hY3JvVGFzaztcbiAgICAgICAgLy8gSW4gZWFybGllciB2ZXJzaW9uIG9mIHpvbmUuanMgKDwwLjkuMCksIHdlIHVzZSBlbnYgbmFtZSBgX196b25lX3N5bWJvbF9fQkxBQ0tfTElTVEVEX0VWRU5UU2BcbiAgICAgICAgLy8gdG8gZGVmaW5lIHdoaWNoIGV2ZW50cyB3aWxsIG5vdCBiZSBwYXRjaGVkIGJ5IGBab25lLmpzYC4gSW4gbmV3ZXIgdmVyc2lvbiAoPj0wLjkuMCksIHdlXG4gICAgICAgIC8vIGNoYW5nZSB0aGUgZW52IG5hbWUgdG8gYF9fem9uZV9zeW1ib2xfX1VOUEFUQ0hFRF9FVkVOVFNgIHRvIGtlZXAgdGhlIG5hbWUgY29uc2lzdGVudCB3aXRoXG4gICAgICAgIC8vIGFuZ3VsYXIgcmVwby4gVGhlICBgX196b25lX3N5bWJvbF9fQkxBQ0tfTElTVEVEX0VWRU5UU2AgaXMgZGVwcmVjYXRlZCwgYnV0IGl0IGlzIHN0aWxsIGJlXG4gICAgICAgIC8vIHN1cHBvcnRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGNvbnN0IFNZTUJPTF9CTEFDS19MSVNURURfRVZFTlRTID0gWm9uZS5fX3N5bWJvbF9fKCdCTEFDS19MSVNURURfRVZFTlRTJyk7XG4gICAgICAgIGNvbnN0IFNZTUJPTF9VTlBBVENIRURfRVZFTlRTID0gWm9uZS5fX3N5bWJvbF9fKCdVTlBBVENIRURfRVZFTlRTJyk7XG4gICAgICAgIGlmIChnbG9iYWxbU1lNQk9MX1VOUEFUQ0hFRF9FVkVOVFNdKSB7XG4gICAgICAgICAgICBnbG9iYWxbU1lNQk9MX0JMQUNLX0xJU1RFRF9FVkVOVFNdID0gZ2xvYmFsW1NZTUJPTF9VTlBBVENIRURfRVZFTlRTXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ2xvYmFsW1NZTUJPTF9CTEFDS19MSVNURURfRVZFTlRTXSkge1xuICAgICAgICAgICAgWm9uZVtTWU1CT0xfQkxBQ0tfTElTVEVEX0VWRU5UU10gPSBab25lW1NZTUJPTF9VTlBBVENIRURfRVZFTlRTXSA9XG4gICAgICAgICAgICAgICAgZ2xvYmFsW1NZTUJPTF9CTEFDS19MSVNURURfRVZFTlRTXTtcbiAgICAgICAgfVxuICAgICAgICBhcGkucGF0Y2hFdmVudFByb3RvdHlwZSA9IHBhdGNoRXZlbnRQcm90b3R5cGU7XG4gICAgICAgIGFwaS5wYXRjaEV2ZW50VGFyZ2V0ID0gcGF0Y2hFdmVudFRhcmdldDtcbiAgICAgICAgYXBpLmlzSUVPckVkZ2UgPSBpc0lFT3JFZGdlO1xuICAgICAgICBhcGkuT2JqZWN0RGVmaW5lUHJvcGVydHkgPSBPYmplY3REZWZpbmVQcm9wZXJ0eTtcbiAgICAgICAgYXBpLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiAgICAgICAgYXBpLk9iamVjdENyZWF0ZSA9IE9iamVjdENyZWF0ZTtcbiAgICAgICAgYXBpLkFycmF5U2xpY2UgPSBBcnJheVNsaWNlO1xuICAgICAgICBhcGkucGF0Y2hDbGFzcyA9IHBhdGNoQ2xhc3M7XG4gICAgICAgIGFwaS53cmFwV2l0aEN1cnJlbnRab25lID0gd3JhcFdpdGhDdXJyZW50Wm9uZTtcbiAgICAgICAgYXBpLmZpbHRlclByb3BlcnRpZXMgPSBmaWx0ZXJQcm9wZXJ0aWVzO1xuICAgICAgICBhcGkuYXR0YWNoT3JpZ2luVG9QYXRjaGVkID0gYXR0YWNoT3JpZ2luVG9QYXRjaGVkO1xuICAgICAgICBhcGkuX3JlZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG4gICAgICAgIGFwaS5wYXRjaENhbGxiYWNrcyA9IHBhdGNoQ2FsbGJhY2tzO1xuICAgICAgICBhcGkuZ2V0R2xvYmFsT2JqZWN0cyA9ICgpID0+ICh7XG4gICAgICAgICAgICBnbG9iYWxTb3VyY2VzLFxuICAgICAgICAgICAgem9uZVN5bWJvbEV2ZW50TmFtZXMsXG4gICAgICAgICAgICBldmVudE5hbWVzLFxuICAgICAgICAgICAgaXNCcm93c2VyLFxuICAgICAgICAgICAgaXNNaXgsXG4gICAgICAgICAgICBpc05vZGUsXG4gICAgICAgICAgICBUUlVFX1NUUixcbiAgICAgICAgICAgIEZBTFNFX1NUUixcbiAgICAgICAgICAgIFpPTkVfU1lNQk9MX1BSRUZJWCxcbiAgICAgICAgICAgIEFERF9FVkVOVF9MSVNURU5FUl9TVFIsXG4gICAgICAgICAgICBSRU1PVkVfRVZFTlRfTElTVEVORVJfU1RSLFxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gcGF0Y2hDb21tb24oWm9uZSkge1xuICAgIHBhdGNoUHJvbWlzZShab25lKTtcbiAgICBwYXRjaFRvU3RyaW5nKFpvbmUpO1xuICAgIHBhdGNoVXRpbChab25lKTtcbn1cblxuY29uc3QgWm9uZSQxID0gbG9hZFpvbmUoKTtcbnBhdGNoQ29tbW9uKFpvbmUkMSk7XG5wYXRjaEJyb3dzZXIoWm9uZSQxKTtcblxuZXhwb3J0IHsgWm9uZUNvbnRleHRNYW5hZ2VyIH07Il0sCiAgIm1hcHBpbmdzIjogIkFBQUEsU0FBUyxLQUFLQSxVQUFvQjtBQXNCbEMsU0FBU0MsR0FBaUJDLEdBQUs7QUFDM0IsU0FBSUEsTUFBUSxXQUFVQSxJQUFNLENBQUMsSUFDckIsT0FBT0EsRUFBSSxvQkFBcUIsY0FDcEMsT0FBT0EsRUFBSSx1QkFBd0I7QUFDM0M7QUFtQkEsSUFBSUMsS0FBbUIsbUJBVW5CQztBQUFBO0FB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O0FBQ3hCa1UsR0FBWUMsRUFBTTtBQUNsQi9ILEdBQWErSCxFQUFNOyIsCiAgIm5hbWVzIjogWyJST09UX0NPTlRFWFQiLCAiaXNMaXN0ZW5lck9iamVjdCIsICJvYmoiLCAiWk9ORV9DT05URVhUX0tFWSIsICJab25lQ29udGV4dE1hbmFnZXIiLCAiYWN0aXZlWm9uZSIsICJjb250ZXh0IiwgInRhcmdldCIsICJtYW5hZ2VyIiwgImNvbnRleHRXcmFwcGVyIiwgIl90aGlzIiwgImFyZ3MiLCAiX2kiLCAicmFuZG9tIiwgInpvbmVOYW1lIiwgIl9hIiwgIm9yaWdpbmFsIiwgImNvbnRleHRNYW5hZ2VyIiwgImV2ZW50IiwgImxpc3RlbmVyIiwgIm9wdHMiLCAibGlzdGVuZXJzIiwgInBhdGNoZWRMaXN0ZW5lciIsICJldmVudHMiLCAiYWN0aXZlIiwgImZuIiwgInRoaXNBcmciLCAibmV3Wm9uZSIsICJnbG9iYWwiLCAiX19zeW1ib2xfXyIsICJuYW1lIiwgImluaXRab25lIiwgInBlcmZvcm1hbmNlIiwgIm1hcmsiLCAicGVyZm9ybWFuY2VNZWFzdXJlIiwgImxhYmVsIiwgIl9ab25lSW1wbCIsICJwYXRjaGVzIiwgInpvbmUiLCAiX2N1cnJlbnRab25lRnJhbWUiLCAiX2N1cnJlbnRUYXNrIiwgImlnbm9yZUR1cGxpY2F0ZSIsICJjaGVja0R1cGxpY2F0ZSIsICJwZXJmTmFtZSIsICJfYXBpIiwgInBhcmVudCIsICJ6b25lU3BlYyIsICJfWm9uZURlbGVnYXRlIiwgImtleSIsICJjdXJyZW50IiwgImNhbGxiYWNrIiwgInNvdXJjZSIsICJfY2FsbGJhY2siLCAiYXBwbHlUaGlzIiwgImFwcGx5QXJncyIsICJlcnJvciIsICJ0YXNrIiwgIk5PX1pPTkUiLCAiem9uZVRhc2siLCAidHlwZSIsICJpc1BlcmlvZGljIiwgImlzUmVmcmVzaGFibGUiLCAibm90U2NoZWR1bGVkIiwgImV2ZW50VGFzayIsICJtYWNyb1Rhc2siLCAicmVFbnRyeUd1YXJkIiwgInJ1bm5pbmciLCAic2NoZWR1bGVkIiwgInByZXZpb3VzVGFzayIsICJzdGF0ZSIsICJ1bmtub3duIiwgInNjaGVkdWxpbmciLCAiem9uZURlbGVnYXRlcyIsICJlcnIiLCAiZGF0YSIsICJjdXN0b21TY2hlZHVsZSIsICJab25lVGFzayIsICJtaWNyb1Rhc2siLCAiY3VzdG9tQ2FuY2VsIiwgImNhbmNlbGluZyIsICJjb3VudCIsICJpIiwgIlpvbmVJbXBsIiwgIkRFTEVHQVRFX1pTIiwgImRlbGVnYXRlIiwgIl8iLCAiaGFzVGFza1N0YXRlIiwgInBhcmVudERlbGVnYXRlIiwgInpvbmVTcGVjSGFzVGFzayIsICJwYXJlbnRIYXNUYXNrIiwgInRhcmdldFpvbmUiLCAicmV0dXJuVGFzayIsICJzY2hlZHVsZU1pY3JvVGFzayIsICJ2YWx1ZSIsICJpc0VtcHR5IiwgImNvdW50cyIsICJwcmV2IiwgIm5leHQiLCAib3B0aW9ucyIsICJzY2hlZHVsZUZuIiwgImNhbmNlbEZuIiwgInNlbGYiLCAiX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcyIsICJkcmFpbk1pY3JvVGFza1F1ZXVlIiwgInRvU3RhdGUiLCAiZnJvbVN0YXRlMSIsICJmcm9tU3RhdGUyIiwgInN5bWJvbFNldFRpbWVvdXQiLCAic3ltYm9sUHJvbWlzZSIsICJzeW1ib2xUaGVuIiwgIl9taWNyb1Rhc2tRdWV1ZSIsICJfaXNEcmFpbmluZ01pY3JvdGFza1F1ZXVlIiwgIm5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZSIsICJuYXRpdmVTY2hlZHVsZU1pY3JvVGFzayIsICJmdW5jIiwgIm5hdGl2ZVRoZW4iLCAicXVldWUiLCAibm9vcCIsICJsb2FkWm9uZSIsICJPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCAiT2JqZWN0RGVmaW5lUHJvcGVydHkiLCAiT2JqZWN0R2V0UHJvdG90eXBlT2YiLCAiT2JqZWN0Q3JlYXRlIiwgIkFycmF5U2xpY2UiLCAiQUREX0VWRU5UX0xJU1RFTkVSX1NUUiIsICJSRU1PVkVfRVZFTlRfTElTVEVORVJfU1RSIiwgIlpPTkVfU1lNQk9MX0FERF9FVkVOVF9MSVNURU5FUiIsICJaT05FX1NZTUJPTF9SRU1PVkVfRVZFTlRfTElTVEVORVIiLCAiVFJVRV9TVFIiLCAiRkFMU0VfU1RSIiwgIlpPTkVfU1lNQk9MX1BSRUZJWCIsICJ3cmFwV2l0aEN1cnJlbnRab25lIiwgInNjaGVkdWxlTWFjcm9UYXNrV2l0aEN1cnJlbnRab25lIiwgInpvbmVTeW1ib2wiLCAiaXNXaW5kb3dFeGlzdHMiLCAiaW50ZXJuYWxXaW5kb3ciLCAiX2dsb2JhbCIsICJSRU1PVkVfQVRUUklCVVRFIiwgImJpbmRBcmd1bWVudHMiLCAicGF0Y2hQcm90b3R5cGUiLCAicHJvdG90eXBlIiwgImZuTmFtZXMiLCAicHJvdG90eXBlRGVzYyIsICJpc1Byb3BlcnR5V3JpdGFibGUiLCAicGF0Y2hlZCIsICJhdHRhY2hPcmlnaW5Ub1BhdGNoZWQiLCAicHJvcGVydHlEZXNjIiwgImlzV2ViV29ya2VyIiwgImlzTm9kZSIsICJpc0Jyb3dzZXIiLCAiaXNNaXgiLCAiem9uZVN5bWJvbEV2ZW50TmFtZXMkMSIsICJlbmFibGVCZWZvcmV1bmxvYWRTeW1ib2wiLCAid3JhcEZuIiwgImV2ZW50TmFtZVN5bWJvbCIsICJyZXN1bHQiLCAiZXJyb3JFdmVudCIsICJwYXRjaFByb3BlcnR5IiwgInByb3AiLCAiZGVzYyIsICJvblByb3BQYXRjaGVkU3ltYm9sIiwgIm9yaWdpbmFsRGVzY0dldCIsICJvcmlnaW5hbERlc2NTZXQiLCAiZXZlbnROYW1lIiwgIm5ld1ZhbHVlIiwgInBhdGNoT25Qcm9wZXJ0aWVzIiwgInByb3BlcnRpZXMiLCAib25Qcm9wZXJ0aWVzIiwgImoiLCAib3JpZ2luYWxJbnN0YW5jZUtleSIsICJwYXRjaENsYXNzIiwgImNsYXNzTmFtZSIsICJPcmlnaW5hbENsYXNzIiwgImEiLCAiaW5zdGFuY2UiLCAicGF0Y2hNZXRob2QiLCAicGF0Y2hGbiIsICJwcm90byIsICJkZWxlZ2F0ZU5hbWUiLCAicGF0Y2hEZWxlZ2F0ZSIsICJwYXRjaE1hY3JvVGFzayIsICJmdW5jTmFtZSIsICJtZXRhQ3JlYXRvciIsICJzZXROYXRpdmUiLCAic2NoZWR1bGVUYXNrIiwgIm1ldGEiLCAiaXNEZXRlY3RlZElFT3JFZGdlIiwgImllT3JFZGdlIiwgImlzSUUiLCAidWEiLCAiaXNJRU9yRWRnZSIsICJpc0Z1bmN0aW9uIiwgImlzTnVtYmVyIiwgInBhc3NpdmVTdXBwb3J0ZWQiLCAiT1BUSU1JWkVEX1pPTkVfRVZFTlRfVEFTS19EQVRBIiwgInpvbmVTeW1ib2xFdmVudE5hbWVzIiwgImdsb2JhbFNvdXJjZXMiLCAiRVZFTlRfTkFNRV9TWU1CT0xfUkVHWCIsICJJTU1FRElBVEVfUFJPUEFHQVRJT05fU1lNQk9MIiwgInByZXBhcmVFdmVudE5hbWVzIiwgImV2ZW50TmFtZVRvU3RyaW5nIiwgImZhbHNlRXZlbnROYW1lIiwgInRydWVFdmVudE5hbWUiLCAic3ltYm9sIiwgInN5bWJvbENhcHR1cmUiLCAicGF0Y2hFdmVudFRhcmdldCIsICJhcGkiLCAiYXBpcyIsICJwYXRjaE9wdGlvbnMiLCAiQUREX0VWRU5UX0xJU1RFTkVSIiwgIlJFTU9WRV9FVkVOVF9MSVNURU5FUiIsICJMSVNURU5FUlNfRVZFTlRfTElTVEVORVIiLCAiUkVNT1ZFX0FMTF9MSVNURU5FUlNfRVZFTlRfTElTVEVORVIiLCAiem9uZVN5bWJvbEFkZEV2ZW50TGlzdGVuZXIiLCAiQUREX0VWRU5UX0xJU1RFTkVSX1NPVVJDRSIsICJQUkVQRU5EX0VWRU5UX0xJU1RFTkVSIiwgIlBSRVBFTkRfRVZFTlRfTElTVEVORVJfU09VUkNFIiwgImludm9rZVRhc2siLCAiZ2xvYmFsQ2FsbGJhY2siLCAiaXNDYXB0dXJlIiwgInRhc2tzIiwgImVycm9ycyIsICJjb3B5VGFza3MiLCAiZ2xvYmFsWm9uZUF3YXJlQ2FsbGJhY2siLCAiZ2xvYmFsWm9uZUF3YXJlQ2FwdHVyZUNhbGxiYWNrIiwgInBhdGNoRXZlbnRUYXJnZXRNZXRob2RzIiwgInVzZUdsb2JhbENhbGxiYWNrIiwgInZhbGlkYXRlSGFuZGxlciIsICJyZXR1cm5UYXJnZXQiLCAidGFza0RhdGEiLCAibmF0aXZlQWRkRXZlbnRMaXN0ZW5lciIsICJuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyIiwgIm5hdGl2ZUxpc3RlbmVycyIsICJuYXRpdmVSZW1vdmVBbGxMaXN0ZW5lcnMiLCAibmF0aXZlUHJlcGVuZEV2ZW50TGlzdGVuZXIiLCAiYnVpbGRFdmVudExpc3RlbmVyT3B0aW9ucyIsICJwYXNzaXZlIiwgImN1c3RvbVNjaGVkdWxlR2xvYmFsIiwgImN1c3RvbUNhbmNlbEdsb2JhbCIsICJzeW1ib2xFdmVudE5hbWVzIiwgInN5bWJvbEV2ZW50TmFtZSIsICJleGlzdGluZ1Rhc2tzIiwgImN1c3RvbVNjaGVkdWxlTm9uR2xvYmFsIiwgImN1c3RvbVNjaGVkdWxlUHJlcGVuZCIsICJjdXN0b21DYW5jZWxOb25HbG9iYWwiLCAiY29tcGFyZVRhc2tDYWxsYmFja1ZzRGVsZWdhdGUiLCAidHlwZU9mRGVsZWdhdGUiLCAiY29tcGFyZSIsICJ1bnBhdGNoZWRFdmVudHMiLCAicGFzc2l2ZUV2ZW50cyIsICJjb3B5RXZlbnRMaXN0ZW5lck9wdGlvbnMiLCAibmV3T3B0aW9ucyIsICJtYWtlQWRkTGlzdGVuZXIiLCAibmF0aXZlTGlzdGVuZXIiLCAiYWRkU291cmNlIiwgImN1c3RvbVNjaGVkdWxlRm4iLCAiY3VzdG9tQ2FuY2VsRm4iLCAicHJlcGVuZCIsICJpc0hhbmRsZUV2ZW50IiwgInNpZ25hbCIsICJjYXB0dXJlIiwgIm9uY2UiLCAiaXNFeGlzdGluZyIsICJjb25zdHJ1Y3Rvck5hbWUiLCAidGFyZ2V0U291cmNlIiwgIm9uQWJvcnQiLCAiZXhpc3RpbmdUYXNrIiwgIm9uUHJvcGVydHlTeW1ib2wiLCAiZmluZEV2ZW50VGFza3MiLCAic3ltYm9sQ2FwdHVyZUV2ZW50TmFtZSIsICJjYXB0dXJlVGFza3MiLCAicmVtb3ZlVGFza3MiLCAia2V5cyIsICJtYXRjaCIsICJldnROYW1lIiwgInJlc3VsdHMiLCAiZm91bmRUYXNrcyIsICJjYXB0dXJlRmFsc2VUYXNrcyIsICJjYXB0dXJlVHJ1ZVRhc2tzIiwgInBhdGNoRXZlbnRQcm90b3R5cGUiLCAiRXZlbnQiLCAicGF0Y2hRdWV1ZU1pY3JvdGFzayIsICJ0YXNrU3ltYm9sIiwgInBhdGNoVGltZXIiLCAid2luZG93IiwgInNldE5hbWUiLCAiY2FuY2VsTmFtZSIsICJuYW1lU3VmZml4IiwgImNsZWFyTmF0aXZlIiwgInRhc2tzQnlIYW5kbGVJZCIsICJoYW5kbGVPcklkIiwgImNsZWFyVGFzayIsICJoYW5kbGUiLCAiaGFuZGxlSWQiLCAib3JpZ2luYWxSZWZyZXNoIiwgImlkIiwgInBhdGNoQ3VzdG9tRWxlbWVudHMiLCAiY2FsbGJhY2tzIiwgImV2ZW50VGFyZ2V0UGF0Y2giLCAiZXZlbnROYW1lcyIsICJFVkVOVF9UQVJHRVQiLCAicGF0Y2hFdmVudCIsICJmaWx0ZXJQcm9wZXJ0aWVzIiwgImlnbm9yZVByb3BlcnRpZXMiLCAidGlwIiwgImlwIiwgInRhcmdldElnbm9yZVByb3BlcnRpZXMiLCAib3AiLCAicGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMiLCAiZmlsdGVyZWRQcm9wZXJ0aWVzIiwgImdldE9uRXZlbnROYW1lcyIsICJwcm9wZXJ0eURlc2NyaXB0b3JQYXRjaCIsICJwYXRjaFRhcmdldHMiLCAiaWdub3JlRXJyb3JQcm9wZXJ0aWVzIiwgInBhdGNoQnJvd3NlciIsICJab25lIiwgImxlZ2FjeVBhdGNoIiwgInNldCIsICJjbGVhciIsICJibG9ja2luZ01ldGhvZHMiLCAicyIsICJYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0IiwgInBhdGNoWEhSIiwgIlhIUl9UQVNLIiwgIlhIUl9TWU5DIiwgIlhIUl9MSVNURU5FUiIsICJYSFJfU0NIRURVTEVEIiwgIlhIUl9VUkwiLCAiWEhSX0VSUk9SX0JFRk9SRV9TQ0hFRFVMRUQiLCAiWE1MSHR0cFJlcXVlc3QiLCAiWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUiLCAiZmluZFBlbmRpbmdUYXNrIiwgIm9yaUFkZExpc3RlbmVyIiwgIm9yaVJlbW92ZUxpc3RlbmVyIiwgIlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXRQcm90b3R5cGUiLCAiUkVBRFlfU1RBVEVfQ0hBTkdFIiwgIlNDSEVEVUxFRCIsICJuZXdMaXN0ZW5lciIsICJsb2FkVGFza3MiLCAib3JpSW52b2tlIiwgInNlbmROYXRpdmUiLCAicGxhY2Vob2xkZXJDYWxsYmFjayIsICJhYm9ydE5hdGl2ZSIsICJvcGVuTmF0aXZlIiwgIlhNTEhUVFBSRVFVRVNUX1NPVVJDRSIsICJmZXRjaFRhc2tBYm9ydGluZyIsICJmZXRjaFRhc2tTY2hlZHVsaW5nIiwgImZpbmRQcm9taXNlUmVqZWN0aW9uSGFuZGxlciIsICJlIiwgIlByb21pc2VSZWplY3Rpb25FdmVudCIsICJldnQiLCAicGF0Y2hQcm9taXNlIiwgInJlYWRhYmxlT2JqZWN0VG9TdHJpbmciLCAiX3VuY2F1Z2h0UHJvbWlzZUVycm9ycyIsICJpc0Rpc2FibGVXcmFwcGluZ1VuY2F1Z2h0UHJvbWlzZVJlamVjdGlvbiIsICJjcmVhdGlvblRyYWNlIiwgInJlamVjdGlvbiIsICJ1bmNhdWdodFByb21pc2VFcnJvciIsICJoYW5kbGVVbmhhbmRsZWRSZWplY3Rpb24iLCAiVU5IQU5ETEVEX1BST01JU0VfUkVKRUNUSU9OX0hBTkRMRVJfU1lNQk9MIiwgImhhbmRsZXIiLCAiaXNUaGVuYWJsZSIsICJmb3J3YXJkUmVzb2x1dGlvbiIsICJmb3J3YXJkUmVqZWN0aW9uIiwgIlpvbmVBd2FyZVByb21pc2UiLCAic3ltYm9sU3RhdGUiLCAic3ltYm9sVmFsdWUiLCAic3ltYm9sRmluYWxseSIsICJzeW1ib2xQYXJlbnRQcm9taXNlVmFsdWUiLCAic3ltYm9sUGFyZW50UHJvbWlzZVN0YXRlIiwgIlVOUkVTT0xWRUQiLCAiUkVTT0xWRUQiLCAiUkVKRUNURUQiLCAiUkVKRUNURURfTk9fQ0FUQ0giLCAibWFrZVJlc29sdmVyIiwgInByb21pc2UiLCAidiIsICJyZXNvbHZlUHJvbWlzZSIsICJ3YXNDYWxsZWQiLCAid3JhcHBlZEZ1bmN0aW9uIiwgIlRZUEVfRVJST1IiLCAiQ1VSUkVOVF9UQVNLX1RSQUNFX1NZTUJPTCIsICJvbmNlV3JhcHBlciIsICJ0aGVuIiwgImNsZWFyUmVqZWN0ZWROb0NhdGNoIiwgInRyYWNlIiwgInNjaGVkdWxlUmVzb2x2ZU9yUmVqZWN0IiwgIlJFSkVDVElPTl9IQU5ETEVEX0hBTkRMRVIiLCAiY2hhaW5Qcm9taXNlIiwgIm9uRnVsZmlsbGVkIiwgIm9uUmVqZWN0ZWQiLCAicHJvbWlzZVN0YXRlIiwgInBhcmVudFByb21pc2VWYWx1ZSIsICJpc0ZpbmFsbHlQcm9taXNlIiwgIlpPTkVfQVdBUkVfUFJPTUlTRV9UT19TVFJJTkciLCAiQWdncmVnYXRlRXJyb3IiLCAicmVzIiwgInJlaiIsICJ2YWx1ZXMiLCAicHJvbWlzZXMiLCAiZmluaXNoZWQiLCAicmVzb2x2ZSIsICJyZWplY3QiLCAib25SZXNvbHZlIiwgIm9uUmVqZWN0IiwgInVucmVzb2x2ZWRDb3VudCIsICJ2YWx1ZUluZGV4IiwgInJlc29sdmVkVmFsdWVzIiwgImN1clZhbHVlSW5kZXgiLCAidGhlbkVyciIsICJleGVjdXRvciIsICJDIiwgIm9uRmluYWxseSIsICJOYXRpdmVQcm9taXNlIiwgInN5bWJvbFRoZW5QYXRjaGVkIiwgInBhdGNoVGhlbiIsICJDdG9yIiwgIm9yaWdpbmFsVGhlbiIsICJ6b25laWZ5IiwgInJlc3VsdFByb21pc2UiLCAiY3RvciIsICJwYXRjaFRvU3RyaW5nIiwgIm9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZyIsICJPUklHSU5BTF9ERUxFR0FURV9TWU1CT0wiLCAiUFJPTUlTRV9TWU1CT0wiLCAiRVJST1JfU1lNQk9MIiwgIm5ld0Z1bmN0aW9uVG9TdHJpbmciLCAib3JpZ2luYWxEZWxlZ2F0ZSIsICJuYXRpdmVQcm9taXNlIiwgIm5hdGl2ZUVycm9yIiwgIm9yaWdpbmFsT2JqZWN0VG9TdHJpbmciLCAiUFJPTUlTRV9PQkpFQ1RfVE9fU1RSSU5HIiwgInBhdGNoQ2FsbGJhY2tzIiwgInRhcmdldE5hbWUiLCAibWV0aG9kIiwgIm5hdGl2ZURlbGVnYXRlIiwgImRlc2NyaXB0b3IiLCAicGF0Y2hVdGlsIiwgIlNZTUJPTF9CTEFDS19MSVNURURfRVZFTlRTIiwgIlNZTUJPTF9VTlBBVENIRURfRVZFTlRTIiwgInBhdGNoQ29tbW9uIiwgIlpvbmUkMSJdCn0K
1599
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiaW5kZXgtIX57MDBlfX4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IFIgYXMgUk9PVF9DT05URVhUIH0gZnJvbSAnLi9pbmRleC0hfnswMDZ9fi5qcyc7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIGNoZWNrIGlmIGFuIG9iamVjdCBoYXMgYWRkRXZlbnRMaXN0ZW5lciBhbmQgcmVtb3ZlRXZlbnRMaXN0ZW5lciBmdW5jdGlvbnMgdGhlbiBpdCB3aWxsIHJldHVybiB0cnVlLlxuICogR2VuZXJhbGx5IG9ubHkgY2FsbGVkIHdpdGggYSBgVGFyZ2V0V2l0aEV2ZW50c2AgYnV0IG1heSBiZSBjYWxsZWQgd2l0aCBhbiB1bmtub3duIC8gYW55LlxuICogQHBhcmFtIG9iaiAtIFRoZSBvYmplY3QgdG8gY2hlY2suXG4gKi9cbmZ1bmN0aW9uIGlzTGlzdGVuZXJPYmplY3Qob2JqKSB7XG4gICAgaWYgKG9iaiA9PT0gdm9pZCAwKSB7IG9iaiA9IHt9OyB9XG4gICAgcmV0dXJuICh0eXBlb2Ygb2JqLmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgdHlwZW9mIG9iai5yZW1vdmVFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiem9uZS5qc1wiIC8+XG4vKiBLZXkgbmFtZSB0byBiZSB1c2VkIHRvIHNhdmUgYSBjb250ZXh0IHJlZmVyZW5jZSBpbiBab25lICovXG52YXIgWk9ORV9DT05URVhUX0tFWSA9ICdPVF9aT05FX0NPTlRFWFQnO1xuLyoqXG4gKiBab25lQ29udGV4dE1hbmFnZXJcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGFuIGVhc3kgZnVuY3Rpb25hbGl0eSBmb3IgdHJhY2luZyBhY3Rpb24gYmV0d2VlbiBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBpbiB3ZWIuXG4gKiBJdCB3YXMgbm90IHBvc3NpYmxlIHdpdGggc3RhbmRhcmQgW1N0YWNrQ29udGV4dE1hbmFnZXJde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuLXRlbGVtZXRyeS9vcGVudGVsZW1ldHJ5LWpzL2Jsb2IvbWFpbi9wYWNrYWdlcy9vcGVudGVsZW1ldHJ5LXNkay10cmFjZS13ZWIvc3JjL1N0YWNrQ29udGV4dE1hbmFnZXIudHN9LlxuICogSXQgaGVhdmlseSBkZXBlbmRzIG9uIFt6b25lLmpzXXtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS96b25lLmpzfS5cbiAqIEl0IHN0b3JlcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgY29udGV4dCBpbiB6b25lLiBFYWNoIENvbnRleHQgd2lsbCBoYXZlIGFsd2F5cyBuZXcgWm9uZTtcbiAqIEl0IGFsc28gc3VwcG9ydHMgYmluZGluZyBhIGNlcnRhaW4gU3BhbiB0byBhIHRhcmdldCB0aGF0IGhhcyBcImFkZEV2ZW50TGlzdGVuZXJcIiBhbmQgXCJyZW1vdmVFdmVudExpc3RlbmVyXCIuXG4gKiBXaGVuIHRoaXMgaGFwcGVucyBhIG5ldyB6b25lIGlzIGJlaW5nIGNyZWF0ZWQgYW5kIHRoZSBwcm92aWRlZCBTcGFuIGlzIGJlaW5nIGFzc2lnbmVkIHRvIHRoaXMgem9uZS5cbiAqL1xudmFyIFpvbmVDb250ZXh0TWFuYWdlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBab25lQ29udGV4dE1hbmFnZXIoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB3aGV0aGVyIHRoZSBjb250ZXh0IG1hbmFnZXIgaXMgZW5hYmxlZCBvciBub3RcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhlbHBzIHRvIGNyZWF0ZSBhIHVuaXF1ZSBuYW1lIGZvciB0aGUgem9uZXMgLSBwYXJ0IG9mIHpvbmUgbmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fem9uZUNvdW50ZXIgPSAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhY3RpdmUgY29udGV4dCBmcm9tIGNlcnRhaW4gem9uZSBuYW1lXG4gICAgICogQHBhcmFtIGFjdGl2ZVpvbmVcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLl9hY3RpdmVDb250ZXh0RnJvbVpvbmUgPSBmdW5jdGlvbiAoYWN0aXZlWm9uZSkge1xuICAgICAgICByZXR1cm4gKGFjdGl2ZVpvbmUgJiYgYWN0aXZlWm9uZS5nZXQoWk9ORV9DT05URVhUX0tFWSkpIHx8IFJPT1RfQ09OVEVYVDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBjb250ZXh0IEEgY29udGV4dCAoc3BhbikgdG8gYmUgZXhlY3V0ZWQgd2l0aGluIHRhcmdldCBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB0YXJnZXQgRnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgd2l0aGluIHRoZSBjb250ZXh0XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLl9iaW5kRnVuY3Rpb24gPSBmdW5jdGlvbiAoY29udGV4dCwgdGFyZ2V0KSB7XG4gICAgICAgIHZhciBtYW5hZ2VyID0gdGhpcztcbiAgICAgICAgdmFyIGNvbnRleHRXcmFwcGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYW5hZ2VyLndpdGgoY29udGV4dCwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGFyZ2V0LmFwcGx5KF90aGlzLCBhcmdzKTsgfSk7XG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250ZXh0V3JhcHBlciwgJ2xlbmd0aCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IHRhcmdldC5sZW5ndGgsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29udGV4dFdyYXBwZXI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gY29udGV4dCBBIGNvbnRleHQgKHNwYW4pIHRvIGJlIGJpbmQgdG8gdGFyZ2V0XG4gICAgICogQHBhcmFtIG9iaiB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBsaXN0ZW5lcnMgd2lsbCBiZSBwYXRjaGVkXG4gICAgICovXG4gICAgWm9uZUNvbnRleHRNYW5hZ2VyLnByb3RvdHlwZS5fYmluZExpc3RlbmVyID0gZnVuY3Rpb24gKGNvbnRleHQsIG9iaikge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gb2JqO1xuICAgICAgICBpZiAodGFyZ2V0Ll9fb3RfbGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0Ll9fb3RfbGlzdGVuZXJzID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyID0gdGhpcy5fcGF0Y2hBZGRFdmVudExpc3RlbmVyKHRhcmdldCwgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyID0gdGhpcy5fcGF0Y2hSZW1vdmVFdmVudExpc3RlbmVyKHRhcmdldCwgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHVuaXF1ZSB6b25lIG5hbWVcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLl9jcmVhdGVab25lTmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fem9uZUNvdW50ZXIrKztcbiAgICAgICAgdmFyIHJhbmRvbSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl96b25lQ291bnRlciArIFwiLVwiICsgcmFuZG9tO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyB6b25lXG4gICAgICogQHBhcmFtIHpvbmVOYW1lIHpvbmUgbmFtZVxuICAgICAqIEBwYXJhbSBjb250ZXh0IEEgY29udGV4dCAoc3BhbikgdG8gYmUgYmluZCB3aXRoIFpvbmVcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLl9jcmVhdGVab25lID0gZnVuY3Rpb24gKHpvbmVOYW1lLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIFpvbmUuY3VycmVudC5mb3JrKHtcbiAgICAgICAgICAgIG5hbWU6IHpvbmVOYW1lLFxuICAgICAgICAgICAgcHJvcGVydGllczogKF9hID0ge30sXG4gICAgICAgICAgICAgICAgX2FbWk9ORV9DT05URVhUX0tFWV0gPSBjb250ZXh0LFxuICAgICAgICAgICAgICAgIF9hKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhY3RpdmUgem9uZVxuICAgICAqL1xuICAgIFpvbmVDb250ZXh0TWFuYWdlci5wcm90b3R5cGUuX2dldEFjdGl2ZVpvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBab25lLmN1cnJlbnQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQYXRjaGVzIGFkZEV2ZW50TGlzdGVuZXIgbWV0aG9kXG4gICAgICogQHBhcmFtIHRhcmdldCBhbnkgdGFyZ2V0IHRoYXQgaGFzIFwiYWRkRXZlbnRMaXN0ZW5lclwiIG1ldGhvZFxuICAgICAqIEBwYXJhbSBvcmlnaW5hbCByZWZlcmVuY2UgdG8gdGhlIHBhdGNoZWQgbWV0aG9kXG4gICAgICogQHBhcmFtIFtjb250ZXh0XSBjb250ZXh0IHRvIGJlIGJpbmQgdG8gdGhlIGxpc3RlbmVyXG4gICAgICovXG4gICAgWm9uZUNvbnRleHRNYW5hZ2VyLnByb3RvdHlwZS5fcGF0Y2hBZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHRhcmdldCwgb3JpZ2luYWwsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGNvbnRleHRNYW5hZ2VyID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCwgbGlzdGVuZXIsIG9wdHMpIHtcbiAgICAgICAgICAgIGlmICh0YXJnZXQuX19vdF9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRhcmdldC5fX290X2xpc3RlbmVycyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRhcmdldC5fX290X2xpc3RlbmVyc1tldmVudF07XG4gICAgICAgICAgICBpZiAobGlzdGVuZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnMgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICAgICAgICAgIHRhcmdldC5fX290X2xpc3RlbmVyc1tldmVudF0gPSBsaXN0ZW5lcnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcGF0Y2hlZExpc3RlbmVyID0gY29udGV4dE1hbmFnZXIuYmluZChjb250ZXh0LCBsaXN0ZW5lcik7XG4gICAgICAgICAgICAvLyBzdG9yZSBhIHdlYWsgcmVmZXJlbmNlIG9mIHRoZSB1c2VyIGxpc3RlbmVyIHRvIG91cnNcbiAgICAgICAgICAgIGxpc3RlbmVycy5zZXQobGlzdGVuZXIsIHBhdGNoZWRMaXN0ZW5lcik7XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuY2FsbCh0aGlzLCBldmVudCwgcGF0Y2hlZExpc3RlbmVyLCBvcHRzKTtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFBhdGNoZXMgcmVtb3ZlRXZlbnRMaXN0ZW5lciBtZXRob2RcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IGFueSB0YXJnZXQgdGhhdCBoYXMgXCJyZW1vdmVFdmVudExpc3RlbmVyXCIgbWV0aG9kXG4gICAgICogQHBhcmFtIG9yaWdpbmFsIHJlZmVyZW5jZSB0byB0aGUgcGF0Y2hlZCBtZXRob2RcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLl9wYXRjaFJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAodGFyZ2V0LCBvcmlnaW5hbCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgICAgICAgaWYgKHRhcmdldC5fX290X2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgICAgdGFyZ2V0Ll9fb3RfbGlzdGVuZXJzW2V2ZW50XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLmNhbGwodGhpcywgZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBldmVudHMgPSB0YXJnZXQuX19vdF9saXN0ZW5lcnNbZXZlbnRdO1xuICAgICAgICAgICAgdmFyIHBhdGNoZWRMaXN0ZW5lciA9IGV2ZW50cy5nZXQobGlzdGVuZXIpO1xuICAgICAgICAgICAgZXZlbnRzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuY2FsbCh0aGlzLCBldmVudCwgcGF0Y2hlZExpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGFjdGl2ZSBjb250ZXh0XG4gICAgICovXG4gICAgWm9uZUNvbnRleHRNYW5hZ2VyLnByb3RvdHlwZS5hY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJPT1RfQ09OVEVYVDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYWN0aXZlWm9uZSA9IHRoaXMuX2dldEFjdGl2ZVpvbmUoKTtcbiAgICAgICAgdmFyIGFjdGl2ZSA9IHRoaXMuX2FjdGl2ZUNvbnRleHRGcm9tWm9uZShhY3RpdmVab25lKTtcbiAgICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGFjdGl2ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUk9PVF9DT05URVhUO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQmluZHMgYSB0aGUgY2VydGFpbiBjb250ZXh0IG9yIHRoZSBhY3RpdmUgb25lIHRvIHRoZSB0YXJnZXQgZnVuY3Rpb24gYW5kIHRoZW4gcmV0dXJucyB0aGUgdGFyZ2V0XG4gICAgICogQHBhcmFtIGNvbnRleHQgQSBjb250ZXh0IChzcGFuKSB0byBiZSBiaW5kIHRvIHRhcmdldFxuICAgICAqIEBwYXJhbSB0YXJnZXQgYSBmdW5jdGlvbiBvciBldmVudCBlbWl0dGVyLiBXaGVuIHRhcmdldCBvciBvbmUgb2YgaXRzIGNhbGxiYWNrcyBpcyBjYWxsZWQsXG4gICAgICogIHRoZSBwcm92aWRlZCBjb250ZXh0IHdpbGwgYmUgdXNlZCBhcyB0aGUgYWN0aXZlIGNvbnRleHQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY2FsbC5cbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAoY29udGV4dCwgdGFyZ2V0KSB7XG4gICAgICAgIC8vIGlmIG5vIHNwZWNpZmljIGNvbnRleHQgdG8gcHJvcGFnYXRlIGlzIGdpdmVuLCB3ZSB1c2UgdGhlIGN1cnJlbnQgb25lXG4gICAgICAgIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnRleHQgPSB0aGlzLmFjdGl2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYmluZEZ1bmN0aW9uKGNvbnRleHQsIHRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNMaXN0ZW5lck9iamVjdCh0YXJnZXQpKSB7XG4gICAgICAgICAgICB0aGlzLl9iaW5kTGlzdGVuZXIoY29udGV4dCwgdGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGlzYWJsZSB0aGUgY29udGV4dCBtYW5hZ2VyIChjbGVhcnMgYWxsIHRoZSBjb250ZXh0cylcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBjb250ZXh0IG1hbmFnZXIgYW5kIGNyZWF0ZXMgYSBkZWZhdWx0KHJvb3QpIGNvbnRleHRcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2FsbHMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIFtmbl0gd2l0aCB0aGUgcHJvdmlkZWQgW2NvbnRleHRdLlxuICAgICAqICAgICBJZiBbY29udGV4dF0gaXMgdW5kZWZpbmVkIHRoZW4gaXQgd2lsbCB1c2UgdGhlIGFjdGl2ZSBjb250ZXh0LlxuICAgICAqICAgICBUaGUgY29udGV4dCB3aWxsIGJlIHNldCBhcyBhY3RpdmVcbiAgICAgKiBAcGFyYW0gY29udGV4dCBBIGNvbnRleHQgKHNwYW4pIHRvIGJlIGNhbGxlZCB3aXRoIHByb3ZpZGVkIGNhbGxiYWNrXG4gICAgICogQHBhcmFtIGZuIENhbGxiYWNrIGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHRoaXNBcmcgb3B0aW9uYWwgcmVjZWl2ZXIgdG8gYmUgdXNlZCBmb3IgY2FsbGluZyBmblxuICAgICAqIEBwYXJhbSBhcmdzIG9wdGlvbmFsIGFyZ3VtZW50cyBmb3J3YXJkZWQgdG8gZm5cbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLndpdGggPSBmdW5jdGlvbiAoY29udGV4dCwgZm4sIHRoaXNBcmcpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAzOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2kgLSAzXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHpvbmVOYW1lID0gdGhpcy5fY3JlYXRlWm9uZU5hbWUoKTtcbiAgICAgICAgdmFyIG5ld1pvbmUgPSB0aGlzLl9jcmVhdGVab25lKHpvbmVOYW1lLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIG5ld1pvbmUucnVuKGZuLCB0aGlzQXJnLCBhcmdzKTtcbiAgICB9O1xuICAgIHJldHVybiBab25lQ29udGV4dE1hbmFnZXI7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlIEFuZ3VsYXIgdjx1bmtub3duPlxuICogKGMpIDIwMTAtMjAyNCBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vXG4gKiBMaWNlbnNlOiBNSVRcbiAqL1xuY29uc3QgZ2xvYmFsID0gZ2xvYmFsVGhpcztcbi8vIF9fWm9uZV9zeW1ib2xfcHJlZml4IGdsb2JhbCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB6b25lXG4vLyBzeW1ib2wgcHJlZml4IHdpdGggYSBjdXN0b20gb25lIGlmIG5lZWRlZC5cbmZ1bmN0aW9uIF9fc3ltYm9sX18obmFtZSkge1xuICAgIGNvbnN0IHN5bWJvbFByZWZpeCA9IGdsb2JhbFsnX19ab25lX3N5bWJvbF9wcmVmaXgnXSB8fCAnX196b25lX3N5bWJvbF9fJztcbiAgICByZXR1cm4gc3ltYm9sUHJlZml4ICsgbmFtZTtcbn1cbmZ1bmN0aW9uIGluaXRab25lKCkge1xuICAgIGNvbnN0IHBlcmZvcm1hbmNlID0gZ2xvYmFsWydwZXJmb3JtYW5jZSddO1xuICAgIGZ1bmN0aW9uIG1hcmsobmFtZSkge1xuICAgICAgICBwZXJmb3JtYW5jZSAmJiBwZXJmb3JtYW5jZVsnbWFyayddICYmIHBlcmZvcm1hbmNlWydtYXJrJ10obmFtZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBlcmZvcm1hbmNlTWVhc3VyZShuYW1lLCBsYWJlbCkge1xuICAgICAgICBwZXJmb3JtYW5jZSAmJiBwZXJmb3JtYW5jZVsnbWVhc3VyZSddICYmIHBlcmZvcm1hbmNlWydtZWFzdXJlJ10obmFtZSwgbGFiZWwpO1xuICAgIH1cbiAgICBtYXJrKCdab25lJyk7XG4gICAgY2xhc3MgWm9uZUltcGwge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6cmVxdWlyZS1pbnRlcm5hbC13aXRoLXVuZGVyc2NvcmVcbiAgICAgICAgc3RhdGljIHsgdGhpcy5fX3N5bWJvbF9fID0gX19zeW1ib2xfXzsgfVxuICAgICAgICBzdGF0aWMgYXNzZXJ0Wm9uZVBhdGNoZWQoKSB7XG4gICAgICAgICAgICBpZiAoZ2xvYmFsWydQcm9taXNlJ10gIT09IHBhdGNoZXNbJ1pvbmVBd2FyZVByb21pc2UnXSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWm9uZS5qcyBoYXMgZGV0ZWN0ZWQgdGhhdCBab25lQXdhcmVQcm9taXNlIGAod2luZG93fGdsb2JhbCkuUHJvbWlzZWAgJyArXG4gICAgICAgICAgICAgICAgICAgICdoYXMgYmVlbiBvdmVyd3JpdHRlbi5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJ01vc3QgbGlrZWx5IGNhdXNlIGlzIHRoYXQgYSBQcm9taXNlIHBvbHlmaWxsIGhhcyBiZWVuIGxvYWRlZCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2FmdGVyIFpvbmUuanMgKFBvbHlmaWxsaW5nIFByb21pc2UgYXBpIGlzIG5vdCBuZWNlc3Nhcnkgd2hlbiB6b25lLmpzIGlzIGxvYWRlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICdJZiB5b3UgbXVzdCBsb2FkIG9uZSwgZG8gc28gYmVmb3JlIGxvYWRpbmcgem9uZS5qcy4pJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGdldCByb290KCkge1xuICAgICAgICAgICAgbGV0IHpvbmUgPSBab25lSW1wbC5jdXJyZW50O1xuICAgICAgICAgICAgd2hpbGUgKHpvbmUucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgem9uZSA9IHpvbmUucGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHpvbmU7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGdldCBjdXJyZW50KCkge1xuICAgICAgICAgICAgcmV0dXJuIF9jdXJyZW50Wm9uZUZyYW1lLnpvbmU7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGdldCBjdXJyZW50VGFzaygpIHtcbiAgICAgICAgICAgIHJldHVybiBfY3VycmVudFRhc2s7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnJlcXVpcmUtaW50ZXJuYWwtd2l0aC11bmRlcnNjb3JlXG4gICAgICAgIHN0YXRpYyBfX2xvYWRfcGF0Y2gobmFtZSwgZm4sIGlnbm9yZUR1cGxpY2F0ZSA9IGZhbHNlKSB7XG4gICAgICAgICAgICBpZiAocGF0Y2hlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgICAgICAgIC8vIGBjaGVja0R1cGxpY2F0ZWAgb3B0aW9uIGlzIGRlZmluZWQgZnJvbSBnbG9iYWwgdmFyaWFibGVcbiAgICAgICAgICAgICAgICAvLyBzbyBpdCB3b3JrcyBmb3IgYWxsIG1vZHVsZXMuXG4gICAgICAgICAgICAgICAgLy8gYGlnbm9yZUR1cGxpY2F0ZWAgY2FuIHdvcmsgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlXG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2tEdXBsaWNhdGUgPSBnbG9iYWxbX19zeW1ib2xfXygnZm9yY2VEdXBsaWNhdGVab25lQ2hlY2snKV0gPT09IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKCFpZ25vcmVEdXBsaWNhdGUgJiYgY2hlY2tEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0FscmVhZHkgbG9hZGVkIHBhdGNoOiAnICsgbmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIWdsb2JhbFsnX19ab25lX2Rpc2FibGVfJyArIG5hbWVdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGVyZk5hbWUgPSAnWm9uZTonICsgbmFtZTtcbiAgICAgICAgICAgICAgICBtYXJrKHBlcmZOYW1lKTtcbiAgICAgICAgICAgICAgICBwYXRjaGVzW25hbWVdID0gZm4oZ2xvYmFsLCBab25lSW1wbCwgX2FwaSk7XG4gICAgICAgICAgICAgICAgcGVyZm9ybWFuY2VNZWFzdXJlKHBlcmZOYW1lLCBwZXJmTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHBhcmVudCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIHpvbmVTcGVjKSB7XG4gICAgICAgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgICAgICB0aGlzLl9uYW1lID0gem9uZVNwZWMgPyB6b25lU3BlYy5uYW1lIHx8ICd1bm5hbWVkJyA6ICc8cm9vdD4nO1xuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9ICh6b25lU3BlYyAmJiB6b25lU3BlYy5wcm9wZXJ0aWVzKSB8fCB7fTtcbiAgICAgICAgICAgIHRoaXMuX3pvbmVEZWxlZ2F0ZSA9IG5ldyBfWm9uZURlbGVnYXRlKHRoaXMsIHRoaXMuX3BhcmVudCAmJiB0aGlzLl9wYXJlbnQuX3pvbmVEZWxlZ2F0ZSwgem9uZVNwZWMpO1xuICAgICAgICB9XG4gICAgICAgIGdldChrZXkpIHtcbiAgICAgICAgICAgIGNvbnN0IHpvbmUgPSB0aGlzLmdldFpvbmVXaXRoKGtleSk7XG4gICAgICAgICAgICBpZiAoem9uZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gem9uZS5fcHJvcGVydGllc1trZXldO1xuICAgICAgICB9XG4gICAgICAgIGdldFpvbmVXaXRoKGtleSkge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzO1xuICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudC5fcHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5fcGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZm9yayh6b25lU3BlYykge1xuICAgICAgICAgICAgaWYgKCF6b25lU3BlYylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1pvbmVTcGVjIHJlcXVpcmVkIScpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5mb3JrKHRoaXMsIHpvbmVTcGVjKTtcbiAgICAgICAgfVxuICAgICAgICB3cmFwKGNhbGxiYWNrLCBzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGluZyBmdW5jdGlvbiBnb3Q6ICcgKyBjYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBfY2FsbGJhY2sgPSB0aGlzLl96b25lRGVsZWdhdGUuaW50ZXJjZXB0KHRoaXMsIGNhbGxiYWNrLCBzb3VyY2UpO1xuICAgICAgICAgICAgY29uc3Qgem9uZSA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB6b25lLnJ1bkd1YXJkZWQoX2NhbGxiYWNrLCB0aGlzLCBhcmd1bWVudHMsIHNvdXJjZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJ1bihjYWxsYmFjaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MsIHNvdXJjZSkge1xuICAgICAgICAgICAgX2N1cnJlbnRab25lRnJhbWUgPSB7IHBhcmVudDogX2N1cnJlbnRab25lRnJhbWUsIHpvbmU6IHRoaXMgfTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnZva2UodGhpcywgY2FsbGJhY2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzLCBzb3VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgX2N1cnJlbnRab25lRnJhbWUgPSBfY3VycmVudFpvbmVGcmFtZS5wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcnVuR3VhcmRlZChjYWxsYmFjaywgYXBwbHlUaGlzID0gbnVsbCwgYXBwbHlBcmdzLCBzb3VyY2UpIHtcbiAgICAgICAgICAgIF9jdXJyZW50Wm9uZUZyYW1lID0geyBwYXJlbnQ6IF9jdXJyZW50Wm9uZUZyYW1lLCB6b25lOiB0aGlzIH07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl96b25lRGVsZWdhdGUuaW52b2tlKHRoaXMsIGNhbGxiYWNrLCBhcHBseVRoaXMsIGFwcGx5QXJncywgc291cmNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl96b25lRGVsZWdhdGUuaGFuZGxlRXJyb3IodGhpcywgZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIF9jdXJyZW50Wm9uZUZyYW1lID0gX2N1cnJlbnRab25lRnJhbWUucGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJ1blRhc2sodGFzaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MpIHtcbiAgICAgICAgICAgIGlmICh0YXNrLnpvbmUgIT0gdGhpcykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQSB0YXNrIGNhbiBvbmx5IGJlIHJ1biBpbiB0aGUgem9uZSBvZiBjcmVhdGlvbiEgKENyZWF0aW9uOiAnICtcbiAgICAgICAgICAgICAgICAgICAgKHRhc2suem9uZSB8fCBOT19aT05FKS5uYW1lICtcbiAgICAgICAgICAgICAgICAgICAgJzsgRXhlY3V0aW9uOiAnICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lICtcbiAgICAgICAgICAgICAgICAgICAgJyknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHpvbmVUYXNrID0gdGFzaztcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3pvbmUuanMvaXNzdWVzLzc3OCwgc29tZXRpbWVzIGV2ZW50VGFza1xuICAgICAgICAgICAgLy8gd2lsbCBydW4gaW4gbm90U2NoZWR1bGVkKGNhbmNlbGVkKSBzdGF0ZSwgd2Ugc2hvdWxkIG5vdCB0cnkgdG9cbiAgICAgICAgICAgIC8vIHJ1biBzdWNoIGtpbmQgb2YgdGFzayBidXQganVzdCByZXR1cm5cbiAgICAgICAgICAgIGNvbnN0IHsgdHlwZSwgZGF0YTogeyBpc1BlcmlvZGljID0gZmFsc2UsIGlzUmVmcmVzaGFibGUgPSBmYWxzZSB9ID0ge30gfSA9IHRhc2s7XG4gICAgICAgICAgICBpZiAodGFzay5zdGF0ZSA9PT0gbm90U2NoZWR1bGVkICYmICh0eXBlID09PSBldmVudFRhc2sgfHwgdHlwZSA9PT0gbWFjcm9UYXNrKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlRW50cnlHdWFyZCA9IHRhc2suc3RhdGUgIT0gcnVubmluZztcbiAgICAgICAgICAgIHJlRW50cnlHdWFyZCAmJiB6b25lVGFzay5fdHJhbnNpdGlvblRvKHJ1bm5pbmcsIHNjaGVkdWxlZCk7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c1Rhc2sgPSBfY3VycmVudFRhc2s7XG4gICAgICAgICAgICBfY3VycmVudFRhc2sgPSB6b25lVGFzaztcbiAgICAgICAgICAgIF9jdXJyZW50Wm9uZUZyYW1lID0geyBwYXJlbnQ6IF9jdXJyZW50Wm9uZUZyYW1lLCB6b25lOiB0aGlzIH07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlID09IG1hY3JvVGFzayAmJiB0YXNrLmRhdGEgJiYgIWlzUGVyaW9kaWMgJiYgIWlzUmVmcmVzaGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFzay5jYW5jZWxGbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnZva2VUYXNrKHRoaXMsIHpvbmVUYXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fem9uZURlbGVnYXRlLmhhbmRsZUVycm9yKHRoaXMsIGVycm9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdGFzaydzIHN0YXRlIGlzIG5vdFNjaGVkdWxlZCBvciB1bmtub3duLCB0aGVuIGl0IGhhcyBhbHJlYWR5IGJlZW4gY2FuY2VsbGVkXG4gICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIG5vdCByZXNldCB0aGUgc3RhdGUgdG8gc2NoZWR1bGVkXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSB0YXNrLnN0YXRlO1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gbm90U2NoZWR1bGVkICYmIHN0YXRlICE9PSB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IGV2ZW50VGFzayB8fCBpc1BlcmlvZGljIHx8IChpc1JlZnJlc2hhYmxlICYmIHN0YXRlID09PSBzY2hlZHVsaW5nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVFbnRyeUd1YXJkICYmIHpvbmVUYXNrLl90cmFuc2l0aW9uVG8oc2NoZWR1bGVkLCBydW5uaW5nLCBzY2hlZHVsaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHpvbmVEZWxlZ2F0ZXMgPSB6b25lVGFzay5fem9uZURlbGVnYXRlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRhc2tDb3VudCh6b25lVGFzaywgLTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVFbnRyeUd1YXJkICYmIHpvbmVUYXNrLl90cmFuc2l0aW9uVG8obm90U2NoZWR1bGVkLCBydW5uaW5nLCBub3RTY2hlZHVsZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVmcmVzaGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b25lVGFzay5fem9uZURlbGVnYXRlcyA9IHpvbmVEZWxlZ2F0ZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX2N1cnJlbnRab25lRnJhbWUgPSBfY3VycmVudFpvbmVGcmFtZS5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgX2N1cnJlbnRUYXNrID0gcHJldmlvdXNUYXNrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNjaGVkdWxlVGFzayh0YXNrKSB7XG4gICAgICAgICAgICBpZiAodGFzay56b25lICYmIHRhc2suem9uZSAhPT0gdGhpcykge1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSB0YXNrIHdhcyByZXNjaGVkdWxlZCwgdGhlIG5ld1pvbmVcbiAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IGJlIHRoZSBjaGlsZHJlbiBvZiB0aGUgb3JpZ2luYWwgem9uZVxuICAgICAgICAgICAgICAgIGxldCBuZXdab25lID0gdGhpcztcbiAgICAgICAgICAgICAgICB3aGlsZSAobmV3Wm9uZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV3Wm9uZSA9PT0gdGFzay56b25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgY2FuIG5vdCByZXNjaGVkdWxlIHRhc2sgdG8gJHt0aGlzLm5hbWV9IHdoaWNoIGlzIGRlc2NlbmRhbnRzIG9mIHRoZSBvcmlnaW5hbCB6b25lICR7dGFzay56b25lLm5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbmV3Wm9uZSA9IG5ld1pvbmUucGFyZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRhc2suX3RyYW5zaXRpb25UbyhzY2hlZHVsaW5nLCBub3RTY2hlZHVsZWQpO1xuICAgICAgICAgICAgY29uc3Qgem9uZURlbGVnYXRlcyA9IFtdO1xuICAgICAgICAgICAgdGFzay5fem9uZURlbGVnYXRlcyA9IHpvbmVEZWxlZ2F0ZXM7XG4gICAgICAgICAgICB0YXNrLl96b25lID0gdGhpcztcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGFzayA9IHRoaXMuX3pvbmVEZWxlZ2F0ZS5zY2hlZHVsZVRhc2sodGhpcywgdGFzayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgLy8gc2hvdWxkIHNldCB0YXNrJ3Mgc3RhdGUgdG8gdW5rbm93biB3aGVuIHNjaGVkdWxlVGFzayB0aHJvdyBlcnJvclxuICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIGVyciBtYXkgZnJvbSByZXNjaGVkdWxlLCBzbyB0aGUgZnJvbVN0YXRlIG1heWJlIG5vdFNjaGVkdWxlZFxuICAgICAgICAgICAgICAgIHRhc2suX3RyYW5zaXRpb25Ubyh1bmtub3duLCBzY2hlZHVsaW5nLCBub3RTY2hlZHVsZWQpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IEBKaWFMaVBhc3Npb24sIHNob3VsZCB3ZSBjaGVjayB0aGUgcmVzdWx0IGZyb20gaGFuZGxlRXJyb3I/XG4gICAgICAgICAgICAgICAgdGhpcy5fem9uZURlbGVnYXRlLmhhbmRsZUVycm9yKHRoaXMsIGVycik7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRhc2suX3pvbmVEZWxlZ2F0ZXMgPT09IHpvbmVEZWxlZ2F0ZXMpIHtcbiAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIGNoZWNrIGJlY2F1c2UgaW50ZXJuYWxseSB0aGUgZGVsZWdhdGUgY2FuIHJlc2NoZWR1bGUgdGhlIHRhc2suXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlVGFza0NvdW50KHRhc2ssIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRhc2suc3RhdGUgPT0gc2NoZWR1bGluZykge1xuICAgICAgICAgICAgICAgIHRhc2suX3RyYW5zaXRpb25UbyhzY2hlZHVsZWQsIHNjaGVkdWxpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhc2s7XG4gICAgICAgIH1cbiAgICAgICAgc2NoZWR1bGVNaWNyb1Rhc2soc291cmNlLCBjYWxsYmFjaywgZGF0YSwgY3VzdG9tU2NoZWR1bGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlVGFzayhuZXcgWm9uZVRhc2sobWljcm9UYXNrLCBzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgdW5kZWZpbmVkKSk7XG4gICAgICAgIH1cbiAgICAgICAgc2NoZWR1bGVNYWNyb1Rhc2soc291cmNlLCBjYWxsYmFjaywgZGF0YSwgY3VzdG9tU2NoZWR1bGUsIGN1c3RvbUNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVUYXNrKG5ldyBab25lVGFzayhtYWNyb1Rhc2ssIHNvdXJjZSwgY2FsbGJhY2ssIGRhdGEsIGN1c3RvbVNjaGVkdWxlLCBjdXN0b21DYW5jZWwpKTtcbiAgICAgICAgfVxuICAgICAgICBzY2hlZHVsZUV2ZW50VGFzayhzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgY3VzdG9tQ2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZVRhc2sobmV3IFpvbmVUYXNrKGV2ZW50VGFzaywgc291cmNlLCBjYWxsYmFjaywgZGF0YSwgY3VzdG9tU2NoZWR1bGUsIGN1c3RvbUNhbmNlbCkpO1xuICAgICAgICB9XG4gICAgICAgIGNhbmNlbFRhc2sodGFzaykge1xuICAgICAgICAgICAgaWYgKHRhc2suem9uZSAhPSB0aGlzKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQSB0YXNrIGNhbiBvbmx5IGJlIGNhbmNlbGxlZCBpbiB0aGUgem9uZSBvZiBjcmVhdGlvbiEgKENyZWF0aW9uOiAnICtcbiAgICAgICAgICAgICAgICAgICAgKHRhc2suem9uZSB8fCBOT19aT05FKS5uYW1lICtcbiAgICAgICAgICAgICAgICAgICAgJzsgRXhlY3V0aW9uOiAnICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lICtcbiAgICAgICAgICAgICAgICAgICAgJyknKTtcbiAgICAgICAgICAgIGlmICh0YXNrLnN0YXRlICE9PSBzY2hlZHVsZWQgJiYgdGFzay5zdGF0ZSAhPT0gcnVubmluZykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRhc2suX3RyYW5zaXRpb25UbyhjYW5jZWxpbmcsIHNjaGVkdWxlZCwgcnVubmluZyk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3pvbmVEZWxlZ2F0ZS5jYW5jZWxUYXNrKHRoaXMsIHRhc2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIC8vIGlmIGVycm9yIG9jY3VycyB3aGVuIGNhbmNlbFRhc2ssIHRyYW5zaXQgdGhlIHN0YXRlIHRvIHVua25vd25cbiAgICAgICAgICAgICAgICB0YXNrLl90cmFuc2l0aW9uVG8odW5rbm93biwgY2FuY2VsaW5nKTtcbiAgICAgICAgICAgICAgICB0aGlzLl96b25lRGVsZWdhdGUuaGFuZGxlRXJyb3IodGhpcywgZXJyKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVUYXNrQ291bnQodGFzaywgLTEpO1xuICAgICAgICAgICAgdGFzay5fdHJhbnNpdGlvblRvKG5vdFNjaGVkdWxlZCwgY2FuY2VsaW5nKTtcbiAgICAgICAgICAgIHRhc2sucnVuQ291bnQgPSAtMTtcbiAgICAgICAgICAgIHJldHVybiB0YXNrO1xuICAgICAgICB9XG4gICAgICAgIF91cGRhdGVUYXNrQ291bnQodGFzaywgY291bnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHpvbmVEZWxlZ2F0ZXMgPSB0YXNrLl96b25lRGVsZWdhdGVzO1xuICAgICAgICAgICAgaWYgKGNvdW50ID09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGFzay5fem9uZURlbGVnYXRlcyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHpvbmVEZWxlZ2F0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB6b25lRGVsZWdhdGVzW2ldLl91cGRhdGVUYXNrQ291bnQodGFzay50eXBlLCBjb3VudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgREVMRUdBVEVfWlMgPSB7XG4gICAgICAgIG5hbWU6ICcnLFxuICAgICAgICBvbkhhc1Rhc2s6IChkZWxlZ2F0ZSwgXywgdGFyZ2V0LCBoYXNUYXNrU3RhdGUpID0+IGRlbGVnYXRlLmhhc1Rhc2sodGFyZ2V0LCBoYXNUYXNrU3RhdGUpLFxuICAgICAgICBvblNjaGVkdWxlVGFzazogKGRlbGVnYXRlLCBfLCB0YXJnZXQsIHRhc2spID0+IGRlbGVnYXRlLnNjaGVkdWxlVGFzayh0YXJnZXQsIHRhc2spLFxuICAgICAgICBvbkludm9rZVRhc2s6IChkZWxlZ2F0ZSwgXywgdGFyZ2V0LCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncykgPT4gZGVsZWdhdGUuaW52b2tlVGFzayh0YXJnZXQsIHRhc2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzKSxcbiAgICAgICAgb25DYW5jZWxUYXNrOiAoZGVsZWdhdGUsIF8sIHRhcmdldCwgdGFzaykgPT4gZGVsZWdhdGUuY2FuY2VsVGFzayh0YXJnZXQsIHRhc2spLFxuICAgIH07XG4gICAgY2xhc3MgX1pvbmVEZWxlZ2F0ZSB7XG4gICAgICAgIGdldCB6b25lKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3RydWN0b3Ioem9uZSwgcGFyZW50RGVsZWdhdGUsIHpvbmVTcGVjKSB7XG4gICAgICAgICAgICB0aGlzLl90YXNrQ291bnRzID0ge1xuICAgICAgICAgICAgICAgICdtaWNyb1Rhc2snOiAwLFxuICAgICAgICAgICAgICAgICdtYWNyb1Rhc2snOiAwLFxuICAgICAgICAgICAgICAgICdldmVudFRhc2snOiAwLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX3pvbmUgPSB6b25lO1xuICAgICAgICAgICAgdGhpcy5fcGFyZW50RGVsZWdhdGUgPSBwYXJlbnREZWxlZ2F0ZTtcbiAgICAgICAgICAgIHRoaXMuX2ZvcmtaUyA9IHpvbmVTcGVjICYmICh6b25lU3BlYyAmJiB6b25lU3BlYy5vbkZvcmsgPyB6b25lU3BlYyA6IHBhcmVudERlbGVnYXRlLl9mb3JrWlMpO1xuICAgICAgICAgICAgdGhpcy5fZm9ya0RsZ3QgPSB6b25lU3BlYyAmJiAoem9uZVNwZWMub25Gb3JrID8gcGFyZW50RGVsZWdhdGUgOiBwYXJlbnREZWxlZ2F0ZS5fZm9ya0RsZ3QpO1xuICAgICAgICAgICAgdGhpcy5fZm9ya0N1cnJab25lID1cbiAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25Gb3JrID8gdGhpcy5fem9uZSA6IHBhcmVudERlbGVnYXRlLl9mb3JrQ3VyclpvbmUpO1xuICAgICAgICAgICAgdGhpcy5faW50ZXJjZXB0WlMgPVxuICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkludGVyY2VwdCA/IHpvbmVTcGVjIDogcGFyZW50RGVsZWdhdGUuX2ludGVyY2VwdFpTKTtcbiAgICAgICAgICAgIHRoaXMuX2ludGVyY2VwdERsZ3QgPVxuICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkludGVyY2VwdCA/IHBhcmVudERlbGVnYXRlIDogcGFyZW50RGVsZWdhdGUuX2ludGVyY2VwdERsZ3QpO1xuICAgICAgICAgICAgdGhpcy5faW50ZXJjZXB0Q3VyclpvbmUgPVxuICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkludGVyY2VwdCA/IHRoaXMuX3pvbmUgOiBwYXJlbnREZWxlZ2F0ZS5faW50ZXJjZXB0Q3VyclpvbmUpO1xuICAgICAgICAgICAgdGhpcy5faW52b2tlWlMgPSB6b25lU3BlYyAmJiAoem9uZVNwZWMub25JbnZva2UgPyB6b25lU3BlYyA6IHBhcmVudERlbGVnYXRlLl9pbnZva2VaUyk7XG4gICAgICAgICAgICB0aGlzLl9pbnZva2VEbGd0ID1cbiAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25JbnZva2UgPyBwYXJlbnREZWxlZ2F0ZSA6IHBhcmVudERlbGVnYXRlLl9pbnZva2VEbGd0KTtcbiAgICAgICAgICAgIHRoaXMuX2ludm9rZUN1cnJab25lID1cbiAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25JbnZva2UgPyB0aGlzLl96b25lIDogcGFyZW50RGVsZWdhdGUuX2ludm9rZUN1cnJab25lKTtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZUVycm9yWlMgPVxuICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkhhbmRsZUVycm9yID8gem9uZVNwZWMgOiBwYXJlbnREZWxlZ2F0ZS5faGFuZGxlRXJyb3JaUyk7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVFcnJvckRsZ3QgPVxuICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkhhbmRsZUVycm9yID8gcGFyZW50RGVsZWdhdGUgOiBwYXJlbnREZWxlZ2F0ZS5faGFuZGxlRXJyb3JEbGd0KTtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZUVycm9yQ3VyclpvbmUgPVxuICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkhhbmRsZUVycm9yID8gdGhpcy5fem9uZSA6IHBhcmVudERlbGVnYXRlLl9oYW5kbGVFcnJvckN1cnJab25lKTtcbiAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlVGFza1pTID1cbiAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25TY2hlZHVsZVRhc2sgPyB6b25lU3BlYyA6IHBhcmVudERlbGVnYXRlLl9zY2hlZHVsZVRhc2taUyk7XG4gICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVRhc2tEbGd0ID1cbiAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25TY2hlZHVsZVRhc2sgPyBwYXJlbnREZWxlZ2F0ZSA6IHBhcmVudERlbGVnYXRlLl9zY2hlZHVsZVRhc2tEbGd0KTtcbiAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlVGFza0N1cnJab25lID1cbiAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25TY2hlZHVsZVRhc2sgPyB0aGlzLl96b25lIDogcGFyZW50RGVsZWdhdGUuX3NjaGVkdWxlVGFza0N1cnJab25lKTtcbiAgICAgICAgICAgIHRoaXMuX2ludm9rZVRhc2taUyA9XG4gICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW52b2tlVGFzayA/IHpvbmVTcGVjIDogcGFyZW50RGVsZWdhdGUuX2ludm9rZVRhc2taUyk7XG4gICAgICAgICAgICB0aGlzLl9pbnZva2VUYXNrRGxndCA9XG4gICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW52b2tlVGFzayA/IHBhcmVudERlbGVnYXRlIDogcGFyZW50RGVsZWdhdGUuX2ludm9rZVRhc2tEbGd0KTtcbiAgICAgICAgICAgIHRoaXMuX2ludm9rZVRhc2tDdXJyWm9uZSA9XG4gICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW52b2tlVGFzayA/IHRoaXMuX3pvbmUgOiBwYXJlbnREZWxlZ2F0ZS5faW52b2tlVGFza0N1cnJab25lKTtcbiAgICAgICAgICAgIHRoaXMuX2NhbmNlbFRhc2taUyA9XG4gICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uQ2FuY2VsVGFzayA/IHpvbmVTcGVjIDogcGFyZW50RGVsZWdhdGUuX2NhbmNlbFRhc2taUyk7XG4gICAgICAgICAgICB0aGlzLl9jYW5jZWxUYXNrRGxndCA9XG4gICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uQ2FuY2VsVGFzayA/IHBhcmVudERlbGVnYXRlIDogcGFyZW50RGVsZWdhdGUuX2NhbmNlbFRhc2tEbGd0KTtcbiAgICAgICAgICAgIHRoaXMuX2NhbmNlbFRhc2tDdXJyWm9uZSA9XG4gICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uQ2FuY2VsVGFzayA/IHRoaXMuX3pvbmUgOiBwYXJlbnREZWxlZ2F0ZS5fY2FuY2VsVGFza0N1cnJab25lKTtcbiAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2taUyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9oYXNUYXNrRGxndCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9oYXNUYXNrRGxndE93bmVyID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2tDdXJyWm9uZSA9IG51bGw7XG4gICAgICAgICAgICBjb25zdCB6b25lU3BlY0hhc1Rhc2sgPSB6b25lU3BlYyAmJiB6b25lU3BlYy5vbkhhc1Rhc2s7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRIYXNUYXNrID0gcGFyZW50RGVsZWdhdGUgJiYgcGFyZW50RGVsZWdhdGUuX2hhc1Rhc2taUztcbiAgICAgICAgICAgIGlmICh6b25lU3BlY0hhc1Rhc2sgfHwgcGFyZW50SGFzVGFzaykge1xuICAgICAgICAgICAgICAgIC8vIElmIHdlIG5lZWQgdG8gcmVwb3J0IGhhc1Rhc2ssIHRoYW4gdGhpcyBaUyBuZWVkcyB0byBkbyByZWYgY291bnRpbmcgb24gdGFza3MuIEluIHN1Y2hcbiAgICAgICAgICAgICAgICAvLyBhIGNhc2UgYWxsIHRhc2sgcmVsYXRlZCBpbnRlcmNlcHRvcnMgbXVzdCBnbyB0aHJvdWdoIHRoaXMgWkQuIFdlIGNhbid0IHNob3J0IGNpcmN1aXQgaXQuXG4gICAgICAgICAgICAgICAgdGhpcy5faGFzVGFza1pTID0gem9uZVNwZWNIYXNUYXNrID8gem9uZVNwZWMgOiBERUxFR0FURV9aUztcbiAgICAgICAgICAgICAgICB0aGlzLl9oYXNUYXNrRGxndCA9IHBhcmVudERlbGVnYXRlO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2tEbGd0T3duZXIgPSB0aGlzO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2tDdXJyWm9uZSA9IHRoaXMuX3pvbmU7XG4gICAgICAgICAgICAgICAgaWYgKCF6b25lU3BlYy5vblNjaGVkdWxlVGFzaykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVRhc2taUyA9IERFTEVHQVRFX1pTO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVRhc2tEbGd0ID0gcGFyZW50RGVsZWdhdGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlVGFza0N1cnJab25lID0gdGhpcy5fem9uZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF6b25lU3BlYy5vbkludm9rZVRhc2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW52b2tlVGFza1pTID0gREVMRUdBVEVfWlM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZVRhc2tEbGd0ID0gcGFyZW50RGVsZWdhdGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZVRhc2tDdXJyWm9uZSA9IHRoaXMuX3pvbmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghem9uZVNwZWMub25DYW5jZWxUYXNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbmNlbFRhc2taUyA9IERFTEVHQVRFX1pTO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYW5jZWxUYXNrRGxndCA9IHBhcmVudERlbGVnYXRlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYW5jZWxUYXNrQ3VyclpvbmUgPSB0aGlzLl96b25lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3JrKHRhcmdldFpvbmUsIHpvbmVTcGVjKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZm9ya1pTXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9mb3JrWlMub25Gb3JrKHRoaXMuX2ZvcmtEbGd0LCB0aGlzLnpvbmUsIHRhcmdldFpvbmUsIHpvbmVTcGVjKVxuICAgICAgICAgICAgICAgIDogbmV3IFpvbmVJbXBsKHRhcmdldFpvbmUsIHpvbmVTcGVjKTtcbiAgICAgICAgfVxuICAgICAgICBpbnRlcmNlcHQodGFyZ2V0Wm9uZSwgY2FsbGJhY2ssIHNvdXJjZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludGVyY2VwdFpTXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9pbnRlcmNlcHRaUy5vbkludGVyY2VwdCh0aGlzLl9pbnRlcmNlcHREbGd0LCB0aGlzLl9pbnRlcmNlcHRDdXJyWm9uZSwgdGFyZ2V0Wm9uZSwgY2FsbGJhY2ssIHNvdXJjZSlcbiAgICAgICAgICAgICAgICA6IGNhbGxiYWNrO1xuICAgICAgICB9XG4gICAgICAgIGludm9rZSh0YXJnZXRab25lLCBjYWxsYmFjaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MsIHNvdXJjZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZVpTXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9pbnZva2VaUy5vbkludm9rZSh0aGlzLl9pbnZva2VEbGd0LCB0aGlzLl9pbnZva2VDdXJyWm9uZSwgdGFyZ2V0Wm9uZSwgY2FsbGJhY2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzLCBzb3VyY2UpXG4gICAgICAgICAgICAgICAgOiBjYWxsYmFjay5hcHBseShhcHBseVRoaXMsIGFwcGx5QXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgaGFuZGxlRXJyb3IodGFyZ2V0Wm9uZSwgZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVFcnJvclpTXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9oYW5kbGVFcnJvclpTLm9uSGFuZGxlRXJyb3IodGhpcy5faGFuZGxlRXJyb3JEbGd0LCB0aGlzLl9oYW5kbGVFcnJvckN1cnJab25lLCB0YXJnZXRab25lLCBlcnJvcilcbiAgICAgICAgICAgICAgICA6IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgc2NoZWR1bGVUYXNrKHRhcmdldFpvbmUsIHRhc2spIHtcbiAgICAgICAgICAgIGxldCByZXR1cm5UYXNrID0gdGFzaztcbiAgICAgICAgICAgIGlmICh0aGlzLl9zY2hlZHVsZVRhc2taUykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9oYXNUYXNrWlMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVGFzay5fem9uZURlbGVnYXRlcy5wdXNoKHRoaXMuX2hhc1Rhc2tEbGd0T3duZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm5UYXNrID0gdGhpcy5fc2NoZWR1bGVUYXNrWlMub25TY2hlZHVsZVRhc2sodGhpcy5fc2NoZWR1bGVUYXNrRGxndCwgdGhpcy5fc2NoZWR1bGVUYXNrQ3VyclpvbmUsIHRhcmdldFpvbmUsIHRhc2spO1xuICAgICAgICAgICAgICAgIGlmICghcmV0dXJuVGFzaylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVGFzayA9IHRhc2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGFzay5zY2hlZHVsZUZuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhc2suc2NoZWR1bGVGbih0YXNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGFzay50eXBlID09IG1pY3JvVGFzaykge1xuICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZU1pY3JvVGFzayh0YXNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGFzayBpcyBtaXNzaW5nIHNjaGVkdWxlRm4uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldHVyblRhc2s7XG4gICAgICAgIH1cbiAgICAgICAgaW52b2tlVGFzayh0YXJnZXRab25lLCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZVRhc2taU1xuICAgICAgICAgICAgICAgID8gdGhpcy5faW52b2tlVGFza1pTLm9uSW52b2tlVGFzayh0aGlzLl9pbnZva2VUYXNrRGxndCwgdGhpcy5faW52b2tlVGFza0N1cnJab25lLCB0YXJnZXRab25lLCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncylcbiAgICAgICAgICAgICAgICA6IHRhc2suY2FsbGJhY2suYXBwbHkoYXBwbHlUaGlzLCBhcHBseUFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGNhbmNlbFRhc2sodGFyZ2V0Wm9uZSwgdGFzaykge1xuICAgICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NhbmNlbFRhc2taUykge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5fY2FuY2VsVGFza1pTLm9uQ2FuY2VsVGFzayh0aGlzLl9jYW5jZWxUYXNrRGxndCwgdGhpcy5fY2FuY2VsVGFza0N1cnJab25lLCB0YXJnZXRab25lLCB0YXNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghdGFzay5jYW5jZWxGbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignVGFzayBpcyBub3QgY2FuY2VsYWJsZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRhc2suY2FuY2VsRm4odGFzayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaGFzVGFzayh0YXJnZXRab25lLCBpc0VtcHR5KSB7XG4gICAgICAgICAgICAvLyBoYXNUYXNrIHNob3VsZCBub3QgdGhyb3cgZXJyb3Igc28gb3RoZXIgWm9uZURlbGVnYXRlXG4gICAgICAgICAgICAvLyBjYW4gc3RpbGwgdHJpZ2dlciBoYXNUYXNrIGNhbGxiYWNrXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2taUyAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYXNUYXNrWlMub25IYXNUYXNrKHRoaXMuX2hhc1Rhc2tEbGd0LCB0aGlzLl9oYXNUYXNrQ3VyclpvbmUsIHRhcmdldFpvbmUsIGlzRW1wdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IodGFyZ2V0Wm9uZSwgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6cmVxdWlyZS1pbnRlcm5hbC13aXRoLXVuZGVyc2NvcmVcbiAgICAgICAgX3VwZGF0ZVRhc2tDb3VudCh0eXBlLCBjb3VudCkge1xuICAgICAgICAgICAgY29uc3QgY291bnRzID0gdGhpcy5fdGFza0NvdW50cztcbiAgICAgICAgICAgIGNvbnN0IHByZXYgPSBjb3VudHNbdHlwZV07XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gKGNvdW50c1t0eXBlXSA9IHByZXYgKyBjb3VudCk7XG4gICAgICAgICAgICBpZiAobmV4dCA8IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01vcmUgdGFza3MgZXhlY3V0ZWQgdGhlbiB3ZXJlIHNjaGVkdWxlZC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcmV2ID09IDAgfHwgbmV4dCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNFbXB0eSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbWljcm9UYXNrOiBjb3VudHNbJ21pY3JvVGFzayddID4gMCxcbiAgICAgICAgICAgICAgICAgICAgbWFjcm9UYXNrOiBjb3VudHNbJ21hY3JvVGFzayddID4gMCxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUYXNrOiBjb3VudHNbJ2V2ZW50VGFzayddID4gMCxcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlOiB0eXBlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNUYXNrKHRoaXMuX3pvbmUsIGlzRW1wdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNsYXNzIFpvbmVUYXNrIHtcbiAgICAgICAgY29uc3RydWN0b3IodHlwZSwgc291cmNlLCBjYWxsYmFjaywgb3B0aW9ucywgc2NoZWR1bGVGbiwgY2FuY2VsRm4pIHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpyZXF1aXJlLWludGVybmFsLXdpdGgtdW5kZXJzY29yZVxuICAgICAgICAgICAgdGhpcy5fem9uZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnJ1bkNvdW50ID0gMDtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpyZXF1aXJlLWludGVybmFsLXdpdGgtdW5kZXJzY29yZVxuICAgICAgICAgICAgdGhpcy5fem9uZURlbGVnYXRlcyA9IG51bGw7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6cmVxdWlyZS1pbnRlcm5hbC13aXRoLXVuZGVyc2NvcmVcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ25vdFNjaGVkdWxlZCc7XG4gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBvcHRpb25zO1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUZuID0gc2NoZWR1bGVGbjtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsRm4gPSBjYW5jZWxGbjtcbiAgICAgICAgICAgIGlmICghY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxiYWNrIGlzIG5vdCBkZWZpbmVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgICAgIC8vIFRPRE86IEBKaWFMaVBhc3Npb24gb3B0aW9ucyBzaG91bGQgaGF2ZSBpbnRlcmZhY2VcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBldmVudFRhc2sgJiYgb3B0aW9ucyAmJiBvcHRpb25zLnVzZUcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmludm9rZSA9IFpvbmVUYXNrLmludm9rZVRhc2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmludm9rZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFpvbmVUYXNrLmludm9rZVRhc2suY2FsbChnbG9iYWwsIHNlbGYsIHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgaW52b2tlVGFzayh0YXNrLCB0YXJnZXQsIGFyZ3MpIHtcbiAgICAgICAgICAgIGlmICghdGFzaykge1xuICAgICAgICAgICAgICAgIHRhc2sgPSB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcysrO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0YXNrLnJ1bkNvdW50Kys7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhc2suem9uZS5ydW5UYXNrKHRhc2ssIHRhcmdldCwgYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBpZiAoX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcyA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGRyYWluTWljcm9UYXNrUXVldWUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcy0tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldCB6b25lKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHN0YXRlKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICAgICAgICB9XG4gICAgICAgIGNhbmNlbFNjaGVkdWxlUmVxdWVzdCgpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25Ubyhub3RTY2hlZHVsZWQsIHNjaGVkdWxpbmcpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpyZXF1aXJlLWludGVybmFsLXdpdGgtdW5kZXJzY29yZVxuICAgICAgICBfdHJhbnNpdGlvblRvKHRvU3RhdGUsIGZyb21TdGF0ZTEsIGZyb21TdGF0ZTIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gZnJvbVN0YXRlMSB8fCB0aGlzLl9zdGF0ZSA9PT0gZnJvbVN0YXRlMikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gdG9TdGF0ZTtcbiAgICAgICAgICAgICAgICBpZiAodG9TdGF0ZSA9PSBub3RTY2hlZHVsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fem9uZURlbGVnYXRlcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMudHlwZX0gJyR7dGhpcy5zb3VyY2V9JzogY2FuIG5vdCB0cmFuc2l0aW9uIHRvICcke3RvU3RhdGV9JywgZXhwZWN0aW5nIHN0YXRlICcke2Zyb21TdGF0ZTF9JyR7ZnJvbVN0YXRlMiA/IFwiIG9yICdcIiArIGZyb21TdGF0ZTIgKyBcIidcIiA6ICcnfSwgd2FzICcke3RoaXMuX3N0YXRlfScuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdG9TdHJpbmcoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhICYmIHR5cGVvZiB0aGlzLmRhdGEuaGFuZGxlSWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5oYW5kbGVJZC50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBhZGQgdG9KU09OIG1ldGhvZCB0byBwcmV2ZW50IGN5Y2xpYyBlcnJvciB3aGVuXG4gICAgICAgIC8vIGNhbGwgSlNPTi5zdHJpbmdpZnkoem9uZVRhc2spXG4gICAgICAgIHRvSlNPTigpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgICAgIHN0YXRlOiB0aGlzLnN0YXRlLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICAgICAgem9uZTogdGhpcy56b25lLm5hbWUsXG4gICAgICAgICAgICAgICAgcnVuQ291bnQ6IHRoaXMucnVuQ291bnQsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vLyAgTUlDUk9UQVNLIFFVRVVFXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgY29uc3Qgc3ltYm9sU2V0VGltZW91dCA9IF9fc3ltYm9sX18oJ3NldFRpbWVvdXQnKTtcbiAgICBjb25zdCBzeW1ib2xQcm9taXNlID0gX19zeW1ib2xfXygnUHJvbWlzZScpO1xuICAgIGNvbnN0IHN5bWJvbFRoZW4gPSBfX3N5bWJvbF9fKCd0aGVuJyk7XG4gICAgbGV0IF9taWNyb1Rhc2tRdWV1ZSA9IFtdO1xuICAgIGxldCBfaXNEcmFpbmluZ01pY3JvdGFza1F1ZXVlID0gZmFsc2U7XG4gICAgbGV0IG5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZTtcbiAgICBmdW5jdGlvbiBuYXRpdmVTY2hlZHVsZU1pY3JvVGFzayhmdW5jKSB7XG4gICAgICAgIGlmICghbmF0aXZlTWljcm9UYXNrUXVldWVQcm9taXNlKSB7XG4gICAgICAgICAgICBpZiAoZ2xvYmFsW3N5bWJvbFByb21pc2VdKSB7XG4gICAgICAgICAgICAgICAgbmF0aXZlTWljcm9UYXNrUXVldWVQcm9taXNlID0gZ2xvYmFsW3N5bWJvbFByb21pc2VdLnJlc29sdmUoMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZSkge1xuICAgICAgICAgICAgbGV0IG5hdGl2ZVRoZW4gPSBuYXRpdmVNaWNyb1Rhc2tRdWV1ZVByb21pc2Vbc3ltYm9sVGhlbl07XG4gICAgICAgICAgICBpZiAoIW5hdGl2ZVRoZW4pIHtcbiAgICAgICAgICAgICAgICAvLyBuYXRpdmUgUHJvbWlzZSBpcyBub3QgcGF0Y2hhYmxlLCB3ZSBuZWVkIHRvIHVzZSBgdGhlbmAgZGlyZWN0bHlcbiAgICAgICAgICAgICAgICAvLyBpc3N1ZSAxMDc4XG4gICAgICAgICAgICAgICAgbmF0aXZlVGhlbiA9IG5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZVsndGhlbiddO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmF0aXZlVGhlbi5jYWxsKG5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZSwgZnVuYyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBnbG9iYWxbc3ltYm9sU2V0VGltZW91dF0oZnVuYywgMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gc2NoZWR1bGVNaWNyb1Rhc2sodGFzaykge1xuICAgICAgICAvLyBpZiB3ZSBhcmUgbm90IHJ1bm5pbmcgaW4gYW55IHRhc2ssIGFuZCB0aGVyZSBoYXMgbm90IGJlZW4gYW55dGhpbmcgc2NoZWR1bGVkXG4gICAgICAgIC8vIHdlIG11c3QgYm9vdHN0cmFwIHRoZSBpbml0aWFsIHRhc2sgY3JlYXRpb24gYnkgbWFudWFsbHkgc2NoZWR1bGluZyB0aGUgZHJhaW5cbiAgICAgICAgaWYgKF9udW1iZXJPZk5lc3RlZFRhc2tGcmFtZXMgPT09IDAgJiYgX21pY3JvVGFza1F1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gV2UgYXJlIG5vdCBydW5uaW5nIGluIFRhc2ssIHNvIHdlIG5lZWQgdG8ga2lja3N0YXJ0IHRoZSBtaWNyb3Rhc2sgcXVldWUuXG4gICAgICAgICAgICBuYXRpdmVTY2hlZHVsZU1pY3JvVGFzayhkcmFpbk1pY3JvVGFza1F1ZXVlKTtcbiAgICAgICAgfVxuICAgICAgICB0YXNrICYmIF9taWNyb1Rhc2tRdWV1ZS5wdXNoKHRhc2spO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkcmFpbk1pY3JvVGFza1F1ZXVlKCkge1xuICAgICAgICBpZiAoIV9pc0RyYWluaW5nTWljcm90YXNrUXVldWUpIHtcbiAgICAgICAgICAgIF9pc0RyYWluaW5nTWljcm90YXNrUXVldWUgPSB0cnVlO1xuICAgICAgICAgICAgd2hpbGUgKF9taWNyb1Rhc2tRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBxdWV1ZSA9IF9taWNyb1Rhc2tRdWV1ZTtcbiAgICAgICAgICAgICAgICBfbWljcm9UYXNrUXVldWUgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhc2sgPSBxdWV1ZVtpXTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suem9uZS5ydW5UYXNrKHRhc2ssIG51bGwsIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2FwaS5vblVuaGFuZGxlZEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9hcGkubWljcm90YXNrRHJhaW5Eb25lKCk7XG4gICAgICAgICAgICBfaXNEcmFpbmluZ01pY3JvdGFza1F1ZXVlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8vICBCT09UU1RSQVBcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICBjb25zdCBOT19aT05FID0geyBuYW1lOiAnTk8gWk9ORScgfTtcbiAgICBjb25zdCBub3RTY2hlZHVsZWQgPSAnbm90U2NoZWR1bGVkJywgc2NoZWR1bGluZyA9ICdzY2hlZHVsaW5nJywgc2NoZWR1bGVkID0gJ3NjaGVkdWxlZCcsIHJ1bm5pbmcgPSAncnVubmluZycsIGNhbmNlbGluZyA9ICdjYW5jZWxpbmcnLCB1bmtub3duID0gJ3Vua25vd24nO1xuICAgIGNvbnN0IG1pY3JvVGFzayA9ICdtaWNyb1Rhc2snLCBtYWNyb1Rhc2sgPSAnbWFjcm9UYXNrJywgZXZlbnRUYXNrID0gJ2V2ZW50VGFzayc7XG4gICAgY29uc3QgcGF0Y2hlcyA9IHt9O1xuICAgIGNvbnN0IF9hcGkgPSB7XG4gICAgICAgIHN5bWJvbDogX19zeW1ib2xfXyxcbiAgICAgICAgY3VycmVudFpvbmVGcmFtZTogKCkgPT4gX2N1cnJlbnRab25lRnJhbWUsXG4gICAgICAgIG9uVW5oYW5kbGVkRXJyb3I6IG5vb3AsXG4gICAgICAgIG1pY3JvdGFza0RyYWluRG9uZTogbm9vcCxcbiAgICAgICAgc2NoZWR1bGVNaWNyb1Rhc2s6IHNjaGVkdWxlTWljcm9UYXNrLFxuICAgICAgICBzaG93VW5jYXVnaHRFcnJvcjogKCkgPT4gIVpvbmVJbXBsW19fc3ltYm9sX18oJ2lnbm9yZUNvbnNvbGVFcnJvclVuY2F1Z2h0RXJyb3InKV0sXG4gICAgICAgIHBhdGNoRXZlbnRUYXJnZXQ6ICgpID0+IFtdLFxuICAgICAgICBwYXRjaE9uUHJvcGVydGllczogbm9vcCxcbiAgICAgICAgcGF0Y2hNZXRob2Q6ICgpID0+IG5vb3AsXG4gICAgICAgIGJpbmRBcmd1bWVudHM6ICgpID0+IFtdLFxuICAgICAgICBwYXRjaFRoZW46ICgpID0+IG5vb3AsXG4gICAgICAgIHBhdGNoTWFjcm9UYXNrOiAoKSA9PiBub29wLFxuICAgICAgICBwYXRjaEV2ZW50UHJvdG90eXBlOiAoKSA9PiBub29wLFxuICAgICAgICBpc0lFT3JFZGdlOiAoKSA9PiBmYWxzZSxcbiAgICAgICAgZ2V0R2xvYmFsT2JqZWN0czogKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgICBPYmplY3REZWZpbmVQcm9wZXJ0eTogKCkgPT4gbm9vcCxcbiAgICAgICAgT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAoKSA9PiB1bmRlZmluZWQsXG4gICAgICAgIE9iamVjdENyZWF0ZTogKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgICBBcnJheVNsaWNlOiAoKSA9PiBbXSxcbiAgICAgICAgcGF0Y2hDbGFzczogKCkgPT4gbm9vcCxcbiAgICAgICAgd3JhcFdpdGhDdXJyZW50Wm9uZTogKCkgPT4gbm9vcCxcbiAgICAgICAgZmlsdGVyUHJvcGVydGllczogKCkgPT4gW10sXG4gICAgICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZDogKCkgPT4gbm9vcCxcbiAgICAgICAgX3JlZGVmaW5lUHJvcGVydHk6ICgpID0+IG5vb3AsXG4gICAgICAgIHBhdGNoQ2FsbGJhY2tzOiAoKSA9PiBub29wLFxuICAgICAgICBuYXRpdmVTY2hlZHVsZU1pY3JvVGFzazogbmF0aXZlU2NoZWR1bGVNaWNyb1Rhc2ssXG4gICAgfTtcbiAgICBsZXQgX2N1cnJlbnRab25lRnJhbWUgPSB7IHBhcmVudDogbnVsbCwgem9uZTogbmV3IFpvbmVJbXBsKG51bGwsIG51bGwpIH07XG4gICAgbGV0IF9jdXJyZW50VGFzayA9IG51bGw7XG4gICAgbGV0IF9udW1iZXJPZk5lc3RlZFRhc2tGcmFtZXMgPSAwO1xuICAgIGZ1bmN0aW9uIG5vb3AoKSB7IH1cbiAgICBwZXJmb3JtYW5jZU1lYXN1cmUoJ1pvbmUnLCAnWm9uZScpO1xuICAgIHJldHVybiBab25lSW1wbDtcbn1cblxuZnVuY3Rpb24gbG9hZFpvbmUoKSB7XG4gICAgLy8gaWYgZ2xvYmFsWydab25lJ10gYWxyZWFkeSBleGlzdHMgKG1heWJlIHpvbmUuanMgd2FzIGFscmVhZHkgbG9hZGVkIG9yXG4gICAgLy8gc29tZSBvdGhlciBsaWIgYWxzbyByZWdpc3RlcmVkIGEgZ2xvYmFsIG9iamVjdCBuYW1lZCBab25lKSwgd2UgbWF5IG5lZWRcbiAgICAvLyB0byB0aHJvdyBhbiBlcnJvciwgYnV0IHNvbWV0aW1lcyB1c2VyIG1heSBub3Qgd2FudCB0aGlzIGVycm9yLlxuICAgIC8vIEZvciBleGFtcGxlLFxuICAgIC8vIHdlIGhhdmUgdHdvIHdlYiBwYWdlcywgcGFnZTEgaW5jbHVkZXMgem9uZS5qcywgcGFnZTIgZG9lc24ndC5cbiAgICAvLyBhbmQgdGhlIDFzdCB0aW1lIHVzZXIgbG9hZCBwYWdlMSBhbmQgcGFnZTIsIGV2ZXJ5dGhpbmcgd29yayBmaW5lLFxuICAgIC8vIGJ1dCB3aGVuIHVzZXIgbG9hZCBwYWdlMiBhZ2FpbiwgZXJyb3Igb2NjdXJzIGJlY2F1c2UgZ2xvYmFsWydab25lJ10gYWxyZWFkeSBleGlzdHMuXG4gICAgLy8gc28gd2UgYWRkIGEgZmxhZyB0byBsZXQgdXNlciBjaG9vc2Ugd2hldGhlciB0byB0aHJvdyB0aGlzIGVycm9yIG9yIG5vdC5cbiAgICAvLyBCeSBkZWZhdWx0LCBpZiBleGlzdGluZyBab25lIGlzIGZyb20gem9uZS5qcywgd2Ugd2lsbCBub3QgdGhyb3cgdGhlIGVycm9yLlxuICAgIGNvbnN0IGdsb2JhbCA9IGdsb2JhbFRoaXM7XG4gICAgY29uc3QgY2hlY2tEdXBsaWNhdGUgPSBnbG9iYWxbX19zeW1ib2xfXygnZm9yY2VEdXBsaWNhdGVab25lQ2hlY2snKV0gPT09IHRydWU7XG4gICAgaWYgKGdsb2JhbFsnWm9uZSddICYmIChjaGVja0R1cGxpY2F0ZSB8fCB0eXBlb2YgZ2xvYmFsWydab25lJ10uX19zeW1ib2xfXyAhPT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdab25lIGFscmVhZHkgbG9hZGVkLicpO1xuICAgIH1cbiAgICAvLyBJbml0aWFsaXplIGdsb2JhbCBgWm9uZWAgY29uc3RhbnQuXG4gICAgZ2xvYmFsWydab25lJ10gPz89IGluaXRab25lKCk7XG4gICAgcmV0dXJuIGdsb2JhbFsnWm9uZSddO1xufVxuXG4vKipcbiAqIFN1cHByZXNzIGNsb3N1cmUgY29tcGlsZXIgZXJyb3JzIGFib3V0IHVua25vd24gJ1pvbmUnIHZhcmlhYmxlXG4gKiBAZmlsZW92ZXJ2aWV3XG4gKiBAc3VwcHJlc3Mge3VuZGVmaW5lZFZhcnMsZ2xvYmFsVGhpcyxtaXNzaW5nUmVxdWlyZX1cbiAqL1xuLy8gaXNzdWUgIzk4OSwgdG8gcmVkdWNlIGJ1bmRsZSBzaXplLCB1c2Ugc2hvcnQgbmFtZVxuLyoqIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgKi9cbmNvbnN0IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4vKiogT2JqZWN0LmRlZmluZVByb3BlcnR5ICovXG5jb25zdCBPYmplY3REZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbi8qKiBPYmplY3QuZ2V0UHJvdG90eXBlT2YgKi9cbmNvbnN0IE9iamVjdEdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuLyoqIE9iamVjdC5jcmVhdGUgKi9cbmNvbnN0IE9iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGU7XG4vKiogQXJyYXkucHJvdG90eXBlLnNsaWNlICovXG5jb25zdCBBcnJheVNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuLyoqIGFkZEV2ZW50TGlzdGVuZXIgc3RyaW5nIGNvbnN0ICovXG5jb25zdCBBRERfRVZFTlRfTElTVEVORVJfU1RSID0gJ2FkZEV2ZW50TGlzdGVuZXInO1xuLyoqIHJlbW92ZUV2ZW50TGlzdGVuZXIgc3RyaW5nIGNvbnN0ICovXG5jb25zdCBSRU1PVkVfRVZFTlRfTElTVEVORVJfU1RSID0gJ3JlbW92ZUV2ZW50TGlzdGVuZXInO1xuLyoqIHpvbmVTeW1ib2wgYWRkRXZlbnRMaXN0ZW5lciAqL1xuY29uc3QgWk9ORV9TWU1CT0xfQUREX0VWRU5UX0xJU1RFTkVSID0gX19zeW1ib2xfXyhBRERfRVZFTlRfTElTVEVORVJfU1RSKTtcbi8qKiB6b25lU3ltYm9sIHJlbW92ZUV2ZW50TGlzdGVuZXIgKi9cbmNvbnN0IFpPTkVfU1lNQk9MX1JFTU9WRV9FVkVOVF9MSVNURU5FUiA9IF9fc3ltYm9sX18oUkVNT1ZFX0VWRU5UX0xJU1RFTkVSX1NUUik7XG4vKiogdHJ1ZSBzdHJpbmcgY29uc3QgKi9cbmNvbnN0IFRSVUVfU1RSID0gJ3RydWUnO1xuLyoqIGZhbHNlIHN0cmluZyBjb25zdCAqL1xuY29uc3QgRkFMU0VfU1RSID0gJ2ZhbHNlJztcbi8qKiBab25lIHN5bWJvbCBwcmVmaXggc3RyaW5nIGNvbnN0LiAqL1xuY29uc3QgWk9ORV9TWU1CT0xfUFJFRklYID0gX19zeW1ib2xfXygnJyk7XG5mdW5jdGlvbiB3cmFwV2l0aEN1cnJlbnRab25lKGNhbGxiYWNrLCBzb3VyY2UpIHtcbiAgICByZXR1cm4gWm9uZS5jdXJyZW50LndyYXAoY2FsbGJhY2ssIHNvdXJjZSk7XG59XG5mdW5jdGlvbiBzY2hlZHVsZU1hY3JvVGFza1dpdGhDdXJyZW50Wm9uZShzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgY3VzdG9tQ2FuY2VsKSB7XG4gICAgcmV0dXJuIFpvbmUuY3VycmVudC5zY2hlZHVsZU1hY3JvVGFzayhzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgY3VzdG9tQ2FuY2VsKTtcbn1cbmNvbnN0IHpvbmVTeW1ib2wgPSBfX3N5bWJvbF9fO1xuY29uc3QgaXNXaW5kb3dFeGlzdHMgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJztcbmNvbnN0IGludGVybmFsV2luZG93ID0gaXNXaW5kb3dFeGlzdHMgPyB3aW5kb3cgOiB1bmRlZmluZWQ7XG5jb25zdCBfZ2xvYmFsID0gKGlzV2luZG93RXhpc3RzICYmIGludGVybmFsV2luZG93KSB8fCBnbG9iYWxUaGlzO1xuY29uc3QgUkVNT1ZFX0FUVFJJQlVURSA9ICdyZW1vdmVBdHRyaWJ1dGUnO1xuZnVuY3Rpb24gYmluZEFyZ3VtZW50cyhhcmdzLCBzb3VyY2UpIHtcbiAgICBmb3IgKGxldCBpID0gYXJncy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBpZiAodHlwZW9mIGFyZ3NbaV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGFyZ3NbaV0gPSB3cmFwV2l0aEN1cnJlbnRab25lKGFyZ3NbaV0sIHNvdXJjZSArICdfJyArIGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xufVxuZnVuY3Rpb24gcGF0Y2hQcm90b3R5cGUocHJvdG90eXBlLCBmbk5hbWVzKSB7XG4gICAgY29uc3Qgc291cmNlID0gcHJvdG90eXBlLmNvbnN0cnVjdG9yWyduYW1lJ107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmbk5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBmbk5hbWVzW2ldO1xuICAgICAgICBjb25zdCBkZWxlZ2F0ZSA9IHByb3RvdHlwZVtuYW1lXTtcbiAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBwcm90b3R5cGVEZXNjID0gT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvdHlwZSwgbmFtZSk7XG4gICAgICAgICAgICBpZiAoIWlzUHJvcGVydHlXcml0YWJsZShwcm90b3R5cGVEZXNjKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJvdG90eXBlW25hbWVdID0gKChkZWxlZ2F0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGNoZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5hcHBseSh0aGlzLCBiaW5kQXJndW1lbnRzKGFyZ3VtZW50cywgc291cmNlICsgJy4nICsgbmFtZSkpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYXR0YWNoT3JpZ2luVG9QYXRjaGVkKHBhdGNoZWQsIGRlbGVnYXRlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF0Y2hlZDtcbiAgICAgICAgICAgIH0pKGRlbGVnYXRlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGlzUHJvcGVydHlXcml0YWJsZShwcm9wZXJ0eURlc2MpIHtcbiAgICBpZiAoIXByb3BlcnR5RGVzYykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHByb3BlcnR5RGVzYy53cml0YWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gISh0eXBlb2YgcHJvcGVydHlEZXNjLmdldCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgcHJvcGVydHlEZXNjLnNldCA9PT0gJ3VuZGVmaW5lZCcpO1xufVxuY29uc3QgaXNXZWJXb3JrZXIgPSB0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT09ICd1bmRlZmluZWQnICYmIHNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZTtcbi8vIE1ha2Ugc3VyZSB0byBhY2Nlc3MgYHByb2Nlc3NgIHRocm91Z2ggYF9nbG9iYWxgIHNvIHRoYXQgV2ViUGFjayBkb2VzIG5vdCBhY2NpZGVudGFsbHkgYnJvd3NlcmlmeVxuLy8gdGhpcyBjb2RlLlxuY29uc3QgaXNOb2RlID0gISgnbncnIGluIF9nbG9iYWwpICYmXG4gICAgdHlwZW9mIF9nbG9iYWwucHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICBfZ2xvYmFsLnByb2Nlc3MudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgcHJvY2Vzc10nO1xuY29uc3QgaXNCcm93c2VyID0gIWlzTm9kZSAmJiAhaXNXZWJXb3JrZXIgJiYgISEoaXNXaW5kb3dFeGlzdHMgJiYgaW50ZXJuYWxXaW5kb3dbJ0hUTUxFbGVtZW50J10pO1xuLy8gd2UgYXJlIGluIGVsZWN0cm9uIG9mIG53LCBzbyB3ZSBhcmUgYm90aCBicm93c2VyIGFuZCBub2RlanNcbi8vIE1ha2Ugc3VyZSB0byBhY2Nlc3MgYHByb2Nlc3NgIHRocm91Z2ggYF9nbG9iYWxgIHNvIHRoYXQgV2ViUGFjayBkb2VzIG5vdCBhY2NpZGVudGFsbHkgYnJvd3NlcmlmeVxuLy8gdGhpcyBjb2RlLlxuY29uc3QgaXNNaXggPSB0eXBlb2YgX2dsb2JhbC5wcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIF9nbG9iYWwucHJvY2Vzcy50b1N0cmluZygpID09PSAnW29iamVjdCBwcm9jZXNzXScgJiZcbiAgICAhaXNXZWJXb3JrZXIgJiZcbiAgICAhIShpc1dpbmRvd0V4aXN0cyAmJiBpbnRlcm5hbFdpbmRvd1snSFRNTEVsZW1lbnQnXSk7XG5jb25zdCB6b25lU3ltYm9sRXZlbnROYW1lcyQxID0ge307XG5jb25zdCBlbmFibGVCZWZvcmV1bmxvYWRTeW1ib2wgPSB6b25lU3ltYm9sKCdlbmFibGVfYmVmb3JldW5sb2FkJyk7XG5jb25zdCB3cmFwRm4gPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy85MTEsIGluIElFLCBzb21ldGltZXNcbiAgICAvLyBldmVudCB3aWxsIGJlIHVuZGVmaW5lZCwgc28gd2UgbmVlZCB0byB1c2Ugd2luZG93LmV2ZW50XG4gICAgZXZlbnQgPSBldmVudCB8fCBfZ2xvYmFsLmV2ZW50O1xuICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgZXZlbnROYW1lU3ltYm9sID0gem9uZVN5bWJvbEV2ZW50TmFtZXMkMVtldmVudC50eXBlXTtcbiAgICBpZiAoIWV2ZW50TmFtZVN5bWJvbCkge1xuICAgICAgICBldmVudE5hbWVTeW1ib2wgPSB6b25lU3ltYm9sRXZlbnROYW1lcyQxW2V2ZW50LnR5cGVdID0gem9uZVN5bWJvbCgnT05fUFJPUEVSVFknICsgZXZlbnQudHlwZSk7XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMgfHwgZXZlbnQudGFyZ2V0IHx8IF9nbG9iYWw7XG4gICAgY29uc3QgbGlzdGVuZXIgPSB0YXJnZXRbZXZlbnROYW1lU3ltYm9sXTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmIChpc0Jyb3dzZXIgJiYgdGFyZ2V0ID09PSBpbnRlcm5hbFdpbmRvdyAmJiBldmVudC50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAgIC8vIHdpbmRvdy5vbmVycm9yIGhhdmUgZGlmZmVyZW50IHNpZ25hdHVyZVxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvR2xvYmFsRXZlbnRIYW5kbGVycy9vbmVycm9yI3dpbmRvdy5vbmVycm9yXG4gICAgICAgIC8vIGFuZCBvbmVycm9yIGNhbGxiYWNrIHdpbGwgcHJldmVudCBkZWZhdWx0IHdoZW4gY2FsbGJhY2sgcmV0dXJuIHRydWVcbiAgICAgICAgY29uc3QgZXJyb3JFdmVudCA9IGV2ZW50O1xuICAgICAgICByZXN1bHQgPVxuICAgICAgICAgICAgbGlzdGVuZXIgJiZcbiAgICAgICAgICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGVycm9yRXZlbnQubWVzc2FnZSwgZXJyb3JFdmVudC5maWxlbmFtZSwgZXJyb3JFdmVudC5saW5lbm8sIGVycm9yRXZlbnQuY29sbm8sIGVycm9yRXZlbnQuZXJyb3IpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBsaXN0ZW5lciAmJiBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICBpZiAoXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzQ3NTc5XG4gICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDExL1dELWh0bWw1LTIwMTEwNTI1L2hpc3RvcnkuaHRtbCNiZWZvcmV1bmxvYWRldmVudFxuICAgICAgICAvLyBUaGlzIGlzIHRoZSBvbmx5IHNwZWNpZmljIGNhc2Ugd2Ugc2hvdWxkIGNoZWNrIGZvci4gVGhlIHNwZWMgZGVmaW5lcyB0aGF0IHRoZVxuICAgICAgICAvLyBgcmV0dXJuVmFsdWVgIGF0dHJpYnV0ZSByZXByZXNlbnRzIHRoZSBtZXNzYWdlIHRvIHNob3cgdGhlIHVzZXIuIFdoZW4gdGhlIGV2ZW50XG4gICAgICAgIC8vIGlzIGNyZWF0ZWQsIHRoaXMgYXR0cmlidXRlIG11c3QgYmUgc2V0IHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gICAgICAgIGV2ZW50LnR5cGUgPT09ICdiZWZvcmV1bmxvYWQnICYmXG4gICAgICAgICAgICAvLyBUbyBwcmV2ZW50IGFueSBicmVha2luZyBjaGFuZ2VzIHJlc3VsdGluZyBmcm9tIHRoaXMgY2hhbmdlLCBnaXZlbiB0aGF0XG4gICAgICAgICAgICAvLyBpdCB3YXMgYWxyZWFkeSBjYXVzaW5nIGEgc2lnbmlmaWNhbnQgbnVtYmVyIG9mIGZhaWx1cmVzIGluIEczLCB3ZSBoYXZlIGhpZGRlblxuICAgICAgICAgICAgLy8gdGhhdCBiZWhhdmlvciBiZWhpbmQgYSBnbG9iYWwgY29uZmlndXJhdGlvbiBmbGFnLiBDb25zdW1lcnMgY2FuIGVuYWJsZSB0aGlzXG4gICAgICAgICAgICAvLyBmbGFnIGV4cGxpY2l0bHkgaWYgdGhleSB3YW50IHRoZSBgYmVmb3JldW5sb2FkYCBldmVudCB0byBiZSBoYW5kbGVkIGFzIGRlZmluZWRcbiAgICAgICAgICAgIC8vIGluIHRoZSBzcGVjaWZpY2F0aW9uLlxuICAgICAgICAgICAgX2dsb2JhbFtlbmFibGVCZWZvcmV1bmxvYWRTeW1ib2xdICYmXG4gICAgICAgICAgICAvLyBUaGUgSURMIGV2ZW50IGRlZmluaXRpb24gaXMgYGF0dHJpYnV0ZSBET01TdHJpbmcgcmV0dXJuVmFsdWVgLCBzbyB3ZSBjaGVjayB3aGV0aGVyXG4gICAgICAgICAgICAvLyBgdHlwZW9mIHJlc3VsdGAgaXMgYSBzdHJpbmcuXG4gICAgICAgICAgICB0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVzdWx0ICE9IHVuZGVmaW5lZCAmJiAhcmVzdWx0KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuZnVuY3Rpb24gcGF0Y2hQcm9wZXJ0eShvYmosIHByb3AsIHByb3RvdHlwZSkge1xuICAgIGxldCBkZXNjID0gT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgcHJvcCk7XG4gICAgaWYgKCFkZXNjICYmIHByb3RvdHlwZSkge1xuICAgICAgICAvLyB3aGVuIHBhdGNoIHdpbmRvdyBvYmplY3QsIHVzZSBwcm90b3R5cGUgdG8gY2hlY2sgcHJvcCBleGlzdCBvciBub3RcbiAgICAgICAgY29uc3QgcHJvdG90eXBlRGVzYyA9IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90b3R5cGUsIHByb3ApO1xuICAgICAgICBpZiAocHJvdG90eXBlRGVzYykge1xuICAgICAgICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gaWYgdGhlIGRlc2NyaXB0b3Igbm90IGV4aXN0cyBvciBpcyBub3QgY29uZmlndXJhYmxlXG4gICAgLy8ganVzdCByZXR1cm5cbiAgICBpZiAoIWRlc2MgfHwgIWRlc2MuY29uZmlndXJhYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb25Qcm9wUGF0Y2hlZFN5bWJvbCA9IHpvbmVTeW1ib2woJ29uJyArIHByb3AgKyAncGF0Y2hlZCcpO1xuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkob25Qcm9wUGF0Y2hlZFN5bWJvbCkgJiYgb2JqW29uUHJvcFBhdGNoZWRTeW1ib2xdKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGNhbm5vdCBoYXZlIGdldHRlci9zZXR0ZXIgYW5kIGJlIHdyaXRhYmxlXG4gICAgLy8gZGVsZXRpbmcgdGhlIHdyaXRhYmxlIGFuZCB2YWx1ZSBwcm9wZXJ0aWVzIGF2b2lkcyB0aGlzIGVycm9yOlxuICAgIC8vXG4gICAgLy8gVHlwZUVycm9yOiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBtdXN0IG5vdCBzcGVjaWZ5IGEgdmFsdWUgb3IgYmUgd3JpdGFibGUgd2hlbiBhXG4gICAgLy8gZ2V0dGVyIG9yIHNldHRlciBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICBkZWxldGUgZGVzYy53cml0YWJsZTtcbiAgICBkZWxldGUgZGVzYy52YWx1ZTtcbiAgICBjb25zdCBvcmlnaW5hbERlc2NHZXQgPSBkZXNjLmdldDtcbiAgICBjb25zdCBvcmlnaW5hbERlc2NTZXQgPSBkZXNjLnNldDtcbiAgICAvLyBzbGljZSgyKSBjdXogJ29uY2xpY2snIC0+ICdjbGljaycsIGV0Y1xuICAgIGNvbnN0IGV2ZW50TmFtZSA9IHByb3Auc2xpY2UoMik7XG4gICAgbGV0IGV2ZW50TmFtZVN5bWJvbCA9IHpvbmVTeW1ib2xFdmVudE5hbWVzJDFbZXZlbnROYW1lXTtcbiAgICBpZiAoIWV2ZW50TmFtZVN5bWJvbCkge1xuICAgICAgICBldmVudE5hbWVTeW1ib2wgPSB6b25lU3ltYm9sRXZlbnROYW1lcyQxW2V2ZW50TmFtZV0gPSB6b25lU3ltYm9sKCdPTl9QUk9QRVJUWScgKyBldmVudE5hbWUpO1xuICAgIH1cbiAgICBkZXNjLnNldCA9IGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgICAvLyBpbiBzb21lIG9mIHdpbmRvd3MncyBvbnByb3BlcnR5IGNhbGxiYWNrLCB0aGlzIGlzIHVuZGVmaW5lZFxuICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIGNoZWNrIGl0XG4gICAgICAgIGxldCB0YXJnZXQgPSB0aGlzO1xuICAgICAgICBpZiAoIXRhcmdldCAmJiBvYmogPT09IF9nbG9iYWwpIHtcbiAgICAgICAgICAgIHRhcmdldCA9IF9nbG9iYWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gdGFyZ2V0W2V2ZW50TmFtZVN5bWJvbF07XG4gICAgICAgIGlmICh0eXBlb2YgcHJldmlvdXNWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCB3cmFwRm4pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlzc3VlICM5NzgsIHdoZW4gb25sb2FkIGhhbmRsZXIgd2FzIGFkZGVkIGJlZm9yZSBsb2FkaW5nIHpvbmUuanNcbiAgICAgICAgLy8gd2Ugc2hvdWxkIHJlbW92ZSBpdCB3aXRoIG9yaWdpbmFsRGVzY1NldFxuICAgICAgICBvcmlnaW5hbERlc2NTZXQgJiYgb3JpZ2luYWxEZXNjU2V0LmNhbGwodGFyZ2V0LCBudWxsKTtcbiAgICAgICAgdGFyZ2V0W2V2ZW50TmFtZVN5bWJvbF0gPSBuZXdWYWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCB3cmFwRm4sIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gVGhlIGdldHRlciB3b3VsZCByZXR1cm4gdW5kZWZpbmVkIGZvciB1bmFzc2lnbmVkIHByb3BlcnRpZXMgYnV0IHRoZSBkZWZhdWx0IHZhbHVlIG9mIGFuXG4gICAgLy8gdW5hc3NpZ25lZCBwcm9wZXJ0eSBpcyBudWxsXG4gICAgZGVzYy5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGluIHNvbWUgb2Ygd2luZG93cydzIG9ucHJvcGVydHkgY2FsbGJhY2ssIHRoaXMgaXMgdW5kZWZpbmVkXG4gICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gY2hlY2sgaXRcbiAgICAgICAgbGV0IHRhcmdldCA9IHRoaXM7XG4gICAgICAgIGlmICghdGFyZ2V0ICYmIG9iaiA9PT0gX2dsb2JhbCkge1xuICAgICAgICAgICAgdGFyZ2V0ID0gX2dsb2JhbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGlzdGVuZXIgPSB0YXJnZXRbZXZlbnROYW1lU3ltYm9sXTtcbiAgICAgICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbGlzdGVuZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3JpZ2luYWxEZXNjR2V0KSB7XG4gICAgICAgICAgICAvLyByZXN1bHQgd2lsbCBiZSBudWxsIHdoZW4gdXNlIGlubGluZSBldmVudCBhdHRyaWJ1dGUsXG4gICAgICAgICAgICAvLyBzdWNoIGFzIDxidXR0b24gb25jbGljaz1cImZ1bmMoKTtcIj5PSzwvYnV0dG9uPlxuICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgb25jbGljayBmdW5jdGlvbiBpcyBpbnRlcm5hbCByYXcgdW5jb21waWxlZCBoYW5kbGVyXG4gICAgICAgICAgICAvLyB0aGUgb25jbGljayB3aWxsIGJlIGV2YWx1YXRlZCB3aGVuIGZpcnN0IHRpbWUgZXZlbnQgd2FzIHRyaWdnZXJlZCBvclxuICAgICAgICAgICAgLy8gdGhlIHByb3BlcnR5IGlzIGFjY2Vzc2VkLCBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy81MjVcbiAgICAgICAgICAgIC8vIHNvIHdlIHNob3VsZCB1c2Ugb3JpZ2luYWwgbmF0aXZlIGdldCB0byByZXRyaWV2ZSB0aGUgaGFuZGxlclxuICAgICAgICAgICAgbGV0IHZhbHVlID0gb3JpZ2luYWxEZXNjR2V0LmNhbGwodGhpcyk7XG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBkZXNjLnNldC5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtSRU1PVkVfQVRUUklCVVRFXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKHByb3ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBPYmplY3REZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIGRlc2MpO1xuICAgIG9ialtvblByb3BQYXRjaGVkU3ltYm9sXSA9IHRydWU7XG59XG5mdW5jdGlvbiBwYXRjaE9uUHJvcGVydGllcyhvYmosIHByb3BlcnRpZXMsIHByb3RvdHlwZSkge1xuICAgIGlmIChwcm9wZXJ0aWVzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcGF0Y2hQcm9wZXJ0eShvYmosICdvbicgKyBwcm9wZXJ0aWVzW2ldLCBwcm90b3R5cGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBvblByb3BlcnRpZXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIG9iaikge1xuICAgICAgICAgICAgaWYgKHByb3Auc2xpY2UoMCwgMikgPT0gJ29uJykge1xuICAgICAgICAgICAgICAgIG9uUHJvcGVydGllcy5wdXNoKHByb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgb25Qcm9wZXJ0aWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBwYXRjaFByb3BlcnR5KG9iaiwgb25Qcm9wZXJ0aWVzW2pdLCBwcm90b3R5cGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuY29uc3Qgb3JpZ2luYWxJbnN0YW5jZUtleSA9IHpvbmVTeW1ib2woJ29yaWdpbmFsSW5zdGFuY2UnKTtcbi8vIHdyYXAgc29tZSBuYXRpdmUgQVBJIG9uIGB3aW5kb3dgXG5mdW5jdGlvbiBwYXRjaENsYXNzKGNsYXNzTmFtZSkge1xuICAgIGNvbnN0IE9yaWdpbmFsQ2xhc3MgPSBfZ2xvYmFsW2NsYXNzTmFtZV07XG4gICAgaWYgKCFPcmlnaW5hbENsYXNzKVxuICAgICAgICByZXR1cm47XG4gICAgLy8ga2VlcCBvcmlnaW5hbCBjbGFzcyBpbiBnbG9iYWxcbiAgICBfZ2xvYmFsW3pvbmVTeW1ib2woY2xhc3NOYW1lKV0gPSBPcmlnaW5hbENsYXNzO1xuICAgIF9nbG9iYWxbY2xhc3NOYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYSA9IGJpbmRBcmd1bWVudHMoYXJndW1lbnRzLCBjbGFzc05hbWUpO1xuICAgICAgICBzd2l0Y2ggKGEubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XSA9IG5ldyBPcmlnaW5hbENsYXNzKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XSA9IG5ldyBPcmlnaW5hbENsYXNzKGFbMF0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV0gPSBuZXcgT3JpZ2luYWxDbGFzcyhhWzBdLCBhWzFdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICB0aGlzW29yaWdpbmFsSW5zdGFuY2VLZXldID0gbmV3IE9yaWdpbmFsQ2xhc3MoYVswXSwgYVsxXSwgYVsyXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XSA9IG5ldyBPcmlnaW5hbENsYXNzKGFbMF0sIGFbMV0sIGFbMl0sIGFbM10pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FyZyBsaXN0IHRvbyBsb25nLicpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBhdHRhY2ggb3JpZ2luYWwgZGVsZWdhdGUgdG8gcGF0Y2hlZCBmdW5jdGlvblxuICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChfZ2xvYmFsW2NsYXNzTmFtZV0sIE9yaWdpbmFsQ2xhc3MpO1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IE9yaWdpbmFsQ2xhc3MoZnVuY3Rpb24gKCkgeyB9KTtcbiAgICBsZXQgcHJvcDtcbiAgICBmb3IgKHByb3AgaW4gaW5zdGFuY2UpIHtcbiAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ0NzIxXG4gICAgICAgIGlmIChjbGFzc05hbWUgPT09ICdYTUxIdHRwUmVxdWVzdCcgJiYgcHJvcCA9PT0gJ3Jlc3BvbnNlQmxvYicpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlW3Byb3BdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgX2dsb2JhbFtjbGFzc05hbWVdLnByb3RvdHlwZVtwcm9wXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV1bcHJvcF0uYXBwbHkodGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XSwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0RGVmaW5lUHJvcGVydHkoX2dsb2JhbFtjbGFzc05hbWVdLnByb3RvdHlwZSwgcHJvcCwge1xuICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV1bcHJvcF0gPSB3cmFwV2l0aEN1cnJlbnRab25lKGZuLCBjbGFzc05hbWUgKyAnLicgKyBwcm9wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIGNhbGxiYWNrIGluIHdyYXBwZWQgZnVuY3Rpb24gc28gd2UgY2FuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGl0IGluIEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyB0byByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbmF0aXZlIG9uZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQodGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XVtwcm9wXSwgZm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XVtwcm9wXSA9IGZuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW29yaWdpbmFsSW5zdGFuY2VLZXldW3Byb3BdO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KShwcm9wKTtcbiAgICB9XG4gICAgZm9yIChwcm9wIGluIE9yaWdpbmFsQ2xhc3MpIHtcbiAgICAgICAgaWYgKHByb3AgIT09ICdwcm90b3R5cGUnICYmIE9yaWdpbmFsQ2xhc3MuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgIF9nbG9iYWxbY2xhc3NOYW1lXVtwcm9wXSA9IE9yaWdpbmFsQ2xhc3NbcHJvcF07XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBwYXRjaE1ldGhvZCh0YXJnZXQsIG5hbWUsIHBhdGNoRm4pIHtcbiAgICBsZXQgcHJvdG8gPSB0YXJnZXQ7XG4gICAgd2hpbGUgKHByb3RvICYmICFwcm90by5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICBwcm90byA9IE9iamVjdEdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICB9XG4gICAgaWYgKCFwcm90byAmJiB0YXJnZXRbbmFtZV0pIHtcbiAgICAgICAgLy8gc29tZWhvdyB3ZSBkaWQgbm90IGZpbmQgaXQsIGJ1dCB3ZSBjYW4gc2VlIGl0LiBUaGlzIGhhcHBlbnMgb24gSUUgZm9yIFdpbmRvdyBwcm9wZXJ0aWVzLlxuICAgICAgICBwcm90byA9IHRhcmdldDtcbiAgICB9XG4gICAgY29uc3QgZGVsZWdhdGVOYW1lID0gem9uZVN5bWJvbChuYW1lKTtcbiAgICBsZXQgZGVsZWdhdGUgPSBudWxsO1xuICAgIGlmIChwcm90byAmJiAoIShkZWxlZ2F0ZSA9IHByb3RvW2RlbGVnYXRlTmFtZV0pIHx8ICFwcm90by5oYXNPd25Qcm9wZXJ0eShkZWxlZ2F0ZU5hbWUpKSkge1xuICAgICAgICBkZWxlZ2F0ZSA9IHByb3RvW2RlbGVnYXRlTmFtZV0gPSBwcm90b1tuYW1lXTtcbiAgICAgICAgLy8gY2hlY2sgd2hldGhlciBwcm90b1tuYW1lXSBpcyB3cml0YWJsZVxuICAgICAgICAvLyBzb21lIHByb3BlcnR5IGlzIHJlYWRvbmx5IGluIHNhZmFyaSwgc3VjaCBhcyBIdG1sQ2FudmFzRWxlbWVudC5wcm90b3R5cGUudG9CbG9iXG4gICAgICAgIGNvbnN0IGRlc2MgPSBwcm90byAmJiBPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIG5hbWUpO1xuICAgICAgICBpZiAoaXNQcm9wZXJ0eVdyaXRhYmxlKGRlc2MpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXRjaERlbGVnYXRlID0gcGF0Y2hGbihkZWxlZ2F0ZSwgZGVsZWdhdGVOYW1lLCBuYW1lKTtcbiAgICAgICAgICAgIHByb3RvW25hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXRjaERlbGVnYXRlKHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXR0YWNoT3JpZ2luVG9QYXRjaGVkKHByb3RvW25hbWVdLCBkZWxlZ2F0ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlbGVnYXRlO1xufVxuLy8gVE9ETzogQEppYUxpUGFzc2lvbiwgc3VwcG9ydCBjYW5jZWwgdGFzayBsYXRlciBpZiBuZWNlc3NhcnlcbmZ1bmN0aW9uIHBhdGNoTWFjcm9UYXNrKG9iaiwgZnVuY05hbWUsIG1ldGFDcmVhdG9yKSB7XG4gICAgbGV0IHNldE5hdGl2ZSA9IG51bGw7XG4gICAgZnVuY3Rpb24gc2NoZWR1bGVUYXNrKHRhc2spIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRhc2suZGF0YTtcbiAgICAgICAgZGF0YS5hcmdzW2RhdGEuY2JJZHhdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGFzay5pbnZva2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgICAgc2V0TmF0aXZlLmFwcGx5KGRhdGEudGFyZ2V0LCBkYXRhLmFyZ3MpO1xuICAgICAgICByZXR1cm4gdGFzaztcbiAgICB9XG4gICAgc2V0TmF0aXZlID0gcGF0Y2hNZXRob2Qob2JqLCBmdW5jTmFtZSwgKGRlbGVnYXRlKSA9PiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuICAgICAgICBjb25zdCBtZXRhID0gbWV0YUNyZWF0b3Ioc2VsZiwgYXJncyk7XG4gICAgICAgIGlmIChtZXRhLmNiSWR4ID49IDAgJiYgdHlwZW9mIGFyZ3NbbWV0YS5jYklkeF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBzY2hlZHVsZU1hY3JvVGFza1dpdGhDdXJyZW50Wm9uZShtZXRhLm5hbWUsIGFyZ3NbbWV0YS5jYklkeF0sIG1ldGEsIHNjaGVkdWxlVGFzayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBjYXVzZSBhbiBlcnJvciBieSBjYWxsaW5nIGl0IGRpcmVjdGx5LlxuICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQocGF0Y2hlZCwgb3JpZ2luYWwpIHtcbiAgICBwYXRjaGVkW3pvbmVTeW1ib2woJ09yaWdpbmFsRGVsZWdhdGUnKV0gPSBvcmlnaW5hbDtcbn1cbmxldCBpc0RldGVjdGVkSUVPckVkZ2UgPSBmYWxzZTtcbmxldCBpZU9yRWRnZSA9IGZhbHNlO1xuZnVuY3Rpb24gaXNJRSgpIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCB1YSA9IGludGVybmFsV2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7XG4gICAgICAgIGlmICh1YS5pbmRleE9mKCdNU0lFICcpICE9PSAtMSB8fCB1YS5pbmRleE9mKCdUcmlkZW50LycpICE9PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7IH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc0lFT3JFZGdlKCkge1xuICAgIGlmIChpc0RldGVjdGVkSUVPckVkZ2UpIHtcbiAgICAgICAgcmV0dXJuIGllT3JFZGdlO1xuICAgIH1cbiAgICBpc0RldGVjdGVkSUVPckVkZ2UgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVhID0gaW50ZXJuYWxXaW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDtcbiAgICAgICAgaWYgKHVhLmluZGV4T2YoJ01TSUUgJykgIT09IC0xIHx8IHVhLmluZGV4T2YoJ1RyaWRlbnQvJykgIT09IC0xIHx8IHVhLmluZGV4T2YoJ0VkZ2UvJykgIT09IC0xKSB7XG4gICAgICAgICAgICBpZU9yRWRnZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7IH1cbiAgICByZXR1cm4gaWVPckVkZ2U7XG59XG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG59XG5cbi8qKlxuICogQGZpbGVvdmVydmlld1xuICogQHN1cHByZXNzIHttaXNzaW5nUmVxdWlyZX1cbiAqL1xuLy8gTm90ZSB0aGF0IHBhc3NpdmUgZXZlbnQgbGlzdGVuZXJzIGFyZSBub3cgc3VwcG9ydGVkIGJ5IG1vc3QgbW9kZXJuIGJyb3dzZXJzLFxuLy8gaW5jbHVkaW5nIENocm9tZSwgRmlyZWZveCwgU2FmYXJpLCBhbmQgRWRnZS4gVGhlcmUncyBhIHBlbmRpbmcgY2hhbmdlIHRoYXRcbi8vIHdvdWxkIHJlbW92ZSBzdXBwb3J0IGZvciBsZWdhY3kgYnJvd3NlcnMgYnkgem9uZS5qcy4gUmVtb3ZpbmcgYHBhc3NpdmVTdXBwb3J0ZWRgXG4vLyBmcm9tIHRoZSBjb2RlYmFzZSB3aWxsIHJlZHVjZSB0aGUgZmluYWwgY29kZSBzaXplIGZvciBleGlzdGluZyBhcHBzIHRoYXQgc3RpbGwgdXNlIHpvbmUuanMuXG5sZXQgcGFzc2l2ZVN1cHBvcnRlZCA9IGZhbHNlO1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3Bhc3NpdmUnLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBwYXNzaXZlU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBOb3RlOiBXZSBwYXNzIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGFzIHRoZSBldmVudCBoYW5kbGVyIHRvby4gVGhpcyBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZVxuICAgICAgICAvLyBzaWduYXR1cmUgb2YgYGFkZEV2ZW50TGlzdGVuZXJgIG9yIGByZW1vdmVFdmVudExpc3RlbmVyYCBidXQgZW5hYmxlcyB1cyB0byByZW1vdmUgdGhlIGhhbmRsZXJcbiAgICAgICAgLy8gd2l0aG91dCBhbiBhY3R1YWwgaGFuZGxlci5cbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBwYXNzaXZlU3VwcG9ydGVkID0gZmFsc2U7XG4gICAgfVxufVxuLy8gYW4gaWRlbnRpZmllciB0byB0ZWxsIFpvbmVUYXNrIGRvIG5vdCBjcmVhdGUgYSBuZXcgaW52b2tlIGNsb3N1cmVcbmNvbnN0IE9QVElNSVpFRF9aT05FX0VWRU5UX1RBU0tfREFUQSA9IHtcbiAgICB1c2VHOiB0cnVlLFxufTtcbmNvbnN0IHpvbmVTeW1ib2xFdmVudE5hbWVzID0ge307XG5jb25zdCBnbG9iYWxTb3VyY2VzID0ge307XG5jb25zdCBFVkVOVF9OQU1FX1NZTUJPTF9SRUdYID0gbmV3IFJlZ0V4cCgnXicgKyBaT05FX1NZTUJPTF9QUkVGSVggKyAnKFxcXFx3KykodHJ1ZXxmYWxzZSkkJyk7XG5jb25zdCBJTU1FRElBVEVfUFJPUEFHQVRJT05fU1lNQk9MID0gem9uZVN5bWJvbCgncHJvcGFnYXRpb25TdG9wcGVkJyk7XG5mdW5jdGlvbiBwcmVwYXJlRXZlbnROYW1lcyhldmVudE5hbWUsIGV2ZW50TmFtZVRvU3RyaW5nKSB7XG4gICAgY29uc3QgZmFsc2VFdmVudE5hbWUgPSAoZXZlbnROYW1lVG9TdHJpbmcgPyBldmVudE5hbWVUb1N0cmluZyhldmVudE5hbWUpIDogZXZlbnROYW1lKSArIEZBTFNFX1NUUjtcbiAgICBjb25zdCB0cnVlRXZlbnROYW1lID0gKGV2ZW50TmFtZVRvU3RyaW5nID8gZXZlbnROYW1lVG9TdHJpbmcoZXZlbnROYW1lKSA6IGV2ZW50TmFtZSkgKyBUUlVFX1NUUjtcbiAgICBjb25zdCBzeW1ib2wgPSBaT05FX1NZTUJPTF9QUkVGSVggKyBmYWxzZUV2ZW50TmFtZTtcbiAgICBjb25zdCBzeW1ib2xDYXB0dXJlID0gWk9ORV9TWU1CT0xfUFJFRklYICsgdHJ1ZUV2ZW50TmFtZTtcbiAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdID0ge307XG4gICAgem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXVtGQUxTRV9TVFJdID0gc3ltYm9sO1xuICAgIHpvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50TmFtZV1bVFJVRV9TVFJdID0gc3ltYm9sQ2FwdHVyZTtcbn1cbmZ1bmN0aW9uIHBhdGNoRXZlbnRUYXJnZXQoX2dsb2JhbCwgYXBpLCBhcGlzLCBwYXRjaE9wdGlvbnMpIHtcbiAgICBjb25zdCBBRERfRVZFTlRfTElTVEVORVIgPSAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5hZGQpIHx8IEFERF9FVkVOVF9MSVNURU5FUl9TVFI7XG4gICAgY29uc3QgUkVNT1ZFX0VWRU5UX0xJU1RFTkVSID0gKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMucm0pIHx8IFJFTU9WRV9FVkVOVF9MSVNURU5FUl9TVFI7XG4gICAgY29uc3QgTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSID0gKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMubGlzdGVuZXJzKSB8fCAnZXZlbnRMaXN0ZW5lcnMnO1xuICAgIGNvbnN0IFJFTU9WRV9BTExfTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSID0gKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMucm1BbGwpIHx8ICdyZW1vdmVBbGxMaXN0ZW5lcnMnO1xuICAgIGNvbnN0IHpvbmVTeW1ib2xBZGRFdmVudExpc3RlbmVyID0gem9uZVN5bWJvbChBRERfRVZFTlRfTElTVEVORVIpO1xuICAgIGNvbnN0IEFERF9FVkVOVF9MSVNURU5FUl9TT1VSQ0UgPSAnLicgKyBBRERfRVZFTlRfTElTVEVORVIgKyAnOic7XG4gICAgY29uc3QgUFJFUEVORF9FVkVOVF9MSVNURU5FUiA9ICdwcmVwZW5kTGlzdGVuZXInO1xuICAgIGNvbnN0IFBSRVBFTkRfRVZFTlRfTElTVEVORVJfU09VUkNFID0gJy4nICsgUFJFUEVORF9FVkVOVF9MSVNURU5FUiArICc6JztcbiAgICBjb25zdCBpbnZva2VUYXNrID0gZnVuY3Rpb24gKHRhc2ssIHRhcmdldCwgZXZlbnQpIHtcbiAgICAgICAgLy8gZm9yIGJldHRlciBwZXJmb3JtYW5jZSwgY2hlY2sgaXNSZW1vdmVkIHdoaWNoIGlzIHNldFxuICAgICAgICAvLyBieSByZW1vdmVFdmVudExpc3RlbmVyXG4gICAgICAgIGlmICh0YXNrLmlzUmVtb3ZlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlbGVnYXRlID0gdGFzay5jYWxsYmFjaztcbiAgICAgICAgaWYgKHR5cGVvZiBkZWxlZ2F0ZSA9PT0gJ29iamVjdCcgJiYgZGVsZWdhdGUuaGFuZGxlRXZlbnQpIHtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgYmluZCB2ZXJzaW9uIG9mIGhhbmRsZUV2ZW50IHdoZW4gaW52b2tlXG4gICAgICAgICAgICB0YXNrLmNhbGxiYWNrID0gKGV2ZW50KSA9PiBkZWxlZ2F0ZS5oYW5kbGVFdmVudChldmVudCk7XG4gICAgICAgICAgICB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgPSBkZWxlZ2F0ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbnZva2Ugc3RhdGljIHRhc2suaW52b2tlXG4gICAgICAgIC8vIG5lZWQgdG8gdHJ5L2NhdGNoIGVycm9yIGhlcmUsIG90aGVyd2lzZSwgdGhlIGVycm9yIGluIG9uZSBldmVudCBsaXN0ZW5lclxuICAgICAgICAvLyB3aWxsIGJyZWFrIHRoZSBleGVjdXRpb25zIG9mIHRoZSBvdGhlciBldmVudCBsaXN0ZW5lcnMuIEFsc28gZXJyb3Igd2lsbFxuICAgICAgICAvLyBub3QgcmVtb3ZlIHRoZSBldmVudCBsaXN0ZW5lciB3aGVuIGBvbmNlYCBvcHRpb25zIGlzIHRydWUuXG4gICAgICAgIGxldCBlcnJvcjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRhc2suaW52b2tlKHRhc2ssIHRhcmdldCwgW2V2ZW50XSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRhc2sub3B0aW9ucztcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMub25jZSkge1xuICAgICAgICAgICAgLy8gaWYgb3B0aW9ucy5vbmNlIGlzIHRydWUsIGFmdGVyIGludm9rZSBvbmNlIHJlbW92ZSBsaXN0ZW5lciBoZXJlXG4gICAgICAgICAgICAvLyBvbmx5IGJyb3dzZXIgbmVlZCB0byBkbyB0aGlzLCBub2RlanMgZXZlbnRFbWl0dGVyIHdpbGwgY2FsIHJlbW92ZUxpc3RlbmVyXG4gICAgICAgICAgICAvLyBpbnNpZGUgRXZlbnRFbWl0dGVyLm9uY2VcbiAgICAgICAgICAgIGNvbnN0IGRlbGVnYXRlID0gdGFzay5vcmlnaW5hbERlbGVnYXRlID8gdGFzay5vcmlnaW5hbERlbGVnYXRlIDogdGFzay5jYWxsYmFjaztcbiAgICAgICAgICAgIHRhcmdldFtSRU1PVkVfRVZFTlRfTElTVEVORVJdLmNhbGwodGFyZ2V0LCBldmVudC50eXBlLCBkZWxlZ2F0ZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH07XG4gICAgZnVuY3Rpb24gZ2xvYmFsQ2FsbGJhY2soY29udGV4dCwgZXZlbnQsIGlzQ2FwdHVyZSkge1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy85MTEsIGluIElFLCBzb21ldGltZXNcbiAgICAgICAgLy8gZXZlbnQgd2lsbCBiZSB1bmRlZmluZWQsIHNvIHdlIG5lZWQgdG8gdXNlIHdpbmRvdy5ldmVudFxuICAgICAgICBldmVudCA9IGV2ZW50IHx8IF9nbG9iYWwuZXZlbnQ7XG4gICAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBldmVudC50YXJnZXQgaXMgbmVlZGVkIGZvciBTYW1zdW5nIFRWIGFuZCBTb3VyY2VCdWZmZXJcbiAgICAgICAgLy8gfHwgZ2xvYmFsIGlzIG5lZWRlZCBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy8xOTBcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gY29udGV4dCB8fCBldmVudC50YXJnZXQgfHwgX2dsb2JhbDtcbiAgICAgICAgY29uc3QgdGFza3MgPSB0YXJnZXRbem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnQudHlwZV1baXNDYXB0dXJlID8gVFJVRV9TVFIgOiBGQUxTRV9TVFJdXTtcbiAgICAgICAgaWYgKHRhc2tzKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICAgICAgICAgIC8vIGludm9rZSBhbGwgdGFza3Mgd2hpY2ggYXR0YWNoZWQgdG8gY3VycmVudCB0YXJnZXQgd2l0aCBnaXZlbiBldmVudC50eXBlIGFuZCBjYXB0dXJlID0gZmFsc2VcbiAgICAgICAgICAgIC8vIGZvciBwZXJmb3JtYW5jZSBjb25jZXJuLCBpZiB0YXNrLmxlbmd0aCA9PT0gMSwganVzdCBpbnZva2VcbiAgICAgICAgICAgIGlmICh0YXNrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBpbnZva2VUYXNrKHRhc2tzWzBdLCB0YXJnZXQsIGV2ZW50KTtcbiAgICAgICAgICAgICAgICBlcnIgJiYgZXJyb3JzLnB1c2goZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3pvbmUuanMvaXNzdWVzLzgzNlxuICAgICAgICAgICAgICAgIC8vIGNvcHkgdGhlIHRhc2tzIGFycmF5IGJlZm9yZSBpbnZva2UsIHRvIGF2b2lkXG4gICAgICAgICAgICAgICAgLy8gdGhlIGNhbGxiYWNrIHdpbGwgcmVtb3ZlIGl0c2VsZiBvciBvdGhlciBsaXN0ZW5lclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvcHlUYXNrcyA9IHRhc2tzLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3B5VGFza3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50W0lNTUVESUFURV9QUk9QQUdBVElPTl9TWU1CT0xdID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBpbnZva2VUYXNrKGNvcHlUYXNrc1tpXSwgdGFyZ2V0LCBldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGVyciAmJiBlcnJvcnMucHVzaChlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNpbmNlIHRoZXJlIGlzIG9ubHkgb25lIGVycm9yLCB3ZSBkb24ndCBuZWVkIHRvIHNjaGVkdWxlIG1pY3JvVGFza1xuICAgICAgICAgICAgLy8gdG8gdGhyb3cgdGhlIGVycm9yLlxuICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcnNbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBlcnJvcnNbaV07XG4gICAgICAgICAgICAgICAgICAgIGFwaS5uYXRpdmVTY2hlZHVsZU1pY3JvVGFzaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBnbG9iYWwgc2hhcmVkIHpvbmVBd2FyZUNhbGxiYWNrIHRvIGhhbmRsZSBhbGwgZXZlbnQgY2FsbGJhY2sgd2l0aCBjYXB0dXJlID0gZmFsc2VcbiAgICBjb25zdCBnbG9iYWxab25lQXdhcmVDYWxsYmFjayA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICByZXR1cm4gZ2xvYmFsQ2FsbGJhY2sodGhpcywgZXZlbnQsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8vIGdsb2JhbCBzaGFyZWQgem9uZUF3YXJlQ2FsbGJhY2sgdG8gaGFuZGxlIGFsbCBldmVudCBjYWxsYmFjayB3aXRoIGNhcHR1cmUgPSB0cnVlXG4gICAgY29uc3QgZ2xvYmFsWm9uZUF3YXJlQ2FwdHVyZUNhbGxiYWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBnbG9iYWxDYWxsYmFjayh0aGlzLCBldmVudCwgdHJ1ZSk7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBwYXRjaEV2ZW50VGFyZ2V0TWV0aG9kcyhvYmosIHBhdGNoT3B0aW9ucykge1xuICAgICAgICBpZiAoIW9iaikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCB1c2VHbG9iYWxDYWxsYmFjayA9IHRydWU7XG4gICAgICAgIGlmIChwYXRjaE9wdGlvbnMgJiYgcGF0Y2hPcHRpb25zLnVzZUcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdXNlR2xvYmFsQ2FsbGJhY2sgPSBwYXRjaE9wdGlvbnMudXNlRztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWxpZGF0ZUhhbmRsZXIgPSBwYXRjaE9wdGlvbnMgJiYgcGF0Y2hPcHRpb25zLnZoO1xuICAgICAgICBsZXQgY2hlY2tEdXBsaWNhdGUgPSB0cnVlO1xuICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5jaGtEdXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2hlY2tEdXBsaWNhdGUgPSBwYXRjaE9wdGlvbnMuY2hrRHVwO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXR1cm5UYXJnZXQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMucnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuVGFyZ2V0ID0gcGF0Y2hPcHRpb25zLnJ0O1xuICAgICAgICB9XG4gICAgICAgIGxldCBwcm90byA9IG9iajtcbiAgICAgICAgd2hpbGUgKHByb3RvICYmICFwcm90by5oYXNPd25Qcm9wZXJ0eShBRERfRVZFTlRfTElTVEVORVIpKSB7XG4gICAgICAgICAgICBwcm90byA9IE9iamVjdEdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXByb3RvICYmIG9ialtBRERfRVZFTlRfTElTVEVORVJdKSB7XG4gICAgICAgICAgICAvLyBzb21laG93IHdlIGRpZCBub3QgZmluZCBpdCwgYnV0IHdlIGNhbiBzZWUgaXQuIFRoaXMgaGFwcGVucyBvbiBJRSBmb3IgV2luZG93IHByb3BlcnRpZXMuXG4gICAgICAgICAgICBwcm90byA9IG9iajtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXByb3RvKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3RvW3pvbmVTeW1ib2xBZGRFdmVudExpc3RlbmVyXSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50TmFtZVRvU3RyaW5nID0gcGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5ldmVudE5hbWVUb1N0cmluZztcbiAgICAgICAgLy8gV2UgdXNlIGEgc2hhcmVkIGdsb2JhbCBgdGFza0RhdGFgIHRvIHBhc3MgZGF0YSBmb3IgYHNjaGVkdWxlRXZlbnRUYXNrYCxcbiAgICAgICAgLy8gZWxpbWluYXRpbmcgdGhlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IG9iamVjdCBzb2xlbHkgZm9yIHBhc3NpbmcgZGF0YS5cbiAgICAgICAgLy8gV0FSTklORzogVGhpcyBvYmplY3QgaGFzIGEgc3RhdGljIGxpZmV0aW1lLCBtZWFuaW5nIGl0IGlzIG5vdCBjcmVhdGVkXG4gICAgICAgIC8vIGVhY2ggdGltZSBgYWRkRXZlbnRMaXN0ZW5lcmAgaXMgY2FsbGVkLiBJdCBpcyBpbnN0YW50aWF0ZWQgb25seSBvbmNlXG4gICAgICAgIC8vIGFuZCBjYXB0dXJlZCBieSByZWZlcmVuY2UgaW5zaWRlIHRoZSBgYWRkRXZlbnRMaXN0ZW5lcmAgYW5kXG4gICAgICAgIC8vIGByZW1vdmVFdmVudExpc3RlbmVyYCBmdW5jdGlvbnMuIERvIG5vdCBhZGQgYW55IG5ldyBwcm9wZXJ0aWVzIHRvIHRoaXNcbiAgICAgICAgLy8gb2JqZWN0LCBhcyBkb2luZyBzbyB3b3VsZCBuZWNlc3NpdGF0ZSBtYWludGFpbmluZyB0aGUgaW5mb3JtYXRpb25cbiAgICAgICAgLy8gYmV0d2VlbiBgYWRkRXZlbnRMaXN0ZW5lcmAgY2FsbHMuXG4gICAgICAgIGNvbnN0IHRhc2tEYXRhID0ge307XG4gICAgICAgIGNvbnN0IG5hdGl2ZUFkZEV2ZW50TGlzdGVuZXIgPSAocHJvdG9bem9uZVN5bWJvbEFkZEV2ZW50TGlzdGVuZXJdID0gcHJvdG9bQUREX0VWRU5UX0xJU1RFTkVSXSk7XG4gICAgICAgIGNvbnN0IG5hdGl2ZVJlbW92ZUV2ZW50TGlzdGVuZXIgPSAocHJvdG9bem9uZVN5bWJvbChSRU1PVkVfRVZFTlRfTElTVEVORVIpXSA9XG4gICAgICAgICAgICBwcm90b1tSRU1PVkVfRVZFTlRfTElTVEVORVJdKTtcbiAgICAgICAgY29uc3QgbmF0aXZlTGlzdGVuZXJzID0gKHByb3RvW3pvbmVTeW1ib2woTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSKV0gPVxuICAgICAgICAgICAgcHJvdG9bTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSXSk7XG4gICAgICAgIGNvbnN0IG5hdGl2ZVJlbW92ZUFsbExpc3RlbmVycyA9IChwcm90b1t6b25lU3ltYm9sKFJFTU9WRV9BTExfTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSKV0gPVxuICAgICAgICAgICAgcHJvdG9bUkVNT1ZFX0FMTF9MSVNURU5FUlNfRVZFTlRfTElTVEVORVJdKTtcbiAgICAgICAgbGV0IG5hdGl2ZVByZXBlbmRFdmVudExpc3RlbmVyO1xuICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5wcmVwZW5kKSB7XG4gICAgICAgICAgICBuYXRpdmVQcmVwZW5kRXZlbnRMaXN0ZW5lciA9IHByb3RvW3pvbmVTeW1ib2wocGF0Y2hPcHRpb25zLnByZXBlbmQpXSA9XG4gICAgICAgICAgICAgICAgcHJvdG9bcGF0Y2hPcHRpb25zLnByZXBlbmRdO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIHV0aWwgZnVuY3Rpb24gd2lsbCBidWlsZCBhbiBvcHRpb24gb2JqZWN0IHdpdGggcGFzc2l2ZSBvcHRpb25cbiAgICAgICAgICogdG8gaGFuZGxlIGFsbCBwb3NzaWJsZSBpbnB1dCBmcm9tIHRoZSB1c2VyLlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gYnVpbGRFdmVudExpc3RlbmVyT3B0aW9ucyhvcHRpb25zLCBwYXNzaXZlKSB7XG4gICAgICAgICAgICBpZiAoIXBhc3NpdmVTdXBwb3J0ZWQgJiYgdHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAvLyBkb2Vzbid0IHN1cHBvcnQgcGFzc2l2ZSBidXQgdXNlciB3YW50IHRvIHBhc3MgYW4gb2JqZWN0IGFzIG9wdGlvbnMuXG4gICAgICAgICAgICAgICAgLy8gdGhpcyB3aWxsIG5vdCB3b3JrIG9uIHNvbWUgb2xkIGJyb3dzZXIsIHNvIHdlIGp1c3QgcGFzcyBhIGJvb2xlYW5cbiAgICAgICAgICAgICAgICAvLyBhcyB1c2VDYXB0dXJlIHBhcmFtZXRlclxuICAgICAgICAgICAgICAgIHJldHVybiAhIW9wdGlvbnMuY2FwdHVyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGFzc2l2ZVN1cHBvcnRlZCB8fCAhcGFzc2l2ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBjYXB0dXJlOiBvcHRpb25zLCBwYXNzaXZlOiB0cnVlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBwYXNzaXZlOiB0cnVlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMucGFzc2l2ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5vcHRpb25zLCBwYXNzaXZlOiB0cnVlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXN0b21TY2hlZHVsZUdsb2JhbCA9IGZ1bmN0aW9uICh0YXNrKSB7XG4gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgdGFzayBmb3IgdGhlIGV2ZW50TmFtZSArIGNhcHR1cmUsXG4gICAgICAgICAgICAvLyBqdXN0IHJldHVybiwgYmVjYXVzZSB3ZSB1c2UgdGhlIHNoYXJlZCBnbG9iYWxab25lQXdhcmVDYWxsYmFjayBoZXJlLlxuICAgICAgICAgICAgaWYgKHRhc2tEYXRhLmlzRXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmF0aXZlQWRkRXZlbnRMaXN0ZW5lci5jYWxsKHRhc2tEYXRhLnRhcmdldCwgdGFza0RhdGEuZXZlbnROYW1lLCB0YXNrRGF0YS5jYXB0dXJlID8gZ2xvYmFsWm9uZUF3YXJlQ2FwdHVyZUNhbGxiYWNrIDogZ2xvYmFsWm9uZUF3YXJlQ2FsbGJhY2ssIHRhc2tEYXRhLm9wdGlvbnMpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogSW4gdGhlIGNvbnRleHQgb2YgZXZlbnRzIGFuZCBsaXN0ZW5lcnMsIHRoaXMgZnVuY3Rpb24gd2lsbCBiZVxuICAgICAgICAgKiBjYWxsZWQgYXQgdGhlIGVuZCBieSBgY2FuY2VsVGFza2AsIHdoaWNoLCBpbiB0dXJuLCBjYWxscyBgdGFzay5jYW5jZWxGbmAuXG4gICAgICAgICAqIENhbmNlbGxpbmcgYSB0YXNrIGlzIHByaW1hcmlseSB1c2VkIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgZnJvbVxuICAgICAgICAgKiB0aGUgdGFzayB0YXJnZXQuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBjdXN0b21DYW5jZWxHbG9iYWwgPSBmdW5jdGlvbiAodGFzaykge1xuICAgICAgICAgICAgLy8gaWYgdGFzayBpcyBub3QgbWFya2VkIGFzIGlzUmVtb3ZlZCwgdGhpcyBjYWxsIGlzIGRpcmVjdGx5XG4gICAgICAgICAgICAvLyBmcm9tIFpvbmUucHJvdG90eXBlLmNhbmNlbFRhc2ssIHdlIHNob3VsZCByZW1vdmUgdGhlIHRhc2tcbiAgICAgICAgICAgIC8vIGZyb20gdGFza3NMaXN0IG9mIHRhcmdldCBmaXJzdFxuICAgICAgICAgICAgaWYgKCF0YXNrLmlzUmVtb3ZlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN5bWJvbEV2ZW50TmFtZXMgPSB6b25lU3ltYm9sRXZlbnROYW1lc1t0YXNrLmV2ZW50TmFtZV07XG4gICAgICAgICAgICAgICAgbGV0IHN5bWJvbEV2ZW50TmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoc3ltYm9sRXZlbnROYW1lcykge1xuICAgICAgICAgICAgICAgICAgICBzeW1ib2xFdmVudE5hbWUgPSBzeW1ib2xFdmVudE5hbWVzW3Rhc2suY2FwdHVyZSA/IFRSVUVfU1RSIDogRkFMU0VfU1RSXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdUYXNrcyA9IHN5bWJvbEV2ZW50TmFtZSAmJiB0YXNrLnRhcmdldFtzeW1ib2xFdmVudE5hbWVdO1xuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1Rhc2tzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhpc3RpbmdUYXNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdUYXNrID0gZXhpc3RpbmdUYXNrc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1Rhc2sgPT09IHRhc2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgaXNSZW1vdmVkIHRvIGRhdGEgZm9yIGZhc3RlciBpbnZva2VUYXNrIGNoZWNrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5pc1JlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXNrLnJlbW92ZUFib3J0TGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5yZW1vdmVBYm9ydExpc3RlbmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sucmVtb3ZlQWJvcnRMaXN0ZW5lciA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1Rhc2tzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgdGFza3MgZm9yIHRoZSBldmVudE5hbWUgKyBjYXB0dXJlIGhhdmUgZ29uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGdsb2JhbFpvbmVBd2FyZUNhbGxiYWNrIGFuZCByZW1vdmUgdGhlIHRhc2sgY2FjaGUgZnJvbSB0YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5hbGxSZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay50YXJnZXRbc3ltYm9sRXZlbnROYW1lXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgYWxsIHRhc2tzIGZvciB0aGUgZXZlbnROYW1lICsgY2FwdHVyZSBoYXZlIGdvbmUsXG4gICAgICAgICAgICAvLyB3ZSB3aWxsIHJlYWxseSByZW1vdmUgdGhlIGdsb2JhbCBldmVudCBjYWxsYmFjayxcbiAgICAgICAgICAgIC8vIGlmIG5vdCwgcmV0dXJuXG4gICAgICAgICAgICBpZiAoIXRhc2suYWxsUmVtb3ZlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyLmNhbGwodGFzay50YXJnZXQsIHRhc2suZXZlbnROYW1lLCB0YXNrLmNhcHR1cmUgPyBnbG9iYWxab25lQXdhcmVDYXB0dXJlQ2FsbGJhY2sgOiBnbG9iYWxab25lQXdhcmVDYWxsYmFjaywgdGFzay5vcHRpb25zKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY3VzdG9tU2NoZWR1bGVOb25HbG9iYWwgPSBmdW5jdGlvbiAodGFzaykge1xuICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZUFkZEV2ZW50TGlzdGVuZXIuY2FsbCh0YXNrRGF0YS50YXJnZXQsIHRhc2tEYXRhLmV2ZW50TmFtZSwgdGFzay5pbnZva2UsIHRhc2tEYXRhLm9wdGlvbnMpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBjdXN0b21TY2hlZHVsZVByZXBlbmQgPSBmdW5jdGlvbiAodGFzaykge1xuICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZVByZXBlbmRFdmVudExpc3RlbmVyLmNhbGwodGFza0RhdGEudGFyZ2V0LCB0YXNrRGF0YS5ldmVudE5hbWUsIHRhc2suaW52b2tlLCB0YXNrRGF0YS5vcHRpb25zKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY3VzdG9tQ2FuY2VsTm9uR2xvYmFsID0gZnVuY3Rpb24gKHRhc2spIHtcbiAgICAgICAgICAgIHJldHVybiBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyLmNhbGwodGFzay50YXJnZXQsIHRhc2suZXZlbnROYW1lLCB0YXNrLmludm9rZSwgdGFzay5vcHRpb25zKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY3VzdG9tU2NoZWR1bGUgPSB1c2VHbG9iYWxDYWxsYmFjayA/IGN1c3RvbVNjaGVkdWxlR2xvYmFsIDogY3VzdG9tU2NoZWR1bGVOb25HbG9iYWw7XG4gICAgICAgIGNvbnN0IGN1c3RvbUNhbmNlbCA9IHVzZUdsb2JhbENhbGxiYWNrID8gY3VzdG9tQ2FuY2VsR2xvYmFsIDogY3VzdG9tQ2FuY2VsTm9uR2xvYmFsO1xuICAgICAgICBjb25zdCBjb21wYXJlVGFza0NhbGxiYWNrVnNEZWxlZ2F0ZSA9IGZ1bmN0aW9uICh0YXNrLCBkZWxlZ2F0ZSkge1xuICAgICAgICAgICAgY29uc3QgdHlwZU9mRGVsZWdhdGUgPSB0eXBlb2YgZGVsZWdhdGU7XG4gICAgICAgICAgICByZXR1cm4gKCh0eXBlT2ZEZWxlZ2F0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0YXNrLmNhbGxiYWNrID09PSBkZWxlZ2F0ZSkgfHxcbiAgICAgICAgICAgICAgICAodHlwZU9mRGVsZWdhdGUgPT09ICdvYmplY3QnICYmIHRhc2sub3JpZ2luYWxEZWxlZ2F0ZSA9PT0gZGVsZWdhdGUpKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY29tcGFyZSA9IHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMuZGlmZiA/IHBhdGNoT3B0aW9ucy5kaWZmIDogY29tcGFyZVRhc2tDYWxsYmFja1ZzRGVsZWdhdGU7XG4gICAgICAgIGNvbnN0IHVucGF0Y2hlZEV2ZW50cyA9IFpvbmVbem9uZVN5bWJvbCgnVU5QQVRDSEVEX0VWRU5UUycpXTtcbiAgICAgICAgY29uc3QgcGFzc2l2ZUV2ZW50cyA9IF9nbG9iYWxbem9uZVN5bWJvbCgnUEFTU0lWRV9FVkVOVFMnKV07XG4gICAgICAgIGZ1bmN0aW9uIGNvcHlFdmVudExpc3RlbmVyT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGRlc3RydWN0dXJlIHRoZSB0YXJnZXQgYG9wdGlvbnNgIG9iamVjdCBzaW5jZSBpdCBtYXlcbiAgICAgICAgICAgICAgICAvLyBiZSBmcm96ZW4gb3Igc2VhbGVkIChwb3NzaWJseSBwcm92aWRlZCBpbXBsaWNpdGx5IGJ5IGEgdGhpcmQtcGFydHlcbiAgICAgICAgICAgICAgICAvLyBsaWJyYXJ5KSwgb3IgaXRzIHByb3BlcnRpZXMgbWF5IGJlIHJlYWRvbmx5LlxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld09wdGlvbnMgPSB7IC4uLm9wdGlvbnMgfTtcbiAgICAgICAgICAgICAgICAvLyBUaGUgYHNpZ25hbGAgb3B0aW9uIHdhcyByZWNlbnRseSBpbnRyb2R1Y2VkLCB3aGljaCBjYXVzZWQgcmVncmVzc2lvbnMgaW5cbiAgICAgICAgICAgICAgICAvLyB0aGlyZC1wYXJ0eSBzY2VuYXJpb3Mgd2hlcmUgYEFib3J0Q29udHJvbGxlcmAgd2FzIGRpcmVjdGx5IHByb3ZpZGVkIHRvXG4gICAgICAgICAgICAgICAgLy8gYGFkZEV2ZW50TGlzdGVuZXJgIGFzIG9wdGlvbnMuIEZvciBpbnN0YW5jZSwgaW4gY2FzZXMgbGlrZVxuICAgICAgICAgICAgICAgIC8vIGBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgY2FsbGJhY2ssIGFib3J0Q29udHJvbGxlckluc3RhbmNlKWAsXG4gICAgICAgICAgICAgICAgLy8gd2hpY2ggaXMgdmFsaWQgYmVjYXVzZSBgQWJvcnRDb250cm9sbGVyYCBpbmNsdWRlcyBhIGBzaWduYWxgIGdldHRlciwgc3ByZWFkaW5nXG4gICAgICAgICAgICAgICAgLy8gYHsuLi5vcHRpb25zfWAgd291bGRuJ3QgY29weSB0aGUgYHNpZ25hbGAuIEFkZGl0aW9uYWxseSwgdXNpbmcgYE9iamVjdC5jcmVhdGVgXG4gICAgICAgICAgICAgICAgLy8gaXNuJ3QgZmVhc2libGUgc2luY2UgYEFib3J0Q29udHJvbGxlcmAgaXMgYSBidWlsdC1pbiBvYmplY3QgdHlwZSwgYW5kIGF0dGVtcHRpbmdcbiAgICAgICAgICAgICAgICAvLyB0byBjcmVhdGUgYSBuZXcgb2JqZWN0IGRpcmVjdGx5IHdpdGggaXQgYXMgdGhlIHByb3RvdHlwZSBtaWdodCByZXN1bHQgaW5cbiAgICAgICAgICAgICAgICAvLyB1bmV4cGVjdGVkIGJlaGF2aW9yLlxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnNpZ25hbCkge1xuICAgICAgICAgICAgICAgICAgICBuZXdPcHRpb25zLnNpZ25hbCA9IG9wdGlvbnMuc2lnbmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3T3B0aW9ucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ha2VBZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIChuYXRpdmVMaXN0ZW5lciwgYWRkU291cmNlLCBjdXN0b21TY2hlZHVsZUZuLCBjdXN0b21DYW5jZWxGbiwgcmV0dXJuVGFyZ2V0ID0gZmFsc2UsIHByZXBlbmQgPSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzIHx8IF9nbG9iYWw7XG4gICAgICAgICAgICAgICAgbGV0IGV2ZW50TmFtZSA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBldmVudE5hbWUgPSBwYXRjaE9wdGlvbnMudHJhbnNmZXJFdmVudE5hbWUoZXZlbnROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGRlbGVnYXRlID0gYXJndW1lbnRzWzFdO1xuICAgICAgICAgICAgICAgIGlmICghZGVsZWdhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZUxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpc05vZGUgJiYgZXZlbnROYW1lID09PSAndW5jYXVnaHRFeGNlcHRpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHBhdGNoIHVuY2F1Z2h0RXhjZXB0aW9uIG9mIG5vZGVqcyB0byBwcmV2ZW50IGVuZGxlc3MgbG9vcFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF0aXZlTGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZG9uJ3QgY3JlYXRlIHRoZSBiaW5kIGRlbGVnYXRlIGZ1bmN0aW9uIGZvciBoYW5kbGVFdmVudFxuICAgICAgICAgICAgICAgIC8vIGNhc2UgaGVyZSB0byBpbXByb3ZlIGFkZEV2ZW50TGlzdGVuZXIgcGVyZm9ybWFuY2VcbiAgICAgICAgICAgICAgICAvLyB3ZSB3aWxsIGNyZWF0ZSB0aGUgYmluZCBkZWxlZ2F0ZSB3aGVuIGludm9rZVxuICAgICAgICAgICAgICAgIGxldCBpc0hhbmRsZUV2ZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZWxlZ2F0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRlbGVnYXRlLmhhbmRsZUV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF0aXZlTGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpc0hhbmRsZUV2ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlSGFuZGxlciAmJiAhdmFsaWRhdGVIYW5kbGVyKG5hdGl2ZUxpc3RlbmVyLCBkZWxlZ2F0ZSwgdGFyZ2V0LCBhcmd1bWVudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFzc2l2ZSA9IHBhc3NpdmVTdXBwb3J0ZWQgJiYgISFwYXNzaXZlRXZlbnRzICYmIHBhc3NpdmVFdmVudHMuaW5kZXhPZihldmVudE5hbWUpICE9PSAtMTtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gY29weUV2ZW50TGlzdGVuZXJPcHRpb25zKGJ1aWxkRXZlbnRMaXN0ZW5lck9wdGlvbnMoYXJndW1lbnRzWzJdLCBwYXNzaXZlKSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgICAgICAgICAgICAgIGlmIChzaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNpZ25hbCBpcyBhbiBhYm9ydGVkIG9uZSwganVzdCByZXR1cm4gd2l0aG91dCBhdHRhY2hpbmcgdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh1bnBhdGNoZWRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdW5wYXRjaGVkIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bnBhdGNoZWRFdmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudE5hbWUgPT09IHVucGF0Y2hlZEV2ZW50c1tpXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzaXZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVMaXN0ZW5lci5jYWxsKHRhcmdldCwgZXZlbnROYW1lLCBkZWxlZ2F0ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF0aXZlTGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY2FwdHVyZSA9ICFvcHRpb25zID8gZmFsc2UgOiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Jvb2xlYW4nID8gdHJ1ZSA6IG9wdGlvbnMuY2FwdHVyZTtcbiAgICAgICAgICAgICAgICBjb25zdCBvbmNlID0gb3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgPyBvcHRpb25zLm9uY2UgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCB6b25lID0gWm9uZS5jdXJyZW50O1xuICAgICAgICAgICAgICAgIGxldCBzeW1ib2xFdmVudE5hbWVzID0gem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoIXN5bWJvbEV2ZW50TmFtZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJlcGFyZUV2ZW50TmFtZXMoZXZlbnROYW1lLCBldmVudE5hbWVUb1N0cmluZyk7XG4gICAgICAgICAgICAgICAgICAgIHN5bWJvbEV2ZW50TmFtZXMgPSB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBzeW1ib2xFdmVudE5hbWUgPSBzeW1ib2xFdmVudE5hbWVzW2NhcHR1cmUgPyBUUlVFX1NUUiA6IEZBTFNFX1NUUl07XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0aW5nVGFza3MgPSB0YXJnZXRbc3ltYm9sRXZlbnROYW1lXTtcbiAgICAgICAgICAgICAgICBsZXQgaXNFeGlzdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1Rhc2tzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaGF2ZSB0YXNrIHJlZ2lzdGVyZWRcbiAgICAgICAgICAgICAgICAgICAgaXNFeGlzdGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGlzdGluZ1Rhc2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmUoZXhpc3RpbmdUYXNrc1tpXSwgZGVsZWdhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgY2FsbGJhY2ssIHNhbWUgY2FwdHVyZSwgc2FtZSBldmVudCBuYW1lLCBqdXN0IHJldHVyblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2tzID0gdGFyZ2V0W3N5bWJvbEV2ZW50TmFtZV0gPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHNvdXJjZTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3Rvck5hbWUgPSB0YXJnZXQuY29uc3RydWN0b3JbJ25hbWUnXTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRTb3VyY2UgPSBnbG9iYWxTb3VyY2VzW2NvbnN0cnVjdG9yTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldFNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSB0YXJnZXRTb3VyY2VbZXZlbnROYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yTmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkU291cmNlICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnROYW1lVG9TdHJpbmcgPyBldmVudE5hbWVUb1N0cmluZyhldmVudE5hbWUpIDogZXZlbnROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNvZGUgYmVsb3csIGBvcHRpb25zYCBzaG91bGQgbm8gbG9uZ2VyIGJlIHJlYXNzaWduZWQ7IGluc3RlYWQsIGl0XG4gICAgICAgICAgICAgICAgLy8gc2hvdWxkIG9ubHkgYmUgbXV0YXRlZC4gVGhpcyBpcyBiZWNhdXNlIHdlIHBhc3MgdGhhdCBvYmplY3QgdG8gdGhlIG5hdGl2ZVxuICAgICAgICAgICAgICAgIC8vIGBhZGRFdmVudExpc3RlbmVyYC5cbiAgICAgICAgICAgICAgICAvLyBJdCdzIGdlbmVyYWxseSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIHNhbWUgb2JqZWN0IHJlZmVyZW5jZSBmb3Igb3B0aW9ucy5cbiAgICAgICAgICAgICAgICAvLyBUaGlzIGVuc3VyZXMgY29uc2lzdGVuY3kgYW5kIGF2b2lkcyBwb3RlbnRpYWwgaXNzdWVzLlxuICAgICAgICAgICAgICAgIHRhc2tEYXRhLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgIGlmIChvbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYGFkZEV2ZW50TGlzdGVuZXJgIHdpdGggdGhlIGBvbmNlYCBvcHRpb24sIHdlIGRvbid0IHBhc3NcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGBvbmNlYCBvcHRpb24gZGlyZWN0bHkgdG8gdGhlIG5hdGl2ZSBgYWRkRXZlbnRMaXN0ZW5lcmAgbWV0aG9kLlxuICAgICAgICAgICAgICAgICAgICAvLyBJbnN0ZWFkLCB3ZSBrZWVwIHRoZSBgb25jZWAgc2V0dGluZyBhbmQgaGFuZGxlIGl0IG91cnNlbHZlcy5cbiAgICAgICAgICAgICAgICAgICAgdGFza0RhdGEub3B0aW9ucy5vbmNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRhc2tEYXRhLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgICAgICAgICB0YXNrRGF0YS5jYXB0dXJlID0gY2FwdHVyZTtcbiAgICAgICAgICAgICAgICB0YXNrRGF0YS5ldmVudE5hbWUgPSBldmVudE5hbWU7XG4gICAgICAgICAgICAgICAgdGFza0RhdGEuaXNFeGlzdGluZyA9IGlzRXhpc3Rpbmc7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHVzZUdsb2JhbENhbGxiYWNrID8gT1BUSU1JWkVEX1pPTkVfRVZFTlRfVEFTS19EQVRBIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIC8vIGtlZXAgdGFza0RhdGEgaW50byBkYXRhIHRvIGFsbG93IG9uU2NoZWR1bGVFdmVudFRhc2sgdG8gYWNjZXNzIHRoZSB0YXNrIGluZm9ybWF0aW9uXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS50YXNrRGF0YSA9IHRhc2tEYXRhO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2lnbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYGFkZEV2ZW50TGlzdGVuZXJgIHdpdGggdGhlIGBzaWduYWxgIG9wdGlvbiwgd2UgZG9uJ3QgcGFzc1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYHNpZ25hbGAgb3B0aW9uIGRpcmVjdGx5IHRvIHRoZSBuYXRpdmUgYGFkZEV2ZW50TGlzdGVuZXJgIG1ldGhvZC5cbiAgICAgICAgICAgICAgICAgICAgLy8gSW5zdGVhZCwgd2Uga2VlcCB0aGUgYHNpZ25hbGAgc2V0dGluZyBhbmQgaGFuZGxlIGl0IG91cnNlbHZlcy5cbiAgICAgICAgICAgICAgICAgICAgdGFza0RhdGEub3B0aW9ucy5zaWduYWwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRoZSBgc2NoZWR1bGVFdmVudFRhc2tgIGZ1bmN0aW9uIHdpbGwgdWx0aW1hdGVseSBjYWxsIGBjdXN0b21TY2hlZHVsZUdsb2JhbGAsXG4gICAgICAgICAgICAgICAgLy8gd2hpY2ggaW4gdHVybiBjYWxscyB0aGUgbmF0aXZlIGBhZGRFdmVudExpc3RlbmVyYC4gVGhpcyBpcyB3aHkgYHRhc2tEYXRhLm9wdGlvbnNgXG4gICAgICAgICAgICAgICAgLy8gaXMgdXBkYXRlZCBiZWZvcmUgc2NoZWR1bGluZyB0aGUgdGFzaywgYXMgYGN1c3RvbVNjaGVkdWxlR2xvYmFsYCB1c2VzXG4gICAgICAgICAgICAgICAgLy8gYHRhc2tEYXRhLm9wdGlvbnNgIHRvIHBhc3MgaXQgdG8gdGhlIG5hdGl2ZSBgYWRkRXZlbnRMaXN0ZW5lcmAuXG4gICAgICAgICAgICAgICAgY29uc3QgdGFzayA9IHpvbmUuc2NoZWR1bGVFdmVudFRhc2soc291cmNlLCBkZWxlZ2F0ZSwgZGF0YSwgY3VzdG9tU2NoZWR1bGVGbiwgY3VzdG9tQ2FuY2VsRm4pO1xuICAgICAgICAgICAgICAgIGlmIChzaWduYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgdGFzayBpcyBzY2hlZHVsZWQsIHdlIG5lZWQgdG8gc3RvcmUgdGhlIHNpZ25hbCBiYWNrIHRvIHRhc2sub3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICB0YXNrRGF0YS5vcHRpb25zLnNpZ25hbCA9IHNpZ25hbDtcbiAgICAgICAgICAgICAgICAgICAgLy8gV3JhcHBpbmcgYHRhc2tgIGluIGEgd2VhayByZWZlcmVuY2Ugd291bGQgbm90IHByZXZlbnQgbWVtb3J5IGxlYWtzLiBXZWFrIHJlZmVyZW5jZXMgYXJlXG4gICAgICAgICAgICAgICAgICAgIC8vIHByaW1hcmlseSB1c2VkIGZvciBwcmV2ZW50aW5nIHN0cm9uZyByZWZlcmVuY2VzIGN5Y2xlcy4gYG9uQWJvcnRgIGlzIGFsd2F5cyByZWFjaGFibGVcbiAgICAgICAgICAgICAgICAgICAgLy8gYXMgaXQncyBhbiBldmVudCBsaXN0ZW5lciwgc28gaXRzIGNsb3N1cmUgcmV0YWlucyBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhlIGB0YXNrYC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb25BYm9ydCA9ICgpID0+IHRhc2suem9uZS5jYW5jZWxUYXNrKHRhc2spO1xuICAgICAgICAgICAgICAgICAgICBuYXRpdmVMaXN0ZW5lci5jYWxsKHNpZ25hbCwgJ2Fib3J0Jywgb25BYm9ydCwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHJlbW92ZSB0aGUgYGFib3J0YCBsaXN0ZW5lciB3aGVuIHRoZSBldmVudCBsaXN0ZW5lciBpcyBnb2luZyB0byBiZSByZW1vdmVkLFxuICAgICAgICAgICAgICAgICAgICAvLyBhcyBpdCBjcmVhdGVzIGEgY2xvc3VyZSB0aGF0IGNhcHR1cmVzIGB0YXNrYC4gVGhpcyBjbG9zdXJlIHJldGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGB0YXNrYCBvYmplY3QgZXZlbiBhZnRlciBpdCBnb2VzIG91dCBvZiBzY29wZSwgcHJldmVudGluZyBgdGFza2AgZnJvbSBiZWluZyBnYXJiYWdlXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbGxlY3RlZC5cbiAgICAgICAgICAgICAgICAgICAgdGFzay5yZW1vdmVBYm9ydExpc3RlbmVyID0gKCkgPT4gc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHNob3VsZCBjbGVhciB0YXNrRGF0YS50YXJnZXQgdG8gYXZvaWQgbWVtb3J5IGxlYWtcbiAgICAgICAgICAgICAgICAvLyBpc3N1ZSwgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMjA0NDJcbiAgICAgICAgICAgICAgICB0YXNrRGF0YS50YXJnZXQgPSBudWxsO1xuICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gY2xlYXIgdXAgdGFza0RhdGEgYmVjYXVzZSBpdCBpcyBhIGdsb2JhbCBvYmplY3RcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLnRhc2tEYXRhID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gaGF2ZSB0byBzYXZlIHRob3NlIGluZm9ybWF0aW9uIHRvIHRhc2sgaW4gY2FzZVxuICAgICAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uIG1heSBjYWxsIHRhc2suem9uZS5jYW5jZWxUYXNrKCkgZGlyZWN0bHlcbiAgICAgICAgICAgICAgICBpZiAob25jZSkge1xuICAgICAgICAgICAgICAgICAgICB0YXNrRGF0YS5vcHRpb25zLm9uY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoISghcGFzc2l2ZVN1cHBvcnRlZCAmJiB0eXBlb2YgdGFzay5vcHRpb25zID09PSAnYm9vbGVhbicpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vdCBzdXBwb3J0IHBhc3NpdmUsIGFuZCB3ZSBwYXNzIGFuIG9wdGlvbiBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgLy8gdG8gYWRkRXZlbnRMaXN0ZW5lciwgd2Ugc2hvdWxkIHNhdmUgdGhlIG9wdGlvbnMgdG8gdGFza1xuICAgICAgICAgICAgICAgICAgICB0YXNrLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0YXNrLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgICAgICAgICB0YXNrLmNhcHR1cmUgPSBjYXB0dXJlO1xuICAgICAgICAgICAgICAgIHRhc2suZXZlbnROYW1lID0gZXZlbnROYW1lO1xuICAgICAgICAgICAgICAgIGlmIChpc0hhbmRsZUV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgb3JpZ2luYWwgZGVsZWdhdGUgZm9yIGNvbXBhcmUgdG8gY2hlY2sgZHVwbGljYXRlXG4gICAgICAgICAgICAgICAgICAgIHRhc2sub3JpZ2luYWxEZWxlZ2F0ZSA9IGRlbGVnYXRlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXByZXBlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdUYXNrcy5wdXNoKHRhc2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdUYXNrcy51bnNoaWZ0KHRhc2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmV0dXJuVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgcHJvdG9bQUREX0VWRU5UX0xJU1RFTkVSXSA9IG1ha2VBZGRMaXN0ZW5lcihuYXRpdmVBZGRFdmVudExpc3RlbmVyLCBBRERfRVZFTlRfTElTVEVORVJfU09VUkNFLCBjdXN0b21TY2hlZHVsZSwgY3VzdG9tQ2FuY2VsLCByZXR1cm5UYXJnZXQpO1xuICAgICAgICBpZiAobmF0aXZlUHJlcGVuZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHByb3RvW1BSRVBFTkRfRVZFTlRfTElTVEVORVJdID0gbWFrZUFkZExpc3RlbmVyKG5hdGl2ZVByZXBlbmRFdmVudExpc3RlbmVyLCBQUkVQRU5EX0VWRU5UX0xJU1RFTkVSX1NPVVJDRSwgY3VzdG9tU2NoZWR1bGVQcmVwZW5kLCBjdXN0b21DYW5jZWwsIHJldHVyblRhcmdldCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcHJvdG9bUkVNT1ZFX0VWRU5UX0xJU1RFTkVSXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMgfHwgX2dsb2JhbDtcbiAgICAgICAgICAgIGxldCBldmVudE5hbWUgPSBhcmd1bWVudHNbMF07XG4gICAgICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZSkge1xuICAgICAgICAgICAgICAgIGV2ZW50TmFtZSA9IHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZShldmVudE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGFyZ3VtZW50c1syXTtcbiAgICAgICAgICAgIGNvbnN0IGNhcHR1cmUgPSAhb3B0aW9ucyA/IGZhbHNlIDogdHlwZW9mIG9wdGlvbnMgPT09ICdib29sZWFuJyA/IHRydWUgOiBvcHRpb25zLmNhcHR1cmU7XG4gICAgICAgICAgICBjb25zdCBkZWxlZ2F0ZSA9IGFyZ3VtZW50c1sxXTtcbiAgICAgICAgICAgIGlmICghZGVsZWdhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmF0aXZlUmVtb3ZlRXZlbnRMaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbGlkYXRlSGFuZGxlciAmJlxuICAgICAgICAgICAgICAgICF2YWxpZGF0ZUhhbmRsZXIobmF0aXZlUmVtb3ZlRXZlbnRMaXN0ZW5lciwgZGVsZWdhdGUsIHRhcmdldCwgYXJndW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEV2ZW50TmFtZXMgPSB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdO1xuICAgICAgICAgICAgbGV0IHN5bWJvbEV2ZW50TmFtZTtcbiAgICAgICAgICAgIGlmIChzeW1ib2xFdmVudE5hbWVzKSB7XG4gICAgICAgICAgICAgICAgc3ltYm9sRXZlbnROYW1lID0gc3ltYm9sRXZlbnROYW1lc1tjYXB0dXJlID8gVFJVRV9TVFIgOiBGQUxTRV9TVFJdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdUYXNrcyA9IHN5bWJvbEV2ZW50TmFtZSAmJiB0YXJnZXRbc3ltYm9sRXZlbnROYW1lXTtcbiAgICAgICAgICAgIC8vIGBleGlzdGluZ1Rhc2tzYCBtYXkgbm90IGV4aXN0IGlmIHRoZSBgYWRkRXZlbnRMaXN0ZW5lcmAgd2FzIGNhbGxlZCBiZWZvcmVcbiAgICAgICAgICAgIC8vIGl0IHdhcyBwYXRjaGVkIGJ5IHpvbmUuanMuIFBsZWFzZSByZWZlciB0byB0aGUgYXR0YWNoZWQgaXNzdWUgZm9yXG4gICAgICAgICAgICAvLyBjbGFyaWZpY2F0aW9uLCBwYXJ0aWN1bGFybHkgYWZ0ZXIgdGhlIGBpZmAgY29uZGl0aW9uLCBiZWZvcmUgY2FsbGluZ1xuICAgICAgICAgICAgLy8gdGhlIG5hdGl2ZSBgcmVtb3ZlRXZlbnRMaXN0ZW5lcmAuXG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdUYXNrcykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhpc3RpbmdUYXNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1Rhc2sgPSBleGlzdGluZ1Rhc2tzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGFyZShleGlzdGluZ1Rhc2ssIGRlbGVnYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdUYXNrcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgaXNSZW1vdmVkIHRvIGRhdGEgZm9yIGZhc3RlciBpbnZva2VUYXNrIGNoZWNrXG4gICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2suaXNSZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1Rhc2tzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCB0YXNrcyBmb3IgdGhlIGV2ZW50TmFtZSArIGNhcHR1cmUgaGF2ZSBnb25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBnbG9iYWxab25lQXdhcmVDYWxsYmFjayBhbmQgcmVtb3ZlIHRoZSB0YXNrIGNhY2hlIGZyb20gdGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdUYXNrLmFsbFJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtzeW1ib2xFdmVudE5hbWVdID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgdGFyZ2V0LCB3ZSBoYXZlIGFuIGV2ZW50IGxpc3RlbmVyIHdoaWNoIGlzIGFkZGVkIGJ5IG9uX3Byb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VjaCBhcyB0YXJnZXQub25jbGljayA9IGZ1bmN0aW9uKCkge30sIHNvIHdlIG5lZWQgdG8gY2xlYXIgdGhpcyBpbnRlcm5hbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IHRvbyBpZiBhbGwgZGVsZWdhdGVzIHdpdGggY2FwdHVyZT1mYWxzZSB3ZXJlIHJlbW92ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovLyBnaXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMzE2NDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy81NDU4MVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FwdHVyZSAmJiB0eXBlb2YgZXZlbnROYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvblByb3BlcnR5U3ltYm9sID0gWk9ORV9TWU1CT0xfUFJFRklYICsgJ09OX1BST1BFUlRZJyArIGV2ZW50TmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W29uUHJvcGVydHlTeW1ib2xdID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBhbGwgb3RoZXIgY29uZGl0aW9ucywgd2hlbiBgYWRkRXZlbnRMaXN0ZW5lcmAgaXMgY2FsbGVkIGFmdGVyIGJlaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXRjaGVkIGJ5IHpvbmUuanMsIHdlIHdvdWxkIGFsd2F5cyBmaW5kIGFuIGV2ZW50IHRhc2sgb24gdGhlIGBFdmVudFRhcmdldGAuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgdHJpZ2dlciBgY2FuY2VsRm5gIG9uIHRoZSBgZXhpc3RpbmdUYXNrYCwgbGVhZGluZyB0byBgY3VzdG9tQ2FuY2VsR2xvYmFsYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIHVsdGltYXRlbHkgcmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBhbmQgY2xlYW5zIHVwIHRoZSBhYm9ydCBsaXN0ZW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGlmIGFuIGBBYm9ydFNpZ25hbGAgd2FzIHByb3ZpZGVkIHdoZW4gc2NoZWR1bGluZyBhIHRhc2spLlxuICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdUYXNrLnpvbmUuY2FuY2VsVGFzayhleGlzdGluZ1Rhc2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy85MzBcbiAgICAgICAgICAgIC8vIFdlIG1heSBlbmNvdW50ZXIgYSBzaXR1YXRpb24gd2hlcmUgdGhlIGBhZGRFdmVudExpc3RlbmVyYCB3YXNcbiAgICAgICAgICAgIC8vIGNhbGxlZCBvbiB0aGUgZXZlbnQgdGFyZ2V0IGJlZm9yZSB6b25lLmpzIGlzIGxvYWRlZCwgcmVzdWx0aW5nXG4gICAgICAgICAgICAvLyBpbiBubyB0YXNrIGJlaW5nIHN0b3JlZCBvbiB0aGUgZXZlbnQgdGFyZ2V0IGR1ZSB0byBpdHMgaW52b2NhdGlvblxuICAgICAgICAgICAgLy8gb2YgdGhlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbi4gSW4gdGhpcyBzY2VuYXJpbywgd2Ugc2ltcGx5IG5lZWQgdG9cbiAgICAgICAgICAgIC8vIGludm9rZSB0aGUgbmF0aXZlIGByZW1vdmVFdmVudExpc3RlbmVyYC5cbiAgICAgICAgICAgIHJldHVybiBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICAgIHByb3RvW0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzIHx8IF9nbG9iYWw7XG4gICAgICAgICAgICBsZXQgZXZlbnROYW1lID0gYXJndW1lbnRzWzBdO1xuICAgICAgICAgICAgaWYgKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMudHJhbnNmZXJFdmVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICBldmVudE5hbWUgPSBwYXRjaE9wdGlvbnMudHJhbnNmZXJFdmVudE5hbWUoZXZlbnROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgdGFza3MgPSBmaW5kRXZlbnRUYXNrcyh0YXJnZXQsIGV2ZW50TmFtZVRvU3RyaW5nID8gZXZlbnROYW1lVG9TdHJpbmcoZXZlbnROYW1lKSA6IGV2ZW50TmFtZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhc2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFzayA9IHRhc2tzW2ldO1xuICAgICAgICAgICAgICAgIGxldCBkZWxlZ2F0ZSA9IHRhc2sub3JpZ2luYWxEZWxlZ2F0ZSA/IHRhc2sub3JpZ2luYWxEZWxlZ2F0ZSA6IHRhc2suY2FsbGJhY2s7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzLnB1c2goZGVsZWdhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGxpc3RlbmVycztcbiAgICAgICAgfTtcbiAgICAgICAgcHJvdG9bUkVNT1ZFX0FMTF9MSVNURU5FUlNfRVZFTlRfTElTVEVORVJdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcyB8fCBfZ2xvYmFsO1xuICAgICAgICAgICAgbGV0IGV2ZW50TmFtZSA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgICAgIGlmICghZXZlbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRhcmdldCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3AgPSBrZXlzW2ldO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IEVWRU5UX05BTUVfU1lNQk9MX1JFR1guZXhlYyhwcm9wKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGV2dE5hbWUgPSBtYXRjaCAmJiBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaW4gbm9kZWpzIEV2ZW50RW1pdHRlciwgcmVtb3ZlTGlzdGVuZXIgZXZlbnQgaXNcbiAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCBmb3IgbW9uaXRvcmluZyB0aGUgcmVtb3ZlTGlzdGVuZXIgY2FsbCxcbiAgICAgICAgICAgICAgICAgICAgLy8gc28ganVzdCBrZWVwIHJlbW92ZUxpc3RlbmVyIGV2ZW50TGlzdGVuZXIgdW50aWxcbiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIG90aGVyIGV2ZW50TGlzdGVuZXJzIGFyZSByZW1vdmVkXG4gICAgICAgICAgICAgICAgICAgIGlmIChldnROYW1lICYmIGV2dE5hbWUgIT09ICdyZW1vdmVMaXN0ZW5lcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbUkVNT1ZFX0FMTF9MSVNURU5FUlNfRVZFTlRfTElTVEVORVJdLmNhbGwodGhpcywgZXZ0TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHJlbW92ZUxpc3RlbmVyIGxpc3RlbmVyIGZpbmFsbHlcbiAgICAgICAgICAgICAgICB0aGlzW1JFTU9WRV9BTExfTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSXS5jYWxsKHRoaXMsICdyZW1vdmVMaXN0ZW5lcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMudHJhbnNmZXJFdmVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lID0gcGF0Y2hPcHRpb25zLnRyYW5zZmVyRXZlbnROYW1lKGV2ZW50TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHN5bWJvbEV2ZW50TmFtZXMgPSB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdO1xuICAgICAgICAgICAgICAgIGlmIChzeW1ib2xFdmVudE5hbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN5bWJvbEV2ZW50TmFtZSA9IHN5bWJvbEV2ZW50TmFtZXNbRkFMU0VfU1RSXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ltYm9sQ2FwdHVyZUV2ZW50TmFtZSA9IHN5bWJvbEV2ZW50TmFtZXNbVFJVRV9TVFJdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXNrcyA9IHRhcmdldFtzeW1ib2xFdmVudE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXB0dXJlVGFza3MgPSB0YXJnZXRbc3ltYm9sQ2FwdHVyZUV2ZW50TmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXNrcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlVGFza3MgPSB0YXNrcy5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZW1vdmVUYXNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhc2sgPSByZW1vdmVUYXNrc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGVsZWdhdGUgPSB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgPyB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgOiB0YXNrLmNhbGxiYWNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbUkVNT1ZFX0VWRU5UX0xJU1RFTkVSXS5jYWxsKHRoaXMsIGV2ZW50TmFtZSwgZGVsZWdhdGUsIHRhc2sub3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhcHR1cmVUYXNrcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlVGFza3MgPSBjYXB0dXJlVGFza3Muc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVtb3ZlVGFza3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXNrID0gcmVtb3ZlVGFza3NbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRlbGVnYXRlID0gdGFzay5vcmlnaW5hbERlbGVnYXRlID8gdGFzay5vcmlnaW5hbERlbGVnYXRlIDogdGFzay5jYWxsYmFjaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW1JFTU9WRV9FVkVOVF9MSVNURU5FUl0uY2FsbCh0aGlzLCBldmVudE5hbWUsIGRlbGVnYXRlLCB0YXNrLm9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJldHVyblRhcmdldCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBmb3IgbmF0aXZlIHRvU3RyaW5nIHBhdGNoXG4gICAgICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChwcm90b1tBRERfRVZFTlRfTElTVEVORVJdLCBuYXRpdmVBZGRFdmVudExpc3RlbmVyKTtcbiAgICAgICAgYXR0YWNoT3JpZ2luVG9QYXRjaGVkKHByb3RvW1JFTU9WRV9FVkVOVF9MSVNURU5FUl0sIG5hdGl2ZVJlbW92ZUV2ZW50TGlzdGVuZXIpO1xuICAgICAgICBpZiAobmF0aXZlUmVtb3ZlQWxsTGlzdGVuZXJzKSB7XG4gICAgICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQocHJvdG9bUkVNT1ZFX0FMTF9MSVNURU5FUlNfRVZFTlRfTElTVEVORVJdLCBuYXRpdmVSZW1vdmVBbGxMaXN0ZW5lcnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYXRpdmVMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChwcm90b1tMSVNURU5FUlNfRVZFTlRfTElTVEVORVJdLCBuYXRpdmVMaXN0ZW5lcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXBpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHRzW2ldID0gcGF0Y2hFdmVudFRhcmdldE1ldGhvZHMoYXBpc1tpXSwgcGF0Y2hPcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG59XG5mdW5jdGlvbiBmaW5kRXZlbnRUYXNrcyh0YXJnZXQsIGV2ZW50TmFtZSkge1xuICAgIGlmICghZXZlbnROYW1lKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kVGFza3MgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gRVZFTlRfTkFNRV9TWU1CT0xfUkVHWC5leGVjKHByb3ApO1xuICAgICAgICAgICAgbGV0IGV2dE5hbWUgPSBtYXRjaCAmJiBtYXRjaFsxXTtcbiAgICAgICAgICAgIGlmIChldnROYW1lICYmICghZXZlbnROYW1lIHx8IGV2dE5hbWUgPT09IGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXNrcyA9IHRhcmdldFtwcm9wXTtcbiAgICAgICAgICAgICAgICBpZiAodGFza3MpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRUYXNrcy5wdXNoKHRhc2tzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm91bmRUYXNrcztcbiAgICB9XG4gICAgbGV0IHN5bWJvbEV2ZW50TmFtZSA9IHpvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50TmFtZV07XG4gICAgaWYgKCFzeW1ib2xFdmVudE5hbWUpIHtcbiAgICAgICAgcHJlcGFyZUV2ZW50TmFtZXMoZXZlbnROYW1lKTtcbiAgICAgICAgc3ltYm9sRXZlbnROYW1lID0gem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcbiAgICB9XG4gICAgY29uc3QgY2FwdHVyZUZhbHNlVGFza3MgPSB0YXJnZXRbc3ltYm9sRXZlbnROYW1lW0ZBTFNFX1NUUl1dO1xuICAgIGNvbnN0IGNhcHR1cmVUcnVlVGFza3MgPSB0YXJnZXRbc3ltYm9sRXZlbnROYW1lW1RSVUVfU1RSXV07XG4gICAgaWYgKCFjYXB0dXJlRmFsc2VUYXNrcykge1xuICAgICAgICByZXR1cm4gY2FwdHVyZVRydWVUYXNrcyA/IGNhcHR1cmVUcnVlVGFza3Muc2xpY2UoKSA6IFtdO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNhcHR1cmVUcnVlVGFza3NcbiAgICAgICAgICAgID8gY2FwdHVyZUZhbHNlVGFza3MuY29uY2F0KGNhcHR1cmVUcnVlVGFza3MpXG4gICAgICAgICAgICA6IGNhcHR1cmVGYWxzZVRhc2tzLnNsaWNlKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gcGF0Y2hFdmVudFByb3RvdHlwZShnbG9iYWwsIGFwaSkge1xuICAgIGNvbnN0IEV2ZW50ID0gZ2xvYmFsWydFdmVudCddO1xuICAgIGlmIChFdmVudCAmJiBFdmVudC5wcm90b3R5cGUpIHtcbiAgICAgICAgYXBpLnBhdGNoTWV0aG9kKEV2ZW50LnByb3RvdHlwZSwgJ3N0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbicsIChkZWxlZ2F0ZSkgPT4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHtcbiAgICAgICAgICAgIHNlbGZbSU1NRURJQVRFX1BST1BBR0FUSU9OX1NZTUJPTF0gPSB0cnVlO1xuICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBjYWxsIHRoZSBuYXRpdmUgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uXG4gICAgICAgICAgICAvLyBpbiBjYXNlIGluIHNvbWUgaHlicmlkIGFwcGxpY2F0aW9uLCBzb21lIHBhcnQgb2ZcbiAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uIHdpbGwgYmUgY29udHJvbGxlZCBieSB6b25lLCBzb21lIGFyZSBub3RcbiAgICAgICAgICAgIGRlbGVnYXRlICYmIGRlbGVnYXRlLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8qKlxuICogQGZpbGVvdmVydmlld1xuICogQHN1cHByZXNzIHttaXNzaW5nUmVxdWlyZX1cbiAqL1xuZnVuY3Rpb24gcGF0Y2hRdWV1ZU1pY3JvdGFzayhnbG9iYWwsIGFwaSkge1xuICAgIGFwaS5wYXRjaE1ldGhvZChnbG9iYWwsICdxdWV1ZU1pY3JvdGFzaycsIChkZWxlZ2F0ZSkgPT4ge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHtcbiAgICAgICAgICAgIFpvbmUuY3VycmVudC5zY2hlZHVsZU1pY3JvVGFzaygncXVldWVNaWNyb3Rhc2snLCBhcmdzWzBdKTtcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3XG4gKiBAc3VwcHJlc3Mge21pc3NpbmdSZXF1aXJlfVxuICovXG5jb25zdCB0YXNrU3ltYm9sID0gem9uZVN5bWJvbCgnem9uZVRhc2snKTtcbmZ1bmN0aW9uIHBhdGNoVGltZXIod2luZG93LCBzZXROYW1lLCBjYW5jZWxOYW1lLCBuYW1lU3VmZml4KSB7XG4gICAgbGV0IHNldE5hdGl2ZSA9IG51bGw7XG4gICAgbGV0IGNsZWFyTmF0aXZlID0gbnVsbDtcbiAgICBzZXROYW1lICs9IG5hbWVTdWZmaXg7XG4gICAgY2FuY2VsTmFtZSArPSBuYW1lU3VmZml4O1xuICAgIGNvbnN0IHRhc2tzQnlIYW5kbGVJZCA9IHt9O1xuICAgIGZ1bmN0aW9uIHNjaGVkdWxlVGFzayh0YXNrKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0YXNrLmRhdGE7XG4gICAgICAgIGRhdGEuYXJnc1swXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0YXNrLmludm9rZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBoYW5kbGVPcklkID0gc2V0TmF0aXZlLmFwcGx5KHdpbmRvdywgZGF0YS5hcmdzKTtcbiAgICAgICAgLy8gV2hsaXN0IG9uIE5vZGUuanMgd2hlbiBnZXQgY2FuIHRoZSBJRCBieSB1c2luZyBgW1N5bWJvbC50b1ByaW1pdGl2ZV0oKWAgd2UgZG9cbiAgICAgICAgLy8gdG8gdGhpcyBzbyB0aGF0IHdlIGRvIG5vdCBjYXVzZSBwb3RlbnRhbGx5IGxlYWtzIHdoZW4gdXNpbmcgYHNldFRpbWVvdXRgXG4gICAgICAgIC8vIHNpbmNlIHRoaXMgY2FuIGJlIHBlcmlvZGljIHdoZW4gdXNpbmcgYC5yZWZyZXNoYC5cbiAgICAgICAgaWYgKGlzTnVtYmVyKGhhbmRsZU9ySWQpKSB7XG4gICAgICAgICAgICBkYXRhLmhhbmRsZUlkID0gaGFuZGxlT3JJZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRhdGEuaGFuZGxlID0gaGFuZGxlT3JJZDtcbiAgICAgICAgICAgIC8vIE9uIE5vZGUuanMgYSB0aW1lb3V0IGFuZCBpbnRlcnZhbCBjYW4gYmUgcmVzdGFydGVkIG92ZXIgYW5kIG92ZXIgYWdhaW4gYnkgdXNpbmcgdGhlIGAucmVmcmVzaGAgbWV0aG9kLlxuICAgICAgICAgICAgZGF0YS5pc1JlZnJlc2hhYmxlID0gaXNGdW5jdGlvbihoYW5kbGVPcklkLnJlZnJlc2gpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXNrO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjbGVhclRhc2sodGFzaykge1xuICAgICAgICBjb25zdCB7IGhhbmRsZSwgaGFuZGxlSWQgfSA9IHRhc2suZGF0YTtcbiAgICAgICAgcmV0dXJuIGNsZWFyTmF0aXZlLmNhbGwod2luZG93LCBoYW5kbGUgPz8gaGFuZGxlSWQpO1xuICAgIH1cbiAgICBzZXROYXRpdmUgPSBwYXRjaE1ldGhvZCh3aW5kb3csIHNldE5hbWUsIChkZWxlZ2F0ZSkgPT4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oYXJnc1swXSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgaXNSZWZyZXNoYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNQZXJpb2RpYzogbmFtZVN1ZmZpeCA9PT0gJ0ludGVydmFsJyxcbiAgICAgICAgICAgICAgICBkZWxheTogbmFtZVN1ZmZpeCA9PT0gJ1RpbWVvdXQnIHx8IG5hbWVTdWZmaXggPT09ICdJbnRlcnZhbCcgPyBhcmdzWzFdIHx8IDAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgYXJnczogYXJncyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3NbMF07XG4gICAgICAgICAgICBhcmdzWzBdID0gZnVuY3Rpb24gdGltZXIoKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpc3N1ZS05MzQsIHRhc2sgd2lsbCBiZSBjYW5jZWxsZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBpdCBpcyBhIHBlcmlvZGljIHRhc2sgc3VjaCBhc1xuICAgICAgICAgICAgICAgICAgICAvLyBzZXRJbnRlcnZhbFxuICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy80MDM4N1xuICAgICAgICAgICAgICAgICAgICAvLyBDbGVhbnVwIHRhc2tzQnlIYW5kbGVJZCBzaG91bGQgYmUgaGFuZGxlZCBiZWZvcmUgc2NoZWR1bGVUYXNrXG4gICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIHNvbWUgem9uZVNwZWMgbWF5IGludGVyY2VwdCBhbmQgZG9lc24ndCB0cmlnZ2VyXG4gICAgICAgICAgICAgICAgICAgIC8vIHNjaGVkdWxlRm4oc2NoZWR1bGVUYXNrKSBwcm92aWRlZCBoZXJlLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGhhbmRsZSwgaGFuZGxlSWQsIGlzUGVyaW9kaWMsIGlzUmVmcmVzaGFibGUgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNQZXJpb2RpYyAmJiAhaXNSZWZyZXNoYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZUlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gbm9uLW5vZGVqcyBlbnYsIHdlIHJlbW92ZSB0aW1lcklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBsb2NhbCBjYWNoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlSWRbaGFuZGxlSWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9kZSByZXR1cm5zIGNvbXBsZXggb2JqZWN0cyBhcyBoYW5kbGVJZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSByZW1vdmUgdGFzayByZWZlcmVuY2UgZnJvbSB0aW1lciBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVbdGFza1N5bWJvbF0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHRhc2sgPSBzY2hlZHVsZU1hY3JvVGFza1dpdGhDdXJyZW50Wm9uZShzZXROYW1lLCBhcmdzWzBdLCBvcHRpb25zLCBzY2hlZHVsZVRhc2ssIGNsZWFyVGFzayk7XG4gICAgICAgICAgICBpZiAoIXRhc2spIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFzaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE5vZGUuanMgbXVzdCBhZGRpdGlvbmFsbHkgc3VwcG9ydCB0aGUgcmVmIGFuZCB1bnJlZiBmdW5jdGlvbnMuXG4gICAgICAgICAgICBjb25zdCB7IGhhbmRsZUlkLCBoYW5kbGUsIGlzUmVmcmVzaGFibGUsIGlzUGVyaW9kaWMgfSA9IHRhc2suZGF0YTtcbiAgICAgICAgICAgIGlmIChoYW5kbGVJZCkge1xuICAgICAgICAgICAgICAgIC8vIGZvciBub24gbm9kZWpzIGVudiwgd2Ugc2F2ZSBoYW5kbGVJZDogdGFza1xuICAgICAgICAgICAgICAgIC8vIG1hcHBpbmcgaW4gbG9jYWwgY2FjaGUgZm9yIGNsZWFyVGltZW91dFxuICAgICAgICAgICAgICAgIHRhc2tzQnlIYW5kbGVJZFtoYW5kbGVJZF0gPSB0YXNrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgLy8gZm9yIG5vZGVqcyBlbnYsIHdlIHNhdmUgdGFza1xuICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBpbiB0aW1lcklkIE9iamVjdCBmb3IgY2xlYXJUaW1lb3V0XG4gICAgICAgICAgICAgICAgaGFuZGxlW3Rhc2tTeW1ib2xdID0gdGFzaztcbiAgICAgICAgICAgICAgICBpZiAoaXNSZWZyZXNoYWJsZSAmJiAhaXNQZXJpb2RpYykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbFJlZnJlc2ggPSBoYW5kbGUucmVmcmVzaDtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlLnJlZnJlc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHpvbmUsIHN0YXRlIH0gPSB0YXNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09PSAnbm90U2NoZWR1bGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suX3N0YXRlID0gJ3NjaGVkdWxlZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgem9uZS5fdXBkYXRlVGFza0NvdW50KHRhc2ssIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT09ICdydW5uaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suX3N0YXRlID0gJ3NjaGVkdWxpbmcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmVmcmVzaC5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBoYW5kbGUgPz8gaGFuZGxlSWQgPz8gdGFzaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGNhdXNlIGFuIGVycm9yIGJ5IGNhbGxpbmcgaXQgZGlyZWN0bHkuXG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuYXBwbHkod2luZG93LCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNsZWFyTmF0aXZlID0gcGF0Y2hNZXRob2Qod2luZG93LCBjYW5jZWxOYW1lLCAoZGVsZWdhdGUpID0+IGZ1bmN0aW9uIChzZWxmLCBhcmdzKSB7XG4gICAgICAgIGNvbnN0IGlkID0gYXJnc1swXTtcbiAgICAgICAgbGV0IHRhc2s7XG4gICAgICAgIGlmIChpc051bWJlcihpZCkpIHtcbiAgICAgICAgICAgIC8vIG5vbiBub2RlanMgZW52LlxuICAgICAgICAgICAgdGFzayA9IHRhc2tzQnlIYW5kbGVJZFtpZF07XG4gICAgICAgICAgICBkZWxldGUgdGFza3NCeUhhbmRsZUlkW2lkXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIG5vZGVqcyBlbnYgPz8gb3RoZXIgZW52aXJvbm1lbnRzLlxuICAgICAgICAgICAgdGFzayA9IGlkPy5bdGFza1N5bWJvbF07XG4gICAgICAgICAgICBpZiAodGFzaykge1xuICAgICAgICAgICAgICAgIGlkW3Rhc2tTeW1ib2xdID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhc2sgPSBpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGFzaz8udHlwZSkge1xuICAgICAgICAgICAgaWYgKHRhc2suY2FuY2VsRm4pIHtcbiAgICAgICAgICAgICAgICAvLyBEbyBub3QgY2FuY2VsIGFscmVhZHkgY2FuY2VsZWQgZnVuY3Rpb25zXG4gICAgICAgICAgICAgICAgdGFzay56b25lLmNhbmNlbFRhc2sodGFzayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBjYXVzZSBhbiBlcnJvciBieSBjYWxsaW5nIGl0IGRpcmVjdGx5LlxuICAgICAgICAgICAgZGVsZWdhdGUuYXBwbHkod2luZG93LCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBwYXRjaEN1c3RvbUVsZW1lbnRzKF9nbG9iYWwsIGFwaSkge1xuICAgIGNvbnN0IHsgaXNCcm93c2VyLCBpc01peCB9ID0gYXBpLmdldEdsb2JhbE9iamVjdHMoKTtcbiAgICBpZiAoKCFpc0Jyb3dzZXIgJiYgIWlzTWl4KSB8fCAhX2dsb2JhbFsnY3VzdG9tRWxlbWVudHMnXSB8fCAhKCdjdXN0b21FbGVtZW50cycgaW4gX2dsb2JhbCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9jdXN0b20tZWxlbWVudHMuaHRtbCNjb25jZXB0LWN1c3RvbS1lbGVtZW50LWRlZmluaXRpb24tbGlmZWN5Y2xlLWNhbGxiYWNrc1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IFtcbiAgICAgICAgJ2Nvbm5lY3RlZENhbGxiYWNrJyxcbiAgICAgICAgJ2Rpc2Nvbm5lY3RlZENhbGxiYWNrJyxcbiAgICAgICAgJ2Fkb3B0ZWRDYWxsYmFjaycsXG4gICAgICAgICdhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2snLFxuICAgICAgICAnZm9ybUFzc29jaWF0ZWRDYWxsYmFjaycsXG4gICAgICAgICdmb3JtRGlzYWJsZWRDYWxsYmFjaycsXG4gICAgICAgICdmb3JtUmVzZXRDYWxsYmFjaycsXG4gICAgICAgICdmb3JtU3RhdGVSZXN0b3JlQ2FsbGJhY2snLFxuICAgIF07XG4gICAgYXBpLnBhdGNoQ2FsbGJhY2tzKGFwaSwgX2dsb2JhbC5jdXN0b21FbGVtZW50cywgJ2N1c3RvbUVsZW1lbnRzJywgJ2RlZmluZScsIGNhbGxiYWNrcyk7XG59XG5cbmZ1bmN0aW9uIGV2ZW50VGFyZ2V0UGF0Y2goX2dsb2JhbCwgYXBpKSB7XG4gICAgaWYgKFpvbmVbYXBpLnN5bWJvbCgncGF0Y2hFdmVudFRhcmdldCcpXSkge1xuICAgICAgICAvLyBFdmVudFRhcmdldCBpcyBhbHJlYWR5IHBhdGNoZWQuXG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyBldmVudE5hbWVzLCB6b25lU3ltYm9sRXZlbnROYW1lcywgVFJVRV9TVFIsIEZBTFNFX1NUUiwgWk9ORV9TWU1CT0xfUFJFRklYIH0gPSBhcGkuZ2V0R2xvYmFsT2JqZWN0cygpO1xuICAgIC8vICBwcmVkZWZpbmUgYWxsIF9fem9uZV9zeW1ib2xfXyArIGV2ZW50TmFtZSArIHRydWUvZmFsc2Ugc3RyaW5nXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGV2ZW50TmFtZXNbaV07XG4gICAgICAgIGNvbnN0IGZhbHNlRXZlbnROYW1lID0gZXZlbnROYW1lICsgRkFMU0VfU1RSO1xuICAgICAgICBjb25zdCB0cnVlRXZlbnROYW1lID0gZXZlbnROYW1lICsgVFJVRV9TVFI7XG4gICAgICAgIGNvbnN0IHN5bWJvbCA9IFpPTkVfU1lNQk9MX1BSRUZJWCArIGZhbHNlRXZlbnROYW1lO1xuICAgICAgICBjb25zdCBzeW1ib2xDYXB0dXJlID0gWk9ORV9TWU1CT0xfUFJFRklYICsgdHJ1ZUV2ZW50TmFtZTtcbiAgICAgICAgem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXSA9IHt9O1xuICAgICAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdW0ZBTFNFX1NUUl0gPSBzeW1ib2w7XG4gICAgICAgIHpvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50TmFtZV1bVFJVRV9TVFJdID0gc3ltYm9sQ2FwdHVyZTtcbiAgICB9XG4gICAgY29uc3QgRVZFTlRfVEFSR0VUID0gX2dsb2JhbFsnRXZlbnRUYXJnZXQnXTtcbiAgICBpZiAoIUVWRU5UX1RBUkdFVCB8fCAhRVZFTlRfVEFSR0VULnByb3RvdHlwZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGFwaS5wYXRjaEV2ZW50VGFyZ2V0KF9nbG9iYWwsIGFwaSwgW0VWRU5UX1RBUkdFVCAmJiBFVkVOVF9UQVJHRVQucHJvdG90eXBlXSk7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBwYXRjaEV2ZW50KGdsb2JhbCwgYXBpKSB7XG4gICAgYXBpLnBhdGNoRXZlbnRQcm90b3R5cGUoZ2xvYmFsLCBhcGkpO1xufVxuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXdcbiAqIEBzdXBwcmVzcyB7Z2xvYmFsVGhpc31cbiAqL1xuZnVuY3Rpb24gZmlsdGVyUHJvcGVydGllcyh0YXJnZXQsIG9uUHJvcGVydGllcywgaWdub3JlUHJvcGVydGllcykge1xuICAgIGlmICghaWdub3JlUHJvcGVydGllcyB8fCBpZ25vcmVQcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb25Qcm9wZXJ0aWVzO1xuICAgIH1cbiAgICBjb25zdCB0aXAgPSBpZ25vcmVQcm9wZXJ0aWVzLmZpbHRlcigoaXApID0+IGlwLnRhcmdldCA9PT0gdGFyZ2V0KTtcbiAgICBpZiAoIXRpcCB8fCB0aXAubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvblByb3BlcnRpZXM7XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldElnbm9yZVByb3BlcnRpZXMgPSB0aXBbMF0uaWdub3JlUHJvcGVydGllcztcbiAgICByZXR1cm4gb25Qcm9wZXJ0aWVzLmZpbHRlcigob3ApID0+IHRhcmdldElnbm9yZVByb3BlcnRpZXMuaW5kZXhPZihvcCkgPT09IC0xKTtcbn1cbmZ1bmN0aW9uIHBhdGNoRmlsdGVyZWRQcm9wZXJ0aWVzKHRhcmdldCwgb25Qcm9wZXJ0aWVzLCBpZ25vcmVQcm9wZXJ0aWVzLCBwcm90b3R5cGUpIHtcbiAgICAvLyBjaGVjayB3aGV0aGVyIHRhcmdldCBpcyBhdmFpbGFibGUsIHNvbWV0aW1lcyB0YXJnZXQgd2lsbCBiZSB1bmRlZmluZWRcbiAgICAvLyBiZWNhdXNlIGRpZmZlcmVudCBicm93c2VyIG9yIHNvbWUgM3JkIHBhcnR5IHBsdWdpbi5cbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlcmVkUHJvcGVydGllcyA9IGZpbHRlclByb3BlcnRpZXModGFyZ2V0LCBvblByb3BlcnRpZXMsIGlnbm9yZVByb3BlcnRpZXMpO1xuICAgIHBhdGNoT25Qcm9wZXJ0aWVzKHRhcmdldCwgZmlsdGVyZWRQcm9wZXJ0aWVzLCBwcm90b3R5cGUpO1xufVxuLyoqXG4gKiBHZXQgYWxsIGV2ZW50IG5hbWUgcHJvcGVydGllcyB3aGljaCB0aGUgZXZlbnQgbmFtZSBzdGFydHNXaXRoIGBvbmBcbiAqIGZyb20gdGhlIHRhcmdldCBvYmplY3QgaXRzZWxmLCBpbmhlcml0ZWQgcHJvcGVydGllcyBhcmUgbm90IGNvbnNpZGVyZWQuXG4gKi9cbmZ1bmN0aW9uIGdldE9uRXZlbnROYW1lcyh0YXJnZXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KVxuICAgICAgICAuZmlsdGVyKChuYW1lKSA9PiBuYW1lLnN0YXJ0c1dpdGgoJ29uJykgJiYgbmFtZS5sZW5ndGggPiAyKVxuICAgICAgICAubWFwKChuYW1lKSA9PiBuYW1lLnN1YnN0cmluZygyKSk7XG59XG5mdW5jdGlvbiBwcm9wZXJ0eURlc2NyaXB0b3JQYXRjaChhcGksIF9nbG9iYWwpIHtcbiAgICBpZiAoaXNOb2RlICYmICFpc01peCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChab25lW2FwaS5zeW1ib2woJ3BhdGNoRXZlbnRzJyldKSB7XG4gICAgICAgIC8vIGV2ZW50cyBhcmUgYWxyZWFkeSBiZWVuIHBhdGNoZWQgYnkgbGVnYWN5IHBhdGNoLlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlnbm9yZVByb3BlcnRpZXMgPSBfZ2xvYmFsWydfX1pvbmVfaWdub3JlX29uX3Byb3BlcnRpZXMnXTtcbiAgICAvLyBmb3IgYnJvd3NlcnMgdGhhdCB3ZSBjYW4gcGF0Y2ggdGhlIGRlc2NyaXB0b3I6ICBDaHJvbWUgJiBGaXJlZm94XG4gICAgbGV0IHBhdGNoVGFyZ2V0cyA9IFtdO1xuICAgIGlmIChpc0Jyb3dzZXIpIHtcbiAgICAgICAgY29uc3QgaW50ZXJuYWxXaW5kb3cgPSB3aW5kb3c7XG4gICAgICAgIHBhdGNoVGFyZ2V0cyA9IHBhdGNoVGFyZ2V0cy5jb25jYXQoW1xuICAgICAgICAgICAgJ0RvY3VtZW50JyxcbiAgICAgICAgICAgICdTVkdFbGVtZW50JyxcbiAgICAgICAgICAgICdFbGVtZW50JyxcbiAgICAgICAgICAgICdIVE1MRWxlbWVudCcsXG4gICAgICAgICAgICAnSFRNTEJvZHlFbGVtZW50JyxcbiAgICAgICAgICAgICdIVE1MTWVkaWFFbGVtZW50JyxcbiAgICAgICAgICAgICdIVE1MRnJhbWVTZXRFbGVtZW50JyxcbiAgICAgICAgICAgICdIVE1MRnJhbWVFbGVtZW50JyxcbiAgICAgICAgICAgICdIVE1MSUZyYW1lRWxlbWVudCcsXG4gICAgICAgICAgICAnSFRNTE1hcnF1ZWVFbGVtZW50JyxcbiAgICAgICAgICAgICdXb3JrZXInLFxuICAgICAgICBdKTtcbiAgICAgICAgY29uc3QgaWdub3JlRXJyb3JQcm9wZXJ0aWVzID0gaXNJRSgpXG4gICAgICAgICAgICA/IFt7IHRhcmdldDogaW50ZXJuYWxXaW5kb3csIGlnbm9yZVByb3BlcnRpZXM6IFsnZXJyb3InXSB9XVxuICAgICAgICAgICAgOiBbXTtcbiAgICAgICAgLy8gaW4gSUUvRWRnZSwgb25Qcm9wIG5vdCBleGlzdCBpbiB3aW5kb3cgb2JqZWN0LCBidXQgaW4gV2luZG93UHJvdG90eXBlXG4gICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gcGFzcyBXaW5kb3dQcm90b3R5cGUgdG8gY2hlY2sgb25Qcm9wIGV4aXN0IG9yIG5vdFxuICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhpbnRlcm5hbFdpbmRvdywgZ2V0T25FdmVudE5hbWVzKGludGVybmFsV2luZG93KSwgaWdub3JlUHJvcGVydGllcyA/IGlnbm9yZVByb3BlcnRpZXMuY29uY2F0KGlnbm9yZUVycm9yUHJvcGVydGllcykgOiBpZ25vcmVQcm9wZXJ0aWVzLCBPYmplY3RHZXRQcm90b3R5cGVPZihpbnRlcm5hbFdpbmRvdykpO1xuICAgIH1cbiAgICBwYXRjaFRhcmdldHMgPSBwYXRjaFRhcmdldHMuY29uY2F0KFtcbiAgICAgICAgJ1hNTEh0dHBSZXF1ZXN0JyxcbiAgICAgICAgJ1hNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQnLFxuICAgICAgICAnSURCSW5kZXgnLFxuICAgICAgICAnSURCUmVxdWVzdCcsXG4gICAgICAgICdJREJPcGVuREJSZXF1ZXN0JyxcbiAgICAgICAgJ0lEQkRhdGFiYXNlJyxcbiAgICAgICAgJ0lEQlRyYW5zYWN0aW9uJyxcbiAgICAgICAgJ0lEQkN1cnNvcicsXG4gICAgICAgICdXZWJTb2NrZXQnLFxuICAgIF0pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0Y2hUYXJnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IF9nbG9iYWxbcGF0Y2hUYXJnZXRzW2ldXTtcbiAgICAgICAgdGFyZ2V0ICYmXG4gICAgICAgICAgICB0YXJnZXQucHJvdG90eXBlICYmXG4gICAgICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyh0YXJnZXQucHJvdG90eXBlLCBnZXRPbkV2ZW50TmFtZXModGFyZ2V0LnByb3RvdHlwZSksIGlnbm9yZVByb3BlcnRpZXMpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3XG4gKiBAc3VwcHJlc3Mge21pc3NpbmdSZXF1aXJlfVxuICovXG5mdW5jdGlvbiBwYXRjaEJyb3dzZXIoWm9uZSkge1xuICAgIFpvbmUuX19sb2FkX3BhdGNoKCdsZWdhY3knLCAoZ2xvYmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IGxlZ2FjeVBhdGNoID0gZ2xvYmFsW1pvbmUuX19zeW1ib2xfXygnbGVnYWN5UGF0Y2gnKV07XG4gICAgICAgIGlmIChsZWdhY3lQYXRjaCkge1xuICAgICAgICAgICAgbGVnYWN5UGF0Y2goKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFpvbmUuX19sb2FkX3BhdGNoKCd0aW1lcnMnLCAoZ2xvYmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IHNldCA9ICdzZXQnO1xuICAgICAgICBjb25zdCBjbGVhciA9ICdjbGVhcic7XG4gICAgICAgIHBhdGNoVGltZXIoZ2xvYmFsLCBzZXQsIGNsZWFyLCAnVGltZW91dCcpO1xuICAgICAgICBwYXRjaFRpbWVyKGdsb2JhbCwgc2V0LCBjbGVhciwgJ0ludGVydmFsJyk7XG4gICAgICAgIHBhdGNoVGltZXIoZ2xvYmFsLCBzZXQsIGNsZWFyLCAnSW1tZWRpYXRlJyk7XG4gICAgfSk7XG4gICAgWm9uZS5fX2xvYWRfcGF0Y2goJ3JlcXVlc3RBbmltYXRpb25GcmFtZScsIChnbG9iYWwpID0+IHtcbiAgICAgICAgcGF0Y2hUaW1lcihnbG9iYWwsICdyZXF1ZXN0JywgJ2NhbmNlbCcsICdBbmltYXRpb25GcmFtZScpO1xuICAgICAgICBwYXRjaFRpbWVyKGdsb2JhbCwgJ21velJlcXVlc3QnLCAnbW96Q2FuY2VsJywgJ0FuaW1hdGlvbkZyYW1lJyk7XG4gICAgICAgIHBhdGNoVGltZXIoZ2xvYmFsLCAnd2Via2l0UmVxdWVzdCcsICd3ZWJraXRDYW5jZWwnLCAnQW5pbWF0aW9uRnJhbWUnKTtcbiAgICB9KTtcbiAgICBab25lLl9fbG9hZF9wYXRjaCgnYmxvY2tpbmcnLCAoZ2xvYmFsLCBab25lKSA9PiB7XG4gICAgICAgIGNvbnN0IGJsb2NraW5nTWV0aG9kcyA9IFsnYWxlcnQnLCAncHJvbXB0JywgJ2NvbmZpcm0nXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibG9ja2luZ01ldGhvZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBibG9ja2luZ01ldGhvZHNbaV07XG4gICAgICAgICAgICBwYXRjaE1ldGhvZChnbG9iYWwsIG5hbWUsIChkZWxlZ2F0ZSwgc3ltYm9sLCBuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzLCBhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBab25lLmN1cnJlbnQucnVuKGRlbGVnYXRlLCBnbG9iYWwsIGFyZ3MsIG5hbWUpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFpvbmUuX19sb2FkX3BhdGNoKCdFdmVudFRhcmdldCcsIChnbG9iYWwsIFpvbmUsIGFwaSkgPT4ge1xuICAgICAgICBwYXRjaEV2ZW50KGdsb2JhbCwgYXBpKTtcbiAgICAgICAgZXZlbnRUYXJnZXRQYXRjaChnbG9iYWwsIGFwaSk7XG4gICAgICAgIC8vIHBhdGNoIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQncyBhZGRFdmVudExpc3RlbmVyL3JlbW92ZUV2ZW50TGlzdGVuZXJcbiAgICAgICAgY29uc3QgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCA9IGdsb2JhbFsnWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCddO1xuICAgICAgICBpZiAoWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCAmJiBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0LnByb3RvdHlwZSkge1xuICAgICAgICAgICAgYXBpLnBhdGNoRXZlbnRUYXJnZXQoZ2xvYmFsLCBhcGksIFtYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0LnByb3RvdHlwZV0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgWm9uZS5fX2xvYWRfcGF0Y2goJ011dGF0aW9uT2JzZXJ2ZXInLCAoZ2xvYmFsLCBab25lLCBhcGkpID0+IHtcbiAgICAgICAgcGF0Y2hDbGFzcygnTXV0YXRpb25PYnNlcnZlcicpO1xuICAgICAgICBwYXRjaENsYXNzKCdXZWJLaXRNdXRhdGlvbk9ic2VydmVyJyk7XG4gICAgfSk7XG4gICAgWm9uZS5fX2xvYWRfcGF0Y2goJ0ludGVyc2VjdGlvbk9ic2VydmVyJywgKGdsb2JhbCwgWm9uZSwgYXBpKSA9PiB7XG4gICAgICAgIHBhdGNoQ2xhc3MoJ0ludGVyc2VjdGlvbk9ic2VydmVyJyk7XG4gICAgfSk7XG4gICAgWm9uZS5fX2xvYWRfcGF0Y2goJ0ZpbGVSZWFkZXInLCAoZ2xvYmFsLCBab25lLCBhcGkpID0+IHtcbiAgICAgICAgcGF0Y2hDbGFzcygnRmlsZVJlYWRlcicpO1xuICAgIH0pO1xuICAgIFpvbmUuX19sb2FkX3BhdGNoKCdvbl9wcm9wZXJ0eScsIChnbG9iYWwsIFpvbmUsIGFwaSkgPT4ge1xuICAgICAgICBwcm9wZXJ0eURlc2NyaXB0b3JQYXRjaChhcGksIGdsb2JhbCk7XG4gICAgfSk7XG4gICAgWm9uZS5fX2xvYWRfcGF0Y2goJ2N1c3RvbUVsZW1lbnRzJywgKGdsb2JhbCwgWm9uZSwgYXBpKSA9PiB7XG4gICAgICAgIHBhdGNoQ3VzdG9tRWxlbWVudHMoZ2xvYmFsLCBhcGkpO1xuICAgIH0pO1xuICAgIFpvbmUuX19sb2FkX3BhdGNoKCdYSFInLCAoZ2xvYmFsLCBab25lKSA9PiB7XG4gICAgICAgIC8vIFRyZWF0IFhNTEh0dHBSZXF1ZXN0IGFzIGEgbWFjcm90YXNrLlxuICAgICAgICBwYXRjaFhIUihnbG9iYWwpO1xuICAgICAgICBjb25zdCBYSFJfVEFTSyA9IHpvbmVTeW1ib2woJ3hoclRhc2snKTtcbiAgICAgICAgY29uc3QgWEhSX1NZTkMgPSB6b25lU3ltYm9sKCd4aHJTeW5jJyk7XG4gICAgICAgIGNvbnN0IFhIUl9MSVNURU5FUiA9IHpvbmVTeW1ib2woJ3hockxpc3RlbmVyJyk7XG4gICAgICAgIGNvbnN0IFhIUl9TQ0hFRFVMRUQgPSB6b25lU3ltYm9sKCd4aHJTY2hlZHVsZWQnKTtcbiAgICAgICAgY29uc3QgWEhSX1VSTCA9IHpvbmVTeW1ib2woJ3hoclVSTCcpO1xuICAgICAgICBjb25zdCBYSFJfRVJST1JfQkVGT1JFX1NDSEVEVUxFRCA9IHpvbmVTeW1ib2woJ3hockVycm9yQmVmb3JlU2NoZWR1bGVkJyk7XG4gICAgICAgIGZ1bmN0aW9uIHBhdGNoWEhSKHdpbmRvdykge1xuICAgICAgICAgICAgY29uc3QgWE1MSHR0cFJlcXVlc3QgPSB3aW5kb3dbJ1hNTEh0dHBSZXF1ZXN0J107XG4gICAgICAgICAgICBpZiAoIVhNTEh0dHBSZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgLy8gWE1MSHR0cFJlcXVlc3QgaXMgbm90IGF2YWlsYWJsZSBpbiBzZXJ2aWNlIHdvcmtlclxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlID0gWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlO1xuICAgICAgICAgICAgZnVuY3Rpb24gZmluZFBlbmRpbmdUYXNrKHRhcmdldCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbWEhSX1RBU0tdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG9yaUFkZExpc3RlbmVyID0gWE1MSHR0cFJlcXVlc3RQcm90b3R5cGVbWk9ORV9TWU1CT0xfQUREX0VWRU5UX0xJU1RFTkVSXTtcbiAgICAgICAgICAgIGxldCBvcmlSZW1vdmVMaXN0ZW5lciA9IFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlW1pPTkVfU1lNQk9MX1JFTU9WRV9FVkVOVF9MSVNURU5FUl07XG4gICAgICAgICAgICBpZiAoIW9yaUFkZExpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCA9IHdpbmRvd1snWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCddO1xuICAgICAgICAgICAgICAgIGlmIChYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXRQcm90b3R5cGUgPSBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0LnByb3RvdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgb3JpQWRkTGlzdGVuZXIgPSBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0UHJvdG90eXBlW1pPTkVfU1lNQk9MX0FERF9FVkVOVF9MSVNURU5FUl07XG4gICAgICAgICAgICAgICAgICAgIG9yaVJlbW92ZUxpc3RlbmVyID0gWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldFByb3RvdHlwZVtaT05FX1NZTUJPTF9SRU1PVkVfRVZFTlRfTElTVEVORVJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IFJFQURZX1NUQVRFX0NIQU5HRSA9ICdyZWFkeXN0YXRlY2hhbmdlJztcbiAgICAgICAgICAgIGNvbnN0IFNDSEVEVUxFRCA9ICdzY2hlZHVsZWQnO1xuICAgICAgICAgICAgZnVuY3Rpb24gc2NoZWR1bGVUYXNrKHRhc2spIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gdGFzay5kYXRhO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGRhdGEudGFyZ2V0O1xuICAgICAgICAgICAgICAgIHRhcmdldFtYSFJfU0NIRURVTEVEXSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRhcmdldFtYSFJfRVJST1JfQkVGT1JFX1NDSEVEVUxFRF0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgZXhpc3RpbmcgZXZlbnQgbGlzdGVuZXJcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ZW5lciA9IHRhcmdldFtYSFJfTElTVEVORVJdO1xuICAgICAgICAgICAgICAgIGlmICghb3JpQWRkTGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpQWRkTGlzdGVuZXIgPSB0YXJnZXRbWk9ORV9TWU1CT0xfQUREX0VWRU5UX0xJU1RFTkVSXTtcbiAgICAgICAgICAgICAgICAgICAgb3JpUmVtb3ZlTGlzdGVuZXIgPSB0YXJnZXRbWk9ORV9TWU1CT0xfUkVNT1ZFX0VWRU5UX0xJU1RFTkVSXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaVJlbW92ZUxpc3RlbmVyLmNhbGwodGFyZ2V0LCBSRUFEWV9TVEFURV9DSEFOR0UsIGxpc3RlbmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3TGlzdGVuZXIgPSAodGFyZ2V0W1hIUl9MSVNURU5FUl0gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQucmVhZHlTdGF0ZSA9PT0gdGFyZ2V0LkRPTkUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWV0aW1lcyBvbiBzb21lIGJyb3dzZXJzIFhNTEh0dHBSZXF1ZXN0IHdpbGwgZmlyZSBvbnJlYWR5c3RhdGVjaGFuZ2Ugd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVhZHlTdGF0ZT00IG11bHRpcGxlIHRpbWVzLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIHRhc2sgc3RhdGUgaGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLmFib3J0ZWQgJiYgdGFyZ2V0W1hIUl9TQ0hFRFVMRURdICYmIHRhc2suc3RhdGUgPT09IFNDSEVEVUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIHhociBoYXMgcmVnaXN0ZXJlZCBvbmxvYWQgbGlzdGVuZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGF0IGlzIHRoZSBjYXNlLCB0aGUgdGFzayBzaG91bGQgaW52b2tlIGFmdGVyIGFsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubG9hZCBsaXN0ZW5lcnMgZmluaXNoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsc28gaWYgdGhlIHJlcXVlc3QgZmFpbGVkIHdpdGhvdXQgcmVzcG9uc2UgKHN0YXR1cyA9IDApLCB0aGUgbG9hZCBldmVudCBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBub3QgYmUgdHJpZ2dlcmVkLCBpbiB0aGF0IGNhc2UsIHdlIHNob3VsZCBhbHNvIGludm9rZSB0aGUgcGxhY2Vob2xkZXIgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBjbG9zZSB0aGUgWE1MSHR0cFJlcXVlc3Q6OnNlbmQgbWFjcm9UYXNrLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzM4Nzk1XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZFRhc2tzID0gdGFyZ2V0W1pvbmUuX19zeW1ib2xfXygnbG9hZGZhbHNlJyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuc3RhdHVzICE9PSAwICYmIGxvYWRUYXNrcyAmJiBsb2FkVGFza3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlJbnZva2UgPSB0YXNrLmludm9rZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5pbnZva2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGxvYWQgdGhlIHRhc2tzIGFnYWluLCBiZWNhdXNlIGluIG90aGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIGxpc3RlbmVyLCB0aGV5IG1heSByZW1vdmUgdGhlbXNlbHZlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZFRhc2tzID0gdGFyZ2V0W1pvbmUuX19zeW1ib2xfXygnbG9hZGZhbHNlJyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2FkVGFza3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZFRhc2tzW2ldID09PSB0YXNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRUYXNrcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLmFib3J0ZWQgJiYgdGFzay5zdGF0ZSA9PT0gU0NIRURVTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpSW52b2tlLmNhbGwodGFzayk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRUYXNrcy5wdXNoKHRhc2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5pbnZva2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghZGF0YS5hYm9ydGVkICYmIHRhcmdldFtYSFJfU0NIRURVTEVEXSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciBvY2N1cnMgd2hlbiB4aHIuc2VuZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W1hIUl9FUlJPUl9CRUZPUkVfU0NIRURVTEVEXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBvcmlBZGRMaXN0ZW5lci5jYWxsKHRhcmdldCwgUkVBRFlfU1RBVEVfQ0hBTkdFLCBuZXdMaXN0ZW5lcik7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RvcmVkVGFzayA9IHRhcmdldFtYSFJfVEFTS107XG4gICAgICAgICAgICAgICAgaWYgKCFzdG9yZWRUYXNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtYSFJfVEFTS10gPSB0YXNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZW5kTmF0aXZlLmFwcGx5KHRhcmdldCwgZGF0YS5hcmdzKTtcbiAgICAgICAgICAgICAgICB0YXJnZXRbWEhSX1NDSEVEVUxFRF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXNrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gcGxhY2Vob2xkZXJDYWxsYmFjaygpIHsgfVxuICAgICAgICAgICAgZnVuY3Rpb24gY2xlYXJUYXNrKHRhc2spIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gdGFzay5kYXRhO1xuICAgICAgICAgICAgICAgIC8vIE5vdGUgLSBpZGVhbGx5LCB3ZSB3b3VsZCBjYWxsIGRhdGEudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIgaGVyZSwgYnV0IGl0J3MgdG9vIGxhdGVcbiAgICAgICAgICAgICAgICAvLyB0byBwcmV2ZW50IGl0IGZyb20gZmlyaW5nLiBTbyBpbnN0ZWFkLCB3ZSBzdG9yZSBpbmZvIGZvciB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAgICAgICAgICAgICAgZGF0YS5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWJvcnROYXRpdmUuYXBwbHkoZGF0YS50YXJnZXQsIGRhdGEuYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvcGVuTmF0aXZlID0gcGF0Y2hNZXRob2QoWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUsICdvcGVuJywgKCkgPT4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICBzZWxmW1hIUl9TWU5DXSA9IGFyZ3NbMl0gPT0gZmFsc2U7XG4gICAgICAgICAgICAgICAgc2VsZltYSFJfVVJMXSA9IGFyZ3NbMV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wZW5OYXRpdmUuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IFhNTEhUVFBSRVFVRVNUX1NPVVJDRSA9ICdYTUxIdHRwUmVxdWVzdC5zZW5kJztcbiAgICAgICAgICAgIGNvbnN0IGZldGNoVGFza0Fib3J0aW5nID0gem9uZVN5bWJvbCgnZmV0Y2hUYXNrQWJvcnRpbmcnKTtcbiAgICAgICAgICAgIGNvbnN0IGZldGNoVGFza1NjaGVkdWxpbmcgPSB6b25lU3ltYm9sKCdmZXRjaFRhc2tTY2hlZHVsaW5nJyk7XG4gICAgICAgICAgICBjb25zdCBzZW5kTmF0aXZlID0gcGF0Y2hNZXRob2QoWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUsICdzZW5kJywgKCkgPT4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICBpZiAoWm9uZS5jdXJyZW50W2ZldGNoVGFza1NjaGVkdWxpbmddID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGEgZmV0Y2ggaXMgc2NoZWR1bGluZywgc28gd2UgYXJlIHVzaW5nIHhociB0byBwb2x5ZmlsbCBmZXRjaFxuICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYmVjYXVzZSB3ZSBhbHJlYWR5IHNjaGVkdWxlIG1hY3JvVGFzayBmb3IgZmV0Y2gsIHdlIHNob3VsZFxuICAgICAgICAgICAgICAgICAgICAvLyBub3Qgc2NoZWR1bGUgYSBtYWNyb1Rhc2sgZm9yIHhociBhZ2FpblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VuZE5hdGl2ZS5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNlbGZbWEhSX1NZTkNdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBYSFIgaXMgc3luYyB0aGVyZSBpcyBubyB0YXNrIHRvIHNjaGVkdWxlLCBqdXN0IGV4ZWN1dGUgdGhlIGNvZGUuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZW5kTmF0aXZlLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogc2VsZixcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogc2VsZltYSFJfVVJMXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzUGVyaW9kaWM6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogYXJncyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXNrID0gc2NoZWR1bGVNYWNyb1Rhc2tXaXRoQ3VycmVudFpvbmUoWE1MSFRUUFJFUVVFU1RfU09VUkNFLCBwbGFjZWhvbGRlckNhbGxiYWNrLCBvcHRpb25zLCBzY2hlZHVsZVRhc2ssIGNsZWFyVGFzayk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxmICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmW1hIUl9FUlJPUl9CRUZPUkVfU0NIRURVTEVEXSA9PT0gdHJ1ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIW9wdGlvbnMuYWJvcnRlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5zdGF0ZSA9PT0gU0NIRURVTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB4aHIgcmVxdWVzdCB0aHJvdyBlcnJvciB3aGVuIHNlbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCBpbnZva2UgdGFzayBpbnN0ZWFkIG9mIGxlYXZpbmcgYSBzY2hlZHVsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlbmRpbmcgbWFjcm9UYXNrXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmludm9rZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBhYm9ydE5hdGl2ZSA9IHBhdGNoTWV0aG9kKFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlLCAnYWJvcnQnLCAoKSA9PiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhc2sgPSBmaW5kUGVuZGluZ1Rhc2soc2VsZik7XG4gICAgICAgICAgICAgICAgaWYgKHRhc2sgJiYgdHlwZW9mIHRhc2sudHlwZSA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgWEhSIGhhcyBhbHJlYWR5IGNvbXBsZXRlZCwgZG8gbm90aGluZy5cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIFhIUiBoYXMgYWxyZWFkeSBiZWVuIGFib3J0ZWQsIGRvIG5vdGhpbmcuXG4gICAgICAgICAgICAgICAgICAgIC8vIEZpeCAjNTY5LCBjYWxsIGFib3J0IG11bHRpcGxlIHRpbWVzIGJlZm9yZSBkb25lIHdpbGwgY2F1c2VcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFjcm9UYXNrIHRhc2sgY291bnQgYmUgbmVnYXRpdmUgbnVtYmVyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXNrLmNhbmNlbEZuID09IG51bGwgfHwgKHRhc2suZGF0YSAmJiB0YXNrLmRhdGEuYWJvcnRlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0YXNrLnpvbmUuY2FuY2VsVGFzayh0YXNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoWm9uZS5jdXJyZW50W2ZldGNoVGFza0Fib3J0aW5nXSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWJvcnQgaXMgY2FsbGVkIGZyb20gZmV0Y2ggcG9seWZpbGwsIHdlIG5lZWQgdG8gY2FsbCBuYXRpdmUgYWJvcnQgb2YgWEhSLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWJvcnROYXRpdmUuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UgYXJlIHRyeWluZyB0byBhYm9ydCBhbiBYSFIgd2hpY2ggaGFzIG5vdCB5ZXQgYmVlbiBzZW50LCBzbyB0aGVyZSBpcyBub1xuICAgICAgICAgICAgICAgIC8vIHRhc2tcbiAgICAgICAgICAgICAgICAvLyB0byBjYW5jZWwuIERvIG5vdGhpbmcuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFpvbmUuX19sb2FkX3BhdGNoKCdnZW9sb2NhdGlvbicsIChnbG9iYWwpID0+IHtcbiAgICAgICAgLy8vIEdFT19MT0NBVElPTlxuICAgICAgICBpZiAoZ2xvYmFsWyduYXZpZ2F0b3InXSAmJiBnbG9iYWxbJ25hdmlnYXRvciddLmdlb2xvY2F0aW9uKSB7XG4gICAgICAgICAgICBwYXRjaFByb3RvdHlwZShnbG9iYWxbJ25hdmlnYXRvciddLmdlb2xvY2F0aW9uLCBbJ2dldEN1cnJlbnRQb3NpdGlvbicsICd3YXRjaFBvc2l0aW9uJ10pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgWm9uZS5fX2xvYWRfcGF0Y2goJ1Byb21pc2VSZWplY3Rpb25FdmVudCcsIChnbG9iYWwsIFpvbmUpID0+IHtcbiAgICAgICAgLy8gaGFuZGxlIHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvblxuICAgICAgICBmdW5jdGlvbiBmaW5kUHJvbWlzZVJlamVjdGlvbkhhbmRsZXIoZXZ0TmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRUYXNrcyA9IGZpbmRFdmVudFRhc2tzKGdsb2JhbCwgZXZ0TmFtZSk7XG4gICAgICAgICAgICAgICAgZXZlbnRUYXNrcy5mb3JFYWNoKChldmVudFRhc2spID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gd2luZG93cyBoYXMgYWRkZWQgdW5oYW5kbGVkcmVqZWN0aW9uIGV2ZW50IGxpc3RlbmVyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdGhlIGV2ZW50IGxpc3RlbmVyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb21pc2VSZWplY3Rpb25FdmVudCA9IGdsb2JhbFsnUHJvbWlzZVJlamVjdGlvbkV2ZW50J107XG4gICAgICAgICAgICAgICAgICAgIGlmIChQcm9taXNlUmVqZWN0aW9uRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2dCA9IG5ldyBQcm9taXNlUmVqZWN0aW9uRXZlbnQoZXZ0TmFtZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2U6IGUucHJvbWlzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IGUucmVqZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFRhc2suaW52b2tlKGV2dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdsb2JhbFsnUHJvbWlzZVJlamVjdGlvbkV2ZW50J10pIHtcbiAgICAgICAgICAgIFpvbmVbem9uZVN5bWJvbCgndW5oYW5kbGVkUHJvbWlzZVJlamVjdGlvbkhhbmRsZXInKV0gPVxuICAgICAgICAgICAgICAgIGZpbmRQcm9taXNlUmVqZWN0aW9uSGFuZGxlcigndW5oYW5kbGVkcmVqZWN0aW9uJyk7XG4gICAgICAgICAgICBab25lW3pvbmVTeW1ib2woJ3JlamVjdGlvbkhhbmRsZWRIYW5kbGVyJyldID1cbiAgICAgICAgICAgICAgICBmaW5kUHJvbWlzZVJlamVjdGlvbkhhbmRsZXIoJ3JlamVjdGlvbmhhbmRsZWQnKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIFpvbmUuX19sb2FkX3BhdGNoKCdxdWV1ZU1pY3JvdGFzaycsIChnbG9iYWwsIFpvbmUsIGFwaSkgPT4ge1xuICAgICAgICBwYXRjaFF1ZXVlTWljcm90YXNrKGdsb2JhbCwgYXBpKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gcGF0Y2hQcm9taXNlKFpvbmUpIHtcbiAgICBab25lLl9fbG9hZF9wYXRjaCgnWm9uZUF3YXJlUHJvbWlzZScsIChnbG9iYWwsIFpvbmUsIGFwaSkgPT4ge1xuICAgICAgICBjb25zdCBPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuICAgICAgICBjb25zdCBPYmplY3REZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbiAgICAgICAgZnVuY3Rpb24gcmVhZGFibGVPYmplY3RUb1N0cmluZyhvYmopIHtcbiAgICAgICAgICAgIGlmIChvYmogJiYgb2JqLnRvU3RyaW5nID09PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gb2JqLmNvbnN0cnVjdG9yICYmIG9iai5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICAgICAgICAgIHJldHVybiAoY2xhc3NOYW1lID8gY2xhc3NOYW1lIDogJycpICsgJzogJyArIEpTT04uc3RyaW5naWZ5KG9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb2JqID8gb2JqLnRvU3RyaW5nKCkgOiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBfX3N5bWJvbF9fID0gYXBpLnN5bWJvbDtcbiAgICAgICAgY29uc3QgX3VuY2F1Z2h0UHJvbWlzZUVycm9ycyA9IFtdO1xuICAgICAgICBjb25zdCBpc0Rpc2FibGVXcmFwcGluZ1VuY2F1Z2h0UHJvbWlzZVJlamVjdGlvbiA9IGdsb2JhbFtfX3N5bWJvbF9fKCdESVNBQkxFX1dSQVBQSU5HX1VOQ0FVR0hUX1BST01JU0VfUkVKRUNUSU9OJyldICE9PSBmYWxzZTtcbiAgICAgICAgY29uc3Qgc3ltYm9sUHJvbWlzZSA9IF9fc3ltYm9sX18oJ1Byb21pc2UnKTtcbiAgICAgICAgY29uc3Qgc3ltYm9sVGhlbiA9IF9fc3ltYm9sX18oJ3RoZW4nKTtcbiAgICAgICAgY29uc3QgY3JlYXRpb25UcmFjZSA9ICdfX2NyZWF0aW9uVHJhY2VfXyc7XG4gICAgICAgIGFwaS5vblVuaGFuZGxlZEVycm9yID0gKGUpID0+IHtcbiAgICAgICAgICAgIGlmIChhcGkuc2hvd1VuY2F1Z2h0RXJyb3IoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlamVjdGlvbiA9IGUgJiYgZS5yZWplY3Rpb247XG4gICAgICAgICAgICAgICAgaWYgKHJlamVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmhhbmRsZWQgUHJvbWlzZSByZWplY3Rpb246JywgcmVqZWN0aW9uIGluc3RhbmNlb2YgRXJyb3IgPyByZWplY3Rpb24ubWVzc2FnZSA6IHJlamVjdGlvbiwgJzsgWm9uZTonLCBlLnpvbmUubmFtZSwgJzsgVGFzazonLCBlLnRhc2sgJiYgZS50YXNrLnNvdXJjZSwgJzsgVmFsdWU6JywgcmVqZWN0aW9uLCByZWplY3Rpb24gaW5zdGFuY2VvZiBFcnJvciA/IHJlamVjdGlvbi5zdGFjayA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgYXBpLm1pY3JvdGFza0RyYWluRG9uZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHdoaWxlIChfdW5jYXVnaHRQcm9taXNlRXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVuY2F1Z2h0UHJvbWlzZUVycm9yID0gX3VuY2F1Z2h0UHJvbWlzZUVycm9ycy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHVuY2F1Z2h0UHJvbWlzZUVycm9yLnpvbmUucnVuR3VhcmRlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5jYXVnaHRQcm9taXNlRXJyb3IudGhyb3dPcmlnaW5hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHVuY2F1Z2h0UHJvbWlzZUVycm9yLnJlamVjdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHVuY2F1Z2h0UHJvbWlzZUVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZVVuaGFuZGxlZFJlamVjdGlvbihlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBVTkhBTkRMRURfUFJPTUlTRV9SRUpFQ1RJT05fSEFORExFUl9TWU1CT0wgPSBfX3N5bWJvbF9fKCd1bmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uSGFuZGxlcicpO1xuICAgICAgICBmdW5jdGlvbiBoYW5kbGVVbmhhbmRsZWRSZWplY3Rpb24oZSkge1xuICAgICAgICAgICAgYXBpLm9uVW5oYW5kbGVkRXJyb3IoZSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBab25lW1VOSEFORExFRF9QUk9NSVNFX1JFSkVDVElPTl9IQU5ETEVSX1NZTUJPTF07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7IH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpc1RoZW5hYmxlKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgJiYgdmFsdWUudGhlbjtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBmb3J3YXJkUmVzb2x1dGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGZvcndhcmRSZWplY3Rpb24ocmVqZWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gWm9uZUF3YXJlUHJvbWlzZS5yZWplY3QocmVqZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzeW1ib2xTdGF0ZSA9IF9fc3ltYm9sX18oJ3N0YXRlJyk7XG4gICAgICAgIGNvbnN0IHN5bWJvbFZhbHVlID0gX19zeW1ib2xfXygndmFsdWUnKTtcbiAgICAgICAgY29uc3Qgc3ltYm9sRmluYWxseSA9IF9fc3ltYm9sX18oJ2ZpbmFsbHknKTtcbiAgICAgICAgY29uc3Qgc3ltYm9sUGFyZW50UHJvbWlzZVZhbHVlID0gX19zeW1ib2xfXygncGFyZW50UHJvbWlzZVZhbHVlJyk7XG4gICAgICAgIGNvbnN0IHN5bWJvbFBhcmVudFByb21pc2VTdGF0ZSA9IF9fc3ltYm9sX18oJ3BhcmVudFByb21pc2VTdGF0ZScpO1xuICAgICAgICBjb25zdCBzb3VyY2UgPSAnUHJvbWlzZS50aGVuJztcbiAgICAgICAgY29uc3QgVU5SRVNPTFZFRCA9IG51bGw7XG4gICAgICAgIGNvbnN0IFJFU09MVkVEID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgUkVKRUNURUQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgUkVKRUNURURfTk9fQ0FUQ0ggPSAwO1xuICAgICAgICBmdW5jdGlvbiBtYWtlUmVzb2x2ZXIocHJvbWlzZSwgc3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiAodikgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKHByb21pc2UsIHN0YXRlLCB2KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShwcm9taXNlLCBmYWxzZSwgZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IHJldHVybiB2YWx1ZSBvciB5b3Ugd2lsbCBicmVhayB0aGUgUHJvbWlzZSBzcGVjLlxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IHdhc0NhbGxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHdyYXBwZXIod3JhcHBlZEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdhc0NhbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHdhc0NhbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHdyYXBwZWRGdW5jdGlvbi5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBUWVBFX0VSUk9SID0gJ1Byb21pc2UgcmVzb2x2ZWQgd2l0aCBpdHNlbGYnO1xuICAgICAgICBjb25zdCBDVVJSRU5UX1RBU0tfVFJBQ0VfU1lNQk9MID0gX19zeW1ib2xfXygnY3VycmVudFRhc2tUcmFjZScpO1xuICAgICAgICAvLyBQcm9taXNlIFJlc29sdXRpb25cbiAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgc3RhdGUsIHZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBvbmNlV3JhcHBlciA9IG9uY2UoKTtcbiAgICAgICAgICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoVFlQRV9FUlJPUik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJvbWlzZVtzeW1ib2xTdGF0ZV0gPT09IFVOUkVTT0xWRUQpIHtcbiAgICAgICAgICAgICAgICAvLyBzaG91bGQgb25seSBnZXQgdmFsdWUudGhlbiBvbmNlIGJhc2VkIG9uIHByb21pc2Ugc3BlYy5cbiAgICAgICAgICAgICAgICBsZXQgdGhlbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGVuID0gdmFsdWUgJiYgdmFsdWUudGhlbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uY2VXcmFwcGVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKHByb21pc2UsIGZhbHNlLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gaWYgKHZhbHVlIGluc3RhbmNlb2YgWm9uZUF3YXJlUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gUkVKRUNURUQgJiZcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBab25lQXdhcmVQcm9taXNlICYmXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLmhhc093blByb3BlcnR5KHN5bWJvbFN0YXRlKSAmJlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5oYXNPd25Qcm9wZXJ0eShzeW1ib2xWYWx1ZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVbc3ltYm9sU3RhdGVdICE9PSBVTlJFU09MVkVEKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyUmVqZWN0ZWROb0NhdGNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgdmFsdWVbc3ltYm9sU3RhdGVdLCB2YWx1ZVtzeW1ib2xWYWx1ZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSAhPT0gUkVKRUNURUQgJiYgdHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgb25jZVdyYXBwZXIobWFrZVJlc29sdmVyKHByb21pc2UsIHN0YXRlKSksIG9uY2VXcmFwcGVyKG1ha2VSZXNvbHZlcihwcm9taXNlLCBmYWxzZSkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbmNlV3JhcHBlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgZmFsc2UsIGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwcm9taXNlW3N5bWJvbFN0YXRlXSA9IHN0YXRlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWV1ZSA9IHByb21pc2Vbc3ltYm9sVmFsdWVdO1xuICAgICAgICAgICAgICAgICAgICBwcm9taXNlW3N5bWJvbFZhbHVlXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvbWlzZVtzeW1ib2xGaW5hbGx5XSA9PT0gc3ltYm9sRmluYWxseSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb21pc2UgaXMgZ2VuZXJhdGVkIGJ5IFByb21pc2UucHJvdG90eXBlLmZpbmFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gUkVTT0xWRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RhdGUgaXMgcmVzb2x2ZWQsIHNob3VsZCBpZ25vcmUgdGhlIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHVzZSBwYXJlbnQgcHJvbWlzZSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2Vbc3ltYm9sU3RhdGVdID0gcHJvbWlzZVtzeW1ib2xQYXJlbnRQcm9taXNlU3RhdGVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2Vbc3ltYm9sVmFsdWVdID0gcHJvbWlzZVtzeW1ib2xQYXJlbnRQcm9taXNlVmFsdWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlY29yZCB0YXNrIGluZm9ybWF0aW9uIGluIHZhbHVlIHdoZW4gZXJyb3Igb2NjdXJzLCBzbyB3ZSBjYW5cbiAgICAgICAgICAgICAgICAgICAgLy8gZG8gc29tZSBhZGRpdGlvbmFsIHdvcmsgc3VjaCBhcyByZW5kZXIgbG9uZ1N0YWNrVHJhY2VcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09PSBSRUpFQ1RFRCAmJiB2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBsb25nU3RhY2tUcmFjZVpvbmUgaXMgaGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhY2UgPSBab25lLmN1cnJlbnRUYXNrICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWm9uZS5jdXJyZW50VGFzay5kYXRhICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWm9uZS5jdXJyZW50VGFzay5kYXRhW2NyZWF0aW9uVHJhY2VdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBrZWVwIHRoZSBsb25nIHN0YWNrIHRyYWNlIGludG8gZXJyb3Igd2hlbiBpbiBsb25nU3RhY2tUcmFjZVpvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3REZWZpbmVQcm9wZXJ0eSh2YWx1ZSwgQ1VSUkVOVF9UQVNLX1RSQUNFX1NZTUJPTCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRyYWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVSZXNvbHZlT3JSZWplY3QocHJvbWlzZSwgcXVldWVbaSsrXSwgcXVldWVbaSsrXSwgcXVldWVbaSsrXSwgcXVldWVbaSsrXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmxlbmd0aCA9PSAwICYmIHN0YXRlID09IFJFSkVDVEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlW3N5bWJvbFN0YXRlXSA9IFJFSkVDVEVEX05PX0NBVENIO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVuY2F1Z2h0UHJvbWlzZUVycm9yID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlcmUgd2UgdGhyb3dzIGEgbmV3IEVycm9yIHRvIHByaW50IG1vcmUgcmVhZGFibGUgZXJyb3IgbG9nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGlmIHRoZSB2YWx1ZSBpcyBub3QgYW4gZXJyb3IsIHpvbmUuanMgYnVpbGRzIGFuIGBFcnJvcmBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPYmplY3QgaGVyZSB0byBhdHRhY2ggdGhlIHN0YWNrIGluZm9ybWF0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5jYXVnaHQgKGluIHByb21pc2UpOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGFibGVPYmplY3RUb1N0cmluZyh2YWx1ZSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUgJiYgdmFsdWUuc3RhY2sgPyAnXFxuJyArIHZhbHVlLnN0YWNrIDogJycpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmNhdWdodFByb21pc2VFcnJvciA9IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Rpc2FibGVXcmFwcGluZ1VuY2F1Z2h0UHJvbWlzZVJlamVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGRpc2FibGUgd3JhcHBpbmcgdW5jYXVnaHQgcHJvbWlzZSByZWplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIHZhbHVlIGluc3RlYWQgb2Ygd3JhcHBpbmcgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jYXVnaHRQcm9taXNlRXJyb3IudGhyb3dPcmlnaW5hbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmNhdWdodFByb21pc2VFcnJvci5yZWplY3Rpb24gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuY2F1Z2h0UHJvbWlzZUVycm9yLnByb21pc2UgPSBwcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5jYXVnaHRQcm9taXNlRXJyb3Iuem9uZSA9IFpvbmUuY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuY2F1Z2h0UHJvbWlzZUVycm9yLnRhc2sgPSBab25lLmN1cnJlbnRUYXNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3VuY2F1Z2h0UHJvbWlzZUVycm9ycy5wdXNoKHVuY2F1Z2h0UHJvbWlzZUVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwaS5zY2hlZHVsZU1pY3JvVGFzaygpOyAvLyB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBydW5uaW5nXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZXNvbHZpbmcgYW4gYWxyZWFkeSByZXNvbHZlZCBwcm9taXNlIGlzIGEgbm9vcC5cbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IFJFSkVDVElPTl9IQU5ETEVEX0hBTkRMRVIgPSBfX3N5bWJvbF9fKCdyZWplY3Rpb25IYW5kbGVkSGFuZGxlcicpO1xuICAgICAgICBmdW5jdGlvbiBjbGVhclJlamVjdGVkTm9DYXRjaChwcm9taXNlKSB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZVtzeW1ib2xTdGF0ZV0gPT09IFJFSkVDVEVEX05PX0NBVENIKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHByb21pc2UgaXMgcmVqZWN0ZWQgbm8gY2F0Y2ggc3RhdHVzXG4gICAgICAgICAgICAgICAgLy8gYW5kIHF1ZXVlLmxlbmd0aCA+IDAsIG1lYW5zIHRoZXJlIGlzIGEgZXJyb3IgaGFuZGxlclxuICAgICAgICAgICAgICAgIC8vIGhlcmUgdG8gaGFuZGxlIHRoZSByZWplY3RlZCBwcm9taXNlLCB3ZSBzaG91bGQgdHJpZ2dlclxuICAgICAgICAgICAgICAgIC8vIHdpbmRvd3MucmVqZWN0aW9uaGFuZGxlZCBldmVudEhhbmRsZXIgb3Igbm9kZWpzIHJlamVjdGlvbkhhbmRsZWRcbiAgICAgICAgICAgICAgICAvLyBldmVudEhhbmRsZXJcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gWm9uZVtSRUpFQ1RJT05fSEFORExFRF9IQU5ETEVSXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgJiYgdHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCB7IHJlamVjdGlvbjogcHJvbWlzZVtzeW1ib2xWYWx1ZV0sIHByb21pc2U6IHByb21pc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikgeyB9XG4gICAgICAgICAgICAgICAgcHJvbWlzZVtzeW1ib2xTdGF0ZV0gPSBSRUpFQ1RFRDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IF91bmNhdWdodFByb21pc2VFcnJvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb21pc2UgPT09IF91bmNhdWdodFByb21pc2VFcnJvcnNbaV0ucHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3VuY2F1Z2h0UHJvbWlzZUVycm9ycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2NoZWR1bGVSZXNvbHZlT3JSZWplY3QocHJvbWlzZSwgem9uZSwgY2hhaW5Qcm9taXNlLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgICAgICAgY2xlYXJSZWplY3RlZE5vQ2F0Y2gocHJvbWlzZSk7XG4gICAgICAgICAgICBjb25zdCBwcm9taXNlU3RhdGUgPSBwcm9taXNlW3N5bWJvbFN0YXRlXTtcbiAgICAgICAgICAgIGNvbnN0IGRlbGVnYXRlID0gcHJvbWlzZVN0YXRlXG4gICAgICAgICAgICAgICAgPyB0eXBlb2Ygb25GdWxmaWxsZWQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICAgICAgICAgPyBvbkZ1bGZpbGxlZFxuICAgICAgICAgICAgICAgICAgICA6IGZvcndhcmRSZXNvbHV0aW9uXG4gICAgICAgICAgICAgICAgOiB0eXBlb2Ygb25SZWplY3RlZCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICA/IG9uUmVqZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgOiBmb3J3YXJkUmVqZWN0aW9uO1xuICAgICAgICAgICAgem9uZS5zY2hlZHVsZU1pY3JvVGFzayhzb3VyY2UsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRQcm9taXNlVmFsdWUgPSBwcm9taXNlW3N5bWJvbFZhbHVlXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNGaW5hbGx5UHJvbWlzZSA9ICEhY2hhaW5Qcm9taXNlICYmIHN5bWJvbEZpbmFsbHkgPT09IGNoYWluUHJvbWlzZVtzeW1ib2xGaW5hbGx5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmluYWxseVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwcm9taXNlIGlzIGdlbmVyYXRlZCBmcm9tIGZpbmFsbHkgY2FsbCwga2VlcCBwYXJlbnQgcHJvbWlzZSdzIHN0YXRlIGFuZCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW5Qcm9taXNlW3N5bWJvbFBhcmVudFByb21pc2VWYWx1ZV0gPSBwYXJlbnRQcm9taXNlVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFpblByb21pc2Vbc3ltYm9sUGFyZW50UHJvbWlzZVN0YXRlXSA9IHByb21pc2VTdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IHBhc3MgdmFsdWUgdG8gZmluYWxseSBjYWxsYmFja1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHpvbmUucnVuKGRlbGVnYXRlLCB1bmRlZmluZWQsIGlzRmluYWxseVByb21pc2UgJiYgZGVsZWdhdGUgIT09IGZvcndhcmRSZWplY3Rpb24gJiYgZGVsZWdhdGUgIT09IGZvcndhcmRSZXNvbHV0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFtwYXJlbnRQcm9taXNlVmFsdWVdKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UoY2hhaW5Qcm9taXNlLCB0cnVlLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBlcnJvciBvY2N1cnMsIHNob3VsZCBhbHdheXMgcmV0dXJuIHRoaXMgZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UoY2hhaW5Qcm9taXNlLCBmYWxzZSwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGNoYWluUHJvbWlzZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgWk9ORV9BV0FSRV9QUk9NSVNFX1RPX1NUUklORyA9ICdmdW5jdGlvbiBab25lQXdhcmVQcm9taXNlKCkgeyBbbmF0aXZlIGNvZGVdIH0nO1xuICAgICAgICBjb25zdCBub29wID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgICBjb25zdCBBZ2dyZWdhdGVFcnJvciA9IGdsb2JhbC5BZ2dyZWdhdGVFcnJvcjtcbiAgICAgICAgY2xhc3MgWm9uZUF3YXJlUHJvbWlzZSB7XG4gICAgICAgICAgICBzdGF0aWMgdG9TdHJpbmcoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFpPTkVfQVdBUkVfUFJPTUlTRV9UT19TVFJJTkc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0aWMgcmVzb2x2ZSh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFpvbmVBd2FyZVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVByb21pc2UobmV3IHRoaXMobnVsbCksIFJFU09MVkVELCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0aWMgcmVqZWN0KGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVQcm9taXNlKG5ldyB0aGlzKG51bGwpLCBSRUpFQ1RFRCwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdGljIHdpdGhSZXNvbHZlcnMoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgICAgICAgICAgcmVzdWx0LnByb21pc2UgPSBuZXcgWm9uZUF3YXJlUHJvbWlzZSgocmVzLCByZWopID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlc29sdmUgPSByZXM7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZWplY3QgPSByZWo7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRpYyBhbnkodmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZXMgfHwgdHlwZW9mIHZhbHVlc1tTeW1ib2wuaXRlcmF0b3JdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgQWdncmVnYXRlRXJyb3IoW10sICdBbGwgcHJvbWlzZXMgd2VyZSByZWplY3RlZCcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHYgb2YgdmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChab25lQXdhcmVQcm9taXNlLnJlc29sdmUodikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBBZ2dyZWdhdGVFcnJvcihbXSwgJ0FsbCBwcm9taXNlcyB3ZXJlIHJlamVjdGVkJykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBBZ2dyZWdhdGVFcnJvcihbXSwgJ0FsbCBwcm9taXNlcyB3ZXJlIHJlamVjdGVkJykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFpvbmVBd2FyZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb21pc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlc1tpXS50aGVuKCh2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgQWdncmVnYXRlRXJyb3IoZXJyb3JzLCAnQWxsIHByb21pc2VzIHdlcmUgcmVqZWN0ZWQnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRpYyByYWNlKHZhbHVlcykge1xuICAgICAgICAgICAgICAgIGxldCByZXNvbHZlO1xuICAgICAgICAgICAgICAgIGxldCByZWplY3Q7XG4gICAgICAgICAgICAgICAgbGV0IHByb21pc2UgPSBuZXcgdGhpcygocmVzLCByZWopID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSA9IHJlcztcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0ID0gcmVqO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9uUmVzb2x2ZSh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gb25SZWplY3QoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNUaGVuYWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS50aGVuKG9uUmVzb2x2ZSwgb25SZWplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRpYyBhbGwodmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFpvbmVBd2FyZVByb21pc2UuYWxsV2l0aENhbGxiYWNrKHZhbHVlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0aWMgYWxsU2V0dGxlZCh2YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBQID0gdGhpcyAmJiB0aGlzLnByb3RvdHlwZSBpbnN0YW5jZW9mIFpvbmVBd2FyZVByb21pc2UgPyB0aGlzIDogWm9uZUF3YXJlUHJvbWlzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUC5hbGxXaXRoQ2FsbGJhY2sodmFsdWVzLCB7XG4gICAgICAgICAgICAgICAgICAgIHRoZW5DYWxsYmFjazogKHZhbHVlKSA9PiAoeyBzdGF0dXM6ICdmdWxmaWxsZWQnLCB2YWx1ZSB9KSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JDYWxsYmFjazogKGVycikgPT4gKHsgc3RhdHVzOiAncmVqZWN0ZWQnLCByZWFzb246IGVyciB9KSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRpYyBhbGxXaXRoQ2FsbGJhY2sodmFsdWVzLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGxldCByZXNvbHZlO1xuICAgICAgICAgICAgICAgIGxldCByZWplY3Q7XG4gICAgICAgICAgICAgICAgbGV0IHByb21pc2UgPSBuZXcgdGhpcygocmVzLCByZWopID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSA9IHJlcztcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0ID0gcmVqO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGF0IDIgdG8gcHJldmVudCBwcmVtYXR1cmVseSByZXNvbHZpbmcgaWYgLnRoZW4gaXMgY2FsbGVkIGltbWVkaWF0ZWx5LlxuICAgICAgICAgICAgICAgIGxldCB1bnJlc29sdmVkQ291bnQgPSAyO1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZUluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZFZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVGhlbmFibGUodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VyVmFsdWVJbmRleCA9IHZhbHVlSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkVmFsdWVzW2N1clZhbHVlSW5kZXhdID0gY2FsbGJhY2sgPyBjYWxsYmFjay50aGVuQ2FsbGJhY2sodmFsdWUpIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5yZXNvbHZlZENvdW50LS07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVucmVzb2x2ZWRDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc29sdmVkVmFsdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkVmFsdWVzW2N1clZhbHVlSW5kZXhdID0gY2FsbGJhY2suZXJyb3JDYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnJlc29sdmVkQ291bnQtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVucmVzb2x2ZWRDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNvbHZlZFZhbHVlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAodGhlbkVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHRoZW5FcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHVucmVzb2x2ZWRDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZUluZGV4Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIE1ha2UgdGhlIHVucmVzb2x2ZWRDb3VudCB6ZXJvLWJhc2VkIGFnYWluLlxuICAgICAgICAgICAgICAgIHVucmVzb2x2ZWRDb3VudCAtPSAyO1xuICAgICAgICAgICAgICAgIGlmICh1bnJlc29sdmVkQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNvbHZlZFZhbHVlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3RydWN0b3IoZXhlY3V0b3IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcztcbiAgICAgICAgICAgICAgICBpZiAoIShwcm9taXNlIGluc3RhbmNlb2YgWm9uZUF3YXJlUHJvbWlzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IGJlIGFuIGluc3RhbmNlb2YgUHJvbWlzZS4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvbWlzZVtzeW1ib2xTdGF0ZV0gPSBVTlJFU09MVkVEO1xuICAgICAgICAgICAgICAgIHByb21pc2Vbc3ltYm9sVmFsdWVdID0gW107IC8vIHF1ZXVlO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9uY2VXcmFwcGVyID0gb25jZSgpO1xuICAgICAgICAgICAgICAgICAgICBleGVjdXRvciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3Iob25jZVdyYXBwZXIobWFrZVJlc29sdmVyKHByb21pc2UsIFJFU09MVkVEKSksIG9uY2VXcmFwcGVyKG1ha2VSZXNvbHZlcihwcm9taXNlLCBSRUpFQ1RFRCkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKHByb21pc2UsIGZhbHNlLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnUHJvbWlzZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnZXQgW1N5bWJvbC5zcGVjaWVzXSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWm9uZUF3YXJlUHJvbWlzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IHJlYWQgYFN5bWJvbC5zcGVjaWVzYCBzYWZlbHkgYmVjYXVzZSBgdGhpc2AgbWF5IGJlIGFueXRoaW5nLiBGb3IgaW5zdGFuY2UsIGB0aGlzYFxuICAgICAgICAgICAgICAgIC8vIG1heSBiZSBhbiBvYmplY3Qgd2l0aG91dCBhIHByb3RvdHlwZSAoY3JlYXRlZCB0aHJvdWdoIGBPYmplY3QuY3JlYXRlKG51bGwpYCk7IHRodXNcbiAgICAgICAgICAgICAgICAvLyBgdGhpcy5jb25zdHJ1Y3RvcmAgd2lsbCBiZSB1bmRlZmluZWQuIE9uZSBvZiB0aGUgdXNlIGNhc2VzIGlzIFN5c3RlbUpTIGNyZWF0aW5nXG4gICAgICAgICAgICAgICAgLy8gcHJvdG90eXBlLWxlc3Mgb2JqZWN0cyAobW9kdWxlcykgdmlhIGBPYmplY3QuY3JlYXRlKG51bGwpYC4gVGhlIFN5c3RlbUpTIGNyZWF0ZXMgYW4gZW1wdHlcbiAgICAgICAgICAgICAgICAvLyBvYmplY3QgYW5kIGNvcGllcyBwcm9taXNlIHByb3BlcnRpZXMgaW50byB0aGF0IG9iamVjdCAod2l0aGluIHRoZSBgZ2V0T3JDcmVhdGVMb2FkYFxuICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uKS4gVGhlIHpvbmUuanMgdGhlbiBjaGVja3MgaWYgdGhlIHJlc29sdmVkIHZhbHVlIGhhcyB0aGUgYHRoZW5gIG1ldGhvZCBhbmRcbiAgICAgICAgICAgICAgICAvLyBpbnZva2VzIGl0IHdpdGggdGhlIGB2YWx1ZWAgY29udGV4dC4gT3RoZXJ3aXNlLCB0aGlzIHdpbGwgdGhyb3cgYW4gZXJyb3I6IGBUeXBlRXJyb3I6XG4gICAgICAgICAgICAgICAgLy8gQ2Fubm90IHJlYWQgcHJvcGVydGllcyBvZiB1bmRlZmluZWQgKHJlYWRpbmcgJ1N5bWJvbChTeW1ib2wuc3BlY2llcyknKWAuXG4gICAgICAgICAgICAgICAgbGV0IEMgPSB0aGlzLmNvbnN0cnVjdG9yPy5bU3ltYm9sLnNwZWNpZXNdO1xuICAgICAgICAgICAgICAgIGlmICghQyB8fCB0eXBlb2YgQyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBDID0gdGhpcy5jb25zdHJ1Y3RvciB8fCBab25lQXdhcmVQcm9taXNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBjaGFpblByb21pc2UgPSBuZXcgQyhub29wKTtcbiAgICAgICAgICAgICAgICBjb25zdCB6b25lID0gWm9uZS5jdXJyZW50O1xuICAgICAgICAgICAgICAgIGlmICh0aGlzW3N5bWJvbFN0YXRlXSA9PSBVTlJFU09MVkVEKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbc3ltYm9sVmFsdWVdLnB1c2goem9uZSwgY2hhaW5Qcm9taXNlLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVJlc29sdmVPclJlamVjdCh0aGlzLCB6b25lLCBjaGFpblByb21pc2UsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoYWluUHJvbWlzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoKG9uUmVqZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50aGVuKG51bGwsIG9uUmVqZWN0ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseShvbkZpbmFsbHkpIHtcbiAgICAgICAgICAgICAgICAvLyBTZWUgY29tbWVudCBvbiB0aGUgY2FsbCB0byBgdGhlbmAgYWJvdXQgd2h5IHRoZWUgYFN5bWJvbC5zcGVjaWVzYCBpcyBzYWZlbHkgYWNjZXNzZWQuXG4gICAgICAgICAgICAgICAgbGV0IEMgPSB0aGlzLmNvbnN0cnVjdG9yPy5bU3ltYm9sLnNwZWNpZXNdO1xuICAgICAgICAgICAgICAgIGlmICghQyB8fCB0eXBlb2YgQyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBDID0gWm9uZUF3YXJlUHJvbWlzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhaW5Qcm9taXNlID0gbmV3IEMobm9vcCk7XG4gICAgICAgICAgICAgICAgY2hhaW5Qcm9taXNlW3N5bWJvbEZpbmFsbHldID0gc3ltYm9sRmluYWxseTtcbiAgICAgICAgICAgICAgICBjb25zdCB6b25lID0gWm9uZS5jdXJyZW50O1xuICAgICAgICAgICAgICAgIGlmICh0aGlzW3N5bWJvbFN0YXRlXSA9PSBVTlJFU09MVkVEKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbc3ltYm9sVmFsdWVdLnB1c2goem9uZSwgY2hhaW5Qcm9taXNlLCBvbkZpbmFsbHksIG9uRmluYWxseSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVJlc29sdmVPclJlamVjdCh0aGlzLCB6b25lLCBjaGFpblByb21pc2UsIG9uRmluYWxseSwgb25GaW5hbGx5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoYWluUHJvbWlzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBQcm90ZWN0IGFnYWluc3QgYWdncmVzc2l2ZSBvcHRpbWl6ZXJzIGRyb3BwaW5nIHNlZW1pbmdseSB1bnVzZWQgcHJvcGVydGllcy5cbiAgICAgICAgLy8gRS5nLiBDbG9zdXJlIENvbXBpbGVyIGluIGFkdmFuY2VkIG1vZGUuXG4gICAgICAgIFpvbmVBd2FyZVByb21pc2VbJ3Jlc29sdmUnXSA9IFpvbmVBd2FyZVByb21pc2UucmVzb2x2ZTtcbiAgICAgICAgWm9uZUF3YXJlUHJvbWlzZVsncmVqZWN0J10gPSBab25lQXdhcmVQcm9taXNlLnJlamVjdDtcbiAgICAgICAgWm9uZUF3YXJlUHJvbWlzZVsncmFjZSddID0gWm9uZUF3YXJlUHJvbWlzZS5yYWNlO1xuICAgICAgICBab25lQXdhcmVQcm9taXNlWydhbGwnXSA9IFpvbmVBd2FyZVByb21pc2UuYWxsO1xuICAgICAgICBjb25zdCBOYXRpdmVQcm9taXNlID0gKGdsb2JhbFtzeW1ib2xQcm9taXNlXSA9IGdsb2JhbFsnUHJvbWlzZSddKTtcbiAgICAgICAgZ2xvYmFsWydQcm9taXNlJ10gPSBab25lQXdhcmVQcm9taXNlO1xuICAgICAgICBjb25zdCBzeW1ib2xUaGVuUGF0Y2hlZCA9IF9fc3ltYm9sX18oJ3RoZW5QYXRjaGVkJyk7XG4gICAgICAgIGZ1bmN0aW9uIHBhdGNoVGhlbihDdG9yKSB7XG4gICAgICAgICAgICBjb25zdCBwcm90byA9IEN0b3IucHJvdG90eXBlO1xuICAgICAgICAgICAgY29uc3QgcHJvcCA9IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgJ3RoZW4nKTtcbiAgICAgICAgICAgIGlmIChwcm9wICYmIChwcm9wLndyaXRhYmxlID09PSBmYWxzZSB8fCAhcHJvcC5jb25maWd1cmFibGUpKSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgQ3Rvci5wcm90b3R5cGUudGhlbiBwcm9wZXJ0eURlc2NyaXB0b3IgaXMgd3JpdGFibGUgb3Igbm90XG4gICAgICAgICAgICAgICAgLy8gaW4gbWV0ZW9yIGVudiwgd3JpdGFibGUgaXMgZmFsc2UsIHdlIHNob3VsZCBpZ25vcmUgc3VjaCBjYXNlXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxUaGVuID0gcHJvdG8udGhlbjtcbiAgICAgICAgICAgIC8vIEtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIG1ldGhvZC5cbiAgICAgICAgICAgIHByb3RvW3N5bWJvbFRoZW5dID0gb3JpZ2luYWxUaGVuO1xuICAgICAgICAgICAgQ3Rvci5wcm90b3R5cGUudGhlbiA9IGZ1bmN0aW9uIChvblJlc29sdmUsIG9uUmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd3JhcHBlZCA9IG5ldyBab25lQXdhcmVQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxUaGVuLmNhbGwodGhpcywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC50aGVuKG9uUmVzb2x2ZSwgb25SZWplY3QpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIEN0b3Jbc3ltYm9sVGhlblBhdGNoZWRdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBhcGkucGF0Y2hUaGVuID0gcGF0Y2hUaGVuO1xuICAgICAgICBmdW5jdGlvbiB6b25laWZ5KGZuKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0UHJvbWlzZSA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHRQcm9taXNlIGluc3RhbmNlb2YgWm9uZUF3YXJlUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0UHJvbWlzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGN0b3IgPSByZXN1bHRQcm9taXNlLmNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgICAgIGlmICghY3RvcltzeW1ib2xUaGVuUGF0Y2hlZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0Y2hUaGVuKGN0b3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0UHJvbWlzZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE5hdGl2ZVByb21pc2UpIHtcbiAgICAgICAgICAgIHBhdGNoVGhlbihOYXRpdmVQcm9taXNlKTtcbiAgICAgICAgICAgIHBhdGNoTWV0aG9kKGdsb2JhbCwgJ2ZldGNoJywgKGRlbGVnYXRlKSA9PiB6b25laWZ5KGRlbGVnYXRlKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhpcyBpcyBub3QgcGFydCBvZiBwdWJsaWMgQVBJLCBidXQgaXQgaXMgdXNlZnVsIGZvciB0ZXN0cywgc28gd2UgZXhwb3NlIGl0LlxuICAgICAgICBQcm9taXNlW1pvbmUuX19zeW1ib2xfXygndW5jYXVnaHRQcm9taXNlRXJyb3JzJyldID0gX3VuY2F1Z2h0UHJvbWlzZUVycm9ycztcbiAgICAgICAgcmV0dXJuIFpvbmVBd2FyZVByb21pc2U7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHBhdGNoVG9TdHJpbmcoWm9uZSkge1xuICAgIC8vIG92ZXJyaWRlIEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyB0byBtYWtlIHpvbmUuanMgcGF0Y2hlZCBmdW5jdGlvblxuICAgIC8vIGxvb2sgbGlrZSBuYXRpdmUgZnVuY3Rpb25cbiAgICBab25lLl9fbG9hZF9wYXRjaCgndG9TdHJpbmcnLCAoZ2xvYmFsKSA9PiB7XG4gICAgICAgIC8vIHBhdGNoIEZ1bmMucHJvdG90eXBlLnRvU3RyaW5nIHRvIGxldCB0aGVtIGxvb2sgbGlrZSBuYXRpdmVcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xuICAgICAgICBjb25zdCBPUklHSU5BTF9ERUxFR0FURV9TWU1CT0wgPSB6b25lU3ltYm9sKCdPcmlnaW5hbERlbGVnYXRlJyk7XG4gICAgICAgIGNvbnN0IFBST01JU0VfU1lNQk9MID0gem9uZVN5bWJvbCgnUHJvbWlzZScpO1xuICAgICAgICBjb25zdCBFUlJPUl9TWU1CT0wgPSB6b25lU3ltYm9sKCdFcnJvcicpO1xuICAgICAgICBjb25zdCBuZXdGdW5jdGlvblRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbERlbGVnYXRlID0gdGhpc1tPUklHSU5BTF9ERUxFR0FURV9TWU1CT0xdO1xuICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbERlbGVnYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3JpZ2luYWxEZWxlZ2F0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZy5jYWxsKG9yaWdpbmFsRGVsZWdhdGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvcmlnaW5hbERlbGVnYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcyA9PT0gUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVQcm9taXNlID0gZ2xvYmFsW1BST01JU0VfU1lNQk9MXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hdGl2ZVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEZ1bmN0aW9uVG9TdHJpbmcuY2FsbChuYXRpdmVQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcyA9PT0gRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlRXJyb3IgPSBnbG9iYWxbRVJST1JfU1lNQk9MXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hdGl2ZUVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nLmNhbGwobmF0aXZlRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZy5jYWxsKHRoaXMpO1xuICAgICAgICB9O1xuICAgICAgICBuZXdGdW5jdGlvblRvU3RyaW5nW09SSUdJTkFMX0RFTEVHQVRFX1NZTUJPTF0gPSBvcmlnaW5hbEZ1bmN0aW9uVG9TdHJpbmc7XG4gICAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IG5ld0Z1bmN0aW9uVG9TdHJpbmc7XG4gICAgICAgIC8vIHBhdGNoIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcgdG8gbGV0IHRoZW0gbG9vayBsaWtlIG5hdGl2ZVxuICAgICAgICBjb25zdCBvcmlnaW5hbE9iamVjdFRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbiAgICAgICAgY29uc3QgUFJPTUlTRV9PQkpFQ1RfVE9fU1RSSU5HID0gJ1tvYmplY3QgUHJvbWlzZV0nO1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBQcm9taXNlID09PSAnZnVuY3Rpb24nICYmIHRoaXMgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBST01JU0VfT0JKRUNUX1RPX1NUUklORztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbE9iamVjdFRvU3RyaW5nLmNhbGwodGhpcyk7XG4gICAgICAgIH07XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHBhdGNoQ2FsbGJhY2tzKGFwaSwgdGFyZ2V0LCB0YXJnZXROYW1lLCBtZXRob2QsIGNhbGxiYWNrcykge1xuICAgIGNvbnN0IHN5bWJvbCA9IFpvbmUuX19zeW1ib2xfXyhtZXRob2QpO1xuICAgIGlmICh0YXJnZXRbc3ltYm9sXSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5hdGl2ZURlbGVnYXRlID0gKHRhcmdldFtzeW1ib2xdID0gdGFyZ2V0W21ldGhvZF0pO1xuICAgIHRhcmdldFttZXRob2RdID0gZnVuY3Rpb24gKG5hbWUsIG9wdHMsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdHMgJiYgb3B0cy5wcm90b3R5cGUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGAke3RhcmdldE5hbWV9LiR7bWV0aG9kfTo6YCArIGNhbGxiYWNrO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb3RvdHlwZSA9IG9wdHMucHJvdG90eXBlO1xuICAgICAgICAgICAgICAgIC8vIE5vdGU6IHRoZSBgcGF0Y2hDYWxsYmFja3NgIGlzIHVzZWQgZm9yIHBhdGNoaW5nIHRoZSBgZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50YCBhbmRcbiAgICAgICAgICAgICAgICAvLyBgY3VzdG9tRWxlbWVudHMuZGVmaW5lYC4gV2UgZXhwbGljaXRseSB3cmFwIHRoZSBwYXRjaGluZyBjb2RlIGludG8gdHJ5LWNhdGNoIHNpbmNlXG4gICAgICAgICAgICAgICAgLy8gY2FsbGJhY2tzIG1heSBiZSBhbHJlYWR5IHBhdGNoZWQgYnkgb3RoZXIgd2ViIGNvbXBvbmVudHMgZnJhbWV3b3JrcyAoZS5nLiBMV0MpLCBhbmQgdGhleVxuICAgICAgICAgICAgICAgIC8vIG1ha2UgdGhvc2UgcHJvcGVydGllcyBub24td3JpdGFibGUuIFRoaXMgbWVhbnMgdGhhdCBwYXRjaGluZyBjYWxsYmFjayB3aWxsIHRocm93IGFuIGVycm9yXG4gICAgICAgICAgICAgICAgLy8gYGNhbm5vdCBhc3NpZ24gdG8gcmVhZC1vbmx5IHByb3BlcnR5YC4gU2VlIHRoaXMgY29kZSBhcyBhbiBleGFtcGxlOlxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zYWxlc2ZvcmNlL2x3Yy9ibG9iL21hc3Rlci9wYWNrYWdlcy9AbHdjL2VuZ2luZS1jb3JlL3NyYy9mcmFtZXdvcmsvYmFzZS1icmlkZ2UtZWxlbWVudC50cyNMMTgwLUwxODZcbiAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIHN0b3AgdGhlIGFwcGxpY2F0aW9uIHJlbmRlcmluZyBpZiB3ZSBjb3VsZG4ndCBwYXRjaCBzb21lXG4gICAgICAgICAgICAgICAgLy8gY2FsbGJhY2ssIGUuZy4gYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2AuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShjYWxsYmFjaykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBhcGkuT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvdHlwZSwgY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBhcGkud3JhcFdpdGhDdXJyZW50Wm9uZShkZXNjcmlwdG9yLnZhbHVlLCBzb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaS5fcmVkZWZpbmVQcm9wZXJ0eShvcHRzLnByb3RvdHlwZSwgY2FsbGJhY2ssIGRlc2NyaXB0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvdG90eXBlW2NhbGxiYWNrXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvdHlwZVtjYWxsYmFja10gPSBhcGkud3JhcFdpdGhDdXJyZW50Wm9uZShwcm90b3R5cGVbY2FsbGJhY2tdLCBzb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByb3RvdHlwZVtjYWxsYmFja10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvdHlwZVtjYWxsYmFja10gPSBhcGkud3JhcFdpdGhDdXJyZW50Wm9uZShwcm90b3R5cGVbY2FsbGJhY2tdLCBzb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogd2UgbGVhdmUgdGhlIGNhdGNoIGJsb2NrIGVtcHR5IHNpbmNlIHRoZXJlJ3Mgbm8gd2F5IHRvIGhhbmRsZSB0aGUgZXJyb3IgcmVsYXRlZFxuICAgICAgICAgICAgICAgICAgICAvLyB0byBub24td3JpdGFibGUgcHJvcGVydHkuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5hdGl2ZURlbGVnYXRlLmNhbGwodGFyZ2V0LCBuYW1lLCBvcHRzLCBvcHRpb25zKTtcbiAgICB9O1xuICAgIGFwaS5hdHRhY2hPcmlnaW5Ub1BhdGNoZWQodGFyZ2V0W21ldGhvZF0sIG5hdGl2ZURlbGVnYXRlKTtcbn1cblxuZnVuY3Rpb24gcGF0Y2hVdGlsKFpvbmUpIHtcbiAgICBab25lLl9fbG9hZF9wYXRjaCgndXRpbCcsIChnbG9iYWwsIFpvbmUsIGFwaSkgPT4ge1xuICAgICAgICAvLyBDb2xsZWN0IG5hdGl2ZSBldmVudCBuYW1lcyBieSBsb29raW5nIGF0IHByb3BlcnRpZXNcbiAgICAgICAgLy8gb24gdGhlIGdsb2JhbCBuYW1lc3BhY2UsIGUuZy4gJ29uY2xpY2snLlxuICAgICAgICBjb25zdCBldmVudE5hbWVzID0gZ2V0T25FdmVudE5hbWVzKGdsb2JhbCk7XG4gICAgICAgIGFwaS5wYXRjaE9uUHJvcGVydGllcyA9IHBhdGNoT25Qcm9wZXJ0aWVzO1xuICAgICAgICBhcGkucGF0Y2hNZXRob2QgPSBwYXRjaE1ldGhvZDtcbiAgICAgICAgYXBpLmJpbmRBcmd1bWVudHMgPSBiaW5kQXJndW1lbnRzO1xuICAgICAgICBhcGkucGF0Y2hNYWNyb1Rhc2sgPSBwYXRjaE1hY3JvVGFzaztcbiAgICAgICAgLy8gSW4gZWFybGllciB2ZXJzaW9uIG9mIHpvbmUuanMgKDwwLjkuMCksIHdlIHVzZSBlbnYgbmFtZSBgX196b25lX3N5bWJvbF9fQkxBQ0tfTElTVEVEX0VWRU5UU2BcbiAgICAgICAgLy8gdG8gZGVmaW5lIHdoaWNoIGV2ZW50cyB3aWxsIG5vdCBiZSBwYXRjaGVkIGJ5IGBab25lLmpzYC4gSW4gbmV3ZXIgdmVyc2lvbiAoPj0wLjkuMCksIHdlXG4gICAgICAgIC8vIGNoYW5nZSB0aGUgZW52IG5hbWUgdG8gYF9fem9uZV9zeW1ib2xfX1VOUEFUQ0hFRF9FVkVOVFNgIHRvIGtlZXAgdGhlIG5hbWUgY29uc2lzdGVudCB3aXRoXG4gICAgICAgIC8vIGFuZ3VsYXIgcmVwby4gVGhlICBgX196b25lX3N5bWJvbF9fQkxBQ0tfTElTVEVEX0VWRU5UU2AgaXMgZGVwcmVjYXRlZCwgYnV0IGl0IGlzIHN0aWxsIGJlXG4gICAgICAgIC8vIHN1cHBvcnRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGNvbnN0IFNZTUJPTF9CTEFDS19MSVNURURfRVZFTlRTID0gWm9uZS5fX3N5bWJvbF9fKCdCTEFDS19MSVNURURfRVZFTlRTJyk7XG4gICAgICAgIGNvbnN0IFNZTUJPTF9VTlBBVENIRURfRVZFTlRTID0gWm9uZS5fX3N5bWJvbF9fKCdVTlBBVENIRURfRVZFTlRTJyk7XG4gICAgICAgIGlmIChnbG9iYWxbU1lNQk9MX1VOUEFUQ0hFRF9FVkVOVFNdKSB7XG4gICAgICAgICAgICBnbG9iYWxbU1lNQk9MX0JMQUNLX0xJU1RFRF9FVkVOVFNdID0gZ2xvYmFsW1NZTUJPTF9VTlBBVENIRURfRVZFTlRTXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ2xvYmFsW1NZTUJPTF9CTEFDS19MSVNURURfRVZFTlRTXSkge1xuICAgICAgICAgICAgWm9uZVtTWU1CT0xfQkxBQ0tfTElTVEVEX0VWRU5UU10gPSBab25lW1NZTUJPTF9VTlBBVENIRURfRVZFTlRTXSA9XG4gICAgICAgICAgICAgICAgZ2xvYmFsW1NZTUJPTF9CTEFDS19MSVNURURfRVZFTlRTXTtcbiAgICAgICAgfVxuICAgICAgICBhcGkucGF0Y2hFdmVudFByb3RvdHlwZSA9IHBhdGNoRXZlbnRQcm90b3R5cGU7XG4gICAgICAgIGFwaS5wYXRjaEV2ZW50VGFyZ2V0ID0gcGF0Y2hFdmVudFRhcmdldDtcbiAgICAgICAgYXBpLmlzSUVPckVkZ2UgPSBpc0lFT3JFZGdlO1xuICAgICAgICBhcGkuT2JqZWN0RGVmaW5lUHJvcGVydHkgPSBPYmplY3REZWZpbmVQcm9wZXJ0eTtcbiAgICAgICAgYXBpLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiAgICAgICAgYXBpLk9iamVjdENyZWF0ZSA9IE9iamVjdENyZWF0ZTtcbiAgICAgICAgYXBpLkFycmF5U2xpY2UgPSBBcnJheVNsaWNlO1xuICAgICAgICBhcGkucGF0Y2hDbGFzcyA9IHBhdGNoQ2xhc3M7XG4gICAgICAgIGFwaS53cmFwV2l0aEN1cnJlbnRab25lID0gd3JhcFdpdGhDdXJyZW50Wm9uZTtcbiAgICAgICAgYXBpLmZpbHRlclByb3BlcnRpZXMgPSBmaWx0ZXJQcm9wZXJ0aWVzO1xuICAgICAgICBhcGkuYXR0YWNoT3JpZ2luVG9QYXRjaGVkID0gYXR0YWNoT3JpZ2luVG9QYXRjaGVkO1xuICAgICAgICBhcGkuX3JlZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG4gICAgICAgIGFwaS5wYXRjaENhbGxiYWNrcyA9IHBhdGNoQ2FsbGJhY2tzO1xuICAgICAgICBhcGkuZ2V0R2xvYmFsT2JqZWN0cyA9ICgpID0+ICh7XG4gICAgICAgICAgICBnbG9iYWxTb3VyY2VzLFxuICAgICAgICAgICAgem9uZVN5bWJvbEV2ZW50TmFtZXMsXG4gICAgICAgICAgICBldmVudE5hbWVzLFxuICAgICAgICAgICAgaXNCcm93c2VyLFxuICAgICAgICAgICAgaXNNaXgsXG4gICAgICAgICAgICBpc05vZGUsXG4gICAgICAgICAgICBUUlVFX1NUUixcbiAgICAgICAgICAgIEZBTFNFX1NUUixcbiAgICAgICAgICAgIFpPTkVfU1lNQk9MX1BSRUZJWCxcbiAgICAgICAgICAgIEFERF9FVkVOVF9MSVNURU5FUl9TVFIsXG4gICAgICAgICAgICBSRU1PVkVfRVZFTlRfTElTVEVORVJfU1RSLFxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gcGF0Y2hDb21tb24oWm9uZSkge1xuICAgIHBhdGNoUHJvbWlzZShab25lKTtcbiAgICBwYXRjaFRvU3RyaW5nKFpvbmUpO1xuICAgIHBhdGNoVXRpbChab25lKTtcbn1cblxuY29uc3QgWm9uZSQxID0gbG9hZFpvbmUoKTtcbnBhdGNoQ29tbW9uKFpvbmUkMSk7XG5wYXRjaEJyb3dzZXIoWm9uZSQxKTtcblxuZXhwb3J0IHsgWm9uZUNvbnRleHRNYW5hZ2VyIH07Il0sCiAgIm1hcHBpbmdzIjogIkFBQUEsU0FBUyxLQUFLQSxVQUFvQjtBQXNCbEMsU0FBU0MsR0FBaUJDLEdBQUs7QUFDM0IsU0FBSUEsTUFBUSxXQUFVQSxJQUFNLENBQUMsSUFDckIsT0FBT0EsRUFBSSxvQkFBcUIsY0FDcEMsT0FBT0EsRUFBSSx1QkFBd0I7QUFDM0M7QUFtQkEsSUFBSUMsS0FBbUIsbUJBVW5CQztBQUFBO0FB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O0FBQ3hCa1UsR0FBWUMsRUFBTTtBQUNsQi9ILEdBQWErSCxFQUFNOyIsCiAgIm5hbWVzIjogWyJST09UX0NPTlRFWFQiLCAiaXNMaXN0ZW5lck9iamVjdCIsICJvYmoiLCAiWk9ORV9DT05URVhUX0tFWSIsICJab25lQ29udGV4dE1hbmFnZXIiLCAiYWN0aXZlWm9uZSIsICJjb250ZXh0IiwgInRhcmdldCIsICJtYW5hZ2VyIiwgImNvbnRleHRXcmFwcGVyIiwgIl90aGlzIiwgImFyZ3MiLCAiX2kiLCAicmFuZG9tIiwgInpvbmVOYW1lIiwgIl9hIiwgIm9yaWdpbmFsIiwgImNvbnRleHRNYW5hZ2VyIiwgImV2ZW50IiwgImxpc3RlbmVyIiwgIm9wdHMiLCAibGlzdGVuZXJzIiwgInBhdGNoZWRMaXN0ZW5lciIsICJldmVudHMiLCAiYWN0aXZlIiwgImZuIiwgInRoaXNBcmciLCAibmV3Wm9uZSIsICJnbG9iYWwiLCAiX19zeW1ib2xfXyIsICJuYW1lIiwgImluaXRab25lIiwgInBlcmZvcm1hbmNlIiwgIm1hcmsiLCAicGVyZm9ybWFuY2VNZWFzdXJlIiwgImxhYmVsIiwgIl9ab25lSW1wbCIsICJwYXRjaGVzIiwgInpvbmUiLCAiX2N1cnJlbnRab25lRnJhbWUiLCAiX2N1cnJlbnRUYXNrIiwgImlnbm9yZUR1cGxpY2F0ZSIsICJjaGVja0R1cGxpY2F0ZSIsICJwZXJmTmFtZSIsICJfYXBpIiwgInBhcmVudCIsICJ6b25lU3BlYyIsICJfWm9uZURlbGVnYXRlIiwgImtleSIsICJjdXJyZW50IiwgImNhbGxiYWNrIiwgInNvdXJjZSIsICJfY2FsbGJhY2siLCAiYXBwbHlUaGlzIiwgImFwcGx5QXJncyIsICJlcnJvciIsICJ0YXNrIiwgIk5PX1pPTkUiLCAiem9uZVRhc2siLCAidHlwZSIsICJpc1BlcmlvZGljIiwgImlzUmVmcmVzaGFibGUiLCAibm90U2NoZWR1bGVkIiwgImV2ZW50VGFzayIsICJtYWNyb1Rhc2siLCAicmVFbnRyeUd1YXJkIiwgInJ1bm5pbmciLCAic2NoZWR1bGVkIiwgInByZXZpb3VzVGFzayIsICJzdGF0ZSIsICJ1bmtub3duIiwgInNjaGVkdWxpbmciLCAiem9uZURlbGVnYXRlcyIsICJlcnIiLCAiZGF0YSIsICJjdXN0b21TY2hlZHVsZSIsICJab25lVGFzayIsICJtaWNyb1Rhc2siLCAiY3VzdG9tQ2FuY2VsIiwgImNhbmNlbGluZyIsICJjb3VudCIsICJpIiwgIlpvbmVJbXBsIiwgIkRFTEVHQVRFX1pTIiwgImRlbGVnYXRlIiwgIl8iLCAiaGFzVGFza1N0YXRlIiwgInBhcmVudERlbGVnYXRlIiwgInpvbmVTcGVjSGFzVGFzayIsICJwYXJlbnRIYXNUYXNrIiwgInRhcmdldFpvbmUiLCAicmV0dXJuVGFzayIsICJzY2hlZHVsZU1pY3JvVGFzayIsICJ2YWx1ZSIsICJpc0VtcHR5IiwgImNvdW50cyIsICJwcmV2IiwgIm5leHQiLCAib3B0aW9ucyIsICJzY2hlZHVsZUZuIiwgImNhbmNlbEZuIiwgInNlbGYiLCAiX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcyIsICJkcmFpbk1pY3JvVGFza1F1ZXVlIiwgInRvU3RhdGUiLCAiZnJvbVN0YXRlMSIsICJmcm9tU3RhdGUyIiwgInN5bWJvbFNldFRpbWVvdXQiLCAic3ltYm9sUHJvbWlzZSIsICJzeW1ib2xUaGVuIiwgIl9taWNyb1Rhc2tRdWV1ZSIsICJfaXNEcmFpbmluZ01pY3JvdGFza1F1ZXVlIiwgIm5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZSIsICJuYXRpdmVTY2hlZHVsZU1pY3JvVGFzayIsICJmdW5jIiwgIm5hdGl2ZVRoZW4iLCAicXVldWUiLCAibm9vcCIsICJsb2FkWm9uZSIsICJPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCAiT2JqZWN0RGVmaW5lUHJvcGVydHkiLCAiT2JqZWN0R2V0UHJvdG90eXBlT2YiLCAiT2JqZWN0Q3JlYXRlIiwgIkFycmF5U2xpY2UiLCAiQUREX0VWRU5UX0xJU1RFTkVSX1NUUiIsICJSRU1PVkVfRVZFTlRfTElTVEVORVJfU1RSIiwgIlpPTkVfU1lNQk9MX0FERF9FVkVOVF9MSVNURU5FUiIsICJaT05FX1NZTUJPTF9SRU1PVkVfRVZFTlRfTElTVEVORVIiLCAiVFJVRV9TVFIiLCAiRkFMU0VfU1RSIiwgIlpPTkVfU1lNQk9MX1BSRUZJWCIsICJ3cmFwV2l0aEN1cnJlbnRab25lIiwgInNjaGVkdWxlTWFjcm9UYXNrV2l0aEN1cnJlbnRab25lIiwgInpvbmVTeW1ib2wiLCAiaXNXaW5kb3dFeGlzdHMiLCAiaW50ZXJuYWxXaW5kb3ciLCAiX2dsb2JhbCIsICJSRU1PVkVfQVRUUklCVVRFIiwgImJpbmRBcmd1bWVudHMiLCAicGF0Y2hQcm90b3R5cGUiLCAicHJvdG90eXBlIiwgImZuTmFtZXMiLCAicHJvdG90eXBlRGVzYyIsICJpc1Byb3BlcnR5V3JpdGFibGUiLCAicGF0Y2hlZCIsICJhdHRhY2hPcmlnaW5Ub1BhdGNoZWQiLCAicHJvcGVydHlEZXNjIiwgImlzV2ViV29ya2VyIiwgImlzTm9kZSIsICJpc0Jyb3dzZXIiLCAiaXNNaXgiLCAiem9uZVN5bWJvbEV2ZW50TmFtZXMkMSIsICJlbmFibGVCZWZvcmV1bmxvYWRTeW1ib2wiLCAid3JhcEZuIiwgImV2ZW50TmFtZVN5bWJvbCIsICJyZXN1bHQiLCAiZXJyb3JFdmVudCIsICJwYXRjaFByb3BlcnR5IiwgInByb3AiLCAiZGVzYyIsICJvblByb3BQYXRjaGVkU3ltYm9sIiwgIm9yaWdpbmFsRGVzY0dldCIsICJvcmlnaW5hbERlc2NTZXQiLCAiZXZlbnROYW1lIiwgIm5ld1ZhbHVlIiwgInBhdGNoT25Qcm9wZXJ0aWVzIiwgInByb3BlcnRpZXMiLCAib25Qcm9wZXJ0aWVzIiwgImoiLCAib3JpZ2luYWxJbnN0YW5jZUtleSIsICJwYXRjaENsYXNzIiwgImNsYXNzTmFtZSIsICJPcmlnaW5hbENsYXNzIiwgImEiLCAiaW5zdGFuY2UiLCAicGF0Y2hNZXRob2QiLCAicGF0Y2hGbiIsICJwcm90byIsICJkZWxlZ2F0ZU5hbWUiLCAicGF0Y2hEZWxlZ2F0ZSIsICJwYXRjaE1hY3JvVGFzayIsICJmdW5jTmFtZSIsICJtZXRhQ3JlYXRvciIsICJzZXROYXRpdmUiLCAic2NoZWR1bGVUYXNrIiwgIm1ldGEiLCAiaXNEZXRlY3RlZElFT3JFZGdlIiwgImllT3JFZGdlIiwgImlzSUUiLCAidWEiLCAiaXNJRU9yRWRnZSIsICJpc0Z1bmN0aW9uIiwgImlzTnVtYmVyIiwgInBhc3NpdmVTdXBwb3J0ZWQiLCAiT1BUSU1JWkVEX1pPTkVfRVZFTlRfVEFTS19EQVRBIiwgInpvbmVTeW1ib2xFdmVudE5hbWVzIiwgImdsb2JhbFNvdXJjZXMiLCAiRVZFTlRfTkFNRV9TWU1CT0xfUkVHWCIsICJJTU1FRElBVEVfUFJPUEFHQVRJT05fU1lNQk9MIiwgInByZXBhcmVFdmVudE5hbWVzIiwgImV2ZW50TmFtZVRvU3RyaW5nIiwgImZhbHNlRXZlbnROYW1lIiwgInRydWVFdmVudE5hbWUiLCAic3ltYm9sIiwgInN5bWJvbENhcHR1cmUiLCAicGF0Y2hFdmVudFRhcmdldCIsICJhcGkiLCAiYXBpcyIsICJwYXRjaE9wdGlvbnMiLCAiQUREX0VWRU5UX0xJU1RFTkVSIiwgIlJFTU9WRV9FVkVOVF9MSVNURU5FUiIsICJMSVNURU5FUlNfRVZFTlRfTElTVEVORVIiLCAiUkVNT1ZFX0FMTF9MSVNURU5FUlNfRVZFTlRfTElTVEVORVIiLCAiem9uZVN5bWJvbEFkZEV2ZW50TGlzdGVuZXIiLCAiQUREX0VWRU5UX0xJU1RFTkVSX1NPVVJDRSIsICJQUkVQRU5EX0VWRU5UX0xJU1RFTkVSIiwgIlBSRVBFTkRfRVZFTlRfTElTVEVORVJfU09VUkNFIiwgImludm9rZVRhc2siLCAiZ2xvYmFsQ2FsbGJhY2siLCAiaXNDYXB0dXJlIiwgInRhc2tzIiwgImVycm9ycyIsICJjb3B5VGFza3MiLCAiZ2xvYmFsWm9uZUF3YXJlQ2FsbGJhY2siLCAiZ2xvYmFsWm9uZUF3YXJlQ2FwdHVyZUNhbGxiYWNrIiwgInBhdGNoRXZlbnRUYXJnZXRNZXRob2RzIiwgInVzZUdsb2JhbENhbGxiYWNrIiwgInZhbGlkYXRlSGFuZGxlciIsICJyZXR1cm5UYXJnZXQiLCAidGFza0RhdGEiLCAibmF0aXZlQWRkRXZlbnRMaXN0ZW5lciIsICJuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyIiwgIm5hdGl2ZUxpc3RlbmVycyIsICJuYXRpdmVSZW1vdmVBbGxMaXN0ZW5lcnMiLCAibmF0aXZlUHJlcGVuZEV2ZW50TGlzdGVuZXIiLCAiYnVpbGRFdmVudExpc3RlbmVyT3B0aW9ucyIsICJwYXNzaXZlIiwgImN1c3RvbVNjaGVkdWxlR2xvYmFsIiwgImN1c3RvbUNhbmNlbEdsb2JhbCIsICJzeW1ib2xFdmVudE5hbWVzIiwgInN5bWJvbEV2ZW50TmFtZSIsICJleGlzdGluZ1Rhc2tzIiwgImN1c3RvbVNjaGVkdWxlTm9uR2xvYmFsIiwgImN1c3RvbVNjaGVkdWxlUHJlcGVuZCIsICJjdXN0b21DYW5jZWxOb25HbG9iYWwiLCAiY29tcGFyZVRhc2tDYWxsYmFja1ZzRGVsZWdhdGUiLCAidHlwZU9mRGVsZWdhdGUiLCAiY29tcGFyZSIsICJ1bnBhdGNoZWRFdmVudHMiLCAicGFzc2l2ZUV2ZW50cyIsICJjb3B5RXZlbnRMaXN0ZW5lck9wdGlvbnMiLCAibmV3T3B0aW9ucyIsICJtYWtlQWRkTGlzdGVuZXIiLCAibmF0aXZlTGlzdGVuZXIiLCAiYWRkU291cmNlIiwgImN1c3RvbVNjaGVkdWxlRm4iLCAiY3VzdG9tQ2FuY2VsRm4iLCAicHJlcGVuZCIsICJpc0hhbmRsZUV2ZW50IiwgInNpZ25hbCIsICJjYXB0dXJlIiwgIm9uY2UiLCAiaXNFeGlzdGluZyIsICJjb25zdHJ1Y3Rvck5hbWUiLCAidGFyZ2V0U291cmNlIiwgIm9uQWJvcnQiLCAiZXhpc3RpbmdUYXNrIiwgIm9uUHJvcGVydHlTeW1ib2wiLCAiZmluZEV2ZW50VGFza3MiLCAic3ltYm9sQ2FwdHVyZUV2ZW50TmFtZSIsICJjYXB0dXJlVGFza3MiLCAicmVtb3ZlVGFza3MiLCAia2V5cyIsICJtYXRjaCIsICJldnROYW1lIiwgInJlc3VsdHMiLCAiZm91bmRUYXNrcyIsICJjYXB0dXJlRmFsc2VUYXNrcyIsICJjYXB0dXJlVHJ1ZVRhc2tzIiwgInBhdGNoRXZlbnRQcm90b3R5cGUiLCAiRXZlbnQiLCAicGF0Y2hRdWV1ZU1pY3JvdGFzayIsICJ0YXNrU3ltYm9sIiwgInBhdGNoVGltZXIiLCAid2luZG93IiwgInNldE5hbWUiLCAiY2FuY2VsTmFtZSIsICJuYW1lU3VmZml4IiwgImNsZWFyTmF0aXZlIiwgInRhc2tzQnlIYW5kbGVJZCIsICJoYW5kbGVPcklkIiwgImNsZWFyVGFzayIsICJoYW5kbGUiLCAiaGFuZGxlSWQiLCAib3JpZ2luYWxSZWZyZXNoIiwgImlkIiwgInBhdGNoQ3VzdG9tRWxlbWVudHMiLCAiY2FsbGJhY2tzIiwgImV2ZW50VGFyZ2V0UGF0Y2giLCAiZXZlbnROYW1lcyIsICJFVkVOVF9UQVJHRVQiLCAicGF0Y2hFdmVudCIsICJmaWx0ZXJQcm9wZXJ0aWVzIiwgImlnbm9yZVByb3BlcnRpZXMiLCAidGlwIiwgImlwIiwgInRhcmdldElnbm9yZVByb3BlcnRpZXMiLCAib3AiLCAicGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMiLCAiZmlsdGVyZWRQcm9wZXJ0aWVzIiwgImdldE9uRXZlbnROYW1lcyIsICJwcm9wZXJ0eURlc2NyaXB0b3JQYXRjaCIsICJwYXRjaFRhcmdldHMiLCAiaWdub3JlRXJyb3JQcm9wZXJ0aWVzIiwgInBhdGNoQnJvd3NlciIsICJab25lIiwgImxlZ2FjeVBhdGNoIiwgInNldCIsICJjbGVhciIsICJibG9ja2luZ01ldGhvZHMiLCAicyIsICJYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0IiwgInBhdGNoWEhSIiwgIlhIUl9UQVNLIiwgIlhIUl9TWU5DIiwgIlhIUl9MSVNURU5FUiIsICJYSFJfU0NIRURVTEVEIiwgIlhIUl9VUkwiLCAiWEhSX0VSUk9SX0JFRk9SRV9TQ0hFRFVMRUQiLCAiWE1MSHR0cFJlcXVlc3QiLCAiWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUiLCAiZmluZFBlbmRpbmdUYXNrIiwgIm9yaUFkZExpc3RlbmVyIiwgIm9yaVJlbW92ZUxpc3RlbmVyIiwgIlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXRQcm90b3R5cGUiLCAiUkVBRFlfU1RBVEVfQ0hBTkdFIiwgIlNDSEVEVUxFRCIsICJuZXdMaXN0ZW5lciIsICJsb2FkVGFza3MiLCAib3JpSW52b2tlIiwgInNlbmROYXRpdmUiLCAicGxhY2Vob2xkZXJDYWxsYmFjayIsICJhYm9ydE5hdGl2ZSIsICJvcGVuTmF0aXZlIiwgIlhNTEhUVFBSRVFVRVNUX1NPVVJDRSIsICJmZXRjaFRhc2tBYm9ydGluZyIsICJmZXRjaFRhc2tTY2hlZHVsaW5nIiwgImZpbmRQcm9taXNlUmVqZWN0aW9uSGFuZGxlciIsICJlIiwgIlByb21pc2VSZWplY3Rpb25FdmVudCIsICJldnQiLCAicGF0Y2hQcm9taXNlIiwgInJlYWRhYmxlT2JqZWN0VG9TdHJpbmciLCAiX3VuY2F1Z2h0UHJvbWlzZUVycm9ycyIsICJpc0Rpc2FibGVXcmFwcGluZ1VuY2F1Z2h0UHJvbWlzZVJlamVjdGlvbiIsICJjcmVhdGlvblRyYWNlIiwgInJlamVjdGlvbiIsICJ1bmNhdWdodFByb21pc2VFcnJvciIsICJoYW5kbGVVbmhhbmRsZWRSZWplY3Rpb24iLCAiVU5IQU5ETEVEX1BST01JU0VfUkVKRUNUSU9OX0hBTkRMRVJfU1lNQk9MIiwgImhhbmRsZXIiLCAiaXNUaGVuYWJsZSIsICJmb3J3YXJkUmVzb2x1dGlvbiIsICJmb3J3YXJkUmVqZWN0aW9uIiwgIlpvbmVBd2FyZVByb21pc2UiLCAic3ltYm9sU3RhdGUiLCAic3ltYm9sVmFsdWUiLCAic3ltYm9sRmluYWxseSIsICJzeW1ib2xQYXJlbnRQcm9taXNlVmFsdWUiLCAic3ltYm9sUGFyZW50UHJvbWlzZVN0YXRlIiwgIlVOUkVTT0xWRUQiLCAiUkVTT0xWRUQiLCAiUkVKRUNURUQiLCAiUkVKRUNURURfTk9fQ0FUQ0giLCAibWFrZVJlc29sdmVyIiwgInByb21pc2UiLCAidiIsICJyZXNvbHZlUHJvbWlzZSIsICJ3YXNDYWxsZWQiLCAid3JhcHBlZEZ1bmN0aW9uIiwgIlRZUEVfRVJST1IiLCAiQ1VSUkVOVF9UQVNLX1RSQUNFX1NZTUJPTCIsICJvbmNlV3JhcHBlciIsICJ0aGVuIiwgImNsZWFyUmVqZWN0ZWROb0NhdGNoIiwgInRyYWNlIiwgInNjaGVkdWxlUmVzb2x2ZU9yUmVqZWN0IiwgIlJFSkVDVElPTl9IQU5ETEVEX0hBTkRMRVIiLCAiY2hhaW5Qcm9taXNlIiwgIm9uRnVsZmlsbGVkIiwgIm9uUmVqZWN0ZWQiLCAicHJvbWlzZVN0YXRlIiwgInBhcmVudFByb21pc2VWYWx1ZSIsICJpc0ZpbmFsbHlQcm9taXNlIiwgIlpPTkVfQVdBUkVfUFJPTUlTRV9UT19TVFJJTkciLCAiQWdncmVnYXRlRXJyb3IiLCAicmVzIiwgInJlaiIsICJ2YWx1ZXMiLCAicHJvbWlzZXMiLCAiZmluaXNoZWQiLCAicmVzb2x2ZSIsICJyZWplY3QiLCAib25SZXNvbHZlIiwgIm9uUmVqZWN0IiwgInVucmVzb2x2ZWRDb3VudCIsICJ2YWx1ZUluZGV4IiwgInJlc29sdmVkVmFsdWVzIiwgImN1clZhbHVlSW5kZXgiLCAidGhlbkVyciIsICJleGVjdXRvciIsICJDIiwgIm9uRmluYWxseSIsICJOYXRpdmVQcm9taXNlIiwgInN5bWJvbFRoZW5QYXRjaGVkIiwgInBhdGNoVGhlbiIsICJDdG9yIiwgIm9yaWdpbmFsVGhlbiIsICJ6b25laWZ5IiwgInJlc3VsdFByb21pc2UiLCAiY3RvciIsICJwYXRjaFRvU3RyaW5nIiwgIm9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZyIsICJPUklHSU5BTF9ERUxFR0FURV9TWU1CT0wiLCAiUFJPTUlTRV9TWU1CT0wiLCAiRVJST1JfU1lNQk9MIiwgIm5ld0Z1bmN0aW9uVG9TdHJpbmciLCAib3JpZ2luYWxEZWxlZ2F0ZSIsICJuYXRpdmVQcm9taXNlIiwgIm5hdGl2ZUVycm9yIiwgIm9yaWdpbmFsT2JqZWN0VG9TdHJpbmciLCAiUFJPTUlTRV9PQkpFQ1RfVE9fU1RSSU5HIiwgInBhdGNoQ2FsbGJhY2tzIiwgInRhcmdldE5hbWUiLCAibWV0aG9kIiwgIm5hdGl2ZURlbGVnYXRlIiwgImRlc2NyaXB0b3IiLCAicGF0Y2hVdGlsIiwgIlNZTUJPTF9CTEFDS19MSVNURURfRVZFTlRTIiwgIlNZTUJPTF9VTlBBVENIRURfRVZFTlRTIiwgInBhdGNoQ29tbW9uIiwgIlpvbmUkMSJdCn0K