iszolea-ui 1.2.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9665,7 +9665,7 @@ By default grid shows only first 10 rows in the Edit mode.`).dxPopover({
9665
9665
  });
9666
9666
  }, mode === "Viewer" /* Viewer */);
9667
9667
  window.addEventListener("beforeunload", (e) => {
9668
- const isNotSavedReport = dxReportDesigner && dxReportDesigner.GetDesignerModel() && dxReportDesigner.GetDesignerModel().isDirty();
9668
+ const isNotSavedReport = dxReportDesigner && dxReportDesigner.GetDesignerModel() && dxReportDesigner.GetDesignerModel().isDirty;
9669
9669
  if (isNotSavedReport) {
9670
9670
  e.preventDefault();
9671
9671
  e.returnValue = "The report document is not saved. Are you sure you want to leave the page?";
@@ -10268,4 +10268,4 @@ By default grid shows only first 10 rows in the Edit mode.`).dxPopover({
10268
10268
  var Scripts_default = IszoleaUI;
10269
10269
  window.IszoleaUI = IszoleaUI;
10270
10270
  })();
10271
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL2ZpbGUtc2F2ZXIvc3JjL0ZpbGVTYXZlci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY3JvcHByL2Rpc3QvY3JvcHByLmpzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0J1c2luZXNzL0xpY2VuY2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQnVzaW5lc3MvTWVudUl0ZW1UeXBlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvTm90aWZ5LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvQXBpUmVzcG9uc2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9SZXF1ZXN0U3RhdGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9Qb3B1cC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9TdHlsaW5nL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvRXJyb3JJbmZvUG9wdXAudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9FeGNlcHRpb25UeXBlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1V0aWxzL0dlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9SZXF1ZXN0LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvRHhEYXRhU291cmNlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0NvcmUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVscGVycy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWxwZXJzL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0NvbmZpZy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWFkZXIvVXNlck1lbnUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQ29tcG9uZW50cy9NZW51L01lbnUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQ29tcG9uZW50cy9NZW51L0Jvb3RzdHJhcENvbGxhcHNpbmdNZW51LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9OYXZpZ2F0aW9uTWVudS50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db25zdGFudHMvQ2FjaGVLZXlzLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9Mb2dvLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9NZW51U3dpdGNoZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVhZGVyL1NlYXJjaC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9VdGlscy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9VdGlscy9FdmVudEVtaXR0ZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVhZGVyL0hlYWRlci50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL0J1c2luZXNzL0dyaWRDb2x1bW5UeXBlcy50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL0J1c2luZXNzL2NkbUltcG9ydEZpbGVNb2RlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvSUdyaWRTdGF0ZS50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0JhY2tncm91bmRJbWFnZVZpZXdlci50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Gb290ZXIvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9BdXRvUmVzaXplLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvRnVsbFNjcmVlbi50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWxwZXJzL1RoZW1lLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlbHBlcnMvVG9vbGJhci50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0RlZmF1bHRUb29sYmFyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvUGFuZWxIZWlnaHQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0NyZWF0ZUZ1bGxTY3JlZW5HcmlkLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1V0aWxzL0dyaWRFeHBvcnQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkQmFzZS50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkT2Jzb2xldGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRUcmVlTGlzdC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZy9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZy9IZWxwZXJzLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1BhZ2VzL0FjY291bnRTZXR0aW5ncy9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0NvbmZpcm0udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9MYW5kaW5nLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvQWNjZXNzRGVuaWVkVG9SZXBvcnQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvR3JpZC9DcmVhdGVEZWZhdWx0R3JpZC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9Db250cm9sQ29uZmlndXJhdG9yLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1V0aWxzL01lbW9pemUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vR3JpZFZpZXdzTWFuYWdlci50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9HcmlkU3RhdGVNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vR3JpZEZpbHRlcnNNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0ZpbGVVcGxvYWRlci9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0ZpbGVJbXBvcnRlci9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9HcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWREaXNwbGF5c01hbmFnZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRTdW1tYXJ5SGVscGVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0NvbnRyb2xEaXNwbGF5LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0Rpc3BsYXlNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0NvbXBvbmVudHMvU2Vzc2lvbk5vdGlmaWVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvR3JpZC9HcmlkSW5kaWNhdG9yU3RhdGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL0dyaWRTdGF0ZU1hbmFnZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL01vZGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9EYXRhL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvQ29tcG9uZW50cy9SZWZyZXNoVGltZXIvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9Db21wb25lbnRzL1JlZnJlc2hUaW1lci9CdXR0b24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvRGFzaGJvYXJkL0V4dGVuc2lvbnMvR2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9EYXNoYm9hcmQvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9SZXBvcnQvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9EaWFncmFtL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvU2xpZGVzaG93L0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvR2FubnRDaGFydC9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLypcbiogRmlsZVNhdmVyLmpzXG4qIEEgc2F2ZUFzKCkgRmlsZVNhdmVyIGltcGxlbWVudGF0aW9uLlxuKlxuKiBCeSBFbGkgR3JleSwgaHR0cDovL2VsaWdyZXkuY29tXG4qXG4qIExpY2Vuc2UgOiBodHRwczovL2dpdGh1Yi5jb20vZWxpZ3JleS9GaWxlU2F2ZXIuanMvYmxvYi9tYXN0ZXIvTElDRU5TRS5tZCAoTUlUKVxuKiBzb3VyY2UgIDogaHR0cDovL3B1cmwuZWxpZ3JleS5jb20vZ2l0aHViL0ZpbGVTYXZlci5qc1xuKi9cblxuLy8gVGhlIG9uZSBhbmQgb25seSB3YXkgb2YgZ2V0dGluZyBnbG9iYWwgc2NvcGUgaW4gYWxsIGVudmlyb25tZW50c1xuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xLzMyNzcxODIvMTAwODk5OVxudmFyIF9nbG9iYWwgPSB0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JyAmJiB3aW5kb3cud2luZG93ID09PSB3aW5kb3dcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcgJiYgc2VsZi5zZWxmID09PSBzZWxmXG4gID8gc2VsZiA6IHR5cGVvZiBnbG9iYWwgPT09ICdvYmplY3QnICYmIGdsb2JhbC5nbG9iYWwgPT09IGdsb2JhbFxuICA/IGdsb2JhbFxuICA6IHRoaXNcblxuZnVuY3Rpb24gYm9tIChibG9iLCBvcHRzKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ3VuZGVmaW5lZCcpIG9wdHMgPSB7IGF1dG9Cb206IGZhbHNlIH1cbiAgZWxzZSBpZiAodHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgY29uc29sZS53YXJuKCdEZXByZWNhdGVkOiBFeHBlY3RlZCB0aGlyZCBhcmd1bWVudCB0byBiZSBhIG9iamVjdCcpXG4gICAgb3B0cyA9IHsgYXV0b0JvbTogIW9wdHMgfVxuICB9XG5cbiAgLy8gcHJlcGVuZCBCT00gZm9yIFVURi04IFhNTCBhbmQgdGV4dC8qIHR5cGVzIChpbmNsdWRpbmcgSFRNTClcbiAgLy8gbm90ZTogeW91ciBicm93c2VyIHdpbGwgYXV0b21hdGljYWxseSBjb252ZXJ0IFVURi0xNiBVK0ZFRkYgdG8gRUYgQkIgQkZcbiAgaWYgKG9wdHMuYXV0b0JvbSAmJiAvXlxccyooPzp0ZXh0XFwvXFxTKnxhcHBsaWNhdGlvblxcL3htbHxcXFMqXFwvXFxTKlxcK3htbClcXHMqOy4qY2hhcnNldFxccyo9XFxzKnV0Zi04L2kudGVzdChibG9iLnR5cGUpKSB7XG4gICAgcmV0dXJuIG5ldyBCbG9iKFtTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RkVGRiksIGJsb2JdLCB7IHR5cGU6IGJsb2IudHlwZSB9KVxuICB9XG4gIHJldHVybiBibG9iXG59XG5cbmZ1bmN0aW9uIGRvd25sb2FkICh1cmwsIG5hbWUsIG9wdHMpIHtcbiAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gIHhoci5vcGVuKCdHRVQnLCB1cmwpXG4gIHhoci5yZXNwb25zZVR5cGUgPSAnYmxvYidcbiAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBzYXZlQXMoeGhyLnJlc3BvbnNlLCBuYW1lLCBvcHRzKVxuICB9XG4gIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ2NvdWxkIG5vdCBkb3dubG9hZCBmaWxlJylcbiAgfVxuICB4aHIuc2VuZCgpXG59XG5cbmZ1bmN0aW9uIGNvcnNFbmFibGVkICh1cmwpIHtcbiAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gIC8vIHVzZSBzeW5jIHRvIGF2b2lkIHBvcHVwIGJsb2NrZXJcbiAgeGhyLm9wZW4oJ0hFQUQnLCB1cmwsIGZhbHNlKVxuICB0cnkge1xuICAgIHhoci5zZW5kKClcbiAgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPD0gMjk5XG59XG5cbi8vIGBhLmNsaWNrKClgIGRvZXNuJ3Qgd29yayBmb3IgYWxsIGJyb3dzZXJzICgjNDY1KVxuZnVuY3Rpb24gY2xpY2sgKG5vZGUpIHtcbiAgdHJ5IHtcbiAgICBub2RlLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ2NsaWNrJykpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnRzJylcbiAgICBldnQuaW5pdE1vdXNlRXZlbnQoJ2NsaWNrJywgdHJ1ZSwgdHJ1ZSwgd2luZG93LCAwLCAwLCAwLCA4MCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgMjAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwLCBudWxsKVxuICAgIG5vZGUuZGlzcGF0Y2hFdmVudChldnQpXG4gIH1cbn1cblxuLy8gRGV0ZWN0IFdlYlZpZXcgaW5zaWRlIGEgbmF0aXZlIG1hY09TIGFwcCBieSBydWxpbmcgb3V0IGFsbCBicm93c2Vyc1xuLy8gV2UganVzdCBuZWVkIHRvIGNoZWNrIGZvciAnU2FmYXJpJyBiZWNhdXNlIGFsbCBvdGhlciBicm93c2VycyAoYmVzaWRlcyBGaXJlZm94KSBpbmNsdWRlIHRoYXQgdG9vXG4vLyBodHRwczovL3d3dy53aGF0aXNteWJyb3dzZXIuY29tL2d1aWRlcy90aGUtbGF0ZXN0LXVzZXItYWdlbnQvbWFjb3NcbnZhciBpc01hY09TV2ViVmlldyA9IF9nbG9iYWwubmF2aWdhdG9yICYmIC9NYWNpbnRvc2gvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgL0FwcGxlV2ViS2l0Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmICEvU2FmYXJpLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbnZhciBzYXZlQXMgPSBfZ2xvYmFsLnNhdmVBcyB8fCAoXG4gIC8vIHByb2JhYmx5IGluIHNvbWUgd2ViIHdvcmtlclxuICAodHlwZW9mIHdpbmRvdyAhPT0gJ29iamVjdCcgfHwgd2luZG93ICE9PSBfZ2xvYmFsKVxuICAgID8gZnVuY3Rpb24gc2F2ZUFzICgpIHsgLyogbm9vcCAqLyB9XG5cbiAgLy8gVXNlIGRvd25sb2FkIGF0dHJpYnV0ZSBmaXJzdCBpZiBwb3NzaWJsZSAoIzE5MyBMdW1pYSBtb2JpbGUpIHVubGVzcyB0aGlzIGlzIGEgbWFjT1MgV2ViVmlld1xuICA6ICgnZG93bmxvYWQnIGluIEhUTUxBbmNob3JFbGVtZW50LnByb3RvdHlwZSAmJiAhaXNNYWNPU1dlYlZpZXcpXG4gID8gZnVuY3Rpb24gc2F2ZUFzIChibG9iLCBuYW1lLCBvcHRzKSB7XG4gICAgdmFyIFVSTCA9IF9nbG9iYWwuVVJMIHx8IF9nbG9iYWwud2Via2l0VVJMXG4gICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcbiAgICBuYW1lID0gbmFtZSB8fCBibG9iLm5hbWUgfHwgJ2Rvd25sb2FkJ1xuXG4gICAgYS5kb3dubG9hZCA9IG5hbWVcbiAgICBhLnJlbCA9ICdub29wZW5lcicgLy8gdGFibmFiYmluZ1xuXG4gICAgLy8gVE9ETzogZGV0ZWN0IGNocm9tZSBleHRlbnNpb25zICYgcGFja2FnZWQgYXBwc1xuICAgIC8vIGEudGFyZ2V0ID0gJ19ibGFuaydcblxuICAgIGlmICh0eXBlb2YgYmxvYiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFN1cHBvcnQgcmVndWxhciBsaW5rc1xuICAgICAgYS5ocmVmID0gYmxvYlxuICAgICAgaWYgKGEub3JpZ2luICE9PSBsb2NhdGlvbi5vcmlnaW4pIHtcbiAgICAgICAgY29yc0VuYWJsZWQoYS5ocmVmKVxuICAgICAgICAgID8gZG93bmxvYWQoYmxvYiwgbmFtZSwgb3B0cylcbiAgICAgICAgICA6IGNsaWNrKGEsIGEudGFyZ2V0ID0gJ19ibGFuaycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGljayhhKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdXBwb3J0IGJsb2JzXG4gICAgICBhLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgVVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpIH0sIDRFNCkgLy8gNDBzXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgY2xpY2soYSkgfSwgMClcbiAgICB9XG4gIH1cblxuICAvLyBVc2UgbXNTYXZlT3JPcGVuQmxvYiBhcyBhIHNlY29uZCBhcHByb2FjaFxuICA6ICdtc1NhdmVPck9wZW5CbG9iJyBpbiBuYXZpZ2F0b3JcbiAgPyBmdW5jdGlvbiBzYXZlQXMgKGJsb2IsIG5hbWUsIG9wdHMpIHtcbiAgICBuYW1lID0gbmFtZSB8fCBibG9iLm5hbWUgfHwgJ2Rvd25sb2FkJ1xuXG4gICAgaWYgKHR5cGVvZiBibG9iID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGNvcnNFbmFibGVkKGJsb2IpKSB7XG4gICAgICAgIGRvd25sb2FkKGJsb2IsIG5hbWUsIG9wdHMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgICAgICBhLmhyZWYgPSBibG9iXG4gICAgICAgIGEudGFyZ2V0ID0gJ19ibGFuaydcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGNsaWNrKGEpIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGJvbShibG9iLCBvcHRzKSwgbmFtZSlcbiAgICB9XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byB1c2luZyBGaWxlUmVhZGVyIGFuZCBhIHBvcHVwXG4gIDogZnVuY3Rpb24gc2F2ZUFzIChibG9iLCBuYW1lLCBvcHRzLCBwb3B1cCkge1xuICAgIC8vIE9wZW4gYSBwb3B1cCBpbW1lZGlhdGVseSBkbyBnbyBhcm91bmQgcG9wdXAgYmxvY2tlclxuICAgIC8vIE1vc3RseSBvbmx5IGF2YWlsYWJsZSBvbiB1c2VyIGludGVyYWN0aW9uIGFuZCB0aGUgZmlsZVJlYWRlciBpcyBhc3luYyBzby4uLlxuICAgIHBvcHVwID0gcG9wdXAgfHwgb3BlbignJywgJ19ibGFuaycpXG4gICAgaWYgKHBvcHVwKSB7XG4gICAgICBwb3B1cC5kb2N1bWVudC50aXRsZSA9XG4gICAgICBwb3B1cC5kb2N1bWVudC5ib2R5LmlubmVyVGV4dCA9ICdkb3dubG9hZGluZy4uLidcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGJsb2IgPT09ICdzdHJpbmcnKSByZXR1cm4gZG93bmxvYWQoYmxvYiwgbmFtZSwgb3B0cylcblxuICAgIHZhciBmb3JjZSA9IGJsb2IudHlwZSA9PT0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbiAgICB2YXIgaXNTYWZhcmkgPSAvY29uc3RydWN0b3IvaS50ZXN0KF9nbG9iYWwuSFRNTEVsZW1lbnQpIHx8IF9nbG9iYWwuc2FmYXJpXG4gICAgdmFyIGlzQ2hyb21lSU9TID0gL0NyaU9TXFwvW1xcZF0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbiAgICBpZiAoKGlzQ2hyb21lSU9TIHx8IChmb3JjZSAmJiBpc1NhZmFyaSkgfHwgaXNNYWNPU1dlYlZpZXcpICYmIHR5cGVvZiBGaWxlUmVhZGVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gU2FmYXJpIGRvZXNuJ3QgYWxsb3cgZG93bmxvYWRpbmcgb2YgYmxvYiBVUkxzXG4gICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHVybCA9IHJlYWRlci5yZXN1bHRcbiAgICAgICAgdXJsID0gaXNDaHJvbWVJT1MgPyB1cmwgOiB1cmwucmVwbGFjZSgvXmRhdGE6W147XSo7LywgJ2RhdGE6YXR0YWNobWVudC9maWxlOycpXG4gICAgICAgIGlmIChwb3B1cCkgcG9wdXAubG9jYXRpb24uaHJlZiA9IHVybFxuICAgICAgICBlbHNlIGxvY2F0aW9uID0gdXJsXG4gICAgICAgIHBvcHVwID0gbnVsbCAvLyByZXZlcnNlLXRhYm5hYmJpbmcgIzQ2MFxuICAgICAgfVxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYilcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIFVSTCA9IF9nbG9iYWwuVVJMIHx8IF9nbG9iYWwud2Via2l0VVJMXG4gICAgICB2YXIgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgaWYgKHBvcHVwKSBwb3B1cC5sb2NhdGlvbiA9IHVybFxuICAgICAgZWxzZSBsb2NhdGlvbi5ocmVmID0gdXJsXG4gICAgICBwb3B1cCA9IG51bGwgLy8gcmV2ZXJzZS10YWJuYWJiaW5nICM0NjBcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCkgfSwgNEU0KSAvLyA0MHNcbiAgICB9XG4gIH1cbilcblxuX2dsb2JhbC5zYXZlQXMgPSBzYXZlQXMuc2F2ZUFzID0gc2F2ZUFzXG5cbmlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHNhdmVBcztcbn1cbiIsICIvKipcbiAqIENyb3Bwci5qc1xuICogaHR0cHM6Ly9naXRodWIuY29tL2phbWVzc3Nvb2kvQ3JvcHByLmpzXG4gKiBcbiAqIEEgSmF2YVNjcmlwdCBpbWFnZSBjcm9wcGVyIHRoYXQncyBsaWdodHdlaWdodCwgYXdlc29tZSwgYW5kIGhhc1xuICogemVybyBkZXBlbmRlbmNpZXMuXG4gKiBcbiAqIChDKSAyMDE3IEphbWVzIE9vaS4gUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG5cdHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcblx0dHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcblx0KGdsb2JhbC5Dcm9wcHIgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbihmdW5jdGlvbiAoKSB7XG4gIHZhciBsYXN0VGltZSA9IDA7XG4gIHZhciB2ZW5kb3JzID0gWydtcycsICdtb3onLCAnd2Via2l0JywgJ28nXTtcbiAgZm9yICh2YXIgeCA9IDA7IHggPCB2ZW5kb3JzLmxlbmd0aCAmJiAhd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZTsgKyt4KSB7XG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHdpbmRvd1t2ZW5kb3JzW3hdICsgJ1JlcXVlc3RBbmltYXRpb25GcmFtZSddO1xuICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSA9IHdpbmRvd1t2ZW5kb3JzW3hdICsgJ0NhbmNlbEFuaW1hdGlvbkZyYW1lJ10gfHwgd2luZG93W3ZlbmRvcnNbeF0gKyAnQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lJ107XG4gIH1cbiAgaWYgKCF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBlbGVtZW50KSB7XG4gICAgdmFyIGN1cnJUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgdmFyIHRpbWVUb0NhbGwgPSBNYXRoLm1heCgwLCAxNiAtIChjdXJyVGltZSAtIGxhc3RUaW1lKSk7XG4gICAgdmFyIGlkID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2soY3VyclRpbWUgKyB0aW1lVG9DYWxsKTtcbiAgICB9LCB0aW1lVG9DYWxsKTtcbiAgICBsYXN0VGltZSA9IGN1cnJUaW1lICsgdGltZVRvQ2FsbDtcbiAgICByZXR1cm4gaWQ7XG4gIH07XG4gIGlmICghd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKSB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICBjbGVhclRpbWVvdXQoaWQpO1xuICB9O1xufSkoKTtcbihmdW5jdGlvbiAoKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBmYWxzZTtcbiAgZnVuY3Rpb24gQ3VzdG9tRXZlbnQoZXZlbnQsIHBhcmFtcykge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiBmYWxzZSwgZGV0YWlsOiB1bmRlZmluZWQgfTtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7XG4gICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudCwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsKTtcbiAgICByZXR1cm4gZXZ0O1xuICB9XG4gIEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGU7XG4gIHdpbmRvdy5DdXN0b21FdmVudCA9IEN1c3RvbUV2ZW50O1xufSkoKTtcbihmdW5jdGlvbiAod2luZG93KSB7XG4gIHRyeSB7XG4gICAgbmV3IEN1c3RvbUV2ZW50KCd0ZXN0Jyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlKSB7fVxuICBmdW5jdGlvbiBNb3VzZUV2ZW50KGV2ZW50VHlwZSwgcGFyYW1zKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHsgYnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IGZhbHNlIH07XG4gICAgdmFyIG1vdXNlRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudCcpO1xuICAgIG1vdXNlRXZlbnQuaW5pdE1vdXNlRXZlbnQoZXZlbnRUeXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUsIHdpbmRvdywgMCwgMCwgMCwgMCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsIG51bGwpO1xuICAgIHJldHVybiBtb3VzZUV2ZW50O1xuICB9XG4gIE1vdXNlRXZlbnQucHJvdG90eXBlID0gRXZlbnQucHJvdG90eXBlO1xuICB3aW5kb3cuTW91c2VFdmVudCA9IE1vdXNlRXZlbnQ7XG59KSh3aW5kb3cpO1xuXG52YXIgY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTtcblxudmFyIGNyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9O1xufSgpO1xuXG5cblxuXG5cblxuXG52YXIgZ2V0ID0gZnVuY3Rpb24gZ2V0KG9iamVjdCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gIGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbiAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpO1xuXG4gIGlmIChkZXNjID09PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7XG5cbiAgICBpZiAocGFyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0KHBhcmVudCwgcHJvcGVydHksIHJlY2VpdmVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MpIHtcbiAgICByZXR1cm4gZGVzYy52YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7XG5cbiAgICBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTtcbiAgfVxufTtcblxudmFyIGluaGVyaXRzID0gZnVuY3Rpb24gKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufTtcblxuXG5cblxuXG5cblxuXG5cblxuXG52YXIgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiA9IGZ1bmN0aW9uIChzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xufTtcblxuXG5cblxuXG52YXIgc2xpY2VkVG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsIGkpIHtcbiAgICB2YXIgX2FyciA9IFtdO1xuICAgIHZhciBfbiA9IHRydWU7XG4gICAgdmFyIF9kID0gZmFsc2U7XG4gICAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgICBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfZCA9IHRydWU7XG4gICAgICBfZSA9IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSkgX2lbXCJyZXR1cm5cIl0oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIF9hcnI7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGFyciwgaSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICAgIHJldHVybiBhcnI7XG4gICAgfSBlbHNlIGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpIHtcbiAgICAgIHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpO1xuICAgIH1cbiAgfTtcbn0oKTtcblxudmFyIEhhbmRsZSA9XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgSGFuZGxlIGluc3RhbmNlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBwb3NpdGlvbiBUaGUgeCBhbmQgeSByYXRpbyBwb3NpdGlvbiBvZiB0aGUgaGFuZGxlXG4gKiAgICAgIHdpdGhpbiB0aGUgY3JvcCByZWdpb24uIEFjY2VwdHMgYSB2YWx1ZSBiZXR3ZWVuIDAgdG8gMSBpbiB0aGUgb3JkZXJcbiAqICAgICAgb2YgW1gsIFldLlxuICogQHBhcmFtIHtBcnJheX0gY29uc3RyYWludHMgRGVmaW5lIHRoZSBzaWRlIG9mIHRoZSBjcm9wIHJlZ2lvbiB0aGF0XG4gKiAgICAgIGlzIHRvIGJlIGFmZmVjdGVkIGJ5IHRoaXMgaGFuZGxlLiBBY2NlcHRzIGEgdmFsdWUgb2YgMCBvciAxIGluIHRoZVxuICogICAgICBvcmRlciBvZiBbVE9QLCBSSUdIVCwgQk9UVE9NLCBMRUZUXS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBjdXJzb3IgVGhlIENTUyBjdXJzb3Igb2YgdGhpcyBoYW5kbGUuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGV2ZW50QnVzIFRoZSBlbGVtZW50IHRvIGRpc3BhdGNoIGV2ZW50cyB0by5cbiAqL1xuZnVuY3Rpb24gSGFuZGxlKHBvc2l0aW9uLCBjb25zdHJhaW50cywgY3Vyc29yLCBldmVudEJ1cykge1xuICBjbGFzc0NhbGxDaGVjayh0aGlzLCBIYW5kbGUpO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgdGhpcy5jb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzO1xuICB0aGlzLmN1cnNvciA9IGN1cnNvcjtcbiAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzO1xuICB0aGlzLmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHRoaXMuZWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1oYW5kbGUnO1xuICB0aGlzLmVsLnN0eWxlLmN1cnNvciA9IGN1cnNvcjtcbiAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gIGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICBzZWxmLmV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdoYW5kbGVzdGFydCcsIHtcbiAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYgfVxuICAgIH0pKTtcbiAgfVxuICBmdW5jdGlvbiBvbk1vdXNlVXAoZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZWVuZCcsIHtcbiAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYgfVxuICAgIH0pKTtcbiAgfVxuICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBzZWxmLmV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdoYW5kbGVtb3ZlJywge1xuICAgICAgZGV0YWlsOiB7IG1vdXNlWDogZS5jbGllbnRYLCBtb3VzZVk6IGUuY2xpZW50WSB9XG4gICAgfSkpO1xuICB9XG59O1xuXG52YXIgQm94ID0gZnVuY3Rpb24gKCkge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBCb3ggaW5zdGFuY2UuXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge051bWJlcn0geDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHkxXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB4MlxuICAgKiBAcGFyYW0ge051bWJlcn0geTJcbiAgICovXG4gIGZ1bmN0aW9uIEJveCh4MSwgeTEsIHgyLCB5Mikge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEJveCk7XG4gICAgdGhpcy54MSA9IHgxO1xuICAgIHRoaXMueTEgPSB5MTtcbiAgICB0aGlzLngyID0geDI7XG4gICAgdGhpcy55MiA9IHkyO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBuZXcgZGltZW5zaW9ucyBvZiB0aGUgYm94LlxuICAgKiBAcGFyYW0ge051bWJlcn0geDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHkxXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB4MlxuICAgKiBAcGFyYW0ge051bWJlcn0geTJcbiAgICovXG4gIGNyZWF0ZUNsYXNzKEJveCwgW3tcbiAgICBrZXk6ICdzZXQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQkJDEoKSB7XG4gICAgICB2YXIgeDEgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgICB2YXIgeTEgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICB2YXIgeDIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG4gICAgICB2YXIgeTIgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gICAgICB0aGlzLngxID0geDEgPT0gbnVsbCA/IHRoaXMueDEgOiB4MTtcbiAgICAgIHRoaXMueTEgPSB5MSA9PSBudWxsID8gdGhpcy55MSA6IHkxO1xuICAgICAgdGhpcy54MiA9IHgyID09IG51bGwgPyB0aGlzLngyIDogeDI7XG4gICAgICB0aGlzLnkyID0geTIgPT0gbnVsbCA/IHRoaXMueTIgOiB5MjtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSB3aWR0aCBvZiB0aGUgYm94LlxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICd3aWR0aCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHdpZHRoKCkge1xuICAgICAgcmV0dXJuIE1hdGguYWJzKHRoaXMueDIgLSB0aGlzLngxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgaGVpZ2h0IG9mIHRoZSBib3guXG4gICAgICogQHJldHVybnMge051bWJlcn1cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ2hlaWdodCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhlaWdodCgpIHtcbiAgICAgIHJldHVybiBNYXRoLmFicyh0aGlzLnkyIC0gdGhpcy55MSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2l6ZXMgdGhlIGJveCB0byBhIG5ldyBzaXplLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBuZXdXaWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBuZXdIZWlnaHRcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbb3JpZ2luXSBUaGUgb3JpZ2luIHBvaW50IHRvIHJlc2l6ZSBmcm9tLlxuICAgICAqICAgICAgRGVmYXVsdHMgdG8gWzAsIDBdICh0b3AgbGVmdCkuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdyZXNpemUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCkge1xuICAgICAgdmFyIG9yaWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogWzAsIDBdO1xuICAgICAgdmFyIGZyb21YID0gdGhpcy54MSArIHRoaXMud2lkdGgoKSAqIG9yaWdpblswXTtcbiAgICAgIHZhciBmcm9tWSA9IHRoaXMueTEgKyB0aGlzLmhlaWdodCgpICogb3JpZ2luWzFdO1xuICAgICAgdGhpcy54MSA9IGZyb21YIC0gbmV3V2lkdGggKiBvcmlnaW5bMF07XG4gICAgICB0aGlzLnkxID0gZnJvbVkgLSBuZXdIZWlnaHQgKiBvcmlnaW5bMV07XG4gICAgICB0aGlzLngyID0gdGhpcy54MSArIG5ld1dpZHRoO1xuICAgICAgdGhpcy55MiA9IHRoaXMueTEgKyBuZXdIZWlnaHQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2NhbGUgdGhlIGJveCBieSBhIGZhY3Rvci5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZmFjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW29yaWdpbl0gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnc2NhbGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzY2FsZShmYWN0b3IpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFswLCAwXTtcbiAgICAgIHZhciBuZXdXaWR0aCA9IHRoaXMud2lkdGgoKSAqIGZhY3RvcjtcbiAgICAgIHZhciBuZXdIZWlnaHQgPSB0aGlzLmhlaWdodCgpICogZmFjdG9yO1xuICAgICAgdGhpcy5yZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ21vdmUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtb3ZlKCkge1xuICAgICAgdmFyIHggPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgICB2YXIgeSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKTtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodCgpO1xuICAgICAgeCA9IHggPT09IG51bGwgPyB0aGlzLngxIDogeDtcbiAgICAgIHkgPSB5ID09PSBudWxsID8gdGhpcy55MSA6IHk7XG4gICAgICB0aGlzLngxID0geDtcbiAgICAgIHRoaXMueTEgPSB5O1xuICAgICAgdGhpcy54MiA9IHggKyB3aWR0aDtcbiAgICAgIHRoaXMueTIgPSB5ICsgaGVpZ2h0O1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCByZWxhdGl2ZSB4IGFuZCB5IGNvb3JkaW5hdGVzIG9mIGEgZ2l2ZW4gcG9pbnQgd2l0aGluIHRoZSBib3guXG4gICAgICogQHBhcmFtIHtBcnJheX0gcG9pbnQgVGhlIHggYW5kIHkgcmF0aW8gcG9zaXRpb24gd2l0aGluIHRoZSBib3guXG4gICAgICogQHJldHVybnMge0FycmF5fSBUaGUgeCBhbmQgeSBjb29yZGluYXRlcyBbeCwgeV0uXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdnZXRSZWxhdGl2ZVBvaW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmVsYXRpdmVQb2ludCgpIHtcbiAgICAgIHZhciBwb2ludCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogWzAsIDBdO1xuICAgICAgdmFyIHggPSB0aGlzLndpZHRoKCkgKiBwb2ludFswXTtcbiAgICAgIHZhciB5ID0gdGhpcy5oZWlnaHQoKSAqIHBvaW50WzFdO1xuICAgICAgcmV0dXJuIFt4LCB5XTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGFic29sdXRlIHggYW5kIHkgY29vcmRpbmF0ZXMgb2YgYSBnaXZlbiBwb2ludCB3aXRoaW4gdGhlIGJveC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwb2ludCBUaGUgeCBhbmQgeSByYXRpbyBwb3NpdGlvbiB3aXRoaW4gdGhlIGJveC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSB4IGFuZCB5IGNvb3JkaW5hdGVzIFt4LCB5XS5cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ2dldEFic29sdXRlUG9pbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBYnNvbHV0ZVBvaW50KCkge1xuICAgICAgdmFyIHBvaW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbMCwgMF07XG4gICAgICB2YXIgeCA9IHRoaXMueDEgKyB0aGlzLndpZHRoKCkgKiBwb2ludFswXTtcbiAgICAgIHZhciB5ID0gdGhpcy55MSArIHRoaXMuaGVpZ2h0KCkgKiBwb2ludFsxXTtcbiAgICAgIHJldHVybiBbeCwgeV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cmFpbiB0aGUgYm94IHRvIGEgZml4ZWQgcmF0aW8uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHJhdGlvXG4gICAgICogQHBhcmFtIHtBcnJheX0gW29yaWdpbl0gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgRGVmYXVsdHMgdG8gWzAsIDBdICh0b3AgbGVmdCkuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtncm93XSBUaGUgYXhpcyB0byBncm93IHRvIG1haW50YWluIHRoZSByYXRpby5cbiAgICAgKiAgICAgRGVmYXVsdHMgdG8gJ2hlaWdodCcuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdjb25zdHJhaW5Ub1JhdGlvJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uc3RyYWluVG9SYXRpbyhyYXRpbykge1xuICAgICAgdmFyIG9yaWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogWzAsIDBdO1xuICAgICAgdmFyIGdyb3cgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6ICdoZWlnaHQnO1xuICAgICAgaWYgKHJhdGlvID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKTtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodCgpO1xuICAgICAgc3dpdGNoIChncm93KSB7XG4gICAgICAgIGNhc2UgJ2hlaWdodCc6XG4gICAgICAgICAgdGhpcy5yZXNpemUodGhpcy53aWR0aCgpLCB0aGlzLndpZHRoKCkgKiByYXRpbywgb3JpZ2luKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd2lkdGgnOlxuICAgICAgICAgIHRoaXMucmVzaXplKHRoaXMuaGVpZ2h0KCkgKiAxIC8gcmF0aW8sIHRoaXMuaGVpZ2h0KCksIG9yaWdpbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5yZXNpemUodGhpcy53aWR0aCgpLCB0aGlzLndpZHRoKCkgKiByYXRpbywgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJhaW4gdGhlIGJveCB3aXRoaW4gYSBib3VuZGFyeS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYm91bmRhcnlXaWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBib3VuZGFyeUhlaWdodFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtvcmlnaW5dIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnY29uc3RyYWluVG9Cb3VuZGFyeScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbnN0cmFpblRvQm91bmRhcnkoYm91bmRhcnlXaWR0aCwgYm91bmRhcnlIZWlnaHQpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IFswLCAwXTtcbiAgICAgIHZhciBfZ2V0QWJzb2x1dGVQb2ludCA9IHRoaXMuZ2V0QWJzb2x1dGVQb2ludChvcmlnaW4pLFxuICAgICAgICAgIF9nZXRBYnNvbHV0ZVBvaW50MiA9IHNsaWNlZFRvQXJyYXkoX2dldEFic29sdXRlUG9pbnQsIDIpLFxuICAgICAgICAgIG9yaWdpblggPSBfZ2V0QWJzb2x1dGVQb2ludDJbMF0sXG4gICAgICAgICAgb3JpZ2luWSA9IF9nZXRBYnNvbHV0ZVBvaW50MlsxXTtcbiAgICAgIHZhciBtYXhJZkxlZnQgPSBvcmlnaW5YO1xuICAgICAgdmFyIG1heElmVG9wID0gb3JpZ2luWTtcbiAgICAgIHZhciBtYXhJZlJpZ2h0ID0gYm91bmRhcnlXaWR0aCAtIG9yaWdpblg7XG4gICAgICB2YXIgbWF4SWZCb3R0b20gPSBib3VuZGFyeUhlaWdodCAtIG9yaWdpblk7XG4gICAgICB2YXIgZGlyZWN0aW9uWCA9IC0yICogb3JpZ2luWzBdICsgMTtcbiAgICAgIHZhciBkaXJlY3Rpb25ZID0gLTIgKiBvcmlnaW5bMV0gKyAxO1xuICAgICAgdmFyIG1heFdpZHRoID0gbnVsbCxcbiAgICAgICAgICBtYXhIZWlnaHQgPSBudWxsO1xuICAgICAgc3dpdGNoIChkaXJlY3Rpb25YKSB7XG4gICAgICAgIGNhc2UgLTE6XG4gICAgICAgICAgbWF4V2lkdGggPSBtYXhJZkxlZnQ7YnJlYWs7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWluKG1heElmTGVmdCwgbWF4SWZSaWdodCkgKiAyO2JyZWFrO1xuICAgICAgICBjYXNlICsxOlxuICAgICAgICAgIG1heFdpZHRoID0gbWF4SWZSaWdodDticmVhaztcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoZGlyZWN0aW9uWSkge1xuICAgICAgICBjYXNlIC0xOlxuICAgICAgICAgIG1heEhlaWdodCA9IG1heElmVG9wO2JyZWFrO1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5taW4obWF4SWZUb3AsIG1heElmQm90dG9tKSAqIDI7YnJlYWs7XG4gICAgICAgIGNhc2UgKzE6XG4gICAgICAgICAgbWF4SGVpZ2h0ID0gbWF4SWZCb3R0b207YnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy53aWR0aCgpID4gbWF4V2lkdGgpIHtcbiAgICAgICAgdmFyIGZhY3RvciA9IG1heFdpZHRoIC8gdGhpcy53aWR0aCgpO1xuICAgICAgICB0aGlzLnNjYWxlKGZhY3Rvciwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmhlaWdodCgpID4gbWF4SGVpZ2h0KSB7XG4gICAgICAgIHZhciBfZmFjdG9yID0gbWF4SGVpZ2h0IC8gdGhpcy5oZWlnaHQoKTtcbiAgICAgICAgdGhpcy5zY2FsZShfZmFjdG9yLCBvcmlnaW4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cmFpbiB0aGUgYm94IHRvIGEgbWF4aW11bS9taW5pbXVtIHNpemUuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFttYXhXaWR0aF1cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW21heEhlaWdodF1cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW21pbldpZHRoXVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbbWluSGVpZ2h0XVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtvcmlnaW5dIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbcmF0aW9dIFJhdGlvIHRvIG1haW50YWluLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnY29uc3RyYWluVG9TaXplJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uc3RyYWluVG9TaXplKCkge1xuICAgICAgdmFyIG1heFdpZHRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBudWxsO1xuICAgICAgdmFyIG1heEhlaWdodCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgIHZhciBtaW5XaWR0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcbiAgICAgIHZhciBtaW5IZWlnaHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gICAgICB2YXIgb3JpZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiBbMCwgMF07XG4gICAgICB2YXIgcmF0aW8gPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IG51bGw7XG4gICAgICBpZiAocmF0aW8pIHtcbiAgICAgICAgaWYgKHJhdGlvID4gMSkge1xuICAgICAgICAgIG1heFdpZHRoID0gbWF4SGVpZ2h0ICogMSAvIHJhdGlvO1xuICAgICAgICAgIG1pbkhlaWdodCA9IG1pbkhlaWdodCAqIHJhdGlvO1xuICAgICAgICB9IGVsc2UgaWYgKHJhdGlvIDwgMSkge1xuICAgICAgICAgIG1heEhlaWdodCA9IG1heFdpZHRoICogcmF0aW87XG4gICAgICAgICAgbWluV2lkdGggPSBtaW5IZWlnaHQgKiAxIC8gcmF0aW87XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtYXhXaWR0aCAmJiB0aGlzLndpZHRoKCkgPiBtYXhXaWR0aCkge1xuICAgICAgICB2YXIgbmV3V2lkdGggPSBtYXhXaWR0aCxcbiAgICAgICAgICAgIG5ld0hlaWdodCA9IHJhdGlvID09PSBudWxsID8gdGhpcy5oZWlnaHQoKSA6IG1heEhlaWdodDtcbiAgICAgICAgdGhpcy5yZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhIZWlnaHQgJiYgdGhpcy5oZWlnaHQoKSA+IG1heEhlaWdodCkge1xuICAgICAgICB2YXIgX25ld1dpZHRoID0gcmF0aW8gPT09IG51bGwgPyB0aGlzLndpZHRoKCkgOiBtYXhXaWR0aCxcbiAgICAgICAgICAgIF9uZXdIZWlnaHQgPSBtYXhIZWlnaHQ7XG4gICAgICAgIHRoaXMucmVzaXplKF9uZXdXaWR0aCwgX25ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmIChtaW5XaWR0aCAmJiB0aGlzLndpZHRoKCkgPCBtaW5XaWR0aCkge1xuICAgICAgICB2YXIgX25ld1dpZHRoMiA9IG1pbldpZHRoLFxuICAgICAgICAgICAgX25ld0hlaWdodDIgPSByYXRpbyA9PT0gbnVsbCA/IHRoaXMuaGVpZ2h0KCkgOiBtaW5IZWlnaHQ7XG4gICAgICAgIHRoaXMucmVzaXplKF9uZXdXaWR0aDIsIF9uZXdIZWlnaHQyLCBvcmlnaW4pO1xuICAgICAgfVxuICAgICAgaWYgKG1pbkhlaWdodCAmJiB0aGlzLmhlaWdodCgpIDwgbWluSGVpZ2h0KSB7XG4gICAgICAgIHZhciBfbmV3V2lkdGgzID0gcmF0aW8gPT09IG51bGwgPyB0aGlzLndpZHRoKCkgOiBtaW5XaWR0aCxcbiAgICAgICAgICAgIF9uZXdIZWlnaHQzID0gbWluSGVpZ2h0O1xuICAgICAgICB0aGlzLnJlc2l6ZShfbmV3V2lkdGgzLCBfbmV3SGVpZ2h0Mywgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQm94O1xufSgpO1xuXG4vKipcbiAqIEJpbmRzIGFuIGVsZW1lbnQncyB0b3VjaCBldmVudHMgdG8gYmUgc2ltdWxhdGVkIGFzIG1vdXNlIGV2ZW50cy5cbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICovXG5mdW5jdGlvbiBlbmFibGVUb3VjaChlbGVtZW50KSB7XG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHNpbXVsYXRlTW91c2VFdmVudCk7XG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBzaW11bGF0ZU1vdXNlRXZlbnQpO1xuICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHNpbXVsYXRlTW91c2VFdmVudCk7XG59XG4vKipcbiAqIFRyYW5zbGF0ZXMgYSB0b3VjaCBldmVudCB0byBhIG1vdXNlIGV2ZW50LlxuICogQHBhcmFtIHtFdmVudH0gZVxuICovXG5mdW5jdGlvbiBzaW11bGF0ZU1vdXNlRXZlbnQoZSkge1xuICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIHZhciB0b3VjaCA9IGUuY2hhbmdlZFRvdWNoZXNbMF07XG4gIHZhciBldmVudE1hcCA9IHtcbiAgICAndG91Y2hzdGFydCc6ICdtb3VzZWRvd24nLFxuICAgICd0b3VjaG1vdmUnOiAnbW91c2Vtb3ZlJyxcbiAgICAndG91Y2hlbmQnOiAnbW91c2V1cCdcbiAgfTtcbiAgdG91Y2gudGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoZXZlbnRNYXBbZS50eXBlXSwge1xuICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICB2aWV3OiB3aW5kb3csXG4gICAgY2xpZW50WDogdG91Y2guY2xpZW50WCxcbiAgICBjbGllbnRZOiB0b3VjaC5jbGllbnRZLFxuICAgIHNjcmVlblg6IHRvdWNoLnNjcmVlblgsXG4gICAgc2NyZWVuWTogdG91Y2guc2NyZWVuWVxuICB9KSk7XG59XG5cbi8qKlxuICogRGVmaW5lIGEgbGlzdCBvZiBoYW5kbGVzIHRvIGNyZWF0ZS5cbiAqXG4gKiBAcHJvcGVydHkge0FycmF5fSBwb3NpdGlvbiAtIFRoZSB4IGFuZCB5IHJhdGlvIHBvc2l0aW9uIG9mIHRoZSBoYW5kbGUgd2l0aGluXG4gKiAgICAgIHRoZSBjcm9wIHJlZ2lvbi4gQWNjZXB0cyBhIHZhbHVlIGJldHdlZW4gMCB0byAxIGluIHRoZSBvcmRlciBvZiBbWCwgWV0uXG4gKiBAcHJvcGVydHkge0FycmF5fSBjb25zdHJhaW50cyAtIERlZmluZSB0aGUgc2lkZSBvZiB0aGUgY3JvcCByZWdpb24gdGhhdCBpcyB0b1xuICogICAgICBiZSBhZmZlY3RlZCBieSB0aGlzIGhhbmRsZS4gQWNjZXB0cyBhIHZhbHVlIG9mIDAgb3IgMSBpbiB0aGUgb3JkZXIgb2ZcbiAqICAgICAgW1RPUCwgUklHSFQsIEJPVFRPTSwgTEVGVF0uXG4gKiBAcHJvcGVydHkge1N0cmluZ30gY3Vyc29yIC0gVGhlIENTUyBjdXJzb3Igb2YgdGhpcyBoYW5kbGUuXG4gKi9cbnZhciBIQU5ETEVTID0gW3sgcG9zaXRpb246IFswLjAsIDAuMF0sIGNvbnN0cmFpbnRzOiBbMSwgMCwgMCwgMV0sIGN1cnNvcjogJ253LXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuNSwgMC4wXSwgY29uc3RyYWludHM6IFsxLCAwLCAwLCAwXSwgY3Vyc29yOiAnbi1yZXNpemUnIH0sIHsgcG9zaXRpb246IFsxLjAsIDAuMF0sIGNvbnN0cmFpbnRzOiBbMSwgMSwgMCwgMF0sIGN1cnNvcjogJ25lLXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzEuMCwgMC41XSwgY29uc3RyYWludHM6IFswLCAxLCAwLCAwXSwgY3Vyc29yOiAnZS1yZXNpemUnIH0sIHsgcG9zaXRpb246IFsxLjAsIDEuMF0sIGNvbnN0cmFpbnRzOiBbMCwgMSwgMSwgMF0sIGN1cnNvcjogJ3NlLXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuNSwgMS4wXSwgY29uc3RyYWludHM6IFswLCAwLCAxLCAwXSwgY3Vyc29yOiAncy1yZXNpemUnIH0sIHsgcG9zaXRpb246IFswLjAsIDEuMF0sIGNvbnN0cmFpbnRzOiBbMCwgMCwgMSwgMV0sIGN1cnNvcjogJ3N3LXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuMCwgMC41XSwgY29uc3RyYWludHM6IFswLCAwLCAwLCAxXSwgY3Vyc29yOiAndy1yZXNpemUnIH1dO1xudmFyIENyb3BwckNvcmUgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENyb3BwckNvcmUoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdmFyIGRlZmVycmVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDcm9wcHJDb3JlKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBDcm9wcHJDb3JlLnBhcnNlT3B0aW9ucyhvcHRpb25zIHx8IHt9KTtcbiAgICBpZiAoIWVsZW1lbnQubm9kZU5hbWUpIHtcbiAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyAnVW5hYmxlIHRvIGZpbmQgZWxlbWVudC4nO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzcmMnKSkge1xuICAgICAgdGhyb3cgJ0ltYWdlIHNyYyBub3QgcHJvdmlkZWQuJztcbiAgICB9XG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZXN0b3JlID0ge1xuICAgICAgcGFyZW50OiBlbGVtZW50LnBhcmVudE5vZGUsXG4gICAgICBlbGVtZW50OiBlbGVtZW50XG4gICAgfTtcbiAgICBpZiAoIWRlZmVycmVkKSB7XG4gICAgICBpZiAoZWxlbWVudC53aWR0aCA9PT0gMCB8fCBlbGVtZW50LmhlaWdodCA9PT0gMCkge1xuICAgICAgICBlbGVtZW50Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpcy5pbml0aWFsaXplKGVsZW1lbnQpO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjcmVhdGVDbGFzcyhDcm9wcHJDb3JlLCBbe1xuICAgIGtleTogJ2luaXRpYWxpemUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0aWFsaXplKGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuY3JlYXRlRE9NKGVsZW1lbnQpO1xuICAgICAgdGhpcy5vcHRpb25zLmNvbnZlcnRUb1BpeGVscyh0aGlzLmNyb3BwZXJFbCk7XG4gICAgICB0aGlzLmF0dGFjaEhhbmRsZXJFdmVudHMoKTtcbiAgICAgIHRoaXMuYXR0YWNoUmVnaW9uRXZlbnRzKCk7XG4gICAgICB0aGlzLmF0dGFjaE92ZXJsYXlFdmVudHMoKTtcbiAgICAgIHRoaXMuYm94ID0gdGhpcy5pbml0aWFsaXplQm94KHRoaXMub3B0aW9ucyk7XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkluaXRpYWxpemUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uSW5pdGlhbGl6ZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjcmVhdGVET00nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVET00odGFyZ2V0RWwpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMuY29udGFpbmVyRWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1jb250YWluZXInO1xuICAgICAgdGhpcy5ldmVudEJ1cyA9IHRoaXMuY29udGFpbmVyRWw7XG4gICAgICBlbmFibGVUb3VjaCh0aGlzLmNvbnRhaW5lckVsKTtcbiAgICAgIHRoaXMuY3JvcHBlckVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aGlzLmNyb3BwZXJFbC5jbGFzc05hbWUgPSAnY3JvcHByJztcbiAgICAgIHRoaXMuaW1hZ2VFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgdGhpcy5pbWFnZUVsLnNldEF0dHJpYnV0ZSgnc3JjJywgdGFyZ2V0RWwuZ2V0QXR0cmlidXRlKCdzcmMnKSk7XG4gICAgICB0aGlzLmltYWdlRWwuc2V0QXR0cmlidXRlKCdhbHQnLCB0YXJnZXRFbC5nZXRBdHRyaWJ1dGUoJ2FsdCcpKTtcbiAgICAgIHRoaXMuaW1hZ2VFbC5jbGFzc05hbWUgPSAnY3JvcHByLWltYWdlJztcbiAgICAgIHRoaXMuaW1hZ2VDbGlwcGVkRWwgPSB0aGlzLmltYWdlRWwuY2xvbmVOb2RlKCk7XG4gICAgICB0aGlzLmltYWdlQ2xpcHBlZEVsLmNsYXNzTmFtZSA9ICdjcm9wcHItaW1hZ2VDbGlwcGVkJztcbiAgICAgIHRoaXMucmVnaW9uRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMucmVnaW9uRWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1yZWdpb24nO1xuICAgICAgdGhpcy5vdmVybGF5RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMub3ZlcmxheUVsLmNsYXNzTmFtZSA9ICdjcm9wcHItb3ZlcmxheSc7XG4gICAgICB2YXIgaGFuZGxlQ29udGFpbmVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGhhbmRsZUNvbnRhaW5lckVsLmNsYXNzTmFtZSA9ICdjcm9wcHItaGFuZGxlQ29udGFpbmVyJztcbiAgICAgIHRoaXMuaGFuZGxlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBIQU5ETEVTLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBoYW5kbGUgPSBuZXcgSGFuZGxlKEhBTkRMRVNbaV0ucG9zaXRpb24sIEhBTkRMRVNbaV0uY29uc3RyYWludHMsIEhBTkRMRVNbaV0uY3Vyc29yLCB0aGlzLmV2ZW50QnVzKTtcbiAgICAgICAgdGhpcy5oYW5kbGVzLnB1c2goaGFuZGxlKTtcbiAgICAgICAgaGFuZGxlQ29udGFpbmVyRWwuYXBwZW5kQ2hpbGQoaGFuZGxlLmVsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3JvcHBlckVsLmFwcGVuZENoaWxkKHRoaXMuaW1hZ2VFbCk7XG4gICAgICB0aGlzLmNyb3BwZXJFbC5hcHBlbmRDaGlsZCh0aGlzLmltYWdlQ2xpcHBlZEVsKTtcbiAgICAgIHRoaXMuY3JvcHBlckVsLmFwcGVuZENoaWxkKHRoaXMucmVnaW9uRWwpO1xuICAgICAgdGhpcy5jcm9wcGVyRWwuYXBwZW5kQ2hpbGQodGhpcy5vdmVybGF5RWwpO1xuICAgICAgdGhpcy5jcm9wcGVyRWwuYXBwZW5kQ2hpbGQoaGFuZGxlQ29udGFpbmVyRWwpO1xuICAgICAgdGhpcy5jb250YWluZXJFbC5hcHBlbmRDaGlsZCh0aGlzLmNyb3BwZXJFbCk7XG4gICAgICB0YXJnZXRFbC5wYXJlbnRFbGVtZW50LnJlcGxhY2VDaGlsZCh0aGlzLmNvbnRhaW5lckVsLCB0YXJnZXRFbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGltYWdlIHNyYy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3JjXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdzZXRJbWFnZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEltYWdlKHNyYykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG4gICAgICB0aGlzLmltYWdlRWwub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczIuYm94ID0gX3RoaXMyLmluaXRpYWxpemVCb3goX3RoaXMyLm9wdGlvbnMpO1xuICAgICAgICBfdGhpczIucmVkcmF3KCk7XG4gICAgICB9O1xuICAgICAgdGhpcy5pbWFnZUVsLnNyYyA9IHNyYztcbiAgICAgIHRoaXMuaW1hZ2VDbGlwcGVkRWwuc3JjID0gc3JjO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZGVzdHJveScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLl9yZXN0b3JlLnBhcmVudC5yZXBsYWNlQ2hpbGQodGhpcy5fcmVzdG9yZS5lbGVtZW50LCB0aGlzLmNvbnRhaW5lckVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGJveCByZWdpb24gd2l0aCBhIHNldCBvZiBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIFRoZSBvcHRpb25zLlxuICAgICAqIEByZXR1cm5zIHtCb3h9XG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdpbml0aWFsaXplQm94JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZUJveChvcHRzKSB7XG4gICAgICB2YXIgd2lkdGggPSBvcHRzLnN0YXJ0U2l6ZS53aWR0aDtcbiAgICAgIHZhciBoZWlnaHQgPSBvcHRzLnN0YXJ0U2l6ZS5oZWlnaHQ7XG4gICAgICB2YXIgYm94ID0gbmV3IEJveCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIGJveC5jb25zdHJhaW5Ub1JhdGlvKG9wdHMuYXNwZWN0UmF0aW8sIFswLjUsIDAuNV0pO1xuICAgICAgdmFyIG1pbiA9IG9wdHMubWluU2l6ZTtcbiAgICAgIHZhciBtYXggPSBvcHRzLm1heFNpemU7XG4gICAgICBib3guY29uc3RyYWluVG9TaXplKG1heC53aWR0aCwgbWF4LmhlaWdodCwgbWluLndpZHRoLCBtaW4uaGVpZ2h0LCBbMC41LCAwLjVdLCBvcHRzLmFzcGVjdFJhdGlvKTtcbiAgICAgIHZhciBwYXJlbnRXaWR0aCA9IHRoaXMuY3JvcHBlckVsLm9mZnNldFdpZHRoO1xuICAgICAgdmFyIHBhcmVudEhlaWdodCA9IHRoaXMuY3JvcHBlckVsLm9mZnNldEhlaWdodDtcbiAgICAgIGJveC5jb25zdHJhaW5Ub0JvdW5kYXJ5KHBhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHQsIFswLjUsIDAuNV0pO1xuICAgICAgdmFyIHggPSB0aGlzLmNyb3BwZXJFbC5vZmZzZXRXaWR0aCAvIDIgLSBib3gud2lkdGgoKSAvIDI7XG4gICAgICB2YXIgeSA9IHRoaXMuY3JvcHBlckVsLm9mZnNldEhlaWdodCAvIDIgLSBib3guaGVpZ2h0KCkgLyAyO1xuICAgICAgYm94Lm1vdmUoeCwgeSk7XG4gICAgICByZXR1cm4gYm94O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3JlZHJhdycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlZHJhdygpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuICAgICAgdmFyIHdpZHRoID0gTWF0aC5yb3VuZCh0aGlzLmJveC53aWR0aCgpKSxcbiAgICAgICAgICBoZWlnaHQgPSBNYXRoLnJvdW5kKHRoaXMuYm94LmhlaWdodCgpKSxcbiAgICAgICAgICB4MSA9IE1hdGgucm91bmQodGhpcy5ib3gueDEpLFxuICAgICAgICAgIHkxID0gTWF0aC5yb3VuZCh0aGlzLmJveC55MSksXG4gICAgICAgICAgeDIgPSBNYXRoLnJvdW5kKHRoaXMuYm94LngyKSxcbiAgICAgICAgICB5MiA9IE1hdGgucm91bmQodGhpcy5ib3gueTIpO1xuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMy5yZWdpb25FbC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKCcgKyB4MSArICdweCwgJyArIHkxICsgJ3B4KSc7XG4gICAgICAgIF90aGlzMy5yZWdpb25FbC5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICAgICAgX3RoaXMzLnJlZ2lvbkVsLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gICAgICAgIF90aGlzMy5pbWFnZUNsaXBwZWRFbC5zdHlsZS5jbGlwID0gJ3JlY3QoJyArIHkxICsgJ3B4LCAnICsgeDIgKyAncHgsICcgKyB5MiArICdweCwgJyArIHgxICsgJ3B4KSc7XG4gICAgICAgIHZhciBjZW50ZXIgPSBfdGhpczMuYm94LmdldEFic29sdXRlUG9pbnQoWy41LCAuNV0pO1xuICAgICAgICB2YXIgeFNpZ24gPSBjZW50ZXJbMF0gLSBfdGhpczMuY3JvcHBlckVsLm9mZnNldFdpZHRoIC8gMiA+PiAzMTtcbiAgICAgICAgdmFyIHlTaWduID0gY2VudGVyWzFdIC0gX3RoaXMzLmNyb3BwZXJFbC5vZmZzZXRIZWlnaHQgLyAyID4+IDMxO1xuICAgICAgICB2YXIgcXVhZHJhbnQgPSAoeFNpZ24gXiB5U2lnbikgKyB5U2lnbiArIHlTaWduICsgNDtcbiAgICAgICAgdmFyIGZvcmVncm91bmRIYW5kbGVJbmRleCA9IC0yICogcXVhZHJhbnQgKyA4O1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF90aGlzMy5oYW5kbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGhhbmRsZSA9IF90aGlzMy5oYW5kbGVzW2ldO1xuICAgICAgICAgIHZhciBoYW5kbGVXaWR0aCA9IGhhbmRsZS5lbC5vZmZzZXRXaWR0aDtcbiAgICAgICAgICB2YXIgaGFuZGxlSGVpZ2h0ID0gaGFuZGxlLmVsLm9mZnNldEhlaWdodDtcbiAgICAgICAgICB2YXIgbGVmdCA9IHgxICsgd2lkdGggKiBoYW5kbGUucG9zaXRpb25bMF0gLSBoYW5kbGVXaWR0aCAvIDI7XG4gICAgICAgICAgdmFyIHRvcCA9IHkxICsgaGVpZ2h0ICogaGFuZGxlLnBvc2l0aW9uWzFdIC0gaGFuZGxlSGVpZ2h0IC8gMjtcbiAgICAgICAgICBoYW5kbGUuZWwuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgnICsgTWF0aC5yb3VuZChsZWZ0KSArICdweCwgJyArIE1hdGgucm91bmQodG9wKSArICdweCknO1xuICAgICAgICAgIGhhbmRsZS5lbC5zdHlsZS56SW5kZXggPSBmb3JlZ3JvdW5kSGFuZGxlSW5kZXggPT0gaSA/IDUgOiA0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdhdHRhY2hIYW5kbGVyRXZlbnRzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXR0YWNoSGFuZGxlckV2ZW50cygpIHtcbiAgICAgIHZhciBldmVudEJ1cyA9IHRoaXMuZXZlbnRCdXM7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVzdGFydCcsIHRoaXMub25IYW5kbGVNb3ZlU3RhcnQuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVtb3ZlJywgdGhpcy5vbkhhbmRsZU1vdmVNb3ZpbmcuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVlbmQnLCB0aGlzLm9uSGFuZGxlTW92ZUVuZC5iaW5kKHRoaXMpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdhdHRhY2hSZWdpb25FdmVudHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhdHRhY2hSZWdpb25FdmVudHMoKSB7XG4gICAgICB2YXIgZXZlbnRCdXMgPSB0aGlzLmV2ZW50QnVzO1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdGhpcy5yZWdpb25FbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25zdGFydCcsIHRoaXMub25SZWdpb25Nb3ZlU3RhcnQuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25tb3ZlJywgdGhpcy5vblJlZ2lvbk1vdmVNb3ZpbmcuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25lbmQnLCB0aGlzLm9uUmVnaW9uTW92ZUVuZC5iaW5kKHRoaXMpKTtcbiAgICAgIGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICAgICAgZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3JlZ2lvbnN0YXJ0Jywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdyZWdpb25tb3ZlJywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlVXAoZSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgICAgICBldmVudEJ1cy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgncmVnaW9uZW5kJywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnYXR0YWNoT3ZlcmxheUV2ZW50cycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGF0dGFjaE92ZXJsYXlFdmVudHMoKSB7XG4gICAgICB2YXIgU09VVEhFQVNUX0hBTkRMRV9JRFggPSA0O1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHRtcEJveCA9IG51bGw7XG4gICAgICB0aGlzLm92ZXJsYXlFbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgIHZhciBjb250YWluZXIgPSBzZWxmLmNyb3BwZXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdmFyIG1vdXNlWCA9IGUuY2xpZW50WCAtIGNvbnRhaW5lci5sZWZ0O1xuICAgICAgICB2YXIgbW91c2VZID0gZS5jbGllbnRZIC0gY29udGFpbmVyLnRvcDtcbiAgICAgICAgdG1wQm94ID0gc2VsZi5ib3g7XG4gICAgICAgIHNlbGYuYm94ID0gbmV3IEJveChtb3VzZVgsIG1vdXNlWSwgbW91c2VYICsgMSwgbW91c2VZICsgMSk7XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZXN0YXJ0Jywge1xuICAgICAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYuaGFuZGxlc1tTT1VUSEVBU1RfSEFORExFX0lEWF0gfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZW1vdmUnLCB7XG4gICAgICAgICAgZGV0YWlsOiB7IG1vdXNlWDogZS5jbGllbnRYLCBtb3VzZVk6IGUuY2xpZW50WSB9XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIG9uTW91c2VVcChlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgIGlmIChzZWxmLmJveC53aWR0aCgpID09PSAxICYmIHNlbGYuYm94LmhlaWdodCgpID09PSAxKSB7XG4gICAgICAgICAgc2VsZi5ib3ggPSB0bXBCb3g7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZWVuZCcsIHtcbiAgICAgICAgICBkZXRhaWw6IHsgbW91c2VYOiBlLmNsaWVudFgsIG1vdXNlWTogZS5jbGllbnRZIH1cbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uSGFuZGxlTW92ZVN0YXJ0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25IYW5kbGVNb3ZlU3RhcnQoZSkge1xuICAgICAgdmFyIGhhbmRsZSA9IGUuZGV0YWlsLmhhbmRsZTtcbiAgICAgIHZhciBvcmlnaW5Qb2ludCA9IFsxIC0gaGFuZGxlLnBvc2l0aW9uWzBdLCAxIC0gaGFuZGxlLnBvc2l0aW9uWzFdXTtcbiAgICAgIHZhciBfYm94JGdldEFic29sdXRlUG9pbnQgPSB0aGlzLmJveC5nZXRBYnNvbHV0ZVBvaW50KG9yaWdpblBvaW50KSxcbiAgICAgICAgICBfYm94JGdldEFic29sdXRlUG9pbnQyID0gc2xpY2VkVG9BcnJheShfYm94JGdldEFic29sdXRlUG9pbnQsIDIpLFxuICAgICAgICAgIG9yaWdpblggPSBfYm94JGdldEFic29sdXRlUG9pbnQyWzBdLFxuICAgICAgICAgIG9yaWdpblkgPSBfYm94JGdldEFic29sdXRlUG9pbnQyWzFdO1xuICAgICAgdGhpcy5hY3RpdmVIYW5kbGUgPSB7IGhhbmRsZTogaGFuZGxlLCBvcmlnaW5Qb2ludDogb3JpZ2luUG9pbnQsIG9yaWdpblg6IG9yaWdpblgsIG9yaWdpblk6IG9yaWdpblkgfTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wU3RhcnQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcFN0YXJ0KHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25IYW5kbGVNb3ZlTW92aW5nJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25IYW5kbGVNb3ZlTW92aW5nKGUpIHtcbiAgICAgIHZhciBfZSRkZXRhaWwgPSBlLmRldGFpbCxcbiAgICAgICAgICBtb3VzZVggPSBfZSRkZXRhaWwubW91c2VYLFxuICAgICAgICAgIG1vdXNlWSA9IF9lJGRldGFpbC5tb3VzZVk7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jcm9wcGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBtb3VzZVggPSBtb3VzZVggLSBjb250YWluZXIubGVmdDtcbiAgICAgIG1vdXNlWSA9IG1vdXNlWSAtIGNvbnRhaW5lci50b3A7XG4gICAgICBpZiAobW91c2VYIDwgMCkge1xuICAgICAgICBtb3VzZVggPSAwO1xuICAgICAgfSBlbHNlIGlmIChtb3VzZVggPiBjb250YWluZXIud2lkdGgpIHtcbiAgICAgICAgbW91c2VYID0gY29udGFpbmVyLndpZHRoO1xuICAgICAgfVxuICAgICAgaWYgKG1vdXNlWSA8IDApIHtcbiAgICAgICAgbW91c2VZID0gMDtcbiAgICAgIH0gZWxzZSBpZiAobW91c2VZID4gY29udGFpbmVyLmhlaWdodCkge1xuICAgICAgICBtb3VzZVkgPSBjb250YWluZXIuaGVpZ2h0O1xuICAgICAgfVxuICAgICAgdmFyIG9yaWdpbiA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblBvaW50LnNsaWNlKCk7XG4gICAgICB2YXIgb3JpZ2luWCA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblg7XG4gICAgICB2YXIgb3JpZ2luWSA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblk7XG4gICAgICB2YXIgaGFuZGxlID0gdGhpcy5hY3RpdmVIYW5kbGUuaGFuZGxlO1xuICAgICAgdmFyIFRPUF9NT1ZBQkxFID0gaGFuZGxlLmNvbnN0cmFpbnRzWzBdID09PSAxO1xuICAgICAgdmFyIFJJR0hUX01PVkFCTEUgPSBoYW5kbGUuY29uc3RyYWludHNbMV0gPT09IDE7XG4gICAgICB2YXIgQk9UVE9NX01PVkFCTEUgPSBoYW5kbGUuY29uc3RyYWludHNbMl0gPT09IDE7XG4gICAgICB2YXIgTEVGVF9NT1ZBQkxFID0gaGFuZGxlLmNvbnN0cmFpbnRzWzNdID09PSAxO1xuICAgICAgdmFyIE1VTFRJX0FYSVMgPSAoTEVGVF9NT1ZBQkxFIHx8IFJJR0hUX01PVkFCTEUpICYmIChUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSk7XG4gICAgICB2YXIgeDEgPSBMRUZUX01PVkFCTEUgfHwgUklHSFRfTU9WQUJMRSA/IG9yaWdpblggOiB0aGlzLmJveC54MTtcbiAgICAgIHZhciB4MiA9IExFRlRfTU9WQUJMRSB8fCBSSUdIVF9NT1ZBQkxFID8gb3JpZ2luWCA6IHRoaXMuYm94LngyO1xuICAgICAgdmFyIHkxID0gVE9QX01PVkFCTEUgfHwgQk9UVE9NX01PVkFCTEUgPyBvcmlnaW5ZIDogdGhpcy5ib3gueTE7XG4gICAgICB2YXIgeTIgPSBUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSA/IG9yaWdpblkgOiB0aGlzLmJveC55MjtcbiAgICAgIHgxID0gTEVGVF9NT1ZBQkxFID8gbW91c2VYIDogeDE7XG4gICAgICB4MiA9IFJJR0hUX01PVkFCTEUgPyBtb3VzZVggOiB4MjtcbiAgICAgIHkxID0gVE9QX01PVkFCTEUgPyBtb3VzZVkgOiB5MTtcbiAgICAgIHkyID0gQk9UVE9NX01PVkFCTEUgPyBtb3VzZVkgOiB5MjtcbiAgICAgIHZhciBpc0ZsaXBwZWRYID0gZmFsc2UsXG4gICAgICAgICAgaXNGbGlwcGVkWSA9IGZhbHNlO1xuICAgICAgaWYgKExFRlRfTU9WQUJMRSB8fCBSSUdIVF9NT1ZBQkxFKSB7XG4gICAgICAgIGlzRmxpcHBlZFggPSBMRUZUX01PVkFCTEUgPyBtb3VzZVggPiBvcmlnaW5YIDogbW91c2VYIDwgb3JpZ2luWDtcbiAgICAgIH1cbiAgICAgIGlmIChUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSkge1xuICAgICAgICBpc0ZsaXBwZWRZID0gVE9QX01PVkFCTEUgPyBtb3VzZVkgPiBvcmlnaW5ZIDogbW91c2VZIDwgb3JpZ2luWTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0ZsaXBwZWRYKSB7XG4gICAgICAgIHZhciB0bXAgPSB4MTt4MSA9IHgyO3gyID0gdG1wO1xuICAgICAgICBvcmlnaW5bMF0gPSAxIC0gb3JpZ2luWzBdO1xuICAgICAgfVxuICAgICAgaWYgKGlzRmxpcHBlZFkpIHtcbiAgICAgICAgdmFyIF90bXAgPSB5MTt5MSA9IHkyO3kyID0gX3RtcDtcbiAgICAgICAgb3JpZ2luWzFdID0gMSAtIG9yaWdpblsxXTtcbiAgICAgIH1cbiAgICAgIHZhciBib3ggPSBuZXcgQm94KHgxLCB5MSwgeDIsIHkyKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXNwZWN0UmF0aW8pIHtcbiAgICAgICAgdmFyIHJhdGlvID0gdGhpcy5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgICB2YXIgaXNWZXJ0aWNhbE1vdmVtZW50ID0gZmFsc2U7XG4gICAgICAgIGlmIChNVUxUSV9BWElTKSB7XG4gICAgICAgICAgaXNWZXJ0aWNhbE1vdmVtZW50ID0gbW91c2VZID4gYm94LnkxICsgcmF0aW8gKiBib3gud2lkdGgoKSB8fCBtb3VzZVkgPCBib3gueTIgLSByYXRpbyAqIGJveC53aWR0aCgpO1xuICAgICAgICB9IGVsc2UgaWYgKFRPUF9NT1ZBQkxFIHx8IEJPVFRPTV9NT1ZBQkxFKSB7XG4gICAgICAgICAgaXNWZXJ0aWNhbE1vdmVtZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmF0aW9Nb2RlID0gaXNWZXJ0aWNhbE1vdmVtZW50ID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgICAgICBib3guY29uc3RyYWluVG9SYXRpbyhyYXRpbywgb3JpZ2luLCByYXRpb01vZGUpO1xuICAgICAgfVxuICAgICAgdmFyIG1pbiA9IHRoaXMub3B0aW9ucy5taW5TaXplO1xuICAgICAgdmFyIG1heCA9IHRoaXMub3B0aW9ucy5tYXhTaXplO1xuICAgICAgYm94LmNvbnN0cmFpblRvU2l6ZShtYXgud2lkdGgsIG1heC5oZWlnaHQsIG1pbi53aWR0aCwgbWluLmhlaWdodCwgb3JpZ2luLCB0aGlzLm9wdGlvbnMuYXNwZWN0UmF0aW8pO1xuICAgICAgdmFyIHBhcmVudFdpZHRoID0gdGhpcy5jcm9wcGVyRWwub2Zmc2V0V2lkdGg7XG4gICAgICB2YXIgcGFyZW50SGVpZ2h0ID0gdGhpcy5jcm9wcGVyRWwub2Zmc2V0SGVpZ2h0O1xuICAgICAgYm94LmNvbnN0cmFpblRvQm91bmRhcnkocGFyZW50V2lkdGgsIHBhcmVudEhlaWdodCwgb3JpZ2luKTtcbiAgICAgIHRoaXMuYm94ID0gYm94O1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wTW92ZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wTW92ZSh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uSGFuZGxlTW92ZUVuZCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uSGFuZGxlTW92ZUVuZChlKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25SZWdpb25Nb3ZlU3RhcnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVTdGFydChlKSB7XG4gICAgICB2YXIgX2UkZGV0YWlsMiA9IGUuZGV0YWlsLFxuICAgICAgICAgIG1vdXNlWCA9IF9lJGRldGFpbDIubW91c2VYLFxuICAgICAgICAgIG1vdXNlWSA9IF9lJGRldGFpbDIubW91c2VZO1xuICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY3JvcHBlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgbW91c2VYID0gbW91c2VYIC0gY29udGFpbmVyLmxlZnQ7XG4gICAgICBtb3VzZVkgPSBtb3VzZVkgLSBjb250YWluZXIudG9wO1xuICAgICAgdGhpcy5jdXJyZW50TW92ZSA9IHtcbiAgICAgICAgb2Zmc2V0WDogbW91c2VYIC0gdGhpcy5ib3gueDEsXG4gICAgICAgIG9mZnNldFk6IG1vdXNlWSAtIHRoaXMuYm94LnkxXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BTdGFydCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wU3RhcnQodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvblJlZ2lvbk1vdmVNb3ZpbmcnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVNb3ZpbmcoZSkge1xuICAgICAgdmFyIF9lJGRldGFpbDMgPSBlLmRldGFpbCxcbiAgICAgICAgICBtb3VzZVggPSBfZSRkZXRhaWwzLm1vdXNlWCxcbiAgICAgICAgICBtb3VzZVkgPSBfZSRkZXRhaWwzLm1vdXNlWTtcbiAgICAgIHZhciBfY3VycmVudE1vdmUgPSB0aGlzLmN1cnJlbnRNb3ZlLFxuICAgICAgICAgIG9mZnNldFggPSBfY3VycmVudE1vdmUub2Zmc2V0WCxcbiAgICAgICAgICBvZmZzZXRZID0gX2N1cnJlbnRNb3ZlLm9mZnNldFk7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jcm9wcGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBtb3VzZVggPSBtb3VzZVggLSBjb250YWluZXIubGVmdDtcbiAgICAgIG1vdXNlWSA9IG1vdXNlWSAtIGNvbnRhaW5lci50b3A7XG4gICAgICB0aGlzLmJveC5tb3ZlKG1vdXNlWCAtIG9mZnNldFgsIG1vdXNlWSAtIG9mZnNldFkpO1xuICAgICAgaWYgKHRoaXMuYm94LngxIDwgMCkge1xuICAgICAgICB0aGlzLmJveC5tb3ZlKDAsIG51bGwpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYm94LngyID4gY29udGFpbmVyLndpZHRoKSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUoY29udGFpbmVyLndpZHRoIC0gdGhpcy5ib3gud2lkdGgoKSwgbnVsbCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ib3gueTEgPCAwKSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUobnVsbCwgMCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ib3gueTIgPiBjb250YWluZXIuaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUobnVsbCwgY29udGFpbmVyLmhlaWdodCAtIHRoaXMuYm94LmhlaWdodCgpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcE1vdmUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcE1vdmUodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvblJlZ2lvbk1vdmVFbmQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVFbmQoZSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BFbmQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcEVuZCh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUoKSB7XG4gICAgICB2YXIgbW9kZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbnVsbDtcbiAgICAgIGlmIChtb2RlID09PSBudWxsKSB7XG4gICAgICAgIG1vZGUgPSB0aGlzLm9wdGlvbnMucmV0dXJuTW9kZTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2RlID09ICdyZWFsJykge1xuICAgICAgICB2YXIgYWN0dWFsV2lkdGggPSB0aGlzLmltYWdlRWwubmF0dXJhbFdpZHRoO1xuICAgICAgICB2YXIgYWN0dWFsSGVpZ2h0ID0gdGhpcy5pbWFnZUVsLm5hdHVyYWxIZWlnaHQ7XG4gICAgICAgIHZhciBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MgPSB0aGlzLmltYWdlRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICBlbGVtZW50V2lkdGggPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0Mud2lkdGgsXG4gICAgICAgICAgICBlbGVtZW50SGVpZ2h0ID0gX2ltYWdlRWwkZ2V0Qm91bmRpbmdDLmhlaWdodDtcbiAgICAgICAgdmFyIGZhY3RvclggPSBhY3R1YWxXaWR0aCAvIGVsZW1lbnRXaWR0aDtcbiAgICAgICAgdmFyIGZhY3RvclkgPSBhY3R1YWxIZWlnaHQgLyBlbGVtZW50SGVpZ2h0O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IE1hdGgucm91bmQodGhpcy5ib3gueDEgKiBmYWN0b3JYKSxcbiAgICAgICAgICB5OiBNYXRoLnJvdW5kKHRoaXMuYm94LnkxICogZmFjdG9yWSksXG4gICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQodGhpcy5ib3gud2lkdGgoKSAqIGZhY3RvclgpLFxuICAgICAgICAgIGhlaWdodDogTWF0aC5yb3VuZCh0aGlzLmJveC5oZWlnaHQoKSAqIGZhY3RvclkpXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gJ3JhdGlvJykge1xuICAgICAgICB2YXIgX2ltYWdlRWwkZ2V0Qm91bmRpbmdDMiA9IHRoaXMuaW1hZ2VFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgICAgIF9lbGVtZW50V2lkdGggPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MyLndpZHRoLFxuICAgICAgICAgICAgX2VsZW1lbnRIZWlnaHQgPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MyLmhlaWdodDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiByb3VuZCh0aGlzLmJveC54MSAvIF9lbGVtZW50V2lkdGgsIDMpLFxuICAgICAgICAgIHk6IHJvdW5kKHRoaXMuYm94LnkxIC8gX2VsZW1lbnRIZWlnaHQsIDMpLFxuICAgICAgICAgIHdpZHRoOiByb3VuZCh0aGlzLmJveC53aWR0aCgpIC8gX2VsZW1lbnRXaWR0aCwgMyksXG4gICAgICAgICAgaGVpZ2h0OiByb3VuZCh0aGlzLmJveC5oZWlnaHQoKSAvIF9lbGVtZW50SGVpZ2h0LCAzKVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChtb2RlID09ICdyYXcnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogTWF0aC5yb3VuZCh0aGlzLmJveC54MSksXG4gICAgICAgICAgeTogTWF0aC5yb3VuZCh0aGlzLmJveC55MSksXG4gICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQodGhpcy5ib3gud2lkdGgoKSksXG4gICAgICAgICAgaGVpZ2h0OiBNYXRoLnJvdW5kKHRoaXMuYm94LmhlaWdodCgpKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiAncGFyc2VPcHRpb25zJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VPcHRpb25zKG9wdHMpIHtcbiAgICAgIHZhciBkZWZhdWx0cyQkMSA9IHtcbiAgICAgICAgYXNwZWN0UmF0aW86IG51bGwsXG4gICAgICAgIG1heFNpemU6IHsgd2lkdGg6IG51bGwsIGhlaWdodDogbnVsbCB9LFxuICAgICAgICBtaW5TaXplOiB7IHdpZHRoOiBudWxsLCBoZWlnaHQ6IG51bGwgfSxcbiAgICAgICAgc3RhcnRTaXplOiB7IHdpZHRoOiAxMDAsIGhlaWdodDogMTAwLCB1bml0OiAnJScgfSxcbiAgICAgICAgcmV0dXJuTW9kZTogJ3JlYWwnLFxuICAgICAgICBvbkluaXRpYWxpemU6IG51bGwsXG4gICAgICAgIG9uQ3JvcFN0YXJ0OiBudWxsLFxuICAgICAgICBvbkNyb3BNb3ZlOiBudWxsLFxuICAgICAgICBvbkNyb3BFbmQ6IG51bGxcbiAgICAgIH07XG4gICAgICB2YXIgYXNwZWN0UmF0aW8gPSBudWxsO1xuICAgICAgaWYgKG9wdHMuYXNwZWN0UmF0aW8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMuYXNwZWN0UmF0aW8gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgYXNwZWN0UmF0aW8gPSBvcHRzLmFzcGVjdFJhdGlvO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdHMuYXNwZWN0UmF0aW8gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGFzcGVjdFJhdGlvID0gb3B0cy5hc3BlY3RSYXRpb1sxXSAvIG9wdHMuYXNwZWN0UmF0aW9bMF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBtYXhTaXplID0gbnVsbDtcbiAgICAgIGlmIChvcHRzLm1heFNpemUgIT09IHVuZGVmaW5lZCAmJiBvcHRzLm1heFNpemUgIT09IG51bGwpIHtcbiAgICAgICAgbWF4U2l6ZSA9IHtcbiAgICAgICAgICB3aWR0aDogb3B0cy5tYXhTaXplWzBdIHx8IG51bGwsXG4gICAgICAgICAgaGVpZ2h0OiBvcHRzLm1heFNpemVbMV0gfHwgbnVsbCxcbiAgICAgICAgICB1bml0OiBvcHRzLm1heFNpemVbMl0gfHwgJ3B4J1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdmFyIG1pblNpemUgPSBudWxsO1xuICAgICAgaWYgKG9wdHMubWluU2l6ZSAhPT0gdW5kZWZpbmVkICYmIG9wdHMubWluU2l6ZSAhPT0gbnVsbCkge1xuICAgICAgICBtaW5TaXplID0ge1xuICAgICAgICAgIHdpZHRoOiBvcHRzLm1pblNpemVbMF0gfHwgbnVsbCxcbiAgICAgICAgICBoZWlnaHQ6IG9wdHMubWluU2l6ZVsxXSB8fCBudWxsLFxuICAgICAgICAgIHVuaXQ6IG9wdHMubWluU2l6ZVsyXSB8fCAncHgnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgc3RhcnRTaXplID0gbnVsbDtcbiAgICAgIGlmIChvcHRzLnN0YXJ0U2l6ZSAhPT0gdW5kZWZpbmVkICYmIG9wdHMuc3RhcnRTaXplICE9PSBudWxsKSB7XG4gICAgICAgIHN0YXJ0U2l6ZSA9IHtcbiAgICAgICAgICB3aWR0aDogb3B0cy5zdGFydFNpemVbMF0gfHwgbnVsbCxcbiAgICAgICAgICBoZWlnaHQ6IG9wdHMuc3RhcnRTaXplWzFdIHx8IG51bGwsXG4gICAgICAgICAgdW5pdDogb3B0cy5zdGFydFNpemVbMl0gfHwgJyUnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgb25Jbml0aWFsaXplID0gbnVsbDtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5vbkluaXRpYWxpemUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb25Jbml0aWFsaXplID0gb3B0cy5vbkluaXRpYWxpemU7XG4gICAgICB9XG4gICAgICB2YXIgb25Dcm9wU3RhcnQgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uQ3JvcFN0YXJ0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9uQ3JvcFN0YXJ0ID0gb3B0cy5vbkNyb3BTdGFydDtcbiAgICAgIH1cbiAgICAgIHZhciBvbkNyb3BFbmQgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uQ3JvcEVuZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbkNyb3BFbmQgPSBvcHRzLm9uQ3JvcEVuZDtcbiAgICAgIH1cbiAgICAgIHZhciBvbkNyb3BNb3ZlID0gbnVsbDtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5vblVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0Nyb3Bwci5qczogYG9uVXBkYXRlYCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS4gUGxlYXNlIHVzZSBgb25Dcm9wTW92ZWAgb3IgYG9uQ3JvcEVuZGAgaW5zdGVhZC4nKTtcbiAgICAgICAgb25Dcm9wTW92ZSA9IG9wdHMub25VcGRhdGU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9wdHMub25Dcm9wTW92ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbkNyb3BNb3ZlID0gb3B0cy5vbkNyb3BNb3ZlO1xuICAgICAgfVxuICAgICAgdmFyIHJldHVybk1vZGUgPSBudWxsO1xuICAgICAgaWYgKG9wdHMucmV0dXJuTW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBzID0gb3B0cy5yZXR1cm5Nb2RlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChbJ3JlYWwnLCAncmF0aW8nLCAncmF3J10uaW5kZXhPZihzKSA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBcIkludmFsaWQgcmV0dXJuIG1vZGUuXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuTW9kZSA9IHM7XG4gICAgICB9XG4gICAgICB2YXIgY29udmVydFRvUGl4ZWxzID0gZnVuY3Rpb24gY29udmVydFRvUGl4ZWxzKGNvbnRhaW5lcikge1xuICAgICAgICB2YXIgd2lkdGggPSBjb250YWluZXIub2Zmc2V0V2lkdGg7XG4gICAgICAgIHZhciBoZWlnaHQgPSBjb250YWluZXIub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB2YXIgc2l6ZUtleXMgPSBbJ21heFNpemUnLCAnbWluU2l6ZScsICdzdGFydFNpemUnXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBrZXkgPSBzaXplS2V5c1tpXTtcbiAgICAgICAgICBpZiAodGhpc1trZXldICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpc1trZXldLnVuaXQgPT0gJyUnKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzW2tleV0ud2lkdGggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2tleV0ud2lkdGggPSB0aGlzW2tleV0ud2lkdGggLyAxMDAgKiB3aWR0aDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodGhpc1trZXldLmhlaWdodCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXNba2V5XS5oZWlnaHQgPSB0aGlzW2tleV0uaGVpZ2h0IC8gMTAwICogaGVpZ2h0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgdGhpc1trZXldLnVuaXQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IGZ1bmN0aW9uIGRlZmF1bHRWYWx1ZSh2LCBkKSB7XG4gICAgICAgIHJldHVybiB2ICE9PSBudWxsID8gdiA6IGQ7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXNwZWN0UmF0aW86IGRlZmF1bHRWYWx1ZShhc3BlY3RSYXRpbywgZGVmYXVsdHMkJDEuYXNwZWN0UmF0aW8pLFxuICAgICAgICBtYXhTaXplOiBkZWZhdWx0VmFsdWUobWF4U2l6ZSwgZGVmYXVsdHMkJDEubWF4U2l6ZSksXG4gICAgICAgIG1pblNpemU6IGRlZmF1bHRWYWx1ZShtaW5TaXplLCBkZWZhdWx0cyQkMS5taW5TaXplKSxcbiAgICAgICAgc3RhcnRTaXplOiBkZWZhdWx0VmFsdWUoc3RhcnRTaXplLCBkZWZhdWx0cyQkMS5zdGFydFNpemUpLFxuICAgICAgICByZXR1cm5Nb2RlOiBkZWZhdWx0VmFsdWUocmV0dXJuTW9kZSwgZGVmYXVsdHMkJDEucmV0dXJuTW9kZSksXG4gICAgICAgIG9uSW5pdGlhbGl6ZTogZGVmYXVsdFZhbHVlKG9uSW5pdGlhbGl6ZSwgZGVmYXVsdHMkJDEub25Jbml0aWFsaXplKSxcbiAgICAgICAgb25Dcm9wU3RhcnQ6IGRlZmF1bHRWYWx1ZShvbkNyb3BTdGFydCwgZGVmYXVsdHMkJDEub25Dcm9wU3RhcnQpLFxuICAgICAgICBvbkNyb3BNb3ZlOiBkZWZhdWx0VmFsdWUob25Dcm9wTW92ZSwgZGVmYXVsdHMkJDEub25Dcm9wTW92ZSksXG4gICAgICAgIG9uQ3JvcEVuZDogZGVmYXVsdFZhbHVlKG9uQ3JvcEVuZCwgZGVmYXVsdHMkJDEub25Dcm9wRW5kKSxcbiAgICAgICAgY29udmVydFRvUGl4ZWxzOiBjb252ZXJ0VG9QaXhlbHNcbiAgICAgIH07XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBDcm9wcHJDb3JlO1xufSgpO1xuZnVuY3Rpb24gcm91bmQodmFsdWUsIGRlY2ltYWxzKSB7XG4gIHJldHVybiBOdW1iZXIoTWF0aC5yb3VuZCh2YWx1ZSArICdlJyArIGRlY2ltYWxzKSArICdlLScgKyBkZWNpbWFscyk7XG59XG5cbnZhciBDcm9wcHIkMSA9IGZ1bmN0aW9uIChfQ3JvcHByQ29yZSkge1xuICBpbmhlcml0cyhDcm9wcHIsIF9Dcm9wcHJDb3JlKTtcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBDYWxscyB0aGUgQ3JvcHByQ29yZSdzIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgZnVuY3Rpb24gQ3JvcHByKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB2YXIgX2RlZmVycmVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDcm9wcHIpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChDcm9wcHIuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihDcm9wcHIpKS5jYWxsKHRoaXMsIGVsZW1lbnQsIG9wdGlvbnMsIF9kZWZlcnJlZCkpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY3JvcCByZWdpb24uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbbW9kZV0gV2hpY2ggbW9kZSBvZiBjYWxjdWxhdGlvbiB0byB1c2U6ICdyZWFsJywgJ3JhdGlvJyBvclxuICAgKiAgICAgICdyYXcnLlxuICAgKi9cbiAgY3JlYXRlQ2xhc3MoQ3JvcHByLCBbe1xuICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUobW9kZSkge1xuICAgICAgcmV0dXJuIGdldChDcm9wcHIucHJvdG90eXBlLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ3JvcHByLnByb3RvdHlwZSksICdnZXRWYWx1ZScsIHRoaXMpLmNhbGwodGhpcywgbW9kZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGltYWdlIHNyYy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3JjXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdzZXRJbWFnZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEltYWdlKHNyYykge1xuICAgICAgcmV0dXJuIGdldChDcm9wcHIucHJvdG90eXBlLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ3JvcHByLnByb3RvdHlwZSksICdzZXRJbWFnZScsIHRoaXMpLmNhbGwodGhpcywgc3JjKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdkZXN0cm95JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHJldHVybiBnZXQoQ3JvcHByLnByb3RvdHlwZS5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKENyb3Bwci5wcm90b3R5cGUpLCAnZGVzdHJveScsIHRoaXMpLmNhbGwodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vdmVzIHRoZSBjcm9wIHJlZ2lvbiB0byBhIHNwZWNpZmllZCBjb29yZGluYXRlLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ21vdmVUbycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1vdmVUbyh4LCB5KSB7XG4gICAgICB0aGlzLmJveC5tb3ZlKHgsIHkpO1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wRW5kICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5vbkNyb3BFbmQodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNpemVzIHRoZSBjcm9wIHJlZ2lvbiB0byBhIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHRcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBvcmlnaW4gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgIERlZmF1bHRzIHRvIFswLjUsIDAuNV0gKGNlbnRlcikuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdyZXNpemVUbycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2l6ZVRvKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IFsuNSwgLjVdO1xuICAgICAgdGhpcy5ib3gucmVzaXplKHdpZHRoLCBoZWlnaHQsIG9yaWdpbik7XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BFbmQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcEVuZCh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNjYWxlIHRoZSBjcm9wIHJlZ2lvbiBieSBhIGZhY3Rvci5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZmFjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gb3JpZ2luIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgICBEZWZhdWx0cyB0byBbMC41LCAwLjVdIChjZW50ZXIpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnc2NhbGVCeScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNjYWxlQnkoZmFjdG9yKSB7XG4gICAgICB2YXIgb3JpZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbLjUsIC41XTtcbiAgICAgIHRoaXMuYm94LnNjYWxlKGZhY3Rvciwgb3JpZ2luKTtcbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdyZXNldCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgdGhpcy5ib3ggPSB0aGlzLmluaXRpYWxpemVCb3godGhpcy5vcHRpb25zKTtcbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIENyb3Bwcjtcbn0oQ3JvcHByQ29yZSk7XG5cbnJldHVybiBDcm9wcHIkMTtcblxufSkpKTtcbiIsICJleHBvcnQgZW51bSBMaWNlbmNlU3RhdHVzIHtcclxuICBJbnZhbGlkLFxyXG4gIFZhbGlkLFxyXG4gIEV4cGlyZVNvb24sXHJcbiAgRXhwaXJlZFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElMaWNlbmNlIHtcclxuICByZWFkb25seSBTdGF0dXM/OiBMaWNlbmNlU3RhdHVzO1xyXG4gIHJlYWRvbmx5IE5hbWU6IHN0cmluZztcclxuICByZWFkb25seSBPd25lcjogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IEV4cGlyYXRpb25EYXRlOiBEYXRlIHwgc3RyaW5nO1xyXG4gIHJlYWRvbmx5IEFwcGxpY2F0aW9uczogUmVhZG9ubHlBcnJheTxzdHJpbmc+O1xyXG4gIHJlYWRvbmx5IFNvdXJjZUNvbnRlbnQ6IHN0cmluZztcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGVudW0gTWVudUl0ZW1UeXBlIHtcclxuICBHcmlkVmlldyA9IDAsXHJcbiAgRGFzaGJvYXJkID0gMSxcclxuICBNZW51Tm9kZSA9IDIsXHJcbiAgUmVwb3J0ID0gMyxcclxuICBEaWFncmFtID0gNCxcclxuICBDRE0gPSA1LFxyXG4gIFNsaWRlc2hvdyA9IDYsXHJcbiAgR2FudHRDaGFydCA9IDdcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbm90aWZ5KG1zZzogc3RyaW5nLCBzdWNjZWVkOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gIGNvbnN0IHN0YXR1cyA9IHN1Y2NlZWQgPyAnc3VjY2VzcycgOiAnZXJyb3InO1xyXG4gIGNvbnN0IGRpc3BsYXlUaW1lID0gc3VjY2VlZCA/IDIwMDAgOiA0MDAwO1xyXG5cclxuICBEZXZFeHByZXNzLnVpLm5vdGlmeSh7XHJcbiAgICBtZXNzYWdlOiBtc2csXHJcbiAgICB0eXBlOiBzdGF0dXMsXHJcbiAgICBvblNob3dpbmc6IChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1lc3NhZ2VFbGVtZW50ID0gZS5lbGVtZW50LmZpbmQoJy5keC10b2FzdC1tZXNzYWdlJyk7XHJcbiAgICAgIG1lc3NhZ2VFbGVtZW50Lmh0bWwoKG1lc3NhZ2VFbGVtZW50Lmh0bWwoKSB8fCAnJykucmVwbGFjZSgnXFxcXG4nLCAnPGJyIC8+JykpO1xyXG4gICAgfVxyXG4gIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvYXN0T3B0aW9ucywgc3RhdHVzLCBkaXNwbGF5VGltZSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuXHJcbmV4cG9ydCBjb25zdCBpc0Vycm9ySW5mbyA9IChcclxuICByZXNwb25zZURhdGE6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBJRXJyb3JJbmZvIHwgSUVycm9ySW5mb1tdIHwgdW5kZWZpbmVkIHwgbnVsbFxyXG4pOiByZXNwb25zZURhdGEgaXMgSUVycm9ySW5mbyB8IElFcnJvckluZm9bXSA9PiB7XHJcbiAgaWYgKCFyZXNwb25zZURhdGEpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHJlc3BvbnNlRGF0YSlcclxuICAgID8gKHJlc3BvbnNlRGF0YVswXS5TdGFja1RyYWNlICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2VEYXRhWzBdLkVycm9yICE9PSB1bmRlZmluZWQpXHJcbiAgICA6IChyZXNwb25zZURhdGEuRXJyb3IgIT09IHVuZGVmaW5lZCk7XHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElFcnJvckluZm8ge1xyXG4gIEVycm9yOiBzdHJpbmc7XHJcbiAgU3RhY2tUcmFjZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElBcGlSZXNwb25zZTxUPiB7XHJcbiAgRGF0YTogVCB8IElFcnJvckluZm8gfCBJRXJyb3JJbmZvW10gfCB1bmRlZmluZWQ7XHJcbiAgTWVzc2FnZTogc3RyaW5nO1xyXG4gIFJlcXVlc3RTdGF0ZTogUmVxdWVzdFN0YXRlO1xyXG4gIFN0YXR1c0NvZGU6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTG9va3VwRHRvPFQ+IHtcclxuICBWYWx1ZTogVDtcclxuICBUZXh0OiBzdHJpbmc7XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBlbnVtIFJlcXVlc3RTdGF0ZSB7XHJcbiAgQ29tcGxldGVkID0gMSxcclxuICBFcnJvcmVkID0gMlxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBDU1NfQ0xBU1NFUyB9IGZyb20gJy4uL1N0eWxpbmcvSW5kZXgnO1xyXG5cclxuY29uc3QgUE9QVVBfQ09OVEVOVF9DTEFTUyA9ICdwb3B1cC1jb250ZW50JztcclxuY29uc3QgUE9QVVBfRk9PVEVSX0NMQVNTID0gJ3BvcHVwLWZvb3Rlcic7XHJcbmNvbnN0IEJVVFRPTlNfQ0xBU1MgPSAnYnV0dG9ucyc7XHJcbmNvbnN0IE9LX0JUTl9DTEFTUyA9ICdvay1idG4nO1xyXG5jb25zdCBDQU5DRUxfQlROX0NMQVNTID0gJ2NhbmNlbC1idG4nO1xyXG5cclxuaW50ZXJmYWNlIElQb3B1cCB7XHJcbiAgc2hvdzogKCkgPT4gdm9pZDtcclxuICBoaWRlOiAoKSA9PiB2b2lkO1xyXG4gIHJlbW92ZTogKCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUG9wdXBCdXR0b25PcHRpb25zIHtcclxuICB0ZXh0OiBzdHJpbmc7XHJcbiAgaWNvbj86IHN0cmluZztcclxuICBkaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgb25DbGljazogKGNsb3NlUG9wdXApID0+IHZvaWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUxheW91dCgkY29udGFpbmVyLCBjb250ZW50Q2xhc3NOYW1lPykge1xyXG4gIHJldHVybiB7XHJcbiAgICAkY29udGVudDogJCgnPGRpdiAvPicpLmFkZENsYXNzKFBPUFVQX0NPTlRFTlRfQ0xBU1MpLmFkZENsYXNzKGNvbnRlbnRDbGFzc05hbWUpLmFwcGVuZFRvKCRjb250YWluZXIpLFxyXG4gICAgJGZvb3RlcjogJCgnPGRpdiAvPicpLmFkZENsYXNzKFBPUFVQX0ZPT1RFUl9DTEFTUykuYXBwZW5kVG8oJGNvbnRhaW5lcilcclxuICB9O1xyXG59XHJcblxyXG5jb25zdCBzaG93blBvcHVwcyA9IFtdO1xyXG5cclxuZnVuY3Rpb24gY3JlYXRlUG9wdXAoJGVsOiBKUXVlcnksIGR4UG9wdXBPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuUHJvcGVydGllcywgdXNlS2V5UHJlc3NCZWhhdmlvcjogYm9vbGVhbiA9IGZhbHNlKTogSVBvcHVwIHtcclxuICBjb25zdCBzYXZlZE9uU2hvd2luZyA9IGR4UG9wdXBPcHRpb25zLm9uU2hvd2luZztcclxuXHJcbiAgZHhQb3B1cE9wdGlvbnMub25TaG93biA9IChlKSA9PiB7XHJcbiAgICBpZiAoc2F2ZWRPblNob3dpbmcpIHtcclxuICAgICAgc2F2ZWRPblNob3dpbmcoZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYWxsSW5wdXRzID0gcG9wdXAuY29udGVudCgpLmZpbmQoJ2lucHV0W3R5cGU9dGV4dF0nKTtcclxuICAgIGNvbnN0IGZpcnN0SW5wdXQgPSBhbGxJbnB1dHMuZXEoMCk7XHJcblxyXG4gICAgZmlyc3RJbnB1dC5mb2N1cygpO1xyXG5cclxuICAgIGNvbnN0IGtleUhhbmRsZXJzID0ge1xyXG4gICAgICBrZXlkb3duOiAoZXY6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChzaG93blBvcHVwc1tzaG93blBvcHVwcy5sZW5ndGggLSAxXSAhPT0gcG9wdXApIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChldi5rZXlDb2RlID09PSAxMykge1xyXG4gICAgICAgICAgJChldi5jdXJyZW50VGFyZ2V0KS50cmlnZ2VyKCdjaGFuZ2UnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG9uS2V5RG93bihldik7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgaWYgKHVzZUtleVByZXNzQmVoYXZpb3IpIHtcclxuICAgICAgYWxsSW5wdXRzLm9uKGtleUhhbmRsZXJzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZpcnN0SW5wdXQub24oa2V5SGFuZGxlcnMpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykge1xyXG4gICAgICBwb3B1cC5jb250ZW50KCkuZmluZChgLiR7Q1NTX0NMQVNTRVMuZHhCdXR0b259LiR7T0tfQlROX0NMQVNTfWApLmNsaWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gMjcpIHtcclxuICAgICAgcG9wdXAuY29udGVudCgpLmZpbmQoYC4ke0NTU19DTEFTU0VTLmR4QnV0dG9ufS4ke0NBTkNFTF9CVE5fQ0xBU1N9YCkuY2xpY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IHBvcHVwID0gJGVsXHJcbiAgICAuZHhQb3B1cChkeFBvcHVwT3B0aW9ucylcclxuICAgIC5keFBvcHVwKCdpbnN0YW5jZScpO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2hvdzogKCkgPT4ge1xyXG4gICAgICBwb3B1cC5zaG93KCk7XHJcbiAgICAgICQoZG9jdW1lbnQpLm9uKHsga2V5ZG93bjogb25LZXlEb3duIH0pO1xyXG4gICAgICBzaG93blBvcHVwcy5wdXNoKHBvcHVwKTtcclxuICAgIH0sXHJcbiAgICBoaWRlOiAoKSA9PiB7XHJcbiAgICAgICQoZG9jdW1lbnQpLm9mZih7IGtleWRvd246IG9uS2V5RG93biB9KTtcclxuICAgICAgcG9wdXAuaGlkZSgpO1xyXG4gICAgICBzaG93blBvcHVwcy5wb3AoKTtcclxuICAgIH0sXHJcbiAgICByZW1vdmU6ICgpID0+ICRlbC5yZW1vdmUoKVxyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCdXR0b25zKFxyXG4gIG9rT3B0aW9uczogRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnMsXHJcbiAgY2FuY2VsT3B0aW9uczogRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuKSB7XHJcbiAgY29uc3QgJHRhYmxlID0gJCgnPHRhYmxlIC8+JykuYWRkQ2xhc3MoQlVUVE9OU19DTEFTUyk7XHJcbiAgY29uc3QgJHRyID0gJCgnPHRyPicpLmFwcGVuZFRvKCR0YWJsZSk7XHJcblxyXG4gIGlmIChva09wdGlvbnMpIHtcclxuICAgICQoJzx0ZCAvPicpXHJcbiAgICAgIC5hdHRyKCd3aWR0aCcsICc1MCUnKVxyXG4gICAgICAuYXBwZW5kKCQoJzxkaXYgLz4nKS5hZGRDbGFzcyhDU1NfQ0xBU1NFUy5keEJ1dHRvbikuYWRkQ2xhc3MoT0tfQlROX0NMQVNTKS5keEJ1dHRvbihva09wdGlvbnMpKVxyXG4gICAgICAuYXBwZW5kVG8oJHRyKTtcclxuICB9XHJcblxyXG4gIGlmIChjYW5jZWxPcHRpb25zKSB7XHJcbiAgICAkKCc8dGQgLz4nKVxyXG4gICAgICAuYXR0cignd2lkdGgnLCAnNTAlJylcclxuICAgICAgLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoQ1NTX0NMQVNTRVMuZHhCdXR0b24pLmFkZENsYXNzKENBTkNFTF9CVE5fQ0xBU1MpLmR4QnV0dG9uKGNhbmNlbE9wdGlvbnMpKVxyXG4gICAgICAuYXBwZW5kVG8oJHRyKTtcclxuICB9XHJcblxyXG4gIHJldHVybiAkdGFibGU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJdGVtKGxhYmVsOiBzdHJpbmcsICR2YWx1ZTogSlF1ZXJ5KSB7XHJcbiAgcmV0dXJuICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnaXRlbScpXHJcbiAgICAuYXBwZW5kKFxyXG4gICAgICAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2Zvcm0tbGFiZWwnKS50ZXh0KGxhYmVsKSxcclxuICAgICAgJCgnPGRpdiAvPicpLmFkZENsYXNzKCd2YWx1ZScpLmFwcGVuZCgkdmFsdWUpXHJcbiAgICApO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElQb3B1cE9wdGlvbnMge1xyXG4gIHVzZUtleVByZXNzQmVoYXZpb3I6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaWFsb2coXHJcbiAgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keFBvcHVwLlByb3BlcnRpZXMsXHJcbiAgJHBvcHVwQ29udGVudDogSlF1ZXJ5LFxyXG4gIG9rQnRuT3B0aW9ucz86IElQb3B1cEJ1dHRvbk9wdGlvbnMsXHJcbiAgY2FuY2VsQnRuT3B0aW9ucz86IElQb3B1cEJ1dHRvbk9wdGlvbnMsXHJcbiAgYWRkaXRpb25hbE9wdGlvbnM/OiBJUG9wdXBPcHRpb25zXHJcbikge1xyXG4gIGNvbnN0ICRlbCA9ICQoJzxkaXY+JykuYXBwZW5kVG8oJ2JvZHknKTtcclxuICBsZXQgJGJ1dHRvbnM6IEpRdWVyeSA9IG51bGw7XHJcblxyXG4gIGxldCBwb3B1cDogSVBvcHVwID0gbnVsbDtcclxuXHJcbiAgY29uc3QgdXNlS2V5UHJlc3NCZWhhdmlvciA9IGFkZGl0aW9uYWxPcHRpb25zID8gYWRkaXRpb25hbE9wdGlvbnMudXNlS2V5UHJlc3NCZWhhdmlvciA6IGZhbHNlO1xyXG5cclxuICBmdW5jdGlvbiBjbG9zZVBvcHVwKCkge1xyXG4gICAgcG9wdXAuaGlkZSgpO1xyXG4gICAgcG9wdXAucmVtb3ZlKCk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBkeFBvcHVwT3B0aW9uczogRGV2RXhwcmVzcy51aS5keFBvcHVwLlByb3BlcnRpZXMgPSB7XHJcbiAgICBjb250ZW50VGVtcGxhdGU6ICgkcG9wdXBDb250YWluZXIpID0+IHtcclxuICAgICAgY29uc3QgeyAkY29udGVudCwgJGZvb3RlciB9ID0gY3JlYXRlTGF5b3V0KCRwb3B1cENvbnRhaW5lcik7XHJcblxyXG4gICAgICAkY29udGVudC5hcHBlbmQoJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgICBpZiAob2tCdG5PcHRpb25zICYmIGNhbmNlbEJ0bk9wdGlvbnMpIHtcclxuICAgICAgICAkYnV0dG9ucyA9IGNyZWF0ZUJ1dHRvbnMoXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRleHQ6IG9rQnRuT3B0aW9ucy50ZXh0LFxyXG4gICAgICAgICAgICBpY29uOiBva0J0bk9wdGlvbnMuaWNvbixcclxuICAgICAgICAgICAgZGlzYWJsZWQ6IG9rQnRuT3B0aW9ucy5kaXNhYmxlZCxcclxuICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxyXG4gICAgICAgICAgICBvbkNsaWNrOiAoZSkgPT4gb2tCdG5PcHRpb25zLm9uQ2xpY2soY2xvc2VQb3B1cClcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRleHQ6IGNhbmNlbEJ0bk9wdGlvbnMudGV4dCxcclxuICAgICAgICAgICAgaWNvbjogY2FuY2VsQnRuT3B0aW9ucy5pY29uLFxyXG4gICAgICAgICAgICBkaXNhYmxlZDogY2FuY2VsQnRuT3B0aW9ucy5kaXNhYmxlZCxcclxuICAgICAgICAgICAgb25DbGljazogKGUpID0+IGNhbmNlbEJ0bk9wdGlvbnMub25DbGljayhjbG9zZVBvcHVwKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgICRmb290ZXIuYXBwZW5kKCRidXR0b25zKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAkZm9vdGVyLnJlbW92ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgZWxlbWVudEF0dHI6IHsgY2xhc3M6ICdpc3pvbGVhLWR4LXBvcHVwJyB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgcG9wdXBPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuUHJvcGVydGllcyA9IHt9O1xyXG5cclxuICAkLmV4dGVuZCh0cnVlLCBwb3B1cE9wdGlvbnMsIG9wdGlvbnMsIGR4UG9wdXBPcHRpb25zKTtcclxuXHJcbiAgcG9wdXAgPSBjcmVhdGVQb3B1cCgkZWwsIHBvcHVwT3B0aW9ucywgdXNlS2V5UHJlc3NCZWhhdmlvcik7XHJcblxyXG4gIHBvcHVwLnNob3coKTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogcHJlZmVyLXRlbXBsYXRlXHJcbiAgICBva0J0bjogJGJ1dHRvbnMgPyAkYnV0dG9ucy5maW5kKGAuJHsgIE9LX0JUTl9DTEFTU31gKS5keEJ1dHRvbignaW5zdGFuY2UnKSA6IG51bGwsXHJcbiAgICBjbG9zZTogKCkgPT4gY2xvc2VQb3B1cCgpXHJcbiAgfTtcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGNvbnN0IENTU19DTEFTU0VTID0ge1xyXG4gIGR4RGF0YUdyaWQ6ICdpc3pvbGVhLWR4LWRhdGFncmlkJyxcclxuICBkeEJ1dHRvbjogJ2lzem9sZWEtZHgtYnV0dG9uJyxcclxuICBkeFBvcHVwOiAnaXN6b2xlYS1keC1wb3B1cCdcclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCB7IGNyZWF0ZURpYWxvZyB9IGZyb20gJy4vUG9wdXAnO1xyXG5pbXBvcnQgeyBJRXJyb3JJbmZvIH0gZnJvbSAnLi4vRGF0YS9BcGlSZXNwb25zZSc7XHJcblxyXG5jb25zdCBNQUlOX0VMRU1FTlRfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cCc7XHJcbmNvbnN0IFBPUFVQX0NPTlRFTlRfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fY29udGVudCc7XHJcbmNvbnN0IEVSUk9SX1BPUFVQX01FU1NBR0VfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fZXJyb3ItbWVzc2FnZSc7XHJcbmNvbnN0IEVSUk9SX1BPUFVQX0RFVEFJTFNfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fZXJyb3ItZGV0YWlscyc7XHJcblxyXG5jb25zdCBTSE9XX0RFVEFJTFNfVEVYVCA9ICdTaG93IGRldGFpbHMnO1xyXG5jb25zdCBISURFX0RFVEFJTFNfVEVYVCA9ICdIaWRlIGRldGFpbHMnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVycm9ySW5mb1BvcHVwKHRpdGxlTWVzc2FnZTogc3RyaW5nLCBlcnJvckluZm86IElFcnJvckluZm8gfCBJRXJyb3JJbmZvW10pOiB2b2lkIHtcclxuICBsZXQgcG9wdXA6IERldkV4cHJlc3MudWkuZHhQb3B1cDtcclxuICBjb25zdCBpbmZvQXJyYXkgPSBBcnJheS5pc0FycmF5KGVycm9ySW5mbykgPyBlcnJvckluZm8gOiBbZXJyb3JJbmZvXTtcclxuXHJcbiAgY29uc3QgJHBvcHVwQ29udGVudCA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcyhQT1BVUF9DT05URU5UX0NMQVNTKTtcclxuXHJcbiAgaW5mb0FycmF5LmZvckVhY2goKGksIGluZGV4KSA9PiB7XHJcbiAgICBjb25zdCAkZXJyb3JNZXNzYWdlRWxlbWVudCA9ICQoJzxwIC8+JykuYWRkQ2xhc3MoRVJST1JfUE9QVVBfTUVTU0FHRV9DTEFTUykudGV4dChpLkVycm9yKTtcclxuICAgIGNvbnN0ICRlcnJvckRldGFpbHNFbGVtZW50ID0gJCgnPHAgLz4nKS5hZGRDbGFzcyhFUlJPUl9QT1BVUF9ERVRBSUxTX0NMQVNTKS50ZXh0KGkuU3RhY2tUcmFjZSk7XHJcbiAgICAkcG9wdXBDb250ZW50LmFwcGVuZCgkZXJyb3JNZXNzYWdlRWxlbWVudCwgJGVycm9yRGV0YWlsc0VsZW1lbnQpLmhpZGUoKTtcclxuXHJcbiAgICBpZiAoaW5kZXggPCBpbmZvQXJyYXkubGVuZ3RoIC0gMSkge1xyXG4gICAgICAkcG9wdXBDb250ZW50LmFwcGVuZCgkKCc8aHIgLz4nKSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHBvcHVwSW5mbyA9IGNyZWF0ZURpYWxvZyhcclxuICAgIHtcclxuICAgICAgdGl0bGU6IHRpdGxlTWVzc2FnZSxcclxuICAgICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICAgIGFuaW1hdGlvbjoge1xyXG4gICAgICAgIHNob3c6IHsgZGlyZWN0aW9uOiAnYm90dG9tJywgdHlwZTogJ3NsaWRlSW4nIH0sXHJcbiAgICAgICAgaGlkZTogeyBkaXJlY3Rpb246ICdib3R0b20nLCB0eXBlOiAnc2xpZGVPdXQnIH1cclxuICAgICAgfSxcclxuICAgICAgcG9zaXRpb246IHsgbXk6ICdib3R0b20nLCBhdDogJ2JvdHRvbScsIG9mZnNldDogeyB5OiAtNTAgfSB9LFxyXG4gICAgICBzaGFkaW5nOiBmYWxzZSxcclxuICAgICAgZHJhZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4ge1xyXG4gICAgICAgIHBvcHVwID0gZS5jb21wb25lbnQ7XHJcbiAgICAgICAgZS5lbGVtZW50LmFkZENsYXNzKE1BSU5fRUxFTUVOVF9DTEFTUyk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAkcG9wdXBDb250ZW50LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiBTSE9XX0RFVEFJTFNfVEVYVCxcclxuICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGlzRnVsbFNjcmVlblJlcXVpcmVkOiBib29sZWFuID0gIXBvcHVwLm9wdGlvbignZnVsbFNjcmVlbicpO1xyXG4gICAgICAgIHRvZ2dsZUZ1bGxTY3JlZW4oaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgICAgIHBvcHVwSW5mby5va0J0bi5vcHRpb24oJ3RleHQnLCBpc0Z1bGxTY3JlZW5SZXF1aXJlZCA/IEhJREVfREVUQUlMU19URVhUIDogU0hPV19ERVRBSUxTX1RFWFQpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiAnQ2xvc2UnLFxyXG4gICAgICBvbkNsaWNrOiAoY2xvc2VQb3B1cCkgPT4gY2xvc2VQb3B1cCgpXHJcbiAgICB9KTtcclxuXHJcbiAgY29uc3QgdG9nZ2xlRnVsbFNjcmVlbiA9IChpc0Z1bGxTY3JlZW5SZXF1aXJlZDogYm9vbGVhbikgPT4ge1xyXG4gICAgJHBvcHVwQ29udGVudC50b2dnbGUoaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgcG9wdXAub3B0aW9uKCdmdWxsU2NyZWVuJywgaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgcG9wdXAucmVwYWludCgpO1xyXG4gIH07XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBlbnVtIEV4Y2VwdGlvblR5cGUge1xyXG4gIFVuZXhwZWN0ZWRFeGNlcHRpb24gPSAwLFxyXG4gIFNxbEV4Y2VwdGlvbiA9IDEsXHJcbiAgSXN6b2xlYUNvbmZpZ3VyYXRpb25FeGNlcHRpb24gPSAyXHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEV4Y2VwdGlvblR5cGUgfSBmcm9tICcuLi9EYXRhL0V4Y2VwdGlvblR5cGUnO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgPSAoZXhjZXB0aW9uVHlwZTogRXhjZXB0aW9uVHlwZSkgPT4ge1xyXG4gIHN3aXRjaCAoZXhjZXB0aW9uVHlwZSkge1xyXG4gICAgY2FzZSBFeGNlcHRpb25UeXBlLlNxbEV4Y2VwdGlvbjpcclxuICAgICAgcmV0dXJuICdXZSBhdHRlbXB0ZWQgdG8gZXhlY3V0ZSB0aGUgZGF0YSBxdWVyeSBob3dldmVyIGl0IGFwcGVhcnMgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIGRhdGEgc291cmNlLic7XHJcblxyXG4gICAgY2FzZSBFeGNlcHRpb25UeXBlLklzem9sZWFDb25maWd1cmF0aW9uRXhjZXB0aW9uOlxyXG4gICAgICByZXR1cm4gJ1NvbWV0aGluZyB3cm9uZyB3aXRoIGlzem9sZWEgY29uZmlndXJhdGlvbi4gQ2hlY2sgQ2xpZW50SWQvQ2xpZW50U2VjcmV0IGZpZWxkcyBpbiB0aGUgYXBwc2V0dGluZ3MuanNvbiBmaWxlLic7XHJcblxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuICcnO1xyXG4gIH1cclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCBub3RpZnkgZnJvbSAnLi4vV2lkZ2V0cy9Ob3RpZnknO1xyXG5pbXBvcnQgeyBJQXBpUmVzcG9uc2UsIGlzRXJyb3JJbmZvIH0gZnJvbSAnLi9BcGlSZXNwb25zZSc7XHJcbmltcG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuaW1wb3J0IHsgY3JlYXRlRXJyb3JJbmZvUG9wdXAgfSBmcm9tICcuLi9XaWRnZXRzL0Vycm9ySW5mb1BvcHVwJztcclxuaW1wb3J0IHsgRXhjZXB0aW9uVHlwZSB9IGZyb20gJy4vRXhjZXB0aW9uVHlwZSc7XHJcbmltcG9ydCB7IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi9VdGlscy9HZW5lcmFsVXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlJztcclxuXHJcbmNvbnN0IERFRkFVTFRfRVJST1JfTUVTU0FHRSA9ICdVbmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLiBQbGVhc2UgY29udGFjdCB0byBkZXZlbG9wZXJzLic7XHJcbmNvbnN0IE5PVF9FU1NFTlRJQUxfU1RBVFVTRVMgPSBbNTA0XTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0RXJyb3JNZXNzYWdlID0gKCkgPT4gREVGQVVMVF9FUlJPUl9NRVNTQUdFO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVN1Y2Nlc3MocmVzOiBJQXBpUmVzcG9uc2U8YW55Piwgbm90aWZ5U3VjY2VzcyA9IGZhbHNlKSB7XHJcbiAgaWYgKG5vdGlmeVN1Y2Nlc3MpIHtcclxuICAgIG5vdGlmeShyZXMuTWVzc2FnZSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzLkRhdGEpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRXJyb3I8VD4oXHJcbiAgcmVzOiBJQXBpUmVzcG9uc2U8VD4sXHJcbiAgbm90aWZ5RXJyb3I6IGJvb2xlYW4sXHJcbiAgZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlPzogKGV4Y2VwdGlvblR5cGU6IEV4Y2VwdGlvblR5cGUpID0+IHN0cmluZ1xyXG4pOiB7IG1lc3NhZ2U6IHN0cmluZyB9IHtcclxuICBjb25zdCBtZXNzYWdlID0gcmVzLk1lc3NhZ2U7XHJcblxyXG4gIGNvbnN0IHJlc3VsdCA9IHsgbWVzc2FnZSB9O1xyXG5cclxuICBsZXQgbWVzc2FnZVRvU2hvdztcclxuICBjb25zdCBleGNlcHRpb25UeXBlID0gcGFyc2VFeGNlcHRpb25UeXBlKG1lc3NhZ2UpO1xyXG4gIGlmIChleGNlcHRpb25UeXBlICE9PSBudWxsKSB7XHJcbiAgICBjb25zdCBjdXN0b21FcnJvck1lc3NhZ2UgPSBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgPyBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UoZXhjZXB0aW9uVHlwZSkgOiAnJztcclxuICAgIG1lc3NhZ2VUb1Nob3cgPSBjdXN0b21FcnJvck1lc3NhZ2UgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBtZXNzYWdlVG9TaG93ID0gbWVzc2FnZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0U7XHJcbiAgfVxyXG5cclxuICBpZiAobm90aWZ5RXJyb3IpIHtcclxuICAgIGNvbnN0IGVycm9ySW5mbyA9IHJlcy5EYXRhO1xyXG4gICAgaWYgKGlzRXJyb3JJbmZvKGVycm9ySW5mbykpIHtcclxuICAgICAgY29uc3QgaXNFcnJvckluZm9Ob3RFbXB0eUFycmF5ID0gQXJyYXkuaXNBcnJheShlcnJvckluZm8pICYmIGVycm9ySW5mby5sZW5ndGg7XHJcbiAgICAgIGNvbnN0IGlzRXJyb3JJbmZvSGFzRGF0YSA9ICFBcnJheS5pc0FycmF5KGVycm9ySW5mbykgJiYgKGVycm9ySW5mby5TdGFja1RyYWNlIHx8IGVycm9ySW5mby5FcnJvcik7XHJcblxyXG4gICAgICBpZiAoaXNFcnJvckluZm9Ob3RFbXB0eUFycmF5IHx8IGlzRXJyb3JJbmZvSGFzRGF0YSkge1xyXG4gICAgICAgIGNyZWF0ZUVycm9ySW5mb1BvcHVwKG1lc3NhZ2VUb1Nob3csIGVycm9ySW5mbyk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBub3RpZnkobWVzc2FnZVRvU2hvdywgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VFeGNlcHRpb25UeXBlKG1lc3NhZ2U6IHN0cmluZyk6IEV4Y2VwdGlvblR5cGUgfCBudWxsIHtcclxuICByZXR1cm4gKCFpc05hTihtZXNzYWdlIGFzIGFueSkpICYmIEV4Y2VwdGlvblR5cGVbK21lc3NhZ2VdID8gK21lc3NhZ2UgOiBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlVXBsb2FkKGU6IHsgcmVxdWVzdDogeyByZXNwb25zZTogc3RyaW5nOyB9IH0pIHtcclxuICBjb25zdCByZXNwb25zZTogSUFwaVJlc3BvbnNlPGFueT4gPSBlLnJlcXVlc3QucmVzcG9uc2UgPyBKU09OLnBhcnNlKGUucmVxdWVzdC5yZXNwb25zZSkgOiB7fTtcclxuXHJcbiAgaWYgKHJlc3BvbnNlLlJlcXVlc3RTdGF0ZSA9PT0gUmVxdWVzdFN0YXRlLkNvbXBsZXRlZCkge1xyXG4gICAgaGFuZGxlU3VjY2VzcyhyZXNwb25zZSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVFcnJvcihyZXNwb25zZSwgdHJ1ZSk7XHJcblxyXG4gIHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSVNlbmRSZXF1ZXN0U2V0dGluZ3MgPSBKUXVlcnlBamF4U2V0dGluZ3MgJiB7XHJcbiAgbm90aWZ5RXJyb3I/OiBib29sZWFuO1xyXG4gIGdldFVzZXJGcmllbmRseUVycm9yTWVzc2FnZT86IChleGNlcHRpb25UeXBlOiBFeGNlcHRpb25UeXBlKSA9PiBzdHJpbmc7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2VuZFJlcXVlc3Q8VCA9IGFueT4oXHJcbiAgdXJsOiBzdHJpbmcsXHJcbiAgdHlwZTogc3RyaW5nID0gJ0dFVCcsXHJcbiAgZGF0YSA9IG51bGwsXHJcbiAgbm90aWZ5U3VjY2Vzcz86IGJvb2xlYW4sXHJcbiAgc2V0dGluZ3M/OiBJU2VuZFJlcXVlc3RTZXR0aW5ncyxcclxuKTogSlF1ZXJ5LkRlZmVycmVkPFQ+IHtcclxuICBjb25zdCBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcclxuXHJcbiAgY29uc3Qgbm90aWZ5RXJyb3IgPSBzZXR0aW5ncz8ubm90aWZ5RXJyb3IgPT09IHVuZGVmaW5lZCB8fCBzZXR0aW5ncy5ub3RpZnlFcnJvcjtcclxuXHJcbiAgY29uc3QgbWFuZGF0b3J5T3B0aW9ucyA9IHtcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbidcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBhamF4U2V0dGluZ3MgPSAkLmV4dGVuZCh7IHR5cGUsIHVybCwgZGF0YSB9LCBzZXR0aW5ncywgbWFuZGF0b3J5T3B0aW9ucyk7XHJcblxyXG4gICQuYWpheChhamF4U2V0dGluZ3MpXHJcbiAgICAuZG9uZSgocmVzKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBJQXBpUmVzcG9uc2U8YW55PiA9IHJlcztcclxuXHJcbiAgICAgIGlmIChyZXNwb25zZS5SZXF1ZXN0U3RhdGUgPT09IFJlcXVlc3RTdGF0ZS5Db21wbGV0ZWQpIHtcclxuICAgICAgICBoYW5kbGVTdWNjZXNzKHJlc3BvbnNlLCBub3RpZnlTdWNjZXNzKTtcclxuICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlLkRhdGEpO1xyXG5cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHsgbWVzc2FnZSB9ID0gaGFuZGxlRXJyb3IocmVzcG9uc2UsIG5vdGlmeUVycm9yLCBzZXR0aW5ncz8uZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlIHx8IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UpO1xyXG5cclxuICAgICAgZGVmZXJyZWQucmVqZWN0KG1lc3NhZ2UpO1xyXG4gICAgfSlcclxuICAgIC5mYWlsKChqcVhIUiwgdGV4dFN0YXR1cykgPT4ge1xyXG4gICAgICBpZiAoIU5PVF9FU1NFTlRJQUxfU1RBVFVTRVMuaW5jbHVkZXMoanFYSFIuc3RhdHVzKSAmJiBub3RpZnlFcnJvcikge1xyXG4gICAgICAgIG5vdGlmeShnZXREZWZhdWx0RXJyb3JNZXNzYWdlKCksIGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZGVmZXJyZWQucmVqZWN0KHRleHRTdGF0dXMpO1xyXG4gICAgfSk7XHJcblxyXG4gIHJldHVybiBkZWZlcnJlZDtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUFwaVJlc3BvbnNlIH0gZnJvbSAnLi9BcGlSZXNwb25zZSc7XHJcbmltcG9ydCB7IGhhbmRsZUVycm9yLCBoYW5kbGVTdWNjZXNzLCBnZXREZWZhdWx0RXJyb3JNZXNzYWdlIH0gZnJvbSAnLi9SZXF1ZXN0JztcclxuaW1wb3J0IHsgUmVxdWVzdFN0YXRlIH0gZnJvbSAnLi9SZXF1ZXN0U3RhdGUnO1xyXG5pbXBvcnQgeyBFeGNlcHRpb25UeXBlIH0gZnJvbSAnLi9FeGNlcHRpb25UeXBlJztcclxuXHJcbmV4cG9ydCB0eXBlIElEeERhdGFTb3VyY2VPcHRpb25zID0gRGV2RXhwcmVzcy5kYXRhLkFzcE5ldC5PcHRpb25zICYge1xyXG4gIG5vdGlmeVN1Y2Nlc3M/OiBib29sZWFuO1xyXG4gIG5vdGlmeUVycm9yPzogYm9vbGVhbjtcclxuICBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2U/OiAoZXhjZXB0aW9uVHlwZTogRXhjZXB0aW9uVHlwZSkgPT4gc3RyaW5nO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUR4RGF0YVNvdXJjZShvcHRpb25zOiBJRHhEYXRhU291cmNlT3B0aW9ucykge1xyXG4gIGNvbnN0IHN0b3JlID0gRGV2RXhwcmVzcy5kYXRhLkFzcE5ldC5jcmVhdGVTdG9yZSh7XHJcbiAgICAuLi5vcHRpb25zLFxyXG4gICAgb25CZWZvcmVTZW5kOiAoanFYaHIsIHNldHRpbmdzKSA9PiB7XHJcbiAgICAgIGlmIChvcHRpb25zLm9uQmVmb3JlU2VuZCkge1xyXG4gICAgICAgIG9wdGlvbnMub25CZWZvcmVTZW5kKGpxWGhyLCBzZXR0aW5ncyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG5vdGlmeUVycm9yID0gb3B0aW9ucz8ubm90aWZ5RXJyb3IgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLm5vdGlmeUVycm9yO1xyXG5cclxuICAgICAgc2V0dGluZ3MuZGF0YUZpbHRlciA9IChyYXdSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlczogSUFwaVJlc3BvbnNlPGFueT4gPSBKU09OLnBhcnNlKHJhd1Jlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgaWYgKHJlcy5SZXF1ZXN0U3RhdGUgPT09IFJlcXVlc3RTdGF0ZS5Db21wbGV0ZWQpIHtcclxuICAgICAgICAgIHJldHVybiBoYW5kbGVTdWNjZXNzKHJlcywgb3B0aW9ucy5ub3RpZnlTdWNjZXNzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShoYW5kbGVFcnJvcihyZXMsIG5vdGlmeUVycm9yLCBvcHRpb25zPy5nZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UpKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHNldHRpbmdzLmVycm9yID0gKHhocjogSlF1ZXJ5WEhSKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzOiBJQXBpUmVzcG9uc2U8YW55PiA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCB8fCAne30nKTtcclxuXHJcbiAgICAgICAgLy8gTk9URTogZm9yIHVuaGFuZGxlZCBlcnJvcnMgb24gdGhlIHNlcnZlclxyXG4gICAgICAgIGlmICghcmVzLlJlcXVlc3RTdGF0ZSkge1xyXG4gICAgICAgICAgaGFuZGxlRXJyb3IocmVzLCBub3RpZnlFcnJvciwgb3B0aW9ucz8uZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIChzdG9yZSBhcyBhbnkpLl9lcnJvckhhbmRsZXIgPSAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgaWYgKGVycm9yICYmICFlcnJvci5tZXNzYWdlKSB7XHJcbiAgICAgIGVycm9yLm1lc3NhZ2UgPSBnZXREZWZhdWx0RXJyb3JNZXNzYWdlKCk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIHN0b3JlO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4vUmVxdWVzdCc7XHJcblxyXG5jb25zdCBsb2FkUHJvbWlzZXM6IHsgW3VybDogc3RyaW5nXTogSlF1ZXJ5RGVmZXJyZWQ8YW55PiB9ID0ge307XHJcblxyXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbjxUPih1cmw6IHN0cmluZykge1xyXG4gIGlmIChsb2FkUHJvbWlzZXNbdXJsXSkge1xyXG4gICAgcmV0dXJuIGF3YWl0IGxvYWRQcm9taXNlc1t1cmxdO1xyXG4gIH1cclxuXHJcbiAgbG9hZFByb21pc2VzW3VybF0gPSBzZW5kUmVxdWVzdDxUPih1cmwpO1xyXG4gIGxvYWRQcm9taXNlc1t1cmxdLmNhdGNoKChlcnIpID0+IHtcclxuICAgIGxvYWRQcm9taXNlc1t1cmxdID0gbnVsbDtcclxuXHJcbiAgICB0aHJvdyBlcnI7XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHJlc3VsdDogVCA9IGF3YWl0IGxvYWRQcm9taXNlc1t1cmxdO1xyXG5cclxuICBsb2FkUHJvbWlzZXNbdXJsXSA9IG51bGw7XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IHNlbmRSZXF1ZXN0LCBoYW5kbGVFcnJvciwgaGFuZGxlU3VjY2VzcywgaGFuZGxlVXBsb2FkIH0gZnJvbSAnLi9SZXF1ZXN0JztcclxuaW1wb3J0IHsgaXNFcnJvckluZm8gfSBmcm9tICcuL0FwaVJlc3BvbnNlJztcclxuaW1wb3J0IHsgY3JlYXRlRHhEYXRhU291cmNlIH0gZnJvbSAnLi9EeERhdGFTb3VyY2UnO1xyXG5pbXBvcnQgKiBhcyBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbiBmcm9tICcuL0xvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uJztcclxuXHJcbi8vIFRPRE86IGV4cG9ydCB0eXBlXHJcbmV4cG9ydCB7IElBcGlSZXNwb25zZSwgSUVycm9ySW5mbyB9IGZyb20gJy4vQXBpUmVzcG9uc2UnO1xyXG5leHBvcnQgeyBJRHhEYXRhU291cmNlT3B0aW9ucyB9IGZyb20gJy4vRHhEYXRhU291cmNlJztcclxuZXhwb3J0IHsgSUxvZ29TZXR0aW5ncyB9IGZyb20gJy4vSUxvZ29TZXR0aW5ncyc7XHJcbmV4cG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICBzZW5kUmVxdWVzdCxcclxuICBoYW5kbGVFcnJvcixcclxuICBoYW5kbGVTdWNjZXNzLFxyXG4gIGhhbmRsZVVwbG9hZCxcclxuICBjcmVhdGVEeERhdGFTb3VyY2UsXHJcbiAgaXNFcnJvckluZm8sXHJcbiAgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb25cclxufTtcclxuIiwgImV4cG9ydCBpbnRlcmZhY2UgSVJlbmRlcmVkIHtcclxuICByZW5kZXIoKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGVzdHJveWFibGUge1xyXG4gIGRlc3Ryb3koKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGlzRGVzdHJveWFibGUgPSAob2JqOiBhbnkpOiBvYmogaXMgSURlc3Ryb3lhYmxlID0+IHtcclxuICByZXR1cm4gdHlwZW9mIG9iai5kZXN0cm95ID09PSAnZnVuY3Rpb24nO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IHRocm93UmVuZGVyRXJyb3IgPSAoZWxlbWVudE5hbWU/OiBzdHJpbmcpOiBuZXZlciA9PiB7XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBwcmVmZXItdGVtcGxhdGVcclxuICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByZXF1aXJlZCAke2VsZW1lbnROYW1lID8gKGAke2VsZW1lbnROYW1lICB9IGApIDogJyd9IGlzbid0IGNyZWF0ZWRgKTtcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIERlZXBSZWFkb25seTxUPiA9IHtcclxuICByZWFkb25seSBbUCBpbiBrZXlvZiBUXTogKFxyXG4gICAgVFtQXSBleHRlbmRzIEFycmF5PGluZmVyIFUxPiA/IFJlYWRvbmx5QXJyYXk8RGVlcFJlYWRvbmx5PFUxPj4gOiAoXHJcbiAgICAgIFRbUF0gZXh0ZW5kcyBNYXA8aW5mZXIgSywgaW5mZXIgVTI+ID8gUmVhZG9ubHlNYXA8SywgRGVlcFJlYWRvbmx5PFUyPj4gOiAoXHJcbiAgICAgICAgVFtQXSBleHRlbmRzIFNldDxpbmZlciBVMz4gPyBSZWFkb25seVNldDxEZWVwUmVhZG9ubHk8VTM+PiA6IChcclxuICAgICAgICAgIFRbUF0gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFRbUF0gOiAoXHJcbiAgICAgICAgICAgIERlZXBSZWFkb25seTxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBEZWVwUGFydGlhbDxUPiA9IHtcclxuICBbUCBpbiBrZXlvZiBUXT86IChcclxuICAgIFRbUF0gZXh0ZW5kcyBBcnJheTxpbmZlciBVMT4gPyBBcnJheTxEZWVwUGFydGlhbDxVMT4+IDogKFxyXG4gICAgICBUW1BdIGV4dGVuZHMgTWFwPGluZmVyIEssIGluZmVyIFUyPiA/IE1hcDxLLCBEZWVwUGFydGlhbDxVMj4+IDogKFxyXG4gICAgICAgIFRbUF0gZXh0ZW5kcyBTZXQ8aW5mZXIgVTM+ID8gU2V0PERlZXBQYXJ0aWFsPFUzPj4gOiAoXHJcbiAgICAgICAgICBUW1BdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBUW1BdIDogKFxyXG4gICAgICAgICAgICBEZWVwUGFydGlhbDxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBEZWVwUmVxdWlyZWQ8VD4gPSB7XHJcbiAgW1AgaW4ga2V5b2YgVF0tPzogKFxyXG4gICAgVFtQXSBleHRlbmRzIEFycmF5PGluZmVyIFUxPiA/IEFycmF5PERlZXBSZXF1aXJlZDxVMT4+IDogKFxyXG4gICAgICBUW1BdIGV4dGVuZHMgTWFwPGluZmVyIEssIGluZmVyIFUyPiA/IE1hcDxLLCBEZWVwUmVxdWlyZWQ8VTI+PiA6IChcclxuICAgICAgICBUW1BdIGV4dGVuZHMgU2V0PGluZmVyIFUzPiA/IFNldDxEZWVwUmVxdWlyZWQ8VTM+PiA6IChcclxuICAgICAgICAgIFRbUF0gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFRbUF0gOiAoXHJcbiAgICAgICAgICAgIERlZXBSZXF1aXJlZDxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBNdXRhYmxlPFQ+ID0ge1xyXG4gIC1yZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXTtcclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCB7IERlZXBSZWFkb25seSB9IGZyb20gJy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4uL0hlYWRlci9JTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFVybEJ5TWVudUl0ZW1EYXRhKGl0ZW1EYXRhOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfCBEZWVwUmVhZG9ubHk8SU5hdmlnYXRpb25NZW51SXRlbU1vZGVsPikge1xyXG4gIGNvbnN0IHsgQXJlYSwgQ29udHJvbGxlciwgQWN0aW9uLCBJc0NsaWNrYWJsZSB9ID0gaXRlbURhdGE7XHJcblxyXG4gIGlmIChJc0NsaWNrYWJsZSAmJiBDb250cm9sbGVyKSB7XHJcbiAgICByZXR1cm4gQXJlYSA/IGVuY29kZVVSSShgLyR7QXJlYX0vJHtDb250cm9sbGVyfS8ke0FjdGlvbn1gKSA6IGVuY29kZVVSSShgLyR7Q29udHJvbGxlcn0vJHtBY3Rpb259YCk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgeyBXaW5kb3dSZXNpemVMaXN0ZW5lciwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMgfSBmcm9tICcuL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyJztcclxuZXhwb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQgfSBmcm9tICcuL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyJztcclxuIiwgImltcG9ydCB7IElEZXN0cm95YWJsZSB9IGZyb20gJy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElMYXlvdXRCcmVha3BvaW50IHtcclxuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgbWluV2lkdGg6IG51bWJlcjtcclxuICByZWFkb25seSBtYXhXaWR0aDogbnVtYmVyO1xyXG59XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGludGVyZmFjZS1uYW1lXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0QnJlYWtwb2ludENoYW5nZWRFdmVudCB7XHJcbiAgcmVhZG9ubHkgcHJldmlvdXNCcmVha3BvaW50OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICByZWFkb25seSBjdXJyZW50QnJlYWtwb2ludDogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgcmVhZG9ubHkgb3JpZ2luYWxFdmVudDogVUlFdmVudDtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzID0ge1xyXG4gIHhzOiB7XHJcbiAgICBuYW1lOiAneHMnLFxyXG4gICAgbWluV2lkdGg6IDAsXHJcbiAgICBtYXhXaWR0aDogNTc1XHJcbiAgfSxcclxuICBzbToge1xyXG4gICAgbmFtZTogJ3NtJyxcclxuICAgIG1pbldpZHRoOiA1NzYsXHJcbiAgICBtYXhXaWR0aDogNzY3XHJcbiAgfSxcclxuICBtZDoge1xyXG4gICAgbmFtZTogJ21kJyxcclxuICAgIG1pbldpZHRoOiA3NjgsXHJcbiAgICBtYXhXaWR0aDogOTkxXHJcbiAgfSxcclxuICBsZzoge1xyXG4gICAgbmFtZTogJ2xnJyxcclxuICAgIG1pbldpZHRoOiA5OTIsXHJcbiAgICBtYXhXaWR0aDogMTE5OVxyXG4gIH0sXHJcbiAgeGw6IHtcclxuICAgIG5hbWU6ICd4bCcsXHJcbiAgICBtaW5XaWR0aDogMTIwMCxcclxuICAgIG1heFdpZHRoOiBJbmZpbml0eVxyXG4gIH1cclxufSBhcyBjb25zdDtcclxuXHJcbmNvbnN0IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzTGlzdDogcmVhZG9ubHkgSUxheW91dEJyZWFrcG9pbnRbXSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzKVxyXG4gIC5tYXAoKGJyZWFrcG9pbnROYW1lKSA9PiBib290c3RyYXBMYXlvdXRCcmVha3BvaW50c1ticmVha3BvaW50TmFtZV0pO1xyXG5cclxuZXhwb3J0IGNsYXNzIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyIGltcGxlbWVudHMgSURlc3Ryb3lhYmxlIHtcclxuICBwdWJsaWMgY3VycmVudExheW91dEJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25XaW5kb3dSZXNpemVMaXN0ZW5lciA9IHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKTtcclxuXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxheW91dEJyZWFrcG9pbnRzOiByZWFkb25seSBJTGF5b3V0QnJlYWtwb2ludFtdO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSByZXNpemVEZWxheTogbnVtYmVyO1xyXG4gIC8vIFRPRE86IHVzZSBtdWx0aXBsZSBldmVudCBsaXN0ZW5lclxyXG4gIHByb3RlY3RlZCByZWFkb25seSBvblJlc2l6ZTogKChlOiBVSUV2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZDogKChlOiBMYXlvdXRCcmVha3BvaW50Q2hhbmdlZEV2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcm90ZWN0ZWQgbGFzdFdpbmRvd1Jlc2l6ZVRpbWVvdXRJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIG9uUmVzaXplPzogKGU6IFVJRXZlbnQpID0+IHZvaWQsXHJcbiAgICBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkPzogKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpID0+IHZvaWQsXHJcbiAgICByZXNpemVEZWxheSA9IDEwMCxcclxuICAgIGxheW91dEJyZWFrcG9pbnRzOiByZWFkb25seSBJTGF5b3V0QnJlYWtwb2ludFtdID0gYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHNMaXN0XHJcbiAgKSB7XHJcbiAgICB0aGlzLm9uUmVzaXplID0gb25SZXNpemU7XHJcbiAgICB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWQgPSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkO1xyXG4gICAgdGhpcy5yZXNpemVEZWxheSA9IHJlc2l6ZURlbGF5O1xyXG4gICAgdGhpcy5sYXlvdXRCcmVha3BvaW50cyA9IGxheW91dEJyZWFrcG9pbnRzO1xyXG5cclxuICAgIHRoaXMuY3VycmVudExheW91dEJyZWFrcG9pbnQgPSB0aGlzLmdldExheW91dEJyZWFrcG9pbnRCeVdpbmRvd1dpZHRoKHdpbmRvdy5pbm5lcldpZHRoKTtcclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGV0YWNoRXZlbnRzKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXR0YWNoRXZlbnRzKCkge1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25XaW5kb3dSZXNpemVMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZGV0YWNoRXZlbnRzKCkge1xyXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25XaW5kb3dSZXNpemVMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0TGF5b3V0QnJlYWtwb2ludEJ5V2luZG93V2lkdGgod2luZG93V2lkdGg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMubGF5b3V0QnJlYWtwb2ludHMuZmluZCgobGF5b3V0QnJlYWtwb2ludCkgPT4ge1xyXG4gICAgICByZXR1cm4gbGF5b3V0QnJlYWtwb2ludC5taW5XaWR0aCA8PSB3aW5kb3dXaWR0aCAmJiAoIWxheW91dEJyZWFrcG9pbnQubWF4V2lkdGggfHwgbGF5b3V0QnJlYWtwb2ludC5tYXhXaWR0aCA+PSB3aW5kb3dXaWR0aCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvbldpbmRvd1Jlc2l6ZShlOiBVSUV2ZW50KSB7XHJcbiAgICBjbGVhclRpbWVvdXQodGhpcy5sYXN0V2luZG93UmVzaXplVGltZW91dElkKTtcclxuICAgIHRoaXMubGFzdFdpbmRvd1Jlc2l6ZVRpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMub25XaW5kb3dSZXNpemVJbnRlcm5hbChlKSwgdGhpcy5yZXNpemVEZWxheSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25XaW5kb3dSZXNpemVJbnRlcm5hbChlOiBVSUV2ZW50KSB7XHJcbiAgICBjb25zdCBsYXlvdXRCcmVha3BvaW50ID0gdGhpcy5nZXRMYXlvdXRCcmVha3BvaW50QnlXaW5kb3dXaWR0aCh3aW5kb3cuaW5uZXJXaWR0aCk7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50TGF5b3V0QnJlYWtwb2ludCAhPT0gbGF5b3V0QnJlYWtwb2ludCkge1xyXG4gICAgICBjb25zdCBwcmV2aW91c0xheW91dEJyZWFrcG9pbnQgPSB0aGlzLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50O1xyXG4gICAgICB0aGlzLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50ID0gbGF5b3V0QnJlYWtwb2ludDtcclxuXHJcbiAgICAgIHRoaXMuZW1pdEJyZWFrcG9pbnRDaGFuZ2VkKHtcclxuICAgICAgICBwcmV2aW91c0JyZWFrcG9pbnQ6IHByZXZpb3VzTGF5b3V0QnJlYWtwb2ludCxcclxuICAgICAgICBjdXJyZW50QnJlYWtwb2ludDogdGhpcy5jdXJyZW50TGF5b3V0QnJlYWtwb2ludCxcclxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZW1pdFJlc2l6ZUV2ZW50KGUpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRSZXNpemVFdmVudChlOiBVSUV2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uUmVzaXplPy4oZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMub25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZD8uKGUpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiZXhwb3J0IGludGVyZmFjZSBJQ29uZmlnIHtcclxuICBpc0xlZ2FjeVJlbmRlcj86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBjb25maWc6IElDb25maWcgPSB7XHJcbiAgaXNMZWdhY3lSZW5kZXI6IGZhbHNlXHJcbn07XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJVXNlck1lbnVJdGVtTW9kZWwsIElCYWRnZU1vZGVsIH0gZnJvbSAnLi9JVXNlck1lbnVJdGVtJztcclxuaW1wb3J0IHsgdGhyb3dSZW5kZXJFcnJvciwgRGVlcFJlYWRvbmx5IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyLCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cywgTGF5b3V0QnJlYWtwb2ludENoYW5nZWRFdmVudCB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuLi9Db25maWcvSW5kZXgnO1xyXG5cclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBpbnRlcmZhY2UtbmFtZVxyXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJNZW51SXRlbUNsaWNrRXZlbnQge1xyXG4gIHJlYWRvbmx5IGl0ZW06IERlZXBSZWFkb25seTxJVXNlck1lbnVJdGVtTW9kZWw+O1xyXG4gIHJlYWRvbmx5IG9yaWdpbmFsRXZlbnQ6IFVJRXZlbnQ7XHJcbiAgY2FuY2VsPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVXNlck1lbnVPcHRpb25zIHtcclxuICBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgdXNlckF2YXRhcjogc3RyaW5nO1xyXG4gIGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXTtcclxuICBjb2xsYXBzZUJyZWFrcG9pbnQ/OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBnZXREaXNwbGF5ZWRVc2VySW5mbz86ICh1c2VyTmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XHJcbiAgb25JdGVtQ2xpY2s/OiAoZTogVXNlck1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFVzZXJNZW51IHtcclxuICBwcm90ZWN0ZWQgc3RhdGljIGRlZmF1bHRHZXREaXNwbGF5ZWRVc2VySW5mbzogKHVzZXJOYW1lOiBzdHJpbmcpID0+IHN0cmluZyA9ICh1c2VyTmFtZSkgPT4gYFdlbGNvbWUgJHt1c2VyTmFtZX1gO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VyTmFtZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlckF2YXRhcjogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0RGlzcGxheWVkVXNlckluZm86ICh1c2VyTmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb2xsYXBzZUJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgd2luZG93UmVzaXplTGlzdGVuZXI6IFdpbmRvd1Jlc2l6ZUxpc3RlbmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZExpc3RlbmVyID0gdGhpcy5vbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkLmJpbmQodGhpcyk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkl0ZW1DbGljazogKChlOiBVc2VyTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXTtcclxuICAvLyBFbGVtZW50c1xyXG4gIHByaXZhdGUgX3Jvb3Q6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgbW9iaWxlQ29udGVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBkZXNrdG9wUm9vdERyb3Bkb3duOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGRlc2t0b3BDb250ZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGRlc2t0b3BDb250ZW50VHJpZ2dlcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSB1c2VySW5mb0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSB1c2VySW5mb0RpdmlkZXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgaXRlbXNDb250YWluZXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwdWJsaWMgZ2V0IHJvb3QoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcm9vdDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElVc2VyTWVudU9wdGlvbnMpIHtcclxuICAgIHRoaXMuY29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXI7XHJcbiAgICB0aGlzLnVzZXJBdmF0YXIgPSBvcHRpb25zLnVzZXJBdmF0YXI7XHJcbiAgICB0aGlzLnVzZXJOYW1lID0gb3B0aW9ucy51c2VyTmFtZTtcclxuICAgIHRoaXMuaXRlbXMgPSBvcHRpb25zLml0ZW1zO1xyXG4gICAgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQgPSBvcHRpb25zLmNvbGxhcHNlQnJlYWtwb2ludCB8fCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cy5tZDtcclxuICAgIHRoaXMuZ2V0RGlzcGxheWVkVXNlckluZm8gPSBvcHRpb25zLmdldERpc3BsYXllZFVzZXJJbmZvIHx8IFVzZXJNZW51LmRlZmF1bHRHZXREaXNwbGF5ZWRVc2VySW5mbztcclxuICAgIHRoaXMub25JdGVtQ2xpY2sgPSBvcHRpb25zLm9uSXRlbUNsaWNrO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIodW5kZWZpbmVkLCB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWRMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgaWYgKHRoaXMuX3Jvb3QpIHtcclxuICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5fcm9vdCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW5kZXJNYWluRWxlbWVudHMoKTtcclxuICAgIHRoaXMucmVuZGVyVXNlckluZm8oKTtcclxuICAgIHRoaXMucmVuZGVySXRlbXMoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMucm9vdCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWRkSXRlbXMoaXRlbXM6IElVc2VyTWVudUl0ZW1Nb2RlbFtdKSB7XHJcbiAgICB0aGlzLml0ZW1zID0gdGhpcy5pdGVtcy5jb25jYXQoaXRlbXMpO1xyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbnNlcnRJdGVtcyhpdGVtczogSVVzZXJNZW51SXRlbU1vZGVsW10sIHBvc2l0aW9uOiBudW1iZXIpIHtcclxuICAgIHRoaXMuaXRlbXMuc3BsaWNlKHBvc2l0aW9uLCAwLCAuLi5pdGVtcyk7XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZUl0ZW1zKGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXSkge1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgbWVudUl0ZW1zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXRlbXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QmFkZ2UoaXRlbU5hbWU6IHN0cmluZyk6IElCYWRnZU1vZGVsIHwgbnVsbCB7XHJcbiAgICBjb25zdCBtZW51SXRlbSA9IHRoaXMuaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5UZXh0Py50b0xvd2VyQ2FzZSgpID09PSBpdGVtTmFtZSk7XHJcblxyXG4gICAgcmV0dXJuIG1lbnVJdGVtPy5CYWRnZSB8fCBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEJhZGdlKGl0ZW1OYW1lOiBzdHJpbmcsIGJhZGdlOiBJQmFkZ2VNb2RlbCkge1xyXG4gICAgY29uc3QgbWVudUl0ZW0gPSB0aGlzLml0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uVGV4dD8udG9Mb3dlckNhc2UoKSA9PT0gaXRlbU5hbWUpO1xyXG5cclxuICAgIGlmIChtZW51SXRlbSkge1xyXG4gICAgICBtZW51SXRlbS5CYWRnZSA9IGJhZGdlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0IGlzTW9iaWxlVmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1heFdpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWF4V2lkdGg7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVuZGVyTWFpbkVsZW1lbnRzKCkge1xyXG4gICAgdGhpcy5fcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5fcm9vdC5jbGFzc0xpc3QuYWRkKCd1c2VyLW1lbnUnKTtcclxuXHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMubW9iaWxlQ29udGVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKC8qJ25hdmJhci1uYXYnLCAqL2BkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tbm9uZWApO1xyXG5cclxuICAgIHRoaXMuZGVza3RvcFJvb3REcm9wZG93biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5kZXNrdG9wUm9vdERyb3Bkb3duLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duJywgJ2Qtbm9uZScsIGBkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tYmxvY2tgKTtcclxuXHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudFRyaWdnZXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyX19pY29uLWJ1dHRvbicsICdidG4nLCAnYnRuLW91dGxpbmUtbGlnaHQnKTtcclxuICAgIHRoaXMuZGVza3RvcENvbnRlbnRUcmlnZ2VyLnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTtcclxuICAgIHRoaXMuZGVza3RvcENvbnRlbnRUcmlnZ2VyLnNldEF0dHJpYnV0ZSgnZGF0YS10b2dnbGUnLCAnZHJvcGRvd24nKTtcclxuXHJcbiAgICBsZXQgYXZhdGFyO1xyXG4gICAgaWYgKGNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICBpZiAodGhpcy51c2VyQXZhdGFyKSB7XHJcbiAgICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XHJcbiAgICAgICAgYXZhdGFyLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24taWNvbicsICdoZWFkZXJfX2ljb24tYnV0dG9uLWF2YXRhcicpO1xyXG4gICAgICAgIGF2YXRhci5zcmMgPSB0aGlzLnVzZXJBdmF0YXI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgICAgIGF2YXRhci5jbGFzc0xpc3QuYWRkKCdoZWFkZXJfX2ljb24tYnV0dG9uLWljb24nLCAnZmFzJywgJ2ZhLXVzZXInKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgICBhdmF0YXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyX19pY29uLWJ1dHRvbi1pY29uJywgJ2lzb3otaWNvbi11c2VyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51JywgJ2Ryb3Bkb3duLW1lbnUtcmlnaHQnKTtcclxuXHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlci5hcHBlbmRDaGlsZChhdmF0YXIpO1xyXG5cclxuICAgIGlmICh0aGlzLml0ZW1zLnNvbWUoKGl0ZW0pID0+ICEhaXRlbS5CYWRnZSkpIHtcclxuICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgIGJhZGdlLmNsYXNzTGlzdC5hZGQoJ3VzZXItbWVudV9fYmFkZ2UnKTtcclxuICAgICAgdGhpcy5kZXNrdG9wQ29udGVudFRyaWdnZXIuYXBwZW5kQ2hpbGQoYmFkZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGVza3RvcFJvb3REcm9wZG93bi5hcHBlbmRDaGlsZCh0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlcik7XHJcbiAgICB0aGlzLmRlc2t0b3BSb290RHJvcGRvd24uYXBwZW5kQ2hpbGQodGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5pdGVtc0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XHJcbiAgICB0aGlzLml0ZW1zQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3VzZXItbWVudV9faXRlbXMnKTtcclxuXHJcbiAgICBpZiAoY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgIHRoaXMudXNlckluZm9Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoNicpO1xyXG4gICAgICB0aGlzLnVzZXJJbmZvQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3VzZXItaW5mbycsICdoNicpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCd1c2VyLWluZm8nLCAnZHJvcGRvd24taXRlbScpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXNlckluZm9EaXZpZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLnVzZXJJbmZvRGl2aWRlci5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1kaXZpZGVyJywgJ2Qtbm9uZScsIGBkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tYmxvY2tgKTtcclxuXHJcbiAgICBpZiAodGhpcy5pc01vYmlsZVZpZXcpIHtcclxuICAgICAgdGhpcy5tb2JpbGVDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9Db250YWluZXIpO1xyXG4gICAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy51c2VySW5mb0RpdmlkZXIpO1xyXG4gICAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5pdGVtc0NvbnRhaW5lcik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9Db250YWluZXIpO1xyXG4gICAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9EaXZpZGVyKTtcclxuICAgICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLml0ZW1zQ29udGFpbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9yb290LmFwcGVuZENoaWxkKHRoaXMubW9iaWxlQ29udGVudENvbnRhaW5lcik7XHJcbiAgICB0aGlzLl9yb290LmFwcGVuZENoaWxkKHRoaXMuZGVza3RvcFJvb3REcm9wZG93bik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVuZGVyVXNlckluZm8oKSB7XHJcbiAgICBpZiAoIXRoaXMudXNlckluZm9Db250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3VzZXJJbmZvQ29udGFpbmVyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICBjb25zdCB1c2VySW5mb0NvbnRlbnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICB1c2VySW5mb0NvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3VzZXItaW5mb19fY29udGVudCcpO1xyXG4gICAgICB1c2VySW5mb0NvbnRlbnRFbGVtZW50LmlubmVyVGV4dCA9IHRoaXMuZ2V0RGlzcGxheWVkVXNlckluZm8odGhpcy51c2VyTmFtZSk7XHJcblxyXG4gICAgICB0aGlzLnVzZXJJbmZvQ29udGFpbmVyLmFwcGVuZENoaWxkKHVzZXJJbmZvQ29udGVudEVsZW1lbnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lci5pbm5lclRleHQgPSB0aGlzLmdldERpc3BsYXllZFVzZXJJbmZvKHRoaXMudXNlck5hbWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlckl0ZW1zKCkge1xyXG4gICAgaWYgKCF0aGlzLml0ZW1zQ29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdpdGVtc0NvbnRhaW5lcicpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2xlYXJJdGVtc0NvbnRhaW5lcigpO1xyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtRWxlbWVudChpdGVtLCB0aGlzLmlzTW9iaWxlVmlldyk7XHJcbiAgICAgIHRoaXMuaXRlbXNDb250YWluZXIhLmFwcGVuZENoaWxkKGl0ZW1FbGVtZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUl0ZW1FbGVtZW50KGl0ZW06IElVc2VyTWVudUl0ZW1Nb2RlbCwgaXNNb2JpbGU6IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtRWxlbWVudEJhc2UoaXRlbSk7XHJcblxyXG4gICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBsaW5rRWxlbWVudC5jbGFzc0xpc3QuYWRkKGlzTW9iaWxlID8gJ25hdi1saW5rJyA6ICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICBsaW5rRWxlbWVudC5ocmVmID0gaXRlbS5VcmwgfHwgJ2phdmFzY3JpcHQ6dm9pZCgwKSc7XHJcbiAgICBsaW5rRWxlbWVudC50ZXh0ID0gaXRlbS5UZXh0O1xyXG4gICAgaWYoaXRlbS5PcGVuSW5OZXdQYWdlKSB7XHJcbiAgICAgIGxpbmtFbGVtZW50LnRhcmdldCA9ICdfYmxhbmsnO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzVG9JdGVtKGxpbmtFbGVtZW50LCBpdGVtKTtcclxuICAgIGl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKGxpbmtFbGVtZW50KTtcclxuXHJcbiAgICBpZiAoaXRlbS5CYWRnZSkge1xyXG4gICAgICBjb25zdCBiYWRnZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaXNvei1iYWRnZScpO1xyXG4gICAgICBiYWRnZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdpc296LWJhZGdlLS1jaXJjbGUnKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuY2xhc3NMaXN0LmFkZChgaXNvei1iYWRnZS0tJHtpdGVtLkJhZGdlLlR5cGUgfHwgJ2luZm9ybWF0aW9uJ31gKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuaW5uZXJIVE1MID0gaXRlbS5CYWRnZS5UZXh0O1xyXG5cclxuICAgICAgbGlua0VsZW1lbnQuYXBwZW5kQ2hpbGQoYmFkZ2VsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpdGVtRWxlbWVudDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVJdGVtRWxlbWVudEJhc2UoaXRlbTogSVVzZXJNZW51SXRlbU1vZGVsKSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCduYXYtaXRlbScpO1xyXG5cclxuICAgIHJldHVybiBpdGVtRWxlbWVudDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhdHRhY2hFdmVudHNUb0l0ZW0oaXRlbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpdGVtOiBJVXNlck1lbnVJdGVtTW9kZWwpIHtcclxuICAgIGl0ZW1FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHRoaXMub25NZW51SXRlbUNsaWNrKHtcclxuICAgICAgaXRlbSxcclxuICAgICAgb3JpZ2luYWxFdmVudDogZVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHN3aXRjaFZpZXcoaXNNb2JpbGU6IGJvb2xlYW4pIHtcclxuICAgIGlmIChpc01vYmlsZSkge1xyXG4gICAgICB0aGlzLmFwcGx5TW9iaWxlVmlld0ZvclVzZXJJbmZvKCk7XHJcbiAgICAgIHRoaXMuYXBwbHlNb2JpbGVWaWV3Rm9ySXRlbXMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYXBwbHlEZXNrdG9wVmlld0ZvclVzZXJJbmZvKCk7XHJcbiAgICAgIHRoaXMuYXBwbHlEZXNrdG9wVmlld0Zvckl0ZW1zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlNb2JpbGVWaWV3Rm9yVXNlckluZm8oKSB7XHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMudXNlckluZm9Db250YWluZXIsIG51bGwpO1xyXG4gICAgdGhpcy5tb2JpbGVDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLnVzZXJJbmZvRGl2aWRlciwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlEZXNrdG9wVmlld0ZvclVzZXJJbmZvKCkge1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy51c2VySW5mb0NvbnRhaW5lciwgbnVsbCk7XHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLnVzZXJJbmZvRGl2aWRlciwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlNb2JpbGVWaWV3Rm9ySXRlbXMoKSB7XHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMuaXRlbXNDb250YWluZXIsIG51bGwpO1xyXG5cclxuICAgIGZvciAoY29uc3QgaXRlbUVsZW1lbnQgb2YgdGhpcy5pdGVtc0NvbnRhaW5lci5jaGlsZHJlbikge1xyXG4gICAgICBpdGVtRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZD8uY2xhc3NMaXN0LnJlcGxhY2UoJ2Ryb3Bkb3duLWl0ZW0nLCAnbmF2LWxpbmsnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseURlc2t0b3BWaWV3Rm9ySXRlbXMoKSB7XHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLml0ZW1zQ29udGFpbmVyLCBudWxsKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGl0ZW1FbGVtZW50IG9mIHRoaXMuaXRlbXNDb250YWluZXIuY2hpbGRyZW4pIHtcclxuICAgICAgaXRlbUVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ/LmNsYXNzTGlzdC5yZXBsYWNlKCduYXYtbGluaycsICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2xlYXJJdGVtc0NvbnRhaW5lcigpIHtcclxuICAgIHdoaWxlICh0aGlzLml0ZW1zQ29udGFpbmVyLmZpcnN0Q2hpbGQpIHtcclxuICAgICAgdGhpcy5pdGVtc0NvbnRhaW5lci5maXJzdENoaWxkLnJlbW92ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRJdGVtQ2xpY2soZTogVXNlck1lbnVJdGVtQ2xpY2tFdmVudCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5vbkl0ZW1DbGljaz8uKGUpO1xyXG4gICAgICBlLml0ZW0uT25DbGljaz8uKGUpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRoaXMuc3dpdGNoVmlldyh0aGlzLmlzTW9iaWxlVmlldyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uTWVudUl0ZW1DbGljayhlOiBVc2VyTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0aGlzLmVtaXRJdGVtQ2xpY2soZSk7XHJcblxyXG4gICAgaWYgKGUuY2FuY2VsKSB7XHJcbiAgICAgIGUub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSVJlbmRlcmVkIH0gZnJvbSAnLi4vQ29yZSc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4uLy4uL0hlYWRlcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElNZW51SXRlbSB7XHJcbiAgdGV4dDogc3RyaW5nO1xyXG4gIGljb24/OiBzdHJpbmc7XHJcbiAgaXRlbXM/OiBJTWVudUl0ZW1bXTtcclxuICB1cmw/OiBzdHJpbmc7XHJcbiAgaGlkZGVuPzogYm9vbGVhbjtcclxuICBhY3RpdmU/OiBib29sZWFuO1xyXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcclxuICB0aXRsZT86IHN0cmluZztcclxuICBtZW51SXRlbUVsPzogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgb3JpZ2luYWxNb2RlbDogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsO1xyXG59XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGludGVyZmFjZS1uYW1lXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVudUl0ZW1DbGlja0V2ZW50IHtcclxuICByZWFkb25seSBpdGVtOiBJTWVudUl0ZW07XHJcbiAgcmVhZG9ubHkgb3JpZ2luYWxFdmVudDogVUlFdmVudDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTWVudU9wdGlvbnMge1xyXG4gIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgaXRlbXM6IElNZW51SXRlbVtdO1xyXG4gIG9uSXRlbUNsaWNrPzogKGU6IE1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1lbnUgaW1wbGVtZW50cyBJUmVuZGVyZWQge1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByb3RlY3RlZCBpdGVtczogSU1lbnVJdGVtW107XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9uSXRlbUNsaWNrOiAoKGU6IE1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbiAgLy8gZWxlbWVudHNcclxuICBwcm90ZWN0ZWQgcm9vdDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElNZW51T3B0aW9ucykge1xyXG4gICAgdGhpcy5jb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjtcclxuICAgIHRoaXMuaXRlbXMgPSBvcHRpb25zLml0ZW1zO1xyXG4gICAgdGhpcy5vbkl0ZW1DbGljayA9IG9wdGlvbnMub25JdGVtQ2xpY2s7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWJzdHJhY3QgcmVuZGVyKCk6IHZvaWQ7XHJcbiAgcHVibGljIHVwZGF0ZUl0ZW1zKGl0ZW1zOiBJTWVudUl0ZW1bXSkge1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRJdGVtQ2xpY2soZTogTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uSXRlbUNsaWNrPy4oZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBNZW51LCBJTWVudU9wdGlvbnMsIElNZW51SXRlbSB9IGZyb20gJy4vTWVudSc7XHJcbmltcG9ydCB7IHRocm93UmVuZGVyRXJyb3IgfSBmcm9tICcuLi9Db3JlJztcclxuaW1wb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyLCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cyB9IGZyb20gJy4uLy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwsIGlzSXRlbUFjdGl2ZSB9IGZyb20gJy4uLy4uL0hlYWRlcic7XHJcblxyXG5leHBvcnQgZW51bSBDb2xsYXBzaW5nTW9kZSB7XHJcbiAgRGlzYWJsZWQsXHJcbiAgQ29sbGFwc2VkLFxyXG4gIEV4cGFuZGVkLFxyXG4gIEFkYXB0aXZlQ29sbGFwc2luZ1xyXG59XHJcblxyXG50eXBlIEl0ZW1BY3Rpb25Nb2RlID0gJ2hvdmVyJyB8ICdjbGljayc7XHJcbmV4cG9ydCBpbnRlcmZhY2UgSUJvb3RzdHJhcENvbGxhcHNpbmdNZW51T3B0aW9ucyBleHRlbmRzIElNZW51T3B0aW9ucyB7XHJcbiAgaXRlbUFjdGlvbj86IEl0ZW1BY3Rpb25Nb2RlO1xyXG4gIGNvbGxhcHNpbmdNb2RlPzogQ29sbGFwc2luZ01vZGU7XHJcbiAgY29sbGFwc2VCcmVha3BvaW50PzogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgY29sbGFwc2VJY29uPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUgZXh0ZW5kcyBNZW51IHtcclxuICBwcm90ZWN0ZWQgc3RhdGljIEhPVkVSX01PREVfQ1NTX0NMQVNTID0gJ25hdmJhci1uYXZfaG92ZXItYWN0aW9uJztcclxuICBwcm90ZWN0ZWQgc3RhdGljIGFkYXB0aXZpdHlDb2xsYXBzaW5nRGVsYXkgPSA1MDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXRlbUFjdGlvbk1vZGU6IEl0ZW1BY3Rpb25Nb2RlO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBjb2xsYXBzaW5nTW9kZTogQ29sbGFwc2luZ01vZGU7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbGxhcHNlSWNvbk5hbWU6IHN0cmluZztcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29sbGFwc2VCcmVha3BvaW50OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgd2luZG93UmVzaXplTGlzdGVuZXI6IFdpbmRvd1Jlc2l6ZUxpc3RlbmVyO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBvbldpbmRvd1Jlc2l6ZUV2ZW50SGFuZGxlciA9IHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25Ub2dnbGVEcm9wZG93bkJ1dHRvbkNsaWNrSGFuZGxlciA9IHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbkNsaWNrLmJpbmQodGhpcyk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9uVG9nZ2xlRHJvcGRvd25CdXR0b25Nb3VzZUVudGVySGFuZGxlciA9IHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbk1vdXNlRW50ZXIuYmluZCh0aGlzKTtcclxuICAvLyBlbGVtZW50c1xyXG4gIHByb3RlY3RlZCBjb2xsYXBzZVJvb3Q6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByb3RlY3RlZCBjb2xsYXBzZUJ1dHRvbjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJvdGVjdGVkIGNvbGxhcHNlRHJvcGRvd246IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByb3RlY3RlZCBjdXJyZW50T3BlbmluZ1N1Yk1lbnU6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJQm9vdHN0cmFwQ29sbGFwc2luZ01lbnVPcHRpb25zKSB7XHJcbiAgICBzdXBlcihvcHRpb25zKTtcclxuXHJcbiAgICB0aGlzLml0ZW1BY3Rpb25Nb2RlID0gb3B0aW9ucy5pdGVtQWN0aW9uIHx8ICdob3Zlcic7XHJcbiAgICB0aGlzLmNvbGxhcHNpbmdNb2RlID0gb3B0aW9ucy5jb2xsYXBzaW5nTW9kZSA/PyBDb2xsYXBzaW5nTW9kZS5BZGFwdGl2ZUNvbGxhcHNpbmc7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCA9IG9wdGlvbnMuY29sbGFwc2VCcmVha3BvaW50IHx8IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzLm1kO1xyXG4gICAgdGhpcy5jb2xsYXBzZUljb25OYW1lID0gb3B0aW9ucy5jb2xsYXBzZUljb24gfHwgJ2ZhLWVsbGlwc2lzLXYnO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIoXHJcbiAgICAgIHRoaXMuY29sbGFwc2luZ01vZGUgPT09IENvbGxhcHNpbmdNb2RlLkFkYXB0aXZlQ29sbGFwc2luZyA/IHRoaXMub25XaW5kb3dSZXNpemVFdmVudEhhbmRsZXIgOiB1bmRlZmluZWQsXHJcbiAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuYWRhcHRpdml0eUNvbGxhcHNpbmdEZWxheVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBpZiAodGhpcy5yb290KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlclJvb3QoKTtcclxuICAgIHRoaXMucmVuZGVySXRlbXMoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5yb290KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVJdGVtcyhpdGVtczogSU1lbnVJdGVtW10pIHtcclxuICAgIHN1cGVyLnVwZGF0ZUl0ZW1zKGl0ZW1zKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gbmV3IEVycm9yKCdUaGUgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUgaXNuXFwndCByZW5kZXJlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHdoaWxlICh0aGlzLnJvb3QuZmlyc3RDaGlsZCkge1xyXG4gICAgICB0aGlzLnJvb3QuZmlyc3RDaGlsZC5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlckl0ZW1zKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpIHtcclxuICAgIGlmICh0aGlzLmNvbGxhcHNpbmdNb2RlICE9PSBDb2xsYXBzaW5nTW9kZS5BZGFwdGl2ZUNvbGxhcHNpbmdcclxuICAgICAgfHwgIXRoaXMucm9vdCB8fCAhdGhpcy5pdGVtcy5sZW5ndGggfHwgIXRoaXMuY29sbGFwc2VSb290IHx8ICF0aGlzLmNvbGxhcHNlRHJvcGRvd24pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzTmVlZENvbGxhcHNlKCkpIHtcclxuICAgICAgdGhpcy5jb2xsYXBzZVJvb3QuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7XHJcblxyXG4gICAgICBkbyB7XHJcbiAgICAgICAgY29uc3QgbGFzdEl0ZW1FbGVtZW50ID0gdGhpcy5yb290LmNoaWxkcmVuW3RoaXMucm9vdC5jaGlsZHJlbi5sZW5ndGggLSAyXTtcclxuICAgICAgICBpZiAoIWxhc3RJdGVtRWxlbWVudCkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1vdmVSb290SXRlbXNUb0NvbGxhcHNlRHJvcGRvd24obGFzdEl0ZW1FbGVtZW50KTtcclxuICAgICAgfSB3aGlsZSAodGhpcy5pc05lZWRDb2xsYXBzZSgpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdoaWxlICh0aGlzLmNvbGxhcHNlRHJvcGRvd24uY2hpbGRyZW4ubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5tb3ZlUm9vdEl0ZW1zVG9Sb290KHRoaXMuY29sbGFwc2VEcm9wZG93bi5maXJzdEVsZW1lbnRDaGlsZCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzTmVlZENvbGxhcHNlKCkpIHtcclxuICAgICAgICAgIGNvbnN0IGxhc3RJdGVtRWxlbWVudCA9IHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLnJvb3QuY2hpbGRyZW4ubGVuZ3RoIC0gMl07XHJcbiAgICAgICAgICBsYXN0SXRlbUVsZW1lbnQgJiYgdGhpcy5tb3ZlUm9vdEl0ZW1zVG9Db2xsYXBzZURyb3Bkb3duKGxhc3RJdGVtRWxlbWVudCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5jb2xsYXBzZURyb3Bkb3duLmNoaWxkcmVuLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuY29sbGFwc2VSb290LmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpIHtcclxuICAgIHRoaXMuZm9yRWFjaE1lbnVJdGVtUmVjdXJzaXZlKHRoaXMuaXRlbXMsIChpdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IG9sZEFjdGl2ZVZhbHVlID0gaXRlbS5hY3RpdmU7XHJcbiAgICAgIGl0ZW0uYWN0aXZlID0gaXNJdGVtQWN0aXZlKGl0ZW0ub3JpZ2luYWxNb2RlbCk7XHJcblxyXG4gICAgICBpZiAoaXRlbS5hY3RpdmUgIT09IG9sZEFjdGl2ZVZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5hcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbS5tZW51SXRlbUVsLmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50LCBpdGVtKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2VPcGVuZWREcm9wZG93bih0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgaWYgKHRoaXMuaXRlbUFjdGlvbk1vZGUgPT09ICdob3ZlcicpIHtcclxuICAgICAgLy9OT1RFOiBGb3IgY2xvc2luZyBvcGVuZWQgZHJvcGRvd25cclxuICAgICAgdGhpcy5yb290LmNsYXNzTGlzdC5yZW1vdmUoQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuSE9WRVJfTU9ERV9DU1NfQ0xBU1MpO1xyXG4gICAgICAkKHRhcmdldEVsZW1lbnQpLm9uZSgnbW91c2VsZWF2ZScsICgpID0+IHtcclxuICAgICAgICB0aGlzLnJvb3QuY2xhc3NMaXN0LmFkZChCb290c3RyYXBDb2xsYXBzaW5nTWVudS5IT1ZFUl9NT0RFX0NTU19DTEFTUyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGZvckVhY2hNZW51SXRlbVJlY3Vyc2l2ZShyb290SXRlbXM6IElNZW51SXRlbVtdLCBhY3Rpb246IChpdGVtOiBJTWVudUl0ZW0pID0+IHZvaWQpIHtcclxuICAgIHJvb3RJdGVtcy5mb3JFYWNoKChpKSA9PiB7XHJcbiAgICAgIGFjdGlvbihpKTtcclxuICAgICAgaWYgKHRoaXMuaXNOZXN0ZWRJdGVtc093bmVySXRlbShpKSkge1xyXG4gICAgICAgIHRoaXMuZm9yRWFjaE1lbnVJdGVtUmVjdXJzaXZlKGkuaXRlbXMsIGFjdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlclJvb3QoKSB7XHJcbiAgICB0aGlzLnJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xyXG4gICAgdGhpcy5yb290LmNsYXNzTGlzdC5hZGQoJ25hdmJhci1uYXYnLCAnbXItYXV0bycpO1xyXG4gICAgaWYgKHRoaXMuaXRlbUFjdGlvbk1vZGUgPT09ICdob3ZlcicpIHtcclxuICAgICAgdGhpcy5yb290LmNsYXNzTGlzdC5hZGQoQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuSE9WRVJfTU9ERV9DU1NfQ0xBU1MpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlckl0ZW1zKCkge1xyXG4gICAgdGhpcy5yZW5kZXJSb290SXRlbXMoKTtcclxuXHJcbiAgICBpZiAodGhpcy5pdGVtcy5sZW5ndGggJiYgdGhpcy5jb2xsYXBzaW5nTW9kZSAhPT0gQ29sbGFwc2luZ01vZGUuRGlzYWJsZWQpIHtcclxuICAgICAgaWYgKCF0aGlzLnJvb3QpIHtcclxuICAgICAgICB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMucm9vdC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XHJcbiAgICAgIHRoaXMucmVuZGVyQ29sbGFwc2VFbGVtZW50cygpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmFwcGx5QWRhcHRpdml0eUNvbGxhcHNpbmcoKTtcclxuICAgICAgICB0aGlzLnJvb3Quc3R5bGUudmlzaWJpbGl0eSA9ICcnO1xyXG4gICAgICB9LCAxMCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jaGFuZ2VEZWZhdWx0RHJvcGRvd25CZWhhdmlvckZvck5lc3RlZERyb3Bkb3duKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2hhbmdlRGVmYXVsdERyb3Bkb3duQmVoYXZpb3JGb3JOZXN0ZWREcm9wZG93bigpIHtcclxuICAgICQodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wZG93bicpKS5vbignaGlkZS5icy5kcm9wZG93bicsIChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGUudGFyZ2V0ICE9PSB0aGlzLmN1cnJlbnRPcGVuaW5nU3ViTWVudSAmJiBlLnRhcmdldC5jb250YWlucyh0aGlzLmN1cnJlbnRPcGVuaW5nU3ViTWVudSk7XHJcblxyXG4gICAgICByZXR1cm4gIXJlc3VsdDtcclxuICAgIH0pO1xyXG5cclxuICAgICQodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wZG93bi1zdWJtZW51JykpLm9uKCdzaG93LmJzLmRyb3Bkb3duJywgKGUpID0+IHtcclxuICAgICAgdGhpcy5jdXJyZW50T3BlbmluZ1N1Yk1lbnUgPSB1bmRlZmluZWQ7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZW5kZXJDb2xsYXBzZUVsZW1lbnRzKCkge1xyXG4gICAgaWYgKCF0aGlzLnJvb3QpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3Jvb3QnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNvbGxhcHNlUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlUm9vdC5jbGFzc0xpc3QuYWRkKCduYXYtaXRlbScsICdkcm9wZG93bicsICdjb2xsYXBzaW5nLW1lbnVfX2NvbGxhcHNlLXJvb3QnKTtcclxuXHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24nLCAnYnRuJywgJ2J0bi1vdXRsaW5lLWxpZ2h0Jyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uLnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTtcclxuICAgIHRoaXMuY29sbGFwc2VCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLXRvZ2dsZScsICdkcm9wZG93bicpO1xyXG5cclxuICAgIGNvbnN0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJyk7XHJcbiAgICBpY29uLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24taWNvbicsICdmYXMnLCB0aGlzLmNvbGxhcHNlSWNvbk5hbWUpO1xyXG5cclxuICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24uY2xhc3NMaXN0LmFkZCgnZHJvcGRvd24tbWVudScsICdkcm9wZG93bi1tZW51LXJpZ2h0Jyk7XHJcblxyXG4gICAgdGhpcy5jb2xsYXBzZUJ1dHRvbi5hcHBlbmRDaGlsZChpY29uKTtcclxuICAgIHRoaXMuY29sbGFwc2VSb290LmFwcGVuZENoaWxkKHRoaXMuY29sbGFwc2VCdXR0b24pO1xyXG4gICAgdGhpcy5jb2xsYXBzZVJvb3QuYXBwZW5kQ2hpbGQodGhpcy5jb2xsYXBzZURyb3Bkb3duKTtcclxuXHJcbiAgICB0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5jb2xsYXBzZVJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlclJvb3RJdGVtcygpIHtcclxuICAgIGlmICghdGhpcy5yb290KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGxldCBjb250ZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlzTmVzdGVkSXRlbXNPd25lckl0ZW0oaXRlbSkpIHtcclxuICAgICAgICBjb250ZW50ID0gdGhpcy5jcmVhdGVSb290SXRlbVdpdGhOZXN0ZWRJdGVtcyhpdGVtIGFzIElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnRlbnQgPSB0aGlzLmNyZWF0ZVJvb3RJdGVtRWxlbWVudChpdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5yb290IS5hcHBlbmRDaGlsZChjb250ZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVJvb3RJdGVtV2l0aE5lc3RlZEl0ZW1zKGl0ZW06IElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVSb290SXRlbUVsZW1lbnQoaXRlbSk7XHJcbiAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bicpO1xyXG5cclxuICAgIGNvbnN0IGl0ZW1Db250ZW50ID0gaXRlbUVsZW1lbnQucXVlcnlTZWxlY3RvcignLm5hdi1saW5rJyk7XHJcbiAgICBpdGVtQ29udGVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRoaXMuc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudCk7XHJcblxyXG4gICAgY29uc3QgZHJvcGRvd25NZW51RWxlbWVudCA9IHRoaXMuY3JlYXRlRHJvcGRvd25NZW51KGl0ZW0pO1xyXG4gICAgaXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25NZW51RWxlbWVudCk7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVJvb3RJdGVtRWxlbWVudChpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcclxuICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ25hdi1pdGVtJyk7XHJcbiAgICBpdGVtLnRpdGxlICYmIGl0ZW1FbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCBpdGVtLnRpdGxlKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ25hdi1saW5rJyk7XHJcbiAgICBpdGVtQ29udGVudC5ocmVmID0gaXRlbS51cmwgfHwgJ2phdmFzY3JpcHQ6dm9pZCgwKSc7XHJcbiAgICBpdGVtQ29udGVudC50ZXh0ID0gaXRlbS50ZXh0O1xyXG5cclxuICAgIGNvbnN0IGljb25FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtSWNvbkVsZW1lbnQoaXRlbSk7XHJcbiAgICBpY29uRWxlbWVudCAmJiBpdGVtQ29udGVudC5pbnNlcnRCZWZvcmUoaWNvbkVsZW1lbnQsIGl0ZW1Db250ZW50LmZpcnN0Q2hpbGQpO1xyXG5cclxuICAgIHRoaXMuYXBwbHlTdGF0ZXNUb0l0ZW1FbGVtZW50KGl0ZW1Db250ZW50LCBpdGVtKTtcclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzVG9JdGVtKGl0ZW1Db250ZW50LCBpdGVtKTtcclxuXHJcbiAgICBpdGVtRWxlbWVudC5hcHBlbmRDaGlsZChpdGVtQ29udGVudCk7XHJcblxyXG4gICAgaXRlbS5tZW51SXRlbUVsID0gaXRlbUVsZW1lbnQ7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZU5lc3RlZFN1Yk1lbnVJdGVtRWxlbWVudChpdGVtOiBJTWVudUl0ZW0gJiB7IGl0ZW1zOiBJTWVudUl0ZW1bXSB9KSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IHRoaXMuY3JlYXRlTmVzdGVkSXRlbShpdGVtKTtcclxuICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duJywgJ2Ryb3Bkb3duLXN1Ym1lbnUnKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGl0ZW1FbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kcm9wZG93bi1pdGVtJyk7XHJcbiAgICBpdGVtQ29udGVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRoaXMuc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudCk7XHJcblxyXG4gICAgY29uc3QgZHJvcGRvd25NZW51RWxlbWVudCA9IHRoaXMuY3JlYXRlRHJvcGRvd25NZW51KGl0ZW0pO1xyXG4gICAgaXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25NZW51RWxlbWVudCk7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZU5lc3RlZEl0ZW0oaXRlbTogSU1lbnVJdGVtKSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICBpdGVtLnRpdGxlICYmIGl0ZW1FbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCBpdGVtLnRpdGxlKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLWl0ZW0nKTtcclxuICAgIGl0ZW1Db250ZW50LmhyZWYgPSBpdGVtLnVybCB8fCAnamF2YXNjcmlwdDp2b2lkKDApJztcclxuICAgIGl0ZW1Db250ZW50LnRleHQgPSBpdGVtLnRleHQ7XHJcblxyXG4gICAgY29uc3QgaWNvbkVsZW1lbnQgPSB0aGlzLmNyZWF0ZUl0ZW1JY29uRWxlbWVudChpdGVtKTtcclxuICAgIGljb25FbGVtZW50ICYmIGl0ZW1Db250ZW50Lmluc2VydEJlZm9yZShpY29uRWxlbWVudCwgaXRlbUNvbnRlbnQuZmlyc3RDaGlsZCk7XHJcblxyXG4gICAgdGhpcy5hcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbUNvbnRlbnQsIGl0ZW0pO1xyXG4gICAgdGhpcy5hdHRhY2hFdmVudHNUb0l0ZW0oaXRlbUNvbnRlbnQsIGl0ZW0pO1xyXG5cclxuICAgIGl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKGl0ZW1Db250ZW50KTtcclxuXHJcbiAgICBpdGVtLm1lbnVJdGVtRWwgPSBpdGVtRWxlbWVudDtcclxuXHJcbiAgICByZXR1cm4gaXRlbUVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY3JlYXRlRHJvcGRvd25NZW51KGl0ZW06IElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pIHtcclxuICAgIGNvbnN0IGRyb3Bkb3duTWVudUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xyXG4gICAgZHJvcGRvd25NZW51RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51Jyk7XHJcblxyXG4gICAgaXRlbS5pdGVtcy5mb3JFYWNoKChuZXN0ZWRJdGVtKSA9PiB7XHJcbiAgICAgIGxldCBjb250ZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlzTmVzdGVkSXRlbXNPd25lckl0ZW0obmVzdGVkSXRlbSkpIHtcclxuICAgICAgICBjb250ZW50ID0gdGhpcy5jcmVhdGVOZXN0ZWRTdWJNZW51SXRlbUVsZW1lbnQobmVzdGVkSXRlbSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29udGVudCA9IHRoaXMuY3JlYXRlTmVzdGVkSXRlbShuZXN0ZWRJdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZHJvcGRvd25NZW51RWxlbWVudC5hcHBlbmRDaGlsZChjb250ZW50KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBkcm9wZG93bk1lbnVFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUl0ZW1JY29uRWxlbWVudChpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGlmICghaXRlbS5pY29uKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGl0ZW1JY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgaXRlbUljb24uc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYHVybCgke2l0ZW0uaWNvbn0pYDtcclxuXHJcbiAgICByZXR1cm4gaXRlbUljb247XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLXRvZ2dsZScpO1xyXG4gICAgaXRlbUNvbnRlbnQuc2V0QXR0cmlidXRlKCdkYXRhLXRvZ2dsZScsICdkcm9wZG93bicpO1xyXG4gICAgaXRlbUNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uVG9nZ2xlRHJvcGRvd25CdXR0b25DbGlja0hhbmRsZXIpO1xyXG4gICAgaXRlbUNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbk1vdXNlRW50ZXJIYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGlmIChpdGVtLmFjdGl2ZSkge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpdGVtLmhpZGRlbikge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkLW5vbmUnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpdGVtLmRpc2FibGVkKSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkaXNhYmxlZCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGF0dGFjaEV2ZW50c1RvSXRlbShpdGVtRWxlbWVudDogSFRNTEVsZW1lbnQsIGl0ZW06IElNZW51SXRlbSkge1xyXG4gICAgaXRlbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4gdGhpcy5lbWl0SXRlbUNsaWNrKHtcclxuICAgICAgaXRlbSxcclxuICAgICAgb3JpZ2luYWxFdmVudDogZVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzTmVzdGVkSXRlbXNPd25lckl0ZW0oaXRlbTogSU1lbnVJdGVtKTogaXRlbSBpcyBJTWVudUl0ZW0gJiB7IGl0ZW1zOiBJTWVudUl0ZW1bXSB9IHtcclxuICAgIHJldHVybiBpdGVtLml0ZW1zICYmIGl0ZW0uaXRlbXMubGVuZ3RoICYmIGl0ZW0uaXRlbXMuc29tZSgoaSkgPT4gIWkuaGlkZGVuKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBtb3ZlUm9vdEl0ZW1zVG9Db2xsYXBzZURyb3Bkb3duKHJvb3RJdGVtT3JJdGVtczogRWxlbWVudCB8IEl0ZXJhYmxlPEVsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICBpZiAocm9vdEl0ZW1Pckl0ZW1zIGluc3RhbmNlb2YgRWxlbWVudCkge1xyXG4gICAgICB0aGlzLmFwcGx5Q29sbGFwc2luZ1ZpZXdGb3JSb290SXRlbShyb290SXRlbU9ySXRlbXMpO1xyXG4gICAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24uaW5zZXJ0QmVmb3JlKHJvb3RJdGVtT3JJdGVtcywgdGhpcy5jb2xsYXBzZURyb3Bkb3duLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRlbXBJdGVtRWxlbWVudHNTdG9yZSA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuXHJcbiAgICAgIGZvciAoY29uc3Qgcm9vdEl0ZW0gb2Ygcm9vdEl0ZW1Pckl0ZW1zKSB7XHJcbiAgICAgICAgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmluc2VydEJlZm9yZShyb290SXRlbSwgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgICAgICB0aGlzLmFwcGx5Q29sbGFwc2luZ1ZpZXdGb3JSb290SXRlbShyb290SXRlbSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY29sbGFwc2VEcm9wZG93bi5hcHBlbmRDaGlsZCh0ZW1wSXRlbUVsZW1lbnRzU3RvcmUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG1vdmVSb290SXRlbXNUb1Jvb3Qocm9vdEl0ZW1Pckl0ZW1zOiBFbGVtZW50IHwgSXRlcmFibGU8RWxlbWVudD4pOiB2b2lkIHtcclxuICAgIGlmIChyb290SXRlbU9ySXRlbXMgaW5zdGFuY2VvZiBFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuYXBwbHlFeHBhbmRlZFZpZXdGb3JSb290SXRlbShyb290SXRlbU9ySXRlbXMpO1xyXG4gICAgICB0aGlzLnJvb3QuaW5zZXJ0QmVmb3JlKHJvb3RJdGVtT3JJdGVtcywgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMucm9vdC5jaGlsZHJlbi5sZW5ndGggLSAxXSB8fCBudWxsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRlbXBJdGVtRWxlbWVudHNTdG9yZSA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuXHJcbiAgICAgIGZvciAoY29uc3Qgcm9vdEl0ZW0gb2Ygcm9vdEl0ZW1Pckl0ZW1zKSB7XHJcbiAgICAgICAgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmluc2VydEJlZm9yZShyb290SXRlbSwgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgICAgICB0aGlzLmFwcGx5RXhwYW5kZWRWaWV3Rm9yUm9vdEl0ZW0ocm9vdEl0ZW0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGVtcEl0ZW1FbGVtZW50c1N0b3JlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseUNvbGxhcHNpbmdWaWV3Rm9yUm9vdEl0ZW0ocm9vdEl0ZW06IEVsZW1lbnQpIHtcclxuICAgIHJvb3RJdGVtLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLXN1Ym1lbnUnKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHJvb3RJdGVtLmNoaWxkcmVuKSB7XHJcbiAgICAgIGNoaWxkLmNsYXNzTGlzdC5yZXBsYWNlKCduYXYtbGluaycsICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlFeHBhbmRlZFZpZXdGb3JSb290SXRlbShyb290SXRlbTogRWxlbWVudCkge1xyXG4gICAgcm9vdEl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgnZHJvcGRvd24tc3VibWVudScpO1xyXG5cclxuICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygcm9vdEl0ZW0uY2hpbGRyZW4pIHtcclxuICAgICAgY2hpbGQuY2xhc3NMaXN0LnJlcGxhY2UoJ2Ryb3Bkb3duLWl0ZW0nLCAnbmF2LWxpbmsnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBpc05lZWRDb2xsYXBzZSgpIHtcclxuICAgIGlmICh0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1pbldpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWluV2lkdGgpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucm9vdC5zdHlsZS5tYXhXaWR0aCA9ICdub25lJztcclxuICAgIGNvbnN0IGN1cnJlbnRSb290UmVjdCA9IHRoaXMucm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIHRoaXMucm9vdC5jbGFzc0xpc3QuYWRkKCdjb2xsYXBzaW5nLW1lbnVfbm9ybWFsLXdoaXRlLXNwYWNlJyk7XHJcblxyXG4gICAgY29uc3Qgbm9ybWFsUm9vdFJlY3QgPSB0aGlzLnJvb3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICB0aGlzLnJvb3QuY2xhc3NMaXN0LnJlbW92ZSgnY29sbGFwc2luZy1tZW51X25vcm1hbC13aGl0ZS1zcGFjZScpO1xyXG4gICAgdGhpcy5yb290LnN0eWxlLm1heFdpZHRoID0gJyc7XHJcblxyXG4gICAgcmV0dXJuIGN1cnJlbnRSb290UmVjdC53aWR0aCA+IG5vcm1hbFJvb3RSZWN0LndpZHRoO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzRHJvcGRvd25SZWN0c0ludGVyc2VjdChkcm9wZG93blJlY3QxOiBDbGllbnRSZWN0LCBkcm9wZG93blJlY3QyOiBDbGllbnRSZWN0LCBkZWx0YSA9IDIpIHtcclxuICAgIHJldHVybiBkcm9wZG93blJlY3QxLmxlZnQgPCAoZHJvcGRvd25SZWN0Mi5yaWdodCAtIGRlbHRhKSAmJiAoZHJvcGRvd25SZWN0Mi5sZWZ0ICsgZGVsdGEpIDwgZHJvcGRvd25SZWN0MS5yaWdodFxyXG4gICAgICAmJiBkcm9wZG93blJlY3QxLnRvcCA8IChkcm9wZG93blJlY3QyLmJvdHRvbSAtIGRlbHRhKSAmJiAoZHJvcGRvd25SZWN0Mi50b3AgKyBkZWx0YSkgPCBkcm9wZG93blJlY3QxLmJvdHRvbTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseVNoYWRvd3NGb3JPdmVybGFwaW5nRHJvcGRvd25JZk5lZWRlZChvcGVuZWREcm9wZG93bkVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAvLyBSZXNldCB0aGUgc3R5bGUgYmVmb3JlIHRoZSByZWN0IGdldHRpbmcgdG8gZ2V0IHJlYWwgdmFsdWVzXHJcbiAgICBvcGVuZWREcm9wZG93bkVsZW1lbnQuc3R5bGUubGVmdCA9ICcnO1xyXG4gICAgb3BlbmVkRHJvcGRvd25FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Ryb3Bkb3duLW1lbnUtbGVmdC1zaGFkb3dlZCcpO1xyXG4gICAgbGV0IHJlY3QgPSBvcGVuZWREcm9wZG93bkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBpZiAocmVjdC5yaWdodCA+IHdpbmRvdy5pbm5lcldpZHRoKSB7XHJcbiAgICAgIG9wZW5lZERyb3Bkb3duRWxlbWVudC5zdHlsZS5sZWZ0ID0gYC0ke3JlY3Qud2lkdGh9cHhgO1xyXG4gICAgfVxyXG5cclxuICAgIHJlY3QgPSBvcGVuZWREcm9wZG93bkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCBkcm9wZG93bkVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRyb3Bkb3duLW1lbnUnKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGRyb3Bkb3duRWxlbWVudCBvZiBkcm9wZG93bkVsZW1lbnRzKSB7XHJcbiAgICAgIGlmIChkcm9wZG93bkVsZW1lbnQgPT09IG9wZW5lZERyb3Bkb3duRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5pc0Ryb3Bkb3duUmVjdHNJbnRlcnNlY3QoZHJvcGRvd25FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCByZWN0KSkge1xyXG4gICAgICAgIG9wZW5lZERyb3Bkb3duRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51LWxlZnQtc2hhZG93ZWQnKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uV2luZG93UmVzaXplKGU6IFVJRXZlbnQpIHtcclxuICAgIHRoaXMuYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uVG9nZ2xlRHJvcGRvd25CdXR0b25DbGljayhlOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAoZS50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBlLnRhcmdldC5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuY3VycmVudE9wZW5pbmdTdWJNZW51ID0gZS50YXJnZXQucGFyZW50RWxlbWVudDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvblRvZ2dsZURyb3Bkb3duQnV0dG9uTW91c2VFbnRlcihlOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy53aW5kb3dSZXNpemVMaXN0ZW5lci5jdXJyZW50TGF5b3V0QnJlYWtwb2ludC5tYXhXaWR0aCA+PSB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludC5tYXhXaWR0aCAmJlxyXG4gICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50XHJcbiAgICAgICYmIGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZy5jbGFzc0xpc3QuY29udGFpbnMoJ2Ryb3Bkb3duLW1lbnUnKSkge1xyXG4gICAgICB0aGlzLmFwcGx5U2hhZG93c0Zvck92ZXJsYXBpbmdEcm9wZG93bklmTmVlZGVkKGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfSBmcm9tICcuL0lOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCc7XHJcbmltcG9ydCB7IGdldFVybEJ5TWVudUl0ZW1EYXRhLCBJTGF5b3V0QnJlYWtwb2ludCB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBCb290c3RyYXBDb2xsYXBzaW5nTWVudSB9IGZyb20gJy4uL0NvbXBvbmVudHMvTWVudSc7XHJcbmltcG9ydCB7IElNZW51SXRlbSwgTWVudUl0ZW1DbGlja0V2ZW50IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9NZW51L01lbnUnO1xyXG5pbXBvcnQgeyBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vU2VhcmNoJztcclxuXHJcbmNvbnN0IGZpbmRJdGVtQnlOYW1lUmVjdXJzaXZlbHkgPSAoaXRlbXM6IHJlYWRvbmx5IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFtdLCBpdGVtTmFtZTogc3RyaW5nKTogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsIHwgdW5kZWZpbmVkID0+IHtcclxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgIGlmIChpdGVtLk5hbWUgPT09IGl0ZW1OYW1lKSB7XHJcbiAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgfSBlbHNlIGlmIChpdGVtLkl0ZW1zPy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgbmVzdGVkSXRlbSA9IGZpbmRJdGVtQnlOYW1lUmVjdXJzaXZlbHkoaXRlbS5JdGVtcywgaXRlbU5hbWUpO1xyXG5cclxuICAgICAgaWYgKG5lc3RlZEl0ZW0pIHtcclxuICAgICAgICByZXR1cm4gbmVzdGVkSXRlbTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IGdldEl0ZW1VcmxzUmVjdXJzaXZlbHkgPSAoaXRlbURhdGE6IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCk6IHN0cmluZ1tdID0+IHtcclxuICBjb25zdCBpdGVtcyA9IGl0ZW1EYXRhLkl0ZW1zO1xyXG5cclxuICBpZiAoIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcclxuICAgIGNvbnN0IG93blVybCA9IGdldFVybEJ5TWVudUl0ZW1EYXRhKGl0ZW1EYXRhKTtcclxuXHJcbiAgICByZXR1cm4gb3duVXJsID8gW293blVybF0gOiBbXTtcclxuICB9XHJcblxyXG4gIGxldCB1cmxzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGl0ZW1zKSB7XHJcbiAgICB1cmxzID0gdXJscy5jb25jYXQoZ2V0SXRlbVVybHNSZWN1cnNpdmVseShjaGlsZCkpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHVybHM7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaXNJdGVtQWN0aXZlID0gKGl0ZW1EYXRhOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwpID0+IHtcclxuICBjb25zdCBjdXJyZW50TG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoO1xyXG4gIGNvbnN0IGl0ZW1VcmxzID0gZ2V0SXRlbVVybHNSZWN1cnNpdmVseShpdGVtRGF0YSk7XHJcblxyXG4gIGZvciAoY29uc3QgdXJsIG9mIGl0ZW1VcmxzKSB7XHJcbiAgICBjb25zdCB1cmxSZSA9IG5ldyBSZWdFeHAoYF4uKiR7dXJsLnJlcGxhY2UoJz8nLCAnXFxcXD8nKX0kYCk7XHJcblxyXG4gICAgaWYgKHVybFJlLnRlc3QoY3VycmVudExvY2F0aW9uKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBmYWxzZTtcclxufTtcclxuXHJcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogaW50ZXJmYWNlLW5hbWVcclxuZXhwb3J0IGludGVyZmFjZSBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50IHtcclxuICByZWFkb25seSBpdGVtOiBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbDtcclxuICByZWFkb25seSBvcmlnaW5hbEV2ZW50OiBVSUV2ZW50O1xyXG4gIGNhbmNlbD86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOYXZpZ2F0aW9uTWVudSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25OYXZpZ2F0aW9uTWVudUl0ZW1DbGljazogKChlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk1lbnVJdGVtQ2xpY2tIYW5kbGVyID0gdGhpcy5vbk1lbnVJdGVtQ2xpY2suYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IG1lbnU6IEJvb3RzdHJhcENvbGxhcHNpbmdNZW51O1xyXG4gIHByaXZhdGUgaXNHbG9iYWxNZW51OiBib29sZWFuO1xyXG4gIHByaXZhdGUgaXRlbXM6IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXHJcbiAgICBpdGVtczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sXHJcbiAgICBpc0dsb2JhbE1lbnU6IGJvb2xlYW4sXHJcbiAgICBjb2xsYXBzZUJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50LFxyXG4gICAgb25OYXZpZ2F0aW9uTWVudUl0ZW1DbGljazogKGU6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQpID0+IHZvaWRcclxuICApIHtcclxuICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xyXG4gICAgdGhpcy5pc0dsb2JhbE1lbnUgPSBpc0dsb2JhbE1lbnUsXHJcbiAgICB0aGlzLml0ZW1zID0gaXRlbXM7XHJcbiAgICB0aGlzLm9uTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2sgPSBvbk5hdmlnYXRpb25NZW51SXRlbUNsaWNrO1xyXG4gICAgdGhpcy5tZW51ID0gbmV3IEJvb3RzdHJhcENvbGxhcHNpbmdNZW51KHtcclxuICAgICAgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lcixcclxuICAgICAgaXRlbXM6IHRoaXMubWFwTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxUb01lbnVJdGVtcyhpdGVtcyksXHJcbiAgICAgIGNvbGxhcHNlQnJlYWtwb2ludCxcclxuICAgICAgb25JdGVtQ2xpY2s6IHRoaXMub25NZW51SXRlbUNsaWNrSGFuZGxlclxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlRGF0YShpdGVtczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sIGlzR2xvYmFsTWVudTogYm9vbGVhbikge1xyXG4gICAgLyogZXNsaW50IEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtZXhwcmVzc2lvbnM6IG9mZiAqL1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gICAgdGhpcy5pc0dsb2JhbE1lbnUgPSBpc0dsb2JhbE1lbnU7XHJcbiAgICB0aGlzLm1lbnUudXBkYXRlSXRlbXModGhpcy5tYXBOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFRvTWVudUl0ZW1zKHRoaXMuaXRlbXMpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICB0aGlzLm1lbnUucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpIHtcclxuICAgIHRoaXMubWVudS5hcHBseUFkYXB0aXZpdHlDb2xsYXBzaW5nKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpIHtcclxuICAgIHRoaXMubWVudS51cGRhdGVBY3RpdmVJdGVtc1N0YXRlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uTWVudUl0ZW1DbGljayhlOiBNZW51SXRlbUNsaWNrRXZlbnQpIHtcclxuICAgIGNvbnN0IGV2ZW50QXJncyA9IHRoaXMubWFwTWVudUl0ZW1DbGlja0V2ZW50QXJnc1RvTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudEFyZ3MoZSk7XHJcbiAgICBpZiAoZXZlbnRBcmdzKSB7XHJcbiAgICAgIHRoaXMuZW1pdE5hdmlnYXRpb25NZW51SXRlbUNsaWNrKGV2ZW50QXJncyk7XHJcblxyXG4gICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xyXG4gICAgICAgIGUub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXRFbCA9IGUub3JpZ2luYWxFdmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5tZW51LmNsb3NlT3BlbmVkRHJvcGRvd24odGFyZ2V0RWwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtaXROYXZpZ2F0aW9uTWVudUl0ZW1DbGljayhlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2s/LihlKTtcclxuICAgICAgZS5pdGVtLk9uQ2xpY2s/LihlKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxUb01lbnVJdGVtcyhtZW51SXRlbU1vZGVsczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10pIHtcclxuICAgIHJldHVybiBtZW51SXRlbU1vZGVscy5tYXA8SU1lbnVJdGVtPigobWVudUl0ZW1Nb2RlbCkgPT4ge1xyXG4gICAgICBjb25zdCBtZW51SXRlbSA9IHtcclxuICAgICAgICB0ZXh0OiBtZW51SXRlbU1vZGVsLk5hbWUsXHJcbiAgICAgICAgaWNvbjogbWVudUl0ZW1Nb2RlbC5JY29uLFxyXG4gICAgICAgIGl0ZW1zOiBtZW51SXRlbU1vZGVsLkl0ZW1zID8gdGhpcy5tYXBOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFRvTWVudUl0ZW1zKG1lbnVJdGVtTW9kZWwuSXRlbXMpIDogdW5kZWZpbmVkLFxyXG4gICAgICAgIHVybDogZ2V0VXJsQnlNZW51SXRlbURhdGEobWVudUl0ZW1Nb2RlbCksXHJcbiAgICAgICAgaGlkZGVuOiBtZW51SXRlbU1vZGVsLlZpc2libGUgPT09IGZhbHNlLFxyXG4gICAgICAgIGFjdGl2ZTogaXNJdGVtQWN0aXZlKG1lbnVJdGVtTW9kZWwpLFxyXG4gICAgICAgIGRpc2FibGVkOiBtZW51SXRlbU1vZGVsLkRpc2FibGVkLFxyXG4gICAgICAgIHRpdGxlOiBtZW51SXRlbU1vZGVsLkRlc2NyaXB0aW9uLFxyXG4gICAgICAgIG9yaWdpbmFsTW9kZWw6IG1lbnVJdGVtTW9kZWxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJldHVybiBtZW51SXRlbTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXBNZW51SXRlbUNsaWNrRXZlbnRBcmdzVG9OYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50QXJncyhlOiBNZW51SXRlbUNsaWNrRXZlbnQpOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50IHwgbnVsbCB7XHJcbiAgICBjb25zdCBpdGVtID0gZmluZEl0ZW1CeU5hbWVSZWN1cnNpdmVseSh0aGlzLml0ZW1zLCBlLml0ZW0udGV4dCk7XHJcblxyXG4gICAgcmV0dXJuICFpdGVtID8gbnVsbCA6IHtcclxuICAgICAgb3JpZ2luYWxFdmVudDogZS5vcmlnaW5hbEV2ZW50LFxyXG4gICAgICBjYW5jZWw6IGZhbHNlLFxyXG4gICAgICBpdGVtOiB7IC4uLml0ZW0sIGlzR2xvYmFsOiB0aGlzLmlzR2xvYmFsTWVudSB9XHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGNvbnN0IExPR09fU0VUVElOR1NfQ0FDSEVfS0VZID0gJ2lzem9sZWEtdWl8bG9nby1zZXR0aW5ncyc7XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTG9nb1NldHRpbmdzIH0gZnJvbSAnLi4vRGF0YSc7XHJcbmltcG9ydCB7IExPR09fU0VUVElOR1NfQ0FDSEVfS0VZIH0gZnJvbSAnLi4vQ29uc3RhbnRzL0NhY2hlS2V5cyc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vRGF0YS9SZXF1ZXN0JztcclxuXHJcbmV4cG9ydCBjbGFzcyBMb2dvIHtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgcHJpdmF0ZSAkaW1hZ2VFbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gIHByaXZhdGUgJHRpdGxlQ29udGFpbmVyOiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YVNvdXJjZTogSUxvZ29TZXR0aW5ncyB8IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoJGNvbnRhaW5lcjogSlF1ZXJ5LCBkYXRhU291cmNlOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSAkY29udGFpbmVyO1xyXG4gICAgdGhpcy5kYXRhU291cmNlID0gZGF0YVNvdXJjZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0V2lkZ2V0KCk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luaXRXaWRnZXQodGhpcy5kYXRhU291cmNlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVEYXRhKCk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVkpO1xyXG4gICAgdGhpcy4kaW1hZ2VFbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgdGhpcy4kdGl0bGVDb250YWluZXIucmVtb3ZlKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2luaXRXaWRnZXQodGhpcy5kYXRhU291cmNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRXaWRnZXQoZGF0YVNvdXJjZTogSUxvZ29TZXR0aW5ncyB8IHN0cmluZyk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgY29uc3QgY2FjaGVkU2V0dGluZ3NSYXcgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShMT0dPX1NFVFRJTkdTX0NBQ0hFX0tFWSk7XHJcblxyXG4gICAgaWYgKGNhY2hlZFNldHRpbmdzUmF3KSB7XHJcbiAgICAgIHRoaXMuX2NyZWF0ZUxvZ28oSlNPTi5wYXJzZShjYWNoZWRTZXR0aW5nc1JhdykgYXMgSUxvZ29TZXR0aW5ncyk7XHJcblxyXG4gICAgICByZXR1cm4gJC5EZWZlcnJlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVMb2dvKGRhdGFTb3VyY2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlTG9nbyhkYXRhU291cmNlOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nKTogSlF1ZXJ5RGVmZXJyZWQ8YW55PiB7XHJcbiAgICBpZiAodHlwZW9mIGRhdGFTb3VyY2UgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIGNvbnN0IGxvZ29TZXR0aW5ncyA9IGRhdGFTb3VyY2UgYXMgSUxvZ29TZXR0aW5ncztcclxuXHJcbiAgICAgIHRoaXMuX2NyZWF0ZUxvZ29NYXJrdXAobG9nb1NldHRpbmdzKTtcclxuXHJcbiAgICAgIHJldHVybiAkLkRlZmVycmVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHRoaXMuZGF0YVNvdXJjZSBhcyBzdHJpbmcsICdwb3N0JykuZG9uZSgoZGF0YSkgPT4ge1xyXG4gICAgICBjb25zdCBsb2dvU2V0dGluZ3M6IElMb2dvU2V0dGluZ3MgPSB7fTtcclxuICAgICAgbG9nb1NldHRpbmdzLmFwcGxpY2F0aW9uTmFtZSA9IGRhdGEuQXBwbGljYXRpb25OYW1lO1xyXG4gICAgICBsb2dvU2V0dGluZ3MuYnVzaW5lc3NOYW1lID0gZGF0YS5CdXNpbmVzc05hbWU7XHJcbiAgICAgIGxvZ29TZXR0aW5ncy5sb2dvSW1hZ2UgPSBkYXRhLkxvZ29JbWFnZTtcclxuICAgICAgbG9nb1NldHRpbmdzLmxhbmRpbmdQYWdlTG9nbyA9IGRhdGEuTGFuZGluZ1BhZ2VMb2dvO1xyXG4gICAgICBsb2dvU2V0dGluZ3MuZGVzY3JpcHRpb24gPSBkYXRhLkRlc2NyaXB0aW9uO1xyXG5cclxuICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVksIEpTT04uc3RyaW5naWZ5KGxvZ29TZXR0aW5ncykpO1xyXG5cclxuICAgICAgdGhpcy5fY3JlYXRlTG9nb01hcmt1cChsb2dvU2V0dGluZ3MpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVMb2dvTWFya3VwKGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncykge1xyXG4gICAgdGhpcy4kaW1hZ2VFbGVtZW50ID0gJCgnPGltZyAvPicpLmF0dHIoJ3NyYycsIGxvZ29TZXR0aW5ncy5sb2dvSW1hZ2UpLmFwcGVuZFRvKHRoaXMuJGNvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy4kdGl0bGVDb250YWluZXIgPSAkKCc8c3BhbiAvPicpLmFkZENsYXNzKCd0aXRsZS1jb250YWluZXInKS5hcHBlbmRUbyh0aGlzLiRjb250YWluZXIpO1xyXG5cclxuICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2J1c2luZXNzLW5hbWUnKS50ZXh0KGxvZ29TZXR0aW5ncy5idXNpbmVzc05hbWUpKTtcclxuICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2FwcC1uYW1lJykudGV4dChsb2dvU2V0dGluZ3MuYXBwbGljYXRpb25OYW1lLnRvVXBwZXJDYXNlKCkpKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElEZXN0cm95YWJsZSwgSVJlbmRlcmVkIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHsgV2luZG93UmVzaXplTGlzdGVuZXIsIElMYXlvdXRCcmVha3BvaW50LCBMYXlvdXRCcmVha3BvaW50Q2hhbmdlZEV2ZW50LCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cyB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTWVudVN3aXRjaGVyT3B0aW9ucyB7XHJcbiAgZGVza3RvcENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgbW9iaWxlQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICBjb2xsYXBzZUJyZWFrcG9pbnQ/OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBzdGFydFZhbHVlPzogYm9vbGVhbjtcclxuICBvblN3aXRjaD86ICh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE1lbnVTd2l0Y2hlciBpbXBsZW1lbnRzIElSZW5kZXJlZCwgSURlc3Ryb3lhYmxlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc2t0b3BDb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbW9iaWxlQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbGxhcHNlQnJlYWtwb2ludDogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblN3aXRjaDogKCh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkTGlzdGVuZXIgPSB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWQuYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHdpbmRvd1Jlc2l6ZUxpc3RlbmVyOiBXaW5kb3dSZXNpemVMaXN0ZW5lcjtcclxuICBwcml2YXRlIF92YWx1ZTogYm9vbGVhbjtcclxuICBwcml2YXRlIG1lbnVTd2l0Y2hlcjogRGV2RXhwcmVzcy51aS5keFN3aXRjaCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIG9uVmFsdWVDaGFuZ2VkOiAodmFsdWU6IGJvb2xlYW4pID0+IHZvaWQ7XHJcblxyXG4gIHB1YmxpYyBnZXQgdmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJTWVudVN3aXRjaGVyT3B0aW9ucykge1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGFpbmVyID0gb3B0aW9ucy5kZXNrdG9wQ29udGFpbmVyO1xyXG4gICAgdGhpcy5tb2JpbGVDb250YWluZXIgPSBvcHRpb25zLm1vYmlsZUNvbnRhaW5lcjtcclxuICAgIHRoaXMuY29sbGFwc2VCcmVha3BvaW50ID0gb3B0aW9ucy5jb2xsYXBzZUJyZWFrcG9pbnQgfHwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMubWQ7XHJcbiAgICB0aGlzLm9uU3dpdGNoID0gb3B0aW9ucy5vblN3aXRjaDtcclxuICAgIHRoaXMuX3ZhbHVlID0gb3B0aW9ucy5zdGFydFZhbHVlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnN0YXJ0VmFsdWUgOiB0cnVlO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIodW5kZWZpbmVkLCB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWRMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBjb250YWluZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pc01vYmlsZVZpZXcgPyB0aGlzLm1vYmlsZUNvbnRhaW5lciA6IHRoaXMuZGVza3RvcENvbnRhaW5lcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGlzTW9iaWxlVmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1heFdpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWF4V2lkdGg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VmlzaWJsZShpc1Zpc2libGU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMubWVudVN3aXRjaGVyPy5vcHRpb24oJ3Zpc2libGUnLCBpc1Zpc2libGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIHRoaXMucmVuZGVyU3dpdGNoKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVzdHJveSgpIHtcclxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLm1lbnVTd2l0Y2hlci5lbGVtZW50KCk7XHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlcj8uZGlzcG9zZSgpO1xyXG5cclxuICAgIHJvb3Q/LnJlbW92ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZhbHVlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlci5vcHRpb24oJ3ZhbHVlJywgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZVZhbHVlQ2hhbmdlZChvblZhbHVlQ2hhbmdlZDogKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkKSB7XHJcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkID0gb25WYWx1ZUNoYW5nZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclN3aXRjaCgpIHtcclxuICAgIHRoaXMubWVudVN3aXRjaGVyID0gJCgnPGRpdj4nKS5keFN3aXRjaCh7XHJcbiAgICAgIHN3aXRjaGVkT2ZmVGV4dDogJ1BlcnNvbmFsJyxcclxuICAgICAgc3dpdGNoZWRPblRleHQ6ICdHbG9iYWwnLFxyXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcclxuICAgICAgd2lkdGg6ICcxMDBweCcsXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSB9KSA9PiB7XHJcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5vblN3aXRjaCkge1xyXG4gICAgICAgICAgdGhpcy5vblN3aXRjaCh0aGlzLnZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9uVmFsdWVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICB9KS5keFN3aXRjaCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm1lbnVTd2l0Y2hlci5lbGVtZW50KClbMF0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzd2l0Y2hWaWV3KCkge1xyXG4gICAgdGhpcy5kZXN0cm95KCk7XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRoaXMuc3dpdGNoVmlldygpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudCB9IGZyb20gJy4nO1xyXG5pbXBvcnQgeyBNZW51SXRlbVR5cGUgfSBmcm9tICcuLi9CdXNpbmVzcyc7XHJcbmltcG9ydCB7IGdldFVybEJ5TWVudUl0ZW1EYXRhIH0gZnJvbSAnLi4vSGVscGVycy9JbmRleCc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVNlYXJjaE9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICBnZXRNZW51RGF0YVNvdXJjZTogKCkgPT4gSVNlYXJjaERhdGFTb3VyY2U7XHJcbiAgZ2V0SXNHbG9iYWxNZW51U2hvd246ICgpID0+IGJvb2xlYW47XHJcbiAgb25EaW1lbnNpb25zQ2hhbmdlZD86ICgpID0+IHZvaWQ7XHJcbiAgb25NZW51SXRlbUNsaWNrPzogKGU6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQpID0+IHZvaWQ7XHJcbiAgb25NZW51SXRlbU9wZW5lZD86IChlOiBJT3BlblJlcG9ydEV2ZW50QXJncykgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2VhcmNoRGF0YVNvdXJjZSB7XHJcbiAgZ2xvYWJhbEl0ZW1zOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXTtcclxuICBwZXJzb25hbEl0ZW1zOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXSB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJT3BlblJlcG9ydEV2ZW50QXJncyB7XHJcbiAgbWVudUl0ZW06IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCA9IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCAmIHtcclxuICBpc0dsb2JhbDogYm9vbGVhbjtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlYXJjaCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRNZW51RGF0YVNvdXJjZTogKCkgPT4gSVNlYXJjaERhdGFTb3VyY2U7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRJc0dsb2JhbE1lbnVTaG93bjogKCkgPT4gYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uRGltZW5zaW9uc0NoYW5nZWQ6ICgpID0+IHZvaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk1lbnVJdGVtQ2xpY2s6IChlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25NZW51SXRlbU9wZW5lZDogKGU6IElPcGVuUmVwb3J0RXZlbnRBcmdzKSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIHNlYXJjaERyb3BEb3duOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBzZWFyY2hSZXN1bHRzVHJlZUxpc3Q6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVNlYXJjaE9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZ2V0TWVudURhdGFTb3VyY2UgPSBvcHRpb25zLmdldE1lbnVEYXRhU291cmNlO1xyXG4gICAgdGhpcy5nZXRJc0dsb2JhbE1lbnVTaG93biA9IG9wdGlvbnMuZ2V0SXNHbG9iYWxNZW51U2hvd247XHJcbiAgICB0aGlzLm9uRGltZW5zaW9uc0NoYW5nZWQgPSBvcHRpb25zLm9uRGltZW5zaW9uc0NoYW5nZWQ7XHJcbiAgICB0aGlzLm9uTWVudUl0ZW1PcGVuZWQgPSBvcHRpb25zLm9uTWVudUl0ZW1PcGVuZWQ7XHJcbiAgICB0aGlzLm9uTWVudUl0ZW1DbGljayA9IG9wdGlvbnMub25NZW51SXRlbUNsaWNrO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZpc2libGUoaXNWaXNpYmxlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcHRpb24oJ3Zpc2libGUnLCBpc1Zpc2libGUpO1xyXG4gICAgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkICYmIHRoaXMub25EaW1lbnNpb25zQ2hhbmdlZCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFNlYXJjaFRleHQodGV4dDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcHRpb24oJ3ZhbHVlJywgdGV4dCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVsb2FkTWVudUl0ZW1zKCkge1xyXG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3Q/Lm9wdGlvbignZGF0YVNvdXJjZScsIHRoaXMuZ2V0RGF0YVNvdXJjZUZvclNlYXJjaCh0aGlzLmdldE1lbnVEYXRhU291cmNlKCkpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBjb25zdCBmb3JtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTtcclxuICAgIGZvcm1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Zvcm0taW5saW5lJyk7XHJcblxyXG4gICAgY29uc3QgJGlucHV0ID0gJCgnPGRpdiAvPicpLmR4RHJvcERvd25Cb3goe1xyXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaCcsXHJcbiAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICBzaG93RHJvcERvd25CdXR0b246IGZhbHNlLFxyXG4gICAgICBhcHBseVZhbHVlTW9kZTogJ2luc3RhbnRseScsXHJcbiAgICAgIGFjY2VwdEN1c3RvbVZhbHVlOiB0cnVlLFxyXG4gICAgICBvcGVuT25GaWVsZENsaWNrOiBmYWxzZSxcclxuICAgICAgbW9kZTogJ3NlYXJjaCcsXHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7XHJcbiAgICAgICAgJ3R5cGUnOiAnc2VhcmNoJyxcclxuICAgICAgICAnYXJpYS1sYWJlbCc6ICdTZWFyY2gnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKGUsICRlbCkgPT4ge1xyXG4gICAgICAgICRlbC5hZGRDbGFzcygnaGVhZGVyLXNlYXJjaC1yZXN1bHRzLXRyZWUtbGlzdCcpO1xyXG4gICAgICAgIGNvbnN0ICR0cmVlTGlzdCA9ICQoJzxkaXY+JykuZHhUcmVlTGlzdCh7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiB0aGlzLmdldERhdGFTb3VyY2VGb3JTZWFyY2godGhpcy5nZXRNZW51RGF0YVNvdXJjZSgpKSxcclxuICAgICAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgICAgZm9jdXNlZFJvd0VuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgICAgIGFsbG93QWRkaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgYWxsb3dVcGRhdGluZzogZmFsc2UsXHJcbiAgICAgICAgICAgIGFsbG93RGVsZXRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG5vRGF0YVRleHQ6ICdObyByZXN1bHRzIGZvdW5kJyxcclxuICAgICAgICAgIGRhdGFTdHJ1Y3R1cmU6ICd0cmVlJyxcclxuICAgICAgICAgIGtleUV4cHI6ICdJZCcsXHJcbiAgICAgICAgICBpdGVtc0V4cHI6ICdJdGVtcycsXHJcbiAgICAgICAgICBmaWx0ZXJNb2RlOiAnZnVsbEJyYW5jaCcsXHJcbiAgICAgICAgICBzaG93Q29sdW1uSGVhZGVyczogZmFsc2UsXHJcbiAgICAgICAgICBjb2x1bW5zOiBbe1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdOYW1lJyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnXHJcbiAgICAgICAgICB9XSxcclxuICAgICAgICAgIG9uQ2VsbENsaWNrOiAoeyBkYXRhIH0pID0+IHtcclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvTWVudUl0ZW0oZGF0YSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25LZXlEb3duOiAoYXJncykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBldmVudDogS2V5Ym9hcmRFdmVudCA9IGFyZ3MuZXZlbnQgYXMgYW55O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZm9jdXNlZFJvd0tleSA9IHRoaXMuc2VhcmNoUmVzdWx0c1RyZWVMaXN0Lm9wdGlvbignZm9jdXNlZFJvd0tleScpO1xyXG4gICAgICAgICAgICBpZiAoZm9jdXNlZFJvd0tleSAhPT0gbnVsbCAmJiBmb2N1c2VkUm93S2V5ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnRW50ZXInOlxyXG4gICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3QuZ2V0Tm9kZUJ5S2V5KGZvY3VzZWRSb3dLZXkpLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUb01lbnVJdGVtKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJyAnOlxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdC5leHBhbmRSb3coZm9jdXNlZFJvd0tleSk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoUmVzdWx0c1RyZWVMaXN0LmNvbGxhcHNlUm93KGZvY3VzZWRSb3dLZXkpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxyXG4gICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VhcmNoRHJvcERvd24uZm9jdXMoKSk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdCA9ICR0cmVlTGlzdC5keFRyZWVMaXN0KCdpbnN0YW5jZScpO1xyXG5cclxuICAgICAgICByZXR1cm4gJHRyZWVMaXN0O1xyXG4gICAgICB9LFxyXG4gICAgICBkcm9wRG93bk9wdGlvbnM6IHtcclxuICAgICAgICBwb3NpdGlvbjoge1xyXG4gICAgICAgICAgb2Y6ICcuc2VhcmNoLWRyb3Bkb3duJyxcclxuICAgICAgICAgIG15OiAndG9wJyxcclxuICAgICAgICAgIGF0OiAnYm90dG9tJyxcclxuICAgICAgICAgIG9mZnNldDogeyB4OiAxNDksIHk6IDQgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd2lkdGg6IDUxOCxcclxuICAgICAgICBhbmltYXRpb246IHtcclxuICAgICAgICAgIHNob3c6IHsgZHVyYXRpb246IDAgfSxcclxuICAgICAgICAgIGhpZGU6IHsgZHVyYXRpb246IDAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXHJcbiAgICAgICAgb25TaG93bjogKGUpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2VhcmNoRHJvcERvd24uZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRm9jdXNJbjogKGUpID0+IHtcclxuICAgICAgICBlLmNvbXBvbmVudC5lbGVtZW50KCkuYWRkQ2xhc3MoJ2ZvY3VzZWQnKTtcclxuICAgICAgICB0aGlzLm9uRGltZW5zaW9uc0NoYW5nZWQgJiYgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkKCk7XHJcbiAgICAgICAgdGhpcy5jaGVja1NlYXJjaFJlc3V0UG9wdXBWaXNpYmlsaXR5KGUuY29tcG9uZW50LmVsZW1lbnQoKS5maW5kKCdpbnB1dC5keC10ZXh0ZWRpdG9yLWlucHV0JykudmFsKCkgYXMgc3RyaW5nKTtcclxuICAgICAgfSxcclxuICAgICAgb25Gb2N1c091dDogKGUpID0+IHtcclxuICAgICAgICBpZiAoIWUuY29tcG9uZW50LmVsZW1lbnQoKS5maW5kKCdpbnB1dC5keC10ZXh0ZWRpdG9yLWlucHV0JykudmFsKCkpIHtcclxuICAgICAgICAgIGUuY29tcG9uZW50LmVsZW1lbnQoKS5yZW1vdmVDbGFzcygnZm9jdXNlZCcpO1xyXG4gICAgICAgICAgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkICYmIHRoaXMub25EaW1lbnNpb25zQ2hhbmdlZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25LZXlVcDogKGUpID0+IHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGV2ZW50OiBLZXlib2FyZEV2ZW50ID0gZS5ldmVudCBhcyBhbnk7XHJcblxyXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBlLmNvbXBvbmVudC5lbGVtZW50KCkuZmluZCgnaW5wdXQuZHgtdGV4dGVkaXRvci1pbnB1dCcpLnZhbCgpIGFzIHN0cmluZztcclxuXHJcbiAgICAgICAgICB0aGlzLmNoZWNrU2VhcmNoUmVzdXRQb3B1cFZpc2liaWxpdHkodmFsdWUpO1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3Quc2VhcmNoQnlUZXh0KHZhbHVlKTtcclxuICAgICAgICAgIGNvbnN0IHRyaWdnZXJlZEZvY3VzQnV0dG9ucyA9IFsnVGFiJywgJ0VudGVyJywgJ0Fycm93RG93bicsICdBcnJvd1VwJ107XHJcbiAgICAgICAgICBpZiAodHJpZ2dlcmVkRm9jdXNCdXR0b25zLnNvbWUoKGIpID0+IGIgPT09IGV2ZW50LmtleSkpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3QuZm9jdXModGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3QuZ2V0Q2VsbEVsZW1lbnQoMCwgJ05hbWUnKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uS2V5RG93bjogKGUpID0+IHtcclxuICAgICAgICBjb25zdCBldmVudDogS2V5Ym9hcmRFdmVudCA9IGUuZXZlbnQgYXMgYW55O1xyXG5cclxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xyXG4gICAgICAgICAgdGhpcy5jbG9zZVNlYXJjaERyb3BEb3duKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvblZhbHVlQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICB0aGlzLmNoZWNrU2VhcmNoUmVzdXRQb3B1cFZpc2liaWxpdHkoZS52YWx1ZSk7XHJcbiAgICAgIH0sXHJcbiAgICB9KS5hZGRDbGFzcyhbJ2Zvcm0tY29udHJvbCcsICdtci1zbS0yJywgJ3NlYXJjaC1kcm9wZG93biddKTtcclxuXHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duID0gJGlucHV0LmR4RHJvcERvd25Cb3goJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgZm9ybUVsZW1lbnQuYXBwZW5kQ2hpbGQoJGlucHV0WzBdKTtcclxuICAgIHRoaXMuJGNvbnRhaW5lci5hcHBlbmQoZm9ybUVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0ZVRvTWVudUl0ZW0obWVudUl0ZW06IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsKSB7XHJcbiAgICBjb25zdCB1cmwgPSBnZXRVcmxCeU1lbnVJdGVtRGF0YShtZW51SXRlbSk7XHJcblxyXG4gICAgaWYgKHVybCkge1xyXG4gICAgICB0aGlzLmNsb3NlU2VhcmNoRHJvcERvd24oKTtcclxuXHJcbiAgICAgIGNvbnN0IGFyZ3M6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQgPSB7XHJcbiAgICAgICAgaXRlbTogbWVudUl0ZW0sXHJcbiAgICAgICAgb3JpZ2luYWxFdmVudDogbnVsbCxcclxuICAgICAgICBjYW5jZWw6IGZhbHNlXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLm9uTWVudUl0ZW1DbGljaz8uKGFyZ3MpO1xyXG5cclxuICAgICAgaWYgKGFyZ3MuY2FuY2VsKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLm9uTWVudUl0ZW1PcGVuZWQgJiYgdGhpcy5vbk1lbnVJdGVtT3BlbmVkKHsgbWVudUl0ZW0gfSk7XHJcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbG9zZVNlYXJjaERyb3BEb3duKCkge1xyXG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3Qub3B0aW9uKCdmb2N1c2VkUm93S2V5JywgdW5kZWZpbmVkKTtcclxuICAgIHRoaXMuc2VhcmNoRHJvcERvd24/Lm9wdGlvbigndmFsdWUnLCAnJyk7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5mb2N1cygpO1xyXG4gICAgdGhpcy5zZWFyY2hEcm9wRG93bj8uYmx1cigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja1NlYXJjaFJlc3V0UG9wdXBWaXNpYmlsaXR5KHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcGVuKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREYXRhU291cmNlRm9yU2VhcmNoKGRzOiBJU2VhcmNoRGF0YVNvdXJjZSk6IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10gfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKCFkcykge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGdldFJlZHVjZXIgPSAoaXNHbG9iYWw6IGJvb2xlYW4pID0+IHtcclxuICAgICAgY29uc3QgcmVkdWNlciA9IChyZXM6IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sIGl0ZW06IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCkgPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLkl0ZW1zICYmIGl0ZW0uSXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBpdGVtLkl0ZW1zID0gaXRlbS5JdGVtcy5yZWR1Y2UocmVkdWNlciwgW10pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gaXRlbS5WaXNpYmxlID09PSB1bmRlZmluZWQgfHwgaXRlbS5WaXNpYmxlID09PSBudWxsIHx8IGl0ZW0uVmlzaWJsZSA9PT0gdHJ1ZTtcclxuICAgICAgICBjb25zdCBpc0Rpc2FibGVkID0gaXRlbS5EaXNhYmxlZCA9PT0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKGlzVmlzaWJsZSAmJiAhaXNEaXNhYmxlZCkge1xyXG4gICAgICAgICAgcmVzLnB1c2goeyAuLi5pdGVtLCBpc0dsb2JhbCB9IGFzIElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICByZXR1cm4gcmVkdWNlcjtcclxuICAgIH07XHJcblxyXG4gICAgaWYgKGRzLnBlcnNvbmFsSXRlbXMgJiYgZHMucGVyc29uYWxJdGVtcy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgZ2xvYmFsTWVudVJvb3QgPSB7XHJcbiAgICAgICAgTmFtZTogJ0dsb2JhbCBNZW51JywgSWQ6IC0xLCBpc0dsb2JhbDogdHJ1ZSwgVHlwZTogTWVudUl0ZW1UeXBlLk1lbnVOb2RlLFxyXG4gICAgICAgIEl0ZW1zOiBkcy5nbG9hYmFsSXRlbXMucmVkdWNlKGdldFJlZHVjZXIodHJ1ZSksIFtdKVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3QgcGVyc29uYWxNZW51Um9vdCA9IHtcclxuICAgICAgICBOYW1lOiAnUGVyc29uYWwgTWVudScsIElkOiAtMiwgaXNHbG9iYWw6IGZhbHNlLCBUeXBlOiBNZW51SXRlbVR5cGUuTWVudU5vZGUsXHJcbiAgICAgICAgSXRlbXM6IGRzLnBlcnNvbmFsSXRlbXMucmVkdWNlKGdldFJlZHVjZXIoZmFsc2UpLCBbXSlcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmdldElzR2xvYmFsTWVudVNob3duKCkgPyBbZ2xvYmFsTWVudVJvb3QsIHBlcnNvbmFsTWVudVJvb3RdIDogW3BlcnNvbmFsTWVudVJvb3QsIGdsb2JhbE1lbnVSb290XTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBkcy5nbG9hYmFsSXRlbXMucmVkdWNlKGdldFJlZHVjZXIodHJ1ZSksIFtdKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCB7IERldkV4cHJlc3NFdmVudEFyZ3MgfSBmcm9tICcuL0RldkV4cHJlc3NFdmVudEFyZ3MnO1xyXG5leHBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuL0V2ZW50RW1pdHRlcic7XHJcbmV4cG9ydCB7IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgfSBmcm9tICcuL0dlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UnO1xyXG4iLCAiXHVGRUZGZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudExpc3RlbmVyczogYW55W107XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5ldmVudExpc3RlbmVycyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uKGV2dCwgbGlzdGVuZXIpIHtcclxuICAgIGlmICghdGhpcy5ldmVudExpc3RlbmVyc1tldnRdKSB7XHJcbiAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZ0XSA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZ0XS5wdXNoKGxpc3RlbmVyKTtcclxuXHJcbiAgICByZXR1cm4gbGlzdGVuZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25jZShldnQsIGxpc3RlbmVyKSB7XHJcbiAgICB0aGlzLm9uKGV2dCwgKGUpID0+IHtcclxuICAgICAgbGlzdGVuZXIoZSk7XHJcbiAgICAgIHRoaXMub2ZmKGV2dCwgbGlzdGVuZXIpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdChldnQsIGUgPSBudWxsKSB7XHJcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2dF07XHJcblxyXG4gICAgaWYgKGxpc3RlbmVycykge1xyXG4gICAgICBmb3IgKGNvbnN0IGN1cnJlbnRMaXN0ZW5lciBvZiBsaXN0ZW5lcnMpIHtcclxuICAgICAgICBpZiAoY3VycmVudExpc3RlbmVyKSB7XHJcbiAgICAgICAgICBjdXJyZW50TGlzdGVuZXIuY2FsbCh0aGlzLCBlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvZmYoZXZ0LCBsaXN0ZW5lcikge1xyXG4gICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5ldmVudExpc3RlbmVyc1tldnRdO1xyXG5cclxuICAgIGlmIChsaXN0ZW5lcnMpIHtcclxuICAgICAgY29uc3QgZmlsdGVyZWQgPSBbXTtcclxuXHJcbiAgICAgIGZvciAoY29uc3QgY3VycmVudExpc3RlbmVyIG9mIGxpc3RlbmVycykge1xyXG4gICAgICAgIGlmIChjdXJyZW50TGlzdGVuZXIgIT09IGxpc3RlbmVyKSB7XHJcbiAgICAgICAgICBmaWx0ZXJlZC5wdXNoKGN1cnJlbnRMaXN0ZW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2dF0gPSBmaWx0ZXJlZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhZGRIYW5kbGVyKGV2ZW50OiBzdHJpbmcsIG9yaWdpbkhhbmRsZXIsIGdldEFyZ3VtZW50cykge1xyXG4gICAgY29uc3QgaW50ZXJuYWxIYW5kbGVyID0gKCkgPT4ge1xyXG4gICAgICBvcmlnaW5IYW5kbGVyKFxyXG4gICAgICAgIGdldEFyZ3VtZW50cygpLFxyXG4gICAgICAgICgpID0+IHRoaXMub2ZmKGV2ZW50LCBpbnRlcm5hbEhhbmRsZXIpXHJcbiAgICAgICk7XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMub24oZXZlbnQsIGludGVybmFsSGFuZGxlcik7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTG9nb1NldHRpbmdzIH0gZnJvbSAnLi4vRGF0YSc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHsgdGhyb3dSZW5kZXJFcnJvciwgTXV0YWJsZSB9IGZyb20gJy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcbmltcG9ydCB7IElMYXlvdXRCcmVha3BvaW50LCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cywgZ2V0VXJsQnlNZW51SXRlbURhdGEgfSBmcm9tICcuLi9IZWxwZXJzL0luZGV4JztcclxuaW1wb3J0IHsgVXNlck1lbnUsIFVzZXJNZW51SXRlbUNsaWNrRXZlbnQgfSBmcm9tICcuL1VzZXJNZW51JztcclxuaW1wb3J0IHsgTmF2aWdhdGlvbk1lbnUsIE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQgfSBmcm9tICcuL05hdmlnYXRpb25NZW51JztcclxuaW1wb3J0IHsgTG9nbyB9IGZyb20gJy4vTG9nbyc7XHJcbmltcG9ydCB7IE1lbnVTd2l0Y2hlciB9IGZyb20gJy4vTWVudVN3aXRjaGVyJztcclxuaW1wb3J0IHsgSVVzZXJNZW51SXRlbU1vZGVsIH0gZnJvbSAnLi9JVXNlck1lbnVJdGVtJztcclxuaW1wb3J0IHsgSU1lbnVTZXR0aW5ncyB9IGZyb20gJy4vSU1lbnVTZXR0aW5ncyc7XHJcbmltcG9ydCB7IElBcHBNZW51TW9kZWwgfSBmcm9tICcuL0lBcHBNZW51TW9kZWwnO1xyXG5pbXBvcnQgeyBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfSBmcm9tICcuL0lOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCc7XHJcbmltcG9ydCBTZWFyY2gsIHsgSU9wZW5SZXBvcnRFdmVudEFyZ3MsIElTZWFyY2hEYXRhU291cmNlIH0gZnJvbSAnLi9TZWFyY2gnO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9VdGlscy9JbmRleCc7XHJcblxyXG5jb25zdCBIRUFERVJfREFUQV9DQUNIRV9GSUVMRCA9ICdpc3pvbGVhLXVpfGhlYWRlci1kYXRhLWNhY2hlJztcclxuY29uc3QgU0hPV19HTE9CQUxfTUVOVV9LRVkgPSAnaXN6b2xlYS11aXxzaG93LWdsb2JhbC1tZW51JztcclxuXHJcbmNvbnN0IGdldERhdGFTb3VyY2VDYWNoZUZpZWxkID0gKHVzZXJOYW1lPzogc3RyaW5nKSA9PiB7XHJcbiAgcmV0dXJuIGAke0hFQURFUl9EQVRBX0NBQ0hFX0ZJRUxEfSR7dXNlck5hbWUgPyBgfCR7dXNlck5hbWV9YCA6ICcnfWA7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBIZWFkZXJUaGVtZXMgPSAnaXN6b2xlYSc7XHJcbmV4cG9ydCBpbnRlcmZhY2UgSUhlYWRlck9wdGlvbnMge1xyXG4gICRlbDogSlF1ZXJ5O1xyXG4gIG1lbnVTZXR0aW5ncz86IElNZW51U2V0dGluZ3M7XHJcbiAgbG9nb1NldHRpbmdzPzogSUxvZ29TZXR0aW5ncyB8IHN0cmluZztcclxuICBkaXNwbGF5U2VhcmNoPzogYm9vbGVhbjtcclxuICBpbW1lZGlhdGVSZW5kZXI/OiBib29sZWFuO1xyXG4gIHRoZW1lPzogSGVhZGVyVGhlbWVzO1xyXG4gIG9uSW5pdD86ICgpID0+IHZvaWQ7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJSGVhZGVyRWxlbWVudHMge1xyXG4gIHJlYWRvbmx5IHJvb3Q/OiBIVE1MRWxlbWVudDtcclxuICByZWFkb25seSBsb2dvQ29udGFpbmVyPzogSFRNTEVsZW1lbnQ7XHJcbiAgcmVhZG9ubHkgY29udGVudENvbnRhaW5lcj86IEhUTUxFbGVtZW50O1xyXG4gIHJlYWRvbmx5IHRvZ2dsZUJ1dHRvbkNvbnRhaW5lcj86IEhUTUxFbGVtZW50O1xyXG4gIHJlYWRvbmx5IHRvZ2dsZUJ1dHRvbj86IEhUTUxFbGVtZW50O1xyXG4gIHJlYWRvbmx5IG1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXI/OiBIVE1MRWxlbWVudDtcclxuICByZWFkb25seSBtZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXI/OiBIVE1MRWxlbWVudDtcclxufVxyXG5cclxuaW50ZXJmYWNlIElBamF4UGFnZU1hcmtlciB7XHJcbiAgaXNMb2FkZWRCeUFqYXg6IHRydWU7XHJcbiAgdXJsOiBzdHJpbmc7XHJcbiAgaXNNZW51U3dpdGNoZXJHbG9iYWw6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBIZWFkZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTUVOVV9TV0lUQ0hFUl9JTklUSUFMSVpFRF9FVkVOVCA9ICdtZW51LXN3aXRjaGVyLWluaXRpYWxpemVkLWV2ZW50JztcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgR0xPQkFMX1VSTF9SRUdFWCA9IG5ldyBSZWdFeHAoJ14oPzpbYS16XSs6KT8vLycsICdpJyk7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRE9DVFlQRV9NQVJLRVJfUkVHRVggPSBuZXcgUmVnRXhwKCchRE9DVFlQRSBodG1sPicsICdpJyk7XHJcblxyXG4gIHB1YmxpYyB1c2VyTWVudTogVXNlck1lbnUgfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIG5hdmlnYXRpb25NZW51OiBOYXZpZ2F0aW9uTWVudSB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgbWVudVN3aXRjaGVyOiBNZW51U3dpdGNoZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIGxvZ286IExvZ28gfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIGRhdGE6IElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgdGhlbWU6IEhlYWRlclRoZW1lcztcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncyB8IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IG1lbnVTZXR0aW5nczogSU1lbnVTZXR0aW5ncyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRpc3BsYXlTZWFyY2g6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb2xsYXBzZUJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZFBhbmVsOiBEZXZFeHByZXNzLnVpLmR4TG9hZFBhbmVsO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJHBhcnRpYWxWaWV3UGxhY2VIb2xkZXI6IEpRdWVyeSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZVVybEFmdGVyUGFydGlhbExvYWRpbmc6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblBhcnRpYWxWaWV3TG9hZGVkOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBiZWZvcmVQYXJ0aWFsVmlld0xvYWRpbmc6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uTmF2aWFndGlvbk1lbnVJdGVtQ2xpY2tIYW5kbGVyID0gdGhpcy5vbk5hdmlhZ3Rpb25NZW51SXRlbUNsaWNrLmJpbmQodGhpcyk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk5hdmlnYXRpb25NZW51SXRlbU9wZW5lZEhhbmRsZXIgPSB0aGlzLm9uTmF2aWdhdGlvbk1lbnVJdGVtT3BlbmVkLmJpbmQodGhpcyk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblVzZXJNZW51SXRlbUNsaWNrSGFuZGxlciA9IHRoaXMub25Vc2VyTWVudUl0ZW1DbGljay5iaW5kKHRoaXMpO1xyXG4gIHByaXZhdGUgc2VhcmNoOiBTZWFyY2ggfCB1bmRlZmluZWQ7XHJcblxyXG4gIC8vIGVsZW1lbnRzXHJcbiAgcHJpdmF0ZSByZWFkb25seSAkZWw6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRzOiBNdXRhYmxlPElIZWFkZXJFbGVtZW50cz4gPSB7fTtcclxuICBwcml2YXRlICRsb2FkQmFyOiBKUXVlcnkgfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElIZWFkZXJPcHRpb25zKSB7XHJcbiAgICBzdXBlcigpO1xyXG5cclxuICAgIHRoaXMuJGVsID0gb3B0aW9ucy4kZWw7XHJcbiAgICB0aGlzLm1lbnVTZXR0aW5ncyA9IG9wdGlvbnMubWVudVNldHRpbmdzO1xyXG4gICAgdGhpcy5sb2dvU2V0dGluZ3MgPSBvcHRpb25zLmxvZ29TZXR0aW5ncztcclxuICAgIHRoaXMudGhlbWUgPSBvcHRpb25zLnRoZW1lIHx8ICdpc3pvbGVhJztcclxuICAgIHRoaXMuZGlzcGxheVNlYXJjaCA9IG9wdGlvbnMuZGlzcGxheVNlYXJjaDtcclxuICAgIHRoaXMuY29sbGFwc2VCcmVha3BvaW50ID0gb3B0aW9ucy5tZW51U2V0dGluZ3M/LmNvbGxhcHNlQnJlYWtwb2ludCB8fCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cy5tZDtcclxuXHJcbiAgICB0aGlzLiRwYXJ0aWFsVmlld1BsYWNlSG9sZGVyID0gb3B0aW9ucy5tZW51U2V0dGluZ3M/LnBhcnRpYWxWaWV3UGxhY2VIb2xkZXI7XHJcbiAgICB0aGlzLnVwZGF0ZVVybEFmdGVyUGFydGlhbExvYWRpbmcgPSBvcHRpb25zLm1lbnVTZXR0aW5ncz8udXBkYXRlVXJsQWZ0ZXJQYXJ0aWFsTG9hZGluZztcclxuICAgIHRoaXMub25QYXJ0aWFsVmlld0xvYWRlZCA9IG9wdGlvbnMubWVudVNldHRpbmdzPy5vblBhcnRpYWxWaWV3TG9hZGVkO1xyXG4gICAgdGhpcy5iZWZvcmVQYXJ0aWFsVmlld0xvYWRpbmcgPSBvcHRpb25zLm1lbnVTZXR0aW5ncz8uYmVmb3JlUGFydGlhbFZpZXdMb2FkaW5nO1xyXG5cclxuICAgIHRoaXMubG9hZFBhbmVsID0gdGhpcy5jcmVhdGVMb2FkUGFuZWwoKTtcclxuXHJcbiAgICBpZiAob3B0aW9ucy5pbW1lZGlhdGVSZW5kZXIgPT09IGZhbHNlKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLndhcm4oJ1RoZSBcXCdpbW1lZGlhdGVSZW5kZXIgPT09IGZhbHNlXFwnIG9wdGlvbiBpc25cXCd0IHN1cHBvcnRlZCBhdCB0aGUgbW9tZW50LicpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vTk9URTogVG8gb3ZlcnJpZGUgYm9vdHN0cmFwIGhlYWRlciB6LWluZGV4IHdoaWNoIGlzIDE2MDBcclxuICAgIERldkV4cHJlc3MudWkuZHhPdmVybGF5LmJhc2VaSW5kZXgoMTcwMCk7XHJcblxyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICAgIHRoaXMuaW5pdCgpXHJcbiAgICAgIC50aGVuKCgpID0+IG9wdGlvbnM/Lm9uSW5pdD8uKCkpO1xyXG5cclxuICAgIHRoaXMuc3Vic2NyaWJlT25IaXN0b3J5UG9wU3RhdGUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVEYXRhKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLm1lbnVTZXR0aW5ncykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jbGVhckFwcE1lbnVNb2RlbENhY2hlKCk7XHJcbiAgICB0aGlzLmRhdGEgPSBhd2FpdCB0aGlzLmxvYWREYXRhKCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLnJvb3QpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVyZW5kZXJNZW51cygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIC8qKlxyXG4gICAgICogPFJvb3Q+XHJcbiAgICAgKiAgPEJyYW5kPlxyXG4gICAgICogICAgPExvZ28gLz5cclxuICAgICAqICA8L0JyYW5kPlxyXG4gICAgICogIDxDb250ZW50VG9nZ2xlciAvPlxyXG4gICAgICogIDxDb250ZW50PlxyXG4gICAgICogICAgPFNlYXJjaCAvPlxyXG4gICAgICogICAgPE5hdmlnYXRpb25NZW51IC8+XHJcbiAgICAgKiAgICA8VXNlck1lbnUgLz5cclxuICAgICAqICA8L0NvbnRlbnQ+XHJcbiAgICAgKiAgPE1lbnVTd2l0Y2hlciAvPlxyXG4gICAgICogPC9Sb290PlxyXG4gICAgICogPExvYWRCYXIgLz5cclxuICAgICAqL1xyXG5cclxuICAgIHRoaXMucmVuZGVyUm9vdCgpO1xyXG4gICAgdGhpcy5yZW5kZXJCcmFuZCgpO1xyXG4gICAgdGhpcy5yZW5kZXJDb250ZW50VG9nZ2xlcigpO1xyXG4gICAgdGhpcy5yZW5kZXJDb250ZW50KCk7XHJcbiAgICB0aGlzLnJlbmRlckxvYWRCYXIoKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZUNvbnRlbnRBbmRUb2dnbGVyVmlzaWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdWJzY3JpYmVPbkhpc3RvcnlQb3BTdGF0ZSgpIHtcclxuICAgIGlmICh0aGlzLiRwYXJ0aWFsVmlld1BsYWNlSG9sZGVyKSB7XHJcbiAgICAgICQod2luZG93KS5iaW5kKCdwb3BzdGF0ZScsIChlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZXZlbnQgPSBlLm9yaWdpbmFsRXZlbnQgYXMgUG9wU3RhdGVFdmVudDtcclxuICAgICAgICBjb25zdCBzdGF0ZSA9IGV2ZW50LnN0YXRlIGFzIElBamF4UGFnZU1hcmtlcjtcclxuICAgICAgICBpZiAoc3RhdGUgJiYgc3RhdGUuaXNMb2FkZWRCeUFqYXgpIHtcclxuICAgICAgICAgIHRoaXMubG9hZFBhZ2VWaWFBamF4Q29yZShzdGF0ZS51cmwpO1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVNZW51U3dpdGNoZXJTdGF0ZShzdGF0ZS5pc01lbnVTd2l0Y2hlckdsb2JhbCk7XHJcbiAgICAgICAgICB0aGlzLm5hdmlnYXRpb25NZW51LnVwZGF0ZUFjdGl2ZUl0ZW1zU3RhdGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTG9hZFBhbmVsKCk6IERldkV4cHJlc3MudWkuZHhMb2FkUGFuZWwge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKS5keExvYWRQYW5lbCh7XHJcbiAgICAgIHNoYWRpbmdDb2xvcjogJ3JnYmEoMCwwLDAsMC40KScsXHJcbiAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICBzaG93SW5kaWNhdG9yOiB0cnVlLFxyXG4gICAgICBzaG93UGFuZTogdHJ1ZSxcclxuICAgICAgc2hhZGluZzogdHJ1ZSxcclxuICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXHJcbiAgICB9KS5hcHBlbmRUbyh0aGlzLiRlbCkuZHhMb2FkUGFuZWwoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclJvb3QoKSB7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnJvb3QgPSB0aGlzLiRlbFswXTtcclxuICAgIHRoaXMuZWxlbWVudHMucm9vdC5jbGFzc0xpc3QuYWRkKCdoZWFkZXInLCB0aGlzLnRoZW1lLCAnbmF2YmFyJywgJ25hdmJhci1kYXJrJywgYG5hdmJhci1leHBhbmQtJHt0aGlzLmNvbGxhcHNlQnJlYWtwb2ludC5uYW1lfWApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJCcmFuZCgpIHtcclxuICAgIGlmICh0aGlzLmxvZ28gfHwgIXRoaXMubG9nb1NldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGJyYW5kRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGJyYW5kRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoZWFkZXJfX2JyYW5kJywgJ25hdmJhci1icmFuZCcpO1xyXG4gICAgYnJhbmRFbGVtZW50LmhyZWYgPSAnLyc7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnJvb3QuYXBwZW5kQ2hpbGQoYnJhbmRFbGVtZW50KTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLmxvZ29Db250YWluZXIgPSBicmFuZEVsZW1lbnQ7XHJcblxyXG4gICAgdGhpcy5sb2dvID0gbmV3IExvZ28oJCh0aGlzLmVsZW1lbnRzLmxvZ29Db250YWluZXIpLCB0aGlzLmxvZ29TZXR0aW5ncyk7XHJcbiAgICB0aGlzLmxvZ28uaW5pdFdpZGdldCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJTZWFyY2goKSB7XHJcbiAgICBpZiAoIXRoaXMuZGlzcGxheVNlYXJjaCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ2NvbnRlbnRDb250YWluZXInKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlYXJjaCA9IG5ldyBTZWFyY2goe1xyXG4gICAgICAkY29udGFpbmVyOiAkKHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lciksXHJcbiAgICAgIGdldE1lbnVEYXRhU291cmNlOiAoKSA9PiB0aGlzLmdldFNlYXJjaERhdGFTb3VyY2UodGhpcy5kYXRhKSxcclxuICAgICAgZ2V0SXNHbG9iYWxNZW51U2hvd246ICgpID0+IHRoaXMuZ2V0SXNHbG9iYWxNZW51U2hvd24oKSxcclxuICAgICAgb25EaW1lbnNpb25zQ2hhbmdlZDogKCkgPT4gdGhpcy5uYXZpZ2F0aW9uTWVudT8uYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpLFxyXG4gICAgICBvbk1lbnVJdGVtQ2xpY2s6IHRoaXMub25OYXZpYWd0aW9uTWVudUl0ZW1DbGlja0hhbmRsZXIsXHJcbiAgICAgIG9uTWVudUl0ZW1PcGVuZWQ6IHRoaXMub25OYXZpZ2F0aW9uTWVudUl0ZW1PcGVuZWRIYW5kbGVyLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnNlYXJjaC5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0SXNHbG9iYWxNZW51U2hvd24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc1Nob3dHbG9iYWxNZW51KCkgfHwgIXRoaXMuZGF0YT8uQWRkR2xvYmFsUGVyc29uYWxTd2l0Y2hlcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25OYXZpZ2F0aW9uTWVudUl0ZW1PcGVuZWQoZTogSU9wZW5SZXBvcnRFdmVudEFyZ3MpIHtcclxuICAgIHRoaXMudXBkYXRlTWVudVN3aXRjaGVyU3RhdGUoZS5tZW51SXRlbS5pc0dsb2JhbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZU1lbnVTd2l0Y2hlclN0YXRlKGlzR2xvYmFsOiBib29sZWFuKSB7XHJcbiAgICBpZiAoIXRoaXMubWVudVN3aXRjaGVyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5tZW51U3dpdGNoZXIudmFsdWUgIT09IGlzR2xvYmFsKSB7XHJcbiAgICAgIHRoaXMubWVudVN3aXRjaGVyLnNldFZhbHVlKGlzR2xvYmFsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQ29udGVudFRvZ2dsZXIoKSB7XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCduYXZiYXItdG9nZ2xlcicpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uc2V0QXR0cmlidXRlKCd0eXBlJywgJ2J1dHRvbicpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLXRvZ2dsZScsICdjb2xsYXBzZScpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLXRhcmdldCcsICcuaGVhZGVyX19jb250ZW50Jyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5vbmNsaWNrID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLnNlYXJjaD8uc2V0U2VhcmNoVGV4dCgnJyk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICBpY29uLmNsYXNzTGlzdC5hZGQoJ25hdmJhci10b2dnbGVyLWljb24nKTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbkNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b25Db250YWluZXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyX190b2dnbGUtYnV0dG9uLWNvbnRhaW5lcicpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uLmFwcGVuZENoaWxkKGljb24pO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b25Db250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24pO1xyXG4gICAgdGhpcy5lbGVtZW50cy5yb290LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uQ29udGFpbmVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQ29udGVudCgpIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5yb290KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnY29sbGFwc2UnLCAnbmF2YmFyLWNvbGxhcHNlJywgJ2hlYWRlcl9fY29udGVudCcpO1xyXG4gICAgdGhpcy5lbGVtZW50cy5yb290LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJTZWFyY2goKTtcclxuICAgIHRoaXMucmVuZGVyTmF2aWdhdGlvbk1lbnUoW10pO1xyXG4gICAgdGhpcy5yZW5kZXJNZW51U3dpdGNoZXIoKTtcclxuICAgIHRoaXMucmVuZGVyVXNlck1lbnUoW10pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJOYXZpZ2F0aW9uTWVudShtZW51SXRlbU1vZGVsczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10pIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdjb250ZW50Q29udGFpbmVyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXNHbG9iYWxNZW51ID0gdGhpcy5nZXRJc0dsb2JhbE1lbnVTaG93bigpO1xyXG5cclxuICAgIGlmICh0aGlzLm5hdmlnYXRpb25NZW51KSB7XHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbk1lbnUudXBkYXRlRGF0YShtZW51SXRlbU1vZGVscywgaXNHbG9iYWxNZW51KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbk1lbnUgPSBuZXcgTmF2aWdhdGlvbk1lbnUoXHJcbiAgICAgICAgdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyLFxyXG4gICAgICAgIG1lbnVJdGVtTW9kZWxzLFxyXG4gICAgICAgIGlzR2xvYmFsTWVudSxcclxuICAgICAgICB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCxcclxuICAgICAgICB0aGlzLm9uTmF2aWFndGlvbk1lbnVJdGVtQ2xpY2tIYW5kbGVyLFxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLm5hdmlnYXRpb25NZW51LnJlbmRlcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblVzZXJNZW51SXRlbUNsaWNrKGU6IFVzZXJNZW51SXRlbUNsaWNrRXZlbnQpIHtcclxuICAgIHRoaXMubWVudVNldHRpbmdzLm9uVXNlck1lbnVDbGljaz8uKGUpO1xyXG4gICAgaWYgKGUuY2FuY2VsIHx8IHRoaXMuaXNLZXlQcmVzc2VkKGUub3JpZ2luYWxFdmVudCBhcyBNb3VzZUV2ZW50KSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdXJsID0gZS5pdGVtLlVybDtcclxuXHJcbiAgICBpZiAoZS5pdGVtLkFsd2F5c1JlbG9hZFBhZ2UpIHtcclxuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBlLmNhbmNlbCA9IHRoaXMudHJ5RG9QYXJ0aWFsUGFnZUxvYWRpbmcodXJsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25OYXZpYWd0aW9uTWVudUl0ZW1DbGljayhlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0aGlzLm1lbnVTZXR0aW5ncy5vbk5hdmlnYXRpb25NZW51SXRlbUNsaWNrPy4oZSk7XHJcbiAgICBpZiAoZS5jYW5jZWwgfHwgdGhpcy5pc0tleVByZXNzZWQoZS5vcmlnaW5hbEV2ZW50IGFzIE1vdXNlRXZlbnQpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnVwZGF0ZU1lbnVTd2l0Y2hlclN0YXRlKGUuaXRlbS5pc0dsb2JhbCk7XHJcblxyXG4gICAgY29uc3QgdXJsID0gZ2V0VXJsQnlNZW51SXRlbURhdGEoZS5pdGVtKTtcclxuICAgIGUuY2FuY2VsID0gdGhpcy50cnlEb1BhcnRpYWxQYWdlTG9hZGluZyh1cmwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0tleVByZXNzZWQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIHJldHVybiBldmVudCAmJiAoZXZlbnQuYWx0S2V5IHx8IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQuc2hpZnRLZXkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cnlEb1BhcnRpYWxQYWdlTG9hZGluZyh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuJHBhcnRpYWxWaWV3UGxhY2VIb2xkZXIgJiYgdXJsICYmIHRoaXMuY2hlY2tJc0xvY2FsVXJsKHVybCkpIHtcclxuICAgICAgaWYgKHRoaXMudXBkYXRlVXJsQWZ0ZXJQYXJ0aWFsTG9hZGluZykge1xyXG4gICAgICAgIGNvbnN0IHN0YXRlOiBJQWpheFBhZ2VNYXJrZXIgPSB7XHJcbiAgICAgICAgICBpc0xvYWRlZEJ5QWpheDogdHJ1ZSxcclxuICAgICAgICAgIGlzTWVudVN3aXRjaGVyR2xvYmFsOiAhIXRoaXMubWVudVN3aXRjaGVyPy52YWx1ZSxcclxuICAgICAgICAgIHVybFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShzdGF0ZSwgbnVsbCwgdXJsKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5sb2FkUGFnZVZpYUFqYXhDb3JlKHVybCk7XHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbk1lbnUudXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpO1xyXG5cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja0lzTG9jYWxVcmwodXJsOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiAhSGVhZGVyLkdMT0JBTF9VUkxfUkVHRVgudGVzdCh1cmwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja0lzUGFydGlhbFBhZ2VDb250ZW50KGNvbnRlbnQ6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGNvbnRlbnQgJiYgIUhlYWRlci5ET0NUWVBFX01BUktFUl9SRUdFWC50ZXN0KGNvbnRlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkUGFnZVZpYUFqYXhDb3JlKHVybDogc3RyaW5nKSB7XHJcbiAgICB3aW5kb3cuaXNJc296U2VydmVyRXhjZXB0aW9uID0gZmFsc2U7XHJcblxyXG4gICAgdGhpcy5sb2FkUGFuZWwuc2hvdygpO1xyXG5cclxuICAgIGNvbnN0IHVybEZvclBhcnRpYWxMb2FkaW5nID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgdXJsKTtcclxuICAgIHVybEZvclBhcnRpYWxMb2FkaW5nLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2lzb3pQYXJ0aWFsTG9hZGluZycsICd0cnVlJyk7XHJcbiAgICBjb25zdCBwYXJ0aWFsVXJsID0gdXJsRm9yUGFydGlhbExvYWRpbmcudG9TdHJpbmcoKTtcclxuXHJcbiAgICB0aGlzLmJlZm9yZVBhcnRpYWxWaWV3TG9hZGluZz8uKCk7XHJcblxyXG4gICAgJC5hamF4KHBhcnRpYWxVcmwsIHsgZGF0YVR5cGU6ICdodG1sJyB9KS5hbHdheXMoKGRhdGEsIHRleHRTdGF0dXMpID0+IHtcclxuICAgICAgaWYgKHRleHRTdGF0dXMgIT09ICdzdWNjZXNzJyB8fCAhdGhpcy5jaGVja0lzUGFydGlhbFBhZ2VDb250ZW50KGRhdGEpKSB7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy4kcGFydGlhbFZpZXdQbGFjZUhvbGRlci5odG1sKGRhdGEpO1xyXG4gICAgICAgIHRoaXMub25QYXJ0aWFsVmlld0xvYWRlZD8uKCk7XHJcbiAgICAgICAgdGhpcy5sb2FkUGFuZWwuaGlkZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyVXNlck1lbnUoaXRlbXM6IElVc2VyTWVudUl0ZW1Nb2RlbFtdKSB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzPy51c2VyTmFtZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ2NvbnRlbnRDb250YWluZXInKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMudXNlck1lbnUpIHtcclxuICAgICAgY29uc3QgZGl2aWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICBkaXZpZGVyLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLWRpdmlkZXInKTtcclxuICAgICAgdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKGRpdmlkZXIpO1xyXG5cclxuICAgICAgdGhpcy51c2VyTWVudSA9IG5ldyBVc2VyTWVudSh7XHJcbiAgICAgICAgY29udGFpbmVyOiB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIsXHJcbiAgICAgICAgdXNlck5hbWU6IHRoaXMubWVudVNldHRpbmdzLnVzZXJOYW1lLFxyXG4gICAgICAgIHVzZXJBdmF0YXI6IHRoaXMubWVudVNldHRpbmdzLnVzZXJBdmF0YXIsXHJcbiAgICAgICAgaXRlbXMsXHJcbiAgICAgICAgY29sbGFwc2VCcmVha3BvaW50OiB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCxcclxuICAgICAgICBvbkl0ZW1DbGljazogdGhpcy5vblVzZXJNZW51SXRlbUNsaWNrSGFuZGxlcixcclxuICAgICAgICBnZXREaXNwbGF5ZWRVc2VySW5mbzogdGhpcy5tZW51U2V0dGluZ3MuZ2V0RGlzcGxheWVkVXNlckluZm9cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudXNlck1lbnUucmVuZGVyKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnVzZXJNZW51LnVwZGF0ZUl0ZW1zKGl0ZW1zKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyTWVudVN3aXRjaGVyKCkge1xyXG4gICAgaWYgKCF0aGlzLmRhdGE/LkFkZEdsb2JhbFBlcnNvbmFsU3dpdGNoZXIpIHtcclxuICAgICAgaWYgKHRoaXMubWVudVN3aXRjaGVyKSB7XHJcbiAgICAgICAgdGhpcy5tZW51U3dpdGNoZXIuZGVzdHJveSgpO1xyXG4gICAgICAgIHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyRGVza3RvcENvbnRhaW5lcj8ucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXI/LnJlbW92ZSgpO1xyXG5cclxuICAgICAgICB0aGlzLm1lbnVTd2l0Y2hlciA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5tZW51U3dpdGNoZXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdjb250ZW50Q29udGFpbmVyJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uQ29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCd0b2dnbGVCdXR0b25Db250YWluZXInKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyRGVza3RvcENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtZW51LXN3aXRjaGVyJyk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyTW9iaWxlQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21lbnUtc3dpdGNoZXInKTtcclxuXHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlciA9IG5ldyBNZW51U3dpdGNoZXIoe1xyXG4gICAgICBkZXNrdG9wQ29udGFpbmVyOiB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXIsXHJcbiAgICAgIG1vYmlsZUNvbnRhaW5lcjogdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXIsXHJcbiAgICAgIGNvbGxhcHNlQnJlYWtwb2ludDogdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQsXHJcbiAgICAgIHN0YXJ0VmFsdWU6IHRoaXMuaXNTaG93R2xvYmFsTWVudSgpLFxyXG4gICAgICBvblN3aXRjaDogKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFNIT1dfR0xPQkFMX01FTlVfS0VZLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xyXG5cclxuICAgICAgICBjb25zdCBuYXZpZ2F0aW9uSXRlbXMgPSB0aGlzLmdldE5hdmlnYXRpb25JdGVtcyh0aGlzLmRhdGEpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoPy5zZXRTZWFyY2hUZXh0KCcnKTtcclxuICAgICAgICB0aGlzLnNlYXJjaD8ucmVsb2FkTWVudUl0ZW1zKCk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJOYXZpZ2F0aW9uTWVudShuYXZpZ2F0aW9uSXRlbXMgfHwgW10pO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ29udGVudEFuZFRvZ2dsZXJWaXNpYmxlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5tZW51U3dpdGNoZXIucmVuZGVyKCk7XHJcbiAgICB0aGlzLmVtaXQoSGVhZGVyLk1FTlVfU1dJVENIRVJfSU5JVElBTElaRURfRVZFTlQpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJEZXNrdG9wQ29udGFpbmVyLCB0aGlzLnVzZXJNZW51Py5yb290KTtcclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uQ29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlck1vYmlsZUNvbnRhaW5lciwgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJMb2FkQmFyKCkge1xyXG4gICAgdGhpcy4kbG9hZEJhciA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnbG9hZC1iYXInKS5oaWRlKCkuYXBwZW5kVG8odGhpcy4kZWwpO1xyXG5cclxuICAgIGNvbnN0ICRsb2FkID0gJCgnPGRpdiAvPicpLmFkZENsYXNzKCdsb2FkJykuYXBwZW5kVG8odGhpcy4kbG9hZEJhcik7XHJcbiAgICAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2JhcicpLmFwcGVuZFRvKCRsb2FkKTtcclxuXHJcbiAgICBmdW5jdGlvbiByb3RhdGUoc2VsZWN0b3I6IHN0cmluZykge1xyXG4gICAgICAkKHNlbGVjdG9yKS5hbmltYXRlKHsgbGVmdDogJCgnLmxvYWQnKS53aWR0aCgpIH0sIDIwMDAsICgpID0+IHtcclxuICAgICAgICAkKHNlbGVjdG9yKS5jc3MoJ2xlZnQnLCBgJHstJChzZWxlY3Rvcikud2lkdGgoKSF9cHhgKTtcclxuICAgICAgICByb3RhdGUoc2VsZWN0b3IpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByb3RhdGUoJy5iYXInKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVyZW5kZXJNZW51cygpIHtcclxuICAgIGNvbnN0IG5hdmlnYXRpb25JdGVtcyA9IHRoaXMuZ2V0TmF2aWdhdGlvbkl0ZW1zKHRoaXMuZGF0YSk7XHJcbiAgICBjb25zdCB1c2VySXRlbXMgPSB0aGlzLmdldFVzZXJJdGVtcyh0aGlzLmRhdGEpO1xyXG4gICAgLy8gSWYgaXRlbXMgYXJlIHVuZGVmaW5lZCB3ZSBkb24ndCB1cGRhdGUgbWVudXNcclxuICAgIG5hdmlnYXRpb25JdGVtcyAmJiB0aGlzLnJlbmRlck5hdmlnYXRpb25NZW51KG5hdmlnYXRpb25JdGVtcyk7XHJcbiAgICB1c2VySXRlbXMgJiYgdGhpcy5yZW5kZXJVc2VyTWVudSh1c2VySXRlbXMpO1xyXG4gICAgdGhpcy5yZW5kZXJNZW51U3dpdGNoZXIoKTtcclxuICAgIHRoaXMudXBkYXRlQ29udGVudEFuZFRvZ2dsZXJWaXNpYmxlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUNvbnRlbnRBbmRUb2dnbGVyVmlzaWJsZSgpIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyICYmICF0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmF2aWdhdGlvbkl0ZW1zID0gdGhpcy5nZXROYXZpZ2F0aW9uSXRlbXModGhpcy5kYXRhKTtcclxuICAgIGNvbnN0IHVzZXJJdGVtcyA9IHRoaXMuZ2V0VXNlckl0ZW1zKHRoaXMuZGF0YSk7XHJcbiAgICBjb25zdCBpc1Zpc2libGUgPSAobmF2aWdhdGlvbkl0ZW1zICYmIG5hdmlnYXRpb25JdGVtcy5sZW5ndGggPiAwKVxyXG4gICAgICB8fCB0aGlzLm1lbnVTZXR0aW5ncz8udXNlck5hbWVcclxuICAgICAgfHwgKHVzZXJJdGVtcyAmJiB1c2VySXRlbXMubGVuZ3RoID4gMCk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJywgIWlzVmlzaWJsZSk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJywgIWlzVmlzaWJsZSk7XHJcblxyXG4gICAgdGhpcy5zZWFyY2g/LnNldFZpc2libGUoISFpc1Zpc2libGUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLm1lbnVTZXR0aW5ncykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kYXRhID0gYXdhaXQgdGhpcy5sb2FkRGF0YSgpO1xyXG5cclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5yb290KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlcmVuZGVyTWVudXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbG9hZERhdGEoKTogUHJvbWlzZTxJQXBwTWVudU1vZGVsIHwgdW5kZWZpbmVkPiB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGhlYWRlciBkb2VzblxcJ3QgaGF2ZSBtZW51IHNldHRpbmdzJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLm1lbnVTZXR0aW5ncy5kYXRhICE9PSAnc3RyaW5nJykge1xyXG4gICAgICByZXR1cm4gdGhpcy5tZW51U2V0dGluZ3MuZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZGF0YSA9IHRoaXMuZ2V0Q2FjaGVkQXBwTWVudU1vZGVsKCk7XHJcbiAgICBpZiAoZGF0YSkge1xyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLnNlYXJjaD8uc2V0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgIHRoaXMuJGxvYWRCYXI/LnNob3coKTtcclxuICAgICAgZGF0YSA9IGF3YWl0IHNlbmRSZXF1ZXN0PElBcHBNZW51TW9kZWw+KHRoaXMubWVudVNldHRpbmdzLmRhdGEpO1xyXG4gICAgICB0aGlzLmNhY2hlQXBwTWVudU1vZGVsKGRhdGEpO1xyXG4gICAgICB0aGlzLnNlYXJjaD8ucmVsb2FkTWVudUl0ZW1zKCk7XHJcblxyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoPy5zZXRWaXNpYmxlKHRydWUpO1xyXG4gICAgICB0aGlzLiRsb2FkQmFyPy5oaWRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE5hdmlnYXRpb25JdGVtcyhhcHBNZW51TW9kZWw6IElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICghYXBwTWVudU1vZGVsKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2hvd0dsb2JhbE1lbnUgPSB0aGlzLmlzU2hvd0dsb2JhbE1lbnUoKTtcclxuXHJcbiAgICByZXR1cm4gc2hvd0dsb2JhbE1lbnUgfHwgIWFwcE1lbnVNb2RlbC5BZGRHbG9iYWxQZXJzb25hbFN3aXRjaGVyXHJcbiAgICAgID8gYXBwTWVudU1vZGVsLk5hdmlnYXRpb25JdGVtc1xyXG4gICAgICA6IGFwcE1lbnVNb2RlbC5QZXJzb25hbE5hdmlnYXRpb25JdGVtcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2VhcmNoRGF0YVNvdXJjZShhcHBNZW51TW9kZWw6IElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQpOiBJU2VhcmNoRGF0YVNvdXJjZSB7XHJcbiAgICBpZiAoIWFwcE1lbnVNb2RlbCkge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGdsb2FiYWxJdGVtczogYXBwTWVudU1vZGVsLk5hdmlnYXRpb25JdGVtcyxcclxuICAgICAgcGVyc29uYWxJdGVtczogYXBwTWVudU1vZGVsLkFkZEdsb2JhbFBlcnNvbmFsU3dpdGNoZXIgPyBhcHBNZW51TW9kZWwuUGVyc29uYWxOYXZpZ2F0aW9uSXRlbXMgOiB1bmRlZmluZWRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFVzZXJJdGVtcyhhcHBNZW51TW9kZWw6IElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICghYXBwTWVudU1vZGVsKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFwcE1lbnVNb2RlbC5Vc2VySXRlbXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENhY2hlZEFwcE1lbnVNb2RlbCgpOiBJQXBwTWVudU1vZGVsIHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJhd1ZhbHVlID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oZ2V0RGF0YVNvdXJjZUNhY2hlRmllbGQodGhpcy5tZW51U2V0dGluZ3MudXNlck5hbWUpKTtcclxuXHJcbiAgICByZXR1cm4gcmF3VmFsdWUgPT09IG51bGwgPyByYXdWYWx1ZSA6IEpTT04ucGFyc2UocmF3VmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYWNoZUFwcE1lbnVNb2RlbChkYXRhOiBJQXBwTWVudU1vZGVsKSB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShnZXREYXRhU291cmNlQ2FjaGVGaWVsZCh0aGlzLm1lbnVTZXR0aW5ncy51c2VyTmFtZSksIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJBcHBNZW51TW9kZWxDYWNoZSgpIHtcclxuICAgIGlmICghdGhpcy5tZW51U2V0dGluZ3MpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKGdldERhdGFTb3VyY2VDYWNoZUZpZWxkKHRoaXMubWVudVNldHRpbmdzLnVzZXJOYW1lKSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzU2hvd0dsb2JhbE1lbnUoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCByYXdJc0dsb2JhbCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShTSE9XX0dMT0JBTF9NRU5VX0tFWSk7XHJcbiAgICBjb25zdCBpc0dsb2JhbCA9IHJhd0lzR2xvYmFsID09PSBudWxsID8gcmF3SXNHbG9iYWwgYXMgbnVsbCA6IEpTT04ucGFyc2UocmF3SXNHbG9iYWwpIGFzIGJvb2xlYW47XHJcblxyXG4gICAgcmV0dXJuIGlzR2xvYmFsID09PSBudWxsIHx8IGlzR2xvYmFsO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGY29uc3QgZ3JpZENvbHVtblR5cGVzID0gWydkZWZhdWx0JywgJ3N0cmluZycsICdudW1iZXInLCAnZGF0ZScsICdib29sZWFuJywgJ29iamVjdCcsICdkYXRldGltZSddO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZ3JpZENvbHVtblR5cGVzO1xyXG4iLCAiXHVGRUZGZXhwb3J0IGVudW0gQ2RtSW1wb3J0RmlsZU1vZGUge1xyXG4gIE5vbmUgPSAwLFxyXG4gIEFkZE5ld1Jvd3MgPSAxLFxyXG4gIFJlcGxhY2VBbGxSb3dzID0gMixcclxufVxyXG4iLCAiXHVGRUZGXHJcbmV4cG9ydCBlbnVtIEdyaWREYXRhQ29sdW1uRGF0YVR5cGUge1xyXG4gIERlZmF1bHQgPSAnZGVmYXVsdCcsXHJcbiAgU3RyaW5nID0gJ3N0cmluZycsXHJcbiAgTnVtYmVyID0gJ251bWJlcicsXHJcbiAgRGF0ZSA9ICdkYXRlJyxcclxuICBCb29sZWFuID0gJ2Jvb2xlYW4nLFxyXG4gIE9iamVjdCA9ICdvYmplY3QnLFxyXG4gIERhdGV0aW1lID0gJ2RhdGV0aW1lJ1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkQ29sdW1uU3RhdGUge1xyXG4gIGRhdGFGaWVsZDogc3RyaW5nO1xyXG4gIGRhdGFUeXBlOiBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlO1xyXG4gIHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyO1xyXG4gIGdyb3VwSW5kZXg/OiBudW1iZXI7XHJcbiAgc29ydEluZGV4PzogbnVtYmVyO1xyXG4gIHNvcnRPcmRlcj86IG51bWJlcjtcclxuICB2aXNpYmxlPzogYm9vbGVhbjtcclxuICB2aXNpYmxlSW5kZXg/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGUge1xyXG4gIGNhcHRpb24/OiBzdHJpbmc7XHJcbiAgdG9vbHRpcD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZEV4dGVuZGVkQ29sdW1uU3RhdGUgZXh0ZW5kcyBJR3JpZENvbHVtblN0YXRlLCBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZSB7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRTdGF0ZSB7XHJcbiAgY29sdW1uczogSUdyaWRFeHRlbmRlZENvbHVtblN0YXRlW107XHJcbn1cclxuIiwgImNvbnN0IGxvYWRlZFVybHM6IHN0cmluZ1tdID0gW11cclxuXHJcbmZ1bmN0aW9uIHJhbmRvbUludGVnZXIobWluOiBudW1iZXIsIG1heDogbnVtYmVyKSB7XHJcbiAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSkgKyBtaW47XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzaG93ICgkY29udGFpbmVyOiBKUXVlcnksIGltYWdlVXJsczogc3RyaW5nW10sIGltZ0NoYW5nZUludGVydmFsU2VjOiBudW1iZXIgPSA1LCB0cmFuc2l0aW9uVGltZVNlYzogbnVtYmVyID0gMikge1xyXG4gIC8vIFNodWZmbGUgdXJsc1xyXG4gIGNvbnN0IHNodWZmbGVkVXJscyA9IGltYWdlVXJscy5zb3J0KChhLCBiKSA9PiAwLjUgLSBNYXRoLnJhbmRvbSgpKTtcclxuXHJcbiAgJGNvbnRhaW5lci5hZGRDbGFzcygnaXN6b2xlYS1iYWNrZ3JvdW5kLWltYWdlLXZpZXdlcicpLmNzcyh7XHJcbiAgICAndHJhbnNpdGlvbic6IGBiYWNrZ3JvdW5kLWltYWdlICR7dHJhbnNpdGlvblRpbWVTZWN9cyBlYXNlLWluLW91dCAwc2AsXHJcbiAgfSk7XHJcblxyXG4gIHNodWZmbGVkVXJscy5mb3JFYWNoKCh1cmwsIGluZGV4KSA9PiB7XHJcbiAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcclxuXHJcbiAgICBpbWcuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcclxuICAgICAgbG9hZGVkVXJscy5wdXNoKHVybCk7XHJcblxyXG4gICAgICBpZihsb2FkZWRVcmxzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgIGluaXRJbWFnZXNDaGFuZ2luZygkY29udGFpbmVyLCBpbWdDaGFuZ2VJbnRlcnZhbFNlYyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaW1nLnNyYyA9IHVybDtcclxuICAgIH0sIGluZGV4ICogMTAwKTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0TmV4dEluZGV4VG9TaG93IChjdXJyZW50SW5kZXg6IG51bWJlcikge1xyXG4gIGlmKGxvYWRlZFVybHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcblxyXG4gIGlmKGxvYWRlZFVybHMubGVuZ3RoID09PSAyKSB7XHJcbiAgICByZXR1cm4gY3VycmVudEluZGV4ID09PSAwID8gMSA6IDA7XHJcbiAgfVxyXG5cclxuICBjb25zdCBuZXh0SW5kZXggPSByYW5kb21JbnRlZ2VyKDAsIGxvYWRlZFVybHMubGVuZ3RoIC0gMSk7XHJcblxyXG4gIGlmKG5leHRJbmRleCA9PT0gY3VycmVudEluZGV4KSB7XHJcbiAgICByZXR1cm4gbmV4dEluZGV4ID09PSBsb2FkZWRVcmxzLmxlbmd0aCAtIDEgPyAwIDogbmV4dEluZGV4ICsgMTtcclxuICB9XHJcblxyXG4gIHJldHVybiBuZXh0SW5kZXg7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGluaXRJbWFnZXNDaGFuZ2luZyAoJGNvbnRhaW5lcjogSlF1ZXJ5LCBpbWdDaGFuZ2VJbnRlcnZhbFNlYzogbnVtYmVyKSB7XHJcbiAgbGV0IGN1cnJlbnRTaG93bkluZGV4ID0gMDtcclxuXHJcbiAgc2hvd0ltYWdlKCRjb250YWluZXIsIGN1cnJlbnRTaG93bkluZGV4KTtcclxuXHJcbiAgd2luZG93LnNldEludGVydmFsKCgpID0+IHtcclxuICAgIGlmKGxvYWRlZFVybHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjdXJyZW50U2hvd25JbmRleCA9IGdldE5leHRJbmRleFRvU2hvdyhjdXJyZW50U2hvd25JbmRleCk7XHJcbiAgICBzaG93SW1hZ2UoJGNvbnRhaW5lciwgY3VycmVudFNob3duSW5kZXgpO1xyXG4gIH0sIGltZ0NoYW5nZUludGVydmFsU2VjICogMTAwMCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3dJbWFnZSAoJGNvbnRhaW5lcjogSlF1ZXJ5LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgJGNvbnRhaW5lci5jc3MoJ2JhY2tncm91bmQtaW1hZ2UnLCBgdXJsKFwiJHtsb2FkZWRVcmxzW2luZGV4XX1cIilgKTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUxpY2VuY2UgfSBmcm9tICcuLi9CdXNpbmVzcyc7XHJcblxyXG5leHBvcnQgZW51bSBGb290ZXJJbmRpY2F0b3JTdGF0dXMge1xyXG4gIFN1Y2Nlc3MsXHJcbiAgV2FybmluZyxcclxuICBFcnJvclxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElGb290ZXJJbmRpY2F0b3JWYWx1ZSB7XHJcbiAgc3RhdHVzOiBGb290ZXJJbmRpY2F0b3JTdGF0dXM7XHJcbiAgdGl0bGU/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZvb3RlckluZGljYXRvck9wdGlvbnMge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICB0ZXh0OiBzdHJpbmc7XHJcbiAgdmFsdWU6IElGb290ZXJJbmRpY2F0b3JWYWx1ZTtcclxuICBnZXRWYWx1ZT86ICgpID0+IFByb21pc2U8SUZvb3RlckluZGljYXRvclZhbHVlPjtcclxuICBnZXRWYWx1ZUludGVydmFsTXM/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZvb3Rlck9wdGlvbnMge1xyXG4gICRyb290OiBKUXVlcnk7XHJcbiAgbmFtZTogc3RyaW5nIHwgZmFsc2U7XHJcbiAgbGljZW5jZTogSUxpY2VuY2UgfCBmYWxzZTtcclxuICB5ZWFyPzogbnVtYmVyIHwgJ2xvY2FsJyB8IGZhbHNlO1xyXG4gIHZlcnNpb24/OiBzdHJpbmc7XHJcbiAgc2VydmVyTmFtZT86IHN0cmluZztcclxuICBkYXRhYmFzZT86IHN0cmluZztcclxuICBpbmRpY2F0b3JzPzogSUZvb3RlckluZGljYXRvck9wdGlvbnNbXTtcclxufVxyXG5cclxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IFBhcnRpYWw8SUZvb3Rlck9wdGlvbnM+ID0ge1xyXG4gIHllYXI6ICdsb2NhbCdcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvb3RlciB7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0Q3VycmVudFllYXIoY3VycmVudFllYXI6IG51bWJlciB8ICdsb2NhbCcgfCBmYWxzZSk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gY3VycmVudFllYXIgPT09ICdsb2NhbCcgfHwgY3VycmVudFllYXIgPT09IGZhbHNlXHJcbiAgICAgID8gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpXHJcbiAgICAgIDogY3VycmVudFllYXI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5ICRyb290OiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb25uZWN0ZWRUbzogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd05hbWU6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsaWNlbmNlOiBJTGljZW5jZSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IHNob3dMaWNlbmNlOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgeWVhcjogbnVtYmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd1llYXI6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93Q29ubmVjdGVkVG86IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRpY2F0b3JzT3B0aW9uczogSUZvb3RlckluZGljYXRvck9wdGlvbnNbXTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGluZGljYXRvcnNCeU5hbWU6IE1hcDxzdHJpbmcsIEpRdWVyeT47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRpY2F0b3JDbGFzc0J5U3RhdHVzID0gbmV3IE1hcDxGb290ZXJJbmRpY2F0b3JTdGF0dXMsIHN0cmluZz4oW1xyXG4gICAgW0Zvb3RlckluZGljYXRvclN0YXR1cy5TdWNjZXNzLCAnZm9vdGVyX19pbmRpY2F0b3JfdHlwZV9zdWNjZXNzJ10sXHJcbiAgICBbRm9vdGVySW5kaWNhdG9yU3RhdHVzLldhcm5pbmcsICdmb290ZXJfX2luZGljYXRvcl90eXBlX3dhcm5pbmcnXSxcclxuICAgIFtGb290ZXJJbmRpY2F0b3JTdGF0dXMuRXJyb3IsICdmb290ZXJfX2luZGljYXRvcl90eXBlX2Vycm9yJ11cclxuICBdKTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUZvb3Rlck9wdGlvbnMpIHtcclxuICAgIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB7IC4uLm9wdGlvbnMsIC4uLmRlZmF1bHRPcHRpb25zIH0gYXMgUmVxdWlyZWQ8SUZvb3Rlck9wdGlvbnM+O1xyXG5cclxuICAgIHRoaXMuJHJvb3QgPSBtZXJnZWRPcHRpb25zLiRyb290O1xyXG4gICAgdGhpcy5uYW1lID0gbWVyZ2VkT3B0aW9ucy5uYW1lICE9PSBmYWxzZSA/IG1lcmdlZE9wdGlvbnMubmFtZSA6IHVuZGVmaW5lZDtcclxuICAgIHRoaXMubGljZW5jZSA9IG1lcmdlZE9wdGlvbnMubGljZW5jZSAhPT0gZmFsc2UgPyBtZXJnZWRPcHRpb25zLmxpY2VuY2UgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnllYXIgPSBGb290ZXIuZ2V0Q3VycmVudFllYXIobWVyZ2VkT3B0aW9ucy55ZWFyKTtcclxuICAgIHRoaXMudmVyc2lvbiA9IG9wdGlvbnMudmVyc2lvbiB8fCB1bmRlZmluZWQ7XHJcblxyXG4gICAgdGhpcy5zaG93TmFtZSA9IG1lcmdlZE9wdGlvbnMubmFtZSAhPT0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dMaWNlbmNlID0gbWVyZ2VkT3B0aW9ucy5saWNlbmNlICE9PSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd1llYXIgPSBtZXJnZWRPcHRpb25zLnllYXIgIT09IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93Q29ubmVjdGVkVG8gPSAhIW1lcmdlZE9wdGlvbnMuc2VydmVyTmFtZSAmJiAhIW1lcmdlZE9wdGlvbnMuZGF0YWJhc2U7XHJcbiAgICB0aGlzLmluZGljYXRvcnNPcHRpb25zID0gb3B0aW9ucy5pbmRpY2F0b3JzIHx8IFtdO1xyXG4gICAgdGhpcy5pbmRpY2F0b3JzQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIEpRdWVyeT4oKTtcclxuXHJcbiAgICB0aGlzLmNvbm5lY3RlZFRvID0gdGhpcy5zaG93Q29ubmVjdGVkVG8gPyBgJHttZXJnZWRPcHRpb25zLnNlcnZlck5hbWV9IC0gJHttZXJnZWRPcHRpb25zLmRhdGFiYXNlfWAgOiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdCgpIHtcclxuICAgIHRoaXMuJHJvb3QuYWRkQ2xhc3MoJ2Zvb3RlcicpO1xyXG5cclxuICAgIHRoaXMucmVuZGVySW5kaWNhdG9ycygpO1xyXG4gICAgdGhpcy5yZW5kZXJDb3B5cmlnaHQoKTtcclxuICAgIHRoaXMuc2hvd1llYXIgJiYgdGhpcy5yZW5kZXJZZWFyKCk7XHJcbiAgICB0aGlzLnNob3dOYW1lICYmIHRoaXMucmVuZGVyTmFtZSgpO1xyXG4gICAgdGhpcy5zaG93Q29ubmVjdGVkVG8gJiYgdGhpcy5yZW5kZXJDb25uZWN0ZWRUbygpO1xyXG4gICAgdGhpcy5zaG93TGljZW5jZSAmJiB0aGlzLnJlbmRlckxpY2VuY2UoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRJbmRpY2F0b3JWYWx1ZShpbmRpY2F0b3JOYW1lOiBzdHJpbmcsIHZhbHVlOiBJRm9vdGVySW5kaWNhdG9yVmFsdWUpIHtcclxuICAgIGNvbnN0ICRpbmRpY2F0b3JFbCA9IHRoaXMuaW5kaWNhdG9yc0J5TmFtZS5nZXQoaW5kaWNhdG9yTmFtZSk7XHJcbiAgICBpZiAoJGluZGljYXRvckVsKSB7XHJcbiAgICAgIHRoaXMuc2V0SW5kaWNhdG9yVmFsdWVDb3JlKCRpbmRpY2F0b3JFbCwgdmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJJbmRpY2F0b3JzKCkge1xyXG4gICAgdGhpcy5pbmRpY2F0b3JzT3B0aW9ucz8uZm9yRWFjaCgobykgPT4ge1xyXG4gICAgICBpZiAoby50ZXh0KSB7XHJcbiAgICAgICAgJCgnPHNwYW4+JylcclxuICAgICAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pbmRpY2F0b3ItdGV4dCcpXHJcbiAgICAgICAgICAuaHRtbChgJHtvLnRleHR9OmApXHJcbiAgICAgICAgICAuYXBwZW5kVG8odGhpcy4kcm9vdCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0ICRpbmRpY2F0b3JFbCA9ICQoJzxzcGFuPicpXHJcbiAgICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2luZGljYXRvcicpXHJcbiAgICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG5cclxuICAgICAgdGhpcy5zZXRJbmRpY2F0b3JWYWx1ZUNvcmUoJGluZGljYXRvckVsLCBvLnZhbHVlKTtcclxuICAgICAgdGhpcy5pbmRpY2F0b3JzQnlOYW1lLnNldChvLm5hbWUsICRpbmRpY2F0b3JFbCk7XHJcblxyXG4gICAgICBpZiAoby5nZXRWYWx1ZSAmJiBvLmdldFZhbHVlSW50ZXJ2YWxNcykge1xyXG4gICAgICAgIHNldEludGVydmFsKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgby5nZXRWYWx1ZSgpO1xyXG4gICAgICAgICAgdGhpcy5zZXRJbmRpY2F0b3JWYWx1ZUNvcmUoJGluZGljYXRvckVsLCB2YWx1ZSk7XHJcbiAgICAgICAgfSwgby5nZXRWYWx1ZUludGVydmFsTXMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0SW5kaWNhdG9yVmFsdWVDb3JlKCRpbmRpY2F0b3JFbDogSlF1ZXJ5LCB2YWx1ZTogSUZvb3RlckluZGljYXRvclZhbHVlKSB7XHJcbiAgICAkaW5kaWNhdG9yRWwuYXR0cigndGl0bGUnLCB2YWx1ZS50aXRsZSk7XHJcbiAgICAkaW5kaWNhdG9yRWwucmVtb3ZlQ2xhc3MoWy4uLnRoaXMuaW5kaWNhdG9yQ2xhc3NCeVN0YXR1cy52YWx1ZXMoKV0pO1xyXG4gICAgJGluZGljYXRvckVsLmFkZENsYXNzKHRoaXMuaW5kaWNhdG9yQ2xhc3NCeVN0YXR1cy5nZXQodmFsdWUuc3RhdHVzKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckNvcHlyaWdodCgpIHtcclxuICAgICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19jb3B5cmlnaHQnKVxyXG4gICAgICAuaHRtbCgnJmNvcHk7JylcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJOYW1lKCkge1xyXG4gICAgdGhpcy5uYW1lICYmICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pdGVtJylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2FwcC1uYW1lJylcclxuICAgICAgLnRleHQodGhpcy5uYW1lICsgKCEhdGhpcy52ZXJzaW9uID8gYDogJHt0aGlzLnZlcnNpb259YCA6ICcnKSlcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJDb25uZWN0ZWRUbygpIHtcclxuICAgIHRoaXMubmFtZSAmJiAkKCc8c3Bhbj4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9faXRlbScpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19jb25uZWN0ZWQtdG8nKVxyXG4gICAgICAudGV4dChgQ29ubmVjdGVkIHRvOiAke3RoaXMuY29ubmVjdGVkVG99LmApXHJcbiAgICAgIC5hcHBlbmRUbyh0aGlzLiRyb290KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyWWVhcigpIHtcclxuICAgICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pdGVtJylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2N1cnJlbnQteWVhcicpXHJcbiAgICAgIC50ZXh0KHRoaXMueWVhcilcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJMaWNlbmNlKCkge1xyXG4gICAgdGhpcy5saWNlbmNlICYmICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pdGVtJylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2xpY2VuY2UtaW5mbycpXHJcbiAgICAgIC5hcHBlbmQoXHJcbiAgICAgICAgJCgnPHNwYW4+JylcclxuICAgICAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19saWNlbmNlLW93bmVyJylcclxuICAgICAgICAgIC50ZXh0KGAke3RoaXMuZ2V0TGljZW5jZU93bmVyRGlzcGxheVRleHQodGhpcy5saWNlbmNlKX0uIGApXHJcbiAgICAgIClcclxuICAgICAgLmFwcGVuZChcclxuICAgICAgICAkKCc8c3Bhbj4nKVxyXG4gICAgICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2xpY2VuY2UtZGF0ZScpXHJcbiAgICAgICAgICAudGV4dCh0aGlzLmdldExpY2VuY2VFeHBpcmF0aW9uRGF0ZURpc3BsYXlUZXh0KHRoaXMubGljZW5jZSkpXHJcbiAgICAgIClcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRMaWNlbmNlT3duZXJEaXNwbGF5VGV4dChsaWNlbmNlOiBJTGljZW5jZSkge1xyXG4gICAgcmV0dXJuIGBMaWNlbmNlZCB0bzogJHtsaWNlbmNlLk93bmVyfWA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldExpY2VuY2VFeHBpcmF0aW9uRGF0ZURpc3BsYXlUZXh0KGxpY2VuY2U6IElMaWNlbmNlKSB7XHJcbiAgICBjb25zdCBkYXRlID0gdHlwZW9mIGxpY2VuY2UuRXhwaXJhdGlvbkRhdGUgPT09ICdzdHJpbmcnID8gbmV3IERhdGUobGljZW5jZS5FeHBpcmF0aW9uRGF0ZSkgOiBsaWNlbmNlLkV4cGlyYXRpb25EYXRlO1xyXG5cclxuICAgIHJldHVybiBgTGljZW5jZSBFeHBpcnk6ICR7ZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoKX1gO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGbGV0IHJlcGFpbnRUaW1lb3V0ID0gbnVsbDtcclxuY29uc3QgcmVzaXplSGFuZGxlcnMgPSBbXTtcclxuXHJcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB7XHJcbiAgaWYgKHJlcGFpbnRUaW1lb3V0KSB7XHJcbiAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHJlcGFpbnRUaW1lb3V0KTtcclxuICB9XHJcblxyXG4gIHJlcGFpbnRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgcmVzaXplSGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4gaGFuZGxlcigpKTtcclxuICAgIHJlcGFpbnRUaW1lb3V0ID0gbnVsbDtcclxuICB9LCAxMDApO1xyXG59KTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG9uUmVzaXplOiAoKSA9PiB2b2lkKSB7XHJcbiAgcmVzaXplSGFuZGxlcnMucHVzaChvblJlc2l6ZSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCBhdXRvUmVzaXplIGZyb20gJy4vQXV0b1Jlc2l6ZSc7XHJcblxyXG5jb25zdCBDU1MgPSB7XHJcbiAgbWFpbjogJy5tYWluJyxcclxuICBoZWFkZXI6ICcubWFpbiAuaGVhZGVyJyxcclxuICBjb250ZW50OiAnLmNvbnRlbnQtYXJlYScsXHJcbiAgcGFuZWw6ICcucGFuZWwnLFxyXG4gIGZvb3RlcjogJ2Zvb3RlcidcclxufTtcclxuXHJcbmxldCBsYXN0V2luZG93SGVpZ2h0ID0gbnVsbDtcclxubGV0IGxhc3RDb250ZW50SGVpZ2h0ID0gbnVsbDtcclxubGV0IGxhc3RXaWRnZXRIZWlnaHQgPSBudWxsO1xyXG5cclxuZnVuY3Rpb24gdXBkYXRlSGVpZ2h0KHdpZGdldCkge1xyXG4gIGNvbnN0ICRjb250ZW50ID0gJChDU1MuY29udGVudCk7XHJcblxyXG4gICRjb250ZW50LmhlaWdodChsYXN0Q29udGVudEhlaWdodCk7XHJcbiAgd2lkZ2V0Lm9wdGlvbignaGVpZ2h0JywgbGFzdFdpZGdldEhlaWdodCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNhbGN1bGF0ZUhlaWdodCh3aWRnZXQ6IERldkV4cHJlc3MudWkuV2lkZ2V0PGFueT4sIGlnbm9yZVNpYmxpbmdzOiBib29sZWFuID0gZmFsc2UsIGFkZE93blNpemU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gIGNvbnN0ICRtYWluID0gJChDU1MubWFpbik7XHJcbiAgY29uc3QgJGhlYWRlciA9ICQoQ1NTLmhlYWRlcik7XHJcbiAgY29uc3QgJGNvbnRlbnQgPSAkKENTUy5jb250ZW50KTtcclxuICBjb25zdCAkZm9vdGVyID0gJChDU1MuZm9vdGVyKTtcclxuXHJcbiAgY29uc3QgcGFkZGluZ3MgPSAkY29udGVudC5vdXRlckhlaWdodCgpIC0gJGNvbnRlbnQuaGVpZ2h0KCk7XHJcblxyXG4gIGxhc3RDb250ZW50SGVpZ2h0ID0gJG1haW4uaGVpZ2h0KCkgLSAkaGVhZGVyLmhlaWdodCgpIC0gJGZvb3Rlci5vdXRlckhlaWdodCgpIC0gcGFkZGluZ3M7XHJcbiAgbGFzdFdpbmRvd0hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTtcclxuXHJcbiAgY29uc3QgJGNvbnRlbnRFbGVtZW50cyA9ICRjb250ZW50LmNoaWxkcmVuKCk7XHJcbiAgbGV0IGNvbnRlbnRFbGVtZW50c0hlaWdodCA9IDA7XHJcblxyXG4gIGlmICghaWdub3JlU2libGluZ3MpIHtcclxuICAgIGNvbnN0ICR3aWRnZXRFbGVtZW50ID0gd2lkZ2V0LmVsZW1lbnQoKTtcclxuICAgICRjb250ZW50RWxlbWVudHMuZWFjaCgoaW5kZXgsIGVsKSA9PiB7XHJcbiAgICAgIGNvbnN0ICRjaGlsZCA9ICQoZWwpO1xyXG5cclxuICAgICAgaWYgKCRjaGlsZC5pcygkd2lkZ2V0RWxlbWVudCkgfHwgJGNoaWxkLmhhcygkd2lkZ2V0RWxlbWVudFswXSkubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb250ZW50RWxlbWVudHNIZWlnaHQgKz0gKCRjaGlsZC5pcygnOnZpc2libGUnKSAmJiAkY2hpbGQuY3NzKCdwb3NpdGlvbicpICE9PSAnYWJzb2x1dGUnKSA/ICRjaGlsZC5vdXRlckhlaWdodCh0cnVlKSA6IDA7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGxhc3RXaWRnZXRIZWlnaHQgPSBsYXN0Q29udGVudEhlaWdodCAtIGNvbnRlbnRFbGVtZW50c0hlaWdodDtcclxuXHJcbiAgaWYgKGFkZE93blNpemUpIHtcclxuICAgIGxhc3RXaWRnZXRIZWlnaHQgKz0gd2lkZ2V0LmVsZW1lbnQoKS5vdXRlckhlaWdodCgpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlSGVpZ2h0KHdpZGdldCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlY2FsY3VsYXRlSGVpZ2h0KHdpZGdldDogRGV2RXhwcmVzcy51aS5XaWRnZXQ8YW55Pikge1xyXG4gIGNvbnN0IHdpbmRvd0hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTtcclxuICBjb25zdCBkaWZmID0gd2luZG93SGVpZ2h0IC0gbGFzdFdpbmRvd0hlaWdodDtcclxuXHJcbiAgbGFzdENvbnRlbnRIZWlnaHQgKz0gZGlmZjtcclxuICBsYXN0V2lkZ2V0SGVpZ2h0ICs9IGRpZmY7XHJcbiAgbGFzdFdpbmRvd0hlaWdodCA9IHdpbmRvd0hlaWdodDtcclxuXHJcbiAgdXBkYXRlSGVpZ2h0KHdpZGdldCk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHdpZGdldDogRGV2RXhwcmVzcy51aS5XaWRnZXQ8YW55PiwgaWdub3JlU2libGluZ3M6IGJvb2xlYW4gPSBmYWxzZSwgYWRkT3duU2l6ZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgY2FsY3VsYXRlSGVpZ2h0KHdpZGdldCwgaWdub3JlU2libGluZ3MsIGFkZE93blNpemUpO1xyXG5cclxuICBhdXRvUmVzaXplKCgpID0+IHJlY2FsY3VsYXRlSGVpZ2h0KHdpZGdldCkpO1xyXG59XHJcbiIsICJcdUZFRkZjb25zdCBESVNBQkxFRF9DTEFTUyA9ICdpc296LWljb24tZGlzYWJsZWQnO1xyXG5cclxuZXhwb3J0IGNvbnN0IFRIRU1FX0NMQVNTRVMgPSB7XHJcbiAgbGc6ICdpc3pvbGVhLWxnJyxcclxuICBtZDogJ2lzem9sZWEtbWQnLFxyXG4gIHNtOiAnaXN6b2xlYS1zbSdcclxufTtcclxuXHJcbmV4cG9ydCBjbGFzcyBUaGVtZUhlbHBlciB7XHJcbiAgcHVibGljIHN0YXRpYyBzZXRFbGVtZW50TWlkZGxlU2l6ZShlbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+KSB7XHJcbiAgICBlbGVtZW50LmFkZENsYXNzKFRIRU1FX0NMQVNTRVMubWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBzZXRFbGVtZW50U21hbGxTaXplKGVsZW1lbnQ6IEpRdWVyeTxIVE1MRWxlbWVudD4pIHtcclxuICAgIGVsZW1lbnQuYWRkQ2xhc3MoVEhFTUVfQ0xBU1NFUy5zbSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHNldFdpZGdldE1pZGRsZVNpemUoaW5zdGFuY2U6IGFueSkge1xyXG4gICAgVGhlbWVIZWxwZXIuc2V0V2lkZ2V0U2l6ZShpbnN0YW5jZSwgVEhFTUVfQ0xBU1NFUy5tZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHNldFdpZGdldFNtYWxsU2l6ZShpbnN0YW5jZTogYW55KSB7XHJcbiAgICBUaGVtZUhlbHBlci5zZXRXaWRnZXRTaXplKGluc3RhbmNlLCBUSEVNRV9DTEFTU0VTLnNtKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SWNvbkNsYXNzKGljb246IHN0cmluZywgZGlzYWJsZWQ/OiBib29sZWFuLCBzaXplOiAxNiB8IDI0ID0gMTYpIHtcclxuICAgIGNvbnN0IGljb25DbGFzcyA9IGBpc296IGlzb3otaWNvbi0ke2ljb259LSR7c2l6ZX1gO1xyXG5cclxuICAgIHJldHVybiAhZGlzYWJsZWRcclxuICAgICAgPyBpY29uQ2xhc3NcclxuICAgICAgOiBgJHtpY29uQ2xhc3N9ICR7RElTQUJMRURfQ0xBU1N9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIHNldFdpZGdldFNpemUoaW5zdGFuY2U6IGFueSwgc2l6ZUNsYXNzOiBzdHJpbmcpIHtcclxuICAgIGlmIChpbnN0YW5jZSkge1xyXG4gICAgICBpbnN0YW5jZS5vcHRpb24oJ2VsZW1lbnRBdHRyJywgeyBjbGFzczogc2l6ZUNsYXNzIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGY29uc3QgQ0xBU1NFUyA9IHtcclxuICB0aXRsZTogJ2lzb3otdGl0bGUnXHJcbn07XHJcblxyXG5leHBvcnQgY2xhc3MgVG9vbGJhckhlbHBlciB7XHJcbiAgcHVibGljIHN0YXRpYyBnZXRUb29sYmFyVGl0bGVUZW1wbGF0ZUl0ZW0odGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZCwgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0ICRlbCA9ICQoYDxzcGFuIGNsYXNzPVwiJHtDTEFTU0VTLnRpdGxlfVwiPiR7dGl0bGV9PC9zcGFuPmApO1xyXG5cclxuICAgICAgICBpZiAoZGVzY3JpcHRpb24pIHtcclxuICAgICAgICAgICRlbC5hcHBlbmQoJCgnPGkgLz4nKS5hZGRDbGFzcygnZmFzJykuYWRkQ2xhc3MoJ2ZhLWluZm8tY2lyY2xlJykuYWRkQ2xhc3MoJ3JlcG9ydC1kZXRhaWxzLWxpbmsnKS5hdHRyKCd0aXRsZScsICdSZXBvcnQgZGV0YWlscycpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAkZWw7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBUSEVNRV9DTEFTU0VTIH0gZnJvbSAnLi4vSGVscGVycy9UaGVtZSc7XHJcbmltcG9ydCB7IFRvb2xiYXJIZWxwZXIgfSBmcm9tICcuLi9IZWxwZXJzL1Rvb2xiYXInO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVG9vbGJhclNldHRpbmcge1xyXG4gIG9wdGlvbnM/OiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhck9wdGlvbnM7XHJcbiAgdGl0bGU/OiBzdHJpbmc7XHJcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmNvbnN0IENMQVNTRVMgPSB7XHJcbiAgdGl0bGU6ICdpc296LXRpdGxlJyxcclxuICBoZWFkZXI6ICdpc296LXRvb2xiYXItaGVhZGVyJyxcclxuICBkcm9wRG93bkJ1dHRvbjogJ2R4LWRyb3Bkb3dubWVudS1idXR0b24nXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcjogc3RyaW5nLCBzZXR0aW5nczogSVRvb2xiYXJTZXR0aW5nID0geyB0aXRsZTogJycsIGRlc2NyaXB0aW9uOiAnJywgb3B0aW9uczoge30gfSk6XHJcbiAgRGV2RXhwcmVzcy51aS5keFRvb2xiYXIge1xyXG4gIGNvbnN0IHtcclxuICAgIHRpdGxlID0gJycsXHJcbiAgICBkZXNjcmlwdGlvbiA9ICcnLFxyXG4gICAgb3B0aW9ucyA9IHt9LFxyXG4gIH0gPSBzZXR0aW5ncztcclxuICBjb25zdCB7XHJcbiAgICBpdGVtcyA9IFtdLFxyXG4gICAgZWxlbWVudEF0dHIgPSB7fVxyXG4gIH0gPSBvcHRpb25zO1xyXG5cclxuICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICBjb25zdCBtaWRsZGVTaXplRWxlbWVudEF0dHIgPSB7IGNsYXNzOiBUSEVNRV9DTEFTU0VTLm1kIH07XHJcblxyXG4gICAgaWYgKGl0ZW0ub3B0aW9ucykge1xyXG4gICAgICBsZXQgeyBlZGl0b3JPcHRpb25zIH0gPSBpdGVtLm9wdGlvbnM7XHJcblxyXG4gICAgICBpZiAoIWVkaXRvck9wdGlvbnMpIHtcclxuICAgICAgICBlZGl0b3JPcHRpb25zID0ge307XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGVkaXRvck9wdGlvbnMuZWxlbWVudEF0dHIgPSBtaWRsZGVTaXplRWxlbWVudEF0dHI7XHJcbiAgICAgIGl0ZW0ub3B0aW9ucy5lbGVtZW50QXR0ciA9IG1pZGxkZVNpemVFbGVtZW50QXR0cjtcclxuICAgICAgaXRlbS5vcHRpb25zLmVkaXRvck90aW9ucyA9IGVkaXRvck9wdGlvbnM7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IG9uQ29udGVudFJlYWR5ID0gKGUpID0+IHtcclxuICAgIGUuZWxlbWVudFxyXG4gICAgICAuZmluZChgLiR7Q0xBU1NFUy5kcm9wRG93bkJ1dHRvbn1gKVxyXG4gICAgICAuYWRkQ2xhc3MoVEhFTUVfQ0xBU1NFUy5tZCk7XHJcblxyXG4gICAgaWYgKG9wdGlvbnM/Lm9uQ29udGVudFJlYWR5KSB7XHJcbiAgICAgIG9wdGlvbnMub25Db250ZW50UmVhZHkoZSk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuICQoYCR7c2VsZWN0b3J9YClcclxuICAgIC5keFRvb2xiYXIoe1xyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIFRvb2xiYXJIZWxwZXIuZ2V0VG9vbGJhclRpdGxlVGVtcGxhdGVJdGVtKHRpdGxlLCBkZXNjcmlwdGlvbiksXHJcbiAgICAgICAgLi4uaXRlbXNcclxuICAgICAgXSxcclxuICAgICAgb25Db250ZW50UmVhZHksXHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7XHJcbiAgICAgICAgLi4uZWxlbWVudEF0dHIsXHJcbiAgICAgICAgY2xhc3M6IENMQVNTRVMuaGVhZGVyXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICAuZHhUb29sYmFyKCdpbnN0YW5jZScpO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgYXV0b1Jlc2l6ZSBmcm9tICcuL0F1dG9SZXNpemUnO1xyXG5cclxuY29uc3QgQ1NTID0ge1xyXG4gIHBhbmVsOiAnLnBhbmVsLWJvZHknXHJcbn07XHJcblxyXG5sZXQgbGFzdFdpbmRvd0hlaWdodCA9IG51bGw7XHJcbmxldCBsYXN0Q29udGVudEhlaWdodCA9IG51bGw7XHJcbmxldCBsYXN0V2lkZ2V0SGVpZ2h0ID0gbnVsbDtcclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZUhlaWdodCh3aWRnZXQpIHtcclxuICBjb25zdCAkd2lkZ2V0ID0gd2lkZ2V0LmVsZW1lbnQoKTtcclxuICBjb25zdCAkcGFuZWwgPSAkd2lkZ2V0LnBhcmVudHMoQ1NTLnBhbmVsKS5lcSgwKTtcclxuXHJcbiAgJHBhbmVsLmhlaWdodChsYXN0Q29udGVudEhlaWdodCk7XHJcbiAgd2lkZ2V0Lm9wdGlvbignaGVpZ2h0JywgbGFzdFdpZGdldEhlaWdodCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNhbGN1bGF0ZUhlaWdodCh3aWRnZXQ6IERldkV4cHJlc3MudWkuV2lkZ2V0PGFueT4pIHtcclxuICBjb25zdCAkd2lkZ2V0ID0gd2lkZ2V0LmVsZW1lbnQoKTtcclxuICBjb25zdCAkcGFuZWwgPSB3aWRnZXQuZWxlbWVudCgpLnBhcmVudHMoQ1NTLnBhbmVsKS5lcSgwKTtcclxuXHJcbiAgY29uc3QgcGFuZWxUb3AgPSAkcGFuZWwucG9zaXRpb24oKS50b3A7XHJcbiAgY29uc3QgcGFuZWxIZWlnaHQgPSAkcGFuZWwuaGVpZ2h0KCk7XHJcbiAgY29uc3QgcGFuZWxQYWRkaW5nID0gJHBhbmVsLm91dGVySGVpZ2h0KCkgLSAkcGFuZWwuaGVpZ2h0KCk7XHJcbiAgY29uc3Qgd2lkZ2V0VG9wID0gJHdpZGdldC5wb3NpdGlvbigpLnRvcDtcclxuXHJcbiAgY29uc3Qgd2lkZ2V0SGVpZ2h0ID0gcGFuZWxIZWlnaHQgLSAod2lkZ2V0VG9wIC0gcGFuZWxUb3ApICsgcGFuZWxQYWRkaW5nIC8gMjtcclxuXHJcbiAgd2lkZ2V0Lm9wdGlvbignaGVpZ2h0Jywgd2lkZ2V0SGVpZ2h0KTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVjYWxjdWxhdGVIZWlnaHQod2lkZ2V0OiBEZXZFeHByZXNzLnVpLldpZGdldDxhbnk+KSB7XHJcbiAgY29uc3Qgd2luZG93SGVpZ2h0ID0gJCh3aW5kb3cpLmhlaWdodCgpO1xyXG4gIGNvbnN0IGRpZmYgPSB3aW5kb3dIZWlnaHQgLSBsYXN0V2luZG93SGVpZ2h0O1xyXG5cclxuICBsYXN0Q29udGVudEhlaWdodCArPSBkaWZmO1xyXG4gIGxhc3RXaWRnZXRIZWlnaHQgKz0gZGlmZjtcclxuICBsYXN0V2luZG93SGVpZ2h0ID0gd2luZG93SGVpZ2h0O1xyXG5cclxuICB1cGRhdGVIZWlnaHQod2lkZ2V0KTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24od2lkZ2V0OiBEZXZFeHByZXNzLnVpLldpZGdldDxhbnk+KSB7XHJcbiAgY2FsY3VsYXRlSGVpZ2h0KHdpZGdldCk7XHJcblxyXG4gIGF1dG9SZXNpemUoKCkgPT4gY2FsY3VsYXRlSGVpZ2h0KHdpZGdldCkpO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgZnVsbFNjcmVlbiBmcm9tICcuLi9GdWxsU2NyZWVuJztcclxuaW1wb3J0IHBhbmVsSGVpZ2h0IGZyb20gJy4uL1BhbmVsSGVpZ2h0JztcclxuaW1wb3J0IHsgQ1NTX0NMQVNTRVMgfSBmcm9tICcuLi8uLi9TdHlsaW5nL0luZGV4JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRBZGRpdGlvbmFsT3B0aW9ucyB7XHJcbiAgZXhwb3J0RmlsZU5hbWU/OiBzdHJpbmc7XHJcbiAgc3VtbWFyeUNvbHVtbj86IHN0cmluZztcclxuICBzaG93U3VtbWFyeUluQ29sdW1uPzogc3RyaW5nO1xyXG4gIGluUGFuZWxHcmlkPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZ1bGxTY3JlZW5EYXRhR3JpZChpZDogSlF1ZXJ5LCBvcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zLCBpc0luUGFuZWxHcmlkID0gZmFsc2UpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gIGNvbnN0IGdyaWQgPSBjcmVhdGVEYXRhR3JpZChpZCwgb3B0aW9ucyk7XHJcblxyXG4gIGlmICghb3B0aW9ucy5oZWlnaHQpIHtcclxuICAgIGlmIChpc0luUGFuZWxHcmlkKSB7XHJcbiAgICAgIHBhbmVsSGVpZ2h0KGdyaWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZnVsbFNjcmVlbihncmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBncmlkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGF0YUdyaWQoZWw6IEpRdWVyeSwgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgY29uc3QgZ3JpZCA9IGVsLmR4RGF0YUdyaWQob3B0aW9ucykuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgZ3JpZC5lbGVtZW50KCkuYWRkQ2xhc3MoQ1NTX0NMQVNTRVMuZHhEYXRhR3JpZCk7XHJcblxyXG4gIHJldHVybiBncmlkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnVsbFNjcmVlblRyZWVMaXN0KFxyXG4gIGVsOiBzdHJpbmcgfCBKUXVlcnksIG9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdC5Qcm9wZXJ0aWVzLCBpc0luUGFuZWwgPSBmYWxzZVxyXG4pOiBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3Qge1xyXG4gIGNvbnN0IHRyZWVMaXN0ID0gKHR5cGVvZiBlbCA9PT0gJ3N0cmluZycgPyAkKGVsKSA6IGVsKS5keFRyZWVMaXN0KG9wdGlvbnMpLmR4VHJlZUxpc3QoJ2luc3RhbmNlJyk7XHJcblxyXG4gIHRyZWVMaXN0LmVsZW1lbnQoKS5hZGRDbGFzcyhDU1NfQ0xBU1NFUy5keERhdGFHcmlkKTtcclxuXHJcbiAgaWYgKCFvcHRpb25zLmhlaWdodCkge1xyXG4gICAgaWYgKGlzSW5QYW5lbCkge1xyXG4gICAgICBwYW5lbEhlaWdodCh0cmVlTGlzdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmdWxsU2NyZWVuKHRyZWVMaXN0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiB0cmVlTGlzdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSh0ZXh0LCB0aXRsZSkge1xyXG4gIHJldHVybiAkKCc8c3Bhbj4nKVxyXG4gICAgLmF0dHIoJ3RpdGxlJywgdGl0bGUpXHJcbiAgICAudGV4dCh0ZXh0KTtcclxufVxyXG4iLCAiaW1wb3J0IHNhdmVBcyBmcm9tICdmaWxlLXNhdmVyJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENyZWF0ZUdyaWRFeHBvcnRGdW5jdGlvbihyZXBvcnROYW1lOiBzdHJpbmcpOiAoZTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLkV4cG9ydGluZ0V2ZW50KSA9PiB2b2lkIHtcclxuICByZXR1cm4gKGU6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5FeHBvcnRpbmdFdmVudCkgPT4ge1xyXG4gICAgY29uc3Qgd29ya2Jvb2sgPSBuZXcgKHdpbmRvdyBhcyBhbnkpLkV4Y2VsSlMuV29ya2Jvb2soKTtcclxuICAgIGNvbnN0IHdvcmtzaGVldCA9IHdvcmtib29rLmFkZFdvcmtzaGVldChyZXBvcnROYW1lKTtcclxuXHJcbiAgICBEZXZFeHByZXNzLmV4Y2VsRXhwb3J0ZXIuZXhwb3J0RGF0YUdyaWQoe1xyXG4gICAgICB3b3Jrc2hlZXQsXHJcbiAgICAgIGNvbXBvbmVudDogZS5jb21wb25lbnQsXHJcbiAgICAgIGN1c3RvbWl6ZUNlbGw6IChvcHRpb25zKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZXhjZWxDZWxsID0gb3B0aW9ucy5leGNlbENlbGw7XHJcblxyXG4gICAgICAgIGV4Y2VsQ2VsbC5mb250ID0geyBuYW1lOiAnQXJpYWwnLCBzaXplOiAxMiB9O1xyXG4gICAgICAgIGV4Y2VsQ2VsbC5hbGlnbm1lbnQgPSB7IGhvcml6b250YWw6ICdsZWZ0JyB9O1xyXG4gICAgICB9XHJcbiAgICB9KS50aGVuKGZ1bmN0aW9uKCkge1xyXG4gICAgICB3b3JrYm9vay54bHN4LndyaXRlQnVmZmVyKCkudGhlbihmdW5jdGlvbihidWZmZXIpIHtcclxuICAgICAgICBzYXZlQXMobmV3IEJsb2IoW2J1ZmZlcl0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgfSksIGAke3JlcG9ydE5hbWV9Lnhsc3hgKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIGUuY2FuY2VsID0gdHJ1ZTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IFRvb2xiYXJIZWxwZXIgfSBmcm9tICcuLi8uLi9IZWxwZXJzL1Rvb2xiYXInO1xyXG5pbXBvcnQgeyBUaGVtZUhlbHBlciwgVEhFTUVfQ0xBU1NFUyB9IGZyb20gJy4uLy4uL0hlbHBlcnMvVGhlbWUnO1xyXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuLi8uLi9Db25maWcvSW5kZXgnO1xyXG5pbXBvcnQgY3JlYXRlR3JpZEV4cG9ydEZuIGZyb20gJy4uLy4uL1V0aWxzL0dyaWRFeHBvcnQnO1xyXG5cclxuaW50ZXJmYWNlIElHcmlkU2V0dGluZ3NCYXNlPFQ+IHtcclxuICBvcHRpb25zPzogVDtcclxuXHJcbiAgZXhwb3J0RmlsZU5hbWU/OiBzdHJpbmc7XHJcbiAgaGVhZGVyRGVzY3JpcHRpb24/OiBzdHJpbmc7XHJcbiAgaW5QYW5lbEdyaWQ/OiBib29sZWFuO1xyXG4gIGlzRnVsbFNjcmVlbj86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbiAgc2V0RGVmYXVsdENvbHVtbldpZHRoPzogYm9vbGVhbjtcclxuICBzaG93U3VtbWFyeUluQ29sdW1uPzogc3RyaW5nO1xyXG4gIHN1bW1hcnlDb2x1bW4/OiBzdHJpbmc7XHJcbiAgZGlzYWJsZVN1bW1hcnlDb2x1bW5EZXRlY3Rpb24/OiBib29sZWFuO1xyXG4gIHRpdGxlPzogc3RyaW5nO1xyXG4gIHRvb2xiYXJBY2NlbnRCdXR0b25OYW1lPzogc3RyaW5nO1xyXG4gIHRvb2xiYXJJdGVtcz86IGFueVtdO1xyXG4gIGJ1dHRvbnNTaXplPzogJ3NtJyB8ICdtZCc7XHJcbn1cclxuXHJcbmNvbnN0IGdldFdpZGdldE5hbWUgPSAod2lkZ2V0OiBzdHJpbmcpID0+IHtcclxuICByZXR1cm4gd2lkZ2V0XHJcbiAgICAuc2xpY2UoJ2R4Jy5sZW5ndGgpXHJcbiAgICAudG9Mb3dlckNhc2UoKTtcclxufTtcclxuXHJcbmNvbnN0IGdldFNlbGVjdG9ycyA9ICh3aWRnZXQ6IHN0cmluZykgPT4ge1xyXG4gIGNvbnN0IGdyaWROYW1lID0gZ2V0V2lkZ2V0TmFtZSh3aWRnZXQpO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2VhcmNoUGFuZWw6IGAuZHgtJHtncmlkTmFtZX0tc2VhcmNoLXBhbmVsYCxcclxuICAgIHRvb2xiYXJFZGl0QnV0dG9uOiBgLmR4LSR7Z3JpZE5hbWV9LXRvb2xiYXItYnV0dG9uLmR4LWVkaXQtYnV0dG9uYCxcclxuICAgIHRvb2xiYXJFeHBvcnRCdXR0b246IGAuZHgtJHtncmlkTmFtZX0tZXhwb3J0LWJ1dHRvbiAuZHgtYnV0dG9uYCxcclxuICAgIHNlbGVjdENoZWNrQm94OiAnLmR4LXNlbGVjdC1jaGVja2JveCdcclxuICB9O1xyXG59O1xyXG5leHBvcnQgaW50ZXJmYWNlIElEYXRhR3JpZFNldHRpbmdzIGV4dGVuZHMgSUdyaWRTZXR0aW5nc0Jhc2U8RGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucz4ge1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElUcmVlTGlzdFNldHRpbmdzIGV4dGVuZHMgSUdyaWRTZXR0aW5nc0Jhc2U8RGV2RXhwcmVzcy51aS5keFRyZWVMaXN0T3B0aW9ucz4ge1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0R3JpZERlZmF1bHRPcHRpb25zKHNldHRpbmdzOiBJRGF0YUdyaWRTZXR0aW5ncykge1xyXG4gIGNvbnN0IHJlc3VsdDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXMgPSBjb25maWcuaXNMZWdhY3lSZW5kZXIgPyBnZXRMZWdhY3lEZWZhdWx0T3B0aW9ucyhzZXR0aW5ncykgOiBnZXREZWZhdWx0T3B0aW9ucyhzZXR0aW5ncyk7XHJcblxyXG4gIGlmIChzZXR0aW5ncy5zdW1tYXJ5Q29sdW1uIHx8IHNldHRpbmdzLnNob3dTdW1tYXJ5SW5Db2x1bW4pIHtcclxuICAgIChyZXN1bHQgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXMpLnN1bW1hcnkgPSB7XHJcbiAgICAgIHRvdGFsSXRlbXM6IFt7XHJcbiAgICAgICAgY29sdW1uOiBzZXR0aW5ncy5zdW1tYXJ5Q29sdW1uIHx8IHNldHRpbmdzLnNob3dTdW1tYXJ5SW5Db2x1bW4sXHJcbiAgICAgICAgc2hvd0luQ29sdW1uOiBzZXR0aW5ncy5zaG93U3VtbWFyeUluQ29sdW1uIHx8IHNldHRpbmdzLnN1bW1hcnlDb2x1bW4sXHJcbiAgICAgICAgc3VtbWFyeVR5cGU6ICdjb3VudCdcclxuICAgICAgfV1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICByZXN1bHQuZXhwb3J0ID0ge1xyXG4gICAgZW5hYmxlZDogISFzZXR0aW5ncy5leHBvcnRGaWxlTmFtZSxcclxuICAgIGFsbG93RXhwb3J0U2VsZWN0ZWREYXRhOiB0cnVlLFxyXG4gIH07XHJcblxyXG4gIGlmICghY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICByZXN1bHQuZ3JvdXBQYW5lbCA9IHsgdmlzaWJsZTogdHJ1ZSB9O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFRyZWVMaXN0RGVmYXVsdE9wdGlvbnMoc2V0dGluZ3M6IElUcmVlTGlzdFNldHRpbmdzKSB7XHJcbiAgY29uc3QgcmVzdWx0OiBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoc2V0dGluZ3MpO1xyXG5cclxuICByZXN1bHQuc2VsZWN0aW9uID0geyBtb2RlOiAnbm9uZScgfTtcclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0RGVmYXVsdE9wdGlvbnNcclxuICA8VCBleHRlbmRzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgfCBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zPihzZXR0aW5nczogSURhdGFHcmlkU2V0dGluZ3MgfCBJVHJlZUxpc3RTZXR0aW5ncyk6IFQge1xyXG4gIHJldHVybiB7XHJcbiAgICBhbGxvd0NvbHVtblJlc2l6aW5nOiB0cnVlLFxyXG4gICAgY2FjaGVFbmFibGVkOiB0cnVlLFxyXG4gICAgY29sdW1uQXV0b1dpZHRoOiB0cnVlLFxyXG4gICAgZmlsdGVyUm93OiB7IHZpc2libGU6IHRydWUsIGFwcGx5RmlsdGVyOiAnb25DbGljaycgfSxcclxuICAgIGhlYWRlckZpbHRlcjogeyB2aXNpYmxlOiB0cnVlIH0sXHJcbiAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcclxuICAgIHBhZ2luZzogeyBwYWdlU2l6ZTogODAgfSxcclxuICAgIHBhZ2VyOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICByZW1vdGVPcGVyYXRpb25zOiB0cnVlLFxyXG4gICAgc2Nyb2xsaW5nOiB7XHJcbiAgICAgIG1vZGU6ICd2aXJ0dWFsJyxcclxuICAgICAgcm93UmVuZGVyaW5nTW9kZTogJ3ZpcnR1YWwnXHJcbiAgICB9LFxyXG4gICAgc2VhcmNoUGFuZWw6IHtcclxuICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgd2lkdGg6IDI0MCxcclxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWFyY2guLi4nXHJcbiAgICB9LFxyXG4gICAgc2hvd1Jvd0xpbmVzOiB0cnVlLFxyXG4gICAgc2hvd0JvcmRlcnM6IHRydWUsXHJcbiAgICBzZWxlY3Rpb246IHsgbW9kZTogJ211bHRpcGxlJyB9LFxyXG4gICAgd29yZFdyYXBFbmFibGVkOiB0cnVlXHJcbiAgfSBhcyBUO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRMZWdhY3lEZWZhdWx0T3B0aW9uc1xyXG4gIDxUIGV4dGVuZHMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyB8IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdE9wdGlvbnM+KHNldHRpbmdzOiBJRGF0YUdyaWRTZXR0aW5ncyB8IElUcmVlTGlzdFNldHRpbmdzKTogVCB7XHJcbiAgcmV0dXJuIHtcclxuICAgIGFsbG93Q29sdW1uUmVzaXppbmc6IHRydWUsXHJcbiAgICByZW1vdGVPcGVyYXRpb25zOiB0cnVlLFxyXG4gICAgY29sdW1uQXV0b1dpZHRoOiB0cnVlLFxyXG4gICAgc2hvd0JvcmRlcnM6IHRydWUsXHJcbiAgICBmaWx0ZXJSb3c6IHsgdmlzaWJsZTogdHJ1ZSwgYXBwbHlGaWx0ZXI6ICdvbkNsaWNrJyB9LFxyXG5cclxuICAgIHNlbGVjdGlvbjogeyBtb2RlOiAnbXVsdGlwbGUnIH0sXHJcbiAgICBwYWdpbmc6IHsgcGFnZVNpemU6IDUwIH0sXHJcbiAgICBzZWFyY2hQYW5lbDogeyB2aXNpYmxlOiB0cnVlIH0sXHJcbiAgICBoZWFkZXJGaWx0ZXI6IHsgdmlzaWJsZTogdHJ1ZSB9LFxyXG4gICAgc2Nyb2xsaW5nOiB7IG1vZGU6ICd2aXJ0dWFsJyB9LFxyXG4gIH0gYXMgVDtcclxufVxyXG5cclxuZnVuY3Rpb24gcHJlcGFyZURlZmF1bHRUb29sYmFyQnV0dG9ucyh0b29sYmFyT3B0aW9uczogYW55LCB0b29sYmFyQWNjZW50QnV0dG9uTmFtZT86IHN0cmluZykge1xyXG4gIGNvbnN0IGZpbmRUb29sYmFySXRlbSA9IChpdGVtczogYW55W10sIG5hbWU6IHN0cmluZykgPT4gaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBuYW1lKTtcclxuXHJcbiAgaWYgKHRvb2xiYXJPcHRpb25zPy5pdGVtcykge1xyXG4gICAgY29uc3QgeyBpdGVtcyB9ID0gdG9vbGJhck9wdGlvbnM7XHJcblxyXG4gICAgaWYgKHRvb2xiYXJBY2NlbnRCdXR0b25OYW1lKSB7XHJcbiAgICAgIGNvbnN0IGFjY2VudEJ1dHRvbkl0ZW0gPSBmaW5kVG9vbGJhckl0ZW0oaXRlbXMsIHRvb2xiYXJBY2NlbnRCdXR0b25OYW1lKTtcclxuICAgICAgaWYgKGFjY2VudEJ1dHRvbkl0ZW0pIHtcclxuICAgICAgICBhY2NlbnRCdXR0b25JdGVtLm9wdGlvbnMudHlwZSA9ICdkZWZhdWx0JztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNhdmVCdXR0b25JdGVtID0gZmluZFRvb2xiYXJJdGVtKGl0ZW1zLCAnc2F2ZUJ1dHRvbicpO1xyXG4gICAgaWYgKHNhdmVCdXR0b25JdGVtKSB7XHJcbiAgICAgIHNhdmVCdXR0b25JdGVtLnNob3dUZXh0ID0gJ2Fsd2F5cyc7XHJcbiAgICAgIHNhdmVCdXR0b25JdGVtLm9wdGlvbnMudGV4dCA9ICdTYXZlJztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXZlcnRCdXR0b25JdGVtID0gZmluZFRvb2xiYXJJdGVtKGl0ZW1zLCAncmV2ZXJ0QnV0dG9uJyk7XHJcbiAgICBpZiAocmV2ZXJ0QnV0dG9uSXRlbSkge1xyXG4gICAgICByZXZlcnRCdXR0b25JdGVtLnNob3dUZXh0ID0gJ2Fsd2F5cyc7XHJcbiAgICAgIHJldmVydEJ1dHRvbkl0ZW0ub3B0aW9ucy50ZXh0ID0gJ0Rpc2NhcmQnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlZnJlc2hCdXR0b25JdGVtID0gZmluZFRvb2xiYXJJdGVtKGl0ZW1zLCAncmVmcmVzaCcpO1xyXG4gICAgaWYgKHJlZnJlc2hCdXR0b25JdGVtKSB7XHJcbiAgICAgIHJlZnJlc2hCdXR0b25JdGVtLnNob3dUZXh0ID0gJ2Fsd2F5cyc7XHJcbiAgICAgIHJlZnJlc2hCdXR0b25JdGVtLm9wdGlvbnMudGV4dCA9ICdSZWZyZXNoJztcclxuICAgICAgcmVmcmVzaEJ1dHRvbkl0ZW0ub3B0aW9ucy5oaW50ID0gJ1JlbG9hZCBEYXRhJztcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZVN1bW1hcnlDb2x1bW5JZlJlcXVpcmVkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gIGNvbnN0IHRvdGFsSXRlbXMgPSBncmlkLm9wdGlvbignc3VtbWFyeS50b3RhbEl0ZW1zJykgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snc3VtbWFyeSddWyd0b3RhbEl0ZW1zJ107XHJcbiAgY29uc3QgY3VycmVudFN1bW1hcnlDb2x1bW4gPSB0b3RhbEl0ZW1zPy5maWx0ZXIoKGkpID0+IGkuc3VtbWFyeVR5cGUgPT09ICdjb3VudCcpWzBdPy5jb2x1bW47XHJcblxyXG4gIGxldCBzdW1tYXJ5Q29sdW1uSW5kZXggPSBjdXJyZW50U3VtbWFyeUNvbHVtbiAmJiBncmlkLmdldFZpc2libGVDb2x1bW5zKCkuZmluZEluZGV4KChlbCkgPT4gZWwuZGF0YUZpZWxkID09PSBjdXJyZW50U3VtbWFyeUNvbHVtbik7XHJcbiAgaWYgKCFzdW1tYXJ5Q29sdW1uSW5kZXgpIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdyaWQub3B0aW9uKCdzZWxlY3Rpb24nKTtcclxuICAgIGNvbnN0IGhhc1NlbGVjdGlvbiA9IHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ubW9kZSAhPT0gJ25vbmUnO1xyXG4gICAgc3VtbWFyeUNvbHVtbkluZGV4ID0gaGFzU2VsZWN0aW9uID8gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpLmZpbmRJbmRleCgoZWwpID0+ICEhZWwuZGF0YUZpZWxkKSA6IDA7XHJcbiAgfVxyXG5cclxuICBjb25zdCBuZXdTdW1tYXJ5Q29sdW1uID0gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpW3N1bW1hcnlDb2x1bW5JbmRleF0/LmRhdGFGaWVsZDtcclxuXHJcbiAgaWYgKG5ld1N1bW1hcnlDb2x1bW4gJiYgY3VycmVudFN1bW1hcnlDb2x1bW4gIT09IG5ld1N1bW1hcnlDb2x1bW4pIHtcclxuICAgIGdyaWQub3B0aW9uKCdzdW1tYXJ5Jywge1xyXG4gICAgICB0b3RhbEl0ZW1zOiBbe1xyXG4gICAgICAgIGNvbHVtbjogZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpW3N1bW1hcnlDb2x1bW5JbmRleF0/LmRhdGFGaWVsZCxcclxuICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xyXG4gICAgICB9XVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGFuZGxlcnM8VCBleHRlbmRzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgfCBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zPihcclxuICB3aWRnZXQ6ICdkeERhdGFHcmlkJyB8ICdkeFRyZWVMaXN0JyxcclxuICBzZXR0aW5nczogSURhdGFHcmlkU2V0dGluZ3MgfCBJVHJlZUxpc3RTZXR0aW5nc1xyXG4pOiBUIHtcclxuICBjb25zdCBzZWxlY3RvcnMgPSBnZXRTZWxlY3RvcnMod2lkZ2V0KTtcclxuICBsZXQgaXNHcmlkSW5pdGlhbGl6YWVkID0gZmFsc2U7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBvbkNlbGxQcmVwYXJlZDogKGUpID0+IHtcclxuICAgICAgaWYgKCFjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcclxuICAgICAgICBpZiAoZS5yb3dUeXBlID09PSAnaGVhZGVyJykge1xyXG4gICAgICAgICAgZS5jZWxsRWxlbWVudC5jc3MoJ3RleHQtYWxpZ24nLCAnY2VudGVyJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc2V0dGluZ3Mub3B0aW9ucz8ub25DZWxsUHJlcGFyZWQpIHtcclxuICAgICAgICBzZXR0aW5ncy5vcHRpb25zPy5vbkNlbGxQcmVwYXJlZChlKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uQ29udGVudFJlYWR5OiAoZSkgPT4ge1xyXG4gICAgICBjb25zdCBkYXRhR3JpZCA9IGUuY29tcG9uZW50O1xyXG5cclxuICAgICAgaWYgKCFzZXR0aW5ncy5kaXNhYmxlU3VtbWFyeUNvbHVtbkRldGVjdGlvbikge1xyXG4gICAgICAgIHVwZGF0ZVN1bW1hcnlDb2x1bW5JZlJlcXVpcmVkKGRhdGFHcmlkKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFpc0dyaWRJbml0aWFsaXphZWQpIHtcclxuICAgICAgICBpc0dyaWRJbml0aWFsaXphZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAvL3RvIGZpeCBhdXRvc2Nyb2xsXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBzY3JvbGxhYmxlID0gZGF0YUdyaWQuZ2V0U2Nyb2xsYWJsZSgpO1xyXG5cclxuICAgICAgICAgIGlmIChzY3JvbGxhYmxlKSB7XHJcbiAgICAgICAgICAgIHNjcm9sbGFibGUuc2Nyb2xsVG8oeyB0b3A6IDAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YUdyaWQuY29sdW1uQ291bnQoKTsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgZGF0YVR5cGUgPSBkYXRhR3JpZC5jb2x1bW5PcHRpb24oaSwgJ2RhdGFUeXBlJyk7XHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5ncy5zZXREZWZhdWx0Q29sdW1uV2lkdGggfHwgc2V0dGluZ3Muc2V0RGVmYXVsdENvbHVtbldpZHRoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGlmICghZGF0YUdyaWQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcpKSB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgICAgICAgZGF0YUdyaWQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcsICc0NXB4Jyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2RhdGV0aW1lJykge1xyXG4gICAgICAgICAgICAgIGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnd2lkdGgnLCAnMTM1cHgnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnZGF0ZScpIHtcclxuICAgICAgICAgICAgICBkYXRhR3JpZC5jb2x1bW5PcHRpb24oaSwgJ3dpZHRoJywgJzE0MHB4Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdkYXRldGltZScgfHwgZGF0YVR5cGUgPT09ICdkYXRlJykge1xyXG4gICAgICAgICAgICBkYXRhR3JpZC5jb2x1bW5PcHRpb24oaSwgJ2FsaWdubWVudCcsICdyaWdodCcpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2RhdGUnKSB7XHJcbiAgICAgICAgICAgIGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnZm9ybWF0JywgJ2RkIE1NTSB5eXl5Jyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnZGF0ZXRpbWUnKSB7XHJcbiAgICAgICAgICAgIGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnZm9ybWF0JywgJ0hIOm1tLCBkZCBNTU0geXl5eScpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScpIHtcclxuICAgICAgICAgIFRoZW1lSGVscGVyLnNldFdpZGdldFNtYWxsU2l6ZSgkKHNlbGVjdG9ycy5zZWFyY2hQYW5lbCkuZHhUZXh0Qm94KCdpbnN0YW5jZScpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgVGhlbWVIZWxwZXIuc2V0V2lkZ2V0TWlkZGxlU2l6ZSgkKHNlbGVjdG9ycy5zZWFyY2hQYW5lbCkuZHhUZXh0Qm94KCdpbnN0YW5jZScpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIFRoZW1lSGVscGVyLnNldEVsZW1lbnRTbWFsbFNpemUoZS5jb21wb25lbnQuZWxlbWVudCgpLmZpbmQoc2VsZWN0b3JzLnNlbGVjdENoZWNrQm94KSk7XHJcblxyXG4gICAgICAgIGlmICgkKHNlbGVjdG9ycy50b29sYmFyRXhwb3J0QnV0dG9uKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBpZiAoc2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScpIHtcclxuICAgICAgICAgICAgVGhlbWVIZWxwZXIuc2V0V2lkZ2V0U21hbGxTaXplKCQoc2VsZWN0b3JzLnRvb2xiYXJFeHBvcnRCdXR0b24pLmR4QnV0dG9uKCdpbnN0YW5jZScpKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIFRoZW1lSGVscGVyLnNldFdpZGdldE1pZGRsZVNpemUoJChzZWxlY3RvcnMudG9vbGJhckV4cG9ydEJ1dHRvbikuZHhCdXR0b24oJ2luc3RhbmNlJykpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHNldHRpbmdzLm9wdGlvbnM/Lm9uQ29udGVudFJlYWR5KSB7XHJcbiAgICAgICAgc2V0dGluZ3Mub3B0aW9ucy5vbkNvbnRlbnRSZWFkeShlKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uVG9vbGJhclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgY29uc3Qge1xyXG4gICAgICAgIHRvb2xiYXJPcHRpb25zID0ge31cclxuICAgICAgfSA9IGU7XHJcblxyXG4gICAgICBjb25zdCBkYXRhR3JpZCA9IGUuY29tcG9uZW50O1xyXG5cclxuICAgICAgY29uc3Qge1xyXG4gICAgICAgIGl0ZW1zID0gW11cclxuICAgICAgfSA9IHRvb2xiYXJPcHRpb25zO1xyXG5cclxuICAgICAgaWYgKGNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICAgIGlmIChzZXR0aW5ncy50aXRsZSkge1xyXG4gICAgICAgICAgZS50b29sYmFyT3B0aW9ucy5pdGVtcy51bnNoaWZ0KHtcclxuICAgICAgICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZSgpIHtcclxuICAgICAgICAgICAgICBjb25zdCBoZWFkZXJFbCA9ICQoJzxoMiAvPicpLmFkZENsYXNzKCdncmlkLWhlYWRlcicpLnRleHQoc2V0dGluZ3MudGl0bGUpO1xyXG4gICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5oZWFkZXJEZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgaGVhZGVyRWwuYXBwZW5kKCQoJzxpIC8+JykuYWRkQ2xhc3MoJ2ZhcycpLmFkZENsYXNzKCdmYS1pbmZvLWNpcmNsZScpLmFkZENsYXNzKCdyZXBvcnQtZGV0YWlscy1saW5rJykuYXR0cigndGl0bGUnLCAnQ2xpY2sgdG8gc2VlIGZ1cnRoZXIgZGV0YWlscycpKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiBoZWFkZXJFbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXRlbS53aWRnZXQgPT09ICdkeEJ1dHRvbicgJiYgaXRlbS5uYW1lID09PSAnYXBwbHlGaWx0ZXJCdXR0b24nKSB7XHJcbiAgICAgICAgICAgIGl0ZW0ub3B0aW9ucy52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzLnRpdGxlKSB7XHJcbiAgICAgICAgICBpdGVtcy51bnNoaWZ0KFRvb2xiYXJIZWxwZXIuZ2V0VG9vbGJhclRpdGxlVGVtcGxhdGVJdGVtKHNldHRpbmdzLnRpdGxlLCBzZXR0aW5ncy5oZWFkZXJEZXNjcmlwdGlvbikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaXRlbXMuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChpdGVtLndpZGdldCA9PT0gJ2R4QnV0dG9uJykge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS5uYW1lID09PSAnYXBwbHlGaWx0ZXJCdXR0b24nKSB7XHJcbiAgICAgICAgICAgICAgaXRlbS5vcHRpb25zLnZpc2libGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpY29uU2l6ZSA9IHNldHRpbmdzLmJ1dHRvbnNTaXplID09PSAnc20nID8gMTYgOiAyNDtcclxuXHJcbiAgICAgICAgICAgIHN3aXRjaCAoaXRlbS5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgY2FzZSAnYWRkUm93QnV0dG9uJzpcclxuICAgICAgICAgICAgICAgIGl0ZW0ub3B0aW9ucy5pY29uID0gVGhlbWVIZWxwZXIuZ2V0SWNvbkNsYXNzKCdwbHVzJywgZmFsc2UsIGljb25TaXplKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICBjYXNlICdzYXZlQnV0dG9uJzpcclxuICAgICAgICAgICAgICAgIGl0ZW0ub3B0aW9ucy5pY29uID0gVGhlbWVIZWxwZXIuZ2V0SWNvbkNsYXNzKCdzYXZlJywgZmFsc2UsIGljb25TaXplKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICBjYXNlICdyZXZlcnRCdXR0b24nOlxyXG4gICAgICAgICAgICAgICAgaXRlbS5vcHRpb25zLmljb24gPSBUaGVtZUhlbHBlci5nZXRJY29uQ2xhc3MoJ2Nsb3NlJywgZmFsc2UsIGljb25TaXplKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgaXRlbS5vcHRpb25zLmljb24gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFpdGVtLm9wdGlvbnMuZWxlbWVudEF0dHIpIHtcclxuICAgICAgICAgICAgICBpdGVtLm9wdGlvbnMuZWxlbWVudEF0dHIgPSB7fTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaXRlbS5vcHRpb25zLmVsZW1lbnRBdHRyLmNsYXNzID0gc2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScgPyBUSEVNRV9DTEFTU0VTLnNtIDogVEhFTUVfQ0xBU1NFUy5tZDtcclxuICAgICAgICAgICAgaXRlbS5zaG93VGV4dCA9ICdhbHdheXMnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBwcmVwYXJlRGVmYXVsdFRvb2xiYXJCdXR0b25zKHRvb2xiYXJPcHRpb25zLCBzZXR0aW5ncy50b29sYmFyQWNjZW50QnV0dG9uTmFtZSk7XHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5ncy50b29sYmFySXRlbXMpIHtcclxuICAgICAgICAgIGl0ZW1zLnB1c2goLi4uc2V0dGluZ3MudG9vbGJhckl0ZW1zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRvb2xiYXJPcHRpb25zLmVsZW1lbnRBdHRyID0ge1xyXG4gICAgICAgICAgY2xhc3M6ICdpc296LXRvb2xiYXItaGVhZGVyJ1xyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHNhdmVCdXR0b25JbmRleCA9IGUudG9vbGJhck9wdGlvbnMuaXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdzYXZlQnV0dG9uJyk7XHJcbiAgICAgIGNvbnN0IHNlYXJjaFBhbmVsSW5kZXggPSBlLnRvb2xiYXJPcHRpb25zLml0ZW1zLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSAnc2VhcmNoUGFuZWwnKTtcclxuICAgICAgbGV0IGluZGV4Rm9yVXBkYXRlID0gLTE7XHJcblxyXG4gICAgICBpZiAoc2F2ZUJ1dHRvbkluZGV4ID4gLTEpIHtcclxuICAgICAgICBpbmRleEZvclVwZGF0ZSA9IHNhdmVCdXR0b25JbmRleDtcclxuICAgICAgfSBlbHNlIGlmIChzZWFyY2hQYW5lbEluZGV4ID4gLTEpIHtcclxuICAgICAgICBpbmRleEZvclVwZGF0ZSA9IHNlYXJjaFBhbmVsSW5kZXg7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaW5kZXhGb3JVcGRhdGUgPSBlLnRvb2xiYXJPcHRpb25zLml0ZW1zLmxlbmd0aDtcclxuICAgICAgfVxyXG5cclxuICAgICAgZS50b29sYmFyT3B0aW9ucy5pdGVtcy5zcGxpY2UoaW5kZXhGb3JVcGRhdGUsIDAsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgICAgICBuYW1lOiAncmVmcmVzaCcsXHJcbiAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIGljb246ICdyZWZyZXNoJyxcclxuICAgICAgICAgICAgaGVpZ2h0OiBjb25maWcuaXNMZWdhY3lSZW5kZXIgPyAzMCA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgZWxlbWVudEF0dHI6IHsgY2xhc3M6IGBkeC1kYXRhZ3JpZC10b29sYmFyLWJ1dHRvbiAke3NldHRpbmdzLmJ1dHRvbnNTaXplID09PSAnc20nID8gVEhFTUVfQ0xBU1NFUy5zbSA6IFRIRU1FX0NMQVNTRVMubWR9YCB9LFxyXG4gICAgICAgICAgICBzdHlsaW5nTW9kZTogY29uZmlnLmlzTGVnYWN5UmVuZGVyID8gJ3RleHQnIDogJ2NvbnRhaW5lZCcsXHJcbiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IGRhdGFHcmlkPy5yZWZyZXNoKCksXHJcbiAgICAgICAgICAgIG9uQ29udGVudFJlYWR5OiBjb25maWcuaXNMZWdhY3lSZW5kZXIgPyAoY29udGVudFJlYWR5RXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICBjb250ZW50UmVhZHlFdmVudC5lbGVtZW50LmZpbmQoJy5keC1idXR0b24tY29udGVudCcpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICBwYWRkaW5nVG9wOiA2LFxyXG4gICAgICAgICAgICAgICAgcGFkZGluZ0JvdHRvbTogNlxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IDogdW5kZWZpbmVkXHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b24uUHJvcGVydGllc1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmIChzZXR0aW5ncy5vcHRpb25zPy5vblRvb2xiYXJQcmVwYXJpbmcpIHtcclxuICAgICAgICBzZXR0aW5ncy5vcHRpb25zLm9uVG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uRWRpdG9yUHJlcGFyaW5nOiAoZSkgPT4ge1xyXG4gICAgICBpZiAoIWNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICAgIGUuZWRpdG9yT3B0aW9ucyA9IHtcclxuICAgICAgICAgIC4uLmUuZWRpdG9yT3B0aW9ucyxcclxuICAgICAgICAgIGVsZW1lbnRBdHRyOiB7XHJcbiAgICAgICAgICAgIGNsYXNzOiBUSEVNRV9DTEFTU0VTLm1kXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKGUuZWRpdG9yTmFtZSA9PT0gJ2R4U2VsZWN0Qm94Jykge1xyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLmRyb3BEb3duT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgLi4uZS5lZGl0b3JPcHRpb25zLmRyb3BEb3duT3B0aW9ucyxcclxuICAgICAgICAgICAgb25TaG93aW5nOiAoYXJnczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgd2lkZ2V0TmFtZSA9IGdldFdpZGdldE5hbWUod2lkZ2V0KTtcclxuICAgICAgICAgICAgICBhcmdzLmNvbXBvbmVudC5fJHBvcHVwQ29udGVudC5hZGRDbGFzcyhgaXNvei0ke3dpZGdldE5hbWV9LXNlbGVjdGJveC1wb3B1cGApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGUuZWRpdG9yTmFtZSA9PT0gJ2R4Q2hlY2tCb3gnKSB7XHJcbiAgICAgICAgICBUaGVtZUhlbHBlci5zZXRFbGVtZW50U21hbGxTaXplKGUuZWRpdG9yRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBzd2l0Y2ggKGUucGFyZW50VHlwZSkge1xyXG4gICAgICAgIGNhc2UgJ2ZpbHRlclJvdyc6XHJcbiAgICAgICAgICBjb25zdCBhcHBseUZpbHRlcjogRGV2RXhwcmVzcy51aS5keFRleHRFZGl0b3IuUHJvcGVydGllc1snb25FbnRlcktleSddID0gKGFyZ3MpID0+IHtcclxuICAgICAgICAgICAgZS5lbGVtZW50ICYmIGUuZWxlbWVudC5maW5kKCcuZHgtYXBwbHktYnV0dG9uJykudHJpZ2dlcignZHhjbGljaycpO1xyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25FbnRlcktleSA9IGFwcGx5RmlsdGVyO1xyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uRm9jdXNPdXQgPSBhcHBseUZpbHRlcjtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnc2VhcmNoUGFuZWwnOlxyXG4gICAgICAgICAgY29uc3QgYXBwbHlTZWFyY2g6IERldkV4cHJlc3MudWkuZHhUZXh0RWRpdG9yLlByb3BlcnRpZXNbJ29uRW50ZXJLZXknXSA9IChhcmdzKSA9PiB7XHJcbiAgICAgICAgICAgIGUuY29tcG9uZW50LnNlYXJjaEJ5VGV4dChhcmdzLmNvbXBvbmVudC5vcHRpb24oJ3ZhbHVlJykpO1xyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25WYWx1ZUNoYW5nZWQgPSAoKSA9PiB7IH07XHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25FbnRlcktleSA9IGFwcGx5U2VhcmNoO1xyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uRm9jdXNPdXQgPSBhcHBseVNlYXJjaDtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHNldHRpbmdzLm9wdGlvbnM/Lm9uRWRpdG9yUHJlcGFyaW5nKSB7XHJcbiAgICAgICAgc2V0dGluZ3Mub3B0aW9ucy5vbkVkaXRvclByZXBhcmluZyhlKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uQ29udGV4dE1lbnVQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgIGlmICghY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgICAgaWYgKGUudGFyZ2V0ID09PSAnY29udGVudCcgJiYgISFzZXR0aW5ncy5leHBvcnRGaWxlTmFtZSkge1xyXG4gICAgICAgICAgaWYgKCFlLml0ZW1zKSB7XHJcbiAgICAgICAgICAgIGUuaXRlbXMgPSBbXTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBlLml0ZW1zLnB1c2goe1xyXG4gICAgICAgICAgICB0ZXh0OiAnRXhwb3J0IGFsbCBkYXRhJyxcclxuICAgICAgICAgICAgb25JdGVtQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICBlLmNvbXBvbmVudC5leHBvcnRUb0V4Y2VsKGZhbHNlKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgaWNvbjogJ3hsc3hmaWxlJ1xyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4Q29udGV4dE1lbnVJdGVtKTtcclxuXHJcbiAgICAgICAgICBpZiAoc2V0dGluZ3Mub3B0aW9ucy5zZWxlY3Rpb24/Lm1vZGUgIT09ICdub25lJykge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSBlLmNvbXBvbmVudC5nZXRTZWxlY3RlZFJvd0tleXMoKTtcclxuXHJcbiAgICAgICAgICAgIGUuaXRlbXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ0V4cG9ydCBzZWxlY3RlZCByb3dzJyxcclxuICAgICAgICAgICAgICBvbkl0ZW1DbGljazogKCkgPT4gZS5jb21wb25lbnQuZXhwb3J0VG9FeGNlbCh0cnVlKSxcclxuICAgICAgICAgICAgICBpY29uOiAnZXhwb3J0c2VsZWN0ZWQnLFxyXG4gICAgICAgICAgICAgIGRpc2FibGVkOiAhc2VsZWN0ZWRSb3dzIHx8ICFzZWxlY3RlZFJvd3MubGVuZ3RoXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keENvbnRleHRNZW51SXRlbSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc2V0dGluZ3Mub3B0aW9ucz8ub25Db250ZXh0TWVudVByZXBhcmluZykge1xyXG4gICAgICAgIHNldHRpbmdzLm9wdGlvbnM/Lm9uQ29udGV4dE1lbnVQcmVwYXJpbmcoZSk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBvbkV4cG9ydGluZzogISFzZXR0aW5ncy5leHBvcnRGaWxlTmFtZSA/IGNyZWF0ZUdyaWRFeHBvcnRGbihzZXR0aW5ncy5leHBvcnRGaWxlTmFtZSkgOiB2b2lkIDAsXHJcbiAgfSBhcyBUO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBjcmVhdGVEYXRhR3JpZCwgY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkIH0gZnJvbSAnLi9DcmVhdGVGdWxsU2NyZWVuR3JpZCc7XHJcbmltcG9ydCB7IGdldEdyaWREZWZhdWx0T3B0aW9ucywgZ2V0SGFuZGxlcnMsIElEYXRhR3JpZFNldHRpbmdzIH0gZnJvbSAnLi9EZWZhdWx0R3JpZEJhc2UnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZWw6IEpRdWVyeSwgc2V0dGluZ3M6IElEYXRhR3JpZFNldHRpbmdzKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IGdldEdyaWREZWZhdWx0T3B0aW9ucyhzZXR0aW5ncyk7XHJcbiAgbGV0IG1lcmdlZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgZGVmYXVsdE9wdGlvbnMsIHNldHRpbmdzLm9wdGlvbnMpO1xyXG4gIGNvbnN0IGhhbmRsZXJzID0gZ2V0SGFuZGxlcnM8RGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucz4oJ2R4RGF0YUdyaWQnLCAkLmV4dGVuZCh0cnVlLCB7fSwgc2V0dGluZ3MsIHsgb3B0aW9uczogbWVyZ2VkT3B0aW9ucyB9KSk7XHJcblxyXG4gIG1lcmdlZE9wdGlvbnMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgbWVyZ2VkT3B0aW9ucywgaGFuZGxlcnMpO1xyXG5cclxuICBpZiAoc2V0dGluZ3MuaXNGdWxsU2NyZWVuIHx8IHNldHRpbmdzLmlzRnVsbFNjcmVlbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICByZXR1cm4gY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkKGVsLCBtZXJnZWRPcHRpb25zLCBzZXR0aW5ncy5pblBhbmVsR3JpZCk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBjcmVhdGVEYXRhR3JpZChlbCwgbWVyZ2VkT3B0aW9ucyk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJR3JpZEFkZGl0aW9uYWxPcHRpb25zIH0gZnJvbSAnLi9DcmVhdGVGdWxsU2NyZWVuR3JpZCc7XHJcbmltcG9ydCBkZWZhdWx0R3JpZCBmcm9tICcuL0RlZmF1bHRHcmlkJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKFxyXG4gIGlkOiBzdHJpbmcsIGRhdGFHcmlkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnM6IElHcmlkQWRkaXRpb25hbE9wdGlvbnMgPSB7fSxcclxuICBoZWFkZXJUZXh0Pzogc3RyaW5nLCBoZWFkZXJEZXNjcmlwdGlvbj86IHN0cmluZ1xyXG4pOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gIHJldHVybiBkZWZhdWx0R3JpZCgkKGAjJHtpZH1gKSwge1xyXG4gICAgb3B0aW9uczogZGF0YUdyaWRPcHRpb25zLFxyXG4gICAgZXhwb3J0RmlsZU5hbWU6IGFkZGl0aW9uYWxPcHRpb25zLmV4cG9ydEZpbGVOYW1lLFxyXG4gICAgaW5QYW5lbEdyaWQ6IGFkZGl0aW9uYWxPcHRpb25zLmluUGFuZWxHcmlkLFxyXG4gICAgc2hvd1N1bW1hcnlJbkNvbHVtbjogYWRkaXRpb25hbE9wdGlvbnMuc2hvd1N1bW1hcnlJbkNvbHVtbixcclxuICAgIHN1bW1hcnlDb2x1bW46IGFkZGl0aW9uYWxPcHRpb25zLnN1bW1hcnlDb2x1bW4sXHJcbiAgICBoZWFkZXJEZXNjcmlwdGlvbixcclxuICAgIHRpdGxlOiBoZWFkZXJUZXh0XHJcbiAgfSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElUcmVlTGlzdFNldHRpbmdzLCBnZXRUcmVlTGlzdERlZmF1bHRPcHRpb25zLCBnZXRIYW5kbGVycyB9IGZyb20gJy4vRGVmYXVsdEdyaWRCYXNlJztcclxuaW1wb3J0IHsgY3JlYXRlRnVsbFNjcmVlblRyZWVMaXN0IH0gZnJvbSAnLi9DcmVhdGVGdWxsU2NyZWVuR3JpZCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihcclxuICBpZDogc3RyaW5nIHwgSlF1ZXJ5LFxyXG4gIHNldHRpbmdzOiBJVHJlZUxpc3RTZXR0aW5ncyA9IHt9XHJcbik6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdCB7XHJcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSBnZXRUcmVlTGlzdERlZmF1bHRPcHRpb25zKHNldHRpbmdzKTtcclxuICBsZXQgbWVyZ2VkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keFRyZWVMaXN0T3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBkZWZhdWx0T3B0aW9ucywgc2V0dGluZ3Mub3B0aW9ucyk7XHJcbiAgY29uc3QgaGFuZGxlcnMgPSBnZXRIYW5kbGVyczxEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zPignZHhUcmVlTGlzdCcsICQuZXh0ZW5kKHRydWUsIHt9LCBzZXR0aW5ncywgeyBvcHRpb25zOiBtZXJnZWRPcHRpb25zIH0pKTtcclxuXHJcbiAgbWVyZ2VkT3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBtZXJnZWRPcHRpb25zLCBoYW5kbGVycyk7XHJcblxyXG4gIHJldHVybiBjcmVhdGVGdWxsU2NyZWVuVHJlZUxpc3QoaWQsIG1lcmdlZE9wdGlvbnMsIHNldHRpbmdzLmluUGFuZWxHcmlkKTtcclxufVxyXG4iLCAiaW1wb3J0IENyb3BwciBmcm9tICdjcm9wcHInO1xyXG5pbXBvcnQgeyBjcmVhdGVEaWFsb2cgfSBmcm9tICcuLi9Qb3B1cCc7XHJcblxyXG5pbXBvcnQgSW5pdGlhbGl6ZWRFdmVudEluZm8gPSBEZXZFeHByZXNzLmV2ZW50cy5Jbml0aWFsaXplZEV2ZW50SW5mbztcclxuXHJcbmNvbnN0IGF2YXRhclNpemUgPSB7XHJcbiAgaGVpZ2h0OiAzMDAsXHJcbiAgd2lkdGg6IDMwMCxcclxufVxyXG5cclxuZnVuY3Rpb24gc2V0SW1hZ2VUb1ByZXZpZXcgKHByZXZpZXc6IEpRdWVyeSwgYmFzZTY0SW1nOiBzdHJpbmcgfCBudWxsKSB7XHJcbiAgcHJldmlldy5hdHRyKCdzcmMnLCBiYXNlNjRJbWcpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVDb250ZW50TWFya3VwIChpbWFnZUJhc2U2NDogc3RyaW5nIHwgbnVsbCkge1xyXG4gIGNvbnN0ICRhdmF0YXJQb3B1cENvbnRlbnQgPSAkKCc8ZGl2PicpXHJcbiAgICAuYWRkQ2xhc3MoJ2F2YXRhci1wb3B1cF9fZHJvcHpvbmUnKTtcclxuICAvLy5vbignZHJvcCcgLCBldiA9PiBldi5kYXRhVHJhbnNmZXIuZmlsZXMpXHJcblxyXG4gIGNvbnN0ICRjcm9wcGVyQ29udGFpbmVyID0gJCgnPGRpdj4nKVxyXG4gICAgLmFkZENsYXNzKCdhdmF0YXItcG9wdXBfX2Nyb3AtY29udGFpbmVyJylcclxuICAgIC5hcHBlbmRUbygkYXZhdGFyUG9wdXBDb250ZW50KTtcclxuXHJcbiAgY29uc3QgJGNyb3BJbWFnZSA9ICQoJzxpbWcgLz4nKS5wcmVwZW5kVG8oJGNyb3BwZXJDb250YWluZXIpO1xyXG5cclxuICBzZXRJbWFnZVRvUHJldmlldygkY3JvcEltYWdlLCBpbWFnZUJhc2U2NCk7XHJcblxyXG4gIGNvbnN0IGNyb3BwZXIgPSBuZXcgQ3JvcHByKCRjcm9wSW1hZ2VbMF0sIHtcclxuICAgIGFzcGVjdFJhdGlvOiAxLFxyXG4gICAgc3RhcnRTaXplOiBbOTAsIDkwXSxcclxuICB9KTtcclxuXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICAkY29udGVudDogJGF2YXRhclBvcHVwQ29udGVudCxcclxuICAgIGNyb3BwZXJcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93UG9wdXAgKCRjb250ZW50OiBKUXVlcnksIGNyb3BwZXI6IENyb3Bwciwgb25BdmF0YXJVcGRhdGVkOiAocGhvdG9CYXNlNjQ6IHN0cmluZykgPT4gdm9pZCkge1xyXG4gIGNyZWF0ZURpYWxvZyhcclxuICAgIHtcclxuICAgICAgdGl0bGU6ICdVcGRhdGUgcHJvZmlsZSBwaWN0dXJlJyxcclxuICAgICAgc2hvd1RpdGxlOiB0cnVlLFxyXG4gICAgICBkcmFnRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIHJlc2l6ZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsXHJcbiAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxyXG4gICAgICBtYXhXaWR0aDogMTAyNCxcclxuICAgICAgb25Jbml0aWFsaXplZDogKGU6IEluaXRpYWxpemVkRXZlbnRJbmZvPERldkV4cHJlc3MudWkuZHhQb3B1cD4pID0+IHtcclxuICAgICAgICBlLmNvbXBvbmVudCAmJiBlLmNvbXBvbmVudC5vcHRpb24oJ2Z1bGxTY3JlZW4nLCB3aW5kb3cuaW5uZXJXaWR0aCA8PSAxMDI0KTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgICRjb250ZW50LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiAnVXBkYXRlJyxcclxuICAgICAgb25DbGljazogKGNsb3NlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY3JvcE9wdGlvbnMgPSBjcm9wcGVyLmdldFZhbHVlKCk7XHJcbiAgICAgICAgY29uc3QgJGNhbnZhczogSlF1ZXJ5PEhUTUxDYW52YXNFbGVtZW50PiA9ICQoJzxjYW52YXM+JykuYXR0cignaGVpZ2h0JywgYXZhdGFyU2l6ZS5oZWlnaHQpLmF0dHIoJ3dpZHRoJywgYXZhdGFyU2l6ZS53aWR0aCkgYXMgSlF1ZXJ5PEhUTUxDYW52YXNFbGVtZW50PjtcclxuICAgICAgICBjb25zdCBjdHggPSAoJGNhbnZhc1swXSBhcyBhbnkpLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICAgICAgY29uc3QgJGltYWdlID0gJGNvbnRlbnQuZmluZCgnaW1nLmNyb3Bwci1pbWFnZScpWzBdO1xyXG5cclxuICAgICAgICBjdHguZHJhd0ltYWdlKCRpbWFnZSwgY3JvcE9wdGlvbnMueCwgY3JvcE9wdGlvbnMueSwgY3JvcE9wdGlvbnMud2lkdGgsIGNyb3BPcHRpb25zLmhlaWdodCwgMCwgMCwgYXZhdGFyU2l6ZS53aWR0aCwgYXZhdGFyU2l6ZS5oZWlnaHQpO1xyXG5cclxuICAgICAgICBjb25zdCBjcm9wcGVkID0gJGNhbnZhc1swXS50b0RhdGFVUkwoJ2ltYWdlL2pwZWcnLCAwLjkpO1xyXG5cclxuICAgICAgICBvbkF2YXRhclVwZGF0ZWQoY3JvcHBlZCk7XHJcbiAgICAgICAgY2xvc2UoKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdGV4dDogJ0NhbmNlbCcsXHJcbiAgICAgIG9uQ2xpY2s6IChjbG9zZSkgPT4gY2xvc2UoKVxyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzaG93IChpbWFnZUJhc2U2NDogc3RyaW5nIHwgbnVsbCwgb25BdmF0YXJVcGRhdGVkOiAocGhvdG9CYXNlNjQ6IHN0cmluZykgPT4gdm9pZCkge1xyXG4gIGNvbnN0IGNvbnRlbnQgPSBjcmVhdGVDb250ZW50TWFya3VwKGltYWdlQmFzZTY0KTtcclxuXHJcbiAgc2hvd1BvcHVwKGNvbnRlbnQuJGNvbnRlbnQsIGNvbnRlbnQuY3JvcHBlciwgb25BdmF0YXJVcGRhdGVkKTtcclxufVxyXG4iLCAiZXhwb3J0IGNvbnN0IGdldEJhc2U2NCA9IChmaWxlOiBGaWxlKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiA9PiB7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG5cclxuICAgICAgZmlsZVJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZmlsZVJlYWRlci5yZXN1bHQ7XHJcbiAgICAgICAgcmVzb2x2ZSh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyA/IHJlc3VsdCA6IG51bGwpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgZmlsZVJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG5cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn07XHJcbiIsICJpbXBvcnQge0lSZW5kZXJlZH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHtEZXZFeHByZXNzRXZlbnRBcmdzfSBmcm9tICcuLi8uLi9VdGlscy9EZXZFeHByZXNzRXZlbnRBcmdzJztcclxuaW1wb3J0IHsgc2hvdyB9IGZyb20gJy4uLy4uL1dpZGdldHMvSW1hZ2VDcm9wRGlhbG9nJztcclxuaW1wb3J0IHtnZXRCYXNlNjR9IGZyb20gJy4uLy4uL1dpZGdldHMvSW1hZ2VDcm9wRGlhbG9nL0hlbHBlcnMnO1xyXG5pbXBvcnQgZHhUZXh0Qm94T3B0aW9ucyA9IERldkV4cHJlc3MudWkuZHhUZXh0Qm94T3B0aW9ucztcclxuaW1wb3J0IGR4VGV4dEJveCA9IERldkV4cHJlc3MudWkuZHhUZXh0Qm94O1xyXG5pbXBvcnQgSXN6b2xlYVVJIGZyb20gJy4uLy4uL2luZGV4JztcclxuXHJcbmNvbnN0IG1heEZpbGVNYlNpemUgPSAxMDtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUFjY291bnRTZXR0aW5nc0RhdGEge1xyXG4gIFVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgRmlyc3ROYW1lOiBzdHJpbmc7XHJcbiAgTGFzdE5hbWU6IHN0cmluZztcclxuICBQaG9uZU51bWJlcjogc3RyaW5nO1xyXG4gIEVtYWlsOiBzdHJpbmc7XHJcbiAgT2xkUGFzc3dvcmQ6IHN0cmluZztcclxuICBOZXdQYXNzd29yZDogc3RyaW5nO1xyXG4gIE5ld1Bhc3N3b3JkUmVwZWF0OiBzdHJpbmc7XHJcbiAgQXZhdGFyOiBzdHJpbmc7XHJcbiAgSGFzQ2hhbmdlczogYm9vbGVhbjtcclxuICBFcnJvck1lc3NhZ2U6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVXNlciB7XHJcbiAgSWQ6IHN0cmluZztcclxuICBVc2VyTmFtZTogc3RyaW5nO1xyXG4gIEZpcnN0TmFtZTogc3RyaW5nO1xyXG4gIExhc3ROYW1lOiBzdHJpbmc7XHJcbiAgVXNlckF2YXRhcjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQWNjb3VudFNldHRpbmdzUGFnZSBpbXBsZW1lbnRzIElSZW5kZXJlZCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjdXJyZW50VXNlckluZm86IElVc2VyIHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyByZWFkb25seSBhY2NvdW50U2V0dGluZ3NEYXRhOiBJQWNjb3VudFNldHRpbmdzRGF0YSB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgcmVhZG9ubHkgZm9ybUFjdGlvbjogc3RyaW5nO1xyXG4gIHByaXZhdGUgYXZhdGFyVXBsb2FkZXI6IERldkV4cHJlc3MudWkuZHhGaWxlVXBsb2FkZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBhY2NvdW50U2V0dGluZ3NGb3JtOiBEZXZFeHByZXNzLnVpLmR4Rm9ybSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLy8gZWxlbWVudHNcclxuICBwcml2YXRlIHJlYWRvbmx5IF8kcm9vdEVsZW1lbnQ6IEpRdWVyeTxIVE1MRGl2RWxlbWVudD4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgJGNvbnRhaW5lcjogSlF1ZXJ5PEhUTUxEaXZFbGVtZW50PixcclxuICAgIGZvcm1BY3Rpb246IHN0cmluZyxcclxuICAgIGFjY291bnRTZXR0aW5nc0RhdGE6IElBY2NvdW50U2V0dGluZ3NEYXRhIHwgdW5kZWZpbmVkLFxyXG4gICAgdXNlckluZm86IElVc2VyIHwgdW5kZWZpbmVkXHJcbiAgKSB7XHJcbiAgICB0aGlzLmFjY291bnRTZXR0aW5nc0RhdGEgPSBhY2NvdW50U2V0dGluZ3NEYXRhO1xyXG4gICAgdGhpcy5jdXJyZW50VXNlckluZm8gPSB1c2VySW5mbztcclxuICAgIHRoaXMuXyRyb290RWxlbWVudCA9ICRjb250YWluZXI7XHJcbiAgICB0aGlzLmZvcm1BY3Rpb24gPSBmb3JtQWN0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIHRoaXMucmVuZGVyVXBsb2FkZXIodGhpcy4kcm9vdEVsZW1lbnQpO1xyXG4gICAgdGhpcy5yZW5kZXJBY2NvdW50U2V0dGluZ3NGb3JtKHRoaXMuJHJvb3RFbGVtZW50KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0ICRyb290RWxlbWVudCgpIHtcclxuICAgIGlmICghdGhpcy5fJHJvb3RFbGVtZW50KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHJvb3QgZWxlbWVudCBpcyB1bmRlZmluZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fJHJvb3RFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJVcGxvYWRlcigkY29udGFpbmVyOiBKUXVlcnkpIHtcclxuICAgIHRoaXMuYXZhdGFyVXBsb2FkZXIgPSAkKCc8ZGl2PicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXZhdGFyLXBvcHVwX191cGxvYWRlcicpXHJcbiAgICAgIC5keEZpbGVVcGxvYWRlcih7XHJcbiAgICAgICAgbXVsdGlwbGU6IGZhbHNlLFxyXG4gICAgICAgIHVwbG9hZE1vZGU6ICd1c2VGb3JtJyxcclxuICAgICAgICBhY2NlcHQ6ICdpbWFnZS8qJyxcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcclxuICAgICAgICBtYXhGaWxlU2l6ZTogbWF4RmlsZU1iU2l6ZSAqIDEwMDAwMDAsXHJcblxyXG4gICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoZTogRGV2RXhwcmVzc0V2ZW50QXJnczxEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyT3B0aW9ucywgJ29uVmFsdWVDaGFuZ2VkJz4pID0+IHtcclxuICAgICAgICAgIGlmICghZS5jb21wb25lbnQgfHwgIWUudmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29uc3QgZmlsZSA9IGUudmFsdWVbMF07XHJcbiAgICAgICAgICBjb25zdCBtYXhTaXplID0gZS5jb21wb25lbnQub3B0aW9uKCdtYXhGaWxlU2l6ZScpIHx8IG1heEZpbGVNYlNpemU7XHJcblxyXG4gICAgICAgICAgaWYgKCFmaWxlIHx8IGZpbGUuc2l6ZSA+IG1heFNpemUpIHtcclxuICAgICAgICAgICAgRGV2RXhwcmVzcy51aS5ub3RpZnkoYEZpbGUgc2l6ZSBzaG91bGQgYmUgbGVzcyB0aGFuICR7bWF4RmlsZU1iU2l6ZX0gTUIuIFBsZWFzZSBzZWxlY3QgYW5vdGhlciBmaWxlYCwgJ2Vycm9yJywgNTAwMCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgZ2V0QmFzZTY0KGZpbGUpXHJcbiAgICAgICAgICAgIC50aGVuKChpbWFnZUJhc2U2NCkgPT4ge1xyXG4gICAgICAgICAgICAgIHNob3coaW1hZ2VCYXNlNjQsIChuZXdJbWdTb3VyY2UpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudFNldHRpbmdzRm9ybT8udXBkYXRlRGF0YSgnQXZhdGFyJywgbmV3SW1nU291cmNlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudFNldHRpbmdzRm9ybT8ucmVwYWludCgpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiBEZXZFeHByZXNzLnVpLm5vdGlmeShlcnJvciwgJ2Vycm9yJywgMzAwMCkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pXHJcbiAgICAgIC5hcHBlbmRUbygkY29udGFpbmVyKVxyXG4gICAgICAuZHhGaWxlVXBsb2FkZXIoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckFjY291bnRTZXR0aW5nc0Zvcm0oJGNvbnRhaW5lcjogSlF1ZXJ5KSB7XHJcbiAgICBpZiAodGhpcy5hY2NvdW50U2V0dGluZ3NGb3JtKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFjY291bnRTZXR0aW5nc0Zvcm0gPSAkKCc8Zm9ybSAvPicpXHJcbiAgICAgIC5hdHRyKCdhY3Rpb24nLCB0aGlzLmZvcm1BY3Rpb24pXHJcbiAgICAgIC5hdHRyKCdtZXRob2QnLCAncG9zdCcpXHJcbiAgICAgIC5hZGRDbGFzcygnYWNjb3VudC1zZXR0aW5nc19fZm9ybScpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9ybS1jb250ZW50JylcclxuICAgICAgLmFwcGVuZFRvKCRjb250YWluZXIpXHJcbiAgICAgIC5keEZvcm0odGhpcy5nZXRGb3JtT3B0aW9ucygpKVxyXG4gICAgICAuZHhGb3JtKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIGlmICh0aGlzLmFjY291bnRTZXR0aW5nc0RhdGE/Lkhhc0NoYW5nZXMgJiYgIXRoaXMuYWNjb3VudFNldHRpbmdzRGF0YS5FcnJvck1lc3NhZ2UpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiBJc3pvbGVhVUkud2lkZ2V0cy5ub3RpZnkoJ0NoYW5nZXMgaGF2ZSBiZWVuIHNhdmVkJywgdHJ1ZSksIDUwMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZvcm1PcHRpb25zKCkgOiBEZXZFeHByZXNzLnVpLmR4Rm9ybU9wdGlvbnMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZm9ybURhdGE6IHRoaXMuYWNjb3VudFNldHRpbmdzRGF0YSxcclxuICAgICAgbWluQ29sV2lkdGg6IDIwMCxcclxuICAgICAgbGFiZWxMb2NhdGlvbjogJ3RvcCcsXHJcbiAgICAgIGFsaWduSXRlbUxhYmVsczogdHJ1ZSxcclxuICAgICAgc2hvd1ZhbGlkYXRpb25TdW1tYXJ5OiB0cnVlLFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxyXG4gICAgICAgICAgY29sQ291bnQ6IDE2LFxyXG4gICAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGNvbFNwYW46IDYsXHJcbiAgICAgICAgICAgICAgY2FwdGlvbjogJ1Byb2ZpbGUgUGljdHVyZScsXHJcbiAgICAgICAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdBdmF0YXInLFxyXG4gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0ICRhdmF0YXJWaWV3Q29udGFpbmVyID0gJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19hdmF0YXItdmlldy1jb250YWluZXInKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgJGF2YXRhckNvbnRhaW5lciA9ICQoJzxkaXY+JylcclxuICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnYWNjb3VudC1zZXR0aW5nc19fYXZhdGFyJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICQoJzxkaXY+JylcclxuICAgICAgICAgICAgICAgICAgICAgIC5hZGQoJGF2YXRhclZpZXdDb250YWluZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAuYWRkKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKCc8ZGl2PicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19hdmF0YXItYnV0dG9uJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAuZHhCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDIwMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdkZWZhdWx0JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICdwaG90bycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnVXBsb2FkIG5ldyBpbWFnZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4gdGhpcy5hdmF0YXJVcGxvYWRlciAmJiB0aGlzLmF2YXRhclVwbG9hZGVyLm9wdGlvbignZGlhbG9nVHJpZ2dlcicsIGUuZWxlbWVudClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgKS5hcHBlbmRUbygkYXZhdGFyQ29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXZhdGFyQmFzZTY0ID0gZGF0YS5lZGl0b3JPcHRpb25zLnZhbHVlIHx8IHRoaXMuY3VycmVudFVzZXJJbmZvPy5Vc2VyQXZhdGFyO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYXZhdGFyQmFzZTY0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAkKCc8aW1nPicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnYWNjb3VudC1zZXR0aW5nc19fYXZhdGFyLXZpZXcnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignc3JjJywgYXZhdGFyQmFzZTY0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJGF2YXRhclZpZXdDb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmVkaXRvck9wdGlvbnMudmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJCgnPGlucHV0PicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19hdmF0YXItaW5wdXQnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCd0eXBlJywgJ3RleHQnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCduYW1lJywgJ0F2YXRhcicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRhdmF0YXJDb250YWluZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhbChkYXRhLmVkaXRvck9wdGlvbnMudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAkKCc8aT4nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoWydhY2NvdW50LXNldHRpbmdzX19hdmF0YXItdmlldy1kZWZhdWx0JywgJ2ZhcycsICdmYS11c2VyJ10pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkYXZhdGFyVmlld0NvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBpZih0aGlzLmF2YXRhclVwbG9hZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICB0aGlzLmF2YXRhclVwbG9hZGVyLm9wdGlvbignZHJvcFpvbmUnLCAkYXZhdGFyQ29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgIHRoaXMuYXZhdGFyVXBsb2FkZXIub3B0aW9uKCdvbkRyb3Bab25lRW50ZXInLCAoKSA9PiAkYXZhdGFyQ29udGFpbmVyLmFkZENsYXNzKCdkcm9wJykpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgdGhpcy5hdmF0YXJVcGxvYWRlci5vcHRpb24oJ29uRHJvcFpvbmVMZWF2ZScsICgpID0+ICRhdmF0YXJDb250YWluZXIucmVtb3ZlQ2xhc3MoJ2Ryb3AnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGF2YXRhckNvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGl0ZW1UeXBlOiAnZW1wdHknLFxyXG4gICAgICAgICAgICAgIGNvbFNwYW46IDFcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGNvbFNwYW46IDksXHJcbiAgICAgICAgICAgICAgY2FwdGlvbjogJ0FjY291bnQgRGV0YWlscycsXHJcbiAgICAgICAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdFcnJvck1lc3NhZ2UnLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGRhdGEgJiYgZGF0YS5lZGl0b3JPcHRpb25zICYmIGRhdGEuZWRpdG9yT3B0aW9ucy52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yTWVzc2FnZSAmJiAkKCc8ZGl2IC8+JykudGV4dChlcnJvck1lc3NhZ2UpLmFkZENsYXNzKCdlcnJvci1tZXNzYWdlJyk7XHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgLy8ge1xyXG4gICAgICAgICAgICAgICAgLy8gICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAvLyAgIGRhdGFGaWVsZDogJ0hhc0NoYW5nZXMnLFxyXG4gICAgICAgICAgICAgICAgLy8gICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIHZpc2libGU6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAvLyAgIH0sXHJcbiAgICAgICAgICAgICAgICAvLyAgIHZpc2libGU6IHRoaXMuYWNjb3VudFNldHRpbmdzRGF0YT8uSGFzQ2hhbmdlcyAmJiAhdGhpcy5hY2NvdW50U2V0dGluZ3NEYXRhLkVycm9yTWVzc2FnZSxcclxuICAgICAgICAgICAgICAgIC8vICAgdGVtcGxhdGU6IChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm4gJCgnPGRpdiAvPicpLnRleHQoJ0NoYW5nZXMgaGF2ZSBiZWVuIHNhdmVkJykuYWRkQ2xhc3MoJ3N1Y2Nlc3MtbWVzc2FnZScpO1xyXG4gICAgICAgICAgICAgICAgLy8gICB9LFxyXG4gICAgICAgICAgICAgICAgLy8gfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdVc2VyTmFtZScsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1VzZXJuYW1lJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdyZXF1aXJlZCcsIG1lc3NhZ2U6ICdVc2VybmFtZSBpcyByZXF1aXJlZCcgfSxcclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgICAgICAgICAgIGNvbENvdW50OiAyLFxyXG4gICAgICAgICAgICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ0ZpcnN0TmFtZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnRmlyc3QgTmFtZSdcclxuICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAncmVxdWlyZWQnLCBtZXNzYWdlOiAnRmlyc3QgTmFtZSBpcyByZXF1aXJlZCcgfSxcclxuICAgICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ0xhc3ROYW1lJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICdMYXN0IE5hbWUnXHJcbiAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ3JlcXVpcmVkJywgbWVzc2FnZTogJ0xhc3QgTmFtZSBpcyByZXF1aXJlZCcgfSxcclxuICAgICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnUGhvbmVOdW1iZXInLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdQaG9uZSBOdW1iZXInXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnRW1haWwnLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdFbWFpbCdcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAncmVxdWlyZWQnLCBtZXNzYWdlOiAnRW1haWwgaXMgcmVxdWlyZWQnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnZW1haWwnLCBtZXNzYWdlOiAnUGxlYXNlIHVzZSBhIHZhbGlkIGVtYWlsIGFkZHJlc3MnIH1cclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBjc3NDbGFzczogJ2FjY291bnQtc2V0dGluZ3NfX3Bhc3N3b3JkLWFyZWEnLFxyXG4gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4gJCgnPGRpdiAvPicpLmNzcygnZm9udC13ZWlnaHQnLCAnYm9sZCcpLnRleHQoJ0NoYW5nZSBQYXNzd29yZCcpXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ09sZFBhc3N3b3JkJyxcclxuICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnQ3VycmVudCBwYXNzd29yZCdcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZGU6ICdwYXNzd29yZCdcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsXHJcbiAgICAgICAgICAgICAgICAgICAgICByZWV2YWx1YXRlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkNhbGxiYWNrOiAocGFyYW1zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEhdGhpcy5hY2NvdW50U2V0dGluZ3NGb3JtPy5nZXRFZGl0b3IoJ05ld1Bhc3N3b3JkJyk/Lm9wdGlvbigndmFsdWUnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXBhcmFtcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ09sZCBwYXNzd29yZCBpcyByZXF1aXJlZCdcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ05ld1Bhc3N3b3JkJyxcclxuICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnTmV3IHBhc3N3b3JkJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogJ3Bhc3N3b3JkJyxcclxuICAgICAgICAgICAgICAgICAgICBpbnB1dEF0dHI6IHsgYXV0b2NvbXBsZXRlOiAnbmV3LXBhc3N3b3JkJyB9XHJcbiAgICAgICAgICAgICAgICAgIH0gYXMgZHhUZXh0Qm94T3B0aW9uczxkeFRleHRCb3g+LFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdOZXdQYXNzd29yZFJlcGVhdCcsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0NvbmZpcm0gbmV3IHBhc3N3b3JkJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogJ3Bhc3N3b3JkJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgICAgICAgICAgIHJlZXZhbHVhdGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FsbGJhY2s6IChwYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmFjY291bnRTZXR0aW5nc0Zvcm0/LmdldEVkaXRvcignTmV3UGFzc3dvcmQnKT8ub3B0aW9uKCd2YWx1ZScpIHx8ICcnKSA9PT0gcGFyYW1zLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQYXNzd29yZCBtaXNtYXRjaCcsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdidXR0b24nLFxyXG4gICAgICAgICAgICAgICAgICBob3Jpem9udGFsQWxpZ25tZW50OiAncmlnaHQnLFxyXG4gICAgICAgICAgICAgICAgICBjc3NDbGFzczogJ2FjY291bnQtc2V0dGluZ3NfX3N1Ym1pdC1idG4nLFxyXG4gICAgICAgICAgICAgICAgICBidXR0b25PcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1NhdmUgQ2hhbmdlcycsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxyXG4gICAgICAgICAgICAgICAgICAgIHVzZVN1Ym1pdEJlaGF2aW9yOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAyMDAsXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29uZmlybSh0ZXh0OiBzdHJpbmcpOiBKUXVlcnlEZWZlcnJlZDxib29sZWFuPiB7XHJcbiAgICBjb25zdCAkZGVmZmVyZWQ6IEpRdWVyeURlZmVycmVkPGJvb2xlYW4+ID0gJC5EZWZlcnJlZCgpO1xyXG4gICAgY29uc3QgJGVsZW1lbnQgPSAkKCc8ZGl2Lz4nKS5hcHBlbmRUbyh3aW5kb3cuZG9jdW1lbnQuYm9keSk7XHJcblxyXG4gICAgY29uc3QgcG9wdXAgPSAkZWxlbWVudC5keFBvcHVwKHtcclxuICAgICAgICBzaG93VGl0bGU6IGZhbHNlLFxyXG4gICAgICAgIGhlaWdodDogMTQwLFxyXG4gICAgICAgIHdpZHRoOiAzNzAsXHJcbiAgICAgICAgY29udGVudFRlbXBsYXRlOiAoJGNvbnRlbnQpID0+IHtcclxuICAgICAgICAgICAgJGNvbnRlbnQuYWRkQ2xhc3MoJ2lzem9sZWEtZHgtY29uZmlybScpO1xyXG5cclxuICAgICAgICAgICAgJCgnPGIvPicpLmFkZENsYXNzKCdtZXNzYWdlJykudGV4dCh0ZXh0KS5hcHBlbmRUbygkY29udGVudCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCAkYnV0dG9uc1NlY3Rpb24gPSAkKCc8ZGl2Lz4nKS5hZGRDbGFzcygnYnV0dG9ucycpLmFwcGVuZFRvKCRjb250ZW50KTtcclxuXHJcbiAgICAgICAgICAgICQoJzxkaXYvPicpLmR4QnV0dG9uKHtcclxuICAgICAgICAgICAgICAgIHRleHQ6ICdEZWxldGUnLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2RhbmdlcicsXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9wdXAuaGlkZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAkZGVmZmVyZWQucmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkuYXBwZW5kVG8oJGJ1dHRvbnNTZWN0aW9uKTtcclxuXHJcbiAgICAgICAgICAgICQoJzxkaXYvPicpLmR4QnV0dG9uKHtcclxuICAgICAgICAgICAgICAgIHRleHQ6ICdDYW5jZWwnLFxyXG4gICAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHBvcHVwLmhpZGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgJGRlZmZlcmVkLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KS5hcHBlbmRUbygkYnV0dG9uc1NlY3Rpb24pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIG9uSGlkZGVuOiAoKSA9PiB7XHJcbiAgICAgICAgcG9wdXAuZGlzcG9zZSgpO1xyXG4gICAgICAgIHBvcHVwLmVsZW1lbnQoKS5yZW1vdmUoKTtcclxuICAgICAgfVxyXG4gICAgfSkuZHhQb3B1cCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICBwb3B1cC5zaG93KCk7XHJcblxyXG4gICAgcmV0dXJuICRkZWZmZXJlZDtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUxvZ29TZXR0aW5ncyB9IGZyb20gJy4uL0RhdGEnO1xyXG5pbXBvcnQgeyBMT0dPX1NFVFRJTkdTX0NBQ0hFX0tFWSB9IGZyb20gJy4uL0NvbnN0YW50cy9DYWNoZUtleXMnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4uL0NvbmZpZy9JbmRleCc7XHJcbmltcG9ydCB7IElCYWNrZ3JvdW5kUGhvdG9WaWV3ZXJTZXR0aW5ncyB9IGZyb20gJy4uL0RhdGEvSUJhY2tncm91bmRQaG90b1ZpZXdlclNldHRpbmdzJztcclxuaW1wb3J0IHsgc2hvdyBhcyBzaG93SW1hZ2VWaWV3ZXIgfSBmcm9tICcuLi9XaWRnZXRzL0JhY2tncm91bmRJbWFnZVZpZXdlcic7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGFuZGluZygkY29udGFpbmVyOiBKUXVlcnksIGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncyB8IHN0cmluZywgc2hvd1NpZ25JbkJ1dHRvbjogYm9vbGVhbiwgcGhvdG9HYWxsZXJ5U2V0dGluZ3M6IElCYWNrZ3JvdW5kUGhvdG9WaWV3ZXJTZXR0aW5ncyA9IHsgZW5hYmxlZDogZmFsc2UgfSkge1xyXG4gIGdldExvZ29TZXR0aW5ncyhsb2dvU2V0dGluZ3MpLnRoZW4oKHNldHRpbmdzKSA9PiB7XHJcbiAgICBjcmVhdGVMYW5kaW5nTWFya3VwKCRjb250YWluZXIsIHNldHRpbmdzLCBzaG93U2lnbkluQnV0dG9uLCBwaG90b0dhbGxlcnlTZXR0aW5ncyk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldExvZ29TZXR0aW5ncyhsb2dvU2V0dGluZ3M6IElMb2dvU2V0dGluZ3MgfCBzdHJpbmcpOiBKUXVlcnlEZWZlcnJlZDxJTG9nb1NldHRpbmdzPiB7XHJcbiAgY29uc3QgJGRlZmZlcmVkOiBKUXVlcnlEZWZlcnJlZDxJTG9nb1NldHRpbmdzPiA9ICQuRGVmZXJyZWQoKTtcclxuXHJcbiAgaWYgKHR5cGVvZiBsb2dvU2V0dGluZ3MgPT09ICdzdHJpbmcnKSB7XHJcbiAgICBjb25zdCBjYWNoZWRTZXR0aW5nc1JhdyA9IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKExPR09fU0VUVElOR1NfQ0FDSEVfS0VZKTtcclxuICAgIGlmIChjYWNoZWRTZXR0aW5nc1Jhdykge1xyXG4gICAgICAkZGVmZmVyZWQucmVzb2x2ZShKU09OLnBhcnNlKGNhY2hlZFNldHRpbmdzUmF3KSBhcyBJTG9nb1NldHRpbmdzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNlbmRSZXF1ZXN0KGxvZ29TZXR0aW5ncywgJ3Bvc3QnKS5kb25lKChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgYXBwbGljYXRpb25OYW1lOiBkYXRhLkFwcGxpY2F0aW9uTmFtZSxcclxuICAgICAgICAgIGJ1c2luZXNzTmFtZTogZGF0YS5CdXNpbmVzc05hbWUsXHJcbiAgICAgICAgICBsYW5kaW5nUGFnZUxvZ286IGRhdGEuTGFuZGluZ1BhZ2VMb2dvLFxyXG4gICAgICAgICAgbG9nb0ltYWdlOiBkYXRhLkxvZ29JbWFnZSxcclxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBkYXRhLkRlc2NyaXB0aW9uXHJcbiAgICAgICAgfSBhcyBJTG9nb1NldHRpbmdzO1xyXG4gICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKExPR09fU0VUVElOR1NfQ0FDSEVfS0VZLCBKU09OLnN0cmluZ2lmeShyZXN1bHQpKTtcclxuICAgICAgICAkZGVmZmVyZWQucmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgJGRlZmZlcmVkLnJlc29sdmUobG9nb1NldHRpbmdzKTtcclxuICB9XHJcblxyXG4gIHJldHVybiAkZGVmZmVyZWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUxhbmRpbmdNYXJrdXAoJGNvbnRhaW5lcjogSlF1ZXJ5LCBsb2dvU2V0dGluZ3M6IElMb2dvU2V0dGluZ3MsIHNob3dTaWduSW5CdXR0b246IGJvb2xlYW4sIHBob3RvR2FsbGVyeVNldHRpbmdzOiBJQmFja2dyb3VuZFBob3RvVmlld2VyU2V0dGluZ3MpIHtcclxuICBjb25zdCAkbGFuZGluZ1BhZ2UgPSAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2lzem9sZWEtbGFuZGluZy1wYWdlJykuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcbiAgbGV0ICRsYW5kaW5nQ29udGFpbmVyID0gJCgnPGRpdiAvPicpLmFkZENsYXNzKCdsYW5kaW5nLWNvbnRhaW5lcicpLmFwcGVuZFRvKCRsYW5kaW5nUGFnZSk7XHJcblxyXG4gIGlmKHBob3RvR2FsbGVyeVNldHRpbmdzLmVuYWJsZWQpIHtcclxuICAgICRsYW5kaW5nUGFnZS5hZGRDbGFzcygncGhvdG8tZ2FsbGVyeS1tb2RlJyk7XHJcbiAgfSBlbHNlIHtcclxuICAgICRsYW5kaW5nUGFnZS5hZGRDbGFzcygnZGVmYXVsdC1tb2RlJyk7XHJcbiAgICAkbGFuZGluZ0NvbnRhaW5lciA9ICRsYW5kaW5nUGFnZTtcclxuICB9XHJcblxyXG4gICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnbG9nby1jb250YWluZXInKVxyXG4gICAgLmFwcGVuZFRvKCRsYW5kaW5nQ29udGFpbmVyKVxyXG4gICAgLmFwcGVuZChcclxuICAgICAgJCgnPGltZyAvPicpLmF0dHIoJ3NyYycsIGxvZ29TZXR0aW5ncy5sYW5kaW5nUGFnZUxvZ28pLmFkZENsYXNzKCdsb2dvLWxhcmdlJykuYXBwZW5kVG8oJGxhbmRpbmdDb250YWluZXIpLFxyXG4gICAgICAkKCc8c3BhbiAvPicpLmFkZENsYXNzKCdidXNpbmVzcy1uYW1lJykudGV4dChsb2dvU2V0dGluZ3MuYnVzaW5lc3NOYW1lKS5hcHBlbmRUbygkbGFuZGluZ0NvbnRhaW5lcilcclxuICApO1xyXG5cclxuICAkKCc8aDIgLz4nKS50ZXh0KGBXZWxjb21lIHRvICR7bG9nb1NldHRpbmdzLmRlc2NyaXB0aW9ufWApLmFwcGVuZFRvKCRsYW5kaW5nQ29udGFpbmVyKTtcclxuXHJcbiAgaWYgKHNob3dTaWduSW5CdXR0b24pIHtcclxuICAgICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnc2lnbi1pbi1idXR0b24nKS5hcHBlbmQoJCgnPGRpdiAvPicpLmR4QnV0dG9uKHtcclxuICAgICAgdGV4dDogJ1NpZ24gSW4nLFxyXG4gICAgICB3aWR0aDogY29uZmlnLmlzTGVnYWN5UmVuZGVyID8gdW5kZWZpbmVkIDogJzE0MHB4JyxcclxuICAgICAgdHlwZTogJ2RlZmF1bHQnLFxyXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLmNsZWFyKCk7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBgL0hvbWUvTG9naW4/cmV0dXJuVXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHdpbmRvdy5sb2NhdGlvbi5ocmVmLnRvU3RyaW5nKCkpfWA7XHJcbiAgICAgIH1cclxuICAgIH0pKS5hcHBlbmRUbygkbGFuZGluZ0NvbnRhaW5lcik7XHJcbiAgfVxyXG5cclxuICBpZihwaG90b0dhbGxlcnlTZXR0aW5ncy5lbmFibGVkKSB7XHJcbiAgICBzaG93SW1hZ2VWaWV3ZXIoXHJcbiAgICAgIHBob3RvR2FsbGVyeVNldHRpbmdzLiRjb250YWluZXIgfHwgJGxhbmRpbmdQYWdlLFxyXG4gICAgICBwaG90b0dhbGxlcnlTZXR0aW5ncy5pbWFnZVVybHMgfHwgW10sXHJcbiAgICAgIHBob3RvR2FsbGVyeVNldHRpbmdzLmltZ0NoYW5nZUludGVydmFsU2VjIHx8IDgsXHJcbiAgICAgIHBob3RvR2FsbGVyeVNldHRpbmdzLnRyYW5zaXRpb25UaW1lU2VjIHx8IDJcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZleHBvcnQgZnVuY3Rpb24gY3JlYXRlQWNjZXNzRGVuaWVkVG9SZXBvcnQoJGNvbnRhaW5lcjogSlF1ZXJ5LCBhbGxvd2VkUmVwb3J0Um9sZXM6IHN0cmluZ1tdLCBhbGxvd2VkQ29ubmVjdGlvblJvbGVzOiBzdHJpbmdbXSkge1xyXG4gIGNvbnN0ICRpc3pvbGVhQ29udGFpbmVyID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnYWNjZXNzLWRlbmllZC10by1yZXBvcnQtcGFnZScpLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG4gICQoJzxoMj4nKS5hZGRDbGFzcygnZXJyb3ItdGV4dCcpLnRleHQoJ0FjY2VzcyBkZW5pZWQgdG8gdGhlIHJlcG9ydCcpLmFwcGVuZFRvKCRpc3pvbGVhQ29udGFpbmVyKTtcclxuXHJcbiAgaWYgKGFsbG93ZWRSZXBvcnRSb2xlcyAmJiBhbGxvd2VkUmVwb3J0Um9sZXMubGVuZ3RoKSB7XHJcbiAgICBjb25zdCByZXBvcnRSb2xlcyA9IGFsbG93ZWRSZXBvcnRSb2xlcy5tYXAoKHIpID0+ICQoJzxzcGFuPicpLmFkZENsYXNzKCdyb2xlJykudGV4dChyKSk7XHJcbiAgICAkKCc8cD4nKS50ZXh0KCdSZXF1aXJlZCByb2xlcyBmb3IgcmVwb3J0OiAnKS5hcHBlbmQocmVwb3J0Um9sZXMpLmFwcGVuZFRvKCRpc3pvbGVhQ29udGFpbmVyKTtcclxuICB9XHJcblxyXG4gIGlmIChhbGxvd2VkQ29ubmVjdGlvblJvbGVzICYmIGFsbG93ZWRDb25uZWN0aW9uUm9sZXMubGVuZ3RoKSB7XHJcbiAgICBjb25zdCBjb25uZWN0aW9uc1JvbGVzID0gYWxsb3dlZENvbm5lY3Rpb25Sb2xlcy5tYXAoKHIpID0+ICQoJzxzcGFuPicpLmFkZENsYXNzKCdyb2xlJykudGV4dChyKSk7XHJcbiAgICAkKCc8cD4nKS50ZXh0KCdSZXF1aXJlZCByb2xlcyBmb3IgZGIgY29ubmVjdGlvbjogJykuYXBwZW5kKGNvbm5lY3Rpb25zUm9sZXMpLmFwcGVuZFRvKCRpc3pvbGVhQ29udGFpbmVyKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCBmdWxsU2NyZWVuIGZyb20gJy4uLy4uLy4uL1dpZGdldHMvRnVsbFNjcmVlbic7XHJcbmltcG9ydCB7IGluaXRQb3BvdmVyIH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZXBvcnREZXRhaWxzUG9wb3Zlcic7XHJcbmltcG9ydCB7IElDZG1SZXBvcnRQYXJhbXMsIE1vZGUgfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IHsgQ29udHJvbENvbmZpZ3VyYXRvciwgSUNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zIH0gZnJvbSAnLi9Db250cm9sQ29uZmlndXJhdG9yJztcclxuaW1wb3J0IHsgQ29udHJvbERpc3BsYXksIElDb250cm9sRGlzcGxheU9wdGlvbnMgfSBmcm9tICcuL0NvbnRyb2xEaXNwbGF5JztcclxuaW1wb3J0IHsgRGlzcGxheU1hbmFnZXIsIElEaXNwbGF5TWFuYWdlck9wdGlvbnMgfSBmcm9tICcuL0Rpc3BsYXlNYW5hZ2VyJztcclxuaW1wb3J0IHtJUmVwb3J0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNETVJlcG9ydFBhZ2VPcHRpb25zIHtcclxuICAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcmVwb3J0UGFyYW1zOiBJQ2RtUmVwb3J0UGFyYW1zO1xyXG4gIHVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIGNkbVJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ0RNUmVwb3J0UGFnZSBpbXBsZW1lbnRzIElSZXBvcnRDb21wb25lbnQge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgPSAnU3dpdGNoIHRvIFNldHRpbmdzJztcclxuICBwcml2YXRlIHJlYWRvbmx5IFNXSVRDSF9UT19WSUVXRVJfVEVYVCA9ICdTd2l0Y2ggdG8gRGlzcGxheSc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBTVE9SQUdFX01PREVfS0VZID0gJ0NETV9TVE9SQUdFX01PREVfS0VZJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSAkcm9vdEVsZW1lbnQ6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRQYXJhbXM6IElDZG1SZXBvcnRQYXJhbXM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb250cm9sQ29uZmlndXJhdG9yT3B0aW9uczogSUNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGxheU1hbmFnZXJPcHRpb25zOiBJRGlzcGxheU1hbmFnZXJPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY29udHJvbERpc3BsYXlPcHRpb25zOiBJQ29udHJvbERpc3BsYXlPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIHByaXZhdGUgbXVsdGlWaWV3OiBEZXZFeHByZXNzLnVpLmR4TXVsdGlWaWV3O1xyXG4gIHByaXZhdGUgdGFiUGFuZWw6IERldkV4cHJlc3MudWkuZHhUYWJQYW5lbDtcclxuICBwcml2YXRlIHBvcG92ZXI6IERldkV4cHJlc3MudWkuZHhQb3BvdmVyO1xyXG5cclxuICBwcml2YXRlIG1vZGU6IE1vZGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElDRE1SZXBvcnRQYWdlT3B0aW9ucykge1xyXG4gICAgY29uc3QgYmFzZVVybCA9IGAvJHtvcHRpb25zLmNkbVJlcG9ydENvbnRyb2xsZXJVcmx9LyR7b3B0aW9ucy5yZXBvcnRQYXJhbXMuUmVwb3J0SWR9YDtcclxuICAgIHRoaXMuJHJvb3RFbGVtZW50ID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy5yZXBvcnRQYXJhbXMgPSBvcHRpb25zLnJlcG9ydFBhcmFtcztcclxuICAgIHRoaXMuYWxsb3dFZGl0aW5nID0gb3B0aW9ucy5hbGxvd0VkaXRpbmc7XHJcbiAgICB0aGlzLm1vZGUgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSkgYXMgTW9kZSB8fCBNb2RlLlZpZXdlcjtcclxuXHJcbiAgICB0aGlzLmNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zID0gdGhpcy5nZXRDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucyhiYXNlVXJsLCBvcHRpb25zLmNkbVJlcG9ydENvbnRyb2xsZXJVcmwpO1xyXG4gICAgdGhpcy5kaXNwbGF5TWFuYWdlck9wdGlvbnMgPSB0aGlzLmdldERpc3BsYXlNYW5hZ2VyT3B0aW9ucyhiYXNlVXJsKTtcclxuICAgIHRoaXMuY29udHJvbERpc3BsYXlPcHRpb25zID0gdGhpcy5nZXRDb250cm9sRGlzcGxheU9wdGlvbnMoYmFzZVVybCwgb3B0aW9ucy51c2VyTmFtZSwgb3B0aW9ucy5yZXBvcnRQYXJhbXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoKSB7XHJcbiAgICBpZiAodGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscykge1xyXG4gICAgICB0aGlzLnBvcG92ZXIgPSBpbml0UG9wb3ZlcignLnJlcG9ydC1kZXRhaWxzLWxpbmsnLCB0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5hbGxvd0VkaXRpbmcpIHtcclxuICAgICAgdGhpcy5pbml0U3dpdGNoTW9kZUJ1dHRvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVuZGVyQ29udGVudCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLm11bHRpVmlldz8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy50YWJQYW5lbD8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5wb3BvdmVyPy5kaXNwb3NlKCk7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJDb250ZW50KCkge1xyXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIpIHtcclxuICAgICAgdGhpcy5yZW5kZXJEaXNwbGF5KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbmRlclRhYlBhbmVsKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zKGJhc2VVcmw6IHN0cmluZywgY2RtUmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nKTogSUNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICRjb250YWluZXI6IG51bGwsXHJcbiAgICAgIGlzU3RhbmRhbG9uZVBhZ2U6IGZhbHNlLFxyXG4gICAgICBwYWdlVGl0bGU6ICcnLFxyXG4gICAgICBhdmFpbGFibGVSb2xlc1VybDogYC8ke2NkbVJlcG9ydENvbnRyb2xsZXJVcmx9L0F2YWlsYWJsZVJvbGVzYCxcclxuICAgICAgZ3JvdXBGaWVsZHNVcmw6IGAke2Jhc2VVcmx9L0FsbENvbnRyb2xGaWVsZHNgLFxyXG4gICAgICBsb2FkRGF0YVVybDogYCR7YmFzZVVybH0vQ29uZmlndXJhdG9yRGF0YWAsXHJcbiAgICAgIHVwZGF0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L0NvbmZpZ3VyYXRvckRhdGFgXHJcbiAgICB9IGFzIElDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RGlzcGxheU1hbmFnZXJPcHRpb25zKGJhc2VVcmw6IHN0cmluZyk6IElEaXNwbGF5TWFuYWdlck9wdGlvbnMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJGNvbnRhaW5lcjogbnVsbCxcclxuICAgICAgaXNTdGFuZGFsb25lUGFnZTogZmFsc2UsXHJcbiAgICAgIHBhZ2VUaXRsZTogJycsXHJcbiAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9Db250cm9sRGlzcGxheVVzZXJBc3NpZ25tZW50c2AsXHJcbiAgICAgIHVwZGF0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1VwZGF0ZUNvbnRyb2xEaXNwbGF5VXNlckFzc2lnbm1lbnRzYFxyXG4gICAgfSBhcyBJRGlzcGxheU1hbmFnZXJPcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDb250cm9sRGlzcGxheU9wdGlvbnMoXHJcbiAgICBiYXNlVXJsOiBzdHJpbmcsXHJcbiAgICB1c2VyTmFtZTogc3RyaW5nLFxyXG4gICAgcmVwb3J0UGFyYW1zOiBJQ2RtUmVwb3J0UGFyYW1zXHJcbiAgKTogSUNvbnRyb2xEaXNwbGF5T3B0aW9ucyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAkY29udGFpbmVyOiBudWxsLFxyXG4gICAgICBpc1N0YW5kYWxvbmVQYWdlOiBmYWxzZSxcclxuICAgICAgcGFnZVRpdGxlOiAnJyxcclxuICAgICAgZXhwb3J0RmlsZU5hbWU6IHJlcG9ydFBhcmFtcy5OYW1lLFxyXG4gICAgICB1c2VyQ29uZmlnVXJsOiBgJHtiYXNlVXJsfS9GaWVsZHNQZXJtaXNzaW9uc2AsXHJcbiAgICAgIGNvbnRyb2xMb2dzVXJsOiBgJHtiYXNlVXJsfS9HZXRDb250cm9sTG9nc2AsXHJcbiAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9Db250cm9sRGlzcGxheURhdGFgLFxyXG4gICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9VcGRhdGVDb250cm9sRGlzcGxheURhdGFgLFxyXG4gICAgICB1c2VyTmFtZSxcclxuICAgICAgaW1wb3J0RmlsZU9wdGlvbnM6IHJlcG9ydFBhcmFtcy5BbGxvd0ltcG9ydGluZyA/IHtcclxuICAgICAgICBtb2RlOiByZXBvcnRQYXJhbXMuSW1wb3J0RmlsZU1vZGUsXHJcbiAgICAgICAgY3JlYXRlVGFibGVVcmw6IGAke2Jhc2VVcmx9L2NyZWF0ZS10YWJsZWAsXHJcbiAgICAgICAgYWRkUm93c1VybDogYCR7YmFzZVVybH0vYWRkLXJvd3NgLFxyXG4gICAgICAgIGZpbGVVcGxvYWRVcmw6IGAke2Jhc2VVcmx9L2dldC1jb2x1bW5zYCxcclxuICAgICAgICBwcmVkZWZpbmVkVGFibGU6IHJlcG9ydFBhcmFtcy5GaWxlSW1wb3J0ZXJUYWJsZUluZm9cclxuICAgICAgfSA6IHVuZGVmaW5lZCxcclxuICAgICAgZ3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9uczoge1xyXG4gICAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9HZXRDb250cm9sRmlsdGVyc2AsXHJcbiAgICAgICAgaW5zZXJ0RGF0YVVybDogYCR7YmFzZVVybH0vQWRkQ29udHJvbEZpbHRlcmAsXHJcbiAgICAgICAgdXBkYXRlRGF0YVVybDogYCR7YmFzZVVybH0vVXBkYXRlQ29udHJvbEZpbHRlcmAsXHJcbiAgICAgICAgZGVsZXRlRGF0YVVybDogYCR7YmFzZVVybH0vUmVtb3ZlQ29udHJvbEZpbHRlcmBcclxuICAgICAgfSxcclxuICAgICAgZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnM6IHtcclxuICAgICAgICBsb2FkRGF0YVVybDogYCR7YmFzZVVybH0vR2V0Q29udHJvbFZpZXdzYCxcclxuICAgICAgICBpbnNlcnREYXRhVXJsOiBgJHtiYXNlVXJsfS9BZGRDb250cm9sVmlld2AsXHJcbiAgICAgICAgdXBkYXRlRGF0YVVybDogYCR7YmFzZVVybH0vVXBkYXRlQ29udHJvbFZpZXdgLFxyXG4gICAgICAgIGRlbGV0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1JlbW92ZUNvbnRyb2xWaWV3YFxyXG4gICAgICB9LFxyXG4gICAgICBncmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9uczoge1xyXG4gICAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9HZXRDb250cm9sRGlzcGxheXNgLFxyXG4gICAgICAgIGluc2VydERhdGFVcmw6IGAke2Jhc2VVcmx9L0FkZENvbnRyb2xEaXNwbGF5YCxcclxuICAgICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9VcGRhdGVDb250cm9sRGlzcGxheWAsXHJcbiAgICAgICAgZGVsZXRlRGF0YVVybDogYCR7YmFzZVVybH0vUmVtb3ZlQ29udHJvbERpc3BsYXlgXHJcbiAgICAgIH0sXHJcbiAgICAgIHJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zOiB7XHJcbiAgICAgICAgbG9hZERhdGFVcmw6IGAke2Jhc2VVcmx9L0dldENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzYCxcclxuICAgICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9VcGRhdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc2AsXHJcbiAgICAgIH1cclxuICAgIH0gYXMgSUNvbnRyb2xEaXNwbGF5T3B0aW9ucztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdFN3aXRjaE1vZGVCdXR0b24oKSB7XHJcbiAgICBjb25zdCBidXR0b24gPSAkKCcuc3dpdGNoLW1vZGUtYnRuJykuZHhCdXR0b24oe1xyXG4gICAgICB0ZXh0OiB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gdGhpcy5TV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IHRoaXMuU1dJVENIX1RPX1ZJRVdFUl9URVhULFxyXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tb2RlID0gdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IE1vZGUuRGVzaWduZXIgOiBNb2RlLlZpZXdlcjtcclxuICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSwgdGhpcy5tb2RlKTtcclxuICAgICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IHRoaXMuU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgOiB0aGlzLlNXSVRDSF9UT19WSUVXRVJfVEVYVCk7XHJcblxyXG4gICAgICAgIHRoaXMucmVuZGVyQ29udGVudCgpO1xyXG4gICAgICB9XHJcbiAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1tZCcpLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJEaXNwbGF5KCkge1xyXG4gICAgdGhpcy4kcm9vdEVsZW1lbnQuaHRtbCgnJyk7XHJcbiAgICBjb25zdCAkdmlldyA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbyh0aGlzLiRyb290RWxlbWVudCk7XHJcblxyXG4gICAgdGhpcy5tdWx0aVZpZXcgPSAkdmlldy5keE11bHRpVmlldyh7XHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IENvbnRyb2xEaXNwbGF5KHsgLi4udGhpcy5jb250cm9sRGlzcGxheU9wdGlvbnMsICRjb250YWluZXI6ICQoJzxkaXYgLz4nKSB9KTtcclxuICAgICAgICAgICAgY29tcG9uZW50LnJlbmRlcigpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC4kY29udGFpbmVyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfSkuYWRkQ2xhc3MoJ2NkbS1yZXBvcnRfX2Rpc3BseS1ncmlkJykuZHhNdWx0aVZpZXcoJ2luc3RhbmNlJyk7XHJcbiAgICBmdWxsU2NyZWVuKHRoaXMubXVsdGlWaWV3LCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclRhYlBhbmVsKCkge1xyXG4gICAgdGhpcy4kcm9vdEVsZW1lbnQuaHRtbCgnJyk7XHJcblxyXG4gICAgY29uc3QgJG1haW5UYWJQYW5lbCA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbyh0aGlzLiRyb290RWxlbWVudCk7XHJcblxyXG4gICAgdGhpcy50YWJQYW5lbCA9IHRoaXMuY3JlYXRlVGFiUGFuZWwoJG1haW5UYWJQYW5lbCk7XHJcbiAgICBmdWxsU2NyZWVuKHRoaXMudGFiUGFuZWwsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlVGFiUGFuZWwoZWxlbWVudDogSlF1ZXJ5PEhUTUxFbGVtZW50Pik6IERldkV4cHJlc3MudWkuZHhUYWJQYW5lbCB7XHJcbiAgICByZXR1cm4gZWxlbWVudC5keFRhYlBhbmVsKHtcclxuICAgICAgc3dpcGVFbmFibGVkOiBmYWxzZSxcclxuICAgICAgc2hvd05hdkJ1dHRvbnM6IHRydWUsXHJcbiAgICAgIGZvY3VzU3RhdGVFbmFibGVkOiBmYWxzZSxcclxuICAgICAgYWN0aXZlU3RhdGVFbmFibGVkOiBmYWxzZSxcclxuICAgICAgaG92ZXJTdGF0ZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBvblNlbGVjdGlvbkNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBlLmNvbXBvbmVudC5yZXBhaW50KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGl0bGU6ICdDb25maWd1cmF0b3InLFxyXG4gICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IENvbnRyb2xDb25maWd1cmF0b3IoeyAuLi50aGlzLmNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zLCAkY29udGFpbmVyOiAkKCc8ZGl2IC8+JykgfSk7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudC5yZW5kZXIoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuJGNvbnRhaW5lcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRpdGxlOiAnRGlzcGxheSBNYW5hZ2VyJyxcclxuICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBEaXNwbGF5TWFuYWdlcih7IC4uLnRoaXMuZGlzcGxheU1hbmFnZXJPcHRpb25zLCAkY29udGFpbmVyOiAkKCc8ZGl2IC8+JykgfSk7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudC5yZW5kZXIoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuJGNvbnRhaW5lcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICBdXHJcbiAgICB9KS5hZGRDbGFzcygnY2RtLXJlcG9ydF9fY29uZmlndXJhdGlvbi10YWItcGFuZWwnKVxyXG4gICAgICAuZHhUYWJQYW5lbCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbktleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuU1RPUkFHRV9NT0RFX0tFWSArIHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGZ1bmN0aW9uIGluaXRQb3BvdmVyKGxpbms6IHN0cmluZywgZGV0YWlsczogc3RyaW5nKTogRGV2RXhwcmVzcy51aS5keFBvcG92ZXIge1xyXG4gIGNvbnN0IGh0bWwgPSAkKCc8cC8+JykuaHRtbChkZXRhaWxzKS50ZXh0KCk7XHJcblxyXG4gIGNvbnN0IHBvcG92ZXIgPSAkKCc8ZGl2PicsIHsgY2xhc3M6ICdyZXBvcnQtZGV0YWlscy1wb3BvdmVyJyB9KVxyXG4gICAgLmh0bWwoaHRtbClcclxuICAgIC5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KTtcclxuXHJcbiAgcmV0dXJuICQocG9wb3ZlcikuZHhQb3BvdmVyKHtcclxuICAgIHRhcmdldDogbGluayxcclxuICAgIHNob3dFdmVudDogJ2R4Y2xpY2snLFxyXG4gICAgcG9zaXRpb246ICdib3R0b20nLFxyXG4gICAgd2lkdGg6IDUwMFxyXG4gIH0pLmR4UG9wb3ZlcignaW5zdGFuY2UnKTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IGZ1bGxTY3JlZW4gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9GdWxsU2NyZWVuJztcclxuaW1wb3J0IHtDU1NfQ0xBU1NFU30gZnJvbSAnLi4vLi4vLi4vU3R5bGluZy9JbmRleCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkQWRkaXRpb25hbE9wdGlvbnMge1xyXG4gIGV4cG9ydEZpbGVOYW1lPzogc3RyaW5nO1xyXG4gIHN1bW1hcnlDb2x1bW4/OiBzdHJpbmc7XHJcbiAgc2hvd1N1bW1hcnlJbkNvbHVtbj86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHREYXRhR3JpZChcclxuICAkdGFyZ2V0LCBkYXRhR3JpZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMsIGFkZGl0aW9uYWxPcHRpb25zOiBJR3JpZEFkZGl0aW9uYWxPcHRpb25zID0ge30sXHJcbiAgaGVhZGVyVGV4dD86IHN0cmluZywgaGVhZGVyRGVzY3JpcHRpb24/OiBzdHJpbmcsIGRlZmF1bHRDb2x1bW5XaWR0aCA9IGZhbHNlXHJcbik6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgbGV0IGlzR3JpZEluaXRpYWxpemFlZCA9IGZhbHNlO1xyXG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zID0ge1xyXG4gICAgZXhwb3J0OiB7XHJcbiAgICAgIGVuYWJsZWQ6ICEhYWRkaXRpb25hbE9wdGlvbnMuZXhwb3J0RmlsZU5hbWUsXHJcbiAgICAgIGFsbG93RXhwb3J0U2VsZWN0ZWREYXRhOiB0cnVlXHJcbiAgICB9LFxyXG4gICAgcmVtb3RlT3BlcmF0aW9uczogdHJ1ZSxcclxuXHJcbiAgICBjb2x1bW5BdXRvV2lkdGg6IHRydWUsXHJcbiAgICBzaG93Qm9yZGVyczogdHJ1ZSxcclxuXHJcbiAgICBzZWxlY3Rpb246IHttb2RlOiAnbXVsdGlwbGUnfSxcclxuICAgIGtleWJvYXJkTmF2aWdhdGlvbjoge2VuYWJsZWQ6IGZhbHNlfSxcclxuICAgIHBhZ2luZzoge3BhZ2VTaXplOiA1MH0sXHJcbiAgICBzZWFyY2hQYW5lbDoge3Zpc2libGU6IHRydWV9LFxyXG4gICAgZmlsdGVyUm93OiB7dmlzaWJsZTogdHJ1ZX0sXHJcbiAgICBoZWFkZXJGaWx0ZXI6IHt2aXNpYmxlOiB0cnVlfSxcclxuICAgIHNjcm9sbGluZzoge21vZGU6ICd2aXJ0dWFsJ30sXHJcbiAgICBvbkNvbnRlbnRSZWFkeTogKGUpID0+IHtcclxuICAgICAgdXBkYXRlU3VtbWFyeUNvbHVtbklmUmVxdWlyZWQoZS5jb21wb25lbnQpO1xyXG5cclxuICAgICAgaWYgKGlzR3JpZEluaXRpYWxpemFlZCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaXNHcmlkSW5pdGlhbGl6YWVkID0gdHJ1ZTtcclxuXHJcbiAgICAgIGlmICghZGVmYXVsdENvbHVtbldpZHRoKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlLmNvbXBvbmVudC5jb2x1bW5Db3VudCgpOyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IGRhdGFUeXBlID0gZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKGksICdkYXRhVHlwZScpO1xyXG5cclxuICAgICAgICAgIGlmICghZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcpKSB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgICAgICAgZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcsICcxMDBweCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2RhdGV0aW1lJykge1xyXG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmNvbHVtbk9wdGlvbihpLCAnd2lkdGgnLCAnMTUwcHgnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy90byBmaXggYXV0b3Njcm9sbFxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBzY3JvbGxhYmxlID0gZS5jb21wb25lbnQuZ2V0U2Nyb2xsYWJsZSgpO1xyXG5cclxuICAgICAgICBpZiAoc2Nyb2xsYWJsZSkge1xyXG4gICAgICAgICAgc2Nyb2xsYWJsZS5zY3JvbGxUbyh7dG9wOiAwfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0sXHJcbiAgICBvblRvb2xiYXJQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgIGlmIChoZWFkZXJUZXh0KSB7XHJcbiAgICAgICAgZS50b29sYmFyT3B0aW9ucy5pdGVtcy51bnNoaWZ0KHtcclxuICAgICAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgICAgIHRlbXBsYXRlKCkge1xyXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJFbCA9ICQoJzxoMiAvPicpLmFkZENsYXNzKCdncmlkLWhlYWRlcicpLnRleHQoaGVhZGVyVGV4dCk7XHJcbiAgICAgICAgICAgIGlmIChoZWFkZXJEZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICAgIGhlYWRlckVsLmFwcGVuZCgkKCc8aSAvPicpLmFkZENsYXNzKCdmYXMnKS5hZGRDbGFzcygnZmEtaW5mby1jaXJjbGUnKS5hZGRDbGFzcygncmVwb3J0LWRldGFpbHMtbGluaycpLmF0dHIoJ3RpdGxlJywgJ0NsaWNrIHRvIHNlZSBmdXJ0aGVyIGRldGFpbHMnKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBoZWFkZXJFbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IG9uQ29udGVudFJlYWR5ID0gZGF0YUdyaWRPcHRpb25zLm9uQ29udGVudFJlYWR5XHJcbiAgICA/IChlKSA9PiB7XHJcbiAgICAgIGRlZmF1bHRPcHRpb25zLm9uQ29udGVudFJlYWR5KGUpO1xyXG4gICAgICBkYXRhR3JpZE9wdGlvbnMub25Db250ZW50UmVhZHkoZSk7XHJcbiAgICB9XHJcbiAgICA6IGRlZmF1bHRPcHRpb25zLm9uQ29udGVudFJlYWR5O1xyXG5cclxuICB0cnlTZXRUb3RhbFN1bW1hcnkoZGF0YUdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9ucyk7XHJcblxyXG4gIGNvbnN0IG1lcmdlZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgZGVmYXVsdE9wdGlvbnMsIGRhdGFHcmlkT3B0aW9ucywge29uQ29udGVudFJlYWR5fSk7XHJcblxyXG4gIGNvbnN0IGdyaWQgPSAkdGFyZ2V0LmR4RGF0YUdyaWQobWVyZ2VkT3B0aW9ucykuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgZ3JpZC5lbGVtZW50KCkuYWRkQ2xhc3MoQ1NTX0NMQVNTRVMuZHhEYXRhR3JpZCk7XHJcblxyXG4gIHJldHVybiBncmlkO1xyXG59XHJcblxyXG5mdW5jdGlvbiB0cnlTZXRUb3RhbFN1bW1hcnkoZGF0YUdyaWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9uczogSUdyaWRBZGRpdGlvbmFsT3B0aW9ucykge1xyXG4gIGlmIChkYXRhR3JpZE9wdGlvbnM/LnN1bW1hcnk/LnRvdGFsSXRlbXM/LnNvbWUoKGkpID0+IGkuc3VtbWFyeVR5cGUgPT09ICdjb3VudCcpKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBsZXQgc3VtbWFyeUNvbHVtbiA9IGFkZGl0aW9uYWxPcHRpb25zPy5zdW1tYXJ5Q29sdW1uO1xyXG4gIGlmICghc3VtbWFyeUNvbHVtbiAmJiBkYXRhR3JpZE9wdGlvbnM/LmNvbHVtbnM/Lmxlbmd0aCkge1xyXG4gICAgc3VtbWFyeUNvbHVtbiA9IHR5cGVvZiBkYXRhR3JpZE9wdGlvbnMuY29sdW1uc1swXSA9PT0gJ3N0cmluZydcclxuICAgICAgPyBkYXRhR3JpZE9wdGlvbnMuY29sdW1uc1swXVxyXG4gICAgICA6IGRhdGFHcmlkT3B0aW9ucy5jb2x1bW5zWzBdLmRhdGFGaWVsZDtcclxuICB9XHJcblxyXG4gIGlmIChzdW1tYXJ5Q29sdW1uKSB7XHJcbiAgICBpZiAoIWRhdGFHcmlkT3B0aW9ucy5zdW1tYXJ5KSB7XHJcbiAgICAgIGRhdGFHcmlkT3B0aW9ucy5zdW1tYXJ5ID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFkYXRhR3JpZE9wdGlvbnMuc3VtbWFyeS50b3RhbEl0ZW1zKSB7XHJcbiAgICAgIGRhdGFHcmlkT3B0aW9ucy5zdW1tYXJ5LnRvdGFsSXRlbXMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBkYXRhR3JpZE9wdGlvbnMuc3VtbWFyeS50b3RhbEl0ZW1zLnB1c2goe1xyXG4gICAgICBjb2x1bW46IHN1bW1hcnlDb2x1bW4sXHJcbiAgICAgIHN1bW1hcnlUeXBlOiAnY291bnQnXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZVN1bW1hcnlDb2x1bW5JZlJlcXVpcmVkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gIGNvbnN0IHRvdGFsSXRlbXMgPSBncmlkLm9wdGlvbignc3VtbWFyeS50b3RhbEl0ZW1zJykgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snc3VtbWFyeSddWyd0b3RhbEl0ZW1zJ107XHJcbiAgY29uc3QgY3VycmVudFN1bW1hcnlDb2x1bW4gPSB0b3RhbEl0ZW1zPy5maWx0ZXIoKGkpID0+IGkuc3VtbWFyeVR5cGUgPT09ICdjb3VudCcpWzBdPy5jb2x1bW47XHJcblxyXG4gIGxldCBzdW1tYXJ5Q29sdW1uSW5kZXggPSBjdXJyZW50U3VtbWFyeUNvbHVtbiAmJiBncmlkLmdldFZpc2libGVDb2x1bW5zKCkuZmluZEluZGV4KChlbCkgPT4gZWwuZGF0YUZpZWxkID09PSBjdXJyZW50U3VtbWFyeUNvbHVtbik7XHJcbiAgaWYgKCFzdW1tYXJ5Q29sdW1uSW5kZXgpIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdyaWQub3B0aW9uKCdzZWxlY3Rpb24nKTtcclxuICAgIGNvbnN0IGhhc1NlbGVjdGlvbiA9IHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ubW9kZSAhPT0gJ25vbmUnO1xyXG4gICAgc3VtbWFyeUNvbHVtbkluZGV4ID0gaGFzU2VsZWN0aW9uID8gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpLmZpbmRJbmRleCgoZWwpID0+ICEhZWwuZGF0YUZpZWxkKSA6IDA7XHJcbiAgfVxyXG5cclxuICBjb25zdCBuZXdTdW1tYXJ5Q29sdW1uID0gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpW3N1bW1hcnlDb2x1bW5JbmRleF0/LmRhdGFGaWVsZDtcclxuXHJcbiAgaWYgKG5ld1N1bW1hcnlDb2x1bW4gJiYgY3VycmVudFN1bW1hcnlDb2x1bW4gIT09IG5ld1N1bW1hcnlDb2x1bW4pIHtcclxuICAgIGdyaWQub3B0aW9uKCdzdW1tYXJ5Jywge1xyXG4gICAgICB0b3RhbEl0ZW1zOiBbe1xyXG4gICAgICAgIGNvbHVtbjogZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpW3N1bW1hcnlDb2x1bW5JbmRleF0/LmRhdGFGaWVsZCxcclxuICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xyXG4gICAgICB9XVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkKFxyXG4gICR0YXJnZXQsIGRhdGFHcmlkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnM6IElHcmlkQWRkaXRpb25hbE9wdGlvbnMgPSB7fSxcclxuICBoZWFkZXJUZXh0Pzogc3RyaW5nLCBoZWFkZXJEZXNjcmlwdGlvbj86IHN0cmluZywgZGVmYXVsdENvbHVtbldpZHRoID0gZmFsc2UsIHNraXBGdWxsU2NyZWVuID0gZmFsc2VcclxuKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICBjb25zdCBncmlkID0gY3JlYXRlRGVmYXVsdERhdGFHcmlkKCR0YXJnZXQsIGRhdGFHcmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnMsIGhlYWRlclRleHQsIGhlYWRlckRlc2NyaXB0aW9uLCBkZWZhdWx0Q29sdW1uV2lkdGgpO1xyXG5cclxuICBpZiAoIXNraXBGdWxsU2NyZWVuKSB7XHJcbiAgICBmdWxsU2NyZWVuKGdyaWQpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGdyaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIZWFkZXJDZWxsVGVtcGxhdGUodGV4dCwgdGl0bGUpIHtcclxuICByZXR1cm4gJCgnPHNwYW4+JylcclxuICAgIC5hdHRyKCd0aXRsZScsIHRpdGxlKVxyXG4gICAgLnRleHQodGV4dCk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGNyZWF0ZUR4RGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uLy4uL0RhdGEvRHhEYXRhU291cmNlJztcclxuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi9EYXRhL1JlcXVlc3QnO1xyXG5pbXBvcnQgeyBjcmVhdGVGdWxsU2NyZWVuRGF0YUdyaWQsIGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSB9IGZyb20gJy4uL0dyaWQvQ3JlYXRlRGVmYXVsdEdyaWQnO1xyXG5pbXBvcnQgY3JlYXRlRGVmYXVsdEdyaWQgZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkJztcclxuaW1wb3J0IHtJTG9va3VwRHRvfSBmcm9tICcuLi8uLi8uLi9EYXRhL0FwaVJlc3BvbnNlJztcclxuXHJcbi8vIE5PVEU6IGNvbnN0IGRlZmF1bHRTaG93ZWRSb2xlcyA9IFsnUHJvZHVjdGlvbicsICdTYWxlcycsICdGbG9vciddO1xyXG5jb25zdCByb2xlc09yZGVyID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcclxuXHJcbmV4cG9ydCBjb25zdCBlbnVtIERpc3BsYXlUeXBlIHtcclxuICBJY29ucyA9IDEsXHJcbiAgUHJlZGVmaW5lZFZhbHVlcyA9IDIsXHJcbiAgUmFiYml0QWN0aW9uID0gM1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElJY29uc0NvbHVtbkVkaXRvckl0ZW0ge1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICBpbWFnZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElQcmVkZWZpbmVkVmFsdWVzRWRpdG9ySXRlbSB7XHJcbiAgdmFsdWU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUmFiYml0QWN0aW9uRWRpdG9yRGF0YSB7XHJcbiAgYWN0aW9uVHlwZTogc3RyaW5nO1xyXG4gIGZpZWxkczogc3RyaW5nW107XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIElEaXNwbGF5VHlwZVNldHRpbmdzID0gSURpc3BsYXlJY29uc1R5cGVTZXR0aW5ncyB8IElEaXNwbGF5SVByZWRlZmluZWRWYWx1ZXNUeXBlU2V0dGluZ3MgfCBJRGlzcGxheUlSYWJiaXRBY3Rpb25UeXBlU2V0dGluZ3M7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEaXNwbGF5SWNvbnNUeXBlU2V0dGluZ3Mge1xyXG4gIHR5cGU6IERpc3BsYXlUeXBlLkljb25zO1xyXG4gIGRhdGE6IElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGlzcGxheUlQcmVkZWZpbmVkVmFsdWVzVHlwZVNldHRpbmdzIHtcclxuICB0eXBlOiBEaXNwbGF5VHlwZS5QcmVkZWZpbmVkVmFsdWVzO1xyXG4gIGRhdGE6IElQcmVkZWZpbmVkVmFsdWVzRWRpdG9ySXRlbVtdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEaXNwbGF5SVJhYmJpdEFjdGlvblR5cGVTZXR0aW5ncyB7XHJcbiAgdHlwZTogRGlzcGxheVR5cGUuUmFiYml0QWN0aW9uO1xyXG4gIGRhdGE6IElSYWJiaXRBY3Rpb25FZGl0b3JEYXRhO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XHJcbiAgcGFnZVRpdGxlOiBzdHJpbmc7XHJcbiAgYXZhaWxhYmxlUm9sZXNVcmw6IHN0cmluZztcclxuICBncm91cEZpZWxkc1VybDogc3RyaW5nO1xyXG4gIGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSVJhYmJpdEFjdGlvbkVkaXRvckluaXREYXRhIHtcclxuICBmaWVsZHM6IElMb29rdXBEdG88c3RyaW5nPltdO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ29udHJvbENvbmZpZ3VyYXRvciB7XHJcbiAgcHVibGljIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwYWdlVGl0bGU6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGF2YWlsYWJsZVJvbGVzVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncm91cEZpZWxkc1VybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwbGF5VHlwZXM6IGFueVtdID0gW1xyXG4gICAgeyBrZXk6IERpc3BsYXlUeXBlLkljb25zLCB2YWx1ZTogJ0ljb25zJyB9LFxyXG4gICAgeyBrZXk6IERpc3BsYXlUeXBlLlByZWRlZmluZWRWYWx1ZXMsIHZhbHVlOiAnUHJlZGVmaW5lZFZhbHVlcycgfSxcclxuICAgIHsga2V5OiBEaXNwbGF5VHlwZS5SYWJiaXRBY3Rpb24sIHZhbHVlOiAnUmFiYml0QWN0aW9uJyB9XHJcbiAgXTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGVkaXRvcnMgPSB7XHJcbiAgICBbRGlzcGxheVR5cGUuSWNvbnNdOiBJY29uc0NvbHVtbkVkaXRvcixcclxuICAgIFtEaXNwbGF5VHlwZS5QcmVkZWZpbmVkVmFsdWVzXTogUHJlZGVmaW5lZFZhbHVlc0NvbHVtbkVkaXRvcixcclxuICAgIFtEaXNwbGF5VHlwZS5SYWJiaXRBY3Rpb25dOiBSYWJiaXRBY3Rpb25Db2x1bW5FZGl0b3IsXHJcbiAgfTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGVkaXRvcnNJbml0RGF0YSA6IHtbaWQ6IG51bWJlcl0gOiBvYmplY3Q7fSA9IHt9O1xyXG4gIHByaXZhdGUgcm9sZXM6IHN0cmluZ1tdID0gW107XHJcbiAgcHJpdmF0ZSBmaWVsZHM6IElMb29rdXBEdG88c3RyaW5nPltdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucykge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy5pc1N0YW5kYWxvbmVQYWdlID0gb3B0aW9ucy5pc1N0YW5kYWxvbmVQYWdlO1xyXG4gICAgdGhpcy5hdmFpbGFibGVSb2xlc1VybCA9IG9wdGlvbnMuYXZhaWxhYmxlUm9sZXNVcmw7XHJcbiAgICB0aGlzLmdyb3VwRmllbGRzVXJsID0gb3B0aW9ucy5ncm91cEZpZWxkc1VybDtcclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gICAgdGhpcy5wYWdlVGl0bGUgPSBvcHRpb25zLnBhZ2VUaXRsZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIuYWRkQ2xhc3MoJ2Fwcy1ncmlkJyk7XHJcblxyXG4gICAgUHJvbWlzZS5hbGwoW1xyXG4gICAgICB0aGlzLmdldEF2YWlsYWJsZVJvbGVzKCksXHJcbiAgICAgIHRoaXMuZ2V0QXZhaWxhYmxlRmllbGRzKClcclxuICAgIF0pLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICB0aGlzLnJvbGVzID0gcmVzdWx0WzBdO1xyXG4gICAgICB0aGlzLmZpZWxkcyA9IHJlc3VsdFsxXTtcclxuICAgICAgdGhpcy5lZGl0b3JzSW5pdERhdGFbRGlzcGxheVR5cGUuUmFiYml0QWN0aW9uXSA9IHsgZmllbGRzOiB0aGlzLmZpZWxkcyB9O1xyXG4gICAgICB0aGlzLmNyZWF0ZU1haW5HcmlkKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0QXZhaWxhYmxlUm9sZXMoKSB7XHJcbiAgICByZXR1cm4gc2VuZFJlcXVlc3Q8QXJyYXk8eyBOYW1lOiBzdHJpbmcgfT4+KHRoaXMuYXZhaWxhYmxlUm9sZXNVcmwpXHJcbiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5tYXAoKHIpID0+IHIuTmFtZSkuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGFPcmRlciA9IHJvbGVzT3JkZXIuZ2V0KGEpIHx8IDk5OTk7XHJcbiAgICAgICAgY29uc3QgYk9yZGVyID0gcm9sZXNPcmRlci5nZXQoYikgfHwgOTk5OTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGFPcmRlciAtIGJPcmRlcjtcclxuICAgICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRBdmFpbGFibGVGaWVsZHMoKTogUHJvbWlzZTxJTG9va3VwRHRvPHN0cmluZz5bXT4ge1xyXG4gICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHRoaXMuZ3JvdXBGaWVsZHNVcmwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREaXNwbGF5VHlwZUVkaXRvcigkY29udGFpbmVyLCB0eXBlLCBkYXRhKSB7XHJcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvcnNbdHlwZV07XHJcbiAgICBjb25zdCBpbml0RGF0YSA9IHRoaXMuZWRpdG9yc0luaXREYXRhW3R5cGVdO1xyXG5cclxuICAgIHJldHVybiBlZGl0b3JcclxuICAgICAgPyBuZXcgZWRpdG9yKCRjb250YWluZXIsIGRhdGEsIGluaXREYXRhKVxyXG4gICAgICA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU1haW5HcmlkKCkge1xyXG4gICAgbGV0IGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuXHJcbiAgICBjb25zdCBncmlkT3B0aW9ucyA9IHtcclxuICAgICAgZGF0YVNvdXJjZTogdGhpcy5jcmVhdGVNYWluR3JpZERhdGFTb3VyY2UoKSxcclxuICAgICAgY29sdW1uQ2hvb3Nlcjoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgYWxsb3dTZWFyY2g6IHRydWUsXHJcbiAgICAgICAgbW9kZTogJ3NlbGVjdCdcclxuICAgICAgfSxcclxuICAgICAgaGVpZ2h0OiAnMTAwJScsXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBtb2RlOiAnY2VsbCcsXHJcbiAgICAgICAgYWxsb3dVcGRhdGluZzogdHJ1ZSxcclxuICAgICAgICByZWZyZXNoTW9kZTogJ3JlcGFpbnQnXHJcbiAgICAgIH0sXHJcbiAgICAgIHJlcGFpbnRDaGFuZ2VzT25seTogdHJ1ZSxcclxuICAgICAgcmVtb3RlT3BlcmF0aW9uczoge1xyXG4gICAgICAgIHN1bW1hcnk6IHRydWUsXHJcbiAgICAgICAgcGFnaW5nOiB0cnVlLFxyXG4gICAgICAgIGdyb3VwaW5nOiBmYWxzZSxcclxuICAgICAgICBzb3J0aW5nOiBmYWxzZSxcclxuICAgICAgICBmaWx0ZXJpbmc6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIGdyb3VwaW5nOiB7XHJcbiAgICAgICAgYWxsb3dDb2xsYXBzaW5nOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBncm91cFBhbmVsOiB7XHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgc2VsZWN0aW9uOiB7XHJcbiAgICAgICAgbW9kZTogJ211bHRpcGxlJ1xyXG4gICAgICB9LFxyXG4gICAgICBhbGxvd0NvbHVtblJlb3JkZXJpbmc6IGZhbHNlLFxyXG4gICAgICBjb2x1bW5IaWRpbmdFbmFibGVkOiBmYWxzZSxcclxuICAgICAgaG92ZXJTdGF0ZUVuYWJsZWQ6IHRydWUsXHJcbiAgICAgIGNvbHVtbkF1dG9XaWR0aDogZmFsc2UsXHJcbiAgICAgIHJvd0FsdGVybmF0aW9uRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgY29sdW1uTWluV2lkdGg6IDgwLFxyXG4gICAgICBvblJvd1VwZGF0aW5nOiAoZSkgPT4ge1xyXG4gICAgICAgIGlmICghZS5uZXdEYXRhIHx8ICFlLm9sZERhdGEpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGUuY29tcG9uZW50LmJlZ2luQ3VzdG9tTG9hZGluZygnVXBkYXRpbmcnKTtcclxuXHJcbiAgICAgICAgY29uc3QgdXBkYXRlZFJvbGVzID0gZS5uZXdEYXRhLlJvbGVzO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRSb2xlcyA9IGUub2xkRGF0YS5Sb2xlcztcclxuXHJcbiAgICAgICAgY29uc3QgYWRkT2xkRGF0YVRvTmV3RGF0YSA9IChmaWVsZE5hbWU6IHN0cmluZywgbmV3RGF0YVNlY3Rpb24gPSBlLm5ld0RhdGEsIG9sZERhdGFTZWN0aW9uID0gZS5vbGREYXRhKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIW5ld0RhdGFTZWN0aW9uLmhhc093blByb3BlcnR5KGZpZWxkTmFtZSkpIHtcclxuICAgICAgICAgICAgbmV3RGF0YVNlY3Rpb25bZmllbGROYW1lXSA9IG9sZERhdGFTZWN0aW9uW2ZpZWxkTmFtZV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHVwZGF0ZWRSb2xlcyAmJiBjdXJyZW50Um9sZXMpIHtcclxuICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHVwZGF0ZWRSb2xlcylcclxuICAgICAgICAgICAgLmZvckVhY2goKHJvbGVOYW1lKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZFJvbGUgPSB1cGRhdGVkUm9sZXNbcm9sZU5hbWVdO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRSb2xlID0gY3VycmVudFJvbGVzW3JvbGVOYW1lXTtcclxuXHJcbiAgICAgICAgICAgICAgdXBkYXRlZFJvbGUuSWQgPSBjdXJyZW50Um9sZS5JZDtcclxuXHJcbiAgICAgICAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnQ2FuQmVDcmVhdGVkJywgdXBkYXRlZFJvbGUsIGN1cnJlbnRSb2xlKTtcclxuICAgICAgICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdDYW5CZVJlYWQnLCB1cGRhdGVkUm9sZSwgY3VycmVudFJvbGUpO1xyXG4gICAgICAgICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0NhbkJlVXBkYXRlZCcsIHVwZGF0ZWRSb2xlLCBjdXJyZW50Um9sZSk7XHJcbiAgICAgICAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnQ2FuQmVEZWxldGVkJywgdXBkYXRlZFJvbGUsIGN1cnJlbnRSb2xlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdMYWJlbCcpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ09yZGVyJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnVG9vbFRpcCcpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0lzRGVmYXVsdFZpZXdGaWVsZCcpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0lzS2V5Q29sdW1uJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnR3JvdXBGaWVsZCcpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0Rpc3BsYXlUeXBlJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnRGF0YU93bmVyJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnWExTU2NoZWR1bGVMYWJlbCcpO1xyXG4gICAgICB9LFxyXG4gICAgICBvblJvd1VwZGF0ZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgZS5jb21wb25lbnQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG4gICAgICAgIGUuY29tcG9uZW50LnJlcGFpbnQoKTtcclxuICAgICAgfSxcclxuICAgICAgY29sdW1uczogdGhpcy5wcmVwYXJlTWFpbkdyaWRDb2x1bW5zKFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdOYW1lJyxcclxuICAgICAgICAgIGNhcHRpb246ICdGaWVsZCcsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgZml4ZWQ6IHRydWUsXHJcbiAgICAgICAgICBmaXhlZFBvc2l0aW9uOiAnbGVmdCcsXHJcbiAgICAgICAgICBzb3J0T3JkZXI6ICdhc2MnLFxyXG4gICAgICAgICAgd2lkdGg6IDE4MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0dyb3VwRmllbGQnLFxyXG4gICAgICAgICAgY2FwdGlvbjogJ0dyb3VwJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIHdpZHRoOiAyMDAsXHJcbiAgICAgICAgICBlZGl0Q2VsbFRlbXBsYXRlOiAoXywgY2VsbEluZm8pID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICQoJzxkaXYgLz4nKS5keFNlbGVjdEJveCh7XHJcbiAgICAgICAgICAgICAgdmFsdWU6IGNlbGxJbmZvLnZhbHVlLFxyXG4gICAgICAgICAgICAgIGRhdGFTb3VyY2U6IFsuLi5uZXcgU2V0KGdyaWQuZ2V0RGF0YVNvdXJjZSgpLml0ZW1zKCkuZmlsdGVyKChpKSA9PiBpLkdyb3VwRmllbGQpLm1hcCgoaSkgPT4gaS5Hcm91cEZpZWxkKS5zb3J0KCkpXSxcclxuICAgICAgICAgICAgICBhY2NlcHRDdXN0b21WYWx1ZTogdHJ1ZSxcclxuICAgICAgICAgICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjZWxsSW5mby5zZXRWYWx1ZShlLnZhbHVlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnTGFiZWwnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgd2lkdGg6IDE4MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ1R5cGUnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiBmYWxzZSxcclxuICAgICAgICAgIHdpZHRoOiA4MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0RhdGFPd25lcicsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICB3aWR0aDogODAsXHJcbiAgICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSgnRE8nLCAnRGF0YSBPd25lcicpXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdYTFNTY2hlZHVsZUxhYmVsJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIHdpZHRoOiA4MCxcclxuICAgICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKCdYTFMnLCAnWExTIFNjaGVkdWxlIExhYmVsJylcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0Rpc3BsYXlUeXBlJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIHdpZHRoOiAxNjAsXHJcbiAgICAgICAgICBjdXN0b21pemVUZXh0OiAoY2VsbEluZm8pID0+IHtcclxuICAgICAgICAgICAgaWYgKCFjZWxsSW5mby52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoY2VsbEluZm8udmFsdWUgYXMgc3RyaW5nKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZGlzcGxheVR5cGVzXHJcbiAgICAgICAgICAgICAgLmZpbmQoKGl0ZW0pID0+IGl0ZW0ua2V5ID09PSBzZXR0aW5ncy50eXBlKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZWRpdENlbGxUZW1wbGF0ZTogKF8sIGNlbGxJbmZvKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShjZWxsSW5mby52YWx1ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBzZXR0aW5ncyA/IHNldHRpbmdzLnR5cGUgOiBudWxsO1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gc2V0dGluZ3MgPyBzZXR0aW5ncy5kYXRhIDogW107XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gJCgnPGRpdiAvPicpLmR4RHJvcERvd25Cb3goe1xyXG4gICAgICAgICAgICAgIGRyb3BEb3duT3B0aW9uczogeyB3aWR0aDogNDAwIH0sXHJcbiAgICAgICAgICAgICAgZGF0YVNvdXJjZTogdGhpcy5kaXNwbGF5VHlwZXMsXHJcbiAgICAgICAgICAgICAgdmFsdWVFeHByOiAna2V5JyxcclxuICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICB2YWx1ZTogdHlwZSxcclxuICAgICAgICAgICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjZWxsSW5mby5zZXRWYWx1ZShlLnZhbHVlKTtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgJGNvbnRhaXRlciA9ICQoJzxkaXYgLz4nKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICRzZWxlY3RvciA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbygkY29udGFpdGVyKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICRib2R5ID0gJCgnPGRpdiBzdHlsZT1cIm1hcmdpbjogOHB4IDA7XCIgLz4nKS5hcHBlbmRUbygkY29udGFpdGVyKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICRidXR0b25zID0gJCgnPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IHJpZ2h0O1wiIC8+JykuYXBwZW5kVG8oJGNvbnRhaXRlcik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCAkc2F2ZUJ1dHRvbiA9ICQoJzxkaXYgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDhweDtcIiAvPicpLmFwcGVuZFRvKCRidXR0b25zKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICRjYW5jZWxCdXR0b24gPSAkKCc8ZGl2IHN0eWxlPVwibWFyZ2luLXJpZ2h0OiA4cHg7XCIgLz4nKS5hcHBlbmRUbygkYnV0dG9ucyk7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGVkaXRvciA9IHR5cGVcclxuICAgICAgICAgICAgICAgICAgPyB0aGlzLmdldERpc3BsYXlUeXBlRWRpdG9yKCRib2R5LCB0eXBlLCBkYXRhKVxyXG4gICAgICAgICAgICAgICAgICA6IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGVkaXRvcikge1xyXG4gICAgICAgICAgICAgICAgICAkYm9keS5odG1sKCcnKTtcclxuICAgICAgICAgICAgICAgICAgZWRpdG9yLnJlbmRlcigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICRzZWxlY3Rvci5keFNlbGVjdEJveCh7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1zOiB0aGlzLmRpc3BsYXlUeXBlcyxcclxuICAgICAgICAgICAgICAgICAgdmFsdWU6IHR5cGUsXHJcbiAgICAgICAgICAgICAgICAgIHZhbHVlRXhwcjogJ2tleScsXHJcbiAgICAgICAgICAgICAgICAgIGRpc3BsYXlFeHByOiAndmFsdWUnLFxyXG4gICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IgPSB0aGlzLmdldERpc3BsYXlUeXBlRWRpdG9yKCRib2R5LCBlLnZhbHVlLCBkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICAkYm9keS5odG1sKCcnKTtcclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IucmVuZGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgJHNhdmVCdXR0b24uZHhCdXR0b24oJ2luc3RhbmNlJykub3B0aW9uKCdkaXNhYmxlZCcsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgJHNhdmVCdXR0b24uZHhCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgICB0ZXh0OiAnU2F2ZScsXHJcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcclxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFlZGl0b3IsXHJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlZGl0b3JEYXRhID0gZWRpdG9yLmdldERhdGEoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlZGl0b3JEYXRhID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3U2V0dGluZ3MgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAkc2VsZWN0b3IuZHhTZWxlY3RCb3goJ2luc3RhbmNlJykub3B0aW9uKCd2YWx1ZScpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YTogZWRpdG9yRGF0YVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxJbmZvLnNldFZhbHVlKEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbEluZm8uY29tcG9uZW50LmNsb3NlRWRpdENlbGwoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkuYXBwZW5kVG8oJGJ1dHRvbnMpO1xyXG5cclxuICAgICAgICAgICAgICAgICRjYW5jZWxCdXR0b24uZHhCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgICB0ZXh0OiAnQ2FuY2VsJyxcclxuICAgICAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxJbmZvLmNvbXBvbmVudC5jbG9zZUVkaXRDZWxsKCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pLmFwcGVuZFRvKCRidXR0b25zKTtcclxuXHJcbiAgICAgICAgICAgICAgICAkY29udGFpdGVyLmR4U2Nyb2xsVmlldyh7XHJcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogJzEwMCUnXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJGNvbnRhaXRlcjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnSXNEZWZhdWx0Vmlld0ZpZWxkJyxcclxuICAgICAgICAgIGNhcHRpb246ICdEaXNwbGF5IGluIGRlZmF1bHQgdmlldycsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICB3aWR0aDogMTAwLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnSXNLZXlDb2x1bW4nLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgd2lkdGg6IDE1MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ09yZGVyJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHsgZm9ybWF0OiAnIycgfSxcclxuICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogJ3JhbmdlJyxcclxuICAgICAgICAgICAgICBtaW46IDAsXHJcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ09yZGVyIGNhblxcJ3QgYmUgbmVnYXRpdmUnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgICB3aWR0aDogODAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdXaWR0aCcsXHJcbiAgICAgICAgICBkYXRhVHlwZTogJ251bWJlcicsXHJcbiAgICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSgnV2lkdGgnLCAnV2lkdGggKGluIHBpeGVscyknKSxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHsgZm9ybWF0OiAnIycgfSxcclxuICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogJ3JhbmdlJyxcclxuICAgICAgICAgICAgICBtaW46IDEsXHJcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ1dpZHRoIGNhblxcJ3QgYmUgbGVzcyB0aGVuIDFweCdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgXSxcclxuICAgICAgICAgIHdpZHRoOiA4MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0hpZGluZ09yZGVyJyxcclxuICAgICAgICAgIGRhdGFUeXBlOiAnbnVtYmVyJyxcclxuICAgICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKCdIaWRlJywgJ0hpZGluZyBPcmRlcicpLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgZWRpdG9yT3B0aW9uczogeyBmb3JtYXQ6ICcjJyB9LFxyXG4gICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiAncmFuZ2UnLFxyXG4gICAgICAgICAgICAgIG1pbjogMSxcclxuICAgICAgICAgICAgICBtZXNzYWdlOiAnSGlkaW5nIG9yZGVyIGNhblxcJ3QgYmUgbGVzcyB0aGVuIDEnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgICB3aWR0aDogNzAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdUb29sVGlwJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIG1pbldpZHRoOiAxODBcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6ICdSb2xlcycsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBhbGxvd0hpZGluZzogZmFsc2UsXHJcbiAgICAgICAgICBzaG93SW5Db2x1bW5DaG9vc2VyOiB0cnVlLFxyXG4gICAgICAgICAgY29sdW1uczogdGhpcy5jcmVhdGVSb2xlc0NvbHVtbnModGhpcy5yb2xlcylcclxuICAgICAgICB9XHJcbiAgICAgIF0pLFxyXG4gICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zO1xyXG5cclxuICAgIGNvbnN0IGFkZGl0aW9uYWxPcHRpb25zID0ge1xyXG4gICAgICBzdW1tYXJ5Q29sdW1uOiAnTmFtZSdcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHRoaXMuaXNTdGFuZGFsb25lUGFnZSkge1xyXG4gICAgICBncmlkID0gY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkKHRoaXMuJGNvbnRhaW5lciwgZ3JpZE9wdGlvbnMsIGFkZGl0aW9uYWxPcHRpb25zLCB0aGlzLnBhZ2VUaXRsZSwgJycsIHRydWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZ3JpZCA9IGNyZWF0ZURlZmF1bHRHcmlkKHRoaXMuJGNvbnRhaW5lciwge1xyXG4gICAgICAgIG9wdGlvbnM6IGdyaWRPcHRpb25zLFxyXG4gICAgICAgIHN1bW1hcnlDb2x1bW46IGFkZGl0aW9uYWxPcHRpb25zLnN1bW1hcnlDb2x1bW4sXHJcbiAgICAgICAgdGl0bGU6IHRoaXMucGFnZVRpdGxlLFxyXG4gICAgICAgIGlzRnVsbFNjcmVlbjogZmFsc2UsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBncmlkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcmVwYXJlTWFpbkdyaWRDb2x1bW5zKGNvbHVtbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbltdKSB7XHJcbiAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICBpZiAoY29sdW1uLmFsbG93SGlkaW5nID09PSB1bmRlZmluZWQgfHwgY29sdW1uLmFsbG93SGlkaW5nID09PSBudWxsKSB7XHJcbiAgICAgICAgY29sdW1uLmFsbG93SGlkaW5nID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjb2x1bW4uc2hvd0luQ29sdW1uQ2hvb3NlciA9PT0gdW5kZWZpbmVkIHx8IGNvbHVtbi5zaG93SW5Db2x1bW5DaG9vc2VyID09PSBudWxsKSB7XHJcbiAgICAgICAgY29sdW1uLnNob3dJbkNvbHVtbkNob29zZXIgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtbnM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVJvbGVzQ29sdW1ucyhyb2xlczogc3RyaW5nW10pOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW5bXSB7XHJcbiAgICByZXR1cm4gcm9sZXNcclxuICAgICAgLm1hcCgocm9sZSkgPT4gKHtcclxuICAgICAgICBuYW1lOiByb2xlLFxyXG4gICAgICAgIGNhcHRpb246IHJvbGUsXHJcbiAgICAgICAgYWxsb3dIaWRpbmc6IHRydWUsXHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICBzaG93SW5Db2x1bW5DaG9vc2VyOiB0cnVlLFxyXG4gICAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICAgIHRoaXMuY3JlYXRlUm9sZXNQZXJtaXNzaW9uQ29sdW1uKHJvbGUsICdDYW5CZVJlYWQnLCB7XHJcbiAgICAgICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKCdSZWFkJywgJ1JlYWQnKVxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZVJvbGVzUGVybWlzc2lvbkNvbHVtbihyb2xlLCAnQ2FuQmVVcGRhdGVkJywge1xyXG4gICAgICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSgnRWRpdCcsICdFZGl0JylcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgXVxyXG4gICAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVJvbGVzUGVybWlzc2lvbkNvbHVtbihcclxuICAgIHJvbGU6IHN0cmluZywgcGVybWlzc2lvbk5hbWU6IHN0cmluZywgYmFzZUNvbHVtbk9wdGlvbnM/OiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW5cclxuICApOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4uYmFzZUNvbHVtbk9wdGlvbnMsXHJcbiAgICAgIG5hbWU6IGAke3JvbGV9XyR7cGVybWlzc2lvbk5hbWV9YCxcclxuICAgICAgZGF0YUZpZWxkOiBgUm9sZXMuJHtyb2xlfS4ke3Blcm1pc3Npb25OYW1lfWAsXHJcbiAgICAgIGFsbG93SGlkaW5nOiBmYWxzZSxcclxuICAgICAgc2hvd0luQ29sdW1uQ2hvb3NlcjogZmFsc2UsXHJcbiAgICAgIGFsbG93SGVhZGVyRmlsdGVyaW5nOiBmYWxzZSxcclxuICAgICAgYWxsb3dGaWx0ZXJpbmc6IGZhbHNlLFxyXG4gICAgICBtaW5XaWR0aDogNjBcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU1haW5HcmlkRGF0YVNvdXJjZSgpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydkYXRhU291cmNlJ10ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc3RvcmU6IGNyZWF0ZUR4RGF0YVNvdXJjZSh7XHJcbiAgICAgICAgbG9hZFVybDogdGhpcy5sb2FkRGF0YVVybCxcclxuICAgICAgICB1cGRhdGVVcmw6IHRoaXMudXBkYXRlRGF0YVVybCxcclxuICAgICAgICBrZXk6ICdOYW1lJyxcclxuICAgICAgfSlcclxuICAgIH07XHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBJY29uc0NvbHVtbkVkaXRvciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhOiBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW107XHJcbiAgcHJpdmF0ZSBncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCRjb250YWluZXI6IEpRdWVyeSwgZGF0YTogSUljb25zQ29sdW1uRWRpdG9ySXRlbVtdKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSAkY29udGFpbmVyO1xyXG4gICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBjb25zdCBvcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuUHJvcGVydGllcyA9IHtcclxuICAgICAgZGF0YVNvdXJjZTogdGhpcy5kYXRhLFxyXG4gICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgbW9kZTogJ3JvdycsXHJcbiAgICAgICAgYWxsb3dBZGRpbmc6IHRydWUsXHJcbiAgICAgICAgYWxsb3dEZWxldGluZzogdHJ1ZSxcclxuICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgIHVzZUljb25zOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIGhlYWRlckZpbHRlcjogeyB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICBncm91cGluZzogeyBjb250ZXh0TWVudUVuYWJsZWQ6IGZhbHNlIH0sXHJcbiAgICAgIGdyb3VwUGFuZWw6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgc2VhcmNoUGFuZWw6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgZmlsdGVyUm93OiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxyXG4gICAgICBzZWxlY3Rpb246IHtcclxuICAgICAgICBtb2RlOiAnbm9uZSdcclxuICAgICAgfSxcclxuICAgICAgY29sdW1uczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ3ZhbHVlJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ3RpdGxlJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ2ltYWdlJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIGNlbGxUZW1wbGF0ZTogKGNvbnRhaW5lciwgY2VsbERhdGEpID0+IHtcclxuICAgICAgICAgICAgJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgIC5jc3MoeyAndGV4dC1hbGlnbic6ICdjZW50ZXInIH0pXHJcbiAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8aW1nPicsIHsgc3JjOiBjZWxsRGF0YS5kYXRhLmltYWdlIH0pKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmRUbyhjb250YWluZXIpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVkaXRDZWxsVGVtcGxhdGU6IChfLCBjZWxsSW5mbykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpbWcgPSBjZWxsSW5mby52YWx1ZSB8fCAnJztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0ICRjb250YWluZXIgPSAkKCc8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcIiAvPicpO1xyXG4gICAgICAgICAgICBjb25zdCAkaW1nID0gJChgPGltZyBzcmM9XCIke2ltZ31cIiAvPmApO1xyXG4gICAgICAgICAgICBjb25zdCAkbGluayA9ICQoJzxhIGNsYXNzPVwiZHgtbGluayBkeC1pY29uLXVwbG9hZFwiIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyByaWdodDogOHB4OyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtc2l6ZTogMThweDtcIiAvPicpO1xyXG4gICAgICAgICAgICBjb25zdCAkZmlsZUlucHV0ID0gJCgnPGlucHV0IHR5cGU9XCJmaWxlXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCIgLz4nKTtcclxuXHJcbiAgICAgICAgICAgICRsaW5rLm9uKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgICAkZmlsZUlucHV0LmNsaWNrKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgJGZpbGVJbnB1dC5vbignY2hhbmdlJywgKGUpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoKGUudGFyZ2V0IGFzIGFueSkuZmlsZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgICAgICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgJGltZy5hdHRyKCdzcmMnLCAocmVhZGVyLnJlc3VsdCBhcyBzdHJpbmcpKTtcclxuICAgICAgICAgICAgICAgICAgY2VsbEluZm8uc2V0VmFsdWUoKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKSk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSAoZS50YXJnZXQgYXMgYW55KS5maWxlc1swXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZmlsZSkge1xyXG4gICAgICAgICAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICRpbWcuYXR0cignc3JjJywgJycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAkaW1nLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG4gICAgICAgICAgICAkbGluay5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuICAgICAgICAgICAgJGZpbGVJbnB1dC5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiAkY29udGFpbmVyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgIHR5cGU6ICdidXR0b25zJyxcclxuICAgICAgICAgIHdpZHRoOiAxMDAsXHJcbiAgICAgICAgICBidXR0b25zOiBbXHJcbiAgICAgICAgICAgICdlZGl0JyxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGhpbnQ6ICdEZWxldGUnLFxyXG4gICAgICAgICAgICAgIGljb246ICd0cmFzaCcsXHJcbiAgICAgICAgICAgICAgb25DbGljazogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvd3MgPSB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgKHJvd3MgYXMgYW55W10pLnNwbGljZShlLnJvdy5yb3dJbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgcm93cyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0ICRncmlkID0gJCgnPGRpdiAvPicpLmFwcGVuZFRvKHRoaXMuJGNvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5ncmlkID0gY3JlYXRlRGVmYXVsdEdyaWQoXHJcbiAgICAgICRncmlkLFxyXG4gICAgICB7XHJcbiAgICAgICAgb3B0aW9ucyxcclxuICAgICAgICBpc0Z1bGxTY3JlZW46IGZhbHNlXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGF0YSgpOiBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnKSBhcyBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW107XHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBQcmVkZWZpbmVkVmFsdWVzQ29sdW1uRWRpdG9yIHtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRhdGE6IElQcmVkZWZpbmVkVmFsdWVzRWRpdG9ySXRlbVtdO1xyXG4gIHByaXZhdGUgZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG5cclxuICBjb25zdHJ1Y3RvcigkY29udGFpbmVyOiBKUXVlcnksIGRhdGE6IElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXSkge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgY29uc3Qgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXMgPSB7XHJcbiAgICAgIGRhdGFTb3VyY2U6IHRoaXMuZGF0YSxcclxuICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgIG1vZGU6ICdyb3cnLFxyXG4gICAgICAgIGFsbG93QWRkaW5nOiB0cnVlLFxyXG4gICAgICAgIGFsbG93RGVsZXRpbmc6IHRydWUsXHJcbiAgICAgICAgYWxsb3dVcGRhdGluZzogdHJ1ZSxcclxuICAgICAgICB1c2VJY29uczogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBoZWFkZXJGaWx0ZXI6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgZ3JvdXBpbmc6IHsgY29udGV4dE1lbnVFbmFibGVkOiBmYWxzZSB9LFxyXG4gICAgICBncm91cFBhbmVsOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIHNlYXJjaFBhbmVsOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIGZpbHRlclJvdzogeyB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICByZW1vdGVPcGVyYXRpb25zOiBmYWxzZSxcclxuICAgICAgc2VsZWN0aW9uOiB7XHJcbiAgICAgICAgbW9kZTogJ25vbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICd2YWx1ZScsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgdHlwZTogJ2J1dHRvbnMnLFxyXG4gICAgICAgICAgd2lkdGg6IDEwMCxcclxuICAgICAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICAgICAgJ2VkaXQnLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgaGludDogJ0RlbGV0ZScsXHJcbiAgICAgICAgICAgICAgaWNvbjogJ3RyYXNoJyxcclxuICAgICAgICAgICAgICBvbkNsaWNrOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93cyA9IHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAocm93cyBhcyBhbnlbXSkuc3BsaWNlKGUucm93LnJvd0luZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCByb3dzKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgJGdyaWQgPSAkKCc8ZGl2IC8+JykuYXBwZW5kVG8odGhpcy4kY29udGFpbmVyKTtcclxuXHJcbiAgICB0aGlzLmdyaWQgPSBjcmVhdGVEZWZhdWx0R3JpZCgkZ3JpZCwge1xyXG4gICAgICBvcHRpb25zLFxyXG4gICAgICBpc0Z1bGxTY3JlZW46IGZhbHNlXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREYXRhKCk6IElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmlkLm9wdGlvbignZGF0YVNvdXJjZScpIGFzIElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXTtcclxuICB9XHJcbn1cclxuXHJcbmNsYXNzIFJhYmJpdEFjdGlvbkNvbHVtbkVkaXRvciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhOiBJUmFiYml0QWN0aW9uRWRpdG9yRGF0YTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGluaXREYXRhOiBJUmFiYml0QWN0aW9uRWRpdG9ySW5pdERhdGE7XHJcbiAgcHJpdmF0ZSBmb3JtOiBEZXZFeHByZXNzLnVpLmR4Rm9ybTtcclxuXHJcbiAgY29uc3RydWN0b3IoJGNvbnRhaW5lcjogSlF1ZXJ5LCBkYXRhOiBJUmFiYml0QWN0aW9uRWRpdG9yRGF0YSwgaW5pdERhdGE6IElSYWJiaXRBY3Rpb25FZGl0b3JJbml0RGF0YSkge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICB0aGlzLmluaXREYXRhID0gaW5pdERhdGE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgdGhpcy5mb3JtID0gJCgnPGRpdiAvPicpLmR4Rm9ybSh7XHJcbiAgICAgIGZvcm1EYXRhOiB0aGlzLmRhdGEsXHJcbiAgICAgIGxhYmVsTG9jYXRpb246ICd0b3AnLFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ2FjdGlvblR5cGUnLFxyXG4gICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbe1xyXG4gICAgICAgICAgICB0eXBlOiAncmVxdWlyZWQnXHJcbiAgICAgICAgICB9XVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnZmllbGRzJyxcclxuICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW3tcclxuICAgICAgICAgICAgdHlwZTogJ3JlcXVpcmVkJ1xyXG4gICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgdmFsaWRhdGlvbkNhbGxiYWNrOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiAoZS52YWx1ZSBhcyBhbnkpLmxlbmd0aCA+IDA7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdSZXF1aXJlZCdcclxuICAgICAgICAgIH1dLFxyXG4gICAgICAgICAgZWRpdG9yVHlwZTogJ2R4VGFnQm94JyxcclxuICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgZGF0YVNvdXJjZTogdGhpcy5pbml0RGF0YS5maWVsZHMsXHJcbiAgICAgICAgICAgIGRpc3BsYXlFeHByOiAnVGV4dCcsXHJcbiAgICAgICAgICAgIHZhbHVlRXhwcjogJ1ZhbHVlJyxcclxuICAgICAgICAgICAgc2VhcmNoRW5hYmxlZDogdHJ1ZVxyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VGFnQm94T3B0aW9uc1xyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfSkuYXBwZW5kVG8odGhpcy4kY29udGFpbmVyKS5keEZvcm0oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGF0YSgpOiBJUmFiYml0QWN0aW9uRWRpdG9yRGF0YSB7XHJcbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdGhpcy5mb3JtLnZhbGlkYXRlKCk7XHJcblxyXG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFjdGlvblR5cGUgPSB0aGlzLmZvcm0uZ2V0RWRpdG9yKCdhY3Rpb25UeXBlJykub3B0aW9uKCd2YWx1ZScpIGFzIHN0cmluZztcclxuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZm9ybS5nZXRFZGl0b3IoJ2ZpZWxkcycpLm9wdGlvbigndmFsdWUnKSBhcyBzdHJpbmdbXTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICBmaWVsZHNcclxuICAgIH07XHJcbiAgfVxyXG59XHJcblxyXG4oRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIGFzIGFueSkucmVnaXN0ZXJNb2R1bGUoJ2NvbHVtbkNob29zZXJTb3J0aW5nJywge1xyXG4gIGV4dGVuZGVyczoge1xyXG4gICAgY29udHJvbGxlcnM6IHtcclxuICAgICAgY29sdW1uczoge1xyXG4gICAgICAgIGdldENob29zZXJDb2x1bW5zKGxvYWRBbGxDb2x1bW5zKSB7XHJcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSAodGhpcyBhcyBhbnkpLmNhbGxCYXNlKGxvYWRBbGxDb2x1bW5zKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LnNvcnQoKGNvbHVtbjEsIGNvbHVtbjIpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2FwdGlvbjEgPSBjb2x1bW4xPy5jYXB0aW9uIHx8ICcnO1xyXG4gICAgICAgICAgICBjb25zdCBjYXB0aW9uMiA9IGNvbHVtbjI/LmNhcHRpb24gfHwgJyc7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gY2FwdGlvbjEubG9jYWxlQ29tcGFyZShjYXB0aW9uMik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn0pO1xyXG4iLCAiXHVGRUZGY29uc3QgYXJlQXJndW1lbnRzU2hhbGxvd2x5RXF1YWwgPSAocHJldjogYW55W10gfCBudWxsLCBuZXh0OiBhbnlbXSB8IG51bGwpID0+IHtcclxuICBpZiAocHJldiA9PT0gbnVsbCB8fCBuZXh0ID09PSBudWxsIHx8IHByZXYubGVuZ3RoICE9PSBuZXh0Lmxlbmd0aCkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICBpZiAocHJldltpXSAhPT0gbmV4dFtpXSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdHJ1ZTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBtZW1vaXplID0gPFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueT4oZnVuYzogVCk6IFQgPT4ge1xyXG4gIGxldCBsYXN0QXJnczogYW55W10gfCBudWxsID0gbnVsbDtcclxuICBsZXQgbGFzdFJlc3VsdDogdW5rbm93biB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG9ubHktYXJyb3ctZnVuY3Rpb25zXHJcbiAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgIGlmICghYXJlQXJndW1lbnRzU2hhbGxvd2x5RXF1YWwobGFzdEFyZ3MsIGFyZ3MpKSB7XHJcbiAgICAgIGxhc3RSZXN1bHQgPSBmdW5jKC4uLmFyZ3MgYXMgYW55KTtcclxuICAgIH1cclxuXHJcbiAgICBsYXN0QXJncyA9IGFyZ3M7XHJcblxyXG4gICAgcmV0dXJuIGxhc3RSZXN1bHQ7XHJcbiAgfSBhcyBUO1xyXG59O1xyXG4iLCAiXHVGRUZGLy8gdHNsaW50OmRpc2FibGU6IG1lbWJlci1vcmRlcmluZ1xyXG5pbXBvcnQgeyBJR3JpZFN0YXRlIH0gZnJvbSAnLi9HcmlkU3RhdGUnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IG1lbW9pemUgfSBmcm9tICcuLi8uLi8uLi9VdGlscy9NZW1vaXplJztcclxuaW1wb3J0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uIGZyb20gJy4uLy4uLy4uL0RhdGEvTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXlWaWV3IHtcclxuICByZWFkb25seSBpZDogbnVtYmVyO1xyXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcclxuICByZWFkb25seSBncmlkU3RhdGU6IElHcmlkU3RhdGUgfCBudWxsO1xyXG4gIGlzR2xvYmFsOiBib29sZWFuO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5Vmlld0R0byB7XHJcbiAgSWQ6IG51bWJlcjtcclxuICBOYW1lOiBzdHJpbmc7XHJcbiAgR3JpZFN0YXRlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xyXG4gIElzR2xvYmFsOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkVmlld3NNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgLy8gcmVhZG9ubHkgZGVmYXVsdE9wZW5lZFZpZXdJZDogbnVtYmVyO1xyXG4gIGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgaW5zZXJ0RGF0YVVybDogc3RyaW5nO1xyXG4gIHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBkZWxldGVEYXRhVXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbnR5cGUgQ29udHJvbERpc3BsYXlWaWV3VXBkYXRlcyA9IFBhcnRpYWw8UGljazxJQ29udHJvbERpc3BsYXlWaWV3LCAnbmFtZScgfCAnZ3JpZFN0YXRlJyB8ICdpc0dsb2JhbCc+PjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkVmlld3NNYW5hZ2VyIHtcclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGRlZmF1bHRDb250cm9sRGlzcGxheVZpZXc6IElDb250cm9sRGlzcGxheVZpZXcgPSB7XHJcbiAgICBpZDogMCxcclxuICAgIG5hbWU6ICdEZWZhdWx0JyxcclxuICAgIGdyaWRTdGF0ZTogbnVsbCxcclxuICAgIGlzR2xvYmFsOiBmYWxzZVxyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGRlZmF1bHRWaWV3cyA9IFtHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXddO1xyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcclxuICBwcml2YXRlIF9jdXJyZW50Vmlld0lkOiBudW1iZXIgPSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQ7XHJcbiAgcHJpdmF0ZSB2aWV3czogSUNvbnRyb2xEaXNwbGF5Vmlld1tdID0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Vmlld3M7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zZXJ0RGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGdldFZpZXdCeUlkSW50ZXJuYWwgPSAodmlld0lkOiBudW1iZXIpID0+IHtcclxuICAgIHJldHVybiB0aGlzLnZpZXdzICYmIHRoaXMudmlld3MuZmluZCgodikgPT4gdi5pZCA9PT0gdmlld0lkKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBnZXRWaWV3QnlJZCA9IG1lbW9pemUodGhpcy5nZXRWaWV3QnlJZEludGVybmFsKTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zKSB7XHJcbiAgICB0aGlzLmxvYWREYXRhVXJsID0gb3B0aW9ucy5sb2FkRGF0YVVybDtcclxuICAgIHRoaXMuaW5zZXJ0RGF0YVVybCA9IG9wdGlvbnMuaW5zZXJ0RGF0YVVybDtcclxuICAgIHRoaXMudXBkYXRlRGF0YVVybCA9IG9wdGlvbnMudXBkYXRlRGF0YVVybDtcclxuICAgIHRoaXMuZGVsZXRlRGF0YVVybCA9IG9wdGlvbnMuZGVsZXRlRGF0YVVybDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudFZpZXcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRWaWV3QnlJZCh0aGlzLl9jdXJyZW50Vmlld0lkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudFZpZXdJZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50Vmlld0lkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBjdXJyZW50Vmlld0lkKGlkOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2N1cnJlbnRWaWV3SWQgPSBpZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRWaWV3cygpOiBQcm9taXNlPElDb250cm9sRGlzcGxheVZpZXdbXT4ge1xyXG4gICAgaWYgKHRoaXMudmlld3MgPT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdFZpZXdzKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMubG9hZFZpZXdzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMudmlld3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQ3VycmVudFZpZXcodmlld1VwZGF0ZXM6IENvbnRyb2xEaXNwbGF5Vmlld1VwZGF0ZXMpIHtcclxuICAgIHJldHVybiB0aGlzLnVwZGF0ZVZpZXcodGhpcy5jdXJyZW50Vmlldy5pZCwgdmlld1VwZGF0ZXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNyZWF0ZU5ld1ZpZXcodmlld05hbWU6IHN0cmluZywgZ3JpZFN0YXRlOiBJR3JpZFN0YXRlLCBpc0dsb2JhbCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5Vmlldz4ge1xyXG4gICAgbGV0IG5ld1ZpZXdEdG86IElDb250cm9sRGlzcGxheVZpZXdEdG8gPSB0aGlzLm1hcFZpZXdNb2RlbFRvRHRvKHtcclxuICAgICAgaWQ6IC0xLFxyXG4gICAgICBuYW1lOiB2aWV3TmFtZSxcclxuICAgICAgZ3JpZFN0YXRlLFxyXG4gICAgICBpc0dsb2JhbFxyXG4gICAgfSk7XHJcblxyXG4gICAgbmV3Vmlld0R0byA9IGF3YWl0IHNlbmRSZXF1ZXN0PElDb250cm9sRGlzcGxheVZpZXdEdG8+KHRoaXMuaW5zZXJ0RGF0YVVybCwgJ1BPU1QnLCBuZXdWaWV3RHRvKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdzKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubWFwVmlld0R0b1RvTW9kZWwobmV3Vmlld0R0byk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgdXBkYXRlVmlldyh2aWV3SWQ6IG51bWJlciwgdXBkYXRlczogQ29udHJvbERpc3BsYXlWaWV3VXBkYXRlcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKHZpZXdJZCA9PT0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3QnlJZCh2aWV3SWQpO1xyXG4gICAgaWYgKCF2aWV3KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB1cGRhdGVkVmlldzogSUNvbnRyb2xEaXNwbGF5VmlldyA9IHtcclxuICAgICAgLi4udmlldyxcclxuICAgICAgLi4udXBkYXRlc1xyXG4gICAgfTtcclxuICAgIGxldCB1cGRhdGVkVmlld0R0bzogSUNvbnRyb2xEaXNwbGF5Vmlld0R0byA9IHRoaXMubWFwVmlld01vZGVsVG9EdG8odXBkYXRlZFZpZXcpO1xyXG5cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgICB1cGRhdGVkVmlld0R0byA9IGF3YWl0IHNlbmRSZXF1ZXN0PElDb250cm9sRGlzcGxheVZpZXdEdG8+KHRoaXMudXBkYXRlRGF0YVVybCwgJ1BVVCcsIHVwZGF0ZWRWaWV3RHRvKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdzKCk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZGVsZXRlVmlldyh2aWV3SWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKHZpZXdJZCA9PT0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3QnlJZCh2aWV3SWQpO1xyXG4gICAgaWYgKCF2aWV3KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCBzZW5kUmVxdWVzdCh0aGlzLmRlbGV0ZURhdGFVcmwsICdERUxFVEUnLCB7IHZpZXdJZCB9KTtcclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdzKCk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGxvYWRWaWV3cygpIHtcclxuICAgIGNvbnN0IHZpZXdzID0gYXdhaXQgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb248SUNvbnRyb2xEaXNwbGF5Vmlld0R0b1tdPih0aGlzLmxvYWREYXRhVXJsKTtcclxuXHJcbiAgICB0aGlzLnZpZXdzID0gdmlld3MubWFwKChkdG8pID0+IHRoaXMubWFwVmlld0R0b1RvTW9kZWwoZHRvKSk7XHJcbiAgICB0aGlzLnZpZXdzLnVuc2hpZnQoR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3KTtcclxuICAgIC8vIE5PVEU6IHJlc2V0IG1lbW9pemVcclxuICAgIHRoaXMucmVzZXRDYWNoZWRSZXN1bHRPZkdldFZpZXdCeUlkRnVuY3Rpb24oKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy52aWV3cztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwVmlld01vZGVsVG9EdG8obW9kZWw6IElDb250cm9sRGlzcGxheVZpZXcpOiBJQ29udHJvbERpc3BsYXlWaWV3RHRvIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIElkOiBtb2RlbC5pZCxcclxuICAgICAgTmFtZTogbW9kZWwubmFtZSxcclxuICAgICAgR3JpZFN0YXRlOiBKU09OLnN0cmluZ2lmeShtb2RlbC5ncmlkU3RhdGUpLFxyXG4gICAgICBJc0dsb2JhbDogbW9kZWwuaXNHbG9iYWxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hcFZpZXdEdG9Ub01vZGVsKGR0bzogSUNvbnRyb2xEaXNwbGF5Vmlld0R0byk6IElDb250cm9sRGlzcGxheVZpZXcge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWQ6IGR0by5JZCxcclxuICAgICAgbmFtZTogZHRvLk5hbWUsXHJcbiAgICAgIGdyaWRTdGF0ZTogSlNPTi5wYXJzZShkdG8uR3JpZFN0YXRlKSxcclxuICAgICAgaXNHbG9iYWw6IGR0by5Jc0dsb2JhbFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXRDYWNoZWRSZXN1bHRPZkdldFZpZXdCeUlkRnVuY3Rpb24oKSB7XHJcbiAgICB0aGlzLmdldFZpZXdCeUlkID0gbWVtb2l6ZSh0aGlzLmdldFZpZXdCeUlkSW50ZXJuYWwpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUdyaWRTdGF0ZSB9IGZyb20gJy4vR3JpZFN0YXRlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgb3duZXI6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICByZWFkb25seSBpbml0aWFsU3RhdGU6IElHcmlkU3RhdGUgfCBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgT25lVGltZUdyaWRTdGF0ZU1hbmFnZXIge1xyXG4gIHB1YmxpYyBjdXJyZW50U2F2ZWRHcmlkU3RhdGU6IElHcmlkU3RhdGU7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogSU9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyT3B0aW9ucztcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSU9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyT3B0aW9ucykge1xyXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICAgIHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlID0gb3B0aW9ucy5pbml0aWFsU3RhdGU7XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLm93bmVyLm9wdGlvbignc3RhdGVTdG9yaW5nJywge1xyXG4gICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgY3VzdG9tTG9hZDogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlKVxyXG4gICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydzdGF0ZVN0b3JpbmcnXSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGhhc0NoYW5nZXMoKSB7XHJcbiAgICAvLyBUT0RPOiB1c2UgZGVlcCBlcXVhbFxyXG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlICE9PSBudWxsICYmIEpTT04uc3RyaW5naWZ5KHRoaXMuY3VycmVudFVuc2F2ZWRHcmlkU3RhdGUpICE9PSBKU09OLnN0cmluZ2lmeShcclxuICAgICAgdGhpcy5jdXJyZW50U2F2ZWRHcmlkU3RhdGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXJyZW50VW5zYXZlZEdyaWRTdGF0ZSgpOiBJR3JpZFN0YXRlIHtcclxuICAgIHJldHVybiB0aGlzLnByZXBhcmVVbnNhdmVkR3JpZFN0YXRlKHRoaXMub3B0aW9ucy5vd25lci5zdGF0ZSgpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBhcHBseShncmlkU3RhdGU6IElHcmlkU3RhdGUgfCBudWxsLCByZXNldEZpbHRlciA9IHRydWUpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRGaWx0ZXIgPSByZXNldEZpbHRlciA/IHVuZGVmaW5lZCA6IHRoaXMub3B0aW9ucy5vd25lci5maWx0ZXIoKTtcclxuXHJcbiAgICAgIC8qIE5PVEU6IFNvbWV0aW1lcyBhIGdyaWQgY2FuIHJldHVybiBhIG5ldyBzdGF0ZSB3aXRoIG9sZCBmaWx0ZXJWYWx1ZSxcclxuICAgICAgICBzbyB3ZSBzaG91bGQgcmVzZXQgdGhlIGZpbHRlclZhbHVlIGJlZm9yZSBzdGF0ZSBhcHBseWluZ1xyXG4gICAgICAgIGlmIHRoaXMgYnVnIHdpbGwgYmUgZml4ZWQgb24gdGhlIERldkV4dHJlbWUgc2lkZSB3ZSBjYW4gcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZVxyXG4gICAgICAqL1xyXG4gICAgICB0aGlzLm9wdGlvbnMub3duZXIuYmVnaW5VcGRhdGUoKTtcclxuICAgICAgdGhpcy5vcHRpb25zLm93bmVyLmNsZWFyRmlsdGVyKCdmaWx0ZXJWYWx1ZScpO1xyXG5cclxuICAgICAgdGhpcy5vcHRpb25zLm93bmVyLnN0YXRlKGdyaWRTdGF0ZSk7XHJcblxyXG4gICAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHRoaXMub3B0aW9ucy5vd25lci5nZXRWaXNpYmxlQ29sdW1ucygpLmZpbHRlcigoYykgPT4gIWMudHlwZSk7XHJcblxyXG4gICAgICBpZiAodmlzaWJsZUNvbHVtbnNbMF0gJiYgdmlzaWJsZUNvbHVtbnNbMF0uZGF0YUZpZWxkKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLm93bmVyLm9wdGlvbignc3VtbWFyeScsIHtcclxuICAgICAgICAgIHRvdGFsSXRlbXM6IFt7XHJcbiAgICAgICAgICAgIGNvbHVtbjogdmlzaWJsZUNvbHVtbnNbMF0uZGF0YUZpZWxkLFxyXG4gICAgICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xyXG4gICAgICAgICAgfV1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY3VycmVudEZpbHRlciAmJiB0aGlzLm9wdGlvbnMub3duZXIuZmlsdGVyKGN1cnJlbnRGaWx0ZXIpO1xyXG4gICAgICB0aGlzLm9wdGlvbnMub3duZXIuZW5kVXBkYXRlKCk7XHJcblxyXG4gICAgICBjb25zdCBvbkNvbnRlbnRSZWFkeSA9ICgpID0+IHtcclxuICAgICAgICB0aGlzLnNhdmUoKTtcclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLm93bmVyLm9mZignY29udGVudFJlYWR5Jywgb25Db250ZW50UmVhZHkpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5vcHRpb25zLm93bmVyLm9uKCdjb250ZW50UmVhZHknLCBvbkNvbnRlbnRSZWFkeSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzYXZlKCkge1xyXG4gICAgdGhpcy5jdXJyZW50U2F2ZWRHcmlkU3RhdGUgPSB0aGlzLmN1cnJlbnRVbnNhdmVkR3JpZFN0YXRlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc2V0KCkge1xyXG4gICAgdGhpcy5vcHRpb25zLm93bmVyLnN0YXRlKHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlcGFyZVVuc2F2ZWRHcmlkU3RhdGUodW5zYXZlZEdyaWRTdGF0ZTogSUdyaWRTdGF0ZSk6IElHcmlkU3RhdGUge1xyXG4gICAgaWYgKHVuc2F2ZWRHcmlkU3RhdGUuY29sdW1ucykge1xyXG4gICAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHVuc2F2ZWRHcmlkU3RhdGUuY29sdW1uc1xyXG4gICAgICAgIC5maWx0ZXIoKGMpID0+IGMudmlzaWJsZSk7XHJcbiAgICAgIGNvbnN0IGxhc3RDb2x1bW4gPSB2aXNpYmxlQ29sdW1uc1t2aXNpYmxlQ29sdW1ucy5sZW5ndGggLSAxXTtcclxuICAgICAgbGFzdENvbHVtbi53aWR0aCA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdW5zYXZlZEdyaWRTdGF0ZTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEdyaWRWaWV3c01hbmFnZXIsIElHcmlkVmlld3NNYW5hZ2VyT3B0aW9ucyB9IGZyb20gJy4vR3JpZFZpZXdzTWFuYWdlcic7XHJcbmltcG9ydCB7IE9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9HcmlkU3RhdGVNYW5hZ2VyJztcclxuaW1wb3J0IHsgTXV0YWJsZSB9IGZyb20gJy4uLy4uLy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcbmltcG9ydCB7IGNyZWF0ZURpYWxvZyB9IGZyb20gJy4uLy4uLy4uL1dpZGdldHMvUG9wdXAnO1xyXG5pbXBvcnQgbm90aWZ5IGZyb20gJy4uLy4uLy4uL1dpZGdldHMvTm90aWZ5JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnRPcHRpb25zIHtcclxuICByZWFkb25seSBvd25lcjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gIHJlYWRvbmx5IGdyaWRWaWV3c01hbmFnZXI6IEdyaWRWaWV3c01hbmFnZXI7XHJcbiAgcmVhZG9ubHkgZ3JpZFN0YXRlTWFuYWdlcjogT25lVGltZUdyaWRTdGF0ZU1hbmFnZXI7XHJcbiAgcmVhZG9ubHkgYXV0b0ludGVncmF0aW9uOiBib29sZWFuO1xyXG4gIHJlYWRvbmx5IG9uVmlld0FwcGxpZWQ/OiAodmlld0lkOiBudW1iZXIpID0+IHZvaWQ7XHJcbiAgcmVhZG9ubHkgb25WaWV3RGVsZXRlZD86ICh2aWV3SWQ6IG51bWJlcikgPT4gdm9pZDtcclxuICByZWFkb25seSBjYW5DcmVhdGVHbG9iYWxWaWV3czogYm9vbGVhbjtcclxuICByZWFkb25seSB2aXNpYmxlOiBib29sZWFuO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnREZWZhdWx0T3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgZ3JpZFZpZXdzTWFuYWdlcjogR3JpZFZpZXdzTWFuYWdlcjtcclxuICByZWFkb25seSBncmlkVmlld3NNYW5hZ2VyT3B0aW9uczogSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zO1xyXG4gIHJlYWRvbmx5IGdyaWRTdGF0ZU1hbmFnZXI6IE9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGF1dG9JbnRlZ3JhdGlvbjogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMgPVxyXG4gIE11dGFibGU8T21pdDxJR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMsIGtleW9mIElHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50RGVmYXVsdE9wdGlvbnM+PiAmXHJcbiAgTXV0YWJsZTxQYXJ0aWFsPElHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50RGVmYXVsdE9wdGlvbnM+PjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50IHtcclxuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogSUdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnRPcHRpb25zO1xyXG4gIC8vIHRvb2xiYXIgaXRlbXNcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZSB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfdmlld3NUb29sYmFySXRlbTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHwgdW5kZWZpbmVkO1xyXG4gIC8vIHRzbGludDplbmFibGUgdmFyaWFibGUtbmFtZVxyXG5cclxuICAvLyB0b29sYmFyIHdpZGdldHNcclxuICBwcml2YXRlIHZpZXdzRHJvcGRvd25Cb3g6IERldkV4cHJlc3MudWkuZHhTZWxlY3RCb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSB2aWV3c0RhdGFHcmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBjdXJyZW50Vmlld1RpdGxlOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHNhdmVWaWV3QnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgc2F2ZVZpZXdBc0J1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGNvbHVtbkNob29zZXJCdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b24gfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnRPcHRpb25zKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSB7XHJcbiAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICAgIGdyaWRTdGF0ZU1hbmFnZXI6IG9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlciA/IG9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlciA6IG5ldyBPbmVUaW1lR3JpZFN0YXRlTWFuYWdlcih7XHJcbiAgICAgICAgb3duZXI6IG9wdGlvbnMub3duZXIsXHJcbiAgICAgICAgaW5pdGlhbFN0YXRlOiBudWxsXHJcbiAgICAgIH0pLFxyXG4gICAgICBncmlkVmlld3NNYW5hZ2VyOiBvcHRpb25zLmdyaWRWaWV3c01hbmFnZXIgPyBvcHRpb25zLmdyaWRWaWV3c01hbmFnZXIgOiBuZXcgR3JpZFZpZXdzTWFuYWdlcihvcHRpb25zLmdyaWRWaWV3c01hbmFnZXJPcHRpb25zKSxcclxuICAgICAgYXV0b0ludGVncmF0aW9uOiAob3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAhPT0gbnVsbClcclxuICAgICAgICA/IG9wdGlvbnMuYXV0b0ludGVncmF0aW9uIDogdHJ1ZVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLm9wdGlvbnMuYXV0b0ludGVncmF0aW9uICYmIHRoaXMuaW50ZWdyYXRlVG9HcmlkKHRoaXMub3B0aW9ucy5vd25lcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgdHJ5QXBwbHlWaWV3KHZpZXdJZDogbnVtYmVyIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBpc0NhbkJlVmlld0FwcGxpZWQgPSBhd2FpdCB0aGlzLmNvbmZpcm1DaGFuZ2VzTG9zcygpO1xyXG5cclxuICAgIGlmIChpc0NhbkJlVmlld0FwcGxpZWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5hcHBseVZpZXcodmlld0lkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNDYW5CZVZpZXdBcHBsaWVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGFwcGx5Vmlldyh2aWV3SWQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5iZWdpblZpZXdBcHBseWluZ0xvYWRpbmcoKTtcclxuXHJcbiAgICB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkID0gdmlld0lkO1xyXG4gICAgYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIuYXBwbHkodGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXcuZ3JpZFN0YXRlLCBmYWxzZSk7XHJcblxyXG4gICAgdGhpcy5lbmRWaWV3QXBwbHlpbmdMb2FkaW5nKCk7XHJcbiAgICB0aGlzLnN5bmNVSVdpdGhDdXJyZW50VmlldygpO1xyXG5cclxuICAgIHRoaXMub3B0aW9ucy5vblZpZXdBcHBsaWVkICYmIHRoaXMub3B0aW9ucy5vblZpZXdBcHBsaWVkKHZpZXdJZCk7XHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbnRlZ3JhdGVUb0dyaWQoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VG9vbGJhclByZXBhcmluZyA9IGdyaWQub3B0aW9uKCdvblRvb2xiYXJQcmVwYXJpbmcnKTtcclxuXHJcbiAgICBncmlkLm9wdGlvbignb25Ub29sYmFyUHJlcGFyaW5nJywgKGU6IGFueSkgPT4ge1xyXG4gICAgICBjdXJyZW50VG9vbGJhclByZXBhcmluZyAmJiBjdXJyZW50VG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgICAgdGhpcy5vbkdyaWRUb29sYmFyUHJlcGFyaW5nKGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9uR3JpZFRvb2xiYXJQcmVwYXJpbmc6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnNbJ29uVG9vbGJhclByZXBhcmluZyddID0gKGUpID0+IHtcclxuICAgIGNvbnN0IHRvb2xiYXJJdGVtcyA9IGUudG9vbGJhck9wdGlvbnMgJiYgZS50b29sYmFyT3B0aW9ucy5pdGVtcztcclxuICAgIGlmICghdG9vbGJhckl0ZW1zKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbW92ZURlZmF1bHRDb2x1bW5DaG9vc2VyQnV0dG9uKHRvb2xiYXJJdGVtcyk7XHJcblxyXG4gICAgdG9vbGJhckl0ZW1zLnNwbGljZSgxLCAwLFxyXG4gICAgICB0aGlzLnZpZXdzVG9vbGJhckl0ZW0sXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVEZWZhdWx0Q29sdW1uQ2hvb3NlckJ1dHRvbih0b29sYmFySXRlbXM6IEFycmF5PHsgbmFtZT86IHN0cmluZyB9Pikge1xyXG4gICAgdG9vbGJhckl0ZW1zLnNwbGljZSh0b29sYmFySXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdjb2x1bW5DaG9vc2VyQnV0dG9uJyksIDEpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgdmlld3NUb29sYmFySXRlbSgpIHtcclxuICAgIGlmICghdGhpcy5fdmlld3NUb29sYmFySXRlbSkge1xyXG4gICAgICB0aGlzLl92aWV3c1Rvb2xiYXJJdGVtID0gdGhpcy5jcmVhdGVWaWV3c1Rvb2xiYXJJdGVtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdzVG9vbGJhckl0ZW07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBpc0RlZmF1bHRWaWV3KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQgPT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGhhc0NoYW5nZXMoKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VmlldyA9IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3O1xyXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRWaWV3VGl0bGUpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRWaWV3VGl0bGUub3B0aW9uKCd2YWx1ZScpICE9PSBjdXJyZW50Vmlldy5uYW1lIHx8IHRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyLmhhc0NoYW5nZXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVZpZXdzVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHtcclxuICAgIGxldCBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHdpZGdldDogJ2R4RHJvcERvd25Cb3gnIGFzIGFueSxcclxuICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgIHRleHQ6ICdWaWV3cycsXHJcbiAgICAgIHZpc2libGU6IHRoaXMub3B0aW9ucy52aXNpYmxlLFxyXG4gICAgICBjc3NDbGFzczogJ2Fwcy12aWV3c19fdG9vbGJhci1pdGVtJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdpc3pvbGVhLW1kJ30sXHJcbiAgICAgICAgaXRlbXM6IFtHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXddLFxyXG4gICAgICAgIHZhbHVlOiBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQsXHJcbiAgICAgICAgdmFsdWVFeHByOiAnaWQnLFxyXG4gICAgICAgIGRpc3BsYXlFeHByOiAnbmFtZScsXHJcbiAgICAgICAgd2lkdGg6IDIwMCxcclxuICAgICAgICBkcm9wRG93bk9wdGlvbnM6IHtcclxuICAgICAgICAgIHdpZHRoOiA1NTBcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnZpZXdzRHJvcGRvd25Cb3ggPSBlLmNvbXBvbmVudDtcclxuICAgICAgICAgIHRoaXMubG9hZFZpZXdEcm9wZG93bkJveERhdGEoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uVmFsdWVDaGFuZ2VkOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGUudmFsdWUgPT09IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQgfHwgIWlzTmVlZEhhbmRsZVZhbHVlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGlzVmlld0FwcGxpZWQgPSBhd2FpdCB0aGlzLnRyeUFwcGx5VmlldyhlLnZhbHVlKTtcclxuICAgICAgICAgIGlmIChpc1ZpZXdBcHBsaWVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuc3luY1VJV2l0aEN1cnJlbnRWaWV3KHRydWUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29udGVudFRlbXBsYXRlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFlLmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy52aWV3c0RhdGFHcmlkID0gdGhpcy5jcmVhdGVWaWV3c0RhdGFHcmlkKGUuY29tcG9uZW50KTtcclxuICAgICAgICAgIHRoaXMuY3VycmVudFZpZXdUaXRsZSA9IHRoaXMuY3JlYXRlQ3VycmVudFZpZXdUaXRsZShlLmNvbXBvbmVudCk7XHJcbiAgICAgICAgICB0aGlzLnNhdmVWaWV3QnV0dG9uID0gdGhpcy5jcmVhdGVTYXZlVmlld0J1dHRvbigpO1xyXG4gICAgICAgICAgdGhpcy5zYXZlVmlld0FzQnV0dG9uID0gdGhpcy5jcmVhdGVTYXZlVmlld0FzQnV0dG9uKCk7XHJcbiAgICAgICAgICB0aGlzLmNvbHVtbkNob29zZXJCdXR0b24gPSB0aGlzLmNyZWF0ZUNvbHVtbkNob29zZXJCdXR0b24oKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRlbnRIZWFkZXIgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgLmFkZENsYXNzKCdhcHMtdmlld3NfX2hlYWRlcicpXHJcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy5jdXJyZW50Vmlld1RpdGxlLmVsZW1lbnQoKSlcclxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLnNhdmVWaWV3QnV0dG9uLmVsZW1lbnQoKSlcclxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLnNhdmVWaWV3QXNCdXR0b24uZWxlbWVudCgpKVxyXG4gICAgICAgICAgICAuYXBwZW5kKHRoaXMuY29sdW1uQ2hvb3NlckJ1dHRvbi5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udGVudCA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAuaGVpZ2h0KCcxMDAlJylcclxuICAgICAgICAgICAgLmFwcGVuZChkcm9wZG93bkNvbnRlbnRIZWFkZXIpXHJcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy52aWV3c0RhdGFHcmlkLmVsZW1lbnQoKSk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIGRyb3Bkb3duQ29udGVudDtcclxuICAgICAgICB9LFxyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveE9wdGlvbnNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVZpZXdzRGF0YUdyaWQoZHJvcGRvd25Cb3hPd25lcjogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94KTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JylcclxuICAgICAgLmR4RGF0YUdyaWQoe1xyXG4gICAgICAgIGRhdGFTb3VyY2U6IGRyb3Bkb3duQm94T3duZXIuZ2V0RGF0YVNvdXJjZSgpLFxyXG4gICAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxyXG4gICAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICAgIGFsbG93QWRkaW5nOiBmYWxzZSxcclxuICAgICAgICAgIGFsbG93VXBkYXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBhbGxvd0RlbGV0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgbW9kZTogJ2NlbGwnLFxyXG4gICAgICAgICAgdXNlSWNvbnM6IHRydWUsXHJcbiAgICAgICAgICB0ZXh0czoge1xyXG4gICAgICAgICAgICBjb25maXJtRGVsZXRlTWVzc2FnZTogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyB2aWV3PydcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHdvcmRXcmFwRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBsb2FkUGFuZWw6IHtcclxuICAgICAgICAgIHNoYWRpbmc6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnbmFtZScsXHJcbiAgICAgICAgICAgIGFsbG93RWRpdGluZzogZmFsc2VcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ2lzR2xvYmFsJyxcclxuICAgICAgICAgICAgY2FwdGlvbjogJ0lzIEdsb2JhbCcsXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnYm9vbGVhbicsXHJcbiAgICAgICAgICAgIHdpZHRoOiA3MFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdHlwZTogJ2J1dHRvbnMnLFxyXG4gICAgICAgICAgICBidXR0b25zOiBbXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogJ2RlbGV0ZScsXHJcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiAoZSkgPT4gZS5yb3cgJiYgZS5yb3cua2V5ICE9PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWRcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH1cclxuICAgICAgICBdLFxyXG4gICAgICAgIGtleWJvYXJkTmF2aWdhdGlvbjoge1xyXG4gICAgICAgICAgZWRpdE9uS2V5UHJlc3M6IGZhbHNlLFxyXG4gICAgICAgICAgZW5hYmxlZDogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNob3dDb2x1bW5IZWFkZXJzOiB0cnVlLFxyXG4gICAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGZvY3VzZWRSb3dFbmFibGVkOiBmYWxzZSxcclxuICAgICAgICBzaG93Qm9yZGVyczogZmFsc2UsXHJcbiAgICAgICAgc2hvd0NvbHVtbkxpbmVzOiBmYWxzZSxcclxuICAgICAgICBzZWxlY3Rpb246IHsgbW9kZTogJ3NpbmdsZScgfSxcclxuICAgICAgICBoZWlnaHQ6ICdjYWxjKDEwMCUgLSA1MXB4KScsXHJcbiAgICAgICAgc2Nyb2xsaW5nOiB7IG1vZGU6ICdzdGFuZGFyZCcgfSxcclxuICAgICAgICBwYWdpbmc6IHsgZW5hYmxlZDogZmFsc2UgfSxcclxuICAgICAgICBub0RhdGFUZXh0OiAnTm8gdmlld3MnLFxyXG4gICAgICAgIG9uU2VsZWN0aW9uQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICAgIGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCd2YWx1ZScsIGUuc2VsZWN0ZWRSb3dLZXlzICYmIGUuc2VsZWN0ZWRSb3dLZXlzLmxlbmd0aCA/IGUuc2VsZWN0ZWRSb3dLZXlzWzBdIDogMCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkVkaXRvclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgICAgIGlmIChlLmRhdGFGaWVsZCA9PT0gJ2lzR2xvYmFsJykge1xyXG4gICAgICAgICAgICBlLmVkaXRvck9wdGlvbnMuZGlzYWJsZWQgPSAhdGhpcy5vcHRpb25zLmNhbkNyZWF0ZUdsb2JhbFZpZXdzO1xyXG4gICAgICAgICAgICBlLmVkaXRvck9wdGlvbnMudmlzaWJsZSA9IGUucm93LmRhdGEuaWQgIT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG9uVmFsdWVDaGFuZ2VkID0gZS5lZGl0b3JPcHRpb25zLm9uVmFsdWVDaGFuZ2VkO1xyXG4gICAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25WYWx1ZUNoYW5nZWQgPSBhc3luYyAob3B0KSA9PiB7XHJcbiAgICAgICAgICAgICAgZS5jb21wb25lbnQuYmVnaW5DdXN0b21Mb2FkaW5nKCdVcGRhdGluZycpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLnVwZGF0ZVZpZXcoZS5yb3cuZGF0YS5pZCwgeyBpc0dsb2JhbDogb3B0LnZhbHVlIH0pO1xyXG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQob3B0KTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQ2VsbFByZXBhcmVkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGUuY29sdW1uLnR5cGUgIT09ICdidXR0b25zJyB8fCAhZS5kYXRhKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBlbmFibGVkID0gIWUuZGF0YS5pc0dsb2JhbFxyXG4gICAgICAgICAgICB8fCAoZS5kYXRhLmlzR2xvYmFsICYmIHRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxWaWV3cyk7XHJcblxyXG4gICAgICAgICAgaWYgKCFlbmFibGVkKSB7XHJcbiAgICAgICAgICAgIEFycmF5LmZyb20oZS5jZWxsRWxlbWVudC5jaGlsZHJlbigpKS5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgICAgICAgJChjKS5jc3Moe1xyXG4gICAgICAgICAgICAgICAgY29sb3I6ICcjZGRkICFpbXBvcnRhbnQnLFxyXG4gICAgICAgICAgICAgICAgY3Vyc29yOiAnZGVmYXVsdCdcclxuICAgICAgICAgICAgICB9KS5vZmYoJ2NsaWNrJyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25Sb3dSZW1vdmluZzogKGUpID0+IHtcclxuICAgICAgICAgIGlmICghZS5rZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuZGVsZXRlVmlldyhlLmtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlQ3VycmVudFZpZXdUaXRsZShkcm9wZG93bkJveE93bmVyOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3gpOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLXZpZXdzX19jdXJyZW50LXZpZXcgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keFRleHRCb3goe1xyXG4gICAgICAgIHZhbHVlOiBkcm9wZG93bkJveE93bmVyLm9wdGlvbigndGV4dCcpIHx8IGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCdwbGFjZWhvbGRlcicpLFxyXG4gICAgICAgIHJlYWRPbmx5OiB0aGlzLmlzRGVmYXVsdFZpZXdcclxuICAgICAgfSlcclxuICAgICAgLmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2F2ZVZpZXdCdXR0b24oKTogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB7XHJcbiAgICByZXR1cm4gJCgnPGJ1dHRvbiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLXZpZXdzX19zYXZlLXZpZXcgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogJ1NhdmUnLFxyXG4gICAgICAgIHR5cGU6ICdub3JtYWwnLFxyXG4gICAgICAgIGRpc2FibGVkOiB0aGlzLmlzRGVmYXVsdFZpZXcsXHJcbiAgICAgICAgb25DbGljazogdGhpcy5zYXZlLmJpbmQodGhpcyksXHJcbiAgICAgICAgaWNvbjogJ3NhdmUnLFxyXG4gICAgICAgIHdpZHRoOiA4N1xyXG4gICAgICB9KVxyXG4gICAgICAuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVNhdmVWaWV3QXNCdXR0b24oKTogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB7XHJcbiAgICByZXR1cm4gJCgnPGJ1dHRvbiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLXZpZXdzX19zYXZlLXZpZXctYXMgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogJ1NhdmUgQXMnLFxyXG4gICAgICAgIHR5cGU6ICdub3JtYWwnLFxyXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuY3JlYXRlU2F2ZUFzRGlhbG9nLmJpbmQodGhpcyksXHJcbiAgICAgICAgaWNvbjogJ3NhdmUnLFxyXG4gICAgICAgIHdpZHRoOiAxMThcclxuICAgICAgfSlcclxuICAgICAgLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVDb2x1bW5DaG9vc2VyQnV0dG9uKCk6IERldkV4cHJlc3MudWkuZHhCdXR0b24ge1xyXG4gICAgcmV0dXJuICQoJzxidXR0b24gLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy12aWV3c19fY29sdW1uLWNob29zZXIgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgb25DbGljazogdGhpcy5vcGVuQ29sdW1uQ2hvb3Nlci5iaW5kKHRoaXMpLFxyXG4gICAgICAgIGljb246ICdjb2x1bW4tY2hvb3NlcidcclxuICAgICAgfSlcclxuICAgICAgLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlQXNEaWFsb2coKSB7XHJcbiAgICBjb25zdCAkcG9wdXBDb250ZW50ID0gJCgnPGRpdiAvPicpO1xyXG5cclxuICAgIGNvbnN0IGRpYWxvZ0NvbnRlbnRFbGVtZW50ID0gJCgnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206OHB4O1wiIC8+JykuZHhUZXh0Qm94KHtcclxuICAgICAgcGxhY2Vob2xkZXI6ICdWaWV3IE5hbWUnLFxyXG4gICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICB9KS5keFZhbGlkYXRvcih7XHJcbiAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgIHsgdHlwZTogJ3JlcXVpcmVkJyB9LFxyXG4gICAgICBdXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHZpZXdOYW1lVGV4dEJveCA9IGRpYWxvZ0NvbnRlbnRFbGVtZW50LmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuICAgIGNvbnN0IHZpZXdOYW1lVGV4dEJveFZhbGlkYXRvciA9IGRpYWxvZ0NvbnRlbnRFbGVtZW50LmR4VmFsaWRhdG9yKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHZpZXdOYW1lVGV4dEJveC5lbGVtZW50KCkuYXBwZW5kVG8oJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgY29uc3Qgdmlld0lzR2xvYmFsQ2hlY2tib3ggPSAkKCc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O1wiIC8+JylcclxuICAgICAgLmR4Q2hlY2tCb3goe1xyXG4gICAgICAgIHRleHQ6ICdHbG9iYWwgdmlldycsXHJcbiAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLm9wdGlvbnMuY2FuQ3JlYXRlR2xvYmFsVmlld3NcclxuICAgICAgfSlcclxuICAgICAgLmR4Q2hlY2tCb3goJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgdmlld0lzR2xvYmFsQ2hlY2tib3guZWxlbWVudCgpLmFwcGVuZFRvKCRwb3B1cENvbnRlbnQpO1xyXG5cclxuICAgIHJldHVybiBjcmVhdGVEaWFsb2coXHJcbiAgICAgIHtcclxuICAgICAgICB0aXRsZTogJ0NyZWF0ZSBOZXcgVmlldycsXHJcbiAgICAgICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgICBtYXhXaWR0aDogJzMwMHB4JyxcclxuICAgICAgfSxcclxuICAgICAgJHBvcHVwQ29udGVudCxcclxuICAgICAge1xyXG4gICAgICAgIHRleHQ6ICdPaycsXHJcbiAgICAgICAgb25DbGljazogYXN5bmMgKGNsb3NlUG9wdXApID0+IHtcclxuICAgICAgICAgIGlmICghdmlld05hbWVUZXh0Qm94VmFsaWRhdG9yLnZhbGlkYXRlKCkuaXNWYWxpZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zYXZlQXModmlld05hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnKSwgdmlld0lzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCd2YWx1ZScpKTtcclxuICAgICAgICAgIGNsb3NlUG9wdXAoKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdGV4dDogJ0NhbmNlbCcsXHJcbiAgICAgICAgb25DbGljazogKGNsb3NlUG9wdXApID0+IGNsb3NlUG9wdXAoKVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb3BlbkNvbHVtbkNob29zZXIoKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMub3duZXIuc2hvd0NvbHVtbkNob29zZXIoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbG9hZFZpZXdEcm9wZG93bkJveERhdGEoKSB7XHJcbiAgICBpZiAoIXRoaXMudmlld3NEcm9wZG93bkJveCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgdmlld3MgPSBhd2FpdCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5nZXRWaWV3cygpO1xyXG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBEZXZFeHByZXNzLmRhdGEuQXJyYXlTdG9yZSh7XHJcbiAgICAgIGtleTogJ2lkJyxcclxuICAgICAgZGF0YTogdmlld3NcclxuICAgIH0pO1xyXG4gICAgdGhpcy52aWV3c0Ryb3Bkb3duQm94Lm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xyXG4gICAgdGhpcy52aWV3c0Ryb3Bkb3duQm94Lm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkKTtcclxuICAgIHRoaXMudmlld3NEYXRhR3JpZCAmJiB0aGlzLnZpZXdzRGF0YUdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgZGF0YVNvdXJjZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNhdmUoKSB7XHJcbiAgICBpZiAoIXRoaXMuaGFzQ2hhbmdlcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIuc2F2ZSgpO1xyXG4gICAgYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIudXBkYXRlQ3VycmVudFZpZXcoe1xyXG4gICAgICBuYW1lOiB0aGlzLmN1cnJlbnRWaWV3VGl0bGUub3B0aW9uKCd2YWx1ZScpLFxyXG4gICAgICBncmlkU3RhdGU6IHRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyLmN1cnJlbnRTYXZlZEdyaWRTdGF0ZVxyXG4gICAgfSk7XHJcblxyXG4gICAgbm90aWZ5KCdTYXZlZCcsIHRydWUpO1xyXG5cclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdEcm9wZG93bkJveERhdGEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc2F2ZUFzKHZpZXdOYW1lOiBzdHJpbmcsIGlzR2xvYmFsOiBib29sZWFuKSB7XHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlci5zYXZlKCk7XHJcbiAgICBjb25zdCB1cGRhdGVkVmlldyA9IGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmNyZWF0ZU5ld1ZpZXcoXHJcbiAgICAgIHZpZXdOYW1lLFxyXG4gICAgICB0aGlzLm9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlci5jdXJyZW50U2F2ZWRHcmlkU3RhdGUsXHJcbiAgICAgIGlzR2xvYmFsXHJcbiAgICApO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkVmlld0Ryb3Bkb3duQm94RGF0YSgpO1xyXG4gICAgYXdhaXQgdGhpcy5hcHBseVZpZXcodXBkYXRlZFZpZXcuaWQpO1xyXG5cclxuICAgIG5vdGlmeSgnVmlldyBpcyBjcmVhdGVkJywgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGRlbGV0ZVZpZXcodmlld0lkOiBudW1iZXIpIHtcclxuICAgIGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmRlbGV0ZVZpZXcodmlld0lkKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMub25WaWV3RGVsZXRlZCkge1xyXG4gICAgICB0aGlzLm9wdGlvbnMub25WaWV3RGVsZXRlZCh2aWV3SWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdEcm9wZG93bkJveERhdGEoKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkICE9PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5hcHBseVZpZXcoR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVnaW5WaWV3QXBwbHlpbmdMb2FkaW5nKCkge1xyXG4gICAgdGhpcy5jdXJyZW50Vmlld1RpdGxlICYmIHRoaXMuY3VycmVudFZpZXdUaXRsZS5vcHRpb24oJ3JlYWRPbmx5JywgdHJ1ZSk7XHJcbiAgICB0aGlzLnNhdmVWaWV3QnV0dG9uICYmIHRoaXMuc2F2ZVZpZXdCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsIHRydWUpO1xyXG4gICAgdGhpcy5zYXZlVmlld0FzQnV0dG9uICYmIHRoaXMuc2F2ZVZpZXdBc0J1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgdHJ1ZSk7XHJcbiAgICB0aGlzLnZpZXdzRGF0YUdyaWQgJiYgdGhpcy52aWV3c0RhdGFHcmlkLmJlZ2luQ3VzdG9tTG9hZGluZygnQXBwbHlpbmcuLi4nKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW5kVmlld0FwcGx5aW5nTG9hZGluZygpIHtcclxuICAgIHRoaXMuY3VycmVudFZpZXdUaXRsZSAmJiB0aGlzLmN1cnJlbnRWaWV3VGl0bGUub3B0aW9uKCdyZWFkT25seScsIGZhbHNlKTtcclxuICAgIHRoaXMuc2F2ZVZpZXdCdXR0b24gJiYgdGhpcy5zYXZlVmlld0J1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgZmFsc2UpO1xyXG4gICAgdGhpcy5zYXZlVmlld0FzQnV0dG9uICYmIHRoaXMuc2F2ZVZpZXdBc0J1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgZmFsc2UpO1xyXG4gICAgdGhpcy52aWV3c0RhdGFHcmlkICYmIHRoaXMudmlld3NEYXRhR3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN5bmNVSVdpdGhDdXJyZW50VmlldyhpZ25vcmVDdXJyZW50Vmlld1RpdGxlID0gZmFsc2UpIHtcclxuICAgIGlmICghaWdub3JlQ3VycmVudFZpZXdUaXRsZSAmJiB0aGlzLmN1cnJlbnRWaWV3VGl0bGUpIHtcclxuICAgICAgdGhpcy5jdXJyZW50Vmlld1RpdGxlLm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlldy5uYW1lKTtcclxuICAgICAgdGhpcy5jdXJyZW50Vmlld1RpdGxlLm9wdGlvbigncmVhZE9ubHknLCB0aGlzLmlzRGVmYXVsdFZpZXcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy52aWV3c0Ryb3Bkb3duQm94Lm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkKTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMudmlld3NEYXRhR3JpZCkge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkID09PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQpIHtcclxuICAgICAgICAgIHRoaXMudmlld3NEYXRhR3JpZC5zZWxlY3RSb3dzQnlJbmRleGVzKFswXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudmlld3NEYXRhR3JpZC5zZWxlY3RSb3dzKFt0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkXSwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSwgMCk7XHJcblxyXG4gICAgY29uc3QgaXNHbG9iYWxWaWV3ID0gdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXcuaXNHbG9iYWxcclxuICAgICAgJiYgIXRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxWaWV3cztcclxuXHJcbiAgICB0aGlzLnNhdmVWaWV3QnV0dG9uICYmIHRoaXMuc2F2ZVZpZXdCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsIHRoaXMuaXNEZWZhdWx0VmlldyB8fCBpc0dsb2JhbFZpZXcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjb25maXJtQ2hhbmdlc0xvc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIXRoaXMuaGFzQ2hhbmdlcykge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gRGV2RXhwcmVzcy51aS5kaWFsb2cuY29uZmlybShcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgJ1lvdSBoYXZlIHVuc2F2ZWQgY2hhbmdlcyB0aGF0IHdpbGwgYmUgbG9zdCBpZiB5b3UgY2xvc2UgdGhpcyBwb3B1cC4gRG8geW91IHdhbnQgdG8gY2xvc2UgdGhlIHBvcHVwIGFuZCBub3Qgc2F2ZSBjaGFuZ2VzPycsXHJcbiAgICAgICdVbnNhdmVkIGNoYW5nZXMnXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGLy8gdHNsaW50OmRpc2FibGU6IG1lbWJlci1vcmRlcmluZ1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbiBmcm9tICcuLi8uLi8uLi9EYXRhL0xvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uJztcclxuaW1wb3J0IHsgbWVtb2l6ZSB9IGZyb20gJy4uLy4uLy4uL1V0aWxzL01lbW9pemUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXlGaWx0ZXIge1xyXG4gIHJlYWRvbmx5IGlkOiBudW1iZXI7XHJcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IGlzRGVmYXVsdDogYm9vbGVhbjtcclxuICByZWFkb25seSBpc0dsb2JhbDogYm9vbGVhbjtcclxuICByZWFkb25seSBmaWx0ZXJTdGF0ZTogYW55IHwgbnVsbDtcclxufVxyXG5cclxuaW50ZXJmYWNlIElDb250cm9sRGlzcGxheUZpbHRlckR0byB7XHJcbiAgSWQ6IG51bWJlcjtcclxuICBOYW1lOiBzdHJpbmc7XHJcbiAgSXNEZWZhdWx0OiBib29sZWFuO1xyXG4gIElzR2xvYmFsOiBib29sZWFuO1xyXG4gIEZpbHRlclN0YXRlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zIHtcclxuICAvLyByZWFkb25seSBkZWZhdWx0T3BlbmVkRmlsdGVySWQ6IG51bWJlcjtcclxuICBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XHJcbiAgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xyXG59XHJcblxyXG50eXBlIENvbnRyb2xEaXNwbGF5RmlsdGVyVXBkYXRlcyA9IFBhcnRpYWw8UGljazxJQ29udHJvbERpc3BsYXlGaWx0ZXIsICduYW1lJyB8ICdmaWx0ZXJTdGF0ZScgfCAnaXNHbG9iYWwnPj47XHJcblxyXG5leHBvcnQgY2xhc3MgR3JpZEZpbHRlcnNNYW5hZ2VyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVEYXRhVXJsOiBzdHJpbmc7XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgX2N1cnJlbnRGaWx0ZXJJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgZmlsdGVyczogSUNvbnRyb2xEaXNwbGF5RmlsdGVyW10gfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0RmlsdGVyQnlJZEludGVybmFsID0gKGZpbHRlcklkOiBudW1iZXIpID0+IHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcnMgJiYgdGhpcy5maWx0ZXJzLmZpbmQoKHYpID0+IHYuaWQgPT09IGZpbHRlcklkKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXJCeUlkID0gbWVtb2l6ZSh0aGlzLmdldEZpbHRlckJ5SWRJbnRlcm5hbCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zKSB7XHJcbiAgICB0aGlzLmxvYWREYXRhVXJsID0gb3B0aW9ucy5sb2FkRGF0YVVybDtcclxuICAgIHRoaXMuaW5zZXJ0RGF0YVVybCA9IG9wdGlvbnMuaW5zZXJ0RGF0YVVybDtcclxuICAgIHRoaXMudXBkYXRlRGF0YVVybCA9IG9wdGlvbnMudXBkYXRlRGF0YVVybDtcclxuICAgIHRoaXMuZGVsZXRlRGF0YVVybCA9IG9wdGlvbnMuZGVsZXRlRGF0YVVybDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudEZpbHRlcigpIHtcclxuICAgIHJldHVybiB0aGlzLmdldEZpbHRlckJ5SWQodGhpcy5fY3VycmVudEZpbHRlcklkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudEZpbHRlcklkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRGaWx0ZXJJZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgY3VycmVudEZpbHRlcklkKGlkOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2N1cnJlbnRGaWx0ZXJJZCA9IGlkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEZpbHRlcnMoKTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlGaWx0ZXJbXT4ge1xyXG4gICAgaWYgKCF0aGlzLmZpbHRlcnMpIHtcclxuICAgICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVycygpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmZpbHRlcnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQ3VycmVudEZpbHRlcihmaWx0ZXJVcGRhdGVzOiBDb250cm9sRGlzcGxheUZpbHRlclVwZGF0ZXMpIHtcclxuICAgIHJldHVybiAhIXRoaXMuY3VycmVudEZpbHRlciAmJiB0aGlzLnVwZGF0ZUZpbHRlcih0aGlzLmN1cnJlbnRGaWx0ZXIuaWQsIGZpbHRlclVwZGF0ZXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNyZWF0ZU5ld0ZpbHRlcihmaWx0ZXJOYW1lOiBzdHJpbmcsIGZpbHRlclN0YXRlOiBhbnksIGlzRGVmYXVsdDogYm9vbGVhbiwgaXNHbG9iYWw6IGJvb2xlYW4pXHJcbiAgICA6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5RmlsdGVyPiB7XHJcbiAgICBsZXQgbmV3RmlsdGVyRHRvOiBJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG8gPSB0aGlzLm1hcEZpbHRlck1vZGVsVG9EdG8oe1xyXG4gICAgICBpZDogLTEsXHJcbiAgICAgIG5hbWU6IGZpbHRlck5hbWUsXHJcbiAgICAgIGlzRGVmYXVsdCxcclxuICAgICAgaXNHbG9iYWwsXHJcbiAgICAgIGZpbHRlclN0YXRlXHJcbiAgICB9KTtcclxuXHJcbiAgICBuZXdGaWx0ZXJEdG8gPSBhd2FpdCBzZW5kUmVxdWVzdDxJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG8+KHRoaXMuaW5zZXJ0RGF0YVVybCxcclxuICAgICAgJ1BPU1QnLCBuZXdGaWx0ZXJEdG8pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVycygpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLm1hcEZpbHRlckR0b1RvTW9kZWwobmV3RmlsdGVyRHRvKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVGaWx0ZXIoZmlsdGVySWQ6IG51bWJlciwgdXBkYXRlczogQ29udHJvbERpc3BsYXlGaWx0ZXJVcGRhdGVzKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmdldEZpbHRlckJ5SWQoZmlsdGVySWQpO1xyXG4gICAgaWYgKCFmaWx0ZXIpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHVwZGF0ZWRGaWx0ZXI6IElDb250cm9sRGlzcGxheUZpbHRlciA9IHtcclxuICAgICAgLi4uZmlsdGVyLFxyXG4gICAgICAuLi51cGRhdGVzXHJcbiAgICB9O1xyXG4gICAgbGV0IHVwZGF0ZWRGaWx0ZXJEdG86IElDb250cm9sRGlzcGxheUZpbHRlckR0byA9IHRoaXMubWFwRmlsdGVyTW9kZWxUb0R0byh1cGRhdGVkRmlsdGVyKTtcclxuXHJcbiAgICB1cGRhdGVkRmlsdGVyRHRvID0gYXdhaXQgc2VuZFJlcXVlc3Q8SUNvbnRyb2xEaXNwbGF5RmlsdGVyRHRvPih0aGlzLnVwZGF0ZURhdGFVcmwsXHJcbiAgICAgICdQVVQnLCB1cGRhdGVkRmlsdGVyRHRvKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZEZpbHRlcnMoKTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBkZWxldGVGaWx0ZXIoZmlsdGVySWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy5nZXRGaWx0ZXJCeUlkKGZpbHRlcklkKTtcclxuICAgIGlmICghZmlsdGVyKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCBzZW5kUmVxdWVzdCh0aGlzLmRlbGV0ZURhdGFVcmwsICdERUxFVEUnLCB7IGZpbHRlcklkIH0pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVycygpO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBsb2FkRmlsdGVycygpIHtcclxuICAgIGNvbnN0IGZpbHRlcnMgPSBhd2FpdCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbjxJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG9bXT4odGhpcy5sb2FkRGF0YVVybCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJzID0gZmlsdGVycy5tYXAoKGR0bykgPT4gdGhpcy5tYXBGaWx0ZXJEdG9Ub01vZGVsKGR0bykpO1xyXG4gICAgLy8gTk9URTogcmVzZXQgbWVtb2l6ZVxyXG4gICAgdGhpcy5yZXNldENhY2hlZFJlc3VsdE9mR2V0RmlsdGVyQnlJZEZ1bmN0aW9uKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVycztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwRmlsdGVyTW9kZWxUb0R0byhtb2RlbDogSUNvbnRyb2xEaXNwbGF5RmlsdGVyKTogSUNvbnRyb2xEaXNwbGF5RmlsdGVyRHRvIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIElkOiBtb2RlbC5pZCxcclxuICAgICAgTmFtZTogbW9kZWwubmFtZSxcclxuICAgICAgSXNEZWZhdWx0OiBtb2RlbC5pc0RlZmF1bHQsXHJcbiAgICAgIElzR2xvYmFsOiBtb2RlbC5pc0dsb2JhbCxcclxuICAgICAgRmlsdGVyU3RhdGU6IEpTT04uc3RyaW5naWZ5KG1vZGVsLmZpbHRlclN0YXRlKVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwRmlsdGVyRHRvVG9Nb2RlbChkdG86IElDb250cm9sRGlzcGxheUZpbHRlckR0byk6IElDb250cm9sRGlzcGxheUZpbHRlciB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpZDogZHRvLklkLFxyXG4gICAgICBuYW1lOiBkdG8uTmFtZSxcclxuICAgICAgaXNEZWZhdWx0OiBkdG8uSXNEZWZhdWx0IHx8IGZhbHNlLFxyXG4gICAgICBpc0dsb2JhbDogZHRvLklzR2xvYmFsIHx8IGZhbHNlLFxyXG4gICAgICBmaWx0ZXJTdGF0ZTogSlNPTi5wYXJzZShkdG8uRmlsdGVyU3RhdGUpXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldENhY2hlZFJlc3VsdE9mR2V0RmlsdGVyQnlJZEZ1bmN0aW9uKCkge1xyXG4gICAgdGhpcy5nZXRGaWx0ZXJCeUlkID0gbWVtb2l6ZSh0aGlzLmdldEZpbHRlckJ5SWRJbnRlcm5hbCk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBHcmlkRmlsdGVyc01hbmFnZXIsIElDb250cm9sRGlzcGxheUZpbHRlciwgSUdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnMgfSBmcm9tICcuL0dyaWRGaWx0ZXJzTWFuYWdlcic7XHJcbmltcG9ydCB7IENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlciB9IGZyb20gJy4vQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyJztcclxuaW1wb3J0IG5vdGlmeSBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL05vdGlmeSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnRPcHRpb25zIHtcclxuICByZWFkb25seSBvd25lcjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlcjogR3JpZEZpbHRlcnNNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGFwc0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlcjogQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGF1dG9JbnRlZ3JhdGlvbjogYm9vbGVhbjtcclxuICByZWFkb25seSBvbkZpbHRlckFwcGxpZWQ/OiAoZmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcclxuICByZWFkb25seSBvbkZpbHRlckRlbGV0ZWQ/OiAoZmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcclxuICByZWFkb25seSBjYW5DcmVhdGVHbG9iYWxGaWx0ZXJzOiBib29sZWFuO1xyXG4gIHJlYWRvbmx5IHZpc2libGU6IGJvb2xlYW47XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50RGVmYXVsdE9wdGlvbnMge1xyXG4gIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlcjogR3JpZEZpbHRlcnNNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnM6IElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zO1xyXG4gIHJlYWRvbmx5IGF1dG9JbnRlZ3JhdGlvbjogYm9vbGVhbjtcclxufVxyXG5cclxudHlwZSBNdXRhYmxlPFQ+ID0ge1xyXG4gIC1yZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXTtcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMgPVxyXG4gIE11dGFibGU8T21pdDxJR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50T3B0aW9ucywga2V5b2YgSUdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudERlZmF1bHRPcHRpb25zPj4gJlxyXG4gIE11dGFibGU8UGFydGlhbDxJR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50RGVmYXVsdE9wdGlvbnM+PjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQge1xyXG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBJR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50T3B0aW9ucztcclxuICAvLyB0b29sYmFyIGl0ZW1zXHJcbiAgLy8gdHNsaW50OmRpc2FibGUgdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgX2ZpbHRlcnNUb29sYmFySXRlbTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHwgdW5kZWZpbmVkO1xyXG4gIC8vIHRzbGludDplbmFibGUgdmFyaWFibGUtbmFtZVxyXG5cclxuICAvLyB0b29sYmFyIHdpZGdldHNcclxuICBwcml2YXRlIGZpbHRlcnNEcm9wZG93bkJveDogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgZmlsdGVyc0RhdGFHcmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBjdXJyZW50RmlsdGVyVGl0bGU6IERldkV4cHJlc3MudWkuZHhUZXh0Qm94IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgbmV3RmlsdGVyQnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHwgdW5kZWZpbmVkO1xyXG4gIC8vIHdpZGdldHNcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZSB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfZmlsdGVyUG9wdXA6IERldkV4cHJlc3MudWkuZHhQb3B1cCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGZpbHRlck5hbWVUZXh0Qm94OiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGZpbHRlckJ1aWxkZXI6IERldkV4cHJlc3MudWkuZHhGaWx0ZXJCdWlsZGVyIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsdGVyRXhwcmVzc2lvbkNhbGN1bGF0b3I6IERldkV4cHJlc3MudWkuZHhGaWx0ZXJCdWlsZGVyO1xyXG4gIHByaXZhdGUgZmlsdGVySXNHbG9iYWxDaGVja2JveDogRGV2RXhwcmVzcy51aS5keENoZWNrQm94IHwgdW5kZWZpbmVkO1xyXG4gIC8vIHRzbGludDplbmFibGUgdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgaXNJbkZpbHRlckFwcGx5aW5nID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IHtcclxuICAgICAgLi4ub3B0aW9ucyxcclxuICAgICAgZ3JpZEZpbHRlcnNNYW5hZ2VyOiBvcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlclxyXG4gICAgICAgID8gb3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXJcclxuICAgICAgICA6IG5ldyBHcmlkRmlsdGVyc01hbmFnZXIob3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zKSxcclxuICAgICAgYXV0b0ludGVncmF0aW9uOiAob3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAhPT0gbnVsbClcclxuICAgICAgICA/IG9wdGlvbnMuYXV0b0ludGVncmF0aW9uIDogdHJ1ZVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLm9wdGlvbnMuYXV0b0ludGVncmF0aW9uICYmIHRoaXMuaW50ZWdyYXRlVG9HcmlkKHRoaXMub3B0aW9ucy5vd25lcik7XHJcbiAgICB0aGlzLmZpbHRlckV4cHJlc3Npb25DYWxjdWxhdG9yID0gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keEZpbHRlckJ1aWxkZXIoe1xyXG4gICAgICAgIGZpZWxkczogdGhpcy5nZXRGbGF0Q29sdW1uc0xpc3QodGhpcy5vcHRpb25zLm93bmVyLm9wdGlvbignY29sdW1ucycpKVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhGaWx0ZXJCdWlsZGVyKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHRyeUFwcGx5RmlsdGVyKGZpbHRlcklkOiBudW1iZXIgfCB1bmRlZmluZWQpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IGlzQ2FuQmVGaWx0ZXJBcHBsaWVkID0gYXdhaXQgdGhpcy5jb25maXJtQ2hhbmdlc0xvc3MoKTtcclxuXHJcbiAgICBpZiAoaXNDYW5CZUZpbHRlckFwcGxpZWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5hcHBseUZpbHRlcihmaWx0ZXJJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzQ2FuQmVGaWx0ZXJBcHBsaWVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGFwcGx5RmlsdGVyKGZpbHRlcklkOiBudW1iZXIgfCB1bmRlZmluZWQsIGRlZmVycmVkTG9hZGluZyA9IGZhbHNlKSB7XHJcbiAgICAvLyBOT1RFOiBJZiB3ZSBjaGFuZ2UgdGhlIGZpbHRlciwgdGhlIGdyaWQgd2lsbCBiZSByZWxvYWRlZCBpbiB0aGUgZmlsdGVyc0Ryb3Bkb3duQm94Lm9uVmFsdWVDaGFuZ2VkXHJcbiAgICAvLyBjb25zdCBmaWx0ZXJDaGFuZ2VkID0gdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQgIT09IGZpbHRlcklkO1xyXG4gICAgdGhpcy5pc0luRmlsdGVyQXBwbHlpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQgPSBmaWx0ZXJJZDtcclxuICAgIHRoaXMudXBkYXRlRmlsdGVyUG9wdXBDb250ZW50KHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcik7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3gub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkKTtcclxuXHJcbiAgICBsZXQgZ3JpZERhdGFTb3VyY2UgPSB0aGlzLm9wdGlvbnMub3duZXIuZ2V0RGF0YVNvdXJjZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIpIHtcclxuICAgICAgLy8gTk9URTogbmVlZCB0byBwcm9jZXNzIGZpbHRlciB2YWx1ZSBieSB0aGUgZ2V0RmlsdGVyRXhwcmVzc2lvbiBtZXRob2RcclxuICAgICAgLy8gdG8gYmUgc3VyZSBpdCB3aWxsIHdvcmsgaW4gZGF0YXNvdXJjZSAoZm9yIGV4YW1wbGUsIHRoZSAnYmV0d2VlbicgY29uZGl0aW9uKVxyXG4gICAgICAvLyB3aWxsIGJlIG1vZGlmaWVkIHRvIFwiPj0gYW5kIDw9XCIgYmVjYXVzZSBkYXRhIHNvdXJjZSBkb2Vzbid0IHN1cHBvcnQgJ2JldHdlZW4nLlxyXG5cclxuICAgICAgdGhpcy5maWx0ZXJFeHByZXNzaW9uQ2FsY3VsYXRvci5vcHRpb24oJ3ZhbHVlJywgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyLmZpbHRlclN0YXRlKTtcclxuICAgICAgY29uc3QgdmFsID0gdGhpcy5maWx0ZXJFeHByZXNzaW9uQ2FsY3VsYXRvci5nZXRGaWx0ZXJFeHByZXNzaW9uKCk7XHJcblxyXG4gICAgICBpZiAoZ3JpZERhdGFTb3VyY2UuaXNMb2FkaW5nKCkpIHtcclxuICAgICAgICBjb25zdCBhcHBseVZhbHVlID0gKCkgPT4ge1xyXG4gICAgICAgICAgZ3JpZERhdGFTb3VyY2Uub2ZmKCdsb2FkaW5nQ2hhbmdlZCcsIGFwcGx5VmFsdWUpO1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGdyaWREYXRhU291cmNlID0gdGhpcy5vcHRpb25zLm93bmVyLmdldERhdGFTb3VyY2UoKTtcclxuICAgICAgICAgICAgZ3JpZERhdGFTb3VyY2UuZmlsdGVyKHZhbCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBncmlkRGF0YVNvdXJjZS5vbignbG9hZGluZ0NoYW5nZWQnLCBhcHBseVZhbHVlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBncmlkRGF0YVNvdXJjZS5maWx0ZXIodmFsKTtcclxuICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdyaWREYXRhU291cmNlLmZpbHRlcihudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiAoIWZpbHRlckNoYW5nZWQpIHtcclxuICAgIGlmICghZGVmZXJyZWRMb2FkaW5nKSB7XHJcbiAgICAgIGF3YWl0IGdyaWREYXRhU291cmNlLmxvYWQoKTtcclxuICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICB0aGlzLm9wdGlvbnMub25GaWx0ZXJBcHBsaWVkICYmIHRoaXMub3B0aW9ucy5vbkZpbHRlckFwcGxpZWQoZmlsdGVySWQpO1xyXG4gICAgdGhpcy5pc0luRmlsdGVyQXBwbHlpbmcgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW50ZWdyYXRlVG9HcmlkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gICAgY29uc3QgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgPSBncmlkLm9wdGlvbignb25Ub29sYmFyUHJlcGFyaW5nJyk7XHJcblxyXG4gICAgZ3JpZC5vcHRpb24oJ29uVG9vbGJhclByZXBhcmluZycsIChlOiBhbnkpID0+IHtcclxuICAgICAgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgJiYgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcoZSk7XHJcbiAgICAgIHRoaXMub25HcmlkVG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkdyaWRUb29sYmFyUHJlcGFyaW5nOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydvblRvb2xiYXJQcmVwYXJpbmcnXSA9IChlKSA9PiB7XHJcbiAgICBjb25zdCB0b29sYmFySXRlbXMgPSBlLnRvb2xiYXJPcHRpb25zICYmIGUudG9vbGJhck9wdGlvbnMuaXRlbXM7XHJcbiAgICBpZiAoIXRvb2xiYXJJdGVtcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdG9vbGJhckl0ZW1zLnNwbGljZSgxLCAwLFxyXG4gICAgICB0aGlzLmZpbHRlcnNUb29sYmFySXRlbVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGZpbHRlcnNUb29sYmFySXRlbSgpIHtcclxuICAgIGlmICghdGhpcy5fZmlsdGVyc1Rvb2xiYXJJdGVtKSB7XHJcbiAgICAgIHRoaXMuX2ZpbHRlcnNUb29sYmFySXRlbSA9IHRoaXMuY3JlYXRlRmlsdGVyc1Rvb2xiYXJJdGVtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlcnNUb29sYmFySXRlbTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGZpbHRlclBvcHVwKCkge1xyXG4gICAgaWYgKCF0aGlzLl9maWx0ZXJQb3B1cCkge1xyXG4gICAgICB0aGlzLl9maWx0ZXJQb3B1cCA9IHRoaXMuY3JlYXRlRmlsdGVyUG9wdXAoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyUG9wdXA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBoYXNDaGFuZ2VzKCkge1xyXG4gICAgY29uc3QgY3VycmVudEZpbHRlciA9IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcjtcclxuXHJcbiAgICBjb25zdCBuZXdOYW1lID0gdGhpcy5maWx0ZXJOYW1lVGV4dEJveCAmJiB0aGlzLmZpbHRlck5hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IG9sZE5hbWUgPSBjdXJyZW50RmlsdGVyICYmIGN1cnJlbnRGaWx0ZXIubmFtZTtcclxuXHJcbiAgICBjb25zdCBuZXdGaWx0ZXIgPSB0aGlzLmZpbHRlckJ1aWxkZXIgJiYgdGhpcy5maWx0ZXJCdWlsZGVyLm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IG9sZEZpbHRlciA9IGN1cnJlbnRGaWx0ZXIgJiYgY3VycmVudEZpbHRlci5maWx0ZXJTdGF0ZTtcclxuXHJcbiAgICBjb25zdCBuZXdJc0dsb2JhbCA9IHRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveCAmJiB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCd2YWx1ZScpO1xyXG4gICAgY29uc3Qgb2xkSXNHbG9iYWwgPSBjdXJyZW50RmlsdGVyICYmIGN1cnJlbnRGaWx0ZXIuaXNHbG9iYWw7XHJcblxyXG4gICAgcmV0dXJuIG5ld05hbWUgIT09IG9sZE5hbWUgfHwgbmV3RmlsdGVyICE9PSBvbGRGaWx0ZXIgfHwgbmV3SXNHbG9iYWwgIT09IG9sZElzR2xvYmFsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJzVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHtcclxuICAgIGxldCBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHdpZGdldDogJ2R4RHJvcERvd25Cb3gnIGFzIGFueSxcclxuICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgIHRleHQ6ICdEYXRhIFNldHMnLFxyXG4gICAgICB2aXNpYmxlOiB0aGlzLm9wdGlvbnMudmlzaWJsZSxcclxuICAgICAgY3NzQ2xhc3M6ICdhcHMtZmlsdGVyc19fdG9vbGJhci1pdGVtJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdpc3pvbGVhLW1kJ30sXHJcbiAgICAgICAgdmFsdWU6IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkLFxyXG4gICAgICAgIHZhbHVlRXhwcjogJ2lkJyxcclxuICAgICAgICBkaXNwbGF5RXhwcjogJ25hbWUnLFxyXG4gICAgICAgIHNob3dDbGVhckJ1dHRvbjogdHJ1ZSxcclxuICAgICAgICBwbGFjZWhvbGRlcjogJ05vbmUnLFxyXG4gICAgICAgIHdpZHRoOiAyMDAsXHJcbiAgICAgICAgZHJvcERvd25PcHRpb25zOiB7XHJcbiAgICAgICAgICB3aWR0aDogNTAwXHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkluaXRpYWxpemVkOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3ggPSBlLmNvbXBvbmVudDtcclxuICAgICAgICAgIGNvbnN0IFssIHVzZXJTZXR0aW5nc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXHJcbiAgICAgICAgICAgIHRoaXMubG9hZEZpbHRlckRyb3Bkb3duQm94RGF0YSgpLFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXBzQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyLmdldFVzZXJTZXR0aW5ncygpXHJcbiAgICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgICB1c2VyU2V0dGluZ3MuZGVmYXVsdEZpbHRlcklkICYmIGUuY29tcG9uZW50Lm9wdGlvbigndmFsdWUnLCB1c2VyU2V0dGluZ3MuZGVmYXVsdEZpbHRlcklkKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uVmFsdWVDaGFuZ2VkOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuaXNJbkZpbHRlckFwcGx5aW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoIWlzTmVlZEhhbmRsZVZhbHVlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxldCB2YWx1ZSA9IGUudmFsdWU7XHJcbiAgICAgICAgICBjb25zdCBpc0ZpbHRlckFwcGxpZWQgPSBhd2FpdCB0aGlzLnRyeUFwcGx5RmlsdGVyKHZhbHVlKTtcclxuXHJcbiAgICAgICAgICBpZiAoIWlzRmlsdGVyQXBwbGllZCkge1xyXG4gICAgICAgICAgICBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdmFsdWUgPSBlLnByZXZpb3VzVmFsdWU7XHJcbiAgICAgICAgICAgIGUuY29tcG9uZW50Lm9wdGlvbigndmFsdWUnLCB2YWx1ZSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5maWx0ZXJzRGF0YUdyaWQgJiYgdGhpcy5maWx0ZXJzRGF0YUdyaWQuc2VsZWN0Um93cyh2YWx1ZSwgZmFsc2UpO1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50RmlsdGVyVGl0bGUgJiYgdGhpcy5jdXJyZW50RmlsdGVyVGl0bGUub3B0aW9uKCd2YWx1ZScsXHJcbiAgICAgICAgICAgIGUuY29tcG9uZW50Lm9wdGlvbigndGV4dCcpIHx8IGUuY29tcG9uZW50Lm9wdGlvbigncGxhY2Vob2xkZXInKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbk9wZW5lZDogKGUpID0+IHtcclxuICAgICAgICAgIGlmICghZS5jb21wb25lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuZmlsdGVyc0RhdGFHcmlkICYmIHRoaXMuZmlsdGVyc0RhdGFHcmlkLnNlbGVjdFJvd3MoZS5jb21wb25lbnQub3B0aW9uKCd2YWx1ZScpLCBmYWxzZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb250ZW50VGVtcGxhdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWUuY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmZpbHRlcnNEYXRhR3JpZCA9IHRoaXMuY3JlYXRlRmlsdGVyc0RhdGFHcmlkKGUuY29tcG9uZW50KTtcclxuICAgICAgICAgIHRoaXMuY3VycmVudEZpbHRlclRpdGxlID0gdGhpcy5jcmVhdGVDdXJyZW50RmlsdGVyVGl0bGUoZS5jb21wb25lbnQpO1xyXG4gICAgICAgICAgdGhpcy5uZXdGaWx0ZXJCdXR0b24gPSB0aGlzLmNyZWF0ZU5ld0ZpbHRlckJ1dHRvbigpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udGVudEhlYWRlciA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAuYWRkQ2xhc3MoJ2Fwcy1maWx0ZXJzX19oZWFkZXInKVxyXG4gICAgICAgICAgICAuYXBwZW5kKHRoaXMuY3VycmVudEZpbHRlclRpdGxlLmVsZW1lbnQoKSlcclxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLm5ld0ZpbHRlckJ1dHRvbi5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udGVudCA9ICQoJzxkaXYgLz4nKS5jc3MoJ2hlaWdodCcsICcxMDAlJylcclxuICAgICAgICAgICAgLmFwcGVuZChkcm9wZG93bkNvbnRlbnRIZWFkZXIpXHJcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy5maWx0ZXJzRGF0YUdyaWQuZWxlbWVudCgpKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gZHJvcGRvd25Db250ZW50O1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94T3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyc0RhdGFHcmlkKGRyb3Bkb3duQm94T3duZXI6IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveCk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keERhdGFHcmlkKHtcclxuICAgICAgICBkYXRhU291cmNlOiBkcm9wZG93bkJveE93bmVyLmdldERhdGFTb3VyY2UoKSxcclxuICAgICAgICByZW1vdGVPcGVyYXRpb25zOiBmYWxzZSxcclxuICAgICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgICBhbGxvd0FkZGluZzogZmFsc2UsXHJcbiAgICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgYWxsb3dEZWxldGluZzogdHJ1ZSxcclxuICAgICAgICAgIG1vZGU6ICdjZWxsJyxcclxuICAgICAgICAgIHVzZUljb25zOiB0cnVlLFxyXG4gICAgICAgICAgdGV4dHM6IHtcclxuICAgICAgICAgICAgY29uZmlybURlbGV0ZU1lc3NhZ2U6ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgZGF0YSBzZXQ/J1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd29yZFdyYXBFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnbmFtZScsXHJcbiAgICAgICAgICAgIGFsbG93RWRpdGluZzogZmFsc2VcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ2lzRGVmYXVsdCcsXHJcbiAgICAgICAgICAgIGNhcHRpb246ICdJcyBEZWZhdWx0JyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdib29sZWFuJyxcclxuICAgICAgICAgICAgd2lkdGg6IDgwLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnaXNHbG9iYWwnLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiAnSXMgR2xvYmFsJyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdib29sZWFuJyxcclxuICAgICAgICAgICAgd2lkdGg6IDcwXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0eXBlOiAnYnV0dG9ucycsXHJcbiAgICAgICAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpY29uOiAnZWRpdCcsXHJcbiAgICAgICAgICAgICAgICBoaW50OiAnRWRpdCcsXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoIWUucm93IHx8ICFlLnJvdy5rZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRmlsdGVyQXBwbGllZCA9IGF3YWl0IHRoaXMudHJ5QXBwbHlGaWx0ZXIoZS5yb3cua2V5KTtcclxuICAgICAgICAgICAgICAgICAgaXNGaWx0ZXJBcHBsaWVkICYmICF0aGlzLmZpbHRlclBvcHVwLm9wdGlvbigndmlzaWJsZScpXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5vcGVuRWRpdEZpbHRlclBvcHVwKHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAnZGVsZXRlJ1xyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXSxcclxuICAgICAgICBrZXlib2FyZE5hdmlnYXRpb246IHtcclxuICAgICAgICAgIGVkaXRPbktleVByZXNzOiBmYWxzZSxcclxuICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzaG93Q29sdW1uSGVhZGVyczogdHJ1ZSxcclxuICAgICAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBmb2N1c2VkUm93RW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgc2hvd0JvcmRlcnM6IGZhbHNlLFxyXG4gICAgICAgIHNob3dDb2x1bW5MaW5lczogZmFsc2UsXHJcbiAgICAgICAgc2VsZWN0aW9uOiB7IG1vZGU6ICdzaW5nbGUnIH0sXHJcbiAgICAgICAgaGVpZ2h0OiAnY2FsYygxMDAlIC0gNTFweCknLFxyXG4gICAgICAgIHNjcm9sbGluZzogeyBtb2RlOiAnc3RhbmRhcmQnIH0sXHJcbiAgICAgICAgcGFnaW5nOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXHJcbiAgICAgICAgbm9EYXRhVGV4dDogJ05vIGRhdGEgc2V0cycsXHJcbiAgICAgICAgb25TZWxlY3Rpb25DaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3ZhbHVlJywgZS5zZWxlY3RlZFJvd0tleXMgPyBlLnNlbGVjdGVkUm93S2V5c1swXSA6IG51bGwpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25FZGl0b3JQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZS5kYXRhRmllbGQgPT09ICdpc0dsb2JhbCcpIHtcclxuICAgICAgICAgICAgZS5lZGl0b3JPcHRpb25zLmRpc2FibGVkID0gIXRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxGaWx0ZXJzO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgb25WYWx1ZUNoYW5nZWQgPSBlLmVkaXRvck9wdGlvbnMub25WYWx1ZUNoYW5nZWQ7XHJcbiAgICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZCA9IGFzeW5jIChvcHQpID0+IHtcclxuICAgICAgICAgICAgICBlLmNvbXBvbmVudC5iZWdpbkN1c3RvbUxvYWRpbmcoJ1VwZGF0aW5nJyk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci51cGRhdGVGaWx0ZXIoZS5yb3cuZGF0YS5pZCwgeyBpc0dsb2JhbDogb3B0LnZhbHVlIH0pO1xyXG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQob3B0KTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQ2VsbFByZXBhcmVkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGUuY29sdW1uLnR5cGUgIT09ICdidXR0b25zJyB8fCAhZS5kYXRhKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChlLmNvbHVtbi50eXBlID09PSAnYnV0dG9ucycpIHtcclxuICAgICAgICAgICAgY29uc3QgZW5hYmxlZCA9ICFlLmRhdGEuaXNHbG9iYWxcclxuICAgICAgICAgICAgICB8fCAoZS5kYXRhLmlzR2xvYmFsICYmIHRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxGaWx0ZXJzKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgIEFycmF5LmZyb20oZS5jZWxsRWxlbWVudC5jaGlsZHJlbigpKS5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAkKGMpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiAnI2RkZCAhaW1wb3J0YW50JyxcclxuICAgICAgICAgICAgICAgICAgY3Vyc29yOiAnZGVmYXVsdCdcclxuICAgICAgICAgICAgICAgIH0pLm9mZignY2xpY2snKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25Sb3dVcGRhdGluZzogKGUpID0+IHtcclxuICAgICAgICAgIGlmICghZS5rZXkgfHwgZS5uZXdEYXRhLmlzRGVmYXVsdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBkZWZhdWx0RmlsdGVyID0gZS5jb21wb25lbnQuZ2V0RGF0YVNvdXJjZSgpLml0ZW1zKCkuZmluZCgoZmlsdGVyKSA9PiBmaWx0ZXIuaXNEZWZhdWx0KTtcclxuICAgICAgICAgIGlmIChkZWZhdWx0RmlsdGVyKSB7XHJcbiAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXIuaXNEZWZhdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmFwc0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlci51cGRhdGVVc2VyU2V0dGluZ3Moe1xyXG4gICAgICAgICAgICBkZWZhdWx0RmlsdGVySWQ6IGUubmV3RGF0YS5pc0RlZmF1bHQgPyBlLmtleSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvblJvd1JlbW92aW5nOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFlLmtleSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5kZWxldGVGaWx0ZXIoZS5rZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmR4RGF0YUdyaWQoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUN1cnJlbnRGaWx0ZXJUaXRsZShkcm9wZG93bkJveE93bmVyOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3gpOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLWZpbHRlcnNfX2N1cnJlbnQtZmlsdGVyJylcclxuICAgICAgLmR4VGV4dEJveCh7XHJcbiAgICAgICAgdmFsdWU6IGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCd0ZXh0JykgfHwgZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3BsYWNlaG9sZGVyJyksXHJcbiAgICAgICAgcmVhZE9ubHk6IHRydWVcclxuICAgICAgfSlcclxuICAgICAgLmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTmV3RmlsdGVyQnV0dG9uKCk6IERldkV4cHJlc3MudWkuZHhCdXR0b24ge1xyXG4gICAgcmV0dXJuICQoJzxidXR0b24gLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy1maWx0ZXJzX19hZGQtbmV3LWZpbHRlciBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICB0ZXh0OiAnTmV3IERhdGEgU2V0JyxcclxuICAgICAgICB0eXBlOiAnbm9ybWFsJyxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9wZW5OZXdGaWx0ZXJQb3B1cCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaWNvbjogJ3BsdXMnXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyUG9wdXAoKSB7XHJcbiAgICBjb25zdCAkcG9wdXBSb290ID0gJCgnPGRpdiAvPicpLmFwcGVuZFRvKCdib2R5Jyk7XHJcbiAgICBsZXQgaXNQb3B1cEhpZGluZ0NvbmZpcm1lZCA9IGZhbHNlO1xyXG5cclxuICAgIHJldHVybiAkcG9wdXBSb290LmR4UG9wdXAoe1xyXG4gICAgICBjb250YWluZXI6IHRoaXMub3B0aW9ucy5vd25lci5lbGVtZW50KCksXHJcbiAgICAgIHNoYWRpbmc6IGZhbHNlLFxyXG4gICAgICByZXNpemVFbmFibGVkOiB0cnVlLFxyXG4gICAgICB3aWR0aDogNjUwLFxyXG4gICAgICBoZWlnaHQ6IDUwMCxcclxuICAgICAgb25TaG93aW5nOiAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94ICYmIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94LmNsb3NlKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uSGlkaW5nOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5oYXNDaGFuZ2VzIHx8IGlzUG9wdXBIaWRpbmdDb25maXJtZWQpIHtcclxuICAgICAgICAgIGlzUG9wdXBIaWRpbmdDb25maXJtZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlLmNhbmNlbCA9IHRydWU7XHJcbiAgICAgICAgaXNQb3B1cEhpZGluZ0NvbmZpcm1lZCA9IGF3YWl0IHRoaXMuY29uZmlybUNoYW5nZXNMb3NzKCk7XHJcbiAgICAgICAgaWYgKGlzUG9wdXBIaWRpbmdDb25maXJtZWQpIHtcclxuICAgICAgICAgIGUuY29tcG9uZW50LmhpZGUoKTtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94ICYmIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94Lm9wZW4oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pLmR4UG9wdXAoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbHRlck5hbWVUZXh0Qm94KCkge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKVxyXG4gICAgICAuZHhUZXh0Qm94KHtcclxuICAgICAgICBwbGFjZWhvbGRlcjogJ0VudGVyIERhdGEgU2V0IE5hbWUuLi4nLFxyXG4gICAgICB9KVxyXG4gICAgICAuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJJc0dsb2JhbENoZWNrYm94KCkge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKVxyXG4gICAgICAuZHhDaGVja0JveCh7XHJcbiAgICAgICAgdGV4dDogJ0dsb2JhbCBkYXRhIHNldCcsXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keENoZWNrQm94KCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGbGF0Q29sdW1uc0xpc3Qoc291cmNlQ29sdW1ucywgLi4ucmVzdCkge1xyXG4gICAgbGV0IHJlc3VsdCA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3Qgc291cmNlQ29sdW1uIG9mIHNvdXJjZUNvbHVtbnMpIHtcclxuICAgICAgaWYgKHNvdXJjZUNvbHVtbi5jb2x1bW5zICYmIHNvdXJjZUNvbHVtbi5jb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCBuZXN0ZWRDb2x1bW5zID0gdGhpcy5nZXRGbGF0Q29sdW1uc0xpc3Qoc291cmNlQ29sdW1uLmNvbHVtbnMpO1xyXG5cclxuICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KG5lc3RlZENvbHVtbnMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbiA9ICQuZXh0ZW5kKHt9LCBzb3VyY2VDb2x1bW4pO1xyXG5cclxuICAgICAgICBpZiAoY29sdW1uLmRhdGFUeXBlID09PSAnZGF0ZScgfHwgY29sdW1uLmRhdGFUeXBlID09PSAnZGF0ZXRpbWUnKSB7XHJcbiAgICAgICAgICBjb25zdCBpc0RhdGVUaW1lID0gY29sdW1uLmRhdGFUeXBlID09PSAnZGF0ZXRpbWUnO1xyXG4gICAgICAgICAgY29uc3QgZGF0ZUZvcm1hdCA9ICdkZCBNTU0geXknO1xyXG4gICAgICAgICAgY29uc3QgZGF0ZVRpbWVGb3JtYXQgPSAnaGg6bW0sIGRkIE1NTSB5eSc7XHJcbiAgICAgICAgICBjb25zdCBkaXNwbGF5Rm9ybWF0ID0gaXNEYXRlVGltZSA/IGRhdGVUaW1lRm9ybWF0IDogZGF0ZUZvcm1hdDtcclxuXHJcbiAgICAgICAgICBjb25zdCBwYXJzZURhdGVUaW1lID0gKGRhdGVTdHI6IHN0cmluZyk6IERhdGUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlVGltZVBhcnRzID0gZGF0ZVN0ci5zcGxpdCgnLCAnKTtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IERldkV4cHJlc3MubG9jYWxpemF0aW9uLnBhcnNlRGF0ZShkYXRlVGltZVBhcnRzWzFdLCBkYXRlRm9ybWF0KSB8fCBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRhdGUpIHtcclxuICAgICAgICAgICAgICBjb25zdCB0aW1lUGFydHMgPSBkYXRlVGltZVBhcnRzWzBdLnNwbGl0KCc6Jyk7XHJcblxyXG4gICAgICAgICAgICAgIGRhdGUuc2V0SG91cnMocGFyc2VJbnQodGltZVBhcnRzWzBdKSk7XHJcbiAgICAgICAgICAgICAgZGF0ZS5zZXRNaW51dGVzKHBhcnNlSW50KHRpbWVQYXJ0c1sxXSkpO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gZGF0ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBjb2x1bW4uZm9ybWF0ID0gZGlzcGxheUZvcm1hdDtcclxuICAgICAgICAgIGNvbHVtbi5lZGl0b3JUZW1wbGF0ZSA9IChlKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAkKCc8ZGl2IC8+JykuZHhEYXRlQm94KHtcclxuICAgICAgICAgICAgICBkaXNwbGF5Rm9ybWF0LFxyXG4gICAgICAgICAgICAgIHR5cGU6IGlzRGF0ZVRpbWUgPyAnZGF0ZXRpbWUnIDogJ2RhdGUnLFxyXG4gICAgICAgICAgICAgIHdpZHRoOiAxNTAsXHJcbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6ICh7IHZhbHVlIH0pID0+IHtcclxuICAgICAgICAgICAgICAgIGUuc2V0VmFsdWUoRGV2RXhwcmVzcy5sb2NhbGl6YXRpb24uZm9ybWF0RGF0ZSh2YWx1ZSwgZGlzcGxheUZvcm1hdCkpO1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgdmFsdWU6IChpc0RhdGVUaW1lID8gcGFyc2VEYXRlVGltZShlLnZhbHVlKSA6IERldkV4cHJlc3MubG9jYWxpemF0aW9uLnBhcnNlRGF0ZShlLnZhbHVlLCBkaXNwbGF5Rm9ybWF0KSlcclxuICAgICAgICAgICAgICAgIHx8IG51bGxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgY29sdW1uLmZpbHRlck9wZXJhdGlvbnMgPSBbJz0nLCAnPD4nLCAnPCcsICc+JywgJzw9JywgJz49JywgJ2lzYmxhbmsnLCAnaXNub3RibGFuayddO1xyXG4gICAgICAgICAgY29sdW1uLmNhbGN1bGF0ZUZpbHRlckV4cHJlc3Npb24gPSBmdW5jdGlvbihmaWx0ZXJWYWx1ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBhcmdzID0gW3NvdXJjZUNvbHVtbnMsIC4uLnJlc3RdO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFyZ3NbMF0pIHtcclxuICAgICAgICAgICAgICBpZiAoaXNEYXRlVGltZSkge1xyXG4gICAgICAgICAgICAgICAgYXJnc1swXSA9IHBhcnNlRGF0ZVRpbWUoYXJnc1swXSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFyZ3NbMF0gPSBEZXZFeHByZXNzLmxvY2FsaXphdGlvbi5wYXJzZURhdGUoZmlsdGVyVmFsdWUsIGRpc3BsYXlGb3JtYXQpIHx8IG51bGw7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0Q2FsY3VsYXRlRmlsdGVyRXhwcmVzc2lvbiguLi5hcmdzKTtcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXN1bHQucHVzaChjb2x1bW4pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdC5zb3J0KChjb2wxLCBjb2wyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhcHRpb24xID0gKGNvbDEuY2FwdGlvbiB8fCAnJykudG9Mb3dlckNhc2UoKTtcclxuICAgICAgY29uc3QgY2FwdGlvbjIgPSAoY29sMi5jYXB0aW9uIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgICAgaWYgKGNhcHRpb24xIDwgY2FwdGlvbjIpIHtcclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjYXB0aW9uMSA+IGNhcHRpb24yKSB7XHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbHRlckJ1aWxkZXIoKSB7XHJcbiAgICBjb25zdCBmaWx0ZXJCdWlsZGVyID0gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keEZpbHRlckJ1aWxkZXIoe1xyXG4gICAgICAgIGZpZWxkczogdGhpcy5nZXRGbGF0Q29sdW1uc0xpc3QodGhpcy5vcHRpb25zLm93bmVyLm9wdGlvbignY29sdW1ucycpKVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhGaWx0ZXJCdWlsZGVyKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHJldHVybiBmaWx0ZXJCdWlsZGVyO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJQb3B1cENvbnRlbnQoZmlsdGVyPzogSUNvbnRyb2xEaXNwbGF5RmlsdGVyKSB7XHJcbiAgICBjb25zdCAkcG9wdXBDb250ZW50ID0gJCgnPGRpdiAvPicpLmhlaWdodCgnMTAwJScpO1xyXG5cclxuICAgIGNvbnN0ICRuYW1lQ29udGFpbmVyID0gJCgnPGRpdiBjbGFzcz1cImFwcy1maWx0ZXJzX19uYW1lLWNvbnRhaW5lclwiIC8+JykuaGVpZ2h0KCczNnB4Jyk7XHJcblxyXG4gICAgLy8gTk9URTogUmVjcmVhdGUgd2lkZ2V0c1xyXG4gICAgdGhpcy5maWx0ZXJOYW1lVGV4dEJveCA9IHRoaXMuY3JlYXRlRmlsdGVyTmFtZVRleHRCb3goKTtcclxuICAgIHRoaXMuZmlsdGVyQnVpbGRlciA9IHRoaXMuY3JlYXRlRmlsdGVyQnVpbGRlcigpO1xyXG4gICAgdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94ID0gdGhpcy5jcmVhdGVGaWx0ZXJJc0dsb2JhbENoZWNrYm94KCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJOYW1lVGV4dEJveC5vcHRpb24oJ3ZhbHVlJywgZmlsdGVyICYmIGZpbHRlci5uYW1lKTtcclxuICAgIHRoaXMuZmlsdGVyTmFtZVRleHRCb3guZWxlbWVudCgpLmFwcGVuZFRvKCRuYW1lQ29udGFpbmVyKTtcclxuXHJcbiAgICB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCd2YWx1ZScsIGZpbHRlciAmJiBmaWx0ZXIuaXNHbG9iYWwpO1xyXG4gICAgdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94LmVsZW1lbnQoKS5hcHBlbmRUbygkbmFtZUNvbnRhaW5lcik7XHJcbiAgICB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCdkaXNhYmxlZCcsICF0aGlzLm9wdGlvbnMuY2FuQ3JlYXRlR2xvYmFsRmlsdGVycyk7XHJcblxyXG4gICAgJG5hbWVDb250YWluZXIuYXBwZW5kVG8oJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJCdWlsZGVyLm9wdGlvbigndmFsdWUnLCBmaWx0ZXIgJiYgZmlsdGVyLmZpbHRlclN0YXRlKTtcclxuXHJcbiAgICBjb25zdCAkZmlsdGVyQnVpbGRlckNvbnRhaW5lciA9ICQoJzxkaXYgLz4nKS5oZWlnaHQoJ2NhbGMoMTAwJSAtIDM2cHgpJykuYXBwZW5kVG8oJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJCdWlsZGVyLmVsZW1lbnQoKS5hcHBlbmRUbygkZmlsdGVyQnVpbGRlckNvbnRhaW5lcik7XHJcblxyXG4gICAgJGZpbHRlckJ1aWxkZXJDb250YWluZXIuZHhTY3JvbGxWaWV3KHtcclxuICAgICAgc2Nyb2xsQnlDb250ZW50OiB0cnVlXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gJHBvcHVwQ29udGVudDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyUG9wdXBUb29sYmFySXRlbXMoZmlsdGVyPzogSUNvbnRyb2xEaXNwbGF5RmlsdGVyKTogRGV2RXhwcmVzcy51aS5keFBvcHVwLlRvb2xiYXJJdGVtW10ge1xyXG4gICAgcmV0dXJuIGZpbHRlciA/IFtcclxuICAgICAgdGhpcy5jcmVhdGVVcGRhdGVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCksXHJcbiAgICAgIHRoaXMuY3JlYXRlU2F2ZUZpbHRlckFzTmV3UG9wdXBUb29sYmFySXRlbSgpLFxyXG4gICAgICB0aGlzLmNyZWF0ZVJlc2V0RmlsdGVyUG9wdXBUb29sYmFySXRlbSgpLFxyXG4gICAgICB0aGlzLmNyZWF0ZURlbGV0ZUZpbHRlclBvcHVwVG9vbGJhckl0ZW0oKVxyXG4gICAgXSA6IFt0aGlzLmNyZWF0ZVNhdmVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCldO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlRmlsdGVyUG9wdXBUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuVG9vbGJhckl0ZW0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgdGV4dDogJ0FwcGx5IGFuZCBTYXZlJyxcclxuICAgICAgICBvbkNsaWNrOiB0aGlzLmNyZWF0ZU5ld0ZpbHRlci5iaW5kKHRoaXMpLFxyXG4gICAgICAgIGljb246ICdzYXZlJ1xyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVVcGRhdGVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhQb3B1cC5Ub29sYmFySXRlbSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICB0ZXh0OiAnQXBwbHkgYW5kIFVwZGF0ZScsXHJcbiAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyKHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcik7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBpY29uOiAnc2F2ZSdcclxuICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2F2ZUZpbHRlckFzTmV3UG9wdXBUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuVG9vbGJhckl0ZW0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgdGV4dDogJ1NhdmUgQXMgTmV3JyxcclxuICAgICAgICBvbkNsaWNrOiB0aGlzLmNyZWF0ZU5ld0ZpbHRlci5iaW5kKHRoaXMpLFxyXG4gICAgICAgIGljb246ICdzYXZlJ1xyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVSZXNldEZpbHRlclBvcHVwVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFBvcHVwLlRvb2xiYXJJdGVtIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIHRleHQ6ICdSZXNldCcsXHJcbiAgICAgICAgb25DbGljazogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmhhc0NoYW5nZXMgfHwgIXRoaXMuZmlsdGVyQnVpbGRlciB8fCAhdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBpc0NvbmZpcm1lZCA9IGF3YWl0IERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oXHJcbiAgICAgICAgICAgICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVzZXQgdW5zYXZlZCBjaGFuZ2VzPycsXHJcbiAgICAgICAgICAgICdSZXNldCB0aGUgZGF0YSBzZXQnXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKCFpc0NvbmZpcm1lZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5yZXNldENoYW5nZXMoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGljb246ICd1bmRvJ1xyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVEZWxldGVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhQb3B1cC5Ub29sYmFySXRlbSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICB0ZXh0OiAnRGVsZXRlIERhdGEgU2V0JyxcclxuICAgICAgICBvbkNsaWNrOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgaXNDb25maXJtZWQgPSBhd2FpdCBEZXZFeHByZXNzLnVpLmRpYWxvZy5jb25maXJtKFxyXG4gICAgICAgICAgICBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgXCIke3RoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5uYW1lfVwiIGRhdGEgc2V0P2AsXHJcbiAgICAgICAgICAgICdEZWxldGUgdGhlIGRhdGEgc2V0J1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGlmICghaXNDb25maXJtZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlRmlsdGVyKHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkKTtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyUG9wdXAuaGlkZSgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaWNvbjogJ3RyYXNoJ1xyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBvcGVuTmV3RmlsdGVyUG9wdXAoKSB7XHJcbiAgICBjb25zdCBpc0ZpbHRlckFwcGxpZWQgPSBhd2FpdCB0aGlzLnRyeUFwcGx5RmlsdGVyKHVuZGVmaW5lZCk7XHJcbiAgICBpZiAoIWlzRmlsdGVyQXBwbGllZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVGaWx0ZXJQb3B1cENvbnRlbnQoKTtcclxuICAgIHRoaXMuZmlsdGVyUG9wdXAuc2hvdygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvcGVuRWRpdEZpbHRlclBvcHVwKGZpbHRlcjogSUNvbnRyb2xEaXNwbGF5RmlsdGVyKSB7XHJcbiAgICB0aGlzLnVwZGF0ZUZpbHRlclBvcHVwQ29udGVudChmaWx0ZXIpO1xyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5zaG93KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUZpbHRlclBvcHVwQ29udGVudChmaWx0ZXI/OiBJQ29udHJvbERpc3BsYXlGaWx0ZXIpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRBbmltYXRpb24gPSB0aGlzLmZpbHRlclBvcHVwLm9wdGlvbignYW5pbWF0aW9uJyk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ2FuaW1hdGlvbicsIHVuZGVmaW5lZCk7XHJcbiAgICB0aGlzLmZpbHRlclBvcHVwLm9wdGlvbigndGl0bGUnLCBmaWx0ZXIgPyBgRWRpdCB0aGUgXCIke2ZpbHRlci5uYW1lfVwiIGRhdGEgc2V0YCA6ICdDcmVhdGUgYSBuZXcgZGF0YSBzZXQnKTtcclxuICAgIHRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCdjb250ZW50VGVtcGxhdGUnLCAoKSA9PiB0aGlzLmNyZWF0ZUZpbHRlclBvcHVwQ29udGVudChmaWx0ZXIpKTtcclxuICAgIHRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCd0b29sYmFySXRlbXMnLCB0aGlzLmNyZWF0ZUZpbHRlclBvcHVwVG9vbGJhckl0ZW1zKGZpbHRlcikpO1xyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5yZXBhaW50KCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ2FuaW1hdGlvbicsIGN1cnJlbnRBbmltYXRpb24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVOZXdGaWx0ZXIoKSB7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyTmFtZVRleHRCb3ggfHwgIXRoaXMuZmlsdGVyQnVpbGRlciB8fCAhdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmaWx0ZXJOYW1lID0gdGhpcy5maWx0ZXJOYW1lVGV4dEJveC5vcHRpb24oJ3ZhbHVlJyk7XHJcbiAgICBjb25zdCBmaWx0ZXJCdWlsZGVyU3RhdGUgPSB0aGlzLmZpbHRlckJ1aWxkZXIub3B0aW9uKCd2YWx1ZScpO1xyXG4gICAgY29uc3QgaXNEZWZhdWx0ID0gZmFsc2U7XHJcbiAgICBjb25zdCBpc0dsb2JhbCA9IHRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveC5vcHRpb24oJ3ZhbHVlJyk7XHJcblxyXG4gICAgaWYgKCFmaWx0ZXJOYW1lKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb250cm9sRGlzcGxheUZpbHRlciA9IGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3JlYXRlTmV3RmlsdGVyKFxyXG4gICAgICBmaWx0ZXJOYW1lLCBmaWx0ZXJCdWlsZGVyU3RhdGUsIGlzRGVmYXVsdCwgaXNHbG9iYWxcclxuICAgICk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRGaWx0ZXJEcm9wZG93bkJveERhdGEoKTtcclxuICAgIGF3YWl0IHRoaXMuYXBwbHlGaWx0ZXIoY29udHJvbERpc3BsYXlGaWx0ZXIuaWQpO1xyXG5cclxuICAgIG5vdGlmeSgnQ3JlYXRlZCcsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVGaWx0ZXIoZmlsdGVyOiBJQ29udHJvbERpc3BsYXlGaWx0ZXIpIHtcclxuICAgIGlmICghdGhpcy5maWx0ZXJOYW1lVGV4dEJveCB8fCAhdGhpcy5maWx0ZXJCdWlsZGVyIHx8ICF0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZpbHRlck5hbWUgPSB0aGlzLmZpbHRlck5hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IGZpbHRlclN0YXRlID0gdGhpcy5maWx0ZXJCdWlsZGVyLm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IGlzR2xvYmFsID0gdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94Lm9wdGlvbigndmFsdWUnKTtcclxuXHJcbiAgICBpZiAoIWZpbHRlck5hbWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGlzVXBkYXRlZCA9IGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIudXBkYXRlRmlsdGVyKGZpbHRlci5pZCwge1xyXG4gICAgICBuYW1lOiBmaWx0ZXJOYW1lLFxyXG4gICAgICBmaWx0ZXJTdGF0ZSxcclxuICAgICAgaXNHbG9iYWxcclxuICAgIH0pO1xyXG4gICAgaWYgKCFpc1VwZGF0ZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE86IHVwZGF0ZSB0aXRsZVxyXG4gICAgbm90aWZ5KCdVcGRhdGVkJywgdHJ1ZSk7XHJcbiAgICBhd2FpdCB0aGlzLmFwcGx5RmlsdGVyKHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5pZCk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRGaWx0ZXJEcm9wZG93bkJveERhdGEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZGVsZXRlRmlsdGVyKGZpbHRlcklkOiBudW1iZXIpIHtcclxuICAgIGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuZGVsZXRlRmlsdGVyKGZpbHRlcklkKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMub25GaWx0ZXJEZWxldGVkKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5vbkZpbHRlckRlbGV0ZWQoZmlsdGVySWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IHRoaXMuYXBwbHlGaWx0ZXIodW5kZWZpbmVkKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZEZpbHRlckRyb3Bkb3duQm94RGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldENoYW5nZXMoKSB7XHJcbiAgICB0aGlzLmZpbHRlck5hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIubmFtZSk7XHJcbiAgICB0aGlzLmZpbHRlckJ1aWxkZXIub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5maWx0ZXJTdGF0ZSk7XHJcbiAgICB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5pc0dsb2JhbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGxvYWRGaWx0ZXJEcm9wZG93bkJveERhdGEoKSB7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBbdXNlclNldHRpbmdzLCBmaWx0ZXJzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcclxuICAgICAgdGhpcy5vcHRpb25zLmFwc0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlci5nZXRVc2VyU2V0dGluZ3MoKSxcclxuICAgICAgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5nZXRGaWx0ZXJzKClcclxuICAgIF0pO1xyXG5cclxuICAgIGlmICh1c2VyU2V0dGluZ3MuZGVmYXVsdEZpbHRlcklkKSB7XHJcbiAgICAgIGNvbnN0IGRlZmF1bHRGaWx0ZXIgPSBmaWx0ZXJzLmZpbmQoKGYpID0+IGYuaWQgPT09IHVzZXJTZXR0aW5ncy5kZWZhdWx0RmlsdGVySWQpO1xyXG4gICAgICBpZiAoZGVmYXVsdEZpbHRlcikge1xyXG4gICAgICAgIChkZWZhdWx0RmlsdGVyIGFzIGFueSkuaXNEZWZhdWx0ID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGV2RXhwcmVzcy5kYXRhLkFycmF5U3RvcmUoe1xyXG4gICAgICBrZXk6ICdpZCcsXHJcbiAgICAgIGRhdGE6IGZpbHRlcnNcclxuICAgIH0pO1xyXG4gICAgdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3gub3B0aW9uKCdkYXRhU291cmNlJywgZGF0YVNvdXJjZSk7XHJcbiAgICB0aGlzLmZpbHRlcnNEYXRhR3JpZCAmJiB0aGlzLmZpbHRlcnNEYXRhR3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCBkYXRhU291cmNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY29uZmlybUNoYW5nZXNMb3NzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgLy8gTk9URTogRGVsYXkgZm9yIHBvcHVwIHZpc2liaWxpdHkgY2hlY2tpbmdcclxuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgMCkpO1xyXG4gICAgaWYgKCF0aGlzLmhhc0NoYW5nZXMgfHwgIXRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCd2aXNpYmxlJykpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oXHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgICdZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMgdGhhdCB3aWxsIGJlIGxvc3QgaWYgeW91IGNsb3NlIHRoaXMgcG9wdXAuIERvIHlvdSB3YW50IHRvIGNsb3NlIHRoZSBwb3B1cCBhbmQgbm90IHNhdmUgY2hhbmdlcz8nLFxyXG4gICAgICAnVW5zYXZlZCBjaGFuZ2VzJ1xyXG4gICAgKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElBcGlSZXNwb25zZSwgUmVxdWVzdFN0YXRlIH0gZnJvbSAnLi4vLi4vRGF0YSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElGaWxlVXBsb2FkZXJPcHRpb25zIHtcclxuICAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgbWF4RmlsZVNpemU6IG51bWJlcjtcclxuICBhY2NlcHRlZEZpbGVUeXBlczogc3RyaW5nO1xyXG4gIGFsbG93ZWRGaWxlRXh0ZW5zaW9uczogc3RyaW5nW107XHJcbiAgb25WYWx1ZUNoYW5nZWQ/OiAoZTogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlci5WYWx1ZUNoYW5nZWRFdmVudCkgPT4gdm9pZDtcclxuICBvblVwbG9hZFN0YXJ0ZWQ/OiAoZTogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlci5VcGxvYWRTdGFydGVkRXZlbnQpID0+IHZvaWQ7XHJcbiAgb25VcGxvYWRlZD86IChlOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyLlVwbG9hZGVkRXZlbnQpID0+IHZvaWQ7XHJcbiAgc2VsZWN0QnV0dG9uVGV4dD86IHN0cmluZztcclxuICBjc3NDbGFzcz86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEZpbGVVcGxvYWRlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhGaWxlU2l6ZTogbnVtYmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWNjZXB0ZWRGaWxlVHlwZXM6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93ZWRGaWxlRXh0ZW5zaW9uczogc3RyaW5nW107XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblZhbHVlQ2hhbmdlZDogKGU6IERldkV4cHJlc3MudWkuZHhGaWxlVXBsb2FkZXIuVmFsdWVDaGFuZ2VkRXZlbnQpID0+IHZvaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblVwbG9hZFN0YXJ0ZWQ6IChlOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyLlVwbG9hZFN0YXJ0ZWRFdmVudCkgPT4gdm9pZCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uVXBsb2FkZWQ6IChlOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyLlVwbG9hZGVkRXZlbnQpID0+IHZvaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjc3NDbGFzczogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0QnV0dG9uVGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIGZpbGVVcGxvYWRlcjogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlcjtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUZpbGVVcGxvYWRlck9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuY3NzQ2xhc3MgPSBvcHRpb25zLmNzc0NsYXNzO1xyXG4gICAgdGhpcy5tYXhGaWxlU2l6ZSA9IG9wdGlvbnMubWF4RmlsZVNpemU7XHJcbiAgICB0aGlzLmFjY2VwdGVkRmlsZVR5cGVzID0gb3B0aW9ucy5hY2NlcHRlZEZpbGVUeXBlcztcclxuICAgIHRoaXMuc2VsZWN0QnV0dG9uVGV4dCA9IG9wdGlvbnMuc2VsZWN0QnV0dG9uVGV4dDtcclxuICAgIHRoaXMuYWxsb3dlZEZpbGVFeHRlbnNpb25zID0gb3B0aW9ucy5hbGxvd2VkRmlsZUV4dGVuc2lvbnM7XHJcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkID0gb3B0aW9ucy5vblZhbHVlQ2hhbmdlZDtcclxuICAgIHRoaXMub25VcGxvYWRTdGFydGVkID0gb3B0aW9ucy5vblVwbG9hZFN0YXJ0ZWQ7XHJcbiAgICB0aGlzLm9uVXBsb2FkZWQgPSBvcHRpb25zLm9uVXBsb2FkZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgY29uc3QgJGZpbGVVcGxvYWRlciA9ICQoJzxkaXYgLz4nKTtcclxuICAgIGlmICh0aGlzLmNzc0NsYXNzKSB7XHJcbiAgICAgICRmaWxlVXBsb2FkZXIuYWRkQ2xhc3ModGhpcy5jc3NDbGFzcyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5maWxlVXBsb2FkZXIgPSAkZmlsZVVwbG9hZGVyLmR4RmlsZVVwbG9hZGVyKHtcclxuICAgICAgc2VsZWN0QnV0dG9uVGV4dDogdGhpcy5zZWxlY3RCdXR0b25UZXh0LFxyXG4gICAgICBsYWJlbFRleHQ6ICcnLFxyXG4gICAgICBhbGxvd2VkRmlsZUV4dGVuc2lvbnM6IHRoaXMuYWxsb3dlZEZpbGVFeHRlbnNpb25zLFxyXG4gICAgICBhY2NlcHQ6IHRoaXMuYWNjZXB0ZWRGaWxlVHlwZXMsXHJcbiAgICAgIHVwbG9hZE1vZGU6ICd1c2VGb3JtJyxcclxuICAgICAgbWF4RmlsZVNpemU6IHRoaXMubWF4RmlsZVNpemUsXHJcbiAgICAgIHNob3dGaWxlTGlzdDogZmFsc2UsXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgIGUuY29tcG9uZW50Lm9wdGlvbignbGFiZWxUZXh0JywgZS52YWx1ZVswXSA/IGUudmFsdWVbMF0ubmFtZSA6ICcnKTtcclxuICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkPy4oZSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uVXBsb2FkU3RhcnRlZDogKGUpID0+IHtcclxuICAgICAgICBlLmVsZW1lbnQuZmluZCgnLmR4LWZpbGV1cGxvYWRlci11cGxvYWQtYnV0dG9uJykuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMub25VcGxvYWRTdGFydGVkPy4oZSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uVXBsb2FkZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vblVwbG9hZGVkPy4oZSk7XHJcbiAgICAgIH0sXHJcbiAgICB9KS5keEZpbGVVcGxvYWRlcignaW5zdGFuY2UnKTtcclxuXHJcbiAgICB0aGlzLiRjb250YWluZXIuYXBwZW5kKHRoaXMuZmlsZVVwbG9hZGVyLmVsZW1lbnQoKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBsb2FkPFQ+KHVwbG9hZFVybDogc3RyaW5nLCBwYXJhbXM/OiBhbnkpOiBQcm9taXNlPFQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IGZkID0gbmV3IEZvcm1EYXRhKCk7XHJcbiAgICAgIGNvbnN0IGZpbGUgPSAodGhpcy5maWxlVXBsb2FkZXIuZWxlbWVudCgpLmZpbmQoJ2lucHV0JylbMF0gYXMgSFRNTElucHV0RWxlbWVudCkuZmlsZXNbMF07XHJcblxyXG4gICAgICBmZC5hcHBlbmQoJ2ZpbGUnLCBmaWxlKTtcclxuXHJcbiAgICAgIC8qIGVzbGludCBndWFyZC1mb3ItaW46IG9mZiAqL1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGZvcmluXHJcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBwYXJhbXMpIHtcclxuICAgICAgICBmZC5hcHBlbmQocHJvcCwgcGFyYW1zW3Byb3BdKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgJC5hamF4KHtcclxuICAgICAgICB1cmw6IHVwbG9hZFVybCxcclxuICAgICAgICB0eXBlOiAncG9zdCcsXHJcbiAgICAgICAgZGF0YTogZmQsXHJcbiAgICAgICAgY29udGVudFR5cGU6IGZhbHNlLFxyXG4gICAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcclxuICAgICAgICBzdWNjZXNzOiAocmVzcG9uc2U6IElBcGlSZXNwb25zZTxUPikgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLlJlcXVlc3RTdGF0ZSA9PT0gUmVxdWVzdFN0YXRlLkNvbXBsZXRlZCkge1xyXG4gICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlLkRhdGEgYXMgYW55KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlamVjdChyZXNwb25zZS5NZXNzYWdlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZSkgPT4gcmVqZWN0KCdVbmtub3duIGVycm9yJylcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGNyZWF0ZUR4RGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL0RhdGEvRHhEYXRhU291cmNlJztcclxuaW1wb3J0IG5vdGlmeSBmcm9tICcuLi8uLi9XaWRnZXRzL05vdGlmeSc7XHJcbmltcG9ydCB7IEZpbGVVcGxvYWRlciB9IGZyb20gJy4uL0ZpbGVVcGxvYWRlci9JbmRleCc7XHJcbmltcG9ydCB7IElGaWxlSW1wb3J0ZXJDb2x1bW5JbmZvLCBJRmlsZUltcG9ydGVyVGFibGVNZXRhZGF0YSB9IGZyb20gJy4vSUZpbGVJbXBvcnRlclRhYmxlTWV0YWRhdGEnO1xyXG5pbXBvcnQgZGVmYXVsdEdyaWQgZnJvbSAnLi4vLi4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vLi4vVXRpbHMvRXZlbnRFbWl0dGVyJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZpbGVJbXBvcnRlclRhYmxlSW5mbyB7XHJcbiAgc2NoZW1hOiBzdHJpbmc7XHJcbiAgdGFibGU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRmlsZUltcG9ydGVyT3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgZmlsZVVwbG9hZFVybDogc3RyaW5nO1xyXG4gIGNyZWF0ZVRhYmxlVXJsOiBzdHJpbmc7XHJcbiAgYWRkUm93c1VybDogc3RyaW5nO1xyXG4gIGdldFRhYmxlc0xpc3RVcmw/OiBzdHJpbmc7XHJcbiAgcHJlZGVmaW5lZFRhYmxlPzogSUZpbGVJbXBvcnRlclRhYmxlSW5mbztcclxuICBwcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGU/OiBJbXBvcnRGaWxlTW9kZTtcclxuICBjcmVhdGVUYWJsZUJ1dHRvblRleHQ/OiBzdHJpbmc7XHJcbiAgdXBkYXRlVGFibGVCdXR0b25UZXh0Pzogc3RyaW5nO1xyXG4gIGNyZWF0ZVRhYmxlTW9kZVRleHQ/OiBzdHJpbmc7XHJcbiAgdXBkYXRlVGFibGVNb2RlVGV4dD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGVudW0gSW1wb3J0RmlsZU1vZGUge1xyXG4gIENyZWF0ZU5ld1RhYmxlID0gMCxcclxuICBBZGROZXdSb3dzID0gMVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRmlsZUltcG9ydGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRBQkxFX1VQREFURURfRVZFTlQgPSAnZmlsZS1pbXBvcnRlci10YWJsZS11cGRhdGVkLWV2ZW50JztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlVXBsb2FkVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB0aXRsZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3JlYXRlVGFibGVVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGFkZFJvd3NVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHByZWRlZmluZWRUYWJsZTogSUZpbGVJbXBvcnRlclRhYmxlSW5mbyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdldFRhYmxlc0xpc3RVcmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNhbkNoYW5nZU1vZGU6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjcmVhdGVUYWJsZUJ1dHRvblRleHQ6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZVRhYmxlQnV0dG9uVGV4dDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3JlYXRlVGFibGVNb2RlVGV4dDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlVGFibGVNb2RlVGV4dDogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIHBvcHVwOiBEZXZFeHByZXNzLnVpLmR4UG9wdXA7XHJcbiAgcHJpdmF0ZSBmb3JtOiBEZXZFeHByZXNzLnVpLmR4Rm9ybTtcclxuICBwcml2YXRlIGZpbGVVcGxvYWRlcjogRmlsZVVwbG9hZGVyO1xyXG4gIHByaXZhdGUgZGF0YUdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICBwcml2YXRlIGFjdGlvbkJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcclxuICBwcml2YXRlIHJvd3NDb3VudGVyQ29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByb3dzQ291bnRlcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgbW9kZTogSW1wb3J0RmlsZU1vZGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElGaWxlSW1wb3J0ZXJPcHRpb25zKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5maWxlVXBsb2FkVXJsID0gb3B0aW9ucy5maWxlVXBsb2FkVXJsO1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy50aXRsZSA9IG9wdGlvbnMudGl0bGU7XHJcbiAgICB0aGlzLmdldFRhYmxlc0xpc3RVcmwgPSBvcHRpb25zLmdldFRhYmxlc0xpc3RVcmw7XHJcbiAgICB0aGlzLmNyZWF0ZVRhYmxlVXJsID0gb3B0aW9ucy5jcmVhdGVUYWJsZVVybDtcclxuICAgIHRoaXMuYWRkUm93c1VybCA9IG9wdGlvbnMuYWRkUm93c1VybDtcclxuICAgIHRoaXMucHJlZGVmaW5lZFRhYmxlID0gb3B0aW9ucy5wcmVkZWZpbmVkVGFibGU7XHJcbiAgICB0aGlzLmNhbkNoYW5nZU1vZGUgPSBvcHRpb25zLnByZWRlZmluZWRJbXBvcnRGaWxlTW9kZSA9PT0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5tb2RlID0gb3B0aW9ucy5wcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMucHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlIDogSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGU7XHJcbiAgICB0aGlzLmNyZWF0ZVRhYmxlQnV0dG9uVGV4dCA9IG9wdGlvbnMuY3JlYXRlVGFibGVCdXR0b25UZXh0IHx8ICdDcmVhdGUgVGFibGUnO1xyXG4gICAgdGhpcy51cGRhdGVUYWJsZUJ1dHRvblRleHQgPSBvcHRpb25zLnVwZGF0ZVRhYmxlQnV0dG9uVGV4dCB8fCAnQWRkIE5ldyBSb3dzJztcclxuICAgIHRoaXMuY3JlYXRlVGFibGVNb2RlVGV4dCA9IG9wdGlvbnMuY3JlYXRlVGFibGVNb2RlVGV4dCB8fCAnQ3JlYXRlIFRhYmxlJztcclxuICAgIHRoaXMudXBkYXRlVGFibGVNb2RlVGV4dCA9IG9wdGlvbnMudXBkYXRlVGFibGVNb2RlVGV4dCB8fCAnQWRkIE5ldyBSb3dzJztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzaG93KCkge1xyXG4gICAgdGhpcy5wb3B1cCA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbyh0aGlzLiRjb250YWluZXIpXHJcbiAgICAgIC5keFBvcHVwKHtcclxuICAgICAgICBzaG93VGl0bGU6IHRydWUsXHJcbiAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgICAgZHJhZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIHJlc2l6ZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSxcclxuICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiBmYWxzZSxcclxuICAgICAgICBmdWxsU2NyZWVuOiB0cnVlLFxyXG4gICAgICAgIG1heFdpZHRoOiAxMzAwLFxyXG4gICAgICAgIG1heEhlaWdodDogODAwLFxyXG4gICAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKCRjb250YWluZXIpID0+IHtcclxuICAgICAgICAgIGNvbnN0ICRzY3JvbGxWaWV3ID0gJCgnPGRpdiAvPicpO1xyXG5cclxuICAgICAgICAgIHRoaXMuZm9ybSA9IHRoaXMuY3JlYXRlRm9ybSgpO1xyXG4gICAgICAgICAgJHNjcm9sbFZpZXcuYXBwZW5kKHRoaXMuZm9ybS5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICAgICRzY3JvbGxWaWV3LmR4U2Nyb2xsVmlldyh7XHJcbiAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgICAgICAgIGhlaWdodDogJzEwMCUnXHJcbiAgICAgICAgICB9KS5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRvb2xiYXJJdGVtczogW3tcclxuICAgICAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0QWN0aW9uQnV0dG9uVGV4dCgpLFxyXG4gICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsXHJcbiAgICAgICAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5hY3Rpb25CdXR0b24gPSBlLmNvbXBvbmVudDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgb25DbGljazogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLm1vZGUgPT09IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVRhYmxlKCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkUm93c1RvVGFibGUoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICB0ZXh0OiAnQ2FuY2VsJyxcclxuICAgICAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy5wb3B1cC5oaWRlKClcclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgICAgICB9XVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhQb3B1cCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICB0aGlzLnBvcHVwLnNob3coKTtcclxuICAgIHRoaXMub25Nb2RlU3dpdGNoaW5nKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcG9zZSgpIHtcclxuICAgIGlmICh0aGlzLnBvcHVwKSB7XHJcbiAgICAgIHRoaXMucG9wdXAuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGb3JtKCk6IERldkV4cHJlc3MudWkuZHhGb3JtIHtcclxuICAgIGNvbnN0IGZvcm0gPSAkKCc8ZGl2PicpLmR4Rm9ybSh7XHJcbiAgICAgIHNob3dDb2xvbkFmdGVyTGFiZWw6IHRydWUsXHJcbiAgICAgIGxhYmVsTG9jYXRpb246ICd0b3AnLFxyXG4gICAgICBjb2xDb3VudEJ5U2NyZWVuOiB7IG1kOiA0LCBzbTogMSB9LFxyXG4gICAgICBzY3JlZW5CeVdpZHRoOiAod2lkdGgpID0+IHdpZHRoIDwgMTI1NiA/ICdzbScgOiAnbWQnLFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdNb2RlJyxcclxuICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgdGVtcGxhdGU6IChfZGF0YSwgJGNvbnRhaW5lcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVNb2RlU3dpdGNoZXIoJGNvbnRhaW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnU2NoZW1hJyxcclxuICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICBkaXNhYmxlZDogIXRoaXMuY2FuQ2hhbmdlTW9kZVxyXG4gICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRleHRCb3guUHJvcGVydGllcyxcclxuICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFt7XHJcbiAgICAgICAgICB0eXBlOiAncmVxdWlyZWQnLFxyXG4gICAgICAgIH1dXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdUYWJsZScsXHJcbiAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLmNhbkNoYW5nZU1vZGVcclxuICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUZXh0Qm94LlByb3BlcnRpZXMsXHJcbiAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbe1xyXG4gICAgICAgICAgdHlwZTogJ3JlcXVpcmVkJyxcclxuICAgICAgICB9XVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnVGFibGVTZWxlY3RvcicsXHJcbiAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgIHRleHQ6ICdUYWJsZSdcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVkaXRvclR5cGU6ICdkeFNlbGVjdEJveCcsXHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgICAgY29sU3BhbjogMixcclxuICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiBuZXcgRGV2RXhwcmVzcy5kYXRhLkRhdGFTb3VyY2Uoe1xyXG4gICAgICAgICAgICBzdG9yZTogY3JlYXRlRHhEYXRhU291cmNlKHtcclxuICAgICAgICAgICAgICBsb2FkVXJsOiB0aGlzLmdldFRhYmxlc0xpc3RVcmwsXHJcbiAgICAgICAgICAgICAgbG9hZFBhcmFtczogeyBjb250ZXh0TmFtZTogJycsIHRhYmxlc09ubHk6IHRydWUsIGlzV2FyZWhvdXNlQ29udGV4dDogdHJ1ZSB9LFxyXG4gICAgICAgICAgICAgIGxvYWRNZXRob2Q6ICdwb3N0JyxcclxuICAgICAgICAgICAgICBub3RpZnlFcnJvcjogZmFsc2VcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHBhZ2luYXRlOiBmYWxzZSxcclxuICAgICAgICAgICAgc29ydDogJ3RoaXMnLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBzZWFyY2hFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRleHRCb3guUHJvcGVydGllcyxcclxuICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFt7XHJcbiAgICAgICAgICB0eXBlOiAncmVxdWlyZWQnLFxyXG4gICAgICAgIH1dXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdTb3VyY2UgRmlsZScsXHJcbiAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgIHRlbXBsYXRlOiAoX2RhdGEsICRjb250YWluZXIpID0+IHtcclxuICAgICAgICAgIHRoaXMuY3JlYXRlRmlsZXNVcGxvYWRlcigkY29udGFpbmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdDb2x1bW5zIFNlbGVjdG9yJyxcclxuICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgdmlzaWJsZTogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbFNwYW46IDQsXHJcbiAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgIHRlbXBsYXRlOiAoX2RhdGEsICRjb250YWluZXIpID0+IHtcclxuICAgICAgICAgIHRoaXMuY3JlYXRlRGF0YUdyaWQoJGNvbnRhaW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XVxyXG4gICAgfSkuZHhGb3JtKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHJldHVybiBmb3JtO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVNb2RlU3dpdGNoZXIoJGNvbnRhaW5lcjogSlF1ZXJ5KSB7XHJcbiAgICAkKCc8ZGl2IC8+JykuZHhCdXR0b25Hcm91cCh7XHJcbiAgICAgIGl0ZW1zOiBbe1xyXG4gICAgICAgIHRleHQ6IHRoaXMuY3JlYXRlVGFibGVNb2RlVGV4dCxcclxuICAgICAgICBpY29uOiAnaW5zZXJ0dGFibGUnLFxyXG4gICAgICAgIHZhbHVlOiBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgdGV4dDogdGhpcy51cGRhdGVUYWJsZU1vZGVUZXh0LFxyXG4gICAgICAgIGljb246ICdpbnNlcnRyb3diZWxvdycsXHJcbiAgICAgICAgdmFsdWU6IEltcG9ydEZpbGVNb2RlLkFkZE5ld1Jvd3NcclxuICAgICAgfV0gYXMgYW55LFxyXG4gICAgICBrZXlFeHByOiAndmFsdWUnLFxyXG4gICAgICBkaXNhYmxlZDogIXRoaXMuY2FuQ2hhbmdlTW9kZSxcclxuICAgICAgc3R5bGluZ01vZGU6ICdvdXRsaW5lZCcsXHJcbiAgICAgIHNlbGVjdGlvbk1vZGU6ICdzaW5nbGUnLFxyXG4gICAgICBzZWxlY3RlZEl0ZW1LZXlzOiBbdGhpcy5tb2RlXSxcclxuICAgICAgb25JdGVtQ2xpY2s6IChlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tb2RlID0gZS5pdGVtRGF0YS52YWx1ZTtcclxuICAgICAgICB0aGlzLm9uTW9kZVN3aXRjaGluZygpO1xyXG4gICAgICB9LFxyXG4gICAgfSkuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbGVzVXBsb2FkZXIoJGNvbnRhaW5lcjogSlF1ZXJ5KSB7XHJcbiAgICB0aGlzLmZpbGVVcGxvYWRlciA9IG5ldyBGaWxlVXBsb2FkZXIoe1xyXG4gICAgICAkY29udGFpbmVyLFxyXG4gICAgICBjc3NDbGFzczogJ3RhYmxlLWNyZWF0b3JfX3VwbG9hZCcsXHJcbiAgICAgIG1heEZpbGVTaXplOiAxMCAqIDEwMDAwMDAsXHJcbiAgICAgIGFjY2VwdGVkRmlsZVR5cGVzOiAnLnhscywgLnhsc3gnLFxyXG4gICAgICBhbGxvd2VkRmlsZUV4dGVuc2lvbnM6IFsnLnhscycsICcueGxzeCddLFxyXG4gICAgICBzZWxlY3RCdXR0b25UZXh0OiAnU2VsZWN0IEV4Y2VsIGZpbGUnLFxyXG4gICAgICBvblZhbHVlQ2hhbmdlZDogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdQYXJzaW5nIHNlbGVjdGVkIGZpbGUuLi4nKTtcclxuICAgICAgICB0aGlzLmZpbGVVcGxvYWRlci51cGxvYWQ8SUZpbGVJbXBvcnRlclRhYmxlTWV0YWRhdGE+KHRoaXMuZmlsZVVwbG9hZFVybCkudGhlbigodGFibGVNZXRhKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGFibGVNZXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0Um93c0NvdW50KHRhYmxlTWV0YS5Sb3dzQ291bnQpO1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhU291cmNlID0gbmV3IERldkV4cHJlc3MuZGF0YS5EYXRhU291cmNlKHtcclxuICAgICAgICAgICAgICBzdG9yZToge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2FycmF5JyxcclxuICAgICAgICAgICAgICAgIGtleTogJ0lkJyxcclxuICAgICAgICAgICAgICAgIGRhdGE6IHRhYmxlTWV0YS5Db2x1bW5zXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBwYWdpbmF0ZTogZmFsc2VcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRhdGFHcmlkLm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgICBub3RpZnkoYFBhcnNpbmcgRXJyb3IgOiAke2V9YCwgZmFsc2UpO1xyXG4gICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhR3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5maWxlVXBsb2FkZXIucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZURhdGFHcmlkKCRjb250YWluZXI6IEpRdWVyeSkge1xyXG4gICAgY29uc3QgZ3JpZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgPSB7XHJcbiAgICAgIG5vRGF0YVRleHQ6ICdTZWxlY3QgRXhjZWwgRmlsZScsXHJcbiAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICBzZWFyY2hQYW5lbDoge1xyXG4gICAgICAgIHZpc2libGU6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIGdyb3VwUGFuZWw6IHtcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBoZWFkZXJGaWx0ZXI6IHtcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcclxuICAgICAgfSxcclxuICAgICAgZmlsdGVyUm93OiB7XHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgc29ydGluZzoge1xyXG4gICAgICAgIG1vZGU6ICdub25lJ1xyXG4gICAgICB9LFxyXG4gICAgICBwYWdpbmc6IHtcclxuICAgICAgICBwYWdlU2l6ZTogMTAwMDAsXHJcbiAgICAgICAgZW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIH0sXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgIG1vZGU6ICdjZWxsJyxcclxuICAgICAgfSxcclxuICAgICAgc2VsZWN0aW9uOiB7XHJcbiAgICAgICAgbW9kZTogJ25vbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbHVtbnM6IFt7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnSWQnLFxyXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnU2VsZWN0ZWQnLFxyXG4gICAgICAgIGRhdGFUeXBlOiAnYm9vbGVhbicsXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy5tb2RlID09PSBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnSXNLZXlDb2x1bW4nLFxyXG4gICAgICAgIGRhdGFUeXBlOiAnYm9vbGVhbicsXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy5tb2RlID09PSBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnTmFtZScsXHJcbiAgICAgICAgY2FwdGlvbjogJ0NvbHVtbiBOYW1lJ1xyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnVHlwZScsXHJcbiAgICAgICAgYWxsb3dFZGl0aW5nOiBmYWxzZVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnSXNOdWxsYWJsZScsXHJcbiAgICAgICAgYWxsb3dFZGl0aW5nOiB0aGlzLm1vZGUgPT09IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlICYmIHRoaXMuY2FuQ2hhbmdlTW9kZSxcclxuICAgICAgICBzZXRDZWxsVmFsdWU6IChuZXdEYXRhLCB2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgbmV3RGF0YS5Jc051bGxhYmxlID0gdmFsdWU7XHJcbiAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgbmV3RGF0YS5Jc0tleUNvbHVtbiA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfV0sXHJcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxyXG4gICAgICBvblRvb2xiYXJQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdG9vbGJhckl0ZW1zID0gZS50b29sYmFyT3B0aW9ucy5pdGVtcztcclxuICAgICAgICB0b29sYmFySXRlbXMucHVzaCh7XHJcbiAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmQoJCgnPHNwYW4+JylcclxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcygndGFibGUtY3JlYXRvcl9fdGFibGUtaGVhZGVyJylcclxuICAgICAgICAgICAgICAgIC50ZXh0KCdQYXJzZWQgRmlsZSBNZXRhZGF0YScpLFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgbG9jYXRpb246ICdiZWZvcmUnXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yb3dzQ291bnRlciA9ICQoJzxzcGFuPicpLnRleHQoJzEwMDAnKTtcclxuICAgICAgICAgICAgdGhpcy5yb3dzQ291bnRlckNvbnRhaW5lciA9ICQoJzxkaXY+JylcclxuICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxzcGFuPicpLnRleHQoJ1Jvd3MgQ291bnQ6ICcpLCB0aGlzLnJvd3NDb3VudGVyKS5oaWRlKCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb3dzQ291bnRlckNvbnRhaW5lcjtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9LFxyXG4gICAgICBvbkVkaXRvclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgICBpZiAoZS5wYXJlbnRUeXBlID09PSAnZGF0YVJvdycgJiYgZS5kYXRhRmllbGQgPT09ICdJc0tleUNvbHVtbicpIHtcclxuICAgICAgICAgIGNvbnN0IGVkaXRvck9wdGlvbnMgPSBlLmVkaXRvck9wdGlvbnMgYXMgRGV2RXhwcmVzcy51aS5keENoZWNrQm94T3B0aW9ucztcclxuICAgICAgICAgIGVkaXRvck9wdGlvbnMuZGlzYWJsZWQgPSBlLnJvdy5kYXRhLklzTnVsbGFibGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZGF0YUdyaWQgPSBkZWZhdWx0R3JpZCgkKCc8ZGl2IC8+JyksIHtcclxuICAgICAgb3B0aW9uczogZ3JpZE9wdGlvbnMsXHJcbiAgICAgIHN1bW1hcnlDb2x1bW46ICdOYW1lJyxcclxuICAgICAgaXNGdWxsU2NyZWVuOiBmYWxzZSxcclxuICAgICAgc2V0RGVmYXVsdENvbHVtbldpZHRoOiBmYWxzZVxyXG4gICAgfSk7XHJcblxyXG4gICAgJGNvbnRhaW5lci5hcHBlbmQodGhpcy5kYXRhR3JpZC5lbGVtZW50KCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVUYWJsZSgpIHtcclxuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB0aGlzLmZvcm0udmFsaWRhdGUoKTtcclxuICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcclxuICAgICAgY29uc3QgZHMgPSB0aGlzLmRhdGFHcmlkLmdldERhdGFTb3VyY2UoKTtcclxuICAgICAgaWYgKCFkcykge1xyXG4gICAgICAgIG5vdGlmeSgnU2VsZWN0IGZpbGUgd2l0aCBkYXRhJywgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBkcy5pdGVtcygpO1xyXG4gICAgICBpZiAoIXRoaXMuYXJlQ29sdW1uc1ZhbGlkKGNvbHVtbnMpKSB7XHJcbiAgICAgICAgbm90aWZ5KCdBdCBsZWFzdCAxIGtleSBjb2x1bW4gbXVzdCBiZSBzZXQnLCBmYWxzZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAgICAgc2NoZW1hOiB0aGlzLmZvcm0ub3B0aW9uKCdmb3JtRGF0YScpLlNjaGVtYSxcclxuICAgICAgICAgIHRhYmxlOiB0aGlzLmZvcm0ub3B0aW9uKCdmb3JtRGF0YScpLlRhYmxlLFxyXG4gICAgICAgICAgY29sdW1uczogSlNPTi5zdHJpbmdpZnkoY29sdW1ucylcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdDcmVhdGluZyBhbmQgZmlsbGluZyBEQiB0YWJsZS4uLicpO1xyXG4gICAgICAgIHRoaXMuZmlsZVVwbG9hZGVyLnVwbG9hZDxib29sZWFuPih0aGlzLmNyZWF0ZVRhYmxlVXJsLCBwYXJhbXMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2UgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5wb3B1cC5oaWRlKCk7XHJcbiAgICAgICAgICAgIG5vdGlmeShgVGhlIHRhYmxlIFske3BhcmFtcy5zY2hlbWF9XS5bJHtwYXJhbXMudGFibGV9XSBoYXMgYmVlbiBjcmVhdGVkYCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChGaWxlSW1wb3J0ZXIuVEFCTEVfVVBEQVRFRF9FVkVOVCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBub3RpZnkoJ1RoZSB0YWJsZSBoYXMgbm90IGJlZW4gY3JlYXRlZCcsIGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgbm90aWZ5KGBUYWJsZSBjcmVhdGluZyBlcnJvcjogJHtlfWAsIGZhbHNlKTtcclxuICAgICAgICB9KS5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZGF0YUdyaWQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZFJvd3NUb1RhYmxlKCkge1xyXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMuZm9ybS52YWxpZGF0ZSgpO1xyXG4gICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xyXG4gICAgICBjb25zdCBkcyA9IHRoaXMuZGF0YUdyaWQuZ2V0RGF0YVNvdXJjZSgpO1xyXG4gICAgICBpZiAoIWRzKSB7XHJcbiAgICAgICAgbm90aWZ5KCdTZWxlY3QgZmlsZSB3aXRoIGRhdGEnLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgY29sdW1ucyA9IGRzLml0ZW1zKCk7XHJcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgICB0YWJsZTogdGhpcy5mb3JtLm9wdGlvbignZm9ybURhdGEnKS5UYWJsZVNlbGVjdG9yLFxyXG4gICAgICAgIGNvbHVtbnM6IEpTT04uc3RyaW5naWZ5KGNvbHVtbnMpXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuZGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdBZGRpbmcgcm93cyB0byBEQiB0YWJsZS4uLicpO1xyXG4gICAgICB0aGlzLmZpbGVVcGxvYWRlci51cGxvYWQ8Ym9vbGVhbj4odGhpcy5hZGRSb3dzVXJsLCBwYXJhbXMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICB0aGlzLnBvcHVwLmhpZGUoKTtcclxuICAgICAgICAgIG5vdGlmeShgVGhlIHRhYmxlICR7cGFyYW1zLnRhYmxlfSBoYXMgYmVlbiB1cGRhdGVkYCwgdHJ1ZSk7XHJcbiAgICAgICAgICB0aGlzLmVtaXQoRmlsZUltcG9ydGVyLlRBQkxFX1VQREFURURfRVZFTlQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBub3RpZnkoJ1RoZSB0YWJsZSBoYXMgbm90IGJlZW4gdXBkYXRlZCcsIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgbm90aWZ5KGBUYWJsZSB1cGRhdGluZyBlcnJvcjogJHtlfWAsIGZhbHNlKTtcclxuICAgICAgfSkuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhR3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbk1vZGVTd2l0Y2hpbmcoKSB7XHJcbiAgICBjb25zdCBpc0NyZWF0ZVRhYmxlTW9kZSA9IHRoaXMubW9kZSA9PT0gSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGU7XHJcblxyXG4gICAgdGhpcy5hY3Rpb25CdXR0b24ub3B0aW9uKCd0ZXh0JywgdGhpcy5nZXRBY3Rpb25CdXR0b25UZXh0KCkpO1xyXG4gICAgdGhpcy5kYXRhR3JpZC5jb2x1bW5PcHRpb24oJ0lzS2V5Q29sdW1uJywgJ3Zpc2libGUnLCBpc0NyZWF0ZVRhYmxlTW9kZSk7XHJcbiAgICB0aGlzLmRhdGFHcmlkLmNvbHVtbk9wdGlvbignSXNOdWxsYWJsZScsICd2aXNpYmxlJywgaXNDcmVhdGVUYWJsZU1vZGUpO1xyXG5cclxuICAgIGlmICghdGhpcy5jYW5DaGFuZ2VNb2RlKSB7XHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdTY2hlbWEnLCAndmlzaWJsZScsIHRydWUpO1xyXG4gICAgICB0aGlzLmZvcm0udXBkYXRlRGF0YSgnU2NoZW1hJywgdGhpcy5wcmVkZWZpbmVkVGFibGUuc2NoZW1hKTtcclxuXHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdUYWJsZScsICd2aXNpYmxlJywgdHJ1ZSk7XHJcbiAgICAgIHRoaXMuZm9ybS51cGRhdGVEYXRhKCdUYWJsZScsIHRoaXMucHJlZGVmaW5lZFRhYmxlLnRhYmxlKTtcclxuXHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdUYWJsZVNlbGVjdG9yJywgJ3Zpc2libGUnLCBmYWxzZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZvcm0uaXRlbU9wdGlvbignU2NoZW1hJywgJ3Zpc2libGUnLCBpc0NyZWF0ZVRhYmxlTW9kZSk7XHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdUYWJsZScsICd2aXNpYmxlJywgaXNDcmVhdGVUYWJsZU1vZGUpO1xyXG4gICAgICB0aGlzLmZvcm0uaXRlbU9wdGlvbignVGFibGVTZWxlY3RvcicsICd2aXNpYmxlJywgIWlzQ3JlYXRlVGFibGVNb2RlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0QWN0aW9uQnV0dG9uVGV4dCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGUgPyB0aGlzLmNyZWF0ZVRhYmxlQnV0dG9uVGV4dCA6IHRoaXMudXBkYXRlVGFibGVCdXR0b25UZXh0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcmVDb2x1bW5zVmFsaWQoY29sdW1uczogSUZpbGVJbXBvcnRlckNvbHVtbkluZm9bXSkge1xyXG4gICAgcmV0dXJuIGNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLlNlbGVjdGVkKS5zb21lKChzKSA9PiBzLklzS2V5Q29sdW1uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Um93c0NvdW50KGNvdW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMucm93c0NvdW50ZXJDb250YWluZXIuc2hvdygpO1xyXG4gICAgdGhpcy5yb3dzQ291bnRlci50ZXh0KGNvdW50KTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEdyaWREaXNwbGF5c01hbmFnZXIgfSBmcm9tICcuL0dyaWREaXNwbGF5c01hbmFnZXInO1xyXG5pbXBvcnQgeyBHcmlkVmlld3NNYW5hZ2VyIH0gZnJvbSAnLi9HcmlkVmlld3NNYW5hZ2VyJztcclxuaW1wb3J0IHsgR3JpZEZpbHRlcnNNYW5hZ2VyIH0gZnJvbSAnLi9HcmlkRmlsdGVyc01hbmFnZXInO1xyXG5pbXBvcnQgeyBjcmVhdGVEaWFsb2cgfSBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL1BvcHVwJztcclxuaW1wb3J0IHsgQ2RtSW1wb3J0RmlsZU1vZGUgfSBmcm9tICcuLi8uLi9CdXNpbmVzcyc7XHJcbmltcG9ydCB7IEZpbGVJbXBvcnRlciwgSUZpbGVJbXBvcnRlclRhYmxlSW5mbywgSW1wb3J0RmlsZU1vZGUgfSBmcm9tICcuLi8uLi8uLi9Db21wb25lbnRzL0ZpbGVJbXBvcnRlci9JbmRleCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElGaWxlSW1wb3J0ZXJPcHRpb25zIHtcclxuICBtb2RlOiBDZG1JbXBvcnRGaWxlTW9kZTtcclxuICBjcmVhdGVUYWJsZVVybDogc3RyaW5nO1xyXG4gIGFkZFJvd3NVcmw6IHN0cmluZztcclxuICBmaWxlVXBsb2FkVXJsOiBzdHJpbmc7XHJcbiAgcHJlZGVmaW5lZFRhYmxlOiBJRmlsZUltcG9ydGVyVGFibGVJbmZvO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50IHtcclxuICByZWFkb25seSBvd25lcjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gIHJlYWRvbmx5IGVkaXRNb2RlOiBib29sZWFuO1xyXG4gIHJlYWRvbmx5IGdyaWREaXNwbGF5c01hbmFnZXI6IEdyaWREaXNwbGF5c01hbmFnZXI7XHJcbiAgcmVhZG9ubHkgZ3JpZFZpZXdzTWFuYWdlcjogR3JpZFZpZXdzTWFuYWdlcjtcclxuICByZWFkb25seSBncmlkRmlsdGVyc01hbmFnZXI6IEdyaWRGaWx0ZXJzTWFuYWdlcjtcclxuICByZWFkb25seSBpbXBvcnRGaWxlT3B0aW9ucz86IElGaWxlSW1wb3J0ZXJPcHRpb25zO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgR3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudCB7XHJcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IElHcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50O1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWREaXNwbGF5c01hbmFnZXI6IEdyaWREaXNwbGF5c01hbmFnZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkVmlld3NNYW5hZ2VyOiBHcmlkVmlld3NNYW5hZ2VyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZEZpbHRlcnNNYW5hZ2VyOiBHcmlkRmlsdGVyc01hbmFnZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbXBvcnRGaWxlT3B0aW9uczogSUZpbGVJbXBvcnRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgZGlzcGxheXNEcm9wZG93bkJveDogRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGN1cnJlbnREaXNwbGF5VGl0bGU6IERldkV4cHJlc3MudWkuZHhUZXh0Qm94IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgc2F2ZUJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHNhdmVBc0J1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGRhdGFHcmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBmaWxlSW1wb3J0ZXI6IEZpbGVJbXBvcnRlciB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUgdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgX2Rpc3BsYXlzVG9vbGJhckl0ZW06IERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9pbXBvcnRGaWxlVG9vbGJhckl0ZW06IERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbSB8IHVuZGVmaW5lZDtcclxuICAvLyB0c2xpbnQ6ZW5hYmxlIHZhcmlhYmxlLW5hbWVcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIgPSBvcHRpb25zLmdyaWREaXNwbGF5c01hbmFnZXI7XHJcbiAgICB0aGlzLmdyaWRWaWV3c01hbmFnZXIgPSBvcHRpb25zLmdyaWRWaWV3c01hbmFnZXI7XHJcbiAgICB0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlciA9IG9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyO1xyXG4gICAgdGhpcy5pbXBvcnRGaWxlT3B0aW9ucyA9IG9wdGlvbnMuaW1wb3J0RmlsZU9wdGlvbnM7XHJcblxyXG4gICAgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLm9uRGlzcGxhaXNMb2FkZWQgPSAoZGlzcGxheXMpID0+IHtcclxuICAgICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBEZXZFeHByZXNzLmRhdGEuQXJyYXlTdG9yZSh7XHJcbiAgICAgICAga2V5OiAnSWQnLFxyXG4gICAgICAgIGRhdGE6IGRpc3BsYXlzXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5kaXNwbGF5c0Ryb3Bkb3duQm94ICYmIHRoaXMuZGlzcGxheXNEcm9wZG93bkJveC5vcHRpb24oJ2RhdGFTb3VyY2UnLCBkYXRhU291cmNlKTtcclxuXHJcbiAgICAgIHRoaXMuZGF0YUdyaWQgJiYgdGhpcy5kYXRhR3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCBkYXRhU291cmNlKTtcclxuICAgICAgdGhpcy5kYXRhR3JpZCAmJiB0aGlzLmRhdGFHcmlkLmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLm9uRGlzcGxheUNoYW5nZWQgPSAoZGlzcGxheSkgPT4ge1xyXG4gICAgICB0aGlzLmRpc3BsYXlzRHJvcGRvd25Cb3ggJiYgdGhpcy5kaXNwbGF5c0Ryb3Bkb3duQm94Lm9wdGlvbigndmFsdWUnLCBkaXNwbGF5ID8gZGlzcGxheS5JZCA6IG51bGwpO1xyXG4gICAgICB0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUgJiYgdGhpcy5jdXJyZW50RGlzcGxheVRpdGxlLm9wdGlvbigndmFsdWUnLCBkaXNwbGF5ID8gZGlzcGxheS5OYW1lIDogbnVsbCk7XHJcbiAgICAgIHRoaXMuY3VycmVudERpc3BsYXlUaXRsZSAmJiB0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUub3B0aW9uKCdkaXNhYmxlZCcsICFkaXNwbGF5KTtcclxuICAgICAgdGhpcy5zYXZlQXNCdXR0b24gJiYgdGhpcy5zYXZlQXNCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsICFkaXNwbGF5KTtcclxuICAgICAgdGhpcy5zYXZlQnV0dG9uICYmIHRoaXMuc2F2ZUJ1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgIWRpc3BsYXkpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGF0YUdyaWQpIHtcclxuICAgICAgICBkaXNwbGF5XHJcbiAgICAgICAgICA/IHRoaXMuZGF0YUdyaWQuc2VsZWN0Um93cyhbZGlzcGxheS5JZF0sIGZhbHNlKVxyXG4gICAgICAgICAgOiB0aGlzLmRhdGFHcmlkLmRlc2VsZWN0QWxsKCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5pbnRlZ3JhdGVUb0dyaWQodGhpcy5vcHRpb25zLm93bmVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW50ZWdyYXRlVG9HcmlkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gICAgY29uc3QgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgPSBncmlkLm9wdGlvbignb25Ub29sYmFyUHJlcGFyaW5nJyk7XHJcblxyXG4gICAgZ3JpZC5vcHRpb24oJ29uVG9vbGJhclByZXBhcmluZycsIChlOiBhbnkpID0+IHtcclxuICAgICAgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgJiYgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcoZSk7XHJcbiAgICAgIHRoaXMub25HcmlkVG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkdyaWRUb29sYmFyUHJlcGFyaW5nOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydvblRvb2xiYXJQcmVwYXJpbmcnXSA9IChlKSA9PiB7XHJcbiAgICBjb25zdCB0b29sYmFySXRlbXMgPSBlLnRvb2xiYXJPcHRpb25zICYmIGUudG9vbGJhck9wdGlvbnMuaXRlbXM7XHJcbiAgICBpZiAoIXRvb2xiYXJJdGVtcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmV3SXRlbXMgPSBbdGhpcy5kaXNwbGF5c1Rvb2xiYXJJdGVtXTtcclxuXHJcbiAgICBpZiAodGhpcy5pbXBvcnRGaWxlT3B0aW9ucyAmJiB0aGlzLmltcG9ydEZpbGVPcHRpb25zLm1vZGUgIT09IENkbUltcG9ydEZpbGVNb2RlLk5vbmUpIHtcclxuICAgICAgbmV3SXRlbXMucHVzaCh0aGlzLmltcG9ydEZpbGVUb29sYmFySXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgdG9vbGJhckl0ZW1zLnNwbGljZSgxLCAwLCAuLi5uZXdJdGVtcyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZURhdGFHcmlkKGRyb3Bkb3duQm94T3duZXI6IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveCk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keERhdGFHcmlkKHtcclxuICAgICAgICBkYXRhU291cmNlOiBkcm9wZG93bkJveE93bmVyLmdldERhdGFTb3VyY2UoKSxcclxuICAgICAgICByZW1vdGVPcGVyYXRpb25zOiBmYWxzZSxcclxuICAgICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgICBhbGxvd0FkZGluZzogZmFsc2UsXHJcbiAgICAgICAgICBhbGxvd1VwZGF0aW5nOiBmYWxzZSxcclxuICAgICAgICAgIGFsbG93RGVsZXRpbmc6IHRoaXMub3B0aW9ucy5lZGl0TW9kZSxcclxuICAgICAgICAgIG1vZGU6ICdyb3cnLFxyXG4gICAgICAgICAgdXNlSWNvbnM6IHRydWUsXHJcbiAgICAgICAgICB0ZXh0czoge1xyXG4gICAgICAgICAgICBjb25maXJtRGVsZXRlTWVzc2FnZTogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBkaXNwbGF5PydcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGxvYWRQYW5lbDoge1xyXG4gICAgICAgICAgc2hhZGluZzogdHJ1ZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgYWxsb3dDb2x1bW5SZXNpemluZzogdHJ1ZSxcclxuICAgICAgICBjb2x1bW5BdXRvV2lkdGg6IHRydWUsXHJcbiAgICAgICAgd29yZFdyYXBFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnTmFtZScsXHJcbiAgICAgICAgICAgIGNhcHRpb246ICdEaXNwbGF5J1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnRmlsdGVySWQnLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiAnRGF0YSBTZXQnLFxyXG4gICAgICAgICAgICBsb29rdXA6IHtcclxuICAgICAgICAgICAgICB2YWx1ZUV4cHI6ICdpZCcsXHJcbiAgICAgICAgICAgICAgZGlzcGxheUV4cHI6ICduYW1lJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdWaWV3SWQnLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiAnVmlldycsXHJcbiAgICAgICAgICAgIGxvb2t1cDoge1xyXG4gICAgICAgICAgICAgIHZhbHVlRXhwcjogJ2lkJyxcclxuICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ25hbWUnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICBdLFxyXG4gICAgICAgIGtleWJvYXJkTmF2aWdhdGlvbjoge1xyXG4gICAgICAgICAgZWRpdE9uS2V5UHJlc3M6IGZhbHNlLFxyXG4gICAgICAgICAgZW5hYmxlZDogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNob3dDb2x1bW5IZWFkZXJzOiB0cnVlLFxyXG4gICAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGZvY3VzZWRSb3dFbmFibGVkOiBmYWxzZSxcclxuICAgICAgICBzaG93Qm9yZGVyczogZmFsc2UsXHJcbiAgICAgICAgaGVpZ2h0OiB0aGlzLm9wdGlvbnMuZWRpdE1vZGUgPyAnY2FsYygxMDAlIC0gNTFweCknIDogJzEwMCUnLFxyXG4gICAgICAgIHNjcm9sbGluZzogeyBtb2RlOiAnc3RhbmRhcmQnIH0sXHJcbiAgICAgICAgcGFnaW5nOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXHJcbiAgICAgICAgbm9EYXRhVGV4dDogJ05vIGRpc3BsYXlzJyxcclxuICAgICAgICBvbkluaXRpYWxpemVkOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZmlsdGVycyA9IGF3YWl0IHRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmdldEZpbHRlcnMoKTtcclxuICAgICAgICAgIGNvbnN0IHZpZXdzID0gYXdhaXQgdGhpcy5ncmlkVmlld3NNYW5hZ2VyLmdldFZpZXdzKCk7XHJcblxyXG4gICAgICAgICAgZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKCdGaWx0ZXJJZCcsICdsb29rdXAuZGF0YVNvdXJjZScsIGZpbHRlcnMpO1xyXG4gICAgICAgICAgZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKCdWaWV3SWQnLCAnbG9va3VwLmRhdGFTb3VyY2UnLCB2aWV3cyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkNlbGxDbGljazogYXN5bmMgKGUpID0+IHtcclxuICAgICAgICAgIGlmIChlLnJvd1R5cGUgIT09ICdkYXRhJykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3ZhbHVlJywgZS5kYXRhLklkKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uUm93UmVtb3Zpbmc6IGFzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFHcmlkLmJlZ2luQ3VzdG9tTG9hZGluZygnTG9hZGluZycpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmRlbGV0ZURpc3BsYXkoZS5rZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmR4RGF0YUdyaWQoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZURpc3BsYXlzVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHtcclxuICAgIGNvbnN0IGJhc2ljT3B0aW9uczogRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveC5Qcm9wZXJ0aWVzIHwgRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94LlByb3BlcnRpZXMgPSB7XHJcbiAgICAgIHZhbHVlRXhwcjogJ0lkJyxcclxuICAgICAgZGlzcGxheUV4cHI6ICdOYW1lJyxcclxuICAgICAgc2hvd0NsZWFyQnV0dG9uOiB0cnVlLFxyXG4gICAgICBwbGFjZWhvbGRlcjogJ05vbmUnLFxyXG4gICAgICB3aWR0aDogMjAwLFxyXG4gICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGlzcGxheXNEcm9wZG93bkJveCA9IGUuY29tcG9uZW50O1xyXG4gICAgICAgIHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5nZXREaXNwbGF5cygpO1xyXG4gICAgICB9LFxyXG4gICAgICBvblZhbHVlQ2hhbmdlZDogYXN5bmMgKGUpID0+IHtcclxuICAgICAgICBjb25zdCBkaXNwbGF5ID0gdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmN1cnJlbnREaXNwbGF5O1xyXG5cclxuICAgICAgICBjb25zdCBmaWx0ZXJDaGFuZ2VkID0gZGlzcGxheSAmJiBkaXNwbGF5LkZpbHRlcklkICE9PSB0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQ7XHJcbiAgICAgICAgY29uc3Qgdmlld0NoYW5nZWQgPSBkaXNwbGF5ICYmIGRpc3BsYXkuVmlld0lkICE9PSB0aGlzLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZDtcclxuXHJcbiAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgKGZpbHRlckNoYW5nZWQgfHwgdmlld0NoYW5nZWRcclxuICAgICAgICAgID8gdGhpcy5jb25maXJtQ2hhbmdlc0xvc3MoKVxyXG4gICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUodHJ1ZSkpO1xyXG5cclxuICAgICAgICBpZiAoY29uZmlybWVkKSB7XHJcbiAgICAgICAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuY3VycmVudERpc3BsYXlJZCA9IGUudmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGRyb3BEb3duQm94T3B0aW9uczogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94T3B0aW9ucyA9IHtcclxuICAgICAgZWxlbWVudEF0dHI6IHtjbGFzczogJ2lzem9sZWEtbWQnfSxcclxuICAgICAgZHJvcERvd25PcHRpb25zOiB7XHJcbiAgICAgICAgd2lkdGg6IDgwMFxyXG4gICAgICB9LFxyXG4gICAgICBjb250ZW50VGVtcGxhdGU6ICF0aGlzLm9wdGlvbnMuZWRpdE1vZGUgPyB2b2lkIDAgOiAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YUdyaWQgPSB0aGlzLmNyZWF0ZURhdGFHcmlkKGUuY29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUgPSB0aGlzLmNyZWF0ZUN1cnJlbnREaXNwbGF5VGl0bGUoZS5jb21wb25lbnQpO1xyXG4gICAgICAgIHRoaXMuc2F2ZUJ1dHRvbiA9IHRoaXMuY3JlYXRlU2F2ZVZpZXdCdXR0b24oKTtcclxuICAgICAgICB0aGlzLnNhdmVBc0J1dHRvbiA9IHRoaXMuY3JlYXRlU2F2ZVZpZXdBc0J1dHRvbigpO1xyXG5cclxuICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRlbnRIZWFkZXIgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgIC5hZGRDbGFzcygnYXBzLWRpc3BsYXlzX19oZWFkZXInKVxyXG4gICAgICAgICAgLmFwcGVuZCh0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUuZWxlbWVudCgpKVxyXG4gICAgICAgICAgLmFwcGVuZCh0aGlzLnNhdmVCdXR0b24uZWxlbWVudCgpKVxyXG4gICAgICAgICAgLmFwcGVuZCh0aGlzLnNhdmVBc0J1dHRvbi5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRlbnQgPSAkKCc8ZGl2IC8+JykuaGVpZ2h0KCcxMDAlJyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZWRpdE1vZGUpIHtcclxuICAgICAgICAgIGRyb3Bkb3duQ29udGVudC5hcHBlbmQoZHJvcGRvd25Db250ZW50SGVhZGVyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRyb3Bkb3duQ29udGVudC5hcHBlbmQodGhpcy5kYXRhR3JpZC5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICByZXR1cm4gZHJvcGRvd25Db250ZW50O1xyXG4gICAgICB9LFxyXG4gICAgICBvbk9wZW5lZDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2F2ZUFzQnV0dG9uICYmIHRoaXMuc2F2ZUFzQnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCAhdGhpcy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkKTtcclxuICAgICAgICB0aGlzLnNhdmVCdXR0b24gJiYgdGhpcy5zYXZlQnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCAhdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmN1cnJlbnREaXNwbGF5KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB3aWRnZXQ6IHRoaXMub3B0aW9ucy5lZGl0TW9kZSA/ICgnZHhEcm9wRG93bkJveCcgYXMgYW55KSA6ICdkeFNlbGVjdEJveCcsXHJcbiAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICB0ZXh0OiAnRGlzcGxheXMnLFxyXG4gICAgICBjc3NDbGFzczogJ2Fwcy1kaXNwbGF5c19fdG9vbGJhci1pdGVtJyxcclxuICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLmVkaXRNb2RlID8gJC5leHRlbmQoYmFzaWNPcHRpb25zLCBkcm9wRG93bkJveE9wdGlvbnMpIDogYmFzaWNPcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVJbXBvcnRGaWxlVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICBpY29uOiAndXBsb2FkJyxcclxuICAgICAgICBoaW50OiAnSW1wb3J0IGZpbGUnLFxyXG4gICAgICAgIGhlaWdodDogMzAsXHJcbiAgICAgICAgc3R5bGluZ01vZGU6ICd0ZXh0JyxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5maWxlSW1wb3J0ZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5maWxlSW1wb3J0ZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuZmlsZUltcG9ydGVyID0gbmV3IEZpbGVJbXBvcnRlcih7XHJcbiAgICAgICAgICAgICRjb250YWluZXI6IHRoaXMub3B0aW9ucy5vd25lci5lbGVtZW50KCkucGFyZW50KCksXHJcbiAgICAgICAgICAgIHRpdGxlOiAnSW1wb3J0IEZpbGUgdG8gQ0RNJyxcclxuICAgICAgICAgICAgY3JlYXRlVGFibGVVcmw6IHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMuY3JlYXRlVGFibGVVcmwsXHJcbiAgICAgICAgICAgIGFkZFJvd3NVcmw6IHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMuYWRkUm93c1VybCxcclxuICAgICAgICAgICAgZmlsZVVwbG9hZFVybDogdGhpcy5pbXBvcnRGaWxlT3B0aW9ucy5maWxlVXBsb2FkVXJsLFxyXG4gICAgICAgICAgICBwcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGU6IHRoaXMuZ2V0UHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlKHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMubW9kZSksXHJcbiAgICAgICAgICAgIHByZWRlZmluZWRUYWJsZTogdGhpcy5pbXBvcnRGaWxlT3B0aW9ucy5wcmVkZWZpbmVkVGFibGUsXHJcbiAgICAgICAgICAgIGNyZWF0ZVRhYmxlQnV0dG9uVGV4dDogJ1JlcGxhY2UgQWxsIFJvd3MnLFxyXG4gICAgICAgICAgICBjcmVhdGVUYWJsZU1vZGVUZXh0OiAnUmVwbGFjZSBSb3dzJyxcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHRoaXMuZmlsZUltcG9ydGVyLm9uKEZpbGVJbXBvcnRlci5UQUJMRV9VUERBVEVEX0VWRU5ULCAoKSA9PiB0aGlzLm9wdGlvbnMub3duZXIucmVmcmVzaCgpKTtcclxuICAgICAgICAgIHRoaXMuZmlsZUltcG9ydGVyLnNob3coKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQ29udGVudFJlYWR5OiAoZSkgPT4ge1xyXG4gICAgICAgICAgZS5lbGVtZW50LmZpbmQoJy5keC1idXR0b24tY29udGVudCcpLmNzcyh7XHJcbiAgICAgICAgICAgIHBhZGRpbmdUb3A6IDUsXHJcbiAgICAgICAgICAgIHBhZGRpbmdCb3R0b206IDVcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlKG1vZGU6IENkbUltcG9ydEZpbGVNb2RlKTogSW1wb3J0RmlsZU1vZGUge1xyXG4gICAgc3dpdGNoIChtb2RlKSB7XHJcbiAgICAgIGNhc2UgQ2RtSW1wb3J0RmlsZU1vZGUuQWRkTmV3Um93czpcclxuICAgICAgICByZXR1cm4gSW1wb3J0RmlsZU1vZGUuQWRkTmV3Um93cztcclxuXHJcbiAgICAgIGNhc2UgQ2RtSW1wb3J0RmlsZU1vZGUuUmVwbGFjZUFsbFJvd3M6XHJcbiAgICAgICAgcmV0dXJuIEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG1vZGUnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlQ3VycmVudERpc3BsYXlUaXRsZShkcm9wZG93bkJveE93bmVyOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3gpOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLWRpc3BsYXlzX19jdXJyZW50LWRpc3BsYXkgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keFRleHRCb3goe1xyXG4gICAgICAgIHZhbHVlOiBkcm9wZG93bkJveE93bmVyLm9wdGlvbigndGV4dCcpIHx8IGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCdwbGFjZWhvbGRlcicpLFxyXG4gICAgICAgIGRpc2FibGVkOiAhdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmN1cnJlbnREaXNwbGF5LFxyXG4gICAgICB9KVxyXG4gICAgICAuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlVmlld0J1dHRvbigpOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHtcclxuICAgIHJldHVybiAkKCc8YnV0dG9uIC8+JylcclxuICAgICAgLmFkZENsYXNzKCdhcHMtZGlzcGxheXNfX3NhdmUtZGlzcGxheSBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICB0ZXh0OiAnU2F2ZScsXHJcbiAgICAgICAgdHlwZTogJ25vcm1hbCcsXHJcbiAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuY3VycmVudERpc3BsYXksXHJcbiAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhR3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ0xvYWRpbmcnKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIudXBkYXRlQ3VycmVudERpc3BsYXkoXHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudERpc3BsYXlUaXRsZS5vcHRpb24oJ3ZhbHVlJyksXHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCxcclxuICAgICAgICAgICAgdGhpcy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBpY29uOiAnc2F2ZScsXHJcbiAgICAgICAgd2lkdGg6IDEyNVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVNhdmVWaWV3QXNCdXR0b24oKTogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB7XHJcbiAgICByZXR1cm4gJCgnPGJ1dHRvbiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLWRpc3BsYXlfX3NhdmUtZGlzcGxheS1hcyBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICB0ZXh0OiAnU2F2ZSBBcycsXHJcbiAgICAgICAgdHlwZTogJ25vcm1hbCcsXHJcbiAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQsXHJcbiAgICAgICAgb25DbGljazogKCkgPT4gKFxyXG4gICAgICAgICAgdGhpcy5jcmVhdGVTYXZlQXNEaWFsb2coKVxyXG4gICAgICAgICksXHJcbiAgICAgICAgaWNvbjogJ3NhdmUnLFxyXG4gICAgICAgIHdpZHRoOiAxNjBcclxuICAgICAgfSlcclxuICAgICAgLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlQXNEaWFsb2coKSB7XHJcbiAgICBjb25zdCAkcG9wdXBDb250ZW50ID0gJCgnPGRpdiAvPicpO1xyXG5cclxuICAgIGNvbnN0IGRpYWxvZ0NvbnRlbnRFbGVtZW50ID0gJCgnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206OHB4O1wiIC8+JykuZHhUZXh0Qm94KHtcclxuICAgICAgcGxhY2Vob2xkZXI6ICdEaXNwbGF5IE5hbWUnLFxyXG4gICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICB9KS5keFZhbGlkYXRvcih7XHJcbiAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgIHsgdHlwZTogJ3JlcXVpcmVkJyB9LFxyXG4gICAgICBdXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IG5hbWVUZXh0Qm94ID0gZGlhbG9nQ29udGVudEVsZW1lbnQuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG4gICAgY29uc3QgdmFsaWRhdG9yID0gZGlhbG9nQ29udGVudEVsZW1lbnQuZHhWYWxpZGF0b3IoJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgbmFtZVRleHRCb3guZWxlbWVudCgpLmFwcGVuZFRvKCRwb3B1cENvbnRlbnQpO1xyXG5cclxuICAgIHJldHVybiBjcmVhdGVEaWFsb2coXHJcbiAgICAgIHtcclxuICAgICAgICB0aXRsZTogJ0NyZWF0ZSBOZXcgRGlzcGxheScsXHJcbiAgICAgICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgICBtYXhXaWR0aDogJzMwMHB4JyxcclxuICAgICAgfSxcclxuICAgICAgJHBvcHVwQ29udGVudCxcclxuICAgICAge1xyXG4gICAgICAgIHRleHQ6ICdPaycsXHJcbiAgICAgICAgb25DbGljazogYXN5bmMgKGNsb3NlUG9wdXApID0+IHtcclxuICAgICAgICAgIGlmICghdmFsaWRhdG9yLnZhbGlkYXRlKCkuaXNWYWxpZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5kYXRhR3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ0xvYWRpbmcnKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuY3JlYXRlTmV3RGlzcGxheShcclxuICAgICAgICAgICAgbmFtZVRleHRCb3gub3B0aW9uKCd2YWx1ZScpLFxyXG4gICAgICAgICAgICB0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQsXHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIGNsb3NlUG9wdXAoKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdGV4dDogJ0NhbmNlbCcsXHJcbiAgICAgICAgb25DbGljazogKGNsb3NlUG9wdXApID0+IGNsb3NlUG9wdXAoKVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY29uZmlybUNoYW5nZXNMb3NzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oXHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgICdZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMgdGhhdCB3aWxsIGJlIGxvc3QgaWYgeW91IGNsb3NlIHRoaXMgcG9wdXAuIERvIHlvdSB3YW50IHRvIGNsb3NlIHRoZSBwb3B1cCBhbmQgbm90IHNhdmUgY2hhbmdlcz8nLFxyXG4gICAgICAnVW5zYXZlZCBjaGFuZ2VzJ1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGRpc3BsYXlzVG9vbGJhckl0ZW0oKSB7XHJcbiAgICBpZiAoIXRoaXMuX2Rpc3BsYXlzVG9vbGJhckl0ZW0pIHtcclxuICAgICAgdGhpcy5fZGlzcGxheXNUb29sYmFySXRlbSA9IHRoaXMuY3JlYXRlRGlzcGxheXNUb29sYmFySXRlbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9kaXNwbGF5c1Rvb2xiYXJJdGVtO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgaW1wb3J0RmlsZVRvb2xiYXJJdGVtKCkge1xyXG4gICAgaWYgKCF0aGlzLl9pbXBvcnRGaWxlVG9vbGJhckl0ZW0pIHtcclxuICAgICAgdGhpcy5faW1wb3J0RmlsZVRvb2xiYXJJdGVtID0gdGhpcy5jcmVhdGVJbXBvcnRGaWxlVG9vbGJhckl0ZW0oKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5faW1wb3J0RmlsZVRvb2xiYXJJdGVtO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uIGZyb20gJy4uLy4uLy4uL0RhdGEvTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24nO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XHJcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIGRlbGV0ZURhdGFVcmw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXkge1xyXG4gIHJlYWRvbmx5IElkOiBudW1iZXI7XHJcbiAgcmVhZG9ubHkgTmFtZTogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IEZpbHRlcklkOiBudW1iZXI7XHJcbiAgcmVhZG9ubHkgVmlld0lkOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkRGlzcGxheXNNYW5hZ2VyIHtcclxuICBwcml2YXRlIGRpc3BsYXlzOiBJQ29udHJvbERpc3BsYXlbXSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50SGFuZGxlcnM6IHtcclxuICAgIGNoYW5nZWQ6IEFycmF5PChkaXNwbGF5OiBJQ29udHJvbERpc3BsYXkpID0+IHZvaWQ+LFxyXG4gICAgbG9hZGVkOiBBcnJheTwoZGlzcGxhaXM6IElDb250cm9sRGlzcGxheVtdKSA9PiB2b2lkPlxyXG4gIH07XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfY3VycmVudERpc3BsYXlJZDogbnVtYmVyID0gMDtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zZXJ0RGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJR3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnMpIHtcclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy5pbnNlcnREYXRhVXJsID0gb3B0aW9ucy5pbnNlcnREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gICAgdGhpcy5kZWxldGVEYXRhVXJsID0gb3B0aW9ucy5kZWxldGVEYXRhVXJsO1xyXG5cclxuICAgIHRoaXMuZXZlbnRIYW5kbGVycyA9IHtcclxuICAgICAgY2hhbmdlZDogW10sXHJcbiAgICAgIGxvYWRlZDogW11cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgbG9hZERpc3BsYXlzKCkge1xyXG4gICAgdGhpcy5kaXNwbGF5cyA9IGF3YWl0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uPElDb250cm9sRGlzcGxheVtdPih0aGlzLmxvYWREYXRhVXJsKTtcclxuICAgIHRoaXMub25EaXNwbGFpc0xvYWRlZFByaXZhdGUoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXREaXNwbGF5cygpIHtcclxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlzIHx8IGF3YWl0IHRoaXMubG9hZERpc3BsYXlzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGlzcGxheUJ5SWQgPSAoaWQ6IG51bWJlcikgPT4ge1xyXG4gICAgaWYgKCFpZCB8fCAhdGhpcy5kaXNwbGF5cykge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5cy5maW5kKCh2KSA9PiB2LklkID09PSBpZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgY3JlYXRlTmV3RGlzcGxheShuYW1lOiBzdHJpbmcsIGZpbHRlcklkOiBudW1iZXIsIHZpZXdJZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBuZXdWaWV3RHRvID0ge1xyXG4gICAgICBJZDogMCxcclxuICAgICAgTmFtZTogbmFtZSxcclxuICAgICAgRmlsdGVySWQ6IGZpbHRlcklkLFxyXG4gICAgICBWaWV3SWQ6IHZpZXdJZFxyXG4gICAgfTtcclxuXHJcbiAgICBhd2FpdCBzZW5kUmVxdWVzdCh0aGlzLmluc2VydERhdGFVcmwsICdQT1NUJywgbmV3Vmlld0R0byk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWREaXNwbGF5cygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGRlbGV0ZURpc3BsYXkoaWQ6IG51bWJlcikge1xyXG4gICAgYXdhaXQgc2VuZFJlcXVlc3QodGhpcy5kZWxldGVEYXRhVXJsLCAnREVMRVRFJywgeyBpZCB9KTtcclxuICAgIGF3YWl0IHRoaXMubG9hZERpc3BsYXlzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQ3VycmVudERpc3BsYXkobmFtZTogc3RyaW5nLCBmaWx0ZXJJZDogbnVtYmVyLCB2aWV3SWQ6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMudXBkYXRlRGlzcGxheSh0aGlzLmN1cnJlbnREaXNwbGF5LklkLCBuYW1lLCBmaWx0ZXJJZCwgdmlld0lkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVEaXNwbGF5KGlkOiBudW1iZXIsIG5hbWU6IHN0cmluZywgZmlsdGVySWQ6IG51bWJlciwgdmlld0lkOiBudW1iZXIpIHtcclxuICAgIGF3YWl0IHNlbmRSZXF1ZXN0KHRoaXMudXBkYXRlRGF0YVVybCwgJ1BVVCcsIHtcclxuICAgICAgaWQsIG5hbWUsIGZpbHRlcklkLCB2aWV3SWRcclxuICAgIH0pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRGlzcGxheXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25EaXNwbGF5Q2hhbmdlZFByaXZhdGUoKSB7XHJcbiAgICB0aGlzLmV2ZW50SGFuZGxlcnMuY2hhbmdlZC5mb3JFYWNoKChoYW5kbGVycykgPT4gKFxyXG4gICAgICBoYW5kbGVycyh0aGlzLmN1cnJlbnREaXNwbGF5KVxyXG4gICAgKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uRGlzcGxhaXNMb2FkZWRQcml2YXRlKCkge1xyXG4gICAgdGhpcy5ldmVudEhhbmRsZXJzLmxvYWRlZC5mb3JFYWNoKChoYW5kbGVycykgPT4gKFxyXG4gICAgICBoYW5kbGVycyh0aGlzLmRpc3BsYXlzKVxyXG4gICAgKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnREaXNwbGF5SWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudERpc3BsYXlJZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgY3VycmVudERpc3BsYXlJZChpZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9jdXJyZW50RGlzcGxheUlkID0gaWQ7XHJcbiAgICB0aGlzLm9uRGlzcGxheUNoYW5nZWRQcml2YXRlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnREaXNwbGF5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RGlzcGxheUJ5SWQodGhpcy5fY3VycmVudERpc3BsYXlJZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IG9uRGlzcGxheUNoYW5nZWQoaGFuZGxlcjogKGRpc3BsYXk6IElDb250cm9sRGlzcGxheSkgPT4gdm9pZCkge1xyXG4gICAgdGhpcy5ldmVudEhhbmRsZXJzLmNoYW5nZWQucHVzaChoYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgb25EaXNwbGFpc0xvYWRlZChoYW5kbGVyOiAoZGlzcGxhaXM6IElDb250cm9sRGlzcGxheVtdKSA9PiB2b2lkKSB7XHJcbiAgICB0aGlzLmV2ZW50SGFuZGxlcnMubG9hZGVkLnB1c2goaGFuZGxlcik7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBNdXRhYmxlIH0gZnJvbSAnLi4vLi4vLi4vQ29tcG9uZW50cy9Db3JlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luT3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgb3duZXI6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICByZWFkb25seSBhdXRvSW50ZWdyYXRpb246IGJvb2xlYW47XHJcbn1cclxuXHJcbmludGVyZmFjZSBJTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5EZWZhdWx0T3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgYXV0b0ludGVncmF0aW9uOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbk9wdGlvbnMgPVxyXG4gIE11dGFibGU8T21pdDxJTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5PcHRpb25zLCBrZXlvZiBJTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5EZWZhdWx0T3B0aW9ucz4+ICZcclxuICBNdXRhYmxlPFBhcnRpYWw8SU11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luRGVmYXVsdE9wdGlvbnM+PjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbiB7XHJcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IElNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbk9wdGlvbnM7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luT3B0aW9ucykge1xyXG4gICAgdGhpcy5vcHRpb25zID0ge1xyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgICBhdXRvSW50ZWdyYXRpb246IChvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuYXV0b0ludGVncmF0aW9uICE9PSBudWxsKVxyXG4gICAgICAgID8gb3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gOiB0cnVlXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMub3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gJiYgdGhpcy5pbnRlZ3JhdGVUb0dyaWQodGhpcy5vcHRpb25zLm93bmVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW50ZWdyYXRlVG9HcmlkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gICAgZ3JpZC5vcHRpb24oJ3NlbGVjdGlvbicsIHtcclxuICAgICAgbW9kZTogJ211bHRpcGxlJ1xyXG4gICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydzZWxlY3Rpb24nXSk7XHJcbiAgICBncmlkLm9uKCdlZGl0b3JQcmVwYXJpbmcnLCB0aGlzLm9uR3JpZEVkaXRvclByZXBhcmluZyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9uR3JpZEVkaXRvclByZXBhcmluZzogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snb25FZGl0b3JQcmVwYXJpbmcnXSA9IChlKSA9PiB7XHJcbiAgICBpZiAoIWUuY29tcG9uZW50IHx8ICFlLmVkaXRvck9wdGlvbnMgfHwgZS5wYXJlbnRUeXBlICE9PSAnZGF0YVJvdycgfHwgIWUuZGF0YUZpZWxkIHx8ICFlLnJvdyB8fCAhZS5yb3cua2V5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkYXRhRmllbGQgPSBlLmRhdGFGaWVsZDtcclxuICAgIGNvbnN0IGVkaXRvcktleSA9IGUucm93LmtleTtcclxuICAgIGNvbnN0IGRlZmF1bHRMaXN0ZW5lciA9IGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZDtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tc2hhZG93ZWQtdmFyaWFibGVcclxuICAgIGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZCA9IChldmVudDogeyB2YWx1ZTogYW55IH0pID0+IHtcclxuICAgICAgZGVmYXVsdExpc3RlbmVyKGV2ZW50KTtcclxuXHJcbiAgICAgIHRoaXMudXBkYXRlTXVsdGlwbGVSb3dzKGRhdGFGaWVsZCwgZWRpdG9yS2V5LCBldmVudC52YWx1ZSk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVNdWx0aXBsZVJvd3M8VD4oZGF0YUZpZWxkOiBzdHJpbmcsIGVkaXRvcktleTogc3RyaW5nLCB2YWx1ZTogVCkge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRSb3dLZXlzOiBzdHJpbmdbXSA9IGF3YWl0IHRoaXMub3B0aW9ucy5vd25lci5nZXRTZWxlY3RlZFJvd0tleXMoKTtcclxuICAgIGlmICghc2VsZWN0ZWRSb3dLZXlzLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZWRpdG9yS2V5U2VsZWN0ZWRJbmRleCA9IHNlbGVjdGVkUm93S2V5cy5maW5kSW5kZXgoKGspID0+IGsgPT09IGVkaXRvcktleSk7XHJcbiAgICBpZiAoZWRpdG9yS2V5U2VsZWN0ZWRJbmRleCA8IDAgfHwgc2VsZWN0ZWRSb3dLZXlzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0ZWRSb3dLZXlzLnNwbGljZShlZGl0b3JLZXlTZWxlY3RlZEluZGV4LCAxKTtcclxuICAgIHNlbGVjdGVkUm93S2V5cy5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgdGhpcy5vcHRpb25zLm93bmVyLmNlbGxWYWx1ZSh0aGlzLm9wdGlvbnMub3duZXIuZ2V0Um93SW5kZXhCeUtleShrZXkpLCBkYXRhRmllbGQsIHZhbHVlKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgR3JpZFZpZXdzTWFuYWdlciB9IGZyb20gJy4vR3JpZFZpZXdzTWFuYWdlcic7XHJcbmltcG9ydCB7IE11dGFibGUgfSBmcm9tICcuLi8uLi8uLi9Db21wb25lbnRzL0NvcmUnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbiBmcm9tICcuLi8uLi8uLi9EYXRhL0xvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzIHtcclxuICByZWFkb25seSBkZWZhdWx0RmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICByZWFkb25seSBkZWZhdWx0Vmlld0lkOiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG8ge1xyXG4gIERlZmF1bHRGaWx0ZXJJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIERlZmF1bHRWaWV3SWQ6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgdXNlcklkOiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgbG9hZGVkVXNlclNldHRpbmdzPzogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzO1xyXG59XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWVtcHR5LWludGVyZmFjZVxyXG5pbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckRlZmF1bHRPcHRpb25zIHtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgQVBTQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucyA9XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICBNdXRhYmxlPE9taXQ8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnMsIGtleW9mIElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJEZWZhdWx0T3B0aW9ucz4+ICZcclxuICBNdXRhYmxlPFBhcnRpYWw8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckRlZmF1bHRPcHRpb25zPj47XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyIHtcclxuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnM7XHJcblxyXG4gIHB1YmxpYyByZWFkb25seSBkZWZhdWx0VXNlclNldHRpbmdzOiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3MgPSB7XHJcbiAgICBkZWZhdWx0RmlsdGVySWQ6IHVuZGVmaW5lZCxcclxuICAgIGRlZmF1bHRWaWV3SWQ6IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZFxyXG4gIH07XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXHJcbiAgcHJvdGVjdGVkIF9sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3M6IElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGlzTGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzRXhwaXJlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBhdXRvUmVzZXR0aW5nQ2FjaGVUaW1lcklkOiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEFQU0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnMpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IHtcclxuICAgICAgLi4ub3B0aW9ucyxcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sb2FkZWRVc2VyU2V0dGluZ3MpIHtcclxuICAgICAgdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3MgPSB0aGlzLm9wdGlvbnMubG9hZGVkVXNlclNldHRpbmdzO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3RhcnRBdXRvQ2FjaGVSZXNldHRpbmdUaW1lcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBsYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3MoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fbGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBsYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3ModmFsdWU6IElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncykge1xyXG4gICAgdGhpcy5fbGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzID0gdmFsdWU7XHJcbiAgICB0aGlzLmlzTGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzRXhwaXJlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFVzZXJTZXR0aW5ncygpOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4ge1xyXG4gICAgaWYgKCF0aGlzLmlzTGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzRXhwaXJlZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3M7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmxvYWRVc2VyU2V0dGluZ3MoKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVVc2VyU2V0dGluZ3ModXBkYXRlczogUGFydGlhbDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+KTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMubGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzID0gYXdhaXQgdGhpcy51cGRhdGVVc2VyU2V0dGluZ3NJbnRlcm5hbCh1cGRhdGVzKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgbG9hZFVzZXJTZXR0aW5ncygpOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz47XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgdXBkYXRlVXNlclNldHRpbmdzSW50ZXJuYWwodXBkYXRlczogUGFydGlhbDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+KTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+O1xyXG5cclxuICBwcm90ZWN0ZWQgc3RhcnRBdXRvQ2FjaGVSZXNldHRpbmdUaW1lcigpIHtcclxuICAgIHRoaXMuYXV0b1Jlc2V0dGluZ0NhY2hlVGltZXJJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNMYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3NFeHBpcmVkID0gdHJ1ZTtcclxuICAgIH0sIDUwMDApO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHN0b3BBdXRvQ2FjaGVSZXNldHRpbmdUaW1lcigpIHtcclxuICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuYXV0b1Jlc2V0dGluZ0NhY2hlVGltZXJJZCk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTG9jYWxDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIgZXh0ZW5kcyBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIge1xyXG4gIHByb3RlY3RlZCBzdGF0aWMgcmVhZG9ubHkgdXNlclNldHRpbmdzU3RvcmFnZUtleSA9ICdhcHM6Y29udHJvbC1kaXNwbGF5OnVzZXItc2V0dGluZ3MnO1xyXG5cclxuICBwcm90ZWN0ZWQgYXN5bmMgbG9hZFVzZXJTZXR0aW5ncygpOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4ge1xyXG4gICAgY29uc3QgcmF3VXNlclNldHRpbmdzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oTG9jYWxDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIudXNlclNldHRpbmdzU3RvcmFnZUtleSk7XHJcbiAgICBpZiAoIXJhd1VzZXJTZXR0aW5ncykge1xyXG4gICAgICByZXR1cm4gdGhpcy5kZWZhdWx0VXNlclNldHRpbmdzO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHVzZXJTZXR0aW5nczogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzID0gSlNPTi5wYXJzZShyYXdVc2VyU2V0dGluZ3MpO1xyXG5cclxuICAgIHJldHVybiB1c2VyU2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHByb3RlY3RlZCBhc3luYyB1cGRhdGVVc2VyU2V0dGluZ3NJbnRlcm5hbCh1cGRhdGVzOiBQYXJ0aWFsPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4pOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4ge1xyXG4gICAgY29uc3QgY3VycmVudFVzZXJTZXR0aW5ncyA9IGF3YWl0IHRoaXMuZ2V0VXNlclNldHRpbmdzKCk7XHJcbiAgICBjb25zdCB1cGRhdGVkVXNlclNldHRpbmdzID0geyAuLi5jdXJyZW50VXNlclNldHRpbmdzLCAuLi51cGRhdGVzIH07XHJcblxyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTG9jYWxDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIudXNlclNldHRpbmdzU3RvcmFnZUtleSxcclxuICAgICAgSlNPTi5zdHJpbmdpZnkodXBkYXRlZFVzZXJTZXR0aW5ncykpO1xyXG5cclxuICAgIHJldHVybiB1cGRhdGVkVXNlclNldHRpbmdzO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnMge1xyXG4gIGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucyA9XHJcbiAgSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnMgJiBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnM7XHJcblxyXG5leHBvcnQgY2xhc3MgUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyIGV4dGVuZHMgQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJPcHRpb25zKSB7XHJcbiAgICBzdXBlcihvcHRpb25zKTtcclxuXHJcbiAgICB0aGlzLmxvYWREYXRhVXJsID0gb3B0aW9ucy5sb2FkRGF0YVVybDtcclxuICAgIHRoaXMudXBkYXRlRGF0YVVybCA9IG9wdGlvbnMudXBkYXRlRGF0YVVybDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhc3luYyBsb2FkVXNlclNldHRpbmdzKCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPiB7XHJcbiAgICBjb25zdCB1c2VyU2V0dGluZ3NEdG8gPSBhd2FpdCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbjxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG8+KHRoaXMubG9hZERhdGFVcmwpO1xyXG5cclxuICAgIHJldHVybiB1c2VyU2V0dGluZ3NEdG8gPyB0aGlzLm1hcENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzRHRvVG9Nb2RlbCh1c2VyU2V0dGluZ3NEdG8pIDogdGhpcy5kZWZhdWx0VXNlclNldHRpbmdzO1xyXG4gIH1cclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlVXNlclNldHRpbmdzSW50ZXJuYWwodXBkYXRlczogUGFydGlhbDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+KTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+IHtcclxuICAgIGNvbnN0IGN1cnJlbnRVc2VyU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmdldFVzZXJTZXR0aW5ncygpO1xyXG4gICAgY29uc3QgdXBkYXRlZFVzZXJTZXR0aW5ncyA9IHsgLi4uY3VycmVudFVzZXJTZXR0aW5ncywgLi4udXBkYXRlcyB9O1xyXG5cclxuICAgIGNvbnN0IHVwZGF0ZWRVc2VyU2V0dGluZ3NEdG8gPSBhd2FpdCBzZW5kUmVxdWVzdDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG8+KFxyXG4gICAgICB0aGlzLnVwZGF0ZURhdGFVcmwsICdQVVQnLFxyXG4gICAgICB0aGlzLm1hcENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTW9kZWxUb0R0byh1cGRhdGVkVXNlclNldHRpbmdzKVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5tYXBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc0R0b1RvTW9kZWwodXBkYXRlZFVzZXJTZXR0aW5nc0R0byk7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHByaXZhdGUgbWFwQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNb2RlbFRvRHRvKG1vZGVsOiBQYXJ0aWFsPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4pOiBQYXJ0aWFsPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc0R0bz4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgRGVmYXVsdEZpbHRlcklkOiBtb2RlbC5kZWZhdWx0RmlsdGVySWQsXHJcbiAgICAgIERlZmF1bHRWaWV3SWQ6IG1vZGVsLmRlZmF1bHRWaWV3SWRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHByaXZhdGUgbWFwQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG9Ub01vZGVsKGR0bzogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzRHRvKTogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGRlZmF1bHRGaWx0ZXJJZDogZHRvLkRlZmF1bHRGaWx0ZXJJZCxcclxuICAgICAgZGVmYXVsdFZpZXdJZDogZHRvLkRlZmF1bHRWaWV3SWRcclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZleHBvcnQgZnVuY3Rpb24gZ2V0U3VtbWFyeUNvbHVtbihjb2x1bW5zOiBBcnJheTx7IHZpc2libGVJbmRleDogbnVtYmVyLCB2aXNpYmxlOiBib29sZWFuLCBkYXRhRmllbGQ6IHN0cmluZyB9PiB8XHJcbiAgUmVhZG9ubHlBcnJheTxQaWNrPERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbiwgJ3Zpc2libGVJbmRleCcgfCAndmlzaWJsZScgfCAnZGF0YUZpZWxkJz4+KSB7XHJcbiAgbGV0IGNvbHVtbkZvclN1bW1hcnkgPSAnJztcclxuXHJcbiAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcigoYykgPT4gYy52aXNpYmxlKTtcclxuICBjb25zdCBjb2x1bW5zV2l0aEluZGV4ID0gdmlzaWJsZUNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLnZpc2libGVJbmRleCAhPT0gbnVsbCAmJiBjLnZpc2libGVJbmRleCAhPT0gdm9pZCAwKTtcclxuXHJcbiAgaWYgKCEhY29sdW1uc1dpdGhJbmRleC5sZW5ndGgpIHtcclxuICAgIGNvbHVtbkZvclN1bW1hcnkgPSBjb2x1bW5zV2l0aEluZGV4LnNvcnQoKGEsIGIpID0+IGEudmlzaWJsZUluZGV4IC0gYi52aXNpYmxlSW5kZXgpWzBdLmRhdGFGaWVsZDtcclxuICB9IGVsc2Uge1xyXG4gICAgY29sdW1uRm9yU3VtbWFyeSA9ICh2aXNpYmxlQ29sdW1uc1swXSAmJiB2aXNpYmxlQ29sdW1uc1swXS5kYXRhRmllbGQpIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNvbHVtbkZvclN1bW1hcnk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQgfSBmcm9tICcuL0dyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQnO1xyXG5pbXBvcnQgeyBHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQgfSBmcm9tICcuL0dyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQsIElGaWxlSW1wb3J0ZXJPcHRpb25zIH0gZnJvbSAnLi9HcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50JztcclxuaW1wb3J0IHsgR3JpZERpc3BsYXlzTWFuYWdlciwgSUdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zIH0gZnJvbSAnLi9HcmlkRGlzcGxheXNNYW5hZ2VyJztcclxuaW1wb3J0IHsgR3JpZFZpZXdzTWFuYWdlciwgSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zIH0gZnJvbSAnLi9HcmlkVmlld3NNYW5hZ2VyJztcclxuaW1wb3J0IHsgR3JpZEZpbHRlcnNNYW5hZ2VyLCBJR3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucyB9IGZyb20gJy4vR3JpZEZpbHRlcnNNYW5hZ2VyJztcclxuaW1wb3J0IHsgTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4gfSBmcm9tICcuL011bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luJztcclxuaW1wb3J0IHsgSVJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zLCBSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIgfSBmcm9tICcuL0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlcic7XHJcbmltcG9ydCB7IERpc3BsYXlUeXBlLCBJRGlzcGxheVR5cGVTZXR0aW5ncywgSUljb25zQ29sdW1uRWRpdG9ySXRlbSB9IGZyb20gJy4vQ29udHJvbENvbmZpZ3VyYXRvcic7XHJcbmltcG9ydCB7IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSwgSUdyaWRBZGRpdGlvbmFsT3B0aW9ucyB9IGZyb20gJy4uL0dyaWQvQ3JlYXRlRGVmYXVsdEdyaWQnO1xyXG5pbXBvcnQgY3JlYXRlRGVmYXVsdEdyaWQgZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkJztcclxuaW1wb3J0IHsgY3JlYXRlRHhEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9EeERhdGFTb3VyY2UnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IGdldFN1bW1hcnlDb2x1bW4gfSBmcm9tICcuL0dyaWRTdW1tYXJ5SGVscGVyJztcclxuaW1wb3J0IHsgQ2RtSW1wb3J0RmlsZU1vZGUgfSBmcm9tICcuLi8uLi9CdXNpbmVzcyc7XHJcblxyXG5pbnRlcmZhY2UgSUFQU0NvbnRyb2xGaWVsZENvbmZpZ3VyYXRpb24ge1xyXG4gIFBlcm1pc3Npb25zOiBDb250cm9sUm9sZVBlcm1pc3Npb25zO1xyXG4gIE5hbWU6IHN0cmluZztcclxuICBUeXBlOiAnc3RyaW5nJyB8ICdudW1iZXInIHwgJ2Jvb2xlYW4nIHwgJ29iamVjdCcgfCAnZGF0ZScgfCAnZGF0ZXRpbWUnO1xyXG4gIExhYmVsOiBzdHJpbmc7XHJcbiAgT3JkZXI6IG51bWJlcjtcclxuICBUb29sVGlwOiBzdHJpbmc7XHJcbiAgSXNEZWZhdWx0Vmlld0ZpZWxkOiBib29sZWFuO1xyXG4gIElzS2V5Q29sdW1uOiBib29sZWFuO1xyXG4gIEdyb3VwRmllbGQ6IHN0cmluZztcclxuICBEaXNwbGF5VHlwZTogc3RyaW5nO1xyXG4gIFdpZHRoPzogbnVtYmVyO1xyXG4gIEhpZGluZ09yZGVyPzogbnVtYmVyO1xyXG4gIENvbHVtbnM/OiBJQVBTQ29udHJvbEZpZWxkQ29uZmlndXJhdGlvbltdO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSVVzZXJDb25maWd1cmF0aW9uUmVzcG9uc2Uge1xyXG4gIEZpZWxkc0NvbmZpZ3VyYXRpb246IElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uW107XHJcbiAgQ2FuQ3JlYXRlR2xvYmFsVmlld3M6IGJvb2xlYW47XHJcbiAgQ2FuQ3JlYXRlR2xvYmFsRmlsdGVyczogYm9vbGVhbjtcclxuICBDYW5DcmVhdGVGaWx0ZXJzOiBib29sZWFuO1xyXG4gIENhbkNyZWF0ZVZpZXdzOiBib29sZWFuO1xyXG4gIENhbkNyZWF0ZURpc3BsYXlzOiBib29sZWFuO1xyXG4gIENhbkFwcGxheURpc3BsYXlzOiBib29sZWFuO1xyXG59XHJcblxyXG4vKiBlc2xpbnQgbm8tYml0d2lzZTogb2ZmICovXHJcbi8qIHRzbGludDpkaXNhYmxlOiBuby1iaXR3aXNlICovXHJcbmNvbnN0IGVudW0gQ29udHJvbFJvbGVQZXJtaXNzaW9ucyB7XHJcbiAgTm9uZSA9IDAsXHJcbiAgUmVhZCA9IDEgPDwgMCxcclxuICBDcmVhdGUgPSAxIDw8IDEsXHJcbiAgVXBkYXRlID0gMSA8PCAyLFxyXG4gIERlbGV0ZSA9IDEgPDwgMyxcclxufVxyXG4vKiB0c2xpbnQ6ZW5hYmxlOiBuby1iaXR3aXNlICovXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb250cm9sRGlzcGxheU9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICBpc1N0YW5kYWxvbmVQYWdlOiBib29sZWFuO1xyXG4gIHBhZ2VUaXRsZTogc3RyaW5nO1xyXG4gIGV4cG9ydEZpbGVOYW1lOiBzdHJpbmc7XHJcbiAgdXNlck5hbWU6IHN0cmluZztcclxuICB1c2VyQ29uZmlnVXJsOiBzdHJpbmc7XHJcbiAgY29udHJvbExvZ3NVcmw6IHN0cmluZztcclxuICBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zOiBJR3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucztcclxuICBncmlkVmlld3NNYW5hZ2VyT3B0aW9uczogSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zO1xyXG4gIGdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zOiBJR3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnM7XHJcbiAgcmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnM6IElSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9ucztcclxuICBpbXBvcnRGaWxlT3B0aW9ucz86IElGaWxlSW1wb3J0ZXJPcHRpb25zO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ29udHJvbERpc3BsYXkge1xyXG4gIHB1YmxpYyByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNTdGFuZGFsb25lUGFnZTogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IHBhZ2VUaXRsZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZXhwb3J0RmlsZU5hbWU6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VyQ29uZmlnVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb250cm9sTG9nc1VybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnM6IElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnM6IElHcmlkVmlld3NNYW5hZ2VyT3B0aW9ucztcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zOiBJR3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9uczogSVJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW1wb3J0RmlsZU9wdGlvbnM6IElGaWxlSW1wb3J0ZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIG1haW5HcmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgZ3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudDogR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBncmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQ6IEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBncmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50OiBHcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIG11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luOiBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUNvbnRyb2xEaXNwbGF5T3B0aW9ucykge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy5pc1N0YW5kYWxvbmVQYWdlID0gb3B0aW9ucy5pc1N0YW5kYWxvbmVQYWdlO1xyXG4gICAgdGhpcy5wYWdlVGl0bGUgPSBvcHRpb25zLnBhZ2VUaXRsZTtcclxuICAgIHRoaXMuZXhwb3J0RmlsZU5hbWUgPSBvcHRpb25zLmV4cG9ydEZpbGVOYW1lO1xyXG4gICAgdGhpcy51c2VyTmFtZSA9IG9wdGlvbnMudXNlck5hbWU7XHJcbiAgICB0aGlzLnVzZXJDb25maWdVcmwgPSBvcHRpb25zLnVzZXJDb25maWdVcmw7XHJcbiAgICB0aGlzLmNvbnRyb2xMb2dzVXJsID0gb3B0aW9ucy5jb250cm9sTG9nc1VybDtcclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gICAgdGhpcy5ncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zID0gb3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zO1xyXG4gICAgdGhpcy5ncmlkVmlld3NNYW5hZ2VyT3B0aW9ucyA9IG9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnM7XHJcbiAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zID0gb3B0aW9ucy5ncmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucztcclxuICAgIHRoaXMucmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnMgPSBvcHRpb25zLnJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zO1xyXG4gICAgdGhpcy5pbXBvcnRGaWxlT3B0aW9ucyA9IG9wdGlvbnMuaW1wb3J0RmlsZU9wdGlvbnM7XHJcblxyXG4gICAgdGhpcy4kY29udGFpbmVyLmFkZENsYXNzKFsnYXBzLWdyaWQnLCAnY29udHJvbC1kaXNwbGF5LWdyaWQnXSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgc2VuZFJlcXVlc3Q8SVVzZXJDb25maWd1cmF0aW9uUmVzcG9uc2U+KHRoaXMudXNlckNvbmZpZ1VybClcclxuICAgICAgLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGdyaWRGaWx0ZXJzTWFuYWdlciA9IG5ldyBHcmlkRmlsdGVyc01hbmFnZXIodGhpcy5ncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zKTtcclxuICAgICAgICBjb25zdCBncmlkVmlld3NNYW5hZ2VyID0gbmV3IEdyaWRWaWV3c01hbmFnZXIodGhpcy5ncmlkVmlld3NNYW5hZ2VyT3B0aW9ucyk7XHJcbiAgICAgICAgY29uc3QgZ3JpZERpc3BsYXlzTWFuYWdlciA9IG5ldyBHcmlkRGlzcGxheXNNYW5hZ2VyKHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnMpO1xyXG5cclxuICAgICAgICB0aGlzLm1haW5HcmlkID0gdGhpcy5jcmVhdGVNYWluR3JpZChyZXMuRmllbGRzQ29uZmlndXJhdGlvbik7XHJcblxyXG4gICAgICAgIGNvbnN0IGNhbkNyZWF0ZURpc3BsYXlzID0gcmVzLkNhbkNyZWF0ZURpc3BsYXlzICYmIHJlcy5DYW5DcmVhdGVWaWV3cyAmJiByZXMuQ2FuQ3JlYXRlRmlsdGVycztcclxuXHJcbiAgICAgICAgaWYgKGNhbkNyZWF0ZURpc3BsYXlzIHx8IHJlcy5DYW5BcHBsYXlEaXNwbGF5cykge1xyXG4gICAgICAgICAgdGhpcy5ncmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50ID0gbmV3IEdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQoe1xyXG4gICAgICAgICAgICBvd25lcjogdGhpcy5tYWluR3JpZCxcclxuICAgICAgICAgICAgZWRpdE1vZGU6IGNhbkNyZWF0ZURpc3BsYXlzLFxyXG4gICAgICAgICAgICBncmlkRmlsdGVyc01hbmFnZXIsXHJcbiAgICAgICAgICAgIGdyaWRWaWV3c01hbmFnZXIsXHJcbiAgICAgICAgICAgIGdyaWREaXNwbGF5c01hbmFnZXIsXHJcbiAgICAgICAgICAgIGltcG9ydEZpbGVPcHRpb25zOiB0aGlzLmltcG9ydEZpbGVPcHRpb25zXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZ3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudCA9IG5ldyBHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50KHtcclxuICAgICAgICAgIG93bmVyOiB0aGlzLm1haW5HcmlkLFxyXG4gICAgICAgICAgb25WaWV3QXBwbGllZDogdGhpcy5vblZpZXdBcHBsaWVkLFxyXG4gICAgICAgICAgb25WaWV3RGVsZXRlZDogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCBncmlkRGlzcGxheXNNYW5hZ2VyLmxvYWREaXNwbGF5cygpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGF1dG9JbnRlZ3JhdGlvbjogdHJ1ZSxcclxuICAgICAgICAgIGdyaWRWaWV3c01hbmFnZXIsXHJcbiAgICAgICAgICBjYW5DcmVhdGVHbG9iYWxWaWV3czogcmVzLkNhbkNyZWF0ZUdsb2JhbFZpZXdzLFxyXG4gICAgICAgICAgdmlzaWJsZTogcmVzLkNhbkNyZWF0ZVZpZXdzXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZ3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50ID0gbmV3IEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudCh7XHJcbiAgICAgICAgICBhcHNDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXI6IG5ldyBSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIoe1xyXG4gICAgICAgICAgICB1c2VySWQ6IHRoaXMudXNlck5hbWUsXHJcbiAgICAgICAgICAgIGxvYWREYXRhVXJsOiB0aGlzLnJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zLmxvYWREYXRhVXJsLFxyXG4gICAgICAgICAgICB1cGRhdGVEYXRhVXJsOiB0aGlzLnJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zLnVwZGF0ZURhdGFVcmxcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgb3duZXI6IHRoaXMubWFpbkdyaWQsXHJcbiAgICAgICAgICBvbkZpbHRlckRlbGV0ZWQ6IGFzeW5jIChmaWx0ZXJJZCkgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCBncmlkRGlzcGxheXNNYW5hZ2VyLmxvYWREaXNwbGF5cygpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGF1dG9JbnRlZ3JhdGlvbjogdHJ1ZSxcclxuICAgICAgICAgIGdyaWRGaWx0ZXJzTWFuYWdlcixcclxuICAgICAgICAgIGNhbkNyZWF0ZUdsb2JhbEZpbHRlcnM6IHJlcy5DYW5DcmVhdGVHbG9iYWxGaWx0ZXJzLFxyXG4gICAgICAgICAgdmlzaWJsZTogcmVzLkNhbkNyZWF0ZUZpbHRlcnNcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5tdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbiA9IG5ldyBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbih7XHJcbiAgICAgICAgICBvd25lcjogdGhpcy5tYWluR3JpZFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBncmlkRGlzcGxheXNNYW5hZ2VyLm9uRGlzcGxheUNoYW5nZWQgPSBhc3luYyAoZGlzcGxheSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGRpc3BsYXkpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5ncmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQuYXBwbHlGaWx0ZXIoZGlzcGxheS5GaWx0ZXJJZCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudC5hcHBseVZpZXcoZGlzcGxheS5WaWV3SWQpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5ncmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQuYXBwbHlGaWx0ZXIodm9pZCAwLCB0cnVlKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5ncmlkVmlld3NUb29sYmFyQ29tcG9uZW50LmFwcGx5VmlldyhHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyogdHNsaW50OmRpc2FibGU6IG5vLWJpdHdpc2UgKi9cclxuICBwcml2YXRlIGhhc1Blcm1pc3NvbihydWxlcywgcGVybWlzc29uKSB7XHJcbiAgICByZXR1cm4gcnVsZXMgJiBwZXJtaXNzb247XHJcbiAgfVxyXG4gIC8qIHRzbGludDplbmFibGU6IG5vLWJpdHdpc2UgKi9cclxuXHJcbiAgcHJpdmF0ZSBidWlsZFRyZWUoY29sdW1ucykge1xyXG4gICAgY29uc3QgZ3JvdXBQcmVmaXggPSAnX19HUk9VUF9fJztcclxuXHJcbiAgICBsZXQgY29sdW1uc01hcCA9IGNvbHVtbnMucmVkdWNlKChhY2MsIGNvbHVtbikgPT4ge1xyXG4gICAgICBjb2x1bW4uQ29sdW1ucyA9IFtdO1xyXG4gICAgICBjb2x1bW4uR3JvdXBGaWVsZCA9IGNvbHVtbi5Hcm91cEZpZWxkXHJcbiAgICAgICAgPyBgJHtncm91cFByZWZpeH0ke2NvbHVtbi5Hcm91cEZpZWxkfWBcclxuICAgICAgICA6IG51bGw7XHJcbiAgICAgIGFjY1tjb2x1bW4uTmFtZV0gPSBjb2x1bW47XHJcblxyXG4gICAgICByZXR1cm4gYWNjO1xyXG4gICAgfSwge30pO1xyXG5cclxuICAgIGNvbHVtbnNNYXAgPSBjb2x1bW5zXHJcbiAgICAgIC5maWx0ZXIoKGNvbHVtbikgPT4gY29sdW1uLkdyb3VwRmllbGQpXHJcbiAgICAgIC5tYXAoKGNvbHVtbikgPT4gY29sdW1uLkdyb3VwRmllbGQpXHJcbiAgICAgIC5maWx0ZXIoKHZhbHVlLCBpbmRleCwgc2VsZikgPT4gc2VsZi5pbmRleE9mKHZhbHVlKSA9PT0gaW5kZXgpXHJcbiAgICAgIC5yZWR1Y2UoKGFjYywgZ3JvdXBGaWVsZCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSBncm91cEZpZWxkLnJlcGxhY2UoZ3JvdXBQcmVmaXgsICcnKTtcclxuXHJcbiAgICAgICAgY29uc3QgZ3JvdXBDb2x1bW4gPSB7XHJcbiAgICAgICAgICBOYW1lOiBncm91cEZpZWxkLFxyXG4gICAgICAgICAgTGFiZWw6IGNvbHVtbk5hbWUsXHJcbiAgICAgICAgICBDb2x1bW5zOiBbXSxcclxuICAgICAgICAgIC8qIHRzbGludDpkaXNhYmxlOiBtYXgtbGluZS1sZW5ndGggKi9cclxuICAgICAgICAgIEdyb3VwRmllbGQ6IGNvbHVtbnNNYXBbY29sdW1uTmFtZV0gJiYgY29sdW1uc01hcFtjb2x1bW5OYW1lXS5Hcm91cEZpZWxkICYmIGNvbHVtbnNNYXBbY29sdW1uTmFtZV0uR3JvdXBGaWVsZCAhPT0gZ3JvdXBGaWVsZFxyXG4gICAgICAgICAgICA/IGNvbHVtbnNNYXBbY29sdW1uTmFtZV0uR3JvdXBGaWVsZFxyXG4gICAgICAgICAgICA6IG51bGxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBhY2NbZ3JvdXBGaWVsZF0gPSBncm91cENvbHVtbjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGFjYztcclxuICAgICAgfSwgY29sdW1uc01hcCk7XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBjb2x1bW5OYW1lIGluIGNvbHVtbnNNYXApIHtcclxuICAgICAgaWYgKGNvbHVtbnNNYXAuaGFzT3duUHJvcGVydHkoY29sdW1uTmFtZSkpIHtcclxuICAgICAgICBjb25zdCBjb2x1bW4gPSBjb2x1bW5zTWFwW2NvbHVtbk5hbWVdO1xyXG5cclxuICAgICAgICBpZiAoY29sdW1uLkdyb3VwRmllbGQpIHtcclxuICAgICAgICAgIGNvbHVtbnNNYXBbY29sdW1uLkdyb3VwRmllbGRdLkNvbHVtbnMucHVzaChjb2x1bW4pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXN1bHQucHVzaChjb2x1bW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckRpc3BsYXlUeXBlKHNldHRpbmdzOiBJRGlzcGxheVR5cGVTZXR0aW5ncywgY29sdW1uOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW4sIHBlcm1pc3Npb25zOiBDb250cm9sUm9sZVBlcm1pc3Npb25zKSB7XHJcbiAgICBpZiAoc2V0dGluZ3MudHlwZSA9PT0gRGlzcGxheVR5cGUuSWNvbnMpIHtcclxuICAgICAgY29sdW1uLmNlbGxUZW1wbGF0ZSA9IChjb250YWluZXIsIG9wdGlvbnMpID0+IHtcclxuICAgICAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IFN0cmluZyhvcHRpb25zLnZhbHVlKTtcclxuICAgICAgICBjb25zdCBjZWxsU2V0dGluZ3MgPSBzZXR0aW5ncy5kYXRhLmZpbmQoKGl0ZW0pID0+IFN0cmluZyhpdGVtLnZhbHVlKSA9PT0gc3RyaW5nVmFsdWUpO1xyXG5cclxuICAgICAgICBpZiAoY2VsbFNldHRpbmdzKSB7XHJcbiAgICAgICAgICAkKCc8ZGl2PicpXHJcbiAgICAgICAgICAgIC5jc3MoeyAndGV4dC1hbGlnbic6ICdjZW50ZXInIH0pXHJcbiAgICAgICAgICAgIC5hdHRyKCd0aXRsZScsIGNlbGxTZXR0aW5ncy50aXRsZSlcclxuICAgICAgICAgICAgLmFwcGVuZCgkKCc8aW1nPicsIHsgc3JjOiBjZWxsU2V0dGluZ3MuaW1hZ2UgfSkpXHJcbiAgICAgICAgICAgIC5hcHBlbmRUbyhjb250YWluZXIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgLmNzcyh7ICd0ZXh0LWFsaWduJzogJ2NlbnRlcicgfSlcclxuICAgICAgICAgICAgLnRleHQob3B0aW9ucy52YWx1ZSlcclxuICAgICAgICAgICAgLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29sdW1uLmVkaXRDZWxsVGVtcGxhdGUgPSAoY29udGFpbmVyLCBjZWxsSW5mbykgPT4ge1xyXG4gICAgICAgICQoJzxkaXYgLz4nKS5keFNlbGVjdEJveCh7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiBzZXR0aW5ncy5kYXRhLFxyXG4gICAgICAgICAgZGlzcGxheVZhbHVlOiAndGl0bGUnLFxyXG4gICAgICAgICAgaXRlbVRlbXBsYXRlOiAoZGF0YTogSUljb25zQ29sdW1uRWRpdG9ySXRlbSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgICAgLmNzcyh7ICd0ZXh0LWFsaWduJzogJ2NlbnRlcicgfSlcclxuICAgICAgICAgICAgICAuYXR0cigndGl0bGUnLCBkYXRhLnRpdGxlKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmQoJCgnPGltZz4nLCB7IHNyYzogZGF0YS5pbWFnZSB9KSlcclxuICAgICAgICAgICAgICAuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgZmllbGRUZW1wbGF0ZTogKGRhdGEsIGVsKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJdGVtID0gc2V0dGluZ3MuZGF0YS5maW5kKChpdGVtKSA9PiBwYXJzZUludChpdGVtLnZhbHVlKSA9PT0gY2VsbEluZm8udmFsdWUpO1xyXG4gICAgICAgICAgICBjb25zdCAkaXRlbU5hbWUgPSAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2l0ZW0tbmFtZScpO1xyXG4gICAgICAgICAgICBjb25zdCAkcmVzdWx0ID0gJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgICAgLmFkZENsYXNzKCdhcHMtaWNvbi1lZGl0b3JfX2N1c3RvbS1pdGVtJylcclxuICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxpbWc+JywgeyBzcmM6IGN1cnJlbnRJdGVtID8gY3VycmVudEl0ZW0uaW1hZ2UgOiAnJyB9KS5hdHRyKCd0aXRsZScsIGN1cnJlbnRJdGVtID8gY3VycmVudEl0ZW0udGl0bGUgOiAnJykpXHJcbiAgICAgICAgICAgICAgLmFwcGVuZCgkaXRlbU5hbWUpO1xyXG5cclxuICAgICAgICAgICAgJGl0ZW1OYW1lXHJcbiAgICAgICAgICAgICAgLmR4VGV4dEJveCh7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogJycsXHJcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZVxyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgZWwuYXBwZW5kKCRyZXN1bHQpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSwgY29tcG9uZW50IH0pID0+IHtcclxuICAgICAgICAgICAgY2VsbEluZm8uc2V0VmFsdWUocGFyc2VJbnQodmFsdWUudmFsdWUpKTtcclxuICAgICAgICAgICAgY29tcG9uZW50LmJsdXIoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB2YWx1ZTogKGNlbGxJbmZvLnZhbHVlICE9PSBudWxsICYmIGNlbGxJbmZvICE9PSB2b2lkIDApICYmIGNlbGxJbmZvLnZhbHVlLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICBzZWxlY3RlZEl0ZW06IHNldHRpbmdzLmRhdGEuZmluZCgoaXRlbSkgPT4gcGFyc2VJbnQoaXRlbS52YWx1ZSkgPT09IGNlbGxJbmZvLnZhbHVlKVxyXG4gICAgICAgIH0pLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb2x1bW4uYWxsb3dTZWFyY2ggPSBmYWxzZTtcclxuICAgICAgY29sdW1uLmFsbG93RmlsdGVyaW5nID0gZmFsc2U7XHJcbiAgICAgIGNvbHVtbi5hbGxvd0hlYWRlckZpbHRlcmluZyA9IHRydWU7XHJcbiAgICAgIGNvbHVtbi5hbGxvd0dyb3VwaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNldHRpbmdzLnR5cGUgPT09IERpc3BsYXlUeXBlLlByZWRlZmluZWRWYWx1ZXMpIHtcclxuICAgICAgY29sdW1uLmVkaXRDZWxsVGVtcGxhdGUgPSAoY29udGFpbmVyLCBjZWxsSW5mbykgPT4ge1xyXG4gICAgICAgICQoJzxkaXYgLz4nKS5keFNlbGVjdEJveCh7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiBzZXR0aW5ncy5kYXRhLm1hcCgoaSkgPT4gaS52YWx1ZSkuc29ydCgpLFxyXG4gICAgICAgICAgYWNjZXB0Q3VzdG9tVmFsdWU6IHRydWUsXHJcbiAgICAgICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKHsgdmFsdWUsIGNvbXBvbmVudCB9KSA9PiB7XHJcbiAgICAgICAgICAgIGNlbGxJbmZvLnNldFZhbHVlKHZhbHVlIHx8ICcnKTtcclxuICAgICAgICAgICAgY29tcG9uZW50LmJsdXIoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB2YWx1ZTogY2VsbEluZm8udmFsdWUsXHJcbiAgICAgICAgfSkuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2V0dGluZ3MudHlwZSA9PT0gRGlzcGxheVR5cGUuUmFiYml0QWN0aW9uKSB7XHJcbiAgICAgIGNvbHVtbi5lZGl0Q2VsbFRlbXBsYXRlID0gKGNvbnRhaW5lciwgY2VsbEluZm8pID0+IHtcclxuICAgICAgICAkKCc8ZGl2IC8+JykuZHhDaGVja0JveCh7XHJcbiAgICAgICAgICB2YWx1ZTogY2VsbEluZm8udmFsdWUgfHwgZmFsc2UsXHJcbiAgICAgICAgICByZWFkT25seTogIXRoaXMuaGFzUGVybWlzc29uKHBlcm1pc3Npb25zLCBDb250cm9sUm9sZVBlcm1pc3Npb25zLlVwZGF0ZSksXHJcbiAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICAgICAgY2VsbEluZm8uY29tcG9uZW50LmNlbGxWYWx1ZShjZWxsSW5mby5yb3dJbmRleCwgY2VsbEluZm8uY29sdW1uLmRhdGFGaWVsZCwgZS52YWx1ZSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0pLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbmZpZ3VyZUNvbHVtbihjb2x1bW5Db25maWc6IElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uIHtcclxuICAgIGNvbnN0IHRpdGxlID0gY29sdW1uQ29uZmlnLkxhYmVsIHx8IGNvbHVtbkNvbmZpZy5OYW1lO1xyXG4gICAgY29uc3QgdG9vbHRpcCA9IGNvbHVtbkNvbmZpZy5Ub29sVGlwIHx8IHRpdGxlO1xyXG5cclxuICAgIGNvbnN0IGNvbHVtbjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uID0gIWNvbHVtbkNvbmZpZy5Db2x1bW5zLmxlbmd0aFxyXG4gICAgICA/IHtcclxuICAgICAgICBkYXRhRmllbGQ6IGNvbHVtbkNvbmZpZy5OYW1lLFxyXG4gICAgICAgIGRhdGFUeXBlOiBjb2x1bW5Db25maWcuVHlwZSxcclxuICAgICAgICBjYXB0aW9uOiB0aXRsZSxcclxuICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSh0aXRsZSwgdG9vbHRpcCksXHJcbiAgICAgICAgdmlzaWJsZTogY29sdW1uQ29uZmlnLklzRGVmYXVsdFZpZXdGaWVsZCxcclxuICAgICAgICB2aXNpYmxlSW5kZXg6IGNvbHVtbkNvbmZpZy5PcmRlcixcclxuICAgICAgICBhbGxvd0ZpeGluZzogZmFsc2UsXHJcbiAgICAgICAgYWxsb3dFZGl0aW5nOiAhIXRoaXMuaGFzUGVybWlzc29uKGNvbHVtbkNvbmZpZy5QZXJtaXNzaW9ucywgQ29udHJvbFJvbGVQZXJtaXNzaW9ucy5VcGRhdGUpLFxyXG4gICAgICAgIHdpZHRoOiBjb2x1bW5Db25maWcuV2lkdGgsXHJcbiAgICAgICAgaGlkaW5nUHJpb3JpdHk6IGNvbHVtbkNvbmZpZy5IaWRpbmdPcmRlclxyXG4gICAgICB9IDoge1xyXG4gICAgICAgIGNhcHRpb246IHRpdGxlLFxyXG4gICAgICAgIGNvbHVtbnM6IGNvbHVtbkNvbmZpZy5Db2x1bW5zLm1hcCgoYykgPT4gdGhpcy5jb25maWd1cmVDb2x1bW4oYykpXHJcbiAgICAgIH07XHJcblxyXG4gICAgaWYgKGNvbHVtbkNvbmZpZy5EaXNwbGF5VHlwZSkge1xyXG4gICAgICBjb25zdCBkaXNwbGF5U2V0dGluZ3M6IElEaXNwbGF5VHlwZVNldHRpbmdzID0gSlNPTi5wYXJzZShjb2x1bW5Db25maWcuRGlzcGxheVR5cGUpO1xyXG5cclxuICAgICAgaWYgKGRpc3BsYXlTZXR0aW5ncy50eXBlID09PSBEaXNwbGF5VHlwZS5JY29ucykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZGlzcGxheVNldHRpbmdzLmRhdGEubWFwKChpdGVtKSA9PiAoe1xyXG4gICAgICAgICAgdGV4dDogaXRlbS50aXRsZSxcclxuICAgICAgICAgIHZhbHVlOiBpdGVtLnZhbHVlXHJcbiAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICBpdGVtcy5zcGxpY2UoMCwgMCwge1xyXG4gICAgICAgICAgdGV4dDogJ0JsYW5rJyxcclxuICAgICAgICAgIHZhbHVlOiBudWxsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIChjb2x1bW4gYXMgYW55KS5oZWFkZXJGaWx0ZXIgPSB7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiBpdGVtc1xyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMucmVuZGVyRGlzcGxheVR5cGUoZGlzcGxheVNldHRpbmdzLCBjb2x1bW4sIGNvbHVtbkNvbmZpZy5QZXJtaXNzaW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtbjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uZmlndXJlQ29sdW1ucyhjb25maWd1cmF0aW9uOiBJQVBTQ29udHJvbEZpZWxkQ29uZmlndXJhdGlvbltdKSB7XHJcbiAgICBjb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbi5maWx0ZXIoXHJcbiAgICAgIChjKSA9PiB0aGlzLmhhc1Blcm1pc3NvbihjLlBlcm1pc3Npb25zLCBDb250cm9sUm9sZVBlcm1pc3Npb25zLlJlYWQpXHJcbiAgICApO1xyXG5cclxuICAgIGNvbmZpZ3VyYXRpb24gPSB0aGlzLmJ1aWxkVHJlZShjb25maWd1cmF0aW9uKTtcclxuICAgIGNvbnN0IGNvbHVtbnMgPSBjb25maWd1cmF0aW9uLm1hcCgoYykgPT4gdGhpcy5jb25maWd1cmVDb2x1bW4oYykpO1xyXG5cclxuICAgIHJldHVybiBjb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVNYWluR3JpZChjb25maWd1cmF0aW9uOiBJQVBTQ29udHJvbEZpZWxkQ29uZmlndXJhdGlvbltdKSB7XHJcbiAgICBjb25zdCBoYXNLZXlzID0gY29uZmlndXJhdGlvbi5zb21lKChjKSA9PiBjLklzS2V5Q29sdW1uKTtcclxuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbmZpZ3VyZUNvbHVtbnMoY29uZmlndXJhdGlvbik7XHJcblxyXG4gICAgY29uc3QgY29sdW1uRm9yU3VtbWFyeSA9IGdldFN1bW1hcnlDb2x1bW4oY29sdW1ucyk7XHJcbiAgICBjb25zdCBncmlkT3B0aW9ucyA9IHtcclxuICAgICAgZGF0YVNvdXJjZTogdGhpcy5jcmVhdGVNYWluR3JpZERhdGFTb3VyY2UoY29uZmlndXJhdGlvbiksXHJcbiAgICAgIGNvbHVtblJlc2l6aW5nTW9kZTogJ3dpZGdldCcsXHJcbiAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBhbGxvd1VwZGF0aW5nOiBoYXNLZXlzLFxyXG4gICAgICAgIGFsbG93QWRkaW5nOiBmYWxzZSxcclxuICAgICAgICBhbGxvd0RlbGV0aW5nOiBmYWxzZSxcclxuICAgICAgICBtb2RlOiAnYmF0Y2gnXHJcbiAgICAgIH0sXHJcbiAgICAgIHNjcm9sbGluZzogeyBtb2RlOiAndmlydHVhbCcsIHByZWxvYWRFbmFibGVkOiB0cnVlIH0sXHJcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IHRydWUsXHJcbiAgICAgIHBhZ2VyOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIGhlaWdodDogdGhpcy5pc1N0YW5kYWxvbmVQYWdlID8gdW5kZWZpbmVkIDogJzEwMCUnLFxyXG4gICAgICBjb2x1bW5DaG9vc2VyOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBtb2RlOiAnZHJhZ0FuZERyb3AnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbHVtbkZpeGluZzoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgZmlsdGVyUGFuZWw6IHtcclxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIHRleHRzOiB7XHJcbiAgICAgICAgICBjcmVhdGVGaWx0ZXI6ICdOb25lJyxcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHN1bW1hcnk6IHtcclxuICAgICAgICB0b3RhbEl0ZW1zOiBbeyBzdW1tYXJ5VHlwZTogJ2NvdW50JywgY29sdW1uOiBjb2x1bW5Gb3JTdW1tYXJ5IH1dXHJcbiAgICAgIH0sXHJcbiAgICAgIGFsbG93Q29sdW1uUmVzaXppbmc6IHRydWUsXHJcbiAgICAgIGNvbHVtbkhpZGluZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgY29sdW1ucyxcclxuICAgICAgYWxsb3dDb2x1bW5SZW9yZGVyaW5nOiB0cnVlLFxyXG4gICAgICBncm91cGluZzoge1xyXG4gICAgICAgIGNvbnRleHRNZW51RW5hYmxlZDogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBncm91cFBhbmVsOiB7XHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBtYXN0ZXJEZXRhaWw6ICFoYXNLZXlzID8gdW5kZWZpbmVkIDoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgdGVtcGxhdGU6IChjb250YWluZXIsIG9wdGlvbnMpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGtleXMgPSB7fTtcclxuICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZmlsdGVyKChjKSA9PiBjLklzS2V5Q29sdW1uKS5mb3JFYWNoKChjKSA9PiBrZXlzW2MuTmFtZV0gPSBvcHRpb25zLmRhdGFbYy5OYW1lXSk7XHJcblxyXG4gICAgICAgICAgJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAuZHhEYXRhR3JpZCh7XHJcbiAgICAgICAgICAgICAgZGF0YVNvdXJjZToge1xyXG4gICAgICAgICAgICAgICAgc3RvcmU6IGNyZWF0ZUR4RGF0YVNvdXJjZSh7XHJcbiAgICAgICAgICAgICAgICAgIGxvYWRVcmw6IGAke3RoaXMuY29udHJvbExvZ3NVcmx9P2tleT0ke0pTT04uc3RyaW5naWZ5KGtleXMpfWAsXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgc2hvd0JvcmRlcnM6IHRydWUsXHJcbiAgICAgICAgICAgICAgY29sdW1uczogW3tcclxuICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ1VzZXInLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IDIwMFxyXG4gICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ0NyZWF0ZWRBdCcsXHJcbiAgICAgICAgICAgICAgICBjYXB0aW9uOiAnRGF0ZScsXHJcbiAgICAgICAgICAgICAgICBkYXRhVHlwZTogJ2RhdGUnLFxyXG4gICAgICAgICAgICAgICAgZm9ybWF0OiAnc2hvcnREYXRlU2hvcnRUaW1lJyxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiAyMDBcclxuICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdDaGFuZ2VzJyxcclxuICAgICAgICAgICAgICAgIGNlbGxUZW1wbGF0ZTogKGMsIG8pID0+IHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IG8uZGF0YS5DaGFuZ2VzXHJcbiAgICAgICAgICAgICAgICAgICAgLm1hcChcclxuICAgICAgICAgICAgICAgICAgICAgIChpdGVtKSA9PiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGA8ZGl2IGNsYXNzPSdhcHMtY29udHJvbC1sb2cnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9J2Fwcy1jb250cm9sLWxvZ19fZmllbGQnPiR7aXRlbS5GaWVsZH08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0nYXBzLWNvbnRyb2wtbG9nX19vbGQtdmFsdWUnPiR7aXRlbS5PbGRWYWx1ZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdTIxOTJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSdhcHMtY29udHJvbC1sb2dfX25ldy12YWx1ZSc+JHtpdGVtLk5ld1ZhbHVlfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gXHJcbiAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICQoYDxkaXYgY2xhc3M9J2Fwcy1jb250cm9sLWxvZ3MnPiR7Y29udGVudH08L2Rpdj5gKS5hcHBlbmRUbyhjKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XSxcclxuICAgICAgICAgICAgfSkuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uQ29udGVudFJlYWR5OiAoZSkgPT4ge1xyXG4gICAgICAgIGlmICghZS5jb21wb25lbnQpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJlcGFyZUZpbHRlclBhbmVsKGUuY29tcG9uZW50KTtcclxuICAgICAgfSxcclxuICAgICAgb25FZGl0b3JQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgaWYgKGUucGFyZW50VHlwZSAhPT0gJ2RhdGFSb3cnKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBmaWVsZENvbmZpZyA9IGNvbmZpZ3VyYXRpb24uZmluZCgoYykgPT4gYy5OYW1lID09PSBlLmRhdGFGaWVsZCk7XHJcblxyXG4gICAgICAgIGlmICghZmllbGRDb25maWcpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRpc2FibGVFZGl0aW5nID0gIXRoaXMuaGFzUGVybWlzc29uKGZpZWxkQ29uZmlnLlBlcm1pc3Npb25zLCBDb250cm9sUm9sZVBlcm1pc3Npb25zLlVwZGF0ZSk7XHJcblxyXG4gICAgICAgIGUuZWRpdG9yT3B0aW9ucy5yZWFkT25seSA9IGRpc2FibGVFZGl0aW5nO1xyXG5cclxuICAgICAgICBpZiAoIWRpc2FibGVFZGl0aW5nICYmIGZpZWxkQ29uZmlnLlR5cGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjb25zdCBiYXNlU2V0VmFsdWUgPSBlLnNldFZhbHVlO1xyXG5cclxuICAgICAgICAgIChlIGFzIGFueSkuc2V0VmFsdWUgPSAobmV3VmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBiYXNlU2V0VmFsdWUobmV3VmFsdWUudHJpbSgpKTtcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvbkNlbGxQcmVwYXJlZDogKGUpID0+IHtcclxuICAgICAgICBpZiAoZS5yb3dUeXBlID09PSAnZGF0YScpIHtcclxuICAgICAgICAgIGNvbnN0IGZpZWxkQ29uZmlnID0gY29uZmlndXJhdGlvbi5maW5kKChjKSA9PiBjLk5hbWUgPT09IGUuY29sdW1uLmRhdGFGaWVsZCk7XHJcblxyXG4gICAgICAgICAgaWYgKGZpZWxkQ29uZmlnICYmICF0aGlzLmhhc1Blcm1pc3NvbihmaWVsZENvbmZpZy5QZXJtaXNzaW9ucywgQ29udHJvbFJvbGVQZXJtaXNzaW9ucy5VcGRhdGUpKSB7XHJcbiAgICAgICAgICAgICQoZS5jZWxsRWxlbWVudCkuYWRkQ2xhc3MoJ2Fwcy1ncmlkX19kaXNhYmxlZC1jZWxsJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvblJvd0V4cGFuZGVkOiAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRldGFpbFJvd0luZGV4ID0gZS5jb21wb25lbnQuZ2V0Um93SW5kZXhCeUtleShlLmtleSkgKyAxO1xyXG4gICAgICAgIGNvbnN0ICRkZXRhaWxDZWxsID0gZS5jb21wb25lbnQuZ2V0Q2VsbEVsZW1lbnQoZGV0YWlsUm93SW5kZXgsIDApLnBhcmVudCgpLmZpbmQoJy5keC1tYXN0ZXItZGV0YWlsLWNlbGwnKTtcclxuICAgICAgICBjb25zdCBkYXRhR3JpZCA9ICRkZXRhaWxDZWxsLmZpbmQoJy5keC1kYXRhZ3JpZCcpLmZpcnN0KCkucGFyZW50KCkuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICAgICAgZGF0YUdyaWQucmVmcmVzaCgpO1xyXG4gICAgICB9LFxyXG4gICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zO1xyXG5cclxuICAgIHJldHVybiBjcmVhdGVEZWZhdWx0R3JpZCh0aGlzLiRjb250YWluZXIsIHtcclxuICAgICAgb3B0aW9uczogZ3JpZE9wdGlvbnMsXHJcbiAgICAgIGlzRnVsbFNjcmVlbjogdGhpcy5pc1N0YW5kYWxvbmVQYWdlLFxyXG4gICAgICBzZXREZWZhdWx0Q29sdW1uV2lkdGg6IHRydWUsXHJcbiAgICAgIGV4cG9ydEZpbGVOYW1lOiB0aGlzLmV4cG9ydEZpbGVOYW1lLFxyXG4gICAgICB0aXRsZTogdGhpcy5wYWdlVGl0bGUsXHJcbiAgICAgIGRpc2FibGVTdW1tYXJ5Q29sdW1uRGV0ZWN0aW9uOiB0cnVlXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTWFpbkdyaWREYXRhU291cmNlKGNvbmZpZ3VyYXRpb246IElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uW10pOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydkYXRhU291cmNlJ10ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc3RvcmU6IGNyZWF0ZUR4RGF0YVNvdXJjZSh7XHJcbiAgICAgICAga2V5OiBjb25maWd1cmF0aW9uLmZpbHRlcigoYykgPT4gYy5Jc0tleUNvbHVtbikubWFwKChjKSA9PiBjLk5hbWUpLFxyXG4gICAgICAgIGxvYWRVcmw6IHRoaXMubG9hZERhdGFVcmwsXHJcbiAgICAgICAgdXBkYXRlVXJsOiB0aGlzLnVwZGF0ZURhdGFVcmxcclxuICAgICAgfSlcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9uVmlld0FwcGxpZWQgPSAodmlld0lkOiBudW1iZXIpID0+IHtcclxuICAgIHRoaXMuY2xlYXJGaWx0ZXJSb3dBZnRlclZpZXdTd2l0Y2hpbmcoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlcGFyZUZpbHRlclBhbmVsKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gICAgY29uc3QgJGZpbHRlclBhbmVsRWxlbWVudCA9IGdyaWQuZWxlbWVudCgpXHJcbiAgICAgIC5maW5kKCcuZHgtZGF0YWdyaWQtZmlsdGVyLXBhbmVsJyk7XHJcbiAgICBjb25zdCAkZmlsdGVySWNvbkZpbHRlciA9ICRmaWx0ZXJQYW5lbEVsZW1lbnQuZmluZCgnLmR4LWljb24tZmlsdGVyJyk7XHJcbiAgICBjb25zdCAkZmlsdGVyUGFuZWxUZXh0ID0gJGZpbHRlclBhbmVsRWxlbWVudC5maW5kKCcuZHgtZGF0YWdyaWQtZmlsdGVyLXBhbmVsLXRleHQnKTtcclxuXHJcbiAgICAkZmlsdGVySWNvbkZpbHRlci5vZmYoJ2NsaWNrJyk7XHJcbiAgICAkZmlsdGVyUGFuZWxUZXh0Lm9mZignY2xpY2snKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdFJvd3NDb3VudFN1bW1hcnkoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgICBjb25zdCBmaXJzdFZpc2libGVEYXRhQ29sdW1uID0gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpLmZpbmQoKGMpID0+ICEhYy5kYXRhRmllbGQpO1xyXG4gICAgaWYgKCFmaXJzdFZpc2libGVEYXRhQ29sdW1uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByb3dzQ291bnRTdW1tYXJ5TmFtZSA9ICdSb3dzQ291bnQnO1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgIGNvbnN0IHRvdGFsSXRlbXM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5Qcm9wZXJ0aWVzWydzdW1tYXJ5J11bJ3RvdGFsSXRlbXMnXSA9IChncmlkLm9wdGlvbignc3VtbWFyeS50b3RhbEl0ZW1zJykgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXNbJ3N1bW1hcnknXVsndG90YWxJdGVtcyddICkgfHwgW107XHJcbiAgICBjb25zdCByb3dzQ291bnRTdW1tYXJ5SXRlbSA9IHRvdGFsSXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbSAmJiBpdGVtLm5hbWUgPT09IHJvd3NDb3VudFN1bW1hcnlOYW1lKTtcclxuICAgIGlmIChyb3dzQ291bnRTdW1tYXJ5SXRlbSAmJiByb3dzQ291bnRTdW1tYXJ5SXRlbS5jb2x1bW4gPT09IGZpcnN0VmlzaWJsZURhdGFDb2x1bW4uZGF0YUZpZWxkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocm93c0NvdW50U3VtbWFyeUl0ZW0pIHtcclxuICAgICAgcm93c0NvdW50U3VtbWFyeUl0ZW0uY29sdW1uID0gZmlyc3RWaXNpYmxlRGF0YUNvbHVtbi5kYXRhRmllbGQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0b3RhbEl0ZW1zLnB1c2goe1xyXG4gICAgICAgIG5hbWU6IHJvd3NDb3VudFN1bW1hcnlOYW1lLFxyXG4gICAgICAgIGNvbHVtbjogZmlyc3RWaXNpYmxlRGF0YUNvbHVtbi5kYXRhRmllbGQsXHJcbiAgICAgICAgc3VtbWFyeVR5cGU6ICdjb3VudCcsXHJcbiAgICAgICAgYWxpZ25tZW50OiAnbGVmdCcsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubWFpbkdyaWQub3B0aW9uKCdzdW1tYXJ5LnRvdGFsSXRlbXMnLCB0b3RhbEl0ZW1zKTtcclxuICB9XHJcblxyXG4gIC8vIE5PVEU6IFdvcmthcm91bmQuIFRoZSBncmlkIGNhbid0IGNsZWFyIHRoZSBmaWx0ZXIgcm93LCBzbyB3ZSBjbGVhciB0aGF0IG1hbnVhbGx5XHJcbiAgcHJpdmF0ZSBjbGVhckZpbHRlclJvd0FmdGVyVmlld1N3aXRjaGluZygpIHtcclxuICAgIGNvbnN0IGNsZWFySGVhZGVyID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCBjb2x1bW5zV2l0aEZpbHRlcmVkVmFsdWVzOiB7IFt2aXNpYmxlSW5kZXg6IG51bWJlcl06IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbiB9ID0ge307XHJcblxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5ncmlkVmlld3NUb29sYmFyQ29tcG9uZW50Lm9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlci5jdXJyZW50U2F2ZWRHcmlkU3RhdGUuY29sdW1uc1xyXG4gICAgICAgIHx8IHRoaXMuZ3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudC5vcHRpb25zLm93bmVyLm9wdGlvbignY29sdW1ucycpIGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5Db2x1bW5bXTtcclxuXHJcbiAgICAgIGNvbHVtbnNcclxuICAgICAgICAuZmlsdGVyKChjKSA9PiBjLnZpc2libGVJbmRleCAmJiAoYy5maWx0ZXJWYWx1ZSB8fCBjLmZpbHRlclZhbHVlcykpXHJcbiAgICAgICAgLmZvckVhY2goKGMpID0+IGNvbHVtbnNXaXRoRmlsdGVyZWRWYWx1ZXNbYy52aXNpYmxlSW5kZXhdID0gYyk7XHJcblxyXG4gICAgICAkKCd0ZCBbYXJpYS1sYWJlbCo9XCJGaWx0ZXIgY2VsbFwiXScpXHJcbiAgICAgICAgLmZpbHRlcigoaW5kZXgpID0+ICFjb2x1bW5zV2l0aEZpbHRlcmVkVmFsdWVzW2luZGV4XSlcclxuICAgICAgICAudmFsKCcnKTtcclxuICAgICAgdGhpcy5tYWluR3JpZC5vZmYoJ2NvbnRlbnRSZWFkeScsIGNsZWFySGVhZGVyKTtcclxuICAgIH07XHJcbiAgICB0aGlzLm1haW5HcmlkLm9uKCdjb250ZW50UmVhZHknLCBjbGVhckhlYWRlcik7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IGNyZWF0ZURlZmF1bHREYXRhR3JpZCwgY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkLCBJR3JpZEFkZGl0aW9uYWxPcHRpb25zIH0gZnJvbSAnLi4vR3JpZC9DcmVhdGVEZWZhdWx0R3JpZCc7XHJcbmltcG9ydCBjcmVhdGVEZWZhdWx0R3JpZCBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQnO1xyXG5cclxuaW50ZXJmYWNlIElBcHBVc2VyIHtcclxuICBJZDogc3RyaW5nO1xyXG4gIFVzZXJOYW1lOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJRGlzcGxheSB7XHJcbiAgSWQ6IG51bWJlcjtcclxuICBOYW1lOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJQ29udHJvbERpc3BsYXlzVXNlckFzc2lnbm1lbnQge1xyXG4gIERpc3BsYXlJZDogbnVtYmVyO1xyXG4gIFVzZXJJZDogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdyaWRDb2x1bW4ge1xyXG4gIElkOiBzdHJpbmc7XHJcbiAgQ2FwdGlvbjogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUFQU0NvbnRyb2xEaXNwbGF5QXNzaWdubWVudHNEYXRhIHtcclxuICBVc2VyczogSUFwcFVzZXJbXTtcclxuICBEaXNwbGF5czogSURpc3BsYXlbXTtcclxuICBBc3NpZ25tZW50czogSUNvbnRyb2xEaXNwbGF5c1VzZXJBc3NpZ25tZW50W107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURpc3BsYXlNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XHJcbiAgcGFnZVRpdGxlOiBzdHJpbmc7XHJcbiAgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBEaXNwbGF5TWFuYWdlciB7XHJcbiAgcHVibGljIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwYWdlVGl0bGU6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElEaXNwbGF5TWFuYWdlck9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuaXNTdGFuZGFsb25lUGFnZSA9IG9wdGlvbnMuaXNTdGFuZGFsb25lUGFnZTtcclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gICAgdGhpcy5wYWdlVGl0bGUgPSBvcHRpb25zLnBhZ2VUaXRsZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBsZXQgY29sdW1uczogSUdyaWRDb2x1bW5bXSA9IFtdO1xyXG5cclxuICAgIGNvbnN0IGxvYWREYXRhUHJvbWlzZSA9IHNlbmRSZXF1ZXN0PElBUFNDb250cm9sRGlzcGxheUFzc2lnbm1lbnRzRGF0YT4odGhpcy5sb2FkRGF0YVVybCwgJ2dldCcpXHJcbiAgICAgIC50aGVuKChyZXMpID0+IHtcclxuICAgICAgICBjb2x1bW5zID0gcmVzLkRpc3BsYXlzLm1hcCgoZCkgPT4gKHsgSWQ6IGQuSWQudG9TdHJpbmcoKSwgQ2FwdGlvbjogZC5OYW1lIH0pKTtcclxuXHJcbiAgICAgICAgY29uc3QgZGF0YSA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHVzZXIgb2YgcmVzLlVzZXJzKSB7XHJcbiAgICAgICAgICBjb25zdCBpdGVtID0geyBVc2VyTmFtZTogdXNlci5Vc2VyTmFtZSwgVXNlcklkOiB1c2VyLklkIH07XHJcbiAgICAgICAgICBjb25zdCB1c2VyQXNzaWdubWVudHMgPSByZXMuQXNzaWdubWVudHMuZmlsdGVyKChhKSA9PiBhLlVzZXJJZCA9PT0gdXNlci5JZCk7XHJcblxyXG4gICAgICAgICAgdXNlckFzc2lnbm1lbnRzLmZvckVhY2goKGFzc2lnbm1lbnQpID0+IHtcclxuICAgICAgICAgICAgaXRlbVthc3NpZ25tZW50LkRpc3BsYXlJZF0gPSB0cnVlO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgZGF0YS5wdXNoKGl0ZW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZ3JpZENvbHVtbnMgPSBbXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogJ1VzZXJOYW1lJywgd2lkdGg6IDMwMCwgZml4ZWQ6IHRydWUsIGZpeGVkUG9zaXRpb246ICdsZWZ0JywgYWxsb3dFZGl0aW5nOiBmYWxzZSB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6ICdVc2VySWQnLCB2aXNpYmxlOiBmYWxzZSB9XHJcbiAgICAgICAgXSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuQ29sdW1uW107XHJcblxyXG4gICAgICAgIGdyaWQub3B0aW9uKCdjb2x1bW5zJywgZ3JpZENvbHVtbnMuY29uY2F0KGNvbHVtbnMubWFwKChjb2wpID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogY29sLklkLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiBjb2wuQ2FwdGlvbixcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdib29sZWFuJyxcclxuICAgICAgICAgICAgY2FsY3VsYXRlQ2VsbFZhbHVlOiAocm93RGF0YSkgPT4gISFyb3dEYXRhW2NvbC5JZF1cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSkpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIGxldCB1cGRhdGluZ0lzSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgY29uc3QgZ3JpZE9wdGlvbnMgPSB7XHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdhcHMtZGlzcGxheS1tYW5hZ2VyJ30sXHJcbiAgICAgIGRhdGFTb3VyY2U6IHtcclxuICAgICAgICBzdG9yZTogbmV3IERldkV4cHJlc3MuZGF0YS5DdXN0b21TdG9yZSh7XHJcbiAgICAgICAgICBrZXk6ICdVc2VySWQnLFxyXG4gICAgICAgICAgbG9hZE1vZGU6ICdyYXcnLFxyXG4gICAgICAgICAgbG9hZDogKCkgPT4gbG9hZERhdGFQcm9taXNlLFxyXG4gICAgICAgICAgdXBkYXRlOiAoa2V5LCB2YWx1ZXM6IHsgW2Rpc3BsYXlJZDogbnVtYmVyXTogYm9vbGVhbiB9KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvUmVtb3ZlOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgICAgICAgICBjb25zdCB0b0FkZDogbnVtYmVyW10gPSBbXTtcclxuICAgICAgICAgICAgY29uc3QgdGhlcmVJc0N1cnJlbnRVcGRhdGluZyA9IHVwZGF0aW5nSXNJblByb2dyZXNzO1xyXG5cclxuICAgICAgICAgICAgdXBkYXRpbmdJc0luUHJvZ3Jlc3MgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZGlzcGxheUlkcyA9IE9iamVjdC5rZXlzKHZhbHVlcyk7XHJcblxyXG4gICAgICAgICAgICBkaXNwbGF5SWRzLmZvckVhY2goKGlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHZhbHVlc1tpZF0pIHtcclxuICAgICAgICAgICAgICAgIHRvQWRkLnB1c2gocGFyc2VJbnQoaWQpKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdG9SZW1vdmUucHVzaChwYXJzZUludChpZCkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBOT1RFOiBub3RpZnkgYWJvdXQgc3VjY2Vzc2Z1bCByZXF1ZXN0IG9ubHkgZm9yIHRoZSBmaXJzdCByZXF1ZXN0IGluIHRoZSBxdWV1ZVxyXG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7IHVwZGF0aW5nSXNJblByb2dyZXNzID0gZmFsc2U7IH0sIDApO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHRoaXMudXBkYXRlRGF0YVVybCwgJ3B1dCcsIHtcclxuICAgICAgICAgICAgICB1c2VySWQ6IGtleSxcclxuICAgICAgICAgICAgICBkaXNwbGF5c1RvUmVtb3ZlOiB0b1JlbW92ZSxcclxuICAgICAgICAgICAgICBkaXNwbGF5c1RvQWRkOiB0b0FkZFxyXG4gICAgICAgICAgICB9LCAhdGhlcmVJc0N1cnJlbnRVcGRhdGluZykucHJvbWlzZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0sXHJcbiAgICAgIGhlaWdodDogJzEwMCUnLFxyXG4gICAgICBzZWxlY3Rpb246IHtcclxuICAgICAgICBtb2RlOiAnbm9uZSdcclxuICAgICAgfSxcclxuICAgICAgYWxsb3dDb2x1bW5SZXNpemluZzogdHJ1ZSxcclxuICAgICAgZ3JvdXBpbmc6IHtcclxuICAgICAgICBjb250ZXh0TWVudUVuYWJsZWQ6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgZ3JvdXBQYW5lbDoge1xyXG4gICAgICAgIHZpc2libGU6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgcmVtb3RlT3BlcmF0aW9uczogZmFsc2UsXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgIG1vZGU6ICdjZWxsJyxcclxuICAgICAgICByZWZyZXNoTW9kZTogJ3JlcGFpbnQnXHJcbiAgICAgIH1cclxuICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXM7XHJcblxyXG4gICAgY29uc3QgYWRkaXRpb25hbE9wdGlvbnMgPSB7XHJcbiAgICAgIGV4cG9ydEZpbGVOYW1lOiAnRGlzcGxheU1hbmFnZW1lbnQnLFxyXG4gICAgICBzdW1tYXJ5Q29sdW1uOiAnVXNlck5hbWUnXHJcbiAgICB9IGFzIElHcmlkQWRkaXRpb25hbE9wdGlvbnM7XHJcblxyXG4gICAgbGV0IGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICAgIGlmICh0aGlzLmlzU3RhbmRhbG9uZVBhZ2UpIHtcclxuICAgICAgZ3JpZCA9IGNyZWF0ZUZ1bGxTY3JlZW5EYXRhR3JpZCh0aGlzLiRjb250YWluZXIsIGdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9ucywgdGhpcy5wYWdlVGl0bGUsICcnLCB0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdyaWQgPSBjcmVhdGVEZWZhdWx0R3JpZCh0aGlzLiRjb250YWluZXIsIHtcclxuICAgICAgICBvcHRpb25zOiBncmlkT3B0aW9ucyxcclxuICAgICAgICBzdW1tYXJ5Q29sdW1uOiBhZGRpdGlvbmFsT3B0aW9ucy5zdW1tYXJ5Q29sdW1uLFxyXG4gICAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZSxcclxuICAgICAgICBpc0Z1bGxTY3JlZW46IGZhbHNlLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vRGF0YS9SZXF1ZXN0JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVBpbmdSZXN1bHQge1xyXG4gIGlzQXV0aGVudGljYXRlZDogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2Vzc2lvbk5vdGlmaWVyT3B0aW9ucyB7XHJcbiAgc2Vzc2lvbkV4cGlyZVRpbWVNczogbnVtYmVyO1xyXG4gIGRpc3BsYXlEdXJhdGlvbk1zOiBudW1iZXI7XHJcbiAgc2Vzc2lvblBpbmdVcmw6IHN0cmluZztcclxuICBsb2dvdXRVcmw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNlc3Npb25Ob3RpZmllciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uRXhwaXJlVGltZU1zOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwbGF5RHVyYXRpb25NczogbnVtYmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2Vzc2lvblBpbmdVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvZ291dFVybDogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIHdhdGluZ1RpbWVvdXRJZDogbnVtYmVyO1xyXG4gIHByaXZhdGUgY291bnRlckludGVydmFsSWQ6IG51bWJlcjtcclxuICBwcml2YXRlIHBpbmdJbnRlcnZhbElkOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBleHBpcmF0aW9uVGltZTogRGF0ZTtcclxuICBwcml2YXRlICR0ZXh0Q29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSBjb250aW51ZXJCdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b247XHJcbiAgcHJpdmF0ZSBva0J1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcclxuICBwcml2YXRlIGxvZ291dEJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcclxuXHJcbiAgcHJpdmF0ZSBfcG9wdXA6IERldkV4cHJlc3MudWkuZHhQb3B1cDtcclxuICBwcml2YXRlIGdldCBwb3B1cCgpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAge1xyXG4gICAgaWYgKCF0aGlzLl9wb3B1cCkge1xyXG4gICAgICB0aGlzLl9wb3B1cCA9IHRoaXMuY3JlYXRlUG9wdXAoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fcG9wdXA7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJU2Vzc2lvbk5vdGlmaWVyT3B0aW9ucykge1xyXG4gICAgdGhpcy5zZXNzaW9uRXhwaXJlVGltZU1zID0gb3B0aW9ucy5zZXNzaW9uRXhwaXJlVGltZU1zO1xyXG4gICAgdGhpcy5kaXNwbGF5RHVyYXRpb25NcyA9IG9wdGlvbnMuZGlzcGxheUR1cmF0aW9uTXM7XHJcbiAgICB0aGlzLnNlc3Npb25QaW5nVXJsID0gb3B0aW9ucy5zZXNzaW9uUGluZ1VybDtcclxuICAgIHRoaXMubG9nb3V0VXJsID0gb3B0aW9ucy5sb2dvdXRVcmw7XHJcblxyXG4gICAgdGhpcy5waW5nU2Vzc2lvbklmVGFiSXNBY3RpdmUgPSB0aGlzLnBpbmdTZXNzaW9uSWZUYWJJc0FjdGl2ZS5iaW5kKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc2V0KCkge1xyXG4gICAgdGhpcy5jbGVhclRpbWVvdXRzQW5kSW50ZXJ2YWxzKCk7XHJcblxyXG4gICAgdGhpcy5wb3B1cD8uaGlkZSgpO1xyXG5cclxuICAgIHRoaXMuZXhwaXJhdGlvblRpbWUgPSB0aGlzLmdldEV4cGlyYXRpb25UaW1lKCk7XHJcblxyXG4gICAgdGhpcy53YXRpbmdUaW1lb3V0SWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd05vdGlmaWNhdGlvbigpO1xyXG4gICAgfSwgTWF0aC5tYXgodGhpcy5zZXNzaW9uRXhwaXJlVGltZU1zIC0gdGhpcy5kaXNwbGF5RHVyYXRpb25NcywgMCkpO1xyXG5cclxuICAgIHRoaXMucGluZ0ludGVydmFsSWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICB0aGlzLnBpbmdTZXNzaW9uSWZUYWJJc0FjdGl2ZSgpO1xyXG4gICAgfSwgNjAgKiAxMDAwKTtcclxuXHJcbiAgICAkKGRvY3VtZW50KS5vbigndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMucGluZ1Nlc3Npb25JZlRhYklzQWN0aXZlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy5jbGVhclRpbWVvdXRzQW5kSW50ZXJ2YWxzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNob3dOb3RpZmljYXRpb24oKSB7XHJcbiAgICB0aGlzLnBvcHVwPy5zaG93KCk7XHJcblxyXG4gICAgdGhpcy5jbGVhclRpbWVvdXRzQW5kSW50ZXJ2YWxzKCk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVQb3B1cENvbnRlbnQoKTtcclxuICAgIHRoaXMuY291bnRlckludGVydmFsSWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICB0aGlzLnVwZGF0ZVBvcHVwQ29udGVudCgpO1xyXG4gICAgfSwgMTAwMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyVGltZW91dHNBbmRJbnRlcnZhbHMoKSB7XHJcbiAgICBpZiAodGhpcy53YXRpbmdUaW1lb3V0SWQpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMud2F0aW5nVGltZW91dElkKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvdW50ZXJJbnRlcnZhbElkKSB7XHJcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5jb3VudGVySW50ZXJ2YWxJZCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5waW5nSW50ZXJ2YWxJZCkge1xyXG4gICAgICBjbGVhckludGVydmFsKHRoaXMucGluZ0ludGVydmFsSWQpO1xyXG4gICAgfVxyXG5cclxuICAgICQoZG9jdW1lbnQpLm9mZigndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMucGluZ1Nlc3Npb25JZlRhYklzQWN0aXZlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RXhwaXJhdGlvblRpbWUoKTogRGF0ZSB7XHJcbiAgICBjb25zdCBleHBpcmF0aW9uVGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICBleHBpcmF0aW9uVGltZS5zZXRNaWxsaXNlY29uZHMoZXhwaXJhdGlvblRpbWUuZ2V0TWlsbGlzZWNvbmRzKCkgKyB0aGlzLnNlc3Npb25FeHBpcmVUaW1lTXMpO1xyXG5cclxuICAgIHJldHVybiBleHBpcmF0aW9uVGltZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlUG9wdXAoKTogRGV2RXhwcmVzcy51aS5keFBvcHVwIHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JykuZHhQb3B1cCh7XHJcbiAgICAgIHRpdGxlOiAnU2Vzc2lvbiBFeHBpcmluZycsXHJcbiAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxyXG4gICAgICByZXNpemVFbmFibGVkOiBmYWxzZSxcclxuICAgICAgc2hvd0Nsb3NlQnV0dG9uOiBmYWxzZSxcclxuICAgICAgZHJhZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBtYXhIZWlnaHQ6IDE5MCxcclxuICAgICAgbWF4V2lkdGg6IDM3MCxcclxuICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuJHRleHRDb250YWluZXIgPSAkKCc8c3BhbiAvPicpO1xyXG4gICAgICAgIHRoaXMuJHRleHRDb250YWluZXIuYXBwZW5kKHRoaXMuZ2V0Q291bnRlclRleHQoKSk7XHJcbiAgICAgICAgY29uc3QgJGNvbnRhaW5lciA9ICQoJzxkaXYgLz4nKS5hcHBlbmQodGhpcy4kdGV4dENvbnRhaW5lcik7XHJcblxyXG4gICAgICAgIHJldHVybiAkY29udGFpbmVyO1xyXG4gICAgICB9LFxyXG4gICAgICB0b29sYmFySXRlbXM6IFt7XHJcbiAgICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICB0eXBlOiAnZGVmYXVsdCcsXHJcbiAgICAgICAgICB0ZXh0OiAnQ29udGludWUgc2Vzc2lvbicsXHJcbiAgICAgICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4gdGhpcy5jb250aW51ZXJCdXR0b24gPSBlLmNvbXBvbmVudCxcclxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoU2Vzc2lvbigpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICAgIH0sIHtcclxuICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgIHR5cGU6ICdkZWZhdWx0JyxcclxuICAgICAgICAgIHRleHQ6ICdSZWxvYWQgcGFnZScsXHJcbiAgICAgICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4gdGhpcy5va0J1dHRvbiA9IGUuY29tcG9uZW50LFxyXG4gICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH1cclxuICAgICAgfSwge1xyXG4gICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICB0ZXh0OiAnTG9nIE91dCcsXHJcbiAgICAgICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4gdGhpcy5sb2dvdXRCdXR0b24gPSBlLmNvbXBvbmVudCxcclxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2dPdXQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1dLFxyXG4gICAgfSkuYXBwZW5kVG8oJChkb2N1bWVudC5ib2R5KSkuZHhQb3B1cCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q291bnRlclRleHQoKTogSlF1ZXJ5IHtcclxuICAgIGNvbnN0IHJlbWFpbmVkU2Vjb25kcyA9IE1hdGgubWF4KHRoaXMuZ2V0U2Vjb25kc1RvRXhwaXJhdGlvbigpLCAwKTtcclxuICAgIGlmIChyZW1haW5lZFNlY29uZHMgPT09IDApIHtcclxuICAgICAgcmV0dXJuICQoJzxzcGFuIC8+JykudGV4dCgnWW91ciBzZXNzaW9uIGhhcyBiZWVuIGV4cGlyZWQnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0ICRzdGFydFRleHQgPSAkKCc8c3BhbiAvPicpLnRleHQoJ1lvdXIgc2Vzc2lvbiB3aWxsIGV4cGlyZSBpbiAnKTtcclxuICAgICAgY29uc3QgJGNvdW50ZXIgPSAkKCc8c3BhbiAvPicpLmFkZENsYXNzKCdzZXNzaW9uLW5vdGlmaWVyX19jb3VudGVyJykudGV4dChyZW1haW5lZFNlY29uZHMudG9GaXhlZCgwKSk7XHJcbiAgICAgIGNvbnN0ICRmaW5pc2hUZXh0ID0gJCgnPHNwYW4gLz4nKS50ZXh0KCcgc2Vjb25kcycpO1xyXG5cclxuICAgICAgcmV0dXJuICQoJzxzcGFuIC8+JykuYXBwZW5kKCRzdGFydFRleHQsICRjb3VudGVyLCAkZmluaXNoVGV4dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNlY29uZHNUb0V4cGlyYXRpb24oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAodGhpcy5leHBpcmF0aW9uVGltZS5nZXRUaW1lKCkgLSBuZXcgRGF0ZSgpLmdldFRpbWUoKSkgLyAxMDAwO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWZyZXNoU2Vzc2lvbigpIHtcclxuICAgIHRoaXMucmVzZXQoKTtcclxuXHJcbiAgICBzZW5kUmVxdWVzdDxJUGluZ1Jlc3VsdD4odGhpcy5zZXNzaW9uUGluZ1VybCwgJ0dFVCcsIG51bGwsIGZhbHNlLCB7IG5vdGlmeUVycm9yOiBmYWxzZSB9KS50aGVuKChyZXMpID0+IHtcclxuICAgICAgaWYgKCFyZXMuaXNBdXRoZW50aWNhdGVkKSB7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgICB9XHJcbiAgICB9KS5jYXRjaCgoKSA9PiB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwaW5nU2Vzc2lvbklmVGFiSXNBY3RpdmUoKSB7XHJcbiAgICBpZiAoZG9jdW1lbnQuaGlkZGVuKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBzZW5kUmVxdWVzdDxJUGluZ1Jlc3VsdD4odGhpcy5zZXNzaW9uUGluZ1VybCwgJ0dFVCcsIG51bGwsIGZhbHNlLCB7IG5vdGlmeUVycm9yOiBmYWxzZSB9KS50aGVuKChyZXMpID0+IHtcclxuICAgICAgaWYgKCFyZXMuaXNBdXRoZW50aWNhdGVkKSB7XHJcbiAgICAgICAgdGhpcy5zZXRFeHBpcmVkKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRFeHBpcmVkKCkge1xyXG4gICAgdGhpcy5leHBpcmF0aW9uVGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICB0aGlzLnNob3dOb3RpZmljYXRpb24oKTtcclxuICAgIGlmICh0aGlzLnBpbmdJbnRlcnZhbElkKSB7XHJcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5waW5nSW50ZXJ2YWxJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvZ091dCgpIHtcclxuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdGhpcy5sb2dvdXRVcmw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVBvcHVwQ29udGVudCgpIHtcclxuICAgIGNvbnN0IGlzQWxyZWFkeUV4cGlyZWQgPSB0aGlzLmdldFNlY29uZHNUb0V4cGlyYXRpb24oKSA8PSAwO1xyXG5cclxuICAgIHRoaXMuJHRleHRDb250YWluZXI/Lmh0bWwoJycpLmFwcGVuZCh0aGlzLmdldENvdW50ZXJUZXh0KCkpO1xyXG4gICAgdGhpcy5va0J1dHRvbi5vcHRpb24oJ3Zpc2libGUnLCBpc0FscmVhZHlFeHBpcmVkKTtcclxuICAgIHRoaXMuY29udGludWVyQnV0dG9uLm9wdGlvbigndmlzaWJsZScsICFpc0FscmVhZHlFeHBpcmVkKTtcclxuICAgIHRoaXMubG9nb3V0QnV0dG9uLm9wdGlvbigndmlzaWJsZScsICFpc0FscmVhZHlFeHBpcmVkKTtcclxuICB9XHJcbn1cclxuIiwgImNvbnN0IEdSSURfSU5ESUNBVE9SX1NUQVRFID0ge1xyXG4gIGVkaXQ6ICdlZGl0JyxcclxuICBzYXZpbmc6ICdzYXZpbmcnLFxyXG4gIHNhdmVkOiAnc2F2ZWQnXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBHUklEX0lORElDQVRPUl9TVEFURTtcclxuIiwgIlx1RkVGRmltcG9ydCB7IElHcmlkRGF0YUxheWVyIH0gZnJvbSAnLi4vLi4vRGF0YS9JbmRleCc7XHJcbmltcG9ydCB7IElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlLCBJR3JpZFN0YXRlLCBJR3JpZEV4dGVuZGVkQ29sdW1uU3RhdGUsIEdyaWREYXRhQ29sdW1uRGF0YVR5cGUgfSBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0lHcmlkU3RhdGUnO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi8uLi8uLi9VdGlscy9JbmRleCc7XHJcblxyXG5pbnRlcmZhY2UgSUxvYWRlZENvbHVtbnMgeyBbZGF0YUZpZWxkOiBzdHJpbmddOiBib29sZWFuOyB9XHJcbmludGVyZmFjZSBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TZXR0aW5ncyB7IFtkYXRhRmllbGQ6IHN0cmluZ106IElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlOyB9XHJcbmludGVyZmFjZSBJQ29sdW1uV2lkdGhzIHsgW3Zpc2libGVJbmRleDogbnVtYmVyXTogbnVtYmVyIHwgc3RyaW5nOyB9XHJcblxyXG5pbnRlcmZhY2UgSUNvbHVtbkNhcHRpb24ge1xyXG4gIGRhdGFGaWVsZDogc3RyaW5nO1xyXG4gIGNhcHRpb246IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR3JpZFN0YXRlTWFuYWdlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgcHVibGljIE9VVERBVEVfQ09MVU1OU19GT1VORF9FVkVOVCA9ICdvdXRkYXRlZC1jb2x1bW5zLWZvdW5kLWV2ZW50JztcclxuICBwcml2YXRlIHJlYWRvbmx5IGlkOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkRGF0YUxheWVyOiBJR3JpZERhdGFMYXllcjtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0ZUxvYWRlZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgbG9hZGVkQ29sdW1uczogSUxvYWRlZENvbHVtbnMgPSB7fTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3M6IElHcmlkQWRkaXRpb25hbENvbHVtblNldHRpbmdzID0ge307XHJcblxyXG4gIHByaXZhdGUgbGFzdENvbHVtblNldHRpbmdzU3RyOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGdyaWRJZDogbnVtYmVyLCBncmlkRGF0YUxheWVyOiBJR3JpZERhdGFMYXllcikge1xyXG4gICAgc3VwZXIoKTtcclxuXHJcbiAgICB0aGlzLmlkID0gZ3JpZElkO1xyXG4gICAgdGhpcy5ncmlkRGF0YUxheWVyID0gZ3JpZERhdGFMYXllcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2FkKGNoZWNrT3V0ZGF0ZWRDb2x1bW5zOiBib29sZWFuLCBvdXRkYXRlZENvbHVtbnNDYWxsYmFjazogKGNvbHVtbnMpID0+IHZvaWQpOiBKUXVlcnlQcm9taXNlPElHcmlkU3RhdGU+IHtcclxuICAgIHJldHVybiB0aGlzLmdyaWREYXRhTGF5ZXIuZ2V0R3JpZFZpZXdTZXR0aW5ncyh0aGlzLmlkKVxyXG4gICAgICAudGhlbigoZGF0YTogSUdyaWRTdGF0ZSkgPT4ge1xyXG4gICAgICAgIHRoaXMub25EYXRhTG9hZGVkKGRhdGEpO1xyXG5cclxuICAgICAgICBpZiAoY2hlY2tPdXRkYXRlZENvbHVtbnMpIHtcclxuICAgICAgICAgIHRoaXMuY2hlY2tDb2x1bW5zUmVsZXZhbmNlKGRhdGEuY29sdW1ucywgb3V0ZGF0ZWRDb2x1bW5zQ2FsbGJhY2spO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNhdmUoc3RhdGU6IElHcmlkU3RhdGUsIHNhdmluZ0NhbGxiYWNrPzogKCkgPT4gdm9pZCwgc2F2ZWRDYWxsYmFjaz86ICgpID0+IHZvaWQpOiBJQ29sdW1uV2lkdGhzIHtcclxuICAgIGNvbnN0IGNvbHVtbldpZHRoczogSUNvbHVtbldpZHRocyA9IHt9O1xyXG5cclxuICAgIGlmICghc3RhdGUuY29sdW1ucykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGUuY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgY29uc3QgYWRkU2V0dGluZ3MgPSB0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbY29sdW1uLmRhdGFGaWVsZF07XHJcblxyXG4gICAgICBpZiAoYWRkU2V0dGluZ3MpIHtcclxuICAgICAgICBjb2x1bW4uY2FwdGlvbiA9IGFkZFNldHRpbmdzLmNhcHRpb247XHJcbiAgICAgICAgY29sdW1uLnRvb2x0aXAgPSBhZGRTZXR0aW5ncy50b29sdGlwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvL05PVEU6IGlmIERCIHRhYmxlIGhhcyBubyBkYXRhIGluIGEgY29sdW1uLCBkYXRhIGdyaWQgY2FuJ3QgaW5mZXIgZGF0YSB0eXBlIGFuZCBkb2Vzbid0IHNldCB0aGUgZGF0YVR5cGUgZmllbGRcclxuICAgICAgaWYgKCFjb2x1bW4uZGF0YVR5cGUpIHtcclxuICAgICAgICBjb2x1bW4uZGF0YVR5cGUgPSBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlLkRlZmF1bHQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghIWNvbHVtbi53aWR0aCAmJiBjb2x1bW4udmlzaWJsZSkge1xyXG4gICAgICAgIGNvbHVtbldpZHRoc1tjb2x1bW4udmlzaWJsZUluZGV4XSA9IGNvbHVtbi53aWR0aDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgY29sdW1uU2V0dGluZ3NTdHIgPSBKU09OLnN0cmluZ2lmeShzdGF0ZS5jb2x1bW5zKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuc3RhdGVMb2FkZWQgfHwgY29sdW1uU2V0dGluZ3NTdHIgPT09IHRoaXMubGFzdENvbHVtblNldHRpbmdzU3RyKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubGFzdENvbHVtblNldHRpbmdzU3RyID0gY29sdW1uU2V0dGluZ3NTdHI7XHJcblxyXG4gICAgaWYgKHNhdmluZ0NhbGxiYWNrKSB7XHJcbiAgICAgIHNhdmluZ0NhbGxiYWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5ncmlkRGF0YUxheWVyLnVwZGF0ZUdyaWRWaWV3U2V0dGluZ3ModGhpcy5pZCwgc3RhdGUpXHJcbiAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICBpZiAoc2F2ZWRDYWxsYmFjaykge1xyXG4gICAgICAgICAgc2F2ZWRDYWxsYmFjaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtbldpZHRocztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjaGVja05ld0NvbHVtbnMoc3RhdGU6IElHcmlkU3RhdGUpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBuZXdDb2x1bW5GaWVsZHM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgaWYgKHN0YXRlLmNvbHVtbnMpIHtcclxuICAgICAgY29uc3QgbmV3Q29sdW1ucyA9IHN0YXRlLmNvbHVtbnMuZmlsdGVyKChjb2x1bW4pID0+ICF0aGlzLmxvYWRlZENvbHVtbnNbY29sdW1uLmRhdGFGaWVsZF0gJiYgY29sdW1uLnZpc2libGUpO1xyXG5cclxuICAgICAgaWYgKG5ld0NvbHVtbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgbmV3Q29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgICAgIG5ld0NvbHVtbkZpZWxkcy5wdXNoKGNvbHVtbi5kYXRhRmllbGQpO1xyXG4gICAgICAgICAgdGhpcy5sb2FkZWRDb2x1bW5zW2NvbHVtbi5kYXRhRmllbGRdID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXdDb2x1bW5GaWVsZHM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q29sdW1uQ2FwdGlvbnMoKTogSUNvbHVtbkNhcHRpb25bXSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzKS5tYXAoKGRhdGFGaWVsZCkgPT4ge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGRhdGFGaWVsZCxcclxuICAgICAgICBjYXB0aW9uOiB0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbZGF0YUZpZWxkXS5jYXB0aW9uXHJcbiAgICAgIH0gYXMgSUNvbHVtbkNhcHRpb247XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRDb2x1bW5DYXB0aW9uKGRhdGFGaWVsZDogc3RyaW5nLCBjYXB0aW9uOiBzdHJpbmcpIHtcclxuICAgIGlmICghdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2RhdGFGaWVsZF0pIHtcclxuICAgICAgdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2RhdGFGaWVsZF0gPSB7IGNhcHRpb246ICcnLCB0b29sdGlwOiAnJyB9O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tkYXRhRmllbGRdLmNhcHRpb24gPSBjYXB0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENvbHVtbkFkZGl0aW9uYWxTZXR0aW5ncyhkYXRhRmllbGQ6IHN0cmluZyk6IElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlIHtcclxuICAgIHJldHVybiB0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbZGF0YUZpZWxkXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjaGVja0NvbHVtbnNSZWxldmFuY2UoY29sdW1uczogSUdyaWRFeHRlbmRlZENvbHVtblN0YXRlW10sIGNhbGxiYWNrOiAob3V0ZGF0ZWRDb2x1bW5zOiBzdHJpbmdbXSkgPT4gdm9pZCkge1xyXG4gICAgdGhpcy5ncmlkRGF0YUxheWVyLmdldENvbHVtbnNCeVJlcG9ydElkKHRoaXMuaWQpXHJcbiAgICAgIC50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYWN0dWFsQ29sdW1ucyA9IHt9O1xyXG5cclxuICAgICAgICBkYXRhLmZvckVhY2goKGMpID0+IGFjdHVhbENvbHVtbnNbYy5OYW1lXSA9IHRydWUpO1xyXG5cclxuICAgICAgICBjb25zdCBvdXRkYXRlZENvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcigoYykgPT4gIWFjdHVhbENvbHVtbnNbYy5kYXRhRmllbGRdKS5tYXAoKGMpID0+IGMuZGF0YUZpZWxkKTtcclxuXHJcbiAgICAgICAgaWYgKG91dGRhdGVkQ29sdW1ucy5sZW5ndGgpIHtcclxuICAgICAgICAgIERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oYEdyaWQgc2V0dGluZ3MgY29udGFpbiBzb21lIGNvbHVubXMgd2hpY2ggZG9uJ3QgZXhpc3QgaW4gdGhlIGRhdGFiYXNlIHRhYmxlIGFueW1vcmU6XHJcblxyXG4gICAgICAgICAgJyR7b3V0ZGF0ZWRDb2x1bW5zLmpvaW4oJywgJyl9Jy5cclxuXHJcbiAgICAgICAgICBEbyB5b3Ugd2FudCB0byByZW1vdmUgdGhlc2UgY29sdW1ucyBmcm9tIGdyaWQgc2V0dGluZ3M/XHJcbiAgICAgICAgICBgLCAnUmVtb3ZlIHJlZHVuZGFudCBjb2x1bW5zPycpXHJcbiAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoIXJlcykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgY2FsbGJhY2sob3V0ZGF0ZWRDb2x1bW5zKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXNldFNldHRpbmdzKCk6IEpRdWVyeVByb21pc2U8SUdyaWRTdGF0ZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZERhdGFMYXllci5yZXNldFNldHRpbmdzKHRoaXMuaWQpXHJcbiAgICAgIC50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vbkRhdGFMb2FkZWQoZGF0YSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25EYXRhTG9hZGVkKGRhdGE6IElHcmlkU3RhdGUpIHtcclxuICAgIGNvbnN0IGxvYWRlZEdyaWRTdGF0ZUNvbHVtbnMgPSBkYXRhICYmIGRhdGEuY29sdW1ucztcclxuICAgIGxldCB2aXNpYmxlSW5kZXhDb3VudGVyID0gMDtcclxuXHJcbiAgICB0aGlzLnN0YXRlTG9hZGVkID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAobG9hZGVkR3JpZFN0YXRlQ29sdW1ucykge1xyXG4gICAgICB0aGlzLmxvYWRlZENvbHVtbnMgPSB7fTtcclxuXHJcbiAgICAgIGxvYWRlZEdyaWRTdGF0ZUNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkZWRDb2x1bW5zW2NvbHVtbi5kYXRhRmllbGRdID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gTk9URTogc2V0IHZpc2libGUgaW5kZXhlcyBpZiB0aGV5IGhhdmUgbm90IGJlZW4gc2V0LiBJdCdzIHJlcXVpcmVkIGZvciBwcm9wZXIgZHhEYXRhR3JpZCBhcHBlYXJhbmNlLlxyXG4gICAgICAgIGlmIChjb2x1bW4udmlzaWJsZSAmJiBjb2x1bW4udmlzaWJsZUluZGV4ID09PSBudWxsKSB7XHJcbiAgICAgICAgICBjb2x1bW4udmlzaWJsZUluZGV4ID0gdmlzaWJsZUluZGV4Q291bnRlcisrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTk9URTogcmVtb3ZlIGVtcHR5IHZhbHVlcyBiZWNhdXNlIHRoZXkgbGVhZCB0byB3cm9uZyBkeERhdGFHcmlkIGJlaGF2aW9yXHJcbiAgICAgICAgT2JqZWN0LmtleXMoY29sdW1uKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgIGlmIChjb2x1bW5ba2V5XSA9PT0gbnVsbCB8fCBjb2x1bW5ba2V5XSA9PT0gdm9pZCAwIHx8IGNvbHVtbltrZXldID09PSAnJykge1xyXG4gICAgICAgICAgICBkZWxldGUgY29sdW1uW2tleV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxTZXR0aW5ncyA9IHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tjb2x1bW4uZGF0YUZpZWxkXTtcclxuXHJcbiAgICAgICAgaWYgKCFhZGRpdGlvbmFsU2V0dGluZ3MpIHtcclxuICAgICAgICAgIHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tjb2x1bW4uZGF0YUZpZWxkXSA9IHtcclxuICAgICAgICAgICAgY2FwdGlvbjogY29sdW1uLmNhcHRpb24sXHJcbiAgICAgICAgICAgIHRvb2x0aXA6IGNvbHVtbi50b29sdGlwXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBhZGRpdGlvbmFsU2V0dGluZ3MuY2FwdGlvbiA9IGNvbHVtbi5jYXB0aW9uO1xyXG4gICAgICAgICAgYWRkaXRpb25hbFNldHRpbmdzLnRvb2x0aXAgPSBjb2x1bW4udG9vbHRpcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIE5PVEU6IHJlbW92ZSBjb2x1bW5zIHdoaWNoIGR4RGF0YUdyaWQgZG9lc24ndCBleHBlY3QuXHJcbiAgICAgICAgZGVsZXRlIGNvbHVtbi5jYXB0aW9uO1xyXG4gICAgICAgIGRlbGV0ZSBjb2x1bW4udG9vbHRpcDtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sYXN0Q29sdW1uU2V0dGluZ3NTdHIgPSBKU09OLnN0cmluZ2lmeShkYXRhLmNvbHVtbnMpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGZW51bSBHcmlkTW9kZSB7XHJcbiAgVmlldyA9IDEsXHJcbiAgRWRpdCA9IDJcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgR3JpZE1vZGU7XHJcbiIsICJcdUZFRkZpbXBvcnQgR3JpZE1vZGUgZnJvbSAnLi4vUGFnZXMvR3JpZC9Nb2RlJztcclxuaW1wb3J0IHsgSVJlcG9ydFBhcmFtcyB9IGZyb20gJy4uL0lSZXBvcnRQYXJhbXMnO1xyXG5pbXBvcnQgeyBJR3JpZFN0YXRlIH0gZnJvbSAnLi4vLi4vV2lkZ2V0cy9JR3JpZFN0YXRlJztcclxuaW1wb3J0IHsgSUNvbHVtbk1ldGFEYXRhIH0gZnJvbSAnLi4vQ29sdW1uTWV0YURhdGEnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IGNyZWF0ZUR4RGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL0RhdGEvRHhEYXRhU291cmNlJztcclxuaW1wb3J0IHsgRXhjZXB0aW9uVHlwZSB9IGZyb20gJy4uLy4uL0RhdGEvRXhjZXB0aW9uVHlwZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRGF0YUxheWVyIHtcclxuICBnZXRDb2x1bW5zQnlSZXBvcnRJZChyZXBvcnRJZDogbnVtYmVyKTogSlF1ZXJ5RGVmZXJyZWQ8SUNvbHVtbk1ldGFEYXRhW10+O1xyXG4gIGdldEdyaWREYXRhU291cmNlKHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcywgZ3JpZE1vZGU6IEdyaWRNb2RlLCBzaG93QWxsRGF0YUluRWRpdDogYm9vbGVhbik6IERldkV4cHJlc3MuZGF0YS5DdXN0b21TdG9yZTxhbnksIGFueT47XHJcbiAgcmVzZXRTZXR0aW5ncyhyZXBvcnRJZDogbnVtYmVyKTogSlF1ZXJ5RGVmZXJyZWQ8SUdyaWRTdGF0ZT47XHJcbiAgdXBkYXRlR3JpZFZpZXdTZXR0aW5ncyhyZXBvcnRJZDogbnVtYmVyLCBzdGF0ZTogSUdyaWRTdGF0ZSk6IEpRdWVyeURlZmVycmVkPGFueT47XHJcbiAgZ2V0R3JpZFZpZXdTZXR0aW5ncyhyZXBvcnRJZDogbnVtYmVyKTogSlF1ZXJ5RGVmZXJyZWQ8SUdyaWRTdGF0ZT47XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBjcmVhdGVHcmlkRGF0YUxheWVyOiAoZ3JpZFJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZykgPT4gSUdyaWREYXRhTGF5ZXIgPSAoZ3JpZFJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZykgPT4ge1xyXG4gIGNvbnN0IHVybHMgPSB7XHJcbiAgICBncmlkUmVzdWx0OiBgJHtncmlkUmVwb3J0Q29udHJvbGxlclVybH0vR3JpZFZpZXdSZXN1bHRgLFxyXG4gICAgZ2V0Q29sdW1uc0J5UmVwb3J0SWQ6IGAke2dyaWRSZXBvcnRDb250cm9sbGVyVXJsfS9HZXREYlRhYmxlRmllbGRzYCxcclxuICAgIHJlc2V0R3JpZFNldHRpbmdzOiBgJHtncmlkUmVwb3J0Q29udHJvbGxlclVybH0vUmVzZXRHcmlkVmlld1NldHRpbmdzYCxcclxuICAgIHVwZGF0ZUdyaWRWaWV3U2V0dGluZ3M6IGAke2dyaWRSZXBvcnRDb250cm9sbGVyVXJsfS9VcGRhdGVHcmlkVmlld1NldHRpbmdzYCxcclxuICAgIGdldEdyaWRWaWV3U2V0dGluZ3M6IGAke2dyaWRSZXBvcnRDb250cm9sbGVyVXJsfS9HZXRHcmlkVmlld1NldHRpbmdzYFxyXG4gIH07XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBnZXRHcmlkRGF0YVNvdXJjZShyZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXMsIGdyaWRNb2RlOiBHcmlkTW9kZSwgc2hvd0FsbERhdGFJbkVkaXQpIHtcclxuICAgICAgcmV0dXJuIGNyZWF0ZUR4RGF0YVNvdXJjZSh7XHJcbiAgICAgICAgbG9hZFBhcmFtczoge1xyXG4gICAgICAgICAgaWQ6IHJlcG9ydFBhcmFtcy5SZXBvcnRJZCxcclxuICAgICAgICAgIGFwcE5hbWU6IHJlcG9ydFBhcmFtcy5BcHBOYW1lLFxyXG4gICAgICAgICAgZ3JpZE1vZGUsXHJcbiAgICAgICAgICByb3dzTGltaXQ6IGdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0ICYmICFzaG93QWxsRGF0YUluRWRpdCA/IDE1IDogbnVsbFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbG9hZFVybDogdXJscy5ncmlkUmVzdWx0LFxyXG4gICAgICAgIGdldFVzZXJGcmllbmRseUVycm9yTWVzc2FnZVxyXG4gICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0Q29sdW1uc0J5UmVwb3J0SWQ6IChyZXBvcnRJZDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIHJldHVybiBzZW5kUmVxdWVzdCh1cmxzLmdldENvbHVtbnNCeVJlcG9ydElkLCAncG9zdCcsIHsgaWQ6IHJlcG9ydElkIH0sIGZhbHNlLCB7XHJcbiAgICAgICAgZGF0YVR5cGU6ICdqc29uJ1xyXG4gICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgcmVzZXRTZXR0aW5nczogKHJlcG9ydElkOiBudW1iZXIpID0+IHtcclxuICAgICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHVybHMucmVzZXRHcmlkU2V0dGluZ3MsICdwb3N0JywgeyBpZDogcmVwb3J0SWQgfSwgZmFsc2UsIHsgZGF0YVR5cGU6ICdqc29uJyB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgdXBkYXRlR3JpZFZpZXdTZXR0aW5nczogKHJlcG9ydElkOiBudW1iZXIsIHN0YXRlOiBJR3JpZFN0YXRlKSA9PiB7XHJcbiAgICAgIHJldHVybiBzZW5kUmVxdWVzdCh1cmxzLnVwZGF0ZUdyaWRWaWV3U2V0dGluZ3MsICdwb3N0Jywge1xyXG4gICAgICAgIGlkOiByZXBvcnRJZCwgY29sdW1uc1NldHRpbmdzOiBKU09OLnN0cmluZ2lmeShzdGF0ZS5jb2x1bW5zKVxyXG4gICAgICB9LCBmYWxzZSwge1xyXG4gICAgICAgIGRhdGFUeXBlOiAnanNvbidcclxuICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldEdyaWRWaWV3U2V0dGluZ3M6IChyZXBvcnRJZDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIHJldHVybiBzZW5kUmVxdWVzdCh1cmxzLmdldEdyaWRWaWV3U2V0dGluZ3MsICdwb3N0JywgeyBpZDogcmVwb3J0SWQgfSwgZmFsc2UsIHtcclxuICAgICAgICBkYXRhVHlwZTogJ2pzb24nXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH07XHJcbn07XHJcblxyXG5jb25zdCBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgPSAoZXhjZXB0aW9uVHlwZTogRXhjZXB0aW9uVHlwZSk6IHN0cmluZyA9PiB7XHJcbiAgc3dpdGNoIChleGNlcHRpb25UeXBlKSB7XHJcbiAgICBjYXNlIEV4Y2VwdGlvblR5cGUuU3FsRXhjZXB0aW9uOlxyXG4gICAgICByZXR1cm4gJ1dlIGF0dGVtcHRlZCB0byBleGVjdXRlIHRoZSBkYXRhIHF1ZXJ5IGhvd2V2ZXIgaXQgYXBwZWFycyB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgZGF0YSBzb3VyY2UuIFBsZWFzZSBjb250YWN0IHRoZSByZXBvcnQgYXV0aG9yIHRvIGNvbmZpcm0gdGhlIGRhdGEgcmVxdWlyZW1lbnRzLic7XHJcblxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuICcnO1xyXG4gIH1cclxufTtcclxuIiwgImV4cG9ydCBpbnRlcmZhY2UgSVJlZnJlc2hPcHRpb25zIHtcclxuICBjYWxsYmFjazogKCkgPT4gdm9pZDtcclxuICBlbGFwc2VkQ2FsbGJhY2s6ICh0aW1lOiBudW1iZXIpID0+IHZvaWQ7XHJcbn1cclxuXHJcbmNvbnN0IHVwZGF0ZVRpbWVvdXQgPSAxMDA7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWZyZXNoVGltZXIge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FsbGJhY2s6ICgpID0+IHZvaWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBlbGFwc2VkQ2FsbGJhY2s6ICh0aW1lOiBudW1iZXIpID0+IHZvaWQ7XHJcbiAgcHJpdmF0ZSBhY3RpdmVUaW1lcklkOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgY3VycmVudEludGVydmFsOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgbGFzdFN0YXRlQ2hlY2tlZDogRGF0ZTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVJlZnJlc2hPcHRpb25zKSB7XHJcbiAgICB0aGlzLmVsYXBzZWRDYWxsYmFjayA9IG9wdGlvbnMuZWxhcHNlZENhbGxiYWNrO1xyXG4gICAgdGhpcy5jYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhcnQoaW50ZXJ2YWw6IG51bWJlcikge1xyXG4gICAgaWYgKGludGVydmFsIDw9IDApIHtcclxuICAgICAgdGhpcy5jYWxsYmFjaygpO1xyXG5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubGFzdFN0YXRlQ2hlY2tlZCA9IG5ldyBEYXRlKCk7XHJcbiAgICB0aGlzLmN1cnJlbnRJbnRlcnZhbCA9IGludGVydmFsO1xyXG5cclxuICAgIGNvbnN0IHRpbWVySWQgPSB0aGlzLmFjdGl2ZVRpbWVySWQgPSBNYXRoLnJhbmRvbSgpO1xyXG4gICAgaWYgKHRoaXMuY3VycmVudEludGVydmFsIDwgMCkge1xyXG4gICAgICB0aGlzLmVsYXBzZWRDYWxsYmFjayh0aGlzLmN1cnJlbnRJbnRlcnZhbCk7XHJcblxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50aWNrVGltZXJGdW5jdGlvbih0aW1lcklkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0cmlnZ2VyQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5sYXN0U3RhdGVDaGVja2VkID0gbmV3IERhdGUoKTtcclxuICAgIHRoaXMuY2FsbGJhY2soKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdGlja1RpbWVyRnVuY3Rpb24odGltZXJJZDogbnVtYmVyKSB7XHJcbiAgICBpZiAodGltZXJJZCAhPT0gdGhpcy5hY3RpdmVUaW1lcklkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG4gICAgLy9AdHMtaWdub3JlXHJcbiAgICBsZXQgdGltZVRvVXBkYXRlOiBudW1iZXIgPSB0aGlzLmN1cnJlbnRJbnRlcnZhbCAtIChuZXcgRGF0ZSgpIC0gdGhpcy5sYXN0U3RhdGVDaGVja2VkKTtcclxuICAgIGlmICh0aW1lVG9VcGRhdGUgPD0gMCkge1xyXG4gICAgICB0aW1lVG9VcGRhdGUgPSB0aGlzLmN1cnJlbnRJbnRlcnZhbCArIDk5OTtcclxuICAgICAgdGhpcy5jYWxsYmFjaygpO1xyXG4gICAgICB0aGlzLmxhc3RTdGF0ZUNoZWNrZWQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZWxhcHNlZENhbGxiYWNrKHRpbWVUb1VwZGF0ZSk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnRpY2tUaW1lckZ1bmN0aW9uKHRpbWVySWQpLCB1cGRhdGVUaW1lb3V0KTtcclxuICB9XHJcbn1cclxuIiwgImltcG9ydCBSZWZyZXNoQ29tcG9uZW50IGZyb20gJy4vSW5kZXgnO1xyXG5cclxuY29uc3QgZGVmYXVsdFJlZnJlc2hFbnRyaWVzOiBJUmVmcmVzaEVudHJ5W10gPSBbe1xyXG4gIHRpbWVvdXQ6IDAsXHJcbiAgdGV4dDogJ3JlZnJlc2ggbm93JyxcclxuICByZWZyZXNoVGVtcGxhdGU6ICcnLFxyXG59LCB7XHJcbiAgdGltZW91dDogMTUgKiAxMDAwLFxyXG4gIHRleHQ6ICcxNSBzZWMnLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogJ0F1dG8gVXBkYXRlICglKScsXHJcbn0sIHtcclxuICB0aW1lb3V0OiAzMCAqIDEwMDAsXHJcbiAgdGV4dDogJzMwIHNlYycsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGUgKCUpJyxcclxufSwge1xyXG4gIHRpbWVvdXQ6IDYwICogMTAwMCxcclxuICB0ZXh0OiAnMSBtaW4nLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogJ0F1dG8gVXBkYXRlICglKScsXHJcbn0sIHtcclxuICB0aW1lb3V0OiAxODAgKiAxMDAwLFxyXG4gIHRleHQ6ICczIG1pbicsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGUgKCUpJyxcclxufSwge1xyXG4gIHRpbWVvdXQ6IDMwMCAqIDEwMDAsXHJcbiAgdGV4dDogJzUgbWluJyxcclxuICByZWZyZXNoVGVtcGxhdGU6ICdBdXRvIFVwZGF0ZSAoJSknLFxyXG59LCB7XHJcbiAgdGltZW91dDogNjAwICogMTAwMCxcclxuICB0ZXh0OiAnMTAgbWluJyxcclxuICByZWZyZXNoVGVtcGxhdGU6ICdBdXRvIFVwZGF0ZSAoJSknLFxyXG59LCB7XHJcbiAgdGltZW91dDogLTEsXHJcbiAgdGV4dDogJ29mZicsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGU6IG9mZicsXHJcbiAgaXNEZWZhdWx0OiB0cnVlXHJcbn1dO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUmVmcmVzaEVudHJ5IHtcclxuICB0aW1lb3V0OiBudW1iZXIsXHJcbiAgdGV4dDogc3RyaW5nLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogc3RyaW5nLFxyXG4gIGlzRGVmYXVsdD86IGJvb2xlYW5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVmcmVzaEJ1dHRvbiB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkcm9wRG93bkJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHRNZW51OiBEZXZFeHByZXNzLnVpLmR4Q29udGV4dE1lbnU7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZWZyZXNoQ29tcG9uZW50OiBSZWZyZXNoQ29tcG9uZW50O1xyXG4gIHByaXZhdGUgbWVudUlzT3BlbmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBzZWxlY3RlZEVudHJ5OiBJUmVmcmVzaEVudHJ5O1xyXG5cclxuICBjb25zdHJ1Y3RvcigkdGFyZ2V0OiBKUXVlcnksIGNhbGxiYWNrOiAoKSA9PiB2b2lkLCByZWZyZXNoRW50cmllczogSVJlZnJlc2hFbnRyeVtdIHwgbnVsbCA9IGRlZmF1bHRSZWZyZXNoRW50cmllcykge1xyXG4gICAgdGhpcy5yZWZyZXNoQ29tcG9uZW50ID0gbmV3IFJlZnJlc2hDb21wb25lbnQoeyBjYWxsYmFjaywgZWxhcHNlZENhbGxiYWNrOiAoZSkgPT4gdGhpcy5lbGFwc2VkQ2FsbGJhY2soZSkgfSk7XHJcbiAgICB0aGlzLnNlbGVjdGVkRW50cnkgPSByZWZyZXNoRW50cmllcy5maW5kKChlKSA9PiBlLmlzRGVmYXVsdCkgfHwgcmVmcmVzaEVudHJpZXMuZmlsdGVyKChlKSA9PiAhIWUudGltZW91dClbMF07XHJcblxyXG4gICAgdGhpcy5jb250ZXh0TWVudSA9ICQoJzxkaXYgLz4nKS5keENvbnRleHRNZW51KHtcclxuICAgICAgZGF0YVNvdXJjZTogcmVmcmVzaEVudHJpZXMsXHJcbiAgICAgIHRhcmdldDogJHRhcmdldCxcclxuICAgICAgcG9zaXRpb246IHsgbXk6ICdyaWdodCB0b3AnLCBhdDogJ3JpZ2h0IGJvdHRvbScgfSxcclxuICAgICAgb25JdGVtQ2xpY2s6IChlKSA9PiB7XHJcbiAgICAgICAgaWYoIShlLml0ZW1EYXRhIGFzIGFueSkudGltZW91dCkge1xyXG4gICAgICAgICAgZS5jb21wb25lbnQuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFbnRyeSA9IGUuaXRlbURhdGEgYXMgSVJlZnJlc2hFbnRyeTtcclxuICAgICAgICAgIGUuY29tcG9uZW50LnNlbGVjdEl0ZW0odGhpcy5zZWxlY3RlZEVudHJ5IGFzIGFueSk7XHJcbiAgICAgICAgICB0aGlzLnJlZnJlc2hDb21wb25lbnQuc3RhcnQoKGUuaXRlbURhdGEgYXMgYW55KS50aW1lb3V0KTtcclxuICAgICAgICAgIGUuY29tcG9uZW50LmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uSGlkZGVuOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tZW51SXNPcGVuZWQgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgICAgb25TaG93bjogKGUpID0+IHtcclxuICAgICAgICB0aGlzLm1lbnVJc09wZW5lZCA9IHRydWU7XHJcbiAgICAgICAgKGUuY29tcG9uZW50IGFzIGFueSkuaXRlbXNDb250YWluZXIoKVswXS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2lzem9sZWEtdGhlbWUnKTtcclxuICAgICAgfSxcclxuICAgICAgaXRlbVRlbXBsYXRlOiAoZW50cnkpID0+IGVudHJ5LnRleHQsXHJcblxyXG4gICAgICBjc3NDbGFzczogJ2lzem9sZWEtdGhlbWUnXHJcbiAgICB9KS5hcHBlbmRUbygnYm9keScpLmR4Q29udGV4dE1lbnUoJ2luc3RhbmNlJyk7XHJcbiAgICB0aGlzLmNvbnRleHRNZW51LnNlbGVjdEl0ZW0odGhpcy5zZWxlY3RlZEVudHJ5IGFzIGFueSk7XHJcblxyXG4gICAgdGhpcy5kcm9wRG93bkJ1dHRvbiA9ICR0YXJnZXQuZHhCdXR0b24oe1xyXG4gICAgICB0ZXh0OiB0aGlzLnNlbGVjdGVkRW50cnkudGV4dCxcclxuICAgICAgdGVtcGxhdGU6IChidXR0b25EYXRhLCBjb250ZW50KSA9PiB7XHJcbiAgICAgICAgJCgnPGkgLz4nKS5hZGRDbGFzcygnZHgtaWNvbiBkeC1pY29uLXJlZnJlc2gnKS5hcHBlbmRUbyhjb250ZW50KTtcclxuICAgICAgICAkKCc8c3Bhbj4nKS5hZGRDbGFzcygnYnV0dG9uLXdpdGgtZXhwYW5kLXRleHQnKS50ZXh0KGJ1dHRvbkRhdGEudGV4dCkuYXBwZW5kVG8oY29udGVudCk7XHJcbiAgICAgICAgJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ2J1dHRvbi13aXRoLWV4cGFuZC1pY29uIGlzb3otaWNvbi0xNiBpc296LWljb24tYXJyb3ctZG93bi0xNicpLmFwcGVuZFRvKGNvbnRlbnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gY29udGVudDtcclxuICAgICAgfSxcclxuICAgICAgZWxlbWVudEF0dHI6IHtcclxuICAgICAgICBjbGFzczogJ2lzem9sZWEtbWQgYnV0dG9uLXdpdGgtZXhwYW5kJ1xyXG4gICAgICB9LFxyXG5cclxuICAgICAgb25DbGljazogKGUpID0+IHtcclxuICAgICAgICB0aGlzLmNvbnRleHRNZW51LmVsZW1lbnQoKS53aWR0aCgkdGFyZ2V0Lm91dGVyV2lkdGgoKSk7XHJcbiAgICAgICAgaWYgKHRoaXMubWVudUlzT3BlbmVkKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRleHRNZW51LmhpZGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5jb250ZXh0TWVudS5zaG93KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KS5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuXHJcbiAgICAodGhpcy5zZWxlY3RlZEVudHJ5LnRpbWVvdXQgPiAwKSAmJiB0aGlzLnJlZnJlc2hDb21wb25lbnQuc3RhcnQodGhpcy5zZWxlY3RlZEVudHJ5LnRpbWVvdXQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlZnJlc2hDb21wb25lbnQudHJpZ2dlckNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbGFwc2VkQ2FsbGJhY2sodGltZVRvVXBkYXRlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuZHJvcERvd25CdXR0b24ub3B0aW9uKCd0ZXh0JywgdGhpcy5zZWxlY3RlZEVudHJ5LnJlZnJlc2hUZW1wbGF0ZS5yZXBsYWNlKCclJywgTWF0aC5mbG9vcih0aW1lVG9VcGRhdGUgLyAxMDAwKS50b1N0cmluZygpKSk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgZ3JpZENvbHVtblR5cGVzIGZyb20gJy4uLy4uL0J1c2luZXNzL0dyaWRDb2x1bW5UeXBlcyc7XHJcbmltcG9ydCB7aW5pdFBvcG92ZXJ9IGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVwb3J0RGV0YWlsc1BvcG92ZXInO1xyXG5pbXBvcnQge0lHcmlkUmVwb3J0UGFyYW1zLCBJUmVwb3J0UGFyYW1zfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IEdSSURfSU5ESUNBVE9SX1NUQVRFIGZyb20gJy4vR3JpZEluZGljYXRvclN0YXRlJztcclxuaW1wb3J0IGRlZmF1bHRHcmlkIGZyb20gJy4uLy4uLy4uL1dpZGdldHMvR3JpZC9EZWZhdWx0R3JpZCc7XHJcbmltcG9ydCBHcmlkU3RhdGVNYW5hZ2VyIGZyb20gJy4vR3JpZFN0YXRlTWFuYWdlcic7XHJcbmltcG9ydCBHcmlkTW9kZSBmcm9tICcuL01vZGUnO1xyXG5pbXBvcnQge2NyZWF0ZUdyaWREYXRhTGF5ZXIsIElHcmlkRGF0YUxheWVyfSBmcm9tICcuLi8uLi9EYXRhL0luZGV4JztcclxuaW1wb3J0IHtHcmlkRGF0YUNvbHVtbkRhdGFUeXBlLCBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZSwgSUdyaWRTdGF0ZX0gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9JR3JpZFN0YXRlJztcclxuaW1wb3J0IHtJUmVwb3J0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcclxuaW1wb3J0IFJlZnJlc2hCdXR0b24gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZWZyZXNoVGltZXIvQnV0dG9uJztcclxuXHJcbmNvbnN0IFJFU0VUX1NBVkVEX0lORElDQVRPUl9USU1FT1VUID0gMzAwMDtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRPcHRpb25zIHtcclxuICBncmlkUG9zaXRpb25NYXJrZXI6IEpRdWVyeTtcclxuICByZXBvcnRQYXJhbXM6IElHcmlkUmVwb3J0UGFyYW1zO1xyXG4gIGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBhZGRSZWZyZXNoQnV0dG9uOiBib29sZWFuO1xyXG4gIGdyaWRSZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmc7XHJcbiAgc2hvd0hlYWRlcj86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdyaWQgaW1wbGVtZW50cyBJUmVwb3J0Q29tcG9uZW50IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWRQb3NpdGlvbk1hcmtlcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVwb3J0UGFyYW1zOiBJR3JpZFJlcG9ydFBhcmFtcztcclxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWRSZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93SGVhZGVyOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxuXHJcbiAgcHJpdmF0ZSBjdXJyZW50R3JpZE1vZGU6IEdyaWRNb2RlIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzaG93QWxsRGF0YUluRWRpdCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgbG9hZGluZ1RpbWVvdXQgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgcG9wb3ZlcjogRGV2RXhwcmVzcy51aS5keFBvcG92ZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBncmlkU3RhdGVNYW5hZ2VyOiBHcmlkU3RhdGVNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSAkZ3JpZFN0YXRlSW5kaWNhdG9yOiBKUXVlcnkgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlICRncmlkRXJyb3JQbGFjZWhvbGRlcjogSlF1ZXJ5IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSAkZ3JpZFRhcmdldEVsZW1lbnQ6IEpRdWVyeSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgJHJlc2V0U2V0dGluZ1RhcmdldEVsZW1lbnQ6IEpRdWVyeSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgZ3JpZFN0YXRlSW5kaWNhdG9yVGltZW91dDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBkYXRhTGF5ZXI6IElHcmlkRGF0YUxheWVyO1xyXG4gIHByaXZhdGUgZWRpdFdpZHRoRWRpdEJveGVzOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveFtdIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgZ3JpZFJlcGFpbnRRdWV1ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGNvbHVtbk5hbWVzVXBkYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcmVmcmVzaEJ1dHRvbjogUmVmcmVzaEJ1dHRvbiB8IG51bGwgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJR3JpZE9wdGlvbnMpIHtcclxuICAgIHRoaXMuZ3JpZFBvc2l0aW9uTWFya2VyID0gb3B0aW9ucy5ncmlkUG9zaXRpb25NYXJrZXI7XHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy5hbGxvd0VkaXRpbmcgPSBvcHRpb25zLmFsbG93RWRpdGluZztcclxuICAgIHRoaXMuYWRkUmVmcmVzaEJ1dHRvbiA9IG9wdGlvbnMuYWRkUmVmcmVzaEJ1dHRvbjtcclxuICAgIHRoaXMuZ3JpZFJlcG9ydENvbnRyb2xsZXJVcmwgPSBvcHRpb25zLmdyaWRSZXBvcnRDb250cm9sbGVyVXJsO1xyXG4gICAgdGhpcy5zaG93SGVhZGVyID0gb3B0aW9ucy5zaG93SGVhZGVyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuY3VycmVudEdyaWRNb2RlKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudEdyaWRNb2RlID0gR3JpZE1vZGUuVmlldztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluaXRJbnRlcm5hbCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyaWQucmVmcmVzaCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyaWQ/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuZ3JpZCA9IG51bGw7XHJcblxyXG4gICAgdGhpcy5jdXJyZW50R3JpZE1vZGUgPSBudWxsO1xyXG4gICAgdGhpcy4kcmVzZXRTZXR0aW5nVGFyZ2V0RWxlbWVudD8ucmVtb3ZlKCk7XHJcbiAgICB0aGlzLiRncmlkVGFyZ2V0RWxlbWVudD8ucmVtb3ZlKCk7XHJcblxyXG4gICAgdGhpcy5wb3BvdmVyPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnBvcG92ZXIgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0SW50ZXJuYWwoKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICAgIHRoaXMuZGF0YUxheWVyID0gY3JlYXRlR3JpZERhdGFMYXllcih0aGlzLmdyaWRSZXBvcnRDb250cm9sbGVyVXJsKTtcclxuXHJcbiAgICBpZiAodGhpcy4kZ3JpZFRhcmdldEVsZW1lbnQpIHtcclxuICAgICAgdGhpcy4kZ3JpZFRhcmdldEVsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy4kZ3JpZFRhcmdldEVsZW1lbnQgPSAkKCc8ZGl2IC8+JykuaW5zZXJ0QWZ0ZXIodGhpcy5ncmlkUG9zaXRpb25NYXJrZXIpO1xyXG5cclxuICAgIHRoaXMuZ3JpZFN0YXRlTWFuYWdlciA9IG5ldyBHcmlkU3RhdGVNYW5hZ2VyKHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkLCB0aGlzLmRhdGFMYXllcik7XHJcblxyXG4gICAgdGhpcy4kZ3JpZEVycm9yUGxhY2Vob2xkZXIgPSAkKCc8ZGl2IC8+JykudGV4dCgnRGF0YSBsb2FkaW5nIGZhaWxlZC4nKS5hZGRDbGFzcygnZHgtZGF0YWdyaWQtbm9kYXRhJykuY3NzKHsgekluZGV4OiAxIH0pO1xyXG4gICAgdGhpcy4kZ3JpZEVycm9yUGxhY2Vob2xkZXIuYXBwZW5kVG8odGhpcy5ncmlkUG9zaXRpb25NYXJrZXIpO1xyXG4gICAgdGhpcy4kZ3JpZEVycm9yUGxhY2Vob2xkZXIuaGlkZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKSB7XHJcbiAgICAgIC8vIFRPRE86IGVsZW1lbnQgc2VsZWN0b3IgYXMgYSBwYXJhbVxyXG4gICAgICB0aGlzLnBvcG92ZXIgPSBpbml0UG9wb3ZlcignLnJlcG9ydC1kZXRhaWxzLWxpbmsnLCB0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVkaXRXaWR0aEVkaXRCb3hlcyA9IFtdO1xyXG4gICAgY29uc3QgZ3JpZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgPSB7XHJcbiAgICAgIGRhdGFTb3VyY2U6IHRoaXMuY3JlYXRlRGF0YVNvdXJjZSh0aGlzLnJlcG9ydFBhcmFtcywgdGhpcy5jdXJyZW50R3JpZE1vZGUsIHRoaXMuc2hvd0FsbERhdGFJbkVkaXQpLFxyXG4gICAgICBlbGVtZW50QXR0cjogeyBjbGFzczogdGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQgPyAnZWRpdC1tb2RlJyA6ICd2aWV3LW1vZGUnIH0sXHJcbiAgICAgIHJlcGFpbnRDaGFuZ2VzT25seTogdHJ1ZSxcclxuICAgICAgb25Ub29sYmFyUHJlcGFyaW5nOiAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZS50b29sYmFyT3B0aW9ucy5pdGVtcztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5WaWV3ICYmIHRoaXMuYWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgICAgICBjb25zdCBzZWFyY2hQYW5lbCA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5uYW1lID09PSAnc2VhcmNoUGFuZWwnKVswXTtcclxuICAgICAgICAgIGNvbnN0IHNlYXJjaFBhbmVsSW5kZXggPSBpdGVtcy5pbmRleE9mKHNlYXJjaFBhbmVsKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBzd2l0Y2hUb0VkaXRCdG4gPSB7XHJcbiAgICAgICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnU3dpdGNoIHRvIEVkaXQgTW9kZScsXHJcbiAgICAgICAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy5zd2l0Y2hUb01vZGUoR3JpZE1vZGUuRWRpdCksXHJcbiAgICAgICAgICAgICAgaWNvbjogJ3N3aXRjaC10by1lZGl0LW1vZGUnLFxyXG4gICAgICAgICAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdpc3pvbGVhLW1kJ31cclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW07XHJcblxyXG4gICAgICAgICAgaXRlbXMuc3BsaWNlKHNlYXJjaFBhbmVsSW5kZXgsIDEpO1xyXG4gICAgICAgICAgaXRlbXMucHVzaChzd2l0Y2hUb0VkaXRCdG4pO1xyXG4gICAgICAgICAgaXRlbXMucHVzaChzZWFyY2hQYW5lbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQpIHtcclxuICAgICAgICAgIGNvbnN0IGNvbHVtbkNob29zZXJCdG4gPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gJ2NvbHVtbkNob29zZXJCdXR0b24nKVswXTtcclxuICAgICAgICAgIGNvbnN0IGNvbHVtbnRDaG9vc2VyQnRuSW5kZXggPSBpdGVtcy5pbmRleE9mKGNvbHVtbkNob29zZXJCdG4pO1xyXG5cclxuICAgICAgICAgIGNvbnN0IHNob3dEYXRhSXRlbSA9IHtcclxuICAgICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgJGNvbnRhaW5lciA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAgICAgLmNzcyh7XHJcbiAgICAgICAgICAgICAgICAgIGJvcmRlcjogJzFweCAjZTBlMGUwIHNvbGlkJyxcclxuICAgICAgICAgICAgICAgICAgcGFkZGluZzogJzNweCA2cHgnLFxyXG4gICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICc0cHgnLFxyXG4gICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAnd2hpdGUnLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICQoJzxzcGFuIC8+JylcclxuICAgICAgICAgICAgICAgIC5jc3MoeyBtYXJnaW46ICcwIDVweCAwIDAnLCB3aWR0aDogJzU0cHgnIH0pXHJcbiAgICAgICAgICAgICAgICAuZHhTd2l0Y2goe1xyXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5zaG93QWxsRGF0YUluRWRpdCxcclxuICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6ICh7IHZhbHVlIH0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dBbGxEYXRhSW5FZGl0ID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkLm9wdGlvbignZGF0YVNvdXJjZScsIHRoaXMuY3JlYXRlRGF0YVNvdXJjZSh0aGlzLnJlcG9ydFBhcmFtcywgdGhpcy5jdXJyZW50R3JpZE1vZGUsIHRoaXMuc2hvd0FsbERhdGFJbkVkaXQpKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWQucmVmcmVzaCgpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgICAkKCc8c3BhbiAvPicpLnRleHQoJ1Nob3cgYWxsIGRhdGEgJykuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0ICRoaW50VGFyZ2V0ID0gJCgnPGEgLz4nKVxyXG4gICAgICAgICAgICAgICAgLmNzcyh7IHRleHREZWNvcmF0aW9uOiAndW5kZXJsaW5lJywgY29sb3I6ICdibHVlJyB9KVxyXG4gICAgICAgICAgICAgICAgLnRleHQoJyg/KScpXHJcbiAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICAgICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAgICAgLnRleHQoYElmIHRoZSB0YWJsZSBjb250YWlucyBhIGxvdCBvZiBjb2x1bW5zIHNob3dpbmcgYWxsIGRhdGEgY2FuIGxlYWQgdG8gc2xvdyBwYWdlIHBlcmZvcm1hbmNlIHdoZW4geW91J3JlIGVkaXRpbmcgdGhlIGdyaWQuXHJcbkJ5IGRlZmF1bHQgZ3JpZCBzaG93cyBvbmx5IGZpcnN0IDEwIHJvd3MgaW4gdGhlIEVkaXQgbW9kZS5gKVxyXG4gICAgICAgICAgICAgICAgLmR4UG9wb3Zlcih7XHJcbiAgICAgICAgICAgICAgICAgIHRhcmdldDogJGhpbnRUYXJnZXQsXHJcbiAgICAgICAgICAgICAgICAgIHNob3dFdmVudDogJ21vdXNlZW50ZXInLFxyXG4gICAgICAgICAgICAgICAgICBoaWRlRXZlbnQ6ICdtb3VzZWxlYXZlJyxcclxuICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICd0b3AnLFxyXG4gICAgICAgICAgICAgICAgICB3aWR0aDogNTAwXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gJGNvbnRhaW5lcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW07XHJcblxyXG4gICAgICAgICAgY29uc3Qgc3dpdGNoVG9WaWV3QnRuID0ge1xyXG4gICAgICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ1N3aXRjaCB0byBWaWV3IE1vZGUnLFxyXG4gICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHRoaXMuc3dpdGNoVG9Nb2RlKEdyaWRNb2RlLlZpZXcpLFxyXG4gICAgICAgICAgICAgIGljb246ICdzd2l0Y2gtdG8tdmlldy1tb2RlJyxcclxuICAgICAgICAgICAgICBlbGVtZW50QXR0cjoge2NsYXNzOiAnaXN6b2xlYS1tZCd9XHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtO1xyXG5cclxuICAgICAgICAgIGl0ZW1zLnNwbGljZShjb2x1bW50Q2hvb3NlckJ0bkluZGV4LCAxKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBleHBvcnRCdG4gPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gJ2V4cG9ydEJ1dHRvbicpWzBdO1xyXG4gICAgICAgICAgY29uc3QgZXhwb3J0QnRuSW5kZXggPSBpdGVtcy5pbmRleE9mKGV4cG9ydEJ0bik7XHJcblxyXG4gICAgICAgICAgaXRlbXMuc3BsaWNlKGV4cG9ydEJ0bkluZGV4LCAxKTtcclxuXHJcbiAgICAgICAgICBpdGVtcy5wdXNoKHNob3dEYXRhSXRlbSk7XHJcbiAgICAgICAgICBpdGVtcy5wdXNoKHN3aXRjaFRvVmlld0J0bik7XHJcbiAgICAgICAgICBpdGVtcy5wdXNoKGNvbHVtbkNob29zZXJCdG4pO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGVkaXRTdGF0dXMgPSB7XHJcbiAgICAgICAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLiRncmlkU3RhdGVJbmRpY2F0b3IgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnZWRpdC1ncmlkLXN0YXRlJyk7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlR3JpZFN0YXRlSW5kaWNhdG9yKEdSSURfSU5ESUNBVE9SX1NUQVRFLmVkaXQpO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kZ3JpZFN0YXRlSW5kaWNhdG9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbTtcclxuXHJcbiAgICAgICAgICBpdGVtcy51bnNoaWZ0KGVkaXRTdGF0dXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYWRkUmVmcmVzaEJ1dHRvbikge1xyXG4gICAgICAgICAgY29uc3QgcmVmcmVzaEJ0biA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5uYW1lID09PSAncmVmcmVzaCcpWzBdO1xyXG4gICAgICAgICAgY29uc3QgcmVmcmVzaEJ0bkluZGV4ID0gaXRlbXMuaW5kZXhPZihyZWZyZXNoQnRuKTtcclxuXHJcbiAgICAgICAgICBpdGVtc1tyZWZyZXNoQnRuSW5kZXhdID0ge1xyXG4gICAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCAkY29udGFpbmVyID0gJCgnPGRpdiAvPicpO1xyXG4gICAgICAgICAgICAgIHRoaXMucmVmcmVzaEJ1dHRvbiA9IG5ldyBSZWZyZXNoQnV0dG9uKCRjb250YWluZXIsICgpID0+IHRoaXMucmVmcmVzaCgpKTtcclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuICRjb250YWluZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25DZWxsUHJlcGFyZWQ6ICh7IHJvd1R5cGUsIGNvbHVtbiwgY2VsbEVsZW1lbnQgfSkgPT4ge1xyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgaWYgKHJvd1R5cGUgPT09ICdoZWFkZXInICYmICFjb2x1bW4uY29tbWFuZCkge1xyXG4gICAgICAgICAgY29uc3QgZGF0YUZpZWxkID0gY29sdW1uLmRhdGFGaWVsZDtcclxuICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxTZXR0aW5ncyA9IHRoaXMuZ3JpZFN0YXRlTWFuYWdlci5nZXRDb2x1bW5BZGRpdGlvbmFsU2V0dGluZ3MoZGF0YUZpZWxkKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmluaXRHcmlkSGVhZGVyQ2VsbChjZWxsRWxlbWVudCwgYWRkaXRpb25hbFNldHRpbmdzKTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0R3JpZEhlYWRlckNlbGxFZGl0UGFuZWwoY29sdW1uLCBjZWxsRWxlbWVudCwgYWRkaXRpb25hbFNldHRpbmdzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBvbkNvbnRlbnRSZWFkeTogKGUpID0+IHtcclxuICAgICAgICBjb25zdCBjdXJyZW50R3JpZCA9IGUuY29tcG9uZW50O1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZTogSUdyaWRTdGF0ZSA9IGN1cnJlbnRHcmlkLnN0YXRlKCk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5jb2x1bW5OYW1lc1VwZGF0ZWQpIHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlQ29sdW1uTmFtaW5nKGN1cnJlbnRTdGF0ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIE5PVEU6IGNvbHVtbiBuYW1lIHVwZGF0aW5nIHRyaWdnZXJzIG9uQ29udGVudFJlYWR5IGV2ZW50IHJhaXNpbmcgYWdhaW4uXHJcbiAgICAgICAgICAvLyBXZSBuZWVkIG5vdCB0byBleGV1Y3V0ZSB0aGUgc2FtZSBvbmUgbW9yZSB0aW1lLlxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4gY3VycmVudEdyaWQuZW5kQ3VzdG9tTG9hZGluZygpKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlICE9PSBHcmlkTW9kZS5FZGl0KSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBuZXdDb2x1bW5zID0gdGhpcy5ncmlkU3RhdGVNYW5hZ2VyLmNoZWNrTmV3Q29sdW1ucyhjdXJyZW50U3RhdGUpO1xyXG5cclxuICAgICAgICBuZXdDb2x1bW5zLmZvckVhY2goKGNvbHVtbk5hbWUpID0+IGUuY29tcG9uZW50LmNvbHVtbk9wdGlvbihjb2x1bW5OYW1lLCAndmlzaWJsZScsIGZhbHNlKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbHVtbkNhcHRpb25zID0gdGhpcy5ncmlkU3RhdGVNYW5hZ2VyLmdldENvbHVtbkNhcHRpb25zKCk7XHJcblxyXG4gICAgICAgIGNvbHVtbkNhcHRpb25zLmZvckVhY2goKGMpID0+IHtcclxuICAgICAgICAgIGlmIChjLmNhcHRpb24gJiYgY3VycmVudEdyaWQuY29sdW1uT3B0aW9uKGMuZGF0YUZpZWxkLCAnY2FwdGlvbicpICE9PSBjLmNhcHRpb24pIHtcclxuICAgICAgICAgICAgY3VycmVudEdyaWQuY29sdW1uT3B0aW9uKGMuZGF0YUZpZWxkLCAnY2FwdGlvbicsIGMuY2FwdGlvbik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIHN0YXRlU3RvcmluZzoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgdHlwZTogJ2N1c3RvbScsXHJcbiAgICAgICAgY3VzdG9tTG9hZDogKCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZFN0YXRlTWFuYWdlci5sb2FkKHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0LCAob3V0ZGF0ZWRDb2x1bW5zKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5ncmlkLnN0YXRlKCk7XHJcblxyXG4gICAgICAgICAgICBzdGF0ZS5jb2x1bW5zID0gKHN0YXRlLmNvbHVtbnMgYXMgYW55W10pLmZpbHRlcigoY29sdW1uKSA9PiBvdXRkYXRlZENvbHVtbnMuaW5kZXhPZihjb2x1bW4uZGF0YUZpZWxkKSA8IDApO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5ncmlkLnN0YXRlKHN0YXRlKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY3VzdG9tU2F2ZTogKHN0YXRlKSA9PiB0aGlzLnNhdmVHcmlkU3RhdGUoc3RhdGUpXHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBmaWx0ZXJSb3c6IHsgdmlzaWJsZTogdGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLlZpZXcsIGFwcGx5RmlsdGVyOiAnb25DbGljaycgfSxcclxuICAgICAgaGVhZGVyRmlsdGVyOiB7IHZpc2libGU6IHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5WaWV3IH0sXHJcbiAgICAgIHNlYXJjaFBhbmVsOiB7IHZpc2libGU6IHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5WaWV3IH0sXHJcbiAgICAgIGVycm9yUm93RW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIGFsbG93Q29sdW1uUmVzaXppbmc6IHRydWUsXHJcbiAgICAgIHNvcnRpbmc6IHsgbW9kZTogJ211bHRpcGxlJyB9LFxyXG4gICAgICBncm91cFBhbmVsOiB7IHZpc2libGU6IHRydWUgfSxcclxuICAgICAgZ3JvdXBpbmc6IHsgYXV0b0V4cGFuZEFsbDogZmFsc2UgfSxcclxuICAgICAgYWxsb3dDb2x1bW5SZW9yZGVyaW5nOiB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCxcclxuICAgICAgY29sdW1uQ2hvb3NlcjogeyBlbmFibGVkOiB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCB9LFxyXG4gICAgICBzaG93Q29sdW1uSGVhZGVyczogdHJ1ZSxcclxuICAgICAga2V5Ym9hcmROYXZpZ2F0aW9uOiB7ZW5hYmxlZDogZmFsc2V9LFxyXG5cclxuICAgICAgc2hvd0JvcmRlcnM6IHRydWUsXHJcbiAgICAgIHBhZ2luZzogeyBwYWdlU2l6ZTogNTAsIGVuYWJsZWQ6IHRydWUgfSxcclxuICAgICAgcmVtb3RlT3BlcmF0aW9uczogdHJ1ZSxcclxuXHJcbiAgICAgIHN1bW1hcnk6IHRoaXMucmVwb3J0UGFyYW1zLlRvdGFsU3VtbWFyeUNvbHVtbiA/IHtcclxuICAgICAgICB0b3RhbEl0ZW1zOiBbe1xyXG4gICAgICAgICAgY29sdW1uOiB0aGlzLnJlcG9ydFBhcmFtcy5Ub3RhbFN1bW1hcnlDb2x1bW4sXHJcbiAgICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xyXG4gICAgICAgIH1dXHJcbiAgICAgIH0gOiB1bmRlZmluZWQsXHJcblxyXG4gICAgICBvbkVkaXRvclByZXBhcmluZyhlKSB7XHJcbiAgICAgICAgaWYgKGUucGFyZW50VHlwZSA9PT0gJ2ZpbHRlclJvdycpIHtcclxuICAgICAgICAgIGNvbnN0IGFwcGx5ID0gKCkgPT4gZS5lbGVtZW50LmZpbmQoJy5keC1hcHBseS1idXR0b24nKS50cmlnZ2VyKCdkeGNsaWNrJyk7XHJcblxyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uRW50ZXJLZXkgPSBhcHBseTtcclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vbkZvY3VzT3V0ID0gYXBwbHk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChlLnBhcmVudFR5cGUgPT09ICdzZWFyY2hQYW5lbCcpIHtcclxuICAgICAgICAgIGNvbnN0IGFwcGx5U2VhcmNoOiBEZXZFeHByZXNzLnVpLmR4VGV4dEVkaXRvci5Qcm9wZXJ0aWVzWydvbkVudGVyS2V5J10gPSAoYXJncykgPT4ge1xyXG4gICAgICAgICAgICBlLmNvbXBvbmVudC5zZWFyY2hCeVRleHQoYXJncy5jb21wb25lbnQub3B0aW9uKCd2YWx1ZScpKTtcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uVmFsdWVDaGFuZ2VkID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uRW50ZXJLZXkgPSBhcHBseVNlYXJjaDtcclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vbkZvY3VzT3V0ID0gYXBwbHlTZWFyY2g7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZ3JpZCA9IGRlZmF1bHRHcmlkKHRoaXMuJGdyaWRUYXJnZXRFbGVtZW50LCB7XHJcbiAgICAgIG9wdGlvbnM6IGdyaWRPcHRpb25zLFxyXG4gICAgICBleHBvcnRGaWxlTmFtZTogdGhpcy5yZXBvcnRQYXJhbXMuTmFtZSxcclxuICAgICAgdGl0bGU6IHRoaXMuc2hvd0hlYWRlciA/IHRoaXMucmVwb3J0UGFyYW1zLk5hbWUgOiBudWxsLFxyXG4gICAgICBoZWFkZXJEZXNjcmlwdGlvbjogdGhpcy5zaG93SGVhZGVyID8gdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyA6IG51bGxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuJHJlc2V0U2V0dGluZ1RhcmdldEVsZW1lbnQ/LnJlbW92ZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCkge1xyXG4gICAgICB0aGlzLiRyZXNldFNldHRpbmdUYXJnZXRFbGVtZW50ID0gJCgnPHNwYW4gLz4nKVxyXG4gICAgICAgIC5jc3Moe1xyXG4gICAgICAgICAgZmxvYXQ6ICdyaWdodCcsXHJcbiAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcclxuICAgICAgICAgIGJvdHRvbTogJzhweCdcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5hZGRDbGFzcygnaXN6b2xlYS1tZCcpXHJcbiAgICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICAgIHRleHQ6ICdSZXNldCBzZXR0aW5ncycsXHJcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB0aGlzLnJlc2V0U2V0dGluZ3MoKSxcclxuICAgICAgICAgIGljb246ICdyZXNldC1ncmlkLXNldHRpbmdzJ1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmFwcGVuZFRvKCdmb290ZXInKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5ncmlkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVHcmlkU3RhdGVJbmRpY2F0b3Ioc3RhdGU6IHN0cmluZykge1xyXG4gICAgT2JqZWN0LmtleXMoR1JJRF9JTkRJQ0FUT1JfU1RBVEUpLmZvckVhY2goKHMpID0+IHRoaXMuJGdyaWRTdGF0ZUluZGljYXRvci5yZW1vdmVDbGFzcyhHUklEX0lORElDQVRPUl9TVEFURVtzXSkpO1xyXG5cclxuICAgIHRoaXMuJGdyaWRTdGF0ZUluZGljYXRvci5hZGRDbGFzcyhzdGF0ZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuZ3JpZFN0YXRlSW5kaWNhdG9yVGltZW91dCkge1xyXG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZ3JpZFN0YXRlSW5kaWNhdG9yVGltZW91dCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN0YXRlID09PSBHUklEX0lORElDQVRPUl9TVEFURS5zYXZlZCkge1xyXG4gICAgICB0aGlzLmdyaWRTdGF0ZUluZGljYXRvclRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVHcmlkU3RhdGVJbmRpY2F0b3IoR1JJRF9JTkRJQ0FUT1JfU1RBVEUuZWRpdCk7XHJcbiAgICAgIH0sIFJFU0VUX1NBVkVEX0lORElDQVRPUl9USU1FT1VUKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgdGl0bGUgPSAnJztcclxuXHJcbiAgICBzd2l0Y2ggKHN0YXRlKSB7XHJcbiAgICAgIGNhc2UgR1JJRF9JTkRJQ0FUT1JfU1RBVEUuZWRpdDpcclxuICAgICAgICB0aXRsZSA9ICdFZGl0IG1vZGUnO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBHUklEX0lORElDQVRPUl9TVEFURS5zYXZlZDpcclxuICAgICAgICB0aXRsZSA9ICdTYXZlZCc7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEdSSURfSU5ESUNBVE9SX1NUQVRFLnNhdmluZzpcclxuICAgICAgICB0aXRsZSA9ICdTYXZpbmcnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuJGdyaWRTdGF0ZUluZGljYXRvci5hdHRyKCd0aXRsZScsIHRpdGxlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQ29sdW1uTmFtaW5nKHN0YXRlOiBJR3JpZFN0YXRlKSB7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGhcclxuICAgIC8vIEhBQ0s6IERldkV4dHJlbWUgZ3JpZCBkb2Vzbid0IHNob3cgY29sdW1ucyBkYXRhIGlmIGEgZGF0YUZpZWxkIGhhcyBzcGVjaWFsIHN5bWJvbHMuXHJcbiAgICAvLyBTZWUgaHR0cHM6Ly93d3cuZGV2ZXhwcmVzcy5jb20vU3VwcG9ydC9DZW50ZXIvUXVlc3Rpb24vRGV0YWlscy9UNjIxODM4L2R4ZGF0YWdyaWQtYS1jb2x1bW4taXMtZW1wdHktaWYtZGF0YWZpZWxkLWNvbnRhaW5zLXNwZWNpYWwtY2hhcmFjdGVyc1xyXG4gICAgLy8gdHNsaW50OmVuYWJsZTptYXgtbGluZS1sZW5ndGhcclxuICAgIGlmIChzdGF0ZS5jb2x1bW5zKSB7XHJcbiAgICAgIHN0YXRlLmNvbHVtbnMuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgIGlmICgvW15hLXpBLVowLTlfXS8udGVzdChjLmRhdGFGaWVsZCkpIHtcclxuICAgICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5PcHRpb24oYy5kYXRhRmllbGQsICdjYWxjdWxhdGVDZWxsVmFsdWUnLCAocm93RGF0YSkgPT4gcm93RGF0YVtjLmRhdGFGaWVsZF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb2x1bW5OYW1lc1VwZGF0ZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1zaGFkb3dlZC12YXJpYWJsZVxyXG4gIHByaXZhdGUgY3JlYXRlRGF0YVNvdXJjZShyZXBvcnRQYXJhbXNEYXRhU291cmNlOiBJUmVwb3J0UGFyYW1zLCBncmlkTW9kZTogR3JpZE1vZGUsIHNob3dBbGxEYXRhSW5FZGl0RGF0YVNvdXJjZTogYm9vbGVhbikge1xyXG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLmRhdGFMYXllci5nZXRHcmlkRGF0YVNvdXJjZShyZXBvcnRQYXJhbXNEYXRhU291cmNlLCBncmlkTW9kZSwgc2hvd0FsbERhdGFJbkVkaXREYXRhU291cmNlKTtcclxuICAgIGNvbnN0IGRzID0gbmV3IERldkV4cHJlc3MuZGF0YS5EYXRhU291cmNlKHtcclxuICAgICAgc3RvcmUsXHJcbiAgICAgIG9uQ2hhbmdlZDogZ3JpZE1vZGUgPT09IEdyaWRNb2RlLlZpZXcgPyB2b2lkIDAgOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5OYW1lc1VwZGF0ZWQgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgICAgb25Mb2FkRXJyb3I6IChlKSA9PiB7XHJcbiAgICAgICAgaWYgKCFkcy5pc0xvYWRlZCgpKSB7XHJcbiAgICAgICAgICB0aGlzLiRncmlkRXJyb3JQbGFjZWhvbGRlci5zaG93KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmdyaWQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG4gICAgICB9LFxyXG4gICAgICBvbkxvYWRpbmdDaGFuZ2VkOiAoaXNMb2FkaW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzTG9hZGluZykge1xyXG4gICAgICAgICAgdGhpcy4kZ3JpZEVycm9yUGxhY2Vob2xkZXIuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ1BsZWFzZSB3YWl0LCBkYXRhIGxvYWRpbmcgaW4gcHJvZ3Jlc3MuJyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIDEwMDAwKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHRoaXMubG9hZGluZ1RpbWVvdXQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubG9hZGluZ1RpbWVvdXQpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdUaW1lb3V0ID0gbnVsbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZ3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gZHM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0U2V0dGluZ3MoKSB7XHJcbiAgICBEZXZFeHByZXNzLnVpLmRpYWxvZy5jb25maXJtKCdSZXNldCBncmlkIHNldHRpbmdzIHRvIGRlZmF1bHQgdmFsdWVzPycsICdSZXNldCB0byBkZWZhdWx0PycpXHJcbiAgICAgIC50aGVuKChyZXMpID0+IHtcclxuICAgICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgICB0aGlzLmdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdMb2FkaW5nJyk7XHJcbiAgICAgICAgICB0aGlzLmdyaWRTdGF0ZU1hbmFnZXJcclxuICAgICAgICAgICAgLnJlc2V0U2V0dGluZ3MoKVxyXG4gICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JpZC5zdGF0ZShkYXRhKTtcclxuICAgICAgICAgICAgICB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgdGhpcy5jcmVhdGVEYXRhU291cmNlKHRoaXMucmVwb3J0UGFyYW1zLCB0aGlzLmN1cnJlbnRHcmlkTW9kZSwgdGhpcy5zaG93QWxsRGF0YUluRWRpdCkpO1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JpZC5yZWZyZXNoKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN3aXRjaFRvTW9kZShtb2RlOiBHcmlkTW9kZSkge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBtb2RlIHx8IG1vZGUgPT09IEdyaWRNb2RlLkVkaXQgJiYgIXRoaXMuYWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9IG1vZGU7XHJcblxyXG4gICAgY29uc3QgY3VycmVudFN1bW1hcnlDb2x1bW4gPSB0aGlzLmdyaWQub3B0aW9uKCdzdW1tYXJ5LnRvdGFsSXRlbXNbMF0uY29sdW1uJykgYXMgc3RyaW5nO1xyXG5cclxuICAgIGNvbnN0IG5ld1JlcG9ydFBhcmFtcyA9IHtcclxuICAgICAgLi4udGhpcy5yZXBvcnRQYXJhbXMsXHJcbiAgICAgIFRvdGFsU3VtbWFyeUNvbHVtbjogY3VycmVudFN1bW1hcnlDb2x1bW4gPyBjdXJyZW50U3VtbWFyeUNvbHVtbiA6IHRoaXMucmVwb3J0UGFyYW1zLlRvdGFsU3VtbWFyeUNvbHVtblxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG5ld1JlcG9ydFBhcmFtcztcclxuXHJcbiAgICB0aGlzLmdyaWQuZGlzcG9zZSgpO1xyXG4gICAgdGhpcy4kZ3JpZFRhcmdldEVsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB0aGlzLmdyaWQgPSB0aGlzLmluaXRJbnRlcm5hbCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzYXZlR3JpZFN0YXRlKHN0YXRlKSB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50R3JpZE1vZGUgIT09IEdyaWRNb2RlLkVkaXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29sdW1uTmFtZXNVcGRhdGVkID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3Qgd2lkdGhzID0gdGhpcy5ncmlkU3RhdGVNYW5hZ2VyLnNhdmUoc3RhdGUsXHJcbiAgICAgICgpID0+IHRoaXMudXBkYXRlR3JpZFN0YXRlSW5kaWNhdG9yKEdSSURfSU5ESUNBVE9SX1NUQVRFLnNhdmluZyksXHJcbiAgICAgICgpID0+IHRoaXMudXBkYXRlR3JpZFN0YXRlSW5kaWNhdG9yKEdSSURfSU5ESUNBVE9SX1NUQVRFLnNhdmVkKSk7XHJcblxyXG4gICAgaWYgKHdpZHRocykge1xyXG4gICAgICBPYmplY3Qua2V5cyh3aWR0aHMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGVkaXRXaWR0aEJveCA9IHRoaXMuZWRpdFdpZHRoRWRpdEJveGVzW2tleV07XHJcblxyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gd2lkdGhzW2tleV0gPT09ICdpbmhlcml0JyA/ICcnIDogd2lkdGhzW2tleV07XHJcblxyXG4gICAgICAgIGlmIChlZGl0V2lkdGhCb3ggJiYgZWRpdFdpZHRoQm94Lm9wdGlvbigndmFsdWUnKSAhPT0gdmFsdWUpIHtcclxuICAgICAgICAgIGVkaXRXaWR0aEJveC5vcHRpb24oJ3ZhbHVlJywgdmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRHcmlkSGVhZGVyQ2VsbEVkaXRQYW5lbChcclxuICAgIGNvbHVtbjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uLFxyXG4gICAgJGNlbGw6IEpRdWVyeSxcclxuICAgIGFkZGl0aW9uYWxTZXR0aW5nczogSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGVcclxuICApIHtcclxuICAgIGNvbnN0IGRhdGFGaWVsZCA9IGNvbHVtbi5kYXRhRmllbGQ7XHJcbiAgICBjb25zdCAkY29sdW1uQ2FwdGlvbkVsID0gJGNlbGwuZmluZCgnLmR4LWRhdGFncmlkLXRleHQtY29udGVudCcpO1xyXG4gICAgY29uc3QgJGVkaXRvckFyZWEgPSAkKCc8c3BhbiAvPicpLmFkZENsYXNzKCdjb2x1bW4tZWRpdG9yLWFyZWEnKS5pbnNlcnRBZnRlcigkY29sdW1uQ2FwdGlvbkVsKTtcclxuXHJcbiAgICAkY29sdW1uQ2FwdGlvbkVsLmNzcygnbWF4V2lkdGgnLCAnNTUlJyk7XHJcblxyXG4gICAgY29uc3QgJGVkaXRUeXBlUGFuZWwgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgLmFkZENsYXNzKCdlZGl0LXR5cGUtcGFuZWwnKVxyXG4gICAgICAud2lkdGgoJzEwMCUnKVxyXG4gICAgICAuYXBwZW5kVG8oJGNlbGwpO1xyXG5cclxuICAgIGNvbnN0ICRlZGl0V2lkdGhQYW5lbCA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2VkaXQtd2lkdGgtcGFuZWwnKVxyXG4gICAgICAud2lkdGgoJzEwMCUnKVxyXG4gICAgICAuYXBwZW5kVG8oJGNlbGwpO1xyXG5cclxuICAgICRlZGl0VHlwZVBhbmVsWzBdLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgY29uc3Qgc2VsZWN0Qm94ID0gJGVkaXRUeXBlQm94LmR4U2VsZWN0Qm94KCdpbnN0YW5jZScpO1xyXG5cclxuICAgICAgaWYgKHNlbGVjdEJveC5vcHRpb24oJ29wZW5lZCcpKSB7XHJcbiAgICAgICAgc2VsZWN0Qm94LmNsb3NlKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2VsZWN0Qm94Lm9wZW4oKTtcclxuICAgICAgfVxyXG4gICAgfSwgdHJ1ZSk7XHJcblxyXG4gICAgbGV0IGxhc3RDYXB0aW9uVmFsdWUgPSBjb2x1bW4uY2FwdGlvbjtcclxuXHJcbiAgICBjb25zdCAkZWRpdENhcHRpb25CdG4gPSAkKCc8c3BhbiAvPicpLmR4QnV0dG9uKHtcclxuICAgICAgaGludDogJ0VkaXQgY29sdW1uIGNhcHRpb24nLFxyXG4gICAgICB0ZW1wbGF0ZTogKGRhdGEsICRjb250ZW50KSA9PiAkY29udGVudC5hcHBlbmQoJCgnPHNwYW4gLz4nKS5hZGRDbGFzcygnZWRpdC1jYXB0aW9uLWJ0bicpKSxcclxuICAgICAgb25DbGljazogKHsgZXZlbnQgfSkgPT4ge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICRjb2x1bW5DYXB0aW9uRWwuaGlkZSgpO1xyXG4gICAgICAgICRlZGl0Q2FwdGlvbkJ0bi5oaWRlKCk7XHJcbiAgICAgICAgJGVkaXRUb29sdGlwQnRuLmhpZGUoKTtcclxuXHJcbiAgICAgICAgY29uc3QgJGVkaXQgPSAkKCc8c3BhbiAvPicpLmR4VGV4dEJveCh7XHJcbiAgICAgICAgICB2YWx1ZTogbGFzdENhcHRpb25WYWx1ZSxcclxuICAgICAgICAgIGVsZW1lbnRBdHRyOiB7IGNsYXNzOiAnY2FwdGlvbi1lZGl0b3InIH0sXHJcbiAgICAgICAgICBvbkVudGVyS2V5OiAoZSkgPT4ge1xyXG4gICAgICAgICAgICBlZGl0QnRuLmJsdXIoKTtcclxuICAgICAgICAgICAgZS5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBvbktleURvd246IChlKSA9PiB7XHJcbiAgICAgICAgICAgIGUuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25Gb2N1c091dDogKGUpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBlZGl0QnRuLm9wdGlvbigndmFsdWUnKTtcclxuXHJcbiAgICAgICAgICAgICRlZGl0LnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAkY29sdW1uQ2FwdGlvbkVsLnRleHQobmV3VmFsdWUpLnNob3coKTtcclxuICAgICAgICAgICAgJGVkaXRDYXB0aW9uQnRuLnNob3coKTtcclxuICAgICAgICAgICAgJGVkaXRUb29sdGlwQnRuLnNob3coKTtcclxuXHJcbiAgICAgICAgICAgIGxhc3RDYXB0aW9uVmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5ncmlkU3RhdGVNYW5hZ2VyLnNldENvbHVtbkNhcHRpb24oZGF0YUZpZWxkLCBuZXdWYWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZUdyaWRTdGF0ZSh0aGlzLmdyaWQuc3RhdGUoKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtc20nKVxyXG4gICAgICAgICAgLmFwcGVuZFRvKCRlZGl0b3JBcmVhKVxyXG4gICAgICAgICAgLm9uKCdjbGljaycsIChlKSA9PiB7XHJcbiAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBlZGl0QnRuID0gJGVkaXQuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG5cclxuICAgICAgICBlZGl0QnRuLmZvY3VzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pLmluc2VydEFmdGVyKCRjb2x1bW5DYXB0aW9uRWwpO1xyXG5cclxuICAgIGNvbnN0ICRlZGl0VG9vbHRpcEJ0biA9ICQoJzxzcGFuIC8+JykuZHhCdXR0b24oe1xyXG4gICAgICBoaW50OiAnRWRpdCBjb2x1bW4gdG9vbHRpcCcsXHJcbiAgICAgIHRlbXBsYXRlOiAoZGF0YSwgJGNvbnRlbnQpID0+ICRjb250ZW50LmFwcGVuZCgkKCc8c3BhbiAvPicpLmFkZENsYXNzKCdlZGl0LXRvb2x0aXAtYnRuJykpLFxyXG4gICAgICBvbkNsaWNrOiAoeyBldmVudCB9KSA9PiB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgJGNvbHVtbkNhcHRpb25FbC5oaWRlKCk7XHJcbiAgICAgICAgJGVkaXRDYXB0aW9uQnRuLmhpZGUoKTtcclxuICAgICAgICAkZWRpdFRvb2x0aXBCdG4uaGlkZSgpO1xyXG5cclxuICAgICAgICBjb25zdCAkZWRpdCA9ICQoJzxzcGFuIC8+JykuZHhUZXh0Qm94KHtcclxuICAgICAgICAgIHZhbHVlOiBhZGRpdGlvbmFsU2V0dGluZ3MgJiYgYWRkaXRpb25hbFNldHRpbmdzLnRvb2x0aXAsXHJcbiAgICAgICAgICB0ZXh0OiBhZGRpdGlvbmFsU2V0dGluZ3MgJiYgYWRkaXRpb25hbFNldHRpbmdzLnRvb2x0aXAsXHJcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJ0VudGVyIGNvbHVtbiB0b29sdGlwLi4uJyxcclxuICAgICAgICAgIG9uRW50ZXJLZXk6IChlKSA9PiB7XHJcbiAgICAgICAgICAgIGVkaXRCdG4uYmx1cigpO1xyXG4gICAgICAgICAgICBlLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9uS2V5RG93bjogKGUpID0+IHtcclxuICAgICAgICAgICAgZS5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBvbkZvY3VzT3V0OiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gZWRpdEJ0bi5vcHRpb24oJ3ZhbHVlJyk7XHJcblxyXG4gICAgICAgICAgICAkZWRpdC5yZW1vdmUoKTtcclxuICAgICAgICAgICAgJGNvbHVtbkNhcHRpb25FbC5zaG93KCk7XHJcbiAgICAgICAgICAgICRlZGl0Q2FwdGlvbkJ0bi5zaG93KCk7XHJcbiAgICAgICAgICAgICRlZGl0VG9vbHRpcEJ0bi5zaG93KCk7XHJcblxyXG4gICAgICAgICAgICBhZGRpdGlvbmFsU2V0dGluZ3MudG9vbHRpcCA9IG5ld1ZhbHVlO1xyXG4gICAgICAgICAgICAkY2VsbC5hdHRyKCd0aXRsZScsIG5ld1ZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5zYXZlR3JpZFN0YXRlKHRoaXMuZ3JpZC5zdGF0ZSgpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1zbScpXHJcbiAgICAgICAgICAuYXBwZW5kVG8oJGVkaXRvckFyZWEpXHJcbiAgICAgICAgICAub24oJ2NsaWNrJywgKGUpID0+IHtcclxuICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGVkaXRCdG4gPSAkZWRpdC5keFRleHRCb3goJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgICAgIGVkaXRCdG4uZm9jdXMoKTtcclxuICAgICAgfVxyXG4gICAgfSkuaW5zZXJ0QWZ0ZXIoJGVkaXRDYXB0aW9uQnRuKTtcclxuXHJcbiAgICBjb25zdCAkZWRpdFR5cGVCb3ggPSAkKCc8c3BhbiAvPicpLmR4U2VsZWN0Qm94KHtcclxuICAgICAgZGF0YVNvdXJjZTogZ3JpZENvbHVtblR5cGVzLFxyXG4gICAgICB2YWx1ZTogY29sdW1uLmRhdGFUeXBlIHx8IEdyaWREYXRhQ29sdW1uRGF0YVR5cGUuRGVmYXVsdCxcclxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgY29sdW1uIHR5cGUuLi4nLFxyXG4gICAgICBvblZhbHVlQ2hhbmdlZDogKHsgdmFsdWUgfSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5PcHRpb24oZGF0YUZpZWxkLCAnZGF0YVR5cGUnLCB2YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLXNtJykuYXBwZW5kVG8oJGVkaXRUeXBlUGFuZWwpO1xyXG5cclxuICAgIGxldCBwcmV2VmFsdWUgPSAhIWNvbHVtbi53aWR0aCA/IGNvbHVtbi53aWR0aC50b1N0cmluZygpIDogJyc7XHJcblxyXG4gICAgY29uc3Qgb25XaWR0aFZhbHVlQ2hhbmdlZCA9IChlKSA9PiB7XHJcbiAgICAgIGxldCBuZXdWYWx1ZSA9IGUuY29tcG9uZW50Lm9wdGlvbigndmFsdWUnKTtcclxuXHJcbiAgICAgIGlmICghbmV3VmFsdWUgfHwgbmV3VmFsdWUgPT09ICdpbmhlcml0Jykge1xyXG4gICAgICAgIG5ld1ZhbHVlID0gJyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghcHJldlZhbHVlIHx8IHByZXZWYWx1ZSA9PT0gJ2luaGVyaXQnKSB7XHJcbiAgICAgICAgcHJldlZhbHVlID0gJyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChuZXdWYWx1ZSAhPT0gcHJldlZhbHVlKSB7XHJcbiAgICAgICAgcHJldlZhbHVlID0gbmV3VmFsdWU7XHJcbiAgICAgICAgdGhpcy5ncmlkLmNvbHVtbk9wdGlvbihkYXRhRmllbGQsICd3aWR0aCcsIG5ld1ZhbHVlIHx8ICdpbmhlcml0Jyk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5ncmlkUmVwYWludFF1ZXVlZCkge1xyXG4gICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmdyaWQucmVwYWludCgpO1xyXG4gICAgICAgICAgICB0aGlzLmdyaWRSZXBhaW50UXVldWVkID0gZmFsc2U7XHJcbiAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgICAgdGhpcy5ncmlkUmVwYWludFF1ZXVlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgJGVkaXRXaWR0aEJveCA9ICQoJzxzcGFuIC8+JykuZHhUZXh0Qm94KHtcclxuICAgICAgdGV4dDogcHJldlZhbHVlID09PSAnaW5oZXJpdCcgPyAnJyA6IHByZXZWYWx1ZSxcclxuICAgICAgcGxhY2Vob2xkZXI6ICdTZXQgd2lkdGguLi4nLFxyXG4gICAgICBvbkVudGVyS2V5OiAoKSA9PiAkZWRpdFdpZHRoQm94LmR4VGV4dEJveCgnaW5zdGFuY2UnKS5ibHVyKCksXHJcbiAgICAgIG9uRm9jdXNPdXQ6IG9uV2lkdGhWYWx1ZUNoYW5nZWQsXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiBvbldpZHRoVmFsdWVDaGFuZ2VkXHJcbiAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1zbScpXHJcbiAgICAgIC5hcHBlbmRUbygkZWRpdFdpZHRoUGFuZWwpXHJcbiAgICAgIC5vbignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLmVkaXRXaWR0aEVkaXRCb3hlc1tjb2x1bW4udmlzaWJsZUluZGV4XSA9ICRlZGl0V2lkdGhCb3guZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0R3JpZEhlYWRlckNlbGwoJGNlbGxFbDogSlF1ZXJ5LCBhZGRpdGlvbmFsU2V0dGluZ3M6IElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlKSB7XHJcbiAgICBjb25zdCAkY29sdW1uQ2FwdGlvbkVsID0gJGNlbGxFbC5maW5kKCcuZHgtZGF0YWdyaWQtdGV4dC1jb250ZW50Jyk7XHJcbiAgICBjb25zdCB0b29sdGlwID0gYWRkaXRpb25hbFNldHRpbmdzICYmIGFkZGl0aW9uYWxTZXR0aW5ncy50b29sdGlwO1xyXG4gICAgY29uc3QgY2FwdGlvbiA9IGFkZGl0aW9uYWxTZXR0aW5ncyAmJiBhZGRpdGlvbmFsU2V0dGluZ3MuY2FwdGlvbjtcclxuXHJcbiAgICAkY2VsbEVsLmF0dHIoJ3RpdGxlJywgdG9vbHRpcCB8fCB2b2lkIDApO1xyXG5cclxuICAgIGlmIChjYXB0aW9uKSB7XHJcbiAgICAgICRjb2x1bW5DYXB0aW9uRWwudGV4dChjYXB0aW9uKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmludGVyZmFjZSBJR2F1Z2VTdWJ2YWx1ZXNPcHRpb25zIHtcclxuICBzdWJ2YWx1ZXM6IElTdWJ2YWx1ZU9wdGlvbnNbXTtcclxuICB0eXBlOiBzdHJpbmc7XHJcbiAgd2lkdGg6IG51bWJlcjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElTdWJ2YWx1ZU9wdGlvbnMge1xyXG4gIGtleTogbnVtYmVyO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBpc0JvdW5kOiBib29sZWFuO1xyXG4gIG1lYXN1cmVJZDogc3RyaW5nO1xyXG4gIHZhbHVlOiBudW1iZXI7XHJcbiAgY29sb3I6IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XHJcbiAgc3VidmFsdWVzOiBbXSxcclxuICB0eXBlOiAndHJpYW5nbGVNYXJrZXInLFxyXG4gIGNvbG9yOiAnIzg3OThhNScsXHJcbiAgc2Vjb25kQ29sb3I6ICcjZTE4ZTkyJyxcclxuICB3aWR0aDogMTAsXHJcbiAgaXNDdXN0b21QYWxldHRlOiBmYWxzZSxcclxuICBwYWxldHRlOiBudWxsLFxyXG4gIGN1c3RvbVBhbGV0dGU6IFsnIzYxYTU5NScsICdHcmV5JywgJ3JnYigxNTMsIDEwMiwgMjU1KScsICdOYXZ5J11cclxufSBhcyBJR2F1Z2VTdWJ2YWx1ZXNPcHRpb25zO1xyXG5cclxuY29uc3QgQ1NTX0NMQVNTID0gJ2lzb3otc3VidmFsdWVFZGl0b3JGb3JtR3JvdXAnO1xyXG5jb25zdCBOQU1FX0lURU1fQ1NTX0NMQVNTID0gYCR7Q1NTX0NMQVNTfV9fbmFtZWA7XHJcbmNvbnN0IElTX0JPVU5EX0lURU1fQ1NTX0NMQVNTID0gYCR7Q1NTX0NMQVNTfV9faXMtYm91bmRgO1xyXG5jb25zdCBWQUxVRV9JVEVNX0NTU19DTEFTUyA9IGAke0NTU19DTEFTU31fX3ZhbHVlYDtcclxuY29uc3QgTUVBU1VSRV9JRF9JVEVNX0NTU19DTEFTUyA9IGAke0NTU19DTEFTU31fX21lYXN1cmUtaWRgO1xyXG5jb25zdCBDT0xPUl9JVEVNX0NTU19DTEFTUyA9IGAke0NTU19DTEFTU31fX2NvbG9yYDtcclxuXHJcbmNvbnN0IENJUkNMVUFSX0lORElDQVRPUl9UWVBFUyA9IFsncmVjdGFuZ2xlTmVlZGxlJywgJ3RyaWFuZ2xlTmVlZGxlJywgJ3JhbmdlQmFyJywgJ3RyaWFuZ2xlTWFya2VyJywgJ3RleHRDbG91ZCddO1xyXG5jb25zdCBMSU5FQVJfSU5ESUNBVE9SX1RZUEVTID0gWydyZWN0YW5nbGUnLCAnY2lyY2xlJywgJ3Job21idXMnLCAncmFuZ2VCYXInLCAndHJpYW5nbGVNYXJrZXInLCAndGV4dENsb3VkJ107XHJcblxyXG5jb25zdCBDSVJDVUxBUl9WSUVXX1RZUEVTOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZVZpZXdUeXBlW10gPSBbJ0NpcmN1bGFyRnVsbCcsICdDaXJjdWxhckhhbGYnLCAnQ2lyY3VsYXJRdWFydGVyTGVmdCcsICdDaXJjdWxhclF1YXJ0ZXJSaWdodCcsICdDaXJjdWxhclRocmVlRm91cnRoJ107XHJcbmNvbnN0IExJTkVBUl9WSUVXX1RZUEVTOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZVZpZXdUeXBlW10gPSBbJ0xpbmVhckhvcml6b250YWwnLCAnTGluZWFyVmVydGljYWwnXTtcclxuXHJcbmNvbnN0IERFRkFVTFRfUEFMRVRURSA9IFsnIzFkYjJmNScsICcjZjU1NjRhJywgJyM5N2M5NWMnLCAnI2ZmYzcyMCcsICcjZWIzNTczJywgJyNhNjNkYjgnLCAnIzY1OTNiYycsICcjZmFhMzM1JywgJyNmZjg4N2MnXTtcclxuXHJcbmNvbnN0IFBSRURFRklORURfUEFMRVRURVMgPSBbJ0JyaWdodCcsICdIYXJtb255IExpZ2h0JywgJ09jZWFuJywgJ1Bhc3RlbCcsICdTb2Z0JywgJ1NvZnQgUGFzdGVsJywgJ1ZpbnRhZ2UnLFxyXG4gICdWaW9sZXQnLCAnQ2FybWluZScsICdEYXJrIE1vb24nLCAnRGFyayBWaW9sZXQnLCAnR3JlZW4gTWlzdCcsICdTb2Z0IEJsdWUnLCAnTWF0ZXJpYWwnLCAnT2ZmaWNlJ107XHJcblxyXG4vLyAxLiBNb2RlbFxyXG5jb25zdCBwcm9wZXJ0eSA9IHtcclxuICBvd25lclR5cGU6IERldkV4cHJlc3M/LkRhc2hib2FyZD8uTW9kZWw/LkdhdWdlSXRlbSxcclxuICBwcm9wZXJ0eU5hbWU6ICdHYXVnZVN1YnZhbHVlc1NldHRpbmdzJyxcclxuICBkZWZhdWx0VmFsdWU6IEpTT04uc3RyaW5naWZ5KGRlZmF1bHRPcHRpb25zKSxcclxuICB2YWx1ZVR5cGU6ICdzdHJpbmcnXHJcbn0gYXMgRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuQ3VzdG9tUHJvcGVydHlNZXRhZGF0YTtcclxuXHJcbkRldkV4cHJlc3M/LkRhc2hib2FyZD8uTW9kZWw/LnJlZ2lzdGVyQ3VzdG9tUHJvcGVydHkocHJvcGVydHkpO1xyXG5cclxuLy8gMi4gVmlld2VyXHJcbmZ1bmN0aW9uIG9uSXRlbVdpZGdldE9wdGlvbnNQcmVwYXJlZChhcmdzOiBEZXZFeHByZXNzLkRhc2hib2FyZC5JdGVtV2lkZ2V0T3B0aW9uRXZlbnRBcmdzKSB7XHJcbiAgaWYgKGFyZ3MuZGFzaGJvYXJkSXRlbSBpbnN0YW5jZW9mIERldkV4cHJlc3M/LkRhc2hib2FyZD8uTW9kZWw/LkdhdWdlSXRlbSkge1xyXG4gICAgY29uc3Qgc3RvcmVkT3B0aW9ucyA9IGdldE9wdGlvbnMoYXJncy5kYXNoYm9hcmRJdGVtKTtcclxuXHJcbiAgICBjb25zdCBnYXVnZU9wdGlvbnMgPSBhcmdzLm9wdGlvbnMgYXMgRGV2RXhwcmVzcy52aXouZHhMaW5lYXJHYXVnZU9wdGlvbnMgfCBEZXZFeHByZXNzLnZpei5keENpcmN1bGFyR2F1Z2VPcHRpb25zO1xyXG4gICAgZ2F1Z2VPcHRpb25zLnN1YnZhbHVlcyA9IGdhdWdlT3B0aW9ucy5zdWJ2YWx1ZXMgfHwgW107XHJcbiAgICBnYXVnZU9wdGlvbnMuc3VidmFsdWVJbmRpY2F0b3IgPSBnYXVnZU9wdGlvbnMuc3VidmFsdWVJbmRpY2F0b3IgfHwge307XHJcblxyXG4gICAgZ2F1Z2VPcHRpb25zLnN1YnZhbHVlSW5kaWNhdG9yLnR5cGUgPSBzdG9yZWRPcHRpb25zLnR5cGUgYXMgYW55O1xyXG4gICAgZ2F1Z2VPcHRpb25zLnN1YnZhbHVlSW5kaWNhdG9yLndpZHRoID0gc3RvcmVkT3B0aW9ucy53aWR0aDtcclxuXHJcbiAgICBjb25zdCBoYXNUYXJnZXRWYWx1ZSA9ICEhYXJncy5kYXNoYm9hcmRJdGVtLmdhdWdlcygpWzBdPy50YXJnZXRWYWx1ZSgpO1xyXG4gICAgZ2F1Z2VPcHRpb25zLnN1YnZhbHVlSW5kaWNhdG9yLnBhbGV0dGUgPSBzdG9yZWRPcHRpb25zLnN1YnZhbHVlcy5maWx0ZXIoKHMpID0+IGhhc1RhcmdldFZhbHVlIHx8IHMua2V5ID4gLTEpLm1hcCgocykgPT4gcy5jb2xvcik7XHJcblxyXG4gICAgc3RvcmVkT3B0aW9ucy5zdWJ2YWx1ZXMuZm9yRWFjaCgoc3VidmFsdWUpID0+IHtcclxuICAgICAgaWYgKHN1YnZhbHVlLmtleSA9PT0gLTEpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHZhbHVlID0gc3VidmFsdWUuaXNCb3VuZCA/IGFyZ3MuaXRlbURhdGEuZ2V0TWVhc3VyZVZhbHVlKHN1YnZhbHVlLm1lYXN1cmVJZCkuZ2V0VmFsdWUoKSA6IHN1YnZhbHVlLnZhbHVlO1xyXG4gICAgICBnYXVnZU9wdGlvbnMuc3VidmFsdWVzLnB1c2godmFsdWUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG4vLyAzLiBEZXNpZ25lclxyXG5mdW5jdGlvbiBvbkN1c3RvbWl6ZVNlY3Rpb25zKGFyZ3M6IERldkV4cHJlc3MuRGFzaGJvYXJkLkRlc2lnbmVyLkN1c3RvbWl6ZVNlY3Rpb25zRXZlbnRBcmdzKSB7XHJcbiAgY29uc3QgZ2F1Z2VJdGVtID0gYXJncy5kYXNoYm9hcmRJdGVtO1xyXG4gIGlmIChnYXVnZUl0ZW0gaW5zdGFuY2VvZiBEZXZFeHByZXNzPy5EYXNoYm9hcmQ/Lk1vZGVsPy5HYXVnZUl0ZW0pIHtcclxuICAgIGFyZ3MuYWRkU2VjdGlvbih7XHJcbiAgICAgIHRpdGxlOiAnU3VidmFsdWVzJyxcclxuICAgICAgaXRlbXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6IHByb3BlcnR5LnByb3BlcnR5TmFtZSxcclxuICAgICAgICAgIHRlbXBsYXRlKGEsIGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgYnV0dG9uQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIG5ldyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdFZGl0IGluIFdpemFyZCcsXHJcbiAgICAgICAgICAgICAgb25DbGljaygpIHtcclxuICAgICAgICAgICAgICAgIHNob3dQb3B1cChnYXVnZUl0ZW0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gYnV0dG9uQ29udGFpbmVyO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93UG9wdXAoZ2F1Z2VJdGVtOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZUl0ZW0pIHtcclxuICBjb25zdCBwb3B1cENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocG9wdXBDb250YWluZXIpO1xyXG4gIGNvbnN0IHBvcHVwT3B0aW9ucyA9IHtcclxuICAgIHdpZHRoOiAnODAwcHgnLFxyXG4gICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICBtYXhIZWlnaHQ6ICcxMDAlJyxcclxuICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxyXG4gICAgY29udGVudFRlbXBsYXRlKHRoaXM6IGFueSwgY29udGVudENvbnRhaW5lcikge1xyXG4gICAgICBjb25zdCBzdWJ2YWx1ZXNGb3JtQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIGNvbnN0IHN1YnZhbHVlc2Zvcm1PcHRpb25zID0gZ2V0U3VidmFsdWVGb3JtT3B0aW9ucyhnYXVnZUl0ZW0pO1xyXG4gICAgICB0aGlzLl9zdWJ2YWx1ZXNGb3JtID0gbmV3IERldkV4cHJlc3MudWkuZHhGb3JtKHN1YnZhbHVlc0Zvcm1Db250YWluZXIsIHN1YnZhbHVlc2Zvcm1PcHRpb25zKTtcclxuXHJcbiAgICAgIGNvbnN0IGluZGljYXRvckZvcm1Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgY29uc3QgaW5kaWNhdG9yZm9ybU9wdGlvbnMgPSBnZXRJbmRpY2F0b3JGb3JtT3B0aW9ucyhnYXVnZUl0ZW0pO1xyXG4gICAgICB0aGlzLl9pbmRpY2F0b3JGb3JtID0gbmV3IERldkV4cHJlc3MudWkuZHhGb3JtKGluZGljYXRvckZvcm1Db250YWluZXIsIGluZGljYXRvcmZvcm1PcHRpb25zKTtcclxuXHJcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAkKCc8ZGl2IC8+JykuYXBwZW5kKHN1YnZhbHVlc0Zvcm1Db250YWluZXIsIGluZGljYXRvckZvcm1Db250YWluZXIpO1xyXG5cclxuICAgICAgY29uc3Qgc2Nyb2xsVmlldyA9ICQoJzxkaXYgLz4nKTtcclxuICAgICAgc2Nyb2xsVmlldy5hcHBlbmQoY29udGVudCk7XHJcbiAgICAgIHNjcm9sbFZpZXcuZHhTY3JvbGxWaWV3KHtcclxuICAgICAgICB3aWR0aDogJzEwMCUnLFxyXG4gICAgICAgIGhlaWdodDogJzEwMCUnXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuIHNjcm9sbFZpZXc7XHJcbiAgICB9LFxyXG4gICAgb25IaWRkZW4oKSB7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQocG9wdXBDb250YWluZXIpO1xyXG4gICAgfSxcclxuICAgIHRpdGxlOiAnU3VidmFsdWVzIFdpemFyZCcsXHJcbiAgfSBhcyBEZXZFeHByZXNzLnVpLmR4UG9wdXAuUHJvcGVydGllcztcclxuICBjb25zdCBwb3B1cCA9IG5ldyBEZXZFeHByZXNzLnVpLmR4UG9wdXAocG9wdXBDb250YWluZXIsIHBvcHVwT3B0aW9ucyk7XHJcbiAgcG9wdXAuc2hvdygpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRPcHRpb25zKGdhZ3VlSXRlbTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VJdGVtKTogSUdhdWdlU3VidmFsdWVzT3B0aW9ucyB7XHJcbiAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZ2FndWVJdGVtLmN1c3RvbVByb3BlcnRpZXMuZ2V0VmFsdWUocHJvcGVydHkucHJvcGVydHlOYW1lKSBhcyBzdHJpbmcpIGFzIElHYXVnZVN1YnZhbHVlc09wdGlvbnM7XHJcbiAgY29uc3QgaGFzVGFyZ2V0VmFsdWUgPSAhIWdhZ3VlSXRlbS5nYXVnZXMoKVswXT8udGFyZ2V0VmFsdWUoKTtcclxuXHJcbiAgaWYgKGhhc1RhcmdldFZhbHVlICYmICghZGF0YS5zdWJ2YWx1ZXMgfHwgIWRhdGEuc3VidmFsdWVzLnNvbWUoKHMpID0+IHMua2V5ID09PSAtMSkpKSB7XHJcbiAgICBkYXRhLnN1YnZhbHVlcy5zcGxpY2UoMCwgMCwge1xyXG4gICAgICBrZXk6IC0xLFxyXG4gICAgICBuYW1lOiAnVGFyZ2V0IFZhbHVlJyxcclxuICAgICAgaXNCb3VuZDogZmFsc2UsXHJcbiAgICAgIG1lYXN1cmVJZDogJycsXHJcbiAgICAgIHZhbHVlOiAwLFxyXG4gICAgICBjb2xvcjogREVGQVVMVF9QQUxFVFRFWyhkYXRhLnN1YnZhbHVlcz8ubGVuZ3RoIHx8IDApICUgKERFRkFVTFRfUEFMRVRURS5sZW5ndGggLSAxKV0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJldHVybiBkYXRhO1xyXG59XHJcbmZ1bmN0aW9uIHNldE9wdGlvbnMoZ2F1Z2VJdGVtOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZUl0ZW0sIHZhbHVlOiBJR2F1Z2VTdWJ2YWx1ZXNPcHRpb25zKSB7XHJcbiAgcmV0dXJuIGdhdWdlSXRlbS5jdXN0b21Qcm9wZXJ0aWVzLnNldFZhbHVlKHByb3BlcnR5LnByb3BlcnR5TmFtZSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcclxufVxyXG5cclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuZnVuY3Rpb24gY3JlYXRlTGlzdEFuZFRvb2xiYXIoZm9ybTogRGV2RXhwcmVzcy51aS5keEZvcm0sIGdhdWdlSXRlbTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VJdGVtKTogW0pRdWVyeSwgRGV2RXhwcmVzcy51aS5keExpc3QsIERldkV4cHJlc3MudWkuZHhUb29sYmFyXSB7XHJcbiAgY29uc3QgJGVsZW1lbnQgPSAkKCc8ZGl2IC8+Jyk7XHJcbiAgY29uc3QgJHRvb2xiYXJDb250YWluZXIgPSAkKCc8ZGl2IC8+Jyk7XHJcbiAgJGVsZW1lbnQuYXBwZW5kKCR0b29sYmFyQ29udGFpbmVyKTtcclxuICBjb25zdCBlZGl0QnV0dG9uID0gbnVsbDtcclxuICBsZXQgbGlzdDogRGV2RXhwcmVzcy51aS5keExpc3QgPSBudWxsO1xyXG5cclxuICBjb25zdCB0b29sYmFyT3B0aW9ucyA9IHtcclxuICAgIGl0ZW1zOiBbe1xyXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIGljb246ICdhZGQnLFxyXG4gICAgICAgIHN0eWxpbmdNb2RlOiAndGV4dCcsXHJcbiAgICAgICAgb25DbGljayhlKSB7XHJcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhnYXVnZUl0ZW0pO1xyXG4gICAgICAgICAgY29uc3Qga2V5ID0gb3B0aW9ucy5zdWJ2YWx1ZXMucmVkdWNlKChhY2MsIGl0ZW0pID0+IGFjYyA8IGl0ZW0ua2V5ID8gaXRlbS5rZXkgOiBhY2MsIDApICsgMTtcclxuICAgICAgICAgIGNvbnN0IG5ld1N1YnZhbHVlOiBJU3VidmFsdWVPcHRpb25zID0ge1xyXG4gICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgIG5hbWU6IGBTdWJ2YWx1ZSAke2tleX1gLFxyXG4gICAgICAgICAgICBpc0JvdW5kOiBmYWxzZSxcclxuICAgICAgICAgICAgbWVhc3VyZUlkOiAnJyxcclxuICAgICAgICAgICAgdmFsdWU6IDAsXHJcbiAgICAgICAgICAgIGNvbG9yOiBERUZBVUxUX1BBTEVUVEVbb3B0aW9ucy5zdWJ2YWx1ZXMubGVuZ3RoICUgKERFRkFVTFRfUEFMRVRURS5sZW5ndGggLSAxKV0sXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJywgbmV3U3VidmFsdWUpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGl0ZW1JbkRhdGFTb3VyY2UgPSBvcHRpb25zLnN1YnZhbHVlcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ua2V5ID09PSBuZXdTdWJ2YWx1ZS5rZXkpWzBdO1xyXG4gICAgICAgICAgaWYgKCFpdGVtSW5EYXRhU291cmNlKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMuc3VidmFsdWVzLnB1c2gobmV3U3VidmFsdWUpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBvcHRpb25zLnN1YnZhbHVlcy5pbmRleE9mKGl0ZW1JbkRhdGFTb3VyY2UpO1xyXG4gICAgICAgICAgICBvcHRpb25zW2luZGV4XSA9IG5ld1N1YnZhbHVlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHNldE9wdGlvbnMoZ2F1Z2VJdGVtLCBvcHRpb25zKTtcclxuICAgICAgICAgIGxpc3QucmVsb2FkKCk7XHJcbiAgICAgICAgICBsaXN0Lm9wdGlvbignc2VsZWN0ZWRJdGVtJywgb3B0aW9ucy5zdWJ2YWx1ZXNbb3B0aW9ucy5zdWJ2YWx1ZXMubGVuZ3RoIC0gMV0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH1cclxuICAgIH1dXHJcbiAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhck9wdGlvbnM7XHJcblxyXG4gIGNvbnN0IHVwZGF0ZVRvb2xiYXJTdGF0ZSA9IChoYXNTZWxlY3RlZEl0ZW06IGJvb2xlYW4pID0+IHtcclxuICAgIGVkaXRCdXR0b24gJiYgZWRpdEJ1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgIWhhc1NlbGVjdGVkSXRlbSk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgdG9vbGJhciA9IG5ldyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhcigkdG9vbGJhckNvbnRhaW5lciwgdG9vbGJhck9wdGlvbnMpO1xyXG4gIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke0NTU19DTEFTU31gKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG5cclxuICBjb25zdCBsaXN0T3B0aW9ucyA9IHtcclxuICAgIGRhdGFTb3VyY2U6IG5ldyBEZXZFeHByZXNzLmRhdGEuRGF0YVNvdXJjZSh7XHJcbiAgICAgIGxvYWQ6ICgpID0+IGdldE9wdGlvbnMoZ2F1Z2VJdGVtKS5zdWJ2YWx1ZXMsXHJcbiAgICAgIHJlbW92ZTogKCkgPT4geyB9XHJcbiAgICB9IGFzIGFueSksXHJcbiAgICBkaXNwbGF5RXhwcjogJ25hbWUnLFxyXG4gICAgaGVpZ2h0OiAnMjAwcHgnLFxyXG4gICAga2V5RXhwcjogJ2tleScsXHJcbiAgICBub0RhdGFUZXh0OiAnQWRkIGEgU3VidmFsdWUnLFxyXG4gICAgYWxsb3dJdGVtRGVsZXRpbmc6IHRydWUsXHJcbiAgICBpdGVtRGVsZXRlTW9kZTogJ3N0YXRpYycsXHJcbiAgICBzZWxlY3Rpb25Nb2RlOiAnc2luZ2xlJyxcclxuICAgIG9uQ29udGVudFJlYWR5KGUpIHsgdXBkYXRlVG9vbGJhclN0YXRlKCEhZS5jb21wb25lbnQub3B0aW9uKCdzZWxlY3RlZEl0ZW0nKSk7IH0sXHJcbiAgICBvbkl0ZW1SZW5kZXJlZChlKSB7XHJcbiAgICAgIGNvbnN0IGl0ZW1EYXRhID0gZS5pdGVtRGF0YSBhcyBJU3VidmFsdWVPcHRpb25zO1xyXG4gICAgICBpZiAoaXRlbURhdGEua2V5ID09PSAtMSkge1xyXG4gICAgICAgIGNvbnN0IGRlbGV0ZUVsZW1lbnQgPSBlLml0ZW1FbGVtZW50WzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2R4LWxpc3Qtc3RhdGljLWRlbGV0ZS1idXR0b24tY29udGFpbmVyJylbMF0gYXMgSFRNTERpdkVsZW1lbnQ7XHJcbiAgICAgICAgZGVsZXRlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgb25TZWxlY3Rpb25DaGFuZ2VkKGUpIHtcclxuICAgICAgdXBkYXRlVG9vbGJhclN0YXRlKCEhZS5jb21wb25lbnQub3B0aW9uKCdzZWxlY3RlZEl0ZW0nKSk7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IGUuY29tcG9uZW50Lm9wdGlvbignc2VsZWN0ZWRJdGVtJyk7XHJcbiAgICAgIGZvcm0ub3B0aW9uKCdmb3JtRGF0YScsIHNlbGVjdGVkSXRlbSk7XHJcbiAgICAgIGNvbnN0IHdhc2Zvcm1WaXNpYmxlID0gZm9ybS5lbGVtZW50KCkuZmluZChgLiR7Q1NTX0NMQVNTfWApLmNzcygnZGlzcGxheScpID09PSAnYmxvY2snO1xyXG4gICAgICBjb25zdCBzaG91bGRGb3JtQmVWaXNpYmxlID0gISFzZWxlY3RlZEl0ZW07XHJcbiAgICAgIGlmICghd2FzZm9ybVZpc2libGUgJiYgc2hvdWxkRm9ybUJlVmlzaWJsZSB8fCB3YXNmb3JtVmlzaWJsZSAmJiAhc2hvdWxkRm9ybUJlVmlzaWJsZSkge1xyXG4gICAgICAgIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke0NTU19DTEFTU31gKS5jc3MoJ2Rpc3BsYXknLCBzaG91bGRGb3JtQmVWaXNpYmxlID8gJ2Jsb2NrJyA6ICdub25lJyk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBvbkl0ZW1EZWxldGVkOiAoZSkgPT4ge1xyXG4gICAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhnYXVnZUl0ZW0pO1xyXG4gICAgICBjb25zdCBrZXkgPSBlLml0ZW1EYXRhLmtleTtcclxuICAgICAgY29uc3QgaW5kZXggPSBvcHRpb25zLnN1YnZhbHVlcy5pbmRleE9mKG9wdGlvbnMuc3VidmFsdWVzLmZpbHRlcigoc3VidmFsdWUpID0+IHN1YnZhbHVlLmtleSA9PT0ga2V5KVswXSk7XHJcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgb3B0aW9ucy5zdWJ2YWx1ZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICBzZXRPcHRpb25zKGdhdWdlSXRlbSwgb3B0aW9ucyk7XHJcbiAgICAgIH1cclxuICAgICAgbGlzdC5yZWxvYWQoKTtcclxuICAgICAgbGlzdC5vcHRpb24oJ3NlbGVjdGVkSXRlbScsIG9wdGlvbnMuc3VidmFsdWVzW29wdGlvbnMuc3VidmFsdWVzLmxlbmd0aCAtIDFdKTtcclxuICAgIH1cclxuICB9IGFzIERldkV4cHJlc3MudWkuZHhMaXN0T3B0aW9ucztcclxuXHJcbiAgY29uc3QgJGxpc3RDb250YWluZXIgPSAkKCc8ZGl2IC8+Jyk7XHJcbiAgJGVsZW1lbnQuYXBwZW5kKCRsaXN0Q29udGFpbmVyKTtcclxuXHJcbiAgbGlzdCA9IG5ldyBEZXZFeHByZXNzLnVpLmR4TGlzdCgkbGlzdENvbnRhaW5lciwgbGlzdE9wdGlvbnMpO1xyXG5cclxuICByZXR1cm4gWyRlbGVtZW50LCBsaXN0LCB0b29sYmFyXTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0U3VidmFsdWVGb3JtT3B0aW9ucyhnYXVnZUl0ZW06IERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLkdhdWdlSXRlbSk6IERldkV4cHJlc3MudWkuZHhGb3JtT3B0aW9ucyB7XHJcbiAgbGV0IGl0ZW1zTGlzdDogRGV2RXhwcmVzcy51aS5keExpc3QgfCBudWxsID0gbnVsbDtcclxuICBjb25zdCB1cGRhdGVGb3JtU3RhdGUgPSAoZm9ybTogRGV2RXhwcmVzcy51aS5keEZvcm0pID0+IHtcclxuICAgIGNvbnN0IHZhbHVlRWRpdG9yID0gZm9ybS5nZXRFZGl0b3IoJ3ZhbHVlJyk7XHJcbiAgICBjb25zdCBtZWFzdXJlSWRFZGl0b3IgPSBmb3JtLmdldEVkaXRvcignbWVhc3VyZUlkJyk7XHJcbiAgICBjb25zdCBuYW1lRWRpdG9yID0gZm9ybS5nZXRFZGl0b3IoJ25hbWUnKTtcclxuICAgIGNvbnN0IGlzQm91bmQgPSBmb3JtLm9wdGlvbignZm9ybURhdGEnKS5pc0JvdW5kO1xyXG4gICAgY29uc3QgaXNUYXJnZXRWYWx1ZSA9IGZvcm0ub3B0aW9uKCdmb3JtRGF0YScpLmtleSA9PT0gLTE7XHJcblxyXG4gICAgdmFsdWVFZGl0b3IgJiYgdmFsdWVFZGl0b3Iub3B0aW9uKCdkaXNhYmxlZCcsIGlzQm91bmQpO1xyXG4gICAgbWVhc3VyZUlkRWRpdG9yICYmIG1lYXN1cmVJZEVkaXRvci5vcHRpb24oJ2Rpc2FibGVkJywgIWlzQm91bmQpO1xyXG5cclxuICAgIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke0lTX0JPVU5EX0lURU1fQ1NTX0NMQVNTfWApLmNzcygnZGlzcGxheScsICFpc1RhcmdldFZhbHVlID8gJ2ZsZXgnIDogJ25vbmUnKTtcclxuICAgIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke1ZBTFVFX0lURU1fQ1NTX0NMQVNTfWApLmNzcygnZGlzcGxheScsICFpc1RhcmdldFZhbHVlID8gJ2ZsZXgnIDogJ25vbmUnKTtcclxuICAgIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke01FQVNVUkVfSURfSVRFTV9DU1NfQ0xBU1N9YCkuY3NzKCdkaXNwbGF5JywgIWlzVGFyZ2V0VmFsdWUgPyAnZmxleCcgOiAnbm9uZScpO1xyXG5cclxuICAgIG5hbWVFZGl0b3IgJiYgbmFtZUVkaXRvci5vcHRpb24oJ2Rpc2FibGVkJywgaXNUYXJnZXRWYWx1ZSk7XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGZvcm1EYXRhOiBudWxsLFxyXG4gICAgY29sQ291bnQ6IDIsXHJcbiAgICBpdGVtczogW1xyXG4gICAgICB7XHJcbiAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgY2FwdGlvbjogJ1N1YnZhbHVlcyBpdGVtcycsXHJcbiAgICAgICAgdGVtcGxhdGU6IChhcmdzKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBbJGNvbnRhaW5lciwgbGlzdF0gPSBjcmVhdGVMaXN0QW5kVG9vbGJhcihhcmdzLmNvbXBvbmVudCwgZ2F1Z2VJdGVtKTtcclxuICAgICAgICAgIGl0ZW1zTGlzdCA9IGxpc3Q7XHJcblxyXG4gICAgICAgICAgcmV0dXJuICRjb250YWluZXI7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdzdWJ2YWx1ZUVkaXRvcicsXHJcbiAgICAgICAgY3NzQ2xhc3M6IENTU19DTEFTUyxcclxuICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICBjYXB0aW9uOiAnSXRlbSBvcHRpb25zJyxcclxuICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICduYW1lJyxcclxuICAgICAgICAgICAgY3NzQ2xhc3M6IE5BTUVfSVRFTV9DU1NfQ0xBU1MsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeFRleHRCb3gnLFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgdmFsdWVDaGFuZ2VFdmVudDogJ2tleXVwJ1xyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUZXh0Qm94LlByb3BlcnRpZXNcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ2lzQm91bmQnLFxyXG4gICAgICAgICAgICBjc3NDbGFzczogSVNfQk9VTkRfSVRFTV9DU1NfQ0xBU1MsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeFJhZGlvR3JvdXAnLFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgZGlzcGxheUV4cHI6ICd0ZXh0JyxcclxuICAgICAgICAgICAgICB2YWx1ZUV4cHI6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgICAgbGF5b3V0OiAnaG9yaXpvbnRhbCcsXHJcbiAgICAgICAgICAgICAgaXRlbXM6IFt7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAnVW5ib3VuZCcsIHZhbHVlOiBmYWxzZVxyXG4gICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIHRleHQ6ICdCb3VuZCcsIHZhbHVlOiB0cnVlXHJcbiAgICAgICAgICAgICAgfV1cclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4UmFkaW9Hcm91cC5Qcm9wZXJ0aWVzLFxyXG4gICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdUeXBlJyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgY3NzQ2xhc3M6IFZBTFVFX0lURU1fQ1NTX0NMQVNTLFxyXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhOdW1iZXJCb3gnLFxyXG4gICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdWYWx1ZScsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBzaG93U3BpbkJ1dHRvbnM6IHRydWUsXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keE51bWJlckJveC5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdtZWFzdXJlSWQnLFxyXG4gICAgICAgICAgICBjc3NDbGFzczogTUVBU1VSRV9JRF9JVEVNX0NTU19DTEFTUyxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4U2VsZWN0Qm94JyxcclxuICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnSGlkZGVuIG1lYXN1cmVzJyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIGRpc3BsYXlFeHByOiAndGV4dCcsXHJcbiAgICAgICAgICAgICAgdmFsdWVFeHByOiAndmFsdWUnLFxyXG4gICAgICAgICAgICAgIGl0ZW1zOiBnYXVnZUl0ZW0uaGlkZGVuTWVhc3VyZXMoKS5tYXAoKG1lYXN1cmUpID0+ICh7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiBnZXRNZWFzdXJlRGlzYXBsYXlUZXh0KG1lYXN1cmUpLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IG1lYXN1cmUudW5pcXVlTmFtZSgpXHJcbiAgICAgICAgICAgICAgfSkpLFxyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhTZWxlY3RCb3guUHJvcGVydGllc1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ2NvbG9yJyxcclxuICAgICAgICAgICAgY3NzQ2xhc3M6IENPTE9SX0lURU1fQ1NTX0NMQVNTLFxyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdjb2xvcicsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeENvbG9yQm94JyxcclxuICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnQ29sb3InLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIF1cclxuICAgICAgfVxyXG4gICAgXSxcclxuICAgIG9uQ29udGVudFJlYWR5KGUpIHsgdXBkYXRlRm9ybVN0YXRlKGUuY29tcG9uZW50KTsgfSxcclxuICAgIG9uRmllbGREYXRhQ2hhbmdlZChlKSB7XHJcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gZS5jb21wb25lbnQub3B0aW9uKCdmb3JtRGF0YScpIGFzIElTdWJ2YWx1ZU9wdGlvbnM7XHJcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKGdhdWdlSXRlbSk7XHJcbiAgICAgIGNvbnN0IGVkaXRlZFN1YnZhbHVlID0gb3B0aW9ucy5zdWJ2YWx1ZXMuZmlsdGVyKChzdWJ2YWx1ZSkgPT4gc3VidmFsdWUua2V5ID09PSBmb3JtRGF0YS5rZXkpWzBdO1xyXG5cclxuICAgICAgb3B0aW9ucy5zdWJ2YWx1ZXNbb3B0aW9ucy5zdWJ2YWx1ZXMuaW5kZXhPZihlZGl0ZWRTdWJ2YWx1ZSldID0gZm9ybURhdGE7XHJcbiAgICAgIHNldE9wdGlvbnMoZ2F1Z2VJdGVtLCBvcHRpb25zKTtcclxuXHJcbiAgICAgIGlmIChlZGl0ZWRTdWJ2YWx1ZSAmJiBlZGl0ZWRTdWJ2YWx1ZS5uYW1lICE9PSBmb3JtRGF0YS5uYW1lICYmIGl0ZW1zTGlzdCkge1xyXG4gICAgICAgIGl0ZW1zTGlzdC5yZXBhaW50KCk7XHJcbiAgICAgIH1cclxuICAgICAgdXBkYXRlRm9ybVN0YXRlKGUuY29tcG9uZW50KTtcclxuICAgIH0sXHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0TWVhc3VyZURpc2FwbGF5VGV4dChtZWFzdXJlOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5NZWFzdXJlKTogc3RyaW5nIHtcclxuICBpZiAobWVhc3VyZS5uYW1lKCkpIHtcclxuICAgIHJldHVybiBtZWFzdXJlLm5hbWUoKTtcclxuICB9XHJcblxyXG4gIGxldCByZXN1bHQgPSBtZWFzdXJlLmRhdGFNZW1iZXIoKTtcclxuICBpZiAobWVhc3VyZS5zdW1tYXJ5VHlwZSAmJiBtZWFzdXJlLnN1bW1hcnlUeXBlKCkpIHtcclxuICAgIHJlc3VsdCArPSBgICgke21lYXN1cmUuc3VtbWFyeVR5cGUoKX0pYDtcclxuICB9XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEluZGljYXRvckZvcm1PcHRpb25zKGdhdWdlSXRlbTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VJdGVtKTogRGV2RXhwcmVzcy51aS5keEZvcm1PcHRpb25zIHtcclxuICBjb25zdCBjdXJyZW50Vmlld1R5cGUgPSBnYXVnZUl0ZW0udmlld1R5cGUoKTtcclxuICBjb25zdCBpbmRpY2F0b3JUeXBlcyA9IExJTkVBUl9WSUVXX1RZUEVTLnNvbWUoKHQpID0+IHQgPT09IGN1cnJlbnRWaWV3VHlwZSlcclxuICAgID8gTElORUFSX0lORElDQVRPUl9UWVBFU1xyXG4gICAgOiBDSVJDTFVBUl9JTkRJQ0FUT1JfVFlQRVM7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBmb3JtRGF0YTogZ2V0T3B0aW9ucyhnYXVnZUl0ZW0pIHx8IG51bGwsXHJcbiAgICBpdGVtczogW1xyXG4gICAgICB7XHJcbiAgICAgICAgY2FwdGlvbjogJ0luZGljYXRvciBvcHRpb25zJyxcclxuICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICd0eXBlJyxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4U2VsZWN0Qm94JyxcclxuICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnVHlwZScsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ3RleHQnLFxyXG4gICAgICAgICAgICAgIHZhbHVlRXhwcjogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICBpdGVtczogaW5kaWNhdG9yVHlwZXMubWFwKCh0KSA9PiAoeyB0ZXh0OiB0LCB2YWx1ZTogdCB9KSksXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveC5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICd3aWR0aCcsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeE51bWJlckJveCcsXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBzaG93U3BpbkJ1dHRvbnM6IHRydWUsXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keE51bWJlckJveE9wdGlvbnMsXHJcbiAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ1dpZHRoJyxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgICAgfVxyXG4gICAgXSxcclxuICAgIG9uRmllbGREYXRhQ2hhbmdlZChlKSB7XHJcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gZS5jb21wb25lbnQub3B0aW9uKCdmb3JtRGF0YScpIGFzIElHYXVnZVN1YnZhbHVlc09wdGlvbnM7XHJcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKGdhdWdlSXRlbSk7XHJcblxyXG4gICAgICBvcHRpb25zLndpZHRoID0gZm9ybURhdGEud2lkdGg7XHJcbiAgICAgIG9wdGlvbnMudHlwZSA9IGZvcm1EYXRhLnR5cGU7XHJcblxyXG4gICAgICBzZXRPcHRpb25zKGdhdWdlSXRlbSwgb3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgfTtcclxufVxyXG5cclxuLy8gNC4gRXZlbnQgU3Vic2NyaXB0aW9uXHJcbmV4cG9ydCBmdW5jdGlvbiBnYXVnZVN1YnZhbHVlc0V4dGVuc2lvbih0aGlzOiBhbnksIGRhc2hib2FyZENvbnRyb2w6IERldkV4cHJlc3MuRGFzaGJvYXJkLkRhc2hib2FyZENvbnRyb2wpIHtcclxuICB0aGlzLm5hbWUgPSAnR2F1Z2VTdWJ2YWx1ZXMnO1xyXG4gIHRoaXMuc3RhcnQgPSAoKSA9PiB7XHJcbiAgICBjb25zdCB2aWV3ZXJBcGlFeHRlbnNpb24gPSBkYXNoYm9hcmRDb250cm9sLmZpbmRFeHRlbnNpb24oJ3ZpZXdlci1hcGknKSBhcyBEZXZFeHByZXNzLkRhc2hib2FyZC5WaWV3ZXJBcGlFeHRlbnNpb247XHJcbiAgICBpZiAodmlld2VyQXBpRXh0ZW5zaW9uKSB7XHJcbiAgICAgIHZpZXdlckFwaUV4dGVuc2lvbi5vbignaXRlbVdpZGdldE9wdGlvbnNQcmVwYXJlZCcsIG9uSXRlbVdpZGdldE9wdGlvbnNQcmVwYXJlZCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBvcHRpb25zUGFuZWxFeHRlbnNpb24gPSBkYXNoYm9hcmRDb250cm9sLmZpbmRFeHRlbnNpb24oJ2l0ZW0tb3B0aW9ucy1wYW5lbCcpIGFzIGFueTtcclxuICAgIGlmIChvcHRpb25zUGFuZWxFeHRlbnNpb24pIHtcclxuICAgICAgb3B0aW9uc1BhbmVsRXh0ZW5zaW9uLm9uKCdjdXN0b21pemVTZWN0aW9ucycsIG9uQ3VzdG9taXplU2VjdGlvbnMpO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgdGhpcy5zdG9wID0gKCkgPT4ge1xyXG4gICAgY29uc3Qgdmlld2VyQXBpRXh0ZW5zaW9uID0gZGFzaGJvYXJkQ29udHJvbC5maW5kRXh0ZW5zaW9uKCd2aWV3ZXItYXBpJykgYXMgRGV2RXhwcmVzcy5EYXNoYm9hcmQuVmlld2VyQXBpRXh0ZW5zaW9uO1xyXG4gICAgaWYgKHZpZXdlckFwaUV4dGVuc2lvbikge1xyXG4gICAgICB2aWV3ZXJBcGlFeHRlbnNpb24ub2ZmKCdpdGVtV2lkZ2V0T3B0aW9uc1ByZXBhcmVkJywgb25JdGVtV2lkZ2V0T3B0aW9uc1ByZXBhcmVkKTtcclxuICAgIH1cclxuICAgIGNvbnN0IG9wdGlvbnNQYW5lbEV4dGVuc2lvbiA9IGRhc2hib2FyZENvbnRyb2wuZmluZEV4dGVuc2lvbignaXRlbS1vcHRpb25zLXBhbmVsJykgYXMgYW55O1xyXG4gICAgaWYgKG9wdGlvbnNQYW5lbEV4dGVuc2lvbikge1xyXG4gICAgICBvcHRpb25zUGFuZWxFeHRlbnNpb24ub2ZmKCdjdXN0b21pemVTZWN0aW9ucycsIG9uQ3VzdG9taXplU2VjdGlvbnMpO1xyXG4gICAgfVxyXG4gIH07XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGluaXRQb3BvdmVyIH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZXBvcnREZXRhaWxzUG9wb3Zlcic7XHJcbmltcG9ydCB7IElEYXNoYm9hcmRQZXJtaXNzaW9ucywgSURhc2hib2FyZFVybHMsIElSZXBvcnRQYXJhbXMgfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IHsgZ2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24gfSBmcm9tICcuL0V4dGVuc2lvbnMvR2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24nO1xyXG5pbXBvcnQgUmVmcmVzaEJ1dHRvbiBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlZnJlc2hUaW1lci9CdXR0b24nO1xyXG5pbXBvcnQge0lSZXBvcnRDb21wb25lbnR9IGZyb20gJy4uLy4uL0lSZXBvcnRDb21wb25lbnQnO1xyXG5cclxuY29uc3QgREFTSEJPQVJEX01PREVfS0VZID0gJ0RBU0hCT0FSRF9NT0RFX0tFWSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEYXNoYm9hcmRPcHRpb25zIHtcclxuICAkZGFzaGJvYXJkQ29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG4gIHBlcm1pc3Npb25zOiBJRGFzaGJvYXJkUGVybWlzc2lvbnM7XHJcbiAgdXJsczogSURhc2hib2FyZFVybHM7XHJcbiAgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGFzaGJvYXJkIGltcGxlbWVudHMgSVJlcG9ydENvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkZGFzaGJvYXJkQ29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwZXJtaXNzaW9uczogSURhc2hib2FyZFBlcm1pc3Npb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXJsczogSURhc2hib2FyZFVybHM7XHJcbiAgcHJpdmF0ZSByZWZyZXNoQnV0dG9uOiBSZWZyZXNoQnV0dG9uIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgZGFzaGJvYXJkOiBEZXZFeHByZXNzLkRhc2hib2FyZC5EYXNoYm9hcmRDb250cm9sIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBwb3BvdmVyOiBEZXZFeHByZXNzLnVpLmR4UG9wb3ZlciB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0SWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFkZFJlZnJlc2hCdXR0b246IGJvb2xlYW47XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElEYXNoYm9hcmRPcHRpb25zKSB7XHJcbiAgICB0aGlzLiRkYXNoYm9hcmRDb250YWluZXIgPSBvcHRpb25zLiRkYXNoYm9hcmRDb250YWluZXI7XHJcbiAgICB0aGlzLmFkZFJlZnJlc2hCdXR0b24gPSBvcHRpb25zLmFkZFJlZnJlc2hCdXR0b247XHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy5yZXBvcnRJZCA9IG9wdGlvbnMucmVwb3J0UGFyYW1zLlJlcG9ydElkO1xyXG4gICAgdGhpcy5wZXJtaXNzaW9ucyA9IG9wdGlvbnMucGVybWlzc2lvbnM7XHJcbiAgICB0aGlzLnVybHMgPSBvcHRpb25zLnVybHM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdCgpOiB2b2lkIHtcclxuICAgIGxldCByZXBvcnRJZFN0ciA9IHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkICYmIHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgRGV2RXhwcmVzcy5EYXNoYm9hcmQuUmVzb3VyY2VNYW5hZ2VyLmVtYmVkQnVuZGxlZFJlc291cmNlcygpO1xyXG5cclxuICAgIGxldCBtb2RlOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Xb3JraW5nTW9kZSA9IHRoaXMucGVybWlzc2lvbnMuQWxsb3dFZGl0aW5nXHJcbiAgICAgID8gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCkpIGFzIERldkV4cHJlc3MuRGFzaGJvYXJkLldvcmtpbmdNb2RlIHx8ICdWaWV3ZXInXHJcbiAgICAgIDogJ1ZpZXdlcic7XHJcblxyXG4gICAgaWYgKHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpIHtcclxuICAgICAgdGhpcy5wb3BvdmVyID0gaW5pdFBvcG92ZXIoJy5yZXBvcnQtZGV0YWlscy1saW5rJywgdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTk9URTogRGFzaGJvYXJkIDE4LjEgZG9lc24ndCBzdXBwb3J0IGV4cG9ydC4gV2UgaGlkZSB0aGUgZXhwb3J0IGJ1dHRvbiB2aWEgc3R5bGVzXHJcbiAgICB0aGlzLmRhc2hib2FyZCA9IG5ldyBEZXZFeHByZXNzLkRhc2hib2FyZC5EYXNoYm9hcmRDb250cm9sKHRoaXMuJGRhc2hib2FyZENvbnRhaW5lclswXSwge1xyXG4gICAgICB3b3JraW5nTW9kZTogbW9kZSxcclxuICAgICAgaW5pdGlhbERhc2hib2FyZElkOiByZXBvcnRJZFN0cixcclxuICAgICAgZW5kcG9pbnQ6IHRoaXMudXJscy5FbmRQb2ludCxcclxuICAgICAgYWpheFJlbW90ZVNlcnZpY2U6IHtcclxuICAgICAgICBoZWFkZXJzOiAhdGhpcy5yZXBvcnRQYXJhbXMuVG9rZW4gPyB1bmRlZmluZWQgOiB7XHJcbiAgICAgICAgICB0b2tlbjogdGhpcy5yZXBvcnRQYXJhbXMuVG9rZW5cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRGFzaGJvYXJkSW5pdGlhbGl6aW5nOiAoZSkgPT4ge1xyXG4gICAgICAgIGUuY29tcG9uZW50LnJlZ2lzdGVyRXh0ZW5zaW9uKG5ldyBnYXVnZVN1YnZhbHVlc0V4dGVuc2lvbihlLmNvbXBvbmVudCkpO1xyXG5cclxuICAgICAgICBpZiAocmVwb3J0SWRTdHIgIT09IGUuZGFzaGJvYXJkSWQpIHtcclxuICAgICAgICAgIHJlcG9ydElkU3RyID0gZS5kYXNoYm9hcmRJZDtcclxuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZW5jb2RlVVJJKHRoaXMudXJscy5QcmV2aWV3VXJsICsgZS5kYXNoYm9hcmRJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvbkJlZm9yZVJlbmRlcjogKGUpID0+IHtcclxuICAgICAgICBlLmNvbXBvbmVudC5yZWdpc3RlckV4dGVuc2lvbihuZXcgRGV2RXhwcmVzcy5EYXNoYm9hcmQuRGVzaWduZXIuVGV4dEJveEl0ZW1FZGl0b3JFeHRlbnNpb24oZS5jb21wb25lbnQpKTtcclxuICAgICAgfSxcclxuICAgICAgZXh0ZW5zaW9uczoge1xyXG4gICAgICAgICdkYXRhLXNvdXJjZS13aXphcmQnOiB7XHJcbiAgICAgICAgICBlbmFibGVDdXN0b21TcWw6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgICdkYXNoYm9hcmQtZXhwb3J0Jzoge1xyXG4gICAgICAgICAgYWxsb3dFeHBvcnREYXNoYm9hcmRJdGVtczogdHJ1ZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgJ2RhdGEtaW5zcGVjdG9yJzoge1xyXG4gICAgICAgICAgYWxsb3dJbnNwZWN0QWdncmVnYXRlZERhdGE6IHRydWUsXHJcbiAgICAgICAgICBhbGxvd0luc3BlY3RSYXdEYXRhOiB0cnVlLFxyXG4gICAgICAgICAgb25HcmlkSW5pdGlhbGl6ZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGdyaWQgPSBlLmNvbXBvbmVudCBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcbiAgICAgICAgICAgIGdyaWQub3B0aW9uKCdleHBvcnQuZW5hYmxlZCcsIHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5kYXNoYm9hcmQucmVuZGVyKCk7XHJcblxyXG4gICAgaWYgKHRoaXMucGVybWlzc2lvbnMuQWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgIGNvbnN0IGJ1dHRvbiA9ICQoJy5zd2l0Y2gtbW9kZS1idG4nKS5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogbW9kZSA9PT0gJ1ZpZXdlcicgPyAnU3dpdGNoIHRvIERlc2lnbmVyJyA6ICdTd2l0Y2ggdG8gVmlld2VyJyxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICBtb2RlID0gbW9kZSA9PT0gJ1ZpZXdlcicgPyAnRGVzaWduZXInIDogJ1ZpZXdlcic7XHJcblxyXG4gICAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCksIG1vZGUpO1xyXG5cclxuICAgICAgICAgIGlmIChtb2RlID09PSAnVmlld2VyJykge1xyXG4gICAgICAgICAgICB0aGlzLmRhc2hib2FyZC5zd2l0Y2hUb1ZpZXdlcigpO1xyXG4gICAgICAgICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgJ1N3aXRjaCB0byBEZXNpZ25lcicpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kYXNoYm9hcmQuc3dpdGNoVG9EZXNpZ25lcigpO1xyXG4gICAgICAgICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgJ1N3aXRjaCB0byBWaWV3ZXInKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLW1kJykuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgICByZW1vdmVSZWR1bmRhbnRUb29sYm94SXRlbXModGhpcy5kYXNoYm9hcmQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWRkUmVmcmVzaEJ1dHRvbiAmJiAodGhpcy5yZWZyZXNoQnV0dG9uID0gbmV3IFJlZnJlc2hCdXR0b24oJCgnLnJlcG9ydC1yZWZyZXNoLWJ1dHRvbicpLCAoKSA9PiB0aGlzLnJlZnJlc2goKSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmRhc2hib2FyZD8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5kYXNoYm9hcmQgPSBudWxsO1xyXG5cclxuICAgIHRoaXMucG9wb3Zlcj8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5wb3BvdmVyID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbktleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIERBU0hCT0FSRF9NT0RFX0tFWSArIHRoaXMucmVwb3J0SWQ7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYXNoYm9hcmQucmVmcmVzaCgpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gcmVtb3ZlUmVkdW5kYW50VG9vbGJveEl0ZW1zKGNvbnRyb2w6IERldkV4cHJlc3MuRGFzaGJvYXJkLkRhc2hib2FyZENvbnRyb2wpIHtcclxuICBjb25zdCBpdGVtc1RvUmVtb3ZlID0gWydjcmVhdGUtZGFzaGJvYXJkJywgJ29wZW4tZGFzaGJvYXJkJ107XHJcbiAgY29uc3QgdG9vbGJveCA9IGNvbnRyb2wuZmluZEV4dGVuc2lvbigndG9vbGJveCcpIGFzIERldkV4cHJlc3MuRGFzaGJvYXJkLkRlc2lnbmVyLlRvb2xib3hFeHRlbnNpb247XHJcbiAgaXRlbXNUb1JlbW92ZS5mb3JFYWNoKChpdGVtSWQpID0+IHtcclxuICAgIGNvbnN0IGl0ZW0gPSB0b29sYm94Lm1lbnVJdGVtcygpLmZpbHRlcigoaSkgPT4gaS5pZCA9PT0gaXRlbUlkKVswXTtcclxuXHJcbiAgICBpZiAoaXRlbSkge1xyXG4gICAgICB0b29sYm94LnJlbW92ZU1lbnVJdGVtKGl0ZW1JZCk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGluaXRQb3BvdmVyIH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZXBvcnREZXRhaWxzUG9wb3Zlcic7XHJcbmltcG9ydCB7IElSZXBvcnRQYXJhbXMsIE1vZGUgfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IHtJUmVwb3J0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcclxuXHJcbmNvbnN0IFNXSVRDSF9UT19ERVNJR05FUl9URVhUID0gJ1N3aXRjaCB0byBEZXNpZ25lcic7XHJcbmNvbnN0IFNXSVRDSF9UT19WSUVXRVJfVEVYVCA9ICdTd2l0Y2ggdG8gVmlld2VyJztcclxuY29uc3QgU0VTU0lPTl9TVE9SQUdFX01PREVfS0VZID0gJ3JlcG9ydE1vZGUnO1xyXG5jb25zdCBDVVJSRU5UX1VSTF9LRVkgPSAnY3VzdG9tQ3VycmVudFVybCc7XHJcblxyXG5kZWNsYXJlIGNvbnN0IGR4UmVwb3J0RGVzaWduZXI6IGFueTtcclxuY29uc3Qga28gPSAod2luZG93IGFzIGFueSkua287XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElSZXBvcnRPcHRpb25zIHtcclxuICAkcmVwb3J0Q29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG4gIGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBkZXNpZ25lck1vZGVsVXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlcG9ydCBpbXBsZW1lbnRzIElSZXBvcnRDb21wb25lbnQge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJHJlcG9ydENvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzaWduZXJNb2RlbFVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0SWQ6IG51bWJlcjtcclxuXHJcbiAgcHJpdmF0ZSBwb3BvdmVyOiBEZXZFeHByZXNzLnVpLmR4UG9wb3ZlciA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElSZXBvcnRPcHRpb25zKSB7XHJcbiAgICB0aGlzLiRyZXBvcnRDb250YWluZXIgPSBvcHRpb25zLiRyZXBvcnRDb250YWluZXI7XHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy5hbGxvd0VkaXRpbmcgPSBvcHRpb25zLmFsbG93RWRpdGluZztcclxuICAgIHRoaXMuZGVzaWduZXJNb2RlbFVybCA9IG9wdGlvbnMuZGVzaWduZXJNb2RlbFVybDtcclxuICAgIHRoaXMucmVwb3J0SWQgPSBvcHRpb25zLnJlcG9ydFBhcmFtcy5SZXBvcnRJZDtcclxuICB9XHJcblxyXG4gIGluaXQoKTogdm9pZCB7XHJcbiAgICBsZXQgbW9kZSA9IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpKSBhcyBNb2RlIHx8IE1vZGUuVmlld2VyO1xyXG4gICAgbGV0IGJ1dHRvbiA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpIHtcclxuICAgICAgdGhpcy5wb3BvdmVyID0gaW5pdFBvcG92ZXIoJy5yZXBvcnQtZGV0YWlscy1saW5rJywgdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgIGJ1dHRvbiA9ICQoJy5zd2l0Y2gtbW9kZS1idG4nKS5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogbW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyBTV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IFNXSVRDSF9UT19WSUVXRVJfVEVYVCxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICBtb2RlID0gbW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyBNb2RlLkRlc2lnbmVyIDogTW9kZS5WaWV3ZXI7XHJcbiAgICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSwgbW9kZSk7XHJcbiAgICAgICAgICB0aGlzLnN3aXRjaE1vZGUobW9kZSwgYnV0dG9uKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLW1kJykuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jcmVhdGVSZXBvcnREZXNpZ25lcih0aGlzLiRyZXBvcnRDb250YWluZXIsIHRoaXMuZGVzaWduZXJNb2RlbFVybCwgJ2R4UmVwb3J0RGVzaWduZXInLCB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZC50b1N0cmluZygpLCAocykgPT4ge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVN3aXRjaE1vZGVCdXR0b24obW9kZSwgYnV0dG9uKTtcclxuICAgICAgfSk7XHJcbiAgICB9LCBtb2RlID09PSBNb2RlLlZpZXdlcik7XHJcblxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlzTm90U2F2ZWRSZXBvcnQgPSBkeFJlcG9ydERlc2lnbmVyICYmIGR4UmVwb3J0RGVzaWduZXIuR2V0RGVzaWduZXJNb2RlbCgpICYmIGR4UmVwb3J0RGVzaWduZXIuR2V0RGVzaWduZXJNb2RlbCgpLmlzRGlydHkoKTtcclxuXHJcbiAgICAgIGlmIChpc05vdFNhdmVkUmVwb3J0KSB7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGUucmV0dXJuVmFsdWUgPSAnVGhlIHJlcG9ydCBkb2N1bWVudCBpcyBub3Qgc2F2ZWQuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBsZWF2ZSB0aGUgcGFnZT8nO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLnBvcG92ZXI/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMucG9wb3ZlciA9IG51bGw7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplUHJldmlldyhkZXNpZ25lcikge1xyXG4gICAgY29uc3QgcmVwb3J0UHJldmlldyA9IGRlc2lnbmVyLmRlc2lnbmVyTW9kZWwucmVwb3J0UHJldmlld01vZGVsLnJlcG9ydFByZXZpZXc7XHJcbiAgICBjb25zdCBSZXBvcnRQcmV2aWV3U2VydmljZSA9IChEZXZFeHByZXNzIGFzIGFueSkuUmVwb3J0aW5nLkRlc2lnbmVyLkludGVybmFsLlJlcG9ydFByZXZpZXdTZXJ2aWNlO1xyXG5cclxuICAgIHJlcG9ydFByZXZpZXcuaW5pdGlhbGl6ZShSZXBvcnRQcmV2aWV3U2VydmljZS5pbml0aWFsaXplUHJldmlldyhkZXNpZ25lci5kZXNpZ25lck1vZGVsLm1vZGVsKCkpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3dpdGNoTW9kZShtb2RlOiBNb2RlLCBidXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b24pIHtcclxuICAgIGlmIChtb2RlID09PSBNb2RlLlZpZXdlcikge1xyXG4gICAgICBkeFJlcG9ydERlc2lnbmVyLmRlc2lnbmVyTW9kZWwucmVwb3J0UHJldmlld01vZGVsLnJlcG9ydFByZXZpZXcucHJldmlld1Zpc2libGUgPSB0cnVlO1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVQcmV2aWV3KGR4UmVwb3J0RGVzaWduZXIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZHhSZXBvcnREZXNpZ25lci5kZXNpZ25lck1vZGVsLnJlcG9ydFByZXZpZXdNb2RlbC5yZXBvcnRQcmV2aWV3LnByZXZpZXdWaXNpYmxlID0gZmFsc2U7XHJcbiAgICAgIGR4UmVwb3J0RGVzaWduZXIuZGVzaWduZXJNb2RlbC5yZXBvcnRQcmV2aWV3TW9kZWwucmVwb3J0UHJldmlldy5kZWFjdGl2YXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVTd2l0Y2hNb2RlQnV0dG9uKG1vZGUsIGJ1dHRvbik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVN3aXRjaE1vZGVCdXR0b24obW9kZTogTW9kZSwgYnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uKSB7XHJcbiAgICBpZiAoYnV0dG9uKSB7XHJcbiAgICAgIGJ1dHRvbi5vcHRpb24oJ3RleHQnLCBtb2RlID09PSBNb2RlLlZpZXdlciA/IFNXSVRDSF9UT19ERVNJR05FUl9URVhUIDogU1dJVENIX1RPX1ZJRVdFUl9URVhUKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlUmVwb3J0RGVzaWduZXIoXHJcbiAgICAkcmVwb3J0Q29udGFpbmVyOiBKUXVlcnksXHJcbiAgICBkZXNpZ25lck1vZGVsVXJsOiBzdHJpbmcsXHJcbiAgICBnbG9iYWxOYW1lOiBzdHJpbmcsXHJcbiAgICByZXBvcnRJZFN0cjogc3RyaW5nLFxyXG4gICAgb25Jbml0SGFuZGxlcjogKHNlbmRlcjogYW55KSA9PiB2b2lkLFxyXG4gICAgaXNQcmV2aWV3TW9kZTogYm9vbGVhblxyXG4gICk6IEpRdWVyeTxIVE1MRWxlbWVudD4ge1xyXG4gICAgY29uc3QgZGVzaWduZXIgPSAkcmVwb3J0Q29udGFpbmVyXHJcbiAgICAgIC5hdHRyKCdkYXRhLWJpbmQnLCAnZHhSZXBvcnREZXNpZ25lcjogZGVzaWduZXJPcHRpb25zJylcclxuICAgICAgLmFkZENsYXNzKCdyZXBvcnQtZGVzaWduZXInKTtcclxuXHJcbiAgICBjb25zdCBkZXNpZ25lck9wdGlvbnMgPSB7XHJcbiAgICAgIHJlcG9ydFVybDogcmVwb3J0SWRTdHIsXHJcbiAgICAgIHJlcXVlc3RPcHRpb25zOiB7XHJcbiAgICAgICAgZ2V0RGVzaWduZXJNb2RlbEFjdGlvbjogZGVzaWduZXJNb2RlbFVybFxyXG4gICAgICB9LFxyXG4gICAgICBjYWxsYmFja3M6IHtcclxuICAgICAgICBCZWZvcmVSZW5kZXI6IChzKSA9PiB7XHJcbiAgICAgICAgICAod2luZG93IGFzIGFueSlbZ2xvYmFsTmFtZV0gPSBzO1xyXG5cclxuICAgICAgICAgIGlmIChpc1ByZXZpZXdNb2RlKSB7XHJcbiAgICAgICAgICAgIHMuZGVzaWduZXJNb2RlbC5yZXBvcnRQcmV2aWV3TW9kZWwucmVwb3J0UHJldmlldy5wcmV2aWV3VmlzaWJsZSA9IHRydWUgO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIG9uSW5pdEhhbmRsZXIocyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBDdXN0b21pemVNZW51QWN0aW9uczogdGhpcy5DdXN0b21pemVNZW51QWN0aW9ucyxcclxuICAgICAgICBQcmV2aWV3Q3VzdG9taXplTWVudUFjdGlvbnM6IHRoaXMuUHJldmlld0N1c3RvbWl6ZU1lbnVBY3Rpb25zLFxyXG4gICAgICAgIFJlcG9ydE9wZW5lZDogKHMsIGUpID0+IHtcclxuICAgICAgICAgIGlmIChpc1ByZXZpZXdNb2RlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVByZXZpZXcocyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5SZXBvcnRPcGVuZWQocywgZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBSZXBvcnRUYWJDbG9zZWQ6IHRoaXMuUmVwb3J0VGFiQ2xvc2VkXHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAga28uYXBwbHlCaW5kaW5ncyh7IGRlc2lnbmVyT3B0aW9ucyB9LCBkZXNpZ25lclswXSk7XHJcblxyXG4gICAgcmV0dXJuIGRlc2lnbmVyO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBQcmV2aWV3Q3VzdG9taXplTWVudUFjdGlvbnMocywgZSkge1xyXG4gICAgY29uc3Qgc2hvd0Rlc2lnbmVySXRlbSA9IGUuR2V0QnlJZCgoRGV2RXhwcmVzcyBhcyBhbnkpLlJlcG9ydGluZy5WaWV3ZXIuQWN0aW9uSWQuRGVzaWduKTtcclxuXHJcbiAgICBpZiAoc2hvd0Rlc2lnbmVySXRlbSkge1xyXG4gICAgICBzaG93RGVzaWduZXJJdGVtLnZpc2libGUgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgQ3VzdG9taXplTWVudUFjdGlvbnMocywgZSkge1xyXG4gICAgY29uc3QgQWN0aW9uSWQgPSAoRGV2RXhwcmVzcyBhcyBhbnkpLlJlcG9ydGluZy5EZXNpZ25lci5BY3Rpb25zLkFjdGlvbklkO1xyXG4gICAgY29uc3QgYWN0aW9uSWRzVG9Nb3ZlSW5Ub29sYmFyOiBzdHJpbmdbXSA9IFtBY3Rpb25JZC5TYXZlXTtcclxuICAgIGNvbnN0IGFjdGlvbklkc1RvSGlkZTogc3RyaW5nW10gPSBbQWN0aW9uSWQuTmV3UmVwb3J0LCBBY3Rpb25JZC5OZXdSZXBvcnRWaWFXaXphcmQsIEFjdGlvbklkLk9wZW5SZXBvcnQsXHJcbiAgICAgIEFjdGlvbklkLlByZXZpZXcsIEFjdGlvbklkLlNhdmVBcywgQWN0aW9uSWQuRXhpdF07XHJcblxyXG4gICAgYWN0aW9uSWRzVG9Nb3ZlSW5Ub29sYmFyLmZvckVhY2goKGlkKSA9PiB7XHJcbiAgICAgIGNvbnN0IGl0ZW0gPSBlLkdldEJ5SWQoaWQpO1xyXG5cclxuICAgICAgaWYgKGl0ZW0gJiYgKGl0ZW0uY29udGFpbmVyID09PSAnbWVudScpKSB7XHJcbiAgICAgICAgaXRlbS5jb250YWluZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGFjdGlvbklkc1RvSGlkZS5mb3JFYWNoKChpZCkgPT4ge1xyXG4gICAgICBjb25zdCBpdGVtID0gZS5HZXRCeUlkKGlkKTtcclxuXHJcbiAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgaXRlbS52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHNhdmVBY3Rpb24gPSBlLkdldEJ5SWQoKERldkV4cHJlc3MgYXMgYW55KS5SZXBvcnRpbmcuRGVzaWduZXIuQWN0aW9ucy5BY3Rpb25JZC5TYXZlKTtcclxuICAgIGNvbnN0IG9yaWdDbGlja0FjdGlvbiA9IHNhdmVBY3Rpb24uY2xpY2tBY3Rpb247XHJcbiAgICBzYXZlQWN0aW9uLmNsaWNrQWN0aW9uID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCB0YWIgPSBzLkdldEN1cnJlbnRUYWIoKTtcclxuICAgICAgdGFiLnVybChrby51bndyYXAoc1tDVVJSRU5UX1VSTF9LRVldKSk7XHJcbiAgICAgIG9yaWdDbGlja0FjdGlvbigpO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgUmVwb3J0T3BlbmVkKHMsIGUpIHtcclxuICAgIHNbQ1VSUkVOVF9VUkxfS0VZXSA9IHNbQ1VSUkVOVF9VUkxfS0VZXSB8fCBrby5vYnNlcnZhYmxlKCk7XHJcbiAgICBzW0NVUlJFTlRfVVJMX0tFWV0oZS5VcmwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBSZXBvcnRUYWJDbG9zZWQocywgZSkge1xyXG4gICAgc1tDVVJSRU5UX1VSTF9LRVldID0gc1tDVVJSRU5UX1VSTF9LRVldIHx8IGtvLm9ic2VydmFibGUoKTtcclxuICAgIHNbQ1VSUkVOVF9VUkxfS0VZXShudWxsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbktleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIFNFU1NJT05fU1RPUkFHRV9NT0RFX0tFWSArIHRoaXMucmVwb3J0SWQ7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBpbml0UG9wb3ZlciB9IGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVwb3J0RGV0YWlsc1BvcG92ZXInO1xyXG5pbXBvcnQgeyBJUmVwb3J0UGFyYW1zLCBNb2RlIH0gZnJvbSAnLi4vLi4vSVJlcG9ydFBhcmFtcyc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHtJUmVwb3J0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcclxuaW1wb3J0IFJlZnJlc2hCdXR0b24gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZWZyZXNoVGltZXIvQnV0dG9uJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURpYWdyYW1QYWdlT3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcztcclxuICBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XHJcbiAgZGlhZ3JhbUNvbnRyb2xsZXJVcmw6IHN0cmluZztcclxuICBhZGRSZWZyZXNoQnV0dG9uOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEaWFncmFtUGFnZSBpbXBsZW1lbnRzIElSZXBvcnRDb21wb25lbnQge1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IFNXSVRDSF9UT19ERVNJR05FUl9URVhUID0gJ1N3aXRjaCB0byBEZXNpZ25lcic7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBTV0lUQ0hfVE9fVklFV0VSX1RFWFQgPSAnU3dpdGNoIHRvIFZpZXdlcic7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBESUFHUkFNX1NUT1JBR0VfTU9ERV9LRVkgPSAnRElBR1JBTV9TVE9SQUdFX01PREVfS0VZJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkaWFncmFtQ29udHJvbGxlclVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxuXHJcbiAgcHJpdmF0ZSBtb2RlOiBNb2RlO1xyXG4gIHByaXZhdGUgZGlhZ3JhbTogRGV2RXhwcmVzcy51aS5keERpYWdyYW07XHJcbiAgcHJpdmF0ZSBwb3BvdmVyOiBEZXZFeHByZXNzLnVpLmR4UG9wb3ZlciB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlZnJlc2hCdXR0b246IFJlZnJlc2hCdXR0b247XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElEaWFncmFtUGFnZU9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMucmVwb3J0UGFyYW1zID0gb3B0aW9ucy5yZXBvcnRQYXJhbXM7XHJcbiAgICB0aGlzLmFsbG93RWRpdGluZyA9IG9wdGlvbnMuYWxsb3dFZGl0aW5nO1xyXG4gICAgdGhpcy5hZGRSZWZyZXNoQnV0dG9uID0gb3B0aW9ucy5hZGRSZWZyZXNoQnV0dG9uO1xyXG4gICAgdGhpcy5kaWFncmFtQ29udHJvbGxlclVybCA9IG9wdGlvbnMuZGlhZ3JhbUNvbnRyb2xsZXJVcmw7XHJcblxyXG4gICAgdGhpcy5tb2RlID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCkpIGFzIE1vZGUgfHwgTW9kZS5WaWV3ZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdCgpIHtcclxuICAgIHRoaXMuY3JlYXRlRGlhZ3JhbUNvbnRyb2woKTtcclxuICAgIHRoaXMuaW5pdERpYWdyYW0oKTtcclxuXHJcbiAgICBpZiAodGhpcy5hbGxvd0VkaXRpbmcpIHtcclxuICAgICAgdGhpcy5pbml0U3dpdGNoTW9kZUJ1dHRvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMucG9wb3ZlciA9IGluaXRQb3BvdmVyKCcuZGlhZ3JhbS1kZXRhaWxzLWxpbmsnLCB0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy5kaWFncmFtLmRpc3Bvc2UoKTtcclxuICAgIHRoaXMucG9wb3Zlcj8uZGlzcG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaCgpOiB2b2lkIHtcclxuICAgIHNlbmRSZXF1ZXN0KGAke3RoaXMuZGlhZ3JhbUNvbnRyb2xsZXJVcmx9P2lkPSR7dGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWR9YCwgJ2dldCcpLnRoZW4oKGRhdGEpID0+IHtcclxuICAgICAgdGhpcy5kaWFncmFtLmltcG9ydChKU09OLnN0cmluZ2lmeShkYXRhKSwgZmFsc2UpO1xyXG4gICAgICB0aGlzLmRpYWdyYW0ub3B0aW9uKCdoYXNDaGFuZ2VzJywgZmFsc2UpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZURpYWdyYW1Db250cm9sKCkge1xyXG4gICAgdGhpcy5kaWFncmFtID0gdGhpcy4kY29udGFpbmVyLmR4RGlhZ3JhbSh7XHJcbiAgICAgIGhpc3RvcnlUb29sYmFyOiB7XHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICBjb21tYW5kczogWydzZXBhcmF0b3InLCAndW5kbycsICdyZWRvJywgJ3NlcGFyYXRvcicsIHsgbmFtZTogJ3NhdmUnLCB0ZXh0OiAnU2F2ZScsIGljb246ICdzYXZlJyB9XSBhcyBhbnlcclxuICAgICAgfSxcclxuICAgICAgb25DdXN0b21Db21tYW5kOiAoZSkgPT4ge1xyXG4gICAgICAgIHN3aXRjaCAoZS5uYW1lKSB7XHJcbiAgICAgICAgICBjYXNlICdzYXZlJzpcclxuICAgICAgICAgICAgdGhpcy5zYXZlUmVwb3J0KGUuY29tcG9uZW50LmV4cG9ydCgpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBmdWxsU2NyZWVuOiBmYWxzZSxcclxuICAgICAgcmVhZE9ubHk6IHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXJcclxuICAgIH0pLmR4RGlhZ3JhbSgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdERpYWdyYW0oKSB7XHJcbiAgICBzZW5kUmVxdWVzdChgJHt0aGlzLmRpYWdyYW1Db250cm9sbGVyVXJsfT9pZD0ke3RoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkfWAsICdnZXQnKS50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgIHRoaXMuZGlhZ3JhbS5pbXBvcnQoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICB0aGlzLmRpYWdyYW0ub3B0aW9uKCdoYXNDaGFuZ2VzJywgZmFsc2UpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuYWRkUmVmcmVzaEJ1dHRvbikge1xyXG4gICAgICB0aGlzLnJlZnJlc2hCdXR0b24gPSBuZXcgUmVmcmVzaEJ1dHRvbigkKCcucmVwb3J0LXJlZnJlc2gtYnV0dG9uJyksICgpID0+IHRoaXMucmVmcmVzaCgpKTtcclxuICAgIH1cclxuXHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgKGUpID0+IHtcclxuICAgICAgaWYgKHRoaXMuZGlhZ3JhbS5vcHRpb24oJ2hhc0NoYW5nZXMnKSkge1xyXG4gICAgICAgIGUucmV0dXJuVmFsdWUgPSAnVGhlIGRvY3VtZW50IGlzIG5vdCBzYXZlZC4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGxlYXZlIHRoZSBwYWdlPyc7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0U3dpdGNoTW9kZUJ1dHRvbigpIHtcclxuICAgIGNvbnN0IGJ1dHRvbiA9ICQoJy5zd2l0Y2gtbW9kZS1idG4nKS5keEJ1dHRvbih7XHJcbiAgICAgIHRleHQ6IHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyB0aGlzLlNXSVRDSF9UT19ERVNJR05FUl9URVhUIDogdGhpcy5TV0lUQ0hfVE9fVklFV0VSX1RFWFQsXHJcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICB0aGlzLm1vZGUgPSB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gTW9kZS5EZXNpZ25lciA6IE1vZGUuVmlld2VyO1xyXG4gICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpLCB0aGlzLm1vZGUpO1xyXG4gICAgICAgIHRoaXMuZGlhZ3JhbS5vcHRpb24oJ3JlYWRPbmx5JywgdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlcik7XHJcbiAgICAgICAgYnV0dG9uLm9wdGlvbigndGV4dCcsIHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyB0aGlzLlNXSVRDSF9UT19ERVNJR05FUl9URVhUIDogdGhpcy5TV0lUQ0hfVE9fVklFV0VSX1RFWFQpO1xyXG4gICAgICB9XHJcbiAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1tZCcpLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBzYXZlUmVwb3J0KHNvdXJjZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBpZCA9IHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkO1xyXG4gICAgYXdhaXQgc2VuZFJlcXVlc3QodGhpcy5kaWFncmFtQ29udHJvbGxlclVybCwgJ3Bvc3QnLCB7IGlkLCBzb3VyY2UgfSwgdHJ1ZSk7XHJcbiAgICB0aGlzLmRpYWdyYW0ub3B0aW9uKCdoYXNDaGFuZ2VzJywgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTZXNzaW9uS2V5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5ESUFHUkFNX1NUT1JBR0VfTU9ERV9LRVkgKyB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZDtcclxuICB9XHJcbn1cclxuIiwgImltcG9ydCB7SVJlcG9ydENvbXBvbmVudH0gZnJvbSAnLi4vLi4vSVJlcG9ydENvbXBvbmVudCc7XHJcbmltcG9ydCB7TWVudUl0ZW1UeXBlfSBmcm9tICcuLi8uLi8uLi9CdXNpbmVzcyc7XHJcbmltcG9ydCB7SUNkbVJlcG9ydFBhcmFtcywgSUdyaWRSZXBvcnRQYXJhbXMsIElSZXBvcnRQYXJhbXN9IGZyb20gJy4uLy4uL0lSZXBvcnRQYXJhbXMnO1xyXG5pbXBvcnQgUmVmcmVzaFRpbWVyIGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVmcmVzaFRpbWVyL0luZGV4JztcclxuaW1wb3J0IERhc2hib2FyZFJlcG9ydFBhZ2UgZnJvbSAnLi4vRGFzaGJvYXJkL0luZGV4JztcclxuaW1wb3J0IEdyaWRSZXBvcnRQYWdlIGZyb20gJy4uL0dyaWQvSW5kZXgnO1xyXG5pbXBvcnQgQ0RNUmVwb3J0UGFnZSBmcm9tICcuLi9DRE0vSW5kZXgnO1xyXG5pbXBvcnQgRFhSZXBvcnRQYWdlIGZyb20gJy4uL1JlcG9ydC9JbmRleCc7XHJcbmltcG9ydCBEaWFncmFtUmVwb3J0UGFnZSBmcm9tICcuLi9EaWFncmFtL0luZGV4JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU5lc3RlZFJlcG9ydCBleHRlbmRzIElSZXBvcnRQYXJhbXMge1xyXG4gIFR5cGU6IE1lbnVJdGVtVHlwZTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2xpZGVzaG93UmVwb3J0UGFyYW1zIGV4dGVuZHMgSVJlcG9ydFBhcmFtcyB7XHJcbiAgUmVwb3J0czogSU5lc3RlZFJlcG9ydFtdO1xyXG4gIERlbGF5U2VjOiBudW1iZXI7XHJcbiAgUmVmcmVzaFNlYzogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElTbGlkZXNob3dSZXBvcnRQYWdlT3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHJlcG9ydFBhcmFtczogSVNsaWRlc2hvd1JlcG9ydFBhcmFtcztcclxuICBkZWZhdWx0UmVwb3J0U2V0dGluZ3M6IHsgW2tleSBpbiBNZW51SXRlbVR5cGVdOiBhbnk7IH07XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNsaWRlc2hvd1JlcG9ydFBhZ2UgaW1wbGVtZW50cyBJUmVwb3J0Q29tcG9uZW50IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IElTbGlkZXNob3dSZXBvcnRQYXJhbXM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkcm9vdEVsZW1lbnQ6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRSZXBvcnRTZXR0aW5nczogeyBba2V5IGluIE1lbnVJdGVtVHlwZV06IGFueTsgfTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlcG9ydHM6IElSZXBvcnRDb21wb25lbnRbXSA9IFtdO1xyXG4gIHByaXZhdGUgZHhHYWxsZXJ5OiBEZXZFeHByZXNzLnVpLmR4R2FsbGVyeTtcclxuICBwcml2YXRlIHJlZnJlc2hUaW1lb3V0OiBSZWZyZXNoVGltZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElTbGlkZXNob3dSZXBvcnRQYWdlT3B0aW9ucykge1xyXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucy5yZXBvcnRQYXJhbXM7XHJcbiAgICB0aGlzLiRyb290RWxlbWVudCA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZGVmYXVsdFJlcG9ydFNldHRpbmdzID0gb3B0aW9ucy5kZWZhdWx0UmVwb3J0U2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdCgpIHtcclxuICAgIHRoaXMucmVuZGVyQ29udGVudCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLnJlcG9ydHMuZm9yRWFjaCgocmVwb3J0KSA9PiB7XHJcbiAgICAgIHJlcG9ydC5kaXNwb3NlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZXBvcnRzLmZvckVhY2goKHJlcG9ydCkgPT4ge1xyXG4gICAgICByZXBvcnQucmVmcmVzaCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckNvbnRlbnQoKSB7XHJcbiAgICBsZXQgY3VycmVudEluZGV4ID0gMDtcclxuICAgIGxldCBjdXJyZW50VGltZW91dCA9IG51bGw7XHJcbiAgICBjb25zdCBtYXhJbmRleCA9IHRoaXMub3B0aW9ucy5SZXBvcnRzLmxlbmd0aDtcclxuXHJcbiAgICBjb25zdCBzZXR1cE5leHRJdGVtU2VsZWN0ID0gKCkgPT4ge1xyXG4gICAgICBjdXJyZW50VGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBsZXQgbmV4dEluZGV4ID0gY3VycmVudEluZGV4ICsgMTtcclxuXHJcbiAgICAgICAgaWYobmV4dEluZGV4ID49IG1heEluZGV4KSB7XHJcbiAgICAgICAgICBuZXh0SW5kZXggPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5keEdhbGxlcnkuZ29Ub0l0ZW0obmV4dEluZGV4LCB0cnVlKTtcclxuICAgICAgfSwgdGhpcy5vcHRpb25zLkRlbGF5U2VjICogMTAwMCk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0ICR2aWV3ID0gJCgnPGRpdiAvPicpLmF0dHIoeyBjbGFzczogJ3NsaWRlc2hvdy1yZXBvcnQnIH0pLmFwcGVuZFRvKHRoaXMuJHJvb3RFbGVtZW50KTtcclxuICAgIGNvbnN0ICRnYWxsZXJ5ID0gJCgnPGRpdiAvPicsIHsgY2xhc3M6ICdzbGlkZXNob3ctcmVwb3J0X19nYWxsZXJ5JyB9KS5keEdhbGxlcnkoe1xyXG4gICAgICBsb29wOiBmYWxzZSxcclxuICAgICAgZGF0YVNvdXJjZTogdGhpcy5vcHRpb25zLlJlcG9ydHMsXHJcbiAgICAgIHNsaWRlc2hvd0RlbGF5OiAwLFxyXG4gICAgICBzaG93TmF2QnV0dG9uczogZmFsc2UsXHJcbiAgICAgIHNob3dJbmRpY2F0b3I6IHRydWUsXHJcbiAgICAgIHN0cmV0Y2hJbWFnZXM6IHRydWUsXHJcbiAgICAgIGhlaWdodDogJzEwMCUnLFxyXG4gICAgICBvbkluaXRpYWxpemVkOiAoKSA9PiBzZXR1cE5leHRJdGVtU2VsZWN0KCksXHJcbiAgICAgIG9uU2VsZWN0aW9uQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICBjdXJyZW50SW5kZXggPSBlLmNvbXBvbmVudC5vcHRpb24oJ3NlbGVjdGVkSW5kZXgnKTtcclxuXHJcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChjdXJyZW50VGltZW91dCk7XHJcbiAgICAgICAgc2V0dXBOZXh0SXRlbVNlbGVjdCgpO1xyXG4gICAgICB9LFxyXG4gICAgICBpdGVtVGVtcGxhdGU6IChyZXBvcnRQYXJhbXM6IElOZXN0ZWRSZXBvcnQsIGluZGV4LCBpdGVtRWxlbWVudCkgPT4ge1xyXG4gICAgICAgIGl0ZW1FbGVtZW50LmF0dHIoeyBjbGFzczogJ3NsaWRlc2hvdy1yZXBvcnRfX2dhbGxlcnktaXRlbScgfSkuaGVpZ2h0KCcxMDAlJyk7XHJcblxyXG4gICAgICAgIGNvbnN0ICRzbGlkZUVsZW1lbnQgPSAkKCc8ZGl2IC8+JywgeyBjbGFzczogJ3NsaWRlc2hvdy1yZXBvcnRfX3NsaWRlLWNvbnRlbnQnIH0pLmhlaWdodCgnMTAwJScpO1xyXG4gICAgICAgIGxldCByZXBvcnRTbGlkZTogSVJlcG9ydENvbXBvbmVudDtcclxuXHJcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgc3dpdGNoIChyZXBvcnRQYXJhbXMuVHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIE1lbnVJdGVtVHlwZS5EYXNoYm9hcmQ6XHJcbiAgICAgICAgICAgICAgY29uc3QgJGRhc2hib2FyZFBvc2l0aW9uRWxlbWVudCA9ICQoJzxkaXYgLz4nLCB7IGNsYXNzOiAncmVwb3J0LXBvc2l0aW9uJyB9KTtcclxuICAgICAgICAgICAgICAkZGFzaGJvYXJkUG9zaXRpb25FbGVtZW50LmFwcGVuZFRvKCRzbGlkZUVsZW1lbnQpO1xyXG5cclxuICAgICAgICAgICAgICByZXBvcnRTbGlkZSA9IG5ldyBEYXNoYm9hcmRSZXBvcnRQYWdlKHtcclxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5nc1tNZW51SXRlbVR5cGUuRGFzaGJvYXJkXSB8fCB7fSksXHJcbiAgICAgICAgICAgICAgICAkZGFzaGJvYXJkQ29udGFpbmVyOiAkZGFzaGJvYXJkUG9zaXRpb25FbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgcmVwb3J0UGFyYW1zOiByZXBvcnRQYXJhbXMgYXMgSVJlcG9ydFBhcmFtc1xyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAkc2xpZGVFbGVtZW50LmZpbmQoJ2Rhc2hib2FyZC10aXRsZScpLmhpZGUoKTtcclxuICAgICAgICAgICAgICAkc2xpZGVFbGVtZW50LmZpbmQoJy5keC1kYXNoYm9hcmQtbGF5b3V0LWNvbnRhaW5lcicpLmNzcyh7IHRvcDogMCB9KTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgTWVudUl0ZW1UeXBlLkdyaWRWaWV3OlxyXG4gICAgICAgICAgICAgIGNvbnN0ICRncmlkUG9zaXRpb25FbGVtZW50ID0gJCgnPGRpdiAvPicsIHsgY2xhc3M6ICdzbGlkZXNob3ctcmVwb3J0X19ncmlkLXBvc2l0aW9uJyB9KTtcclxuICAgICAgICAgICAgICAkc2xpZGVFbGVtZW50LmFkZENsYXNzKCdpc3pvbGVhLXRoZW1lJykuYWRkQ2xhc3MoJ3BhbmVsLWJvZHknKTtcclxuXHJcbiAgICAgICAgICAgICAgJGdyaWRQb3NpdGlvbkVsZW1lbnQuYXBwZW5kVG8oJHNsaWRlRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgcmVwb3J0U2xpZGUgPSBuZXcgR3JpZFJlcG9ydFBhZ2Uoe1xyXG4gICAgICAgICAgICAgICAgLi4uKHRoaXMuZGVmYXVsdFJlcG9ydFNldHRpbmdzW01lbnVJdGVtVHlwZS5HcmlkVmlld10gfHwge30pLFxyXG4gICAgICAgICAgICAgICAgZ3JpZFBvc2l0aW9uTWFya2VyOiAkZ3JpZFBvc2l0aW9uRWxlbWVudCxcclxuICAgICAgICAgICAgICAgIHJlcG9ydFBhcmFtczogcmVwb3J0UGFyYW1zIGFzIGFueSBhcyBJR3JpZFJlcG9ydFBhcmFtcyxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuQ0RNOlxyXG4gICAgICAgICAgICAgIHJlcG9ydFNsaWRlID0gbmV3IENETVJlcG9ydFBhZ2Uoe1xyXG4gICAgICAgICAgICAgICAgLi4uKHRoaXMuZGVmYXVsdFJlcG9ydFNldHRpbmdzW01lbnVJdGVtVHlwZS5DRE1dIHx8IHt9KSxcclxuICAgICAgICAgICAgICAgICRjb250YWluZXI6ICRzbGlkZUVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICByZXBvcnRQYXJhbXM6IHJlcG9ydFBhcmFtcyBhcyBhbnkgYXMgSUNkbVJlcG9ydFBhcmFtcyxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuUmVwb3J0OlxyXG4gICAgICAgICAgICAgIGNvbnN0ICRyZXBvcnRQb3NpdGlvbkVsZW1lbnQgPSAkKCc8ZGl2IC8+JywgeyBjbGFzczogJ3JlcG9ydC1wb3NpdGlvbicgfSk7XHJcbiAgICAgICAgICAgICAgJHJlcG9ydFBvc2l0aW9uRWxlbWVudC5hcHBlbmRUbygkc2xpZGVFbGVtZW50KTtcclxuICAgICAgICAgICAgICByZXBvcnRTbGlkZSA9IG5ldyBEWFJlcG9ydFBhZ2Uoe1xyXG4gICAgICAgICAgICAgICAgLi4uKHRoaXMuZGVmYXVsdFJlcG9ydFNldHRpbmdzW01lbnVJdGVtVHlwZS5SZXBvcnRdIHx8IHt9KSxcclxuICAgICAgICAgICAgICAgICRyZXBvcnRDb250YWluZXI6ICRyZXBvcnRQb3NpdGlvbkVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICByZXBvcnRQYXJhbXM6IHJlcG9ydFBhcmFtcyBhcyBJUmVwb3J0UGFyYW1zLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIE1lbnVJdGVtVHlwZS5EaWFncmFtOlxyXG4gICAgICAgICAgICAgIGNvbnN0ICRkaWFncmFtUG9zaXRpb25FbGVtZW50ID0gJCgnPGRpdiAvPicsIHsgY2xhc3M6ICdyZXBvcnQtcG9zaXRpb24nIH0pO1xyXG4gICAgICAgICAgICAgICRkaWFncmFtUG9zaXRpb25FbGVtZW50LmFwcGVuZFRvKCRzbGlkZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgIHJlcG9ydFNsaWRlID0gbmV3IERpYWdyYW1SZXBvcnRQYWdlKHtcclxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5nc1tNZW51SXRlbVR5cGUuRGlhZ3JhbV0gfHwge30pLFxyXG4gICAgICAgICAgICAgICAgJGNvbnRhaW5lcjogJGRpYWdyYW1Qb3NpdGlvbkVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICByZXBvcnRQYXJhbXM6IHJlcG9ydFBhcmFtcyBhcyBJUmVwb3J0UGFyYW1zLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIE1lbnVJdGVtVHlwZS5NZW51Tm9kZTpcclxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuU2xpZGVzaG93OlxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChyZXBvcnRTbGlkZSkge1xyXG4gICAgICAgICAgICByZXBvcnRTbGlkZS5pbml0KCk7XHJcbiAgICAgICAgICAgIHRoaXMucmVwb3J0cy5wdXNoKHJlcG9ydFNsaWRlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCA1MDApO1xyXG5cclxuICAgICAgICAkc2xpZGVFbGVtZW50LmFwcGVuZFRvKGl0ZW1FbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5keEdhbGxlcnkgPSAkZ2FsbGVyeS5keEdhbGxlcnkoJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgJGdhbGxlcnkuYXBwZW5kVG8oJHZpZXcpO1xyXG5cclxuICAgIHRoaXMucmVmcmVzaFRpbWVvdXQgPSBuZXcgUmVmcmVzaFRpbWVyKHtjYWxsYmFjazogKCkgPT4gdGhpcy5yZWZyZXNoKCksIGVsYXBzZWRDYWxsYmFjazogKGUpID0+IHt9fSk7XHJcbiAgICB0aGlzLnJlZnJlc2hUaW1lb3V0LnN0YXJ0KHRoaXMub3B0aW9ucy5SZWZyZXNoU2VjICogMTAwMCk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJUmVwb3J0UGFyYW1zLCBNb2RlIH0gZnJvbSAnLi4vLi4vSVJlcG9ydFBhcmFtcyc7XHJcbmltcG9ydCB7IElSZXBvcnRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcclxuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi9EYXRhL1JlcXVlc3QnO1xyXG5pbXBvcnQgeyBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlIH0gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9JR3JpZFN0YXRlJztcclxuaW1wb3J0IHsgaW5pdFBvcG92ZXIgfSBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdhbnR0Q2hhcnRPcHRpb25zIHtcclxuICBjaGFydFBvc2l0aW9uTWFya2VyOiBKUXVlcnk7XHJcbiAgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcztcclxuICBhZGRSZWZyZXNoQnV0dG9uOiBib29sZWFuO1xyXG4gIGdhbnR0UmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nO1xyXG4gIHNob3dIZWFkZXI6IGJvb2xlYW47XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR2FudHRUYXNrIHtcclxuICBJZDogbnVtYmVyO1xyXG4gIFBhcmVudElkOiBudW1iZXI7XHJcbiAgVGl0bGU6IHN0cmluZztcclxuICBTdGFydDogRGF0ZTtcclxuICBFbmQ6IERhdGU7XHJcbiAgUHJvZ3Jlc3M6IG51bWJlcjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElHYW50dERlcGVuZGVuY3lcclxue1xyXG4gIElkOiBudW1iZXI7XHJcbiAgUHJlZGVjZXNzb3JJZDogbnVtYmVyO1xyXG4gIFN1Y2Nlc3NvcklkOiBudW1iZXI7XHJcbiAgVHlwZTogbnVtYmVyO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdhbnR0UmVzb3VyY2Uge1xyXG4gIElkOiBudW1iZXI7XHJcbiAgVGV4dDogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdhbnR0UmVzb3VyY2VBc3NpZ25tZW50IHtcclxuICBJZDogbnVtYmVyO1xyXG4gIFRhc2tJZDogbnVtYmVyO1xyXG4gIFJlc291cmNlSWQ6IG51bWJlcjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElHYW50dENoYXJ0RGF0YU1vZGVsIHtcclxuICBUYXNrczogSUdhbnR0VGFza1tdO1xyXG4gIERlcGVuZGVuY2llczogSUdhbnR0RGVwZW5kZW5jeVtdO1xyXG4gIFJlc291cmNlczogSUdhbnR0UmVzb3VyY2VbXTtcclxuICBSZXNvdXJjZUFzc2lnbm1lbnRzOiBJR2FudHRSZXNvdXJjZUFzc2lnbm1lbnRbXTtcclxufVxyXG5cclxuaW50ZXJmYWNlIElHYW50dENvbHVtblN0YXRlIHtcclxuICBkYXRhRmllbGQ/OiBzdHJpbmc7XHJcbiAgZGF0YVR5cGU/OiBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlO1xyXG4gIHdpZHRoPzogc3RyaW5nO1xyXG4gIHNvcnRJbmRleD86IG51bWJlcjtcclxuICBzb3J0T3JkZXI/OiBzdHJpbmc7XHJcbiAgY2FwdGlvbj86IHN0cmluZztcclxuICB2aXNpYmxlPzogYm9vbGVhbjtcclxuICB2aXNpYmxlSW5kZXg/OiBudW1iZXI7XHJcbiAgdGFza0NvbHVtblR5cGU6IEdhbnR0VGFza3NDb2x1bW5UeXBlO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdhbnR0U2V0dGluZ3Mge1xyXG4gIFRhc2tDb2x1bW5zOiBJR2FudHRDb2x1bW5TdGF0ZVtdLFxyXG4gIERiQ29ubmVjdGlvbk5hbWU6IHN0cmluZyxcclxuICBUYWJsZU5hbWU6IHN0cmluZyxcclxuICBSZXNvdXJjZXNUYWJsZU5hbWU6IHN0cmluZyxcclxuICBSZXNvdXJjZXNLZXlGaWVsZDogc3RyaW5nLFxyXG4gIFJlc291cmNlc1RleHRGaWVsZDogc3RyaW5nLFxyXG4gIFJlc291cmNlQXNzaWdubWVudFRhYmxlTmFtZTogc3RyaW5nO1xyXG4gIFJlc291cmNlQXNzaWdubWVudEtleUZpZWxkOiBzdHJpbmc7XHJcbiAgUmVzb3VyY2VBc3NpZ25tZW50VGFza0lkRmllbGQ6IHN0cmluZztcclxuICBSZXNvdXJjZUFzc2lnbm1lbnRSZXNvdXJjZUlkRmllbGQ6IHN0cmluZztcclxufVxyXG5cclxuZW51bSBHYW50dFRhc2tzQ29sdW1uVHlwZVxyXG57XHJcbiAgS2V5ID0gMSxcclxuICBUaXRsZSA9IDIsXHJcbiAgU3RhcnQgPSAzLFxyXG4gIEVuZCA9IDQsXHJcbiAgUGFyZW50SWQgPSA1LFxyXG4gIFByb2dyZXNzID0gNlxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHYW5udENoYXJ0IGltcGxlbWVudHMgSVJlcG9ydENvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBTV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA9ICdTd2l0Y2ggdG8gRGVzaWduZXInO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1dJVENIX1RPX1ZJRVdFUl9URVhUID0gJ1N3aXRjaCB0byBWaWV3ZXInO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgQ0hBUlRfU1RPUkFHRV9NT0RFX0tFWSA9ICdDSEFSVF9TVE9SQUdFX01PREVfS0VZJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBjaGFydFBvc2l0aW9uTWFya2VyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhZGRSZWZyZXNoQnV0dG9uOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93SGVhZGVyOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcG9wb3ZlcjogRGV2RXhwcmVzcy51aS5keFBvcG92ZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBtb2RlOiBNb2RlO1xyXG4gIHByaXZhdGUgaGFzRm9ybSA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGNoYXJ0OiBEZXZFeHByZXNzLnVpLmR4R2FudHQgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcztcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUdhbnR0Q2hhcnRPcHRpb25zKSB7XHJcbiAgICB0aGlzLmNoYXJ0UG9zaXRpb25NYXJrZXIgPSBvcHRpb25zLmNoYXJ0UG9zaXRpb25NYXJrZXI7XHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy5hZGRSZWZyZXNoQnV0dG9uID0gb3B0aW9ucy5hZGRSZWZyZXNoQnV0dG9uO1xyXG4gICAgdGhpcy5hbGxvd0VkaXRpbmcgPSBvcHRpb25zLmFsbG93RWRpdGluZztcclxuICAgIHRoaXMuZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsID0gb3B0aW9ucy5nYW50dFJlcG9ydENvbnRyb2xsZXJVcmw7XHJcbiAgICB0aGlzLnNob3dIZWFkZXIgPSBvcHRpb25zLnNob3dIZWFkZXI7XHJcbiAgICB0aGlzLm1vZGUgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSkgYXMgTW9kZSB8fCBNb2RlLlZpZXdlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0KCk6IHZvaWQge1xyXG4gICAgbGV0IGdhbnR0U2V0dGluZ3M6IElHYW50dFNldHRpbmdzID0ge1xyXG4gICAgICBEYkNvbm5lY3Rpb25OYW1lOiAnJywgVGFibGVOYW1lOiAnJywgVGFza0NvbHVtbnM6IFtdLFxyXG4gICAgICBSZXNvdXJjZXNUYWJsZU5hbWU6ICcnLCBSZXNvdXJjZXNUZXh0RmllbGQ6ICcnLCBSZXNvdXJjZXNLZXlGaWVsZDogJycsXHJcbiAgICAgIFJlc291cmNlQXNzaWdubWVudFRhc2tJZEZpZWxkOiAnJywgUmVzb3VyY2VBc3NpZ25tZW50UmVzb3VyY2VJZEZpZWxkOiAnJywgUmVzb3VyY2VBc3NpZ25tZW50S2V5RmllbGQ6ICcnLCBSZXNvdXJjZUFzc2lnbm1lbnRUYWJsZU5hbWU6ICcnXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGNvbHVtbnM6IElHYW50dENvbHVtblN0YXRlW10gPSBbXTtcclxuICAgIGxldCBpc0luaXRpYWxpemVkID0gZmFsc2U7XHJcblxyXG4gICAgc2VuZFJlcXVlc3QoYCR7dGhpcy5nYW50dFJlcG9ydENvbnRyb2xsZXJVcmx9L0dldEdhbnR0Q2hhcnRTZXR0aW5nc2AsICdwb3N0JywgeyBpZDogdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQgfSwgZmFsc2UsIHsgZGF0YVR5cGU6ICdqc29uJyB9KVxyXG4gICAgICAudGhlbigoZGF0YTogSUdhbnR0U2V0dGluZ3MpID0+IHtcclxuICAgICAgICBnYW50dFNldHRpbmdzID0gZGF0YTtcclxuXHJcbiAgICAgICAgaWYoIWdhbnR0U2V0dGluZ3MuRGJDb25uZWN0aW9uTmFtZSB8fCAhZ2FudHRTZXR0aW5ncy5UYWJsZU5hbWUgfHwgIWdhbnR0U2V0dGluZ3MuVGFza0NvbHVtbnMgfHwgIWdhbnR0U2V0dGluZ3MuVGFza0NvbHVtbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBnYW50dFNldHRpbmdzLlRhc2tDb2x1bW5zID0gW107XHJcblxyXG4gICAgICAgICAgZm9yIChsZXQgaXRlbSA9IDA7IGl0ZW0gPCA2OyBpdGVtKyspIHtcclxuICAgICAgICAgICAgZ2FudHRTZXR0aW5ncy5UYXNrQ29sdW1ucy5wdXNoKHsgdGFza0NvbHVtblR5cGU6IEdhbnR0VGFza3NDb2x1bW5UeXBlW0dhbnR0VGFza3NDb2x1bW5UeXBlW2l0ZW0rMV1dIH0pO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuc2V0dXBGb3JtKGdhbnR0U2V0dGluZ3MsIHRydWUpO1xyXG5cclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRhdGEuVGFza0NvbHVtbnMuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgICAgY29sdW1uc1tjLnRhc2tDb2x1bW5UeXBlLTFdID0gYztcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZ2FudHRTZXR0aW5ncy5UYXNrQ29sdW1ucyA9IGNvbHVtbnM7XHJcblxyXG4gICAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gc2VuZFJlcXVlc3QoYCR7dGhpcy5nYW50dFJlcG9ydENvbnRyb2xsZXJVcmx9L0dldEdhbnR0Q2hhcnREYXRhYCwgJ3Bvc3QnLCB7IGlkOiB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZCB9LCBmYWxzZSwge1xyXG4gICAgICAgICAgZGF0YVR5cGU6ICdqc29uJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KVxyXG4gICAgICAudGhlbigoZGF0YTogeyBEYXRhOiBJR2FudHRDaGFydERhdGFNb2RlbCB9KSA9PiB7XHJcbiAgICAgICAgaWYoIWlzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKHRoaXMubW9kZSA9PT0gTW9kZS5EZXNpZ25lcikge1xyXG4gICAgICAgICAgdGhpcy5zZXR1cEZvcm0oZ2FudHRTZXR0aW5ncywgIWlzSW5pdGlhbGl6ZWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXR1cENoYXJ0KGRhdGEuRGF0YSwgY29sdW1ucywgZ2FudHRTZXR0aW5ncyk7XHJcbiAgICAgIH0pLmNhdGNoKCgpID0+IHtcclxuICAgICAgICB0aGlzLnNldHVwRm9ybShnYW50dFNldHRpbmdzLCB0cnVlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0aGlzLmFsbG93RWRpdGluZykge1xyXG4gICAgICB0aGlzLmluaXRTd2l0Y2hNb2RlQnV0dG9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpIHtcclxuICAgICAgdGhpcy5wb3BvdmVyID0gaW5pdFBvcG92ZXIoJy5kaWFncmFtLWRldGFpbHMtbGluaycsIHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0U3dpdGNoTW9kZUJ1dHRvbigpIHtcclxuICAgIGNvbnN0IGJ1dHRvbiA9ICQoJy5zd2l0Y2gtbW9kZS1idG4nKS5keEJ1dHRvbih7XHJcbiAgICAgIHRleHQ6IHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyB0aGlzLlNXSVRDSF9UT19ERVNJR05FUl9URVhUIDogdGhpcy5TV0lUQ0hfVE9fVklFV0VSX1RFWFQsXHJcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICB0aGlzLm1vZGUgPSB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gTW9kZS5EZXNpZ25lciA6IE1vZGUuVmlld2VyO1xyXG4gICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpLCB0aGlzLm1vZGUpO1xyXG4gICAgICAgIGJ1dHRvbi5vcHRpb24oJ3RleHQnLCB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gdGhpcy5TV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IHRoaXMuU1dJVENIX1RPX1ZJRVdFUl9URVhUKTtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgIH1cclxuICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLW1kJykuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwRm9ybShnYW50dFNldHRpbmdzOiBJR2FudHRTZXR0aW5ncywgaW5pdGlhbFNldHVwOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmhhc0Zvcm0gPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0IGZvcm1JdGVtczogRGV2RXhwcmVzcy51aS5keEZvcm0uSXRlbVtdID0gW1xyXG4gICAgICB7IGRhdGFGaWVsZDogJ0RiQ29ubmVjdGlvbk5hbWUnLCBjYXB0aW9uOiAnQ29ubmVjdGlvbiBOYW1lJyB9LFxyXG4gICAgICB7IGRhdGFGaWVsZDogJ1RhYmxlTmFtZScsIGNhcHRpb246ICdUYWJsZScgfSxcclxuICAgIF07XHJcblxyXG4gICAgZm9yIChsZXQgaXRlbSA9IDE7IGl0ZW0gPCA3OyBpdGVtKyspIHtcclxuICAgICAgZm9ybUl0ZW1zLnB1c2goeyBpdGVtVHlwZTogJ2dyb3VwJywgY29sQ291bnQ6IDgsIGl0ZW1zOiBbXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0udGFza0NvbHVtblR5cGVgLCB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLmRhdGFGaWVsZGAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogYCR7R2FudHRUYXNrc0NvbHVtblR5cGVbaXRlbV19IERhdGEgRmllbGRgIH0gfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS5jYXB0aW9uYCwgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnQ2FwdGlvbicgfSB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLmRhdGFUeXBlYCwgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnRGF0YVR5cGUnIH0gfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS53aWR0aGAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1dpZHRoJyB9LCBlZGl0b3JUeXBlOiAnZHhOdW1iZXJCb3gnIH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0uc29ydEluZGV4YCwgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnU29ydEluZGV4JyB9LCBlZGl0b3JUeXBlOiAnZHhOdW1iZXJCb3gnIH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0uc29ydE9yZGVyYCwgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnU29ydE9yZGVyJyB9LCBlZGl0b3JUeXBlOiAnZHhTZWxlY3RCb3gnLCBlZGl0b3JPcHRpb25zOiB7IGl0ZW1zOiBbJ2FzYycsICdkZXNjJ10sIHNob3dDbGVhckJ1dHRvbjogdHJ1ZSB9IGFzIERldkV4cHJlc3MudWkuZHhTZWxlY3RCb3guUHJvcGVydGllcyB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLnZpc2libGVgLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdWaXNpYmxlJyB9LCBlZGl0b3JUeXBlOiAnZHhDaGVja0JveCcgfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS52aXNpYmxlSW5kZXhgLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdWaXNpYmxlSW5kZXgnIH0gfSxcclxuICAgICAgICBdXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZvcm1JdGVtcy5wdXNoKHtcclxuICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgIGNhcHRpb246ICdSZXNvdXJjZXMnLFxyXG4gICAgICBjb2xDb3VudDogNCxcclxuICAgICAgaXRlbXM6IFtcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ1Jlc291cmNlc1RhYmxlTmFtZScsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJyAsdGV4dDogJ1RhYmxlJyB9LCBjb2xTcGFuOiAyIH0sXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdSZXNvdXJjZXNLZXlGaWVsZCcsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ0tleSBGaWVsZCcgfSB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnUmVzb3VyY2VzVGV4dEZpZWxkJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnVGV4dCBGaWVsZCcgfSB9LFxyXG4gICAgICBdXHJcbiAgICB9KTtcclxuXHJcbiAgICBmb3JtSXRlbXMucHVzaCh7XHJcbiAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxyXG4gICAgICBjYXB0aW9uOiAnUmVzb3VyY2UgQXNzaWdubWVudHMnLFxyXG4gICAgICBjb2xDb3VudDogNSxcclxuICAgICAgaXRlbXM6IFtcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ1Jlc291cmNlQXNzaWdubWVudFRhYmxlTmFtZScsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1RhYmxlJyB9LCBjb2xTcGFuOiAyIH0sXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdSZXNvdXJjZUFzc2lnbm1lbnRLZXlGaWVsZCcsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ0tleSBGaWVsZCcgfSB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnUmVzb3VyY2VBc3NpZ25tZW50VGFza0lkRmllbGQnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdUYXNrIElkIEZpZWxkJyB9IH0sXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdSZXNvdXJjZUFzc2lnbm1lbnRSZXNvdXJjZUlkRmllbGQnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdSZXNvdXJjZSBJZCBGaWVsZCcgfSB9LFxyXG4gICAgICBdXHJcbiAgICB9KTtcclxuXHJcbiAgICBmb3JtSXRlbXMucHVzaCh7XHJcbiAgICAgIGl0ZW1UeXBlOiAnYnV0dG9uJyxcclxuICAgICAgYnV0dG9uT3B0aW9uczoge1xyXG4gICAgICAgIHRleHQ6ICdTYXZlJyxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBkYXRhID0gZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJykgYXMgSUdhbnR0U2V0dGluZ3M7XHJcblxyXG4gICAgICAgICAgaWYoZGF0YS5UYXNrQ29sdW1ucykge1xyXG4gICAgICAgICAgICBkYXRhLlRhc2tDb2x1bW5zID0gZGF0YS5UYXNrQ29sdW1ucy5maWx0ZXIoKGMpID0+ICEhYy5kYXRhRmllbGQpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHNlbmRSZXF1ZXN0KGAke3RoaXMuZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsfS9VcGRhdGVHYW50dENoYXJ0U2V0dGluZ3NgLCAncG9zdCcsIHsgaWQ6IHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkLCBzZXR0aW5nczogSlNPTi5zdHJpbmdpZnkoZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJykpIH0sIHRydWUsIHsgZGF0YVR5cGU6ICdqc29uJyB9KVxyXG4gICAgICAgICAgICAudGhlbigoKSA9PiB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgZm9ybSA9ICQoJzxkaXYgLz4nKS5jc3MoJ3BhZGRpbmcnLCAyMCkuaW5zZXJ0QWZ0ZXIodGhpcy5jaGFydFBvc2l0aW9uTWFya2VyKS5keEZvcm0oe1xyXG4gICAgICB3aWR0aDogJzEwMCUnLFxyXG4gICAgICBoZWlnaHQ6IGluaXRpYWxTZXR1cCA/ICdjYWxjKDEwMCUgLSA1MHB4KScgOiAnY2FsYyg1MCUgLSA1MHB4KScsXHJcbiAgICAgIGZvcm1EYXRhOiBnYW50dFNldHRpbmdzLFxyXG4gICAgICBzY3JvbGxpbmdFbmFibGVkOiB0cnVlLFxyXG4gICAgICBpdGVtczogZm9ybUl0ZW1zXHJcbiAgICB9KS5keEZvcm0oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwQ2hhcnQgKGRhdGE6IElHYW50dENoYXJ0RGF0YU1vZGVsLCBjb2x1bW5zOiBJR2FudHRDb2x1bW5TdGF0ZVtdLCBnYW50dFNldHRpbmdzOiBJR2FudHRTZXR0aW5ncykge1xyXG4gICAgbGV0IHRvdGFsV2lkdGggPSAwO1xyXG4gICAgbGV0IHVzZUF1dG9XaWR0aCA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IGNvbHVtbnNNYXBwaW5nID0ge307XHJcblxyXG4gICAgY29sdW1ucy5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgIGlmIChjLnRhc2tDb2x1bW5UeXBlKSB7XHJcbiAgICAgICAgY29sdW1uc01hcHBpbmdbYy50YXNrQ29sdW1uVHlwZV0gPSBjLmRhdGFGaWVsZDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgY29sdW1ucy5maWx0ZXIoKGMpID0+IGMudmlzaWJsZSkuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICBjb25zdCB3ID0gcGFyc2VJbnQoYy53aWR0aCk7XHJcblxyXG4gICAgICBpZighaXNOYU4odykpIHtcclxuICAgICAgICB0b3RhbFdpZHRoICs9IHc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdXNlQXV0b1dpZHRoID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jaGFydCA9IHRoaXMuY2hhcnRQb3NpdGlvbk1hcmtlci5keEdhbnR0KHtcclxuICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgaGVpZ2h0OiB0aGlzLmhhc0Zvcm0gPyAnNTAlJyA6ICdjYWxjKDEwMCUgLSA2MHB4KScsXHJcbiAgICAgIGZpcnN0RGF5T2ZXZWVrOiA2LFxyXG4gICAgICB0YXNrTGlzdFdpZHRoOiAoIXVzZUF1dG9XaWR0aCAmJiB0b3RhbFdpZHRoID4gMCkgPyB0b3RhbFdpZHRoIDogdm9pZCAwLFxyXG4gICAgICB0b29sYmFyOiB7XHJcbiAgICAgICAgaXRlbXM6IFsnem9vbUluJywgJ3pvb21PdXQnLCAnc2VwYXJhdG9yJywgJ3Rhc2tEZXRhaWxzJ11cclxuICAgICAgfSxcclxuICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgY29sdW1uczogY29sdW1ucy5maWx0ZXIoKGMpID0+IGMudmlzaWJsZSkubWFwKChjKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogYy5kYXRhRmllbGQsXHJcbiAgICAgICAgICBkYXRhVHlwZTogYy5kYXRhVHlwZSxcclxuICAgICAgICAgIHdpZHRoOiBjLndpZHRoLFxyXG4gICAgICAgICAgdmlzaWJsZUluZGV4OiBjLnZpc2libGVJbmRleCxcclxuICAgICAgICAgIHNvcnRJbmRleDogYy5zb3J0SW5kZXgsXHJcbiAgICAgICAgICBzb3J0T3JkZXI6IGMuc29ydE9yZGVyICYmIChjLnNvcnRPcmRlciA9PT0gJ2FzYycgPyAnYXNjJyA6ICdkZXNjJyksXHJcbiAgICAgICAgICBjYXB0aW9uOiBjLmNhcHRpb24gfHwgdm9pZCAwXHJcbiAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RDb2x1bW5cclxuICAgICAgfSksXHJcbiAgICAgIHRhc2tzOiB7XHJcbiAgICAgICAgZGF0YVNvdXJjZTogZGF0YS5UYXNrcyxcclxuICAgICAgICBrZXlFeHByOiBjb2x1bW5zTWFwcGluZ1tHYW50dFRhc2tzQ29sdW1uVHlwZS5LZXldLFxyXG4gICAgICAgIHN0YXJ0RXhwcjogY29sdW1uc01hcHBpbmdbR2FudHRUYXNrc0NvbHVtblR5cGUuU3RhcnRdLFxyXG4gICAgICAgIGVuZEV4cHI6IGNvbHVtbnNNYXBwaW5nW0dhbnR0VGFza3NDb2x1bW5UeXBlLkVuZF0sXHJcbiAgICAgICAgcGFyZW50SWRFeHByOiBjb2x1bW5zTWFwcGluZ1tHYW50dFRhc2tzQ29sdW1uVHlwZS5QYXJlbnRJZF0sXHJcbiAgICAgICAgcHJvZ3Jlc3NFeHByOiBjb2x1bW5zTWFwcGluZ1tHYW50dFRhc2tzQ29sdW1uVHlwZS5Qcm9ncmVzc10sXHJcbiAgICAgICAgdGl0bGVFeHByOiBjb2x1bW5zTWFwcGluZ1tHYW50dFRhc2tzQ29sdW1uVHlwZS5UaXRsZV1cclxuICAgICAgfSxcclxuICAgICAgZGVwZW5kZW5jaWVzOiB7XHJcbiAgICAgICAgZGF0YVNvdXJjZTogZGF0YS5EZXBlbmRlbmNpZXMsXHJcbiAgICAgICAga2V5RXhwcjogJ0lkJyxcclxuICAgICAgICBwcmVkZWNlc3NvcklkRXhwcjogJ1ByZWRlY2Vzc29ySWQnLFxyXG4gICAgICAgIHN1Y2Nlc3NvcklkRXhwcjogJ1N1Y2Nlc3NvcklkJyxcclxuICAgICAgICB0eXBlRXhwcjogJ1R5cGUnXHJcbiAgICAgIH0sXHJcbiAgICAgIHJlc291cmNlczoge1xyXG4gICAgICAgIGRhdGFTb3VyY2U6IGRhdGEuUmVzb3VyY2VzLFxyXG4gICAgICAgIGtleUV4cHI6IGdhbnR0U2V0dGluZ3MuUmVzb3VyY2VzS2V5RmllbGQsXHJcbiAgICAgICAgdGV4dEV4cHI6IGdhbnR0U2V0dGluZ3MuUmVzb3VyY2VzVGV4dEZpZWxkXHJcbiAgICAgIH0sXHJcbiAgICAgIHJlc291cmNlQXNzaWdubWVudHM6IHtcclxuICAgICAgICBkYXRhU291cmNlOiBkYXRhLlJlc291cmNlQXNzaWdubWVudHMsXHJcbiAgICAgICAga2V5RXhwcjogZ2FudHRTZXR0aW5ncy5SZXNvdXJjZUFzc2lnbm1lbnRLZXlGaWVsZCxcclxuICAgICAgICByZXNvdXJjZUlkRXhwcjogZ2FudHRTZXR0aW5ncy5SZXNvdXJjZUFzc2lnbm1lbnRSZXNvdXJjZUlkRmllbGQsXHJcbiAgICAgICAgdGFza0lkRXhwcjogZ2FudHRTZXR0aW5ncy5SZXNvdXJjZUFzc2lnbm1lbnRUYXNrSWRGaWVsZFxyXG4gICAgICB9LFxyXG4gICAgfSkuZHhHYW50dCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jaGFydD8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5jaGFydCA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNlc3Npb25LZXkoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLkNIQVJUX1NUT1JBR0VfTU9ERV9LRVkgKyB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZDtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9WZW5kb3IvRGV2RXh0cmVtZS9keC5hbGwuZC50c1wiIC8+XHJcblxyXG5leHBvcnQgeyBJTGljZW5jZSwgTWVudUl0ZW1UeXBlLCBMaWNlbmNlU3RhdHVzIH0gZnJvbSAnLi9CdXNpbmVzcyc7XHJcbmV4cG9ydCB7IElBcGlSZXNwb25zZSwgSUR4RGF0YVNvdXJjZU9wdGlvbnMsIElFcnJvckluZm8sIElMb2dvU2V0dGluZ3MsIFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vRGF0YSc7XHJcbmV4cG9ydCB7XHJcbiAgSGVhZGVyLCBOYXZpZ2F0aW9uTWVudSwgVXNlck1lbnUsIE1lbnVTd2l0Y2hlcixcclxuICBIZWFkZXJUaGVtZXMsIElIZWFkZXJPcHRpb25zLCBJQXBwTWVudU1vZGVsLCBJTWVudVNldHRpbmdzLCBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwsXHJcbiAgSVVzZXJNZW51SXRlbSwgSVVzZXJNZW51SXRlbU1vZGVsLFxyXG59IGZyb20gJy4vSGVhZGVyJztcclxuZXhwb3J0IHsgSUhpZXJhcmNoaWNhbCwgSVJlcG9ydEJhc2UsIElBcHBNZW51SXRlbUJhc2VNb2RlbCwgZ3JpZENvbHVtblR5cGVzIH0gZnJvbSAnLi9SZXBvcnRzL0J1c2luZXNzJztcclxuZXhwb3J0IHtcclxuICBJR3JpZEV4dGVuZGVkQ29sdW1uU3RhdGUsIEdyaWREYXRhQ29sdW1uRGF0YVR5cGUsIElHcmlkU3RhdGUsXHJcbiAgSUdyaWRDb2x1bW5TdGF0ZSwgSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGVcclxufSBmcm9tICcuL1dpZGdldHMvSUdyaWRTdGF0ZSc7XHJcbmV4cG9ydCB7IElHcmlkRGF0YSwgSVYyR3JpZENvbHVtblN0YXRlIH0gZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL0dyaWQvSUdyaWREYXRhJztcclxuZXhwb3J0IHsgSUNvbHVtbk1ldGFEYXRhIH0gZnJvbSAnLi9SZXBvcnRzL0NvbHVtbk1ldGFEYXRhJztcclxuZXhwb3J0IHsgQ2RtSW1wb3J0RmlsZU1vZGUgfSBmcm9tICcuL1JlcG9ydHMvQnVzaW5lc3MnO1xyXG5cclxuaW1wb3J0IHsgc2hvdyBhcyBiYWNrZ3JvdW5kSW1hZ2VWaWV3ZXIgfSBmcm9tICcuL1dpZGdldHMvQmFja2dyb3VuZEltYWdlVmlld2VyJztcclxuaW1wb3J0IHsgTGljZW5jZVN0YXR1cywgTWVudUl0ZW1UeXBlIH0gZnJvbSAnLi9CdXNpbmVzcyc7XHJcbmltcG9ydCB7IEdyaWREYXRhQ29sdW1uRGF0YVR5cGUgfSBmcm9tICcuL1dpZGdldHMvSUdyaWRTdGF0ZSc7XHJcbmltcG9ydCBkYXRhIGZyb20gJy4vRGF0YSc7XHJcbmltcG9ydCBGb290ZXIsIHsgRm9vdGVySW5kaWNhdG9yU3RhdHVzIH0gZnJvbSAnLi9Gb290ZXIvSW5kZXgnO1xyXG5pbXBvcnQge1xyXG4gIEhlYWRlcixcclxuICBOYXZpZ2F0aW9uTWVudSxcclxuICBVc2VyTWVudSxcclxuICBNZW51U3dpdGNoZXJcclxufSBmcm9tICcuL0hlYWRlcic7XHJcblxyXG5leHBvcnQge1xyXG4gIEZvb3RlcixcclxufTtcclxuXHJcbmltcG9ydCBub3RpZnkgZnJvbSAnLi9XaWRnZXRzL05vdGlmeSc7XHJcbmltcG9ydCBmdWxsU2NyZWVuIGZyb20gJy4vV2lkZ2V0cy9GdWxsU2NyZWVuJztcclxuaW1wb3J0IGRlZmF1bHRUb29sYmFyIGZyb20gJy4vV2lkZ2V0cy9EZWZhdWx0VG9vbGJhcic7XHJcbmltcG9ydCBkZWZhdWx0R3JpZE9ic29sZXRlIGZyb20gJy4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkT2Jzb2xldGUnO1xyXG5pbXBvcnQgZGVmYXVsdFRyZWVMaXN0IGZyb20gJy4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRUcmVlTGlzdCc7XHJcbmltcG9ydCBkZWZhdWx0R3JpZCBmcm9tICcuL1dpZGdldHMvR3JpZC9EZWZhdWx0R3JpZCc7XHJcbmltcG9ydCAqIGFzIGltYWdlQ3JvcERpYWxvZyBmcm9tICcuL1dpZGdldHMvSW1hZ2VDcm9wRGlhbG9nJztcclxuaW1wb3J0IHsgQWNjb3VudFNldHRpbmdzUGFnZSB9IGZyb20gJy4vUGFnZXMvQWNjb3VudFNldHRpbmdzJztcclxuaW1wb3J0ICogYXMgc3R5bGluZyBmcm9tICcuL1N0eWxpbmcvSW5kZXgnO1xyXG5pbXBvcnQgKiBhcyBwb3B1cCBmcm9tICcuL1dpZGdldHMvUG9wdXAnO1xyXG5pbXBvcnQgKiBhcyBjb25maXJtIGZyb20gJy4vV2lkZ2V0cy9Db25maXJtJztcclxuaW1wb3J0ICogYXMgbGFuZGluZyBmcm9tICcuL1dpZGdldHMvTGFuZGluZyc7XHJcbmltcG9ydCAqIGFzIGhlbHBlcnMgZnJvbSAnLi9IZWxwZXJzL0luZGV4JztcclxuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi9VdGlscy9JbmRleCc7XHJcbmltcG9ydCAqIGFzIGFjY2Vzc0RlbmllZCBmcm9tICcuL1dpZGdldHMvQWNjZXNzRGVuaWVkVG9SZXBvcnQnO1xyXG5pbXBvcnQgZ3JpZENvbHVtblR5cGVzIGZyb20gJy4vUmVwb3J0cy9CdXNpbmVzcy9HcmlkQ29sdW1uVHlwZXMnO1xyXG5pbXBvcnQgKiBhcyBDRE0gZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL0NETS9JbmRleCc7XHJcbmltcG9ydCB7IFNlc3Npb25Ob3RpZmllciB9IGZyb20gJy4vQ29tcG9uZW50cy9TZXNzaW9uTm90aWZpZXInO1xyXG5pbXBvcnQgeyBGaWxlSW1wb3J0ZXIgfSBmcm9tICcuL0NvbXBvbmVudHMvRmlsZUltcG9ydGVyL0luZGV4JztcclxuaW1wb3J0IHsgRmlsZVVwbG9hZGVyIH0gZnJvbSAnLi9Db21wb25lbnRzL0ZpbGVVcGxvYWRlci9JbmRleCc7XHJcbmltcG9ydCB7IENkbUltcG9ydEZpbGVNb2RlIH0gZnJvbSAnLi9SZXBvcnRzL0J1c2luZXNzJztcclxuXHJcbmltcG9ydCBHcmlkUmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvR3JpZC9JbmRleCc7XHJcbmltcG9ydCBTbGlkZXNob3dSZXBvcnRQYWdlIGZyb20gJy4vUmVwb3J0cy9QYWdlcy9TbGlkZXNob3cvSW5kZXgnO1xyXG5pbXBvcnQgRGFzaGJvYXJkUmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvRGFzaGJvYXJkL0luZGV4JztcclxuaW1wb3J0IERYUmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvUmVwb3J0L0luZGV4JztcclxuaW1wb3J0IERpYWdyYW1SZXBvcnRQYWdlIGZyb20gJy4vUmVwb3J0cy9QYWdlcy9EaWFncmFtL0luZGV4JztcclxuaW1wb3J0IENETVJlcG9ydFBhZ2UgZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL0NETS9JbmRleCc7XHJcbmltcG9ydCBHYW50dENoYXJ0UmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvR2FubnRDaGFydC9JbmRleCc7XHJcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4vQ29uZmlnL0luZGV4JztcclxuXHJcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdmFyaWFibGUtbmFtZVxyXG5jb25zdCBJc3pvbGVhVUkgPSB7XHJcbiAgY29uZmlnLFxyXG5cclxuICBIZWFkZXIsXHJcbiAgRm9vdGVyLFxyXG4gIE5hdmlnYXRpb25NZW51LFxyXG4gIFVzZXJNZW51LFxyXG4gIE1lbnVTd2l0Y2hlcixcclxuXHJcbiAgZGF0YSxcclxuXHJcbiAgd2lkZ2V0czoge1xyXG4gICAgbm90aWZ5LFxyXG4gICAgZnVsbFNjcmVlbixcclxuICAgIHBvcHVwLFxyXG4gICAgY29uZmlybSxcclxuICAgIGxhbmRpbmcsXHJcbiAgICBhY2Nlc3NEZW5pZWQsXHJcbiAgICBkZWZhdWx0R3JpZE9ic29sZXRlLFxyXG4gICAgZGVmYXVsdFRyZWVMaXN0LFxyXG4gICAgZGVmYXVsdEdyaWQsXHJcbiAgICBkZWZhdWx0VG9vbGJhcixcclxuICAgIGJhY2tncm91bmRJbWFnZVZpZXdlcixcclxuICAgIGltYWdlQ3JvcERpYWxvZ1xyXG4gIH0sXHJcbiAgcGFnZXM6IHtcclxuICAgIEFjY291bnRTZXR0aW5nc1BhZ2VcclxuICB9LFxyXG4gIGNvbXBvbmVudHM6IHtcclxuICAgIENETSxcclxuICAgIFNlc3Npb25Ob3RpZmllcixcclxuICAgIEZpbGVJbXBvcnRlcixcclxuICAgIEZpbGVVcGxvYWRlcixcclxuICB9LFxyXG5cclxuICBzdHlsaW5nLFxyXG4gIGhlbHBlcnMsXHJcbiAgdXRpbHMsXHJcblxyXG4gIHJlcG9ydHM6IHtcclxuICAgIENETVJlcG9ydFBhZ2UsXHJcbiAgICBEaWFncmFtUmVwb3J0UGFnZSxcclxuICAgIEdyaWRSZXBvcnRQYWdlLFxyXG4gICAgRGFzaGJvYXJkUmVwb3J0UGFnZSxcclxuICAgIERYUmVwb3J0UGFnZSxcclxuICAgIFNsaWRlc2hvd1JlcG9ydFBhZ2UsXHJcbiAgICBHYW50dENoYXJ0UmVwb3J0UGFnZSxcclxuICAgIGdyaWRDb2x1bW5UeXBlcyxcclxuICB9LFxyXG4gIGJ1c2luZXNzOiB7XHJcbiAgICBMaWNlbmNlU3RhdHVzLFxyXG4gICAgTWVudUl0ZW1UeXBlLFxyXG4gICAgQ2RtSW1wb3J0RmlsZU1vZGUsXHJcbiAgICBGb290ZXJJbmRpY2F0b3JTdGF0dXMsXHJcbiAgICBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlXHJcbiAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgSXN6b2xlYVVJO1xyXG5cclxuKHdpbmRvdyBhcyBhbnkpLklzem9sZWFVSSA9IElzem9sZWFVSTtcclxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQSxtQkFBYyxJQUFNLElBQU07QUFBQSxpQkFDSixBQUFoQixPQUFPLE1BQVMsY0FBYSxLQUFPLEVBQUUsU0FBTyxVQUN4QixBQUFoQixPQUFPLE1BQVMsWUFDdkIsU0FBUSxLQUFLLHVEQUNiLEtBQU8sRUFBRSxTQUFTLENBQUMsT0FLakIsR0FBSyxXQUFXLDZFQUE2RSxLQUFLLEdBQUssUUFDbEcsSUFBSSxLQUFLLENBQUEsVUFBOEIsS0FBTyxFQUFFLE1BQU0sR0FBSyxVQUU3RDs7QUFHVCxtQkFBbUIsSUFBSyxJQUFNLElBQU07QUFDbEMsY0FBSSxLQUFNLElBQUk7QUFDZCxhQUFJLEtBQUssT0FBTyxLQUNoQixHQUFJLGVBQWUsUUFDbkIsR0FBSSxTQUFTLFdBQVk7QUFDdkIsY0FBTyxHQUFJLFVBQVUsSUFBTTthQUU3QixHQUFJLFVBQVUsV0FBWTtBQUN4QixvQkFBUSxNQUFNO2FBRWhCLEdBQUk7O0FBR04sbUJBQXNCLElBQUs7QUFDekIsY0FBSSxLQUFNLElBQUk7QUFFZCxhQUFJLEtBQUssUUFBUSxJQUFqQjtBQUNBLGNBQUk7QUFDRixlQUFJO21CQUNHLElBQVA7O0FBQ0YsaUJBQXFCLE9BQWQsR0FBSSxVQUErQixPQUFkLEdBQUk7O0FBSWxDLG1CQUFnQixJQUFNO0FBQ3BCLGNBQUk7QUFDRixlQUFLLGNBQWMs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
10271
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL2ZpbGUtc2F2ZXIvc3JjL0ZpbGVTYXZlci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY3JvcHByL2Rpc3QvY3JvcHByLmpzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0J1c2luZXNzL0xpY2VuY2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQnVzaW5lc3MvTWVudUl0ZW1UeXBlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvTm90aWZ5LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvQXBpUmVzcG9uc2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9SZXF1ZXN0U3RhdGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9Qb3B1cC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9TdHlsaW5nL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvRXJyb3JJbmZvUG9wdXAudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9FeGNlcHRpb25UeXBlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1V0aWxzL0dlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9SZXF1ZXN0LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvRHhEYXRhU291cmNlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0NvcmUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVscGVycy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWxwZXJzL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0NvbmZpZy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWFkZXIvVXNlck1lbnUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQ29tcG9uZW50cy9NZW51L01lbnUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQ29tcG9uZW50cy9NZW51L0Jvb3RzdHJhcENvbGxhcHNpbmdNZW51LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9OYXZpZ2F0aW9uTWVudS50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db25zdGFudHMvQ2FjaGVLZXlzLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9Mb2dvLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9NZW51U3dpdGNoZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVhZGVyL1NlYXJjaC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9VdGlscy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9VdGlscy9FdmVudEVtaXR0ZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVhZGVyL0hlYWRlci50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL0J1c2luZXNzL0dyaWRDb2x1bW5UeXBlcy50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL0J1c2luZXNzL2NkbUltcG9ydEZpbGVNb2RlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvSUdyaWRTdGF0ZS50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0JhY2tncm91bmRJbWFnZVZpZXdlci50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Gb290ZXIvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9BdXRvUmVzaXplLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvRnVsbFNjcmVlbi50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWxwZXJzL1RoZW1lLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlbHBlcnMvVG9vbGJhci50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0RlZmF1bHRUb29sYmFyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvUGFuZWxIZWlnaHQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0NyZWF0ZUZ1bGxTY3JlZW5HcmlkLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1V0aWxzL0dyaWRFeHBvcnQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkQmFzZS50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkT2Jzb2xldGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRUcmVlTGlzdC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZy9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZy9IZWxwZXJzLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1BhZ2VzL0FjY291bnRTZXR0aW5ncy9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0NvbmZpcm0udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9MYW5kaW5nLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvQWNjZXNzRGVuaWVkVG9SZXBvcnQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvR3JpZC9DcmVhdGVEZWZhdWx0R3JpZC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9Db250cm9sQ29uZmlndXJhdG9yLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1V0aWxzL01lbW9pemUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vR3JpZFZpZXdzTWFuYWdlci50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9HcmlkU3RhdGVNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vR3JpZEZpbHRlcnNNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0ZpbGVVcGxvYWRlci9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0ZpbGVJbXBvcnRlci9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9HcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWREaXNwbGF5c01hbmFnZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRTdW1tYXJ5SGVscGVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0NvbnRyb2xEaXNwbGF5LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0Rpc3BsYXlNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0NvbXBvbmVudHMvU2Vzc2lvbk5vdGlmaWVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvR3JpZC9HcmlkSW5kaWNhdG9yU3RhdGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL0dyaWRTdGF0ZU1hbmFnZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL01vZGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9EYXRhL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvQ29tcG9uZW50cy9SZWZyZXNoVGltZXIvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9Db21wb25lbnRzL1JlZnJlc2hUaW1lci9CdXR0b24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvRGFzaGJvYXJkL0V4dGVuc2lvbnMvR2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9EYXNoYm9hcmQvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9SZXBvcnQvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9EaWFncmFtL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvU2xpZGVzaG93L0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvR2FubnRDaGFydC9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLypcbiogRmlsZVNhdmVyLmpzXG4qIEEgc2F2ZUFzKCkgRmlsZVNhdmVyIGltcGxlbWVudGF0aW9uLlxuKlxuKiBCeSBFbGkgR3JleSwgaHR0cDovL2VsaWdyZXkuY29tXG4qXG4qIExpY2Vuc2UgOiBodHRwczovL2dpdGh1Yi5jb20vZWxpZ3JleS9GaWxlU2F2ZXIuanMvYmxvYi9tYXN0ZXIvTElDRU5TRS5tZCAoTUlUKVxuKiBzb3VyY2UgIDogaHR0cDovL3B1cmwuZWxpZ3JleS5jb20vZ2l0aHViL0ZpbGVTYXZlci5qc1xuKi9cblxuLy8gVGhlIG9uZSBhbmQgb25seSB3YXkgb2YgZ2V0dGluZyBnbG9iYWwgc2NvcGUgaW4gYWxsIGVudmlyb25tZW50c1xuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xLzMyNzcxODIvMTAwODk5OVxudmFyIF9nbG9iYWwgPSB0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JyAmJiB3aW5kb3cud2luZG93ID09PSB3aW5kb3dcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcgJiYgc2VsZi5zZWxmID09PSBzZWxmXG4gID8gc2VsZiA6IHR5cGVvZiBnbG9iYWwgPT09ICdvYmplY3QnICYmIGdsb2JhbC5nbG9iYWwgPT09IGdsb2JhbFxuICA/IGdsb2JhbFxuICA6IHRoaXNcblxuZnVuY3Rpb24gYm9tIChibG9iLCBvcHRzKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ3VuZGVmaW5lZCcpIG9wdHMgPSB7IGF1dG9Cb206IGZhbHNlIH1cbiAgZWxzZSBpZiAodHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgY29uc29sZS53YXJuKCdEZXByZWNhdGVkOiBFeHBlY3RlZCB0aGlyZCBhcmd1bWVudCB0byBiZSBhIG9iamVjdCcpXG4gICAgb3B0cyA9IHsgYXV0b0JvbTogIW9wdHMgfVxuICB9XG5cbiAgLy8gcHJlcGVuZCBCT00gZm9yIFVURi04IFhNTCBhbmQgdGV4dC8qIHR5cGVzIChpbmNsdWRpbmcgSFRNTClcbiAgLy8gbm90ZTogeW91ciBicm93c2VyIHdpbGwgYXV0b21hdGljYWxseSBjb252ZXJ0IFVURi0xNiBVK0ZFRkYgdG8gRUYgQkIgQkZcbiAgaWYgKG9wdHMuYXV0b0JvbSAmJiAvXlxccyooPzp0ZXh0XFwvXFxTKnxhcHBsaWNhdGlvblxcL3htbHxcXFMqXFwvXFxTKlxcK3htbClcXHMqOy4qY2hhcnNldFxccyo9XFxzKnV0Zi04L2kudGVzdChibG9iLnR5cGUpKSB7XG4gICAgcmV0dXJuIG5ldyBCbG9iKFtTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RkVGRiksIGJsb2JdLCB7IHR5cGU6IGJsb2IudHlwZSB9KVxuICB9XG4gIHJldHVybiBibG9iXG59XG5cbmZ1bmN0aW9uIGRvd25sb2FkICh1cmwsIG5hbWUsIG9wdHMpIHtcbiAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gIHhoci5vcGVuKCdHRVQnLCB1cmwpXG4gIHhoci5yZXNwb25zZVR5cGUgPSAnYmxvYidcbiAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBzYXZlQXMoeGhyLnJlc3BvbnNlLCBuYW1lLCBvcHRzKVxuICB9XG4gIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ2NvdWxkIG5vdCBkb3dubG9hZCBmaWxlJylcbiAgfVxuICB4aHIuc2VuZCgpXG59XG5cbmZ1bmN0aW9uIGNvcnNFbmFibGVkICh1cmwpIHtcbiAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gIC8vIHVzZSBzeW5jIHRvIGF2b2lkIHBvcHVwIGJsb2NrZXJcbiAgeGhyLm9wZW4oJ0hFQUQnLCB1cmwsIGZhbHNlKVxuICB0cnkge1xuICAgIHhoci5zZW5kKClcbiAgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPD0gMjk5XG59XG5cbi8vIGBhLmNsaWNrKClgIGRvZXNuJ3Qgd29yayBmb3IgYWxsIGJyb3dzZXJzICgjNDY1KVxuZnVuY3Rpb24gY2xpY2sgKG5vZGUpIHtcbiAgdHJ5IHtcbiAgICBub2RlLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ2NsaWNrJykpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnRzJylcbiAgICBldnQuaW5pdE1vdXNlRXZlbnQoJ2NsaWNrJywgdHJ1ZSwgdHJ1ZSwgd2luZG93LCAwLCAwLCAwLCA4MCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgMjAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwLCBudWxsKVxuICAgIG5vZGUuZGlzcGF0Y2hFdmVudChldnQpXG4gIH1cbn1cblxuLy8gRGV0ZWN0IFdlYlZpZXcgaW5zaWRlIGEgbmF0aXZlIG1hY09TIGFwcCBieSBydWxpbmcgb3V0IGFsbCBicm93c2Vyc1xuLy8gV2UganVzdCBuZWVkIHRvIGNoZWNrIGZvciAnU2FmYXJpJyBiZWNhdXNlIGFsbCBvdGhlciBicm93c2VycyAoYmVzaWRlcyBGaXJlZm94KSBpbmNsdWRlIHRoYXQgdG9vXG4vLyBodHRwczovL3d3dy53aGF0aXNteWJyb3dzZXIuY29tL2d1aWRlcy90aGUtbGF0ZXN0LXVzZXItYWdlbnQvbWFjb3NcbnZhciBpc01hY09TV2ViVmlldyA9IF9nbG9iYWwubmF2aWdhdG9yICYmIC9NYWNpbnRvc2gvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgL0FwcGxlV2ViS2l0Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmICEvU2FmYXJpLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbnZhciBzYXZlQXMgPSBfZ2xvYmFsLnNhdmVBcyB8fCAoXG4gIC8vIHByb2JhYmx5IGluIHNvbWUgd2ViIHdvcmtlclxuICAodHlwZW9mIHdpbmRvdyAhPT0gJ29iamVjdCcgfHwgd2luZG93ICE9PSBfZ2xvYmFsKVxuICAgID8gZnVuY3Rpb24gc2F2ZUFzICgpIHsgLyogbm9vcCAqLyB9XG5cbiAgLy8gVXNlIGRvd25sb2FkIGF0dHJpYnV0ZSBmaXJzdCBpZiBwb3NzaWJsZSAoIzE5MyBMdW1pYSBtb2JpbGUpIHVubGVzcyB0aGlzIGlzIGEgbWFjT1MgV2ViVmlld1xuICA6ICgnZG93bmxvYWQnIGluIEhUTUxBbmNob3JFbGVtZW50LnByb3RvdHlwZSAmJiAhaXNNYWNPU1dlYlZpZXcpXG4gID8gZnVuY3Rpb24gc2F2ZUFzIChibG9iLCBuYW1lLCBvcHRzKSB7XG4gICAgdmFyIFVSTCA9IF9nbG9iYWwuVVJMIHx8IF9nbG9iYWwud2Via2l0VVJMXG4gICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcbiAgICBuYW1lID0gbmFtZSB8fCBibG9iLm5hbWUgfHwgJ2Rvd25sb2FkJ1xuXG4gICAgYS5kb3dubG9hZCA9IG5hbWVcbiAgICBhLnJlbCA9ICdub29wZW5lcicgLy8gdGFibmFiYmluZ1xuXG4gICAgLy8gVE9ETzogZGV0ZWN0IGNocm9tZSBleHRlbnNpb25zICYgcGFja2FnZWQgYXBwc1xuICAgIC8vIGEudGFyZ2V0ID0gJ19ibGFuaydcblxuICAgIGlmICh0eXBlb2YgYmxvYiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFN1cHBvcnQgcmVndWxhciBsaW5rc1xuICAgICAgYS5ocmVmID0gYmxvYlxuICAgICAgaWYgKGEub3JpZ2luICE9PSBsb2NhdGlvbi5vcmlnaW4pIHtcbiAgICAgICAgY29yc0VuYWJsZWQoYS5ocmVmKVxuICAgICAgICAgID8gZG93bmxvYWQoYmxvYiwgbmFtZSwgb3B0cylcbiAgICAgICAgICA6IGNsaWNrKGEsIGEudGFyZ2V0ID0gJ19ibGFuaycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGljayhhKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdXBwb3J0IGJsb2JzXG4gICAgICBhLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgVVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpIH0sIDRFNCkgLy8gNDBzXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgY2xpY2soYSkgfSwgMClcbiAgICB9XG4gIH1cblxuICAvLyBVc2UgbXNTYXZlT3JPcGVuQmxvYiBhcyBhIHNlY29uZCBhcHByb2FjaFxuICA6ICdtc1NhdmVPck9wZW5CbG9iJyBpbiBuYXZpZ2F0b3JcbiAgPyBmdW5jdGlvbiBzYXZlQXMgKGJsb2IsIG5hbWUsIG9wdHMpIHtcbiAgICBuYW1lID0gbmFtZSB8fCBibG9iLm5hbWUgfHwgJ2Rvd25sb2FkJ1xuXG4gICAgaWYgKHR5cGVvZiBibG9iID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGNvcnNFbmFibGVkKGJsb2IpKSB7XG4gICAgICAgIGRvd25sb2FkKGJsb2IsIG5hbWUsIG9wdHMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgICAgICBhLmhyZWYgPSBibG9iXG4gICAgICAgIGEudGFyZ2V0ID0gJ19ibGFuaydcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGNsaWNrKGEpIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGJvbShibG9iLCBvcHRzKSwgbmFtZSlcbiAgICB9XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byB1c2luZyBGaWxlUmVhZGVyIGFuZCBhIHBvcHVwXG4gIDogZnVuY3Rpb24gc2F2ZUFzIChibG9iLCBuYW1lLCBvcHRzLCBwb3B1cCkge1xuICAgIC8vIE9wZW4gYSBwb3B1cCBpbW1lZGlhdGVseSBkbyBnbyBhcm91bmQgcG9wdXAgYmxvY2tlclxuICAgIC8vIE1vc3RseSBvbmx5IGF2YWlsYWJsZSBvbiB1c2VyIGludGVyYWN0aW9uIGFuZCB0aGUgZmlsZVJlYWRlciBpcyBhc3luYyBzby4uLlxuICAgIHBvcHVwID0gcG9wdXAgfHwgb3BlbignJywgJ19ibGFuaycpXG4gICAgaWYgKHBvcHVwKSB7XG4gICAgICBwb3B1cC5kb2N1bWVudC50aXRsZSA9XG4gICAgICBwb3B1cC5kb2N1bWVudC5ib2R5LmlubmVyVGV4dCA9ICdkb3dubG9hZGluZy4uLidcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGJsb2IgPT09ICdzdHJpbmcnKSByZXR1cm4gZG93bmxvYWQoYmxvYiwgbmFtZSwgb3B0cylcblxuICAgIHZhciBmb3JjZSA9IGJsb2IudHlwZSA9PT0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbiAgICB2YXIgaXNTYWZhcmkgPSAvY29uc3RydWN0b3IvaS50ZXN0KF9nbG9iYWwuSFRNTEVsZW1lbnQpIHx8IF9nbG9iYWwuc2FmYXJpXG4gICAgdmFyIGlzQ2hyb21lSU9TID0gL0NyaU9TXFwvW1xcZF0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbiAgICBpZiAoKGlzQ2hyb21lSU9TIHx8IChmb3JjZSAmJiBpc1NhZmFyaSkgfHwgaXNNYWNPU1dlYlZpZXcpICYmIHR5cGVvZiBGaWxlUmVhZGVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gU2FmYXJpIGRvZXNuJ3QgYWxsb3cgZG93bmxvYWRpbmcgb2YgYmxvYiBVUkxzXG4gICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHVybCA9IHJlYWRlci5yZXN1bHRcbiAgICAgICAgdXJsID0gaXNDaHJvbWVJT1MgPyB1cmwgOiB1cmwucmVwbGFjZSgvXmRhdGE6W147XSo7LywgJ2RhdGE6YXR0YWNobWVudC9maWxlOycpXG4gICAgICAgIGlmIChwb3B1cCkgcG9wdXAubG9jYXRpb24uaHJlZiA9IHVybFxuICAgICAgICBlbHNlIGxvY2F0aW9uID0gdXJsXG4gICAgICAgIHBvcHVwID0gbnVsbCAvLyByZXZlcnNlLXRhYm5hYmJpbmcgIzQ2MFxuICAgICAgfVxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYilcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIFVSTCA9IF9nbG9iYWwuVVJMIHx8IF9nbG9iYWwud2Via2l0VVJMXG4gICAgICB2YXIgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgaWYgKHBvcHVwKSBwb3B1cC5sb2NhdGlvbiA9IHVybFxuICAgICAgZWxzZSBsb2NhdGlvbi5ocmVmID0gdXJsXG4gICAgICBwb3B1cCA9IG51bGwgLy8gcmV2ZXJzZS10YWJuYWJiaW5nICM0NjBcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCkgfSwgNEU0KSAvLyA0MHNcbiAgICB9XG4gIH1cbilcblxuX2dsb2JhbC5zYXZlQXMgPSBzYXZlQXMuc2F2ZUFzID0gc2F2ZUFzXG5cbmlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHNhdmVBcztcbn1cbiIsICIvKipcbiAqIENyb3Bwci5qc1xuICogaHR0cHM6Ly9naXRodWIuY29tL2phbWVzc3Nvb2kvQ3JvcHByLmpzXG4gKiBcbiAqIEEgSmF2YVNjcmlwdCBpbWFnZSBjcm9wcGVyIHRoYXQncyBsaWdodHdlaWdodCwgYXdlc29tZSwgYW5kIGhhc1xuICogemVybyBkZXBlbmRlbmNpZXMuXG4gKiBcbiAqIChDKSAyMDE3IEphbWVzIE9vaS4gUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG5cdHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcblx0dHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcblx0KGdsb2JhbC5Dcm9wcHIgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbihmdW5jdGlvbiAoKSB7XG4gIHZhciBsYXN0VGltZSA9IDA7XG4gIHZhciB2ZW5kb3JzID0gWydtcycsICdtb3onLCAnd2Via2l0JywgJ28nXTtcbiAgZm9yICh2YXIgeCA9IDA7IHggPCB2ZW5kb3JzLmxlbmd0aCAmJiAhd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZTsgKyt4KSB7XG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHdpbmRvd1t2ZW5kb3JzW3hdICsgJ1JlcXVlc3RBbmltYXRpb25GcmFtZSddO1xuICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSA9IHdpbmRvd1t2ZW5kb3JzW3hdICsgJ0NhbmNlbEFuaW1hdGlvbkZyYW1lJ10gfHwgd2luZG93W3ZlbmRvcnNbeF0gKyAnQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lJ107XG4gIH1cbiAgaWYgKCF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBlbGVtZW50KSB7XG4gICAgdmFyIGN1cnJUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgdmFyIHRpbWVUb0NhbGwgPSBNYXRoLm1heCgwLCAxNiAtIChjdXJyVGltZSAtIGxhc3RUaW1lKSk7XG4gICAgdmFyIGlkID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2soY3VyclRpbWUgKyB0aW1lVG9DYWxsKTtcbiAgICB9LCB0aW1lVG9DYWxsKTtcbiAgICBsYXN0VGltZSA9IGN1cnJUaW1lICsgdGltZVRvQ2FsbDtcbiAgICByZXR1cm4gaWQ7XG4gIH07XG4gIGlmICghd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKSB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICBjbGVhclRpbWVvdXQoaWQpO1xuICB9O1xufSkoKTtcbihmdW5jdGlvbiAoKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBmYWxzZTtcbiAgZnVuY3Rpb24gQ3VzdG9tRXZlbnQoZXZlbnQsIHBhcmFtcykge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiBmYWxzZSwgZGV0YWlsOiB1bmRlZmluZWQgfTtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7XG4gICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudCwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsKTtcbiAgICByZXR1cm4gZXZ0O1xuICB9XG4gIEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGU7XG4gIHdpbmRvdy5DdXN0b21FdmVudCA9IEN1c3RvbUV2ZW50O1xufSkoKTtcbihmdW5jdGlvbiAod2luZG93KSB7XG4gIHRyeSB7XG4gICAgbmV3IEN1c3RvbUV2ZW50KCd0ZXN0Jyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlKSB7fVxuICBmdW5jdGlvbiBNb3VzZUV2ZW50KGV2ZW50VHlwZSwgcGFyYW1zKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHsgYnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IGZhbHNlIH07XG4gICAgdmFyIG1vdXNlRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudCcpO1xuICAgIG1vdXNlRXZlbnQuaW5pdE1vdXNlRXZlbnQoZXZlbnRUeXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUsIHdpbmRvdywgMCwgMCwgMCwgMCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsIG51bGwpO1xuICAgIHJldHVybiBtb3VzZUV2ZW50O1xuICB9XG4gIE1vdXNlRXZlbnQucHJvdG90eXBlID0gRXZlbnQucHJvdG90eXBlO1xuICB3aW5kb3cuTW91c2VFdmVudCA9IE1vdXNlRXZlbnQ7XG59KSh3aW5kb3cpO1xuXG52YXIgY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTtcblxudmFyIGNyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9O1xufSgpO1xuXG5cblxuXG5cblxuXG52YXIgZ2V0ID0gZnVuY3Rpb24gZ2V0KG9iamVjdCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gIGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbiAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpO1xuXG4gIGlmIChkZXNjID09PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7XG5cbiAgICBpZiAocGFyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0KHBhcmVudCwgcHJvcGVydHksIHJlY2VpdmVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MpIHtcbiAgICByZXR1cm4gZGVzYy52YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7XG5cbiAgICBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTtcbiAgfVxufTtcblxudmFyIGluaGVyaXRzID0gZnVuY3Rpb24gKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufTtcblxuXG5cblxuXG5cblxuXG5cblxuXG52YXIgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiA9IGZ1bmN0aW9uIChzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xufTtcblxuXG5cblxuXG52YXIgc2xpY2VkVG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsIGkpIHtcbiAgICB2YXIgX2FyciA9IFtdO1xuICAgIHZhciBfbiA9IHRydWU7XG4gICAgdmFyIF9kID0gZmFsc2U7XG4gICAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgICBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfZCA9IHRydWU7XG4gICAgICBfZSA9IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSkgX2lbXCJyZXR1cm5cIl0oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIF9hcnI7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGFyciwgaSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICAgIHJldHVybiBhcnI7XG4gICAgfSBlbHNlIGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpIHtcbiAgICAgIHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpO1xuICAgIH1cbiAgfTtcbn0oKTtcblxudmFyIEhhbmRsZSA9XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgSGFuZGxlIGluc3RhbmNlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBwb3NpdGlvbiBUaGUgeCBhbmQgeSByYXRpbyBwb3NpdGlvbiBvZiB0aGUgaGFuZGxlXG4gKiAgICAgIHdpdGhpbiB0aGUgY3JvcCByZWdpb24uIEFjY2VwdHMgYSB2YWx1ZSBiZXR3ZWVuIDAgdG8gMSBpbiB0aGUgb3JkZXJcbiAqICAgICAgb2YgW1gsIFldLlxuICogQHBhcmFtIHtBcnJheX0gY29uc3RyYWludHMgRGVmaW5lIHRoZSBzaWRlIG9mIHRoZSBjcm9wIHJlZ2lvbiB0aGF0XG4gKiAgICAgIGlzIHRvIGJlIGFmZmVjdGVkIGJ5IHRoaXMgaGFuZGxlLiBBY2NlcHRzIGEgdmFsdWUgb2YgMCBvciAxIGluIHRoZVxuICogICAgICBvcmRlciBvZiBbVE9QLCBSSUdIVCwgQk9UVE9NLCBMRUZUXS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBjdXJzb3IgVGhlIENTUyBjdXJzb3Igb2YgdGhpcyBoYW5kbGUuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGV2ZW50QnVzIFRoZSBlbGVtZW50IHRvIGRpc3BhdGNoIGV2ZW50cyB0by5cbiAqL1xuZnVuY3Rpb24gSGFuZGxlKHBvc2l0aW9uLCBjb25zdHJhaW50cywgY3Vyc29yLCBldmVudEJ1cykge1xuICBjbGFzc0NhbGxDaGVjayh0aGlzLCBIYW5kbGUpO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgdGhpcy5jb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzO1xuICB0aGlzLmN1cnNvciA9IGN1cnNvcjtcbiAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzO1xuICB0aGlzLmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHRoaXMuZWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1oYW5kbGUnO1xuICB0aGlzLmVsLnN0eWxlLmN1cnNvciA9IGN1cnNvcjtcbiAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gIGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICBzZWxmLmV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdoYW5kbGVzdGFydCcsIHtcbiAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYgfVxuICAgIH0pKTtcbiAgfVxuICBmdW5jdGlvbiBvbk1vdXNlVXAoZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZWVuZCcsIHtcbiAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYgfVxuICAgIH0pKTtcbiAgfVxuICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBzZWxmLmV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdoYW5kbGVtb3ZlJywge1xuICAgICAgZGV0YWlsOiB7IG1vdXNlWDogZS5jbGllbnRYLCBtb3VzZVk6IGUuY2xpZW50WSB9XG4gICAgfSkpO1xuICB9XG59O1xuXG52YXIgQm94ID0gZnVuY3Rpb24gKCkge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBCb3ggaW5zdGFuY2UuXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge051bWJlcn0geDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHkxXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB4MlxuICAgKiBAcGFyYW0ge051bWJlcn0geTJcbiAgICovXG4gIGZ1bmN0aW9uIEJveCh4MSwgeTEsIHgyLCB5Mikge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEJveCk7XG4gICAgdGhpcy54MSA9IHgxO1xuICAgIHRoaXMueTEgPSB5MTtcbiAgICB0aGlzLngyID0geDI7XG4gICAgdGhpcy55MiA9IHkyO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBuZXcgZGltZW5zaW9ucyBvZiB0aGUgYm94LlxuICAgKiBAcGFyYW0ge051bWJlcn0geDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHkxXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB4MlxuICAgKiBAcGFyYW0ge051bWJlcn0geTJcbiAgICovXG4gIGNyZWF0ZUNsYXNzKEJveCwgW3tcbiAgICBrZXk6ICdzZXQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQkJDEoKSB7XG4gICAgICB2YXIgeDEgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgICB2YXIgeTEgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICB2YXIgeDIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG4gICAgICB2YXIgeTIgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gICAgICB0aGlzLngxID0geDEgPT0gbnVsbCA/IHRoaXMueDEgOiB4MTtcbiAgICAgIHRoaXMueTEgPSB5MSA9PSBudWxsID8gdGhpcy55MSA6IHkxO1xuICAgICAgdGhpcy54MiA9IHgyID09IG51bGwgPyB0aGlzLngyIDogeDI7XG4gICAgICB0aGlzLnkyID0geTIgPT0gbnVsbCA/IHRoaXMueTIgOiB5MjtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSB3aWR0aCBvZiB0aGUgYm94LlxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICd3aWR0aCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHdpZHRoKCkge1xuICAgICAgcmV0dXJuIE1hdGguYWJzKHRoaXMueDIgLSB0aGlzLngxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgaGVpZ2h0IG9mIHRoZSBib3guXG4gICAgICogQHJldHVybnMge051bWJlcn1cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ2hlaWdodCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhlaWdodCgpIHtcbiAgICAgIHJldHVybiBNYXRoLmFicyh0aGlzLnkyIC0gdGhpcy55MSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2l6ZXMgdGhlIGJveCB0byBhIG5ldyBzaXplLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBuZXdXaWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBuZXdIZWlnaHRcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbb3JpZ2luXSBUaGUgb3JpZ2luIHBvaW50IHRvIHJlc2l6ZSBmcm9tLlxuICAgICAqICAgICAgRGVmYXVsdHMgdG8gWzAsIDBdICh0b3AgbGVmdCkuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdyZXNpemUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCkge1xuICAgICAgdmFyIG9yaWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogWzAsIDBdO1xuICAgICAgdmFyIGZyb21YID0gdGhpcy54MSArIHRoaXMud2lkdGgoKSAqIG9yaWdpblswXTtcbiAgICAgIHZhciBmcm9tWSA9IHRoaXMueTEgKyB0aGlzLmhlaWdodCgpICogb3JpZ2luWzFdO1xuICAgICAgdGhpcy54MSA9IGZyb21YIC0gbmV3V2lkdGggKiBvcmlnaW5bMF07XG4gICAgICB0aGlzLnkxID0gZnJvbVkgLSBuZXdIZWlnaHQgKiBvcmlnaW5bMV07XG4gICAgICB0aGlzLngyID0gdGhpcy54MSArIG5ld1dpZHRoO1xuICAgICAgdGhpcy55MiA9IHRoaXMueTEgKyBuZXdIZWlnaHQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2NhbGUgdGhlIGJveCBieSBhIGZhY3Rvci5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZmFjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW29yaWdpbl0gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnc2NhbGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzY2FsZShmYWN0b3IpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFswLCAwXTtcbiAgICAgIHZhciBuZXdXaWR0aCA9IHRoaXMud2lkdGgoKSAqIGZhY3RvcjtcbiAgICAgIHZhciBuZXdIZWlnaHQgPSB0aGlzLmhlaWdodCgpICogZmFjdG9yO1xuICAgICAgdGhpcy5yZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ21vdmUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtb3ZlKCkge1xuICAgICAgdmFyIHggPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgICB2YXIgeSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKTtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodCgpO1xuICAgICAgeCA9IHggPT09IG51bGwgPyB0aGlzLngxIDogeDtcbiAgICAgIHkgPSB5ID09PSBudWxsID8gdGhpcy55MSA6IHk7XG4gICAgICB0aGlzLngxID0geDtcbiAgICAgIHRoaXMueTEgPSB5O1xuICAgICAgdGhpcy54MiA9IHggKyB3aWR0aDtcbiAgICAgIHRoaXMueTIgPSB5ICsgaGVpZ2h0O1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCByZWxhdGl2ZSB4IGFuZCB5IGNvb3JkaW5hdGVzIG9mIGEgZ2l2ZW4gcG9pbnQgd2l0aGluIHRoZSBib3guXG4gICAgICogQHBhcmFtIHtBcnJheX0gcG9pbnQgVGhlIHggYW5kIHkgcmF0aW8gcG9zaXRpb24gd2l0aGluIHRoZSBib3guXG4gICAgICogQHJldHVybnMge0FycmF5fSBUaGUgeCBhbmQgeSBjb29yZGluYXRlcyBbeCwgeV0uXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdnZXRSZWxhdGl2ZVBvaW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmVsYXRpdmVQb2ludCgpIHtcbiAgICAgIHZhciBwb2ludCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogWzAsIDBdO1xuICAgICAgdmFyIHggPSB0aGlzLndpZHRoKCkgKiBwb2ludFswXTtcbiAgICAgIHZhciB5ID0gdGhpcy5oZWlnaHQoKSAqIHBvaW50WzFdO1xuICAgICAgcmV0dXJuIFt4LCB5XTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGFic29sdXRlIHggYW5kIHkgY29vcmRpbmF0ZXMgb2YgYSBnaXZlbiBwb2ludCB3aXRoaW4gdGhlIGJveC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwb2ludCBUaGUgeCBhbmQgeSByYXRpbyBwb3NpdGlvbiB3aXRoaW4gdGhlIGJveC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSB4IGFuZCB5IGNvb3JkaW5hdGVzIFt4LCB5XS5cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ2dldEFic29sdXRlUG9pbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBYnNvbHV0ZVBvaW50KCkge1xuICAgICAgdmFyIHBvaW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbMCwgMF07XG4gICAgICB2YXIgeCA9IHRoaXMueDEgKyB0aGlzLndpZHRoKCkgKiBwb2ludFswXTtcbiAgICAgIHZhciB5ID0gdGhpcy55MSArIHRoaXMuaGVpZ2h0KCkgKiBwb2ludFsxXTtcbiAgICAgIHJldHVybiBbeCwgeV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cmFpbiB0aGUgYm94IHRvIGEgZml4ZWQgcmF0aW8uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHJhdGlvXG4gICAgICogQHBhcmFtIHtBcnJheX0gW29yaWdpbl0gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgRGVmYXVsdHMgdG8gWzAsIDBdICh0b3AgbGVmdCkuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtncm93XSBUaGUgYXhpcyB0byBncm93IHRvIG1haW50YWluIHRoZSByYXRpby5cbiAgICAgKiAgICAgRGVmYXVsdHMgdG8gJ2hlaWdodCcuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdjb25zdHJhaW5Ub1JhdGlvJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uc3RyYWluVG9SYXRpbyhyYXRpbykge1xuICAgICAgdmFyIG9yaWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogWzAsIDBdO1xuICAgICAgdmFyIGdyb3cgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6ICdoZWlnaHQnO1xuICAgICAgaWYgKHJhdGlvID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKTtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodCgpO1xuICAgICAgc3dpdGNoIChncm93KSB7XG4gICAgICAgIGNhc2UgJ2hlaWdodCc6XG4gICAgICAgICAgdGhpcy5yZXNpemUodGhpcy53aWR0aCgpLCB0aGlzLndpZHRoKCkgKiByYXRpbywgb3JpZ2luKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd2lkdGgnOlxuICAgICAgICAgIHRoaXMucmVzaXplKHRoaXMuaGVpZ2h0KCkgKiAxIC8gcmF0aW8sIHRoaXMuaGVpZ2h0KCksIG9yaWdpbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5yZXNpemUodGhpcy53aWR0aCgpLCB0aGlzLndpZHRoKCkgKiByYXRpbywgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJhaW4gdGhlIGJveCB3aXRoaW4gYSBib3VuZGFyeS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYm91bmRhcnlXaWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBib3VuZGFyeUhlaWdodFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtvcmlnaW5dIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnY29uc3RyYWluVG9Cb3VuZGFyeScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbnN0cmFpblRvQm91bmRhcnkoYm91bmRhcnlXaWR0aCwgYm91bmRhcnlIZWlnaHQpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IFswLCAwXTtcbiAgICAgIHZhciBfZ2V0QWJzb2x1dGVQb2ludCA9IHRoaXMuZ2V0QWJzb2x1dGVQb2ludChvcmlnaW4pLFxuICAgICAgICAgIF9nZXRBYnNvbHV0ZVBvaW50MiA9IHNsaWNlZFRvQXJyYXkoX2dldEFic29sdXRlUG9pbnQsIDIpLFxuICAgICAgICAgIG9yaWdpblggPSBfZ2V0QWJzb2x1dGVQb2ludDJbMF0sXG4gICAgICAgICAgb3JpZ2luWSA9IF9nZXRBYnNvbHV0ZVBvaW50MlsxXTtcbiAgICAgIHZhciBtYXhJZkxlZnQgPSBvcmlnaW5YO1xuICAgICAgdmFyIG1heElmVG9wID0gb3JpZ2luWTtcbiAgICAgIHZhciBtYXhJZlJpZ2h0ID0gYm91bmRhcnlXaWR0aCAtIG9yaWdpblg7XG4gICAgICB2YXIgbWF4SWZCb3R0b20gPSBib3VuZGFyeUhlaWdodCAtIG9yaWdpblk7XG4gICAgICB2YXIgZGlyZWN0aW9uWCA9IC0yICogb3JpZ2luWzBdICsgMTtcbiAgICAgIHZhciBkaXJlY3Rpb25ZID0gLTIgKiBvcmlnaW5bMV0gKyAxO1xuICAgICAgdmFyIG1heFdpZHRoID0gbnVsbCxcbiAgICAgICAgICBtYXhIZWlnaHQgPSBudWxsO1xuICAgICAgc3dpdGNoIChkaXJlY3Rpb25YKSB7XG4gICAgICAgIGNhc2UgLTE6XG4gICAgICAgICAgbWF4V2lkdGggPSBtYXhJZkxlZnQ7YnJlYWs7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWluKG1heElmTGVmdCwgbWF4SWZSaWdodCkgKiAyO2JyZWFrO1xuICAgICAgICBjYXNlICsxOlxuICAgICAgICAgIG1heFdpZHRoID0gbWF4SWZSaWdodDticmVhaztcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoZGlyZWN0aW9uWSkge1xuICAgICAgICBjYXNlIC0xOlxuICAgICAgICAgIG1heEhlaWdodCA9IG1heElmVG9wO2JyZWFrO1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5taW4obWF4SWZUb3AsIG1heElmQm90dG9tKSAqIDI7YnJlYWs7XG4gICAgICAgIGNhc2UgKzE6XG4gICAgICAgICAgbWF4SGVpZ2h0ID0gbWF4SWZCb3R0b207YnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy53aWR0aCgpID4gbWF4V2lkdGgpIHtcbiAgICAgICAgdmFyIGZhY3RvciA9IG1heFdpZHRoIC8gdGhpcy53aWR0aCgpO1xuICAgICAgICB0aGlzLnNjYWxlKGZhY3Rvciwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmhlaWdodCgpID4gbWF4SGVpZ2h0KSB7XG4gICAgICAgIHZhciBfZmFjdG9yID0gbWF4SGVpZ2h0IC8gdGhpcy5oZWlnaHQoKTtcbiAgICAgICAgdGhpcy5zY2FsZShfZmFjdG9yLCBvcmlnaW4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cmFpbiB0aGUgYm94IHRvIGEgbWF4aW11bS9taW5pbXVtIHNpemUuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFttYXhXaWR0aF1cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW21heEhlaWdodF1cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW21pbldpZHRoXVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbbWluSGVpZ2h0XVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtvcmlnaW5dIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbcmF0aW9dIFJhdGlvIHRvIG1haW50YWluLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnY29uc3RyYWluVG9TaXplJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uc3RyYWluVG9TaXplKCkge1xuICAgICAgdmFyIG1heFdpZHRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBudWxsO1xuICAgICAgdmFyIG1heEhlaWdodCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgIHZhciBtaW5XaWR0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcbiAgICAgIHZhciBtaW5IZWlnaHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gICAgICB2YXIgb3JpZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiBbMCwgMF07XG4gICAgICB2YXIgcmF0aW8gPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IG51bGw7XG4gICAgICBpZiAocmF0aW8pIHtcbiAgICAgICAgaWYgKHJhdGlvID4gMSkge1xuICAgICAgICAgIG1heFdpZHRoID0gbWF4SGVpZ2h0ICogMSAvIHJhdGlvO1xuICAgICAgICAgIG1pbkhlaWdodCA9IG1pbkhlaWdodCAqIHJhdGlvO1xuICAgICAgICB9IGVsc2UgaWYgKHJhdGlvIDwgMSkge1xuICAgICAgICAgIG1heEhlaWdodCA9IG1heFdpZHRoICogcmF0aW87XG4gICAgICAgICAgbWluV2lkdGggPSBtaW5IZWlnaHQgKiAxIC8gcmF0aW87XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtYXhXaWR0aCAmJiB0aGlzLndpZHRoKCkgPiBtYXhXaWR0aCkge1xuICAgICAgICB2YXIgbmV3V2lkdGggPSBtYXhXaWR0aCxcbiAgICAgICAgICAgIG5ld0hlaWdodCA9IHJhdGlvID09PSBudWxsID8gdGhpcy5oZWlnaHQoKSA6IG1heEhlaWdodDtcbiAgICAgICAgdGhpcy5yZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhIZWlnaHQgJiYgdGhpcy5oZWlnaHQoKSA+IG1heEhlaWdodCkge1xuICAgICAgICB2YXIgX25ld1dpZHRoID0gcmF0aW8gPT09IG51bGwgPyB0aGlzLndpZHRoKCkgOiBtYXhXaWR0aCxcbiAgICAgICAgICAgIF9uZXdIZWlnaHQgPSBtYXhIZWlnaHQ7XG4gICAgICAgIHRoaXMucmVzaXplKF9uZXdXaWR0aCwgX25ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmIChtaW5XaWR0aCAmJiB0aGlzLndpZHRoKCkgPCBtaW5XaWR0aCkge1xuICAgICAgICB2YXIgX25ld1dpZHRoMiA9IG1pbldpZHRoLFxuICAgICAgICAgICAgX25ld0hlaWdodDIgPSByYXRpbyA9PT0gbnVsbCA/IHRoaXMuaGVpZ2h0KCkgOiBtaW5IZWlnaHQ7XG4gICAgICAgIHRoaXMucmVzaXplKF9uZXdXaWR0aDIsIF9uZXdIZWlnaHQyLCBvcmlnaW4pO1xuICAgICAgfVxuICAgICAgaWYgKG1pbkhlaWdodCAmJiB0aGlzLmhlaWdodCgpIDwgbWluSGVpZ2h0KSB7XG4gICAgICAgIHZhciBfbmV3V2lkdGgzID0gcmF0aW8gPT09IG51bGwgPyB0aGlzLndpZHRoKCkgOiBtaW5XaWR0aCxcbiAgICAgICAgICAgIF9uZXdIZWlnaHQzID0gbWluSGVpZ2h0O1xuICAgICAgICB0aGlzLnJlc2l6ZShfbmV3V2lkdGgzLCBfbmV3SGVpZ2h0Mywgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQm94O1xufSgpO1xuXG4vKipcbiAqIEJpbmRzIGFuIGVsZW1lbnQncyB0b3VjaCBldmVudHMgdG8gYmUgc2ltdWxhdGVkIGFzIG1vdXNlIGV2ZW50cy5cbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICovXG5mdW5jdGlvbiBlbmFibGVUb3VjaChlbGVtZW50KSB7XG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHNpbXVsYXRlTW91c2VFdmVudCk7XG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBzaW11bGF0ZU1vdXNlRXZlbnQpO1xuICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHNpbXVsYXRlTW91c2VFdmVudCk7XG59XG4vKipcbiAqIFRyYW5zbGF0ZXMgYSB0b3VjaCBldmVudCB0byBhIG1vdXNlIGV2ZW50LlxuICogQHBhcmFtIHtFdmVudH0gZVxuICovXG5mdW5jdGlvbiBzaW11bGF0ZU1vdXNlRXZlbnQoZSkge1xuICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIHZhciB0b3VjaCA9IGUuY2hhbmdlZFRvdWNoZXNbMF07XG4gIHZhciBldmVudE1hcCA9IHtcbiAgICAndG91Y2hzdGFydCc6ICdtb3VzZWRvd24nLFxuICAgICd0b3VjaG1vdmUnOiAnbW91c2Vtb3ZlJyxcbiAgICAndG91Y2hlbmQnOiAnbW91c2V1cCdcbiAgfTtcbiAgdG91Y2gudGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoZXZlbnRNYXBbZS50eXBlXSwge1xuICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICB2aWV3OiB3aW5kb3csXG4gICAgY2xpZW50WDogdG91Y2guY2xpZW50WCxcbiAgICBjbGllbnRZOiB0b3VjaC5jbGllbnRZLFxuICAgIHNjcmVlblg6IHRvdWNoLnNjcmVlblgsXG4gICAgc2NyZWVuWTogdG91Y2guc2NyZWVuWVxuICB9KSk7XG59XG5cbi8qKlxuICogRGVmaW5lIGEgbGlzdCBvZiBoYW5kbGVzIHRvIGNyZWF0ZS5cbiAqXG4gKiBAcHJvcGVydHkge0FycmF5fSBwb3NpdGlvbiAtIFRoZSB4IGFuZCB5IHJhdGlvIHBvc2l0aW9uIG9mIHRoZSBoYW5kbGUgd2l0aGluXG4gKiAgICAgIHRoZSBjcm9wIHJlZ2lvbi4gQWNjZXB0cyBhIHZhbHVlIGJldHdlZW4gMCB0byAxIGluIHRoZSBvcmRlciBvZiBbWCwgWV0uXG4gKiBAcHJvcGVydHkge0FycmF5fSBjb25zdHJhaW50cyAtIERlZmluZSB0aGUgc2lkZSBvZiB0aGUgY3JvcCByZWdpb24gdGhhdCBpcyB0b1xuICogICAgICBiZSBhZmZlY3RlZCBieSB0aGlzIGhhbmRsZS4gQWNjZXB0cyBhIHZhbHVlIG9mIDAgb3IgMSBpbiB0aGUgb3JkZXIgb2ZcbiAqICAgICAgW1RPUCwgUklHSFQsIEJPVFRPTSwgTEVGVF0uXG4gKiBAcHJvcGVydHkge1N0cmluZ30gY3Vyc29yIC0gVGhlIENTUyBjdXJzb3Igb2YgdGhpcyBoYW5kbGUuXG4gKi9cbnZhciBIQU5ETEVTID0gW3sgcG9zaXRpb246IFswLjAsIDAuMF0sIGNvbnN0cmFpbnRzOiBbMSwgMCwgMCwgMV0sIGN1cnNvcjogJ253LXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuNSwgMC4wXSwgY29uc3RyYWludHM6IFsxLCAwLCAwLCAwXSwgY3Vyc29yOiAnbi1yZXNpemUnIH0sIHsgcG9zaXRpb246IFsxLjAsIDAuMF0sIGNvbnN0cmFpbnRzOiBbMSwgMSwgMCwgMF0sIGN1cnNvcjogJ25lLXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzEuMCwgMC41XSwgY29uc3RyYWludHM6IFswLCAxLCAwLCAwXSwgY3Vyc29yOiAnZS1yZXNpemUnIH0sIHsgcG9zaXRpb246IFsxLjAsIDEuMF0sIGNvbnN0cmFpbnRzOiBbMCwgMSwgMSwgMF0sIGN1cnNvcjogJ3NlLXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuNSwgMS4wXSwgY29uc3RyYWludHM6IFswLCAwLCAxLCAwXSwgY3Vyc29yOiAncy1yZXNpemUnIH0sIHsgcG9zaXRpb246IFswLjAsIDEuMF0sIGNvbnN0cmFpbnRzOiBbMCwgMCwgMSwgMV0sIGN1cnNvcjogJ3N3LXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuMCwgMC41XSwgY29uc3RyYWludHM6IFswLCAwLCAwLCAxXSwgY3Vyc29yOiAndy1yZXNpemUnIH1dO1xudmFyIENyb3BwckNvcmUgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENyb3BwckNvcmUoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdmFyIGRlZmVycmVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDcm9wcHJDb3JlKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBDcm9wcHJDb3JlLnBhcnNlT3B0aW9ucyhvcHRpb25zIHx8IHt9KTtcbiAgICBpZiAoIWVsZW1lbnQubm9kZU5hbWUpIHtcbiAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyAnVW5hYmxlIHRvIGZpbmQgZWxlbWVudC4nO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzcmMnKSkge1xuICAgICAgdGhyb3cgJ0ltYWdlIHNyYyBub3QgcHJvdmlkZWQuJztcbiAgICB9XG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZXN0b3JlID0ge1xuICAgICAgcGFyZW50OiBlbGVtZW50LnBhcmVudE5vZGUsXG4gICAgICBlbGVtZW50OiBlbGVtZW50XG4gICAgfTtcbiAgICBpZiAoIWRlZmVycmVkKSB7XG4gICAgICBpZiAoZWxlbWVudC53aWR0aCA9PT0gMCB8fCBlbGVtZW50LmhlaWdodCA9PT0gMCkge1xuICAgICAgICBlbGVtZW50Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpcy5pbml0aWFsaXplKGVsZW1lbnQpO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjcmVhdGVDbGFzcyhDcm9wcHJDb3JlLCBbe1xuICAgIGtleTogJ2luaXRpYWxpemUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0aWFsaXplKGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuY3JlYXRlRE9NKGVsZW1lbnQpO1xuICAgICAgdGhpcy5vcHRpb25zLmNvbnZlcnRUb1BpeGVscyh0aGlzLmNyb3BwZXJFbCk7XG4gICAgICB0aGlzLmF0dGFjaEhhbmRsZXJFdmVudHMoKTtcbiAgICAgIHRoaXMuYXR0YWNoUmVnaW9uRXZlbnRzKCk7XG4gICAgICB0aGlzLmF0dGFjaE92ZXJsYXlFdmVudHMoKTtcbiAgICAgIHRoaXMuYm94ID0gdGhpcy5pbml0aWFsaXplQm94KHRoaXMub3B0aW9ucyk7XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkluaXRpYWxpemUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uSW5pdGlhbGl6ZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjcmVhdGVET00nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVET00odGFyZ2V0RWwpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMuY29udGFpbmVyRWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1jb250YWluZXInO1xuICAgICAgdGhpcy5ldmVudEJ1cyA9IHRoaXMuY29udGFpbmVyRWw7XG4gICAgICBlbmFibGVUb3VjaCh0aGlzLmNvbnRhaW5lckVsKTtcbiAgICAgIHRoaXMuY3JvcHBlckVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aGlzLmNyb3BwZXJFbC5jbGFzc05hbWUgPSAnY3JvcHByJztcbiAgICAgIHRoaXMuaW1hZ2VFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgdGhpcy5pbWFnZUVsLnNldEF0dHJpYnV0ZSgnc3JjJywgdGFyZ2V0RWwuZ2V0QXR0cmlidXRlKCdzcmMnKSk7XG4gICAgICB0aGlzLmltYWdlRWwuc2V0QXR0cmlidXRlKCdhbHQnLCB0YXJnZXRFbC5nZXRBdHRyaWJ1dGUoJ2FsdCcpKTtcbiAgICAgIHRoaXMuaW1hZ2VFbC5jbGFzc05hbWUgPSAnY3JvcHByLWltYWdlJztcbiAgICAgIHRoaXMuaW1hZ2VDbGlwcGVkRWwgPSB0aGlzLmltYWdlRWwuY2xvbmVOb2RlKCk7XG4gICAgICB0aGlzLmltYWdlQ2xpcHBlZEVsLmNsYXNzTmFtZSA9ICdjcm9wcHItaW1hZ2VDbGlwcGVkJztcbiAgICAgIHRoaXMucmVnaW9uRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMucmVnaW9uRWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1yZWdpb24nO1xuICAgICAgdGhpcy5vdmVybGF5RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMub3ZlcmxheUVsLmNsYXNzTmFtZSA9ICdjcm9wcHItb3ZlcmxheSc7XG4gICAgICB2YXIgaGFuZGxlQ29udGFpbmVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGhhbmRsZUNvbnRhaW5lckVsLmNsYXNzTmFtZSA9ICdjcm9wcHItaGFuZGxlQ29udGFpbmVyJztcbiAgICAgIHRoaXMuaGFuZGxlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBIQU5ETEVTLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBoYW5kbGUgPSBuZXcgSGFuZGxlKEhBTkRMRVNbaV0ucG9zaXRpb24sIEhBTkRMRVNbaV0uY29uc3RyYWludHMsIEhBTkRMRVNbaV0uY3Vyc29yLCB0aGlzLmV2ZW50QnVzKTtcbiAgICAgICAgdGhpcy5oYW5kbGVzLnB1c2goaGFuZGxlKTtcbiAgICAgICAgaGFuZGxlQ29udGFpbmVyRWwuYXBwZW5kQ2hpbGQoaGFuZGxlLmVsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3JvcHBlckVsLmFwcGVuZENoaWxkKHRoaXMuaW1hZ2VFbCk7XG4gICAgICB0aGlzLmNyb3BwZXJFbC5hcHBlbmRDaGlsZCh0aGlzLmltYWdlQ2xpcHBlZEVsKTtcbiAgICAgIHRoaXMuY3JvcHBlckVsLmFwcGVuZENoaWxkKHRoaXMucmVnaW9uRWwpO1xuICAgICAgdGhpcy5jcm9wcGVyRWwuYXBwZW5kQ2hpbGQodGhpcy5vdmVybGF5RWwpO1xuICAgICAgdGhpcy5jcm9wcGVyRWwuYXBwZW5kQ2hpbGQoaGFuZGxlQ29udGFpbmVyRWwpO1xuICAgICAgdGhpcy5jb250YWluZXJFbC5hcHBlbmRDaGlsZCh0aGlzLmNyb3BwZXJFbCk7XG4gICAgICB0YXJnZXRFbC5wYXJlbnRFbGVtZW50LnJlcGxhY2VDaGlsZCh0aGlzLmNvbnRhaW5lckVsLCB0YXJnZXRFbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGltYWdlIHNyYy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3JjXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdzZXRJbWFnZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEltYWdlKHNyYykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG4gICAgICB0aGlzLmltYWdlRWwub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczIuYm94ID0gX3RoaXMyLmluaXRpYWxpemVCb3goX3RoaXMyLm9wdGlvbnMpO1xuICAgICAgICBfdGhpczIucmVkcmF3KCk7XG4gICAgICB9O1xuICAgICAgdGhpcy5pbWFnZUVsLnNyYyA9IHNyYztcbiAgICAgIHRoaXMuaW1hZ2VDbGlwcGVkRWwuc3JjID0gc3JjO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZGVzdHJveScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLl9yZXN0b3JlLnBhcmVudC5yZXBsYWNlQ2hpbGQodGhpcy5fcmVzdG9yZS5lbGVtZW50LCB0aGlzLmNvbnRhaW5lckVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGJveCByZWdpb24gd2l0aCBhIHNldCBvZiBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIFRoZSBvcHRpb25zLlxuICAgICAqIEByZXR1cm5zIHtCb3h9XG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdpbml0aWFsaXplQm94JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZUJveChvcHRzKSB7XG4gICAgICB2YXIgd2lkdGggPSBvcHRzLnN0YXJ0U2l6ZS53aWR0aDtcbiAgICAgIHZhciBoZWlnaHQgPSBvcHRzLnN0YXJ0U2l6ZS5oZWlnaHQ7XG4gICAgICB2YXIgYm94ID0gbmV3IEJveCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIGJveC5jb25zdHJhaW5Ub1JhdGlvKG9wdHMuYXNwZWN0UmF0aW8sIFswLjUsIDAuNV0pO1xuICAgICAgdmFyIG1pbiA9IG9wdHMubWluU2l6ZTtcbiAgICAgIHZhciBtYXggPSBvcHRzLm1heFNpemU7XG4gICAgICBib3guY29uc3RyYWluVG9TaXplKG1heC53aWR0aCwgbWF4LmhlaWdodCwgbWluLndpZHRoLCBtaW4uaGVpZ2h0LCBbMC41LCAwLjVdLCBvcHRzLmFzcGVjdFJhdGlvKTtcbiAgICAgIHZhciBwYXJlbnRXaWR0aCA9IHRoaXMuY3JvcHBlckVsLm9mZnNldFdpZHRoO1xuICAgICAgdmFyIHBhcmVudEhlaWdodCA9IHRoaXMuY3JvcHBlckVsLm9mZnNldEhlaWdodDtcbiAgICAgIGJveC5jb25zdHJhaW5Ub0JvdW5kYXJ5KHBhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHQsIFswLjUsIDAuNV0pO1xuICAgICAgdmFyIHggPSB0aGlzLmNyb3BwZXJFbC5vZmZzZXRXaWR0aCAvIDIgLSBib3gud2lkdGgoKSAvIDI7XG4gICAgICB2YXIgeSA9IHRoaXMuY3JvcHBlckVsLm9mZnNldEhlaWdodCAvIDIgLSBib3guaGVpZ2h0KCkgLyAyO1xuICAgICAgYm94Lm1vdmUoeCwgeSk7XG4gICAgICByZXR1cm4gYm94O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3JlZHJhdycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlZHJhdygpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuICAgICAgdmFyIHdpZHRoID0gTWF0aC5yb3VuZCh0aGlzLmJveC53aWR0aCgpKSxcbiAgICAgICAgICBoZWlnaHQgPSBNYXRoLnJvdW5kKHRoaXMuYm94LmhlaWdodCgpKSxcbiAgICAgICAgICB4MSA9IE1hdGgucm91bmQodGhpcy5ib3gueDEpLFxuICAgICAgICAgIHkxID0gTWF0aC5yb3VuZCh0aGlzLmJveC55MSksXG4gICAgICAgICAgeDIgPSBNYXRoLnJvdW5kKHRoaXMuYm94LngyKSxcbiAgICAgICAgICB5MiA9IE1hdGgucm91bmQodGhpcy5ib3gueTIpO1xuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMy5yZWdpb25FbC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKCcgKyB4MSArICdweCwgJyArIHkxICsgJ3B4KSc7XG4gICAgICAgIF90aGlzMy5yZWdpb25FbC5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICAgICAgX3RoaXMzLnJlZ2lvbkVsLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gICAgICAgIF90aGlzMy5pbWFnZUNsaXBwZWRFbC5zdHlsZS5jbGlwID0gJ3JlY3QoJyArIHkxICsgJ3B4LCAnICsgeDIgKyAncHgsICcgKyB5MiArICdweCwgJyArIHgxICsgJ3B4KSc7XG4gICAgICAgIHZhciBjZW50ZXIgPSBfdGhpczMuYm94LmdldEFic29sdXRlUG9pbnQoWy41LCAuNV0pO1xuICAgICAgICB2YXIgeFNpZ24gPSBjZW50ZXJbMF0gLSBfdGhpczMuY3JvcHBlckVsLm9mZnNldFdpZHRoIC8gMiA+PiAzMTtcbiAgICAgICAgdmFyIHlTaWduID0gY2VudGVyWzFdIC0gX3RoaXMzLmNyb3BwZXJFbC5vZmZzZXRIZWlnaHQgLyAyID4+IDMxO1xuICAgICAgICB2YXIgcXVhZHJhbnQgPSAoeFNpZ24gXiB5U2lnbikgKyB5U2lnbiArIHlTaWduICsgNDtcbiAgICAgICAgdmFyIGZvcmVncm91bmRIYW5kbGVJbmRleCA9IC0yICogcXVhZHJhbnQgKyA4O1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF90aGlzMy5oYW5kbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGhhbmRsZSA9IF90aGlzMy5oYW5kbGVzW2ldO1xuICAgICAgICAgIHZhciBoYW5kbGVXaWR0aCA9IGhhbmRsZS5lbC5vZmZzZXRXaWR0aDtcbiAgICAgICAgICB2YXIgaGFuZGxlSGVpZ2h0ID0gaGFuZGxlLmVsLm9mZnNldEhlaWdodDtcbiAgICAgICAgICB2YXIgbGVmdCA9IHgxICsgd2lkdGggKiBoYW5kbGUucG9zaXRpb25bMF0gLSBoYW5kbGVXaWR0aCAvIDI7XG4gICAgICAgICAgdmFyIHRvcCA9IHkxICsgaGVpZ2h0ICogaGFuZGxlLnBvc2l0aW9uWzFdIC0gaGFuZGxlSGVpZ2h0IC8gMjtcbiAgICAgICAgICBoYW5kbGUuZWwuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgnICsgTWF0aC5yb3VuZChsZWZ0KSArICdweCwgJyArIE1hdGgucm91bmQodG9wKSArICdweCknO1xuICAgICAgICAgIGhhbmRsZS5lbC5zdHlsZS56SW5kZXggPSBmb3JlZ3JvdW5kSGFuZGxlSW5kZXggPT0gaSA/IDUgOiA0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdhdHRhY2hIYW5kbGVyRXZlbnRzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXR0YWNoSGFuZGxlckV2ZW50cygpIHtcbiAgICAgIHZhciBldmVudEJ1cyA9IHRoaXMuZXZlbnRCdXM7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVzdGFydCcsIHRoaXMub25IYW5kbGVNb3ZlU3RhcnQuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVtb3ZlJywgdGhpcy5vbkhhbmRsZU1vdmVNb3ZpbmcuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVlbmQnLCB0aGlzLm9uSGFuZGxlTW92ZUVuZC5iaW5kKHRoaXMpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdhdHRhY2hSZWdpb25FdmVudHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhdHRhY2hSZWdpb25FdmVudHMoKSB7XG4gICAgICB2YXIgZXZlbnRCdXMgPSB0aGlzLmV2ZW50QnVzO1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdGhpcy5yZWdpb25FbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25zdGFydCcsIHRoaXMub25SZWdpb25Nb3ZlU3RhcnQuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25tb3ZlJywgdGhpcy5vblJlZ2lvbk1vdmVNb3ZpbmcuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25lbmQnLCB0aGlzLm9uUmVnaW9uTW92ZUVuZC5iaW5kKHRoaXMpKTtcbiAgICAgIGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICAgICAgZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3JlZ2lvbnN0YXJ0Jywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdyZWdpb25tb3ZlJywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlVXAoZSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgICAgICBldmVudEJ1cy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgncmVnaW9uZW5kJywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnYXR0YWNoT3ZlcmxheUV2ZW50cycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGF0dGFjaE92ZXJsYXlFdmVudHMoKSB7XG4gICAgICB2YXIgU09VVEhFQVNUX0hBTkRMRV9JRFggPSA0O1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHRtcEJveCA9IG51bGw7XG4gICAgICB0aGlzLm92ZXJsYXlFbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgIHZhciBjb250YWluZXIgPSBzZWxmLmNyb3BwZXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdmFyIG1vdXNlWCA9IGUuY2xpZW50WCAtIGNvbnRhaW5lci5sZWZ0O1xuICAgICAgICB2YXIgbW91c2VZID0gZS5jbGllbnRZIC0gY29udGFpbmVyLnRvcDtcbiAgICAgICAgdG1wQm94ID0gc2VsZi5ib3g7XG4gICAgICAgIHNlbGYuYm94ID0gbmV3IEJveChtb3VzZVgsIG1vdXNlWSwgbW91c2VYICsgMSwgbW91c2VZICsgMSk7XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZXN0YXJ0Jywge1xuICAgICAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYuaGFuZGxlc1tTT1VUSEVBU1RfSEFORExFX0lEWF0gfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZW1vdmUnLCB7XG4gICAgICAgICAgZGV0YWlsOiB7IG1vdXNlWDogZS5jbGllbnRYLCBtb3VzZVk6IGUuY2xpZW50WSB9XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIG9uTW91c2VVcChlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgIGlmIChzZWxmLmJveC53aWR0aCgpID09PSAxICYmIHNlbGYuYm94LmhlaWdodCgpID09PSAxKSB7XG4gICAgICAgICAgc2VsZi5ib3ggPSB0bXBCb3g7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZWVuZCcsIHtcbiAgICAgICAgICBkZXRhaWw6IHsgbW91c2VYOiBlLmNsaWVudFgsIG1vdXNlWTogZS5jbGllbnRZIH1cbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uSGFuZGxlTW92ZVN0YXJ0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25IYW5kbGVNb3ZlU3RhcnQoZSkge1xuICAgICAgdmFyIGhhbmRsZSA9IGUuZGV0YWlsLmhhbmRsZTtcbiAgICAgIHZhciBvcmlnaW5Qb2ludCA9IFsxIC0gaGFuZGxlLnBvc2l0aW9uWzBdLCAxIC0gaGFuZGxlLnBvc2l0aW9uWzFdXTtcbiAgICAgIHZhciBfYm94JGdldEFic29sdXRlUG9pbnQgPSB0aGlzLmJveC5nZXRBYnNvbHV0ZVBvaW50KG9yaWdpblBvaW50KSxcbiAgICAgICAgICBfYm94JGdldEFic29sdXRlUG9pbnQyID0gc2xpY2VkVG9BcnJheShfYm94JGdldEFic29sdXRlUG9pbnQsIDIpLFxuICAgICAgICAgIG9yaWdpblggPSBfYm94JGdldEFic29sdXRlUG9pbnQyWzBdLFxuICAgICAgICAgIG9yaWdpblkgPSBfYm94JGdldEFic29sdXRlUG9pbnQyWzFdO1xuICAgICAgdGhpcy5hY3RpdmVIYW5kbGUgPSB7IGhhbmRsZTogaGFuZGxlLCBvcmlnaW5Qb2ludDogb3JpZ2luUG9pbnQsIG9yaWdpblg6IG9yaWdpblgsIG9yaWdpblk6IG9yaWdpblkgfTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wU3RhcnQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcFN0YXJ0KHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25IYW5kbGVNb3ZlTW92aW5nJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25IYW5kbGVNb3ZlTW92aW5nKGUpIHtcbiAgICAgIHZhciBfZSRkZXRhaWwgPSBlLmRldGFpbCxcbiAgICAgICAgICBtb3VzZVggPSBfZSRkZXRhaWwubW91c2VYLFxuICAgICAgICAgIG1vdXNlWSA9IF9lJGRldGFpbC5tb3VzZVk7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jcm9wcGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBtb3VzZVggPSBtb3VzZVggLSBjb250YWluZXIubGVmdDtcbiAgICAgIG1vdXNlWSA9IG1vdXNlWSAtIGNvbnRhaW5lci50b3A7XG4gICAgICBpZiAobW91c2VYIDwgMCkge1xuICAgICAgICBtb3VzZVggPSAwO1xuICAgICAgfSBlbHNlIGlmIChtb3VzZVggPiBjb250YWluZXIud2lkdGgpIHtcbiAgICAgICAgbW91c2VYID0gY29udGFpbmVyLndpZHRoO1xuICAgICAgfVxuICAgICAgaWYgKG1vdXNlWSA8IDApIHtcbiAgICAgICAgbW91c2VZID0gMDtcbiAgICAgIH0gZWxzZSBpZiAobW91c2VZID4gY29udGFpbmVyLmhlaWdodCkge1xuICAgICAgICBtb3VzZVkgPSBjb250YWluZXIuaGVpZ2h0O1xuICAgICAgfVxuICAgICAgdmFyIG9yaWdpbiA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblBvaW50LnNsaWNlKCk7XG4gICAgICB2YXIgb3JpZ2luWCA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblg7XG4gICAgICB2YXIgb3JpZ2luWSA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblk7XG4gICAgICB2YXIgaGFuZGxlID0gdGhpcy5hY3RpdmVIYW5kbGUuaGFuZGxlO1xuICAgICAgdmFyIFRPUF9NT1ZBQkxFID0gaGFuZGxlLmNvbnN0cmFpbnRzWzBdID09PSAxO1xuICAgICAgdmFyIFJJR0hUX01PVkFCTEUgPSBoYW5kbGUuY29uc3RyYWludHNbMV0gPT09IDE7XG4gICAgICB2YXIgQk9UVE9NX01PVkFCTEUgPSBoYW5kbGUuY29uc3RyYWludHNbMl0gPT09IDE7XG4gICAgICB2YXIgTEVGVF9NT1ZBQkxFID0gaGFuZGxlLmNvbnN0cmFpbnRzWzNdID09PSAxO1xuICAgICAgdmFyIE1VTFRJX0FYSVMgPSAoTEVGVF9NT1ZBQkxFIHx8IFJJR0hUX01PVkFCTEUpICYmIChUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSk7XG4gICAgICB2YXIgeDEgPSBMRUZUX01PVkFCTEUgfHwgUklHSFRfTU9WQUJMRSA/IG9yaWdpblggOiB0aGlzLmJveC54MTtcbiAgICAgIHZhciB4MiA9IExFRlRfTU9WQUJMRSB8fCBSSUdIVF9NT1ZBQkxFID8gb3JpZ2luWCA6IHRoaXMuYm94LngyO1xuICAgICAgdmFyIHkxID0gVE9QX01PVkFCTEUgfHwgQk9UVE9NX01PVkFCTEUgPyBvcmlnaW5ZIDogdGhpcy5ib3gueTE7XG4gICAgICB2YXIgeTIgPSBUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSA/IG9yaWdpblkgOiB0aGlzLmJveC55MjtcbiAgICAgIHgxID0gTEVGVF9NT1ZBQkxFID8gbW91c2VYIDogeDE7XG4gICAgICB4MiA9IFJJR0hUX01PVkFCTEUgPyBtb3VzZVggOiB4MjtcbiAgICAgIHkxID0gVE9QX01PVkFCTEUgPyBtb3VzZVkgOiB5MTtcbiAgICAgIHkyID0gQk9UVE9NX01PVkFCTEUgPyBtb3VzZVkgOiB5MjtcbiAgICAgIHZhciBpc0ZsaXBwZWRYID0gZmFsc2UsXG4gICAgICAgICAgaXNGbGlwcGVkWSA9IGZhbHNlO1xuICAgICAgaWYgKExFRlRfTU9WQUJMRSB8fCBSSUdIVF9NT1ZBQkxFKSB7XG4gICAgICAgIGlzRmxpcHBlZFggPSBMRUZUX01PVkFCTEUgPyBtb3VzZVggPiBvcmlnaW5YIDogbW91c2VYIDwgb3JpZ2luWDtcbiAgICAgIH1cbiAgICAgIGlmIChUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSkge1xuICAgICAgICBpc0ZsaXBwZWRZID0gVE9QX01PVkFCTEUgPyBtb3VzZVkgPiBvcmlnaW5ZIDogbW91c2VZIDwgb3JpZ2luWTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0ZsaXBwZWRYKSB7XG4gICAgICAgIHZhciB0bXAgPSB4MTt4MSA9IHgyO3gyID0gdG1wO1xuICAgICAgICBvcmlnaW5bMF0gPSAxIC0gb3JpZ2luWzBdO1xuICAgICAgfVxuICAgICAgaWYgKGlzRmxpcHBlZFkpIHtcbiAgICAgICAgdmFyIF90bXAgPSB5MTt5MSA9IHkyO3kyID0gX3RtcDtcbiAgICAgICAgb3JpZ2luWzFdID0gMSAtIG9yaWdpblsxXTtcbiAgICAgIH1cbiAgICAgIHZhciBib3ggPSBuZXcgQm94KHgxLCB5MSwgeDIsIHkyKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXNwZWN0UmF0aW8pIHtcbiAgICAgICAgdmFyIHJhdGlvID0gdGhpcy5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgICB2YXIgaXNWZXJ0aWNhbE1vdmVtZW50ID0gZmFsc2U7XG4gICAgICAgIGlmIChNVUxUSV9BWElTKSB7XG4gICAgICAgICAgaXNWZXJ0aWNhbE1vdmVtZW50ID0gbW91c2VZID4gYm94LnkxICsgcmF0aW8gKiBib3gud2lkdGgoKSB8fCBtb3VzZVkgPCBib3gueTIgLSByYXRpbyAqIGJveC53aWR0aCgpO1xuICAgICAgICB9IGVsc2UgaWYgKFRPUF9NT1ZBQkxFIHx8IEJPVFRPTV9NT1ZBQkxFKSB7XG4gICAgICAgICAgaXNWZXJ0aWNhbE1vdmVtZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmF0aW9Nb2RlID0gaXNWZXJ0aWNhbE1vdmVtZW50ID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgICAgICBib3guY29uc3RyYWluVG9SYXRpbyhyYXRpbywgb3JpZ2luLCByYXRpb01vZGUpO1xuICAgICAgfVxuICAgICAgdmFyIG1pbiA9IHRoaXMub3B0aW9ucy5taW5TaXplO1xuICAgICAgdmFyIG1heCA9IHRoaXMub3B0aW9ucy5tYXhTaXplO1xuICAgICAgYm94LmNvbnN0cmFpblRvU2l6ZShtYXgud2lkdGgsIG1heC5oZWlnaHQsIG1pbi53aWR0aCwgbWluLmhlaWdodCwgb3JpZ2luLCB0aGlzLm9wdGlvbnMuYXNwZWN0UmF0aW8pO1xuICAgICAgdmFyIHBhcmVudFdpZHRoID0gdGhpcy5jcm9wcGVyRWwub2Zmc2V0V2lkdGg7XG4gICAgICB2YXIgcGFyZW50SGVpZ2h0ID0gdGhpcy5jcm9wcGVyRWwub2Zmc2V0SGVpZ2h0O1xuICAgICAgYm94LmNvbnN0cmFpblRvQm91bmRhcnkocGFyZW50V2lkdGgsIHBhcmVudEhlaWdodCwgb3JpZ2luKTtcbiAgICAgIHRoaXMuYm94ID0gYm94O1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wTW92ZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wTW92ZSh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uSGFuZGxlTW92ZUVuZCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uSGFuZGxlTW92ZUVuZChlKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25SZWdpb25Nb3ZlU3RhcnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVTdGFydChlKSB7XG4gICAgICB2YXIgX2UkZGV0YWlsMiA9IGUuZGV0YWlsLFxuICAgICAgICAgIG1vdXNlWCA9IF9lJGRldGFpbDIubW91c2VYLFxuICAgICAgICAgIG1vdXNlWSA9IF9lJGRldGFpbDIubW91c2VZO1xuICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY3JvcHBlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgbW91c2VYID0gbW91c2VYIC0gY29udGFpbmVyLmxlZnQ7XG4gICAgICBtb3VzZVkgPSBtb3VzZVkgLSBjb250YWluZXIudG9wO1xuICAgICAgdGhpcy5jdXJyZW50TW92ZSA9IHtcbiAgICAgICAgb2Zmc2V0WDogbW91c2VYIC0gdGhpcy5ib3gueDEsXG4gICAgICAgIG9mZnNldFk6IG1vdXNlWSAtIHRoaXMuYm94LnkxXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BTdGFydCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wU3RhcnQodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvblJlZ2lvbk1vdmVNb3ZpbmcnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVNb3ZpbmcoZSkge1xuICAgICAgdmFyIF9lJGRldGFpbDMgPSBlLmRldGFpbCxcbiAgICAgICAgICBtb3VzZVggPSBfZSRkZXRhaWwzLm1vdXNlWCxcbiAgICAgICAgICBtb3VzZVkgPSBfZSRkZXRhaWwzLm1vdXNlWTtcbiAgICAgIHZhciBfY3VycmVudE1vdmUgPSB0aGlzLmN1cnJlbnRNb3ZlLFxuICAgICAgICAgIG9mZnNldFggPSBfY3VycmVudE1vdmUub2Zmc2V0WCxcbiAgICAgICAgICBvZmZzZXRZID0gX2N1cnJlbnRNb3ZlLm9mZnNldFk7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jcm9wcGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBtb3VzZVggPSBtb3VzZVggLSBjb250YWluZXIubGVmdDtcbiAgICAgIG1vdXNlWSA9IG1vdXNlWSAtIGNvbnRhaW5lci50b3A7XG4gICAgICB0aGlzLmJveC5tb3ZlKG1vdXNlWCAtIG9mZnNldFgsIG1vdXNlWSAtIG9mZnNldFkpO1xuICAgICAgaWYgKHRoaXMuYm94LngxIDwgMCkge1xuICAgICAgICB0aGlzLmJveC5tb3ZlKDAsIG51bGwpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYm94LngyID4gY29udGFpbmVyLndpZHRoKSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUoY29udGFpbmVyLndpZHRoIC0gdGhpcy5ib3gud2lkdGgoKSwgbnVsbCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ib3gueTEgPCAwKSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUobnVsbCwgMCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ib3gueTIgPiBjb250YWluZXIuaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUobnVsbCwgY29udGFpbmVyLmhlaWdodCAtIHRoaXMuYm94LmhlaWdodCgpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcE1vdmUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcE1vdmUodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvblJlZ2lvbk1vdmVFbmQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVFbmQoZSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BFbmQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcEVuZCh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUoKSB7XG4gICAgICB2YXIgbW9kZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbnVsbDtcbiAgICAgIGlmIChtb2RlID09PSBudWxsKSB7XG4gICAgICAgIG1vZGUgPSB0aGlzLm9wdGlvbnMucmV0dXJuTW9kZTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2RlID09ICdyZWFsJykge1xuICAgICAgICB2YXIgYWN0dWFsV2lkdGggPSB0aGlzLmltYWdlRWwubmF0dXJhbFdpZHRoO1xuICAgICAgICB2YXIgYWN0dWFsSGVpZ2h0ID0gdGhpcy5pbWFnZUVsLm5hdHVyYWxIZWlnaHQ7XG4gICAgICAgIHZhciBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MgPSB0aGlzLmltYWdlRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICBlbGVtZW50V2lkdGggPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0Mud2lkdGgsXG4gICAgICAgICAgICBlbGVtZW50SGVpZ2h0ID0gX2ltYWdlRWwkZ2V0Qm91bmRpbmdDLmhlaWdodDtcbiAgICAgICAgdmFyIGZhY3RvclggPSBhY3R1YWxXaWR0aCAvIGVsZW1lbnRXaWR0aDtcbiAgICAgICAgdmFyIGZhY3RvclkgPSBhY3R1YWxIZWlnaHQgLyBlbGVtZW50SGVpZ2h0O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IE1hdGgucm91bmQodGhpcy5ib3gueDEgKiBmYWN0b3JYKSxcbiAgICAgICAgICB5OiBNYXRoLnJvdW5kKHRoaXMuYm94LnkxICogZmFjdG9yWSksXG4gICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQodGhpcy5ib3gud2lkdGgoKSAqIGZhY3RvclgpLFxuICAgICAgICAgIGhlaWdodDogTWF0aC5yb3VuZCh0aGlzLmJveC5oZWlnaHQoKSAqIGZhY3RvclkpXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gJ3JhdGlvJykge1xuICAgICAgICB2YXIgX2ltYWdlRWwkZ2V0Qm91bmRpbmdDMiA9IHRoaXMuaW1hZ2VFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgICAgIF9lbGVtZW50V2lkdGggPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MyLndpZHRoLFxuICAgICAgICAgICAgX2VsZW1lbnRIZWlnaHQgPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MyLmhlaWdodDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiByb3VuZCh0aGlzLmJveC54MSAvIF9lbGVtZW50V2lkdGgsIDMpLFxuICAgICAgICAgIHk6IHJvdW5kKHRoaXMuYm94LnkxIC8gX2VsZW1lbnRIZWlnaHQsIDMpLFxuICAgICAgICAgIHdpZHRoOiByb3VuZCh0aGlzLmJveC53aWR0aCgpIC8gX2VsZW1lbnRXaWR0aCwgMyksXG4gICAgICAgICAgaGVpZ2h0OiByb3VuZCh0aGlzLmJveC5oZWlnaHQoKSAvIF9lbGVtZW50SGVpZ2h0LCAzKVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChtb2RlID09ICdyYXcnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogTWF0aC5yb3VuZCh0aGlzLmJveC54MSksXG4gICAgICAgICAgeTogTWF0aC5yb3VuZCh0aGlzLmJveC55MSksXG4gICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQodGhpcy5ib3gud2lkdGgoKSksXG4gICAgICAgICAgaGVpZ2h0OiBNYXRoLnJvdW5kKHRoaXMuYm94LmhlaWdodCgpKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiAncGFyc2VPcHRpb25zJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VPcHRpb25zKG9wdHMpIHtcbiAgICAgIHZhciBkZWZhdWx0cyQkMSA9IHtcbiAgICAgICAgYXNwZWN0UmF0aW86IG51bGwsXG4gICAgICAgIG1heFNpemU6IHsgd2lkdGg6IG51bGwsIGhlaWdodDogbnVsbCB9LFxuICAgICAgICBtaW5TaXplOiB7IHdpZHRoOiBudWxsLCBoZWlnaHQ6IG51bGwgfSxcbiAgICAgICAgc3RhcnRTaXplOiB7IHdpZHRoOiAxMDAsIGhlaWdodDogMTAwLCB1bml0OiAnJScgfSxcbiAgICAgICAgcmV0dXJuTW9kZTogJ3JlYWwnLFxuICAgICAgICBvbkluaXRpYWxpemU6IG51bGwsXG4gICAgICAgIG9uQ3JvcFN0YXJ0OiBudWxsLFxuICAgICAgICBvbkNyb3BNb3ZlOiBudWxsLFxuICAgICAgICBvbkNyb3BFbmQ6IG51bGxcbiAgICAgIH07XG4gICAgICB2YXIgYXNwZWN0UmF0aW8gPSBudWxsO1xuICAgICAgaWYgKG9wdHMuYXNwZWN0UmF0aW8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMuYXNwZWN0UmF0aW8gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgYXNwZWN0UmF0aW8gPSBvcHRzLmFzcGVjdFJhdGlvO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdHMuYXNwZWN0UmF0aW8gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGFzcGVjdFJhdGlvID0gb3B0cy5hc3BlY3RSYXRpb1sxXSAvIG9wdHMuYXNwZWN0UmF0aW9bMF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBtYXhTaXplID0gbnVsbDtcbiAgICAgIGlmIChvcHRzLm1heFNpemUgIT09IHVuZGVmaW5lZCAmJiBvcHRzLm1heFNpemUgIT09IG51bGwpIHtcbiAgICAgICAgbWF4U2l6ZSA9IHtcbiAgICAgICAgICB3aWR0aDogb3B0cy5tYXhTaXplWzBdIHx8IG51bGwsXG4gICAgICAgICAgaGVpZ2h0OiBvcHRzLm1heFNpemVbMV0gfHwgbnVsbCxcbiAgICAgICAgICB1bml0OiBvcHRzLm1heFNpemVbMl0gfHwgJ3B4J1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdmFyIG1pblNpemUgPSBudWxsO1xuICAgICAgaWYgKG9wdHMubWluU2l6ZSAhPT0gdW5kZWZpbmVkICYmIG9wdHMubWluU2l6ZSAhPT0gbnVsbCkge1xuICAgICAgICBtaW5TaXplID0ge1xuICAgICAgICAgIHdpZHRoOiBvcHRzLm1pblNpemVbMF0gfHwgbnVsbCxcbiAgICAgICAgICBoZWlnaHQ6IG9wdHMubWluU2l6ZVsxXSB8fCBudWxsLFxuICAgICAgICAgIHVuaXQ6IG9wdHMubWluU2l6ZVsyXSB8fCAncHgnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgc3RhcnRTaXplID0gbnVsbDtcbiAgICAgIGlmIChvcHRzLnN0YXJ0U2l6ZSAhPT0gdW5kZWZpbmVkICYmIG9wdHMuc3RhcnRTaXplICE9PSBudWxsKSB7XG4gICAgICAgIHN0YXJ0U2l6ZSA9IHtcbiAgICAgICAgICB3aWR0aDogb3B0cy5zdGFydFNpemVbMF0gfHwgbnVsbCxcbiAgICAgICAgICBoZWlnaHQ6IG9wdHMuc3RhcnRTaXplWzFdIHx8IG51bGwsXG4gICAgICAgICAgdW5pdDogb3B0cy5zdGFydFNpemVbMl0gfHwgJyUnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgb25Jbml0aWFsaXplID0gbnVsbDtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5vbkluaXRpYWxpemUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb25Jbml0aWFsaXplID0gb3B0cy5vbkluaXRpYWxpemU7XG4gICAgICB9XG4gICAgICB2YXIgb25Dcm9wU3RhcnQgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uQ3JvcFN0YXJ0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9uQ3JvcFN0YXJ0ID0gb3B0cy5vbkNyb3BTdGFydDtcbiAgICAgIH1cbiAgICAgIHZhciBvbkNyb3BFbmQgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uQ3JvcEVuZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbkNyb3BFbmQgPSBvcHRzLm9uQ3JvcEVuZDtcbiAgICAgIH1cbiAgICAgIHZhciBvbkNyb3BNb3ZlID0gbnVsbDtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5vblVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0Nyb3Bwci5qczogYG9uVXBkYXRlYCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS4gUGxlYXNlIHVzZSBgb25Dcm9wTW92ZWAgb3IgYG9uQ3JvcEVuZGAgaW5zdGVhZC4nKTtcbiAgICAgICAgb25Dcm9wTW92ZSA9IG9wdHMub25VcGRhdGU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9wdHMub25Dcm9wTW92ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbkNyb3BNb3ZlID0gb3B0cy5vbkNyb3BNb3ZlO1xuICAgICAgfVxuICAgICAgdmFyIHJldHVybk1vZGUgPSBudWxsO1xuICAgICAgaWYgKG9wdHMucmV0dXJuTW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBzID0gb3B0cy5yZXR1cm5Nb2RlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChbJ3JlYWwnLCAncmF0aW8nLCAncmF3J10uaW5kZXhPZihzKSA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBcIkludmFsaWQgcmV0dXJuIG1vZGUuXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuTW9kZSA9IHM7XG4gICAgICB9XG4gICAgICB2YXIgY29udmVydFRvUGl4ZWxzID0gZnVuY3Rpb24gY29udmVydFRvUGl4ZWxzKGNvbnRhaW5lcikge1xuICAgICAgICB2YXIgd2lkdGggPSBjb250YWluZXIub2Zmc2V0V2lkdGg7XG4gICAgICAgIHZhciBoZWlnaHQgPSBjb250YWluZXIub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB2YXIgc2l6ZUtleXMgPSBbJ21heFNpemUnLCAnbWluU2l6ZScsICdzdGFydFNpemUnXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBrZXkgPSBzaXplS2V5c1tpXTtcbiAgICAgICAgICBpZiAodGhpc1trZXldICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpc1trZXldLnVuaXQgPT0gJyUnKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzW2tleV0ud2lkdGggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2tleV0ud2lkdGggPSB0aGlzW2tleV0ud2lkdGggLyAxMDAgKiB3aWR0aDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodGhpc1trZXldLmhlaWdodCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXNba2V5XS5oZWlnaHQgPSB0aGlzW2tleV0uaGVpZ2h0IC8gMTAwICogaGVpZ2h0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgdGhpc1trZXldLnVuaXQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IGZ1bmN0aW9uIGRlZmF1bHRWYWx1ZSh2LCBkKSB7XG4gICAgICAgIHJldHVybiB2ICE9PSBudWxsID8gdiA6IGQ7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXNwZWN0UmF0aW86IGRlZmF1bHRWYWx1ZShhc3BlY3RSYXRpbywgZGVmYXVsdHMkJDEuYXNwZWN0UmF0aW8pLFxuICAgICAgICBtYXhTaXplOiBkZWZhdWx0VmFsdWUobWF4U2l6ZSwgZGVmYXVsdHMkJDEubWF4U2l6ZSksXG4gICAgICAgIG1pblNpemU6IGRlZmF1bHRWYWx1ZShtaW5TaXplLCBkZWZhdWx0cyQkMS5taW5TaXplKSxcbiAgICAgICAgc3RhcnRTaXplOiBkZWZhdWx0VmFsdWUoc3RhcnRTaXplLCBkZWZhdWx0cyQkMS5zdGFydFNpemUpLFxuICAgICAgICByZXR1cm5Nb2RlOiBkZWZhdWx0VmFsdWUocmV0dXJuTW9kZSwgZGVmYXVsdHMkJDEucmV0dXJuTW9kZSksXG4gICAgICAgIG9uSW5pdGlhbGl6ZTogZGVmYXVsdFZhbHVlKG9uSW5pdGlhbGl6ZSwgZGVmYXVsdHMkJDEub25Jbml0aWFsaXplKSxcbiAgICAgICAgb25Dcm9wU3RhcnQ6IGRlZmF1bHRWYWx1ZShvbkNyb3BTdGFydCwgZGVmYXVsdHMkJDEub25Dcm9wU3RhcnQpLFxuICAgICAgICBvbkNyb3BNb3ZlOiBkZWZhdWx0VmFsdWUob25Dcm9wTW92ZSwgZGVmYXVsdHMkJDEub25Dcm9wTW92ZSksXG4gICAgICAgIG9uQ3JvcEVuZDogZGVmYXVsdFZhbHVlKG9uQ3JvcEVuZCwgZGVmYXVsdHMkJDEub25Dcm9wRW5kKSxcbiAgICAgICAgY29udmVydFRvUGl4ZWxzOiBjb252ZXJ0VG9QaXhlbHNcbiAgICAgIH07XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBDcm9wcHJDb3JlO1xufSgpO1xuZnVuY3Rpb24gcm91bmQodmFsdWUsIGRlY2ltYWxzKSB7XG4gIHJldHVybiBOdW1iZXIoTWF0aC5yb3VuZCh2YWx1ZSArICdlJyArIGRlY2ltYWxzKSArICdlLScgKyBkZWNpbWFscyk7XG59XG5cbnZhciBDcm9wcHIkMSA9IGZ1bmN0aW9uIChfQ3JvcHByQ29yZSkge1xuICBpbmhlcml0cyhDcm9wcHIsIF9Dcm9wcHJDb3JlKTtcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBDYWxscyB0aGUgQ3JvcHByQ29yZSdzIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgZnVuY3Rpb24gQ3JvcHByKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB2YXIgX2RlZmVycmVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDcm9wcHIpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChDcm9wcHIuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihDcm9wcHIpKS5jYWxsKHRoaXMsIGVsZW1lbnQsIG9wdGlvbnMsIF9kZWZlcnJlZCkpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY3JvcCByZWdpb24uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbbW9kZV0gV2hpY2ggbW9kZSBvZiBjYWxjdWxhdGlvbiB0byB1c2U6ICdyZWFsJywgJ3JhdGlvJyBvclxuICAgKiAgICAgICdyYXcnLlxuICAgKi9cbiAgY3JlYXRlQ2xhc3MoQ3JvcHByLCBbe1xuICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUobW9kZSkge1xuICAgICAgcmV0dXJuIGdldChDcm9wcHIucHJvdG90eXBlLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ3JvcHByLnByb3RvdHlwZSksICdnZXRWYWx1ZScsIHRoaXMpLmNhbGwodGhpcywgbW9kZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGltYWdlIHNyYy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3JjXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdzZXRJbWFnZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEltYWdlKHNyYykge1xuICAgICAgcmV0dXJuIGdldChDcm9wcHIucHJvdG90eXBlLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ3JvcHByLnByb3RvdHlwZSksICdzZXRJbWFnZScsIHRoaXMpLmNhbGwodGhpcywgc3JjKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdkZXN0cm95JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHJldHVybiBnZXQoQ3JvcHByLnByb3RvdHlwZS5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKENyb3Bwci5wcm90b3R5cGUpLCAnZGVzdHJveScsIHRoaXMpLmNhbGwodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vdmVzIHRoZSBjcm9wIHJlZ2lvbiB0byBhIHNwZWNpZmllZCBjb29yZGluYXRlLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ21vdmVUbycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1vdmVUbyh4LCB5KSB7XG4gICAgICB0aGlzLmJveC5tb3ZlKHgsIHkpO1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wRW5kICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5vbkNyb3BFbmQodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNpemVzIHRoZSBjcm9wIHJlZ2lvbiB0byBhIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHRcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBvcmlnaW4gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgIERlZmF1bHRzIHRvIFswLjUsIDAuNV0gKGNlbnRlcikuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdyZXNpemVUbycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2l6ZVRvKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IFsuNSwgLjVdO1xuICAgICAgdGhpcy5ib3gucmVzaXplKHdpZHRoLCBoZWlnaHQsIG9yaWdpbik7XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BFbmQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcEVuZCh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNjYWxlIHRoZSBjcm9wIHJlZ2lvbiBieSBhIGZhY3Rvci5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZmFjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gb3JpZ2luIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgICBEZWZhdWx0cyB0byBbMC41LCAwLjVdIChjZW50ZXIpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnc2NhbGVCeScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNjYWxlQnkoZmFjdG9yKSB7XG4gICAgICB2YXIgb3JpZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbLjUsIC41XTtcbiAgICAgIHRoaXMuYm94LnNjYWxlKGZhY3Rvciwgb3JpZ2luKTtcbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdyZXNldCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgdGhpcy5ib3ggPSB0aGlzLmluaXRpYWxpemVCb3godGhpcy5vcHRpb25zKTtcbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIENyb3Bwcjtcbn0oQ3JvcHByQ29yZSk7XG5cbnJldHVybiBDcm9wcHIkMTtcblxufSkpKTtcbiIsICJleHBvcnQgZW51bSBMaWNlbmNlU3RhdHVzIHtcclxuICBJbnZhbGlkLFxyXG4gIFZhbGlkLFxyXG4gIEV4cGlyZVNvb24sXHJcbiAgRXhwaXJlZFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElMaWNlbmNlIHtcclxuICByZWFkb25seSBTdGF0dXM/OiBMaWNlbmNlU3RhdHVzO1xyXG4gIHJlYWRvbmx5IE5hbWU6IHN0cmluZztcclxuICByZWFkb25seSBPd25lcjogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IEV4cGlyYXRpb25EYXRlOiBEYXRlIHwgc3RyaW5nO1xyXG4gIHJlYWRvbmx5IEFwcGxpY2F0aW9uczogUmVhZG9ubHlBcnJheTxzdHJpbmc+O1xyXG4gIHJlYWRvbmx5IFNvdXJjZUNvbnRlbnQ6IHN0cmluZztcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGVudW0gTWVudUl0ZW1UeXBlIHtcclxuICBHcmlkVmlldyA9IDAsXHJcbiAgRGFzaGJvYXJkID0gMSxcclxuICBNZW51Tm9kZSA9IDIsXHJcbiAgUmVwb3J0ID0gMyxcclxuICBEaWFncmFtID0gNCxcclxuICBDRE0gPSA1LFxyXG4gIFNsaWRlc2hvdyA9IDYsXHJcbiAgR2FudHRDaGFydCA9IDdcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbm90aWZ5KG1zZzogc3RyaW5nLCBzdWNjZWVkOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gIGNvbnN0IHN0YXR1cyA9IHN1Y2NlZWQgPyAnc3VjY2VzcycgOiAnZXJyb3InO1xyXG4gIGNvbnN0IGRpc3BsYXlUaW1lID0gc3VjY2VlZCA/IDIwMDAgOiA0MDAwO1xyXG5cclxuICBEZXZFeHByZXNzLnVpLm5vdGlmeSh7XHJcbiAgICBtZXNzYWdlOiBtc2csXHJcbiAgICB0eXBlOiBzdGF0dXMsXHJcbiAgICBvblNob3dpbmc6IChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1lc3NhZ2VFbGVtZW50ID0gZS5lbGVtZW50LmZpbmQoJy5keC10b2FzdC1tZXNzYWdlJyk7XHJcbiAgICAgIG1lc3NhZ2VFbGVtZW50Lmh0bWwoKG1lc3NhZ2VFbGVtZW50Lmh0bWwoKSB8fCAnJykucmVwbGFjZSgnXFxcXG4nLCAnPGJyIC8+JykpO1xyXG4gICAgfVxyXG4gIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvYXN0T3B0aW9ucywgc3RhdHVzLCBkaXNwbGF5VGltZSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuXHJcbmV4cG9ydCBjb25zdCBpc0Vycm9ySW5mbyA9IChcclxuICByZXNwb25zZURhdGE6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBJRXJyb3JJbmZvIHwgSUVycm9ySW5mb1tdIHwgdW5kZWZpbmVkIHwgbnVsbFxyXG4pOiByZXNwb25zZURhdGEgaXMgSUVycm9ySW5mbyB8IElFcnJvckluZm9bXSA9PiB7XHJcbiAgaWYgKCFyZXNwb25zZURhdGEpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHJlc3BvbnNlRGF0YSlcclxuICAgID8gKHJlc3BvbnNlRGF0YVswXS5TdGFja1RyYWNlICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2VEYXRhWzBdLkVycm9yICE9PSB1bmRlZmluZWQpXHJcbiAgICA6IChyZXNwb25zZURhdGEuRXJyb3IgIT09IHVuZGVmaW5lZCk7XHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElFcnJvckluZm8ge1xyXG4gIEVycm9yOiBzdHJpbmc7XHJcbiAgU3RhY2tUcmFjZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElBcGlSZXNwb25zZTxUPiB7XHJcbiAgRGF0YTogVCB8IElFcnJvckluZm8gfCBJRXJyb3JJbmZvW10gfCB1bmRlZmluZWQ7XHJcbiAgTWVzc2FnZTogc3RyaW5nO1xyXG4gIFJlcXVlc3RTdGF0ZTogUmVxdWVzdFN0YXRlO1xyXG4gIFN0YXR1c0NvZGU6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTG9va3VwRHRvPFQ+IHtcclxuICBWYWx1ZTogVDtcclxuICBUZXh0OiBzdHJpbmc7XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBlbnVtIFJlcXVlc3RTdGF0ZSB7XHJcbiAgQ29tcGxldGVkID0gMSxcclxuICBFcnJvcmVkID0gMlxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBDU1NfQ0xBU1NFUyB9IGZyb20gJy4uL1N0eWxpbmcvSW5kZXgnO1xyXG5cclxuY29uc3QgUE9QVVBfQ09OVEVOVF9DTEFTUyA9ICdwb3B1cC1jb250ZW50JztcclxuY29uc3QgUE9QVVBfRk9PVEVSX0NMQVNTID0gJ3BvcHVwLWZvb3Rlcic7XHJcbmNvbnN0IEJVVFRPTlNfQ0xBU1MgPSAnYnV0dG9ucyc7XHJcbmNvbnN0IE9LX0JUTl9DTEFTUyA9ICdvay1idG4nO1xyXG5jb25zdCBDQU5DRUxfQlROX0NMQVNTID0gJ2NhbmNlbC1idG4nO1xyXG5cclxuaW50ZXJmYWNlIElQb3B1cCB7XHJcbiAgc2hvdzogKCkgPT4gdm9pZDtcclxuICBoaWRlOiAoKSA9PiB2b2lkO1xyXG4gIHJlbW92ZTogKCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUG9wdXBCdXR0b25PcHRpb25zIHtcclxuICB0ZXh0OiBzdHJpbmc7XHJcbiAgaWNvbj86IHN0cmluZztcclxuICBkaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgb25DbGljazogKGNsb3NlUG9wdXApID0+IHZvaWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUxheW91dCgkY29udGFpbmVyLCBjb250ZW50Q2xhc3NOYW1lPykge1xyXG4gIHJldHVybiB7XHJcbiAgICAkY29udGVudDogJCgnPGRpdiAvPicpLmFkZENsYXNzKFBPUFVQX0NPTlRFTlRfQ0xBU1MpLmFkZENsYXNzKGNvbnRlbnRDbGFzc05hbWUpLmFwcGVuZFRvKCRjb250YWluZXIpLFxyXG4gICAgJGZvb3RlcjogJCgnPGRpdiAvPicpLmFkZENsYXNzKFBPUFVQX0ZPT1RFUl9DTEFTUykuYXBwZW5kVG8oJGNvbnRhaW5lcilcclxuICB9O1xyXG59XHJcblxyXG5jb25zdCBzaG93blBvcHVwcyA9IFtdO1xyXG5cclxuZnVuY3Rpb24gY3JlYXRlUG9wdXAoJGVsOiBKUXVlcnksIGR4UG9wdXBPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuUHJvcGVydGllcywgdXNlS2V5UHJlc3NCZWhhdmlvcjogYm9vbGVhbiA9IGZhbHNlKTogSVBvcHVwIHtcclxuICBjb25zdCBzYXZlZE9uU2hvd2luZyA9IGR4UG9wdXBPcHRpb25zLm9uU2hvd2luZztcclxuXHJcbiAgZHhQb3B1cE9wdGlvbnMub25TaG93biA9IChlKSA9PiB7XHJcbiAgICBpZiAoc2F2ZWRPblNob3dpbmcpIHtcclxuICAgICAgc2F2ZWRPblNob3dpbmcoZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYWxsSW5wdXRzID0gcG9wdXAuY29udGVudCgpLmZpbmQoJ2lucHV0W3R5cGU9dGV4dF0nKTtcclxuICAgIGNvbnN0IGZpcnN0SW5wdXQgPSBhbGxJbnB1dHMuZXEoMCk7XHJcblxyXG4gICAgZmlyc3RJbnB1dC5mb2N1cygpO1xyXG5cclxuICAgIGNvbnN0IGtleUhhbmRsZXJzID0ge1xyXG4gICAgICBrZXlkb3duOiAoZXY6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChzaG93blBvcHVwc1tzaG93blBvcHVwcy5sZW5ndGggLSAxXSAhPT0gcG9wdXApIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChldi5rZXlDb2RlID09PSAxMykge1xyXG4gICAgICAgICAgJChldi5jdXJyZW50VGFyZ2V0KS50cmlnZ2VyKCdjaGFuZ2UnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG9uS2V5RG93bihldik7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgaWYgKHVzZUtleVByZXNzQmVoYXZpb3IpIHtcclxuICAgICAgYWxsSW5wdXRzLm9uKGtleUhhbmRsZXJzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZpcnN0SW5wdXQub24oa2V5SGFuZGxlcnMpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykge1xyXG4gICAgICBwb3B1cC5jb250ZW50KCkuZmluZChgLiR7Q1NTX0NMQVNTRVMuZHhCdXR0b259LiR7T0tfQlROX0NMQVNTfWApLmNsaWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gMjcpIHtcclxuICAgICAgcG9wdXAuY29udGVudCgpLmZpbmQoYC4ke0NTU19DTEFTU0VTLmR4QnV0dG9ufS4ke0NBTkNFTF9CVE5fQ0xBU1N9YCkuY2xpY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IHBvcHVwID0gJGVsXHJcbiAgICAuZHhQb3B1cChkeFBvcHVwT3B0aW9ucylcclxuICAgIC5keFBvcHVwKCdpbnN0YW5jZScpO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2hvdzogKCkgPT4ge1xyXG4gICAgICBwb3B1cC5zaG93KCk7XHJcbiAgICAgICQoZG9jdW1lbnQpLm9uKHsga2V5ZG93bjogb25LZXlEb3duIH0pO1xyXG4gICAgICBzaG93blBvcHVwcy5wdXNoKHBvcHVwKTtcclxuICAgIH0sXHJcbiAgICBoaWRlOiAoKSA9PiB7XHJcbiAgICAgICQoZG9jdW1lbnQpLm9mZih7IGtleWRvd246IG9uS2V5RG93biB9KTtcclxuICAgICAgcG9wdXAuaGlkZSgpO1xyXG4gICAgICBzaG93blBvcHVwcy5wb3AoKTtcclxuICAgIH0sXHJcbiAgICByZW1vdmU6ICgpID0+ICRlbC5yZW1vdmUoKVxyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCdXR0b25zKFxyXG4gIG9rT3B0aW9uczogRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnMsXHJcbiAgY2FuY2VsT3B0aW9uczogRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuKSB7XHJcbiAgY29uc3QgJHRhYmxlID0gJCgnPHRhYmxlIC8+JykuYWRkQ2xhc3MoQlVUVE9OU19DTEFTUyk7XHJcbiAgY29uc3QgJHRyID0gJCgnPHRyPicpLmFwcGVuZFRvKCR0YWJsZSk7XHJcblxyXG4gIGlmIChva09wdGlvbnMpIHtcclxuICAgICQoJzx0ZCAvPicpXHJcbiAgICAgIC5hdHRyKCd3aWR0aCcsICc1MCUnKVxyXG4gICAgICAuYXBwZW5kKCQoJzxkaXYgLz4nKS5hZGRDbGFzcyhDU1NfQ0xBU1NFUy5keEJ1dHRvbikuYWRkQ2xhc3MoT0tfQlROX0NMQVNTKS5keEJ1dHRvbihva09wdGlvbnMpKVxyXG4gICAgICAuYXBwZW5kVG8oJHRyKTtcclxuICB9XHJcblxyXG4gIGlmIChjYW5jZWxPcHRpb25zKSB7XHJcbiAgICAkKCc8dGQgLz4nKVxyXG4gICAgICAuYXR0cignd2lkdGgnLCAnNTAlJylcclxuICAgICAgLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoQ1NTX0NMQVNTRVMuZHhCdXR0b24pLmFkZENsYXNzKENBTkNFTF9CVE5fQ0xBU1MpLmR4QnV0dG9uKGNhbmNlbE9wdGlvbnMpKVxyXG4gICAgICAuYXBwZW5kVG8oJHRyKTtcclxuICB9XHJcblxyXG4gIHJldHVybiAkdGFibGU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJdGVtKGxhYmVsOiBzdHJpbmcsICR2YWx1ZTogSlF1ZXJ5KSB7XHJcbiAgcmV0dXJuICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnaXRlbScpXHJcbiAgICAuYXBwZW5kKFxyXG4gICAgICAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2Zvcm0tbGFiZWwnKS50ZXh0KGxhYmVsKSxcclxuICAgICAgJCgnPGRpdiAvPicpLmFkZENsYXNzKCd2YWx1ZScpLmFwcGVuZCgkdmFsdWUpXHJcbiAgICApO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElQb3B1cE9wdGlvbnMge1xyXG4gIHVzZUtleVByZXNzQmVoYXZpb3I6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaWFsb2coXHJcbiAgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keFBvcHVwLlByb3BlcnRpZXMsXHJcbiAgJHBvcHVwQ29udGVudDogSlF1ZXJ5LFxyXG4gIG9rQnRuT3B0aW9ucz86IElQb3B1cEJ1dHRvbk9wdGlvbnMsXHJcbiAgY2FuY2VsQnRuT3B0aW9ucz86IElQb3B1cEJ1dHRvbk9wdGlvbnMsXHJcbiAgYWRkaXRpb25hbE9wdGlvbnM/OiBJUG9wdXBPcHRpb25zXHJcbikge1xyXG4gIGNvbnN0ICRlbCA9ICQoJzxkaXY+JykuYXBwZW5kVG8oJ2JvZHknKTtcclxuICBsZXQgJGJ1dHRvbnM6IEpRdWVyeSA9IG51bGw7XHJcblxyXG4gIGxldCBwb3B1cDogSVBvcHVwID0gbnVsbDtcclxuXHJcbiAgY29uc3QgdXNlS2V5UHJlc3NCZWhhdmlvciA9IGFkZGl0aW9uYWxPcHRpb25zID8gYWRkaXRpb25hbE9wdGlvbnMudXNlS2V5UHJlc3NCZWhhdmlvciA6IGZhbHNlO1xyXG5cclxuICBmdW5jdGlvbiBjbG9zZVBvcHVwKCkge1xyXG4gICAgcG9wdXAuaGlkZSgpO1xyXG4gICAgcG9wdXAucmVtb3ZlKCk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBkeFBvcHVwT3B0aW9uczogRGV2RXhwcmVzcy51aS5keFBvcHVwLlByb3BlcnRpZXMgPSB7XHJcbiAgICBjb250ZW50VGVtcGxhdGU6ICgkcG9wdXBDb250YWluZXIpID0+IHtcclxuICAgICAgY29uc3QgeyAkY29udGVudCwgJGZvb3RlciB9ID0gY3JlYXRlTGF5b3V0KCRwb3B1cENvbnRhaW5lcik7XHJcblxyXG4gICAgICAkY29udGVudC5hcHBlbmQoJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgICBpZiAob2tCdG5PcHRpb25zICYmIGNhbmNlbEJ0bk9wdGlvbnMpIHtcclxuICAgICAgICAkYnV0dG9ucyA9IGNyZWF0ZUJ1dHRvbnMoXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRleHQ6IG9rQnRuT3B0aW9ucy50ZXh0LFxyXG4gICAgICAgICAgICBpY29uOiBva0J0bk9wdGlvbnMuaWNvbixcclxuICAgICAgICAgICAgZGlzYWJsZWQ6IG9rQnRuT3B0aW9ucy5kaXNhYmxlZCxcclxuICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxyXG4gICAgICAgICAgICBvbkNsaWNrOiAoZSkgPT4gb2tCdG5PcHRpb25zLm9uQ2xpY2soY2xvc2VQb3B1cClcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRleHQ6IGNhbmNlbEJ0bk9wdGlvbnMudGV4dCxcclxuICAgICAgICAgICAgaWNvbjogY2FuY2VsQnRuT3B0aW9ucy5pY29uLFxyXG4gICAgICAgICAgICBkaXNhYmxlZDogY2FuY2VsQnRuT3B0aW9ucy5kaXNhYmxlZCxcclxuICAgICAgICAgICAgb25DbGljazogKGUpID0+IGNhbmNlbEJ0bk9wdGlvbnMub25DbGljayhjbG9zZVBvcHVwKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgICRmb290ZXIuYXBwZW5kKCRidXR0b25zKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAkZm9vdGVyLnJlbW92ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgZWxlbWVudEF0dHI6IHsgY2xhc3M6ICdpc3pvbGVhLWR4LXBvcHVwJyB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgcG9wdXBPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuUHJvcGVydGllcyA9IHt9O1xyXG5cclxuICAkLmV4dGVuZCh0cnVlLCBwb3B1cE9wdGlvbnMsIG9wdGlvbnMsIGR4UG9wdXBPcHRpb25zKTtcclxuXHJcbiAgcG9wdXAgPSBjcmVhdGVQb3B1cCgkZWwsIHBvcHVwT3B0aW9ucywgdXNlS2V5UHJlc3NCZWhhdmlvcik7XHJcblxyXG4gIHBvcHVwLnNob3coKTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogcHJlZmVyLXRlbXBsYXRlXHJcbiAgICBva0J0bjogJGJ1dHRvbnMgPyAkYnV0dG9ucy5maW5kKGAuJHsgIE9LX0JUTl9DTEFTU31gKS5keEJ1dHRvbignaW5zdGFuY2UnKSA6IG51bGwsXHJcbiAgICBjbG9zZTogKCkgPT4gY2xvc2VQb3B1cCgpXHJcbiAgfTtcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGNvbnN0IENTU19DTEFTU0VTID0ge1xyXG4gIGR4RGF0YUdyaWQ6ICdpc3pvbGVhLWR4LWRhdGFncmlkJyxcclxuICBkeEJ1dHRvbjogJ2lzem9sZWEtZHgtYnV0dG9uJyxcclxuICBkeFBvcHVwOiAnaXN6b2xlYS1keC1wb3B1cCdcclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCB7IGNyZWF0ZURpYWxvZyB9IGZyb20gJy4vUG9wdXAnO1xyXG5pbXBvcnQgeyBJRXJyb3JJbmZvIH0gZnJvbSAnLi4vRGF0YS9BcGlSZXNwb25zZSc7XHJcblxyXG5jb25zdCBNQUlOX0VMRU1FTlRfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cCc7XHJcbmNvbnN0IFBPUFVQX0NPTlRFTlRfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fY29udGVudCc7XHJcbmNvbnN0IEVSUk9SX1BPUFVQX01FU1NBR0VfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fZXJyb3ItbWVzc2FnZSc7XHJcbmNvbnN0IEVSUk9SX1BPUFVQX0RFVEFJTFNfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fZXJyb3ItZGV0YWlscyc7XHJcblxyXG5jb25zdCBTSE9XX0RFVEFJTFNfVEVYVCA9ICdTaG93IGRldGFpbHMnO1xyXG5jb25zdCBISURFX0RFVEFJTFNfVEVYVCA9ICdIaWRlIGRldGFpbHMnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVycm9ySW5mb1BvcHVwKHRpdGxlTWVzc2FnZTogc3RyaW5nLCBlcnJvckluZm86IElFcnJvckluZm8gfCBJRXJyb3JJbmZvW10pOiB2b2lkIHtcclxuICBsZXQgcG9wdXA6IERldkV4cHJlc3MudWkuZHhQb3B1cDtcclxuICBjb25zdCBpbmZvQXJyYXkgPSBBcnJheS5pc0FycmF5KGVycm9ySW5mbykgPyBlcnJvckluZm8gOiBbZXJyb3JJbmZvXTtcclxuXHJcbiAgY29uc3QgJHBvcHVwQ29udGVudCA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcyhQT1BVUF9DT05URU5UX0NMQVNTKTtcclxuXHJcbiAgaW5mb0FycmF5LmZvckVhY2goKGksIGluZGV4KSA9PiB7XHJcbiAgICBjb25zdCAkZXJyb3JNZXNzYWdlRWxlbWVudCA9ICQoJzxwIC8+JykuYWRkQ2xhc3MoRVJST1JfUE9QVVBfTUVTU0FHRV9DTEFTUykudGV4dChpLkVycm9yKTtcclxuICAgIGNvbnN0ICRlcnJvckRldGFpbHNFbGVtZW50ID0gJCgnPHAgLz4nKS5hZGRDbGFzcyhFUlJPUl9QT1BVUF9ERVRBSUxTX0NMQVNTKS50ZXh0KGkuU3RhY2tUcmFjZSk7XHJcbiAgICAkcG9wdXBDb250ZW50LmFwcGVuZCgkZXJyb3JNZXNzYWdlRWxlbWVudCwgJGVycm9yRGV0YWlsc0VsZW1lbnQpLmhpZGUoKTtcclxuXHJcbiAgICBpZiAoaW5kZXggPCBpbmZvQXJyYXkubGVuZ3RoIC0gMSkge1xyXG4gICAgICAkcG9wdXBDb250ZW50LmFwcGVuZCgkKCc8aHIgLz4nKSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHBvcHVwSW5mbyA9IGNyZWF0ZURpYWxvZyhcclxuICAgIHtcclxuICAgICAgdGl0bGU6IHRpdGxlTWVzc2FnZSxcclxuICAgICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICAgIGFuaW1hdGlvbjoge1xyXG4gICAgICAgIHNob3c6IHsgZGlyZWN0aW9uOiAnYm90dG9tJywgdHlwZTogJ3NsaWRlSW4nIH0sXHJcbiAgICAgICAgaGlkZTogeyBkaXJlY3Rpb246ICdib3R0b20nLCB0eXBlOiAnc2xpZGVPdXQnIH1cclxuICAgICAgfSxcclxuICAgICAgcG9zaXRpb246IHsgbXk6ICdib3R0b20nLCBhdDogJ2JvdHRvbScsIG9mZnNldDogeyB5OiAtNTAgfSB9LFxyXG4gICAgICBzaGFkaW5nOiBmYWxzZSxcclxuICAgICAgZHJhZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4ge1xyXG4gICAgICAgIHBvcHVwID0gZS5jb21wb25lbnQ7XHJcbiAgICAgICAgZS5lbGVtZW50LmFkZENsYXNzKE1BSU5fRUxFTUVOVF9DTEFTUyk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAkcG9wdXBDb250ZW50LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiBTSE9XX0RFVEFJTFNfVEVYVCxcclxuICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGlzRnVsbFNjcmVlblJlcXVpcmVkOiBib29sZWFuID0gIXBvcHVwLm9wdGlvbignZnVsbFNjcmVlbicpO1xyXG4gICAgICAgIHRvZ2dsZUZ1bGxTY3JlZW4oaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgICAgIHBvcHVwSW5mby5va0J0bi5vcHRpb24oJ3RleHQnLCBpc0Z1bGxTY3JlZW5SZXF1aXJlZCA/IEhJREVfREVUQUlMU19URVhUIDogU0hPV19ERVRBSUxTX1RFWFQpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiAnQ2xvc2UnLFxyXG4gICAgICBvbkNsaWNrOiAoY2xvc2VQb3B1cCkgPT4gY2xvc2VQb3B1cCgpXHJcbiAgICB9KTtcclxuXHJcbiAgY29uc3QgdG9nZ2xlRnVsbFNjcmVlbiA9IChpc0Z1bGxTY3JlZW5SZXF1aXJlZDogYm9vbGVhbikgPT4ge1xyXG4gICAgJHBvcHVwQ29udGVudC50b2dnbGUoaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgcG9wdXAub3B0aW9uKCdmdWxsU2NyZWVuJywgaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgcG9wdXAucmVwYWludCgpO1xyXG4gIH07XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBlbnVtIEV4Y2VwdGlvblR5cGUge1xyXG4gIFVuZXhwZWN0ZWRFeGNlcHRpb24gPSAwLFxyXG4gIFNxbEV4Y2VwdGlvbiA9IDEsXHJcbiAgSXN6b2xlYUNvbmZpZ3VyYXRpb25FeGNlcHRpb24gPSAyXHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEV4Y2VwdGlvblR5cGUgfSBmcm9tICcuLi9EYXRhL0V4Y2VwdGlvblR5cGUnO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgPSAoZXhjZXB0aW9uVHlwZTogRXhjZXB0aW9uVHlwZSkgPT4ge1xyXG4gIHN3aXRjaCAoZXhjZXB0aW9uVHlwZSkge1xyXG4gICAgY2FzZSBFeGNlcHRpb25UeXBlLlNxbEV4Y2VwdGlvbjpcclxuICAgICAgcmV0dXJuICdXZSBhdHRlbXB0ZWQgdG8gZXhlY3V0ZSB0aGUgZGF0YSBxdWVyeSBob3dldmVyIGl0IGFwcGVhcnMgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIGRhdGEgc291cmNlLic7XHJcblxyXG4gICAgY2FzZSBFeGNlcHRpb25UeXBlLklzem9sZWFDb25maWd1cmF0aW9uRXhjZXB0aW9uOlxyXG4gICAgICByZXR1cm4gJ1NvbWV0aGluZyB3cm9uZyB3aXRoIGlzem9sZWEgY29uZmlndXJhdGlvbi4gQ2hlY2sgQ2xpZW50SWQvQ2xpZW50U2VjcmV0IGZpZWxkcyBpbiB0aGUgYXBwc2V0dGluZ3MuanNvbiBmaWxlLic7XHJcblxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuICcnO1xyXG4gIH1cclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCBub3RpZnkgZnJvbSAnLi4vV2lkZ2V0cy9Ob3RpZnknO1xyXG5pbXBvcnQgeyBJQXBpUmVzcG9uc2UsIGlzRXJyb3JJbmZvIH0gZnJvbSAnLi9BcGlSZXNwb25zZSc7XHJcbmltcG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuaW1wb3J0IHsgY3JlYXRlRXJyb3JJbmZvUG9wdXAgfSBmcm9tICcuLi9XaWRnZXRzL0Vycm9ySW5mb1BvcHVwJztcclxuaW1wb3J0IHsgRXhjZXB0aW9uVHlwZSB9IGZyb20gJy4vRXhjZXB0aW9uVHlwZSc7XHJcbmltcG9ydCB7IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi9VdGlscy9HZW5lcmFsVXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlJztcclxuXHJcbmNvbnN0IERFRkFVTFRfRVJST1JfTUVTU0FHRSA9ICdVbmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLiBQbGVhc2UgY29udGFjdCB0byBkZXZlbG9wZXJzLic7XHJcbmNvbnN0IE5PVF9FU1NFTlRJQUxfU1RBVFVTRVMgPSBbNTA0XTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0RXJyb3JNZXNzYWdlID0gKCkgPT4gREVGQVVMVF9FUlJPUl9NRVNTQUdFO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVN1Y2Nlc3MocmVzOiBJQXBpUmVzcG9uc2U8YW55Piwgbm90aWZ5U3VjY2VzcyA9IGZhbHNlKSB7XHJcbiAgaWYgKG5vdGlmeVN1Y2Nlc3MpIHtcclxuICAgIG5vdGlmeShyZXMuTWVzc2FnZSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzLkRhdGEpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRXJyb3I8VD4oXHJcbiAgcmVzOiBJQXBpUmVzcG9uc2U8VD4sXHJcbiAgbm90aWZ5RXJyb3I6IGJvb2xlYW4sXHJcbiAgZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlPzogKGV4Y2VwdGlvblR5cGU6IEV4Y2VwdGlvblR5cGUpID0+IHN0cmluZ1xyXG4pOiB7IG1lc3NhZ2U6IHN0cmluZyB9IHtcclxuICBjb25zdCBtZXNzYWdlID0gcmVzLk1lc3NhZ2U7XHJcblxyXG4gIGNvbnN0IHJlc3VsdCA9IHsgbWVzc2FnZSB9O1xyXG5cclxuICBsZXQgbWVzc2FnZVRvU2hvdztcclxuICBjb25zdCBleGNlcHRpb25UeXBlID0gcGFyc2VFeGNlcHRpb25UeXBlKG1lc3NhZ2UpO1xyXG4gIGlmIChleGNlcHRpb25UeXBlICE9PSBudWxsKSB7XHJcbiAgICBjb25zdCBjdXN0b21FcnJvck1lc3NhZ2UgPSBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgPyBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UoZXhjZXB0aW9uVHlwZSkgOiAnJztcclxuICAgIG1lc3NhZ2VUb1Nob3cgPSBjdXN0b21FcnJvck1lc3NhZ2UgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBtZXNzYWdlVG9TaG93ID0gbWVzc2FnZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0U7XHJcbiAgfVxyXG5cclxuICBpZiAobm90aWZ5RXJyb3IpIHtcclxuICAgIGNvbnN0IGVycm9ySW5mbyA9IHJlcy5EYXRhO1xyXG4gICAgaWYgKGlzRXJyb3JJbmZvKGVycm9ySW5mbykpIHtcclxuICAgICAgY29uc3QgaXNFcnJvckluZm9Ob3RFbXB0eUFycmF5ID0gQXJyYXkuaXNBcnJheShlcnJvckluZm8pICYmIGVycm9ySW5mby5sZW5ndGg7XHJcbiAgICAgIGNvbnN0IGlzRXJyb3JJbmZvSGFzRGF0YSA9ICFBcnJheS5pc0FycmF5KGVycm9ySW5mbykgJiYgKGVycm9ySW5mby5TdGFja1RyYWNlIHx8IGVycm9ySW5mby5FcnJvcik7XHJcblxyXG4gICAgICBpZiAoaXNFcnJvckluZm9Ob3RFbXB0eUFycmF5IHx8IGlzRXJyb3JJbmZvSGFzRGF0YSkge1xyXG4gICAgICAgIGNyZWF0ZUVycm9ySW5mb1BvcHVwKG1lc3NhZ2VUb1Nob3csIGVycm9ySW5mbyk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBub3RpZnkobWVzc2FnZVRvU2hvdywgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VFeGNlcHRpb25UeXBlKG1lc3NhZ2U6IHN0cmluZyk6IEV4Y2VwdGlvblR5cGUgfCBudWxsIHtcclxuICByZXR1cm4gKCFpc05hTihtZXNzYWdlIGFzIGFueSkpICYmIEV4Y2VwdGlvblR5cGVbK21lc3NhZ2VdID8gK21lc3NhZ2UgOiBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlVXBsb2FkKGU6IHsgcmVxdWVzdDogeyByZXNwb25zZTogc3RyaW5nOyB9IH0pIHtcclxuICBjb25zdCByZXNwb25zZTogSUFwaVJlc3BvbnNlPGFueT4gPSBlLnJlcXVlc3QucmVzcG9uc2UgPyBKU09OLnBhcnNlKGUucmVxdWVzdC5yZXNwb25zZSkgOiB7fTtcclxuXHJcbiAgaWYgKHJlc3BvbnNlLlJlcXVlc3RTdGF0ZSA9PT0gUmVxdWVzdFN0YXRlLkNvbXBsZXRlZCkge1xyXG4gICAgaGFuZGxlU3VjY2VzcyhyZXNwb25zZSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVFcnJvcihyZXNwb25zZSwgdHJ1ZSk7XHJcblxyXG4gIHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSVNlbmRSZXF1ZXN0U2V0dGluZ3MgPSBKUXVlcnlBamF4U2V0dGluZ3MgJiB7XHJcbiAgbm90aWZ5RXJyb3I/OiBib29sZWFuO1xyXG4gIGdldFVzZXJGcmllbmRseUVycm9yTWVzc2FnZT86IChleGNlcHRpb25UeXBlOiBFeGNlcHRpb25UeXBlKSA9PiBzdHJpbmc7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2VuZFJlcXVlc3Q8VCA9IGFueT4oXHJcbiAgdXJsOiBzdHJpbmcsXHJcbiAgdHlwZTogc3RyaW5nID0gJ0dFVCcsXHJcbiAgZGF0YSA9IG51bGwsXHJcbiAgbm90aWZ5U3VjY2Vzcz86IGJvb2xlYW4sXHJcbiAgc2V0dGluZ3M/OiBJU2VuZFJlcXVlc3RTZXR0aW5ncyxcclxuKTogSlF1ZXJ5LkRlZmVycmVkPFQ+IHtcclxuICBjb25zdCBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcclxuXHJcbiAgY29uc3Qgbm90aWZ5RXJyb3IgPSBzZXR0aW5ncz8ubm90aWZ5RXJyb3IgPT09IHVuZGVmaW5lZCB8fCBzZXR0aW5ncy5ub3RpZnlFcnJvcjtcclxuXHJcbiAgY29uc3QgbWFuZGF0b3J5T3B0aW9ucyA9IHtcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbidcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBhamF4U2V0dGluZ3MgPSAkLmV4dGVuZCh7IHR5cGUsIHVybCwgZGF0YSB9LCBzZXR0aW5ncywgbWFuZGF0b3J5T3B0aW9ucyk7XHJcblxyXG4gICQuYWpheChhamF4U2V0dGluZ3MpXHJcbiAgICAuZG9uZSgocmVzKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBJQXBpUmVzcG9uc2U8YW55PiA9IHJlcztcclxuXHJcbiAgICAgIGlmIChyZXNwb25zZS5SZXF1ZXN0U3RhdGUgPT09IFJlcXVlc3RTdGF0ZS5Db21wbGV0ZWQpIHtcclxuICAgICAgICBoYW5kbGVTdWNjZXNzKHJlc3BvbnNlLCBub3RpZnlTdWNjZXNzKTtcclxuICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlLkRhdGEpO1xyXG5cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHsgbWVzc2FnZSB9ID0gaGFuZGxlRXJyb3IocmVzcG9uc2UsIG5vdGlmeUVycm9yLCBzZXR0aW5ncz8uZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlIHx8IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UpO1xyXG5cclxuICAgICAgZGVmZXJyZWQucmVqZWN0KG1lc3NhZ2UpO1xyXG4gICAgfSlcclxuICAgIC5mYWlsKChqcVhIUiwgdGV4dFN0YXR1cykgPT4ge1xyXG4gICAgICBpZiAoIU5PVF9FU1NFTlRJQUxfU1RBVFVTRVMuaW5jbHVkZXMoanFYSFIuc3RhdHVzKSAmJiBub3RpZnlFcnJvcikge1xyXG4gICAgICAgIG5vdGlmeShnZXREZWZhdWx0RXJyb3JNZXNzYWdlKCksIGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZGVmZXJyZWQucmVqZWN0KHRleHRTdGF0dXMpO1xyXG4gICAgfSk7XHJcblxyXG4gIHJldHVybiBkZWZlcnJlZDtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUFwaVJlc3BvbnNlIH0gZnJvbSAnLi9BcGlSZXNwb25zZSc7XHJcbmltcG9ydCB7IGhhbmRsZUVycm9yLCBoYW5kbGVTdWNjZXNzLCBnZXREZWZhdWx0RXJyb3JNZXNzYWdlIH0gZnJvbSAnLi9SZXF1ZXN0JztcclxuaW1wb3J0IHsgUmVxdWVzdFN0YXRlIH0gZnJvbSAnLi9SZXF1ZXN0U3RhdGUnO1xyXG5pbXBvcnQgeyBFeGNlcHRpb25UeXBlIH0gZnJvbSAnLi9FeGNlcHRpb25UeXBlJztcclxuXHJcbmV4cG9ydCB0eXBlIElEeERhdGFTb3VyY2VPcHRpb25zID0gRGV2RXhwcmVzcy5kYXRhLkFzcE5ldC5PcHRpb25zICYge1xyXG4gIG5vdGlmeVN1Y2Nlc3M/OiBib29sZWFuO1xyXG4gIG5vdGlmeUVycm9yPzogYm9vbGVhbjtcclxuICBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2U/OiAoZXhjZXB0aW9uVHlwZTogRXhjZXB0aW9uVHlwZSkgPT4gc3RyaW5nO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUR4RGF0YVNvdXJjZShvcHRpb25zOiBJRHhEYXRhU291cmNlT3B0aW9ucykge1xyXG4gIGNvbnN0IHN0b3JlID0gRGV2RXhwcmVzcy5kYXRhLkFzcE5ldC5jcmVhdGVTdG9yZSh7XHJcbiAgICAuLi5vcHRpb25zLFxyXG4gICAgb25CZWZvcmVTZW5kOiAoanFYaHIsIHNldHRpbmdzKSA9PiB7XHJcbiAgICAgIGlmIChvcHRpb25zLm9uQmVmb3JlU2VuZCkge1xyXG4gICAgICAgIG9wdGlvbnMub25CZWZvcmVTZW5kKGpxWGhyLCBzZXR0aW5ncyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG5vdGlmeUVycm9yID0gb3B0aW9ucz8ubm90aWZ5RXJyb3IgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLm5vdGlmeUVycm9yO1xyXG5cclxuICAgICAgc2V0dGluZ3MuZGF0YUZpbHRlciA9IChyYXdSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlczogSUFwaVJlc3BvbnNlPGFueT4gPSBKU09OLnBhcnNlKHJhd1Jlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgaWYgKHJlcy5SZXF1ZXN0U3RhdGUgPT09IFJlcXVlc3RTdGF0ZS5Db21wbGV0ZWQpIHtcclxuICAgICAgICAgIHJldHVybiBoYW5kbGVTdWNjZXNzKHJlcywgb3B0aW9ucy5ub3RpZnlTdWNjZXNzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShoYW5kbGVFcnJvcihyZXMsIG5vdGlmeUVycm9yLCBvcHRpb25zPy5nZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UpKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHNldHRpbmdzLmVycm9yID0gKHhocjogSlF1ZXJ5WEhSKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzOiBJQXBpUmVzcG9uc2U8YW55PiA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCB8fCAne30nKTtcclxuXHJcbiAgICAgICAgLy8gTk9URTogZm9yIHVuaGFuZGxlZCBlcnJvcnMgb24gdGhlIHNlcnZlclxyXG4gICAgICAgIGlmICghcmVzLlJlcXVlc3RTdGF0ZSkge1xyXG4gICAgICAgICAgaGFuZGxlRXJyb3IocmVzLCBub3RpZnlFcnJvciwgb3B0aW9ucz8uZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIChzdG9yZSBhcyBhbnkpLl9lcnJvckhhbmRsZXIgPSAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgaWYgKGVycm9yICYmICFlcnJvci5tZXNzYWdlKSB7XHJcbiAgICAgIGVycm9yLm1lc3NhZ2UgPSBnZXREZWZhdWx0RXJyb3JNZXNzYWdlKCk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIHN0b3JlO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4vUmVxdWVzdCc7XHJcblxyXG5jb25zdCBsb2FkUHJvbWlzZXM6IHsgW3VybDogc3RyaW5nXTogSlF1ZXJ5RGVmZXJyZWQ8YW55PiB9ID0ge307XHJcblxyXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbjxUPih1cmw6IHN0cmluZykge1xyXG4gIGlmIChsb2FkUHJvbWlzZXNbdXJsXSkge1xyXG4gICAgcmV0dXJuIGF3YWl0IGxvYWRQcm9taXNlc1t1cmxdO1xyXG4gIH1cclxuXHJcbiAgbG9hZFByb21pc2VzW3VybF0gPSBzZW5kUmVxdWVzdDxUPih1cmwpO1xyXG4gIGxvYWRQcm9taXNlc1t1cmxdLmNhdGNoKChlcnIpID0+IHtcclxuICAgIGxvYWRQcm9taXNlc1t1cmxdID0gbnVsbDtcclxuXHJcbiAgICB0aHJvdyBlcnI7XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHJlc3VsdDogVCA9IGF3YWl0IGxvYWRQcm9taXNlc1t1cmxdO1xyXG5cclxuICBsb2FkUHJvbWlzZXNbdXJsXSA9IG51bGw7XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IHNlbmRSZXF1ZXN0LCBoYW5kbGVFcnJvciwgaGFuZGxlU3VjY2VzcywgaGFuZGxlVXBsb2FkIH0gZnJvbSAnLi9SZXF1ZXN0JztcclxuaW1wb3J0IHsgaXNFcnJvckluZm8gfSBmcm9tICcuL0FwaVJlc3BvbnNlJztcclxuaW1wb3J0IHsgY3JlYXRlRHhEYXRhU291cmNlIH0gZnJvbSAnLi9EeERhdGFTb3VyY2UnO1xyXG5pbXBvcnQgKiBhcyBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbiBmcm9tICcuL0xvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uJztcclxuXHJcbi8vIFRPRE86IGV4cG9ydCB0eXBlXHJcbmV4cG9ydCB7IElBcGlSZXNwb25zZSwgSUVycm9ySW5mbyB9IGZyb20gJy4vQXBpUmVzcG9uc2UnO1xyXG5leHBvcnQgeyBJRHhEYXRhU291cmNlT3B0aW9ucyB9IGZyb20gJy4vRHhEYXRhU291cmNlJztcclxuZXhwb3J0IHsgSUxvZ29TZXR0aW5ncyB9IGZyb20gJy4vSUxvZ29TZXR0aW5ncyc7XHJcbmV4cG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICBzZW5kUmVxdWVzdCxcclxuICBoYW5kbGVFcnJvcixcclxuICBoYW5kbGVTdWNjZXNzLFxyXG4gIGhhbmRsZVVwbG9hZCxcclxuICBjcmVhdGVEeERhdGFTb3VyY2UsXHJcbiAgaXNFcnJvckluZm8sXHJcbiAgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb25cclxufTtcclxuIiwgImV4cG9ydCBpbnRlcmZhY2UgSVJlbmRlcmVkIHtcclxuICByZW5kZXIoKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGVzdHJveWFibGUge1xyXG4gIGRlc3Ryb3koKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGlzRGVzdHJveWFibGUgPSAob2JqOiBhbnkpOiBvYmogaXMgSURlc3Ryb3lhYmxlID0+IHtcclxuICByZXR1cm4gdHlwZW9mIG9iai5kZXN0cm95ID09PSAnZnVuY3Rpb24nO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IHRocm93UmVuZGVyRXJyb3IgPSAoZWxlbWVudE5hbWU/OiBzdHJpbmcpOiBuZXZlciA9PiB7XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBwcmVmZXItdGVtcGxhdGVcclxuICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByZXF1aXJlZCAke2VsZW1lbnROYW1lID8gKGAke2VsZW1lbnROYW1lICB9IGApIDogJyd9IGlzbid0IGNyZWF0ZWRgKTtcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIERlZXBSZWFkb25seTxUPiA9IHtcclxuICByZWFkb25seSBbUCBpbiBrZXlvZiBUXTogKFxyXG4gICAgVFtQXSBleHRlbmRzIEFycmF5PGluZmVyIFUxPiA/IFJlYWRvbmx5QXJyYXk8RGVlcFJlYWRvbmx5PFUxPj4gOiAoXHJcbiAgICAgIFRbUF0gZXh0ZW5kcyBNYXA8aW5mZXIgSywgaW5mZXIgVTI+ID8gUmVhZG9ubHlNYXA8SywgRGVlcFJlYWRvbmx5PFUyPj4gOiAoXHJcbiAgICAgICAgVFtQXSBleHRlbmRzIFNldDxpbmZlciBVMz4gPyBSZWFkb25seVNldDxEZWVwUmVhZG9ubHk8VTM+PiA6IChcclxuICAgICAgICAgIFRbUF0gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFRbUF0gOiAoXHJcbiAgICAgICAgICAgIERlZXBSZWFkb25seTxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBEZWVwUGFydGlhbDxUPiA9IHtcclxuICBbUCBpbiBrZXlvZiBUXT86IChcclxuICAgIFRbUF0gZXh0ZW5kcyBBcnJheTxpbmZlciBVMT4gPyBBcnJheTxEZWVwUGFydGlhbDxVMT4+IDogKFxyXG4gICAgICBUW1BdIGV4dGVuZHMgTWFwPGluZmVyIEssIGluZmVyIFUyPiA/IE1hcDxLLCBEZWVwUGFydGlhbDxVMj4+IDogKFxyXG4gICAgICAgIFRbUF0gZXh0ZW5kcyBTZXQ8aW5mZXIgVTM+ID8gU2V0PERlZXBQYXJ0aWFsPFUzPj4gOiAoXHJcbiAgICAgICAgICBUW1BdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBUW1BdIDogKFxyXG4gICAgICAgICAgICBEZWVwUGFydGlhbDxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBEZWVwUmVxdWlyZWQ8VD4gPSB7XHJcbiAgW1AgaW4ga2V5b2YgVF0tPzogKFxyXG4gICAgVFtQXSBleHRlbmRzIEFycmF5PGluZmVyIFUxPiA/IEFycmF5PERlZXBSZXF1aXJlZDxVMT4+IDogKFxyXG4gICAgICBUW1BdIGV4dGVuZHMgTWFwPGluZmVyIEssIGluZmVyIFUyPiA/IE1hcDxLLCBEZWVwUmVxdWlyZWQ8VTI+PiA6IChcclxuICAgICAgICBUW1BdIGV4dGVuZHMgU2V0PGluZmVyIFUzPiA/IFNldDxEZWVwUmVxdWlyZWQ8VTM+PiA6IChcclxuICAgICAgICAgIFRbUF0gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFRbUF0gOiAoXHJcbiAgICAgICAgICAgIERlZXBSZXF1aXJlZDxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBNdXRhYmxlPFQ+ID0ge1xyXG4gIC1yZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXTtcclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCB7IERlZXBSZWFkb25seSB9IGZyb20gJy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4uL0hlYWRlci9JTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFVybEJ5TWVudUl0ZW1EYXRhKGl0ZW1EYXRhOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfCBEZWVwUmVhZG9ubHk8SU5hdmlnYXRpb25NZW51SXRlbU1vZGVsPikge1xyXG4gIGNvbnN0IHsgQXJlYSwgQ29udHJvbGxlciwgQWN0aW9uLCBJc0NsaWNrYWJsZSB9ID0gaXRlbURhdGE7XHJcblxyXG4gIGlmIChJc0NsaWNrYWJsZSAmJiBDb250cm9sbGVyKSB7XHJcbiAgICByZXR1cm4gQXJlYSA/IGVuY29kZVVSSShgLyR7QXJlYX0vJHtDb250cm9sbGVyfS8ke0FjdGlvbn1gKSA6IGVuY29kZVVSSShgLyR7Q29udHJvbGxlcn0vJHtBY3Rpb259YCk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgeyBXaW5kb3dSZXNpemVMaXN0ZW5lciwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMgfSBmcm9tICcuL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyJztcclxuZXhwb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQgfSBmcm9tICcuL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyJztcclxuIiwgImltcG9ydCB7IElEZXN0cm95YWJsZSB9IGZyb20gJy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElMYXlvdXRCcmVha3BvaW50IHtcclxuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgbWluV2lkdGg6IG51bWJlcjtcclxuICByZWFkb25seSBtYXhXaWR0aDogbnVtYmVyO1xyXG59XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGludGVyZmFjZS1uYW1lXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0QnJlYWtwb2ludENoYW5nZWRFdmVudCB7XHJcbiAgcmVhZG9ubHkgcHJldmlvdXNCcmVha3BvaW50OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICByZWFkb25seSBjdXJyZW50QnJlYWtwb2ludDogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgcmVhZG9ubHkgb3JpZ2luYWxFdmVudDogVUlFdmVudDtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzID0ge1xyXG4gIHhzOiB7XHJcbiAgICBuYW1lOiAneHMnLFxyXG4gICAgbWluV2lkdGg6IDAsXHJcbiAgICBtYXhXaWR0aDogNTc1XHJcbiAgfSxcclxuICBzbToge1xyXG4gICAgbmFtZTogJ3NtJyxcclxuICAgIG1pbldpZHRoOiA1NzYsXHJcbiAgICBtYXhXaWR0aDogNzY3XHJcbiAgfSxcclxuICBtZDoge1xyXG4gICAgbmFtZTogJ21kJyxcclxuICAgIG1pbldpZHRoOiA3NjgsXHJcbiAgICBtYXhXaWR0aDogOTkxXHJcbiAgfSxcclxuICBsZzoge1xyXG4gICAgbmFtZTogJ2xnJyxcclxuICAgIG1pbldpZHRoOiA5OTIsXHJcbiAgICBtYXhXaWR0aDogMTE5OVxyXG4gIH0sXHJcbiAgeGw6IHtcclxuICAgIG5hbWU6ICd4bCcsXHJcbiAgICBtaW5XaWR0aDogMTIwMCxcclxuICAgIG1heFdpZHRoOiBJbmZpbml0eVxyXG4gIH1cclxufSBhcyBjb25zdDtcclxuXHJcbmNvbnN0IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzTGlzdDogcmVhZG9ubHkgSUxheW91dEJyZWFrcG9pbnRbXSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzKVxyXG4gIC5tYXAoKGJyZWFrcG9pbnROYW1lKSA9PiBib290c3RyYXBMYXlvdXRCcmVha3BvaW50c1ticmVha3BvaW50TmFtZV0pO1xyXG5cclxuZXhwb3J0IGNsYXNzIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyIGltcGxlbWVudHMgSURlc3Ryb3lhYmxlIHtcclxuICBwdWJsaWMgY3VycmVudExheW91dEJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25XaW5kb3dSZXNpemVMaXN0ZW5lciA9IHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKTtcclxuXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxheW91dEJyZWFrcG9pbnRzOiByZWFkb25seSBJTGF5b3V0QnJlYWtwb2ludFtdO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSByZXNpemVEZWxheTogbnVtYmVyO1xyXG4gIC8vIFRPRE86IHVzZSBtdWx0aXBsZSBldmVudCBsaXN0ZW5lclxyXG4gIHByb3RlY3RlZCByZWFkb25seSBvblJlc2l6ZTogKChlOiBVSUV2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZDogKChlOiBMYXlvdXRCcmVha3BvaW50Q2hhbmdlZEV2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcm90ZWN0ZWQgbGFzdFdpbmRvd1Jlc2l6ZVRpbWVvdXRJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIG9uUmVzaXplPzogKGU6IFVJRXZlbnQpID0+IHZvaWQsXHJcbiAgICBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkPzogKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpID0+IHZvaWQsXHJcbiAgICByZXNpemVEZWxheSA9IDEwMCxcclxuICAgIGxheW91dEJyZWFrcG9pbnRzOiByZWFkb25seSBJTGF5b3V0QnJlYWtwb2ludFtdID0gYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHNMaXN0XHJcbiAgKSB7XHJcbiAgICB0aGlzLm9uUmVzaXplID0gb25SZXNpemU7XHJcbiAgICB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWQgPSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkO1xyXG4gICAgdGhpcy5yZXNpemVEZWxheSA9IHJlc2l6ZURlbGF5O1xyXG4gICAgdGhpcy5sYXlvdXRCcmVha3BvaW50cyA9IGxheW91dEJyZWFrcG9pbnRzO1xyXG5cclxuICAgIHRoaXMuY3VycmVudExheW91dEJyZWFrcG9pbnQgPSB0aGlzLmdldExheW91dEJyZWFrcG9pbnRCeVdpbmRvd1dpZHRoKHdpbmRvdy5pbm5lcldpZHRoKTtcclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGV0YWNoRXZlbnRzKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXR0YWNoRXZlbnRzKCkge1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25XaW5kb3dSZXNpemVMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZGV0YWNoRXZlbnRzKCkge1xyXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25XaW5kb3dSZXNpemVMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0TGF5b3V0QnJlYWtwb2ludEJ5V2luZG93V2lkdGgod2luZG93V2lkdGg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMubGF5b3V0QnJlYWtwb2ludHMuZmluZCgobGF5b3V0QnJlYWtwb2ludCkgPT4ge1xyXG4gICAgICByZXR1cm4gbGF5b3V0QnJlYWtwb2ludC5taW5XaWR0aCA8PSB3aW5kb3dXaWR0aCAmJiAoIWxheW91dEJyZWFrcG9pbnQubWF4V2lkdGggfHwgbGF5b3V0QnJlYWtwb2ludC5tYXhXaWR0aCA+PSB3aW5kb3dXaWR0aCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvbldpbmRvd1Jlc2l6ZShlOiBVSUV2ZW50KSB7XHJcbiAgICBjbGVhclRpbWVvdXQodGhpcy5sYXN0V2luZG93UmVzaXplVGltZW91dElkKTtcclxuICAgIHRoaXMubGFzdFdpbmRvd1Jlc2l6ZVRpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMub25XaW5kb3dSZXNpemVJbnRlcm5hbChlKSwgdGhpcy5yZXNpemVEZWxheSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25XaW5kb3dSZXNpemVJbnRlcm5hbChlOiBVSUV2ZW50KSB7XHJcbiAgICBjb25zdCBsYXlvdXRCcmVha3BvaW50ID0gdGhpcy5nZXRMYXlvdXRCcmVha3BvaW50QnlXaW5kb3dXaWR0aCh3aW5kb3cuaW5uZXJXaWR0aCk7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50TGF5b3V0QnJlYWtwb2ludCAhPT0gbGF5b3V0QnJlYWtwb2ludCkge1xyXG4gICAgICBjb25zdCBwcmV2aW91c0xheW91dEJyZWFrcG9pbnQgPSB0aGlzLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50O1xyXG4gICAgICB0aGlzLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50ID0gbGF5b3V0QnJlYWtwb2ludDtcclxuXHJcbiAgICAgIHRoaXMuZW1pdEJyZWFrcG9pbnRDaGFuZ2VkKHtcclxuICAgICAgICBwcmV2aW91c0JyZWFrcG9pbnQ6IHByZXZpb3VzTGF5b3V0QnJlYWtwb2ludCxcclxuICAgICAgICBjdXJyZW50QnJlYWtwb2ludDogdGhpcy5jdXJyZW50TGF5b3V0QnJlYWtwb2ludCxcclxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZW1pdFJlc2l6ZUV2ZW50KGUpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRSZXNpemVFdmVudChlOiBVSUV2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uUmVzaXplPy4oZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMub25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZD8uKGUpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiZXhwb3J0IGludGVyZmFjZSBJQ29uZmlnIHtcclxuICBpc0xlZ2FjeVJlbmRlcj86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBjb25maWc6IElDb25maWcgPSB7XHJcbiAgaXNMZWdhY3lSZW5kZXI6IGZhbHNlXHJcbn07XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJVXNlck1lbnVJdGVtTW9kZWwsIElCYWRnZU1vZGVsIH0gZnJvbSAnLi9JVXNlck1lbnVJdGVtJztcclxuaW1wb3J0IHsgdGhyb3dSZW5kZXJFcnJvciwgRGVlcFJlYWRvbmx5IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyLCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cywgTGF5b3V0QnJlYWtwb2ludENoYW5nZWRFdmVudCB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuLi9Db25maWcvSW5kZXgnO1xyXG5cclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBpbnRlcmZhY2UtbmFtZVxyXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJNZW51SXRlbUNsaWNrRXZlbnQge1xyXG4gIHJlYWRvbmx5IGl0ZW06IERlZXBSZWFkb25seTxJVXNlck1lbnVJdGVtTW9kZWw+O1xyXG4gIHJlYWRvbmx5IG9yaWdpbmFsRXZlbnQ6IFVJRXZlbnQ7XHJcbiAgY2FuY2VsPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVXNlck1lbnVPcHRpb25zIHtcclxuICBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgdXNlckF2YXRhcjogc3RyaW5nO1xyXG4gIGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXTtcclxuICBjb2xsYXBzZUJyZWFrcG9pbnQ/OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBnZXREaXNwbGF5ZWRVc2VySW5mbz86ICh1c2VyTmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XHJcbiAgb25JdGVtQ2xpY2s/OiAoZTogVXNlck1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFVzZXJNZW51IHtcclxuICBwcm90ZWN0ZWQgc3RhdGljIGRlZmF1bHRHZXREaXNwbGF5ZWRVc2VySW5mbzogKHVzZXJOYW1lOiBzdHJpbmcpID0+IHN0cmluZyA9ICh1c2VyTmFtZSkgPT4gYFdlbGNvbWUgJHt1c2VyTmFtZX1gO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VyTmFtZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlckF2YXRhcjogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0RGlzcGxheWVkVXNlckluZm86ICh1c2VyTmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb2xsYXBzZUJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgd2luZG93UmVzaXplTGlzdGVuZXI6IFdpbmRvd1Jlc2l6ZUxpc3RlbmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZExpc3RlbmVyID0gdGhpcy5vbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkLmJpbmQodGhpcyk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkl0ZW1DbGljazogKChlOiBVc2VyTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXTtcclxuICAvLyBFbGVtZW50c1xyXG4gIHByaXZhdGUgX3Jvb3Q6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgbW9iaWxlQ29udGVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBkZXNrdG9wUm9vdERyb3Bkb3duOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGRlc2t0b3BDb250ZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGRlc2t0b3BDb250ZW50VHJpZ2dlcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSB1c2VySW5mb0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSB1c2VySW5mb0RpdmlkZXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgaXRlbXNDb250YWluZXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwdWJsaWMgZ2V0IHJvb3QoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcm9vdDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElVc2VyTWVudU9wdGlvbnMpIHtcclxuICAgIHRoaXMuY29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXI7XHJcbiAgICB0aGlzLnVzZXJBdmF0YXIgPSBvcHRpb25zLnVzZXJBdmF0YXI7XHJcbiAgICB0aGlzLnVzZXJOYW1lID0gb3B0aW9ucy51c2VyTmFtZTtcclxuICAgIHRoaXMuaXRlbXMgPSBvcHRpb25zLml0ZW1zO1xyXG4gICAgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQgPSBvcHRpb25zLmNvbGxhcHNlQnJlYWtwb2ludCB8fCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cy5tZDtcclxuICAgIHRoaXMuZ2V0RGlzcGxheWVkVXNlckluZm8gPSBvcHRpb25zLmdldERpc3BsYXllZFVzZXJJbmZvIHx8IFVzZXJNZW51LmRlZmF1bHRHZXREaXNwbGF5ZWRVc2VySW5mbztcclxuICAgIHRoaXMub25JdGVtQ2xpY2sgPSBvcHRpb25zLm9uSXRlbUNsaWNrO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIodW5kZWZpbmVkLCB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWRMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgaWYgKHRoaXMuX3Jvb3QpIHtcclxuICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5fcm9vdCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW5kZXJNYWluRWxlbWVudHMoKTtcclxuICAgIHRoaXMucmVuZGVyVXNlckluZm8oKTtcclxuICAgIHRoaXMucmVuZGVySXRlbXMoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMucm9vdCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWRkSXRlbXMoaXRlbXM6IElVc2VyTWVudUl0ZW1Nb2RlbFtdKSB7XHJcbiAgICB0aGlzLml0ZW1zID0gdGhpcy5pdGVtcy5jb25jYXQoaXRlbXMpO1xyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbnNlcnRJdGVtcyhpdGVtczogSVVzZXJNZW51SXRlbU1vZGVsW10sIHBvc2l0aW9uOiBudW1iZXIpIHtcclxuICAgIHRoaXMuaXRlbXMuc3BsaWNlKHBvc2l0aW9uLCAwLCAuLi5pdGVtcyk7XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZUl0ZW1zKGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXSkge1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgbWVudUl0ZW1zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXRlbXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QmFkZ2UoaXRlbU5hbWU6IHN0cmluZyk6IElCYWRnZU1vZGVsIHwgbnVsbCB7XHJcbiAgICBjb25zdCBtZW51SXRlbSA9IHRoaXMuaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5UZXh0Py50b0xvd2VyQ2FzZSgpID09PSBpdGVtTmFtZSk7XHJcblxyXG4gICAgcmV0dXJuIG1lbnVJdGVtPy5CYWRnZSB8fCBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEJhZGdlKGl0ZW1OYW1lOiBzdHJpbmcsIGJhZGdlOiBJQmFkZ2VNb2RlbCkge1xyXG4gICAgY29uc3QgbWVudUl0ZW0gPSB0aGlzLml0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uVGV4dD8udG9Mb3dlckNhc2UoKSA9PT0gaXRlbU5hbWUpO1xyXG5cclxuICAgIGlmIChtZW51SXRlbSkge1xyXG4gICAgICBtZW51SXRlbS5CYWRnZSA9IGJhZGdlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0IGlzTW9iaWxlVmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1heFdpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWF4V2lkdGg7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVuZGVyTWFpbkVsZW1lbnRzKCkge1xyXG4gICAgdGhpcy5fcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5fcm9vdC5jbGFzc0xpc3QuYWRkKCd1c2VyLW1lbnUnKTtcclxuXHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMubW9iaWxlQ29udGVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKC8qJ25hdmJhci1uYXYnLCAqL2BkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tbm9uZWApO1xyXG5cclxuICAgIHRoaXMuZGVza3RvcFJvb3REcm9wZG93biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5kZXNrdG9wUm9vdERyb3Bkb3duLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duJywgJ2Qtbm9uZScsIGBkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tYmxvY2tgKTtcclxuXHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudFRyaWdnZXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyX19pY29uLWJ1dHRvbicsICdidG4nLCAnYnRuLW91dGxpbmUtbGlnaHQnKTtcclxuICAgIHRoaXMuZGVza3RvcENvbnRlbnRUcmlnZ2VyLnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTtcclxuICAgIHRoaXMuZGVza3RvcENvbnRlbnRUcmlnZ2VyLnNldEF0dHJpYnV0ZSgnZGF0YS10b2dnbGUnLCAnZHJvcGRvd24nKTtcclxuXHJcbiAgICBsZXQgYXZhdGFyO1xyXG4gICAgaWYgKGNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICBpZiAodGhpcy51c2VyQXZhdGFyKSB7XHJcbiAgICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XHJcbiAgICAgICAgYXZhdGFyLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24taWNvbicsICdoZWFkZXJfX2ljb24tYnV0dG9uLWF2YXRhcicpO1xyXG4gICAgICAgIGF2YXRhci5zcmMgPSB0aGlzLnVzZXJBdmF0YXI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgICAgIGF2YXRhci5jbGFzc0xpc3QuYWRkKCdoZWFkZXJfX2ljb24tYnV0dG9uLWljb24nLCAnZmFzJywgJ2ZhLXVzZXInKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgICBhdmF0YXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyX19pY29uLWJ1dHRvbi1pY29uJywgJ2lzb3otaWNvbi11c2VyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51JywgJ2Ryb3Bkb3duLW1lbnUtcmlnaHQnKTtcclxuXHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlci5hcHBlbmRDaGlsZChhdmF0YXIpO1xyXG5cclxuICAgIGlmICh0aGlzLml0ZW1zLnNvbWUoKGl0ZW0pID0+ICEhaXRlbS5CYWRnZSkpIHtcclxuICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgIGJhZGdlLmNsYXNzTGlzdC5hZGQoJ3VzZXItbWVudV9fYmFkZ2UnKTtcclxuICAgICAgdGhpcy5kZXNrdG9wQ29udGVudFRyaWdnZXIuYXBwZW5kQ2hpbGQoYmFkZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGVza3RvcFJvb3REcm9wZG93bi5hcHBlbmRDaGlsZCh0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlcik7XHJcbiAgICB0aGlzLmRlc2t0b3BSb290RHJvcGRvd24uYXBwZW5kQ2hpbGQodGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5pdGVtc0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XHJcbiAgICB0aGlzLml0ZW1zQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3VzZXItbWVudV9faXRlbXMnKTtcclxuXHJcbiAgICBpZiAoY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgIHRoaXMudXNlckluZm9Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoNicpO1xyXG4gICAgICB0aGlzLnVzZXJJbmZvQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3VzZXItaW5mbycsICdoNicpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCd1c2VyLWluZm8nLCAnZHJvcGRvd24taXRlbScpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXNlckluZm9EaXZpZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLnVzZXJJbmZvRGl2aWRlci5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1kaXZpZGVyJywgJ2Qtbm9uZScsIGBkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tYmxvY2tgKTtcclxuXHJcbiAgICBpZiAodGhpcy5pc01vYmlsZVZpZXcpIHtcclxuICAgICAgdGhpcy5tb2JpbGVDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9Db250YWluZXIpO1xyXG4gICAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy51c2VySW5mb0RpdmlkZXIpO1xyXG4gICAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5pdGVtc0NvbnRhaW5lcik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9Db250YWluZXIpO1xyXG4gICAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9EaXZpZGVyKTtcclxuICAgICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLml0ZW1zQ29udGFpbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9yb290LmFwcGVuZENoaWxkKHRoaXMubW9iaWxlQ29udGVudENvbnRhaW5lcik7XHJcbiAgICB0aGlzLl9yb290LmFwcGVuZENoaWxkKHRoaXMuZGVza3RvcFJvb3REcm9wZG93bik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVuZGVyVXNlckluZm8oKSB7XHJcbiAgICBpZiAoIXRoaXMudXNlckluZm9Db250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3VzZXJJbmZvQ29udGFpbmVyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICBjb25zdCB1c2VySW5mb0NvbnRlbnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICB1c2VySW5mb0NvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3VzZXItaW5mb19fY29udGVudCcpO1xyXG4gICAgICB1c2VySW5mb0NvbnRlbnRFbGVtZW50LmlubmVyVGV4dCA9IHRoaXMuZ2V0RGlzcGxheWVkVXNlckluZm8odGhpcy51c2VyTmFtZSk7XHJcblxyXG4gICAgICB0aGlzLnVzZXJJbmZvQ29udGFpbmVyLmFwcGVuZENoaWxkKHVzZXJJbmZvQ29udGVudEVsZW1lbnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lci5pbm5lclRleHQgPSB0aGlzLmdldERpc3BsYXllZFVzZXJJbmZvKHRoaXMudXNlck5hbWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlckl0ZW1zKCkge1xyXG4gICAgaWYgKCF0aGlzLml0ZW1zQ29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdpdGVtc0NvbnRhaW5lcicpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2xlYXJJdGVtc0NvbnRhaW5lcigpO1xyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtRWxlbWVudChpdGVtLCB0aGlzLmlzTW9iaWxlVmlldyk7XHJcbiAgICAgIHRoaXMuaXRlbXNDb250YWluZXIhLmFwcGVuZENoaWxkKGl0ZW1FbGVtZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUl0ZW1FbGVtZW50KGl0ZW06IElVc2VyTWVudUl0ZW1Nb2RlbCwgaXNNb2JpbGU6IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtRWxlbWVudEJhc2UoaXRlbSk7XHJcblxyXG4gICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBsaW5rRWxlbWVudC5jbGFzc0xpc3QuYWRkKGlzTW9iaWxlID8gJ25hdi1saW5rJyA6ICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICBsaW5rRWxlbWVudC5ocmVmID0gaXRlbS5VcmwgfHwgJ2phdmFzY3JpcHQ6dm9pZCgwKSc7XHJcbiAgICBsaW5rRWxlbWVudC50ZXh0ID0gaXRlbS5UZXh0O1xyXG4gICAgaWYoaXRlbS5PcGVuSW5OZXdQYWdlKSB7XHJcbiAgICAgIGxpbmtFbGVtZW50LnRhcmdldCA9ICdfYmxhbmsnO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzVG9JdGVtKGxpbmtFbGVtZW50LCBpdGVtKTtcclxuICAgIGl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKGxpbmtFbGVtZW50KTtcclxuXHJcbiAgICBpZiAoaXRlbS5CYWRnZSkge1xyXG4gICAgICBjb25zdCBiYWRnZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaXNvei1iYWRnZScpO1xyXG4gICAgICBiYWRnZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdpc296LWJhZGdlLS1jaXJjbGUnKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuY2xhc3NMaXN0LmFkZChgaXNvei1iYWRnZS0tJHtpdGVtLkJhZGdlLlR5cGUgfHwgJ2luZm9ybWF0aW9uJ31gKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuaW5uZXJIVE1MID0gaXRlbS5CYWRnZS5UZXh0O1xyXG5cclxuICAgICAgbGlua0VsZW1lbnQuYXBwZW5kQ2hpbGQoYmFkZ2VsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpdGVtRWxlbWVudDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVJdGVtRWxlbWVudEJhc2UoaXRlbTogSVVzZXJNZW51SXRlbU1vZGVsKSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCduYXYtaXRlbScpO1xyXG5cclxuICAgIHJldHVybiBpdGVtRWxlbWVudDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhdHRhY2hFdmVudHNUb0l0ZW0oaXRlbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpdGVtOiBJVXNlck1lbnVJdGVtTW9kZWwpIHtcclxuICAgIGl0ZW1FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHRoaXMub25NZW51SXRlbUNsaWNrKHtcclxuICAgICAgaXRlbSxcclxuICAgICAgb3JpZ2luYWxFdmVudDogZVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHN3aXRjaFZpZXcoaXNNb2JpbGU6IGJvb2xlYW4pIHtcclxuICAgIGlmIChpc01vYmlsZSkge1xyXG4gICAgICB0aGlzLmFwcGx5TW9iaWxlVmlld0ZvclVzZXJJbmZvKCk7XHJcbiAgICAgIHRoaXMuYXBwbHlNb2JpbGVWaWV3Rm9ySXRlbXMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYXBwbHlEZXNrdG9wVmlld0ZvclVzZXJJbmZvKCk7XHJcbiAgICAgIHRoaXMuYXBwbHlEZXNrdG9wVmlld0Zvckl0ZW1zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlNb2JpbGVWaWV3Rm9yVXNlckluZm8oKSB7XHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMudXNlckluZm9Db250YWluZXIsIG51bGwpO1xyXG4gICAgdGhpcy5tb2JpbGVDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLnVzZXJJbmZvRGl2aWRlciwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlEZXNrdG9wVmlld0ZvclVzZXJJbmZvKCkge1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy51c2VySW5mb0NvbnRhaW5lciwgbnVsbCk7XHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLnVzZXJJbmZvRGl2aWRlciwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlNb2JpbGVWaWV3Rm9ySXRlbXMoKSB7XHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMuaXRlbXNDb250YWluZXIsIG51bGwpO1xyXG5cclxuICAgIGZvciAoY29uc3QgaXRlbUVsZW1lbnQgb2YgdGhpcy5pdGVtc0NvbnRhaW5lci5jaGlsZHJlbikge1xyXG4gICAgICBpdGVtRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZD8uY2xhc3NMaXN0LnJlcGxhY2UoJ2Ryb3Bkb3duLWl0ZW0nLCAnbmF2LWxpbmsnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseURlc2t0b3BWaWV3Rm9ySXRlbXMoKSB7XHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLml0ZW1zQ29udGFpbmVyLCBudWxsKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGl0ZW1FbGVtZW50IG9mIHRoaXMuaXRlbXNDb250YWluZXIuY2hpbGRyZW4pIHtcclxuICAgICAgaXRlbUVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ/LmNsYXNzTGlzdC5yZXBsYWNlKCduYXYtbGluaycsICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2xlYXJJdGVtc0NvbnRhaW5lcigpIHtcclxuICAgIHdoaWxlICh0aGlzLml0ZW1zQ29udGFpbmVyLmZpcnN0Q2hpbGQpIHtcclxuICAgICAgdGhpcy5pdGVtc0NvbnRhaW5lci5maXJzdENoaWxkLnJlbW92ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRJdGVtQ2xpY2soZTogVXNlck1lbnVJdGVtQ2xpY2tFdmVudCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5vbkl0ZW1DbGljaz8uKGUpO1xyXG4gICAgICBlLml0ZW0uT25DbGljaz8uKGUpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRoaXMuc3dpdGNoVmlldyh0aGlzLmlzTW9iaWxlVmlldyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uTWVudUl0ZW1DbGljayhlOiBVc2VyTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0aGlzLmVtaXRJdGVtQ2xpY2soZSk7XHJcblxyXG4gICAgaWYgKGUuY2FuY2VsKSB7XHJcbiAgICAgIGUub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSVJlbmRlcmVkIH0gZnJvbSAnLi4vQ29yZSc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4uLy4uL0hlYWRlcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElNZW51SXRlbSB7XHJcbiAgdGV4dDogc3RyaW5nO1xyXG4gIGljb24/OiBzdHJpbmc7XHJcbiAgaXRlbXM/OiBJTWVudUl0ZW1bXTtcclxuICB1cmw/OiBzdHJpbmc7XHJcbiAgaGlkZGVuPzogYm9vbGVhbjtcclxuICBhY3RpdmU/OiBib29sZWFuO1xyXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcclxuICB0aXRsZT86IHN0cmluZztcclxuICBtZW51SXRlbUVsPzogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgb3JpZ2luYWxNb2RlbDogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsO1xyXG59XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGludGVyZmFjZS1uYW1lXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVudUl0ZW1DbGlja0V2ZW50IHtcclxuICByZWFkb25seSBpdGVtOiBJTWVudUl0ZW07XHJcbiAgcmVhZG9ubHkgb3JpZ2luYWxFdmVudDogVUlFdmVudDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTWVudU9wdGlvbnMge1xyXG4gIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgaXRlbXM6IElNZW51SXRlbVtdO1xyXG4gIG9uSXRlbUNsaWNrPzogKGU6IE1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1lbnUgaW1wbGVtZW50cyBJUmVuZGVyZWQge1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByb3RlY3RlZCBpdGVtczogSU1lbnVJdGVtW107XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9uSXRlbUNsaWNrOiAoKGU6IE1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbiAgLy8gZWxlbWVudHNcclxuICBwcm90ZWN0ZWQgcm9vdDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElNZW51T3B0aW9ucykge1xyXG4gICAgdGhpcy5jb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjtcclxuICAgIHRoaXMuaXRlbXMgPSBvcHRpb25zLml0ZW1zO1xyXG4gICAgdGhpcy5vbkl0ZW1DbGljayA9IG9wdGlvbnMub25JdGVtQ2xpY2s7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWJzdHJhY3QgcmVuZGVyKCk6IHZvaWQ7XHJcbiAgcHVibGljIHVwZGF0ZUl0ZW1zKGl0ZW1zOiBJTWVudUl0ZW1bXSkge1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRJdGVtQ2xpY2soZTogTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uSXRlbUNsaWNrPy4oZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBNZW51LCBJTWVudU9wdGlvbnMsIElNZW51SXRlbSB9IGZyb20gJy4vTWVudSc7XHJcbmltcG9ydCB7IHRocm93UmVuZGVyRXJyb3IgfSBmcm9tICcuLi9Db3JlJztcclxuaW1wb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyLCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cyB9IGZyb20gJy4uLy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwsIGlzSXRlbUFjdGl2ZSB9IGZyb20gJy4uLy4uL0hlYWRlcic7XHJcblxyXG5leHBvcnQgZW51bSBDb2xsYXBzaW5nTW9kZSB7XHJcbiAgRGlzYWJsZWQsXHJcbiAgQ29sbGFwc2VkLFxyXG4gIEV4cGFuZGVkLFxyXG4gIEFkYXB0aXZlQ29sbGFwc2luZ1xyXG59XHJcblxyXG50eXBlIEl0ZW1BY3Rpb25Nb2RlID0gJ2hvdmVyJyB8ICdjbGljayc7XHJcbmV4cG9ydCBpbnRlcmZhY2UgSUJvb3RzdHJhcENvbGxhcHNpbmdNZW51T3B0aW9ucyBleHRlbmRzIElNZW51T3B0aW9ucyB7XHJcbiAgaXRlbUFjdGlvbj86IEl0ZW1BY3Rpb25Nb2RlO1xyXG4gIGNvbGxhcHNpbmdNb2RlPzogQ29sbGFwc2luZ01vZGU7XHJcbiAgY29sbGFwc2VCcmVha3BvaW50PzogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgY29sbGFwc2VJY29uPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUgZXh0ZW5kcyBNZW51IHtcclxuICBwcm90ZWN0ZWQgc3RhdGljIEhPVkVSX01PREVfQ1NTX0NMQVNTID0gJ25hdmJhci1uYXZfaG92ZXItYWN0aW9uJztcclxuICBwcm90ZWN0ZWQgc3RhdGljIGFkYXB0aXZpdHlDb2xsYXBzaW5nRGVsYXkgPSA1MDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXRlbUFjdGlvbk1vZGU6IEl0ZW1BY3Rpb25Nb2RlO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBjb2xsYXBzaW5nTW9kZTogQ29sbGFwc2luZ01vZGU7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbGxhcHNlSWNvbk5hbWU6IHN0cmluZztcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29sbGFwc2VCcmVha3BvaW50OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgd2luZG93UmVzaXplTGlzdGVuZXI6IFdpbmRvd1Jlc2l6ZUxpc3RlbmVyO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBvbldpbmRvd1Jlc2l6ZUV2ZW50SGFuZGxlciA9IHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25Ub2dnbGVEcm9wZG93bkJ1dHRvbkNsaWNrSGFuZGxlciA9IHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbkNsaWNrLmJpbmQodGhpcyk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9uVG9nZ2xlRHJvcGRvd25CdXR0b25Nb3VzZUVudGVySGFuZGxlciA9IHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbk1vdXNlRW50ZXIuYmluZCh0aGlzKTtcclxuICAvLyBlbGVtZW50c1xyXG4gIHByb3RlY3RlZCBjb2xsYXBzZVJvb3Q6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByb3RlY3RlZCBjb2xsYXBzZUJ1dHRvbjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJvdGVjdGVkIGNvbGxhcHNlRHJvcGRvd246IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByb3RlY3RlZCBjdXJyZW50T3BlbmluZ1N1Yk1lbnU6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJQm9vdHN0cmFwQ29sbGFwc2luZ01lbnVPcHRpb25zKSB7XHJcbiAgICBzdXBlcihvcHRpb25zKTtcclxuXHJcbiAgICB0aGlzLml0ZW1BY3Rpb25Nb2RlID0gb3B0aW9ucy5pdGVtQWN0aW9uIHx8ICdob3Zlcic7XHJcbiAgICB0aGlzLmNvbGxhcHNpbmdNb2RlID0gb3B0aW9ucy5jb2xsYXBzaW5nTW9kZSA/PyBDb2xsYXBzaW5nTW9kZS5BZGFwdGl2ZUNvbGxhcHNpbmc7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCA9IG9wdGlvbnMuY29sbGFwc2VCcmVha3BvaW50IHx8IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzLm1kO1xyXG4gICAgdGhpcy5jb2xsYXBzZUljb25OYW1lID0gb3B0aW9ucy5jb2xsYXBzZUljb24gfHwgJ2ZhLWVsbGlwc2lzLXYnO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIoXHJcbiAgICAgIHRoaXMuY29sbGFwc2luZ01vZGUgPT09IENvbGxhcHNpbmdNb2RlLkFkYXB0aXZlQ29sbGFwc2luZyA/IHRoaXMub25XaW5kb3dSZXNpemVFdmVudEhhbmRsZXIgOiB1bmRlZmluZWQsXHJcbiAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuYWRhcHRpdml0eUNvbGxhcHNpbmdEZWxheVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBpZiAodGhpcy5yb290KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlclJvb3QoKTtcclxuICAgIHRoaXMucmVuZGVySXRlbXMoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5yb290KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVJdGVtcyhpdGVtczogSU1lbnVJdGVtW10pIHtcclxuICAgIHN1cGVyLnVwZGF0ZUl0ZW1zKGl0ZW1zKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gbmV3IEVycm9yKCdUaGUgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUgaXNuXFwndCByZW5kZXJlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHdoaWxlICh0aGlzLnJvb3QuZmlyc3RDaGlsZCkge1xyXG4gICAgICB0aGlzLnJvb3QuZmlyc3RDaGlsZC5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlckl0ZW1zKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpIHtcclxuICAgIGlmICh0aGlzLmNvbGxhcHNpbmdNb2RlICE9PSBDb2xsYXBzaW5nTW9kZS5BZGFwdGl2ZUNvbGxhcHNpbmdcclxuICAgICAgfHwgIXRoaXMucm9vdCB8fCAhdGhpcy5pdGVtcy5sZW5ndGggfHwgIXRoaXMuY29sbGFwc2VSb290IHx8ICF0aGlzLmNvbGxhcHNlRHJvcGRvd24pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzTmVlZENvbGxhcHNlKCkpIHtcclxuICAgICAgdGhpcy5jb2xsYXBzZVJvb3QuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7XHJcblxyXG4gICAgICBkbyB7XHJcbiAgICAgICAgY29uc3QgbGFzdEl0ZW1FbGVtZW50ID0gdGhpcy5yb290LmNoaWxkcmVuW3RoaXMucm9vdC5jaGlsZHJlbi5sZW5ndGggLSAyXTtcclxuICAgICAgICBpZiAoIWxhc3RJdGVtRWxlbWVudCkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1vdmVSb290SXRlbXNUb0NvbGxhcHNlRHJvcGRvd24obGFzdEl0ZW1FbGVtZW50KTtcclxuICAgICAgfSB3aGlsZSAodGhpcy5pc05lZWRDb2xsYXBzZSgpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdoaWxlICh0aGlzLmNvbGxhcHNlRHJvcGRvd24uY2hpbGRyZW4ubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5tb3ZlUm9vdEl0ZW1zVG9Sb290KHRoaXMuY29sbGFwc2VEcm9wZG93bi5maXJzdEVsZW1lbnRDaGlsZCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzTmVlZENvbGxhcHNlKCkpIHtcclxuICAgICAgICAgIGNvbnN0IGxhc3RJdGVtRWxlbWVudCA9IHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLnJvb3QuY2hpbGRyZW4ubGVuZ3RoIC0gMl07XHJcbiAgICAgICAgICBsYXN0SXRlbUVsZW1lbnQgJiYgdGhpcy5tb3ZlUm9vdEl0ZW1zVG9Db2xsYXBzZURyb3Bkb3duKGxhc3RJdGVtRWxlbWVudCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5jb2xsYXBzZURyb3Bkb3duLmNoaWxkcmVuLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuY29sbGFwc2VSb290LmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpIHtcclxuICAgIHRoaXMuZm9yRWFjaE1lbnVJdGVtUmVjdXJzaXZlKHRoaXMuaXRlbXMsIChpdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IG9sZEFjdGl2ZVZhbHVlID0gaXRlbS5hY3RpdmU7XHJcbiAgICAgIGl0ZW0uYWN0aXZlID0gaXNJdGVtQWN0aXZlKGl0ZW0ub3JpZ2luYWxNb2RlbCk7XHJcblxyXG4gICAgICBpZiAoaXRlbS5hY3RpdmUgIT09IG9sZEFjdGl2ZVZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5hcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbS5tZW51SXRlbUVsLmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50LCBpdGVtKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2VPcGVuZWREcm9wZG93bih0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgaWYgKHRoaXMuaXRlbUFjdGlvbk1vZGUgPT09ICdob3ZlcicpIHtcclxuICAgICAgLy9OT1RFOiBGb3IgY2xvc2luZyBvcGVuZWQgZHJvcGRvd25cclxuICAgICAgdGhpcy5yb290LmNsYXNzTGlzdC5yZW1vdmUoQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuSE9WRVJfTU9ERV9DU1NfQ0xBU1MpO1xyXG4gICAgICAkKHRhcmdldEVsZW1lbnQpLm9uZSgnbW91c2VsZWF2ZScsICgpID0+IHtcclxuICAgICAgICB0aGlzLnJvb3QuY2xhc3NMaXN0LmFkZChCb290c3RyYXBDb2xsYXBzaW5nTWVudS5IT1ZFUl9NT0RFX0NTU19DTEFTUyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGZvckVhY2hNZW51SXRlbVJlY3Vyc2l2ZShyb290SXRlbXM6IElNZW51SXRlbVtdLCBhY3Rpb246IChpdGVtOiBJTWVudUl0ZW0pID0+IHZvaWQpIHtcclxuICAgIHJvb3RJdGVtcy5mb3JFYWNoKChpKSA9PiB7XHJcbiAgICAgIGFjdGlvbihpKTtcclxuICAgICAgaWYgKHRoaXMuaXNOZXN0ZWRJdGVtc093bmVySXRlbShpKSkge1xyXG4gICAgICAgIHRoaXMuZm9yRWFjaE1lbnVJdGVtUmVjdXJzaXZlKGkuaXRlbXMsIGFjdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlclJvb3QoKSB7XHJcbiAgICB0aGlzLnJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xyXG4gICAgdGhpcy5yb290LmNsYXNzTGlzdC5hZGQoJ25hdmJhci1uYXYnLCAnbXItYXV0bycpO1xyXG4gICAgaWYgKHRoaXMuaXRlbUFjdGlvbk1vZGUgPT09ICdob3ZlcicpIHtcclxuICAgICAgdGhpcy5yb290LmNsYXNzTGlzdC5hZGQoQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuSE9WRVJfTU9ERV9DU1NfQ0xBU1MpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlckl0ZW1zKCkge1xyXG4gICAgdGhpcy5yZW5kZXJSb290SXRlbXMoKTtcclxuXHJcbiAgICBpZiAodGhpcy5pdGVtcy5sZW5ndGggJiYgdGhpcy5jb2xsYXBzaW5nTW9kZSAhPT0gQ29sbGFwc2luZ01vZGUuRGlzYWJsZWQpIHtcclxuICAgICAgaWYgKCF0aGlzLnJvb3QpIHtcclxuICAgICAgICB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMucm9vdC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XHJcbiAgICAgIHRoaXMucmVuZGVyQ29sbGFwc2VFbGVtZW50cygpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmFwcGx5QWRhcHRpdml0eUNvbGxhcHNpbmcoKTtcclxuICAgICAgICB0aGlzLnJvb3Quc3R5bGUudmlzaWJpbGl0eSA9ICcnO1xyXG4gICAgICB9LCAxMCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jaGFuZ2VEZWZhdWx0RHJvcGRvd25CZWhhdmlvckZvck5lc3RlZERyb3Bkb3duKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2hhbmdlRGVmYXVsdERyb3Bkb3duQmVoYXZpb3JGb3JOZXN0ZWREcm9wZG93bigpIHtcclxuICAgICQodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wZG93bicpKS5vbignaGlkZS5icy5kcm9wZG93bicsIChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGUudGFyZ2V0ICE9PSB0aGlzLmN1cnJlbnRPcGVuaW5nU3ViTWVudSAmJiBlLnRhcmdldC5jb250YWlucyh0aGlzLmN1cnJlbnRPcGVuaW5nU3ViTWVudSk7XHJcblxyXG4gICAgICByZXR1cm4gIXJlc3VsdDtcclxuICAgIH0pO1xyXG5cclxuICAgICQodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wZG93bi1zdWJtZW51JykpLm9uKCdzaG93LmJzLmRyb3Bkb3duJywgKGUpID0+IHtcclxuICAgICAgdGhpcy5jdXJyZW50T3BlbmluZ1N1Yk1lbnUgPSB1bmRlZmluZWQ7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZW5kZXJDb2xsYXBzZUVsZW1lbnRzKCkge1xyXG4gICAgaWYgKCF0aGlzLnJvb3QpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3Jvb3QnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNvbGxhcHNlUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlUm9vdC5jbGFzc0xpc3QuYWRkKCduYXYtaXRlbScsICdkcm9wZG93bicsICdjb2xsYXBzaW5nLW1lbnVfX2NvbGxhcHNlLXJvb3QnKTtcclxuXHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24nLCAnYnRuJywgJ2J0bi1vdXRsaW5lLWxpZ2h0Jyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uLnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTtcclxuICAgIHRoaXMuY29sbGFwc2VCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLXRvZ2dsZScsICdkcm9wZG93bicpO1xyXG5cclxuICAgIGNvbnN0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJyk7XHJcbiAgICBpY29uLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24taWNvbicsICdmYXMnLCB0aGlzLmNvbGxhcHNlSWNvbk5hbWUpO1xyXG5cclxuICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24uY2xhc3NMaXN0LmFkZCgnZHJvcGRvd24tbWVudScsICdkcm9wZG93bi1tZW51LXJpZ2h0Jyk7XHJcblxyXG4gICAgdGhpcy5jb2xsYXBzZUJ1dHRvbi5hcHBlbmRDaGlsZChpY29uKTtcclxuICAgIHRoaXMuY29sbGFwc2VSb290LmFwcGVuZENoaWxkKHRoaXMuY29sbGFwc2VCdXR0b24pO1xyXG4gICAgdGhpcy5jb2xsYXBzZVJvb3QuYXBwZW5kQ2hpbGQodGhpcy5jb2xsYXBzZURyb3Bkb3duKTtcclxuXHJcbiAgICB0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5jb2xsYXBzZVJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlclJvb3RJdGVtcygpIHtcclxuICAgIGlmICghdGhpcy5yb290KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGxldCBjb250ZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlzTmVzdGVkSXRlbXNPd25lckl0ZW0oaXRlbSkpIHtcclxuICAgICAgICBjb250ZW50ID0gdGhpcy5jcmVhdGVSb290SXRlbVdpdGhOZXN0ZWRJdGVtcyhpdGVtIGFzIElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnRlbnQgPSB0aGlzLmNyZWF0ZVJvb3RJdGVtRWxlbWVudChpdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5yb290IS5hcHBlbmRDaGlsZChjb250ZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVJvb3RJdGVtV2l0aE5lc3RlZEl0ZW1zKGl0ZW06IElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVSb290SXRlbUVsZW1lbnQoaXRlbSk7XHJcbiAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bicpO1xyXG5cclxuICAgIGNvbnN0IGl0ZW1Db250ZW50ID0gaXRlbUVsZW1lbnQucXVlcnlTZWxlY3RvcignLm5hdi1saW5rJyk7XHJcbiAgICBpdGVtQ29udGVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRoaXMuc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudCk7XHJcblxyXG4gICAgY29uc3QgZHJvcGRvd25NZW51RWxlbWVudCA9IHRoaXMuY3JlYXRlRHJvcGRvd25NZW51KGl0ZW0pO1xyXG4gICAgaXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25NZW51RWxlbWVudCk7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVJvb3RJdGVtRWxlbWVudChpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcclxuICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ25hdi1pdGVtJyk7XHJcbiAgICBpdGVtLnRpdGxlICYmIGl0ZW1FbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCBpdGVtLnRpdGxlKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ25hdi1saW5rJyk7XHJcbiAgICBpdGVtQ29udGVudC5ocmVmID0gaXRlbS51cmwgfHwgJ2phdmFzY3JpcHQ6dm9pZCgwKSc7XHJcbiAgICBpdGVtQ29udGVudC50ZXh0ID0gaXRlbS50ZXh0O1xyXG5cclxuICAgIGNvbnN0IGljb25FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtSWNvbkVsZW1lbnQoaXRlbSk7XHJcbiAgICBpY29uRWxlbWVudCAmJiBpdGVtQ29udGVudC5pbnNlcnRCZWZvcmUoaWNvbkVsZW1lbnQsIGl0ZW1Db250ZW50LmZpcnN0Q2hpbGQpO1xyXG5cclxuICAgIHRoaXMuYXBwbHlTdGF0ZXNUb0l0ZW1FbGVtZW50KGl0ZW1Db250ZW50LCBpdGVtKTtcclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzVG9JdGVtKGl0ZW1Db250ZW50LCBpdGVtKTtcclxuXHJcbiAgICBpdGVtRWxlbWVudC5hcHBlbmRDaGlsZChpdGVtQ29udGVudCk7XHJcblxyXG4gICAgaXRlbS5tZW51SXRlbUVsID0gaXRlbUVsZW1lbnQ7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZU5lc3RlZFN1Yk1lbnVJdGVtRWxlbWVudChpdGVtOiBJTWVudUl0ZW0gJiB7IGl0ZW1zOiBJTWVudUl0ZW1bXSB9KSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IHRoaXMuY3JlYXRlTmVzdGVkSXRlbShpdGVtKTtcclxuICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duJywgJ2Ryb3Bkb3duLXN1Ym1lbnUnKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGl0ZW1FbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kcm9wZG93bi1pdGVtJyk7XHJcbiAgICBpdGVtQ29udGVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRoaXMuc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudCk7XHJcblxyXG4gICAgY29uc3QgZHJvcGRvd25NZW51RWxlbWVudCA9IHRoaXMuY3JlYXRlRHJvcGRvd25NZW51KGl0ZW0pO1xyXG4gICAgaXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25NZW51RWxlbWVudCk7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZU5lc3RlZEl0ZW0oaXRlbTogSU1lbnVJdGVtKSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICBpdGVtLnRpdGxlICYmIGl0ZW1FbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCBpdGVtLnRpdGxlKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLWl0ZW0nKTtcclxuICAgIGl0ZW1Db250ZW50LmhyZWYgPSBpdGVtLnVybCB8fCAnamF2YXNjcmlwdDp2b2lkKDApJztcclxuICAgIGl0ZW1Db250ZW50LnRleHQgPSBpdGVtLnRleHQ7XHJcblxyXG4gICAgY29uc3QgaWNvbkVsZW1lbnQgPSB0aGlzLmNyZWF0ZUl0ZW1JY29uRWxlbWVudChpdGVtKTtcclxuICAgIGljb25FbGVtZW50ICYmIGl0ZW1Db250ZW50Lmluc2VydEJlZm9yZShpY29uRWxlbWVudCwgaXRlbUNvbnRlbnQuZmlyc3RDaGlsZCk7XHJcblxyXG4gICAgdGhpcy5hcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbUNvbnRlbnQsIGl0ZW0pO1xyXG4gICAgdGhpcy5hdHRhY2hFdmVudHNUb0l0ZW0oaXRlbUNvbnRlbnQsIGl0ZW0pO1xyXG5cclxuICAgIGl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKGl0ZW1Db250ZW50KTtcclxuXHJcbiAgICBpdGVtLm1lbnVJdGVtRWwgPSBpdGVtRWxlbWVudDtcclxuXHJcbiAgICByZXR1cm4gaXRlbUVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY3JlYXRlRHJvcGRvd25NZW51KGl0ZW06IElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pIHtcclxuICAgIGNvbnN0IGRyb3Bkb3duTWVudUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xyXG4gICAgZHJvcGRvd25NZW51RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51Jyk7XHJcblxyXG4gICAgaXRlbS5pdGVtcy5mb3JFYWNoKChuZXN0ZWRJdGVtKSA9PiB7XHJcbiAgICAgIGxldCBjb250ZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlzTmVzdGVkSXRlbXNPd25lckl0ZW0obmVzdGVkSXRlbSkpIHtcclxuICAgICAgICBjb250ZW50ID0gdGhpcy5jcmVhdGVOZXN0ZWRTdWJNZW51SXRlbUVsZW1lbnQobmVzdGVkSXRlbSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29udGVudCA9IHRoaXMuY3JlYXRlTmVzdGVkSXRlbShuZXN0ZWRJdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZHJvcGRvd25NZW51RWxlbWVudC5hcHBlbmRDaGlsZChjb250ZW50KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBkcm9wZG93bk1lbnVFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUl0ZW1JY29uRWxlbWVudChpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGlmICghaXRlbS5pY29uKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGl0ZW1JY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgaXRlbUljb24uc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYHVybCgke2l0ZW0uaWNvbn0pYDtcclxuXHJcbiAgICByZXR1cm4gaXRlbUljb247XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLXRvZ2dsZScpO1xyXG4gICAgaXRlbUNvbnRlbnQuc2V0QXR0cmlidXRlKCdkYXRhLXRvZ2dsZScsICdkcm9wZG93bicpO1xyXG4gICAgaXRlbUNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uVG9nZ2xlRHJvcGRvd25CdXR0b25DbGlja0hhbmRsZXIpO1xyXG4gICAgaXRlbUNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbk1vdXNlRW50ZXJIYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGlmIChpdGVtLmFjdGl2ZSkge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpdGVtLmhpZGRlbikge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkLW5vbmUnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpdGVtLmRpc2FibGVkKSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkaXNhYmxlZCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGF0dGFjaEV2ZW50c1RvSXRlbShpdGVtRWxlbWVudDogSFRNTEVsZW1lbnQsIGl0ZW06IElNZW51SXRlbSkge1xyXG4gICAgaXRlbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4gdGhpcy5lbWl0SXRlbUNsaWNrKHtcclxuICAgICAgaXRlbSxcclxuICAgICAgb3JpZ2luYWxFdmVudDogZVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzTmVzdGVkSXRlbXNPd25lckl0ZW0oaXRlbTogSU1lbnVJdGVtKTogaXRlbSBpcyBJTWVudUl0ZW0gJiB7IGl0ZW1zOiBJTWVudUl0ZW1bXSB9IHtcclxuICAgIHJldHVybiBpdGVtLml0ZW1zICYmIGl0ZW0uaXRlbXMubGVuZ3RoICYmIGl0ZW0uaXRlbXMuc29tZSgoaSkgPT4gIWkuaGlkZGVuKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBtb3ZlUm9vdEl0ZW1zVG9Db2xsYXBzZURyb3Bkb3duKHJvb3RJdGVtT3JJdGVtczogRWxlbWVudCB8IEl0ZXJhYmxlPEVsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICBpZiAocm9vdEl0ZW1Pckl0ZW1zIGluc3RhbmNlb2YgRWxlbWVudCkge1xyXG4gICAgICB0aGlzLmFwcGx5Q29sbGFwc2luZ1ZpZXdGb3JSb290SXRlbShyb290SXRlbU9ySXRlbXMpO1xyXG4gICAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24uaW5zZXJ0QmVmb3JlKHJvb3RJdGVtT3JJdGVtcywgdGhpcy5jb2xsYXBzZURyb3Bkb3duLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRlbXBJdGVtRWxlbWVudHNTdG9yZSA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuXHJcbiAgICAgIGZvciAoY29uc3Qgcm9vdEl0ZW0gb2Ygcm9vdEl0ZW1Pckl0ZW1zKSB7XHJcbiAgICAgICAgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmluc2VydEJlZm9yZShyb290SXRlbSwgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgICAgICB0aGlzLmFwcGx5Q29sbGFwc2luZ1ZpZXdGb3JSb290SXRlbShyb290SXRlbSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY29sbGFwc2VEcm9wZG93bi5hcHBlbmRDaGlsZCh0ZW1wSXRlbUVsZW1lbnRzU3RvcmUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG1vdmVSb290SXRlbXNUb1Jvb3Qocm9vdEl0ZW1Pckl0ZW1zOiBFbGVtZW50IHwgSXRlcmFibGU8RWxlbWVudD4pOiB2b2lkIHtcclxuICAgIGlmIChyb290SXRlbU9ySXRlbXMgaW5zdGFuY2VvZiBFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuYXBwbHlFeHBhbmRlZFZpZXdGb3JSb290SXRlbShyb290SXRlbU9ySXRlbXMpO1xyXG4gICAgICB0aGlzLnJvb3QuaW5zZXJ0QmVmb3JlKHJvb3RJdGVtT3JJdGVtcywgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMucm9vdC5jaGlsZHJlbi5sZW5ndGggLSAxXSB8fCBudWxsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRlbXBJdGVtRWxlbWVudHNTdG9yZSA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuXHJcbiAgICAgIGZvciAoY29uc3Qgcm9vdEl0ZW0gb2Ygcm9vdEl0ZW1Pckl0ZW1zKSB7XHJcbiAgICAgICAgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmluc2VydEJlZm9yZShyb290SXRlbSwgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgICAgICB0aGlzLmFwcGx5RXhwYW5kZWRWaWV3Rm9yUm9vdEl0ZW0ocm9vdEl0ZW0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGVtcEl0ZW1FbGVtZW50c1N0b3JlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseUNvbGxhcHNpbmdWaWV3Rm9yUm9vdEl0ZW0ocm9vdEl0ZW06IEVsZW1lbnQpIHtcclxuICAgIHJvb3RJdGVtLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLXN1Ym1lbnUnKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHJvb3RJdGVtLmNoaWxkcmVuKSB7XHJcbiAgICAgIGNoaWxkLmNsYXNzTGlzdC5yZXBsYWNlKCduYXYtbGluaycsICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlFeHBhbmRlZFZpZXdGb3JSb290SXRlbShyb290SXRlbTogRWxlbWVudCkge1xyXG4gICAgcm9vdEl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgnZHJvcGRvd24tc3VibWVudScpO1xyXG5cclxuICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygcm9vdEl0ZW0uY2hpbGRyZW4pIHtcclxuICAgICAgY2hpbGQuY2xhc3NMaXN0LnJlcGxhY2UoJ2Ryb3Bkb3duLWl0ZW0nLCAnbmF2LWxpbmsnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBpc05lZWRDb2xsYXBzZSgpIHtcclxuICAgIGlmICh0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1pbldpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWluV2lkdGgpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucm9vdC5zdHlsZS5tYXhXaWR0aCA9ICdub25lJztcclxuICAgIGNvbnN0IGN1cnJlbnRSb290UmVjdCA9IHRoaXMucm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIHRoaXMucm9vdC5jbGFzc0xpc3QuYWRkKCdjb2xsYXBzaW5nLW1lbnVfbm9ybWFsLXdoaXRlLXNwYWNlJyk7XHJcblxyXG4gICAgY29uc3Qgbm9ybWFsUm9vdFJlY3QgPSB0aGlzLnJvb3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICB0aGlzLnJvb3QuY2xhc3NMaXN0LnJlbW92ZSgnY29sbGFwc2luZy1tZW51X25vcm1hbC13aGl0ZS1zcGFjZScpO1xyXG4gICAgdGhpcy5yb290LnN0eWxlLm1heFdpZHRoID0gJyc7XHJcblxyXG4gICAgcmV0dXJuIGN1cnJlbnRSb290UmVjdC53aWR0aCA+IG5vcm1hbFJvb3RSZWN0LndpZHRoO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzRHJvcGRvd25SZWN0c0ludGVyc2VjdChkcm9wZG93blJlY3QxOiBDbGllbnRSZWN0LCBkcm9wZG93blJlY3QyOiBDbGllbnRSZWN0LCBkZWx0YSA9IDIpIHtcclxuICAgIHJldHVybiBkcm9wZG93blJlY3QxLmxlZnQgPCAoZHJvcGRvd25SZWN0Mi5yaWdodCAtIGRlbHRhKSAmJiAoZHJvcGRvd25SZWN0Mi5sZWZ0ICsgZGVsdGEpIDwgZHJvcGRvd25SZWN0MS5yaWdodFxyXG4gICAgICAmJiBkcm9wZG93blJlY3QxLnRvcCA8IChkcm9wZG93blJlY3QyLmJvdHRvbSAtIGRlbHRhKSAmJiAoZHJvcGRvd25SZWN0Mi50b3AgKyBkZWx0YSkgPCBkcm9wZG93blJlY3QxLmJvdHRvbTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseVNoYWRvd3NGb3JPdmVybGFwaW5nRHJvcGRvd25JZk5lZWRlZChvcGVuZWREcm9wZG93bkVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAvLyBSZXNldCB0aGUgc3R5bGUgYmVmb3JlIHRoZSByZWN0IGdldHRpbmcgdG8gZ2V0IHJlYWwgdmFsdWVzXHJcbiAgICBvcGVuZWREcm9wZG93bkVsZW1lbnQuc3R5bGUubGVmdCA9ICcnO1xyXG4gICAgb3BlbmVkRHJvcGRvd25FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Ryb3Bkb3duLW1lbnUtbGVmdC1zaGFkb3dlZCcpO1xyXG4gICAgbGV0IHJlY3QgPSBvcGVuZWREcm9wZG93bkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBpZiAocmVjdC5yaWdodCA+IHdpbmRvdy5pbm5lcldpZHRoKSB7XHJcbiAgICAgIG9wZW5lZERyb3Bkb3duRWxlbWVudC5zdHlsZS5sZWZ0ID0gYC0ke3JlY3Qud2lkdGh9cHhgO1xyXG4gICAgfVxyXG5cclxuICAgIHJlY3QgPSBvcGVuZWREcm9wZG93bkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCBkcm9wZG93bkVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRyb3Bkb3duLW1lbnUnKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGRyb3Bkb3duRWxlbWVudCBvZiBkcm9wZG93bkVsZW1lbnRzKSB7XHJcbiAgICAgIGlmIChkcm9wZG93bkVsZW1lbnQgPT09IG9wZW5lZERyb3Bkb3duRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5pc0Ryb3Bkb3duUmVjdHNJbnRlcnNlY3QoZHJvcGRvd25FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCByZWN0KSkge1xyXG4gICAgICAgIG9wZW5lZERyb3Bkb3duRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51LWxlZnQtc2hhZG93ZWQnKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uV2luZG93UmVzaXplKGU6IFVJRXZlbnQpIHtcclxuICAgIHRoaXMuYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uVG9nZ2xlRHJvcGRvd25CdXR0b25DbGljayhlOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAoZS50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBlLnRhcmdldC5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuY3VycmVudE9wZW5pbmdTdWJNZW51ID0gZS50YXJnZXQucGFyZW50RWxlbWVudDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvblRvZ2dsZURyb3Bkb3duQnV0dG9uTW91c2VFbnRlcihlOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy53aW5kb3dSZXNpemVMaXN0ZW5lci5jdXJyZW50TGF5b3V0QnJlYWtwb2ludC5tYXhXaWR0aCA+PSB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludC5tYXhXaWR0aCAmJlxyXG4gICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50XHJcbiAgICAgICYmIGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZy5jbGFzc0xpc3QuY29udGFpbnMoJ2Ryb3Bkb3duLW1lbnUnKSkge1xyXG4gICAgICB0aGlzLmFwcGx5U2hhZG93c0Zvck92ZXJsYXBpbmdEcm9wZG93bklmTmVlZGVkKGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfSBmcm9tICcuL0lOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCc7XHJcbmltcG9ydCB7IGdldFVybEJ5TWVudUl0ZW1EYXRhLCBJTGF5b3V0QnJlYWtwb2ludCB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBCb290c3RyYXBDb2xsYXBzaW5nTWVudSB9IGZyb20gJy4uL0NvbXBvbmVudHMvTWVudSc7XHJcbmltcG9ydCB7IElNZW51SXRlbSwgTWVudUl0ZW1DbGlja0V2ZW50IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9NZW51L01lbnUnO1xyXG5pbXBvcnQgeyBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vU2VhcmNoJztcclxuXHJcbmNvbnN0IGZpbmRJdGVtQnlOYW1lUmVjdXJzaXZlbHkgPSAoaXRlbXM6IHJlYWRvbmx5IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFtdLCBpdGVtTmFtZTogc3RyaW5nKTogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsIHwgdW5kZWZpbmVkID0+IHtcclxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgIGlmIChpdGVtLk5hbWUgPT09IGl0ZW1OYW1lKSB7XHJcbiAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgfSBlbHNlIGlmIChpdGVtLkl0ZW1zPy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgbmVzdGVkSXRlbSA9IGZpbmRJdGVtQnlOYW1lUmVjdXJzaXZlbHkoaXRlbS5JdGVtcywgaXRlbU5hbWUpO1xyXG5cclxuICAgICAgaWYgKG5lc3RlZEl0ZW0pIHtcclxuICAgICAgICByZXR1cm4gbmVzdGVkSXRlbTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IGdldEl0ZW1VcmxzUmVjdXJzaXZlbHkgPSAoaXRlbURhdGE6IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCk6IHN0cmluZ1tdID0+IHtcclxuICBjb25zdCBpdGVtcyA9IGl0ZW1EYXRhLkl0ZW1zO1xyXG5cclxuICBpZiAoIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcclxuICAgIGNvbnN0IG93blVybCA9IGdldFVybEJ5TWVudUl0ZW1EYXRhKGl0ZW1EYXRhKTtcclxuXHJcbiAgICByZXR1cm4gb3duVXJsID8gW293blVybF0gOiBbXTtcclxuICB9XHJcblxyXG4gIGxldCB1cmxzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGl0ZW1zKSB7XHJcbiAgICB1cmxzID0gdXJscy5jb25jYXQoZ2V0SXRlbVVybHNSZWN1cnNpdmVseShjaGlsZCkpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHVybHM7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaXNJdGVtQWN0aXZlID0gKGl0ZW1EYXRhOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwpID0+IHtcclxuICBjb25zdCBjdXJyZW50TG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoO1xyXG4gIGNvbnN0IGl0ZW1VcmxzID0gZ2V0SXRlbVVybHNSZWN1cnNpdmVseShpdGVtRGF0YSk7XHJcblxyXG4gIGZvciAoY29uc3QgdXJsIG9mIGl0ZW1VcmxzKSB7XHJcbiAgICBjb25zdCB1cmxSZSA9IG5ldyBSZWdFeHAoYF4uKiR7dXJsLnJlcGxhY2UoJz8nLCAnXFxcXD8nKX0kYCk7XHJcblxyXG4gICAgaWYgKHVybFJlLnRlc3QoY3VycmVudExvY2F0aW9uKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBmYWxzZTtcclxufTtcclxuXHJcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogaW50ZXJmYWNlLW5hbWVcclxuZXhwb3J0IGludGVyZmFjZSBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50IHtcclxuICByZWFkb25seSBpdGVtOiBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbDtcclxuICByZWFkb25seSBvcmlnaW5hbEV2ZW50OiBVSUV2ZW50O1xyXG4gIGNhbmNlbD86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOYXZpZ2F0aW9uTWVudSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25OYXZpZ2F0aW9uTWVudUl0ZW1DbGljazogKChlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk1lbnVJdGVtQ2xpY2tIYW5kbGVyID0gdGhpcy5vbk1lbnVJdGVtQ2xpY2suYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IG1lbnU6IEJvb3RzdHJhcENvbGxhcHNpbmdNZW51O1xyXG4gIHByaXZhdGUgaXNHbG9iYWxNZW51OiBib29sZWFuO1xyXG4gIHByaXZhdGUgaXRlbXM6IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXHJcbiAgICBpdGVtczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sXHJcbiAgICBpc0dsb2JhbE1lbnU6IGJvb2xlYW4sXHJcbiAgICBjb2xsYXBzZUJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50LFxyXG4gICAgb25OYXZpZ2F0aW9uTWVudUl0ZW1DbGljazogKGU6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQpID0+IHZvaWRcclxuICApIHtcclxuICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xyXG4gICAgdGhpcy5pc0dsb2JhbE1lbnUgPSBpc0dsb2JhbE1lbnUsXHJcbiAgICB0aGlzLml0ZW1zID0gaXRlbXM7XHJcbiAgICB0aGlzLm9uTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2sgPSBvbk5hdmlnYXRpb25NZW51SXRlbUNsaWNrO1xyXG4gICAgdGhpcy5tZW51ID0gbmV3IEJvb3RzdHJhcENvbGxhcHNpbmdNZW51KHtcclxuICAgICAgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lcixcclxuICAgICAgaXRlbXM6IHRoaXMubWFwTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxUb01lbnVJdGVtcyhpdGVtcyksXHJcbiAgICAgIGNvbGxhcHNlQnJlYWtwb2ludCxcclxuICAgICAgb25JdGVtQ2xpY2s6IHRoaXMub25NZW51SXRlbUNsaWNrSGFuZGxlclxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlRGF0YShpdGVtczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sIGlzR2xvYmFsTWVudTogYm9vbGVhbikge1xyXG4gICAgLyogZXNsaW50IEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtZXhwcmVzc2lvbnM6IG9mZiAqL1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gICAgdGhpcy5pc0dsb2JhbE1lbnUgPSBpc0dsb2JhbE1lbnU7XHJcbiAgICB0aGlzLm1lbnUudXBkYXRlSXRlbXModGhpcy5tYXBOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFRvTWVudUl0ZW1zKHRoaXMuaXRlbXMpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICB0aGlzLm1lbnUucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpIHtcclxuICAgIHRoaXMubWVudS5hcHBseUFkYXB0aXZpdHlDb2xsYXBzaW5nKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpIHtcclxuICAgIHRoaXMubWVudS51cGRhdGVBY3RpdmVJdGVtc1N0YXRlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uTWVudUl0ZW1DbGljayhlOiBNZW51SXRlbUNsaWNrRXZlbnQpIHtcclxuICAgIGNvbnN0IGV2ZW50QXJncyA9IHRoaXMubWFwTWVudUl0ZW1DbGlja0V2ZW50QXJnc1RvTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudEFyZ3MoZSk7XHJcbiAgICBpZiAoZXZlbnRBcmdzKSB7XHJcbiAgICAgIHRoaXMuZW1pdE5hdmlnYXRpb25NZW51SXRlbUNsaWNrKGV2ZW50QXJncyk7XHJcblxyXG4gICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xyXG4gICAgICAgIGUub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXRFbCA9IGUub3JpZ2luYWxFdmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5tZW51LmNsb3NlT3BlbmVkRHJvcGRvd24odGFyZ2V0RWwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtaXROYXZpZ2F0aW9uTWVudUl0ZW1DbGljayhlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2s/LihlKTtcclxuICAgICAgZS5pdGVtLk9uQ2xpY2s/LihlKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxUb01lbnVJdGVtcyhtZW51SXRlbU1vZGVsczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10pIHtcclxuICAgIHJldHVybiBtZW51SXRlbU1vZGVscy5tYXA8SU1lbnVJdGVtPigobWVudUl0ZW1Nb2RlbCkgPT4ge1xyXG4gICAgICBjb25zdCBtZW51SXRlbSA9IHtcclxuICAgICAgICB0ZXh0OiBtZW51SXRlbU1vZGVsLk5hbWUsXHJcbiAgICAgICAgaWNvbjogbWVudUl0ZW1Nb2RlbC5JY29uLFxyXG4gICAgICAgIGl0ZW1zOiBtZW51SXRlbU1vZGVsLkl0ZW1zID8gdGhpcy5tYXBOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFRvTWVudUl0ZW1zKG1lbnVJdGVtTW9kZWwuSXRlbXMpIDogdW5kZWZpbmVkLFxyXG4gICAgICAgIHVybDogZ2V0VXJsQnlNZW51SXRlbURhdGEobWVudUl0ZW1Nb2RlbCksXHJcbiAgICAgICAgaGlkZGVuOiBtZW51SXRlbU1vZGVsLlZpc2libGUgPT09IGZhbHNlLFxyXG4gICAgICAgIGFjdGl2ZTogaXNJdGVtQWN0aXZlKG1lbnVJdGVtTW9kZWwpLFxyXG4gICAgICAgIGRpc2FibGVkOiBtZW51SXRlbU1vZGVsLkRpc2FibGVkLFxyXG4gICAgICAgIHRpdGxlOiBtZW51SXRlbU1vZGVsLkRlc2NyaXB0aW9uLFxyXG4gICAgICAgIG9yaWdpbmFsTW9kZWw6IG1lbnVJdGVtTW9kZWxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJldHVybiBtZW51SXRlbTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXBNZW51SXRlbUNsaWNrRXZlbnRBcmdzVG9OYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50QXJncyhlOiBNZW51SXRlbUNsaWNrRXZlbnQpOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50IHwgbnVsbCB7XHJcbiAgICBjb25zdCBpdGVtID0gZmluZEl0ZW1CeU5hbWVSZWN1cnNpdmVseSh0aGlzLml0ZW1zLCBlLml0ZW0udGV4dCk7XHJcblxyXG4gICAgcmV0dXJuICFpdGVtID8gbnVsbCA6IHtcclxuICAgICAgb3JpZ2luYWxFdmVudDogZS5vcmlnaW5hbEV2ZW50LFxyXG4gICAgICBjYW5jZWw6IGZhbHNlLFxyXG4gICAgICBpdGVtOiB7IC4uLml0ZW0sIGlzR2xvYmFsOiB0aGlzLmlzR2xvYmFsTWVudSB9XHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGNvbnN0IExPR09fU0VUVElOR1NfQ0FDSEVfS0VZID0gJ2lzem9sZWEtdWl8bG9nby1zZXR0aW5ncyc7XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTG9nb1NldHRpbmdzIH0gZnJvbSAnLi4vRGF0YSc7XHJcbmltcG9ydCB7IExPR09fU0VUVElOR1NfQ0FDSEVfS0VZIH0gZnJvbSAnLi4vQ29uc3RhbnRzL0NhY2hlS2V5cyc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vRGF0YS9SZXF1ZXN0JztcclxuXHJcbmV4cG9ydCBjbGFzcyBMb2dvIHtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgcHJpdmF0ZSAkaW1hZ2VFbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gIHByaXZhdGUgJHRpdGxlQ29udGFpbmVyOiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YVNvdXJjZTogSUxvZ29TZXR0aW5ncyB8IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoJGNvbnRhaW5lcjogSlF1ZXJ5LCBkYXRhU291cmNlOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSAkY29udGFpbmVyO1xyXG4gICAgdGhpcy5kYXRhU291cmNlID0gZGF0YVNvdXJjZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0V2lkZ2V0KCk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luaXRXaWRnZXQodGhpcy5kYXRhU291cmNlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVEYXRhKCk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVkpO1xyXG4gICAgdGhpcy4kaW1hZ2VFbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgdGhpcy4kdGl0bGVDb250YWluZXIucmVtb3ZlKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2luaXRXaWRnZXQodGhpcy5kYXRhU291cmNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRXaWRnZXQoZGF0YVNvdXJjZTogSUxvZ29TZXR0aW5ncyB8IHN0cmluZyk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgY29uc3QgY2FjaGVkU2V0dGluZ3NSYXcgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShMT0dPX1NFVFRJTkdTX0NBQ0hFX0tFWSk7XHJcblxyXG4gICAgaWYgKGNhY2hlZFNldHRpbmdzUmF3KSB7XHJcbiAgICAgIHRoaXMuX2NyZWF0ZUxvZ28oSlNPTi5wYXJzZShjYWNoZWRTZXR0aW5nc1JhdykgYXMgSUxvZ29TZXR0aW5ncyk7XHJcblxyXG4gICAgICByZXR1cm4gJC5EZWZlcnJlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVMb2dvKGRhdGFTb3VyY2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlTG9nbyhkYXRhU291cmNlOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nKTogSlF1ZXJ5RGVmZXJyZWQ8YW55PiB7XHJcbiAgICBpZiAodHlwZW9mIGRhdGFTb3VyY2UgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIGNvbnN0IGxvZ29TZXR0aW5ncyA9IGRhdGFTb3VyY2UgYXMgSUxvZ29TZXR0aW5ncztcclxuXHJcbiAgICAgIHRoaXMuX2NyZWF0ZUxvZ29NYXJrdXAobG9nb1NldHRpbmdzKTtcclxuXHJcbiAgICAgIHJldHVybiAkLkRlZmVycmVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHRoaXMuZGF0YVNvdXJjZSBhcyBzdHJpbmcsICdwb3N0JykuZG9uZSgoZGF0YSkgPT4ge1xyXG4gICAgICBjb25zdCBsb2dvU2V0dGluZ3M6IElMb2dvU2V0dGluZ3MgPSB7fTtcclxuICAgICAgbG9nb1NldHRpbmdzLmFwcGxpY2F0aW9uTmFtZSA9IGRhdGEuQXBwbGljYXRpb25OYW1lO1xyXG4gICAgICBsb2dvU2V0dGluZ3MuYnVzaW5lc3NOYW1lID0gZGF0YS5CdXNpbmVzc05hbWU7XHJcbiAgICAgIGxvZ29TZXR0aW5ncy5sb2dvSW1hZ2UgPSBkYXRhLkxvZ29JbWFnZTtcclxuICAgICAgbG9nb1NldHRpbmdzLmxhbmRpbmdQYWdlTG9nbyA9IGRhdGEuTGFuZGluZ1BhZ2VMb2dvO1xyXG4gICAgICBsb2dvU2V0dGluZ3MuZGVzY3JpcHRpb24gPSBkYXRhLkRlc2NyaXB0aW9uO1xyXG5cclxuICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVksIEpTT04uc3RyaW5naWZ5KGxvZ29TZXR0aW5ncykpO1xyXG5cclxuICAgICAgdGhpcy5fY3JlYXRlTG9nb01hcmt1cChsb2dvU2V0dGluZ3MpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVMb2dvTWFya3VwKGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncykge1xyXG4gICAgdGhpcy4kaW1hZ2VFbGVtZW50ID0gJCgnPGltZyAvPicpLmF0dHIoJ3NyYycsIGxvZ29TZXR0aW5ncy5sb2dvSW1hZ2UpLmFwcGVuZFRvKHRoaXMuJGNvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy4kdGl0bGVDb250YWluZXIgPSAkKCc8c3BhbiAvPicpLmFkZENsYXNzKCd0aXRsZS1jb250YWluZXInKS5hcHBlbmRUbyh0aGlzLiRjb250YWluZXIpO1xyXG5cclxuICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2J1c2luZXNzLW5hbWUnKS50ZXh0KGxvZ29TZXR0aW5ncy5idXNpbmVzc05hbWUpKTtcclxuICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2FwcC1uYW1lJykudGV4dChsb2dvU2V0dGluZ3MuYXBwbGljYXRpb25OYW1lLnRvVXBwZXJDYXNlKCkpKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElEZXN0cm95YWJsZSwgSVJlbmRlcmVkIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHsgV2luZG93UmVzaXplTGlzdGVuZXIsIElMYXlvdXRCcmVha3BvaW50LCBMYXlvdXRCcmVha3BvaW50Q2hhbmdlZEV2ZW50LCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cyB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTWVudVN3aXRjaGVyT3B0aW9ucyB7XHJcbiAgZGVza3RvcENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgbW9iaWxlQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICBjb2xsYXBzZUJyZWFrcG9pbnQ/OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBzdGFydFZhbHVlPzogYm9vbGVhbjtcclxuICBvblN3aXRjaD86ICh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE1lbnVTd2l0Y2hlciBpbXBsZW1lbnRzIElSZW5kZXJlZCwgSURlc3Ryb3lhYmxlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc2t0b3BDb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbW9iaWxlQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbGxhcHNlQnJlYWtwb2ludDogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblN3aXRjaDogKCh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkTGlzdGVuZXIgPSB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWQuYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHdpbmRvd1Jlc2l6ZUxpc3RlbmVyOiBXaW5kb3dSZXNpemVMaXN0ZW5lcjtcclxuICBwcml2YXRlIF92YWx1ZTogYm9vbGVhbjtcclxuICBwcml2YXRlIG1lbnVTd2l0Y2hlcjogRGV2RXhwcmVzcy51aS5keFN3aXRjaCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIG9uVmFsdWVDaGFuZ2VkOiAodmFsdWU6IGJvb2xlYW4pID0+IHZvaWQ7XHJcblxyXG4gIHB1YmxpYyBnZXQgdmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJTWVudVN3aXRjaGVyT3B0aW9ucykge1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGFpbmVyID0gb3B0aW9ucy5kZXNrdG9wQ29udGFpbmVyO1xyXG4gICAgdGhpcy5tb2JpbGVDb250YWluZXIgPSBvcHRpb25zLm1vYmlsZUNvbnRhaW5lcjtcclxuICAgIHRoaXMuY29sbGFwc2VCcmVha3BvaW50ID0gb3B0aW9ucy5jb2xsYXBzZUJyZWFrcG9pbnQgfHwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMubWQ7XHJcbiAgICB0aGlzLm9uU3dpdGNoID0gb3B0aW9ucy5vblN3aXRjaDtcclxuICAgIHRoaXMuX3ZhbHVlID0gb3B0aW9ucy5zdGFydFZhbHVlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnN0YXJ0VmFsdWUgOiB0cnVlO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIodW5kZWZpbmVkLCB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWRMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBjb250YWluZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pc01vYmlsZVZpZXcgPyB0aGlzLm1vYmlsZUNvbnRhaW5lciA6IHRoaXMuZGVza3RvcENvbnRhaW5lcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGlzTW9iaWxlVmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1heFdpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWF4V2lkdGg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VmlzaWJsZShpc1Zpc2libGU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMubWVudVN3aXRjaGVyPy5vcHRpb24oJ3Zpc2libGUnLCBpc1Zpc2libGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIHRoaXMucmVuZGVyU3dpdGNoKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVzdHJveSgpIHtcclxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLm1lbnVTd2l0Y2hlci5lbGVtZW50KCk7XHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlcj8uZGlzcG9zZSgpO1xyXG5cclxuICAgIHJvb3Q/LnJlbW92ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZhbHVlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlci5vcHRpb24oJ3ZhbHVlJywgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZVZhbHVlQ2hhbmdlZChvblZhbHVlQ2hhbmdlZDogKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkKSB7XHJcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkID0gb25WYWx1ZUNoYW5nZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclN3aXRjaCgpIHtcclxuICAgIHRoaXMubWVudVN3aXRjaGVyID0gJCgnPGRpdj4nKS5keFN3aXRjaCh7XHJcbiAgICAgIHN3aXRjaGVkT2ZmVGV4dDogJ1BlcnNvbmFsJyxcclxuICAgICAgc3dpdGNoZWRPblRleHQ6ICdHbG9iYWwnLFxyXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcclxuICAgICAgd2lkdGg6ICcxMDBweCcsXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSB9KSA9PiB7XHJcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5vblN3aXRjaCkge1xyXG4gICAgICAgICAgdGhpcy5vblN3aXRjaCh0aGlzLnZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9uVmFsdWVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICB9KS5keFN3aXRjaCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm1lbnVTd2l0Y2hlci5lbGVtZW50KClbMF0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzd2l0Y2hWaWV3KCkge1xyXG4gICAgdGhpcy5kZXN0cm95KCk7XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRoaXMuc3dpdGNoVmlldygpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudCB9IGZyb20gJy4nO1xyXG5pbXBvcnQgeyBNZW51SXRlbVR5cGUgfSBmcm9tICcuLi9CdXNpbmVzcyc7XHJcbmltcG9ydCB7IGdldFVybEJ5TWVudUl0ZW1EYXRhIH0gZnJvbSAnLi4vSGVscGVycy9JbmRleCc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVNlYXJjaE9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICBnZXRNZW51RGF0YVNvdXJjZTogKCkgPT4gSVNlYXJjaERhdGFTb3VyY2U7XHJcbiAgZ2V0SXNHbG9iYWxNZW51U2hvd246ICgpID0+IGJvb2xlYW47XHJcbiAgb25EaW1lbnNpb25zQ2hhbmdlZD86ICgpID0+IHZvaWQ7XHJcbiAgb25NZW51SXRlbUNsaWNrPzogKGU6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQpID0+IHZvaWQ7XHJcbiAgb25NZW51SXRlbU9wZW5lZD86IChlOiBJT3BlblJlcG9ydEV2ZW50QXJncykgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2VhcmNoRGF0YVNvdXJjZSB7XHJcbiAgZ2xvYWJhbEl0ZW1zOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXTtcclxuICBwZXJzb25hbEl0ZW1zOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXSB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJT3BlblJlcG9ydEV2ZW50QXJncyB7XHJcbiAgbWVudUl0ZW06IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCA9IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCAmIHtcclxuICBpc0dsb2JhbDogYm9vbGVhbjtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlYXJjaCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRNZW51RGF0YVNvdXJjZTogKCkgPT4gSVNlYXJjaERhdGFTb3VyY2U7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRJc0dsb2JhbE1lbnVTaG93bjogKCkgPT4gYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uRGltZW5zaW9uc0NoYW5nZWQ6ICgpID0+IHZvaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk1lbnVJdGVtQ2xpY2s6IChlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25NZW51SXRlbU9wZW5lZDogKGU6IElPcGVuUmVwb3J0RXZlbnRBcmdzKSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIHNlYXJjaERyb3BEb3duOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBzZWFyY2hSZXN1bHRzVHJlZUxpc3Q6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVNlYXJjaE9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZ2V0TWVudURhdGFTb3VyY2UgPSBvcHRpb25zLmdldE1lbnVEYXRhU291cmNlO1xyXG4gICAgdGhpcy5nZXRJc0dsb2JhbE1lbnVTaG93biA9IG9wdGlvbnMuZ2V0SXNHbG9iYWxNZW51U2hvd247XHJcbiAgICB0aGlzLm9uRGltZW5zaW9uc0NoYW5nZWQgPSBvcHRpb25zLm9uRGltZW5zaW9uc0NoYW5nZWQ7XHJcbiAgICB0aGlzLm9uTWVudUl0ZW1PcGVuZWQgPSBvcHRpb25zLm9uTWVudUl0ZW1PcGVuZWQ7XHJcbiAgICB0aGlzLm9uTWVudUl0ZW1DbGljayA9IG9wdGlvbnMub25NZW51SXRlbUNsaWNrO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZpc2libGUoaXNWaXNpYmxlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcHRpb24oJ3Zpc2libGUnLCBpc1Zpc2libGUpO1xyXG4gICAgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkICYmIHRoaXMub25EaW1lbnNpb25zQ2hhbmdlZCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFNlYXJjaFRleHQodGV4dDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcHRpb24oJ3ZhbHVlJywgdGV4dCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVsb2FkTWVudUl0ZW1zKCkge1xyXG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3Q/Lm9wdGlvbignZGF0YVNvdXJjZScsIHRoaXMuZ2V0RGF0YVNvdXJjZUZvclNlYXJjaCh0aGlzLmdldE1lbnVEYXRhU291cmNlKCkpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBjb25zdCBmb3JtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTtcclxuICAgIGZvcm1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Zvcm0taW5saW5lJyk7XHJcblxyXG4gICAgY29uc3QgJGlucHV0ID0gJCgnPGRpdiAvPicpLmR4RHJvcERvd25Cb3goe1xyXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaCcsXHJcbiAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICBzaG93RHJvcERvd25CdXR0b246IGZhbHNlLFxyXG4gICAgICBhcHBseVZhbHVlTW9kZTogJ2luc3RhbnRseScsXHJcbiAgICAgIGFjY2VwdEN1c3RvbVZhbHVlOiB0cnVlLFxyXG4gICAgICBvcGVuT25GaWVsZENsaWNrOiBmYWxzZSxcclxuICAgICAgbW9kZTogJ3NlYXJjaCcsXHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7XHJcbiAgICAgICAgJ3R5cGUnOiAnc2VhcmNoJyxcclxuICAgICAgICAnYXJpYS1sYWJlbCc6ICdTZWFyY2gnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKGUsICRlbCkgPT4ge1xyXG4gICAgICAgICRlbC5hZGRDbGFzcygnaGVhZGVyLXNlYXJjaC1yZXN1bHRzLXRyZWUtbGlzdCcpO1xyXG4gICAgICAgIGNvbnN0ICR0cmVlTGlzdCA9ICQoJzxkaXY+JykuZHhUcmVlTGlzdCh7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiB0aGlzLmdldERhdGFTb3VyY2VGb3JTZWFyY2godGhpcy5nZXRNZW51RGF0YVNvdXJjZSgpKSxcclxuICAgICAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgICAgZm9jdXNlZFJvd0VuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgICAgIGFsbG93QWRkaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgYWxsb3dVcGRhdGluZzogZmFsc2UsXHJcbiAgICAgICAgICAgIGFsbG93RGVsZXRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG5vRGF0YVRleHQ6ICdObyByZXN1bHRzIGZvdW5kJyxcclxuICAgICAgICAgIGRhdGFTdHJ1Y3R1cmU6ICd0cmVlJyxcclxuICAgICAgICAgIGtleUV4cHI6ICdJZCcsXHJcbiAgICAgICAgICBpdGVtc0V4cHI6ICdJdGVtcycsXHJcbiAgICAgICAgICBmaWx0ZXJNb2RlOiAnZnVsbEJyYW5jaCcsXHJcbiAgICAgICAgICBzaG93Q29sdW1uSGVhZGVyczogZmFsc2UsXHJcbiAgICAgICAgICBjb2x1bW5zOiBbe1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdOYW1lJyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnXHJcbiAgICAgICAgICB9XSxcclxuICAgICAgICAgIG9uQ2VsbENsaWNrOiAoeyBkYXRhIH0pID0+IHtcclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvTWVudUl0ZW0oZGF0YSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25LZXlEb3duOiAoYXJncykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBldmVudDogS2V5Ym9hcmRFdmVudCA9IGFyZ3MuZXZlbnQgYXMgYW55O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZm9jdXNlZFJvd0tleSA9IHRoaXMuc2VhcmNoUmVzdWx0c1RyZWVMaXN0Lm9wdGlvbignZm9jdXNlZFJvd0tleScpO1xyXG4gICAgICAgICAgICBpZiAoZm9jdXNlZFJvd0tleSAhPT0gbnVsbCAmJiBmb2N1c2VkUm93S2V5ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnRW50ZXInOlxyXG4gICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3QuZ2V0Tm9kZUJ5S2V5KGZvY3VzZWRSb3dLZXkpLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUb01lbnVJdGVtKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJyAnOlxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdC5leHBhbmRSb3coZm9jdXNlZFJvd0tleSk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoUmVzdWx0c1RyZWVMaXN0LmNvbGxhcHNlUm93KGZvY3VzZWRSb3dLZXkpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxyXG4gICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VhcmNoRHJvcERvd24uZm9jdXMoKSk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdCA9ICR0cmVlTGlzdC5keFRyZWVMaXN0KCdpbnN0YW5jZScpO1xyXG5cclxuICAgICAgICByZXR1cm4gJHRyZWVMaXN0O1xyXG4gICAgICB9LFxyXG4gICAgICBkcm9wRG93bk9wdGlvbnM6IHtcclxuICAgICAgICBwb3NpdGlvbjoge1xyXG4gICAgICAgICAgb2Y6ICcuc2VhcmNoLWRyb3Bkb3duJyxcclxuICAgICAgICAgIG15OiAndG9wJyxcclxuICAgICAgICAgIGF0OiAnYm90dG9tJyxcclxuICAgICAgICAgIG9mZnNldDogeyB4OiAxNDksIHk6IDQgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd2lkdGg6IDUxOCxcclxuICAgICAgICBhbmltYXRpb246IHtcclxuICAgICAgICAgIHNob3c6IHsgZHVyYXRpb246IDAgfSxcclxuICAgICAgICAgIGhpZGU6IHsgZHVyYXRpb246IDAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXHJcbiAgICAgICAgb25TaG93bjogKGUpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2VhcmNoRHJvcERvd24uZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRm9jdXNJbjogKGUpID0+IHtcclxuICAgICAgICBlLmNvbXBvbmVudC5lbGVtZW50KCkuYWRkQ2xhc3MoJ2ZvY3VzZWQnKTtcclxuICAgICAgICB0aGlzLm9uRGltZW5zaW9uc0NoYW5nZWQgJiYgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkKCk7XHJcbiAgICAgICAgdGhpcy5jaGVja1NlYXJjaFJlc3V0UG9wdXBWaXNpYmlsaXR5KGUuY29tcG9uZW50LmVsZW1lbnQoKS5maW5kKCdpbnB1dC5keC10ZXh0ZWRpdG9yLWlucHV0JykudmFsKCkgYXMgc3RyaW5nKTtcclxuICAgICAgfSxcclxuICAgICAgb25Gb2N1c091dDogKGUpID0+IHtcclxuICAgICAgICBpZiAoIWUuY29tcG9uZW50LmVsZW1lbnQoKS5maW5kKCdpbnB1dC5keC10ZXh0ZWRpdG9yLWlucHV0JykudmFsKCkpIHtcclxuICAgICAgICAgIGUuY29tcG9uZW50LmVsZW1lbnQoKS5yZW1vdmVDbGFzcygnZm9jdXNlZCcpO1xyXG4gICAgICAgICAgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkICYmIHRoaXMub25EaW1lbnNpb25zQ2hhbmdlZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25LZXlVcDogKGUpID0+IHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGV2ZW50OiBLZXlib2FyZEV2ZW50ID0gZS5ldmVudCBhcyBhbnk7XHJcblxyXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBlLmNvbXBvbmVudC5lbGVtZW50KCkuZmluZCgnaW5wdXQuZHgtdGV4dGVkaXRvci1pbnB1dCcpLnZhbCgpIGFzIHN0cmluZztcclxuXHJcbiAgICAgICAgICB0aGlzLmNoZWNrU2VhcmNoUmVzdXRQb3B1cFZpc2liaWxpdHkodmFsdWUpO1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3Quc2VhcmNoQnlUZXh0KHZhbHVlKTtcclxuICAgICAgICAgIGNvbnN0IHRyaWdnZXJlZEZvY3VzQnV0dG9ucyA9IFsnVGFiJywgJ0VudGVyJywgJ0Fycm93RG93bicsICdBcnJvd1VwJ107XHJcbiAgICAgICAgICBpZiAodHJpZ2dlcmVkRm9jdXNCdXR0b25zLnNvbWUoKGIpID0+IGIgPT09IGV2ZW50LmtleSkpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3QuZm9jdXModGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3QuZ2V0Q2VsbEVsZW1lbnQoMCwgJ05hbWUnKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uS2V5RG93bjogKGUpID0+IHtcclxuICAgICAgICBjb25zdCBldmVudDogS2V5Ym9hcmRFdmVudCA9IGUuZXZlbnQgYXMgYW55O1xyXG5cclxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xyXG4gICAgICAgICAgdGhpcy5jbG9zZVNlYXJjaERyb3BEb3duKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvblZhbHVlQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICB0aGlzLmNoZWNrU2VhcmNoUmVzdXRQb3B1cFZpc2liaWxpdHkoZS52YWx1ZSk7XHJcbiAgICAgIH0sXHJcbiAgICB9KS5hZGRDbGFzcyhbJ2Zvcm0tY29udHJvbCcsICdtci1zbS0yJywgJ3NlYXJjaC1kcm9wZG93biddKTtcclxuXHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duID0gJGlucHV0LmR4RHJvcERvd25Cb3goJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgZm9ybUVsZW1lbnQuYXBwZW5kQ2hpbGQoJGlucHV0WzBdKTtcclxuICAgIHRoaXMuJGNvbnRhaW5lci5hcHBlbmQoZm9ybUVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0ZVRvTWVudUl0ZW0obWVudUl0ZW06IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsKSB7XHJcbiAgICBjb25zdCB1cmwgPSBnZXRVcmxCeU1lbnVJdGVtRGF0YShtZW51SXRlbSk7XHJcblxyXG4gICAgaWYgKHVybCkge1xyXG4gICAgICB0aGlzLmNsb3NlU2VhcmNoRHJvcERvd24oKTtcclxuXHJcbiAgICAgIGNvbnN0IGFyZ3M6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQgPSB7XHJcbiAgICAgICAgaXRlbTogbWVudUl0ZW0sXHJcbiAgICAgICAgb3JpZ2luYWxFdmVudDogbnVsbCxcclxuICAgICAgICBjYW5jZWw6IGZhbHNlXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLm9uTWVudUl0ZW1DbGljaz8uKGFyZ3MpO1xyXG5cclxuICAgICAgaWYgKGFyZ3MuY2FuY2VsKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLm9uTWVudUl0ZW1PcGVuZWQgJiYgdGhpcy5vbk1lbnVJdGVtT3BlbmVkKHsgbWVudUl0ZW0gfSk7XHJcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbG9zZVNlYXJjaERyb3BEb3duKCkge1xyXG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3Qub3B0aW9uKCdmb2N1c2VkUm93S2V5JywgdW5kZWZpbmVkKTtcclxuICAgIHRoaXMuc2VhcmNoRHJvcERvd24/Lm9wdGlvbigndmFsdWUnLCAnJyk7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5mb2N1cygpO1xyXG4gICAgdGhpcy5zZWFyY2hEcm9wRG93bj8uYmx1cigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja1NlYXJjaFJlc3V0UG9wdXBWaXNpYmlsaXR5KHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcGVuKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREYXRhU291cmNlRm9yU2VhcmNoKGRzOiBJU2VhcmNoRGF0YVNvdXJjZSk6IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10gfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKCFkcykge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGdldFJlZHVjZXIgPSAoaXNHbG9iYWw6IGJvb2xlYW4pID0+IHtcclxuICAgICAgY29uc3QgcmVkdWNlciA9IChyZXM6IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sIGl0ZW06IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCkgPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLkl0ZW1zICYmIGl0ZW0uSXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBpdGVtLkl0ZW1zID0gaXRlbS5JdGVtcy5yZWR1Y2UocmVkdWNlciwgW10pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gaXRlbS5WaXNpYmxlID09PSB1bmRlZmluZWQgfHwgaXRlbS5WaXNpYmxlID09PSBudWxsIHx8IGl0ZW0uVmlzaWJsZSA9PT0gdHJ1ZTtcclxuICAgICAgICBjb25zdCBpc0Rpc2FibGVkID0gaXRlbS5EaXNhYmxlZCA9PT0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKGlzVmlzaWJsZSAmJiAhaXNEaXNhYmxlZCkge1xyXG4gICAgICAgICAgcmVzLnB1c2goeyAuLi5pdGVtLCBpc0dsb2JhbCB9IGFzIElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICByZXR1cm4gcmVkdWNlcjtcclxuICAgIH07XHJcblxyXG4gICAgaWYgKGRzLnBlcnNvbmFsSXRlbXMgJiYgZHMucGVyc29uYWxJdGVtcy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgZ2xvYmFsTWVudVJvb3QgPSB7XHJcbiAgICAgICAgTmFtZTogJ0dsb2JhbCBNZW51JywgSWQ6IC0xLCBpc0dsb2JhbDogdHJ1ZSwgVHlwZTogTWVudUl0ZW1UeXBlLk1lbnVOb2RlLFxyXG4gICAgICAgIEl0ZW1zOiBkcy5nbG9hYmFsSXRlbXMucmVkdWNlKGdldFJlZHVjZXIodHJ1ZSksIFtdKVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3QgcGVyc29uYWxNZW51Um9vdCA9IHtcclxuICAgICAgICBOYW1lOiAnUGVyc29uYWwgTWVudScsIElkOiAtMiwgaXNHbG9iYWw6IGZhbHNlLCBUeXBlOiBNZW51SXRlbVR5cGUuTWVudU5vZGUsXHJcbiAgICAgICAgSXRlbXM6IGRzLnBlcnNvbmFsSXRlbXMucmVkdWNlKGdldFJlZHVjZXIoZmFsc2UpLCBbXSlcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmdldElzR2xvYmFsTWVudVNob3duKCkgPyBbZ2xvYmFsTWVudVJvb3QsIHBlcnNvbmFsTWVudVJvb3RdIDogW3BlcnNvbmFsTWVudVJvb3QsIGdsb2JhbE1lbnVSb290XTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBkcy5nbG9hYmFsSXRlbXMucmVkdWNlKGdldFJlZHVjZXIodHJ1ZSksIFtdKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCB7IERldkV4cHJlc3NFdmVudEFyZ3MgfSBmcm9tICcuL0RldkV4cHJlc3NFdmVudEFyZ3MnO1xyXG5leHBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuL0V2ZW50RW1pdHRlcic7XHJcbmV4cG9ydCB7IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgfSBmcm9tICcuL0dlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UnO1xyXG4iLCAiXHVGRUZGZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudExpc3RlbmVyczogYW55W107XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5ldmVudExpc3RlbmVycyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uKGV2dCwgbGlzdGVuZXIpIHtcclxuICAgIGlmICghdGhpcy5ldmVudExpc3RlbmVyc1tldnRdKSB7XHJcbiAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZ0XSA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZ0XS5wdXNoKGxpc3RlbmVyKTtcclxuXHJcbiAgICByZXR1cm4gbGlzdGVuZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25jZShldnQsIGxpc3RlbmVyKSB7XHJcbiAgICB0aGlzLm9uKGV2dCwgKGUpID0+IHtcclxuICAgICAgbGlzdGVuZXIoZSk7XHJcbiAgICAgIHRoaXMub2ZmKGV2dCwgbGlzdGVuZXIpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdChldnQsIGUgPSBudWxsKSB7XHJcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2dF07XHJcblxyXG4gICAgaWYgKGxpc3RlbmVycykge1xyXG4gICAgICBmb3IgKGNvbnN0IGN1cnJlbnRMaXN0ZW5lciBvZiBsaXN0ZW5lcnMpIHtcclxuICAgICAgICBpZiAoY3VycmVudExpc3RlbmVyKSB7XHJcbiAgICAgICAgICBjdXJyZW50TGlzdGVuZXIuY2FsbCh0aGlzLCBlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvZmYoZXZ0LCBsaXN0ZW5lcikge1xyXG4gICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5ldmVudExpc3RlbmVyc1tldnRdO1xyXG5cclxuICAgIGlmIChsaXN0ZW5lcnMpIHtcclxuICAgICAgY29uc3QgZmlsdGVyZWQgPSBbXTtcclxuXHJcbiAgICAgIGZvciAoY29uc3QgY3VycmVudExpc3RlbmVyIG9mIGxpc3RlbmVycykge1xyXG4gICAgICAgIGlmIChjdXJyZW50TGlzdGVuZXIgIT09IGxpc3RlbmVyKSB7XHJcbiAgICAgICAgICBmaWx0ZXJlZC5wdXNoKGN1cnJlbnRMaXN0ZW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2dF0gPSBmaWx0ZXJlZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhZGRIYW5kbGVyKGV2ZW50OiBzdHJpbmcsIG9yaWdpbkhhbmRsZXIsIGdldEFyZ3VtZW50cykge1xyXG4gICAgY29uc3QgaW50ZXJuYWxIYW5kbGVyID0gKCkgPT4ge1xyXG4gICAgICBvcmlnaW5IYW5kbGVyKFxyXG4gICAgICAgIGdldEFyZ3VtZW50cygpLFxyXG4gICAgICAgICgpID0+IHRoaXMub2ZmKGV2ZW50LCBpbnRlcm5hbEhhbmRsZXIpXHJcbiAgICAgICk7XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMub24oZXZlbnQsIGludGVybmFsSGFuZGxlcik7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTG9nb1NldHRpbmdzIH0gZnJvbSAnLi4vRGF0YSc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHsgdGhyb3dSZW5kZXJFcnJvciwgTXV0YWJsZSB9IGZyb20gJy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcbmltcG9ydCB7IElMYXlvdXRCcmVha3BvaW50LCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cywgZ2V0VXJsQnlNZW51SXRlbURhdGEgfSBmcm9tICcuLi9IZWxwZXJzL0luZGV4JztcclxuaW1wb3J0IHsgVXNlck1lbnUsIFVzZXJNZW51SXRlbUNsaWNrRXZlbnQgfSBmcm9tICcuL1VzZXJNZW51JztcclxuaW1wb3J0IHsgTmF2aWdhdGlvbk1lbnUsIE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQgfSBmcm9tICcuL05hdmlnYXRpb25NZW51JztcclxuaW1wb3J0IHsgTG9nbyB9IGZyb20gJy4vTG9nbyc7XHJcbmltcG9ydCB7IE1lbnVTd2l0Y2hlciB9IGZyb20gJy4vTWVudVN3aXRjaGVyJztcclxuaW1wb3J0IHsgSVVzZXJNZW51SXRlbU1vZGVsIH0gZnJvbSAnLi9JVXNlck1lbnVJdGVtJztcclxuaW1wb3J0IHsgSU1lbnVTZXR0aW5ncyB9IGZyb20gJy4vSU1lbnVTZXR0aW5ncyc7XHJcbmltcG9ydCB7IElBcHBNZW51TW9kZWwgfSBmcm9tICcuL0lBcHBNZW51TW9kZWwnO1xyXG5pbXBvcnQgeyBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfSBmcm9tICcuL0lOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCc7XHJcbmltcG9ydCBTZWFyY2gsIHsgSU9wZW5SZXBvcnRFdmVudEFyZ3MsIElTZWFyY2hEYXRhU291cmNlIH0gZnJvbSAnLi9TZWFyY2gnO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9VdGlscy9JbmRleCc7XHJcblxyXG5jb25zdCBIRUFERVJfREFUQV9DQUNIRV9GSUVMRCA9ICdpc3pvbGVhLXVpfGhlYWRlci1kYXRhLWNhY2hlJztcclxuY29uc3QgU0hPV19HTE9CQUxfTUVOVV9LRVkgPSAnaXN6b2xlYS11aXxzaG93LWdsb2JhbC1tZW51JztcclxuXHJcbmNvbnN0IGdldERhdGFTb3VyY2VDYWNoZUZpZWxkID0gKHVzZXJOYW1lPzogc3RyaW5nKSA9PiB7XHJcbiAgcmV0dXJuIGAke0hFQURFUl9EQVRBX0NBQ0hFX0ZJRUxEfSR7dXNlck5hbWUgPyBgfCR7dXNlck5hbWV9YCA6ICcnfWA7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBIZWFkZXJUaGVtZXMgPSAnaXN6b2xlYSc7XHJcbmV4cG9ydCBpbnRlcmZhY2UgSUhlYWRlck9wdGlvbnMge1xyXG4gICRlbDogSlF1ZXJ5O1xyXG4gIG1lbnVTZXR0aW5ncz86IElNZW51U2V0dGluZ3M7XHJcbiAgbG9nb1NldHRpbmdzPzogSUxvZ29TZXR0aW5ncyB8IHN0cmluZztcclxuICBkaXNwbGF5U2VhcmNoPzogYm9vbGVhbjtcclxuICBpbW1lZGlhdGVSZW5kZXI/OiBib29sZWFuO1xyXG4gIHRoZW1lPzogSGVhZGVyVGhlbWVzO1xyXG4gIG9uSW5pdD86ICgpID0+IHZvaWQ7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJSGVhZGVyRWxlbWVudHMge1xyXG4gIHJlYWRvbmx5IHJvb3Q/OiBIVE1MRWxlbWVudDtcclxuICByZWFkb25seSBsb2dvQ29udGFpbmVyPzogSFRNTEVsZW1lbnQ7XHJcbiAgcmVhZG9ubHkgY29udGVudENvbnRhaW5lcj86IEhUTUxFbGVtZW50O1xyXG4gIHJlYWRvbmx5IHRvZ2dsZUJ1dHRvbkNvbnRhaW5lcj86IEhUTUxFbGVtZW50O1xyXG4gIHJlYWRvbmx5IHRvZ2dsZUJ1dHRvbj86IEhUTUxFbGVtZW50O1xyXG4gIHJlYWRvbmx5IG1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXI/OiBIVE1MRWxlbWVudDtcclxuICByZWFkb25seSBtZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXI/OiBIVE1MRWxlbWVudDtcclxufVxyXG5cclxuaW50ZXJmYWNlIElBamF4UGFnZU1hcmtlciB7XHJcbiAgaXNMb2FkZWRCeUFqYXg6IHRydWU7XHJcbiAgdXJsOiBzdHJpbmc7XHJcbiAgaXNNZW51U3dpdGNoZXJHbG9iYWw6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBIZWFkZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTUVOVV9TV0lUQ0hFUl9JTklUSUFMSVpFRF9FVkVOVCA9ICdtZW51LXN3aXRjaGVyLWluaXRpYWxpemVkLWV2ZW50JztcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgR0xPQkFMX1VSTF9SRUdFWCA9IG5ldyBSZWdFeHAoJ14oPzpbYS16XSs6KT8vLycsICdpJyk7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRE9DVFlQRV9NQVJLRVJfUkVHRVggPSBuZXcgUmVnRXhwKCchRE9DVFlQRSBodG1sPicsICdpJyk7XHJcblxyXG4gIHB1YmxpYyB1c2VyTWVudTogVXNlck1lbnUgfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIG5hdmlnYXRpb25NZW51OiBOYXZpZ2F0aW9uTWVudSB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgbWVudVN3aXRjaGVyOiBNZW51U3dpdGNoZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIGxvZ286IExvZ28gfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIGRhdGE6IElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgdGhlbWU6IEhlYWRlclRoZW1lcztcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncyB8IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IG1lbnVTZXR0aW5nczogSU1lbnVTZXR0aW5ncyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRpc3BsYXlTZWFyY2g6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb2xsYXBzZUJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZFBhbmVsOiBEZXZFeHByZXNzLnVpLmR4TG9hZFBhbmVsO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJHBhcnRpYWxWaWV3UGxhY2VIb2xkZXI6IEpRdWVyeSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZVVybEFmdGVyUGFydGlhbExvYWRpbmc6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblBhcnRpYWxWaWV3TG9hZGVkOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBiZWZvcmVQYXJ0aWFsVmlld0xvYWRpbmc6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uTmF2aWFndGlvbk1lbnVJdGVtQ2xpY2tIYW5kbGVyID0gdGhpcy5vbk5hdmlhZ3Rpb25NZW51SXRlbUNsaWNrLmJpbmQodGhpcyk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk5hdmlnYXRpb25NZW51SXRlbU9wZW5lZEhhbmRsZXIgPSB0aGlzLm9uTmF2aWdhdGlvbk1lbnVJdGVtT3BlbmVkLmJpbmQodGhpcyk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblVzZXJNZW51SXRlbUNsaWNrSGFuZGxlciA9IHRoaXMub25Vc2VyTWVudUl0ZW1DbGljay5iaW5kKHRoaXMpO1xyXG4gIHByaXZhdGUgc2VhcmNoOiBTZWFyY2ggfCB1bmRlZmluZWQ7XHJcblxyXG4gIC8vIGVsZW1lbnRzXHJcbiAgcHJpdmF0ZSByZWFkb25seSAkZWw6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRzOiBNdXRhYmxlPElIZWFkZXJFbGVtZW50cz4gPSB7fTtcclxuICBwcml2YXRlICRsb2FkQmFyOiBKUXVlcnkgfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElIZWFkZXJPcHRpb25zKSB7XHJcbiAgICBzdXBlcigpO1xyXG5cclxuICAgIHRoaXMuJGVsID0gb3B0aW9ucy4kZWw7XHJcbiAgICB0aGlzLm1lbnVTZXR0aW5ncyA9IG9wdGlvbnMubWVudVNldHRpbmdzO1xyXG4gICAgdGhpcy5sb2dvU2V0dGluZ3MgPSBvcHRpb25zLmxvZ29TZXR0aW5ncztcclxuICAgIHRoaXMudGhlbWUgPSBvcHRpb25zLnRoZW1lIHx8ICdpc3pvbGVhJztcclxuICAgIHRoaXMuZGlzcGxheVNlYXJjaCA9IG9wdGlvbnMuZGlzcGxheVNlYXJjaDtcclxuICAgIHRoaXMuY29sbGFwc2VCcmVha3BvaW50ID0gb3B0aW9ucy5tZW51U2V0dGluZ3M/LmNvbGxhcHNlQnJlYWtwb2ludCB8fCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cy5tZDtcclxuXHJcbiAgICB0aGlzLiRwYXJ0aWFsVmlld1BsYWNlSG9sZGVyID0gb3B0aW9ucy5tZW51U2V0dGluZ3M/LnBhcnRpYWxWaWV3UGxhY2VIb2xkZXI7XHJcbiAgICB0aGlzLnVwZGF0ZVVybEFmdGVyUGFydGlhbExvYWRpbmcgPSBvcHRpb25zLm1lbnVTZXR0aW5ncz8udXBkYXRlVXJsQWZ0ZXJQYXJ0aWFsTG9hZGluZztcclxuICAgIHRoaXMub25QYXJ0aWFsVmlld0xvYWRlZCA9IG9wdGlvbnMubWVudVNldHRpbmdzPy5vblBhcnRpYWxWaWV3TG9hZGVkO1xyXG4gICAgdGhpcy5iZWZvcmVQYXJ0aWFsVmlld0xvYWRpbmcgPSBvcHRpb25zLm1lbnVTZXR0aW5ncz8uYmVmb3JlUGFydGlhbFZpZXdMb2FkaW5nO1xyXG5cclxuICAgIHRoaXMubG9hZFBhbmVsID0gdGhpcy5jcmVhdGVMb2FkUGFuZWwoKTtcclxuXHJcbiAgICBpZiAob3B0aW9ucy5pbW1lZGlhdGVSZW5kZXIgPT09IGZhbHNlKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLndhcm4oJ1RoZSBcXCdpbW1lZGlhdGVSZW5kZXIgPT09IGZhbHNlXFwnIG9wdGlvbiBpc25cXCd0IHN1cHBvcnRlZCBhdCB0aGUgbW9tZW50LicpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vTk9URTogVG8gb3ZlcnJpZGUgYm9vdHN0cmFwIGhlYWRlciB6LWluZGV4IHdoaWNoIGlzIDE2MDBcclxuICAgIERldkV4cHJlc3MudWkuZHhPdmVybGF5LmJhc2VaSW5kZXgoMTcwMCk7XHJcblxyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICAgIHRoaXMuaW5pdCgpXHJcbiAgICAgIC50aGVuKCgpID0+IG9wdGlvbnM/Lm9uSW5pdD8uKCkpO1xyXG5cclxuICAgIHRoaXMuc3Vic2NyaWJlT25IaXN0b3J5UG9wU3RhdGUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVEYXRhKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLm1lbnVTZXR0aW5ncykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jbGVhckFwcE1lbnVNb2RlbENhY2hlKCk7XHJcbiAgICB0aGlzLmRhdGEgPSBhd2FpdCB0aGlzLmxvYWREYXRhKCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLnJvb3QpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVyZW5kZXJNZW51cygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIC8qKlxyXG4gICAgICogPFJvb3Q+XHJcbiAgICAgKiAgPEJyYW5kPlxyXG4gICAgICogICAgPExvZ28gLz5cclxuICAgICAqICA8L0JyYW5kPlxyXG4gICAgICogIDxDb250ZW50VG9nZ2xlciAvPlxyXG4gICAgICogIDxDb250ZW50PlxyXG4gICAgICogICAgPFNlYXJjaCAvPlxyXG4gICAgICogICAgPE5hdmlnYXRpb25NZW51IC8+XHJcbiAgICAgKiAgICA8VXNlck1lbnUgLz5cclxuICAgICAqICA8L0NvbnRlbnQ+XHJcbiAgICAgKiAgPE1lbnVTd2l0Y2hlciAvPlxyXG4gICAgICogPC9Sb290PlxyXG4gICAgICogPExvYWRCYXIgLz5cclxuICAgICAqL1xyXG5cclxuICAgIHRoaXMucmVuZGVyUm9vdCgpO1xyXG4gICAgdGhpcy5yZW5kZXJCcmFuZCgpO1xyXG4gICAgdGhpcy5yZW5kZXJDb250ZW50VG9nZ2xlcigpO1xyXG4gICAgdGhpcy5yZW5kZXJDb250ZW50KCk7XHJcbiAgICB0aGlzLnJlbmRlckxvYWRCYXIoKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZUNvbnRlbnRBbmRUb2dnbGVyVmlzaWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdWJzY3JpYmVPbkhpc3RvcnlQb3BTdGF0ZSgpIHtcclxuICAgIGlmICh0aGlzLiRwYXJ0aWFsVmlld1BsYWNlSG9sZGVyKSB7XHJcbiAgICAgICQod2luZG93KS5iaW5kKCdwb3BzdGF0ZScsIChlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZXZlbnQgPSBlLm9yaWdpbmFsRXZlbnQgYXMgUG9wU3RhdGVFdmVudDtcclxuICAgICAgICBjb25zdCBzdGF0ZSA9IGV2ZW50LnN0YXRlIGFzIElBamF4UGFnZU1hcmtlcjtcclxuICAgICAgICBpZiAoc3RhdGUgJiYgc3RhdGUuaXNMb2FkZWRCeUFqYXgpIHtcclxuICAgICAgICAgIHRoaXMubG9hZFBhZ2VWaWFBamF4Q29yZShzdGF0ZS51cmwpO1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVNZW51U3dpdGNoZXJTdGF0ZShzdGF0ZS5pc01lbnVTd2l0Y2hlckdsb2JhbCk7XHJcbiAgICAgICAgICB0aGlzLm5hdmlnYXRpb25NZW51LnVwZGF0ZUFjdGl2ZUl0ZW1zU3RhdGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTG9hZFBhbmVsKCk6IERldkV4cHJlc3MudWkuZHhMb2FkUGFuZWwge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKS5keExvYWRQYW5lbCh7XHJcbiAgICAgIHNoYWRpbmdDb2xvcjogJ3JnYmEoMCwwLDAsMC40KScsXHJcbiAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICBzaG93SW5kaWNhdG9yOiB0cnVlLFxyXG4gICAgICBzaG93UGFuZTogdHJ1ZSxcclxuICAgICAgc2hhZGluZzogdHJ1ZSxcclxuICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXHJcbiAgICB9KS5hcHBlbmRUbyh0aGlzLiRlbCkuZHhMb2FkUGFuZWwoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclJvb3QoKSB7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnJvb3QgPSB0aGlzLiRlbFswXTtcclxuICAgIHRoaXMuZWxlbWVudHMucm9vdC5jbGFzc0xpc3QuYWRkKCdoZWFkZXInLCB0aGlzLnRoZW1lLCAnbmF2YmFyJywgJ25hdmJhci1kYXJrJywgYG5hdmJhci1leHBhbmQtJHt0aGlzLmNvbGxhcHNlQnJlYWtwb2ludC5uYW1lfWApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJCcmFuZCgpIHtcclxuICAgIGlmICh0aGlzLmxvZ28gfHwgIXRoaXMubG9nb1NldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGJyYW5kRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGJyYW5kRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoZWFkZXJfX2JyYW5kJywgJ25hdmJhci1icmFuZCcpO1xyXG4gICAgYnJhbmRFbGVtZW50LmhyZWYgPSAnLyc7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnJvb3QuYXBwZW5kQ2hpbGQoYnJhbmRFbGVtZW50KTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLmxvZ29Db250YWluZXIgPSBicmFuZEVsZW1lbnQ7XHJcblxyXG4gICAgdGhpcy5sb2dvID0gbmV3IExvZ28oJCh0aGlzLmVsZW1lbnRzLmxvZ29Db250YWluZXIpLCB0aGlzLmxvZ29TZXR0aW5ncyk7XHJcbiAgICB0aGlzLmxvZ28uaW5pdFdpZGdldCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJTZWFyY2goKSB7XHJcbiAgICBpZiAoIXRoaXMuZGlzcGxheVNlYXJjaCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ2NvbnRlbnRDb250YWluZXInKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlYXJjaCA9IG5ldyBTZWFyY2goe1xyXG4gICAgICAkY29udGFpbmVyOiAkKHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lciksXHJcbiAgICAgIGdldE1lbnVEYXRhU291cmNlOiAoKSA9PiB0aGlzLmdldFNlYXJjaERhdGFTb3VyY2UodGhpcy5kYXRhKSxcclxuICAgICAgZ2V0SXNHbG9iYWxNZW51U2hvd246ICgpID0+IHRoaXMuZ2V0SXNHbG9iYWxNZW51U2hvd24oKSxcclxuICAgICAgb25EaW1lbnNpb25zQ2hhbmdlZDogKCkgPT4gdGhpcy5uYXZpZ2F0aW9uTWVudT8uYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpLFxyXG4gICAgICBvbk1lbnVJdGVtQ2xpY2s6IHRoaXMub25OYXZpYWd0aW9uTWVudUl0ZW1DbGlja0hhbmRsZXIsXHJcbiAgICAgIG9uTWVudUl0ZW1PcGVuZWQ6IHRoaXMub25OYXZpZ2F0aW9uTWVudUl0ZW1PcGVuZWRIYW5kbGVyLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnNlYXJjaC5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0SXNHbG9iYWxNZW51U2hvd24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc1Nob3dHbG9iYWxNZW51KCkgfHwgIXRoaXMuZGF0YT8uQWRkR2xvYmFsUGVyc29uYWxTd2l0Y2hlcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25OYXZpZ2F0aW9uTWVudUl0ZW1PcGVuZWQoZTogSU9wZW5SZXBvcnRFdmVudEFyZ3MpIHtcclxuICAgIHRoaXMudXBkYXRlTWVudVN3aXRjaGVyU3RhdGUoZS5tZW51SXRlbS5pc0dsb2JhbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZU1lbnVTd2l0Y2hlclN0YXRlKGlzR2xvYmFsOiBib29sZWFuKSB7XHJcbiAgICBpZiAoIXRoaXMubWVudVN3aXRjaGVyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5tZW51U3dpdGNoZXIudmFsdWUgIT09IGlzR2xvYmFsKSB7XHJcbiAgICAgIHRoaXMubWVudVN3aXRjaGVyLnNldFZhbHVlKGlzR2xvYmFsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQ29udGVudFRvZ2dsZXIoKSB7XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCduYXZiYXItdG9nZ2xlcicpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uc2V0QXR0cmlidXRlKCd0eXBlJywgJ2J1dHRvbicpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLXRvZ2dsZScsICdjb2xsYXBzZScpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLXRhcmdldCcsICcuaGVhZGVyX19jb250ZW50Jyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5vbmNsaWNrID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLnNlYXJjaD8uc2V0U2VhcmNoVGV4dCgnJyk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICBpY29uLmNsYXNzTGlzdC5hZGQoJ25hdmJhci10b2dnbGVyLWljb24nKTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbkNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b25Db250YWluZXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyX190b2dnbGUtYnV0dG9uLWNvbnRhaW5lcicpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uLmFwcGVuZENoaWxkKGljb24pO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b25Db250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24pO1xyXG4gICAgdGhpcy5lbGVtZW50cy5yb290LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uQ29udGFpbmVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQ29udGVudCgpIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5yb290KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnY29sbGFwc2UnLCAnbmF2YmFyLWNvbGxhcHNlJywgJ2hlYWRlcl9fY29udGVudCcpO1xyXG4gICAgdGhpcy5lbGVtZW50cy5yb290LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJTZWFyY2goKTtcclxuICAgIHRoaXMucmVuZGVyTmF2aWdhdGlvbk1lbnUoW10pO1xyXG4gICAgdGhpcy5yZW5kZXJNZW51U3dpdGNoZXIoKTtcclxuICAgIHRoaXMucmVuZGVyVXNlck1lbnUoW10pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJOYXZpZ2F0aW9uTWVudShtZW51SXRlbU1vZGVsczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10pIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdjb250ZW50Q29udGFpbmVyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXNHbG9iYWxNZW51ID0gdGhpcy5nZXRJc0dsb2JhbE1lbnVTaG93bigpO1xyXG5cclxuICAgIGlmICh0aGlzLm5hdmlnYXRpb25NZW51KSB7XHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbk1lbnUudXBkYXRlRGF0YShtZW51SXRlbU1vZGVscywgaXNHbG9iYWxNZW51KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbk1lbnUgPSBuZXcgTmF2aWdhdGlvbk1lbnUoXHJcbiAgICAgICAgdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyLFxyXG4gICAgICAgIG1lbnVJdGVtTW9kZWxzLFxyXG4gICAgICAgIGlzR2xvYmFsTWVudSxcclxuICAgICAgICB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCxcclxuICAgICAgICB0aGlzLm9uTmF2aWFndGlvbk1lbnVJdGVtQ2xpY2tIYW5kbGVyLFxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLm5hdmlnYXRpb25NZW51LnJlbmRlcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblVzZXJNZW51SXRlbUNsaWNrKGU6IFVzZXJNZW51SXRlbUNsaWNrRXZlbnQpIHtcclxuICAgIHRoaXMubWVudVNldHRpbmdzLm9uVXNlck1lbnVDbGljaz8uKGUpO1xyXG4gICAgaWYgKGUuY2FuY2VsIHx8IHRoaXMuaXNLZXlQcmVzc2VkKGUub3JpZ2luYWxFdmVudCBhcyBNb3VzZUV2ZW50KSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdXJsID0gZS5pdGVtLlVybDtcclxuXHJcbiAgICBpZiAoZS5pdGVtLkFsd2F5c1JlbG9hZFBhZ2UpIHtcclxuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBlLmNhbmNlbCA9IHRoaXMudHJ5RG9QYXJ0aWFsUGFnZUxvYWRpbmcodXJsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25OYXZpYWd0aW9uTWVudUl0ZW1DbGljayhlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0aGlzLm1lbnVTZXR0aW5ncy5vbk5hdmlnYXRpb25NZW51SXRlbUNsaWNrPy4oZSk7XHJcbiAgICBpZiAoZS5jYW5jZWwgfHwgdGhpcy5pc0tleVByZXNzZWQoZS5vcmlnaW5hbEV2ZW50IGFzIE1vdXNlRXZlbnQpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnVwZGF0ZU1lbnVTd2l0Y2hlclN0YXRlKGUuaXRlbS5pc0dsb2JhbCk7XHJcblxyXG4gICAgY29uc3QgdXJsID0gZ2V0VXJsQnlNZW51SXRlbURhdGEoZS5pdGVtKTtcclxuICAgIGUuY2FuY2VsID0gdGhpcy50cnlEb1BhcnRpYWxQYWdlTG9hZGluZyh1cmwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0tleVByZXNzZWQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIHJldHVybiBldmVudCAmJiAoZXZlbnQuYWx0S2V5IHx8IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQuc2hpZnRLZXkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cnlEb1BhcnRpYWxQYWdlTG9hZGluZyh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuJHBhcnRpYWxWaWV3UGxhY2VIb2xkZXIgJiYgdXJsICYmIHRoaXMuY2hlY2tJc0xvY2FsVXJsKHVybCkpIHtcclxuICAgICAgaWYgKHRoaXMudXBkYXRlVXJsQWZ0ZXJQYXJ0aWFsTG9hZGluZykge1xyXG4gICAgICAgIGNvbnN0IHN0YXRlOiBJQWpheFBhZ2VNYXJrZXIgPSB7XHJcbiAgICAgICAgICBpc0xvYWRlZEJ5QWpheDogdHJ1ZSxcclxuICAgICAgICAgIGlzTWVudVN3aXRjaGVyR2xvYmFsOiAhIXRoaXMubWVudVN3aXRjaGVyPy52YWx1ZSxcclxuICAgICAgICAgIHVybFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShzdGF0ZSwgbnVsbCwgdXJsKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5sb2FkUGFnZVZpYUFqYXhDb3JlKHVybCk7XHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbk1lbnUudXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpO1xyXG5cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja0lzTG9jYWxVcmwodXJsOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiAhSGVhZGVyLkdMT0JBTF9VUkxfUkVHRVgudGVzdCh1cmwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja0lzUGFydGlhbFBhZ2VDb250ZW50KGNvbnRlbnQ6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGNvbnRlbnQgJiYgIUhlYWRlci5ET0NUWVBFX01BUktFUl9SRUdFWC50ZXN0KGNvbnRlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkUGFnZVZpYUFqYXhDb3JlKHVybDogc3RyaW5nKSB7XHJcbiAgICB3aW5kb3cuaXNJc296U2VydmVyRXhjZXB0aW9uID0gZmFsc2U7XHJcblxyXG4gICAgdGhpcy5sb2FkUGFuZWwuc2hvdygpO1xyXG5cclxuICAgIGNvbnN0IHVybEZvclBhcnRpYWxMb2FkaW5nID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgdXJsKTtcclxuICAgIHVybEZvclBhcnRpYWxMb2FkaW5nLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2lzb3pQYXJ0aWFsTG9hZGluZycsICd0cnVlJyk7XHJcbiAgICBjb25zdCBwYXJ0aWFsVXJsID0gdXJsRm9yUGFydGlhbExvYWRpbmcudG9TdHJpbmcoKTtcclxuXHJcbiAgICB0aGlzLmJlZm9yZVBhcnRpYWxWaWV3TG9hZGluZz8uKCk7XHJcblxyXG4gICAgJC5hamF4KHBhcnRpYWxVcmwsIHsgZGF0YVR5cGU6ICdodG1sJyB9KS5hbHdheXMoKGRhdGEsIHRleHRTdGF0dXMpID0+IHtcclxuICAgICAgaWYgKHRleHRTdGF0dXMgIT09ICdzdWNjZXNzJyB8fCAhdGhpcy5jaGVja0lzUGFydGlhbFBhZ2VDb250ZW50KGRhdGEpKSB7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy4kcGFydGlhbFZpZXdQbGFjZUhvbGRlci5odG1sKGRhdGEpO1xyXG4gICAgICAgIHRoaXMub25QYXJ0aWFsVmlld0xvYWRlZD8uKCk7XHJcbiAgICAgICAgdGhpcy5sb2FkUGFuZWwuaGlkZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyVXNlck1lbnUoaXRlbXM6IElVc2VyTWVudUl0ZW1Nb2RlbFtdKSB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzPy51c2VyTmFtZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ2NvbnRlbnRDb250YWluZXInKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMudXNlck1lbnUpIHtcclxuICAgICAgY29uc3QgZGl2aWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICBkaXZpZGVyLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLWRpdmlkZXInKTtcclxuICAgICAgdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKGRpdmlkZXIpO1xyXG5cclxuICAgICAgdGhpcy51c2VyTWVudSA9IG5ldyBVc2VyTWVudSh7XHJcbiAgICAgICAgY29udGFpbmVyOiB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIsXHJcbiAgICAgICAgdXNlck5hbWU6IHRoaXMubWVudVNldHRpbmdzLnVzZXJOYW1lLFxyXG4gICAgICAgIHVzZXJBdmF0YXI6IHRoaXMubWVudVNldHRpbmdzLnVzZXJBdmF0YXIsXHJcbiAgICAgICAgaXRlbXMsXHJcbiAgICAgICAgY29sbGFwc2VCcmVha3BvaW50OiB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCxcclxuICAgICAgICBvbkl0ZW1DbGljazogdGhpcy5vblVzZXJNZW51SXRlbUNsaWNrSGFuZGxlcixcclxuICAgICAgICBnZXREaXNwbGF5ZWRVc2VySW5mbzogdGhpcy5tZW51U2V0dGluZ3MuZ2V0RGlzcGxheWVkVXNlckluZm9cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudXNlck1lbnUucmVuZGVyKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnVzZXJNZW51LnVwZGF0ZUl0ZW1zKGl0ZW1zKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyTWVudVN3aXRjaGVyKCkge1xyXG4gICAgaWYgKCF0aGlzLmRhdGE/LkFkZEdsb2JhbFBlcnNvbmFsU3dpdGNoZXIpIHtcclxuICAgICAgaWYgKHRoaXMubWVudVN3aXRjaGVyKSB7XHJcbiAgICAgICAgdGhpcy5tZW51U3dpdGNoZXIuZGVzdHJveSgpO1xyXG4gICAgICAgIHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyRGVza3RvcENvbnRhaW5lcj8ucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXI/LnJlbW92ZSgpO1xyXG5cclxuICAgICAgICB0aGlzLm1lbnVTd2l0Y2hlciA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5tZW51U3dpdGNoZXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdjb250ZW50Q29udGFpbmVyJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uQ29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCd0b2dnbGVCdXR0b25Db250YWluZXInKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyRGVza3RvcENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtZW51LXN3aXRjaGVyJyk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyTW9iaWxlQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21lbnUtc3dpdGNoZXInKTtcclxuXHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlciA9IG5ldyBNZW51U3dpdGNoZXIoe1xyXG4gICAgICBkZXNrdG9wQ29udGFpbmVyOiB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXIsXHJcbiAgICAgIG1vYmlsZUNvbnRhaW5lcjogdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXIsXHJcbiAgICAgIGNvbGxhcHNlQnJlYWtwb2ludDogdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQsXHJcbiAgICAgIHN0YXJ0VmFsdWU6IHRoaXMuaXNTaG93R2xvYmFsTWVudSgpLFxyXG4gICAgICBvblN3aXRjaDogKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFNIT1dfR0xPQkFMX01FTlVfS0VZLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xyXG5cclxuICAgICAgICBjb25zdCBuYXZpZ2F0aW9uSXRlbXMgPSB0aGlzLmdldE5hdmlnYXRpb25JdGVtcyh0aGlzLmRhdGEpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoPy5zZXRTZWFyY2hUZXh0KCcnKTtcclxuICAgICAgICB0aGlzLnNlYXJjaD8ucmVsb2FkTWVudUl0ZW1zKCk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJOYXZpZ2F0aW9uTWVudShuYXZpZ2F0aW9uSXRlbXMgfHwgW10pO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ29udGVudEFuZFRvZ2dsZXJWaXNpYmxlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5tZW51U3dpdGNoZXIucmVuZGVyKCk7XHJcbiAgICB0aGlzLmVtaXQoSGVhZGVyLk1FTlVfU1dJVENIRVJfSU5JVElBTElaRURfRVZFTlQpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJEZXNrdG9wQ29udGFpbmVyLCB0aGlzLnVzZXJNZW51Py5yb290KTtcclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uQ29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlck1vYmlsZUNvbnRhaW5lciwgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJMb2FkQmFyKCkge1xyXG4gICAgdGhpcy4kbG9hZEJhciA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnbG9hZC1iYXInKS5oaWRlKCkuYXBwZW5kVG8odGhpcy4kZWwpO1xyXG5cclxuICAgIGNvbnN0ICRsb2FkID0gJCgnPGRpdiAvPicpLmFkZENsYXNzKCdsb2FkJykuYXBwZW5kVG8odGhpcy4kbG9hZEJhcik7XHJcbiAgICAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2JhcicpLmFwcGVuZFRvKCRsb2FkKTtcclxuXHJcbiAgICBmdW5jdGlvbiByb3RhdGUoc2VsZWN0b3I6IHN0cmluZykge1xyXG4gICAgICAkKHNlbGVjdG9yKS5hbmltYXRlKHsgbGVmdDogJCgnLmxvYWQnKS53aWR0aCgpIH0sIDIwMDAsICgpID0+IHtcclxuICAgICAgICAkKHNlbGVjdG9yKS5jc3MoJ2xlZnQnLCBgJHstJChzZWxlY3Rvcikud2lkdGgoKSF9cHhgKTtcclxuICAgICAgICByb3RhdGUoc2VsZWN0b3IpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByb3RhdGUoJy5iYXInKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVyZW5kZXJNZW51cygpIHtcclxuICAgIGNvbnN0IG5hdmlnYXRpb25JdGVtcyA9IHRoaXMuZ2V0TmF2aWdhdGlvbkl0ZW1zKHRoaXMuZGF0YSk7XHJcbiAgICBjb25zdCB1c2VySXRlbXMgPSB0aGlzLmdldFVzZXJJdGVtcyh0aGlzLmRhdGEpO1xyXG4gICAgLy8gSWYgaXRlbXMgYXJlIHVuZGVmaW5lZCB3ZSBkb24ndCB1cGRhdGUgbWVudXNcclxuICAgIG5hdmlnYXRpb25JdGVtcyAmJiB0aGlzLnJlbmRlck5hdmlnYXRpb25NZW51KG5hdmlnYXRpb25JdGVtcyk7XHJcbiAgICB1c2VySXRlbXMgJiYgdGhpcy5yZW5kZXJVc2VyTWVudSh1c2VySXRlbXMpO1xyXG4gICAgdGhpcy5yZW5kZXJNZW51U3dpdGNoZXIoKTtcclxuICAgIHRoaXMudXBkYXRlQ29udGVudEFuZFRvZ2dsZXJWaXNpYmxlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUNvbnRlbnRBbmRUb2dnbGVyVmlzaWJsZSgpIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyICYmICF0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmF2aWdhdGlvbkl0ZW1zID0gdGhpcy5nZXROYXZpZ2F0aW9uSXRlbXModGhpcy5kYXRhKTtcclxuICAgIGNvbnN0IHVzZXJJdGVtcyA9IHRoaXMuZ2V0VXNlckl0ZW1zKHRoaXMuZGF0YSk7XHJcbiAgICBjb25zdCBpc1Zpc2libGUgPSAobmF2aWdhdGlvbkl0ZW1zICYmIG5hdmlnYXRpb25JdGVtcy5sZW5ndGggPiAwKVxyXG4gICAgICB8fCB0aGlzLm1lbnVTZXR0aW5ncz8udXNlck5hbWVcclxuICAgICAgfHwgKHVzZXJJdGVtcyAmJiB1c2VySXRlbXMubGVuZ3RoID4gMCk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJywgIWlzVmlzaWJsZSk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJywgIWlzVmlzaWJsZSk7XHJcblxyXG4gICAgdGhpcy5zZWFyY2g/LnNldFZpc2libGUoISFpc1Zpc2libGUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLm1lbnVTZXR0aW5ncykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kYXRhID0gYXdhaXQgdGhpcy5sb2FkRGF0YSgpO1xyXG5cclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5yb290KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlcmVuZGVyTWVudXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbG9hZERhdGEoKTogUHJvbWlzZTxJQXBwTWVudU1vZGVsIHwgdW5kZWZpbmVkPiB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGhlYWRlciBkb2VzblxcJ3QgaGF2ZSBtZW51IHNldHRpbmdzJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLm1lbnVTZXR0aW5ncy5kYXRhICE9PSAnc3RyaW5nJykge1xyXG4gICAgICByZXR1cm4gdGhpcy5tZW51U2V0dGluZ3MuZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZGF0YSA9IHRoaXMuZ2V0Q2FjaGVkQXBwTWVudU1vZGVsKCk7XHJcbiAgICBpZiAoZGF0YSkge1xyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLnNlYXJjaD8uc2V0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgIHRoaXMuJGxvYWRCYXI/LnNob3coKTtcclxuICAgICAgZGF0YSA9IGF3YWl0IHNlbmRSZXF1ZXN0PElBcHBNZW51TW9kZWw+KHRoaXMubWVudVNldHRpbmdzLmRhdGEpO1xyXG4gICAgICB0aGlzLmNhY2hlQXBwTWVudU1vZGVsKGRhdGEpO1xyXG4gICAgICB0aGlzLnNlYXJjaD8ucmVsb2FkTWVudUl0ZW1zKCk7XHJcblxyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoPy5zZXRWaXNpYmxlKHRydWUpO1xyXG4gICAgICB0aGlzLiRsb2FkQmFyPy5oaWRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE5hdmlnYXRpb25JdGVtcyhhcHBNZW51TW9kZWw6IElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICghYXBwTWVudU1vZGVsKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2hvd0dsb2JhbE1lbnUgPSB0aGlzLmlzU2hvd0dsb2JhbE1lbnUoKTtcclxuXHJcbiAgICByZXR1cm4gc2hvd0dsb2JhbE1lbnUgfHwgIWFwcE1lbnVNb2RlbC5BZGRHbG9iYWxQZXJzb25hbFN3aXRjaGVyXHJcbiAgICAgID8gYXBwTWVudU1vZGVsLk5hdmlnYXRpb25JdGVtc1xyXG4gICAgICA6IGFwcE1lbnVNb2RlbC5QZXJzb25hbE5hdmlnYXRpb25JdGVtcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2VhcmNoRGF0YVNvdXJjZShhcHBNZW51TW9kZWw6IElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQpOiBJU2VhcmNoRGF0YVNvdXJjZSB7XHJcbiAgICBpZiAoIWFwcE1lbnVNb2RlbCkge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGdsb2FiYWxJdGVtczogYXBwTWVudU1vZGVsLk5hdmlnYXRpb25JdGVtcyxcclxuICAgICAgcGVyc29uYWxJdGVtczogYXBwTWVudU1vZGVsLkFkZEdsb2JhbFBlcnNvbmFsU3dpdGNoZXIgPyBhcHBNZW51TW9kZWwuUGVyc29uYWxOYXZpZ2F0aW9uSXRlbXMgOiB1bmRlZmluZWRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFVzZXJJdGVtcyhhcHBNZW51TW9kZWw6IElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICghYXBwTWVudU1vZGVsKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFwcE1lbnVNb2RlbC5Vc2VySXRlbXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENhY2hlZEFwcE1lbnVNb2RlbCgpOiBJQXBwTWVudU1vZGVsIHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJhd1ZhbHVlID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oZ2V0RGF0YVNvdXJjZUNhY2hlRmllbGQodGhpcy5tZW51U2V0dGluZ3MudXNlck5hbWUpKTtcclxuXHJcbiAgICByZXR1cm4gcmF3VmFsdWUgPT09IG51bGwgPyByYXdWYWx1ZSA6IEpTT04ucGFyc2UocmF3VmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYWNoZUFwcE1lbnVNb2RlbChkYXRhOiBJQXBwTWVudU1vZGVsKSB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShnZXREYXRhU291cmNlQ2FjaGVGaWVsZCh0aGlzLm1lbnVTZXR0aW5ncy51c2VyTmFtZSksIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJBcHBNZW51TW9kZWxDYWNoZSgpIHtcclxuICAgIGlmICghdGhpcy5tZW51U2V0dGluZ3MpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKGdldERhdGFTb3VyY2VDYWNoZUZpZWxkKHRoaXMubWVudVNldHRpbmdzLnVzZXJOYW1lKSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzU2hvd0dsb2JhbE1lbnUoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCByYXdJc0dsb2JhbCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShTSE9XX0dMT0JBTF9NRU5VX0tFWSk7XHJcbiAgICBjb25zdCBpc0dsb2JhbCA9IHJhd0lzR2xvYmFsID09PSBudWxsID8gcmF3SXNHbG9iYWwgYXMgbnVsbCA6IEpTT04ucGFyc2UocmF3SXNHbG9iYWwpIGFzIGJvb2xlYW47XHJcblxyXG4gICAgcmV0dXJuIGlzR2xvYmFsID09PSBudWxsIHx8IGlzR2xvYmFsO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGY29uc3QgZ3JpZENvbHVtblR5cGVzID0gWydkZWZhdWx0JywgJ3N0cmluZycsICdudW1iZXInLCAnZGF0ZScsICdib29sZWFuJywgJ29iamVjdCcsICdkYXRldGltZSddO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZ3JpZENvbHVtblR5cGVzO1xyXG4iLCAiXHVGRUZGZXhwb3J0IGVudW0gQ2RtSW1wb3J0RmlsZU1vZGUge1xyXG4gIE5vbmUgPSAwLFxyXG4gIEFkZE5ld1Jvd3MgPSAxLFxyXG4gIFJlcGxhY2VBbGxSb3dzID0gMixcclxufVxyXG4iLCAiXHVGRUZGXHJcbmV4cG9ydCBlbnVtIEdyaWREYXRhQ29sdW1uRGF0YVR5cGUge1xyXG4gIERlZmF1bHQgPSAnZGVmYXVsdCcsXHJcbiAgU3RyaW5nID0gJ3N0cmluZycsXHJcbiAgTnVtYmVyID0gJ251bWJlcicsXHJcbiAgRGF0ZSA9ICdkYXRlJyxcclxuICBCb29sZWFuID0gJ2Jvb2xlYW4nLFxyXG4gIE9iamVjdCA9ICdvYmplY3QnLFxyXG4gIERhdGV0aW1lID0gJ2RhdGV0aW1lJ1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkQ29sdW1uU3RhdGUge1xyXG4gIGRhdGFGaWVsZDogc3RyaW5nO1xyXG4gIGRhdGFUeXBlOiBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlO1xyXG4gIHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyO1xyXG4gIGdyb3VwSW5kZXg/OiBudW1iZXI7XHJcbiAgc29ydEluZGV4PzogbnVtYmVyO1xyXG4gIHNvcnRPcmRlcj86IG51bWJlcjtcclxuICB2aXNpYmxlPzogYm9vbGVhbjtcclxuICB2aXNpYmxlSW5kZXg/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGUge1xyXG4gIGNhcHRpb24/OiBzdHJpbmc7XHJcbiAgdG9vbHRpcD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZEV4dGVuZGVkQ29sdW1uU3RhdGUgZXh0ZW5kcyBJR3JpZENvbHVtblN0YXRlLCBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZSB7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRTdGF0ZSB7XHJcbiAgY29sdW1uczogSUdyaWRFeHRlbmRlZENvbHVtblN0YXRlW107XHJcbn1cclxuIiwgImNvbnN0IGxvYWRlZFVybHM6IHN0cmluZ1tdID0gW11cclxuXHJcbmZ1bmN0aW9uIHJhbmRvbUludGVnZXIobWluOiBudW1iZXIsIG1heDogbnVtYmVyKSB7XHJcbiAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSkgKyBtaW47XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzaG93ICgkY29udGFpbmVyOiBKUXVlcnksIGltYWdlVXJsczogc3RyaW5nW10sIGltZ0NoYW5nZUludGVydmFsU2VjOiBudW1iZXIgPSA1LCB0cmFuc2l0aW9uVGltZVNlYzogbnVtYmVyID0gMikge1xyXG4gIC8vIFNodWZmbGUgdXJsc1xyXG4gIGNvbnN0IHNodWZmbGVkVXJscyA9IGltYWdlVXJscy5zb3J0KChhLCBiKSA9PiAwLjUgLSBNYXRoLnJhbmRvbSgpKTtcclxuXHJcbiAgJGNvbnRhaW5lci5hZGRDbGFzcygnaXN6b2xlYS1iYWNrZ3JvdW5kLWltYWdlLXZpZXdlcicpLmNzcyh7XHJcbiAgICAndHJhbnNpdGlvbic6IGBiYWNrZ3JvdW5kLWltYWdlICR7dHJhbnNpdGlvblRpbWVTZWN9cyBlYXNlLWluLW91dCAwc2AsXHJcbiAgfSk7XHJcblxyXG4gIHNodWZmbGVkVXJscy5mb3JFYWNoKCh1cmwsIGluZGV4KSA9PiB7XHJcbiAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcclxuXHJcbiAgICBpbWcuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcclxuICAgICAgbG9hZGVkVXJscy5wdXNoKHVybCk7XHJcblxyXG4gICAgICBpZihsb2FkZWRVcmxzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgIGluaXRJbWFnZXNDaGFuZ2luZygkY29udGFpbmVyLCBpbWdDaGFuZ2VJbnRlcnZhbFNlYyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaW1nLnNyYyA9IHVybDtcclxuICAgIH0sIGluZGV4ICogMTAwKTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0TmV4dEluZGV4VG9TaG93IChjdXJyZW50SW5kZXg6IG51bWJlcikge1xyXG4gIGlmKGxvYWRlZFVybHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcblxyXG4gIGlmKGxvYWRlZFVybHMubGVuZ3RoID09PSAyKSB7XHJcbiAgICByZXR1cm4gY3VycmVudEluZGV4ID09PSAwID8gMSA6IDA7XHJcbiAgfVxyXG5cclxuICBjb25zdCBuZXh0SW5kZXggPSByYW5kb21JbnRlZ2VyKDAsIGxvYWRlZFVybHMubGVuZ3RoIC0gMSk7XHJcblxyXG4gIGlmKG5leHRJbmRleCA9PT0gY3VycmVudEluZGV4KSB7XHJcbiAgICByZXR1cm4gbmV4dEluZGV4ID09PSBsb2FkZWRVcmxzLmxlbmd0aCAtIDEgPyAwIDogbmV4dEluZGV4ICsgMTtcclxuICB9XHJcblxyXG4gIHJldHVybiBuZXh0SW5kZXg7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGluaXRJbWFnZXNDaGFuZ2luZyAoJGNvbnRhaW5lcjogSlF1ZXJ5LCBpbWdDaGFuZ2VJbnRlcnZhbFNlYzogbnVtYmVyKSB7XHJcbiAgbGV0IGN1cnJlbnRTaG93bkluZGV4ID0gMDtcclxuXHJcbiAgc2hvd0ltYWdlKCRjb250YWluZXIsIGN1cnJlbnRTaG93bkluZGV4KTtcclxuXHJcbiAgd2luZG93LnNldEludGVydmFsKCgpID0+IHtcclxuICAgIGlmKGxvYWRlZFVybHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjdXJyZW50U2hvd25JbmRleCA9IGdldE5leHRJbmRleFRvU2hvdyhjdXJyZW50U2hvd25JbmRleCk7XHJcbiAgICBzaG93SW1hZ2UoJGNvbnRhaW5lciwgY3VycmVudFNob3duSW5kZXgpO1xyXG4gIH0sIGltZ0NoYW5nZUludGVydmFsU2VjICogMTAwMCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3dJbWFnZSAoJGNvbnRhaW5lcjogSlF1ZXJ5LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgJGNvbnRhaW5lci5jc3MoJ2JhY2tncm91bmQtaW1hZ2UnLCBgdXJsKFwiJHtsb2FkZWRVcmxzW2luZGV4XX1cIilgKTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUxpY2VuY2UgfSBmcm9tICcuLi9CdXNpbmVzcyc7XHJcblxyXG5leHBvcnQgZW51bSBGb290ZXJJbmRpY2F0b3JTdGF0dXMge1xyXG4gIFN1Y2Nlc3MsXHJcbiAgV2FybmluZyxcclxuICBFcnJvclxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElGb290ZXJJbmRpY2F0b3JWYWx1ZSB7XHJcbiAgc3RhdHVzOiBGb290ZXJJbmRpY2F0b3JTdGF0dXM7XHJcbiAgdGl0bGU/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZvb3RlckluZGljYXRvck9wdGlvbnMge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICB0ZXh0OiBzdHJpbmc7XHJcbiAgdmFsdWU6IElGb290ZXJJbmRpY2F0b3JWYWx1ZTtcclxuICBnZXRWYWx1ZT86ICgpID0+IFByb21pc2U8SUZvb3RlckluZGljYXRvclZhbHVlPjtcclxuICBnZXRWYWx1ZUludGVydmFsTXM/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZvb3Rlck9wdGlvbnMge1xyXG4gICRyb290OiBKUXVlcnk7XHJcbiAgbmFtZTogc3RyaW5nIHwgZmFsc2U7XHJcbiAgbGljZW5jZTogSUxpY2VuY2UgfCBmYWxzZTtcclxuICB5ZWFyPzogbnVtYmVyIHwgJ2xvY2FsJyB8IGZhbHNlO1xyXG4gIHZlcnNpb24/OiBzdHJpbmc7XHJcbiAgc2VydmVyTmFtZT86IHN0cmluZztcclxuICBkYXRhYmFzZT86IHN0cmluZztcclxuICBpbmRpY2F0b3JzPzogSUZvb3RlckluZGljYXRvck9wdGlvbnNbXTtcclxufVxyXG5cclxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IFBhcnRpYWw8SUZvb3Rlck9wdGlvbnM+ID0ge1xyXG4gIHllYXI6ICdsb2NhbCdcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvb3RlciB7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0Q3VycmVudFllYXIoY3VycmVudFllYXI6IG51bWJlciB8ICdsb2NhbCcgfCBmYWxzZSk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gY3VycmVudFllYXIgPT09ICdsb2NhbCcgfHwgY3VycmVudFllYXIgPT09IGZhbHNlXHJcbiAgICAgID8gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpXHJcbiAgICAgIDogY3VycmVudFllYXI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5ICRyb290OiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb25uZWN0ZWRUbzogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd05hbWU6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsaWNlbmNlOiBJTGljZW5jZSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IHNob3dMaWNlbmNlOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgeWVhcjogbnVtYmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd1llYXI6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93Q29ubmVjdGVkVG86IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRpY2F0b3JzT3B0aW9uczogSUZvb3RlckluZGljYXRvck9wdGlvbnNbXTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGluZGljYXRvcnNCeU5hbWU6IE1hcDxzdHJpbmcsIEpRdWVyeT47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRpY2F0b3JDbGFzc0J5U3RhdHVzID0gbmV3IE1hcDxGb290ZXJJbmRpY2F0b3JTdGF0dXMsIHN0cmluZz4oW1xyXG4gICAgW0Zvb3RlckluZGljYXRvclN0YXR1cy5TdWNjZXNzLCAnZm9vdGVyX19pbmRpY2F0b3JfdHlwZV9zdWNjZXNzJ10sXHJcbiAgICBbRm9vdGVySW5kaWNhdG9yU3RhdHVzLldhcm5pbmcsICdmb290ZXJfX2luZGljYXRvcl90eXBlX3dhcm5pbmcnXSxcclxuICAgIFtGb290ZXJJbmRpY2F0b3JTdGF0dXMuRXJyb3IsICdmb290ZXJfX2luZGljYXRvcl90eXBlX2Vycm9yJ11cclxuICBdKTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUZvb3Rlck9wdGlvbnMpIHtcclxuICAgIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB7IC4uLm9wdGlvbnMsIC4uLmRlZmF1bHRPcHRpb25zIH0gYXMgUmVxdWlyZWQ8SUZvb3Rlck9wdGlvbnM+O1xyXG5cclxuICAgIHRoaXMuJHJvb3QgPSBtZXJnZWRPcHRpb25zLiRyb290O1xyXG4gICAgdGhpcy5uYW1lID0gbWVyZ2VkT3B0aW9ucy5uYW1lICE9PSBmYWxzZSA/IG1lcmdlZE9wdGlvbnMubmFtZSA6IHVuZGVmaW5lZDtcclxuICAgIHRoaXMubGljZW5jZSA9IG1lcmdlZE9wdGlvbnMubGljZW5jZSAhPT0gZmFsc2UgPyBtZXJnZWRPcHRpb25zLmxpY2VuY2UgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnllYXIgPSBGb290ZXIuZ2V0Q3VycmVudFllYXIobWVyZ2VkT3B0aW9ucy55ZWFyKTtcclxuICAgIHRoaXMudmVyc2lvbiA9IG9wdGlvbnMudmVyc2lvbiB8fCB1bmRlZmluZWQ7XHJcblxyXG4gICAgdGhpcy5zaG93TmFtZSA9IG1lcmdlZE9wdGlvbnMubmFtZSAhPT0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dMaWNlbmNlID0gbWVyZ2VkT3B0aW9ucy5saWNlbmNlICE9PSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd1llYXIgPSBtZXJnZWRPcHRpb25zLnllYXIgIT09IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93Q29ubmVjdGVkVG8gPSAhIW1lcmdlZE9wdGlvbnMuc2VydmVyTmFtZSAmJiAhIW1lcmdlZE9wdGlvbnMuZGF0YWJhc2U7XHJcbiAgICB0aGlzLmluZGljYXRvcnNPcHRpb25zID0gb3B0aW9ucy5pbmRpY2F0b3JzIHx8IFtdO1xyXG4gICAgdGhpcy5pbmRpY2F0b3JzQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIEpRdWVyeT4oKTtcclxuXHJcbiAgICB0aGlzLmNvbm5lY3RlZFRvID0gdGhpcy5zaG93Q29ubmVjdGVkVG8gPyBgJHttZXJnZWRPcHRpb25zLnNlcnZlck5hbWV9IC0gJHttZXJnZWRPcHRpb25zLmRhdGFiYXNlfWAgOiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdCgpIHtcclxuICAgIHRoaXMuJHJvb3QuYWRkQ2xhc3MoJ2Zvb3RlcicpO1xyXG5cclxuICAgIHRoaXMucmVuZGVySW5kaWNhdG9ycygpO1xyXG4gICAgdGhpcy5yZW5kZXJDb3B5cmlnaHQoKTtcclxuICAgIHRoaXMuc2hvd1llYXIgJiYgdGhpcy5yZW5kZXJZZWFyKCk7XHJcbiAgICB0aGlzLnNob3dOYW1lICYmIHRoaXMucmVuZGVyTmFtZSgpO1xyXG4gICAgdGhpcy5zaG93Q29ubmVjdGVkVG8gJiYgdGhpcy5yZW5kZXJDb25uZWN0ZWRUbygpO1xyXG4gICAgdGhpcy5zaG93TGljZW5jZSAmJiB0aGlzLnJlbmRlckxpY2VuY2UoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRJbmRpY2F0b3JWYWx1ZShpbmRpY2F0b3JOYW1lOiBzdHJpbmcsIHZhbHVlOiBJRm9vdGVySW5kaWNhdG9yVmFsdWUpIHtcclxuICAgIGNvbnN0ICRpbmRpY2F0b3JFbCA9IHRoaXMuaW5kaWNhdG9yc0J5TmFtZS5nZXQoaW5kaWNhdG9yTmFtZSk7XHJcbiAgICBpZiAoJGluZGljYXRvckVsKSB7XHJcbiAgICAgIHRoaXMuc2V0SW5kaWNhdG9yVmFsdWVDb3JlKCRpbmRpY2F0b3JFbCwgdmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJJbmRpY2F0b3JzKCkge1xyXG4gICAgdGhpcy5pbmRpY2F0b3JzT3B0aW9ucz8uZm9yRWFjaCgobykgPT4ge1xyXG4gICAgICBpZiAoby50ZXh0KSB7XHJcbiAgICAgICAgJCgnPHNwYW4+JylcclxuICAgICAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pbmRpY2F0b3ItdGV4dCcpXHJcbiAgICAgICAgICAuaHRtbChgJHtvLnRleHR9OmApXHJcbiAgICAgICAgICAuYXBwZW5kVG8odGhpcy4kcm9vdCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0ICRpbmRpY2F0b3JFbCA9ICQoJzxzcGFuPicpXHJcbiAgICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2luZGljYXRvcicpXHJcbiAgICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG5cclxuICAgICAgdGhpcy5zZXRJbmRpY2F0b3JWYWx1ZUNvcmUoJGluZGljYXRvckVsLCBvLnZhbHVlKTtcclxuICAgICAgdGhpcy5pbmRpY2F0b3JzQnlOYW1lLnNldChvLm5hbWUsICRpbmRpY2F0b3JFbCk7XHJcblxyXG4gICAgICBpZiAoby5nZXRWYWx1ZSAmJiBvLmdldFZhbHVlSW50ZXJ2YWxNcykge1xyXG4gICAgICAgIHNldEludGVydmFsKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgby5nZXRWYWx1ZSgpO1xyXG4gICAgICAgICAgdGhpcy5zZXRJbmRpY2F0b3JWYWx1ZUNvcmUoJGluZGljYXRvckVsLCB2YWx1ZSk7XHJcbiAgICAgICAgfSwgby5nZXRWYWx1ZUludGVydmFsTXMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0SW5kaWNhdG9yVmFsdWVDb3JlKCRpbmRpY2F0b3JFbDogSlF1ZXJ5LCB2YWx1ZTogSUZvb3RlckluZGljYXRvclZhbHVlKSB7XHJcbiAgICAkaW5kaWNhdG9yRWwuYXR0cigndGl0bGUnLCB2YWx1ZS50aXRsZSk7XHJcbiAgICAkaW5kaWNhdG9yRWwucmVtb3ZlQ2xhc3MoWy4uLnRoaXMuaW5kaWNhdG9yQ2xhc3NCeVN0YXR1cy52YWx1ZXMoKV0pO1xyXG4gICAgJGluZGljYXRvckVsLmFkZENsYXNzKHRoaXMuaW5kaWNhdG9yQ2xhc3NCeVN0YXR1cy5nZXQodmFsdWUuc3RhdHVzKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckNvcHlyaWdodCgpIHtcclxuICAgICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19jb3B5cmlnaHQnKVxyXG4gICAgICAuaHRtbCgnJmNvcHk7JylcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJOYW1lKCkge1xyXG4gICAgdGhpcy5uYW1lICYmICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pdGVtJylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2FwcC1uYW1lJylcclxuICAgICAgLnRleHQodGhpcy5uYW1lICsgKCEhdGhpcy52ZXJzaW9uID8gYDogJHt0aGlzLnZlcnNpb259YCA6ICcnKSlcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJDb25uZWN0ZWRUbygpIHtcclxuICAgIHRoaXMubmFtZSAmJiAkKCc8c3Bhbj4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9faXRlbScpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19jb25uZWN0ZWQtdG8nKVxyXG4gICAgICAudGV4dChgQ29ubmVjdGVkIHRvOiAke3RoaXMuY29ubmVjdGVkVG99LmApXHJcbiAgICAgIC5hcHBlbmRUbyh0aGlzLiRyb290KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyWWVhcigpIHtcclxuICAgICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pdGVtJylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2N1cnJlbnQteWVhcicpXHJcbiAgICAgIC50ZXh0KHRoaXMueWVhcilcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJMaWNlbmNlKCkge1xyXG4gICAgdGhpcy5saWNlbmNlICYmICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pdGVtJylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2xpY2VuY2UtaW5mbycpXHJcbiAgICAgIC5hcHBlbmQoXHJcbiAgICAgICAgJCgnPHNwYW4+JylcclxuICAgICAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19saWNlbmNlLW93bmVyJylcclxuICAgICAgICAgIC50ZXh0KGAke3RoaXMuZ2V0TGljZW5jZU93bmVyRGlzcGxheVRleHQodGhpcy5saWNlbmNlKX0uIGApXHJcbiAgICAgIClcclxuICAgICAgLmFwcGVuZChcclxuICAgICAgICAkKCc8c3Bhbj4nKVxyXG4gICAgICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2xpY2VuY2UtZGF0ZScpXHJcbiAgICAgICAgICAudGV4dCh0aGlzLmdldExpY2VuY2VFeHBpcmF0aW9uRGF0ZURpc3BsYXlUZXh0KHRoaXMubGljZW5jZSkpXHJcbiAgICAgIClcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRMaWNlbmNlT3duZXJEaXNwbGF5VGV4dChsaWNlbmNlOiBJTGljZW5jZSkge1xyXG4gICAgcmV0dXJuIGBMaWNlbmNlZCB0bzogJHtsaWNlbmNlLk93bmVyfWA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldExpY2VuY2VFeHBpcmF0aW9uRGF0ZURpc3BsYXlUZXh0KGxpY2VuY2U6IElMaWNlbmNlKSB7XHJcbiAgICBjb25zdCBkYXRlID0gdHlwZW9mIGxpY2VuY2UuRXhwaXJhdGlvbkRhdGUgPT09ICdzdHJpbmcnID8gbmV3IERhdGUobGljZW5jZS5FeHBpcmF0aW9uRGF0ZSkgOiBsaWNlbmNlLkV4cGlyYXRpb25EYXRlO1xyXG5cclxuICAgIHJldHVybiBgTGljZW5jZSBFeHBpcnk6ICR7ZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoKX1gO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGbGV0IHJlcGFpbnRUaW1lb3V0ID0gbnVsbDtcclxuY29uc3QgcmVzaXplSGFuZGxlcnMgPSBbXTtcclxuXHJcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB7XHJcbiAgaWYgKHJlcGFpbnRUaW1lb3V0KSB7XHJcbiAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHJlcGFpbnRUaW1lb3V0KTtcclxuICB9XHJcblxyXG4gIHJlcGFpbnRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgcmVzaXplSGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4gaGFuZGxlcigpKTtcclxuICAgIHJlcGFpbnRUaW1lb3V0ID0gbnVsbDtcclxuICB9LCAxMDApO1xyXG59KTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG9uUmVzaXplOiAoKSA9PiB2b2lkKSB7XHJcbiAgcmVzaXplSGFuZGxlcnMucHVzaChvblJlc2l6ZSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCBhdXRvUmVzaXplIGZyb20gJy4vQXV0b1Jlc2l6ZSc7XHJcblxyXG5jb25zdCBDU1MgPSB7XHJcbiAgbWFpbjogJy5tYWluJyxcclxuICBoZWFkZXI6ICcubWFpbiAuaGVhZGVyJyxcclxuICBjb250ZW50OiAnLmNvbnRlbnQtYXJlYScsXHJcbiAgcGFuZWw6ICcucGFuZWwnLFxyXG4gIGZvb3RlcjogJ2Zvb3RlcidcclxufTtcclxuXHJcbmxldCBsYXN0V2luZG93SGVpZ2h0ID0gbnVsbDtcclxubGV0IGxhc3RDb250ZW50SGVpZ2h0ID0gbnVsbDtcclxubGV0IGxhc3RXaWRnZXRIZWlnaHQgPSBudWxsO1xyXG5cclxuZnVuY3Rpb24gdXBkYXRlSGVpZ2h0KHdpZGdldCkge1xyXG4gIGNvbnN0ICRjb250ZW50ID0gJChDU1MuY29udGVudCk7XHJcblxyXG4gICRjb250ZW50LmhlaWdodChsYXN0Q29udGVudEhlaWdodCk7XHJcbiAgd2lkZ2V0Lm9wdGlvbignaGVpZ2h0JywgbGFzdFdpZGdldEhlaWdodCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNhbGN1bGF0ZUhlaWdodCh3aWRnZXQ6IERldkV4cHJlc3MudWkuV2lkZ2V0PGFueT4sIGlnbm9yZVNpYmxpbmdzOiBib29sZWFuID0gZmFsc2UsIGFkZE93blNpemU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gIGNvbnN0ICRtYWluID0gJChDU1MubWFpbik7XHJcbiAgY29uc3QgJGhlYWRlciA9ICQoQ1NTLmhlYWRlcik7XHJcbiAgY29uc3QgJGNvbnRlbnQgPSAkKENTUy5jb250ZW50KTtcclxuICBjb25zdCAkZm9vdGVyID0gJChDU1MuZm9vdGVyKTtcclxuXHJcbiAgY29uc3QgcGFkZGluZ3MgPSAkY29udGVudC5vdXRlckhlaWdodCgpIC0gJGNvbnRlbnQuaGVpZ2h0KCk7XHJcblxyXG4gIGxhc3RDb250ZW50SGVpZ2h0ID0gJG1haW4uaGVpZ2h0KCkgLSAkaGVhZGVyLmhlaWdodCgpIC0gJGZvb3Rlci5vdXRlckhlaWdodCgpIC0gcGFkZGluZ3M7XHJcbiAgbGFzdFdpbmRvd0hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTtcclxuXHJcbiAgY29uc3QgJGNvbnRlbnRFbGVtZW50cyA9ICRjb250ZW50LmNoaWxkcmVuKCk7XHJcbiAgbGV0IGNvbnRlbnRFbGVtZW50c0hlaWdodCA9IDA7XHJcblxyXG4gIGlmICghaWdub3JlU2libGluZ3MpIHtcclxuICAgIGNvbnN0ICR3aWRnZXRFbGVtZW50ID0gd2lkZ2V0LmVsZW1lbnQoKTtcclxuICAgICRjb250ZW50RWxlbWVudHMuZWFjaCgoaW5kZXgsIGVsKSA9PiB7XHJcbiAgICAgIGNvbnN0ICRjaGlsZCA9ICQoZWwpO1xyXG5cclxuICAgICAgaWYgKCRjaGlsZC5pcygkd2lkZ2V0RWxlbWVudCkgfHwgJGNoaWxkLmhhcygkd2lkZ2V0RWxlbWVudFswXSkubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb250ZW50RWxlbWVudHNIZWlnaHQgKz0gKCRjaGlsZC5pcygnOnZpc2libGUnKSAmJiAkY2hpbGQuY3NzKCdwb3NpdGlvbicpICE9PSAnYWJzb2x1dGUnKSA/ICRjaGlsZC5vdXRlckhlaWdodCh0cnVlKSA6IDA7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGxhc3RXaWRnZXRIZWlnaHQgPSBsYXN0Q29udGVudEhlaWdodCAtIGNvbnRlbnRFbGVtZW50c0hlaWdodDtcclxuXHJcbiAgaWYgKGFkZE93blNpemUpIHtcclxuICAgIGxhc3RXaWRnZXRIZWlnaHQgKz0gd2lkZ2V0LmVsZW1lbnQoKS5vdXRlckhlaWdodCgpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlSGVpZ2h0KHdpZGdldCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlY2FsY3VsYXRlSGVpZ2h0KHdpZGdldDogRGV2RXhwcmVzcy51aS5XaWRnZXQ8YW55Pikge1xyXG4gIGNvbnN0IHdpbmRvd0hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTtcclxuICBjb25zdCBkaWZmID0gd2luZG93SGVpZ2h0IC0gbGFzdFdpbmRvd0hlaWdodDtcclxuXHJcbiAgbGFzdENvbnRlbnRIZWlnaHQgKz0gZGlmZjtcclxuICBsYXN0V2lkZ2V0SGVpZ2h0ICs9IGRpZmY7XHJcbiAgbGFzdFdpbmRvd0hlaWdodCA9IHdpbmRvd0hlaWdodDtcclxuXHJcbiAgdXBkYXRlSGVpZ2h0KHdpZGdldCk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHdpZGdldDogRGV2RXhwcmVzcy51aS5XaWRnZXQ8YW55PiwgaWdub3JlU2libGluZ3M6IGJvb2xlYW4gPSBmYWxzZSwgYWRkT3duU2l6ZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgY2FsY3VsYXRlSGVpZ2h0KHdpZGdldCwgaWdub3JlU2libGluZ3MsIGFkZE93blNpemUpO1xyXG5cclxuICBhdXRvUmVzaXplKCgpID0+IHJlY2FsY3VsYXRlSGVpZ2h0KHdpZGdldCkpO1xyXG59XHJcbiIsICJcdUZFRkZjb25zdCBESVNBQkxFRF9DTEFTUyA9ICdpc296LWljb24tZGlzYWJsZWQnO1xyXG5cclxuZXhwb3J0IGNvbnN0IFRIRU1FX0NMQVNTRVMgPSB7XHJcbiAgbGc6ICdpc3pvbGVhLWxnJyxcclxuICBtZDogJ2lzem9sZWEtbWQnLFxyXG4gIHNtOiAnaXN6b2xlYS1zbSdcclxufTtcclxuXHJcbmV4cG9ydCBjbGFzcyBUaGVtZUhlbHBlciB7XHJcbiAgcHVibGljIHN0YXRpYyBzZXRFbGVtZW50TWlkZGxlU2l6ZShlbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+KSB7XHJcbiAgICBlbGVtZW50LmFkZENsYXNzKFRIRU1FX0NMQVNTRVMubWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBzZXRFbGVtZW50U21hbGxTaXplKGVsZW1lbnQ6IEpRdWVyeTxIVE1MRWxlbWVudD4pIHtcclxuICAgIGVsZW1lbnQuYWRkQ2xhc3MoVEhFTUVfQ0xBU1NFUy5zbSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHNldFdpZGdldE1pZGRsZVNpemUoaW5zdGFuY2U6IGFueSkge1xyXG4gICAgVGhlbWVIZWxwZXIuc2V0V2lkZ2V0U2l6ZShpbnN0YW5jZSwgVEhFTUVfQ0xBU1NFUy5tZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHNldFdpZGdldFNtYWxsU2l6ZShpbnN0YW5jZTogYW55KSB7XHJcbiAgICBUaGVtZUhlbHBlci5zZXRXaWRnZXRTaXplKGluc3RhbmNlLCBUSEVNRV9DTEFTU0VTLnNtKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SWNvbkNsYXNzKGljb246IHN0cmluZywgZGlzYWJsZWQ/OiBib29sZWFuLCBzaXplOiAxNiB8IDI0ID0gMTYpIHtcclxuICAgIGNvbnN0IGljb25DbGFzcyA9IGBpc296IGlzb3otaWNvbi0ke2ljb259LSR7c2l6ZX1gO1xyXG5cclxuICAgIHJldHVybiAhZGlzYWJsZWRcclxuICAgICAgPyBpY29uQ2xhc3NcclxuICAgICAgOiBgJHtpY29uQ2xhc3N9ICR7RElTQUJMRURfQ0xBU1N9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIHNldFdpZGdldFNpemUoaW5zdGFuY2U6IGFueSwgc2l6ZUNsYXNzOiBzdHJpbmcpIHtcclxuICAgIGlmIChpbnN0YW5jZSkge1xyXG4gICAgICBpbnN0YW5jZS5vcHRpb24oJ2VsZW1lbnRBdHRyJywgeyBjbGFzczogc2l6ZUNsYXNzIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGY29uc3QgQ0xBU1NFUyA9IHtcclxuICB0aXRsZTogJ2lzb3otdGl0bGUnXHJcbn07XHJcblxyXG5leHBvcnQgY2xhc3MgVG9vbGJhckhlbHBlciB7XHJcbiAgcHVibGljIHN0YXRpYyBnZXRUb29sYmFyVGl0bGVUZW1wbGF0ZUl0ZW0odGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZCwgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0ICRlbCA9ICQoYDxzcGFuIGNsYXNzPVwiJHtDTEFTU0VTLnRpdGxlfVwiPiR7dGl0bGV9PC9zcGFuPmApO1xyXG5cclxuICAgICAgICBpZiAoZGVzY3JpcHRpb24pIHtcclxuICAgICAgICAgICRlbC5hcHBlbmQoJCgnPGkgLz4nKS5hZGRDbGFzcygnZmFzJykuYWRkQ2xhc3MoJ2ZhLWluZm8tY2lyY2xlJykuYWRkQ2xhc3MoJ3JlcG9ydC1kZXRhaWxzLWxpbmsnKS5hdHRyKCd0aXRsZScsICdSZXBvcnQgZGV0YWlscycpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAkZWw7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBUSEVNRV9DTEFTU0VTIH0gZnJvbSAnLi4vSGVscGVycy9UaGVtZSc7XHJcbmltcG9ydCB7IFRvb2xiYXJIZWxwZXIgfSBmcm9tICcuLi9IZWxwZXJzL1Rvb2xiYXInO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVG9vbGJhclNldHRpbmcge1xyXG4gIG9wdGlvbnM/OiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhck9wdGlvbnM7XHJcbiAgdGl0bGU/OiBzdHJpbmc7XHJcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmNvbnN0IENMQVNTRVMgPSB7XHJcbiAgdGl0bGU6ICdpc296LXRpdGxlJyxcclxuICBoZWFkZXI6ICdpc296LXRvb2xiYXItaGVhZGVyJyxcclxuICBkcm9wRG93bkJ1dHRvbjogJ2R4LWRyb3Bkb3dubWVudS1idXR0b24nXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcjogc3RyaW5nLCBzZXR0aW5nczogSVRvb2xiYXJTZXR0aW5nID0geyB0aXRsZTogJycsIGRlc2NyaXB0aW9uOiAnJywgb3B0aW9uczoge30gfSk6XHJcbiAgRGV2RXhwcmVzcy51aS5keFRvb2xiYXIge1xyXG4gIGNvbnN0IHtcclxuICAgIHRpdGxlID0gJycsXHJcbiAgICBkZXNjcmlwdGlvbiA9ICcnLFxyXG4gICAgb3B0aW9ucyA9IHt9LFxyXG4gIH0gPSBzZXR0aW5ncztcclxuICBjb25zdCB7XHJcbiAgICBpdGVtcyA9IFtdLFxyXG4gICAgZWxlbWVudEF0dHIgPSB7fVxyXG4gIH0gPSBvcHRpb25zO1xyXG5cclxuICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICBjb25zdCBtaWRsZGVTaXplRWxlbWVudEF0dHIgPSB7IGNsYXNzOiBUSEVNRV9DTEFTU0VTLm1kIH07XHJcblxyXG4gICAgaWYgKGl0ZW0ub3B0aW9ucykge1xyXG4gICAgICBsZXQgeyBlZGl0b3JPcHRpb25zIH0gPSBpdGVtLm9wdGlvbnM7XHJcblxyXG4gICAgICBpZiAoIWVkaXRvck9wdGlvbnMpIHtcclxuICAgICAgICBlZGl0b3JPcHRpb25zID0ge307XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGVkaXRvck9wdGlvbnMuZWxlbWVudEF0dHIgPSBtaWRsZGVTaXplRWxlbWVudEF0dHI7XHJcbiAgICAgIGl0ZW0ub3B0aW9ucy5lbGVtZW50QXR0ciA9IG1pZGxkZVNpemVFbGVtZW50QXR0cjtcclxuICAgICAgaXRlbS5vcHRpb25zLmVkaXRvck90aW9ucyA9IGVkaXRvck9wdGlvbnM7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IG9uQ29udGVudFJlYWR5ID0gKGUpID0+IHtcclxuICAgIGUuZWxlbWVudFxyXG4gICAgICAuZmluZChgLiR7Q0xBU1NFUy5kcm9wRG93bkJ1dHRvbn1gKVxyXG4gICAgICAuYWRkQ2xhc3MoVEhFTUVfQ0xBU1NFUy5tZCk7XHJcblxyXG4gICAgaWYgKG9wdGlvbnM/Lm9uQ29udGVudFJlYWR5KSB7XHJcbiAgICAgIG9wdGlvbnMub25Db250ZW50UmVhZHkoZSk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuICQoYCR7c2VsZWN0b3J9YClcclxuICAgIC5keFRvb2xiYXIoe1xyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIFRvb2xiYXJIZWxwZXIuZ2V0VG9vbGJhclRpdGxlVGVtcGxhdGVJdGVtKHRpdGxlLCBkZXNjcmlwdGlvbiksXHJcbiAgICAgICAgLi4uaXRlbXNcclxuICAgICAgXSxcclxuICAgICAgb25Db250ZW50UmVhZHksXHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7XHJcbiAgICAgICAgLi4uZWxlbWVudEF0dHIsXHJcbiAgICAgICAgY2xhc3M6IENMQVNTRVMuaGVhZGVyXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICAuZHhUb29sYmFyKCdpbnN0YW5jZScpO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgYXV0b1Jlc2l6ZSBmcm9tICcuL0F1dG9SZXNpemUnO1xyXG5cclxuY29uc3QgQ1NTID0ge1xyXG4gIHBhbmVsOiAnLnBhbmVsLWJvZHknXHJcbn07XHJcblxyXG5sZXQgbGFzdFdpbmRvd0hlaWdodCA9IG51bGw7XHJcbmxldCBsYXN0Q29udGVudEhlaWdodCA9IG51bGw7XHJcbmxldCBsYXN0V2lkZ2V0SGVpZ2h0ID0gbnVsbDtcclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZUhlaWdodCh3aWRnZXQpIHtcclxuICBjb25zdCAkd2lkZ2V0ID0gd2lkZ2V0LmVsZW1lbnQoKTtcclxuICBjb25zdCAkcGFuZWwgPSAkd2lkZ2V0LnBhcmVudHMoQ1NTLnBhbmVsKS5lcSgwKTtcclxuXHJcbiAgJHBhbmVsLmhlaWdodChsYXN0Q29udGVudEhlaWdodCk7XHJcbiAgd2lkZ2V0Lm9wdGlvbignaGVpZ2h0JywgbGFzdFdpZGdldEhlaWdodCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNhbGN1bGF0ZUhlaWdodCh3aWRnZXQ6IERldkV4cHJlc3MudWkuV2lkZ2V0PGFueT4pIHtcclxuICBjb25zdCAkd2lkZ2V0ID0gd2lkZ2V0LmVsZW1lbnQoKTtcclxuICBjb25zdCAkcGFuZWwgPSB3aWRnZXQuZWxlbWVudCgpLnBhcmVudHMoQ1NTLnBhbmVsKS5lcSgwKTtcclxuXHJcbiAgY29uc3QgcGFuZWxUb3AgPSAkcGFuZWwucG9zaXRpb24oKS50b3A7XHJcbiAgY29uc3QgcGFuZWxIZWlnaHQgPSAkcGFuZWwuaGVpZ2h0KCk7XHJcbiAgY29uc3QgcGFuZWxQYWRkaW5nID0gJHBhbmVsLm91dGVySGVpZ2h0KCkgLSAkcGFuZWwuaGVpZ2h0KCk7XHJcbiAgY29uc3Qgd2lkZ2V0VG9wID0gJHdpZGdldC5wb3NpdGlvbigpLnRvcDtcclxuXHJcbiAgY29uc3Qgd2lkZ2V0SGVpZ2h0ID0gcGFuZWxIZWlnaHQgLSAod2lkZ2V0VG9wIC0gcGFuZWxUb3ApICsgcGFuZWxQYWRkaW5nIC8gMjtcclxuXHJcbiAgd2lkZ2V0Lm9wdGlvbignaGVpZ2h0Jywgd2lkZ2V0SGVpZ2h0KTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVjYWxjdWxhdGVIZWlnaHQod2lkZ2V0OiBEZXZFeHByZXNzLnVpLldpZGdldDxhbnk+KSB7XHJcbiAgY29uc3Qgd2luZG93SGVpZ2h0ID0gJCh3aW5kb3cpLmhlaWdodCgpO1xyXG4gIGNvbnN0IGRpZmYgPSB3aW5kb3dIZWlnaHQgLSBsYXN0V2luZG93SGVpZ2h0O1xyXG5cclxuICBsYXN0Q29udGVudEhlaWdodCArPSBkaWZmO1xyXG4gIGxhc3RXaWRnZXRIZWlnaHQgKz0gZGlmZjtcclxuICBsYXN0V2luZG93SGVpZ2h0ID0gd2luZG93SGVpZ2h0O1xyXG5cclxuICB1cGRhdGVIZWlnaHQod2lkZ2V0KTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24od2lkZ2V0OiBEZXZFeHByZXNzLnVpLldpZGdldDxhbnk+KSB7XHJcbiAgY2FsY3VsYXRlSGVpZ2h0KHdpZGdldCk7XHJcblxyXG4gIGF1dG9SZXNpemUoKCkgPT4gY2FsY3VsYXRlSGVpZ2h0KHdpZGdldCkpO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgZnVsbFNjcmVlbiBmcm9tICcuLi9GdWxsU2NyZWVuJztcclxuaW1wb3J0IHBhbmVsSGVpZ2h0IGZyb20gJy4uL1BhbmVsSGVpZ2h0JztcclxuaW1wb3J0IHsgQ1NTX0NMQVNTRVMgfSBmcm9tICcuLi8uLi9TdHlsaW5nL0luZGV4JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRBZGRpdGlvbmFsT3B0aW9ucyB7XHJcbiAgZXhwb3J0RmlsZU5hbWU/OiBzdHJpbmc7XHJcbiAgc3VtbWFyeUNvbHVtbj86IHN0cmluZztcclxuICBzaG93U3VtbWFyeUluQ29sdW1uPzogc3RyaW5nO1xyXG4gIGluUGFuZWxHcmlkPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZ1bGxTY3JlZW5EYXRhR3JpZChpZDogSlF1ZXJ5LCBvcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zLCBpc0luUGFuZWxHcmlkID0gZmFsc2UpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gIGNvbnN0IGdyaWQgPSBjcmVhdGVEYXRhR3JpZChpZCwgb3B0aW9ucyk7XHJcblxyXG4gIGlmICghb3B0aW9ucy5oZWlnaHQpIHtcclxuICAgIGlmIChpc0luUGFuZWxHcmlkKSB7XHJcbiAgICAgIHBhbmVsSGVpZ2h0KGdyaWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZnVsbFNjcmVlbihncmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBncmlkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGF0YUdyaWQoZWw6IEpRdWVyeSwgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgY29uc3QgZ3JpZCA9IGVsLmR4RGF0YUdyaWQob3B0aW9ucykuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgZ3JpZC5lbGVtZW50KCkuYWRkQ2xhc3MoQ1NTX0NMQVNTRVMuZHhEYXRhR3JpZCk7XHJcblxyXG4gIHJldHVybiBncmlkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnVsbFNjcmVlblRyZWVMaXN0KFxyXG4gIGVsOiBzdHJpbmcgfCBKUXVlcnksIG9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdC5Qcm9wZXJ0aWVzLCBpc0luUGFuZWwgPSBmYWxzZVxyXG4pOiBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3Qge1xyXG4gIGNvbnN0IHRyZWVMaXN0ID0gKHR5cGVvZiBlbCA9PT0gJ3N0cmluZycgPyAkKGVsKSA6IGVsKS5keFRyZWVMaXN0KG9wdGlvbnMpLmR4VHJlZUxpc3QoJ2luc3RhbmNlJyk7XHJcblxyXG4gIHRyZWVMaXN0LmVsZW1lbnQoKS5hZGRDbGFzcyhDU1NfQ0xBU1NFUy5keERhdGFHcmlkKTtcclxuXHJcbiAgaWYgKCFvcHRpb25zLmhlaWdodCkge1xyXG4gICAgaWYgKGlzSW5QYW5lbCkge1xyXG4gICAgICBwYW5lbEhlaWdodCh0cmVlTGlzdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmdWxsU2NyZWVuKHRyZWVMaXN0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiB0cmVlTGlzdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSh0ZXh0LCB0aXRsZSkge1xyXG4gIHJldHVybiAkKCc8c3Bhbj4nKVxyXG4gICAgLmF0dHIoJ3RpdGxlJywgdGl0bGUpXHJcbiAgICAudGV4dCh0ZXh0KTtcclxufVxyXG4iLCAiaW1wb3J0IHNhdmVBcyBmcm9tICdmaWxlLXNhdmVyJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENyZWF0ZUdyaWRFeHBvcnRGdW5jdGlvbihyZXBvcnROYW1lOiBzdHJpbmcpOiAoZTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLkV4cG9ydGluZ0V2ZW50KSA9PiB2b2lkIHtcclxuICByZXR1cm4gKGU6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5FeHBvcnRpbmdFdmVudCkgPT4ge1xyXG4gICAgY29uc3Qgd29ya2Jvb2sgPSBuZXcgKHdpbmRvdyBhcyBhbnkpLkV4Y2VsSlMuV29ya2Jvb2soKTtcclxuICAgIGNvbnN0IHdvcmtzaGVldCA9IHdvcmtib29rLmFkZFdvcmtzaGVldChyZXBvcnROYW1lKTtcclxuXHJcbiAgICBEZXZFeHByZXNzLmV4Y2VsRXhwb3J0ZXIuZXhwb3J0RGF0YUdyaWQoe1xyXG4gICAgICB3b3Jrc2hlZXQsXHJcbiAgICAgIGNvbXBvbmVudDogZS5jb21wb25lbnQsXHJcbiAgICAgIGN1c3RvbWl6ZUNlbGw6IChvcHRpb25zKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZXhjZWxDZWxsID0gb3B0aW9ucy5leGNlbENlbGw7XHJcblxyXG4gICAgICAgIGV4Y2VsQ2VsbC5mb250ID0geyBuYW1lOiAnQXJpYWwnLCBzaXplOiAxMiB9O1xyXG4gICAgICAgIGV4Y2VsQ2VsbC5hbGlnbm1lbnQgPSB7IGhvcml6b250YWw6ICdsZWZ0JyB9O1xyXG4gICAgICB9XHJcbiAgICB9KS50aGVuKGZ1bmN0aW9uKCkge1xyXG4gICAgICB3b3JrYm9vay54bHN4LndyaXRlQnVmZmVyKCkudGhlbihmdW5jdGlvbihidWZmZXIpIHtcclxuICAgICAgICBzYXZlQXMobmV3IEJsb2IoW2J1ZmZlcl0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgfSksIGAke3JlcG9ydE5hbWV9Lnhsc3hgKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIGUuY2FuY2VsID0gdHJ1ZTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IFRvb2xiYXJIZWxwZXIgfSBmcm9tICcuLi8uLi9IZWxwZXJzL1Rvb2xiYXInO1xyXG5pbXBvcnQgeyBUaGVtZUhlbHBlciwgVEhFTUVfQ0xBU1NFUyB9IGZyb20gJy4uLy4uL0hlbHBlcnMvVGhlbWUnO1xyXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuLi8uLi9Db25maWcvSW5kZXgnO1xyXG5pbXBvcnQgY3JlYXRlR3JpZEV4cG9ydEZuIGZyb20gJy4uLy4uL1V0aWxzL0dyaWRFeHBvcnQnO1xyXG5cclxuaW50ZXJmYWNlIElHcmlkU2V0dGluZ3NCYXNlPFQ+IHtcclxuICBvcHRpb25zPzogVDtcclxuXHJcbiAgZXhwb3J0RmlsZU5hbWU/OiBzdHJpbmc7XHJcbiAgaGVhZGVyRGVzY3JpcHRpb24/OiBzdHJpbmc7XHJcbiAgaW5QYW5lbEdyaWQ/OiBib29sZWFuO1xyXG4gIGlzRnVsbFNjcmVlbj86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbiAgc2V0RGVmYXVsdENvbHVtbldpZHRoPzogYm9vbGVhbjtcclxuICBzaG93U3VtbWFyeUluQ29sdW1uPzogc3RyaW5nO1xyXG4gIHN1bW1hcnlDb2x1bW4/OiBzdHJpbmc7XHJcbiAgZGlzYWJsZVN1bW1hcnlDb2x1bW5EZXRlY3Rpb24/OiBib29sZWFuO1xyXG4gIHRpdGxlPzogc3RyaW5nO1xyXG4gIHRvb2xiYXJBY2NlbnRCdXR0b25OYW1lPzogc3RyaW5nO1xyXG4gIHRvb2xiYXJJdGVtcz86IGFueVtdO1xyXG4gIGJ1dHRvbnNTaXplPzogJ3NtJyB8ICdtZCc7XHJcbn1cclxuXHJcbmNvbnN0IGdldFdpZGdldE5hbWUgPSAod2lkZ2V0OiBzdHJpbmcpID0+IHtcclxuICByZXR1cm4gd2lkZ2V0XHJcbiAgICAuc2xpY2UoJ2R4Jy5sZW5ndGgpXHJcbiAgICAudG9Mb3dlckNhc2UoKTtcclxufTtcclxuXHJcbmNvbnN0IGdldFNlbGVjdG9ycyA9ICh3aWRnZXQ6IHN0cmluZykgPT4ge1xyXG4gIGNvbnN0IGdyaWROYW1lID0gZ2V0V2lkZ2V0TmFtZSh3aWRnZXQpO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2VhcmNoUGFuZWw6IGAuZHgtJHtncmlkTmFtZX0tc2VhcmNoLXBhbmVsYCxcclxuICAgIHRvb2xiYXJFZGl0QnV0dG9uOiBgLmR4LSR7Z3JpZE5hbWV9LXRvb2xiYXItYnV0dG9uLmR4LWVkaXQtYnV0dG9uYCxcclxuICAgIHRvb2xiYXJFeHBvcnRCdXR0b246IGAuZHgtJHtncmlkTmFtZX0tZXhwb3J0LWJ1dHRvbiAuZHgtYnV0dG9uYCxcclxuICAgIHNlbGVjdENoZWNrQm94OiAnLmR4LXNlbGVjdC1jaGVja2JveCdcclxuICB9O1xyXG59O1xyXG5leHBvcnQgaW50ZXJmYWNlIElEYXRhR3JpZFNldHRpbmdzIGV4dGVuZHMgSUdyaWRTZXR0aW5nc0Jhc2U8RGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucz4ge1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElUcmVlTGlzdFNldHRpbmdzIGV4dGVuZHMgSUdyaWRTZXR0aW5nc0Jhc2U8RGV2RXhwcmVzcy51aS5keFRyZWVMaXN0T3B0aW9ucz4ge1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0R3JpZERlZmF1bHRPcHRpb25zKHNldHRpbmdzOiBJRGF0YUdyaWRTZXR0aW5ncykge1xyXG4gIGNvbnN0IHJlc3VsdDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXMgPSBjb25maWcuaXNMZWdhY3lSZW5kZXIgPyBnZXRMZWdhY3lEZWZhdWx0T3B0aW9ucyhzZXR0aW5ncykgOiBnZXREZWZhdWx0T3B0aW9ucyhzZXR0aW5ncyk7XHJcblxyXG4gIGlmIChzZXR0aW5ncy5zdW1tYXJ5Q29sdW1uIHx8IHNldHRpbmdzLnNob3dTdW1tYXJ5SW5Db2x1bW4pIHtcclxuICAgIChyZXN1bHQgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXMpLnN1bW1hcnkgPSB7XHJcbiAgICAgIHRvdGFsSXRlbXM6IFt7XHJcbiAgICAgICAgY29sdW1uOiBzZXR0aW5ncy5zdW1tYXJ5Q29sdW1uIHx8IHNldHRpbmdzLnNob3dTdW1tYXJ5SW5Db2x1bW4sXHJcbiAgICAgICAgc2hvd0luQ29sdW1uOiBzZXR0aW5ncy5zaG93U3VtbWFyeUluQ29sdW1uIHx8IHNldHRpbmdzLnN1bW1hcnlDb2x1bW4sXHJcbiAgICAgICAgc3VtbWFyeVR5cGU6ICdjb3VudCdcclxuICAgICAgfV1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICByZXN1bHQuZXhwb3J0ID0ge1xyXG4gICAgZW5hYmxlZDogISFzZXR0aW5ncy5leHBvcnRGaWxlTmFtZSxcclxuICAgIGFsbG93RXhwb3J0U2VsZWN0ZWREYXRhOiB0cnVlLFxyXG4gIH07XHJcblxyXG4gIGlmICghY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICByZXN1bHQuZ3JvdXBQYW5lbCA9IHsgdmlzaWJsZTogdHJ1ZSB9O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFRyZWVMaXN0RGVmYXVsdE9wdGlvbnMoc2V0dGluZ3M6IElUcmVlTGlzdFNldHRpbmdzKSB7XHJcbiAgY29uc3QgcmVzdWx0OiBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoc2V0dGluZ3MpO1xyXG5cclxuICByZXN1bHQuc2VsZWN0aW9uID0geyBtb2RlOiAnbm9uZScgfTtcclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0RGVmYXVsdE9wdGlvbnNcclxuICA8VCBleHRlbmRzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgfCBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zPihzZXR0aW5nczogSURhdGFHcmlkU2V0dGluZ3MgfCBJVHJlZUxpc3RTZXR0aW5ncyk6IFQge1xyXG4gIHJldHVybiB7XHJcbiAgICBhbGxvd0NvbHVtblJlc2l6aW5nOiB0cnVlLFxyXG4gICAgY2FjaGVFbmFibGVkOiB0cnVlLFxyXG4gICAgY29sdW1uQXV0b1dpZHRoOiB0cnVlLFxyXG4gICAgZmlsdGVyUm93OiB7IHZpc2libGU6IHRydWUsIGFwcGx5RmlsdGVyOiAnb25DbGljaycgfSxcclxuICAgIGhlYWRlckZpbHRlcjogeyB2aXNpYmxlOiB0cnVlIH0sXHJcbiAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcclxuICAgIHBhZ2luZzogeyBwYWdlU2l6ZTogODAgfSxcclxuICAgIHBhZ2VyOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICByZW1vdGVPcGVyYXRpb25zOiB0cnVlLFxyXG4gICAgc2Nyb2xsaW5nOiB7XHJcbiAgICAgIG1vZGU6ICd2aXJ0dWFsJyxcclxuICAgICAgcm93UmVuZGVyaW5nTW9kZTogJ3ZpcnR1YWwnXHJcbiAgICB9LFxyXG4gICAgc2VhcmNoUGFuZWw6IHtcclxuICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgd2lkdGg6IDI0MCxcclxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWFyY2guLi4nXHJcbiAgICB9LFxyXG4gICAgc2hvd1Jvd0xpbmVzOiB0cnVlLFxyXG4gICAgc2hvd0JvcmRlcnM6IHRydWUsXHJcbiAgICBzZWxlY3Rpb246IHsgbW9kZTogJ211bHRpcGxlJyB9LFxyXG4gICAgd29yZFdyYXBFbmFibGVkOiB0cnVlXHJcbiAgfSBhcyBUO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRMZWdhY3lEZWZhdWx0T3B0aW9uc1xyXG4gIDxUIGV4dGVuZHMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyB8IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdE9wdGlvbnM+KHNldHRpbmdzOiBJRGF0YUdyaWRTZXR0aW5ncyB8IElUcmVlTGlzdFNldHRpbmdzKTogVCB7XHJcbiAgcmV0dXJuIHtcclxuICAgIGFsbG93Q29sdW1uUmVzaXppbmc6IHRydWUsXHJcbiAgICByZW1vdGVPcGVyYXRpb25zOiB0cnVlLFxyXG4gICAgY29sdW1uQXV0b1dpZHRoOiB0cnVlLFxyXG4gICAgc2hvd0JvcmRlcnM6IHRydWUsXHJcbiAgICBmaWx0ZXJSb3c6IHsgdmlzaWJsZTogdHJ1ZSwgYXBwbHlGaWx0ZXI6ICdvbkNsaWNrJyB9LFxyXG5cclxuICAgIHNlbGVjdGlvbjogeyBtb2RlOiAnbXVsdGlwbGUnIH0sXHJcbiAgICBwYWdpbmc6IHsgcGFnZVNpemU6IDUwIH0sXHJcbiAgICBzZWFyY2hQYW5lbDogeyB2aXNpYmxlOiB0cnVlIH0sXHJcbiAgICBoZWFkZXJGaWx0ZXI6IHsgdmlzaWJsZTogdHJ1ZSB9LFxyXG4gICAgc2Nyb2xsaW5nOiB7IG1vZGU6ICd2aXJ0dWFsJyB9LFxyXG4gIH0gYXMgVDtcclxufVxyXG5cclxuZnVuY3Rpb24gcHJlcGFyZURlZmF1bHRUb29sYmFyQnV0dG9ucyh0b29sYmFyT3B0aW9uczogYW55LCB0b29sYmFyQWNjZW50QnV0dG9uTmFtZT86IHN0cmluZykge1xyXG4gIGNvbnN0IGZpbmRUb29sYmFySXRlbSA9IChpdGVtczogYW55W10sIG5hbWU6IHN0cmluZykgPT4gaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBuYW1lKTtcclxuXHJcbiAgaWYgKHRvb2xiYXJPcHRpb25zPy5pdGVtcykge1xyXG4gICAgY29uc3QgeyBpdGVtcyB9ID0gdG9vbGJhck9wdGlvbnM7XHJcblxyXG4gICAgaWYgKHRvb2xiYXJBY2NlbnRCdXR0b25OYW1lKSB7XHJcbiAgICAgIGNvbnN0IGFjY2VudEJ1dHRvbkl0ZW0gPSBmaW5kVG9vbGJhckl0ZW0oaXRlbXMsIHRvb2xiYXJBY2NlbnRCdXR0b25OYW1lKTtcclxuICAgICAgaWYgKGFjY2VudEJ1dHRvbkl0ZW0pIHtcclxuICAgICAgICBhY2NlbnRCdXR0b25JdGVtLm9wdGlvbnMudHlwZSA9ICdkZWZhdWx0JztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNhdmVCdXR0b25JdGVtID0gZmluZFRvb2xiYXJJdGVtKGl0ZW1zLCAnc2F2ZUJ1dHRvbicpO1xyXG4gICAgaWYgKHNhdmVCdXR0b25JdGVtKSB7XHJcbiAgICAgIHNhdmVCdXR0b25JdGVtLnNob3dUZXh0ID0gJ2Fsd2F5cyc7XHJcbiAgICAgIHNhdmVCdXR0b25JdGVtLm9wdGlvbnMudGV4dCA9ICdTYXZlJztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXZlcnRCdXR0b25JdGVtID0gZmluZFRvb2xiYXJJdGVtKGl0ZW1zLCAncmV2ZXJ0QnV0dG9uJyk7XHJcbiAgICBpZiAocmV2ZXJ0QnV0dG9uSXRlbSkge1xyXG4gICAgICByZXZlcnRCdXR0b25JdGVtLnNob3dUZXh0ID0gJ2Fsd2F5cyc7XHJcbiAgICAgIHJldmVydEJ1dHRvbkl0ZW0ub3B0aW9ucy50ZXh0ID0gJ0Rpc2NhcmQnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlZnJlc2hCdXR0b25JdGVtID0gZmluZFRvb2xiYXJJdGVtKGl0ZW1zLCAncmVmcmVzaCcpO1xyXG4gICAgaWYgKHJlZnJlc2hCdXR0b25JdGVtKSB7XHJcbiAgICAgIHJlZnJlc2hCdXR0b25JdGVtLnNob3dUZXh0ID0gJ2Fsd2F5cyc7XHJcbiAgICAgIHJlZnJlc2hCdXR0b25JdGVtLm9wdGlvbnMudGV4dCA9ICdSZWZyZXNoJztcclxuICAgICAgcmVmcmVzaEJ1dHRvbkl0ZW0ub3B0aW9ucy5oaW50ID0gJ1JlbG9hZCBEYXRhJztcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZVN1bW1hcnlDb2x1bW5JZlJlcXVpcmVkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gIGNvbnN0IHRvdGFsSXRlbXMgPSBncmlkLm9wdGlvbignc3VtbWFyeS50b3RhbEl0ZW1zJykgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snc3VtbWFyeSddWyd0b3RhbEl0ZW1zJ107XHJcbiAgY29uc3QgY3VycmVudFN1bW1hcnlDb2x1bW4gPSB0b3RhbEl0ZW1zPy5maWx0ZXIoKGkpID0+IGkuc3VtbWFyeVR5cGUgPT09ICdjb3VudCcpWzBdPy5jb2x1bW47XHJcblxyXG4gIGxldCBzdW1tYXJ5Q29sdW1uSW5kZXggPSBjdXJyZW50U3VtbWFyeUNvbHVtbiAmJiBncmlkLmdldFZpc2libGVDb2x1bW5zKCkuZmluZEluZGV4KChlbCkgPT4gZWwuZGF0YUZpZWxkID09PSBjdXJyZW50U3VtbWFyeUNvbHVtbik7XHJcbiAgaWYgKCFzdW1tYXJ5Q29sdW1uSW5kZXgpIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdyaWQub3B0aW9uKCdzZWxlY3Rpb24nKTtcclxuICAgIGNvbnN0IGhhc1NlbGVjdGlvbiA9IHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ubW9kZSAhPT0gJ25vbmUnO1xyXG4gICAgc3VtbWFyeUNvbHVtbkluZGV4ID0gaGFzU2VsZWN0aW9uID8gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpLmZpbmRJbmRleCgoZWwpID0+ICEhZWwuZGF0YUZpZWxkKSA6IDA7XHJcbiAgfVxyXG5cclxuICBjb25zdCBuZXdTdW1tYXJ5Q29sdW1uID0gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpW3N1bW1hcnlDb2x1bW5JbmRleF0/LmRhdGFGaWVsZDtcclxuXHJcbiAgaWYgKG5ld1N1bW1hcnlDb2x1bW4gJiYgY3VycmVudFN1bW1hcnlDb2x1bW4gIT09IG5ld1N1bW1hcnlDb2x1bW4pIHtcclxuICAgIGdyaWQub3B0aW9uKCdzdW1tYXJ5Jywge1xyXG4gICAgICB0b3RhbEl0ZW1zOiBbe1xyXG4gICAgICAgIGNvbHVtbjogZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpW3N1bW1hcnlDb2x1bW5JbmRleF0/LmRhdGFGaWVsZCxcclxuICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xyXG4gICAgICB9XVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGFuZGxlcnM8VCBleHRlbmRzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgfCBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zPihcclxuICB3aWRnZXQ6ICdkeERhdGFHcmlkJyB8ICdkeFRyZWVMaXN0JyxcclxuICBzZXR0aW5nczogSURhdGFHcmlkU2V0dGluZ3MgfCBJVHJlZUxpc3RTZXR0aW5nc1xyXG4pOiBUIHtcclxuICBjb25zdCBzZWxlY3RvcnMgPSBnZXRTZWxlY3RvcnMod2lkZ2V0KTtcclxuICBsZXQgaXNHcmlkSW5pdGlhbGl6YWVkID0gZmFsc2U7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBvbkNlbGxQcmVwYXJlZDogKGUpID0+IHtcclxuICAgICAgaWYgKCFjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcclxuICAgICAgICBpZiAoZS5yb3dUeXBlID09PSAnaGVhZGVyJykge1xyXG4gICAgICAgICAgZS5jZWxsRWxlbWVudC5jc3MoJ3RleHQtYWxpZ24nLCAnY2VudGVyJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc2V0dGluZ3Mub3B0aW9ucz8ub25DZWxsUHJlcGFyZWQpIHtcclxuICAgICAgICBzZXR0aW5ncy5vcHRpb25zPy5vbkNlbGxQcmVwYXJlZChlKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uQ29udGVudFJlYWR5OiAoZSkgPT4ge1xyXG4gICAgICBjb25zdCBkYXRhR3JpZCA9IGUuY29tcG9uZW50O1xyXG5cclxuICAgICAgaWYgKCFzZXR0aW5ncy5kaXNhYmxlU3VtbWFyeUNvbHVtbkRldGVjdGlvbikge1xyXG4gICAgICAgIHVwZGF0ZVN1bW1hcnlDb2x1bW5JZlJlcXVpcmVkKGRhdGFHcmlkKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFpc0dyaWRJbml0aWFsaXphZWQpIHtcclxuICAgICAgICBpc0dyaWRJbml0aWFsaXphZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAvL3RvIGZpeCBhdXRvc2Nyb2xsXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBzY3JvbGxhYmxlID0gZGF0YUdyaWQuZ2V0U2Nyb2xsYWJsZSgpO1xyXG5cclxuICAgICAgICAgIGlmIChzY3JvbGxhYmxlKSB7XHJcbiAgICAgICAgICAgIHNjcm9sbGFibGUuc2Nyb2xsVG8oeyB0b3A6IDAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YUdyaWQuY29sdW1uQ291bnQoKTsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgZGF0YVR5cGUgPSBkYXRhR3JpZC5jb2x1bW5PcHRpb24oaSwgJ2RhdGFUeXBlJyk7XHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5ncy5zZXREZWZhdWx0Q29sdW1uV2lkdGggfHwgc2V0dGluZ3Muc2V0RGVmYXVsdENvbHVtbldpZHRoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGlmICghZGF0YUdyaWQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcpKSB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgICAgICAgZGF0YUdyaWQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcsICc0NXB4Jyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2RhdGV0aW1lJykge1xyXG4gICAgICAgICAgICAgIGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnd2lkdGgnLCAnMTM1cHgnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnZGF0ZScpIHtcclxuICAgICAgICAgICAgICBkYXRhR3JpZC5jb2x1bW5PcHRpb24oaSwgJ3dpZHRoJywgJzE0MHB4Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdkYXRldGltZScgfHwgZGF0YVR5cGUgPT09ICdkYXRlJykge1xyXG4gICAgICAgICAgICBkYXRhR3JpZC5jb2x1bW5PcHRpb24oaSwgJ2FsaWdubWVudCcsICdyaWdodCcpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2RhdGUnKSB7XHJcbiAgICAgICAgICAgIGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnZm9ybWF0JywgJ2RkIE1NTSB5eXl5Jyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnZGF0ZXRpbWUnKSB7XHJcbiAgICAgICAgICAgIGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnZm9ybWF0JywgJ0hIOm1tLCBkZCBNTU0geXl5eScpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScpIHtcclxuICAgICAgICAgIFRoZW1lSGVscGVyLnNldFdpZGdldFNtYWxsU2l6ZSgkKHNlbGVjdG9ycy5zZWFyY2hQYW5lbCkuZHhUZXh0Qm94KCdpbnN0YW5jZScpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgVGhlbWVIZWxwZXIuc2V0V2lkZ2V0TWlkZGxlU2l6ZSgkKHNlbGVjdG9ycy5zZWFyY2hQYW5lbCkuZHhUZXh0Qm94KCdpbnN0YW5jZScpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIFRoZW1lSGVscGVyLnNldEVsZW1lbnRTbWFsbFNpemUoZS5jb21wb25lbnQuZWxlbWVudCgpLmZpbmQoc2VsZWN0b3JzLnNlbGVjdENoZWNrQm94KSk7XHJcblxyXG4gICAgICAgIGlmICgkKHNlbGVjdG9ycy50b29sYmFyRXhwb3J0QnV0dG9uKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBpZiAoc2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScpIHtcclxuICAgICAgICAgICAgVGhlbWVIZWxwZXIuc2V0V2lkZ2V0U21hbGxTaXplKCQoc2VsZWN0b3JzLnRvb2xiYXJFeHBvcnRCdXR0b24pLmR4QnV0dG9uKCdpbnN0YW5jZScpKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIFRoZW1lSGVscGVyLnNldFdpZGdldE1pZGRsZVNpemUoJChzZWxlY3RvcnMudG9vbGJhckV4cG9ydEJ1dHRvbikuZHhCdXR0b24oJ2luc3RhbmNlJykpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHNldHRpbmdzLm9wdGlvbnM/Lm9uQ29udGVudFJlYWR5KSB7XHJcbiAgICAgICAgc2V0dGluZ3Mub3B0aW9ucy5vbkNvbnRlbnRSZWFkeShlKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uVG9vbGJhclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgY29uc3Qge1xyXG4gICAgICAgIHRvb2xiYXJPcHRpb25zID0ge31cclxuICAgICAgfSA9IGU7XHJcblxyXG4gICAgICBjb25zdCBkYXRhR3JpZCA9IGUuY29tcG9uZW50O1xyXG5cclxuICAgICAgY29uc3Qge1xyXG4gICAgICAgIGl0ZW1zID0gW11cclxuICAgICAgfSA9IHRvb2xiYXJPcHRpb25zO1xyXG5cclxuICAgICAgaWYgKGNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICAgIGlmIChzZXR0aW5ncy50aXRsZSkge1xyXG4gICAgICAgICAgZS50b29sYmFyT3B0aW9ucy5pdGVtcy51bnNoaWZ0KHtcclxuICAgICAgICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZSgpIHtcclxuICAgICAgICAgICAgICBjb25zdCBoZWFkZXJFbCA9ICQoJzxoMiAvPicpLmFkZENsYXNzKCdncmlkLWhlYWRlcicpLnRleHQoc2V0dGluZ3MudGl0bGUpO1xyXG4gICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5oZWFkZXJEZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgaGVhZGVyRWwuYXBwZW5kKCQoJzxpIC8+JykuYWRkQ2xhc3MoJ2ZhcycpLmFkZENsYXNzKCdmYS1pbmZvLWNpcmNsZScpLmFkZENsYXNzKCdyZXBvcnQtZGV0YWlscy1saW5rJykuYXR0cigndGl0bGUnLCAnQ2xpY2sgdG8gc2VlIGZ1cnRoZXIgZGV0YWlscycpKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiBoZWFkZXJFbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXRlbS53aWRnZXQgPT09ICdkeEJ1dHRvbicgJiYgaXRlbS5uYW1lID09PSAnYXBwbHlGaWx0ZXJCdXR0b24nKSB7XHJcbiAgICAgICAgICAgIGl0ZW0ub3B0aW9ucy52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzLnRpdGxlKSB7XHJcbiAgICAgICAgICBpdGVtcy51bnNoaWZ0KFRvb2xiYXJIZWxwZXIuZ2V0VG9vbGJhclRpdGxlVGVtcGxhdGVJdGVtKHNldHRpbmdzLnRpdGxlLCBzZXR0aW5ncy5oZWFkZXJEZXNjcmlwdGlvbikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaXRlbXMuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChpdGVtLndpZGdldCA9PT0gJ2R4QnV0dG9uJykge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS5uYW1lID09PSAnYXBwbHlGaWx0ZXJCdXR0b24nKSB7XHJcbiAgICAgICAgICAgICAgaXRlbS5vcHRpb25zLnZpc2libGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpY29uU2l6ZSA9IHNldHRpbmdzLmJ1dHRvbnNTaXplID09PSAnc20nID8gMTYgOiAyNDtcclxuXHJcbiAgICAgICAgICAgIHN3aXRjaCAoaXRlbS5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgY2FzZSAnYWRkUm93QnV0dG9uJzpcclxuICAgICAgICAgICAgICAgIGl0ZW0ub3B0aW9ucy5pY29uID0gVGhlbWVIZWxwZXIuZ2V0SWNvbkNsYXNzKCdwbHVzJywgZmFsc2UsIGljb25TaXplKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICBjYXNlICdzYXZlQnV0dG9uJzpcclxuICAgICAgICAgICAgICAgIGl0ZW0ub3B0aW9ucy5pY29uID0gVGhlbWVIZWxwZXIuZ2V0SWNvbkNsYXNzKCdzYXZlJywgZmFsc2UsIGljb25TaXplKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICBjYXNlICdyZXZlcnRCdXR0b24nOlxyXG4gICAgICAgICAgICAgICAgaXRlbS5vcHRpb25zLmljb24gPSBUaGVtZUhlbHBlci5nZXRJY29uQ2xhc3MoJ2Nsb3NlJywgZmFsc2UsIGljb25TaXplKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgaXRlbS5vcHRpb25zLmljb24gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFpdGVtLm9wdGlvbnMuZWxlbWVudEF0dHIpIHtcclxuICAgICAgICAgICAgICBpdGVtLm9wdGlvbnMuZWxlbWVudEF0dHIgPSB7fTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaXRlbS5vcHRpb25zLmVsZW1lbnRBdHRyLmNsYXNzID0gc2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScgPyBUSEVNRV9DTEFTU0VTLnNtIDogVEhFTUVfQ0xBU1NFUy5tZDtcclxuICAgICAgICAgICAgaXRlbS5zaG93VGV4dCA9ICdhbHdheXMnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBwcmVwYXJlRGVmYXVsdFRvb2xiYXJCdXR0b25zKHRvb2xiYXJPcHRpb25zLCBzZXR0aW5ncy50b29sYmFyQWNjZW50QnV0dG9uTmFtZSk7XHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5ncy50b29sYmFySXRlbXMpIHtcclxuICAgICAgICAgIGl0ZW1zLnB1c2goLi4uc2V0dGluZ3MudG9vbGJhckl0ZW1zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRvb2xiYXJPcHRpb25zLmVsZW1lbnRBdHRyID0ge1xyXG4gICAgICAgICAgY2xhc3M6ICdpc296LXRvb2xiYXItaGVhZGVyJ1xyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHNhdmVCdXR0b25JbmRleCA9IGUudG9vbGJhck9wdGlvbnMuaXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdzYXZlQnV0dG9uJyk7XHJcbiAgICAgIGNvbnN0IHNlYXJjaFBhbmVsSW5kZXggPSBlLnRvb2xiYXJPcHRpb25zLml0ZW1zLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSAnc2VhcmNoUGFuZWwnKTtcclxuICAgICAgbGV0IGluZGV4Rm9yVXBkYXRlID0gLTE7XHJcblxyXG4gICAgICBpZiAoc2F2ZUJ1dHRvbkluZGV4ID4gLTEpIHtcclxuICAgICAgICBpbmRleEZvclVwZGF0ZSA9IHNhdmVCdXR0b25JbmRleDtcclxuICAgICAgfSBlbHNlIGlmIChzZWFyY2hQYW5lbEluZGV4ID4gLTEpIHtcclxuICAgICAgICBpbmRleEZvclVwZGF0ZSA9IHNlYXJjaFBhbmVsSW5kZXg7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaW5kZXhGb3JVcGRhdGUgPSBlLnRvb2xiYXJPcHRpb25zLml0ZW1zLmxlbmd0aDtcclxuICAgICAgfVxyXG5cclxuICAgICAgZS50b29sYmFyT3B0aW9ucy5pdGVtcy5zcGxpY2UoaW5kZXhGb3JVcGRhdGUsIDAsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgICAgICBuYW1lOiAncmVmcmVzaCcsXHJcbiAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIGljb246ICdyZWZyZXNoJyxcclxuICAgICAgICAgICAgaGVpZ2h0OiBjb25maWcuaXNMZWdhY3lSZW5kZXIgPyAzMCA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgZWxlbWVudEF0dHI6IHsgY2xhc3M6IGBkeC1kYXRhZ3JpZC10b29sYmFyLWJ1dHRvbiAke3NldHRpbmdzLmJ1dHRvbnNTaXplID09PSAnc20nID8gVEhFTUVfQ0xBU1NFUy5zbSA6IFRIRU1FX0NMQVNTRVMubWR9YCB9LFxyXG4gICAgICAgICAgICBzdHlsaW5nTW9kZTogY29uZmlnLmlzTGVnYWN5UmVuZGVyID8gJ3RleHQnIDogJ2NvbnRhaW5lZCcsXHJcbiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IGRhdGFHcmlkPy5yZWZyZXNoKCksXHJcbiAgICAgICAgICAgIG9uQ29udGVudFJlYWR5OiBjb25maWcuaXNMZWdhY3lSZW5kZXIgPyAoY29udGVudFJlYWR5RXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICBjb250ZW50UmVhZHlFdmVudC5lbGVtZW50LmZpbmQoJy5keC1idXR0b24tY29udGVudCcpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICBwYWRkaW5nVG9wOiA2LFxyXG4gICAgICAgICAgICAgICAgcGFkZGluZ0JvdHRvbTogNlxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IDogdW5kZWZpbmVkXHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b24uUHJvcGVydGllc1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmIChzZXR0aW5ncy5vcHRpb25zPy5vblRvb2xiYXJQcmVwYXJpbmcpIHtcclxuICAgICAgICBzZXR0aW5ncy5vcHRpb25zLm9uVG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uRWRpdG9yUHJlcGFyaW5nOiAoZSkgPT4ge1xyXG4gICAgICBpZiAoIWNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICAgIGUuZWRpdG9yT3B0aW9ucyA9IHtcclxuICAgICAgICAgIC4uLmUuZWRpdG9yT3B0aW9ucyxcclxuICAgICAgICAgIGVsZW1lbnRBdHRyOiB7XHJcbiAgICAgICAgICAgIGNsYXNzOiBUSEVNRV9DTEFTU0VTLm1kXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKGUuZWRpdG9yTmFtZSA9PT0gJ2R4U2VsZWN0Qm94Jykge1xyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLmRyb3BEb3duT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgLi4uZS5lZGl0b3JPcHRpb25zLmRyb3BEb3duT3B0aW9ucyxcclxuICAgICAgICAgICAgb25TaG93aW5nOiAoYXJnczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgd2lkZ2V0TmFtZSA9IGdldFdpZGdldE5hbWUod2lkZ2V0KTtcclxuICAgICAgICAgICAgICBhcmdzLmNvbXBvbmVudC5fJHBvcHVwQ29udGVudC5hZGRDbGFzcyhgaXNvei0ke3dpZGdldE5hbWV9LXNlbGVjdGJveC1wb3B1cGApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGUuZWRpdG9yTmFtZSA9PT0gJ2R4Q2hlY2tCb3gnKSB7XHJcbiAgICAgICAgICBUaGVtZUhlbHBlci5zZXRFbGVtZW50U21hbGxTaXplKGUuZWRpdG9yRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBzd2l0Y2ggKGUucGFyZW50VHlwZSkge1xyXG4gICAgICAgIGNhc2UgJ2ZpbHRlclJvdyc6XHJcbiAgICAgICAgICBjb25zdCBhcHBseUZpbHRlcjogRGV2RXhwcmVzcy51aS5keFRleHRFZGl0b3IuUHJvcGVydGllc1snb25FbnRlcktleSddID0gKGFyZ3MpID0+IHtcclxuICAgICAgICAgICAgZS5lbGVtZW50ICYmIGUuZWxlbWVudC5maW5kKCcuZHgtYXBwbHktYnV0dG9uJykudHJpZ2dlcignZHhjbGljaycpO1xyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25FbnRlcktleSA9IGFwcGx5RmlsdGVyO1xyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uRm9jdXNPdXQgPSBhcHBseUZpbHRlcjtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnc2VhcmNoUGFuZWwnOlxyXG4gICAgICAgICAgY29uc3QgYXBwbHlTZWFyY2g6IERldkV4cHJlc3MudWkuZHhUZXh0RWRpdG9yLlByb3BlcnRpZXNbJ29uRW50ZXJLZXknXSA9IChhcmdzKSA9PiB7XHJcbiAgICAgICAgICAgIGUuY29tcG9uZW50LnNlYXJjaEJ5VGV4dChhcmdzLmNvbXBvbmVudC5vcHRpb24oJ3ZhbHVlJykpO1xyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25WYWx1ZUNoYW5nZWQgPSAoKSA9PiB7IH07XHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25FbnRlcktleSA9IGFwcGx5U2VhcmNoO1xyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uRm9jdXNPdXQgPSBhcHBseVNlYXJjaDtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHNldHRpbmdzLm9wdGlvbnM/Lm9uRWRpdG9yUHJlcGFyaW5nKSB7XHJcbiAgICAgICAgc2V0dGluZ3Mub3B0aW9ucy5vbkVkaXRvclByZXBhcmluZyhlKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uQ29udGV4dE1lbnVQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgIGlmICghY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgICAgaWYgKGUudGFyZ2V0ID09PSAnY29udGVudCcgJiYgISFzZXR0aW5ncy5leHBvcnRGaWxlTmFtZSkge1xyXG4gICAgICAgICAgaWYgKCFlLml0ZW1zKSB7XHJcbiAgICAgICAgICAgIGUuaXRlbXMgPSBbXTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBlLml0ZW1zLnB1c2goe1xyXG4gICAgICAgICAgICB0ZXh0OiAnRXhwb3J0IGFsbCBkYXRhJyxcclxuICAgICAgICAgICAgb25JdGVtQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICBlLmNvbXBvbmVudC5leHBvcnRUb0V4Y2VsKGZhbHNlKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgaWNvbjogJ3hsc3hmaWxlJ1xyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4Q29udGV4dE1lbnVJdGVtKTtcclxuXHJcbiAgICAgICAgICBpZiAoc2V0dGluZ3Mub3B0aW9ucy5zZWxlY3Rpb24/Lm1vZGUgIT09ICdub25lJykge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSBlLmNvbXBvbmVudC5nZXRTZWxlY3RlZFJvd0tleXMoKTtcclxuXHJcbiAgICAgICAgICAgIGUuaXRlbXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ0V4cG9ydCBzZWxlY3RlZCByb3dzJyxcclxuICAgICAgICAgICAgICBvbkl0ZW1DbGljazogKCkgPT4gZS5jb21wb25lbnQuZXhwb3J0VG9FeGNlbCh0cnVlKSxcclxuICAgICAgICAgICAgICBpY29uOiAnZXhwb3J0c2VsZWN0ZWQnLFxyXG4gICAgICAgICAgICAgIGRpc2FibGVkOiAhc2VsZWN0ZWRSb3dzIHx8ICFzZWxlY3RlZFJvd3MubGVuZ3RoXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keENvbnRleHRNZW51SXRlbSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc2V0dGluZ3Mub3B0aW9ucz8ub25Db250ZXh0TWVudVByZXBhcmluZykge1xyXG4gICAgICAgIHNldHRpbmdzLm9wdGlvbnM/Lm9uQ29udGV4dE1lbnVQcmVwYXJpbmcoZSk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBvbkV4cG9ydGluZzogISFzZXR0aW5ncy5leHBvcnRGaWxlTmFtZSA/IGNyZWF0ZUdyaWRFeHBvcnRGbihzZXR0aW5ncy5leHBvcnRGaWxlTmFtZSkgOiB2b2lkIDAsXHJcbiAgfSBhcyBUO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBjcmVhdGVEYXRhR3JpZCwgY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkIH0gZnJvbSAnLi9DcmVhdGVGdWxsU2NyZWVuR3JpZCc7XHJcbmltcG9ydCB7IGdldEdyaWREZWZhdWx0T3B0aW9ucywgZ2V0SGFuZGxlcnMsIElEYXRhR3JpZFNldHRpbmdzIH0gZnJvbSAnLi9EZWZhdWx0R3JpZEJhc2UnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZWw6IEpRdWVyeSwgc2V0dGluZ3M6IElEYXRhR3JpZFNldHRpbmdzKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IGdldEdyaWREZWZhdWx0T3B0aW9ucyhzZXR0aW5ncyk7XHJcbiAgbGV0IG1lcmdlZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgZGVmYXVsdE9wdGlvbnMsIHNldHRpbmdzLm9wdGlvbnMpO1xyXG4gIGNvbnN0IGhhbmRsZXJzID0gZ2V0SGFuZGxlcnM8RGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucz4oJ2R4RGF0YUdyaWQnLCAkLmV4dGVuZCh0cnVlLCB7fSwgc2V0dGluZ3MsIHsgb3B0aW9uczogbWVyZ2VkT3B0aW9ucyB9KSk7XHJcblxyXG4gIG1lcmdlZE9wdGlvbnMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgbWVyZ2VkT3B0aW9ucywgaGFuZGxlcnMpO1xyXG5cclxuICBpZiAoc2V0dGluZ3MuaXNGdWxsU2NyZWVuIHx8IHNldHRpbmdzLmlzRnVsbFNjcmVlbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICByZXR1cm4gY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkKGVsLCBtZXJnZWRPcHRpb25zLCBzZXR0aW5ncy5pblBhbmVsR3JpZCk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBjcmVhdGVEYXRhR3JpZChlbCwgbWVyZ2VkT3B0aW9ucyk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJR3JpZEFkZGl0aW9uYWxPcHRpb25zIH0gZnJvbSAnLi9DcmVhdGVGdWxsU2NyZWVuR3JpZCc7XHJcbmltcG9ydCBkZWZhdWx0R3JpZCBmcm9tICcuL0RlZmF1bHRHcmlkJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKFxyXG4gIGlkOiBzdHJpbmcsIGRhdGFHcmlkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnM6IElHcmlkQWRkaXRpb25hbE9wdGlvbnMgPSB7fSxcclxuICBoZWFkZXJUZXh0Pzogc3RyaW5nLCBoZWFkZXJEZXNjcmlwdGlvbj86IHN0cmluZ1xyXG4pOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gIHJldHVybiBkZWZhdWx0R3JpZCgkKGAjJHtpZH1gKSwge1xyXG4gICAgb3B0aW9uczogZGF0YUdyaWRPcHRpb25zLFxyXG4gICAgZXhwb3J0RmlsZU5hbWU6IGFkZGl0aW9uYWxPcHRpb25zLmV4cG9ydEZpbGVOYW1lLFxyXG4gICAgaW5QYW5lbEdyaWQ6IGFkZGl0aW9uYWxPcHRpb25zLmluUGFuZWxHcmlkLFxyXG4gICAgc2hvd1N1bW1hcnlJbkNvbHVtbjogYWRkaXRpb25hbE9wdGlvbnMuc2hvd1N1bW1hcnlJbkNvbHVtbixcclxuICAgIHN1bW1hcnlDb2x1bW46IGFkZGl0aW9uYWxPcHRpb25zLnN1bW1hcnlDb2x1bW4sXHJcbiAgICBoZWFkZXJEZXNjcmlwdGlvbixcclxuICAgIHRpdGxlOiBoZWFkZXJUZXh0XHJcbiAgfSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElUcmVlTGlzdFNldHRpbmdzLCBnZXRUcmVlTGlzdERlZmF1bHRPcHRpb25zLCBnZXRIYW5kbGVycyB9IGZyb20gJy4vRGVmYXVsdEdyaWRCYXNlJztcclxuaW1wb3J0IHsgY3JlYXRlRnVsbFNjcmVlblRyZWVMaXN0IH0gZnJvbSAnLi9DcmVhdGVGdWxsU2NyZWVuR3JpZCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihcclxuICBpZDogc3RyaW5nIHwgSlF1ZXJ5LFxyXG4gIHNldHRpbmdzOiBJVHJlZUxpc3RTZXR0aW5ncyA9IHt9XHJcbik6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdCB7XHJcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSBnZXRUcmVlTGlzdERlZmF1bHRPcHRpb25zKHNldHRpbmdzKTtcclxuICBsZXQgbWVyZ2VkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keFRyZWVMaXN0T3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBkZWZhdWx0T3B0aW9ucywgc2V0dGluZ3Mub3B0aW9ucyk7XHJcbiAgY29uc3QgaGFuZGxlcnMgPSBnZXRIYW5kbGVyczxEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zPignZHhUcmVlTGlzdCcsICQuZXh0ZW5kKHRydWUsIHt9LCBzZXR0aW5ncywgeyBvcHRpb25zOiBtZXJnZWRPcHRpb25zIH0pKTtcclxuXHJcbiAgbWVyZ2VkT3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBtZXJnZWRPcHRpb25zLCBoYW5kbGVycyk7XHJcblxyXG4gIHJldHVybiBjcmVhdGVGdWxsU2NyZWVuVHJlZUxpc3QoaWQsIG1lcmdlZE9wdGlvbnMsIHNldHRpbmdzLmluUGFuZWxHcmlkKTtcclxufVxyXG4iLCAiaW1wb3J0IENyb3BwciBmcm9tICdjcm9wcHInO1xyXG5pbXBvcnQgeyBjcmVhdGVEaWFsb2cgfSBmcm9tICcuLi9Qb3B1cCc7XHJcblxyXG5pbXBvcnQgSW5pdGlhbGl6ZWRFdmVudEluZm8gPSBEZXZFeHByZXNzLmV2ZW50cy5Jbml0aWFsaXplZEV2ZW50SW5mbztcclxuXHJcbmNvbnN0IGF2YXRhclNpemUgPSB7XHJcbiAgaGVpZ2h0OiAzMDAsXHJcbiAgd2lkdGg6IDMwMCxcclxufVxyXG5cclxuZnVuY3Rpb24gc2V0SW1hZ2VUb1ByZXZpZXcgKHByZXZpZXc6IEpRdWVyeSwgYmFzZTY0SW1nOiBzdHJpbmcgfCBudWxsKSB7XHJcbiAgcHJldmlldy5hdHRyKCdzcmMnLCBiYXNlNjRJbWcpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVDb250ZW50TWFya3VwIChpbWFnZUJhc2U2NDogc3RyaW5nIHwgbnVsbCkge1xyXG4gIGNvbnN0ICRhdmF0YXJQb3B1cENvbnRlbnQgPSAkKCc8ZGl2PicpXHJcbiAgICAuYWRkQ2xhc3MoJ2F2YXRhci1wb3B1cF9fZHJvcHpvbmUnKTtcclxuICAvLy5vbignZHJvcCcgLCBldiA9PiBldi5kYXRhVHJhbnNmZXIuZmlsZXMpXHJcblxyXG4gIGNvbnN0ICRjcm9wcGVyQ29udGFpbmVyID0gJCgnPGRpdj4nKVxyXG4gICAgLmFkZENsYXNzKCdhdmF0YXItcG9wdXBfX2Nyb3AtY29udGFpbmVyJylcclxuICAgIC5hcHBlbmRUbygkYXZhdGFyUG9wdXBDb250ZW50KTtcclxuXHJcbiAgY29uc3QgJGNyb3BJbWFnZSA9ICQoJzxpbWcgLz4nKS5wcmVwZW5kVG8oJGNyb3BwZXJDb250YWluZXIpO1xyXG5cclxuICBzZXRJbWFnZVRvUHJldmlldygkY3JvcEltYWdlLCBpbWFnZUJhc2U2NCk7XHJcblxyXG4gIGNvbnN0IGNyb3BwZXIgPSBuZXcgQ3JvcHByKCRjcm9wSW1hZ2VbMF0sIHtcclxuICAgIGFzcGVjdFJhdGlvOiAxLFxyXG4gICAgc3RhcnRTaXplOiBbOTAsIDkwXSxcclxuICB9KTtcclxuXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICAkY29udGVudDogJGF2YXRhclBvcHVwQ29udGVudCxcclxuICAgIGNyb3BwZXJcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93UG9wdXAgKCRjb250ZW50OiBKUXVlcnksIGNyb3BwZXI6IENyb3Bwciwgb25BdmF0YXJVcGRhdGVkOiAocGhvdG9CYXNlNjQ6IHN0cmluZykgPT4gdm9pZCkge1xyXG4gIGNyZWF0ZURpYWxvZyhcclxuICAgIHtcclxuICAgICAgdGl0bGU6ICdVcGRhdGUgcHJvZmlsZSBwaWN0dXJlJyxcclxuICAgICAgc2hvd1RpdGxlOiB0cnVlLFxyXG4gICAgICBkcmFnRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIHJlc2l6ZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsXHJcbiAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxyXG4gICAgICBtYXhXaWR0aDogMTAyNCxcclxuICAgICAgb25Jbml0aWFsaXplZDogKGU6IEluaXRpYWxpemVkRXZlbnRJbmZvPERldkV4cHJlc3MudWkuZHhQb3B1cD4pID0+IHtcclxuICAgICAgICBlLmNvbXBvbmVudCAmJiBlLmNvbXBvbmVudC5vcHRpb24oJ2Z1bGxTY3JlZW4nLCB3aW5kb3cuaW5uZXJXaWR0aCA8PSAxMDI0KTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgICRjb250ZW50LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiAnVXBkYXRlJyxcclxuICAgICAgb25DbGljazogKGNsb3NlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY3JvcE9wdGlvbnMgPSBjcm9wcGVyLmdldFZhbHVlKCk7XHJcbiAgICAgICAgY29uc3QgJGNhbnZhczogSlF1ZXJ5PEhUTUxDYW52YXNFbGVtZW50PiA9ICQoJzxjYW52YXM+JykuYXR0cignaGVpZ2h0JywgYXZhdGFyU2l6ZS5oZWlnaHQpLmF0dHIoJ3dpZHRoJywgYXZhdGFyU2l6ZS53aWR0aCkgYXMgSlF1ZXJ5PEhUTUxDYW52YXNFbGVtZW50PjtcclxuICAgICAgICBjb25zdCBjdHggPSAoJGNhbnZhc1swXSBhcyBhbnkpLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICAgICAgY29uc3QgJGltYWdlID0gJGNvbnRlbnQuZmluZCgnaW1nLmNyb3Bwci1pbWFnZScpWzBdO1xyXG5cclxuICAgICAgICBjdHguZHJhd0ltYWdlKCRpbWFnZSwgY3JvcE9wdGlvbnMueCwgY3JvcE9wdGlvbnMueSwgY3JvcE9wdGlvbnMud2lkdGgsIGNyb3BPcHRpb25zLmhlaWdodCwgMCwgMCwgYXZhdGFyU2l6ZS53aWR0aCwgYXZhdGFyU2l6ZS5oZWlnaHQpO1xyXG5cclxuICAgICAgICBjb25zdCBjcm9wcGVkID0gJGNhbnZhc1swXS50b0RhdGFVUkwoJ2ltYWdlL2pwZWcnLCAwLjkpO1xyXG5cclxuICAgICAgICBvbkF2YXRhclVwZGF0ZWQoY3JvcHBlZCk7XHJcbiAgICAgICAgY2xvc2UoKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdGV4dDogJ0NhbmNlbCcsXHJcbiAgICAgIG9uQ2xpY2s6IChjbG9zZSkgPT4gY2xvc2UoKVxyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzaG93IChpbWFnZUJhc2U2NDogc3RyaW5nIHwgbnVsbCwgb25BdmF0YXJVcGRhdGVkOiAocGhvdG9CYXNlNjQ6IHN0cmluZykgPT4gdm9pZCkge1xyXG4gIGNvbnN0IGNvbnRlbnQgPSBjcmVhdGVDb250ZW50TWFya3VwKGltYWdlQmFzZTY0KTtcclxuXHJcbiAgc2hvd1BvcHVwKGNvbnRlbnQuJGNvbnRlbnQsIGNvbnRlbnQuY3JvcHBlciwgb25BdmF0YXJVcGRhdGVkKTtcclxufVxyXG4iLCAiZXhwb3J0IGNvbnN0IGdldEJhc2U2NCA9IChmaWxlOiBGaWxlKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiA9PiB7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG5cclxuICAgICAgZmlsZVJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZmlsZVJlYWRlci5yZXN1bHQ7XHJcbiAgICAgICAgcmVzb2x2ZSh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyA/IHJlc3VsdCA6IG51bGwpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgZmlsZVJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG5cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn07XHJcbiIsICJpbXBvcnQge0lSZW5kZXJlZH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHtEZXZFeHByZXNzRXZlbnRBcmdzfSBmcm9tICcuLi8uLi9VdGlscy9EZXZFeHByZXNzRXZlbnRBcmdzJztcclxuaW1wb3J0IHsgc2hvdyB9IGZyb20gJy4uLy4uL1dpZGdldHMvSW1hZ2VDcm9wRGlhbG9nJztcclxuaW1wb3J0IHtnZXRCYXNlNjR9IGZyb20gJy4uLy4uL1dpZGdldHMvSW1hZ2VDcm9wRGlhbG9nL0hlbHBlcnMnO1xyXG5pbXBvcnQgZHhUZXh0Qm94T3B0aW9ucyA9IERldkV4cHJlc3MudWkuZHhUZXh0Qm94T3B0aW9ucztcclxuaW1wb3J0IGR4VGV4dEJveCA9IERldkV4cHJlc3MudWkuZHhUZXh0Qm94O1xyXG5pbXBvcnQgSXN6b2xlYVVJIGZyb20gJy4uLy4uL2luZGV4JztcclxuXHJcbmNvbnN0IG1heEZpbGVNYlNpemUgPSAxMDtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUFjY291bnRTZXR0aW5nc0RhdGEge1xyXG4gIFVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgRmlyc3ROYW1lOiBzdHJpbmc7XHJcbiAgTGFzdE5hbWU6IHN0cmluZztcclxuICBQaG9uZU51bWJlcjogc3RyaW5nO1xyXG4gIEVtYWlsOiBzdHJpbmc7XHJcbiAgT2xkUGFzc3dvcmQ6IHN0cmluZztcclxuICBOZXdQYXNzd29yZDogc3RyaW5nO1xyXG4gIE5ld1Bhc3N3b3JkUmVwZWF0OiBzdHJpbmc7XHJcbiAgQXZhdGFyOiBzdHJpbmc7XHJcbiAgSGFzQ2hhbmdlczogYm9vbGVhbjtcclxuICBFcnJvck1lc3NhZ2U6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVXNlciB7XHJcbiAgSWQ6IHN0cmluZztcclxuICBVc2VyTmFtZTogc3RyaW5nO1xyXG4gIEZpcnN0TmFtZTogc3RyaW5nO1xyXG4gIExhc3ROYW1lOiBzdHJpbmc7XHJcbiAgVXNlckF2YXRhcjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQWNjb3VudFNldHRpbmdzUGFnZSBpbXBsZW1lbnRzIElSZW5kZXJlZCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjdXJyZW50VXNlckluZm86IElVc2VyIHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyByZWFkb25seSBhY2NvdW50U2V0dGluZ3NEYXRhOiBJQWNjb3VudFNldHRpbmdzRGF0YSB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgcmVhZG9ubHkgZm9ybUFjdGlvbjogc3RyaW5nO1xyXG4gIHByaXZhdGUgYXZhdGFyVXBsb2FkZXI6IERldkV4cHJlc3MudWkuZHhGaWxlVXBsb2FkZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBhY2NvdW50U2V0dGluZ3NGb3JtOiBEZXZFeHByZXNzLnVpLmR4Rm9ybSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLy8gZWxlbWVudHNcclxuICBwcml2YXRlIHJlYWRvbmx5IF8kcm9vdEVsZW1lbnQ6IEpRdWVyeTxIVE1MRGl2RWxlbWVudD4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgJGNvbnRhaW5lcjogSlF1ZXJ5PEhUTUxEaXZFbGVtZW50PixcclxuICAgIGZvcm1BY3Rpb246IHN0cmluZyxcclxuICAgIGFjY291bnRTZXR0aW5nc0RhdGE6IElBY2NvdW50U2V0dGluZ3NEYXRhIHwgdW5kZWZpbmVkLFxyXG4gICAgdXNlckluZm86IElVc2VyIHwgdW5kZWZpbmVkXHJcbiAgKSB7XHJcbiAgICB0aGlzLmFjY291bnRTZXR0aW5nc0RhdGEgPSBhY2NvdW50U2V0dGluZ3NEYXRhO1xyXG4gICAgdGhpcy5jdXJyZW50VXNlckluZm8gPSB1c2VySW5mbztcclxuICAgIHRoaXMuXyRyb290RWxlbWVudCA9ICRjb250YWluZXI7XHJcbiAgICB0aGlzLmZvcm1BY3Rpb24gPSBmb3JtQWN0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIHRoaXMucmVuZGVyVXBsb2FkZXIodGhpcy4kcm9vdEVsZW1lbnQpO1xyXG4gICAgdGhpcy5yZW5kZXJBY2NvdW50U2V0dGluZ3NGb3JtKHRoaXMuJHJvb3RFbGVtZW50KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0ICRyb290RWxlbWVudCgpIHtcclxuICAgIGlmICghdGhpcy5fJHJvb3RFbGVtZW50KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHJvb3QgZWxlbWVudCBpcyB1bmRlZmluZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fJHJvb3RFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJVcGxvYWRlcigkY29udGFpbmVyOiBKUXVlcnkpIHtcclxuICAgIHRoaXMuYXZhdGFyVXBsb2FkZXIgPSAkKCc8ZGl2PicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXZhdGFyLXBvcHVwX191cGxvYWRlcicpXHJcbiAgICAgIC5keEZpbGVVcGxvYWRlcih7XHJcbiAgICAgICAgbXVsdGlwbGU6IGZhbHNlLFxyXG4gICAgICAgIHVwbG9hZE1vZGU6ICd1c2VGb3JtJyxcclxuICAgICAgICBhY2NlcHQ6ICdpbWFnZS8qJyxcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcclxuICAgICAgICBtYXhGaWxlU2l6ZTogbWF4RmlsZU1iU2l6ZSAqIDEwMDAwMDAsXHJcblxyXG4gICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoZTogRGV2RXhwcmVzc0V2ZW50QXJnczxEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyT3B0aW9ucywgJ29uVmFsdWVDaGFuZ2VkJz4pID0+IHtcclxuICAgICAgICAgIGlmICghZS5jb21wb25lbnQgfHwgIWUudmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29uc3QgZmlsZSA9IGUudmFsdWVbMF07XHJcbiAgICAgICAgICBjb25zdCBtYXhTaXplID0gZS5jb21wb25lbnQub3B0aW9uKCdtYXhGaWxlU2l6ZScpIHx8IG1heEZpbGVNYlNpemU7XHJcblxyXG4gICAgICAgICAgaWYgKCFmaWxlIHx8IGZpbGUuc2l6ZSA+IG1heFNpemUpIHtcclxuICAgICAgICAgICAgRGV2RXhwcmVzcy51aS5ub3RpZnkoYEZpbGUgc2l6ZSBzaG91bGQgYmUgbGVzcyB0aGFuICR7bWF4RmlsZU1iU2l6ZX0gTUIuIFBsZWFzZSBzZWxlY3QgYW5vdGhlciBmaWxlYCwgJ2Vycm9yJywgNTAwMCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgZ2V0QmFzZTY0KGZpbGUpXHJcbiAgICAgICAgICAgIC50aGVuKChpbWFnZUJhc2U2NCkgPT4ge1xyXG4gICAgICAgICAgICAgIHNob3coaW1hZ2VCYXNlNjQsIChuZXdJbWdTb3VyY2UpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudFNldHRpbmdzRm9ybT8udXBkYXRlRGF0YSgnQXZhdGFyJywgbmV3SW1nU291cmNlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudFNldHRpbmdzRm9ybT8ucmVwYWludCgpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiBEZXZFeHByZXNzLnVpLm5vdGlmeShlcnJvciwgJ2Vycm9yJywgMzAwMCkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pXHJcbiAgICAgIC5hcHBlbmRUbygkY29udGFpbmVyKVxyXG4gICAgICAuZHhGaWxlVXBsb2FkZXIoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckFjY291bnRTZXR0aW5nc0Zvcm0oJGNvbnRhaW5lcjogSlF1ZXJ5KSB7XHJcbiAgICBpZiAodGhpcy5hY2NvdW50U2V0dGluZ3NGb3JtKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFjY291bnRTZXR0aW5nc0Zvcm0gPSAkKCc8Zm9ybSAvPicpXHJcbiAgICAgIC5hdHRyKCdhY3Rpb24nLCB0aGlzLmZvcm1BY3Rpb24pXHJcbiAgICAgIC5hdHRyKCdtZXRob2QnLCAncG9zdCcpXHJcbiAgICAgIC5hZGRDbGFzcygnYWNjb3VudC1zZXR0aW5nc19fZm9ybScpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9ybS1jb250ZW50JylcclxuICAgICAgLmFwcGVuZFRvKCRjb250YWluZXIpXHJcbiAgICAgIC5keEZvcm0odGhpcy5nZXRGb3JtT3B0aW9ucygpKVxyXG4gICAgICAuZHhGb3JtKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIGlmICh0aGlzLmFjY291bnRTZXR0aW5nc0RhdGE/Lkhhc0NoYW5nZXMgJiYgIXRoaXMuYWNjb3VudFNldHRpbmdzRGF0YS5FcnJvck1lc3NhZ2UpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiBJc3pvbGVhVUkud2lkZ2V0cy5ub3RpZnkoJ0NoYW5nZXMgaGF2ZSBiZWVuIHNhdmVkJywgdHJ1ZSksIDUwMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZvcm1PcHRpb25zKCkgOiBEZXZFeHByZXNzLnVpLmR4Rm9ybU9wdGlvbnMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZm9ybURhdGE6IHRoaXMuYWNjb3VudFNldHRpbmdzRGF0YSxcclxuICAgICAgbWluQ29sV2lkdGg6IDIwMCxcclxuICAgICAgbGFiZWxMb2NhdGlvbjogJ3RvcCcsXHJcbiAgICAgIGFsaWduSXRlbUxhYmVsczogdHJ1ZSxcclxuICAgICAgc2hvd1ZhbGlkYXRpb25TdW1tYXJ5OiB0cnVlLFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxyXG4gICAgICAgICAgY29sQ291bnQ6IDE2LFxyXG4gICAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGNvbFNwYW46IDYsXHJcbiAgICAgICAgICAgICAgY2FwdGlvbjogJ1Byb2ZpbGUgUGljdHVyZScsXHJcbiAgICAgICAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdBdmF0YXInLFxyXG4gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0ICRhdmF0YXJWaWV3Q29udGFpbmVyID0gJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19hdmF0YXItdmlldy1jb250YWluZXInKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgJGF2YXRhckNvbnRhaW5lciA9ICQoJzxkaXY+JylcclxuICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnYWNjb3VudC1zZXR0aW5nc19fYXZhdGFyJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICQoJzxkaXY+JylcclxuICAgICAgICAgICAgICAgICAgICAgIC5hZGQoJGF2YXRhclZpZXdDb250YWluZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAuYWRkKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKCc8ZGl2PicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19hdmF0YXItYnV0dG9uJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAuZHhCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDIwMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdkZWZhdWx0JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICdwaG90bycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnVXBsb2FkIG5ldyBpbWFnZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4gdGhpcy5hdmF0YXJVcGxvYWRlciAmJiB0aGlzLmF2YXRhclVwbG9hZGVyLm9wdGlvbignZGlhbG9nVHJpZ2dlcicsIGUuZWxlbWVudClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgKS5hcHBlbmRUbygkYXZhdGFyQ29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXZhdGFyQmFzZTY0ID0gZGF0YS5lZGl0b3JPcHRpb25zLnZhbHVlIHx8IHRoaXMuY3VycmVudFVzZXJJbmZvPy5Vc2VyQXZhdGFyO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYXZhdGFyQmFzZTY0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAkKCc8aW1nPicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnYWNjb3VudC1zZXR0aW5nc19fYXZhdGFyLXZpZXcnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignc3JjJywgYXZhdGFyQmFzZTY0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJGF2YXRhclZpZXdDb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmVkaXRvck9wdGlvbnMudmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJCgnPGlucHV0PicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19hdmF0YXItaW5wdXQnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCd0eXBlJywgJ3RleHQnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCduYW1lJywgJ0F2YXRhcicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRhdmF0YXJDb250YWluZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhbChkYXRhLmVkaXRvck9wdGlvbnMudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAkKCc8aT4nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoWydhY2NvdW50LXNldHRpbmdzX19hdmF0YXItdmlldy1kZWZhdWx0JywgJ2ZhcycsICdmYS11c2VyJ10pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkYXZhdGFyVmlld0NvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBpZih0aGlzLmF2YXRhclVwbG9hZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICB0aGlzLmF2YXRhclVwbG9hZGVyLm9wdGlvbignZHJvcFpvbmUnLCAkYXZhdGFyQ29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgIHRoaXMuYXZhdGFyVXBsb2FkZXIub3B0aW9uKCdvbkRyb3Bab25lRW50ZXInLCAoKSA9PiAkYXZhdGFyQ29udGFpbmVyLmFkZENsYXNzKCdkcm9wJykpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgdGhpcy5hdmF0YXJVcGxvYWRlci5vcHRpb24oJ29uRHJvcFpvbmVMZWF2ZScsICgpID0+ICRhdmF0YXJDb250YWluZXIucmVtb3ZlQ2xhc3MoJ2Ryb3AnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGF2YXRhckNvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGl0ZW1UeXBlOiAnZW1wdHknLFxyXG4gICAgICAgICAgICAgIGNvbFNwYW46IDFcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGNvbFNwYW46IDksXHJcbiAgICAgICAgICAgICAgY2FwdGlvbjogJ0FjY291bnQgRGV0YWlscycsXHJcbiAgICAgICAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdFcnJvck1lc3NhZ2UnLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGRhdGEgJiYgZGF0YS5lZGl0b3JPcHRpb25zICYmIGRhdGEuZWRpdG9yT3B0aW9ucy52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yTWVzc2FnZSAmJiAkKCc8ZGl2IC8+JykudGV4dChlcnJvck1lc3NhZ2UpLmFkZENsYXNzKCdlcnJvci1tZXNzYWdlJyk7XHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgLy8ge1xyXG4gICAgICAgICAgICAgICAgLy8gICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAvLyAgIGRhdGFGaWVsZDogJ0hhc0NoYW5nZXMnLFxyXG4gICAgICAgICAgICAgICAgLy8gICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIHZpc2libGU6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAvLyAgIH0sXHJcbiAgICAgICAgICAgICAgICAvLyAgIHZpc2libGU6IHRoaXMuYWNjb3VudFNldHRpbmdzRGF0YT8uSGFzQ2hhbmdlcyAmJiAhdGhpcy5hY2NvdW50U2V0dGluZ3NEYXRhLkVycm9yTWVzc2FnZSxcclxuICAgICAgICAgICAgICAgIC8vICAgdGVtcGxhdGU6IChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm4gJCgnPGRpdiAvPicpLnRleHQoJ0NoYW5nZXMgaGF2ZSBiZWVuIHNhdmVkJykuYWRkQ2xhc3MoJ3N1Y2Nlc3MtbWVzc2FnZScpO1xyXG4gICAgICAgICAgICAgICAgLy8gICB9LFxyXG4gICAgICAgICAgICAgICAgLy8gfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdVc2VyTmFtZScsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1VzZXJuYW1lJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdyZXF1aXJlZCcsIG1lc3NhZ2U6ICdVc2VybmFtZSBpcyByZXF1aXJlZCcgfSxcclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgICAgICAgICAgIGNvbENvdW50OiAyLFxyXG4gICAgICAgICAgICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ0ZpcnN0TmFtZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnRmlyc3QgTmFtZSdcclxuICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAncmVxdWlyZWQnLCBtZXNzYWdlOiAnRmlyc3QgTmFtZSBpcyByZXF1aXJlZCcgfSxcclxuICAgICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ0xhc3ROYW1lJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICdMYXN0IE5hbWUnXHJcbiAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ3JlcXVpcmVkJywgbWVzc2FnZTogJ0xhc3QgTmFtZSBpcyByZXF1aXJlZCcgfSxcclxuICAgICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnUGhvbmVOdW1iZXInLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdQaG9uZSBOdW1iZXInXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnRW1haWwnLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdFbWFpbCdcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAncmVxdWlyZWQnLCBtZXNzYWdlOiAnRW1haWwgaXMgcmVxdWlyZWQnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnZW1haWwnLCBtZXNzYWdlOiAnUGxlYXNlIHVzZSBhIHZhbGlkIGVtYWlsIGFkZHJlc3MnIH1cclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBjc3NDbGFzczogJ2FjY291bnQtc2V0dGluZ3NfX3Bhc3N3b3JkLWFyZWEnLFxyXG4gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4gJCgnPGRpdiAvPicpLmNzcygnZm9udC13ZWlnaHQnLCAnYm9sZCcpLnRleHQoJ0NoYW5nZSBQYXNzd29yZCcpXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ09sZFBhc3N3b3JkJyxcclxuICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnQ3VycmVudCBwYXNzd29yZCdcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZGU6ICdwYXNzd29yZCdcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsXHJcbiAgICAgICAgICAgICAgICAgICAgICByZWV2YWx1YXRlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkNhbGxiYWNrOiAocGFyYW1zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEhdGhpcy5hY2NvdW50U2V0dGluZ3NGb3JtPy5nZXRFZGl0b3IoJ05ld1Bhc3N3b3JkJyk/Lm9wdGlvbigndmFsdWUnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXBhcmFtcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ09sZCBwYXNzd29yZCBpcyByZXF1aXJlZCdcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ05ld1Bhc3N3b3JkJyxcclxuICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnTmV3IHBhc3N3b3JkJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogJ3Bhc3N3b3JkJyxcclxuICAgICAgICAgICAgICAgICAgICBpbnB1dEF0dHI6IHsgYXV0b2NvbXBsZXRlOiAnbmV3LXBhc3N3b3JkJyB9XHJcbiAgICAgICAgICAgICAgICAgIH0gYXMgZHhUZXh0Qm94T3B0aW9uczxkeFRleHRCb3g+LFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdOZXdQYXNzd29yZFJlcGVhdCcsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0NvbmZpcm0gbmV3IHBhc3N3b3JkJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogJ3Bhc3N3b3JkJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgICAgICAgICAgIHJlZXZhbHVhdGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FsbGJhY2s6IChwYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmFjY291bnRTZXR0aW5nc0Zvcm0/LmdldEVkaXRvcignTmV3UGFzc3dvcmQnKT8ub3B0aW9uKCd2YWx1ZScpIHx8ICcnKSA9PT0gcGFyYW1zLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQYXNzd29yZCBtaXNtYXRjaCcsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdidXR0b24nLFxyXG4gICAgICAgICAgICAgICAgICBob3Jpem9udGFsQWxpZ25tZW50OiAncmlnaHQnLFxyXG4gICAgICAgICAgICAgICAgICBjc3NDbGFzczogJ2FjY291bnQtc2V0dGluZ3NfX3N1Ym1pdC1idG4nLFxyXG4gICAgICAgICAgICAgICAgICBidXR0b25PcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1NhdmUgQ2hhbmdlcycsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxyXG4gICAgICAgICAgICAgICAgICAgIHVzZVN1Ym1pdEJlaGF2aW9yOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAyMDAsXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29uZmlybSh0ZXh0OiBzdHJpbmcpOiBKUXVlcnlEZWZlcnJlZDxib29sZWFuPiB7XHJcbiAgICBjb25zdCAkZGVmZmVyZWQ6IEpRdWVyeURlZmVycmVkPGJvb2xlYW4+ID0gJC5EZWZlcnJlZCgpO1xyXG4gICAgY29uc3QgJGVsZW1lbnQgPSAkKCc8ZGl2Lz4nKS5hcHBlbmRUbyh3aW5kb3cuZG9jdW1lbnQuYm9keSk7XHJcblxyXG4gICAgY29uc3QgcG9wdXAgPSAkZWxlbWVudC5keFBvcHVwKHtcclxuICAgICAgICBzaG93VGl0bGU6IGZhbHNlLFxyXG4gICAgICAgIGhlaWdodDogMTQwLFxyXG4gICAgICAgIHdpZHRoOiAzNzAsXHJcbiAgICAgICAgY29udGVudFRlbXBsYXRlOiAoJGNvbnRlbnQpID0+IHtcclxuICAgICAgICAgICAgJGNvbnRlbnQuYWRkQ2xhc3MoJ2lzem9sZWEtZHgtY29uZmlybScpO1xyXG5cclxuICAgICAgICAgICAgJCgnPGIvPicpLmFkZENsYXNzKCdtZXNzYWdlJykudGV4dCh0ZXh0KS5hcHBlbmRUbygkY29udGVudCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCAkYnV0dG9uc1NlY3Rpb24gPSAkKCc8ZGl2Lz4nKS5hZGRDbGFzcygnYnV0dG9ucycpLmFwcGVuZFRvKCRjb250ZW50KTtcclxuXHJcbiAgICAgICAgICAgICQoJzxkaXYvPicpLmR4QnV0dG9uKHtcclxuICAgICAgICAgICAgICAgIHRleHQ6ICdEZWxldGUnLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2RhbmdlcicsXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9wdXAuaGlkZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAkZGVmZmVyZWQucmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkuYXBwZW5kVG8oJGJ1dHRvbnNTZWN0aW9uKTtcclxuXHJcbiAgICAgICAgICAgICQoJzxkaXYvPicpLmR4QnV0dG9uKHtcclxuICAgICAgICAgICAgICAgIHRleHQ6ICdDYW5jZWwnLFxyXG4gICAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHBvcHVwLmhpZGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgJGRlZmZlcmVkLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KS5hcHBlbmRUbygkYnV0dG9uc1NlY3Rpb24pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIG9uSGlkZGVuOiAoKSA9PiB7XHJcbiAgICAgICAgcG9wdXAuZGlzcG9zZSgpO1xyXG4gICAgICAgIHBvcHVwLmVsZW1lbnQoKS5yZW1vdmUoKTtcclxuICAgICAgfVxyXG4gICAgfSkuZHhQb3B1cCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICBwb3B1cC5zaG93KCk7XHJcblxyXG4gICAgcmV0dXJuICRkZWZmZXJlZDtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUxvZ29TZXR0aW5ncyB9IGZyb20gJy4uL0RhdGEnO1xyXG5pbXBvcnQgeyBMT0dPX1NFVFRJTkdTX0NBQ0hFX0tFWSB9IGZyb20gJy4uL0NvbnN0YW50cy9DYWNoZUtleXMnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4uL0NvbmZpZy9JbmRleCc7XHJcbmltcG9ydCB7IElCYWNrZ3JvdW5kUGhvdG9WaWV3ZXJTZXR0aW5ncyB9IGZyb20gJy4uL0RhdGEvSUJhY2tncm91bmRQaG90b1ZpZXdlclNldHRpbmdzJztcclxuaW1wb3J0IHsgc2hvdyBhcyBzaG93SW1hZ2VWaWV3ZXIgfSBmcm9tICcuLi9XaWRnZXRzL0JhY2tncm91bmRJbWFnZVZpZXdlcic7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGFuZGluZygkY29udGFpbmVyOiBKUXVlcnksIGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncyB8IHN0cmluZywgc2hvd1NpZ25JbkJ1dHRvbjogYm9vbGVhbiwgcGhvdG9HYWxsZXJ5U2V0dGluZ3M6IElCYWNrZ3JvdW5kUGhvdG9WaWV3ZXJTZXR0aW5ncyA9IHsgZW5hYmxlZDogZmFsc2UgfSkge1xyXG4gIGdldExvZ29TZXR0aW5ncyhsb2dvU2V0dGluZ3MpLnRoZW4oKHNldHRpbmdzKSA9PiB7XHJcbiAgICBjcmVhdGVMYW5kaW5nTWFya3VwKCRjb250YWluZXIsIHNldHRpbmdzLCBzaG93U2lnbkluQnV0dG9uLCBwaG90b0dhbGxlcnlTZXR0aW5ncyk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldExvZ29TZXR0aW5ncyhsb2dvU2V0dGluZ3M6IElMb2dvU2V0dGluZ3MgfCBzdHJpbmcpOiBKUXVlcnlEZWZlcnJlZDxJTG9nb1NldHRpbmdzPiB7XHJcbiAgY29uc3QgJGRlZmZlcmVkOiBKUXVlcnlEZWZlcnJlZDxJTG9nb1NldHRpbmdzPiA9ICQuRGVmZXJyZWQoKTtcclxuXHJcbiAgaWYgKHR5cGVvZiBsb2dvU2V0dGluZ3MgPT09ICdzdHJpbmcnKSB7XHJcbiAgICBjb25zdCBjYWNoZWRTZXR0aW5nc1JhdyA9IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKExPR09fU0VUVElOR1NfQ0FDSEVfS0VZKTtcclxuICAgIGlmIChjYWNoZWRTZXR0aW5nc1Jhdykge1xyXG4gICAgICAkZGVmZmVyZWQucmVzb2x2ZShKU09OLnBhcnNlKGNhY2hlZFNldHRpbmdzUmF3KSBhcyBJTG9nb1NldHRpbmdzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNlbmRSZXF1ZXN0KGxvZ29TZXR0aW5ncywgJ3Bvc3QnKS5kb25lKChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgYXBwbGljYXRpb25OYW1lOiBkYXRhLkFwcGxpY2F0aW9uTmFtZSxcclxuICAgICAgICAgIGJ1c2luZXNzTmFtZTogZGF0YS5CdXNpbmVzc05hbWUsXHJcbiAgICAgICAgICBsYW5kaW5nUGFnZUxvZ286IGRhdGEuTGFuZGluZ1BhZ2VMb2dvLFxyXG4gICAgICAgICAgbG9nb0ltYWdlOiBkYXRhLkxvZ29JbWFnZSxcclxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBkYXRhLkRlc2NyaXB0aW9uXHJcbiAgICAgICAgfSBhcyBJTG9nb1NldHRpbmdzO1xyXG4gICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKExPR09fU0VUVElOR1NfQ0FDSEVfS0VZLCBKU09OLnN0cmluZ2lmeShyZXN1bHQpKTtcclxuICAgICAgICAkZGVmZmVyZWQucmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgJGRlZmZlcmVkLnJlc29sdmUobG9nb1NldHRpbmdzKTtcclxuICB9XHJcblxyXG4gIHJldHVybiAkZGVmZmVyZWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUxhbmRpbmdNYXJrdXAoJGNvbnRhaW5lcjogSlF1ZXJ5LCBsb2dvU2V0dGluZ3M6IElMb2dvU2V0dGluZ3MsIHNob3dTaWduSW5CdXR0b246IGJvb2xlYW4sIHBob3RvR2FsbGVyeVNldHRpbmdzOiBJQmFja2dyb3VuZFBob3RvVmlld2VyU2V0dGluZ3MpIHtcclxuICBjb25zdCAkbGFuZGluZ1BhZ2UgPSAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2lzem9sZWEtbGFuZGluZy1wYWdlJykuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcbiAgbGV0ICRsYW5kaW5nQ29udGFpbmVyID0gJCgnPGRpdiAvPicpLmFkZENsYXNzKCdsYW5kaW5nLWNvbnRhaW5lcicpLmFwcGVuZFRvKCRsYW5kaW5nUGFnZSk7XHJcblxyXG4gIGlmKHBob3RvR2FsbGVyeVNldHRpbmdzLmVuYWJsZWQpIHtcclxuICAgICRsYW5kaW5nUGFnZS5hZGRDbGFzcygncGhvdG8tZ2FsbGVyeS1tb2RlJyk7XHJcbiAgfSBlbHNlIHtcclxuICAgICRsYW5kaW5nUGFnZS5hZGRDbGFzcygnZGVmYXVsdC1tb2RlJyk7XHJcbiAgICAkbGFuZGluZ0NvbnRhaW5lciA9ICRsYW5kaW5nUGFnZTtcclxuICB9XHJcblxyXG4gICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnbG9nby1jb250YWluZXInKVxyXG4gICAgLmFwcGVuZFRvKCRsYW5kaW5nQ29udGFpbmVyKVxyXG4gICAgLmFwcGVuZChcclxuICAgICAgJCgnPGltZyAvPicpLmF0dHIoJ3NyYycsIGxvZ29TZXR0aW5ncy5sYW5kaW5nUGFnZUxvZ28pLmFkZENsYXNzKCdsb2dvLWxhcmdlJykuYXBwZW5kVG8oJGxhbmRpbmdDb250YWluZXIpLFxyXG4gICAgICAkKCc8c3BhbiAvPicpLmFkZENsYXNzKCdidXNpbmVzcy1uYW1lJykudGV4dChsb2dvU2V0dGluZ3MuYnVzaW5lc3NOYW1lKS5hcHBlbmRUbygkbGFuZGluZ0NvbnRhaW5lcilcclxuICApO1xyXG5cclxuICAkKCc8aDIgLz4nKS50ZXh0KGBXZWxjb21lIHRvICR7bG9nb1NldHRpbmdzLmRlc2NyaXB0aW9ufWApLmFwcGVuZFRvKCRsYW5kaW5nQ29udGFpbmVyKTtcclxuXHJcbiAgaWYgKHNob3dTaWduSW5CdXR0b24pIHtcclxuICAgICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnc2lnbi1pbi1idXR0b24nKS5hcHBlbmQoJCgnPGRpdiAvPicpLmR4QnV0dG9uKHtcclxuICAgICAgdGV4dDogJ1NpZ24gSW4nLFxyXG4gICAgICB3aWR0aDogY29uZmlnLmlzTGVnYWN5UmVuZGVyID8gdW5kZWZpbmVkIDogJzE0MHB4JyxcclxuICAgICAgdHlwZTogJ2RlZmF1bHQnLFxyXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLmNsZWFyKCk7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBgL0hvbWUvTG9naW4/cmV0dXJuVXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHdpbmRvdy5sb2NhdGlvbi5ocmVmLnRvU3RyaW5nKCkpfWA7XHJcbiAgICAgIH1cclxuICAgIH0pKS5hcHBlbmRUbygkbGFuZGluZ0NvbnRhaW5lcik7XHJcbiAgfVxyXG5cclxuICBpZihwaG90b0dhbGxlcnlTZXR0aW5ncy5lbmFibGVkKSB7XHJcbiAgICBzaG93SW1hZ2VWaWV3ZXIoXHJcbiAgICAgIHBob3RvR2FsbGVyeVNldHRpbmdzLiRjb250YWluZXIgfHwgJGxhbmRpbmdQYWdlLFxyXG4gICAgICBwaG90b0dhbGxlcnlTZXR0aW5ncy5pbWFnZVVybHMgfHwgW10sXHJcbiAgICAgIHBob3RvR2FsbGVyeVNldHRpbmdzLmltZ0NoYW5nZUludGVydmFsU2VjIHx8IDgsXHJcbiAgICAgIHBob3RvR2FsbGVyeVNldHRpbmdzLnRyYW5zaXRpb25UaW1lU2VjIHx8IDJcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZleHBvcnQgZnVuY3Rpb24gY3JlYXRlQWNjZXNzRGVuaWVkVG9SZXBvcnQoJGNvbnRhaW5lcjogSlF1ZXJ5LCBhbGxvd2VkUmVwb3J0Um9sZXM6IHN0cmluZ1tdLCBhbGxvd2VkQ29ubmVjdGlvblJvbGVzOiBzdHJpbmdbXSkge1xyXG4gIGNvbnN0ICRpc3pvbGVhQ29udGFpbmVyID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnYWNjZXNzLWRlbmllZC10by1yZXBvcnQtcGFnZScpLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG4gICQoJzxoMj4nKS5hZGRDbGFzcygnZXJyb3ItdGV4dCcpLnRleHQoJ0FjY2VzcyBkZW5pZWQgdG8gdGhlIHJlcG9ydCcpLmFwcGVuZFRvKCRpc3pvbGVhQ29udGFpbmVyKTtcclxuXHJcbiAgaWYgKGFsbG93ZWRSZXBvcnRSb2xlcyAmJiBhbGxvd2VkUmVwb3J0Um9sZXMubGVuZ3RoKSB7XHJcbiAgICBjb25zdCByZXBvcnRSb2xlcyA9IGFsbG93ZWRSZXBvcnRSb2xlcy5tYXAoKHIpID0+ICQoJzxzcGFuPicpLmFkZENsYXNzKCdyb2xlJykudGV4dChyKSk7XHJcbiAgICAkKCc8cD4nKS50ZXh0KCdSZXF1aXJlZCByb2xlcyBmb3IgcmVwb3J0OiAnKS5hcHBlbmQocmVwb3J0Um9sZXMpLmFwcGVuZFRvKCRpc3pvbGVhQ29udGFpbmVyKTtcclxuICB9XHJcblxyXG4gIGlmIChhbGxvd2VkQ29ubmVjdGlvblJvbGVzICYmIGFsbG93ZWRDb25uZWN0aW9uUm9sZXMubGVuZ3RoKSB7XHJcbiAgICBjb25zdCBjb25uZWN0aW9uc1JvbGVzID0gYWxsb3dlZENvbm5lY3Rpb25Sb2xlcy5tYXAoKHIpID0+ICQoJzxzcGFuPicpLmFkZENsYXNzKCdyb2xlJykudGV4dChyKSk7XHJcbiAgICAkKCc8cD4nKS50ZXh0KCdSZXF1aXJlZCByb2xlcyBmb3IgZGIgY29ubmVjdGlvbjogJykuYXBwZW5kKGNvbm5lY3Rpb25zUm9sZXMpLmFwcGVuZFRvKCRpc3pvbGVhQ29udGFpbmVyKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCBmdWxsU2NyZWVuIGZyb20gJy4uLy4uLy4uL1dpZGdldHMvRnVsbFNjcmVlbic7XHJcbmltcG9ydCB7IGluaXRQb3BvdmVyIH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZXBvcnREZXRhaWxzUG9wb3Zlcic7XHJcbmltcG9ydCB7IElDZG1SZXBvcnRQYXJhbXMsIE1vZGUgfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IHsgQ29udHJvbENvbmZpZ3VyYXRvciwgSUNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zIH0gZnJvbSAnLi9Db250cm9sQ29uZmlndXJhdG9yJztcclxuaW1wb3J0IHsgQ29udHJvbERpc3BsYXksIElDb250cm9sRGlzcGxheU9wdGlvbnMgfSBmcm9tICcuL0NvbnRyb2xEaXNwbGF5JztcclxuaW1wb3J0IHsgRGlzcGxheU1hbmFnZXIsIElEaXNwbGF5TWFuYWdlck9wdGlvbnMgfSBmcm9tICcuL0Rpc3BsYXlNYW5hZ2VyJztcclxuaW1wb3J0IHtJUmVwb3J0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNETVJlcG9ydFBhZ2VPcHRpb25zIHtcclxuICAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcmVwb3J0UGFyYW1zOiBJQ2RtUmVwb3J0UGFyYW1zO1xyXG4gIHVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIGNkbVJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ0RNUmVwb3J0UGFnZSBpbXBsZW1lbnRzIElSZXBvcnRDb21wb25lbnQge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgPSAnU3dpdGNoIHRvIFNldHRpbmdzJztcclxuICBwcml2YXRlIHJlYWRvbmx5IFNXSVRDSF9UT19WSUVXRVJfVEVYVCA9ICdTd2l0Y2ggdG8gRGlzcGxheSc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBTVE9SQUdFX01PREVfS0VZID0gJ0NETV9TVE9SQUdFX01PREVfS0VZJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSAkcm9vdEVsZW1lbnQ6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRQYXJhbXM6IElDZG1SZXBvcnRQYXJhbXM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb250cm9sQ29uZmlndXJhdG9yT3B0aW9uczogSUNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGxheU1hbmFnZXJPcHRpb25zOiBJRGlzcGxheU1hbmFnZXJPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY29udHJvbERpc3BsYXlPcHRpb25zOiBJQ29udHJvbERpc3BsYXlPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIHByaXZhdGUgbXVsdGlWaWV3OiBEZXZFeHByZXNzLnVpLmR4TXVsdGlWaWV3O1xyXG4gIHByaXZhdGUgdGFiUGFuZWw6IERldkV4cHJlc3MudWkuZHhUYWJQYW5lbDtcclxuICBwcml2YXRlIHBvcG92ZXI6IERldkV4cHJlc3MudWkuZHhQb3BvdmVyO1xyXG5cclxuICBwcml2YXRlIG1vZGU6IE1vZGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElDRE1SZXBvcnRQYWdlT3B0aW9ucykge1xyXG4gICAgY29uc3QgYmFzZVVybCA9IGAvJHtvcHRpb25zLmNkbVJlcG9ydENvbnRyb2xsZXJVcmx9LyR7b3B0aW9ucy5yZXBvcnRQYXJhbXMuUmVwb3J0SWR9YDtcclxuICAgIHRoaXMuJHJvb3RFbGVtZW50ID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy5yZXBvcnRQYXJhbXMgPSBvcHRpb25zLnJlcG9ydFBhcmFtcztcclxuICAgIHRoaXMuYWxsb3dFZGl0aW5nID0gb3B0aW9ucy5hbGxvd0VkaXRpbmc7XHJcbiAgICB0aGlzLm1vZGUgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSkgYXMgTW9kZSB8fCBNb2RlLlZpZXdlcjtcclxuXHJcbiAgICB0aGlzLmNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zID0gdGhpcy5nZXRDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucyhiYXNlVXJsLCBvcHRpb25zLmNkbVJlcG9ydENvbnRyb2xsZXJVcmwpO1xyXG4gICAgdGhpcy5kaXNwbGF5TWFuYWdlck9wdGlvbnMgPSB0aGlzLmdldERpc3BsYXlNYW5hZ2VyT3B0aW9ucyhiYXNlVXJsKTtcclxuICAgIHRoaXMuY29udHJvbERpc3BsYXlPcHRpb25zID0gdGhpcy5nZXRDb250cm9sRGlzcGxheU9wdGlvbnMoYmFzZVVybCwgb3B0aW9ucy51c2VyTmFtZSwgb3B0aW9ucy5yZXBvcnRQYXJhbXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoKSB7XHJcbiAgICBpZiAodGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscykge1xyXG4gICAgICB0aGlzLnBvcG92ZXIgPSBpbml0UG9wb3ZlcignLnJlcG9ydC1kZXRhaWxzLWxpbmsnLCB0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5hbGxvd0VkaXRpbmcpIHtcclxuICAgICAgdGhpcy5pbml0U3dpdGNoTW9kZUJ1dHRvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVuZGVyQ29udGVudCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLm11bHRpVmlldz8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy50YWJQYW5lbD8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5wb3BvdmVyPy5kaXNwb3NlKCk7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJDb250ZW50KCkge1xyXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIpIHtcclxuICAgICAgdGhpcy5yZW5kZXJEaXNwbGF5KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbmRlclRhYlBhbmVsKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zKGJhc2VVcmw6IHN0cmluZywgY2RtUmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nKTogSUNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICRjb250YWluZXI6IG51bGwsXHJcbiAgICAgIGlzU3RhbmRhbG9uZVBhZ2U6IGZhbHNlLFxyXG4gICAgICBwYWdlVGl0bGU6ICcnLFxyXG4gICAgICBhdmFpbGFibGVSb2xlc1VybDogYC8ke2NkbVJlcG9ydENvbnRyb2xsZXJVcmx9L0F2YWlsYWJsZVJvbGVzYCxcclxuICAgICAgZ3JvdXBGaWVsZHNVcmw6IGAke2Jhc2VVcmx9L0FsbENvbnRyb2xGaWVsZHNgLFxyXG4gICAgICBsb2FkRGF0YVVybDogYCR7YmFzZVVybH0vQ29uZmlndXJhdG9yRGF0YWAsXHJcbiAgICAgIHVwZGF0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L0NvbmZpZ3VyYXRvckRhdGFgXHJcbiAgICB9IGFzIElDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RGlzcGxheU1hbmFnZXJPcHRpb25zKGJhc2VVcmw6IHN0cmluZyk6IElEaXNwbGF5TWFuYWdlck9wdGlvbnMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJGNvbnRhaW5lcjogbnVsbCxcclxuICAgICAgaXNTdGFuZGFsb25lUGFnZTogZmFsc2UsXHJcbiAgICAgIHBhZ2VUaXRsZTogJycsXHJcbiAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9Db250cm9sRGlzcGxheVVzZXJBc3NpZ25tZW50c2AsXHJcbiAgICAgIHVwZGF0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1VwZGF0ZUNvbnRyb2xEaXNwbGF5VXNlckFzc2lnbm1lbnRzYFxyXG4gICAgfSBhcyBJRGlzcGxheU1hbmFnZXJPcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDb250cm9sRGlzcGxheU9wdGlvbnMoXHJcbiAgICBiYXNlVXJsOiBzdHJpbmcsXHJcbiAgICB1c2VyTmFtZTogc3RyaW5nLFxyXG4gICAgcmVwb3J0UGFyYW1zOiBJQ2RtUmVwb3J0UGFyYW1zXHJcbiAgKTogSUNvbnRyb2xEaXNwbGF5T3B0aW9ucyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAkY29udGFpbmVyOiBudWxsLFxyXG4gICAgICBpc1N0YW5kYWxvbmVQYWdlOiBmYWxzZSxcclxuICAgICAgcGFnZVRpdGxlOiAnJyxcclxuICAgICAgZXhwb3J0RmlsZU5hbWU6IHJlcG9ydFBhcmFtcy5OYW1lLFxyXG4gICAgICB1c2VyQ29uZmlnVXJsOiBgJHtiYXNlVXJsfS9GaWVsZHNQZXJtaXNzaW9uc2AsXHJcbiAgICAgIGNvbnRyb2xMb2dzVXJsOiBgJHtiYXNlVXJsfS9HZXRDb250cm9sTG9nc2AsXHJcbiAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9Db250cm9sRGlzcGxheURhdGFgLFxyXG4gICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9VcGRhdGVDb250cm9sRGlzcGxheURhdGFgLFxyXG4gICAgICB1c2VyTmFtZSxcclxuICAgICAgaW1wb3J0RmlsZU9wdGlvbnM6IHJlcG9ydFBhcmFtcy5BbGxvd0ltcG9ydGluZyA/IHtcclxuICAgICAgICBtb2RlOiByZXBvcnRQYXJhbXMuSW1wb3J0RmlsZU1vZGUsXHJcbiAgICAgICAgY3JlYXRlVGFibGVVcmw6IGAke2Jhc2VVcmx9L2NyZWF0ZS10YWJsZWAsXHJcbiAgICAgICAgYWRkUm93c1VybDogYCR7YmFzZVVybH0vYWRkLXJvd3NgLFxyXG4gICAgICAgIGZpbGVVcGxvYWRVcmw6IGAke2Jhc2VVcmx9L2dldC1jb2x1bW5zYCxcclxuICAgICAgICBwcmVkZWZpbmVkVGFibGU6IHJlcG9ydFBhcmFtcy5GaWxlSW1wb3J0ZXJUYWJsZUluZm9cclxuICAgICAgfSA6IHVuZGVmaW5lZCxcclxuICAgICAgZ3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9uczoge1xyXG4gICAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9HZXRDb250cm9sRmlsdGVyc2AsXHJcbiAgICAgICAgaW5zZXJ0RGF0YVVybDogYCR7YmFzZVVybH0vQWRkQ29udHJvbEZpbHRlcmAsXHJcbiAgICAgICAgdXBkYXRlRGF0YVVybDogYCR7YmFzZVVybH0vVXBkYXRlQ29udHJvbEZpbHRlcmAsXHJcbiAgICAgICAgZGVsZXRlRGF0YVVybDogYCR7YmFzZVVybH0vUmVtb3ZlQ29udHJvbEZpbHRlcmBcclxuICAgICAgfSxcclxuICAgICAgZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnM6IHtcclxuICAgICAgICBsb2FkRGF0YVVybDogYCR7YmFzZVVybH0vR2V0Q29udHJvbFZpZXdzYCxcclxuICAgICAgICBpbnNlcnREYXRhVXJsOiBgJHtiYXNlVXJsfS9BZGRDb250cm9sVmlld2AsXHJcbiAgICAgICAgdXBkYXRlRGF0YVVybDogYCR7YmFzZVVybH0vVXBkYXRlQ29udHJvbFZpZXdgLFxyXG4gICAgICAgIGRlbGV0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1JlbW92ZUNvbnRyb2xWaWV3YFxyXG4gICAgICB9LFxyXG4gICAgICBncmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9uczoge1xyXG4gICAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9HZXRDb250cm9sRGlzcGxheXNgLFxyXG4gICAgICAgIGluc2VydERhdGFVcmw6IGAke2Jhc2VVcmx9L0FkZENvbnRyb2xEaXNwbGF5YCxcclxuICAgICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9VcGRhdGVDb250cm9sRGlzcGxheWAsXHJcbiAgICAgICAgZGVsZXRlRGF0YVVybDogYCR7YmFzZVVybH0vUmVtb3ZlQ29udHJvbERpc3BsYXlgXHJcbiAgICAgIH0sXHJcbiAgICAgIHJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zOiB7XHJcbiAgICAgICAgbG9hZERhdGFVcmw6IGAke2Jhc2VVcmx9L0dldENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzYCxcclxuICAgICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9VcGRhdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc2AsXHJcbiAgICAgIH1cclxuICAgIH0gYXMgSUNvbnRyb2xEaXNwbGF5T3B0aW9ucztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdFN3aXRjaE1vZGVCdXR0b24oKSB7XHJcbiAgICBjb25zdCBidXR0b24gPSAkKCcuc3dpdGNoLW1vZGUtYnRuJykuZHhCdXR0b24oe1xyXG4gICAgICB0ZXh0OiB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gdGhpcy5TV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IHRoaXMuU1dJVENIX1RPX1ZJRVdFUl9URVhULFxyXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tb2RlID0gdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IE1vZGUuRGVzaWduZXIgOiBNb2RlLlZpZXdlcjtcclxuICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSwgdGhpcy5tb2RlKTtcclxuICAgICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IHRoaXMuU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgOiB0aGlzLlNXSVRDSF9UT19WSUVXRVJfVEVYVCk7XHJcblxyXG4gICAgICAgIHRoaXMucmVuZGVyQ29udGVudCgpO1xyXG4gICAgICB9XHJcbiAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1tZCcpLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJEaXNwbGF5KCkge1xyXG4gICAgdGhpcy4kcm9vdEVsZW1lbnQuaHRtbCgnJyk7XHJcbiAgICBjb25zdCAkdmlldyA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbyh0aGlzLiRyb290RWxlbWVudCk7XHJcblxyXG4gICAgdGhpcy5tdWx0aVZpZXcgPSAkdmlldy5keE11bHRpVmlldyh7XHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IENvbnRyb2xEaXNwbGF5KHsgLi4udGhpcy5jb250cm9sRGlzcGxheU9wdGlvbnMsICRjb250YWluZXI6ICQoJzxkaXYgLz4nKSB9KTtcclxuICAgICAgICAgICAgY29tcG9uZW50LnJlbmRlcigpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC4kY29udGFpbmVyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfSkuYWRkQ2xhc3MoJ2NkbS1yZXBvcnRfX2Rpc3BseS1ncmlkJykuZHhNdWx0aVZpZXcoJ2luc3RhbmNlJyk7XHJcbiAgICBmdWxsU2NyZWVuKHRoaXMubXVsdGlWaWV3LCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclRhYlBhbmVsKCkge1xyXG4gICAgdGhpcy4kcm9vdEVsZW1lbnQuaHRtbCgnJyk7XHJcblxyXG4gICAgY29uc3QgJG1haW5UYWJQYW5lbCA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbyh0aGlzLiRyb290RWxlbWVudCk7XHJcblxyXG4gICAgdGhpcy50YWJQYW5lbCA9IHRoaXMuY3JlYXRlVGFiUGFuZWwoJG1haW5UYWJQYW5lbCk7XHJcbiAgICBmdWxsU2NyZWVuKHRoaXMudGFiUGFuZWwsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlVGFiUGFuZWwoZWxlbWVudDogSlF1ZXJ5PEhUTUxFbGVtZW50Pik6IERldkV4cHJlc3MudWkuZHhUYWJQYW5lbCB7XHJcbiAgICByZXR1cm4gZWxlbWVudC5keFRhYlBhbmVsKHtcclxuICAgICAgc3dpcGVFbmFibGVkOiBmYWxzZSxcclxuICAgICAgc2hvd05hdkJ1dHRvbnM6IHRydWUsXHJcbiAgICAgIGZvY3VzU3RhdGVFbmFibGVkOiBmYWxzZSxcclxuICAgICAgYWN0aXZlU3RhdGVFbmFibGVkOiBmYWxzZSxcclxuICAgICAgaG92ZXJTdGF0ZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBvblNlbGVjdGlvbkNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBlLmNvbXBvbmVudC5yZXBhaW50KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGl0bGU6ICdDb25maWd1cmF0b3InLFxyXG4gICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IENvbnRyb2xDb25maWd1cmF0b3IoeyAuLi50aGlzLmNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zLCAkY29udGFpbmVyOiAkKCc8ZGl2IC8+JykgfSk7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudC5yZW5kZXIoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuJGNvbnRhaW5lcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRpdGxlOiAnRGlzcGxheSBNYW5hZ2VyJyxcclxuICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBEaXNwbGF5TWFuYWdlcih7IC4uLnRoaXMuZGlzcGxheU1hbmFnZXJPcHRpb25zLCAkY29udGFpbmVyOiAkKCc8ZGl2IC8+JykgfSk7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudC5yZW5kZXIoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuJGNvbnRhaW5lcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICBdXHJcbiAgICB9KS5hZGRDbGFzcygnY2RtLXJlcG9ydF9fY29uZmlndXJhdGlvbi10YWItcGFuZWwnKVxyXG4gICAgICAuZHhUYWJQYW5lbCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbktleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuU1RPUkFHRV9NT0RFX0tFWSArIHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGZ1bmN0aW9uIGluaXRQb3BvdmVyKGxpbms6IHN0cmluZywgZGV0YWlsczogc3RyaW5nKTogRGV2RXhwcmVzcy51aS5keFBvcG92ZXIge1xyXG4gIGNvbnN0IGh0bWwgPSAkKCc8cC8+JykuaHRtbChkZXRhaWxzKS50ZXh0KCk7XHJcblxyXG4gIGNvbnN0IHBvcG92ZXIgPSAkKCc8ZGl2PicsIHsgY2xhc3M6ICdyZXBvcnQtZGV0YWlscy1wb3BvdmVyJyB9KVxyXG4gICAgLmh0bWwoaHRtbClcclxuICAgIC5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KTtcclxuXHJcbiAgcmV0dXJuICQocG9wb3ZlcikuZHhQb3BvdmVyKHtcclxuICAgIHRhcmdldDogbGluayxcclxuICAgIHNob3dFdmVudDogJ2R4Y2xpY2snLFxyXG4gICAgcG9zaXRpb246ICdib3R0b20nLFxyXG4gICAgd2lkdGg6IDUwMFxyXG4gIH0pLmR4UG9wb3ZlcignaW5zdGFuY2UnKTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IGZ1bGxTY3JlZW4gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9GdWxsU2NyZWVuJztcclxuaW1wb3J0IHtDU1NfQ0xBU1NFU30gZnJvbSAnLi4vLi4vLi4vU3R5bGluZy9JbmRleCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkQWRkaXRpb25hbE9wdGlvbnMge1xyXG4gIGV4cG9ydEZpbGVOYW1lPzogc3RyaW5nO1xyXG4gIHN1bW1hcnlDb2x1bW4/OiBzdHJpbmc7XHJcbiAgc2hvd1N1bW1hcnlJbkNvbHVtbj86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHREYXRhR3JpZChcclxuICAkdGFyZ2V0LCBkYXRhR3JpZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMsIGFkZGl0aW9uYWxPcHRpb25zOiBJR3JpZEFkZGl0aW9uYWxPcHRpb25zID0ge30sXHJcbiAgaGVhZGVyVGV4dD86IHN0cmluZywgaGVhZGVyRGVzY3JpcHRpb24/OiBzdHJpbmcsIGRlZmF1bHRDb2x1bW5XaWR0aCA9IGZhbHNlXHJcbik6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgbGV0IGlzR3JpZEluaXRpYWxpemFlZCA9IGZhbHNlO1xyXG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zID0ge1xyXG4gICAgZXhwb3J0OiB7XHJcbiAgICAgIGVuYWJsZWQ6ICEhYWRkaXRpb25hbE9wdGlvbnMuZXhwb3J0RmlsZU5hbWUsXHJcbiAgICAgIGFsbG93RXhwb3J0U2VsZWN0ZWREYXRhOiB0cnVlXHJcbiAgICB9LFxyXG4gICAgcmVtb3RlT3BlcmF0aW9uczogdHJ1ZSxcclxuXHJcbiAgICBjb2x1bW5BdXRvV2lkdGg6IHRydWUsXHJcbiAgICBzaG93Qm9yZGVyczogdHJ1ZSxcclxuXHJcbiAgICBzZWxlY3Rpb246IHttb2RlOiAnbXVsdGlwbGUnfSxcclxuICAgIGtleWJvYXJkTmF2aWdhdGlvbjoge2VuYWJsZWQ6IGZhbHNlfSxcclxuICAgIHBhZ2luZzoge3BhZ2VTaXplOiA1MH0sXHJcbiAgICBzZWFyY2hQYW5lbDoge3Zpc2libGU6IHRydWV9LFxyXG4gICAgZmlsdGVyUm93OiB7dmlzaWJsZTogdHJ1ZX0sXHJcbiAgICBoZWFkZXJGaWx0ZXI6IHt2aXNpYmxlOiB0cnVlfSxcclxuICAgIHNjcm9sbGluZzoge21vZGU6ICd2aXJ0dWFsJ30sXHJcbiAgICBvbkNvbnRlbnRSZWFkeTogKGUpID0+IHtcclxuICAgICAgdXBkYXRlU3VtbWFyeUNvbHVtbklmUmVxdWlyZWQoZS5jb21wb25lbnQpO1xyXG5cclxuICAgICAgaWYgKGlzR3JpZEluaXRpYWxpemFlZCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaXNHcmlkSW5pdGlhbGl6YWVkID0gdHJ1ZTtcclxuXHJcbiAgICAgIGlmICghZGVmYXVsdENvbHVtbldpZHRoKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlLmNvbXBvbmVudC5jb2x1bW5Db3VudCgpOyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IGRhdGFUeXBlID0gZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKGksICdkYXRhVHlwZScpO1xyXG5cclxuICAgICAgICAgIGlmICghZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcpKSB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgICAgICAgZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcsICcxMDBweCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2RhdGV0aW1lJykge1xyXG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmNvbHVtbk9wdGlvbihpLCAnd2lkdGgnLCAnMTUwcHgnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy90byBmaXggYXV0b3Njcm9sbFxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBzY3JvbGxhYmxlID0gZS5jb21wb25lbnQuZ2V0U2Nyb2xsYWJsZSgpO1xyXG5cclxuICAgICAgICBpZiAoc2Nyb2xsYWJsZSkge1xyXG4gICAgICAgICAgc2Nyb2xsYWJsZS5zY3JvbGxUbyh7dG9wOiAwfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0sXHJcbiAgICBvblRvb2xiYXJQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgIGlmIChoZWFkZXJUZXh0KSB7XHJcbiAgICAgICAgZS50b29sYmFyT3B0aW9ucy5pdGVtcy51bnNoaWZ0KHtcclxuICAgICAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgICAgIHRlbXBsYXRlKCkge1xyXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJFbCA9ICQoJzxoMiAvPicpLmFkZENsYXNzKCdncmlkLWhlYWRlcicpLnRleHQoaGVhZGVyVGV4dCk7XHJcbiAgICAgICAgICAgIGlmIChoZWFkZXJEZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICAgIGhlYWRlckVsLmFwcGVuZCgkKCc8aSAvPicpLmFkZENsYXNzKCdmYXMnKS5hZGRDbGFzcygnZmEtaW5mby1jaXJjbGUnKS5hZGRDbGFzcygncmVwb3J0LWRldGFpbHMtbGluaycpLmF0dHIoJ3RpdGxlJywgJ0NsaWNrIHRvIHNlZSBmdXJ0aGVyIGRldGFpbHMnKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBoZWFkZXJFbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IG9uQ29udGVudFJlYWR5ID0gZGF0YUdyaWRPcHRpb25zLm9uQ29udGVudFJlYWR5XHJcbiAgICA/IChlKSA9PiB7XHJcbiAgICAgIGRlZmF1bHRPcHRpb25zLm9uQ29udGVudFJlYWR5KGUpO1xyXG4gICAgICBkYXRhR3JpZE9wdGlvbnMub25Db250ZW50UmVhZHkoZSk7XHJcbiAgICB9XHJcbiAgICA6IGRlZmF1bHRPcHRpb25zLm9uQ29udGVudFJlYWR5O1xyXG5cclxuICB0cnlTZXRUb3RhbFN1bW1hcnkoZGF0YUdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9ucyk7XHJcblxyXG4gIGNvbnN0IG1lcmdlZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgZGVmYXVsdE9wdGlvbnMsIGRhdGFHcmlkT3B0aW9ucywge29uQ29udGVudFJlYWR5fSk7XHJcblxyXG4gIGNvbnN0IGdyaWQgPSAkdGFyZ2V0LmR4RGF0YUdyaWQobWVyZ2VkT3B0aW9ucykuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgZ3JpZC5lbGVtZW50KCkuYWRkQ2xhc3MoQ1NTX0NMQVNTRVMuZHhEYXRhR3JpZCk7XHJcblxyXG4gIHJldHVybiBncmlkO1xyXG59XHJcblxyXG5mdW5jdGlvbiB0cnlTZXRUb3RhbFN1bW1hcnkoZGF0YUdyaWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9uczogSUdyaWRBZGRpdGlvbmFsT3B0aW9ucykge1xyXG4gIGlmIChkYXRhR3JpZE9wdGlvbnM/LnN1bW1hcnk/LnRvdGFsSXRlbXM/LnNvbWUoKGkpID0+IGkuc3VtbWFyeVR5cGUgPT09ICdjb3VudCcpKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBsZXQgc3VtbWFyeUNvbHVtbiA9IGFkZGl0aW9uYWxPcHRpb25zPy5zdW1tYXJ5Q29sdW1uO1xyXG4gIGlmICghc3VtbWFyeUNvbHVtbiAmJiBkYXRhR3JpZE9wdGlvbnM/LmNvbHVtbnM/Lmxlbmd0aCkge1xyXG4gICAgc3VtbWFyeUNvbHVtbiA9IHR5cGVvZiBkYXRhR3JpZE9wdGlvbnMuY29sdW1uc1swXSA9PT0gJ3N0cmluZydcclxuICAgICAgPyBkYXRhR3JpZE9wdGlvbnMuY29sdW1uc1swXVxyXG4gICAgICA6IGRhdGFHcmlkT3B0aW9ucy5jb2x1bW5zWzBdLmRhdGFGaWVsZDtcclxuICB9XHJcblxyXG4gIGlmIChzdW1tYXJ5Q29sdW1uKSB7XHJcbiAgICBpZiAoIWRhdGFHcmlkT3B0aW9ucy5zdW1tYXJ5KSB7XHJcbiAgICAgIGRhdGFHcmlkT3B0aW9ucy5zdW1tYXJ5ID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFkYXRhR3JpZE9wdGlvbnMuc3VtbWFyeS50b3RhbEl0ZW1zKSB7XHJcbiAgICAgIGRhdGFHcmlkT3B0aW9ucy5zdW1tYXJ5LnRvdGFsSXRlbXMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBkYXRhR3JpZE9wdGlvbnMuc3VtbWFyeS50b3RhbEl0ZW1zLnB1c2goe1xyXG4gICAgICBjb2x1bW46IHN1bW1hcnlDb2x1bW4sXHJcbiAgICAgIHN1bW1hcnlUeXBlOiAnY291bnQnXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZVN1bW1hcnlDb2x1bW5JZlJlcXVpcmVkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gIGNvbnN0IHRvdGFsSXRlbXMgPSBncmlkLm9wdGlvbignc3VtbWFyeS50b3RhbEl0ZW1zJykgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snc3VtbWFyeSddWyd0b3RhbEl0ZW1zJ107XHJcbiAgY29uc3QgY3VycmVudFN1bW1hcnlDb2x1bW4gPSB0b3RhbEl0ZW1zPy5maWx0ZXIoKGkpID0+IGkuc3VtbWFyeVR5cGUgPT09ICdjb3VudCcpWzBdPy5jb2x1bW47XHJcblxyXG4gIGxldCBzdW1tYXJ5Q29sdW1uSW5kZXggPSBjdXJyZW50U3VtbWFyeUNvbHVtbiAmJiBncmlkLmdldFZpc2libGVDb2x1bW5zKCkuZmluZEluZGV4KChlbCkgPT4gZWwuZGF0YUZpZWxkID09PSBjdXJyZW50U3VtbWFyeUNvbHVtbik7XHJcbiAgaWYgKCFzdW1tYXJ5Q29sdW1uSW5kZXgpIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdyaWQub3B0aW9uKCdzZWxlY3Rpb24nKTtcclxuICAgIGNvbnN0IGhhc1NlbGVjdGlvbiA9IHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ubW9kZSAhPT0gJ25vbmUnO1xyXG4gICAgc3VtbWFyeUNvbHVtbkluZGV4ID0gaGFzU2VsZWN0aW9uID8gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpLmZpbmRJbmRleCgoZWwpID0+ICEhZWwuZGF0YUZpZWxkKSA6IDA7XHJcbiAgfVxyXG5cclxuICBjb25zdCBuZXdTdW1tYXJ5Q29sdW1uID0gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpW3N1bW1hcnlDb2x1bW5JbmRleF0/LmRhdGFGaWVsZDtcclxuXHJcbiAgaWYgKG5ld1N1bW1hcnlDb2x1bW4gJiYgY3VycmVudFN1bW1hcnlDb2x1bW4gIT09IG5ld1N1bW1hcnlDb2x1bW4pIHtcclxuICAgIGdyaWQub3B0aW9uKCdzdW1tYXJ5Jywge1xyXG4gICAgICB0b3RhbEl0ZW1zOiBbe1xyXG4gICAgICAgIGNvbHVtbjogZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpW3N1bW1hcnlDb2x1bW5JbmRleF0/LmRhdGFGaWVsZCxcclxuICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xyXG4gICAgICB9XVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkKFxyXG4gICR0YXJnZXQsIGRhdGFHcmlkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnM6IElHcmlkQWRkaXRpb25hbE9wdGlvbnMgPSB7fSxcclxuICBoZWFkZXJUZXh0Pzogc3RyaW5nLCBoZWFkZXJEZXNjcmlwdGlvbj86IHN0cmluZywgZGVmYXVsdENvbHVtbldpZHRoID0gZmFsc2UsIHNraXBGdWxsU2NyZWVuID0gZmFsc2VcclxuKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICBjb25zdCBncmlkID0gY3JlYXRlRGVmYXVsdERhdGFHcmlkKCR0YXJnZXQsIGRhdGFHcmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnMsIGhlYWRlclRleHQsIGhlYWRlckRlc2NyaXB0aW9uLCBkZWZhdWx0Q29sdW1uV2lkdGgpO1xyXG5cclxuICBpZiAoIXNraXBGdWxsU2NyZWVuKSB7XHJcbiAgICBmdWxsU2NyZWVuKGdyaWQpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGdyaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIZWFkZXJDZWxsVGVtcGxhdGUodGV4dCwgdGl0bGUpIHtcclxuICByZXR1cm4gJCgnPHNwYW4+JylcclxuICAgIC5hdHRyKCd0aXRsZScsIHRpdGxlKVxyXG4gICAgLnRleHQodGV4dCk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGNyZWF0ZUR4RGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uLy4uL0RhdGEvRHhEYXRhU291cmNlJztcclxuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi9EYXRhL1JlcXVlc3QnO1xyXG5pbXBvcnQgeyBjcmVhdGVGdWxsU2NyZWVuRGF0YUdyaWQsIGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSB9IGZyb20gJy4uL0dyaWQvQ3JlYXRlRGVmYXVsdEdyaWQnO1xyXG5pbXBvcnQgY3JlYXRlRGVmYXVsdEdyaWQgZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkJztcclxuaW1wb3J0IHtJTG9va3VwRHRvfSBmcm9tICcuLi8uLi8uLi9EYXRhL0FwaVJlc3BvbnNlJztcclxuXHJcbi8vIE5PVEU6IGNvbnN0IGRlZmF1bHRTaG93ZWRSb2xlcyA9IFsnUHJvZHVjdGlvbicsICdTYWxlcycsICdGbG9vciddO1xyXG5jb25zdCByb2xlc09yZGVyID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcclxuXHJcbmV4cG9ydCBjb25zdCBlbnVtIERpc3BsYXlUeXBlIHtcclxuICBJY29ucyA9IDEsXHJcbiAgUHJlZGVmaW5lZFZhbHVlcyA9IDIsXHJcbiAgUmFiYml0QWN0aW9uID0gM1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElJY29uc0NvbHVtbkVkaXRvckl0ZW0ge1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICBpbWFnZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElQcmVkZWZpbmVkVmFsdWVzRWRpdG9ySXRlbSB7XHJcbiAgdmFsdWU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUmFiYml0QWN0aW9uRWRpdG9yRGF0YSB7XHJcbiAgYWN0aW9uVHlwZTogc3RyaW5nO1xyXG4gIGZpZWxkczogc3RyaW5nW107XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIElEaXNwbGF5VHlwZVNldHRpbmdzID0gSURpc3BsYXlJY29uc1R5cGVTZXR0aW5ncyB8IElEaXNwbGF5SVByZWRlZmluZWRWYWx1ZXNUeXBlU2V0dGluZ3MgfCBJRGlzcGxheUlSYWJiaXRBY3Rpb25UeXBlU2V0dGluZ3M7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEaXNwbGF5SWNvbnNUeXBlU2V0dGluZ3Mge1xyXG4gIHR5cGU6IERpc3BsYXlUeXBlLkljb25zO1xyXG4gIGRhdGE6IElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGlzcGxheUlQcmVkZWZpbmVkVmFsdWVzVHlwZVNldHRpbmdzIHtcclxuICB0eXBlOiBEaXNwbGF5VHlwZS5QcmVkZWZpbmVkVmFsdWVzO1xyXG4gIGRhdGE6IElQcmVkZWZpbmVkVmFsdWVzRWRpdG9ySXRlbVtdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEaXNwbGF5SVJhYmJpdEFjdGlvblR5cGVTZXR0aW5ncyB7XHJcbiAgdHlwZTogRGlzcGxheVR5cGUuUmFiYml0QWN0aW9uO1xyXG4gIGRhdGE6IElSYWJiaXRBY3Rpb25FZGl0b3JEYXRhO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XHJcbiAgcGFnZVRpdGxlOiBzdHJpbmc7XHJcbiAgYXZhaWxhYmxlUm9sZXNVcmw6IHN0cmluZztcclxuICBncm91cEZpZWxkc1VybDogc3RyaW5nO1xyXG4gIGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSVJhYmJpdEFjdGlvbkVkaXRvckluaXREYXRhIHtcclxuICBmaWVsZHM6IElMb29rdXBEdG88c3RyaW5nPltdO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ29udHJvbENvbmZpZ3VyYXRvciB7XHJcbiAgcHVibGljIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwYWdlVGl0bGU6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGF2YWlsYWJsZVJvbGVzVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncm91cEZpZWxkc1VybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwbGF5VHlwZXM6IGFueVtdID0gW1xyXG4gICAgeyBrZXk6IERpc3BsYXlUeXBlLkljb25zLCB2YWx1ZTogJ0ljb25zJyB9LFxyXG4gICAgeyBrZXk6IERpc3BsYXlUeXBlLlByZWRlZmluZWRWYWx1ZXMsIHZhbHVlOiAnUHJlZGVmaW5lZFZhbHVlcycgfSxcclxuICAgIHsga2V5OiBEaXNwbGF5VHlwZS5SYWJiaXRBY3Rpb24sIHZhbHVlOiAnUmFiYml0QWN0aW9uJyB9XHJcbiAgXTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGVkaXRvcnMgPSB7XHJcbiAgICBbRGlzcGxheVR5cGUuSWNvbnNdOiBJY29uc0NvbHVtbkVkaXRvcixcclxuICAgIFtEaXNwbGF5VHlwZS5QcmVkZWZpbmVkVmFsdWVzXTogUHJlZGVmaW5lZFZhbHVlc0NvbHVtbkVkaXRvcixcclxuICAgIFtEaXNwbGF5VHlwZS5SYWJiaXRBY3Rpb25dOiBSYWJiaXRBY3Rpb25Db2x1bW5FZGl0b3IsXHJcbiAgfTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGVkaXRvcnNJbml0RGF0YSA6IHtbaWQ6IG51bWJlcl0gOiBvYmplY3Q7fSA9IHt9O1xyXG4gIHByaXZhdGUgcm9sZXM6IHN0cmluZ1tdID0gW107XHJcbiAgcHJpdmF0ZSBmaWVsZHM6IElMb29rdXBEdG88c3RyaW5nPltdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucykge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy5pc1N0YW5kYWxvbmVQYWdlID0gb3B0aW9ucy5pc1N0YW5kYWxvbmVQYWdlO1xyXG4gICAgdGhpcy5hdmFpbGFibGVSb2xlc1VybCA9IG9wdGlvbnMuYXZhaWxhYmxlUm9sZXNVcmw7XHJcbiAgICB0aGlzLmdyb3VwRmllbGRzVXJsID0gb3B0aW9ucy5ncm91cEZpZWxkc1VybDtcclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gICAgdGhpcy5wYWdlVGl0bGUgPSBvcHRpb25zLnBhZ2VUaXRsZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIuYWRkQ2xhc3MoJ2Fwcy1ncmlkJyk7XHJcblxyXG4gICAgUHJvbWlzZS5hbGwoW1xyXG4gICAgICB0aGlzLmdldEF2YWlsYWJsZVJvbGVzKCksXHJcbiAgICAgIHRoaXMuZ2V0QXZhaWxhYmxlRmllbGRzKClcclxuICAgIF0pLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICB0aGlzLnJvbGVzID0gcmVzdWx0WzBdO1xyXG4gICAgICB0aGlzLmZpZWxkcyA9IHJlc3VsdFsxXTtcclxuICAgICAgdGhpcy5lZGl0b3JzSW5pdERhdGFbRGlzcGxheVR5cGUuUmFiYml0QWN0aW9uXSA9IHsgZmllbGRzOiB0aGlzLmZpZWxkcyB9O1xyXG4gICAgICB0aGlzLmNyZWF0ZU1haW5HcmlkKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0QXZhaWxhYmxlUm9sZXMoKSB7XHJcbiAgICByZXR1cm4gc2VuZFJlcXVlc3Q8QXJyYXk8eyBOYW1lOiBzdHJpbmcgfT4+KHRoaXMuYXZhaWxhYmxlUm9sZXNVcmwpXHJcbiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5tYXAoKHIpID0+IHIuTmFtZSkuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGFPcmRlciA9IHJvbGVzT3JkZXIuZ2V0KGEpIHx8IDk5OTk7XHJcbiAgICAgICAgY29uc3QgYk9yZGVyID0gcm9sZXNPcmRlci5nZXQoYikgfHwgOTk5OTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGFPcmRlciAtIGJPcmRlcjtcclxuICAgICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRBdmFpbGFibGVGaWVsZHMoKTogUHJvbWlzZTxJTG9va3VwRHRvPHN0cmluZz5bXT4ge1xyXG4gICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHRoaXMuZ3JvdXBGaWVsZHNVcmwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREaXNwbGF5VHlwZUVkaXRvcigkY29udGFpbmVyLCB0eXBlLCBkYXRhKSB7XHJcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvcnNbdHlwZV07XHJcbiAgICBjb25zdCBpbml0RGF0YSA9IHRoaXMuZWRpdG9yc0luaXREYXRhW3R5cGVdO1xyXG5cclxuICAgIHJldHVybiBlZGl0b3JcclxuICAgICAgPyBuZXcgZWRpdG9yKCRjb250YWluZXIsIGRhdGEsIGluaXREYXRhKVxyXG4gICAgICA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU1haW5HcmlkKCkge1xyXG4gICAgbGV0IGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuXHJcbiAgICBjb25zdCBncmlkT3B0aW9ucyA9IHtcclxuICAgICAgZGF0YVNvdXJjZTogdGhpcy5jcmVhdGVNYWluR3JpZERhdGFTb3VyY2UoKSxcclxuICAgICAgY29sdW1uQ2hvb3Nlcjoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgYWxsb3dTZWFyY2g6IHRydWUsXHJcbiAgICAgICAgbW9kZTogJ3NlbGVjdCdcclxuICAgICAgfSxcclxuICAgICAgaGVpZ2h0OiAnMTAwJScsXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBtb2RlOiAnY2VsbCcsXHJcbiAgICAgICAgYWxsb3dVcGRhdGluZzogdHJ1ZSxcclxuICAgICAgICByZWZyZXNoTW9kZTogJ3JlcGFpbnQnXHJcbiAgICAgIH0sXHJcbiAgICAgIHJlcGFpbnRDaGFuZ2VzT25seTogdHJ1ZSxcclxuICAgICAgcmVtb3RlT3BlcmF0aW9uczoge1xyXG4gICAgICAgIHN1bW1hcnk6IHRydWUsXHJcbiAgICAgICAgcGFnaW5nOiB0cnVlLFxyXG4gICAgICAgIGdyb3VwaW5nOiBmYWxzZSxcclxuICAgICAgICBzb3J0aW5nOiBmYWxzZSxcclxuICAgICAgICBmaWx0ZXJpbmc6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIGdyb3VwaW5nOiB7XHJcbiAgICAgICAgYWxsb3dDb2xsYXBzaW5nOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBncm91cFBhbmVsOiB7XHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgc2VsZWN0aW9uOiB7XHJcbiAgICAgICAgbW9kZTogJ211bHRpcGxlJ1xyXG4gICAgICB9LFxyXG4gICAgICBhbGxvd0NvbHVtblJlb3JkZXJpbmc6IGZhbHNlLFxyXG4gICAgICBjb2x1bW5IaWRpbmdFbmFibGVkOiBmYWxzZSxcclxuICAgICAgaG92ZXJTdGF0ZUVuYWJsZWQ6IHRydWUsXHJcbiAgICAgIGNvbHVtbkF1dG9XaWR0aDogZmFsc2UsXHJcbiAgICAgIHJvd0FsdGVybmF0aW9uRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgY29sdW1uTWluV2lkdGg6IDgwLFxyXG4gICAgICBvblJvd1VwZGF0aW5nOiAoZSkgPT4ge1xyXG4gICAgICAgIGlmICghZS5uZXdEYXRhIHx8ICFlLm9sZERhdGEpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGUuY29tcG9uZW50LmJlZ2luQ3VzdG9tTG9hZGluZygnVXBkYXRpbmcnKTtcclxuXHJcbiAgICAgICAgY29uc3QgdXBkYXRlZFJvbGVzID0gZS5uZXdEYXRhLlJvbGVzO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRSb2xlcyA9IGUub2xkRGF0YS5Sb2xlcztcclxuXHJcbiAgICAgICAgY29uc3QgYWRkT2xkRGF0YVRvTmV3RGF0YSA9IChmaWVsZE5hbWU6IHN0cmluZywgbmV3RGF0YVNlY3Rpb24gPSBlLm5ld0RhdGEsIG9sZERhdGFTZWN0aW9uID0gZS5vbGREYXRhKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIW5ld0RhdGFTZWN0aW9uLmhhc093blByb3BlcnR5KGZpZWxkTmFtZSkpIHtcclxuICAgICAgICAgICAgbmV3RGF0YVNlY3Rpb25bZmllbGROYW1lXSA9IG9sZERhdGFTZWN0aW9uW2ZpZWxkTmFtZV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHVwZGF0ZWRSb2xlcyAmJiBjdXJyZW50Um9sZXMpIHtcclxuICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHVwZGF0ZWRSb2xlcylcclxuICAgICAgICAgICAgLmZvckVhY2goKHJvbGVOYW1lKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZFJvbGUgPSB1cGRhdGVkUm9sZXNbcm9sZU5hbWVdO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRSb2xlID0gY3VycmVudFJvbGVzW3JvbGVOYW1lXTtcclxuXHJcbiAgICAgICAgICAgICAgdXBkYXRlZFJvbGUuSWQgPSBjdXJyZW50Um9sZS5JZDtcclxuXHJcbiAgICAgICAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnQ2FuQmVDcmVhdGVkJywgdXBkYXRlZFJvbGUsIGN1cnJlbnRSb2xlKTtcclxuICAgICAgICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdDYW5CZVJlYWQnLCB1cGRhdGVkUm9sZSwgY3VycmVudFJvbGUpO1xyXG4gICAgICAgICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0NhbkJlVXBkYXRlZCcsIHVwZGF0ZWRSb2xlLCBjdXJyZW50Um9sZSk7XHJcbiAgICAgICAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnQ2FuQmVEZWxldGVkJywgdXBkYXRlZFJvbGUsIGN1cnJlbnRSb2xlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdMYWJlbCcpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ09yZGVyJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnVG9vbFRpcCcpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0lzRGVmYXVsdFZpZXdGaWVsZCcpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0lzS2V5Q29sdW1uJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnR3JvdXBGaWVsZCcpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0Rpc3BsYXlUeXBlJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnRGF0YU93bmVyJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnWExTU2NoZWR1bGVMYWJlbCcpO1xyXG4gICAgICB9LFxyXG4gICAgICBvblJvd1VwZGF0ZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgZS5jb21wb25lbnQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG4gICAgICAgIGUuY29tcG9uZW50LnJlcGFpbnQoKTtcclxuICAgICAgfSxcclxuICAgICAgY29sdW1uczogdGhpcy5wcmVwYXJlTWFpbkdyaWRDb2x1bW5zKFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdOYW1lJyxcclxuICAgICAgICAgIGNhcHRpb246ICdGaWVsZCcsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgZml4ZWQ6IHRydWUsXHJcbiAgICAgICAgICBmaXhlZFBvc2l0aW9uOiAnbGVmdCcsXHJcbiAgICAgICAgICBzb3J0T3JkZXI6ICdhc2MnLFxyXG4gICAgICAgICAgd2lkdGg6IDE4MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0dyb3VwRmllbGQnLFxyXG4gICAgICAgICAgY2FwdGlvbjogJ0dyb3VwJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIHdpZHRoOiAyMDAsXHJcbiAgICAgICAgICBlZGl0Q2VsbFRlbXBsYXRlOiAoXywgY2VsbEluZm8pID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICQoJzxkaXYgLz4nKS5keFNlbGVjdEJveCh7XHJcbiAgICAgICAgICAgICAgdmFsdWU6IGNlbGxJbmZvLnZhbHVlLFxyXG4gICAgICAgICAgICAgIGRhdGFTb3VyY2U6IFsuLi5uZXcgU2V0KGdyaWQuZ2V0RGF0YVNvdXJjZSgpLml0ZW1zKCkuZmlsdGVyKChpKSA9PiBpLkdyb3VwRmllbGQpLm1hcCgoaSkgPT4gaS5Hcm91cEZpZWxkKS5zb3J0KCkpXSxcclxuICAgICAgICAgICAgICBhY2NlcHRDdXN0b21WYWx1ZTogdHJ1ZSxcclxuICAgICAgICAgICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjZWxsSW5mby5zZXRWYWx1ZShlLnZhbHVlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnTGFiZWwnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgd2lkdGg6IDE4MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ1R5cGUnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiBmYWxzZSxcclxuICAgICAgICAgIHdpZHRoOiA4MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0RhdGFPd25lcicsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICB3aWR0aDogODAsXHJcbiAgICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSgnRE8nLCAnRGF0YSBPd25lcicpXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdYTFNTY2hlZHVsZUxhYmVsJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIHdpZHRoOiA4MCxcclxuICAgICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKCdYTFMnLCAnWExTIFNjaGVkdWxlIExhYmVsJylcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0Rpc3BsYXlUeXBlJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIHdpZHRoOiAxNjAsXHJcbiAgICAgICAgICBjdXN0b21pemVUZXh0OiAoY2VsbEluZm8pID0+IHtcclxuICAgICAgICAgICAgaWYgKCFjZWxsSW5mby52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoY2VsbEluZm8udmFsdWUgYXMgc3RyaW5nKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZGlzcGxheVR5cGVzXHJcbiAgICAgICAgICAgICAgLmZpbmQoKGl0ZW0pID0+IGl0ZW0ua2V5ID09PSBzZXR0aW5ncy50eXBlKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZWRpdENlbGxUZW1wbGF0ZTogKF8sIGNlbGxJbmZvKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShjZWxsSW5mby52YWx1ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBzZXR0aW5ncyA/IHNldHRpbmdzLnR5cGUgOiBudWxsO1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gc2V0dGluZ3MgPyBzZXR0aW5ncy5kYXRhIDogW107XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gJCgnPGRpdiAvPicpLmR4RHJvcERvd25Cb3goe1xyXG4gICAgICAgICAgICAgIGRyb3BEb3duT3B0aW9uczogeyB3aWR0aDogNDAwIH0sXHJcbiAgICAgICAgICAgICAgZGF0YVNvdXJjZTogdGhpcy5kaXNwbGF5VHlwZXMsXHJcbiAgICAgICAgICAgICAgdmFsdWVFeHByOiAna2V5JyxcclxuICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICB2YWx1ZTogdHlwZSxcclxuICAgICAgICAgICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjZWxsSW5mby5zZXRWYWx1ZShlLnZhbHVlKTtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgJGNvbnRhaXRlciA9ICQoJzxkaXYgLz4nKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICRzZWxlY3RvciA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbygkY29udGFpdGVyKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICRib2R5ID0gJCgnPGRpdiBzdHlsZT1cIm1hcmdpbjogOHB4IDA7XCIgLz4nKS5hcHBlbmRUbygkY29udGFpdGVyKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICRidXR0b25zID0gJCgnPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IHJpZ2h0O1wiIC8+JykuYXBwZW5kVG8oJGNvbnRhaXRlcik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCAkc2F2ZUJ1dHRvbiA9ICQoJzxkaXYgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDhweDtcIiAvPicpLmFwcGVuZFRvKCRidXR0b25zKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICRjYW5jZWxCdXR0b24gPSAkKCc8ZGl2IHN0eWxlPVwibWFyZ2luLXJpZ2h0OiA4cHg7XCIgLz4nKS5hcHBlbmRUbygkYnV0dG9ucyk7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGVkaXRvciA9IHR5cGVcclxuICAgICAgICAgICAgICAgICAgPyB0aGlzLmdldERpc3BsYXlUeXBlRWRpdG9yKCRib2R5LCB0eXBlLCBkYXRhKVxyXG4gICAgICAgICAgICAgICAgICA6IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGVkaXRvcikge1xyXG4gICAgICAgICAgICAgICAgICAkYm9keS5odG1sKCcnKTtcclxuICAgICAgICAgICAgICAgICAgZWRpdG9yLnJlbmRlcigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICRzZWxlY3Rvci5keFNlbGVjdEJveCh7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1zOiB0aGlzLmRpc3BsYXlUeXBlcyxcclxuICAgICAgICAgICAgICAgICAgdmFsdWU6IHR5cGUsXHJcbiAgICAgICAgICAgICAgICAgIHZhbHVlRXhwcjogJ2tleScsXHJcbiAgICAgICAgICAgICAgICAgIGRpc3BsYXlFeHByOiAndmFsdWUnLFxyXG4gICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IgPSB0aGlzLmdldERpc3BsYXlUeXBlRWRpdG9yKCRib2R5LCBlLnZhbHVlLCBkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICAkYm9keS5odG1sKCcnKTtcclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IucmVuZGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgJHNhdmVCdXR0b24uZHhCdXR0b24oJ2luc3RhbmNlJykub3B0aW9uKCdkaXNhYmxlZCcsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgJHNhdmVCdXR0b24uZHhCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgICB0ZXh0OiAnU2F2ZScsXHJcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcclxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFlZGl0b3IsXHJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlZGl0b3JEYXRhID0gZWRpdG9yLmdldERhdGEoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlZGl0b3JEYXRhID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3U2V0dGluZ3MgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAkc2VsZWN0b3IuZHhTZWxlY3RCb3goJ2luc3RhbmNlJykub3B0aW9uKCd2YWx1ZScpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YTogZWRpdG9yRGF0YVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxJbmZvLnNldFZhbHVlKEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbEluZm8uY29tcG9uZW50LmNsb3NlRWRpdENlbGwoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkuYXBwZW5kVG8oJGJ1dHRvbnMpO1xyXG5cclxuICAgICAgICAgICAgICAgICRjYW5jZWxCdXR0b24uZHhCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgICB0ZXh0OiAnQ2FuY2VsJyxcclxuICAgICAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxJbmZvLmNvbXBvbmVudC5jbG9zZUVkaXRDZWxsKCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pLmFwcGVuZFRvKCRidXR0b25zKTtcclxuXHJcbiAgICAgICAgICAgICAgICAkY29udGFpdGVyLmR4U2Nyb2xsVmlldyh7XHJcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogJzEwMCUnXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJGNvbnRhaXRlcjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnSXNEZWZhdWx0Vmlld0ZpZWxkJyxcclxuICAgICAgICAgIGNhcHRpb246ICdEaXNwbGF5IGluIGRlZmF1bHQgdmlldycsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICB3aWR0aDogMTAwLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnSXNLZXlDb2x1bW4nLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgd2lkdGg6IDE1MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ09yZGVyJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHsgZm9ybWF0OiAnIycgfSxcclxuICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogJ3JhbmdlJyxcclxuICAgICAgICAgICAgICBtaW46IDAsXHJcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ09yZGVyIGNhblxcJ3QgYmUgbmVnYXRpdmUnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgICB3aWR0aDogODAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdXaWR0aCcsXHJcbiAgICAgICAgICBkYXRhVHlwZTogJ251bWJlcicsXHJcbiAgICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSgnV2lkdGgnLCAnV2lkdGggKGluIHBpeGVscyknKSxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHsgZm9ybWF0OiAnIycgfSxcclxuICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogJ3JhbmdlJyxcclxuICAgICAgICAgICAgICBtaW46IDEsXHJcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ1dpZHRoIGNhblxcJ3QgYmUgbGVzcyB0aGVuIDFweCdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgXSxcclxuICAgICAgICAgIHdpZHRoOiA4MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0hpZGluZ09yZGVyJyxcclxuICAgICAgICAgIGRhdGFUeXBlOiAnbnVtYmVyJyxcclxuICAgICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKCdIaWRlJywgJ0hpZGluZyBPcmRlcicpLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgZWRpdG9yT3B0aW9uczogeyBmb3JtYXQ6ICcjJyB9LFxyXG4gICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiAncmFuZ2UnLFxyXG4gICAgICAgICAgICAgIG1pbjogMSxcclxuICAgICAgICAgICAgICBtZXNzYWdlOiAnSGlkaW5nIG9yZGVyIGNhblxcJ3QgYmUgbGVzcyB0aGVuIDEnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgICB3aWR0aDogNzAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdUb29sVGlwJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIG1pbldpZHRoOiAxODBcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6ICdSb2xlcycsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBhbGxvd0hpZGluZzogZmFsc2UsXHJcbiAgICAgICAgICBzaG93SW5Db2x1bW5DaG9vc2VyOiB0cnVlLFxyXG4gICAgICAgICAgY29sdW1uczogdGhpcy5jcmVhdGVSb2xlc0NvbHVtbnModGhpcy5yb2xlcylcclxuICAgICAgICB9XHJcbiAgICAgIF0pLFxyXG4gICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zO1xyXG5cclxuICAgIGNvbnN0IGFkZGl0aW9uYWxPcHRpb25zID0ge1xyXG4gICAgICBzdW1tYXJ5Q29sdW1uOiAnTmFtZSdcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHRoaXMuaXNTdGFuZGFsb25lUGFnZSkge1xyXG4gICAgICBncmlkID0gY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkKHRoaXMuJGNvbnRhaW5lciwgZ3JpZE9wdGlvbnMsIGFkZGl0aW9uYWxPcHRpb25zLCB0aGlzLnBhZ2VUaXRsZSwgJycsIHRydWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZ3JpZCA9IGNyZWF0ZURlZmF1bHRHcmlkKHRoaXMuJGNvbnRhaW5lciwge1xyXG4gICAgICAgIG9wdGlvbnM6IGdyaWRPcHRpb25zLFxyXG4gICAgICAgIHN1bW1hcnlDb2x1bW46IGFkZGl0aW9uYWxPcHRpb25zLnN1bW1hcnlDb2x1bW4sXHJcbiAgICAgICAgdGl0bGU6IHRoaXMucGFnZVRpdGxlLFxyXG4gICAgICAgIGlzRnVsbFNjcmVlbjogZmFsc2UsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBncmlkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcmVwYXJlTWFpbkdyaWRDb2x1bW5zKGNvbHVtbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbltdKSB7XHJcbiAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICBpZiAoY29sdW1uLmFsbG93SGlkaW5nID09PSB1bmRlZmluZWQgfHwgY29sdW1uLmFsbG93SGlkaW5nID09PSBudWxsKSB7XHJcbiAgICAgICAgY29sdW1uLmFsbG93SGlkaW5nID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjb2x1bW4uc2hvd0luQ29sdW1uQ2hvb3NlciA9PT0gdW5kZWZpbmVkIHx8IGNvbHVtbi5zaG93SW5Db2x1bW5DaG9vc2VyID09PSBudWxsKSB7XHJcbiAgICAgICAgY29sdW1uLnNob3dJbkNvbHVtbkNob29zZXIgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtbnM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVJvbGVzQ29sdW1ucyhyb2xlczogc3RyaW5nW10pOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW5bXSB7XHJcbiAgICByZXR1cm4gcm9sZXNcclxuICAgICAgLm1hcCgocm9sZSkgPT4gKHtcclxuICAgICAgICBuYW1lOiByb2xlLFxyXG4gICAgICAgIGNhcHRpb246IHJvbGUsXHJcbiAgICAgICAgYWxsb3dIaWRpbmc6IHRydWUsXHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICBzaG93SW5Db2x1bW5DaG9vc2VyOiB0cnVlLFxyXG4gICAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICAgIHRoaXMuY3JlYXRlUm9sZXNQZXJtaXNzaW9uQ29sdW1uKHJvbGUsICdDYW5CZVJlYWQnLCB7XHJcbiAgICAgICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKCdSZWFkJywgJ1JlYWQnKVxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZVJvbGVzUGVybWlzc2lvbkNvbHVtbihyb2xlLCAnQ2FuQmVVcGRhdGVkJywge1xyXG4gICAgICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSgnRWRpdCcsICdFZGl0JylcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgXVxyXG4gICAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVJvbGVzUGVybWlzc2lvbkNvbHVtbihcclxuICAgIHJvbGU6IHN0cmluZywgcGVybWlzc2lvbk5hbWU6IHN0cmluZywgYmFzZUNvbHVtbk9wdGlvbnM/OiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW5cclxuICApOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4uYmFzZUNvbHVtbk9wdGlvbnMsXHJcbiAgICAgIG5hbWU6IGAke3JvbGV9XyR7cGVybWlzc2lvbk5hbWV9YCxcclxuICAgICAgZGF0YUZpZWxkOiBgUm9sZXMuJHtyb2xlfS4ke3Blcm1pc3Npb25OYW1lfWAsXHJcbiAgICAgIGFsbG93SGlkaW5nOiBmYWxzZSxcclxuICAgICAgc2hvd0luQ29sdW1uQ2hvb3NlcjogZmFsc2UsXHJcbiAgICAgIGFsbG93SGVhZGVyRmlsdGVyaW5nOiBmYWxzZSxcclxuICAgICAgYWxsb3dGaWx0ZXJpbmc6IGZhbHNlLFxyXG4gICAgICBtaW5XaWR0aDogNjBcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU1haW5HcmlkRGF0YVNvdXJjZSgpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydkYXRhU291cmNlJ10ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc3RvcmU6IGNyZWF0ZUR4RGF0YVNvdXJjZSh7XHJcbiAgICAgICAgbG9hZFVybDogdGhpcy5sb2FkRGF0YVVybCxcclxuICAgICAgICB1cGRhdGVVcmw6IHRoaXMudXBkYXRlRGF0YVVybCxcclxuICAgICAgICBrZXk6ICdOYW1lJyxcclxuICAgICAgfSlcclxuICAgIH07XHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBJY29uc0NvbHVtbkVkaXRvciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhOiBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW107XHJcbiAgcHJpdmF0ZSBncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCRjb250YWluZXI6IEpRdWVyeSwgZGF0YTogSUljb25zQ29sdW1uRWRpdG9ySXRlbVtdKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSAkY29udGFpbmVyO1xyXG4gICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBjb25zdCBvcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuUHJvcGVydGllcyA9IHtcclxuICAgICAgZGF0YVNvdXJjZTogdGhpcy5kYXRhLFxyXG4gICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgbW9kZTogJ3JvdycsXHJcbiAgICAgICAgYWxsb3dBZGRpbmc6IHRydWUsXHJcbiAgICAgICAgYWxsb3dEZWxldGluZzogdHJ1ZSxcclxuICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgIHVzZUljb25zOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIGhlYWRlckZpbHRlcjogeyB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICBncm91cGluZzogeyBjb250ZXh0TWVudUVuYWJsZWQ6IGZhbHNlIH0sXHJcbiAgICAgIGdyb3VwUGFuZWw6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgc2VhcmNoUGFuZWw6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgZmlsdGVyUm93OiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxyXG4gICAgICBzZWxlY3Rpb246IHtcclxuICAgICAgICBtb2RlOiAnbm9uZSdcclxuICAgICAgfSxcclxuICAgICAgY29sdW1uczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ3ZhbHVlJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ3RpdGxlJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ2ltYWdlJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIGNlbGxUZW1wbGF0ZTogKGNvbnRhaW5lciwgY2VsbERhdGEpID0+IHtcclxuICAgICAgICAgICAgJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgIC5jc3MoeyAndGV4dC1hbGlnbic6ICdjZW50ZXInIH0pXHJcbiAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8aW1nPicsIHsgc3JjOiBjZWxsRGF0YS5kYXRhLmltYWdlIH0pKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmRUbyhjb250YWluZXIpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVkaXRDZWxsVGVtcGxhdGU6IChfLCBjZWxsSW5mbykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpbWcgPSBjZWxsSW5mby52YWx1ZSB8fCAnJztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0ICRjb250YWluZXIgPSAkKCc8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcIiAvPicpO1xyXG4gICAgICAgICAgICBjb25zdCAkaW1nID0gJChgPGltZyBzcmM9XCIke2ltZ31cIiAvPmApO1xyXG4gICAgICAgICAgICBjb25zdCAkbGluayA9ICQoJzxhIGNsYXNzPVwiZHgtbGluayBkeC1pY29uLXVwbG9hZFwiIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyByaWdodDogOHB4OyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtc2l6ZTogMThweDtcIiAvPicpO1xyXG4gICAgICAgICAgICBjb25zdCAkZmlsZUlucHV0ID0gJCgnPGlucHV0IHR5cGU9XCJmaWxlXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCIgLz4nKTtcclxuXHJcbiAgICAgICAgICAgICRsaW5rLm9uKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgICAkZmlsZUlucHV0LmNsaWNrKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgJGZpbGVJbnB1dC5vbignY2hhbmdlJywgKGUpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoKGUudGFyZ2V0IGFzIGFueSkuZmlsZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgICAgICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgJGltZy5hdHRyKCdzcmMnLCAocmVhZGVyLnJlc3VsdCBhcyBzdHJpbmcpKTtcclxuICAgICAgICAgICAgICAgICAgY2VsbEluZm8uc2V0VmFsdWUoKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKSk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSAoZS50YXJnZXQgYXMgYW55KS5maWxlc1swXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZmlsZSkge1xyXG4gICAgICAgICAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICRpbWcuYXR0cignc3JjJywgJycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAkaW1nLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG4gICAgICAgICAgICAkbGluay5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuICAgICAgICAgICAgJGZpbGVJbnB1dC5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiAkY29udGFpbmVyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgIHR5cGU6ICdidXR0b25zJyxcclxuICAgICAgICAgIHdpZHRoOiAxMDAsXHJcbiAgICAgICAgICBidXR0b25zOiBbXHJcbiAgICAgICAgICAgICdlZGl0JyxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGhpbnQ6ICdEZWxldGUnLFxyXG4gICAgICAgICAgICAgIGljb246ICd0cmFzaCcsXHJcbiAgICAgICAgICAgICAgb25DbGljazogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvd3MgPSB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgKHJvd3MgYXMgYW55W10pLnNwbGljZShlLnJvdy5yb3dJbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgcm93cyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0ICRncmlkID0gJCgnPGRpdiAvPicpLmFwcGVuZFRvKHRoaXMuJGNvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5ncmlkID0gY3JlYXRlRGVmYXVsdEdyaWQoXHJcbiAgICAgICRncmlkLFxyXG4gICAgICB7XHJcbiAgICAgICAgb3B0aW9ucyxcclxuICAgICAgICBpc0Z1bGxTY3JlZW46IGZhbHNlXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGF0YSgpOiBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnKSBhcyBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW107XHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBQcmVkZWZpbmVkVmFsdWVzQ29sdW1uRWRpdG9yIHtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRhdGE6IElQcmVkZWZpbmVkVmFsdWVzRWRpdG9ySXRlbVtdO1xyXG4gIHByaXZhdGUgZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG5cclxuICBjb25zdHJ1Y3RvcigkY29udGFpbmVyOiBKUXVlcnksIGRhdGE6IElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXSkge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgY29uc3Qgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXMgPSB7XHJcbiAgICAgIGRhdGFTb3VyY2U6IHRoaXMuZGF0YSxcclxuICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgIG1vZGU6ICdyb3cnLFxyXG4gICAgICAgIGFsbG93QWRkaW5nOiB0cnVlLFxyXG4gICAgICAgIGFsbG93RGVsZXRpbmc6IHRydWUsXHJcbiAgICAgICAgYWxsb3dVcGRhdGluZzogdHJ1ZSxcclxuICAgICAgICB1c2VJY29uczogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBoZWFkZXJGaWx0ZXI6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgZ3JvdXBpbmc6IHsgY29udGV4dE1lbnVFbmFibGVkOiBmYWxzZSB9LFxyXG4gICAgICBncm91cFBhbmVsOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIHNlYXJjaFBhbmVsOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIGZpbHRlclJvdzogeyB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICByZW1vdGVPcGVyYXRpb25zOiBmYWxzZSxcclxuICAgICAgc2VsZWN0aW9uOiB7XHJcbiAgICAgICAgbW9kZTogJ25vbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICd2YWx1ZScsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgdHlwZTogJ2J1dHRvbnMnLFxyXG4gICAgICAgICAgd2lkdGg6IDEwMCxcclxuICAgICAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICAgICAgJ2VkaXQnLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgaGludDogJ0RlbGV0ZScsXHJcbiAgICAgICAgICAgICAgaWNvbjogJ3RyYXNoJyxcclxuICAgICAgICAgICAgICBvbkNsaWNrOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93cyA9IHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAocm93cyBhcyBhbnlbXSkuc3BsaWNlKGUucm93LnJvd0luZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCByb3dzKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgJGdyaWQgPSAkKCc8ZGl2IC8+JykuYXBwZW5kVG8odGhpcy4kY29udGFpbmVyKTtcclxuXHJcbiAgICB0aGlzLmdyaWQgPSBjcmVhdGVEZWZhdWx0R3JpZCgkZ3JpZCwge1xyXG4gICAgICBvcHRpb25zLFxyXG4gICAgICBpc0Z1bGxTY3JlZW46IGZhbHNlXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREYXRhKCk6IElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmlkLm9wdGlvbignZGF0YVNvdXJjZScpIGFzIElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXTtcclxuICB9XHJcbn1cclxuXHJcbmNsYXNzIFJhYmJpdEFjdGlvbkNvbHVtbkVkaXRvciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhOiBJUmFiYml0QWN0aW9uRWRpdG9yRGF0YTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGluaXREYXRhOiBJUmFiYml0QWN0aW9uRWRpdG9ySW5pdERhdGE7XHJcbiAgcHJpdmF0ZSBmb3JtOiBEZXZFeHByZXNzLnVpLmR4Rm9ybTtcclxuXHJcbiAgY29uc3RydWN0b3IoJGNvbnRhaW5lcjogSlF1ZXJ5LCBkYXRhOiBJUmFiYml0QWN0aW9uRWRpdG9yRGF0YSwgaW5pdERhdGE6IElSYWJiaXRBY3Rpb25FZGl0b3JJbml0RGF0YSkge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICB0aGlzLmluaXREYXRhID0gaW5pdERhdGE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgdGhpcy5mb3JtID0gJCgnPGRpdiAvPicpLmR4Rm9ybSh7XHJcbiAgICAgIGZvcm1EYXRhOiB0aGlzLmRhdGEsXHJcbiAgICAgIGxhYmVsTG9jYXRpb246ICd0b3AnLFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ2FjdGlvblR5cGUnLFxyXG4gICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbe1xyXG4gICAgICAgICAgICB0eXBlOiAncmVxdWlyZWQnXHJcbiAgICAgICAgICB9XVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnZmllbGRzJyxcclxuICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW3tcclxuICAgICAgICAgICAgdHlwZTogJ3JlcXVpcmVkJ1xyXG4gICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgdmFsaWRhdGlvbkNhbGxiYWNrOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiAoZS52YWx1ZSBhcyBhbnkpLmxlbmd0aCA+IDA7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdSZXF1aXJlZCdcclxuICAgICAgICAgIH1dLFxyXG4gICAgICAgICAgZWRpdG9yVHlwZTogJ2R4VGFnQm94JyxcclxuICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgZGF0YVNvdXJjZTogdGhpcy5pbml0RGF0YS5maWVsZHMsXHJcbiAgICAgICAgICAgIGRpc3BsYXlFeHByOiAnVGV4dCcsXHJcbiAgICAgICAgICAgIHZhbHVlRXhwcjogJ1ZhbHVlJyxcclxuICAgICAgICAgICAgc2VhcmNoRW5hYmxlZDogdHJ1ZVxyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VGFnQm94T3B0aW9uc1xyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfSkuYXBwZW5kVG8odGhpcy4kY29udGFpbmVyKS5keEZvcm0oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGF0YSgpOiBJUmFiYml0QWN0aW9uRWRpdG9yRGF0YSB7XHJcbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdGhpcy5mb3JtLnZhbGlkYXRlKCk7XHJcblxyXG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFjdGlvblR5cGUgPSB0aGlzLmZvcm0uZ2V0RWRpdG9yKCdhY3Rpb25UeXBlJykub3B0aW9uKCd2YWx1ZScpIGFzIHN0cmluZztcclxuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZm9ybS5nZXRFZGl0b3IoJ2ZpZWxkcycpLm9wdGlvbigndmFsdWUnKSBhcyBzdHJpbmdbXTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICBmaWVsZHNcclxuICAgIH07XHJcbiAgfVxyXG59XHJcblxyXG4oRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIGFzIGFueSkucmVnaXN0ZXJNb2R1bGUoJ2NvbHVtbkNob29zZXJTb3J0aW5nJywge1xyXG4gIGV4dGVuZGVyczoge1xyXG4gICAgY29udHJvbGxlcnM6IHtcclxuICAgICAgY29sdW1uczoge1xyXG4gICAgICAgIGdldENob29zZXJDb2x1bW5zKGxvYWRBbGxDb2x1bW5zKSB7XHJcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSAodGhpcyBhcyBhbnkpLmNhbGxCYXNlKGxvYWRBbGxDb2x1bW5zKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LnNvcnQoKGNvbHVtbjEsIGNvbHVtbjIpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2FwdGlvbjEgPSBjb2x1bW4xPy5jYXB0aW9uIHx8ICcnO1xyXG4gICAgICAgICAgICBjb25zdCBjYXB0aW9uMiA9IGNvbHVtbjI/LmNhcHRpb24gfHwgJyc7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gY2FwdGlvbjEubG9jYWxlQ29tcGFyZShjYXB0aW9uMik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn0pO1xyXG4iLCAiXHVGRUZGY29uc3QgYXJlQXJndW1lbnRzU2hhbGxvd2x5RXF1YWwgPSAocHJldjogYW55W10gfCBudWxsLCBuZXh0OiBhbnlbXSB8IG51bGwpID0+IHtcclxuICBpZiAocHJldiA9PT0gbnVsbCB8fCBuZXh0ID09PSBudWxsIHx8IHByZXYubGVuZ3RoICE9PSBuZXh0Lmxlbmd0aCkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICBpZiAocHJldltpXSAhPT0gbmV4dFtpXSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdHJ1ZTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBtZW1vaXplID0gPFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueT4oZnVuYzogVCk6IFQgPT4ge1xyXG4gIGxldCBsYXN0QXJnczogYW55W10gfCBudWxsID0gbnVsbDtcclxuICBsZXQgbGFzdFJlc3VsdDogdW5rbm93biB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG9ubHktYXJyb3ctZnVuY3Rpb25zXHJcbiAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgIGlmICghYXJlQXJndW1lbnRzU2hhbGxvd2x5RXF1YWwobGFzdEFyZ3MsIGFyZ3MpKSB7XHJcbiAgICAgIGxhc3RSZXN1bHQgPSBmdW5jKC4uLmFyZ3MgYXMgYW55KTtcclxuICAgIH1cclxuXHJcbiAgICBsYXN0QXJncyA9IGFyZ3M7XHJcblxyXG4gICAgcmV0dXJuIGxhc3RSZXN1bHQ7XHJcbiAgfSBhcyBUO1xyXG59O1xyXG4iLCAiXHVGRUZGLy8gdHNsaW50OmRpc2FibGU6IG1lbWJlci1vcmRlcmluZ1xyXG5pbXBvcnQgeyBJR3JpZFN0YXRlIH0gZnJvbSAnLi9HcmlkU3RhdGUnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IG1lbW9pemUgfSBmcm9tICcuLi8uLi8uLi9VdGlscy9NZW1vaXplJztcclxuaW1wb3J0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uIGZyb20gJy4uLy4uLy4uL0RhdGEvTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXlWaWV3IHtcclxuICByZWFkb25seSBpZDogbnVtYmVyO1xyXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcclxuICByZWFkb25seSBncmlkU3RhdGU6IElHcmlkU3RhdGUgfCBudWxsO1xyXG4gIGlzR2xvYmFsOiBib29sZWFuO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5Vmlld0R0byB7XHJcbiAgSWQ6IG51bWJlcjtcclxuICBOYW1lOiBzdHJpbmc7XHJcbiAgR3JpZFN0YXRlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xyXG4gIElzR2xvYmFsOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkVmlld3NNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgLy8gcmVhZG9ubHkgZGVmYXVsdE9wZW5lZFZpZXdJZDogbnVtYmVyO1xyXG4gIGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgaW5zZXJ0RGF0YVVybDogc3RyaW5nO1xyXG4gIHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBkZWxldGVEYXRhVXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbnR5cGUgQ29udHJvbERpc3BsYXlWaWV3VXBkYXRlcyA9IFBhcnRpYWw8UGljazxJQ29udHJvbERpc3BsYXlWaWV3LCAnbmFtZScgfCAnZ3JpZFN0YXRlJyB8ICdpc0dsb2JhbCc+PjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkVmlld3NNYW5hZ2VyIHtcclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGRlZmF1bHRDb250cm9sRGlzcGxheVZpZXc6IElDb250cm9sRGlzcGxheVZpZXcgPSB7XHJcbiAgICBpZDogMCxcclxuICAgIG5hbWU6ICdEZWZhdWx0JyxcclxuICAgIGdyaWRTdGF0ZTogbnVsbCxcclxuICAgIGlzR2xvYmFsOiBmYWxzZVxyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGRlZmF1bHRWaWV3cyA9IFtHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXddO1xyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcclxuICBwcml2YXRlIF9jdXJyZW50Vmlld0lkOiBudW1iZXIgPSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQ7XHJcbiAgcHJpdmF0ZSB2aWV3czogSUNvbnRyb2xEaXNwbGF5Vmlld1tdID0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Vmlld3M7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zZXJ0RGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGdldFZpZXdCeUlkSW50ZXJuYWwgPSAodmlld0lkOiBudW1iZXIpID0+IHtcclxuICAgIHJldHVybiB0aGlzLnZpZXdzICYmIHRoaXMudmlld3MuZmluZCgodikgPT4gdi5pZCA9PT0gdmlld0lkKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBnZXRWaWV3QnlJZCA9IG1lbW9pemUodGhpcy5nZXRWaWV3QnlJZEludGVybmFsKTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zKSB7XHJcbiAgICB0aGlzLmxvYWREYXRhVXJsID0gb3B0aW9ucy5sb2FkRGF0YVVybDtcclxuICAgIHRoaXMuaW5zZXJ0RGF0YVVybCA9IG9wdGlvbnMuaW5zZXJ0RGF0YVVybDtcclxuICAgIHRoaXMudXBkYXRlRGF0YVVybCA9IG9wdGlvbnMudXBkYXRlRGF0YVVybDtcclxuICAgIHRoaXMuZGVsZXRlRGF0YVVybCA9IG9wdGlvbnMuZGVsZXRlRGF0YVVybDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudFZpZXcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRWaWV3QnlJZCh0aGlzLl9jdXJyZW50Vmlld0lkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudFZpZXdJZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50Vmlld0lkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBjdXJyZW50Vmlld0lkKGlkOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2N1cnJlbnRWaWV3SWQgPSBpZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRWaWV3cygpOiBQcm9taXNlPElDb250cm9sRGlzcGxheVZpZXdbXT4ge1xyXG4gICAgaWYgKHRoaXMudmlld3MgPT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdFZpZXdzKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMubG9hZFZpZXdzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMudmlld3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQ3VycmVudFZpZXcodmlld1VwZGF0ZXM6IENvbnRyb2xEaXNwbGF5Vmlld1VwZGF0ZXMpIHtcclxuICAgIHJldHVybiB0aGlzLnVwZGF0ZVZpZXcodGhpcy5jdXJyZW50Vmlldy5pZCwgdmlld1VwZGF0ZXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNyZWF0ZU5ld1ZpZXcodmlld05hbWU6IHN0cmluZywgZ3JpZFN0YXRlOiBJR3JpZFN0YXRlLCBpc0dsb2JhbCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5Vmlldz4ge1xyXG4gICAgbGV0IG5ld1ZpZXdEdG86IElDb250cm9sRGlzcGxheVZpZXdEdG8gPSB0aGlzLm1hcFZpZXdNb2RlbFRvRHRvKHtcclxuICAgICAgaWQ6IC0xLFxyXG4gICAgICBuYW1lOiB2aWV3TmFtZSxcclxuICAgICAgZ3JpZFN0YXRlLFxyXG4gICAgICBpc0dsb2JhbFxyXG4gICAgfSk7XHJcblxyXG4gICAgbmV3Vmlld0R0byA9IGF3YWl0IHNlbmRSZXF1ZXN0PElDb250cm9sRGlzcGxheVZpZXdEdG8+KHRoaXMuaW5zZXJ0RGF0YVVybCwgJ1BPU1QnLCBuZXdWaWV3RHRvKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdzKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubWFwVmlld0R0b1RvTW9kZWwobmV3Vmlld0R0byk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgdXBkYXRlVmlldyh2aWV3SWQ6IG51bWJlciwgdXBkYXRlczogQ29udHJvbERpc3BsYXlWaWV3VXBkYXRlcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKHZpZXdJZCA9PT0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3QnlJZCh2aWV3SWQpO1xyXG4gICAgaWYgKCF2aWV3KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB1cGRhdGVkVmlldzogSUNvbnRyb2xEaXNwbGF5VmlldyA9IHtcclxuICAgICAgLi4udmlldyxcclxuICAgICAgLi4udXBkYXRlc1xyXG4gICAgfTtcclxuICAgIGxldCB1cGRhdGVkVmlld0R0bzogSUNvbnRyb2xEaXNwbGF5Vmlld0R0byA9IHRoaXMubWFwVmlld01vZGVsVG9EdG8odXBkYXRlZFZpZXcpO1xyXG5cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgICB1cGRhdGVkVmlld0R0byA9IGF3YWl0IHNlbmRSZXF1ZXN0PElDb250cm9sRGlzcGxheVZpZXdEdG8+KHRoaXMudXBkYXRlRGF0YVVybCwgJ1BVVCcsIHVwZGF0ZWRWaWV3RHRvKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdzKCk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZGVsZXRlVmlldyh2aWV3SWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKHZpZXdJZCA9PT0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3QnlJZCh2aWV3SWQpO1xyXG4gICAgaWYgKCF2aWV3KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCBzZW5kUmVxdWVzdCh0aGlzLmRlbGV0ZURhdGFVcmwsICdERUxFVEUnLCB7IHZpZXdJZCB9KTtcclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdzKCk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGxvYWRWaWV3cygpIHtcclxuICAgIGNvbnN0IHZpZXdzID0gYXdhaXQgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb248SUNvbnRyb2xEaXNwbGF5Vmlld0R0b1tdPih0aGlzLmxvYWREYXRhVXJsKTtcclxuXHJcbiAgICB0aGlzLnZpZXdzID0gdmlld3MubWFwKChkdG8pID0+IHRoaXMubWFwVmlld0R0b1RvTW9kZWwoZHRvKSk7XHJcbiAgICB0aGlzLnZpZXdzLnVuc2hpZnQoR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3KTtcclxuICAgIC8vIE5PVEU6IHJlc2V0IG1lbW9pemVcclxuICAgIHRoaXMucmVzZXRDYWNoZWRSZXN1bHRPZkdldFZpZXdCeUlkRnVuY3Rpb24oKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy52aWV3cztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwVmlld01vZGVsVG9EdG8obW9kZWw6IElDb250cm9sRGlzcGxheVZpZXcpOiBJQ29udHJvbERpc3BsYXlWaWV3RHRvIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIElkOiBtb2RlbC5pZCxcclxuICAgICAgTmFtZTogbW9kZWwubmFtZSxcclxuICAgICAgR3JpZFN0YXRlOiBKU09OLnN0cmluZ2lmeShtb2RlbC5ncmlkU3RhdGUpLFxyXG4gICAgICBJc0dsb2JhbDogbW9kZWwuaXNHbG9iYWxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hcFZpZXdEdG9Ub01vZGVsKGR0bzogSUNvbnRyb2xEaXNwbGF5Vmlld0R0byk6IElDb250cm9sRGlzcGxheVZpZXcge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWQ6IGR0by5JZCxcclxuICAgICAgbmFtZTogZHRvLk5hbWUsXHJcbiAgICAgIGdyaWRTdGF0ZTogSlNPTi5wYXJzZShkdG8uR3JpZFN0YXRlKSxcclxuICAgICAgaXNHbG9iYWw6IGR0by5Jc0dsb2JhbFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXRDYWNoZWRSZXN1bHRPZkdldFZpZXdCeUlkRnVuY3Rpb24oKSB7XHJcbiAgICB0aGlzLmdldFZpZXdCeUlkID0gbWVtb2l6ZSh0aGlzLmdldFZpZXdCeUlkSW50ZXJuYWwpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUdyaWRTdGF0ZSB9IGZyb20gJy4vR3JpZFN0YXRlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgb3duZXI6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICByZWFkb25seSBpbml0aWFsU3RhdGU6IElHcmlkU3RhdGUgfCBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgT25lVGltZUdyaWRTdGF0ZU1hbmFnZXIge1xyXG4gIHB1YmxpYyBjdXJyZW50U2F2ZWRHcmlkU3RhdGU6IElHcmlkU3RhdGU7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogSU9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyT3B0aW9ucztcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSU9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyT3B0aW9ucykge1xyXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICAgIHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlID0gb3B0aW9ucy5pbml0aWFsU3RhdGU7XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLm93bmVyLm9wdGlvbignc3RhdGVTdG9yaW5nJywge1xyXG4gICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgY3VzdG9tTG9hZDogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlKVxyXG4gICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydzdGF0ZVN0b3JpbmcnXSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGhhc0NoYW5nZXMoKSB7XHJcbiAgICAvLyBUT0RPOiB1c2UgZGVlcCBlcXVhbFxyXG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlICE9PSBudWxsICYmIEpTT04uc3RyaW5naWZ5KHRoaXMuY3VycmVudFVuc2F2ZWRHcmlkU3RhdGUpICE9PSBKU09OLnN0cmluZ2lmeShcclxuICAgICAgdGhpcy5jdXJyZW50U2F2ZWRHcmlkU3RhdGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXJyZW50VW5zYXZlZEdyaWRTdGF0ZSgpOiBJR3JpZFN0YXRlIHtcclxuICAgIHJldHVybiB0aGlzLnByZXBhcmVVbnNhdmVkR3JpZFN0YXRlKHRoaXMub3B0aW9ucy5vd25lci5zdGF0ZSgpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBhcHBseShncmlkU3RhdGU6IElHcmlkU3RhdGUgfCBudWxsLCByZXNldEZpbHRlciA9IHRydWUpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRGaWx0ZXIgPSByZXNldEZpbHRlciA/IHVuZGVmaW5lZCA6IHRoaXMub3B0aW9ucy5vd25lci5maWx0ZXIoKTtcclxuXHJcbiAgICAgIC8qIE5PVEU6IFNvbWV0aW1lcyBhIGdyaWQgY2FuIHJldHVybiBhIG5ldyBzdGF0ZSB3aXRoIG9sZCBmaWx0ZXJWYWx1ZSxcclxuICAgICAgICBzbyB3ZSBzaG91bGQgcmVzZXQgdGhlIGZpbHRlclZhbHVlIGJlZm9yZSBzdGF0ZSBhcHBseWluZ1xyXG4gICAgICAgIGlmIHRoaXMgYnVnIHdpbGwgYmUgZml4ZWQgb24gdGhlIERldkV4dHJlbWUgc2lkZSB3ZSBjYW4gcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZVxyXG4gICAgICAqL1xyXG4gICAgICB0aGlzLm9wdGlvbnMub3duZXIuYmVnaW5VcGRhdGUoKTtcclxuICAgICAgdGhpcy5vcHRpb25zLm93bmVyLmNsZWFyRmlsdGVyKCdmaWx0ZXJWYWx1ZScpO1xyXG5cclxuICAgICAgdGhpcy5vcHRpb25zLm93bmVyLnN0YXRlKGdyaWRTdGF0ZSk7XHJcblxyXG4gICAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHRoaXMub3B0aW9ucy5vd25lci5nZXRWaXNpYmxlQ29sdW1ucygpLmZpbHRlcigoYykgPT4gIWMudHlwZSk7XHJcblxyXG4gICAgICBpZiAodmlzaWJsZUNvbHVtbnNbMF0gJiYgdmlzaWJsZUNvbHVtbnNbMF0uZGF0YUZpZWxkKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLm93bmVyLm9wdGlvbignc3VtbWFyeScsIHtcclxuICAgICAgICAgIHRvdGFsSXRlbXM6IFt7XHJcbiAgICAgICAgICAgIGNvbHVtbjogdmlzaWJsZUNvbHVtbnNbMF0uZGF0YUZpZWxkLFxyXG4gICAgICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xyXG4gICAgICAgICAgfV1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY3VycmVudEZpbHRlciAmJiB0aGlzLm9wdGlvbnMub3duZXIuZmlsdGVyKGN1cnJlbnRGaWx0ZXIpO1xyXG4gICAgICB0aGlzLm9wdGlvbnMub3duZXIuZW5kVXBkYXRlKCk7XHJcblxyXG4gICAgICBjb25zdCBvbkNvbnRlbnRSZWFkeSA9ICgpID0+IHtcclxuICAgICAgICB0aGlzLnNhdmUoKTtcclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLm93bmVyLm9mZignY29udGVudFJlYWR5Jywgb25Db250ZW50UmVhZHkpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5vcHRpb25zLm93bmVyLm9uKCdjb250ZW50UmVhZHknLCBvbkNvbnRlbnRSZWFkeSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzYXZlKCkge1xyXG4gICAgdGhpcy5jdXJyZW50U2F2ZWRHcmlkU3RhdGUgPSB0aGlzLmN1cnJlbnRVbnNhdmVkR3JpZFN0YXRlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc2V0KCkge1xyXG4gICAgdGhpcy5vcHRpb25zLm93bmVyLnN0YXRlKHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlcGFyZVVuc2F2ZWRHcmlkU3RhdGUodW5zYXZlZEdyaWRTdGF0ZTogSUdyaWRTdGF0ZSk6IElHcmlkU3RhdGUge1xyXG4gICAgaWYgKHVuc2F2ZWRHcmlkU3RhdGUuY29sdW1ucykge1xyXG4gICAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHVuc2F2ZWRHcmlkU3RhdGUuY29sdW1uc1xyXG4gICAgICAgIC5maWx0ZXIoKGMpID0+IGMudmlzaWJsZSk7XHJcbiAgICAgIGNvbnN0IGxhc3RDb2x1bW4gPSB2aXNpYmxlQ29sdW1uc1t2aXNpYmxlQ29sdW1ucy5sZW5ndGggLSAxXTtcclxuICAgICAgbGFzdENvbHVtbi53aWR0aCA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdW5zYXZlZEdyaWRTdGF0ZTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEdyaWRWaWV3c01hbmFnZXIsIElHcmlkVmlld3NNYW5hZ2VyT3B0aW9ucyB9IGZyb20gJy4vR3JpZFZpZXdzTWFuYWdlcic7XHJcbmltcG9ydCB7IE9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9HcmlkU3RhdGVNYW5hZ2VyJztcclxuaW1wb3J0IHsgTXV0YWJsZSB9IGZyb20gJy4uLy4uLy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcbmltcG9ydCB7IGNyZWF0ZURpYWxvZyB9IGZyb20gJy4uLy4uLy4uL1dpZGdldHMvUG9wdXAnO1xyXG5pbXBvcnQgbm90aWZ5IGZyb20gJy4uLy4uLy4uL1dpZGdldHMvTm90aWZ5JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnRPcHRpb25zIHtcclxuICByZWFkb25seSBvd25lcjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gIHJlYWRvbmx5IGdyaWRWaWV3c01hbmFnZXI6IEdyaWRWaWV3c01hbmFnZXI7XHJcbiAgcmVhZG9ubHkgZ3JpZFN0YXRlTWFuYWdlcjogT25lVGltZUdyaWRTdGF0ZU1hbmFnZXI7XHJcbiAgcmVhZG9ubHkgYXV0b0ludGVncmF0aW9uOiBib29sZWFuO1xyXG4gIHJlYWRvbmx5IG9uVmlld0FwcGxpZWQ/OiAodmlld0lkOiBudW1iZXIpID0+IHZvaWQ7XHJcbiAgcmVhZG9ubHkgb25WaWV3RGVsZXRlZD86ICh2aWV3SWQ6IG51bWJlcikgPT4gdm9pZDtcclxuICByZWFkb25seSBjYW5DcmVhdGVHbG9iYWxWaWV3czogYm9vbGVhbjtcclxuICByZWFkb25seSB2aXNpYmxlOiBib29sZWFuO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnREZWZhdWx0T3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgZ3JpZFZpZXdzTWFuYWdlcjogR3JpZFZpZXdzTWFuYWdlcjtcclxuICByZWFkb25seSBncmlkVmlld3NNYW5hZ2VyT3B0aW9uczogSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zO1xyXG4gIHJlYWRvbmx5IGdyaWRTdGF0ZU1hbmFnZXI6IE9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGF1dG9JbnRlZ3JhdGlvbjogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMgPVxyXG4gIE11dGFibGU8T21pdDxJR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMsIGtleW9mIElHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50RGVmYXVsdE9wdGlvbnM+PiAmXHJcbiAgTXV0YWJsZTxQYXJ0aWFsPElHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50RGVmYXVsdE9wdGlvbnM+PjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50IHtcclxuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogSUdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnRPcHRpb25zO1xyXG4gIC8vIHRvb2xiYXIgaXRlbXNcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZSB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfdmlld3NUb29sYmFySXRlbTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHwgdW5kZWZpbmVkO1xyXG4gIC8vIHRzbGludDplbmFibGUgdmFyaWFibGUtbmFtZVxyXG5cclxuICAvLyB0b29sYmFyIHdpZGdldHNcclxuICBwcml2YXRlIHZpZXdzRHJvcGRvd25Cb3g6IERldkV4cHJlc3MudWkuZHhTZWxlY3RCb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSB2aWV3c0RhdGFHcmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBjdXJyZW50Vmlld1RpdGxlOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHNhdmVWaWV3QnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgc2F2ZVZpZXdBc0J1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGNvbHVtbkNob29zZXJCdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b24gfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnRPcHRpb25zKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSB7XHJcbiAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICAgIGdyaWRTdGF0ZU1hbmFnZXI6IG9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlciA/IG9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlciA6IG5ldyBPbmVUaW1lR3JpZFN0YXRlTWFuYWdlcih7XHJcbiAgICAgICAgb3duZXI6IG9wdGlvbnMub3duZXIsXHJcbiAgICAgICAgaW5pdGlhbFN0YXRlOiBudWxsXHJcbiAgICAgIH0pLFxyXG4gICAgICBncmlkVmlld3NNYW5hZ2VyOiBvcHRpb25zLmdyaWRWaWV3c01hbmFnZXIgPyBvcHRpb25zLmdyaWRWaWV3c01hbmFnZXIgOiBuZXcgR3JpZFZpZXdzTWFuYWdlcihvcHRpb25zLmdyaWRWaWV3c01hbmFnZXJPcHRpb25zKSxcclxuICAgICAgYXV0b0ludGVncmF0aW9uOiAob3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAhPT0gbnVsbClcclxuICAgICAgICA/IG9wdGlvbnMuYXV0b0ludGVncmF0aW9uIDogdHJ1ZVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLm9wdGlvbnMuYXV0b0ludGVncmF0aW9uICYmIHRoaXMuaW50ZWdyYXRlVG9HcmlkKHRoaXMub3B0aW9ucy5vd25lcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgdHJ5QXBwbHlWaWV3KHZpZXdJZDogbnVtYmVyIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBpc0NhbkJlVmlld0FwcGxpZWQgPSBhd2FpdCB0aGlzLmNvbmZpcm1DaGFuZ2VzTG9zcygpO1xyXG5cclxuICAgIGlmIChpc0NhbkJlVmlld0FwcGxpZWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5hcHBseVZpZXcodmlld0lkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNDYW5CZVZpZXdBcHBsaWVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGFwcGx5Vmlldyh2aWV3SWQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5iZWdpblZpZXdBcHBseWluZ0xvYWRpbmcoKTtcclxuXHJcbiAgICB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkID0gdmlld0lkO1xyXG4gICAgYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIuYXBwbHkodGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXcuZ3JpZFN0YXRlLCBmYWxzZSk7XHJcblxyXG4gICAgdGhpcy5lbmRWaWV3QXBwbHlpbmdMb2FkaW5nKCk7XHJcbiAgICB0aGlzLnN5bmNVSVdpdGhDdXJyZW50VmlldygpO1xyXG5cclxuICAgIHRoaXMub3B0aW9ucy5vblZpZXdBcHBsaWVkICYmIHRoaXMub3B0aW9ucy5vblZpZXdBcHBsaWVkKHZpZXdJZCk7XHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbnRlZ3JhdGVUb0dyaWQoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VG9vbGJhclByZXBhcmluZyA9IGdyaWQub3B0aW9uKCdvblRvb2xiYXJQcmVwYXJpbmcnKTtcclxuXHJcbiAgICBncmlkLm9wdGlvbignb25Ub29sYmFyUHJlcGFyaW5nJywgKGU6IGFueSkgPT4ge1xyXG4gICAgICBjdXJyZW50VG9vbGJhclByZXBhcmluZyAmJiBjdXJyZW50VG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgICAgdGhpcy5vbkdyaWRUb29sYmFyUHJlcGFyaW5nKGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9uR3JpZFRvb2xiYXJQcmVwYXJpbmc6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnNbJ29uVG9vbGJhclByZXBhcmluZyddID0gKGUpID0+IHtcclxuICAgIGNvbnN0IHRvb2xiYXJJdGVtcyA9IGUudG9vbGJhck9wdGlvbnMgJiYgZS50b29sYmFyT3B0aW9ucy5pdGVtcztcclxuICAgIGlmICghdG9vbGJhckl0ZW1zKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbW92ZURlZmF1bHRDb2x1bW5DaG9vc2VyQnV0dG9uKHRvb2xiYXJJdGVtcyk7XHJcblxyXG4gICAgdG9vbGJhckl0ZW1zLnNwbGljZSgxLCAwLFxyXG4gICAgICB0aGlzLnZpZXdzVG9vbGJhckl0ZW0sXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVEZWZhdWx0Q29sdW1uQ2hvb3NlckJ1dHRvbih0b29sYmFySXRlbXM6IEFycmF5PHsgbmFtZT86IHN0cmluZyB9Pikge1xyXG4gICAgdG9vbGJhckl0ZW1zLnNwbGljZSh0b29sYmFySXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdjb2x1bW5DaG9vc2VyQnV0dG9uJyksIDEpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgdmlld3NUb29sYmFySXRlbSgpIHtcclxuICAgIGlmICghdGhpcy5fdmlld3NUb29sYmFySXRlbSkge1xyXG4gICAgICB0aGlzLl92aWV3c1Rvb2xiYXJJdGVtID0gdGhpcy5jcmVhdGVWaWV3c1Rvb2xiYXJJdGVtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdzVG9vbGJhckl0ZW07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBpc0RlZmF1bHRWaWV3KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQgPT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGhhc0NoYW5nZXMoKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VmlldyA9IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3O1xyXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRWaWV3VGl0bGUpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRWaWV3VGl0bGUub3B0aW9uKCd2YWx1ZScpICE9PSBjdXJyZW50Vmlldy5uYW1lIHx8IHRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyLmhhc0NoYW5nZXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVZpZXdzVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHtcclxuICAgIGxldCBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHdpZGdldDogJ2R4RHJvcERvd25Cb3gnIGFzIGFueSxcclxuICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgIHRleHQ6ICdWaWV3cycsXHJcbiAgICAgIHZpc2libGU6IHRoaXMub3B0aW9ucy52aXNpYmxlLFxyXG4gICAgICBjc3NDbGFzczogJ2Fwcy12aWV3c19fdG9vbGJhci1pdGVtJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdpc3pvbGVhLW1kJ30sXHJcbiAgICAgICAgaXRlbXM6IFtHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXddLFxyXG4gICAgICAgIHZhbHVlOiBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQsXHJcbiAgICAgICAgdmFsdWVFeHByOiAnaWQnLFxyXG4gICAgICAgIGRpc3BsYXlFeHByOiAnbmFtZScsXHJcbiAgICAgICAgd2lkdGg6IDIwMCxcclxuICAgICAgICBkcm9wRG93bk9wdGlvbnM6IHtcclxuICAgICAgICAgIHdpZHRoOiA1NTBcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnZpZXdzRHJvcGRvd25Cb3ggPSBlLmNvbXBvbmVudDtcclxuICAgICAgICAgIHRoaXMubG9hZFZpZXdEcm9wZG93bkJveERhdGEoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uVmFsdWVDaGFuZ2VkOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGUudmFsdWUgPT09IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQgfHwgIWlzTmVlZEhhbmRsZVZhbHVlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGlzVmlld0FwcGxpZWQgPSBhd2FpdCB0aGlzLnRyeUFwcGx5VmlldyhlLnZhbHVlKTtcclxuICAgICAgICAgIGlmIChpc1ZpZXdBcHBsaWVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuc3luY1VJV2l0aEN1cnJlbnRWaWV3KHRydWUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29udGVudFRlbXBsYXRlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFlLmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy52aWV3c0RhdGFHcmlkID0gdGhpcy5jcmVhdGVWaWV3c0RhdGFHcmlkKGUuY29tcG9uZW50KTtcclxuICAgICAgICAgIHRoaXMuY3VycmVudFZpZXdUaXRsZSA9IHRoaXMuY3JlYXRlQ3VycmVudFZpZXdUaXRsZShlLmNvbXBvbmVudCk7XHJcbiAgICAgICAgICB0aGlzLnNhdmVWaWV3QnV0dG9uID0gdGhpcy5jcmVhdGVTYXZlVmlld0J1dHRvbigpO1xyXG4gICAgICAgICAgdGhpcy5zYXZlVmlld0FzQnV0dG9uID0gdGhpcy5jcmVhdGVTYXZlVmlld0FzQnV0dG9uKCk7XHJcbiAgICAgICAgICB0aGlzLmNvbHVtbkNob29zZXJCdXR0b24gPSB0aGlzLmNyZWF0ZUNvbHVtbkNob29zZXJCdXR0b24oKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRlbnRIZWFkZXIgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgLmFkZENsYXNzKCdhcHMtdmlld3NfX2hlYWRlcicpXHJcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy5jdXJyZW50Vmlld1RpdGxlLmVsZW1lbnQoKSlcclxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLnNhdmVWaWV3QnV0dG9uLmVsZW1lbnQoKSlcclxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLnNhdmVWaWV3QXNCdXR0b24uZWxlbWVudCgpKVxyXG4gICAgICAgICAgICAuYXBwZW5kKHRoaXMuY29sdW1uQ2hvb3NlckJ1dHRvbi5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udGVudCA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAuaGVpZ2h0KCcxMDAlJylcclxuICAgICAgICAgICAgLmFwcGVuZChkcm9wZG93bkNvbnRlbnRIZWFkZXIpXHJcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy52aWV3c0RhdGFHcmlkLmVsZW1lbnQoKSk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIGRyb3Bkb3duQ29udGVudDtcclxuICAgICAgICB9LFxyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveE9wdGlvbnNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVZpZXdzRGF0YUdyaWQoZHJvcGRvd25Cb3hPd25lcjogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94KTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JylcclxuICAgICAgLmR4RGF0YUdyaWQoe1xyXG4gICAgICAgIGRhdGFTb3VyY2U6IGRyb3Bkb3duQm94T3duZXIuZ2V0RGF0YVNvdXJjZSgpLFxyXG4gICAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxyXG4gICAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICAgIGFsbG93QWRkaW5nOiBmYWxzZSxcclxuICAgICAgICAgIGFsbG93VXBkYXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBhbGxvd0RlbGV0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgbW9kZTogJ2NlbGwnLFxyXG4gICAgICAgICAgdXNlSWNvbnM6IHRydWUsXHJcbiAgICAgICAgICB0ZXh0czoge1xyXG4gICAgICAgICAgICBjb25maXJtRGVsZXRlTWVzc2FnZTogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyB2aWV3PydcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHdvcmRXcmFwRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBsb2FkUGFuZWw6IHtcclxuICAgICAgICAgIHNoYWRpbmc6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnbmFtZScsXHJcbiAgICAgICAgICAgIGFsbG93RWRpdGluZzogZmFsc2VcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ2lzR2xvYmFsJyxcclxuICAgICAgICAgICAgY2FwdGlvbjogJ0lzIEdsb2JhbCcsXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnYm9vbGVhbicsXHJcbiAgICAgICAgICAgIHdpZHRoOiA3MFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdHlwZTogJ2J1dHRvbnMnLFxyXG4gICAgICAgICAgICBidXR0b25zOiBbXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogJ2RlbGV0ZScsXHJcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiAoZSkgPT4gZS5yb3cgJiYgZS5yb3cua2V5ICE9PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWRcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH1cclxuICAgICAgICBdLFxyXG4gICAgICAgIGtleWJvYXJkTmF2aWdhdGlvbjoge1xyXG4gICAgICAgICAgZWRpdE9uS2V5UHJlc3M6IGZhbHNlLFxyXG4gICAgICAgICAgZW5hYmxlZDogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNob3dDb2x1bW5IZWFkZXJzOiB0cnVlLFxyXG4gICAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGZvY3VzZWRSb3dFbmFibGVkOiBmYWxzZSxcclxuICAgICAgICBzaG93Qm9yZGVyczogZmFsc2UsXHJcbiAgICAgICAgc2hvd0NvbHVtbkxpbmVzOiBmYWxzZSxcclxuICAgICAgICBzZWxlY3Rpb246IHsgbW9kZTogJ3NpbmdsZScgfSxcclxuICAgICAgICBoZWlnaHQ6ICdjYWxjKDEwMCUgLSA1MXB4KScsXHJcbiAgICAgICAgc2Nyb2xsaW5nOiB7IG1vZGU6ICdzdGFuZGFyZCcgfSxcclxuICAgICAgICBwYWdpbmc6IHsgZW5hYmxlZDogZmFsc2UgfSxcclxuICAgICAgICBub0RhdGFUZXh0OiAnTm8gdmlld3MnLFxyXG4gICAgICAgIG9uU2VsZWN0aW9uQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICAgIGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCd2YWx1ZScsIGUuc2VsZWN0ZWRSb3dLZXlzICYmIGUuc2VsZWN0ZWRSb3dLZXlzLmxlbmd0aCA/IGUuc2VsZWN0ZWRSb3dLZXlzWzBdIDogMCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkVkaXRvclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgICAgIGlmIChlLmRhdGFGaWVsZCA9PT0gJ2lzR2xvYmFsJykge1xyXG4gICAgICAgICAgICBlLmVkaXRvck9wdGlvbnMuZGlzYWJsZWQgPSAhdGhpcy5vcHRpb25zLmNhbkNyZWF0ZUdsb2JhbFZpZXdzO1xyXG4gICAgICAgICAgICBlLmVkaXRvck9wdGlvbnMudmlzaWJsZSA9IGUucm93LmRhdGEuaWQgIT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG9uVmFsdWVDaGFuZ2VkID0gZS5lZGl0b3JPcHRpb25zLm9uVmFsdWVDaGFuZ2VkO1xyXG4gICAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25WYWx1ZUNoYW5nZWQgPSBhc3luYyAob3B0KSA9PiB7XHJcbiAgICAgICAgICAgICAgZS5jb21wb25lbnQuYmVnaW5DdXN0b21Mb2FkaW5nKCdVcGRhdGluZycpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLnVwZGF0ZVZpZXcoZS5yb3cuZGF0YS5pZCwgeyBpc0dsb2JhbDogb3B0LnZhbHVlIH0pO1xyXG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQob3B0KTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQ2VsbFByZXBhcmVkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGUuY29sdW1uLnR5cGUgIT09ICdidXR0b25zJyB8fCAhZS5kYXRhKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBlbmFibGVkID0gIWUuZGF0YS5pc0dsb2JhbFxyXG4gICAgICAgICAgICB8fCAoZS5kYXRhLmlzR2xvYmFsICYmIHRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxWaWV3cyk7XHJcblxyXG4gICAgICAgICAgaWYgKCFlbmFibGVkKSB7XHJcbiAgICAgICAgICAgIEFycmF5LmZyb20oZS5jZWxsRWxlbWVudC5jaGlsZHJlbigpKS5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgICAgICAgJChjKS5jc3Moe1xyXG4gICAgICAgICAgICAgICAgY29sb3I6ICcjZGRkICFpbXBvcnRhbnQnLFxyXG4gICAgICAgICAgICAgICAgY3Vyc29yOiAnZGVmYXVsdCdcclxuICAgICAgICAgICAgICB9KS5vZmYoJ2NsaWNrJyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25Sb3dSZW1vdmluZzogKGUpID0+IHtcclxuICAgICAgICAgIGlmICghZS5rZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuZGVsZXRlVmlldyhlLmtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlQ3VycmVudFZpZXdUaXRsZShkcm9wZG93bkJveE93bmVyOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3gpOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLXZpZXdzX19jdXJyZW50LXZpZXcgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keFRleHRCb3goe1xyXG4gICAgICAgIHZhbHVlOiBkcm9wZG93bkJveE93bmVyLm9wdGlvbigndGV4dCcpIHx8IGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCdwbGFjZWhvbGRlcicpLFxyXG4gICAgICAgIHJlYWRPbmx5OiB0aGlzLmlzRGVmYXVsdFZpZXdcclxuICAgICAgfSlcclxuICAgICAgLmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2F2ZVZpZXdCdXR0b24oKTogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB7XHJcbiAgICByZXR1cm4gJCgnPGJ1dHRvbiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLXZpZXdzX19zYXZlLXZpZXcgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogJ1NhdmUnLFxyXG4gICAgICAgIHR5cGU6ICdub3JtYWwnLFxyXG4gICAgICAgIGRpc2FibGVkOiB0aGlzLmlzRGVmYXVsdFZpZXcsXHJcbiAgICAgICAgb25DbGljazogdGhpcy5zYXZlLmJpbmQodGhpcyksXHJcbiAgICAgICAgaWNvbjogJ3NhdmUnLFxyXG4gICAgICAgIHdpZHRoOiA4N1xyXG4gICAgICB9KVxyXG4gICAgICAuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVNhdmVWaWV3QXNCdXR0b24oKTogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB7XHJcbiAgICByZXR1cm4gJCgnPGJ1dHRvbiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLXZpZXdzX19zYXZlLXZpZXctYXMgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogJ1NhdmUgQXMnLFxyXG4gICAgICAgIHR5cGU6ICdub3JtYWwnLFxyXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuY3JlYXRlU2F2ZUFzRGlhbG9nLmJpbmQodGhpcyksXHJcbiAgICAgICAgaWNvbjogJ3NhdmUnLFxyXG4gICAgICAgIHdpZHRoOiAxMThcclxuICAgICAgfSlcclxuICAgICAgLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVDb2x1bW5DaG9vc2VyQnV0dG9uKCk6IERldkV4cHJlc3MudWkuZHhCdXR0b24ge1xyXG4gICAgcmV0dXJuICQoJzxidXR0b24gLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy12aWV3c19fY29sdW1uLWNob29zZXIgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgb25DbGljazogdGhpcy5vcGVuQ29sdW1uQ2hvb3Nlci5iaW5kKHRoaXMpLFxyXG4gICAgICAgIGljb246ICdjb2x1bW4tY2hvb3NlcidcclxuICAgICAgfSlcclxuICAgICAgLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlQXNEaWFsb2coKSB7XHJcbiAgICBjb25zdCAkcG9wdXBDb250ZW50ID0gJCgnPGRpdiAvPicpO1xyXG5cclxuICAgIGNvbnN0IGRpYWxvZ0NvbnRlbnRFbGVtZW50ID0gJCgnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206OHB4O1wiIC8+JykuZHhUZXh0Qm94KHtcclxuICAgICAgcGxhY2Vob2xkZXI6ICdWaWV3IE5hbWUnLFxyXG4gICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICB9KS5keFZhbGlkYXRvcih7XHJcbiAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgIHsgdHlwZTogJ3JlcXVpcmVkJyB9LFxyXG4gICAgICBdXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHZpZXdOYW1lVGV4dEJveCA9IGRpYWxvZ0NvbnRlbnRFbGVtZW50LmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuICAgIGNvbnN0IHZpZXdOYW1lVGV4dEJveFZhbGlkYXRvciA9IGRpYWxvZ0NvbnRlbnRFbGVtZW50LmR4VmFsaWRhdG9yKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHZpZXdOYW1lVGV4dEJveC5lbGVtZW50KCkuYXBwZW5kVG8oJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgY29uc3Qgdmlld0lzR2xvYmFsQ2hlY2tib3ggPSAkKCc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O1wiIC8+JylcclxuICAgICAgLmR4Q2hlY2tCb3goe1xyXG4gICAgICAgIHRleHQ6ICdHbG9iYWwgdmlldycsXHJcbiAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLm9wdGlvbnMuY2FuQ3JlYXRlR2xvYmFsVmlld3NcclxuICAgICAgfSlcclxuICAgICAgLmR4Q2hlY2tCb3goJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgdmlld0lzR2xvYmFsQ2hlY2tib3guZWxlbWVudCgpLmFwcGVuZFRvKCRwb3B1cENvbnRlbnQpO1xyXG5cclxuICAgIHJldHVybiBjcmVhdGVEaWFsb2coXHJcbiAgICAgIHtcclxuICAgICAgICB0aXRsZTogJ0NyZWF0ZSBOZXcgVmlldycsXHJcbiAgICAgICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgICBtYXhXaWR0aDogJzMwMHB4JyxcclxuICAgICAgfSxcclxuICAgICAgJHBvcHVwQ29udGVudCxcclxuICAgICAge1xyXG4gICAgICAgIHRleHQ6ICdPaycsXHJcbiAgICAgICAgb25DbGljazogYXN5bmMgKGNsb3NlUG9wdXApID0+IHtcclxuICAgICAgICAgIGlmICghdmlld05hbWVUZXh0Qm94VmFsaWRhdG9yLnZhbGlkYXRlKCkuaXNWYWxpZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zYXZlQXModmlld05hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnKSwgdmlld0lzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCd2YWx1ZScpKTtcclxuICAgICAgICAgIGNsb3NlUG9wdXAoKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdGV4dDogJ0NhbmNlbCcsXHJcbiAgICAgICAgb25DbGljazogKGNsb3NlUG9wdXApID0+IGNsb3NlUG9wdXAoKVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb3BlbkNvbHVtbkNob29zZXIoKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMub3duZXIuc2hvd0NvbHVtbkNob29zZXIoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbG9hZFZpZXdEcm9wZG93bkJveERhdGEoKSB7XHJcbiAgICBpZiAoIXRoaXMudmlld3NEcm9wZG93bkJveCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgdmlld3MgPSBhd2FpdCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5nZXRWaWV3cygpO1xyXG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBEZXZFeHByZXNzLmRhdGEuQXJyYXlTdG9yZSh7XHJcbiAgICAgIGtleTogJ2lkJyxcclxuICAgICAgZGF0YTogdmlld3NcclxuICAgIH0pO1xyXG4gICAgdGhpcy52aWV3c0Ryb3Bkb3duQm94Lm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xyXG4gICAgdGhpcy52aWV3c0Ryb3Bkb3duQm94Lm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkKTtcclxuICAgIHRoaXMudmlld3NEYXRhR3JpZCAmJiB0aGlzLnZpZXdzRGF0YUdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgZGF0YVNvdXJjZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNhdmUoKSB7XHJcbiAgICBpZiAoIXRoaXMuaGFzQ2hhbmdlcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIuc2F2ZSgpO1xyXG4gICAgYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIudXBkYXRlQ3VycmVudFZpZXcoe1xyXG4gICAgICBuYW1lOiB0aGlzLmN1cnJlbnRWaWV3VGl0bGUub3B0aW9uKCd2YWx1ZScpLFxyXG4gICAgICBncmlkU3RhdGU6IHRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyLmN1cnJlbnRTYXZlZEdyaWRTdGF0ZVxyXG4gICAgfSk7XHJcblxyXG4gICAgbm90aWZ5KCdTYXZlZCcsIHRydWUpO1xyXG5cclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdEcm9wZG93bkJveERhdGEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc2F2ZUFzKHZpZXdOYW1lOiBzdHJpbmcsIGlzR2xvYmFsOiBib29sZWFuKSB7XHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlci5zYXZlKCk7XHJcbiAgICBjb25zdCB1cGRhdGVkVmlldyA9IGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmNyZWF0ZU5ld1ZpZXcoXHJcbiAgICAgIHZpZXdOYW1lLFxyXG4gICAgICB0aGlzLm9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlci5jdXJyZW50U2F2ZWRHcmlkU3RhdGUsXHJcbiAgICAgIGlzR2xvYmFsXHJcbiAgICApO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkVmlld0Ryb3Bkb3duQm94RGF0YSgpO1xyXG4gICAgYXdhaXQgdGhpcy5hcHBseVZpZXcodXBkYXRlZFZpZXcuaWQpO1xyXG5cclxuICAgIG5vdGlmeSgnVmlldyBpcyBjcmVhdGVkJywgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGRlbGV0ZVZpZXcodmlld0lkOiBudW1iZXIpIHtcclxuICAgIGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmRlbGV0ZVZpZXcodmlld0lkKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMub25WaWV3RGVsZXRlZCkge1xyXG4gICAgICB0aGlzLm9wdGlvbnMub25WaWV3RGVsZXRlZCh2aWV3SWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdEcm9wZG93bkJveERhdGEoKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkICE9PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5hcHBseVZpZXcoR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVnaW5WaWV3QXBwbHlpbmdMb2FkaW5nKCkge1xyXG4gICAgdGhpcy5jdXJyZW50Vmlld1RpdGxlICYmIHRoaXMuY3VycmVudFZpZXdUaXRsZS5vcHRpb24oJ3JlYWRPbmx5JywgdHJ1ZSk7XHJcbiAgICB0aGlzLnNhdmVWaWV3QnV0dG9uICYmIHRoaXMuc2F2ZVZpZXdCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsIHRydWUpO1xyXG4gICAgdGhpcy5zYXZlVmlld0FzQnV0dG9uICYmIHRoaXMuc2F2ZVZpZXdBc0J1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgdHJ1ZSk7XHJcbiAgICB0aGlzLnZpZXdzRGF0YUdyaWQgJiYgdGhpcy52aWV3c0RhdGFHcmlkLmJlZ2luQ3VzdG9tTG9hZGluZygnQXBwbHlpbmcuLi4nKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW5kVmlld0FwcGx5aW5nTG9hZGluZygpIHtcclxuICAgIHRoaXMuY3VycmVudFZpZXdUaXRsZSAmJiB0aGlzLmN1cnJlbnRWaWV3VGl0bGUub3B0aW9uKCdyZWFkT25seScsIGZhbHNlKTtcclxuICAgIHRoaXMuc2F2ZVZpZXdCdXR0b24gJiYgdGhpcy5zYXZlVmlld0J1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgZmFsc2UpO1xyXG4gICAgdGhpcy5zYXZlVmlld0FzQnV0dG9uICYmIHRoaXMuc2F2ZVZpZXdBc0J1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgZmFsc2UpO1xyXG4gICAgdGhpcy52aWV3c0RhdGFHcmlkICYmIHRoaXMudmlld3NEYXRhR3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN5bmNVSVdpdGhDdXJyZW50VmlldyhpZ25vcmVDdXJyZW50Vmlld1RpdGxlID0gZmFsc2UpIHtcclxuICAgIGlmICghaWdub3JlQ3VycmVudFZpZXdUaXRsZSAmJiB0aGlzLmN1cnJlbnRWaWV3VGl0bGUpIHtcclxuICAgICAgdGhpcy5jdXJyZW50Vmlld1RpdGxlLm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlldy5uYW1lKTtcclxuICAgICAgdGhpcy5jdXJyZW50Vmlld1RpdGxlLm9wdGlvbigncmVhZE9ubHknLCB0aGlzLmlzRGVmYXVsdFZpZXcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy52aWV3c0Ryb3Bkb3duQm94Lm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkKTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMudmlld3NEYXRhR3JpZCkge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkID09PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQpIHtcclxuICAgICAgICAgIHRoaXMudmlld3NEYXRhR3JpZC5zZWxlY3RSb3dzQnlJbmRleGVzKFswXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudmlld3NEYXRhR3JpZC5zZWxlY3RSb3dzKFt0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkXSwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSwgMCk7XHJcblxyXG4gICAgY29uc3QgaXNHbG9iYWxWaWV3ID0gdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXcuaXNHbG9iYWxcclxuICAgICAgJiYgIXRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxWaWV3cztcclxuXHJcbiAgICB0aGlzLnNhdmVWaWV3QnV0dG9uICYmIHRoaXMuc2F2ZVZpZXdCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsIHRoaXMuaXNEZWZhdWx0VmlldyB8fCBpc0dsb2JhbFZpZXcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjb25maXJtQ2hhbmdlc0xvc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIXRoaXMuaGFzQ2hhbmdlcykge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gRGV2RXhwcmVzcy51aS5kaWFsb2cuY29uZmlybShcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgJ1lvdSBoYXZlIHVuc2F2ZWQgY2hhbmdlcyB0aGF0IHdpbGwgYmUgbG9zdCBpZiB5b3UgY2xvc2UgdGhpcyBwb3B1cC4gRG8geW91IHdhbnQgdG8gY2xvc2UgdGhlIHBvcHVwIGFuZCBub3Qgc2F2ZSBjaGFuZ2VzPycsXHJcbiAgICAgICdVbnNhdmVkIGNoYW5nZXMnXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGLy8gdHNsaW50OmRpc2FibGU6IG1lbWJlci1vcmRlcmluZ1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbiBmcm9tICcuLi8uLi8uLi9EYXRhL0xvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uJztcclxuaW1wb3J0IHsgbWVtb2l6ZSB9IGZyb20gJy4uLy4uLy4uL1V0aWxzL01lbW9pemUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXlGaWx0ZXIge1xyXG4gIHJlYWRvbmx5IGlkOiBudW1iZXI7XHJcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IGlzRGVmYXVsdDogYm9vbGVhbjtcclxuICByZWFkb25seSBpc0dsb2JhbDogYm9vbGVhbjtcclxuICByZWFkb25seSBmaWx0ZXJTdGF0ZTogYW55IHwgbnVsbDtcclxufVxyXG5cclxuaW50ZXJmYWNlIElDb250cm9sRGlzcGxheUZpbHRlckR0byB7XHJcbiAgSWQ6IG51bWJlcjtcclxuICBOYW1lOiBzdHJpbmc7XHJcbiAgSXNEZWZhdWx0OiBib29sZWFuO1xyXG4gIElzR2xvYmFsOiBib29sZWFuO1xyXG4gIEZpbHRlclN0YXRlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zIHtcclxuICAvLyByZWFkb25seSBkZWZhdWx0T3BlbmVkRmlsdGVySWQ6IG51bWJlcjtcclxuICBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XHJcbiAgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xyXG59XHJcblxyXG50eXBlIENvbnRyb2xEaXNwbGF5RmlsdGVyVXBkYXRlcyA9IFBhcnRpYWw8UGljazxJQ29udHJvbERpc3BsYXlGaWx0ZXIsICduYW1lJyB8ICdmaWx0ZXJTdGF0ZScgfCAnaXNHbG9iYWwnPj47XHJcblxyXG5leHBvcnQgY2xhc3MgR3JpZEZpbHRlcnNNYW5hZ2VyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVEYXRhVXJsOiBzdHJpbmc7XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgX2N1cnJlbnRGaWx0ZXJJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgZmlsdGVyczogSUNvbnRyb2xEaXNwbGF5RmlsdGVyW10gfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0RmlsdGVyQnlJZEludGVybmFsID0gKGZpbHRlcklkOiBudW1iZXIpID0+IHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcnMgJiYgdGhpcy5maWx0ZXJzLmZpbmQoKHYpID0+IHYuaWQgPT09IGZpbHRlcklkKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXJCeUlkID0gbWVtb2l6ZSh0aGlzLmdldEZpbHRlckJ5SWRJbnRlcm5hbCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zKSB7XHJcbiAgICB0aGlzLmxvYWREYXRhVXJsID0gb3B0aW9ucy5sb2FkRGF0YVVybDtcclxuICAgIHRoaXMuaW5zZXJ0RGF0YVVybCA9IG9wdGlvbnMuaW5zZXJ0RGF0YVVybDtcclxuICAgIHRoaXMudXBkYXRlRGF0YVVybCA9IG9wdGlvbnMudXBkYXRlRGF0YVVybDtcclxuICAgIHRoaXMuZGVsZXRlRGF0YVVybCA9IG9wdGlvbnMuZGVsZXRlRGF0YVVybDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudEZpbHRlcigpIHtcclxuICAgIHJldHVybiB0aGlzLmdldEZpbHRlckJ5SWQodGhpcy5fY3VycmVudEZpbHRlcklkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudEZpbHRlcklkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRGaWx0ZXJJZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgY3VycmVudEZpbHRlcklkKGlkOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2N1cnJlbnRGaWx0ZXJJZCA9IGlkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEZpbHRlcnMoKTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlGaWx0ZXJbXT4ge1xyXG4gICAgaWYgKCF0aGlzLmZpbHRlcnMpIHtcclxuICAgICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVycygpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmZpbHRlcnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQ3VycmVudEZpbHRlcihmaWx0ZXJVcGRhdGVzOiBDb250cm9sRGlzcGxheUZpbHRlclVwZGF0ZXMpIHtcclxuICAgIHJldHVybiAhIXRoaXMuY3VycmVudEZpbHRlciAmJiB0aGlzLnVwZGF0ZUZpbHRlcih0aGlzLmN1cnJlbnRGaWx0ZXIuaWQsIGZpbHRlclVwZGF0ZXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNyZWF0ZU5ld0ZpbHRlcihmaWx0ZXJOYW1lOiBzdHJpbmcsIGZpbHRlclN0YXRlOiBhbnksIGlzRGVmYXVsdDogYm9vbGVhbiwgaXNHbG9iYWw6IGJvb2xlYW4pXHJcbiAgICA6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5RmlsdGVyPiB7XHJcbiAgICBsZXQgbmV3RmlsdGVyRHRvOiBJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG8gPSB0aGlzLm1hcEZpbHRlck1vZGVsVG9EdG8oe1xyXG4gICAgICBpZDogLTEsXHJcbiAgICAgIG5hbWU6IGZpbHRlck5hbWUsXHJcbiAgICAgIGlzRGVmYXVsdCxcclxuICAgICAgaXNHbG9iYWwsXHJcbiAgICAgIGZpbHRlclN0YXRlXHJcbiAgICB9KTtcclxuXHJcbiAgICBuZXdGaWx0ZXJEdG8gPSBhd2FpdCBzZW5kUmVxdWVzdDxJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG8+KHRoaXMuaW5zZXJ0RGF0YVVybCxcclxuICAgICAgJ1BPU1QnLCBuZXdGaWx0ZXJEdG8pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVycygpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLm1hcEZpbHRlckR0b1RvTW9kZWwobmV3RmlsdGVyRHRvKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVGaWx0ZXIoZmlsdGVySWQ6IG51bWJlciwgdXBkYXRlczogQ29udHJvbERpc3BsYXlGaWx0ZXJVcGRhdGVzKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmdldEZpbHRlckJ5SWQoZmlsdGVySWQpO1xyXG4gICAgaWYgKCFmaWx0ZXIpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHVwZGF0ZWRGaWx0ZXI6IElDb250cm9sRGlzcGxheUZpbHRlciA9IHtcclxuICAgICAgLi4uZmlsdGVyLFxyXG4gICAgICAuLi51cGRhdGVzXHJcbiAgICB9O1xyXG4gICAgbGV0IHVwZGF0ZWRGaWx0ZXJEdG86IElDb250cm9sRGlzcGxheUZpbHRlckR0byA9IHRoaXMubWFwRmlsdGVyTW9kZWxUb0R0byh1cGRhdGVkRmlsdGVyKTtcclxuXHJcbiAgICB1cGRhdGVkRmlsdGVyRHRvID0gYXdhaXQgc2VuZFJlcXVlc3Q8SUNvbnRyb2xEaXNwbGF5RmlsdGVyRHRvPih0aGlzLnVwZGF0ZURhdGFVcmwsXHJcbiAgICAgICdQVVQnLCB1cGRhdGVkRmlsdGVyRHRvKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZEZpbHRlcnMoKTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBkZWxldGVGaWx0ZXIoZmlsdGVySWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy5nZXRGaWx0ZXJCeUlkKGZpbHRlcklkKTtcclxuICAgIGlmICghZmlsdGVyKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCBzZW5kUmVxdWVzdCh0aGlzLmRlbGV0ZURhdGFVcmwsICdERUxFVEUnLCB7IGZpbHRlcklkIH0pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVycygpO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBsb2FkRmlsdGVycygpIHtcclxuICAgIGNvbnN0IGZpbHRlcnMgPSBhd2FpdCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbjxJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG9bXT4odGhpcy5sb2FkRGF0YVVybCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJzID0gZmlsdGVycy5tYXAoKGR0bykgPT4gdGhpcy5tYXBGaWx0ZXJEdG9Ub01vZGVsKGR0bykpO1xyXG4gICAgLy8gTk9URTogcmVzZXQgbWVtb2l6ZVxyXG4gICAgdGhpcy5yZXNldENhY2hlZFJlc3VsdE9mR2V0RmlsdGVyQnlJZEZ1bmN0aW9uKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVycztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwRmlsdGVyTW9kZWxUb0R0byhtb2RlbDogSUNvbnRyb2xEaXNwbGF5RmlsdGVyKTogSUNvbnRyb2xEaXNwbGF5RmlsdGVyRHRvIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIElkOiBtb2RlbC5pZCxcclxuICAgICAgTmFtZTogbW9kZWwubmFtZSxcclxuICAgICAgSXNEZWZhdWx0OiBtb2RlbC5pc0RlZmF1bHQsXHJcbiAgICAgIElzR2xvYmFsOiBtb2RlbC5pc0dsb2JhbCxcclxuICAgICAgRmlsdGVyU3RhdGU6IEpTT04uc3RyaW5naWZ5KG1vZGVsLmZpbHRlclN0YXRlKVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwRmlsdGVyRHRvVG9Nb2RlbChkdG86IElDb250cm9sRGlzcGxheUZpbHRlckR0byk6IElDb250cm9sRGlzcGxheUZpbHRlciB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpZDogZHRvLklkLFxyXG4gICAgICBuYW1lOiBkdG8uTmFtZSxcclxuICAgICAgaXNEZWZhdWx0OiBkdG8uSXNEZWZhdWx0IHx8IGZhbHNlLFxyXG4gICAgICBpc0dsb2JhbDogZHRvLklzR2xvYmFsIHx8IGZhbHNlLFxyXG4gICAgICBmaWx0ZXJTdGF0ZTogSlNPTi5wYXJzZShkdG8uRmlsdGVyU3RhdGUpXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldENhY2hlZFJlc3VsdE9mR2V0RmlsdGVyQnlJZEZ1bmN0aW9uKCkge1xyXG4gICAgdGhpcy5nZXRGaWx0ZXJCeUlkID0gbWVtb2l6ZSh0aGlzLmdldEZpbHRlckJ5SWRJbnRlcm5hbCk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBHcmlkRmlsdGVyc01hbmFnZXIsIElDb250cm9sRGlzcGxheUZpbHRlciwgSUdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnMgfSBmcm9tICcuL0dyaWRGaWx0ZXJzTWFuYWdlcic7XHJcbmltcG9ydCB7IENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlciB9IGZyb20gJy4vQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyJztcclxuaW1wb3J0IG5vdGlmeSBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL05vdGlmeSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnRPcHRpb25zIHtcclxuICByZWFkb25seSBvd25lcjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlcjogR3JpZEZpbHRlcnNNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGFwc0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlcjogQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGF1dG9JbnRlZ3JhdGlvbjogYm9vbGVhbjtcclxuICByZWFkb25seSBvbkZpbHRlckFwcGxpZWQ/OiAoZmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcclxuICByZWFkb25seSBvbkZpbHRlckRlbGV0ZWQ/OiAoZmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcclxuICByZWFkb25seSBjYW5DcmVhdGVHbG9iYWxGaWx0ZXJzOiBib29sZWFuO1xyXG4gIHJlYWRvbmx5IHZpc2libGU6IGJvb2xlYW47XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50RGVmYXVsdE9wdGlvbnMge1xyXG4gIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlcjogR3JpZEZpbHRlcnNNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnM6IElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zO1xyXG4gIHJlYWRvbmx5IGF1dG9JbnRlZ3JhdGlvbjogYm9vbGVhbjtcclxufVxyXG5cclxudHlwZSBNdXRhYmxlPFQ+ID0ge1xyXG4gIC1yZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXTtcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMgPVxyXG4gIE11dGFibGU8T21pdDxJR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50T3B0aW9ucywga2V5b2YgSUdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudERlZmF1bHRPcHRpb25zPj4gJlxyXG4gIE11dGFibGU8UGFydGlhbDxJR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50RGVmYXVsdE9wdGlvbnM+PjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQge1xyXG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBJR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50T3B0aW9ucztcclxuICAvLyB0b29sYmFyIGl0ZW1zXHJcbiAgLy8gdHNsaW50OmRpc2FibGUgdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgX2ZpbHRlcnNUb29sYmFySXRlbTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHwgdW5kZWZpbmVkO1xyXG4gIC8vIHRzbGludDplbmFibGUgdmFyaWFibGUtbmFtZVxyXG5cclxuICAvLyB0b29sYmFyIHdpZGdldHNcclxuICBwcml2YXRlIGZpbHRlcnNEcm9wZG93bkJveDogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgZmlsdGVyc0RhdGFHcmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBjdXJyZW50RmlsdGVyVGl0bGU6IERldkV4cHJlc3MudWkuZHhUZXh0Qm94IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgbmV3RmlsdGVyQnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHwgdW5kZWZpbmVkO1xyXG4gIC8vIHdpZGdldHNcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZSB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfZmlsdGVyUG9wdXA6IERldkV4cHJlc3MudWkuZHhQb3B1cCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGZpbHRlck5hbWVUZXh0Qm94OiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGZpbHRlckJ1aWxkZXI6IERldkV4cHJlc3MudWkuZHhGaWx0ZXJCdWlsZGVyIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsdGVyRXhwcmVzc2lvbkNhbGN1bGF0b3I6IERldkV4cHJlc3MudWkuZHhGaWx0ZXJCdWlsZGVyO1xyXG4gIHByaXZhdGUgZmlsdGVySXNHbG9iYWxDaGVja2JveDogRGV2RXhwcmVzcy51aS5keENoZWNrQm94IHwgdW5kZWZpbmVkO1xyXG4gIC8vIHRzbGludDplbmFibGUgdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgaXNJbkZpbHRlckFwcGx5aW5nID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IHtcclxuICAgICAgLi4ub3B0aW9ucyxcclxuICAgICAgZ3JpZEZpbHRlcnNNYW5hZ2VyOiBvcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlclxyXG4gICAgICAgID8gb3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXJcclxuICAgICAgICA6IG5ldyBHcmlkRmlsdGVyc01hbmFnZXIob3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zKSxcclxuICAgICAgYXV0b0ludGVncmF0aW9uOiAob3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAhPT0gbnVsbClcclxuICAgICAgICA/IG9wdGlvbnMuYXV0b0ludGVncmF0aW9uIDogdHJ1ZVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLm9wdGlvbnMuYXV0b0ludGVncmF0aW9uICYmIHRoaXMuaW50ZWdyYXRlVG9HcmlkKHRoaXMub3B0aW9ucy5vd25lcik7XHJcbiAgICB0aGlzLmZpbHRlckV4cHJlc3Npb25DYWxjdWxhdG9yID0gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keEZpbHRlckJ1aWxkZXIoe1xyXG4gICAgICAgIGZpZWxkczogdGhpcy5nZXRGbGF0Q29sdW1uc0xpc3QodGhpcy5vcHRpb25zLm93bmVyLm9wdGlvbignY29sdW1ucycpKVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhGaWx0ZXJCdWlsZGVyKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHRyeUFwcGx5RmlsdGVyKGZpbHRlcklkOiBudW1iZXIgfCB1bmRlZmluZWQpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IGlzQ2FuQmVGaWx0ZXJBcHBsaWVkID0gYXdhaXQgdGhpcy5jb25maXJtQ2hhbmdlc0xvc3MoKTtcclxuXHJcbiAgICBpZiAoaXNDYW5CZUZpbHRlckFwcGxpZWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5hcHBseUZpbHRlcihmaWx0ZXJJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzQ2FuQmVGaWx0ZXJBcHBsaWVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGFwcGx5RmlsdGVyKGZpbHRlcklkOiBudW1iZXIgfCB1bmRlZmluZWQsIGRlZmVycmVkTG9hZGluZyA9IGZhbHNlKSB7XHJcbiAgICAvLyBOT1RFOiBJZiB3ZSBjaGFuZ2UgdGhlIGZpbHRlciwgdGhlIGdyaWQgd2lsbCBiZSByZWxvYWRlZCBpbiB0aGUgZmlsdGVyc0Ryb3Bkb3duQm94Lm9uVmFsdWVDaGFuZ2VkXHJcbiAgICAvLyBjb25zdCBmaWx0ZXJDaGFuZ2VkID0gdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQgIT09IGZpbHRlcklkO1xyXG4gICAgdGhpcy5pc0luRmlsdGVyQXBwbHlpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQgPSBmaWx0ZXJJZDtcclxuICAgIHRoaXMudXBkYXRlRmlsdGVyUG9wdXBDb250ZW50KHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcik7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3gub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkKTtcclxuXHJcbiAgICBsZXQgZ3JpZERhdGFTb3VyY2UgPSB0aGlzLm9wdGlvbnMub3duZXIuZ2V0RGF0YVNvdXJjZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIpIHtcclxuICAgICAgLy8gTk9URTogbmVlZCB0byBwcm9jZXNzIGZpbHRlciB2YWx1ZSBieSB0aGUgZ2V0RmlsdGVyRXhwcmVzc2lvbiBtZXRob2RcclxuICAgICAgLy8gdG8gYmUgc3VyZSBpdCB3aWxsIHdvcmsgaW4gZGF0YXNvdXJjZSAoZm9yIGV4YW1wbGUsIHRoZSAnYmV0d2VlbicgY29uZGl0aW9uKVxyXG4gICAgICAvLyB3aWxsIGJlIG1vZGlmaWVkIHRvIFwiPj0gYW5kIDw9XCIgYmVjYXVzZSBkYXRhIHNvdXJjZSBkb2Vzbid0IHN1cHBvcnQgJ2JldHdlZW4nLlxyXG5cclxuICAgICAgdGhpcy5maWx0ZXJFeHByZXNzaW9uQ2FsY3VsYXRvci5vcHRpb24oJ3ZhbHVlJywgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyLmZpbHRlclN0YXRlKTtcclxuICAgICAgY29uc3QgdmFsID0gdGhpcy5maWx0ZXJFeHByZXNzaW9uQ2FsY3VsYXRvci5nZXRGaWx0ZXJFeHByZXNzaW9uKCk7XHJcblxyXG4gICAgICBpZiAoZ3JpZERhdGFTb3VyY2UuaXNMb2FkaW5nKCkpIHtcclxuICAgICAgICBjb25zdCBhcHBseVZhbHVlID0gKCkgPT4ge1xyXG4gICAgICAgICAgZ3JpZERhdGFTb3VyY2Uub2ZmKCdsb2FkaW5nQ2hhbmdlZCcsIGFwcGx5VmFsdWUpO1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGdyaWREYXRhU291cmNlID0gdGhpcy5vcHRpb25zLm93bmVyLmdldERhdGFTb3VyY2UoKTtcclxuICAgICAgICAgICAgZ3JpZERhdGFTb3VyY2UuZmlsdGVyKHZhbCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBncmlkRGF0YVNvdXJjZS5vbignbG9hZGluZ0NoYW5nZWQnLCBhcHBseVZhbHVlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBncmlkRGF0YVNvdXJjZS5maWx0ZXIodmFsKTtcclxuICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdyaWREYXRhU291cmNlLmZpbHRlcihudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiAoIWZpbHRlckNoYW5nZWQpIHtcclxuICAgIGlmICghZGVmZXJyZWRMb2FkaW5nKSB7XHJcbiAgICAgIGF3YWl0IGdyaWREYXRhU291cmNlLmxvYWQoKTtcclxuICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICB0aGlzLm9wdGlvbnMub25GaWx0ZXJBcHBsaWVkICYmIHRoaXMub3B0aW9ucy5vbkZpbHRlckFwcGxpZWQoZmlsdGVySWQpO1xyXG4gICAgdGhpcy5pc0luRmlsdGVyQXBwbHlpbmcgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW50ZWdyYXRlVG9HcmlkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gICAgY29uc3QgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgPSBncmlkLm9wdGlvbignb25Ub29sYmFyUHJlcGFyaW5nJyk7XHJcblxyXG4gICAgZ3JpZC5vcHRpb24oJ29uVG9vbGJhclByZXBhcmluZycsIChlOiBhbnkpID0+IHtcclxuICAgICAgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgJiYgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcoZSk7XHJcbiAgICAgIHRoaXMub25HcmlkVG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkdyaWRUb29sYmFyUHJlcGFyaW5nOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydvblRvb2xiYXJQcmVwYXJpbmcnXSA9IChlKSA9PiB7XHJcbiAgICBjb25zdCB0b29sYmFySXRlbXMgPSBlLnRvb2xiYXJPcHRpb25zICYmIGUudG9vbGJhck9wdGlvbnMuaXRlbXM7XHJcbiAgICBpZiAoIXRvb2xiYXJJdGVtcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdG9vbGJhckl0ZW1zLnNwbGljZSgxLCAwLFxyXG4gICAgICB0aGlzLmZpbHRlcnNUb29sYmFySXRlbVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGZpbHRlcnNUb29sYmFySXRlbSgpIHtcclxuICAgIGlmICghdGhpcy5fZmlsdGVyc1Rvb2xiYXJJdGVtKSB7XHJcbiAgICAgIHRoaXMuX2ZpbHRlcnNUb29sYmFySXRlbSA9IHRoaXMuY3JlYXRlRmlsdGVyc1Rvb2xiYXJJdGVtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlcnNUb29sYmFySXRlbTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGZpbHRlclBvcHVwKCkge1xyXG4gICAgaWYgKCF0aGlzLl9maWx0ZXJQb3B1cCkge1xyXG4gICAgICB0aGlzLl9maWx0ZXJQb3B1cCA9IHRoaXMuY3JlYXRlRmlsdGVyUG9wdXAoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyUG9wdXA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBoYXNDaGFuZ2VzKCkge1xyXG4gICAgY29uc3QgY3VycmVudEZpbHRlciA9IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcjtcclxuXHJcbiAgICBjb25zdCBuZXdOYW1lID0gdGhpcy5maWx0ZXJOYW1lVGV4dEJveCAmJiB0aGlzLmZpbHRlck5hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IG9sZE5hbWUgPSBjdXJyZW50RmlsdGVyICYmIGN1cnJlbnRGaWx0ZXIubmFtZTtcclxuXHJcbiAgICBjb25zdCBuZXdGaWx0ZXIgPSB0aGlzLmZpbHRlckJ1aWxkZXIgJiYgdGhpcy5maWx0ZXJCdWlsZGVyLm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IG9sZEZpbHRlciA9IGN1cnJlbnRGaWx0ZXIgJiYgY3VycmVudEZpbHRlci5maWx0ZXJTdGF0ZTtcclxuXHJcbiAgICBjb25zdCBuZXdJc0dsb2JhbCA9IHRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveCAmJiB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCd2YWx1ZScpO1xyXG4gICAgY29uc3Qgb2xkSXNHbG9iYWwgPSBjdXJyZW50RmlsdGVyICYmIGN1cnJlbnRGaWx0ZXIuaXNHbG9iYWw7XHJcblxyXG4gICAgcmV0dXJuIG5ld05hbWUgIT09IG9sZE5hbWUgfHwgbmV3RmlsdGVyICE9PSBvbGRGaWx0ZXIgfHwgbmV3SXNHbG9iYWwgIT09IG9sZElzR2xvYmFsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJzVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHtcclxuICAgIGxldCBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHdpZGdldDogJ2R4RHJvcERvd25Cb3gnIGFzIGFueSxcclxuICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgIHRleHQ6ICdEYXRhIFNldHMnLFxyXG4gICAgICB2aXNpYmxlOiB0aGlzLm9wdGlvbnMudmlzaWJsZSxcclxuICAgICAgY3NzQ2xhc3M6ICdhcHMtZmlsdGVyc19fdG9vbGJhci1pdGVtJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdpc3pvbGVhLW1kJ30sXHJcbiAgICAgICAgdmFsdWU6IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkLFxyXG4gICAgICAgIHZhbHVlRXhwcjogJ2lkJyxcclxuICAgICAgICBkaXNwbGF5RXhwcjogJ25hbWUnLFxyXG4gICAgICAgIHNob3dDbGVhckJ1dHRvbjogdHJ1ZSxcclxuICAgICAgICBwbGFjZWhvbGRlcjogJ05vbmUnLFxyXG4gICAgICAgIHdpZHRoOiAyMDAsXHJcbiAgICAgICAgZHJvcERvd25PcHRpb25zOiB7XHJcbiAgICAgICAgICB3aWR0aDogNTAwXHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkluaXRpYWxpemVkOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3ggPSBlLmNvbXBvbmVudDtcclxuICAgICAgICAgIGNvbnN0IFssIHVzZXJTZXR0aW5nc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXHJcbiAgICAgICAgICAgIHRoaXMubG9hZEZpbHRlckRyb3Bkb3duQm94RGF0YSgpLFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXBzQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyLmdldFVzZXJTZXR0aW5ncygpXHJcbiAgICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgICB1c2VyU2V0dGluZ3MuZGVmYXVsdEZpbHRlcklkICYmIGUuY29tcG9uZW50Lm9wdGlvbigndmFsdWUnLCB1c2VyU2V0dGluZ3MuZGVmYXVsdEZpbHRlcklkKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uVmFsdWVDaGFuZ2VkOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuaXNJbkZpbHRlckFwcGx5aW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoIWlzTmVlZEhhbmRsZVZhbHVlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxldCB2YWx1ZSA9IGUudmFsdWU7XHJcbiAgICAgICAgICBjb25zdCBpc0ZpbHRlckFwcGxpZWQgPSBhd2FpdCB0aGlzLnRyeUFwcGx5RmlsdGVyKHZhbHVlKTtcclxuXHJcbiAgICAgICAgICBpZiAoIWlzRmlsdGVyQXBwbGllZCkge1xyXG4gICAgICAgICAgICBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdmFsdWUgPSBlLnByZXZpb3VzVmFsdWU7XHJcbiAgICAgICAgICAgIGUuY29tcG9uZW50Lm9wdGlvbigndmFsdWUnLCB2YWx1ZSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5maWx0ZXJzRGF0YUdyaWQgJiYgdGhpcy5maWx0ZXJzRGF0YUdyaWQuc2VsZWN0Um93cyh2YWx1ZSwgZmFsc2UpO1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50RmlsdGVyVGl0bGUgJiYgdGhpcy5jdXJyZW50RmlsdGVyVGl0bGUub3B0aW9uKCd2YWx1ZScsXHJcbiAgICAgICAgICAgIGUuY29tcG9uZW50Lm9wdGlvbigndGV4dCcpIHx8IGUuY29tcG9uZW50Lm9wdGlvbigncGxhY2Vob2xkZXInKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbk9wZW5lZDogKGUpID0+IHtcclxuICAgICAgICAgIGlmICghZS5jb21wb25lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuZmlsdGVyc0RhdGFHcmlkICYmIHRoaXMuZmlsdGVyc0RhdGFHcmlkLnNlbGVjdFJvd3MoZS5jb21wb25lbnQub3B0aW9uKCd2YWx1ZScpLCBmYWxzZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb250ZW50VGVtcGxhdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWUuY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmZpbHRlcnNEYXRhR3JpZCA9IHRoaXMuY3JlYXRlRmlsdGVyc0RhdGFHcmlkKGUuY29tcG9uZW50KTtcclxuICAgICAgICAgIHRoaXMuY3VycmVudEZpbHRlclRpdGxlID0gdGhpcy5jcmVhdGVDdXJyZW50RmlsdGVyVGl0bGUoZS5jb21wb25lbnQpO1xyXG4gICAgICAgICAgdGhpcy5uZXdGaWx0ZXJCdXR0b24gPSB0aGlzLmNyZWF0ZU5ld0ZpbHRlckJ1dHRvbigpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udGVudEhlYWRlciA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAuYWRkQ2xhc3MoJ2Fwcy1maWx0ZXJzX19oZWFkZXInKVxyXG4gICAgICAgICAgICAuYXBwZW5kKHRoaXMuY3VycmVudEZpbHRlclRpdGxlLmVsZW1lbnQoKSlcclxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLm5ld0ZpbHRlckJ1dHRvbi5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udGVudCA9ICQoJzxkaXYgLz4nKS5jc3MoJ2hlaWdodCcsICcxMDAlJylcclxuICAgICAgICAgICAgLmFwcGVuZChkcm9wZG93bkNvbnRlbnRIZWFkZXIpXHJcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy5maWx0ZXJzRGF0YUdyaWQuZWxlbWVudCgpKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gZHJvcGRvd25Db250ZW50O1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94T3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyc0RhdGFHcmlkKGRyb3Bkb3duQm94T3duZXI6IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveCk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keERhdGFHcmlkKHtcclxuICAgICAgICBkYXRhU291cmNlOiBkcm9wZG93bkJveE93bmVyLmdldERhdGFTb3VyY2UoKSxcclxuICAgICAgICByZW1vdGVPcGVyYXRpb25zOiBmYWxzZSxcclxuICAgICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgICBhbGxvd0FkZGluZzogZmFsc2UsXHJcbiAgICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgYWxsb3dEZWxldGluZzogdHJ1ZSxcclxuICAgICAgICAgIG1vZGU6ICdjZWxsJyxcclxuICAgICAgICAgIHVzZUljb25zOiB0cnVlLFxyXG4gICAgICAgICAgdGV4dHM6IHtcclxuICAgICAgICAgICAgY29uZmlybURlbGV0ZU1lc3NhZ2U6ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgZGF0YSBzZXQ/J1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd29yZFdyYXBFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnbmFtZScsXHJcbiAgICAgICAgICAgIGFsbG93RWRpdGluZzogZmFsc2VcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ2lzRGVmYXVsdCcsXHJcbiAgICAgICAgICAgIGNhcHRpb246ICdJcyBEZWZhdWx0JyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdib29sZWFuJyxcclxuICAgICAgICAgICAgd2lkdGg6IDgwLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnaXNHbG9iYWwnLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiAnSXMgR2xvYmFsJyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdib29sZWFuJyxcclxuICAgICAgICAgICAgd2lkdGg6IDcwXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0eXBlOiAnYnV0dG9ucycsXHJcbiAgICAgICAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpY29uOiAnZWRpdCcsXHJcbiAgICAgICAgICAgICAgICBoaW50OiAnRWRpdCcsXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoIWUucm93IHx8ICFlLnJvdy5rZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRmlsdGVyQXBwbGllZCA9IGF3YWl0IHRoaXMudHJ5QXBwbHlGaWx0ZXIoZS5yb3cua2V5KTtcclxuICAgICAgICAgICAgICAgICAgaXNGaWx0ZXJBcHBsaWVkICYmICF0aGlzLmZpbHRlclBvcHVwLm9wdGlvbigndmlzaWJsZScpXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5vcGVuRWRpdEZpbHRlclBvcHVwKHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAnZGVsZXRlJ1xyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXSxcclxuICAgICAgICBrZXlib2FyZE5hdmlnYXRpb246IHtcclxuICAgICAgICAgIGVkaXRPbktleVByZXNzOiBmYWxzZSxcclxuICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzaG93Q29sdW1uSGVhZGVyczogdHJ1ZSxcclxuICAgICAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBmb2N1c2VkUm93RW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgc2hvd0JvcmRlcnM6IGZhbHNlLFxyXG4gICAgICAgIHNob3dDb2x1bW5MaW5lczogZmFsc2UsXHJcbiAgICAgICAgc2VsZWN0aW9uOiB7IG1vZGU6ICdzaW5nbGUnIH0sXHJcbiAgICAgICAgaGVpZ2h0OiAnY2FsYygxMDAlIC0gNTFweCknLFxyXG4gICAgICAgIHNjcm9sbGluZzogeyBtb2RlOiAnc3RhbmRhcmQnIH0sXHJcbiAgICAgICAgcGFnaW5nOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXHJcbiAgICAgICAgbm9EYXRhVGV4dDogJ05vIGRhdGEgc2V0cycsXHJcbiAgICAgICAgb25TZWxlY3Rpb25DaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3ZhbHVlJywgZS5zZWxlY3RlZFJvd0tleXMgPyBlLnNlbGVjdGVkUm93S2V5c1swXSA6IG51bGwpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25FZGl0b3JQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZS5kYXRhRmllbGQgPT09ICdpc0dsb2JhbCcpIHtcclxuICAgICAgICAgICAgZS5lZGl0b3JPcHRpb25zLmRpc2FibGVkID0gIXRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxGaWx0ZXJzO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgb25WYWx1ZUNoYW5nZWQgPSBlLmVkaXRvck9wdGlvbnMub25WYWx1ZUNoYW5nZWQ7XHJcbiAgICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZCA9IGFzeW5jIChvcHQpID0+IHtcclxuICAgICAgICAgICAgICBlLmNvbXBvbmVudC5iZWdpbkN1c3RvbUxvYWRpbmcoJ1VwZGF0aW5nJyk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci51cGRhdGVGaWx0ZXIoZS5yb3cuZGF0YS5pZCwgeyBpc0dsb2JhbDogb3B0LnZhbHVlIH0pO1xyXG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQob3B0KTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQ2VsbFByZXBhcmVkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGUuY29sdW1uLnR5cGUgIT09ICdidXR0b25zJyB8fCAhZS5kYXRhKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChlLmNvbHVtbi50eXBlID09PSAnYnV0dG9ucycpIHtcclxuICAgICAgICAgICAgY29uc3QgZW5hYmxlZCA9ICFlLmRhdGEuaXNHbG9iYWxcclxuICAgICAgICAgICAgICB8fCAoZS5kYXRhLmlzR2xvYmFsICYmIHRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxGaWx0ZXJzKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgIEFycmF5LmZyb20oZS5jZWxsRWxlbWVudC5jaGlsZHJlbigpKS5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAkKGMpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiAnI2RkZCAhaW1wb3J0YW50JyxcclxuICAgICAgICAgICAgICAgICAgY3Vyc29yOiAnZGVmYXVsdCdcclxuICAgICAgICAgICAgICAgIH0pLm9mZignY2xpY2snKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25Sb3dVcGRhdGluZzogKGUpID0+IHtcclxuICAgICAgICAgIGlmICghZS5rZXkgfHwgZS5uZXdEYXRhLmlzRGVmYXVsdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBkZWZhdWx0RmlsdGVyID0gZS5jb21wb25lbnQuZ2V0RGF0YVNvdXJjZSgpLml0ZW1zKCkuZmluZCgoZmlsdGVyKSA9PiBmaWx0ZXIuaXNEZWZhdWx0KTtcclxuICAgICAgICAgIGlmIChkZWZhdWx0RmlsdGVyKSB7XHJcbiAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXIuaXNEZWZhdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmFwc0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlci51cGRhdGVVc2VyU2V0dGluZ3Moe1xyXG4gICAgICAgICAgICBkZWZhdWx0RmlsdGVySWQ6IGUubmV3RGF0YS5pc0RlZmF1bHQgPyBlLmtleSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvblJvd1JlbW92aW5nOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFlLmtleSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5kZWxldGVGaWx0ZXIoZS5rZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmR4RGF0YUdyaWQoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUN1cnJlbnRGaWx0ZXJUaXRsZShkcm9wZG93bkJveE93bmVyOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3gpOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLWZpbHRlcnNfX2N1cnJlbnQtZmlsdGVyJylcclxuICAgICAgLmR4VGV4dEJveCh7XHJcbiAgICAgICAgdmFsdWU6IGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCd0ZXh0JykgfHwgZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3BsYWNlaG9sZGVyJyksXHJcbiAgICAgICAgcmVhZE9ubHk6IHRydWVcclxuICAgICAgfSlcclxuICAgICAgLmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTmV3RmlsdGVyQnV0dG9uKCk6IERldkV4cHJlc3MudWkuZHhCdXR0b24ge1xyXG4gICAgcmV0dXJuICQoJzxidXR0b24gLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy1maWx0ZXJzX19hZGQtbmV3LWZpbHRlciBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICB0ZXh0OiAnTmV3IERhdGEgU2V0JyxcclxuICAgICAgICB0eXBlOiAnbm9ybWFsJyxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9wZW5OZXdGaWx0ZXJQb3B1cCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaWNvbjogJ3BsdXMnXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyUG9wdXAoKSB7XHJcbiAgICBjb25zdCAkcG9wdXBSb290ID0gJCgnPGRpdiAvPicpLmFwcGVuZFRvKCdib2R5Jyk7XHJcbiAgICBsZXQgaXNQb3B1cEhpZGluZ0NvbmZpcm1lZCA9IGZhbHNlO1xyXG5cclxuICAgIHJldHVybiAkcG9wdXBSb290LmR4UG9wdXAoe1xyXG4gICAgICBjb250YWluZXI6IHRoaXMub3B0aW9ucy5vd25lci5lbGVtZW50KCksXHJcbiAgICAgIHNoYWRpbmc6IGZhbHNlLFxyXG4gICAgICByZXNpemVFbmFibGVkOiB0cnVlLFxyXG4gICAgICB3aWR0aDogNjUwLFxyXG4gICAgICBoZWlnaHQ6IDUwMCxcclxuICAgICAgb25TaG93aW5nOiAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94ICYmIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94LmNsb3NlKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uSGlkaW5nOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5oYXNDaGFuZ2VzIHx8IGlzUG9wdXBIaWRpbmdDb25maXJtZWQpIHtcclxuICAgICAgICAgIGlzUG9wdXBIaWRpbmdDb25maXJtZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlLmNhbmNlbCA9IHRydWU7XHJcbiAgICAgICAgaXNQb3B1cEhpZGluZ0NvbmZpcm1lZCA9IGF3YWl0IHRoaXMuY29uZmlybUNoYW5nZXNMb3NzKCk7XHJcbiAgICAgICAgaWYgKGlzUG9wdXBIaWRpbmdDb25maXJtZWQpIHtcclxuICAgICAgICAgIGUuY29tcG9uZW50LmhpZGUoKTtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94ICYmIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94Lm9wZW4oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pLmR4UG9wdXAoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbHRlck5hbWVUZXh0Qm94KCkge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKVxyXG4gICAgICAuZHhUZXh0Qm94KHtcclxuICAgICAgICBwbGFjZWhvbGRlcjogJ0VudGVyIERhdGEgU2V0IE5hbWUuLi4nLFxyXG4gICAgICB9KVxyXG4gICAgICAuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJJc0dsb2JhbENoZWNrYm94KCkge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKVxyXG4gICAgICAuZHhDaGVja0JveCh7XHJcbiAgICAgICAgdGV4dDogJ0dsb2JhbCBkYXRhIHNldCcsXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keENoZWNrQm94KCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGbGF0Q29sdW1uc0xpc3Qoc291cmNlQ29sdW1ucywgLi4ucmVzdCkge1xyXG4gICAgbGV0IHJlc3VsdCA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3Qgc291cmNlQ29sdW1uIG9mIHNvdXJjZUNvbHVtbnMpIHtcclxuICAgICAgaWYgKHNvdXJjZUNvbHVtbi5jb2x1bW5zICYmIHNvdXJjZUNvbHVtbi5jb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCBuZXN0ZWRDb2x1bW5zID0gdGhpcy5nZXRGbGF0Q29sdW1uc0xpc3Qoc291cmNlQ29sdW1uLmNvbHVtbnMpO1xyXG5cclxuICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KG5lc3RlZENvbHVtbnMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbiA9ICQuZXh0ZW5kKHt9LCBzb3VyY2VDb2x1bW4pO1xyXG5cclxuICAgICAgICBpZiAoY29sdW1uLmRhdGFUeXBlID09PSAnZGF0ZScgfHwgY29sdW1uLmRhdGFUeXBlID09PSAnZGF0ZXRpbWUnKSB7XHJcbiAgICAgICAgICBjb25zdCBpc0RhdGVUaW1lID0gY29sdW1uLmRhdGFUeXBlID09PSAnZGF0ZXRpbWUnO1xyXG4gICAgICAgICAgY29uc3QgZGF0ZUZvcm1hdCA9ICdkZCBNTU0geXknO1xyXG4gICAgICAgICAgY29uc3QgZGF0ZVRpbWVGb3JtYXQgPSAnaGg6bW0sIGRkIE1NTSB5eSc7XHJcbiAgICAgICAgICBjb25zdCBkaXNwbGF5Rm9ybWF0ID0gaXNEYXRlVGltZSA/IGRhdGVUaW1lRm9ybWF0IDogZGF0ZUZvcm1hdDtcclxuXHJcbiAgICAgICAgICBjb25zdCBwYXJzZURhdGVUaW1lID0gKGRhdGVTdHI6IHN0cmluZyk6IERhdGUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlVGltZVBhcnRzID0gZGF0ZVN0ci5zcGxpdCgnLCAnKTtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IERldkV4cHJlc3MubG9jYWxpemF0aW9uLnBhcnNlRGF0ZShkYXRlVGltZVBhcnRzWzFdLCBkYXRlRm9ybWF0KSB8fCBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRhdGUpIHtcclxuICAgICAgICAgICAgICBjb25zdCB0aW1lUGFydHMgPSBkYXRlVGltZVBhcnRzWzBdLnNwbGl0KCc6Jyk7XHJcblxyXG4gICAgICAgICAgICAgIGRhdGUuc2V0SG91cnMocGFyc2VJbnQodGltZVBhcnRzWzBdKSk7XHJcbiAgICAgICAgICAgICAgZGF0ZS5zZXRNaW51dGVzKHBhcnNlSW50KHRpbWVQYXJ0c1sxXSkpO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gZGF0ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBjb2x1bW4uZm9ybWF0ID0gZGlzcGxheUZvcm1hdDtcclxuICAgICAgICAgIGNvbHVtbi5lZGl0b3JUZW1wbGF0ZSA9IChlKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAkKCc8ZGl2IC8+JykuZHhEYXRlQm94KHtcclxuICAgICAgICAgICAgICBkaXNwbGF5Rm9ybWF0LFxyXG4gICAgICAgICAgICAgIHR5cGU6IGlzRGF0ZVRpbWUgPyAnZGF0ZXRpbWUnIDogJ2RhdGUnLFxyXG4gICAgICAgICAgICAgIHdpZHRoOiAxNTAsXHJcbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6ICh7IHZhbHVlIH0pID0+IHtcclxuICAgICAgICAgICAgICAgIGUuc2V0VmFsdWUoRGV2RXhwcmVzcy5sb2NhbGl6YXRpb24uZm9ybWF0RGF0ZSh2YWx1ZSwgZGlzcGxheUZvcm1hdCkpO1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgdmFsdWU6IChpc0RhdGVUaW1lID8gcGFyc2VEYXRlVGltZShlLnZhbHVlKSA6IERldkV4cHJlc3MubG9jYWxpemF0aW9uLnBhcnNlRGF0ZShlLnZhbHVlLCBkaXNwbGF5Rm9ybWF0KSlcclxuICAgICAgICAgICAgICAgIHx8IG51bGxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgY29sdW1uLmZpbHRlck9wZXJhdGlvbnMgPSBbJz0nLCAnPD4nLCAnPCcsICc+JywgJzw9JywgJz49JywgJ2lzYmxhbmsnLCAnaXNub3RibGFuayddO1xyXG4gICAgICAgICAgY29sdW1uLmNhbGN1bGF0ZUZpbHRlckV4cHJlc3Npb24gPSBmdW5jdGlvbihmaWx0ZXJWYWx1ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBhcmdzID0gW3NvdXJjZUNvbHVtbnMsIC4uLnJlc3RdO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFyZ3NbMF0pIHtcclxuICAgICAgICAgICAgICBpZiAoaXNEYXRlVGltZSkge1xyXG4gICAgICAgICAgICAgICAgYXJnc1swXSA9IHBhcnNlRGF0ZVRpbWUoYXJnc1swXSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFyZ3NbMF0gPSBEZXZFeHByZXNzLmxvY2FsaXphdGlvbi5wYXJzZURhdGUoZmlsdGVyVmFsdWUsIGRpc3BsYXlGb3JtYXQpIHx8IG51bGw7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0Q2FsY3VsYXRlRmlsdGVyRXhwcmVzc2lvbiguLi5hcmdzKTtcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXN1bHQucHVzaChjb2x1bW4pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdC5zb3J0KChjb2wxLCBjb2wyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhcHRpb24xID0gKGNvbDEuY2FwdGlvbiB8fCAnJykudG9Mb3dlckNhc2UoKTtcclxuICAgICAgY29uc3QgY2FwdGlvbjIgPSAoY29sMi5jYXB0aW9uIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgICAgaWYgKGNhcHRpb24xIDwgY2FwdGlvbjIpIHtcclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjYXB0aW9uMSA+IGNhcHRpb24yKSB7XHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbHRlckJ1aWxkZXIoKSB7XHJcbiAgICBjb25zdCBmaWx0ZXJCdWlsZGVyID0gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keEZpbHRlckJ1aWxkZXIoe1xyXG4gICAgICAgIGZpZWxkczogdGhpcy5nZXRGbGF0Q29sdW1uc0xpc3QodGhpcy5vcHRpb25zLm93bmVyLm9wdGlvbignY29sdW1ucycpKVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhGaWx0ZXJCdWlsZGVyKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHJldHVybiBmaWx0ZXJCdWlsZGVyO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJQb3B1cENvbnRlbnQoZmlsdGVyPzogSUNvbnRyb2xEaXNwbGF5RmlsdGVyKSB7XHJcbiAgICBjb25zdCAkcG9wdXBDb250ZW50ID0gJCgnPGRpdiAvPicpLmhlaWdodCgnMTAwJScpO1xyXG5cclxuICAgIGNvbnN0ICRuYW1lQ29udGFpbmVyID0gJCgnPGRpdiBjbGFzcz1cImFwcy1maWx0ZXJzX19uYW1lLWNvbnRhaW5lclwiIC8+JykuaGVpZ2h0KCczNnB4Jyk7XHJcblxyXG4gICAgLy8gTk9URTogUmVjcmVhdGUgd2lkZ2V0c1xyXG4gICAgdGhpcy5maWx0ZXJOYW1lVGV4dEJveCA9IHRoaXMuY3JlYXRlRmlsdGVyTmFtZVRleHRCb3goKTtcclxuICAgIHRoaXMuZmlsdGVyQnVpbGRlciA9IHRoaXMuY3JlYXRlRmlsdGVyQnVpbGRlcigpO1xyXG4gICAgdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94ID0gdGhpcy5jcmVhdGVGaWx0ZXJJc0dsb2JhbENoZWNrYm94KCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJOYW1lVGV4dEJveC5vcHRpb24oJ3ZhbHVlJywgZmlsdGVyICYmIGZpbHRlci5uYW1lKTtcclxuICAgIHRoaXMuZmlsdGVyTmFtZVRleHRCb3guZWxlbWVudCgpLmFwcGVuZFRvKCRuYW1lQ29udGFpbmVyKTtcclxuXHJcbiAgICB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCd2YWx1ZScsIGZpbHRlciAmJiBmaWx0ZXIuaXNHbG9iYWwpO1xyXG4gICAgdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94LmVsZW1lbnQoKS5hcHBlbmRUbygkbmFtZUNvbnRhaW5lcik7XHJcbiAgICB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCdkaXNhYmxlZCcsICF0aGlzLm9wdGlvbnMuY2FuQ3JlYXRlR2xvYmFsRmlsdGVycyk7XHJcblxyXG4gICAgJG5hbWVDb250YWluZXIuYXBwZW5kVG8oJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJCdWlsZGVyLm9wdGlvbigndmFsdWUnLCBmaWx0ZXIgJiYgZmlsdGVyLmZpbHRlclN0YXRlKTtcclxuXHJcbiAgICBjb25zdCAkZmlsdGVyQnVpbGRlckNvbnRhaW5lciA9ICQoJzxkaXYgLz4nKS5oZWlnaHQoJ2NhbGMoMTAwJSAtIDM2cHgpJykuYXBwZW5kVG8oJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJCdWlsZGVyLmVsZW1lbnQoKS5hcHBlbmRUbygkZmlsdGVyQnVpbGRlckNvbnRhaW5lcik7XHJcblxyXG4gICAgJGZpbHRlckJ1aWxkZXJDb250YWluZXIuZHhTY3JvbGxWaWV3KHtcclxuICAgICAgc2Nyb2xsQnlDb250ZW50OiB0cnVlXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gJHBvcHVwQ29udGVudDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyUG9wdXBUb29sYmFySXRlbXMoZmlsdGVyPzogSUNvbnRyb2xEaXNwbGF5RmlsdGVyKTogRGV2RXhwcmVzcy51aS5keFBvcHVwLlRvb2xiYXJJdGVtW10ge1xyXG4gICAgcmV0dXJuIGZpbHRlciA/IFtcclxuICAgICAgdGhpcy5jcmVhdGVVcGRhdGVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCksXHJcbiAgICAgIHRoaXMuY3JlYXRlU2F2ZUZpbHRlckFzTmV3UG9wdXBUb29sYmFySXRlbSgpLFxyXG4gICAgICB0aGlzLmNyZWF0ZVJlc2V0RmlsdGVyUG9wdXBUb29sYmFySXRlbSgpLFxyXG4gICAgICB0aGlzLmNyZWF0ZURlbGV0ZUZpbHRlclBvcHVwVG9vbGJhckl0ZW0oKVxyXG4gICAgXSA6IFt0aGlzLmNyZWF0ZVNhdmVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCldO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlRmlsdGVyUG9wdXBUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuVG9vbGJhckl0ZW0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgdGV4dDogJ0FwcGx5IGFuZCBTYXZlJyxcclxuICAgICAgICBvbkNsaWNrOiB0aGlzLmNyZWF0ZU5ld0ZpbHRlci5iaW5kKHRoaXMpLFxyXG4gICAgICAgIGljb246ICdzYXZlJ1xyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVVcGRhdGVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhQb3B1cC5Ub29sYmFySXRlbSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICB0ZXh0OiAnQXBwbHkgYW5kIFVwZGF0ZScsXHJcbiAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyKHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcik7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBpY29uOiAnc2F2ZSdcclxuICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2F2ZUZpbHRlckFzTmV3UG9wdXBUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuVG9vbGJhckl0ZW0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgdGV4dDogJ1NhdmUgQXMgTmV3JyxcclxuICAgICAgICBvbkNsaWNrOiB0aGlzLmNyZWF0ZU5ld0ZpbHRlci5iaW5kKHRoaXMpLFxyXG4gICAgICAgIGljb246ICdzYXZlJ1xyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVSZXNldEZpbHRlclBvcHVwVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFBvcHVwLlRvb2xiYXJJdGVtIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIHRleHQ6ICdSZXNldCcsXHJcbiAgICAgICAgb25DbGljazogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmhhc0NoYW5nZXMgfHwgIXRoaXMuZmlsdGVyQnVpbGRlciB8fCAhdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBpc0NvbmZpcm1lZCA9IGF3YWl0IERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oXHJcbiAgICAgICAgICAgICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVzZXQgdW5zYXZlZCBjaGFuZ2VzPycsXHJcbiAgICAgICAgICAgICdSZXNldCB0aGUgZGF0YSBzZXQnXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKCFpc0NvbmZpcm1lZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5yZXNldENoYW5nZXMoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGljb246ICd1bmRvJ1xyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVEZWxldGVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhQb3B1cC5Ub29sYmFySXRlbSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICB0ZXh0OiAnRGVsZXRlIERhdGEgU2V0JyxcclxuICAgICAgICBvbkNsaWNrOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgaXNDb25maXJtZWQgPSBhd2FpdCBEZXZFeHByZXNzLnVpLmRpYWxvZy5jb25maXJtKFxyXG4gICAgICAgICAgICBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgXCIke3RoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5uYW1lfVwiIGRhdGEgc2V0P2AsXHJcbiAgICAgICAgICAgICdEZWxldGUgdGhlIGRhdGEgc2V0J1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGlmICghaXNDb25maXJtZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlRmlsdGVyKHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkKTtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyUG9wdXAuaGlkZSgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaWNvbjogJ3RyYXNoJ1xyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBvcGVuTmV3RmlsdGVyUG9wdXAoKSB7XHJcbiAgICBjb25zdCBpc0ZpbHRlckFwcGxpZWQgPSBhd2FpdCB0aGlzLnRyeUFwcGx5RmlsdGVyKHVuZGVmaW5lZCk7XHJcbiAgICBpZiAoIWlzRmlsdGVyQXBwbGllZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVGaWx0ZXJQb3B1cENvbnRlbnQoKTtcclxuICAgIHRoaXMuZmlsdGVyUG9wdXAuc2hvdygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvcGVuRWRpdEZpbHRlclBvcHVwKGZpbHRlcjogSUNvbnRyb2xEaXNwbGF5RmlsdGVyKSB7XHJcbiAgICB0aGlzLnVwZGF0ZUZpbHRlclBvcHVwQ29udGVudChmaWx0ZXIpO1xyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5zaG93KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUZpbHRlclBvcHVwQ29udGVudChmaWx0ZXI/OiBJQ29udHJvbERpc3BsYXlGaWx0ZXIpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRBbmltYXRpb24gPSB0aGlzLmZpbHRlclBvcHVwLm9wdGlvbignYW5pbWF0aW9uJyk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ2FuaW1hdGlvbicsIHVuZGVmaW5lZCk7XHJcbiAgICB0aGlzLmZpbHRlclBvcHVwLm9wdGlvbigndGl0bGUnLCBmaWx0ZXIgPyBgRWRpdCB0aGUgXCIke2ZpbHRlci5uYW1lfVwiIGRhdGEgc2V0YCA6ICdDcmVhdGUgYSBuZXcgZGF0YSBzZXQnKTtcclxuICAgIHRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCdjb250ZW50VGVtcGxhdGUnLCAoKSA9PiB0aGlzLmNyZWF0ZUZpbHRlclBvcHVwQ29udGVudChmaWx0ZXIpKTtcclxuICAgIHRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCd0b29sYmFySXRlbXMnLCB0aGlzLmNyZWF0ZUZpbHRlclBvcHVwVG9vbGJhckl0ZW1zKGZpbHRlcikpO1xyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5yZXBhaW50KCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ2FuaW1hdGlvbicsIGN1cnJlbnRBbmltYXRpb24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVOZXdGaWx0ZXIoKSB7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyTmFtZVRleHRCb3ggfHwgIXRoaXMuZmlsdGVyQnVpbGRlciB8fCAhdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmaWx0ZXJOYW1lID0gdGhpcy5maWx0ZXJOYW1lVGV4dEJveC5vcHRpb24oJ3ZhbHVlJyk7XHJcbiAgICBjb25zdCBmaWx0ZXJCdWlsZGVyU3RhdGUgPSB0aGlzLmZpbHRlckJ1aWxkZXIub3B0aW9uKCd2YWx1ZScpO1xyXG4gICAgY29uc3QgaXNEZWZhdWx0ID0gZmFsc2U7XHJcbiAgICBjb25zdCBpc0dsb2JhbCA9IHRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveC5vcHRpb24oJ3ZhbHVlJyk7XHJcblxyXG4gICAgaWYgKCFmaWx0ZXJOYW1lKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb250cm9sRGlzcGxheUZpbHRlciA9IGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3JlYXRlTmV3RmlsdGVyKFxyXG4gICAgICBmaWx0ZXJOYW1lLCBmaWx0ZXJCdWlsZGVyU3RhdGUsIGlzRGVmYXVsdCwgaXNHbG9iYWxcclxuICAgICk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRGaWx0ZXJEcm9wZG93bkJveERhdGEoKTtcclxuICAgIGF3YWl0IHRoaXMuYXBwbHlGaWx0ZXIoY29udHJvbERpc3BsYXlGaWx0ZXIuaWQpO1xyXG5cclxuICAgIG5vdGlmeSgnQ3JlYXRlZCcsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVGaWx0ZXIoZmlsdGVyOiBJQ29udHJvbERpc3BsYXlGaWx0ZXIpIHtcclxuICAgIGlmICghdGhpcy5maWx0ZXJOYW1lVGV4dEJveCB8fCAhdGhpcy5maWx0ZXJCdWlsZGVyIHx8ICF0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZpbHRlck5hbWUgPSB0aGlzLmZpbHRlck5hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IGZpbHRlclN0YXRlID0gdGhpcy5maWx0ZXJCdWlsZGVyLm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IGlzR2xvYmFsID0gdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94Lm9wdGlvbigndmFsdWUnKTtcclxuXHJcbiAgICBpZiAoIWZpbHRlck5hbWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGlzVXBkYXRlZCA9IGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIudXBkYXRlRmlsdGVyKGZpbHRlci5pZCwge1xyXG4gICAgICBuYW1lOiBmaWx0ZXJOYW1lLFxyXG4gICAgICBmaWx0ZXJTdGF0ZSxcclxuICAgICAgaXNHbG9iYWxcclxuICAgIH0pO1xyXG4gICAgaWYgKCFpc1VwZGF0ZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE86IHVwZGF0ZSB0aXRsZVxyXG4gICAgbm90aWZ5KCdVcGRhdGVkJywgdHJ1ZSk7XHJcbiAgICBhd2FpdCB0aGlzLmFwcGx5RmlsdGVyKHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5pZCk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRGaWx0ZXJEcm9wZG93bkJveERhdGEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZGVsZXRlRmlsdGVyKGZpbHRlcklkOiBudW1iZXIpIHtcclxuICAgIGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuZGVsZXRlRmlsdGVyKGZpbHRlcklkKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMub25GaWx0ZXJEZWxldGVkKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5vbkZpbHRlckRlbGV0ZWQoZmlsdGVySWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IHRoaXMuYXBwbHlGaWx0ZXIodW5kZWZpbmVkKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZEZpbHRlckRyb3Bkb3duQm94RGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldENoYW5nZXMoKSB7XHJcbiAgICB0aGlzLmZpbHRlck5hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIubmFtZSk7XHJcbiAgICB0aGlzLmZpbHRlckJ1aWxkZXIub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5maWx0ZXJTdGF0ZSk7XHJcbiAgICB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5pc0dsb2JhbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGxvYWRGaWx0ZXJEcm9wZG93bkJveERhdGEoKSB7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBbdXNlclNldHRpbmdzLCBmaWx0ZXJzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcclxuICAgICAgdGhpcy5vcHRpb25zLmFwc0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlci5nZXRVc2VyU2V0dGluZ3MoKSxcclxuICAgICAgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5nZXRGaWx0ZXJzKClcclxuICAgIF0pO1xyXG5cclxuICAgIGlmICh1c2VyU2V0dGluZ3MuZGVmYXVsdEZpbHRlcklkKSB7XHJcbiAgICAgIGNvbnN0IGRlZmF1bHRGaWx0ZXIgPSBmaWx0ZXJzLmZpbmQoKGYpID0+IGYuaWQgPT09IHVzZXJTZXR0aW5ncy5kZWZhdWx0RmlsdGVySWQpO1xyXG4gICAgICBpZiAoZGVmYXVsdEZpbHRlcikge1xyXG4gICAgICAgIChkZWZhdWx0RmlsdGVyIGFzIGFueSkuaXNEZWZhdWx0ID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGV2RXhwcmVzcy5kYXRhLkFycmF5U3RvcmUoe1xyXG4gICAgICBrZXk6ICdpZCcsXHJcbiAgICAgIGRhdGE6IGZpbHRlcnNcclxuICAgIH0pO1xyXG4gICAgdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3gub3B0aW9uKCdkYXRhU291cmNlJywgZGF0YVNvdXJjZSk7XHJcbiAgICB0aGlzLmZpbHRlcnNEYXRhR3JpZCAmJiB0aGlzLmZpbHRlcnNEYXRhR3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCBkYXRhU291cmNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY29uZmlybUNoYW5nZXNMb3NzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgLy8gTk9URTogRGVsYXkgZm9yIHBvcHVwIHZpc2liaWxpdHkgY2hlY2tpbmdcclxuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgMCkpO1xyXG4gICAgaWYgKCF0aGlzLmhhc0NoYW5nZXMgfHwgIXRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCd2aXNpYmxlJykpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oXHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgICdZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMgdGhhdCB3aWxsIGJlIGxvc3QgaWYgeW91IGNsb3NlIHRoaXMgcG9wdXAuIERvIHlvdSB3YW50IHRvIGNsb3NlIHRoZSBwb3B1cCBhbmQgbm90IHNhdmUgY2hhbmdlcz8nLFxyXG4gICAgICAnVW5zYXZlZCBjaGFuZ2VzJ1xyXG4gICAgKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElBcGlSZXNwb25zZSwgUmVxdWVzdFN0YXRlIH0gZnJvbSAnLi4vLi4vRGF0YSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElGaWxlVXBsb2FkZXJPcHRpb25zIHtcclxuICAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgbWF4RmlsZVNpemU6IG51bWJlcjtcclxuICBhY2NlcHRlZEZpbGVUeXBlczogc3RyaW5nO1xyXG4gIGFsbG93ZWRGaWxlRXh0ZW5zaW9uczogc3RyaW5nW107XHJcbiAgb25WYWx1ZUNoYW5nZWQ/OiAoZTogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlci5WYWx1ZUNoYW5nZWRFdmVudCkgPT4gdm9pZDtcclxuICBvblVwbG9hZFN0YXJ0ZWQ/OiAoZTogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlci5VcGxvYWRTdGFydGVkRXZlbnQpID0+IHZvaWQ7XHJcbiAgb25VcGxvYWRlZD86IChlOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyLlVwbG9hZGVkRXZlbnQpID0+IHZvaWQ7XHJcbiAgc2VsZWN0QnV0dG9uVGV4dD86IHN0cmluZztcclxuICBjc3NDbGFzcz86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEZpbGVVcGxvYWRlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhGaWxlU2l6ZTogbnVtYmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWNjZXB0ZWRGaWxlVHlwZXM6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93ZWRGaWxlRXh0ZW5zaW9uczogc3RyaW5nW107XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblZhbHVlQ2hhbmdlZDogKGU6IERldkV4cHJlc3MudWkuZHhGaWxlVXBsb2FkZXIuVmFsdWVDaGFuZ2VkRXZlbnQpID0+IHZvaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblVwbG9hZFN0YXJ0ZWQ6IChlOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyLlVwbG9hZFN0YXJ0ZWRFdmVudCkgPT4gdm9pZCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uVXBsb2FkZWQ6IChlOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyLlVwbG9hZGVkRXZlbnQpID0+IHZvaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjc3NDbGFzczogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0QnV0dG9uVGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIGZpbGVVcGxvYWRlcjogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlcjtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUZpbGVVcGxvYWRlck9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuY3NzQ2xhc3MgPSBvcHRpb25zLmNzc0NsYXNzO1xyXG4gICAgdGhpcy5tYXhGaWxlU2l6ZSA9IG9wdGlvbnMubWF4RmlsZVNpemU7XHJcbiAgICB0aGlzLmFjY2VwdGVkRmlsZVR5cGVzID0gb3B0aW9ucy5hY2NlcHRlZEZpbGVUeXBlcztcclxuICAgIHRoaXMuc2VsZWN0QnV0dG9uVGV4dCA9IG9wdGlvbnMuc2VsZWN0QnV0dG9uVGV4dDtcclxuICAgIHRoaXMuYWxsb3dlZEZpbGVFeHRlbnNpb25zID0gb3B0aW9ucy5hbGxvd2VkRmlsZUV4dGVuc2lvbnM7XHJcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkID0gb3B0aW9ucy5vblZhbHVlQ2hhbmdlZDtcclxuICAgIHRoaXMub25VcGxvYWRTdGFydGVkID0gb3B0aW9ucy5vblVwbG9hZFN0YXJ0ZWQ7XHJcbiAgICB0aGlzLm9uVXBsb2FkZWQgPSBvcHRpb25zLm9uVXBsb2FkZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgY29uc3QgJGZpbGVVcGxvYWRlciA9ICQoJzxkaXYgLz4nKTtcclxuICAgIGlmICh0aGlzLmNzc0NsYXNzKSB7XHJcbiAgICAgICRmaWxlVXBsb2FkZXIuYWRkQ2xhc3ModGhpcy5jc3NDbGFzcyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5maWxlVXBsb2FkZXIgPSAkZmlsZVVwbG9hZGVyLmR4RmlsZVVwbG9hZGVyKHtcclxuICAgICAgc2VsZWN0QnV0dG9uVGV4dDogdGhpcy5zZWxlY3RCdXR0b25UZXh0LFxyXG4gICAgICBsYWJlbFRleHQ6ICcnLFxyXG4gICAgICBhbGxvd2VkRmlsZUV4dGVuc2lvbnM6IHRoaXMuYWxsb3dlZEZpbGVFeHRlbnNpb25zLFxyXG4gICAgICBhY2NlcHQ6IHRoaXMuYWNjZXB0ZWRGaWxlVHlwZXMsXHJcbiAgICAgIHVwbG9hZE1vZGU6ICd1c2VGb3JtJyxcclxuICAgICAgbWF4RmlsZVNpemU6IHRoaXMubWF4RmlsZVNpemUsXHJcbiAgICAgIHNob3dGaWxlTGlzdDogZmFsc2UsXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgIGUuY29tcG9uZW50Lm9wdGlvbignbGFiZWxUZXh0JywgZS52YWx1ZVswXSA/IGUudmFsdWVbMF0ubmFtZSA6ICcnKTtcclxuICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkPy4oZSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uVXBsb2FkU3RhcnRlZDogKGUpID0+IHtcclxuICAgICAgICBlLmVsZW1lbnQuZmluZCgnLmR4LWZpbGV1cGxvYWRlci11cGxvYWQtYnV0dG9uJykuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMub25VcGxvYWRTdGFydGVkPy4oZSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uVXBsb2FkZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vblVwbG9hZGVkPy4oZSk7XHJcbiAgICAgIH0sXHJcbiAgICB9KS5keEZpbGVVcGxvYWRlcignaW5zdGFuY2UnKTtcclxuXHJcbiAgICB0aGlzLiRjb250YWluZXIuYXBwZW5kKHRoaXMuZmlsZVVwbG9hZGVyLmVsZW1lbnQoKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBsb2FkPFQ+KHVwbG9hZFVybDogc3RyaW5nLCBwYXJhbXM/OiBhbnkpOiBQcm9taXNlPFQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IGZkID0gbmV3IEZvcm1EYXRhKCk7XHJcbiAgICAgIGNvbnN0IGZpbGUgPSAodGhpcy5maWxlVXBsb2FkZXIuZWxlbWVudCgpLmZpbmQoJ2lucHV0JylbMF0gYXMgSFRNTElucHV0RWxlbWVudCkuZmlsZXNbMF07XHJcblxyXG4gICAgICBmZC5hcHBlbmQoJ2ZpbGUnLCBmaWxlKTtcclxuXHJcbiAgICAgIC8qIGVzbGludCBndWFyZC1mb3ItaW46IG9mZiAqL1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGZvcmluXHJcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBwYXJhbXMpIHtcclxuICAgICAgICBmZC5hcHBlbmQocHJvcCwgcGFyYW1zW3Byb3BdKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgJC5hamF4KHtcclxuICAgICAgICB1cmw6IHVwbG9hZFVybCxcclxuICAgICAgICB0eXBlOiAncG9zdCcsXHJcbiAgICAgICAgZGF0YTogZmQsXHJcbiAgICAgICAgY29udGVudFR5cGU6IGZhbHNlLFxyXG4gICAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcclxuICAgICAgICBzdWNjZXNzOiAocmVzcG9uc2U6IElBcGlSZXNwb25zZTxUPikgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLlJlcXVlc3RTdGF0ZSA9PT0gUmVxdWVzdFN0YXRlLkNvbXBsZXRlZCkge1xyXG4gICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlLkRhdGEgYXMgYW55KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlamVjdChyZXNwb25zZS5NZXNzYWdlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZSkgPT4gcmVqZWN0KCdVbmtub3duIGVycm9yJylcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGNyZWF0ZUR4RGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL0RhdGEvRHhEYXRhU291cmNlJztcclxuaW1wb3J0IG5vdGlmeSBmcm9tICcuLi8uLi9XaWRnZXRzL05vdGlmeSc7XHJcbmltcG9ydCB7IEZpbGVVcGxvYWRlciB9IGZyb20gJy4uL0ZpbGVVcGxvYWRlci9JbmRleCc7XHJcbmltcG9ydCB7IElGaWxlSW1wb3J0ZXJDb2x1bW5JbmZvLCBJRmlsZUltcG9ydGVyVGFibGVNZXRhZGF0YSB9IGZyb20gJy4vSUZpbGVJbXBvcnRlclRhYmxlTWV0YWRhdGEnO1xyXG5pbXBvcnQgZGVmYXVsdEdyaWQgZnJvbSAnLi4vLi4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vLi4vVXRpbHMvRXZlbnRFbWl0dGVyJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZpbGVJbXBvcnRlclRhYmxlSW5mbyB7XHJcbiAgc2NoZW1hOiBzdHJpbmc7XHJcbiAgdGFibGU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRmlsZUltcG9ydGVyT3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgZmlsZVVwbG9hZFVybDogc3RyaW5nO1xyXG4gIGNyZWF0ZVRhYmxlVXJsOiBzdHJpbmc7XHJcbiAgYWRkUm93c1VybDogc3RyaW5nO1xyXG4gIGdldFRhYmxlc0xpc3RVcmw/OiBzdHJpbmc7XHJcbiAgcHJlZGVmaW5lZFRhYmxlPzogSUZpbGVJbXBvcnRlclRhYmxlSW5mbztcclxuICBwcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGU/OiBJbXBvcnRGaWxlTW9kZTtcclxuICBjcmVhdGVUYWJsZUJ1dHRvblRleHQ/OiBzdHJpbmc7XHJcbiAgdXBkYXRlVGFibGVCdXR0b25UZXh0Pzogc3RyaW5nO1xyXG4gIGNyZWF0ZVRhYmxlTW9kZVRleHQ/OiBzdHJpbmc7XHJcbiAgdXBkYXRlVGFibGVNb2RlVGV4dD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGVudW0gSW1wb3J0RmlsZU1vZGUge1xyXG4gIENyZWF0ZU5ld1RhYmxlID0gMCxcclxuICBBZGROZXdSb3dzID0gMVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRmlsZUltcG9ydGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRBQkxFX1VQREFURURfRVZFTlQgPSAnZmlsZS1pbXBvcnRlci10YWJsZS11cGRhdGVkLWV2ZW50JztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlVXBsb2FkVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB0aXRsZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3JlYXRlVGFibGVVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGFkZFJvd3NVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHByZWRlZmluZWRUYWJsZTogSUZpbGVJbXBvcnRlclRhYmxlSW5mbyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdldFRhYmxlc0xpc3RVcmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNhbkNoYW5nZU1vZGU6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjcmVhdGVUYWJsZUJ1dHRvblRleHQ6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZVRhYmxlQnV0dG9uVGV4dDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3JlYXRlVGFibGVNb2RlVGV4dDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlVGFibGVNb2RlVGV4dDogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIHBvcHVwOiBEZXZFeHByZXNzLnVpLmR4UG9wdXA7XHJcbiAgcHJpdmF0ZSBmb3JtOiBEZXZFeHByZXNzLnVpLmR4Rm9ybTtcclxuICBwcml2YXRlIGZpbGVVcGxvYWRlcjogRmlsZVVwbG9hZGVyO1xyXG4gIHByaXZhdGUgZGF0YUdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICBwcml2YXRlIGFjdGlvbkJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcclxuICBwcml2YXRlIHJvd3NDb3VudGVyQ29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByb3dzQ291bnRlcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgbW9kZTogSW1wb3J0RmlsZU1vZGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElGaWxlSW1wb3J0ZXJPcHRpb25zKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5maWxlVXBsb2FkVXJsID0gb3B0aW9ucy5maWxlVXBsb2FkVXJsO1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy50aXRsZSA9IG9wdGlvbnMudGl0bGU7XHJcbiAgICB0aGlzLmdldFRhYmxlc0xpc3RVcmwgPSBvcHRpb25zLmdldFRhYmxlc0xpc3RVcmw7XHJcbiAgICB0aGlzLmNyZWF0ZVRhYmxlVXJsID0gb3B0aW9ucy5jcmVhdGVUYWJsZVVybDtcclxuICAgIHRoaXMuYWRkUm93c1VybCA9IG9wdGlvbnMuYWRkUm93c1VybDtcclxuICAgIHRoaXMucHJlZGVmaW5lZFRhYmxlID0gb3B0aW9ucy5wcmVkZWZpbmVkVGFibGU7XHJcbiAgICB0aGlzLmNhbkNoYW5nZU1vZGUgPSBvcHRpb25zLnByZWRlZmluZWRJbXBvcnRGaWxlTW9kZSA9PT0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5tb2RlID0gb3B0aW9ucy5wcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMucHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlIDogSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGU7XHJcbiAgICB0aGlzLmNyZWF0ZVRhYmxlQnV0dG9uVGV4dCA9IG9wdGlvbnMuY3JlYXRlVGFibGVCdXR0b25UZXh0IHx8ICdDcmVhdGUgVGFibGUnO1xyXG4gICAgdGhpcy51cGRhdGVUYWJsZUJ1dHRvblRleHQgPSBvcHRpb25zLnVwZGF0ZVRhYmxlQnV0dG9uVGV4dCB8fCAnQWRkIE5ldyBSb3dzJztcclxuICAgIHRoaXMuY3JlYXRlVGFibGVNb2RlVGV4dCA9IG9wdGlvbnMuY3JlYXRlVGFibGVNb2RlVGV4dCB8fCAnQ3JlYXRlIFRhYmxlJztcclxuICAgIHRoaXMudXBkYXRlVGFibGVNb2RlVGV4dCA9IG9wdGlvbnMudXBkYXRlVGFibGVNb2RlVGV4dCB8fCAnQWRkIE5ldyBSb3dzJztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzaG93KCkge1xyXG4gICAgdGhpcy5wb3B1cCA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbyh0aGlzLiRjb250YWluZXIpXHJcbiAgICAgIC5keFBvcHVwKHtcclxuICAgICAgICBzaG93VGl0bGU6IHRydWUsXHJcbiAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgICAgZHJhZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIHJlc2l6ZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSxcclxuICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiBmYWxzZSxcclxuICAgICAgICBmdWxsU2NyZWVuOiB0cnVlLFxyXG4gICAgICAgIG1heFdpZHRoOiAxMzAwLFxyXG4gICAgICAgIG1heEhlaWdodDogODAwLFxyXG4gICAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKCRjb250YWluZXIpID0+IHtcclxuICAgICAgICAgIGNvbnN0ICRzY3JvbGxWaWV3ID0gJCgnPGRpdiAvPicpO1xyXG5cclxuICAgICAgICAgIHRoaXMuZm9ybSA9IHRoaXMuY3JlYXRlRm9ybSgpO1xyXG4gICAgICAgICAgJHNjcm9sbFZpZXcuYXBwZW5kKHRoaXMuZm9ybS5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICAgICRzY3JvbGxWaWV3LmR4U2Nyb2xsVmlldyh7XHJcbiAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgICAgICAgIGhlaWdodDogJzEwMCUnXHJcbiAgICAgICAgICB9KS5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRvb2xiYXJJdGVtczogW3tcclxuICAgICAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0QWN0aW9uQnV0dG9uVGV4dCgpLFxyXG4gICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsXHJcbiAgICAgICAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5hY3Rpb25CdXR0b24gPSBlLmNvbXBvbmVudDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgb25DbGljazogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLm1vZGUgPT09IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVRhYmxlKCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkUm93c1RvVGFibGUoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICB0ZXh0OiAnQ2FuY2VsJyxcclxuICAgICAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy5wb3B1cC5oaWRlKClcclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgICAgICB9XVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhQb3B1cCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICB0aGlzLnBvcHVwLnNob3coKTtcclxuICAgIHRoaXMub25Nb2RlU3dpdGNoaW5nKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcG9zZSgpIHtcclxuICAgIGlmICh0aGlzLnBvcHVwKSB7XHJcbiAgICAgIHRoaXMucG9wdXAuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGb3JtKCk6IERldkV4cHJlc3MudWkuZHhGb3JtIHtcclxuICAgIGNvbnN0IGZvcm0gPSAkKCc8ZGl2PicpLmR4Rm9ybSh7XHJcbiAgICAgIHNob3dDb2xvbkFmdGVyTGFiZWw6IHRydWUsXHJcbiAgICAgIGxhYmVsTG9jYXRpb246ICd0b3AnLFxyXG4gICAgICBjb2xDb3VudEJ5U2NyZWVuOiB7IG1kOiA0LCBzbTogMSB9LFxyXG4gICAgICBzY3JlZW5CeVdpZHRoOiAod2lkdGgpID0+IHdpZHRoIDwgMTI1NiA/ICdzbScgOiAnbWQnLFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdNb2RlJyxcclxuICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgdGVtcGxhdGU6IChfZGF0YSwgJGNvbnRhaW5lcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVNb2RlU3dpdGNoZXIoJGNvbnRhaW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnU2NoZW1hJyxcclxuICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICBkaXNhYmxlZDogIXRoaXMuY2FuQ2hhbmdlTW9kZVxyXG4gICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRleHRCb3guUHJvcGVydGllcyxcclxuICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFt7XHJcbiAgICAgICAgICB0eXBlOiAncmVxdWlyZWQnLFxyXG4gICAgICAgIH1dXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdUYWJsZScsXHJcbiAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLmNhbkNoYW5nZU1vZGVcclxuICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUZXh0Qm94LlByb3BlcnRpZXMsXHJcbiAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbe1xyXG4gICAgICAgICAgdHlwZTogJ3JlcXVpcmVkJyxcclxuICAgICAgICB9XVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnVGFibGVTZWxlY3RvcicsXHJcbiAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgIHRleHQ6ICdUYWJsZSdcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVkaXRvclR5cGU6ICdkeFNlbGVjdEJveCcsXHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgICAgY29sU3BhbjogMixcclxuICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiBuZXcgRGV2RXhwcmVzcy5kYXRhLkRhdGFTb3VyY2Uoe1xyXG4gICAgICAgICAgICBzdG9yZTogY3JlYXRlRHhEYXRhU291cmNlKHtcclxuICAgICAgICAgICAgICBsb2FkVXJsOiB0aGlzLmdldFRhYmxlc0xpc3RVcmwsXHJcbiAgICAgICAgICAgICAgbG9hZFBhcmFtczogeyBjb250ZXh0TmFtZTogJycsIHRhYmxlc09ubHk6IHRydWUsIGlzV2FyZWhvdXNlQ29udGV4dDogdHJ1ZSB9LFxyXG4gICAgICAgICAgICAgIGxvYWRNZXRob2Q6ICdwb3N0JyxcclxuICAgICAgICAgICAgICBub3RpZnlFcnJvcjogZmFsc2VcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHBhZ2luYXRlOiBmYWxzZSxcclxuICAgICAgICAgICAgc29ydDogJ3RoaXMnLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBzZWFyY2hFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRleHRCb3guUHJvcGVydGllcyxcclxuICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFt7XHJcbiAgICAgICAgICB0eXBlOiAncmVxdWlyZWQnLFxyXG4gICAgICAgIH1dXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdTb3VyY2UgRmlsZScsXHJcbiAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgIHRlbXBsYXRlOiAoX2RhdGEsICRjb250YWluZXIpID0+IHtcclxuICAgICAgICAgIHRoaXMuY3JlYXRlRmlsZXNVcGxvYWRlcigkY29udGFpbmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdDb2x1bW5zIFNlbGVjdG9yJyxcclxuICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgdmlzaWJsZTogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbFNwYW46IDQsXHJcbiAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgIHRlbXBsYXRlOiAoX2RhdGEsICRjb250YWluZXIpID0+IHtcclxuICAgICAgICAgIHRoaXMuY3JlYXRlRGF0YUdyaWQoJGNvbnRhaW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XVxyXG4gICAgfSkuZHhGb3JtKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHJldHVybiBmb3JtO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVNb2RlU3dpdGNoZXIoJGNvbnRhaW5lcjogSlF1ZXJ5KSB7XHJcbiAgICAkKCc8ZGl2IC8+JykuZHhCdXR0b25Hcm91cCh7XHJcbiAgICAgIGl0ZW1zOiBbe1xyXG4gICAgICAgIHRleHQ6IHRoaXMuY3JlYXRlVGFibGVNb2RlVGV4dCxcclxuICAgICAgICBpY29uOiAnaW5zZXJ0dGFibGUnLFxyXG4gICAgICAgIHZhbHVlOiBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgdGV4dDogdGhpcy51cGRhdGVUYWJsZU1vZGVUZXh0LFxyXG4gICAgICAgIGljb246ICdpbnNlcnRyb3diZWxvdycsXHJcbiAgICAgICAgdmFsdWU6IEltcG9ydEZpbGVNb2RlLkFkZE5ld1Jvd3NcclxuICAgICAgfV0gYXMgYW55LFxyXG4gICAgICBrZXlFeHByOiAndmFsdWUnLFxyXG4gICAgICBkaXNhYmxlZDogIXRoaXMuY2FuQ2hhbmdlTW9kZSxcclxuICAgICAgc3R5bGluZ01vZGU6ICdvdXRsaW5lZCcsXHJcbiAgICAgIHNlbGVjdGlvbk1vZGU6ICdzaW5nbGUnLFxyXG4gICAgICBzZWxlY3RlZEl0ZW1LZXlzOiBbdGhpcy5tb2RlXSxcclxuICAgICAgb25JdGVtQ2xpY2s6IChlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tb2RlID0gZS5pdGVtRGF0YS52YWx1ZTtcclxuICAgICAgICB0aGlzLm9uTW9kZVN3aXRjaGluZygpO1xyXG4gICAgICB9LFxyXG4gICAgfSkuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbGVzVXBsb2FkZXIoJGNvbnRhaW5lcjogSlF1ZXJ5KSB7XHJcbiAgICB0aGlzLmZpbGVVcGxvYWRlciA9IG5ldyBGaWxlVXBsb2FkZXIoe1xyXG4gICAgICAkY29udGFpbmVyLFxyXG4gICAgICBjc3NDbGFzczogJ3RhYmxlLWNyZWF0b3JfX3VwbG9hZCcsXHJcbiAgICAgIG1heEZpbGVTaXplOiAxMCAqIDEwMDAwMDAsXHJcbiAgICAgIGFjY2VwdGVkRmlsZVR5cGVzOiAnLnhscywgLnhsc3gnLFxyXG4gICAgICBhbGxvd2VkRmlsZUV4dGVuc2lvbnM6IFsnLnhscycsICcueGxzeCddLFxyXG4gICAgICBzZWxlY3RCdXR0b25UZXh0OiAnU2VsZWN0IEV4Y2VsIGZpbGUnLFxyXG4gICAgICBvblZhbHVlQ2hhbmdlZDogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdQYXJzaW5nIHNlbGVjdGVkIGZpbGUuLi4nKTtcclxuICAgICAgICB0aGlzLmZpbGVVcGxvYWRlci51cGxvYWQ8SUZpbGVJbXBvcnRlclRhYmxlTWV0YWRhdGE+KHRoaXMuZmlsZVVwbG9hZFVybCkudGhlbigodGFibGVNZXRhKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGFibGVNZXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0Um93c0NvdW50KHRhYmxlTWV0YS5Sb3dzQ291bnQpO1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhU291cmNlID0gbmV3IERldkV4cHJlc3MuZGF0YS5EYXRhU291cmNlKHtcclxuICAgICAgICAgICAgICBzdG9yZToge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2FycmF5JyxcclxuICAgICAgICAgICAgICAgIGtleTogJ0lkJyxcclxuICAgICAgICAgICAgICAgIGRhdGE6IHRhYmxlTWV0YS5Db2x1bW5zXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBwYWdpbmF0ZTogZmFsc2VcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRhdGFHcmlkLm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgICBub3RpZnkoYFBhcnNpbmcgRXJyb3IgOiAke2V9YCwgZmFsc2UpO1xyXG4gICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhR3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5maWxlVXBsb2FkZXIucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZURhdGFHcmlkKCRjb250YWluZXI6IEpRdWVyeSkge1xyXG4gICAgY29uc3QgZ3JpZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgPSB7XHJcbiAgICAgIG5vRGF0YVRleHQ6ICdTZWxlY3QgRXhjZWwgRmlsZScsXHJcbiAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICBzZWFyY2hQYW5lbDoge1xyXG4gICAgICAgIHZpc2libGU6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIGdyb3VwUGFuZWw6IHtcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBoZWFkZXJGaWx0ZXI6IHtcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcclxuICAgICAgfSxcclxuICAgICAgZmlsdGVyUm93OiB7XHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgc29ydGluZzoge1xyXG4gICAgICAgIG1vZGU6ICdub25lJ1xyXG4gICAgICB9LFxyXG4gICAgICBwYWdpbmc6IHtcclxuICAgICAgICBwYWdlU2l6ZTogMTAwMDAsXHJcbiAgICAgICAgZW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIH0sXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgIG1vZGU6ICdjZWxsJyxcclxuICAgICAgfSxcclxuICAgICAgc2VsZWN0aW9uOiB7XHJcbiAgICAgICAgbW9kZTogJ25vbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbHVtbnM6IFt7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnSWQnLFxyXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnU2VsZWN0ZWQnLFxyXG4gICAgICAgIGRhdGFUeXBlOiAnYm9vbGVhbicsXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy5tb2RlID09PSBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnSXNLZXlDb2x1bW4nLFxyXG4gICAgICAgIGRhdGFUeXBlOiAnYm9vbGVhbicsXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy5tb2RlID09PSBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnTmFtZScsXHJcbiAgICAgICAgY2FwdGlvbjogJ0NvbHVtbiBOYW1lJ1xyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnVHlwZScsXHJcbiAgICAgICAgYWxsb3dFZGl0aW5nOiBmYWxzZVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnSXNOdWxsYWJsZScsXHJcbiAgICAgICAgYWxsb3dFZGl0aW5nOiB0aGlzLm1vZGUgPT09IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlICYmIHRoaXMuY2FuQ2hhbmdlTW9kZSxcclxuICAgICAgICBzZXRDZWxsVmFsdWU6IChuZXdEYXRhLCB2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgbmV3RGF0YS5Jc051bGxhYmxlID0gdmFsdWU7XHJcbiAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgbmV3RGF0YS5Jc0tleUNvbHVtbiA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfV0sXHJcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxyXG4gICAgICBvblRvb2xiYXJQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdG9vbGJhckl0ZW1zID0gZS50b29sYmFyT3B0aW9ucy5pdGVtcztcclxuICAgICAgICB0b29sYmFySXRlbXMucHVzaCh7XHJcbiAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmQoJCgnPHNwYW4+JylcclxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcygndGFibGUtY3JlYXRvcl9fdGFibGUtaGVhZGVyJylcclxuICAgICAgICAgICAgICAgIC50ZXh0KCdQYXJzZWQgRmlsZSBNZXRhZGF0YScpLFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgbG9jYXRpb246ICdiZWZvcmUnXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yb3dzQ291bnRlciA9ICQoJzxzcGFuPicpLnRleHQoJzEwMDAnKTtcclxuICAgICAgICAgICAgdGhpcy5yb3dzQ291bnRlckNvbnRhaW5lciA9ICQoJzxkaXY+JylcclxuICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxzcGFuPicpLnRleHQoJ1Jvd3MgQ291bnQ6ICcpLCB0aGlzLnJvd3NDb3VudGVyKS5oaWRlKCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb3dzQ291bnRlckNvbnRhaW5lcjtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9LFxyXG4gICAgICBvbkVkaXRvclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgICBpZiAoZS5wYXJlbnRUeXBlID09PSAnZGF0YVJvdycgJiYgZS5kYXRhRmllbGQgPT09ICdJc0tleUNvbHVtbicpIHtcclxuICAgICAgICAgIGNvbnN0IGVkaXRvck9wdGlvbnMgPSBlLmVkaXRvck9wdGlvbnMgYXMgRGV2RXhwcmVzcy51aS5keENoZWNrQm94T3B0aW9ucztcclxuICAgICAgICAgIGVkaXRvck9wdGlvbnMuZGlzYWJsZWQgPSBlLnJvdy5kYXRhLklzTnVsbGFibGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZGF0YUdyaWQgPSBkZWZhdWx0R3JpZCgkKCc8ZGl2IC8+JyksIHtcclxuICAgICAgb3B0aW9uczogZ3JpZE9wdGlvbnMsXHJcbiAgICAgIHN1bW1hcnlDb2x1bW46ICdOYW1lJyxcclxuICAgICAgaXNGdWxsU2NyZWVuOiBmYWxzZSxcclxuICAgICAgc2V0RGVmYXVsdENvbHVtbldpZHRoOiBmYWxzZVxyXG4gICAgfSk7XHJcblxyXG4gICAgJGNvbnRhaW5lci5hcHBlbmQodGhpcy5kYXRhR3JpZC5lbGVtZW50KCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVUYWJsZSgpIHtcclxuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB0aGlzLmZvcm0udmFsaWRhdGUoKTtcclxuICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcclxuICAgICAgY29uc3QgZHMgPSB0aGlzLmRhdGFHcmlkLmdldERhdGFTb3VyY2UoKTtcclxuICAgICAgaWYgKCFkcykge1xyXG4gICAgICAgIG5vdGlmeSgnU2VsZWN0IGZpbGUgd2l0aCBkYXRhJywgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBkcy5pdGVtcygpO1xyXG4gICAgICBpZiAoIXRoaXMuYXJlQ29sdW1uc1ZhbGlkKGNvbHVtbnMpKSB7XHJcbiAgICAgICAgbm90aWZ5KCdBdCBsZWFzdCAxIGtleSBjb2x1bW4gbXVzdCBiZSBzZXQnLCBmYWxzZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAgICAgc2NoZW1hOiB0aGlzLmZvcm0ub3B0aW9uKCdmb3JtRGF0YScpLlNjaGVtYSxcclxuICAgICAgICAgIHRhYmxlOiB0aGlzLmZvcm0ub3B0aW9uKCdmb3JtRGF0YScpLlRhYmxlLFxyXG4gICAgICAgICAgY29sdW1uczogSlNPTi5zdHJpbmdpZnkoY29sdW1ucylcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdDcmVhdGluZyBhbmQgZmlsbGluZyBEQiB0YWJsZS4uLicpO1xyXG4gICAgICAgIHRoaXMuZmlsZVVwbG9hZGVyLnVwbG9hZDxib29sZWFuPih0aGlzLmNyZWF0ZVRhYmxlVXJsLCBwYXJhbXMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2UgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5wb3B1cC5oaWRlKCk7XHJcbiAgICAgICAgICAgIG5vdGlmeShgVGhlIHRhYmxlIFske3BhcmFtcy5zY2hlbWF9XS5bJHtwYXJhbXMudGFibGV9XSBoYXMgYmVlbiBjcmVhdGVkYCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChGaWxlSW1wb3J0ZXIuVEFCTEVfVVBEQVRFRF9FVkVOVCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBub3RpZnkoJ1RoZSB0YWJsZSBoYXMgbm90IGJlZW4gY3JlYXRlZCcsIGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgbm90aWZ5KGBUYWJsZSBjcmVhdGluZyBlcnJvcjogJHtlfWAsIGZhbHNlKTtcclxuICAgICAgICB9KS5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZGF0YUdyaWQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZFJvd3NUb1RhYmxlKCkge1xyXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMuZm9ybS52YWxpZGF0ZSgpO1xyXG4gICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xyXG4gICAgICBjb25zdCBkcyA9IHRoaXMuZGF0YUdyaWQuZ2V0RGF0YVNvdXJjZSgpO1xyXG4gICAgICBpZiAoIWRzKSB7XHJcbiAgICAgICAgbm90aWZ5KCdTZWxlY3QgZmlsZSB3aXRoIGRhdGEnLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgY29sdW1ucyA9IGRzLml0ZW1zKCk7XHJcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgICB0YWJsZTogdGhpcy5mb3JtLm9wdGlvbignZm9ybURhdGEnKS5UYWJsZVNlbGVjdG9yLFxyXG4gICAgICAgIGNvbHVtbnM6IEpTT04uc3RyaW5naWZ5KGNvbHVtbnMpXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuZGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdBZGRpbmcgcm93cyB0byBEQiB0YWJsZS4uLicpO1xyXG4gICAgICB0aGlzLmZpbGVVcGxvYWRlci51cGxvYWQ8Ym9vbGVhbj4odGhpcy5hZGRSb3dzVXJsLCBwYXJhbXMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICB0aGlzLnBvcHVwLmhpZGUoKTtcclxuICAgICAgICAgIG5vdGlmeShgVGhlIHRhYmxlICR7cGFyYW1zLnRhYmxlfSBoYXMgYmVlbiB1cGRhdGVkYCwgdHJ1ZSk7XHJcbiAgICAgICAgICB0aGlzLmVtaXQoRmlsZUltcG9ydGVyLlRBQkxFX1VQREFURURfRVZFTlQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBub3RpZnkoJ1RoZSB0YWJsZSBoYXMgbm90IGJlZW4gdXBkYXRlZCcsIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgbm90aWZ5KGBUYWJsZSB1cGRhdGluZyBlcnJvcjogJHtlfWAsIGZhbHNlKTtcclxuICAgICAgfSkuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhR3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbk1vZGVTd2l0Y2hpbmcoKSB7XHJcbiAgICBjb25zdCBpc0NyZWF0ZVRhYmxlTW9kZSA9IHRoaXMubW9kZSA9PT0gSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGU7XHJcblxyXG4gICAgdGhpcy5hY3Rpb25CdXR0b24ub3B0aW9uKCd0ZXh0JywgdGhpcy5nZXRBY3Rpb25CdXR0b25UZXh0KCkpO1xyXG4gICAgdGhpcy5kYXRhR3JpZC5jb2x1bW5PcHRpb24oJ0lzS2V5Q29sdW1uJywgJ3Zpc2libGUnLCBpc0NyZWF0ZVRhYmxlTW9kZSk7XHJcbiAgICB0aGlzLmRhdGFHcmlkLmNvbHVtbk9wdGlvbignSXNOdWxsYWJsZScsICd2aXNpYmxlJywgaXNDcmVhdGVUYWJsZU1vZGUpO1xyXG5cclxuICAgIGlmICghdGhpcy5jYW5DaGFuZ2VNb2RlKSB7XHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdTY2hlbWEnLCAndmlzaWJsZScsIHRydWUpO1xyXG4gICAgICB0aGlzLmZvcm0udXBkYXRlRGF0YSgnU2NoZW1hJywgdGhpcy5wcmVkZWZpbmVkVGFibGUuc2NoZW1hKTtcclxuXHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdUYWJsZScsICd2aXNpYmxlJywgdHJ1ZSk7XHJcbiAgICAgIHRoaXMuZm9ybS51cGRhdGVEYXRhKCdUYWJsZScsIHRoaXMucHJlZGVmaW5lZFRhYmxlLnRhYmxlKTtcclxuXHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdUYWJsZVNlbGVjdG9yJywgJ3Zpc2libGUnLCBmYWxzZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZvcm0uaXRlbU9wdGlvbignU2NoZW1hJywgJ3Zpc2libGUnLCBpc0NyZWF0ZVRhYmxlTW9kZSk7XHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdUYWJsZScsICd2aXNpYmxlJywgaXNDcmVhdGVUYWJsZU1vZGUpO1xyXG4gICAgICB0aGlzLmZvcm0uaXRlbU9wdGlvbignVGFibGVTZWxlY3RvcicsICd2aXNpYmxlJywgIWlzQ3JlYXRlVGFibGVNb2RlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0QWN0aW9uQnV0dG9uVGV4dCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGUgPyB0aGlzLmNyZWF0ZVRhYmxlQnV0dG9uVGV4dCA6IHRoaXMudXBkYXRlVGFibGVCdXR0b25UZXh0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcmVDb2x1bW5zVmFsaWQoY29sdW1uczogSUZpbGVJbXBvcnRlckNvbHVtbkluZm9bXSkge1xyXG4gICAgcmV0dXJuIGNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLlNlbGVjdGVkKS5zb21lKChzKSA9PiBzLklzS2V5Q29sdW1uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Um93c0NvdW50KGNvdW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMucm93c0NvdW50ZXJDb250YWluZXIuc2hvdygpO1xyXG4gICAgdGhpcy5yb3dzQ291bnRlci50ZXh0KGNvdW50KTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEdyaWREaXNwbGF5c01hbmFnZXIgfSBmcm9tICcuL0dyaWREaXNwbGF5c01hbmFnZXInO1xyXG5pbXBvcnQgeyBHcmlkVmlld3NNYW5hZ2VyIH0gZnJvbSAnLi9HcmlkVmlld3NNYW5hZ2VyJztcclxuaW1wb3J0IHsgR3JpZEZpbHRlcnNNYW5hZ2VyIH0gZnJvbSAnLi9HcmlkRmlsdGVyc01hbmFnZXInO1xyXG5pbXBvcnQgeyBjcmVhdGVEaWFsb2cgfSBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL1BvcHVwJztcclxuaW1wb3J0IHsgQ2RtSW1wb3J0RmlsZU1vZGUgfSBmcm9tICcuLi8uLi9CdXNpbmVzcyc7XHJcbmltcG9ydCB7IEZpbGVJbXBvcnRlciwgSUZpbGVJbXBvcnRlclRhYmxlSW5mbywgSW1wb3J0RmlsZU1vZGUgfSBmcm9tICcuLi8uLi8uLi9Db21wb25lbnRzL0ZpbGVJbXBvcnRlci9JbmRleCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElGaWxlSW1wb3J0ZXJPcHRpb25zIHtcclxuICBtb2RlOiBDZG1JbXBvcnRGaWxlTW9kZTtcclxuICBjcmVhdGVUYWJsZVVybDogc3RyaW5nO1xyXG4gIGFkZFJvd3NVcmw6IHN0cmluZztcclxuICBmaWxlVXBsb2FkVXJsOiBzdHJpbmc7XHJcbiAgcHJlZGVmaW5lZFRhYmxlOiBJRmlsZUltcG9ydGVyVGFibGVJbmZvO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50IHtcclxuICByZWFkb25seSBvd25lcjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gIHJlYWRvbmx5IGVkaXRNb2RlOiBib29sZWFuO1xyXG4gIHJlYWRvbmx5IGdyaWREaXNwbGF5c01hbmFnZXI6IEdyaWREaXNwbGF5c01hbmFnZXI7XHJcbiAgcmVhZG9ubHkgZ3JpZFZpZXdzTWFuYWdlcjogR3JpZFZpZXdzTWFuYWdlcjtcclxuICByZWFkb25seSBncmlkRmlsdGVyc01hbmFnZXI6IEdyaWRGaWx0ZXJzTWFuYWdlcjtcclxuICByZWFkb25seSBpbXBvcnRGaWxlT3B0aW9ucz86IElGaWxlSW1wb3J0ZXJPcHRpb25zO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgR3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudCB7XHJcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IElHcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50O1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWREaXNwbGF5c01hbmFnZXI6IEdyaWREaXNwbGF5c01hbmFnZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkVmlld3NNYW5hZ2VyOiBHcmlkVmlld3NNYW5hZ2VyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZEZpbHRlcnNNYW5hZ2VyOiBHcmlkRmlsdGVyc01hbmFnZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbXBvcnRGaWxlT3B0aW9uczogSUZpbGVJbXBvcnRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgZGlzcGxheXNEcm9wZG93bkJveDogRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGN1cnJlbnREaXNwbGF5VGl0bGU6IERldkV4cHJlc3MudWkuZHhUZXh0Qm94IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgc2F2ZUJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHNhdmVBc0J1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGRhdGFHcmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBmaWxlSW1wb3J0ZXI6IEZpbGVJbXBvcnRlciB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUgdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgX2Rpc3BsYXlzVG9vbGJhckl0ZW06IERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9pbXBvcnRGaWxlVG9vbGJhckl0ZW06IERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbSB8IHVuZGVmaW5lZDtcclxuICAvLyB0c2xpbnQ6ZW5hYmxlIHZhcmlhYmxlLW5hbWVcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIgPSBvcHRpb25zLmdyaWREaXNwbGF5c01hbmFnZXI7XHJcbiAgICB0aGlzLmdyaWRWaWV3c01hbmFnZXIgPSBvcHRpb25zLmdyaWRWaWV3c01hbmFnZXI7XHJcbiAgICB0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlciA9IG9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyO1xyXG4gICAgdGhpcy5pbXBvcnRGaWxlT3B0aW9ucyA9IG9wdGlvbnMuaW1wb3J0RmlsZU9wdGlvbnM7XHJcblxyXG4gICAgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLm9uRGlzcGxhaXNMb2FkZWQgPSAoZGlzcGxheXMpID0+IHtcclxuICAgICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBEZXZFeHByZXNzLmRhdGEuQXJyYXlTdG9yZSh7XHJcbiAgICAgICAga2V5OiAnSWQnLFxyXG4gICAgICAgIGRhdGE6IGRpc3BsYXlzXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5kaXNwbGF5c0Ryb3Bkb3duQm94ICYmIHRoaXMuZGlzcGxheXNEcm9wZG93bkJveC5vcHRpb24oJ2RhdGFTb3VyY2UnLCBkYXRhU291cmNlKTtcclxuXHJcbiAgICAgIHRoaXMuZGF0YUdyaWQgJiYgdGhpcy5kYXRhR3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCBkYXRhU291cmNlKTtcclxuICAgICAgdGhpcy5kYXRhR3JpZCAmJiB0aGlzLmRhdGFHcmlkLmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLm9uRGlzcGxheUNoYW5nZWQgPSAoZGlzcGxheSkgPT4ge1xyXG4gICAgICB0aGlzLmRpc3BsYXlzRHJvcGRvd25Cb3ggJiYgdGhpcy5kaXNwbGF5c0Ryb3Bkb3duQm94Lm9wdGlvbigndmFsdWUnLCBkaXNwbGF5ID8gZGlzcGxheS5JZCA6IG51bGwpO1xyXG4gICAgICB0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUgJiYgdGhpcy5jdXJyZW50RGlzcGxheVRpdGxlLm9wdGlvbigndmFsdWUnLCBkaXNwbGF5ID8gZGlzcGxheS5OYW1lIDogbnVsbCk7XHJcbiAgICAgIHRoaXMuY3VycmVudERpc3BsYXlUaXRsZSAmJiB0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUub3B0aW9uKCdkaXNhYmxlZCcsICFkaXNwbGF5KTtcclxuICAgICAgdGhpcy5zYXZlQXNCdXR0b24gJiYgdGhpcy5zYXZlQXNCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsICFkaXNwbGF5KTtcclxuICAgICAgdGhpcy5zYXZlQnV0dG9uICYmIHRoaXMuc2F2ZUJ1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgIWRpc3BsYXkpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGF0YUdyaWQpIHtcclxuICAgICAgICBkaXNwbGF5XHJcbiAgICAgICAgICA/IHRoaXMuZGF0YUdyaWQuc2VsZWN0Um93cyhbZGlzcGxheS5JZF0sIGZhbHNlKVxyXG4gICAgICAgICAgOiB0aGlzLmRhdGFHcmlkLmRlc2VsZWN0QWxsKCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5pbnRlZ3JhdGVUb0dyaWQodGhpcy5vcHRpb25zLm93bmVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW50ZWdyYXRlVG9HcmlkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gICAgY29uc3QgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgPSBncmlkLm9wdGlvbignb25Ub29sYmFyUHJlcGFyaW5nJyk7XHJcblxyXG4gICAgZ3JpZC5vcHRpb24oJ29uVG9vbGJhclByZXBhcmluZycsIChlOiBhbnkpID0+IHtcclxuICAgICAgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgJiYgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcoZSk7XHJcbiAgICAgIHRoaXMub25HcmlkVG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkdyaWRUb29sYmFyUHJlcGFyaW5nOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydvblRvb2xiYXJQcmVwYXJpbmcnXSA9IChlKSA9PiB7XHJcbiAgICBjb25zdCB0b29sYmFySXRlbXMgPSBlLnRvb2xiYXJPcHRpb25zICYmIGUudG9vbGJhck9wdGlvbnMuaXRlbXM7XHJcbiAgICBpZiAoIXRvb2xiYXJJdGVtcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmV3SXRlbXMgPSBbdGhpcy5kaXNwbGF5c1Rvb2xiYXJJdGVtXTtcclxuXHJcbiAgICBpZiAodGhpcy5pbXBvcnRGaWxlT3B0aW9ucyAmJiB0aGlzLmltcG9ydEZpbGVPcHRpb25zLm1vZGUgIT09IENkbUltcG9ydEZpbGVNb2RlLk5vbmUpIHtcclxuICAgICAgbmV3SXRlbXMucHVzaCh0aGlzLmltcG9ydEZpbGVUb29sYmFySXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgdG9vbGJhckl0ZW1zLnNwbGljZSgxLCAwLCAuLi5uZXdJdGVtcyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZURhdGFHcmlkKGRyb3Bkb3duQm94T3duZXI6IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveCk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keERhdGFHcmlkKHtcclxuICAgICAgICBkYXRhU291cmNlOiBkcm9wZG93bkJveE93bmVyLmdldERhdGFTb3VyY2UoKSxcclxuICAgICAgICByZW1vdGVPcGVyYXRpb25zOiBmYWxzZSxcclxuICAgICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgICBhbGxvd0FkZGluZzogZmFsc2UsXHJcbiAgICAgICAgICBhbGxvd1VwZGF0aW5nOiBmYWxzZSxcclxuICAgICAgICAgIGFsbG93RGVsZXRpbmc6IHRoaXMub3B0aW9ucy5lZGl0TW9kZSxcclxuICAgICAgICAgIG1vZGU6ICdyb3cnLFxyXG4gICAgICAgICAgdXNlSWNvbnM6IHRydWUsXHJcbiAgICAgICAgICB0ZXh0czoge1xyXG4gICAgICAgICAgICBjb25maXJtRGVsZXRlTWVzc2FnZTogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBkaXNwbGF5PydcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGxvYWRQYW5lbDoge1xyXG4gICAgICAgICAgc2hhZGluZzogdHJ1ZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgYWxsb3dDb2x1bW5SZXNpemluZzogdHJ1ZSxcclxuICAgICAgICBjb2x1bW5BdXRvV2lkdGg6IHRydWUsXHJcbiAgICAgICAgd29yZFdyYXBFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnTmFtZScsXHJcbiAgICAgICAgICAgIGNhcHRpb246ICdEaXNwbGF5J1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnRmlsdGVySWQnLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiAnRGF0YSBTZXQnLFxyXG4gICAgICAgICAgICBsb29rdXA6IHtcclxuICAgICAgICAgICAgICB2YWx1ZUV4cHI6ICdpZCcsXHJcbiAgICAgICAgICAgICAgZGlzcGxheUV4cHI6ICduYW1lJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdWaWV3SWQnLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiAnVmlldycsXHJcbiAgICAgICAgICAgIGxvb2t1cDoge1xyXG4gICAgICAgICAgICAgIHZhbHVlRXhwcjogJ2lkJyxcclxuICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ25hbWUnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICBdLFxyXG4gICAgICAgIGtleWJvYXJkTmF2aWdhdGlvbjoge1xyXG4gICAgICAgICAgZWRpdE9uS2V5UHJlc3M6IGZhbHNlLFxyXG4gICAgICAgICAgZW5hYmxlZDogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNob3dDb2x1bW5IZWFkZXJzOiB0cnVlLFxyXG4gICAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGZvY3VzZWRSb3dFbmFibGVkOiBmYWxzZSxcclxuICAgICAgICBzaG93Qm9yZGVyczogZmFsc2UsXHJcbiAgICAgICAgaGVpZ2h0OiB0aGlzLm9wdGlvbnMuZWRpdE1vZGUgPyAnY2FsYygxMDAlIC0gNTFweCknIDogJzEwMCUnLFxyXG4gICAgICAgIHNjcm9sbGluZzogeyBtb2RlOiAnc3RhbmRhcmQnIH0sXHJcbiAgICAgICAgcGFnaW5nOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXHJcbiAgICAgICAgbm9EYXRhVGV4dDogJ05vIGRpc3BsYXlzJyxcclxuICAgICAgICBvbkluaXRpYWxpemVkOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZmlsdGVycyA9IGF3YWl0IHRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmdldEZpbHRlcnMoKTtcclxuICAgICAgICAgIGNvbnN0IHZpZXdzID0gYXdhaXQgdGhpcy5ncmlkVmlld3NNYW5hZ2VyLmdldFZpZXdzKCk7XHJcblxyXG4gICAgICAgICAgZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKCdGaWx0ZXJJZCcsICdsb29rdXAuZGF0YVNvdXJjZScsIGZpbHRlcnMpO1xyXG4gICAgICAgICAgZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKCdWaWV3SWQnLCAnbG9va3VwLmRhdGFTb3VyY2UnLCB2aWV3cyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkNlbGxDbGljazogYXN5bmMgKGUpID0+IHtcclxuICAgICAgICAgIGlmIChlLnJvd1R5cGUgIT09ICdkYXRhJykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3ZhbHVlJywgZS5kYXRhLklkKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uUm93UmVtb3Zpbmc6IGFzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFHcmlkLmJlZ2luQ3VzdG9tTG9hZGluZygnTG9hZGluZycpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmRlbGV0ZURpc3BsYXkoZS5rZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmR4RGF0YUdyaWQoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZURpc3BsYXlzVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHtcclxuICAgIGNvbnN0IGJhc2ljT3B0aW9uczogRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveC5Qcm9wZXJ0aWVzIHwgRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94LlByb3BlcnRpZXMgPSB7XHJcbiAgICAgIHZhbHVlRXhwcjogJ0lkJyxcclxuICAgICAgZGlzcGxheUV4cHI6ICdOYW1lJyxcclxuICAgICAgc2hvd0NsZWFyQnV0dG9uOiB0cnVlLFxyXG4gICAgICBwbGFjZWhvbGRlcjogJ05vbmUnLFxyXG4gICAgICB3aWR0aDogMjAwLFxyXG4gICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGlzcGxheXNEcm9wZG93bkJveCA9IGUuY29tcG9uZW50O1xyXG4gICAgICAgIHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5nZXREaXNwbGF5cygpO1xyXG4gICAgICB9LFxyXG4gICAgICBvblZhbHVlQ2hhbmdlZDogYXN5bmMgKGUpID0+IHtcclxuICAgICAgICBjb25zdCBkaXNwbGF5ID0gdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmN1cnJlbnREaXNwbGF5O1xyXG5cclxuICAgICAgICBjb25zdCBmaWx0ZXJDaGFuZ2VkID0gZGlzcGxheSAmJiBkaXNwbGF5LkZpbHRlcklkICE9PSB0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQ7XHJcbiAgICAgICAgY29uc3Qgdmlld0NoYW5nZWQgPSBkaXNwbGF5ICYmIGRpc3BsYXkuVmlld0lkICE9PSB0aGlzLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZDtcclxuXHJcbiAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgKGZpbHRlckNoYW5nZWQgfHwgdmlld0NoYW5nZWRcclxuICAgICAgICAgID8gdGhpcy5jb25maXJtQ2hhbmdlc0xvc3MoKVxyXG4gICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUodHJ1ZSkpO1xyXG5cclxuICAgICAgICBpZiAoY29uZmlybWVkKSB7XHJcbiAgICAgICAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuY3VycmVudERpc3BsYXlJZCA9IGUudmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGRyb3BEb3duQm94T3B0aW9uczogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94T3B0aW9ucyA9IHtcclxuICAgICAgZWxlbWVudEF0dHI6IHtjbGFzczogJ2lzem9sZWEtbWQnfSxcclxuICAgICAgZHJvcERvd25PcHRpb25zOiB7XHJcbiAgICAgICAgd2lkdGg6IDgwMFxyXG4gICAgICB9LFxyXG4gICAgICBjb250ZW50VGVtcGxhdGU6ICF0aGlzLm9wdGlvbnMuZWRpdE1vZGUgPyB2b2lkIDAgOiAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YUdyaWQgPSB0aGlzLmNyZWF0ZURhdGFHcmlkKGUuY29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUgPSB0aGlzLmNyZWF0ZUN1cnJlbnREaXNwbGF5VGl0bGUoZS5jb21wb25lbnQpO1xyXG4gICAgICAgIHRoaXMuc2F2ZUJ1dHRvbiA9IHRoaXMuY3JlYXRlU2F2ZVZpZXdCdXR0b24oKTtcclxuICAgICAgICB0aGlzLnNhdmVBc0J1dHRvbiA9IHRoaXMuY3JlYXRlU2F2ZVZpZXdBc0J1dHRvbigpO1xyXG5cclxuICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRlbnRIZWFkZXIgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgIC5hZGRDbGFzcygnYXBzLWRpc3BsYXlzX19oZWFkZXInKVxyXG4gICAgICAgICAgLmFwcGVuZCh0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUuZWxlbWVudCgpKVxyXG4gICAgICAgICAgLmFwcGVuZCh0aGlzLnNhdmVCdXR0b24uZWxlbWVudCgpKVxyXG4gICAgICAgICAgLmFwcGVuZCh0aGlzLnNhdmVBc0J1dHRvbi5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRlbnQgPSAkKCc8ZGl2IC8+JykuaGVpZ2h0KCcxMDAlJyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZWRpdE1vZGUpIHtcclxuICAgICAgICAgIGRyb3Bkb3duQ29udGVudC5hcHBlbmQoZHJvcGRvd25Db250ZW50SGVhZGVyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRyb3Bkb3duQ29udGVudC5hcHBlbmQodGhpcy5kYXRhR3JpZC5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICByZXR1cm4gZHJvcGRvd25Db250ZW50O1xyXG4gICAgICB9LFxyXG4gICAgICBvbk9wZW5lZDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2F2ZUFzQnV0dG9uICYmIHRoaXMuc2F2ZUFzQnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCAhdGhpcy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkKTtcclxuICAgICAgICB0aGlzLnNhdmVCdXR0b24gJiYgdGhpcy5zYXZlQnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCAhdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmN1cnJlbnREaXNwbGF5KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB3aWRnZXQ6IHRoaXMub3B0aW9ucy5lZGl0TW9kZSA/ICgnZHhEcm9wRG93bkJveCcgYXMgYW55KSA6ICdkeFNlbGVjdEJveCcsXHJcbiAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICB0ZXh0OiAnRGlzcGxheXMnLFxyXG4gICAgICBjc3NDbGFzczogJ2Fwcy1kaXNwbGF5c19fdG9vbGJhci1pdGVtJyxcclxuICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLmVkaXRNb2RlID8gJC5leHRlbmQoYmFzaWNPcHRpb25zLCBkcm9wRG93bkJveE9wdGlvbnMpIDogYmFzaWNPcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVJbXBvcnRGaWxlVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICBpY29uOiAndXBsb2FkJyxcclxuICAgICAgICBoaW50OiAnSW1wb3J0IGZpbGUnLFxyXG4gICAgICAgIGhlaWdodDogMzAsXHJcbiAgICAgICAgc3R5bGluZ01vZGU6ICd0ZXh0JyxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5maWxlSW1wb3J0ZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5maWxlSW1wb3J0ZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuZmlsZUltcG9ydGVyID0gbmV3IEZpbGVJbXBvcnRlcih7XHJcbiAgICAgICAgICAgICRjb250YWluZXI6IHRoaXMub3B0aW9ucy5vd25lci5lbGVtZW50KCkucGFyZW50KCksXHJcbiAgICAgICAgICAgIHRpdGxlOiAnSW1wb3J0IEZpbGUgdG8gQ0RNJyxcclxuICAgICAgICAgICAgY3JlYXRlVGFibGVVcmw6IHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMuY3JlYXRlVGFibGVVcmwsXHJcbiAgICAgICAgICAgIGFkZFJvd3NVcmw6IHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMuYWRkUm93c1VybCxcclxuICAgICAgICAgICAgZmlsZVVwbG9hZFVybDogdGhpcy5pbXBvcnRGaWxlT3B0aW9ucy5maWxlVXBsb2FkVXJsLFxyXG4gICAgICAgICAgICBwcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGU6IHRoaXMuZ2V0UHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlKHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMubW9kZSksXHJcbiAgICAgICAgICAgIHByZWRlZmluZWRUYWJsZTogdGhpcy5pbXBvcnRGaWxlT3B0aW9ucy5wcmVkZWZpbmVkVGFibGUsXHJcbiAgICAgICAgICAgIGNyZWF0ZVRhYmxlQnV0dG9uVGV4dDogJ1JlcGxhY2UgQWxsIFJvd3MnLFxyXG4gICAgICAgICAgICBjcmVhdGVUYWJsZU1vZGVUZXh0OiAnUmVwbGFjZSBSb3dzJyxcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHRoaXMuZmlsZUltcG9ydGVyLm9uKEZpbGVJbXBvcnRlci5UQUJMRV9VUERBVEVEX0VWRU5ULCAoKSA9PiB0aGlzLm9wdGlvbnMub3duZXIucmVmcmVzaCgpKTtcclxuICAgICAgICAgIHRoaXMuZmlsZUltcG9ydGVyLnNob3coKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQ29udGVudFJlYWR5OiAoZSkgPT4ge1xyXG4gICAgICAgICAgZS5lbGVtZW50LmZpbmQoJy5keC1idXR0b24tY29udGVudCcpLmNzcyh7XHJcbiAgICAgICAgICAgIHBhZGRpbmdUb3A6IDUsXHJcbiAgICAgICAgICAgIHBhZGRpbmdCb3R0b206IDVcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlKG1vZGU6IENkbUltcG9ydEZpbGVNb2RlKTogSW1wb3J0RmlsZU1vZGUge1xyXG4gICAgc3dpdGNoIChtb2RlKSB7XHJcbiAgICAgIGNhc2UgQ2RtSW1wb3J0RmlsZU1vZGUuQWRkTmV3Um93czpcclxuICAgICAgICByZXR1cm4gSW1wb3J0RmlsZU1vZGUuQWRkTmV3Um93cztcclxuXHJcbiAgICAgIGNhc2UgQ2RtSW1wb3J0RmlsZU1vZGUuUmVwbGFjZUFsbFJvd3M6XHJcbiAgICAgICAgcmV0dXJuIEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG1vZGUnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlQ3VycmVudERpc3BsYXlUaXRsZShkcm9wZG93bkJveE93bmVyOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3gpOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLWRpc3BsYXlzX19jdXJyZW50LWRpc3BsYXkgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keFRleHRCb3goe1xyXG4gICAgICAgIHZhbHVlOiBkcm9wZG93bkJveE93bmVyLm9wdGlvbigndGV4dCcpIHx8IGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCdwbGFjZWhvbGRlcicpLFxyXG4gICAgICAgIGRpc2FibGVkOiAhdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmN1cnJlbnREaXNwbGF5LFxyXG4gICAgICB9KVxyXG4gICAgICAuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlVmlld0J1dHRvbigpOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHtcclxuICAgIHJldHVybiAkKCc8YnV0dG9uIC8+JylcclxuICAgICAgLmFkZENsYXNzKCdhcHMtZGlzcGxheXNfX3NhdmUtZGlzcGxheSBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICB0ZXh0OiAnU2F2ZScsXHJcbiAgICAgICAgdHlwZTogJ25vcm1hbCcsXHJcbiAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuY3VycmVudERpc3BsYXksXHJcbiAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhR3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ0xvYWRpbmcnKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIudXBkYXRlQ3VycmVudERpc3BsYXkoXHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudERpc3BsYXlUaXRsZS5vcHRpb24oJ3ZhbHVlJyksXHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCxcclxuICAgICAgICAgICAgdGhpcy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBpY29uOiAnc2F2ZScsXHJcbiAgICAgICAgd2lkdGg6IDEyNVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVNhdmVWaWV3QXNCdXR0b24oKTogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB7XHJcbiAgICByZXR1cm4gJCgnPGJ1dHRvbiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLWRpc3BsYXlfX3NhdmUtZGlzcGxheS1hcyBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICB0ZXh0OiAnU2F2ZSBBcycsXHJcbiAgICAgICAgdHlwZTogJ25vcm1hbCcsXHJcbiAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQsXHJcbiAgICAgICAgb25DbGljazogKCkgPT4gKFxyXG4gICAgICAgICAgdGhpcy5jcmVhdGVTYXZlQXNEaWFsb2coKVxyXG4gICAgICAgICksXHJcbiAgICAgICAgaWNvbjogJ3NhdmUnLFxyXG4gICAgICAgIHdpZHRoOiAxNjBcclxuICAgICAgfSlcclxuICAgICAgLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlQXNEaWFsb2coKSB7XHJcbiAgICBjb25zdCAkcG9wdXBDb250ZW50ID0gJCgnPGRpdiAvPicpO1xyXG5cclxuICAgIGNvbnN0IGRpYWxvZ0NvbnRlbnRFbGVtZW50ID0gJCgnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206OHB4O1wiIC8+JykuZHhUZXh0Qm94KHtcclxuICAgICAgcGxhY2Vob2xkZXI6ICdEaXNwbGF5IE5hbWUnLFxyXG4gICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICB9KS5keFZhbGlkYXRvcih7XHJcbiAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgIHsgdHlwZTogJ3JlcXVpcmVkJyB9LFxyXG4gICAgICBdXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IG5hbWVUZXh0Qm94ID0gZGlhbG9nQ29udGVudEVsZW1lbnQuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG4gICAgY29uc3QgdmFsaWRhdG9yID0gZGlhbG9nQ29udGVudEVsZW1lbnQuZHhWYWxpZGF0b3IoJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgbmFtZVRleHRCb3guZWxlbWVudCgpLmFwcGVuZFRvKCRwb3B1cENvbnRlbnQpO1xyXG5cclxuICAgIHJldHVybiBjcmVhdGVEaWFsb2coXHJcbiAgICAgIHtcclxuICAgICAgICB0aXRsZTogJ0NyZWF0ZSBOZXcgRGlzcGxheScsXHJcbiAgICAgICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgICBtYXhXaWR0aDogJzMwMHB4JyxcclxuICAgICAgfSxcclxuICAgICAgJHBvcHVwQ29udGVudCxcclxuICAgICAge1xyXG4gICAgICAgIHRleHQ6ICdPaycsXHJcbiAgICAgICAgb25DbGljazogYXN5bmMgKGNsb3NlUG9wdXApID0+IHtcclxuICAgICAgICAgIGlmICghdmFsaWRhdG9yLnZhbGlkYXRlKCkuaXNWYWxpZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5kYXRhR3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ0xvYWRpbmcnKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuY3JlYXRlTmV3RGlzcGxheShcclxuICAgICAgICAgICAgbmFtZVRleHRCb3gub3B0aW9uKCd2YWx1ZScpLFxyXG4gICAgICAgICAgICB0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQsXHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIGNsb3NlUG9wdXAoKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdGV4dDogJ0NhbmNlbCcsXHJcbiAgICAgICAgb25DbGljazogKGNsb3NlUG9wdXApID0+IGNsb3NlUG9wdXAoKVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY29uZmlybUNoYW5nZXNMb3NzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oXHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgICdZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMgdGhhdCB3aWxsIGJlIGxvc3QgaWYgeW91IGNsb3NlIHRoaXMgcG9wdXAuIERvIHlvdSB3YW50IHRvIGNsb3NlIHRoZSBwb3B1cCBhbmQgbm90IHNhdmUgY2hhbmdlcz8nLFxyXG4gICAgICAnVW5zYXZlZCBjaGFuZ2VzJ1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGRpc3BsYXlzVG9vbGJhckl0ZW0oKSB7XHJcbiAgICBpZiAoIXRoaXMuX2Rpc3BsYXlzVG9vbGJhckl0ZW0pIHtcclxuICAgICAgdGhpcy5fZGlzcGxheXNUb29sYmFySXRlbSA9IHRoaXMuY3JlYXRlRGlzcGxheXNUb29sYmFySXRlbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9kaXNwbGF5c1Rvb2xiYXJJdGVtO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgaW1wb3J0RmlsZVRvb2xiYXJJdGVtKCkge1xyXG4gICAgaWYgKCF0aGlzLl9pbXBvcnRGaWxlVG9vbGJhckl0ZW0pIHtcclxuICAgICAgdGhpcy5faW1wb3J0RmlsZVRvb2xiYXJJdGVtID0gdGhpcy5jcmVhdGVJbXBvcnRGaWxlVG9vbGJhckl0ZW0oKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5faW1wb3J0RmlsZVRvb2xiYXJJdGVtO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uIGZyb20gJy4uLy4uLy4uL0RhdGEvTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24nO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XHJcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIGRlbGV0ZURhdGFVcmw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXkge1xyXG4gIHJlYWRvbmx5IElkOiBudW1iZXI7XHJcbiAgcmVhZG9ubHkgTmFtZTogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IEZpbHRlcklkOiBudW1iZXI7XHJcbiAgcmVhZG9ubHkgVmlld0lkOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkRGlzcGxheXNNYW5hZ2VyIHtcclxuICBwcml2YXRlIGRpc3BsYXlzOiBJQ29udHJvbERpc3BsYXlbXSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50SGFuZGxlcnM6IHtcclxuICAgIGNoYW5nZWQ6IEFycmF5PChkaXNwbGF5OiBJQ29udHJvbERpc3BsYXkpID0+IHZvaWQ+LFxyXG4gICAgbG9hZGVkOiBBcnJheTwoZGlzcGxhaXM6IElDb250cm9sRGlzcGxheVtdKSA9PiB2b2lkPlxyXG4gIH07XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfY3VycmVudERpc3BsYXlJZDogbnVtYmVyID0gMDtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zZXJ0RGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJR3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnMpIHtcclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy5pbnNlcnREYXRhVXJsID0gb3B0aW9ucy5pbnNlcnREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gICAgdGhpcy5kZWxldGVEYXRhVXJsID0gb3B0aW9ucy5kZWxldGVEYXRhVXJsO1xyXG5cclxuICAgIHRoaXMuZXZlbnRIYW5kbGVycyA9IHtcclxuICAgICAgY2hhbmdlZDogW10sXHJcbiAgICAgIGxvYWRlZDogW11cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgbG9hZERpc3BsYXlzKCkge1xyXG4gICAgdGhpcy5kaXNwbGF5cyA9IGF3YWl0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uPElDb250cm9sRGlzcGxheVtdPih0aGlzLmxvYWREYXRhVXJsKTtcclxuICAgIHRoaXMub25EaXNwbGFpc0xvYWRlZFByaXZhdGUoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXREaXNwbGF5cygpIHtcclxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlzIHx8IGF3YWl0IHRoaXMubG9hZERpc3BsYXlzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGlzcGxheUJ5SWQgPSAoaWQ6IG51bWJlcikgPT4ge1xyXG4gICAgaWYgKCFpZCB8fCAhdGhpcy5kaXNwbGF5cykge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5cy5maW5kKCh2KSA9PiB2LklkID09PSBpZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgY3JlYXRlTmV3RGlzcGxheShuYW1lOiBzdHJpbmcsIGZpbHRlcklkOiBudW1iZXIsIHZpZXdJZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBuZXdWaWV3RHRvID0ge1xyXG4gICAgICBJZDogMCxcclxuICAgICAgTmFtZTogbmFtZSxcclxuICAgICAgRmlsdGVySWQ6IGZpbHRlcklkLFxyXG4gICAgICBWaWV3SWQ6IHZpZXdJZFxyXG4gICAgfTtcclxuXHJcbiAgICBhd2FpdCBzZW5kUmVxdWVzdCh0aGlzLmluc2VydERhdGFVcmwsICdQT1NUJywgbmV3Vmlld0R0byk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWREaXNwbGF5cygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGRlbGV0ZURpc3BsYXkoaWQ6IG51bWJlcikge1xyXG4gICAgYXdhaXQgc2VuZFJlcXVlc3QodGhpcy5kZWxldGVEYXRhVXJsLCAnREVMRVRFJywgeyBpZCB9KTtcclxuICAgIGF3YWl0IHRoaXMubG9hZERpc3BsYXlzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQ3VycmVudERpc3BsYXkobmFtZTogc3RyaW5nLCBmaWx0ZXJJZDogbnVtYmVyLCB2aWV3SWQ6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMudXBkYXRlRGlzcGxheSh0aGlzLmN1cnJlbnREaXNwbGF5LklkLCBuYW1lLCBmaWx0ZXJJZCwgdmlld0lkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVEaXNwbGF5KGlkOiBudW1iZXIsIG5hbWU6IHN0cmluZywgZmlsdGVySWQ6IG51bWJlciwgdmlld0lkOiBudW1iZXIpIHtcclxuICAgIGF3YWl0IHNlbmRSZXF1ZXN0KHRoaXMudXBkYXRlRGF0YVVybCwgJ1BVVCcsIHtcclxuICAgICAgaWQsIG5hbWUsIGZpbHRlcklkLCB2aWV3SWRcclxuICAgIH0pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRGlzcGxheXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25EaXNwbGF5Q2hhbmdlZFByaXZhdGUoKSB7XHJcbiAgICB0aGlzLmV2ZW50SGFuZGxlcnMuY2hhbmdlZC5mb3JFYWNoKChoYW5kbGVycykgPT4gKFxyXG4gICAgICBoYW5kbGVycyh0aGlzLmN1cnJlbnREaXNwbGF5KVxyXG4gICAgKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uRGlzcGxhaXNMb2FkZWRQcml2YXRlKCkge1xyXG4gICAgdGhpcy5ldmVudEhhbmRsZXJzLmxvYWRlZC5mb3JFYWNoKChoYW5kbGVycykgPT4gKFxyXG4gICAgICBoYW5kbGVycyh0aGlzLmRpc3BsYXlzKVxyXG4gICAgKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnREaXNwbGF5SWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudERpc3BsYXlJZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgY3VycmVudERpc3BsYXlJZChpZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9jdXJyZW50RGlzcGxheUlkID0gaWQ7XHJcbiAgICB0aGlzLm9uRGlzcGxheUNoYW5nZWRQcml2YXRlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnREaXNwbGF5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RGlzcGxheUJ5SWQodGhpcy5fY3VycmVudERpc3BsYXlJZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IG9uRGlzcGxheUNoYW5nZWQoaGFuZGxlcjogKGRpc3BsYXk6IElDb250cm9sRGlzcGxheSkgPT4gdm9pZCkge1xyXG4gICAgdGhpcy5ldmVudEhhbmRsZXJzLmNoYW5nZWQucHVzaChoYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgb25EaXNwbGFpc0xvYWRlZChoYW5kbGVyOiAoZGlzcGxhaXM6IElDb250cm9sRGlzcGxheVtdKSA9PiB2b2lkKSB7XHJcbiAgICB0aGlzLmV2ZW50SGFuZGxlcnMubG9hZGVkLnB1c2goaGFuZGxlcik7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBNdXRhYmxlIH0gZnJvbSAnLi4vLi4vLi4vQ29tcG9uZW50cy9Db3JlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luT3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgb3duZXI6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICByZWFkb25seSBhdXRvSW50ZWdyYXRpb246IGJvb2xlYW47XHJcbn1cclxuXHJcbmludGVyZmFjZSBJTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5EZWZhdWx0T3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgYXV0b0ludGVncmF0aW9uOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbk9wdGlvbnMgPVxyXG4gIE11dGFibGU8T21pdDxJTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5PcHRpb25zLCBrZXlvZiBJTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5EZWZhdWx0T3B0aW9ucz4+ICZcclxuICBNdXRhYmxlPFBhcnRpYWw8SU11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luRGVmYXVsdE9wdGlvbnM+PjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbiB7XHJcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IElNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbk9wdGlvbnM7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luT3B0aW9ucykge1xyXG4gICAgdGhpcy5vcHRpb25zID0ge1xyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgICBhdXRvSW50ZWdyYXRpb246IChvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuYXV0b0ludGVncmF0aW9uICE9PSBudWxsKVxyXG4gICAgICAgID8gb3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gOiB0cnVlXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMub3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gJiYgdGhpcy5pbnRlZ3JhdGVUb0dyaWQodGhpcy5vcHRpb25zLm93bmVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW50ZWdyYXRlVG9HcmlkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gICAgZ3JpZC5vcHRpb24oJ3NlbGVjdGlvbicsIHtcclxuICAgICAgbW9kZTogJ211bHRpcGxlJ1xyXG4gICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydzZWxlY3Rpb24nXSk7XHJcbiAgICBncmlkLm9uKCdlZGl0b3JQcmVwYXJpbmcnLCB0aGlzLm9uR3JpZEVkaXRvclByZXBhcmluZyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9uR3JpZEVkaXRvclByZXBhcmluZzogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snb25FZGl0b3JQcmVwYXJpbmcnXSA9IChlKSA9PiB7XHJcbiAgICBpZiAoIWUuY29tcG9uZW50IHx8ICFlLmVkaXRvck9wdGlvbnMgfHwgZS5wYXJlbnRUeXBlICE9PSAnZGF0YVJvdycgfHwgIWUuZGF0YUZpZWxkIHx8ICFlLnJvdyB8fCAhZS5yb3cua2V5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkYXRhRmllbGQgPSBlLmRhdGFGaWVsZDtcclxuICAgIGNvbnN0IGVkaXRvcktleSA9IGUucm93LmtleTtcclxuICAgIGNvbnN0IGRlZmF1bHRMaXN0ZW5lciA9IGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZDtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tc2hhZG93ZWQtdmFyaWFibGVcclxuICAgIGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZCA9IChldmVudDogeyB2YWx1ZTogYW55IH0pID0+IHtcclxuICAgICAgZGVmYXVsdExpc3RlbmVyKGV2ZW50KTtcclxuXHJcbiAgICAgIHRoaXMudXBkYXRlTXVsdGlwbGVSb3dzKGRhdGFGaWVsZCwgZWRpdG9yS2V5LCBldmVudC52YWx1ZSk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVNdWx0aXBsZVJvd3M8VD4oZGF0YUZpZWxkOiBzdHJpbmcsIGVkaXRvcktleTogc3RyaW5nLCB2YWx1ZTogVCkge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRSb3dLZXlzOiBzdHJpbmdbXSA9IGF3YWl0IHRoaXMub3B0aW9ucy5vd25lci5nZXRTZWxlY3RlZFJvd0tleXMoKTtcclxuICAgIGlmICghc2VsZWN0ZWRSb3dLZXlzLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZWRpdG9yS2V5U2VsZWN0ZWRJbmRleCA9IHNlbGVjdGVkUm93S2V5cy5maW5kSW5kZXgoKGspID0+IGsgPT09IGVkaXRvcktleSk7XHJcbiAgICBpZiAoZWRpdG9yS2V5U2VsZWN0ZWRJbmRleCA8IDAgfHwgc2VsZWN0ZWRSb3dLZXlzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0ZWRSb3dLZXlzLnNwbGljZShlZGl0b3JLZXlTZWxlY3RlZEluZGV4LCAxKTtcclxuICAgIHNlbGVjdGVkUm93S2V5cy5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgdGhpcy5vcHRpb25zLm93bmVyLmNlbGxWYWx1ZSh0aGlzLm9wdGlvbnMub3duZXIuZ2V0Um93SW5kZXhCeUtleShrZXkpLCBkYXRhRmllbGQsIHZhbHVlKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgR3JpZFZpZXdzTWFuYWdlciB9IGZyb20gJy4vR3JpZFZpZXdzTWFuYWdlcic7XHJcbmltcG9ydCB7IE11dGFibGUgfSBmcm9tICcuLi8uLi8uLi9Db21wb25lbnRzL0NvcmUnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbiBmcm9tICcuLi8uLi8uLi9EYXRhL0xvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzIHtcclxuICByZWFkb25seSBkZWZhdWx0RmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICByZWFkb25seSBkZWZhdWx0Vmlld0lkOiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG8ge1xyXG4gIERlZmF1bHRGaWx0ZXJJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIERlZmF1bHRWaWV3SWQ6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgdXNlcklkOiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgbG9hZGVkVXNlclNldHRpbmdzPzogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzO1xyXG59XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWVtcHR5LWludGVyZmFjZVxyXG5pbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckRlZmF1bHRPcHRpb25zIHtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgQVBTQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucyA9XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICBNdXRhYmxlPE9taXQ8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnMsIGtleW9mIElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJEZWZhdWx0T3B0aW9ucz4+ICZcclxuICBNdXRhYmxlPFBhcnRpYWw8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckRlZmF1bHRPcHRpb25zPj47XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyIHtcclxuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnM7XHJcblxyXG4gIHB1YmxpYyByZWFkb25seSBkZWZhdWx0VXNlclNldHRpbmdzOiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3MgPSB7XHJcbiAgICBkZWZhdWx0RmlsdGVySWQ6IHVuZGVmaW5lZCxcclxuICAgIGRlZmF1bHRWaWV3SWQ6IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZFxyXG4gIH07XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXHJcbiAgcHJvdGVjdGVkIF9sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3M6IElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGlzTGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzRXhwaXJlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBhdXRvUmVzZXR0aW5nQ2FjaGVUaW1lcklkOiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEFQU0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnMpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IHtcclxuICAgICAgLi4ub3B0aW9ucyxcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sb2FkZWRVc2VyU2V0dGluZ3MpIHtcclxuICAgICAgdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3MgPSB0aGlzLm9wdGlvbnMubG9hZGVkVXNlclNldHRpbmdzO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3RhcnRBdXRvQ2FjaGVSZXNldHRpbmdUaW1lcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBsYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3MoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fbGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBsYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3ModmFsdWU6IElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncykge1xyXG4gICAgdGhpcy5fbGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzID0gdmFsdWU7XHJcbiAgICB0aGlzLmlzTGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzRXhwaXJlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFVzZXJTZXR0aW5ncygpOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4ge1xyXG4gICAgaWYgKCF0aGlzLmlzTGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzRXhwaXJlZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3M7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmxvYWRVc2VyU2V0dGluZ3MoKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVVc2VyU2V0dGluZ3ModXBkYXRlczogUGFydGlhbDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+KTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMubGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzID0gYXdhaXQgdGhpcy51cGRhdGVVc2VyU2V0dGluZ3NJbnRlcm5hbCh1cGRhdGVzKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgbG9hZFVzZXJTZXR0aW5ncygpOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz47XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgdXBkYXRlVXNlclNldHRpbmdzSW50ZXJuYWwodXBkYXRlczogUGFydGlhbDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+KTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+O1xyXG5cclxuICBwcm90ZWN0ZWQgc3RhcnRBdXRvQ2FjaGVSZXNldHRpbmdUaW1lcigpIHtcclxuICAgIHRoaXMuYXV0b1Jlc2V0dGluZ0NhY2hlVGltZXJJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNMYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3NFeHBpcmVkID0gdHJ1ZTtcclxuICAgIH0sIDUwMDApO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHN0b3BBdXRvQ2FjaGVSZXNldHRpbmdUaW1lcigpIHtcclxuICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuYXV0b1Jlc2V0dGluZ0NhY2hlVGltZXJJZCk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTG9jYWxDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIgZXh0ZW5kcyBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIge1xyXG4gIHByb3RlY3RlZCBzdGF0aWMgcmVhZG9ubHkgdXNlclNldHRpbmdzU3RvcmFnZUtleSA9ICdhcHM6Y29udHJvbC1kaXNwbGF5OnVzZXItc2V0dGluZ3MnO1xyXG5cclxuICBwcm90ZWN0ZWQgYXN5bmMgbG9hZFVzZXJTZXR0aW5ncygpOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4ge1xyXG4gICAgY29uc3QgcmF3VXNlclNldHRpbmdzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oTG9jYWxDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIudXNlclNldHRpbmdzU3RvcmFnZUtleSk7XHJcbiAgICBpZiAoIXJhd1VzZXJTZXR0aW5ncykge1xyXG4gICAgICByZXR1cm4gdGhpcy5kZWZhdWx0VXNlclNldHRpbmdzO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHVzZXJTZXR0aW5nczogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzID0gSlNPTi5wYXJzZShyYXdVc2VyU2V0dGluZ3MpO1xyXG5cclxuICAgIHJldHVybiB1c2VyU2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHByb3RlY3RlZCBhc3luYyB1cGRhdGVVc2VyU2V0dGluZ3NJbnRlcm5hbCh1cGRhdGVzOiBQYXJ0aWFsPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4pOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4ge1xyXG4gICAgY29uc3QgY3VycmVudFVzZXJTZXR0aW5ncyA9IGF3YWl0IHRoaXMuZ2V0VXNlclNldHRpbmdzKCk7XHJcbiAgICBjb25zdCB1cGRhdGVkVXNlclNldHRpbmdzID0geyAuLi5jdXJyZW50VXNlclNldHRpbmdzLCAuLi51cGRhdGVzIH07XHJcblxyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTG9jYWxDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIudXNlclNldHRpbmdzU3RvcmFnZUtleSxcclxuICAgICAgSlNPTi5zdHJpbmdpZnkodXBkYXRlZFVzZXJTZXR0aW5ncykpO1xyXG5cclxuICAgIHJldHVybiB1cGRhdGVkVXNlclNldHRpbmdzO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnMge1xyXG4gIGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucyA9XHJcbiAgSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnMgJiBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnM7XHJcblxyXG5leHBvcnQgY2xhc3MgUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyIGV4dGVuZHMgQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJPcHRpb25zKSB7XHJcbiAgICBzdXBlcihvcHRpb25zKTtcclxuXHJcbiAgICB0aGlzLmxvYWREYXRhVXJsID0gb3B0aW9ucy5sb2FkRGF0YVVybDtcclxuICAgIHRoaXMudXBkYXRlRGF0YVVybCA9IG9wdGlvbnMudXBkYXRlRGF0YVVybDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhc3luYyBsb2FkVXNlclNldHRpbmdzKCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPiB7XHJcbiAgICBjb25zdCB1c2VyU2V0dGluZ3NEdG8gPSBhd2FpdCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbjxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG8+KHRoaXMubG9hZERhdGFVcmwpO1xyXG5cclxuICAgIHJldHVybiB1c2VyU2V0dGluZ3NEdG8gPyB0aGlzLm1hcENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzRHRvVG9Nb2RlbCh1c2VyU2V0dGluZ3NEdG8pIDogdGhpcy5kZWZhdWx0VXNlclNldHRpbmdzO1xyXG4gIH1cclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlVXNlclNldHRpbmdzSW50ZXJuYWwodXBkYXRlczogUGFydGlhbDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+KTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+IHtcclxuICAgIGNvbnN0IGN1cnJlbnRVc2VyU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmdldFVzZXJTZXR0aW5ncygpO1xyXG4gICAgY29uc3QgdXBkYXRlZFVzZXJTZXR0aW5ncyA9IHsgLi4uY3VycmVudFVzZXJTZXR0aW5ncywgLi4udXBkYXRlcyB9O1xyXG5cclxuICAgIGNvbnN0IHVwZGF0ZWRVc2VyU2V0dGluZ3NEdG8gPSBhd2FpdCBzZW5kUmVxdWVzdDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG8+KFxyXG4gICAgICB0aGlzLnVwZGF0ZURhdGFVcmwsICdQVVQnLFxyXG4gICAgICB0aGlzLm1hcENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTW9kZWxUb0R0byh1cGRhdGVkVXNlclNldHRpbmdzKVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5tYXBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc0R0b1RvTW9kZWwodXBkYXRlZFVzZXJTZXR0aW5nc0R0byk7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHByaXZhdGUgbWFwQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNb2RlbFRvRHRvKG1vZGVsOiBQYXJ0aWFsPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4pOiBQYXJ0aWFsPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc0R0bz4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgRGVmYXVsdEZpbHRlcklkOiBtb2RlbC5kZWZhdWx0RmlsdGVySWQsXHJcbiAgICAgIERlZmF1bHRWaWV3SWQ6IG1vZGVsLmRlZmF1bHRWaWV3SWRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHByaXZhdGUgbWFwQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG9Ub01vZGVsKGR0bzogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzRHRvKTogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGRlZmF1bHRGaWx0ZXJJZDogZHRvLkRlZmF1bHRGaWx0ZXJJZCxcclxuICAgICAgZGVmYXVsdFZpZXdJZDogZHRvLkRlZmF1bHRWaWV3SWRcclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZleHBvcnQgZnVuY3Rpb24gZ2V0U3VtbWFyeUNvbHVtbihjb2x1bW5zOiBBcnJheTx7IHZpc2libGVJbmRleDogbnVtYmVyLCB2aXNpYmxlOiBib29sZWFuLCBkYXRhRmllbGQ6IHN0cmluZyB9PiB8XHJcbiAgUmVhZG9ubHlBcnJheTxQaWNrPERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbiwgJ3Zpc2libGVJbmRleCcgfCAndmlzaWJsZScgfCAnZGF0YUZpZWxkJz4+KSB7XHJcbiAgbGV0IGNvbHVtbkZvclN1bW1hcnkgPSAnJztcclxuXHJcbiAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcigoYykgPT4gYy52aXNpYmxlKTtcclxuICBjb25zdCBjb2x1bW5zV2l0aEluZGV4ID0gdmlzaWJsZUNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLnZpc2libGVJbmRleCAhPT0gbnVsbCAmJiBjLnZpc2libGVJbmRleCAhPT0gdm9pZCAwKTtcclxuXHJcbiAgaWYgKCEhY29sdW1uc1dpdGhJbmRleC5sZW5ndGgpIHtcclxuICAgIGNvbHVtbkZvclN1bW1hcnkgPSBjb2x1bW5zV2l0aEluZGV4LnNvcnQoKGEsIGIpID0+IGEudmlzaWJsZUluZGV4IC0gYi52aXNpYmxlSW5kZXgpWzBdLmRhdGFGaWVsZDtcclxuICB9IGVsc2Uge1xyXG4gICAgY29sdW1uRm9yU3VtbWFyeSA9ICh2aXNpYmxlQ29sdW1uc1swXSAmJiB2aXNpYmxlQ29sdW1uc1swXS5kYXRhRmllbGQpIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNvbHVtbkZvclN1bW1hcnk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQgfSBmcm9tICcuL0dyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQnO1xyXG5pbXBvcnQgeyBHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQgfSBmcm9tICcuL0dyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQsIElGaWxlSW1wb3J0ZXJPcHRpb25zIH0gZnJvbSAnLi9HcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50JztcclxuaW1wb3J0IHsgR3JpZERpc3BsYXlzTWFuYWdlciwgSUdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zIH0gZnJvbSAnLi9HcmlkRGlzcGxheXNNYW5hZ2VyJztcclxuaW1wb3J0IHsgR3JpZFZpZXdzTWFuYWdlciwgSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zIH0gZnJvbSAnLi9HcmlkVmlld3NNYW5hZ2VyJztcclxuaW1wb3J0IHsgR3JpZEZpbHRlcnNNYW5hZ2VyLCBJR3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucyB9IGZyb20gJy4vR3JpZEZpbHRlcnNNYW5hZ2VyJztcclxuaW1wb3J0IHsgTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4gfSBmcm9tICcuL011bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luJztcclxuaW1wb3J0IHsgSVJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zLCBSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIgfSBmcm9tICcuL0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlcic7XHJcbmltcG9ydCB7IERpc3BsYXlUeXBlLCBJRGlzcGxheVR5cGVTZXR0aW5ncywgSUljb25zQ29sdW1uRWRpdG9ySXRlbSB9IGZyb20gJy4vQ29udHJvbENvbmZpZ3VyYXRvcic7XHJcbmltcG9ydCB7IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSwgSUdyaWRBZGRpdGlvbmFsT3B0aW9ucyB9IGZyb20gJy4uL0dyaWQvQ3JlYXRlRGVmYXVsdEdyaWQnO1xyXG5pbXBvcnQgY3JlYXRlRGVmYXVsdEdyaWQgZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkJztcclxuaW1wb3J0IHsgY3JlYXRlRHhEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9EeERhdGFTb3VyY2UnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IGdldFN1bW1hcnlDb2x1bW4gfSBmcm9tICcuL0dyaWRTdW1tYXJ5SGVscGVyJztcclxuaW1wb3J0IHsgQ2RtSW1wb3J0RmlsZU1vZGUgfSBmcm9tICcuLi8uLi9CdXNpbmVzcyc7XHJcblxyXG5pbnRlcmZhY2UgSUFQU0NvbnRyb2xGaWVsZENvbmZpZ3VyYXRpb24ge1xyXG4gIFBlcm1pc3Npb25zOiBDb250cm9sUm9sZVBlcm1pc3Npb25zO1xyXG4gIE5hbWU6IHN0cmluZztcclxuICBUeXBlOiAnc3RyaW5nJyB8ICdudW1iZXInIHwgJ2Jvb2xlYW4nIHwgJ29iamVjdCcgfCAnZGF0ZScgfCAnZGF0ZXRpbWUnO1xyXG4gIExhYmVsOiBzdHJpbmc7XHJcbiAgT3JkZXI6IG51bWJlcjtcclxuICBUb29sVGlwOiBzdHJpbmc7XHJcbiAgSXNEZWZhdWx0Vmlld0ZpZWxkOiBib29sZWFuO1xyXG4gIElzS2V5Q29sdW1uOiBib29sZWFuO1xyXG4gIEdyb3VwRmllbGQ6IHN0cmluZztcclxuICBEaXNwbGF5VHlwZTogc3RyaW5nO1xyXG4gIFdpZHRoPzogbnVtYmVyO1xyXG4gIEhpZGluZ09yZGVyPzogbnVtYmVyO1xyXG4gIENvbHVtbnM/OiBJQVBTQ29udHJvbEZpZWxkQ29uZmlndXJhdGlvbltdO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSVVzZXJDb25maWd1cmF0aW9uUmVzcG9uc2Uge1xyXG4gIEZpZWxkc0NvbmZpZ3VyYXRpb246IElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uW107XHJcbiAgQ2FuQ3JlYXRlR2xvYmFsVmlld3M6IGJvb2xlYW47XHJcbiAgQ2FuQ3JlYXRlR2xvYmFsRmlsdGVyczogYm9vbGVhbjtcclxuICBDYW5DcmVhdGVGaWx0ZXJzOiBib29sZWFuO1xyXG4gIENhbkNyZWF0ZVZpZXdzOiBib29sZWFuO1xyXG4gIENhbkNyZWF0ZURpc3BsYXlzOiBib29sZWFuO1xyXG4gIENhbkFwcGxheURpc3BsYXlzOiBib29sZWFuO1xyXG59XHJcblxyXG4vKiBlc2xpbnQgbm8tYml0d2lzZTogb2ZmICovXHJcbi8qIHRzbGludDpkaXNhYmxlOiBuby1iaXR3aXNlICovXHJcbmNvbnN0IGVudW0gQ29udHJvbFJvbGVQZXJtaXNzaW9ucyB7XHJcbiAgTm9uZSA9IDAsXHJcbiAgUmVhZCA9IDEgPDwgMCxcclxuICBDcmVhdGUgPSAxIDw8IDEsXHJcbiAgVXBkYXRlID0gMSA8PCAyLFxyXG4gIERlbGV0ZSA9IDEgPDwgMyxcclxufVxyXG4vKiB0c2xpbnQ6ZW5hYmxlOiBuby1iaXR3aXNlICovXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb250cm9sRGlzcGxheU9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICBpc1N0YW5kYWxvbmVQYWdlOiBib29sZWFuO1xyXG4gIHBhZ2VUaXRsZTogc3RyaW5nO1xyXG4gIGV4cG9ydEZpbGVOYW1lOiBzdHJpbmc7XHJcbiAgdXNlck5hbWU6IHN0cmluZztcclxuICB1c2VyQ29uZmlnVXJsOiBzdHJpbmc7XHJcbiAgY29udHJvbExvZ3NVcmw6IHN0cmluZztcclxuICBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zOiBJR3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucztcclxuICBncmlkVmlld3NNYW5hZ2VyT3B0aW9uczogSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zO1xyXG4gIGdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zOiBJR3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnM7XHJcbiAgcmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnM6IElSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9ucztcclxuICBpbXBvcnRGaWxlT3B0aW9ucz86IElGaWxlSW1wb3J0ZXJPcHRpb25zO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ29udHJvbERpc3BsYXkge1xyXG4gIHB1YmxpYyByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNTdGFuZGFsb25lUGFnZTogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IHBhZ2VUaXRsZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZXhwb3J0RmlsZU5hbWU6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VyQ29uZmlnVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb250cm9sTG9nc1VybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnM6IElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnM6IElHcmlkVmlld3NNYW5hZ2VyT3B0aW9ucztcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zOiBJR3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9uczogSVJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW1wb3J0RmlsZU9wdGlvbnM6IElGaWxlSW1wb3J0ZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIG1haW5HcmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgZ3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudDogR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBncmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQ6IEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBncmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50OiBHcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIG11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luOiBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUNvbnRyb2xEaXNwbGF5T3B0aW9ucykge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy5pc1N0YW5kYWxvbmVQYWdlID0gb3B0aW9ucy5pc1N0YW5kYWxvbmVQYWdlO1xyXG4gICAgdGhpcy5wYWdlVGl0bGUgPSBvcHRpb25zLnBhZ2VUaXRsZTtcclxuICAgIHRoaXMuZXhwb3J0RmlsZU5hbWUgPSBvcHRpb25zLmV4cG9ydEZpbGVOYW1lO1xyXG4gICAgdGhpcy51c2VyTmFtZSA9IG9wdGlvbnMudXNlck5hbWU7XHJcbiAgICB0aGlzLnVzZXJDb25maWdVcmwgPSBvcHRpb25zLnVzZXJDb25maWdVcmw7XHJcbiAgICB0aGlzLmNvbnRyb2xMb2dzVXJsID0gb3B0aW9ucy5jb250cm9sTG9nc1VybDtcclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gICAgdGhpcy5ncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zID0gb3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zO1xyXG4gICAgdGhpcy5ncmlkVmlld3NNYW5hZ2VyT3B0aW9ucyA9IG9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnM7XHJcbiAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zID0gb3B0aW9ucy5ncmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucztcclxuICAgIHRoaXMucmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnMgPSBvcHRpb25zLnJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zO1xyXG4gICAgdGhpcy5pbXBvcnRGaWxlT3B0aW9ucyA9IG9wdGlvbnMuaW1wb3J0RmlsZU9wdGlvbnM7XHJcblxyXG4gICAgdGhpcy4kY29udGFpbmVyLmFkZENsYXNzKFsnYXBzLWdyaWQnLCAnY29udHJvbC1kaXNwbGF5LWdyaWQnXSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgc2VuZFJlcXVlc3Q8SVVzZXJDb25maWd1cmF0aW9uUmVzcG9uc2U+KHRoaXMudXNlckNvbmZpZ1VybClcclxuICAgICAgLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGdyaWRGaWx0ZXJzTWFuYWdlciA9IG5ldyBHcmlkRmlsdGVyc01hbmFnZXIodGhpcy5ncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zKTtcclxuICAgICAgICBjb25zdCBncmlkVmlld3NNYW5hZ2VyID0gbmV3IEdyaWRWaWV3c01hbmFnZXIodGhpcy5ncmlkVmlld3NNYW5hZ2VyT3B0aW9ucyk7XHJcbiAgICAgICAgY29uc3QgZ3JpZERpc3BsYXlzTWFuYWdlciA9IG5ldyBHcmlkRGlzcGxheXNNYW5hZ2VyKHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnMpO1xyXG5cclxuICAgICAgICB0aGlzLm1haW5HcmlkID0gdGhpcy5jcmVhdGVNYWluR3JpZChyZXMuRmllbGRzQ29uZmlndXJhdGlvbik7XHJcblxyXG4gICAgICAgIGNvbnN0IGNhbkNyZWF0ZURpc3BsYXlzID0gcmVzLkNhbkNyZWF0ZURpc3BsYXlzICYmIHJlcy5DYW5DcmVhdGVWaWV3cyAmJiByZXMuQ2FuQ3JlYXRlRmlsdGVycztcclxuXHJcbiAgICAgICAgaWYgKGNhbkNyZWF0ZURpc3BsYXlzIHx8IHJlcy5DYW5BcHBsYXlEaXNwbGF5cykge1xyXG4gICAgICAgICAgdGhpcy5ncmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50ID0gbmV3IEdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQoe1xyXG4gICAgICAgICAgICBvd25lcjogdGhpcy5tYWluR3JpZCxcclxuICAgICAgICAgICAgZWRpdE1vZGU6IGNhbkNyZWF0ZURpc3BsYXlzLFxyXG4gICAgICAgICAgICBncmlkRmlsdGVyc01hbmFnZXIsXHJcbiAgICAgICAgICAgIGdyaWRWaWV3c01hbmFnZXIsXHJcbiAgICAgICAgICAgIGdyaWREaXNwbGF5c01hbmFnZXIsXHJcbiAgICAgICAgICAgIGltcG9ydEZpbGVPcHRpb25zOiB0aGlzLmltcG9ydEZpbGVPcHRpb25zXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZ3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudCA9IG5ldyBHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50KHtcclxuICAgICAgICAgIG93bmVyOiB0aGlzLm1haW5HcmlkLFxyXG4gICAgICAgICAgb25WaWV3QXBwbGllZDogdGhpcy5vblZpZXdBcHBsaWVkLFxyXG4gICAgICAgICAgb25WaWV3RGVsZXRlZDogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCBncmlkRGlzcGxheXNNYW5hZ2VyLmxvYWREaXNwbGF5cygpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGF1dG9JbnRlZ3JhdGlvbjogdHJ1ZSxcclxuICAgICAgICAgIGdyaWRWaWV3c01hbmFnZXIsXHJcbiAgICAgICAgICBjYW5DcmVhdGVHbG9iYWxWaWV3czogcmVzLkNhbkNyZWF0ZUdsb2JhbFZpZXdzLFxyXG4gICAgICAgICAgdmlzaWJsZTogcmVzLkNhbkNyZWF0ZVZpZXdzXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZ3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50ID0gbmV3IEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudCh7XHJcbiAgICAgICAgICBhcHNDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXI6IG5ldyBSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIoe1xyXG4gICAgICAgICAgICB1c2VySWQ6IHRoaXMudXNlck5hbWUsXHJcbiAgICAgICAgICAgIGxvYWREYXRhVXJsOiB0aGlzLnJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zLmxvYWREYXRhVXJsLFxyXG4gICAgICAgICAgICB1cGRhdGVEYXRhVXJsOiB0aGlzLnJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zLnVwZGF0ZURhdGFVcmxcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgb3duZXI6IHRoaXMubWFpbkdyaWQsXHJcbiAgICAgICAgICBvbkZpbHRlckRlbGV0ZWQ6IGFzeW5jIChmaWx0ZXJJZCkgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCBncmlkRGlzcGxheXNNYW5hZ2VyLmxvYWREaXNwbGF5cygpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGF1dG9JbnRlZ3JhdGlvbjogdHJ1ZSxcclxuICAgICAgICAgIGdyaWRGaWx0ZXJzTWFuYWdlcixcclxuICAgICAgICAgIGNhbkNyZWF0ZUdsb2JhbEZpbHRlcnM6IHJlcy5DYW5DcmVhdGVHbG9iYWxGaWx0ZXJzLFxyXG4gICAgICAgICAgdmlzaWJsZTogcmVzLkNhbkNyZWF0ZUZpbHRlcnNcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5tdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbiA9IG5ldyBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbih7XHJcbiAgICAgICAgICBvd25lcjogdGhpcy5tYWluR3JpZFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBncmlkRGlzcGxheXNNYW5hZ2VyLm9uRGlzcGxheUNoYW5nZWQgPSBhc3luYyAoZGlzcGxheSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGRpc3BsYXkpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5ncmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQuYXBwbHlGaWx0ZXIoZGlzcGxheS5GaWx0ZXJJZCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudC5hcHBseVZpZXcoZGlzcGxheS5WaWV3SWQpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5ncmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQuYXBwbHlGaWx0ZXIodm9pZCAwLCB0cnVlKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5ncmlkVmlld3NUb29sYmFyQ29tcG9uZW50LmFwcGx5VmlldyhHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyogdHNsaW50OmRpc2FibGU6IG5vLWJpdHdpc2UgKi9cclxuICBwcml2YXRlIGhhc1Blcm1pc3NvbihydWxlcywgcGVybWlzc29uKSB7XHJcbiAgICByZXR1cm4gcnVsZXMgJiBwZXJtaXNzb247XHJcbiAgfVxyXG4gIC8qIHRzbGludDplbmFibGU6IG5vLWJpdHdpc2UgKi9cclxuXHJcbiAgcHJpdmF0ZSBidWlsZFRyZWUoY29sdW1ucykge1xyXG4gICAgY29uc3QgZ3JvdXBQcmVmaXggPSAnX19HUk9VUF9fJztcclxuXHJcbiAgICBsZXQgY29sdW1uc01hcCA9IGNvbHVtbnMucmVkdWNlKChhY2MsIGNvbHVtbikgPT4ge1xyXG4gICAgICBjb2x1bW4uQ29sdW1ucyA9IFtdO1xyXG4gICAgICBjb2x1bW4uR3JvdXBGaWVsZCA9IGNvbHVtbi5Hcm91cEZpZWxkXHJcbiAgICAgICAgPyBgJHtncm91cFByZWZpeH0ke2NvbHVtbi5Hcm91cEZpZWxkfWBcclxuICAgICAgICA6IG51bGw7XHJcbiAgICAgIGFjY1tjb2x1bW4uTmFtZV0gPSBjb2x1bW47XHJcblxyXG4gICAgICByZXR1cm4gYWNjO1xyXG4gICAgfSwge30pO1xyXG5cclxuICAgIGNvbHVtbnNNYXAgPSBjb2x1bW5zXHJcbiAgICAgIC5maWx0ZXIoKGNvbHVtbikgPT4gY29sdW1uLkdyb3VwRmllbGQpXHJcbiAgICAgIC5tYXAoKGNvbHVtbikgPT4gY29sdW1uLkdyb3VwRmllbGQpXHJcbiAgICAgIC5maWx0ZXIoKHZhbHVlLCBpbmRleCwgc2VsZikgPT4gc2VsZi5pbmRleE9mKHZhbHVlKSA9PT0gaW5kZXgpXHJcbiAgICAgIC5yZWR1Y2UoKGFjYywgZ3JvdXBGaWVsZCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSBncm91cEZpZWxkLnJlcGxhY2UoZ3JvdXBQcmVmaXgsICcnKTtcclxuXHJcbiAgICAgICAgY29uc3QgZ3JvdXBDb2x1bW4gPSB7XHJcbiAgICAgICAgICBOYW1lOiBncm91cEZpZWxkLFxyXG4gICAgICAgICAgTGFiZWw6IGNvbHVtbk5hbWUsXHJcbiAgICAgICAgICBDb2x1bW5zOiBbXSxcclxuICAgICAgICAgIC8qIHRzbGludDpkaXNhYmxlOiBtYXgtbGluZS1sZW5ndGggKi9cclxuICAgICAgICAgIEdyb3VwRmllbGQ6IGNvbHVtbnNNYXBbY29sdW1uTmFtZV0gJiYgY29sdW1uc01hcFtjb2x1bW5OYW1lXS5Hcm91cEZpZWxkICYmIGNvbHVtbnNNYXBbY29sdW1uTmFtZV0uR3JvdXBGaWVsZCAhPT0gZ3JvdXBGaWVsZFxyXG4gICAgICAgICAgICA/IGNvbHVtbnNNYXBbY29sdW1uTmFtZV0uR3JvdXBGaWVsZFxyXG4gICAgICAgICAgICA6IG51bGxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBhY2NbZ3JvdXBGaWVsZF0gPSBncm91cENvbHVtbjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGFjYztcclxuICAgICAgfSwgY29sdW1uc01hcCk7XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBjb2x1bW5OYW1lIGluIGNvbHVtbnNNYXApIHtcclxuICAgICAgaWYgKGNvbHVtbnNNYXAuaGFzT3duUHJvcGVydHkoY29sdW1uTmFtZSkpIHtcclxuICAgICAgICBjb25zdCBjb2x1bW4gPSBjb2x1bW5zTWFwW2NvbHVtbk5hbWVdO1xyXG5cclxuICAgICAgICBpZiAoY29sdW1uLkdyb3VwRmllbGQpIHtcclxuICAgICAgICAgIGNvbHVtbnNNYXBbY29sdW1uLkdyb3VwRmllbGRdLkNvbHVtbnMucHVzaChjb2x1bW4pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXN1bHQucHVzaChjb2x1bW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckRpc3BsYXlUeXBlKHNldHRpbmdzOiBJRGlzcGxheVR5cGVTZXR0aW5ncywgY29sdW1uOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW4sIHBlcm1pc3Npb25zOiBDb250cm9sUm9sZVBlcm1pc3Npb25zKSB7XHJcbiAgICBpZiAoc2V0dGluZ3MudHlwZSA9PT0gRGlzcGxheVR5cGUuSWNvbnMpIHtcclxuICAgICAgY29sdW1uLmNlbGxUZW1wbGF0ZSA9IChjb250YWluZXIsIG9wdGlvbnMpID0+IHtcclxuICAgICAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IFN0cmluZyhvcHRpb25zLnZhbHVlKTtcclxuICAgICAgICBjb25zdCBjZWxsU2V0dGluZ3MgPSBzZXR0aW5ncy5kYXRhLmZpbmQoKGl0ZW0pID0+IFN0cmluZyhpdGVtLnZhbHVlKSA9PT0gc3RyaW5nVmFsdWUpO1xyXG5cclxuICAgICAgICBpZiAoY2VsbFNldHRpbmdzKSB7XHJcbiAgICAgICAgICAkKCc8ZGl2PicpXHJcbiAgICAgICAgICAgIC5jc3MoeyAndGV4dC1hbGlnbic6ICdjZW50ZXInIH0pXHJcbiAgICAgICAgICAgIC5hdHRyKCd0aXRsZScsIGNlbGxTZXR0aW5ncy50aXRsZSlcclxuICAgICAgICAgICAgLmFwcGVuZCgkKCc8aW1nPicsIHsgc3JjOiBjZWxsU2V0dGluZ3MuaW1hZ2UgfSkpXHJcbiAgICAgICAgICAgIC5hcHBlbmRUbyhjb250YWluZXIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgLmNzcyh7ICd0ZXh0LWFsaWduJzogJ2NlbnRlcicgfSlcclxuICAgICAgICAgICAgLnRleHQob3B0aW9ucy52YWx1ZSlcclxuICAgICAgICAgICAgLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29sdW1uLmVkaXRDZWxsVGVtcGxhdGUgPSAoY29udGFpbmVyLCBjZWxsSW5mbykgPT4ge1xyXG4gICAgICAgICQoJzxkaXYgLz4nKS5keFNlbGVjdEJveCh7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiBzZXR0aW5ncy5kYXRhLFxyXG4gICAgICAgICAgZGlzcGxheVZhbHVlOiAndGl0bGUnLFxyXG4gICAgICAgICAgaXRlbVRlbXBsYXRlOiAoZGF0YTogSUljb25zQ29sdW1uRWRpdG9ySXRlbSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgICAgLmNzcyh7ICd0ZXh0LWFsaWduJzogJ2NlbnRlcicgfSlcclxuICAgICAgICAgICAgICAuYXR0cigndGl0bGUnLCBkYXRhLnRpdGxlKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmQoJCgnPGltZz4nLCB7IHNyYzogZGF0YS5pbWFnZSB9KSlcclxuICAgICAgICAgICAgICAuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgZmllbGRUZW1wbGF0ZTogKGRhdGEsIGVsKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJdGVtID0gc2V0dGluZ3MuZGF0YS5maW5kKChpdGVtKSA9PiBwYXJzZUludChpdGVtLnZhbHVlKSA9PT0gY2VsbEluZm8udmFsdWUpO1xyXG4gICAgICAgICAgICBjb25zdCAkaXRlbU5hbWUgPSAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2l0ZW0tbmFtZScpO1xyXG4gICAgICAgICAgICBjb25zdCAkcmVzdWx0ID0gJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgICAgLmFkZENsYXNzKCdhcHMtaWNvbi1lZGl0b3JfX2N1c3RvbS1pdGVtJylcclxuICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxpbWc+JywgeyBzcmM6IGN1cnJlbnRJdGVtID8gY3VycmVudEl0ZW0uaW1hZ2UgOiAnJyB9KS5hdHRyKCd0aXRsZScsIGN1cnJlbnRJdGVtID8gY3VycmVudEl0ZW0udGl0bGUgOiAnJykpXHJcbiAgICAgICAgICAgICAgLmFwcGVuZCgkaXRlbU5hbWUpO1xyXG5cclxuICAgICAgICAgICAgJGl0ZW1OYW1lXHJcbiAgICAgICAgICAgICAgLmR4VGV4dEJveCh7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogJycsXHJcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZVxyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgZWwuYXBwZW5kKCRyZXN1bHQpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSwgY29tcG9uZW50IH0pID0+IHtcclxuICAgICAgICAgICAgY2VsbEluZm8uc2V0VmFsdWUocGFyc2VJbnQodmFsdWUudmFsdWUpKTtcclxuICAgICAgICAgICAgY29tcG9uZW50LmJsdXIoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB2YWx1ZTogKGNlbGxJbmZvLnZhbHVlICE9PSBudWxsICYmIGNlbGxJbmZvICE9PSB2b2lkIDApICYmIGNlbGxJbmZvLnZhbHVlLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICBzZWxlY3RlZEl0ZW06IHNldHRpbmdzLmRhdGEuZmluZCgoaXRlbSkgPT4gcGFyc2VJbnQoaXRlbS52YWx1ZSkgPT09IGNlbGxJbmZvLnZhbHVlKVxyXG4gICAgICAgIH0pLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb2x1bW4uYWxsb3dTZWFyY2ggPSBmYWxzZTtcclxuICAgICAgY29sdW1uLmFsbG93RmlsdGVyaW5nID0gZmFsc2U7XHJcbiAgICAgIGNvbHVtbi5hbGxvd0hlYWRlckZpbHRlcmluZyA9IHRydWU7XHJcbiAgICAgIGNvbHVtbi5hbGxvd0dyb3VwaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNldHRpbmdzLnR5cGUgPT09IERpc3BsYXlUeXBlLlByZWRlZmluZWRWYWx1ZXMpIHtcclxuICAgICAgY29sdW1uLmVkaXRDZWxsVGVtcGxhdGUgPSAoY29udGFpbmVyLCBjZWxsSW5mbykgPT4ge1xyXG4gICAgICAgICQoJzxkaXYgLz4nKS5keFNlbGVjdEJveCh7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiBzZXR0aW5ncy5kYXRhLm1hcCgoaSkgPT4gaS52YWx1ZSkuc29ydCgpLFxyXG4gICAgICAgICAgYWNjZXB0Q3VzdG9tVmFsdWU6IHRydWUsXHJcbiAgICAgICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKHsgdmFsdWUsIGNvbXBvbmVudCB9KSA9PiB7XHJcbiAgICAgICAgICAgIGNlbGxJbmZvLnNldFZhbHVlKHZhbHVlIHx8ICcnKTtcclxuICAgICAgICAgICAgY29tcG9uZW50LmJsdXIoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB2YWx1ZTogY2VsbEluZm8udmFsdWUsXHJcbiAgICAgICAgfSkuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2V0dGluZ3MudHlwZSA9PT0gRGlzcGxheVR5cGUuUmFiYml0QWN0aW9uKSB7XHJcbiAgICAgIGNvbHVtbi5lZGl0Q2VsbFRlbXBsYXRlID0gKGNvbnRhaW5lciwgY2VsbEluZm8pID0+IHtcclxuICAgICAgICAkKCc8ZGl2IC8+JykuZHhDaGVja0JveCh7XHJcbiAgICAgICAgICB2YWx1ZTogY2VsbEluZm8udmFsdWUgfHwgZmFsc2UsXHJcbiAgICAgICAgICByZWFkT25seTogIXRoaXMuaGFzUGVybWlzc29uKHBlcm1pc3Npb25zLCBDb250cm9sUm9sZVBlcm1pc3Npb25zLlVwZGF0ZSksXHJcbiAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICAgICAgY2VsbEluZm8uY29tcG9uZW50LmNlbGxWYWx1ZShjZWxsSW5mby5yb3dJbmRleCwgY2VsbEluZm8uY29sdW1uLmRhdGFGaWVsZCwgZS52YWx1ZSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0pLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbmZpZ3VyZUNvbHVtbihjb2x1bW5Db25maWc6IElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uIHtcclxuICAgIGNvbnN0IHRpdGxlID0gY29sdW1uQ29uZmlnLkxhYmVsIHx8IGNvbHVtbkNvbmZpZy5OYW1lO1xyXG4gICAgY29uc3QgdG9vbHRpcCA9IGNvbHVtbkNvbmZpZy5Ub29sVGlwIHx8IHRpdGxlO1xyXG5cclxuICAgIGNvbnN0IGNvbHVtbjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uID0gIWNvbHVtbkNvbmZpZy5Db2x1bW5zLmxlbmd0aFxyXG4gICAgICA/IHtcclxuICAgICAgICBkYXRhRmllbGQ6IGNvbHVtbkNvbmZpZy5OYW1lLFxyXG4gICAgICAgIGRhdGFUeXBlOiBjb2x1bW5Db25maWcuVHlwZSxcclxuICAgICAgICBjYXB0aW9uOiB0aXRsZSxcclxuICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSh0aXRsZSwgdG9vbHRpcCksXHJcbiAgICAgICAgdmlzaWJsZTogY29sdW1uQ29uZmlnLklzRGVmYXVsdFZpZXdGaWVsZCxcclxuICAgICAgICB2aXNpYmxlSW5kZXg6IGNvbHVtbkNvbmZpZy5PcmRlcixcclxuICAgICAgICBhbGxvd0ZpeGluZzogZmFsc2UsXHJcbiAgICAgICAgYWxsb3dFZGl0aW5nOiAhIXRoaXMuaGFzUGVybWlzc29uKGNvbHVtbkNvbmZpZy5QZXJtaXNzaW9ucywgQ29udHJvbFJvbGVQZXJtaXNzaW9ucy5VcGRhdGUpLFxyXG4gICAgICAgIHdpZHRoOiBjb2x1bW5Db25maWcuV2lkdGgsXHJcbiAgICAgICAgaGlkaW5nUHJpb3JpdHk6IGNvbHVtbkNvbmZpZy5IaWRpbmdPcmRlclxyXG4gICAgICB9IDoge1xyXG4gICAgICAgIGNhcHRpb246IHRpdGxlLFxyXG4gICAgICAgIGNvbHVtbnM6IGNvbHVtbkNvbmZpZy5Db2x1bW5zLm1hcCgoYykgPT4gdGhpcy5jb25maWd1cmVDb2x1bW4oYykpXHJcbiAgICAgIH07XHJcblxyXG4gICAgaWYgKGNvbHVtbkNvbmZpZy5EaXNwbGF5VHlwZSkge1xyXG4gICAgICBjb25zdCBkaXNwbGF5U2V0dGluZ3M6IElEaXNwbGF5VHlwZVNldHRpbmdzID0gSlNPTi5wYXJzZShjb2x1bW5Db25maWcuRGlzcGxheVR5cGUpO1xyXG5cclxuICAgICAgaWYgKGRpc3BsYXlTZXR0aW5ncy50eXBlID09PSBEaXNwbGF5VHlwZS5JY29ucykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZGlzcGxheVNldHRpbmdzLmRhdGEubWFwKChpdGVtKSA9PiAoe1xyXG4gICAgICAgICAgdGV4dDogaXRlbS50aXRsZSxcclxuICAgICAgICAgIHZhbHVlOiBpdGVtLnZhbHVlXHJcbiAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICBpdGVtcy5zcGxpY2UoMCwgMCwge1xyXG4gICAgICAgICAgdGV4dDogJ0JsYW5rJyxcclxuICAgICAgICAgIHZhbHVlOiBudWxsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIChjb2x1bW4gYXMgYW55KS5oZWFkZXJGaWx0ZXIgPSB7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiBpdGVtc1xyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMucmVuZGVyRGlzcGxheVR5cGUoZGlzcGxheVNldHRpbmdzLCBjb2x1bW4sIGNvbHVtbkNvbmZpZy5QZXJtaXNzaW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtbjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uZmlndXJlQ29sdW1ucyhjb25maWd1cmF0aW9uOiBJQVBTQ29udHJvbEZpZWxkQ29uZmlndXJhdGlvbltdKSB7XHJcbiAgICBjb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbi5maWx0ZXIoXHJcbiAgICAgIChjKSA9PiB0aGlzLmhhc1Blcm1pc3NvbihjLlBlcm1pc3Npb25zLCBDb250cm9sUm9sZVBlcm1pc3Npb25zLlJlYWQpXHJcbiAgICApO1xyXG5cclxuICAgIGNvbmZpZ3VyYXRpb24gPSB0aGlzLmJ1aWxkVHJlZShjb25maWd1cmF0aW9uKTtcclxuICAgIGNvbnN0IGNvbHVtbnMgPSBjb25maWd1cmF0aW9uLm1hcCgoYykgPT4gdGhpcy5jb25maWd1cmVDb2x1bW4oYykpO1xyXG5cclxuICAgIHJldHVybiBjb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVNYWluR3JpZChjb25maWd1cmF0aW9uOiBJQVBTQ29udHJvbEZpZWxkQ29uZmlndXJhdGlvbltdKSB7XHJcbiAgICBjb25zdCBoYXNLZXlzID0gY29uZmlndXJhdGlvbi5zb21lKChjKSA9PiBjLklzS2V5Q29sdW1uKTtcclxuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbmZpZ3VyZUNvbHVtbnMoY29uZmlndXJhdGlvbik7XHJcblxyXG4gICAgY29uc3QgY29sdW1uRm9yU3VtbWFyeSA9IGdldFN1bW1hcnlDb2x1bW4oY29sdW1ucyk7XHJcbiAgICBjb25zdCBncmlkT3B0aW9ucyA9IHtcclxuICAgICAgZGF0YVNvdXJjZTogdGhpcy5jcmVhdGVNYWluR3JpZERhdGFTb3VyY2UoY29uZmlndXJhdGlvbiksXHJcbiAgICAgIGNvbHVtblJlc2l6aW5nTW9kZTogJ3dpZGdldCcsXHJcbiAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBhbGxvd1VwZGF0aW5nOiBoYXNLZXlzLFxyXG4gICAgICAgIGFsbG93QWRkaW5nOiBmYWxzZSxcclxuICAgICAgICBhbGxvd0RlbGV0aW5nOiBmYWxzZSxcclxuICAgICAgICBtb2RlOiAnYmF0Y2gnXHJcbiAgICAgIH0sXHJcbiAgICAgIHNjcm9sbGluZzogeyBtb2RlOiAndmlydHVhbCcsIHByZWxvYWRFbmFibGVkOiB0cnVlIH0sXHJcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IHRydWUsXHJcbiAgICAgIHBhZ2VyOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIGhlaWdodDogdGhpcy5pc1N0YW5kYWxvbmVQYWdlID8gdW5kZWZpbmVkIDogJzEwMCUnLFxyXG4gICAgICBjb2x1bW5DaG9vc2VyOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBtb2RlOiAnZHJhZ0FuZERyb3AnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbHVtbkZpeGluZzoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgZmlsdGVyUGFuZWw6IHtcclxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIHRleHRzOiB7XHJcbiAgICAgICAgICBjcmVhdGVGaWx0ZXI6ICdOb25lJyxcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHN1bW1hcnk6IHtcclxuICAgICAgICB0b3RhbEl0ZW1zOiBbeyBzdW1tYXJ5VHlwZTogJ2NvdW50JywgY29sdW1uOiBjb2x1bW5Gb3JTdW1tYXJ5IH1dXHJcbiAgICAgIH0sXHJcbiAgICAgIGFsbG93Q29sdW1uUmVzaXppbmc6IHRydWUsXHJcbiAgICAgIGNvbHVtbkhpZGluZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgY29sdW1ucyxcclxuICAgICAgYWxsb3dDb2x1bW5SZW9yZGVyaW5nOiB0cnVlLFxyXG4gICAgICBncm91cGluZzoge1xyXG4gICAgICAgIGNvbnRleHRNZW51RW5hYmxlZDogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBncm91cFBhbmVsOiB7XHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBtYXN0ZXJEZXRhaWw6ICFoYXNLZXlzID8gdW5kZWZpbmVkIDoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgdGVtcGxhdGU6IChjb250YWluZXIsIG9wdGlvbnMpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGtleXMgPSB7fTtcclxuICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZmlsdGVyKChjKSA9PiBjLklzS2V5Q29sdW1uKS5mb3JFYWNoKChjKSA9PiBrZXlzW2MuTmFtZV0gPSBvcHRpb25zLmRhdGFbYy5OYW1lXSk7XHJcblxyXG4gICAgICAgICAgJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAuZHhEYXRhR3JpZCh7XHJcbiAgICAgICAgICAgICAgZGF0YVNvdXJjZToge1xyXG4gICAgICAgICAgICAgICAgc3RvcmU6IGNyZWF0ZUR4RGF0YVNvdXJjZSh7XHJcbiAgICAgICAgICAgICAgICAgIGxvYWRVcmw6IGAke3RoaXMuY29udHJvbExvZ3NVcmx9P2tleT0ke0pTT04uc3RyaW5naWZ5KGtleXMpfWAsXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgc2hvd0JvcmRlcnM6IHRydWUsXHJcbiAgICAgICAgICAgICAgY29sdW1uczogW3tcclxuICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ1VzZXInLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IDIwMFxyXG4gICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ0NyZWF0ZWRBdCcsXHJcbiAgICAgICAgICAgICAgICBjYXB0aW9uOiAnRGF0ZScsXHJcbiAgICAgICAgICAgICAgICBkYXRhVHlwZTogJ2RhdGUnLFxyXG4gICAgICAgICAgICAgICAgZm9ybWF0OiAnc2hvcnREYXRlU2hvcnRUaW1lJyxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiAyMDBcclxuICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdDaGFuZ2VzJyxcclxuICAgICAgICAgICAgICAgIGNlbGxUZW1wbGF0ZTogKGMsIG8pID0+IHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IG8uZGF0YS5DaGFuZ2VzXHJcbiAgICAgICAgICAgICAgICAgICAgLm1hcChcclxuICAgICAgICAgICAgICAgICAgICAgIChpdGVtKSA9PiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGA8ZGl2IGNsYXNzPSdhcHMtY29udHJvbC1sb2cnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9J2Fwcy1jb250cm9sLWxvZ19fZmllbGQnPiR7aXRlbS5GaWVsZH08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0nYXBzLWNvbnRyb2wtbG9nX19vbGQtdmFsdWUnPiR7aXRlbS5PbGRWYWx1ZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdTIxOTJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSdhcHMtY29udHJvbC1sb2dfX25ldy12YWx1ZSc+JHtpdGVtLk5ld1ZhbHVlfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gXHJcbiAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICQoYDxkaXYgY2xhc3M9J2Fwcy1jb250cm9sLWxvZ3MnPiR7Y29udGVudH08L2Rpdj5gKS5hcHBlbmRUbyhjKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XSxcclxuICAgICAgICAgICAgfSkuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uQ29udGVudFJlYWR5OiAoZSkgPT4ge1xyXG4gICAgICAgIGlmICghZS5jb21wb25lbnQpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJlcGFyZUZpbHRlclBhbmVsKGUuY29tcG9uZW50KTtcclxuICAgICAgfSxcclxuICAgICAgb25FZGl0b3JQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgaWYgKGUucGFyZW50VHlwZSAhPT0gJ2RhdGFSb3cnKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBmaWVsZENvbmZpZyA9IGNvbmZpZ3VyYXRpb24uZmluZCgoYykgPT4gYy5OYW1lID09PSBlLmRhdGFGaWVsZCk7XHJcblxyXG4gICAgICAgIGlmICghZmllbGRDb25maWcpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRpc2FibGVFZGl0aW5nID0gIXRoaXMuaGFzUGVybWlzc29uKGZpZWxkQ29uZmlnLlBlcm1pc3Npb25zLCBDb250cm9sUm9sZVBlcm1pc3Npb25zLlVwZGF0ZSk7XHJcblxyXG4gICAgICAgIGUuZWRpdG9yT3B0aW9ucy5yZWFkT25seSA9IGRpc2FibGVFZGl0aW5nO1xyXG5cclxuICAgICAgICBpZiAoIWRpc2FibGVFZGl0aW5nICYmIGZpZWxkQ29uZmlnLlR5cGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjb25zdCBiYXNlU2V0VmFsdWUgPSBlLnNldFZhbHVlO1xyXG5cclxuICAgICAgICAgIChlIGFzIGFueSkuc2V0VmFsdWUgPSAobmV3VmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBiYXNlU2V0VmFsdWUobmV3VmFsdWUudHJpbSgpKTtcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvbkNlbGxQcmVwYXJlZDogKGUpID0+IHtcclxuICAgICAgICBpZiAoZS5yb3dUeXBlID09PSAnZGF0YScpIHtcclxuICAgICAgICAgIGNvbnN0IGZpZWxkQ29uZmlnID0gY29uZmlndXJhdGlvbi5maW5kKChjKSA9PiBjLk5hbWUgPT09IGUuY29sdW1uLmRhdGFGaWVsZCk7XHJcblxyXG4gICAgICAgICAgaWYgKGZpZWxkQ29uZmlnICYmICF0aGlzLmhhc1Blcm1pc3NvbihmaWVsZENvbmZpZy5QZXJtaXNzaW9ucywgQ29udHJvbFJvbGVQZXJtaXNzaW9ucy5VcGRhdGUpKSB7XHJcbiAgICAgICAgICAgICQoZS5jZWxsRWxlbWVudCkuYWRkQ2xhc3MoJ2Fwcy1ncmlkX19kaXNhYmxlZC1jZWxsJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvblJvd0V4cGFuZGVkOiAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRldGFpbFJvd0luZGV4ID0gZS5jb21wb25lbnQuZ2V0Um93SW5kZXhCeUtleShlLmtleSkgKyAxO1xyXG4gICAgICAgIGNvbnN0ICRkZXRhaWxDZWxsID0gZS5jb21wb25lbnQuZ2V0Q2VsbEVsZW1lbnQoZGV0YWlsUm93SW5kZXgsIDApLnBhcmVudCgpLmZpbmQoJy5keC1tYXN0ZXItZGV0YWlsLWNlbGwnKTtcclxuICAgICAgICBjb25zdCBkYXRhR3JpZCA9ICRkZXRhaWxDZWxsLmZpbmQoJy5keC1kYXRhZ3JpZCcpLmZpcnN0KCkucGFyZW50KCkuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICAgICAgZGF0YUdyaWQucmVmcmVzaCgpO1xyXG4gICAgICB9LFxyXG4gICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zO1xyXG5cclxuICAgIHJldHVybiBjcmVhdGVEZWZhdWx0R3JpZCh0aGlzLiRjb250YWluZXIsIHtcclxuICAgICAgb3B0aW9uczogZ3JpZE9wdGlvbnMsXHJcbiAgICAgIGlzRnVsbFNjcmVlbjogdGhpcy5pc1N0YW5kYWxvbmVQYWdlLFxyXG4gICAgICBzZXREZWZhdWx0Q29sdW1uV2lkdGg6IHRydWUsXHJcbiAgICAgIGV4cG9ydEZpbGVOYW1lOiB0aGlzLmV4cG9ydEZpbGVOYW1lLFxyXG4gICAgICB0aXRsZTogdGhpcy5wYWdlVGl0bGUsXHJcbiAgICAgIGRpc2FibGVTdW1tYXJ5Q29sdW1uRGV0ZWN0aW9uOiB0cnVlXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTWFpbkdyaWREYXRhU291cmNlKGNvbmZpZ3VyYXRpb246IElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uW10pOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydkYXRhU291cmNlJ10ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc3RvcmU6IGNyZWF0ZUR4RGF0YVNvdXJjZSh7XHJcbiAgICAgICAga2V5OiBjb25maWd1cmF0aW9uLmZpbHRlcigoYykgPT4gYy5Jc0tleUNvbHVtbikubWFwKChjKSA9PiBjLk5hbWUpLFxyXG4gICAgICAgIGxvYWRVcmw6IHRoaXMubG9hZERhdGFVcmwsXHJcbiAgICAgICAgdXBkYXRlVXJsOiB0aGlzLnVwZGF0ZURhdGFVcmxcclxuICAgICAgfSlcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9uVmlld0FwcGxpZWQgPSAodmlld0lkOiBudW1iZXIpID0+IHtcclxuICAgIHRoaXMuY2xlYXJGaWx0ZXJSb3dBZnRlclZpZXdTd2l0Y2hpbmcoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlcGFyZUZpbHRlclBhbmVsKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gICAgY29uc3QgJGZpbHRlclBhbmVsRWxlbWVudCA9IGdyaWQuZWxlbWVudCgpXHJcbiAgICAgIC5maW5kKCcuZHgtZGF0YWdyaWQtZmlsdGVyLXBhbmVsJyk7XHJcbiAgICBjb25zdCAkZmlsdGVySWNvbkZpbHRlciA9ICRmaWx0ZXJQYW5lbEVsZW1lbnQuZmluZCgnLmR4LWljb24tZmlsdGVyJyk7XHJcbiAgICBjb25zdCAkZmlsdGVyUGFuZWxUZXh0ID0gJGZpbHRlclBhbmVsRWxlbWVudC5maW5kKCcuZHgtZGF0YWdyaWQtZmlsdGVyLXBhbmVsLXRleHQnKTtcclxuXHJcbiAgICAkZmlsdGVySWNvbkZpbHRlci5vZmYoJ2NsaWNrJyk7XHJcbiAgICAkZmlsdGVyUGFuZWxUZXh0Lm9mZignY2xpY2snKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdFJvd3NDb3VudFN1bW1hcnkoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgICBjb25zdCBmaXJzdFZpc2libGVEYXRhQ29sdW1uID0gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpLmZpbmQoKGMpID0+ICEhYy5kYXRhRmllbGQpO1xyXG4gICAgaWYgKCFmaXJzdFZpc2libGVEYXRhQ29sdW1uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByb3dzQ291bnRTdW1tYXJ5TmFtZSA9ICdSb3dzQ291bnQnO1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgIGNvbnN0IHRvdGFsSXRlbXM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5Qcm9wZXJ0aWVzWydzdW1tYXJ5J11bJ3RvdGFsSXRlbXMnXSA9IChncmlkLm9wdGlvbignc3VtbWFyeS50b3RhbEl0ZW1zJykgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXNbJ3N1bW1hcnknXVsndG90YWxJdGVtcyddICkgfHwgW107XHJcbiAgICBjb25zdCByb3dzQ291bnRTdW1tYXJ5SXRlbSA9IHRvdGFsSXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbSAmJiBpdGVtLm5hbWUgPT09IHJvd3NDb3VudFN1bW1hcnlOYW1lKTtcclxuICAgIGlmIChyb3dzQ291bnRTdW1tYXJ5SXRlbSAmJiByb3dzQ291bnRTdW1tYXJ5SXRlbS5jb2x1bW4gPT09IGZpcnN0VmlzaWJsZURhdGFDb2x1bW4uZGF0YUZpZWxkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocm93c0NvdW50U3VtbWFyeUl0ZW0pIHtcclxuICAgICAgcm93c0NvdW50U3VtbWFyeUl0ZW0uY29sdW1uID0gZmlyc3RWaXNpYmxlRGF0YUNvbHVtbi5kYXRhRmllbGQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0b3RhbEl0ZW1zLnB1c2goe1xyXG4gICAgICAgIG5hbWU6IHJvd3NDb3VudFN1bW1hcnlOYW1lLFxyXG4gICAgICAgIGNvbHVtbjogZmlyc3RWaXNpYmxlRGF0YUNvbHVtbi5kYXRhRmllbGQsXHJcbiAgICAgICAgc3VtbWFyeVR5cGU6ICdjb3VudCcsXHJcbiAgICAgICAgYWxpZ25tZW50OiAnbGVmdCcsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubWFpbkdyaWQub3B0aW9uKCdzdW1tYXJ5LnRvdGFsSXRlbXMnLCB0b3RhbEl0ZW1zKTtcclxuICB9XHJcblxyXG4gIC8vIE5PVEU6IFdvcmthcm91bmQuIFRoZSBncmlkIGNhbid0IGNsZWFyIHRoZSBmaWx0ZXIgcm93LCBzbyB3ZSBjbGVhciB0aGF0IG1hbnVhbGx5XHJcbiAgcHJpdmF0ZSBjbGVhckZpbHRlclJvd0FmdGVyVmlld1N3aXRjaGluZygpIHtcclxuICAgIGNvbnN0IGNsZWFySGVhZGVyID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCBjb2x1bW5zV2l0aEZpbHRlcmVkVmFsdWVzOiB7IFt2aXNpYmxlSW5kZXg6IG51bWJlcl06IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbiB9ID0ge307XHJcblxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5ncmlkVmlld3NUb29sYmFyQ29tcG9uZW50Lm9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlci5jdXJyZW50U2F2ZWRHcmlkU3RhdGUuY29sdW1uc1xyXG4gICAgICAgIHx8IHRoaXMuZ3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudC5vcHRpb25zLm93bmVyLm9wdGlvbignY29sdW1ucycpIGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5Db2x1bW5bXTtcclxuXHJcbiAgICAgIGNvbHVtbnNcclxuICAgICAgICAuZmlsdGVyKChjKSA9PiBjLnZpc2libGVJbmRleCAmJiAoYy5maWx0ZXJWYWx1ZSB8fCBjLmZpbHRlclZhbHVlcykpXHJcbiAgICAgICAgLmZvckVhY2goKGMpID0+IGNvbHVtbnNXaXRoRmlsdGVyZWRWYWx1ZXNbYy52aXNpYmxlSW5kZXhdID0gYyk7XHJcblxyXG4gICAgICAkKCd0ZCBbYXJpYS1sYWJlbCo9XCJGaWx0ZXIgY2VsbFwiXScpXHJcbiAgICAgICAgLmZpbHRlcigoaW5kZXgpID0+ICFjb2x1bW5zV2l0aEZpbHRlcmVkVmFsdWVzW2luZGV4XSlcclxuICAgICAgICAudmFsKCcnKTtcclxuICAgICAgdGhpcy5tYWluR3JpZC5vZmYoJ2NvbnRlbnRSZWFkeScsIGNsZWFySGVhZGVyKTtcclxuICAgIH07XHJcbiAgICB0aGlzLm1haW5HcmlkLm9uKCdjb250ZW50UmVhZHknLCBjbGVhckhlYWRlcik7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IGNyZWF0ZURlZmF1bHREYXRhR3JpZCwgY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkLCBJR3JpZEFkZGl0aW9uYWxPcHRpb25zIH0gZnJvbSAnLi4vR3JpZC9DcmVhdGVEZWZhdWx0R3JpZCc7XHJcbmltcG9ydCBjcmVhdGVEZWZhdWx0R3JpZCBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQnO1xyXG5cclxuaW50ZXJmYWNlIElBcHBVc2VyIHtcclxuICBJZDogc3RyaW5nO1xyXG4gIFVzZXJOYW1lOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJRGlzcGxheSB7XHJcbiAgSWQ6IG51bWJlcjtcclxuICBOYW1lOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJQ29udHJvbERpc3BsYXlzVXNlckFzc2lnbm1lbnQge1xyXG4gIERpc3BsYXlJZDogbnVtYmVyO1xyXG4gIFVzZXJJZDogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdyaWRDb2x1bW4ge1xyXG4gIElkOiBzdHJpbmc7XHJcbiAgQ2FwdGlvbjogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUFQU0NvbnRyb2xEaXNwbGF5QXNzaWdubWVudHNEYXRhIHtcclxuICBVc2VyczogSUFwcFVzZXJbXTtcclxuICBEaXNwbGF5czogSURpc3BsYXlbXTtcclxuICBBc3NpZ25tZW50czogSUNvbnRyb2xEaXNwbGF5c1VzZXJBc3NpZ25tZW50W107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURpc3BsYXlNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XHJcbiAgcGFnZVRpdGxlOiBzdHJpbmc7XHJcbiAgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBEaXNwbGF5TWFuYWdlciB7XHJcbiAgcHVibGljIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwYWdlVGl0bGU6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElEaXNwbGF5TWFuYWdlck9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuaXNTdGFuZGFsb25lUGFnZSA9IG9wdGlvbnMuaXNTdGFuZGFsb25lUGFnZTtcclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gICAgdGhpcy5wYWdlVGl0bGUgPSBvcHRpb25zLnBhZ2VUaXRsZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBsZXQgY29sdW1uczogSUdyaWRDb2x1bW5bXSA9IFtdO1xyXG5cclxuICAgIGNvbnN0IGxvYWREYXRhUHJvbWlzZSA9IHNlbmRSZXF1ZXN0PElBUFNDb250cm9sRGlzcGxheUFzc2lnbm1lbnRzRGF0YT4odGhpcy5sb2FkRGF0YVVybCwgJ2dldCcpXHJcbiAgICAgIC50aGVuKChyZXMpID0+IHtcclxuICAgICAgICBjb2x1bW5zID0gcmVzLkRpc3BsYXlzLm1hcCgoZCkgPT4gKHsgSWQ6IGQuSWQudG9TdHJpbmcoKSwgQ2FwdGlvbjogZC5OYW1lIH0pKTtcclxuXHJcbiAgICAgICAgY29uc3QgZGF0YSA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHVzZXIgb2YgcmVzLlVzZXJzKSB7XHJcbiAgICAgICAgICBjb25zdCBpdGVtID0geyBVc2VyTmFtZTogdXNlci5Vc2VyTmFtZSwgVXNlcklkOiB1c2VyLklkIH07XHJcbiAgICAgICAgICBjb25zdCB1c2VyQXNzaWdubWVudHMgPSByZXMuQXNzaWdubWVudHMuZmlsdGVyKChhKSA9PiBhLlVzZXJJZCA9PT0gdXNlci5JZCk7XHJcblxyXG4gICAgICAgICAgdXNlckFzc2lnbm1lbnRzLmZvckVhY2goKGFzc2lnbm1lbnQpID0+IHtcclxuICAgICAgICAgICAgaXRlbVthc3NpZ25tZW50LkRpc3BsYXlJZF0gPSB0cnVlO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgZGF0YS5wdXNoKGl0ZW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZ3JpZENvbHVtbnMgPSBbXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogJ1VzZXJOYW1lJywgd2lkdGg6IDMwMCwgZml4ZWQ6IHRydWUsIGZpeGVkUG9zaXRpb246ICdsZWZ0JywgYWxsb3dFZGl0aW5nOiBmYWxzZSB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6ICdVc2VySWQnLCB2aXNpYmxlOiBmYWxzZSB9XHJcbiAgICAgICAgXSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuQ29sdW1uW107XHJcblxyXG4gICAgICAgIGdyaWQub3B0aW9uKCdjb2x1bW5zJywgZ3JpZENvbHVtbnMuY29uY2F0KGNvbHVtbnMubWFwKChjb2wpID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogY29sLklkLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiBjb2wuQ2FwdGlvbixcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdib29sZWFuJyxcclxuICAgICAgICAgICAgY2FsY3VsYXRlQ2VsbFZhbHVlOiAocm93RGF0YSkgPT4gISFyb3dEYXRhW2NvbC5JZF1cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSkpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIGxldCB1cGRhdGluZ0lzSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgY29uc3QgZ3JpZE9wdGlvbnMgPSB7XHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdhcHMtZGlzcGxheS1tYW5hZ2VyJ30sXHJcbiAgICAgIGRhdGFTb3VyY2U6IHtcclxuICAgICAgICBzdG9yZTogbmV3IERldkV4cHJlc3MuZGF0YS5DdXN0b21TdG9yZSh7XHJcbiAgICAgICAgICBrZXk6ICdVc2VySWQnLFxyXG4gICAgICAgICAgbG9hZE1vZGU6ICdyYXcnLFxyXG4gICAgICAgICAgbG9hZDogKCkgPT4gbG9hZERhdGFQcm9taXNlLFxyXG4gICAgICAgICAgdXBkYXRlOiAoa2V5LCB2YWx1ZXM6IHsgW2Rpc3BsYXlJZDogbnVtYmVyXTogYm9vbGVhbiB9KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvUmVtb3ZlOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgICAgICAgICBjb25zdCB0b0FkZDogbnVtYmVyW10gPSBbXTtcclxuICAgICAgICAgICAgY29uc3QgdGhlcmVJc0N1cnJlbnRVcGRhdGluZyA9IHVwZGF0aW5nSXNJblByb2dyZXNzO1xyXG5cclxuICAgICAgICAgICAgdXBkYXRpbmdJc0luUHJvZ3Jlc3MgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZGlzcGxheUlkcyA9IE9iamVjdC5rZXlzKHZhbHVlcyk7XHJcblxyXG4gICAgICAgICAgICBkaXNwbGF5SWRzLmZvckVhY2goKGlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHZhbHVlc1tpZF0pIHtcclxuICAgICAgICAgICAgICAgIHRvQWRkLnB1c2gocGFyc2VJbnQoaWQpKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdG9SZW1vdmUucHVzaChwYXJzZUludChpZCkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBOT1RFOiBub3RpZnkgYWJvdXQgc3VjY2Vzc2Z1bCByZXF1ZXN0IG9ubHkgZm9yIHRoZSBmaXJzdCByZXF1ZXN0IGluIHRoZSBxdWV1ZVxyXG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7IHVwZGF0aW5nSXNJblByb2dyZXNzID0gZmFsc2U7IH0sIDApO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHRoaXMudXBkYXRlRGF0YVVybCwgJ3B1dCcsIHtcclxuICAgICAgICAgICAgICB1c2VySWQ6IGtleSxcclxuICAgICAgICAgICAgICBkaXNwbGF5c1RvUmVtb3ZlOiB0b1JlbW92ZSxcclxuICAgICAgICAgICAgICBkaXNwbGF5c1RvQWRkOiB0b0FkZFxyXG4gICAgICAgICAgICB9LCAhdGhlcmVJc0N1cnJlbnRVcGRhdGluZykucHJvbWlzZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0sXHJcbiAgICAgIGhlaWdodDogJzEwMCUnLFxyXG4gICAgICBzZWxlY3Rpb246IHtcclxuICAgICAgICBtb2RlOiAnbm9uZSdcclxuICAgICAgfSxcclxuICAgICAgYWxsb3dDb2x1bW5SZXNpemluZzogdHJ1ZSxcclxuICAgICAgZ3JvdXBpbmc6IHtcclxuICAgICAgICBjb250ZXh0TWVudUVuYWJsZWQ6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgZ3JvdXBQYW5lbDoge1xyXG4gICAgICAgIHZpc2libGU6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgcmVtb3RlT3BlcmF0aW9uczogZmFsc2UsXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgIG1vZGU6ICdjZWxsJyxcclxuICAgICAgICByZWZyZXNoTW9kZTogJ3JlcGFpbnQnXHJcbiAgICAgIH1cclxuICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXM7XHJcblxyXG4gICAgY29uc3QgYWRkaXRpb25hbE9wdGlvbnMgPSB7XHJcbiAgICAgIGV4cG9ydEZpbGVOYW1lOiAnRGlzcGxheU1hbmFnZW1lbnQnLFxyXG4gICAgICBzdW1tYXJ5Q29sdW1uOiAnVXNlck5hbWUnXHJcbiAgICB9IGFzIElHcmlkQWRkaXRpb25hbE9wdGlvbnM7XHJcblxyXG4gICAgbGV0IGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICAgIGlmICh0aGlzLmlzU3RhbmRhbG9uZVBhZ2UpIHtcclxuICAgICAgZ3JpZCA9IGNyZWF0ZUZ1bGxTY3JlZW5EYXRhR3JpZCh0aGlzLiRjb250YWluZXIsIGdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9ucywgdGhpcy5wYWdlVGl0bGUsICcnLCB0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdyaWQgPSBjcmVhdGVEZWZhdWx0R3JpZCh0aGlzLiRjb250YWluZXIsIHtcclxuICAgICAgICBvcHRpb25zOiBncmlkT3B0aW9ucyxcclxuICAgICAgICBzdW1tYXJ5Q29sdW1uOiBhZGRpdGlvbmFsT3B0aW9ucy5zdW1tYXJ5Q29sdW1uLFxyXG4gICAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZSxcclxuICAgICAgICBpc0Z1bGxTY3JlZW46IGZhbHNlLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vRGF0YS9SZXF1ZXN0JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVBpbmdSZXN1bHQge1xyXG4gIGlzQXV0aGVudGljYXRlZDogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2Vzc2lvbk5vdGlmaWVyT3B0aW9ucyB7XHJcbiAgc2Vzc2lvbkV4cGlyZVRpbWVNczogbnVtYmVyO1xyXG4gIGRpc3BsYXlEdXJhdGlvbk1zOiBudW1iZXI7XHJcbiAgc2Vzc2lvblBpbmdVcmw6IHN0cmluZztcclxuICBsb2dvdXRVcmw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNlc3Npb25Ob3RpZmllciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uRXhwaXJlVGltZU1zOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwbGF5RHVyYXRpb25NczogbnVtYmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2Vzc2lvblBpbmdVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvZ291dFVybDogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIHdhdGluZ1RpbWVvdXRJZDogbnVtYmVyO1xyXG4gIHByaXZhdGUgY291bnRlckludGVydmFsSWQ6IG51bWJlcjtcclxuICBwcml2YXRlIHBpbmdJbnRlcnZhbElkOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBleHBpcmF0aW9uVGltZTogRGF0ZTtcclxuICBwcml2YXRlICR0ZXh0Q29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSBjb250aW51ZXJCdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b247XHJcbiAgcHJpdmF0ZSBva0J1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcclxuICBwcml2YXRlIGxvZ291dEJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcclxuXHJcbiAgcHJpdmF0ZSBfcG9wdXA6IERldkV4cHJlc3MudWkuZHhQb3B1cDtcclxuICBwcml2YXRlIGdldCBwb3B1cCgpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAge1xyXG4gICAgaWYgKCF0aGlzLl9wb3B1cCkge1xyXG4gICAgICB0aGlzLl9wb3B1cCA9IHRoaXMuY3JlYXRlUG9wdXAoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fcG9wdXA7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJU2Vzc2lvbk5vdGlmaWVyT3B0aW9ucykge1xyXG4gICAgdGhpcy5zZXNzaW9uRXhwaXJlVGltZU1zID0gb3B0aW9ucy5zZXNzaW9uRXhwaXJlVGltZU1zO1xyXG4gICAgdGhpcy5kaXNwbGF5RHVyYXRpb25NcyA9IG9wdGlvbnMuZGlzcGxheUR1cmF0aW9uTXM7XHJcbiAgICB0aGlzLnNlc3Npb25QaW5nVXJsID0gb3B0aW9ucy5zZXNzaW9uUGluZ1VybDtcclxuICAgIHRoaXMubG9nb3V0VXJsID0gb3B0aW9ucy5sb2dvdXRVcmw7XHJcblxyXG4gICAgdGhpcy5waW5nU2Vzc2lvbklmVGFiSXNBY3RpdmUgPSB0aGlzLnBpbmdTZXNzaW9uSWZUYWJJc0FjdGl2ZS5iaW5kKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc2V0KCkge1xyXG4gICAgdGhpcy5jbGVhclRpbWVvdXRzQW5kSW50ZXJ2YWxzKCk7XHJcblxyXG4gICAgdGhpcy5wb3B1cD8uaGlkZSgpO1xyXG5cclxuICAgIHRoaXMuZXhwaXJhdGlvblRpbWUgPSB0aGlzLmdldEV4cGlyYXRpb25UaW1lKCk7XHJcblxyXG4gICAgdGhpcy53YXRpbmdUaW1lb3V0SWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd05vdGlmaWNhdGlvbigpO1xyXG4gICAgfSwgTWF0aC5tYXgodGhpcy5zZXNzaW9uRXhwaXJlVGltZU1zIC0gdGhpcy5kaXNwbGF5RHVyYXRpb25NcywgMCkpO1xyXG5cclxuICAgIHRoaXMucGluZ0ludGVydmFsSWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICB0aGlzLnBpbmdTZXNzaW9uSWZUYWJJc0FjdGl2ZSgpO1xyXG4gICAgfSwgNjAgKiAxMDAwKTtcclxuXHJcbiAgICAkKGRvY3VtZW50KS5vbigndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMucGluZ1Nlc3Npb25JZlRhYklzQWN0aXZlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy5jbGVhclRpbWVvdXRzQW5kSW50ZXJ2YWxzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNob3dOb3RpZmljYXRpb24oKSB7XHJcbiAgICB0aGlzLnBvcHVwPy5zaG93KCk7XHJcblxyXG4gICAgdGhpcy5jbGVhclRpbWVvdXRzQW5kSW50ZXJ2YWxzKCk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVQb3B1cENvbnRlbnQoKTtcclxuICAgIHRoaXMuY291bnRlckludGVydmFsSWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICB0aGlzLnVwZGF0ZVBvcHVwQ29udGVudCgpO1xyXG4gICAgfSwgMTAwMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyVGltZW91dHNBbmRJbnRlcnZhbHMoKSB7XHJcbiAgICBpZiAodGhpcy53YXRpbmdUaW1lb3V0SWQpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMud2F0aW5nVGltZW91dElkKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvdW50ZXJJbnRlcnZhbElkKSB7XHJcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5jb3VudGVySW50ZXJ2YWxJZCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5waW5nSW50ZXJ2YWxJZCkge1xyXG4gICAgICBjbGVhckludGVydmFsKHRoaXMucGluZ0ludGVydmFsSWQpO1xyXG4gICAgfVxyXG5cclxuICAgICQoZG9jdW1lbnQpLm9mZigndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMucGluZ1Nlc3Npb25JZlRhYklzQWN0aXZlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RXhwaXJhdGlvblRpbWUoKTogRGF0ZSB7XHJcbiAgICBjb25zdCBleHBpcmF0aW9uVGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICBleHBpcmF0aW9uVGltZS5zZXRNaWxsaXNlY29uZHMoZXhwaXJhdGlvblRpbWUuZ2V0TWlsbGlzZWNvbmRzKCkgKyB0aGlzLnNlc3Npb25FeHBpcmVUaW1lTXMpO1xyXG5cclxuICAgIHJldHVybiBleHBpcmF0aW9uVGltZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlUG9wdXAoKTogRGV2RXhwcmVzcy51aS5keFBvcHVwIHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JykuZHhQb3B1cCh7XHJcbiAgICAgIHRpdGxlOiAnU2Vzc2lvbiBFeHBpcmluZycsXHJcbiAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxyXG4gICAgICByZXNpemVFbmFibGVkOiBmYWxzZSxcclxuICAgICAgc2hvd0Nsb3NlQnV0dG9uOiBmYWxzZSxcclxuICAgICAgZHJhZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBtYXhIZWlnaHQ6IDE5MCxcclxuICAgICAgbWF4V2lkdGg6IDM3MCxcclxuICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuJHRleHRDb250YWluZXIgPSAkKCc8c3BhbiAvPicpO1xyXG4gICAgICAgIHRoaXMuJHRleHRDb250YWluZXIuYXBwZW5kKHRoaXMuZ2V0Q291bnRlclRleHQoKSk7XHJcbiAgICAgICAgY29uc3QgJGNvbnRhaW5lciA9ICQoJzxkaXYgLz4nKS5hcHBlbmQodGhpcy4kdGV4dENvbnRhaW5lcik7XHJcblxyXG4gICAgICAgIHJldHVybiAkY29udGFpbmVyO1xyXG4gICAgICB9LFxyXG4gICAgICB0b29sYmFySXRlbXM6IFt7XHJcbiAgICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICB0eXBlOiAnZGVmYXVsdCcsXHJcbiAgICAgICAgICB0ZXh0OiAnQ29udGludWUgc2Vzc2lvbicsXHJcbiAgICAgICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4gdGhpcy5jb250aW51ZXJCdXR0b24gPSBlLmNvbXBvbmVudCxcclxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoU2Vzc2lvbigpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICAgIH0sIHtcclxuICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgIHR5cGU6ICdkZWZhdWx0JyxcclxuICAgICAgICAgIHRleHQ6ICdSZWxvYWQgcGFnZScsXHJcbiAgICAgICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4gdGhpcy5va0J1dHRvbiA9IGUuY29tcG9uZW50LFxyXG4gICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH1cclxuICAgICAgfSwge1xyXG4gICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICB0ZXh0OiAnTG9nIE91dCcsXHJcbiAgICAgICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4gdGhpcy5sb2dvdXRCdXR0b24gPSBlLmNvbXBvbmVudCxcclxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2dPdXQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1dLFxyXG4gICAgfSkuYXBwZW5kVG8oJChkb2N1bWVudC5ib2R5KSkuZHhQb3B1cCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q291bnRlclRleHQoKTogSlF1ZXJ5IHtcclxuICAgIGNvbnN0IHJlbWFpbmVkU2Vjb25kcyA9IE1hdGgubWF4KHRoaXMuZ2V0U2Vjb25kc1RvRXhwaXJhdGlvbigpLCAwKTtcclxuICAgIGlmIChyZW1haW5lZFNlY29uZHMgPT09IDApIHtcclxuICAgICAgcmV0dXJuICQoJzxzcGFuIC8+JykudGV4dCgnWW91ciBzZXNzaW9uIGhhcyBiZWVuIGV4cGlyZWQnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0ICRzdGFydFRleHQgPSAkKCc8c3BhbiAvPicpLnRleHQoJ1lvdXIgc2Vzc2lvbiB3aWxsIGV4cGlyZSBpbiAnKTtcclxuICAgICAgY29uc3QgJGNvdW50ZXIgPSAkKCc8c3BhbiAvPicpLmFkZENsYXNzKCdzZXNzaW9uLW5vdGlmaWVyX19jb3VudGVyJykudGV4dChyZW1haW5lZFNlY29uZHMudG9GaXhlZCgwKSk7XHJcbiAgICAgIGNvbnN0ICRmaW5pc2hUZXh0ID0gJCgnPHNwYW4gLz4nKS50ZXh0KCcgc2Vjb25kcycpO1xyXG5cclxuICAgICAgcmV0dXJuICQoJzxzcGFuIC8+JykuYXBwZW5kKCRzdGFydFRleHQsICRjb3VudGVyLCAkZmluaXNoVGV4dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNlY29uZHNUb0V4cGlyYXRpb24oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAodGhpcy5leHBpcmF0aW9uVGltZS5nZXRUaW1lKCkgLSBuZXcgRGF0ZSgpLmdldFRpbWUoKSkgLyAxMDAwO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWZyZXNoU2Vzc2lvbigpIHtcclxuICAgIHRoaXMucmVzZXQoKTtcclxuXHJcbiAgICBzZW5kUmVxdWVzdDxJUGluZ1Jlc3VsdD4odGhpcy5zZXNzaW9uUGluZ1VybCwgJ0dFVCcsIG51bGwsIGZhbHNlLCB7IG5vdGlmeUVycm9yOiBmYWxzZSB9KS50aGVuKChyZXMpID0+IHtcclxuICAgICAgaWYgKCFyZXMuaXNBdXRoZW50aWNhdGVkKSB7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgICB9XHJcbiAgICB9KS5jYXRjaCgoKSA9PiB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwaW5nU2Vzc2lvbklmVGFiSXNBY3RpdmUoKSB7XHJcbiAgICBpZiAoZG9jdW1lbnQuaGlkZGVuKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBzZW5kUmVxdWVzdDxJUGluZ1Jlc3VsdD4odGhpcy5zZXNzaW9uUGluZ1VybCwgJ0dFVCcsIG51bGwsIGZhbHNlLCB7IG5vdGlmeUVycm9yOiBmYWxzZSB9KS50aGVuKChyZXMpID0+IHtcclxuICAgICAgaWYgKCFyZXMuaXNBdXRoZW50aWNhdGVkKSB7XHJcbiAgICAgICAgdGhpcy5zZXRFeHBpcmVkKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRFeHBpcmVkKCkge1xyXG4gICAgdGhpcy5leHBpcmF0aW9uVGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICB0aGlzLnNob3dOb3RpZmljYXRpb24oKTtcclxuICAgIGlmICh0aGlzLnBpbmdJbnRlcnZhbElkKSB7XHJcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5waW5nSW50ZXJ2YWxJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvZ091dCgpIHtcclxuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdGhpcy5sb2dvdXRVcmw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVBvcHVwQ29udGVudCgpIHtcclxuICAgIGNvbnN0IGlzQWxyZWFkeUV4cGlyZWQgPSB0aGlzLmdldFNlY29uZHNUb0V4cGlyYXRpb24oKSA8PSAwO1xyXG5cclxuICAgIHRoaXMuJHRleHRDb250YWluZXI/Lmh0bWwoJycpLmFwcGVuZCh0aGlzLmdldENvdW50ZXJUZXh0KCkpO1xyXG4gICAgdGhpcy5va0J1dHRvbi5vcHRpb24oJ3Zpc2libGUnLCBpc0FscmVhZHlFeHBpcmVkKTtcclxuICAgIHRoaXMuY29udGludWVyQnV0dG9uLm9wdGlvbigndmlzaWJsZScsICFpc0FscmVhZHlFeHBpcmVkKTtcclxuICAgIHRoaXMubG9nb3V0QnV0dG9uLm9wdGlvbigndmlzaWJsZScsICFpc0FscmVhZHlFeHBpcmVkKTtcclxuICB9XHJcbn1cclxuIiwgImNvbnN0IEdSSURfSU5ESUNBVE9SX1NUQVRFID0ge1xyXG4gIGVkaXQ6ICdlZGl0JyxcclxuICBzYXZpbmc6ICdzYXZpbmcnLFxyXG4gIHNhdmVkOiAnc2F2ZWQnXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBHUklEX0lORElDQVRPUl9TVEFURTtcclxuIiwgIlx1RkVGRmltcG9ydCB7IElHcmlkRGF0YUxheWVyIH0gZnJvbSAnLi4vLi4vRGF0YS9JbmRleCc7XHJcbmltcG9ydCB7IElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlLCBJR3JpZFN0YXRlLCBJR3JpZEV4dGVuZGVkQ29sdW1uU3RhdGUsIEdyaWREYXRhQ29sdW1uRGF0YVR5cGUgfSBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0lHcmlkU3RhdGUnO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi8uLi8uLi9VdGlscy9JbmRleCc7XHJcblxyXG5pbnRlcmZhY2UgSUxvYWRlZENvbHVtbnMgeyBbZGF0YUZpZWxkOiBzdHJpbmddOiBib29sZWFuOyB9XHJcbmludGVyZmFjZSBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TZXR0aW5ncyB7IFtkYXRhRmllbGQ6IHN0cmluZ106IElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlOyB9XHJcbmludGVyZmFjZSBJQ29sdW1uV2lkdGhzIHsgW3Zpc2libGVJbmRleDogbnVtYmVyXTogbnVtYmVyIHwgc3RyaW5nOyB9XHJcblxyXG5pbnRlcmZhY2UgSUNvbHVtbkNhcHRpb24ge1xyXG4gIGRhdGFGaWVsZDogc3RyaW5nO1xyXG4gIGNhcHRpb246IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR3JpZFN0YXRlTWFuYWdlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgcHVibGljIE9VVERBVEVfQ09MVU1OU19GT1VORF9FVkVOVCA9ICdvdXRkYXRlZC1jb2x1bW5zLWZvdW5kLWV2ZW50JztcclxuICBwcml2YXRlIHJlYWRvbmx5IGlkOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkRGF0YUxheWVyOiBJR3JpZERhdGFMYXllcjtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0ZUxvYWRlZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgbG9hZGVkQ29sdW1uczogSUxvYWRlZENvbHVtbnMgPSB7fTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3M6IElHcmlkQWRkaXRpb25hbENvbHVtblNldHRpbmdzID0ge307XHJcblxyXG4gIHByaXZhdGUgbGFzdENvbHVtblNldHRpbmdzU3RyOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGdyaWRJZDogbnVtYmVyLCBncmlkRGF0YUxheWVyOiBJR3JpZERhdGFMYXllcikge1xyXG4gICAgc3VwZXIoKTtcclxuXHJcbiAgICB0aGlzLmlkID0gZ3JpZElkO1xyXG4gICAgdGhpcy5ncmlkRGF0YUxheWVyID0gZ3JpZERhdGFMYXllcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2FkKGNoZWNrT3V0ZGF0ZWRDb2x1bW5zOiBib29sZWFuLCBvdXRkYXRlZENvbHVtbnNDYWxsYmFjazogKGNvbHVtbnMpID0+IHZvaWQpOiBKUXVlcnlQcm9taXNlPElHcmlkU3RhdGU+IHtcclxuICAgIHJldHVybiB0aGlzLmdyaWREYXRhTGF5ZXIuZ2V0R3JpZFZpZXdTZXR0aW5ncyh0aGlzLmlkKVxyXG4gICAgICAudGhlbigoZGF0YTogSUdyaWRTdGF0ZSkgPT4ge1xyXG4gICAgICAgIHRoaXMub25EYXRhTG9hZGVkKGRhdGEpO1xyXG5cclxuICAgICAgICBpZiAoY2hlY2tPdXRkYXRlZENvbHVtbnMpIHtcclxuICAgICAgICAgIHRoaXMuY2hlY2tDb2x1bW5zUmVsZXZhbmNlKGRhdGEuY29sdW1ucywgb3V0ZGF0ZWRDb2x1bW5zQ2FsbGJhY2spO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNhdmUoc3RhdGU6IElHcmlkU3RhdGUsIHNhdmluZ0NhbGxiYWNrPzogKCkgPT4gdm9pZCwgc2F2ZWRDYWxsYmFjaz86ICgpID0+IHZvaWQpOiBJQ29sdW1uV2lkdGhzIHtcclxuICAgIGNvbnN0IGNvbHVtbldpZHRoczogSUNvbHVtbldpZHRocyA9IHt9O1xyXG5cclxuICAgIGlmICghc3RhdGUuY29sdW1ucykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGUuY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgY29uc3QgYWRkU2V0dGluZ3MgPSB0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbY29sdW1uLmRhdGFGaWVsZF07XHJcblxyXG4gICAgICBpZiAoYWRkU2V0dGluZ3MpIHtcclxuICAgICAgICBjb2x1bW4uY2FwdGlvbiA9IGFkZFNldHRpbmdzLmNhcHRpb247XHJcbiAgICAgICAgY29sdW1uLnRvb2x0aXAgPSBhZGRTZXR0aW5ncy50b29sdGlwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvL05PVEU6IGlmIERCIHRhYmxlIGhhcyBubyBkYXRhIGluIGEgY29sdW1uLCBkYXRhIGdyaWQgY2FuJ3QgaW5mZXIgZGF0YSB0eXBlIGFuZCBkb2Vzbid0IHNldCB0aGUgZGF0YVR5cGUgZmllbGRcclxuICAgICAgaWYgKCFjb2x1bW4uZGF0YVR5cGUpIHtcclxuICAgICAgICBjb2x1bW4uZGF0YVR5cGUgPSBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlLkRlZmF1bHQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghIWNvbHVtbi53aWR0aCAmJiBjb2x1bW4udmlzaWJsZSkge1xyXG4gICAgICAgIGNvbHVtbldpZHRoc1tjb2x1bW4udmlzaWJsZUluZGV4XSA9IGNvbHVtbi53aWR0aDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgY29sdW1uU2V0dGluZ3NTdHIgPSBKU09OLnN0cmluZ2lmeShzdGF0ZS5jb2x1bW5zKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuc3RhdGVMb2FkZWQgfHwgY29sdW1uU2V0dGluZ3NTdHIgPT09IHRoaXMubGFzdENvbHVtblNldHRpbmdzU3RyKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubGFzdENvbHVtblNldHRpbmdzU3RyID0gY29sdW1uU2V0dGluZ3NTdHI7XHJcblxyXG4gICAgaWYgKHNhdmluZ0NhbGxiYWNrKSB7XHJcbiAgICAgIHNhdmluZ0NhbGxiYWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5ncmlkRGF0YUxheWVyLnVwZGF0ZUdyaWRWaWV3U2V0dGluZ3ModGhpcy5pZCwgc3RhdGUpXHJcbiAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICBpZiAoc2F2ZWRDYWxsYmFjaykge1xyXG4gICAgICAgICAgc2F2ZWRDYWxsYmFjaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtbldpZHRocztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjaGVja05ld0NvbHVtbnMoc3RhdGU6IElHcmlkU3RhdGUpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBuZXdDb2x1bW5GaWVsZHM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgaWYgKHN0YXRlLmNvbHVtbnMpIHtcclxuICAgICAgY29uc3QgbmV3Q29sdW1ucyA9IHN0YXRlLmNvbHVtbnMuZmlsdGVyKChjb2x1bW4pID0+ICF0aGlzLmxvYWRlZENvbHVtbnNbY29sdW1uLmRhdGFGaWVsZF0gJiYgY29sdW1uLnZpc2libGUpO1xyXG5cclxuICAgICAgaWYgKG5ld0NvbHVtbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgbmV3Q29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgICAgIG5ld0NvbHVtbkZpZWxkcy5wdXNoKGNvbHVtbi5kYXRhRmllbGQpO1xyXG4gICAgICAgICAgdGhpcy5sb2FkZWRDb2x1bW5zW2NvbHVtbi5kYXRhRmllbGRdID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXdDb2x1bW5GaWVsZHM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q29sdW1uQ2FwdGlvbnMoKTogSUNvbHVtbkNhcHRpb25bXSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzKS5tYXAoKGRhdGFGaWVsZCkgPT4ge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGRhdGFGaWVsZCxcclxuICAgICAgICBjYXB0aW9uOiB0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbZGF0YUZpZWxkXS5jYXB0aW9uXHJcbiAgICAgIH0gYXMgSUNvbHVtbkNhcHRpb247XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRDb2x1bW5DYXB0aW9uKGRhdGFGaWVsZDogc3RyaW5nLCBjYXB0aW9uOiBzdHJpbmcpIHtcclxuICAgIGlmICghdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2RhdGFGaWVsZF0pIHtcclxuICAgICAgdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2RhdGFGaWVsZF0gPSB7IGNhcHRpb246ICcnLCB0b29sdGlwOiAnJyB9O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tkYXRhRmllbGRdLmNhcHRpb24gPSBjYXB0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENvbHVtbkFkZGl0aW9uYWxTZXR0aW5ncyhkYXRhRmllbGQ6IHN0cmluZyk6IElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlIHtcclxuICAgIHJldHVybiB0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbZGF0YUZpZWxkXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjaGVja0NvbHVtbnNSZWxldmFuY2UoY29sdW1uczogSUdyaWRFeHRlbmRlZENvbHVtblN0YXRlW10sIGNhbGxiYWNrOiAob3V0ZGF0ZWRDb2x1bW5zOiBzdHJpbmdbXSkgPT4gdm9pZCkge1xyXG4gICAgdGhpcy5ncmlkRGF0YUxheWVyLmdldENvbHVtbnNCeVJlcG9ydElkKHRoaXMuaWQpXHJcbiAgICAgIC50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYWN0dWFsQ29sdW1ucyA9IHt9O1xyXG5cclxuICAgICAgICBkYXRhLmZvckVhY2goKGMpID0+IGFjdHVhbENvbHVtbnNbYy5OYW1lXSA9IHRydWUpO1xyXG5cclxuICAgICAgICBjb25zdCBvdXRkYXRlZENvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcigoYykgPT4gIWFjdHVhbENvbHVtbnNbYy5kYXRhRmllbGRdKS5tYXAoKGMpID0+IGMuZGF0YUZpZWxkKTtcclxuXHJcbiAgICAgICAgaWYgKG91dGRhdGVkQ29sdW1ucy5sZW5ndGgpIHtcclxuICAgICAgICAgIERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oYEdyaWQgc2V0dGluZ3MgY29udGFpbiBzb21lIGNvbHVubXMgd2hpY2ggZG9uJ3QgZXhpc3QgaW4gdGhlIGRhdGFiYXNlIHRhYmxlIGFueW1vcmU6XHJcblxyXG4gICAgICAgICAgJyR7b3V0ZGF0ZWRDb2x1bW5zLmpvaW4oJywgJyl9Jy5cclxuXHJcbiAgICAgICAgICBEbyB5b3Ugd2FudCB0byByZW1vdmUgdGhlc2UgY29sdW1ucyBmcm9tIGdyaWQgc2V0dGluZ3M/XHJcbiAgICAgICAgICBgLCAnUmVtb3ZlIHJlZHVuZGFudCBjb2x1bW5zPycpXHJcbiAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoIXJlcykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgY2FsbGJhY2sob3V0ZGF0ZWRDb2x1bW5zKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXNldFNldHRpbmdzKCk6IEpRdWVyeVByb21pc2U8SUdyaWRTdGF0ZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZERhdGFMYXllci5yZXNldFNldHRpbmdzKHRoaXMuaWQpXHJcbiAgICAgIC50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vbkRhdGFMb2FkZWQoZGF0YSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25EYXRhTG9hZGVkKGRhdGE6IElHcmlkU3RhdGUpIHtcclxuICAgIGNvbnN0IGxvYWRlZEdyaWRTdGF0ZUNvbHVtbnMgPSBkYXRhICYmIGRhdGEuY29sdW1ucztcclxuICAgIGxldCB2aXNpYmxlSW5kZXhDb3VudGVyID0gMDtcclxuXHJcbiAgICB0aGlzLnN0YXRlTG9hZGVkID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAobG9hZGVkR3JpZFN0YXRlQ29sdW1ucykge1xyXG4gICAgICB0aGlzLmxvYWRlZENvbHVtbnMgPSB7fTtcclxuXHJcbiAgICAgIGxvYWRlZEdyaWRTdGF0ZUNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkZWRDb2x1bW5zW2NvbHVtbi5kYXRhRmllbGRdID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gTk9URTogc2V0IHZpc2libGUgaW5kZXhlcyBpZiB0aGV5IGhhdmUgbm90IGJlZW4gc2V0LiBJdCdzIHJlcXVpcmVkIGZvciBwcm9wZXIgZHhEYXRhR3JpZCBhcHBlYXJhbmNlLlxyXG4gICAgICAgIGlmIChjb2x1bW4udmlzaWJsZSAmJiBjb2x1bW4udmlzaWJsZUluZGV4ID09PSBudWxsKSB7XHJcbiAgICAgICAgICBjb2x1bW4udmlzaWJsZUluZGV4ID0gdmlzaWJsZUluZGV4Q291bnRlcisrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTk9URTogcmVtb3ZlIGVtcHR5IHZhbHVlcyBiZWNhdXNlIHRoZXkgbGVhZCB0byB3cm9uZyBkeERhdGFHcmlkIGJlaGF2aW9yXHJcbiAgICAgICAgT2JqZWN0LmtleXMoY29sdW1uKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgIGlmIChjb2x1bW5ba2V5XSA9PT0gbnVsbCB8fCBjb2x1bW5ba2V5XSA9PT0gdm9pZCAwIHx8IGNvbHVtbltrZXldID09PSAnJykge1xyXG4gICAgICAgICAgICBkZWxldGUgY29sdW1uW2tleV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxTZXR0aW5ncyA9IHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tjb2x1bW4uZGF0YUZpZWxkXTtcclxuXHJcbiAgICAgICAgaWYgKCFhZGRpdGlvbmFsU2V0dGluZ3MpIHtcclxuICAgICAgICAgIHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tjb2x1bW4uZGF0YUZpZWxkXSA9IHtcclxuICAgICAgICAgICAgY2FwdGlvbjogY29sdW1uLmNhcHRpb24sXHJcbiAgICAgICAgICAgIHRvb2x0aXA6IGNvbHVtbi50b29sdGlwXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBhZGRpdGlvbmFsU2V0dGluZ3MuY2FwdGlvbiA9IGNvbHVtbi5jYXB0aW9uO1xyXG4gICAgICAgICAgYWRkaXRpb25hbFNldHRpbmdzLnRvb2x0aXAgPSBjb2x1bW4udG9vbHRpcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIE5PVEU6IHJlbW92ZSBjb2x1bW5zIHdoaWNoIGR4RGF0YUdyaWQgZG9lc24ndCBleHBlY3QuXHJcbiAgICAgICAgZGVsZXRlIGNvbHVtbi5jYXB0aW9uO1xyXG4gICAgICAgIGRlbGV0ZSBjb2x1bW4udG9vbHRpcDtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sYXN0Q29sdW1uU2V0dGluZ3NTdHIgPSBKU09OLnN0cmluZ2lmeShkYXRhLmNvbHVtbnMpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGZW51bSBHcmlkTW9kZSB7XHJcbiAgVmlldyA9IDEsXHJcbiAgRWRpdCA9IDJcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgR3JpZE1vZGU7XHJcbiIsICJcdUZFRkZpbXBvcnQgR3JpZE1vZGUgZnJvbSAnLi4vUGFnZXMvR3JpZC9Nb2RlJztcclxuaW1wb3J0IHsgSVJlcG9ydFBhcmFtcyB9IGZyb20gJy4uL0lSZXBvcnRQYXJhbXMnO1xyXG5pbXBvcnQgeyBJR3JpZFN0YXRlIH0gZnJvbSAnLi4vLi4vV2lkZ2V0cy9JR3JpZFN0YXRlJztcclxuaW1wb3J0IHsgSUNvbHVtbk1ldGFEYXRhIH0gZnJvbSAnLi4vQ29sdW1uTWV0YURhdGEnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IGNyZWF0ZUR4RGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL0RhdGEvRHhEYXRhU291cmNlJztcclxuaW1wb3J0IHsgRXhjZXB0aW9uVHlwZSB9IGZyb20gJy4uLy4uL0RhdGEvRXhjZXB0aW9uVHlwZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRGF0YUxheWVyIHtcclxuICBnZXRDb2x1bW5zQnlSZXBvcnRJZChyZXBvcnRJZDogbnVtYmVyKTogSlF1ZXJ5RGVmZXJyZWQ8SUNvbHVtbk1ldGFEYXRhW10+O1xyXG4gIGdldEdyaWREYXRhU291cmNlKHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcywgZ3JpZE1vZGU6IEdyaWRNb2RlLCBzaG93QWxsRGF0YUluRWRpdDogYm9vbGVhbik6IERldkV4cHJlc3MuZGF0YS5DdXN0b21TdG9yZTxhbnksIGFueT47XHJcbiAgcmVzZXRTZXR0aW5ncyhyZXBvcnRJZDogbnVtYmVyKTogSlF1ZXJ5RGVmZXJyZWQ8SUdyaWRTdGF0ZT47XHJcbiAgdXBkYXRlR3JpZFZpZXdTZXR0aW5ncyhyZXBvcnRJZDogbnVtYmVyLCBzdGF0ZTogSUdyaWRTdGF0ZSk6IEpRdWVyeURlZmVycmVkPGFueT47XHJcbiAgZ2V0R3JpZFZpZXdTZXR0aW5ncyhyZXBvcnRJZDogbnVtYmVyKTogSlF1ZXJ5RGVmZXJyZWQ8SUdyaWRTdGF0ZT47XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBjcmVhdGVHcmlkRGF0YUxheWVyOiAoZ3JpZFJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZykgPT4gSUdyaWREYXRhTGF5ZXIgPSAoZ3JpZFJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZykgPT4ge1xyXG4gIGNvbnN0IHVybHMgPSB7XHJcbiAgICBncmlkUmVzdWx0OiBgJHtncmlkUmVwb3J0Q29udHJvbGxlclVybH0vR3JpZFZpZXdSZXN1bHRgLFxyXG4gICAgZ2V0Q29sdW1uc0J5UmVwb3J0SWQ6IGAke2dyaWRSZXBvcnRDb250cm9sbGVyVXJsfS9HZXREYlRhYmxlRmllbGRzYCxcclxuICAgIHJlc2V0R3JpZFNldHRpbmdzOiBgJHtncmlkUmVwb3J0Q29udHJvbGxlclVybH0vUmVzZXRHcmlkVmlld1NldHRpbmdzYCxcclxuICAgIHVwZGF0ZUdyaWRWaWV3U2V0dGluZ3M6IGAke2dyaWRSZXBvcnRDb250cm9sbGVyVXJsfS9VcGRhdGVHcmlkVmlld1NldHRpbmdzYCxcclxuICAgIGdldEdyaWRWaWV3U2V0dGluZ3M6IGAke2dyaWRSZXBvcnRDb250cm9sbGVyVXJsfS9HZXRHcmlkVmlld1NldHRpbmdzYFxyXG4gIH07XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBnZXRHcmlkRGF0YVNvdXJjZShyZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXMsIGdyaWRNb2RlOiBHcmlkTW9kZSwgc2hvd0FsbERhdGFJbkVkaXQpIHtcclxuICAgICAgcmV0dXJuIGNyZWF0ZUR4RGF0YVNvdXJjZSh7XHJcbiAgICAgICAgbG9hZFBhcmFtczoge1xyXG4gICAgICAgICAgaWQ6IHJlcG9ydFBhcmFtcy5SZXBvcnRJZCxcclxuICAgICAgICAgIGFwcE5hbWU6IHJlcG9ydFBhcmFtcy5BcHBOYW1lLFxyXG4gICAgICAgICAgZ3JpZE1vZGUsXHJcbiAgICAgICAgICByb3dzTGltaXQ6IGdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0ICYmICFzaG93QWxsRGF0YUluRWRpdCA/IDE1IDogbnVsbFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbG9hZFVybDogdXJscy5ncmlkUmVzdWx0LFxyXG4gICAgICAgIGdldFVzZXJGcmllbmRseUVycm9yTWVzc2FnZVxyXG4gICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0Q29sdW1uc0J5UmVwb3J0SWQ6IChyZXBvcnRJZDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIHJldHVybiBzZW5kUmVxdWVzdCh1cmxzLmdldENvbHVtbnNCeVJlcG9ydElkLCAncG9zdCcsIHsgaWQ6IHJlcG9ydElkIH0sIGZhbHNlLCB7XHJcbiAgICAgICAgZGF0YVR5cGU6ICdqc29uJ1xyXG4gICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgcmVzZXRTZXR0aW5nczogKHJlcG9ydElkOiBudW1iZXIpID0+IHtcclxuICAgICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHVybHMucmVzZXRHcmlkU2V0dGluZ3MsICdwb3N0JywgeyBpZDogcmVwb3J0SWQgfSwgZmFsc2UsIHsgZGF0YVR5cGU6ICdqc29uJyB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgdXBkYXRlR3JpZFZpZXdTZXR0aW5nczogKHJlcG9ydElkOiBudW1iZXIsIHN0YXRlOiBJR3JpZFN0YXRlKSA9PiB7XHJcbiAgICAgIHJldHVybiBzZW5kUmVxdWVzdCh1cmxzLnVwZGF0ZUdyaWRWaWV3U2V0dGluZ3MsICdwb3N0Jywge1xyXG4gICAgICAgIGlkOiByZXBvcnRJZCwgY29sdW1uc1NldHRpbmdzOiBKU09OLnN0cmluZ2lmeShzdGF0ZS5jb2x1bW5zKVxyXG4gICAgICB9LCBmYWxzZSwge1xyXG4gICAgICAgIGRhdGFUeXBlOiAnanNvbidcclxuICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldEdyaWRWaWV3U2V0dGluZ3M6IChyZXBvcnRJZDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIHJldHVybiBzZW5kUmVxdWVzdCh1cmxzLmdldEdyaWRWaWV3U2V0dGluZ3MsICdwb3N0JywgeyBpZDogcmVwb3J0SWQgfSwgZmFsc2UsIHtcclxuICAgICAgICBkYXRhVHlwZTogJ2pzb24nXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH07XHJcbn07XHJcblxyXG5jb25zdCBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgPSAoZXhjZXB0aW9uVHlwZTogRXhjZXB0aW9uVHlwZSk6IHN0cmluZyA9PiB7XHJcbiAgc3dpdGNoIChleGNlcHRpb25UeXBlKSB7XHJcbiAgICBjYXNlIEV4Y2VwdGlvblR5cGUuU3FsRXhjZXB0aW9uOlxyXG4gICAgICByZXR1cm4gJ1dlIGF0dGVtcHRlZCB0byBleGVjdXRlIHRoZSBkYXRhIHF1ZXJ5IGhvd2V2ZXIgaXQgYXBwZWFycyB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgZGF0YSBzb3VyY2UuIFBsZWFzZSBjb250YWN0IHRoZSByZXBvcnQgYXV0aG9yIHRvIGNvbmZpcm0gdGhlIGRhdGEgcmVxdWlyZW1lbnRzLic7XHJcblxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuICcnO1xyXG4gIH1cclxufTtcclxuIiwgImV4cG9ydCBpbnRlcmZhY2UgSVJlZnJlc2hPcHRpb25zIHtcclxuICBjYWxsYmFjazogKCkgPT4gdm9pZDtcclxuICBlbGFwc2VkQ2FsbGJhY2s6ICh0aW1lOiBudW1iZXIpID0+IHZvaWQ7XHJcbn1cclxuXHJcbmNvbnN0IHVwZGF0ZVRpbWVvdXQgPSAxMDA7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWZyZXNoVGltZXIge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FsbGJhY2s6ICgpID0+IHZvaWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBlbGFwc2VkQ2FsbGJhY2s6ICh0aW1lOiBudW1iZXIpID0+IHZvaWQ7XHJcbiAgcHJpdmF0ZSBhY3RpdmVUaW1lcklkOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgY3VycmVudEludGVydmFsOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgbGFzdFN0YXRlQ2hlY2tlZDogRGF0ZTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVJlZnJlc2hPcHRpb25zKSB7XHJcbiAgICB0aGlzLmVsYXBzZWRDYWxsYmFjayA9IG9wdGlvbnMuZWxhcHNlZENhbGxiYWNrO1xyXG4gICAgdGhpcy5jYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhcnQoaW50ZXJ2YWw6IG51bWJlcikge1xyXG4gICAgaWYgKGludGVydmFsIDw9IDApIHtcclxuICAgICAgdGhpcy5jYWxsYmFjaygpO1xyXG5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubGFzdFN0YXRlQ2hlY2tlZCA9IG5ldyBEYXRlKCk7XHJcbiAgICB0aGlzLmN1cnJlbnRJbnRlcnZhbCA9IGludGVydmFsO1xyXG5cclxuICAgIGNvbnN0IHRpbWVySWQgPSB0aGlzLmFjdGl2ZVRpbWVySWQgPSBNYXRoLnJhbmRvbSgpO1xyXG4gICAgaWYgKHRoaXMuY3VycmVudEludGVydmFsIDwgMCkge1xyXG4gICAgICB0aGlzLmVsYXBzZWRDYWxsYmFjayh0aGlzLmN1cnJlbnRJbnRlcnZhbCk7XHJcblxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50aWNrVGltZXJGdW5jdGlvbih0aW1lcklkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0cmlnZ2VyQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5sYXN0U3RhdGVDaGVja2VkID0gbmV3IERhdGUoKTtcclxuICAgIHRoaXMuY2FsbGJhY2soKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdGlja1RpbWVyRnVuY3Rpb24odGltZXJJZDogbnVtYmVyKSB7XHJcbiAgICBpZiAodGltZXJJZCAhPT0gdGhpcy5hY3RpdmVUaW1lcklkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG4gICAgLy9AdHMtaWdub3JlXHJcbiAgICBsZXQgdGltZVRvVXBkYXRlOiBudW1iZXIgPSB0aGlzLmN1cnJlbnRJbnRlcnZhbCAtIChuZXcgRGF0ZSgpIC0gdGhpcy5sYXN0U3RhdGVDaGVja2VkKTtcclxuICAgIGlmICh0aW1lVG9VcGRhdGUgPD0gMCkge1xyXG4gICAgICB0aW1lVG9VcGRhdGUgPSB0aGlzLmN1cnJlbnRJbnRlcnZhbCArIDk5OTtcclxuICAgICAgdGhpcy5jYWxsYmFjaygpO1xyXG4gICAgICB0aGlzLmxhc3RTdGF0ZUNoZWNrZWQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZWxhcHNlZENhbGxiYWNrKHRpbWVUb1VwZGF0ZSk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnRpY2tUaW1lckZ1bmN0aW9uKHRpbWVySWQpLCB1cGRhdGVUaW1lb3V0KTtcclxuICB9XHJcbn1cclxuIiwgImltcG9ydCBSZWZyZXNoQ29tcG9uZW50IGZyb20gJy4vSW5kZXgnO1xyXG5cclxuY29uc3QgZGVmYXVsdFJlZnJlc2hFbnRyaWVzOiBJUmVmcmVzaEVudHJ5W10gPSBbe1xyXG4gIHRpbWVvdXQ6IDAsXHJcbiAgdGV4dDogJ3JlZnJlc2ggbm93JyxcclxuICByZWZyZXNoVGVtcGxhdGU6ICcnLFxyXG59LCB7XHJcbiAgdGltZW91dDogMTUgKiAxMDAwLFxyXG4gIHRleHQ6ICcxNSBzZWMnLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogJ0F1dG8gVXBkYXRlICglKScsXHJcbn0sIHtcclxuICB0aW1lb3V0OiAzMCAqIDEwMDAsXHJcbiAgdGV4dDogJzMwIHNlYycsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGUgKCUpJyxcclxufSwge1xyXG4gIHRpbWVvdXQ6IDYwICogMTAwMCxcclxuICB0ZXh0OiAnMSBtaW4nLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogJ0F1dG8gVXBkYXRlICglKScsXHJcbn0sIHtcclxuICB0aW1lb3V0OiAxODAgKiAxMDAwLFxyXG4gIHRleHQ6ICczIG1pbicsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGUgKCUpJyxcclxufSwge1xyXG4gIHRpbWVvdXQ6IDMwMCAqIDEwMDAsXHJcbiAgdGV4dDogJzUgbWluJyxcclxuICByZWZyZXNoVGVtcGxhdGU6ICdBdXRvIFVwZGF0ZSAoJSknLFxyXG59LCB7XHJcbiAgdGltZW91dDogNjAwICogMTAwMCxcclxuICB0ZXh0OiAnMTAgbWluJyxcclxuICByZWZyZXNoVGVtcGxhdGU6ICdBdXRvIFVwZGF0ZSAoJSknLFxyXG59LCB7XHJcbiAgdGltZW91dDogLTEsXHJcbiAgdGV4dDogJ29mZicsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGU6IG9mZicsXHJcbiAgaXNEZWZhdWx0OiB0cnVlXHJcbn1dO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUmVmcmVzaEVudHJ5IHtcclxuICB0aW1lb3V0OiBudW1iZXIsXHJcbiAgdGV4dDogc3RyaW5nLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogc3RyaW5nLFxyXG4gIGlzRGVmYXVsdD86IGJvb2xlYW5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVmcmVzaEJ1dHRvbiB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkcm9wRG93bkJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHRNZW51OiBEZXZFeHByZXNzLnVpLmR4Q29udGV4dE1lbnU7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZWZyZXNoQ29tcG9uZW50OiBSZWZyZXNoQ29tcG9uZW50O1xyXG4gIHByaXZhdGUgbWVudUlzT3BlbmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBzZWxlY3RlZEVudHJ5OiBJUmVmcmVzaEVudHJ5O1xyXG5cclxuICBjb25zdHJ1Y3RvcigkdGFyZ2V0OiBKUXVlcnksIGNhbGxiYWNrOiAoKSA9PiB2b2lkLCByZWZyZXNoRW50cmllczogSVJlZnJlc2hFbnRyeVtdIHwgbnVsbCA9IGRlZmF1bHRSZWZyZXNoRW50cmllcykge1xyXG4gICAgdGhpcy5yZWZyZXNoQ29tcG9uZW50ID0gbmV3IFJlZnJlc2hDb21wb25lbnQoeyBjYWxsYmFjaywgZWxhcHNlZENhbGxiYWNrOiAoZSkgPT4gdGhpcy5lbGFwc2VkQ2FsbGJhY2soZSkgfSk7XHJcbiAgICB0aGlzLnNlbGVjdGVkRW50cnkgPSByZWZyZXNoRW50cmllcy5maW5kKChlKSA9PiBlLmlzRGVmYXVsdCkgfHwgcmVmcmVzaEVudHJpZXMuZmlsdGVyKChlKSA9PiAhIWUudGltZW91dClbMF07XHJcblxyXG4gICAgdGhpcy5jb250ZXh0TWVudSA9ICQoJzxkaXYgLz4nKS5keENvbnRleHRNZW51KHtcclxuICAgICAgZGF0YVNvdXJjZTogcmVmcmVzaEVudHJpZXMsXHJcbiAgICAgIHRhcmdldDogJHRhcmdldCxcclxuICAgICAgcG9zaXRpb246IHsgbXk6ICdyaWdodCB0b3AnLCBhdDogJ3JpZ2h0IGJvdHRvbScgfSxcclxuICAgICAgb25JdGVtQ2xpY2s6IChlKSA9PiB7XHJcbiAgICAgICAgaWYoIShlLml0ZW1EYXRhIGFzIGFueSkudGltZW91dCkge1xyXG4gICAgICAgICAgZS5jb21wb25lbnQuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFbnRyeSA9IGUuaXRlbURhdGEgYXMgSVJlZnJlc2hFbnRyeTtcclxuICAgICAgICAgIGUuY29tcG9uZW50LnNlbGVjdEl0ZW0odGhpcy5zZWxlY3RlZEVudHJ5IGFzIGFueSk7XHJcbiAgICAgICAgICB0aGlzLnJlZnJlc2hDb21wb25lbnQuc3RhcnQoKGUuaXRlbURhdGEgYXMgYW55KS50aW1lb3V0KTtcclxuICAgICAgICAgIGUuY29tcG9uZW50LmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uSGlkZGVuOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tZW51SXNPcGVuZWQgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgICAgb25TaG93bjogKGUpID0+IHtcclxuICAgICAgICB0aGlzLm1lbnVJc09wZW5lZCA9IHRydWU7XHJcbiAgICAgICAgKGUuY29tcG9uZW50IGFzIGFueSkuaXRlbXNDb250YWluZXIoKVswXS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2lzem9sZWEtdGhlbWUnKTtcclxuICAgICAgfSxcclxuICAgICAgaXRlbVRlbXBsYXRlOiAoZW50cnkpID0+IGVudHJ5LnRleHQsXHJcblxyXG4gICAgICBjc3NDbGFzczogJ2lzem9sZWEtdGhlbWUnXHJcbiAgICB9KS5hcHBlbmRUbygnYm9keScpLmR4Q29udGV4dE1lbnUoJ2luc3RhbmNlJyk7XHJcbiAgICB0aGlzLmNvbnRleHRNZW51LnNlbGVjdEl0ZW0odGhpcy5zZWxlY3RlZEVudHJ5IGFzIGFueSk7XHJcblxyXG4gICAgdGhpcy5kcm9wRG93bkJ1dHRvbiA9ICR0YXJnZXQuZHhCdXR0b24oe1xyXG4gICAgICB0ZXh0OiB0aGlzLnNlbGVjdGVkRW50cnkudGV4dCxcclxuICAgICAgdGVtcGxhdGU6IChidXR0b25EYXRhLCBjb250ZW50KSA9PiB7XHJcbiAgICAgICAgJCgnPGkgLz4nKS5hZGRDbGFzcygnZHgtaWNvbiBkeC1pY29uLXJlZnJlc2gnKS5hcHBlbmRUbyhjb250ZW50KTtcclxuICAgICAgICAkKCc8c3Bhbj4nKS5hZGRDbGFzcygnYnV0dG9uLXdpdGgtZXhwYW5kLXRleHQnKS50ZXh0KGJ1dHRvbkRhdGEudGV4dCkuYXBwZW5kVG8oY29udGVudCk7XHJcbiAgICAgICAgJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ2J1dHRvbi13aXRoLWV4cGFuZC1pY29uIGlzb3otaWNvbi0xNiBpc296LWljb24tYXJyb3ctZG93bi0xNicpLmFwcGVuZFRvKGNvbnRlbnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gY29udGVudDtcclxuICAgICAgfSxcclxuICAgICAgZWxlbWVudEF0dHI6IHtcclxuICAgICAgICBjbGFzczogJ2lzem9sZWEtbWQgYnV0dG9uLXdpdGgtZXhwYW5kJ1xyXG4gICAgICB9LFxyXG5cclxuICAgICAgb25DbGljazogKGUpID0+IHtcclxuICAgICAgICB0aGlzLmNvbnRleHRNZW51LmVsZW1lbnQoKS53aWR0aCgkdGFyZ2V0Lm91dGVyV2lkdGgoKSk7XHJcbiAgICAgICAgaWYgKHRoaXMubWVudUlzT3BlbmVkKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRleHRNZW51LmhpZGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5jb250ZXh0TWVudS5zaG93KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KS5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuXHJcbiAgICAodGhpcy5zZWxlY3RlZEVudHJ5LnRpbWVvdXQgPiAwKSAmJiB0aGlzLnJlZnJlc2hDb21wb25lbnQuc3RhcnQodGhpcy5zZWxlY3RlZEVudHJ5LnRpbWVvdXQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlZnJlc2hDb21wb25lbnQudHJpZ2dlckNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbGFwc2VkQ2FsbGJhY2sodGltZVRvVXBkYXRlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuZHJvcERvd25CdXR0b24ub3B0aW9uKCd0ZXh0JywgdGhpcy5zZWxlY3RlZEVudHJ5LnJlZnJlc2hUZW1wbGF0ZS5yZXBsYWNlKCclJywgTWF0aC5mbG9vcih0aW1lVG9VcGRhdGUgLyAxMDAwKS50b1N0cmluZygpKSk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgZ3JpZENvbHVtblR5cGVzIGZyb20gJy4uLy4uL0J1c2luZXNzL0dyaWRDb2x1bW5UeXBlcyc7XHJcbmltcG9ydCB7aW5pdFBvcG92ZXJ9IGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVwb3J0RGV0YWlsc1BvcG92ZXInO1xyXG5pbXBvcnQge0lHcmlkUmVwb3J0UGFyYW1zLCBJUmVwb3J0UGFyYW1zfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IEdSSURfSU5ESUNBVE9SX1NUQVRFIGZyb20gJy4vR3JpZEluZGljYXRvclN0YXRlJztcclxuaW1wb3J0IGRlZmF1bHRHcmlkIGZyb20gJy4uLy4uLy4uL1dpZGdldHMvR3JpZC9EZWZhdWx0R3JpZCc7XHJcbmltcG9ydCBHcmlkU3RhdGVNYW5hZ2VyIGZyb20gJy4vR3JpZFN0YXRlTWFuYWdlcic7XHJcbmltcG9ydCBHcmlkTW9kZSBmcm9tICcuL01vZGUnO1xyXG5pbXBvcnQge2NyZWF0ZUdyaWREYXRhTGF5ZXIsIElHcmlkRGF0YUxheWVyfSBmcm9tICcuLi8uLi9EYXRhL0luZGV4JztcclxuaW1wb3J0IHtHcmlkRGF0YUNvbHVtbkRhdGFUeXBlLCBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZSwgSUdyaWRTdGF0ZX0gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9JR3JpZFN0YXRlJztcclxuaW1wb3J0IHtJUmVwb3J0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcclxuaW1wb3J0IFJlZnJlc2hCdXR0b24gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZWZyZXNoVGltZXIvQnV0dG9uJztcclxuXHJcbmNvbnN0IFJFU0VUX1NBVkVEX0lORElDQVRPUl9USU1FT1VUID0gMzAwMDtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRPcHRpb25zIHtcclxuICBncmlkUG9zaXRpb25NYXJrZXI6IEpRdWVyeTtcclxuICByZXBvcnRQYXJhbXM6IElHcmlkUmVwb3J0UGFyYW1zO1xyXG4gIGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBhZGRSZWZyZXNoQnV0dG9uOiBib29sZWFuO1xyXG4gIGdyaWRSZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmc7XHJcbiAgc2hvd0hlYWRlcj86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdyaWQgaW1wbGVtZW50cyBJUmVwb3J0Q29tcG9uZW50IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWRQb3NpdGlvbk1hcmtlcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVwb3J0UGFyYW1zOiBJR3JpZFJlcG9ydFBhcmFtcztcclxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWRSZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93SGVhZGVyOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxuXHJcbiAgcHJpdmF0ZSBjdXJyZW50R3JpZE1vZGU6IEdyaWRNb2RlIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzaG93QWxsRGF0YUluRWRpdCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgbG9hZGluZ1RpbWVvdXQgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgcG9wb3ZlcjogRGV2RXhwcmVzcy51aS5keFBvcG92ZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBncmlkU3RhdGVNYW5hZ2VyOiBHcmlkU3RhdGVNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSAkZ3JpZFN0YXRlSW5kaWNhdG9yOiBKUXVlcnkgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlICRncmlkRXJyb3JQbGFjZWhvbGRlcjogSlF1ZXJ5IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSAkZ3JpZFRhcmdldEVsZW1lbnQ6IEpRdWVyeSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgJHJlc2V0U2V0dGluZ1RhcmdldEVsZW1lbnQ6IEpRdWVyeSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgZ3JpZFN0YXRlSW5kaWNhdG9yVGltZW91dDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBkYXRhTGF5ZXI6IElHcmlkRGF0YUxheWVyO1xyXG4gIHByaXZhdGUgZWRpdFdpZHRoRWRpdEJveGVzOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveFtdIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgZ3JpZFJlcGFpbnRRdWV1ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGNvbHVtbk5hbWVzVXBkYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcmVmcmVzaEJ1dHRvbjogUmVmcmVzaEJ1dHRvbiB8IG51bGwgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJR3JpZE9wdGlvbnMpIHtcclxuICAgIHRoaXMuZ3JpZFBvc2l0aW9uTWFya2VyID0gb3B0aW9ucy5ncmlkUG9zaXRpb25NYXJrZXI7XHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy5hbGxvd0VkaXRpbmcgPSBvcHRpb25zLmFsbG93RWRpdGluZztcclxuICAgIHRoaXMuYWRkUmVmcmVzaEJ1dHRvbiA9IG9wdGlvbnMuYWRkUmVmcmVzaEJ1dHRvbjtcclxuICAgIHRoaXMuZ3JpZFJlcG9ydENvbnRyb2xsZXJVcmwgPSBvcHRpb25zLmdyaWRSZXBvcnRDb250cm9sbGVyVXJsO1xyXG4gICAgdGhpcy5zaG93SGVhZGVyID0gb3B0aW9ucy5zaG93SGVhZGVyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuY3VycmVudEdyaWRNb2RlKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudEdyaWRNb2RlID0gR3JpZE1vZGUuVmlldztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluaXRJbnRlcm5hbCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyaWQucmVmcmVzaCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyaWQ/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuZ3JpZCA9IG51bGw7XHJcblxyXG4gICAgdGhpcy5jdXJyZW50R3JpZE1vZGUgPSBudWxsO1xyXG4gICAgdGhpcy4kcmVzZXRTZXR0aW5nVGFyZ2V0RWxlbWVudD8ucmVtb3ZlKCk7XHJcbiAgICB0aGlzLiRncmlkVGFyZ2V0RWxlbWVudD8ucmVtb3ZlKCk7XHJcblxyXG4gICAgdGhpcy5wb3BvdmVyPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnBvcG92ZXIgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0SW50ZXJuYWwoKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICAgIHRoaXMuZGF0YUxheWVyID0gY3JlYXRlR3JpZERhdGFMYXllcih0aGlzLmdyaWRSZXBvcnRDb250cm9sbGVyVXJsKTtcclxuXHJcbiAgICBpZiAodGhpcy4kZ3JpZFRhcmdldEVsZW1lbnQpIHtcclxuICAgICAgdGhpcy4kZ3JpZFRhcmdldEVsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy4kZ3JpZFRhcmdldEVsZW1lbnQgPSAkKCc8ZGl2IC8+JykuaW5zZXJ0QWZ0ZXIodGhpcy5ncmlkUG9zaXRpb25NYXJrZXIpO1xyXG5cclxuICAgIHRoaXMuZ3JpZFN0YXRlTWFuYWdlciA9IG5ldyBHcmlkU3RhdGVNYW5hZ2VyKHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkLCB0aGlzLmRhdGFMYXllcik7XHJcblxyXG4gICAgdGhpcy4kZ3JpZEVycm9yUGxhY2Vob2xkZXIgPSAkKCc8ZGl2IC8+JykudGV4dCgnRGF0YSBsb2FkaW5nIGZhaWxlZC4nKS5hZGRDbGFzcygnZHgtZGF0YWdyaWQtbm9kYXRhJykuY3NzKHsgekluZGV4OiAxIH0pO1xyXG4gICAgdGhpcy4kZ3JpZEVycm9yUGxhY2Vob2xkZXIuYXBwZW5kVG8odGhpcy5ncmlkUG9zaXRpb25NYXJrZXIpO1xyXG4gICAgdGhpcy4kZ3JpZEVycm9yUGxhY2Vob2xkZXIuaGlkZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKSB7XHJcbiAgICAgIC8vIFRPRE86IGVsZW1lbnQgc2VsZWN0b3IgYXMgYSBwYXJhbVxyXG4gICAgICB0aGlzLnBvcG92ZXIgPSBpbml0UG9wb3ZlcignLnJlcG9ydC1kZXRhaWxzLWxpbmsnLCB0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVkaXRXaWR0aEVkaXRCb3hlcyA9IFtdO1xyXG4gICAgY29uc3QgZ3JpZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgPSB7XHJcbiAgICAgIGRhdGFTb3VyY2U6IHRoaXMuY3JlYXRlRGF0YVNvdXJjZSh0aGlzLnJlcG9ydFBhcmFtcywgdGhpcy5jdXJyZW50R3JpZE1vZGUsIHRoaXMuc2hvd0FsbERhdGFJbkVkaXQpLFxyXG4gICAgICBlbGVtZW50QXR0cjogeyBjbGFzczogdGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQgPyAnZWRpdC1tb2RlJyA6ICd2aWV3LW1vZGUnIH0sXHJcbiAgICAgIHJlcGFpbnRDaGFuZ2VzT25seTogdHJ1ZSxcclxuICAgICAgb25Ub29sYmFyUHJlcGFyaW5nOiAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZS50b29sYmFyT3B0aW9ucy5pdGVtcztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5WaWV3ICYmIHRoaXMuYWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgICAgICBjb25zdCBzZWFyY2hQYW5lbCA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5uYW1lID09PSAnc2VhcmNoUGFuZWwnKVswXTtcclxuICAgICAgICAgIGNvbnN0IHNlYXJjaFBhbmVsSW5kZXggPSBpdGVtcy5pbmRleE9mKHNlYXJjaFBhbmVsKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBzd2l0Y2hUb0VkaXRCdG4gPSB7XHJcbiAgICAgICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnU3dpdGNoIHRvIEVkaXQgTW9kZScsXHJcbiAgICAgICAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy5zd2l0Y2hUb01vZGUoR3JpZE1vZGUuRWRpdCksXHJcbiAgICAgICAgICAgICAgaWNvbjogJ3N3aXRjaC10by1lZGl0LW1vZGUnLFxyXG4gICAgICAgICAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdpc3pvbGVhLW1kJ31cclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW07XHJcblxyXG4gICAgICAgICAgaXRlbXMuc3BsaWNlKHNlYXJjaFBhbmVsSW5kZXgsIDEpO1xyXG4gICAgICAgICAgaXRlbXMucHVzaChzd2l0Y2hUb0VkaXRCdG4pO1xyXG4gICAgICAgICAgaXRlbXMucHVzaChzZWFyY2hQYW5lbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQpIHtcclxuICAgICAgICAgIGNvbnN0IGNvbHVtbkNob29zZXJCdG4gPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gJ2NvbHVtbkNob29zZXJCdXR0b24nKVswXTtcclxuICAgICAgICAgIGNvbnN0IGNvbHVtbnRDaG9vc2VyQnRuSW5kZXggPSBpdGVtcy5pbmRleE9mKGNvbHVtbkNob29zZXJCdG4pO1xyXG5cclxuICAgICAgICAgIGNvbnN0IHNob3dEYXRhSXRlbSA9IHtcclxuICAgICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgJGNvbnRhaW5lciA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAgICAgLmNzcyh7XHJcbiAgICAgICAgICAgICAgICAgIGJvcmRlcjogJzFweCAjZTBlMGUwIHNvbGlkJyxcclxuICAgICAgICAgICAgICAgICAgcGFkZGluZzogJzNweCA2cHgnLFxyXG4gICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICc0cHgnLFxyXG4gICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAnd2hpdGUnLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICQoJzxzcGFuIC8+JylcclxuICAgICAgICAgICAgICAgIC5jc3MoeyBtYXJnaW46ICcwIDVweCAwIDAnLCB3aWR0aDogJzU0cHgnIH0pXHJcbiAgICAgICAgICAgICAgICAuZHhTd2l0Y2goe1xyXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5zaG93QWxsRGF0YUluRWRpdCxcclxuICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6ICh7IHZhbHVlIH0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dBbGxEYXRhSW5FZGl0ID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkLm9wdGlvbignZGF0YVNvdXJjZScsIHRoaXMuY3JlYXRlRGF0YVNvdXJjZSh0aGlzLnJlcG9ydFBhcmFtcywgdGhpcy5jdXJyZW50R3JpZE1vZGUsIHRoaXMuc2hvd0FsbERhdGFJbkVkaXQpKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWQucmVmcmVzaCgpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgICAkKCc8c3BhbiAvPicpLnRleHQoJ1Nob3cgYWxsIGRhdGEgJykuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0ICRoaW50VGFyZ2V0ID0gJCgnPGEgLz4nKVxyXG4gICAgICAgICAgICAgICAgLmNzcyh7IHRleHREZWNvcmF0aW9uOiAndW5kZXJsaW5lJywgY29sb3I6ICdibHVlJyB9KVxyXG4gICAgICAgICAgICAgICAgLnRleHQoJyg/KScpXHJcbiAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICAgICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAgICAgLnRleHQoYElmIHRoZSB0YWJsZSBjb250YWlucyBhIGxvdCBvZiBjb2x1bW5zIHNob3dpbmcgYWxsIGRhdGEgY2FuIGxlYWQgdG8gc2xvdyBwYWdlIHBlcmZvcm1hbmNlIHdoZW4geW91J3JlIGVkaXRpbmcgdGhlIGdyaWQuXHJcbkJ5IGRlZmF1bHQgZ3JpZCBzaG93cyBvbmx5IGZpcnN0IDEwIHJvd3MgaW4gdGhlIEVkaXQgbW9kZS5gKVxyXG4gICAgICAgICAgICAgICAgLmR4UG9wb3Zlcih7XHJcbiAgICAgICAgICAgICAgICAgIHRhcmdldDogJGhpbnRUYXJnZXQsXHJcbiAgICAgICAgICAgICAgICAgIHNob3dFdmVudDogJ21vdXNlZW50ZXInLFxyXG4gICAgICAgICAgICAgICAgICBoaWRlRXZlbnQ6ICdtb3VzZWxlYXZlJyxcclxuICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICd0b3AnLFxyXG4gICAgICAgICAgICAgICAgICB3aWR0aDogNTAwXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gJGNvbnRhaW5lcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW07XHJcblxyXG4gICAgICAgICAgY29uc3Qgc3dpdGNoVG9WaWV3QnRuID0ge1xyXG4gICAgICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ1N3aXRjaCB0byBWaWV3IE1vZGUnLFxyXG4gICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHRoaXMuc3dpdGNoVG9Nb2RlKEdyaWRNb2RlLlZpZXcpLFxyXG4gICAgICAgICAgICAgIGljb246ICdzd2l0Y2gtdG8tdmlldy1tb2RlJyxcclxuICAgICAgICAgICAgICBlbGVtZW50QXR0cjoge2NsYXNzOiAnaXN6b2xlYS1tZCd9XHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtO1xyXG5cclxuICAgICAgICAgIGl0ZW1zLnNwbGljZShjb2x1bW50Q2hvb3NlckJ0bkluZGV4LCAxKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBleHBvcnRCdG4gPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gJ2V4cG9ydEJ1dHRvbicpWzBdO1xyXG4gICAgICAgICAgY29uc3QgZXhwb3J0QnRuSW5kZXggPSBpdGVtcy5pbmRleE9mKGV4cG9ydEJ0bik7XHJcblxyXG4gICAgICAgICAgaXRlbXMuc3BsaWNlKGV4cG9ydEJ0bkluZGV4LCAxKTtcclxuXHJcbiAgICAgICAgICBpdGVtcy5wdXNoKHNob3dEYXRhSXRlbSk7XHJcbiAgICAgICAgICBpdGVtcy5wdXNoKHN3aXRjaFRvVmlld0J0bik7XHJcbiAgICAgICAgICBpdGVtcy5wdXNoKGNvbHVtbkNob29zZXJCdG4pO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGVkaXRTdGF0dXMgPSB7XHJcbiAgICAgICAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLiRncmlkU3RhdGVJbmRpY2F0b3IgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnZWRpdC1ncmlkLXN0YXRlJyk7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlR3JpZFN0YXRlSW5kaWNhdG9yKEdSSURfSU5ESUNBVE9SX1NUQVRFLmVkaXQpO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kZ3JpZFN0YXRlSW5kaWNhdG9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbTtcclxuXHJcbiAgICAgICAgICBpdGVtcy51bnNoaWZ0KGVkaXRTdGF0dXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYWRkUmVmcmVzaEJ1dHRvbikge1xyXG4gICAgICAgICAgY29uc3QgcmVmcmVzaEJ0biA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5uYW1lID09PSAncmVmcmVzaCcpWzBdO1xyXG4gICAgICAgICAgY29uc3QgcmVmcmVzaEJ0bkluZGV4ID0gaXRlbXMuaW5kZXhPZihyZWZyZXNoQnRuKTtcclxuXHJcbiAgICAgICAgICBpdGVtc1tyZWZyZXNoQnRuSW5kZXhdID0ge1xyXG4gICAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCAkY29udGFpbmVyID0gJCgnPGRpdiAvPicpO1xyXG4gICAgICAgICAgICAgIHRoaXMucmVmcmVzaEJ1dHRvbiA9IG5ldyBSZWZyZXNoQnV0dG9uKCRjb250YWluZXIsICgpID0+IHRoaXMucmVmcmVzaCgpKTtcclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuICRjb250YWluZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25DZWxsUHJlcGFyZWQ6ICh7IHJvd1R5cGUsIGNvbHVtbiwgY2VsbEVsZW1lbnQgfSkgPT4ge1xyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgaWYgKHJvd1R5cGUgPT09ICdoZWFkZXInICYmICFjb2x1bW4uY29tbWFuZCkge1xyXG4gICAgICAgICAgY29uc3QgZGF0YUZpZWxkID0gY29sdW1uLmRhdGFGaWVsZDtcclxuICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxTZXR0aW5ncyA9IHRoaXMuZ3JpZFN0YXRlTWFuYWdlci5nZXRDb2x1bW5BZGRpdGlvbmFsU2V0dGluZ3MoZGF0YUZpZWxkKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmluaXRHcmlkSGVhZGVyQ2VsbChjZWxsRWxlbWVudCwgYWRkaXRpb25hbFNldHRpbmdzKTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0R3JpZEhlYWRlckNlbGxFZGl0UGFuZWwoY29sdW1uLCBjZWxsRWxlbWVudCwgYWRkaXRpb25hbFNldHRpbmdzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBvbkNvbnRlbnRSZWFkeTogKGUpID0+IHtcclxuICAgICAgICBjb25zdCBjdXJyZW50R3JpZCA9IGUuY29tcG9uZW50O1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZTogSUdyaWRTdGF0ZSA9IGN1cnJlbnRHcmlkLnN0YXRlKCk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5jb2x1bW5OYW1lc1VwZGF0ZWQpIHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlQ29sdW1uTmFtaW5nKGN1cnJlbnRTdGF0ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIE5PVEU6IGNvbHVtbiBuYW1lIHVwZGF0aW5nIHRyaWdnZXJzIG9uQ29udGVudFJlYWR5IGV2ZW50IHJhaXNpbmcgYWdhaW4uXHJcbiAgICAgICAgICAvLyBXZSBuZWVkIG5vdCB0byBleGV1Y3V0ZSB0aGUgc2FtZSBvbmUgbW9yZSB0aW1lLlxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4gY3VycmVudEdyaWQuZW5kQ3VzdG9tTG9hZGluZygpKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlICE9PSBHcmlkTW9kZS5FZGl0KSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBuZXdDb2x1bW5zID0gdGhpcy5ncmlkU3RhdGVNYW5hZ2VyLmNoZWNrTmV3Q29sdW1ucyhjdXJyZW50U3RhdGUpO1xyXG5cclxuICAgICAgICBuZXdDb2x1bW5zLmZvckVhY2goKGNvbHVtbk5hbWUpID0+IGUuY29tcG9uZW50LmNvbHVtbk9wdGlvbihjb2x1bW5OYW1lLCAndmlzaWJsZScsIGZhbHNlKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbHVtbkNhcHRpb25zID0gdGhpcy5ncmlkU3RhdGVNYW5hZ2VyLmdldENvbHVtbkNhcHRpb25zKCk7XHJcblxyXG4gICAgICAgIGNvbHVtbkNhcHRpb25zLmZvckVhY2goKGMpID0+IHtcclxuICAgICAgICAgIGlmIChjLmNhcHRpb24gJiYgY3VycmVudEdyaWQuY29sdW1uT3B0aW9uKGMuZGF0YUZpZWxkLCAnY2FwdGlvbicpICE9PSBjLmNhcHRpb24pIHtcclxuICAgICAgICAgICAgY3VycmVudEdyaWQuY29sdW1uT3B0aW9uKGMuZGF0YUZpZWxkLCAnY2FwdGlvbicsIGMuY2FwdGlvbik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIHN0YXRlU3RvcmluZzoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgdHlwZTogJ2N1c3RvbScsXHJcbiAgICAgICAgY3VzdG9tTG9hZDogKCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZFN0YXRlTWFuYWdlci5sb2FkKHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0LCAob3V0ZGF0ZWRDb2x1bW5zKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5ncmlkLnN0YXRlKCk7XHJcblxyXG4gICAgICAgICAgICBzdGF0ZS5jb2x1bW5zID0gKHN0YXRlLmNvbHVtbnMgYXMgYW55W10pLmZpbHRlcigoY29sdW1uKSA9PiBvdXRkYXRlZENvbHVtbnMuaW5kZXhPZihjb2x1bW4uZGF0YUZpZWxkKSA8IDApO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5ncmlkLnN0YXRlKHN0YXRlKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY3VzdG9tU2F2ZTogKHN0YXRlKSA9PiB0aGlzLnNhdmVHcmlkU3RhdGUoc3RhdGUpXHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBmaWx0ZXJSb3c6IHsgdmlzaWJsZTogdGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLlZpZXcsIGFwcGx5RmlsdGVyOiAnb25DbGljaycgfSxcclxuICAgICAgaGVhZGVyRmlsdGVyOiB7IHZpc2libGU6IHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5WaWV3IH0sXHJcbiAgICAgIHNlYXJjaFBhbmVsOiB7IHZpc2libGU6IHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5WaWV3IH0sXHJcbiAgICAgIGVycm9yUm93RW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIGFsbG93Q29sdW1uUmVzaXppbmc6IHRydWUsXHJcbiAgICAgIHNvcnRpbmc6IHsgbW9kZTogJ211bHRpcGxlJyB9LFxyXG4gICAgICBncm91cFBhbmVsOiB7IHZpc2libGU6IHRydWUgfSxcclxuICAgICAgZ3JvdXBpbmc6IHsgYXV0b0V4cGFuZEFsbDogZmFsc2UgfSxcclxuICAgICAgYWxsb3dDb2x1bW5SZW9yZGVyaW5nOiB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCxcclxuICAgICAgY29sdW1uQ2hvb3NlcjogeyBlbmFibGVkOiB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCB9LFxyXG4gICAgICBzaG93Q29sdW1uSGVhZGVyczogdHJ1ZSxcclxuICAgICAga2V5Ym9hcmROYXZpZ2F0aW9uOiB7ZW5hYmxlZDogZmFsc2V9LFxyXG5cclxuICAgICAgc2hvd0JvcmRlcnM6IHRydWUsXHJcbiAgICAgIHBhZ2luZzogeyBwYWdlU2l6ZTogNTAsIGVuYWJsZWQ6IHRydWUgfSxcclxuICAgICAgcmVtb3RlT3BlcmF0aW9uczogdHJ1ZSxcclxuXHJcbiAgICAgIHN1bW1hcnk6IHRoaXMucmVwb3J0UGFyYW1zLlRvdGFsU3VtbWFyeUNvbHVtbiA/IHtcclxuICAgICAgICB0b3RhbEl0ZW1zOiBbe1xyXG4gICAgICAgICAgY29sdW1uOiB0aGlzLnJlcG9ydFBhcmFtcy5Ub3RhbFN1bW1hcnlDb2x1bW4sXHJcbiAgICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xyXG4gICAgICAgIH1dXHJcbiAgICAgIH0gOiB1bmRlZmluZWQsXHJcblxyXG4gICAgICBvbkVkaXRvclByZXBhcmluZyhlKSB7XHJcbiAgICAgICAgaWYgKGUucGFyZW50VHlwZSA9PT0gJ2ZpbHRlclJvdycpIHtcclxuICAgICAgICAgIGNvbnN0IGFwcGx5ID0gKCkgPT4gZS5lbGVtZW50LmZpbmQoJy5keC1hcHBseS1idXR0b24nKS50cmlnZ2VyKCdkeGNsaWNrJyk7XHJcblxyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uRW50ZXJLZXkgPSBhcHBseTtcclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vbkZvY3VzT3V0ID0gYXBwbHk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChlLnBhcmVudFR5cGUgPT09ICdzZWFyY2hQYW5lbCcpIHtcclxuICAgICAgICAgIGNvbnN0IGFwcGx5U2VhcmNoOiBEZXZFeHByZXNzLnVpLmR4VGV4dEVkaXRvci5Qcm9wZXJ0aWVzWydvbkVudGVyS2V5J10gPSAoYXJncykgPT4ge1xyXG4gICAgICAgICAgICBlLmNvbXBvbmVudC5zZWFyY2hCeVRleHQoYXJncy5jb21wb25lbnQub3B0aW9uKCd2YWx1ZScpKTtcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uVmFsdWVDaGFuZ2VkID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uRW50ZXJLZXkgPSBhcHBseVNlYXJjaDtcclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vbkZvY3VzT3V0ID0gYXBwbHlTZWFyY2g7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZ3JpZCA9IGRlZmF1bHRHcmlkKHRoaXMuJGdyaWRUYXJnZXRFbGVtZW50LCB7XHJcbiAgICAgIG9wdGlvbnM6IGdyaWRPcHRpb25zLFxyXG4gICAgICBleHBvcnRGaWxlTmFtZTogdGhpcy5yZXBvcnRQYXJhbXMuTmFtZSxcclxuICAgICAgdGl0bGU6IHRoaXMuc2hvd0hlYWRlciA/IHRoaXMucmVwb3J0UGFyYW1zLk5hbWUgOiBudWxsLFxyXG4gICAgICBoZWFkZXJEZXNjcmlwdGlvbjogdGhpcy5zaG93SGVhZGVyID8gdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyA6IG51bGxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuJHJlc2V0U2V0dGluZ1RhcmdldEVsZW1lbnQ/LnJlbW92ZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCkge1xyXG4gICAgICB0aGlzLiRyZXNldFNldHRpbmdUYXJnZXRFbGVtZW50ID0gJCgnPHNwYW4gLz4nKVxyXG4gICAgICAgIC5jc3Moe1xyXG4gICAgICAgICAgZmxvYXQ6ICdyaWdodCcsXHJcbiAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcclxuICAgICAgICAgIGJvdHRvbTogJzhweCdcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5hZGRDbGFzcygnaXN6b2xlYS1tZCcpXHJcbiAgICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICAgIHRleHQ6ICdSZXNldCBzZXR0aW5ncycsXHJcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB0aGlzLnJlc2V0U2V0dGluZ3MoKSxcclxuICAgICAgICAgIGljb246ICdyZXNldC1ncmlkLXNldHRpbmdzJ1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmFwcGVuZFRvKCdmb290ZXInKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5ncmlkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVHcmlkU3RhdGVJbmRpY2F0b3Ioc3RhdGU6IHN0cmluZykge1xyXG4gICAgT2JqZWN0LmtleXMoR1JJRF9JTkRJQ0FUT1JfU1RBVEUpLmZvckVhY2goKHMpID0+IHRoaXMuJGdyaWRTdGF0ZUluZGljYXRvci5yZW1vdmVDbGFzcyhHUklEX0lORElDQVRPUl9TVEFURVtzXSkpO1xyXG5cclxuICAgIHRoaXMuJGdyaWRTdGF0ZUluZGljYXRvci5hZGRDbGFzcyhzdGF0ZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuZ3JpZFN0YXRlSW5kaWNhdG9yVGltZW91dCkge1xyXG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZ3JpZFN0YXRlSW5kaWNhdG9yVGltZW91dCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN0YXRlID09PSBHUklEX0lORElDQVRPUl9TVEFURS5zYXZlZCkge1xyXG4gICAgICB0aGlzLmdyaWRTdGF0ZUluZGljYXRvclRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVHcmlkU3RhdGVJbmRpY2F0b3IoR1JJRF9JTkRJQ0FUT1JfU1RBVEUuZWRpdCk7XHJcbiAgICAgIH0sIFJFU0VUX1NBVkVEX0lORElDQVRPUl9USU1FT1VUKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgdGl0bGUgPSAnJztcclxuXHJcbiAgICBzd2l0Y2ggKHN0YXRlKSB7XHJcbiAgICAgIGNhc2UgR1JJRF9JTkRJQ0FUT1JfU1RBVEUuZWRpdDpcclxuICAgICAgICB0aXRsZSA9ICdFZGl0IG1vZGUnO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBHUklEX0lORElDQVRPUl9TVEFURS5zYXZlZDpcclxuICAgICAgICB0aXRsZSA9ICdTYXZlZCc7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEdSSURfSU5ESUNBVE9SX1NUQVRFLnNhdmluZzpcclxuICAgICAgICB0aXRsZSA9ICdTYXZpbmcnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuJGdyaWRTdGF0ZUluZGljYXRvci5hdHRyKCd0aXRsZScsIHRpdGxlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQ29sdW1uTmFtaW5nKHN0YXRlOiBJR3JpZFN0YXRlKSB7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGhcclxuICAgIC8vIEhBQ0s6IERldkV4dHJlbWUgZ3JpZCBkb2Vzbid0IHNob3cgY29sdW1ucyBkYXRhIGlmIGEgZGF0YUZpZWxkIGhhcyBzcGVjaWFsIHN5bWJvbHMuXHJcbiAgICAvLyBTZWUgaHR0cHM6Ly93d3cuZGV2ZXhwcmVzcy5jb20vU3VwcG9ydC9DZW50ZXIvUXVlc3Rpb24vRGV0YWlscy9UNjIxODM4L2R4ZGF0YWdyaWQtYS1jb2x1bW4taXMtZW1wdHktaWYtZGF0YWZpZWxkLWNvbnRhaW5zLXNwZWNpYWwtY2hhcmFjdGVyc1xyXG4gICAgLy8gdHNsaW50OmVuYWJsZTptYXgtbGluZS1sZW5ndGhcclxuICAgIGlmIChzdGF0ZS5jb2x1bW5zKSB7XHJcbiAgICAgIHN0YXRlLmNvbHVtbnMuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgIGlmICgvW15hLXpBLVowLTlfXS8udGVzdChjLmRhdGFGaWVsZCkpIHtcclxuICAgICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5PcHRpb24oYy5kYXRhRmllbGQsICdjYWxjdWxhdGVDZWxsVmFsdWUnLCAocm93RGF0YSkgPT4gcm93RGF0YVtjLmRhdGFGaWVsZF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb2x1bW5OYW1lc1VwZGF0ZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1zaGFkb3dlZC12YXJpYWJsZVxyXG4gIHByaXZhdGUgY3JlYXRlRGF0YVNvdXJjZShyZXBvcnRQYXJhbXNEYXRhU291cmNlOiBJUmVwb3J0UGFyYW1zLCBncmlkTW9kZTogR3JpZE1vZGUsIHNob3dBbGxEYXRhSW5FZGl0RGF0YVNvdXJjZTogYm9vbGVhbikge1xyXG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLmRhdGFMYXllci5nZXRHcmlkRGF0YVNvdXJjZShyZXBvcnRQYXJhbXNEYXRhU291cmNlLCBncmlkTW9kZSwgc2hvd0FsbERhdGFJbkVkaXREYXRhU291cmNlKTtcclxuICAgIGNvbnN0IGRzID0gbmV3IERldkV4cHJlc3MuZGF0YS5EYXRhU291cmNlKHtcclxuICAgICAgc3RvcmUsXHJcbiAgICAgIG9uQ2hhbmdlZDogZ3JpZE1vZGUgPT09IEdyaWRNb2RlLlZpZXcgPyB2b2lkIDAgOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5OYW1lc1VwZGF0ZWQgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgICAgb25Mb2FkRXJyb3I6IChlKSA9PiB7XHJcbiAgICAgICAgaWYgKCFkcy5pc0xvYWRlZCgpKSB7XHJcbiAgICAgICAgICB0aGlzLiRncmlkRXJyb3JQbGFjZWhvbGRlci5zaG93KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmdyaWQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG4gICAgICB9LFxyXG4gICAgICBvbkxvYWRpbmdDaGFuZ2VkOiAoaXNMb2FkaW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzTG9hZGluZykge1xyXG4gICAgICAgICAgdGhpcy4kZ3JpZEVycm9yUGxhY2Vob2xkZXIuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ1BsZWFzZSB3YWl0LCBkYXRhIGxvYWRpbmcgaW4gcHJvZ3Jlc3MuJyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIDEwMDAwKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHRoaXMubG9hZGluZ1RpbWVvdXQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubG9hZGluZ1RpbWVvdXQpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdUaW1lb3V0ID0gbnVsbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZ3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gZHM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0U2V0dGluZ3MoKSB7XHJcbiAgICBEZXZFeHByZXNzLnVpLmRpYWxvZy5jb25maXJtKCdSZXNldCBncmlkIHNldHRpbmdzIHRvIGRlZmF1bHQgdmFsdWVzPycsICdSZXNldCB0byBkZWZhdWx0PycpXHJcbiAgICAgIC50aGVuKChyZXMpID0+IHtcclxuICAgICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgICB0aGlzLmdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdMb2FkaW5nJyk7XHJcbiAgICAgICAgICB0aGlzLmdyaWRTdGF0ZU1hbmFnZXJcclxuICAgICAgICAgICAgLnJlc2V0U2V0dGluZ3MoKVxyXG4gICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JpZC5zdGF0ZShkYXRhKTtcclxuICAgICAgICAgICAgICB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgdGhpcy5jcmVhdGVEYXRhU291cmNlKHRoaXMucmVwb3J0UGFyYW1zLCB0aGlzLmN1cnJlbnRHcmlkTW9kZSwgdGhpcy5zaG93QWxsRGF0YUluRWRpdCkpO1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JpZC5yZWZyZXNoKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN3aXRjaFRvTW9kZShtb2RlOiBHcmlkTW9kZSkge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBtb2RlIHx8IG1vZGUgPT09IEdyaWRNb2RlLkVkaXQgJiYgIXRoaXMuYWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9IG1vZGU7XHJcblxyXG4gICAgY29uc3QgY3VycmVudFN1bW1hcnlDb2x1bW4gPSB0aGlzLmdyaWQub3B0aW9uKCdzdW1tYXJ5LnRvdGFsSXRlbXNbMF0uY29sdW1uJykgYXMgc3RyaW5nO1xyXG5cclxuICAgIGNvbnN0IG5ld1JlcG9ydFBhcmFtcyA9IHtcclxuICAgICAgLi4udGhpcy5yZXBvcnRQYXJhbXMsXHJcbiAgICAgIFRvdGFsU3VtbWFyeUNvbHVtbjogY3VycmVudFN1bW1hcnlDb2x1bW4gPyBjdXJyZW50U3VtbWFyeUNvbHVtbiA6IHRoaXMucmVwb3J0UGFyYW1zLlRvdGFsU3VtbWFyeUNvbHVtblxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG5ld1JlcG9ydFBhcmFtcztcclxuXHJcbiAgICB0aGlzLmdyaWQuZGlzcG9zZSgpO1xyXG4gICAgdGhpcy4kZ3JpZFRhcmdldEVsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB0aGlzLmdyaWQgPSB0aGlzLmluaXRJbnRlcm5hbCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzYXZlR3JpZFN0YXRlKHN0YXRlKSB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50R3JpZE1vZGUgIT09IEdyaWRNb2RlLkVkaXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29sdW1uTmFtZXNVcGRhdGVkID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3Qgd2lkdGhzID0gdGhpcy5ncmlkU3RhdGVNYW5hZ2VyLnNhdmUoc3RhdGUsXHJcbiAgICAgICgpID0+IHRoaXMudXBkYXRlR3JpZFN0YXRlSW5kaWNhdG9yKEdSSURfSU5ESUNBVE9SX1NUQVRFLnNhdmluZyksXHJcbiAgICAgICgpID0+IHRoaXMudXBkYXRlR3JpZFN0YXRlSW5kaWNhdG9yKEdSSURfSU5ESUNBVE9SX1NUQVRFLnNhdmVkKSk7XHJcblxyXG4gICAgaWYgKHdpZHRocykge1xyXG4gICAgICBPYmplY3Qua2V5cyh3aWR0aHMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGVkaXRXaWR0aEJveCA9IHRoaXMuZWRpdFdpZHRoRWRpdEJveGVzW2tleV07XHJcblxyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gd2lkdGhzW2tleV0gPT09ICdpbmhlcml0JyA/ICcnIDogd2lkdGhzW2tleV07XHJcblxyXG4gICAgICAgIGlmIChlZGl0V2lkdGhCb3ggJiYgZWRpdFdpZHRoQm94Lm9wdGlvbigndmFsdWUnKSAhPT0gdmFsdWUpIHtcclxuICAgICAgICAgIGVkaXRXaWR0aEJveC5vcHRpb24oJ3ZhbHVlJywgdmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRHcmlkSGVhZGVyQ2VsbEVkaXRQYW5lbChcclxuICAgIGNvbHVtbjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uLFxyXG4gICAgJGNlbGw6IEpRdWVyeSxcclxuICAgIGFkZGl0aW9uYWxTZXR0aW5nczogSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGVcclxuICApIHtcclxuICAgIGNvbnN0IGRhdGFGaWVsZCA9IGNvbHVtbi5kYXRhRmllbGQ7XHJcbiAgICBjb25zdCAkY29sdW1uQ2FwdGlvbkVsID0gJGNlbGwuZmluZCgnLmR4LWRhdGFncmlkLXRleHQtY29udGVudCcpO1xyXG4gICAgY29uc3QgJGVkaXRvckFyZWEgPSAkKCc8c3BhbiAvPicpLmFkZENsYXNzKCdjb2x1bW4tZWRpdG9yLWFyZWEnKS5pbnNlcnRBZnRlcigkY29sdW1uQ2FwdGlvbkVsKTtcclxuXHJcbiAgICAkY29sdW1uQ2FwdGlvbkVsLmNzcygnbWF4V2lkdGgnLCAnNTUlJyk7XHJcblxyXG4gICAgY29uc3QgJGVkaXRUeXBlUGFuZWwgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgLmFkZENsYXNzKCdlZGl0LXR5cGUtcGFuZWwnKVxyXG4gICAgICAud2lkdGgoJzEwMCUnKVxyXG4gICAgICAuYXBwZW5kVG8oJGNlbGwpO1xyXG5cclxuICAgIGNvbnN0ICRlZGl0V2lkdGhQYW5lbCA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2VkaXQtd2lkdGgtcGFuZWwnKVxyXG4gICAgICAud2lkdGgoJzEwMCUnKVxyXG4gICAgICAuYXBwZW5kVG8oJGNlbGwpO1xyXG5cclxuICAgICRlZGl0VHlwZVBhbmVsWzBdLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgY29uc3Qgc2VsZWN0Qm94ID0gJGVkaXRUeXBlQm94LmR4U2VsZWN0Qm94KCdpbnN0YW5jZScpO1xyXG5cclxuICAgICAgaWYgKHNlbGVjdEJveC5vcHRpb24oJ29wZW5lZCcpKSB7XHJcbiAgICAgICAgc2VsZWN0Qm94LmNsb3NlKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2VsZWN0Qm94Lm9wZW4oKTtcclxuICAgICAgfVxyXG4gICAgfSwgdHJ1ZSk7XHJcblxyXG4gICAgbGV0IGxhc3RDYXB0aW9uVmFsdWUgPSBjb2x1bW4uY2FwdGlvbjtcclxuXHJcbiAgICBjb25zdCAkZWRpdENhcHRpb25CdG4gPSAkKCc8c3BhbiAvPicpLmR4QnV0dG9uKHtcclxuICAgICAgaGludDogJ0VkaXQgY29sdW1uIGNhcHRpb24nLFxyXG4gICAgICB0ZW1wbGF0ZTogKGRhdGEsICRjb250ZW50KSA9PiAkY29udGVudC5hcHBlbmQoJCgnPHNwYW4gLz4nKS5hZGRDbGFzcygnZWRpdC1jYXB0aW9uLWJ0bicpKSxcclxuICAgICAgb25DbGljazogKHsgZXZlbnQgfSkgPT4ge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICRjb2x1bW5DYXB0aW9uRWwuaGlkZSgpO1xyXG4gICAgICAgICRlZGl0Q2FwdGlvbkJ0bi5oaWRlKCk7XHJcbiAgICAgICAgJGVkaXRUb29sdGlwQnRuLmhpZGUoKTtcclxuXHJcbiAgICAgICAgY29uc3QgJGVkaXQgPSAkKCc8c3BhbiAvPicpLmR4VGV4dEJveCh7XHJcbiAgICAgICAgICB2YWx1ZTogbGFzdENhcHRpb25WYWx1ZSxcclxuICAgICAgICAgIGVsZW1lbnRBdHRyOiB7IGNsYXNzOiAnY2FwdGlvbi1lZGl0b3InIH0sXHJcbiAgICAgICAgICBvbkVudGVyS2V5OiAoZSkgPT4ge1xyXG4gICAgICAgICAgICBlZGl0QnRuLmJsdXIoKTtcclxuICAgICAgICAgICAgZS5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBvbktleURvd246IChlKSA9PiB7XHJcbiAgICAgICAgICAgIGUuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25Gb2N1c091dDogKGUpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBlZGl0QnRuLm9wdGlvbigndmFsdWUnKTtcclxuXHJcbiAgICAgICAgICAgICRlZGl0LnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAkY29sdW1uQ2FwdGlvbkVsLnRleHQobmV3VmFsdWUpLnNob3coKTtcclxuICAgICAgICAgICAgJGVkaXRDYXB0aW9uQnRuLnNob3coKTtcclxuICAgICAgICAgICAgJGVkaXRUb29sdGlwQnRuLnNob3coKTtcclxuXHJcbiAgICAgICAgICAgIGxhc3RDYXB0aW9uVmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5ncmlkU3RhdGVNYW5hZ2VyLnNldENvbHVtbkNhcHRpb24oZGF0YUZpZWxkLCBuZXdWYWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZUdyaWRTdGF0ZSh0aGlzLmdyaWQuc3RhdGUoKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtc20nKVxyXG4gICAgICAgICAgLmFwcGVuZFRvKCRlZGl0b3JBcmVhKVxyXG4gICAgICAgICAgLm9uKCdjbGljaycsIChlKSA9PiB7XHJcbiAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBlZGl0QnRuID0gJGVkaXQuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG5cclxuICAgICAgICBlZGl0QnRuLmZvY3VzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pLmluc2VydEFmdGVyKCRjb2x1bW5DYXB0aW9uRWwpO1xyXG5cclxuICAgIGNvbnN0ICRlZGl0VG9vbHRpcEJ0biA9ICQoJzxzcGFuIC8+JykuZHhCdXR0b24oe1xyXG4gICAgICBoaW50OiAnRWRpdCBjb2x1bW4gdG9vbHRpcCcsXHJcbiAgICAgIHRlbXBsYXRlOiAoZGF0YSwgJGNvbnRlbnQpID0+ICRjb250ZW50LmFwcGVuZCgkKCc8c3BhbiAvPicpLmFkZENsYXNzKCdlZGl0LXRvb2x0aXAtYnRuJykpLFxyXG4gICAgICBvbkNsaWNrOiAoeyBldmVudCB9KSA9PiB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgJGNvbHVtbkNhcHRpb25FbC5oaWRlKCk7XHJcbiAgICAgICAgJGVkaXRDYXB0aW9uQnRuLmhpZGUoKTtcclxuICAgICAgICAkZWRpdFRvb2x0aXBCdG4uaGlkZSgpO1xyXG5cclxuICAgICAgICBjb25zdCAkZWRpdCA9ICQoJzxzcGFuIC8+JykuZHhUZXh0Qm94KHtcclxuICAgICAgICAgIHZhbHVlOiBhZGRpdGlvbmFsU2V0dGluZ3MgJiYgYWRkaXRpb25hbFNldHRpbmdzLnRvb2x0aXAsXHJcbiAgICAgICAgICB0ZXh0OiBhZGRpdGlvbmFsU2V0dGluZ3MgJiYgYWRkaXRpb25hbFNldHRpbmdzLnRvb2x0aXAsXHJcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJ0VudGVyIGNvbHVtbiB0b29sdGlwLi4uJyxcclxuICAgICAgICAgIG9uRW50ZXJLZXk6IChlKSA9PiB7XHJcbiAgICAgICAgICAgIGVkaXRCdG4uYmx1cigpO1xyXG4gICAgICAgICAgICBlLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9uS2V5RG93bjogKGUpID0+IHtcclxuICAgICAgICAgICAgZS5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBvbkZvY3VzT3V0OiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gZWRpdEJ0bi5vcHRpb24oJ3ZhbHVlJyk7XHJcblxyXG4gICAgICAgICAgICAkZWRpdC5yZW1vdmUoKTtcclxuICAgICAgICAgICAgJGNvbHVtbkNhcHRpb25FbC5zaG93KCk7XHJcbiAgICAgICAgICAgICRlZGl0Q2FwdGlvbkJ0bi5zaG93KCk7XHJcbiAgICAgICAgICAgICRlZGl0VG9vbHRpcEJ0bi5zaG93KCk7XHJcblxyXG4gICAgICAgICAgICBhZGRpdGlvbmFsU2V0dGluZ3MudG9vbHRpcCA9IG5ld1ZhbHVlO1xyXG4gICAgICAgICAgICAkY2VsbC5hdHRyKCd0aXRsZScsIG5ld1ZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5zYXZlR3JpZFN0YXRlKHRoaXMuZ3JpZC5zdGF0ZSgpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1zbScpXHJcbiAgICAgICAgICAuYXBwZW5kVG8oJGVkaXRvckFyZWEpXHJcbiAgICAgICAgICAub24oJ2NsaWNrJywgKGUpID0+IHtcclxuICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGVkaXRCdG4gPSAkZWRpdC5keFRleHRCb3goJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgICAgIGVkaXRCdG4uZm9jdXMoKTtcclxuICAgICAgfVxyXG4gICAgfSkuaW5zZXJ0QWZ0ZXIoJGVkaXRDYXB0aW9uQnRuKTtcclxuXHJcbiAgICBjb25zdCAkZWRpdFR5cGVCb3ggPSAkKCc8c3BhbiAvPicpLmR4U2VsZWN0Qm94KHtcclxuICAgICAgZGF0YVNvdXJjZTogZ3JpZENvbHVtblR5cGVzLFxyXG4gICAgICB2YWx1ZTogY29sdW1uLmRhdGFUeXBlIHx8IEdyaWREYXRhQ29sdW1uRGF0YVR5cGUuRGVmYXVsdCxcclxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgY29sdW1uIHR5cGUuLi4nLFxyXG4gICAgICBvblZhbHVlQ2hhbmdlZDogKHsgdmFsdWUgfSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5PcHRpb24oZGF0YUZpZWxkLCAnZGF0YVR5cGUnLCB2YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLXNtJykuYXBwZW5kVG8oJGVkaXRUeXBlUGFuZWwpO1xyXG5cclxuICAgIGxldCBwcmV2VmFsdWUgPSAhIWNvbHVtbi53aWR0aCA/IGNvbHVtbi53aWR0aC50b1N0cmluZygpIDogJyc7XHJcblxyXG4gICAgY29uc3Qgb25XaWR0aFZhbHVlQ2hhbmdlZCA9IChlKSA9PiB7XHJcbiAgICAgIGxldCBuZXdWYWx1ZSA9IGUuY29tcG9uZW50Lm9wdGlvbigndmFsdWUnKTtcclxuXHJcbiAgICAgIGlmICghbmV3VmFsdWUgfHwgbmV3VmFsdWUgPT09ICdpbmhlcml0Jykge1xyXG4gICAgICAgIG5ld1ZhbHVlID0gJyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghcHJldlZhbHVlIHx8IHByZXZWYWx1ZSA9PT0gJ2luaGVyaXQnKSB7XHJcbiAgICAgICAgcHJldlZhbHVlID0gJyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChuZXdWYWx1ZSAhPT0gcHJldlZhbHVlKSB7XHJcbiAgICAgICAgcHJldlZhbHVlID0gbmV3VmFsdWU7XHJcbiAgICAgICAgdGhpcy5ncmlkLmNvbHVtbk9wdGlvbihkYXRhRmllbGQsICd3aWR0aCcsIG5ld1ZhbHVlIHx8ICdpbmhlcml0Jyk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5ncmlkUmVwYWludFF1ZXVlZCkge1xyXG4gICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmdyaWQucmVwYWludCgpO1xyXG4gICAgICAgICAgICB0aGlzLmdyaWRSZXBhaW50UXVldWVkID0gZmFsc2U7XHJcbiAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgICAgdGhpcy5ncmlkUmVwYWludFF1ZXVlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgJGVkaXRXaWR0aEJveCA9ICQoJzxzcGFuIC8+JykuZHhUZXh0Qm94KHtcclxuICAgICAgdGV4dDogcHJldlZhbHVlID09PSAnaW5oZXJpdCcgPyAnJyA6IHByZXZWYWx1ZSxcclxuICAgICAgcGxhY2Vob2xkZXI6ICdTZXQgd2lkdGguLi4nLFxyXG4gICAgICBvbkVudGVyS2V5OiAoKSA9PiAkZWRpdFdpZHRoQm94LmR4VGV4dEJveCgnaW5zdGFuY2UnKS5ibHVyKCksXHJcbiAgICAgIG9uRm9jdXNPdXQ6IG9uV2lkdGhWYWx1ZUNoYW5nZWQsXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiBvbldpZHRoVmFsdWVDaGFuZ2VkXHJcbiAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1zbScpXHJcbiAgICAgIC5hcHBlbmRUbygkZWRpdFdpZHRoUGFuZWwpXHJcbiAgICAgIC5vbignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLmVkaXRXaWR0aEVkaXRCb3hlc1tjb2x1bW4udmlzaWJsZUluZGV4XSA9ICRlZGl0V2lkdGhCb3guZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0R3JpZEhlYWRlckNlbGwoJGNlbGxFbDogSlF1ZXJ5LCBhZGRpdGlvbmFsU2V0dGluZ3M6IElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlKSB7XHJcbiAgICBjb25zdCAkY29sdW1uQ2FwdGlvbkVsID0gJGNlbGxFbC5maW5kKCcuZHgtZGF0YWdyaWQtdGV4dC1jb250ZW50Jyk7XHJcbiAgICBjb25zdCB0b29sdGlwID0gYWRkaXRpb25hbFNldHRpbmdzICYmIGFkZGl0aW9uYWxTZXR0aW5ncy50b29sdGlwO1xyXG4gICAgY29uc3QgY2FwdGlvbiA9IGFkZGl0aW9uYWxTZXR0aW5ncyAmJiBhZGRpdGlvbmFsU2V0dGluZ3MuY2FwdGlvbjtcclxuXHJcbiAgICAkY2VsbEVsLmF0dHIoJ3RpdGxlJywgdG9vbHRpcCB8fCB2b2lkIDApO1xyXG5cclxuICAgIGlmIChjYXB0aW9uKSB7XHJcbiAgICAgICRjb2x1bW5DYXB0aW9uRWwudGV4dChjYXB0aW9uKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmludGVyZmFjZSBJR2F1Z2VTdWJ2YWx1ZXNPcHRpb25zIHtcclxuICBzdWJ2YWx1ZXM6IElTdWJ2YWx1ZU9wdGlvbnNbXTtcclxuICB0eXBlOiBzdHJpbmc7XHJcbiAgd2lkdGg6IG51bWJlcjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElTdWJ2YWx1ZU9wdGlvbnMge1xyXG4gIGtleTogbnVtYmVyO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBpc0JvdW5kOiBib29sZWFuO1xyXG4gIG1lYXN1cmVJZDogc3RyaW5nO1xyXG4gIHZhbHVlOiBudW1iZXI7XHJcbiAgY29sb3I6IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XHJcbiAgc3VidmFsdWVzOiBbXSxcclxuICB0eXBlOiAndHJpYW5nbGVNYXJrZXInLFxyXG4gIGNvbG9yOiAnIzg3OThhNScsXHJcbiAgc2Vjb25kQ29sb3I6ICcjZTE4ZTkyJyxcclxuICB3aWR0aDogMTAsXHJcbiAgaXNDdXN0b21QYWxldHRlOiBmYWxzZSxcclxuICBwYWxldHRlOiBudWxsLFxyXG4gIGN1c3RvbVBhbGV0dGU6IFsnIzYxYTU5NScsICdHcmV5JywgJ3JnYigxNTMsIDEwMiwgMjU1KScsICdOYXZ5J11cclxufSBhcyBJR2F1Z2VTdWJ2YWx1ZXNPcHRpb25zO1xyXG5cclxuY29uc3QgQ1NTX0NMQVNTID0gJ2lzb3otc3VidmFsdWVFZGl0b3JGb3JtR3JvdXAnO1xyXG5jb25zdCBOQU1FX0lURU1fQ1NTX0NMQVNTID0gYCR7Q1NTX0NMQVNTfV9fbmFtZWA7XHJcbmNvbnN0IElTX0JPVU5EX0lURU1fQ1NTX0NMQVNTID0gYCR7Q1NTX0NMQVNTfV9faXMtYm91bmRgO1xyXG5jb25zdCBWQUxVRV9JVEVNX0NTU19DTEFTUyA9IGAke0NTU19DTEFTU31fX3ZhbHVlYDtcclxuY29uc3QgTUVBU1VSRV9JRF9JVEVNX0NTU19DTEFTUyA9IGAke0NTU19DTEFTU31fX21lYXN1cmUtaWRgO1xyXG5jb25zdCBDT0xPUl9JVEVNX0NTU19DTEFTUyA9IGAke0NTU19DTEFTU31fX2NvbG9yYDtcclxuXHJcbmNvbnN0IENJUkNMVUFSX0lORElDQVRPUl9UWVBFUyA9IFsncmVjdGFuZ2xlTmVlZGxlJywgJ3RyaWFuZ2xlTmVlZGxlJywgJ3JhbmdlQmFyJywgJ3RyaWFuZ2xlTWFya2VyJywgJ3RleHRDbG91ZCddO1xyXG5jb25zdCBMSU5FQVJfSU5ESUNBVE9SX1RZUEVTID0gWydyZWN0YW5nbGUnLCAnY2lyY2xlJywgJ3Job21idXMnLCAncmFuZ2VCYXInLCAndHJpYW5nbGVNYXJrZXInLCAndGV4dENsb3VkJ107XHJcblxyXG5jb25zdCBDSVJDVUxBUl9WSUVXX1RZUEVTOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZVZpZXdUeXBlW10gPSBbJ0NpcmN1bGFyRnVsbCcsICdDaXJjdWxhckhhbGYnLCAnQ2lyY3VsYXJRdWFydGVyTGVmdCcsICdDaXJjdWxhclF1YXJ0ZXJSaWdodCcsICdDaXJjdWxhclRocmVlRm91cnRoJ107XHJcbmNvbnN0IExJTkVBUl9WSUVXX1RZUEVTOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZVZpZXdUeXBlW10gPSBbJ0xpbmVhckhvcml6b250YWwnLCAnTGluZWFyVmVydGljYWwnXTtcclxuXHJcbmNvbnN0IERFRkFVTFRfUEFMRVRURSA9IFsnIzFkYjJmNScsICcjZjU1NjRhJywgJyM5N2M5NWMnLCAnI2ZmYzcyMCcsICcjZWIzNTczJywgJyNhNjNkYjgnLCAnIzY1OTNiYycsICcjZmFhMzM1JywgJyNmZjg4N2MnXTtcclxuXHJcbmNvbnN0IFBSRURFRklORURfUEFMRVRURVMgPSBbJ0JyaWdodCcsICdIYXJtb255IExpZ2h0JywgJ09jZWFuJywgJ1Bhc3RlbCcsICdTb2Z0JywgJ1NvZnQgUGFzdGVsJywgJ1ZpbnRhZ2UnLFxyXG4gICdWaW9sZXQnLCAnQ2FybWluZScsICdEYXJrIE1vb24nLCAnRGFyayBWaW9sZXQnLCAnR3JlZW4gTWlzdCcsICdTb2Z0IEJsdWUnLCAnTWF0ZXJpYWwnLCAnT2ZmaWNlJ107XHJcblxyXG4vLyAxLiBNb2RlbFxyXG5jb25zdCBwcm9wZXJ0eSA9IHtcclxuICBvd25lclR5cGU6IERldkV4cHJlc3M/LkRhc2hib2FyZD8uTW9kZWw/LkdhdWdlSXRlbSxcclxuICBwcm9wZXJ0eU5hbWU6ICdHYXVnZVN1YnZhbHVlc1NldHRpbmdzJyxcclxuICBkZWZhdWx0VmFsdWU6IEpTT04uc3RyaW5naWZ5KGRlZmF1bHRPcHRpb25zKSxcclxuICB2YWx1ZVR5cGU6ICdzdHJpbmcnXHJcbn0gYXMgRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuQ3VzdG9tUHJvcGVydHlNZXRhZGF0YTtcclxuXHJcbkRldkV4cHJlc3M/LkRhc2hib2FyZD8uTW9kZWw/LnJlZ2lzdGVyQ3VzdG9tUHJvcGVydHkocHJvcGVydHkpO1xyXG5cclxuLy8gMi4gVmlld2VyXHJcbmZ1bmN0aW9uIG9uSXRlbVdpZGdldE9wdGlvbnNQcmVwYXJlZChhcmdzOiBEZXZFeHByZXNzLkRhc2hib2FyZC5JdGVtV2lkZ2V0T3B0aW9uRXZlbnRBcmdzKSB7XHJcbiAgaWYgKGFyZ3MuZGFzaGJvYXJkSXRlbSBpbnN0YW5jZW9mIERldkV4cHJlc3M/LkRhc2hib2FyZD8uTW9kZWw/LkdhdWdlSXRlbSkge1xyXG4gICAgY29uc3Qgc3RvcmVkT3B0aW9ucyA9IGdldE9wdGlvbnMoYXJncy5kYXNoYm9hcmRJdGVtKTtcclxuXHJcbiAgICBjb25zdCBnYXVnZU9wdGlvbnMgPSBhcmdzLm9wdGlvbnMgYXMgRGV2RXhwcmVzcy52aXouZHhMaW5lYXJHYXVnZU9wdGlvbnMgfCBEZXZFeHByZXNzLnZpei5keENpcmN1bGFyR2F1Z2VPcHRpb25zO1xyXG4gICAgZ2F1Z2VPcHRpb25zLnN1YnZhbHVlcyA9IGdhdWdlT3B0aW9ucy5zdWJ2YWx1ZXMgfHwgW107XHJcbiAgICBnYXVnZU9wdGlvbnMuc3VidmFsdWVJbmRpY2F0b3IgPSBnYXVnZU9wdGlvbnMuc3VidmFsdWVJbmRpY2F0b3IgfHwge307XHJcblxyXG4gICAgZ2F1Z2VPcHRpb25zLnN1YnZhbHVlSW5kaWNhdG9yLnR5cGUgPSBzdG9yZWRPcHRpb25zLnR5cGUgYXMgYW55O1xyXG4gICAgZ2F1Z2VPcHRpb25zLnN1YnZhbHVlSW5kaWNhdG9yLndpZHRoID0gc3RvcmVkT3B0aW9ucy53aWR0aDtcclxuXHJcbiAgICBjb25zdCBoYXNUYXJnZXRWYWx1ZSA9ICEhYXJncy5kYXNoYm9hcmRJdGVtLmdhdWdlcygpWzBdPy50YXJnZXRWYWx1ZSgpO1xyXG4gICAgZ2F1Z2VPcHRpb25zLnN1YnZhbHVlSW5kaWNhdG9yLnBhbGV0dGUgPSBzdG9yZWRPcHRpb25zLnN1YnZhbHVlcy5maWx0ZXIoKHMpID0+IGhhc1RhcmdldFZhbHVlIHx8IHMua2V5ID4gLTEpLm1hcCgocykgPT4gcy5jb2xvcik7XHJcblxyXG4gICAgc3RvcmVkT3B0aW9ucy5zdWJ2YWx1ZXMuZm9yRWFjaCgoc3VidmFsdWUpID0+IHtcclxuICAgICAgaWYgKHN1YnZhbHVlLmtleSA9PT0gLTEpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHZhbHVlID0gc3VidmFsdWUuaXNCb3VuZCA/IGFyZ3MuaXRlbURhdGEuZ2V0TWVhc3VyZVZhbHVlKHN1YnZhbHVlLm1lYXN1cmVJZCkuZ2V0VmFsdWUoKSA6IHN1YnZhbHVlLnZhbHVlO1xyXG4gICAgICBnYXVnZU9wdGlvbnMuc3VidmFsdWVzLnB1c2godmFsdWUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG4vLyAzLiBEZXNpZ25lclxyXG5mdW5jdGlvbiBvbkN1c3RvbWl6ZVNlY3Rpb25zKGFyZ3M6IERldkV4cHJlc3MuRGFzaGJvYXJkLkRlc2lnbmVyLkN1c3RvbWl6ZVNlY3Rpb25zRXZlbnRBcmdzKSB7XHJcbiAgY29uc3QgZ2F1Z2VJdGVtID0gYXJncy5kYXNoYm9hcmRJdGVtO1xyXG4gIGlmIChnYXVnZUl0ZW0gaW5zdGFuY2VvZiBEZXZFeHByZXNzPy5EYXNoYm9hcmQ/Lk1vZGVsPy5HYXVnZUl0ZW0pIHtcclxuICAgIGFyZ3MuYWRkU2VjdGlvbih7XHJcbiAgICAgIHRpdGxlOiAnU3VidmFsdWVzJyxcclxuICAgICAgaXRlbXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6IHByb3BlcnR5LnByb3BlcnR5TmFtZSxcclxuICAgICAgICAgIHRlbXBsYXRlKGEsIGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgYnV0dG9uQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIG5ldyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdFZGl0IGluIFdpemFyZCcsXHJcbiAgICAgICAgICAgICAgb25DbGljaygpIHtcclxuICAgICAgICAgICAgICAgIHNob3dQb3B1cChnYXVnZUl0ZW0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gYnV0dG9uQ29udGFpbmVyO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93UG9wdXAoZ2F1Z2VJdGVtOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZUl0ZW0pIHtcclxuICBjb25zdCBwb3B1cENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocG9wdXBDb250YWluZXIpO1xyXG4gIGNvbnN0IHBvcHVwT3B0aW9ucyA9IHtcclxuICAgIHdpZHRoOiAnODAwcHgnLFxyXG4gICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICBtYXhIZWlnaHQ6ICcxMDAlJyxcclxuICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxyXG4gICAgY29udGVudFRlbXBsYXRlKHRoaXM6IGFueSwgY29udGVudENvbnRhaW5lcikge1xyXG4gICAgICBjb25zdCBzdWJ2YWx1ZXNGb3JtQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIGNvbnN0IHN1YnZhbHVlc2Zvcm1PcHRpb25zID0gZ2V0U3VidmFsdWVGb3JtT3B0aW9ucyhnYXVnZUl0ZW0pO1xyXG4gICAgICB0aGlzLl9zdWJ2YWx1ZXNGb3JtID0gbmV3IERldkV4cHJlc3MudWkuZHhGb3JtKHN1YnZhbHVlc0Zvcm1Db250YWluZXIsIHN1YnZhbHVlc2Zvcm1PcHRpb25zKTtcclxuXHJcbiAgICAgIGNvbnN0IGluZGljYXRvckZvcm1Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgY29uc3QgaW5kaWNhdG9yZm9ybU9wdGlvbnMgPSBnZXRJbmRpY2F0b3JGb3JtT3B0aW9ucyhnYXVnZUl0ZW0pO1xyXG4gICAgICB0aGlzLl9pbmRpY2F0b3JGb3JtID0gbmV3IERldkV4cHJlc3MudWkuZHhGb3JtKGluZGljYXRvckZvcm1Db250YWluZXIsIGluZGljYXRvcmZvcm1PcHRpb25zKTtcclxuXHJcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAkKCc8ZGl2IC8+JykuYXBwZW5kKHN1YnZhbHVlc0Zvcm1Db250YWluZXIsIGluZGljYXRvckZvcm1Db250YWluZXIpO1xyXG5cclxuICAgICAgY29uc3Qgc2Nyb2xsVmlldyA9ICQoJzxkaXYgLz4nKTtcclxuICAgICAgc2Nyb2xsVmlldy5hcHBlbmQoY29udGVudCk7XHJcbiAgICAgIHNjcm9sbFZpZXcuZHhTY3JvbGxWaWV3KHtcclxuICAgICAgICB3aWR0aDogJzEwMCUnLFxyXG4gICAgICAgIGhlaWdodDogJzEwMCUnXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuIHNjcm9sbFZpZXc7XHJcbiAgICB9LFxyXG4gICAgb25IaWRkZW4oKSB7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQocG9wdXBDb250YWluZXIpO1xyXG4gICAgfSxcclxuICAgIHRpdGxlOiAnU3VidmFsdWVzIFdpemFyZCcsXHJcbiAgfSBhcyBEZXZFeHByZXNzLnVpLmR4UG9wdXAuUHJvcGVydGllcztcclxuICBjb25zdCBwb3B1cCA9IG5ldyBEZXZFeHByZXNzLnVpLmR4UG9wdXAocG9wdXBDb250YWluZXIsIHBvcHVwT3B0aW9ucyk7XHJcbiAgcG9wdXAuc2hvdygpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRPcHRpb25zKGdhZ3VlSXRlbTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VJdGVtKTogSUdhdWdlU3VidmFsdWVzT3B0aW9ucyB7XHJcbiAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZ2FndWVJdGVtLmN1c3RvbVByb3BlcnRpZXMuZ2V0VmFsdWUocHJvcGVydHkucHJvcGVydHlOYW1lKSBhcyBzdHJpbmcpIGFzIElHYXVnZVN1YnZhbHVlc09wdGlvbnM7XHJcbiAgY29uc3QgaGFzVGFyZ2V0VmFsdWUgPSAhIWdhZ3VlSXRlbS5nYXVnZXMoKVswXT8udGFyZ2V0VmFsdWUoKTtcclxuXHJcbiAgaWYgKGhhc1RhcmdldFZhbHVlICYmICghZGF0YS5zdWJ2YWx1ZXMgfHwgIWRhdGEuc3VidmFsdWVzLnNvbWUoKHMpID0+IHMua2V5ID09PSAtMSkpKSB7XHJcbiAgICBkYXRhLnN1YnZhbHVlcy5zcGxpY2UoMCwgMCwge1xyXG4gICAgICBrZXk6IC0xLFxyXG4gICAgICBuYW1lOiAnVGFyZ2V0IFZhbHVlJyxcclxuICAgICAgaXNCb3VuZDogZmFsc2UsXHJcbiAgICAgIG1lYXN1cmVJZDogJycsXHJcbiAgICAgIHZhbHVlOiAwLFxyXG4gICAgICBjb2xvcjogREVGQVVMVF9QQUxFVFRFWyhkYXRhLnN1YnZhbHVlcz8ubGVuZ3RoIHx8IDApICUgKERFRkFVTFRfUEFMRVRURS5sZW5ndGggLSAxKV0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJldHVybiBkYXRhO1xyXG59XHJcbmZ1bmN0aW9uIHNldE9wdGlvbnMoZ2F1Z2VJdGVtOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZUl0ZW0sIHZhbHVlOiBJR2F1Z2VTdWJ2YWx1ZXNPcHRpb25zKSB7XHJcbiAgcmV0dXJuIGdhdWdlSXRlbS5jdXN0b21Qcm9wZXJ0aWVzLnNldFZhbHVlKHByb3BlcnR5LnByb3BlcnR5TmFtZSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcclxufVxyXG5cclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuZnVuY3Rpb24gY3JlYXRlTGlzdEFuZFRvb2xiYXIoZm9ybTogRGV2RXhwcmVzcy51aS5keEZvcm0sIGdhdWdlSXRlbTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VJdGVtKTogW0pRdWVyeSwgRGV2RXhwcmVzcy51aS5keExpc3QsIERldkV4cHJlc3MudWkuZHhUb29sYmFyXSB7XHJcbiAgY29uc3QgJGVsZW1lbnQgPSAkKCc8ZGl2IC8+Jyk7XHJcbiAgY29uc3QgJHRvb2xiYXJDb250YWluZXIgPSAkKCc8ZGl2IC8+Jyk7XHJcbiAgJGVsZW1lbnQuYXBwZW5kKCR0b29sYmFyQ29udGFpbmVyKTtcclxuICBjb25zdCBlZGl0QnV0dG9uID0gbnVsbDtcclxuICBsZXQgbGlzdDogRGV2RXhwcmVzcy51aS5keExpc3QgPSBudWxsO1xyXG5cclxuICBjb25zdCB0b29sYmFyT3B0aW9ucyA9IHtcclxuICAgIGl0ZW1zOiBbe1xyXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIGljb246ICdhZGQnLFxyXG4gICAgICAgIHN0eWxpbmdNb2RlOiAndGV4dCcsXHJcbiAgICAgICAgb25DbGljayhlKSB7XHJcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhnYXVnZUl0ZW0pO1xyXG4gICAgICAgICAgY29uc3Qga2V5ID0gb3B0aW9ucy5zdWJ2YWx1ZXMucmVkdWNlKChhY2MsIGl0ZW0pID0+IGFjYyA8IGl0ZW0ua2V5ID8gaXRlbS5rZXkgOiBhY2MsIDApICsgMTtcclxuICAgICAgICAgIGNvbnN0IG5ld1N1YnZhbHVlOiBJU3VidmFsdWVPcHRpb25zID0ge1xyXG4gICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgIG5hbWU6IGBTdWJ2YWx1ZSAke2tleX1gLFxyXG4gICAgICAgICAgICBpc0JvdW5kOiBmYWxzZSxcclxuICAgICAgICAgICAgbWVhc3VyZUlkOiAnJyxcclxuICAgICAgICAgICAgdmFsdWU6IDAsXHJcbiAgICAgICAgICAgIGNvbG9yOiBERUZBVUxUX1BBTEVUVEVbb3B0aW9ucy5zdWJ2YWx1ZXMubGVuZ3RoICUgKERFRkFVTFRfUEFMRVRURS5sZW5ndGggLSAxKV0sXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJywgbmV3U3VidmFsdWUpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGl0ZW1JbkRhdGFTb3VyY2UgPSBvcHRpb25zLnN1YnZhbHVlcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ua2V5ID09PSBuZXdTdWJ2YWx1ZS5rZXkpWzBdO1xyXG4gICAgICAgICAgaWYgKCFpdGVtSW5EYXRhU291cmNlKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMuc3VidmFsdWVzLnB1c2gobmV3U3VidmFsdWUpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBvcHRpb25zLnN1YnZhbHVlcy5pbmRleE9mKGl0ZW1JbkRhdGFTb3VyY2UpO1xyXG4gICAgICAgICAgICBvcHRpb25zW2luZGV4XSA9IG5ld1N1YnZhbHVlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHNldE9wdGlvbnMoZ2F1Z2VJdGVtLCBvcHRpb25zKTtcclxuICAgICAgICAgIGxpc3QucmVsb2FkKCk7XHJcbiAgICAgICAgICBsaXN0Lm9wdGlvbignc2VsZWN0ZWRJdGVtJywgb3B0aW9ucy5zdWJ2YWx1ZXNbb3B0aW9ucy5zdWJ2YWx1ZXMubGVuZ3RoIC0gMV0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH1cclxuICAgIH1dXHJcbiAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhck9wdGlvbnM7XHJcblxyXG4gIGNvbnN0IHVwZGF0ZVRvb2xiYXJTdGF0ZSA9IChoYXNTZWxlY3RlZEl0ZW06IGJvb2xlYW4pID0+IHtcclxuICAgIGVkaXRCdXR0b24gJiYgZWRpdEJ1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgIWhhc1NlbGVjdGVkSXRlbSk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgdG9vbGJhciA9IG5ldyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhcigkdG9vbGJhckNvbnRhaW5lciwgdG9vbGJhck9wdGlvbnMpO1xyXG4gIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke0NTU19DTEFTU31gKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG5cclxuICBjb25zdCBsaXN0T3B0aW9ucyA9IHtcclxuICAgIGRhdGFTb3VyY2U6IG5ldyBEZXZFeHByZXNzLmRhdGEuRGF0YVNvdXJjZSh7XHJcbiAgICAgIGxvYWQ6ICgpID0+IGdldE9wdGlvbnMoZ2F1Z2VJdGVtKS5zdWJ2YWx1ZXMsXHJcbiAgICAgIHJlbW92ZTogKCkgPT4geyB9XHJcbiAgICB9IGFzIGFueSksXHJcbiAgICBkaXNwbGF5RXhwcjogJ25hbWUnLFxyXG4gICAgaGVpZ2h0OiAnMjAwcHgnLFxyXG4gICAga2V5RXhwcjogJ2tleScsXHJcbiAgICBub0RhdGFUZXh0OiAnQWRkIGEgU3VidmFsdWUnLFxyXG4gICAgYWxsb3dJdGVtRGVsZXRpbmc6IHRydWUsXHJcbiAgICBpdGVtRGVsZXRlTW9kZTogJ3N0YXRpYycsXHJcbiAgICBzZWxlY3Rpb25Nb2RlOiAnc2luZ2xlJyxcclxuICAgIG9uQ29udGVudFJlYWR5KGUpIHsgdXBkYXRlVG9vbGJhclN0YXRlKCEhZS5jb21wb25lbnQub3B0aW9uKCdzZWxlY3RlZEl0ZW0nKSk7IH0sXHJcbiAgICBvbkl0ZW1SZW5kZXJlZChlKSB7XHJcbiAgICAgIGNvbnN0IGl0ZW1EYXRhID0gZS5pdGVtRGF0YSBhcyBJU3VidmFsdWVPcHRpb25zO1xyXG4gICAgICBpZiAoaXRlbURhdGEua2V5ID09PSAtMSkge1xyXG4gICAgICAgIGNvbnN0IGRlbGV0ZUVsZW1lbnQgPSBlLml0ZW1FbGVtZW50WzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2R4LWxpc3Qtc3RhdGljLWRlbGV0ZS1idXR0b24tY29udGFpbmVyJylbMF0gYXMgSFRNTERpdkVsZW1lbnQ7XHJcbiAgICAgICAgZGVsZXRlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgb25TZWxlY3Rpb25DaGFuZ2VkKGUpIHtcclxuICAgICAgdXBkYXRlVG9vbGJhclN0YXRlKCEhZS5jb21wb25lbnQub3B0aW9uKCdzZWxlY3RlZEl0ZW0nKSk7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IGUuY29tcG9uZW50Lm9wdGlvbignc2VsZWN0ZWRJdGVtJyk7XHJcbiAgICAgIGZvcm0ub3B0aW9uKCdmb3JtRGF0YScsIHNlbGVjdGVkSXRlbSk7XHJcbiAgICAgIGNvbnN0IHdhc2Zvcm1WaXNpYmxlID0gZm9ybS5lbGVtZW50KCkuZmluZChgLiR7Q1NTX0NMQVNTfWApLmNzcygnZGlzcGxheScpID09PSAnYmxvY2snO1xyXG4gICAgICBjb25zdCBzaG91bGRGb3JtQmVWaXNpYmxlID0gISFzZWxlY3RlZEl0ZW07XHJcbiAgICAgIGlmICghd2FzZm9ybVZpc2libGUgJiYgc2hvdWxkRm9ybUJlVmlzaWJsZSB8fCB3YXNmb3JtVmlzaWJsZSAmJiAhc2hvdWxkRm9ybUJlVmlzaWJsZSkge1xyXG4gICAgICAgIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke0NTU19DTEFTU31gKS5jc3MoJ2Rpc3BsYXknLCBzaG91bGRGb3JtQmVWaXNpYmxlID8gJ2Jsb2NrJyA6ICdub25lJyk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBvbkl0ZW1EZWxldGVkOiAoZSkgPT4ge1xyXG4gICAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhnYXVnZUl0ZW0pO1xyXG4gICAgICBjb25zdCBrZXkgPSBlLml0ZW1EYXRhLmtleTtcclxuICAgICAgY29uc3QgaW5kZXggPSBvcHRpb25zLnN1YnZhbHVlcy5pbmRleE9mKG9wdGlvbnMuc3VidmFsdWVzLmZpbHRlcigoc3VidmFsdWUpID0+IHN1YnZhbHVlLmtleSA9PT0ga2V5KVswXSk7XHJcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgb3B0aW9ucy5zdWJ2YWx1ZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICBzZXRPcHRpb25zKGdhdWdlSXRlbSwgb3B0aW9ucyk7XHJcbiAgICAgIH1cclxuICAgICAgbGlzdC5yZWxvYWQoKTtcclxuICAgICAgbGlzdC5vcHRpb24oJ3NlbGVjdGVkSXRlbScsIG9wdGlvbnMuc3VidmFsdWVzW29wdGlvbnMuc3VidmFsdWVzLmxlbmd0aCAtIDFdKTtcclxuICAgIH1cclxuICB9IGFzIERldkV4cHJlc3MudWkuZHhMaXN0T3B0aW9ucztcclxuXHJcbiAgY29uc3QgJGxpc3RDb250YWluZXIgPSAkKCc8ZGl2IC8+Jyk7XHJcbiAgJGVsZW1lbnQuYXBwZW5kKCRsaXN0Q29udGFpbmVyKTtcclxuXHJcbiAgbGlzdCA9IG5ldyBEZXZFeHByZXNzLnVpLmR4TGlzdCgkbGlzdENvbnRhaW5lciwgbGlzdE9wdGlvbnMpO1xyXG5cclxuICByZXR1cm4gWyRlbGVtZW50LCBsaXN0LCB0b29sYmFyXTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0U3VidmFsdWVGb3JtT3B0aW9ucyhnYXVnZUl0ZW06IERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLkdhdWdlSXRlbSk6IERldkV4cHJlc3MudWkuZHhGb3JtT3B0aW9ucyB7XHJcbiAgbGV0IGl0ZW1zTGlzdDogRGV2RXhwcmVzcy51aS5keExpc3QgfCBudWxsID0gbnVsbDtcclxuICBjb25zdCB1cGRhdGVGb3JtU3RhdGUgPSAoZm9ybTogRGV2RXhwcmVzcy51aS5keEZvcm0pID0+IHtcclxuICAgIGNvbnN0IHZhbHVlRWRpdG9yID0gZm9ybS5nZXRFZGl0b3IoJ3ZhbHVlJyk7XHJcbiAgICBjb25zdCBtZWFzdXJlSWRFZGl0b3IgPSBmb3JtLmdldEVkaXRvcignbWVhc3VyZUlkJyk7XHJcbiAgICBjb25zdCBuYW1lRWRpdG9yID0gZm9ybS5nZXRFZGl0b3IoJ25hbWUnKTtcclxuICAgIGNvbnN0IGlzQm91bmQgPSBmb3JtLm9wdGlvbignZm9ybURhdGEnKS5pc0JvdW5kO1xyXG4gICAgY29uc3QgaXNUYXJnZXRWYWx1ZSA9IGZvcm0ub3B0aW9uKCdmb3JtRGF0YScpLmtleSA9PT0gLTE7XHJcblxyXG4gICAgdmFsdWVFZGl0b3IgJiYgdmFsdWVFZGl0b3Iub3B0aW9uKCdkaXNhYmxlZCcsIGlzQm91bmQpO1xyXG4gICAgbWVhc3VyZUlkRWRpdG9yICYmIG1lYXN1cmVJZEVkaXRvci5vcHRpb24oJ2Rpc2FibGVkJywgIWlzQm91bmQpO1xyXG5cclxuICAgIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke0lTX0JPVU5EX0lURU1fQ1NTX0NMQVNTfWApLmNzcygnZGlzcGxheScsICFpc1RhcmdldFZhbHVlID8gJ2ZsZXgnIDogJ25vbmUnKTtcclxuICAgIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke1ZBTFVFX0lURU1fQ1NTX0NMQVNTfWApLmNzcygnZGlzcGxheScsICFpc1RhcmdldFZhbHVlID8gJ2ZsZXgnIDogJ25vbmUnKTtcclxuICAgIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke01FQVNVUkVfSURfSVRFTV9DU1NfQ0xBU1N9YCkuY3NzKCdkaXNwbGF5JywgIWlzVGFyZ2V0VmFsdWUgPyAnZmxleCcgOiAnbm9uZScpO1xyXG5cclxuICAgIG5hbWVFZGl0b3IgJiYgbmFtZUVkaXRvci5vcHRpb24oJ2Rpc2FibGVkJywgaXNUYXJnZXRWYWx1ZSk7XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGZvcm1EYXRhOiBudWxsLFxyXG4gICAgY29sQ291bnQ6IDIsXHJcbiAgICBpdGVtczogW1xyXG4gICAgICB7XHJcbiAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgY2FwdGlvbjogJ1N1YnZhbHVlcyBpdGVtcycsXHJcbiAgICAgICAgdGVtcGxhdGU6IChhcmdzKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBbJGNvbnRhaW5lciwgbGlzdF0gPSBjcmVhdGVMaXN0QW5kVG9vbGJhcihhcmdzLmNvbXBvbmVudCwgZ2F1Z2VJdGVtKTtcclxuICAgICAgICAgIGl0ZW1zTGlzdCA9IGxpc3Q7XHJcblxyXG4gICAgICAgICAgcmV0dXJuICRjb250YWluZXI7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdzdWJ2YWx1ZUVkaXRvcicsXHJcbiAgICAgICAgY3NzQ2xhc3M6IENTU19DTEFTUyxcclxuICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICBjYXB0aW9uOiAnSXRlbSBvcHRpb25zJyxcclxuICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICduYW1lJyxcclxuICAgICAgICAgICAgY3NzQ2xhc3M6IE5BTUVfSVRFTV9DU1NfQ0xBU1MsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeFRleHRCb3gnLFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgdmFsdWVDaGFuZ2VFdmVudDogJ2tleXVwJ1xyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUZXh0Qm94LlByb3BlcnRpZXNcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ2lzQm91bmQnLFxyXG4gICAgICAgICAgICBjc3NDbGFzczogSVNfQk9VTkRfSVRFTV9DU1NfQ0xBU1MsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeFJhZGlvR3JvdXAnLFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgZGlzcGxheUV4cHI6ICd0ZXh0JyxcclxuICAgICAgICAgICAgICB2YWx1ZUV4cHI6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgICAgbGF5b3V0OiAnaG9yaXpvbnRhbCcsXHJcbiAgICAgICAgICAgICAgaXRlbXM6IFt7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAnVW5ib3VuZCcsIHZhbHVlOiBmYWxzZVxyXG4gICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIHRleHQ6ICdCb3VuZCcsIHZhbHVlOiB0cnVlXHJcbiAgICAgICAgICAgICAgfV1cclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4UmFkaW9Hcm91cC5Qcm9wZXJ0aWVzLFxyXG4gICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdUeXBlJyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgY3NzQ2xhc3M6IFZBTFVFX0lURU1fQ1NTX0NMQVNTLFxyXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhOdW1iZXJCb3gnLFxyXG4gICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdWYWx1ZScsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBzaG93U3BpbkJ1dHRvbnM6IHRydWUsXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keE51bWJlckJveC5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdtZWFzdXJlSWQnLFxyXG4gICAgICAgICAgICBjc3NDbGFzczogTUVBU1VSRV9JRF9JVEVNX0NTU19DTEFTUyxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4U2VsZWN0Qm94JyxcclxuICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnSGlkZGVuIG1lYXN1cmVzJyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIGRpc3BsYXlFeHByOiAndGV4dCcsXHJcbiAgICAgICAgICAgICAgdmFsdWVFeHByOiAndmFsdWUnLFxyXG4gICAgICAgICAgICAgIGl0ZW1zOiBnYXVnZUl0ZW0uaGlkZGVuTWVhc3VyZXMoKS5tYXAoKG1lYXN1cmUpID0+ICh7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiBnZXRNZWFzdXJlRGlzYXBsYXlUZXh0KG1lYXN1cmUpLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IG1lYXN1cmUudW5pcXVlTmFtZSgpXHJcbiAgICAgICAgICAgICAgfSkpLFxyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhTZWxlY3RCb3guUHJvcGVydGllc1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ2NvbG9yJyxcclxuICAgICAgICAgICAgY3NzQ2xhc3M6IENPTE9SX0lURU1fQ1NTX0NMQVNTLFxyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdjb2xvcicsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeENvbG9yQm94JyxcclxuICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnQ29sb3InLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIF1cclxuICAgICAgfVxyXG4gICAgXSxcclxuICAgIG9uQ29udGVudFJlYWR5KGUpIHsgdXBkYXRlRm9ybVN0YXRlKGUuY29tcG9uZW50KTsgfSxcclxuICAgIG9uRmllbGREYXRhQ2hhbmdlZChlKSB7XHJcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gZS5jb21wb25lbnQub3B0aW9uKCdmb3JtRGF0YScpIGFzIElTdWJ2YWx1ZU9wdGlvbnM7XHJcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKGdhdWdlSXRlbSk7XHJcbiAgICAgIGNvbnN0IGVkaXRlZFN1YnZhbHVlID0gb3B0aW9ucy5zdWJ2YWx1ZXMuZmlsdGVyKChzdWJ2YWx1ZSkgPT4gc3VidmFsdWUua2V5ID09PSBmb3JtRGF0YS5rZXkpWzBdO1xyXG5cclxuICAgICAgb3B0aW9ucy5zdWJ2YWx1ZXNbb3B0aW9ucy5zdWJ2YWx1ZXMuaW5kZXhPZihlZGl0ZWRTdWJ2YWx1ZSldID0gZm9ybURhdGE7XHJcbiAgICAgIHNldE9wdGlvbnMoZ2F1Z2VJdGVtLCBvcHRpb25zKTtcclxuXHJcbiAgICAgIGlmIChlZGl0ZWRTdWJ2YWx1ZSAmJiBlZGl0ZWRTdWJ2YWx1ZS5uYW1lICE9PSBmb3JtRGF0YS5uYW1lICYmIGl0ZW1zTGlzdCkge1xyXG4gICAgICAgIGl0ZW1zTGlzdC5yZXBhaW50KCk7XHJcbiAgICAgIH1cclxuICAgICAgdXBkYXRlRm9ybVN0YXRlKGUuY29tcG9uZW50KTtcclxuICAgIH0sXHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0TWVhc3VyZURpc2FwbGF5VGV4dChtZWFzdXJlOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5NZWFzdXJlKTogc3RyaW5nIHtcclxuICBpZiAobWVhc3VyZS5uYW1lKCkpIHtcclxuICAgIHJldHVybiBtZWFzdXJlLm5hbWUoKTtcclxuICB9XHJcblxyXG4gIGxldCByZXN1bHQgPSBtZWFzdXJlLmRhdGFNZW1iZXIoKTtcclxuICBpZiAobWVhc3VyZS5zdW1tYXJ5VHlwZSAmJiBtZWFzdXJlLnN1bW1hcnlUeXBlKCkpIHtcclxuICAgIHJlc3VsdCArPSBgICgke21lYXN1cmUuc3VtbWFyeVR5cGUoKX0pYDtcclxuICB9XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEluZGljYXRvckZvcm1PcHRpb25zKGdhdWdlSXRlbTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VJdGVtKTogRGV2RXhwcmVzcy51aS5keEZvcm1PcHRpb25zIHtcclxuICBjb25zdCBjdXJyZW50Vmlld1R5cGUgPSBnYXVnZUl0ZW0udmlld1R5cGUoKTtcclxuICBjb25zdCBpbmRpY2F0b3JUeXBlcyA9IExJTkVBUl9WSUVXX1RZUEVTLnNvbWUoKHQpID0+IHQgPT09IGN1cnJlbnRWaWV3VHlwZSlcclxuICAgID8gTElORUFSX0lORElDQVRPUl9UWVBFU1xyXG4gICAgOiBDSVJDTFVBUl9JTkRJQ0FUT1JfVFlQRVM7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBmb3JtRGF0YTogZ2V0T3B0aW9ucyhnYXVnZUl0ZW0pIHx8IG51bGwsXHJcbiAgICBpdGVtczogW1xyXG4gICAgICB7XHJcbiAgICAgICAgY2FwdGlvbjogJ0luZGljYXRvciBvcHRpb25zJyxcclxuICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICd0eXBlJyxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4U2VsZWN0Qm94JyxcclxuICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnVHlwZScsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ3RleHQnLFxyXG4gICAgICAgICAgICAgIHZhbHVlRXhwcjogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICBpdGVtczogaW5kaWNhdG9yVHlwZXMubWFwKCh0KSA9PiAoeyB0ZXh0OiB0LCB2YWx1ZTogdCB9KSksXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveC5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICd3aWR0aCcsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeE51bWJlckJveCcsXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBzaG93U3BpbkJ1dHRvbnM6IHRydWUsXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keE51bWJlckJveE9wdGlvbnMsXHJcbiAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ1dpZHRoJyxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgICAgfVxyXG4gICAgXSxcclxuICAgIG9uRmllbGREYXRhQ2hhbmdlZChlKSB7XHJcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gZS5jb21wb25lbnQub3B0aW9uKCdmb3JtRGF0YScpIGFzIElHYXVnZVN1YnZhbHVlc09wdGlvbnM7XHJcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKGdhdWdlSXRlbSk7XHJcblxyXG4gICAgICBvcHRpb25zLndpZHRoID0gZm9ybURhdGEud2lkdGg7XHJcbiAgICAgIG9wdGlvbnMudHlwZSA9IGZvcm1EYXRhLnR5cGU7XHJcblxyXG4gICAgICBzZXRPcHRpb25zKGdhdWdlSXRlbSwgb3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgfTtcclxufVxyXG5cclxuLy8gNC4gRXZlbnQgU3Vic2NyaXB0aW9uXHJcbmV4cG9ydCBmdW5jdGlvbiBnYXVnZVN1YnZhbHVlc0V4dGVuc2lvbih0aGlzOiBhbnksIGRhc2hib2FyZENvbnRyb2w6IERldkV4cHJlc3MuRGFzaGJvYXJkLkRhc2hib2FyZENvbnRyb2wpIHtcclxuICB0aGlzLm5hbWUgPSAnR2F1Z2VTdWJ2YWx1ZXMnO1xyXG4gIHRoaXMuc3RhcnQgPSAoKSA9PiB7XHJcbiAgICBjb25zdCB2aWV3ZXJBcGlFeHRlbnNpb24gPSBkYXNoYm9hcmRDb250cm9sLmZpbmRFeHRlbnNpb24oJ3ZpZXdlci1hcGknKSBhcyBEZXZFeHByZXNzLkRhc2hib2FyZC5WaWV3ZXJBcGlFeHRlbnNpb247XHJcbiAgICBpZiAodmlld2VyQXBpRXh0ZW5zaW9uKSB7XHJcbiAgICAgIHZpZXdlckFwaUV4dGVuc2lvbi5vbignaXRlbVdpZGdldE9wdGlvbnNQcmVwYXJlZCcsIG9uSXRlbVdpZGdldE9wdGlvbnNQcmVwYXJlZCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBvcHRpb25zUGFuZWxFeHRlbnNpb24gPSBkYXNoYm9hcmRDb250cm9sLmZpbmRFeHRlbnNpb24oJ2l0ZW0tb3B0aW9ucy1wYW5lbCcpIGFzIGFueTtcclxuICAgIGlmIChvcHRpb25zUGFuZWxFeHRlbnNpb24pIHtcclxuICAgICAgb3B0aW9uc1BhbmVsRXh0ZW5zaW9uLm9uKCdjdXN0b21pemVTZWN0aW9ucycsIG9uQ3VzdG9taXplU2VjdGlvbnMpO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgdGhpcy5zdG9wID0gKCkgPT4ge1xyXG4gICAgY29uc3Qgdmlld2VyQXBpRXh0ZW5zaW9uID0gZGFzaGJvYXJkQ29udHJvbC5maW5kRXh0ZW5zaW9uKCd2aWV3ZXItYXBpJykgYXMgRGV2RXhwcmVzcy5EYXNoYm9hcmQuVmlld2VyQXBpRXh0ZW5zaW9uO1xyXG4gICAgaWYgKHZpZXdlckFwaUV4dGVuc2lvbikge1xyXG4gICAgICB2aWV3ZXJBcGlFeHRlbnNpb24ub2ZmKCdpdGVtV2lkZ2V0T3B0aW9uc1ByZXBhcmVkJywgb25JdGVtV2lkZ2V0T3B0aW9uc1ByZXBhcmVkKTtcclxuICAgIH1cclxuICAgIGNvbnN0IG9wdGlvbnNQYW5lbEV4dGVuc2lvbiA9IGRhc2hib2FyZENvbnRyb2wuZmluZEV4dGVuc2lvbignaXRlbS1vcHRpb25zLXBhbmVsJykgYXMgYW55O1xyXG4gICAgaWYgKG9wdGlvbnNQYW5lbEV4dGVuc2lvbikge1xyXG4gICAgICBvcHRpb25zUGFuZWxFeHRlbnNpb24ub2ZmKCdjdXN0b21pemVTZWN0aW9ucycsIG9uQ3VzdG9taXplU2VjdGlvbnMpO1xyXG4gICAgfVxyXG4gIH07XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGluaXRQb3BvdmVyIH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZXBvcnREZXRhaWxzUG9wb3Zlcic7XHJcbmltcG9ydCB7IElEYXNoYm9hcmRQZXJtaXNzaW9ucywgSURhc2hib2FyZFVybHMsIElSZXBvcnRQYXJhbXMgfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IHsgZ2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24gfSBmcm9tICcuL0V4dGVuc2lvbnMvR2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24nO1xyXG5pbXBvcnQgUmVmcmVzaEJ1dHRvbiBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlZnJlc2hUaW1lci9CdXR0b24nO1xyXG5pbXBvcnQge0lSZXBvcnRDb21wb25lbnR9IGZyb20gJy4uLy4uL0lSZXBvcnRDb21wb25lbnQnO1xyXG5cclxuY29uc3QgREFTSEJPQVJEX01PREVfS0VZID0gJ0RBU0hCT0FSRF9NT0RFX0tFWSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEYXNoYm9hcmRPcHRpb25zIHtcclxuICAkZGFzaGJvYXJkQ29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG4gIHBlcm1pc3Npb25zOiBJRGFzaGJvYXJkUGVybWlzc2lvbnM7XHJcbiAgdXJsczogSURhc2hib2FyZFVybHM7XHJcbiAgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGFzaGJvYXJkIGltcGxlbWVudHMgSVJlcG9ydENvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkZGFzaGJvYXJkQ29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwZXJtaXNzaW9uczogSURhc2hib2FyZFBlcm1pc3Npb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXJsczogSURhc2hib2FyZFVybHM7XHJcbiAgcHJpdmF0ZSByZWZyZXNoQnV0dG9uOiBSZWZyZXNoQnV0dG9uIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgZGFzaGJvYXJkOiBEZXZFeHByZXNzLkRhc2hib2FyZC5EYXNoYm9hcmRDb250cm9sIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBwb3BvdmVyOiBEZXZFeHByZXNzLnVpLmR4UG9wb3ZlciB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0SWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFkZFJlZnJlc2hCdXR0b246IGJvb2xlYW47XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElEYXNoYm9hcmRPcHRpb25zKSB7XHJcbiAgICB0aGlzLiRkYXNoYm9hcmRDb250YWluZXIgPSBvcHRpb25zLiRkYXNoYm9hcmRDb250YWluZXI7XHJcbiAgICB0aGlzLmFkZFJlZnJlc2hCdXR0b24gPSBvcHRpb25zLmFkZFJlZnJlc2hCdXR0b247XHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy5yZXBvcnRJZCA9IG9wdGlvbnMucmVwb3J0UGFyYW1zLlJlcG9ydElkO1xyXG4gICAgdGhpcy5wZXJtaXNzaW9ucyA9IG9wdGlvbnMucGVybWlzc2lvbnM7XHJcbiAgICB0aGlzLnVybHMgPSBvcHRpb25zLnVybHM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdCgpOiB2b2lkIHtcclxuICAgIGxldCByZXBvcnRJZFN0ciA9IHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkICYmIHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgRGV2RXhwcmVzcy5EYXNoYm9hcmQuUmVzb3VyY2VNYW5hZ2VyLmVtYmVkQnVuZGxlZFJlc291cmNlcygpO1xyXG5cclxuICAgIGxldCBtb2RlOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Xb3JraW5nTW9kZSA9IHRoaXMucGVybWlzc2lvbnMuQWxsb3dFZGl0aW5nXHJcbiAgICAgID8gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCkpIGFzIERldkV4cHJlc3MuRGFzaGJvYXJkLldvcmtpbmdNb2RlIHx8ICdWaWV3ZXInXHJcbiAgICAgIDogJ1ZpZXdlcic7XHJcblxyXG4gICAgaWYgKHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpIHtcclxuICAgICAgdGhpcy5wb3BvdmVyID0gaW5pdFBvcG92ZXIoJy5yZXBvcnQtZGV0YWlscy1saW5rJywgdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTk9URTogRGFzaGJvYXJkIDE4LjEgZG9lc24ndCBzdXBwb3J0IGV4cG9ydC4gV2UgaGlkZSB0aGUgZXhwb3J0IGJ1dHRvbiB2aWEgc3R5bGVzXHJcbiAgICB0aGlzLmRhc2hib2FyZCA9IG5ldyBEZXZFeHByZXNzLkRhc2hib2FyZC5EYXNoYm9hcmRDb250cm9sKHRoaXMuJGRhc2hib2FyZENvbnRhaW5lclswXSwge1xyXG4gICAgICB3b3JraW5nTW9kZTogbW9kZSxcclxuICAgICAgaW5pdGlhbERhc2hib2FyZElkOiByZXBvcnRJZFN0cixcclxuICAgICAgZW5kcG9pbnQ6IHRoaXMudXJscy5FbmRQb2ludCxcclxuICAgICAgYWpheFJlbW90ZVNlcnZpY2U6IHtcclxuICAgICAgICBoZWFkZXJzOiAhdGhpcy5yZXBvcnRQYXJhbXMuVG9rZW4gPyB1bmRlZmluZWQgOiB7XHJcbiAgICAgICAgICB0b2tlbjogdGhpcy5yZXBvcnRQYXJhbXMuVG9rZW5cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRGFzaGJvYXJkSW5pdGlhbGl6aW5nOiAoZSkgPT4ge1xyXG4gICAgICAgIGUuY29tcG9uZW50LnJlZ2lzdGVyRXh0ZW5zaW9uKG5ldyBnYXVnZVN1YnZhbHVlc0V4dGVuc2lvbihlLmNvbXBvbmVudCkpO1xyXG5cclxuICAgICAgICBpZiAocmVwb3J0SWRTdHIgIT09IGUuZGFzaGJvYXJkSWQpIHtcclxuICAgICAgICAgIHJlcG9ydElkU3RyID0gZS5kYXNoYm9hcmRJZDtcclxuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZW5jb2RlVVJJKHRoaXMudXJscy5QcmV2aWV3VXJsICsgZS5kYXNoYm9hcmRJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvbkJlZm9yZVJlbmRlcjogKGUpID0+IHtcclxuICAgICAgICBlLmNvbXBvbmVudC5yZWdpc3RlckV4dGVuc2lvbihuZXcgRGV2RXhwcmVzcy5EYXNoYm9hcmQuRGVzaWduZXIuVGV4dEJveEl0ZW1FZGl0b3JFeHRlbnNpb24oZS5jb21wb25lbnQpKTtcclxuICAgICAgfSxcclxuICAgICAgZXh0ZW5zaW9uczoge1xyXG4gICAgICAgICdkYXRhLXNvdXJjZS13aXphcmQnOiB7XHJcbiAgICAgICAgICBlbmFibGVDdXN0b21TcWw6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgICdkYXNoYm9hcmQtZXhwb3J0Jzoge1xyXG4gICAgICAgICAgYWxsb3dFeHBvcnREYXNoYm9hcmRJdGVtczogdHJ1ZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgJ2RhdGEtaW5zcGVjdG9yJzoge1xyXG4gICAgICAgICAgYWxsb3dJbnNwZWN0QWdncmVnYXRlZERhdGE6IHRydWUsXHJcbiAgICAgICAgICBhbGxvd0luc3BlY3RSYXdEYXRhOiB0cnVlLFxyXG4gICAgICAgICAgb25HcmlkSW5pdGlhbGl6ZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGdyaWQgPSBlLmNvbXBvbmVudCBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcbiAgICAgICAgICAgIGdyaWQub3B0aW9uKCdleHBvcnQuZW5hYmxlZCcsIHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5kYXNoYm9hcmQucmVuZGVyKCk7XHJcblxyXG4gICAgaWYgKHRoaXMucGVybWlzc2lvbnMuQWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgIGNvbnN0IGJ1dHRvbiA9ICQoJy5zd2l0Y2gtbW9kZS1idG4nKS5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogbW9kZSA9PT0gJ1ZpZXdlcicgPyAnU3dpdGNoIHRvIERlc2lnbmVyJyA6ICdTd2l0Y2ggdG8gVmlld2VyJyxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICBtb2RlID0gbW9kZSA9PT0gJ1ZpZXdlcicgPyAnRGVzaWduZXInIDogJ1ZpZXdlcic7XHJcblxyXG4gICAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCksIG1vZGUpO1xyXG5cclxuICAgICAgICAgIGlmIChtb2RlID09PSAnVmlld2VyJykge1xyXG4gICAgICAgICAgICB0aGlzLmRhc2hib2FyZC5zd2l0Y2hUb1ZpZXdlcigpO1xyXG4gICAgICAgICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgJ1N3aXRjaCB0byBEZXNpZ25lcicpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kYXNoYm9hcmQuc3dpdGNoVG9EZXNpZ25lcigpO1xyXG4gICAgICAgICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgJ1N3aXRjaCB0byBWaWV3ZXInKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLW1kJykuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgICByZW1vdmVSZWR1bmRhbnRUb29sYm94SXRlbXModGhpcy5kYXNoYm9hcmQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWRkUmVmcmVzaEJ1dHRvbiAmJiAodGhpcy5yZWZyZXNoQnV0dG9uID0gbmV3IFJlZnJlc2hCdXR0b24oJCgnLnJlcG9ydC1yZWZyZXNoLWJ1dHRvbicpLCAoKSA9PiB0aGlzLnJlZnJlc2goKSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmRhc2hib2FyZD8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5kYXNoYm9hcmQgPSBudWxsO1xyXG5cclxuICAgIHRoaXMucG9wb3Zlcj8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5wb3BvdmVyID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbktleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIERBU0hCT0FSRF9NT0RFX0tFWSArIHRoaXMucmVwb3J0SWQ7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYXNoYm9hcmQucmVmcmVzaCgpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gcmVtb3ZlUmVkdW5kYW50VG9vbGJveEl0ZW1zKGNvbnRyb2w6IERldkV4cHJlc3MuRGFzaGJvYXJkLkRhc2hib2FyZENvbnRyb2wpIHtcclxuICBjb25zdCBpdGVtc1RvUmVtb3ZlID0gWydjcmVhdGUtZGFzaGJvYXJkJywgJ29wZW4tZGFzaGJvYXJkJ107XHJcbiAgY29uc3QgdG9vbGJveCA9IGNvbnRyb2wuZmluZEV4dGVuc2lvbigndG9vbGJveCcpIGFzIERldkV4cHJlc3MuRGFzaGJvYXJkLkRlc2lnbmVyLlRvb2xib3hFeHRlbnNpb247XHJcbiAgaXRlbXNUb1JlbW92ZS5mb3JFYWNoKChpdGVtSWQpID0+IHtcclxuICAgIGNvbnN0IGl0ZW0gPSB0b29sYm94Lm1lbnVJdGVtcygpLmZpbHRlcigoaSkgPT4gaS5pZCA9PT0gaXRlbUlkKVswXTtcclxuXHJcbiAgICBpZiAoaXRlbSkge1xyXG4gICAgICB0b29sYm94LnJlbW92ZU1lbnVJdGVtKGl0ZW1JZCk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGluaXRQb3BvdmVyIH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZXBvcnREZXRhaWxzUG9wb3Zlcic7XHJcbmltcG9ydCB7IElSZXBvcnRQYXJhbXMsIE1vZGUgfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IHtJUmVwb3J0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcclxuXHJcbmNvbnN0IFNXSVRDSF9UT19ERVNJR05FUl9URVhUID0gJ1N3aXRjaCB0byBEZXNpZ25lcic7XHJcbmNvbnN0IFNXSVRDSF9UT19WSUVXRVJfVEVYVCA9ICdTd2l0Y2ggdG8gVmlld2VyJztcclxuY29uc3QgU0VTU0lPTl9TVE9SQUdFX01PREVfS0VZID0gJ3JlcG9ydE1vZGUnO1xyXG5jb25zdCBDVVJSRU5UX1VSTF9LRVkgPSAnY3VzdG9tQ3VycmVudFVybCc7XHJcblxyXG5kZWNsYXJlIGNvbnN0IGR4UmVwb3J0RGVzaWduZXI6IGFueTtcclxuY29uc3Qga28gPSAod2luZG93IGFzIGFueSkua287XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElSZXBvcnRPcHRpb25zIHtcclxuICAkcmVwb3J0Q29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG4gIGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBkZXNpZ25lck1vZGVsVXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlcG9ydCBpbXBsZW1lbnRzIElSZXBvcnRDb21wb25lbnQge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJHJlcG9ydENvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzaWduZXJNb2RlbFVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0SWQ6IG51bWJlcjtcclxuXHJcbiAgcHJpdmF0ZSBwb3BvdmVyOiBEZXZFeHByZXNzLnVpLmR4UG9wb3ZlciA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElSZXBvcnRPcHRpb25zKSB7XHJcbiAgICB0aGlzLiRyZXBvcnRDb250YWluZXIgPSBvcHRpb25zLiRyZXBvcnRDb250YWluZXI7XHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy5hbGxvd0VkaXRpbmcgPSBvcHRpb25zLmFsbG93RWRpdGluZztcclxuICAgIHRoaXMuZGVzaWduZXJNb2RlbFVybCA9IG9wdGlvbnMuZGVzaWduZXJNb2RlbFVybDtcclxuICAgIHRoaXMucmVwb3J0SWQgPSBvcHRpb25zLnJlcG9ydFBhcmFtcy5SZXBvcnRJZDtcclxuICB9XHJcblxyXG4gIGluaXQoKTogdm9pZCB7XHJcbiAgICBsZXQgbW9kZSA9IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpKSBhcyBNb2RlIHx8IE1vZGUuVmlld2VyO1xyXG4gICAgbGV0IGJ1dHRvbiA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpIHtcclxuICAgICAgdGhpcy5wb3BvdmVyID0gaW5pdFBvcG92ZXIoJy5yZXBvcnQtZGV0YWlscy1saW5rJywgdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgIGJ1dHRvbiA9ICQoJy5zd2l0Y2gtbW9kZS1idG4nKS5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogbW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyBTV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IFNXSVRDSF9UT19WSUVXRVJfVEVYVCxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICBtb2RlID0gbW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyBNb2RlLkRlc2lnbmVyIDogTW9kZS5WaWV3ZXI7XHJcbiAgICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSwgbW9kZSk7XHJcbiAgICAgICAgICB0aGlzLnN3aXRjaE1vZGUobW9kZSwgYnV0dG9uKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLW1kJykuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jcmVhdGVSZXBvcnREZXNpZ25lcih0aGlzLiRyZXBvcnRDb250YWluZXIsIHRoaXMuZGVzaWduZXJNb2RlbFVybCwgJ2R4UmVwb3J0RGVzaWduZXInLCB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZC50b1N0cmluZygpLCAocykgPT4ge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVN3aXRjaE1vZGVCdXR0b24obW9kZSwgYnV0dG9uKTtcclxuICAgICAgfSk7XHJcbiAgICB9LCBtb2RlID09PSBNb2RlLlZpZXdlcik7XHJcblxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlzTm90U2F2ZWRSZXBvcnQgPSBkeFJlcG9ydERlc2lnbmVyICYmIGR4UmVwb3J0RGVzaWduZXIuR2V0RGVzaWduZXJNb2RlbCgpICYmIGR4UmVwb3J0RGVzaWduZXIuR2V0RGVzaWduZXJNb2RlbCgpLmlzRGlydHk7XHJcblxyXG4gICAgICBpZiAoaXNOb3RTYXZlZFJlcG9ydCkge1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBlLnJldHVyblZhbHVlID0gJ1RoZSByZXBvcnQgZG9jdW1lbnQgaXMgbm90IHNhdmVkLiBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gbGVhdmUgdGhlIHBhZ2U/JztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5wb3BvdmVyPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnBvcG92ZXIgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVByZXZpZXcoZGVzaWduZXIpIHtcclxuICAgIGNvbnN0IHJlcG9ydFByZXZpZXcgPSBkZXNpZ25lci5kZXNpZ25lck1vZGVsLnJlcG9ydFByZXZpZXdNb2RlbC5yZXBvcnRQcmV2aWV3O1xyXG4gICAgY29uc3QgUmVwb3J0UHJldmlld1NlcnZpY2UgPSAoRGV2RXhwcmVzcyBhcyBhbnkpLlJlcG9ydGluZy5EZXNpZ25lci5JbnRlcm5hbC5SZXBvcnRQcmV2aWV3U2VydmljZTtcclxuXHJcbiAgICByZXBvcnRQcmV2aWV3LmluaXRpYWxpemUoUmVwb3J0UHJldmlld1NlcnZpY2UuaW5pdGlhbGl6ZVByZXZpZXcoZGVzaWduZXIuZGVzaWduZXJNb2RlbC5tb2RlbCgpKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN3aXRjaE1vZGUobW9kZTogTW9kZSwgYnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uKSB7XHJcbiAgICBpZiAobW9kZSA9PT0gTW9kZS5WaWV3ZXIpIHtcclxuICAgICAgZHhSZXBvcnREZXNpZ25lci5kZXNpZ25lck1vZGVsLnJlcG9ydFByZXZpZXdNb2RlbC5yZXBvcnRQcmV2aWV3LnByZXZpZXdWaXNpYmxlID0gdHJ1ZTtcclxuICAgICAgdGhpcy5pbml0aWFsaXplUHJldmlldyhkeFJlcG9ydERlc2lnbmVyKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGR4UmVwb3J0RGVzaWduZXIuZGVzaWduZXJNb2RlbC5yZXBvcnRQcmV2aWV3TW9kZWwucmVwb3J0UHJldmlldy5wcmV2aWV3VmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICBkeFJlcG9ydERlc2lnbmVyLmRlc2lnbmVyTW9kZWwucmVwb3J0UHJldmlld01vZGVsLnJlcG9ydFByZXZpZXcuZGVhY3RpdmF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlU3dpdGNoTW9kZUJ1dHRvbihtb2RlLCBidXR0b24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVTd2l0Y2hNb2RlQnV0dG9uKG1vZGU6IE1vZGUsIGJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbikge1xyXG4gICAgaWYgKGJ1dHRvbikge1xyXG4gICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgbW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyBTV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IFNXSVRDSF9UT19WSUVXRVJfVEVYVCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVJlcG9ydERlc2lnbmVyKFxyXG4gICAgJHJlcG9ydENvbnRhaW5lcjogSlF1ZXJ5LFxyXG4gICAgZGVzaWduZXJNb2RlbFVybDogc3RyaW5nLFxyXG4gICAgZ2xvYmFsTmFtZTogc3RyaW5nLFxyXG4gICAgcmVwb3J0SWRTdHI6IHN0cmluZyxcclxuICAgIG9uSW5pdEhhbmRsZXI6IChzZW5kZXI6IGFueSkgPT4gdm9pZCxcclxuICAgIGlzUHJldmlld01vZGU6IGJvb2xlYW5cclxuICApOiBKUXVlcnk8SFRNTEVsZW1lbnQ+IHtcclxuICAgIGNvbnN0IGRlc2lnbmVyID0gJHJlcG9ydENvbnRhaW5lclxyXG4gICAgICAuYXR0cignZGF0YS1iaW5kJywgJ2R4UmVwb3J0RGVzaWduZXI6IGRlc2lnbmVyT3B0aW9ucycpXHJcbiAgICAgIC5hZGRDbGFzcygncmVwb3J0LWRlc2lnbmVyJyk7XHJcblxyXG4gICAgY29uc3QgZGVzaWduZXJPcHRpb25zID0ge1xyXG4gICAgICByZXBvcnRVcmw6IHJlcG9ydElkU3RyLFxyXG4gICAgICByZXF1ZXN0T3B0aW9uczoge1xyXG4gICAgICAgIGdldERlc2lnbmVyTW9kZWxBY3Rpb246IGRlc2lnbmVyTW9kZWxVcmxcclxuICAgICAgfSxcclxuICAgICAgY2FsbGJhY2tzOiB7XHJcbiAgICAgICAgQmVmb3JlUmVuZGVyOiAocykgPT4ge1xyXG4gICAgICAgICAgKHdpbmRvdyBhcyBhbnkpW2dsb2JhbE5hbWVdID0gcztcclxuXHJcbiAgICAgICAgICBpZiAoaXNQcmV2aWV3TW9kZSkge1xyXG4gICAgICAgICAgICBzLmRlc2lnbmVyTW9kZWwucmVwb3J0UHJldmlld01vZGVsLnJlcG9ydFByZXZpZXcucHJldmlld1Zpc2libGUgPSB0cnVlIDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBvbkluaXRIYW5kbGVyKHMpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgQ3VzdG9taXplTWVudUFjdGlvbnM6IHRoaXMuQ3VzdG9taXplTWVudUFjdGlvbnMsXHJcbiAgICAgICAgUHJldmlld0N1c3RvbWl6ZU1lbnVBY3Rpb25zOiB0aGlzLlByZXZpZXdDdXN0b21pemVNZW51QWN0aW9ucyxcclxuICAgICAgICBSZXBvcnRPcGVuZWQ6IChzLCBlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXNQcmV2aWV3TW9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVQcmV2aWV3KHMpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuUmVwb3J0T3BlbmVkKHMsIGUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgUmVwb3J0VGFiQ2xvc2VkOiB0aGlzLlJlcG9ydFRhYkNsb3NlZFxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGtvLmFwcGx5QmluZGluZ3MoeyBkZXNpZ25lck9wdGlvbnMgfSwgZGVzaWduZXJbMF0pO1xyXG5cclxuICAgIHJldHVybiBkZXNpZ25lcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgUHJldmlld0N1c3RvbWl6ZU1lbnVBY3Rpb25zKHMsIGUpIHtcclxuICAgIGNvbnN0IHNob3dEZXNpZ25lckl0ZW0gPSBlLkdldEJ5SWQoKERldkV4cHJlc3MgYXMgYW55KS5SZXBvcnRpbmcuVmlld2VyLkFjdGlvbklkLkRlc2lnbik7XHJcblxyXG4gICAgaWYgKHNob3dEZXNpZ25lckl0ZW0pIHtcclxuICAgICAgc2hvd0Rlc2lnbmVySXRlbS52aXNpYmxlID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIEN1c3RvbWl6ZU1lbnVBY3Rpb25zKHMsIGUpIHtcclxuICAgIGNvbnN0IEFjdGlvbklkID0gKERldkV4cHJlc3MgYXMgYW55KS5SZXBvcnRpbmcuRGVzaWduZXIuQWN0aW9ucy5BY3Rpb25JZDtcclxuICAgIGNvbnN0IGFjdGlvbklkc1RvTW92ZUluVG9vbGJhcjogc3RyaW5nW10gPSBbQWN0aW9uSWQuU2F2ZV07XHJcbiAgICBjb25zdCBhY3Rpb25JZHNUb0hpZGU6IHN0cmluZ1tdID0gW0FjdGlvbklkLk5ld1JlcG9ydCwgQWN0aW9uSWQuTmV3UmVwb3J0VmlhV2l6YXJkLCBBY3Rpb25JZC5PcGVuUmVwb3J0LFxyXG4gICAgICBBY3Rpb25JZC5QcmV2aWV3LCBBY3Rpb25JZC5TYXZlQXMsIEFjdGlvbklkLkV4aXRdO1xyXG5cclxuICAgIGFjdGlvbklkc1RvTW92ZUluVG9vbGJhci5mb3JFYWNoKChpZCkgPT4ge1xyXG4gICAgICBjb25zdCBpdGVtID0gZS5HZXRCeUlkKGlkKTtcclxuXHJcbiAgICAgIGlmIChpdGVtICYmIChpdGVtLmNvbnRhaW5lciA9PT0gJ21lbnUnKSkge1xyXG4gICAgICAgIGl0ZW0uY29udGFpbmVyID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBhY3Rpb25JZHNUb0hpZGUuZm9yRWFjaCgoaWQpID0+IHtcclxuICAgICAgY29uc3QgaXRlbSA9IGUuR2V0QnlJZChpZCk7XHJcblxyXG4gICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgIGl0ZW0udmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBzYXZlQWN0aW9uID0gZS5HZXRCeUlkKChEZXZFeHByZXNzIGFzIGFueSkuUmVwb3J0aW5nLkRlc2lnbmVyLkFjdGlvbnMuQWN0aW9uSWQuU2F2ZSk7XHJcbiAgICBjb25zdCBvcmlnQ2xpY2tBY3Rpb24gPSBzYXZlQWN0aW9uLmNsaWNrQWN0aW9uO1xyXG4gICAgc2F2ZUFjdGlvbi5jbGlja0FjdGlvbiA9ICgpID0+IHtcclxuICAgICAgY29uc3QgdGFiID0gcy5HZXRDdXJyZW50VGFiKCk7XHJcbiAgICAgIHRhYi51cmwoa28udW53cmFwKHNbQ1VSUkVOVF9VUkxfS0VZXSkpO1xyXG4gICAgICBvcmlnQ2xpY2tBY3Rpb24oKTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFJlcG9ydE9wZW5lZChzLCBlKSB7XHJcbiAgICBzW0NVUlJFTlRfVVJMX0tFWV0gPSBzW0NVUlJFTlRfVVJMX0tFWV0gfHwga28ub2JzZXJ2YWJsZSgpO1xyXG4gICAgc1tDVVJSRU5UX1VSTF9LRVldKGUuVXJsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgUmVwb3J0VGFiQ2xvc2VkKHMsIGUpIHtcclxuICAgIHNbQ1VSUkVOVF9VUkxfS0VZXSA9IHNbQ1VSUkVOVF9VUkxfS0VZXSB8fCBrby5vYnNlcnZhYmxlKCk7XHJcbiAgICBzW0NVUlJFTlRfVVJMX0tFWV0obnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNlc3Npb25LZXkoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBTRVNTSU9OX1NUT1JBR0VfTU9ERV9LRVkgKyB0aGlzLnJlcG9ydElkO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgaW5pdFBvcG92ZXIgfSBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyJztcclxuaW1wb3J0IHsgSVJlcG9ydFBhcmFtcywgTW9kZSB9IGZyb20gJy4uLy4uL0lSZXBvcnRQYXJhbXMnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7SVJlcG9ydENvbXBvbmVudH0gZnJvbSAnLi4vLi4vSVJlcG9ydENvbXBvbmVudCc7XHJcbmltcG9ydCBSZWZyZXNoQnV0dG9uIGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVmcmVzaFRpbWVyL0J1dHRvbic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEaWFncmFtUGFnZU9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcbiAgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIGRpYWdyYW1Db250cm9sbGVyVXJsOiBzdHJpbmc7XHJcbiAgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGlhZ3JhbVBhZ2UgaW1wbGVtZW50cyBJUmVwb3J0Q29tcG9uZW50IHtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBTV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA9ICdTd2l0Y2ggdG8gRGVzaWduZXInO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1dJVENIX1RPX1ZJRVdFUl9URVhUID0gJ1N3aXRjaCB0byBWaWV3ZXInO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgRElBR1JBTV9TVE9SQUdFX01PREVfS0VZID0gJ0RJQUdSQU1fU1RPUkFHRV9NT0RFX0tFWSc7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlhZ3JhbUNvbnRyb2xsZXJVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGFkZFJlZnJlc2hCdXR0b246IGJvb2xlYW47XHJcblxyXG4gIHByaXZhdGUgbW9kZTogTW9kZTtcclxuICBwcml2YXRlIGRpYWdyYW06IERldkV4cHJlc3MudWkuZHhEaWFncmFtO1xyXG4gIHByaXZhdGUgcG9wb3ZlcjogRGV2RXhwcmVzcy51aS5keFBvcG92ZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWZyZXNoQnV0dG9uOiBSZWZyZXNoQnV0dG9uO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRGlhZ3JhbVBhZ2VPcHRpb25zKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSBvcHRpb25zLiRjb250YWluZXI7XHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy5hbGxvd0VkaXRpbmcgPSBvcHRpb25zLmFsbG93RWRpdGluZztcclxuICAgIHRoaXMuYWRkUmVmcmVzaEJ1dHRvbiA9IG9wdGlvbnMuYWRkUmVmcmVzaEJ1dHRvbjtcclxuICAgIHRoaXMuZGlhZ3JhbUNvbnRyb2xsZXJVcmwgPSBvcHRpb25zLmRpYWdyYW1Db250cm9sbGVyVXJsO1xyXG5cclxuICAgIHRoaXMubW9kZSA9IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpKSBhcyBNb2RlIHx8IE1vZGUuVmlld2VyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoKSB7XHJcbiAgICB0aGlzLmNyZWF0ZURpYWdyYW1Db250cm9sKCk7XHJcbiAgICB0aGlzLmluaXREaWFncmFtKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuYWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgIHRoaXMuaW5pdFN3aXRjaE1vZGVCdXR0b24oKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscykge1xyXG4gICAgICB0aGlzLnBvcG92ZXIgPSBpbml0UG9wb3ZlcignLmRpYWdyYW0tZGV0YWlscy1saW5rJywgdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMuZGlhZ3JhbS5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnBvcG92ZXI/LmRpc3Bvc2UoKTtcclxuICB9XHJcblxyXG4gIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICBzZW5kUmVxdWVzdChgJHt0aGlzLmRpYWdyYW1Db250cm9sbGVyVXJsfT9pZD0ke3RoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkfWAsICdnZXQnKS50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgIHRoaXMuZGlhZ3JhbS5pbXBvcnQoSlNPTi5zdHJpbmdpZnkoZGF0YSksIGZhbHNlKTtcclxuICAgICAgdGhpcy5kaWFncmFtLm9wdGlvbignaGFzQ2hhbmdlcycsIGZhbHNlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVEaWFncmFtQ29udHJvbCgpIHtcclxuICAgIHRoaXMuZGlhZ3JhbSA9IHRoaXMuJGNvbnRhaW5lci5keERpYWdyYW0oe1xyXG4gICAgICBoaXN0b3J5VG9vbGJhcjoge1xyXG4gICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgY29tbWFuZHM6IFsnc2VwYXJhdG9yJywgJ3VuZG8nLCAncmVkbycsICdzZXBhcmF0b3InLCB7IG5hbWU6ICdzYXZlJywgdGV4dDogJ1NhdmUnLCBpY29uOiAnc2F2ZScgfV0gYXMgYW55XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uQ3VzdG9tQ29tbWFuZDogKGUpID0+IHtcclxuICAgICAgICBzd2l0Y2ggKGUubmFtZSkge1xyXG4gICAgICAgICAgY2FzZSAnc2F2ZSc6XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZVJlcG9ydChlLmNvbXBvbmVudC5leHBvcnQoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZnVsbFNjcmVlbjogZmFsc2UsXHJcbiAgICAgIHJlYWRPbmx5OiB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyXHJcbiAgICB9KS5keERpYWdyYW0oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXREaWFncmFtKCkge1xyXG4gICAgc2VuZFJlcXVlc3QoYCR7dGhpcy5kaWFncmFtQ29udHJvbGxlclVybH0/aWQ9JHt0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZH1gLCAnZ2V0JykudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICB0aGlzLmRpYWdyYW0uaW1wb3J0KEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgdGhpcy5kaWFncmFtLm9wdGlvbignaGFzQ2hhbmdlcycsIGZhbHNlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0aGlzLmFkZFJlZnJlc2hCdXR0b24pIHtcclxuICAgICAgdGhpcy5yZWZyZXNoQnV0dG9uID0gbmV3IFJlZnJlc2hCdXR0b24oJCgnLnJlcG9ydC1yZWZyZXNoLWJ1dHRvbicpLCAoKSA9PiB0aGlzLnJlZnJlc2goKSk7XHJcbiAgICB9XHJcblxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIChlKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmRpYWdyYW0ub3B0aW9uKCdoYXNDaGFuZ2VzJykpIHtcclxuICAgICAgICBlLnJldHVyblZhbHVlID0gJ1RoZSBkb2N1bWVudCBpcyBub3Qgc2F2ZWQuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBsZWF2ZSB0aGUgcGFnZT8nO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdFN3aXRjaE1vZGVCdXR0b24oKSB7XHJcbiAgICBjb25zdCBidXR0b24gPSAkKCcuc3dpdGNoLW1vZGUtYnRuJykuZHhCdXR0b24oe1xyXG4gICAgICB0ZXh0OiB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gdGhpcy5TV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IHRoaXMuU1dJVENIX1RPX1ZJRVdFUl9URVhULFxyXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tb2RlID0gdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IE1vZGUuRGVzaWduZXIgOiBNb2RlLlZpZXdlcjtcclxuICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSwgdGhpcy5tb2RlKTtcclxuICAgICAgICB0aGlzLmRpYWdyYW0ub3B0aW9uKCdyZWFkT25seScsIHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIpO1xyXG4gICAgICAgIGJ1dHRvbi5vcHRpb24oJ3RleHQnLCB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gdGhpcy5TV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IHRoaXMuU1dJVENIX1RPX1ZJRVdFUl9URVhUKTtcclxuICAgICAgfVxyXG4gICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtbWQnKS5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc2F2ZVJlcG9ydChzb3VyY2U6IHN0cmluZykge1xyXG4gICAgY29uc3QgaWQgPSB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZDtcclxuICAgIGF3YWl0IHNlbmRSZXF1ZXN0KHRoaXMuZGlhZ3JhbUNvbnRyb2xsZXJVcmwsICdwb3N0JywgeyBpZCwgc291cmNlIH0sIHRydWUpO1xyXG4gICAgdGhpcy5kaWFncmFtLm9wdGlvbignaGFzQ2hhbmdlcycsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbktleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuRElBR1JBTV9TVE9SQUdFX01PREVfS0VZICsgdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQ7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQge0lSZXBvcnRDb21wb25lbnR9IGZyb20gJy4uLy4uL0lSZXBvcnRDb21wb25lbnQnO1xyXG5pbXBvcnQge01lbnVJdGVtVHlwZX0gZnJvbSAnLi4vLi4vLi4vQnVzaW5lc3MnO1xyXG5pbXBvcnQge0lDZG1SZXBvcnRQYXJhbXMsIElHcmlkUmVwb3J0UGFyYW1zLCBJUmVwb3J0UGFyYW1zfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IFJlZnJlc2hUaW1lciBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlZnJlc2hUaW1lci9JbmRleCc7XHJcbmltcG9ydCBEYXNoYm9hcmRSZXBvcnRQYWdlIGZyb20gJy4uL0Rhc2hib2FyZC9JbmRleCc7XHJcbmltcG9ydCBHcmlkUmVwb3J0UGFnZSBmcm9tICcuLi9HcmlkL0luZGV4JztcclxuaW1wb3J0IENETVJlcG9ydFBhZ2UgZnJvbSAnLi4vQ0RNL0luZGV4JztcclxuaW1wb3J0IERYUmVwb3J0UGFnZSBmcm9tICcuLi9SZXBvcnQvSW5kZXgnO1xyXG5pbXBvcnQgRGlhZ3JhbVJlcG9ydFBhZ2UgZnJvbSAnLi4vRGlhZ3JhbS9JbmRleCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElOZXN0ZWRSZXBvcnQgZXh0ZW5kcyBJUmVwb3J0UGFyYW1zIHtcclxuICBUeXBlOiBNZW51SXRlbVR5cGU7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVNsaWRlc2hvd1JlcG9ydFBhcmFtcyBleHRlbmRzIElSZXBvcnRQYXJhbXMge1xyXG4gIFJlcG9ydHM6IElOZXN0ZWRSZXBvcnRbXTtcclxuICBEZWxheVNlYzogbnVtYmVyO1xyXG4gIFJlZnJlc2hTZWM6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2xpZGVzaG93UmVwb3J0UGFnZU9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICByZXBvcnRQYXJhbXM6IElTbGlkZXNob3dSZXBvcnRQYXJhbXM7XHJcbiAgZGVmYXVsdFJlcG9ydFNldHRpbmdzOiB7IFtrZXkgaW4gTWVudUl0ZW1UeXBlXTogYW55OyB9O1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTbGlkZXNob3dSZXBvcnRQYWdlIGltcGxlbWVudHMgSVJlcG9ydENvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBJU2xpZGVzaG93UmVwb3J0UGFyYW1zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJHJvb3RFbGVtZW50OiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0UmVwb3J0U2V0dGluZ3M6IHsgW2tleSBpbiBNZW51SXRlbVR5cGVdOiBhbnk7IH07XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRzOiBJUmVwb3J0Q29tcG9uZW50W10gPSBbXTtcclxuICBwcml2YXRlIGR4R2FsbGVyeTogRGV2RXhwcmVzcy51aS5keEdhbGxlcnk7XHJcbiAgcHJpdmF0ZSByZWZyZXNoVGltZW91dDogUmVmcmVzaFRpbWVyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJU2xpZGVzaG93UmVwb3J0UGFnZU9wdGlvbnMpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy4kcm9vdEVsZW1lbnQgPSBvcHRpb25zLiRjb250YWluZXI7XHJcbiAgICB0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5ncyA9IG9wdGlvbnMuZGVmYXVsdFJlcG9ydFNldHRpbmdzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoKSB7XHJcbiAgICB0aGlzLnJlbmRlckNvbnRlbnQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy5yZXBvcnRzLmZvckVhY2goKHJlcG9ydCkgPT4ge1xyXG4gICAgICByZXBvcnQuZGlzcG9zZSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVwb3J0cy5mb3JFYWNoKChyZXBvcnQpID0+IHtcclxuICAgICAgcmVwb3J0LnJlZnJlc2goKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJDb250ZW50KCkge1xyXG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IDA7XHJcbiAgICBsZXQgY3VycmVudFRpbWVvdXQgPSBudWxsO1xyXG4gICAgY29uc3QgbWF4SW5kZXggPSB0aGlzLm9wdGlvbnMuUmVwb3J0cy5sZW5ndGg7XHJcblxyXG4gICAgY29uc3Qgc2V0dXBOZXh0SXRlbVNlbGVjdCA9ICgpID0+IHtcclxuICAgICAgY3VycmVudFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgbGV0IG5leHRJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XHJcblxyXG4gICAgICAgIGlmKG5leHRJbmRleCA+PSBtYXhJbmRleCkge1xyXG4gICAgICAgICAgbmV4dEluZGV4ID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZHhHYWxsZXJ5LmdvVG9JdGVtKG5leHRJbmRleCwgdHJ1ZSk7XHJcbiAgICAgIH0sIHRoaXMub3B0aW9ucy5EZWxheVNlYyAqIDEwMDApO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCAkdmlldyA9ICQoJzxkaXYgLz4nKS5hdHRyKHsgY2xhc3M6ICdzbGlkZXNob3ctcmVwb3J0JyB9KS5hcHBlbmRUbyh0aGlzLiRyb290RWxlbWVudCk7XHJcbiAgICBjb25zdCAkZ2FsbGVyeSA9ICQoJzxkaXYgLz4nLCB7IGNsYXNzOiAnc2xpZGVzaG93LXJlcG9ydF9fZ2FsbGVyeScgfSkuZHhHYWxsZXJ5KHtcclxuICAgICAgbG9vcDogZmFsc2UsXHJcbiAgICAgIGRhdGFTb3VyY2U6IHRoaXMub3B0aW9ucy5SZXBvcnRzLFxyXG4gICAgICBzbGlkZXNob3dEZWxheTogMCxcclxuICAgICAgc2hvd05hdkJ1dHRvbnM6IGZhbHNlLFxyXG4gICAgICBzaG93SW5kaWNhdG9yOiB0cnVlLFxyXG4gICAgICBzdHJldGNoSW1hZ2VzOiB0cnVlLFxyXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcclxuICAgICAgb25Jbml0aWFsaXplZDogKCkgPT4gc2V0dXBOZXh0SXRlbVNlbGVjdCgpLFxyXG4gICAgICBvblNlbGVjdGlvbkNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgY3VycmVudEluZGV4ID0gZS5jb21wb25lbnQub3B0aW9uKCdzZWxlY3RlZEluZGV4Jyk7XHJcblxyXG4gICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoY3VycmVudFRpbWVvdXQpO1xyXG4gICAgICAgIHNldHVwTmV4dEl0ZW1TZWxlY3QoKTtcclxuICAgICAgfSxcclxuICAgICAgaXRlbVRlbXBsYXRlOiAocmVwb3J0UGFyYW1zOiBJTmVzdGVkUmVwb3J0LCBpbmRleCwgaXRlbUVsZW1lbnQpID0+IHtcclxuICAgICAgICBpdGVtRWxlbWVudC5hdHRyKHsgY2xhc3M6ICdzbGlkZXNob3ctcmVwb3J0X19nYWxsZXJ5LWl0ZW0nIH0pLmhlaWdodCgnMTAwJScpO1xyXG5cclxuICAgICAgICBjb25zdCAkc2xpZGVFbGVtZW50ID0gJCgnPGRpdiAvPicsIHsgY2xhc3M6ICdzbGlkZXNob3ctcmVwb3J0X19zbGlkZS1jb250ZW50JyB9KS5oZWlnaHQoJzEwMCUnKTtcclxuICAgICAgICBsZXQgcmVwb3J0U2xpZGU6IElSZXBvcnRDb21wb25lbnQ7XHJcblxyXG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHN3aXRjaCAocmVwb3J0UGFyYW1zLlR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuRGFzaGJvYXJkOlxyXG4gICAgICAgICAgICAgIGNvbnN0ICRkYXNoYm9hcmRQb3NpdGlvbkVsZW1lbnQgPSAkKCc8ZGl2IC8+JywgeyBjbGFzczogJ3JlcG9ydC1wb3NpdGlvbicgfSk7XHJcbiAgICAgICAgICAgICAgJGRhc2hib2FyZFBvc2l0aW9uRWxlbWVudC5hcHBlbmRUbygkc2xpZGVFbGVtZW50KTtcclxuXHJcbiAgICAgICAgICAgICAgcmVwb3J0U2xpZGUgPSBuZXcgRGFzaGJvYXJkUmVwb3J0UGFnZSh7XHJcbiAgICAgICAgICAgICAgICAuLi4odGhpcy5kZWZhdWx0UmVwb3J0U2V0dGluZ3NbTWVudUl0ZW1UeXBlLkRhc2hib2FyZF0gfHwge30pLFxyXG4gICAgICAgICAgICAgICAgJGRhc2hib2FyZENvbnRhaW5lcjogJGRhc2hib2FyZFBvc2l0aW9uRWxlbWVudCxcclxuICAgICAgICAgICAgICAgIHJlcG9ydFBhcmFtczogcmVwb3J0UGFyYW1zIGFzIElSZXBvcnRQYXJhbXNcclxuICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgJHNsaWRlRWxlbWVudC5maW5kKCdkYXNoYm9hcmQtdGl0bGUnKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgJHNsaWRlRWxlbWVudC5maW5kKCcuZHgtZGFzaGJvYXJkLWxheW91dC1jb250YWluZXInKS5jc3MoeyB0b3A6IDAgfSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIE1lbnVJdGVtVHlwZS5HcmlkVmlldzpcclxuICAgICAgICAgICAgICBjb25zdCAkZ3JpZFBvc2l0aW9uRWxlbWVudCA9ICQoJzxkaXYgLz4nLCB7IGNsYXNzOiAnc2xpZGVzaG93LXJlcG9ydF9fZ3JpZC1wb3NpdGlvbicgfSk7XHJcbiAgICAgICAgICAgICAgJHNsaWRlRWxlbWVudC5hZGRDbGFzcygnaXN6b2xlYS10aGVtZScpLmFkZENsYXNzKCdwYW5lbC1ib2R5Jyk7XHJcblxyXG4gICAgICAgICAgICAgICRncmlkUG9zaXRpb25FbGVtZW50LmFwcGVuZFRvKCRzbGlkZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgIHJlcG9ydFNsaWRlID0gbmV3IEdyaWRSZXBvcnRQYWdlKHtcclxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5nc1tNZW51SXRlbVR5cGUuR3JpZFZpZXddIHx8IHt9KSxcclxuICAgICAgICAgICAgICAgIGdyaWRQb3NpdGlvbk1hcmtlcjogJGdyaWRQb3NpdGlvbkVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICByZXBvcnRQYXJhbXM6IHJlcG9ydFBhcmFtcyBhcyBhbnkgYXMgSUdyaWRSZXBvcnRQYXJhbXMsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgTWVudUl0ZW1UeXBlLkNETTpcclxuICAgICAgICAgICAgICByZXBvcnRTbGlkZSA9IG5ldyBDRE1SZXBvcnRQYWdlKHtcclxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5nc1tNZW51SXRlbVR5cGUuQ0RNXSB8fCB7fSksXHJcbiAgICAgICAgICAgICAgICAkY29udGFpbmVyOiAkc2xpZGVFbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgcmVwb3J0UGFyYW1zOiByZXBvcnRQYXJhbXMgYXMgYW55IGFzIElDZG1SZXBvcnRQYXJhbXMsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgTWVudUl0ZW1UeXBlLlJlcG9ydDpcclxuICAgICAgICAgICAgICBjb25zdCAkcmVwb3J0UG9zaXRpb25FbGVtZW50ID0gJCgnPGRpdiAvPicsIHsgY2xhc3M6ICdyZXBvcnQtcG9zaXRpb24nIH0pO1xyXG4gICAgICAgICAgICAgICRyZXBvcnRQb3NpdGlvbkVsZW1lbnQuYXBwZW5kVG8oJHNsaWRlRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgcmVwb3J0U2xpZGUgPSBuZXcgRFhSZXBvcnRQYWdlKHtcclxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5nc1tNZW51SXRlbVR5cGUuUmVwb3J0XSB8fCB7fSksXHJcbiAgICAgICAgICAgICAgICAkcmVwb3J0Q29udGFpbmVyOiAkcmVwb3J0UG9zaXRpb25FbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgcmVwb3J0UGFyYW1zOiByZXBvcnRQYXJhbXMgYXMgSVJlcG9ydFBhcmFtcyxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuRGlhZ3JhbTpcclxuICAgICAgICAgICAgICBjb25zdCAkZGlhZ3JhbVBvc2l0aW9uRWxlbWVudCA9ICQoJzxkaXYgLz4nLCB7IGNsYXNzOiAncmVwb3J0LXBvc2l0aW9uJyB9KTtcclxuICAgICAgICAgICAgICAkZGlhZ3JhbVBvc2l0aW9uRWxlbWVudC5hcHBlbmRUbygkc2xpZGVFbGVtZW50KTtcclxuICAgICAgICAgICAgICByZXBvcnRTbGlkZSA9IG5ldyBEaWFncmFtUmVwb3J0UGFnZSh7XHJcbiAgICAgICAgICAgICAgICAuLi4odGhpcy5kZWZhdWx0UmVwb3J0U2V0dGluZ3NbTWVudUl0ZW1UeXBlLkRpYWdyYW1dIHx8IHt9KSxcclxuICAgICAgICAgICAgICAgICRjb250YWluZXI6ICRkaWFncmFtUG9zaXRpb25FbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgcmVwb3J0UGFyYW1zOiByZXBvcnRQYXJhbXMgYXMgSVJlcG9ydFBhcmFtcyxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuTWVudU5vZGU6XHJcbiAgICAgICAgICAgIGNhc2UgTWVudUl0ZW1UeXBlLlNsaWRlc2hvdzpcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAocmVwb3J0U2xpZGUpIHtcclxuICAgICAgICAgICAgcmVwb3J0U2xpZGUuaW5pdCgpO1xyXG4gICAgICAgICAgICB0aGlzLnJlcG9ydHMucHVzaChyZXBvcnRTbGlkZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwgNTAwKTtcclxuXHJcbiAgICAgICAgJHNsaWRlRWxlbWVudC5hcHBlbmRUbyhpdGVtRWxlbWVudCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZHhHYWxsZXJ5ID0gJGdhbGxlcnkuZHhHYWxsZXJ5KCdpbnN0YW5jZScpO1xyXG5cclxuICAgICRnYWxsZXJ5LmFwcGVuZFRvKCR2aWV3KTtcclxuXHJcbiAgICB0aGlzLnJlZnJlc2hUaW1lb3V0ID0gbmV3IFJlZnJlc2hUaW1lcih7Y2FsbGJhY2s6ICgpID0+IHRoaXMucmVmcmVzaCgpLCBlbGFwc2VkQ2FsbGJhY2s6IChlKSA9PiB7fX0pO1xyXG4gICAgdGhpcy5yZWZyZXNoVGltZW91dC5zdGFydCh0aGlzLm9wdGlvbnMuUmVmcmVzaFNlYyAqIDEwMDApO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSVJlcG9ydFBhcmFtcywgTW9kZSB9IGZyb20gJy4uLy4uL0lSZXBvcnRQYXJhbXMnO1xyXG5pbXBvcnQgeyBJUmVwb3J0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vSVJlcG9ydENvbXBvbmVudCc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHsgR3JpZERhdGFDb2x1bW5EYXRhVHlwZSB9IGZyb20gJy4uLy4uLy4uL1dpZGdldHMvSUdyaWRTdGF0ZSc7XHJcbmltcG9ydCB7IGluaXRQb3BvdmVyIH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZXBvcnREZXRhaWxzUG9wb3Zlcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHYW50dENoYXJ0T3B0aW9ucyB7XHJcbiAgY2hhcnRQb3NpdGlvbk1hcmtlcjogSlF1ZXJ5O1xyXG4gIGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcbiAgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxuICBnYW50dFJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZztcclxuICBzaG93SGVhZGVyOiBib29sZWFuO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdhbnR0VGFzayB7XHJcbiAgSWQ6IG51bWJlcjtcclxuICBQYXJlbnRJZDogbnVtYmVyO1xyXG4gIFRpdGxlOiBzdHJpbmc7XHJcbiAgU3RhcnQ6IERhdGU7XHJcbiAgRW5kOiBEYXRlO1xyXG4gIFByb2dyZXNzOiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR2FudHREZXBlbmRlbmN5XHJcbntcclxuICBJZDogbnVtYmVyO1xyXG4gIFByZWRlY2Vzc29ySWQ6IG51bWJlcjtcclxuICBTdWNjZXNzb3JJZDogbnVtYmVyO1xyXG4gIFR5cGU6IG51bWJlcjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElHYW50dFJlc291cmNlIHtcclxuICBJZDogbnVtYmVyO1xyXG4gIFRleHQ6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIElHYW50dFJlc291cmNlQXNzaWdubWVudCB7XHJcbiAgSWQ6IG51bWJlcjtcclxuICBUYXNrSWQ6IG51bWJlcjtcclxuICBSZXNvdXJjZUlkOiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR2FudHRDaGFydERhdGFNb2RlbCB7XHJcbiAgVGFza3M6IElHYW50dFRhc2tbXTtcclxuICBEZXBlbmRlbmNpZXM6IElHYW50dERlcGVuZGVuY3lbXTtcclxuICBSZXNvdXJjZXM6IElHYW50dFJlc291cmNlW107XHJcbiAgUmVzb3VyY2VBc3NpZ25tZW50czogSUdhbnR0UmVzb3VyY2VBc3NpZ25tZW50W107XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR2FudHRDb2x1bW5TdGF0ZSB7XHJcbiAgZGF0YUZpZWxkPzogc3RyaW5nO1xyXG4gIGRhdGFUeXBlPzogR3JpZERhdGFDb2x1bW5EYXRhVHlwZTtcclxuICB3aWR0aD86IHN0cmluZztcclxuICBzb3J0SW5kZXg/OiBudW1iZXI7XHJcbiAgc29ydE9yZGVyPzogc3RyaW5nO1xyXG4gIGNhcHRpb24/OiBzdHJpbmc7XHJcbiAgdmlzaWJsZT86IGJvb2xlYW47XHJcbiAgdmlzaWJsZUluZGV4PzogbnVtYmVyO1xyXG4gIHRhc2tDb2x1bW5UeXBlOiBHYW50dFRhc2tzQ29sdW1uVHlwZTtcclxufVxyXG5cclxuaW50ZXJmYWNlIElHYW50dFNldHRpbmdzIHtcclxuICBUYXNrQ29sdW1uczogSUdhbnR0Q29sdW1uU3RhdGVbXSxcclxuICBEYkNvbm5lY3Rpb25OYW1lOiBzdHJpbmcsXHJcbiAgVGFibGVOYW1lOiBzdHJpbmcsXHJcbiAgUmVzb3VyY2VzVGFibGVOYW1lOiBzdHJpbmcsXHJcbiAgUmVzb3VyY2VzS2V5RmllbGQ6IHN0cmluZyxcclxuICBSZXNvdXJjZXNUZXh0RmllbGQ6IHN0cmluZyxcclxuICBSZXNvdXJjZUFzc2lnbm1lbnRUYWJsZU5hbWU6IHN0cmluZztcclxuICBSZXNvdXJjZUFzc2lnbm1lbnRLZXlGaWVsZDogc3RyaW5nO1xyXG4gIFJlc291cmNlQXNzaWdubWVudFRhc2tJZEZpZWxkOiBzdHJpbmc7XHJcbiAgUmVzb3VyY2VBc3NpZ25tZW50UmVzb3VyY2VJZEZpZWxkOiBzdHJpbmc7XHJcbn1cclxuXHJcbmVudW0gR2FudHRUYXNrc0NvbHVtblR5cGVcclxue1xyXG4gIEtleSA9IDEsXHJcbiAgVGl0bGUgPSAyLFxyXG4gIFN0YXJ0ID0gMyxcclxuICBFbmQgPSA0LFxyXG4gIFBhcmVudElkID0gNSxcclxuICBQcm9ncmVzcyA9IDZcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2FubnRDaGFydCBpbXBsZW1lbnRzIElSZXBvcnRDb21wb25lbnQge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgPSAnU3dpdGNoIHRvIERlc2lnbmVyJztcclxuICBwcml2YXRlIHJlYWRvbmx5IFNXSVRDSF9UT19WSUVXRVJfVEVYVCA9ICdTd2l0Y2ggdG8gVmlld2VyJztcclxuICBwcml2YXRlIHJlYWRvbmx5IENIQVJUX1NUT1JBR0VfTU9ERV9LRVkgPSAnQ0hBUlRfU1RPUkFHRV9NT0RFX0tFWSc7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhcnRQb3NpdGlvbk1hcmtlcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdhbnR0UmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd0hlYWRlcjogYm9vbGVhbjtcclxuICBwcml2YXRlIHBvcG92ZXI6IERldkV4cHJlc3MudWkuZHhQb3BvdmVyIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgbW9kZTogTW9kZTtcclxuICBwcml2YXRlIGhhc0Zvcm0gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBjaGFydDogRGV2RXhwcmVzcy51aS5keEdhbnR0IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElHYW50dENoYXJ0T3B0aW9ucykge1xyXG4gICAgdGhpcy5jaGFydFBvc2l0aW9uTWFya2VyID0gb3B0aW9ucy5jaGFydFBvc2l0aW9uTWFya2VyO1xyXG4gICAgdGhpcy5yZXBvcnRQYXJhbXMgPSBvcHRpb25zLnJlcG9ydFBhcmFtcztcclxuICAgIHRoaXMuYWRkUmVmcmVzaEJ1dHRvbiA9IG9wdGlvbnMuYWRkUmVmcmVzaEJ1dHRvbjtcclxuICAgIHRoaXMuYWxsb3dFZGl0aW5nID0gb3B0aW9ucy5hbGxvd0VkaXRpbmc7XHJcbiAgICB0aGlzLmdhbnR0UmVwb3J0Q29udHJvbGxlclVybCA9IG9wdGlvbnMuZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsO1xyXG4gICAgdGhpcy5zaG93SGVhZGVyID0gb3B0aW9ucy5zaG93SGVhZGVyO1xyXG4gICAgdGhpcy5tb2RlID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCkpIGFzIE1vZGUgfHwgTW9kZS5WaWV3ZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdCgpOiB2b2lkIHtcclxuICAgIGxldCBnYW50dFNldHRpbmdzOiBJR2FudHRTZXR0aW5ncyA9IHtcclxuICAgICAgRGJDb25uZWN0aW9uTmFtZTogJycsIFRhYmxlTmFtZTogJycsIFRhc2tDb2x1bW5zOiBbXSxcclxuICAgICAgUmVzb3VyY2VzVGFibGVOYW1lOiAnJywgUmVzb3VyY2VzVGV4dEZpZWxkOiAnJywgUmVzb3VyY2VzS2V5RmllbGQ6ICcnLFxyXG4gICAgICBSZXNvdXJjZUFzc2lnbm1lbnRUYXNrSWRGaWVsZDogJycsIFJlc291cmNlQXNzaWdubWVudFJlc291cmNlSWRGaWVsZDogJycsIFJlc291cmNlQXNzaWdubWVudEtleUZpZWxkOiAnJywgUmVzb3VyY2VBc3NpZ25tZW50VGFibGVOYW1lOiAnJ1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBjb2x1bW5zOiBJR2FudHRDb2x1bW5TdGF0ZVtdID0gW107XHJcbiAgICBsZXQgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG5cclxuICAgIHNlbmRSZXF1ZXN0KGAke3RoaXMuZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsfS9HZXRHYW50dENoYXJ0U2V0dGluZ3NgLCAncG9zdCcsIHsgaWQ6IHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkIH0sIGZhbHNlLCB7IGRhdGFUeXBlOiAnanNvbicgfSlcclxuICAgICAgLnRoZW4oKGRhdGE6IElHYW50dFNldHRpbmdzKSA9PiB7XHJcbiAgICAgICAgZ2FudHRTZXR0aW5ncyA9IGRhdGE7XHJcblxyXG4gICAgICAgIGlmKCFnYW50dFNldHRpbmdzLkRiQ29ubmVjdGlvbk5hbWUgfHwgIWdhbnR0U2V0dGluZ3MuVGFibGVOYW1lIHx8ICFnYW50dFNldHRpbmdzLlRhc2tDb2x1bW5zIHx8ICFnYW50dFNldHRpbmdzLlRhc2tDb2x1bW5zLmxlbmd0aCkge1xyXG4gICAgICAgICAgZ2FudHRTZXR0aW5ncy5UYXNrQ29sdW1ucyA9IFtdO1xyXG5cclxuICAgICAgICAgIGZvciAobGV0IGl0ZW0gPSAwOyBpdGVtIDwgNjsgaXRlbSsrKSB7XHJcbiAgICAgICAgICAgIGdhbnR0U2V0dGluZ3MuVGFza0NvbHVtbnMucHVzaCh7IHRhc2tDb2x1bW5UeXBlOiBHYW50dFRhc2tzQ29sdW1uVHlwZVtHYW50dFRhc2tzQ29sdW1uVHlwZVtpdGVtKzFdXSB9KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnNldHVwRm9ybShnYW50dFNldHRpbmdzLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkYXRhLlRhc2tDb2x1bW5zLmZvckVhY2goKGMpID0+IHtcclxuICAgICAgICAgIGNvbHVtbnNbYy50YXNrQ29sdW1uVHlwZS0xXSA9IGM7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGdhbnR0U2V0dGluZ3MuVGFza0NvbHVtbnMgPSBjb2x1bW5zO1xyXG5cclxuICAgICAgICBpc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNlbmRSZXF1ZXN0KGAke3RoaXMuZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsfS9HZXRHYW50dENoYXJ0RGF0YWAsICdwb3N0JywgeyBpZDogdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQgfSwgZmFsc2UsIHtcclxuICAgICAgICAgIGRhdGFUeXBlOiAnanNvbidcclxuICAgICAgICB9KTtcclxuICAgICAgfSlcclxuICAgICAgLnRoZW4oKGRhdGE6IHsgRGF0YTogSUdhbnR0Q2hhcnREYXRhTW9kZWwgfSkgPT4ge1xyXG4gICAgICAgIGlmKCFpc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZih0aGlzLm1vZGUgPT09IE1vZGUuRGVzaWduZXIpIHtcclxuICAgICAgICAgIHRoaXMuc2V0dXBGb3JtKGdhbnR0U2V0dGluZ3MsICFpc0luaXRpYWxpemVkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0dXBDaGFydChkYXRhLkRhdGEsIGNvbHVtbnMsIGdhbnR0U2V0dGluZ3MpO1xyXG4gICAgICB9KS5jYXRjaCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXR1cEZvcm0oZ2FudHRTZXR0aW5ncywgdHJ1ZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5hbGxvd0VkaXRpbmcpIHtcclxuICAgICAgdGhpcy5pbml0U3dpdGNoTW9kZUJ1dHRvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMucG9wb3ZlciA9IGluaXRQb3BvdmVyKCcuZGlhZ3JhbS1kZXRhaWxzLWxpbmsnLCB0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdFN3aXRjaE1vZGVCdXR0b24oKSB7XHJcbiAgICBjb25zdCBidXR0b24gPSAkKCcuc3dpdGNoLW1vZGUtYnRuJykuZHhCdXR0b24oe1xyXG4gICAgICB0ZXh0OiB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gdGhpcy5TV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IHRoaXMuU1dJVENIX1RPX1ZJRVdFUl9URVhULFxyXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tb2RlID0gdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IE1vZGUuRGVzaWduZXIgOiBNb2RlLlZpZXdlcjtcclxuICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSwgdGhpcy5tb2RlKTtcclxuICAgICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IHRoaXMuU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgOiB0aGlzLlNXSVRDSF9UT19WSUVXRVJfVEVYVCk7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgICB9XHJcbiAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1tZCcpLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEZvcm0oZ2FudHRTZXR0aW5nczogSUdhbnR0U2V0dGluZ3MsIGluaXRpYWxTZXR1cDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5oYXNGb3JtID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCBmb3JtSXRlbXM6IERldkV4cHJlc3MudWkuZHhGb3JtLkl0ZW1bXSA9IFtcclxuICAgICAgeyBkYXRhRmllbGQ6ICdEYkNvbm5lY3Rpb25OYW1lJywgY2FwdGlvbjogJ0Nvbm5lY3Rpb24gTmFtZScgfSxcclxuICAgICAgeyBkYXRhRmllbGQ6ICdUYWJsZU5hbWUnLCBjYXB0aW9uOiAnVGFibGUnIH0sXHJcbiAgICBdO1xyXG5cclxuICAgIGZvciAobGV0IGl0ZW0gPSAxOyBpdGVtIDwgNzsgaXRlbSsrKSB7XHJcbiAgICAgIGZvcm1JdGVtcy5wdXNoKHsgaXRlbVR5cGU6ICdncm91cCcsIGNvbENvdW50OiA4LCBpdGVtczogW1xyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLnRhc2tDb2x1bW5UeXBlYCwgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS5kYXRhRmllbGRgLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6IGAke0dhbnR0VGFza3NDb2x1bW5UeXBlW2l0ZW1dfSBEYXRhIEZpZWxkYCB9IH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0uY2FwdGlvbmAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ0NhcHRpb24nIH0gfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS5kYXRhVHlwZWAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ0RhdGFUeXBlJyB9IH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0ud2lkdGhgLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdXaWR0aCcgfSwgZWRpdG9yVHlwZTogJ2R4TnVtYmVyQm94JyB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLnNvcnRJbmRleGAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1NvcnRJbmRleCcgfSwgZWRpdG9yVHlwZTogJ2R4TnVtYmVyQm94JyB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLnNvcnRPcmRlcmAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1NvcnRPcmRlcicgfSwgZWRpdG9yVHlwZTogJ2R4U2VsZWN0Qm94JywgZWRpdG9yT3B0aW9uczogeyBpdGVtczogWydhc2MnLCAnZGVzYyddLCBzaG93Q2xlYXJCdXR0b246IHRydWUgfSBhcyBEZXZFeHByZXNzLnVpLmR4U2VsZWN0Qm94LlByb3BlcnRpZXMgfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS52aXNpYmxlYCwgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnVmlzaWJsZScgfSwgZWRpdG9yVHlwZTogJ2R4Q2hlY2tCb3gnIH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0udmlzaWJsZUluZGV4YCwgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnVmlzaWJsZUluZGV4JyB9IH0sXHJcbiAgICAgICAgXVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmb3JtSXRlbXMucHVzaCh7XHJcbiAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxyXG4gICAgICBjYXB0aW9uOiAnUmVzb3VyY2VzJyxcclxuICAgICAgY29sQ291bnQ6IDQsXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdSZXNvdXJjZXNUYWJsZU5hbWUnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcgLHRleHQ6ICdUYWJsZScgfSwgY29sU3BhbjogMiB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnUmVzb3VyY2VzS2V5RmllbGQnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdLZXkgRmllbGQnIH0gfSxcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ1Jlc291cmNlc1RleHRGaWVsZCcsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1RleHQgRmllbGQnIH0gfSxcclxuICAgICAgXVxyXG4gICAgfSk7XHJcblxyXG4gICAgZm9ybUl0ZW1zLnB1c2goe1xyXG4gICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgY2FwdGlvbjogJ1Jlc291cmNlIEFzc2lnbm1lbnRzJyxcclxuICAgICAgY29sQ291bnQ6IDUsXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdSZXNvdXJjZUFzc2lnbm1lbnRUYWJsZU5hbWUnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdUYWJsZScgfSwgY29sU3BhbjogMiB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnUmVzb3VyY2VBc3NpZ25tZW50S2V5RmllbGQnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdLZXkgRmllbGQnIH0gfSxcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ1Jlc291cmNlQXNzaWdubWVudFRhc2tJZEZpZWxkJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnVGFzayBJZCBGaWVsZCcgfSB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnUmVzb3VyY2VBc3NpZ25tZW50UmVzb3VyY2VJZEZpZWxkJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnUmVzb3VyY2UgSWQgRmllbGQnIH0gfSxcclxuICAgICAgXVxyXG4gICAgfSk7XHJcblxyXG4gICAgZm9ybUl0ZW1zLnB1c2goe1xyXG4gICAgICBpdGVtVHlwZTogJ2J1dHRvbicsXHJcbiAgICAgIGJ1dHRvbk9wdGlvbnM6IHtcclxuICAgICAgICB0ZXh0OiAnU2F2ZScsXHJcbiAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZGF0YSA9IGZvcm0ub3B0aW9uKCdmb3JtRGF0YScpIGFzIElHYW50dFNldHRpbmdzO1xyXG5cclxuICAgICAgICAgIGlmKGRhdGEuVGFza0NvbHVtbnMpIHtcclxuICAgICAgICAgICAgZGF0YS5UYXNrQ29sdW1ucyA9IGRhdGEuVGFza0NvbHVtbnMuZmlsdGVyKChjKSA9PiAhIWMuZGF0YUZpZWxkKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBzZW5kUmVxdWVzdChgJHt0aGlzLmdhbnR0UmVwb3J0Q29udHJvbGxlclVybH0vVXBkYXRlR2FudHRDaGFydFNldHRpbmdzYCwgJ3Bvc3QnLCB7IGlkOiB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZCwgc2V0dGluZ3M6IEpTT04uc3RyaW5naWZ5KGZvcm0ub3B0aW9uKCdmb3JtRGF0YScpKSB9LCB0cnVlLCB7IGRhdGFUeXBlOiAnanNvbicgfSlcclxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGZvcm0gPSAkKCc8ZGl2IC8+JykuY3NzKCdwYWRkaW5nJywgMjApLmluc2VydEFmdGVyKHRoaXMuY2hhcnRQb3NpdGlvbk1hcmtlcikuZHhGb3JtKHtcclxuICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgaGVpZ2h0OiBpbml0aWFsU2V0dXAgPyAnY2FsYygxMDAlIC0gNTBweCknIDogJ2NhbGMoNTAlIC0gNTBweCknLFxyXG4gICAgICBmb3JtRGF0YTogZ2FudHRTZXR0aW5ncyxcclxuICAgICAgc2Nyb2xsaW5nRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgaXRlbXM6IGZvcm1JdGVtc1xyXG4gICAgfSkuZHhGb3JtKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cENoYXJ0IChkYXRhOiBJR2FudHRDaGFydERhdGFNb2RlbCwgY29sdW1uczogSUdhbnR0Q29sdW1uU3RhdGVbXSwgZ2FudHRTZXR0aW5nczogSUdhbnR0U2V0dGluZ3MpIHtcclxuICAgIGxldCB0b3RhbFdpZHRoID0gMDtcclxuICAgIGxldCB1c2VBdXRvV2lkdGggPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBjb2x1bW5zTWFwcGluZyA9IHt9O1xyXG5cclxuICAgIGNvbHVtbnMuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICBpZiAoYy50YXNrQ29sdW1uVHlwZSkge1xyXG4gICAgICAgIGNvbHVtbnNNYXBwaW5nW2MudGFza0NvbHVtblR5cGVdID0gYy5kYXRhRmllbGQ7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLnZpc2libGUpLmZvckVhY2goKGMpID0+IHtcclxuICAgICAgY29uc3QgdyA9IHBhcnNlSW50KGMud2lkdGgpO1xyXG5cclxuICAgICAgaWYoIWlzTmFOKHcpKSB7XHJcbiAgICAgICAgdG90YWxXaWR0aCArPSB3O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHVzZUF1dG9XaWR0aCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2hhcnQgPSB0aGlzLmNoYXJ0UG9zaXRpb25NYXJrZXIuZHhHYW50dCh7XHJcbiAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgIGhlaWdodDogdGhpcy5oYXNGb3JtID8gJzUwJScgOiAnY2FsYygxMDAlIC0gNjBweCknLFxyXG4gICAgICBmaXJzdERheU9mV2VlazogNixcclxuICAgICAgdGFza0xpc3RXaWR0aDogKCF1c2VBdXRvV2lkdGggJiYgdG90YWxXaWR0aCA+IDApID8gdG90YWxXaWR0aCA6IHZvaWQgMCxcclxuICAgICAgdG9vbGJhcjoge1xyXG4gICAgICAgIGl0ZW1zOiBbJ3pvb21JbicsICd6b29tT3V0JywgJ3NlcGFyYXRvcicsICd0YXNrRGV0YWlscyddXHJcbiAgICAgIH0sXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbHVtbnM6IGNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLnZpc2libGUpLm1hcCgoYykgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6IGMuZGF0YUZpZWxkLFxyXG4gICAgICAgICAgZGF0YVR5cGU6IGMuZGF0YVR5cGUsXHJcbiAgICAgICAgICB3aWR0aDogYy53aWR0aCxcclxuICAgICAgICAgIHZpc2libGVJbmRleDogYy52aXNpYmxlSW5kZXgsXHJcbiAgICAgICAgICBzb3J0SW5kZXg6IGMuc29ydEluZGV4LFxyXG4gICAgICAgICAgc29ydE9yZGVyOiBjLnNvcnRPcmRlciAmJiAoYy5zb3J0T3JkZXIgPT09ICdhc2MnID8gJ2FzYycgOiAnZGVzYycpLFxyXG4gICAgICAgICAgY2FwdGlvbjogYy5jYXB0aW9uIHx8IHZvaWQgMFxyXG4gICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRyZWVMaXN0Q29sdW1uXHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXNrczoge1xyXG4gICAgICAgIGRhdGFTb3VyY2U6IGRhdGEuVGFza3MsXHJcbiAgICAgICAga2V5RXhwcjogY29sdW1uc01hcHBpbmdbR2FudHRUYXNrc0NvbHVtblR5cGUuS2V5XSxcclxuICAgICAgICBzdGFydEV4cHI6IGNvbHVtbnNNYXBwaW5nW0dhbnR0VGFza3NDb2x1bW5UeXBlLlN0YXJ0XSxcclxuICAgICAgICBlbmRFeHByOiBjb2x1bW5zTWFwcGluZ1tHYW50dFRhc2tzQ29sdW1uVHlwZS5FbmRdLFxyXG4gICAgICAgIHBhcmVudElkRXhwcjogY29sdW1uc01hcHBpbmdbR2FudHRUYXNrc0NvbHVtblR5cGUuUGFyZW50SWRdLFxyXG4gICAgICAgIHByb2dyZXNzRXhwcjogY29sdW1uc01hcHBpbmdbR2FudHRUYXNrc0NvbHVtblR5cGUuUHJvZ3Jlc3NdLFxyXG4gICAgICAgIHRpdGxlRXhwcjogY29sdW1uc01hcHBpbmdbR2FudHRUYXNrc0NvbHVtblR5cGUuVGl0bGVdXHJcbiAgICAgIH0sXHJcbiAgICAgIGRlcGVuZGVuY2llczoge1xyXG4gICAgICAgIGRhdGFTb3VyY2U6IGRhdGEuRGVwZW5kZW5jaWVzLFxyXG4gICAgICAgIGtleUV4cHI6ICdJZCcsXHJcbiAgICAgICAgcHJlZGVjZXNzb3JJZEV4cHI6ICdQcmVkZWNlc3NvcklkJyxcclxuICAgICAgICBzdWNjZXNzb3JJZEV4cHI6ICdTdWNjZXNzb3JJZCcsXHJcbiAgICAgICAgdHlwZUV4cHI6ICdUeXBlJ1xyXG4gICAgICB9LFxyXG4gICAgICByZXNvdXJjZXM6IHtcclxuICAgICAgICBkYXRhU291cmNlOiBkYXRhLlJlc291cmNlcyxcclxuICAgICAgICBrZXlFeHByOiBnYW50dFNldHRpbmdzLlJlc291cmNlc0tleUZpZWxkLFxyXG4gICAgICAgIHRleHRFeHByOiBnYW50dFNldHRpbmdzLlJlc291cmNlc1RleHRGaWVsZFxyXG4gICAgICB9LFxyXG4gICAgICByZXNvdXJjZUFzc2lnbm1lbnRzOiB7XHJcbiAgICAgICAgZGF0YVNvdXJjZTogZGF0YS5SZXNvdXJjZUFzc2lnbm1lbnRzLFxyXG4gICAgICAgIGtleUV4cHI6IGdhbnR0U2V0dGluZ3MuUmVzb3VyY2VBc3NpZ25tZW50S2V5RmllbGQsXHJcbiAgICAgICAgcmVzb3VyY2VJZEV4cHI6IGdhbnR0U2V0dGluZ3MuUmVzb3VyY2VBc3NpZ25tZW50UmVzb3VyY2VJZEZpZWxkLFxyXG4gICAgICAgIHRhc2tJZEV4cHI6IGdhbnR0U2V0dGluZ3MuUmVzb3VyY2VBc3NpZ25tZW50VGFza0lkRmllbGRcclxuICAgICAgfSxcclxuICAgIH0pLmR4R2FudHQoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2hhcnQ/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuY2hhcnQgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTZXNzaW9uS2V5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5DSEFSVF9TVE9SQUdFX01PREVfS0VZICsgdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQ7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkYvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vVmVuZG9yL0RldkV4dHJlbWUvZHguYWxsLmQudHNcIiAvPlxyXG5cclxuZXhwb3J0IHsgSUxpY2VuY2UsIE1lbnVJdGVtVHlwZSwgTGljZW5jZVN0YXR1cyB9IGZyb20gJy4vQnVzaW5lc3MnO1xyXG5leHBvcnQgeyBJQXBpUmVzcG9uc2UsIElEeERhdGFTb3VyY2VPcHRpb25zLCBJRXJyb3JJbmZvLCBJTG9nb1NldHRpbmdzLCBSZXF1ZXN0U3RhdGUgfSBmcm9tICcuL0RhdGEnO1xyXG5leHBvcnQge1xyXG4gIEhlYWRlciwgTmF2aWdhdGlvbk1lbnUsIFVzZXJNZW51LCBNZW51U3dpdGNoZXIsXHJcbiAgSGVhZGVyVGhlbWVzLCBJSGVhZGVyT3B0aW9ucywgSUFwcE1lbnVNb2RlbCwgSU1lbnVTZXR0aW5ncywgSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsLFxyXG4gIElVc2VyTWVudUl0ZW0sIElVc2VyTWVudUl0ZW1Nb2RlbCxcclxufSBmcm9tICcuL0hlYWRlcic7XHJcbmV4cG9ydCB7IElIaWVyYXJjaGljYWwsIElSZXBvcnRCYXNlLCBJQXBwTWVudUl0ZW1CYXNlTW9kZWwsIGdyaWRDb2x1bW5UeXBlcyB9IGZyb20gJy4vUmVwb3J0cy9CdXNpbmVzcyc7XHJcbmV4cG9ydCB7XHJcbiAgSUdyaWRFeHRlbmRlZENvbHVtblN0YXRlLCBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlLCBJR3JpZFN0YXRlLFxyXG4gIElHcmlkQ29sdW1uU3RhdGUsIElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlXHJcbn0gZnJvbSAnLi9XaWRnZXRzL0lHcmlkU3RhdGUnO1xyXG5leHBvcnQgeyBJR3JpZERhdGEsIElWMkdyaWRDb2x1bW5TdGF0ZSB9IGZyb20gJy4vUmVwb3J0cy9QYWdlcy9HcmlkL0lHcmlkRGF0YSc7XHJcbmV4cG9ydCB7IElDb2x1bW5NZXRhRGF0YSB9IGZyb20gJy4vUmVwb3J0cy9Db2x1bW5NZXRhRGF0YSc7XHJcbmV4cG9ydCB7IENkbUltcG9ydEZpbGVNb2RlIH0gZnJvbSAnLi9SZXBvcnRzL0J1c2luZXNzJztcclxuXHJcbmltcG9ydCB7IHNob3cgYXMgYmFja2dyb3VuZEltYWdlVmlld2VyIH0gZnJvbSAnLi9XaWRnZXRzL0JhY2tncm91bmRJbWFnZVZpZXdlcic7XHJcbmltcG9ydCB7IExpY2VuY2VTdGF0dXMsIE1lbnVJdGVtVHlwZSB9IGZyb20gJy4vQnVzaW5lc3MnO1xyXG5pbXBvcnQgeyBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlIH0gZnJvbSAnLi9XaWRnZXRzL0lHcmlkU3RhdGUnO1xyXG5pbXBvcnQgZGF0YSBmcm9tICcuL0RhdGEnO1xyXG5pbXBvcnQgRm9vdGVyLCB7IEZvb3RlckluZGljYXRvclN0YXR1cyB9IGZyb20gJy4vRm9vdGVyL0luZGV4JztcclxuaW1wb3J0IHtcclxuICBIZWFkZXIsXHJcbiAgTmF2aWdhdGlvbk1lbnUsXHJcbiAgVXNlck1lbnUsXHJcbiAgTWVudVN3aXRjaGVyXHJcbn0gZnJvbSAnLi9IZWFkZXInO1xyXG5cclxuZXhwb3J0IHtcclxuICBGb290ZXIsXHJcbn07XHJcblxyXG5pbXBvcnQgbm90aWZ5IGZyb20gJy4vV2lkZ2V0cy9Ob3RpZnknO1xyXG5pbXBvcnQgZnVsbFNjcmVlbiBmcm9tICcuL1dpZGdldHMvRnVsbFNjcmVlbic7XHJcbmltcG9ydCBkZWZhdWx0VG9vbGJhciBmcm9tICcuL1dpZGdldHMvRGVmYXVsdFRvb2xiYXInO1xyXG5pbXBvcnQgZGVmYXVsdEdyaWRPYnNvbGV0ZSBmcm9tICcuL1dpZGdldHMvR3JpZC9EZWZhdWx0R3JpZE9ic29sZXRlJztcclxuaW1wb3J0IGRlZmF1bHRUcmVlTGlzdCBmcm9tICcuL1dpZGdldHMvR3JpZC9EZWZhdWx0VHJlZUxpc3QnO1xyXG5pbXBvcnQgZGVmYXVsdEdyaWQgZnJvbSAnLi9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQnO1xyXG5pbXBvcnQgKiBhcyBpbWFnZUNyb3BEaWFsb2cgZnJvbSAnLi9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZyc7XHJcbmltcG9ydCB7IEFjY291bnRTZXR0aW5nc1BhZ2UgfSBmcm9tICcuL1BhZ2VzL0FjY291bnRTZXR0aW5ncyc7XHJcbmltcG9ydCAqIGFzIHN0eWxpbmcgZnJvbSAnLi9TdHlsaW5nL0luZGV4JztcclxuaW1wb3J0ICogYXMgcG9wdXAgZnJvbSAnLi9XaWRnZXRzL1BvcHVwJztcclxuaW1wb3J0ICogYXMgY29uZmlybSBmcm9tICcuL1dpZGdldHMvQ29uZmlybSc7XHJcbmltcG9ydCAqIGFzIGxhbmRpbmcgZnJvbSAnLi9XaWRnZXRzL0xhbmRpbmcnO1xyXG5pbXBvcnQgKiBhcyBoZWxwZXJzIGZyb20gJy4vSGVscGVycy9JbmRleCc7XHJcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4vVXRpbHMvSW5kZXgnO1xyXG5pbXBvcnQgKiBhcyBhY2Nlc3NEZW5pZWQgZnJvbSAnLi9XaWRnZXRzL0FjY2Vzc0RlbmllZFRvUmVwb3J0JztcclxuaW1wb3J0IGdyaWRDb2x1bW5UeXBlcyBmcm9tICcuL1JlcG9ydHMvQnVzaW5lc3MvR3JpZENvbHVtblR5cGVzJztcclxuaW1wb3J0ICogYXMgQ0RNIGZyb20gJy4vUmVwb3J0cy9QYWdlcy9DRE0vSW5kZXgnO1xyXG5pbXBvcnQgeyBTZXNzaW9uTm90aWZpZXIgfSBmcm9tICcuL0NvbXBvbmVudHMvU2Vzc2lvbk5vdGlmaWVyJztcclxuaW1wb3J0IHsgRmlsZUltcG9ydGVyIH0gZnJvbSAnLi9Db21wb25lbnRzL0ZpbGVJbXBvcnRlci9JbmRleCc7XHJcbmltcG9ydCB7IEZpbGVVcGxvYWRlciB9IGZyb20gJy4vQ29tcG9uZW50cy9GaWxlVXBsb2FkZXIvSW5kZXgnO1xyXG5pbXBvcnQgeyBDZG1JbXBvcnRGaWxlTW9kZSB9IGZyb20gJy4vUmVwb3J0cy9CdXNpbmVzcyc7XHJcblxyXG5pbXBvcnQgR3JpZFJlcG9ydFBhZ2UgZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL0dyaWQvSW5kZXgnO1xyXG5pbXBvcnQgU2xpZGVzaG93UmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvU2xpZGVzaG93L0luZGV4JztcclxuaW1wb3J0IERhc2hib2FyZFJlcG9ydFBhZ2UgZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL0Rhc2hib2FyZC9JbmRleCc7XHJcbmltcG9ydCBEWFJlcG9ydFBhZ2UgZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL1JlcG9ydC9JbmRleCc7XHJcbmltcG9ydCBEaWFncmFtUmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvRGlhZ3JhbS9JbmRleCc7XHJcbmltcG9ydCBDRE1SZXBvcnRQYWdlIGZyb20gJy4vUmVwb3J0cy9QYWdlcy9DRE0vSW5kZXgnO1xyXG5pbXBvcnQgR2FudHRDaGFydFJlcG9ydFBhZ2UgZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL0dhbm50Q2hhcnQvSW5kZXgnO1xyXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuL0NvbmZpZy9JbmRleCc7XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcclxuY29uc3QgSXN6b2xlYVVJID0ge1xyXG4gIGNvbmZpZyxcclxuXHJcbiAgSGVhZGVyLFxyXG4gIEZvb3RlcixcclxuICBOYXZpZ2F0aW9uTWVudSxcclxuICBVc2VyTWVudSxcclxuICBNZW51U3dpdGNoZXIsXHJcblxyXG4gIGRhdGEsXHJcblxyXG4gIHdpZGdldHM6IHtcclxuICAgIG5vdGlmeSxcclxuICAgIGZ1bGxTY3JlZW4sXHJcbiAgICBwb3B1cCxcclxuICAgIGNvbmZpcm0sXHJcbiAgICBsYW5kaW5nLFxyXG4gICAgYWNjZXNzRGVuaWVkLFxyXG4gICAgZGVmYXVsdEdyaWRPYnNvbGV0ZSxcclxuICAgIGRlZmF1bHRUcmVlTGlzdCxcclxuICAgIGRlZmF1bHRHcmlkLFxyXG4gICAgZGVmYXVsdFRvb2xiYXIsXHJcbiAgICBiYWNrZ3JvdW5kSW1hZ2VWaWV3ZXIsXHJcbiAgICBpbWFnZUNyb3BEaWFsb2dcclxuICB9LFxyXG4gIHBhZ2VzOiB7XHJcbiAgICBBY2NvdW50U2V0dGluZ3NQYWdlXHJcbiAgfSxcclxuICBjb21wb25lbnRzOiB7XHJcbiAgICBDRE0sXHJcbiAgICBTZXNzaW9uTm90aWZpZXIsXHJcbiAgICBGaWxlSW1wb3J0ZXIsXHJcbiAgICBGaWxlVXBsb2FkZXIsXHJcbiAgfSxcclxuXHJcbiAgc3R5bGluZyxcclxuICBoZWxwZXJzLFxyXG4gIHV0aWxzLFxyXG5cclxuICByZXBvcnRzOiB7XHJcbiAgICBDRE1SZXBvcnRQYWdlLFxyXG4gICAgRGlhZ3JhbVJlcG9ydFBhZ2UsXHJcbiAgICBHcmlkUmVwb3J0UGFnZSxcclxuICAgIERhc2hib2FyZFJlcG9ydFBhZ2UsXHJcbiAgICBEWFJlcG9ydFBhZ2UsXHJcbiAgICBTbGlkZXNob3dSZXBvcnRQYWdlLFxyXG4gICAgR2FudHRDaGFydFJlcG9ydFBhZ2UsXHJcbiAgICBncmlkQ29sdW1uVHlwZXMsXHJcbiAgfSxcclxuICBidXNpbmVzczoge1xyXG4gICAgTGljZW5jZVN0YXR1cyxcclxuICAgIE1lbnVJdGVtVHlwZSxcclxuICAgIENkbUltcG9ydEZpbGVNb2RlLFxyXG4gICAgRm9vdGVySW5kaWNhdG9yU3RhdHVzLFxyXG4gICAgR3JpZERhdGFDb2x1bW5EYXRhVHlwZVxyXG4gIH1cclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IElzem9sZWFVSTtcclxuXHJcbih3aW5kb3cgYXMgYW55KS5Jc3pvbGVhVUkgPSBJc3pvbGVhVUk7XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsbUJBQWMsSUFBTSxJQUFNO0FBQUEsaUJBQ0osQUFBaEIsT0FBTyxNQUFTLGNBQWEsS0FBTyxFQUFFLFNBQU8sVUFDeEIsQUFBaEIsT0FBTyxNQUFTLFlBQ3ZCLFNBQVEsS0FBSyx1REFDYixLQUFPLEVBQUUsU0FBUyxDQUFDLE9BS2pCLEdBQUssV0FBVyw2RUFBNkUsS0FBSyxHQUFLLFFBQ2xHLElBQUksS0FBSyxDQUFBLFVBQThCLEtBQU8sRUFBRSxNQUFNLEdBQUssVUFFN0Q7O0FBR1QsbUJBQW1CLElBQUssSUFBTSxJQUFNO0FBQ2xDLGNBQUksS0FBTSxJQUFJO0FBQ2QsYUFBSSxLQUFLLE9BQU8sS0FDaEIsR0FBSSxlQUFlLFFBQ25CLEdBQUksU0FBUyxXQUFZO0FBQ3ZCLGNBQU8sR0FBSSxVQUFVLElBQU07YUFFN0IsR0FBSSxVQUFVLFdBQVk7QUFDeEIsb0JBQVEsTUFBTTthQUVoQixHQUFJOztBQUdOLG1CQUFzQixJQUFLO0FBQ3pCLGNBQUksS0FBTSxJQUFJO0FBRWQsYUFBSSxLQUFLLFFBQVEsSUFBakI7QUFDQSxjQUFJO0FBQ0YsZUFBSTttQkFDRyxJQUFQOztBQUNGLGlCQUFxQixPQUFkLEdBQUksVUFBK0IsT0FBZCxHQUFJOztBQUlsQyxtQkFBZ0IsSUFBTTtBQUNwQixjQUFJO0FBQ0YsZUFBSyxjQUFjLElB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