@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,10 +1,10 @@
1
- import { f as nt, t as _, i as it, T as L, d as ot, c as T, I as at, S as st } from "./index-DlrGfmQY.js";
2
- import { d } from "./diag-api-DAsRXs3b.js";
3
- import { l as V, n as ut, o as M, j as lt, m as C, q as pt, r as dt, s as N, v as B, w as ft, x as ct, p as ht, y as k } from "./url-CwONqRT7.js";
4
- import { i as _t, s as R, g as h, a as mt, u as vt, B as Z, b as St, S as H, C as yt, W as Et, c as Tt, m as gt, d as Lt } from "./index-Bih9tP98.js";
5
- import { T as v, h as A, i as Pt, D as At, j as wt } from "./sdk-info-CKnpG_QI.js";
6
- import { R as Q } from "./Resource-ByOJ8tkj.js";
7
- import { E as w } from "./ExportResult-Bo1QOwfo.js";
1
+ import { f as nt, t as _, i as it, T as L, d as ot, c as T, I as at, S as st } from "./index-Xxndn7Y1.js";
2
+ import { d } from "./diag-api-D9IWSUsW.js";
3
+ import { l as V, n as ut, o as M, j as lt, m as C, q as pt, r as dt, s as N, v as B, w as ft, x as ct, p as ht, y as k } from "./url-Cnrlns-i.js";
4
+ import { i as _t, s as R, g as h, a as mt, u as vt, B as Z, b as St, S as H, C as yt, W as Et, c as Tt, m as gt, d as Lt } from "./index-DQ3qlDEd.js";
5
+ import { T as v, h as A, i as Pt, D as At, j as wt } from "./sdk-info-DiazhyI_.js";
6
+ import { R as Q } from "./Resource-Bx_VuhUk.js";
7
+ import { E as w } from "./ExportResult-B-YLKMaU.js";
8
8
  var bt = "exception", U = function() {
9
9
  return U = Object.assign || function(e) {
10
10
  for (var t, r = 1, n = arguments.length; r < n; r++) {
@@ -954,4 +954,4 @@ export {
954
954
  P as d,
955
955
  Ot as e
956
956
  };
957
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiU2ltcGxlU3BhblByb2Nlc3Nvci0hfnswMDJ9fi5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgZiBhcyBTcGFuU3RhdHVzQ29kZSwgdCBhcyB0cmFjZSwgaSBhcyBpc1NwYW5Db250ZXh0VmFsaWQsIFQgYXMgVHJhY2VGbGFncywgZCBhcyBpc1ZhbGlkVHJhY2VJZCwgYyBhcyBjb250ZXh0LCBJIGFzIElOVkFMSURfU1BBTl9DT05URVhULCBTIGFzIFNwYW5LaW5kIH0gZnJvbSAnLi9pbmRleC0hfnswMDV9fi5qcyc7XG5pbXBvcnQgeyBkIGFzIGRpYWcgfSBmcm9tICcuL2RpYWctYXBpLSF+ezAwNH1+LmpzJztcbmltcG9ydCB7IGwgYXMgaXNUaW1lSW5wdXQsIG4gYXMgaHJUaW1lRHVyYXRpb24sIG8gYXMgb3RwZXJmb3JtYW5jZSwgaiBhcyBoclRpbWUsIG0gYXMgbWlsbGlzVG9IclRpbWUsIHEgYXMgaXNUaW1lSW5wdXRIclRpbWUsIHIgYXMgYWRkSHJUaW1lcywgcyBhcyBTRU1BVFRSU19FWENFUFRJT05fVFlQRSwgdiBhcyBTRU1BVFRSU19FWENFUFRJT05fTUVTU0FHRSwgdyBhcyBnZXRUaW1lT3JpZ2luLCB4IGFzIFNFTUFUVFJTX0VYQ0VQVElPTl9TVEFDS1RSQUNFLCBwIGFzIHByb3BhZ2F0aW9uLCB5IGFzIGhyVGltZVRvTWljcm9zZWNvbmRzIH0gZnJvbSAnLi91cmwtIX57MDA4fX4uanMnO1xuaW1wb3J0IHsgaSBhcyBpc0F0dHJpYnV0ZVZhbHVlLCBzIGFzIHNhbml0aXplQXR0cmlidXRlcywgZyBhcyBnbG9iYWxFcnJvckhhbmRsZXIsIGEgYXMgc3VwcHJlc3NUcmFjaW5nLCB1IGFzIHVucmVmVGltZXIsIEIgYXMgQmluZE9uY2VGdXR1cmUsIGIgYXMgaXNUcmFjaW5nU3VwcHJlc3NlZCwgUyBhcyBTYW1wbGluZ0RlY2lzaW9uJDEsIEMgYXMgQ29tcG9zaXRlUHJvcGFnYXRvciwgVyBhcyBXM0NUcmFjZUNvbnRleHRQcm9wYWdhdG9yLCBjIGFzIFczQ0JhZ2dhZ2VQcm9wYWdhdG9yLCBtIGFzIG1lcmdlLCBkIGFzIGludGVybmFsIH0gZnJvbSAnLi9pbmRleC0hfnswMGt9fi5qcyc7XG5pbXBvcnQgeyBUIGFzIFRyYWNlc1NhbXBsZXJWYWx1ZXMsIGggYXMgZ2V0RW52LCBpIGFzIGdldEVudldpdGhvdXREZWZhdWx0cywgRCBhcyBERUZBVUxUX0FUVFJJQlVURV9DT1VOVF9MSU1JVCwgaiBhcyBERUZBVUxUX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQgfSBmcm9tICcuL3Nkay1pbmZvLSF+ezAwYX1+LmpzJztcbmltcG9ydCB7IFIgYXMgUmVzb3VyY2UgfSBmcm9tICcuL1Jlc291cmNlLSF+ezAwOX1+LmpzJztcbmltcG9ydCB7IEUgYXMgRXhwb3J0UmVzdWx0Q29kZSB9IGZyb20gJy4vRXhwb3J0UmVzdWx0LSF+ezAwY31+LmpzJztcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vIEV2ZW50IG5hbWUgZGVmaW5pdGlvbnNcbnZhciBFeGNlcHRpb25FdmVudE5hbWUgPSAnZXhjZXB0aW9uJztcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBfX2Fzc2lnbiA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xudmFyIF9fdmFsdWVzJDIgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3ZhbHVlcykgfHwgZnVuY3Rpb24obykge1xuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xuICAgICAgICB9XG4gICAgfTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59O1xudmFyIF9fcmVhZCQyID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19yZWFkKSB8fCBmdW5jdGlvbiAobywgbikge1xuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgICBpZiAoIW0pIHJldHVybiBvO1xuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xuICAgIHRyeSB7XG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxuICAgIH1cbiAgICByZXR1cm4gYXI7XG59O1xudmFyIF9fc3ByZWFkQXJyYXkkMiA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fc3ByZWFkQXJyYXkpIHx8IGZ1bmN0aW9uICh0bywgZnJvbSwgcGFjaykge1xuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59O1xuLyoqXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBzcGFuLlxuICovXG52YXIgU3BhbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFNwYW4gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBjYWxsaW5nIFNwYW4gY29uc3RydWN0b3IgZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVzZSB0cmFjZXIuc3RhcnRTcGFuLlxuICAgICAqICovXG4gICAgZnVuY3Rpb24gU3BhbihwYXJlbnRUcmFjZXIsIGNvbnRleHQsIHNwYW5OYW1lLCBzcGFuQ29udGV4dCwga2luZCwgcGFyZW50U3BhbklkLCBsaW5rcywgc3RhcnRUaW1lLCBfZGVwcmVjYXRlZENsb2NrLCAvLyBrZWVwaW5nIHRoaXMgYXJndW1lbnQgZXZlbiB0aG91Z2ggaXQgaXMgdW51c2VkIHRvIGVuc3VyZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKGxpbmtzID09PSB2b2lkIDApIHsgbGlua3MgPSBbXTsgfVxuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5saW5rcyA9IFtdO1xuICAgICAgICB0aGlzLmV2ZW50cyA9IFtdO1xuICAgICAgICB0aGlzLl9kcm9wcGVkQXR0cmlidXRlc0NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5fZHJvcHBlZEV2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5fZHJvcHBlZExpbmtzQ291bnQgPSAwO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHtcbiAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLlVOU0VULFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVuZFRpbWUgPSBbMCwgMF07XG4gICAgICAgIHRoaXMuX2VuZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2R1cmF0aW9uID0gWy0xLCAtMV07XG4gICAgICAgIHRoaXMubmFtZSA9IHNwYW5OYW1lO1xuICAgICAgICB0aGlzLl9zcGFuQ29udGV4dCA9IHNwYW5Db250ZXh0O1xuICAgICAgICB0aGlzLnBhcmVudFNwYW5JZCA9IHBhcmVudFNwYW5JZDtcbiAgICAgICAgdGhpcy5raW5kID0ga2luZDtcbiAgICAgICAgdGhpcy5saW5rcyA9IGxpbmtzO1xuICAgICAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdGhpcy5fcGVyZm9ybWFuY2VTdGFydFRpbWUgPSBvdHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICB0aGlzLl9wZXJmb3JtYW5jZU9mZnNldCA9XG4gICAgICAgICAgICBub3cgLSAodGhpcy5fcGVyZm9ybWFuY2VTdGFydFRpbWUgKyBnZXRUaW1lT3JpZ2luKCkpO1xuICAgICAgICB0aGlzLl9zdGFydFRpbWVQcm92aWRlZCA9IHN0YXJ0VGltZSAhPSBudWxsO1xuICAgICAgICB0aGlzLnN0YXJ0VGltZSA9IHRoaXMuX2dldFRpbWUoc3RhcnRUaW1lICE9PSBudWxsICYmIHN0YXJ0VGltZSAhPT0gdm9pZCAwID8gc3RhcnRUaW1lIDogbm93KTtcbiAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHBhcmVudFRyYWNlci5yZXNvdXJjZTtcbiAgICAgICAgdGhpcy5pbnN0cnVtZW50YXRpb25MaWJyYXJ5ID0gcGFyZW50VHJhY2VyLmluc3RydW1lbnRhdGlvbkxpYnJhcnk7XG4gICAgICAgIHRoaXMuX3NwYW5MaW1pdHMgPSBwYXJlbnRUcmFjZXIuZ2V0U3BhbkxpbWl0cygpO1xuICAgICAgICB0aGlzLl9hdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0ID1cbiAgICAgICAgICAgIHRoaXMuX3NwYW5MaW1pdHMuYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdCB8fCAwO1xuICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3BhblByb2Nlc3NvciA9IHBhcmVudFRyYWNlci5nZXRBY3RpdmVTcGFuUHJvY2Vzc29yKCk7XG4gICAgICAgIHRoaXMuX3NwYW5Qcm9jZXNzb3Iub25TdGFydCh0aGlzLCBjb250ZXh0KTtcbiAgICB9XG4gICAgU3Bhbi5wcm90b3R5cGUuc3BhbkNvbnRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zcGFuQ29udGV4dDtcbiAgICB9O1xuICAgIFNwYW4ucHJvdG90eXBlLnNldEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHRoaXMuX2lzU3BhbkVuZGVkKCkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgaWYgKGtleS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGRpYWcud2FybihcIkludmFsaWQgYXR0cmlidXRlIGtleTogXCIgKyBrZXkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0F0dHJpYnV0ZVZhbHVlKHZhbHVlKSkge1xuICAgICAgICAgICAgZGlhZy53YXJuKFwiSW52YWxpZCBhdHRyaWJ1dGUgdmFsdWUgc2V0IGZvciBrZXk6IFwiICsga2V5KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmF0dHJpYnV0ZXMpLmxlbmd0aCA+PVxuICAgICAgICAgICAgdGhpcy5fc3BhbkxpbWl0cy5hdHRyaWJ1dGVDb3VudExpbWl0ICYmXG4gICAgICAgICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuYXR0cmlidXRlcywga2V5KSkge1xuICAgICAgICAgICAgdGhpcy5fZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCsrO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzW2tleV0gPSB0aGlzLl90cnVuY2F0ZVRvU2l6ZSh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgU3Bhbi5wcm90b3R5cGUuc2V0QXR0cmlidXRlcyA9IGZ1bmN0aW9uIChhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHZhciBlXzEsIF9hO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyQyKE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBfZCA9IF9fcmVhZCQyKF9jLnZhbHVlLCAyKSwgayA9IF9kWzBdLCB2ID0gX2RbMV07XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoaywgdik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgU3BhbiBOYW1lXG4gICAgICogQHBhcmFtIFthdHRyaWJ1dGVzT3JTdGFydFRpbWVdIFNwYW4gYXR0cmlidXRlcyBvciBzdGFydCB0aW1lXG4gICAgICogICAgIGlmIHR5cGUgaXMge0B0eXBlIFRpbWVJbnB1dH0gYW5kIDNyZCBwYXJhbSBpcyB1bmRlZmluZWRcbiAgICAgKiBAcGFyYW0gW3RpbWVTdGFtcF0gU3BlY2lmaWVkIHRpbWUgc3RhbXAgZm9yIHRoZSBldmVudFxuICAgICAqL1xuICAgIFNwYW4ucHJvdG90eXBlLmFkZEV2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIGF0dHJpYnV0ZXNPclN0YXJ0VGltZSwgdGltZVN0YW1wKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc1NwYW5FbmRlZCgpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGlmICh0aGlzLl9zcGFuTGltaXRzLmV2ZW50Q291bnRMaW1pdCA9PT0gMCkge1xuICAgICAgICAgICAgZGlhZy53YXJuKCdObyBldmVudHMgYWxsb3dlZC4nKTtcbiAgICAgICAgICAgIHRoaXMuX2Ryb3BwZWRFdmVudHNDb3VudCsrO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZXZlbnRzLmxlbmd0aCA+PSB0aGlzLl9zcGFuTGltaXRzLmV2ZW50Q291bnRMaW1pdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2Ryb3BwZWRFdmVudHNDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGRpYWcuZGVidWcoJ0Ryb3BwaW5nIGV4dHJhIGV2ZW50cy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNoaWZ0KCk7XG4gICAgICAgICAgICB0aGlzLl9kcm9wcGVkRXZlbnRzQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNUaW1lSW5wdXQoYXR0cmlidXRlc09yU3RhcnRUaW1lKSkge1xuICAgICAgICAgICAgaWYgKCFpc1RpbWVJbnB1dCh0aW1lU3RhbXApKSB7XG4gICAgICAgICAgICAgICAgdGltZVN0YW1wID0gYXR0cmlidXRlc09yU3RhcnRUaW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXR0cmlidXRlc09yU3RhcnRUaW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhdHRyaWJ1dGVzID0gc2FuaXRpemVBdHRyaWJ1dGVzKGF0dHJpYnV0ZXNPclN0YXJ0VGltZSk7XG4gICAgICAgIHRoaXMuZXZlbnRzLnB1c2goe1xuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXMsXG4gICAgICAgICAgICB0aW1lOiB0aGlzLl9nZXRUaW1lKHRpbWVTdGFtcCksXG4gICAgICAgICAgICBkcm9wcGVkQXR0cmlidXRlc0NvdW50OiAwLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBTcGFuLnByb3RvdHlwZS5hZGRMaW5rID0gZnVuY3Rpb24gKGxpbmspIHtcbiAgICAgICAgdGhpcy5saW5rcy5wdXNoKGxpbmspO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFNwYW4ucHJvdG90eXBlLmFkZExpbmtzID0gZnVuY3Rpb24gKGxpbmtzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy5saW5rcykucHVzaC5hcHBseShfYSwgX19zcHJlYWRBcnJheSQyKFtdLCBfX3JlYWQkMihsaW5rcyksIGZhbHNlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgU3Bhbi5wcm90b3R5cGUuc2V0U3RhdHVzID0gZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICBpZiAodGhpcy5faXNTcGFuRW5kZWQoKSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IF9fYXNzaWduKHt9LCBzdGF0dXMpO1xuICAgICAgICAvLyBXaGVuIHVzaW5nIHRyeS1jYXRjaCwgdGhlIGNhdWdodCBcImVycm9yXCIgaXMgb2YgdHlwZSBgYW55YC4gV2hlbiB0aGVuIGFzc2lnbmluZyBgYW55YCB0byBgc3RhdHVzLm1lc3NhZ2VgLFxuICAgICAgICAvLyBUeXBlU2NyaXB0IHdpbGwgbm90IGVycm9yLiBXaGlsZSB0aGlzIGNhbiBoYXBwZW4gZHVyaW5nIHVzZSBvZiBhbnkgQVBJLCBpdCBpcyBtb3JlIGNvbW1vbiBvbiBTcGFuI3NldFN0YXR1cygpXG4gICAgICAgIC8vIGFzIGl0J3MgbGlrZWx5IHVzZWQgaW4gYSBjYXRjaC1ibG9jay4gVGhlcmVmb3JlLCB3ZSB2YWxpZGF0ZSBpZiBgc3RhdHVzLm1lc3NhZ2VgIGlzIGFjdHVhbGx5IGEgc3RyaW5nLCBudWxsLCBvclxuICAgICAgICAvLyB1bmRlZmluZWQgdG8gYXZvaWQgYW4gaW5jb3JyZWN0IHR5cGUgY2F1c2luZyBpc3N1ZXMgZG93bnN0cmVhbS5cbiAgICAgICAgaWYgKHRoaXMuc3RhdHVzLm1lc3NhZ2UgIT0gbnVsbCAmJiB0eXBlb2Ygc3RhdHVzLm1lc3NhZ2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBkaWFnLndhcm4oXCJEcm9wcGluZyBpbnZhbGlkIHN0YXR1cy5tZXNzYWdlIG9mIHR5cGUgJ1wiICsgdHlwZW9mIHN0YXR1cy5tZXNzYWdlICsgXCInLCBleHBlY3RlZCAnc3RyaW5nJ1wiKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN0YXR1cy5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgU3Bhbi5wcm90b3R5cGUudXBkYXRlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc1NwYW5FbmRlZCgpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgU3Bhbi5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGVuZFRpbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzU3BhbkVuZGVkKCkpIHtcbiAgICAgICAgICAgIGRpYWcuZXJyb3IodGhpcy5uYW1lICsgXCIgXCIgKyB0aGlzLl9zcGFuQ29udGV4dC50cmFjZUlkICsgXCItXCIgKyB0aGlzLl9zcGFuQ29udGV4dC5zcGFuSWQgKyBcIiAtIFlvdSBjYW4gb25seSBjYWxsIGVuZCgpIG9uIGEgc3BhbiBvbmNlLlwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9lbmRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZW5kVGltZSA9IHRoaXMuX2dldFRpbWUoZW5kVGltZSk7XG4gICAgICAgIHRoaXMuX2R1cmF0aW9uID0gaHJUaW1lRHVyYXRpb24odGhpcy5zdGFydFRpbWUsIHRoaXMuZW5kVGltZSk7XG4gICAgICAgIGlmICh0aGlzLl9kdXJhdGlvblswXSA8IDApIHtcbiAgICAgICAgICAgIGRpYWcud2FybignSW5jb25zaXN0ZW50IHN0YXJ0IGFuZCBlbmQgdGltZSwgc3RhcnRUaW1lID4gZW5kVGltZS4gU2V0dGluZyBzcGFuIGR1cmF0aW9uIHRvIDBtcy4nLCB0aGlzLnN0YXJ0VGltZSwgdGhpcy5lbmRUaW1lKTtcbiAgICAgICAgICAgIHRoaXMuZW5kVGltZSA9IHRoaXMuc3RhcnRUaW1lLnNsaWNlKCk7XG4gICAgICAgICAgICB0aGlzLl9kdXJhdGlvbiA9IFswLCAwXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZHJvcHBlZEV2ZW50c0NvdW50ID4gMCkge1xuICAgICAgICAgICAgZGlhZy53YXJuKFwiRHJvcHBlZCBcIiArIHRoaXMuX2Ryb3BwZWRFdmVudHNDb3VudCArIFwiIGV2ZW50cyBiZWNhdXNlIGV2ZW50Q291bnRMaW1pdCByZWFjaGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NwYW5Qcm9jZXNzb3Iub25FbmQodGhpcyk7XG4gICAgfTtcbiAgICBTcGFuLnByb3RvdHlwZS5fZ2V0VGltZSA9IGZ1bmN0aW9uIChpbnApIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnAgPT09ICdudW1iZXInICYmIGlucCA8PSBvdHBlcmZvcm1hbmNlLm5vdygpKSB7XG4gICAgICAgICAgICAvLyBtdXN0IGJlIGEgcGVyZm9ybWFuY2UgdGltZXN0YW1wXG4gICAgICAgICAgICAvLyBhcHBseSBjb3JyZWN0aW9uIGFuZCBjb252ZXJ0IHRvIGhydGltZVxuICAgICAgICAgICAgcmV0dXJuIGhyVGltZShpbnAgKyB0aGlzLl9wZXJmb3JtYW5jZU9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBpbnAgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gbWlsbGlzVG9IclRpbWUoaW5wKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5wIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbGxpc1RvSHJUaW1lKGlucC5nZXRUaW1lKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1RpbWVJbnB1dEhyVGltZShpbnApKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9zdGFydFRpbWVQcm92aWRlZCkge1xuICAgICAgICAgICAgLy8gaWYgdXNlciBwcm92aWRlZCBhIHRpbWUgZm9yIHRoZSBzdGFydCBtYW51YWxseVxuICAgICAgICAgICAgLy8gd2UgY2FuJ3QgdXNlIGR1cmF0aW9uIHRvIGNhbGN1bGF0ZSBldmVudC9lbmQgdGltZXNcbiAgICAgICAgICAgIHJldHVybiBtaWxsaXNUb0hyVGltZShEYXRlLm5vdygpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbXNEdXJhdGlvbiA9IG90cGVyZm9ybWFuY2Uubm93KCkgLSB0aGlzLl9wZXJmb3JtYW5jZVN0YXJ0VGltZTtcbiAgICAgICAgcmV0dXJuIGFkZEhyVGltZXModGhpcy5zdGFydFRpbWUsIG1pbGxpc1RvSHJUaW1lKG1zRHVyYXRpb24pKTtcbiAgICB9O1xuICAgIFNwYW4ucHJvdG90eXBlLmlzUmVjb3JkaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5kZWQgPT09IGZhbHNlO1xuICAgIH07XG4gICAgU3Bhbi5wcm90b3R5cGUucmVjb3JkRXhjZXB0aW9uID0gZnVuY3Rpb24gKGV4Y2VwdGlvbiwgdGltZSkge1xuICAgICAgICB2YXIgYXR0cmlidXRlcyA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGV4Y2VwdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXNbU0VNQVRUUlNfRVhDRVBUSU9OX01FU1NBR0VdID0gZXhjZXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbi5jb2RlKSB7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRlc1tTRU1BVFRSU19FWENFUFRJT05fVFlQRV0gPSBleGNlcHRpb24uY29kZS50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZXhjZXB0aW9uLm5hbWUpIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzW1NFTUFUVFJTX0VYQ0VQVElPTl9UWVBFXSA9IGV4Y2VwdGlvbi5uYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbi5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRlc1tTRU1BVFRSU19FWENFUFRJT05fTUVTU0FHRV0gPSBleGNlcHRpb24ubWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChleGNlcHRpb24uc3RhY2spIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzW1NFTUFUVFJTX0VYQ0VQVElPTl9TVEFDS1RSQUNFXSA9IGV4Y2VwdGlvbi5zdGFjaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyB0aGVzZSBhcmUgbWluaW11bSByZXF1aXJlbWVudHMgZnJvbSBzcGVjXG4gICAgICAgIGlmIChhdHRyaWJ1dGVzW1NFTUFUVFJTX0VYQ0VQVElPTl9UWVBFXSB8fFxuICAgICAgICAgICAgYXR0cmlidXRlc1tTRU1BVFRSU19FWENFUFRJT05fTUVTU0FHRV0pIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnQoRXhjZXB0aW9uRXZlbnROYW1lLCBhdHRyaWJ1dGVzLCB0aW1lKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRpYWcud2FybihcIkZhaWxlZCB0byByZWNvcmQgYW4gZXhjZXB0aW9uIFwiICsgZXhjZXB0aW9uKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNwYW4ucHJvdG90eXBlLCBcImR1cmF0aW9uXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZHVyYXRpb247XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3Bhbi5wcm90b3R5cGUsIFwiZW5kZWRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmRlZDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTcGFuLnByb3RvdHlwZSwgXCJkcm9wcGVkQXR0cmlidXRlc0NvdW50XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZHJvcHBlZEF0dHJpYnV0ZXNDb3VudDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTcGFuLnByb3RvdHlwZSwgXCJkcm9wcGVkRXZlbnRzQ291bnRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kcm9wcGVkRXZlbnRzQ291bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3Bhbi5wcm90b3R5cGUsIFwiZHJvcHBlZExpbmtzQ291bnRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kcm9wcGVkTGlua3NDb3VudDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIFNwYW4ucHJvdG90eXBlLl9pc1NwYW5FbmRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2VuZGVkKSB7XG4gICAgICAgICAgICBkaWFnLndhcm4oXCJDYW4gbm90IGV4ZWN1dGUgdGhlIG9wZXJhdGlvbiBvbiBlbmRlZCBTcGFuIHt0cmFjZUlkOiBcIiArIHRoaXMuX3NwYW5Db250ZXh0LnRyYWNlSWQgKyBcIiwgc3BhbklkOiBcIiArIHRoaXMuX3NwYW5Db250ZXh0LnNwYW5JZCArIFwifVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZW5kZWQ7XG4gICAgfTtcbiAgICAvLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIHRydW5jYXRlIGdpdmVuIHZhbHVlIHdpdGhpbiBzaXplXG4gICAgLy8gZm9yIHZhbHVlIHR5cGUgb2Ygc3RyaW5nLCB3aWxsIHRydW5jYXRlIHRvIGdpdmVuIGxpbWl0XG4gICAgLy8gZm9yIHR5cGUgb2Ygbm9uLXN0cmluZywgd2lsbCByZXR1cm4gc2FtZSB2YWx1ZVxuICAgIFNwYW4ucHJvdG90eXBlLl90cnVuY2F0ZVRvTGltaXRVdGlsID0gZnVuY3Rpb24gKHZhbHVlLCBsaW1pdCkge1xuICAgICAgICBpZiAodmFsdWUubGVuZ3RoIDw9IGxpbWl0KSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlLnN1YnN0cmluZygwLCBsaW1pdCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgZ2l2ZW4gYXR0cmlidXRlIHZhbHVlIGlzIG9mIHR5cGUgc3RyaW5nIGFuZCBoYXMgbW9yZSBjaGFyYWN0ZXJzIHRoYW4gZ2l2ZW4ge0Bjb2RlIGF0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXR9IHRoZW5cbiAgICAgKiByZXR1cm4gc3RyaW5nIHdpdGggdHJ1bmNhdGVkIHRvIHtAY29kZSBhdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0fSBjaGFyYWN0ZXJzXG4gICAgICpcbiAgICAgKiBJZiB0aGUgZ2l2ZW4gYXR0cmlidXRlIHZhbHVlIGlzIGFycmF5IG9mIHN0cmluZ3MgdGhlblxuICAgICAqIHJldHVybiBuZXcgYXJyYXkgb2Ygc3RyaW5ncyB3aXRoIGVhY2ggZWxlbWVudCB0cnVuY2F0ZWQgdG8ge0Bjb2RlIGF0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXR9IGNoYXJhY3RlcnNcbiAgICAgKlxuICAgICAqIE90aGVyd2lzZSByZXR1cm4gc2FtZSBBdHRyaWJ1dGUge0Bjb2RlIHZhbHVlfVxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIEF0dHJpYnV0ZSB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHRydW5jYXRlZCBhdHRyaWJ1dGUgdmFsdWUgaWYgcmVxdWlyZWQsIG90aGVyd2lzZSBzYW1lIHZhbHVlXG4gICAgICovXG4gICAgU3Bhbi5wcm90b3R5cGUuX3RydW5jYXRlVG9TaXplID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBsaW1pdCA9IHRoaXMuX2F0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXQ7XG4gICAgICAgIC8vIENoZWNrIGxpbWl0XG4gICAgICAgIGlmIChsaW1pdCA8PSAwKSB7XG4gICAgICAgICAgICAvLyBOZWdhdGl2ZSB2YWx1ZXMgYXJlIGludmFsaWQsIHNvIGRvIG5vdCB0cnVuY2F0ZVxuICAgICAgICAgICAgZGlhZy53YXJuKFwiQXR0cmlidXRlIHZhbHVlIGxpbWl0IG11c3QgYmUgcG9zaXRpdmUsIGdvdCBcIiArIGxpbWl0KTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdHJpbmdcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90cnVuY2F0ZVRvTGltaXRVdGlsKHZhbHVlLCBsaW1pdCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXJyYXkgb2Ygc3RyaW5nc1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5tYXAoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/IF90aGlzLl90cnVuY2F0ZVRvTGltaXRVdGlsKHZhbCwgbGltaXQpIDogdmFsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3RoZXIgdHlwZXMsIG5vIG5lZWQgdG8gYXBwbHkgdmFsdWUgbGVuZ3RoIGxpbWl0XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIHJldHVybiBTcGFuO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSBzYW1wbGluZyBkZWNpc2lvbiB0aGF0IGRldGVybWluZXMgaG93IGEge0BsaW5rIFNwYW59IHdpbGwgYmUgcmVjb3JkZWRcbiAqIGFuZCBjb2xsZWN0ZWQuXG4gKi9cbnZhciBTYW1wbGluZ0RlY2lzaW9uO1xuKGZ1bmN0aW9uIChTYW1wbGluZ0RlY2lzaW9uKSB7XG4gICAgLyoqXG4gICAgICogYFNwYW4uaXNSZWNvcmRpbmcoKSA9PT0gZmFsc2VgLCBzcGFuIHdpbGwgbm90IGJlIHJlY29yZGVkIGFuZCBhbGwgZXZlbnRzXG4gICAgICogYW5kIGF0dHJpYnV0ZXMgd2lsbCBiZSBkcm9wcGVkLlxuICAgICAqL1xuICAgIFNhbXBsaW5nRGVjaXNpb25bU2FtcGxpbmdEZWNpc2lvbltcIk5PVF9SRUNPUkRcIl0gPSAwXSA9IFwiTk9UX1JFQ09SRFwiO1xuICAgIC8qKlxuICAgICAqIGBTcGFuLmlzUmVjb3JkaW5nKCkgPT09IHRydWVgLCBidXQgYFNhbXBsZWRgIGZsYWcgaW4ge0BsaW5rIFRyYWNlRmxhZ3N9XG4gICAgICogTVVTVCBOT1QgYmUgc2V0LlxuICAgICAqL1xuICAgIFNhbXBsaW5nRGVjaXNpb25bU2FtcGxpbmdEZWNpc2lvbltcIlJFQ09SRFwiXSA9IDFdID0gXCJSRUNPUkRcIjtcbiAgICAvKipcbiAgICAgKiBgU3Bhbi5pc1JlY29yZGluZygpID09PSB0cnVlYCBBTkQgYFNhbXBsZWRgIGZsYWcgaW4ge0BsaW5rIFRyYWNlRmxhZ3N9XG4gICAgICogTVVTVCBiZSBzZXQuXG4gICAgICovXG4gICAgU2FtcGxpbmdEZWNpc2lvbltTYW1wbGluZ0RlY2lzaW9uW1wiUkVDT1JEX0FORF9TQU1QTEVEXCJdID0gMl0gPSBcIlJFQ09SRF9BTkRfU0FNUExFRFwiO1xufSkoU2FtcGxpbmdEZWNpc2lvbiB8fCAoU2FtcGxpbmdEZWNpc2lvbiA9IHt9KSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogU2FtcGxlciB0aGF0IHNhbXBsZXMgbm8gdHJhY2VzLiAqL1xudmFyIEFsd2F5c09mZlNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQWx3YXlzT2ZmU2FtcGxlcigpIHtcbiAgICB9XG4gICAgQWx3YXlzT2ZmU2FtcGxlci5wcm90b3R5cGUuc2hvdWxkU2FtcGxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGVjaXNpb246IFNhbXBsaW5nRGVjaXNpb24uTk9UX1JFQ09SRCxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIEFsd2F5c09mZlNhbXBsZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJ0Fsd2F5c09mZlNhbXBsZXInO1xuICAgIH07XG4gICAgcmV0dXJuIEFsd2F5c09mZlNhbXBsZXI7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqIFNhbXBsZXIgdGhhdCBzYW1wbGVzIGFsbCB0cmFjZXMuICovXG52YXIgQWx3YXlzT25TYW1wbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFsd2F5c09uU2FtcGxlcigpIHtcbiAgICB9XG4gICAgQWx3YXlzT25TYW1wbGVyLnByb3RvdHlwZS5zaG91bGRTYW1wbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZWNpc2lvbjogU2FtcGxpbmdEZWNpc2lvbi5SRUNPUkRfQU5EX1NBTVBMRUQsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBBbHdheXNPblNhbXBsZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJ0Fsd2F5c09uU2FtcGxlcic7XG4gICAgfTtcbiAgICByZXR1cm4gQWx3YXlzT25TYW1wbGVyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSBjb21wb3NpdGUgc2FtcGxlciB0aGF0IGVpdGhlciByZXNwZWN0cyB0aGUgcGFyZW50IHNwYW4ncyBzYW1wbGluZyBkZWNpc2lvblxuICogb3IgZGVsZWdhdGVzIHRvIGBkZWxlZ2F0ZVNhbXBsZXJgIGZvciByb290IHNwYW5zLlxuICovXG52YXIgUGFyZW50QmFzZWRTYW1wbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBhcmVudEJhc2VkU2FtcGxlcihjb25maWcpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICB0aGlzLl9yb290ID0gY29uZmlnLnJvb3Q7XG4gICAgICAgIGlmICghdGhpcy5fcm9vdCkge1xuICAgICAgICAgICAgZ2xvYmFsRXJyb3JIYW5kbGVyKG5ldyBFcnJvcignUGFyZW50QmFzZWRTYW1wbGVyIG11c3QgaGF2ZSBhIHJvb3Qgc2FtcGxlciBjb25maWd1cmVkJykpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdCA9IG5ldyBBbHdheXNPblNhbXBsZXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZW1vdGVQYXJlbnRTYW1wbGVkID1cbiAgICAgICAgICAgIChfYSA9IGNvbmZpZy5yZW1vdGVQYXJlbnRTYW1wbGVkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBuZXcgQWx3YXlzT25TYW1wbGVyKCk7XG4gICAgICAgIHRoaXMuX3JlbW90ZVBhcmVudE5vdFNhbXBsZWQgPVxuICAgICAgICAgICAgKF9iID0gY29uZmlnLnJlbW90ZVBhcmVudE5vdFNhbXBsZWQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IG5ldyBBbHdheXNPZmZTYW1wbGVyKCk7XG4gICAgICAgIHRoaXMuX2xvY2FsUGFyZW50U2FtcGxlZCA9XG4gICAgICAgICAgICAoX2MgPSBjb25maWcubG9jYWxQYXJlbnRTYW1wbGVkKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBuZXcgQWx3YXlzT25TYW1wbGVyKCk7XG4gICAgICAgIHRoaXMuX2xvY2FsUGFyZW50Tm90U2FtcGxlZCA9XG4gICAgICAgICAgICAoX2QgPSBjb25maWcubG9jYWxQYXJlbnROb3RTYW1wbGVkKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBuZXcgQWx3YXlzT2ZmU2FtcGxlcigpO1xuICAgIH1cbiAgICBQYXJlbnRCYXNlZFNhbXBsZXIucHJvdG90eXBlLnNob3VsZFNhbXBsZSA9IGZ1bmN0aW9uIChjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKSB7XG4gICAgICAgIHZhciBwYXJlbnRDb250ZXh0ID0gdHJhY2UuZ2V0U3BhbkNvbnRleHQoY29udGV4dCk7XG4gICAgICAgIGlmICghcGFyZW50Q29udGV4dCB8fCAhaXNTcGFuQ29udGV4dFZhbGlkKHBhcmVudENvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcm9vdC5zaG91bGRTYW1wbGUoY29udGV4dCwgdHJhY2VJZCwgc3Bhbk5hbWUsIHNwYW5LaW5kLCBhdHRyaWJ1dGVzLCBsaW5rcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmVudENvbnRleHQuaXNSZW1vdGUpIHtcbiAgICAgICAgICAgIGlmIChwYXJlbnRDb250ZXh0LnRyYWNlRmxhZ3MgJiBUcmFjZUZsYWdzLlNBTVBMRUQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVtb3RlUGFyZW50U2FtcGxlZC5zaG91bGRTYW1wbGUoY29udGV4dCwgdHJhY2VJZCwgc3Bhbk5hbWUsIHNwYW5LaW5kLCBhdHRyaWJ1dGVzLCBsaW5rcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVtb3RlUGFyZW50Tm90U2FtcGxlZC5zaG91bGRTYW1wbGUoY29udGV4dCwgdHJhY2VJZCwgc3Bhbk5hbWUsIHNwYW5LaW5kLCBhdHRyaWJ1dGVzLCBsaW5rcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmVudENvbnRleHQudHJhY2VGbGFncyAmIFRyYWNlRmxhZ3MuU0FNUExFRCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsUGFyZW50U2FtcGxlZC5zaG91bGRTYW1wbGUoY29udGV4dCwgdHJhY2VJZCwgc3Bhbk5hbWUsIHNwYW5LaW5kLCBhdHRyaWJ1dGVzLCBsaW5rcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsUGFyZW50Tm90U2FtcGxlZC5zaG91bGRTYW1wbGUoY29udGV4dCwgdHJhY2VJZCwgc3Bhbk5hbWUsIHNwYW5LaW5kLCBhdHRyaWJ1dGVzLCBsaW5rcyk7XG4gICAgfTtcbiAgICBQYXJlbnRCYXNlZFNhbXBsZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCJQYXJlbnRCYXNlZHtyb290PVwiICsgdGhpcy5fcm9vdC50b1N0cmluZygpICsgXCIsIHJlbW90ZVBhcmVudFNhbXBsZWQ9XCIgKyB0aGlzLl9yZW1vdGVQYXJlbnRTYW1wbGVkLnRvU3RyaW5nKCkgKyBcIiwgcmVtb3RlUGFyZW50Tm90U2FtcGxlZD1cIiArIHRoaXMuX3JlbW90ZVBhcmVudE5vdFNhbXBsZWQudG9TdHJpbmcoKSArIFwiLCBsb2NhbFBhcmVudFNhbXBsZWQ9XCIgKyB0aGlzLl9sb2NhbFBhcmVudFNhbXBsZWQudG9TdHJpbmcoKSArIFwiLCBsb2NhbFBhcmVudE5vdFNhbXBsZWQ9XCIgKyB0aGlzLl9sb2NhbFBhcmVudE5vdFNhbXBsZWQudG9TdHJpbmcoKSArIFwifVwiO1xuICAgIH07XG4gICAgcmV0dXJuIFBhcmVudEJhc2VkU2FtcGxlcjtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogU2FtcGxlciB0aGF0IHNhbXBsZXMgYSBnaXZlbiBmcmFjdGlvbiBvZiB0cmFjZXMgYmFzZWQgb2YgdHJhY2UgaWQgZGV0ZXJtaW5pc3RpY2FsbHkuICovXG52YXIgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlcihfcmF0aW8pIHtcbiAgICAgICAgaWYgKF9yYXRpbyA9PT0gdm9pZCAwKSB7IF9yYXRpbyA9IDA7IH1cbiAgICAgICAgdGhpcy5fcmF0aW8gPSBfcmF0aW87XG4gICAgICAgIHRoaXMuX3JhdGlvID0gdGhpcy5fbm9ybWFsaXplKF9yYXRpbyk7XG4gICAgICAgIHRoaXMuX3VwcGVyQm91bmQgPSBNYXRoLmZsb29yKHRoaXMuX3JhdGlvICogMHhmZmZmZmZmZik7XG4gICAgfVxuICAgIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlci5wcm90b3R5cGUuc2hvdWxkU2FtcGxlID0gZnVuY3Rpb24gKGNvbnRleHQsIHRyYWNlSWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRlY2lzaW9uOiBpc1ZhbGlkVHJhY2VJZCh0cmFjZUlkKSAmJiB0aGlzLl9hY2N1bXVsYXRlKHRyYWNlSWQpIDwgdGhpcy5fdXBwZXJCb3VuZFxuICAgICAgICAgICAgICAgID8gU2FtcGxpbmdEZWNpc2lvbi5SRUNPUkRfQU5EX1NBTVBMRURcbiAgICAgICAgICAgICAgICA6IFNhbXBsaW5nRGVjaXNpb24uTk9UX1JFQ09SRCxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIlRyYWNlSWRSYXRpb0Jhc2Vke1wiICsgdGhpcy5fcmF0aW8gKyBcIn1cIjtcbiAgICB9O1xuICAgIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlci5wcm90b3R5cGUuX25vcm1hbGl6ZSA9IGZ1bmN0aW9uIChyYXRpbykge1xuICAgICAgICBpZiAodHlwZW9mIHJhdGlvICE9PSAnbnVtYmVyJyB8fCBpc05hTihyYXRpbykpXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIHJhdGlvID49IDEgPyAxIDogcmF0aW8gPD0gMCA/IDAgOiByYXRpbztcbiAgICB9O1xuICAgIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlci5wcm90b3R5cGUuX2FjY3VtdWxhdGUgPSBmdW5jdGlvbiAodHJhY2VJZCkge1xuICAgICAgICB2YXIgYWNjdW11bGF0aW9uID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFjZUlkLmxlbmd0aCAvIDg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHBvcyA9IGkgKiA4O1xuICAgICAgICAgICAgdmFyIHBhcnQgPSBwYXJzZUludCh0cmFjZUlkLnNsaWNlKHBvcywgcG9zICsgOCksIDE2KTtcbiAgICAgICAgICAgIGFjY3VtdWxhdGlvbiA9IChhY2N1bXVsYXRpb24gXiBwYXJ0KSA+Pj4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW11bGF0aW9uO1xuICAgIH07XG4gICAgcmV0dXJuIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlcjtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgRkFMTEJBQ0tfT1RFTF9UUkFDRVNfU0FNUExFUiA9IFRyYWNlc1NhbXBsZXJWYWx1ZXMuQWx3YXlzT247XG52YXIgREVGQVVMVF9SQVRJTyA9IDE7XG4vKipcbiAqIExvYWQgZGVmYXVsdCBjb25maWd1cmF0aW9uLiBGb3IgZmllbGRzIHdpdGggcHJpbWl0aXZlIHZhbHVlcywgYW55IHVzZXItcHJvdmlkZWRcbiAqIHZhbHVlIHdpbGwgb3ZlcnJpZGUgdGhlIGNvcnJlc3BvbmRpbmcgZGVmYXVsdCB2YWx1ZS4gRm9yIGZpZWxkcyB3aXRoXG4gKiBub24tcHJpbWl0aXZlIHZhbHVlcyAobGlrZSBgc3BhbkxpbWl0c2ApLCB0aGUgdXNlci1wcm92aWRlZCB2YWx1ZSB3aWxsIGJlXG4gKiB1c2VkIHRvIGV4dGVuZCB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAqL1xuLy8gb2JqZWN0IG5lZWRzIHRvIGJlIHdyYXBwZWQgaW4gdGhpcyBmdW5jdGlvbiBhbmQgY2FsbGVkIHdoZW4gbmVlZGVkIG90aGVyd2lzZVxuLy8gZW52cyBhcmUgcGFyc2VkIGJlZm9yZSB0ZXN0cyBhcmUgcmFuIC0gY2F1c2VzIHRlc3RzIHVzaW5nIHRoZXNlIGVudnMgdG8gZmFpbFxuZnVuY3Rpb24gbG9hZERlZmF1bHRDb25maWcoKSB7XG4gICAgdmFyIGVudiA9IGdldEVudigpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHNhbXBsZXI6IGJ1aWxkU2FtcGxlckZyb21FbnYoZW52KSxcbiAgICAgICAgZm9yY2VGbHVzaFRpbWVvdXRNaWxsaXM6IDMwMDAwLFxuICAgICAgICBnZW5lcmFsTGltaXRzOiB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0OiBlbnYuT1RFTF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlULFxuICAgICAgICAgICAgYXR0cmlidXRlQ291bnRMaW1pdDogZW52Lk9URUxfQVRUUklCVVRFX0NPVU5UX0xJTUlULFxuICAgICAgICB9LFxuICAgICAgICBzcGFuTGltaXRzOiB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0OiBlbnYuT1RFTF9TUEFOX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQsXG4gICAgICAgICAgICBhdHRyaWJ1dGVDb3VudExpbWl0OiBlbnYuT1RFTF9TUEFOX0FUVFJJQlVURV9DT1VOVF9MSU1JVCxcbiAgICAgICAgICAgIGxpbmtDb3VudExpbWl0OiBlbnYuT1RFTF9TUEFOX0xJTktfQ09VTlRfTElNSVQsXG4gICAgICAgICAgICBldmVudENvdW50TGltaXQ6IGVudi5PVEVMX1NQQU5fRVZFTlRfQ09VTlRfTElNSVQsXG4gICAgICAgICAgICBhdHRyaWJ1dGVQZXJFdmVudENvdW50TGltaXQ6IGVudi5PVEVMX1NQQU5fQVRUUklCVVRFX1BFUl9FVkVOVF9DT1VOVF9MSU1JVCxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVBlckxpbmtDb3VudExpbWl0OiBlbnYuT1RFTF9TUEFOX0FUVFJJQlVURV9QRVJfTElOS19DT1VOVF9MSU1JVCxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyZ2VSZXNvdXJjZVdpdGhEZWZhdWx0czogdHJ1ZSxcbiAgICB9O1xufVxuLyoqXG4gKiBCYXNlZCBvbiBlbnZpcm9ubWVudCwgYnVpbGRzIGEgc2FtcGxlciwgY29tcGxpZXMgd2l0aCBzcGVjaWZpY2F0aW9uLlxuICogQHBhcmFtIGVudmlyb25tZW50IG9wdGlvbmFsLCBieSBkZWZhdWx0IHVzZXMgZ2V0RW52KCksIGJ1dCBhbGxvd3MgcGFzc2luZyBhIHZhbHVlIHRvIHJldXNlIHBhcnNlZCBlbnZpcm9ubWVudFxuICovXG5mdW5jdGlvbiBidWlsZFNhbXBsZXJGcm9tRW52KGVudmlyb25tZW50KSB7XG4gICAgaWYgKGVudmlyb25tZW50ID09PSB2b2lkIDApIHsgZW52aXJvbm1lbnQgPSBnZXRFbnYoKTsgfVxuICAgIHN3aXRjaCAoZW52aXJvbm1lbnQuT1RFTF9UUkFDRVNfU0FNUExFUikge1xuICAgICAgICBjYXNlIFRyYWNlc1NhbXBsZXJWYWx1ZXMuQWx3YXlzT246XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFsd2F5c09uU2FtcGxlcigpO1xuICAgICAgICBjYXNlIFRyYWNlc1NhbXBsZXJWYWx1ZXMuQWx3YXlzT2ZmOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBBbHdheXNPZmZTYW1wbGVyKCk7XG4gICAgICAgIGNhc2UgVHJhY2VzU2FtcGxlclZhbHVlcy5QYXJlbnRCYXNlZEFsd2F5c09uOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJlbnRCYXNlZFNhbXBsZXIoe1xuICAgICAgICAgICAgICAgIHJvb3Q6IG5ldyBBbHdheXNPblNhbXBsZXIoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlIFRyYWNlc1NhbXBsZXJWYWx1ZXMuUGFyZW50QmFzZWRBbHdheXNPZmY6XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBhcmVudEJhc2VkU2FtcGxlcih7XG4gICAgICAgICAgICAgICAgcm9vdDogbmV3IEFsd2F5c09mZlNhbXBsZXIoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlIFRyYWNlc1NhbXBsZXJWYWx1ZXMuVHJhY2VJZFJhdGlvOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmFjZUlkUmF0aW9CYXNlZFNhbXBsZXIoZ2V0U2FtcGxlclByb2JhYmlsaXR5RnJvbUVudihlbnZpcm9ubWVudCkpO1xuICAgICAgICBjYXNlIFRyYWNlc1NhbXBsZXJWYWx1ZXMuUGFyZW50QmFzZWRUcmFjZUlkUmF0aW86XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBhcmVudEJhc2VkU2FtcGxlcih7XG4gICAgICAgICAgICAgICAgcm9vdDogbmV3IFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlcihnZXRTYW1wbGVyUHJvYmFiaWxpdHlGcm9tRW52KGVudmlyb25tZW50KSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGRpYWcuZXJyb3IoXCJPVEVMX1RSQUNFU19TQU1QTEVSIHZhbHVlIFxcXCJcIiArIGVudmlyb25tZW50Lk9URUxfVFJBQ0VTX1NBTVBMRVIgKyBcIiBpbnZhbGlkLCBkZWZhdWx0aW5nIHRvIFwiICsgRkFMTEJBQ0tfT1RFTF9UUkFDRVNfU0FNUExFUiArIFwiXFxcIi5cIik7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFsd2F5c09uU2FtcGxlcigpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFNhbXBsZXJQcm9iYWJpbGl0eUZyb21FbnYoZW52aXJvbm1lbnQpIHtcbiAgICBpZiAoZW52aXJvbm1lbnQuT1RFTF9UUkFDRVNfU0FNUExFUl9BUkcgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBlbnZpcm9ubWVudC5PVEVMX1RSQUNFU19TQU1QTEVSX0FSRyA9PT0gJycpIHtcbiAgICAgICAgZGlhZy5lcnJvcihcIk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHIGlzIGJsYW5rLCBkZWZhdWx0aW5nIHRvIFwiICsgREVGQVVMVF9SQVRJTyArIFwiLlwiKTtcbiAgICAgICAgcmV0dXJuIERFRkFVTFRfUkFUSU87XG4gICAgfVxuICAgIHZhciBwcm9iYWJpbGl0eSA9IE51bWJlcihlbnZpcm9ubWVudC5PVEVMX1RSQUNFU19TQU1QTEVSX0FSRyk7XG4gICAgaWYgKGlzTmFOKHByb2JhYmlsaXR5KSkge1xuICAgICAgICBkaWFnLmVycm9yKFwiT1RFTF9UUkFDRVNfU0FNUExFUl9BUkc9XCIgKyBlbnZpcm9ubWVudC5PVEVMX1RSQUNFU19TQU1QTEVSX0FSRyArIFwiIHdhcyBnaXZlbiwgYnV0IGl0IGlzIGludmFsaWQsIGRlZmF1bHRpbmcgdG8gXCIgKyBERUZBVUxUX1JBVElPICsgXCIuXCIpO1xuICAgICAgICByZXR1cm4gREVGQVVMVF9SQVRJTztcbiAgICB9XG4gICAgaWYgKHByb2JhYmlsaXR5IDwgMCB8fCBwcm9iYWJpbGl0eSA+IDEpIHtcbiAgICAgICAgZGlhZy5lcnJvcihcIk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHPVwiICsgZW52aXJvbm1lbnQuT1RFTF9UUkFDRVNfU0FNUExFUl9BUkcgKyBcIiB3YXMgZ2l2ZW4sIGJ1dCBpdCBpcyBvdXQgb2YgcmFuZ2UgKFswLi4xXSksIGRlZmF1bHRpbmcgdG8gXCIgKyBERUZBVUxUX1JBVElPICsgXCIuXCIpO1xuICAgICAgICByZXR1cm4gREVGQVVMVF9SQVRJTztcbiAgICB9XG4gICAgcmV0dXJuIHByb2JhYmlsaXR5O1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBGdW5jdGlvbiB0byBtZXJnZSBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gKGFzIHNwZWNpZmllZCBpbiAnLi9jb25maWcnKSB3aXRoXG4gKiB1c2VyIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb25zLlxuICovXG5mdW5jdGlvbiBtZXJnZUNvbmZpZyh1c2VyQ29uZmlnKSB7XG4gICAgdmFyIHBlckluc3RhbmNlRGVmYXVsdHMgPSB7XG4gICAgICAgIHNhbXBsZXI6IGJ1aWxkU2FtcGxlckZyb21FbnYoKSxcbiAgICB9O1xuICAgIHZhciBERUZBVUxUX0NPTkZJRyA9IGxvYWREZWZhdWx0Q29uZmlnKCk7XG4gICAgdmFyIHRhcmdldCA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQ09ORklHLCBwZXJJbnN0YW5jZURlZmF1bHRzLCB1c2VyQ29uZmlnKTtcbiAgICB0YXJnZXQuZ2VuZXJhbExpbWl0cyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQ09ORklHLmdlbmVyYWxMaW1pdHMsIHVzZXJDb25maWcuZ2VuZXJhbExpbWl0cyB8fCB7fSk7XG4gICAgdGFyZ2V0LnNwYW5MaW1pdHMgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX0NPTkZJRy5zcGFuTGltaXRzLCB1c2VyQ29uZmlnLnNwYW5MaW1pdHMgfHwge30pO1xuICAgIHJldHVybiB0YXJnZXQ7XG59XG4vKipcbiAqIFdoZW4gZ2VuZXJhbCBsaW1pdHMgYXJlIHByb3ZpZGVkIGFuZCBtb2RlbCBzcGVjaWZpYyBsaW1pdHMgYXJlIG5vdCxcbiAqIGNvbmZpZ3VyZXMgdGhlIG1vZGVsIHNwZWNpZmljIGxpbWl0cyBieSB1c2luZyB0aGUgdmFsdWVzIGZyb20gdGhlIGdlbmVyYWwgb25lcy5cbiAqIEBwYXJhbSB1c2VyQ29uZmlnIFVzZXIgcHJvdmlkZWQgdHJhY2VyIGNvbmZpZ3VyYXRpb25cbiAqL1xuZnVuY3Rpb24gcmVjb25maWd1cmVMaW1pdHModXNlckNvbmZpZykge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaywgX2wsIF9tO1xuICAgIHZhciBzcGFuTGltaXRzID0gT2JqZWN0LmFzc2lnbih7fSwgdXNlckNvbmZpZy5zcGFuTGltaXRzKTtcbiAgICB2YXIgcGFyc2VkRW52Q29uZmlnID0gZ2V0RW52V2l0aG91dERlZmF1bHRzKCk7XG4gICAgLyoqXG4gICAgICogUmVhc3NpZ24gc3BhbiBhdHRyaWJ1dGUgY291bnQgbGltaXQgdG8gdXNlIGZpcnN0IG5vbiBudWxsIHZhbHVlIGRlZmluZWQgYnkgdXNlciBvciB1c2UgZGVmYXVsdCB2YWx1ZVxuICAgICAqL1xuICAgIHNwYW5MaW1pdHMuYXR0cmlidXRlQ291bnRMaW1pdCA9XG4gICAgICAgIChfZiA9IChfZSA9IChfZCA9IChfYiA9IChfYSA9IHVzZXJDb25maWcuc3BhbkxpbWl0cykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmF0dHJpYnV0ZUNvdW50TGltaXQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IChfYyA9IHVzZXJDb25maWcuZ2VuZXJhbExpbWl0cykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmF0dHJpYnV0ZUNvdW50TGltaXQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IHBhcnNlZEVudkNvbmZpZy5PVEVMX1NQQU5fQVRUUklCVVRFX0NPVU5UX0xJTUlUKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiBwYXJzZWRFbnZDb25maWcuT1RFTF9BVFRSSUJVVEVfQ09VTlRfTElNSVQpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IERFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlUO1xuICAgIC8qKlxuICAgICAqIFJlYXNzaWduIHNwYW4gYXR0cmlidXRlIHZhbHVlIGxlbmd0aCBsaW1pdCB0byB1c2UgZmlyc3Qgbm9uIG51bGwgdmFsdWUgZGVmaW5lZCBieSB1c2VyIG9yIHVzZSBkZWZhdWx0IHZhbHVlXG4gICAgICovXG4gICAgc3BhbkxpbWl0cy5hdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0ID1cbiAgICAgICAgKF9tID0gKF9sID0gKF9rID0gKF9oID0gKF9nID0gdXNlckNvbmZpZy5zcGFuTGltaXRzKSA9PT0gbnVsbCB8fCBfZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2cuYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdCkgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogKF9qID0gdXNlckNvbmZpZy5nZW5lcmFsTGltaXRzKSA9PT0gbnVsbCB8fCBfaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ouYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdCkgIT09IG51bGwgJiYgX2sgIT09IHZvaWQgMCA/IF9rIDogcGFyc2VkRW52Q29uZmlnLk9URUxfU1BBTl9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUKSAhPT0gbnVsbCAmJiBfbCAhPT0gdm9pZCAwID8gX2wgOiBwYXJzZWRFbnZDb25maWcuT1RFTF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUKSAhPT0gbnVsbCAmJiBfbSAhPT0gdm9pZCAwID8gX20gOiBERUZBVUxUX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQ7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHVzZXJDb25maWcsIHsgc3BhbkxpbWl0czogc3BhbkxpbWl0cyB9KTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBTcGFuUHJvY2Vzc29yfSB0aGF0IGJhdGNoZXMgc3BhbnMgZXhwb3J0ZWQgYnlcbiAqIHRoZSBTREsgdGhlbiBwdXNoZXMgdGhlbSB0byB0aGUgZXhwb3J0ZXIgcGlwZWxpbmUuXG4gKi9cbnZhciBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJhdGNoU3BhblByb2Nlc3NvckJhc2UoX2V4cG9ydGVyLCBjb25maWcpIHtcbiAgICAgICAgdGhpcy5fZXhwb3J0ZXIgPSBfZXhwb3J0ZXI7XG4gICAgICAgIHRoaXMuX2lzRXhwb3J0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2ZpbmlzaGVkU3BhbnMgPSBbXTtcbiAgICAgICAgdGhpcy5fZHJvcHBlZFNwYW5zQ291bnQgPSAwO1xuICAgICAgICB2YXIgZW52ID0gZ2V0RW52KCk7XG4gICAgICAgIHRoaXMuX21heEV4cG9ydEJhdGNoU2l6ZSA9XG4gICAgICAgICAgICB0eXBlb2YgKGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5tYXhFeHBvcnRCYXRjaFNpemUpID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgICAgID8gY29uZmlnLm1heEV4cG9ydEJhdGNoU2l6ZVxuICAgICAgICAgICAgICAgIDogZW52Lk9URUxfQlNQX01BWF9FWFBPUlRfQkFUQ0hfU0laRTtcbiAgICAgICAgdGhpcy5fbWF4UXVldWVTaXplID1cbiAgICAgICAgICAgIHR5cGVvZiAoY29uZmlnID09PSBudWxsIHx8IGNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnLm1heFF1ZXVlU2l6ZSkgPT09ICdudW1iZXInXG4gICAgICAgICAgICAgICAgPyBjb25maWcubWF4UXVldWVTaXplXG4gICAgICAgICAgICAgICAgOiBlbnYuT1RFTF9CU1BfTUFYX1FVRVVFX1NJWkU7XG4gICAgICAgIHRoaXMuX3NjaGVkdWxlZERlbGF5TWlsbGlzID1cbiAgICAgICAgICAgIHR5cGVvZiAoY29uZmlnID09PSBudWxsIHx8IGNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnLnNjaGVkdWxlZERlbGF5TWlsbGlzKSA9PT0gJ251bWJlcidcbiAgICAgICAgICAgICAgICA/IGNvbmZpZy5zY2hlZHVsZWREZWxheU1pbGxpc1xuICAgICAgICAgICAgICAgIDogZW52Lk9URUxfQlNQX1NDSEVEVUxFX0RFTEFZO1xuICAgICAgICB0aGlzLl9leHBvcnRUaW1lb3V0TWlsbGlzID1cbiAgICAgICAgICAgIHR5cGVvZiAoY29uZmlnID09PSBudWxsIHx8IGNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnLmV4cG9ydFRpbWVvdXRNaWxsaXMpID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgICAgID8gY29uZmlnLmV4cG9ydFRpbWVvdXRNaWxsaXNcbiAgICAgICAgICAgICAgICA6IGVudi5PVEVMX0JTUF9FWFBPUlRfVElNRU9VVDtcbiAgICAgICAgdGhpcy5fc2h1dGRvd25PbmNlID0gbmV3IEJpbmRPbmNlRnV0dXJlKHRoaXMuX3NodXRkb3duLCB0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMuX21heEV4cG9ydEJhdGNoU2l6ZSA+IHRoaXMuX21heFF1ZXVlU2l6ZSkge1xuICAgICAgICAgICAgZGlhZy53YXJuKCdCYXRjaFNwYW5Qcm9jZXNzb3I6IG1heEV4cG9ydEJhdGNoU2l6ZSBtdXN0IGJlIHNtYWxsZXIgb3IgZXF1YWwgdG8gbWF4UXVldWVTaXplLCBzZXR0aW5nIG1heEV4cG9ydEJhdGNoU2l6ZSB0byBtYXRjaCBtYXhRdWV1ZVNpemUnKTtcbiAgICAgICAgICAgIHRoaXMuX21heEV4cG9ydEJhdGNoU2l6ZSA9IHRoaXMuX21heFF1ZXVlU2l6ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlLnByb3RvdHlwZS5mb3JjZUZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fc2h1dGRvd25PbmNlLmlzQ2FsbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2h1dGRvd25PbmNlLnByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZsdXNoQWxsKCk7XG4gICAgfTtcbiAgICAvLyBkb2VzIG5vdGhpbmcuXG4gICAgQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZS5wcm90b3R5cGUub25TdGFydCA9IGZ1bmN0aW9uIChfc3BhbiwgX3BhcmVudENvbnRleHQpIHsgfTtcbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uIChzcGFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9zaHV0ZG93bk9uY2UuaXNDYWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHNwYW4uc3BhbkNvbnRleHQoKS50cmFjZUZsYWdzICYgVHJhY2VGbGFncy5TQU1QTEVEKSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2FkZFRvQnVmZmVyKHNwYW4pO1xuICAgIH07XG4gICAgQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZS5wcm90b3R5cGUuc2h1dGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaHV0ZG93bk9uY2UuY2FsbCgpO1xuICAgIH07XG4gICAgQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZS5wcm90b3R5cGUuX3NodXRkb3duID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5vblNodXRkb3duKCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuX2ZsdXNoQWxsKCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuX2V4cG9ydGVyLnNodXRkb3duKCk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqIEFkZCBhIHNwYW4gaW4gdGhlIGJ1ZmZlci4gKi9cbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlLnByb3RvdHlwZS5fYWRkVG9CdWZmZXIgPSBmdW5jdGlvbiAoc3Bhbikge1xuICAgICAgICBpZiAodGhpcy5fZmluaXNoZWRTcGFucy5sZW5ndGggPj0gdGhpcy5fbWF4UXVldWVTaXplKSB7XG4gICAgICAgICAgICAvLyBsaW1pdCByZWFjaGVkLCBkcm9wIHNwYW5cbiAgICAgICAgICAgIGlmICh0aGlzLl9kcm9wcGVkU3BhbnNDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGRpYWcuZGVidWcoJ21heFF1ZXVlU2l6ZSByZWFjaGVkLCBkcm9wcGluZyBzcGFucycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZHJvcHBlZFNwYW5zQ291bnQrKztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZHJvcHBlZFNwYW5zQ291bnQgPiAwKSB7XG4gICAgICAgICAgICAvLyBzb21lIHNwYW5zIHdlcmUgZHJvcHBlZCwgbG9nIG9uY2Ugd2l0aCBjb3VudCBvZiBzcGFucyBkcm9wcGVkXG4gICAgICAgICAgICBkaWFnLndhcm4oXCJEcm9wcGVkIFwiICsgdGhpcy5fZHJvcHBlZFNwYW5zQ291bnQgKyBcIiBzcGFucyBiZWNhdXNlIG1heFF1ZXVlU2l6ZSByZWFjaGVkXCIpO1xuICAgICAgICAgICAgdGhpcy5fZHJvcHBlZFNwYW5zQ291bnQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2ZpbmlzaGVkU3BhbnMucHVzaChzcGFuKTtcbiAgICAgICAgdGhpcy5fbWF5YmVTdGFydFRpbWVyKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZW5kIGFsbCBzcGFucyB0byB0aGUgZXhwb3J0ZXIgcmVzcGVjdGluZyB0aGUgYmF0Y2ggc2l6ZSBsaW1pdFxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBvbmx5IG9uIGZvcmNlRmx1c2ggb3Igc2h1dGRvd24sXG4gICAgICogZm9yIGFsbCBvdGhlciBjYXNlcyBfZmx1c2ggc2hvdWxkIGJlIHVzZWRcbiAgICAgKiAqL1xuICAgIEJhdGNoU3BhblByb2Nlc3NvckJhc2UucHJvdG90eXBlLl9mbHVzaEFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHZhciBwcm9taXNlcyA9IFtdO1xuICAgICAgICAgICAgLy8gY2FsY3VsYXRlIG51bWJlciBvZiBiYXRjaGVzXG4gICAgICAgICAgICB2YXIgY291bnQgPSBNYXRoLmNlaWwoX3RoaXMuX2ZpbmlzaGVkU3BhbnMubGVuZ3RoIC8gX3RoaXMuX21heEV4cG9ydEJhdGNoU2l6ZSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGNvdW50OyBpIDwgajsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChfdGhpcy5fZmx1c2hPbmVCYXRjaCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChyZWplY3QpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEJhdGNoU3BhblByb2Nlc3NvckJhc2UucHJvdG90eXBlLl9mbHVzaE9uZUJhdGNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLl9jbGVhclRpbWVyKCk7XG4gICAgICAgIGlmICh0aGlzLl9maW5pc2hlZFNwYW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAvLyBkb24ndCB3YWl0IGFueW1vcmUgZm9yIGV4cG9ydCwgdGhpcyB3YXkgdGhlIG5leHQgYmF0Y2ggY2FuIHN0YXJ0XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignVGltZW91dCcpKTtcbiAgICAgICAgICAgIH0sIF90aGlzLl9leHBvcnRUaW1lb3V0TWlsbGlzKTtcbiAgICAgICAgICAgIC8vIHByZXZlbnQgZG93bnN0cmVhbSBleHBvcnRlciBjYWxscyBmcm9tIGdlbmVyYXRpbmcgc3BhbnNcbiAgICAgICAgICAgIGNvbnRleHQud2l0aChzdXBwcmVzc1RyYWNpbmcoY29udGV4dC5hY3RpdmUoKSksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZmluaXNoZWQgc3BhbnMgYnVmZmVyIGhlcmUgYmVjYXVzZSB0aGUgbmV4dCBpbnZvY2F0aW9ucyBvZiB0aGUgX2ZsdXNoIG1ldGhvZFxuICAgICAgICAgICAgICAgIC8vIGNvdWxkIHBhc3MgdGhlIHNhbWUgZmluaXNoZWQgc3BhbnMgdG8gdGhlIGV4cG9ydGVyIGlmIHRoZSBidWZmZXIgaXMgY2xlYXJlZFxuICAgICAgICAgICAgICAgIC8vIG91dHNpZGUgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGxiYWNrLlxuICAgICAgICAgICAgICAgIHZhciBzcGFucztcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuX2ZpbmlzaGVkU3BhbnMubGVuZ3RoIDw9IF90aGlzLl9tYXhFeHBvcnRCYXRjaFNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgc3BhbnMgPSBfdGhpcy5fZmluaXNoZWRTcGFucztcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2ZpbmlzaGVkU3BhbnMgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNwYW5zID0gX3RoaXMuX2ZpbmlzaGVkU3BhbnMuc3BsaWNlKDAsIF90aGlzLl9tYXhFeHBvcnRCYXRjaFNpemUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZG9FeHBvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5fZXhwb3J0ZXIuZXhwb3J0KHNwYW5zLCBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5jb2RlID09PSBFeHBvcnRSZXN1bHRDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoKF9hID0gcmVzdWx0LmVycm9yKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBuZXcgRXJyb3IoJ0JhdGNoU3BhblByb2Nlc3Nvcjogc3BhbiBleHBvcnQgZmFpbGVkJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHZhciBwZW5kaW5nUmVzb3VyY2VzID0gbnVsbDtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc3BhbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNwYW4gPSBzcGFuc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW4ucmVzb3VyY2UuYXN5bmNBdHRyaWJ1dGVzUGVuZGluZyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbi5yZXNvdXJjZS53YWl0Rm9yQXN5bmNBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nUmVzb3VyY2VzICE9PSBudWxsICYmIHBlbmRpbmdSZXNvdXJjZXMgIT09IHZvaWQgMCA/IHBlbmRpbmdSZXNvdXJjZXMgOiAocGVuZGluZ1Jlc291cmNlcyA9IFtdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdSZXNvdXJjZXMucHVzaChzcGFuLnJlc291cmNlLndhaXRGb3JBc3luY0F0dHJpYnV0ZXMoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQXZvaWQgc2NoZWR1bGluZyBhIHByb21pc2UgdG8gbWFrZSB0aGUgYmVoYXZpb3IgbW9yZSBwcmVkaWN0YWJsZSBhbmQgZWFzaWVyIHRvIHRlc3RcbiAgICAgICAgICAgICAgICBpZiAocGVuZGluZ1Jlc291cmNlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBkb0V4cG9ydCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwocGVuZGluZ1Jlc291cmNlcykudGhlbihkb0V4cG9ydCwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRXJyb3JIYW5kbGVyKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZS5wcm90b3R5cGUuX21heWJlU3RhcnRUaW1lciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMuX2lzRXhwb3J0aW5nKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5faXNFeHBvcnRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgX3RoaXMuX2ZsdXNoT25lQmF0Y2goKVxuICAgICAgICAgICAgICAgIC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5faXNFeHBvcnRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuX2ZpbmlzaGVkU3BhbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fY2xlYXJUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fbWF5YmVTdGFydFRpbWVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5faXNFeHBvcnRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBnbG9iYWxFcnJvckhhbmRsZXIoZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gd2Ugb25seSB3YWl0IGlmIHRoZSBxdWV1ZSBkb2Vzbid0IGhhdmUgZW5vdWdoIGVsZW1lbnRzIHlldFxuICAgICAgICBpZiAodGhpcy5fZmluaXNoZWRTcGFucy5sZW5ndGggPj0gdGhpcy5fbWF4RXhwb3J0QmF0Y2hTaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gZmx1c2goKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fdGltZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZsdXNoKCk7IH0sIHRoaXMuX3NjaGVkdWxlZERlbGF5TWlsbGlzKTtcbiAgICAgICAgdW5yZWZUaW1lcih0aGlzLl90aW1lcik7XG4gICAgfTtcbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlLnByb3RvdHlwZS5fY2xlYXJUaW1lciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RpbWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcik7XG4gICAgICAgICAgICB0aGlzLl90aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEJhdGNoU3BhblByb2Nlc3NvckJhc2U7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fZXh0ZW5kcyA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG52YXIgQmF0Y2hTcGFuUHJvY2Vzc29yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhCYXRjaFNwYW5Qcm9jZXNzb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQmF0Y2hTcGFuUHJvY2Vzc29yKF9leHBvcnRlciwgY29uZmlnKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIF9leHBvcnRlciwgY29uZmlnKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5vbkluaXQoY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLm9uSW5pdCA9IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKChjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcuZGlzYWJsZUF1dG9GbHVzaE9uRG9jdW1lbnRIaWRlKSAhPT0gdHJ1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5fdmlzaWJpbGl0eUNoYW5nZUxpc3RlbmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmZvcmNlRmx1c2goKS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbEVycm9ySGFuZGxlcihlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLl9wYWdlSGlkZUxpc3RlbmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLmZvcmNlRmx1c2goKS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRXJyb3JIYW5kbGVyKGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5fdmlzaWJpbGl0eUNoYW5nZUxpc3RlbmVyKTtcbiAgICAgICAgICAgIC8vIHVzZSAncGFnZWhpZGUnIGV2ZW50IGFzIGEgZmFsbGJhY2sgZm9yIFNhZmFyaTsgc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTY3NjlcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2VoaWRlJywgdGhpcy5fcGFnZUhpZGVMaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEJhdGNoU3BhblByb2Nlc3Nvci5wcm90b3R5cGUub25TaHV0ZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl92aXNpYmlsaXR5Q2hhbmdlTGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5fdmlzaWJpbGl0eUNoYW5nZUxpc3RlbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9wYWdlSGlkZUxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGFnZWhpZGUnLCB0aGlzLl9wYWdlSGlkZUxpc3RlbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEJhdGNoU3BhblByb2Nlc3Nvcjtcbn0oQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZSkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIFNQQU5fSURfQllURVMgPSA4O1xudmFyIFRSQUNFX0lEX0JZVEVTID0gMTY7XG52YXIgUmFuZG9tSWRHZW5lcmF0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmFuZG9tSWRHZW5lcmF0b3IoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIDE2LWJ5dGUgdHJhY2UgSUQgZm9ybWF0dGVkL2VuY29kZWQgYXMgYSAzMiBsb3dlcmNhc2UgaGV4XG4gICAgICAgICAqIGNoYXJhY3RlcnMgY29ycmVzcG9uZGluZyB0byAxMjggYml0cy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVUcmFjZUlkID0gZ2V0SWRHZW5lcmF0b3IoVFJBQ0VfSURfQllURVMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIHJhbmRvbSA4LWJ5dGUgc3BhbiBJRCBmb3JtYXR0ZWQvZW5jb2RlZCBhcyBhIDE2IGxvd2VyY2FzZSBoZXhcbiAgICAgICAgICogY2hhcmFjdGVycyBjb3JyZXNwb25kaW5nIHRvIDY0IGJpdHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmdlbmVyYXRlU3BhbklkID0gZ2V0SWRHZW5lcmF0b3IoU1BBTl9JRF9CWVRFUyk7XG4gICAgfVxuICAgIHJldHVybiBSYW5kb21JZEdlbmVyYXRvcjtcbn0oKSk7XG52YXIgU0hBUkVEX0NIQVJfQ09ERVNfQVJSQVkgPSBBcnJheSgzMik7XG5mdW5jdGlvbiBnZXRJZEdlbmVyYXRvcihieXRlcykge1xuICAgIHJldHVybiBmdW5jdGlvbiBnZW5lcmF0ZUlkKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzICogMjsgaSsrKSB7XG4gICAgICAgICAgICBTSEFSRURfQ0hBUl9DT0RFU19BUlJBWVtpXSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDE2KSArIDQ4O1xuICAgICAgICAgICAgLy8gdmFsaWQgaGV4IGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIDQ4LTU3IGFuZCA5Ny0xMDJcbiAgICAgICAgICAgIGlmIChTSEFSRURfQ0hBUl9DT0RFU19BUlJBWVtpXSA+PSA1OCkge1xuICAgICAgICAgICAgICAgIFNIQVJFRF9DSEFSX0NPREVTX0FSUkFZW2ldICs9IDM5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIFNIQVJFRF9DSEFSX0NPREVTX0FSUkFZLnNsaWNlKDAsIGJ5dGVzICogMikpO1xuICAgIH07XG59XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGJhc2ljIHRyYWNlci5cbiAqL1xudmFyIFRyYWNlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFRyYWNlciBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBUcmFjZXIoaW5zdHJ1bWVudGF0aW9uTGlicmFyeSwgY29uZmlnLCBfdHJhY2VyUHJvdmlkZXIpIHtcbiAgICAgICAgdGhpcy5fdHJhY2VyUHJvdmlkZXIgPSBfdHJhY2VyUHJvdmlkZXI7XG4gICAgICAgIHZhciBsb2NhbENvbmZpZyA9IG1lcmdlQ29uZmlnKGNvbmZpZyk7XG4gICAgICAgIHRoaXMuX3NhbXBsZXIgPSBsb2NhbENvbmZpZy5zYW1wbGVyO1xuICAgICAgICB0aGlzLl9nZW5lcmFsTGltaXRzID0gbG9jYWxDb25maWcuZ2VuZXJhbExpbWl0cztcbiAgICAgICAgdGhpcy5fc3BhbkxpbWl0cyA9IGxvY2FsQ29uZmlnLnNwYW5MaW1pdHM7XG4gICAgICAgIHRoaXMuX2lkR2VuZXJhdG9yID0gY29uZmlnLmlkR2VuZXJhdG9yIHx8IG5ldyBSYW5kb21JZEdlbmVyYXRvcigpO1xuICAgICAgICB0aGlzLnJlc291cmNlID0gX3RyYWNlclByb3ZpZGVyLnJlc291cmNlO1xuICAgICAgICB0aGlzLmluc3RydW1lbnRhdGlvbkxpYnJhcnkgPSBpbnN0cnVtZW50YXRpb25MaWJyYXJ5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydHMgYSBuZXcgU3BhbiBvciByZXR1cm5zIHRoZSBkZWZhdWx0IE5vb3BTcGFuIGJhc2VkIG9uIHRoZSBzYW1wbGluZ1xuICAgICAqIGRlY2lzaW9uLlxuICAgICAqL1xuICAgIFRyYWNlci5wcm90b3R5cGUuc3RhcnRTcGFuID0gZnVuY3Rpb24gKG5hbWUsIG9wdGlvbnMsIGNvbnRleHQkMSkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgaWYgKGNvbnRleHQkMSA9PT0gdm9pZCAwKSB7IGNvbnRleHQkMSA9IGNvbnRleHQuYWN0aXZlKCk7IH1cbiAgICAgICAgLy8gcmVtb3ZlIHNwYW4gZnJvbSBjb250ZXh0IGluIGNhc2UgYSByb290IHNwYW4gaXMgcmVxdWVzdGVkIHZpYSBvcHRpb25zXG4gICAgICAgIGlmIChvcHRpb25zLnJvb3QpIHtcbiAgICAgICAgICAgIGNvbnRleHQkMSA9IHRyYWNlLmRlbGV0ZVNwYW4oY29udGV4dCQxKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFyZW50U3BhbiA9IHRyYWNlLmdldFNwYW4oY29udGV4dCQxKTtcbiAgICAgICAgaWYgKGlzVHJhY2luZ1N1cHByZXNzZWQoY29udGV4dCQxKSkge1xuICAgICAgICAgICAgZGlhZy5kZWJ1ZygnSW5zdHJ1bWVudGF0aW9uIHN1cHByZXNzZWQsIHJldHVybmluZyBOb29wIFNwYW4nKTtcbiAgICAgICAgICAgIHZhciBub25SZWNvcmRpbmdTcGFuID0gdHJhY2Uud3JhcFNwYW5Db250ZXh0KElOVkFMSURfU1BBTl9DT05URVhUKTtcbiAgICAgICAgICAgIHJldHVybiBub25SZWNvcmRpbmdTcGFuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJlbnRTcGFuQ29udGV4dCA9IHBhcmVudFNwYW4gPT09IG51bGwgfHwgcGFyZW50U3BhbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyZW50U3Bhbi5zcGFuQ29udGV4dCgpO1xuICAgICAgICB2YXIgc3BhbklkID0gdGhpcy5faWRHZW5lcmF0b3IuZ2VuZXJhdGVTcGFuSWQoKTtcbiAgICAgICAgdmFyIHRyYWNlSWQ7XG4gICAgICAgIHZhciB0cmFjZVN0YXRlO1xuICAgICAgICB2YXIgcGFyZW50U3BhbklkO1xuICAgICAgICBpZiAoIXBhcmVudFNwYW5Db250ZXh0IHx8XG4gICAgICAgICAgICAhdHJhY2UuaXNTcGFuQ29udGV4dFZhbGlkKHBhcmVudFNwYW5Db250ZXh0KSkge1xuICAgICAgICAgICAgLy8gTmV3IHJvb3Qgc3Bhbi5cbiAgICAgICAgICAgIHRyYWNlSWQgPSB0aGlzLl9pZEdlbmVyYXRvci5nZW5lcmF0ZVRyYWNlSWQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5ldyBjaGlsZCBzcGFuLlxuICAgICAgICAgICAgdHJhY2VJZCA9IHBhcmVudFNwYW5Db250ZXh0LnRyYWNlSWQ7XG4gICAgICAgICAgICB0cmFjZVN0YXRlID0gcGFyZW50U3BhbkNvbnRleHQudHJhY2VTdGF0ZTtcbiAgICAgICAgICAgIHBhcmVudFNwYW5JZCA9IHBhcmVudFNwYW5Db250ZXh0LnNwYW5JZDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3BhbktpbmQgPSAoX2EgPSBvcHRpb25zLmtpbmQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFNwYW5LaW5kLklOVEVSTkFMO1xuICAgICAgICB2YXIgbGlua3MgPSAoKF9iID0gb3B0aW9ucy5saW5rcykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogW10pLm1hcChmdW5jdGlvbiAobGluaykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsaW5rLmNvbnRleHQsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogc2FuaXRpemVBdHRyaWJ1dGVzKGxpbmsuYXR0cmlidXRlcyksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBzYW5pdGl6ZUF0dHJpYnV0ZXMob3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgICAgICAgLy8gbWFrZSBzYW1wbGluZyBkZWNpc2lvblxuICAgICAgICB2YXIgc2FtcGxpbmdSZXN1bHQgPSB0aGlzLl9zYW1wbGVyLnNob3VsZFNhbXBsZShjb250ZXh0JDEsIHRyYWNlSWQsIG5hbWUsIHNwYW5LaW5kLCBhdHRyaWJ1dGVzLCBsaW5rcyk7XG4gICAgICAgIHRyYWNlU3RhdGUgPSAoX2MgPSBzYW1wbGluZ1Jlc3VsdC50cmFjZVN0YXRlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiB0cmFjZVN0YXRlO1xuICAgICAgICB2YXIgdHJhY2VGbGFncyA9IHNhbXBsaW5nUmVzdWx0LmRlY2lzaW9uID09PSBTYW1wbGluZ0RlY2lzaW9uJDEuUkVDT1JEX0FORF9TQU1QTEVEXG4gICAgICAgICAgICA/IFRyYWNlRmxhZ3MuU0FNUExFRFxuICAgICAgICAgICAgOiBUcmFjZUZsYWdzLk5PTkU7XG4gICAgICAgIHZhciBzcGFuQ29udGV4dCA9IHsgdHJhY2VJZDogdHJhY2VJZCwgc3BhbklkOiBzcGFuSWQsIHRyYWNlRmxhZ3M6IHRyYWNlRmxhZ3MsIHRyYWNlU3RhdGU6IHRyYWNlU3RhdGUgfTtcbiAgICAgICAgaWYgKHNhbXBsaW5nUmVzdWx0LmRlY2lzaW9uID09PSBTYW1wbGluZ0RlY2lzaW9uJDEuTk9UX1JFQ09SRCkge1xuICAgICAgICAgICAgZGlhZy5kZWJ1ZygnUmVjb3JkaW5nIGlzIG9mZiwgcHJvcGFnYXRpbmcgY29udGV4dCBpbiBhIG5vbi1yZWNvcmRpbmcgc3BhbicpO1xuICAgICAgICAgICAgdmFyIG5vblJlY29yZGluZ1NwYW4gPSB0cmFjZS53cmFwU3BhbkNvbnRleHQoc3BhbkNvbnRleHQpO1xuICAgICAgICAgICAgcmV0dXJuIG5vblJlY29yZGluZ1NwYW47XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IGluaXRpYWwgc3BhbiBhdHRyaWJ1dGVzLiBUaGUgYXR0cmlidXRlcyBvYmplY3QgbWF5IGhhdmUgYmVlbiBtdXRhdGVkXG4gICAgICAgIC8vIGJ5IHRoZSBzYW1wbGVyLCBzbyB3ZSBzYW5pdGl6ZSB0aGUgbWVyZ2VkIGF0dHJpYnV0ZXMgYmVmb3JlIHNldHRpbmcgdGhlbS5cbiAgICAgICAgdmFyIGluaXRBdHRyaWJ1dGVzID0gc2FuaXRpemVBdHRyaWJ1dGVzKE9iamVjdC5hc3NpZ24oYXR0cmlidXRlcywgc2FtcGxpbmdSZXN1bHQuYXR0cmlidXRlcykpO1xuICAgICAgICB2YXIgc3BhbiA9IG5ldyBTcGFuKHRoaXMsIGNvbnRleHQkMSwgbmFtZSwgc3BhbkNvbnRleHQsIHNwYW5LaW5kLCBwYXJlbnRTcGFuSWQsIGxpbmtzLCBvcHRpb25zLnN0YXJ0VGltZSwgdW5kZWZpbmVkLCBpbml0QXR0cmlidXRlcyk7XG4gICAgICAgIHJldHVybiBzcGFuO1xuICAgIH07XG4gICAgVHJhY2VyLnByb3RvdHlwZS5zdGFydEFjdGl2ZVNwYW4gPSBmdW5jdGlvbiAobmFtZSwgYXJnMiwgYXJnMywgYXJnNCkge1xuICAgICAgICB2YXIgb3B0cztcbiAgICAgICAgdmFyIGN0eDtcbiAgICAgICAgdmFyIGZuO1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICBmbiA9IGFyZzI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgb3B0cyA9IGFyZzI7XG4gICAgICAgICAgICBmbiA9IGFyZzM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRzID0gYXJnMjtcbiAgICAgICAgICAgIGN0eCA9IGFyZzM7XG4gICAgICAgICAgICBmbiA9IGFyZzQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhcmVudENvbnRleHQgPSBjdHggIT09IG51bGwgJiYgY3R4ICE9PSB2b2lkIDAgPyBjdHggOiBjb250ZXh0LmFjdGl2ZSgpO1xuICAgICAgICB2YXIgc3BhbiA9IHRoaXMuc3RhcnRTcGFuKG5hbWUsIG9wdHMsIHBhcmVudENvbnRleHQpO1xuICAgICAgICB2YXIgY29udGV4dFdpdGhTcGFuU2V0ID0gdHJhY2Uuc2V0U3BhbihwYXJlbnRDb250ZXh0LCBzcGFuKTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQud2l0aChjb250ZXh0V2l0aFNwYW5TZXQsIGZuLCB1bmRlZmluZWQsIHNwYW4pO1xuICAgIH07XG4gICAgLyoqIFJldHVybnMgdGhlIGFjdGl2ZSB7QGxpbmsgR2VuZXJhbExpbWl0c30uICovXG4gICAgVHJhY2VyLnByb3RvdHlwZS5nZXRHZW5lcmFsTGltaXRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2VuZXJhbExpbWl0cztcbiAgICB9O1xuICAgIC8qKiBSZXR1cm5zIHRoZSBhY3RpdmUge0BsaW5rIFNwYW5MaW1pdHN9LiAqL1xuICAgIFRyYWNlci5wcm90b3R5cGUuZ2V0U3BhbkxpbWl0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NwYW5MaW1pdHM7XG4gICAgfTtcbiAgICBUcmFjZXIucHJvdG90eXBlLmdldEFjdGl2ZVNwYW5Qcm9jZXNzb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFjZXJQcm92aWRlci5nZXRBY3RpdmVTcGFuUHJvY2Vzc29yKCk7XG4gICAgfTtcbiAgICByZXR1cm4gVHJhY2VyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBfX3ZhbHVlcyQxID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX192YWx1ZXMpIHx8IGZ1bmN0aW9uKG8pIHtcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufTtcbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBTcGFuUHJvY2Vzc29yfSB0aGF0IHNpbXBseSBmb3J3YXJkcyBhbGxcbiAqIHJlY2VpdmVkIGV2ZW50cyB0byBhIGxpc3Qgb2Yge0BsaW5rIFNwYW5Qcm9jZXNzb3J9cy5cbiAqL1xudmFyIE11bHRpU3BhblByb2Nlc3NvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBNdWx0aVNwYW5Qcm9jZXNzb3IoX3NwYW5Qcm9jZXNzb3JzKSB7XG4gICAgICAgIHRoaXMuX3NwYW5Qcm9jZXNzb3JzID0gX3NwYW5Qcm9jZXNzb3JzO1xuICAgIH1cbiAgICBNdWx0aVNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLmZvcmNlRmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlXzEsIF9hO1xuICAgICAgICB2YXIgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMkMSh0aGlzLl9zcGFuUHJvY2Vzc29ycyksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3BhblByb2Nlc3NvciA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goc3BhblByb2Nlc3Nvci5mb3JjZUZsdXNoKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcylcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgZ2xvYmFsRXJyb3JIYW5kbGVyKGVycm9yIHx8IG5ldyBFcnJvcignTXVsdGlTcGFuUHJvY2Vzc29yOiBmb3JjZUZsdXNoIGZhaWxlZCcpKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBNdWx0aVNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLm9uU3RhcnQgPSBmdW5jdGlvbiAoc3BhbiwgY29udGV4dCkge1xuICAgICAgICB2YXIgZV8yLCBfYTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMkMSh0aGlzLl9zcGFuUHJvY2Vzc29ycyksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3BhblByb2Nlc3NvciA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgICAgIHNwYW5Qcm9jZXNzb3Iub25TdGFydChzcGFuLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBNdWx0aVNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24gKHNwYW4pIHtcbiAgICAgICAgdmFyIGVfMywgX2E7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzJDEodGhpcy5fc3BhblByb2Nlc3NvcnMpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNwYW5Qcm9jZXNzb3IgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgICAgICBzcGFuUHJvY2Vzc29yLm9uRW5kKHNwYW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlXzNfMSkgeyBlXzMgPSB7IGVycm9yOiBlXzNfMSB9OyB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMykgdGhyb3cgZV8zLmVycm9yOyB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE11bHRpU3BhblByb2Nlc3Nvci5wcm90b3R5cGUuc2h1dGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlXzQsIF9hO1xuICAgICAgICB2YXIgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMkMSh0aGlzLl9zcGFuUHJvY2Vzc29ycyksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3BhblByb2Nlc3NvciA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goc3BhblByb2Nlc3Nvci5zaHV0ZG93bigpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV80XzEpIHsgZV80ID0geyBlcnJvcjogZV80XzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzQpIHRocm93IGVfNC5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gTXVsdGlTcGFuUHJvY2Vzc29yO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKiBOby1vcCBpbXBsZW1lbnRhdGlvbiBvZiBTcGFuUHJvY2Vzc29yICovXG52YXIgTm9vcFNwYW5Qcm9jZXNzb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTm9vcFNwYW5Qcm9jZXNzb3IoKSB7XG4gICAgfVxuICAgIE5vb3BTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5vblN0YXJ0ID0gZnVuY3Rpb24gKF9zcGFuLCBfY29udGV4dCkgeyB9O1xuICAgIE5vb3BTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uIChfc3BhbikgeyB9O1xuICAgIE5vb3BTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5zaHV0ZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH07XG4gICAgTm9vcFNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLmZvcmNlRmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9O1xuICAgIHJldHVybiBOb29wU3BhblByb2Nlc3Nvcjtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX19yZWFkJDEgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG52YXIgX19zcHJlYWRBcnJheSQxID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn07XG52YXIgRm9yY2VGbHVzaFN0YXRlO1xuKGZ1bmN0aW9uIChGb3JjZUZsdXNoU3RhdGUpIHtcbiAgICBGb3JjZUZsdXNoU3RhdGVbRm9yY2VGbHVzaFN0YXRlW1wicmVzb2x2ZWRcIl0gPSAwXSA9IFwicmVzb2x2ZWRcIjtcbiAgICBGb3JjZUZsdXNoU3RhdGVbRm9yY2VGbHVzaFN0YXRlW1widGltZW91dFwiXSA9IDFdID0gXCJ0aW1lb3V0XCI7XG4gICAgRm9yY2VGbHVzaFN0YXRlW0ZvcmNlRmx1c2hTdGF0ZVtcImVycm9yXCJdID0gMl0gPSBcImVycm9yXCI7XG4gICAgRm9yY2VGbHVzaFN0YXRlW0ZvcmNlRmx1c2hTdGF0ZVtcInVucmVzb2x2ZWRcIl0gPSAzXSA9IFwidW5yZXNvbHZlZFwiO1xufSkoRm9yY2VGbHVzaFN0YXRlIHx8IChGb3JjZUZsdXNoU3RhdGUgPSB7fSkpO1xuLyoqXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBiYXNpYyB0cmFjZXIgcHJvdmlkZXIgd2hpY2ggcGxhdGZvcm0gbGlicmFyaWVzIGNhbiBleHRlbmRcbiAqL1xudmFyIEJhc2ljVHJhY2VyUHJvdmlkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQmFzaWNUcmFjZXJQcm92aWRlcihjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyA9PT0gdm9pZCAwKSB7IGNvbmZpZyA9IHt9OyB9XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHRoaXMuX3JlZ2lzdGVyZWRTcGFuUHJvY2Vzc29ycyA9IFtdO1xuICAgICAgICB0aGlzLl90cmFjZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgbWVyZ2VkQ29uZmlnID0gbWVyZ2Uoe30sIGxvYWREZWZhdWx0Q29uZmlnKCksIHJlY29uZmlndXJlTGltaXRzKGNvbmZpZykpO1xuICAgICAgICB0aGlzLnJlc291cmNlID0gKF9hID0gbWVyZ2VkQ29uZmlnLnJlc291cmNlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBSZXNvdXJjZS5lbXB0eSgpO1xuICAgICAgICBpZiAobWVyZ2VkQ29uZmlnLm1lcmdlUmVzb3VyY2VXaXRoRGVmYXVsdHMpIHtcbiAgICAgICAgICAgIHRoaXMucmVzb3VyY2UgPSBSZXNvdXJjZS5kZWZhdWx0KCkubWVyZ2UodGhpcy5yZXNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwgbWVyZ2VkQ29uZmlnLCB7XG4gICAgICAgICAgICByZXNvdXJjZTogdGhpcy5yZXNvdXJjZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICgoX2IgPSBjb25maWcuc3BhblByb2Nlc3NvcnMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyZWRTcGFuUHJvY2Vzc29ycyA9IF9fc3ByZWFkQXJyYXkkMShbXSwgX19yZWFkJDEoY29uZmlnLnNwYW5Qcm9jZXNzb3JzKSwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yID0gbmV3IE11bHRpU3BhblByb2Nlc3Nvcih0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGRlZmF1bHRFeHBvcnRlciA9IHRoaXMuX2J1aWxkRXhwb3J0ZXJGcm9tRW52KCk7XG4gICAgICAgICAgICBpZiAoZGVmYXVsdEV4cG9ydGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgYmF0Y2hQcm9jZXNzb3IgPSBuZXcgQmF0Y2hTcGFuUHJvY2Vzc29yKGRlZmF1bHRFeHBvcnRlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yID0gYmF0Y2hQcm9jZXNzb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVNwYW5Qcm9jZXNzb3IgPSBuZXcgTm9vcFNwYW5Qcm9jZXNzb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5nZXRUcmFjZXIgPSBmdW5jdGlvbiAobmFtZSwgdmVyc2lvbiwgb3B0aW9ucykge1xuICAgICAgICB2YXIga2V5ID0gbmFtZSArIFwiQFwiICsgKHZlcnNpb24gfHwgJycpICsgXCI6XCIgKyAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zY2hlbWFVcmwpIHx8ICcnKTtcbiAgICAgICAgaWYgKCF0aGlzLl90cmFjZXJzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFjZXJzLnNldChrZXksIG5ldyBUcmFjZXIoeyBuYW1lOiBuYW1lLCB2ZXJzaW9uOiB2ZXJzaW9uLCBzY2hlbWFVcmw6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zY2hlbWFVcmwgfSwgdGhpcy5fY29uZmlnLCB0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYWNlcnMuZ2V0KGtleSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBwbGVhc2UgdXNlIHtAbGluayBUcmFjZXJDb25maWd9IHNwYW5Qcm9jZXNzb3JzIHByb3BlcnR5XG4gICAgICogQWRkcyBhIG5ldyB7QGxpbmsgU3BhblByb2Nlc3Nvcn0gdG8gdGhpcyB0cmFjZXIuXG4gICAgICogQHBhcmFtIHNwYW5Qcm9jZXNzb3IgdGhlIG5ldyBTcGFuUHJvY2Vzc29yIHRvIGJlIGFkZGVkLlxuICAgICAqL1xuICAgIEJhc2ljVHJhY2VyUHJvdmlkZXIucHJvdG90eXBlLmFkZFNwYW5Qcm9jZXNzb3IgPSBmdW5jdGlvbiAoc3BhblByb2Nlc3Nvcikge1xuICAgICAgICBpZiAodGhpcy5fcmVnaXN0ZXJlZFNwYW5Qcm9jZXNzb3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gc2luY2Ugd2UgbWlnaHQgaGF2ZSBlbmFibGVkIGJ5IGRlZmF1bHQgYSBiYXRjaFByb2Nlc3Nvciwgd2UgZGlzYWJsZSBpdFxuICAgICAgICAgICAgLy8gYmVmb3JlIGFkZGluZyB0aGUgbmV3IG9uZVxuICAgICAgICAgICAgdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yXG4gICAgICAgICAgICAgICAgLnNodXRkb3duKClcbiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBkaWFnLmVycm9yKCdFcnJvciB3aGlsZSB0cnlpbmcgdG8gc2h1dGRvd24gY3VycmVudCBzcGFuIHByb2Nlc3NvcicsIGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMucHVzaChzcGFuUHJvY2Vzc29yKTtcbiAgICAgICAgdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yID0gbmV3IE11bHRpU3BhblByb2Nlc3Nvcih0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMpO1xuICAgIH07XG4gICAgQmFzaWNUcmFjZXJQcm92aWRlci5wcm90b3R5cGUuZ2V0QWN0aXZlU3BhblByb2Nlc3NvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlU3BhblByb2Nlc3NvcjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIHRoaXMgVHJhY2VyUHJvdmlkZXIgZm9yIHVzZSB3aXRoIHRoZSBPcGVuVGVsZW1ldHJ5IEFQSS5cbiAgICAgKiBVbmRlZmluZWQgdmFsdWVzIG1heSBiZSByZXBsYWNlZCB3aXRoIGRlZmF1bHRzLCBhbmRcbiAgICAgKiBudWxsIHZhbHVlcyB3aWxsIGJlIHNraXBwZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBTREsgcmVnaXN0cmF0aW9uXG4gICAgICovXG4gICAgQmFzaWNUcmFjZXJQcm92aWRlci5wcm90b3R5cGUucmVnaXN0ZXIgPSBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgPT09IHZvaWQgMCkgeyBjb25maWcgPSB7fTsgfVxuICAgICAgICB0cmFjZS5zZXRHbG9iYWxUcmFjZXJQcm92aWRlcih0aGlzKTtcbiAgICAgICAgaWYgKGNvbmZpZy5wcm9wYWdhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbmZpZy5wcm9wYWdhdG9yID0gdGhpcy5fYnVpbGRQcm9wYWdhdG9yRnJvbUVudigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuY29udGV4dE1hbmFnZXIpIHtcbiAgICAgICAgICAgIGNvbnRleHQuc2V0R2xvYmFsQ29udGV4dE1hbmFnZXIoY29uZmlnLmNvbnRleHRNYW5hZ2VyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLnByb3BhZ2F0b3IpIHtcbiAgICAgICAgICAgIHByb3BhZ2F0aW9uLnNldEdsb2JhbFByb3BhZ2F0b3IoY29uZmlnLnByb3BhZ2F0b3IpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5mb3JjZUZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdGltZW91dCA9IHRoaXMuX2NvbmZpZy5mb3JjZUZsdXNoVGltZW91dE1pbGxpcztcbiAgICAgICAgdmFyIHByb21pc2VzID0gdGhpcy5fcmVnaXN0ZXJlZFNwYW5Qcm9jZXNzb3JzLm1hcChmdW5jdGlvbiAoc3BhblByb2Nlc3Nvcikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0YXRlO1xuICAgICAgICAgICAgICAgIHZhciB0aW1lb3V0SW50ZXJ2YWwgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgRXJyb3IoXCJTcGFuIHByb2Nlc3NvciBkaWQgbm90IGNvbXBsZXRlZCB3aXRoaW4gdGltZW91dCBwZXJpb2Qgb2YgXCIgKyB0aW1lb3V0ICsgXCIgbXNcIikpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEZvcmNlRmx1c2hTdGF0ZS50aW1lb3V0O1xuICAgICAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIHNwYW5Qcm9jZXNzb3JcbiAgICAgICAgICAgICAgICAgICAgLmZvcmNlRmx1c2goKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgIT09IEZvcmNlRmx1c2hTdGF0ZS50aW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEZvcmNlRmx1c2hTdGF0ZS5yZXNvbHZlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dEludGVydmFsKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBGb3JjZUZsdXNoU3RhdGUuZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICB2YXIgZXJyb3JzID0gcmVzdWx0cy5maWx0ZXIoZnVuY3Rpb24gKHJlc3VsdCkgeyByZXR1cm4gcmVzdWx0ICE9PSBGb3JjZUZsdXNoU3RhdGUucmVzb2x2ZWQ7IH0pO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3JzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHsgcmV0dXJuIHJlamVjdChbZXJyb3JdKTsgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQmFzaWNUcmFjZXJQcm92aWRlci5wcm90b3R5cGUuc2h1dGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVNwYW5Qcm9jZXNzb3Iuc2h1dGRvd24oKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRTIGNhbm5vdCB5ZXQgaW5mZXIgdGhlIHR5cGUgb2YgdGhpcy5jb25zdHJ1Y3RvcjpcbiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzM4NDEjaXNzdWVjb21tZW50LTMzNzU2MDE0NlxuICAgICAqIFRoZXJlIGlzIG5vIG5lZWQgdG8gb3ZlcnJpZGUgZWl0aGVyIG9mIHRoZSBnZXR0ZXJzIGluIHlvdXIgY2hpbGQgY2xhc3MuXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIHJlZ2lzdGVyZWQgY29tcG9uZW50IG1hcHMgc2hvdWxkIGJlIHRoZSBzYW1lIGFjcm9zcyBhbGxcbiAgICAgKiBjbGFzc2VzIGluIHRoZSBpbmhlcml0YW5jZSB0cmVlLlxuICAgICAqL1xuICAgIEJhc2ljVHJhY2VyUHJvdmlkZXIucHJvdG90eXBlLl9nZXRQcm9wYWdhdG9yID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5jb25zdHJ1Y3Rvci5fcmVnaXN0ZXJlZFByb3BhZ2F0b3JzLmdldChuYW1lKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hKCk7XG4gICAgfTtcbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5fZ2V0U3BhbkV4cG9ydGVyID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5jb25zdHJ1Y3Rvci5fcmVnaXN0ZXJlZEV4cG9ydGVycy5nZXQobmFtZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYSgpO1xuICAgIH07XG4gICAgQmFzaWNUcmFjZXJQcm92aWRlci5wcm90b3R5cGUuX2J1aWxkUHJvcGFnYXRvckZyb21FbnYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIHBlciBzcGVjLCBwcm9wYWdhdG9ycyBmcm9tIGVudiBtdXN0IGJlIGRlZHVwbGljYXRlZFxuICAgICAgICB2YXIgdW5pcXVlUHJvcGFnYXRvck5hbWVzID0gQXJyYXkuZnJvbShuZXcgU2V0KGdldEVudigpLk9URUxfUFJPUEFHQVRPUlMpKTtcbiAgICAgICAgdmFyIHByb3BhZ2F0b3JzID0gdW5pcXVlUHJvcGFnYXRvck5hbWVzLm1hcChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgdmFyIHByb3BhZ2F0b3IgPSBfdGhpcy5fZ2V0UHJvcGFnYXRvcihuYW1lKTtcbiAgICAgICAgICAgIGlmICghcHJvcGFnYXRvcikge1xuICAgICAgICAgICAgICAgIGRpYWcud2FybihcIlByb3BhZ2F0b3IgXFxcIlwiICsgbmFtZSArIFwiXFxcIiByZXF1ZXN0ZWQgdGhyb3VnaCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyB1bmF2YWlsYWJsZS5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvcGFnYXRvcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB2YWxpZFByb3BhZ2F0b3JzID0gcHJvcGFnYXRvcnMucmVkdWNlKGZ1bmN0aW9uIChsaXN0LCBpdGVtKSB7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIGxpc3QucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBsaXN0O1xuICAgICAgICB9LCBbXSk7XG4gICAgICAgIGlmICh2YWxpZFByb3BhZ2F0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHVuaXF1ZVByb3BhZ2F0b3JOYW1lcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWxpZFByb3BhZ2F0b3JzWzBdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVQcm9wYWdhdG9yKHtcbiAgICAgICAgICAgICAgICBwcm9wYWdhdG9yczogdmFsaWRQcm9wYWdhdG9ycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5fYnVpbGRFeHBvcnRlckZyb21FbnYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBleHBvcnRlck5hbWUgPSBnZXRFbnYoKS5PVEVMX1RSQUNFU19FWFBPUlRFUjtcbiAgICAgICAgaWYgKGV4cG9ydGVyTmFtZSA9PT0gJ25vbmUnIHx8IGV4cG9ydGVyTmFtZSA9PT0gJycpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBleHBvcnRlciA9IHRoaXMuX2dldFNwYW5FeHBvcnRlcihleHBvcnRlck5hbWUpO1xuICAgICAgICBpZiAoIWV4cG9ydGVyKSB7XG4gICAgICAgICAgICBkaWFnLmVycm9yKFwiRXhwb3J0ZXIgXFxcIlwiICsgZXhwb3J0ZXJOYW1lICsgXCJcXFwiIHJlcXVlc3RlZCB0aHJvdWdoIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHVuYXZhaWxhYmxlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhwb3J0ZXI7XG4gICAgfTtcbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLl9yZWdpc3RlcmVkUHJvcGFnYXRvcnMgPSBuZXcgTWFwKFtcbiAgICAgICAgWyd0cmFjZWNvbnRleHQnLCBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvcigpOyB9XSxcbiAgICAgICAgWydiYWdnYWdlJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFczQ0JhZ2dhZ2VQcm9wYWdhdG9yKCk7IH1dLFxuICAgIF0pO1xuICAgIEJhc2ljVHJhY2VyUHJvdmlkZXIuX3JlZ2lzdGVyZWRFeHBvcnRlcnMgPSBuZXcgTWFwKCk7XG4gICAgcmV0dXJuIEJhc2ljVHJhY2VyUHJvdmlkZXI7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fdmFsdWVzID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX192YWx1ZXMpIHx8IGZ1bmN0aW9uKG8pIHtcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufTtcbi8qKlxuICogVGhpcyBpcyBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgU3BhbkV4cG9ydGVyfSB0aGF0IHByaW50cyBzcGFucyB0byB0aGVcbiAqIGNvbnNvbGUuIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMuXG4gKlxuICogTk9URTogVGhpcyB7QGxpbmsgU3BhbkV4cG9ydGVyfSBpcyBpbnRlbmRlZCBmb3IgZGlhZ25vc3RpY3MgdXNlIG9ubHksIG91dHB1dCByZW5kZXJlZCB0byB0aGUgY29uc29sZSBtYXkgY2hhbmdlIGF0IGFueSB0aW1lLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG52YXIgQ29uc29sZVNwYW5FeHBvcnRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb25zb2xlU3BhbkV4cG9ydGVyKCkge1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeHBvcnQgc3BhbnMuXG4gICAgICogQHBhcmFtIHNwYW5zXG4gICAgICogQHBhcmFtIHJlc3VsdENhbGxiYWNrXG4gICAgICovXG4gICAgQ29uc29sZVNwYW5FeHBvcnRlci5wcm90b3R5cGUuZXhwb3J0ID0gZnVuY3Rpb24gKHNwYW5zLCByZXN1bHRDYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VuZFNwYW5zKHNwYW5zLCByZXN1bHRDYWxsYmFjayk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTaHV0ZG93biB0aGUgZXhwb3J0ZXIuXG4gICAgICovXG4gICAgQ29uc29sZVNwYW5FeHBvcnRlci5wcm90b3R5cGUuc2h1dGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3NlbmRTcGFucyhbXSk7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcmNlRmx1c2goKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4cG9ydHMgYW55IHBlbmRpbmcgc3BhbnMgaW4gZXhwb3J0ZXJcbiAgICAgKi9cbiAgICBDb25zb2xlU3BhbkV4cG9ydGVyLnByb3RvdHlwZS5mb3JjZUZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBjb252ZXJ0cyBzcGFuIGluZm8gaW50byBtb3JlIHJlYWRhYmxlIGZvcm1hdFxuICAgICAqIEBwYXJhbSBzcGFuXG4gICAgICovXG4gICAgQ29uc29sZVNwYW5FeHBvcnRlci5wcm90b3R5cGUuX2V4cG9ydEluZm8gPSBmdW5jdGlvbiAoc3Bhbikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXNvdXJjZToge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHNwYW4ucmVzb3VyY2UuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbnN0cnVtZW50YXRpb25TY29wZTogc3Bhbi5pbnN0cnVtZW50YXRpb25MaWJyYXJ5LFxuICAgICAgICAgICAgdHJhY2VJZDogc3Bhbi5zcGFuQ29udGV4dCgpLnRyYWNlSWQsXG4gICAgICAgICAgICBwYXJlbnRJZDogc3Bhbi5wYXJlbnRTcGFuSWQsXG4gICAgICAgICAgICB0cmFjZVN0YXRlOiAoX2EgPSBzcGFuLnNwYW5Db250ZXh0KCkudHJhY2VTdGF0ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNlcmlhbGl6ZSgpLFxuICAgICAgICAgICAgbmFtZTogc3Bhbi5uYW1lLFxuICAgICAgICAgICAgaWQ6IHNwYW4uc3BhbkNvbnRleHQoKS5zcGFuSWQsXG4gICAgICAgICAgICBraW5kOiBzcGFuLmtpbmQsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IGhyVGltZVRvTWljcm9zZWNvbmRzKHNwYW4uc3RhcnRUaW1lKSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiBoclRpbWVUb01pY3Jvc2Vjb25kcyhzcGFuLmR1cmF0aW9uKSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHNwYW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgIHN0YXR1czogc3Bhbi5zdGF0dXMsXG4gICAgICAgICAgICBldmVudHM6IHNwYW4uZXZlbnRzLFxuICAgICAgICAgICAgbGlua3M6IHNwYW4ubGlua3MsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTaG93aW5nIHNwYW5zIGluIGNvbnNvbGVcbiAgICAgKiBAcGFyYW0gc3BhbnNcbiAgICAgKiBAcGFyYW0gZG9uZVxuICAgICAqL1xuICAgIENvbnNvbGVTcGFuRXhwb3J0ZXIucHJvdG90eXBlLl9zZW5kU3BhbnMgPSBmdW5jdGlvbiAoc3BhbnMsIGRvbmUpIHtcbiAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBzcGFuc18xID0gX192YWx1ZXMoc3BhbnMpLCBzcGFuc18xXzEgPSBzcGFuc18xLm5leHQoKTsgIXNwYW5zXzFfMS5kb25lOyBzcGFuc18xXzEgPSBzcGFuc18xLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBzcGFuID0gc3BhbnNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGlyKHRoaXMuX2V4cG9ydEluZm8oc3BhbiksIHsgZGVwdGg6IDMgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChzcGFuc18xXzEgJiYgIXNwYW5zXzFfMS5kb25lICYmIChfYSA9IHNwYW5zXzEucmV0dXJuKSkgX2EuY2FsbChzcGFuc18xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIGRvbmUoeyBjb2RlOiBFeHBvcnRSZXN1bHRDb2RlLlNVQ0NFU1MgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBDb25zb2xlU3BhbkV4cG9ydGVyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBfX3JlYWQgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG52YXIgX19zcHJlYWRBcnJheSA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fc3ByZWFkQXJyYXkpIHx8IGZ1bmN0aW9uICh0bywgZnJvbSwgcGFjaykge1xuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59O1xuLyoqXG4gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLiBJdCBzdG9yZXMgdGhlIGV4cG9ydGVkIHNwYW5zXG4gKiBpbiBhIGxpc3QgaW4gbWVtb3J5IHRoYXQgY2FuIGJlIHJldHJpZXZlZCB1c2luZyB0aGUgYGdldEZpbmlzaGVkU3BhbnMoKWBcbiAqIG1ldGhvZC5cbiAqL1xudmFyIEluTWVtb3J5U3BhbkV4cG9ydGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEluTWVtb3J5U3BhbkV4cG9ydGVyKCkge1xuICAgICAgICB0aGlzLl9maW5pc2hlZFNwYW5zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGV4cG9ydGVyIGhhcyBiZWVuIFwic2h1dGRvd24uXCJcbiAgICAgICAgICogV2hlbiBmYWxzZSwgZXhwb3J0ZWQgc3BhbnMgd2lsbCBub3QgYmUgc3RvcmVkIGluLW1lbW9yeS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3N0b3BwZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgSW5NZW1vcnlTcGFuRXhwb3J0ZXIucHJvdG90eXBlLmV4cG9ydCA9IGZ1bmN0aW9uIChzcGFucywgcmVzdWx0Q2FsbGJhY2spIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodGhpcy5fc3RvcHBlZClcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRDYWxsYmFjayh7XG4gICAgICAgICAgICAgICAgY29kZTogRXhwb3J0UmVzdWx0Q29kZS5GQUlMRUQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcignRXhwb3J0ZXIgaGFzIGJlZW4gc3RvcHBlZCcpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIChfYSA9IHRoaXMuX2ZpbmlzaGVkU3BhbnMpLnB1c2guYXBwbHkoX2EsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChzcGFucyksIGZhbHNlKSk7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzdWx0Q2FsbGJhY2soeyBjb2RlOiBFeHBvcnRSZXN1bHRDb2RlLlNVQ0NFU1MgfSk7IH0sIDApO1xuICAgIH07XG4gICAgSW5NZW1vcnlTcGFuRXhwb3J0ZXIucHJvdG90eXBlLnNodXRkb3duID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9zdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fZmluaXNoZWRTcGFucyA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JjZUZsdXNoKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFeHBvcnRzIGFueSBwZW5kaW5nIHNwYW5zIGluIHRoZSBleHBvcnRlclxuICAgICAqL1xuICAgIEluTWVtb3J5U3BhbkV4cG9ydGVyLnByb3RvdHlwZS5mb3JjZUZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfTtcbiAgICBJbk1lbW9yeVNwYW5FeHBvcnRlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2ZpbmlzaGVkU3BhbnMgPSBbXTtcbiAgICB9O1xuICAgIEluTWVtb3J5U3BhbkV4cG9ydGVyLnByb3RvdHlwZS5nZXRGaW5pc2hlZFNwYW5zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmluaXNoZWRTcGFucztcbiAgICB9O1xuICAgIHJldHVybiBJbk1lbW9yeVNwYW5FeHBvcnRlcjtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX19hd2FpdGVyID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG52YXIgX19nZW5lcmF0b3IgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbn07XG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgU3BhblByb2Nlc3Nvcn0gdGhhdCBjb252ZXJ0cyB0aGUge0BsaW5rIFNwYW59XG4gKiB0byB7QGxpbmsgUmVhZGFibGVTcGFufSBhbmQgcGFzc2VzIGl0IHRvIHRoZSBjb25maWd1cmVkIGV4cG9ydGVyLlxuICpcbiAqIE9ubHkgc3BhbnMgdGhhdCBhcmUgc2FtcGxlZCBhcmUgY29udmVydGVkLlxuICpcbiAqIE5PVEU6IFRoaXMge0BsaW5rIFNwYW5Qcm9jZXNzb3J9IGV4cG9ydHMgZXZlcnkgZW5kZWQgc3BhbiBpbmRpdmlkdWFsbHkgaW5zdGVhZCBvZiBiYXRjaGluZyBzcGFucyB0b2dldGhlciwgd2hpY2ggY2F1c2VzIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIG92ZXJoZWFkIHdpdGggbW9zdCBleHBvcnRlcnMuIEZvciBwcm9kdWN0aW9uIHVzZSwgcGxlYXNlIGNvbnNpZGVyIHVzaW5nIHRoZSB7QGxpbmsgQmF0Y2hTcGFuUHJvY2Vzc29yfSBpbnN0ZWFkLlxuICovXG52YXIgU2ltcGxlU3BhblByb2Nlc3NvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTaW1wbGVTcGFuUHJvY2Vzc29yKF9leHBvcnRlcikge1xuICAgICAgICB0aGlzLl9leHBvcnRlciA9IF9leHBvcnRlcjtcbiAgICAgICAgdGhpcy5fc2h1dGRvd25PbmNlID0gbmV3IEJpbmRPbmNlRnV0dXJlKHRoaXMuX3NodXRkb3duLCB0aGlzKTtcbiAgICAgICAgdGhpcy5fdW5yZXNvbHZlZEV4cG9ydHMgPSBuZXcgU2V0KCk7XG4gICAgfVxuICAgIFNpbXBsZVNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLmZvcmNlRmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogXG4gICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0IHVucmVzb2x2ZWQgcmVzb3VyY2VzIGJlZm9yZSByZXNvbHZpbmdcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh0aGlzLl91bnJlc29sdmVkRXhwb3J0cykpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXdhaXQgdW5yZXNvbHZlZCByZXNvdXJjZXMgYmVmb3JlIHJlc29sdmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9leHBvcnRlci5mb3JjZUZsdXNoKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuX2V4cG9ydGVyLmZvcmNlRmx1c2goKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgU2ltcGxlU3BhblByb2Nlc3Nvci5wcm90b3R5cGUub25TdGFydCA9IGZ1bmN0aW9uIChfc3BhbiwgX3BhcmVudENvbnRleHQpIHsgfTtcbiAgICBTaW1wbGVTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uIChzcGFuKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGlmICh0aGlzLl9zaHV0ZG93bk9uY2UuaXNDYWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHNwYW4uc3BhbkNvbnRleHQoKS50cmFjZUZsYWdzICYgVHJhY2VGbGFncy5TQU1QTEVEKSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkb0V4cG9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbFxuICAgICAgICAgICAgICAgIC5fZXhwb3J0KF90aGlzLl9leHBvcnRlciwgW3NwYW5dKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5jb2RlICE9PSBFeHBvcnRSZXN1bHRDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRXJyb3JIYW5kbGVyKChfYSA9IHJlc3VsdC5lcnJvcikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogbmV3IEVycm9yKFwiU2ltcGxlU3BhblByb2Nlc3Nvcjogc3BhbiBleHBvcnQgZmFpbGVkIChzdGF0dXMgXCIgKyByZXN1bHQgKyBcIilcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGdsb2JhbEVycm9ySGFuZGxlcihlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gQXZvaWQgc2NoZWR1bGluZyBhIHByb21pc2UgdG8gbWFrZSB0aGUgYmVoYXZpb3IgbW9yZSBwcmVkaWN0YWJsZSBhbmQgZWFzaWVyIHRvIHRlc3RcbiAgICAgICAgaWYgKHNwYW4ucmVzb3VyY2UuYXN5bmNBdHRyaWJ1dGVzUGVuZGluZykge1xuICAgICAgICAgICAgdmFyIGV4cG9ydFByb21pc2VfMSA9IChfYiA9IChfYSA9IHNwYW4ucmVzb3VyY2UpLndhaXRGb3JBc3luY0F0dHJpYnV0ZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXhwb3J0UHJvbWlzZV8xICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3VucmVzb2x2ZWRFeHBvcnRzLmRlbGV0ZShleHBvcnRQcm9taXNlXzEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZG9FeHBvcnQoKTtcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsgcmV0dXJuIGdsb2JhbEVycm9ySGFuZGxlcihlcnIpOyB9KTtcbiAgICAgICAgICAgIC8vIHN0b3JlIHRoZSB1bnJlc29sdmVkIGV4cG9ydHNcbiAgICAgICAgICAgIGlmIChleHBvcnRQcm9taXNlXzEgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3VucmVzb2x2ZWRFeHBvcnRzLmFkZChleHBvcnRQcm9taXNlXzEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdm9pZCBkb0V4cG9ydCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTaW1wbGVTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5zaHV0ZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NodXRkb3duT25jZS5jYWxsKCk7XG4gICAgfTtcbiAgICBTaW1wbGVTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5fc2h1dGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leHBvcnRlci5zaHV0ZG93bigpO1xuICAgIH07XG4gICAgcmV0dXJuIFNpbXBsZVNwYW5Qcm9jZXNzb3I7XG59KCkpO1xuXG5leHBvcnQgeyBBbHdheXNPZmZTYW1wbGVyIGFzIEEsIEJhc2ljVHJhY2VyUHJvdmlkZXIgYXMgQiwgQ29uc29sZVNwYW5FeHBvcnRlciBhcyBDLCBGb3JjZUZsdXNoU3RhdGUgYXMgRiwgSW5NZW1vcnlTcGFuRXhwb3J0ZXIgYXMgSSwgTm9vcFNwYW5Qcm9jZXNzb3IgYXMgTiwgUGFyZW50QmFzZWRTYW1wbGVyIGFzIFAsIFJhbmRvbUlkR2VuZXJhdG9yIGFzIFIsIFNpbXBsZVNwYW5Qcm9jZXNzb3IgYXMgUywgVHJhY2VyIGFzIFQsIEJhdGNoU3BhblByb2Nlc3NvciBhcyBhLCBBbHdheXNPblNhbXBsZXIgYXMgYiwgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyIGFzIGMsIFNhbXBsaW5nRGVjaXNpb24gYXMgZCwgU3BhbiBhcyBlIH07Il0sCiAgIm1hcHBpbmdzIjogIkFBQUEsU0FBUyxLQUFLQSxJQUFnQixLQUFLQyxHQUFPLEtBQUtDLElBQW9CLEtBQUtDLEdBQVksS0FBS0MsSUFBZ0IsS0FBS0MsR0FBUyxLQUFLQyxJQUFzQixLQUFLQyxVQUFnQjtBQUN2SyxTQUFTLFNBQWlCO0FBQzFCLFNBQVMsS0FBS0MsR0FBYSxLQUFLQyxJQUFnQixLQUFLQyxHQUFlLEtBQUtDLElBQVEsS0FBS0MsR0FBZ0IsS0FBS0MsSUFBbUIsS0FBS0MsSUFBWSxLQUFLQyxHQUF5QixLQUFLQyxHQUE0QixLQUFLQyxJQUFlLEtBQUtDLElBQStCLEtBQUtDLElBQWEsS0FBS0MsU0FBNEI7QUFDelQsU0FBUyxLQUFLQyxJQUFrQixLQUFLQyxHQUFvQixLQUFLQyxHQUFvQixLQUFLQyxJQUFpQixLQUFLQyxJQUFZLEtBQUtDLEdBQWdCLEtB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LE9BQU93SixDQUFlLEdBRTVDcEcsRUFBUztBQUFBLFVBQ3BCLEdBQUcsU0FBVUksR0FBSztBQUFFLG1CQUFPL0gsRUFBbUIrSCxDQUFHO0FBQUEsVUFBRyxDQUFDO0FBRXJELFVBQUlnRyxLQUFtQixRQUNuQixLQUFLLG1CQUFtQixJQUFJQSxDQUFlO0FBQUEsUUFFbkQ7QUFFSSxVQUFLcEcsRUFBUztBQUFBO0FBQUEsSUFFdEIsR0FDQW1HLEVBQW9CLFVBQVUsV0FBVyxXQUFZO0FBQ2pELGFBQU8sS0FBSyxjQUFjLEtBQUs7QUFBQSxJQUNuQyxHQUNBQSxFQUFvQixVQUFVLFlBQVksV0FBWTtBQUNsRCxhQUFPLEtBQUssVUFBVSxTQUFTO0FBQUEsSUFDbkMsR0FDT0E7QUFBQSxFQUNYLEVBQUU7QUFBQTsiLAogICJuYW1lcyI6IFsiU3BhblN0YXR1c0NvZGUiLCAidHJhY2UiLCAiaXNTcGFuQ29udGV4dFZhbGlkIiwgIlRyYWNlRmxhZ3MiLCAiaXNWYWxpZFRyYWNlSWQiLCAiY29udGV4dCIsICJJTlZBTElEX1NQQU5fQ09OVEVYVCIsICJTcGFuS2luZCIsICJpc1RpbWVJbnB1dCIsICJoclRpbWVEdXJhdGlvbiIsICJvdHBlcmZvcm1hbmNlIiwgImhyVGltZSIsICJtaWxsaXNUb0hyVGltZSIsICJpc1RpbWVJbnB1dEhyVGltZSIsICJhZGRIclRpbWVzIiwgIlNFTUFUVFJTX0VYQ0VQVElPTl9UWVBFIiwgIlNFTUFUVFJTX0VYQ0VQVElPTl9NRVNTQUdFIiwgImdldFRpbWVPcmlnaW4iLCAiU0VNQVRUUlNfRVhDRVBUSU9OX1NUQUNLVFJBQ0UiLCAicHJvcGFnYXRpb24iLCAiaHJUaW1lVG9NaWNyb3NlY29uZHMiLCAiaXNBdHRyaWJ1dGVWYWx1ZSIsICJzYW5pdGl6ZUF0dHJpYnV0ZXMiLCAiZ2xvYmFsRXJyb3JIYW5kbGVyIiwgInN1cHByZXNzVHJhY2luZyIsICJ1bnJlZlRpbWVyIiwgIkJpbmRPbmNlRnV0dXJlIiwgImlzVHJhY2luZ1N1cHByZXNzZWQiLCAiU2FtcGxpbmdEZWNpc2lvbiQxIiwgIkNvbXBvc2l0ZVByb3BhZ2F0b3IiLCAiVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvciIsICJXM0NCYWdnYWdlUHJvcGFnYXRvciIsICJtZXJnZSIsICJpbnRlcm5hbCIsICJUcmFjZXNTYW1wbGVyVmFsdWVzIiwgImdldEVudiIsICJnZXRFbnZXaXRob3V0RGVmYXVsdHMiLCAiREVGQVVMVF9BVFRSSUJVVEVfQ09VTlRfTElNSVQiLCAiREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUIiwgIlJlc291cmNlIiwgIkV4cG9ydFJlc3VsdENvZGUiLCAiRXhjZXB0aW9uRXZlbnROYW1lIiwgIl9fYXNzaWduIiwgInQiLCAicyIsICJpIiwgInAiLCAiX192YWx1ZXMkMiIsICJvIiwgIm0iLCAiX19yZWFkJDIiLCAibiIsICJyIiwgImFyIiwgImUiLCAiZXJyb3IiLCAiX19zcHJlYWRBcnJheSQyIiwgInRvIiwgImZyb20iLCAicGFjayIsICJsIiwgIlNwYW4iLCAicGFyZW50VHJhY2VyIiwgInNwYW5OYW1lIiwgInNwYW5Db250ZXh0IiwgImtpbmQiLCAicGFyZW50U3BhbklkIiwgImxpbmtzIiwgInN0YXJ0VGltZSIsICJfZGVwcmVjYXRlZENsb2NrIiwgImF0dHJpYnV0ZXMiLCAibm93IiwgImtleSIsICJ2YWx1ZSIsICJkaWFnIiwgImVfMSIsICJfYSIsICJfYiIsICJfYyIsICJfZCIsICJrIiwgInYiLCAiZV8xXzEiLCAibmFtZSIsICJhdHRyaWJ1dGVzT3JTdGFydFRpbWUiLCAidGltZVN0YW1wIiwgImxpbmsiLCAic3RhdHVzIiwgImVuZFRpbWUiLCAiaW5wIiwgIm1zRHVyYXRpb24iLCAiZXhjZXB0aW9uIiwgInRpbWUiLCAibGltaXQiLCAiX3RoaXMiLCAidmFsIiwgIlNhbXBsaW5nRGVjaXNpb24iLCAiQWx3YXlzT2ZmU2FtcGxlciIsICJBbHdheXNPblNhbXBsZXIiLCAiUGFyZW50QmFzZWRTYW1wbGVyIiwgImNvbmZpZyIsICJ0cmFjZUlkIiwgInNwYW5LaW5kIiwgInBhcmVudENvbnRleHQiLCAiVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyIiwgIl9yYXRpbyIsICJyYXRpbyIsICJhY2N1bXVsYXRpb24iLCAicG9zIiwgInBhcnQiLCAiRkFMTEJBQ0tfT1RFTF9UUkFDRVNfU0FNUExFUiIsICJERUZBVUxUX1JBVElPIiwgImxvYWREZWZhdWx0Q29uZmlnIiwgImVudiIsICJidWlsZFNhbXBsZXJGcm9tRW52IiwgImVudmlyb25tZW50IiwgImdldFNhbXBsZXJQcm9iYWJpbGl0eUZyb21FbnYiLCAicHJvYmFiaWxpdHkiLCAibWVyZ2VDb25maWciLCAidXNlckNvbmZpZyIsICJwZXJJbnN0YW5jZURlZmF1bHRzIiwgIkRFRkFVTFRfQ09ORklHIiwgInRhcmdldCIsICJyZWNvbmZpZ3VyZUxpbWl0cyIsICJfZSIsICJfZiIsICJfZyIsICJfaCIsICJfaiIsICJfayIsICJfbCIsICJfbSIsICJzcGFuTGltaXRzIiwgInBhcnNlZEVudkNvbmZpZyIsICJCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlIiwgIl9leHBvcnRlciIsICJfc3BhbiIsICJfcGFyZW50Q29udGV4dCIsICJzcGFuIiwgInJlc29sdmUiLCAicmVqZWN0IiwgInByb21pc2VzIiwgImNvdW50IiwgImoiLCAidGltZXIiLCAic3BhbnMiLCAiZG9FeHBvcnQiLCAicmVzdWx0IiwgInBlbmRpbmdSZXNvdXJjZXMiLCAibGVuIiwgImVyciIsICJmbHVzaCIsICJfX2V4dGVuZHMiLCAiZXh0ZW5kU3RhdGljcyIsICJkIiwgImIiLCAiX18iLCAiQmF0Y2hTcGFuUHJvY2Vzc29yIiwgIl9zdXBlciIsICJTUEFOX0lEX0JZVEVTIiwgIlRSQUNFX0lEX0JZVEVTIiwgIlJhbmRvbUlkR2VuZXJhdG9yIiwgImdldElkR2VuZXJhdG9yIiwgIlNIQVJFRF9DSEFSX0NPREVTX0FSUkFZIiwgImJ5dGVzIiwgIlRyYWNlciIsICJpbnN0cnVtZW50YXRpb25MaWJyYXJ5IiwgIl90cmFjZXJQcm92aWRlciIsICJsb2NhbENvbmZpZyIsICJvcHRpb25zIiwgImNvbnRleHQkMSIsICJwYXJlbnRTcGFuIiwgIm5vblJlY29yZGluZ1NwYW4iLCAicGFyZW50U3BhbkNvbnRleHQiLCAic3BhbklkIiwgInRyYWNlU3RhdGUiLCAic2FtcGxpbmdSZXN1bHQiLCAidHJhY2VGbGFncyIsICJpbml0QXR0cmlidXRlcyIsICJhcmcyIiwgImFyZzMiLCAiYXJnNCIsICJvcHRzIiwgImN0eCIsICJmbiIsICJjb250ZXh0V2l0aFNwYW5TZXQiLCAiX192YWx1ZXMkMSIsICJNdWx0aVNwYW5Qcm9jZXNzb3IiLCAiX3NwYW5Qcm9jZXNzb3JzIiwgInNwYW5Qcm9jZXNzb3IiLCAiZV8yIiwgImVfMl8xIiwgImVfMyIsICJlXzNfMSIsICJlXzQiLCAiZV80XzEiLCAiTm9vcFNwYW5Qcm9jZXNzb3IiLCAiX2NvbnRleHQiLCAiX19yZWFkJDEiLCAiX19zcHJlYWRBcnJheSQxIiwgIkZvcmNlRmx1c2hTdGF0ZSIsICJCYXNpY1RyYWNlclByb3ZpZGVyIiwgIm1lcmdlZENvbmZpZyIsICJkZWZhdWx0RXhwb3J0ZXIiLCAiYmF0Y2hQcm9jZXNzb3IiLCAidmVyc2lvbiIsICJ0aW1lb3V0IiwgInN0YXRlIiwgInRpbWVvdXRJbnRlcnZhbCIsICJyZXN1bHRzIiwgImVycm9ycyIsICJ1bmlxdWVQcm9wYWdhdG9yTmFtZXMiLCAicHJvcGFnYXRvcnMiLCAicHJvcGFnYXRvciIsICJ2YWxpZFByb3BhZ2F0b3JzIiwgImxpc3QiLCAiaXRlbSIsICJleHBvcnRlck5hbWUiLCAiZXhwb3J0ZXIiLCAiX192YWx1ZXMiLCAiQ29uc29sZVNwYW5FeHBvcnRlciIsICJyZXN1bHRDYWxsYmFjayIsICJkb25lIiwgInNwYW5zXzEiLCAic3BhbnNfMV8xIiwgIl9fcmVhZCIsICJfX3NwcmVhZEFycmF5IiwgIkluTWVtb3J5U3BhbkV4cG9ydGVyIiwgIl9fYXdhaXRlciIsICJ0aGlzQXJnIiwgIl9hcmd1bWVudHMiLCAiUCIsICJnZW5lcmF0b3IiLCAiYWRvcHQiLCAiZnVsZmlsbGVkIiwgInN0ZXAiLCAicmVqZWN0ZWQiLCAiX19nZW5lcmF0b3IiLCAiYm9keSIsICJfIiwgImYiLCAieSIsICJnIiwgInZlcmIiLCAib3AiLCAiU2ltcGxlU3BhblByb2Nlc3NvciIsICJleHBvcnRQcm9taXNlXzEiXQp9Cg==
957
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiU2ltcGxlU3BhblByb2Nlc3Nvci0hfnswMDJ9fi5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgZiBhcyBTcGFuU3RhdHVzQ29kZSwgdCBhcyB0cmFjZSwgaSBhcyBpc1NwYW5Db250ZXh0VmFsaWQsIFQgYXMgVHJhY2VGbGFncywgZCBhcyBpc1ZhbGlkVHJhY2VJZCwgYyBhcyBjb250ZXh0LCBJIGFzIElOVkFMSURfU1BBTl9DT05URVhULCBTIGFzIFNwYW5LaW5kIH0gZnJvbSAnLi9pbmRleC0hfnswMDZ9fi5qcyc7XG5pbXBvcnQgeyBkIGFzIGRpYWcgfSBmcm9tICcuL2RpYWctYXBpLSF+ezAwNX1+LmpzJztcbmltcG9ydCB7IGwgYXMgaXNUaW1lSW5wdXQsIG4gYXMgaHJUaW1lRHVyYXRpb24sIG8gYXMgb3RwZXJmb3JtYW5jZSwgaiBhcyBoclRpbWUsIG0gYXMgbWlsbGlzVG9IclRpbWUsIHEgYXMgaXNUaW1lSW5wdXRIclRpbWUsIHIgYXMgYWRkSHJUaW1lcywgcyBhcyBTRU1BVFRSU19FWENFUFRJT05fVFlQRSwgdiBhcyBTRU1BVFRSU19FWENFUFRJT05fTUVTU0FHRSwgdyBhcyBnZXRUaW1lT3JpZ2luLCB4IGFzIFNFTUFUVFJTX0VYQ0VQVElPTl9TVEFDS1RSQUNFLCBwIGFzIHByb3BhZ2F0aW9uLCB5IGFzIGhyVGltZVRvTWljcm9zZWNvbmRzIH0gZnJvbSAnLi91cmwtIX57MDA5fX4uanMnO1xuaW1wb3J0IHsgaSBhcyBpc0F0dHJpYnV0ZVZhbHVlLCBzIGFzIHNhbml0aXplQXR0cmlidXRlcywgZyBhcyBnbG9iYWxFcnJvckhhbmRsZXIsIGEgYXMgc3VwcHJlc3NUcmFjaW5nLCB1IGFzIHVucmVmVGltZXIsIEIgYXMgQmluZE9uY2VGdXR1cmUsIGIgYXMgaXNUcmFjaW5nU3VwcHJlc3NlZCwgUyBhcyBTYW1wbGluZ0RlY2lzaW9uJDEsIEMgYXMgQ29tcG9zaXRlUHJvcGFnYXRvciwgVyBhcyBXM0NUcmFjZUNvbnRleHRQcm9wYWdhdG9yLCBjIGFzIFczQ0JhZ2dhZ2VQcm9wYWdhdG9yLCBtIGFzIG1lcmdlLCBkIGFzIGludGVybmFsIH0gZnJvbSAnLi9pbmRleC0hfnswMGx9fi5qcyc7XG5pbXBvcnQgeyBUIGFzIFRyYWNlc1NhbXBsZXJWYWx1ZXMsIGggYXMgZ2V0RW52LCBpIGFzIGdldEVudldpdGhvdXREZWZhdWx0cywgRCBhcyBERUZBVUxUX0FUVFJJQlVURV9DT1VOVF9MSU1JVCwgaiBhcyBERUZBVUxUX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQgfSBmcm9tICcuL3Nkay1pbmZvLSF+ezAwYn1+LmpzJztcbmltcG9ydCB7IFIgYXMgUmVzb3VyY2UgfSBmcm9tICcuL1Jlc291cmNlLSF+ezAwYX1+LmpzJztcbmltcG9ydCB7IEUgYXMgRXhwb3J0UmVzdWx0Q29kZSB9IGZyb20gJy4vRXhwb3J0UmVzdWx0LSF+ezAwZH1+LmpzJztcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vIEV2ZW50IG5hbWUgZGVmaW5pdGlvbnNcbnZhciBFeGNlcHRpb25FdmVudE5hbWUgPSAnZXhjZXB0aW9uJztcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBfX2Fzc2lnbiA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xudmFyIF9fdmFsdWVzJDIgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3ZhbHVlcykgfHwgZnVuY3Rpb24obykge1xuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xuICAgICAgICB9XG4gICAgfTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59O1xudmFyIF9fcmVhZCQyID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19yZWFkKSB8fCBmdW5jdGlvbiAobywgbikge1xuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgICBpZiAoIW0pIHJldHVybiBvO1xuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xuICAgIHRyeSB7XG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxuICAgIH1cbiAgICByZXR1cm4gYXI7XG59O1xudmFyIF9fc3ByZWFkQXJyYXkkMiA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fc3ByZWFkQXJyYXkpIHx8IGZ1bmN0aW9uICh0bywgZnJvbSwgcGFjaykge1xuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59O1xuLyoqXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBzcGFuLlxuICovXG52YXIgU3BhbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFNwYW4gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBjYWxsaW5nIFNwYW4gY29uc3RydWN0b3IgZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVzZSB0cmFjZXIuc3RhcnRTcGFuLlxuICAgICAqICovXG4gICAgZnVuY3Rpb24gU3BhbihwYXJlbnRUcmFjZXIsIGNvbnRleHQsIHNwYW5OYW1lLCBzcGFuQ29udGV4dCwga2luZCwgcGFyZW50U3BhbklkLCBsaW5rcywgc3RhcnRUaW1lLCBfZGVwcmVjYXRlZENsb2NrLCAvLyBrZWVwaW5nIHRoaXMgYXJndW1lbnQgZXZlbiB0aG91Z2ggaXQgaXMgdW51c2VkIHRvIGVuc3VyZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKGxpbmtzID09PSB2b2lkIDApIHsgbGlua3MgPSBbXTsgfVxuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5saW5rcyA9IFtdO1xuICAgICAgICB0aGlzLmV2ZW50cyA9IFtdO1xuICAgICAgICB0aGlzLl9kcm9wcGVkQXR0cmlidXRlc0NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5fZHJvcHBlZEV2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5fZHJvcHBlZExpbmtzQ291bnQgPSAwO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHtcbiAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLlVOU0VULFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVuZFRpbWUgPSBbMCwgMF07XG4gICAgICAgIHRoaXMuX2VuZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2R1cmF0aW9uID0gWy0xLCAtMV07XG4gICAgICAgIHRoaXMubmFtZSA9IHNwYW5OYW1lO1xuICAgICAgICB0aGlzLl9zcGFuQ29udGV4dCA9IHNwYW5Db250ZXh0O1xuICAgICAgICB0aGlzLnBhcmVudFNwYW5JZCA9IHBhcmVudFNwYW5JZDtcbiAgICAgICAgdGhpcy5raW5kID0ga2luZDtcbiAgICAgICAgdGhpcy5saW5rcyA9IGxpbmtzO1xuICAgICAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdGhpcy5fcGVyZm9ybWFuY2VTdGFydFRpbWUgPSBvdHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICB0aGlzLl9wZXJmb3JtYW5jZU9mZnNldCA9XG4gICAgICAgICAgICBub3cgLSAodGhpcy5fcGVyZm9ybWFuY2VTdGFydFRpbWUgKyBnZXRUaW1lT3JpZ2luKCkpO1xuICAgICAgICB0aGlzLl9zdGFydFRpbWVQcm92aWRlZCA9IHN0YXJ0VGltZSAhPSBudWxsO1xuICAgICAgICB0aGlzLnN0YXJ0VGltZSA9IHRoaXMuX2dldFRpbWUoc3RhcnRUaW1lICE9PSBudWxsICYmIHN0YXJ0VGltZSAhPT0gdm9pZCAwID8gc3RhcnRUaW1lIDogbm93KTtcbiAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHBhcmVudFRyYWNlci5yZXNvdXJjZTtcbiAgICAgICAgdGhpcy5pbnN0cnVtZW50YXRpb25MaWJyYXJ5ID0gcGFyZW50VHJhY2VyLmluc3RydW1lbnRhdGlvbkxpYnJhcnk7XG4gICAgICAgIHRoaXMuX3NwYW5MaW1pdHMgPSBwYXJlbnRUcmFjZXIuZ2V0U3BhbkxpbWl0cygpO1xuICAgICAgICB0aGlzLl9hdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0ID1cbiAgICAgICAgICAgIHRoaXMuX3NwYW5MaW1pdHMuYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdCB8fCAwO1xuICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3BhblByb2Nlc3NvciA9IHBhcmVudFRyYWNlci5nZXRBY3RpdmVTcGFuUHJvY2Vzc29yKCk7XG4gICAgICAgIHRoaXMuX3NwYW5Qcm9jZXNzb3Iub25TdGFydCh0aGlzLCBjb250ZXh0KTtcbiAgICB9XG4gICAgU3Bhbi5wcm90b3R5cGUuc3BhbkNvbnRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zcGFuQ29udGV4dDtcbiAgICB9O1xuICAgIFNwYW4ucHJvdG90eXBlLnNldEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHRoaXMuX2lzU3BhbkVuZGVkKCkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgaWYgKGtleS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGRpYWcud2FybihcIkludmFsaWQgYXR0cmlidXRlIGtleTogXCIgKyBrZXkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0F0dHJpYnV0ZVZhbHVlKHZhbHVlKSkge1xuICAgICAgICAgICAgZGlhZy53YXJuKFwiSW52YWxpZCBhdHRyaWJ1dGUgdmFsdWUgc2V0IGZvciBrZXk6IFwiICsga2V5KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmF0dHJpYnV0ZXMpLmxlbmd0aCA+PVxuICAgICAgICAgICAgdGhpcy5fc3BhbkxpbWl0cy5hdHRyaWJ1dGVDb3VudExpbWl0ICYmXG4gICAgICAgICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuYXR0cmlidXRlcywga2V5KSkge1xuICAgICAgICAgICAgdGhpcy5fZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCsrO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzW2tleV0gPSB0aGlzLl90cnVuY2F0ZVRvU2l6ZSh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgU3Bhbi5wcm90b3R5cGUuc2V0QXR0cmlidXRlcyA9IGZ1bmN0aW9uIChhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHZhciBlXzEsIF9hO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyQyKE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBfZCA9IF9fcmVhZCQyKF9jLnZhbHVlLCAyKSwgayA9IF9kWzBdLCB2ID0gX2RbMV07XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoaywgdik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgU3BhbiBOYW1lXG4gICAgICogQHBhcmFtIFthdHRyaWJ1dGVzT3JTdGFydFRpbWVdIFNwYW4gYXR0cmlidXRlcyBvciBzdGFydCB0aW1lXG4gICAgICogICAgIGlmIHR5cGUgaXMge0B0eXBlIFRpbWVJbnB1dH0gYW5kIDNyZCBwYXJhbSBpcyB1bmRlZmluZWRcbiAgICAgKiBAcGFyYW0gW3RpbWVTdGFtcF0gU3BlY2lmaWVkIHRpbWUgc3RhbXAgZm9yIHRoZSBldmVudFxuICAgICAqL1xuICAgIFNwYW4ucHJvdG90eXBlLmFkZEV2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIGF0dHJpYnV0ZXNPclN0YXJ0VGltZSwgdGltZVN0YW1wKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc1NwYW5FbmRlZCgpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGlmICh0aGlzLl9zcGFuTGltaXRzLmV2ZW50Q291bnRMaW1pdCA9PT0gMCkge1xuICAgICAgICAgICAgZGlhZy53YXJuKCdObyBldmVudHMgYWxsb3dlZC4nKTtcbiAgICAgICAgICAgIHRoaXMuX2Ryb3BwZWRFdmVudHNDb3VudCsrO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZXZlbnRzLmxlbmd0aCA+PSB0aGlzLl9zcGFuTGltaXRzLmV2ZW50Q291bnRMaW1pdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2Ryb3BwZWRFdmVudHNDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGRpYWcuZGVidWcoJ0Ryb3BwaW5nIGV4dHJhIGV2ZW50cy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNoaWZ0KCk7XG4gICAgICAgICAgICB0aGlzLl9kcm9wcGVkRXZlbnRzQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNUaW1lSW5wdXQoYXR0cmlidXRlc09yU3RhcnRUaW1lKSkge1xuICAgICAgICAgICAgaWYgKCFpc1RpbWVJbnB1dCh0aW1lU3RhbXApKSB7XG4gICAgICAgICAgICAgICAgdGltZVN0YW1wID0gYXR0cmlidXRlc09yU3RhcnRUaW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXR0cmlidXRlc09yU3RhcnRUaW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhdHRyaWJ1dGVzID0gc2FuaXRpemVBdHRyaWJ1dGVzKGF0dHJpYnV0ZXNPclN0YXJ0VGltZSk7XG4gICAgICAgIHRoaXMuZXZlbnRzLnB1c2goe1xuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXMsXG4gICAgICAgICAgICB0aW1lOiB0aGlzLl9nZXRUaW1lKHRpbWVTdGFtcCksXG4gICAgICAgICAgICBkcm9wcGVkQXR0cmlidXRlc0NvdW50OiAwLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBTcGFuLnByb3RvdHlwZS5hZGRMaW5rID0gZnVuY3Rpb24gKGxpbmspIHtcbiAgICAgICAgdGhpcy5saW5rcy5wdXNoKGxpbmspO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFNwYW4ucHJvdG90eXBlLmFkZExpbmtzID0gZnVuY3Rpb24gKGxpbmtzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy5saW5rcykucHVzaC5hcHBseShfYSwgX19zcHJlYWRBcnJheSQyKFtdLCBfX3JlYWQkMihsaW5rcyksIGZhbHNlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgU3Bhbi5wcm90b3R5cGUuc2V0U3RhdHVzID0gZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICBpZiAodGhpcy5faXNTcGFuRW5kZWQoKSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IF9fYXNzaWduKHt9LCBzdGF0dXMpO1xuICAgICAgICAvLyBXaGVuIHVzaW5nIHRyeS1jYXRjaCwgdGhlIGNhdWdodCBcImVycm9yXCIgaXMgb2YgdHlwZSBgYW55YC4gV2hlbiB0aGVuIGFzc2lnbmluZyBgYW55YCB0byBgc3RhdHVzLm1lc3NhZ2VgLFxuICAgICAgICAvLyBUeXBlU2NyaXB0IHdpbGwgbm90IGVycm9yLiBXaGlsZSB0aGlzIGNhbiBoYXBwZW4gZHVyaW5nIHVzZSBvZiBhbnkgQVBJLCBpdCBpcyBtb3JlIGNvbW1vbiBvbiBTcGFuI3NldFN0YXR1cygpXG4gICAgICAgIC8vIGFzIGl0J3MgbGlrZWx5IHVzZWQgaW4gYSBjYXRjaC1ibG9jay4gVGhlcmVmb3JlLCB3ZSB2YWxpZGF0ZSBpZiBgc3RhdHVzLm1lc3NhZ2VgIGlzIGFjdHVhbGx5IGEgc3RyaW5nLCBudWxsLCBvclxuICAgICAgICAvLyB1bmRlZmluZWQgdG8gYXZvaWQgYW4gaW5jb3JyZWN0IHR5cGUgY2F1c2luZyBpc3N1ZXMgZG93bnN0cmVhbS5cbiAgICAgICAgaWYgKHRoaXMuc3RhdHVzLm1lc3NhZ2UgIT0gbnVsbCAmJiB0eXBlb2Ygc3RhdHVzLm1lc3NhZ2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBkaWFnLndhcm4oXCJEcm9wcGluZyBpbnZhbGlkIHN0YXR1cy5tZXNzYWdlIG9mIHR5cGUgJ1wiICsgdHlwZW9mIHN0YXR1cy5tZXNzYWdlICsgXCInLCBleHBlY3RlZCAnc3RyaW5nJ1wiKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN0YXR1cy5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgU3Bhbi5wcm90b3R5cGUudXBkYXRlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc1NwYW5FbmRlZCgpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgU3Bhbi5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGVuZFRpbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzU3BhbkVuZGVkKCkpIHtcbiAgICAgICAgICAgIGRpYWcuZXJyb3IodGhpcy5uYW1lICsgXCIgXCIgKyB0aGlzLl9zcGFuQ29udGV4dC50cmFjZUlkICsgXCItXCIgKyB0aGlzLl9zcGFuQ29udGV4dC5zcGFuSWQgKyBcIiAtIFlvdSBjYW4gb25seSBjYWxsIGVuZCgpIG9uIGEgc3BhbiBvbmNlLlwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9lbmRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZW5kVGltZSA9IHRoaXMuX2dldFRpbWUoZW5kVGltZSk7XG4gICAgICAgIHRoaXMuX2R1cmF0aW9uID0gaHJUaW1lRHVyYXRpb24odGhpcy5zdGFydFRpbWUsIHRoaXMuZW5kVGltZSk7XG4gICAgICAgIGlmICh0aGlzLl9kdXJhdGlvblswXSA8IDApIHtcbiAgICAgICAgICAgIGRpYWcud2FybignSW5jb25zaXN0ZW50IHN0YXJ0IGFuZCBlbmQgdGltZSwgc3RhcnRUaW1lID4gZW5kVGltZS4gU2V0dGluZyBzcGFuIGR1cmF0aW9uIHRvIDBtcy4nLCB0aGlzLnN0YXJ0VGltZSwgdGhpcy5lbmRUaW1lKTtcbiAgICAgICAgICAgIHRoaXMuZW5kVGltZSA9IHRoaXMuc3RhcnRUaW1lLnNsaWNlKCk7XG4gICAgICAgICAgICB0aGlzLl9kdXJhdGlvbiA9IFswLCAwXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZHJvcHBlZEV2ZW50c0NvdW50ID4gMCkge1xuICAgICAgICAgICAgZGlhZy53YXJuKFwiRHJvcHBlZCBcIiArIHRoaXMuX2Ryb3BwZWRFdmVudHNDb3VudCArIFwiIGV2ZW50cyBiZWNhdXNlIGV2ZW50Q291bnRMaW1pdCByZWFjaGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NwYW5Qcm9jZXNzb3Iub25FbmQodGhpcyk7XG4gICAgfTtcbiAgICBTcGFuLnByb3RvdHlwZS5fZ2V0VGltZSA9IGZ1bmN0aW9uIChpbnApIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnAgPT09ICdudW1iZXInICYmIGlucCA8PSBvdHBlcmZvcm1hbmNlLm5vdygpKSB7XG4gICAgICAgICAgICAvLyBtdXN0IGJlIGEgcGVyZm9ybWFuY2UgdGltZXN0YW1wXG4gICAgICAgICAgICAvLyBhcHBseSBjb3JyZWN0aW9uIGFuZCBjb252ZXJ0IHRvIGhydGltZVxuICAgICAgICAgICAgcmV0dXJuIGhyVGltZShpbnAgKyB0aGlzLl9wZXJmb3JtYW5jZU9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBpbnAgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gbWlsbGlzVG9IclRpbWUoaW5wKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5wIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbGxpc1RvSHJUaW1lKGlucC5nZXRUaW1lKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1RpbWVJbnB1dEhyVGltZShpbnApKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9zdGFydFRpbWVQcm92aWRlZCkge1xuICAgICAgICAgICAgLy8gaWYgdXNlciBwcm92aWRlZCBhIHRpbWUgZm9yIHRoZSBzdGFydCBtYW51YWxseVxuICAgICAgICAgICAgLy8gd2UgY2FuJ3QgdXNlIGR1cmF0aW9uIHRvIGNhbGN1bGF0ZSBldmVudC9lbmQgdGltZXNcbiAgICAgICAgICAgIHJldHVybiBtaWxsaXNUb0hyVGltZShEYXRlLm5vdygpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbXNEdXJhdGlvbiA9IG90cGVyZm9ybWFuY2Uubm93KCkgLSB0aGlzLl9wZXJmb3JtYW5jZVN0YXJ0VGltZTtcbiAgICAgICAgcmV0dXJuIGFkZEhyVGltZXModGhpcy5zdGFydFRpbWUsIG1pbGxpc1RvSHJUaW1lKG1zRHVyYXRpb24pKTtcbiAgICB9O1xuICAgIFNwYW4ucHJvdG90eXBlLmlzUmVjb3JkaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5kZWQgPT09IGZhbHNlO1xuICAgIH07XG4gICAgU3Bhbi5wcm90b3R5cGUucmVjb3JkRXhjZXB0aW9uID0gZnVuY3Rpb24gKGV4Y2VwdGlvbiwgdGltZSkge1xuICAgICAgICB2YXIgYXR0cmlidXRlcyA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGV4Y2VwdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXNbU0VNQVRUUlNfRVhDRVBUSU9OX01FU1NBR0VdID0gZXhjZXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbi5jb2RlKSB7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRlc1tTRU1BVFRSU19FWENFUFRJT05fVFlQRV0gPSBleGNlcHRpb24uY29kZS50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZXhjZXB0aW9uLm5hbWUpIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzW1NFTUFUVFJTX0VYQ0VQVElPTl9UWVBFXSA9IGV4Y2VwdGlvbi5uYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbi5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRlc1tTRU1BVFRSU19FWENFUFRJT05fTUVTU0FHRV0gPSBleGNlcHRpb24ubWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChleGNlcHRpb24uc3RhY2spIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzW1NFTUFUVFJTX0VYQ0VQVElPTl9TVEFDS1RSQUNFXSA9IGV4Y2VwdGlvbi5zdGFjaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyB0aGVzZSBhcmUgbWluaW11bSByZXF1aXJlbWVudHMgZnJvbSBzcGVjXG4gICAgICAgIGlmIChhdHRyaWJ1dGVzW1NFTUFUVFJTX0VYQ0VQVElPTl9UWVBFXSB8fFxuICAgICAgICAgICAgYXR0cmlidXRlc1tTRU1BVFRSU19FWENFUFRJT05fTUVTU0FHRV0pIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnQoRXhjZXB0aW9uRXZlbnROYW1lLCBhdHRyaWJ1dGVzLCB0aW1lKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRpYWcud2FybihcIkZhaWxlZCB0byByZWNvcmQgYW4gZXhjZXB0aW9uIFwiICsgZXhjZXB0aW9uKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNwYW4ucHJvdG90eXBlLCBcImR1cmF0aW9uXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZHVyYXRpb247XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3Bhbi5wcm90b3R5cGUsIFwiZW5kZWRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmRlZDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTcGFuLnByb3RvdHlwZSwgXCJkcm9wcGVkQXR0cmlidXRlc0NvdW50XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZHJvcHBlZEF0dHJpYnV0ZXNDb3VudDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTcGFuLnByb3RvdHlwZSwgXCJkcm9wcGVkRXZlbnRzQ291bnRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kcm9wcGVkRXZlbnRzQ291bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3Bhbi5wcm90b3R5cGUsIFwiZHJvcHBlZExpbmtzQ291bnRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kcm9wcGVkTGlua3NDb3VudDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIFNwYW4ucHJvdG90eXBlLl9pc1NwYW5FbmRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2VuZGVkKSB7XG4gICAgICAgICAgICBkaWFnLndhcm4oXCJDYW4gbm90IGV4ZWN1dGUgdGhlIG9wZXJhdGlvbiBvbiBlbmRlZCBTcGFuIHt0cmFjZUlkOiBcIiArIHRoaXMuX3NwYW5Db250ZXh0LnRyYWNlSWQgKyBcIiwgc3BhbklkOiBcIiArIHRoaXMuX3NwYW5Db250ZXh0LnNwYW5JZCArIFwifVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZW5kZWQ7XG4gICAgfTtcbiAgICAvLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIHRydW5jYXRlIGdpdmVuIHZhbHVlIHdpdGhpbiBzaXplXG4gICAgLy8gZm9yIHZhbHVlIHR5cGUgb2Ygc3RyaW5nLCB3aWxsIHRydW5jYXRlIHRvIGdpdmVuIGxpbWl0XG4gICAgLy8gZm9yIHR5cGUgb2Ygbm9uLXN0cmluZywgd2lsbCByZXR1cm4gc2FtZSB2YWx1ZVxuICAgIFNwYW4ucHJvdG90eXBlLl90cnVuY2F0ZVRvTGltaXRVdGlsID0gZnVuY3Rpb24gKHZhbHVlLCBsaW1pdCkge1xuICAgICAgICBpZiAodmFsdWUubGVuZ3RoIDw9IGxpbWl0KSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlLnN1YnN0cmluZygwLCBsaW1pdCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgZ2l2ZW4gYXR0cmlidXRlIHZhbHVlIGlzIG9mIHR5cGUgc3RyaW5nIGFuZCBoYXMgbW9yZSBjaGFyYWN0ZXJzIHRoYW4gZ2l2ZW4ge0Bjb2RlIGF0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXR9IHRoZW5cbiAgICAgKiByZXR1cm4gc3RyaW5nIHdpdGggdHJ1bmNhdGVkIHRvIHtAY29kZSBhdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0fSBjaGFyYWN0ZXJzXG4gICAgICpcbiAgICAgKiBJZiB0aGUgZ2l2ZW4gYXR0cmlidXRlIHZhbHVlIGlzIGFycmF5IG9mIHN0cmluZ3MgdGhlblxuICAgICAqIHJldHVybiBuZXcgYXJyYXkgb2Ygc3RyaW5ncyB3aXRoIGVhY2ggZWxlbWVudCB0cnVuY2F0ZWQgdG8ge0Bjb2RlIGF0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXR9IGNoYXJhY3RlcnNcbiAgICAgKlxuICAgICAqIE90aGVyd2lzZSByZXR1cm4gc2FtZSBBdHRyaWJ1dGUge0Bjb2RlIHZhbHVlfVxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIEF0dHJpYnV0ZSB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHRydW5jYXRlZCBhdHRyaWJ1dGUgdmFsdWUgaWYgcmVxdWlyZWQsIG90aGVyd2lzZSBzYW1lIHZhbHVlXG4gICAgICovXG4gICAgU3Bhbi5wcm90b3R5cGUuX3RydW5jYXRlVG9TaXplID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBsaW1pdCA9IHRoaXMuX2F0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXQ7XG4gICAgICAgIC8vIENoZWNrIGxpbWl0XG4gICAgICAgIGlmIChsaW1pdCA8PSAwKSB7XG4gICAgICAgICAgICAvLyBOZWdhdGl2ZSB2YWx1ZXMgYXJlIGludmFsaWQsIHNvIGRvIG5vdCB0cnVuY2F0ZVxuICAgICAgICAgICAgZGlhZy53YXJuKFwiQXR0cmlidXRlIHZhbHVlIGxpbWl0IG11c3QgYmUgcG9zaXRpdmUsIGdvdCBcIiArIGxpbWl0KTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdHJpbmdcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90cnVuY2F0ZVRvTGltaXRVdGlsKHZhbHVlLCBsaW1pdCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXJyYXkgb2Ygc3RyaW5nc1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5tYXAoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/IF90aGlzLl90cnVuY2F0ZVRvTGltaXRVdGlsKHZhbCwgbGltaXQpIDogdmFsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3RoZXIgdHlwZXMsIG5vIG5lZWQgdG8gYXBwbHkgdmFsdWUgbGVuZ3RoIGxpbWl0XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIHJldHVybiBTcGFuO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSBzYW1wbGluZyBkZWNpc2lvbiB0aGF0IGRldGVybWluZXMgaG93IGEge0BsaW5rIFNwYW59IHdpbGwgYmUgcmVjb3JkZWRcbiAqIGFuZCBjb2xsZWN0ZWQuXG4gKi9cbnZhciBTYW1wbGluZ0RlY2lzaW9uO1xuKGZ1bmN0aW9uIChTYW1wbGluZ0RlY2lzaW9uKSB7XG4gICAgLyoqXG4gICAgICogYFNwYW4uaXNSZWNvcmRpbmcoKSA9PT0gZmFsc2VgLCBzcGFuIHdpbGwgbm90IGJlIHJlY29yZGVkIGFuZCBhbGwgZXZlbnRzXG4gICAgICogYW5kIGF0dHJpYnV0ZXMgd2lsbCBiZSBkcm9wcGVkLlxuICAgICAqL1xuICAgIFNhbXBsaW5nRGVjaXNpb25bU2FtcGxpbmdEZWNpc2lvbltcIk5PVF9SRUNPUkRcIl0gPSAwXSA9IFwiTk9UX1JFQ09SRFwiO1xuICAgIC8qKlxuICAgICAqIGBTcGFuLmlzUmVjb3JkaW5nKCkgPT09IHRydWVgLCBidXQgYFNhbXBsZWRgIGZsYWcgaW4ge0BsaW5rIFRyYWNlRmxhZ3N9XG4gICAgICogTVVTVCBOT1QgYmUgc2V0LlxuICAgICAqL1xuICAgIFNhbXBsaW5nRGVjaXNpb25bU2FtcGxpbmdEZWNpc2lvbltcIlJFQ09SRFwiXSA9IDFdID0gXCJSRUNPUkRcIjtcbiAgICAvKipcbiAgICAgKiBgU3Bhbi5pc1JlY29yZGluZygpID09PSB0cnVlYCBBTkQgYFNhbXBsZWRgIGZsYWcgaW4ge0BsaW5rIFRyYWNlRmxhZ3N9XG4gICAgICogTVVTVCBiZSBzZXQuXG4gICAgICovXG4gICAgU2FtcGxpbmdEZWNpc2lvbltTYW1wbGluZ0RlY2lzaW9uW1wiUkVDT1JEX0FORF9TQU1QTEVEXCJdID0gMl0gPSBcIlJFQ09SRF9BTkRfU0FNUExFRFwiO1xufSkoU2FtcGxpbmdEZWNpc2lvbiB8fCAoU2FtcGxpbmdEZWNpc2lvbiA9IHt9KSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogU2FtcGxlciB0aGF0IHNhbXBsZXMgbm8gdHJhY2VzLiAqL1xudmFyIEFsd2F5c09mZlNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQWx3YXlzT2ZmU2FtcGxlcigpIHtcbiAgICB9XG4gICAgQWx3YXlzT2ZmU2FtcGxlci5wcm90b3R5cGUuc2hvdWxkU2FtcGxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGVjaXNpb246IFNhbXBsaW5nRGVjaXNpb24uTk9UX1JFQ09SRCxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIEFsd2F5c09mZlNhbXBsZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJ0Fsd2F5c09mZlNhbXBsZXInO1xuICAgIH07XG4gICAgcmV0dXJuIEFsd2F5c09mZlNhbXBsZXI7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqIFNhbXBsZXIgdGhhdCBzYW1wbGVzIGFsbCB0cmFjZXMuICovXG52YXIgQWx3YXlzT25TYW1wbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFsd2F5c09uU2FtcGxlcigpIHtcbiAgICB9XG4gICAgQWx3YXlzT25TYW1wbGVyLnByb3RvdHlwZS5zaG91bGRTYW1wbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZWNpc2lvbjogU2FtcGxpbmdEZWNpc2lvbi5SRUNPUkRfQU5EX1NBTVBMRUQsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBBbHdheXNPblNhbXBsZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJ0Fsd2F5c09uU2FtcGxlcic7XG4gICAgfTtcbiAgICByZXR1cm4gQWx3YXlzT25TYW1wbGVyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSBjb21wb3NpdGUgc2FtcGxlciB0aGF0IGVpdGhlciByZXNwZWN0cyB0aGUgcGFyZW50IHNwYW4ncyBzYW1wbGluZyBkZWNpc2lvblxuICogb3IgZGVsZWdhdGVzIHRvIGBkZWxlZ2F0ZVNhbXBsZXJgIGZvciByb290IHNwYW5zLlxuICovXG52YXIgUGFyZW50QmFzZWRTYW1wbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBhcmVudEJhc2VkU2FtcGxlcihjb25maWcpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICB0aGlzLl9yb290ID0gY29uZmlnLnJvb3Q7XG4gICAgICAgIGlmICghdGhpcy5fcm9vdCkge1xuICAgICAgICAgICAgZ2xvYmFsRXJyb3JIYW5kbGVyKG5ldyBFcnJvcignUGFyZW50QmFzZWRTYW1wbGVyIG11c3QgaGF2ZSBhIHJvb3Qgc2FtcGxlciBjb25maWd1cmVkJykpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdCA9IG5ldyBBbHdheXNPblNhbXBsZXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZW1vdGVQYXJlbnRTYW1wbGVkID1cbiAgICAgICAgICAgIChfYSA9IGNvbmZpZy5yZW1vdGVQYXJlbnRTYW1wbGVkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBuZXcgQWx3YXlzT25TYW1wbGVyKCk7XG4gICAgICAgIHRoaXMuX3JlbW90ZVBhcmVudE5vdFNhbXBsZWQgPVxuICAgICAgICAgICAgKF9iID0gY29uZmlnLnJlbW90ZVBhcmVudE5vdFNhbXBsZWQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IG5ldyBBbHdheXNPZmZTYW1wbGVyKCk7XG4gICAgICAgIHRoaXMuX2xvY2FsUGFyZW50U2FtcGxlZCA9XG4gICAgICAgICAgICAoX2MgPSBjb25maWcubG9jYWxQYXJlbnRTYW1wbGVkKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBuZXcgQWx3YXlzT25TYW1wbGVyKCk7XG4gICAgICAgIHRoaXMuX2xvY2FsUGFyZW50Tm90U2FtcGxlZCA9XG4gICAgICAgICAgICAoX2QgPSBjb25maWcubG9jYWxQYXJlbnROb3RTYW1wbGVkKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBuZXcgQWx3YXlzT2ZmU2FtcGxlcigpO1xuICAgIH1cbiAgICBQYXJlbnRCYXNlZFNhbXBsZXIucHJvdG90eXBlLnNob3VsZFNhbXBsZSA9IGZ1bmN0aW9uIChjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKSB7XG4gICAgICAgIHZhciBwYXJlbnRDb250ZXh0ID0gdHJhY2UuZ2V0U3BhbkNvbnRleHQoY29udGV4dCk7XG4gICAgICAgIGlmICghcGFyZW50Q29udGV4dCB8fCAhaXNTcGFuQ29udGV4dFZhbGlkKHBhcmVudENvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcm9vdC5zaG91bGRTYW1wbGUoY29udGV4dCwgdHJhY2VJZCwgc3Bhbk5hbWUsIHNwYW5LaW5kLCBhdHRyaWJ1dGVzLCBsaW5rcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmVudENvbnRleHQuaXNSZW1vdGUpIHtcbiAgICAgICAgICAgIGlmIChwYXJlbnRDb250ZXh0LnRyYWNlRmxhZ3MgJiBUcmFjZUZsYWdzLlNBTVBMRUQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVtb3RlUGFyZW50U2FtcGxlZC5zaG91bGRTYW1wbGUoY29udGV4dCwgdHJhY2VJZCwgc3Bhbk5hbWUsIHNwYW5LaW5kLCBhdHRyaWJ1dGVzLCBsaW5rcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVtb3RlUGFyZW50Tm90U2FtcGxlZC5zaG91bGRTYW1wbGUoY29udGV4dCwgdHJhY2VJZCwgc3Bhbk5hbWUsIHNwYW5LaW5kLCBhdHRyaWJ1dGVzLCBsaW5rcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmVudENvbnRleHQudHJhY2VGbGFncyAmIFRyYWNlRmxhZ3MuU0FNUExFRCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsUGFyZW50U2FtcGxlZC5zaG91bGRTYW1wbGUoY29udGV4dCwgdHJhY2VJZCwgc3Bhbk5hbWUsIHNwYW5LaW5kLCBhdHRyaWJ1dGVzLCBsaW5rcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsUGFyZW50Tm90U2FtcGxlZC5zaG91bGRTYW1wbGUoY29udGV4dCwgdHJhY2VJZCwgc3Bhbk5hbWUsIHNwYW5LaW5kLCBhdHRyaWJ1dGVzLCBsaW5rcyk7XG4gICAgfTtcbiAgICBQYXJlbnRCYXNlZFNhbXBsZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCJQYXJlbnRCYXNlZHtyb290PVwiICsgdGhpcy5fcm9vdC50b1N0cmluZygpICsgXCIsIHJlbW90ZVBhcmVudFNhbXBsZWQ9XCIgKyB0aGlzLl9yZW1vdGVQYXJlbnRTYW1wbGVkLnRvU3RyaW5nKCkgKyBcIiwgcmVtb3RlUGFyZW50Tm90U2FtcGxlZD1cIiArIHRoaXMuX3JlbW90ZVBhcmVudE5vdFNhbXBsZWQudG9TdHJpbmcoKSArIFwiLCBsb2NhbFBhcmVudFNhbXBsZWQ9XCIgKyB0aGlzLl9sb2NhbFBhcmVudFNhbXBsZWQudG9TdHJpbmcoKSArIFwiLCBsb2NhbFBhcmVudE5vdFNhbXBsZWQ9XCIgKyB0aGlzLl9sb2NhbFBhcmVudE5vdFNhbXBsZWQudG9TdHJpbmcoKSArIFwifVwiO1xuICAgIH07XG4gICAgcmV0dXJuIFBhcmVudEJhc2VkU2FtcGxlcjtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogU2FtcGxlciB0aGF0IHNhbXBsZXMgYSBnaXZlbiBmcmFjdGlvbiBvZiB0cmFjZXMgYmFzZWQgb2YgdHJhY2UgaWQgZGV0ZXJtaW5pc3RpY2FsbHkuICovXG52YXIgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlcihfcmF0aW8pIHtcbiAgICAgICAgaWYgKF9yYXRpbyA9PT0gdm9pZCAwKSB7IF9yYXRpbyA9IDA7IH1cbiAgICAgICAgdGhpcy5fcmF0aW8gPSBfcmF0aW87XG4gICAgICAgIHRoaXMuX3JhdGlvID0gdGhpcy5fbm9ybWFsaXplKF9yYXRpbyk7XG4gICAgICAgIHRoaXMuX3VwcGVyQm91bmQgPSBNYXRoLmZsb29yKHRoaXMuX3JhdGlvICogMHhmZmZmZmZmZik7XG4gICAgfVxuICAgIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlci5wcm90b3R5cGUuc2hvdWxkU2FtcGxlID0gZnVuY3Rpb24gKGNvbnRleHQsIHRyYWNlSWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRlY2lzaW9uOiBpc1ZhbGlkVHJhY2VJZCh0cmFjZUlkKSAmJiB0aGlzLl9hY2N1bXVsYXRlKHRyYWNlSWQpIDwgdGhpcy5fdXBwZXJCb3VuZFxuICAgICAgICAgICAgICAgID8gU2FtcGxpbmdEZWNpc2lvbi5SRUNPUkRfQU5EX1NBTVBMRURcbiAgICAgICAgICAgICAgICA6IFNhbXBsaW5nRGVjaXNpb24uTk9UX1JFQ09SRCxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIlRyYWNlSWRSYXRpb0Jhc2Vke1wiICsgdGhpcy5fcmF0aW8gKyBcIn1cIjtcbiAgICB9O1xuICAgIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlci5wcm90b3R5cGUuX25vcm1hbGl6ZSA9IGZ1bmN0aW9uIChyYXRpbykge1xuICAgICAgICBpZiAodHlwZW9mIHJhdGlvICE9PSAnbnVtYmVyJyB8fCBpc05hTihyYXRpbykpXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIHJhdGlvID49IDEgPyAxIDogcmF0aW8gPD0gMCA/IDAgOiByYXRpbztcbiAgICB9O1xuICAgIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlci5wcm90b3R5cGUuX2FjY3VtdWxhdGUgPSBmdW5jdGlvbiAodHJhY2VJZCkge1xuICAgICAgICB2YXIgYWNjdW11bGF0aW9uID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFjZUlkLmxlbmd0aCAvIDg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHBvcyA9IGkgKiA4O1xuICAgICAgICAgICAgdmFyIHBhcnQgPSBwYXJzZUludCh0cmFjZUlkLnNsaWNlKHBvcywgcG9zICsgOCksIDE2KTtcbiAgICAgICAgICAgIGFjY3VtdWxhdGlvbiA9IChhY2N1bXVsYXRpb24gXiBwYXJ0KSA+Pj4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW11bGF0aW9uO1xuICAgIH07XG4gICAgcmV0dXJuIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlcjtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgRkFMTEJBQ0tfT1RFTF9UUkFDRVNfU0FNUExFUiA9IFRyYWNlc1NhbXBsZXJWYWx1ZXMuQWx3YXlzT247XG52YXIgREVGQVVMVF9SQVRJTyA9IDE7XG4vKipcbiAqIExvYWQgZGVmYXVsdCBjb25maWd1cmF0aW9uLiBGb3IgZmllbGRzIHdpdGggcHJpbWl0aXZlIHZhbHVlcywgYW55IHVzZXItcHJvdmlkZWRcbiAqIHZhbHVlIHdpbGwgb3ZlcnJpZGUgdGhlIGNvcnJlc3BvbmRpbmcgZGVmYXVsdCB2YWx1ZS4gRm9yIGZpZWxkcyB3aXRoXG4gKiBub24tcHJpbWl0aXZlIHZhbHVlcyAobGlrZSBgc3BhbkxpbWl0c2ApLCB0aGUgdXNlci1wcm92aWRlZCB2YWx1ZSB3aWxsIGJlXG4gKiB1c2VkIHRvIGV4dGVuZCB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAqL1xuLy8gb2JqZWN0IG5lZWRzIHRvIGJlIHdyYXBwZWQgaW4gdGhpcyBmdW5jdGlvbiBhbmQgY2FsbGVkIHdoZW4gbmVlZGVkIG90aGVyd2lzZVxuLy8gZW52cyBhcmUgcGFyc2VkIGJlZm9yZSB0ZXN0cyBhcmUgcmFuIC0gY2F1c2VzIHRlc3RzIHVzaW5nIHRoZXNlIGVudnMgdG8gZmFpbFxuZnVuY3Rpb24gbG9hZERlZmF1bHRDb25maWcoKSB7XG4gICAgdmFyIGVudiA9IGdldEVudigpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHNhbXBsZXI6IGJ1aWxkU2FtcGxlckZyb21FbnYoZW52KSxcbiAgICAgICAgZm9yY2VGbHVzaFRpbWVvdXRNaWxsaXM6IDMwMDAwLFxuICAgICAgICBnZW5lcmFsTGltaXRzOiB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0OiBlbnYuT1RFTF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlULFxuICAgICAgICAgICAgYXR0cmlidXRlQ291bnRMaW1pdDogZW52Lk9URUxfQVRUUklCVVRFX0NPVU5UX0xJTUlULFxuICAgICAgICB9LFxuICAgICAgICBzcGFuTGltaXRzOiB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0OiBlbnYuT1RFTF9TUEFOX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQsXG4gICAgICAgICAgICBhdHRyaWJ1dGVDb3VudExpbWl0OiBlbnYuT1RFTF9TUEFOX0FUVFJJQlVURV9DT1VOVF9MSU1JVCxcbiAgICAgICAgICAgIGxpbmtDb3VudExpbWl0OiBlbnYuT1RFTF9TUEFOX0xJTktfQ09VTlRfTElNSVQsXG4gICAgICAgICAgICBldmVudENvdW50TGltaXQ6IGVudi5PVEVMX1NQQU5fRVZFTlRfQ09VTlRfTElNSVQsXG4gICAgICAgICAgICBhdHRyaWJ1dGVQZXJFdmVudENvdW50TGltaXQ6IGVudi5PVEVMX1NQQU5fQVRUUklCVVRFX1BFUl9FVkVOVF9DT1VOVF9MSU1JVCxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVBlckxpbmtDb3VudExpbWl0OiBlbnYuT1RFTF9TUEFOX0FUVFJJQlVURV9QRVJfTElOS19DT1VOVF9MSU1JVCxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyZ2VSZXNvdXJjZVdpdGhEZWZhdWx0czogdHJ1ZSxcbiAgICB9O1xufVxuLyoqXG4gKiBCYXNlZCBvbiBlbnZpcm9ubWVudCwgYnVpbGRzIGEgc2FtcGxlciwgY29tcGxpZXMgd2l0aCBzcGVjaWZpY2F0aW9uLlxuICogQHBhcmFtIGVudmlyb25tZW50IG9wdGlvbmFsLCBieSBkZWZhdWx0IHVzZXMgZ2V0RW52KCksIGJ1dCBhbGxvd3MgcGFzc2luZyBhIHZhbHVlIHRvIHJldXNlIHBhcnNlZCBlbnZpcm9ubWVudFxuICovXG5mdW5jdGlvbiBidWlsZFNhbXBsZXJGcm9tRW52KGVudmlyb25tZW50KSB7XG4gICAgaWYgKGVudmlyb25tZW50ID09PSB2b2lkIDApIHsgZW52aXJvbm1lbnQgPSBnZXRFbnYoKTsgfVxuICAgIHN3aXRjaCAoZW52aXJvbm1lbnQuT1RFTF9UUkFDRVNfU0FNUExFUikge1xuICAgICAgICBjYXNlIFRyYWNlc1NhbXBsZXJWYWx1ZXMuQWx3YXlzT246XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFsd2F5c09uU2FtcGxlcigpO1xuICAgICAgICBjYXNlIFRyYWNlc1NhbXBsZXJWYWx1ZXMuQWx3YXlzT2ZmOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBBbHdheXNPZmZTYW1wbGVyKCk7XG4gICAgICAgIGNhc2UgVHJhY2VzU2FtcGxlclZhbHVlcy5QYXJlbnRCYXNlZEFsd2F5c09uOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJlbnRCYXNlZFNhbXBsZXIoe1xuICAgICAgICAgICAgICAgIHJvb3Q6IG5ldyBBbHdheXNPblNhbXBsZXIoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlIFRyYWNlc1NhbXBsZXJWYWx1ZXMuUGFyZW50QmFzZWRBbHdheXNPZmY6XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBhcmVudEJhc2VkU2FtcGxlcih7XG4gICAgICAgICAgICAgICAgcm9vdDogbmV3IEFsd2F5c09mZlNhbXBsZXIoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlIFRyYWNlc1NhbXBsZXJWYWx1ZXMuVHJhY2VJZFJhdGlvOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmFjZUlkUmF0aW9CYXNlZFNhbXBsZXIoZ2V0U2FtcGxlclByb2JhYmlsaXR5RnJvbUVudihlbnZpcm9ubWVudCkpO1xuICAgICAgICBjYXNlIFRyYWNlc1NhbXBsZXJWYWx1ZXMuUGFyZW50QmFzZWRUcmFjZUlkUmF0aW86XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBhcmVudEJhc2VkU2FtcGxlcih7XG4gICAgICAgICAgICAgICAgcm9vdDogbmV3IFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlcihnZXRTYW1wbGVyUHJvYmFiaWxpdHlGcm9tRW52KGVudmlyb25tZW50KSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGRpYWcuZXJyb3IoXCJPVEVMX1RSQUNFU19TQU1QTEVSIHZhbHVlIFxcXCJcIiArIGVudmlyb25tZW50Lk9URUxfVFJBQ0VTX1NBTVBMRVIgKyBcIiBpbnZhbGlkLCBkZWZhdWx0aW5nIHRvIFwiICsgRkFMTEJBQ0tfT1RFTF9UUkFDRVNfU0FNUExFUiArIFwiXFxcIi5cIik7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFsd2F5c09uU2FtcGxlcigpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFNhbXBsZXJQcm9iYWJpbGl0eUZyb21FbnYoZW52aXJvbm1lbnQpIHtcbiAgICBpZiAoZW52aXJvbm1lbnQuT1RFTF9UUkFDRVNfU0FNUExFUl9BUkcgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBlbnZpcm9ubWVudC5PVEVMX1RSQUNFU19TQU1QTEVSX0FSRyA9PT0gJycpIHtcbiAgICAgICAgZGlhZy5lcnJvcihcIk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHIGlzIGJsYW5rLCBkZWZhdWx0aW5nIHRvIFwiICsgREVGQVVMVF9SQVRJTyArIFwiLlwiKTtcbiAgICAgICAgcmV0dXJuIERFRkFVTFRfUkFUSU87XG4gICAgfVxuICAgIHZhciBwcm9iYWJpbGl0eSA9IE51bWJlcihlbnZpcm9ubWVudC5PVEVMX1RSQUNFU19TQU1QTEVSX0FSRyk7XG4gICAgaWYgKGlzTmFOKHByb2JhYmlsaXR5KSkge1xuICAgICAgICBkaWFnLmVycm9yKFwiT1RFTF9UUkFDRVNfU0FNUExFUl9BUkc9XCIgKyBlbnZpcm9ubWVudC5PVEVMX1RSQUNFU19TQU1QTEVSX0FSRyArIFwiIHdhcyBnaXZlbiwgYnV0IGl0IGlzIGludmFsaWQsIGRlZmF1bHRpbmcgdG8gXCIgKyBERUZBVUxUX1JBVElPICsgXCIuXCIpO1xuICAgICAgICByZXR1cm4gREVGQVVMVF9SQVRJTztcbiAgICB9XG4gICAgaWYgKHByb2JhYmlsaXR5IDwgMCB8fCBwcm9iYWJpbGl0eSA+IDEpIHtcbiAgICAgICAgZGlhZy5lcnJvcihcIk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHPVwiICsgZW52aXJvbm1lbnQuT1RFTF9UUkFDRVNfU0FNUExFUl9BUkcgKyBcIiB3YXMgZ2l2ZW4sIGJ1dCBpdCBpcyBvdXQgb2YgcmFuZ2UgKFswLi4xXSksIGRlZmF1bHRpbmcgdG8gXCIgKyBERUZBVUxUX1JBVElPICsgXCIuXCIpO1xuICAgICAgICByZXR1cm4gREVGQVVMVF9SQVRJTztcbiAgICB9XG4gICAgcmV0dXJuIHByb2JhYmlsaXR5O1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBGdW5jdGlvbiB0byBtZXJnZSBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gKGFzIHNwZWNpZmllZCBpbiAnLi9jb25maWcnKSB3aXRoXG4gKiB1c2VyIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb25zLlxuICovXG5mdW5jdGlvbiBtZXJnZUNvbmZpZyh1c2VyQ29uZmlnKSB7XG4gICAgdmFyIHBlckluc3RhbmNlRGVmYXVsdHMgPSB7XG4gICAgICAgIHNhbXBsZXI6IGJ1aWxkU2FtcGxlckZyb21FbnYoKSxcbiAgICB9O1xuICAgIHZhciBERUZBVUxUX0NPTkZJRyA9IGxvYWREZWZhdWx0Q29uZmlnKCk7XG4gICAgdmFyIHRhcmdldCA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQ09ORklHLCBwZXJJbnN0YW5jZURlZmF1bHRzLCB1c2VyQ29uZmlnKTtcbiAgICB0YXJnZXQuZ2VuZXJhbExpbWl0cyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQ09ORklHLmdlbmVyYWxMaW1pdHMsIHVzZXJDb25maWcuZ2VuZXJhbExpbWl0cyB8fCB7fSk7XG4gICAgdGFyZ2V0LnNwYW5MaW1pdHMgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX0NPTkZJRy5zcGFuTGltaXRzLCB1c2VyQ29uZmlnLnNwYW5MaW1pdHMgfHwge30pO1xuICAgIHJldHVybiB0YXJnZXQ7XG59XG4vKipcbiAqIFdoZW4gZ2VuZXJhbCBsaW1pdHMgYXJlIHByb3ZpZGVkIGFuZCBtb2RlbCBzcGVjaWZpYyBsaW1pdHMgYXJlIG5vdCxcbiAqIGNvbmZpZ3VyZXMgdGhlIG1vZGVsIHNwZWNpZmljIGxpbWl0cyBieSB1c2luZyB0aGUgdmFsdWVzIGZyb20gdGhlIGdlbmVyYWwgb25lcy5cbiAqIEBwYXJhbSB1c2VyQ29uZmlnIFVzZXIgcHJvdmlkZWQgdHJhY2VyIGNvbmZpZ3VyYXRpb25cbiAqL1xuZnVuY3Rpb24gcmVjb25maWd1cmVMaW1pdHModXNlckNvbmZpZykge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaywgX2wsIF9tO1xuICAgIHZhciBzcGFuTGltaXRzID0gT2JqZWN0LmFzc2lnbih7fSwgdXNlckNvbmZpZy5zcGFuTGltaXRzKTtcbiAgICB2YXIgcGFyc2VkRW52Q29uZmlnID0gZ2V0RW52V2l0aG91dERlZmF1bHRzKCk7XG4gICAgLyoqXG4gICAgICogUmVhc3NpZ24gc3BhbiBhdHRyaWJ1dGUgY291bnQgbGltaXQgdG8gdXNlIGZpcnN0IG5vbiBudWxsIHZhbHVlIGRlZmluZWQgYnkgdXNlciBvciB1c2UgZGVmYXVsdCB2YWx1ZVxuICAgICAqL1xuICAgIHNwYW5MaW1pdHMuYXR0cmlidXRlQ291bnRMaW1pdCA9XG4gICAgICAgIChfZiA9IChfZSA9IChfZCA9IChfYiA9IChfYSA9IHVzZXJDb25maWcuc3BhbkxpbWl0cykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmF0dHJpYnV0ZUNvdW50TGltaXQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IChfYyA9IHVzZXJDb25maWcuZ2VuZXJhbExpbWl0cykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmF0dHJpYnV0ZUNvdW50TGltaXQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IHBhcnNlZEVudkNvbmZpZy5PVEVMX1NQQU5fQVRUUklCVVRFX0NPVU5UX0xJTUlUKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiBwYXJzZWRFbnZDb25maWcuT1RFTF9BVFRSSUJVVEVfQ09VTlRfTElNSVQpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IERFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlUO1xuICAgIC8qKlxuICAgICAqIFJlYXNzaWduIHNwYW4gYXR0cmlidXRlIHZhbHVlIGxlbmd0aCBsaW1pdCB0byB1c2UgZmlyc3Qgbm9uIG51bGwgdmFsdWUgZGVmaW5lZCBieSB1c2VyIG9yIHVzZSBkZWZhdWx0IHZhbHVlXG4gICAgICovXG4gICAgc3BhbkxpbWl0cy5hdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0ID1cbiAgICAgICAgKF9tID0gKF9sID0gKF9rID0gKF9oID0gKF9nID0gdXNlckNvbmZpZy5zcGFuTGltaXRzKSA9PT0gbnVsbCB8fCBfZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2cuYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdCkgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogKF9qID0gdXNlckNvbmZpZy5nZW5lcmFsTGltaXRzKSA9PT0gbnVsbCB8fCBfaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ouYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdCkgIT09IG51bGwgJiYgX2sgIT09IHZvaWQgMCA/IF9rIDogcGFyc2VkRW52Q29uZmlnLk9URUxfU1BBTl9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUKSAhPT0gbnVsbCAmJiBfbCAhPT0gdm9pZCAwID8gX2wgOiBwYXJzZWRFbnZDb25maWcuT1RFTF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUKSAhPT0gbnVsbCAmJiBfbSAhPT0gdm9pZCAwID8gX20gOiBERUZBVUxUX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQ7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHVzZXJDb25maWcsIHsgc3BhbkxpbWl0czogc3BhbkxpbWl0cyB9KTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBTcGFuUHJvY2Vzc29yfSB0aGF0IGJhdGNoZXMgc3BhbnMgZXhwb3J0ZWQgYnlcbiAqIHRoZSBTREsgdGhlbiBwdXNoZXMgdGhlbSB0byB0aGUgZXhwb3J0ZXIgcGlwZWxpbmUuXG4gKi9cbnZhciBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJhdGNoU3BhblByb2Nlc3NvckJhc2UoX2V4cG9ydGVyLCBjb25maWcpIHtcbiAgICAgICAgdGhpcy5fZXhwb3J0ZXIgPSBfZXhwb3J0ZXI7XG4gICAgICAgIHRoaXMuX2lzRXhwb3J0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2ZpbmlzaGVkU3BhbnMgPSBbXTtcbiAgICAgICAgdGhpcy5fZHJvcHBlZFNwYW5zQ291bnQgPSAwO1xuICAgICAgICB2YXIgZW52ID0gZ2V0RW52KCk7XG4gICAgICAgIHRoaXMuX21heEV4cG9ydEJhdGNoU2l6ZSA9XG4gICAgICAgICAgICB0eXBlb2YgKGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5tYXhFeHBvcnRCYXRjaFNpemUpID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgICAgID8gY29uZmlnLm1heEV4cG9ydEJhdGNoU2l6ZVxuICAgICAgICAgICAgICAgIDogZW52Lk9URUxfQlNQX01BWF9FWFBPUlRfQkFUQ0hfU0laRTtcbiAgICAgICAgdGhpcy5fbWF4UXVldWVTaXplID1cbiAgICAgICAgICAgIHR5cGVvZiAoY29uZmlnID09PSBudWxsIHx8IGNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnLm1heFF1ZXVlU2l6ZSkgPT09ICdudW1iZXInXG4gICAgICAgICAgICAgICAgPyBjb25maWcubWF4UXVldWVTaXplXG4gICAgICAgICAgICAgICAgOiBlbnYuT1RFTF9CU1BfTUFYX1FVRVVFX1NJWkU7XG4gICAgICAgIHRoaXMuX3NjaGVkdWxlZERlbGF5TWlsbGlzID1cbiAgICAgICAgICAgIHR5cGVvZiAoY29uZmlnID09PSBudWxsIHx8IGNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnLnNjaGVkdWxlZERlbGF5TWlsbGlzKSA9PT0gJ251bWJlcidcbiAgICAgICAgICAgICAgICA/IGNvbmZpZy5zY2hlZHVsZWREZWxheU1pbGxpc1xuICAgICAgICAgICAgICAgIDogZW52Lk9URUxfQlNQX1NDSEVEVUxFX0RFTEFZO1xuICAgICAgICB0aGlzLl9leHBvcnRUaW1lb3V0TWlsbGlzID1cbiAgICAgICAgICAgIHR5cGVvZiAoY29uZmlnID09PSBudWxsIHx8IGNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnLmV4cG9ydFRpbWVvdXRNaWxsaXMpID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgICAgID8gY29uZmlnLmV4cG9ydFRpbWVvdXRNaWxsaXNcbiAgICAgICAgICAgICAgICA6IGVudi5PVEVMX0JTUF9FWFBPUlRfVElNRU9VVDtcbiAgICAgICAgdGhpcy5fc2h1dGRvd25PbmNlID0gbmV3IEJpbmRPbmNlRnV0dXJlKHRoaXMuX3NodXRkb3duLCB0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMuX21heEV4cG9ydEJhdGNoU2l6ZSA+IHRoaXMuX21heFF1ZXVlU2l6ZSkge1xuICAgICAgICAgICAgZGlhZy53YXJuKCdCYXRjaFNwYW5Qcm9jZXNzb3I6IG1heEV4cG9ydEJhdGNoU2l6ZSBtdXN0IGJlIHNtYWxsZXIgb3IgZXF1YWwgdG8gbWF4UXVldWVTaXplLCBzZXR0aW5nIG1heEV4cG9ydEJhdGNoU2l6ZSB0byBtYXRjaCBtYXhRdWV1ZVNpemUnKTtcbiAgICAgICAgICAgIHRoaXMuX21heEV4cG9ydEJhdGNoU2l6ZSA9IHRoaXMuX21heFF1ZXVlU2l6ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlLnByb3RvdHlwZS5mb3JjZUZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fc2h1dGRvd25PbmNlLmlzQ2FsbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2h1dGRvd25PbmNlLnByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZsdXNoQWxsKCk7XG4gICAgfTtcbiAgICAvLyBkb2VzIG5vdGhpbmcuXG4gICAgQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZS5wcm90b3R5cGUub25TdGFydCA9IGZ1bmN0aW9uIChfc3BhbiwgX3BhcmVudENvbnRleHQpIHsgfTtcbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uIChzcGFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9zaHV0ZG93bk9uY2UuaXNDYWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHNwYW4uc3BhbkNvbnRleHQoKS50cmFjZUZsYWdzICYgVHJhY2VGbGFncy5TQU1QTEVEKSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2FkZFRvQnVmZmVyKHNwYW4pO1xuICAgIH07XG4gICAgQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZS5wcm90b3R5cGUuc2h1dGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaHV0ZG93bk9uY2UuY2FsbCgpO1xuICAgIH07XG4gICAgQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZS5wcm90b3R5cGUuX3NodXRkb3duID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5vblNodXRkb3duKCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuX2ZsdXNoQWxsKCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuX2V4cG9ydGVyLnNodXRkb3duKCk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqIEFkZCBhIHNwYW4gaW4gdGhlIGJ1ZmZlci4gKi9cbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlLnByb3RvdHlwZS5fYWRkVG9CdWZmZXIgPSBmdW5jdGlvbiAoc3Bhbikge1xuICAgICAgICBpZiAodGhpcy5fZmluaXNoZWRTcGFucy5sZW5ndGggPj0gdGhpcy5fbWF4UXVldWVTaXplKSB7XG4gICAgICAgICAgICAvLyBsaW1pdCByZWFjaGVkLCBkcm9wIHNwYW5cbiAgICAgICAgICAgIGlmICh0aGlzLl9kcm9wcGVkU3BhbnNDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGRpYWcuZGVidWcoJ21heFF1ZXVlU2l6ZSByZWFjaGVkLCBkcm9wcGluZyBzcGFucycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZHJvcHBlZFNwYW5zQ291bnQrKztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZHJvcHBlZFNwYW5zQ291bnQgPiAwKSB7XG4gICAgICAgICAgICAvLyBzb21lIHNwYW5zIHdlcmUgZHJvcHBlZCwgbG9nIG9uY2Ugd2l0aCBjb3VudCBvZiBzcGFucyBkcm9wcGVkXG4gICAgICAgICAgICBkaWFnLndhcm4oXCJEcm9wcGVkIFwiICsgdGhpcy5fZHJvcHBlZFNwYW5zQ291bnQgKyBcIiBzcGFucyBiZWNhdXNlIG1heFF1ZXVlU2l6ZSByZWFjaGVkXCIpO1xuICAgICAgICAgICAgdGhpcy5fZHJvcHBlZFNwYW5zQ291bnQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2ZpbmlzaGVkU3BhbnMucHVzaChzcGFuKTtcbiAgICAgICAgdGhpcy5fbWF5YmVTdGFydFRpbWVyKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZW5kIGFsbCBzcGFucyB0byB0aGUgZXhwb3J0ZXIgcmVzcGVjdGluZyB0aGUgYmF0Y2ggc2l6ZSBsaW1pdFxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBvbmx5IG9uIGZvcmNlRmx1c2ggb3Igc2h1dGRvd24sXG4gICAgICogZm9yIGFsbCBvdGhlciBjYXNlcyBfZmx1c2ggc2hvdWxkIGJlIHVzZWRcbiAgICAgKiAqL1xuICAgIEJhdGNoU3BhblByb2Nlc3NvckJhc2UucHJvdG90eXBlLl9mbHVzaEFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHZhciBwcm9taXNlcyA9IFtdO1xuICAgICAgICAgICAgLy8gY2FsY3VsYXRlIG51bWJlciBvZiBiYXRjaGVzXG4gICAgICAgICAgICB2YXIgY291bnQgPSBNYXRoLmNlaWwoX3RoaXMuX2ZpbmlzaGVkU3BhbnMubGVuZ3RoIC8gX3RoaXMuX21heEV4cG9ydEJhdGNoU2l6ZSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGNvdW50OyBpIDwgajsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChfdGhpcy5fZmx1c2hPbmVCYXRjaCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChyZWplY3QpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEJhdGNoU3BhblByb2Nlc3NvckJhc2UucHJvdG90eXBlLl9mbHVzaE9uZUJhdGNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLl9jbGVhclRpbWVyKCk7XG4gICAgICAgIGlmICh0aGlzLl9maW5pc2hlZFNwYW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAvLyBkb24ndCB3YWl0IGFueW1vcmUgZm9yIGV4cG9ydCwgdGhpcyB3YXkgdGhlIG5leHQgYmF0Y2ggY2FuIHN0YXJ0XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignVGltZW91dCcpKTtcbiAgICAgICAgICAgIH0sIF90aGlzLl9leHBvcnRUaW1lb3V0TWlsbGlzKTtcbiAgICAgICAgICAgIC8vIHByZXZlbnQgZG93bnN0cmVhbSBleHBvcnRlciBjYWxscyBmcm9tIGdlbmVyYXRpbmcgc3BhbnNcbiAgICAgICAgICAgIGNvbnRleHQud2l0aChzdXBwcmVzc1RyYWNpbmcoY29udGV4dC5hY3RpdmUoKSksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZmluaXNoZWQgc3BhbnMgYnVmZmVyIGhlcmUgYmVjYXVzZSB0aGUgbmV4dCBpbnZvY2F0aW9ucyBvZiB0aGUgX2ZsdXNoIG1ldGhvZFxuICAgICAgICAgICAgICAgIC8vIGNvdWxkIHBhc3MgdGhlIHNhbWUgZmluaXNoZWQgc3BhbnMgdG8gdGhlIGV4cG9ydGVyIGlmIHRoZSBidWZmZXIgaXMgY2xlYXJlZFxuICAgICAgICAgICAgICAgIC8vIG91dHNpZGUgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGxiYWNrLlxuICAgICAgICAgICAgICAgIHZhciBzcGFucztcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuX2ZpbmlzaGVkU3BhbnMubGVuZ3RoIDw9IF90aGlzLl9tYXhFeHBvcnRCYXRjaFNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgc3BhbnMgPSBfdGhpcy5fZmluaXNoZWRTcGFucztcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2ZpbmlzaGVkU3BhbnMgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNwYW5zID0gX3RoaXMuX2ZpbmlzaGVkU3BhbnMuc3BsaWNlKDAsIF90aGlzLl9tYXhFeHBvcnRCYXRjaFNpemUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZG9FeHBvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5fZXhwb3J0ZXIuZXhwb3J0KHNwYW5zLCBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5jb2RlID09PSBFeHBvcnRSZXN1bHRDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoKF9hID0gcmVzdWx0LmVycm9yKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBuZXcgRXJyb3IoJ0JhdGNoU3BhblByb2Nlc3Nvcjogc3BhbiBleHBvcnQgZmFpbGVkJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHZhciBwZW5kaW5nUmVzb3VyY2VzID0gbnVsbDtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc3BhbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNwYW4gPSBzcGFuc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW4ucmVzb3VyY2UuYXN5bmNBdHRyaWJ1dGVzUGVuZGluZyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbi5yZXNvdXJjZS53YWl0Rm9yQXN5bmNBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nUmVzb3VyY2VzICE9PSBudWxsICYmIHBlbmRpbmdSZXNvdXJjZXMgIT09IHZvaWQgMCA/IHBlbmRpbmdSZXNvdXJjZXMgOiAocGVuZGluZ1Jlc291cmNlcyA9IFtdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdSZXNvdXJjZXMucHVzaChzcGFuLnJlc291cmNlLndhaXRGb3JBc3luY0F0dHJpYnV0ZXMoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQXZvaWQgc2NoZWR1bGluZyBhIHByb21pc2UgdG8gbWFrZSB0aGUgYmVoYXZpb3IgbW9yZSBwcmVkaWN0YWJsZSBhbmQgZWFzaWVyIHRvIHRlc3RcbiAgICAgICAgICAgICAgICBpZiAocGVuZGluZ1Jlc291cmNlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBkb0V4cG9ydCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwocGVuZGluZ1Jlc291cmNlcykudGhlbihkb0V4cG9ydCwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRXJyb3JIYW5kbGVyKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZS5wcm90b3R5cGUuX21heWJlU3RhcnRUaW1lciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMuX2lzRXhwb3J0aW5nKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5faXNFeHBvcnRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgX3RoaXMuX2ZsdXNoT25lQmF0Y2goKVxuICAgICAgICAgICAgICAgIC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5faXNFeHBvcnRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuX2ZpbmlzaGVkU3BhbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fY2xlYXJUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fbWF5YmVTdGFydFRpbWVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5faXNFeHBvcnRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBnbG9iYWxFcnJvckhhbmRsZXIoZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gd2Ugb25seSB3YWl0IGlmIHRoZSBxdWV1ZSBkb2Vzbid0IGhhdmUgZW5vdWdoIGVsZW1lbnRzIHlldFxuICAgICAgICBpZiAodGhpcy5fZmluaXNoZWRTcGFucy5sZW5ndGggPj0gdGhpcy5fbWF4RXhwb3J0QmF0Y2hTaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gZmx1c2goKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fdGltZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZsdXNoKCk7IH0sIHRoaXMuX3NjaGVkdWxlZERlbGF5TWlsbGlzKTtcbiAgICAgICAgdW5yZWZUaW1lcih0aGlzLl90aW1lcik7XG4gICAgfTtcbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlLnByb3RvdHlwZS5fY2xlYXJUaW1lciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RpbWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcik7XG4gICAgICAgICAgICB0aGlzLl90aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEJhdGNoU3BhblByb2Nlc3NvckJhc2U7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fZXh0ZW5kcyA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG52YXIgQmF0Y2hTcGFuUHJvY2Vzc29yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhCYXRjaFNwYW5Qcm9jZXNzb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQmF0Y2hTcGFuUHJvY2Vzc29yKF9leHBvcnRlciwgY29uZmlnKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIF9leHBvcnRlciwgY29uZmlnKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5vbkluaXQoY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLm9uSW5pdCA9IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKChjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcuZGlzYWJsZUF1dG9GbHVzaE9uRG9jdW1lbnRIaWRlKSAhPT0gdHJ1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5fdmlzaWJpbGl0eUNoYW5nZUxpc3RlbmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmZvcmNlRmx1c2goKS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbEVycm9ySGFuZGxlcihlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLl9wYWdlSGlkZUxpc3RlbmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLmZvcmNlRmx1c2goKS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRXJyb3JIYW5kbGVyKGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5fdmlzaWJpbGl0eUNoYW5nZUxpc3RlbmVyKTtcbiAgICAgICAgICAgIC8vIHVzZSAncGFnZWhpZGUnIGV2ZW50IGFzIGEgZmFsbGJhY2sgZm9yIFNhZmFyaTsgc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTY3NjlcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2VoaWRlJywgdGhpcy5fcGFnZUhpZGVMaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEJhdGNoU3BhblByb2Nlc3Nvci5wcm90b3R5cGUub25TaHV0ZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl92aXNpYmlsaXR5Q2hhbmdlTGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5fdmlzaWJpbGl0eUNoYW5nZUxpc3RlbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9wYWdlSGlkZUxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGFnZWhpZGUnLCB0aGlzLl9wYWdlSGlkZUxpc3RlbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEJhdGNoU3BhblByb2Nlc3Nvcjtcbn0oQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZSkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIFNQQU5fSURfQllURVMgPSA4O1xudmFyIFRSQUNFX0lEX0JZVEVTID0gMTY7XG52YXIgUmFuZG9tSWRHZW5lcmF0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmFuZG9tSWRHZW5lcmF0b3IoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIDE2LWJ5dGUgdHJhY2UgSUQgZm9ybWF0dGVkL2VuY29kZWQgYXMgYSAzMiBsb3dlcmNhc2UgaGV4XG4gICAgICAgICAqIGNoYXJhY3RlcnMgY29ycmVzcG9uZGluZyB0byAxMjggYml0cy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVUcmFjZUlkID0gZ2V0SWRHZW5lcmF0b3IoVFJBQ0VfSURfQllURVMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIHJhbmRvbSA4LWJ5dGUgc3BhbiBJRCBmb3JtYXR0ZWQvZW5jb2RlZCBhcyBhIDE2IGxvd2VyY2FzZSBoZXhcbiAgICAgICAgICogY2hhcmFjdGVycyBjb3JyZXNwb25kaW5nIHRvIDY0IGJpdHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmdlbmVyYXRlU3BhbklkID0gZ2V0SWRHZW5lcmF0b3IoU1BBTl9JRF9CWVRFUyk7XG4gICAgfVxuICAgIHJldHVybiBSYW5kb21JZEdlbmVyYXRvcjtcbn0oKSk7XG52YXIgU0hBUkVEX0NIQVJfQ09ERVNfQVJSQVkgPSBBcnJheSgzMik7XG5mdW5jdGlvbiBnZXRJZEdlbmVyYXRvcihieXRlcykge1xuICAgIHJldHVybiBmdW5jdGlvbiBnZW5lcmF0ZUlkKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzICogMjsgaSsrKSB7XG4gICAgICAgICAgICBTSEFSRURfQ0hBUl9DT0RFU19BUlJBWVtpXSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDE2KSArIDQ4O1xuICAgICAgICAgICAgLy8gdmFsaWQgaGV4IGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIDQ4LTU3IGFuZCA5Ny0xMDJcbiAgICAgICAgICAgIGlmIChTSEFSRURfQ0hBUl9DT0RFU19BUlJBWVtpXSA+PSA1OCkge1xuICAgICAgICAgICAgICAgIFNIQVJFRF9DSEFSX0NPREVTX0FSUkFZW2ldICs9IDM5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIFNIQVJFRF9DSEFSX0NPREVTX0FSUkFZLnNsaWNlKDAsIGJ5dGVzICogMikpO1xuICAgIH07XG59XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGJhc2ljIHRyYWNlci5cbiAqL1xudmFyIFRyYWNlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFRyYWNlciBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBUcmFjZXIoaW5zdHJ1bWVudGF0aW9uTGlicmFyeSwgY29uZmlnLCBfdHJhY2VyUHJvdmlkZXIpIHtcbiAgICAgICAgdGhpcy5fdHJhY2VyUHJvdmlkZXIgPSBfdHJhY2VyUHJvdmlkZXI7XG4gICAgICAgIHZhciBsb2NhbENvbmZpZyA9IG1lcmdlQ29uZmlnKGNvbmZpZyk7XG4gICAgICAgIHRoaXMuX3NhbXBsZXIgPSBsb2NhbENvbmZpZy5zYW1wbGVyO1xuICAgICAgICB0aGlzLl9nZW5lcmFsTGltaXRzID0gbG9jYWxDb25maWcuZ2VuZXJhbExpbWl0cztcbiAgICAgICAgdGhpcy5fc3BhbkxpbWl0cyA9IGxvY2FsQ29uZmlnLnNwYW5MaW1pdHM7XG4gICAgICAgIHRoaXMuX2lkR2VuZXJhdG9yID0gY29uZmlnLmlkR2VuZXJhdG9yIHx8IG5ldyBSYW5kb21JZEdlbmVyYXRvcigpO1xuICAgICAgICB0aGlzLnJlc291cmNlID0gX3RyYWNlclByb3ZpZGVyLnJlc291cmNlO1xuICAgICAgICB0aGlzLmluc3RydW1lbnRhdGlvbkxpYnJhcnkgPSBpbnN0cnVtZW50YXRpb25MaWJyYXJ5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydHMgYSBuZXcgU3BhbiBvciByZXR1cm5zIHRoZSBkZWZhdWx0IE5vb3BTcGFuIGJhc2VkIG9uIHRoZSBzYW1wbGluZ1xuICAgICAqIGRlY2lzaW9uLlxuICAgICAqL1xuICAgIFRyYWNlci5wcm90b3R5cGUuc3RhcnRTcGFuID0gZnVuY3Rpb24gKG5hbWUsIG9wdGlvbnMsIGNvbnRleHQkMSkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgaWYgKGNvbnRleHQkMSA9PT0gdm9pZCAwKSB7IGNvbnRleHQkMSA9IGNvbnRleHQuYWN0aXZlKCk7IH1cbiAgICAgICAgLy8gcmVtb3ZlIHNwYW4gZnJvbSBjb250ZXh0IGluIGNhc2UgYSByb290IHNwYW4gaXMgcmVxdWVzdGVkIHZpYSBvcHRpb25zXG4gICAgICAgIGlmIChvcHRpb25zLnJvb3QpIHtcbiAgICAgICAgICAgIGNvbnRleHQkMSA9IHRyYWNlLmRlbGV0ZVNwYW4oY29udGV4dCQxKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFyZW50U3BhbiA9IHRyYWNlLmdldFNwYW4oY29udGV4dCQxKTtcbiAgICAgICAgaWYgKGlzVHJhY2luZ1N1cHByZXNzZWQoY29udGV4dCQxKSkge1xuICAgICAgICAgICAgZGlhZy5kZWJ1ZygnSW5zdHJ1bWVudGF0aW9uIHN1cHByZXNzZWQsIHJldHVybmluZyBOb29wIFNwYW4nKTtcbiAgICAgICAgICAgIHZhciBub25SZWNvcmRpbmdTcGFuID0gdHJhY2Uud3JhcFNwYW5Db250ZXh0KElOVkFMSURfU1BBTl9DT05URVhUKTtcbiAgICAgICAgICAgIHJldHVybiBub25SZWNvcmRpbmdTcGFuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJlbnRTcGFuQ29udGV4dCA9IHBhcmVudFNwYW4gPT09IG51bGwgfHwgcGFyZW50U3BhbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyZW50U3Bhbi5zcGFuQ29udGV4dCgpO1xuICAgICAgICB2YXIgc3BhbklkID0gdGhpcy5faWRHZW5lcmF0b3IuZ2VuZXJhdGVTcGFuSWQoKTtcbiAgICAgICAgdmFyIHRyYWNlSWQ7XG4gICAgICAgIHZhciB0cmFjZVN0YXRlO1xuICAgICAgICB2YXIgcGFyZW50U3BhbklkO1xuICAgICAgICBpZiAoIXBhcmVudFNwYW5Db250ZXh0IHx8XG4gICAgICAgICAgICAhdHJhY2UuaXNTcGFuQ29udGV4dFZhbGlkKHBhcmVudFNwYW5Db250ZXh0KSkge1xuICAgICAgICAgICAgLy8gTmV3IHJvb3Qgc3Bhbi5cbiAgICAgICAgICAgIHRyYWNlSWQgPSB0aGlzLl9pZEdlbmVyYXRvci5nZW5lcmF0ZVRyYWNlSWQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5ldyBjaGlsZCBzcGFuLlxuICAgICAgICAgICAgdHJhY2VJZCA9IHBhcmVudFNwYW5Db250ZXh0LnRyYWNlSWQ7XG4gICAgICAgICAgICB0cmFjZVN0YXRlID0gcGFyZW50U3BhbkNvbnRleHQudHJhY2VTdGF0ZTtcbiAgICAgICAgICAgIHBhcmVudFNwYW5JZCA9IHBhcmVudFNwYW5Db250ZXh0LnNwYW5JZDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3BhbktpbmQgPSAoX2EgPSBvcHRpb25zLmtpbmQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFNwYW5LaW5kLklOVEVSTkFMO1xuICAgICAgICB2YXIgbGlua3MgPSAoKF9iID0gb3B0aW9ucy5saW5rcykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogW10pLm1hcChmdW5jdGlvbiAobGluaykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsaW5rLmNvbnRleHQsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogc2FuaXRpemVBdHRyaWJ1dGVzKGxpbmsuYXR0cmlidXRlcyksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBzYW5pdGl6ZUF0dHJpYnV0ZXMob3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgICAgICAgLy8gbWFrZSBzYW1wbGluZyBkZWNpc2lvblxuICAgICAgICB2YXIgc2FtcGxpbmdSZXN1bHQgPSB0aGlzLl9zYW1wbGVyLnNob3VsZFNhbXBsZShjb250ZXh0JDEsIHRyYWNlSWQsIG5hbWUsIHNwYW5LaW5kLCBhdHRyaWJ1dGVzLCBsaW5rcyk7XG4gICAgICAgIHRyYWNlU3RhdGUgPSAoX2MgPSBzYW1wbGluZ1Jlc3VsdC50cmFjZVN0YXRlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiB0cmFjZVN0YXRlO1xuICAgICAgICB2YXIgdHJhY2VGbGFncyA9IHNhbXBsaW5nUmVzdWx0LmRlY2lzaW9uID09PSBTYW1wbGluZ0RlY2lzaW9uJDEuUkVDT1JEX0FORF9TQU1QTEVEXG4gICAgICAgICAgICA/IFRyYWNlRmxhZ3MuU0FNUExFRFxuICAgICAgICAgICAgOiBUcmFjZUZsYWdzLk5PTkU7XG4gICAgICAgIHZhciBzcGFuQ29udGV4dCA9IHsgdHJhY2VJZDogdHJhY2VJZCwgc3BhbklkOiBzcGFuSWQsIHRyYWNlRmxhZ3M6IHRyYWNlRmxhZ3MsIHRyYWNlU3RhdGU6IHRyYWNlU3RhdGUgfTtcbiAgICAgICAgaWYgKHNhbXBsaW5nUmVzdWx0LmRlY2lzaW9uID09PSBTYW1wbGluZ0RlY2lzaW9uJDEuTk9UX1JFQ09SRCkge1xuICAgICAgICAgICAgZGlhZy5kZWJ1ZygnUmVjb3JkaW5nIGlzIG9mZiwgcHJvcGFnYXRpbmcgY29udGV4dCBpbiBhIG5vbi1yZWNvcmRpbmcgc3BhbicpO1xuICAgICAgICAgICAgdmFyIG5vblJlY29yZGluZ1NwYW4gPSB0cmFjZS53cmFwU3BhbkNvbnRleHQoc3BhbkNvbnRleHQpO1xuICAgICAgICAgICAgcmV0dXJuIG5vblJlY29yZGluZ1NwYW47XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IGluaXRpYWwgc3BhbiBhdHRyaWJ1dGVzLiBUaGUgYXR0cmlidXRlcyBvYmplY3QgbWF5IGhhdmUgYmVlbiBtdXRhdGVkXG4gICAgICAgIC8vIGJ5IHRoZSBzYW1wbGVyLCBzbyB3ZSBzYW5pdGl6ZSB0aGUgbWVyZ2VkIGF0dHJpYnV0ZXMgYmVmb3JlIHNldHRpbmcgdGhlbS5cbiAgICAgICAgdmFyIGluaXRBdHRyaWJ1dGVzID0gc2FuaXRpemVBdHRyaWJ1dGVzKE9iamVjdC5hc3NpZ24oYXR0cmlidXRlcywgc2FtcGxpbmdSZXN1bHQuYXR0cmlidXRlcykpO1xuICAgICAgICB2YXIgc3BhbiA9IG5ldyBTcGFuKHRoaXMsIGNvbnRleHQkMSwgbmFtZSwgc3BhbkNvbnRleHQsIHNwYW5LaW5kLCBwYXJlbnRTcGFuSWQsIGxpbmtzLCBvcHRpb25zLnN0YXJ0VGltZSwgdW5kZWZpbmVkLCBpbml0QXR0cmlidXRlcyk7XG4gICAgICAgIHJldHVybiBzcGFuO1xuICAgIH07XG4gICAgVHJhY2VyLnByb3RvdHlwZS5zdGFydEFjdGl2ZVNwYW4gPSBmdW5jdGlvbiAobmFtZSwgYXJnMiwgYXJnMywgYXJnNCkge1xuICAgICAgICB2YXIgb3B0cztcbiAgICAgICAgdmFyIGN0eDtcbiAgICAgICAgdmFyIGZuO1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICBmbiA9IGFyZzI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgb3B0cyA9IGFyZzI7XG4gICAgICAgICAgICBmbiA9IGFyZzM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRzID0gYXJnMjtcbiAgICAgICAgICAgIGN0eCA9IGFyZzM7XG4gICAgICAgICAgICBmbiA9IGFyZzQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhcmVudENvbnRleHQgPSBjdHggIT09IG51bGwgJiYgY3R4ICE9PSB2b2lkIDAgPyBjdHggOiBjb250ZXh0LmFjdGl2ZSgpO1xuICAgICAgICB2YXIgc3BhbiA9IHRoaXMuc3RhcnRTcGFuKG5hbWUsIG9wdHMsIHBhcmVudENvbnRleHQpO1xuICAgICAgICB2YXIgY29udGV4dFdpdGhTcGFuU2V0ID0gdHJhY2Uuc2V0U3BhbihwYXJlbnRDb250ZXh0LCBzcGFuKTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQud2l0aChjb250ZXh0V2l0aFNwYW5TZXQsIGZuLCB1bmRlZmluZWQsIHNwYW4pO1xuICAgIH07XG4gICAgLyoqIFJldHVybnMgdGhlIGFjdGl2ZSB7QGxpbmsgR2VuZXJhbExpbWl0c30uICovXG4gICAgVHJhY2VyLnByb3RvdHlwZS5nZXRHZW5lcmFsTGltaXRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2VuZXJhbExpbWl0cztcbiAgICB9O1xuICAgIC8qKiBSZXR1cm5zIHRoZSBhY3RpdmUge0BsaW5rIFNwYW5MaW1pdHN9LiAqL1xuICAgIFRyYWNlci5wcm90b3R5cGUuZ2V0U3BhbkxpbWl0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NwYW5MaW1pdHM7XG4gICAgfTtcbiAgICBUcmFjZXIucHJvdG90eXBlLmdldEFjdGl2ZVNwYW5Qcm9jZXNzb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFjZXJQcm92aWRlci5nZXRBY3RpdmVTcGFuUHJvY2Vzc29yKCk7XG4gICAgfTtcbiAgICByZXR1cm4gVHJhY2VyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBfX3ZhbHVlcyQxID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX192YWx1ZXMpIHx8IGZ1bmN0aW9uKG8pIHtcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufTtcbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBTcGFuUHJvY2Vzc29yfSB0aGF0IHNpbXBseSBmb3J3YXJkcyBhbGxcbiAqIHJlY2VpdmVkIGV2ZW50cyB0byBhIGxpc3Qgb2Yge0BsaW5rIFNwYW5Qcm9jZXNzb3J9cy5cbiAqL1xudmFyIE11bHRpU3BhblByb2Nlc3NvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBNdWx0aVNwYW5Qcm9jZXNzb3IoX3NwYW5Qcm9jZXNzb3JzKSB7XG4gICAgICAgIHRoaXMuX3NwYW5Qcm9jZXNzb3JzID0gX3NwYW5Qcm9jZXNzb3JzO1xuICAgIH1cbiAgICBNdWx0aVNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLmZvcmNlRmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlXzEsIF9hO1xuICAgICAgICB2YXIgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMkMSh0aGlzLl9zcGFuUHJvY2Vzc29ycyksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3BhblByb2Nlc3NvciA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goc3BhblByb2Nlc3Nvci5mb3JjZUZsdXNoKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcylcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgZ2xvYmFsRXJyb3JIYW5kbGVyKGVycm9yIHx8IG5ldyBFcnJvcignTXVsdGlTcGFuUHJvY2Vzc29yOiBmb3JjZUZsdXNoIGZhaWxlZCcpKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBNdWx0aVNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLm9uU3RhcnQgPSBmdW5jdGlvbiAoc3BhbiwgY29udGV4dCkge1xuICAgICAgICB2YXIgZV8yLCBfYTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMkMSh0aGlzLl9zcGFuUHJvY2Vzc29ycyksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3BhblByb2Nlc3NvciA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgICAgIHNwYW5Qcm9jZXNzb3Iub25TdGFydChzcGFuLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBNdWx0aVNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24gKHNwYW4pIHtcbiAgICAgICAgdmFyIGVfMywgX2E7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzJDEodGhpcy5fc3BhblByb2Nlc3NvcnMpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNwYW5Qcm9jZXNzb3IgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgICAgICBzcGFuUHJvY2Vzc29yLm9uRW5kKHNwYW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlXzNfMSkgeyBlXzMgPSB7IGVycm9yOiBlXzNfMSB9OyB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMykgdGhyb3cgZV8zLmVycm9yOyB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE11bHRpU3BhblByb2Nlc3Nvci5wcm90b3R5cGUuc2h1dGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlXzQsIF9hO1xuICAgICAgICB2YXIgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMkMSh0aGlzLl9zcGFuUHJvY2Vzc29ycyksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3BhblByb2Nlc3NvciA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goc3BhblByb2Nlc3Nvci5zaHV0ZG93bigpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV80XzEpIHsgZV80ID0geyBlcnJvcjogZV80XzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzQpIHRocm93IGVfNC5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gTXVsdGlTcGFuUHJvY2Vzc29yO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKiBOby1vcCBpbXBsZW1lbnRhdGlvbiBvZiBTcGFuUHJvY2Vzc29yICovXG52YXIgTm9vcFNwYW5Qcm9jZXNzb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTm9vcFNwYW5Qcm9jZXNzb3IoKSB7XG4gICAgfVxuICAgIE5vb3BTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5vblN0YXJ0ID0gZnVuY3Rpb24gKF9zcGFuLCBfY29udGV4dCkgeyB9O1xuICAgIE5vb3BTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uIChfc3BhbikgeyB9O1xuICAgIE5vb3BTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5zaHV0ZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH07XG4gICAgTm9vcFNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLmZvcmNlRmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9O1xuICAgIHJldHVybiBOb29wU3BhblByb2Nlc3Nvcjtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX19yZWFkJDEgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG52YXIgX19zcHJlYWRBcnJheSQxID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn07XG52YXIgRm9yY2VGbHVzaFN0YXRlO1xuKGZ1bmN0aW9uIChGb3JjZUZsdXNoU3RhdGUpIHtcbiAgICBGb3JjZUZsdXNoU3RhdGVbRm9yY2VGbHVzaFN0YXRlW1wicmVzb2x2ZWRcIl0gPSAwXSA9IFwicmVzb2x2ZWRcIjtcbiAgICBGb3JjZUZsdXNoU3RhdGVbRm9yY2VGbHVzaFN0YXRlW1widGltZW91dFwiXSA9IDFdID0gXCJ0aW1lb3V0XCI7XG4gICAgRm9yY2VGbHVzaFN0YXRlW0ZvcmNlRmx1c2hTdGF0ZVtcImVycm9yXCJdID0gMl0gPSBcImVycm9yXCI7XG4gICAgRm9yY2VGbHVzaFN0YXRlW0ZvcmNlRmx1c2hTdGF0ZVtcInVucmVzb2x2ZWRcIl0gPSAzXSA9IFwidW5yZXNvbHZlZFwiO1xufSkoRm9yY2VGbHVzaFN0YXRlIHx8IChGb3JjZUZsdXNoU3RhdGUgPSB7fSkpO1xuLyoqXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBiYXNpYyB0cmFjZXIgcHJvdmlkZXIgd2hpY2ggcGxhdGZvcm0gbGlicmFyaWVzIGNhbiBleHRlbmRcbiAqL1xudmFyIEJhc2ljVHJhY2VyUHJvdmlkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQmFzaWNUcmFjZXJQcm92aWRlcihjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyA9PT0gdm9pZCAwKSB7IGNvbmZpZyA9IHt9OyB9XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHRoaXMuX3JlZ2lzdGVyZWRTcGFuUHJvY2Vzc29ycyA9IFtdO1xuICAgICAgICB0aGlzLl90cmFjZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgbWVyZ2VkQ29uZmlnID0gbWVyZ2Uoe30sIGxvYWREZWZhdWx0Q29uZmlnKCksIHJlY29uZmlndXJlTGltaXRzKGNvbmZpZykpO1xuICAgICAgICB0aGlzLnJlc291cmNlID0gKF9hID0gbWVyZ2VkQ29uZmlnLnJlc291cmNlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBSZXNvdXJjZS5lbXB0eSgpO1xuICAgICAgICBpZiAobWVyZ2VkQ29uZmlnLm1lcmdlUmVzb3VyY2VXaXRoRGVmYXVsdHMpIHtcbiAgICAgICAgICAgIHRoaXMucmVzb3VyY2UgPSBSZXNvdXJjZS5kZWZhdWx0KCkubWVyZ2UodGhpcy5yZXNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwgbWVyZ2VkQ29uZmlnLCB7XG4gICAgICAgICAgICByZXNvdXJjZTogdGhpcy5yZXNvdXJjZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICgoX2IgPSBjb25maWcuc3BhblByb2Nlc3NvcnMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyZWRTcGFuUHJvY2Vzc29ycyA9IF9fc3ByZWFkQXJyYXkkMShbXSwgX19yZWFkJDEoY29uZmlnLnNwYW5Qcm9jZXNzb3JzKSwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yID0gbmV3IE11bHRpU3BhblByb2Nlc3Nvcih0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGRlZmF1bHRFeHBvcnRlciA9IHRoaXMuX2J1aWxkRXhwb3J0ZXJGcm9tRW52KCk7XG4gICAgICAgICAgICBpZiAoZGVmYXVsdEV4cG9ydGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgYmF0Y2hQcm9jZXNzb3IgPSBuZXcgQmF0Y2hTcGFuUHJvY2Vzc29yKGRlZmF1bHRFeHBvcnRlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yID0gYmF0Y2hQcm9jZXNzb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVNwYW5Qcm9jZXNzb3IgPSBuZXcgTm9vcFNwYW5Qcm9jZXNzb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5nZXRUcmFjZXIgPSBmdW5jdGlvbiAobmFtZSwgdmVyc2lvbiwgb3B0aW9ucykge1xuICAgICAgICB2YXIga2V5ID0gbmFtZSArIFwiQFwiICsgKHZlcnNpb24gfHwgJycpICsgXCI6XCIgKyAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zY2hlbWFVcmwpIHx8ICcnKTtcbiAgICAgICAgaWYgKCF0aGlzLl90cmFjZXJzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFjZXJzLnNldChrZXksIG5ldyBUcmFjZXIoeyBuYW1lOiBuYW1lLCB2ZXJzaW9uOiB2ZXJzaW9uLCBzY2hlbWFVcmw6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zY2hlbWFVcmwgfSwgdGhpcy5fY29uZmlnLCB0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYWNlcnMuZ2V0KGtleSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBwbGVhc2UgdXNlIHtAbGluayBUcmFjZXJDb25maWd9IHNwYW5Qcm9jZXNzb3JzIHByb3BlcnR5XG4gICAgICogQWRkcyBhIG5ldyB7QGxpbmsgU3BhblByb2Nlc3Nvcn0gdG8gdGhpcyB0cmFjZXIuXG4gICAgICogQHBhcmFtIHNwYW5Qcm9jZXNzb3IgdGhlIG5ldyBTcGFuUHJvY2Vzc29yIHRvIGJlIGFkZGVkLlxuICAgICAqL1xuICAgIEJhc2ljVHJhY2VyUHJvdmlkZXIucHJvdG90eXBlLmFkZFNwYW5Qcm9jZXNzb3IgPSBmdW5jdGlvbiAoc3BhblByb2Nlc3Nvcikge1xuICAgICAgICBpZiAodGhpcy5fcmVnaXN0ZXJlZFNwYW5Qcm9jZXNzb3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gc2luY2Ugd2UgbWlnaHQgaGF2ZSBlbmFibGVkIGJ5IGRlZmF1bHQgYSBiYXRjaFByb2Nlc3Nvciwgd2UgZGlzYWJsZSBpdFxuICAgICAgICAgICAgLy8gYmVmb3JlIGFkZGluZyB0aGUgbmV3IG9uZVxuICAgICAgICAgICAgdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yXG4gICAgICAgICAgICAgICAgLnNodXRkb3duKClcbiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBkaWFnLmVycm9yKCdFcnJvciB3aGlsZSB0cnlpbmcgdG8gc2h1dGRvd24gY3VycmVudCBzcGFuIHByb2Nlc3NvcicsIGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMucHVzaChzcGFuUHJvY2Vzc29yKTtcbiAgICAgICAgdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yID0gbmV3IE11bHRpU3BhblByb2Nlc3Nvcih0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMpO1xuICAgIH07XG4gICAgQmFzaWNUcmFjZXJQcm92aWRlci5wcm90b3R5cGUuZ2V0QWN0aXZlU3BhblByb2Nlc3NvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlU3BhblByb2Nlc3NvcjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIHRoaXMgVHJhY2VyUHJvdmlkZXIgZm9yIHVzZSB3aXRoIHRoZSBPcGVuVGVsZW1ldHJ5IEFQSS5cbiAgICAgKiBVbmRlZmluZWQgdmFsdWVzIG1heSBiZSByZXBsYWNlZCB3aXRoIGRlZmF1bHRzLCBhbmRcbiAgICAgKiBudWxsIHZhbHVlcyB3aWxsIGJlIHNraXBwZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBTREsgcmVnaXN0cmF0aW9uXG4gICAgICovXG4gICAgQmFzaWNUcmFjZXJQcm92aWRlci5wcm90b3R5cGUucmVnaXN0ZXIgPSBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgPT09IHZvaWQgMCkgeyBjb25maWcgPSB7fTsgfVxuICAgICAgICB0cmFjZS5zZXRHbG9iYWxUcmFjZXJQcm92aWRlcih0aGlzKTtcbiAgICAgICAgaWYgKGNvbmZpZy5wcm9wYWdhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbmZpZy5wcm9wYWdhdG9yID0gdGhpcy5fYnVpbGRQcm9wYWdhdG9yRnJvbUVudigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuY29udGV4dE1hbmFnZXIpIHtcbiAgICAgICAgICAgIGNvbnRleHQuc2V0R2xvYmFsQ29udGV4dE1hbmFnZXIoY29uZmlnLmNvbnRleHRNYW5hZ2VyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLnByb3BhZ2F0b3IpIHtcbiAgICAgICAgICAgIHByb3BhZ2F0aW9uLnNldEdsb2JhbFByb3BhZ2F0b3IoY29uZmlnLnByb3BhZ2F0b3IpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5mb3JjZUZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdGltZW91dCA9IHRoaXMuX2NvbmZpZy5mb3JjZUZsdXNoVGltZW91dE1pbGxpcztcbiAgICAgICAgdmFyIHByb21pc2VzID0gdGhpcy5fcmVnaXN0ZXJlZFNwYW5Qcm9jZXNzb3JzLm1hcChmdW5jdGlvbiAoc3BhblByb2Nlc3Nvcikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0YXRlO1xuICAgICAgICAgICAgICAgIHZhciB0aW1lb3V0SW50ZXJ2YWwgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgRXJyb3IoXCJTcGFuIHByb2Nlc3NvciBkaWQgbm90IGNvbXBsZXRlZCB3aXRoaW4gdGltZW91dCBwZXJpb2Qgb2YgXCIgKyB0aW1lb3V0ICsgXCIgbXNcIikpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEZvcmNlRmx1c2hTdGF0ZS50aW1lb3V0O1xuICAgICAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIHNwYW5Qcm9jZXNzb3JcbiAgICAgICAgICAgICAgICAgICAgLmZvcmNlRmx1c2goKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgIT09IEZvcmNlRmx1c2hTdGF0ZS50aW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEZvcmNlRmx1c2hTdGF0ZS5yZXNvbHZlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dEludGVydmFsKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBGb3JjZUZsdXNoU3RhdGUuZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICB2YXIgZXJyb3JzID0gcmVzdWx0cy5maWx0ZXIoZnVuY3Rpb24gKHJlc3VsdCkgeyByZXR1cm4gcmVzdWx0ICE9PSBGb3JjZUZsdXNoU3RhdGUucmVzb2x2ZWQ7IH0pO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3JzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHsgcmV0dXJuIHJlamVjdChbZXJyb3JdKTsgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQmFzaWNUcmFjZXJQcm92aWRlci5wcm90b3R5cGUuc2h1dGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVNwYW5Qcm9jZXNzb3Iuc2h1dGRvd24oKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRTIGNhbm5vdCB5ZXQgaW5mZXIgdGhlIHR5cGUgb2YgdGhpcy5jb25zdHJ1Y3RvcjpcbiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzM4NDEjaXNzdWVjb21tZW50LTMzNzU2MDE0NlxuICAgICAqIFRoZXJlIGlzIG5vIG5lZWQgdG8gb3ZlcnJpZGUgZWl0aGVyIG9mIHRoZSBnZXR0ZXJzIGluIHlvdXIgY2hpbGQgY2xhc3MuXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIHJlZ2lzdGVyZWQgY29tcG9uZW50IG1hcHMgc2hvdWxkIGJlIHRoZSBzYW1lIGFjcm9zcyBhbGxcbiAgICAgKiBjbGFzc2VzIGluIHRoZSBpbmhlcml0YW5jZSB0cmVlLlxuICAgICAqL1xuICAgIEJhc2ljVHJhY2VyUHJvdmlkZXIucHJvdG90eXBlLl9nZXRQcm9wYWdhdG9yID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5jb25zdHJ1Y3Rvci5fcmVnaXN0ZXJlZFByb3BhZ2F0b3JzLmdldChuYW1lKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hKCk7XG4gICAgfTtcbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5fZ2V0U3BhbkV4cG9ydGVyID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5jb25zdHJ1Y3Rvci5fcmVnaXN0ZXJlZEV4cG9ydGVycy5nZXQobmFtZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYSgpO1xuICAgIH07XG4gICAgQmFzaWNUcmFjZXJQcm92aWRlci5wcm90b3R5cGUuX2J1aWxkUHJvcGFnYXRvckZyb21FbnYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIHBlciBzcGVjLCBwcm9wYWdhdG9ycyBmcm9tIGVudiBtdXN0IGJlIGRlZHVwbGljYXRlZFxuICAgICAgICB2YXIgdW5pcXVlUHJvcGFnYXRvck5hbWVzID0gQXJyYXkuZnJvbShuZXcgU2V0KGdldEVudigpLk9URUxfUFJPUEFHQVRPUlMpKTtcbiAgICAgICAgdmFyIHByb3BhZ2F0b3JzID0gdW5pcXVlUHJvcGFnYXRvck5hbWVzLm1hcChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgdmFyIHByb3BhZ2F0b3IgPSBfdGhpcy5fZ2V0UHJvcGFnYXRvcihuYW1lKTtcbiAgICAgICAgICAgIGlmICghcHJvcGFnYXRvcikge1xuICAgICAgICAgICAgICAgIGRpYWcud2FybihcIlByb3BhZ2F0b3IgXFxcIlwiICsgbmFtZSArIFwiXFxcIiByZXF1ZXN0ZWQgdGhyb3VnaCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyB1bmF2YWlsYWJsZS5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvcGFnYXRvcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB2YWxpZFByb3BhZ2F0b3JzID0gcHJvcGFnYXRvcnMucmVkdWNlKGZ1bmN0aW9uIChsaXN0LCBpdGVtKSB7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIGxpc3QucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBsaXN0O1xuICAgICAgICB9LCBbXSk7XG4gICAgICAgIGlmICh2YWxpZFByb3BhZ2F0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHVuaXF1ZVByb3BhZ2F0b3JOYW1lcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWxpZFByb3BhZ2F0b3JzWzBdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVQcm9wYWdhdG9yKHtcbiAgICAgICAgICAgICAgICBwcm9wYWdhdG9yczogdmFsaWRQcm9wYWdhdG9ycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5fYnVpbGRFeHBvcnRlckZyb21FbnYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBleHBvcnRlck5hbWUgPSBnZXRFbnYoKS5PVEVMX1RSQUNFU19FWFBPUlRFUjtcbiAgICAgICAgaWYgKGV4cG9ydGVyTmFtZSA9PT0gJ25vbmUnIHx8IGV4cG9ydGVyTmFtZSA9PT0gJycpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBleHBvcnRlciA9IHRoaXMuX2dldFNwYW5FeHBvcnRlcihleHBvcnRlck5hbWUpO1xuICAgICAgICBpZiAoIWV4cG9ydGVyKSB7XG4gICAgICAgICAgICBkaWFnLmVycm9yKFwiRXhwb3J0ZXIgXFxcIlwiICsgZXhwb3J0ZXJOYW1lICsgXCJcXFwiIHJlcXVlc3RlZCB0aHJvdWdoIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHVuYXZhaWxhYmxlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhwb3J0ZXI7XG4gICAgfTtcbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLl9yZWdpc3RlcmVkUHJvcGFnYXRvcnMgPSBuZXcgTWFwKFtcbiAgICAgICAgWyd0cmFjZWNvbnRleHQnLCBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvcigpOyB9XSxcbiAgICAgICAgWydiYWdnYWdlJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFczQ0JhZ2dhZ2VQcm9wYWdhdG9yKCk7IH1dLFxuICAgIF0pO1xuICAgIEJhc2ljVHJhY2VyUHJvdmlkZXIuX3JlZ2lzdGVyZWRFeHBvcnRlcnMgPSBuZXcgTWFwKCk7XG4gICAgcmV0dXJuIEJhc2ljVHJhY2VyUHJvdmlkZXI7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fdmFsdWVzID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX192YWx1ZXMpIHx8IGZ1bmN0aW9uKG8pIHtcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufTtcbi8qKlxuICogVGhpcyBpcyBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgU3BhbkV4cG9ydGVyfSB0aGF0IHByaW50cyBzcGFucyB0byB0aGVcbiAqIGNvbnNvbGUuIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMuXG4gKlxuICogTk9URTogVGhpcyB7QGxpbmsgU3BhbkV4cG9ydGVyfSBpcyBpbnRlbmRlZCBmb3IgZGlhZ25vc3RpY3MgdXNlIG9ubHksIG91dHB1dCByZW5kZXJlZCB0byB0aGUgY29uc29sZSBtYXkgY2hhbmdlIGF0IGFueSB0aW1lLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG52YXIgQ29uc29sZVNwYW5FeHBvcnRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb25zb2xlU3BhbkV4cG9ydGVyKCkge1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeHBvcnQgc3BhbnMuXG4gICAgICogQHBhcmFtIHNwYW5zXG4gICAgICogQHBhcmFtIHJlc3VsdENhbGxiYWNrXG4gICAgICovXG4gICAgQ29uc29sZVNwYW5FeHBvcnRlci5wcm90b3R5cGUuZXhwb3J0ID0gZnVuY3Rpb24gKHNwYW5zLCByZXN1bHRDYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VuZFNwYW5zKHNwYW5zLCByZXN1bHRDYWxsYmFjayk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTaHV0ZG93biB0aGUgZXhwb3J0ZXIuXG4gICAgICovXG4gICAgQ29uc29sZVNwYW5FeHBvcnRlci5wcm90b3R5cGUuc2h1dGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3NlbmRTcGFucyhbXSk7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcmNlRmx1c2goKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4cG9ydHMgYW55IHBlbmRpbmcgc3BhbnMgaW4gZXhwb3J0ZXJcbiAgICAgKi9cbiAgICBDb25zb2xlU3BhbkV4cG9ydGVyLnByb3RvdHlwZS5mb3JjZUZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBjb252ZXJ0cyBzcGFuIGluZm8gaW50byBtb3JlIHJlYWRhYmxlIGZvcm1hdFxuICAgICAqIEBwYXJhbSBzcGFuXG4gICAgICovXG4gICAgQ29uc29sZVNwYW5FeHBvcnRlci5wcm90b3R5cGUuX2V4cG9ydEluZm8gPSBmdW5jdGlvbiAoc3Bhbikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXNvdXJjZToge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHNwYW4ucmVzb3VyY2UuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbnN0cnVtZW50YXRpb25TY29wZTogc3Bhbi5pbnN0cnVtZW50YXRpb25MaWJyYXJ5LFxuICAgICAgICAgICAgdHJhY2VJZDogc3Bhbi5zcGFuQ29udGV4dCgpLnRyYWNlSWQsXG4gICAgICAgICAgICBwYXJlbnRJZDogc3Bhbi5wYXJlbnRTcGFuSWQsXG4gICAgICAgICAgICB0cmFjZVN0YXRlOiAoX2EgPSBzcGFuLnNwYW5Db250ZXh0KCkudHJhY2VTdGF0ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNlcmlhbGl6ZSgpLFxuICAgICAgICAgICAgbmFtZTogc3Bhbi5uYW1lLFxuICAgICAgICAgICAgaWQ6IHNwYW4uc3BhbkNvbnRleHQoKS5zcGFuSWQsXG4gICAgICAgICAgICBraW5kOiBzcGFuLmtpbmQsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IGhyVGltZVRvTWljcm9zZWNvbmRzKHNwYW4uc3RhcnRUaW1lKSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiBoclRpbWVUb01pY3Jvc2Vjb25kcyhzcGFuLmR1cmF0aW9uKSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHNwYW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgIHN0YXR1czogc3Bhbi5zdGF0dXMsXG4gICAgICAgICAgICBldmVudHM6IHNwYW4uZXZlbnRzLFxuICAgICAgICAgICAgbGlua3M6IHNwYW4ubGlua3MsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTaG93aW5nIHNwYW5zIGluIGNvbnNvbGVcbiAgICAgKiBAcGFyYW0gc3BhbnNcbiAgICAgKiBAcGFyYW0gZG9uZVxuICAgICAqL1xuICAgIENvbnNvbGVTcGFuRXhwb3J0ZXIucHJvdG90eXBlLl9zZW5kU3BhbnMgPSBmdW5jdGlvbiAoc3BhbnMsIGRvbmUpIHtcbiAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBzcGFuc18xID0gX192YWx1ZXMoc3BhbnMpLCBzcGFuc18xXzEgPSBzcGFuc18xLm5leHQoKTsgIXNwYW5zXzFfMS5kb25lOyBzcGFuc18xXzEgPSBzcGFuc18xLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBzcGFuID0gc3BhbnNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGlyKHRoaXMuX2V4cG9ydEluZm8oc3BhbiksIHsgZGVwdGg6IDMgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChzcGFuc18xXzEgJiYgIXNwYW5zXzFfMS5kb25lICYmIChfYSA9IHNwYW5zXzEucmV0dXJuKSkgX2EuY2FsbChzcGFuc18xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIGRvbmUoeyBjb2RlOiBFeHBvcnRSZXN1bHRDb2RlLlNVQ0NFU1MgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBDb25zb2xlU3BhbkV4cG9ydGVyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBfX3JlYWQgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG52YXIgX19zcHJlYWRBcnJheSA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fc3ByZWFkQXJyYXkpIHx8IGZ1bmN0aW9uICh0bywgZnJvbSwgcGFjaykge1xuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59O1xuLyoqXG4gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLiBJdCBzdG9yZXMgdGhlIGV4cG9ydGVkIHNwYW5zXG4gKiBpbiBhIGxpc3QgaW4gbWVtb3J5IHRoYXQgY2FuIGJlIHJldHJpZXZlZCB1c2luZyB0aGUgYGdldEZpbmlzaGVkU3BhbnMoKWBcbiAqIG1ldGhvZC5cbiAqL1xudmFyIEluTWVtb3J5U3BhbkV4cG9ydGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEluTWVtb3J5U3BhbkV4cG9ydGVyKCkge1xuICAgICAgICB0aGlzLl9maW5pc2hlZFNwYW5zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGV4cG9ydGVyIGhhcyBiZWVuIFwic2h1dGRvd24uXCJcbiAgICAgICAgICogV2hlbiBmYWxzZSwgZXhwb3J0ZWQgc3BhbnMgd2lsbCBub3QgYmUgc3RvcmVkIGluLW1lbW9yeS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3N0b3BwZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgSW5NZW1vcnlTcGFuRXhwb3J0ZXIucHJvdG90eXBlLmV4cG9ydCA9IGZ1bmN0aW9uIChzcGFucywgcmVzdWx0Q2FsbGJhY2spIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodGhpcy5fc3RvcHBlZClcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRDYWxsYmFjayh7XG4gICAgICAgICAgICAgICAgY29kZTogRXhwb3J0UmVzdWx0Q29kZS5GQUlMRUQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcignRXhwb3J0ZXIgaGFzIGJlZW4gc3RvcHBlZCcpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIChfYSA9IHRoaXMuX2ZpbmlzaGVkU3BhbnMpLnB1c2guYXBwbHkoX2EsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChzcGFucyksIGZhbHNlKSk7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzdWx0Q2FsbGJhY2soeyBjb2RlOiBFeHBvcnRSZXN1bHRDb2RlLlNVQ0NFU1MgfSk7IH0sIDApO1xuICAgIH07XG4gICAgSW5NZW1vcnlTcGFuRXhwb3J0ZXIucHJvdG90eXBlLnNodXRkb3duID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9zdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fZmluaXNoZWRTcGFucyA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JjZUZsdXNoKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFeHBvcnRzIGFueSBwZW5kaW5nIHNwYW5zIGluIHRoZSBleHBvcnRlclxuICAgICAqL1xuICAgIEluTWVtb3J5U3BhbkV4cG9ydGVyLnByb3RvdHlwZS5mb3JjZUZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfTtcbiAgICBJbk1lbW9yeVNwYW5FeHBvcnRlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2ZpbmlzaGVkU3BhbnMgPSBbXTtcbiAgICB9O1xuICAgIEluTWVtb3J5U3BhbkV4cG9ydGVyLnByb3RvdHlwZS5nZXRGaW5pc2hlZFNwYW5zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmluaXNoZWRTcGFucztcbiAgICB9O1xuICAgIHJldHVybiBJbk1lbW9yeVNwYW5FeHBvcnRlcjtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX19hd2FpdGVyID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG52YXIgX19nZW5lcmF0b3IgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbn07XG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgU3BhblByb2Nlc3Nvcn0gdGhhdCBjb252ZXJ0cyB0aGUge0BsaW5rIFNwYW59XG4gKiB0byB7QGxpbmsgUmVhZGFibGVTcGFufSBhbmQgcGFzc2VzIGl0IHRvIHRoZSBjb25maWd1cmVkIGV4cG9ydGVyLlxuICpcbiAqIE9ubHkgc3BhbnMgdGhhdCBhcmUgc2FtcGxlZCBhcmUgY29udmVydGVkLlxuICpcbiAqIE5PVEU6IFRoaXMge0BsaW5rIFNwYW5Qcm9jZXNzb3J9IGV4cG9ydHMgZXZlcnkgZW5kZWQgc3BhbiBpbmRpdmlkdWFsbHkgaW5zdGVhZCBvZiBiYXRjaGluZyBzcGFucyB0b2dldGhlciwgd2hpY2ggY2F1c2VzIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIG92ZXJoZWFkIHdpdGggbW9zdCBleHBvcnRlcnMuIEZvciBwcm9kdWN0aW9uIHVzZSwgcGxlYXNlIGNvbnNpZGVyIHVzaW5nIHRoZSB7QGxpbmsgQmF0Y2hTcGFuUHJvY2Vzc29yfSBpbnN0ZWFkLlxuICovXG52YXIgU2ltcGxlU3BhblByb2Nlc3NvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTaW1wbGVTcGFuUHJvY2Vzc29yKF9leHBvcnRlcikge1xuICAgICAgICB0aGlzLl9leHBvcnRlciA9IF9leHBvcnRlcjtcbiAgICAgICAgdGhpcy5fc2h1dGRvd25PbmNlID0gbmV3IEJpbmRPbmNlRnV0dXJlKHRoaXMuX3NodXRkb3duLCB0aGlzKTtcbiAgICAgICAgdGhpcy5fdW5yZXNvbHZlZEV4cG9ydHMgPSBuZXcgU2V0KCk7XG4gICAgfVxuICAgIFNpbXBsZVNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLmZvcmNlRmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogXG4gICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0IHVucmVzb2x2ZWQgcmVzb3VyY2VzIGJlZm9yZSByZXNvbHZpbmdcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh0aGlzLl91bnJlc29sdmVkRXhwb3J0cykpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXdhaXQgdW5yZXNvbHZlZCByZXNvdXJjZXMgYmVmb3JlIHJlc29sdmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9leHBvcnRlci5mb3JjZUZsdXNoKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuX2V4cG9ydGVyLmZvcmNlRmx1c2goKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgU2ltcGxlU3BhblByb2Nlc3Nvci5wcm90b3R5cGUub25TdGFydCA9IGZ1bmN0aW9uIChfc3BhbiwgX3BhcmVudENvbnRleHQpIHsgfTtcbiAgICBTaW1wbGVTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uIChzcGFuKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGlmICh0aGlzLl9zaHV0ZG93bk9uY2UuaXNDYWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHNwYW4uc3BhbkNvbnRleHQoKS50cmFjZUZsYWdzICYgVHJhY2VGbGFncy5TQU1QTEVEKSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkb0V4cG9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbFxuICAgICAgICAgICAgICAgIC5fZXhwb3J0KF90aGlzLl9leHBvcnRlciwgW3NwYW5dKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5jb2RlICE9PSBFeHBvcnRSZXN1bHRDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRXJyb3JIYW5kbGVyKChfYSA9IHJlc3VsdC5lcnJvcikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogbmV3IEVycm9yKFwiU2ltcGxlU3BhblByb2Nlc3Nvcjogc3BhbiBleHBvcnQgZmFpbGVkIChzdGF0dXMgXCIgKyByZXN1bHQgKyBcIilcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGdsb2JhbEVycm9ySGFuZGxlcihlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gQXZvaWQgc2NoZWR1bGluZyBhIHByb21pc2UgdG8gbWFrZSB0aGUgYmVoYXZpb3IgbW9yZSBwcmVkaWN0YWJsZSBhbmQgZWFzaWVyIHRvIHRlc3RcbiAgICAgICAgaWYgKHNwYW4ucmVzb3VyY2UuYXN5bmNBdHRyaWJ1dGVzUGVuZGluZykge1xuICAgICAgICAgICAgdmFyIGV4cG9ydFByb21pc2VfMSA9IChfYiA9IChfYSA9IHNwYW4ucmVzb3VyY2UpLndhaXRGb3JBc3luY0F0dHJpYnV0ZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXhwb3J0UHJvbWlzZV8xICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3VucmVzb2x2ZWRFeHBvcnRzLmRlbGV0ZShleHBvcnRQcm9taXNlXzEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZG9FeHBvcnQoKTtcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsgcmV0dXJuIGdsb2JhbEVycm9ySGFuZGxlcihlcnIpOyB9KTtcbiAgICAgICAgICAgIC8vIHN0b3JlIHRoZSB1bnJlc29sdmVkIGV4cG9ydHNcbiAgICAgICAgICAgIGlmIChleHBvcnRQcm9taXNlXzEgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3VucmVzb2x2ZWRFeHBvcnRzLmFkZChleHBvcnRQcm9taXNlXzEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdm9pZCBkb0V4cG9ydCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTaW1wbGVTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5zaHV0ZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NodXRkb3duT25jZS5jYWxsKCk7XG4gICAgfTtcbiAgICBTaW1wbGVTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5fc2h1dGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leHBvcnRlci5zaHV0ZG93bigpO1xuICAgIH07XG4gICAgcmV0dXJuIFNpbXBsZVNwYW5Qcm9jZXNzb3I7XG59KCkpO1xuXG5leHBvcnQgeyBBbHdheXNPZmZTYW1wbGVyIGFzIEEsIEJhc2ljVHJhY2VyUHJvdmlkZXIgYXMgQiwgQ29uc29sZVNwYW5FeHBvcnRlciBhcyBDLCBGb3JjZUZsdXNoU3RhdGUgYXMgRiwgSW5NZW1vcnlTcGFuRXhwb3J0ZXIgYXMgSSwgTm9vcFNwYW5Qcm9jZXNzb3IgYXMgTiwgUGFyZW50QmFzZWRTYW1wbGVyIGFzIFAsIFJhbmRvbUlkR2VuZXJhdG9yIGFzIFIsIFNpbXBsZVNwYW5Qcm9jZXNzb3IgYXMgUywgVHJhY2VyIGFzIFQsIEJhdGNoU3BhblByb2Nlc3NvciBhcyBhLCBBbHdheXNPblNhbXBsZXIgYXMgYiwgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyIGFzIGMsIFNhbXBsaW5nRGVjaXNpb24gYXMgZCwgU3BhbiBhcyBlIH07Il0sCiAgIm1hcHBpbmdzIjogIkFBQUEsU0FBUyxLQUFLQSxJQUFnQixLQUFLQyxHQUFPLEtBQUtDLElBQW9CLEtBQUtDLEdBQVksS0FBS0MsSUFBZ0IsS0FBS0MsR0FBUyxLQUFLQyxJQUFzQixLQUFLQyxVQUFnQjtBQUN2SyxTQUFTLFNBQWlCO0FBQzFCLFNBQVMsS0FBS0MsR0FBYSxLQUFLQyxJQUFnQixLQUFLQyxHQUFlLEtBQUtDLElBQVEsS0FBS0MsR0FBZ0IsS0FBS0MsSUFBbUIsS0FBS0MsSUFBWSxLQUFLQyxHQUF5QixLQUFLQyxHQUE0QixLQUFLQyxJQUFlLEtBQUtDLElBQStCLEtBQUtDLElBQWEsS0FBS0MsU0FBNEI7QUFDelQsU0FBUyxLQUFLQyxJQUFrQixLQUFLQyxHQUFvQixLQUFLQyxHQUFvQixLQUFLQyxJQUFpQixLQUFLQyxJQUFZLEtBQUtDLEdBQWdCLEtB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LE9BQU93SixDQUFlLEdBRTVDcEcsRUFBUztBQUFBLFVBQ3BCLEdBQUcsU0FBVUksR0FBSztBQUFFLG1CQUFPL0gsRUFBbUIrSCxDQUFHO0FBQUEsVUFBRyxDQUFDO0FBRXJELFVBQUlnRyxLQUFtQixRQUNuQixLQUFLLG1CQUFtQixJQUFJQSxDQUFlO0FBQUEsUUFFbkQ7QUFFSSxVQUFLcEcsRUFBUztBQUFBO0FBQUEsSUFFdEIsR0FDQW1HLEVBQW9CLFVBQVUsV0FBVyxXQUFZO0FBQ2pELGFBQU8sS0FBSyxjQUFjLEtBQUs7QUFBQSxJQUNuQyxHQUNBQSxFQUFvQixVQUFVLFlBQVksV0FBWTtBQUNsRCxhQUFPLEtBQUssVUFBVSxTQUFTO0FBQUEsSUFDbkMsR0FDT0E7QUFBQSxFQUNYLEVBQUU7QUFBQTsiLAogICJuYW1lcyI6IFsiU3BhblN0YXR1c0NvZGUiLCAidHJhY2UiLCAiaXNTcGFuQ29udGV4dFZhbGlkIiwgIlRyYWNlRmxhZ3MiLCAiaXNWYWxpZFRyYWNlSWQiLCAiY29udGV4dCIsICJJTlZBTElEX1NQQU5fQ09OVEVYVCIsICJTcGFuS2luZCIsICJpc1RpbWVJbnB1dCIsICJoclRpbWVEdXJhdGlvbiIsICJvdHBlcmZvcm1hbmNlIiwgImhyVGltZSIsICJtaWxsaXNUb0hyVGltZSIsICJpc1RpbWVJbnB1dEhyVGltZSIsICJhZGRIclRpbWVzIiwgIlNFTUFUVFJTX0VYQ0VQVElPTl9UWVBFIiwgIlNFTUFUVFJTX0VYQ0VQVElPTl9NRVNTQUdFIiwgImdldFRpbWVPcmlnaW4iLCAiU0VNQVRUUlNfRVhDRVBUSU9OX1NUQUNLVFJBQ0UiLCAicHJvcGFnYXRpb24iLCAiaHJUaW1lVG9NaWNyb3NlY29uZHMiLCAiaXNBdHRyaWJ1dGVWYWx1ZSIsICJzYW5pdGl6ZUF0dHJpYnV0ZXMiLCAiZ2xvYmFsRXJyb3JIYW5kbGVyIiwgInN1cHByZXNzVHJhY2luZyIsICJ1bnJlZlRpbWVyIiwgIkJpbmRPbmNlRnV0dXJlIiwgImlzVHJhY2luZ1N1cHByZXNzZWQiLCAiU2FtcGxpbmdEZWNpc2lvbiQxIiwgIkNvbXBvc2l0ZVByb3BhZ2F0b3IiLCAiVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvciIsICJXM0NCYWdnYWdlUHJvcGFnYXRvciIsICJtZXJnZSIsICJpbnRlcm5hbCIsICJUcmFjZXNTYW1wbGVyVmFsdWVzIiwgImdldEVudiIsICJnZXRFbnZXaXRob3V0RGVmYXVsdHMiLCAiREVGQVVMVF9BVFRSSUJVVEVfQ09VTlRfTElNSVQiLCAiREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUIiwgIlJlc291cmNlIiwgIkV4cG9ydFJlc3VsdENvZGUiLCAiRXhjZXB0aW9uRXZlbnROYW1lIiwgIl9fYXNzaWduIiwgInQiLCAicyIsICJpIiwgInAiLCAiX192YWx1ZXMkMiIsICJvIiwgIm0iLCAiX19yZWFkJDIiLCAibiIsICJyIiwgImFyIiwgImUiLCAiZXJyb3IiLCAiX19zcHJlYWRBcnJheSQyIiwgInRvIiwgImZyb20iLCAicGFjayIsICJsIiwgIlNwYW4iLCAicGFyZW50VHJhY2VyIiwgInNwYW5OYW1lIiwgInNwYW5Db250ZXh0IiwgImtpbmQiLCAicGFyZW50U3BhbklkIiwgImxpbmtzIiwgInN0YXJ0VGltZSIsICJfZGVwcmVjYXRlZENsb2NrIiwgImF0dHJpYnV0ZXMiLCAibm93IiwgImtleSIsICJ2YWx1ZSIsICJkaWFnIiwgImVfMSIsICJfYSIsICJfYiIsICJfYyIsICJfZCIsICJrIiwgInYiLCAiZV8xXzEiLCAibmFtZSIsICJhdHRyaWJ1dGVzT3JTdGFydFRpbWUiLCAidGltZVN0YW1wIiwgImxpbmsiLCAic3RhdHVzIiwgImVuZFRpbWUiLCAiaW5wIiwgIm1zRHVyYXRpb24iLCAiZXhjZXB0aW9uIiwgInRpbWUiLCAibGltaXQiLCAiX3RoaXMiLCAidmFsIiwgIlNhbXBsaW5nRGVjaXNpb24iLCAiQWx3YXlzT2ZmU2FtcGxlciIsICJBbHdheXNPblNhbXBsZXIiLCAiUGFyZW50QmFzZWRTYW1wbGVyIiwgImNvbmZpZyIsICJ0cmFjZUlkIiwgInNwYW5LaW5kIiwgInBhcmVudENvbnRleHQiLCAiVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyIiwgIl9yYXRpbyIsICJyYXRpbyIsICJhY2N1bXVsYXRpb24iLCAicG9zIiwgInBhcnQiLCAiRkFMTEJBQ0tfT1RFTF9UUkFDRVNfU0FNUExFUiIsICJERUZBVUxUX1JBVElPIiwgImxvYWREZWZhdWx0Q29uZmlnIiwgImVudiIsICJidWlsZFNhbXBsZXJGcm9tRW52IiwgImVudmlyb25tZW50IiwgImdldFNhbXBsZXJQcm9iYWJpbGl0eUZyb21FbnYiLCAicHJvYmFiaWxpdHkiLCAibWVyZ2VDb25maWciLCAidXNlckNvbmZpZyIsICJwZXJJbnN0YW5jZURlZmF1bHRzIiwgIkRFRkFVTFRfQ09ORklHIiwgInRhcmdldCIsICJyZWNvbmZpZ3VyZUxpbWl0cyIsICJfZSIsICJfZiIsICJfZyIsICJfaCIsICJfaiIsICJfayIsICJfbCIsICJfbSIsICJzcGFuTGltaXRzIiwgInBhcnNlZEVudkNvbmZpZyIsICJCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlIiwgIl9leHBvcnRlciIsICJfc3BhbiIsICJfcGFyZW50Q29udGV4dCIsICJzcGFuIiwgInJlc29sdmUiLCAicmVqZWN0IiwgInByb21pc2VzIiwgImNvdW50IiwgImoiLCAidGltZXIiLCAic3BhbnMiLCAiZG9FeHBvcnQiLCAicmVzdWx0IiwgInBlbmRpbmdSZXNvdXJjZXMiLCAibGVuIiwgImVyciIsICJmbHVzaCIsICJfX2V4dGVuZHMiLCAiZXh0ZW5kU3RhdGljcyIsICJkIiwgImIiLCAiX18iLCAiQmF0Y2hTcGFuUHJvY2Vzc29yIiwgIl9zdXBlciIsICJTUEFOX0lEX0JZVEVTIiwgIlRSQUNFX0lEX0JZVEVTIiwgIlJhbmRvbUlkR2VuZXJhdG9yIiwgImdldElkR2VuZXJhdG9yIiwgIlNIQVJFRF9DSEFSX0NPREVTX0FSUkFZIiwgImJ5dGVzIiwgIlRyYWNlciIsICJpbnN0cnVtZW50YXRpb25MaWJyYXJ5IiwgIl90cmFjZXJQcm92aWRlciIsICJsb2NhbENvbmZpZyIsICJvcHRpb25zIiwgImNvbnRleHQkMSIsICJwYXJlbnRTcGFuIiwgIm5vblJlY29yZGluZ1NwYW4iLCAicGFyZW50U3BhbkNvbnRleHQiLCAic3BhbklkIiwgInRyYWNlU3RhdGUiLCAic2FtcGxpbmdSZXN1bHQiLCAidHJhY2VGbGFncyIsICJpbml0QXR0cmlidXRlcyIsICJhcmcyIiwgImFyZzMiLCAiYXJnNCIsICJvcHRzIiwgImN0eCIsICJmbiIsICJjb250ZXh0V2l0aFNwYW5TZXQiLCAiX192YWx1ZXMkMSIsICJNdWx0aVNwYW5Qcm9jZXNzb3IiLCAiX3NwYW5Qcm9jZXNzb3JzIiwgInNwYW5Qcm9jZXNzb3IiLCAiZV8yIiwgImVfMl8xIiwgImVfMyIsICJlXzNfMSIsICJlXzQiLCAiZV80XzEiLCAiTm9vcFNwYW5Qcm9jZXNzb3IiLCAiX2NvbnRleHQiLCAiX19yZWFkJDEiLCAiX19zcHJlYWRBcnJheSQxIiwgIkZvcmNlRmx1c2hTdGF0ZSIsICJCYXNpY1RyYWNlclByb3ZpZGVyIiwgIm1lcmdlZENvbmZpZyIsICJkZWZhdWx0RXhwb3J0ZXIiLCAiYmF0Y2hQcm9jZXNzb3IiLCAidmVyc2lvbiIsICJ0aW1lb3V0IiwgInN0YXRlIiwgInRpbWVvdXRJbnRlcnZhbCIsICJyZXN1bHRzIiwgImVycm9ycyIsICJ1bmlxdWVQcm9wYWdhdG9yTmFtZXMiLCAicHJvcGFnYXRvcnMiLCAicHJvcGFnYXRvciIsICJ2YWxpZFByb3BhZ2F0b3JzIiwgImxpc3QiLCAiaXRlbSIsICJleHBvcnRlck5hbWUiLCAiZXhwb3J0ZXIiLCAiX192YWx1ZXMiLCAiQ29uc29sZVNwYW5FeHBvcnRlciIsICJyZXN1bHRDYWxsYmFjayIsICJkb25lIiwgInNwYW5zXzEiLCAic3BhbnNfMV8xIiwgIl9fcmVhZCIsICJfX3NwcmVhZEFycmF5IiwgIkluTWVtb3J5U3BhbkV4cG9ydGVyIiwgIl9fYXdhaXRlciIsICJ0aGlzQXJnIiwgIl9hcmd1bWVudHMiLCAiUCIsICJnZW5lcmF0b3IiLCAiYWRvcHQiLCAiZnVsZmlsbGVkIiwgInN0ZXAiLCAicmVqZWN0ZWQiLCAiX19nZW5lcmF0b3IiLCAiYm9keSIsICJfIiwgImYiLCAieSIsICJnIiwgInZlcmIiLCAib3AiLCAiU2ltcGxlU3BhblByb2Nlc3NvciIsICJleHBvcnRQcm9taXNlXzEiXQp9Cg==