ember-scoped-css 0.23.2 → 0.23.4

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.
@@ -80,6 +80,7 @@ function getClassesTagsFromCss(css) {
80
80
  }
81
81
 
82
82
  // src/lib/path/utils.js
83
+ var import_node_module = require("node:module");
83
84
  var import_node_path = __toESM(require("node:path"), 1);
84
85
 
85
86
  // src/lib/path/hash-from-module-path.js
@@ -90,6 +91,12 @@ function hash(modulePath) {
90
91
  var hashFromModulePath = hash;
91
92
 
92
93
  // src/lib/path/utils.js
94
+ var import_meta = {};
95
+ var here = import_meta.url;
96
+ var ourRequire = globalThis.require ? globalThis.require : here && (0, import_node_module.createRequire)(here);
97
+ if (!ourRequire) {
98
+ ourRequire = require;
99
+ }
93
100
  var EMBROIDER_DIR = "node_modules/.embroider";
94
101
  var EMBROIDER_3_REWRITTEN_APP_PATH = `${EMBROIDER_DIR}/rewritten-app`;
95
102
  var EMBROIDER_3_REWRITTEN_APP_ASSETS = `${EMBROIDER_3_REWRITTEN_APP_PATH}/assets`;
@@ -481,4 +488,4 @@ var ScopedCssPreprocessor = class {
481
488
  }
482
489
  }
483
490
  };
484
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2J1aWxkL2VtYmVyLWNsYXNzaWMtc3VwcG9ydC5qcyIsICIuLi8uLi9zcmMvbGliL2dldENsYXNzZXNUYWdzRnJvbUNzcy5qcyIsICIuLi8uLi9zcmMvbGliL2lzSW5zaWRlR2xvYmFsLmpzIiwgIi4uLy4uL3NyYy9saWIvcGF0aC91dGlscy5qcyIsICIuLi8uLi9zcmMvbGliL3BhdGgvaGFzaC1mcm9tLW1vZHVsZS1wYXRoLmpzIiwgIi4uLy4uL3NyYy9saWIvcmV3cml0ZUNzcy5qcyIsICIuLi8uLi9zcmMvbGliL3Jld3JpdGVIYnMuanMiLCAiLi4vLi4vc3JjL2xpYi9yZW5hbWVDbGFzcy5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyByZWFkRmlsZSwgd3JpdGVGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgQ29uY2F0IGZyb20gJ2Jyb2Njb2xpLWNvbmNhdCc7XG5pbXBvcnQgeyBGdW5uZWwgfSBmcm9tICdicm9jY29saS1mdW5uZWwnO1xuaW1wb3J0IE1lcmdlVHJlZXMgZnJvbSAnYnJvY2NvbGktbWVyZ2UtdHJlZXMnO1xuaW1wb3J0IEZpbHRlciBmcm9tICdicm9jY29saS1wZXJzaXN0ZW50LWZpbHRlcic7XG5pbXBvcnQgeyBQcmVwcm9jZXNzb3IgfSBmcm9tICdjb250ZW50LXRhZyc7XG5cbmltcG9ydCBnZXRDbGFzc2VzVGFnc0Zyb21Dc3MgZnJvbSAnLi4vbGliL2dldENsYXNzZXNUYWdzRnJvbUNzcy5qcyc7XG5pbXBvcnQge1xuICBoYXNoRnJvbU1vZHVsZVBhdGgsXG4gIHBhY2thZ2VTY29wZWRQYXRoVG9Nb2R1bGVQYXRoLFxufSBmcm9tICcuLi9saWIvcGF0aC91dGlscy5qcyc7XG5pbXBvcnQgcmV3cml0ZUNzcyBmcm9tICcuLi9saWIvcmV3cml0ZUNzcy5qcyc7XG5pbXBvcnQgcmV3cml0ZUhicyBmcm9tICcuLi9saWIvcmV3cml0ZUhicy5qcyc7XG5cbmNvbnN0IHAgPSBuZXcgUHJlcHJvY2Vzc29yKCk7XG5jb25zdCBDT01QT05FTlRfRVhURU5TSU9OUyA9IFsnaGJzJywgJ2pzJywgJ3RzJywgJ2dqcycsICdndHMnXTtcbmNvbnN0IFRFTVBMQVRFX0VYVEVOU0lPTlMgPSBbJ2hicycsICdnanMnLCAnZ3RzJ107XG5cbmNsYXNzIFNjb3BlZEZpbHRlciBleHRlbmRzIEZpbHRlciB7XG4gIGNvbnN0cnVjdG9yKGNvbXBvbmVudHNOb2RlLCBvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihjb21wb25lbnRzTm9kZSwgb3B0aW9ucyk7XG4gICAgdGhpcy53YXJuaW5nU3RyZWFtID0gcHJvY2Vzcy5zdGRlcnI7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gIGdldCBleHRlbnNpb25zKCkge1xuICAgIHJldHVybiBbJ2NzcyddO1xuICB9XG5cbiAgZ2V0IHRhcmdldEV4dGVuc2lvbigpIHtcbiAgICByZXR1cm4gJ2Nzcyc7XG4gIH1cblxuICBhc3luYyBwcm9jZXNzU3RyaW5nKGNvbnRlbnQsIHJlbGF0aXZlUGF0aCkge1xuICAgIC8vIGlnbm9yZSBjc3MgZmlsZXMgZm9yIGVtYmVyLWNzcy1tb2R1bGVzXG4gICAgaWYgKHJlbGF0aXZlUGF0aC5lbmRzV2l0aCgnLm1vZHVsZS5jc3MnKSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGlmIGNvcnJlc3BvbmRpbmcganMgZmlsZSBleGlzdHNcbiAgICBsZXQgaGFzUmVsZXZhbnRGaWxlID0gZmFsc2U7XG5cbiAgICBmb3IgKGxldCBpbnB1dFBhdGggb2YgdGhpcy5pbnB1dFBhdGhzKSB7XG4gICAgICBpZiAoaGFzUmVsZXZhbnRGaWxlKSBicmVhaztcblxuICAgICAgZm9yIChsZXQgZXh0IG9mIENPTVBPTkVOVF9FWFRFTlNJT05TKSB7XG4gICAgICAgIGlmIChoYXNSZWxldmFudEZpbGUpIGJyZWFrO1xuXG4gICAgICAgIGNvbnN0IHJlbGF0aXZlQ29tcG9uZW50UGF0aCA9IHJlbGF0aXZlUGF0aC5yZXBsYWNlKC9cXC5jc3MkLywgJy4nICsgZXh0KTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50UGF0aCA9IHBhdGguam9pbihpbnB1dFBhdGgsIHJlbGF0aXZlQ29tcG9uZW50UGF0aCk7XG5cbiAgICAgICAgaWYgKGV4aXN0c1N5bmMoY29tcG9uZW50UGF0aCkpIHtcbiAgICAgICAgICBoYXNSZWxldmFudEZpbGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogUG9kcyBzdXBwb3J0XG4gICAgICAgKi9cbiAgICAgIGlmIChyZWxhdGl2ZVBhdGguZW5kc1dpdGgoJ3N0eWxlcy5jc3MnKSkge1xuICAgICAgICBjb25zdCBkaXJlY3RvcnkgPSByZWxhdGl2ZVBhdGgucmVwbGFjZSgvc3R5bGVzXFwuY3NzJC8sICd0ZW1wbGF0ZS5oYnMnKTtcbiAgICAgICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aC5qb2luKGlucHV0UGF0aCwgZGlyZWN0b3J5KTtcblxuICAgICAgICBpZiAoZXhpc3RzU3luYyh0ZW1wbGF0ZVBhdGgpKSB7XG4gICAgICAgICAgaGFzUmVsZXZhbnRGaWxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJld3JpdGUgY3NzIGZpbGVcbiAgICBpZiAoaGFzUmVsZXZhbnRGaWxlKSB7XG4gICAgICBsZXQgbG9jYWxQYWNrYWdlclN0eWxlUGF0aCA9IHBhY2thZ2VTY29wZWRQYXRoVG9Nb2R1bGVQYXRoKHJlbGF0aXZlUGF0aCk7XG5cbiAgICAgIGNvbnN0IGhhc2ggPSBoYXNoRnJvbU1vZHVsZVBhdGgobG9jYWxQYWNrYWdlclN0eWxlUGF0aCk7XG5cbiAgICAgIGNvbnRlbnQgPSByZXdyaXRlQ3NzKFxuICAgICAgICBjb250ZW50LFxuICAgICAgICBoYXNoLFxuICAgICAgICByZWxhdGl2ZVBhdGgsXG4gICAgICAgIHRoaXMub3B0aW9ucy5nZXRVc2VyT3B0aW9ucz8uKCk/LmxheWVyTmFtZSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcG9zdFByb2Nlc3MocmVzdWx0cywgcmVsYXRpdmVQYXRoKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52LkNJIHx8IHJlbGF0aXZlUGF0aC5lbmRzV2l0aCgnLm1vZHVsZS5jc3MnKSkge1xuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaW5wdXRQYXRoIG9mIHRoaXMuaW5wdXRQYXRocykge1xuICAgICAgY29uc3QgdGVtcGxhdGVGaWxlID0ge307XG5cbiAgICAgIGVhY2hFeHRlbnNpb246IGZvciAobGV0IGV4dCBvZiBURU1QTEFURV9FWFRFTlNJT05TKSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHJlbGF0aXZlUGF0aC5yZXBsYWNlKC9cXC5jc3MvLCAnLicgKyBleHQpO1xuICAgICAgICBsZXQgdGVtcGxhdGVGaWxlUGF0aCA9IHBhdGguam9pbihpbnB1dFBhdGgsIHRlbXBsYXRlUGF0aCk7XG4gICAgICAgIGxldCBleGlzdHMgPSBleGlzdHNTeW5jKHRlbXBsYXRlRmlsZVBhdGgpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQb2RzIHN1cHBvcnRcbiAgICAgICAgICovXG4gICAgICAgIGlmIChleHQgPT09ICdoYnMnICYmICFleGlzdHMgJiYgcmVsYXRpdmVQYXRoLmVuZHNXaXRoKCdzdHlsZXMuY3NzJykpIHtcbiAgICAgICAgICBsZXQgcG9kc05hbWUgPSByZWxhdGl2ZVBhdGgucmVwbGFjZSgvc3R5bGVzXFwuY3NzJC8sICd0ZW1wbGF0ZS5oYnMnKTtcblxuICAgICAgICAgIHRlbXBsYXRlRmlsZVBhdGggPSBwYXRoLmpvaW4oaW5wdXRQYXRoLCBwb2RzTmFtZSk7XG4gICAgICAgICAgZXhpc3RzID0gZXhpc3RzU3luYyh0ZW1wbGF0ZUZpbGVQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgICB0ZW1wbGF0ZUZpbGUucGF0aCA9IHRlbXBsYXRlRmlsZVBhdGg7XG4gICAgICAgICAgdGVtcGxhdGVGaWxlLmV4dCA9IGV4dDtcblxuICAgICAgICAgIGJyZWFrIGVhY2hFeHRlbnNpb247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIHRlbXBsYXRlIGV4aXN0cyB3ZSBjaGVjayB0aGUgY3NzIGZvciBjaGFuZ2VzXG4gICAgICBpZiAodGVtcGxhdGVGaWxlLnBhdGgpIHtcbiAgICAgICAgY29uc3QgY3NzRmlsZVBhdGggPSBwYXRoLmpvaW4oaW5wdXRQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgICBjb25zdCBjc3NDb250ZW50cyA9IGF3YWl0IHJlYWRGaWxlKGNzc0ZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICAgICAgY29uc3QgeyBjbGFzc2VzLCB0YWdzIH0gPSBnZXRDbGFzc2VzVGFnc0Zyb21Dc3MoY3NzQ29udGVudHMpO1xuICAgICAgICBjb25zdCBwcmV2aW91c0NsYXNzZXMgPSB0aGlzLm9wdGlvbnMucHJldmlvdXNDbGFzc2VzLmdldChyZWxhdGl2ZVBhdGgpO1xuXG4gICAgICAgIC8vIGlmIHdlIGhhdmUgcHJldmlvdXMgY2xhc3NlcywgYW5kIHRoZXkgYXJlIGRpZmZlcmVudCwgYnVpbGQgdGVtcGxhdGVzIHRvIGNvbXBhcmVcbiAgICAgICAgaWYgKHByZXZpb3VzQ2xhc3NlcyAmJiBjbGFzc2VzICE9PSBwcmV2aW91c0NsYXNzZXMpIHtcbiAgICAgICAgICBjb25zdCBsb2NhbFBhY2thZ2VyU3R5bGVQYXRoID1cbiAgICAgICAgICAgIHBhY2thZ2VTY29wZWRQYXRoVG9Nb2R1bGVQYXRoKHJlbGF0aXZlUGF0aCk7XG4gICAgICAgICAgY29uc3QgcG9zdGZpeCA9IGhhc2hGcm9tTW9kdWxlUGF0aChsb2NhbFBhY2thZ2VyU3R5bGVQYXRoKTtcbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZVJhdyA9IGF3YWl0IHJlYWRGaWxlKHRlbXBsYXRlRmlsZS5wYXRoLCAndXRmLTgnKTtcbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZUNvbXBhcmlzb24gPSBbXTtcbiAgICAgICAgICBsZXQgdGVtcGxhdGVDb250ZW50cyA9IHRlbXBsYXRlUmF3O1xuXG4gICAgICAgICAgaWYgKHRlbXBsYXRlRmlsZS5leHQgPT09ICdoYnMnKSB7XG4gICAgICAgICAgICB0ZW1wbGF0ZUNvbXBhcmlzb24ucHVzaChcbiAgICAgICAgICAgICAgZGlkVGVtcGxhdGVDaGFuZ2UoXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVDb250ZW50cyxcbiAgICAgICAgICAgICAgICBwcmV2aW91c0NsYXNzZXMsXG4gICAgICAgICAgICAgICAgY2xhc3NlcyxcbiAgICAgICAgICAgICAgICB0YWdzLFxuICAgICAgICAgICAgICAgIHBvc3RmaXgsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBmaW5kIGFsbCB0ZW1wbGF0ZSB0YWdzLCBhbmQgZXh0cmFjdCB0aGUgY29udGVudHMgdG8gY29tcGFyZVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IHAucGFyc2UodGVtcGxhdGVSYXcsICcnKTtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlcyA9IHJlc3VsdHMubWFwKCh4KSA9PiB4LmNvbnRlbnRzKTtcblxuICAgICAgICAgICAgZm9yIChsZXQgdGVtcGxhdGUgb2YgdGVtcGxhdGVzKSB7XG4gICAgICAgICAgICAgIHRlbXBsYXRlQ29tcGFyaXNvbi5wdXNoKFxuICAgICAgICAgICAgICAgIGRpZFRlbXBsYXRlQ2hhbmdlKFxuICAgICAgICAgICAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgICBwcmV2aW91c0NsYXNzZXMsXG4gICAgICAgICAgICAgICAgICBjbGFzc2VzLFxuICAgICAgICAgICAgICAgICAgdGFncyxcbiAgICAgICAgICAgICAgICAgIHBvc3RmaXgsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZUNoYW5nZWQgPSB0ZW1wbGF0ZUNvbXBhcmlzb24uc29tZSgodikgPT4gdik7XG5cbiAgICAgICAgICAvLyBpZiB0aGUgcmV3cml0ZSBkb2Vzbid0IG1hdGNoIHRoZSBvcmlnaW5hbCBvdXRwdXQsIHdlIHdhbnQgdG8gcmVidWlsZCB0aGUgdGVtcGxhdGVcbiAgICAgICAgICBpZiAodGVtcGxhdGVDaGFuZ2VkKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIGFuIGF3ZnVsIGhhY2sgYmVjYXVzZSB3ZSBkb24ndCBrbm93IGhvdyB0byBpbnZhbGlkYXRlIGJyb2Njb2xpLXBlcnNpc3RlbnQtZmlsdGVyIGNhY2hlXG4gICAgICAgICAgICAvLyBpZGVhbGx5IHdlJ2QgaW52YWxpZGF0ZSB0aGUgYnJvY2NvbGktcGVyaXN0ZW50LWZpbHRlciBjYWNoZSBoZXJlXG4gICAgICAgICAgICBhd2FpdCB3cml0ZUZpbGUodGVtcGxhdGVGaWxlLnBhdGgsIHRlbXBsYXRlQ29udGVudHMgKyAnICcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBhc3NpZ24gZm9yIG5leHQgcnVuIGNvbXBhcmlzb25cblxuICAgICAgICB0aGlzLm9wdGlvbnMucHJldmlvdXNDbGFzc2VzLnNldChyZWxhdGl2ZVBhdGgsIGNsYXNzZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG5cbi8qKlxuICogQ29tcGFyZXMgYSB0ZW1wbGF0ZSB3aXRoIHRoZSBjb250ZXh0IG9mIGRpZmZlcmVudCBzZXRzIG9mIGV4dHJhY2VkIGNzcyBjbGFzc2VzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRzXG4gKiBAcGFyYW0ge1NldH0gcHJldmlvdXNDbGFzc2VzXG4gKiBAcGFyYW0ge1NldH0gY3VycmVudENsYXNzZXNcbiAqIEBwYXJhbSB7U2V0fSB0YWdzXG4gKiBAcGFyYW0ge3N0cmluZ30gcG9zdGZpeFxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGRpZFRlbXBsYXRlQ2hhbmdlKFxuICBjb250ZW50cyxcbiAgcHJldmlvdXNDbGFzc2VzLFxuICBjdXJyZW50Q2xhc3NlcyxcbiAgdGFncyxcbiAgcG9zdGZpeCxcbikge1xuICBjb25zdCBvcmlnaW5hbCA9IHJld3JpdGVIYnMoY29udGVudHMsIHByZXZpb3VzQ2xhc3NlcywgdGFncywgcG9zdGZpeCk7XG4gIGNvbnN0IGN1cnJlbnQgPSByZXdyaXRlSGJzKGNvbnRlbnRzLCBjdXJyZW50Q2xhc3NlcywgdGFncywgcG9zdGZpeCk7XG5cbiAgcmV0dXJuIG9yaWdpbmFsICE9PSBjdXJyZW50O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTY29wZWRDc3NQcmVwcm9jZXNzb3Ige1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgdGhpcy5vd25lciA9IG9wdGlvbnMub3duZXI7XG4gICAgdGhpcy5hcHBOYW1lID0gb3B0aW9ucy5vd25lci5wYXJlbnQucGtnLm5hbWU7XG4gICAgdGhpcy5uYW1lID0gJ3Njb3BlZC1jc3MtcHJlcHJvY2Vzc29yJztcbiAgICB0aGlzLnByZXZpb3VzQ2xhc3NlcyA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBvcHRpb25zIGZyb20gYHNldHVwUHJlcHJvY2Vzc29yUmVnaXN0cnlgLCB0aGUgdjEtQWRkb24gSG9va1xuICAgKiBAcGFyYW0ge3sgbGF5ZXJOYW1lPzogc3RyaW5nIH19IG9wdGlvbnNcbiAgICovXG4gIGNvbmZpZ3VyZU9wdGlvbnMob3B0aW9ucykge1xuICAgIHRoaXMudXNlck9wdGlvbnMgPSBvcHRpb25zIHx8IHsgWydub3QgY29uZmlndXJlZCddOiB0cnVlIH07XG4gIH1cblxuICB0b1RyZWUoaW5wdXROb2RlLCBpbnB1dFBhdGgsIG91dHB1dERpcmVjdG9yeSwgb3B0aW9ucykge1xuICAgIGNvbnN0IG90aGVyUHJlcHJvY2Vzc29ycyA9IHRoaXMucHJlcHJvY2Vzc29ycy5maWx0ZXIoKHApID0+IHAgIT09IHRoaXMpO1xuICAgIGNvbnN0IG90aGVyVHJlZXMgPSBvdGhlclByZXByb2Nlc3NvcnMubWFwKChwKSA9PiBwLnRvVHJlZSguLi5hcmd1bWVudHMpKTtcbiAgICBsZXQgbWVyZ2VkT3RoZXJUcmVlcyA9IG5ldyBNZXJnZVRyZWVzKG90aGVyVHJlZXMpO1xuXG4gICAgbGV0IHJvb3RzID0gW1xuICAgICAgdGhpcy5hcHBOYW1lICsgJy9jb21wb25lbnRzLycsXG4gICAgICAuLi4odGhpcy51c2VyT3B0aW9ucy5hZGRpdGlvbmFsUm9vdHMgfHwgW10pLm1hcChcbiAgICAgICAgKHJvb3QpID0+IGAke3RoaXMuYXBwTmFtZX0vJHtyb290fWAsXG4gICAgICApLFxuICAgIF07XG4gICAgbGV0IGluY2x1ZGUgPSByb290c1xuICAgICAgLm1hcCgocm9vdCkgPT4ge1xuICAgICAgICBsZXQgd2l0aFNsYXNoID0gcm9vdC5lbmRzV2l0aCgnLycpID8gcm9vdCA6IGAke3Jvb3R9L2A7XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBgJHt3aXRoU2xhc2h9KiovKi5jc3NgLFxuICAgICAgICAgIC4uLkNPTVBPTkVOVF9FWFRFTlNJT05TLm1hcCgoZXh0KSA9PiBgJHt3aXRoU2xhc2h9KiovKi4ke2V4dH1gKSxcbiAgICAgICAgXTtcbiAgICAgIH0pXG4gICAgICAuZmxhdCgpO1xuXG4gICAgbGV0IGNvbXBvbmVudHNOb2RlID0gbmV3IEZ1bm5lbChpbnB1dE5vZGUsIHsgaW5jbHVkZSB9KTtcblxuICAgIGNvbXBvbmVudHNOb2RlID0gbmV3IFNjb3BlZEZpbHRlcihjb21wb25lbnRzTm9kZSwge1xuICAgICAgaW5wdXRQYXRoLFxuICAgICAgZ2V0VXNlck9wdGlvbnM6ICgpID0+IHRoaXMudXNlck9wdGlvbnMsXG4gICAgICBvd25lcjogdGhpcy5vd25lcixcbiAgICAgIHByZXZpb3VzQ2xhc3NlczogdGhpcy5wcmV2aW91c0NsYXNzZXMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21wb25lbnRTdHlsZXMgPSBuZXcgRnVubmVsKGNvbXBvbmVudHNOb2RlLCB7XG4gICAgICBpbmNsdWRlOiByb290cy5tYXAoKHJvb3QpID0+IHtcbiAgICAgICAgbGV0IHdpdGhTbGFzaCA9IHJvb3QuZW5kc1dpdGgoJy8nKSA/IHJvb3QgOiBgJHtyb290fS9gO1xuXG4gICAgICAgIHJldHVybiBgJHt3aXRoU2xhc2h9KiovKi5jc3NgO1xuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBjb25zdCBhcHBDc3MgPSBuZXcgRnVubmVsKGlucHV0Tm9kZSwge1xuICAgICAgaW5jbHVkZTogW3RoaXMuYXBwTmFtZSArICcvc3R5bGVzL2FwcC5jc3MnXSxcbiAgICB9KTtcblxuICAgIGxldCBtZXJnZWRTdHlsZXMgPSBuZXcgTWVyZ2VUcmVlcyhcbiAgICAgIFthcHBDc3MsIG1lcmdlZE90aGVyVHJlZXMsIGNvbXBvbmVudFN0eWxlc10sXG4gICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9LFxuICAgICk7XG5cbiAgICBsZXQgbmV3T3V0cHV0ID0gbmV3IENvbmNhdChtZXJnZWRTdHlsZXMsIHtcbiAgICAgIG91dHB1dEZpbGU6IG9wdGlvbnMub3V0cHV0UGF0aHNbJ2FwcCddLFxuICAgICAgYWxsb3dOb25lOiB0cnVlLFxuICAgICAgc291cmNlTWFwQ29uZmlnOiB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnVzZXJPcHRpb25zPy5wYXNzdGhyb3VnaCkge1xuICAgICAgbGV0IHBhc3NlZFRocm91Z2ggPSBuZXcgRnVubmVsKG1lcmdlZFN0eWxlcywge1xuICAgICAgICBpbmNsdWRlOiB0aGlzLnVzZXJPcHRpb25zLnBhc3N0aHJvdWdoLFxuICAgICAgICBkZXN0RGlyOiB0aGlzLnVzZXJPcHRpb25zLnBhc3N0aHJvdWdoRGVzdGluYXRpb24sXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG5ldyBNZXJnZVRyZWVzKFtwYXNzZWRUaHJvdWdoLCBuZXdPdXRwdXRdLCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ld091dHB1dDtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgcG9zdGNzcyBmcm9tICdwb3N0Y3NzJztcbmltcG9ydCBwYXJzZXIgZnJvbSAncG9zdGNzcy1zZWxlY3Rvci1wYXJzZXInO1xuXG5pbXBvcnQgaXNJbnNpZGVHbG9iYWwgZnJvbSAnLi9pc0luc2lkZUdsb2JhbC5qcyc7XG5cbmZ1bmN0aW9uIGdldENsYXNzZXNBbmRUYWdzKHNlbCwgY2xhc3NlcywgdGFncykge1xuICBjb25zdCB0cmFuc2Zvcm0gPSAoc2xzKSA9PiB7XG4gICAgc2xzLndhbGsoKHNlbGVjdG9yKSA9PiB7XG4gICAgICBpZiAoc2VsZWN0b3IudHlwZSA9PT0gJ2NsYXNzJyAmJiAhaXNJbnNpZGVHbG9iYWwoc2VsZWN0b3IpKSB7XG4gICAgICAgIGNsYXNzZXMuYWRkKHNlbGVjdG9yLnZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IudHlwZSA9PT0gJ3RhZycgJiYgIWlzSW5zaWRlR2xvYmFsKHNlbGVjdG9yKSkge1xuICAgICAgICB0YWdzLmFkZChzZWxlY3Rvci52YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgcGFyc2VyKHRyYW5zZm9ybSkucHJvY2Vzc1N5bmMoc2VsKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q2xhc3Nlc1RhZ3NGcm9tQ3NzKGNzcykge1xuICBjb25zdCBjbGFzc2VzID0gbmV3IFNldCgpO1xuICBjb25zdCB0YWdzID0gbmV3IFNldCgpO1xuXG4gIGNvbnN0IGFzdCA9IHBvc3Rjc3MucGFyc2UoY3NzKTtcblxuICBhc3Qud2Fsaygobm9kZSkgPT4ge1xuICAgIGlmIChub2RlLnR5cGUgPT09ICdydWxlJykge1xuICAgICAgZ2V0Q2xhc3Nlc0FuZFRhZ3Mobm9kZS5zZWxlY3RvciwgY2xhc3NlcywgdGFncyk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4geyBjbGFzc2VzLCB0YWdzIH07XG59XG5cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0luc2lkZUdsb2JhbChub2RlLCBmdW5jKSB7XG4gIGNvbnN0IHBhcmVudCA9IG5vZGUucGFyZW50O1xuXG4gIGlmICghcGFyZW50KSByZXR1cm4gZmFsc2U7XG4gIGlmIChwYXJlbnQudHlwZSA9PT0gJ3BzZXVkbycgJiYgcGFyZW50LnZhbHVlID09PSAnOmdsb2JhbCcpIHJldHVybiB0cnVlO1xuXG4gIHJldHVybiBpc0luc2lkZUdsb2JhbChwYXJlbnQsIGZ1bmMpO1xufVxuIiwgImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IGZzU3luYyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGhhc2hGcm9tQWJzb2x1dGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tYWJzb2x1dGUtcGF0aC5qcyc7XG5pbXBvcnQgeyBoYXNoRnJvbU1vZHVsZVBhdGggfSBmcm9tICcuL2hhc2gtZnJvbS1tb2R1bGUtcGF0aC5qcyc7XG5cbmV4cG9ydCB7IGhhc2hGcm9tQWJzb2x1dGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tYWJzb2x1dGUtcGF0aC5qcyc7XG5leHBvcnQgeyBoYXNoRnJvbU1vZHVsZVBhdGggfSBmcm9tICcuL2hhc2gtZnJvbS1tb2R1bGUtcGF0aC5qcyc7XG5cbmNvbnN0IEVNQlJPSURFUl9ESVIgPSAnbm9kZV9tb2R1bGVzLy5lbWJyb2lkZXInO1xuY29uc3QgRU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9QQVRIID0gYCR7RU1CUk9JREVSX0RJUn0vcmV3cml0dGVuLWFwcGA7XG5jb25zdCBFTUJST0lERVJfM19SRVdSSVRURU5fQVBQX0FTU0VUUyA9IGAke0VNQlJPSURFUl8zX1JFV1JJVFRFTl9BUFBfUEFUSH0vYXNzZXRzYDtcbmNvbnN0IEVNQlJPSURFUl8zX1JFV1JJVFRFTl9QQUNLQUdFUyA9IGAke0VNQlJPSURFUl9ESVJ9L3Jld3JpdHRlbi1wYWNrYWdlc2A7XG5jb25zdCBJUlJFTEVWQU5UX1BBVEhTID0gWydub2RlX21vZHVsZXMvLnBucG0nXTtcbmNvbnN0IFVOU1VQUE9SVEVEX0RJUkVDVE9SSUVTID0gbmV3IFNldChbJ3Rlc3RzJ10pO1xuXG5jb25zdCBDV0QgPSBwcm9jZXNzLmN3ZCgpO1xuXG4vKipcbiAqIFJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGUgZmlsZVBhdGggZm9ybWF0IGlzLFxuICogdGhpcyB3aWxsIHRyeSB0byByZXR1cm4gdGhlIGNvcnJlY3QgcG9zdGZpeC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGhcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoRnJvbShmaWxlUGF0aCkge1xuICBpZiAoZmlsZVBhdGguc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgcmV0dXJuIGhhc2hGcm9tQWJzb2x1dGVQYXRoKGZpbGVQYXRoKTtcbiAgfVxuXG4gIHJldHVybiBoYXNoRnJvbU1vZHVsZVBhdGgoZmlsZVBhdGgpO1xufVxuXG4vKipcbiAqIEJhc2VkIG9uIGVtYmVyJ3MgY29tcG9uZW50IGxvY2F0aW9uIGNvbnZlbnRpb25zLFxuICogdGhpcyBmdW5jdGlvbiB3aWxsIHByb3ZpZGUgYSBwYXRoIGZvciB3aGVyZSB3ZVxuICogZXhwZWN0IHRoZSBDU1MgdG8gbGl2ZS5cbiAqXG4gKiBGb3IgY28tbG9jYXRlZCBzdHJ1Y3R1cmU6XG4gKiAgIC0gY29tcG9uZW50cy9teS1jb21wb25lbnQuaGJzXG4gKiAgIC0gY29tcG9uZW50cy9teS1jb21wb25lbnQuY3NzXG4gKlxuICogRm9yIG5lc3RlZCBjby1sb2NhdGVkIHN0cnVjdHVyZVxuICogICAtIGNvbXBvbmVudHMvbXktY29tcG9uZW50L2Zvby5oYnNcbiAqICAgLSBjb21wb25lbnRzL215LWNvbXBvbmVudC9mb28uY3NzXG4gKlxuICogRm9yIFBvZHMgcm91dGVzIHN0cnVjdHVyZVxuICogICAtIHJvdXRlcy9teS1yb3V0ZS90ZW1wbGF0ZS57aGJzLGpzfVxuICogICAtIHJvdXRlcy9teS1yb3V0ZS9zdHlsZXMuY3NzXG4gKlxuICogRGVsaWJlcmF0ZWx5IG5vdCBzdXBwb3J0ZWQ6XG4gKiAgIC0gY29tcG9uZW50cyB3LyBwb2RzIC0tIHRoaXMgaXMgZGVwcmVjYXRlZCBpbiA1LjEwXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVOYW1lIC0gdGhlIGhicywganMsIGdqcywgZ3RzIG9yIHdoYXRldmVyIGNvLWxvY2F0ZWQgcGF0aC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gZXhwZWN0ZWQgY3NzIHBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNzc1BhdGhGb3IoZmlsZU5hbWUpIHtcbiAgbGV0IHdpdGhvdXRFeHQgPSB3aXRob3V0RXh0ZW5zaW9uKGZpbGVOYW1lKTtcbiAgbGV0IGNzc1BhdGggPSB3aXRob3V0RXh0ICsgJy5jc3MnO1xuXG4gIGlmIChpc1BvZChmaWxlTmFtZSkpIHtcbiAgICBjc3NQYXRoID0gZmlsZU5hbWVcbiAgICAgIC5yZXBsYWNlKC90ZW1wbGF0ZVxcLmpzJC8sICdzdHlsZXMuY3NzJylcbiAgICAgIC5yZXBsYWNlKC90ZW1wbGF0ZVxcLmhicy8sICdzdHlsZXMuY3NzJyk7XG4gIH1cblxuICByZXR1cm4gY3NzUGF0aDtcbn1cblxuLyoqXG4gKiBOb3RlIHRoYXQgY29tcG9uZW50cyBpbiB0aGUgXCJwb2RzXCIgY29udmVudGlvbiB3aWxsXG4gKiBuZXZlciBiZSBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BvZFRlbXBsYXRlKGZpbGVQYXRoKSB7XG4gIGlmIChmaWxlUGF0aC5pbmNsdWRlcygnL2NvbXBvbmVudHMvJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gZmlsZVBhdGguZW5kc1dpdGgoJ3RlbXBsYXRlLmpzJykgfHwgZmlsZVBhdGguZW5kc1dpdGgoJ3RlbXBsYXRlLmhicycpO1xufVxuXG4vKipcbiAqIE5vdGUgdGhhdCBjb21wb25lbnRzIGluIHRoZSBcInBvZHNcIiBjb252ZW50aW9uIHdpbGxcbiAqIG5ldmVyIGJlIHN1cHBvcnRlZC5cbiAqXG4gKiBDaGVja3MgaWYgYSBmaWxlIGVuZHMgd2l0aFxuICogLSB0ZW1wbGF0ZS5qc1xuICogLSB0ZW1wbGF0ZS5oYnNcbiAqIC0gc3R5bGVzLmNzc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQb2QoZmlsZVBhdGgpIHtcbiAgaWYgKGZpbGVQYXRoLmluY2x1ZGVzKCcvY29tcG9uZW50cy8nKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChpc1BvZFRlbXBsYXRlKGZpbGVQYXRoKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZpbGVQYXRoLmVuZHNXaXRoKCdzdHlsZXMuY3NzJyk7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aFxuICogQHJldHVybnMgdGhlIHNhbWUgcGF0aCwgYnV0IHdpdGhvdXQgdGhlIGV4dGVuc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aG91dEV4dGVuc2lvbihmaWxlUGF0aCkge1xuICBsZXQgcGFyc2VkID0gcGF0aC5wYXJzZShmaWxlUGF0aCk7XG5cbiAgcmV0dXJuIHBhdGguam9pbihwYXJzZWQuZGlyLCBwYXJzZWQubmFtZSk7XG59XG5cbi8qKlxuICogRXhhbXBsZXMgZm9yIGZpbGVOYW1lXG4gKiAtIGFic29sdXRlIG9uLWRpc2sgcGF0aFxuICogLSBpbiB3ZWJwYWNrXG4gKiAgIC0gVVJMLWFic29sdXRlIHBhdGgsIHN0YXJ0aW5nIHdpdGggL1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlTmFtZVxuICogQHBhcmFtIHt7IGFkZGl0aW9uYWxSb290cz86IHN0cmluZ1tdOyBjd2Q6IHN0cmluZyB9fSBvcHRpb25zXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZWxldmFudEZpbGUoZmlsZU5hbWUsIHsgYWRkaXRpb25hbFJvb3RzLCBjd2QgfSkge1xuICBpZiAoZmlsZU5hbWUuc3RhcnRzV2l0aCgnL0BlbWJyb2lkZXInKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoSVJSRUxFVkFOVF9QQVRIUy5zb21lKChpKSA9PiBmaWxlTmFtZS5pbmNsdWRlcyhpKSkpIHJldHVybiBmYWxzZTtcblxuICBpZiAoZmlsZU5hbWUuaW5jbHVkZXMoJy9ub2RlX21vZHVsZXMvJykpIHtcbiAgICAvLyBpZiBhIGZpbGUgaXMgbm90IHRoZSBlbWJyb2lkZXIgY2FjaGUgZGlyZWN0b3J5XG4gICAgLy8gYW5kIGlzIGluIG5vZGVfbW9kdWxlcywgc2tpcCBpdC5cbiAgICBpZiAoIWZpbGVOYW1lLmluY2x1ZGVzKEVNQlJPSURFUl9ESVIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gcmV3cml0dGVuIHBhY2thZ2VzIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgYXQgdGhlaXIgb3duXG4gICAgLy8gcHVibGlzaCB0aW1lXG4gICAgaWYgKGZpbGVOYW1lLmluY2x1ZGVzKEVNQlJPSURFUl8zX1JFV1JJVFRFTl9QQUNLQUdFUykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBUaGVzZSBhcmUgYWxyZWFkeSB0aGUgYnVuZGxlZCBmaWxlcy5cbiAgICBpZiAoZmlsZU5hbWUuaW5jbHVkZXMoRU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9BU1NFVFMpKSB7XG4gICAgICAvLyBub3Qgc3VwcG9ydGVkLCBuZXZlciB3aWxsIGJlXG4gICAgICBpZiAoZmlsZU5hbWUuZW5kc1dpdGgoYCR7RU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9BU1NFVFN9L3Rlc3RzLmpzYCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBJZGVhbGx5LCB3ZSBuZXZlciBnZXQgaGVyZSAtLSBpbmRpY2F0ZXMgd2UncmUgbm90IGZpbHRlcmluZyBlZmZlY3RpdmVseSBpbiBiYWJlbFxuICAgICAgLy8gTk9URTogaWYgd2UgZ2V0IGhlcmUsIHdlJ3JlIHRyeWluZyB0byBvcGVyYXRlIG9uIGEgZmlsZSB0b28gbGF0ZS5cbiAgICAgIC8vICAgICAgIHdlIG5lZWQgU2NvcGVkQ1NTIHRvIG9wZXJhdGUgYXMgY2xvc2UgdG8gb3JpZ2luYWwgc291cmNlIGFzIHBvc3NpYmxlIC0tIG5vdCBvdXRwdXQgZmlsZXMuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgbGV0IHdvcmtzcGFjZSA9IGZpbmRXb3Jrc3BhY2VQYXRoKGZpbGVOYW1lKTtcblxuICBhc3NlcnQoY3dkLCBgY3dkIHdhcyBub3QgcGFzc2VkIHRvIGlzUmVsZXZhbnRGaWxlYCk7XG5cbiAgbGV0IG91cldvcmtzcGFjZSA9IGZpbmRXb3Jrc3BhY2VQYXRoKGN3ZCk7XG5cbiAgaWYgKHdvcmtzcGFjZSAhPT0gb3VyV29ya3NwYWNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IGxvY2FsID0gZmlsZU5hbWUucmVwbGFjZSh3b3Jrc3BhY2UsICcnKTtcbiAgbGV0IFssIC4uLnBhcnRzXSA9IGxvY2FsLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pO1xuXG4gIGlmIChVTlNVUFBPUlRFRF9ESVJFQ1RPUklFUy5oYXMocGFydHNbMF0pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vc3RseSBwb2RzIHN1cHBvcnQuXG4gICAqIGZvbGtzIG5lZWQgdG8gb3B0IGluIHRvIHBvZHMgKHJvdXRlcyksIGJlY2F1c2UgZXZlcnkgcG9kcyBhcHAgY2FuIGJlIGNvbmZpZ3VyZWQgZGlmZmVyZW50bHlcbiAgICovXG4gIGxldCByb290cyA9IFsnL2NvbXBvbmVudHMvJywgJy90ZW1wbGF0ZXMvJywgLi4uKGFkZGl0aW9uYWxSb290cyB8fCBbXSldO1xuXG4gIGlmICghcm9vdHMuc29tZSgocm9vdCkgPT4gZmlsZU5hbWUuaW5jbHVkZXMocm9vdCkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYWNrYWdlU2NvcGVkUGF0aFRvTW9kdWxlUGF0aChwYWNrYWdlU2NvcGVkUGF0aCkge1xuICAvKipcbiAgICogKkJ5IGNvbnZlbnRpb24qLCBgc3JjYCBpcyBvbWl0dGVkIGZyb20gY29tcG9uZW50IHBhdGhzLlxuICAgKiBXZSBjYW4gcmVmbGVjdCB0aGUgc2FtZSBiZWhhdmlvciBieSByZXBsYWNpbmcgc3JjL1xuICAgKiB3aXRoIGFuIGVtcHR5IHN0cmluZy5cbiAgICpcbiAgICogQ1NTIGlzbid0IGVtaXR0ZWQgYXMgYSBjby1sb2NhdGVkIG1vZHVsZSwgYnV0XG4gICAqIHRvIGtlZXAgY29udmVudGlvbnMgY29uc2lzdGVudCBhY3Jvc3MgbGFuZ3VhZ2VzLFxuICAgKiB3ZSBjYW4gcHJldGVuZCBpdCBpcy5cbiAgICpcbiAgICogQW55IGN1c3RvbWl6YXRpb24gYmV5b25kIHJlbW92aW5nIGBzcmNgIGFuZCBgYXBwYCBpcyBwb3RlbnRpYWxseSBjb25mdXNpbmcuXG4gICAqIElmIHdlIG5lZWQgZnVydGhlciBjdXN0b21pemF0aW9ucywgd2UnbGwgd2FudCB0byBtYXRjaCBvbiBgZXhwb3J0c2AgaW4gdGhlXG4gICAqIGNvcnJlc3BvbmRpbmcgcGFja2FnZS5qc29uXG4gICAqL1xuICBsZXQgcGFja2FnZVJlbGF0aXZlID0gcGFja2FnZVNjb3BlZFBhdGgucmVwbGFjZSgvXlxcL3NyY1xcLy8sICcvJyk7XG5cbiAgbGV0IHBhcnNlZCA9IHBhdGgucGFyc2UocGFja2FnZVJlbGF0aXZlKTtcblxuICBpZiAoaXNQb2QocGFja2FnZVJlbGF0aXZlKSkge1xuICAgIC8qKlxuICAgICAqIEZvciBwb2RzLCB3ZSBjaG9wIG9mZiB0aGUgd2hvbGUgZmlsZSwgYW5kIHVzZSB0aGUgZGlyIG5hbWUgYXMgdGhlIFwibW9kdWxlUGF0aFwiXG4gICAgICovXG4gICAgcmV0dXJuIHBhcnNlZC5kaXI7XG4gIH1cblxuICAvKipcbiAgICogSWYgYW4gZXh0ZW5zaW9uIGlzIHBhc3NlZCwgcmVtb3ZlIGl0LlxuICAgKiBXaGVuIHVzaW5nIHBhY2thZ2VycywgZm9sa3MgYXJlIHVzZWQgdG8gbm90IGhhdmluZyB0byBzcGVjaWZ5IGV4dGVuc2lvbnMgZm9yIGZpbGVzLlxuICAgKiBTaW5jZSB3ZSBkb24ndCBldmVuIGVtaXQgY3NzIGZpbGVzIGNvLWxvY2F0ZWQgdG8gZWFjaCBtb2R1bGUsXG4gICAqIHRoaXMgaGVscHMgdXMgbm90IGNvbnZleSBhIGxpZSB0aGF0IGEgZmlsZSBtYXkgZXhpc3QgaW4gYXQgcnVudGltZS5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUgYDxtb2R1bGUtbmFtZT4vY29tcG9uZW50cy9idXR0b25gLlxuICAgKiBJdCBkb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBleHRlbnNpb24gaXMsIGJlY2F1c2UgeW91IGNhbiBvbmx5IGhhdmUgb25lIGNzcyBmaWxlXG4gICAqIGZvciB0aGUgYnV0dG9uIG1vZHVsZSBhbnl3YXkuXG4gICAqL1xuICBsZXQgbG9jYWxQYWNrYWdlclN0eWxlUGF0aCA9IHBhdGguam9pbihwYXJzZWQuZGlyLCBwYXJzZWQubmFtZSk7XG5cbiAgcmV0dXJuIGxvY2FsUGFja2FnZXJTdHlsZVBhdGg7XG59XG5cbi8qKlxuICogcmV0dXJucyB0aGUgYXBwLW1vZHVsZSBwYXRoIG9mIHRoZSBzb3VyY2UgZmlsZVxuICpcbiAqIFRoaXMgYXNzdW1lcyBub3JtYWwgZW1iZXIgYXBwIGNvbnZlbnRpb25zXG4gKlxuICogd2hpY2ggaXMgYDxwYWNrYWdlLmpzb24jbmFtZT4vcGF0aC10by1maWxlYFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwUGF0aChzb3VyY2VQYXRoKSB7XG4gIGxldCB3b3Jrc3BhY2VQYXRoID0gZmluZFdvcmtzcGFjZVBhdGgoc291cmNlUGF0aCk7XG4gIGxldCBuYW1lID0gbW9kdWxlTmFtZShzb3VyY2VQYXRoKTtcblxuICAvKipcbiAgICogIFVuZGVyIGVtYnJvaWRlciBidWlsZHMsIHRoZSBzcGVjLWNvbXBsaWFudCB2ZXJzaW9uIG9mIHRoZSBhcHBcbiAgICogaGFzIGFsbCB0aGUgZmlsZXMgdW5kZXIgYSBmb2xkZXIgd2hpY2ggcmVwcmVzZW50cyB0aGUgcGFja2FnZSBuYW1lLFxuICAgKiByYXRoZXIgdGhhbiBcImFwcFwiLlxuICAgKi9cbiAgbGV0IHBhY2thZ2VSZWxhdGl2ZSA9IHNvdXJjZVBhdGgucmVwbGFjZSh3b3Jrc3BhY2VQYXRoLCAnJyk7XG5cbiAgLyoqXG4gICAqIEJ1dCB3ZSBhbHNvIGRvbid0IHdhbnQgJ2FwcCcgLS0gd2hpY2ggaXMgcHJlc2VudCBpbiB0aGUgdjEgYWRkb24gcGlwZWxpbmVcbiAgICovXG4gIHBhY2thZ2VSZWxhdGl2ZSA9IHBhY2thZ2VSZWxhdGl2ZS5yZXBsYWNlKGAvYXBwL2AsIGAvYCk7XG5cbiAgLyoqXG4gICAqIGFsc28gYWxzbywgd2Uga25vdyB0aGF0IHRoZSByZS13cml0dGVuIGFwcCBzdHJ1Y3R1cmUgaW4gZW1icm9pZGVyQHYzXG4gICAqIGlzIGV4dHJhbmVvdXMsIGFuZCB3ZSBjYW4gY29sbGFwc2UgaXRcbiAgICovXG4gIHBhY2thZ2VSZWxhdGl2ZSA9IHBhY2thZ2VSZWxhdGl2ZS5yZXBsYWNlKFxuICAgIGAke0VNQlJPSURFUl8zX1JFV1JJVFRFTl9BUFBfUEFUSH0vYCxcbiAgICAnLycsXG4gICk7XG5cbiAgbGV0IGxvY2FsUGFja2FnZXJTdHlsZVBhdGggPSBwYWNrYWdlU2NvcGVkUGF0aFRvTW9kdWxlUGF0aChwYWNrYWdlUmVsYXRpdmUpO1xuXG4gIHJldHVybiBgJHtuYW1lfSR7bG9jYWxQYWNrYWdlclN0eWxlUGF0aH1gO1xufVxuXG4vKipcbiAqIFRvIGF2b2lkIGhpdHRpbmcgdGhlIGZpbGVzeXNldG0sIHdlJ2xsIHN0b3JlIGFsbCBmb3VuZFxuICogcHJvamVjdCBwYXRocyBiZXJlLCBzbyB3ZSBjYW4sIGluIG1lbW9yeSxcbiAqIGdldCB0aGUgZm9sZGVyIHdoZXJlIGEgcGFja2FnZS5qc29uIGV4aXN0cywgcmF0aGVyIHRoYW5cbiAqIGhpdCB0aGUgZmlsZSBzeXN0ZW0gZXZlcnkgdGltZS5cbiAqL1xuY29uc3QgU0VFTiA9IG5ldyBTZXQoKTtcblxuZnVuY3Rpb24gZ2V0U2Vlbihzb3VyY2VQYXRoKSB7XG4gIGlmIChTRUVOLmhhcyhzb3VyY2VQYXRoKSkgcmV0dXJuIHNvdXJjZVBhdGg7XG5cbiAgbGV0IHBhcnRzID0gc291cmNlUGF0aC5zcGxpdCgnLycpO1xuXG4gIGZvciAobGV0IGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID4gMTsgaS0tKSB7XG4gICAgbGV0IHRvQ2hlY2sgPSBwYXJ0cy5zbGljZSgwLCBpKS5qb2luKCcvJyk7XG5cbiAgICBsZXQgc2VlbiA9IFNFRU4uaGFzKHRvQ2hlY2spO1xuXG4gICAgaWYgKHNlZW4pIHtcbiAgICAgIHJldHVybiB0b0NoZWNrO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFdvcmtzcGFjZVBhdGgoc291cmNlUGF0aCwgb3B0aW9ucykge1xuICBsZXQgY3dkID0gb3B0aW9ucz8uY3dkID8/IENXRDtcblxuICBpZiAoc291cmNlUGF0aC5pbmNsdWRlcyhFTUJST0lERVJfM19SRVdSSVRURU5fQVBQX1BBVEgpKSB7XG4gICAgc291cmNlUGF0aCA9IHNvdXJjZVBhdGguc3BsaXQoRU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9QQVRIKVswXTtcbiAgfVxuXG4gIGlmIChzb3VyY2VQYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICBzb3VyY2VQYXRoID0gc291cmNlUGF0aC5yZXBsYWNlKC9cXC8kLywgJycpO1xuICB9XG5cbiAgbGV0IHNlZW4gPSBnZXRTZWVuKHNvdXJjZVBhdGgpO1xuXG4gIGlmIChzZWVuKSB7XG4gICAgcmV0dXJuIHNlZW47XG4gIH1cblxuICBsZXQgY2FuZGlkYXRlUGF0aCA9IHBhdGguam9pbihzb3VyY2VQYXRoLCAncGFja2FnZS5qc29uJyk7XG5cbiAgY29uc3QgaXNXb3Jrc3BhY2UgPSBmc1N5bmMuZXhpc3RzU3luYyhjYW5kaWRhdGVQYXRoKTtcblxuICBpZiAoaXNXb3Jrc3BhY2UpIHtcbiAgICByZXR1cm4gc291cmNlUGF0aDtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGZpbmRQYWNrYWdlSnNvblVwKHNvdXJjZVBhdGgsIHsgY3dkIH0pO1xuXG4gIGlmICghcGFja2FnZUpzb25QYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZGV0ZXJtaW5lIHByb2plY3QgZm9yICR7c291cmNlUGF0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IHdvcmtzcGFjZVBhdGggPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25QYXRoKTtcblxuICBTRUVOLmFkZCh3b3Jrc3BhY2VQYXRoKTtcblxuICByZXR1cm4gd29ya3NwYWNlUGF0aDtcbn1cblxuZnVuY3Rpb24gZmluZFBhY2thZ2VKc29uVXAoc3RhcnRQYXRoLCBvcHRpb25zKSB7XG4gIGxldCBjd2QgPSBvcHRpb25zPy5jd2QgPz8gQ1dEO1xuICBsZXQgcGFydHMgPSBzdGFydFBhdGguc3BsaXQoJy8nKTtcblxuICBmb3IgKGxldCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+IDE7IGktLSkge1xuICAgIGxldCB0b0NoZWNrID0gcGFydHMuc2xpY2UoMCwgaSkuam9pbignLycpO1xuXG4gICAgbGV0IHBhY2thZ2VKc29uID0gcGF0aC5qb2luKHRvQ2hlY2ssICdwYWNrYWdlLmpzb24nKTtcbiAgICBsZXQgZXhpc3RzID0gZnNTeW5jLmV4aXN0c1N5bmMocGFja2FnZUpzb24pO1xuXG4gICAgaWYgKGV4aXN0cykge1xuICAgICAgcmV0dXJuIHBhY2thZ2VKc29uO1xuICAgIH1cblxuICAgIC8vIERvbid0IHRyYXZlcnNlIGFsbCB0aGUgd2F5IHRvIHRoZSByb290IG9mIHRoZSBmaWxlIHN5c3RlbS5cbiAgICBpZiAodG9DaGVjayA9PT0gY3dkKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuY29uc3QgTUFOSUZFU1RfQ0FDSEUgPSBuZXcgTWFwKCk7XG5cbi8qKlxuICogV2lsbCByZXR1cm4gdGhlIHBhY2thZ2UuanNvbiNuYW1lLCBvciBjb25maWcvZW52aXJvbm1lbnQjbW91ZGxlUHJlZml4IChpZiB2MSBhcHApXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZHVsZU5hbWUoc291cmNlUGF0aCkge1xuICBjb25zdCB3b3Jrc3BhY2UgPSBmaW5kV29ya3NwYWNlUGF0aChzb3VyY2VQYXRoKTtcbiAgY29uc3QgbWFuaWZlc3QgPSBnZXRNYW5pZmVzdCh3b3Jrc3BhY2UpO1xuXG4gIGlmIChtYW5pZmVzdFsnZW1iZXItYWRkb24nXSkge1xuICAgIC8qKlxuICAgICAqIExpYnJhcmllcyBhcmUgbm90IGFsbG93ZWQgdG8gY3VzdG9taXplIHRoZWlyIG1vZHVsZSBuYW1lXG4gICAgICogdG8gYmUgZGlmZmVyZW50IGZyb20gdGhlaXIgcGFja2FnZSBuYW1lLlxuICAgICAqXG4gICAgICogKEl0J3MgYWxzbyBib25rZXJzIHRoYXQgdGhpcyBpcyBhbGxvd2VkIGZvciB2MSBhcHBzKVxuICAgICAqL1xuICAgIHJldHVybiBtYW5pZmVzdC5uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciB2MSBhcHBzLCB3ZSBuZWVkIHRvIHJlZmVyZW5jZSB0aGUgY29uZmlnL2Vudmlyb25tZW50LmpzIGZpbGVcbiAgICogdG8gc2VlIGlmIHRoZSBtb2R1bGVQcmVmaXggc2V0dGluZyBkaWZmZXJzIGZyb20gbWFuaWZlc3QubmFtZTtcbiAgICovXG4gIGxldCBlbnZpcm9ubWVudEpTID0gcGF0aC5qb2luKHdvcmtzcGFjZSwgJ2NvbmZpZy9lbnZpcm9ubWVudC5qcycpO1xuXG4gIC8qKlxuICAgKiBOT1RFOiB0aGUgZW52aXJvbm1lbnQuanMgaXMgYSBjb21tb25KUyBmaWxlLCBzbyB3ZSBjYW4gc3luY2hyb25vdXNseSByZXF1aXJlIGl0XG4gICAqXG4gICAqIFRPRE86IGlmIHdlIGhhdmUgaXNzdWVzIHdpdGggbG9hZGluZyB0aGlzIGZpbGUgbGF0ZXIgd2Ugc2hvdWxkIHByb2JhYmx5IGp1c3QgcnVuIGpzY29kZXNoaWZ0IG9uIGl0XG4gICAqICAgICAgIGJ1dCB0aGF0IGNvdWxkIGFsbG93IHVzIHRvIGJlIGJyaXR0bGUgaW4gZGlmZmVyZW50IHdheXMsIGxpa2UgaWYgZm9sa3Mgc3RyYXkgZnJvbSB0aGUgd2F5IHRoZVxuICAgKiAgICAgICBmaWxlIGlzIGxhaWQgb3V0IGZyb20gdGhlIGJsdWVwcmludCBkZWZhdWx0cy5cbiAgICovXG4gIGlmIChmc1N5bmMuZXhpc3RzU3luYyhlbnZpcm9ubWVudEpTKSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZiAtLSB0aGlzIGV4aXN0c1xuICAgIGNvbnN0IGVudkZuID0gcmVxdWlyZShlbnZpcm9ubWVudEpTKTtcbiAgICBjb25zdCBlbnYgPSBlbnZGbignZW1iZXItc2NvcGVkLWNzcycpO1xuXG4gICAgcmV0dXJuIGVudi5tb2R1bGVQcmVmaXggfHwgbWFuaWZlc3QubmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWxsYmFjayB0byB0aGUgdHJ1ZVx1MjEyMiBtb2R1bGVcdTIxMjIgbmFtZS5cbiAgICovXG4gIHJldHVybiBtYW5pZmVzdC5uYW1lO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB3b3Jrc3BhY2VcbiAqL1xuZnVuY3Rpb24gZ2V0TWFuaWZlc3Qod29ya3NwYWNlKSB7XG4gIGxldCBleGlzdGluZyA9IE1BTklGRVNUX0NBQ0hFLmdldCh3b3Jrc3BhY2UpO1xuXG4gIGlmIChleGlzdGluZykge1xuICAgIHJldHVybiBleGlzdGluZztcbiAgfVxuXG4gIGxldCBidWZmZXIgPSBmc1N5bmMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3Jrc3BhY2UsICdwYWNrYWdlLmpzb24nKSk7XG4gIGxldCBjb250ZW50ID0gYnVmZmVyLnRvU3RyaW5nKCk7XG4gIGxldCBqc29uID0gSlNPTi5wYXJzZShjb250ZW50KTtcblxuICBNQU5JRkVTVF9DQUNIRS5zZXQod29ya3NwYWNlLCBqc29uKTtcblxuICByZXR1cm4ganNvbjtcbn1cbiIsICJpbXBvcnQgbWQ1IGZyb20gJ2JsdWVpbXAtbWQ1JztcblxuLyoqXG4gKiBUaGUgaW50ZW50IG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gZ2VuZXJhdGUgdGhlIHN1ZmZpeC9wb3N0Zml4IGZvciB0aGVcbiAqIGNzcyBjbGFzc2VzLCBiYXNlZCBvbiB0aGUgbW9kdWxlLXNjb3BlZCBwYXRoIG5hbWUuXG4gKlxuICogZm9yIGV4YW1wbGUsXG4gKiAgICBoYXNoKCdteS1hcHAvY29tcG9uZW50cy9mb28nKVxuICogIGluc3RlYWQgb2ZcbiAqICAgIGhhc2goJ2FwcC9jb21wb25lbnRzL2ZvbycpXG4gKlxuICogICh1bmxlc3MgeW91ciBhcHAgbmFtZSBpcyAnYXBwJylcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlUGF0aFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2gobW9kdWxlUGF0aCkge1xuICByZXR1cm4gJ2UnICsgbWQ1KG1vZHVsZVBhdGgpLnN1YnN0cmluZygwLCA4KTtcbn1cblxuXG5leHBvcnQgY29uc3QgaGFzaEZyb21Nb2R1bGVQYXRoID0gaGFzaDtcbiIsICJpbXBvcnQgcG9zdGNzcyBmcm9tICdwb3N0Y3NzJztcbmltcG9ydCBwYXJzZXIgZnJvbSAncG9zdGNzcy1zZWxlY3Rvci1wYXJzZXInO1xuXG5pbXBvcnQgaXNJbnNpZGVHbG9iYWwgZnJvbSAnLi9pc0luc2lkZUdsb2JhbC5qcyc7XG5cbmZ1bmN0aW9uIHJld3JpdGVTZWxlY3RvcihzZWwsIHBvc3RmaXgpIHtcbiAgY29uc3QgdHJhbnNmb3JtID0gKHNlbGVjdG9ycykgPT4ge1xuICAgIHNlbGVjdG9ycy53YWxrKChzZWxlY3RvcikgPT4ge1xuICAgICAgaWYgKHNlbGVjdG9yLnR5cGUgPT09ICdjbGFzcycgJiYgIWlzSW5zaWRlR2xvYmFsKHNlbGVjdG9yKSkge1xuICAgICAgICBzZWxlY3Rvci52YWx1ZSArPSAnXycgKyBwb3N0Zml4O1xuICAgICAgfSBlbHNlIGlmIChzZWxlY3Rvci50eXBlID09PSAndGFnJyAmJiAhaXNJbnNpZGVHbG9iYWwoc2VsZWN0b3IpKSB7XG4gICAgICAgIHNlbGVjdG9yLnJlcGxhY2VXaXRoKFxuICAgICAgICAgIHBhcnNlci50YWcoeyB2YWx1ZTogc2VsZWN0b3IudmFsdWUgfSksXG4gICAgICAgICAgcGFyc2VyLmNsYXNzTmFtZSh7IHZhbHVlOiBwb3N0Zml4IH0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gcmVtb3ZlIDpnbG9iYWxcbiAgICBzZWxlY3RvcnMud2Fsaygoc2VsZWN0b3IpID0+IHtcbiAgICAgIGlmIChzZWxlY3Rvci50eXBlID09PSAncHNldWRvJyAmJiBzZWxlY3Rvci52YWx1ZSA9PT0gJzpnbG9iYWwnKSB7XG4gICAgICAgIHNlbGVjdG9yLnJlcGxhY2VXaXRoKC4uLnNlbGVjdG9yLm5vZGVzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgdHJhbnNmb3JtZWQgPSBwYXJzZXIodHJhbnNmb3JtKS5wcm9jZXNzU3luYyhzZWwpO1xuXG4gIHJldHVybiB0cmFuc2Zvcm1lZDtcbn1cblxuZnVuY3Rpb24gaXNJbnNpZGVLZXlmcmFtZXMobm9kZSkge1xuICBjb25zdCBwYXJlbnQgPSBub2RlLnBhcmVudDtcblxuICBpZiAoIXBhcmVudCkgcmV0dXJuIGZhbHNlO1xuICBpZiAocGFyZW50LnR5cGUgPT09ICdhdHJ1bGUnICYmIHBhcmVudC5uYW1lID09PSAna2V5ZnJhbWVzJykgcmV0dXJuIHRydWU7XG5cbiAgcmV0dXJuIGlzSW5zaWRlS2V5ZnJhbWVzKHBhcmVudCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJld3JpdGVDc3MoY3NzLCBwb3N0Zml4LCBmaWxlTmFtZSwgbGF5ZXJOYW1lKSB7XG4gIGNvbnN0IGxheWVyTmFtZVdpdGhEZWZhdWx0ID0gbGF5ZXJOYW1lID8/ICdjb21wb25lbnRzJztcbiAgY29uc3QgYXN0ID0gcG9zdGNzcy5wYXJzZShjc3MpO1xuXG4gIGFzdC53YWxrKChub2RlKSA9PiB7XG4gICAgaWYgKG5vZGUudHlwZSA9PT0gJ3J1bGUnICYmICFpc0luc2lkZUtleWZyYW1lcyhub2RlKSkge1xuICAgICAgbm9kZS5zZWxlY3RvciA9IHJld3JpdGVTZWxlY3Rvcihub2RlLnNlbGVjdG9yLCBwb3N0Zml4KTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHJld3JpdHRlbkNzcyA9IGFzdC50b1N0cmluZygpO1xuXG4gIGlmICghbGF5ZXJOYW1lV2l0aERlZmF1bHQpIHtcbiAgICByZXR1cm4gYC8qICR7ZmlsZU5hbWV9ICovXFxuJHtyZXdyaXR0ZW5Dc3N9XFxuYDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgYC8qICR7ZmlsZU5hbWV9ICovXFxuQGxheWVyICR7bGF5ZXJOYW1lV2l0aERlZmF1bHR9IHtcXG5cXG5gICtcbiAgICByZXdyaXR0ZW5Dc3MgK1xuICAgICdcXG59XFxuJ1xuICApO1xufVxuXG4iLCAiaW1wb3J0IHJlY2FzdCBmcm9tICdlbWJlci10ZW1wbGF0ZS1yZWNhc3QnO1xuXG5pbXBvcnQgeyByZW5hbWVDbGFzcyB9IGZyb20gJy4vcmVuYW1lQ2xhc3MuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdGVtcGxhdGVQbHVnaW4oeyBjbGFzc2VzLCB0YWdzLCBwb3N0Zml4IH0pIHtcbiAgbGV0IHN0YWNrID0gW107XG4gIC8vIHNjb3BlZC1jbGFzcyBpcyBhIGdsb2JhbCB3ZSBhbGxvdyBpbiBoYnNcbiAgLy8gc2NvcGVkQ2xhc3MgaXMgaW1wb3J0YWJsZSwgYW5kIHdlJ2xsIGVycm9yIGlmIHNvbWVvbmUgdHJpZXMgdG8gcmVuYW1lIGl0XG4gIGxldCBzY29wZWRDbGFzc0NhbmRpZGF0ZXMgPSBbJ3Njb3BlZC1jbGFzcycsICdzY29wZWRDbGFzcyddO1xuXG4gIGZ1bmN0aW9uIGlzU2NvcGVkQ2xhc3Moc3RyKSB7XG4gICAgaWYgKCFzdHIpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBzY29wZWRDbGFzc0NhbmRpZGF0ZXMuc29tZSgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgPT09IHN0cik7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIEF0dHJOb2RlKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLm5hbWUgPT09ICdjbGFzcycpIHtcbiAgICAgICAgaWYgKG5vZGUudmFsdWUudHlwZSA9PT0gJ1RleHROb2RlJyAmJiBub2RlLnZhbHVlLmNoYXJzKSB7XG4gICAgICAgICAgY29uc3QgcmVuYW1lZENsYXNzID0gcmVuYW1lQ2xhc3Mobm9kZS52YWx1ZS5jaGFycywgcG9zdGZpeCwgY2xhc3Nlcyk7XG5cbiAgICAgICAgICBub2RlLnZhbHVlLmNoYXJzID0gcmVuYW1lZENsYXNzO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUudmFsdWUudHlwZSA9PT0gJ0NvbmNhdFN0YXRlbWVudCcpIHtcbiAgICAgICAgICBmb3IgKGxldCBwYXJ0IG9mIG5vZGUudmFsdWUucGFydHMpIHtcbiAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdUZXh0Tm9kZScgJiYgcGFydC5jaGFycykge1xuICAgICAgICAgICAgICBjb25zdCByZW5hbWVkQ2xhc3MgPSByZW5hbWVDbGFzcyhwYXJ0LmNoYXJzLCBwb3N0Zml4LCBjbGFzc2VzKTtcblxuICAgICAgICAgICAgICBwYXJ0LmNoYXJzID0gcmVuYW1lZENsYXNzO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09ICdNdXN0YWNoZVN0YXRlbWVudCcpIHtcbiAgICAgICAgICAgICAgcmVjYXN0LnRyYXZlcnNlKHBhcnQsIHtcbiAgICAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsKG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbmFtZWRDbGFzcyA9IHJlbmFtZUNsYXNzKFxuICAgICAgICAgICAgICAgICAgICBub2RlLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwb3N0Zml4LFxuICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLFxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgbm9kZS52YWx1ZSA9IHJlbmFtZWRDbGFzcztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgRWxlbWVudE5vZGUobm9kZSkge1xuICAgICAgaWYgKHRhZ3MuaGFzKG5vZGUudGFnKSkge1xuICAgICAgICAvLyBjaGVjayBpZiBjbGFzcyBhdHRyaWJ1dGUgYWxyZWFkeSBleGlzdHNcbiAgICAgICAgY29uc3QgY2xhc3NBdHRyID0gbm9kZS5hdHRyaWJ1dGVzLmZpbmQoKGF0dHIpID0+IGF0dHIubmFtZSA9PT0gJ2NsYXNzJyk7XG5cbiAgICAgICAgaWYgKGNsYXNzQXR0cikge1xuICAgICAgICAgIGNsYXNzQXR0ci52YWx1ZS5jaGFycyArPSAnICcgKyBwb3N0Zml4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHB1c2ggY2xhc3MgYXR0cmlidXRlXG4gICAgICAgICAgbm9kZS5hdHRyaWJ1dGVzLnB1c2goXG4gICAgICAgICAgICByZWNhc3QuYnVpbGRlcnMuYXR0cignY2xhc3MnLCByZWNhc3QuYnVpbGRlcnMudGV4dChwb3N0Zml4KSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBBbGw6IHtcbiAgICAgIGVudGVyKG5vZGUpIHtcbiAgICAgICAgc3RhY2sucHVzaChub2RlKTtcbiAgICAgIH0sXG4gICAgICBleGl0KCkge1xuICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIE11c3RhY2hlU3RhdGVtZW50KG5vZGUpIHtcbiAgICAgIGxldCBjc3NDbGFzcztcblxuICAgICAgaWYgKFxuICAgICAgICBpc1Njb3BlZENsYXNzKGdldFZhbHVlKG5vZGUucGF0aCkpICYmXG4gICAgICAgIG5vZGUucGFyYW1zPy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgbm9kZS5wYXJhbXNbMF0udHlwZSA9PT0gJ1N0cmluZ0xpdGVyYWwnXG4gICAgICApIHtcbiAgICAgICAgY3NzQ2xhc3MgPSBub2RlLnBhcmFtc1swXS52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBpc1Njb3BlZENsYXNzKGdldFZhbHVlKG5vZGUucGF0aD8ucGF0aCkpICYmXG4gICAgICAgIG5vZGUucGF0aD8ucGFyYW1zPy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgbm9kZS5wYXRoPy5wYXJhbXNbMF0udHlwZSA9PT0gJ1N0cmluZ0xpdGVyYWwnXG4gICAgICApIHtcbiAgICAgICAgY3NzQ2xhc3MgPSBub2RlLnBhdGgucGFyYW1zWzBdLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3NzQ2xhc3MpIHtcbiAgICAgICAgY29uc3QgdGV4dE5vZGUgPSByZWNhc3QuYnVpbGRlcnMudGV4dChyZW5hbWVDbGFzcyhjc3NDbGFzcywgcG9zdGZpeCkpO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcblxuICAgICAgICBpZiAocGFyZW50LnR5cGUgPT09ICdBdHRyTm9kZScpIHtcbiAgICAgICAgICBwYXJlbnQucXVvdGVUeXBlID0gJ1wiJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0ZXh0Tm9kZTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgU3ViRXhwcmVzc2lvbihub2RlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGlzU2NvcGVkQ2xhc3MoZ2V0VmFsdWUobm9kZS5wYXRoKSkgJiZcbiAgICAgICAgbm9kZS5wYXJhbXM/Lmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBub2RlLnBhcmFtc1swXS50eXBlID09PSAnU3RyaW5nTGl0ZXJhbCdcbiAgICAgICkge1xuICAgICAgICBjb25zdCBjc3NDbGFzcyA9IG5vZGUucGFyYW1zWzBdLnZhbHVlO1xuICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IHJlY2FzdC5idWlsZGVycy5saXRlcmFsKFxuICAgICAgICAgICdTdHJpbmdMaXRlcmFsJyxcbiAgICAgICAgICByZW5hbWVDbGFzcyhjc3NDbGFzcywgcG9zdGZpeCksXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHRleHROb2RlO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlKHBhdGgpIHtcbiAgaWYgKCFwYXRoKSByZXR1cm47XG5cbiAgaWYgKCd2YWx1ZScgaW4gcGF0aCkge1xuICAgIHJldHVybiBwYXRoLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcHJlY2F0ZWQgaW4gZW1iZXIgNS45K1xuICAgKiAoc28gd2UgdXNlIHRoZSBhYm92ZSBmb3IgbmV3ZXIgZW1iZXJzKVxuICAgKi9cbiAgcmV0dXJuIHBhdGgub3JpZ2luYWw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJld3JpdGVIYnMoaGJzLCBjbGFzc2VzLCB0YWdzLCBwb3N0Zml4KSB7XG4gIGxldCBhc3QgPSByZWNhc3QucGFyc2UoaGJzKTtcblxuICByZWNhc3QudHJhdmVyc2UoYXN0LCB0ZW1wbGF0ZVBsdWdpbih7IGNsYXNzZXMsIHRhZ3MsIHBvc3RmaXggfSkpO1xuXG4gIGxldCByZXN1bHQgPSByZWNhc3QucHJpbnQoYXN0KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwgIi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwb3N0Zml4XG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBbY2xhc3Nlc0luQ3NzXVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmFtZUNsYXNzKGNsYXNzTmFtZSwgcG9zdGZpeCwgY2xhc3Nlc0luQ3NzKSB7XG4gIGNvbnN0IGNsYXNzZXMgPSBjbGFzc05hbWUuc3BsaXQoL1xccysvKTtcbiAgY29uc3QgcmVuYW1lZENsYXNzZXMgPSBjbGFzc2VzXG4gICAgLmZpbHRlcigoYykgPT4gYylcbiAgICAubWFwKChjKSA9PiBjLnRyaW0oKSlcbiAgICAubWFwKChjKSA9PiB7XG4gICAgICBpZiAoIWNsYXNzZXNJbkNzcyB8fCBjbGFzc2VzSW5Dc3MuaGFzKGMpKSB7XG4gICAgICAgIGlmIChjLmVuZHNXaXRoKHBvc3RmaXgpKSByZXR1cm4gYztcblxuICAgICAgICByZXR1cm4gYyArICdfJyArIHBvc3RmaXg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjO1xuICAgIH0pXG4gICAgLmpvaW4oJyAnKTtcblxuICBjb25zdCByZW5hbWVkV2l0aFByZXNlcnZlZFNwYWNlcyA9IGNsYXNzTmFtZS5yZXBsYWNlKFxuICAgIGNsYXNzTmFtZS50cmltU3RhcnQoKS50cmltRW5kKCksXG4gICAgcmVuYW1lZENsYXNzZXMsXG4gICk7XG5cbiAgcmV0dXJuIHJlbmFtZWRXaXRoUHJlc2VydmVkU3BhY2VzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBLHFCQUEyQjtBQUMzQixzQkFBb0M7QUFDcEMs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LHFCQUFpQixJQUFJLGFBQWEsZ0JBQWdCO0FBQUEsTUFDaEQ7QUFBQSxNQUNBLGdCQUFnQixNQUFNLEtBQUs7QUFBQSxNQUMzQixPQUFPLEtBQUs7QUFBQSxNQUNaLGlCQUFpQixLQUFLO0FBQUEsSUFDeEIsQ0FBQztBQUVELFVBQU0sa0JBQWtCLElBQUksOEJBQU8sZ0JBQWdCO0FBQUEsTUFDakQsU0FBUyxNQUFNLElBQUksQ0FBQyxTQUFTO0FBQzNCLFlBQUksWUFBWSxLQUFLLFNBQVMsR0FBRyxJQUFJLE9BQU8sR0FBRyxJQUFJO0FBRW5ELGVBQU8sR0FBRyxTQUFTO0FBQUEsTUFDckIsQ0FBQztBQUFBLElBQ0gsQ0FBQztBQUVELFVBQU0sU0FBUyxJQUFJLDhCQUFPLFdBQVc7QUFBQSxNQUNuQyxTQUFTLENBQUMsS0FBSyxVQUFVLGlCQUFpQjtBQUFBLElBQzVDLENBQUM7QUFFRCxRQUFJLGVBQWUsSUFBSSw0QkFBQUE7QUFBQSxNQUNyQixDQUFDLFFBQVEsa0JBQWtCLGVBQWU7QUFBQSxNQUMxQyxFQUFFLFdBQVcsS0FBSztBQUFBLElBQ3BCO0FBRUEsUUFBSSxZQUFZLElBQUksdUJBQUFDLFFBQU8sY0FBYztBQUFBLE1BQ3ZDLFlBQVksUUFBUSxZQUFZLEtBQUs7QUFBQSxNQUNyQyxXQUFXO0FBQUEsTUFDWCxpQkFBaUIsRUFBRSxTQUFTLEtBQUs7QUFBQSxJQUNuQyxDQUFDO0FBRUQsUUFBSSxLQUFLLGFBQWEsYUFBYTtBQUNqQyxVQUFJLGdCQUFnQixJQUFJLDhCQUFPLGNBQWM7QUFBQSxRQUMzQyxTQUFTLEtBQUssWUFBWTtBQUFBLFFBQzFCLFNBQVMsS0FBSyxZQUFZO0FBQUEsTUFDNUIsQ0FBQztBQUVELGFBQU8sSUFBSSw0QkFBQUQsUUFBVyxDQUFDLGVBQWUsU0FBUyxHQUFHLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFBQSxJQUN2RSxPQUFPO0FBQ0wsYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBQ0Y7IiwKICAibmFtZXMiOiBbImltcG9ydF9ub2RlX3BhdGgiLCAicGFyc2VyIiwgInBvc3Rjc3MiLCAibWQ1IiwgInBhdGgiLCAiaW1wb3J0X3Bvc3Rjc3MiLCAiaW1wb3J0X3Bvc3Rjc3Nfc2VsZWN0b3JfcGFyc2VyIiwgInBhcnNlciIsICJwb3N0Y3NzIiwgInJlY2FzdCIsICJub2RlIiwgInBhdGgiLCAiRmlsdGVyIiwgInBhdGgiLCAiaGFzaCIsICJyZXN1bHRzIiwgInAiLCAiTWVyZ2VUcmVlcyIsICJDb25jYXQiXQp9Cg==
491
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2J1aWxkL2VtYmVyLWNsYXNzaWMtc3VwcG9ydC5qcyIsICIuLi8uLi9zcmMvbGliL2dldENsYXNzZXNUYWdzRnJvbUNzcy5qcyIsICIuLi8uLi9zcmMvbGliL2lzSW5zaWRlR2xvYmFsLmpzIiwgIi4uLy4uL3NyYy9saWIvcGF0aC91dGlscy5qcyIsICIuLi8uLi9zcmMvbGliL3BhdGgvaGFzaC1mcm9tLW1vZHVsZS1wYXRoLmpzIiwgIi4uLy4uL3NyYy9saWIvcmV3cml0ZUNzcy5qcyIsICIuLi8uLi9zcmMvbGliL3Jld3JpdGVIYnMuanMiLCAiLi4vLi4vc3JjL2xpYi9yZW5hbWVDbGFzcy5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyByZWFkRmlsZSwgd3JpdGVGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgQ29uY2F0IGZyb20gJ2Jyb2Njb2xpLWNvbmNhdCc7XG5pbXBvcnQgeyBGdW5uZWwgfSBmcm9tICdicm9jY29saS1mdW5uZWwnO1xuaW1wb3J0IE1lcmdlVHJlZXMgZnJvbSAnYnJvY2NvbGktbWVyZ2UtdHJlZXMnO1xuaW1wb3J0IEZpbHRlciBmcm9tICdicm9jY29saS1wZXJzaXN0ZW50LWZpbHRlcic7XG5pbXBvcnQgeyBQcmVwcm9jZXNzb3IgfSBmcm9tICdjb250ZW50LXRhZyc7XG5cbmltcG9ydCBnZXRDbGFzc2VzVGFnc0Zyb21Dc3MgZnJvbSAnLi4vbGliL2dldENsYXNzZXNUYWdzRnJvbUNzcy5qcyc7XG5pbXBvcnQge1xuICBoYXNoRnJvbU1vZHVsZVBhdGgsXG4gIHBhY2thZ2VTY29wZWRQYXRoVG9Nb2R1bGVQYXRoLFxufSBmcm9tICcuLi9saWIvcGF0aC91dGlscy5qcyc7XG5pbXBvcnQgcmV3cml0ZUNzcyBmcm9tICcuLi9saWIvcmV3cml0ZUNzcy5qcyc7XG5pbXBvcnQgcmV3cml0ZUhicyBmcm9tICcuLi9saWIvcmV3cml0ZUhicy5qcyc7XG5cbmNvbnN0IHAgPSBuZXcgUHJlcHJvY2Vzc29yKCk7XG5jb25zdCBDT01QT05FTlRfRVhURU5TSU9OUyA9IFsnaGJzJywgJ2pzJywgJ3RzJywgJ2dqcycsICdndHMnXTtcbmNvbnN0IFRFTVBMQVRFX0VYVEVOU0lPTlMgPSBbJ2hicycsICdnanMnLCAnZ3RzJ107XG5cbmNsYXNzIFNjb3BlZEZpbHRlciBleHRlbmRzIEZpbHRlciB7XG4gIGNvbnN0cnVjdG9yKGNvbXBvbmVudHNOb2RlLCBvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihjb21wb25lbnRzTm9kZSwgb3B0aW9ucyk7XG4gICAgdGhpcy53YXJuaW5nU3RyZWFtID0gcHJvY2Vzcy5zdGRlcnI7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gIGdldCBleHRlbnNpb25zKCkge1xuICAgIHJldHVybiBbJ2NzcyddO1xuICB9XG5cbiAgZ2V0IHRhcmdldEV4dGVuc2lvbigpIHtcbiAgICByZXR1cm4gJ2Nzcyc7XG4gIH1cblxuICBhc3luYyBwcm9jZXNzU3RyaW5nKGNvbnRlbnQsIHJlbGF0aXZlUGF0aCkge1xuICAgIC8vIGlnbm9yZSBjc3MgZmlsZXMgZm9yIGVtYmVyLWNzcy1tb2R1bGVzXG4gICAgaWYgKHJlbGF0aXZlUGF0aC5lbmRzV2l0aCgnLm1vZHVsZS5jc3MnKSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGlmIGNvcnJlc3BvbmRpbmcganMgZmlsZSBleGlzdHNcbiAgICBsZXQgaGFzUmVsZXZhbnRGaWxlID0gZmFsc2U7XG5cbiAgICBmb3IgKGxldCBpbnB1dFBhdGggb2YgdGhpcy5pbnB1dFBhdGhzKSB7XG4gICAgICBpZiAoaGFzUmVsZXZhbnRGaWxlKSBicmVhaztcblxuICAgICAgZm9yIChsZXQgZXh0IG9mIENPTVBPTkVOVF9FWFRFTlNJT05TKSB7XG4gICAgICAgIGlmIChoYXNSZWxldmFudEZpbGUpIGJyZWFrO1xuXG4gICAgICAgIGNvbnN0IHJlbGF0aXZlQ29tcG9uZW50UGF0aCA9IHJlbGF0aXZlUGF0aC5yZXBsYWNlKC9cXC5jc3MkLywgJy4nICsgZXh0KTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50UGF0aCA9IHBhdGguam9pbihpbnB1dFBhdGgsIHJlbGF0aXZlQ29tcG9uZW50UGF0aCk7XG5cbiAgICAgICAgaWYgKGV4aXN0c1N5bmMoY29tcG9uZW50UGF0aCkpIHtcbiAgICAgICAgICBoYXNSZWxldmFudEZpbGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogUG9kcyBzdXBwb3J0XG4gICAgICAgKi9cbiAgICAgIGlmIChyZWxhdGl2ZVBhdGguZW5kc1dpdGgoJ3N0eWxlcy5jc3MnKSkge1xuICAgICAgICBjb25zdCBkaXJlY3RvcnkgPSByZWxhdGl2ZVBhdGgucmVwbGFjZSgvc3R5bGVzXFwuY3NzJC8sICd0ZW1wbGF0ZS5oYnMnKTtcbiAgICAgICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aC5qb2luKGlucHV0UGF0aCwgZGlyZWN0b3J5KTtcblxuICAgICAgICBpZiAoZXhpc3RzU3luYyh0ZW1wbGF0ZVBhdGgpKSB7XG4gICAgICAgICAgaGFzUmVsZXZhbnRGaWxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJld3JpdGUgY3NzIGZpbGVcbiAgICBpZiAoaGFzUmVsZXZhbnRGaWxlKSB7XG4gICAgICBsZXQgbG9jYWxQYWNrYWdlclN0eWxlUGF0aCA9IHBhY2thZ2VTY29wZWRQYXRoVG9Nb2R1bGVQYXRoKHJlbGF0aXZlUGF0aCk7XG5cbiAgICAgIGNvbnN0IGhhc2ggPSBoYXNoRnJvbU1vZHVsZVBhdGgobG9jYWxQYWNrYWdlclN0eWxlUGF0aCk7XG5cbiAgICAgIGNvbnRlbnQgPSByZXdyaXRlQ3NzKFxuICAgICAgICBjb250ZW50LFxuICAgICAgICBoYXNoLFxuICAgICAgICByZWxhdGl2ZVBhdGgsXG4gICAgICAgIHRoaXMub3B0aW9ucy5nZXRVc2VyT3B0aW9ucz8uKCk/LmxheWVyTmFtZSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcG9zdFByb2Nlc3MocmVzdWx0cywgcmVsYXRpdmVQYXRoKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52LkNJIHx8IHJlbGF0aXZlUGF0aC5lbmRzV2l0aCgnLm1vZHVsZS5jc3MnKSkge1xuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaW5wdXRQYXRoIG9mIHRoaXMuaW5wdXRQYXRocykge1xuICAgICAgY29uc3QgdGVtcGxhdGVGaWxlID0ge307XG5cbiAgICAgIGVhY2hFeHRlbnNpb246IGZvciAobGV0IGV4dCBvZiBURU1QTEFURV9FWFRFTlNJT05TKSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHJlbGF0aXZlUGF0aC5yZXBsYWNlKC9cXC5jc3MvLCAnLicgKyBleHQpO1xuICAgICAgICBsZXQgdGVtcGxhdGVGaWxlUGF0aCA9IHBhdGguam9pbihpbnB1dFBhdGgsIHRlbXBsYXRlUGF0aCk7XG4gICAgICAgIGxldCBleGlzdHMgPSBleGlzdHNTeW5jKHRlbXBsYXRlRmlsZVBhdGgpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQb2RzIHN1cHBvcnRcbiAgICAgICAgICovXG4gICAgICAgIGlmIChleHQgPT09ICdoYnMnICYmICFleGlzdHMgJiYgcmVsYXRpdmVQYXRoLmVuZHNXaXRoKCdzdHlsZXMuY3NzJykpIHtcbiAgICAgICAgICBsZXQgcG9kc05hbWUgPSByZWxhdGl2ZVBhdGgucmVwbGFjZSgvc3R5bGVzXFwuY3NzJC8sICd0ZW1wbGF0ZS5oYnMnKTtcblxuICAgICAgICAgIHRlbXBsYXRlRmlsZVBhdGggPSBwYXRoLmpvaW4oaW5wdXRQYXRoLCBwb2RzTmFtZSk7XG4gICAgICAgICAgZXhpc3RzID0gZXhpc3RzU3luYyh0ZW1wbGF0ZUZpbGVQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgICB0ZW1wbGF0ZUZpbGUucGF0aCA9IHRlbXBsYXRlRmlsZVBhdGg7XG4gICAgICAgICAgdGVtcGxhdGVGaWxlLmV4dCA9IGV4dDtcblxuICAgICAgICAgIGJyZWFrIGVhY2hFeHRlbnNpb247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIHRlbXBsYXRlIGV4aXN0cyB3ZSBjaGVjayB0aGUgY3NzIGZvciBjaGFuZ2VzXG4gICAgICBpZiAodGVtcGxhdGVGaWxlLnBhdGgpIHtcbiAgICAgICAgY29uc3QgY3NzRmlsZVBhdGggPSBwYXRoLmpvaW4oaW5wdXRQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgICBjb25zdCBjc3NDb250ZW50cyA9IGF3YWl0IHJlYWRGaWxlKGNzc0ZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICAgICAgY29uc3QgeyBjbGFzc2VzLCB0YWdzIH0gPSBnZXRDbGFzc2VzVGFnc0Zyb21Dc3MoY3NzQ29udGVudHMpO1xuICAgICAgICBjb25zdCBwcmV2aW91c0NsYXNzZXMgPSB0aGlzLm9wdGlvbnMucHJldmlvdXNDbGFzc2VzLmdldChyZWxhdGl2ZVBhdGgpO1xuXG4gICAgICAgIC8vIGlmIHdlIGhhdmUgcHJldmlvdXMgY2xhc3NlcywgYW5kIHRoZXkgYXJlIGRpZmZlcmVudCwgYnVpbGQgdGVtcGxhdGVzIHRvIGNvbXBhcmVcbiAgICAgICAgaWYgKHByZXZpb3VzQ2xhc3NlcyAmJiBjbGFzc2VzICE9PSBwcmV2aW91c0NsYXNzZXMpIHtcbiAgICAgICAgICBjb25zdCBsb2NhbFBhY2thZ2VyU3R5bGVQYXRoID1cbiAgICAgICAgICAgIHBhY2thZ2VTY29wZWRQYXRoVG9Nb2R1bGVQYXRoKHJlbGF0aXZlUGF0aCk7XG4gICAgICAgICAgY29uc3QgcG9zdGZpeCA9IGhhc2hGcm9tTW9kdWxlUGF0aChsb2NhbFBhY2thZ2VyU3R5bGVQYXRoKTtcbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZVJhdyA9IGF3YWl0IHJlYWRGaWxlKHRlbXBsYXRlRmlsZS5wYXRoLCAndXRmLTgnKTtcbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZUNvbXBhcmlzb24gPSBbXTtcbiAgICAgICAgICBsZXQgdGVtcGxhdGVDb250ZW50cyA9IHRlbXBsYXRlUmF3O1xuXG4gICAgICAgICAgaWYgKHRlbXBsYXRlRmlsZS5leHQgPT09ICdoYnMnKSB7XG4gICAgICAgICAgICB0ZW1wbGF0ZUNvbXBhcmlzb24ucHVzaChcbiAgICAgICAgICAgICAgZGlkVGVtcGxhdGVDaGFuZ2UoXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVDb250ZW50cyxcbiAgICAgICAgICAgICAgICBwcmV2aW91c0NsYXNzZXMsXG4gICAgICAgICAgICAgICAgY2xhc3NlcyxcbiAgICAgICAgICAgICAgICB0YWdzLFxuICAgICAgICAgICAgICAgIHBvc3RmaXgsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBmaW5kIGFsbCB0ZW1wbGF0ZSB0YWdzLCBhbmQgZXh0cmFjdCB0aGUgY29udGVudHMgdG8gY29tcGFyZVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IHAucGFyc2UodGVtcGxhdGVSYXcsICcnKTtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlcyA9IHJlc3VsdHMubWFwKCh4KSA9PiB4LmNvbnRlbnRzKTtcblxuICAgICAgICAgICAgZm9yIChsZXQgdGVtcGxhdGUgb2YgdGVtcGxhdGVzKSB7XG4gICAgICAgICAgICAgIHRlbXBsYXRlQ29tcGFyaXNvbi5wdXNoKFxuICAgICAgICAgICAgICAgIGRpZFRlbXBsYXRlQ2hhbmdlKFxuICAgICAgICAgICAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgICBwcmV2aW91c0NsYXNzZXMsXG4gICAgICAgICAgICAgICAgICBjbGFzc2VzLFxuICAgICAgICAgICAgICAgICAgdGFncyxcbiAgICAgICAgICAgICAgICAgIHBvc3RmaXgsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZUNoYW5nZWQgPSB0ZW1wbGF0ZUNvbXBhcmlzb24uc29tZSgodikgPT4gdik7XG5cbiAgICAgICAgICAvLyBpZiB0aGUgcmV3cml0ZSBkb2Vzbid0IG1hdGNoIHRoZSBvcmlnaW5hbCBvdXRwdXQsIHdlIHdhbnQgdG8gcmVidWlsZCB0aGUgdGVtcGxhdGVcbiAgICAgICAgICBpZiAodGVtcGxhdGVDaGFuZ2VkKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIGFuIGF3ZnVsIGhhY2sgYmVjYXVzZSB3ZSBkb24ndCBrbm93IGhvdyB0byBpbnZhbGlkYXRlIGJyb2Njb2xpLXBlcnNpc3RlbnQtZmlsdGVyIGNhY2hlXG4gICAgICAgICAgICAvLyBpZGVhbGx5IHdlJ2QgaW52YWxpZGF0ZSB0aGUgYnJvY2NvbGktcGVyaXN0ZW50LWZpbHRlciBjYWNoZSBoZXJlXG4gICAgICAgICAgICBhd2FpdCB3cml0ZUZpbGUodGVtcGxhdGVGaWxlLnBhdGgsIHRlbXBsYXRlQ29udGVudHMgKyAnICcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBhc3NpZ24gZm9yIG5leHQgcnVuIGNvbXBhcmlzb25cblxuICAgICAgICB0aGlzLm9wdGlvbnMucHJldmlvdXNDbGFzc2VzLnNldChyZWxhdGl2ZVBhdGgsIGNsYXNzZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG5cbi8qKlxuICogQ29tcGFyZXMgYSB0ZW1wbGF0ZSB3aXRoIHRoZSBjb250ZXh0IG9mIGRpZmZlcmVudCBzZXRzIG9mIGV4dHJhY2VkIGNzcyBjbGFzc2VzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRzXG4gKiBAcGFyYW0ge1NldH0gcHJldmlvdXNDbGFzc2VzXG4gKiBAcGFyYW0ge1NldH0gY3VycmVudENsYXNzZXNcbiAqIEBwYXJhbSB7U2V0fSB0YWdzXG4gKiBAcGFyYW0ge3N0cmluZ30gcG9zdGZpeFxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGRpZFRlbXBsYXRlQ2hhbmdlKFxuICBjb250ZW50cyxcbiAgcHJldmlvdXNDbGFzc2VzLFxuICBjdXJyZW50Q2xhc3NlcyxcbiAgdGFncyxcbiAgcG9zdGZpeCxcbikge1xuICBjb25zdCBvcmlnaW5hbCA9IHJld3JpdGVIYnMoY29udGVudHMsIHByZXZpb3VzQ2xhc3NlcywgdGFncywgcG9zdGZpeCk7XG4gIGNvbnN0IGN1cnJlbnQgPSByZXdyaXRlSGJzKGNvbnRlbnRzLCBjdXJyZW50Q2xhc3NlcywgdGFncywgcG9zdGZpeCk7XG5cbiAgcmV0dXJuIG9yaWdpbmFsICE9PSBjdXJyZW50O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTY29wZWRDc3NQcmVwcm9jZXNzb3Ige1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgdGhpcy5vd25lciA9IG9wdGlvbnMub3duZXI7XG4gICAgdGhpcy5hcHBOYW1lID0gb3B0aW9ucy5vd25lci5wYXJlbnQucGtnLm5hbWU7XG4gICAgdGhpcy5uYW1lID0gJ3Njb3BlZC1jc3MtcHJlcHJvY2Vzc29yJztcbiAgICB0aGlzLnByZXZpb3VzQ2xhc3NlcyA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBvcHRpb25zIGZyb20gYHNldHVwUHJlcHJvY2Vzc29yUmVnaXN0cnlgLCB0aGUgdjEtQWRkb24gSG9va1xuICAgKiBAcGFyYW0ge3sgbGF5ZXJOYW1lPzogc3RyaW5nIH19IG9wdGlvbnNcbiAgICovXG4gIGNvbmZpZ3VyZU9wdGlvbnMob3B0aW9ucykge1xuICAgIHRoaXMudXNlck9wdGlvbnMgPSBvcHRpb25zIHx8IHsgWydub3QgY29uZmlndXJlZCddOiB0cnVlIH07XG4gIH1cblxuICB0b1RyZWUoaW5wdXROb2RlLCBpbnB1dFBhdGgsIG91dHB1dERpcmVjdG9yeSwgb3B0aW9ucykge1xuICAgIGNvbnN0IG90aGVyUHJlcHJvY2Vzc29ycyA9IHRoaXMucHJlcHJvY2Vzc29ycy5maWx0ZXIoKHApID0+IHAgIT09IHRoaXMpO1xuICAgIGNvbnN0IG90aGVyVHJlZXMgPSBvdGhlclByZXByb2Nlc3NvcnMubWFwKChwKSA9PiBwLnRvVHJlZSguLi5hcmd1bWVudHMpKTtcbiAgICBsZXQgbWVyZ2VkT3RoZXJUcmVlcyA9IG5ldyBNZXJnZVRyZWVzKG90aGVyVHJlZXMpO1xuXG4gICAgbGV0IHJvb3RzID0gW1xuICAgICAgdGhpcy5hcHBOYW1lICsgJy9jb21wb25lbnRzLycsXG4gICAgICAuLi4odGhpcy51c2VyT3B0aW9ucy5hZGRpdGlvbmFsUm9vdHMgfHwgW10pLm1hcChcbiAgICAgICAgKHJvb3QpID0+IGAke3RoaXMuYXBwTmFtZX0vJHtyb290fWAsXG4gICAgICApLFxuICAgIF07XG4gICAgbGV0IGluY2x1ZGUgPSByb290c1xuICAgICAgLm1hcCgocm9vdCkgPT4ge1xuICAgICAgICBsZXQgd2l0aFNsYXNoID0gcm9vdC5lbmRzV2l0aCgnLycpID8gcm9vdCA6IGAke3Jvb3R9L2A7XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBgJHt3aXRoU2xhc2h9KiovKi5jc3NgLFxuICAgICAgICAgIC4uLkNPTVBPTkVOVF9FWFRFTlNJT05TLm1hcCgoZXh0KSA9PiBgJHt3aXRoU2xhc2h9KiovKi4ke2V4dH1gKSxcbiAgICAgICAgXTtcbiAgICAgIH0pXG4gICAgICAuZmxhdCgpO1xuXG4gICAgbGV0IGNvbXBvbmVudHNOb2RlID0gbmV3IEZ1bm5lbChpbnB1dE5vZGUsIHsgaW5jbHVkZSB9KTtcblxuICAgIGNvbXBvbmVudHNOb2RlID0gbmV3IFNjb3BlZEZpbHRlcihjb21wb25lbnRzTm9kZSwge1xuICAgICAgaW5wdXRQYXRoLFxuICAgICAgZ2V0VXNlck9wdGlvbnM6ICgpID0+IHRoaXMudXNlck9wdGlvbnMsXG4gICAgICBvd25lcjogdGhpcy5vd25lcixcbiAgICAgIHByZXZpb3VzQ2xhc3NlczogdGhpcy5wcmV2aW91c0NsYXNzZXMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21wb25lbnRTdHlsZXMgPSBuZXcgRnVubmVsKGNvbXBvbmVudHNOb2RlLCB7XG4gICAgICBpbmNsdWRlOiByb290cy5tYXAoKHJvb3QpID0+IHtcbiAgICAgICAgbGV0IHdpdGhTbGFzaCA9IHJvb3QuZW5kc1dpdGgoJy8nKSA/IHJvb3QgOiBgJHtyb290fS9gO1xuXG4gICAgICAgIHJldHVybiBgJHt3aXRoU2xhc2h9KiovKi5jc3NgO1xuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBjb25zdCBhcHBDc3MgPSBuZXcgRnVubmVsKGlucHV0Tm9kZSwge1xuICAgICAgaW5jbHVkZTogW3RoaXMuYXBwTmFtZSArICcvc3R5bGVzL2FwcC5jc3MnXSxcbiAgICB9KTtcblxuICAgIGxldCBtZXJnZWRTdHlsZXMgPSBuZXcgTWVyZ2VUcmVlcyhcbiAgICAgIFthcHBDc3MsIG1lcmdlZE90aGVyVHJlZXMsIGNvbXBvbmVudFN0eWxlc10sXG4gICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9LFxuICAgICk7XG5cbiAgICBsZXQgbmV3T3V0cHV0ID0gbmV3IENvbmNhdChtZXJnZWRTdHlsZXMsIHtcbiAgICAgIG91dHB1dEZpbGU6IG9wdGlvbnMub3V0cHV0UGF0aHNbJ2FwcCddLFxuICAgICAgYWxsb3dOb25lOiB0cnVlLFxuICAgICAgc291cmNlTWFwQ29uZmlnOiB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnVzZXJPcHRpb25zPy5wYXNzdGhyb3VnaCkge1xuICAgICAgbGV0IHBhc3NlZFRocm91Z2ggPSBuZXcgRnVubmVsKG1lcmdlZFN0eWxlcywge1xuICAgICAgICBpbmNsdWRlOiB0aGlzLnVzZXJPcHRpb25zLnBhc3N0aHJvdWdoLFxuICAgICAgICBkZXN0RGlyOiB0aGlzLnVzZXJPcHRpb25zLnBhc3N0aHJvdWdoRGVzdGluYXRpb24sXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG5ldyBNZXJnZVRyZWVzKFtwYXNzZWRUaHJvdWdoLCBuZXdPdXRwdXRdLCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ld091dHB1dDtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgcG9zdGNzcyBmcm9tICdwb3N0Y3NzJztcbmltcG9ydCBwYXJzZXIgZnJvbSAncG9zdGNzcy1zZWxlY3Rvci1wYXJzZXInO1xuXG5pbXBvcnQgaXNJbnNpZGVHbG9iYWwgZnJvbSAnLi9pc0luc2lkZUdsb2JhbC5qcyc7XG5cbmZ1bmN0aW9uIGdldENsYXNzZXNBbmRUYWdzKHNlbCwgY2xhc3NlcywgdGFncykge1xuICBjb25zdCB0cmFuc2Zvcm0gPSAoc2xzKSA9PiB7XG4gICAgc2xzLndhbGsoKHNlbGVjdG9yKSA9PiB7XG4gICAgICBpZiAoc2VsZWN0b3IudHlwZSA9PT0gJ2NsYXNzJyAmJiAhaXNJbnNpZGVHbG9iYWwoc2VsZWN0b3IpKSB7XG4gICAgICAgIGNsYXNzZXMuYWRkKHNlbGVjdG9yLnZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IudHlwZSA9PT0gJ3RhZycgJiYgIWlzSW5zaWRlR2xvYmFsKHNlbGVjdG9yKSkge1xuICAgICAgICB0YWdzLmFkZChzZWxlY3Rvci52YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgcGFyc2VyKHRyYW5zZm9ybSkucHJvY2Vzc1N5bmMoc2VsKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q2xhc3Nlc1RhZ3NGcm9tQ3NzKGNzcykge1xuICBjb25zdCBjbGFzc2VzID0gbmV3IFNldCgpO1xuICBjb25zdCB0YWdzID0gbmV3IFNldCgpO1xuXG4gIGNvbnN0IGFzdCA9IHBvc3Rjc3MucGFyc2UoY3NzKTtcblxuICBhc3Qud2Fsaygobm9kZSkgPT4ge1xuICAgIGlmIChub2RlLnR5cGUgPT09ICdydWxlJykge1xuICAgICAgZ2V0Q2xhc3Nlc0FuZFRhZ3Mobm9kZS5zZWxlY3RvciwgY2xhc3NlcywgdGFncyk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4geyBjbGFzc2VzLCB0YWdzIH07XG59XG5cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0luc2lkZUdsb2JhbChub2RlLCBmdW5jKSB7XG4gIGNvbnN0IHBhcmVudCA9IG5vZGUucGFyZW50O1xuXG4gIGlmICghcGFyZW50KSByZXR1cm4gZmFsc2U7XG4gIGlmIChwYXJlbnQudHlwZSA9PT0gJ3BzZXVkbycgJiYgcGFyZW50LnZhbHVlID09PSAnOmdsb2JhbCcpIHJldHVybiB0cnVlO1xuXG4gIHJldHVybiBpc0luc2lkZUdsb2JhbChwYXJlbnQsIGZ1bmMpO1xufVxuIiwgImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IGZzU3luYyBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBoYXNoRnJvbUFic29sdXRlUGF0aCB9IGZyb20gJy4vaGFzaC1mcm9tLWFic29sdXRlLXBhdGguanMnO1xuaW1wb3J0IHsgaGFzaEZyb21Nb2R1bGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMnO1xuXG5leHBvcnQgeyBoYXNoRnJvbUFic29sdXRlUGF0aCB9IGZyb20gJy4vaGFzaC1mcm9tLWFic29sdXRlLXBhdGguanMnO1xuZXhwb3J0IHsgaGFzaEZyb21Nb2R1bGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMnO1xuXG4vLyBDSlMgLyBFU00/XG5sZXQgaGVyZSA9IGltcG9ydC5tZXRhLnVybDtcbmxldCBvdXJSZXF1aXJlID0gZ2xvYmFsVGhpcy5yZXF1aXJlXG4gID8gZ2xvYmFsVGhpcy5yZXF1aXJlXG4gIDogaGVyZSAmJiBjcmVhdGVSZXF1aXJlKGhlcmUpO1xuXG5pZiAoIW91clJlcXVpcmUpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIG91clJlcXVpcmUgPSByZXF1aXJlO1xufVxuXG5jb25zdCBFTUJST0lERVJfRElSID0gJ25vZGVfbW9kdWxlcy8uZW1icm9pZGVyJztcbmNvbnN0IEVNQlJPSURFUl8zX1JFV1JJVFRFTl9BUFBfUEFUSCA9IGAke0VNQlJPSURFUl9ESVJ9L3Jld3JpdHRlbi1hcHBgO1xuY29uc3QgRU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9BU1NFVFMgPSBgJHtFTUJST0lERVJfM19SRVdSSVRURU5fQVBQX1BBVEh9L2Fzc2V0c2A7XG5jb25zdCBFTUJST0lERVJfM19SRVdSSVRURU5fUEFDS0FHRVMgPSBgJHtFTUJST0lERVJfRElSfS9yZXdyaXR0ZW4tcGFja2FnZXNgO1xuY29uc3QgSVJSRUxFVkFOVF9QQVRIUyA9IFsnbm9kZV9tb2R1bGVzLy5wbnBtJ107XG5jb25zdCBVTlNVUFBPUlRFRF9ESVJFQ1RPUklFUyA9IG5ldyBTZXQoWyd0ZXN0cyddKTtcblxuY29uc3QgQ1dEID0gcHJvY2Vzcy5jd2QoKTtcblxuLyoqXG4gKiBSZWdhcmRsZXNzIG9mIHdoYXQgdGhlIGZpbGVQYXRoIGZvcm1hdCBpcyxcbiAqIHRoaXMgd2lsbCB0cnkgdG8gcmV0dXJuIHRoZSBjb3JyZWN0IHBvc3RmaXguXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaEZyb20oZmlsZVBhdGgpIHtcbiAgaWYgKGZpbGVQYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHJldHVybiBoYXNoRnJvbUFic29sdXRlUGF0aChmaWxlUGF0aCk7XG4gIH1cblxuICByZXR1cm4gaGFzaEZyb21Nb2R1bGVQYXRoKGZpbGVQYXRoKTtcbn1cblxuLyoqXG4gKiBCYXNlZCBvbiBlbWJlcidzIGNvbXBvbmVudCBsb2NhdGlvbiBjb252ZW50aW9ucyxcbiAqIHRoaXMgZnVuY3Rpb24gd2lsbCBwcm92aWRlIGEgcGF0aCBmb3Igd2hlcmUgd2VcbiAqIGV4cGVjdCB0aGUgQ1NTIHRvIGxpdmUuXG4gKlxuICogRm9yIGNvLWxvY2F0ZWQgc3RydWN0dXJlOlxuICogICAtIGNvbXBvbmVudHMvbXktY29tcG9uZW50Lmhic1xuICogICAtIGNvbXBvbmVudHMvbXktY29tcG9uZW50LmNzc1xuICpcbiAqIEZvciBuZXN0ZWQgY28tbG9jYXRlZCBzdHJ1Y3R1cmVcbiAqICAgLSBjb21wb25lbnRzL215LWNvbXBvbmVudC9mb28uaGJzXG4gKiAgIC0gY29tcG9uZW50cy9teS1jb21wb25lbnQvZm9vLmNzc1xuICpcbiAqIEZvciBQb2RzIHJvdXRlcyBzdHJ1Y3R1cmVcbiAqICAgLSByb3V0ZXMvbXktcm91dGUvdGVtcGxhdGUue2hicyxqc31cbiAqICAgLSByb3V0ZXMvbXktcm91dGUvc3R5bGVzLmNzc1xuICpcbiAqIERlbGliZXJhdGVseSBub3Qgc3VwcG9ydGVkOlxuICogICAtIGNvbXBvbmVudHMgdy8gcG9kcyAtLSB0aGlzIGlzIGRlcHJlY2F0ZWQgaW4gNS4xMFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlTmFtZSAtIHRoZSBoYnMsIGpzLCBnanMsIGd0cyBvciB3aGF0ZXZlciBjby1sb2NhdGVkIHBhdGguXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIGV4cGVjdGVkIGNzcyBwYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjc3NQYXRoRm9yKGZpbGVOYW1lKSB7XG4gIGxldCB3aXRob3V0RXh0ID0gd2l0aG91dEV4dGVuc2lvbihmaWxlTmFtZSk7XG4gIGxldCBjc3NQYXRoID0gd2l0aG91dEV4dCArICcuY3NzJztcblxuICBpZiAoaXNQb2QoZmlsZU5hbWUpKSB7XG4gICAgY3NzUGF0aCA9IGZpbGVOYW1lXG4gICAgICAucmVwbGFjZSgvdGVtcGxhdGVcXC5qcyQvLCAnc3R5bGVzLmNzcycpXG4gICAgICAucmVwbGFjZSgvdGVtcGxhdGVcXC5oYnMvLCAnc3R5bGVzLmNzcycpO1xuICB9XG5cbiAgcmV0dXJuIGNzc1BhdGg7XG59XG5cbi8qKlxuICogTm90ZSB0aGF0IGNvbXBvbmVudHMgaW4gdGhlIFwicG9kc1wiIGNvbnZlbnRpb24gd2lsbFxuICogbmV2ZXIgYmUgc3VwcG9ydGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQb2RUZW1wbGF0ZShmaWxlUGF0aCkge1xuICBpZiAoZmlsZVBhdGguaW5jbHVkZXMoJy9jb21wb25lbnRzLycpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGZpbGVQYXRoLmVuZHNXaXRoKCd0ZW1wbGF0ZS5qcycpIHx8IGZpbGVQYXRoLmVuZHNXaXRoKCd0ZW1wbGF0ZS5oYnMnKTtcbn1cblxuLyoqXG4gKiBOb3RlIHRoYXQgY29tcG9uZW50cyBpbiB0aGUgXCJwb2RzXCIgY29udmVudGlvbiB3aWxsXG4gKiBuZXZlciBiZSBzdXBwb3J0ZWQuXG4gKlxuICogQ2hlY2tzIGlmIGEgZmlsZSBlbmRzIHdpdGhcbiAqIC0gdGVtcGxhdGUuanNcbiAqIC0gdGVtcGxhdGUuaGJzXG4gKiAtIHN0eWxlcy5jc3NcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUG9kKGZpbGVQYXRoKSB7XG4gIGlmIChmaWxlUGF0aC5pbmNsdWRlcygnL2NvbXBvbmVudHMvJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoaXNQb2RUZW1wbGF0ZShmaWxlUGF0aCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmaWxlUGF0aC5lbmRzV2l0aCgnc3R5bGVzLmNzcycpO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGhcbiAqIEByZXR1cm5zIHRoZSBzYW1lIHBhdGgsIGJ1dCB3aXRob3V0IHRoZSBleHRlbnNpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhvdXRFeHRlbnNpb24oZmlsZVBhdGgpIHtcbiAgbGV0IHBhcnNlZCA9IHBhdGgucGFyc2UoZmlsZVBhdGgpO1xuXG4gIHJldHVybiBwYXRoLmpvaW4ocGFyc2VkLmRpciwgcGFyc2VkLm5hbWUpO1xufVxuXG4vKipcbiAqIEV4YW1wbGVzIGZvciBmaWxlTmFtZVxuICogLSBhYnNvbHV0ZSBvbi1kaXNrIHBhdGhcbiAqIC0gaW4gd2VicGFja1xuICogICAtIFVSTC1hYnNvbHV0ZSBwYXRoLCBzdGFydGluZyB3aXRoIC9cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZU5hbWVcbiAqIEBwYXJhbSB7eyBhZGRpdGlvbmFsUm9vdHM/OiBzdHJpbmdbXTsgY3dkOiBzdHJpbmcgfX0gb3B0aW9uc1xuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVsZXZhbnRGaWxlKGZpbGVOYW1lLCB7IGFkZGl0aW9uYWxSb290cywgY3dkIH0pIHtcbiAgLy8gUHJpdmF0ZSBWaXJ0dWFsIE1vZHVsZXNcbiAgaWYgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoJ1xcMCcpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFRoZXNlIGFyZSBub3QgdmFsaWQgdXNlcmxhbmQgbmFtZXMgKG9yIGFyZSBmcm9tIGxpYnJhcmllcylcbiAgaWYgKGZpbGVOYW1lLm1hdGNoKC9eW2EtekEtWl0vKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBFeHRlcm5hbCB0byB1c1xuICBpZiAoZmlsZU5hbWUuc3RhcnRzV2l0aCgnL0BlbWJyb2lkZXInKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoSVJSRUxFVkFOVF9QQVRIUy5zb21lKChpKSA9PiBmaWxlTmFtZS5pbmNsdWRlcyhpKSkpIHJldHVybiBmYWxzZTtcblxuICBpZiAoZmlsZU5hbWUuaW5jbHVkZXMoJy9ub2RlX21vZHVsZXMvJykpIHtcbiAgICAvLyBpZiBhIGZpbGUgaXMgbm90IHRoZSBlbWJyb2lkZXIgY2FjaGUgZGlyZWN0b3J5XG4gICAgLy8gYW5kIGlzIGluIG5vZGVfbW9kdWxlcywgc2tpcCBpdC5cbiAgICBpZiAoIWZpbGVOYW1lLmluY2x1ZGVzKEVNQlJPSURFUl9ESVIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gcmV3cml0dGVuIHBhY2thZ2VzIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgYXQgdGhlaXIgb3duXG4gICAgLy8gcHVibGlzaCB0aW1lXG4gICAgaWYgKGZpbGVOYW1lLmluY2x1ZGVzKEVNQlJPSURFUl8zX1JFV1JJVFRFTl9QQUNLQUdFUykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBUaGVzZSBhcmUgYWxyZWFkeSB0aGUgYnVuZGxlZCBmaWxlcy5cbiAgICBpZiAoZmlsZU5hbWUuaW5jbHVkZXMoRU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9BU1NFVFMpKSB7XG4gICAgICAvLyBub3Qgc3VwcG9ydGVkLCBuZXZlciB3aWxsIGJlXG4gICAgICBpZiAoZmlsZU5hbWUuZW5kc1dpdGgoYCR7RU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9BU1NFVFN9L3Rlc3RzLmpzYCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBJZGVhbGx5LCB3ZSBuZXZlciBnZXQgaGVyZSAtLSBpbmRpY2F0ZXMgd2UncmUgbm90IGZpbHRlcmluZyBlZmZlY3RpdmVseSBpbiBiYWJlbFxuICAgICAgLy8gTk9URTogaWYgd2UgZ2V0IGhlcmUsIHdlJ3JlIHRyeWluZyB0byBvcGVyYXRlIG9uIGEgZmlsZSB0b28gbGF0ZS5cbiAgICAgIC8vICAgICAgIHdlIG5lZWQgU2NvcGVkQ1NTIHRvIG9wZXJhdGUgYXMgY2xvc2UgdG8gb3JpZ2luYWwgc291cmNlIGFzIHBvc3NpYmxlIC0tIG5vdCBvdXRwdXQgZmlsZXMuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgbGV0IHdvcmtzcGFjZSA9IGZpbmRXb3Jrc3BhY2VQYXRoKGZpbGVOYW1lKTtcblxuICBhc3NlcnQoY3dkLCBgY3dkIHdhcyBub3QgcGFzc2VkIHRvIGlzUmVsZXZhbnRGaWxlYCk7XG5cbiAgbGV0IG91cldvcmtzcGFjZSA9IGZpbmRXb3Jrc3BhY2VQYXRoKGN3ZCk7XG5cbiAgaWYgKHdvcmtzcGFjZSAhPT0gb3VyV29ya3NwYWNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IGxvY2FsID0gZmlsZU5hbWUucmVwbGFjZSh3b3Jrc3BhY2UsICcnKTtcbiAgbGV0IFssIC4uLnBhcnRzXSA9IGxvY2FsLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pO1xuXG4gIGlmIChVTlNVUFBPUlRFRF9ESVJFQ1RPUklFUy5oYXMocGFydHNbMF0pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vc3RseSBwb2RzIHN1cHBvcnQuXG4gICAqIGZvbGtzIG5lZWQgdG8gb3B0IGluIHRvIHBvZHMgKHJvdXRlcyksIGJlY2F1c2UgZXZlcnkgcG9kcyBhcHAgY2FuIGJlIGNvbmZpZ3VyZWQgZGlmZmVyZW50bHlcbiAgICovXG4gIGxldCByb290cyA9IFsnL2NvbXBvbmVudHMvJywgJy90ZW1wbGF0ZXMvJywgLi4uKGFkZGl0aW9uYWxSb290cyB8fCBbXSldO1xuXG4gIGlmICghcm9vdHMuc29tZSgocm9vdCkgPT4gZmlsZU5hbWUuaW5jbHVkZXMocm9vdCkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYWNrYWdlU2NvcGVkUGF0aFRvTW9kdWxlUGF0aChwYWNrYWdlU2NvcGVkUGF0aCkge1xuICAvKipcbiAgICogKkJ5IGNvbnZlbnRpb24qLCBgc3JjYCBpcyBvbWl0dGVkIGZyb20gY29tcG9uZW50IHBhdGhzLlxuICAgKiBXZSBjYW4gcmVmbGVjdCB0aGUgc2FtZSBiZWhhdmlvciBieSByZXBsYWNpbmcgc3JjL1xuICAgKiB3aXRoIGFuIGVtcHR5IHN0cmluZy5cbiAgICpcbiAgICogQ1NTIGlzbid0IGVtaXR0ZWQgYXMgYSBjby1sb2NhdGVkIG1vZHVsZSwgYnV0XG4gICAqIHRvIGtlZXAgY29udmVudGlvbnMgY29uc2lzdGVudCBhY3Jvc3MgbGFuZ3VhZ2VzLFxuICAgKiB3ZSBjYW4gcHJldGVuZCBpdCBpcy5cbiAgICpcbiAgICogQW55IGN1c3RvbWl6YXRpb24gYmV5b25kIHJlbW92aW5nIGBzcmNgIGFuZCBgYXBwYCBpcyBwb3RlbnRpYWxseSBjb25mdXNpbmcuXG4gICAqIElmIHdlIG5lZWQgZnVydGhlciBjdXN0b21pemF0aW9ucywgd2UnbGwgd2FudCB0byBtYXRjaCBvbiBgZXhwb3J0c2AgaW4gdGhlXG4gICAqIGNvcnJlc3BvbmRpbmcgcGFja2FnZS5qc29uXG4gICAqL1xuICBsZXQgcGFja2FnZVJlbGF0aXZlID0gcGFja2FnZVNjb3BlZFBhdGgucmVwbGFjZSgvXlxcL3NyY1xcLy8sICcvJyk7XG5cbiAgbGV0IHBhcnNlZCA9IHBhdGgucGFyc2UocGFja2FnZVJlbGF0aXZlKTtcblxuICBpZiAoaXNQb2QocGFja2FnZVJlbGF0aXZlKSkge1xuICAgIC8qKlxuICAgICAqIEZvciBwb2RzLCB3ZSBjaG9wIG9mZiB0aGUgd2hvbGUgZmlsZSwgYW5kIHVzZSB0aGUgZGlyIG5hbWUgYXMgdGhlIFwibW9kdWxlUGF0aFwiXG4gICAgICovXG4gICAgcmV0dXJuIHBhcnNlZC5kaXI7XG4gIH1cblxuICAvKipcbiAgICogSWYgYW4gZXh0ZW5zaW9uIGlzIHBhc3NlZCwgcmVtb3ZlIGl0LlxuICAgKiBXaGVuIHVzaW5nIHBhY2thZ2VycywgZm9sa3MgYXJlIHVzZWQgdG8gbm90IGhhdmluZyB0byBzcGVjaWZ5IGV4dGVuc2lvbnMgZm9yIGZpbGVzLlxuICAgKiBTaW5jZSB3ZSBkb24ndCBldmVuIGVtaXQgY3NzIGZpbGVzIGNvLWxvY2F0ZWQgdG8gZWFjaCBtb2R1bGUsXG4gICAqIHRoaXMgaGVscHMgdXMgbm90IGNvbnZleSBhIGxpZSB0aGF0IGEgZmlsZSBtYXkgZXhpc3QgaW4gYXQgcnVudGltZS5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUgYDxtb2R1bGUtbmFtZT4vY29tcG9uZW50cy9idXR0b25gLlxuICAgKiBJdCBkb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBleHRlbnNpb24gaXMsIGJlY2F1c2UgeW91IGNhbiBvbmx5IGhhdmUgb25lIGNzcyBmaWxlXG4gICAqIGZvciB0aGUgYnV0dG9uIG1vZHVsZSBhbnl3YXkuXG4gICAqL1xuICBsZXQgbG9jYWxQYWNrYWdlclN0eWxlUGF0aCA9IHBhdGguam9pbihwYXJzZWQuZGlyLCBwYXJzZWQubmFtZSk7XG5cbiAgcmV0dXJuIGxvY2FsUGFja2FnZXJTdHlsZVBhdGg7XG59XG5cbi8qKlxuICogcmV0dXJucyB0aGUgYXBwLW1vZHVsZSBwYXRoIG9mIHRoZSBzb3VyY2UgZmlsZVxuICpcbiAqIFRoaXMgYXNzdW1lcyBub3JtYWwgZW1iZXIgYXBwIGNvbnZlbnRpb25zXG4gKlxuICogd2hpY2ggaXMgYDxwYWNrYWdlLmpzb24jbmFtZT4vcGF0aC10by1maWxlYFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwUGF0aChzb3VyY2VQYXRoKSB7XG4gIGxldCB3b3Jrc3BhY2VQYXRoID0gZmluZFdvcmtzcGFjZVBhdGgoc291cmNlUGF0aCk7XG4gIGxldCBuYW1lID0gbW9kdWxlTmFtZShzb3VyY2VQYXRoKTtcblxuICAvKipcbiAgICogIFVuZGVyIGVtYnJvaWRlciBidWlsZHMsIHRoZSBzcGVjLWNvbXBsaWFudCB2ZXJzaW9uIG9mIHRoZSBhcHBcbiAgICogaGFzIGFsbCB0aGUgZmlsZXMgdW5kZXIgYSBmb2xkZXIgd2hpY2ggcmVwcmVzZW50cyB0aGUgcGFja2FnZSBuYW1lLFxuICAgKiByYXRoZXIgdGhhbiBcImFwcFwiLlxuICAgKi9cbiAgbGV0IHBhY2thZ2VSZWxhdGl2ZSA9IHNvdXJjZVBhdGgucmVwbGFjZSh3b3Jrc3BhY2VQYXRoLCAnJyk7XG5cbiAgLyoqXG4gICAqIEJ1dCB3ZSBhbHNvIGRvbid0IHdhbnQgJ2FwcCcgLS0gd2hpY2ggaXMgcHJlc2VudCBpbiB0aGUgdjEgYWRkb24gcGlwZWxpbmVcbiAgICovXG4gIHBhY2thZ2VSZWxhdGl2ZSA9IHBhY2thZ2VSZWxhdGl2ZS5yZXBsYWNlKGAvYXBwL2AsIGAvYCk7XG5cbiAgLyoqXG4gICAqIGFsc28gYWxzbywgd2Uga25vdyB0aGF0IHRoZSByZS13cml0dGVuIGFwcCBzdHJ1Y3R1cmUgaW4gZW1icm9pZGVyQHYzXG4gICAqIGlzIGV4dHJhbmVvdXMsIGFuZCB3ZSBjYW4gY29sbGFwc2UgaXRcbiAgICovXG4gIHBhY2thZ2VSZWxhdGl2ZSA9IHBhY2thZ2VSZWxhdGl2ZS5yZXBsYWNlKFxuICAgIGAke0VNQlJPSURFUl8zX1JFV1JJVFRFTl9BUFBfUEFUSH0vYCxcbiAgICAnLycsXG4gICk7XG5cbiAgbGV0IGxvY2FsUGFja2FnZXJTdHlsZVBhdGggPSBwYWNrYWdlU2NvcGVkUGF0aFRvTW9kdWxlUGF0aChwYWNrYWdlUmVsYXRpdmUpO1xuXG4gIHJldHVybiBgJHtuYW1lfSR7bG9jYWxQYWNrYWdlclN0eWxlUGF0aH1gO1xufVxuXG4vKipcbiAqIFRvIGF2b2lkIGhpdHRpbmcgdGhlIGZpbGVzeXNldG0sIHdlJ2xsIHN0b3JlIGFsbCBmb3VuZFxuICogcHJvamVjdCBwYXRocyBiZXJlLCBzbyB3ZSBjYW4sIGluIG1lbW9yeSxcbiAqIGdldCB0aGUgZm9sZGVyIHdoZXJlIGEgcGFja2FnZS5qc29uIGV4aXN0cywgcmF0aGVyIHRoYW5cbiAqIGhpdCB0aGUgZmlsZSBzeXN0ZW0gZXZlcnkgdGltZS5cbiAqL1xuY29uc3QgU0VFTiA9IG5ldyBTZXQoKTtcblxuZnVuY3Rpb24gZ2V0U2Vlbihzb3VyY2VQYXRoKSB7XG4gIGlmIChTRUVOLmhhcyhzb3VyY2VQYXRoKSkgcmV0dXJuIHNvdXJjZVBhdGg7XG5cbiAgbGV0IHBhcnRzID0gc291cmNlUGF0aC5zcGxpdCgnLycpO1xuXG4gIGZvciAobGV0IGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID4gMTsgaS0tKSB7XG4gICAgbGV0IHRvQ2hlY2sgPSBwYXJ0cy5zbGljZSgwLCBpKS5qb2luKCcvJyk7XG5cbiAgICBsZXQgc2VlbiA9IFNFRU4uaGFzKHRvQ2hlY2spO1xuXG4gICAgaWYgKHNlZW4pIHtcbiAgICAgIHJldHVybiB0b0NoZWNrO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFdvcmtzcGFjZVBhdGgoc291cmNlUGF0aCwgb3B0aW9ucykge1xuICBsZXQgY3dkID0gb3B0aW9ucz8uY3dkID8/IENXRDtcblxuICBpZiAoc291cmNlUGF0aC5pbmNsdWRlcyhFTUJST0lERVJfM19SRVdSSVRURU5fQVBQX1BBVEgpKSB7XG4gICAgc291cmNlUGF0aCA9IHNvdXJjZVBhdGguc3BsaXQoRU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9QQVRIKVswXTtcbiAgfVxuXG4gIGlmIChzb3VyY2VQYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICBzb3VyY2VQYXRoID0gc291cmNlUGF0aC5yZXBsYWNlKC9cXC8kLywgJycpO1xuICB9XG5cbiAgbGV0IHNlZW4gPSBnZXRTZWVuKHNvdXJjZVBhdGgpO1xuXG4gIGlmIChzZWVuKSB7XG4gICAgcmV0dXJuIHNlZW47XG4gIH1cblxuICBsZXQgY2FuZGlkYXRlUGF0aCA9IHBhdGguam9pbihzb3VyY2VQYXRoLCAncGFja2FnZS5qc29uJyk7XG5cbiAgY29uc3QgaXNXb3Jrc3BhY2UgPSBmc1N5bmMuZXhpc3RzU3luYyhjYW5kaWRhdGVQYXRoKTtcblxuICBpZiAoaXNXb3Jrc3BhY2UpIHtcbiAgICByZXR1cm4gc291cmNlUGF0aDtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGZpbmRQYWNrYWdlSnNvblVwKHNvdXJjZVBhdGgsIHsgY3dkIH0pO1xuXG4gIGlmICghcGFja2FnZUpzb25QYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZGV0ZXJtaW5lIHByb2plY3QgZm9yICR7c291cmNlUGF0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IHdvcmtzcGFjZVBhdGggPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25QYXRoKTtcblxuICBTRUVOLmFkZCh3b3Jrc3BhY2VQYXRoKTtcblxuICByZXR1cm4gd29ya3NwYWNlUGF0aDtcbn1cblxuZnVuY3Rpb24gZmluZFBhY2thZ2VKc29uVXAoc3RhcnRQYXRoLCBvcHRpb25zKSB7XG4gIGxldCBjd2QgPSBvcHRpb25zPy5jd2QgPz8gQ1dEO1xuICBsZXQgcGFydHMgPSBzdGFydFBhdGguc3BsaXQoJy8nKTtcblxuICBmb3IgKGxldCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+IDE7IGktLSkge1xuICAgIGxldCB0b0NoZWNrID0gcGFydHMuc2xpY2UoMCwgaSkuam9pbignLycpO1xuXG4gICAgbGV0IHBhY2thZ2VKc29uID0gcGF0aC5qb2luKHRvQ2hlY2ssICdwYWNrYWdlLmpzb24nKTtcbiAgICBsZXQgZXhpc3RzID0gZnNTeW5jLmV4aXN0c1N5bmMocGFja2FnZUpzb24pO1xuXG4gICAgaWYgKGV4aXN0cykge1xuICAgICAgcmV0dXJuIHBhY2thZ2VKc29uO1xuICAgIH1cblxuICAgIC8vIERvbid0IHRyYXZlcnNlIGFsbCB0aGUgd2F5IHRvIHRoZSByb290IG9mIHRoZSBmaWxlIHN5c3RlbS5cbiAgICBpZiAodG9DaGVjayA9PT0gY3dkKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuY29uc3QgTUFOSUZFU1RfQ0FDSEUgPSBuZXcgTWFwKCk7XG5cbi8qKlxuICogV2lsbCByZXR1cm4gdGhlIHBhY2thZ2UuanNvbiNuYW1lLCBvciBjb25maWcvZW52aXJvbm1lbnQjbW91ZGxlUHJlZml4IChpZiB2MSBhcHApXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZHVsZU5hbWUoc291cmNlUGF0aCkge1xuICBjb25zdCB3b3Jrc3BhY2UgPSBmaW5kV29ya3NwYWNlUGF0aChzb3VyY2VQYXRoKTtcbiAgY29uc3QgbWFuaWZlc3QgPSBnZXRNYW5pZmVzdCh3b3Jrc3BhY2UpO1xuXG4gIGlmIChtYW5pZmVzdFsnZW1iZXItYWRkb24nXSkge1xuICAgIC8qKlxuICAgICAqIExpYnJhcmllcyBhcmUgbm90IGFsbG93ZWQgdG8gY3VzdG9taXplIHRoZWlyIG1vZHVsZSBuYW1lXG4gICAgICogdG8gYmUgZGlmZmVyZW50IGZyb20gdGhlaXIgcGFja2FnZSBuYW1lLlxuICAgICAqXG4gICAgICogKEl0J3MgYWxzbyBib25rZXJzIHRoYXQgdGhpcyBpcyBhbGxvd2VkIGZvciB2MSBhcHBzKVxuICAgICAqL1xuICAgIHJldHVybiBtYW5pZmVzdC5uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciB2MSBhcHBzLCB3ZSBuZWVkIHRvIHJlZmVyZW5jZSB0aGUgY29uZmlnL2Vudmlyb25tZW50LmpzIGZpbGVcbiAgICogdG8gc2VlIGlmIHRoZSBtb2R1bGVQcmVmaXggc2V0dGluZyBkaWZmZXJzIGZyb20gbWFuaWZlc3QubmFtZTtcbiAgICovXG4gIGxldCBlbnZpcm9ubWVudEpTID0gcGF0aC5qb2luKHdvcmtzcGFjZSwgJ2NvbmZpZy9lbnZpcm9ubWVudC5qcycpO1xuXG4gIC8qKlxuICAgKiBOT1RFOiB0aGUgZW52aXJvbm1lbnQuanMgaXMgYSBjb21tb25KUyBmaWxlLCBzbyB3ZSBjYW4gc3luY2hyb25vdXNseSByZXF1aXJlIGl0XG4gICAqXG4gICAqIFRPRE86IGlmIHdlIGhhdmUgaXNzdWVzIHdpdGggbG9hZGluZyB0aGlzIGZpbGUgbGF0ZXIgd2Ugc2hvdWxkIHByb2JhYmx5IGp1c3QgcnVuIGpzY29kZXNoaWZ0IG9uIGl0XG4gICAqICAgICAgIGJ1dCB0aGF0IGNvdWxkIGFsbG93IHVzIHRvIGJlIGJyaXR0bGUgaW4gZGlmZmVyZW50IHdheXMsIGxpa2UgaWYgZm9sa3Mgc3RyYXkgZnJvbSB0aGUgd2F5IHRoZVxuICAgKiAgICAgICBmaWxlIGlzIGxhaWQgb3V0IGZyb20gdGhlIGJsdWVwcmludCBkZWZhdWx0cy5cbiAgICovXG4gIGlmIChmc1N5bmMuZXhpc3RzU3luYyhlbnZpcm9ubWVudEpTKSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZiAtLSB0aGlzIGV4aXN0c1xuICAgIGNvbnN0IGVudkZuID0gb3VyUmVxdWlyZShlbnZpcm9ubWVudEpTKTtcbiAgICBjb25zdCBlbnYgPSBlbnZGbignZW1iZXItc2NvcGVkLWNzcycpO1xuXG4gICAgcmV0dXJuIGVudi5tb2R1bGVQcmVmaXggfHwgbWFuaWZlc3QubmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWxsYmFjayB0byB0aGUgdHJ1ZVx1MjEyMiBtb2R1bGVcdTIxMjIgbmFtZS5cbiAgICovXG4gIHJldHVybiBtYW5pZmVzdC5uYW1lO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB3b3Jrc3BhY2VcbiAqL1xuZnVuY3Rpb24gZ2V0TWFuaWZlc3Qod29ya3NwYWNlKSB7XG4gIGxldCBleGlzdGluZyA9IE1BTklGRVNUX0NBQ0hFLmdldCh3b3Jrc3BhY2UpO1xuXG4gIGlmIChleGlzdGluZykge1xuICAgIHJldHVybiBleGlzdGluZztcbiAgfVxuXG4gIGxldCBidWZmZXIgPSBmc1N5bmMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3Jrc3BhY2UsICdwYWNrYWdlLmpzb24nKSk7XG4gIGxldCBjb250ZW50ID0gYnVmZmVyLnRvU3RyaW5nKCk7XG4gIGxldCBqc29uID0gSlNPTi5wYXJzZShjb250ZW50KTtcblxuICBNQU5JRkVTVF9DQUNIRS5zZXQod29ya3NwYWNlLCBqc29uKTtcblxuICByZXR1cm4ganNvbjtcbn1cbiIsICJpbXBvcnQgbWQ1IGZyb20gJ2JsdWVpbXAtbWQ1JztcblxuLyoqXG4gKiBUaGUgaW50ZW50IG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gZ2VuZXJhdGUgdGhlIHN1ZmZpeC9wb3N0Zml4IGZvciB0aGVcbiAqIGNzcyBjbGFzc2VzLCBiYXNlZCBvbiB0aGUgbW9kdWxlLXNjb3BlZCBwYXRoIG5hbWUuXG4gKlxuICogZm9yIGV4YW1wbGUsXG4gKiAgICBoYXNoKCdteS1hcHAvY29tcG9uZW50cy9mb28nKVxuICogIGluc3RlYWQgb2ZcbiAqICAgIGhhc2goJ2FwcC9jb21wb25lbnRzL2ZvbycpXG4gKlxuICogICh1bmxlc3MgeW91ciBhcHAgbmFtZSBpcyAnYXBwJylcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlUGF0aFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2gobW9kdWxlUGF0aCkge1xuICByZXR1cm4gJ2UnICsgbWQ1KG1vZHVsZVBhdGgpLnN1YnN0cmluZygwLCA4KTtcbn1cblxuXG5leHBvcnQgY29uc3QgaGFzaEZyb21Nb2R1bGVQYXRoID0gaGFzaDtcbiIsICJpbXBvcnQgcG9zdGNzcyBmcm9tICdwb3N0Y3NzJztcbmltcG9ydCBwYXJzZXIgZnJvbSAncG9zdGNzcy1zZWxlY3Rvci1wYXJzZXInO1xuXG5pbXBvcnQgaXNJbnNpZGVHbG9iYWwgZnJvbSAnLi9pc0luc2lkZUdsb2JhbC5qcyc7XG5cbmZ1bmN0aW9uIHJld3JpdGVTZWxlY3RvcihzZWwsIHBvc3RmaXgpIHtcbiAgY29uc3QgdHJhbnNmb3JtID0gKHNlbGVjdG9ycykgPT4ge1xuICAgIHNlbGVjdG9ycy53YWxrKChzZWxlY3RvcikgPT4ge1xuICAgICAgaWYgKHNlbGVjdG9yLnR5cGUgPT09ICdjbGFzcycgJiYgIWlzSW5zaWRlR2xvYmFsKHNlbGVjdG9yKSkge1xuICAgICAgICBzZWxlY3Rvci52YWx1ZSArPSAnXycgKyBwb3N0Zml4O1xuICAgICAgfSBlbHNlIGlmIChzZWxlY3Rvci50eXBlID09PSAndGFnJyAmJiAhaXNJbnNpZGVHbG9iYWwoc2VsZWN0b3IpKSB7XG4gICAgICAgIHNlbGVjdG9yLnJlcGxhY2VXaXRoKFxuICAgICAgICAgIHBhcnNlci50YWcoeyB2YWx1ZTogc2VsZWN0b3IudmFsdWUgfSksXG4gICAgICAgICAgcGFyc2VyLmNsYXNzTmFtZSh7IHZhbHVlOiBwb3N0Zml4IH0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gcmVtb3ZlIDpnbG9iYWxcbiAgICBzZWxlY3RvcnMud2Fsaygoc2VsZWN0b3IpID0+IHtcbiAgICAgIGlmIChzZWxlY3Rvci50eXBlID09PSAncHNldWRvJyAmJiBzZWxlY3Rvci52YWx1ZSA9PT0gJzpnbG9iYWwnKSB7XG4gICAgICAgIHNlbGVjdG9yLnJlcGxhY2VXaXRoKC4uLnNlbGVjdG9yLm5vZGVzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgdHJhbnNmb3JtZWQgPSBwYXJzZXIodHJhbnNmb3JtKS5wcm9jZXNzU3luYyhzZWwpO1xuXG4gIHJldHVybiB0cmFuc2Zvcm1lZDtcbn1cblxuZnVuY3Rpb24gaXNJbnNpZGVLZXlmcmFtZXMobm9kZSkge1xuICBjb25zdCBwYXJlbnQgPSBub2RlLnBhcmVudDtcblxuICBpZiAoIXBhcmVudCkgcmV0dXJuIGZhbHNlO1xuICBpZiAocGFyZW50LnR5cGUgPT09ICdhdHJ1bGUnICYmIHBhcmVudC5uYW1lID09PSAna2V5ZnJhbWVzJykgcmV0dXJuIHRydWU7XG5cbiAgcmV0dXJuIGlzSW5zaWRlS2V5ZnJhbWVzKHBhcmVudCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJld3JpdGVDc3MoY3NzLCBwb3N0Zml4LCBmaWxlTmFtZSwgbGF5ZXJOYW1lKSB7XG4gIGNvbnN0IGxheWVyTmFtZVdpdGhEZWZhdWx0ID0gbGF5ZXJOYW1lID8/ICdjb21wb25lbnRzJztcbiAgY29uc3QgYXN0ID0gcG9zdGNzcy5wYXJzZShjc3MpO1xuXG4gIGFzdC53YWxrKChub2RlKSA9PiB7XG4gICAgaWYgKG5vZGUudHlwZSA9PT0gJ3J1bGUnICYmICFpc0luc2lkZUtleWZyYW1lcyhub2RlKSkge1xuICAgICAgbm9kZS5zZWxlY3RvciA9IHJld3JpdGVTZWxlY3Rvcihub2RlLnNlbGVjdG9yLCBwb3N0Zml4KTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHJld3JpdHRlbkNzcyA9IGFzdC50b1N0cmluZygpO1xuXG4gIGlmICghbGF5ZXJOYW1lV2l0aERlZmF1bHQpIHtcbiAgICByZXR1cm4gYC8qICR7ZmlsZU5hbWV9ICovXFxuJHtyZXdyaXR0ZW5Dc3N9XFxuYDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgYC8qICR7ZmlsZU5hbWV9ICovXFxuQGxheWVyICR7bGF5ZXJOYW1lV2l0aERlZmF1bHR9IHtcXG5cXG5gICtcbiAgICByZXdyaXR0ZW5Dc3MgK1xuICAgICdcXG59XFxuJ1xuICApO1xufVxuXG4iLCAiaW1wb3J0IHJlY2FzdCBmcm9tICdlbWJlci10ZW1wbGF0ZS1yZWNhc3QnO1xuXG5pbXBvcnQgeyByZW5hbWVDbGFzcyB9IGZyb20gJy4vcmVuYW1lQ2xhc3MuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdGVtcGxhdGVQbHVnaW4oeyBjbGFzc2VzLCB0YWdzLCBwb3N0Zml4IH0pIHtcbiAgbGV0IHN0YWNrID0gW107XG4gIC8vIHNjb3BlZC1jbGFzcyBpcyBhIGdsb2JhbCB3ZSBhbGxvdyBpbiBoYnNcbiAgLy8gc2NvcGVkQ2xhc3MgaXMgaW1wb3J0YWJsZSwgYW5kIHdlJ2xsIGVycm9yIGlmIHNvbWVvbmUgdHJpZXMgdG8gcmVuYW1lIGl0XG4gIGxldCBzY29wZWRDbGFzc0NhbmRpZGF0ZXMgPSBbJ3Njb3BlZC1jbGFzcycsICdzY29wZWRDbGFzcyddO1xuXG4gIGZ1bmN0aW9uIGlzU2NvcGVkQ2xhc3Moc3RyKSB7XG4gICAgaWYgKCFzdHIpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBzY29wZWRDbGFzc0NhbmRpZGF0ZXMuc29tZSgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgPT09IHN0cik7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIEF0dHJOb2RlKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLm5hbWUgPT09ICdjbGFzcycpIHtcbiAgICAgICAgaWYgKG5vZGUudmFsdWUudHlwZSA9PT0gJ1RleHROb2RlJyAmJiBub2RlLnZhbHVlLmNoYXJzKSB7XG4gICAgICAgICAgY29uc3QgcmVuYW1lZENsYXNzID0gcmVuYW1lQ2xhc3Mobm9kZS52YWx1ZS5jaGFycywgcG9zdGZpeCwgY2xhc3Nlcyk7XG5cbiAgICAgICAgICBub2RlLnZhbHVlLmNoYXJzID0gcmVuYW1lZENsYXNzO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUudmFsdWUudHlwZSA9PT0gJ0NvbmNhdFN0YXRlbWVudCcpIHtcbiAgICAgICAgICBmb3IgKGxldCBwYXJ0IG9mIG5vZGUudmFsdWUucGFydHMpIHtcbiAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdUZXh0Tm9kZScgJiYgcGFydC5jaGFycykge1xuICAgICAgICAgICAgICBjb25zdCByZW5hbWVkQ2xhc3MgPSByZW5hbWVDbGFzcyhwYXJ0LmNoYXJzLCBwb3N0Zml4LCBjbGFzc2VzKTtcblxuICAgICAgICAgICAgICBwYXJ0LmNoYXJzID0gcmVuYW1lZENsYXNzO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09ICdNdXN0YWNoZVN0YXRlbWVudCcpIHtcbiAgICAgICAgICAgICAgcmVjYXN0LnRyYXZlcnNlKHBhcnQsIHtcbiAgICAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsKG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbmFtZWRDbGFzcyA9IHJlbmFtZUNsYXNzKFxuICAgICAgICAgICAgICAgICAgICBub2RlLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwb3N0Zml4LFxuICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLFxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgbm9kZS52YWx1ZSA9IHJlbmFtZWRDbGFzcztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgRWxlbWVudE5vZGUobm9kZSkge1xuICAgICAgaWYgKHRhZ3MuaGFzKG5vZGUudGFnKSkge1xuICAgICAgICAvLyBjaGVjayBpZiBjbGFzcyBhdHRyaWJ1dGUgYWxyZWFkeSBleGlzdHNcbiAgICAgICAgY29uc3QgY2xhc3NBdHRyID0gbm9kZS5hdHRyaWJ1dGVzLmZpbmQoKGF0dHIpID0+IGF0dHIubmFtZSA9PT0gJ2NsYXNzJyk7XG5cbiAgICAgICAgaWYgKGNsYXNzQXR0cikge1xuICAgICAgICAgIGNsYXNzQXR0ci52YWx1ZS5jaGFycyArPSAnICcgKyBwb3N0Zml4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHB1c2ggY2xhc3MgYXR0cmlidXRlXG4gICAgICAgICAgbm9kZS5hdHRyaWJ1dGVzLnB1c2goXG4gICAgICAgICAgICByZWNhc3QuYnVpbGRlcnMuYXR0cignY2xhc3MnLCByZWNhc3QuYnVpbGRlcnMudGV4dChwb3N0Zml4KSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBBbGw6IHtcbiAgICAgIGVudGVyKG5vZGUpIHtcbiAgICAgICAgc3RhY2sucHVzaChub2RlKTtcbiAgICAgIH0sXG4gICAgICBleGl0KCkge1xuICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIE11c3RhY2hlU3RhdGVtZW50KG5vZGUpIHtcbiAgICAgIGxldCBjc3NDbGFzcztcblxuICAgICAgaWYgKFxuICAgICAgICBpc1Njb3BlZENsYXNzKGdldFZhbHVlKG5vZGUucGF0aCkpICYmXG4gICAgICAgIG5vZGUucGFyYW1zPy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgbm9kZS5wYXJhbXNbMF0udHlwZSA9PT0gJ1N0cmluZ0xpdGVyYWwnXG4gICAgICApIHtcbiAgICAgICAgY3NzQ2xhc3MgPSBub2RlLnBhcmFtc1swXS52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBpc1Njb3BlZENsYXNzKGdldFZhbHVlKG5vZGUucGF0aD8ucGF0aCkpICYmXG4gICAgICAgIG5vZGUucGF0aD8ucGFyYW1zPy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgbm9kZS5wYXRoPy5wYXJhbXNbMF0udHlwZSA9PT0gJ1N0cmluZ0xpdGVyYWwnXG4gICAgICApIHtcbiAgICAgICAgY3NzQ2xhc3MgPSBub2RlLnBhdGgucGFyYW1zWzBdLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3NzQ2xhc3MpIHtcbiAgICAgICAgY29uc3QgdGV4dE5vZGUgPSByZWNhc3QuYnVpbGRlcnMudGV4dChyZW5hbWVDbGFzcyhjc3NDbGFzcywgcG9zdGZpeCkpO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcblxuICAgICAgICBpZiAocGFyZW50LnR5cGUgPT09ICdBdHRyTm9kZScpIHtcbiAgICAgICAgICBwYXJlbnQucXVvdGVUeXBlID0gJ1wiJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0ZXh0Tm9kZTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgU3ViRXhwcmVzc2lvbihub2RlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGlzU2NvcGVkQ2xhc3MoZ2V0VmFsdWUobm9kZS5wYXRoKSkgJiZcbiAgICAgICAgbm9kZS5wYXJhbXM/Lmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBub2RlLnBhcmFtc1swXS50eXBlID09PSAnU3RyaW5nTGl0ZXJhbCdcbiAgICAgICkge1xuICAgICAgICBjb25zdCBjc3NDbGFzcyA9IG5vZGUucGFyYW1zWzBdLnZhbHVlO1xuICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IHJlY2FzdC5idWlsZGVycy5saXRlcmFsKFxuICAgICAgICAgICdTdHJpbmdMaXRlcmFsJyxcbiAgICAgICAgICByZW5hbWVDbGFzcyhjc3NDbGFzcywgcG9zdGZpeCksXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHRleHROb2RlO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlKHBhdGgpIHtcbiAgaWYgKCFwYXRoKSByZXR1cm47XG5cbiAgaWYgKCd2YWx1ZScgaW4gcGF0aCkge1xuICAgIHJldHVybiBwYXRoLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcHJlY2F0ZWQgaW4gZW1iZXIgNS45K1xuICAgKiAoc28gd2UgdXNlIHRoZSBhYm92ZSBmb3IgbmV3ZXIgZW1iZXJzKVxuICAgKi9cbiAgcmV0dXJuIHBhdGgub3JpZ2luYWw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJld3JpdGVIYnMoaGJzLCBjbGFzc2VzLCB0YWdzLCBwb3N0Zml4KSB7XG4gIGxldCBhc3QgPSByZWNhc3QucGFyc2UoaGJzKTtcblxuICByZWNhc3QudHJhdmVyc2UoYXN0LCB0ZW1wbGF0ZVBsdWdpbih7IGNsYXNzZXMsIHRhZ3MsIHBvc3RmaXggfSkpO1xuXG4gIGxldCByZXN1bHQgPSByZWNhc3QucHJpbnQoYXN0KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwgIi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwb3N0Zml4XG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBbY2xhc3Nlc0luQ3NzXVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmFtZUNsYXNzKGNsYXNzTmFtZSwgcG9zdGZpeCwgY2xhc3Nlc0luQ3NzKSB7XG4gIGNvbnN0IGNsYXNzZXMgPSBjbGFzc05hbWUuc3BsaXQoL1xccysvKTtcbiAgY29uc3QgcmVuYW1lZENsYXNzZXMgPSBjbGFzc2VzXG4gICAgLmZpbHRlcigoYykgPT4gYylcbiAgICAubWFwKChjKSA9PiBjLnRyaW0oKSlcbiAgICAubWFwKChjKSA9PiB7XG4gICAgICBpZiAoIWNsYXNzZXNJbkNzcyB8fCBjbGFzc2VzSW5Dc3MuaGFzKGMpKSB7XG4gICAgICAgIGlmIChjLmVuZHNXaXRoKHBvc3RmaXgpKSByZXR1cm4gYztcblxuICAgICAgICByZXR1cm4gYyArICdfJyArIHBvc3RmaXg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjO1xuICAgIH0pXG4gICAgLmpvaW4oJyAnKTtcblxuICBjb25zdCByZW5hbWVkV2l0aFByZXNlcnZlZFNwYWNlcyA9IGNsYXNzTmFtZS5yZXBsYWNlKFxuICAgIGNsYXNzTmFtZS50cmltU3RhcnQoKS50cmltRW5kKCksXG4gICAgcmVuYW1lZENsYXNzZXMsXG4gICk7XG5cbiAgcmV0dXJuIHJlbmFtZWRXaXRoUHJlc2VydmVkU3BhY2VzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBLHFCQUEyQjtBQUMzQixzQkFBb0M7QUFDcEMsSUFBQUEsb0JBQWlCO0FBRWpCLDZCQUFtQjtBQUNuQiw2QkFBdUI7QUFDdkIsa0NBQXVCO0FBQ3ZCLHdDQUFtQjtBQUNuQix5QkFBNkI7OztBQ1Y3QixxQkFBb0I7QUFDcEIscUNBQW1COzs7QUNESixTQUFSLGVBQWdDLE1BQU0sTUFBTTtBQUNqRCxRQUFNLFNBQVMsS0FBSztBQUVwQixNQUFJLENBQUMsT0FBUSxRQUFPO0FBQ3BCLE1BQUksT0FBTyxTQUFTLFlBQVksT0FBTyxVQUFVLFVBQVcsUUFBTztBQUVuRSxTQUFPLGVBQWUsUUFBUSxJQUFJO0FBQ3BDOzs7QURGQSxTQUFTLGtCQUFrQixLQUFLLFNBQVMsTUFBTTtBQUM3QyxRQUFNLFlBQVksQ0FBQyxRQUFRO0FBQ3pCLFFBQUksS0FBSyxDQUFDLGFBQWE7QUFDckIsVUFBSSxTQUFTLFNBQVMsV0FBVyxDQUFDLGVBQWUsUUFBUSxHQUFHO0FBQzFELGdCQUFRLElB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QUFDO0FBQUEsSUFDSCxDQUFDO0FBRUQsVUFBTSxTQUFTLElBQUksOEJBQU8sV0FBVztBQUFBLE1BQ25DLFNBQVMsQ0FBQyxLQUFLLFVBQVUsaUJBQWlCO0FBQUEsSUFDNUMsQ0FBQztBQUVELFFBQUksZUFBZSxJQUFJLDRCQUFBQTtBQUFBLE1BQ3JCLENBQUMsUUFBUSxrQkFBa0IsZUFBZTtBQUFBLE1BQzFDLEVBQUUsV0FBVyxLQUFLO0FBQUEsSUFDcEI7QUFFQSxRQUFJLFlBQVksSUFBSSx1QkFBQUMsUUFBTyxjQUFjO0FBQUEsTUFDdkMsWUFBWSxRQUFRLFlBQVksS0FBSztBQUFBLE1BQ3JDLFdBQVc7QUFBQSxNQUNYLGlCQUFpQixFQUFFLFNBQVMsS0FBSztBQUFBLElBQ25DLENBQUM7QUFFRCxRQUFJLEtBQUssYUFBYSxhQUFhO0FBQ2pDLFVBQUksZ0JBQWdCLElBQUksOEJBQU8sY0FBYztBQUFBLFFBQzNDLFNBQVMsS0FBSyxZQUFZO0FBQUEsUUFDMUIsU0FBUyxLQUFLLFlBQVk7QUFBQSxNQUM1QixDQUFDO0FBRUQsYUFBTyxJQUFJLDRCQUFBRCxRQUFXLENBQUMsZUFBZSxTQUFTLEdBQUcsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUFBLElBQ3ZFLE9BQU87QUFDTCxhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFsiaW1wb3J0X25vZGVfcGF0aCIsICJwYXJzZXIiLCAicG9zdGNzcyIsICJtZDUiLCAicGF0aCIsICJpbXBvcnRfcG9zdGNzcyIsICJpbXBvcnRfcG9zdGNzc19zZWxlY3Rvcl9wYXJzZXIiLCAicGFyc2VyIiwgInBvc3Rjc3MiLCAicmVjYXN0IiwgIm5vZGUiLCAicGF0aCIsICJGaWx0ZXIiLCAicGF0aCIsICJoYXNoIiwgInJlc3VsdHMiLCAicCIsICJNZXJnZVRyZWVzIiwgIkNvbmNhdCJdCn0K