gridviz 3.0.22 → 3.0.23

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.
package/dist/gridviz.js CHANGED
@@ -10857,7 +10857,7 @@ class ColorDiscreteLegend extends _core_Legend_js__WEBPACK_IMPORTED_MODULE_0__.L
10857
10857
  for (let i = 1; i < nb; i++) {
10858
10858
  let label = breaks[i - 1]
10859
10859
  if (isNaN(label) || label == undefined) continue
10860
- if (this.labelFormat) label = this.labelFormat(label)
10860
+ if (this.labelFormat) label = this.labelFormat(label, i)
10861
10861
 
10862
10862
  //label
10863
10863
  svg.append('text')
@@ -16254,4 +16254,4 @@ const getParameterByName = _core_GeoCanvas_js__WEBPACK_IMPORTED_MODULE_1__.GeoCa
16254
16254
  /******/ })()
16255
16255
  ;
16256
16256
  });
16257
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUF5QixJQUFJO0FBQzdCLHdDQUF3QyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUk7QUFDMUQsd0NBQXdDLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUMxRCwwQ0FBMEMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUNuRSwwQ0FBMEMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUNuRSx3Q0FBd0MsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJO0FBQzFELDBDQUEwQyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJOztBQUVuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0RBQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzREFBTSxXQUFXLGtEQUFNO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQSxhQUFhLFlBQVksRUFBRSxZQUFZLEVBQUUsWUFBWTtBQUNyRDs7QUFFQTtBQUNBLGFBQWEsWUFBWSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsb0RBQW9EO0FBQzNHOztBQUVBO0FBQ0E7QUFDQSxZQUFZLDJCQUEyQixFQUFFLGVBQWUsSUFBSSxlQUFlLElBQUksZUFBZSxFQUFFLHFCQUFxQixFQUFFLEdBQUc7QUFDMUg7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNEQUFNLFdBQVcsa0RBQU07QUFDdkI7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsY0FBYywyQkFBMkIsRUFBRSxlQUFlLElBQUkscUJBQXFCLEtBQUsscUJBQXFCLEdBQUcscUJBQXFCLEVBQUUsR0FBRztBQUMxSTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDM1lBLDZCQUFlLG9DQUFTO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1QyQztBQUNPO0FBQ1A7O0FBRTNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsMENBQUcsT0FBTyxxREFBVTtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTs7QUFFZTtBQUNmO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNEQUFNLFdBQVcsa0RBQU0sQ0FBQyw0Q0FBSztBQUM3QjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLDBDQUFHO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLDZDQUFPO0FBQ3hDO0FBQ0E7O0FBRU87QUFDUDtBQUNBOztBQUVPO0FBQ1A7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdCQUFnQiw2Q0FBTztBQUN2QjtBQUNBOztBQUVBLHNEQUFNLFdBQVcsa0RBQU0sQ0FBQyw0Q0FBSztBQUM3QjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQzFITTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNEUCxZQUFZOztBQUVaO0FBQ0EsOENBQThDLEtBQUssT0FBTztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLG1GQUFtRixPQUFPO0FBQzFGO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQsR0FBRztBQUNIO0FBQ0E7QUFDQSxvREFBb0QsT0FBTztBQUMzRDtBQUNBOztBQUVBO0FBQ0Esc0NBQXNDLE9BQU87QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1DQUFtQyxPQUFPO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsNEJBQTRCO0FBQy9EO0FBQ0E7O0FBRUEsaUVBQWUsUUFBUSxFQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuRlk7QUFDb0I7O0FBRXhELDZCQUFlLG9DQUFTO0FBQ3hCO0FBQ0Esa0JBQWtCLHdEQUFNLDRCQUE0QixtREFBTyxFQUFFLDBEQUFpQjtBQUM5RTtBQUNBLHFDQUFxQyxtREFBTyxFQUFFLDBEQUFpQjtBQUMvRCxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBLGtCQUFrQix3REFBTTtBQUN4QjtBQUNBLCtCQUErQixtREFBTyxFQUFFLDBEQUFpQjtBQUN6RCw0QkFBNEIsbUNBQW1DO0FBQy9EO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDM0JBO0FBQ0E7QUFDTyxvQkFBb0I7QUFDcEIsMkJBQTJCOztBQUUzQjtBQUNQO0FBQ0E7O0FBRUEsNkJBQWUsb0NBQVM7QUFDeEI7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWjJCOztBQUUzQixVQUFVLG1EQUFHOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNWUCxZQUFZO0FBQ1osWUFBWTtBQUNaO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBLEdBQUcsZ0JBQWdCO0FBQ25COztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQWUsb0NBQVM7QUFDeEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7O0FBRXJCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLFlBQVk7QUFDN0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsWUFBWTtBQUM3QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ25LMkI7O0FBRTNCLFVBQVUsbURBQUc7O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7QUFDUDtBQUNBOztBQUVPO0FBQ1A7QUFDQTs7QUFFTztBQUNQO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1ZxRDtBQUN4Qjs7QUFFN0I7QUFDQTtBQUNBO0FBQ0EsV0FBVyxvREFBSTtBQUNmO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRWU7QUFDZjtBQUNBLGVBQWUsa0RBQVM7QUFDeEIsU0FBUyxvREFBSTtBQUNiO0FBQ0EsR0FBRztBQUNIOztBQUVPLG1CQUFtQiw0Q0FBUTtBQUMzQixtQkFBbUIsNENBQVE7Ozs7Ozs7Ozs7Ozs7OztBQ3JCbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBZSxvQ0FBUztBQUN4QjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBZSxvQ0FBUztBQUN4QjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNQdUM7O0FBRXZDO0FBQ087QUFDQTs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRWM7QUFDZixXQUFXLHNEQUFZO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDakJzRDs7QUFFdEQsNkJBQWUsb0NBQVM7QUFDeEIsYUFBYSxxRUFBa0I7QUFDL0I7Ozs7Ozs7Ozs7Ozs7Ozs7QUNKQSw2QkFBZSxvQ0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDTztBQUNQLGdHQUFnRztBQUNoRzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDbkJBLDZCQUFlLG9DQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNqQkEsNkJBQWUsb0NBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTnNEOztBQUUvQzs7QUFFUCw2QkFBZSxvQ0FBUztBQUN4QixVQUFVLHFFQUFrQjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLHFFQUFrQixnQ0FBZ0M7QUFDOUY7Ozs7Ozs7Ozs7Ozs7Ozs7QUNmc0Q7O0FBRXRELDZCQUFlLG9DQUFTO0FBQ3hCLFVBQVUscUVBQWtCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7QUFDQTs7QUFFZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBLHVEQUF1RDs7QUFFaEQ7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDOUNBO0FBQ0EsNkJBQWUsb0NBQVM7QUFDeEIsa0RBQWtELE9BQU87QUFDekQ7QUFDQSw2QkFBNkI7QUFDN0Isc0NBQXNDLFFBQVE7QUFDOUMsc0NBQXNDLG9CQUFvQjtBQUMxRDtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVitDO0FBQ007QUFDTjs7QUFFL0MsaUVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSxPQUFPLHlEQUFhO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLDZEQUFhO0FBQzlCLE9BQU8seURBQWE7QUFDcEIsT0FBTyw0REFBZ0I7QUFDdkI7QUFDQTtBQUNBLENBQUMsRUFBQzs7Ozs7Ozs7Ozs7Ozs7O0FDbEJGLDZCQUFlLG9DQUFTO0FBQ3hCO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDRnFDO0FBQ007QUFDTTtBQUNFO0FBQ1Y7QUFDRTtBQUNVO0FBQ2hCOztBQUVyQztBQUNBOztBQUVBLDZCQUFlLG9DQUFTO0FBQ3hCLGdGQUFnRixvREFBUSxHQUFHLDJEQUFXO0FBQ3RHO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxvREFBUSxHQUFHLDhEQUFjO0FBQzFFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdCQUFnQiwrREFBZTs7QUFFL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGNBQWMsdURBQVc7O0FBRXpCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHVEQUFXO0FBQ2hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEIsMERBQVU7O0FBRXBDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1EQUFtRCxnRUFBYzs7QUFFakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUVBQXVFO0FBQ3ZFLHVFQUF1RTtBQUN2RSxzSUFBc0k7QUFDdEksc0VBQXNFO0FBQ3RFOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxtQ0FBbUMsK0RBQWU7QUFDbEQsZ0RBQWdELHdEQUFRO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDbkpPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDZCQUFlLG9DQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDbEJpQzs7QUFFakMsNkJBQWUsb0NBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGdEQUFLO0FBQ2hCO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1pxQzs7QUFFckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQSxrRkFBa0Ysd0RBQVE7QUFDMUY7O0FBRU87QUFDUDtBQUNBLDBDQUEwQyx3REFBUTtBQUNsRDtBQUNBOztBQUVlO0FBQ2Y7QUFDQSw0QkFBNEIsd0RBQVE7QUFDcEM7Ozs7Ozs7Ozs7Ozs7OztBQzVCQSxpRUFBZSxZQUFZLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQWE7QUFDVjs7QUFFaEI7QUFDZixVQUFVLHFEQUFLLFVBQVUsb0RBQVEsbUJBQW1CLG9EQUFRO0FBQzVELFVBQVUscURBQUs7QUFDZixVQUFVLHFEQUFLO0FBQ2YsZ0JBQWdCLHFEQUFLO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQ2ZBLDZCQUFlLG9DQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNKeUM7QUFDVjtBQUNZO0FBQ0Q7O0FBRTFDLGlFQUFlO0FBQ2YsY0FBYyxnREFBSzs7QUFFbkI7QUFDQSwyQkFBMkIsNkNBQVEsbUJBQW1CLDZDQUFRO0FBQzlEO0FBQ0E7QUFDQSxrQkFBa0IscURBQU87QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLENBQUMsSUFBSSxFQUFDOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLE9BQU87QUFDdkIsY0FBYyw2Q0FBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTyx5QkFBeUIsaURBQUs7QUFDOUIsK0JBQStCLHVEQUFXOzs7Ozs7Ozs7Ozs7Ozs7O0FDdERoQjs7QUFFakM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQWUsb0NBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYzs7QUFFZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDLDRCQUE0QjtBQUM1QjtBQUNBLE1BQU0sT0FBTztBQUNiO0FBQ0EsY0FBYyxTQUFTLHNEQUFNLFNBQVM7QUFDdEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixPQUFPO0FBQ3BDO0FBQ0EsU0FBUztBQUNUOzs7Ozs7Ozs7Ozs7Ozs7O0FDL0RBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQWUsb0NBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDekJrQztBQUNZOztBQUU5Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYyxhQUFhLHNEQUFNLFNBQVMsR0FBRyxhQUFhLHNEQUFNLFNBQVM7QUFDekUsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUNBQWlDLGdDQUFnQztBQUNqRSxjQUFjLHNEQUFzRCxzREFBTSxPQUFPO0FBQ2pGLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWMscURBQXFELHNEQUFNLE9BQU87QUFDaEYsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGFBQWEsc0RBQU0sU0FBUyxHQUFHLGFBQWEsc0RBQU0sU0FBUztBQUN6RSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTyxtREFBbUQsK0NBQVE7QUFDM0QsbURBQW1ELCtDQUFROzs7Ozs7Ozs7Ozs7Ozs7OztBQzlEZjs7QUFFbkQ7O0FBRUE7QUFDTztBQUNQO0FBQ0Esd0JBQXdCLG1EQUFRLEdBQUcseURBQVM7QUFDNUM7O0FBRU87QUFDUCw0QkFBNEIsbURBQVE7QUFDcEM7QUFDQTtBQUNBLGlFQUFpRSxtREFBUTtBQUN6RTtBQUNBLFNBQVMseURBQVM7QUFDbEI7Ozs7Ozs7Ozs7Ozs7OztBQ2pCQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxpRUFBZTs7QUFFZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDLG1CQUFtQixFQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUN0RXJCLGlFQUFlLFdBQVcsRUFBQzs7Ozs7Ozs7Ozs7Ozs7OztBQ0FvQjs7QUFFL0MsaUVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxDQUFDLEVBQUUseURBQWEsQ0FBQyxFQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FDM0JYO0FBQ1A7QUFDQTtBQUNBLGdDQUFnQztBQUNoQywrQ0FBK0M7QUFDL0M7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6QndFO0FBQ3BDOztBQUVyQjtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3Qyx3REFBUztBQUNqRDtBQUNBOztBQUVBO0FBQ0Esd0RBQXdELG9EQUFNO0FBQzlEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGdEQUFTO0FBQ3pCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsK0NBQVM7QUFDbEI7Ozs7Ozs7Ozs7Ozs7OztBQ3hEQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNlO0FBQ2Y7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDUkEsNkJBQWUsb0NBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDSnVDO0FBQ0Q7O0FBRXRDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGlEQUFLLDhDQUE4QyxpREFBSztBQUMzRTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDZCQUFlLG9DQUFTO0FBQ3hCLGlCQUFpQix5REFBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3hCQSw2QkFBZSxvQ0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ1Z5Qzs7QUFFekMsNkJBQWUsb0NBQVM7QUFDeEI7QUFDQTtBQUNBLFNBQVMsc0RBQVUsMkJBQTJCLE9BQU8sc0RBQVUsdUJBQXVCLFFBQVE7QUFDOUY7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOTzs7QUFFUCxpRUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUNSeUM7O0FBRTNDLDZCQUFlLG9DQUFTO0FBQ3hCLFVBQVUsMkRBQVc7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuQnFEOztBQUVyRCw2QkFBZSxvQ0FBUztBQUN4QjtBQUNBLFlBQVksMERBQVM7QUFDckIsWUFBWSwwREFBUyxlQUFlLHFEQUFJO0FBQ3hDOzs7Ozs7Ozs7Ozs7Ozs7O0FDTm9DOztBQUVwQyw2QkFBZSxvQ0FBUztBQUN4QixtREFBbUQsdURBQU87QUFDMUQ7QUFDQTtBQUNBLEdBQUc7QUFDSDs7Ozs7Ozs7Ozs7Ozs7OztBQ1B3Qzs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBZSxvQ0FBUztBQUN4QixpQkFBaUIseURBQVM7O0FBRTFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUN4REEsNkJBQWUsc0NBQVc7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQWUsb0NBQVM7QUFDeEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUMxRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQWUsb0NBQVM7QUFDeEI7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWnFDO0FBQ0E7QUFDQzs7QUFFdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLGdCQUFnQjtBQUN6QjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04scUJBQXFCLGdEQUFTO0FBQzlCO0FBQ0E7O0FBRUE7QUFDQSxTQUFTLGlCQUFpQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWMsaUJBQWlCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsZ0JBQWdCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04scUJBQXFCLGdEQUFTO0FBQzlCO0FBQ0E7O0FBRUE7QUFDQSxjQUFjLGlCQUFpQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBZSxvQ0FBUztBQUN4Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsMkNBQTJDLHdEQUFROztBQUVuRCx1R0FBdUcsT0FBTztBQUM5RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxpQkFBaUI7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZUFBZSxnREFBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4Qjs7Ozs7Ozs7Ozs7Ozs7O0FDL0hBLDZCQUFlLG9DQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDSnVDOztBQUV2QztBQUNBLGVBQWUsc0RBQVc7QUFDMUI7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBZSxvQ0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDakNBLDZCQUFlLG9DQUFTOztBQUV4Qiw0REFBNEQsT0FBTztBQUNuRSwrREFBK0QsT0FBTztBQUN0RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDVEEsNkJBQWUsc0NBQVc7QUFDMUI7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDRmlDO0FBQ0k7O0FBRXJDLDZCQUFlLHNDQUFXO0FBQzFCLGFBQWEsZ0RBQVMsaUNBQWlDLGtEQUFNO0FBQzdEOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQ0FBaUMsc0RBQXNEO0FBQ3ZGLHdDQUF3QyxnREFBZ0Q7QUFDeEYsc0NBQXNDLDhDQUE4QztBQUNwRix5Q0FBeUM7QUFDekM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckJpQztBQUNJOztBQUVyQyw2QkFBZSxzQ0FBVztBQUMxQixhQUFhLGdEQUFTLGdDQUFnQyxrREFBTTtBQUM1RDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNMcUM7QUFDRDs7QUFFcEMsNkJBQWUsb0NBQVM7QUFDeEIsMkNBQTJDLHVEQUFPOztBQUVsRCxzRkFBc0YsT0FBTztBQUM3Riw2RkFBNkYsT0FBTztBQUNwRztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGFBQWEsZ0RBQVM7QUFDdEI7Ozs7Ozs7Ozs7Ozs7OztBQ2ZBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBZSxvQ0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeEIyQztBQUNNO0FBQ0k7QUFDTTtBQUNoQjtBQUNKO0FBQ0U7QUFDRjtBQUNBO0FBQ0U7QUFDQTtBQUNGO0FBQ0E7QUFDRTtBQUNGO0FBQ0E7QUFDRTtBQUNGO0FBQ0E7QUFDRTtBQUNNO0FBQ0Y7QUFDTjtBQUNBO0FBQ0U7QUFDQTtBQUNFO0FBQ0E7QUFDQTtBQUNGO0FBQ0E7QUFDTjtBQUNZO0FBQ0E7O0FBRXhDOztBQUVBO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVUsa0RBQWdCO0FBQzFCLGFBQWEscURBQW1CO0FBQ2hDLGVBQWUsdURBQXFCO0FBQ3BDLGtCQUFrQiwwREFBd0I7QUFDMUMsVUFBVSxrREFBZ0I7QUFDMUIsUUFBUSxnREFBYztBQUN0QixTQUFTLGlEQUFlO0FBQ3hCLFFBQVEsZ0RBQWM7QUFDdEIsUUFBUSxnREFBYztBQUN0QixTQUFTLGlEQUFlO0FBQ3hCO0FBQ0EsU0FBUyxrREFBZTtBQUN4QixRQUFRLGlEQUFjO0FBQ3RCLFFBQVEsaURBQWM7QUFDdEIsU0FBUyxrREFBZTtBQUN4QixRQUFRLGlEQUFjO0FBQ3RCLFFBQVEsaURBQWM7QUFDdEIsU0FBUyxrREFBZTtBQUN4QixRQUFRLGlEQUFjO0FBQ3RCLFFBQVEsaURBQWM7QUFDdEIsU0FBUyxrREFBZTtBQUN4QixZQUFZLHFEQUFrQjtBQUM5QixXQUFXLG9EQUFpQjtBQUM1QixRQUFRLGlEQUFjO0FBQ3RCLFFBQVEsaURBQWM7QUFDdEIsU0FBUyxrREFBZTtBQUN4QixTQUFTLGtEQUFlO0FBQ3hCLFVBQVUsbURBQWdCO0FBQzFCLFVBQVUsbURBQWdCO0FBQzFCLFVBQVUsbURBQWdCO0FBQzFCLFNBQVMsa0RBQWU7QUFDeEIsU0FBUyxrREFBZTtBQUN4QixNQUFNLCtDQUFZO0FBQ2xCLFlBQVkscURBQWtCO0FBQzlCLHFCQUFxQixxREFBa0I7QUFDdkM7O0FBRUEsaUVBQWUsU0FBUyxFQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3pGVztBQUNFOztBQUV0QztBQUNBO0FBQ0E7O0FBRUEsNkJBQWUsb0NBQVM7QUFDeEIsbURBQW1ELHVEQUFPO0FBQzFELHVGQUF1Rix3REFBUTtBQUMvRjtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7Ozs7Ozs7Ozs7Ozs7QUNiQSw2QkFBZSx1Q0FBWTtBQUMzQiw0REFBNEQsT0FBTztBQUNuRSwrREFBK0QsT0FBTztBQUN0RTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDTkEsNkJBQWUsb0NBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQ2RBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBZSxzQ0FBVztBQUMxQjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDTnFDOztBQUVyQyw2QkFBZSxvQ0FBUztBQUN4Qjs7QUFFQSwrSkFBK0osT0FBTztBQUN0Syx5SEFBeUgsT0FBTztBQUNoSTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsUUFBUTtBQUNqQjtBQUNBOztBQUVBLGFBQWEsZ0RBQVM7QUFDdEI7Ozs7Ozs7Ozs7Ozs7OztBQ2xCQSw2QkFBZSxzQ0FBVzs7QUFFMUIsNERBQTRELE9BQU87QUFDbkUseURBQXlELE9BQU87QUFDaEU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDVkEsNkJBQWUsc0NBQVc7QUFDMUI7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWixHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsT0FBTztBQUNyRDtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxPQUFPO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQWUsb0NBQVM7QUFDeEI7O0FBRUE7QUFDQTtBQUNBLDhDQUE4QyxPQUFPO0FBQ3JELDZCQUE2QixPQUFPO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsY0FBYyxPQUFPO0FBQ3JCO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQ2xFQSw2QkFBZSxzQ0FBVzs7QUFFMUIsNkRBQTZELFFBQVE7QUFDckUsNkVBQTZFLFNBQVM7QUFDdEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBZSxvQ0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDM0JBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBZSxzQ0FBVztBQUMxQjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBZSxzQ0FBVztBQUMxQjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ1BxQztBQUNDOztBQUV0Qyw2QkFBZSxvQ0FBUztBQUN4Qiw2Q0FBNkMsd0RBQVE7O0FBRXJELHNGQUFzRixPQUFPO0FBQzdGLGdIQUFnSCxPQUFPO0FBQ3ZIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxhQUFhLGdEQUFTO0FBQ3RCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoQnFDO0FBQ0w7QUFDWTs7QUFFNUM7QUFDQTtBQUNBLFdBQVcscURBQUs7QUFDaEI7QUFDQTs7QUFFQSw2QkFBZSxvQ0FBUztBQUN4QjtBQUNBLGdCQUFnQiwyREFBVzs7QUFFM0IsMEZBQTBGLE9BQU87QUFDakcsK0RBQStELE9BQU87QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGFBQWEsZ0RBQVM7QUFDdEI7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4QjJDOztBQUUzQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBZSxvQ0FBUztBQUN4QjtBQUNBLHdEQUF3RCx5REFBWTtBQUNwRTs7Ozs7Ozs7Ozs7Ozs7OztBQ2pCMkM7O0FBRTNDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDZCQUFlLG9DQUFTO0FBQ3hCO0FBQ0EsNkRBQTZELHlEQUFZO0FBQ3pFOzs7Ozs7Ozs7Ozs7Ozs7QUNqQkEsNkJBQWUsc0NBQVc7QUFDMUI7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ0pxQzs7QUFFckMsNkJBQWUsb0NBQVM7QUFDeEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVGQUF1RixPQUFPO0FBQzlGLHlHQUF5RyxPQUFPO0FBQ2hIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxhQUFhLGdEQUFTO0FBQ3RCOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDdkJBLDZCQUFlLG9DQUFTO0FBQ3hCO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDRnVDOztBQUV2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQWUsb0NBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBLFNBQVMsc0RBQVc7QUFDcEI7Ozs7Ozs7Ozs7Ozs7OztBQ2xDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQWUsb0NBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQ3hCQTs7QUFFQSw2QkFBZSxvQ0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBOztBQUVBLDZCQUFlLG9DQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNSQSw2QkFBZSxvQ0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDSkEsNkJBQWUsb0NBQVM7QUFDeEI7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjs7Ozs7Ozs7Ozs7Ozs7OztBQ0ppQzs7QUFFakMsNkJBQWUsb0NBQVM7QUFDeEIsY0FBYyw0Q0FBSztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNJQUFzSTs7QUFFL0g7QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQLFNBQVM7QUFDVCxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN0dpRDtBQUNFOztBQUVuRDs7QUFFQSw2QkFBZSxvQ0FBUztBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLDhEQUFTO0FBQ3JELG1CQUFtQiw0REFBVTtBQUM3QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDcEI4QjtBQUM4QjtBQUNkO0FBQ007Ozs7Ozs7Ozs7Ozs7Ozs7QUNIYTs7QUFFakUsNkJBQWUsb0NBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBLG1EQUFtRCxlQUFlO0FBQ2xFLDhCQUE4Qiw2REFBUSxxQkFBcUIsMkRBQU07QUFDakUscUJBQXFCLDBEQUFLO0FBQzFCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQ3ZCdUM7QUFDVTtBQUNFOztBQUVuRCxvREFBUyx1QkFBdUIscURBQW1CO0FBQ25ELG9EQUFTLHdCQUF3QixzREFBb0I7Ozs7Ozs7Ozs7Ozs7Ozs7QUNMYjs7QUFFeEMsNkJBQWUsb0NBQVM7QUFDeEI7QUFDQSxJQUFJLHlEQUFTO0FBQ2IsR0FBRztBQUNIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTnlEO0FBQ1I7QUFDVjtBQUNWOztBQUU3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsK0NBQWM7QUFDdEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBZSxvQ0FBUztBQUN4QjtBQUNBOztBQUVBLHNCQUFzQiw0REFBVTtBQUNoQztBQUNBLElBQUk7QUFDSixTQUFTLDJEQUFLLG9DQUFvQyw2Q0FBRztBQUNyRDs7QUFFQSw0REFBNEQsT0FBTztBQUNuRSwrREFBK0QsT0FBTztBQUN0RTtBQUNBLFFBQVEsbUVBQVE7QUFDaEI7QUFDQTtBQUNBOztBQUVBLGFBQWEsNERBQVU7QUFDdkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6QytFO0FBQ3hDO0FBQ0Q7QUFDSzs7QUFFM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQWUsb0NBQVM7QUFDeEIsaUJBQWlCLHdEQUFTLHVDQUF1QyxtRUFBb0IsR0FBRyx1REFBVztBQUNuRztBQUNBLHNFQUFzRSxxREFBVTtBQUNoRjtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3RXVDOztBQUV2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQWUsb0NBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsd0RBQVM7QUFDMUI7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQzNDd0M7O0FBRXhDO0FBQ0E7QUFDQSxJQUFJLGtEQUFJO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSSxrREFBSTtBQUNSO0FBQ0E7O0FBRUEsNkJBQWUsb0NBQVM7QUFDeEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGlEQUFHO0FBQ1g7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0QnVDOztBQUV2QztBQUNBO0FBQ0EsSUFBSSxpREFBRztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUksaURBQUc7QUFDUDtBQUNBOztBQUVBLDZCQUFlLG9DQUFTO0FBQ3hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxpREFBRztBQUNYOzs7Ozs7Ozs7Ozs7Ozs7O0FDdEJ1Qzs7QUFFdkM7QUFDQTtBQUNBO0FBQ0EsSUFBSSxpREFBRztBQUNQO0FBQ0E7O0FBRUEsNkJBQWUsb0NBQVM7QUFDeEI7O0FBRUE7QUFDQTtBQUNBLFFBQVEsaURBQUc7QUFDWDs7Ozs7Ozs7Ozs7Ozs7OztBQ2ZrQzs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGlEQUFHO0FBQ1A7QUFDQTs7QUFFQSw2QkFBZSxvQ0FBUztBQUN4QjtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNia0M7O0FBRWxDLDZCQUFlLHNDQUFXO0FBQzFCO0FBQ0E7QUFDQSxrQkFBa0IsY0FBYztBQUNoQyxlQUFlLG9CQUFvQjs7QUFFbkM7QUFDQSxxQkFBcUIsaURBQUc7QUFDeEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7Ozs7Ozs7Ozs7Ozs7OztBQzVCcUM7QUFDQzs7QUFFdEMsNkJBQWUsb0NBQVM7QUFDeEIsMkNBQTJDLHdEQUFPOztBQUVsRCxzRkFBc0YsT0FBTztBQUM3Riw2RkFBNkYsT0FBTztBQUNwRztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGFBQWEsaURBQVU7QUFDdkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDZnVDO0FBQ0M7QUFDVTtBQUNSO0FBQ007QUFDUjtBQUNjO0FBQ1Y7QUFDRjtBQUNOO0FBQ1E7QUFDQTtBQUNNO0FBQ0E7QUFDUjtBQUNVO0FBQ1o7QUFDVTtBQUNFO0FBQ1Y7QUFDSjs7QUFFdEM7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVlO0FBQ2YsU0FBUyx3REFBUztBQUNsQjs7QUFFTztBQUNQO0FBQ0E7O0FBRUEsMEJBQTBCLG9EQUFTOztBQUVuQztBQUNBO0FBQ0EsVUFBVSxrREFBaUI7QUFDM0IsYUFBYSxxREFBb0I7QUFDakM7QUFDQTtBQUNBLFVBQVUsa0RBQWlCO0FBQzNCLFNBQVMsaURBQWdCO0FBQ3pCLGFBQWEscURBQW9CO0FBQ2pDLGNBQWMsc0RBQXFCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sOENBQWE7QUFDbkIsUUFBUSxnREFBZTtBQUN2QixhQUFhLHFEQUFvQjtBQUNqQyxTQUFTLGtEQUFnQjtBQUN6QixjQUFjLHVEQUFxQjtBQUNuQyxRQUFRLGlEQUFlO0FBQ3ZCLGFBQWEsc0RBQW9CO0FBQ2pDLFVBQVUsbURBQWlCO0FBQzNCLFNBQVMsa0RBQWdCO0FBQ3pCLFNBQVMsa0RBQWdCO0FBQ3pCLFlBQVkscURBQW1CO0FBQy9CLFFBQVEsaURBQWU7QUFDdkIsZUFBZSx3REFBc0I7QUFDckMsT0FBTyxnREFBYztBQUNyQjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeEUrQjtBQUNxRDs7QUFFcEYsNkJBQWUsb0NBQVM7QUFDeEI7QUFDQSxrQ0FBa0Msc0RBQWlCO0FBQ25ELHFCQUFxQixnREFBSyxHQUFHLHNEQUFjO0FBQzNDLGFBQWEsb0RBQUssZUFBZSxzREFBYztBQUMvQyxRQUFRLHNEQUFpQjtBQUN6Qjs7Ozs7Ozs7Ozs7Ozs7OztBQ1RzQzs7QUFFdEMsNkJBQWUsb0NBQVM7QUFDeEI7O0FBRUEsZ0tBQWdLLE9BQU87QUFDdksseUhBQXlILE9BQU87QUFDaEk7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTLFFBQVE7QUFDakI7QUFDQTs7QUFFQSxhQUFhLGlEQUFVO0FBQ3ZCOzs7Ozs7Ozs7Ozs7Ozs7O0FDbEI2Qzs7QUFFN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBLG9DQUFvQyw4Q0FBSSxHQUFHLDZDQUFHO0FBQzlDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQWUsb0NBQVM7QUFDeEI7O0FBRUE7QUFDQSxRQUFRLGlEQUFHO0FBQ1g7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDZCQUFlLHNDQUFXO0FBQzFCO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNWcUM7QUFDRzs7QUFFeEMsY0FBYyx1REFBUTtBQUN0Qjs7QUFFTztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFUCw2QkFBZSxvQ0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRU87QUFDUDtBQUNBLDJEQUEyRDtBQUMzRDtBQUNBOztBQUVPO0FBQ1A7QUFDQSwyREFBMkQ7QUFDM0Q7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLCtDQUFLOztBQUVwQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRDQUE0QztBQUM1QyxzQ0FBc0Msb0RBQU87O0FBRTdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEseURBQXlEO0FBQ3pEO0FBQ0EsMkRBQTJEO0FBQzNEO0FBQ0EsSUFBSSxvREFBTztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDOztBQUVBO0FBQ0E7QUFDQSx3QkFBd0IsT0FBTztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3hKc0M7QUFDQTtBQUNNOztBQUU1Qyw2QkFBZSxvQ0FBUztBQUN4QjtBQUNBOztBQUVBLDZDQUE2Qyx3REFBUTs7QUFFckQsc0ZBQXNGLE9BQU87QUFDN0YsZ0hBQWdILE9BQU87QUFDdkg7QUFDQTtBQUNBO0FBQ0EsUUFBUSx3REFBUSxxQ0FBcUMsaURBQUc7QUFDeEQ7QUFDQTtBQUNBOztBQUVBLGFBQWEsaURBQVU7QUFDdkI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JCeUM7QUFDSDtBQUNNOztBQUU1Qyw2QkFBZSxvQ0FBUztBQUN4QjtBQUNBOztBQUVBLDZDQUE2Qyx3REFBVzs7QUFFeEQsMEZBQTBGLE9BQU87QUFDakcsK0RBQStELE9BQU87QUFDdEU7QUFDQSx5RkFBeUYsaURBQUcsd0NBQXdDLE9BQU87QUFDM0k7QUFDQSxZQUFZLHdEQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGFBQWEsaURBQVU7QUFDdkI7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6QnVDOztBQUV2QyxnQkFBZ0Isb0RBQVM7O0FBRXpCLDZCQUFlLHNDQUFXO0FBQzFCO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTitFO0FBQzVDO0FBQ0Q7QUFDSTtBQUNLOztBQUUzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHdEQUFLO0FBQ3ZCLG9EQUFvRCx3REFBSztBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix3REFBSztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isd0RBQUs7QUFDdkI7QUFDQTtBQUNBLDZFQUE2RSx3REFBSztBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixpREFBRztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBZSxvQ0FBUztBQUN4Qix5Q0FBeUMsbUVBQW9CLEdBQUcsdURBQVc7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MscURBQVU7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDL0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQWUsb0NBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDdkJzQzs7QUFFdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQWUsb0NBQVM7QUFDeEI7QUFDQSxxQkFBcUIscURBQVU7QUFDL0I7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQWUsb0NBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZCNkM7QUFDRDs7QUFFNUMsNkJBQWUsc0NBQVc7QUFDMUI7QUFDQTtBQUNBLFlBQVksZ0RBQUs7O0FBRWpCLDREQUE0RCxPQUFPO0FBQ25FLCtEQUErRCxPQUFPO0FBQ3RFO0FBQ0Esc0JBQXNCLGlEQUFHO0FBQ3pCLFFBQVEsd0RBQVE7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBLGFBQWEsaURBQVU7QUFDdkI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdkJ1Qzs7QUFFdkM7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGlEQUFHO0FBQ3RCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsT0FBTztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsaURBQUc7QUFDdEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQix5QkFBeUIsNEJBQTRCLE9BQU87QUFDaEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDZCQUFlLG9DQUFTO0FBQ3hCOztBQUVBOztBQUVBO0FBQ0EsZ0JBQWdCLGlEQUFHO0FBQ25CLHlDQUF5QyxPQUFPO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVPO0FBQ1A7O0FBRUE7QUFDQSxtQkFBbUIsaURBQUc7QUFDdEIsMkNBQTJDO0FBQzNDLEdBQUc7O0FBRUg7QUFDQSxXQUFXLGlEQUFHO0FBQ2Q7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDaEZBLGlFQUFlLFlBQVksRUFBQzs7Ozs7Ozs7Ozs7Ozs7O0FDQWI7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLFdBQVcsa0RBQWtEO0FBQzdELGtCQUFrQix5REFBeUQ7QUFDM0UsYUFBYSxvREFBb0Q7QUFDakUsZ0JBQWdCLHVEQUF1RDtBQUN2RSxRQUFRO0FBQ1IsR0FBRztBQUNIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2IwQztBQUNvRTs7Ozs7Ozs7Ozs7Ozs7OztBQ0R2RztBQUNQO0FBQ0E7O0FBRUEsNkJBQWUsb0NBQVM7QUFDeEI7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ1BPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRU87O0FBRVA7O0FBRWU7QUFDZjtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsRHFDO0FBQ1c7QUFDRDtBQUNGO0FBQ0w7QUFDSDtBQUNGO0FBQ2dCO0FBQ0M7O0FBRXBEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLG1EQUFRO0FBQ2hDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQWUsc0NBQVc7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixzREFBZTtBQUNuQyxrQkFBa0IsdURBQVE7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLGVBQWU7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixtREFBUTtBQUMvQjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBLCtDQUErQyxvREFBUztBQUN4RDs7QUFFQTtBQUNBO0FBQ0Esb0VBQW9FLG9EQUFTO0FBQzdFOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUNBQXVDLGdEQUFnRDtBQUN2RixvREFBb0QsOENBQThDO0FBQ2xHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEMsbUJBQW1CLDRCQUE0QixRQUFRLG9EQUFTO0FBQ2hFO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLGNBQWMsd0RBQU07QUFDcEI7QUFDQTtBQUNBO0FBQ0EsWUFBWSxpREFBUztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHdEQUFPOztBQUVuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTSx3REFBUztBQUNmO0FBQ0E7O0FBRUEsSUFBSSx1REFBTztBQUNYO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksd0RBQU07QUFDbEIsWUFBWSx3REFBTztBQUNuQjtBQUNBOztBQUVBLElBQUksbURBQVc7QUFDZixJQUFJLDBEQUFhO0FBQ2pCO0FBQ0EsSUFBSSx3REFBUztBQUNiOztBQUVBO0FBQ0EsTUFBTSx1REFBTztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzRUFBc0Usd0RBQU87QUFDN0U7O0FBRUE7QUFDQTtBQUNBLE1BQU0sZ0RBQVU7QUFDaEIsTUFBTSx1REFBTztBQUNiO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHdEQUFPO0FBQ3BCO0FBQ0E7QUFDQTs7QUFFQSxJQUFJLHVEQUFPO0FBQ1gsc0JBQXNCLHdEQUFNO0FBQzVCLFNBQVMsd0RBQU07QUFDZjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSSwwREFBYTtBQUNqQixnQkFBZ0IsT0FBTztBQUN2QiwwQkFBMEIsd0RBQU87QUFDakM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxpRkFBaUYsdUJBQXVCO0FBQ3hHLE1BQU0sd0RBQVM7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJLHVEQUFPO0FBQ1gsZ0JBQWdCLE9BQU87QUFDdkIsMEJBQTBCLHdEQUFPO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSSwwREFBYTtBQUNqQjtBQUNBLDBDQUEwQyxxQkFBcUI7QUFDL0QsZ0JBQWdCLE9BQU87QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHdEQUFPO0FBQ25CO0FBQ0Esa0JBQWtCLHdEQUFNO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwRUFBMEUsd0RBQVE7QUFDbEY7O0FBRUE7QUFDQSxzRUFBc0Usd0RBQVE7QUFDOUU7O0FBRUE7QUFDQSx5RUFBeUUsd0RBQVE7QUFDakY7O0FBRUE7QUFDQSxzRUFBc0Usd0RBQVE7QUFDOUU7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5YnFDOztBQUVyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTs7QUFFQTtBQUNBLGdDQUFnQyx3REFBTTs7QUFFdEM7QUFDQSx1QkFBdUIsd0RBQU07QUFDN0I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ2xFb0M7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLCtCQUErQiw4Q0FBTTtBQUM1QztBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxlQUFlLFlBQVksU0FBUztBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3hIb0M7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLDBCQUEwQiw4Q0FBTTtBQUN2QztBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNB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QUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG1DQUFtQyxRQUFRO0FBQzNDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxtQ0FBbUMsUUFBUTtBQUMzQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG1DQUFtQyxRQUFRO0FBQzNDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtB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REFBdUQsaUJBQWlCO1dBQ3hFO1dBQ0EsZ0RBQWdELGFBQWE7V0FDN0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQUNZOztBQUVaO0FBQ21DO0FBQ1k7QUFDUjtBQUNBO0FBQ0k7QUFDOEI7O0FBRXpFO0FBQ2tEO0FBQ0o7QUFDRjs7QUFFNUM7QUFDb0U7QUFDaEI7QUFDRTtBQUNRO0FBQ1I7QUFDTjtBQUNJO0FBQ0o7QUFDaEQsV0FBVyxlQUFlO0FBQ3NDO0FBQ0o7QUFDUjtBQUNKO0FBQ3dCO0FBQ2dCO0FBQ3BDO0FBQ007QUFDRTtBQUNKO0FBQ047O0FBRWxEO0FBQ2dEO0FBQ1k7QUFDTTtBQUNJO0FBQ3BCO0FBQ0k7O0FBRXREO0FBQ3FEO0FBQ2dCO0FBQ0E7QUFPdEM7QUFDcUQ7QUFDM0I7O0FBRXpELFlBQVksdUJBQXVCO0FBQ0U7QUFDTDtBQUNFO0FBQ0s7O0FBRXZDLENBQStDO0FBQ3hDLDJCQUEyQix5REFBUzs7QUFFM0M7QUFDQSxDQUErQztBQUMvQyxzREFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZHZpei93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvYXNjZW5kaW5nLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2Jpc2VjdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9iaXNlY3Rvci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9kZXNjZW5kaW5nLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2V4dGVudC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9ncmVhdGVzdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tYXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbWF4SW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbWluLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21pbkluZGV4LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL251bWJlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9wZXJtdXRlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3F1YW50aWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3F1aWNrc2VsZWN0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3NvcnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvY29sb3IuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvZGVmaW5lLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtY29sb3Ivc3JjL2xhYi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9tYXRoLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZGlzcGF0Y2gvc3JjL2Rpc3BhdGNoLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvbm9kcmFnLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvbm9ldmVudC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWRzdi9zcmMvY3N2LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZHN2L3NyYy9kc3YuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1kc3Yvc3JjL3Rzdi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL2N1YmljLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZmV0Y2gvc3JjL2Rzdi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZldGNoL3NyYy9qc29uLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZmV0Y2gvc3JjL3RleHQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2RlZmF1bHRMb2NhbGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2V4cG9uZW50LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXREZWNpbWFsLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRHcm91cC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0TnVtZXJhbHMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFByZWZpeEF1dG8uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFJvdW5kZWQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFNwZWNpZmllci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0VHJpbS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0VHlwZXMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2lkZW50aXR5LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9sb2NhbGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvYmFzaXMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvYmFzaXNDbG9zZWQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvY29sb3IuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvY29uc3RhbnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvbGFiLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL251bWJlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9yZ2IuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvc3RyaW5nLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9kZWNvbXBvc2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL2luZGV4LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9wYXJzZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy96b29tLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtcmFuZG9tL3NyYy9kZWZhdWx0U291cmNlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtcmFuZG9tL3NyYy9ub3JtYWwuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvaW5pdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9xdWFudGlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvYXJyYXkuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2NvbnN0YW50LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9jcmVhdG9yLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9tYXRjaGVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9uYW1lc3BhY2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL25hbWVzcGFjZXMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3BvaW50ZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2FwcGVuZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2F0dHIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9jYWxsLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2xhc3NlZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2Nsb25lLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZGF0YS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2RhdHVtLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZGlzcGF0Y2guanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lYWNoLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZW1wdHkuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lbnRlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2V4aXQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9odG1sLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pbnNlcnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2pvaW4uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9sb3dlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL21lcmdlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbm9kZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL25vZGVzLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vb24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9vcmRlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3Byb3BlcnR5LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vcmFpc2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9yZW1vdmUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3QuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3RBbGwuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3RDaGlsZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdENoaWxkcmVuLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2l6ZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NvcnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zcGFyc2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3RleHQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdG9yLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3RvckFsbC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc291cmNlRXZlbnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3dpbmRvdy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRpbWVyL3NyYy90aW1lb3V0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdGltZXIvc3JjL3RpbWVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvYWN0aXZlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9pbnRlcnJ1cHQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vaW50ZXJydXB0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL3RyYW5zaXRpb24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2F0dHIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2F0dHJUd2Vlbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZGVsYXkuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2R1cmF0aW9uLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lYXNlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lYXNlVmFyeWluZy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZW5kLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2luZGV4LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9pbnRlcnBvbGF0ZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vbWVyZ2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL29uLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9yZW1vdmUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NjaGVkdWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zZWxlY3QuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdEFsbC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2VsZWN0aW9uLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc3R5bGVUd2Vlbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdGV4dC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdGV4dFR3ZWVuLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90cmFuc2l0aW9uLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90d2Vlbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL2NvbnN0YW50LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvZXZlbnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL25vZXZlbnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy90cmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy96b29tLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvYnV0dG9uL0J1dHRvbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2J1dHRvbi9GdWxsc2NyZWVuQnV0dG9uLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvYnV0dG9uL1pvb21CdXR0b25zLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvY29yZS9EYXRhc2V0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvY29yZS9EcmF3YWJsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2NvcmUvR2VvQ2FudmFzLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvY29yZS9MYXllci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2NvcmUvTGVnZW5kLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvY29yZS9NYXAuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9jb3JlL011bHRpUmVzb2x1dGlvbkRhdGFzZXQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9jb3JlL1N0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvY29yZS9Ub29sdGlwLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvZGF0YXNldC9DU1ZHcmlkLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvZGF0YXNldC9KU0dyaWQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9kYXRhc2V0L1RpbGVkR3JpZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xheWVyL0JhY2tncm91bmRMYXllci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xheWVyL0JhY2tncm91bmRMYXllckltYWdlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGF5ZXIvQmFja2dyb3VuZExheWVyV01TLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGF5ZXIvR2VvSlNPTkxheWVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGF5ZXIvR3JpZExheWVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGF5ZXIvTGFiZWxMYXllci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xlZ2VuZC9Db2xvckNhdGVnb3J5TGVnZW5kLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGVnZW5kL0NvbG9yRGlzY3JldGVMZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sZWdlbmQvQ29sb3JMZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sZWdlbmQvT3JpZW50YXRpb25MZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sZWdlbmQvU2l6ZUxlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xlZ2VuZC9UZXJuYXJ5TGVnZW5kLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvQ29tcG9zaXRpb25TdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL0RvdERlbnNpdHlTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL0ltYWdlU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9Jc29GZW5jZVN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvSm95UGxvdFN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvTGVnb1N0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvTW9zYWljU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9OaW5qYVN0YXJTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1BpbGxhclN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvU2VnbWVudFN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvU2hhcGVDb2xvclNpemVTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1NpZGVDYXRlZ29yeVN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvU2lkZVN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9TcXVhcmVDb2xvcldlYkdMU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9TdHJva2VTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1RhbmFrYVN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvVGV4dFN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvVGltZVNlcmllc1N0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3V0aWxzL1dlYkdMU3F1YXJlQ29sb3JpbmdBZHZhbmNlZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3V0aWxzL1dlYkdMU3F1YXJlQ29sb3JpbmdDYXRBZHZhbmNlZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3V0aWxzL3NjYWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvdXRpbHMvc3RyZXRjaGluZy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3V0aWxzL3Rlcm5hcnkuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy91dGlscy91dGlscy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3V0aWxzL3dlYkdMVXRpbHMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9ncmlkdml6L3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9ncmlkdml6L3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vZ3JpZHZpei93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiZ3JpZHZpelwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJncmlkdml6XCJdID0gZmFjdG9yeSgpO1xufSkoc2VsZiwgKCkgPT4ge1xucmV0dXJuICIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7XG4gIHJldHVybiBhID09IG51bGwgfHwgYiA9PSBudWxsID8gTmFOIDogYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47XG59XG4iLCJpbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuL2FzY2VuZGluZy5qc1wiO1xuaW1wb3J0IGJpc2VjdG9yIGZyb20gXCIuL2Jpc2VjdG9yLmpzXCI7XG5pbXBvcnQgbnVtYmVyIGZyb20gXCIuL251bWJlci5qc1wiO1xuXG5jb25zdCBhc2NlbmRpbmdCaXNlY3QgPSBiaXNlY3Rvcihhc2NlbmRpbmcpO1xuZXhwb3J0IGNvbnN0IGJpc2VjdFJpZ2h0ID0gYXNjZW5kaW5nQmlzZWN0LnJpZ2h0O1xuZXhwb3J0IGNvbnN0IGJpc2VjdExlZnQgPSBhc2NlbmRpbmdCaXNlY3QubGVmdDtcbmV4cG9ydCBjb25zdCBiaXNlY3RDZW50ZXIgPSBiaXNlY3RvcihudW1iZXIpLmNlbnRlcjtcbmV4cG9ydCBkZWZhdWx0IGJpc2VjdFJpZ2h0O1xuIiwiaW1wb3J0IGFzY2VuZGluZyBmcm9tIFwiLi9hc2NlbmRpbmcuanNcIjtcbmltcG9ydCBkZXNjZW5kaW5nIGZyb20gXCIuL2Rlc2NlbmRpbmcuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmlzZWN0b3IoZikge1xuICBsZXQgY29tcGFyZTEsIGNvbXBhcmUyLCBkZWx0YTtcblxuICAvLyBJZiBhbiBhY2Nlc3NvciBpcyBzcGVjaWZpZWQsIHByb21vdGUgaXQgdG8gYSBjb21wYXJhdG9yLiBJbiB0aGlzIGNhc2Ugd2VcbiAgLy8gY2FuIHRlc3Qgd2hldGhlciB0aGUgc2VhcmNoIHZhbHVlIGlzIChzZWxmLSkgY29tcGFyYWJsZS4gV2UgY2Fu4oCZdCBkbyB0aGlzXG4gIC8vIGZvciBhIGNvbXBhcmF0b3IgKGV4Y2VwdCBmb3Igc3BlY2lmaWMsIGtub3duIGNvbXBhcmF0b3JzKSBiZWNhdXNlIHdlIGNhbuKAmXRcbiAgLy8gdGVsbCBpZiB0aGUgY29tcGFyYXRvciBpcyBzeW1tZXRyaWMsIGFuZCBhbiBhc3ltbWV0cmljIGNvbXBhcmF0b3IgY2Fu4oCZdCBiZVxuICAvLyB1c2VkIHRvIHRlc3Qgd2hldGhlciBhIHNpbmdsZSB2YWx1ZSBpcyBjb21wYXJhYmxlLlxuICBpZiAoZi5sZW5ndGggIT09IDIpIHtcbiAgICBjb21wYXJlMSA9IGFzY2VuZGluZztcbiAgICBjb21wYXJlMiA9IChkLCB4KSA9PiBhc2NlbmRpbmcoZihkKSwgeCk7XG4gICAgZGVsdGEgPSAoZCwgeCkgPT4gZihkKSAtIHg7XG4gIH0gZWxzZSB7XG4gICAgY29tcGFyZTEgPSBmID09PSBhc2NlbmRpbmcgfHwgZiA9PT0gZGVzY2VuZGluZyA/IGYgOiB6ZXJvO1xuICAgIGNvbXBhcmUyID0gZjtcbiAgICBkZWx0YSA9IGY7XG4gIH1cblxuICBmdW5jdGlvbiBsZWZ0KGEsIHgsIGxvID0gMCwgaGkgPSBhLmxlbmd0aCkge1xuICAgIGlmIChsbyA8IGhpKSB7XG4gICAgICBpZiAoY29tcGFyZTEoeCwgeCkgIT09IDApIHJldHVybiBoaTtcbiAgICAgIGRvIHtcbiAgICAgICAgY29uc3QgbWlkID0gKGxvICsgaGkpID4+PiAxO1xuICAgICAgICBpZiAoY29tcGFyZTIoYVttaWRdLCB4KSA8IDApIGxvID0gbWlkICsgMTtcbiAgICAgICAgZWxzZSBoaSA9IG1pZDtcbiAgICAgIH0gd2hpbGUgKGxvIDwgaGkpO1xuICAgIH1cbiAgICByZXR1cm4gbG87XG4gIH1cblxuICBmdW5jdGlvbiByaWdodChhLCB4LCBsbyA9IDAsIGhpID0gYS5sZW5ndGgpIHtcbiAgICBpZiAobG8gPCBoaSkge1xuICAgICAgaWYgKGNvbXBhcmUxKHgsIHgpICE9PSAwKSByZXR1cm4gaGk7XG4gICAgICBkbyB7XG4gICAgICAgIGNvbnN0IG1pZCA9IChsbyArIGhpKSA+Pj4gMTtcbiAgICAgICAgaWYgKGNvbXBhcmUyKGFbbWlkXSwgeCkgPD0gMCkgbG8gPSBtaWQgKyAxO1xuICAgICAgICBlbHNlIGhpID0gbWlkO1xuICAgICAgfSB3aGlsZSAobG8gPCBoaSk7XG4gICAgfVxuICAgIHJldHVybiBsbztcbiAgfVxuXG4gIGZ1bmN0aW9uIGNlbnRlcihhLCB4LCBsbyA9IDAsIGhpID0gYS5sZW5ndGgpIHtcbiAgICBjb25zdCBpID0gbGVmdChhLCB4LCBsbywgaGkgLSAxKTtcbiAgICByZXR1cm4gaSA+IGxvICYmIGRlbHRhKGFbaSAtIDFdLCB4KSA+IC1kZWx0YShhW2ldLCB4KSA/IGkgLSAxIDogaTtcbiAgfVxuXG4gIHJldHVybiB7bGVmdCwgY2VudGVyLCByaWdodH07XG59XG5cbmZ1bmN0aW9uIHplcm8oKSB7XG4gIHJldHVybiAwO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGVzY2VuZGluZyhhLCBiKSB7XG4gIHJldHVybiBhID09IG51bGwgfHwgYiA9PSBudWxsID8gTmFOXG4gICAgOiBiIDwgYSA/IC0xXG4gICAgOiBiID4gYSA/IDFcbiAgICA6IGIgPj0gYSA/IDBcbiAgICA6IE5hTjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGV4dGVudCh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1pbjtcbiAgbGV0IG1heDtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICBpZiAobWluID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPj0gdmFsdWUpIG1pbiA9IG1heCA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChtaW4gPiB2YWx1ZSkgbWluID0gdmFsdWU7XG4gICAgICAgICAgaWYgKG1heCA8IHZhbHVlKSBtYXggPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsKSB7XG4gICAgICAgIGlmIChtaW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICh2YWx1ZSA+PSB2YWx1ZSkgbWluID0gbWF4ID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG1pbiA+IHZhbHVlKSBtaW4gPSB2YWx1ZTtcbiAgICAgICAgICBpZiAobWF4IDwgdmFsdWUpIG1heCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbbWluLCBtYXhdO1xufVxuIiwiaW1wb3J0IGFzY2VuZGluZyBmcm9tIFwiLi9hc2NlbmRpbmcuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ3JlYXRlc3QodmFsdWVzLCBjb21wYXJlID0gYXNjZW5kaW5nKSB7XG4gIGxldCBtYXg7XG4gIGxldCBkZWZpbmVkID0gZmFsc2U7XG4gIGlmIChjb21wYXJlLmxlbmd0aCA9PT0gMSkge1xuICAgIGxldCBtYXhWYWx1ZTtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdmFsdWVzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbXBhcmUoZWxlbWVudCk7XG4gICAgICBpZiAoZGVmaW5lZFxuICAgICAgICAgID8gYXNjZW5kaW5nKHZhbHVlLCBtYXhWYWx1ZSkgPiAwXG4gICAgICAgICAgOiBhc2NlbmRpbmcodmFsdWUsIHZhbHVlKSA9PT0gMCkge1xuICAgICAgICBtYXggPSBlbGVtZW50O1xuICAgICAgICBtYXhWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBkZWZpbmVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmIChkZWZpbmVkXG4gICAgICAgICAgPyBjb21wYXJlKHZhbHVlLCBtYXgpID4gMFxuICAgICAgICAgIDogY29tcGFyZSh2YWx1ZSwgdmFsdWUpID09PSAwKSB7XG4gICAgICAgIG1heCA9IHZhbHVlO1xuICAgICAgICBkZWZpbmVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1heDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1heCh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1heDtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1heDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1heEluZGV4KHZhbHVlcywgdmFsdWVvZikge1xuICBsZXQgbWF4O1xuICBsZXQgbWF4SW5kZXggPSAtMTtcbiAgbGV0IGluZGV4ID0gLTE7XG4gIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgKytpbmRleDtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsXG4gICAgICAgICAgJiYgKG1heCA8IHZhbHVlIHx8IChtYXggPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpKSB7XG4gICAgICAgIG1heCA9IHZhbHVlLCBtYXhJbmRleCA9IGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsXG4gICAgICAgICAgJiYgKG1heCA8IHZhbHVlIHx8IChtYXggPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpKSB7XG4gICAgICAgIG1heCA9IHZhbHVlLCBtYXhJbmRleCA9IGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbWF4SW5kZXg7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtaW4odmFsdWVzLCB2YWx1ZW9mKSB7XG4gIGxldCBtaW47XG4gIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGxcbiAgICAgICAgICAmJiAobWluID4gdmFsdWUgfHwgKG1pbiA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWluID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBpbmRleCA9IC0xO1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWUsICsraW5kZXgsIHZhbHVlcykpICE9IG51bGxcbiAgICAgICAgICAmJiAobWluID4gdmFsdWUgfHwgKG1pbiA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWluID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtaW47XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtaW5JbmRleCh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1pbjtcbiAgbGV0IG1pbkluZGV4ID0gLTE7XG4gIGxldCBpbmRleCA9IC0xO1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICsraW5kZXg7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbFxuICAgICAgICAgICYmIChtaW4gPiB2YWx1ZSB8fCAobWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtaW4gPSB2YWx1ZSwgbWluSW5kZXggPSBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbFxuICAgICAgICAgICYmIChtaW4gPiB2YWx1ZSB8fCAobWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtaW4gPSB2YWx1ZSwgbWluSW5kZXggPSBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1pbkluZGV4O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbnVtYmVyKHgpIHtcbiAgcmV0dXJuIHggPT09IG51bGwgPyBOYU4gOiAreDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBudW1iZXJzKHZhbHVlcywgdmFsdWVvZikge1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAodmFsdWUgPSArdmFsdWUpID49IHZhbHVlKSB7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsICYmICh2YWx1ZSA9ICt2YWx1ZSkgPj0gdmFsdWUpIHtcbiAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwZXJtdXRlKHNvdXJjZSwga2V5cykge1xuICByZXR1cm4gQXJyYXkuZnJvbShrZXlzLCBrZXkgPT4gc291cmNlW2tleV0pO1xufVxuIiwiaW1wb3J0IG1heCBmcm9tIFwiLi9tYXguanNcIjtcbmltcG9ydCBtYXhJbmRleCBmcm9tIFwiLi9tYXhJbmRleC5qc1wiO1xuaW1wb3J0IG1pbiBmcm9tIFwiLi9taW4uanNcIjtcbmltcG9ydCBtaW5JbmRleCBmcm9tIFwiLi9taW5JbmRleC5qc1wiO1xuaW1wb3J0IHF1aWNrc2VsZWN0IGZyb20gXCIuL3F1aWNrc2VsZWN0LmpzXCI7XG5pbXBvcnQgbnVtYmVyLCB7bnVtYmVyc30gZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5pbXBvcnQge2FzY2VuZGluZ0RlZmluZWR9IGZyb20gXCIuL3NvcnQuanNcIjtcbmltcG9ydCBncmVhdGVzdCBmcm9tIFwiLi9ncmVhdGVzdC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWFudGlsZSh2YWx1ZXMsIHAsIHZhbHVlb2YpIHtcbiAgdmFsdWVzID0gRmxvYXQ2NEFycmF5LmZyb20obnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpKTtcbiAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpIHx8IGlzTmFOKHAgPSArcCkpIHJldHVybjtcbiAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuIG1pbih2YWx1ZXMpO1xuICBpZiAocCA+PSAxKSByZXR1cm4gbWF4KHZhbHVlcyk7XG4gIHZhciBuLFxuICAgICAgaSA9IChuIC0gMSkgKiBwLFxuICAgICAgaTAgPSBNYXRoLmZsb29yKGkpLFxuICAgICAgdmFsdWUwID0gbWF4KHF1aWNrc2VsZWN0KHZhbHVlcywgaTApLnN1YmFycmF5KDAsIGkwICsgMSkpLFxuICAgICAgdmFsdWUxID0gbWluKHZhbHVlcy5zdWJhcnJheShpMCArIDEpKTtcbiAgcmV0dXJuIHZhbHVlMCArICh2YWx1ZTEgLSB2YWx1ZTApICogKGkgLSBpMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWFudGlsZVNvcnRlZCh2YWx1ZXMsIHAsIHZhbHVlb2YgPSBudW1iZXIpIHtcbiAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpIHx8IGlzTmFOKHAgPSArcCkpIHJldHVybjtcbiAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1swXSwgMCwgdmFsdWVzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1tuIC0gMV0sIG4gLSAxLCB2YWx1ZXMpO1xuICB2YXIgbixcbiAgICAgIGkgPSAobiAtIDEpICogcCxcbiAgICAgIGkwID0gTWF0aC5mbG9vcihpKSxcbiAgICAgIHZhbHVlMCA9ICt2YWx1ZW9mKHZhbHVlc1tpMF0sIGkwLCB2YWx1ZXMpLFxuICAgICAgdmFsdWUxID0gK3ZhbHVlb2YodmFsdWVzW2kwICsgMV0sIGkwICsgMSwgdmFsdWVzKTtcbiAgcmV0dXJuIHZhbHVlMCArICh2YWx1ZTEgLSB2YWx1ZTApICogKGkgLSBpMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWFudGlsZUluZGV4KHZhbHVlcywgcCwgdmFsdWVvZiA9IG51bWJlcikge1xuICBpZiAoaXNOYU4ocCA9ICtwKSkgcmV0dXJuO1xuICBudW1iZXJzID0gRmxvYXQ2NEFycmF5LmZyb20odmFsdWVzLCAoXywgaSkgPT4gbnVtYmVyKHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSk7XG4gIGlmIChwIDw9IDApIHJldHVybiBtaW5JbmRleChudW1iZXJzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuIG1heEluZGV4KG51bWJlcnMpO1xuICB2YXIgbnVtYmVycyxcbiAgICAgIGluZGV4ID0gVWludDMyQXJyYXkuZnJvbSh2YWx1ZXMsIChfLCBpKSA9PiBpKSxcbiAgICAgIGogPSBudW1iZXJzLmxlbmd0aCAtIDEsXG4gICAgICBpID0gTWF0aC5mbG9vcihqICogcCk7XG4gIHF1aWNrc2VsZWN0KGluZGV4LCBpLCAwLCBqLCAoaSwgaikgPT4gYXNjZW5kaW5nRGVmaW5lZChudW1iZXJzW2ldLCBudW1iZXJzW2pdKSk7XG4gIGkgPSBncmVhdGVzdChpbmRleC5zdWJhcnJheSgwLCBpICsgMSksIChpKSA9PiBudW1iZXJzW2ldKTtcbiAgcmV0dXJuIGkgPj0gMCA/IGkgOiAtMTtcbn1cbiIsImltcG9ydCB7YXNjZW5kaW5nRGVmaW5lZCwgY29tcGFyZURlZmluZWR9IGZyb20gXCIuL3NvcnQuanNcIjtcblxuLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL21vdXJuZXIvcXVpY2tzZWxlY3Rcbi8vIElTQyBsaWNlbnNlLCBDb3B5cmlnaHQgMjAxOCBWbGFkaW1pciBBZ2Fmb25raW4uXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWlja3NlbGVjdChhcnJheSwgaywgbGVmdCA9IDAsIHJpZ2h0ID0gSW5maW5pdHksIGNvbXBhcmUpIHtcbiAgayA9IE1hdGguZmxvb3Ioayk7XG4gIGxlZnQgPSBNYXRoLmZsb29yKE1hdGgubWF4KDAsIGxlZnQpKTtcbiAgcmlnaHQgPSBNYXRoLmZsb29yKE1hdGgubWluKGFycmF5Lmxlbmd0aCAtIDEsIHJpZ2h0KSk7XG5cbiAgaWYgKCEobGVmdCA8PSBrICYmIGsgPD0gcmlnaHQpKSByZXR1cm4gYXJyYXk7XG5cbiAgY29tcGFyZSA9IGNvbXBhcmUgPT09IHVuZGVmaW5lZCA/IGFzY2VuZGluZ0RlZmluZWQgOiBjb21wYXJlRGVmaW5lZChjb21wYXJlKTtcblxuICB3aGlsZSAocmlnaHQgPiBsZWZ0KSB7XG4gICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkge1xuICAgICAgY29uc3QgbiA9IHJpZ2h0IC0gbGVmdCArIDE7XG4gICAgICBjb25zdCBtID0gayAtIGxlZnQgKyAxO1xuICAgICAgY29uc3QgeiA9IE1hdGgubG9nKG4pO1xuICAgICAgY29uc3QgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7XG4gICAgICBjb25zdCBzZCA9IDAuNSAqIE1hdGguc3FydCh6ICogcyAqIChuIC0gcykgLyBuKSAqIChtIC0gbiAvIDIgPCAwID8gLTEgOiAxKTtcbiAgICAgIGNvbnN0IG5ld0xlZnQgPSBNYXRoLm1heChsZWZ0LCBNYXRoLmZsb29yKGsgLSBtICogcyAvIG4gKyBzZCkpO1xuICAgICAgY29uc3QgbmV3UmlnaHQgPSBNYXRoLm1pbihyaWdodCwgTWF0aC5mbG9vcihrICsgKG4gLSBtKSAqIHMgLyBuICsgc2QpKTtcbiAgICAgIHF1aWNrc2VsZWN0KGFycmF5LCBrLCBuZXdMZWZ0LCBuZXdSaWdodCwgY29tcGFyZSk7XG4gICAgfVxuXG4gICAgY29uc3QgdCA9IGFycmF5W2tdO1xuICAgIGxldCBpID0gbGVmdDtcbiAgICBsZXQgaiA9IHJpZ2h0O1xuXG4gICAgc3dhcChhcnJheSwgbGVmdCwgayk7XG4gICAgaWYgKGNvbXBhcmUoYXJyYXlbcmlnaHRdLCB0KSA+IDApIHN3YXAoYXJyYXksIGxlZnQsIHJpZ2h0KTtcblxuICAgIHdoaWxlIChpIDwgaikge1xuICAgICAgc3dhcChhcnJheSwgaSwgaiksICsraSwgLS1qO1xuICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbaV0sIHQpIDwgMCkgKytpO1xuICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbal0sIHQpID4gMCkgLS1qO1xuICAgIH1cblxuICAgIGlmIChjb21wYXJlKGFycmF5W2xlZnRdLCB0KSA9PT0gMCkgc3dhcChhcnJheSwgbGVmdCwgaik7XG4gICAgZWxzZSArK2osIHN3YXAoYXJyYXksIGosIHJpZ2h0KTtcblxuICAgIGlmIChqIDw9IGspIGxlZnQgPSBqICsgMTtcbiAgICBpZiAoayA8PSBqKSByaWdodCA9IGogLSAxO1xuICB9XG5cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5mdW5jdGlvbiBzd2FwKGFycmF5LCBpLCBqKSB7XG4gIGNvbnN0IHQgPSBhcnJheVtpXTtcbiAgYXJyYXlbaV0gPSBhcnJheVtqXTtcbiAgYXJyYXlbal0gPSB0O1xufVxuIiwiaW1wb3J0IGFzY2VuZGluZyBmcm9tIFwiLi9hc2NlbmRpbmcuanNcIjtcbmltcG9ydCBwZXJtdXRlIGZyb20gXCIuL3Blcm11dGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc29ydCh2YWx1ZXMsIC4uLkYpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZXNbU3ltYm9sLml0ZXJhdG9yXSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwidmFsdWVzIGlzIG5vdCBpdGVyYWJsZVwiKTtcbiAgdmFsdWVzID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICBsZXQgW2ZdID0gRjtcbiAgaWYgKChmICYmIGYubGVuZ3RoICE9PSAyKSB8fCBGLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCBpbmRleCA9IFVpbnQzMkFycmF5LmZyb20odmFsdWVzLCAoZCwgaSkgPT4gaSk7XG4gICAgaWYgKEYubGVuZ3RoID4gMSkge1xuICAgICAgRiA9IEYubWFwKGYgPT4gdmFsdWVzLm1hcChmKSk7XG4gICAgICBpbmRleC5zb3J0KChpLCBqKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZiBvZiBGKSB7XG4gICAgICAgICAgY29uc3QgYyA9IGFzY2VuZGluZ0RlZmluZWQoZltpXSwgZltqXSk7XG4gICAgICAgICAgaWYgKGMpIHJldHVybiBjO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZiA9IHZhbHVlcy5tYXAoZik7XG4gICAgICBpbmRleC5zb3J0KChpLCBqKSA9PiBhc2NlbmRpbmdEZWZpbmVkKGZbaV0sIGZbal0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHBlcm11dGUodmFsdWVzLCBpbmRleCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlcy5zb3J0KGNvbXBhcmVEZWZpbmVkKGYpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVEZWZpbmVkKGNvbXBhcmUgPSBhc2NlbmRpbmcpIHtcbiAgaWYgKGNvbXBhcmUgPT09IGFzY2VuZGluZykgcmV0dXJuIGFzY2VuZGluZ0RlZmluZWQ7XG4gIGlmICh0eXBlb2YgY29tcGFyZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiY29tcGFyZSBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgcmV0dXJuIChhLCBiKSA9PiB7XG4gICAgY29uc3QgeCA9IGNvbXBhcmUoYSwgYik7XG4gICAgaWYgKHggfHwgeCA9PT0gMCkgcmV0dXJuIHg7XG4gICAgcmV0dXJuIChjb21wYXJlKGIsIGIpID09PSAwKSAtIChjb21wYXJlKGEsIGEpID09PSAwKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzY2VuZGluZ0RlZmluZWQoYSwgYikge1xuICByZXR1cm4gKGEgPT0gbnVsbCB8fCAhKGEgPj0gYSkpIC0gKGIgPT0gbnVsbCB8fCAhKGIgPj0gYikpIHx8IChhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCk7XG59XG4iLCJpbXBvcnQgZGVmaW5lLCB7ZXh0ZW5kfSBmcm9tIFwiLi9kZWZpbmUuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIENvbG9yKCkge31cblxuZXhwb3J0IHZhciBkYXJrZXIgPSAwLjc7XG5leHBvcnQgdmFyIGJyaWdodGVyID0gMSAvIGRhcmtlcjtcblxudmFyIHJlSSA9IFwiXFxcXHMqKFsrLV0/XFxcXGQrKVxcXFxzKlwiLFxuICAgIHJlTiA9IFwiXFxcXHMqKFsrLV0/KD86XFxcXGQqXFxcXC4pP1xcXFxkKyg/OltlRV1bKy1dP1xcXFxkKyk/KVxcXFxzKlwiLFxuICAgIHJlUCA9IFwiXFxcXHMqKFsrLV0/KD86XFxcXGQqXFxcXC4pP1xcXFxkKyg/OltlRV1bKy1dP1xcXFxkKyk/KSVcXFxccypcIixcbiAgICByZUhleCA9IC9eIyhbMC05YS1mXXszLDh9KSQvLFxuICAgIHJlUmdiSW50ZWdlciA9IG5ldyBSZWdFeHAoYF5yZ2JcXFxcKCR7cmVJfSwke3JlSX0sJHtyZUl9XFxcXCkkYCksXG4gICAgcmVSZ2JQZXJjZW50ID0gbmV3IFJlZ0V4cChgXnJnYlxcXFwoJHtyZVB9LCR7cmVQfSwke3JlUH1cXFxcKSRgKSxcbiAgICByZVJnYmFJbnRlZ2VyID0gbmV3IFJlZ0V4cChgXnJnYmFcXFxcKCR7cmVJfSwke3JlSX0sJHtyZUl9LCR7cmVOfVxcXFwpJGApLFxuICAgIHJlUmdiYVBlcmNlbnQgPSBuZXcgUmVnRXhwKGBecmdiYVxcXFwoJHtyZVB9LCR7cmVQfSwke3JlUH0sJHtyZU59XFxcXCkkYCksXG4gICAgcmVIc2xQZXJjZW50ID0gbmV3IFJlZ0V4cChgXmhzbFxcXFwoJHtyZU59LCR7cmVQfSwke3JlUH1cXFxcKSRgKSxcbiAgICByZUhzbGFQZXJjZW50ID0gbmV3IFJlZ0V4cChgXmhzbGFcXFxcKCR7cmVOfSwke3JlUH0sJHtyZVB9LCR7cmVOfVxcXFwpJGApO1xuXG52YXIgbmFtZWQgPSB7XG4gIGFsaWNlYmx1ZTogMHhmMGY4ZmYsXG4gIGFudGlxdWV3aGl0ZTogMHhmYWViZDcsXG4gIGFxdWE6IDB4MDBmZmZmLFxuICBhcXVhbWFyaW5lOiAweDdmZmZkNCxcbiAgYXp1cmU6IDB4ZjBmZmZmLFxuICBiZWlnZTogMHhmNWY1ZGMsXG4gIGJpc3F1ZTogMHhmZmU0YzQsXG4gIGJsYWNrOiAweDAwMDAwMCxcbiAgYmxhbmNoZWRhbG1vbmQ6IDB4ZmZlYmNkLFxuICBibHVlOiAweDAwMDBmZixcbiAgYmx1ZXZpb2xldDogMHg4YTJiZTIsXG4gIGJyb3duOiAweGE1MmEyYSxcbiAgYnVybHl3b29kOiAweGRlYjg4NyxcbiAgY2FkZXRibHVlOiAweDVmOWVhMCxcbiAgY2hhcnRyZXVzZTogMHg3ZmZmMDAsXG4gIGNob2NvbGF0ZTogMHhkMjY5MWUsXG4gIGNvcmFsOiAweGZmN2Y1MCxcbiAgY29ybmZsb3dlcmJsdWU6IDB4NjQ5NWVkLFxuICBjb3Juc2lsazogMHhmZmY4ZGMsXG4gIGNyaW1zb246IDB4ZGMxNDNjLFxuICBjeWFuOiAweDAwZmZmZixcbiAgZGFya2JsdWU6IDB4MDAwMDhiLFxuICBkYXJrY3lhbjogMHgwMDhiOGIsXG4gIGRhcmtnb2xkZW5yb2Q6IDB4Yjg4NjBiLFxuICBkYXJrZ3JheTogMHhhOWE5YTksXG4gIGRhcmtncmVlbjogMHgwMDY0MDAsXG4gIGRhcmtncmV5OiAweGE5YTlhOSxcbiAgZGFya2toYWtpOiAweGJkYjc2YixcbiAgZGFya21hZ2VudGE6IDB4OGIwMDhiLFxuICBkYXJrb2xpdmVncmVlbjogMHg1NTZiMmYsXG4gIGRhcmtvcmFuZ2U6IDB4ZmY4YzAwLFxuICBkYXJrb3JjaGlkOiAweDk5MzJjYyxcbiAgZGFya3JlZDogMHg4YjAwMDAsXG4gIGRhcmtzYWxtb246IDB4ZTk5NjdhLFxuICBkYXJrc2VhZ3JlZW46IDB4OGZiYzhmLFxuICBkYXJrc2xhdGVibHVlOiAweDQ4M2Q4YixcbiAgZGFya3NsYXRlZ3JheTogMHgyZjRmNGYsXG4gIGRhcmtzbGF0ZWdyZXk6IDB4MmY0ZjRmLFxuICBkYXJrdHVycXVvaXNlOiAweDAwY2VkMSxcbiAgZGFya3Zpb2xldDogMHg5NDAwZDMsXG4gIGRlZXBwaW5rOiAweGZmMTQ5MyxcbiAgZGVlcHNreWJsdWU6IDB4MDBiZmZmLFxuICBkaW1ncmF5OiAweDY5Njk2OSxcbiAgZGltZ3JleTogMHg2OTY5NjksXG4gIGRvZGdlcmJsdWU6IDB4MWU5MGZmLFxuICBmaXJlYnJpY2s6IDB4YjIyMjIyLFxuICBmbG9yYWx3aGl0ZTogMHhmZmZhZjAsXG4gIGZvcmVzdGdyZWVuOiAweDIyOGIyMixcbiAgZnVjaHNpYTogMHhmZjAwZmYsXG4gIGdhaW5zYm9ybzogMHhkY2RjZGMsXG4gIGdob3N0d2hpdGU6IDB4ZjhmOGZmLFxuICBnb2xkOiAweGZmZDcwMCxcbiAgZ29sZGVucm9kOiAweGRhYTUyMCxcbiAgZ3JheTogMHg4MDgwODAsXG4gIGdyZWVuOiAweDAwODAwMCxcbiAgZ3JlZW55ZWxsb3c6IDB4YWRmZjJmLFxuICBncmV5OiAweDgwODA4MCxcbiAgaG9uZXlkZXc6IDB4ZjBmZmYwLFxuICBob3RwaW5rOiAweGZmNjliNCxcbiAgaW5kaWFucmVkOiAweGNkNWM1YyxcbiAgaW5kaWdvOiAweDRiMDA4MixcbiAgaXZvcnk6IDB4ZmZmZmYwLFxuICBraGFraTogMHhmMGU2OGMsXG4gIGxhdmVuZGVyOiAweGU2ZTZmYSxcbiAgbGF2ZW5kZXJibHVzaDogMHhmZmYwZjUsXG4gIGxhd25ncmVlbjogMHg3Y2ZjMDAsXG4gIGxlbW9uY2hpZmZvbjogMHhmZmZhY2QsXG4gIGxpZ2h0Ymx1ZTogMHhhZGQ4ZTYsXG4gIGxpZ2h0Y29yYWw6IDB4ZjA4MDgwLFxuICBsaWdodGN5YW46IDB4ZTBmZmZmLFxuICBsaWdodGdvbGRlbnJvZHllbGxvdzogMHhmYWZhZDIsXG4gIGxpZ2h0Z3JheTogMHhkM2QzZDMsXG4gIGxpZ2h0Z3JlZW46IDB4OTBlZTkwLFxuICBsaWdodGdyZXk6IDB4ZDNkM2QzLFxuICBsaWdodHBpbms6IDB4ZmZiNmMxLFxuICBsaWdodHNhbG1vbjogMHhmZmEwN2EsXG4gIGxpZ2h0c2VhZ3JlZW46IDB4MjBiMmFhLFxuICBsaWdodHNreWJsdWU6IDB4ODdjZWZhLFxuICBsaWdodHNsYXRlZ3JheTogMHg3Nzg4OTksXG4gIGxpZ2h0c2xhdGVncmV5OiAweDc3ODg5OSxcbiAgbGlnaHRzdGVlbGJsdWU6IDB4YjBjNGRlLFxuICBsaWdodHllbGxvdzogMHhmZmZmZTAsXG4gIGxpbWU6IDB4MDBmZjAwLFxuICBsaW1lZ3JlZW46IDB4MzJjZDMyLFxuICBsaW5lbjogMHhmYWYwZTYsXG4gIG1hZ2VudGE6IDB4ZmYwMGZmLFxuICBtYXJvb246IDB4ODAwMDAwLFxuICBtZWRpdW1hcXVhbWFyaW5lOiAweDY2Y2RhYSxcbiAgbWVkaXVtYmx1ZTogMHgwMDAwY2QsXG4gIG1lZGl1bW9yY2hpZDogMHhiYTU1ZDMsXG4gIG1lZGl1bXB1cnBsZTogMHg5MzcwZGIsXG4gIG1lZGl1bXNlYWdyZWVuOiAweDNjYjM3MSxcbiAgbWVkaXVtc2xhdGVibHVlOiAweDdiNjhlZSxcbiAgbWVkaXVtc3ByaW5nZ3JlZW46IDB4MDBmYTlhLFxuICBtZWRpdW10dXJxdW9pc2U6IDB4NDhkMWNjLFxuICBtZWRpdW12aW9sZXRyZWQ6IDB4YzcxNTg1LFxuICBtaWRuaWdodGJsdWU6IDB4MTkxOTcwLFxuICBtaW50Y3JlYW06IDB4ZjVmZmZhLFxuICBtaXN0eXJvc2U6IDB4ZmZlNGUxLFxuICBtb2NjYXNpbjogMHhmZmU0YjUsXG4gIG5hdmFqb3doaXRlOiAweGZmZGVhZCxcbiAgbmF2eTogMHgwMDAwODAsXG4gIG9sZGxhY2U6IDB4ZmRmNWU2LFxuICBvbGl2ZTogMHg4MDgwMDAsXG4gIG9saXZlZHJhYjogMHg2YjhlMjMsXG4gIG9yYW5nZTogMHhmZmE1MDAsXG4gIG9yYW5nZXJlZDogMHhmZjQ1MDAsXG4gIG9yY2hpZDogMHhkYTcwZDYsXG4gIHBhbGVnb2xkZW5yb2Q6IDB4ZWVlOGFhLFxuICBwYWxlZ3JlZW46IDB4OThmYjk4LFxuICBwYWxldHVycXVvaXNlOiAweGFmZWVlZSxcbiAgcGFsZXZpb2xldHJlZDogMHhkYjcwOTMsXG4gIHBhcGF5YXdoaXA6IDB4ZmZlZmQ1LFxuICBwZWFjaHB1ZmY6IDB4ZmZkYWI5LFxuICBwZXJ1OiAweGNkODUzZixcbiAgcGluazogMHhmZmMwY2IsXG4gIHBsdW06IDB4ZGRhMGRkLFxuICBwb3dkZXJibHVlOiAweGIwZTBlNixcbiAgcHVycGxlOiAweDgwMDA4MCxcbiAgcmViZWNjYXB1cnBsZTogMHg2NjMzOTksXG4gIHJlZDogMHhmZjAwMDAsXG4gIHJvc3licm93bjogMHhiYzhmOGYsXG4gIHJveWFsYmx1ZTogMHg0MTY5ZTEsXG4gIHNhZGRsZWJyb3duOiAweDhiNDUxMyxcbiAgc2FsbW9uOiAweGZhODA3MixcbiAgc2FuZHlicm93bjogMHhmNGE0NjAsXG4gIHNlYWdyZWVuOiAweDJlOGI1NyxcbiAgc2Vhc2hlbGw6IDB4ZmZmNWVlLFxuICBzaWVubmE6IDB4YTA1MjJkLFxuICBzaWx2ZXI6IDB4YzBjMGMwLFxuICBza3libHVlOiAweDg3Y2VlYixcbiAgc2xhdGVibHVlOiAweDZhNWFjZCxcbiAgc2xhdGVncmF5OiAweDcwODA5MCxcbiAgc2xhdGVncmV5OiAweDcwODA5MCxcbiAgc25vdzogMHhmZmZhZmEsXG4gIHNwcmluZ2dyZWVuOiAweDAwZmY3ZixcbiAgc3RlZWxibHVlOiAweDQ2ODJiNCxcbiAgdGFuOiAweGQyYjQ4YyxcbiAgdGVhbDogMHgwMDgwODAsXG4gIHRoaXN0bGU6IDB4ZDhiZmQ4LFxuICB0b21hdG86IDB4ZmY2MzQ3LFxuICB0dXJxdW9pc2U6IDB4NDBlMGQwLFxuICB2aW9sZXQ6IDB4ZWU4MmVlLFxuICB3aGVhdDogMHhmNWRlYjMsXG4gIHdoaXRlOiAweGZmZmZmZixcbiAgd2hpdGVzbW9rZTogMHhmNWY1ZjUsXG4gIHllbGxvdzogMHhmZmZmMDAsXG4gIHllbGxvd2dyZWVuOiAweDlhY2QzMlxufTtcblxuZGVmaW5lKENvbG9yLCBjb2xvciwge1xuICBjb3B5KGNoYW5uZWxzKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IHRoaXMuY29uc3RydWN0b3IsIHRoaXMsIGNoYW5uZWxzKTtcbiAgfSxcbiAgZGlzcGxheWFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKTtcbiAgfSxcbiAgaGV4OiBjb2xvcl9mb3JtYXRIZXgsIC8vIERlcHJlY2F0ZWQhIFVzZSBjb2xvci5mb3JtYXRIZXguXG4gIGZvcm1hdEhleDogY29sb3JfZm9ybWF0SGV4LFxuICBmb3JtYXRIZXg4OiBjb2xvcl9mb3JtYXRIZXg4LFxuICBmb3JtYXRIc2w6IGNvbG9yX2Zvcm1hdEhzbCxcbiAgZm9ybWF0UmdiOiBjb2xvcl9mb3JtYXRSZ2IsXG4gIHRvU3RyaW5nOiBjb2xvcl9mb3JtYXRSZ2Jcbn0pO1xuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRIZXgoKSB7XG4gIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleCgpO1xufVxuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRIZXg4KCkge1xuICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXg4KCk7XG59XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdEhzbCgpIHtcbiAgcmV0dXJuIGhzbENvbnZlcnQodGhpcykuZm9ybWF0SHNsKCk7XG59XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdFJnYigpIHtcbiAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbG9yKGZvcm1hdCkge1xuICB2YXIgbSwgbDtcbiAgZm9ybWF0ID0gKGZvcm1hdCArIFwiXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gKG0gPSByZUhleC5leGVjKGZvcm1hdCkpID8gKGwgPSBtWzFdLmxlbmd0aCwgbSA9IHBhcnNlSW50KG1bMV0sIDE2KSwgbCA9PT0gNiA/IHJnYm4obSkgLy8gI2ZmMDAwMFxuICAgICAgOiBsID09PSAzID8gbmV3IFJnYigobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpLCAxKSAvLyAjZjAwXG4gICAgICA6IGwgPT09IDggPyByZ2JhKG0gPj4gMjQgJiAweGZmLCBtID4+IDE2ICYgMHhmZiwgbSA+PiA4ICYgMHhmZiwgKG0gJiAweGZmKSAvIDB4ZmYpIC8vICNmZjAwMDAwMFxuICAgICAgOiBsID09PSA0ID8gcmdiYSgobSA+PiAxMiAmIDB4ZikgfCAobSA+PiA4ICYgMHhmMCksIChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4ZjApLCAobSA+PiA0ICYgMHhmKSB8IChtICYgMHhmMCksICgoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpKSAvIDB4ZmYpIC8vICNmMDAwXG4gICAgICA6IG51bGwpIC8vIGludmFsaWQgaGV4XG4gICAgICA6IChtID0gcmVSZ2JJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0sIG1bMl0sIG1bM10sIDEpIC8vIHJnYigyNTUsIDAsIDApXG4gICAgICA6IChtID0gcmVSZ2JQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIDEpIC8vIHJnYigxMDAlLCAwJSwgMCUpXG4gICAgICA6IChtID0gcmVSZ2JhSW50ZWdlci5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdLCBtWzJdLCBtWzNdLCBtWzRdKSAvLyByZ2JhKDI1NSwgMCwgMCwgMSlcbiAgICAgIDogKG0gPSByZVJnYmFQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIG1bNF0pIC8vIHJnYigxMDAlLCAwJSwgMCUsIDEpXG4gICAgICA6IChtID0gcmVIc2xQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBoc2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIDEpIC8vIGhzbCgxMjAsIDUwJSwgNTAlKVxuICAgICAgOiAobSA9IHJlSHNsYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgbVs0XSkgLy8gaHNsYSgxMjAsIDUwJSwgNTAlLCAxKVxuICAgICAgOiBuYW1lZC5oYXNPd25Qcm9wZXJ0eShmb3JtYXQpID8gcmdibihuYW1lZFtmb3JtYXRdKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgOiBmb3JtYXQgPT09IFwidHJhbnNwYXJlbnRcIiA/IG5ldyBSZ2IoTmFOLCBOYU4sIE5hTiwgMClcbiAgICAgIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gcmdibihuKSB7XG4gIHJldHVybiBuZXcgUmdiKG4gPj4gMTYgJiAweGZmLCBuID4+IDggJiAweGZmLCBuICYgMHhmZiwgMSk7XG59XG5cbmZ1bmN0aW9uIHJnYmEociwgZywgYiwgYSkge1xuICBpZiAoYSA8PSAwKSByID0gZyA9IGIgPSBOYU47XG4gIHJldHVybiBuZXcgUmdiKHIsIGcsIGIsIGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmdiQ29udmVydChvKSB7XG4gIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvcikpIG8gPSBjb2xvcihvKTtcbiAgaWYgKCFvKSByZXR1cm4gbmV3IFJnYjtcbiAgbyA9IG8ucmdiKCk7XG4gIHJldHVybiBuZXcgUmdiKG8uciwgby5nLCBvLmIsIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZ2IociwgZywgYiwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IHJnYkNvbnZlcnQocikgOiBuZXcgUmdiKHIsIGcsIGIsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJnYihyLCBnLCBiLCBvcGFjaXR5KSB7XG4gIHRoaXMuciA9ICtyO1xuICB0aGlzLmcgPSArZztcbiAgdGhpcy5iID0gK2I7XG4gIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5O1xufVxuXG5kZWZpbmUoUmdiLCByZ2IsIGV4dGVuZChDb2xvciwge1xuICBicmlnaHRlcihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspO1xuICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciA6IE1hdGgucG93KGRhcmtlciwgayk7XG4gICAgcmV0dXJuIG5ldyBSZ2IodGhpcy5yICogaywgdGhpcy5nICogaywgdGhpcy5iICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgcmdiKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBjbGFtcCgpIHtcbiAgICByZXR1cm4gbmV3IFJnYihjbGFtcGkodGhpcy5yKSwgY2xhbXBpKHRoaXMuZyksIGNsYW1waSh0aGlzLmIpLCBjbGFtcGEodGhpcy5vcGFjaXR5KSk7XG4gIH0sXG4gIGRpc3BsYXlhYmxlKCkge1xuICAgIHJldHVybiAoLTAuNSA8PSB0aGlzLnIgJiYgdGhpcy5yIDwgMjU1LjUpXG4gICAgICAgICYmICgtMC41IDw9IHRoaXMuZyAmJiB0aGlzLmcgPCAyNTUuNSlcbiAgICAgICAgJiYgKC0wLjUgPD0gdGhpcy5iICYmIHRoaXMuYiA8IDI1NS41KVxuICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpO1xuICB9LFxuICBoZXg6IHJnYl9mb3JtYXRIZXgsIC8vIERlcHJlY2F0ZWQhIFVzZSBjb2xvci5mb3JtYXRIZXguXG4gIGZvcm1hdEhleDogcmdiX2Zvcm1hdEhleCxcbiAgZm9ybWF0SGV4ODogcmdiX2Zvcm1hdEhleDgsXG4gIGZvcm1hdFJnYjogcmdiX2Zvcm1hdFJnYixcbiAgdG9TdHJpbmc6IHJnYl9mb3JtYXRSZ2Jcbn0pKTtcblxuZnVuY3Rpb24gcmdiX2Zvcm1hdEhleCgpIHtcbiAgcmV0dXJuIGAjJHtoZXgodGhpcy5yKX0ke2hleCh0aGlzLmcpfSR7aGV4KHRoaXMuYil9YDtcbn1cblxuZnVuY3Rpb24gcmdiX2Zvcm1hdEhleDgoKSB7XG4gIHJldHVybiBgIyR7aGV4KHRoaXMucil9JHtoZXgodGhpcy5nKX0ke2hleCh0aGlzLmIpfSR7aGV4KChpc05hTih0aGlzLm9wYWNpdHkpID8gMSA6IHRoaXMub3BhY2l0eSkgKiAyNTUpfWA7XG59XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRSZ2IoKSB7XG4gIGNvbnN0IGEgPSBjbGFtcGEodGhpcy5vcGFjaXR5KTtcbiAgcmV0dXJuIGAke2EgPT09IDEgPyBcInJnYihcIiA6IFwicmdiYShcIn0ke2NsYW1waSh0aGlzLnIpfSwgJHtjbGFtcGkodGhpcy5nKX0sICR7Y2xhbXBpKHRoaXMuYil9JHthID09PSAxID8gXCIpXCIgOiBgLCAke2F9KWB9YDtcbn1cblxuZnVuY3Rpb24gY2xhbXBhKG9wYWNpdHkpIHtcbiAgcmV0dXJuIGlzTmFOKG9wYWNpdHkpID8gMSA6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIG9wYWNpdHkpKTtcbn1cblxuZnVuY3Rpb24gY2xhbXBpKHZhbHVlKSB7XG4gIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodmFsdWUpIHx8IDApKTtcbn1cblxuZnVuY3Rpb24gaGV4KHZhbHVlKSB7XG4gIHZhbHVlID0gY2xhbXBpKHZhbHVlKTtcbiAgcmV0dXJuICh2YWx1ZSA8IDE2ID8gXCIwXCIgOiBcIlwiKSArIHZhbHVlLnRvU3RyaW5nKDE2KTtcbn1cblxuZnVuY3Rpb24gaHNsYShoLCBzLCBsLCBhKSB7XG4gIGlmIChhIDw9IDApIGggPSBzID0gbCA9IE5hTjtcbiAgZWxzZSBpZiAobCA8PSAwIHx8IGwgPj0gMSkgaCA9IHMgPSBOYU47XG4gIGVsc2UgaWYgKHMgPD0gMCkgaCA9IE5hTjtcbiAgcmV0dXJuIG5ldyBIc2woaCwgcywgbCwgYSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc2xDb252ZXJ0KG8pIHtcbiAgaWYgKG8gaW5zdGFuY2VvZiBIc2wpIHJldHVybiBuZXcgSHNsKG8uaCwgby5zLCBvLmwsIG8ub3BhY2l0eSk7XG4gIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvcikpIG8gPSBjb2xvcihvKTtcbiAgaWYgKCFvKSByZXR1cm4gbmV3IEhzbDtcbiAgaWYgKG8gaW5zdGFuY2VvZiBIc2wpIHJldHVybiBvO1xuICBvID0gby5yZ2IoKTtcbiAgdmFyIHIgPSBvLnIgLyAyNTUsXG4gICAgICBnID0gby5nIC8gMjU1LFxuICAgICAgYiA9IG8uYiAvIDI1NSxcbiAgICAgIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpLFxuICAgICAgbWF4ID0gTWF0aC5tYXgociwgZywgYiksXG4gICAgICBoID0gTmFOLFxuICAgICAgcyA9IG1heCAtIG1pbixcbiAgICAgIGwgPSAobWF4ICsgbWluKSAvIDI7XG4gIGlmIChzKSB7XG4gICAgaWYgKHIgPT09IG1heCkgaCA9IChnIC0gYikgLyBzICsgKGcgPCBiKSAqIDY7XG4gICAgZWxzZSBpZiAoZyA9PT0gbWF4KSBoID0gKGIgLSByKSAvIHMgKyAyO1xuICAgIGVsc2UgaCA9IChyIC0gZykgLyBzICsgNDtcbiAgICBzIC89IGwgPCAwLjUgPyBtYXggKyBtaW4gOiAyIC0gbWF4IC0gbWluO1xuICAgIGggKj0gNjA7XG4gIH0gZWxzZSB7XG4gICAgcyA9IGwgPiAwICYmIGwgPCAxID8gMCA6IGg7XG4gIH1cbiAgcmV0dXJuIG5ldyBIc2woaCwgcywgbCwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhzbChoLCBzLCBsLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gaHNsQ29udmVydChoKSA6IG5ldyBIc2woaCwgcywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5mdW5jdGlvbiBIc2woaCwgcywgbCwgb3BhY2l0eSkge1xuICB0aGlzLmggPSAraDtcbiAgdGhpcy5zID0gK3M7XG4gIHRoaXMubCA9ICtsO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKEhzbCwgaHNsLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTtcbiAgICByZXR1cm4gbmV3IEhzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgZGFya2VyKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTtcbiAgICByZXR1cm4gbmV3IEhzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgcmdiKCkge1xuICAgIHZhciBoID0gdGhpcy5oICUgMzYwICsgKHRoaXMuaCA8IDApICogMzYwLFxuICAgICAgICBzID0gaXNOYU4oaCkgfHwgaXNOYU4odGhpcy5zKSA/IDAgOiB0aGlzLnMsXG4gICAgICAgIGwgPSB0aGlzLmwsXG4gICAgICAgIG0yID0gbCArIChsIDwgMC41ID8gbCA6IDEgLSBsKSAqIHMsXG4gICAgICAgIG0xID0gMiAqIGwgLSBtMjtcbiAgICByZXR1cm4gbmV3IFJnYihcbiAgICAgIGhzbDJyZ2IoaCA+PSAyNDAgPyBoIC0gMjQwIDogaCArIDEyMCwgbTEsIG0yKSxcbiAgICAgIGhzbDJyZ2IoaCwgbTEsIG0yKSxcbiAgICAgIGhzbDJyZ2IoaCA8IDEyMCA/IGggKyAyNDAgOiBoIC0gMTIwLCBtMSwgbTIpLFxuICAgICAgdGhpcy5vcGFjaXR5XG4gICAgKTtcbiAgfSxcbiAgY2xhbXAoKSB7XG4gICAgcmV0dXJuIG5ldyBIc2woY2xhbXBoKHRoaXMuaCksIGNsYW1wdCh0aGlzLnMpLCBjbGFtcHQodGhpcy5sKSwgY2xhbXBhKHRoaXMub3BhY2l0eSkpO1xuICB9LFxuICBkaXNwbGF5YWJsZSgpIHtcbiAgICByZXR1cm4gKDAgPD0gdGhpcy5zICYmIHRoaXMucyA8PSAxIHx8IGlzTmFOKHRoaXMucykpXG4gICAgICAgICYmICgwIDw9IHRoaXMubCAmJiB0aGlzLmwgPD0gMSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTtcbiAgfSxcbiAgZm9ybWF0SHNsKCkge1xuICAgIGNvbnN0IGEgPSBjbGFtcGEodGhpcy5vcGFjaXR5KTtcbiAgICByZXR1cm4gYCR7YSA9PT0gMSA/IFwiaHNsKFwiIDogXCJoc2xhKFwifSR7Y2xhbXBoKHRoaXMuaCl9LCAke2NsYW1wdCh0aGlzLnMpICogMTAwfSUsICR7Y2xhbXB0KHRoaXMubCkgKiAxMDB9JSR7YSA9PT0gMSA/IFwiKVwiIDogYCwgJHthfSlgfWA7XG4gIH1cbn0pKTtcblxuZnVuY3Rpb24gY2xhbXBoKHZhbHVlKSB7XG4gIHZhbHVlID0gKHZhbHVlIHx8IDApICUgMzYwO1xuICByZXR1cm4gdmFsdWUgPCAwID8gdmFsdWUgKyAzNjAgOiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gY2xhbXB0KHZhbHVlKSB7XG4gIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB2YWx1ZSB8fCAwKSk7XG59XG5cbi8qIEZyb20gRnZEIDEzLjM3LCBDU1MgQ29sb3IgTW9kdWxlIExldmVsIDMgKi9cbmZ1bmN0aW9uIGhzbDJyZ2IoaCwgbTEsIG0yKSB7XG4gIHJldHVybiAoaCA8IDYwID8gbTEgKyAobTIgLSBtMSkgKiBoIC8gNjBcbiAgICAgIDogaCA8IDE4MCA/IG0yXG4gICAgICA6IGggPCAyNDAgPyBtMSArIChtMiAtIG0xKSAqICgyNDAgLSBoKSAvIDYwXG4gICAgICA6IG0xKSAqIDI1NTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnN0cnVjdG9yLCBmYWN0b3J5LCBwcm90b3R5cGUpIHtcbiAgY29uc3RydWN0b3IucHJvdG90eXBlID0gZmFjdG9yeS5wcm90b3R5cGUgPSBwcm90b3R5cGU7XG4gIHByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKHBhcmVudCwgZGVmaW5pdGlvbikge1xuICB2YXIgcHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQucHJvdG90eXBlKTtcbiAgZm9yICh2YXIga2V5IGluIGRlZmluaXRpb24pIHByb3RvdHlwZVtrZXldID0gZGVmaW5pdGlvbltrZXldO1xuICByZXR1cm4gcHJvdG90eXBlO1xufVxuIiwiaW1wb3J0IGRlZmluZSwge2V4dGVuZH0gZnJvbSBcIi4vZGVmaW5lLmpzXCI7XG5pbXBvcnQge0NvbG9yLCByZ2JDb252ZXJ0LCBSZ2J9IGZyb20gXCIuL2NvbG9yLmpzXCI7XG5pbXBvcnQge2RlZ3JlZXMsIHJhZGlhbnN9IGZyb20gXCIuL21hdGguanNcIjtcblxuLy8gaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0BtYm9zdG9jay9sYWItYW5kLXJnYlxuY29uc3QgSyA9IDE4LFxuICAgIFhuID0gMC45NjQyMixcbiAgICBZbiA9IDEsXG4gICAgWm4gPSAwLjgyNTIxLFxuICAgIHQwID0gNCAvIDI5LFxuICAgIHQxID0gNiAvIDI5LFxuICAgIHQyID0gMyAqIHQxICogdDEsXG4gICAgdDMgPSB0MSAqIHQxICogdDE7XG5cbmZ1bmN0aW9uIGxhYkNvbnZlcnQobykge1xuICBpZiAobyBpbnN0YW5jZW9mIExhYikgcmV0dXJuIG5ldyBMYWIoby5sLCBvLmEsIG8uYiwgby5vcGFjaXR5KTtcbiAgaWYgKG8gaW5zdGFuY2VvZiBIY2wpIHJldHVybiBoY2wybGFiKG8pO1xuICBpZiAoIShvIGluc3RhbmNlb2YgUmdiKSkgbyA9IHJnYkNvbnZlcnQobyk7XG4gIHZhciByID0gcmdiMmxyZ2Ioby5yKSxcbiAgICAgIGcgPSByZ2IybHJnYihvLmcpLFxuICAgICAgYiA9IHJnYjJscmdiKG8uYiksXG4gICAgICB5ID0geHl6MmxhYigoMC4yMjI1MDQ1ICogciArIDAuNzE2ODc4NiAqIGcgKyAwLjA2MDYxNjkgKiBiKSAvIFluKSwgeCwgejtcbiAgaWYgKHIgPT09IGcgJiYgZyA9PT0gYikgeCA9IHogPSB5OyBlbHNlIHtcbiAgICB4ID0geHl6MmxhYigoMC40MzYwNzQ3ICogciArIDAuMzg1MDY0OSAqIGcgKyAwLjE0MzA4MDQgKiBiKSAvIFhuKTtcbiAgICB6ID0geHl6MmxhYigoMC4wMTM5MzIyICogciArIDAuMDk3MTA0NSAqIGcgKyAwLjcxNDE3MzMgKiBiKSAvIFpuKTtcbiAgfVxuICByZXR1cm4gbmV3IExhYigxMTYgKiB5IC0gMTYsIDUwMCAqICh4IC0geSksIDIwMCAqICh5IC0geiksIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBncmF5KGwsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIG5ldyBMYWIobCwgMCwgMCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsYWIobCwgYSwgYiwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGxhYkNvbnZlcnQobCkgOiBuZXcgTGFiKGwsIGEsIGIsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIExhYihsLCBhLCBiLCBvcGFjaXR5KSB7XG4gIHRoaXMubCA9ICtsO1xuICB0aGlzLmEgPSArYTtcbiAgdGhpcy5iID0gK2I7XG4gIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5O1xufVxuXG5kZWZpbmUoTGFiLCBsYWIsIGV4dGVuZChDb2xvciwge1xuICBicmlnaHRlcihrKSB7XG4gICAgcmV0dXJuIG5ldyBMYWIodGhpcy5sICsgSyAqIChrID09IG51bGwgPyAxIDogayksIHRoaXMuYSwgdGhpcy5iLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXIoaykge1xuICAgIHJldHVybiBuZXcgTGFiKHRoaXMubCAtIEsgKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgcmdiKCkge1xuICAgIHZhciB5ID0gKHRoaXMubCArIDE2KSAvIDExNixcbiAgICAgICAgeCA9IGlzTmFOKHRoaXMuYSkgPyB5IDogeSArIHRoaXMuYSAvIDUwMCxcbiAgICAgICAgeiA9IGlzTmFOKHRoaXMuYikgPyB5IDogeSAtIHRoaXMuYiAvIDIwMDtcbiAgICB4ID0gWG4gKiBsYWIyeHl6KHgpO1xuICAgIHkgPSBZbiAqIGxhYjJ4eXooeSk7XG4gICAgeiA9IFpuICogbGFiMnh5eih6KTtcbiAgICByZXR1cm4gbmV3IFJnYihcbiAgICAgIGxyZ2IycmdiKCAzLjEzMzg1NjEgKiB4IC0gMS42MTY4NjY3ICogeSAtIDAuNDkwNjE0NiAqIHopLFxuICAgICAgbHJnYjJyZ2IoLTAuOTc4NzY4NCAqIHggKyAxLjkxNjE0MTUgKiB5ICsgMC4wMzM0NTQwICogeiksXG4gICAgICBscmdiMnJnYiggMC4wNzE5NDUzICogeCAtIDAuMjI4OTkxNCAqIHkgKyAxLjQwNTI0MjcgKiB6KSxcbiAgICAgIHRoaXMub3BhY2l0eVxuICAgICk7XG4gIH1cbn0pKTtcblxuZnVuY3Rpb24geHl6MmxhYih0KSB7XG4gIHJldHVybiB0ID4gdDMgPyBNYXRoLnBvdyh0LCAxIC8gMykgOiB0IC8gdDIgKyB0MDtcbn1cblxuZnVuY3Rpb24gbGFiMnh5eih0KSB7XG4gIHJldHVybiB0ID4gdDEgPyB0ICogdCAqIHQgOiB0MiAqICh0IC0gdDApO1xufVxuXG5mdW5jdGlvbiBscmdiMnJnYih4KSB7XG4gIHJldHVybiAyNTUgKiAoeCA8PSAwLjAwMzEzMDggPyAxMi45MiAqIHggOiAxLjA1NSAqIE1hdGgucG93KHgsIDEgLyAyLjQpIC0gMC4wNTUpO1xufVxuXG5mdW5jdGlvbiByZ2IybHJnYih4KSB7XG4gIHJldHVybiAoeCAvPSAyNTUpIDw9IDAuMDQwNDUgPyB4IC8gMTIuOTIgOiBNYXRoLnBvdygoeCArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xufVxuXG5mdW5jdGlvbiBoY2xDb252ZXJ0KG8pIHtcbiAgaWYgKG8gaW5zdGFuY2VvZiBIY2wpIHJldHVybiBuZXcgSGNsKG8uaCwgby5jLCBvLmwsIG8ub3BhY2l0eSk7XG4gIGlmICghKG8gaW5zdGFuY2VvZiBMYWIpKSBvID0gbGFiQ29udmVydChvKTtcbiAgaWYgKG8uYSA9PT0gMCAmJiBvLmIgPT09IDApIHJldHVybiBuZXcgSGNsKE5hTiwgMCA8IG8ubCAmJiBvLmwgPCAxMDAgPyAwIDogTmFOLCBvLmwsIG8ub3BhY2l0eSk7XG4gIHZhciBoID0gTWF0aC5hdGFuMihvLmIsIG8uYSkgKiBkZWdyZWVzO1xuICByZXR1cm4gbmV3IEhjbChoIDwgMCA/IGggKyAzNjAgOiBoLCBNYXRoLnNxcnQoby5hICogby5hICsgby5iICogby5iKSwgby5sLCBvLm9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGNoKGwsIGMsIGgsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBoY2xDb252ZXJ0KGwpIDogbmV3IEhjbChoLCBjLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoY2woaCwgYywgbCwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhjbENvbnZlcnQoaCkgOiBuZXcgSGNsKGgsIGMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEhjbChoLCBjLCBsLCBvcGFjaXR5KSB7XG4gIHRoaXMuaCA9ICtoO1xuICB0aGlzLmMgPSArYztcbiAgdGhpcy5sID0gK2w7XG4gIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5O1xufVxuXG5mdW5jdGlvbiBoY2wybGFiKG8pIHtcbiAgaWYgKGlzTmFOKG8uaCkpIHJldHVybiBuZXcgTGFiKG8ubCwgMCwgMCwgby5vcGFjaXR5KTtcbiAgdmFyIGggPSBvLmggKiByYWRpYW5zO1xuICByZXR1cm4gbmV3IExhYihvLmwsIE1hdGguY29zKGgpICogby5jLCBNYXRoLnNpbihoKSAqIG8uYywgby5vcGFjaXR5KTtcbn1cblxuZGVmaW5lKEhjbCwgaGNsLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXIoaykge1xuICAgIHJldHVybiBuZXcgSGNsKHRoaXMuaCwgdGhpcy5jLCB0aGlzLmwgKyBLICogKGsgPT0gbnVsbCA/IDEgOiBrKSwgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgZGFya2VyKGspIHtcbiAgICByZXR1cm4gbmV3IEhjbCh0aGlzLmgsIHRoaXMuYywgdGhpcy5sIC0gSyAqIChrID09IG51bGwgPyAxIDogayksIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYigpIHtcbiAgICByZXR1cm4gaGNsMmxhYih0aGlzKS5yZ2IoKTtcbiAgfVxufSkpO1xuIiwiZXhwb3J0IGNvbnN0IHJhZGlhbnMgPSBNYXRoLlBJIC8gMTgwO1xuZXhwb3J0IGNvbnN0IGRlZ3JlZXMgPSAxODAgLyBNYXRoLlBJO1xuIiwidmFyIG5vb3AgPSB7dmFsdWU6ICgpID0+IHt9fTtcblxuZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aCwgXyA9IHt9LCB0OyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKCEodCA9IGFyZ3VtZW50c1tpXSArIFwiXCIpIHx8ICh0IGluIF8pIHx8IC9bXFxzLl0vLnRlc3QodCkpIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgdHlwZTogXCIgKyB0KTtcbiAgICBfW3RdID0gW107XG4gIH1cbiAgcmV0dXJuIG5ldyBEaXNwYXRjaChfKTtcbn1cblxuZnVuY3Rpb24gRGlzcGF0Y2goXykge1xuICB0aGlzLl8gPSBfO1xufVxuXG5mdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMsIHR5cGVzKSB7XG4gIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxccysvKS5tYXAoZnVuY3Rpb24odCkge1xuICAgIHZhciBuYW1lID0gXCJcIiwgaSA9IHQuaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKGkgPj0gMCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTtcbiAgICBpZiAodCAmJiAhdHlwZXMuaGFzT3duUHJvcGVydHkodCkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0KTtcbiAgICByZXR1cm4ge3R5cGU6IHQsIG5hbWU6IG5hbWV9O1xuICB9KTtcbn1cblxuRGlzcGF0Y2gucHJvdG90eXBlID0gZGlzcGF0Y2gucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRGlzcGF0Y2gsXG4gIG9uOiBmdW5jdGlvbih0eXBlbmFtZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgXyA9IHRoaXMuXyxcbiAgICAgICAgVCA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgXCJcIiwgXyksXG4gICAgICAgIHQsXG4gICAgICAgIGkgPSAtMSxcbiAgICAgICAgbiA9IFQubGVuZ3RoO1xuXG4gICAgLy8gSWYgbm8gY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBjYWxsYmFjayBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSAmJiAodCA9IGdldChfW3RdLCB0eXBlbmFtZS5uYW1lKSkpIHJldHVybiB0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIGEgdHlwZSB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS5cbiAgICAvLyBPdGhlcndpc2UsIGlmIGEgbnVsbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZW1vdmUgY2FsbGJhY2tzIG9mIHRoZSBnaXZlbiBuYW1lLlxuICAgIGlmIChjYWxsYmFjayAhPSBudWxsICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGNhbGxiYWNrOiBcIiArIGNhbGxiYWNrKTtcbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgaWYgKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIGNhbGxiYWNrKTtcbiAgICAgIGVsc2UgaWYgKGNhbGxiYWNrID09IG51bGwpIGZvciAodCBpbiBfKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIG51bGwpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBjb3B5OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY29weSA9IHt9LCBfID0gdGhpcy5fO1xuICAgIGZvciAodmFyIHQgaW4gXykgY29weVt0XSA9IF9bdF0uc2xpY2UoKTtcbiAgICByZXR1cm4gbmV3IERpc3BhdGNoKGNvcHkpO1xuICB9LFxuICBjYWxsOiBmdW5jdGlvbih0eXBlLCB0aGF0KSB7XG4gICAgaWYgKChuID0gYXJndW1lbnRzLmxlbmd0aCAtIDIpID4gMCkgZm9yICh2YXIgYXJncyA9IG5ldyBBcnJheShuKSwgaSA9IDAsIG4sIHQ7IGkgPCBuOyArK2kpIGFyZ3NbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgZm9yICh0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24odHlwZSwgdGhhdCwgYXJncykge1xuICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgZm9yICh2YXIgdCA9IHRoaXMuX1t0eXBlXSwgaSA9IDAsIG4gPSB0Lmxlbmd0aDsgaSA8IG47ICsraSkgdFtpXS52YWx1ZS5hcHBseSh0aGF0LCBhcmdzKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0KHR5cGUsIG5hbWUpIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aCwgYzsgaSA8IG47ICsraSkge1xuICAgIGlmICgoYyA9IHR5cGVbaV0pLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHJldHVybiBjLnZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXQodHlwZSwgbmFtZSwgY2FsbGJhY2spIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgIGlmICh0eXBlW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHR5cGVbaV0gPSBub29wLCB0eXBlID0gdHlwZS5zbGljZSgwLCBpKS5jb25jYXQodHlwZS5zbGljZShpICsgMSkpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChjYWxsYmFjayAhPSBudWxsKSB0eXBlLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiBjYWxsYmFja30pO1xuICByZXR1cm4gdHlwZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGlzcGF0Y2g7XG4iLCJpbXBvcnQge3NlbGVjdH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IG5vZXZlbnQsIHtub25wYXNzaXZlY2FwdHVyZX0gZnJvbSBcIi4vbm9ldmVudC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2aWV3KSB7XG4gIHZhciByb290ID0gdmlldy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgICBzZWxlY3Rpb24gPSBzZWxlY3Qodmlldykub24oXCJkcmFnc3RhcnQuZHJhZ1wiLCBub2V2ZW50LCBub25wYXNzaXZlY2FwdHVyZSk7XG4gIGlmIChcIm9uc2VsZWN0c3RhcnRcIiBpbiByb290KSB7XG4gICAgc2VsZWN0aW9uLm9uKFwic2VsZWN0c3RhcnQuZHJhZ1wiLCBub2V2ZW50LCBub25wYXNzaXZlY2FwdHVyZSk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5fX25vc2VsZWN0ID0gcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0O1xuICAgIHJvb3Quc3R5bGUuTW96VXNlclNlbGVjdCA9IFwibm9uZVwiO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB5ZXNkcmFnKHZpZXcsIG5vY2xpY2spIHtcbiAgdmFyIHJvb3QgPSB2aWV3LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdCh2aWV3KS5vbihcImRyYWdzdGFydC5kcmFnXCIsIG51bGwpO1xuICBpZiAobm9jbGljaykge1xuICAgIHNlbGVjdGlvbi5vbihcImNsaWNrLmRyYWdcIiwgbm9ldmVudCwgbm9ucGFzc2l2ZWNhcHR1cmUpO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHNlbGVjdGlvbi5vbihcImNsaWNrLmRyYWdcIiwgbnVsbCk7IH0sIDApO1xuICB9XG4gIGlmIChcIm9uc2VsZWN0c3RhcnRcIiBpbiByb290KSB7XG4gICAgc2VsZWN0aW9uLm9uKFwic2VsZWN0c3RhcnQuZHJhZ1wiLCBudWxsKTtcbiAgfSBlbHNlIHtcbiAgICByb290LnN0eWxlLk1velVzZXJTZWxlY3QgPSByb290Ll9fbm9zZWxlY3Q7XG4gICAgZGVsZXRlIHJvb3QuX19ub3NlbGVjdDtcbiAgfVxufVxuIiwiLy8gVGhlc2UgYXJlIHR5cGljYWxseSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggbm9ldmVudCB0byBlbnN1cmUgdGhhdCB3ZSBjYW5cbi8vIHByZXZlbnREZWZhdWx0IG9uIHRoZSBldmVudC5cbmV4cG9ydCBjb25zdCBub25wYXNzaXZlID0ge3Bhc3NpdmU6IGZhbHNlfTtcbmV4cG9ydCBjb25zdCBub25wYXNzaXZlY2FwdHVyZSA9IHtjYXB0dXJlOiB0cnVlLCBwYXNzaXZlOiBmYWxzZX07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3Byb3BhZ2F0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cbiIsImltcG9ydCBkc3YgZnJvbSBcIi4vZHN2LmpzXCI7XG5cbnZhciBjc3YgPSBkc3YoXCIsXCIpO1xuXG5leHBvcnQgdmFyIGNzdlBhcnNlID0gY3N2LnBhcnNlO1xuZXhwb3J0IHZhciBjc3ZQYXJzZVJvd3MgPSBjc3YucGFyc2VSb3dzO1xuZXhwb3J0IHZhciBjc3ZGb3JtYXQgPSBjc3YuZm9ybWF0O1xuZXhwb3J0IHZhciBjc3ZGb3JtYXRCb2R5ID0gY3N2LmZvcm1hdEJvZHk7XG5leHBvcnQgdmFyIGNzdkZvcm1hdFJvd3MgPSBjc3YuZm9ybWF0Um93cztcbmV4cG9ydCB2YXIgY3N2Rm9ybWF0Um93ID0gY3N2LmZvcm1hdFJvdztcbmV4cG9ydCB2YXIgY3N2Rm9ybWF0VmFsdWUgPSBjc3YuZm9ybWF0VmFsdWU7XG4iLCJ2YXIgRU9MID0ge30sXG4gICAgRU9GID0ge30sXG4gICAgUVVPVEUgPSAzNCxcbiAgICBORVdMSU5FID0gMTAsXG4gICAgUkVUVVJOID0gMTM7XG5cbmZ1bmN0aW9uIG9iamVjdENvbnZlcnRlcihjb2x1bW5zKSB7XG4gIHJldHVybiBuZXcgRnVuY3Rpb24oXCJkXCIsIFwicmV0dXJuIHtcIiArIGNvbHVtbnMubWFwKGZ1bmN0aW9uKG5hbWUsIGkpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobmFtZSkgKyBcIjogZFtcIiArIGkgKyBcIl0gfHwgXFxcIlxcXCJcIjtcbiAgfSkuam9pbihcIixcIikgKyBcIn1cIik7XG59XG5cbmZ1bmN0aW9uIGN1c3RvbUNvbnZlcnRlcihjb2x1bW5zLCBmKSB7XG4gIHZhciBvYmplY3QgPSBvYmplY3RDb252ZXJ0ZXIoY29sdW1ucyk7XG4gIHJldHVybiBmdW5jdGlvbihyb3csIGkpIHtcbiAgICByZXR1cm4gZihvYmplY3Qocm93KSwgaSwgY29sdW1ucyk7XG4gIH07XG59XG5cbi8vIENvbXB1dGUgdW5pcXVlIGNvbHVtbnMgaW4gb3JkZXIgb2YgZGlzY292ZXJ5LlxuZnVuY3Rpb24gaW5mZXJDb2x1bW5zKHJvd3MpIHtcbiAgdmFyIGNvbHVtblNldCA9IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICBjb2x1bW5zID0gW107XG5cbiAgcm93cy5mb3JFYWNoKGZ1bmN0aW9uKHJvdykge1xuICAgIGZvciAodmFyIGNvbHVtbiBpbiByb3cpIHtcbiAgICAgIGlmICghKGNvbHVtbiBpbiBjb2x1bW5TZXQpKSB7XG4gICAgICAgIGNvbHVtbnMucHVzaChjb2x1bW5TZXRbY29sdW1uXSA9IGNvbHVtbik7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY29sdW1ucztcbn1cblxuZnVuY3Rpb24gcGFkKHZhbHVlLCB3aWR0aCkge1xuICB2YXIgcyA9IHZhbHVlICsgXCJcIiwgbGVuZ3RoID0gcy5sZW5ndGg7XG4gIHJldHVybiBsZW5ndGggPCB3aWR0aCA/IG5ldyBBcnJheSh3aWR0aCAtIGxlbmd0aCArIDEpLmpvaW4oMCkgKyBzIDogcztcbn1cblxuZnVuY3Rpb24gZm9ybWF0WWVhcih5ZWFyKSB7XG4gIHJldHVybiB5ZWFyIDwgMCA/IFwiLVwiICsgcGFkKC15ZWFyLCA2KVxuICAgIDogeWVhciA+IDk5OTkgPyBcIitcIiArIHBhZCh5ZWFyLCA2KVxuICAgIDogcGFkKHllYXIsIDQpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXREYXRlKGRhdGUpIHtcbiAgdmFyIGhvdXJzID0gZGF0ZS5nZXRVVENIb3VycygpLFxuICAgICAgbWludXRlcyA9IGRhdGUuZ2V0VVRDTWludXRlcygpLFxuICAgICAgc2Vjb25kcyA9IGRhdGUuZ2V0VVRDU2Vjb25kcygpLFxuICAgICAgbWlsbGlzZWNvbmRzID0gZGF0ZS5nZXRVVENNaWxsaXNlY29uZHMoKTtcbiAgcmV0dXJuIGlzTmFOKGRhdGUpID8gXCJJbnZhbGlkIERhdGVcIlxuICAgICAgOiBmb3JtYXRZZWFyKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSwgNCkgKyBcIi1cIiArIHBhZChkYXRlLmdldFVUQ01vbnRoKCkgKyAxLCAyKSArIFwiLVwiICsgcGFkKGRhdGUuZ2V0VVRDRGF0ZSgpLCAyKVxuICAgICAgKyAobWlsbGlzZWNvbmRzID8gXCJUXCIgKyBwYWQoaG91cnMsIDIpICsgXCI6XCIgKyBwYWQobWludXRlcywgMikgKyBcIjpcIiArIHBhZChzZWNvbmRzLCAyKSArIFwiLlwiICsgcGFkKG1pbGxpc2Vjb25kcywgMykgKyBcIlpcIlxuICAgICAgOiBzZWNvbmRzID8gXCJUXCIgKyBwYWQoaG91cnMsIDIpICsgXCI6XCIgKyBwYWQobWludXRlcywgMikgKyBcIjpcIiArIHBhZChzZWNvbmRzLCAyKSArIFwiWlwiXG4gICAgICA6IG1pbnV0ZXMgfHwgaG91cnMgPyBcIlRcIiArIHBhZChob3VycywgMikgKyBcIjpcIiArIHBhZChtaW51dGVzLCAyKSArIFwiWlwiXG4gICAgICA6IFwiXCIpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihkZWxpbWl0ZXIpIHtcbiAgdmFyIHJlRm9ybWF0ID0gbmV3IFJlZ0V4cChcIltcXFwiXCIgKyBkZWxpbWl0ZXIgKyBcIlxcblxccl1cIiksXG4gICAgICBERUxJTUlURVIgPSBkZWxpbWl0ZXIuY2hhckNvZGVBdCgwKTtcblxuICBmdW5jdGlvbiBwYXJzZSh0ZXh0LCBmKSB7XG4gICAgdmFyIGNvbnZlcnQsIGNvbHVtbnMsIHJvd3MgPSBwYXJzZVJvd3ModGV4dCwgZnVuY3Rpb24ocm93LCBpKSB7XG4gICAgICBpZiAoY29udmVydCkgcmV0dXJuIGNvbnZlcnQocm93LCBpIC0gMSk7XG4gICAgICBjb2x1bW5zID0gcm93LCBjb252ZXJ0ID0gZiA/IGN1c3RvbUNvbnZlcnRlcihyb3csIGYpIDogb2JqZWN0Q29udmVydGVyKHJvdyk7XG4gICAgfSk7XG4gICAgcm93cy5jb2x1bW5zID0gY29sdW1ucyB8fCBbXTtcbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlUm93cyh0ZXh0LCBmKSB7XG4gICAgdmFyIHJvd3MgPSBbXSwgLy8gb3V0cHV0IHJvd3NcbiAgICAgICAgTiA9IHRleHQubGVuZ3RoLFxuICAgICAgICBJID0gMCwgLy8gY3VycmVudCBjaGFyYWN0ZXIgaW5kZXhcbiAgICAgICAgbiA9IDAsIC8vIGN1cnJlbnQgbGluZSBudW1iZXJcbiAgICAgICAgdCwgLy8gY3VycmVudCB0b2tlblxuICAgICAgICBlb2YgPSBOIDw9IDAsIC8vIGN1cnJlbnQgdG9rZW4gZm9sbG93ZWQgYnkgRU9GP1xuICAgICAgICBlb2wgPSBmYWxzZTsgLy8gY3VycmVudCB0b2tlbiBmb2xsb3dlZCBieSBFT0w/XG5cbiAgICAvLyBTdHJpcCB0aGUgdHJhaWxpbmcgbmV3bGluZS5cbiAgICBpZiAodGV4dC5jaGFyQ29kZUF0KE4gLSAxKSA9PT0gTkVXTElORSkgLS1OO1xuICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoTiAtIDEpID09PSBSRVRVUk4pIC0tTjtcblxuICAgIGZ1bmN0aW9uIHRva2VuKCkge1xuICAgICAgaWYgKGVvZikgcmV0dXJuIEVPRjtcbiAgICAgIGlmIChlb2wpIHJldHVybiBlb2wgPSBmYWxzZSwgRU9MO1xuXG4gICAgICAvLyBVbmVzY2FwZSBxdW90ZXMuXG4gICAgICB2YXIgaSwgaiA9IEksIGM7XG4gICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGopID09PSBRVU9URSkge1xuICAgICAgICB3aGlsZSAoSSsrIDwgTiAmJiB0ZXh0LmNoYXJDb2RlQXQoSSkgIT09IFFVT1RFIHx8IHRleHQuY2hhckNvZGVBdCgrK0kpID09PSBRVU9URSk7XG4gICAgICAgIGlmICgoaSA9IEkpID49IE4pIGVvZiA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKChjID0gdGV4dC5jaGFyQ29kZUF0KEkrKykpID09PSBORVdMSU5FKSBlb2wgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmIChjID09PSBSRVRVUk4pIHsgZW9sID0gdHJ1ZTsgaWYgKHRleHQuY2hhckNvZGVBdChJKSA9PT0gTkVXTElORSkgKytJOyB9XG4gICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKGogKyAxLCBpIC0gMSkucmVwbGFjZSgvXCJcIi9nLCBcIlxcXCJcIik7XG4gICAgICB9XG5cbiAgICAgIC8vIEZpbmQgbmV4dCBkZWxpbWl0ZXIgb3IgbmV3bGluZS5cbiAgICAgIHdoaWxlIChJIDwgTikge1xuICAgICAgICBpZiAoKGMgPSB0ZXh0LmNoYXJDb2RlQXQoaSA9IEkrKykpID09PSBORVdMSU5FKSBlb2wgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmIChjID09PSBSRVRVUk4pIHsgZW9sID0gdHJ1ZTsgaWYgKHRleHQuY2hhckNvZGVBdChJKSA9PT0gTkVXTElORSkgKytJOyB9XG4gICAgICAgIGVsc2UgaWYgKGMgIT09IERFTElNSVRFUikgY29udGludWU7XG4gICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKGosIGkpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXR1cm4gbGFzdCB0b2tlbiBiZWZvcmUgRU9GLlxuICAgICAgcmV0dXJuIGVvZiA9IHRydWUsIHRleHQuc2xpY2UoaiwgTik7XG4gICAgfVxuXG4gICAgd2hpbGUgKCh0ID0gdG9rZW4oKSkgIT09IEVPRikge1xuICAgICAgdmFyIHJvdyA9IFtdO1xuICAgICAgd2hpbGUgKHQgIT09IEVPTCAmJiB0ICE9PSBFT0YpIHJvdy5wdXNoKHQpLCB0ID0gdG9rZW4oKTtcbiAgICAgIGlmIChmICYmIChyb3cgPSBmKHJvdywgbisrKSkgPT0gbnVsbCkgY29udGludWU7XG4gICAgICByb3dzLnB1c2gocm93KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHByZWZvcm1hdEJvZHkocm93cywgY29sdW1ucykge1xuICAgIHJldHVybiByb3dzLm1hcChmdW5jdGlvbihyb3cpIHtcbiAgICAgIHJldHVybiBjb2x1bW5zLm1hcChmdW5jdGlvbihjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdFZhbHVlKHJvd1tjb2x1bW5dKTtcbiAgICAgIH0pLmpvaW4oZGVsaW1pdGVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdChyb3dzLCBjb2x1bW5zKSB7XG4gICAgaWYgKGNvbHVtbnMgPT0gbnVsbCkgY29sdW1ucyA9IGluZmVyQ29sdW1ucyhyb3dzKTtcbiAgICByZXR1cm4gW2NvbHVtbnMubWFwKGZvcm1hdFZhbHVlKS5qb2luKGRlbGltaXRlcildLmNvbmNhdChwcmVmb3JtYXRCb2R5KHJvd3MsIGNvbHVtbnMpKS5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0Qm9keShyb3dzLCBjb2x1bW5zKSB7XG4gICAgaWYgKGNvbHVtbnMgPT0gbnVsbCkgY29sdW1ucyA9IGluZmVyQ29sdW1ucyhyb3dzKTtcbiAgICByZXR1cm4gcHJlZm9ybWF0Qm9keShyb3dzLCBjb2x1bW5zKS5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0Um93cyhyb3dzKSB7XG4gICAgcmV0dXJuIHJvd3MubWFwKGZvcm1hdFJvdykuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFJvdyhyb3cpIHtcbiAgICByZXR1cm4gcm93Lm1hcChmb3JtYXRWYWx1ZSkuam9pbihkZWxpbWl0ZXIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0VmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IFwiXCJcbiAgICAgICAgOiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyBmb3JtYXREYXRlKHZhbHVlKVxuICAgICAgICA6IHJlRm9ybWF0LnRlc3QodmFsdWUgKz0gXCJcIikgPyBcIlxcXCJcIiArIHZhbHVlLnJlcGxhY2UoL1wiL2csIFwiXFxcIlxcXCJcIikgKyBcIlxcXCJcIlxuICAgICAgICA6IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYXJzZTogcGFyc2UsXG4gICAgcGFyc2VSb3dzOiBwYXJzZVJvd3MsXG4gICAgZm9ybWF0OiBmb3JtYXQsXG4gICAgZm9ybWF0Qm9keTogZm9ybWF0Qm9keSxcbiAgICBmb3JtYXRSb3dzOiBmb3JtYXRSb3dzLFxuICAgIGZvcm1hdFJvdzogZm9ybWF0Um93LFxuICAgIGZvcm1hdFZhbHVlOiBmb3JtYXRWYWx1ZVxuICB9O1xufVxuIiwiaW1wb3J0IGRzdiBmcm9tIFwiLi9kc3YuanNcIjtcblxudmFyIHRzdiA9IGRzdihcIlxcdFwiKTtcblxuZXhwb3J0IHZhciB0c3ZQYXJzZSA9IHRzdi5wYXJzZTtcbmV4cG9ydCB2YXIgdHN2UGFyc2VSb3dzID0gdHN2LnBhcnNlUm93cztcbmV4cG9ydCB2YXIgdHN2Rm9ybWF0ID0gdHN2LmZvcm1hdDtcbmV4cG9ydCB2YXIgdHN2Rm9ybWF0Qm9keSA9IHRzdi5mb3JtYXRCb2R5O1xuZXhwb3J0IHZhciB0c3ZGb3JtYXRSb3dzID0gdHN2LmZvcm1hdFJvd3M7XG5leHBvcnQgdmFyIHRzdkZvcm1hdFJvdyA9IHRzdi5mb3JtYXRSb3c7XG5leHBvcnQgdmFyIHRzdkZvcm1hdFZhbHVlID0gdHN2LmZvcm1hdFZhbHVlO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGN1YmljSW4odCkge1xuICByZXR1cm4gdCAqIHQgKiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3ViaWNPdXQodCkge1xuICByZXR1cm4gLS10ICogdCAqIHQgKyAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3ViaWNJbk91dCh0KSB7XG4gIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHQgKiB0ICogdCA6ICh0IC09IDIpICogdCAqIHQgKyAyKSAvIDI7XG59XG4iLCJpbXBvcnQge2NzdlBhcnNlLCBkc3ZGb3JtYXQsIHRzdlBhcnNlfSBmcm9tIFwiZDMtZHN2XCI7XG5pbXBvcnQgdGV4dCBmcm9tIFwiLi90ZXh0LmpzXCI7XG5cbmZ1bmN0aW9uIGRzdlBhcnNlKHBhcnNlKSB7XG4gIHJldHVybiBmdW5jdGlvbihpbnB1dCwgaW5pdCwgcm93KSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgdHlwZW9mIGluaXQgPT09IFwiZnVuY3Rpb25cIikgcm93ID0gaW5pdCwgaW5pdCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGV4dChpbnB1dCwgaW5pdCkudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHBhcnNlKHJlc3BvbnNlLCByb3cpO1xuICAgIH0pO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkc3YoZGVsaW1pdGVyLCBpbnB1dCwgaW5pdCwgcm93KSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiBpbml0ID09PSBcImZ1bmN0aW9uXCIpIHJvdyA9IGluaXQsIGluaXQgPSB1bmRlZmluZWQ7XG4gIHZhciBmb3JtYXQgPSBkc3ZGb3JtYXQoZGVsaW1pdGVyKTtcbiAgcmV0dXJuIHRleHQoaW5wdXQsIGluaXQpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICByZXR1cm4gZm9ybWF0LnBhcnNlKHJlc3BvbnNlLCByb3cpO1xuICB9KTtcbn1cblxuZXhwb3J0IHZhciBjc3YgPSBkc3ZQYXJzZShjc3ZQYXJzZSk7XG5leHBvcnQgdmFyIHRzdiA9IGRzdlBhcnNlKHRzdlBhcnNlKTtcbiIsImZ1bmN0aW9uIHJlc3BvbnNlSnNvbihyZXNwb25zZSkge1xuICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzICsgXCIgXCIgKyByZXNwb25zZS5zdGF0dXNUZXh0KTtcbiAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA0IHx8IHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA1KSByZXR1cm47XG4gIHJldHVybiByZXNwb25zZS5qc29uKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGlucHV0LCBpbml0KSB7XG4gIHJldHVybiBmZXRjaChpbnB1dCwgaW5pdCkudGhlbihyZXNwb25zZUpzb24pO1xufVxuIiwiZnVuY3Rpb24gcmVzcG9uc2VUZXh0KHJlc3BvbnNlKSB7XG4gIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXMgKyBcIiBcIiArIHJlc3BvbnNlLnN0YXR1c1RleHQpO1xuICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnB1dCwgaW5pdCkge1xuICByZXR1cm4gZmV0Y2goaW5wdXQsIGluaXQpLnRoZW4ocmVzcG9uc2VUZXh0KTtcbn1cbiIsImltcG9ydCBmb3JtYXRMb2NhbGUgZnJvbSBcIi4vbG9jYWxlLmpzXCI7XG5cbnZhciBsb2NhbGU7XG5leHBvcnQgdmFyIGZvcm1hdDtcbmV4cG9ydCB2YXIgZm9ybWF0UHJlZml4O1xuXG5kZWZhdWx0TG9jYWxlKHtcbiAgdGhvdXNhbmRzOiBcIixcIixcbiAgZ3JvdXBpbmc6IFszXSxcbiAgY3VycmVuY3k6IFtcIiRcIiwgXCJcIl1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZWZhdWx0TG9jYWxlKGRlZmluaXRpb24pIHtcbiAgbG9jYWxlID0gZm9ybWF0TG9jYWxlKGRlZmluaXRpb24pO1xuICBmb3JtYXQgPSBsb2NhbGUuZm9ybWF0O1xuICBmb3JtYXRQcmVmaXggPSBsb2NhbGUuZm9ybWF0UHJlZml4O1xuICByZXR1cm4gbG9jYWxlO1xufVxuIiwiaW1wb3J0IHtmb3JtYXREZWNpbWFsUGFydHN9IGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4geCA9IGZvcm1hdERlY2ltYWxQYXJ0cyhNYXRoLmFicyh4KSksIHggPyB4WzFdIDogTmFOO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gTWF0aC5hYnMoeCA9IE1hdGgucm91bmQoeCkpID49IDFlMjFcbiAgICAgID8geC50b0xvY2FsZVN0cmluZyhcImVuXCIpLnJlcGxhY2UoLywvZywgXCJcIilcbiAgICAgIDogeC50b1N0cmluZygxMCk7XG59XG5cbi8vIENvbXB1dGVzIHRoZSBkZWNpbWFsIGNvZWZmaWNpZW50IGFuZCBleHBvbmVudCBvZiB0aGUgc3BlY2lmaWVkIG51bWJlciB4IHdpdGhcbi8vIHNpZ25pZmljYW50IGRpZ2l0cyBwLCB3aGVyZSB4IGlzIHBvc2l0aXZlIGFuZCBwIGlzIGluIFsxLCAyMV0gb3IgdW5kZWZpbmVkLlxuLy8gRm9yIGV4YW1wbGUsIGZvcm1hdERlY2ltYWxQYXJ0cygxLjIzKSByZXR1cm5zIFtcIjEyM1wiLCAwXS5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREZWNpbWFsUGFydHMoeCwgcCkge1xuICBpZiAoKGkgPSAoeCA9IHAgPyB4LnRvRXhwb25lbnRpYWwocCAtIDEpIDogeC50b0V4cG9uZW50aWFsKCkpLmluZGV4T2YoXCJlXCIpKSA8IDApIHJldHVybiBudWxsOyAvLyBOYU4sIMKxSW5maW5pdHlcbiAgdmFyIGksIGNvZWZmaWNpZW50ID0geC5zbGljZSgwLCBpKTtcblxuICAvLyBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRvRXhwb25lbnRpYWwgZWl0aGVyIGhhcyB0aGUgZm9ybSBcXGRcXC5cXGQrZVstK11cXGQrXG4gIC8vIChlLmcuLCAxLjJlKzMpIG9yIHRoZSBmb3JtIFxcZGVbLStdXFxkKyAoZS5nLiwgMWUrMykuXG4gIHJldHVybiBbXG4gICAgY29lZmZpY2llbnQubGVuZ3RoID4gMSA/IGNvZWZmaWNpZW50WzBdICsgY29lZmZpY2llbnQuc2xpY2UoMikgOiBjb2VmZmljaWVudCxcbiAgICAreC5zbGljZShpICsgMSlcbiAgXTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGdyb3VwaW5nLCB0aG91c2FuZHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCB3aWR0aCkge1xuICAgIHZhciBpID0gdmFsdWUubGVuZ3RoLFxuICAgICAgICB0ID0gW10sXG4gICAgICAgIGogPSAwLFxuICAgICAgICBnID0gZ3JvdXBpbmdbMF0sXG4gICAgICAgIGxlbmd0aCA9IDA7XG5cbiAgICB3aGlsZSAoaSA+IDAgJiYgZyA+IDApIHtcbiAgICAgIGlmIChsZW5ndGggKyBnICsgMSA+IHdpZHRoKSBnID0gTWF0aC5tYXgoMSwgd2lkdGggLSBsZW5ndGgpO1xuICAgICAgdC5wdXNoKHZhbHVlLnN1YnN0cmluZyhpIC09IGcsIGkgKyBnKSk7XG4gICAgICBpZiAoKGxlbmd0aCArPSBnICsgMSkgPiB3aWR0aCkgYnJlYWs7XG4gICAgICBnID0gZ3JvdXBpbmdbaiA9IChqICsgMSkgJSBncm91cGluZy5sZW5ndGhdO1xuICAgIH1cblxuICAgIHJldHVybiB0LnJldmVyc2UoKS5qb2luKHRob3VzYW5kcyk7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihudW1lcmFscykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvWzAtOV0vZywgZnVuY3Rpb24oaSkge1xuICAgICAgcmV0dXJuIG51bWVyYWxzWytpXTtcbiAgICB9KTtcbiAgfTtcbn1cbiIsImltcG9ydCB7Zm9ybWF0RGVjaW1hbFBhcnRzfSBmcm9tIFwiLi9mb3JtYXREZWNpbWFsLmpzXCI7XG5cbmV4cG9ydCB2YXIgcHJlZml4RXhwb25lbnQ7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgsIHApIHtcbiAgdmFyIGQgPSBmb3JtYXREZWNpbWFsUGFydHMoeCwgcCk7XG4gIGlmICghZCkgcmV0dXJuIHggKyBcIlwiO1xuICB2YXIgY29lZmZpY2llbnQgPSBkWzBdLFxuICAgICAgZXhwb25lbnQgPSBkWzFdLFxuICAgICAgaSA9IGV4cG9uZW50IC0gKHByZWZpeEV4cG9uZW50ID0gTWF0aC5tYXgoLTgsIE1hdGgubWluKDgsIE1hdGguZmxvb3IoZXhwb25lbnQgLyAzKSkpICogMykgKyAxLFxuICAgICAgbiA9IGNvZWZmaWNpZW50Lmxlbmd0aDtcbiAgcmV0dXJuIGkgPT09IG4gPyBjb2VmZmljaWVudFxuICAgICAgOiBpID4gbiA/IGNvZWZmaWNpZW50ICsgbmV3IEFycmF5KGkgLSBuICsgMSkuam9pbihcIjBcIilcbiAgICAgIDogaSA+IDAgPyBjb2VmZmljaWVudC5zbGljZSgwLCBpKSArIFwiLlwiICsgY29lZmZpY2llbnQuc2xpY2UoaSlcbiAgICAgIDogXCIwLlwiICsgbmV3IEFycmF5KDEgLSBpKS5qb2luKFwiMFwiKSArIGZvcm1hdERlY2ltYWxQYXJ0cyh4LCBNYXRoLm1heCgwLCBwICsgaSAtIDEpKVswXTsgLy8gbGVzcyB0aGFuIDF5IVxufVxuIiwiaW1wb3J0IHtmb3JtYXREZWNpbWFsUGFydHN9IGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCwgcCkge1xuICB2YXIgZCA9IGZvcm1hdERlY2ltYWxQYXJ0cyh4LCBwKTtcbiAgaWYgKCFkKSByZXR1cm4geCArIFwiXCI7XG4gIHZhciBjb2VmZmljaWVudCA9IGRbMF0sXG4gICAgICBleHBvbmVudCA9IGRbMV07XG4gIHJldHVybiBleHBvbmVudCA8IDAgPyBcIjAuXCIgKyBuZXcgQXJyYXkoLWV4cG9uZW50KS5qb2luKFwiMFwiKSArIGNvZWZmaWNpZW50XG4gICAgICA6IGNvZWZmaWNpZW50Lmxlbmd0aCA+IGV4cG9uZW50ICsgMSA/IGNvZWZmaWNpZW50LnNsaWNlKDAsIGV4cG9uZW50ICsgMSkgKyBcIi5cIiArIGNvZWZmaWNpZW50LnNsaWNlKGV4cG9uZW50ICsgMSlcbiAgICAgIDogY29lZmZpY2llbnQgKyBuZXcgQXJyYXkoZXhwb25lbnQgLSBjb2VmZmljaWVudC5sZW5ndGggKyAyKS5qb2luKFwiMFwiKTtcbn1cbiIsIi8vIFtbZmlsbF1hbGlnbl1bc2lnbl1bc3ltYm9sXVswXVt3aWR0aF1bLF1bLnByZWNpc2lvbl1bfl1bdHlwZV1cbnZhciByZSA9IC9eKD86KC4pPyhbPD49Xl0pKT8oWytcXC0oIF0pPyhbJCNdKT8oMCk/KFxcZCspPygsKT8oXFwuXFxkKyk/KH4pPyhbYS16JV0pPyQvaTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcikge1xuICBpZiAoIShtYXRjaCA9IHJlLmV4ZWMoc3BlY2lmaWVyKSkpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgZm9ybWF0OiBcIiArIHNwZWNpZmllcik7XG4gIHZhciBtYXRjaDtcbiAgcmV0dXJuIG5ldyBGb3JtYXRTcGVjaWZpZXIoe1xuICAgIGZpbGw6IG1hdGNoWzFdLFxuICAgIGFsaWduOiBtYXRjaFsyXSxcbiAgICBzaWduOiBtYXRjaFszXSxcbiAgICBzeW1ib2w6IG1hdGNoWzRdLFxuICAgIHplcm86IG1hdGNoWzVdLFxuICAgIHdpZHRoOiBtYXRjaFs2XSxcbiAgICBjb21tYTogbWF0Y2hbN10sXG4gICAgcHJlY2lzaW9uOiBtYXRjaFs4XSAmJiBtYXRjaFs4XS5zbGljZSgxKSxcbiAgICB0cmltOiBtYXRjaFs5XSxcbiAgICB0eXBlOiBtYXRjaFsxMF1cbiAgfSk7XG59XG5cbmZvcm1hdFNwZWNpZmllci5wcm90b3R5cGUgPSBGb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlOyAvLyBpbnN0YW5jZW9mXG5cbmV4cG9ydCBmdW5jdGlvbiBGb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSB7XG4gIHRoaXMuZmlsbCA9IHNwZWNpZmllci5maWxsID09PSB1bmRlZmluZWQgPyBcIiBcIiA6IHNwZWNpZmllci5maWxsICsgXCJcIjtcbiAgdGhpcy5hbGlnbiA9IHNwZWNpZmllci5hbGlnbiA9PT0gdW5kZWZpbmVkID8gXCI+XCIgOiBzcGVjaWZpZXIuYWxpZ24gKyBcIlwiO1xuICB0aGlzLnNpZ24gPSBzcGVjaWZpZXIuc2lnbiA9PT0gdW5kZWZpbmVkID8gXCItXCIgOiBzcGVjaWZpZXIuc2lnbiArIFwiXCI7XG4gIHRoaXMuc3ltYm9sID0gc3BlY2lmaWVyLnN5bWJvbCA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IHNwZWNpZmllci5zeW1ib2wgKyBcIlwiO1xuICB0aGlzLnplcm8gPSAhIXNwZWNpZmllci56ZXJvO1xuICB0aGlzLndpZHRoID0gc3BlY2lmaWVyLndpZHRoID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiArc3BlY2lmaWVyLndpZHRoO1xuICB0aGlzLmNvbW1hID0gISFzcGVjaWZpZXIuY29tbWE7XG4gIHRoaXMucHJlY2lzaW9uID0gc3BlY2lmaWVyLnByZWNpc2lvbiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogK3NwZWNpZmllci5wcmVjaXNpb247XG4gIHRoaXMudHJpbSA9ICEhc3BlY2lmaWVyLnRyaW07XG4gIHRoaXMudHlwZSA9IHNwZWNpZmllci50eXBlID09PSB1bmRlZmluZWQgPyBcIlwiIDogc3BlY2lmaWVyLnR5cGUgKyBcIlwiO1xufVxuXG5Gb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmZpbGxcbiAgICAgICsgdGhpcy5hbGlnblxuICAgICAgKyB0aGlzLnNpZ25cbiAgICAgICsgdGhpcy5zeW1ib2xcbiAgICAgICsgKHRoaXMuemVybyA/IFwiMFwiIDogXCJcIilcbiAgICAgICsgKHRoaXMud2lkdGggPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBNYXRoLm1heCgxLCB0aGlzLndpZHRoIHwgMCkpXG4gICAgICArICh0aGlzLmNvbW1hID8gXCIsXCIgOiBcIlwiKVxuICAgICAgKyAodGhpcy5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBcIi5cIiArIE1hdGgubWF4KDAsIHRoaXMucHJlY2lzaW9uIHwgMCkpXG4gICAgICArICh0aGlzLnRyaW0gPyBcIn5cIiA6IFwiXCIpXG4gICAgICArIHRoaXMudHlwZTtcbn07XG4iLCIvLyBUcmltcyBpbnNpZ25pZmljYW50IHplcm9zLCBlLmcuLCByZXBsYWNlcyAxLjIwMDBrIHdpdGggMS4yay5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHMpIHtcbiAgb3V0OiBmb3IgKHZhciBuID0gcy5sZW5ndGgsIGkgPSAxLCBpMCA9IC0xLCBpMTsgaSA8IG47ICsraSkge1xuICAgIHN3aXRjaCAoc1tpXSkge1xuICAgICAgY2FzZSBcIi5cIjogaTAgPSBpMSA9IGk7IGJyZWFrO1xuICAgICAgY2FzZSBcIjBcIjogaWYgKGkwID09PSAwKSBpMCA9IGk7IGkxID0gaTsgYnJlYWs7XG4gICAgICBkZWZhdWx0OiBpZiAoIStzW2ldKSBicmVhayBvdXQ7IGlmIChpMCA+IDApIGkwID0gMDsgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBpMCA+IDAgPyBzLnNsaWNlKDAsIGkwKSArIHMuc2xpY2UoaTEgKyAxKSA6IHM7XG59XG4iLCJpbXBvcnQgZm9ybWF0RGVjaW1hbCBmcm9tIFwiLi9mb3JtYXREZWNpbWFsLmpzXCI7XG5pbXBvcnQgZm9ybWF0UHJlZml4QXV0byBmcm9tIFwiLi9mb3JtYXRQcmVmaXhBdXRvLmpzXCI7XG5pbXBvcnQgZm9ybWF0Um91bmRlZCBmcm9tIFwiLi9mb3JtYXRSb3VuZGVkLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgXCIlXCI6ICh4LCBwKSA9PiAoeCAqIDEwMCkudG9GaXhlZChwKSxcbiAgXCJiXCI6ICh4KSA9PiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDIpLFxuICBcImNcIjogKHgpID0+IHggKyBcIlwiLFxuICBcImRcIjogZm9ybWF0RGVjaW1hbCxcbiAgXCJlXCI6ICh4LCBwKSA9PiB4LnRvRXhwb25lbnRpYWwocCksXG4gIFwiZlwiOiAoeCwgcCkgPT4geC50b0ZpeGVkKHApLFxuICBcImdcIjogKHgsIHApID0+IHgudG9QcmVjaXNpb24ocCksXG4gIFwib1wiOiAoeCkgPT4gTWF0aC5yb3VuZCh4KS50b1N0cmluZyg4KSxcbiAgXCJwXCI6ICh4LCBwKSA9PiBmb3JtYXRSb3VuZGVkKHggKiAxMDAsIHApLFxuICBcInJcIjogZm9ybWF0Um91bmRlZCxcbiAgXCJzXCI6IGZvcm1hdFByZWZpeEF1dG8sXG4gIFwiWFwiOiAoeCkgPT4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSxcbiAgXCJ4XCI6ICh4KSA9PiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDE2KVxufTtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHg7XG59XG4iLCJpbXBvcnQgZXhwb25lbnQgZnJvbSBcIi4vZXhwb25lbnQuanNcIjtcbmltcG9ydCBmb3JtYXRHcm91cCBmcm9tIFwiLi9mb3JtYXRHcm91cC5qc1wiO1xuaW1wb3J0IGZvcm1hdE51bWVyYWxzIGZyb20gXCIuL2Zvcm1hdE51bWVyYWxzLmpzXCI7XG5pbXBvcnQgZm9ybWF0U3BlY2lmaWVyIGZyb20gXCIuL2Zvcm1hdFNwZWNpZmllci5qc1wiO1xuaW1wb3J0IGZvcm1hdFRyaW0gZnJvbSBcIi4vZm9ybWF0VHJpbS5qc1wiO1xuaW1wb3J0IGZvcm1hdFR5cGVzIGZyb20gXCIuL2Zvcm1hdFR5cGVzLmpzXCI7XG5pbXBvcnQge3ByZWZpeEV4cG9uZW50fSBmcm9tIFwiLi9mb3JtYXRQcmVmaXhBdXRvLmpzXCI7XG5pbXBvcnQgaWRlbnRpdHkgZnJvbSBcIi4vaWRlbnRpdHkuanNcIjtcblxudmFyIG1hcCA9IEFycmF5LnByb3RvdHlwZS5tYXAsXG4gICAgcHJlZml4ZXMgPSBbXCJ5XCIsXCJ6XCIsXCJhXCIsXCJmXCIsXCJwXCIsXCJuXCIsXCLCtVwiLFwibVwiLFwiXCIsXCJrXCIsXCJNXCIsXCJHXCIsXCJUXCIsXCJQXCIsXCJFXCIsXCJaXCIsXCJZXCJdO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihsb2NhbGUpIHtcbiAgdmFyIGdyb3VwID0gbG9jYWxlLmdyb3VwaW5nID09PSB1bmRlZmluZWQgfHwgbG9jYWxlLnRob3VzYW5kcyA9PT0gdW5kZWZpbmVkID8gaWRlbnRpdHkgOiBmb3JtYXRHcm91cChtYXAuY2FsbChsb2NhbGUuZ3JvdXBpbmcsIE51bWJlciksIGxvY2FsZS50aG91c2FuZHMgKyBcIlwiKSxcbiAgICAgIGN1cnJlbmN5UHJlZml4ID0gbG9jYWxlLmN1cnJlbmN5ID09PSB1bmRlZmluZWQgPyBcIlwiIDogbG9jYWxlLmN1cnJlbmN5WzBdICsgXCJcIixcbiAgICAgIGN1cnJlbmN5U3VmZml4ID0gbG9jYWxlLmN1cnJlbmN5ID09PSB1bmRlZmluZWQgPyBcIlwiIDogbG9jYWxlLmN1cnJlbmN5WzFdICsgXCJcIixcbiAgICAgIGRlY2ltYWwgPSBsb2NhbGUuZGVjaW1hbCA9PT0gdW5kZWZpbmVkID8gXCIuXCIgOiBsb2NhbGUuZGVjaW1hbCArIFwiXCIsXG4gICAgICBudW1lcmFscyA9IGxvY2FsZS5udW1lcmFscyA9PT0gdW5kZWZpbmVkID8gaWRlbnRpdHkgOiBmb3JtYXROdW1lcmFscyhtYXAuY2FsbChsb2NhbGUubnVtZXJhbHMsIFN0cmluZykpLFxuICAgICAgcGVyY2VudCA9IGxvY2FsZS5wZXJjZW50ID09PSB1bmRlZmluZWQgPyBcIiVcIiA6IGxvY2FsZS5wZXJjZW50ICsgXCJcIixcbiAgICAgIG1pbnVzID0gbG9jYWxlLm1pbnVzID09PSB1bmRlZmluZWQgPyBcIuKIklwiIDogbG9jYWxlLm1pbnVzICsgXCJcIixcbiAgICAgIG5hbiA9IGxvY2FsZS5uYW4gPT09IHVuZGVmaW5lZCA/IFwiTmFOXCIgOiBsb2NhbGUubmFuICsgXCJcIjtcblxuICBmdW5jdGlvbiBuZXdGb3JtYXQoc3BlY2lmaWVyKSB7XG4gICAgc3BlY2lmaWVyID0gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcik7XG5cbiAgICB2YXIgZmlsbCA9IHNwZWNpZmllci5maWxsLFxuICAgICAgICBhbGlnbiA9IHNwZWNpZmllci5hbGlnbixcbiAgICAgICAgc2lnbiA9IHNwZWNpZmllci5zaWduLFxuICAgICAgICBzeW1ib2wgPSBzcGVjaWZpZXIuc3ltYm9sLFxuICAgICAgICB6ZXJvID0gc3BlY2lmaWVyLnplcm8sXG4gICAgICAgIHdpZHRoID0gc3BlY2lmaWVyLndpZHRoLFxuICAgICAgICBjb21tYSA9IHNwZWNpZmllci5jb21tYSxcbiAgICAgICAgcHJlY2lzaW9uID0gc3BlY2lmaWVyLnByZWNpc2lvbixcbiAgICAgICAgdHJpbSA9IHNwZWNpZmllci50cmltLFxuICAgICAgICB0eXBlID0gc3BlY2lmaWVyLnR5cGU7XG5cbiAgICAvLyBUaGUgXCJuXCIgdHlwZSBpcyBhbiBhbGlhcyBmb3IgXCIsZ1wiLlxuICAgIGlmICh0eXBlID09PSBcIm5cIikgY29tbWEgPSB0cnVlLCB0eXBlID0gXCJnXCI7XG5cbiAgICAvLyBUaGUgXCJcIiB0eXBlLCBhbmQgYW55IGludmFsaWQgdHlwZSwgaXMgYW4gYWxpYXMgZm9yIFwiLjEyfmdcIi5cbiAgICBlbHNlIGlmICghZm9ybWF0VHlwZXNbdHlwZV0pIHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkICYmIChwcmVjaXNpb24gPSAxMiksIHRyaW0gPSB0cnVlLCB0eXBlID0gXCJnXCI7XG5cbiAgICAvLyBJZiB6ZXJvIGZpbGwgaXMgc3BlY2lmaWVkLCBwYWRkaW5nIGdvZXMgYWZ0ZXIgc2lnbiBhbmQgYmVmb3JlIGRpZ2l0cy5cbiAgICBpZiAoemVybyB8fCAoZmlsbCA9PT0gXCIwXCIgJiYgYWxpZ24gPT09IFwiPVwiKSkgemVybyA9IHRydWUsIGZpbGwgPSBcIjBcIiwgYWxpZ24gPSBcIj1cIjtcblxuICAgIC8vIENvbXB1dGUgdGhlIHByZWZpeCBhbmQgc3VmZml4LlxuICAgIC8vIEZvciBTSS1wcmVmaXgsIHRoZSBzdWZmaXggaXMgbGF6aWx5IGNvbXB1dGVkLlxuICAgIHZhciBwcmVmaXggPSBzeW1ib2wgPT09IFwiJFwiID8gY3VycmVuY3lQcmVmaXggOiBzeW1ib2wgPT09IFwiI1wiICYmIC9bYm94WF0vLnRlc3QodHlwZSkgPyBcIjBcIiArIHR5cGUudG9Mb3dlckNhc2UoKSA6IFwiXCIsXG4gICAgICAgIHN1ZmZpeCA9IHN5bWJvbCA9PT0gXCIkXCIgPyBjdXJyZW5jeVN1ZmZpeCA6IC9bJXBdLy50ZXN0KHR5cGUpID8gcGVyY2VudCA6IFwiXCI7XG5cbiAgICAvLyBXaGF0IGZvcm1hdCBmdW5jdGlvbiBzaG91bGQgd2UgdXNlP1xuICAgIC8vIElzIHRoaXMgYW4gaW50ZWdlciB0eXBlP1xuICAgIC8vIENhbiB0aGlzIHR5cGUgZ2VuZXJhdGUgZXhwb25lbnRpYWwgbm90YXRpb24/XG4gICAgdmFyIGZvcm1hdFR5cGUgPSBmb3JtYXRUeXBlc1t0eXBlXSxcbiAgICAgICAgbWF5YmVTdWZmaXggPSAvW2RlZmdwcnMlXS8udGVzdCh0eXBlKTtcblxuICAgIC8vIFNldCB0aGUgZGVmYXVsdCBwcmVjaXNpb24gaWYgbm90IHNwZWNpZmllZCxcbiAgICAvLyBvciBjbGFtcCB0aGUgc3BlY2lmaWVkIHByZWNpc2lvbiB0byB0aGUgc3VwcG9ydGVkIHJhbmdlLlxuICAgIC8vIEZvciBzaWduaWZpY2FudCBwcmVjaXNpb24sIGl0IG11c3QgYmUgaW4gWzEsIDIxXS5cbiAgICAvLyBGb3IgZml4ZWQgcHJlY2lzaW9uLCBpdCBtdXN0IGJlIGluIFswLCAyMF0uXG4gICAgcHJlY2lzaW9uID0gcHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyA2XG4gICAgICAgIDogL1tncHJzXS8udGVzdCh0eXBlKSA/IE1hdGgubWF4KDEsIE1hdGgubWluKDIxLCBwcmVjaXNpb24pKVxuICAgICAgICA6IE1hdGgubWF4KDAsIE1hdGgubWluKDIwLCBwcmVjaXNpb24pKTtcblxuICAgIGZ1bmN0aW9uIGZvcm1hdCh2YWx1ZSkge1xuICAgICAgdmFyIHZhbHVlUHJlZml4ID0gcHJlZml4LFxuICAgICAgICAgIHZhbHVlU3VmZml4ID0gc3VmZml4LFxuICAgICAgICAgIGksIG4sIGM7XG5cbiAgICAgIGlmICh0eXBlID09PSBcImNcIikge1xuICAgICAgICB2YWx1ZVN1ZmZpeCA9IGZvcm1hdFR5cGUodmFsdWUpICsgdmFsdWVTdWZmaXg7XG4gICAgICAgIHZhbHVlID0gXCJcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gK3ZhbHVlO1xuXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgc2lnbi4gLTAgaXMgbm90IGxlc3MgdGhhbiAwLCBidXQgMSAvIC0wIGlzIVxuICAgICAgICB2YXIgdmFsdWVOZWdhdGl2ZSA9IHZhbHVlIDwgMCB8fCAxIC8gdmFsdWUgPCAwO1xuXG4gICAgICAgIC8vIFBlcmZvcm0gdGhlIGluaXRpYWwgZm9ybWF0dGluZy5cbiAgICAgICAgdmFsdWUgPSBpc05hTih2YWx1ZSkgPyBuYW4gOiBmb3JtYXRUeXBlKE1hdGguYWJzKHZhbHVlKSwgcHJlY2lzaW9uKTtcblxuICAgICAgICAvLyBUcmltIGluc2lnbmlmaWNhbnQgemVyb3MuXG4gICAgICAgIGlmICh0cmltKSB2YWx1ZSA9IGZvcm1hdFRyaW0odmFsdWUpO1xuXG4gICAgICAgIC8vIElmIGEgbmVnYXRpdmUgdmFsdWUgcm91bmRzIHRvIHplcm8gYWZ0ZXIgZm9ybWF0dGluZywgYW5kIG5vIGV4cGxpY2l0IHBvc2l0aXZlIHNpZ24gaXMgcmVxdWVzdGVkLCBoaWRlIHRoZSBzaWduLlxuICAgICAgICBpZiAodmFsdWVOZWdhdGl2ZSAmJiArdmFsdWUgPT09IDAgJiYgc2lnbiAhPT0gXCIrXCIpIHZhbHVlTmVnYXRpdmUgPSBmYWxzZTtcblxuICAgICAgICAvLyBDb21wdXRlIHRoZSBwcmVmaXggYW5kIHN1ZmZpeC5cbiAgICAgICAgdmFsdWVQcmVmaXggPSAodmFsdWVOZWdhdGl2ZSA/IChzaWduID09PSBcIihcIiA/IHNpZ24gOiBtaW51cykgOiBzaWduID09PSBcIi1cIiB8fCBzaWduID09PSBcIihcIiA/IFwiXCIgOiBzaWduKSArIHZhbHVlUHJlZml4O1xuICAgICAgICB2YWx1ZVN1ZmZpeCA9ICh0eXBlID09PSBcInNcIiA/IHByZWZpeGVzWzggKyBwcmVmaXhFeHBvbmVudCAvIDNdIDogXCJcIikgKyB2YWx1ZVN1ZmZpeCArICh2YWx1ZU5lZ2F0aXZlICYmIHNpZ24gPT09IFwiKFwiID8gXCIpXCIgOiBcIlwiKTtcblxuICAgICAgICAvLyBCcmVhayB0aGUgZm9ybWF0dGVkIHZhbHVlIGludG8gdGhlIGludGVnZXIg4oCcdmFsdWXigJ0gcGFydCB0aGF0IGNhbiBiZVxuICAgICAgICAvLyBncm91cGVkLCBhbmQgZnJhY3Rpb25hbCBvciBleHBvbmVudGlhbCDigJxzdWZmaXjigJ0gcGFydCB0aGF0IGlzIG5vdC5cbiAgICAgICAgaWYgKG1heWJlU3VmZml4KSB7XG4gICAgICAgICAgaSA9IC0xLCBuID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICAgICAgICBpZiAoYyA9IHZhbHVlLmNoYXJDb2RlQXQoaSksIDQ4ID4gYyB8fCBjID4gNTcpIHtcbiAgICAgICAgICAgICAgdmFsdWVTdWZmaXggPSAoYyA9PT0gNDYgPyBkZWNpbWFsICsgdmFsdWUuc2xpY2UoaSArIDEpIDogdmFsdWUuc2xpY2UoaSkpICsgdmFsdWVTdWZmaXg7XG4gICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgZmlsbCBjaGFyYWN0ZXIgaXMgbm90IFwiMFwiLCBncm91cGluZyBpcyBhcHBsaWVkIGJlZm9yZSBwYWRkaW5nLlxuICAgICAgaWYgKGNvbW1hICYmICF6ZXJvKSB2YWx1ZSA9IGdyb3VwKHZhbHVlLCBJbmZpbml0eSk7XG5cbiAgICAgIC8vIENvbXB1dGUgdGhlIHBhZGRpbmcuXG4gICAgICB2YXIgbGVuZ3RoID0gdmFsdWVQcmVmaXgubGVuZ3RoICsgdmFsdWUubGVuZ3RoICsgdmFsdWVTdWZmaXgubGVuZ3RoLFxuICAgICAgICAgIHBhZGRpbmcgPSBsZW5ndGggPCB3aWR0aCA/IG5ldyBBcnJheSh3aWR0aCAtIGxlbmd0aCArIDEpLmpvaW4oZmlsbCkgOiBcIlwiO1xuXG4gICAgICAvLyBJZiB0aGUgZmlsbCBjaGFyYWN0ZXIgaXMgXCIwXCIsIGdyb3VwaW5nIGlzIGFwcGxpZWQgYWZ0ZXIgcGFkZGluZy5cbiAgICAgIGlmIChjb21tYSAmJiB6ZXJvKSB2YWx1ZSA9IGdyb3VwKHBhZGRpbmcgKyB2YWx1ZSwgcGFkZGluZy5sZW5ndGggPyB3aWR0aCAtIHZhbHVlU3VmZml4Lmxlbmd0aCA6IEluZmluaXR5KSwgcGFkZGluZyA9IFwiXCI7XG5cbiAgICAgIC8vIFJlY29uc3RydWN0IHRoZSBmaW5hbCBvdXRwdXQgYmFzZWQgb24gdGhlIGRlc2lyZWQgYWxpZ25tZW50LlxuICAgICAgc3dpdGNoIChhbGlnbikge1xuICAgICAgICBjYXNlIFwiPFwiOiB2YWx1ZSA9IHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmc7IGJyZWFrO1xuICAgICAgICBjYXNlIFwiPVwiOiB2YWx1ZSA9IHZhbHVlUHJlZml4ICsgcGFkZGluZyArIHZhbHVlICsgdmFsdWVTdWZmaXg7IGJyZWFrO1xuICAgICAgICBjYXNlIFwiXlwiOiB2YWx1ZSA9IHBhZGRpbmcuc2xpY2UoMCwgbGVuZ3RoID0gcGFkZGluZy5sZW5ndGggPj4gMSkgKyB2YWx1ZVByZWZpeCArIHZhbHVlICsgdmFsdWVTdWZmaXggKyBwYWRkaW5nLnNsaWNlKGxlbmd0aCk7IGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiB2YWx1ZSA9IHBhZGRpbmcgKyB2YWx1ZVByZWZpeCArIHZhbHVlICsgdmFsdWVTdWZmaXg7IGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVtZXJhbHModmFsdWUpO1xuICAgIH1cblxuICAgIGZvcm1hdC50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHNwZWNpZmllciArIFwiXCI7XG4gICAgfTtcblxuICAgIHJldHVybiBmb3JtYXQ7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRQcmVmaXgoc3BlY2lmaWVyLCB2YWx1ZSkge1xuICAgIHZhciBmID0gbmV3Rm9ybWF0KChzcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSwgc3BlY2lmaWVyLnR5cGUgPSBcImZcIiwgc3BlY2lmaWVyKSksXG4gICAgICAgIGUgPSBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCh2YWx1ZSkgLyAzKSkpICogMyxcbiAgICAgICAgayA9IE1hdGgucG93KDEwLCAtZSksXG4gICAgICAgIHByZWZpeCA9IHByZWZpeGVzWzggKyBlIC8gM107XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gZihrICogdmFsdWUpICsgcHJlZml4O1xuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGZvcm1hdDogbmV3Rm9ybWF0LFxuICAgIGZvcm1hdFByZWZpeDogZm9ybWF0UHJlZml4XG4gIH07XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYmFzaXModDEsIHYwLCB2MSwgdjIsIHYzKSB7XG4gIHZhciB0MiA9IHQxICogdDEsIHQzID0gdDIgKiB0MTtcbiAgcmV0dXJuICgoMSAtIDMgKiB0MSArIDMgKiB0MiAtIHQzKSAqIHYwXG4gICAgICArICg0IC0gNiAqIHQyICsgMyAqIHQzKSAqIHYxXG4gICAgICArICgxICsgMyAqIHQxICsgMyAqIHQyIC0gMyAqIHQzKSAqIHYyXG4gICAgICArIHQzICogdjMpIC8gNjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWVzKSB7XG4gIHZhciBuID0gdmFsdWVzLmxlbmd0aCAtIDE7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdmFyIGkgPSB0IDw9IDAgPyAodCA9IDApIDogdCA+PSAxID8gKHQgPSAxLCBuIC0gMSkgOiBNYXRoLmZsb29yKHQgKiBuKSxcbiAgICAgICAgdjEgPSB2YWx1ZXNbaV0sXG4gICAgICAgIHYyID0gdmFsdWVzW2kgKyAxXSxcbiAgICAgICAgdjAgPSBpID4gMCA/IHZhbHVlc1tpIC0gMV0gOiAyICogdjEgLSB2MixcbiAgICAgICAgdjMgPSBpIDwgbiAtIDEgPyB2YWx1ZXNbaSArIDJdIDogMiAqIHYyIC0gdjE7XG4gICAgcmV0dXJuIGJhc2lzKCh0IC0gaSAvIG4pICogbiwgdjAsIHYxLCB2MiwgdjMpO1xuICB9O1xufVxuIiwiaW1wb3J0IHtiYXNpc30gZnJvbSBcIi4vYmFzaXMuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWVzKSB7XG4gIHZhciBuID0gdmFsdWVzLmxlbmd0aDtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgaSA9IE1hdGguZmxvb3IoKCh0ICU9IDEpIDwgMCA/ICsrdCA6IHQpICogbiksXG4gICAgICAgIHYwID0gdmFsdWVzWyhpICsgbiAtIDEpICUgbl0sXG4gICAgICAgIHYxID0gdmFsdWVzW2kgJSBuXSxcbiAgICAgICAgdjIgPSB2YWx1ZXNbKGkgKyAxKSAlIG5dLFxuICAgICAgICB2MyA9IHZhbHVlc1soaSArIDIpICUgbl07XG4gICAgcmV0dXJuIGJhc2lzKCh0IC0gaSAvIG4pICogbiwgdjAsIHYxLCB2MiwgdjMpO1xuICB9O1xufVxuIiwiaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5cbmZ1bmN0aW9uIGxpbmVhcihhLCBkKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGEgKyB0ICogZDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZXhwb25lbnRpYWwoYSwgYiwgeSkge1xuICByZXR1cm4gYSA9IE1hdGgucG93KGEsIHkpLCBiID0gTWF0aC5wb3coYiwgeSkgLSBhLCB5ID0gMSAvIHksIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gTWF0aC5wb3coYSArIHQgKiBiLCB5KTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGh1ZShhLCBiKSB7XG4gIHZhciBkID0gYiAtIGE7XG4gIHJldHVybiBkID8gbGluZWFyKGEsIGQgPiAxODAgfHwgZCA8IC0xODAgPyBkIC0gMzYwICogTWF0aC5yb3VuZChkIC8gMzYwKSA6IGQpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnYW1tYSh5KSB7XG4gIHJldHVybiAoeSA9ICt5KSA9PT0gMSA/IG5vZ2FtbWEgOiBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGIgLSBhID8gZXhwb25lbnRpYWwoYSwgYiwgeSkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbm9nYW1tYShhLCBiKSB7XG4gIHZhciBkID0gYiAtIGE7XG4gIHJldHVybiBkID8gbGluZWFyKGEsIGQpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCB4ID0+ICgpID0+IHg7XG4iLCJpbXBvcnQge2xhYiBhcyBjb2xvckxhYn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQgY29sb3IgZnJvbSBcIi4vY29sb3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGFiKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGwgPSBjb2xvcigoc3RhcnQgPSBjb2xvckxhYihzdGFydCkpLmwsIChlbmQgPSBjb2xvckxhYihlbmQpKS5sKSxcbiAgICAgIGEgPSBjb2xvcihzdGFydC5hLCBlbmQuYSksXG4gICAgICBiID0gY29sb3Ioc3RhcnQuYiwgZW5kLmIpLFxuICAgICAgb3BhY2l0eSA9IGNvbG9yKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICBzdGFydC5sID0gbCh0KTtcbiAgICBzdGFydC5hID0gYSh0KTtcbiAgICBzdGFydC5iID0gYih0KTtcbiAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTtcbiAgICByZXR1cm4gc3RhcnQgKyBcIlwiO1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gYSA9ICthLCBiID0gK2IsIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYSAqICgxIC0gdCkgKyBiICogdDtcbiAgfTtcbn1cbiIsImltcG9ydCB7cmdiIGFzIGNvbG9yUmdifSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCBiYXNpcyBmcm9tIFwiLi9iYXNpcy5qc1wiO1xuaW1wb3J0IGJhc2lzQ2xvc2VkIGZyb20gXCIuL2Jhc2lzQ2xvc2VkLmpzXCI7XG5pbXBvcnQgbm9nYW1tYSwge2dhbW1hfSBmcm9tIFwiLi9jb2xvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gcmdiR2FtbWEoeSkge1xuICB2YXIgY29sb3IgPSBnYW1tYSh5KTtcblxuICBmdW5jdGlvbiByZ2Ioc3RhcnQsIGVuZCkge1xuICAgIHZhciByID0gY29sb3IoKHN0YXJ0ID0gY29sb3JSZ2Ioc3RhcnQpKS5yLCAoZW5kID0gY29sb3JSZ2IoZW5kKSkuciksXG4gICAgICAgIGcgPSBjb2xvcihzdGFydC5nLCBlbmQuZyksXG4gICAgICAgIGIgPSBjb2xvcihzdGFydC5iLCBlbmQuYiksXG4gICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgc3RhcnQuciA9IHIodCk7XG4gICAgICBzdGFydC5nID0gZyh0KTtcbiAgICAgIHN0YXJ0LmIgPSBiKHQpO1xuICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7XG4gICAgICByZXR1cm4gc3RhcnQgKyBcIlwiO1xuICAgIH07XG4gIH1cblxuICByZ2IuZ2FtbWEgPSByZ2JHYW1tYTtcblxuICByZXR1cm4gcmdiO1xufSkoMSk7XG5cbmZ1bmN0aW9uIHJnYlNwbGluZShzcGxpbmUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGNvbG9ycykge1xuICAgIHZhciBuID0gY29sb3JzLmxlbmd0aCxcbiAgICAgICAgciA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgZyA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgYiA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgaSwgY29sb3I7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgY29sb3IgPSBjb2xvclJnYihjb2xvcnNbaV0pO1xuICAgICAgcltpXSA9IGNvbG9yLnIgfHwgMDtcbiAgICAgIGdbaV0gPSBjb2xvci5nIHx8IDA7XG4gICAgICBiW2ldID0gY29sb3IuYiB8fCAwO1xuICAgIH1cbiAgICByID0gc3BsaW5lKHIpO1xuICAgIGcgPSBzcGxpbmUoZyk7XG4gICAgYiA9IHNwbGluZShiKTtcbiAgICBjb2xvci5vcGFjaXR5ID0gMTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgY29sb3IuciA9IHIodCk7XG4gICAgICBjb2xvci5nID0gZyh0KTtcbiAgICAgIGNvbG9yLmIgPSBiKHQpO1xuICAgICAgcmV0dXJuIGNvbG9yICsgXCJcIjtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgdmFyIHJnYkJhc2lzID0gcmdiU3BsaW5lKGJhc2lzKTtcbmV4cG9ydCB2YXIgcmdiQmFzaXNDbG9zZWQgPSByZ2JTcGxpbmUoYmFzaXNDbG9zZWQpO1xuIiwiaW1wb3J0IG51bWJlciBmcm9tIFwiLi9udW1iZXIuanNcIjtcblxudmFyIHJlQSA9IC9bLStdPyg/OlxcZCtcXC4/XFxkKnxcXC4/XFxkKykoPzpbZUVdWy0rXT9cXGQrKT8vZyxcbiAgICByZUIgPSBuZXcgUmVnRXhwKHJlQS5zb3VyY2UsIFwiZ1wiKTtcblxuZnVuY3Rpb24gemVybyhiKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb25lKGIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYih0KSArIFwiXCI7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIGJpID0gcmVBLmxhc3RJbmRleCA9IHJlQi5sYXN0SW5kZXggPSAwLCAvLyBzY2FuIGluZGV4IGZvciBuZXh0IG51bWJlciBpbiBiXG4gICAgICBhbSwgLy8gY3VycmVudCBtYXRjaCBpbiBhXG4gICAgICBibSwgLy8gY3VycmVudCBtYXRjaCBpbiBiXG4gICAgICBicywgLy8gc3RyaW5nIHByZWNlZGluZyBjdXJyZW50IG51bWJlciBpbiBiLCBpZiBhbnlcbiAgICAgIGkgPSAtMSwgLy8gaW5kZXggaW4gc1xuICAgICAgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnNcbiAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnNcblxuICAvLyBDb2VyY2UgaW5wdXRzIHRvIHN0cmluZ3MuXG4gIGEgPSBhICsgXCJcIiwgYiA9IGIgKyBcIlwiO1xuXG4gIC8vIEludGVycG9sYXRlIHBhaXJzIG9mIG51bWJlcnMgaW4gYSAmIGIuXG4gIHdoaWxlICgoYW0gPSByZUEuZXhlYyhhKSlcbiAgICAgICYmIChibSA9IHJlQi5leGVjKGIpKSkge1xuICAgIGlmICgoYnMgPSBibS5pbmRleCkgPiBiaSkgeyAvLyBhIHN0cmluZyBwcmVjZWRlcyB0aGUgbmV4dCBudW1iZXIgaW4gYlxuICAgICAgYnMgPSBiLnNsaWNlKGJpLCBicyk7XG4gICAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICAgIGVsc2Ugc1srK2ldID0gYnM7XG4gICAgfVxuICAgIGlmICgoYW0gPSBhbVswXSkgPT09IChibSA9IGJtWzBdKSkgeyAvLyBudW1iZXJzIGluIGEgJiBiIG1hdGNoXG4gICAgICBpZiAoc1tpXSkgc1tpXSArPSBibTsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICAgIGVsc2Ugc1srK2ldID0gYm07XG4gICAgfSBlbHNlIHsgLy8gaW50ZXJwb2xhdGUgbm9uLW1hdGNoaW5nIG51bWJlcnNcbiAgICAgIHNbKytpXSA9IG51bGw7XG4gICAgICBxLnB1c2goe2k6IGksIHg6IG51bWJlcihhbSwgYm0pfSk7XG4gICAgfVxuICAgIGJpID0gcmVCLmxhc3RJbmRleDtcbiAgfVxuXG4gIC8vIEFkZCByZW1haW5zIG9mIGIuXG4gIGlmIChiaSA8IGIubGVuZ3RoKSB7XG4gICAgYnMgPSBiLnNsaWNlKGJpKTtcbiAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICBlbHNlIHNbKytpXSA9IGJzO1xuICB9XG5cbiAgLy8gU3BlY2lhbCBvcHRpbWl6YXRpb24gZm9yIG9ubHkgYSBzaW5nbGUgbWF0Y2guXG4gIC8vIE90aGVyd2lzZSwgaW50ZXJwb2xhdGUgZWFjaCBvZiB0aGUgbnVtYmVycyBhbmQgcmVqb2luIHRoZSBzdHJpbmcuXG4gIHJldHVybiBzLmxlbmd0aCA8IDIgPyAocVswXVxuICAgICAgPyBvbmUocVswXS54KVxuICAgICAgOiB6ZXJvKGIpKVxuICAgICAgOiAoYiA9IHEubGVuZ3RoLCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG87IGkgPCBiOyArK2kpIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTtcbiAgICAgICAgICByZXR1cm4gcy5qb2luKFwiXCIpO1xuICAgICAgICB9KTtcbn1cbiIsInZhciBkZWdyZWVzID0gMTgwIC8gTWF0aC5QSTtcblxuZXhwb3J0IHZhciBpZGVudGl0eSA9IHtcbiAgdHJhbnNsYXRlWDogMCxcbiAgdHJhbnNsYXRlWTogMCxcbiAgcm90YXRlOiAwLFxuICBza2V3WDogMCxcbiAgc2NhbGVYOiAxLFxuICBzY2FsZVk6IDFcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgdmFyIHNjYWxlWCwgc2NhbGVZLCBza2V3WDtcbiAgaWYgKHNjYWxlWCA9IE1hdGguc3FydChhICogYSArIGIgKiBiKSkgYSAvPSBzY2FsZVgsIGIgLz0gc2NhbGVYO1xuICBpZiAoc2tld1ggPSBhICogYyArIGIgKiBkKSBjIC09IGEgKiBza2V3WCwgZCAtPSBiICogc2tld1g7XG4gIGlmIChzY2FsZVkgPSBNYXRoLnNxcnQoYyAqIGMgKyBkICogZCkpIGMgLz0gc2NhbGVZLCBkIC89IHNjYWxlWSwgc2tld1ggLz0gc2NhbGVZO1xuICBpZiAoYSAqIGQgPCBiICogYykgYSA9IC1hLCBiID0gLWIsIHNrZXdYID0gLXNrZXdYLCBzY2FsZVggPSAtc2NhbGVYO1xuICByZXR1cm4ge1xuICAgIHRyYW5zbGF0ZVg6IGUsXG4gICAgdHJhbnNsYXRlWTogZixcbiAgICByb3RhdGU6IE1hdGguYXRhbjIoYiwgYSkgKiBkZWdyZWVzLFxuICAgIHNrZXdYOiBNYXRoLmF0YW4oc2tld1gpICogZGVncmVlcyxcbiAgICBzY2FsZVg6IHNjYWxlWCxcbiAgICBzY2FsZVk6IHNjYWxlWVxuICB9O1xufVxuIiwiaW1wb3J0IG51bWJlciBmcm9tIFwiLi4vbnVtYmVyLmpzXCI7XG5pbXBvcnQge3BhcnNlQ3NzLCBwYXJzZVN2Z30gZnJvbSBcIi4vcGFyc2UuanNcIjtcblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2UsIHB4Q29tbWEsIHB4UGFyZW4sIGRlZ1BhcmVuKSB7XG5cbiAgZnVuY3Rpb24gcG9wKHMpIHtcbiAgICByZXR1cm4gcy5sZW5ndGggPyBzLnBvcCgpICsgXCIgXCIgOiBcIlwiO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNsYXRlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7XG4gICAgaWYgKHhhICE9PSB4YiB8fCB5YSAhPT0geWIpIHtcbiAgICAgIHZhciBpID0gcy5wdXNoKFwidHJhbnNsYXRlKFwiLCBudWxsLCBweENvbW1hLCBudWxsLCBweFBhcmVuKTtcbiAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IG51bWJlcih4YSwgeGIpfSwge2k6IGkgLSAyLCB4OiBudW1iZXIoeWEsIHliKX0pO1xuICAgIH0gZWxzZSBpZiAoeGIgfHwgeWIpIHtcbiAgICAgIHMucHVzaChcInRyYW5zbGF0ZShcIiArIHhiICsgcHhDb21tYSArIHliICsgcHhQYXJlbik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcm90YXRlKGEsIGIsIHMsIHEpIHtcbiAgICBpZiAoYSAhPT0gYikge1xuICAgICAgaWYgKGEgLSBiID4gMTgwKSBiICs9IDM2MDsgZWxzZSBpZiAoYiAtIGEgPiAxODApIGEgKz0gMzYwOyAvLyBzaG9ydGVzdCBwYXRoXG4gICAgICBxLnB1c2goe2k6IHMucHVzaChwb3AocykgKyBcInJvdGF0ZShcIiwgbnVsbCwgZGVnUGFyZW4pIC0gMiwgeDogbnVtYmVyKGEsIGIpfSk7XG4gICAgfSBlbHNlIGlmIChiKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJyb3RhdGUoXCIgKyBiICsgZGVnUGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNrZXdYKGEsIGIsIHMsIHEpIHtcbiAgICBpZiAoYSAhPT0gYikge1xuICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgXCJza2V3WChcIiwgbnVsbCwgZGVnUGFyZW4pIC0gMiwgeDogbnVtYmVyKGEsIGIpfSk7XG4gICAgfSBlbHNlIGlmIChiKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJza2V3WChcIiArIGIgKyBkZWdQYXJlbik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2NhbGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHtcbiAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5Yikge1xuICAgICAgdmFyIGkgPSBzLnB1c2gocG9wKHMpICsgXCJzY2FsZShcIiwgbnVsbCwgXCIsXCIsIG51bGwsIFwiKVwiKTtcbiAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IG51bWJlcih4YSwgeGIpfSwge2k6IGkgLSAyLCB4OiBudW1iZXIoeWEsIHliKX0pO1xuICAgIH0gZWxzZSBpZiAoeGIgIT09IDEgfHwgeWIgIT09IDEpIHtcbiAgICAgIHMucHVzaChwb3AocykgKyBcInNjYWxlKFwiICsgeGIgKyBcIixcIiArIHliICsgXCIpXCIpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbihhLCBiKSB7XG4gICAgdmFyIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzXG4gICAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnNcbiAgICBhID0gcGFyc2UoYSksIGIgPSBwYXJzZShiKTtcbiAgICB0cmFuc2xhdGUoYS50cmFuc2xhdGVYLCBhLnRyYW5zbGF0ZVksIGIudHJhbnNsYXRlWCwgYi50cmFuc2xhdGVZLCBzLCBxKTtcbiAgICByb3RhdGUoYS5yb3RhdGUsIGIucm90YXRlLCBzLCBxKTtcbiAgICBza2V3WChhLnNrZXdYLCBiLnNrZXdYLCBzLCBxKTtcbiAgICBzY2FsZShhLnNjYWxlWCwgYS5zY2FsZVksIGIuc2NhbGVYLCBiLnNjYWxlWSwgcywgcSk7XG4gICAgYSA9IGIgPSBudWxsOyAvLyBnY1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICB2YXIgaSA9IC0xLCBuID0gcS5sZW5ndGgsIG87XG4gICAgICB3aGlsZSAoKytpIDwgbikgc1sobyA9IHFbaV0pLmldID0gby54KHQpO1xuICAgICAgcmV0dXJuIHMuam9pbihcIlwiKTtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtQ3NzID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VDc3MsIFwicHgsIFwiLCBcInB4KVwiLCBcImRlZylcIik7XG5leHBvcnQgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtU3ZnID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VTdmcsIFwiLCBcIiwgXCIpXCIsIFwiKVwiKTtcbiIsImltcG9ydCBkZWNvbXBvc2UsIHtpZGVudGl0eX0gZnJvbSBcIi4vZGVjb21wb3NlLmpzXCI7XG5cbnZhciBzdmdOb2RlO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ3NzKHZhbHVlKSB7XG4gIGNvbnN0IG0gPSBuZXcgKHR5cGVvZiBET01NYXRyaXggPT09IFwiZnVuY3Rpb25cIiA/IERPTU1hdHJpeCA6IFdlYktpdENTU01hdHJpeCkodmFsdWUgKyBcIlwiKTtcbiAgcmV0dXJuIG0uaXNJZGVudGl0eSA/IGlkZW50aXR5IDogZGVjb21wb3NlKG0uYSwgbS5iLCBtLmMsIG0uZCwgbS5lLCBtLmYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdmcodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBpZGVudGl0eTtcbiAgaWYgKCFzdmdOb2RlKSBzdmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJnXCIpO1xuICBzdmdOb2RlLnNldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiLCB2YWx1ZSk7XG4gIGlmICghKHZhbHVlID0gc3ZnTm9kZS50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKSkgcmV0dXJuIGlkZW50aXR5O1xuICB2YWx1ZSA9IHZhbHVlLm1hdHJpeDtcbiAgcmV0dXJuIGRlY29tcG9zZSh2YWx1ZS5hLCB2YWx1ZS5iLCB2YWx1ZS5jLCB2YWx1ZS5kLCB2YWx1ZS5lLCB2YWx1ZS5mKTtcbn1cbiIsInZhciBlcHNpbG9uMiA9IDFlLTEyO1xuXG5mdW5jdGlvbiBjb3NoKHgpIHtcbiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKHgpKSArIDEgLyB4KSAvIDI7XG59XG5cbmZ1bmN0aW9uIHNpbmgoeCkge1xuICByZXR1cm4gKCh4ID0gTWF0aC5leHAoeCkpIC0gMSAvIHgpIC8gMjtcbn1cblxuZnVuY3Rpb24gdGFuaCh4KSB7XG4gIHJldHVybiAoKHggPSBNYXRoLmV4cCgyICogeCkpIC0gMSkgLyAoeCArIDEpO1xufVxuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gem9vbVJobyhyaG8sIHJobzIsIHJobzQpIHtcblxuICAvLyBwMCA9IFt1eDAsIHV5MCwgdzBdXG4gIC8vIHAxID0gW3V4MSwgdXkxLCB3MV1cbiAgZnVuY3Rpb24gem9vbShwMCwgcDEpIHtcbiAgICB2YXIgdXgwID0gcDBbMF0sIHV5MCA9IHAwWzFdLCB3MCA9IHAwWzJdLFxuICAgICAgICB1eDEgPSBwMVswXSwgdXkxID0gcDFbMV0sIHcxID0gcDFbMl0sXG4gICAgICAgIGR4ID0gdXgxIC0gdXgwLFxuICAgICAgICBkeSA9IHV5MSAtIHV5MCxcbiAgICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeSxcbiAgICAgICAgaSxcbiAgICAgICAgUztcblxuICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgdTAg4omFIHUxLlxuICAgIGlmIChkMiA8IGVwc2lsb24yKSB7XG4gICAgICBTID0gTWF0aC5sb2codzEgLyB3MCkgLyByaG87XG4gICAgICBpID0gZnVuY3Rpb24odCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHV4MCArIHQgKiBkeCxcbiAgICAgICAgICB1eTAgKyB0ICogZHksXG4gICAgICAgICAgdzAgKiBNYXRoLmV4cChyaG8gKiB0ICogUylcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZW5lcmFsIGNhc2UuXG4gICAgZWxzZSB7XG4gICAgICB2YXIgZDEgPSBNYXRoLnNxcnQoZDIpLFxuICAgICAgICAgIGIwID0gKHcxICogdzEgLSB3MCAqIHcwICsgcmhvNCAqIGQyKSAvICgyICogdzAgKiByaG8yICogZDEpLFxuICAgICAgICAgIGIxID0gKHcxICogdzEgLSB3MCAqIHcwIC0gcmhvNCAqIGQyKSAvICgyICogdzEgKiByaG8yICogZDEpLFxuICAgICAgICAgIHIwID0gTWF0aC5sb2coTWF0aC5zcXJ0KGIwICogYjAgKyAxKSAtIGIwKSxcbiAgICAgICAgICByMSA9IE1hdGgubG9nKE1hdGguc3FydChiMSAqIGIxICsgMSkgLSBiMSk7XG4gICAgICBTID0gKHIxIC0gcjApIC8gcmhvO1xuICAgICAgaSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgdmFyIHMgPSB0ICogUyxcbiAgICAgICAgICAgIGNvc2hyMCA9IGNvc2gocjApLFxuICAgICAgICAgICAgdSA9IHcwIC8gKHJobzIgKiBkMSkgKiAoY29zaHIwICogdGFuaChyaG8gKiBzICsgcjApIC0gc2luaChyMCkpO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHV4MCArIHUgKiBkeCxcbiAgICAgICAgICB1eTAgKyB1ICogZHksXG4gICAgICAgICAgdzAgKiBjb3NocjAgLyBjb3NoKHJobyAqIHMgKyByMClcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpLmR1cmF0aW9uID0gUyAqIDEwMDAgKiByaG8gLyBNYXRoLlNRUlQyO1xuXG4gICAgcmV0dXJuIGk7XG4gIH1cblxuICB6b29tLnJobyA9IGZ1bmN0aW9uKF8pIHtcbiAgICB2YXIgXzEgPSBNYXRoLm1heCgxZS0zLCArXyksIF8yID0gXzEgKiBfMSwgXzQgPSBfMiAqIF8yO1xuICAgIHJldHVybiB6b29tUmhvKF8xLCBfMiwgXzQpO1xuICB9O1xuXG4gIHJldHVybiB6b29tO1xufSkoTWF0aC5TUVJUMiwgMiwgNCk7XG4iLCJleHBvcnQgZGVmYXVsdCBNYXRoLnJhbmRvbTtcbiIsImltcG9ydCBkZWZhdWx0U291cmNlIGZyb20gXCIuL2RlZmF1bHRTb3VyY2UuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIHNvdXJjZVJhbmRvbU5vcm1hbChzb3VyY2UpIHtcbiAgZnVuY3Rpb24gcmFuZG9tTm9ybWFsKG11LCBzaWdtYSkge1xuICAgIHZhciB4LCByO1xuICAgIG11ID0gbXUgPT0gbnVsbCA/IDAgOiArbXU7XG4gICAgc2lnbWEgPSBzaWdtYSA9PSBudWxsID8gMSA6ICtzaWdtYTtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgeTtcblxuICAgICAgLy8gSWYgYXZhaWxhYmxlLCB1c2UgdGhlIHNlY29uZCBwcmV2aW91c2x5LWdlbmVyYXRlZCB1bmlmb3JtIHJhbmRvbS5cbiAgICAgIGlmICh4ICE9IG51bGwpIHkgPSB4LCB4ID0gbnVsbDtcblxuICAgICAgLy8gT3RoZXJ3aXNlLCBnZW5lcmF0ZSBhIG5ldyB4IGFuZCB5LlxuICAgICAgZWxzZSBkbyB7XG4gICAgICAgIHggPSBzb3VyY2UoKSAqIDIgLSAxO1xuICAgICAgICB5ID0gc291cmNlKCkgKiAyIC0gMTtcbiAgICAgICAgciA9IHggKiB4ICsgeSAqIHk7XG4gICAgICB9IHdoaWxlICghciB8fCByID4gMSk7XG5cbiAgICAgIHJldHVybiBtdSArIHNpZ21hICogeSAqIE1hdGguc3FydCgtMiAqIE1hdGgubG9nKHIpIC8gcik7XG4gICAgfTtcbiAgfVxuXG4gIHJhbmRvbU5vcm1hbC5zb3VyY2UgPSBzb3VyY2VSYW5kb21Ob3JtYWw7XG5cbiAgcmV0dXJuIHJhbmRvbU5vcm1hbDtcbn0pKGRlZmF1bHRTb3VyY2UpO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGluaXRSYW5nZShkb21haW4sIHJhbmdlKSB7XG4gIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogYnJlYWs7XG4gICAgY2FzZSAxOiB0aGlzLnJhbmdlKGRvbWFpbik7IGJyZWFrO1xuICAgIGRlZmF1bHQ6IHRoaXMucmFuZ2UocmFuZ2UpLmRvbWFpbihkb21haW4pOyBicmVhaztcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRJbnRlcnBvbGF0b3IoZG9tYWluLCBpbnRlcnBvbGF0b3IpIHtcbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiBicmVhaztcbiAgICBjYXNlIDE6IHtcbiAgICAgIGlmICh0eXBlb2YgZG9tYWluID09PSBcImZ1bmN0aW9uXCIpIHRoaXMuaW50ZXJwb2xhdG9yKGRvbWFpbik7XG4gICAgICBlbHNlIHRoaXMucmFuZ2UoZG9tYWluKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICB0aGlzLmRvbWFpbihkb21haW4pO1xuICAgICAgaWYgKHR5cGVvZiBpbnRlcnBvbGF0b3IgPT09IFwiZnVuY3Rpb25cIikgdGhpcy5pbnRlcnBvbGF0b3IoaW50ZXJwb2xhdG9yKTtcbiAgICAgIGVsc2UgdGhpcy5yYW5nZShpbnRlcnBvbGF0b3IpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufVxuIiwiaW1wb3J0IHthc2NlbmRpbmcsIGJpc2VjdCwgcXVhbnRpbGVTb3J0ZWQgYXMgdGhyZXNob2xkfSBmcm9tIFwiZDMtYXJyYXlcIjtcbmltcG9ydCB7aW5pdFJhbmdlfSBmcm9tIFwiLi9pbml0LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHF1YW50aWxlKCkge1xuICB2YXIgZG9tYWluID0gW10sXG4gICAgICByYW5nZSA9IFtdLFxuICAgICAgdGhyZXNob2xkcyA9IFtdLFxuICAgICAgdW5rbm93bjtcblxuICBmdW5jdGlvbiByZXNjYWxlKCkge1xuICAgIHZhciBpID0gMCwgbiA9IE1hdGgubWF4KDEsIHJhbmdlLmxlbmd0aCk7XG4gICAgdGhyZXNob2xkcyA9IG5ldyBBcnJheShuIC0gMSk7XG4gICAgd2hpbGUgKCsraSA8IG4pIHRocmVzaG9sZHNbaSAtIDFdID0gdGhyZXNob2xkKGRvbWFpbiwgaSAvIG4pO1xuICAgIHJldHVybiBzY2FsZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNjYWxlKHgpIHtcbiAgICByZXR1cm4geCA9PSBudWxsIHx8IGlzTmFOKHggPSAreCkgPyB1bmtub3duIDogcmFuZ2VbYmlzZWN0KHRocmVzaG9sZHMsIHgpXTtcbiAgfVxuXG4gIHNjYWxlLmludmVydEV4dGVudCA9IGZ1bmN0aW9uKHkpIHtcbiAgICB2YXIgaSA9IHJhbmdlLmluZGV4T2YoeSk7XG4gICAgcmV0dXJuIGkgPCAwID8gW05hTiwgTmFOXSA6IFtcbiAgICAgIGkgPiAwID8gdGhyZXNob2xkc1tpIC0gMV0gOiBkb21haW5bMF0sXG4gICAgICBpIDwgdGhyZXNob2xkcy5sZW5ndGggPyB0aHJlc2hvbGRzW2ldIDogZG9tYWluW2RvbWFpbi5sZW5ndGggLSAxXVxuICAgIF07XG4gIH07XG5cbiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbi5zbGljZSgpO1xuICAgIGRvbWFpbiA9IFtdO1xuICAgIGZvciAobGV0IGQgb2YgXykgaWYgKGQgIT0gbnVsbCAmJiAhaXNOYU4oZCA9ICtkKSkgZG9tYWluLnB1c2goZCk7XG4gICAgZG9tYWluLnNvcnQoYXNjZW5kaW5nKTtcbiAgICByZXR1cm4gcmVzY2FsZSgpO1xuICB9O1xuXG4gIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlID0gQXJyYXkuZnJvbShfKSwgcmVzY2FsZSgpKSA6IHJhbmdlLnNsaWNlKCk7XG4gIH07XG5cbiAgc2NhbGUudW5rbm93biA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh1bmtub3duID0gXywgc2NhbGUpIDogdW5rbm93bjtcbiAgfTtcblxuICBzY2FsZS5xdWFudGlsZXMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhyZXNob2xkcy5zbGljZSgpO1xuICB9O1xuXG4gIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gcXVhbnRpbGUoKVxuICAgICAgICAuZG9tYWluKGRvbWFpbilcbiAgICAgICAgLnJhbmdlKHJhbmdlKVxuICAgICAgICAudW5rbm93bih1bmtub3duKTtcbiAgfTtcblxuICByZXR1cm4gaW5pdFJhbmdlLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpO1xufVxuIiwiLy8gR2l2ZW4gc29tZXRoaW5nIGFycmF5IGxpa2UgKG9yIG51bGwpLCByZXR1cm5zIHNvbWV0aGluZyB0aGF0IGlzIHN0cmljdGx5IGFuXG4vLyBhcnJheS4gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IGFycmF5LWxpa2Ugb2JqZWN0cyBwYXNzZWQgdG8gZDMuc2VsZWN0QWxsXG4vLyBvciBzZWxlY3Rpb24uc2VsZWN0QWxsIGFyZSBjb252ZXJ0ZWQgaW50byBwcm9wZXIgYXJyYXlzIHdoZW4gY3JlYXRpbmcgYVxuLy8gc2VsZWN0aW9uOyB3ZSBkb27igJl0IGV2ZXIgd2FudCB0byBjcmVhdGUgYSBzZWxlY3Rpb24gYmFja2VkIGJ5IGEgbGl2ZVxuLy8gSFRNTENvbGxlY3Rpb24gb3IgTm9kZUxpc3QuIEhvd2V2ZXIsIG5vdGUgdGhhdCBzZWxlY3Rpb24uc2VsZWN0QWxsIHdpbGwgdXNlIGFcbi8vIHN0YXRpYyBOb2RlTGlzdCBhcyBhIGdyb3VwLCBzaW5jZSBpdCBzYWZlbHkgZGVyaXZlZCBmcm9tIHF1ZXJ5U2VsZWN0b3JBbGwuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhcnJheSh4KSB7XG4gIHJldHVybiB4ID09IG51bGwgPyBbXSA6IEFycmF5LmlzQXJyYXkoeCkgPyB4IDogQXJyYXkuZnJvbSh4KTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB4O1xuICB9O1xufVxuIiwiaW1wb3J0IG5hbWVzcGFjZSBmcm9tIFwiLi9uYW1lc3BhY2UuanNcIjtcbmltcG9ydCB7eGh0bWx9IGZyb20gXCIuL25hbWVzcGFjZXMuanNcIjtcblxuZnVuY3Rpb24gY3JlYXRvckluaGVyaXQobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRvY3VtZW50ID0gdGhpcy5vd25lckRvY3VtZW50LFxuICAgICAgICB1cmkgPSB0aGlzLm5hbWVzcGFjZVVSSTtcbiAgICByZXR1cm4gdXJpID09PSB4aHRtbCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJID09PSB4aHRtbFxuICAgICAgICA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSlcbiAgICAgICAgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlModXJpLCBuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRvckZpeGVkKGZ1bGxuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTtcbiAgcmV0dXJuIChmdWxsbmFtZS5sb2NhbFxuICAgICAgPyBjcmVhdG9yRml4ZWRcbiAgICAgIDogY3JlYXRvckluaGVyaXQpKGZ1bGxuYW1lKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoaWxkTWF0Y2hlcihzZWxlY3Rvcikge1xuICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgIHJldHVybiBub2RlLm1hdGNoZXMoc2VsZWN0b3IpO1xuICB9O1xufVxuXG4iLCJpbXBvcnQgbmFtZXNwYWNlcyBmcm9tIFwiLi9uYW1lc3BhY2VzLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIHByZWZpeCA9IG5hbWUgKz0gXCJcIiwgaSA9IHByZWZpeC5pbmRleE9mKFwiOlwiKTtcbiAgaWYgKGkgPj0gMCAmJiAocHJlZml4ID0gbmFtZS5zbGljZSgwLCBpKSkgIT09IFwieG1sbnNcIikgbmFtZSA9IG5hbWUuc2xpY2UoaSArIDEpO1xuICByZXR1cm4gbmFtZXNwYWNlcy5oYXNPd25Qcm9wZXJ0eShwcmVmaXgpID8ge3NwYWNlOiBuYW1lc3BhY2VzW3ByZWZpeF0sIGxvY2FsOiBuYW1lfSA6IG5hbWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG59XG4iLCJleHBvcnQgdmFyIHhodG1sID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc3ZnOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gIHhodG1sOiB4aHRtbCxcbiAgeGxpbms6IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxuICB4bWw6IFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCIsXG4gIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvXCJcbn07XG4iLCJpbXBvcnQgc291cmNlRXZlbnQgZnJvbSBcIi4vc291cmNlRXZlbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZXZlbnQsIG5vZGUpIHtcbiAgZXZlbnQgPSBzb3VyY2VFdmVudChldmVudCk7XG4gIGlmIChub2RlID09PSB1bmRlZmluZWQpIG5vZGUgPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuICBpZiAobm9kZSkge1xuICAgIHZhciBzdmcgPSBub2RlLm93bmVyU1ZHRWxlbWVudCB8fCBub2RlO1xuICAgIGlmIChzdmcuY3JlYXRlU1ZHUG9pbnQpIHtcbiAgICAgIHZhciBwb2ludCA9IHN2Zy5jcmVhdGVTVkdQb2ludCgpO1xuICAgICAgcG9pbnQueCA9IGV2ZW50LmNsaWVudFgsIHBvaW50LnkgPSBldmVudC5jbGllbnRZO1xuICAgICAgcG9pbnQgPSBwb2ludC5tYXRyaXhUcmFuc2Zvcm0obm9kZS5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpO1xuICAgICAgcmV0dXJuIFtwb2ludC54LCBwb2ludC55XTtcbiAgICB9XG4gICAgaWYgKG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7XG4gICAgICB2YXIgcmVjdCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICByZXR1cm4gW2V2ZW50LmNsaWVudFggLSByZWN0LmxlZnQgLSBub2RlLmNsaWVudExlZnQsIGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCAtIG5vZGUuY2xpZW50VG9wXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtldmVudC5wYWdlWCwgZXZlbnQucGFnZVldO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb24sIHJvb3R9IGZyb20gXCIuL3NlbGVjdGlvbi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiXG4gICAgICA/IG5ldyBTZWxlY3Rpb24oW1tkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKV1dLCBbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSlcbiAgICAgIDogbmV3IFNlbGVjdGlvbihbW3NlbGVjdG9yXV0sIHJvb3QpO1xufVxuIiwiaW1wb3J0IGNyZWF0b3IgZnJvbSBcIi4uL2NyZWF0b3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpO1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9KTtcbn1cbiIsImltcG9ydCBuYW1lc3BhY2UgZnJvbSBcIi4uL25hbWVzcGFjZS5qc1wiO1xuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlTlMoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50KG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudE5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHZhbHVlKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoZnVsbG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHYpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUoKTtcbiAgICByZXR1cm4gZnVsbG5hbWUubG9jYWxcbiAgICAgICAgPyBub2RlLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbClcbiAgICAgICAgOiBub2RlLmdldEF0dHJpYnV0ZShmdWxsbmFtZSk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJSZW1vdmVOUyA6IGF0dHJSZW1vdmUpIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TIDogYXR0ckZ1bmN0aW9uKVxuICAgICAgOiAoZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyA6IGF0dHJDb25zdGFudCkpKShmdWxsbmFtZSwgdmFsdWUpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbMF07XG4gIGFyZ3VtZW50c1swXSA9IHRoaXM7XG4gIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwiZnVuY3Rpb24gY2xhc3NBcnJheShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy50cmltKCkuc3BsaXQoL158XFxzKy8pO1xufVxuXG5mdW5jdGlvbiBjbGFzc0xpc3Qobm9kZSkge1xuICByZXR1cm4gbm9kZS5jbGFzc0xpc3QgfHwgbmV3IENsYXNzTGlzdChub2RlKTtcbn1cblxuZnVuY3Rpb24gQ2xhc3NMaXN0KG5vZGUpIHtcbiAgdGhpcy5fbm9kZSA9IG5vZGU7XG4gIHRoaXMuX25hbWVzID0gY2xhc3NBcnJheShub2RlLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpIHx8IFwiXCIpO1xufVxuXG5DbGFzc0xpc3QucHJvdG90eXBlID0ge1xuICBhZGQ6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgaWYgKGkgPCAwKSB7XG4gICAgICB0aGlzLl9uYW1lcy5wdXNoKG5hbWUpO1xuICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLl9uYW1lcy5qb2luKFwiIFwiKSk7XG4gICAgfVxuICB9LFxuICByZW1vdmU6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgaWYgKGkgPj0gMCkge1xuICAgICAgdGhpcy5fbmFtZXMuc3BsaWNlKGksIDEpO1xuICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLl9uYW1lcy5qb2luKFwiIFwiKSk7XG4gICAgfVxuICB9LFxuICBjb250YWluczogZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpID49IDA7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNsYXNzZWRBZGQobm9kZSwgbmFtZXMpIHtcbiAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgd2hpbGUgKCsraSA8IG4pIGxpc3QuYWRkKG5hbWVzW2ldKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZFJlbW92ZShub2RlLCBuYW1lcykge1xuICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICB3aGlsZSAoKytpIDwgbikgbGlzdC5yZW1vdmUobmFtZXNbaV0pO1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkVHJ1ZShuYW1lcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgY2xhc3NlZEFkZCh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRGYWxzZShuYW1lcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgY2xhc3NlZFJlbW92ZSh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRGdW5jdGlvbihuYW1lcywgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICh2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpID8gY2xhc3NlZEFkZCA6IGNsYXNzZWRSZW1vdmUpKHRoaXMsIG5hbWVzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIG5hbWVzID0gY2xhc3NBcnJheShuYW1lICsgXCJcIik7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIGxpc3QgPSBjbGFzc0xpc3QodGhpcy5ub2RlKCkpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gICAgd2hpbGUgKCsraSA8IG4pIGlmICghbGlzdC5jb250YWlucyhuYW1lc1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IGNsYXNzZWRGdW5jdGlvbiA6IHZhbHVlXG4gICAgICA/IGNsYXNzZWRUcnVlXG4gICAgICA6IGNsYXNzZWRGYWxzZSkobmFtZXMsIHZhbHVlKSk7XG59XG4iLCJmdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmVTaGFsbG93KCkge1xuICB2YXIgY2xvbmUgPSB0aGlzLmNsb25lTm9kZShmYWxzZSksIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcpIDogY2xvbmU7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZURlZXAoKSB7XG4gIHZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKHRydWUpLCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gIHJldHVybiBwYXJlbnQgPyBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lLCB0aGlzLm5leHRTaWJsaW5nKSA6IGNsb25lO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihkZWVwKSB7XG4gIHJldHVybiB0aGlzLnNlbGVjdChkZWVwID8gc2VsZWN0aW9uX2Nsb25lRGVlcCA6IHNlbGVjdGlvbl9jbG9uZVNoYWxsb3cpO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQge0VudGVyTm9kZX0gZnJvbSBcIi4vZW50ZXIuanNcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi4vY29uc3RhbnQuanNcIjtcblxuZnVuY3Rpb24gYmluZEluZGV4KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEpIHtcbiAgdmFyIGkgPSAwLFxuICAgICAgbm9kZSxcbiAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLFxuICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuXG4gIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBmaXQgaW50byB1cGRhdGUuXG4gIC8vIFB1dCBhbnkgbnVsbCBub2RlcyBpbnRvIGVudGVyLlxuICAvLyBQdXQgYW55IHJlbWFpbmluZyBkYXRhIGludG8gZW50ZXIuXG4gIGZvciAoOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7XG4gICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07XG4gICAgICB1cGRhdGVbaV0gPSBub2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTtcbiAgICB9XG4gIH1cblxuICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZG9u4oCZdCBmaXQgaW50byBleGl0LlxuICBmb3IgKDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICBleGl0W2ldID0gbm9kZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYmluZEtleShwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhLCBrZXkpIHtcbiAgdmFyIGksXG4gICAgICBub2RlLFxuICAgICAgbm9kZUJ5S2V5VmFsdWUgPSBuZXcgTWFwLFxuICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsXG4gICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsXG4gICAgICBrZXlWYWx1ZXMgPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpLFxuICAgICAga2V5VmFsdWU7XG5cbiAgLy8gQ29tcHV0ZSB0aGUga2V5IGZvciBlYWNoIG5vZGUuXG4gIC8vIElmIG11bHRpcGxlIG5vZGVzIGhhdmUgdGhlIHNhbWUga2V5LCB0aGUgZHVwbGljYXRlcyBhcmUgYWRkZWQgdG8gZXhpdC5cbiAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICBrZXlWYWx1ZXNbaV0gPSBrZXlWYWx1ZSA9IGtleS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSArIFwiXCI7XG4gICAgICBpZiAobm9kZUJ5S2V5VmFsdWUuaGFzKGtleVZhbHVlKSkge1xuICAgICAgICBleGl0W2ldID0gbm9kZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGVCeUtleVZhbHVlLnNldChrZXlWYWx1ZSwgbm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ29tcHV0ZSB0aGUga2V5IGZvciBlYWNoIGRhdHVtLlxuICAvLyBJZiB0aGVyZSBhIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5LCBqb2luIGFuZCBhZGQgaXQgdG8gdXBkYXRlLlxuICAvLyBJZiB0aGVyZSBpcyBub3QgKG9yIHRoZSBrZXkgaXMgYSBkdXBsaWNhdGUpLCBhZGQgaXQgdG8gZW50ZXIuXG4gIGZvciAoaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyArK2kpIHtcbiAgICBrZXlWYWx1ZSA9IGtleS5jYWxsKHBhcmVudCwgZGF0YVtpXSwgaSwgZGF0YSkgKyBcIlwiO1xuICAgIGlmIChub2RlID0gbm9kZUJ5S2V5VmFsdWUuZ2V0KGtleVZhbHVlKSkge1xuICAgICAgdXBkYXRlW2ldID0gbm9kZTtcbiAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldO1xuICAgICAgbm9kZUJ5S2V5VmFsdWUuZGVsZXRlKGtleVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIGFueSByZW1haW5pbmcgbm9kZXMgdGhhdCB3ZXJlIG5vdCBib3VuZCB0byBkYXRhIHRvIGV4aXQuXG4gIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWVzW2ldKSA9PT0gbm9kZSkpIHtcbiAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkYXR1bShub2RlKSB7XG4gIHJldHVybiBub2RlLl9fZGF0YV9fO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIEFycmF5LmZyb20odGhpcywgZGF0dW0pO1xuXG4gIHZhciBiaW5kID0ga2V5ID8gYmluZEtleSA6IGJpbmRJbmRleCxcbiAgICAgIHBhcmVudHMgPSB0aGlzLl9wYXJlbnRzLFxuICAgICAgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzO1xuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdmFsdWUgPSBjb25zdGFudCh2YWx1ZSk7XG5cbiAgZm9yICh2YXIgbSA9IGdyb3Vwcy5sZW5ndGgsIHVwZGF0ZSA9IG5ldyBBcnJheShtKSwgZW50ZXIgPSBuZXcgQXJyYXkobSksIGV4aXQgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgdmFyIHBhcmVudCA9IHBhcmVudHNbal0sXG4gICAgICAgIGdyb3VwID0gZ3JvdXBzW2pdLFxuICAgICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgICAgZGF0YSA9IGFycmF5bGlrZSh2YWx1ZS5jYWxsKHBhcmVudCwgcGFyZW50ICYmIHBhcmVudC5fX2RhdGFfXywgaiwgcGFyZW50cykpLFxuICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsXG4gICAgICAgIGVudGVyR3JvdXAgPSBlbnRlcltqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSxcbiAgICAgICAgdXBkYXRlR3JvdXAgPSB1cGRhdGVbal0gPSBuZXcgQXJyYXkoZGF0YUxlbmd0aCksXG4gICAgICAgIGV4aXRHcm91cCA9IGV4aXRbal0gPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpO1xuXG4gICAgYmluZChwYXJlbnQsIGdyb3VwLCBlbnRlckdyb3VwLCB1cGRhdGVHcm91cCwgZXhpdEdyb3VwLCBkYXRhLCBrZXkpO1xuXG4gICAgLy8gTm93IGNvbm5lY3QgdGhlIGVudGVyIG5vZGVzIHRvIHRoZWlyIGZvbGxvd2luZyB1cGRhdGUgbm9kZSwgc3VjaCB0aGF0XG4gICAgLy8gYXBwZW5kQ2hpbGQgY2FuIGluc2VydCB0aGUgbWF0ZXJpYWxpemVkIGVudGVyIG5vZGUgYmVmb3JlIHRoaXMgbm9kZSxcbiAgICAvLyByYXRoZXIgdGhhbiBhdCB0aGUgZW5kIG9mIHRoZSBwYXJlbnQgbm9kZS5cbiAgICBmb3IgKHZhciBpMCA9IDAsIGkxID0gMCwgcHJldmlvdXMsIG5leHQ7IGkwIDwgZGF0YUxlbmd0aDsgKytpMCkge1xuICAgICAgaWYgKHByZXZpb3VzID0gZW50ZXJHcm91cFtpMF0pIHtcbiAgICAgICAgaWYgKGkwID49IGkxKSBpMSA9IGkwICsgMTtcbiAgICAgICAgd2hpbGUgKCEobmV4dCA9IHVwZGF0ZUdyb3VwW2kxXSkgJiYgKytpMSA8IGRhdGFMZW5ndGgpO1xuICAgICAgICBwcmV2aW91cy5fbmV4dCA9IG5leHQgfHwgbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGUgPSBuZXcgU2VsZWN0aW9uKHVwZGF0ZSwgcGFyZW50cyk7XG4gIHVwZGF0ZS5fZW50ZXIgPSBlbnRlcjtcbiAgdXBkYXRlLl9leGl0ID0gZXhpdDtcbiAgcmV0dXJuIHVwZGF0ZTtcbn1cblxuLy8gR2l2ZW4gc29tZSBkYXRhLCB0aGlzIHJldHVybnMgYW4gYXJyYXktbGlrZSB2aWV3IG9mIGl0OiBhbiBvYmplY3QgdGhhdFxuLy8gZXhwb3NlcyBhIGxlbmd0aCBwcm9wZXJ0eSBhbmQgYWxsb3dzIG51bWVyaWMgaW5kZXhpbmcuIE5vdGUgdGhhdCB1bmxpa2Vcbi8vIHNlbGVjdEFsbCwgdGhpcyBpc27igJl0IHdvcnJpZWQgYWJvdXQg4oCcbGl2ZeKAnSBjb2xsZWN0aW9ucyBiZWNhdXNlIHRoZSByZXN1bHRpbmdcbi8vIGFycmF5IHdpbGwgb25seSBiZSB1c2VkIGJyaWVmbHkgd2hpbGUgZGF0YSBpcyBiZWluZyBib3VuZC4gKEl0IGlzIHBvc3NpYmxlIHRvXG4vLyBjYXVzZSB0aGUgZGF0YSB0byBjaGFuZ2Ugd2hpbGUgaXRlcmF0aW5nIGJ5IHVzaW5nIGEga2V5IGZ1bmN0aW9uLCBidXQgcGxlYXNlXG4vLyBkb27igJl0OyB3ZeKAmWQgcmF0aGVyIGF2b2lkIGEgZ3JhdHVpdG91cyBjb3B5LilcbmZ1bmN0aW9uIGFycmF5bGlrZShkYXRhKSB7XG4gIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJiBcImxlbmd0aFwiIGluIGRhdGFcbiAgICA/IGRhdGEgLy8gQXJyYXksIFR5cGVkQXJyYXksIE5vZGVMaXN0LCBhcnJheS1saWtlXG4gICAgOiBBcnJheS5mcm9tKGRhdGEpOyAvLyBNYXAsIFNldCwgaXRlcmFibGUsIHN0cmluZywgb3IgYW55dGhpbmcgZWxzZVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5wcm9wZXJ0eShcIl9fZGF0YV9fXCIsIHZhbHVlKVxuICAgICAgOiB0aGlzLm5vZGUoKS5fX2RhdGFfXztcbn1cbiIsImltcG9ydCBkZWZhdWx0VmlldyBmcm9tIFwiLi4vd2luZG93LmpzXCI7XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQobm9kZSwgdHlwZSwgcGFyYW1zKSB7XG4gIHZhciB3aW5kb3cgPSBkZWZhdWx0Vmlldyhub2RlKSxcbiAgICAgIGV2ZW50ID0gd2luZG93LkN1c3RvbUV2ZW50O1xuXG4gIGlmICh0eXBlb2YgZXZlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGV2ZW50ID0gbmV3IGV2ZW50KHR5cGUsIHBhcmFtcyk7XG4gIH0gZWxzZSB7XG4gICAgZXZlbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKTtcbiAgICBpZiAocGFyYW1zKSBldmVudC5pbml0RXZlbnQodHlwZSwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlKSwgZXZlbnQuZGV0YWlsID0gcGFyYW1zLmRldGFpbDtcbiAgICBlbHNlIGV2ZW50LmluaXRFdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UpO1xuICB9XG5cbiAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hDb25zdGFudCh0eXBlLCBwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRnVuY3Rpb24odHlwZSwgcGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCB0eXBlLCBwYXJhbXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHR5cGUsIHBhcmFtcykge1xuICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgcGFyYW1zID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gZGlzcGF0Y2hGdW5jdGlvblxuICAgICAgOiBkaXNwYXRjaENvbnN0YW50KSh0eXBlLCBwYXJhbXMpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIGNhbGxiYWNrLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiAhdGhpcy5ub2RlKCk7XG59XG4iLCJpbXBvcnQgc3BhcnNlIGZyb20gXCIuL3NwYXJzZS5qc1wiO1xuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9lbnRlciB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRW50ZXJOb2RlKHBhcmVudCwgZGF0dW0pIHtcbiAgdGhpcy5vd25lckRvY3VtZW50ID0gcGFyZW50Lm93bmVyRG9jdW1lbnQ7XG4gIHRoaXMubmFtZXNwYWNlVVJJID0gcGFyZW50Lm5hbWVzcGFjZVVSSTtcbiAgdGhpcy5fbmV4dCA9IG51bGw7XG4gIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgdGhpcy5fX2RhdGFfXyA9IGRhdHVtO1xufVxuXG5FbnRlck5vZGUucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRW50ZXJOb2RlLFxuICBhcHBlbmRDaGlsZDogZnVuY3Rpb24oY2hpbGQpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIHRoaXMuX25leHQpOyB9LFxuICBpbnNlcnRCZWZvcmU6IGZ1bmN0aW9uKGNoaWxkLCBuZXh0KSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBuZXh0KTsgfSxcbiAgcXVlcnlTZWxlY3RvcjogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsgfSxcbiAgcXVlcnlTZWxlY3RvckFsbDogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsgfVxufTtcbiIsImltcG9ydCBzcGFyc2UgZnJvbSBcIi4vc3BhcnNlLmpzXCI7XG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2V4aXQgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IG1hdGNoZXIgZnJvbSBcIi4uL21hdGNoZXIuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gXCJmdW5jdGlvblwiKSBtYXRjaCA9IG1hdGNoZXIobWF0Y2gpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBtYXRjaC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkge1xuICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJmdW5jdGlvbiBodG1sUmVtb3ZlKCkge1xuICB0aGlzLmlubmVySFRNTCA9IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGh0bWxDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5pbm5lckhUTUwgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaHRtbEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5pbm5lckhUTUwgPSB2ID09IG51bGwgPyBcIlwiIDogdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IGh0bWxSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGh0bWxGdW5jdGlvblxuICAgICAgICAgIDogaHRtbENvbnN0YW50KSh2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpLmlubmVySFRNTDtcbn1cbiIsImltcG9ydCBzZWxlY3Rpb25fc2VsZWN0IGZyb20gXCIuL3NlbGVjdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RBbGwgZnJvbSBcIi4vc2VsZWN0QWxsLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NlbGVjdENoaWxkIGZyb20gXCIuL3NlbGVjdENoaWxkLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NlbGVjdENoaWxkcmVuIGZyb20gXCIuL3NlbGVjdENoaWxkcmVuLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2ZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGF0YSBmcm9tIFwiLi9kYXRhLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VudGVyIGZyb20gXCIuL2VudGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2V4aXQgZnJvbSBcIi4vZXhpdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9qb2luIGZyb20gXCIuL2pvaW4uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbWVyZ2UgZnJvbSBcIi4vbWVyZ2UuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fb3JkZXIgZnJvbSBcIi4vb3JkZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc29ydCBmcm9tIFwiLi9zb3J0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2NhbGwgZnJvbSBcIi4vY2FsbC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9ub2RlcyBmcm9tIFwiLi9ub2Rlcy5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9ub2RlIGZyb20gXCIuL25vZGUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2l6ZSBmcm9tIFwiLi9zaXplLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VtcHR5IGZyb20gXCIuL2VtcHR5LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VhY2ggZnJvbSBcIi4vZWFjaC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9hdHRyIGZyb20gXCIuL2F0dHIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc3R5bGUgZnJvbSBcIi4vc3R5bGUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fcHJvcGVydHkgZnJvbSBcIi4vcHJvcGVydHkuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2xhc3NlZCBmcm9tIFwiLi9jbGFzc2VkLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3RleHQgZnJvbSBcIi4vdGV4dC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9odG1sIGZyb20gXCIuL2h0bWwuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fcmFpc2UgZnJvbSBcIi4vcmFpc2UuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbG93ZXIgZnJvbSBcIi4vbG93ZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fYXBwZW5kIGZyb20gXCIuL2FwcGVuZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9pbnNlcnQgZnJvbSBcIi4vaW5zZXJ0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3JlbW92ZSBmcm9tIFwiLi9yZW1vdmUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2xvbmUgZnJvbSBcIi4vY2xvbmUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGF0dW0gZnJvbSBcIi4vZGF0dW0uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fb24gZnJvbSBcIi4vb24uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGlzcGF0Y2ggZnJvbSBcIi4vZGlzcGF0Y2guanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faXRlcmF0b3IgZnJvbSBcIi4vaXRlcmF0b3IuanNcIjtcblxuZXhwb3J0IHZhciByb290ID0gW251bGxdO1xuXG5leHBvcnQgZnVuY3Rpb24gU2VsZWN0aW9uKGdyb3VwcywgcGFyZW50cykge1xuICB0aGlzLl9ncm91cHMgPSBncm91cHM7XG4gIHRoaXMuX3BhcmVudHMgPSBwYXJlbnRzO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0sIHJvb3QpO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0aW9uKCkge1xuICByZXR1cm4gdGhpcztcbn1cblxuU2VsZWN0aW9uLnByb3RvdHlwZSA9IHNlbGVjdGlvbi5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBTZWxlY3Rpb24sXG4gIHNlbGVjdDogc2VsZWN0aW9uX3NlbGVjdCxcbiAgc2VsZWN0QWxsOiBzZWxlY3Rpb25fc2VsZWN0QWxsLFxuICBzZWxlY3RDaGlsZDogc2VsZWN0aW9uX3NlbGVjdENoaWxkLFxuICBzZWxlY3RDaGlsZHJlbjogc2VsZWN0aW9uX3NlbGVjdENoaWxkcmVuLFxuICBmaWx0ZXI6IHNlbGVjdGlvbl9maWx0ZXIsXG4gIGRhdGE6IHNlbGVjdGlvbl9kYXRhLFxuICBlbnRlcjogc2VsZWN0aW9uX2VudGVyLFxuICBleGl0OiBzZWxlY3Rpb25fZXhpdCxcbiAgam9pbjogc2VsZWN0aW9uX2pvaW4sXG4gIG1lcmdlOiBzZWxlY3Rpb25fbWVyZ2UsXG4gIHNlbGVjdGlvbjogc2VsZWN0aW9uX3NlbGVjdGlvbixcbiAgb3JkZXI6IHNlbGVjdGlvbl9vcmRlcixcbiAgc29ydDogc2VsZWN0aW9uX3NvcnQsXG4gIGNhbGw6IHNlbGVjdGlvbl9jYWxsLFxuICBub2Rlczogc2VsZWN0aW9uX25vZGVzLFxuICBub2RlOiBzZWxlY3Rpb25fbm9kZSxcbiAgc2l6ZTogc2VsZWN0aW9uX3NpemUsXG4gIGVtcHR5OiBzZWxlY3Rpb25fZW1wdHksXG4gIGVhY2g6IHNlbGVjdGlvbl9lYWNoLFxuICBhdHRyOiBzZWxlY3Rpb25fYXR0cixcbiAgc3R5bGU6IHNlbGVjdGlvbl9zdHlsZSxcbiAgcHJvcGVydHk6IHNlbGVjdGlvbl9wcm9wZXJ0eSxcbiAgY2xhc3NlZDogc2VsZWN0aW9uX2NsYXNzZWQsXG4gIHRleHQ6IHNlbGVjdGlvbl90ZXh0LFxuICBodG1sOiBzZWxlY3Rpb25faHRtbCxcbiAgcmFpc2U6IHNlbGVjdGlvbl9yYWlzZSxcbiAgbG93ZXI6IHNlbGVjdGlvbl9sb3dlcixcbiAgYXBwZW5kOiBzZWxlY3Rpb25fYXBwZW5kLFxuICBpbnNlcnQ6IHNlbGVjdGlvbl9pbnNlcnQsXG4gIHJlbW92ZTogc2VsZWN0aW9uX3JlbW92ZSxcbiAgY2xvbmU6IHNlbGVjdGlvbl9jbG9uZSxcbiAgZGF0dW06IHNlbGVjdGlvbl9kYXR1bSxcbiAgb246IHNlbGVjdGlvbl9vbixcbiAgZGlzcGF0Y2g6IHNlbGVjdGlvbl9kaXNwYXRjaCxcbiAgW1N5bWJvbC5pdGVyYXRvcl06IHNlbGVjdGlvbl9pdGVyYXRvclxufTtcblxuZXhwb3J0IGRlZmF1bHQgc2VsZWN0aW9uO1xuIiwiaW1wb3J0IGNyZWF0b3IgZnJvbSBcIi4uL2NyZWF0b3IuanNcIjtcbmltcG9ydCBzZWxlY3RvciBmcm9tIFwiLi4vc2VsZWN0b3IuanNcIjtcblxuZnVuY3Rpb24gY29uc3RhbnROdWxsKCkge1xuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgYmVmb3JlKSB7XG4gIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gXCJmdW5jdGlvblwiID8gbmFtZSA6IGNyZWF0b3IobmFtZSksXG4gICAgICBzZWxlY3QgPSBiZWZvcmUgPT0gbnVsbCA/IGNvbnN0YW50TnVsbCA6IHR5cGVvZiBiZWZvcmUgPT09IFwiZnVuY3Rpb25cIiA/IGJlZm9yZSA6IHNlbGVjdG9yKGJlZm9yZSk7XG4gIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IG51bGwpO1xuICB9KTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKigpIHtcbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHlpZWxkIG5vZGU7XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihvbmVudGVyLCBvbnVwZGF0ZSwgb25leGl0KSB7XG4gIHZhciBlbnRlciA9IHRoaXMuZW50ZXIoKSwgdXBkYXRlID0gdGhpcywgZXhpdCA9IHRoaXMuZXhpdCgpO1xuICBpZiAodHlwZW9mIG9uZW50ZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGVudGVyID0gb25lbnRlcihlbnRlcik7XG4gICAgaWYgKGVudGVyKSBlbnRlciA9IGVudGVyLnNlbGVjdGlvbigpO1xuICB9IGVsc2Uge1xuICAgIGVudGVyID0gZW50ZXIuYXBwZW5kKG9uZW50ZXIgKyBcIlwiKTtcbiAgfVxuICBpZiAob251cGRhdGUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZSA9IG9udXBkYXRlKHVwZGF0ZSk7XG4gICAgaWYgKHVwZGF0ZSkgdXBkYXRlID0gdXBkYXRlLnNlbGVjdGlvbigpO1xuICB9XG4gIGlmIChvbmV4aXQgPT0gbnVsbCkgZXhpdC5yZW1vdmUoKTsgZWxzZSBvbmV4aXQoZXhpdCk7XG4gIHJldHVybiBlbnRlciAmJiB1cGRhdGUgPyBlbnRlci5tZXJnZSh1cGRhdGUpLm9yZGVyKCkgOiB1cGRhdGU7XG59XG4iLCJmdW5jdGlvbiBsb3dlcigpIHtcbiAgaWYgKHRoaXMucHJldmlvdXNTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMsIHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gobG93ZXIpO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgdmFyIHNlbGVjdGlvbiA9IGNvbnRleHQuc2VsZWN0aW9uID8gY29udGV4dC5zZWxlY3Rpb24oKSA6IGNvbnRleHQ7XG5cbiAgZm9yICh2YXIgZ3JvdXBzMCA9IHRoaXMuX2dyb3VwcywgZ3JvdXBzMSA9IHNlbGVjdGlvbi5fZ3JvdXBzLCBtMCA9IGdyb3VwczAubGVuZ3RoLCBtMSA9IGdyb3VwczEubGVuZ3RoLCBtID0gTWF0aC5taW4obTAsIG0xKSwgbWVyZ2VzID0gbmV3IEFycmF5KG0wKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91cDFbaV0pIHtcbiAgICAgICAgbWVyZ2VbaV0gPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBqIDwgbTA7ICsraikge1xuICAgIG1lcmdlc1tqXSA9IGdyb3VwczBbal07XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgIHZhciBub2RlID0gZ3JvdXBbaV07XG4gICAgICBpZiAobm9kZSkgcmV0dXJuIG5vZGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20odGhpcyk7XG59XG4iLCJmdW5jdGlvbiBjb250ZXh0TGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudCwgdGhpcy5fX2RhdGFfXyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lcykge1xuICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykubWFwKGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgbmFtZSA9IFwiXCIsIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgcmV0dXJuIHt0eXBlOiB0LCBuYW1lOiBuYW1lfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9uUmVtb3ZlKHR5cGVuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgb24gPSB0aGlzLl9fb247XG4gICAgaWYgKCFvbikgcmV0dXJuO1xuICAgIGZvciAodmFyIGogPSAwLCBpID0gLTEsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHtcbiAgICAgIGlmIChvID0gb25bal0sICghdHlwZW5hbWUudHlwZSB8fCBvLnR5cGUgPT09IHR5cGVuYW1lLnR5cGUpICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLm9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25bKytpXSA9IG87XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgrK2kpIG9uLmxlbmd0aCA9IGk7XG4gICAgZWxzZSBkZWxldGUgdGhpcy5fX29uO1xuICB9O1xufVxuXG5mdW5jdGlvbiBvbkFkZCh0eXBlbmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBvbiA9IHRoaXMuX19vbiwgbywgbGlzdGVuZXIgPSBjb250ZXh0TGlzdGVuZXIodmFsdWUpO1xuICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICAgIGlmICgobyA9IG9uW2pdKS50eXBlID09PSB0eXBlbmFtZS50eXBlICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLm9wdGlvbnMpO1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyID0gbGlzdGVuZXIsIG8ub3B0aW9ucyA9IG9wdGlvbnMpO1xuICAgICAgICBvLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGVuYW1lLnR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICBvID0ge3R5cGU6IHR5cGVuYW1lLnR5cGUsIG5hbWU6IHR5cGVuYW1lLm5hbWUsIHZhbHVlOiB2YWx1ZSwgbGlzdGVuZXI6IGxpc3RlbmVyLCBvcHRpb25zOiBvcHRpb25zfTtcbiAgICBpZiAoIW9uKSB0aGlzLl9fb24gPSBbb107XG4gICAgZWxzZSBvbi5wdXNoKG8pO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0eXBlbmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgdmFyIHR5cGVuYW1lcyA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgXCJcIiksIGksIG4gPSB0eXBlbmFtZXMubGVuZ3RoLCB0O1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBvbiA9IHRoaXMubm9kZSgpLl9fb247XG4gICAgaWYgKG9uKSBmb3IgKHZhciBqID0gMCwgbSA9IG9uLmxlbmd0aCwgbzsgaiA8IG07ICsraikge1xuICAgICAgZm9yIChpID0gMCwgbyA9IG9uW2pdOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICgodCA9IHR5cGVuYW1lc1tpXSkudHlwZSA9PT0gby50eXBlICYmIHQubmFtZSA9PT0gby5uYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIG8udmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb24gPSB2YWx1ZSA/IG9uQWRkIDogb25SZW1vdmU7XG4gIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHRoaXMuZWFjaChvbih0eXBlbmFtZXNbaV0sIHZhbHVlLCBvcHRpb25zKSk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gLTEsIG0gPSBncm91cHMubGVuZ3RoOyArK2ogPCBtOykge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gZ3JvdXAubGVuZ3RoIC0gMSwgbmV4dCA9IGdyb3VwW2ldLCBub2RlOyAtLWkgPj0gMDspIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgaWYgKG5leHQgJiYgbm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuZXh0KSBeIDQpIG5leHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgbmV4dCk7XG4gICAgICAgIG5leHQgPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuIiwiZnVuY3Rpb24gcHJvcGVydHlSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgZGVsZXRlIHRoaXNbbmFtZV07XG4gIH07XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5Q29uc3RhbnQobmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXNbbmFtZV0gPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlGdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSB0aGlzW25hbWVdO1xuICAgIGVsc2UgdGhpc1tuYW1lXSA9IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMVxuICAgICAgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IHByb3BlcnR5UmVtb3ZlIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHByb3BlcnR5RnVuY3Rpb25cbiAgICAgICAgICA6IHByb3BlcnR5Q29uc3RhbnQpKG5hbWUsIHZhbHVlKSlcbiAgICAgIDogdGhpcy5ub2RlKClbbmFtZV07XG59XG4iLCJmdW5jdGlvbiByYWlzZSgpIHtcbiAgaWYgKHRoaXMubmV4dFNpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gocmFpc2UpO1xufVxuIiwiZnVuY3Rpb24gcmVtb3ZlKCkge1xuICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lYWNoKHJlbW92ZSk7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzZWxlY3RvciBmcm9tIFwiLi4vc2VsZWN0b3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IHNlbGVjdG9yKHNlbGVjdCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgc3Vibm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAoc3Vibm9kZSA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkpIHtcbiAgICAgICAgaWYgKFwiX19kYXRhX19cIiBpbiBub2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5fX2RhdGFfXztcbiAgICAgICAgc3ViZ3JvdXBbaV0gPSBzdWJub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBhcnJheSBmcm9tIFwiLi4vYXJyYXkuanNcIjtcbmltcG9ydCBzZWxlY3RvckFsbCBmcm9tIFwiLi4vc2VsZWN0b3JBbGwuanNcIjtcblxuZnVuY3Rpb24gYXJyYXlBbGwoc2VsZWN0KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYXJyYXkoc2VsZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgaWYgKHR5cGVvZiBzZWxlY3QgPT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gYXJyYXlBbGwoc2VsZWN0KTtcbiAgZWxzZSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHN1Ymdyb3Vwcy5wdXNoKHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSk7XG4gICAgICAgIHBhcmVudHMucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHBhcmVudHMpO1xufVxuIiwiaW1wb3J0IHtjaGlsZE1hdGNoZXJ9IGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbnZhciBmaW5kID0gQXJyYXkucHJvdG90eXBlLmZpbmQ7XG5cbmZ1bmN0aW9uIGNoaWxkRmluZChtYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZpbmQuY2FsbCh0aGlzLmNoaWxkcmVuLCBtYXRjaCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNoaWxkRmlyc3QoKSB7XG4gIHJldHVybiB0aGlzLmZpcnN0RWxlbWVudENoaWxkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3QobWF0Y2ggPT0gbnVsbCA/IGNoaWxkRmlyc3RcbiAgICAgIDogY2hpbGRGaW5kKHR5cGVvZiBtYXRjaCA9PT0gXCJmdW5jdGlvblwiID8gbWF0Y2ggOiBjaGlsZE1hdGNoZXIobWF0Y2gpKSk7XG59XG4iLCJpbXBvcnQge2NoaWxkTWF0Y2hlcn0gZnJvbSBcIi4uL21hdGNoZXIuanNcIjtcblxudmFyIGZpbHRlciA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXI7XG5cbmZ1bmN0aW9uIGNoaWxkcmVuKCkge1xuICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuKTtcbn1cblxuZnVuY3Rpb24gY2hpbGRyZW5GaWx0ZXIobWF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmaWx0ZXIuY2FsbCh0aGlzLmNoaWxkcmVuLCBtYXRjaCk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIHJldHVybiB0aGlzLnNlbGVjdEFsbChtYXRjaCA9PSBudWxsID8gY2hpbGRyZW5cbiAgICAgIDogY2hpbGRyZW5GaWx0ZXIodHlwZW9mIG1hdGNoID09PSBcImZ1bmN0aW9uXCIgPyBtYXRjaCA6IGNoaWxkTWF0Y2hlcihtYXRjaCkpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICBsZXQgc2l6ZSA9IDA7XG4gIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzKSArK3NpemU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgcmV0dXJuIHNpemU7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29tcGFyZSkge1xuICBpZiAoIWNvbXBhcmUpIGNvbXBhcmUgPSBhc2NlbmRpbmc7XG5cbiAgZnVuY3Rpb24gY29tcGFyZU5vZGUoYSwgYikge1xuICAgIHJldHVybiBhICYmIGIgPyBjb21wYXJlKGEuX19kYXRhX18sIGIuX19kYXRhX18pIDogIWEgLSAhYjtcbiAgfVxuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHNvcnRncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHNvcnRncm91cCA9IHNvcnRncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHNvcnRncm91cFtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICAgIHNvcnRncm91cC5zb3J0KGNvbXBhcmVOb2RlKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHNvcnRncm91cHMsIHRoaXMuX3BhcmVudHMpLm9yZGVyKCk7XG59XG5cbmZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7XG4gIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHVwZGF0ZSkge1xuICByZXR1cm4gbmV3IEFycmF5KHVwZGF0ZS5sZW5ndGgpO1xufVxuIiwiaW1wb3J0IGRlZmF1bHRWaWV3IGZyb20gXCIuLi93aW5kb3cuanNcIjtcblxuZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVDb25zdGFudChuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUsIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVGdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICAgIGVsc2UgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2LCBwcmlvcml0eSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDFcbiAgICAgID8gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgICA/IHN0eWxlUmVtb3ZlIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgID8gc3R5bGVGdW5jdGlvblxuICAgICAgICAgICAgOiBzdHlsZUNvbnN0YW50KShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkgPT0gbnVsbCA/IFwiXCIgOiBwcmlvcml0eSkpXG4gICAgICA6IHN0eWxlVmFsdWUodGhpcy5ub2RlKCksIG5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3R5bGVWYWx1ZShub2RlLCBuYW1lKSB7XG4gIHJldHVybiBub2RlLnN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSlcbiAgICAgIHx8IGRlZmF1bHRWaWV3KG5vZGUpLmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTtcbn1cbiIsImZ1bmN0aW9uIHRleHRSZW1vdmUoKSB7XG4gIHRoaXMudGV4dENvbnRlbnQgPSBcIlwiO1xufVxuXG5mdW5jdGlvbiB0ZXh0Q29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHYgPT0gbnVsbCA/IFwiXCIgOiB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbFxuICAgICAgICAgID8gdGV4dFJlbW92ZSA6ICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gdGV4dEZ1bmN0aW9uXG4gICAgICAgICAgOiB0ZXh0Q29uc3RhbnQpKHZhbHVlKSlcbiAgICAgIDogdGhpcy5ub2RlKCkudGV4dENvbnRlbnQ7XG59XG4iLCJmdW5jdGlvbiBub25lKCkge31cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBub25lIDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gIH07XG59XG4iLCJmdW5jdGlvbiBlbXB0eSgpIHtcbiAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gc2VsZWN0b3IgPT0gbnVsbCA/IGVtcHR5IDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCkge1xuICBsZXQgc291cmNlRXZlbnQ7XG4gIHdoaWxlIChzb3VyY2VFdmVudCA9IGV2ZW50LnNvdXJjZUV2ZW50KSBldmVudCA9IHNvdXJjZUV2ZW50O1xuICByZXR1cm4gZXZlbnQ7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlKSB7XG4gIHJldHVybiAobm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykgLy8gbm9kZSBpcyBhIE5vZGVcbiAgICAgIHx8IChub2RlLmRvY3VtZW50ICYmIG5vZGUpIC8vIG5vZGUgaXMgYSBXaW5kb3dcbiAgICAgIHx8IG5vZGUuZGVmYXVsdFZpZXc7IC8vIG5vZGUgaXMgYSBEb2N1bWVudFxufVxuIiwiaW1wb3J0IHtUaW1lcn0gZnJvbSBcIi4vdGltZXIuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7XG4gIHZhciB0ID0gbmV3IFRpbWVyO1xuICBkZWxheSA9IGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5O1xuICB0LnJlc3RhcnQoZWxhcHNlZCA9PiB7XG4gICAgdC5zdG9wKCk7XG4gICAgY2FsbGJhY2soZWxhcHNlZCArIGRlbGF5KTtcbiAgfSwgZGVsYXksIHRpbWUpO1xuICByZXR1cm4gdDtcbn1cbiIsInZhciBmcmFtZSA9IDAsIC8vIGlzIGFuIGFuaW1hdGlvbiBmcmFtZSBwZW5kaW5nP1xuICAgIHRpbWVvdXQgPSAwLCAvLyBpcyBhIHRpbWVvdXQgcGVuZGluZz9cbiAgICBpbnRlcnZhbCA9IDAsIC8vIGFyZSBhbnkgdGltZXJzIGFjdGl2ZT9cbiAgICBwb2tlRGVsYXkgPSAxMDAwLCAvLyBob3cgZnJlcXVlbnRseSB3ZSBjaGVjayBmb3IgY2xvY2sgc2tld1xuICAgIHRhc2tIZWFkLFxuICAgIHRhc2tUYWlsLFxuICAgIGNsb2NrTGFzdCA9IDAsXG4gICAgY2xvY2tOb3cgPSAwLFxuICAgIGNsb2NrU2tldyA9IDAsXG4gICAgY2xvY2sgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09IFwib2JqZWN0XCIgJiYgcGVyZm9ybWFuY2Uubm93ID8gcGVyZm9ybWFuY2UgOiBEYXRlLFxuICAgIHNldEZyYW1lID0gdHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIiAmJiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykgOiBmdW5jdGlvbihmKSB7IHNldFRpbWVvdXQoZiwgMTcpOyB9O1xuXG5leHBvcnQgZnVuY3Rpb24gbm93KCkge1xuICByZXR1cm4gY2xvY2tOb3cgfHwgKHNldEZyYW1lKGNsZWFyTm93KSwgY2xvY2tOb3cgPSBjbG9jay5ub3coKSArIGNsb2NrU2tldyk7XG59XG5cbmZ1bmN0aW9uIGNsZWFyTm93KCkge1xuICBjbG9ja05vdyA9IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBUaW1lcigpIHtcbiAgdGhpcy5fY2FsbCA9XG4gIHRoaXMuX3RpbWUgPVxuICB0aGlzLl9uZXh0ID0gbnVsbDtcbn1cblxuVGltZXIucHJvdG90eXBlID0gdGltZXIucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVGltZXIsXG4gIHJlc3RhcnQ6IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO1xuICAgIHRpbWUgPSAodGltZSA9PSBudWxsID8gbm93KCkgOiArdGltZSkgKyAoZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXkpO1xuICAgIGlmICghdGhpcy5fbmV4dCAmJiB0YXNrVGFpbCAhPT0gdGhpcykge1xuICAgICAgaWYgKHRhc2tUYWlsKSB0YXNrVGFpbC5fbmV4dCA9IHRoaXM7XG4gICAgICBlbHNlIHRhc2tIZWFkID0gdGhpcztcbiAgICAgIHRhc2tUYWlsID0gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fY2FsbCA9IGNhbGxiYWNrO1xuICAgIHRoaXMuX3RpbWUgPSB0aW1lO1xuICAgIHNsZWVwKCk7XG4gIH0sXG4gIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9jYWxsKSB7XG4gICAgICB0aGlzLl9jYWxsID0gbnVsbDtcbiAgICAgIHRoaXMuX3RpbWUgPSBJbmZpbml0eTtcbiAgICAgIHNsZWVwKCk7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdGltZXIoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7XG4gIHZhciB0ID0gbmV3IFRpbWVyO1xuICB0LnJlc3RhcnQoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKTtcbiAgcmV0dXJuIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aW1lckZsdXNoKCkge1xuICBub3coKTsgLy8gR2V0IHRoZSBjdXJyZW50IHRpbWUsIGlmIG5vdCBhbHJlYWR5IHNldC5cbiAgKytmcmFtZTsgLy8gUHJldGVuZCB3ZeKAmXZlIHNldCBhbiBhbGFybSwgaWYgd2UgaGF2ZW7igJl0IGFscmVhZHkuXG4gIHZhciB0ID0gdGFza0hlYWQsIGU7XG4gIHdoaWxlICh0KSB7XG4gICAgaWYgKChlID0gY2xvY2tOb3cgLSB0Ll90aW1lKSA+PSAwKSB0Ll9jYWxsLmNhbGwodW5kZWZpbmVkLCBlKTtcbiAgICB0ID0gdC5fbmV4dDtcbiAgfVxuICAtLWZyYW1lO1xufVxuXG5mdW5jdGlvbiB3YWtlKCkge1xuICBjbG9ja05vdyA9IChjbG9ja0xhc3QgPSBjbG9jay5ub3coKSkgKyBjbG9ja1NrZXc7XG4gIGZyYW1lID0gdGltZW91dCA9IDA7XG4gIHRyeSB7XG4gICAgdGltZXJGbHVzaCgpO1xuICB9IGZpbmFsbHkge1xuICAgIGZyYW1lID0gMDtcbiAgICBuYXAoKTtcbiAgICBjbG9ja05vdyA9IDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9rZSgpIHtcbiAgdmFyIG5vdyA9IGNsb2NrLm5vdygpLCBkZWxheSA9IG5vdyAtIGNsb2NrTGFzdDtcbiAgaWYgKGRlbGF5ID4gcG9rZURlbGF5KSBjbG9ja1NrZXcgLT0gZGVsYXksIGNsb2NrTGFzdCA9IG5vdztcbn1cblxuZnVuY3Rpb24gbmFwKCkge1xuICB2YXIgdDAsIHQxID0gdGFza0hlYWQsIHQyLCB0aW1lID0gSW5maW5pdHk7XG4gIHdoaWxlICh0MSkge1xuICAgIGlmICh0MS5fY2FsbCkge1xuICAgICAgaWYgKHRpbWUgPiB0MS5fdGltZSkgdGltZSA9IHQxLl90aW1lO1xuICAgICAgdDAgPSB0MSwgdDEgPSB0MS5fbmV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgdDIgPSB0MS5fbmV4dCwgdDEuX25leHQgPSBudWxsO1xuICAgICAgdDEgPSB0MCA/IHQwLl9uZXh0ID0gdDIgOiB0YXNrSGVhZCA9IHQyO1xuICAgIH1cbiAgfVxuICB0YXNrVGFpbCA9IHQwO1xuICBzbGVlcCh0aW1lKTtcbn1cblxuZnVuY3Rpb24gc2xlZXAodGltZSkge1xuICBpZiAoZnJhbWUpIHJldHVybjsgLy8gU29vbmVzdCBhbGFybSBhbHJlYWR5IHNldCwgb3Igd2lsbCBiZS5cbiAgaWYgKHRpbWVvdXQpIHRpbWVvdXQgPSBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gIHZhciBkZWxheSA9IHRpbWUgLSBjbG9ja05vdzsgLy8gU3RyaWN0bHkgbGVzcyB0aGFuIGlmIHdlIHJlY29tcHV0ZWQgY2xvY2tOb3cuXG4gIGlmIChkZWxheSA+IDI0KSB7XG4gICAgaWYgKHRpbWUgPCBJbmZpbml0eSkgdGltZW91dCA9IHNldFRpbWVvdXQod2FrZSwgdGltZSAtIGNsb2NrLm5vdygpIC0gY2xvY2tTa2V3KTtcbiAgICBpZiAoaW50ZXJ2YWwpIGludGVydmFsID0gY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFpbnRlcnZhbCkgY2xvY2tMYXN0ID0gY2xvY2subm93KCksIGludGVydmFsID0gc2V0SW50ZXJ2YWwocG9rZSwgcG9rZURlbGF5KTtcbiAgICBmcmFtZSA9IDEsIHNldEZyYW1lKHdha2UpO1xuICB9XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL3RyYW5zaXRpb24vaW5kZXguanNcIjtcbmltcG9ydCB7U0NIRURVTEVEfSBmcm9tIFwiLi90cmFuc2l0aW9uL3NjaGVkdWxlLmpzXCI7XG5cbnZhciByb290ID0gW251bGxdO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCBuYW1lKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbixcbiAgICAgIHNjaGVkdWxlLFxuICAgICAgaTtcblxuICBpZiAoc2NoZWR1bGVzKSB7XG4gICAgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgXCJcIjtcbiAgICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7XG4gICAgICBpZiAoKHNjaGVkdWxlID0gc2NoZWR1bGVzW2ldKS5zdGF0ZSA+IFNDSEVEVUxFRCAmJiBzY2hlZHVsZS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbihbW25vZGVdXSwgcm9vdCwgbmFtZSwgK2kpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwiaW1wb3J0IFwiLi9zZWxlY3Rpb24vaW5kZXguanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0cmFuc2l0aW9ufSBmcm9tIFwiLi90cmFuc2l0aW9uL2luZGV4LmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgYWN0aXZlfSBmcm9tIFwiLi9hY3RpdmUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnJ1cHR9IGZyb20gXCIuL2ludGVycnVwdC5qc1wiO1xuIiwiaW1wb3J0IHtTVEFSVElORywgRU5ESU5HLCBFTkRFRH0gZnJvbSBcIi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCBuYW1lKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbixcbiAgICAgIHNjaGVkdWxlLFxuICAgICAgYWN0aXZlLFxuICAgICAgZW1wdHkgPSB0cnVlLFxuICAgICAgaTtcblxuICBpZiAoIXNjaGVkdWxlcykgcmV0dXJuO1xuXG4gIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArIFwiXCI7XG5cbiAgZm9yIChpIGluIHNjaGVkdWxlcykge1xuICAgIGlmICgoc2NoZWR1bGUgPSBzY2hlZHVsZXNbaV0pLm5hbWUgIT09IG5hbWUpIHsgZW1wdHkgPSBmYWxzZTsgY29udGludWU7IH1cbiAgICBhY3RpdmUgPSBzY2hlZHVsZS5zdGF0ZSA+IFNUQVJUSU5HICYmIHNjaGVkdWxlLnN0YXRlIDwgRU5ESU5HO1xuICAgIHNjaGVkdWxlLnN0YXRlID0gRU5ERUQ7XG4gICAgc2NoZWR1bGUudGltZXIuc3RvcCgpO1xuICAgIHNjaGVkdWxlLm9uLmNhbGwoYWN0aXZlID8gXCJpbnRlcnJ1cHRcIiA6IFwiY2FuY2VsXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNjaGVkdWxlLmluZGV4LCBzY2hlZHVsZS5ncm91cCk7XG4gICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgfVxuXG4gIGlmIChlbXB0eSkgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uO1xufVxuIiwiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCBzZWxlY3Rpb25faW50ZXJydXB0IGZyb20gXCIuL2ludGVycnVwdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl90cmFuc2l0aW9uIGZyb20gXCIuL3RyYW5zaXRpb24uanNcIjtcblxuc2VsZWN0aW9uLnByb3RvdHlwZS5pbnRlcnJ1cHQgPSBzZWxlY3Rpb25faW50ZXJydXB0O1xuc2VsZWN0aW9uLnByb3RvdHlwZS50cmFuc2l0aW9uID0gc2VsZWN0aW9uX3RyYW5zaXRpb247XG4iLCJpbXBvcnQgaW50ZXJydXB0IGZyb20gXCIuLi9pbnRlcnJ1cHQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuICAgIGludGVycnVwdCh0aGlzLCBuYW1lKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb24sIG5ld0lkfSBmcm9tIFwiLi4vdHJhbnNpdGlvbi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlIGZyb20gXCIuLi90cmFuc2l0aW9uL3NjaGVkdWxlLmpzXCI7XG5pbXBvcnQge2Vhc2VDdWJpY0luT3V0fSBmcm9tIFwiZDMtZWFzZVwiO1xuaW1wb3J0IHtub3d9IGZyb20gXCJkMy10aW1lclwiO1xuXG52YXIgZGVmYXVsdFRpbWluZyA9IHtcbiAgdGltZTogbnVsbCwgLy8gU2V0IG9uIHVzZS5cbiAgZGVsYXk6IDAsXG4gIGR1cmF0aW9uOiAyNTAsXG4gIGVhc2U6IGVhc2VDdWJpY0luT3V0XG59O1xuXG5mdW5jdGlvbiBpbmhlcml0KG5vZGUsIGlkKSB7XG4gIHZhciB0aW1pbmc7XG4gIHdoaWxlICghKHRpbWluZyA9IG5vZGUuX190cmFuc2l0aW9uKSB8fCAhKHRpbWluZyA9IHRpbWluZ1tpZF0pKSB7XG4gICAgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHJhbnNpdGlvbiAke2lkfSBub3QgZm91bmRgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRpbWluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgaWQsXG4gICAgICB0aW1pbmc7XG5cbiAgaWYgKG5hbWUgaW5zdGFuY2VvZiBUcmFuc2l0aW9uKSB7XG4gICAgaWQgPSBuYW1lLl9pZCwgbmFtZSA9IG5hbWUuX25hbWU7XG4gIH0gZWxzZSB7XG4gICAgaWQgPSBuZXdJZCgpLCAodGltaW5nID0gZGVmYXVsdFRpbWluZykudGltZSA9IG5vdygpLCBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyBcIlwiO1xuICB9XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgc2NoZWR1bGUobm9kZSwgbmFtZSwgaWQsIGksIGdyb3VwLCB0aW1pbmcgfHwgaW5oZXJpdChub2RlLCBpZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTtcbn1cbiIsImltcG9ydCB7aW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmcgYXMgaW50ZXJwb2xhdGVUcmFuc2Zvcm19IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHtuYW1lc3BhY2V9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7dHdlZW5WYWx1ZX0gZnJvbSBcIi4vdHdlZW4uanNcIjtcbmltcG9ydCBpbnRlcnBvbGF0ZSBmcm9tIFwiLi9pbnRlcnBvbGF0ZS5qc1wiO1xuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlTlMoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50KG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCIsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnROUyhmdWxsbmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIixcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb24obmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAsIHZhbHVlMSA9IHZhbHVlKHRoaXMpLCBzdHJpbmcxO1xuICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwLCB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwgc3RyaW5nMTtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpLCBpID0gZnVsbG5hbWUgPT09IFwidHJhbnNmb3JtXCIgPyBpbnRlcnBvbGF0ZVRyYW5zZm9ybSA6IGludGVycG9sYXRlO1xuICByZXR1cm4gdGhpcy5hdHRyVHdlZW4obmFtZSwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24pKGZ1bGxuYW1lLCBpLCB0d2VlblZhbHVlKHRoaXMsIFwiYXR0ci5cIiArIG5hbWUsIHZhbHVlKSlcbiAgICAgIDogdmFsdWUgPT0gbnVsbCA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJSZW1vdmVOUyA6IGF0dHJSZW1vdmUpKGZ1bGxuYW1lKVxuICAgICAgOiAoZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyA6IGF0dHJDb25zdGFudCkoZnVsbG5hbWUsIGksIHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge25hbWVzcGFjZX0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuXG5mdW5jdGlvbiBhdHRySW50ZXJwb2xhdGUobmFtZSwgaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIGkuY2FsbCh0aGlzLCB0KSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJJbnRlcnBvbGF0ZU5TKGZ1bGxuYW1lLCBpKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIGkuY2FsbCh0aGlzLCB0KSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJUd2Vlbk5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIGF0dHJJbnRlcnBvbGF0ZU5TKGZ1bGxuYW1lLCBpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZnVuY3Rpb24gYXR0clR3ZWVuKG5hbWUsIHZhbHVlKSB7XG4gIHZhciB0MCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgYXR0ckludGVycG9sYXRlKG5hbWUsIGkpO1xuICAgIHJldHVybiB0MDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIga2V5ID0gXCJhdHRyLlwiICsgbmFtZTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG4gIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgKGZ1bGxuYW1lLmxvY2FsID8gYXR0clR3ZWVuTlMgOiBhdHRyVHdlZW4pKGZ1bGxuYW1lLCB2YWx1ZSkpO1xufVxuIiwiaW1wb3J0IHtnZXQsIGluaXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGRlbGF5RnVuY3Rpb24oaWQsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBpbml0KHRoaXMsIGlkKS5kZWxheSA9ICt2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkZWxheUNvbnN0YW50KGlkLCB2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPSArdmFsdWUsIGZ1bmN0aW9uKCkge1xuICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gdmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGRlbGF5RnVuY3Rpb25cbiAgICAgICAgICA6IGRlbGF5Q29uc3RhbnQpKGlkLCB2YWx1ZSkpXG4gICAgICA6IGdldCh0aGlzLm5vZGUoKSwgaWQpLmRlbGF5O1xufVxuIiwiaW1wb3J0IHtnZXQsIHNldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZHVyYXRpb25GdW5jdGlvbihpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHNldCh0aGlzLCBpZCkuZHVyYXRpb24gPSArdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZHVyYXRpb25Db25zdGFudChpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmR1cmF0aW9uID0gdmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGR1cmF0aW9uRnVuY3Rpb25cbiAgICAgICAgICA6IGR1cmF0aW9uQ29uc3RhbnQpKGlkLCB2YWx1ZSkpXG4gICAgICA6IGdldCh0aGlzLm5vZGUoKSwgaWQpLmR1cmF0aW9uO1xufVxuIiwiaW1wb3J0IHtnZXQsIHNldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZWFzZUNvbnN0YW50KGlkLCB2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHNldCh0aGlzLCBpZCkuZWFzZSA9IHZhbHVlO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2goZWFzZUNvbnN0YW50KGlkLCB2YWx1ZSkpXG4gICAgICA6IGdldCh0aGlzLm5vZGUoKSwgaWQpLmVhc2U7XG59XG4iLCJpbXBvcnQge3NldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZWFzZVZhcnlpbmcoaWQsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHR5cGVvZiB2ICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgICBzZXQodGhpcywgaWQpLmVhc2UgPSB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMuZWFjaChlYXNlVmFyeWluZyh0aGlzLl9pZCwgdmFsdWUpKTtcbn1cbiIsImltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG9uMCwgb24xLCB0aGF0ID0gdGhpcywgaWQgPSB0aGF0Ll9pZCwgc2l6ZSA9IHRoYXQuc2l6ZSgpO1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIGNhbmNlbCA9IHt2YWx1ZTogcmVqZWN0fSxcbiAgICAgICAgZW5kID0ge3ZhbHVlOiBmdW5jdGlvbigpIHsgaWYgKC0tc2l6ZSA9PT0gMCkgcmVzb2x2ZSgpOyB9fTtcblxuICAgIHRoYXQuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgICAgb24gPSBzY2hlZHVsZS5vbjtcblxuICAgICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICAgIGlmIChvbiAhPT0gb24wKSB7XG4gICAgICAgIG9uMSA9IChvbjAgPSBvbikuY29weSgpO1xuICAgICAgICBvbjEuXy5jYW5jZWwucHVzaChjYW5jZWwpO1xuICAgICAgICBvbjEuXy5pbnRlcnJ1cHQucHVzaChjYW5jZWwpO1xuICAgICAgICBvbjEuXy5lbmQucHVzaChlbmQpO1xuICAgICAgfVxuXG4gICAgICBzY2hlZHVsZS5vbiA9IG9uMTtcbiAgICB9KTtcblxuICAgIC8vIFRoZSBzZWxlY3Rpb24gd2FzIGVtcHR5LCByZXNvbHZlIGVuZCBpbW1lZGlhdGVseVxuICAgIGlmIChzaXplID09PSAwKSByZXNvbHZlKCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHttYXRjaGVyfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIGlmICh0eXBlb2YgbWF0Y2ggIT09IFwiZnVuY3Rpb25cIikgbWF0Y2ggPSBtYXRjaGVyKG1hdGNoKTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gW10sIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHtcbiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCB0aGlzLl9uYW1lLCB0aGlzLl9pZCk7XG59XG4iLCJpbXBvcnQge3NlbGVjdGlvbn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHRyYW5zaXRpb25fYXR0ciBmcm9tIFwiLi9hdHRyLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9hdHRyVHdlZW4gZnJvbSBcIi4vYXR0clR3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9kZWxheSBmcm9tIFwiLi9kZWxheS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZHVyYXRpb24gZnJvbSBcIi4vZHVyYXRpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2Vhc2UgZnJvbSBcIi4vZWFzZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZWFzZVZhcnlpbmcgZnJvbSBcIi4vZWFzZVZhcnlpbmcuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2ZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX21lcmdlIGZyb20gXCIuL21lcmdlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9vbiBmcm9tIFwiLi9vbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fcmVtb3ZlIGZyb20gXCIuL3JlbW92ZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0IGZyb20gXCIuL3NlbGVjdC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0QWxsIGZyb20gXCIuL3NlbGVjdEFsbC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0aW9uIGZyb20gXCIuL3NlbGVjdGlvbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc3R5bGUgZnJvbSBcIi4vc3R5bGUuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3N0eWxlVHdlZW4gZnJvbSBcIi4vc3R5bGVUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdGV4dCBmcm9tIFwiLi90ZXh0LmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90ZXh0VHdlZW4gZnJvbSBcIi4vdGV4dFR3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90cmFuc2l0aW9uIGZyb20gXCIuL3RyYW5zaXRpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3R3ZWVuIGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lbmQgZnJvbSBcIi4vZW5kLmpzXCI7XG5cbnZhciBpZCA9IDA7XG5cbmV4cG9ydCBmdW5jdGlvbiBUcmFuc2l0aW9uKGdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpIHtcbiAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzO1xuICB0aGlzLl9wYXJlbnRzID0gcGFyZW50cztcbiAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gIHRoaXMuX2lkID0gaWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zaXRpb24obmFtZSkge1xuICByZXR1cm4gc2VsZWN0aW9uKCkudHJhbnNpdGlvbihuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5ld0lkKCkge1xuICByZXR1cm4gKytpZDtcbn1cblxudmFyIHNlbGVjdGlvbl9wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlO1xuXG5UcmFuc2l0aW9uLnByb3RvdHlwZSA9IHRyYW5zaXRpb24ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVHJhbnNpdGlvbixcbiAgc2VsZWN0OiB0cmFuc2l0aW9uX3NlbGVjdCxcbiAgc2VsZWN0QWxsOiB0cmFuc2l0aW9uX3NlbGVjdEFsbCxcbiAgc2VsZWN0Q2hpbGQ6IHNlbGVjdGlvbl9wcm90b3R5cGUuc2VsZWN0Q2hpbGQsXG4gIHNlbGVjdENoaWxkcmVuOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNlbGVjdENoaWxkcmVuLFxuICBmaWx0ZXI6IHRyYW5zaXRpb25fZmlsdGVyLFxuICBtZXJnZTogdHJhbnNpdGlvbl9tZXJnZSxcbiAgc2VsZWN0aW9uOiB0cmFuc2l0aW9uX3NlbGVjdGlvbixcbiAgdHJhbnNpdGlvbjogdHJhbnNpdGlvbl90cmFuc2l0aW9uLFxuICBjYWxsOiBzZWxlY3Rpb25fcHJvdG90eXBlLmNhbGwsXG4gIG5vZGVzOiBzZWxlY3Rpb25fcHJvdG90eXBlLm5vZGVzLFxuICBub2RlOiBzZWxlY3Rpb25fcHJvdG90eXBlLm5vZGUsXG4gIHNpemU6IHNlbGVjdGlvbl9wcm90b3R5cGUuc2l6ZSxcbiAgZW1wdHk6IHNlbGVjdGlvbl9wcm90b3R5cGUuZW1wdHksXG4gIGVhY2g6IHNlbGVjdGlvbl9wcm90b3R5cGUuZWFjaCxcbiAgb246IHRyYW5zaXRpb25fb24sXG4gIGF0dHI6IHRyYW5zaXRpb25fYXR0cixcbiAgYXR0clR3ZWVuOiB0cmFuc2l0aW9uX2F0dHJUd2VlbixcbiAgc3R5bGU6IHRyYW5zaXRpb25fc3R5bGUsXG4gIHN0eWxlVHdlZW46IHRyYW5zaXRpb25fc3R5bGVUd2VlbixcbiAgdGV4dDogdHJhbnNpdGlvbl90ZXh0LFxuICB0ZXh0VHdlZW46IHRyYW5zaXRpb25fdGV4dFR3ZWVuLFxuICByZW1vdmU6IHRyYW5zaXRpb25fcmVtb3ZlLFxuICB0d2VlbjogdHJhbnNpdGlvbl90d2VlbixcbiAgZGVsYXk6IHRyYW5zaXRpb25fZGVsYXksXG4gIGR1cmF0aW9uOiB0cmFuc2l0aW9uX2R1cmF0aW9uLFxuICBlYXNlOiB0cmFuc2l0aW9uX2Vhc2UsXG4gIGVhc2VWYXJ5aW5nOiB0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nLFxuICBlbmQ6IHRyYW5zaXRpb25fZW5kLFxuICBbU3ltYm9sLml0ZXJhdG9yXTogc2VsZWN0aW9uX3Byb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdXG59O1xuIiwiaW1wb3J0IHtjb2xvcn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQge2ludGVycG9sYXRlTnVtYmVyLCBpbnRlcnBvbGF0ZVJnYiwgaW50ZXJwb2xhdGVTdHJpbmd9IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBjO1xuICByZXR1cm4gKHR5cGVvZiBiID09PSBcIm51bWJlclwiID8gaW50ZXJwb2xhdGVOdW1iZXJcbiAgICAgIDogYiBpbnN0YW5jZW9mIGNvbG9yID8gaW50ZXJwb2xhdGVSZ2JcbiAgICAgIDogKGMgPSBjb2xvcihiKSkgPyAoYiA9IGMsIGludGVycG9sYXRlUmdiKVxuICAgICAgOiBpbnRlcnBvbGF0ZVN0cmluZykoYSwgYik7XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHRyYW5zaXRpb24pIHtcbiAgaWYgKHRyYW5zaXRpb24uX2lkICE9PSB0aGlzLl9pZCkgdGhyb3cgbmV3IEVycm9yO1xuXG4gIGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSB0cmFuc2l0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkge1xuICAgICAgICBtZXJnZVtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IGogPCBtMDsgKytqKSB7XG4gICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTtcbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRoaXMuX2lkKTtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXQsIGluaXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIHN0YXJ0KG5hbWUpIHtcbiAgcmV0dXJuIChuYW1lICsgXCJcIikudHJpbSgpLnNwbGl0KC9efFxccysvKS5ldmVyeShmdW5jdGlvbih0KSB7XG4gICAgdmFyIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIHJldHVybiAhdCB8fCB0ID09PSBcInN0YXJ0XCI7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvbkZ1bmN0aW9uKGlkLCBuYW1lLCBsaXN0ZW5lcikge1xuICB2YXIgb24wLCBvbjEsIHNpdCA9IHN0YXJ0KG5hbWUpID8gaW5pdCA6IHNldDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNpdCh0aGlzLCBpZCksXG4gICAgICAgIG9uID0gc2NoZWR1bGUub247XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKG9uICE9PSBvbjApIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24obmFtZSwgbGlzdGVuZXIpO1xuXG4gICAgc2NoZWR1bGUub24gPSBvbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIGxpc3RlbmVyKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMlxuICAgICAgPyBnZXQodGhpcy5ub2RlKCksIGlkKS5vbi5vbihuYW1lKVxuICAgICAgOiB0aGlzLmVhY2gob25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpKTtcbn1cbiIsImZ1bmN0aW9uIHJlbW92ZUZ1bmN0aW9uKGlkKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICAgIGZvciAodmFyIGkgaW4gdGhpcy5fX3RyYW5zaXRpb24pIGlmICgraSAhPT0gaWQpIHJldHVybjtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5vbihcImVuZC5yZW1vdmVcIiwgcmVtb3ZlRnVuY3Rpb24odGhpcy5faWQpKTtcbn1cbiIsImltcG9ydCB7ZGlzcGF0Y2h9IGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuaW1wb3J0IHt0aW1lciwgdGltZW91dH0gZnJvbSBcImQzLXRpbWVyXCI7XG5cbnZhciBlbXB0eU9uID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcImVuZFwiLCBcImNhbmNlbFwiLCBcImludGVycnVwdFwiKTtcbnZhciBlbXB0eVR3ZWVuID0gW107XG5cbmV4cG9ydCB2YXIgQ1JFQVRFRCA9IDA7XG5leHBvcnQgdmFyIFNDSEVEVUxFRCA9IDE7XG5leHBvcnQgdmFyIFNUQVJUSU5HID0gMjtcbmV4cG9ydCB2YXIgU1RBUlRFRCA9IDM7XG5leHBvcnQgdmFyIFJVTk5JTkcgPSA0O1xuZXhwb3J0IHZhciBFTkRJTkcgPSA1O1xuZXhwb3J0IHZhciBFTkRFRCA9IDY7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUsIG5hbWUsIGlkLCBpbmRleCwgZ3JvdXAsIHRpbWluZykge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb247XG4gIGlmICghc2NoZWR1bGVzKSBub2RlLl9fdHJhbnNpdGlvbiA9IHt9O1xuICBlbHNlIGlmIChpZCBpbiBzY2hlZHVsZXMpIHJldHVybjtcbiAgY3JlYXRlKG5vZGUsIGlkLCB7XG4gICAgbmFtZTogbmFtZSxcbiAgICBpbmRleDogaW5kZXgsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay5cbiAgICBncm91cDogZ3JvdXAsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay5cbiAgICBvbjogZW1wdHlPbixcbiAgICB0d2VlbjogZW1wdHlUd2VlbixcbiAgICB0aW1lOiB0aW1pbmcudGltZSxcbiAgICBkZWxheTogdGltaW5nLmRlbGF5LFxuICAgIGR1cmF0aW9uOiB0aW1pbmcuZHVyYXRpb24sXG4gICAgZWFzZTogdGltaW5nLmVhc2UsXG4gICAgdGltZXI6IG51bGwsXG4gICAgc3RhdGU6IENSRUFURURcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7XG4gIGlmIChzY2hlZHVsZS5zdGF0ZSA+IENSRUFURUQpIHRocm93IG5ldyBFcnJvcihcInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZFwiKTtcbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7XG4gIGlmIChzY2hlZHVsZS5zdGF0ZSA+IFNUQVJURUQpIHRocm93IG5ldyBFcnJvcihcInRvbyBsYXRlOyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldChub2RlLCBpZCkge1xuICB2YXIgc2NoZWR1bGUgPSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgaWYgKCFzY2hlZHVsZSB8fCAhKHNjaGVkdWxlID0gc2NoZWR1bGVbaWRdKSkgdGhyb3cgbmV3IEVycm9yKFwidHJhbnNpdGlvbiBub3QgZm91bmRcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlKG5vZGUsIGlkLCBzZWxmKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbixcbiAgICAgIHR3ZWVuO1xuXG4gIC8vIEluaXRpYWxpemUgdGhlIHNlbGYgdGltZXIgd2hlbiB0aGUgdHJhbnNpdGlvbiBpcyBjcmVhdGVkLlxuICAvLyBOb3RlIHRoZSBhY3R1YWwgZGVsYXkgaXMgbm90IGtub3duIHVudGlsIHRoZSBmaXJzdCBjYWxsYmFjayFcbiAgc2NoZWR1bGVzW2lkXSA9IHNlbGY7XG4gIHNlbGYudGltZXIgPSB0aW1lcihzY2hlZHVsZSwgMCwgc2VsZi50aW1lKTtcblxuICBmdW5jdGlvbiBzY2hlZHVsZShlbGFwc2VkKSB7XG4gICAgc2VsZi5zdGF0ZSA9IFNDSEVEVUxFRDtcbiAgICBzZWxmLnRpbWVyLnJlc3RhcnQoc3RhcnQsIHNlbGYuZGVsYXksIHNlbGYudGltZSk7XG5cbiAgICAvLyBJZiB0aGUgZWxhcHNlZCBkZWxheSBpcyBsZXNzIHRoYW4gb3VyIGZpcnN0IHNsZWVwLCBzdGFydCBpbW1lZGlhdGVseS5cbiAgICBpZiAoc2VsZi5kZWxheSA8PSBlbGFwc2VkKSBzdGFydChlbGFwc2VkIC0gc2VsZi5kZWxheSk7XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydChlbGFwc2VkKSB7XG4gICAgdmFyIGksIGosIG4sIG87XG5cbiAgICAvLyBJZiB0aGUgc3RhdGUgaXMgbm90IFNDSEVEVUxFRCwgdGhlbiB3ZSBwcmV2aW91c2x5IGVycm9yZWQgb24gc3RhcnQuXG4gICAgaWYgKHNlbGYuc3RhdGUgIT09IFNDSEVEVUxFRCkgcmV0dXJuIHN0b3AoKTtcblxuICAgIGZvciAoaSBpbiBzY2hlZHVsZXMpIHtcbiAgICAgIG8gPSBzY2hlZHVsZXNbaV07XG4gICAgICBpZiAoby5uYW1lICE9PSBzZWxmLm5hbWUpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBXaGlsZSB0aGlzIGVsZW1lbnQgYWxyZWFkeSBoYXMgYSBzdGFydGluZyB0cmFuc2l0aW9uIGR1cmluZyB0aGlzIGZyYW1lLFxuICAgICAgLy8gZGVmZXIgc3RhcnRpbmcgYW4gaW50ZXJydXB0aW5nIHRyYW5zaXRpb24gdW50aWwgdGhhdCB0cmFuc2l0aW9uIGhhcyBhXG4gICAgICAvLyBjaGFuY2UgdG8gdGljayAoYW5kIHBvc3NpYmx5IGVuZCk7IHNlZSBkMy9kMy10cmFuc2l0aW9uIzU0IVxuICAgICAgaWYgKG8uc3RhdGUgPT09IFNUQVJURUQpIHJldHVybiB0aW1lb3V0KHN0YXJ0KTtcblxuICAgICAgLy8gSW50ZXJydXB0IHRoZSBhY3RpdmUgdHJhbnNpdGlvbiwgaWYgYW55LlxuICAgICAgaWYgKG8uc3RhdGUgPT09IFJVTk5JTkcpIHtcbiAgICAgICAgby5zdGF0ZSA9IEVOREVEO1xuICAgICAgICBvLnRpbWVyLnN0b3AoKTtcbiAgICAgICAgby5vbi5jYWxsKFwiaW50ZXJydXB0XCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApO1xuICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldO1xuICAgICAgfVxuXG4gICAgICAvLyBDYW5jZWwgYW55IHByZS1lbXB0ZWQgdHJhbnNpdGlvbnMuXG4gICAgICBlbHNlIGlmICgraSA8IGlkKSB7XG4gICAgICAgIG8uc3RhdGUgPSBFTkRFRDtcbiAgICAgICAgby50aW1lci5zdG9wKCk7XG4gICAgICAgIG8ub24uY2FsbChcImNhbmNlbFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBvLmluZGV4LCBvLmdyb3VwKTtcbiAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZlciB0aGUgZmlyc3QgdGljayB0byBlbmQgb2YgdGhlIGN1cnJlbnQgZnJhbWU7IHNlZSBkMy9kMyMxNTc2LlxuICAgIC8vIE5vdGUgdGhlIHRyYW5zaXRpb24gbWF5IGJlIGNhbmNlbGVkIGFmdGVyIHN0YXJ0IGFuZCBiZWZvcmUgdGhlIGZpcnN0IHRpY2shXG4gICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgc2NoZWR1bGVkIGJlZm9yZSB0aGUgc3RhcnQgZXZlbnQ7IHNlZSBkMy9kMy10cmFuc2l0aW9uIzE2IVxuICAgIC8vIEFzc3VtaW5nIHRoaXMgaXMgc3VjY2Vzc2Z1bCwgc3Vic2VxdWVudCBjYWxsYmFja3MgZ28gc3RyYWlnaHQgdG8gdGljay5cbiAgICB0aW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHNlbGYuc3RhdGUgPT09IFNUQVJURUQpIHtcbiAgICAgICAgc2VsZi5zdGF0ZSA9IFJVTk5JTkc7XG4gICAgICAgIHNlbGYudGltZXIucmVzdGFydCh0aWNrLCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpO1xuICAgICAgICB0aWNrKGVsYXBzZWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRGlzcGF0Y2ggdGhlIHN0YXJ0IGV2ZW50LlxuICAgIC8vIE5vdGUgdGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZSB0d2VlbiBhcmUgaW5pdGlhbGl6ZWQuXG4gICAgc2VsZi5zdGF0ZSA9IFNUQVJUSU5HO1xuICAgIHNlbGYub24uY2FsbChcInN0YXJ0XCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApO1xuICAgIGlmIChzZWxmLnN0YXRlICE9PSBTVEFSVElORykgcmV0dXJuOyAvLyBpbnRlcnJ1cHRlZFxuICAgIHNlbGYuc3RhdGUgPSBTVEFSVEVEO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgdHdlZW4sIGRlbGV0aW5nIG51bGwgdHdlZW4uXG4gICAgdHdlZW4gPSBuZXcgQXJyYXkobiA9IHNlbGYudHdlZW4ubGVuZ3RoKTtcbiAgICBmb3IgKGkgPSAwLCBqID0gLTE7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChvID0gc2VsZi50d2VlbltpXS52YWx1ZS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApKSB7XG4gICAgICAgIHR3ZWVuWysral0gPSBvO1xuICAgICAgfVxuICAgIH1cbiAgICB0d2Vlbi5sZW5ndGggPSBqICsgMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpY2soZWxhcHNlZCkge1xuICAgIHZhciB0ID0gZWxhcHNlZCA8IHNlbGYuZHVyYXRpb24gPyBzZWxmLmVhc2UuY2FsbChudWxsLCBlbGFwc2VkIC8gc2VsZi5kdXJhdGlvbikgOiAoc2VsZi50aW1lci5yZXN0YXJ0KHN0b3ApLCBzZWxmLnN0YXRlID0gRU5ESU5HLCAxKSxcbiAgICAgICAgaSA9IC0xLFxuICAgICAgICBuID0gdHdlZW4ubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIHR3ZWVuW2ldLmNhbGwobm9kZSwgdCk7XG4gICAgfVxuXG4gICAgLy8gRGlzcGF0Y2ggdGhlIGVuZCBldmVudC5cbiAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gRU5ESU5HKSB7XG4gICAgICBzZWxmLm9uLmNhbGwoXCJlbmRcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7XG4gICAgICBzdG9wKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RvcCgpIHtcbiAgICBzZWxmLnN0YXRlID0gRU5ERUQ7XG4gICAgc2VsZi50aW1lci5zdG9wKCk7XG4gICAgZGVsZXRlIHNjaGVkdWxlc1tpZF07XG4gICAgZm9yICh2YXIgaSBpbiBzY2hlZHVsZXMpIHJldHVybjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHtzZWxlY3Rvcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQgPSB0aGlzLl9pZDtcblxuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7XG4gICAgICAgIGlmIChcIl9fZGF0YV9fXCIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187XG4gICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTtcbiAgICAgICAgc2NoZWR1bGUoc3ViZ3JvdXBbaV0sIG5hbWUsIGlkLCBpLCBzdWJncm91cCwgZ2V0KG5vZGUsIGlkKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwiaW1wb3J0IHtzZWxlY3RvckFsbH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQgPSB0aGlzLl9pZDtcblxuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIGZvciAodmFyIGNoaWxkcmVuID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApLCBjaGlsZCwgaW5oZXJpdCA9IGdldChub2RlLCBpZCksIGsgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBrIDwgbDsgKytrKSB7XG4gICAgICAgICAgaWYgKGNoaWxkID0gY2hpbGRyZW5ba10pIHtcbiAgICAgICAgICAgIHNjaGVkdWxlKGNoaWxkLCBuYW1lLCBpZCwgaywgY2hpbGRyZW4sIGluaGVyaXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdWJncm91cHMucHVzaChjaGlsZHJlbik7XG4gICAgICAgIHBhcmVudHMucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCBwYXJlbnRzLCBuYW1lLCBpZCk7XG59XG4iLCJpbXBvcnQge3NlbGVjdGlvbn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuXG52YXIgU2VsZWN0aW9uID0gc2VsZWN0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvcjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2dyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJpbXBvcnQge2ludGVycG9sYXRlVHJhbnNmb3JtQ3NzIGFzIGludGVycG9sYXRlVHJhbnNmb3JtfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCB7c3R5bGV9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuaW1wb3J0IHt0d2VlblZhbHVlfSBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IGludGVycG9sYXRlIGZyb20gXCIuL2ludGVycG9sYXRlLmpzXCI7XG5cbmZ1bmN0aW9uIHN0eWxlTnVsbChuYW1lLCBpbnRlcnBvbGF0ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gc3R5bGUodGhpcywgbmFtZSksXG4gICAgICAgIHN0cmluZzEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGUodGhpcywgbmFtZSkpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCBzdHJpbmcxMCA9IHN0cmluZzEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZVJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUNvbnN0YW50KG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCIsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gc3R5bGUodGhpcywgbmFtZSksXG4gICAgICAgIHZhbHVlMSA9IHZhbHVlKHRoaXMpLFxuICAgICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHN0cmluZzEgPSB2YWx1ZTEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGUodGhpcywgbmFtZSkpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVNYXliZVJlbW92ZShpZCwgbmFtZSkge1xuICB2YXIgb24wLCBvbjEsIGxpc3RlbmVyMCwga2V5ID0gXCJzdHlsZS5cIiArIG5hbWUsIGV2ZW50ID0gXCJlbmQuXCIgKyBrZXksIHJlbW92ZTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIG9uID0gc2NoZWR1bGUub24sXG4gICAgICAgIGxpc3RlbmVyID0gc2NoZWR1bGUudmFsdWVba2V5XSA9PSBudWxsID8gcmVtb3ZlIHx8IChyZW1vdmUgPSBzdHlsZVJlbW92ZShuYW1lKSkgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKG9uICE9PSBvbjAgfHwgbGlzdGVuZXIwICE9PSBsaXN0ZW5lcikgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihldmVudCwgbGlzdGVuZXIwID0gbGlzdGVuZXIpO1xuXG4gICAgc2NoZWR1bGUub24gPSBvbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICB2YXIgaSA9IChuYW1lICs9IFwiXCIpID09PSBcInRyYW5zZm9ybVwiID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm0gOiBpbnRlcnBvbGF0ZTtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyB0aGlzXG4gICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZU51bGwobmFtZSwgaSkpXG4gICAgICAub24oXCJlbmQuc3R5bGUuXCIgKyBuYW1lLCBzdHlsZVJlbW92ZShuYW1lKSlcbiAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVGdW5jdGlvbihuYW1lLCBpLCB0d2VlblZhbHVlKHRoaXMsIFwic3R5bGUuXCIgKyBuYW1lLCB2YWx1ZSkpKVxuICAgICAgLmVhY2goc3R5bGVNYXliZVJlbW92ZSh0aGlzLl9pZCwgbmFtZSkpXG4gICAgOiB0aGlzXG4gICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZUNvbnN0YW50KG5hbWUsIGksIHZhbHVlKSwgcHJpb3JpdHkpXG4gICAgICAub24oXCJlbmQuc3R5bGUuXCIgKyBuYW1lLCBudWxsKTtcbn1cbiIsImZ1bmN0aW9uIHN0eWxlSW50ZXJwb2xhdGUobmFtZSwgaSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIGkuY2FsbCh0aGlzLCB0KSwgcHJpb3JpdHkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICB2YXIgdCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQgPSAoaTAgPSBpKSAmJiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KTtcbiAgICByZXR1cm4gdDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIGtleSA9IFwic3R5bGUuXCIgKyAobmFtZSArPSBcIlwiKTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gdGhpcy50d2VlbihrZXksIHN0eWxlVHdlZW4obmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyBcIlwiIDogcHJpb3JpdHkpKTtcbn1cbiIsImltcG9ydCB7dHdlZW5WYWx1ZX0gZnJvbSBcIi4vdHdlZW4uanNcIjtcblxuZnVuY3Rpb24gdGV4dENvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlMSA9IHZhbHVlKHRoaXMpO1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTEgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZTE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzLnR3ZWVuKFwidGV4dFwiLCB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyB0ZXh0RnVuY3Rpb24odHdlZW5WYWx1ZSh0aGlzLCBcInRleHRcIiwgdmFsdWUpKVxuICAgICAgOiB0ZXh0Q29uc3RhbnQodmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZSArIFwiXCIpKTtcbn1cbiIsImZ1bmN0aW9uIHRleHRJbnRlcnBvbGF0ZShpKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IGkuY2FsbCh0aGlzLCB0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dFR3ZWVuKHZhbHVlKSB7XG4gIHZhciB0MCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgdGV4dEludGVycG9sYXRlKGkpO1xuICAgIHJldHVybiB0MDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIga2V5ID0gXCJ0ZXh0XCI7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMSkgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCB0ZXh0VHdlZW4odmFsdWUpKTtcbn1cbiIsImltcG9ydCB7VHJhbnNpdGlvbiwgbmV3SWR9IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2NoZWR1bGUsIHtnZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsXG4gICAgICBpZDAgPSB0aGlzLl9pZCxcbiAgICAgIGlkMSA9IG5ld0lkKCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgdmFyIGluaGVyaXQgPSBnZXQobm9kZSwgaWQwKTtcbiAgICAgICAgc2NoZWR1bGUobm9kZSwgbmFtZSwgaWQxLCBpLCBncm91cCwge1xuICAgICAgICAgIHRpbWU6IGluaGVyaXQudGltZSArIGluaGVyaXQuZGVsYXkgKyBpbmhlcml0LmR1cmF0aW9uLFxuICAgICAgICAgIGRlbGF5OiAwLFxuICAgICAgICAgIGR1cmF0aW9uOiBpbmhlcml0LmR1cmF0aW9uLFxuICAgICAgICAgIGVhc2U6IGluaGVyaXQuZWFzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZDEpO1xufVxuIiwiaW1wb3J0IHtnZXQsIHNldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gdHdlZW5SZW1vdmUoaWQsIG5hbWUpIHtcbiAgdmFyIHR3ZWVuMCwgdHdlZW4xO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgdHdlZW4gPSBzY2hlZHVsZS50d2VlbjtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgdHdlZW4gd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKHR3ZWVuICE9PSB0d2VlbjApIHtcbiAgICAgIHR3ZWVuMSA9IHR3ZWVuMCA9IHR3ZWVuO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICh0d2VlbjFbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgIHR3ZWVuMSA9IHR3ZWVuMS5zbGljZSgpO1xuICAgICAgICAgIHR3ZWVuMS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdHdlZW5GdW5jdGlvbihpZCwgbmFtZSwgdmFsdWUpIHtcbiAgdmFyIHR3ZWVuMCwgdHdlZW4xO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIHR3ZWVuID0gc2NoZWR1bGUudHdlZW47XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIHR3ZWVuIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7XG4gICAgICB0d2VlbjEgPSAodHdlZW4wID0gdHdlZW4pLnNsaWNlKCk7XG4gICAgICBmb3IgKHZhciB0ID0ge25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0sIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICB0d2VlbjFbaV0gPSB0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaSA9PT0gbikgdHdlZW4xLnB1c2godCk7XG4gICAgfVxuXG4gICAgc2NoZWR1bGUudHdlZW4gPSB0d2VlbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIG5hbWUgKz0gXCJcIjtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgdHdlZW4gPSBnZXQodGhpcy5ub2RlKCksIGlkKS50d2VlbjtcbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR3ZWVuLmxlbmd0aCwgdDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKCh0ID0gdHdlZW5baV0pLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHQudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbCA/IHR3ZWVuUmVtb3ZlIDogdHdlZW5GdW5jdGlvbikoaWQsIG5hbWUsIHZhbHVlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0d2VlblZhbHVlKHRyYW5zaXRpb24sIG5hbWUsIHZhbHVlKSB7XG4gIHZhciBpZCA9IHRyYW5zaXRpb24uX2lkO1xuXG4gIHRyYW5zaXRpb24uZWFjaChmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpO1xuICAgIChzY2hlZHVsZS52YWx1ZSB8fCAoc2NoZWR1bGUudmFsdWUgPSB7fSkpW25hbWVdID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gZ2V0KG5vZGUsIGlkKS52YWx1ZVtuYW1lXTtcbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IHggPT4gKCkgPT4geDtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFpvb21FdmVudCh0eXBlLCB7XG4gIHNvdXJjZUV2ZW50LFxuICB0YXJnZXQsXG4gIHRyYW5zZm9ybSxcbiAgZGlzcGF0Y2hcbn0pIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgIHR5cGU6IHt2YWx1ZTogdHlwZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICBzb3VyY2VFdmVudDoge3ZhbHVlOiBzb3VyY2VFdmVudCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICB0YXJnZXQ6IHt2YWx1ZTogdGFyZ2V0LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHRyYW5zZm9ybToge3ZhbHVlOiB0cmFuc2Zvcm0sIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgXzoge3ZhbHVlOiBkaXNwYXRjaH1cbiAgfSk7XG59XG4iLCJleHBvcnQge2RlZmF1bHQgYXMgem9vbX0gZnJvbSBcIi4vem9vbS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHpvb21UcmFuc2Zvcm0sIGlkZW50aXR5IGFzIHpvb21JZGVudGl0eSwgVHJhbnNmb3JtIGFzIFpvb21UcmFuc2Zvcm19IGZyb20gXCIuL3RyYW5zZm9ybS5qc1wiO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIG5vcHJvcGFnYXRpb24oZXZlbnQpIHtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIFRyYW5zZm9ybShrLCB4LCB5KSB7XG4gIHRoaXMuayA9IGs7XG4gIHRoaXMueCA9IHg7XG4gIHRoaXMueSA9IHk7XG59XG5cblRyYW5zZm9ybS5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBUcmFuc2Zvcm0sXG4gIHNjYWxlOiBmdW5jdGlvbihrKSB7XG4gICAgcmV0dXJuIGsgPT09IDEgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmsgKiBrLCB0aGlzLngsIHRoaXMueSk7XG4gIH0sXG4gIHRyYW5zbGF0ZTogZnVuY3Rpb24oeCwgeSkge1xuICAgIHJldHVybiB4ID09PSAwICYgeSA9PT0gMCA/IHRoaXMgOiBuZXcgVHJhbnNmb3JtKHRoaXMuaywgdGhpcy54ICsgdGhpcy5rICogeCwgdGhpcy55ICsgdGhpcy5rICogeSk7XG4gIH0sXG4gIGFwcGx5OiBmdW5jdGlvbihwb2ludCkge1xuICAgIHJldHVybiBbcG9pbnRbMF0gKiB0aGlzLmsgKyB0aGlzLngsIHBvaW50WzFdICogdGhpcy5rICsgdGhpcy55XTtcbiAgfSxcbiAgYXBwbHlYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIHggKiB0aGlzLmsgKyB0aGlzLng7XG4gIH0sXG4gIGFwcGx5WTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiB5ICogdGhpcy5rICsgdGhpcy55O1xuICB9LFxuICBpbnZlcnQ6IGZ1bmN0aW9uKGxvY2F0aW9uKSB7XG4gICAgcmV0dXJuIFsobG9jYXRpb25bMF0gLSB0aGlzLngpIC8gdGhpcy5rLCAobG9jYXRpb25bMV0gLSB0aGlzLnkpIC8gdGhpcy5rXTtcbiAgfSxcbiAgaW52ZXJ0WDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiAoeCAtIHRoaXMueCkgLyB0aGlzLms7XG4gIH0sXG4gIGludmVydFk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4gKHkgLSB0aGlzLnkpIC8gdGhpcy5rO1xuICB9LFxuICByZXNjYWxlWDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiB4LmNvcHkoKS5kb21haW4oeC5yYW5nZSgpLm1hcCh0aGlzLmludmVydFgsIHRoaXMpLm1hcCh4LmludmVydCwgeCkpO1xuICB9LFxuICByZXNjYWxlWTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiB5LmNvcHkoKS5kb21haW4oeS5yYW5nZSgpLm1hcCh0aGlzLmludmVydFksIHRoaXMpLm1hcCh5LmludmVydCwgeSkpO1xuICB9LFxuICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwidHJhbnNsYXRlKFwiICsgdGhpcy54ICsgXCIsXCIgKyB0aGlzLnkgKyBcIikgc2NhbGUoXCIgKyB0aGlzLmsgKyBcIilcIjtcbiAgfVxufTtcblxuZXhwb3J0IHZhciBpZGVudGl0eSA9IG5ldyBUcmFuc2Zvcm0oMSwgMCwgMCk7XG5cbnRyYW5zZm9ybS5wcm90b3R5cGUgPSBUcmFuc2Zvcm0ucHJvdG90eXBlO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2Zvcm0obm9kZSkge1xuICB3aGlsZSAoIW5vZGUuX196b29tKSBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkgcmV0dXJuIGlkZW50aXR5O1xuICByZXR1cm4gbm9kZS5fX3pvb207XG59XG4iLCJpbXBvcnQge2Rpc3BhdGNofSBmcm9tIFwiZDMtZGlzcGF0Y2hcIjtcbmltcG9ydCB7ZHJhZ0Rpc2FibGUsIGRyYWdFbmFibGV9IGZyb20gXCJkMy1kcmFnXCI7XG5pbXBvcnQge2ludGVycG9sYXRlWm9vbX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge3NlbGVjdCwgcG9pbnRlcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtpbnRlcnJ1cHR9IGZyb20gXCJkMy10cmFuc2l0aW9uXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBab29tRXZlbnQgZnJvbSBcIi4vZXZlbnQuanNcIjtcbmltcG9ydCB7VHJhbnNmb3JtLCBpZGVudGl0eX0gZnJvbSBcIi4vdHJhbnNmb3JtLmpzXCI7XG5pbXBvcnQgbm9ldmVudCwge25vcHJvcGFnYXRpb259IGZyb20gXCIuL25vZXZlbnQuanNcIjtcblxuLy8gSWdub3JlIHJpZ2h0LWNsaWNrLCBzaW5jZSB0aGF0IHNob3VsZCBvcGVuIHRoZSBjb250ZXh0IG1lbnUuXG4vLyBleGNlcHQgZm9yIHBpbmNoLXRvLXpvb20sIHdoaWNoIGlzIHNlbnQgYXMgYSB3aGVlbCtjdHJsS2V5IGV2ZW50XG5mdW5jdGlvbiBkZWZhdWx0RmlsdGVyKGV2ZW50KSB7XG4gIHJldHVybiAoIWV2ZW50LmN0cmxLZXkgfHwgZXZlbnQudHlwZSA9PT0gJ3doZWVsJykgJiYgIWV2ZW50LmJ1dHRvbjtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEV4dGVudCgpIHtcbiAgdmFyIGUgPSB0aGlzO1xuICBpZiAoZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHtcbiAgICBlID0gZS5vd25lclNWR0VsZW1lbnQgfHwgZTtcbiAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIpKSB7XG4gICAgICBlID0gZS52aWV3Qm94LmJhc2VWYWw7XG4gICAgICByZXR1cm4gW1tlLngsIGUueV0sIFtlLnggKyBlLndpZHRoLCBlLnkgKyBlLmhlaWdodF1dO1xuICAgIH1cbiAgICByZXR1cm4gW1swLCAwXSwgW2Uud2lkdGguYmFzZVZhbC52YWx1ZSwgZS5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dO1xuICB9XG4gIHJldHVybiBbWzAsIDBdLCBbZS5jbGllbnRXaWR0aCwgZS5jbGllbnRIZWlnaHRdXTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFRyYW5zZm9ybSgpIHtcbiAgcmV0dXJuIHRoaXMuX196b29tIHx8IGlkZW50aXR5O1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0V2hlZWxEZWx0YShldmVudCkge1xuICByZXR1cm4gLWV2ZW50LmRlbHRhWSAqIChldmVudC5kZWx0YU1vZGUgPT09IDEgPyAwLjA1IDogZXZlbnQuZGVsdGFNb2RlID8gMSA6IDAuMDAyKSAqIChldmVudC5jdHJsS2V5ID8gMTAgOiAxKTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFRvdWNoYWJsZSgpIHtcbiAgcmV0dXJuIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyB8fCAoXCJvbnRvdWNoc3RhcnRcIiBpbiB0aGlzKTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdENvbnN0cmFpbih0cmFuc2Zvcm0sIGV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSB7XG4gIHZhciBkeDAgPSB0cmFuc2Zvcm0uaW52ZXJ0WChleHRlbnRbMF1bMF0pIC0gdHJhbnNsYXRlRXh0ZW50WzBdWzBdLFxuICAgICAgZHgxID0gdHJhbnNmb3JtLmludmVydFgoZXh0ZW50WzFdWzBdKSAtIHRyYW5zbGF0ZUV4dGVudFsxXVswXSxcbiAgICAgIGR5MCA9IHRyYW5zZm9ybS5pbnZlcnRZKGV4dGVudFswXVsxXSkgLSB0cmFuc2xhdGVFeHRlbnRbMF1bMV0sXG4gICAgICBkeTEgPSB0cmFuc2Zvcm0uaW52ZXJ0WShleHRlbnRbMV1bMV0pIC0gdHJhbnNsYXRlRXh0ZW50WzFdWzFdO1xuICByZXR1cm4gdHJhbnNmb3JtLnRyYW5zbGF0ZShcbiAgICBkeDEgPiBkeDAgPyAoZHgwICsgZHgxKSAvIDIgOiBNYXRoLm1pbigwLCBkeDApIHx8IE1hdGgubWF4KDAsIGR4MSksXG4gICAgZHkxID4gZHkwID8gKGR5MCArIGR5MSkgLyAyIDogTWF0aC5taW4oMCwgZHkwKSB8fCBNYXRoLm1heCgwLCBkeTEpXG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgZmlsdGVyID0gZGVmYXVsdEZpbHRlcixcbiAgICAgIGV4dGVudCA9IGRlZmF1bHRFeHRlbnQsXG4gICAgICBjb25zdHJhaW4gPSBkZWZhdWx0Q29uc3RyYWluLFxuICAgICAgd2hlZWxEZWx0YSA9IGRlZmF1bHRXaGVlbERlbHRhLFxuICAgICAgdG91Y2hhYmxlID0gZGVmYXVsdFRvdWNoYWJsZSxcbiAgICAgIHNjYWxlRXh0ZW50ID0gWzAsIEluZmluaXR5XSxcbiAgICAgIHRyYW5zbGF0ZUV4dGVudCA9IFtbLUluZmluaXR5LCAtSW5maW5pdHldLCBbSW5maW5pdHksIEluZmluaXR5XV0sXG4gICAgICBkdXJhdGlvbiA9IDI1MCxcbiAgICAgIGludGVycG9sYXRlID0gaW50ZXJwb2xhdGVab29tLFxuICAgICAgbGlzdGVuZXJzID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcInpvb21cIiwgXCJlbmRcIiksXG4gICAgICB0b3VjaHN0YXJ0aW5nLFxuICAgICAgdG91Y2hmaXJzdCxcbiAgICAgIHRvdWNoZW5kaW5nLFxuICAgICAgdG91Y2hEZWxheSA9IDUwMCxcbiAgICAgIHdoZWVsRGVsYXkgPSAxNTAsXG4gICAgICBjbGlja0Rpc3RhbmNlMiA9IDAsXG4gICAgICB0YXBEaXN0YW5jZSA9IDEwO1xuXG4gIGZ1bmN0aW9uIHpvb20oc2VsZWN0aW9uKSB7XG4gICAgc2VsZWN0aW9uXG4gICAgICAgIC5wcm9wZXJ0eShcIl9fem9vbVwiLCBkZWZhdWx0VHJhbnNmb3JtKVxuICAgICAgICAub24oXCJ3aGVlbC56b29tXCIsIHdoZWVsZWQsIHtwYXNzaXZlOiBmYWxzZX0pXG4gICAgICAgIC5vbihcIm1vdXNlZG93bi56b29tXCIsIG1vdXNlZG93bmVkKVxuICAgICAgICAub24oXCJkYmxjbGljay56b29tXCIsIGRibGNsaWNrZWQpXG4gICAgICAuZmlsdGVyKHRvdWNoYWJsZSlcbiAgICAgICAgLm9uKFwidG91Y2hzdGFydC56b29tXCIsIHRvdWNoc3RhcnRlZClcbiAgICAgICAgLm9uKFwidG91Y2htb3ZlLnpvb21cIiwgdG91Y2htb3ZlZClcbiAgICAgICAgLm9uKFwidG91Y2hlbmQuem9vbSB0b3VjaGNhbmNlbC56b29tXCIsIHRvdWNoZW5kZWQpXG4gICAgICAgIC5zdHlsZShcIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvclwiLCBcInJnYmEoMCwwLDAsMClcIik7XG4gIH1cblxuICB6b29tLnRyYW5zZm9ybSA9IGZ1bmN0aW9uKGNvbGxlY3Rpb24sIHRyYW5zZm9ybSwgcG9pbnQsIGV2ZW50KSB7XG4gICAgdmFyIHNlbGVjdGlvbiA9IGNvbGxlY3Rpb24uc2VsZWN0aW9uID8gY29sbGVjdGlvbi5zZWxlY3Rpb24oKSA6IGNvbGxlY3Rpb247XG4gICAgc2VsZWN0aW9uLnByb3BlcnR5KFwiX196b29tXCIsIGRlZmF1bHRUcmFuc2Zvcm0pO1xuICAgIGlmIChjb2xsZWN0aW9uICE9PSBzZWxlY3Rpb24pIHtcbiAgICAgIHNjaGVkdWxlKGNvbGxlY3Rpb24sIHRyYW5zZm9ybSwgcG9pbnQsIGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0aW9uLmludGVycnVwdCgpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgIGdlc3R1cmUodGhpcywgYXJndW1lbnRzKVxuICAgICAgICAgIC5ldmVudChldmVudClcbiAgICAgICAgICAuc3RhcnQoKVxuICAgICAgICAgIC56b29tKG51bGwsIHR5cGVvZiB0cmFuc2Zvcm0gPT09IFwiZnVuY3Rpb25cIiA/IHRyYW5zZm9ybS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogdHJhbnNmb3JtKVxuICAgICAgICAgIC5lbmQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB6b29tLnNjYWxlQnkgPSBmdW5jdGlvbihzZWxlY3Rpb24sIGssIHAsIGV2ZW50KSB7XG4gICAgem9vbS5zY2FsZVRvKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgazAgPSB0aGlzLl9fem9vbS5rLFxuICAgICAgICAgIGsxID0gdHlwZW9mIGsgPT09IFwiZnVuY3Rpb25cIiA/IGsuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGs7XG4gICAgICByZXR1cm4gazAgKiBrMTtcbiAgICB9LCBwLCBldmVudCk7XG4gIH07XG5cbiAgem9vbS5zY2FsZVRvID0gZnVuY3Rpb24oc2VsZWN0aW9uLCBrLCBwLCBldmVudCkge1xuICAgIHpvb20udHJhbnNmb3JtKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZSA9IGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICAgIHQwID0gdGhpcy5fX3pvb20sXG4gICAgICAgICAgcDAgPSBwID09IG51bGwgPyBjZW50cm9pZChlKSA6IHR5cGVvZiBwID09PSBcImZ1bmN0aW9uXCIgPyBwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBwLFxuICAgICAgICAgIHAxID0gdDAuaW52ZXJ0KHAwKSxcbiAgICAgICAgICBrMSA9IHR5cGVvZiBrID09PSBcImZ1bmN0aW9uXCIgPyBrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrO1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodDAsIGsxKSwgcDAsIHAxKSwgZSwgdHJhbnNsYXRlRXh0ZW50KTtcbiAgICB9LCBwLCBldmVudCk7XG4gIH07XG5cbiAgem9vbS50cmFuc2xhdGVCeSA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgeCwgeSwgZXZlbnQpIHtcbiAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbih0aGlzLl9fem9vbS50cmFuc2xhdGUoXG4gICAgICAgIHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyB4LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB4LFxuICAgICAgICB0eXBlb2YgeSA9PT0gXCJmdW5jdGlvblwiID8geS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogeVxuICAgICAgKSwgZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRyYW5zbGF0ZUV4dGVudCk7XG4gICAgfSwgbnVsbCwgZXZlbnQpO1xuICB9O1xuXG4gIHpvb20udHJhbnNsYXRlVG8gPSBmdW5jdGlvbihzZWxlY3Rpb24sIHgsIHksIHAsIGV2ZW50KSB7XG4gICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlID0gZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgICAgdCA9IHRoaXMuX196b29tLFxuICAgICAgICAgIHAwID0gcCA9PSBudWxsID8gY2VudHJvaWQoZSkgOiB0eXBlb2YgcCA9PT0gXCJmdW5jdGlvblwiID8gcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogcDtcbiAgICAgIHJldHVybiBjb25zdHJhaW4oaWRlbnRpdHkudHJhbnNsYXRlKHAwWzBdLCBwMFsxXSkuc2NhbGUodC5rKS50cmFuc2xhdGUoXG4gICAgICAgIHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyAteC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogLXgsXG4gICAgICAgIHR5cGVvZiB5ID09PSBcImZ1bmN0aW9uXCIgPyAteS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogLXlcbiAgICAgICksIGUsIHRyYW5zbGF0ZUV4dGVudCk7XG4gICAgfSwgcCwgZXZlbnQpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHNjYWxlKHRyYW5zZm9ybSwgaykge1xuICAgIGsgPSBNYXRoLm1heChzY2FsZUV4dGVudFswXSwgTWF0aC5taW4oc2NhbGVFeHRlbnRbMV0sIGspKTtcbiAgICByZXR1cm4gayA9PT0gdHJhbnNmb3JtLmsgPyB0cmFuc2Zvcm0gOiBuZXcgVHJhbnNmb3JtKGssIHRyYW5zZm9ybS54LCB0cmFuc2Zvcm0ueSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2xhdGUodHJhbnNmb3JtLCBwMCwgcDEpIHtcbiAgICB2YXIgeCA9IHAwWzBdIC0gcDFbMF0gKiB0cmFuc2Zvcm0uaywgeSA9IHAwWzFdIC0gcDFbMV0gKiB0cmFuc2Zvcm0uaztcbiAgICByZXR1cm4geCA9PT0gdHJhbnNmb3JtLnggJiYgeSA9PT0gdHJhbnNmb3JtLnkgPyB0cmFuc2Zvcm0gOiBuZXcgVHJhbnNmb3JtKHRyYW5zZm9ybS5rLCB4LCB5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNlbnRyb2lkKGV4dGVudCkge1xuICAgIHJldHVybiBbKCtleHRlbnRbMF1bMF0gKyArZXh0ZW50WzFdWzBdKSAvIDIsICgrZXh0ZW50WzBdWzFdICsgK2V4dGVudFsxXVsxXSkgLyAyXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNjaGVkdWxlKHRyYW5zaXRpb24sIHRyYW5zZm9ybSwgcG9pbnQsIGV2ZW50KSB7XG4gICAgdHJhbnNpdGlvblxuICAgICAgICAub24oXCJzdGFydC56b29tXCIsIGZ1bmN0aW9uKCkgeyBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cykuZXZlbnQoZXZlbnQpLnN0YXJ0KCk7IH0pXG4gICAgICAgIC5vbihcImludGVycnVwdC56b29tIGVuZC56b29tXCIsIGZ1bmN0aW9uKCkgeyBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cykuZXZlbnQoZXZlbnQpLmVuZCgpOyB9KVxuICAgICAgICAudHdlZW4oXCJ6b29tXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAgICAgICAgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgZyA9IGdlc3R1cmUodGhhdCwgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICAgICAgICBlID0gZXh0ZW50LmFwcGx5KHRoYXQsIGFyZ3MpLFxuICAgICAgICAgICAgICBwID0gcG9pbnQgPT0gbnVsbCA/IGNlbnRyb2lkKGUpIDogdHlwZW9mIHBvaW50ID09PSBcImZ1bmN0aW9uXCIgPyBwb2ludC5hcHBseSh0aGF0LCBhcmdzKSA6IHBvaW50LFxuICAgICAgICAgICAgICB3ID0gTWF0aC5tYXgoZVsxXVswXSAtIGVbMF1bMF0sIGVbMV1bMV0gLSBlWzBdWzFdKSxcbiAgICAgICAgICAgICAgYSA9IHRoYXQuX196b29tLFxuICAgICAgICAgICAgICBiID0gdHlwZW9mIHRyYW5zZm9ybSA9PT0gXCJmdW5jdGlvblwiID8gdHJhbnNmb3JtLmFwcGx5KHRoYXQsIGFyZ3MpIDogdHJhbnNmb3JtLFxuICAgICAgICAgICAgICBpID0gaW50ZXJwb2xhdGUoYS5pbnZlcnQocCkuY29uY2F0KHcgLyBhLmspLCBiLmludmVydChwKS5jb25jYXQodyAvIGIuaykpO1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBpZiAodCA9PT0gMSkgdCA9IGI7IC8vIEF2b2lkIHJvdW5kaW5nIGVycm9yIG9uIGVuZC5cbiAgICAgICAgICAgIGVsc2UgeyB2YXIgbCA9IGkodCksIGsgPSB3IC8gbFsyXTsgdCA9IG5ldyBUcmFuc2Zvcm0oaywgcFswXSAtIGxbMF0gKiBrLCBwWzFdIC0gbFsxXSAqIGspOyB9XG4gICAgICAgICAgICBnLnpvb20obnVsbCwgdCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXN0dXJlKHRoYXQsIGFyZ3MsIGNsZWFuKSB7XG4gICAgcmV0dXJuICghY2xlYW4gJiYgdGhhdC5fX3pvb21pbmcpIHx8IG5ldyBHZXN0dXJlKHRoYXQsIGFyZ3MpO1xuICB9XG5cbiAgZnVuY3Rpb24gR2VzdHVyZSh0aGF0LCBhcmdzKSB7XG4gICAgdGhpcy50aGF0ID0gdGhhdDtcbiAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIHRoaXMuYWN0aXZlID0gMDtcbiAgICB0aGlzLnNvdXJjZUV2ZW50ID0gbnVsbDtcbiAgICB0aGlzLmV4dGVudCA9IGV4dGVudC5hcHBseSh0aGF0LCBhcmdzKTtcbiAgICB0aGlzLnRhcHMgPSAwO1xuICB9XG5cbiAgR2VzdHVyZS5wcm90b3R5cGUgPSB7XG4gICAgZXZlbnQ6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQpIHRoaXMuc291cmNlRXZlbnQgPSBldmVudDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgc3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCsrdGhpcy5hY3RpdmUgPT09IDEpIHtcbiAgICAgICAgdGhpcy50aGF0Ll9fem9vbWluZyA9IHRoaXM7XG4gICAgICAgIHRoaXMuZW1pdChcInN0YXJ0XCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICB6b29tOiBmdW5jdGlvbihrZXksIHRyYW5zZm9ybSkge1xuICAgICAgaWYgKHRoaXMubW91c2UgJiYga2V5ICE9PSBcIm1vdXNlXCIpIHRoaXMubW91c2VbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMubW91c2VbMF0pO1xuICAgICAgaWYgKHRoaXMudG91Y2gwICYmIGtleSAhPT0gXCJ0b3VjaFwiKSB0aGlzLnRvdWNoMFsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy50b3VjaDBbMF0pO1xuICAgICAgaWYgKHRoaXMudG91Y2gxICYmIGtleSAhPT0gXCJ0b3VjaFwiKSB0aGlzLnRvdWNoMVsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy50b3VjaDFbMF0pO1xuICAgICAgdGhpcy50aGF0Ll9fem9vbSA9IHRyYW5zZm9ybTtcbiAgICAgIHRoaXMuZW1pdChcInpvb21cIik7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGVuZDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoLS10aGlzLmFjdGl2ZSA9PT0gMCkge1xuICAgICAgICBkZWxldGUgdGhpcy50aGF0Ll9fem9vbWluZztcbiAgICAgICAgdGhpcy5lbWl0KFwiZW5kXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBlbWl0OiBmdW5jdGlvbih0eXBlKSB7XG4gICAgICB2YXIgZCA9IHNlbGVjdCh0aGlzLnRoYXQpLmRhdHVtKCk7XG4gICAgICBsaXN0ZW5lcnMuY2FsbChcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdGhpcy50aGF0LFxuICAgICAgICBuZXcgWm9vbUV2ZW50KHR5cGUsIHtcbiAgICAgICAgICBzb3VyY2VFdmVudDogdGhpcy5zb3VyY2VFdmVudCxcbiAgICAgICAgICB0YXJnZXQ6IHpvb20sXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICB0cmFuc2Zvcm06IHRoaXMudGhhdC5fX3pvb20sXG4gICAgICAgICAgZGlzcGF0Y2g6IGxpc3RlbmVyc1xuICAgICAgICB9KSxcbiAgICAgICAgZFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gd2hlZWxlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICB0ID0gdGhpcy5fX3pvb20sXG4gICAgICAgIGsgPSBNYXRoLm1heChzY2FsZUV4dGVudFswXSwgTWF0aC5taW4oc2NhbGVFeHRlbnRbMV0sIHQuayAqIE1hdGgucG93KDIsIHdoZWVsRGVsdGEuYXBwbHkodGhpcywgYXJndW1lbnRzKSkpKSxcbiAgICAgICAgcCA9IHBvaW50ZXIoZXZlbnQpO1xuXG4gICAgLy8gSWYgdGhlIG1vdXNlIGlzIGluIHRoZSBzYW1lIGxvY2F0aW9uIGFzIGJlZm9yZSwgcmV1c2UgaXQuXG4gICAgLy8gSWYgdGhlcmUgd2VyZSByZWNlbnQgd2hlZWwgZXZlbnRzLCByZXNldCB0aGUgd2hlZWwgaWRsZSB0aW1lb3V0LlxuICAgIGlmIChnLndoZWVsKSB7XG4gICAgICBpZiAoZy5tb3VzZVswXVswXSAhPT0gcFswXSB8fCBnLm1vdXNlWzBdWzFdICE9PSBwWzFdKSB7XG4gICAgICAgIGcubW91c2VbMV0gPSB0LmludmVydChnLm1vdXNlWzBdID0gcCk7XG4gICAgICB9XG4gICAgICBjbGVhclRpbWVvdXQoZy53aGVlbCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhpcyB3aGVlbCBldmVudCB3b27igJl0IHRyaWdnZXIgYSB0cmFuc2Zvcm0gY2hhbmdlLCBpZ25vcmUgaXQuXG4gICAgZWxzZSBpZiAodC5rID09PSBrKSByZXR1cm47XG5cbiAgICAvLyBPdGhlcndpc2UsIGNhcHR1cmUgdGhlIG1vdXNlIHBvaW50IGFuZCBsb2NhdGlvbiBhdCB0aGUgc3RhcnQuXG4gICAgZWxzZSB7XG4gICAgICBnLm1vdXNlID0gW3AsIHQuaW52ZXJ0KHApXTtcbiAgICAgIGludGVycnVwdCh0aGlzKTtcbiAgICAgIGcuc3RhcnQoKTtcbiAgICB9XG5cbiAgICBub2V2ZW50KGV2ZW50KTtcbiAgICBnLndoZWVsID0gc2V0VGltZW91dCh3aGVlbGlkbGVkLCB3aGVlbERlbGF5KTtcbiAgICBnLnpvb20oXCJtb3VzZVwiLCBjb25zdHJhaW4odHJhbnNsYXRlKHNjYWxlKHQsIGspLCBnLm1vdXNlWzBdLCBnLm1vdXNlWzFdKSwgZy5leHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkpO1xuXG4gICAgZnVuY3Rpb24gd2hlZWxpZGxlZCgpIHtcbiAgICAgIGcud2hlZWwgPSBudWxsO1xuICAgICAgZy5lbmQoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtb3VzZWRvd25lZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICh0b3VjaGVuZGluZyB8fCAhZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgY3VycmVudFRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQsXG4gICAgICAgIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MsIHRydWUpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgdiA9IHNlbGVjdChldmVudC52aWV3KS5vbihcIm1vdXNlbW92ZS56b29tXCIsIG1vdXNlbW92ZWQsIHRydWUpLm9uKFwibW91c2V1cC56b29tXCIsIG1vdXNldXBwZWQsIHRydWUpLFxuICAgICAgICBwID0gcG9pbnRlcihldmVudCwgY3VycmVudFRhcmdldCksXG4gICAgICAgIHgwID0gZXZlbnQuY2xpZW50WCxcbiAgICAgICAgeTAgPSBldmVudC5jbGllbnRZO1xuXG4gICAgZHJhZ0Rpc2FibGUoZXZlbnQudmlldyk7XG4gICAgbm9wcm9wYWdhdGlvbihldmVudCk7XG4gICAgZy5tb3VzZSA9IFtwLCB0aGlzLl9fem9vbS5pbnZlcnQocCldO1xuICAgIGludGVycnVwdCh0aGlzKTtcbiAgICBnLnN0YXJ0KCk7XG5cbiAgICBmdW5jdGlvbiBtb3VzZW1vdmVkKGV2ZW50KSB7XG4gICAgICBub2V2ZW50KGV2ZW50KTtcbiAgICAgIGlmICghZy5tb3ZlZCkge1xuICAgICAgICB2YXIgZHggPSBldmVudC5jbGllbnRYIC0geDAsIGR5ID0gZXZlbnQuY2xpZW50WSAtIHkwO1xuICAgICAgICBnLm1vdmVkID0gZHggKiBkeCArIGR5ICogZHkgPiBjbGlja0Rpc3RhbmNlMjtcbiAgICAgIH1cbiAgICAgIGcuZXZlbnQoZXZlbnQpXG4gICAgICAgLnpvb20oXCJtb3VzZVwiLCBjb25zdHJhaW4odHJhbnNsYXRlKGcudGhhdC5fX3pvb20sIGcubW91c2VbMF0gPSBwb2ludGVyKGV2ZW50LCBjdXJyZW50VGFyZ2V0KSwgZy5tb3VzZVsxXSksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb3VzZXVwcGVkKGV2ZW50KSB7XG4gICAgICB2Lm9uKFwibW91c2Vtb3ZlLnpvb20gbW91c2V1cC56b29tXCIsIG51bGwpO1xuICAgICAgZHJhZ0VuYWJsZShldmVudC52aWV3LCBnLm1vdmVkKTtcbiAgICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgICAgZy5ldmVudChldmVudCkuZW5kKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGJsY2xpY2tlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgdDAgPSB0aGlzLl9fem9vbSxcbiAgICAgICAgcDAgPSBwb2ludGVyKGV2ZW50LmNoYW5nZWRUb3VjaGVzID8gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0gOiBldmVudCwgdGhpcyksXG4gICAgICAgIHAxID0gdDAuaW52ZXJ0KHAwKSxcbiAgICAgICAgazEgPSB0MC5rICogKGV2ZW50LnNoaWZ0S2V5ID8gMC41IDogMiksXG4gICAgICAgIHQxID0gY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0MCwgazEpLCBwMCwgcDEpLCBleHRlbnQuYXBwbHkodGhpcywgYXJncyksIHRyYW5zbGF0ZUV4dGVudCk7XG5cbiAgICBub2V2ZW50KGV2ZW50KTtcbiAgICBpZiAoZHVyYXRpb24gPiAwKSBzZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKGR1cmF0aW9uKS5jYWxsKHNjaGVkdWxlLCB0MSwgcDAsIGV2ZW50KTtcbiAgICBlbHNlIHNlbGVjdCh0aGlzKS5jYWxsKHpvb20udHJhbnNmb3JtLCB0MSwgcDAsIGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNoc3RhcnRlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LnRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCxcbiAgICAgICAgZyA9IGdlc3R1cmUodGhpcywgYXJncywgZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoID09PSBuKS5ldmVudChldmVudCksXG4gICAgICAgIHN0YXJ0ZWQsIGksIHQsIHA7XG5cbiAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB0ID0gdG91Y2hlc1tpXSwgcCA9IHBvaW50ZXIodCwgdGhpcyk7XG4gICAgICBwID0gW3AsIHRoaXMuX196b29tLmludmVydChwKSwgdC5pZGVudGlmaWVyXTtcbiAgICAgIGlmICghZy50b3VjaDApIGcudG91Y2gwID0gcCwgc3RhcnRlZCA9IHRydWUsIGcudGFwcyA9IDEgKyAhIXRvdWNoc3RhcnRpbmc7XG4gICAgICBlbHNlIGlmICghZy50b3VjaDEgJiYgZy50b3VjaDBbMl0gIT09IHBbMl0pIGcudG91Y2gxID0gcCwgZy50YXBzID0gMDtcbiAgICB9XG5cbiAgICBpZiAodG91Y2hzdGFydGluZykgdG91Y2hzdGFydGluZyA9IGNsZWFyVGltZW91dCh0b3VjaHN0YXJ0aW5nKTtcblxuICAgIGlmIChzdGFydGVkKSB7XG4gICAgICBpZiAoZy50YXBzIDwgMikgdG91Y2hmaXJzdCA9IHBbMF0sIHRvdWNoc3RhcnRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaHN0YXJ0aW5nID0gbnVsbDsgfSwgdG91Y2hEZWxheSk7XG4gICAgICBpbnRlcnJ1cHQodGhpcyk7XG4gICAgICBnLnN0YXJ0KCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2htb3ZlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghdGhpcy5fX3pvb21pbmcpIHJldHVybjtcbiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCwgaSwgdCwgcCwgbDtcblxuICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIHQgPSB0b3VjaGVzW2ldLCBwID0gcG9pbnRlcih0LCB0aGlzKTtcbiAgICAgIGlmIChnLnRvdWNoMCAmJiBnLnRvdWNoMFsyXSA9PT0gdC5pZGVudGlmaWVyKSBnLnRvdWNoMFswXSA9IHA7XG4gICAgICBlbHNlIGlmIChnLnRvdWNoMSAmJiBnLnRvdWNoMVsyXSA9PT0gdC5pZGVudGlmaWVyKSBnLnRvdWNoMVswXSA9IHA7XG4gICAgfVxuICAgIHQgPSBnLnRoYXQuX196b29tO1xuICAgIGlmIChnLnRvdWNoMSkge1xuICAgICAgdmFyIHAwID0gZy50b3VjaDBbMF0sIGwwID0gZy50b3VjaDBbMV0sXG4gICAgICAgICAgcDEgPSBnLnRvdWNoMVswXSwgbDEgPSBnLnRvdWNoMVsxXSxcbiAgICAgICAgICBkcCA9IChkcCA9IHAxWzBdIC0gcDBbMF0pICogZHAgKyAoZHAgPSBwMVsxXSAtIHAwWzFdKSAqIGRwLFxuICAgICAgICAgIGRsID0gKGRsID0gbDFbMF0gLSBsMFswXSkgKiBkbCArIChkbCA9IGwxWzFdIC0gbDBbMV0pICogZGw7XG4gICAgICB0ID0gc2NhbGUodCwgTWF0aC5zcXJ0KGRwIC8gZGwpKTtcbiAgICAgIHAgPSBbKHAwWzBdICsgcDFbMF0pIC8gMiwgKHAwWzFdICsgcDFbMV0pIC8gMl07XG4gICAgICBsID0gWyhsMFswXSArIGwxWzBdKSAvIDIsIChsMFsxXSArIGwxWzFdKSAvIDJdO1xuICAgIH1cbiAgICBlbHNlIGlmIChnLnRvdWNoMCkgcCA9IGcudG91Y2gwWzBdLCBsID0gZy50b3VjaDBbMV07XG4gICAgZWxzZSByZXR1cm47XG5cbiAgICBnLnpvb20oXCJ0b3VjaFwiLCBjb25zdHJhaW4odHJhbnNsYXRlKHQsIHAsIGwpLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaGVuZGVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCF0aGlzLl9fem9vbWluZykgcmV0dXJuO1xuICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzKS5ldmVudChldmVudCksXG4gICAgICAgIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCB0O1xuXG4gICAgbm9wcm9wYWdhdGlvbihldmVudCk7XG4gICAgaWYgKHRvdWNoZW5kaW5nKSBjbGVhclRpbWVvdXQodG91Y2hlbmRpbmcpO1xuICAgIHRvdWNoZW5kaW5nID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdG91Y2hlbmRpbmcgPSBudWxsOyB9LCB0b3VjaERlbGF5KTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB0ID0gdG91Y2hlc1tpXTtcbiAgICAgIGlmIChnLnRvdWNoMCAmJiBnLnRvdWNoMFsyXSA9PT0gdC5pZGVudGlmaWVyKSBkZWxldGUgZy50b3VjaDA7XG4gICAgICBlbHNlIGlmIChnLnRvdWNoMSAmJiBnLnRvdWNoMVsyXSA9PT0gdC5pZGVudGlmaWVyKSBkZWxldGUgZy50b3VjaDE7XG4gICAgfVxuICAgIGlmIChnLnRvdWNoMSAmJiAhZy50b3VjaDApIGcudG91Y2gwID0gZy50b3VjaDEsIGRlbGV0ZSBnLnRvdWNoMTtcbiAgICBpZiAoZy50b3VjaDApIGcudG91Y2gwWzFdID0gdGhpcy5fX3pvb20uaW52ZXJ0KGcudG91Y2gwWzBdKTtcbiAgICBlbHNlIHtcbiAgICAgIGcuZW5kKCk7XG4gICAgICAvLyBJZiB0aGlzIHdhcyBhIGRibHRhcCwgcmVyb3V0ZSB0byB0aGUgKG9wdGlvbmFsKSBkYmxjbGljay56b29tIGhhbmRsZXIuXG4gICAgICBpZiAoZy50YXBzID09PSAyKSB7XG4gICAgICAgIHQgPSBwb2ludGVyKHQsIHRoaXMpO1xuICAgICAgICBpZiAoTWF0aC5oeXBvdCh0b3VjaGZpcnN0WzBdIC0gdFswXSwgdG91Y2hmaXJzdFsxXSAtIHRbMV0pIDwgdGFwRGlzdGFuY2UpIHtcbiAgICAgICAgICB2YXIgcCA9IHNlbGVjdCh0aGlzKS5vbihcImRibGNsaWNrLnpvb21cIik7XG4gICAgICAgICAgaWYgKHApIHAuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHpvb20ud2hlZWxEZWx0YSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh3aGVlbERlbHRhID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIHpvb20pIDogd2hlZWxEZWx0YTtcbiAgfTtcblxuICB6b29tLmZpbHRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmaWx0ZXIgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIHpvb20pIDogZmlsdGVyO1xuICB9O1xuXG4gIHpvb20udG91Y2hhYmxlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRvdWNoYWJsZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgem9vbSkgOiB0b3VjaGFibGU7XG4gIH07XG5cbiAgem9vbS5leHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZXh0ZW50ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChbWytfWzBdWzBdLCArX1swXVsxXV0sIFsrX1sxXVswXSwgK19bMV1bMV1dXSksIHpvb20pIDogZXh0ZW50O1xuICB9O1xuXG4gIHpvb20uc2NhbGVFeHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGVFeHRlbnRbMF0gPSArX1swXSwgc2NhbGVFeHRlbnRbMV0gPSArX1sxXSwgem9vbSkgOiBbc2NhbGVFeHRlbnRbMF0sIHNjYWxlRXh0ZW50WzFdXTtcbiAgfTtcblxuICB6b29tLnRyYW5zbGF0ZUV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2xhdGVFeHRlbnRbMF1bMF0gPSArX1swXVswXSwgdHJhbnNsYXRlRXh0ZW50WzFdWzBdID0gK19bMV1bMF0sIHRyYW5zbGF0ZUV4dGVudFswXVsxXSA9ICtfWzBdWzFdLCB0cmFuc2xhdGVFeHRlbnRbMV1bMV0gPSArX1sxXVsxXSwgem9vbSkgOiBbW3RyYW5zbGF0ZUV4dGVudFswXVswXSwgdHJhbnNsYXRlRXh0ZW50WzBdWzFdXSwgW3RyYW5zbGF0ZUV4dGVudFsxXVswXSwgdHJhbnNsYXRlRXh0ZW50WzFdWzFdXV07XG4gIH07XG5cbiAgem9vbS5jb25zdHJhaW4gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY29uc3RyYWluID0gXywgem9vbSkgOiBjb25zdHJhaW47XG4gIH07XG5cbiAgem9vbS5kdXJhdGlvbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkdXJhdGlvbiA9ICtfLCB6b29tKSA6IGR1cmF0aW9uO1xuICB9O1xuXG4gIHpvb20uaW50ZXJwb2xhdGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaW50ZXJwb2xhdGUgPSBfLCB6b29tKSA6IGludGVycG9sYXRlO1xuICB9O1xuXG4gIHpvb20ub24gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmFsdWUgPSBsaXN0ZW5lcnMub24uYXBwbHkobGlzdGVuZXJzLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbGlzdGVuZXJzID8gem9vbSA6IHZhbHVlO1xuICB9O1xuXG4gIHpvb20uY2xpY2tEaXN0YW5jZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGlja0Rpc3RhbmNlMiA9IChfID0gK18pICogXywgem9vbSkgOiBNYXRoLnNxcnQoY2xpY2tEaXN0YW5jZTIpO1xuICB9O1xuXG4gIHpvb20udGFwRGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGFwRGlzdGFuY2UgPSArXywgem9vbSkgOiB0YXBEaXN0YW5jZTtcbiAgfTtcblxuICByZXR1cm4gem9vbTtcbn1cbiIsImltcG9ydCB7IHNlbGVjdCB9IGZyb20gJ2QzLXNlbGVjdGlvbidcblxuLyoqXG4gKiBQYXJlbnQgY2xhc3MgZm9yIGJ1dHRvbiBlbGVtZW50cyB1c2VkIHRvIGludGVyYWN0IHdpdGggdGhlIGdyaWR2aXogdmlld2VyLlxuICpcbiAqIEBtb2R1bGUgYnV0dG9uXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBCdXR0b24ge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXG4gICAgICogb3B0cy5wYXJlbnROb2RlXG4gICAgICogb3B0cy5pZFxuICAgICAqIG9wdHMudGl0bGVcbiAgICAgKiBvcHRzLmNsYXNzXG4gICAgICogb3B0cy5vbkNsaWNrRnVuY3Rpb25cbiAgICAgKiBvcHRzLnhcbiAgICAgKiBvcHRzLnlcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzID0ge30pIHtcbiAgICAgICAgdGhpcy5tYXAgPSBvcHRzLm1hcFxuICAgICAgICB0aGlzLnBhcmVudE5vZGUgPSBvcHRzLnBhcmVudE5vZGUgfHwgb3B0cy5tYXAuY29udGFpbmVyXG5cbiAgICAgICAgLy8gdGhlIGRpdiBlbGVtZW50XG4gICAgICAgIGlmIChvcHRzLmlkKSB0aGlzLmRpdiA9IHNlbGVjdCgnIycgKyBvcHRzLmlkKVxuXG4gICAgICAgIGlmICghdGhpcy5kaXYgfHwgdGhpcy5kaXYuZW1wdHkoKSkge1xuICAgICAgICAgICAgdGhpcy5kaXYgPSBzZWxlY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpXG4gICAgICAgICAgICBpZiAob3B0cy5pZCkgdGhpcy5kaXYuYXR0cignaWQnLCBvcHRzLmlkKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdHMudGl0bGUpIHRoaXMuZGl2LmF0dHIoJ3RpdGxlJywgb3B0cy50aXRsZSlcbiAgICAgICAgaWYgKG9wdHMuY2xhc3MpIHRoaXMuZGl2LmF0dHIoJ2NsYXNzJywgb3B0cy5jbGFzcylcblxuICAgICAgICAvLyBhZGQgZXZlbnRzXG4gICAgICAgIGlmIChvcHRzLm9uQ2xpY2tGdW5jdGlvbikgdGhpcy5kaXYub24oJ2NsaWNrJywgb3B0cy5vbkNsaWNrRnVuY3Rpb24pXG5cbiAgICAgICAgLy9zZXQgc3R5bGVzXG4gICAgICAgIHRoaXMuc3R5bGUoXG4gICAgICAgICAgICAnYm94LXNoYWRvdycsXG4gICAgICAgICAgICAnMCA3cHggOHB4IHJnYmEoMCw0NywxMDMsLjA4KSwgMCAwIDIycHggcmdiYSgwLDQ3LDEwMywuMDQpLCAwIDEycHggMTdweCByZ2JhKDAsNDcsMTAzLC4wNCksIDAgLTRweCA0cHggcmdiYSgwLDQ3LDEwMywuMDQpJ1xuICAgICAgICApIC8vLmVjbC11LXNoYWRvdy0zXG4gICAgICAgIHRoaXMuc3R5bGUoJ2JhY2tncm91bmQtY29sb3InLCAnI2ZmZmZmZicpXG4gICAgICAgIHRoaXMuc3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJylcbiAgICAgICAgdGhpcy5zdHlsZSgnY3Vyc29yJywgJ3BvaW50ZXInKVxuICAgICAgICB0aGlzLnN0eWxlKCdkaXNwbGF5JywgJ2ZsZXgnKVxuICAgICAgICB0aGlzLnN0eWxlKCdqdXN0aWZ5LWNvbnRlbnQnLCAnY2VudGVyJylcbiAgICAgICAgdGhpcy5zdHlsZSgnYWxpZ24taXRlbXMnLCAnY2VudGVyJylcbiAgICAgICAgdGhpcy5zdHlsZSgnd2lkdGgnLCAnMzVweCcpXG4gICAgICAgIHRoaXMuc3R5bGUoJ2hlaWdodCcsICczMHB4JylcbiAgICAgICAgLy8gdGhpcy5zdHlsZShwYWRkaW5nICwgJzRweCdcblxuICAgICAgICAvLyBhcHBlbmQgdG8gcGFyZW50XG4gICAgICAgIHRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzLmRpdi5ub2RlKCkpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwbHkgYSBzdHlsZSB0byB0aGUgYnV0dG9uIGRpdi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2XG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICovXG4gICAgc3R5bGUoaywgdikge1xuICAgICAgICB0aGlzLmRpdi5zdHlsZShrLCB2KVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJ1dHRvbiB9IGZyb20gJy4vQnV0dG9uLmpzJ1xuXG4vKipcbiAqIEJ1dHRvbiBmb3IgdG9nZ2xpbmcgZnVsbHNjcmVlbiBtb2RlXG4gKlxuICogQG1vZHVsZSBidXR0b25cbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEZ1bGxzY3JlZW5CdXR0b24gZXh0ZW5kcyBCdXR0b24ge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXG4gICAgICogb3B0cy5wYXJlbnROb2RlIC0gdGhlIG5vZGUgdGhhdCB0aGUgYnV0dG9uIGlzIGFwcGVuZGVkIHRvXG4gICAgICogb3B0cy5jYW52YXMgLSB0aGUgZ3JpZHZpeiBjYW52YXNcbiAgICAgKiBvcHRzLmlkXG4gICAgICogb3B0cy50aXRsZSAtIEhUTUwgdGl0bGUgYXR0cmlidXRlXG4gICAgICogb3B0cy5jbGFzcyAtIGNzcyBjbGFzc1xuICAgICAqIG9wdHMub25DbGlja0Z1bmN0aW9uXG4gICAgICogb3B0cy54IC0geCBwb3NpdGlvbiBvZiB0aGUgYnV0dG9uXG4gICAgICogb3B0cy55IC0geSBwb3NpdGlvbiBvZiB0aGUgYnV0dG9uXG4gICAgICovXG5cbiAgICAvLyBkZWZhdWx0IHN0YXRlXG4gICAgaXNGdWxsc2NyZWVuID0gZmFsc2VcblxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcblxuICAgICAgICAvLyBhcHBlbmQgZnVsbHNjcmVlbiBpY29uIHRvIGJ1dHRvbiBjb250YWluZXJcbiAgICAgICAgdGhpcy5kaXYubm9kZSgpLmlubmVySFRNTCA9IGBcbiAgICAgICAgPHN2Z1xuICAgICAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IDEuMnJlbTsgd2lkdGg6IDEuMnJlbTsgZmlsbDpibGFjazsgbWFyZ2luOjA7XCJcbiAgICAgICAgICAgIGZvY3VzYWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxzdmcgZmlsbD1cIiMwMDAwMDBcIiB2aWV3Qm94PVwiMCAwIDk2IDk2XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHRpdGxlLz5cbiAgICAgICAgICAgIDxnPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0zMCwwSDZBNS45OTY2LDUuOTk2NiwwLDAsMCwwLDZWMzBhNiw2LDAsMCwwLDEyLDBWMTJIMzBBNiw2LDAsMCwwLDMwLDBaXCIvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk05MCwwSDY2YTYsNiwwLDAsMCwwLDEySDg0VjMwYTYsNiwwLDAsMCwxMiwwVjZBNS45OTY2LDUuOTk2NiwwLDAsMCw5MCwwWlwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMzAsODRIMTJWNjZBNiw2LDAsMCwwLDAsNjZWOTBhNS45OTY2LDUuOTk2NiwwLDAsMCw2LDZIMzBhNiw2LDAsMCwwLDAtMTJaXCIvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk05MCw2MGE1Ljk5NjYsNS45OTY2LDAsMCwwLTYsNlY4NEg2NmE2LDYsMCwwLDAsMCwxMkg5MGE1Ljk5NjYsNS45OTY2LDAsMCwwLDYtNlY2NkE1Ljk5NjYsNS45OTY2LDAsMCwwLDkwLDYwWlwiLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgYFxuXG4gICAgICAgIC8vc2F2ZSBpbml0aWFsIG1hcCBkaW1lbnNpb25zXG4gICAgICAgIHRoaXMuZGVmYXVsdEhlaWdodCA9IHRoaXMubWFwLmhcbiAgICAgICAgdGhpcy5kZWZhdWx0V2lkdGggPSB0aGlzLm1hcC53XG5cbiAgICAgICAgLy8gZXZlbnQgaGFuZGxlclxuICAgICAgICB0aGlzLmRpdi5vbignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkNsaWNrRnVuY3Rpb24oZSlcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5kaXYub24oJ21vdXNlb3ZlcicsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywgJ2xpZ2h0Z3JleScpXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuZGl2Lm9uKCdtb3VzZW91dCcsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNmZmZmZmYnKVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vc2V0IHBvc2l0aW9uXG4gICAgICAgIGlmIChvcHRzLngpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ2xlZnQnLCBvcHRzLnggKyAncHgnKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdHlsZSgncmlnaHQnLCAnMTBweCcpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMueSkge1xuICAgICAgICAgICAgdGhpcy5zdHlsZSgndG9wJywgb3B0cy55ICsgJ3B4JylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ3RvcCcsICc5MHB4JylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQ2xpY2tGdW5jdGlvbihlKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRnVsbHNjcmVlbikge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUZ1bGxzY3JlZW4odGhpcy5tYXAuY29udGFpbmVyKVxuICAgICAgICAgICAgLy9yZXNpemUgY2FudmFzIHRvIGRlZmF1bHRcbiAgICAgICAgICAgIHRoaXMubWFwLmggPSB0aGlzLmRlZmF1bHRIZWlnaHRcbiAgICAgICAgICAgIHRoaXMubWFwLncgPSB0aGlzLmRlZmF1bHRXaWR0aFxuICAgICAgICAgICAgdGhpcy5tYXAuZ2VvQ2FudmFzLmggPSB0aGlzLmRlZmF1bHRIZWlnaHRcbiAgICAgICAgICAgIHRoaXMubWFwLmdlb0NhbnZhcy53ID0gdGhpcy5kZWZhdWx0V2lkdGhcbiAgICAgICAgICAgIHRoaXMubWFwLmdlb0NhbnZhcy5jYW52YXMuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcnICsgdGhpcy5kZWZhdWx0V2lkdGgpXG4gICAgICAgICAgICB0aGlzLm1hcC5nZW9DYW52YXMuY2FudmFzLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJycgKyB0aGlzLmRlZmF1bHRIZWlnaHQpXG4gICAgICAgICAgICB0aGlzLm1hcC5yZWRyYXcoKVxuICAgICAgICAgICAgdGhpcy5pc0Z1bGxzY3JlZW4gPSBmYWxzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcGVuRnVsbHNjcmVlbih0aGlzLm1hcC5jb250YWluZXIpXG4gICAgICAgICAgICAvL3Jlc2l6ZSBjYW52YXMgdG8gZnVsbHNjcmVlblxuICAgICAgICAgICAgdGhpcy5tYXAuaCA9IHdpbmRvdy5zY3JlZW4uaGVpZ2h0XG4gICAgICAgICAgICB0aGlzLm1hcC53ID0gd2luZG93LnNjcmVlbi53aWR0aFxuICAgICAgICAgICAgdGhpcy5pc0Z1bGxzY3JlZW4gPSB0cnVlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBPcGVuIGZ1bGxzY3JlZW4gKi9cbiAgICBvcGVuRnVsbHNjcmVlbihlbGVtKSB7XG4gICAgICAgIGlmIChlbGVtLnJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICBlbGVtLnJlcXVlc3RGdWxsc2NyZWVuKClcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAvKiBTYWZhcmkgKi9cbiAgICAgICAgICAgIGVsZW0ud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4oKVxuICAgICAgICB9IGVsc2UgaWYgKGVsZW0ubXNSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgLyogSUUxMSAqL1xuICAgICAgICAgICAgZWxlbS5tc1JlcXVlc3RGdWxsc2NyZWVuKClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qIENsb3NlIGZ1bGxzY3JlZW4gKi9cbiAgICBjbG9zZUZ1bGxzY3JlZW4oKSB7XG4gICAgICAgIGlmIChkb2N1bWVudC5leGl0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVxuICAgICAgICB9IGVsc2UgaWYgKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAvKiBTYWZhcmkgKi9cbiAgICAgICAgICAgIGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKClcbiAgICAgICAgfSBlbHNlIGlmIChkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAvKiBJRTExICovXG4gICAgICAgICAgICBkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IEJ1dHRvbiB9IGZyb20gJy4vQnV0dG9uLmpzJ1xuXG4vKipcbiAqIEJ1dHRvbiBmb3IgdG9nZ2xpbmcgZnVsbHNjcmVlbiBtb2RlXG4gKlxuICogQG1vZHVsZSBidXR0b25cbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFpvb21CdXR0b25zIGV4dGVuZHMgQnV0dG9uIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcblxuICAgICAgICB0aGlzLm9uWm9vbSA9IG9wdHMub25ab29tIC8vIGN1c3RvbSB1c2VyIGV2ZW50IGhhbmRsZXJcbiAgICAgICAgdGhpcy5kZWx0YSA9IG9wdHMuZGVsdGEgfHwgMC4yXG5cbiAgICAgICAgLy8gQ3JlYXRlIHpvb20gaW4gYnV0dG9uXG4gICAgICAgIHRoaXMuem9vbUluQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXG4gICAgICAgIHRoaXMuem9vbUluQnRuLmlkID0gJ3pvb20taW4nXG4gICAgICAgIHRoaXMuem9vbUluQnRuLmNsYXNzTmFtZSA9ICdncmlkdml6LXpvb20tYnV0dG9uJ1xuICAgICAgICB0aGlzLnpvb21JbkJ0bi50aXRsZSA9ICdab29tIGluJ1xuICAgICAgICB0aGlzLnpvb21JbkJ0bi50ZXh0Q29udGVudCA9ICcrJ1xuICAgICAgICB0aGlzLnpvb21JbkJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvb21JbihlKVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLnpvb21JbkJ0bi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvb21JbkJ0bi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnbGlnaHRncmV5J1xuICAgICAgICB9KVxuICAgICAgICB0aGlzLnpvb21JbkJ0bi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuem9vbUluQnRuLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcjZmZmZmZmJ1xuICAgICAgICB9KVxuXG4gICAgICAgIC8vIENyZWF0ZSB6b29tIG91dCBidXR0b25cbiAgICAgICAgdGhpcy56b29tT3V0QnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXG4gICAgICAgIHRoaXMuem9vbU91dEJ0bi5pZCA9ICd6b29tLW91dCdcbiAgICAgICAgdGhpcy56b29tT3V0QnRuLmNsYXNzTmFtZSA9ICdncmlkdml6LXpvb20tYnV0dG9uJ1xuICAgICAgICB0aGlzLnpvb21PdXRCdG4udGl0bGUgPSAnWm9vbSBvdXQnXG4gICAgICAgIHRoaXMuem9vbU91dEJ0bi50ZXh0Q29udGVudCA9ICctJ1xuICAgICAgICB0aGlzLnpvb21PdXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy56b29tT3V0KGUpXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuem9vbU91dEJ0bi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvb21PdXRCdG4uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ2xpZ2h0Z3JleSdcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy56b29tT3V0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy56b29tT3V0QnRuLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcjZmZmZmZmJ1xuICAgICAgICB9KVxuXG4gICAgICAgIC8vIFNldCBjb21tb24gc3R5bGVzIGZvciBidXR0b25zXG4gICAgICAgIGNvbnN0IGJ1dHRvbnMgPSBbdGhpcy56b29tSW5CdG4sIHRoaXMuem9vbU91dEJ0bl1cbiAgICAgICAgYnV0dG9ucy5mb3JFYWNoKChidG4sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBidG4uc3R5bGUuYWxpZ25JdGVtcyA9ICdjZW50ZXInXG4gICAgICAgICAgICBidG4uc3R5bGUuanVzdGlmeUNvbnRlbnQgPSAnY2VudGVyJ1xuICAgICAgICAgICAgYnRuLnN0eWxlLmRpc3BsYXkgPSAnZmxleCdcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5ib3JkZXIgPSAnbm9uZSdcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5jb2xvciA9ICdibGFjaydcbiAgICAgICAgICAgIGJ0bi5zdHlsZS50ZXh0QWxpZ24gPSAnY2VudGVyJ1xuICAgICAgICAgICAgYnRuLnN0eWxlLnRleHREZWNvcmF0aW9uID0gJ25vbmUnXG4gICAgICAgICAgICBidG4uc3R5bGUucGFkZGluZyA9ICc0cHgnXG4gICAgICAgICAgICBidG4uc3R5bGUuZm9udFNpemUgPSAnMjRweCdcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5mb250V2VpZ2h0ID0gJ2JvbGQnXG4gICAgICAgICAgICBidG4uc3R5bGUudXNlclNlbGVjdCA9ICdub25lJ1xuICAgICAgICAgICAgYnRuLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcjZmZmZmZmJ1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKSBidG4uc3R5bGUuYm9yZGVyQm90dG9tID0gJzFweCBzb2xpZCBncmV5JyAvLyBab29tIGluIGJ1dHRvbiBvbmx5XG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gVW5zZXQgcGFyZW50IGNsYXNzIGhlaWdodCBhbmQgZGlzcGxheSBmb3IgZHVhbCBidXR0b25zXG4gICAgICAgIHRoaXMuc3R5bGUoJ2hlaWdodCcsICd1bnNldCcpXG4gICAgICAgIHRoaXMuc3R5bGUoJ2Rpc3BsYXknLCAndW5zZXQnKVxuXG4gICAgICAgIC8vIFNldCBwb3NpdGlvblxuICAgICAgICBpZiAob3B0cy54KSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlKCdsZWZ0Jywgb3B0cy54ICsgJ3B4JylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ3JpZ2h0JywgJzEwcHgnKVxuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRzLnkpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ3RvcCcsIG9wdHMueSArICdweCcpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlKCd0b3AnLCAnMTBweCcpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBlbmQgYnV0dG9ucyB0byB0aGUgY29udGFpbmVyXG4gICAgICAgIHRoaXMuZGl2Lm5vZGUoKS5hcHBlbmRDaGlsZCh0aGlzLnpvb21JbkJ0bilcbiAgICAgICAgdGhpcy5kaXYubm9kZSgpLmFwcGVuZENoaWxkKHRoaXMuem9vbU91dEJ0bilcbiAgICB9XG5cbiAgICAvKiBab29tIGluICovXG4gICAgem9vbUluKGUpIHtcbiAgICAgICAgdGhpcy5tYXAuc2V0Wm9vbSh0aGlzLm1hcC5nZXRab29tKCkgKiAoMSAtIHRoaXMuZGVsdGEpKS5yZWRyYXcoKVxuICAgICAgICBpZiAodGhpcy5vblpvb20pIHRoaXMub25ab29tKGUpXG4gICAgfVxuXG4gICAgLyogWm9vbSBvdXQgKi9cbiAgICB6b29tT3V0KGUpIHtcbiAgICAgICAgdGhpcy5tYXAuc2V0Wm9vbSh0aGlzLm1hcC5nZXRab29tKCkgKiAoMSArIHRoaXMuZGVsdGEpKS5yZWRyYXcoKVxuICAgICAgICBpZiAodGhpcy5vblpvb20pIHRoaXMub25ab29tKGUpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIEEgZ3JpZCBjZWxsLlxuICogQHR5cGVkZWYge3t4OiBudW1iZXIsIHk6IG51bWJlcn19IENlbGwgKi9cblxuLyoqXG4gKiBBIGRhdGFzZXQgY29tcG9uZW50LCBvZiBncmlkIGNlbGxzLlxuICogQGFic3RyYWN0XG4gKlxuICogQG1vZHVsZSBjb3JlXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhc2V0IHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vTWFwLmpzXCIpLk1hcH0gbWFwIFRoZSBtYXAuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIG9mIHRoZSBkYXRhc2V0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZSBkYXRhc2V0IHJlc29sdXRpb24sIGluIHRoZSBDUlMgZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICogQHBhcmFtIHt7cHJlcHJvY2Vzcz86ZnVuY3Rpb24oQ2VsbCk6Ym9vbGVhbiwgbWl4ZWRSZXNvbHV0aW9uPzpmdW5jdGlvbihDZWxsKTpudW1iZXJ9fSBvcHRzXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWFwLCB1cmwsIHJlc29sdXRpb24sIG9wdHMgPSB7fSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIG1hcC5cbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKiBAdHlwZSB7aW1wb3J0KFwiLi9NYXAuanNcIikuTWFwfSAqL1xuICAgICAgICB0aGlzLm1hcCA9IG1hcFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdXJsIG9mIHRoZSBkYXRhc2V0LlxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudXJsID0gdXJsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkYXRhc2V0IHJlc29sdXRpb24gaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5yZXNvbHV0aW9uID0gcmVzb2x1dGlvblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBjYXNlIHRoZSBkYXRhc2V0IGlzIGEgZGF0YXNldCB3aXRoIGNlbGxzIGhhdmluZyBkaWZmZXJlbnQgcmVzb2x1dGlvbixcbiAgICAgICAgICogdGhpcyBpcyB0aGUgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSByZXNvbHV0aW9uIG9mIGVhY2ggY2VsbC5cbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKiBAdHlwZSB7KGZ1bmN0aW9uKENlbGwpOm51bWJlciApfCB1bmRlZmluZWQgfSAqL1xuICAgICAgICB0aGlzLm1peGVkUmVzb2x1dGlvbiA9IG9wdHMubWl4ZWRSZXNvbHV0aW9uXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgcHJlcHJvY2VzcyB0byBydW4gb24gZWFjaCBjZWxsIGFmdGVyIGxvYWRpbmcuIEl0IGNhbiBiZSB1c2VkIHRvIGFwcGx5IHNvbWUgc3BlY2lmaWMgdHJlYXRtZW50IGJlZm9yZSBvciBjb21wdXRlIGEgbmV3IGNvbHVtbi4gQW5kIGFsc28gdG8gZGV0ZXJtaW5lIHdoaWNoIGNlbGxzIHRvIGtlZXAgYWZ0ZXIgbG9hZGluZy5cbiAgICAgICAgICogQHR5cGUgeyhmdW5jdGlvbihDZWxsKTpib29sZWFuICl8IHVuZGVmaW5lZCB9ICovXG4gICAgICAgIHRoaXMucHJlcHJvY2VzcyA9IG9wdHMucHJlcHJvY2VzcyB8fCB1bmRlZmluZWRcblxuICAgICAgICAvKiogVGhlIGNlbGxzIHdpdGhpbiB0aGUgdmlld1xuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48Q2VsbD59ICovXG4gICAgICAgIHRoaXMuY2VsbHNWaWV3Q2FjaGUgPSBbXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3QgZGF0YSB3aXRoaW4gYSBnZW9ncmFwaGljIGVudmVsb3BlLlxuICAgICAqXG4gICAgICogQGFic3RyYWN0XG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0dlb0NhbnZhc1wiKS5FbnZlbG9wZXx1bmRlZmluZWR9IGV4dEdlb1xuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIGdldERhdGEoZXh0R2VvID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIGdldERhdGEgbm90IGltcGxlbWVudGVkLicpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsbCB0aGUgdmlldyBjYWNoZSB3aXRoIGFsbCBjZWxscyB3aGljaCBhcmUgd2l0aGluIGEgZ2VvZ3JhcGhpY2FsIGVudmVsb3BlLlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9HZW9DYW52YXNcIikuRW52ZWxvcGV9IGV4dEdlbyBUaGUgdmlldyBnZW9ncmFwaGljYWwgZW52ZWxvcGUuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgdXBkYXRlVmlld0NhY2hlKGV4dEdlbykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCB1cGRhdGVWaWV3Q2FjaGUgbm90IGltcGxlbWVudGVkLicpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgY2VsbCB1bmRlciBhIGdpdmVuIHBvc2l0aW9uLCBpZiBhbnkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3t4Om51bWJlcix5Om51bWJlcn19IHBvc0dlb1xuICAgICAqIEBwYXJhbSB7QXJyYXkuPENlbGw+fSBjZWxscyBTb21lIGNlbGxzIGZyb20gdGhlIGRhdGFzZXQgKGEgc3Vic2V0IGlmIG5lY2Vzc2FyeSwgdXN1YWxseSB0aGUgdmlldyBjYWNoZSkuXG4gICAgICogQHJldHVybnMge0NlbGx8dW5kZWZpbmVkfVxuICAgICAqL1xuICAgIGdldENlbGxGcm9tUG9zaXRpb24ocG9zR2VvLCBjZWxscykge1xuICAgICAgICAvL2NvbXB1dGUgY2FuZGlkYXRlIGNlbGwgcG9zaXRpb25cbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIC8vY29uc3QgciA9IHRoaXMuZ2V0UmVzb2x1dGlvbigpXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAvL2NvbnN0IGNlbGxYID0gciAqIE1hdGguZmxvb3IocG9zR2VvLnggLyByKVxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgLy9jb25zdCBjZWxsWSA9IHIgKiBNYXRoLmZsb29yKHBvc0dlby55IC8gcilcblxuICAgICAgICAvKi9nZXQgY2VsbFxuICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIGlmIChjZWxsLnggIT0gY2VsbFgpIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAoY2VsbC55ICE9IGNlbGxZKSBjb250aW51ZVxuICAgICAgICAgICAgcmV0dXJuIGNlbGxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkKi9cblxuICAgICAgICAvL3JhcmUgY2FzZSBvZiBtaXhlZCByZXNvbHV0aW9uIGRhdGFzZXRcbiAgICAgICAgaWYgKHRoaXMubWl4ZWRSZXNvbHV0aW9uKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgICAgICAgICBjb25zdCByID0gK3RoaXMubWl4ZWRSZXNvbHV0aW9uKGMpXG4gICAgICAgICAgICAgICAgaWYgKHBvc0dlby54IDwgYy54KSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMueCArIHIgPCBwb3NHZW8ueCkgY29udGludWVcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwb3NHZW8ueSA8IGMueSkgY29udGludWVcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjLnkgKyByIDwgcG9zR2VvLnkpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gY1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9XG5cbiAgICAgICAgLy9jb21tb24gY2FzZVxuXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICBjb25zdCByID0gdGhpcy5nZXRSZXNvbHV0aW9uKClcbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICBpZiAocG9zR2VvLnggPCBjZWxsLngpIGNvbnRpbnVlXG4gICAgICAgICAgICBlbHNlIGlmIChjZWxsLnggKyByIDwgcG9zR2VvLngpIGNvbnRpbnVlXG4gICAgICAgICAgICBlbHNlIGlmIChwb3NHZW8ueSA8IGNlbGwueSkgY29udGludWVcbiAgICAgICAgICAgIGVsc2UgaWYgKGNlbGwueSArIHIgPCBwb3NHZW8ueSkgY29udGludWVcbiAgICAgICAgICAgIGVsc2UgcmV0dXJuIGNlbGxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgLy9nZXR0ZXJzIGFuZCBzZXR0ZXJzXG5cbiAgICAvKiogQHJldHVybnMge251bWJlcn0gKi9cbiAgICBnZXRSZXNvbHV0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHV0aW9uXG4gICAgfVxuXG4gICAgLyoqIEByZXR1cm5zIHtBcnJheS48Q2VsbD59ICovXG4gICAgZ2V0Vmlld0NhY2hlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jZWxsc1ZpZXdDYWNoZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgcmVsZXZhbnQgZGF0YXNldCBmb3IgYSBzcGVjaWZpZWQgem9vbS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gelxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW5QaXhlbHNQZXJDZWxsXG4gICAgICogQHJldHVybnMge0RhdGFzZXR8dW5kZWZpbmVkfVxuICAgICAqICovXG4gICAgZ2V0RGF0YXNldCh6LCBtaW5QaXhlbHNQZXJDZWxsKSB7XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIFRoaXMgaXMgYW4gYWJzdHJhY3QgY2xhc3MgdXNlZCB0byBncm91cCBlbGVtZW50cyBzaGFyZWQgYmV0d2VlbiBMYXllciBhbmQgU3R5bGUgY2xhc3Nlcy5cbiAqXG4gKiBAYWJzdHJhY3RcbiAqIEBtb2R1bGUgY29yZVxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgRHJhd2FibGUge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHNwZWNpZnlpbmcgaWYgdGhlIGVsZW1lbnQgc2hvdWxkIGJlIHZpc2libGUgb3Igbm90LlxuICAgICAgICAgKiBUaGUgZnVuY3Rpb24gcGFyYW1ldGVyIGlzIHRoZSB6b29tIGxldmVsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyKTpib29sZWFufSAqL1xuICAgICAgICB0aGlzLnZpc2libGUgPSBvcHRzLnZpc2libGVcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGFscGhhICh0cmFuc3BhcmVuY3kvb3BhY2l0eSksIGJldHdlZW4gMC4wIChmdWxseSB0cmFuc3BhcmVudCkgYW5kIDEuMCAoZnVsbHkgb3BhcXVlKS5cbiAgICAgICAgICogIFRoZSBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgdGhlIHpvb20gbGV2ZWwuXG4gICAgICAgICAqIChzZWUgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEOiBnbG9iYWxBbHBoYSBwcm9wZXJ0eSlcbiAgICAgICAgICogQHR5cGUgeyhmdW5jdGlvbihudW1iZXIpOm51bWJlcil8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmFscGhhID0gb3B0cy5hbHBoYVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgYmxlbmQgb3BlcmF0aW9uLlxuICAgICAgICAgKiBUaGUgZnVuY3Rpb24gcGFyYW1ldGVyIGlzIHRoZSB6b29tIGxldmVsLlxuICAgICAgICAgKiAoc2VlIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDogZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uIHByb3BlcnR5KVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyKTpHbG9iYWxDb21wb3NpdGVPcGVyYXRpb259ICovXG4gICAgICAgIHRoaXMuYmxlbmRPcGVyYXRpb24gPSBvcHRzLmJsZW5kT3BlcmF0aW9uIHx8ICgoeikgPT4gJ3NvdXJjZS1vdmVyJylcblxuICAgICAgICAvKiogQHR5cGUgeyhmdW5jdGlvbihudW1iZXIpOnN0cmluZyl8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmZpbHRlckNvbG9yID0gb3B0cy5maWx0ZXJDb2xvciAvLyAoeikgPT4gXCIjZWVlN1wiXG4gICAgICAgIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKG51bWJlcik6R2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9ufFwibm9uZVwiKXx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMuZmlsdGVyQmxlbmRPcGVyYXRpb24gPSBvcHRzLmZpbHRlckJsZW5kT3BlcmF0aW9uIC8vICh6KSA9PiBcIm11bHRpcGx5XCJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGxheWVyIGZpbHRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXMgVGhlIGNhbnZhcyB3aGVyZSB0byBkcmF3IHRoZSBsYXllci5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKi9cbiAgICBkcmF3RmlsdGVyKGdlb0NhbnZhcykge1xuICAgICAgICAvL25vIGZpbHRlcjogcmV0dXJuXG4gICAgICAgIGlmICghdGhpcy5maWx0ZXJDb2xvcikgcmV0dXJuXG5cbiAgICAgICAgLy9nZXQgZmlsdGVyXG4gICAgICAgIGNvbnN0IGZjID0gdGhpcy5maWx0ZXJDb2xvcihnZW9DYW52YXMudmlldy56KVxuXG4gICAgICAgIC8vbm8gZmlsdGVyOiByZXR1cm5cbiAgICAgICAgaWYgKCFmYyB8fCBmYyA9PSAnbm9uZScpIHJldHVyblxuXG4gICAgICAgIC8vZHJhdyBmaWx0ZXJcblxuICAgICAgICAvL3NldCBjb2xvclxuICAgICAgICBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4LmZpbGxTdHlsZSA9IGZjXG5cbiAgICAgICAgLy9zYXZlIGJsZW5kIG1vZGUgYW5kIHNldCBuZXcsIGlmIGFueVxuICAgICAgICBsZXQgYm8gPSB1bmRlZmluZWQsIGJvMiA9IHVuZGVmaW5lZFxuICAgICAgICBpZiAodGhpcy5maWx0ZXJCbGVuZE9wZXJhdGlvbikge1xuICAgICAgICAgICAgYm8gPSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvblxuICAgICAgICAgICAgYm8yID0gdGhpcy5maWx0ZXJCbGVuZE9wZXJhdGlvbihnZW9DYW52YXMudmlldy56KVxuICAgICAgICB9XG4gICAgICAgIGlmIChibzIgJiYgYm8yICE9IFwibm9uZVwiKSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGJvMjtcblxuICAgICAgICAvL2RyYXdcbiAgICAgICAgZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eC5maWxsUmVjdCgwLCAwLCBnZW9DYW52YXMudywgZ2VvQ2FudmFzLmgpXG5cbiAgICAgICAgLy9yZXN0b3JlIGJsZW5kIG1vZGVcbiAgICAgICAgaWYgKGJvKSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGJvO1xuXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKiogQHR5cGVkZWYgeyB7eE1pbjogbnVtYmVyLCB4TWF4OiBudW1iZXIsIHlNaW46IG51bWJlciwgeU1heDogbnVtYmVyfSB9IEVudmVsb3BlICovXG5cbi8qKlxuICogQSB2aWV3c2hlZC5cbiAqIEB0eXBlZGVmIHt7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn19IFZpZXcgKi9cblxuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJ1xuaW1wb3J0IHsgem9vbSBhcyBkM3pvb20sIHpvb21JZGVudGl0eSB9IGZyb20gJ2QzLXpvb20nXG5cbi8qKlxuICogQSBIVE1MIGNhbnZhcyBmb3IgZ2VvIGRhdGEgZGlzcGxheSwgZW5oYW5jZWQgd2l0aCB6b29tIGFuZCBwYW4gY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBtb2R1bGUgY29yZVxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgR2VvQ2FudmFzIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBjYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSB2aWV3XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdmlld1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6IFRoZSB6b29tIGxldmVsIG9mIHRoZSB2aWV3IChwaXhlbCBzaXplLCBpbiBncm91bmQgbSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNhbnZhcywgeCA9IDAsIHkgPSAwLCB6ID0gMCwgb3B0cyA9IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLm9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEB0eXBlIHtIVE1MQ2FudmFzRWxlbWVudH0gKi9cbiAgICAgICAgdGhpcy5jYW52YXMgPSBjYW52YXNcblxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy53ID0gdGhpcy5jYW52YXMub2Zmc2V0V2lkdGhcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuaCA9IHRoaXMuY2FudmFzLm9mZnNldEhlaWdodFxuXG4gICAgICAgIC8vIEFkanVzdCBjYW52YXMgd2lkdGggYW5kIGhlaWdodCBiYXNlZCBvbiBkZXZpY2UgcGl4ZWwgcmF0aW9cbiAgICAgICAgLy9jb25zdCBkcHIgPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxIC8vIEdldCB0aGUgZGV2aWNlIHBpeGVsIHJhdGlvXG4gICAgICAgIC8vdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLncgKiBkcHIgLy8gU2V0IGNhbnZhcyB3aWR0aFxuICAgICAgICAvL1xcc3RoaXMuY2FudmFzLmhlaWdodCA9IHRoaXMuaCAqIGRwciAvLyBTZXQgY2FudmFzIGhlaWdodFxuXG4gICAgICAgIC8vIENyZWF0ZSBvZmZzY3JlZW4gY2FudmFzIGZvciBkcmF3aW5nIG9wZXJhdGlvbnNcbiAgICAgICAgdGhpcy5vZmZzY3JlZW5DYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxuICAgICAgICB0aGlzLm9mZnNjcmVlbkNhbnZhcy53aWR0aCA9IHRoaXMud1xuICAgICAgICB0aGlzLm9mZnNjcmVlbkNhbnZhcy5oZWlnaHQgPSB0aGlzLmhcblxuICAgICAgICBjb25zdCBjdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpXG4gICAgICAgIGNvbnN0IG9mZnNjcmVlbkN0eCA9IHRoaXMub2Zmc2NyZWVuQ2FudmFzLmdldENvbnRleHQoJzJkJylcbiAgICAgICAgaWYgKCFjdHgpIHRocm93ICdJbXBvc3NpYmxlIHRvIGNyZWF0ZSBjYW52YXMgMkQgY29udGV4dCdcbiAgICAgICAgaWYgKCFvZmZzY3JlZW5DdHgpIHRocm93ICdJbXBvc3NpYmxlIHRvIGNyZWF0ZSBjYW52YXMgMkQgY29udGV4dCdcbiAgICAgICAgLyoqQHR5cGUge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gKi9cbiAgICAgICAgdGhpcy5jdHggPSBjdHhcbiAgICAgICAgdGhpcy5vZmZzY3JlZW5DdHggPSBvZmZzY3JlZW5DdHhcbiAgICAgICAgLy90aGlzLmN0eC5zY2FsZShkcHIsIGRwcikgLy8gU2NhbGUgdGhlIGNvbnRleHRcblxuICAgICAgICAvKipcbiAgICAgICAgICogejogcGl4ZWwgc2l6ZSwgaW4gbS9waXhcbiAgICAgICAgICogQHR5cGUge1ZpZXd9ICAqL1xuICAgICAgICB0aGlzLnZpZXcgPSB7IHg6IHgsIHk6IHksIHo6IHogfVxuXG4gICAgICAgIC8qKiBCYWNrZ3JvdW5kIGNvbG9yLlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmJhY2tncm91bmRDb2xvciA9IG9wdHMuYmFja2dyb3VuZENvbG9yIHx8ICd3aGl0ZSdcblxuICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKG9iamVjdHx1bmRlZmluZWQpOnZvaWR9ICovXG4gICAgICAgIHRoaXMub25ab29tU3RhcnRGdW4gPSBvcHRzLm9uWm9vbVN0YXJ0RnVuXG5cbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihvYmplY3R8dW5kZWZpbmVkKTp2b2lkfSAqL1xuICAgICAgICB0aGlzLm9uWm9vbUVuZEZ1biA9IG9wdHMub25ab29tRW5kRnVuXG5cbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihvYmplY3R8dW5kZWZpbmVkKTp2b2lkfSAqL1xuICAgICAgICB0aGlzLm9uWm9vbUZ1biA9IG9wdHMub25ab29tRnVuXG5cbiAgICAgICAgLy9jdXJyZW50IGV4dGVudFxuICAgICAgICAvKiogQHR5cGUge0VudmVsb3BlfSAqL1xuICAgICAgICB0aGlzLmV4dEdlbyA9IHsgeE1pbjogTmFOLCB4TWF4OiBOYU4sIHlNaW46IE5hTiwgeU1heDogTmFOIH1cbiAgICAgICAgdGhpcy51cGRhdGVFeHRlbnRHZW8oKVxuXG4gICAgICAgIC8vcmVseSBvbiBkMyBmb3Igem9vbVxuICAgICAgICBpZiAoIW9wdHMuZGlzYWJsZVpvb20pIHtcbiAgICAgICAgICAgIGxldCB0UCA9IHpvb21JZGVudGl0eVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbGV0IGRlYm91bmNlVGltZW91dCA9IG51bGwgLy8gQWRkIGEgZGVib3VuY2UgdGltZW91dCB2YXJpYWJsZVxuICAgICAgICAgICAgY29uc3QgeiA9IGQzem9vbSgpXG4gICAgICAgICAgICAgICAgLy8gdG8gbWFrZSB0aGUgem9vbWluZyBhIGJpdCBmYXN0ZXJcbiAgICAgICAgICAgICAgICAud2hlZWxEZWx0YSgoZSkgPT4gLWUuZGVsdGFZICogKGUuZGVsdGFNb2RlID09PSAxID8gMC4wNyA6IGUuZGVsdGFNb2RlID8gMSA6IDAuMDA0KSlcbiAgICAgICAgICAgICAgICAub24oJ3pvb20nLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gZS50cmFuc2Zvcm1cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgem9vbUZhY3RvciA9IHRQLmsgLyB0LmtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHpvb21GYWN0b3IgPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9wYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR4ID0gdFAueCAtIHQueFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHkgPSB0UC55IC0gdC55XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhbihkeCAqIHRoaXMudmlldy56LCAtZHkgKiB0aGlzLnZpZXcueilcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVpvb20oZSwgem9vbUZhY3RvcilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0UCA9IHRcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vblpvb21GdW4pIHRoaXMub25ab29tRnVuKGUpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAub24oJ3N0YXJ0JywgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnQgb2Ygem9vbSBldmVudFxuICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHRoZSBjdXJyZW50IGNhbnZhcyBzdGF0ZSB0byBrZWVwIG9uc2NyZWVuIGR1cmluZyBwYW4vem9vbSBiZWZvcmUgcmVkcmF3aW5nXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5jID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmMuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcnICsgdGhpcy53KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuYy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuYy5nZXRDb250ZXh0KCcyZCcpPy5kcmF3SW1hZ2UodGhpcy5jYW52YXMsIDAsIDApXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keCA9IDBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR5ID0gMFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZiA9IDFcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25ab29tU3RhcnRGdW4pIHRoaXMub25ab29tU3RhcnRGdW4oZSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5vbignZW5kJywgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZW5kIG9mIHBhbi96b29tIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVkcmF3KClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlID0geyBjOiBudWxsLCBkeDogMCwgZHk6IDAsIGY6IDEgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uWm9vbUVuZEZ1bikgdGhpcy5vblpvb21FbmRGdW4oZSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgeihzZWxlY3QodGhpcy5jYW52YXMpKVxuXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVab29tID0gKGV2ZW50LCB6b29tRmFjdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gY2FuY2VsIG9uZ29pbmcgZGF0YSByZXF1ZXN0c1xuICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsQ3VycmVudFJlcXVlc3RzKClcbiAgICAgICAgICAgICAgICBjb25zdCBzZSA9IGV2ZW50LnNvdXJjZUV2ZW50XG5cbiAgICAgICAgICAgICAgICBpZiAoc2UgaW5zdGFuY2VvZiBXaGVlbEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vem9vbSBhdCB0aGUgbW91c2UgcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgdGhpcy56b29tKFxuICAgICAgICAgICAgICAgICAgICAgICAgem9vbUZhY3RvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGl4VG9HZW9YKHNlLm9mZnNldFgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5waXhUb0dlb1koc2Uub2Zmc2V0WSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2UgaW5zdGFuY2VvZiBUb3VjaEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29tcHV0ZSBhdmVyYWdlIHBvc2l0aW9uIG9mIHRoZSB0b3VjaGVzXG4gICAgICAgICAgICAgICAgICAgIGxldCB0eCA9IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eSA9IDBcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdHQgb2Ygc2UudGFyZ2V0VG91Y2hlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHggKz0gdHQuY2xpZW50WFxuICAgICAgICAgICAgICAgICAgICAgICAgdHkgKz0gdHQuY2xpZW50WVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHR4IC89IHNlLnRhcmdldFRvdWNoZXMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgIHR5IC89IHNlLnRhcmdldFRvdWNoZXMubGVuZ3RoXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQWRqdXN0IGZvciBjb250YWluZXIncyBvZmZzZXRcbiAgICAgICAgICAgICAgICAgICAgLy8gdHggLT0gY29udGFpbmVyUmVjdC5sZWZ0XG4gICAgICAgICAgICAgICAgICAgIC8vIHR5IC09IGNvbnRhaW5lclJlY3QudG9wXG5cbiAgICAgICAgICAgICAgICAgICAgLy96b29tIGF0IHRoaXMgYXZlcmFnZSBwb3NpdGlvblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnpvb20oem9vbUZhY3RvciwgdGhpcy5waXhUb0dlb1godHgpLCB0aGlzLnBpeFRvR2VvWSh0eSkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jZW50ZXIgZXh0ZW50XG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy54TWluID0gb3B0cy5jZW50ZXJFeHRlbnQgPyBvcHRzLmNlbnRlckV4dGVudFswXSA6IHVuZGVmaW5lZFxuICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMueU1pbiA9IG9wdHMuY2VudGVyRXh0ZW50ID8gb3B0cy5jZW50ZXJFeHRlbnRbMV0gOiB1bmRlZmluZWRcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLnhNYXggPSBvcHRzLmNlbnRlckV4dGVudCA/IG9wdHMuY2VudGVyRXh0ZW50WzJdIDogdW5kZWZpbmVkXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy55TWF4ID0gb3B0cy5jZW50ZXJFeHRlbnQgPyBvcHRzLmNlbnRlckV4dGVudFszXSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8qKiBab29tIGV4dGVudCwgdG8gbGltaXQgem9vbSBpbiBhbmQgb3V0XG4gICAgICAgICAqICBAdHlwZSB7QXJyYXkuPG51bWJlcj59ICovXG4gICAgICAgIHRoaXMuem9vbUV4dGVudCA9IG9wdHMuem9vbUV4dGVudCB8fCBbMCwgSW5maW5pdHldXG5cbiAgICAgICAgLyoqIENhbnZhcyBzdGF0ZSwgdG8gYmUgdXNlZCB0byBhdm9pZCB1bm5lY2Vzc2FyeSByZWRyYXdzIG9uIHpvb20vcGFuXG4gICAgICAgICAqICBAdHlwZSB7e2M6SFRNTENhbnZhc0VsZW1lbnR8bnVsbCxkeDpudW1iZXIsZHk6bnVtYmVyLGY6bnVtYmVyfX0gKi9cbiAgICAgICAgdGhpcy5jYW52YXNTYXZlID0geyBjOiBudWxsLCBkeDogMCwgZHk6IDAsIGY6IDEgfVxuICAgIH1cblxuICAgIC8qKiBAcmV0dXJucyB7Vmlld30gKi9cbiAgICBnZXRWaWV3KCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3XG4gICAgfVxuXG4gICAgLyoqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHYgKi9cbiAgICBzZXRDZW50ZXJFeHRlbnQodikge1xuICAgICAgICB0aGlzLnhNaW4gPSB2WzBdXG4gICAgICAgIHRoaXMueU1pbiA9IHZbMV1cbiAgICAgICAgdGhpcy54TWF4ID0gdlsyXVxuICAgICAgICB0aGlzLnlNYXggPSB2WzNdXG4gICAgfVxuICAgIC8qKiBAcmV0dXJucyB7QXJyYXkuPG51bWJlcnx1bmRlZmluZWQ+fSAqL1xuICAgIGdldENlbnRlckV4dGVudCgpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLnhNaW4sIHRoaXMueU1pbiwgdGhpcy54TWF4LCB0aGlzLnlNYXhdXG4gICAgfVxuXG4gICAgLyoqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHYgKi9cbiAgICBzZXRab29tRXh0ZW50KHYpIHtcbiAgICAgICAgdGhpcy56b29tRXh0ZW50ID0gdlxuICAgIH1cbiAgICAvKiogQHJldHVybnMge0FycmF5LjxudW1iZXI+fSAqL1xuICAgIGdldFpvb21FeHRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnpvb21FeHRlbnRcbiAgICB9XG5cbiAgICAvKiogSW5pdGlhbGlzZSBjYW52YXMgdHJhbnNmb3JtIHdpdGggaWRlbnRpdHkgdHJhbnNmb3JtYXRpb24uICovXG4gICAgaW5pdENhbnZhc1RyYW5zZm9ybSgpIHtcbiAgICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApXG4gICAgICAgIHRoaXMub2Zmc2NyZWVuQ3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKVxuICAgIH1cblxuICAgIC8qKiBJbml0aWFsaXNlIGNhbnZhcyB0cmFuc2Zvcm0gd2l0aCBnZW8gdG8gc2NyZWVuIHRyYW5zZm9ybWF0aW9uLCBzbyB0aGF0IGdlbyBvYmplY3RzIGNhbiBiZSBkcmF3biBkaXJlY3RseSBpbiBnZW8gY29vcmRpbmF0ZXMuICovXG4gICAgc2V0Q2FudmFzVHJhbnNmb3JtKCkge1xuICAgICAgICBjb25zdCBrID0gMSAvIHRoaXMudmlldy56XG4gICAgICAgIGNvbnN0IHR4ID0gLXRoaXMudmlldy54IC8gdGhpcy52aWV3LnogKyB0aGlzLncgKiAwLjVcbiAgICAgICAgY29uc3QgdHkgPSB0aGlzLnZpZXcueSAvIHRoaXMudmlldy56ICsgdGhpcy5oICogMC41XG4gICAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybShrLCAwLCAwLCAtaywgdHgsIHR5KVxuICAgICAgICB0aGlzLm9mZnNjcmVlbkN0eC5zZXRUcmFuc2Zvcm0oaywgMCwgMCwgLWssIHR4LCB0eSlcbiAgICB9XG5cbiAgICAvKiogR2V0IHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdG8gd2ViR0wgc2NyZWVuIGNvb3JkaW5hdGVzLCB3aXRoaW4gWy0xLDFdKlstMSwxXSAqL1xuICAgIGdldFdlYkdMVHJhbnNmb3JtKCkge1xuICAgICAgICBjb25zdCBreCA9IDIuMCAvICh0aGlzLncgKiB0aGlzLnZpZXcueilcbiAgICAgICAgY29uc3Qga3kgPSAyLjAgLyAodGhpcy5oICogdGhpcy52aWV3LnopXG4gICAgICAgIHJldHVybiBba3gsIDAuMCwgMC4wLCAwLjAsIGt5LCAwLjAsIC1reCAqIHRoaXMudmlldy54LCAta3kgKiB0aGlzLnZpZXcueSwgMS4wXVxuICAgIH1cblxuICAgIC8qKiBUaGUgZnVuY3Rpb24gc3BlY2lmeWluZyBob3cgdG8gZHJhdyB0aGUgbWFwLiAqL1xuICAgIHJlZHJhdygpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgcmVkcmF3IG5vdCBpbXBsZW1lbnRlZC4nKVxuICAgIH1cblxuICAgIC8qKiBXaGVuIHRoZSB6b29tIGxldmVsIGNoYW5nZXMsIGVuc3VyZXMgdGhhdCBhbnkgb25nb2luZyByZXF1ZXN0cyBhcmUgYWJvcnRlZCBiZWZvcmUgbmV3IG9uZXMgYXJlIGluaXRpYXRlZC4gKi9cbiAgICBjYW5jZWxDdXJyZW50UmVxdWVzdHMoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIGNhbmNlbEN1cnJlbnRSZXF1ZXN0cyBub3QgaW1wbGVtZW50ZWQuJylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhci4gVG8gYmUgdXNlZCBiZWZvcmUgYSByZWRyYXcgZm9yIGV4YW1wbGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yXG4gICAgICovXG4gICAgY2xlYXIoY29sb3IgPSAnd2hpdGUnKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMudHJhbnNwYXJlbnRCYWNrZ3JvdW5kKSB7XG4gICAgICAgICAgICB0aGlzLmN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy53LCB0aGlzLmgpXG4gICAgICAgICAgICB0aGlzLm9mZnNjcmVlbkN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy53LCB0aGlzLmgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdHgpIHRoaXMuY3R4LmZpbGxTdHlsZSA9IGNvbG9yXG4gICAgICAgICAgICBpZiAodGhpcy5vZmZzY3JlZW5DdHgpIHRoaXMub2Zmc2NyZWVuQ3R4LmZpbGxTdHlsZSA9IGNvbG9yXG4gICAgICAgICAgICB0aGlzLmN0eC5maWxsUmVjdCgwLCAwLCB0aGlzLncsIHRoaXMuaClcbiAgICAgICAgICAgIHRoaXMub2Zmc2NyZWVuQ3R4LmZpbGxSZWN0KDAsIDAsIHRoaXMudywgdGhpcy5oKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGR4R2VvXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGR5R2VvXG4gICAgICovXG4gICAgcGFuKGR4R2VvID0gMCwgZHlHZW8gPSAwKSB7XG4gICAgICAgIC8vZW5zdXJlcyB4L3kgZXh0ZW50XG4gICAgICAgIGlmICh0aGlzLnhNaW4gIT0gdW5kZWZpbmVkICYmIHRoaXMudmlldy54ICsgZHhHZW8gPCB0aGlzLnhNaW4pIGR4R2VvID0gdGhpcy54TWluIC0gdGhpcy52aWV3LnhcbiAgICAgICAgaWYgKHRoaXMueU1pbiAhPSB1bmRlZmluZWQgJiYgdGhpcy52aWV3LnkgKyBkeUdlbyA8IHRoaXMueU1pbikgZHlHZW8gPSB0aGlzLnlNaW4gLSB0aGlzLnZpZXcueVxuICAgICAgICBpZiAodGhpcy54TWF4ICE9IHVuZGVmaW5lZCAmJiB0aGlzLnZpZXcueCArIGR4R2VvID4gdGhpcy54TWF4KSBkeEdlbyA9IHRoaXMueE1heCAtIHRoaXMudmlldy54XG4gICAgICAgIGlmICh0aGlzLnlNYXggIT0gdW5kZWZpbmVkICYmIHRoaXMudmlldy55ICsgZHlHZW8gPiB0aGlzLnlNYXgpIGR5R2VvID0gdGhpcy55TWF4IC0gdGhpcy52aWV3LnlcblxuICAgICAgICAvL3BhblxuICAgICAgICB0aGlzLnZpZXcueCArPSBkeEdlb1xuICAgICAgICB0aGlzLnZpZXcueSArPSBkeUdlb1xuICAgICAgICB0aGlzLnVwZGF0ZUV4dGVudEdlbygpXG5cbiAgICAgICAgaWYgKHRoaXMuY2FudmFzU2F2ZS5jKSB7XG4gICAgICAgICAgICBjb25zdCBzY2FsZSA9IDEgLyB0aGlzLnZpZXcuelxuXG4gICAgICAgICAgICAvLyBVcGRhdGUgc2F2ZWQgY2FudmFzIG9mZnNldFxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR4IC09IGR4R2VvICogc2NhbGVcbiAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keSArPSBkeUdlbyAqIHNjYWxlXG5cbiAgICAgICAgICAgIC8vIGNsZWFyIGNhbnZhc1xuICAgICAgICAgICAgdGhpcy5jbGVhcih0aGlzLmJhY2tncm91bmRDb2xvcilcblxuICAgICAgICAgICAgLy8gdGhpcyBkb2VzbnQgd29yayBvbiBtb2JpbGUgaHR0cHM6Ly9naXRodWIuY29tL2V1cm9zdGF0L2dyaWR2aXovaXNzdWVzLzk4XG4gICAgICAgICAgICAvL3RoaXMuY3R4LmRyYXdJbWFnZSh0aGlzLmNhbnZhc1NhdmUuYywgdGhpcy5jYW52YXNTYXZlLmR4LCB0aGlzLmNhbnZhc1NhdmUuZHkpXG4gICAgICAgICAgICB0aGlzLm9mZnNjcmVlbkN0eC5kcmF3SW1hZ2UodGhpcy5jYW52YXNTYXZlLmMsIHRoaXMuY2FudmFzU2F2ZS5keCwgdGhpcy5jYW52YXNTYXZlLmR5KVxuXG4gICAgICAgICAgICAvLyBSZW5kZXIgdGhlIG9mZnNjcmVlbiBjYW52YXMgdG8gdGhlIHZpc2libGUgY29udGV4dFxuICAgICAgICAgICAgLy8gdGhpcy5jbGVhcih0aGlzLmJhY2tncm91bmRDb2xvcilcbiAgICAgICAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZSh0aGlzLm9mZnNjcmVlbkN0eC5jYW52YXMsIDAsIDApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnbm8gY2FudmFzIHNhdmUnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogWm9vbS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZiBUaGUgem9vbSBmYWN0b3IsIHdpdGhpbiBdMCwgSW5maW5pdHldLiAxIGlzIGZvciBubyBjaGFuZ2UuIDwxIHRvIHpvb20taW4sID4xIHRvIHpvb20tb3V0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4R2VvIFRoZSB4IGdlbyBwb3NpdGlvbiBmaXhlZCBpbiB0aGUgc2NyZWVuLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5R2VvIFRoZSB5IGdlbyBwb3NpdGlvbiBmaXhlZCBpbiB0aGUgc2NyZWVuLlxuICAgICAqL1xuICAgIHpvb20oZiA9IDEsIHhHZW8gPSB0aGlzLnZpZXcueCwgeUdlbyA9IHRoaXMudmlldy55KSB7XG4gICAgICAgIC8vVE9ETyBmb3JjZSBnZW8gZXh0ZW5kIHRvIHJlbWFpblxuXG4gICAgICAgIC8vdHJ5aW5nIHRvIHpvb20gaW4vb3V0IGJleW9uZCBsaW1pdFxuICAgICAgICBpZiAodGhpcy56b29tRXh0ZW50WzBdID09IHRoaXMudmlldy56ICYmIGYgPD0gMSkgcmV0dXJuXG4gICAgICAgIGlmICh0aGlzLnpvb21FeHRlbnRbMV0gPT0gdGhpcy52aWV3LnogJiYgZiA+PSAxKSByZXR1cm5cblxuICAgICAgICAvL2Vuc3VyZSB6b29tIGV4dGVudCBwcmVzZXJ2ZWRcbiAgICAgICAgY29uc3QgbmV3WmYgPSBmICogdGhpcy52aWV3LnpcbiAgICAgICAgaWYgKG5ld1pmIDwgdGhpcy56b29tRXh0ZW50WzBdKSBmID0gdGhpcy56b29tRXh0ZW50WzBdIC8gdGhpcy52aWV3LnpcbiAgICAgICAgaWYgKG5ld1pmID4gdGhpcy56b29tRXh0ZW50WzFdKSBmID0gdGhpcy56b29tRXh0ZW50WzFdIC8gdGhpcy52aWV3LnpcblxuICAgICAgICB0aGlzLnZpZXcueiAqPSBmXG5cbiAgICAgICAgLy9jb21wdXRlIHBhblxuICAgICAgICBsZXQgZHhHZW8gPSAoeEdlbyAtIHRoaXMudmlldy54KSAqICgxIC0gZilcbiAgICAgICAgbGV0IGR5R2VvID0gKHlHZW8gLSB0aGlzLnZpZXcueSkgKiAoMSAtIGYpXG5cbiAgICAgICAgLy9lbnN1cmVzIHgveSBleHRlbnRcbiAgICAgICAgaWYgKHRoaXMueE1pbiAhPSB1bmRlZmluZWQgJiYgdGhpcy52aWV3LnggKyBkeEdlbyA8IHRoaXMueE1pbikgZHhHZW8gPSB0aGlzLnhNaW4gLSB0aGlzLnZpZXcueFxuICAgICAgICBpZiAodGhpcy55TWluICE9IHVuZGVmaW5lZCAmJiB0aGlzLnZpZXcueSArIGR5R2VvIDwgdGhpcy55TWluKSBkeUdlbyA9IHRoaXMueU1pbiAtIHRoaXMudmlldy55XG4gICAgICAgIGlmICh0aGlzLnhNYXggIT0gdW5kZWZpbmVkICYmIHRoaXMudmlldy54ICsgZHhHZW8gPiB0aGlzLnhNYXgpIGR4R2VvID0gdGhpcy54TWF4IC0gdGhpcy52aWV3LnhcbiAgICAgICAgaWYgKHRoaXMueU1heCAhPSB1bmRlZmluZWQgJiYgdGhpcy52aWV3LnkgKyBkeUdlbyA+IHRoaXMueU1heCkgZHlHZW8gPSB0aGlzLnlNYXggLSB0aGlzLnZpZXcueVxuXG4gICAgICAgIC8vcGFuXG4gICAgICAgIHRoaXMudmlldy54ICs9IGR4R2VvXG4gICAgICAgIHRoaXMudmlldy55ICs9IGR5R2VvXG4gICAgICAgIHRoaXMudXBkYXRlRXh0ZW50R2VvKClcblxuICAgICAgICAvLyB6b29tIGluIG9uIHRoZSBjdXJyZW50IGNhbnZhcyBzdGF0ZVxuICAgICAgICBpZiAodGhpcy5jYW52YXNTYXZlLmMpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXIodGhpcy5iYWNrZ3JvdW5kQ29sb3IpXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZiAvPSBmXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHggPSB0aGlzLmdlb1RvUGl4WCh4R2VvKSAqICgxIC0gdGhpcy5jYW52YXNTYXZlLmYpXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHkgPSB0aGlzLmdlb1RvUGl4WSh5R2VvKSAqICgxIC0gdGhpcy5jYW52YXNTYXZlLmYpXG4gICAgICAgICAgICB0aGlzLmNsZWFyKHRoaXMuYmFja2dyb3VuZENvbG9yKVxuICAgICAgICAgICAgdGhpcy5vZmZzY3JlZW5DdHguZHJhd0ltYWdlKFxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5jLFxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keCxcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHksXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmYgKiB0aGlzLmNhbnZhc1NhdmUuYy53aWR0aCxcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZiAqIHRoaXMuY2FudmFzU2F2ZS5jLmhlaWdodFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKFxuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2NyZWVuQ2FudmFzLCAvLyBVc2Ugb2Zmc2NyZWVuIGNhbnZhcyBhcyB0aGUgc291cmNlXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAwLCAvLyBQb3NpdGlvbiB0aGUgb2Zmc2NyZWVuIGNhbnZhcyBhdCB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBtYWluIGNhbnZhc1xuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzLndpZHRoLCAvLyBUaGUgd2lkdGggb2YgdGhlIHZpc2libGUgY2FudmFzXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0IC8vIFRoZSBoZWlnaHQgb2YgdGhlIHZpc2libGUgY2FudmFzXG4gICAgICAgICAgICApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWFyZ2luUHhcbiAgICAgKiBAcmV0dXJucyB7RW52ZWxvcGV9IFRoZSBlbnZlbG9wZSBvZiB0aGUgdmlldywgaW4gZ2VvIGNvb3JkaW5hdGVzLlxuICAgICAqL1xuICAgIHVwZGF0ZUV4dGVudEdlbyhtYXJnaW5QeCA9IDIwKSB7XG4gICAgICAgIHRoaXMuZXh0R2VvID0ge1xuICAgICAgICAgICAgeE1pbjogdGhpcy5waXhUb0dlb1goLW1hcmdpblB4KSxcbiAgICAgICAgICAgIHhNYXg6IHRoaXMucGl4VG9HZW9YKHRoaXMudyArIG1hcmdpblB4KSxcbiAgICAgICAgICAgIHlNaW46IHRoaXMucGl4VG9HZW9ZKHRoaXMuaCArIG1hcmdpblB4KSxcbiAgICAgICAgICAgIHlNYXg6IHRoaXMucGl4VG9HZW9ZKC1tYXJnaW5QeCksXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZXh0R2VvXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIG9iamVjdCBoYXMgdG8gYmUgZHJhd25cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7e3g6bnVtYmVyLHk6bnVtYmVyfX0gb2JqXG4gICAgICovXG4gICAgdG9EcmF3KG9iaikge1xuICAgICAgICBpZiAob2JqLnggPCB0aGlzLmV4dEdlby54TWluKSByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYgKG9iai54ID4gdGhpcy5leHRHZW8ueE1heCkgcmV0dXJuIGZhbHNlXG4gICAgICAgIGlmIChvYmoueSA8IHRoaXMuZXh0R2VvLnlNaW4pIHJldHVybiBmYWxzZVxuICAgICAgICBpZiAob2JqLnkgPiB0aGlzLmV4dEdlby55TWF4KSByZXR1cm4gZmFsc2VcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvL2NvbnZlcnNpb24gZnVuY3Rpb25zXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHhHZW8gR2VvIHggY29vcmRpbmF0ZSwgaW4gbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBTY3JlZW4geCBjb29yZGluYXRlLCBpbiBwaXguXG4gICAgICovXG4gICAgZ2VvVG9QaXhYKHhHZW8pIHtcbiAgICAgICAgcmV0dXJuICh4R2VvIC0gdGhpcy52aWV3LngpIC8gdGhpcy52aWV3LnogKyB0aGlzLncgKiAwLjVcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlHZW8gR2VvIHkgY29vcmRpbmF0ZSwgaW4gbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBTY3JlZW4geSBjb29yZGluYXRlLCBpbiBwaXguXG4gICAgICovXG4gICAgZ2VvVG9QaXhZKHlHZW8pIHtcbiAgICAgICAgcmV0dXJuIC0oeUdlbyAtIHRoaXMudmlldy55KSAvIHRoaXMudmlldy56ICsgdGhpcy5oICogMC41XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IFNjcmVlbiB4IGNvb3JkaW5hdGUsIGluIHBpeC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBHZW8geCBjb29yZGluYXRlLCBpbiBtLlxuICAgICAqL1xuICAgIHBpeFRvR2VvWCh4KSB7XG4gICAgICAgIHJldHVybiAoeCAtIHRoaXMudyAqIDAuNSkgKiB0aGlzLnZpZXcueiArIHRoaXMudmlldy54XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IFNjcmVlbiB5IGNvb3JkaW5hdGUsIGluIHBpeC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBHZW8geSBjb29yZGluYXRlLCBpbiBtLlxuICAgICAqL1xuICAgIHBpeFRvR2VvWSh5KSB7XG4gICAgICAgIHJldHVybiAtKHkgLSB0aGlzLmggKiAwLjUpICogdGhpcy52aWV3LnogKyB0aGlzLnZpZXcueVxuICAgIH1cblxuICAgIC8qKiBHZXQgeCx5LHogZWxlbWVudHMgZnJvbSBVUkwgYW5kIGFzc2lnbiB0aGVtIHRvIHRoZSB2aWV3LiAqL1xuICAgIHNldFZpZXdGcm9tVVJMKCkge1xuICAgICAgICBjb25zdCB4ID0gR2VvQ2FudmFzLmdldFBhcmFtZXRlckJ5TmFtZSgneCcpLFxuICAgICAgICAgICAgeSA9IEdlb0NhbnZhcy5nZXRQYXJhbWV0ZXJCeU5hbWUoJ3knKSxcbiAgICAgICAgICAgIHogPSBHZW9DYW52YXMuZ2V0UGFyYW1ldGVyQnlOYW1lKCd6JylcbiAgICAgICAgaWYgKHggIT0gbnVsbCAmJiB4ICE9IHVuZGVmaW5lZCAmJiAhaXNOYU4oK3gpKSB0aGlzLnZpZXcueCA9ICt4XG4gICAgICAgIGlmICh5ICE9IG51bGwgJiYgeSAhPSB1bmRlZmluZWQgJiYgIWlzTmFOKCt5KSkgdGhpcy52aWV3LnkgPSAreVxuICAgICAgICBpZiAoeiAhPSBudWxsICYmIHogIT0gdW5kZWZpbmVkICYmICFpc05hTigreikpIHRoaXMudmlldy56ID0gK3pcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBVUkwgcGFyYW1ldGVyIGJ5IG5hbWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRQYXJhbWV0ZXJCeU5hbWUobmFtZSkge1xuICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC9bXFxbXS8sICdcXFxcWycpLnJlcGxhY2UoL1tcXF1dLywgJ1xcXFxdJylcbiAgICAgICAgdmFyIHJlZ2V4ID0gbmV3IFJlZ0V4cCgnW1xcXFw/Jl0nICsgbmFtZSArICc9KFteJiNdKiknKSxcbiAgICAgICAgICAgIHJlc3VsdHMgPSByZWdleC5leGVjKGxvY2F0aW9uLnNlYXJjaClcbiAgICAgICAgcmV0dXJuICFyZXN1bHRzID8gbnVsbCA6IGRlY29kZVVSSUNvbXBvbmVudChyZXN1bHRzWzFdLnJlcGxhY2UoL1xcKy9nLCAnICcpKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgRHJhd2FibGUgfSBmcm9tICcuL0RyYXdhYmxlLmpzJ1xuXG4vKipcbiAqIEBtb2R1bGUgY29yZVxuICogQGFic3RyYWN0XG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBMYXllciBleHRlbmRzIERyYXdhYmxlIHtcbiAgICAvKipcbiAgICAgKiBEcmF3IGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBsZWdlbmRcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKi9cbiAgICBkcmF3KGdlb0NhbnZhcywgbGVnZW5kID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIGRyYXcgbm90IGltcGxlbWVudGVkLicpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICdkMy1zZWxlY3Rpb24nXG5cbi8qKlxuICogQSBsZWdlbmQgY29udGFpbmVyLlxuICpcbiAqIEBtb2R1bGUgY29yZVxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgTGVnZW5kIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5pZCA9IG9wdHMuaWRcblxuICAgICAgICAvL1RPRE8gc3RvcCB1c2luZyBpdC4gVXNlIHN0eWxlIG1ldGhvZCBiZWxvdyBpbnN0ZWFkLlxuXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLnRvcCA9IG9wdHMudG9wXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLmJvdHRvbSA9IG9wdHMuYm90dG9tXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLmxlZnQgPSBvcHRzLmxlZnRcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXMucmlnaHQgPSBvcHRzLnJpZ2h0XG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSBvcHRzLmJhY2tncm91bmQgfHwgJ25vbmUnXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLnBhZGRpbmcgPSBvcHRzLnBhZGRpbmcgfHwgJzVweCdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXMuYm9yZGVyID0gb3B0cy5ib3JkZXIgfHwgJzBweCdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXNbJ2JvcmRlci1yYWRpdXMnXSA9IG9wdHNbJ2JvcmRlci1yYWRpdXMnXSB8fCAnbm9uZSdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXNbJ2JveC1zaGFkb3cnXSA9IG9wdHNbJ2JveC1zaGFkb3cnXSB8fCAnbm9uZSdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXNbJ2ZvbnQtZmFtaWx5J10gPSBvcHRzWydmb250LWZhbWlseSddIHx8ICdIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmJ1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgLy90aGlzLndpZHRoID0gb3B0cy53aWR0aFxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgLy90aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0XG5cbiAgICAgICAgLy90aGUgZGl2IGVsZW1lbnRcbiAgICAgICAgaWYgKHRoaXMuaWQpIHRoaXMuZGl2ID0gc2VsZWN0KCcjJyArIHRoaXMuaWQpXG5cbiAgICAgICAgaWYgKCF0aGlzLmRpdiB8fCB0aGlzLmRpdi5lbXB0eSgpKSB7XG4gICAgICAgICAgICB0aGlzLmRpdiA9IHNlbGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSlcbiAgICAgICAgICAgIGlmICh0aGlzLmlkKSB0aGlzLmRpdi5hdHRyKCdpZCcsIHRoaXMuaWQpXG4gICAgICAgIH1cblxuICAgICAgICAvL3NldCBzdHlsZVxuICAgICAgICB0aGlzLmRpdi5zdHlsZSgnYmFja2dyb3VuZCcsIHRoaXMuYmFja2dyb3VuZClcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoJ3BhZGRpbmcnLCB0aGlzLnBhZGRpbmcpXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKCdib3JkZXInLCB0aGlzLmJvcmRlcilcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoJ2JvcmRlci1yYWRpdXMnLCB0aGlzWydib3JkZXItcmFkaXVzJ10pXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKCdib3gtc2hhZG93JywgdGhpc1snYm94LXNoYWRvdyddKVxuICAgICAgICB0aGlzLmRpdi5zdHlsZSgnZm9udC1mYW1pbHknLCB0aGlzWydmb250LWZhbWlseSddKVxuXG4gICAgICAgIC8vaWYgKHRoaXMud2lkdGgpIHRoaXMuZGl2LnN0eWxlKCd3aWR0aCcsIHRoaXMud2lkdGgpXG4gICAgICAgIC8vaWYgKHRoaXMuaGVpZ2h0KSB0aGlzLmRpdi5zdHlsZSgnaGVpZ2h0JywgdGhpcy5oZWlnaHQpXG5cbiAgICAgICAgLy90aXRsZVxuICAgICAgICB0aGlzLnRpdGxlID0gb3B0cy50aXRsZVxuICAgICAgICB0aGlzLnRpdGxlRm9udFNpemUgPSBvcHRzLnRpdGxlRm9udFNpemUgfHwgJzAuOGVtJ1xuICAgICAgICB0aGlzLnRpdGxlRm9udFdlaWdodCA9IG9wdHMudGl0bGVGb250V2VpZ2h0IHx8ICdib2xkJ1xuXG4gICAgICAgIC8vbGFiZWxcbiAgICAgICAgdGhpcy5sYWJlbEZvbnRTaXplID0gb3B0cy5sYWJlbEZvbnRTaXplIHx8ICcwLjhlbSdcbiAgICAgICAgdGhpcy5sYWJlbFVuaXRUZXh0ID0gb3B0cy5sYWJlbFVuaXRUZXh0IHx8ICcnXG4gICAgICAgIHRoaXMubGFiZWxGb3JtYXQgPSBvcHRzLmxhYmVsRm9ybWF0XG4gICAgfVxuXG4gICAgbWFrZVRpdGxlKCkge1xuICAgICAgICBpZiAoIXRoaXMudGl0bGUpIHJldHVyblxuICAgICAgICB0aGlzLmRpdlxuICAgICAgICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy50aXRsZUZvbnRTaXplKVxuICAgICAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsIHRoaXMudGl0bGVGb250V2VpZ2h0KVxuICAgICAgICAgICAgLnN0eWxlKCdtYXJnaW4tYm90dG9tJywgJzdweCcpXG4gICAgICAgICAgICAudGV4dCh0aGlzLnRpdGxlKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwcGx5IGEgc3R5bGUgdG8gdGhlIGxlZ2VuZCBkaXYuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdlxuICAgICAqIEByZXR1cm5zIHt0aGlzfHN0cmluZ31cbiAgICAgKi9cbiAgICBzdHlsZShrLCB2KSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHJldHVybiB0aGlzLmRpdi5zdHlsZShrKVxuICAgICAgICB0aGlzLmRpdi5zdHlsZShrLCB2KVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgdXBkYXRlKG9wdHMgPSB7fSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdMZWdlbmQgdXBkYXRlIG5vdCBpbXBsZW1lbnRlZCB5ZXQuJylcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8vIGludGVybmFsIGltcG9ydHNcbmltcG9ydCB7IEdlb0NhbnZhcyB9IGZyb20gJy4vR2VvQ2FudmFzLmpzJ1xuaW1wb3J0IHsgVG9vbHRpcCB9IGZyb20gJy4vVG9vbHRpcC5qcydcbmltcG9ydCB7IFpvb21CdXR0b25zIH0gZnJvbSAnLi4vYnV0dG9uL1pvb21CdXR0b25zLmpzJ1xuaW1wb3J0IHsgRnVsbHNjcmVlbkJ1dHRvbiB9IGZyb20gJy4uL2J1dHRvbi9GdWxsc2NyZWVuQnV0dG9uLmpzJ1xuXG4vLyBleHRlcm5hbCBpbXBvcnRzXG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICdkMy1zZWxlY3Rpb24nXG5cbi8qKlxuICogQSBncmlkdml6IGFwcGxpY2F0aW9uLlxuICpcbiAqIEBtb2R1bGUgY29yZVxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgTWFwIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0hUTUxEaXZFbGVtZW50fSBjb250YWluZXJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbnRhaW5lciwgb3B0cykge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgbGF5ZXJzLlxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPGltcG9ydChcIi4vTGF5ZXIuanNcIikuTGF5ZXI+fVxuICAgICAgICAgKiAqL1xuICAgICAgICB0aGlzLmxheWVycyA9IG9wdHMubGF5ZXJzIHx8IFtdXG5cbiAgICAgICAgLy9nZXQgY29udGFpbmVyIGVsZW1lbnRcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXIgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dyaWR2aXonKVxuICAgICAgICBpZiAoIXRoaXMuY29udGFpbmVyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3QgZmluZCBncmlkdml6IGNvbnRhaW5lciBlbGVtZW50LicpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9hYnNvbHV0ZS1wb3NpdGlvbmluZy1pbnNpZGUtcmVsYXRpdmUtcG9zaXRpb25pbmcvXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJyAvLyBjb250YWluZXIgZWxlbWVudCBtdXN0IGhhdmUgcmVsYXRpdmUgcG9zaXRpb25pbmdcblxuICAgICAgICAvL3NldCBkaW1lbnNpb25zXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLncgPSBvcHRzLncgfHwgdGhpcy5jb250YWluZXIub2Zmc2V0V2lkdGhcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuaCA9IG9wdHMuaCB8fCB0aGlzLmNvbnRhaW5lci5vZmZzZXRIZWlnaHRcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIG1haW4gY2FudmFzIChmb3IgcmVuZGVyaW5nIHRvIHNjcmVlbilcbiAgICAgICAgLyoqIEB0eXBlIHtIVE1MQ2FudmFzRWxlbWVudH0gKi9cbiAgICAgICAgdGhpcy5fY2FudmFzID0gb3B0cy5jYW52YXMgfHwgdGhpcy5pbml0aWFsaXNlQ2FudmFzKClcblxuICAgICAgICAvKiogIEluaXRpYWxpemUgR2VvQ2FudmFzXG4gICAgICAgICAqIEB0eXBlIHtHZW9DYW52YXN9XG4gICAgICAgICAqIEBwcml2YXRlICovXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzID0gbmV3IEdlb0NhbnZhcyh0aGlzLl9jYW52YXMsIG9wdHMueCwgb3B0cy55LCBvcHRzLnosIG9wdHMpXG5cbiAgICAgICAgdGhpcy5nZW9DYW52YXMucmVkcmF3ID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWRyYXcoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbmNlbEN1cnJlbnRSZXF1ZXN0cyA9ICgpID0+IHtcbiAgICAgICAgICAgIC8vIHdoZW4gdGhlIHpvb20gbGV2ZWwgY2hhbmdlcywgYXZvaWQgZHJhd2luZyBvdXRkYXRlZCB0aWxlcywgYW5kIGVuc3VyZSB0aGF0IHJlcXVlc3RzIGFyZSBwcm9wZXJseSBhYm9ydGVkIHdoZW4gbmVjZXNzYXJ5XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XG4gICAgICAgICAgICAgICAgLy9tdWx0aXJlc1xuICAgICAgICAgICAgICAgIGlmIChsYXllci5kYXRhc2V0Py5kYXRhc2V0cykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgbGF5ZXIuZGF0YXNldD8uZGF0YXNldHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhc2V0Py5jYW5jZWxDdXJyZW50UmVxdWVzdHMpIGRhdGFzZXQuY2FuY2VsQ3VycmVudFJlcXVlc3RzKClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL3NpbmdsZSByZXNcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXIuZGF0YXNldD8uY2FuY2VsQ3VycmVudFJlcXVlc3RzKSBsYXllci5kYXRhc2V0Py5jYW5jZWxDdXJyZW50UmVxdWVzdHMoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gbGVnZW5kIGRpdlxuICAgICAgICB0aGlzLmxlZ2VuZCA9IG9wdHMubGVnZW5kQ29udGFpbmVyXG4gICAgICAgICAgICA/IHNlbGVjdChvcHRzLmxlZ2VuZENvbnRhaW5lcikgLy8gV3JhcCB0aGUgcHJvdmlkZWQgSFRNTCBub2RlIGluIGEgRDMgc2VsZWN0aW9uXG4gICAgICAgICAgICA6IG51bGxcbiAgICAgICAgaWYgKCF0aGlzLmxlZ2VuZCkgdGhpcy5pbml0aWFsaXNlTGVnZW5kKClcblxuICAgICAgICAvL3Rvb2x0aXBcblxuICAgICAgICAvLyBzZXQgQXBwIGNvbnRhaW5lciBhcyBkZWZhdWx0IHBhcmVudCBlbGVtZW50IGZvciB0b29sdGlwXG4gICAgICAgIGlmICghb3B0cy50b29sdGlwKSBvcHRzLnRvb2x0aXAgPSB7fVxuICAgICAgICBpZiAoIW9wdHMudG9vbHRpcC5wYXJlbnRFbGVtZW50KSBvcHRzLnRvb2x0aXAucGFyZW50RWxlbWVudCA9IHRoaXMuY29udGFpbmVyXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtUb29sdGlwfSAqL1xuICAgICAgICB0aGlzLnRvb2x0aXAgPSBuZXcgVG9vbHRpcChvcHRzLnRvb2x0aXApXG5cbiAgICAgICAgLy8gYWRkIGV2ZW50IGxpc3RlbmVycyB0byBjb250YWluZXJcbiAgICAgICAgdGhpcy5tb3VzZU92ZXJIYW5kbGVyID0gKGUpID0+IHRoaXMuZm9jdXNDZWxsKGUpXG4gICAgICAgIHRoaXMubW91c2VNb3ZlSGFuZGxlciA9IChlKSA9PiB0aGlzLmZvY3VzQ2VsbChlKVxuICAgICAgICB0aGlzLm1vdXNlT3V0SGFuZGxlciA9IChlKSA9PiB0aGlzLnRvb2x0aXAuaGlkZSgpXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCB0aGlzLm1vdXNlT3ZlckhhbmRsZXIpXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm1vdXNlTW92ZUhhbmRsZXIpXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIHRoaXMubW91c2VPdXRIYW5kbGVyKVxuXG4gICAgICAgIC8vIGxpc3RlbiBmb3IgcmVzaXplIGV2ZW50cyBvbiB0aGUgQXBwJ3MgY29udGFpbmVyIGFuZCBoYW5kbGUgdGhlbVxuICAgICAgICB0aGlzLmRlZmluZVJlc2l6ZU9ic2VydmVyKClcblxuICAgICAgICAvLyBhZGQgZXh0cmEgbG9naWMgdG8gb25ab29tU3RhcnRGdW5cbiAgICAgICAgdGhpcy5nZW9DYW52YXMub25ab29tU3RhcnRGdW4gPSAoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdHMub25ab29tU3RhcnRGdW4pIG9wdHMub25ab29tU3RhcnRGdW4oZSlcbiAgICAgICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vZm9yIG1vdXNlIG92ZXJcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtIVE1MQ2FudmFzRWxlbWVudHxudWxsfSAqL1xuICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSBudWxsXG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25SZWN0YW5nbGVDb2xvciA9IG9wdHMuc2VsZWN0aW9uUmVjdGFuZ2xlQ29sb3IgfHwgJyNGRjYzNDcnXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXggPSBvcHRzLnNlbGVjdGlvblJlY3RhbmdsZVdpZHRoUGl4IHx8ICgoKSA9PiA0KSAvLyhyLHopID0+IHt9XG5cbiAgICAgICAgLy8gdHJhbnNwYXJlbnQgYmFja2dyb3VuZCAoZS5nLiBsZWFmbGV0KSAncmVkIHBhaW50aW5nJyBmaXhcbiAgICAgICAgdGhpcy50cmFuc3BhcmVudEJhY2tncm91bmQgPSBvcHRzLnRyYW5zcGFyZW50QmFja2dyb3VuZFxuXG4gICAgICAgIC8vc2V0IGRlZmF1bHQgZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uXG4gICAgICAgIHRoaXMuZGVmYXVsdEdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9XG4gICAgICAgICAgICBvcHRzLmRlZmF1bHRHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gfHwgdGhpcy5nZW9DYW52YXMuY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAcmV0dXJucyB7SFRNTENhbnZhc0VsZW1lbnR9XG4gICAgICovXG4gICAgaW5pdGlhbGlzZUNhbnZhcygpIHtcbiAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcbiAgICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcbiAgICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJycgKyB0aGlzLmgpXG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGNhbnZhcylcbiAgICAgICAgcmV0dXJuIGNhbnZhc1xuICAgIH1cblxuICAgIGluaXRpYWxpc2VMZWdlbmQoKSB7XG4gICAgICAgIHRoaXMubGVnZW5kID0gc2VsZWN0KHRoaXMuY29udGFpbmVyKVxuICAgICAgICAgICAgLmFwcGVuZCgnZGl2JykgLy8gQ3JlYXRlIGEgbmV3IGNvbnRhaW5lclxuICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ2dyaWR2aXotbGVnZW5kJylcbiAgICAgICAgICAgIC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxuICAgICAgICAgICAgLnN0eWxlKCd3aWR0aCcsICdhdXRvJylcbiAgICAgICAgICAgIC5zdHlsZSgnaGVpZ2h0JywgJ2F1dG8nKVxuICAgICAgICAgICAgLnN0eWxlKCdiYWNrZ3JvdW5kJywgJyNGRkZGRkYnKVxuICAgICAgICAgICAgLy8uc3R5bGUoXCJwYWRkaW5nXCIsIHRoaXMucGFkZGluZylcbiAgICAgICAgICAgIC5zdHlsZSgnYm9yZGVyJywgJzBweCcpXG4gICAgICAgICAgICAvLy5zdHlsZSgnYm9yZGVyLXJhZGl1cycsICc1cHgnKVxuICAgICAgICAgICAgLnN0eWxlKCdib3gtc2hhZG93JywgJzNweCAzcHggM3B4IGdyZXksIC0zcHggLTNweCAzcHggI2RkZCcpXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtZmFtaWx5JywgJ0hlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYnKVxuICAgICAgICAgICAgLnN0eWxlKCdib3R0b20nLCAnMTVweCcpXG4gICAgICAgICAgICAuc3R5bGUoJ3JpZ2h0JywgJzE1cHgnKVxuICAgICAgICAvL2hpZGVcbiAgICAgICAgLy8uc3R5bGUoXCJ2aXNpYmlsaXR5XCIsIFwiaGlkZGVuXCIpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0L2dldCBsYXllciBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7dW5kZWZpbmVkfGltcG9ydChcIi4vTGF5ZXIuanNcIikuTGF5ZXJ8aW1wb3J0KFwiLi9MYXllci5qc1wiKS5MYXllcltdfSBsYXllcnNcbiAgICAgKiBAcmV0dXJucyB7IHRoaXMgfCBpbXBvcnQoXCIuL0xheWVyLmpzXCIpLkxheWVyW10gfVxuICAgICAqL1xuICAgIGxheWVyc18obGF5ZXJzKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5sYXllcnNcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShsYXllcnMpKSB0aGlzLmxheWVycyA9IGxheWVyc1xuICAgICAgICAgICAgZWxzZSB0aGlzLmxheWVycyA9IFtsYXllcnNdXG4gICAgICAgIGVsc2UgdGhpcy5sYXllcnMgPSBhcmd1bWVudHNcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge3RoaXN9ICovXG4gICAgcmVkcmF3KCkge1xuICAgICAgICAvL3JlbW92ZSBsZWdlbmQgZWxlbWVudHNcbiAgICAgICAgaWYgKHRoaXMubGVnZW5kKSB0aGlzLmxlZ2VuZC5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxuXG4gICAgICAgIC8vY2xlYXJcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNsZWFyKHRoaXMuZ2VvQ2FudmFzLmJhY2tncm91bmRDb2xvcilcblxuICAgICAgICBjb25zdCB6ID0gdGhpcy5nZW9DYW52YXMudmlldy56XG4gICAgICAgIHRoaXMudXBkYXRlRXh0ZW50R2VvKClcblxuICAgICAgICAvL2dvIHRocm91Z2ggdGhlIGxheWVyc1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XG4gICAgICAgICAgICAvL2NoZWNrIGlmIGxheWVyIGlzIHZpc2libGVcbiAgICAgICAgICAgIGlmIChsYXllci52aXNpYmxlICYmICFsYXllci52aXNpYmxlKHopKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3NldCBsYXllciBhbHBoYSBhbmQgYmxlbmQgbW9kZVxuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMub2Zmc2NyZWVuQ3R4Lmdsb2JhbEFscGhhID0gbGF5ZXIuYWxwaGEgPyBsYXllci5hbHBoYSh6KSA6IDEuMFxuICAgICAgICAgICAgaWYgKGxheWVyLmJsZW5kT3BlcmF0aW9uKSB0aGlzLmdlb0NhbnZhcy5vZmZzY3JlZW5DdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gbGF5ZXIuYmxlbmRPcGVyYXRpb24oeilcblxuICAgICAgICAgICAgLy9zZXQgYWZmaW4gdHJhbnNmb3JtIHRvIGRyYXcgd2l0aCBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXNcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLnNldENhbnZhc1RyYW5zZm9ybSgpXG5cbiAgICAgICAgICAgIC8vZHJhdyBsYXllclxuICAgICAgICAgICAgbGF5ZXIuZHJhdyh0aGlzLmdlb0NhbnZhcywgdGhpcy5sZWdlbmQpXG5cbiAgICAgICAgICAgIC8vZHJhdyBsYXllciBmaWx0ZXJcbiAgICAgICAgICAgIGlmIChsYXllci5maWx0ZXJDb2xvcikgbGF5ZXIuZHJhd0ZpbHRlcih0aGlzLmdlb0NhbnZhcylcblxuICAgICAgICAgICAgLy9yZXN0b3JlIGRlZmF1bHQgYWxwaGEgYW5kIGJsZW5kIG9wZXJhdGlvblxuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMub2Zmc2NyZWVuQ3R4Lmdsb2JhbEFscGhhID0gMS4wXG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5vZmZzY3JlZW5DdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gdGhpcy5kZWZhdWx0R2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uXG4gICAgICAgIH1cblxuICAgICAgICAvLyBvbmUgZHJhd0ltYWdlIGNhbGw6IGRyYXcgdGhlIG9mZnNjcmVlbiBjYW52YXMgdG8gdGhlIG1haW4gY2FudmFzXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuICAgICAgICB0aGlzLmdlb0NhbnZhcy5jdHguZHJhd0ltYWdlKHRoaXMuZ2VvQ2FudmFzLm9mZnNjcmVlbkNhbnZhcywgMCwgMClcblxuICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSBudWxsXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWFyZ2luUHhcbiAgICAgKiBAcmV0dXJucyB7aW1wb3J0KCcuL0dlb0NhbnZhcy5qcycpLkVudmVsb3BlfVxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICB1cGRhdGVFeHRlbnRHZW8obWFyZ2luUHggPSAyMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW9DYW52YXMudXBkYXRlRXh0ZW50R2VvKG1hcmdpblB4KVxuICAgIH1cblxuICAgIC8qKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUgKi9cbiAgICBmb2N1c0NlbGwoZSkge1xuICAgICAgICAvL2NvbXB1dGUgbW91c2UgZ2VvIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IG1vdXNlUG9zaXRpb25HZW8gPSB7XG4gICAgICAgICAgICB4OiB0aGlzLmdlb0NhbnZhcy5waXhUb0dlb1goZS5vZmZzZXRYICsgdGhpcy50b29sdGlwLnhNb3VzZU9mZnNldCksXG4gICAgICAgICAgICB5OiB0aGlzLmdlb0NhbnZhcy5waXhUb0dlb1koZS5vZmZzZXRZICsgdGhpcy50b29sdGlwLnlNb3VzZU9mZnNldCksXG4gICAgICAgIH1cbiAgICAgICAgLyoqIEB0eXBlIHt7Y2VsbDppbXBvcnQoJy4vRGF0YXNldC5qcycpLkNlbGwsaHRtbDpzdHJpbmcscmVzb2x1dGlvbjpudW1iZXJ9IHwgdW5kZWZpbmVkfSAqL1xuICAgICAgICBjb25zdCBmb2N1cyA9IHRoaXMuZ2V0Q2VsbEZvY3VzSW5mbyhtb3VzZVBvc2l0aW9uR2VvKVxuXG4gICAgICAgIC8vIHRyYW5zcGFyZW50IGJhY2tncm91bmQgKGUuZy4gbGVhZmxldCkgJ3JlZCBwYWludGluZycgZml4XG4gICAgICAgIGlmICh0aGlzLnRyYW5zcGFyZW50QmFja2dyb3VuZCkge1xuICAgICAgICAgICAgaWYgKGZvY3VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLmh0bWwoZm9jdXMuaHRtbClcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuc2V0UG9zaXRpb24oZSlcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuc2hvdygpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcnICsgdGhpcy53KVxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJycgKyB0aGlzLmgpXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZ2V0Q29udGV4dCgnMmQnKT8uZHJhd0ltYWdlKHRoaXMuZ2VvQ2FudmFzLmNhbnZhcywgMCwgMClcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZm9jdXMpIHtcbiAgICAgICAgICAgIHRoaXMudG9vbHRpcC5odG1sKGZvY3VzLmh0bWwpXG4gICAgICAgICAgICB0aGlzLnRvb2x0aXAuc2V0UG9zaXRpb24oZSlcbiAgICAgICAgICAgIHRoaXMudG9vbHRpcC5zaG93KClcblxuICAgICAgICAgICAgLy9zaG93IGNlbGwgcG9zaXRpb24gYXMgYSByZWN0YW5nbGVcbiAgICAgICAgICAgIGlmICghdGhpcy5jYW52YXNTYXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcnICsgdGhpcy53KVxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5nZXRDb250ZXh0KCcyZCcpPy5kcmF3SW1hZ2UodGhpcy5nZW9DYW52YXMub2Zmc2NyZWVuQ2FudmFzLCAwLCAwKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5vZmZzY3JlZW5DdHguZHJhd0ltYWdlKHRoaXMuY2FudmFzU2F2ZSwgMCwgMClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9kcmF3IGltYWdlIHNhdmVkICsgZHJhdyByZWN0YW5nbGVcbiAgICAgICAgICAgIGNvbnN0IHJlY3RXUGl4ID0gdGhpcy5zZWxlY3Rpb25SZWN0YW5nbGVXaWR0aFBpeFxuICAgICAgICAgICAgICAgID8gdGhpcy5zZWxlY3Rpb25SZWN0YW5nbGVXaWR0aFBpeChmb2N1cy5yZXNvbHV0aW9uLCB0aGlzLmdlb0NhbnZhcy52aWV3LnopXG4gICAgICAgICAgICAgICAgOiA0XG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5zZWxlY3Rpb25SZWN0YW5nbGVDb2xvclxuICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHJlY3RXUGl4XG4gICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcblxuICAgICAgICAgICAgY3R4LnJlY3QoXG4gICAgICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuZ2VvVG9QaXhYKGZvY3VzLmNlbGwueCkgLSByZWN0V1BpeCAvIDIsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuZ2VvVG9QaXhZKGZvY3VzLmNlbGwueSkgKyByZWN0V1BpeCAvIDIsXG4gICAgICAgICAgICAgICAgZm9jdXMucmVzb2x1dGlvbiAvIHRoaXMuZ2VvQ2FudmFzLnZpZXcueiArIHJlY3RXUGl4LFxuICAgICAgICAgICAgICAgIC1mb2N1cy5yZXNvbHV0aW9uIC8gdGhpcy5nZW9DYW52YXMudmlldy56IC0gcmVjdFdQaXhcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuY3R4LmRyYXdJbWFnZSh0aGlzLmdlb0NhbnZhcy5vZmZzY3JlZW5DYW52YXMsIDAsIDApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpXG4gICAgICAgICAgICBpZiAodGhpcy5jYW52YXNTYXZlKSB0aGlzLmdlb0NhbnZhcy5jdHguZHJhd0ltYWdlKHRoaXMuY2FudmFzU2F2ZSwgMCwgMClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgY2VsbCBIVE1MIGluZm8gYXQgYSBnaXZlbiBnZW8gcG9zaXRpb24uXG4gICAgICogVGhpcyBpcyB1c2VmdWxsIGZvciB1c2VyIGludGVyYWN0aW9ucywgdG8gc2hvdyB0aGlzIGluZm8gd2hlcmUgdGhlIHVzZXIgY2xpY2tzIGZvciBleGFtcGxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHt7eDpudW1iZXIseTpudW1iZXJ9fSBwb3NHZW9cbiAgICAgKiBAcmV0dXJucyB7e2NlbGw6aW1wb3J0KCcuL0RhdGFzZXQuanMnKS5DZWxsLGh0bWw6c3RyaW5nLHJlc29sdXRpb246bnVtYmVyfSB8IHVuZGVmaW5lZH1cbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgZ2V0Q2VsbEZvY3VzSW5mbyhwb3NHZW8pIHtcbiAgICAgICAgLy9nbyB0aHJvdWdoIHRoZSBsYXllcnMsIHN0YXJ0aW5nIGZyb20gdG9wXG4gICAgICAgIGNvbnN0IHogPSB0aGlzLmdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMubGF5ZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vTGF5ZXIuanNcIikuTGF5ZXJ9ICovXG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMubGF5ZXJzW2ldXG4gICAgICAgICAgICBpZiAobGF5ZXIudmlzaWJsZSAmJiAhbGF5ZXIudmlzaWJsZSh6KSkgY29udGludWVcbiAgICAgICAgICAgIGlmIChsYXllci5jZWxsSW5mb0hUTUwgPT09ICdub25lJykgY29udGludWUgLy8gdGhpcyBpcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gbm90IHNob3cgdG9vbHRpcHMgZm9yIGxheWVycyAnb24gdG9wJyAoZS5nLiBwb3B1bGF0aW9uIGNpcmNsZXMgb24gdG9wIG9mIHNxdWFyZXMpXG4gICAgICAgICAgICBpZiAoIWxheWVyLmNlbGxJbmZvSFRNTCkgY29udGludWVcbiAgICAgICAgICAgIGlmICghbGF5ZXIuZ2V0RGF0YXNldCkgY29udGludWVcbiAgICAgICAgICAgIGNvbnN0IGRzYyA9IGxheWVyLmdldERhdGFzZXQoeilcbiAgICAgICAgICAgIGlmICghZHNjKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2dldCBjZWxsIGF0IG1vdXNlIHBvc2l0aW9uXG4gICAgICAgICAgICAvKiogQHR5cGUge2ltcG9ydCgnLi9EYXRhc2V0LmpzJykuQ2VsbHx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBjZWxsID0gZHNjLmdldENlbGxGcm9tUG9zaXRpb24ocG9zR2VvLCBkc2MuZ2V0Vmlld0NhY2hlKCkpXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKGNlbGwsIGRzYy5yZXNvbHV0aW9uKVxuICAgICAgICAgICAgaWYgKCFjZWxsKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICAgICAgICAgIC8vcmFyZSBjYXNlIGZvciBhIGRhdGFzZXQgd2l0aCBtaXhlZCByZXNvbHV0aW9uc1xuICAgICAgICAgICAgaWYgKGRzYy5taXhlZFJlc29sdXRpb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCByID0gK2RzYy5taXhlZFJlc29sdXRpb24oY2VsbClcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gbGF5ZXIuY2VsbEluZm9IVE1MKGNlbGwsIHIpXG4gICAgICAgICAgICAgICAgaWYgKCFodG1sKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgY2VsbDogY2VsbCwgaHRtbDogaHRtbCwgcmVzb2x1dGlvbjogciB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBsYXllci5jZWxsSW5mb0hUTUwoY2VsbCwgZHNjLmdldFJlc29sdXRpb24oKSlcbiAgICAgICAgICAgIGlmICghaHRtbCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgICAgcmV0dXJuIHsgY2VsbDogY2VsbCwgaHRtbDogaHRtbCwgcmVzb2x1dGlvbjogZHNjLmdldFJlc29sdXRpb24oKSB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gICAgICogQHBhcmFtIHtudW1iZXJ8dW5kZWZpbmVkfSB6XG4gICAgICovXG4gICAgc2V0Vmlldyh4LCB5LCB6ID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLnZpZXcueCA9IHhcbiAgICAgICAgdGhpcy5nZW9DYW52YXMudmlldy55ID0geVxuICAgICAgICBpZiAoeiAhPSB1bmRlZmluZWQpIHRoaXMuZ2VvQ2FudmFzLnZpZXcueiA9IHpcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge2ltcG9ydCgnLi9HZW9DYW52YXMuanMnKS5WaWV3fSAqL1xuICAgIGdldFZpZXcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb0NhbnZhcy52aWV3XG4gICAgfVxuXG4gICAgLyoqIEByZXR1cm5zIHtudW1iZXJ9ICovXG4gICAgZ2V0Wm9vbSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VvQ2FudmFzLnZpZXcuelxuICAgIH1cbiAgICAvKiogQHBhcmFtIHtudW1iZXJ9IHogQHJldHVybnMge3RoaXN9ICovXG4gICAgc2V0Wm9vbSh6KSB7XG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLnZpZXcueiA9IHpcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge0FycmF5LjxudW1iZXJ8dW5kZWZpbmVkPn0gKi9cbiAgICBnZXRDZW50ZXJFeHRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb0NhbnZhcy5nZXRDZW50ZXJFeHRlbnQoKVxuICAgIH1cbiAgICAvKiogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gdmFsIEByZXR1cm5zIHt0aGlzfSAqL1xuICAgIHNldENlbnRlckV4dGVudCh2YWwpIHtcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuc2V0Q2VudGVyRXh0ZW50KHZhbClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge0FycmF5LjxudW1iZXI+fSAqL1xuICAgIGdldFpvb21FeHRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb0NhbnZhcy5nZXRab29tRXh0ZW50KClcbiAgICB9XG4gICAgLyoqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHZhbCBAcmV0dXJucyB7dGhpc30gKi9cbiAgICBzZXRab29tRXh0ZW50KHZhbCkge1xuICAgICAgICB0aGlzLmdlb0NhbnZhcy5zZXRab29tRXh0ZW50KHZhbClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgICBnZXRCYWNrZ3JvdW5kQ29sb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb0NhbnZhcy5iYWNrZ3JvdW5kQ29sb3JcbiAgICB9XG4gICAgLyoqIEBwYXJhbSB7c3RyaW5nfSB2YWwgQHJldHVybnMge3RoaXN9ICovXG4gICAgc2V0QmFja2dyb3VuZENvbG9yKHZhbCkge1xuICAgICAgICB0aGlzLmdlb0NhbnZhcy5iYWNrZ3JvdW5kQ29sb3IgPSB2YWxcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgc2V0IG9mIHpvb20gYnV0dG9ucyB0byB0aGUgbWFwXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIGFkZFpvb21CdXR0b25zKG9wdHMpIHtcbiAgICAgICAgLy8gKiBvcHRzLmlkXG4gICAgICAgIC8vICogb3B0cy5vblpvb20gLSBjdXN0b20gZXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICAvLyAqIG9wdHMueFxuICAgICAgICAvLyAqIG9wdHMueVxuICAgICAgICAvLyAqIG9wdHMuZGVsdGEgLSB6b29tIGRlbHRhIGFwcGxpZWQgb24gZWFjaCBjbGlja1xuXG4gICAgICAgIHRoaXMuem9vbUJ1dHRvbnMgPSBuZXcgWm9vbUJ1dHRvbnMoe1xuICAgICAgICAgICAgbWFwOiB0aGlzLFxuICAgICAgICAgICAgaWQ6IG9wdHM/LmlkIHx8ICdncmlkdml6LXpvb20tYnV0dG9ucy0nICsgdGhpcy5jb250YWluZXIuaWQsXG4gICAgICAgICAgICBjbGFzczogb3B0cz8uY2xhc3MsXG4gICAgICAgICAgICB4OiBvcHRzPy54LFxuICAgICAgICAgICAgeTogb3B0cz8ueSxcbiAgICAgICAgICAgIG9uWm9vbTogb3B0cz8ub25ab29tLFxuICAgICAgICAgICAgZGVsdGE6IG9wdHM/LmRlbHRhIHx8IDAuMixcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBmdWxsc2NyZWVuIHRvZ2dsZSBidXR0b24gdG8gdGhlIGFwcFxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICAgKi9cbiAgICBhZGRGdWxsc2NyZWVuQnV0dG9uKG9wdHMpIHtcbiAgICAgICAgLy8gKiBvcHRzLm1hcCAtIHRoZSBncmlkdml6IG1hcFxuICAgICAgICAvLyAqIG9wdHMuaWRcbiAgICAgICAgLy8gKiBvcHRzLnhcbiAgICAgICAgLy8gKiBvcHRzLnlcblxuICAgICAgICB0aGlzLmZ1bGxzY3JlZW5CdXR0b24gPSBuZXcgRnVsbHNjcmVlbkJ1dHRvbih7XG4gICAgICAgICAgICBtYXA6IHRoaXMsXG4gICAgICAgICAgICBpZDogb3B0cz8uaWQgfHwgJ2dyaWR2aXotZnVsbHNjcmVlbi1idXR0b24nLFxuICAgICAgICAgICAgY2xhc3M6IG9wdHM/LmNsYXNzLFxuICAgICAgICAgICAgeDogb3B0cz8ueCxcbiAgICAgICAgICAgIHk6IG9wdHM/LnksXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge3RoaXN9ICovXG4gICAgc2V0Vmlld0Zyb21VUkwoKSB7XG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLnNldFZpZXdGcm9tVVJMKClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQWRkIGEgcmVzaXplIGV2ZW50IG9ic2VydmVyIHRvIHRoZSBBcHBzIGNvbnRhaW5lciBhbmQgdXBkYXRlIHRoZSBjYW52YXMgYWNjb3JkaW5nbHlcbiAgICAgKiBAbWVtYmVyb2YgQXBwXG4gICAgICovXG4gICAgZGVmaW5lUmVzaXplT2JzZXJ2ZXIoKSB7XG4gICAgICAgIC8vIFRyYWNrIHdoZXRoZXIgdGhlIG9ic2VydmVyIGlzIGN1cnJlbnRseSBwcm9jZXNzaW5nIGEgcmVzaXplIGV2ZW50XG4gICAgICAgIGxldCByZXNpemVQZW5kaW5nID0gZmFsc2VcblxuICAgICAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGVudHJpZXMpIHx8ICFlbnRyaWVzLmxlbmd0aCkgcmV0dXJuXG5cbiAgICAgICAgICAgIGxldCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lclxuXG4gICAgICAgICAgICAvLyBFbnN1cmUgdGhlIGNvbnRhaW5lciBoYXMgdmFsaWQgZGltZW5zaW9uc1xuICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5jbGllbnRXaWR0aCA+IDAgJiYgY29udGFpbmVyLmNsaWVudEhlaWdodCA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc2l6ZVBlbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzaXplUGVuZGluZyA9IHRydWUgLy8gUHJldmVudCBvdmVybGFwcGluZyByZXNpemUgdHJpZ2dlcnNcblxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZVBlbmRpbmcgPSBmYWxzZSAvLyBSZXNldCB0aGUgZmxhZyBhZnRlciBwcm9jZXNzaW5nXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBzaXplIGNoYW5nZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmggIT09IGNvbnRhaW5lci5jbGllbnRIZWlnaHQgfHwgdGhpcy53ICE9PSBjb250YWluZXIuY2xpZW50V2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmggPSBjb250YWluZXIuY2xpZW50SGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53ID0gY29udGFpbmVyLmNsaWVudFdpZHRoXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZ2VvQ2FudmFzIHNpemVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuaCA9IHRoaXMuaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLncgPSB0aGlzLndcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5jYW52YXMuc2V0QXR0cmlidXRlKCd3aWR0aCcsIFN0cmluZyh0aGlzLncpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIFN0cmluZyh0aGlzLmgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLm9mZnNjcmVlbkNhbnZhcy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgU3RyaW5nKHRoaXMudykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMub2Zmc2NyZWVuQ2FudmFzLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgU3RyaW5nKHRoaXMuaCkpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZHJhdygpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPcHRpb25hbGx5IHJlcG9zaXRpb24gVUkgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAodGhpcy56b29tQnV0dG9ucykgdGhpcy56b29tQnV0dG9ucy5ub2RlLnN0eWxlLmxlZnQgPSB0aGlzLncgLSA1MCArICdweCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHRoaXMuZnVsbHNjcmVlbkJ1dHRvbikgdGhpcy5mdWxsc2NyZWVuQnV0dG9uLm5vZGUuc3R5bGUubGVmdCA9IHRoaXMudyAtIDUwICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmNvbnRhaW5lcilcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gRGVzdHJveSB0aGUgbWFwIGFuZCBpdCdzIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqIFRoaXMgc2hvdWxkIHNpZ25pZmljYW50bHkgcmVkdWNlIHRoZSBtZW1vcnkgdXNlZCB3aGVuIGNyZWF0aW5nIGFuZCBkZXN0cm95aW5nIGdyaWR2aXogbWFwIGluc3RhbmNlcyAoZm9yIGV4YW1wbGUgaW4gbGVhZmxldC1ncmlkdml6KVxuICAgICAqIEBtZW1iZXJvZiBBcHBcbiAgICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgICAvLyBjbGVhciBsYXllcnNcbiAgICAgICAgdGhpcy5sYXllcnMgPSBbXVxuICAgICAgICB0aGlzLmJnTGF5ZXJzID0gW11cblxuICAgICAgICAvLyByZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gY29udGFpbmVyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIHRoaXMubW91c2VPdmVySGFuZGxlcilcbiAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5tb3VzZU1vdmVIYW5kbGVyKVxuICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIHRoaXMubW91c2VPdXRIYW5kbGVyKVxuXG4gICAgICAgIC8vIHJlbW92ZSBjYW52YXNcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuY2FudmFzLnJlbW92ZSgpXG5cbiAgICAgICAgLy8gcmVtb3ZlIGxlZ2VuZFxuICAgICAgICB0aGlzLmxlZ2VuZD8ucmVtb3ZlKClcblxuICAgICAgICAvLyByZW1vdmUgdG9vbHRpcFxuICAgICAgICB0aGlzLnRvb2x0aXAudG9vbHRpcD8ucmVtb3ZlKClcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogQSBtdWx0aSByZXNvbHV0aW9uIGRhdGFzZXQgb2YgZ3JpZCBjZWxscy5cbiAqIEl0IGNvbnNpc3RzIG9mIGRpZmZlcmVudCB7QGxpbmsgRGF0YXNldH1zIGZvciBlYWNoIHJlc29sdXRpb24uXG4gKlxuICogQGFic3RyYWN0XG4gKlxuICogQG1vZHVsZSBjb3JlXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBNdWx0aVJlc29sdXRpb25EYXRhc2V0IHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSByZXNvbHV0aW9ucyBUaGUgcmVzb2x1dGlvbnMgb2YgdGhlIGRhdGFzZXRzLCBpbiBDUlMgZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkRhdGFzZXQ+fGZ1bmN0aW9uKG51bWJlcik6aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkRhdGFzZXR9IGRhdGFzZXRzIFRoZSBkYXRhc2V0cyBsaXN0LCBvbmUgcGVyIHJlc29sdXRpb24uIE9yIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgZGF0YXNldCBmcm9tIGEgcmVzb2x1dGlvbiB2YWx1ZS5cbiAgICAgKiBAcGFyYW0geyB7cHJlcHJvY2Vzcz86ZnVuY3Rpb24oaW1wb3J0KFwiLi9EYXRhc2V0XCIpLkNlbGwpOmJvb2xlYW59IH0gb3B0cyBPcHRpb25zLiBwcmVwcm9jZXNzOiBBIGZ1bmN0aW9uIHRvIGFwcGx5IG9uIGVhY2ggZGF0YXNldCBjZWxsIHRvIHByZXBhcmUgaXRzIHZhbHVlcy4gQ2FuIGJlIHVzZWQgYWxzbyB0byBzZWxlY3QgY2VsbHMgdG8ga2VlcC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihyZXNvbHV0aW9ucywgZGF0YXNldHMsIG9wdHMgPSB7fSkge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBUaGUgcmVzb2x1dGlvbnMgb2YgdGhlIGRhdGFzZXRzLCBpbiBDUlMgZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cbiAgICAgICAgdGhpcy5yZXNvbHV0aW9ucyA9IHJlc29sdXRpb25zXG5cbiAgICAgICAgLyoqIFRoZSBkYXRhc2V0cy4gSWYgdGhlIGxpc3QgaXMgbm90IGV4cGxpY3RlbHkgZGVmaW5lZCwgYnVpbGQgaXQgZnJvbSB0aGUgcmVzb2x1dGlvbiBsaXN0IHdpdGggdGhlIGZ1bmN0aW9uXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkRhdGFzZXQ+fSAqL1xuICAgICAgICB0aGlzLmRhdGFzZXRzID0gdHlwZW9mIGRhdGFzZXRzID09PSAnZnVuY3Rpb24nID8gdGhpcy5yZXNvbHV0aW9ucy5tYXAoZGF0YXNldHMpIDogZGF0YXNldHNcblxuICAgICAgICAvL3RoZXJlIG11c3QgYmUgYXMgbWFueSBkYXRhc2V0cyBhcyByZXNvbHV0aW9uc1xuICAgICAgICBpZiAodGhpcy5kYXRhc2V0cy5sZW5ndGggPiAxICYmIHRoaXMuZGF0YXNldHMubGVuZ3RoICE9IHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICdVbmNvbXBhdGlibGUgbnVtYmVyIG9mIGRhdGFzZXRzIGFuZCByZXNvbHV0aW9uczogJyArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNldHMubGVuZ3RoICtcbiAgICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvbHV0aW9ucy5sZW5ndGhcbiAgICAgICAgICAgIClcblxuICAgICAgICAvL3NldCBkYXRhc2V0IHByZXByb2Nlc3NlcyBpZiBzcGVjaWZpZWRcbiAgICAgICAgaWYgKG9wdHMucHJlcHJvY2VzcykgdGhpcy5zZXRQcmVwb2Nlc3NlcyhvcHRzLnByZXByb2Nlc3MpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSByZWxldmFudCBkYXRhc2V0IGZvciBhIHNwZWNpZmllZCB6b29tLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pblBpeGVsc1BlckNlbGxcbiAgICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkRhdGFzZXR8dW5kZWZpbmVkfVxuICAgICAqICovXG4gICAgZ2V0RGF0YXNldCh6LCBtaW5QaXhlbHNQZXJDZWxsKSB7XG4gICAgICAgIC8vc3BlY2lhbCBjYXNlIHdoaXRoIHNpbmdsZSBkYXRhc2V0XG4gICAgICAgIGlmICh0aGlzLmRhdGFzZXRzLmxlbmd0aCA9PSAxKSByZXR1cm4gdGhpcy5kYXRhc2V0c1swXVxuXG4gICAgICAgIGNvbnN0IHJzID0gdGhpcy5yZXNvbHV0aW9uc1xuICAgICAgICBsZXQgaSA9IDBcbiAgICAgICAgbGV0IHpfID0gcnNbaV0gLyBtaW5QaXhlbHNQZXJDZWxsXG4gICAgICAgIHdoaWxlICh6XyA8IHogJiYgaSA8IHJzLmxlbmd0aCkge1xuICAgICAgICAgICAgaSsrXG4gICAgICAgICAgICB6XyA9IHJzW2ldIC8gbWluUGl4ZWxzUGVyQ2VsbFxuICAgICAgICB9XG4gICAgICAgIC8vaWYgKGkgPT0gMCkgcmV0dXJuIHRoaXMuZGF0YXNldC5kYXRhc2V0c1swXTtcbiAgICAgICAgLy9yZXR1cm4gdGhpcy5kYXRhc2V0LmRhdGFzZXRzW2kgLSAxXTtcbiAgICAgICAgaWYgKGkgPT0gcnMubGVuZ3RoKSByZXR1cm4gdGhpcy5kYXRhc2V0c1tycy5sZW5ndGggLSAxXVxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhc2V0c1tpXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBhIHByZXByb2Nlc3MgZnVuY3Rpb24gZm9yIGFsbCBkYXRhc2V0cy5cbiAgICAgKiBUaGlzIGlzIGEgZnVuY3Rpb24gYXBwbGllZCBvbiBlYWNoIGNlbGwgYWZ0ZXIgaXQgaGFzIGJlZW4gbG9hZGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihpbXBvcnQoXCIuL0RhdGFzZXRcIikuQ2VsbCk6Ym9vbGVhbn0gcHJlcHJvY2Vzc1xuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIHNldFByZXBvY2Vzc2VzKHByZXByb2Nlc3MpIHtcbiAgICAgICAgZm9yIChsZXQgZHMgb2YgdGhpcy5kYXRhc2V0cykgZHMucHJlcHJvY2VzcyA9IHByZXByb2Nlc3NcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGZ1bmN0aW9uIHRvIGVhc2UgdGhlIGNyZWF0aW9uIG9mIG11bHRpIHJlc29sdXRpb24gZGF0YXNldHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSByZXNvbHV0aW9ucyBUaGUgcmVzb2x1dGlvbnMgb2YgdGhlIGRhdGFzZXRzLCBpbiBDUlMgZ2VvZ3JhcGhpY2FsIHVuaXRcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkRhdGFzZXR9IHJlc1RvRGF0YXNldCBGdW5jdGlvbiByZXR1cm5pbmcgYSBkYXRhc2V0IGZyb20gYSByZXNvbHV0aW9uXG4gICAgICogQHBhcmFtIHsge3ByZXByb2Nlc3M/OmZ1bmN0aW9uKGltcG9ydChcIi4vRGF0YXNldFwiKS5DZWxsKTpib29sZWFufSB9IG9wdHMgT3B0aW9ucy4gcHJlcHJvY2VzczogQSBmdW5jdGlvbiB0byBhcHBseSBvbiBlYWNoIGRhdGFzZXQgY2VsbCB0byBwcmVwYXJlIGl0cyB2YWx1ZXNcbiAgICAgKiBAcmV0dXJucyB7TXVsdGlSZXNvbHV0aW9uRGF0YXNldH1cbiAgICAgKi9cbiAgICAvKnN0YXRpYyBtYWtlKHJlc29sdXRpb25zLCByZXNUb0RhdGFzZXQsIG9wdHMpIHtcbiAgICAgICAgLy9tYWtlIGRhdGFzZXRzXG4gICAgICAgIGNvbnN0IGRzYyA9IFtdXG4gICAgICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc29sdXRpb25zKSBkc2MucHVzaChyZXNUb0RhdGFzZXQocmVzKSlcbiAgICAgICAgLy9tYWtlIG11bHRpIHJlc29sdXRpb24gZGF0YXNldFxuICAgICAgICByZXR1cm4gbmV3IE11bHRpUmVzb2x1dGlvbkRhdGFzZXQoZHNjLCByZXNvbHV0aW9ucywgb3B0cylcbiAgICB9Ki9cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgRHJhd2FibGUgfSBmcm9tICcuL0RyYXdhYmxlLmpzJ1xuXG4vKiogQHR5cGVkZWYge1wic3F1YXJlXCJ8XCJjaXJjbGVcInxcImRpYW1vbmRcInxcImRvbnV0XCJ8XCJ0cmlhbmdsZV91cFwifFwidHJpYW5nbGVfZG93blwifFwidHJpYW5nbGVfbGVmdFwifFwidHJpYW5nbGVfcmlnaHRcInxcIm5vbmVcIn0gU2hhcGUgKi9cblxuLyoqXG4gKiB2aWV3U2NhbGUgdHlwZVxuICogUmV0dXJucyBhbiBvYmplY3QgZnJvbSBhIGxpc3Qgb2YgY2VsbHMsXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oQXJyYXkuPGltcG9ydCgnLi9EYXRhc2V0LmpzJykuQ2VsbD4sbnVtYmVyLCBudW1iZXIpOip9IFZpZXdTY2FsZSAqL1xuXG4vKipcbiAqIEEgc3R5bGUsIHRvIHNob3cgYSBncmlkIGRhdGFzZXQuXG4gKlxuICogQG1vZHVsZSBjb3JlXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHlsZSBleHRlbmRzIERyYXdhYmxlIHtcbiAgICAvKipcbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKiBAcGFyYW0ge3tmaWx0ZXI/OmZ1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6Ym9vbGVhbiwgb2Zmc2V0PzpmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsIG51bWJlciwgbnVtYmVyKTp7ZHg6bnVtYmVyLGR5Om51bWJlcn0sIHZpc2libGU/OmZ1bmN0aW9uKG51bWJlcik6Ym9vbGVhbixhbHBoYT86ZnVuY3Rpb24obnVtYmVyKTpudW1iZXIsYmxlbmRPcGVyYXRpb24/OmZ1bmN0aW9uKG51bWJlcik6R2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uLGRyYXdGdW4/OmZ1bmN0aW9uLHZpZXdTY2FsZT86Vmlld1NjYWxlfX0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge1ZpZXdTY2FsZXx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMudmlld1NjYWxlID0gb3B0cy52aWV3U2NhbGVcblxuICAgICAgICAvKiogQSBmaWx0ZXIgZnVuY3Rpb24gdG8gYXBwbHkgdG8gdGhlIGNlbGwgbGlzdCwgdG8gZmlsdGVyIG91dCBzb21lIGNlbGxzIG5vdCB0byBiZSBkcmF3biAoc3VjaCBhcyBmb3IgZXhhbXBsZSB0aGUgY2VsbHMgd2l0aCB2YWx1ZT0wKS5cbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKiBAdHlwZSB7KGZ1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6Ym9vbGVhbikgfCB1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMuZmlsdGVyID0gb3B0cy5maWx0ZXIgfHwgdW5kZWZpbmVkXG5cbiAgICAgICAgLyoqIEFuIG9mZnNldC4gVGhpcyBpcyB0byBhbHRlciB0aGUgcG9zaXRpb24gb2YgYWxsIHN5bWJvbHMgaW4gYSBnaXZlbiBkaXJlY3Rpb24uIEluIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsbnVtYmVyLG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9fSAqL1xuICAgICAgICB0aGlzLm9mZnNldCA9IG9wdHMub2Zmc2V0IHx8ICgoYywgciwgeikgPT4gKHsgZHg6IDAsIGR5OiAwIH0pKVxuXG4gICAgICAgIC8qKiBBIGRyYXcgZnVuY3Rpb24gZm9yIHRoZSBzdHlsZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9ufHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy5kcmF3RnVuID0gb3B0cy5kcmF3RnVuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwdWJsaWNcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuL0xlZ2VuZFwiKS5MZWdlbmQ+fSAqL1xuICAgICAgICB0aGlzLmxlZ2VuZHMgPSBbXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGw+fSBjZWxscyBUaGUgY2VsbHMgdG8gZHJhdy5cbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGVtLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZWlyIHJlc29sdXRpb24gKGluIGdlb2dyYXBoaWMgdW5pdClcbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcbiAgICAgICAgaWYgKHRoaXMuZHJhd0Z1bikgdGhpcy5kcmF3RnVuKGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pXG4gICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgZHJhdyBub3QgaW1wbGVtZW50ZWQuJylcbiAgICB9XG5cbiAgICAvL2dldHRlcnMgYW5kIHNldHRlcnNcblxuICAgIC8qKiBAcmV0dXJucyB7ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsLG51bWJlcixudW1iZXIpOntkeDpudW1iZXIsZHk6bnVtYmVyfX0gKi9cbiAgICBnZXRPZmZzZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9mZnNldFxuICAgIH1cbiAgICAvKiogQHBhcmFtIHtmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsbnVtYmVyLG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9fSB2YWwgQHJldHVybnMge3RoaXN9ICovXG4gICAgc2V0T2Zmc2V0KHZhbCkge1xuICAgICAgICB0aGlzLm9mZnNldCA9IHZhbFxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKiBVcGRhdGUgbGVnZW5kcyBvZiB0aGUgc3R5bGUsIGlmIGFueVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICogQHJldHVybnMge3RoaXN9ICovXG4gICAgdXBkYXRlTGVnZW5kcyhvcHRzKSB7XG4gICAgICAgIFN0eWxlLnVwZGF0ZUxlZ2VuZHNSZWN1cnNpdmUodGhpcy5sZWdlbmRzLCBvcHRzKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIHN0YXRpYyB1cGRhdGVMZWdlbmRzUmVjdXJzaXZlKGxnLCBvcHRzKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxnKSkgZm9yIChjb25zdCBsZ18gb2YgbGcpIHRoaXMudXBkYXRlTGVnZW5kc1JlY3Vyc2l2ZShsZ18sIG9wdHMpXG4gICAgICAgIGVsc2UgbGcudXBkYXRlKG9wdHMpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi9MZWdlbmRcIikuTGVnZW5kPn0gbGVnZW5kc1xuICAgICAqIEByZXR1cm5zIHt0aGlzfSAqL1xuICAgIGFkZExlZ2VuZHMobGVnZW5kcykge1xuICAgICAgICBmb3IgKGxldCBsZWdlbmQgb2YgbGVnZW5kcykgdGhpcy5sZWdlbmRzLnB1c2gobGVnZW5kKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJ1xuLy9pbXBvcnQgeyB0cmFuc2l0aW9uIH0gZnJvbSBcImQzLXRyYW5zaXRpb25cIjtcblxuLyoqXG4gKiBBIGdlbmVyaWMgY2xhc3MgdG8gbWFrZSBhIHRvb2x0aXAuXG4gKiBJdCBpcyBhIGRpdiBlbGVtZW50LCB3aGljaCBjYW4gYmUgbW92ZWQgdW5kZXIgdGhlIG1vdXNlIHBvaW50ZXIgYW5kIGZpbGxlZCB3aXRoIHNvbWUgaW5mb3JtYXRpb24gaW4gaHRtbC5cbiAqIEBtb2R1bGUgY29yZVxuICovXG5leHBvcnQgY2xhc3MgVG9vbHRpcCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMubWF4V2lkdGggPSBvcHRzLm1heFdpZHRoIHx8ICcyMGVtJ1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5mb250U2l6ZSA9IG9wdHMuZm9udFNpemUgfHwgJzEuMmVtJ1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kID0gb3B0cy5iYWNrZ3JvdW5kIHx8ICd3aGl0ZSdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMucGFkZGluZyA9IG9wdHMucGFkZGluZyB8fCAnNXB4J1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5ib3JkZXIgPSBvcHRzLmJvcmRlciB8fCAnMHB4J1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpc1snYm9yZGVyLXJhZGl1cyddID0gb3B0c1snYm9yZGVyLXJhZGl1cyddIHx8ICcwcHgnXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzWydib3gtc2hhZG93J10gPSBvcHRzWydib3gtc2hhZG93J10gfHwgJzVweCA1cHggNXB4IGdyZXknXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzWydmb250LWZhbWlseSddID0gb3B0c1snZm9udC1mYW1pbHknXSB8fCAnSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZidcblxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy50cmFuc2l0aW9uRHVyYXRpb24gPSBvcHRzLnRyYW5zaXRpb25EdXJhdGlvbiB8fCAxMDBcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMueE9mZnNldCA9IG9wdHMueE9mZnNldCB8fCAzMFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy55T2Zmc2V0ID0gb3B0cy55T2Zmc2V0IHx8IDIwXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAvLyBlLmcuIHRvIHByZXZlbnQgbW91c2UgY3Vyc29yIGNvdmVyaW5nIGNlbGwgYmVpbmcgaGlnaGxpZ2h0ZWRcbiAgICAgICAgdGhpcy55TW91c2VPZmZzZXQgPSBvcHRzLnlNb3VzZU9mZnNldCB8fCAwXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnhNb3VzZU9mZnNldCA9IG9wdHMueE1vdXNlT2Zmc2V0IHx8IDBcbiAgICAgICAgLyoqIEB0eXBlIHtIVE1MRWxlbWVudH0gKi9cbiAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50ID0gb3B0cy5wYXJlbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHlcbiAgICAgICAgLyoqIEB0eXBlIHtIVE1MRWxlbWVudH0gKi9cbiAgICAgICAgdGhpcy50b29sdGlwRWxlbWVudCA9IG9wdHMudG9vbHRpcEVsZW1lbnQgfHwgbnVsbFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHVibGljXG4gICAgICAgICAqIEB0eXBlIHtpbXBvcnQoXCJkMy1zZWxlY3Rpb25cIikuU2VsZWN0aW9ufSAqL1xuICAgICAgICB0aGlzLnRvb2x0aXAgPSBvcHRzLnRvb2x0aXBFbGVtZW50XG4gICAgICAgICAgICA/IHNlbGVjdChvcHRzLnRvb2x0aXBFbGVtZW50KSAvLyBXcmFwIHRoZSBwcm92aWRlZCBIVE1MIG5vZGUgaW4gYSBEMyBzZWxlY3Rpb25cbiAgICAgICAgICAgIDogc2VsZWN0KHRoaXMucGFyZW50RWxlbWVudCkuYXBwZW5kKCdkaXYnKS5hdHRyKCdpZCcsICdncmlkdml6LXRvb2x0aXAnKS5hdHRyKCdjbGFzcycsICdncmlkdml6LXRvb2x0aXAnKSAvLyBjcmVhdGUgZGVmYXVsdCBlbGVtZW50XG5cbiAgICAgICAgLy9pbml0aWFsaXNlXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnbWF4LXdpZHRoJywgdGhpcy5tYXhXaWR0aClcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdvdmVyZmxvdycsICdoaWRkZW4nKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMuZm9udFNpemUpXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnYmFja2dyb3VuZCcsIHRoaXMuYmFja2dyb3VuZClcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdwYWRkaW5nJywgdGhpcy5wYWRkaW5nKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2JvcmRlcicsIHRoaXMuYm9yZGVyKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2JvcmRlci1yYWRpdXMnLCB0aGlzWydib3JkZXItcmFkaXVzJ10pXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnYm94LXNoYWRvdycsIHRoaXNbJ2JveC1zaGFkb3cnXSlcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdmb250LWZhbWlseScsIHRoaXNbJ2ZvbnQtZmFtaWx5J10pXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ29wYWNpdHknLCAnMCcpXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgndGV4dC13cmFwJywgJ25vd3JhcCcpXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnei1pbmRleCcsIDk5OTk5OTk5KSAvLyBpbXBvcnRhbnQgZm9yIGxlYWZsZXQtZ3JpZHZpeiBldGNcblxuICAgICAgICAvLyB0aGVzZSBwbGFjZWhvbGRlcnMgYXJlIG5lZWRlZCB0byBwcmV2ZW50IGFuIGluZmluaXRlIERPTSByZXNpemVPYnNlcnZlciBsb29wOlxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2xlZnQnLCAnMCcpXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgndG9wJywgJzAnKVxuXG4gICAgICAgIC8vIGFyaWEtbGFiZWxzICh0aGFua3MgdG8gd2FobGF0bGFzKVxuICAgICAgICB0aGlzLnRvb2x0aXAuYXR0cigncm9sZScsICd0b29sdGlwJykuYXR0cignYXJpYS1saXZlJywgJ3BvbGl0ZScpXG4gICAgfVxuXG4gICAgLyoqIFNob3cgdGhlIHRvb2x0aXAgKi9cbiAgICBzaG93KCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMudG9vbHRpcC50cmFuc2l0aW9uKCkuZHVyYXRpb24odGhpcy50cmFuc2l0aW9uRHVyYXRpb24pLnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICB9XG5cbiAgICAvKiogSGlkZSB0aGUgdG9vbHRpcCAqL1xuICAgIGhpZGUoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy50b29sdGlwLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0aGlzLnRyYW5zaXRpb25EdXJhdGlvbikuc3R5bGUoJ29wYWNpdHknLCAwKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY29udGVudCBvZiB0aGUgdG9vbHRpcC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHRtbFxuICAgICAqL1xuICAgIGh0bWwoaHRtbCkge1xuICAgICAgICB0aGlzLnRvb2x0aXAuaHRtbChodG1sKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgcG9zaXRpb24gb2YgdGhlIHRvb2x0aXAgYXQgdGhlIG1vdXNlIGV2ZW50IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnRcbiAgICAgKi9cbiAgICBzZXRQb3NpdGlvbihldmVudCkge1xuICAgICAgICAvLyBHZXQgdGhlIGJvdW5kaW5nIHJlY3Qgb2YgdGhlIHBhcmVudCBjb250YWluZXIgKG1hcDIpXG4gICAgICAgIGxldCBwYXJlbnRSZWN0ID0gdGhpcy5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG5cbiAgICAgICAgLy8gR2V0IHRoZSBtb3VzZSBwb3NpdGlvbiAocmVsYXRpdmUgdG8gdGhlIHBhcmVudCBjb250YWluZXIpXG4gICAgICAgIGxldCB4ID0gZXZlbnQuY2xpZW50WCAtIHBhcmVudFJlY3QubGVmdCArIHRoaXMueE9mZnNldCAvLyBSZWxhdGl2ZSB0byBwYXJlbnRcbiAgICAgICAgbGV0IHkgPSBldmVudC5jbGllbnRZIC0gcGFyZW50UmVjdC50b3AgLSB0aGlzLnlPZmZzZXQgLy8gUmVsYXRpdmUgdG8gcGFyZW50XG5cbiAgICAgICAgLy8gTm93LCBhcHBseSB0aGUgcG9zaXRpb24gdG8gdGhlIHRvb2x0aXBcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdsZWZ0JywgeCArICdweCcpLnN0eWxlKCd0b3AnLCB5ICsgJ3B4JylcblxuICAgICAgICAvLyBFbnN1cmUgdGhlIHRvb2x0aXAgc3RheXMgaW5zaWRlIHRoZSBwYXJlbnQgY29udGFpbmVyXG4gICAgICAgIHRoaXMuZW5zdXJlVG9vbHRpcEluc2lkZUNvbnRhaW5lcihldmVudCwgcGFyZW50UmVjdCwgdGhpcy50b29sdGlwLm5vZGUoKSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uIGVuc3VyZVRvb2x0aXBJbnNpZGVDb250YWluZXJcbiAgICAgKiBAZGVzY3JpcHRpb24gUHJldmVudHMgdGhlIHRvb2x0aXAgZnJvbSBvdmVyZmxvd2luZyBvdXQgb2YgdGhlIEFwcCBjb250YWluZXIgKGVuc3VyZXMgdGhhdCB0aGUgdG9vbHRpcCBpcyBpbnNpZGUgdGhlIGdyaWR2aXogY29udGFpbmVyKVxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnRcbiAgICAgKiBAcGFyYW0ge0RPTVJlY3R9IHBhcmVudFJlY3RcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0b29sdGlwTm9kZVxuICAgICAqL1xuICAgIGVuc3VyZVRvb2x0aXBJbnNpZGVDb250YWluZXIoZXZlbnQsIHBhcmVudFJlY3QsIHRvb2x0aXBOb2RlKSB7XG4gICAgICAgIGxldCBub2RlID0gdG9vbHRpcE5vZGVcbiAgICAgICAgbGV0IHBhcmVudFdpZHRoID0gcGFyZW50UmVjdC53aWR0aFxuICAgICAgICBsZXQgcGFyZW50SGVpZ2h0ID0gcGFyZW50UmVjdC5oZWlnaHRcblxuICAgICAgICAvLyBFbnN1cmUgdG9vbHRpcCBkb2Vzbid0IGdvIGJleW9uZCB0aGUgcmlnaHQgZWRnZVxuICAgICAgICBpZiAobm9kZS5vZmZzZXRMZWZ0ICsgbm9kZS5jbGllbnRXaWR0aCA+IHBhcmVudFdpZHRoKSB7XG4gICAgICAgICAgICBsZXQgbGVmdCA9IGV2ZW50LmNsaWVudFggLSBub2RlLmNsaWVudFdpZHRoIC0gdGhpcy54T2Zmc2V0XG4gICAgICAgICAgICBub2RlLnN0eWxlLmxlZnQgPSBsZWZ0ICsgJ3B4J1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5zdXJlIHRvb2x0aXAgZG9lc24ndCBnbyBiZXlvbmQgdGhlIGJvdHRvbSBlZGdlXG4gICAgICAgIGlmIChub2RlLm9mZnNldFRvcCArIG5vZGUuY2xpZW50SGVpZ2h0ID4gcGFyZW50SGVpZ2h0KSB7XG4gICAgICAgICAgICBub2RlLnN0eWxlLnRvcCA9IHBhcmVudEhlaWdodCAtIG5vZGUuY2xpZW50SGVpZ2h0ICsgJ3B4J1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5zdXJlIHRvb2x0aXAgZG9lc24ndCBnbyBhYm92ZSB0aGUgdG9wIGVkZ2VcbiAgICAgICAgaWYgKG5vZGUub2Zmc2V0VG9wIDwgMCkge1xuICAgICAgICAgICAgbm9kZS5zdHlsZS50b3AgPSAwICsgJ3B4J1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5zdXJlIHRvb2x0aXAgZG9lc24ndCBnbyBiZXlvbmQgdGhlIGxlZnQgZWRnZVxuICAgICAgICBpZiAobm9kZS5vZmZzZXRMZWZ0IDwgMCkge1xuICAgICAgICAgICAgbm9kZS5zdHlsZS5sZWZ0ID0gMCArICdweCdcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qXG5cdG15Lm1vdXNlb3ZlciA9IGZ1bmN0aW9uIChldmVudCwgaHRtbCkge1xuXHRcdGlmIChodG1sKSBteS5odG1sKGh0bWwpO1xuXHRcdG15LnNldFBvc2l0aW9uKGV2ZW50KTtcblx0XHRteS5zaG93KClcblx0XHQvL3RoaXMuZW5zdXJlVG9vbHRpcEluc2lkZUNvbnRhaW5lcigpO1xuXHR9O1xuXHRcblx0bXkubW91c2Vtb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0bXkuc2V0UG9zaXRpb24oZXZlbnQpO1xuXHRcdC8vdGhpcy5lbnN1cmVUb29sdGlwSW5zaWRlQ29udGFpbmVyKCk7XG5cdH07XG5cdFxuXHRteS5tb3VzZW91dCA9IGZ1bmN0aW9uICgpIHtcblx0XHRteS5oaWRlKCk7XG5cdH07Ki9cblxuICAgIHN0eWxlKGssIHYpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgcmV0dXJuIHRoaXMudG9vbHRpcC5zdHlsZShrKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoaywgdilcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBhdHRyKGssIHYpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgcmV0dXJuIHRoaXMudG9vbHRpcC5hdHRyKGspXG4gICAgICAgIHRoaXMudG9vbHRpcC5hdHRyKGssIHYpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKiogQHR5cGVkZWYge3sgZGltczogb2JqZWN0LCBjcnM6IHN0cmluZywgdGlsZVNpemVDZWxsOiBudW1iZXIsIG9yaWdpblBvaW50OiB7eDpudW1iZXIseTpudW1iZXJ9LCByZXNvbHV0aW9uR2VvOiBudW1iZXIsIHRpbGluZ0JvdW5kczppbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZSB9fSBHcmlkSW5mbyAqL1xuXG5pbXBvcnQgeyBkc3YgfSBmcm9tICdkMy1mZXRjaCdcbmltcG9ydCB7IERhdGFzZXQgfSBmcm9tICcuLi9jb3JlL0RhdGFzZXQuanMnXG5cbi8qKlxuICogQSBkYXRhc2V0IGNvbXBvc2VkIG9mIGEgc2luZ2xlIENTViBmaWxlIChub3QgdGlsZWQpLlxuICpcbiAqIEBtb2R1bGUgZGF0YXNldFxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQ1NWR3JpZCBleHRlbmRzIERhdGFzZXQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9NYXAuanNcIikuTWFwfSBtYXAgVGhlIG1hcC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgb2YgdGhlIGRhdGFzZXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb24gVGhlIGRhdGFzZXQgcmVzb2x1dGlvbiBpbiBnZW9ncmFwaGljYWwgdW5pdC5cbiAgICAgKiBAcGFyYW0ge3twcmVwcm9jZXNzPzooZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwpOmJvb2xlYW4pLGRlbGltaXRlcj86c3RyaW5nfX0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1hcCwgdXJsLCByZXNvbHV0aW9uLCBvcHRzID0ge30pIHtcbiAgICAgICAgc3VwZXIobWFwLCB1cmwsIHJlc29sdXRpb24sIG9wdHMpXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSAqL1xuICAgICAgICB0aGlzLmNlbGxzID0gW11cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5kZWxpbWl0ZXIgPSBvcHRzLmRlbGltaXRlciB8fCAnLCdcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICogQHByaXZhdGUgICovXG4gICAgICAgIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPSAnbm90TG9hZGVkJ1xuXG4gICAgICAgIC8vZ2V0IGRhdGFcbiAgICAgICAgdGhpcy5nZXREYXRhKHVuZGVmaW5lZClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0IGRhdGEgd2l0aGluIGEgZ2VvZ3JhcGhpYyBlbnZlbG9wZS5cbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfHVuZGVmaW5lZH0gZVxuICAgICAqL1xuICAgIGdldERhdGEoZSkge1xuICAgICAgICAvL2NoZWNrIGlmIGRhdGEgYWxyZWFkeSBsb2FkZWRcbiAgICAgICAgaWYgKHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgIT0gJ25vdExvYWRlZCcpIHJldHVybiB0aGlzXG5cbiAgICAgICAgLy9sb2FkIGRhdGFcbiAgICAgICAgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9ICdsb2FkaW5nJ1xuICAgICAgICA7KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGRzdih0aGlzLmRlbGltaXRlciwgdGhpcy51cmwpXG5cbiAgICAgICAgICAgICAgICAvL2NvbnZlcnQgY29vcmRpbmF0ZXMgaW4gbnVtYmVyc1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGMueCA9ICtjLnhcbiAgICAgICAgICAgICAgICAgICAgYy55ID0gK2MueVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vcHJlcHJvY2Vzcy9maWx0ZXJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmVwcm9jZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMgPSBbXVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IHRoaXMucHJlcHJvY2VzcyhjKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxzLnB1c2goYylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMgPSBkYXRhXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIGNoZWNrIGlmIHJlZHJhdyBpcyBuZWNlc3NhcnlcbiAgICAgICAgICAgICAgICAvL3RoYXQgaXMgaWYgdGhlIGRhdGFzZXQgYmVsb25ncyB0byBhIGxheWVyIHdoaWNoIGlzIHZpc2libGUgYXQgdGhlIGN1cnJlbnQgem9vbSBsZXZlbFxuXG4gICAgICAgICAgICAgICAgLy9yZWRyYXcgbWFwXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWFwKSB0aGlzLm1hcC5yZWRyYXcoKVxuXG4gICAgICAgICAgICAgICAgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9ICdsb2FkZWQnXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIC8vbWFyayBhcyBmYWlsZWRcbiAgICAgICAgICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcbiAgICAgICAgICAgICAgICB0aGlzLmNlbGxzID0gW11cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsbCB0aGUgdmlldyBjYWNoZSB3aXRoIGFsbCBjZWxscyB3aGljaCBhcmUgd2l0aGluIGEgZ2VvZ3JhcGhpY2FsIGVudmVsb3BlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZX0gZXh0R2VvXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgdXBkYXRlVmlld0NhY2hlKGV4dEdlbykge1xuICAgICAgICAvL2RhdGEgbm90IGxvYWRlZCB5ZXRcbiAgICAgICAgaWYgKCF0aGlzLmNlbGxzKSByZXR1cm5cblxuICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlID0gW11cbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIHRoaXMuY2VsbHMpIHtcbiAgICAgICAgICAgIGlmICgrY2VsbC54ICsgdGhpcy5yZXNvbHV0aW9uIDwgZXh0R2VvLnhNaW4pIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAoK2NlbGwueCAtIHRoaXMucmVzb2x1dGlvbiA+IGV4dEdlby54TWF4KSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKCtjZWxsLnkgKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueU1pbikgY29udGludWVcbiAgICAgICAgICAgIGlmICgrY2VsbC55IC0gdGhpcy5yZXNvbHV0aW9uID4gZXh0R2VvLnlNYXgpIGNvbnRpbnVlXG4gICAgICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlLnB1c2goY2VsbClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgRGF0YXNldCB9IGZyb20gJy4uL2NvcmUvRGF0YXNldC5qcydcblxuLyoqXG4gKiBBIGRhdGFzZXQgY29tcG9zZWQgb2YgY2VsbHMgZGVmaW5lZCBpbiBqYXZhc2NyaXB0LCBvciBsb2FkZWQgb3V0c2lkZSBvZiBncmlkdml6IG1hcC5cbiAqXG4gKiBAbW9kdWxlIGRhdGFzZXRcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEpTR3JpZCBleHRlbmRzIERhdGFzZXQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZSBkYXRhc2V0IHJlc29sdXRpb24gaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICogQHBhcmFtIHtBcnJheS48T2JqZWN0Pn0gY2VsbHMgVGhlIGNlbGxzLlxuICAgICAqIEBwYXJhbSB7fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocmVzb2x1dGlvbiwgY2VsbHMsIG9wdHMgPSB7fSkge1xuICAgICAgICBzdXBlcih1bmRlZmluZWQsICcnLCByZXNvbHV0aW9uLCBvcHRzKVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbD59ICovXG4gICAgICAgIHRoaXMuY2VsbHMgPSBjZWxscyB8fCBbXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3QgZGF0YSB3aXRoaW4gYSBnZW9ncmFwaGljIGVudmVsb3BlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZXx1bmRlZmluZWR9IGVcbiAgICAgKi9cbiAgICBnZXREYXRhKGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWxsIHRoZSB2aWV3IGNhY2hlIHdpdGggYWxsIGNlbGxzIHdoaWNoIGFyZSB3aXRoaW4gYSBnZW9ncmFwaGljYWwgZW52ZWxvcGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfSBleHRHZW9cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICB1cGRhdGVWaWV3Q2FjaGUoZXh0R2VvKSB7XG4gICAgICAgIC8vZGF0YSBub3QgbG9hZGVkIHlldFxuICAgICAgICBpZiAoIXRoaXMuY2VsbHMpIHJldHVyblxuXG4gICAgICAgIHRoaXMuY2VsbHNWaWV3Q2FjaGUgPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgdGhpcy5jZWxscykge1xuICAgICAgICAgICAgaWYgKCtjZWxsLnggKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueE1pbikgY29udGludWVcbiAgICAgICAgICAgIGlmICgrY2VsbC54IC0gdGhpcy5yZXNvbHV0aW9uID4gZXh0R2VvLnhNYXgpIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAoK2NlbGwueSArIHRoaXMucmVzb2x1dGlvbiA8IGV4dEdlby55TWluKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKCtjZWxsLnkgLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueU1heCkgY29udGludWVcbiAgICAgICAgICAgIHRoaXMuY2VsbHNWaWV3Q2FjaGUucHVzaChjZWxsKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKiogQHR5cGVkZWYge3sgZGltczogb2JqZWN0LCBjcnM6IHN0cmluZywgdGlsZVNpemVDZWxsOiBudW1iZXIsIG9yaWdpblBvaW50OiB7eDpudW1iZXIseTpudW1iZXJ9LCByZXNvbHV0aW9uR2VvOiBudW1iZXIsIHRpbGluZ0JvdW5kczppbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZSB9fSBHcmlkSW5mbyAqL1xuXG4vLyBpbnRlcm5hbFxuaW1wb3J0IHsgRGF0YXNldCB9IGZyb20gJy4uL2NvcmUvRGF0YXNldC5qcydcbi8vaW1wb3J0IHsgbW9uaXRvciwgbW9uaXRvckR1cmF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvVXRpbHMuanMnXG5cbi8vIGV4dGVybmFsXG5pbXBvcnQgeyBqc29uLCBjc3YgfSBmcm9tICdkMy1mZXRjaCdcblxuLyoqXG4gKiBBIHRpbGVkIGRhdGFzZXQsIGNvbXBvc2VkIG9mIENTViB0aWxlcy5cbiAqXG4gKiBAbW9kdWxlIGRhdGFzZXRcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFRpbGVkR3JpZCBleHRlbmRzIERhdGFzZXQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9NYXAuanNcIikuTWFwfSBtYXAgVGhlIG1hcC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgb2YgdGhlIGRhdGFzZXQuXG4gICAgICogQHBhcmFtIHt7cHJlcHJvY2Vzcz86KGZ1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsKTpib29sZWFuKSwgb25seURyYXdXaGVuQWxsVGlsZXNSZWFkeTpib29sZWFufX0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1hcCwgdXJsLCBvcHRzID0ge30pIHtcbiAgICAgICAgc3VwZXIobWFwLCB1cmwsIDAsIG9wdHMpXG4gICAgICAgIHRoaXMub25seURyYXdXaGVuQWxsVGlsZXNSZWFkeSA9IG9wdHMub25seURyYXdXaGVuQWxsVGlsZXNSZWFkeSB8fCBmYWxzZVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGdyaWQgaW5mbyBvYmplY3QsIGZyb20gdGhlIGluZm8uanNvbiBmaWxlLlxuICAgICAgICAgKiAgQHR5cGUge0dyaWRJbmZvIHwgdW5kZWZpbmVkfVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiAgKi9cbiAgICAgICAgdGhpcy5pbmZvID0gdW5kZWZpbmVkXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqIEBwcml2YXRlICAqL1xuICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ25vdExvYWRlZCdcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGNhY2hlIG9mIHRoZSBsb2FkZWQgdGlsZXMuIEl0IGlzIGRvdWJsZSBpbmRleGVkOiBieSB4VCBhbmQgdGhlbiB5VC5cbiAgICAgICAgICogRXhhbXBsZTogdGhpcy5jYWNoZVt4VF1beVRdIHJldHVybnMgdGhlIHRpbGUgYXQgW3hUXVt5VF0gbG9jYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICAgICAqICovXG4gICAgICAgIHRoaXMuY2FjaGUgPSB7fVxuXG4gICAgICAgIC8vbGF1bmNoIGxvYWRpbmdcbiAgICAgICAgdGhpcy5sb2FkSW5mbygpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCB0aGUgaW5mby5qc29uIGZyb20gdGhlIHVybC5cbiAgICAgKiBAcmV0dXJucyB0aGlzXG4gICAgICovXG4gICAgbG9hZEluZm8oKSB7XG4gICAgICAgIGlmICghdGhpcy5pbmZvICYmIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPT09ICdub3RMb2FkZWQnKSB7XG4gICAgICAgICAgICA7KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQganNvbih0aGlzLnVybCArICdpbmZvLmpzb24nKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZm8gPSBkYXRhXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb2x1dGlvbiA9IGRhdGEucmVzb2x1dGlvbkdlb1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ2xvYWRlZCdcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXAucmVkcmF3KClcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvL21hcmsgYXMgZmFpbGVkXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPSAnZmFpbGVkJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID09PSAnbG9hZGVkJyB8fCB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID09PSAnZmFpbGVkJykgdGhpcy5tYXAucmVkcmF3KClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlIGEgdGlsaW5nIGVudmVsb3BlIGZyb20gYSBnZW9ncmFwaGljYWwgZW52ZWxvcGUuXG4gICAgICogVGhpcyBpcyB0aGUgZnVuY3Rpb24gdG8gdXNlIHRvIGtub3cgd2hpY2ggdGlsZXMgdG8gZG93bmxvYWQgZm9yIGEgZ2VvZ3JhcGhpY2FsIHZpZXcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfSBlXG4gICAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfHVuZGVmaW5lZH1cbiAgICAgKi9cbiAgICBnZXRUaWxpbmdFbnZlbG9wZShlKSB7XG4gICAgICAgIGlmICghdGhpcy5pbmZvKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRJbmZvKClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG8gPSB0aGlzLmluZm8ub3JpZ2luUG9pbnQsXG4gICAgICAgICAgICByID0gdGhpcy5pbmZvLnJlc29sdXRpb25HZW8sXG4gICAgICAgICAgICBzID0gdGhpcy5pbmZvLnRpbGVTaXplQ2VsbFxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TWluOiBNYXRoLmZsb29yKChlLnhNaW4gLSBwby54KSAvIChyICogcykpLFxuICAgICAgICAgICAgeE1heDogTWF0aC5mbG9vcigoZS54TWF4IC0gcG8ueCkgLyAociAqIHMpKSxcbiAgICAgICAgICAgIHlNaW46IE1hdGguZmxvb3IoKGUueU1pbiAtIHBvLnkpIC8gKHIgKiBzKSksXG4gICAgICAgICAgICB5TWF4OiBNYXRoLmZsb29yKChlLnlNYXggLSBwby55KSAvIChyICogcykpLFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBkYXRhIHdpdGhpbiBhIGdlb2dyYXBoaWMgZW52ZWxvcGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ltcG9ydCgnLi4vY29yZS9HZW9DYW52YXMuanMnKS5FbnZlbG9wZX0gZXh0R2VvXG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICovXG4gICAgYXN5bmMgZ2V0RGF0YShleHRHZW8pIHtcbiAgICAgICAgaWYgKCF0aGlzLmluZm8pIHJldHVybiB0aGlzXG5cbiAgICAgICAgLy8gQ3JlYXRlIGFuIEFib3J0Q29udHJvbGxlciBmb3IgdGhlIGN1cnJlbnQgZGF0YSByZXF1ZXN0XG4gICAgICAgIHRoaXMuYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuYWJvcnRDb250cm9sbGVyLnNpZ25hbFxuXG4gICAgICAgIC8vIEdldCB0aGUgdGlsaW5nIGVudmVsb3BlIGFuZCBjaGVjayBib3VuZHNcbiAgICAgICAgY29uc3QgdGIgPSB0aGlzLmdldFRpbGluZ0VudmVsb3BlKGV4dEdlbylcbiAgICAgICAgaWYgKCF0YikgcmV0dXJuIHRoaXNcblxuICAgICAgICBjb25zdCB7IHhNaW46IGdiWE1pbiwgeE1heDogZ2JYTWF4LCB5TWluOiBnYllNaW4sIHlNYXg6IGdiWU1heCB9ID0gdGhpcy5pbmZvLnRpbGluZ0JvdW5kc1xuXG4gICAgICAgIGNvbnN0IHhNaW4gPSBNYXRoLm1heCh0Yi54TWluLCBnYlhNaW4pXG4gICAgICAgIGNvbnN0IHhNYXggPSBNYXRoLm1pbih0Yi54TWF4LCBnYlhNYXgpXG4gICAgICAgIGNvbnN0IHlNaW4gPSBNYXRoLm1heCh0Yi55TWluLCBnYllNaW4pXG4gICAgICAgIGNvbnN0IHlNYXggPSBNYXRoLm1pbih0Yi55TWF4LCBnYllNYXgpXG5cbiAgICAgICAgY29uc3QgdG90YWxUaWxlcyA9ICh4TWF4IC0geE1pbiArIDEpICogKHlNYXggLSB5TWluICsgMSlcbiAgICAgICAgbGV0IHByb2Nlc3NlZFRpbGVzID0gMFxuICAgICAgICBjb25zdCB0aWxlUHJvbWlzZXMgPSBbXVxuXG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciB0aWxlcyB3aXRoaW4gYm91bmRzXG4gICAgICAgIGZvciAobGV0IHhUID0geE1pbjsgeFQgPD0geE1heDsgeFQrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeVQgPSB5TWluOyB5VCA8PSB5TWF4OyB5VCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3hUXSkgdGhpcy5jYWNoZVt4VF0gPSB7fVxuXG4gICAgICAgICAgICAgICAgLy8gU2tpcCBhbHJlYWR5IGxvYWRlZCB0aWxlcyBvciByZXRyeSBmYWlsZWQgb25lc1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhY2hlW3hUXVt5VF0gJiYgdGhpcy5jYWNoZVt4VF1beVRdICE9PSAnZmFpbGVkJykge1xuICAgICAgICAgICAgICAgICAgICArK3Byb2Nlc3NlZFRpbGVzXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTWFyayB0aWxlIGFzIGxvYWRpbmdcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlW3hUXVt5VF0gPSAnbG9hZGluZydcblxuICAgICAgICAgICAgICAgIHRpbGVQcm9taXNlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRUaWxlKHhULCB5VCwgc2lnbmFsKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHRpbGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlW3hUXVt5VF0gPSB0aWxlXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIHRoZSBsYXN0IHRpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0xhc3RUaWxlID0gKytwcm9jZXNzZWRUaWxlcyA9PT0gdG90YWxUaWxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tBbmRSZWRyYXcodGlsZSwgaXNMYXN0VGlsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVbeFRdW3lUXSA9ICdmYWlsZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKytwcm9jZXNzZWRUaWxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQodGlsZVByb21pc2VzKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgYSB0aWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHhUXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlUXG4gICAgICogQHBhcmFtIHtBYm9ydFNpZ25hbH0gc2lnbmFsXG4gICAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICAgKi9cbiAgICBhc3luYyBsb2FkVGlsZSh4VCwgeVQsIHNpZ25hbCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGNzdihgJHt0aGlzLnVybH0ke3hUfS8ke3lUfS5jc3ZgLCB7IHNpZ25hbCB9KVxuXG4gICAgICAgICAgICBjb25zdCBjZWxscyA9IHRoaXMucHJlcHJvY2VzcyA/IGRhdGEuZmlsdGVyKChjZWxsKSA9PiB0aGlzLnByZXByb2Nlc3MoY2VsbCkgIT09IGZhbHNlKSA6IGRhdGFcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmluZm8pIHRocm93IG5ldyBFcnJvcignVGlsZSBpbmZvIHVua25vd24nKVxuXG4gICAgICAgICAgICByZXR1cm4gZ2V0R3JpZFRpbGUoY2VsbHMsIHhULCB5VCwgdGhpcy5pbmZvKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgVGlsZSByZXF1ZXN0IGZvciAke3hUfSwgJHt5VH0gd2FzIGFib3J0ZWQuYClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWwgb25nb2luZyBkYXRhIHJlcXVlc3RzIHdoZW4gem9vbSBsZXZlbCBjaGFuZ2VzLlxuICAgICAqL1xuICAgIGNhbmNlbEN1cnJlbnRSZXF1ZXN0cygpIHtcbiAgICAgICAgaWYgKHRoaXMuYWJvcnRDb250cm9sbGVyKSB7XG4gICAgICAgICAgICB0aGlzLmFib3J0Q29udHJvbGxlci5hYm9ydCgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjaGVja0FuZFJlZHJhdyh0aWxlLCBpc0xhc3RUaWxlKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGFueSB2aXNpYmxlIGxheWVyIGRlcGVuZHMgb24gdGhpcyBkYXRhc2V0XG4gICAgICAgIC8vIGNoZWNrIGlmIHJlZHJhdyBpcyByZWFsbHkgbmVlZGVkLCB0aGF0IGlzIGlmOlxuICAgICAgICAvLyAxLiB0aGUgZGF0YXNldCBiZWxvbmdzIHRvIGEgbGF5ZXIgd2hpY2ggaXMgdmlzaWJsZSBhdCB0aGUgY3VycmVudCB6b29tIGxldmVsXG4gICAgICAgIGxldCBuZWVkc1JlZHJhdyA9IGZhbHNlXG4gICAgICAgIC8vZ28gdGhyb3VnaCB0aGUgbGF5ZXJzXG4gICAgICAgIGNvbnN0IHogPSB0aGlzLm1hcC5nZXRab29tKClcbiAgICAgICAgZm9yIChjb25zdCBsYXkgb2YgdGhpcy5tYXAubGF5ZXJzKSB7XG4gICAgICAgICAgICBpZiAobGF5LnZpc2libGUgJiYgIWxheS52aXNpYmxlKHopKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKCFsYXkuZ2V0RGF0YXNldCkgY29udGludWVcbiAgICAgICAgICAgIGlmIChsYXkuZ2V0RGF0YXNldCh6KSAhPSB0aGlzKSBjb250aW51ZVxuICAgICAgICAgICAgLy9mb3VuZCBvbmUgbGF5ZXIuIE5vIG5lZWQgdG8gc2VlayBtb3JlLlxuICAgICAgICAgICAgbmVlZHNSZWRyYXcgPSB0cnVlXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFuZWVkc1JlZHJhdykgcmV0dXJuXG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGlsZSBpbnRlcnNlY3RzIHRoZSBjdXJyZW50IHZpZXdcbiAgICAgICAgY29uc3QgZW52ID0gdGhpcy5tYXAudXBkYXRlRXh0ZW50R2VvKClcbiAgICAgICAgY29uc3QgeyB4TWluLCB4TWF4LCB5TWluLCB5TWF4IH0gPSB0aWxlLmV4dEdlb1xuICAgICAgICBpZiAoZW52LnhNYXggPD0geE1pbiB8fCBlbnYueE1pbiA+PSB4TWF4IHx8IGVudi55TWF4IDw9IHlNaW4gfHwgZW52LnlNaW4gPj0geU1heCkgcmV0dXJuXG5cbiAgICAgICAgLy8gVHJpZ2dlciByZWRyYXdcbiAgICAgICAgaWYgKHRoaXMub25seURyYXdXaGVuQWxsVGlsZXNSZWFkeSkge1xuICAgICAgICAgICAgaWYgKGlzTGFzdFRpbGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hcC5yZWRyYXcoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tYXAucmVkcmF3KClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbGwgdGhlIHZpZXcgY2FjaGUgd2l0aCBhbGwgY2VsbHMgd2hpY2ggYXJlIHdpdGhpbiBhIGdlb2dyYXBoaWNhbCBlbnZlbG9wZS5cbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfSBleHRHZW9cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICB1cGRhdGVWaWV3Q2FjaGUoZXh0R2VvKSB7XG4gICAgICAgIC8vXG4gICAgICAgIHRoaXMuY2VsbHNWaWV3Q2FjaGUgPSBbXVxuXG4gICAgICAgIC8vY2hlY2sgaWYgaW5mbyBoYXMgYmVlbiBsb2FkZWRcbiAgICAgICAgaWYgKCF0aGlzLmluZm8pIHJldHVyblxuXG4gICAgICAgIC8vdGlsZXMgd2l0aGluIHRoZSBzY29wZVxuICAgICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgY29uc3QgdGIgPSB0aGlzLmdldFRpbGluZ0VudmVsb3BlKGV4dEdlbylcbiAgICAgICAgaWYgKCF0YikgcmV0dXJuXG5cbiAgICAgICAgLy9ncmlkIGJvdW5kc1xuICAgICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfSAqL1xuICAgICAgICBjb25zdCBnYiA9IHRoaXMuaW5mby50aWxpbmdCb3VuZHNcblxuICAgICAgICBmb3IgKGxldCB4VCA9IE1hdGgubWF4KHRiLnhNaW4sIGdiLnhNaW4pOyB4VCA8PSBNYXRoLm1pbih0Yi54TWF4LCBnYi54TWF4KTsgeFQrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3hUXSkgY29udGludWVcbiAgICAgICAgICAgIGZvciAobGV0IHlUID0gTWF0aC5tYXgodGIueU1pbiwgZ2IueU1pbik7IHlUIDw9IE1hdGgubWluKHRiLnlNYXgsIGdiLnlNYXgpOyB5VCsrKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgdGlsZVxuICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7b2JqZWN0fSAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLmNhY2hlW3hUXVt5VF1cbiAgICAgICAgICAgICAgICBpZiAoIXRpbGUgfHwgdHlwZW9mIHRpbGUgPT09ICdzdHJpbmcnKSBjb250aW51ZVxuXG4gICAgICAgICAgICAgICAgLy9nZXQgY2VsbHNcbiAgICAgICAgICAgICAgICAvL3RoaXMuY2VsbHNWaWV3Q2FjaGUgPSB0aGlzLmNlbGxzVmlld0NhY2hlLmNvbmNhdCh0aWxlLmNlbGxzKVxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIHRpbGUuY2VsbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCtjZWxsLnggKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueE1pbikgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKCtjZWxsLnggLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueE1heCkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKCtjZWxsLnkgKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueU1pbikgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKCtjZWxsLnkgLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueU1heCkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsc1ZpZXdDYWNoZS5wdXNoKGNlbGwpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRHcmlkVGlsZShjZWxscywgeFQsIHlULCBncmlkSW5mbykge1xuICAgIGNvbnN0IHRpbGUgPSB7fVxuXG4gICAgLyoqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSAqL1xuICAgIHRpbGUuY2VsbHMgPSBjZWxsc1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIHRpbGUueCA9IHhUXG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGlsZS55ID0geVRcblxuICAgIGNvbnN0IHIgPSBncmlkSW5mby5yZXNvbHV0aW9uR2VvXG4gICAgY29uc3QgcyA9IGdyaWRJbmZvLnRpbGVTaXplQ2VsbFxuXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5FbnZlbG9wZX0gKi9cbiAgICB0aWxlLmV4dEdlbyA9IHtcbiAgICAgICAgeE1pbjogZ3JpZEluZm8ub3JpZ2luUG9pbnQueCArIHIgKiBzICogdGlsZS54LFxuICAgICAgICB4TWF4OiBncmlkSW5mby5vcmlnaW5Qb2ludC54ICsgciAqIHMgKiAodGlsZS54ICsgMSksXG4gICAgICAgIHlNaW46IGdyaWRJbmZvLm9yaWdpblBvaW50LnkgKyByICogcyAqIHRpbGUueSxcbiAgICAgICAgeU1heDogZ3JpZEluZm8ub3JpZ2luUG9pbnQueSArIHIgKiBzICogKHRpbGUueSArIDEpLFxuICAgIH1cblxuICAgIC8vY29udmVydCBjZWxsIGNvb3JkaW5hdGVzIGludG8gZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzXG4gICAgZm9yIChsZXQgY2VsbCBvZiB0aWxlLmNlbGxzKSB7XG4gICAgICAgIGNlbGwueCA9IHRpbGUuZXh0R2VvLnhNaW4gKyBjZWxsLnggKiByXG4gICAgICAgIGNlbGwueSA9IHRpbGUuZXh0R2VvLnlNaW4gKyBjZWxsLnkgKiByXG4gICAgfVxuXG4gICAgcmV0dXJuIHRpbGVcbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xuXG4vKipcbiAqXG4gKiBBIG1hcCBiYWNrZ3JvdW5kIGxheWVyIGluIFwiU2xpcHB5IG1hcFwiIFhZWiBzdGFuZGFyZC5cbiAqIFNlZSBodHRwczovL3dpa2kub3BlbnN0cmVldG1hcC5vcmcvd2lraS9TbGlwcHlfbWFwX3RpbGVuYW1lc1xuICogaHR0cHM6Ly93d3cubWFwdGlsZXIuY29tL2dvb2dsZS1tYXBzLWNvb3JkaW5hdGVzLXRpbGUtYm91bmRzLXByb2plY3Rpb24vIzYvMjcuODgvNDQuNDhcbiAqXG4gKiBAbW9kdWxlIGxheWVyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBCYWNrZ3JvdW5kTGF5ZXIgZXh0ZW5kcyBMYXllciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIFRoZSBpbWFnZSBjYWNoZSwgaW5kZXhlZCBieSB6L3kveFxuICAgICAgICAgKiBAcHJpdmF0ZSAqL1xuICAgICAgICB0aGlzLmNhY2hlID0ge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy51cmwgPSBvcHRzLnVybFxuICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudXJsRnVuID0gb3B0cy51cmxGdW4gfHwgKCh4LCB5LCB6KSA9PiB0aGlzLnVybCArIHogKyAnLycgKyB4ICsgJy8nICsgeSArICcucG5nJylcblxuICAgICAgICAvKiogVGhlIGdyb3VuZCByZXNvbHV0aW9ucyBvZiB0aGUgem9vbSBsZXZlbHMsIHN0YXJ0aW5nIGZyb20gdGhlIHNtYWxsZXN0IChtb3N0IHpvb21lZC1vdXQsIHVzdWFsbHkgMCkgdG8gdGhlIGxhcmdlc3QgKG1vc3Qgem9vbWVkLWluKS5cbiAgICAgICAgICogVXN1YWxseSBkaXZpZGVkIGJ5IDIgZm9yIGVhY2ggem9vbSBsZXZlbCBpbmNyZW1lbnQuXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cbiAgICAgICAgdGhpcy5yZXNvbHV0aW9ucyA9IG9wdHMucmVzb2x1dGlvbnNcbiAgICAgICAgaWYgKCF0aGlzLnJlc29sdXRpb25zIHx8IHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoID09IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJlc29sdXRpb25zIHByb3ZpZGVkIGZvciBiYWNrZ3JvdW5kIGxheWVyJylcblxuICAgICAgICAvKiogVGhlIHRpbGUgc2l6ZSwgaW4gbnVtYmVyIG9mIHBpeGVsc1xuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm5iUGl4ID0gb3B0cy5uYlBpeCB8fCAyNTZcblxuICAgICAgICAvKiogQ1JTIGNvb3JkaW5hdGVzIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgdG9wIGxlZnQgdGlsZSwgdGhlIG9uZSB3aXRoIGNvZGUgLzAvMC5wbmcuXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cbiAgICAgICAgdGhpcy5vcmlnaW4gPSBvcHRzLm9yaWdpbiB8fCBbMCwgMF1cblxuICAgICAgICAvKiogVGhlIGNvZGUgb2YgdGhlIHNtYWxsZXN0IChtb3N0IHpvb21lZC1vdXQpIHpvb20gbGV2ZWwsIGluIGNhc2UgaXQgaXMgbm90IDAuXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuejAgPSBvcHRzLnowIHx8IDBcblxuICAgICAgICAvKiogQSBjb2VmZmljaWVudCB0byBhZGp1c3QgdGhlIGJhY2tncm91biByZXNvbHV0aW9uIHdpdGggdGhlIHNjcmVlbiByZXNvbHV0aW9uLlxuICAgICAgICAgKiAgSWYgdGhlIGJhY2tncm91bmQgaW1hZ2VzIGFyZSB0b28gcGl4ZWxpc2VkLCByZWR1Y2UgdGhlIHZhbHVlLlxuICAgICAgICAgKiAgSWYgdGhlcmUgYXJlIHRvbyBtYW55IGltYWdlcyB0byBkb3dubG9hZCwgaW5jcmVhc2UgdGhlIHZhbHVlLlxuICAgICAgICAgKiAgRGVmYXVsdCB2YWx1ZSBpcyAxLjBcbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5waXhlbGF0aW9uQ29lZmZpY2llbnQgPSBvcHRzLnBpeGVsYXRpb25Db2VmZmljaWVudCB8fCAxLjBcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgei94L3kgY2FjaGUgZGF0YS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gelxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlcbiAgICAgKiBAcmV0dXJucyB7SFRNTEltYWdlRWxlbWVudHxzdHJpbmd8dW5kZWZpbmVkfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0KHosIHgsIHkpIHtcbiAgICAgICAgbGV0IGQgPSB0aGlzLmNhY2hlW3pdXG4gICAgICAgIGlmICghZCkgcmV0dXJuXG4gICAgICAgIGQgPSBkW3hdXG4gICAgICAgIGlmICghZCkgcmV0dXJuXG4gICAgICAgIHJldHVybiBkW3ldXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHV0IGltYWdlIGluIGNhY2hlLlxuICAgICAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudHxzdHJpbmd9IGltZ1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geVxuICAgICAqIEByZXR1cm5zXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwdXQoaW1nLCB6LCB4LCB5KSB7XG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt6XSkgdGhpcy5jYWNoZVt6XSA9IHt9XG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt6XVt4XSkgdGhpcy5jYWNoZVt6XVt4XSA9IHt9XG4gICAgICAgIHRoaXMuY2FjaGVbel1beF1beV0gPSBpbWdcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGUgbGF5ZXIuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZHJhdyhnZW9DYW52YXMpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlc29sdXRpb25zIHx8IHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHJlc29sdXRpb25zIHByb3ZpZGVkIGZvciBiYWNrZ3JvdW5kIGxheWVyJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgY29uc3QgeDAgPSB0aGlzLm9yaWdpblswXSwgeTAgPSB0aGlzLm9yaWdpblsxXVxuXG4gICAgICAgIC8vZ2V0IHpvb20gbGV2ZWwgYW5kIHJlc29sdXRpb25cbiAgICAgICAgbGV0IHpfID0gMFxuICAgICAgICBmb3IgKHpfID0gMDsgel8gPCB0aGlzLnJlc29sdXRpb25zLmxlbmd0aDsgel8rKykgaWYgKHRoaXMucmVzb2x1dGlvbnNbel9dIDwgeiAqIHRoaXMucGl4ZWxhdGlvbkNvZWZmaWNpZW50KSBicmVha1xuICAgICAgICB6XyAtPSAxXG4gICAgICAgIHpfID0gTWF0aC5tYXgoMCwgel8pXG4gICAgICAgIHpfID0gTWF0aC5taW4oel8sIHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoIC0gMSlcbiAgICAgICAgY29uc3QgcmVzID0gdGhpcy5yZXNvbHV0aW9uc1t6X11cbiAgICAgICAgel8gKz0gdGhpcy56MFxuXG4gICAgICAgIGNvbnN0IHNpemVHID0gdGhpcy5uYlBpeCAqIHJlc1xuICAgICAgICBjb25zdCBzaXplID0gc2l6ZUcgLyB6XG5cbiAgICAgICAgLy9nZXQgdGlsZSBudW1iZXJzXG4gICAgICAgIGNvbnN0IHhHZW9Ub1RNUyA9ICh4KSA9PiBNYXRoLmNlaWwoKHggLSB4MCkgLyBzaXplRylcbiAgICAgICAgY29uc3QgeUdlb1RvVE1TID0gKHkpID0+IE1hdGguY2VpbCgtKHkgLSB5MCkgLyBzaXplRylcbiAgICAgICAgY29uc3QgeE1pbiA9IHhHZW9Ub1RNUyhnZW9DYW52YXMuZXh0R2VvLnhNaW4pIC0gMVxuICAgICAgICBjb25zdCB4TWF4ID0geEdlb1RvVE1TKGdlb0NhbnZhcy5leHRHZW8ueE1heClcbiAgICAgICAgY29uc3QgeU1heCA9IHlHZW9Ub1RNUyhnZW9DYW52YXMuZXh0R2VvLnlNaW4pXG4gICAgICAgIGNvbnN0IHlNaW4gPSB5R2VvVG9UTVMoZ2VvQ2FudmFzLmV4dEdlby55TWF4KSAtIDFcblxuICAgICAgICAvL2hhbmRsZSBpbWFnZXNcbiAgICAgICAgZm9yIChsZXQgeCA9IHhNaW47IHggPCB4TWF4OyB4KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHkgPSB5TWluOyB5IDwgeU1heDsgeSsrKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgaW1hZ2VcbiAgICAgICAgICAgICAgICBsZXQgaW1nID0gdGhpcy5nZXQoel8sIHgsIHkpXG5cbiAgICAgICAgICAgICAgICAvL25vIGltYWdlOiBsb2FkIGltYWdlIGZyb20gVVJMXG4gICAgICAgICAgICAgICAgaWYgKCFpbWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXQoaW1nLCB6XywgeCwgeSlcbiAgICAgICAgICAgICAgICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5yZWRyYXcoKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGltZy5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jYXNlIHdoZW4gbm8gaW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHV0KCdmYWlsZWQnLCB6XywgeCwgeSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpbWcuc3JjID0gdGhpcy51cmxGdW4oeCwgeSwgel8pXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9jYXNlIHdoZW4gbm8gaW1hZ2UgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgaWYgKGltZyA9PT0gJ2ZhaWxlZCcpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgaWYgKCEoaW1nIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coaW1nKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaW1nLndpZHRoID09IDAgfHwgaW1nLmhlaWdodCA9PSAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAgICAgLy9kcmF3IGltYWdlXG4gICAgICAgICAgICAgICAgY29uc3QgeEdlbyA9IHgwICsgeCAqIHNpemVHXG4gICAgICAgICAgICAgICAgY29uc3QgeUdlbyA9IHkwIC0geSAqIHNpemVHXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4LmRyYXdJbWFnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGltZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5nZW9Ub1BpeFgoeEdlbyksXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuZ2VvVG9QaXhZKHlHZW8pLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAvL2NnLmN0eC5kcmF3SW1hZ2UoaW1nLCB4R2VvLCB5R2VvLCBzaXplRywgLXNpemVHKVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBMYXllciB9IGZyb20gJy4uL2NvcmUvTGF5ZXIuanMnXG5cbi8qKlxuICpcbiAqIEEgbWFwIGJhY2tncm91bmQgbGF5ZXIgY29tcG9zZWQgb2YgYSBzaW5nbGUgaW1hZ2UgZmlsZSwgZ2VvbG9jYXRlZC5cbiAqXG4gKiBAbW9kdWxlIGxheWVyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBCYWNrZ3JvdW5kTGF5ZXJJbWFnZSBleHRlbmRzIExheWVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogVGhlIGltYWdlIGZpbGUgVVJMXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudXJsID0gb3B0cy51cmxcblxuICAgICAgICAvKiogVGhlIGltYWdlIGxlZnQgY29vcmRpbmF0ZVxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnhNaW4gPSBvcHRzLnhNaW4gfHwgMFxuICAgICAgICAvKiogVGhlIGltYWdlIHRvcCBjb29yZGluYXRlXG4gICAgICAgICAqICBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnlNYXggPSBvcHRzLnlNYXggfHwgMFxuXG4gICAgICAgIC8qKiBUaGUgaW1hZ2Ugd2lkdGgsIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8IDIwMDAwXG4gICAgICAgIC8qKiBUaGUgaW1hZ2UgaGVpZ2h0LCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0IHx8IDIwMDAwXG5cbiAgICAgICAgLyoqIFRoZSBpbWFnZSBvYmplY3RcbiAgICAgICAgICogQHR5cGUge0hUTUxJbWFnZUVsZW1lbnR8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmltZyA9IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXMgVGhlIGNhbnZhcyB3aGVyZSB0byBkcmF3IHRoZSBsYXllci5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBkcmF3KGdlb0NhbnZhcykge1xuICAgICAgICAvL3VwZGF0ZSBtYXAgZXh0ZW50XG4gICAgICAgIC8vZ2VvQ2FudmFzLnVwZGF0ZUV4dGVudEdlbygwKVxuXG4gICAgICAgIGlmICh0aGlzLmltZykge1xuICAgICAgICAgICAgLy90aGUgaW1hZ2Ugd2FzIGFscmVhZHkgZG93bmxvYWRlZDogZHJhdyBpdFxuXG4gICAgICAgICAgICAvL2NvbXB1dGUgc2NyZWVuIGNvb3JkaW5hdGVzIGFuZCBzaXplIHJhdGlvXG4gICAgICAgICAgICBjb25zdCB4ID0gZ2VvQ2FudmFzLmdlb1RvUGl4WCh0aGlzLnhNaW4pXG4gICAgICAgICAgICBjb25zdCB5ID0gZ2VvQ2FudmFzLmdlb1RvUGl4WSh0aGlzLnlNYXgpXG4gICAgICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLmdldFZpZXcoKS56XG5cbiAgICAgICAgICAgIC8vZHJhdyBpbWFnZVxuICAgICAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuICAgICAgICAgICAgZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eC5kcmF3SW1hZ2UodGhpcy5pbWcsIHgsIHksIHRoaXMud2lkdGggLyB6LCB0aGlzLmhlaWdodCAvIHopXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL3JldHJpZXZlIGltYWdlXG5cbiAgICAgICAgICAgIGlmICghdGhpcy5pbWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmltZyA9IG5ldyBJbWFnZSgpXG4gICAgICAgICAgICAgICAgdGhpcy5pbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMucmVkcmF3KClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pbWcub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9jYXNlIHdoZW4gbm8gaW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgcmV0cmlldmUgYmFja2dyb3VuZCBpbWFnZSBmcm9tJywgdGhpcy51cmwpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL3NldCBVUkwgdG8gbGF1bmNoIHRoZSBkb3dubG9hZFxuICAgICAgICAgICAgdGhpcy5pbWcuc3JjID0gdGhpcy51cmxcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xuXG4vKipcbiAqXG4gKiBBIG1hcCBXTVMgYmFja2dyb3VuZCBsYXllci5cbiAqXG4gKiBAbW9kdWxlIGxheWVyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBCYWNrZ3JvdW5kTGF5ZXJXTVMgZXh0ZW5kcyBMYXllciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudXJsID0gb3B0cy51cmxcblxuICAgICAgICAvKiogQHR5cGUge0hUTUxJbWFnZUVsZW1lbnR8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmltZyA9IHVuZGVmaW5lZFxuXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy54TWluID0gdW5kZWZpbmVkXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy54TWF4ID0gdW5kZWZpbmVkXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy55TWluID0gdW5kZWZpbmVkXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy55TWF4ID0gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgLyoqIENoZWNrIGlmIHRoZSB2aWV3IGhhcyBtb3ZlZCBhbmQgYSBuZXcgaW1hZ2UgbmVlZHMgdG8gYmUgcmV0cmlldmVkLlxuICAgICAqIEBwcml2YXRlICovXG4gICAgaGFzTW92ZWQoZXh0R2VvKSB7XG4gICAgICAgIGlmIChleHRHZW8ueE1pbiAhPSB0aGlzLnhNaW4pIHJldHVybiB0cnVlXG4gICAgICAgIGVsc2UgaWYgKGV4dEdlby54TWF4ICE9IHRoaXMueE1heCkgcmV0dXJuIHRydWVcbiAgICAgICAgZWxzZSBpZiAoZXh0R2VvLnlNaW4gIT0gdGhpcy55TWluKSByZXR1cm4gdHJ1ZVxuICAgICAgICBlbHNlIGlmIChleHRHZW8ueU1heCAhPSB0aGlzLnlNYXgpIHJldHVybiB0cnVlXG4gICAgICAgIGVsc2UgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGRyYXcoZ2VvQ2FudmFzKSB7XG4gICAgICAgIC8vdXBkYXRlIG1hcCBleHRlbnRcbiAgICAgICAgZ2VvQ2FudmFzLnVwZGF0ZUV4dGVudEdlbygwKVxuXG4gICAgICAgIGlmICghdGhpcy5oYXNNb3ZlZChnZW9DYW52YXMuZXh0R2VvKSAmJiB0aGlzLmltZykge1xuICAgICAgICAgICAgLy90aGUgbWFwIGRpZCBub3QgbW92ZSBhbmQgdGhlIGltYWdlIHdhcyBhbHJlYWR5IGRvd25sb2FkZWQ6IGRyYXcgdGhlIGltYWdlXG4gICAgICAgICAgICBnZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG4gICAgICAgICAgICBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4LmRyYXdJbWFnZSh0aGlzLmltZywgMCwgMCwgZ2VvQ2FudmFzLncsIGdlb0NhbnZhcy5oKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy90aGUgbWFwIG1vdmVkOiByZXRyaWV2ZSBuZXcgaW1hZ2VcblxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHRoaXMueE1pbiA9IGdlb0NhbnZhcy5leHRHZW8ueE1pblxuICAgICAgICAgICAgdGhpcy54TWF4ID0gZ2VvQ2FudmFzLmV4dEdlby54TWF4XG4gICAgICAgICAgICB0aGlzLnlNaW4gPSBnZW9DYW52YXMuZXh0R2VvLnlNaW5cbiAgICAgICAgICAgIHRoaXMueU1heCA9IGdlb0NhbnZhcy5leHRHZW8ueU1heFxuXG4gICAgICAgICAgICAvL2J1aWxkIFdNUyBVUkxcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IFtdXG4gICAgICAgICAgICB1cmwucHVzaCh0aGlzLnVybClcbiAgICAgICAgICAgIHVybC5wdXNoKCcmd2lkdGg9JylcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy53KVxuICAgICAgICAgICAgdXJsLnB1c2goJyZoZWlnaHQ9JylcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5oKVxuICAgICAgICAgICAgLy9iYm94OiB4bWluIHltaW4geG1heCB5bWF4XG4gICAgICAgICAgICB1cmwucHVzaCgnJmJib3g9JylcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5leHRHZW8ueE1pbilcbiAgICAgICAgICAgIHVybC5wdXNoKCcsJylcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5leHRHZW8ueU1pbilcbiAgICAgICAgICAgIHVybC5wdXNoKCcsJylcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5leHRHZW8ueE1heClcbiAgICAgICAgICAgIHVybC5wdXNoKCcsJylcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5leHRHZW8ueU1heClcblxuICAgICAgICAgICAgY29uc3QgdXJsUyA9IHVybC5qb2luKCcnKVxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh1cmxTKVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW1nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbWcgPSBuZXcgSW1hZ2UoKVxuICAgICAgICAgICAgICAgIHRoaXMuaW1nLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLnJlZHJhdygpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuaW1nLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vY2FzZSB3aGVuIG5vIGltYWdlXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IHJldHJpZXZlIFdNUyBiYWNrZ3JvdW5kIGltYWdlIGZyb20nLCB1cmxTKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9zZXQgVVJMIHRvIGxhdW5jaCB0aGUgZG93bmxvYWRcbiAgICAgICAgICAgIHRoaXMuaW1nLnNyYyA9IHVybFNcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xuaW1wb3J0IHsganNvbiB9IGZyb20gJ2QzLWZldGNoJ1xuXG4vKipcbiAqIEBtb2R1bGUgbGF5ZXJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEdlb0pTT05MYXllciBleHRlbmRzIExheWVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy51cmwgPSBvcHRzLnVybFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHByZXByb2Nlc3MgdG8gcnVuIG9uIGVhY2ggZmVhdHVyZSBhZnRlciBsb2FkaW5nLlxuICAgICAgICAgKiBJdCBjYW4gYmUgdXNlZCB0byBhcHBseSBzb21lIHNwZWNpZmljIHRyZWF0bWVudCBiZWZvcmUsIGZvcm1hdCB0aGUgbGFiZWwgZGF0YSwgcHJvamVjdCBjb29yZGluYXRlcywgZXRjLlxuICAgICAgICAgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGxhYmVsIHNob3VsZCBub3QgYmUga2VwdC5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCk6Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzID0gb3B0cy5wcmVwcm9jZXNzXG5cbiAgICAgICAgLy9mb3IgcG9pbnRzXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAoKGYsIHopID0+ICdjaXJjbGUnKVxuICAgICAgICAvKipcbiAgICAgICAgICogSW4gcGl4ZWxcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIHx8ICgoZiwgeikgPT4gMTApXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnN0cm9rZVN0eWxlID0gb3B0cy5zdHJva2VTdHlsZSB8fCAoKGYsIHopID0+ICdyZWQnKVxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5maWxsU3R5bGUgPSBvcHRzLmZpbGxTdHlsZSB8fCAoKGYsIHopID0+ICdibGFjaycpXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBwaXhlbFxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmxpbmVXaWR0aCA9IG9wdHMubGluZVdpZHRoIHx8ICgoZiwgeikgPT4gMilcblxuICAgICAgICAvL2ZvciBsaW5lc1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKGYsIHopID0+ICdncmF5JylcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluIHBpeGVsXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihvYmplY3QsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgoZiwgeikgPT4gMilcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihvYmplY3QsbnVtYmVyKTpBcnJheS48bnVtYmVyPnx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMubGluZURhc2ggPSBvcHRzLmxpbmVEYXNoIHx8ICgoZiwgeikgPT4gdW5kZWZpbmVkKVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPG9iamVjdD4gfCB1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMuZnMgPSB1bmRlZmluZWRcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ25vdExvYWRlZCdcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IHRoZSBsYXllci5cbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGUgbGF5ZXIuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZHJhdyhnZW9DYW52YXMpIHtcbiAgICAgICAgLy9sb2FkIGRhdGEsIGlmIG5vdCBkb25lIHlldC5cbiAgICAgICAgaWYgKCF0aGlzLmZzKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWQoZ2VvQ2FudmFzLnJlZHJhdylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgY29uc3QgY3R4ID0gZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuXG4gICAgICAgIGZvciAoY29uc3QgZiBvZiB0aGlzLmZzKSB7XG4gICAgICAgICAgICBjb25zdCBndCA9IGYuZ2VvbWV0cnkudHlwZVxuXG4gICAgICAgICAgICBpZiAoZ3QgPT0gJ1BvaW50Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBmLmdlb21ldHJ5LmNvb3JkaW5hdGVzXG5cbiAgICAgICAgICAgICAgICAvL2dldCBzdHlsZSBwYXJhbWV0ZXJzIGZvciB0aGUgcG9pbnQgZmVhdHVyZVxuICAgICAgICAgICAgICAgIGNvbnN0IHNoYXBlID0gdGhpcy5zaGFwZShmLCB6KVxuICAgICAgICAgICAgICAgIGlmICghc2hhcGUgfHwgc2hhcGUgPT0gJ25vbmUnKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnNpemUoZiwgeikgKiB6XG4gICAgICAgICAgICAgICAgaWYgKCFzaXplKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGNvbnN0IHN0cm9rZVN0eWxlID0gdGhpcy5zdHJva2VTdHlsZShmLCB6KVxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGxTdHlsZSA9IHRoaXMuZmlsbFN0eWxlKGYsIHopXG4gICAgICAgICAgICAgICAgY29uc3QgbGluZVdpZHRoID0gdGhpcy5saW5lV2lkdGgoZiwgeikgKiB6XG5cbiAgICAgICAgICAgICAgICAvL3NldCBjYW52YXMgZHJhd2luZyBwYXJhbWV0ZXJzXG4gICAgICAgICAgICAgICAgaWYgKHN0cm9rZVN0eWxlKSBjdHguc3Ryb2tlU3R5bGUgPSBzdHJva2VTdHlsZVxuICAgICAgICAgICAgICAgIGlmIChmaWxsU3R5bGUpIGN0eC5maWxsU3R5bGUgPSBmaWxsU3R5bGVcbiAgICAgICAgICAgICAgICBpZiAobGluZVdpZHRoKSBjdHgubGluZVdpZHRoID0gbGluZVdpZHRoXG5cbiAgICAgICAgICAgICAgICBpZiAoc2hhcGUgPT0gJ2NpcmNsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kcmF3IGNpcmNsZSAtIGZpbGwgYW5kIHN0cm9rZVxuICAgICAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgY3R4LmFyYyhjWzBdLCBjWzFdLCBzaXplIC8gMiwgMCwgMiAqIE1hdGguUEksIGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlsbFN0eWxlKSBjdHguZmlsbCgpXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHJva2VTdHlsZSAmJiBsaW5lV2lkdGgpIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT0gJ3NxdWFyZScpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kcmF3IHNxdWFyZSAtIGZpbGwgYW5kIHN0cm9rZVxuICAgICAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgY3R4LnJlY3QoY1swXSAtIHNpemUgLyAyLCBjWzFdIC0gc2l6ZSAvIDIsIHNpemUsIHNpemUpXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWxsU3R5bGUpIGN0eC5maWxsKClcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cm9rZVN0eWxlICYmIGxpbmVXaWR0aCkgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVW5leHBlY3RlZCBzaGFwZSBmb3IgcG9pbnQgZ2VvanNvbjogJyArIHNoYXBlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZ3QgPT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3MgPSBmLmdlb21ldHJ5LmNvb3JkaW5hdGVzXG4gICAgICAgICAgICAgICAgaWYgKGNzLmxlbmd0aCA8IDIpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgICAgICAvL3NldCBjb2xvclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IoZiwgeilcbiAgICAgICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT0gJ25vbmUnKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGNvbFxuXG4gICAgICAgICAgICAgICAgLy9zZXQgbGluZXdpZHRoXG4gICAgICAgICAgICAgICAgY29uc3Qgd1AgPSB0aGlzLndpZHRoKGYsIHopXG4gICAgICAgICAgICAgICAgaWYgKCF3UCB8fCB3UCA8IDApIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHdQICogelxuXG4gICAgICAgICAgICAgICAgLy9zZXQgbGluZSBkYXNoXG4gICAgICAgICAgICAgICAgY29uc3QgbGRQID0gdGhpcy5saW5lRGFzaChmLCB6KVxuICAgICAgICAgICAgICAgIGlmIChsZFApIGN0eC5zZXRMaW5lRGFzaChsZFApXG5cbiAgICAgICAgICAgICAgICAvL2RyYXcgbGluZVxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oY3NbMF1bMF0sIGNzWzBdWzFdKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY3MubGVuZ3RoOyBpKyspIGN0eC5saW5lVG8oY3NbaV1bMF0sIGNzW2ldWzFdKVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVW5zdXBwb3J0ZWQgZ2VvbWV0cnkgdHlwZSBpbiBHZW9KU09OTGF5ZXI6ICcgKyBndClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vLi4uXG4gICAgICAgIGN0eC5zZXRMaW5lRGFzaChbXSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGRhdGEgZm9yIGxhYmVscywgZnJvbSBVUkwgdGhpcy51cmxcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk6dm9pZH0gY2FsbGJhY2tcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGFzeW5jIGxvYWQoY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLnVybCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZhaWxlZCBsb2FkaW5nIGJvdW5kYXJpZXM6IE5vIFVSTCBzcGVjaWZpZWQuICcgKyB0aGlzLnVybClcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdmYWlsZWQnXG4gICAgICAgICAgICB0aGlzLmxhYmVscyA9IFtdXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hlY2sgaWYgZGF0YSBhbHJlYWR5IGxvYWRlZFxuICAgICAgICBpZiAodGhpcy5sb2FkaW5nU3RhdHVzICE9ICdub3RMb2FkZWQnKSByZXR1cm5cblxuICAgICAgICAvL2xvYWQgZGF0YVxuICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnbG9hZGluZydcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZGF0YV8gPSBhd2FpdCBqc29uKHRoaXMudXJsKVxuXG4gICAgICAgICAgICAvKiogQHR5cGUgeyBBcnJheS48b2JqZWN0PiB9ICovXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gZGF0YV8uZmVhdHVyZXNcblxuICAgICAgICAgICAgLy9wcmVwcm9jZXNzL2ZpbHRlclxuICAgICAgICAgICAgaWYgKHRoaXMucHJlcHJvY2Vzcykge1xuICAgICAgICAgICAgICAgIHRoaXMuZnMgPSBbXVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0aGlzLnByZXByb2Nlc3MoYylcbiAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnMucHVzaChjKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9zdG9yZSBsYWJlbHNcbiAgICAgICAgICAgICAgICB0aGlzLmZzID0gZGF0YVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnbG9hZGVkJ1xuXG4gICAgICAgICAgICAvL3JlZHJhd1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIGxvYWRpbmcgYm91bmRhcmllcyBmcm9tICcgKyB0aGlzLnVybClcbiAgICAgICAgICAgIHRoaXMuZnMgPSBbXVxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xuXG4vKipcbiAqIEEgbGF5ZXIsIHdoaWNoIHNwZWNpZmllcyBhIGRhdGFzZXQgdG8gYmUgc2hvd24gd2l0aCBzcGVjaWZpZWQgc3R5bGVzLlxuICpcbiAqIEBtb2R1bGUgbGF5ZXJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEdyaWRMYXllciBleHRlbmRzIExheWVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5EYXRhc2V0fGltcG9ydChcIi4uL2NvcmUvTXVsdGlSZXNvbHV0aW9uRGF0YXNldFwiKS5NdWx0aVJlc29sdXRpb25EYXRhc2V0fSBkYXRhc2V0IFRoZSBkYXRhc2V0IHRvIHNob3cuXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9TdHlsZVwiKS5TdHlsZT59IHN0eWxlcyBUaGUgc3R5bGVzLCBvcmRlcmVkIGluIGRyYXdpbmcgb3JkZXIuXG4gICAgICogQHBhcmFtIHt7dmlzaWJsZT86ZnVuY3Rpb24obnVtYmVyKTpib29sZWFuLGFscGhhPzpmdW5jdGlvbihudW1iZXIpOm51bWJlcixibGVuZE9wZXJhdGlvbj86ZnVuY3Rpb24obnVtYmVyKTpHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24sbWluUGl4ZWxzUGVyQ2VsbD86bnVtYmVyLGNlbGxJbmZvSFRNTD86ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGwpOnN0cmluZ319IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihkYXRhc2V0LCBzdHlsZXMsIG9wdHMgPSB7fSkge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkRhdGFzZXR8aW1wb3J0KFwiLi4vY29yZS9NdWx0aVJlc29sdXRpb25EYXRhc2V0XCIpLk11bHRpUmVzb2x1dGlvbkRhdGFzZXR9ICovXG4gICAgICAgIHRoaXMuZGF0YXNldCA9IGRhdGFzZXRcblxuICAgICAgICAvKiogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL1N0eWxlXCIpLlN0eWxlPn0gKi9cbiAgICAgICAgdGhpcy5zdHlsZXMgPSBzdHlsZXNcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCB3aGVuIHRoZSBkYXRhc2V0IGlzIGEgTXVsdGlSZXNvbHV0aW9uRGF0YXNldC5cbiAgICAgICAgICogSXQgZGVmaW5lcyB0aGUgbWluaW11bSBudW1iZXIgb2YgcGl4ZWxzIGEgZ3JpZCBjZWxsIHNob3VsZCBoYXZlIHRvIHNlbGVjdCB0aGUgZGF0YXNldCB0byBkaXNwbGF5IGJhc2VkIG9uIGl0cyByZXNvbHV0aW9uLlxuICAgICAgICAgKiBBIGxvdyB2YWx1ZSwgbWVhbnMgdGhhdCB0aGUgbWFwIHdpbGwgYmUgbW9yZSBkZXRhaWxsZWQgKHNtYWxsZXIgY2VsbHMpLlxuICAgICAgICAgKiBBIGhpZ2ggdmFsdWUsIG1lYW5zIHRoYXQgdGhlIG1hcCB3aWxsIGJlIGxlc3MgZGV0YWlsbGVkIChsYXJnZXIgY2VsbHMpLlxuICAgICAgICAgKiBUaGlzIHZhbHVlIHNob3VsZCBiZSBoaWdoZXIgdGhhbiAxLCBvdGhlcndpc2UgaXQgbWVhbnMgYSBncmlkIGNlbGwgaXMgc21hbGxlciB0aGFuIHRoZSBzY3JlZW4gcmVzb2x1dGlvbi5cbiAgICAgICAgICogRm9yIG1vcmUgY29tcGxleCBjZWxsIHJlcHJlc2VudGF0aW9ucyB0aGF0IHJlcXVpcmUgc29tZSBtb3JlIG1hcCBzcGFjZSwgdGhpcyB2YWx1ZSBzaG91bGQgYmUgaGlnaGVyLlxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm1pblBpeGVsc1BlckNlbGwgPSBvcHRzLm1pblBpeGVsc1BlckNlbGwgfHwgM1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZnVuY3Rpb24gcmV0dXJuaW5nIGNlbGwgaW5mb3JtYXRpb24gYXMgSFRNTC5cbiAgICAgICAgICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgdG9vbHRpcCBpbmZvcm1hdGlvbi5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsLCBudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jZWxsSW5mb0hUTUwgPSBvcHRzLmNlbGxJbmZvSFRNTCB8fCBHcmlkTGF5ZXIuZGVmYXVsdENlbGxJbmZvSFRNTFxuICAgIH1cblxuICAgIC8qKiAqL1xuICAgIGRyYXcoZ2VvQ2FudmFzLCBsZWdlbmQpIHtcbiAgICAgICAgLy9nZXQgem9vbSBsZXZlbFxuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuICAgICAgICBjb25zdCBjdHggPSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4XG5cbiAgICAgICAgLy9nZXQgbGF5ZXIgZGF0YXNldCBjb21wb25lbnRcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkRhdGFzZXR8dW5kZWZpbmVkfSAqL1xuICAgICAgICBjb25zdCBkc2MgPSB0aGlzLmdldERhdGFzZXQoeilcbiAgICAgICAgaWYgKCFkc2MpIHJldHVyblxuXG4gICAgICAgIC8vbGF1bmNoIGRhdGEgZG93bmxvYWQsIGlmIG5lY2Vzc2FyeVxuICAgICAgICBkc2MuZ2V0RGF0YShnZW9DYW52YXMuZXh0R2VvKVxuXG4gICAgICAgIC8vdXBkYXRlIGRhdGFzZXQgdmlldyBjYWNoZVxuICAgICAgICBkc2MudXBkYXRlVmlld0NhY2hlKGdlb0NhbnZhcy5leHRHZW8pXG5cbiAgICAgICAgLy9kcmF3IGNlbGxzLCBzdHlsZSBieSBzdHlsZVxuICAgICAgICBmb3IgKGNvbnN0IHMgb2YgdGhpcy5zdHlsZXMpIHtcbiAgICAgICAgICAgIC8vY2hlY2sgaWYgc3R5bGUgaXMgdmlzaWJsZVxuICAgICAgICAgICAgaWYgKHMudmlzaWJsZSAmJiAhcy52aXNpYmxlKHopKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3NldCBzdHlsZSBhbHBoYSBhbmQgYmxlbmQgbW9kZVxuICAgICAgICAgICAgLy9UT0RPOiBtdWx0aXBseSBieSBsYXllciBhbHBoYSA/XG4gICAgICAgICAgICBjdHguZ2xvYmFsQWxwaGEgPSBzLmFscGhhID8gcy5hbHBoYSh6KSA6IDEuMFxuICAgICAgICAgICAgaWYgKHMuYmxlbmRPcGVyYXRpb24pIGN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBzLmJsZW5kT3BlcmF0aW9uKHopXG5cbiAgICAgICAgICAgIC8vc2V0IGFmZmluIHRyYW5zZm9ybSB0byBkcmF3IHdpdGggZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzXG4gICAgICAgICAgICBnZW9DYW52YXMuc2V0Q2FudmFzVHJhbnNmb3JtKClcblxuICAgICAgICAgICAgLy9kcmF3IHdpdGggc3R5bGVcbiAgICAgICAgICAgIHMuZHJhdyhkc2MuZ2V0Vmlld0NhY2hlKCksIGdlb0NhbnZhcywgZHNjLmdldFJlc29sdXRpb24oKSlcblxuICAgICAgICAgICAgLy9kcmF3IHN0eWxlIGZpbHRlclxuICAgICAgICAgICAgaWYgKHMuZmlsdGVyQ29sb3IpIHMuZHJhd0ZpbHRlcihnZW9DYW52YXMpXG4gICAgICAgIH1cblxuICAgICAgICAvL2FkZCBsZWdlbmQgZWxlbWVudFxuICAgICAgICBpZiAobGVnZW5kKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHMgb2YgdGhpcy5zdHlsZXMpIHtcbiAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIHN0eWxlIGlzIHZpc2libGVcbiAgICAgICAgICAgICAgICBpZiAocy52aXNpYmxlICYmICFzLnZpc2libGUoeikpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgR3JpZExheWVyLmFkZExlZ2VuZHMobGVnZW5kLCBzLmxlZ2VuZHMpXG5cbiAgICAgICAgICAgICAgICAvL2Nhc2UgZm9yIHN0eWxlcyBvZiBzdHlsZXMsIGxpa2Uga2VybmVsIHNtb290aGluZ1xuICAgICAgICAgICAgICAgIC8vVE9ETyBkbyBiZXR0ZXJcbiAgICAgICAgICAgICAgICBpZiAoc1snc3R5bGVzJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzMiBvZiBzWydzdHlsZXMnXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMyLnZpc2libGUgJiYgIXMyLnZpc2libGUoeikpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICBHcmlkTGF5ZXIuYWRkTGVnZW5kcyhsZWdlbmQsIHMyLmxlZ2VuZHMpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBzdGF0aWMgYWRkTGVnZW5kcyhsZWdlbmRDb21wLCBsZykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShsZykpIGZvciAoY29uc3QgbGdfIG9mIGxnKSB0aGlzLmFkZExlZ2VuZHMobGVnZW5kQ29tcCwgbGdfKVxuICAgICAgICBlbHNlIGxlZ2VuZENvbXAubm9kZSgpLmFwcGVuZChsZy5kaXYubm9kZSgpKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgcmVsZXZhbnQgZGF0YXNldCBjb21wb25lbnQgZm9yIGEgc3BlY2lmaWVkIHpvb20uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gelxuICAgICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuRGF0YXNldHx1bmRlZmluZWR9XG4gICAgICogKi9cbiAgICBnZXREYXRhc2V0KHopIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YXNldC5nZXREYXRhc2V0KHosIHRoaXMubWluUGl4ZWxzUGVyQ2VsbClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQvZ2V0IHN0eWxlIHN0YWNrLlxuICAgICAqXG4gICAgICogQHBhcmFtIHt1bmRlZmluZWR8aW1wb3J0KFwiLi4vY29yZS9TdHlsZVwiKS5TdHlsZXxBcnJheS48aW1wb3J0KFwiLi4vY29yZS9TdHlsZVwiKS5TdHlsZT59IHN0eWxlc1xuICAgICAqIEByZXR1cm5zIHsgdGhpcyB8IEFycmF5LjxpbXBvcnQoXCIuLi9jb3JlL1N0eWxlXCIpLlN0eWxlPiB9XG4gICAgICovXG4gICAgc3R5bGVzXyhzdHlsZXMpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB0aGlzLnN0eWxlc1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHN0eWxlcykpIHRoaXMuc3R5bGVzID0gc3R5bGVzXG4gICAgICAgICAgICBlbHNlIHRoaXMuc3R5bGVzID0gW3N0eWxlc11cbiAgICAgICAgZWxzZSB0aGlzLnN0eWxlcyA9IGFyZ3VtZW50c1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IGZ1bmN0aW9uIHJldHVybmluZyBjZWxsIGluZm9ybWF0aW9uIGFzIEhUTUwuXG4gICAgICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgdG9vbHRpcCBpbmZvcm1hdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGx9IGNlbGxcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBkZWZhdWx0Q2VsbEluZm9IVE1MKGNlbGwpIHtcbiAgICAgICAgY29uc3QgYnVmID0gW11cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY2VsbCkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICd4JykgY29udGludWVcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICd5JykgY29udGludWVcbiAgICAgICAgICAgIGJ1Zi5wdXNoKCc8Yj4nLCBrZXksICc8L2I+JywgJyA6ICcsIGNlbGxba2V5XSwgJzxicj4nKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWYuam9pbignJylcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IExheWVyIH0gZnJvbSAnLi4vY29yZS9MYXllci5qcydcbmltcG9ydCB7IGNzdiB9IGZyb20gJ2QzLWZldGNoJ1xuXG4vKiogQSBsYWJlbC4gVGhlIG5hbWUgaXMgdGhlIHRleHQgdG8gc2hvdy4gKHgseSkgYXJlIHRoZSBjb29yZGluYXRlcyBpbiB0aGUgc2FtZSBDUlMgYXMgdGhlIGdyaWQuXG4gKiBAdHlwZWRlZiB7e25hbWU6IHN0cmluZywgeDpudW1iZXIsIHk6bnVtYmVyIH19IExhYmVsICovXG5cbi8qKlxuICogQSAoZ2VuZXJpYykgbGF5ZXIgZm9yIHBsYWNlbmFtZSBsYWJlbHMsIHRvIGJlIHNob3duIG9uIHRvcCBvZiB0aGUgZ3JpZCBsYXllcnMuXG4gKiBUaGUgaW5wdXQgaXMgYSBDU1YgZmlsZSB3aXRoIHRoZSBwb3NpdGlvbiAoeCwgeSkgb2YgdGhlIGxhYmVscyBhbmQgbmFtZSArIHNvbWUgb3RoZXIgaW5mbyBvbiB0aGUgbGFiZWwgaW1wb3J0YW5jZS5cbiAqIElmIHRoZSBsYWJlbCBkYXRhIGlzIG5vdCBpbiB0aGUgZXhwZWN0ZWQgZm9ybWF0IG9yIGluIHRoZSBzYW1lIENSUyBhcyB0aGUgZ3JpZCwgaXQgY2FuIGJlIGNvcnJlY3RlZCB3aXRoIHRoZSBcInByZXByb2Nlc3NcIiBmdW5jdGlvbi5cbiAqIFRoZSBzZWxlY3Rpb24gb2YgdGhlIGxhYmVsLCB0aGVpciBzdHlsZSAoZm9udCwgd2VpZ2h0LCBldGMuKSBhbmQgY29sb3IgY2FuIGJlIHNwZWNpZmllZCBkZXBlbmRpbmcgb24gdGhlaXIgaW1wb3J0YW5jZSBhbmQgdGhlIHpvb20gbGV2ZWwuXG4gKlxuICogQG1vZHVsZSBsYXllclxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgTGFiZWxMYXllciBleHRlbmRzIExheWVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIFVSTCBvZiB0aGUgbGFiZWwgZGF0YSwgYXMgQ1NWIGZpbGUuXG4gICAgICAgICAqIFRoZSBmaWxlIHNob3VsZCBjb250YWluIHRoZSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBsYWJlbCBzdWNoIGFzIHRoZSB0ZXh0LCB0aGUgcG9zaXRpb24gYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgZGlzcGxheSBvZiB0aGUgbGFiZWwgYWNjb3JkaW5nIHRvIHRoZSB6b29tIGxldmVsLlxuICAgICAgICAgKiBJZiBuZWNlc3NhcnksIHRoaXMgZGF0YSBjYW4gYmUgcmVmb3JtYXRlZCB3aXRoIHRoZSAncHJlcHJvY2VzcycgcGFyYW1ldGVyLlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnVybCA9IG9wdHMudXJsXG5cbiAgICAgICAgLyoqIFNwZWNpZnkgaWYgYW5kIGhvdyBhIGxhYmVsIHNob3VsZCBiZSBkcmF3biwgZGVwZW5kaW5nIG9uIGl0cyBpbXBvcnRhbmNlIGFuZCB0aGUgem9vbSBsZXZlbC5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKExhYmVsLG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnN0eWxlID0gb3B0cy5zdHlsZSB8fCAoKCkgPT4gJzEuMmVtIEFyaWFsJylcblxuICAgICAgICAvKiogU3BlY2lmeSB0aGUgbGFiZWwgY29sb3IsIGRlcGVuZGluZyBvbiBpdHMgaW1wb3J0YW5jZSBhbmQgdGhlIHpvb20gbGV2ZWwuXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihMYWJlbCxudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKG9wdHMuZGFyayA/ICgpID0+ICd3aGl0ZScgOiAoKSA9PiAnYmxhY2snKVxuXG4gICAgICAgIC8qKiBTcGVjaWZ5IHRoZSBsYWJlbCBoYWxvIGNvbG9yLCBkZXBlbmRpbmcgb24gaXRzIGltcG9ydGFuY2UgYW5kIHRoZSB6b29tIGxldmVsLlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oTGFiZWwsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuaGFsb0NvbG9yID0gb3B0cy5oYWxvQ29sb3IgfHwgKG9wdHMuZGFyayA/ICgpID0+ICdibGFjaycgOiAoKSA9PiAnd2hpdGUnKVxuXG4gICAgICAgIC8qKiBTcGVjaWZ5IHRoZSBsYWJlbCBoYWxvIHdpZHRoLCBkZXBlbmRpbmcgb24gaXRzIGltcG9ydGFuY2UgYW5kIHRoZSB6b29tIGxldmVsLlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oTGFiZWwsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuaGFsb1dpZHRoID0gb3B0cy5oYWxvV2lkdGggfHwgKCgpID0+IDIuNSlcblxuICAgICAgICAvKiogVGhlIGFuY2hvciB3aGVyZSB0byBkcmF3IHRoZSB0ZXh0LCBmcm9tIGxhYmVsIHBvc2l0aW9uLiBTZWUgSFRNTC1jYW52YXMgdGV4dEFsaWduIHByb3BlcnR5LlxuICAgICAgICAgKiBcImxlZnRcIiB8fCBcInJpZ2h0XCIgfHwgXCJjZW50ZXJcIiB8fCBcInN0YXJ0XCIgfHwgXCJlbmRcIlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7Q2FudmFzVGV4dEFsaWdufSAqL1xuICAgICAgICB0aGlzLnRleHRBbGlnbiA9IG9wdHMudGV4dEFsaWduIHx8ICdzdGFydCdcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxudW1iZXI+fSAqL1xuICAgICAgICB0aGlzLm9mZnNldFBpeCA9IG9wdHMub2Zmc2V0UGl4IHx8IFs1LCA1XVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHByZXByb2Nlc3MgdG8gcnVuIG9uIGVhY2ggbGFiZWwgYWZ0ZXIgbG9hZGluZy5cbiAgICAgICAgICogSXQgY2FuIGJlIHVzZWQgdG8gYXBwbHkgc29tZSBzcGVjaWZpYyB0cmVhdG1lbnQgYmVmb3JlLCBmb3JtYXQgdGhlIGxhYmVsIGRhdGEsIHByb2plY3QgY29vcmRpbmF0ZXMsIGV0Yy5cbiAgICAgICAgICogUmV0dXJuIGZhbHNlIGlmIHRoZSBsYWJlbCBzaG91bGQgbm90IGJlIGtlcHQuXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihMYWJlbCk6Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzID0gb3B0cy5wcmVwcm9jZXNzXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48TGFiZWw+IHwgdW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmxhYmVscyA9IHVuZGVmaW5lZFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnbm90TG9hZGVkJ1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgdGhlIGxhYmVsIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGRyYXcoZ2VvQ2FudmFzKSB7XG4gICAgICAgIC8vbG9hZCBsYWJlbHMsIGlmIG5vdCBkb25lIHlldC5cbiAgICAgICAgaWYgKCF0aGlzLmxhYmVscykge1xuICAgICAgICAgICAgdGhpcy5sb2FkKGdlb0NhbnZhcy5yZWRyYXcpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICAvL3RleHQgYWxpZ25cbiAgICAgICAgY3R4LnRleHRBbGlnbiA9IHRoaXMudGV4dEFsaWduIHx8ICdzdGFydCdcblxuICAgICAgICAvL2xpbmUgam9pbiBhbmQgY2FwXG4gICAgICAgIGN0eC5saW5lSm9pbiA9ICdiZXZlbCcgLy98fCBcInJvdW5kXCIgfHwgXCJtaXRlclwiO1xuICAgICAgICBjdHgubGluZUNhcCA9ICdidXR0JyAvL3x8IFwicm91bmRcIiB8fCBcInNxdWFyZVwiO1xuXG4gICAgICAgIC8vZHJhdyBpbiBwaXggY29vcmRpbmF0ZXNcbiAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuXG4gICAgICAgIC8vZHJhdyBsYWJlbHMsIG9uZSBieSBvbmVcbiAgICAgICAgZm9yIChjb25zdCBsYiBvZiB0aGlzLmxhYmVscykge1xuICAgICAgICAgICAgLy9nZXQgbGFiZWwgc3R5bGVcbiAgICAgICAgICAgIGNvbnN0IHN0ID0gdGhpcy5zdHlsZShsYiwgeilcbiAgICAgICAgICAgIGlmICghc3QpIGNvbnRpbnVlXG4gICAgICAgICAgICBjdHguZm9udCA9IHN0XG5cbiAgICAgICAgICAgIC8vY2hlY2sgbGFiZWwgd2l0aGluIHRoZSB2aWV3LCB0byBiZSBkcmF3blxuICAgICAgICAgICAgaWYgKCFnZW9DYW52YXMudG9EcmF3KGxiKSkgY29udGludWVcblxuICAgICAgICAgICAgLy9wb3NpdGlvblxuICAgICAgICAgICAgY29uc3QgeFAgPSBnZW9DYW52YXMuZ2VvVG9QaXhYKGxiLngpICsgdGhpcy5vZmZzZXRQaXhbMF1cbiAgICAgICAgICAgIGNvbnN0IHlQID0gZ2VvQ2FudmFzLmdlb1RvUGl4WShsYi55KSAtIHRoaXMub2Zmc2V0UGl4WzFdXG5cbiAgICAgICAgICAgIC8vbGFiZWwgc3Ryb2tlLCBmb3IgdGhlIGhhbG9cbiAgICAgICAgICAgIGlmICh0aGlzLmhhbG9Db2xvciAmJiB0aGlzLmhhbG9XaWR0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhjID0gdGhpcy5oYWxvQ29sb3IobGIsIHopXG4gICAgICAgICAgICAgICAgY29uc3QgaHcgPSB0aGlzLmhhbG9XaWR0aChsYiwgeilcbiAgICAgICAgICAgICAgICBpZiAoaGMgJiYgaHcgJiYgaHcgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGhjXG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSBod1xuICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlVGV4dChsYi5uYW1lLCB4UCwgeVApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL2xhYmVsIGZpbGxcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbG9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvcihsYiwgeilcbiAgICAgICAgICAgICAgICBpZiAoY29sKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBjb2xcbiAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxUZXh0KGxiLm5hbWUsIHhQLCB5UClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGRhdGEgZm9yIGxhYmVscywgZnJvbSBVUkwgdGhpcy51cmxcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk6dm9pZH0gY2FsbGJhY2tcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGFzeW5jIGxvYWQoY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLnVybCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZhaWxlZCBsb2FkaW5nIGxhYmVsczogTm8gVVJMIHNwZWNpZmllZC4gJyArIHRoaXMudXJsKVxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcbiAgICAgICAgICAgIHRoaXMubGFiZWxzID0gW11cbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBkYXRhIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIGlmICh0aGlzLmxvYWRpbmdTdGF0dXMgIT0gJ25vdExvYWRlZCcpIHJldHVyblxuXG4gICAgICAgIC8vbG9hZCBkYXRhXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdsb2FkaW5nJ1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvKiogQHR5cGUgeyBBcnJheS48TGFiZWw+IH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBjc3YodGhpcy51cmwpXG5cbiAgICAgICAgICAgIC8vcHJlcHJvY2Vzcy9maWx0ZXJcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXByb2Nlc3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVscyA9IFtdXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IHRoaXMucHJlcHJvY2VzcyhjKVxuICAgICAgICAgICAgICAgICAgICBpZiAoYiA9PSBmYWxzZSkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbHMucHVzaChjKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9zdG9yZSBsYWJlbHNcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVscyA9IGRhdGFcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2xvYWRlZCdcblxuICAgICAgICAgICAgLy9yZWRyYXdcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZhaWxlZCBsb2FkaW5nIGxhYmVscyBmcm9tICcgKyB0aGlzLnVybClcbiAgICAgICAgICAgIHRoaXMubGFiZWxzID0gW11cbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdmYWlsZWQnXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJy4uL2NvcmUvTGVnZW5kLmpzJ1xuXG4vKipcbiAqIEEgbGVnZW5kIGVsZW1lbnQgZm9yIGNvbG9yIGNhdGVncm9yaWVzLlxuICpcbiAqIEBtb2R1bGUgbGVnZW5kXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2xvckNhdGVnb3J5TGVnZW5kIGV4dGVuZHMgTGVnZW5kIHtcbiAgICAvKiogQHBhcmFtIHtPYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLy9jb2wvY2F0ZWdvcmllcyBhcnJheSwgaW4gZGlzcGxheSBvcmRlclxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge0FycmF5Ljxbc3RyaW5nLHN0cmluZ10+fSAqL1xuICAgICAgICB0aGlzLmNvbG9yTGFiZWwgPSBvcHRzLmNvbG9yTGFiZWwgfHwgW1snZ3JheScsICctJ11dXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb3JlL1N0eWxlLmpzXCIpLlNoYXBlfSAqL1xuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAnY2lyY2xlJ1xuICAgICAgICB0aGlzLmRpbWVuc2lvbiA9IG9wdHMuZGltZW5zaW9uIHx8IHsgcjogOCB9XG4gICAgICAgIHRoaXMuc3Ryb2tlQ29sb3IgPSBvcHRzLnN0cm9rZUNvbG9yIHx8ICdncmF5J1xuICAgICAgICB0aGlzLnN0cm9rZVdpZHRoID0gb3B0cy5zdHJva2VXaWR0aCB8fCAxXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICovXG4gICAgdXBkYXRlKCkge1xuICAgICAgICAvL2NsZWFyXG4gICAgICAgIHRoaXMuZGl2LnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpXG5cbiAgICAgICAgLy90aXRsZVxuICAgICAgICB0aGlzLm1ha2VUaXRsZSgpXG5cbiAgICAgICAgLy9jYXRlZ29yaWVzXG4gICAgICAgIGNvbnN0IG5iID0gdGhpcy5jb2xvckxhYmVsLmxlbmd0aFxuICAgICAgICBpZiAobmIgPT0gMCkgcmV0dXJuXG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjYXQgPSB0aGlzLmNvbG9yTGFiZWxbaV1cblxuICAgICAgICAgICAgLy9tYWtlIGRpdiBmb3IgY2F0ZWdvcnlcbiAgICAgICAgICAgIGNvbnN0IGQgPSB0aGlzLmRpdi5hcHBlbmQoJ2RpdicpXG4gICAgICAgICAgICAvL3RvIGVuYWJsZSB2ZXJ0aWNhbCBjZW50ZXJpbmdcbiAgICAgICAgICAgIC8vLnN0eWxlKFwicG9zaXRpb25cIiwgXCJyZWxhdGl2ZVwiKVxuXG4gICAgICAgICAgICBjb25zdCBzdyA9IHRoaXMuc3Ryb2tlV2lkdGhcblxuICAgICAgICAgICAgLy9kcmF3IGdyYXBoaWMgZWxlbWVudDogYm94IC8gY2lyY2xlXG4gICAgICAgICAgICBpZiAodGhpcy5zaGFwZSA9PT0gJ3NxdWFyZScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoID0gdGhpcy5kaW1lbnNpb24uaCB8fCAxNVxuICAgICAgICAgICAgICAgIGNvbnN0IHcgPSB0aGlzLmRpbWVuc2lvbi53IHx8IDIwXG4gICAgICAgICAgICAgICAgZC5hcHBlbmQoJ2RpdicpXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdpbmxpbmUnKVxuXG4gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3N2ZycpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHcgKyAyICogc3cpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoICsgMiAqIHN3KVxuXG4gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3JlY3QnKVxuICAgICAgICAgICAgICAgICAgICAuYXR0cigneCcsIHN3KVxuICAgICAgICAgICAgICAgICAgICAuYXR0cigneScsIHN3KVxuICAgICAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCB3KVxuICAgICAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgaClcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgY2F0WzBdKVxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuc3Ryb2tlQ29sb3IpXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaGFwZSA9PT0gJ2NpcmNsZScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy5kaW1lbnNpb24uciB8fCA4XG4gICAgICAgICAgICAgICAgY29uc3QgaCA9IDIgKiByICsgMiAqIHN3XG4gICAgICAgICAgICAgICAgZC5hcHBlbmQoJ2RpdicpXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdpbmxpbmUnKVxuXG4gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3N2ZycpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIGgpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoKVxuXG4gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ2NpcmNsZScpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdjeCcsIHIgKyBzdylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2N5JywgciArIHN3KVxuICAgICAgICAgICAgICAgICAgICAuYXR0cigncicsIHIpXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsIGNhdFswXSlcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLnN0cm9rZUNvbG9yKVxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIHRoaXMuc3Ryb2tlV2lkdGgpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaGFwZTonICsgdGhpcy5zaGFwZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy93cml0ZSBsYWJlbCB0ZXh0XG4gICAgICAgICAgICBkLmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgICAgICAvL3Nob3cgb24gcmlnaHQgb2YgZ3JhcGhpY1xuICAgICAgICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdpbmxpbmUnKVxuXG4gICAgICAgICAgICAgICAgLy9jZW50ZXIgdmVydGljYWxseVxuICAgICAgICAgICAgICAgIC8vLnN0eWxlKFwicG9zaXRpb25cIiwgXCJhYnNvbHV0ZVwiKS5zdHlsZShcInRvcFwiLCBcIjBcIikuc3R5bGUoXCJib3R0b21cIiwgXCIwXCIpXG5cbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3BhZGRpbmctbGVmdCcsICc1cHgnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5sYWJlbEZvbnRTaXplKVxuICAgICAgICAgICAgICAgIC50ZXh0KGNhdFsxXSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi4vY29yZS9MZWdlbmQuanMnXG5cbi8qKlxuICogQSBsZWdlbmQgZWxlbWVudCBmb3IgZGlzY3JldGUgY29sb3Igc3R5bGUuXG4gKiBJbnNwaXJhdGlvbjogaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0BkMy9jb2xvci1sZWdlbmRcbiAqXG4gKiBAbW9kdWxlIGxlZ2VuZFxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQ29sb3JEaXNjcmV0ZUxlZ2VuZCBleHRlbmRzIExlZ2VuZCB7XG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBAcHJpdmF0ZSBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL1N0eWxlJykuVmlld1NjYWxlKTpBcnJheS48c3RyaW5nPn0gKi9cbiAgICAgICAgdGhpcy5jb2xvcnMgPSBvcHRzLmNvbG9yc1xuICAgICAgICAvKiogQHByaXZhdGUgQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9TdHlsZScpLlZpZXdTY2FsZSk6QXJyYXkuPG51bWJlcj59ICovXG4gICAgICAgIHRoaXMuYnJlYWtzID0gb3B0cy5icmVha3NcblxuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAzMDBcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAxNVxuXG4gICAgICAgIHRoaXMudGlja1NpemUgPSBvcHRzLnRpY2tTaXplIHx8IDNcblxuICAgICAgICAvL2xhYmVsXG4gICAgICAgIHRoaXMuaW52ZXJ0ID0gb3B0cy5pbnZlcnRcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3t2aWV3U2NhbGU6aW1wb3J0KCcuLi9jb3JlL1N0eWxlJykuVmlld1NjYWxlfSB9IG9wdHNcbiAgICAgKi9cbiAgICB1cGRhdGUob3B0cykge1xuICAgICAgICAvL2NsZWFyXG4gICAgICAgIHRoaXMuZGl2LnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpXG5cbiAgICAgICAgLy90aXRsZVxuICAgICAgICB0aGlzLm1ha2VUaXRsZSgpXG5cbiAgICAgICAgLy9nZXQgY29sb3JzIGFuZCBicmVha3NcbiAgICAgICAgY29uc3QgY29sb3JzID0gdGhpcy5jb2xvcnMob3B0cy52aWV3U2NhbGUpXG4gICAgICAgIGNvbnN0IGJyZWFrcyA9IHRoaXMuYnJlYWtzKG9wdHMudmlld1NjYWxlKVxuICAgICAgICBpZiAoIWJyZWFrcykgcmV0dXJuXG5cbiAgICAgICAgLy9jbGFzc2VzXG4gICAgICAgIGNvbnN0IG5iID0gY29sb3JzLmxlbmd0aFxuICAgICAgICBpZiAobmIgPT0gMCkgcmV0dXJuXG4gICAgICAgIGNvbnN0IHcgPSB0aGlzLndpZHRoIC8gbmJcblxuICAgICAgICAvL21ha2Ugc3ZnIGVsZW1lbnRcbiAgICAgICAgY29uc3Qgc3ZnID0gdGhpcy5kaXZcbiAgICAgICAgICAgIC5hcHBlbmQoJ3N2ZycpXG4gICAgICAgICAgICAuYXR0cignd2lkdGgnLCB0aGlzLndpZHRoKVxuICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHRoaXMuaGVpZ2h0ICsgdGhpcy50aWNrU2l6ZSArIDIgKyAxMClcblxuICAgICAgICAvL2RyYXcgZ3JhcGhpYyBlbGVtZW50c1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5iOyBpKyspIHtcbiAgICAgICAgICAgIHN2Zy5hcHBlbmQoJ3JlY3QnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgaSAqIHcpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3knLCAwKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHcpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHRoaXMuaGVpZ2h0KVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsIGNvbG9yc1tpXSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdGljayBsaW5lXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbmI7IGkrKykge1xuICAgICAgICAgICAgc3ZnLmFwcGVuZCgnbGluZScpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gxJywgdyAqIGkpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kxJywgMClcbiAgICAgICAgICAgICAgICAuYXR0cigneDInLCB3ICogaSlcbiAgICAgICAgICAgICAgICAuYXR0cigneTInLCB0aGlzLmhlaWdodCArIHRoaXMudGlja1NpemUpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAnYmxhY2snKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9sYWJlbHNcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBuYjsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbGFiZWwgPSBicmVha3NbaSAtIDFdXG4gICAgICAgICAgICBpZiAoaXNOYU4obGFiZWwpIHx8IGxhYmVsID09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgICAgICAgIGlmICh0aGlzLmxhYmVsRm9ybWF0KSBsYWJlbCA9IHRoaXMubGFiZWxGb3JtYXQobGFiZWwpXG5cbiAgICAgICAgICAgIC8vbGFiZWxcbiAgICAgICAgICAgIHN2Zy5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsICd0aWNrbGFiZWxfJyArIGkpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCB3ICogaSlcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIHRoaXMuaGVpZ2h0ICsgdGhpcy50aWNrU2l6ZSArIDIpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLmxhYmVsRm9udFNpemUpXG4gICAgICAgICAgICAgICAgLy8uc3R5bGUoXCJmb250LXdlaWdodFwiLCBcImJvbGRcIilcbiAgICAgICAgICAgICAgICAvLy5zdHlsZShcImZvbnQtZmFtaWx5XCIsIFwiQXJpYWxcIilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdhbGlnbm1lbnQtYmFzZWxpbmUnLCAndG9wJylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2RvbWluYW50LWJhc2VsaW5lJywgJ2hhbmdpbmcnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgncG9pbnRlci1ldmVudHMnLCAnbm9uZScpXG4gICAgICAgICAgICAgICAgLnRleHQobGFiZWwpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJy4uL2NvcmUvTGVnZW5kLmpzJ1xuXG4vKipcbiAqIEEgbGVnZW5kIGVsZW1lbnQgZm9yIGNvbnRpbnVvdXMgY29sb3Igc3R5bGUuXG4gKiBJbnNwaXJhdGlvbjogaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0BkMy9jb2xvci1sZWdlbmRcbiAqXG4gKiBAbW9kdWxlIGxlZ2VuZFxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQ29sb3JMZWdlbmQgZXh0ZW5kcyBMZWdlbmQge1xuICAgIC8qKiBAcGFyYW0ge09iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvL2EgZnVuY3Rpb24gWzAsMV0tPmNvbG9yIGZvciBjb250aW51b3VzIGNvbG9ycy5cbiAgICAgICAgLy9pdCBjYW4gdGFrZSBhcyBzZWNvbmQgYXJndW1lbnQgdGhlIHZpZXdzY2FsZS5cbiAgICAgICAgdGhpcy5jb2xvclNjYWxlID0gb3B0cy5jb2xvclNjYWxlXG5cbiAgICAgICAgLy9mdW5jdGlvbiAodFswLDFdKSAtPiB2YWx1ZSAoZm9yIGxhYmVsIHRleHQpXG4gICAgICAgIC8vaXQgY2FuIHRha2UgYXMgc2Vjb25kIGFyZ3VtZW50IHRoZSB2aWV3c2NhbGUuXG4gICAgICAgIHRoaXMudGV4dFNjYWxlID0gb3B0cy50ZXh0U2NhbGUgfHwgKCh0KSA9PiB0KVxuXG4gICAgICAgIHRoaXMubWFyZ2luID0gb3B0cy5tYXJnaW4gfHwgNVxuXG4gICAgICAgIC8vcmVwbGFjZSB3aXRoIGxhYmVscyA/XG4gICAgICAgIHRoaXMudGlja1NpemUgPSBvcHRzLnRpY2tTaXplIHx8IDZcbiAgICAgICAgdGhpcy50aWNrcyA9IG9wdHMudGlja3MgfHwgTWF0aC5mbG9vcih0aGlzLndpZHRoIC8gNTApXG4gICAgICAgIHRoaXMudGlja0Zvcm1hdCA9IG9wdHMudGlja0Zvcm1hdFxuICAgICAgICB0aGlzLnRpY2tVbml0ID0gb3B0cy50aWNrVW5pdFxuXG4gICAgICAgIHRoaXMuZm9udFNpemUgPSBvcHRzLmZvbnRTaXplIHx8ICcwLjhlbSdcbiAgICAgICAgdGhpcy5pbnZlcnQgPSBvcHRzLmludmVydFxuXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8IDMwMFxuICAgICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0IHx8IDE1XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHt7dmlld1NjYWxlOmltcG9ydCgnLi4vY29yZS9TdHlsZScpLlZpZXdTY2FsZX0gfSBvcHRzXG4gICAgICovXG4gICAgdXBkYXRlKG9wdHMpIHtcbiAgICAgICAgLy9jbGVhclxuICAgICAgICB0aGlzLmRpdi5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxuXG4gICAgICAgIC8vdGl0bGVcbiAgICAgICAgdGhpcy5tYWtlVGl0bGUoKVxuXG4gICAgICAgIGNvbnN0IHN2Z1cgPSB0aGlzLndpZHRoICsgMiAqIHRoaXMubWFyZ2luXG4gICAgICAgIGNvbnN0IHN2Z0ggPSB0aGlzLmhlaWdodCArIHRoaXMubWFyZ2luICsgdGhpcy50aWNrU2l6ZSArIDEwXG4gICAgICAgIGNvbnN0IHN2ZyA9IHRoaXMuZGl2LmFwcGVuZCgnc3ZnJykuYXR0cignd2lkdGgnLCBzdmdXKS5hdHRyKCdoZWlnaHQnLCBzdmdIKVxuICAgICAgICAvLyAgPHJlY3Qgd2lkdGg9XCIzMDBcIiBoZWlnaHQ9XCIxMDBcIiBzdHlsZT1cImZpbGw6cmdiKDAsMCwyNTUpO3N0cm9rZS13aWR0aDozO3N0cm9rZTpyZ2IoMCwwLDApXCIgLz5cblxuICAgICAgICBjb25zdCBnID0gc3ZnLmFwcGVuZCgnZycpLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIHRoaXMubWFyZ2luICsgJyAnICsgMCArICcpJylcblxuICAgICAgICAvL2RyYXcgY29sb3IgYmFyXG4gICAgICAgIGNvbnN0IHcgPSB0aGlzLndpZHRoLFxuICAgICAgICAgICAgaCA9IHRoaXMuaGVpZ2h0XG4gICAgICAgIGNvbnN0IHN0ZXAgPSA1XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdzsgaSArPSBzdGVwKSB7XG4gICAgICAgICAgICBsZXQgdCA9IGkgLyAodyAtIDEpXG4gICAgICAgICAgICBpZiAodGhpcy5pbnZlcnQpIHQgPSAxIC0gdFxuICAgICAgICAgICAgZy5hcHBlbmQoJ3JlY3QnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgaSlcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIDApXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgc3RlcClcbiAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgaClcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCB0aGlzLmNvbG9yU2NhbGUodCwgb3B0cy52aWV3U2NhbGUpKVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRpY2tzOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB0ID0gaSAvICh0aGlzLnRpY2tzIC0gMSlcblxuICAgICAgICAgICAgLy90aWNrIGxpbmVcbiAgICAgICAgICAgIGcuYXBwZW5kKCdsaW5lJylcbiAgICAgICAgICAgICAgICAuYXR0cigneDEnLCB3ICogdClcbiAgICAgICAgICAgICAgICAuYXR0cigneTEnLCAwKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd4MicsIHcgKiB0KVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5MicsIGggKyB0aGlzLnRpY2tTaXplKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJ2JsYWNrJylcblxuICAgICAgICAgICAgLy9wcmVwYXJlIHRpY2sgbGFiZWxcbiAgICAgICAgICAgIGcuYXBwZW5kKCd0ZXh0JylcbiAgICAgICAgICAgICAgICAuYXR0cignaWQnLCAndGlja2xhYmVsXycgKyBpKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgdyAqIHQpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3knLCBoICsgdGhpcy50aWNrU2l6ZSArIDIpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLmZvbnRTaXplKVxuICAgICAgICAgICAgICAgIC8vLnN0eWxlKFwiZm9udC13ZWlnaHRcIiwgXCJib2xkXCIpXG4gICAgICAgICAgICAgICAgLy8uc3R5bGUoXCJmb250LWZhbWlseVwiLCBcIkFyaWFsXCIpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsIGkgPT0gMCA/ICdzdGFydCcgOiBpID09IHRoaXMudGlja3MgLSAxID8gJ2VuZCcgOiAnbWlkZGxlJylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2FsaWdubWVudC1iYXNlbGluZScsICd0b3AnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZG9taW5hbnQtYmFzZWxpbmUnLCAnaGFuZ2luZycpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdwb2ludGVyLWV2ZW50cycsICdub25lJylcbiAgICAgICAgICAgIC8vLnRleHQoXCItXCIpXG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSB0aWNrIGxhYmVsc1xuXG4gICAgICAgIC8vbGFiZWwgdGV4dCBmb3JtYXRcbiAgICAgICAgY29uc3QgZiA9IHRoaXMudGlja0Zvcm1hdCAmJiB0aGlzLnRpY2tGb3JtYXQgIT0gJ3RleHQnID8gdGhpcy50aWNrRm9ybWF0IDogKHYpID0+IHZcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRpY2tzOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB0ID0gaSAvICh0aGlzLnRpY2tzIC0gMSlcblxuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMudGV4dFNjYWxlKHQsIG9wdHMudmlld1NjYWxlKVxuICAgICAgICAgICAgY29uc3QgdGV4dCA9ICh2ID8gZih2KSA6ICcwJykgKyAodGhpcy50aWNrVW5pdCA/IHRoaXMudGlja1VuaXQgOiAnJylcbiAgICAgICAgICAgIGlmICh0ZXh0ID09IHVuZGVmaW5lZCkgY29udGludWVcblxuICAgICAgICAgICAgLy90aWNrIGxhYmVsXG4gICAgICAgICAgICB0aGlzLmRpdi5zZWxlY3QoJyMnICsgJ3RpY2tsYWJlbF8nICsgaSkudGV4dCh0ZXh0KVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBMZWdlbmQgfSBmcm9tICcuLi9jb3JlL0xlZ2VuZC5qcydcblxuLyoqXG4gKiBBIGxlZ2VuZCBlbGVtZW50IGZvciBzZWdtZW50IG9yaWVudGF0aW9uLlxuICpcbiAqIEBtb2R1bGUgbGVnZW5kXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBPcmllbnRhdGlvbkxlZ2VuZCBleHRlbmRzIExlZ2VuZCB7XG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8vb3JpZW50YXRpb25cbiAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IG9wdHMub3JpZW50YXRpb24gfHwgMFxuICAgICAgICAvL2NvbG9yXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgocmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA9PiAnZ3JheScpXG4gICAgICAgIC8vd2lkdGhcbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgKChyZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpID0+IDMgKiB6KVxuICAgICAgICAvL2xlbmd0aFxuICAgICAgICB0aGlzLmxlbmd0aCA9IG9wdHMubGVuZ3RoIHx8ICgocmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA9PiByZXNvbHV0aW9uKVxuXG4gICAgICAgIC8vbGFiZWxcbiAgICAgICAgdGhpcy5sYWJlbCA9IG9wdHMubGFiZWwgfHwgJy0nXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHt7IHN0eWxlOiBpbXBvcnQoXCIuLi9zdHlsZS9TZWdtZW50U3R5bGUuanNcIikuU2VnbWVudFN0eWxlLCByZXNvbHV0aW9uOiBudW1iZXIsIHo6IG51bWJlciwgdmlld1NjYWxlOm9iamVjdCB9fSBvcHRzXG4gICAgICovXG4gICAgdXBkYXRlKG9wdHMpIHtcbiAgICAgICAgLy9jbGVhclxuICAgICAgICB0aGlzLmRpdi5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxuXG4gICAgICAgIC8vdGl0bGVcbiAgICAgICAgdGhpcy5tYWtlVGl0bGUoKVxuXG4gICAgICAgIGNvbnN0IGQgPSB0aGlzLmRpdi5hcHBlbmQoJ2RpdicpXG5cbiAgICAgICAgLy9jb21wdXRlIHNlZ21lbnQgY29sb3IsIHdpZHRoIGFuZCBsZW5ndGhcbiAgICAgICAgY29uc3QgY29sb3IgPSB0aGlzLmNvbG9yKG9wdHMucmVzb2x1dGlvbiwgb3B0cy56LCBvcHRzLnZpZXdTY2FsZSlcbiAgICAgICAgY29uc3Qgd2lkdGhQaXggPSB0aGlzLndpZHRoKG9wdHMucmVzb2x1dGlvbiwgb3B0cy56LCBvcHRzLnZpZXdTY2FsZSkgLyBvcHRzLnpcbiAgICAgICAgY29uc3QgbGVuZ3RoUGl4ID0gdGhpcy5sZW5ndGgob3B0cy5yZXNvbHV0aW9uLCBvcHRzLnosIG9wdHMudmlld1NjYWxlKSAvIG9wdHMuelxuXG4gICAgICAgIC8vZHJhdyBTVkcgc2VnbWVudFxuICAgICAgICBjb25zdCBzdmdTID0gTWF0aC5tYXgobGVuZ3RoUGl4LCB3aWR0aFBpeClcbiAgICAgICAgY29uc3Qgc3ZnID0gZC5hcHBlbmQoJ3N2ZycpLmF0dHIoJ3dpZHRoJywgc3ZnUykuYXR0cignaGVpZ2h0Jywgc3ZnUykuc3R5bGUoJycsICdpbmxpbmUtYmxvY2snKVxuXG4gICAgICAgIGNvbnN0IGNvcyA9IE1hdGguY29zKCgtdGhpcy5vcmllbnRhdGlvbiAqIE1hdGguUEkpIC8gMTgwKVxuICAgICAgICBjb25zdCBzaW4gPSBNYXRoLnNpbigoLXRoaXMub3JpZW50YXRpb24gKiBNYXRoLlBJKSAvIDE4MClcbiAgICAgICAgY29uc3QgZGMgPSBzdmdTICogMC41LFxuICAgICAgICAgICAgbDIgPSBsZW5ndGhQaXggKiAwLjVcbiAgICAgICAgc3ZnLmFwcGVuZCgnbGluZScpXG4gICAgICAgICAgICAuYXR0cigneDEnLCBkYyAtIGNvcyAqIGwyKVxuICAgICAgICAgICAgLmF0dHIoJ3kxJywgZGMgLSBzaW4gKiBsMilcbiAgICAgICAgICAgIC5hdHRyKCd4MicsIGRjICsgY29zICogbDIpXG4gICAgICAgICAgICAuYXR0cigneTInLCBkYyArIHNpbiAqIGwyKVxuICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCBjb2xvcilcbiAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgd2lkdGhQaXgpXG5cbiAgICAgICAgLy9sYWJlbFxuICAgICAgICBkLmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdpbmxpbmUnKVxuICAgICAgICAgICAgLnN0eWxlKCdwYWRkaW5nLWxlZnQnLCAnNXB4JylcbiAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5sYWJlbEZvbnRTaXplKVxuICAgICAgICAgICAgLnRleHQodGhpcy5sYWJlbCArICh0aGlzLmxhYmVsVW5pdFRleHQgPyAnICcgOiAnJykgKyB0aGlzLmxhYmVsVW5pdFRleHQpXG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSBvcmllbnRhdGlvbnNcbiAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz59IGxhYmVsc1xuICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAqIEByZXR1cm5zICB7IEFycmF5LjxPcmllbnRhdGlvbkxlZ2VuZD4gfVxuICovXG5leHBvcnQgZnVuY3Rpb24gb3JpZW50YXRpb25MZWdlbmQob3JpZW50YXRpb25zLCBsYWJlbHMsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGxlZ2VuZHMgPSBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3JpZW50YXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG9wdHMudGl0bGUgPSBpID09IDAgPyBvcHRzLnRpdGxlIDogdW5kZWZpbmVkXG4gICAgICAgIG9wdHMub3JpZW50YXRpb24gPSBvcmllbnRhdGlvbnNbaV1cbiAgICAgICAgb3B0cy5sYWJlbCA9IGxhYmVsc1tpXVxuICAgICAgICBsZWdlbmRzLnB1c2gobmV3IE9yaWVudGF0aW9uTGVnZW5kKG9wdHMpKVxuICAgIH1cbiAgICByZXR1cm4gbGVnZW5kc1xufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBMZWdlbmQgfSBmcm9tICcuLi9jb3JlL0xlZ2VuZC5qcydcbmltcG9ydCB7IG5pY2UgfSBmcm9tICcuLi91dGlscy91dGlscy5qcydcbmltcG9ydCB7IG1heCB9IGZyb20gJ2QzLWFycmF5J1xuXG4vKipcbiAqIEEgbGVnZW5kIGVsZW1lbnQgZm9yIHByb3BvcnRpb25hbCBzeW1ib2xzLlxuICpcbiAqIEBtb2R1bGUgbGVnZW5kXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTaXplTGVnZW5kIGV4dGVuZHMgTGVnZW5kIHtcbiAgICAvKiogQHBhcmFtIHtPYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB0ZXh0IGxhYmVsLCBmcm9tIHRoZSB2aWV3IHNjYWxlIGFuZCBsaXN0IG9mIGNlbGxzLCByZXNvbHV0aW9uIGFuZCB6b29tXG4gICAgICAgICAqICBAdHlwZSB7IGZ1bmN0aW9uKG9iamVjdCwgQXJyYXkuPGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbD4sIG51bWJlciwgbnVtYmVyKToobnVtYmVyfHN0cmluZykgfSAqL1xuICAgICAgICB0aGlzLmxhYmVsID0gb3B0cy5sYWJlbCB8fCB1bmRlZmluZWRcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgdGhlIGxlZ2VuZCBzeW1ib2wsIGluIGdlbyBVb00sIGZyb20gdGhlIHZpZXdzY2FsZSwgcmVzb2x1dGlvbiBhbmQgem9vbVxuICAgICAgICAgKiAgQHR5cGUgeyBmdW5jdGlvbihvYmplY3QsIG51bWJlciwgbnVtYmVyKTpudW1iZXIgfSAqL1xuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgfHwgdW5kZWZpbmVkXG5cbiAgICAgICAgLy9zeW1ib2xcbiAgICAgICAgLyoqICBAdHlwZSB7KGltcG9ydChcIi4uL2NvcmUvU3R5bGVcIikuU2hhcGUpfFwibGluZVwifSAqL1xuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAnY2lyY2xlJ1xuXG4gICAgICAgIC8vZ2VuZXJhbCBjYXNlXG4gICAgICAgIHRoaXMuZmlsbENvbG9yID0gb3B0cy5maWxsQ29sb3IgfHwgJ25vbmUnXG4gICAgICAgIHRoaXMuc3Ryb2tlQ29sb3IgPSBvcHRzLnN0cm9rZUNvbG9yIHx8ICdncmF5J1xuICAgICAgICB0aGlzLnN0cm9rZVdpZHRoID0gb3B0cy5zdHJva2VXaWR0aCB8fCAxXG5cbiAgICAgICAgLy9mb3IgbGluZSBzaGFwZVxuICAgICAgICAvL1RPRE8gdGhpcy5vcmllbnRhdGlvbiA9IG9wdHMub3JpZW50YXRpb24gfHwgMFxuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAnZ3JheSdcbiAgICAgICAgdGhpcy5sZW5ndGggPSBvcHRzLmxlbmd0aCB8fCAoKHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgPT4gcmVzb2x1dGlvbilcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3sgdmlld1NjYWxlOm9iamVjdCwgcmVzb2x1dGlvbjogbnVtYmVyLCB6Om51bWJlciwgY2VsbHM6QXJyYXkuPGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbD4gfX0gb3B0c1xuICAgICAqL1xuICAgIHVwZGF0ZShvcHRzKSB7XG4gICAgICAgIC8vY2xlYXJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcblxuICAgICAgICAvL3RpdGxlXG4gICAgICAgIHRoaXMubWFrZVRpdGxlKClcblxuICAgICAgICAvL2dldCBsYWJlbC4gTWF5IG5vdCBiZSBhIG51bWJlciAoISlcbiAgICAgICAgbGV0IGxhYmVsID0gdGhpcy5sYWJlbChvcHRzLnZpZXdTY2FsZSwgb3B0cy5jZWxscywgb3B0cy5yZXNvbHV0aW9uLCBvcHRzLnopXG5cbiAgICAgICAgLy9jb21wdXRlIHNpemUgb2Ygc3ltYm9sLCBpbiBwaXhcbiAgICAgICAgbGV0IHNpemVQaXhcbiAgICAgICAgaWYgKHRoaXMuc2l6ZSkgc2l6ZVBpeCA9IHRoaXMuc2l6ZShvcHRzLnZpZXdTY2FsZSwgb3B0cy5yZXNvbHV0aW9uLCBvcHRzLnopIC8gb3B0cy56XG4gICAgICAgIGVsc2Ugc2l6ZVBpeCA9IG9wdHMudmlld1NjYWxlKCtsYWJlbCkgLyBvcHRzLnpcbiAgICAgICAgaWYgKCFzaXplUGl4KSByZXR1cm5cblxuICAgICAgICAvL2Zvcm1hdCBsYWJlbCwgaWYgc3BlY2lmaWVkIGFuZCBwb3NzaWJsZVxuICAgICAgICBpZiAodGhpcy5sYWJlbEZvcm1hdCAmJiAhaXNOYU4oK2xhYmVsKSkgbGFiZWwgPSB0aGlzLmxhYmVsRm9ybWF0KGxhYmVsKVxuXG4gICAgICAgIGNvbnN0IGQgPSB0aGlzLmRpdi5hcHBlbmQoJ2RpdicpXG4gICAgICAgIC8vdG8gZW5hYmxlIHZlcnRpY2FsIGNlbnRlcmluZ1xuICAgICAgICAvLy5zdHlsZShcInBvc2l0aW9uXCIsIFwicmVsYXRpdmVcIilcblxuICAgICAgICAvL2RlZmF1bHQgc3ZnIGNvbnN0cnVjdGlvbiwgZm9yIHNxdWFyZSBhbmQgY2lyY2xlXG4gICAgICAgIGNvbnN0IHN2ZyA9ICgpID0+XG4gICAgICAgICAgICBkXG4gICAgICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCBzaXplUGl4ICsgdGhpcy5zdHJva2VXaWR0aCArIDIpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHNpemVQaXggKyB0aGlzLnN0cm9rZVdpZHRoICsgMilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJycsICdpbmxpbmUtYmxvY2snKVxuXG4gICAgICAgIGlmICh0aGlzLnNoYXBlID09PSAnc3F1YXJlJykge1xuICAgICAgICAgICAgc3ZnKClcbiAgICAgICAgICAgICAgICAuYXBwZW5kKCdyZWN0JylcbiAgICAgICAgICAgICAgICAuYXR0cigneCcsIDApXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3knLCAwKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHNpemVQaXgpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHNpemVQaXgpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgdGhpcy5maWxsQ29sb3IpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLnN0cm9rZUNvbG9yKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnY2lyY2xlJykge1xuICAgICAgICAgICAgLy8gPGNpcmNsZSBjeD1cIjUwXCIgY3k9XCI1MFwiIHI9XCI0MFwiIHN0cm9rZT1cImJsYWNrXCIgc3Ryb2tlLXdpZHRoPVwiM1wiIGZpbGw9XCJyZWRcIiAvPlxuICAgICAgICAgICAgY29uc3QgciA9IChzaXplUGl4ICsgdGhpcy5zdHJva2VXaWR0aCkgKiAwLjVcbiAgICAgICAgICAgIHN2ZygpXG4gICAgICAgICAgICAgICAgLmFwcGVuZCgnY2lyY2xlJylcbiAgICAgICAgICAgICAgICAuYXR0cignY3gnLCByICsgMSlcbiAgICAgICAgICAgICAgICAuYXR0cignY3knLCByICsgMSlcbiAgICAgICAgICAgICAgICAuYXR0cigncicsIHIpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgdGhpcy5maWxsQ29sb3IpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLnN0cm9rZUNvbG9yKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnZG9udXQnKSB7XG4gICAgICAgICAgICAvL1RPRE9cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnZGlhbW9uZCcpIHtcbiAgICAgICAgICAgIC8vVE9ET1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hhcGUgPT09ICdsaW5lJykge1xuICAgICAgICAgICAgLy9nZXQgc2VnbWVudCBsZW5ndGhcbiAgICAgICAgICAgIGxldCBsZW5ndGhQaXggPSB0aGlzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8gdGhpcy5sZW5ndGgob3B0cy5yZXNvbHV0aW9uLCBvcHRzLnosIG9wdHMudmlld1NjYWxlKVxuICAgICAgICAgICAgICAgIDogb3B0cy5yZXNvbHV0aW9uXG4gICAgICAgICAgICBsZW5ndGhQaXggLz0gb3B0cy56XG5cbiAgICAgICAgICAgIGNvbnN0IHN2ZyA9IGRcbiAgICAgICAgICAgICAgICAuYXBwZW5kKCdzdmcnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIGxlbmd0aFBpeClcbiAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0Jywgc2l6ZVBpeClcbiAgICAgICAgICAgICAgICAuc3R5bGUoJycsICdpbmxpbmUtYmxvY2snKVxuXG4gICAgICAgICAgICAvL1RPRE8gb3JpZW50YXRpb25cbiAgICAgICAgICAgIC8vPGxpbmUgeDE9XCIwXCIgeTE9XCIwXCIgeDI9XCIyMDBcIiB5Mj1cIjIwMFwiIHN0eWxlPVwic3Ryb2tlOnJnYigyNTUsMCwwKTtzdHJva2Utd2lkdGg6MlwiIC8+XG4gICAgICAgICAgICBzdmcuYXBwZW5kKCdsaW5lJylcbiAgICAgICAgICAgICAgICAuYXR0cigneDEnLCAwKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5MScsIHNpemVQaXggLyAyKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd4MicsIGxlbmd0aFBpeClcbiAgICAgICAgICAgICAgICAuYXR0cigneTInLCBzaXplUGl4IC8gMilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuY29sb3IpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCBzaXplUGl4KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNoYXBlOicgKyB0aGlzLnNoYXBlKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9sYWJlbFxuICAgICAgICBkLmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdpbmxpbmUnKVxuICAgICAgICAgICAgLnN0eWxlKCdwYWRkaW5nLWxlZnQnLCAnNXB4JylcbiAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5sYWJlbEZvbnRTaXplKVxuICAgICAgICAgICAgLnRleHQobGFiZWwgKyAodGhpcy5sYWJlbFVuaXRUZXh0ID8gJyAnIDogJycpICsgdGhpcy5sYWJlbFVuaXRUZXh0KVxuICAgIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSB2YWx1ZXNcbiAqIEBwYXJhbSB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ9IHNpemVcbiAqIEBwYXJhbSB7IG9iamVjdCB9IG9wdHNcbiAqIEByZXR1cm5zIHtBcnJheS48U2l6ZUxlZ2VuZD59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaXplTGVnZW5kKHZhbHVlcywgc2l6ZSwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgbGVnZW5kcyA9IFtdXG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgIG9wdHMudGl0bGUgPSB2YWx1ZSA9PSB2YWx1ZXNbMF0gPyBvcHRzLnRpdGxlIDogdW5kZWZpbmVkXG4gICAgICAgIG9wdHMuc2l6ZSA9ICgpID0+IHNpemUodmFsdWUpXG4gICAgICAgIG9wdHMubGFiZWwgPSAoKSA9PiB2YWx1ZVxuICAgICAgICBsZWdlbmRzLnB1c2gobmV3IFNpemVMZWdlbmQob3B0cykpXG4gICAgfVxuICAgIHJldHVybiBsZWdlbmRzXG59XG5cbi8qKlxuICogQHBhcmFtIHsgZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsKTpudW1iZXIgfSB2YWx1ZVxuICogQHBhcmFtIHsqfSBvcHRzXG4gKiBAcmV0dXJucyB7QXJyYXkuPFNpemVMZWdlbmQ+fVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2l6ZUxlZ2VuZFZpZXdTY2FsZSh2YWx1ZSwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgayA9IG9wdHMuayB8fCBbMC45LCAwLjUsIDAuMiwgMC4wNV1cbiAgICBjb25zdCBsZWdlbmRzID0gW11cbiAgICBmb3IgKGxldCBrXyBvZiBrKSB7XG4gICAgICAgIG9wdHMudGl0bGUgPSBrXyA9PSBrWzBdID8gb3B0cy50aXRsZSA6IHVuZGVmaW5lZFxuICAgICAgICBvcHRzLmxhYmVsID0gKHZpZXdTY2FsZSwgY2VsbHMpID0+IG5pY2Uoa18gKiBtYXgoY2VsbHMsIHZhbHVlKSlcbiAgICAgICAgbGVnZW5kcy5wdXNoKG5ldyBTaXplTGVnZW5kKG9wdHMpKVxuICAgIH1cbiAgICByZXR1cm4gbGVnZW5kc1xufVxuXG4vKipcbiAqIEEgZnVuY3Rpb24gd2hpY2ggcmV0dXJuIGEgc3RhY2sgb2Ygc2l6ZSBsZWdlbmRzIGZvciBhIGRpc2NyZXRlIGNsYXNzaWZpY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7IEFycmF5LjxudW1iZXI+IH0gYnJlYWtzXG4gKiBAcGFyYW0geyBBcnJheS48bnVtYmVyPiB9IHNpemVzXG4gKiBAcGFyYW0geyBvYmplY3QgfSBvcHRzXG4gKiBAcmV0dXJucyB7QXJyYXkuPFNpemVMZWdlbmQ+fVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2l6ZURpc2NyZXRlTGVnZW5kKGJyZWFrcywgc2l6ZXMsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGYgPSBvcHRzLmxhYmVsRm9ybWF0IHx8ICgoeCkgPT4geClcbiAgICBjb25zdCBsYWJlbFRleHQgPSBvcHRzLmxhYmVsVGV4dCB8fCBkZWZhdWx0TGFiZWxUZXh0KGYpXG4gICAgY29uc3QgbGVnZW5kcyA9IFtdXG4gICAgZm9yIChsZXQgaSA9IHNpemVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIG9wdHMudGl0bGUgPSBpID09IHNpemVzLmxlbmd0aCAtIDEgPyBvcHRzLnRpdGxlIDogdW5kZWZpbmVkXG4gICAgICAgIG9wdHMuc2l6ZSA9ICgpID0+IHNpemVzW2ldXG4gICAgICAgIG9wdHMubGFiZWwgPSAoKSA9PiBsYWJlbFRleHQoYnJlYWtzW2kgLSAxXSwgYnJlYWtzW2ldKVxuICAgICAgICBsZWdlbmRzLnB1c2gobmV3IFNpemVMZWdlbmQob3B0cykpXG4gICAgfVxuICAgIHJldHVybiBsZWdlbmRzXG59XG5cbi8qKlxuICogQSBmdW5jdGlvbiB3aGljaCByZXR1cm4gYSBzdGFjayBvZiBzaXplIGxlZ2VuZHMgZm9yIGEgZGlzY3JldGUgY2xhc3NpZmljYXRpb24gdXNpbmcgYSB2aWV3c2NhbGUuXG4gKiBAcGFyYW0geyBudW1iZXIgfSBjbGFzc051bWJlclxuICogQHBhcmFtIHsgb2JqZWN0IH0gb3B0c1xuICogQHJldHVybnMge0FycmF5LjxTaXplTGVnZW5kPn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpemVEaXNjcmV0ZVZpZXdTY2FsZUxlZ2VuZChjbGFzc051bWJlciwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgZiA9IG9wdHMubGFiZWxGb3JtYXQgfHwgKCh4KSA9PiB4KVxuICAgIGNvbnN0IGxhYmVsVGV4dCA9IG9wdHMubGFiZWxUZXh0IHx8IGRlZmF1bHRMYWJlbFRleHQoZilcbiAgICBjb25zdCBsZWdlbmRzID0gW11cbiAgICBjb25zdCB2aWV3U2NhbGVGdW4gPSBvcHRzLnZpZXdTY2FsZUZ1biB8fCAoKHQpID0+IHQpIC8vVE9ETyBkbyBpdCBkaWZmZXJlbnRseT8gQXQgc2l6ZWxlZ2VuZCBsZXZlbCAhXG4gICAgZm9yIChsZXQgaSA9IGNsYXNzTnVtYmVyIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgb3B0cy50aXRsZSA9IGkgPT0gY2xhc3NOdW1iZXIgLSAxID8gb3B0cy50aXRsZSA6IHVuZGVmaW5lZFxuICAgICAgICBvcHRzLnNpemUgPSAodmlld1NjYWxlKSA9PiB2aWV3U2NhbGVGdW4odmlld1NjYWxlKS52YWx1ZXNbaV1cbiAgICAgICAgb3B0cy5sYWJlbCA9ICh2aWV3U2NhbGUpID0+XG4gICAgICAgICAgICBsYWJlbFRleHQodmlld1NjYWxlRnVuKHZpZXdTY2FsZSkuYnJlYWtzW2kgLSAxXSwgdmlld1NjYWxlRnVuKHZpZXdTY2FsZSkuYnJlYWtzW2ldKVxuICAgICAgICBsZWdlbmRzLnB1c2gobmV3IFNpemVMZWdlbmQob3B0cykpXG4gICAgfVxuICAgIHJldHVybiBsZWdlbmRzXG59XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBmdW5jdGlvbiB0byBmb3JtYXQgbGFiZXJscyBmb3IgZGlzY3JldGUgc2NhbGUgbGVnZW5kcy5cbiAqIEBwYXJhbSB7IGZ1bmN0aW9uKG51bWJlcik6c3RyaW5nIH0gZm9ybWF0XG4gKiBAcmV0dXJucyB7IGZ1bmN0aW9uKG51bWJlcnx1bmRlZmluZWQsIG51bWJlcnx1bmRlZmluZWQpOiBzdHJpbmcgfVxuICovXG5mdW5jdGlvbiBkZWZhdWx0TGFiZWxUZXh0KGZvcm1hdCkge1xuICAgIHJldHVybiAodjAsIHYxKSA9PiB7XG4gICAgICAgIGlmICh2MCA9PSB1bmRlZmluZWQgJiYgdjEgPT0gdW5kZWZpbmVkKSByZXR1cm4gJydcbiAgICAgICAgaWYgKHYxID09IHVuZGVmaW5lZCkgcmV0dXJuICc+ICcgKyBmb3JtYXQodjApXG4gICAgICAgIGlmICh2MCA9PSB1bmRlZmluZWQpIHJldHVybiAnPCAnICsgZm9ybWF0KHYxKVxuICAgICAgICByZXR1cm4gZm9ybWF0KHYwKSArICcgLSAnICsgZm9ybWF0KHYxKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJ1xuaW1wb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi4vY29yZS9MZWdlbmQuanMnXG5cbi8qKlxuICpcbiAqIEBtb2R1bGUgbGVnZW5kXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBUZXJuYXJ5TGVnZW5kIGV4dGVuZHMgTGVnZW5kIHtcbiAgICAvKiogQHBhcmFtIHtPYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLy9jbGFzc2lmaWVyXG4gICAgICAgIHRoaXMuY2xhc3NpZmllciA9IG9wdHMuY2xhc3NpZmllclxuXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8IDE1MFxuICAgICAgICB0aGlzLnNlbGVjdGlvbkNvbG9yID0gdGhpcy5zZWxlY3Rpb25Db2xvciB8fCAncmVkJ1xuICAgICAgICB0aGlzLnRvb2x0aXAgPSBvcHRzLnRvb2x0aXBcbiAgICAgICAgdGhpcy50ZXh0cyA9IG9wdHMudGV4dHNcblxuICAgICAgICB0aGlzLmxlZnRUZXh0ID0gb3B0cy5sZWZ0VGV4dCB8fCAnQ2F0ZWdvcnkgMCdcbiAgICAgICAgdGhpcy50b3BUZXh0ID0gb3B0cy50b3BUZXh0IHx8ICdDYXRlZ29yeSAxJ1xuICAgICAgICB0aGlzLnJpZ2h0VGV4dCA9IG9wdHMucmlnaHRUZXh0IHx8ICdDYXRlZ29yeSAyJ1xuXG4gICAgICAgIHRoaXMuY2VudGVyQ29lZmZpY2llbnQgPSBvcHRzLmNlbnRlckNvZWZmaWNpZW50IHx8IHRoaXMuY2xhc3NpZmllci5jZW50ZXJDb2VmZmljaWVudFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7e30gfSBvcHRzXG4gICAgICovXG4gICAgdXBkYXRlKG9wdHMpIHtcbiAgICAgICAgLy9jbGVhclxuICAgICAgICB0aGlzLmRpdi5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxuXG4gICAgICAgIC8vdGl0bGVcbiAgICAgICAgdGhpcy5tYWtlVGl0bGUoKVxuXG4gICAgICAgIGNvbnN0IHNxcnQzb3ZlcjIgPSAwLjg2NjAyNVxuICAgICAgICBjb25zdCB3ID0gdGhpcy53aWR0aCxcbiAgICAgICAgICAgIGggPSB3ICogc3FydDNvdmVyMlxuICAgICAgICBjb25zdCBjbGFzc2lmaWVyID0gdGhpcy5jbGFzc2lmaWVyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbkNvbG9yID0gdGhpcy5zZWxlY3Rpb25Db2xvclxuICAgICAgICBjb25zdCBzZWxlY3Rpb25TdHJva2VXaWR0aCA9IDBcbiAgICAgICAgY29uc3QgdHQgPSB0aGlzLnRvb2x0aXBcbiAgICAgICAgY29uc3QgdGV4dHMgPSB0aGlzLnRleHRzIHx8IHt9XG5cbiAgICAgICAgY29uc3QgcGFkZGluZyA9IDJcbiAgICAgICAgY29uc3QgZm9udFNpemUgPSAxMlxuXG4gICAgICAgIC8vbWFrZSBzdmcgZWxlbWVudFxuICAgICAgICBjb25zdCBzdmcgPSB0aGlzLmRpdlxuICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHcgKyBzZWxlY3Rpb25TdHJva2VXaWR0aClcbiAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoICsgNCAqIHBhZGRpbmcgKyAyICogZm9udFNpemUpXG5cbiAgICAgICAgLy90b3AgbGFiZWxcbiAgICAgICAgc3ZnLmFwcGVuZCgndGV4dCcpXG4gICAgICAgICAgICAuYXR0cigneCcsIHcgLyAyKVxuICAgICAgICAgICAgLmF0dHIoJ3knLCBwYWRkaW5nICsgZm9udFNpemUpXG4gICAgICAgICAgICAudGV4dCh0aGlzLnRvcFRleHQpXG4gICAgICAgICAgICAuYXR0cignZm9udC1zaXplJywgZm9udFNpemUpXG4gICAgICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgICAgLy9sZWZ0IGxhYmVsXG4gICAgICAgIHN2Zy5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAgICAgLmF0dHIoJ3gnLCAwKVxuICAgICAgICAgICAgLmF0dHIoJ3knLCAzICogcGFkZGluZyArIDIgKiBmb250U2l6ZSArIGgpXG4gICAgICAgICAgICAudGV4dCh0aGlzLmxlZnRUZXh0KVxuICAgICAgICAgICAgLmF0dHIoJ2ZvbnQtc2l6ZScsIGZvbnRTaXplKVxuICAgICAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ3N0YXJ0JylcbiAgICAgICAgLy9yaWdodCBsYWJlbFxuICAgICAgICBzdmcuYXBwZW5kKCd0ZXh0JylcbiAgICAgICAgICAgIC5hdHRyKCd4JywgdylcbiAgICAgICAgICAgIC5hdHRyKCd5JywgMyAqIHBhZGRpbmcgKyAyICogZm9udFNpemUgKyBoKVxuICAgICAgICAgICAgLnRleHQodGhpcy5yaWdodFRleHQpXG4gICAgICAgICAgICAuYXR0cignZm9udC1zaXplJywgZm9udFNpemUpXG4gICAgICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnZW5kJylcblxuICAgICAgICAvL3RyaWFuZ2xlIGdyb3VwXG4gICAgICAgIGNvbnN0IGcgPSBzdmdcbiAgICAgICAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAgICAgJ3RyYW5zZm9ybScsXG4gICAgICAgICAgICAgICAgJ3RyYW5zbGF0ZSgnICtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uU3Ryb2tlV2lkdGggLyAyICtcbiAgICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvblN0cm9rZVdpZHRoIC8gMiArICgyICogcGFkZGluZyArIGZvbnRTaXplKSkgK1xuICAgICAgICAgICAgICAgICAgICAnKSdcbiAgICAgICAgICAgIClcblxuICAgICAgICAvL2NvbW1vbiBmdW5jdGlvbiBmb3IgdHJpYW5nbGUgcGF0Y2hlc1xuICAgICAgICBjb25zdCBzZXRBdHRyaWJ1dGVzID0gKGVsdCwgY29sb3IsIHRleHQpID0+IHtcbiAgICAgICAgICAgIC8vZWx0LnJhaXNlKCk7XG4gICAgICAgICAgICBlbHQuYXR0cignZmlsbCcsIGNvbG9yKVxuICAgICAgICAgICAgICAgIC8vLmF0dHIoXCJzdHJva2VcIiwgY29sb3JPdmVyKVxuICAgICAgICAgICAgICAgIC8vLmF0dHIoXCJzdHJva2Utd2lkdGhcIiwgMClcbiAgICAgICAgICAgICAgICAvLy5hdHRyKFwic3Ryb2tlLWxpbmVqb2luXCIsIFwicm91bmRcIilcbiAgICAgICAgICAgICAgICAub24oJ21vdXNlb3ZlcicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpOyBzZWxlY3QodGhpcykuYXR0cihcInN0cm9rZS13aWR0aFwiLCBzZWxlY3Rpb25TdHJva2VXaWR0aCk7Ki9cbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHRoaXMpLmF0dHIoJ2ZpbGwnLCBzZWxlY3Rpb25Db2xvcilcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0dCB8fCAhdGV4dCkgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIHR0Lmh0bWwodGV4dClcbiAgICAgICAgICAgICAgICAgICAgdHQuc2V0UG9zaXRpb24oZSlcbiAgICAgICAgICAgICAgICAgICAgdHQuc2hvdygpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAub24oJ21vdXNlb3V0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvKnNlbGVjdCh0aGlzKS5hdHRyKFwic3Ryb2tlLXdpZHRoXCIsIDApOyovXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdCh0aGlzKS5hdHRyKCdmaWxsJywgY29sb3IpXG4gICAgICAgICAgICAgICAgICAgIGlmICh0dCkgdHQuaGlkZSgpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGlmICh0dCAmJiB0ZXh0KVxuICAgICAgICAgICAgICAgIGVsdC5vbignbW91c2Vtb3ZlJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdHQuc2V0UG9zaXRpb24oZSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jb25zdCBbYzAsIGMxLCBjMl0gPSBjbGFzc2lmaWVyLmNlbnRlclxuXG4gICAgICAgIC8vdHJhcGV6aXVtIHMwXG4gICAgICAgIGNvbnN0IHQwID0gZ1xuICAgICAgICAgICAgLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAuYXR0cihcbiAgICAgICAgICAgICAgICAncG9pbnRzJyxcbiAgICAgICAgICAgICAgICAnMCwnICtcbiAgICAgICAgICAgICAgICAgICAgaCArXG4gICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgIHcgLyAzICtcbiAgICAgICAgICAgICAgICAgICAgJywnICtcbiAgICAgICAgICAgICAgICAgICAgaCArXG4gICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgIHcgLyAyICtcbiAgICAgICAgICAgICAgICAgICAgJywnICtcbiAgICAgICAgICAgICAgICAgICAgKGggKiAyKSAvIDMgK1xuICAgICAgICAgICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgICAgICAgICB3IC8gNiArXG4gICAgICAgICAgICAgICAgICAgICcsJyArXG4gICAgICAgICAgICAgICAgICAgIChoICogMikgLyAzXG4gICAgICAgICAgICApXG4gICAgICAgIHNldEF0dHJpYnV0ZXModDAsIGNsYXNzaWZpZXIuY29sb3JzWzBdLCB0ZXh0c1snMCddKVxuICAgICAgICAvL3RyYXBleml1bSBzMVxuICAgICAgICBjb25zdCB0MSA9IGdcbiAgICAgICAgICAgIC5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAgICAgJ3BvaW50cycsXG4gICAgICAgICAgICAgICAgdyAvIDIgK1xuICAgICAgICAgICAgICAgICAgICAnLDAgJyArXG4gICAgICAgICAgICAgICAgICAgICh3ICogMikgLyAzICtcbiAgICAgICAgICAgICAgICAgICAgJywnICtcbiAgICAgICAgICAgICAgICAgICAgaCAvIDMgK1xuICAgICAgICAgICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgICAgICAgICB3IC8gMiArXG4gICAgICAgICAgICAgICAgICAgICcsJyArXG4gICAgICAgICAgICAgICAgICAgIChoICogMikgLyAzICtcbiAgICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgdyAvIDMgK1xuICAgICAgICAgICAgICAgICAgICAnLCcgK1xuICAgICAgICAgICAgICAgICAgICBoIC8gM1xuICAgICAgICAgICAgKVxuICAgICAgICBzZXRBdHRyaWJ1dGVzKHQxLCBjbGFzc2lmaWVyLmNvbG9yc1sxXSwgdGV4dHNbJzEnXSlcbiAgICAgICAgLy90cmFwZXppdW0gczJcbiAgICAgICAgY29uc3QgdDIgPSBnXG4gICAgICAgICAgICAuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgIC5hdHRyKFxuICAgICAgICAgICAgICAgICdwb2ludHMnLFxuICAgICAgICAgICAgICAgIHcgK1xuICAgICAgICAgICAgICAgICAgICAnLCcgK1xuICAgICAgICAgICAgICAgICAgICBoICtcbiAgICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgKHcgKiA1KSAvIDYgK1xuICAgICAgICAgICAgICAgICAgICAnLCcgK1xuICAgICAgICAgICAgICAgICAgICAoMiAqIGgpIC8gMyArXG4gICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgIHcgLyAyICtcbiAgICAgICAgICAgICAgICAgICAgJywnICtcbiAgICAgICAgICAgICAgICAgICAgKGggKiAyKSAvIDMgK1xuICAgICAgICAgICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgICAgICAgICAodyAqIDIpIC8gMyArXG4gICAgICAgICAgICAgICAgICAgICcsJyArXG4gICAgICAgICAgICAgICAgICAgIGhcbiAgICAgICAgICAgIClcbiAgICAgICAgc2V0QXR0cmlidXRlcyh0MiwgY2xhc3NpZmllci5jb2xvcnNbMl0sIHRleHRzWycyJ10pXG4gICAgICAgIC8vdHJpYW5nbGUgczBcbiAgICAgICAgY29uc3QgdDBfID0gZ1xuICAgICAgICAgICAgLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAuYXR0cihcbiAgICAgICAgICAgICAgICAncG9pbnRzJyxcbiAgICAgICAgICAgICAgICB3IC8gMiArXG4gICAgICAgICAgICAgICAgICAgICcsJyArXG4gICAgICAgICAgICAgICAgICAgIChoICogMikgLyAzICtcbiAgICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgKHcgKiA1KSAvIDYgK1xuICAgICAgICAgICAgICAgICAgICAnLCcgK1xuICAgICAgICAgICAgICAgICAgICAoaCAqIDIpIC8gMyArXG4gICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgICh3ICogMikgLyAzICtcbiAgICAgICAgICAgICAgICAgICAgJywnICtcbiAgICAgICAgICAgICAgICAgICAgaCAvIDNcbiAgICAgICAgICAgIClcbiAgICAgICAgc2V0QXR0cmlidXRlcyh0MF8sIGNsYXNzaWZpZXIubWl4Q29sb3JzWzBdLCB0ZXh0c1snbTEyJ10pXG4gICAgICAgIC8vdHJpYW5nbGUgczFcbiAgICAgICAgY29uc3QgdDFfID0gZ1xuICAgICAgICAgICAgLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAuYXR0cigncG9pbnRzJywgdyAvIDIgKyAnLCcgKyAoaCAqIDIpIC8gMyArICcgJyArIHcgLyAzICsgJywnICsgaCArICcgJyArICh3ICogMikgLyAzICsgJywnICsgaClcbiAgICAgICAgc2V0QXR0cmlidXRlcyh0MV8sIGNsYXNzaWZpZXIubWl4Q29sb3JzWzFdLCB0ZXh0c1snbTAyJ10pXG4gICAgICAgIC8vdHJpYW5nbGUgczJcbiAgICAgICAgY29uc3QgdDJfID0gZ1xuICAgICAgICAgICAgLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAuYXR0cihcbiAgICAgICAgICAgICAgICAncG9pbnRzJyxcbiAgICAgICAgICAgICAgICB3IC8gMiArICcsJyArIChoICogMikgLyAzICsgJyAnICsgdyAvIDYgKyAnLCcgKyAoaCAqIDIpIC8gMyArICcgJyArIHcgLyAzICsgJywnICsgaCAvIDNcbiAgICAgICAgICAgIClcbiAgICAgICAgc2V0QXR0cmlidXRlcyh0Ml8sIGNsYXNzaWZpZXIubWl4Q29sb3JzWzJdLCB0ZXh0c1snbTAxJ10pXG5cbiAgICAgICAgLy9jZW50ZXJcbiAgICAgICAgaWYgKHRoaXMuY2VudGVyQ29lZmZpY2llbnQpIHtcbiAgICAgICAgICAgIC8vVE9ETyBtYWtlIGl0IGFuIGhleGFnb24gIVxuICAgICAgICAgICAgY29uc3QgY2VudGVyID0gZ1xuICAgICAgICAgICAgICAgIC5hcHBlbmQoJ2NpcmNsZScpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2N4JywgdyAvIDIpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2N5JywgKGggKiAyKSAvIDMpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3InLCAodGhpcy5jZW50ZXJDb2VmZmljaWVudCAqIGgpIC8gMylcbiAgICAgICAgICAgIHNldEF0dHJpYnV0ZXMoY2VudGVyLCBjbGFzc2lmaWVyLmNlbnRlckNvbG9yLCB0ZXh0c1snY2VudGVyJ10pXG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICBsZXQgbWlkZGxlLCBsZWZ0LCB0b3AsIHJpZ2h0LCBsZWZ0XywgYm90dG9tXywgcmlnaHRfXG4gICAgICAgIGlmICghdGhpcy5yZWFsKSB7XG5cbiAgICAgICAgICAgIC8vMCBsZWZ0IHRyaWFuZ2xlXG4gICAgICAgICAgICBsZWZ0ID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCBcIjAsXCIgKyBoICsgXCIgXCIgKyAodyAvIDMpICsgXCIsXCIgKyBoICsgXCIgXCIgKyAodyAvIDYpICsgXCIsXCIgKyAoMiAqIGggLyAzKSlcbiAgICAgICAgICAgIC8vMSB0b3AgdHJpYW5nbGVcbiAgICAgICAgICAgIHRvcCA9IGcuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgKHcgLyAzKSArIFwiLFwiICsgKGggLyAzKSArIFwiIFwiICsgKHcgKiAyIC8gMykgKyBcIixcIiArIChoIC8gMykgKyBcIiBcIiArICh3IC8gMikgKyBcIiwwXCIpXG4gICAgICAgICAgICAvLzIgcmlnaHQgdHJpYW5nbGVcbiAgICAgICAgICAgIHJpZ2h0ID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCAodyAqIDIgLyAzKSArIFwiLFwiICsgaCArIFwiIFwiICsgdyArIFwiLFwiICsgaCArIFwiIFwiICsgKHcgKiA1IC8gNikgKyBcIixcIiArICgyICogaCAvIDMpKVxuICAgICAgICAgICAgLy9taWRkbGUgdHJpYW5nbGVcbiAgICAgICAgICAgIG1pZGRsZSA9IGcuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgKHcgLyAyKSArIFwiLFwiICsgKGggLyAzKSArIFwiIFwiICsgKHcgLyA0KSArIFwiLFwiICsgKGggKiA1IC8gNikgKyBcIiBcIiArICgzICogdyAvIDQpICsgXCIsXCIgKyAoaCAqIDUgLyA2KSlcbiAgICAgICAgICAgIC8vMDEgbGVmdCB0cmFwZXppdW1cbiAgICAgICAgICAgIGxlZnRfID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCAodyAvIDYpICsgXCIsXCIgKyAoaCAqIDIgLyAzKSArIFwiIFwiICsgKHcgLyA0KSArIFwiLFwiICsgKGggKiA1IC8gNikgKyBcIiBcIiArICh3IC8gMikgKyBcIixcIiArIChoIC8gMykgKyBcIiBcIiArICh3IC8gMykgKyBcIixcIiArIChoIC8gMykpXG4gICAgICAgICAgICAvLzAyIGJvdHRvbSB0cmFwZXppdW1cbiAgICAgICAgICAgIGJvdHRvbV8gPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsICh3IC8gMykgKyBcIixcIiArIChoKSArIFwiIFwiICsgKDIgKiB3IC8gMykgKyBcIixcIiArIChoKSArIFwiIFwiICsgKHcgKiAzIC8gNCkgKyBcIixcIiArIChoICogNSAvIDYpICsgXCIgXCIgKyAodyAvIDQpICsgXCIsXCIgKyAoaCAqIDUgLyA2KSlcbiAgICAgICAgICAgIC8vMTIgcmlnaHQgdHJhcGV6aXVtXG4gICAgICAgICAgICByaWdodF8gPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsICh3IC8gMikgKyBcIixcIiArIChoIC8gMykgKyBcIiBcIiArICh3ICogMyAvIDQpICsgXCIsXCIgKyAoaCAqIDUgLyA2KSArIFwiIFwiICsgKHcgKiA1IC8gNikgKyBcIixcIiArIChoICogMiAvIDMpICsgXCIgXCIgKyAodyAqIDIgLyAzKSArIFwiLFwiICsgKGggLyAzKSlcblxuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAvL21pZGRsZSB0cmlhbmdsZVxuICAgICAgICAgICAgbWlkZGxlID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCAodyAvIDIpICsgXCIsMCAwLFwiICsgaCArIFwiIFwiICsgdyArIFwiLFwiICsgaClcblxuICAgICAgICAgICAgLy9kcmF3IHRyYXBleml1bVxuICAgICAgICAgICAgLy9kcmF3IGxhcmdlIHRyYXBleml1bSBmaXJzdFxuICAgICAgICAgICAgZm9yIChsZXQgaV8gPSAyOyBpXyA+PSAwOyBpXy0tKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuY2xhc3NpZmllci5sb3dJbmRleFtpX11cbiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy5jbGFzc2lmaWVyLmxvd1RocmVzaG9sZFtpXVxuICAgICAgICAgICAgICAgIGlmIChpID09IDIpXG4gICAgICAgICAgICAgICAgICAgIC8vMDEgbGVmdCB0cmFwZXppdW1cbiAgICAgICAgICAgICAgICAgICAgbGVmdF8gPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgdyAvIDIgKyBcIiwwIDAsXCIgKyBoICsgXCIgXCIgKyB3ICogciArIFwiLFwiICsgaCArIFwiIFwiICsgdyAqICgxICsgcikgLyAyICsgXCIsXCIgKyByICogaClcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpID09IDEpXG4gICAgICAgICAgICAgICAgICAgIC8vMDIgYm90dG9tIHRyYXBleml1bVxuICAgICAgICAgICAgICAgICAgICBib3R0b21fID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIFwiMCxcIiArIGggKyBcIiBcIiArIHcgKyBcIixcIiArIGggKyBcIiBcIiArIHcgKiAoMSAtIHIgLyAyKSArIFwiLFwiICsgaCAqICgxIC0gcikgKyBcIiBcIiArIHIgKiB3IC8gMiArIFwiLFwiICsgaCAqICgxIC0gcikpXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAvLzEyIHJpZ2h0IHRyYXBleml1bVxuICAgICAgICAgICAgICAgICAgICByaWdodF8gPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgdyArIFwiLFwiICsgaCArIFwiIFwiICsgdyAvIDIgKyBcIiwwIFwiICsgdyAqICgxIC0gcikgLyAyICsgXCIsXCIgKyBoICogciArIFwiIFwiICsgdyAqICgxIC0gcikgKyBcIixcIiArIGgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vZHJhdyB0cmlhbmdsZXNcbiAgICAgICAgICAgIC8vZHJhdyBsYXJnZSB0cmlhbmdsZXMgZmlyc3RcbiAgICAgICAgICAgIGZvciAobGV0IGlfID0gMjsgaV8gPj0gMDsgaV8tLSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLmNsYXNzaWZpZXIuaGlnaEluZGV4W2lfXVxuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLmNsYXNzaWZpZXIuaGlnaFRocmVzaG9sZFtpXVxuXG4gICAgICAgICAgICAgICAgaWYgKGkgPT0gMilcbiAgICAgICAgICAgICAgICAgICAgLy8yIHJpZ2h0IHRyaWFuZ2xlXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIHcgKyBcIixcIiArIGggKyBcIiBcIiArIHcgKiByICsgXCIsXCIgKyBoICsgXCIgXCIgKyB3ICogKDEgKyByKSAvIDIgKyBcIixcIiArIGggKiByKVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPT0gMSlcbiAgICAgICAgICAgICAgICAgICAgLy8xIHRvcCB0cmlhbmdsZVxuICAgICAgICAgICAgICAgICAgICB0b3AgPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgKHcgLyAyKSArIFwiLDAgXCIgKyB3ICogciAvIDIgKyBcIixcIiArIGggKiAoMSAtIHIpICsgXCIgXCIgKyB3ICogKDEgLSByIC8gMikgKyBcIixcIiArIGggKiAoMSAtIHIpKVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgLy8wIGxlZnQgdHJpYW5nbGVcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGcuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCBcIjAsXCIgKyBoICsgXCIgXCIgKyB3ICogKDEgLSByKSArIFwiLFwiICsgaCArIFwiIFwiICsgdyAqICgxIC0gcikgLyAyICsgXCIsXCIgKyBoICogcilcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9Ki9cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcblxuLyoqIEB0eXBlZGVmIHtcImZsYWdcInxcInBpZWNoYXJ0XCJ8XCJyaW5nXCJ8XCJzZWdtZW50XCJ8XCJyYWRhclwifFwiYWdlcHlyYW1pZFwifFwiaGFsZnRvbmVcIn0gQ29tcG9zaXRpb25UeXBlICovXG5cbi8qKlxuICogQSBzdHlsZSBzaG93aW5nIHRoZSBjb21wb3NpdGlvbiBvZiBhIHRvdGFsIGluIGRpZmZlcmVudCBjYXRlZ29yaWVzLCB3aXRoIGRpZmZlcmVudCBjb2xvciBodWVzLlxuICogSXQgY29uc2lzdHMgb2YgYSBzeW1ib2wgd2l0aCBkaWZmZXJlbnQgcGFydHMsIHdob3NlIHNpemUgcmVmbGVjdCB0aGUgcHJvcG9ydGlvbiBvZiB0aGUgY29ycmVzcG9uZGluZyBjYXRlZ29yeS5cbiAqIEZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHN5bWJvbHMsIEBzZWUgQ29tcG9zaXRpb25UeXBlXG4gKiBUaGUgc3ltYm9sIGNhbiBiZSBzY2FsZWQgZGVwZW5kaW5nIG9uIHRoZSBjZWxsIGltcG9ydGFuY2UuXG4gKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQ29tcG9zaXRpb25TdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkaWN0aW9uYXJ5IChzdHJpbmcgLT4gY29sb3IpIHdoaWNoIGdpdmUgdGhlIGNvbG9yIG9mIGVhY2ggY2F0ZWdvcnkuXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB0eXBlIG9mIGRlY29tcG9zaXRpb24gc3ltYm9sIG9mIGEgY2VsbCwgQHNlZSBDb21wb3NpdGlvblR5cGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlciwgbnVtYmVyLG9iamVjdCk6Q29tcG9zaXRpb25UeXBlfSAqL1xuICAgICAgICB0aGlzLnR5cGUgPSBvcHRzLnR5cGUgfHwgKCgpID0+ICdmbGFnJykgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIGEgY2VsbCBpbiBnZW9ncmFwaGljYWwgdW5pdC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgfHwgKChjLCByKSA9PiByKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogRm9yIHN0eWxlIHR5cGVzIHdpdGggc3RyaXBlcyAoZmxhZywgc2VnbWVudCksIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgc3RyaXBlcyAoMCBmb3IgaG9yaXpvbnRhbCwgb3RoZXIgZm9yIHZlcnRpY2FsKS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIsb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuc3RyaXBlc09yaWVudGF0aW9uID0gb3B0cy5zdHJpcGVzT3JpZW50YXRpb24gfHwgKCgpID0+IDApIC8vKGMscix6LHZzKSA9PiAuLi5cblxuICAgICAgICAvKiogVGhlIGZ1bmN0aW9uIHNwZWNpZnlpbmcgYW4gb2Zmc2V0IGFuZ2xlIGZvciBhIHJhZGFyLCBoYWxmdG9uZSBvciBwaWUgY2hhcnQgc3R5bGUuXG4gICAgICAgICAqIFRoZSBhbmdsZSBpcyBzcGVjaWZpZWQgaW4gZGVncmVlLiBUaGUgcm90YXRpb24gaXMgYW50aS1jbG9ja3dpc2UuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyLG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm9mZnNldEFuZ2xlID0gb3B0cy5vZmZzZXRBbmdsZSB8fCAoKCkgPT4gMCkgLy8oYyxyLHosdnMpID0+IC4uLlxuXG4gICAgICAgIC8qKiBUaGUgZnVuY3Rpb24gc3BlY2lmeWluZyB0aGUgaGVpZ2h0IG9mIHRoZSBhZ2UgcHlyYW1pZCwgaW4gZ2VvIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyLG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmFnZVB5cmFtaWRIZWlnaHQgPSBvcHRzLmFnZVB5cmFtaWRIZWlnaHQgfHwgKChjLCByKSA9PiByKSAvLyhjLHIseix2cykgPT4gLi4uXG5cbiAgICAgICAgLyoqIEZvciBwaWUgY2hhcnQsIHRoaXMgaXMgcGFyYW1ldGVyIGZvciBpbnRlcm5hbCByYWRpdXMsIHNvIHRoYXQgdGhlIHBpZSBjaGFydCBsb29rcyBsaWtlIGEgZG9udXQuXG4gICAgICAgICAqIDAgZm9yIG5vcm1hbCBwaWUgY2hhcnRzLCAwLjUgdG8gZW1wdHkgaGFsZiBvZiB0aGUgcmFkaXVzLlxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnBpZUNoYXJ0SW50ZXJuYWxSYWRpdXNGYWN0b3IgPSBvcHRzLnBpZUNoYXJ0SW50ZXJuYWxSYWRpdXNGYWN0b3IgfHwgMFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgc3F1YXJlcyBkZXBlbmRpbmcgb24gdGhlaXIgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgY29uc3QgY3R4ID0gZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL25iIGNhdGVnb3JpZXMgLSB1c2VkIGZvciByYWRhciBhbmQgYWdlcHlyYW1pZFxuICAgICAgICBjb25zdCBuYkNhdCA9IE9iamVjdC5lbnRyaWVzKHRoaXMuY29sb3IpLmxlbmd0aFxuXG4gICAgICAgIC8vZHJhdyBjYWxsc1xuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAvL3NpemVcbiAgICAgICAgICAgIGNvbnN0IHNHID0gdGhpcy5zaXplID8gdGhpcy5zaXplKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiByZXNvbHV0aW9uXG4gICAgICAgICAgICBpZiAoIXNHKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGNlbGwsIHJlc29sdXRpb24sIHopXG5cbiAgICAgICAgICAgIC8vZ2V0IHN5bWJvbCB0eXBlXG4gICAgICAgICAgICBjb25zdCB0eXBlXyA9IHRoaXMudHlwZSA/IHRoaXMudHlwZShjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogJ2ZsYWcnXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBjZW50ZXIgcG9zaXRpb25cbiAgICAgICAgICAgIGNvbnN0IHhjID0gY2VsbC54ICsgb2Zmc2V0LmR4ICsgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcgPyAwIDogcmVzb2x1dGlvbiAqIDAuNSlcbiAgICAgICAgICAgIGNvbnN0IHljID0gY2VsbC55ICsgb2Zmc2V0LmR5ICsgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcgPyAwIDogcmVzb2x1dGlvbiAqIDAuNSlcblxuICAgICAgICAgICAgLy9jb21wdXRlIG9mZnNldCBhbmdsZSwgd2hlbiByZWxldmFudFxuICAgICAgICAgICAgY29uc3Qgb2ZmQW5nID0gdGhpcy5vZmZzZXRBbmdsZVxuICAgICAgICAgICAgICAgID8gKHRoaXMub2Zmc2V0QW5nbGUoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSAqIE1hdGguUEkpIC8gMTgwXG4gICAgICAgICAgICAgICAgOiAwXG5cbiAgICAgICAgICAgIGlmICh0eXBlXyA9PT0gJ2FnZXB5cmFtaWQnIHx8IHR5cGVfID09PSAncmFkYXInIHx8IHR5cGVfID09PSAnaGFsZnRvbmUnKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgY2VsbCBjYXRlZ29yeSBtYXggdmFsdWVcbiAgICAgICAgICAgICAgICBsZXQgbWF4VmFsID0gLUluZmluaXR5XG4gICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuY29sb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSArY2VsbFtrZXldXG4gICAgICAgICAgICAgICAgICAgIGlmICh2ID4gbWF4VmFsKSBtYXhWYWwgPSB2XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9jdW11bFxuICAgICAgICAgICAgICAgIGxldCBjdW11bCA9IDBcbiAgICAgICAgICAgICAgICBpZiAodHlwZV8gPT09ICdhZ2VweXJhbWlkJyAmJiB0aGlzLmFnZVB5cmFtaWRIZWlnaHQpXG4gICAgICAgICAgICAgICAgICAgIGN1bXVsID0gKHJlc29sdXRpb24gLSB0aGlzLmFnZVB5cmFtaWRIZWlnaHQoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSkgLyAyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVfID09PSAncmFkYXInIHx8IHR5cGVfID09PSAnaGFsZnRvbmUnKSBjdW11bCA9IE1hdGguUEkgLyAyICsgb2ZmQW5nXG5cbiAgICAgICAgICAgICAgICAvL2NvbXB1dGUgdGhlIGluY3JlbWVudCwgd2hpY2ggaXMgdGhlIHZhbHVlIHRvIGluY3JlbWVudCB0aGUgY3VtdWwgZm9yIGVhY2ggY2F0ZWdvcnlcbiAgICAgICAgICAgICAgICBjb25zdCBpbmNyID1cbiAgICAgICAgICAgICAgICAgICAgdHlwZV8gPT09ICdhZ2VweXJhbWlkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyAodGhpcy5hZ2VQeXJhbWlkSGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuYWdlUHlyYW1pZEhlaWdodChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJlc29sdXRpb24pIC8gbmJDYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdHlwZV8gPT09ICdyYWRhcicgfHwgdHlwZV8gPT09ICdoYWxmdG9uZSdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKDIgKiBNYXRoLlBJKSAvIG5iQ2F0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIGlmIChpbmNyID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzeW1ib2wgdHlwZTonICsgdHlwZV8pXG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBbY29sdW1uLCBjb2xvcl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5jb2xvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vc2V0IGNhdGVnb3J5IGNvbG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gY29sb3JcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9nZXQgY2F0ZWdvcnkgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNlbGxbY29sdW1uXVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbXB1dGUgY2F0ZWdvcnkgbGVuZ3RoIC0gaW4gZ2VvXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdHID0gKHNHICogdmFsKSAvIG1heFZhbFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFJlY3QoeGMgKyAocmVzb2x1dGlvbiAtIHdHKSAvIDIsIHljICsgY3VtdWwsIHdHLCBpbmNyKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL25leHQgaGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICBjdW11bCArPSBpbmNyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZV8gPT09ICdyYWRhcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vc2V0IGNhdGVnb3J5IGNvbG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gY29sb3JcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9nZXQgY2F0ZWdyb3kgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNlbGxbY29sdW1uXVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbXB1dGUgY2F0ZWdvcnkgcmFkaXVzIC0gaW4gZ2VvXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc3QgckcgPSB0aGlzLnJhZGl1cyh2YWwsIHIsIHN0YXQsIGNlbGxTdGF0LCB6KVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgckcgPSAoc0cgLyAyKSAqIE1hdGguc3FydCh2YWwgLyBtYXhWYWwpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBhbmd1bGFyIHNlY3RvclxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHgubW92ZVRvKHhjLCB5YylcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5hcmMoeGMsIHljLCByRywgY3VtdWwgLSBpbmNyLCBjdW11bClcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oeGMsIHljKVxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGwoKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL25leHQgYW5ndWxhciBzZWN0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1bXVsICs9IGluY3JcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlXyA9PT0gJ2hhbGZ0b25lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9zZXQgY2F0ZWdvcnkgY29sb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBjb2xvclxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2dldCBjYXRlZ3JveSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gY2VsbFtjb2x1bW5dXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29tcHV0ZSBjYXRlZ29yeSByYWRpdXMgLSBpbiBnZW9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgckcgPSBzRyAqIDAuMzMzICogTWF0aC5zcXJ0KHZhbCAvIG1heFZhbClcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3IGNpcmNsZVxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguYXJjKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjICsgcmVzb2x1dGlvbiAqIDAuMjUgKiBNYXRoLmNvcyhjdW11bCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeWMgKyByZXNvbHV0aW9uICogMC4yNSAqIE1hdGguc2luKGN1bXVsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByRyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBNYXRoLlBJXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbCgpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vbmV4dCBhbmd1bGFyIHNlY3RvclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWwgKz0gaW5jclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHN5bWJvbCB0eXBlOicgKyB0eXBlXylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9jb21wdXRlIHRvdGFsXG4gICAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGNvbHVtbiBvZiBPYmplY3Qua2V5cyh0aGlzLmNvbG9yKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gK2NlbGxbY29sdW1uXVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXYpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHZcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF0b3RhbCB8fCBpc05hTih0b3RhbCkpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgICAgICAvL2RyYXcgZGVjb21wb3NpdGlvbiBzeW1ib2xcbiAgICAgICAgICAgICAgICBsZXQgY3VtdWwgPSAwXG4gICAgICAgICAgICAgICAgY29uc3QgZCA9IHJlc29sdXRpb24gKiAoMSAtIHNHIC8gcmVzb2x1dGlvbikgKiAwLjVcbiAgICAgICAgICAgICAgICBjb25zdCBvcmkgPSB0aGlzLnN0cmlwZXNPcmllbnRhdGlvbihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBbY29sdW1uLCBjb2xvcl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5jb2xvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9nZXQgc2hhcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmUgPSBjZWxsW2NvbHVtbl0gLyB0b3RhbFxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNoYXJlIHx8IGlzTmFOKHNoYXJlKSkgY29udGludWVcblxuICAgICAgICAgICAgICAgICAgICAvL3NldCBjb2xvclxuICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gY29sb3JcblxuICAgICAgICAgICAgICAgICAgICAvL2RyYXcgc3ltYm9sIHBhcnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVfID09PSAnZmxhZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBmbGFnIHN0cmlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9ob3Jpem9udGFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnggKyBkICsgb2Zmc2V0LmR4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnkgKyBkICsgY3VtdWwgKiBzRyArIG9mZnNldC5keSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlICogc0dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmVydGljYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFJlY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueCArIGQgKyBjdW11bCAqIHNHICsgb2Zmc2V0LmR4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnkgKyBkICsgb2Zmc2V0LmR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZSAqIHNHLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzR1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlXyA9PT0gJ3BpZWNoYXJ0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3IHBpZSBjaGFydCBhbmd1bGFyIHNlY3RvclxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbXB1dGUgYW5nbGVzXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhMSA9IGN1bXVsICogMiAqIE1hdGguUElcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGEyID0gKGN1bXVsICsgc2hhcmUpICogMiAqIE1hdGguUElcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oeGMsIHljKVxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmFyYyh4YywgeWMsIHNHICogMC41LCBhMSArIG9mZkFuZywgYTIgKyBvZmZBbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5waWVDaGFydEludGVybmFsUmFkaXVzRmFjdG9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5hcmMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5YyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0cgKiAwLjUgKiB0aGlzLnBpZUNoYXJ0SW50ZXJuYWxSYWRpdXNGYWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGExICsgb2ZmQW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhMiArIG9mZkFuZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGwoKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVfID09PSAncmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyByaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5hcmMoeGMsIHljLCBNYXRoLnNxcnQoMSAtIGN1bXVsKSAqIHNHICogMC41LCAwLCAyICogTWF0aC5QSSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5maWxsKClcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlXyA9PT0gJ3NlZ21lbnQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgc2VnbWVudCBzZWN0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0cgPSAoc0cgKiBzRykgLyByZXNvbHV0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2hvcml6b250YWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFJlY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueCArIG9mZnNldC5keCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC55ICsgKHJlc29sdXRpb24gLSB3RykgLyAyICsgY3VtdWwgKiB3RyArIG9mZnNldC5keSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmUgKiB3R1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92ZXJ0aWNhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5maWxsUmVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC54ICsgY3VtdWwgKiByZXNvbHV0aW9uICsgb2Zmc2V0LmR4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnkgKyAocmVzb2x1dGlvbiAtIHdHKSAvIDIgKyBvZmZzZXQuZHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlICogcmVzb2x1dGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc3ltYm9sIHR5cGU6JyArIHR5cGVfKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY3VtdWwgKz0gc2hhcmVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuaW1wb3J0IHsgcmFuZG9tTm9ybWFsIH0gZnJvbSAnZDMtcmFuZG9tJ1xuaW1wb3J0IHsgY2hlY2tXZWJHTFN1cHBvcnQsIG1ha2VXZWJHTENhbnZhcyB9IGZyb20gJy4uL3V0aWxzL3dlYkdMVXRpbHMuanMnXG5pbXBvcnQgeyBXZWJHTFNxdWFyZUNvbG9yaW5nIH0gZnJvbSAnLi4vdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZy5qcydcbmltcG9ydCB7IGNvbG9yIH0gZnJvbSAnZDMtY29sb3InXG5cbi8qKlxuICpcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIERvdERlbnNpdHlTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBudW1iZXIgb2YgZG90cyBmb3IgYSBjZWxsIHZhbHVlLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuZG90TnVtYmVyID0gb3B0cy5kb3ROdW1iZXIgfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiByZXNvbHV0aW9uIC8gMTAwKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogVGhlIGNvbG9yIG9mIHRoZSBkb3RzLiBTYW1lIGNvbG9yIGZvciBhbGwgZG90cyB3aXRoaW4gYSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnI0ZGNTczMycpIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiB0aGUgZG90cywgaW4gZ2VvIHVuaXQuIFNhbWUgc2l6ZSBmb3IgYWxsIGNlbGxzLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLCBudW1iZXIsb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuZG90U2l6ZSA9IG9wdHMuZG90U2l6ZSB8fCAoKHJlc29sdXRpb24sIHopID0+IDEuNSAqIHopIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2lnbWEgb2YgdGhlIGRvdHMgZGlzdHJpYnV0aW9uLiBTYW1lIHZhbHVlIGZvciBhbGwgY2VsbHMuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsIG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaWdtYSA9IG9wdHMuc2lnbWEgfHwgKChyZXNvbHV0aW9uLCB6KSA9PiByZXNvbHV0aW9uIC8gMikgLy8oYyxyLHosdnMpID0+IHt9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBjZWxscyBhcyB0ZXh0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG5cbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vZ2V0IHNpemVcbiAgICAgICAgY29uc3Qgc0dlbyA9IHRoaXMuZG90U2l6ZSA/IHRoaXMuZG90U2l6ZShyZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogelxuXG4gICAgICAgIC8vbWFrZSByYW5kb20gZnVuY3Rpb25cbiAgICAgICAgY29uc3Qgc2lnID0gdGhpcy5zaWdtYSA/IHRoaXMuc2lnbWEocmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHJlc29sdXRpb24gKiAwLjRcbiAgICAgICAgY29uc3QgcmFuZCA9IHJhbmRvbU5vcm1hbCgwLCBzaWcpXG5cbiAgICAgICAgY29uc3QgY3R4ID0gZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuXG4gICAgICAgIGlmIChjaGVja1dlYkdMU3VwcG9ydCgpKSB7XG4gICAgICAgICAgICAvL2NyZWF0ZSBjYW52YXMgYW5kIHdlYmdsIHJlbmRlcmVyXG4gICAgICAgICAgICBjb25zdCBjdldHTCA9IG1ha2VXZWJHTENhbnZhcyhnZW9DYW52YXMudyArICcnLCBnZW9DYW52YXMuaCArICcnKVxuICAgICAgICAgICAgaWYgKCFjdldHTCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHdlYkdMJylcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9jcmVhdGUgd2ViR0wgcHJvZ3JhbVxuICAgICAgICAgICAgY29uc3QgcHJvZyA9IG5ldyBXZWJHTFNxdWFyZUNvbG9yaW5nKGN2V0dMLmdsLCBzR2VvIC8geilcblxuICAgICAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uIC8gMlxuXG4gICAgICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgY29sb3JcbiAgICAgICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcbiAgICAgICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT09ICdub25lJykgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vbnVtYmVyIG9mIGRvdHNcbiAgICAgICAgICAgICAgICBjb25zdCBkb3ROdW1iZXIgPSB0aGlzLmRvdE51bWJlcihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG5cbiAgICAgICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByZXNvbHV0aW9uLCB6KVxuXG4gICAgICAgICAgICAgICAgLy9jZWxsIGNlbnRlclxuICAgICAgICAgICAgICAgIGNvbnN0IGN4ID0gY2VsbC54ICsgb2Zmc2V0LmR4ICsgcjJcbiAgICAgICAgICAgICAgICBjb25zdCBjeSA9IGNlbGwueSArIG9mZnNldC5keSArIHIyXG5cbiAgICAgICAgICAgICAgICAvL2NvbnZlcnQgY29sb3JcbiAgICAgICAgICAgICAgICBjb25zdCBjYyA9IGNvbG9yKGNvbClcbiAgICAgICAgICAgICAgICBpZiAoIWNjKSByZXR1cm5cblxuICAgICAgICAgICAgICAgIC8vcmFuZG9tIHBvaW50c1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGRvdE51bWJlcjsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBwcm9nLmFkZFBvaW50RGF0YTIoY3ggKyByYW5kKCksIGN5ICsgcmFuZCgpLCBjYy5yLCBjYy5nLCBjYy5iLCBjYy5vcGFjaXR5KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL2RyYXdcbiAgICAgICAgICAgIHByb2cuZHJhdyhnZW9DYW52YXMuZ2V0V2ViR0xUcmFuc2Zvcm0oKSlcblxuICAgICAgICAgICAgLy9kcmF3IGluIGNhbnZhcyBnZW9cbiAgICAgICAgICAgIGdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcbiAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoY3ZXR0wuY2FudmFzLCAwLCAwKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgICAgIC8vZ2V0IGNvbG9yXG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvcihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG4gICAgICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09PSAnbm9uZScpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgLy9zZXQgY29sb3JcbiAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gY29sXG5cbiAgICAgICAgICAgICAgICAvL251bWJlciBvZiBkb3RzXG4gICAgICAgICAgICAgICAgY29uc3QgZG90TnVtYmVyID0gdGhpcy5kb3ROdW1iZXIoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxuXG4gICAgICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgcmVzb2x1dGlvbiwgeilcblxuICAgICAgICAgICAgICAgIC8vZHJhdyByYW5kb20gZG90c1xuICAgICAgICAgICAgICAgIGNvbnN0IGN4ID0gY2VsbC54ICsgb2Zmc2V0LmR4ICsgcmVzb2x1dGlvbiAvIDIsXG4gICAgICAgICAgICAgICAgICAgIGN5ID0gY2VsbC55ICsgb2Zmc2V0LmR5ICsgcmVzb2x1dGlvbiAvIDJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBkb3ROdW1iZXI7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFJlY3QoY3ggKyByYW5kKCksIGN5ICsgcmFuZCgpLCBzR2VvLCBzR2VvKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5cbi8qKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgSW1hZ2VTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBpbWFnZSBVUkwgb2YgYSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuaW1hZ2UgPSBvcHRzLmltYWdlIHx8ICgoKSA9PiAnJykgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIFRoZSBpbWFnZSBzaXplIGluIGdyb3VuZCBtZXRlcnNcbiAgICAgICAgICogIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gICAgICAgICovXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZSB8fCAoKGNlbGwsIHJlc29sdXRpb24pID0+IHJlc29sdXRpb24pXG5cbiAgICAgICAgLyoqIERpY3Rpb25uYXJ5IG9mIHByZWxvYWRlZCBpbWFnZXMuIHVybCAtPiBpbWFnZVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fSAqL1xuICAgICAgICB0aGlzLmNhY2hlID0ge31cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgYXN5bmMgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56LFxuICAgICAgICAgICAgcmVzb2x1dGlvblBpeCA9IHJlc29sdXRpb24gLyB6XG5cbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vZHJhdyBpbiBzY3JlZW4gY29vcmRpbmF0ZXNcbiAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vZ2V0IGNlbGwgaW1hZ2UgdXJsXG4gICAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmltYWdlKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcbiAgICAgICAgICAgIGlmICghdXJsKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3NpemUgYW5kIHBvc2l0aW9uIHZhbHVlc1xuICAgICAgICAgICAgbGV0IHNpemVQaXggPSB0aGlzLnNpemUoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSAvIHpcbiAgICAgICAgICAgIGlmICghc2l6ZVBpeCkgY29udGludWVcblxuICAgICAgICAgICAgLy9nZXQgaW1hZ2UgZnJvbSBjYWNoZVxuICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLmNhY2hlW3VybF1cblxuICAgICAgICAgICAgLy9sb2FkaW5nLCBrZWVwIHdhaXRpbmdcbiAgICAgICAgICAgIGlmIChpbWFnZSA9PSAnbG9hZGluZycpIHJldHVyblxuICAgICAgICAgICAgLy9ubyBpbWFnZTogbG9hZCBpdFxuICAgICAgICAgICAgZWxzZSBpZiAoIWltYWdlKSB7XG4gICAgICAgICAgICAgICAgLy90YWcgYXMgbG9hZGluZ1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVbdXJsXSA9ICdsb2FkaW5nJ1xuXG4gICAgICAgICAgICAgICAgLy9kZWZpbmUgaW1hZ2VcbiAgICAgICAgICAgICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKVxuICAgICAgICAgICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vc3RvcmUgaW1hZ2UgZGF0YSBpbiBjYWNoZSBhbmQgcmVkcmF3XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVbdXJsXSA9IGltZ1xuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMucmVkcmF3KClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW1nLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vY2FzZSB3aGVuIG5vIGltYWdlXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IHJldHJpZXZlIGltYWdlIGZyb20nLCB1cmwpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vc2V0IFVSTCB0byBsYXVuY2ggdGhlIGRvd25sb2FkXG4gICAgICAgICAgICAgICAgaW1nLnNyYyA9IHVybFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL2RyYXcgaW1hZ2VcbiAgICAgICAgICAgICAgICBjb25zdCBkID0gKHJlc29sdXRpb25QaXggLSBzaXplUGl4KSAvIDJcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4LmRyYXdJbWFnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmdlb1RvUGl4WChjZWxsLngpICsgZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5nZW9Ub1BpeFkoY2VsbC55KSArIGQgLSByZXNvbHV0aW9uUGl4LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZVBpeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVQaXhcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcbmltcG9ydCB7IFNpZGVTdHlsZSB9IGZyb20gJy4vU2lkZVN0eWxlLmpzJ1xuXG4vKiogQHR5cGVkZWYge3t4Om51bWJlcix5Om51bWJlcixvcjpcInZcInxcImhcIixjMTppbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGx8dW5kZWZpbmVkLGMyOmltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbHx1bmRlZmluZWR9fSBTaWRlICovXG5cbi8qKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgSXNvRmVuY2VTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkaWN0aW9uYXJ5IChzdHJpbmcgLT4gY29sb3IpIHdoaWNoIGdpdmUgdGhlIGNvbG9yIG9mIGVhY2ggY2F0ZWdvcnkuXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBoZWlnaHQgb2YgYSBjZWxsIGluIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gb3B0cy5oZWlnaHQgfHwgKChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpID0+IHJlc29sdXRpb24gKiAwLjQpXG5cbiAgICAgICAgLyoqIFRoZSBwZXJzcGVjdGl2ZSBhbmdsZSwgaW4gZGVncmVlLCB3aXRoaW4gWy0xODAsMTgwXSwgZnJvbSBbTyx4XSBheGlzLlxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmFuZ2xlID0gb3B0cy5hbmdsZSAhPSB1bmRlZmluZWQgPyBvcHRzLmFuZ2xlIDogNTBcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvcm5lciBsaW5lIHN0cm9rZSBzdHlsZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCxudW1iZXIsbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvcm5lckxpbmVTdHJva2VDb2xvciA9IG9wdHMuY29ybmVyTGluZVN0cm9rZUNvbG9yIHx8ICgoYywgciwgeiwgYW5nbGUpID0+ICcjOTk5JylcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvcm5lciBsaW5lIHdpZHRoLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLG51bWJlcixudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuY29ybmVyTGluZVdpZHRoID0gb3B0cy5jb3JuZXJMaW5lV2lkdGggfHwgKChjLCByLCB6LCBhbmdsZSkgPT4gKGFuZ2xlICUgOTAgPT0gMCA/IDAgOiAwLjggKiB6KSlcblxuICAgICAgICAvKipcbiAgICAgICAgICogU2hvdyB2ZXJ0aWNhbCBjcm9zcy1zZWN0aW9ucy5cbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59ICovXG4gICAgICAgIHRoaXMuc1ZlcnQgPSBvcHRzLnNWZXJ0ICE9IHVuZGVmaW5lZCA/IG9wdHMuc1ZlcnQgOiB0cnVlXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNob3cgaG9yaXpvbnRhbCBjcm9zcy1zZWN0aW9ucy5cbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59ICovXG4gICAgICAgIHRoaXMuc0hvciA9IG9wdHMuc0hvciAhPSB1bmRlZmluZWQgPyBvcHRzLnNIb3IgOiB0cnVlXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9uYiBjYXRlZ29yaWVzIC0gdXNlZCBmb3IgcmFkYXIgYW5kIGFnZXB5cmFtaWRcbiAgICAgICAgY29uc3QgY2F0cyA9IE9iamVjdC5rZXlzKHRoaXMuY29sb3IpXG5cbiAgICAgICAgLy9oYWxmIHJlc29sdXRpb25cbiAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uIC8gMlxuXG4gICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KHVuZGVmaW5lZCwgcmVzb2x1dGlvbiwgeiksXG4gICAgICAgICAgICBkeCA9IG9mZnNldC5keCxcbiAgICAgICAgICAgIGR5ID0gb2Zmc2V0LmR5XG5cbiAgICAgICAgLy9tYWtlIHNpZGVzXG4gICAgICAgIC8qKiAgQHR5cGUge0FycmF5LjxTaWRlPn0gKi9cbiAgICAgICAgY29uc3Qgc2lkZXMgPSBTaWRlU3R5bGUuYnVpbGRTaWRlcyhcbiAgICAgICAgICAgIGNlbGxzLFxuICAgICAgICAgICAgcmVzb2x1dGlvbixcbiAgICAgICAgICAgIHRoaXMuYW5nbGUgJSAxODAgIT0gOTAgJiYgdGhpcy5zVmVydCxcbiAgICAgICAgICAgIHRoaXMuYW5nbGUgJSAxODAgIT0gMCAmJiB0aGlzLnNIb3JcbiAgICAgICAgKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGlmIChzaWRlcy5sZW5ndGggPT0gMCkgcmV0dXJuXG5cbiAgICAgICAgLy9hbmdsZSBpbiByYWRpYW5zXG4gICAgICAgIGNvbnN0IGFSYWQgPSAodGhpcy5hbmdsZSAqIE1hdGguUEkpIC8gMTgwLFxuICAgICAgICAgICAgY29zID0gTWF0aC5jb3MoYVJhZCksXG4gICAgICAgICAgICBzaW4gPSBNYXRoLnNpbihhUmFkKVxuXG4gICAgICAgIC8vc29ydCBzaWRlcyBzbyB0aGF0IHRoZSBiYWNrIG9uZXMgYXJlIGRyYXduIGZpcnN0LiBUaGlzIGRlcGVuZHMgb24gdGhlIGFuZ2xlLlxuICAgICAgICAvL2RlcGVuZGluZyBvbiBkaXN0YW5jZSB0byB0aGUgcmVmZXJlbmNlIGNvcm5lciBwb2ludFxuICAgICAgICBjb25zdCB4Q29ybmVyID0gTWF0aC5hYnModGhpcy5hbmdsZSkgPCA5MCA/IGdlb0NhbnZhcy5leHRHZW8ueE1pbiA6IGdlb0NhbnZhcy5leHRHZW8ueE1heFxuICAgICAgICBjb25zdCB5Q29ybmVyID0gdGhpcy5hbmdsZSA8IDAgPyBnZW9DYW52YXMuZXh0R2VvLnlNYXggOiBnZW9DYW52YXMuZXh0R2VvLnlNaW5cbiAgICAgICAgc2lkZXMuc29ydChcbiAgICAgICAgICAgIChzMSwgczIpID0+XG4gICAgICAgICAgICAgICAgTWF0aC5oeXBvdChzMi54IC0geENvcm5lciwgczIueSAtIHlDb3JuZXIpIC0gTWF0aC5oeXBvdChzMS54IC0geENvcm5lciwgczEueSAtIHlDb3JuZXIpXG4gICAgICAgIClcblxuICAgICAgICAvL3ByZXBhcmUgZnVuY3Rpb24gdG8gZHJhdyBjb3JuZXIgbGluZSBmb3IgYSBjZWxsICpjKlxuICAgICAgICBjb25zdCBkcmF3Q29ybmVyTGluZSA9IChjZWxsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNlbGwpIHJldHVyblxuICAgICAgICAgICAgLy9saW5lIHN0eWxlXG4gICAgICAgICAgICBjb25zdCBsdyA9IHRoaXMuY29ybmVyTGluZVdpZHRoID8gdGhpcy5jb3JuZXJMaW5lV2lkdGgoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdGhpcy5hbmdsZSkgOiAwLjggKiB6XG4gICAgICAgICAgICBpZiAobHcgPT0gMCkgcmV0dXJuXG4gICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmNvcm5lckxpbmVTdHJva2VDb2xvclxuICAgICAgICAgICAgICAgID8gdGhpcy5jb3JuZXJMaW5lU3Ryb2tlQ29sb3IoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdGhpcy5hbmdsZSlcbiAgICAgICAgICAgICAgICA6ICcjMzMzJ1xuICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IGx3XG5cbiAgICAgICAgICAgIC8vaGVpZ2h0IC0gaW4gZ2VvXG4gICAgICAgICAgICBjb25zdCBoRyA9IHRoaXMuaGVpZ2h0KGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcblxuICAgICAgICAgICAgLy9kcmF3IGxpbmVcbiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgY3R4Lm1vdmVUbyhjZWxsLnggKyByMiArIGR4LCBjZWxsLnkgKyByMiArIGR5KVxuICAgICAgICAgICAgY3R4LmxpbmVUbyhjZWxsLnggKyByMiArIGhHICogY29zICsgZHgsIGNlbGwueSArIHIyICsgaEcgKiBzaW4gKyBkeSlcbiAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9kcmF3IHNpZGVzXG4gICAgICAgIGN0eC5saW5lQ2FwID0gJ3JvdW5kJ1xuICAgICAgICBmb3IgKGxldCBzaWRlIG9mIHNpZGVzKSB7XG4gICAgICAgICAgICBjb25zdCBjMSA9IHNpZGUuYzEsXG4gICAgICAgICAgICAgICAgYzIgPSBzaWRlLmMyLFxuICAgICAgICAgICAgICAgIHggPSBzaWRlLngsXG4gICAgICAgICAgICAgICAgeSA9IHNpZGUueVxuXG4gICAgICAgICAgICAvL2hlaWdodHMgLSBpbiBnZW9cbiAgICAgICAgICAgIGNvbnN0IGhHMSA9IGMxID8gdGhpcy5oZWlnaHQoYzEsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiAwLFxuICAgICAgICAgICAgICAgIGhHMiA9IGMyID8gdGhpcy5oZWlnaHQoYzIsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiAwXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSB0b3RhbHMgZm9yIGJvdGggY2VsbHNcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsMSA9IGNvbXB1dGVUb3RhbChjMSwgY2F0cyksXG4gICAgICAgICAgICAgICAgdG90YWwyID0gY29tcHV0ZVRvdGFsKGMyLCBjYXRzKVxuICAgICAgICAgICAgaWYgKHRvdGFsMSA9PSAwICYmIHRvdGFsMiA9PSAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICBsZXQgY3VtdWwxID0gMCxcbiAgICAgICAgICAgICAgICBjdW11bDIgPSAwXG4gICAgICAgICAgICBmb3IgKGxldCBbY29sdW1uLCBjb2xvcl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5jb2xvcikpIHtcbiAgICAgICAgICAgICAgICAvL2RyYXcgc3RyaXBlIG9mIHNpZGUgcyBhbmQgY2F0ZWdvcnkgY29sdW1uXG5cbiAgICAgICAgICAgICAgICAvL2dldCB2YWx1ZXMgZm9yIGJvdGggY2VsbHNcbiAgICAgICAgICAgICAgICBsZXQgdjEgPSBjMSA/ICtjMVtjb2x1bW5dIDogMFxuICAgICAgICAgICAgICAgIGxldCB2MiA9IGMyID8gK2MyW2NvbHVtbl0gOiAwXG4gICAgICAgICAgICAgICAgaWYgKHYxID09IDAgJiYgdjIgPT0gMCkgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vY29tcHV0ZSBoZWlnaHRzXG4gICAgICAgICAgICAgICAgY29uc3QgaDEgPSAoaEcxICogY3VtdWwxKSAvIHRvdGFsMSB8fCAwXG4gICAgICAgICAgICAgICAgY29uc3QgaDFuID0gKGhHMSAqIChjdW11bDEgKyB2MSkpIC8gdG90YWwxIHx8IDBcbiAgICAgICAgICAgICAgICBjb25zdCBoMiA9IChoRzIgKiBjdW11bDIpIC8gdG90YWwyIHx8IDBcbiAgICAgICAgICAgICAgICBjb25zdCBoMm4gPSAoaEcyICogKGN1bXVsMiArIHYyKSkgLyB0b3RhbDIgfHwgMFxuXG4gICAgICAgICAgICAgICAgLy9tYWtlIHBhdGhcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBpZiAoc2lkZS5vciA9PSAnaCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9ob3Jpem9udGFsIHNpZGUgLSB2ZXJ0aWNhbCBzZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIC8vYm90dG9tIGxlZnRcbiAgICAgICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyh4ICsgaDEgKiBjb3MgKyBkeCwgeSAtIHIyICsgaDEgKiBzaW4gKyBkeSlcbiAgICAgICAgICAgICAgICAgICAgLy90b3AgbGVmdFxuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKHggKyBoMiAqIGNvcyArIGR4LCB5ICsgcjIgKyBoMiAqIHNpbiArIGR5KVxuICAgICAgICAgICAgICAgICAgICAvL3RvcCByaWdodFxuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKHggKyBoMm4gKiBjb3MgKyBkeCwgeSArIHIyICsgaDJuICogc2luICsgZHkpXG4gICAgICAgICAgICAgICAgICAgIC8vYm90dG9tIHJpZ2h0XG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oeCArIGgxbiAqIGNvcyArIGR4LCB5IC0gcjIgKyBoMW4gKiBzaW4gKyBkeSlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL3ZlcnRpY2FsIHNpZGUgLSBob3Jpem9udGFsIHNlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgLy9ib3R0b20gbGVmdFxuICAgICAgICAgICAgICAgICAgICBjdHgubW92ZVRvKHggLSByMiArIGgxICogY29zICsgZHgsIHkgKyBoMSAqIHNpbiArIGR5KVxuICAgICAgICAgICAgICAgICAgICAvL2JvdHRvbSByaWdodFxuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKHggKyByMiArIGgyICogY29zICsgZHgsIHkgKyBoMiAqIHNpbiArIGR5KVxuICAgICAgICAgICAgICAgICAgICAvL3RvcCByaWdodFxuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKHggKyByMiArIGgybiAqIGNvcyArIGR4LCB5ICsgaDJuICogc2luICsgZHkpXG4gICAgICAgICAgICAgICAgICAgIC8vdG9wIGxlZnRcbiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4IC0gcjIgKyBoMW4gKiBjb3MgKyBkeCwgeSArIGgxbiAqIHNpbiArIGR5KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL2NnLmN0eC5jbG9zZVBhdGgoKVxuXG4gICAgICAgICAgICAgICAgLy9maWxsXG4gICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbG9yXG4gICAgICAgICAgICAgICAgY3R4LmZpbGwoKVxuXG4gICAgICAgICAgICAgICAgY3VtdWwxICs9IHYxXG4gICAgICAgICAgICAgICAgY3VtdWwyICs9IHYyXG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gZHJhdyBvbmx5IG9uZSBsaW5lXG4gICAgICAgICAgICAgICAgLy9kcmF3IGNvcm5lciBsaW5lXG4gICAgICAgICAgICAgICAgLy9pZiAoc2lkZS5vciA9PSBcImhcIikge1xuICAgICAgICAgICAgICAgIGRyYXdDb3JuZXJMaW5lKGMxKVxuICAgICAgICAgICAgICAgIGRyYXdDb3JuZXJMaW5lKGMyKVxuICAgICAgICAgICAgICAgIC8vaWYgKHRoaXMuYW5nbGUgPiAwICYmIHNpZGUub3IgPT0gXCJoXCIpIGRyYXdDb3JuZXJMaW5lKGMyKVxuICAgICAgICAgICAgICAgIC8vZWxzZSBkcmF3Q29ybmVyTGluZShjMilcbiAgICAgICAgICAgICAgICAvL31cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXG4gICAgfVxufVxuXG5jb25zdCBjb21wdXRlVG90YWwgPSAoY2VsbCwgY2F0ZWdvcmllcykgPT4ge1xuICAgIGlmICghY2VsbCkgcmV0dXJuIDBcbiAgICBsZXQgdG90YWwgPSAwXG4gICAgZm9yIChsZXQgY29sdW1uIG9mIGNhdGVnb3JpZXMpIHtcbiAgICAgICAgY29uc3QgdiA9IGNlbGxbY29sdW1uXVxuICAgICAgICBpZiAoIXYpIGNvbnRpbnVlXG4gICAgICAgIHRvdGFsICs9ICt2XG4gICAgfVxuICAgIHJldHVybiB0b3RhbCB8fCAwXG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcblxuLyoqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBKb3lQbG90U3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgaGVpZ2h0IG9mIGEgY2VsbCBpbiBnZW9ncmFwaGljYWwgdW5pdC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0IHx8ICgoYywgcikgPT4gciAqIE1hdGgucmFuZG9tKCkpIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLHttaW46bnVtYmVyLCBtYXg6bnVtYmVyfSxudW1iZXIsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMubGluZUNvbG9yID0gb3B0cy5saW5lQ29sb3IgfHwgKCh5LCB5cywgciwgeikgPT4gJyNCQkInKVxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcix7bWluOm51bWJlciwgbWF4Om51bWJlcn0sbnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmxpbmVXaWR0aCA9IG9wdHMubGluZVdpZHRoIHx8ICgoeSwgeXMsIHIsIHopID0+IHopXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLHttaW46bnVtYmVyLCBtYXg6bnVtYmVyfSxudW1iZXIsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuZmlsbENvbG9yID0gb3B0cy5maWxsQ29sb3IgfHwgKCh5LCB5cywgciwgeikgPT4gJyNjMDhjNTk2OCcpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9pbmRleCBjZWxscyBieSB5IGFuZCB4XG4gICAgICAgIC8qKiAgQHR5cGUge29iamVjdH0gKi9cbiAgICAgICAgY29uc3QgaW5kID0ge31cbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICBsZXQgcm93ID0gaW5kW2NlbGwueV1cbiAgICAgICAgICAgIGlmICghcm93KSB7XG4gICAgICAgICAgICAgICAgcm93ID0ge31cbiAgICAgICAgICAgICAgICBpbmRbY2VsbC55XSA9IHJvd1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcm93W2NlbGwueF0gPSB0aGlzLmhlaWdodChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG4gICAgICAgIH1cblxuICAgICAgICAvL2NvbXB1dGUgZXh0ZW50XG4gICAgICAgIGNvbnN0IGUgPSBnZW9DYW52YXMuZXh0R2VvXG4gICAgICAgIGlmICghZSkgcmV0dXJuXG4gICAgICAgIGNvbnN0IHhNaW4gPSBNYXRoLmZsb29yKGUueE1pbiAvIHJlc29sdXRpb24pICogcmVzb2x1dGlvblxuICAgICAgICBjb25zdCB4TWF4ID0gTWF0aC5mbG9vcihlLnhNYXggLyByZXNvbHV0aW9uKSAqIHJlc29sdXRpb25cbiAgICAgICAgY29uc3QgeU1pbiA9IE1hdGguZmxvb3IoZS55TWluIC8gcmVzb2x1dGlvbikgKiByZXNvbHV0aW9uXG4gICAgICAgIGNvbnN0IHlNYXggPSBNYXRoLmZsb29yKGUueU1heCAvIHJlc29sdXRpb24pICogcmVzb2x1dGlvblxuXG4gICAgICAgIC8qKiAgQHR5cGUge3ttaW46bnVtYmVyLCBtYXg6bnVtYmVyfX0gKi9cbiAgICAgICAgY29uc3QgeXMgPSB7IG1pbjogeU1pbiwgbWF4OiB5TWF4IH1cblxuICAgICAgICAvL2RyYXcgbGluZXMsIHJvdyBieSByb3csIHN0YXRpbmcgZnJvbSB0aGUgdG9wXG4gICAgICAgIGN0eC5saW5lSm9pbiA9ICdyb3VuZCdcbiAgICAgICAgZm9yIChsZXQgeSA9IHlNYXg7IHkgPj0geU1pbjsgeSAtPSByZXNvbHV0aW9uKSB7XG4gICAgICAgICAgICAvL2dldCByb3dcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IGluZFt5XVxuXG4gICAgICAgICAgICAvL25vIHJvd1xuICAgICAgICAgICAgaWYgKCFyb3cpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vcGxhY2UgZmlyc3QgcG9pbnRcbiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgY3R4Lm1vdmVUbyh4TWluIC0gcmVzb2x1dGlvbiAvIDIsIHkpXG5cbiAgICAgICAgICAgIC8vc3RvcmUgdGhlIHByZXZpb3VzIGhlaWdodFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgbGV0IGhHX1xuXG4gICAgICAgICAgICAvL2dvIHRocm91Z2ggdGhlIGxpbmUgY2VsbHNcbiAgICAgICAgICAgIGZvciAobGV0IHggPSB4TWluOyB4IDw9IHhNYXg7IHggKz0gcmVzb2x1dGlvbikge1xuICAgICAgICAgICAgICAgIC8vZ2V0IGNvbHVtbiB2YWx1ZVxuICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAgICAgICAgIGxldCBoRyA9IHJvd1t4XVxuICAgICAgICAgICAgICAgIGlmICghaEcpIGhHID0gMFxuXG4gICAgICAgICAgICAgICAgaWYgKGhHIHx8IGhHXykge1xuICAgICAgICAgICAgICAgICAgICAvL2RyYXcgbGluZSBvbmx5IHdoZW4gYXQgbGVhc3Qgb25lIG9mIGJvdGggdmFsdWVzIGlzIG5vbi1udWxsXG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyB0ZXN0IGJlemllckN1cnZlVG9cbiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4ICsgcmVzb2x1dGlvbiAvIDIsIHkgKyBoRylcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL2Vsc2UgbW92ZSB0aGUgcG9pbnRcbiAgICAgICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyh4ICsgcmVzb2x1dGlvbiAvIDIsIHkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vc3RvcmUgdGhlIHByZXZpb3VzIHZhbHVlXG4gICAgICAgICAgICAgICAgaEdfID0gaEdcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9sYXN0IHBvaW50XG4gICAgICAgICAgICBpZiAoaEdfKSBjdHgubGluZVRvKHhNYXggKyByZXNvbHV0aW9uIC8gMiwgeSlcblxuICAgICAgICAgICAgLy9kcmF3IGZpbGxcbiAgICAgICAgICAgIGNvbnN0IGZjID0gdGhpcy5maWxsQ29sb3IoeSwgeXMsIHJlc29sdXRpb24sIHopXG4gICAgICAgICAgICBpZiAoZmMgJiYgZmMgIT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGZjXG4gICAgICAgICAgICAgICAgY3R4LmZpbGwoKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL2RyYXcgbGluZVxuICAgICAgICAgICAgY29uc3QgbGMgPSB0aGlzLmxpbmVDb2xvcih5LCB5cywgcmVzb2x1dGlvbiwgeilcbiAgICAgICAgICAgIGNvbnN0IGx3ID0gdGhpcy5saW5lV2lkdGgoeSwgeXMsIHJlc29sdXRpb24sIHopXG4gICAgICAgICAgICBpZiAobGMgJiYgbGMgIT0gJ25vbmUnICYmIGx3ID4gMCkge1xuICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGxjXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IGx3XG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFRhbmFrYVN0eWxlIH0gZnJvbSAnLi9UYW5ha2FTdHlsZS5qcydcbmltcG9ydCB7IFN0cm9rZVN0eWxlIH0gZnJvbSAnLi9TdHJva2VTdHlsZS5qcydcbmltcG9ydCB7IFNxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlIH0gZnJvbSAnLi9TcXVhcmVDb2xvckNhdGVnb3J5V2ViR0xTdHlsZS5qcydcbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcblxuLyoqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBMZWdvU3R5bGUge1xuICAgIHN0YXRpYyBnZXQodmFsdWUsIGJyZWFrcywgY29sb3JzLCBvcHRzID0ge30pIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvL3RoZSBjb2xvcnNcbiAgICAgICAgLy9odHRwOi8vd3d3Lmplbm55c2NyYXlvbmNvbGxlY3Rpb24uY29tLzIwMjEvMDYvYWxsLWN1cnJlbnQtbGVnby1jb2xvcnMuaHRtbFxuICAgICAgICAvL2h0dHBzOi8vbGVvbmF3aWN6LmdpdGh1Yi5pby9sZWdvY29sb3JzL3JlZmVyZW5jZS9maWd1cmVzL1JFQURNRS1wbG90LTEucG5nXG4gICAgICAgIC8qb3B0cy5jb2xvcnMgPSBvcHRzLmNvbG9ycyB8fCBbXG4gICAgICAgICAgICAnIzAwODUyYicsIC8vZGFya2VyIGdyZWVuXG4gICAgICAgICAgICAnI2FmZDI0NicsIC8vbGlnaHQgZ3JlZW5cbiAgICAgICAgICAgICcjZmFjODBhJywgLy9kYXJrIHllbGxvd1xuICAgICAgICAgICAgJyNiYjgwNWEnLCAvL2Jyb3duXG4gICAgICAgICAgICAnI2Q2NzkyMycsIC8vbW9zdGFyZFxuICAgICAgICAgICAgJyNjYjRlMjknLCAvL3JlZGlzaFxuICAgICAgICAgICAgJyNiNDAwMDAnLCAvL3JlZFxuICAgICAgICAgICAgJyM3MjAwMTInLCAvL2RhcmsgcmVkXG4gICAgICAgICAgICAvL1wicHVycGxlXCIsXG4gICAgICAgICAgICAvL1wiI2VlZVwiIC8vd2hpdGhlXG4gICAgICAgIF0qL1xuXG4gICAgICAgIG9wdHMuY29sRGFyayA9IG9wdHMuY29sRGFyayB8fCAnIzMzMydcbiAgICAgICAgb3B0cy5jb2xCcmlnaHQgPSBvcHRzLmNvbEJyaWdodCB8fCAnI2FhYSdcbiAgICAgICAgb3B0cy53aWR0aEZhY3RvciA9IG9wdHMud2lkdGhGYWN0b3IgfHwgMC4xMlxuXG4gICAgICAgIC8vcmV1c2UgdGFuYWthIGFzIGJhc2lzXG4gICAgICAgIGNvbnN0IHRzID0gVGFuYWthU3R5bGUuZ2V0KHZhbHVlLCBicmVha3MsIGNvbG9ycywgb3B0cylcbiAgICAgICAgLy9zdHlsZSB0byBzaG93IGxpbWl0cyBiZXR3ZWVuIHBpZWNlc1xuICAgICAgICBjb25zdCBzc3QgPSBuZXcgU3Ryb2tlU3R5bGUoe1xuICAgICAgICAgICAgc3Ryb2tlQ29sb3I6ICgpID0+ICcjNjY2JyxcbiAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAoYywgciwgeikgPT4gMC4yICogeixcbiAgICAgICAgICAgIGZpbHRlcjogb3B0cy5maWx0ZXIsXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHRzWzBdLFxuICAgICAgICAgICAgc3N0LFxuICAgICAgICAgICAgdHNbMV0sXG4gICAgICAgICAgICBuZXcgTGVnb1RvcFN0eWxlKHsgY29sRGFyazogb3B0cy5jb2xEYXJrLCBjb2xCcmlnaHQ6IG9wdHMuY29sQnJpZ2h0LCBmaWx0ZXI6IG9wdHMuZmlsdGVyIH0pLFxuICAgICAgICBdXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwpOnN0cmluZ30gY29kZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBjb2xvclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICogQHJldHVybnMge0FycmF5LjxTdHlsZT59XG4gICAgICovXG4gICAgc3RhdGljIGdldENhdGVnb3J5KGNvZGUsIGNvbG9yLCBvcHRzKSB7XG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgb3B0cy5jb2xEYXJrID0gb3B0cy5jb2xEYXJrIHx8ICcjMzMzJ1xuICAgICAgICBvcHRzLmNvbEJyaWdodCA9IG9wdHMuY29sQnJpZ2h0IHx8ICcjYWFhJ1xuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHMgPSBuZXcgU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUoeyBjb2RlOiBjb2RlLCBjb2xvcjogY29sb3IgfSlcbiAgICAgICAgLy9zdHlsZSB0byBzaG93IGxpbWl0cyBiZXR3ZWVuIHBpZWNlc1xuICAgICAgICBjb25zdCBzc3QgPSBuZXcgU3Ryb2tlU3R5bGUoeyBzdHJva2VDb2xvcjogKCkgPT4gJyM2NjYnLCBzdHJva2VXaWR0aDogKGMsIHIsIHopID0+IDAuMiAqIHogfSlcblxuICAgICAgICByZXR1cm4gW3MsIHNzdCwgbmV3IExlZ29Ub3BTdHlsZSh7IGNvbERhcms6IG9wdHMuY29sRGFyaywgY29sQnJpZ2h0OiBvcHRzLmNvbEJyaWdodCB9KV1cbiAgICB9XG59XG5cbi8qKlxuICogQSBzdHlsZSB0byBkcmF3IHRvcCBjaXJjbGUgb2YgbGVnbyBicmlja3MuXG4gKi9cbmNsYXNzIExlZ29Ub3BTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R8dW5kZWZpbmVkfSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuICAgICAgICB0aGlzLmNvbERhcmsgPSBvcHRzLmNvbERhcmsgfHwgJyMzMzMnXG4gICAgICAgIHRoaXMuY29sQnJpZ2h0ID0gb3B0cy5jb2xCcmlnaHQgfHwgJyNhYWEnXG4gICAgfVxuXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICBjdHgubGluZVdpZHRoID0gMC42ICogZ2VvQ2FudmFzLnZpZXcuelxuXG4gICAgICAgIC8vZGFyayBwYXJ0XG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sRGFya1xuICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgIGN0eC5hcmMoYy54ICsgciAqIDAuNSwgYy55ICsgciAqIDAuNSwgciAqIDAuNTUgKiAwLjUsIE1hdGguUEkgLyA0LCAtTWF0aC5QSSAqICgzIC8gNCksIHRydWUpXG4gICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vYnJpZ2h0IHBhcnRcbiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb2xCcmlnaHRcbiAgICAgICAgZm9yIChsZXQgYyBvZiBjZWxscykge1xuICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBjdHguYXJjKGMueCArIHIgKiAwLjUsIGMueSArIHIgKiAwLjUsIHIgKiAwLjU1ICogMC41LCBNYXRoLlBJIC8gNCwgLU1hdGguUEkgKiAoMyAvIDQpLCBmYWxzZSlcbiAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5cbi8qKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgTW9zYWljU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGNlbGwuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+ICcjRUE2QkFDJykgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIFRoZSBtb3NhaWMgZmFjdG9yLCB3aXRoaW4gWzAsMC41XS4gU2V0IHRvIDAgZm9yIG5vIG1vc2FpYyBlZmZlY3QuIFNldCB0byAwLjUgZm9yIHN0cm9uZyBtb3NhaWMgZWZmZWN0LlxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm1vc2FpY0ZhY3RvciA9IG9wdHMubW9zYWljRmFjdG9yIHx8IDAuMTVcblxuICAgICAgICAvKiogVGhlIG1vc2FpYyBzaGFkb3cgZmFjdG9yLCB3aXRoaW4gWzAsMC41XS4gU2V0IHRvIDAgZm9yIG5vIG1vc2FpYyBzaGFkb3cuIFNldCB0byAwLjUgZm9yIHN0cm9uZyBtb3NhaWMgc2hhZG93LlxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnNoYWRvd0ZhY3RvciA9IG9wdHMuc2hhZG93RmFjdG9yIHx8IDAuMlxuXG4gICAgICAgIC8qKiBUaGUgbW9zYWljIHNoYWRvdyBjb2xvci5cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5zaGFkb3dDb2xvciA9IG9wdHMuc2hhZG93Q29sb3IgfHwgJyM1NTUnXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgY29uc3QgY3R4ID0gZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL3NldCBzdHJva2Ugc3R5bGUsIGZvciBzaGFkb3dcbiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5zaGFkb3dDb2xvclxuICAgICAgICBjdHgubGluZVdpZHRoID0gdGhpcy5zaGFkb3dGYWN0b3IgKiByZXNvbHV0aW9uXG4gICAgICAgIGN0eC5saW5lSm9pbiA9ICdyb3VuZCdcbiAgICAgICAgY3R4LmxpbmVDYXAgPSAnYnV0dCdcblxuICAgICAgICAvL2Z1bmN0aW9uIHRvIGNvbXB1dGUgcG9zaXRpb24gbW9zYWljIGVmZmVjdFxuICAgICAgICBjb25zdCBkID0gcmVzb2x1dGlvbiAqIHRoaXMubW9zYWljRmFjdG9yXG4gICAgICAgIGNvbnN0IG1vc2FpYyA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IHg6IE1hdGgucmFuZG9tKCkgKiBkLCB5OiBNYXRoLnJhbmRvbSgpICogZCB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAvL3NldCBmaWxsIGNvbG9yXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT09ICdub25lJykgY29udGludWVcbiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBjb2xcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByZXNvbHV0aW9uLCB6KVxuXG4gICAgICAgICAgICAvL2NvbXB1dGUgcG9zaXRpb24gbW9zYWljIGVmZmVjdFxuICAgICAgICAgICAgY29uc3QgbGwgPSBtb3NhaWMoKSxcbiAgICAgICAgICAgICAgICB1bCA9IG1vc2FpYygpLFxuICAgICAgICAgICAgICAgIGxyID0gbW9zYWljKCksXG4gICAgICAgICAgICAgICAgdXIgPSBtb3NhaWMoKVxuXG4gICAgICAgICAgICAvL3N0cm9rZVxuICAgICAgICAgICAgaWYgKHRoaXMuc2hhZG93RmFjdG9yID4gMCkge1xuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgbGwueCwgY2VsbC55ICsgb2Zmc2V0LmR5ICsgbGwueSlcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGNlbGwueCArIG9mZnNldC5keCArIHJlc29sdXRpb24gLSBsci54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyBsci55KVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgcmVzb2x1dGlvbiAtIHVyLngsIGNlbGwueSArIG9mZnNldC5keSArIHJlc29sdXRpb24gLSB1ci55KVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL2ZpbGxcblxuICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBjdHgubW92ZVRvKGNlbGwueCArIG9mZnNldC5keCArIGxsLngsIGNlbGwueSArIG9mZnNldC5keSArIGxsLnkpXG4gICAgICAgICAgICBjdHgubGluZVRvKGNlbGwueCArIG9mZnNldC5keCArIHJlc29sdXRpb24gLSBsci54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyBsci55KVxuICAgICAgICAgICAgY3R4LmxpbmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyByZXNvbHV0aW9uIC0gdXIueCwgY2VsbC55ICsgb2Zmc2V0LmR5ICsgcmVzb2x1dGlvbiAtIHVyLnkpXG4gICAgICAgICAgICBjdHgubGluZVRvKGNlbGwueCArIG9mZnNldC5keCArIHVsLngsIGNlbGwueSArIG9mZnNldC5keSArIHJlc29sdXRpb24gLSB1bC55KVxuICAgICAgICAgICAgY3R4LmZpbGwoKVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcblxuLyoqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBOaW5qYVN0YXJTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gJyNFQTZCQUMnKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgYSBjZWxsLCB3aXRoaW4gWzAsMV06XG4gICAgICAgICAqICAtIDAsIG5vdGhpbmcgc2hvd25cbiAgICAgICAgICogIC0gMSwgZW50aXJlIHNxdWFyZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZSB8fCAoKGNlbGwsIHJlc29sdXRpb24pID0+IHJlc29sdXRpb24pIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2hhcGUuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAoKCkgPT4gJ28nKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuICAgICAgICBjb25zdCBjdHggPSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4XG5cbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAqIDAuNVxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAvL2NvbG9yXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT09ICdub25lJykgY29udGludWVcbiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBjb2xcblxuICAgICAgICAgICAgLy9zaXplIC0gaW4gZ2VvIHVuaXRcbiAgICAgICAgICAgIGxldCBrID0gdGhpcy5zaXplKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcbiAgICAgICAgICAgIGsgPSBrIDwgMCA/IDAgOiBrID4gMSA/IDEgOiBrXG4gICAgICAgICAgICBjb25zdCBzRzIgPSBrICogcjJcblxuICAgICAgICAgICAgLy9zaGFwZVxuICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSB0aGlzLnNoYXBlID8gdGhpcy5zaGFwZShjZWxsKSA6ICdvJ1xuICAgICAgICAgICAgaWYgKHNoYXBlID09PSAnbm9uZScpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgLy9UT0RPIHVzZVxuICAgICAgICAgICAgLy9jb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByLCB6KVxuXG4gICAgICAgICAgICAvL2NlbnRlciBwb3NpdGlvblxuICAgICAgICAgICAgY29uc3QgY3ggPSBjZWxsLnggKyByMlxuICAgICAgICAgICAgY29uc3QgY3kgPSBjZWxsLnkgKyByMlxuXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdwJykge1xuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oY3gsIGN5ICsgcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCArIHNHMiwgY3kgKyBzRzIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCArIHIyLCBjeSlcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGN4ICsgc0cyLCBjeSAtIHNHMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGN4LCBjeSAtIHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oY3ggLSBzRzIsIGN5IC0gc0cyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oY3ggLSByMiwgY3kpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCAtIHNHMiwgY3kgKyBzRzIpXG4gICAgICAgICAgICAgICAgY3R4LmZpbGwoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ28nKSB7XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjeCwgY3kgKyBzRzIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCArIHIyLCBjeSArIHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oY3ggKyBzRzIsIGN5KVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oY3ggKyByMiwgY3kgLSByMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGN4LCBjeSAtIHNHMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGN4IC0gcjIsIGN5IC0gcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCAtIHNHMiwgY3kpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCAtIHIyLCBjeSArIHIyKVxuICAgICAgICAgICAgICAgIGN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNoYXBlOicgKyBzaGFwZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5cbi8qKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgUGlsbGFyU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgaGVpZ2h0IG9mIHRoZSBsaW5lIHJlcHJlc2VudGluZyBhIGNlbGwsIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodFxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGxpbmUgcmVwcmVzZW50aW5nIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gJyNjMDhjNTknKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHdpZHRoIG9mIHRoZSBsaW5lIHJlcHJlc2VudGluZyBhIGNlbGwsIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiAwLjUgKiByZXNvbHV0aW9uKVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgd2lkdGggb2YgdGhlIGxpbmUgcmVwcmVzZW50aW5nIGEgY2VsbCwgaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlciwgbnVtYmVyLG9iamVjdCk6Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5zaW1wbGUgPSBvcHRzLnNpbXBsZSB8fCAoKCkgPT4gZmFsc2UpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMudmlld0hlaWdodEZhY3RvciA9IG9wdHMudmlld0hlaWdodEZhY3RvciB8fCAxLjVcbiAgICAgICAgLy8wLDAgaXMgdGhlIGNlbnRlclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy52aWV3U1ggPSBvcHRzLnZpZXdTWCA9PSB1bmRlZmluZWQgPyAwIDogb3B0cy52aWV3U1hcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMudmlld1NZID0gb3B0cy52aWV3U1kgPT0gdW5kZWZpbmVkID8gLTAuNSA6IG9wdHMudmlld1NZXG5cbiAgICAgICAgLy9UT0RPIHJlcGxhY2Ugd2l0aCBzdW4gbG9jYXRpb24gP1xuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaGFkb3dEaXJlY3Rpb24gPVxuICAgICAgICAgICAgb3B0cy5zaGFkb3dEaXJlY3Rpb24gPT0gdW5kZWZpbmVkID8gKC00MC4zICogTWF0aC5QSSkgLyAxODAuMCA6IG9wdHMuc2hhZG93RGlyZWN0aW9uXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnNoYWRvd0ZhY3RvciA9IG9wdHMuc2hhZG93RmFjdG9yIHx8IDAuM1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5zaGFkb3dDb2xvciA9IG9wdHMuc2hhZG93Q29sb3IgfHwgJyMwMDAwMDAzMydcblxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5vdXRsaW5lQ29sID0gb3B0cy5vdXRsaW5lQ29sIHx8ICcjRkZGRkZGJ1xuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5vdXRsaW5lV2lkdGhQaXggPSBvcHRzLm91dGxpbmVXaWR0aFBpeCA9PSB1bmRlZmluZWQgPyAwLjUgOiBvcHRzLm91dGxpbmVXaWR0aFBpeFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgc2VnbWVudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgY29uc3QgY3R4ID0gZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL2dldCB2aWV3IGNlbnRlciBnZW8gcG9zaXRpb25cbiAgICAgICAgY29uc3QgY3Z4ID0gZ2VvQ2FudmFzLnZpZXcueCArIHRoaXMudmlld1NYICogZ2VvQ2FudmFzLncgKiB6XG4gICAgICAgIGNvbnN0IGN2eSA9IGdlb0NhbnZhcy52aWV3LnkgKyB0aGlzLnZpZXdTWSAqIGdlb0NhbnZhcy5oICogelxuICAgICAgICAvL2dldCB2aWV3IGhlaWdodFxuICAgICAgICBjb25zdCBIID0gdGhpcy52aWV3SGVpZ2h0RmFjdG9yICogKGdlb0NhbnZhcy53ICsgZ2VvQ2FudmFzLmgpICogMC41ICogelxuXG4gICAgICAgIC8vc29ydCBjZWxscyBieSB5IGFuZCB4XG4gICAgICAgIC8vY29uc3QgZGlzdFRvVmlld0NlbnRlciA9IChjKSA9PiB7IGNvbnN0IGR4ID0gY3Z4IC0gYy54LCBkeSA9IGN2eSAtIGMueTsgcmV0dXJuIE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSkgfVxuICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IDEwMDAwMDAwMCAqIChjMi55IC0gYzEueSkgKyBjMS54IC0gYzIueClcblxuICAgICAgICAvL2dldCBzaW1wbGUgaW5mb3JtYXRpb25cbiAgICAgICAgY29uc3Qgc2ltcGxlID0gdGhpcy5zaW1wbGUocmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxuXG4gICAgICAgIGN0eC5saW5lQ2FwID0gc2ltcGxlID8gJ2J1dHQnIDogJ3JvdW5kJ1xuXG4gICAgICAgIC8vZHJhdyBzaGFkb3dzXG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHRoaXMuc2hhZG93Q29sb3JcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHRoaXMuc2hhZG93Q29sb3JcbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgLy93aWR0aFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIXdHIHx8IHdHIDwgMCkgY29udGludWVcblxuICAgICAgICAgICAgLy9oZWlnaHRcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGhHID0gdGhpcy5oZWlnaHQgPyB0aGlzLmhlaWdodChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWhHIHx8IGhHIDwgMCkgY29udGludWVcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICAvL1RPRE8gdXNlIHRoYXRcbiAgICAgICAgICAgIC8vY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoYywgcmVzb2x1dGlvbiwgeilcblxuICAgICAgICAgICAgLy9zZXQgd2lkdGhcbiAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSB3R1xuXG4gICAgICAgICAgICAvL2NvbXB1dGUgY2VsbCBjZW50ZXIgcG9zdGl0aW9uXG4gICAgICAgICAgICBjb25zdCBjeCA9IGNlbGwueCArIHJlc29sdXRpb24gLyAyXG4gICAgICAgICAgICBjb25zdCBjeSA9IGNlbGwueSArIHJlc29sdXRpb24gLyAyXG4gICAgICAgICAgICBjb25zdCBscyA9IGhHICogdGhpcy5zaGFkb3dGYWN0b3JcblxuICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnRcbiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgY3R4Lm1vdmVUbyhjeCwgY3kpXG4gICAgICAgICAgICBjdHgubGluZVRvKGN4ICsgbHMgKiBNYXRoLmNvcyh0aGlzLnNoYWRvd0RpcmVjdGlvbiksIGN5ICsgbHMgKiBNYXRoLnNpbih0aGlzLnNoYWRvd0RpcmVjdGlvbikpXG4gICAgICAgICAgICBjdHguc3Ryb2tlKClcblxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgIGlmICh0aGlzLnNpbXBsZSkge1xuICAgICAgICAgICAgICAgIC8vZHJhdyBiYXNlIGNpcmNsZVxuICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgICAgICBjZy5jdHguYXJjKFxuICAgICAgICAgICAgICAgICAgICBjeCwgY3ksXG4gICAgICAgICAgICAgICAgICAgIHdHICogMC41LFxuICAgICAgICAgICAgICAgICAgICAwLCAyICogTWF0aC5QSSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIC8vY2cuY3R4LnN0cm9rZSgpO1xuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsKCk7XG4gICAgICAgICAgICB9Ki9cbiAgICAgICAgfVxuXG4gICAgICAgIC8vZHJhdyBwaWxsYXJzXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vY29sb3JcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghY29sKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3dpZHRoXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCB3RyA9IHRoaXMud2lkdGggPyB0aGlzLndpZHRoKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghd0cgfHwgd0cgPCAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2hlaWdodFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3QgaEcgPSB0aGlzLmhlaWdodCA/IHRoaXMuaGVpZ2h0KGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghaEcgfHwgaEcgPCAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgIC8vVE9ETyB1c2UgdGhhdFxuICAgICAgICAgICAgLy9jb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjLCByZXNvbHV0aW9uLCB6KVxuXG4gICAgICAgICAgICAvL2NvbXB1dGUgY2VsbCBjZW50ZXIgcG9zdGl0aW9uXG4gICAgICAgICAgICBjb25zdCBjeCA9IGNlbGwueCArIHJlc29sdXRpb24gLyAyXG4gICAgICAgICAgICBjb25zdCBjeSA9IGNlbGwueSArIHJlc29sdXRpb24gLyAyXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBhbmdsZVxuICAgICAgICAgICAgY29uc3QgZHggPSBjeCAtIGN2eCxcbiAgICAgICAgICAgICAgICBkeSA9IGN5IC0gY3Z5XG4gICAgICAgICAgICBjb25zdCBhID0gTWF0aC5hdGFuMihkeSwgZHgpXG4gICAgICAgICAgICBjb25zdCBEID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KVxuICAgICAgICAgICAgY29uc3QgZCA9IChEICogaEcpIC8gKEggLSBoRylcblxuICAgICAgICAgICAgaWYgKHNpbXBsZSkge1xuICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50XG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gY29sXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHdHXG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjeCwgY3kpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCArIGQgKiBNYXRoLmNvcyhhKSwgY3kgKyBkICogTWF0aC5zaW4oYSkpXG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vZHJhdyBiYWNrZ3JvdW5kIHNlZ21lbnRcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSB0aGlzLm91dGxpbmVDb2xcbiAgICAgICAgICAgICAgICBjdHgubGluZVdpZHRoID0gd0cgKyAyICogdGhpcy5vdXRsaW5lV2lkdGhQaXggKiB6XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjeCwgY3kpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCArIGQgKiBNYXRoLmNvcyhhKSwgY3kgKyBkICogTWF0aC5zaW4oYSkpXG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG5cbiAgICAgICAgICAgICAgICAvL2RyYXcgc2VnbWVudFxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGNvbFxuICAgICAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSB3R1xuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oY3gsIGN5KVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oY3ggKyBkICogTWF0aC5jb3MoYSksIGN5ICsgZCAqIE1hdGguc2luKGEpKVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuXG4gICAgICAgICAgICAgICAgLy9kcmF3IHRvcCBjaXJjbGVcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSB0aGlzLm91dGxpbmVDb2xcbiAgICAgICAgICAgICAgICAvL2NnLmN0eC5maWxsU3R5bGUgPSBcIiNjMDhjNTlcIlxuICAgICAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSB0aGlzLm91dGxpbmVXaWR0aFBpeCAqIHpcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHguYXJjKGN4ICsgZCAqIE1hdGguY29zKGEpLCBjeSArIGQgKiBNYXRoLnNpbihhKSwgd0cgKiAwLjUsIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSlcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgICAgICAvL2NnLmN0eC5maWxsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL2luIGNhc2UuLi5cbiAgICAgICAgY3R4LmxpbmVDYXAgPSAnYnV0dCdcblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKipcbiAqIEEgc3R5bGUgd2hlcmUgZWFjaCBjZWxsIGlzIHJlcHJlc2VudGVkIGJ5IGEgc2VnbWVudCB3aG9zZSBsZW5ndGgsIHdpZHRoLCBjb2xvciBhbmQgb3JpZW50YXRpb24gY2FuIHZhcnkgYWNjb3JkaW5nIHRvIHN0YXRpc3RpY2FsIHZhbHVlcy5cbiAqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWdtZW50U3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGNlbGwgc2VnbWVudC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gJyNFQTZCQUMnKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHdpZHRoIG9mIHRoZSBzZWdtZW50IHJlcHJlc2VudGluZyBhIGNlbGwsIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiByZXNvbHV0aW9uICogMC4xKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGxlbmd0aCBvZiB0aGUgc2VnbWVudCByZXByZXNlbnRpbmcgYSBjZWxsLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMubGVuZ3RoID0gb3B0cy5sZW5ndGggfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiByZXNvbHV0aW9uICogMC45KSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIG9yaWVudGF0aW9uIChpbiBkZWdyZWVzKSBvZiB0aGUgc2VnbWVudCByZXByZXNlbnRpbmcgYSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMub3JpZW50YXRpb24gPSBvcHRzLm9yaWVudGF0aW9uIHx8ICgoKSA9PiAxODAgKiBNYXRoLnJhbmRvbSgpKSAvLyhjLHIseix2cykgPT4ge31cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHNlZ21lbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9cbiAgICAgICAgY3R4LmxpbmVDYXAgPSAnYnV0dCdcblxuICAgICAgICAvL2NvbnZlcnNpb24gZmFjdG9yIGRlZ3JlZSAtPiByYWRpYW5cbiAgICAgICAgY29uc3QgZiA9IE1hdGguUEkgLyAxODBcblxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAvL2NvbG9yXG4gICAgICAgICAgICAvKiogQHR5cGUge3N0cmluZ3x1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWNvbCkgY29udGludWVcblxuICAgICAgICAgICAgLy93aWR0aFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIXdHIHx8IHdHIDwgMCkgY29udGludWVcblxuICAgICAgICAgICAgLy9sZW5ndGhcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGxHID0gdGhpcy5sZW5ndGggPyB0aGlzLmxlbmd0aChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWxHIHx8IGxHIDwgMCkgY29udGludWVcblxuICAgICAgICAgICAgLy9vcmllbnRhdGlvbiAoaW4gcmFkaWFuKVxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgICAgICBjb25zdCBvciA9IHRoaXMub3JpZW50YXRpb24oY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSAqIGZcbiAgICAgICAgICAgIGlmIChvciA9PT0gdW5kZWZpbmVkIHx8IGlzTmFOKG9yKSkgY29udGludWVcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByZXNvbHV0aW9uLCB6KVxuXG4gICAgICAgICAgICAvL3NldCBjb2xvciBhbmQgd2lkdGhcbiAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGNvbFxuICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHdHXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBzZWdtZW50IGNlbnRlciBwb3N0aXRpb25cbiAgICAgICAgICAgIGNvbnN0IGN4ID0gY2VsbC54ICsgcmVzb2x1dGlvbiAvIDIgKyBvZmZzZXQuZHhcbiAgICAgICAgICAgIGNvbnN0IGN5ID0gY2VsbC55ICsgcmVzb2x1dGlvbiAvIDIgKyBvZmZzZXQuZHlcblxuICAgICAgICAgICAgLy9jb21wdXRlIHNlZ21lbnQgZGlyZWN0aW9uXG4gICAgICAgICAgICBjb25zdCBkeCA9IDAuNSAqIE1hdGguY29zKG9yKSAqIGxHXG4gICAgICAgICAgICBjb25zdCBkeSA9IDAuNSAqIE1hdGguc2luKG9yKSAqIGxHXG5cbiAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50XG4gICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgIGN0eC5tb3ZlVG8oY3ggLSBkeCwgY3kgLSBkeSlcbiAgICAgICAgICAgIGN0eC5saW5lVG8oY3ggKyBkeCwgY3kgKyBkeSlcbiAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyB2aWV3U2NhbGU6IHZpZXdTY2FsZSwgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgY2VsbHM6IGNlbGxzIH0pXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5cbi8qKlxuICogQSB2ZXJ5IGdlbmVyaWMgc3R5bGUgdGhhdCBzaG93cyBncmlkIGNlbGxzIHdpdGggc3BlY2lmaWMgY29sb3IsIHNpemUgYW5kIHNoYXBlLlxuICogSXQgY2FuIGJlIHVzZWQgdG8gc2hvdyB2YXJpYWJsZXMgYXMgY2VsbCBjb2xvcnMsIGNlbGwgc2l6ZSwgY2VsbCBzaGFwZSwgb3IgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSB0aHJlZSB2aXN1YWwgdmFyaWFibGVzLlxuICpcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFNoYXBlQ29sb3JTaXplU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuICAgICAgICAvKiogQHR5cGUgeyhmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOnN0cmluZykgfCBzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICcjRUE2QkFDJ1xuXG4gICAgICAgIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyKSB8IG51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIHx8ICgoY2VsbCwgcmVzb2x1dGlvbikgPT4gcmVzb2x1dGlvbilcblxuICAgICAgICAvKiogQHR5cGUgeyhmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsIG51bWJlcixvYmplY3QpOmltcG9ydChcIi4uL2NvcmUvU3R5bGUuanNcIikuU2hhcGUpIHwgc3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAnc3F1YXJlJ1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgc3F1YXJlcywgd2l0aCB2YXJpb3VzIGNvbG9ycyBhbmQgc2l6ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzIC0gVGhlIGdyaWQgY2VsbHMgdG8gZHJhdy5cbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzIC0gVGhlIGNhbnZhcyB0byBkcmF3IG9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIC0gUmVzb2x1dGlvbiBvZiB0aGUgZ3JpZC5cbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL3pvb21cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uICogMC41XG5cbiAgICAgICAgLy8gUHJlY29tcHV0ZSBpZiBjb2xvciwgc2l6ZSwgYW5kIHNoYXBlIGFyZSBmdW5jdGlvbnMsIGZvciBlZmZpY2llbmN5XG4gICAgICAgIGNvbnN0IGlzQ29sb3JGdW5jdGlvbiA9IHR5cGVvZiB0aGlzLmNvbG9yID09PSAnZnVuY3Rpb24nXG4gICAgICAgIGNvbnN0IGlzU2l6ZUZ1bmN0aW9uID0gdHlwZW9mIHRoaXMuc2l6ZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICBjb25zdCBpc1NoYXBlRnVuY3Rpb24gPSB0eXBlb2YgdGhpcy5zaGFwZSA9PT0gJ2Z1bmN0aW9uJ1xuXG4gICAgICAgIGNvbnN0IGRlZmF1bHRDb2xvciA9IHRoaXMuY29sb3IgfHwgJ2JsYWNrJ1xuICAgICAgICBjb25zdCBkZWZhdWx0U2l6ZSA9IHRoaXMuc2l6ZSB8fCByZXNvbHV0aW9uXG4gICAgICAgIGNvbnN0IGRlZmF1bHRTaGFwZSA9IHRoaXMuc2hhcGUgfHwgJ3NxdWFyZSdcblxuICAgICAgICAvLyBPcHRpbWl6ZWRcbiAgICAgICAgY29uc3QgY29sb3JGdW5jdGlvbiA9IGlzQ29sb3JGdW5jdGlvbiA/IHRoaXMuY29sb3IgOiBudWxsXG4gICAgICAgIGNvbnN0IHNpemVGdW5jdGlvbiA9IGlzU2l6ZUZ1bmN0aW9uID8gdGhpcy5zaXplIDogbnVsbFxuICAgICAgICBjb25zdCBzaGFwZUZ1bmN0aW9uID0gaXNTaGFwZUZ1bmN0aW9uID8gdGhpcy5zaGFwZSA6IG51bGxcblxuICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAvLyBEZXRlcm1pbmUgY29sb3JcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgY29sID0gY29sb3JGdW5jdGlvbiA/IGNvbG9yRnVuY3Rpb24oYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IGRlZmF1bHRDb2xvclxuICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09PSAnbm9uZScpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vIERldGVybWluZSBzaXplXG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSBzaXplRnVuY3Rpb24gPyBzaXplRnVuY3Rpb24oYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IGRlZmF1bHRTaXplXG4gICAgICAgICAgICBpZiAoIXNpemUpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vIERldGVybWluZSBzaGFwZVxuICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBzaGFwZSA9IHNoYXBlRnVuY3Rpb24gPyBzaGFwZUZ1bmN0aW9uKGMsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiBkZWZhdWx0U2hhcGVcbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ25vbmUnKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGMsIHJlc29sdXRpb24sIHopXG5cbiAgICAgICAgICAgIC8vZ2V0IGNvbnRleHRcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcbiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBjb2xcbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ3NxdWFyZScpIHtcbiAgICAgICAgICAgICAgICAvL2RyYXcgc3F1YXJlXG4gICAgICAgICAgICAgICAgY29uc3QgZCA9IHJlc29sdXRpb24gKiAoMSAtIHNpemUgLyByZXNvbHV0aW9uKSAqIDAuNVxuICAgICAgICAgICAgICAgIGN0eC5maWxsUmVjdChjLnggKyBkICsgb2Zmc2V0LmR4LCBjLnkgKyBkICsgb2Zmc2V0LmR5LCBzaXplLCBzaXplKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ2NpcmNsZScpIHtcbiAgICAgICAgICAgICAgICAvL2RyYXcgY2lyY2xlXG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4LmFyYyhjLnggKyByMiArIG9mZnNldC5keCwgYy55ICsgcjIgKyBvZmZzZXQuZHksIHNpemUgKiAwLjUsIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSlcbiAgICAgICAgICAgICAgICBjdHguZmlsbCgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnZG9udXQnKSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IGRvbnV0XG4gICAgICAgICAgICAgICAgY29uc3QgeGMgPSBjLnggKyByMiArIG9mZnNldC5keCxcbiAgICAgICAgICAgICAgICAgICAgeWMgPSBjLnkgKyByMiArIG9mZnNldC5keVxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oeGMsIHljKVxuICAgICAgICAgICAgICAgIGN0eC5hcmMoeGMsIHljLCByMiwgMCwgMiAqIE1hdGguUEkpXG4gICAgICAgICAgICAgICAgY3R4LmFyYyh4YywgeWMsICgxIC0gc2l6ZSAvIHJlc29sdXRpb24pICogcjIsIDAsIDIgKiBNYXRoLlBJLCB0cnVlKVxuICAgICAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdkaWFtb25kJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHMyID0gc2l6ZSAqIDAuNVxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oYy54ICsgcjIgLSBzMiwgYy55ICsgcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyByMiwgYy55ICsgcjIgKyBzMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHIyICsgczIsIGMueSArIHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcjIsIGMueSArIHIyIC0gczIpXG4gICAgICAgICAgICAgICAgY3R4LmZpbGwoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3RyaWFuZ2xlX3VwJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyMiA9IChzaXplIC0gcmVzb2x1dGlvbikgLyAyXG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjLnggLSBkcjIsIGMueSAtIGRyMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHIyLCBjLnkgKyByZXNvbHV0aW9uICsgZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcmVzb2x1dGlvbiArIGRyMiwgYy55IC0gZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICd0cmlhbmdsZV9kb3duJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyMiA9IChzaXplIC0gcmVzb2x1dGlvbikgLyAyXG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjLnggLSBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyByMiwgYy55IC0gZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcmVzb2x1dGlvbiArIGRyMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcbiAgICAgICAgICAgICAgICBjdHguZmlsbCgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAndHJpYW5nbGVfbGVmdCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oYy54ICsgcmVzb2x1dGlvbiArIGRyMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCAtIGRyMiwgYy55ICsgcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgLSBkcjIpXG4gICAgICAgICAgICAgICAgY3R4LmZpbGwoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3RyaWFuZ2xlX3JpZ2h0Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyMiA9IChzaXplIC0gcmVzb2x1dGlvbikgLyAyXG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjLnggLSBkcjIsIGMueSAtIGRyMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSArIHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54IC0gZHIyLCBjLnkgKyByZXNvbHV0aW9uICsgZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNoYXBlOicgKyBzaGFwZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgdmlld1NjYWxlOiB2aWV3U2NhbGUsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIGNlbGxzOiBjZWxscyB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU2lkZVN0eWxlIH0gZnJvbSAnLi9TaWRlU3R5bGUuanMnXG5cbi8qKlxuICogQSBzdHlsZSB0byBzaG93IHRoZSBzaWRlcyBvZiBncmlkIGNlbGxzIGJhc2VkIG9uIHRoZWlyIGRpZmZlcmVudCBjYXRlZ29yaWVzLlxuICpcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFNpZGVDYXRlZ29yeVN0eWxlIGV4dGVuZHMgU2lkZVN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjYXRlZ29yeSBjb2RlIG9mIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2RlID0gb3B0cy5jb2RlXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkaWN0aW9uYXJ5IChzdHJpbmcgLT4gY29sb3IpIHdoaWNoIGdpdmUgdGhlIGNvbG9yIG9mIGVhY2ggY2F0ZWdvcnkuXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICAvL2J1aWxkIHNpZGVzXG5cbiAgICAgICAgLyoqICBAdHlwZSB7QXJyYXkuPGltcG9ydCgnLi9TaWRlU3R5bGUuanMnKS5TaWRlPn0gKi9cbiAgICAgICAgY29uc3Qgc2lkZXMgPSBTaWRlU3R5bGUuYnVpbGRTaWRlcyhjZWxscywgcmVzb2x1dGlvbilcbiAgICAgICAgaWYgKHNpZGVzLmxlbmd0aCA9PSAwKSByZXR1cm5cblxuICAgICAgICAvL2dldCBzaWRlIHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShzaWRlcywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL2RyYXcgc2lkZXNcblxuICAgICAgICBjdHgubGluZUNhcCA9ICdidXR0J1xuICAgICAgICBjb25zdCByMiA9IHJlc29sdXRpb24gKiAwLjVcbiAgICAgICAgZm9yIChsZXQgc2lkZSBvZiBzaWRlcykge1xuICAgICAgICAgICAgLy9nZXQgY2F0ZWdvcnkgY29kZXMgZm9yIGJvdGggY2VsbHNcbiAgICAgICAgICAgIGNvbnN0IGNvZGUxID0gc2lkZS5jMSA/IHRoaXMuY29kZShzaWRlLmMxLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgY29uc3QgY29kZTIgPSBzaWRlLmMyID8gdGhpcy5jb2RlKHNpZGUuYzIsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoY29kZTEgPT0gY29kZTIpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vd2lkdGhcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoc2lkZSwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8PSAwKSBjb250aW51ZVxuICAgICAgICAgICAgY29uc3QgdzIgPSB3RyAqIDAuNVxuXG4gICAgICAgICAgICAvL3NldCB3aWR0aFxuICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHdHXG5cbiAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50IHdpdGggY29ycmVjdCBvcmllbnRhdGlvblxuICAgICAgICAgICAgaWYgKHNpZGUub3IgPT09ICdoJykge1xuICAgICAgICAgICAgICAgIC8vdG9wIGxpbmVcbiAgICAgICAgICAgICAgICBpZiAoY29kZTIpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sb3JbY29kZTJdXG4gICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oc2lkZS54IC0gcjIsIHNpZGUueSArIHcyKVxuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKHNpZGUueCArIHIyLCBzaWRlLnkgKyB3MilcbiAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9ib3R0b20gbGluZVxuICAgICAgICAgICAgICAgIGlmIChjb2RlMSkge1xuICAgICAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb2xvcltjb2RlMV1cbiAgICAgICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhzaWRlLnggLSByMiwgc2lkZS55IC0gdzIpXG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oc2lkZS54ICsgcjIsIHNpZGUueSAtIHcyKVxuICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vcmlnaHQgbGluZVxuICAgICAgICAgICAgICAgIGlmIChjb2RlMikge1xuICAgICAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb2xvcltjb2RlMl1cbiAgICAgICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhzaWRlLnggKyB3Miwgc2lkZS55IC0gcjIpXG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oc2lkZS54ICsgdzIsIHNpZGUueSArIHIyKVxuICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL2xlZnQgbGluZVxuICAgICAgICAgICAgICAgIGlmIChjb2RlMSkge1xuICAgICAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb2xvcltjb2RlMV1cbiAgICAgICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhzaWRlLnggLSB3Miwgc2lkZS55IC0gcjIpXG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oc2lkZS54IC0gdzIsIHNpZGUueSArIHIyKVxuICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKiogQHR5cGVkZWYge3sgeDpudW1iZXIsIHk6bnVtYmVyLCBvcjpcInZcInxcImhcIiwgYzE6KGltcG9ydCgnLi4vY29yZS9EYXRhc2V0JykuQ2VsbCl8dW5kZWZpbmVkLCBjMjooaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQnKS5DZWxsKXx1bmRlZmluZWQgfX0gU2lkZSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtmdW5jdGlvbihBcnJheS48U2lkZT4sbnVtYmVyLCBudW1iZXIpOip9IFNpZGVWaWV3U2NhbGUgKi9cblxuLyoqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTaWRlU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiBhIGNlbGwgc2lkZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKFNpZGUsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKChzaWRlLCByZXNvbHV0aW9uLCB6LCBzaWRlVmlld1NjYWxlKSA9PiAnI0VBNkJBQycpXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiBhIGNlbGwgc2lkZSwgaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKFNpZGUsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgKChzaWRlLCByZXNvbHV0aW9uLCB6LCBzaWRlVmlld1NjYWxlKSA9PiByZXNvbHV0aW9uIC8gNSlcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGxlbmd0aCBvZiBhIGNlbGwgc2lkZSwgaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKFNpZGUsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5sZW5ndGggPSBvcHRzLmxlbmd0aCB8fCAoKHNpZGUsIHJlc29sdXRpb24sIHosIHNpZGVWaWV3U2NhbGUpID0+IHJlc29sdXRpb24pXG5cbiAgICAgICAgLyoqIFNldCB0byBBIG9yIHRydWUgc28gdGhhdCB0aGUgc2lkZSBpcyBkcmF3biBhcyBhIGRpYW1vbmQgKi9cbiAgICAgICAgdGhpcy5kaWFtb25kID0gb3B0cy5kaWFtb25kXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICAvL2J1aWxkIHNpZGVzXG5cbiAgICAgICAgLyoqICBAdHlwZSB7QXJyYXkuPFNpZGU+fSAqL1xuICAgICAgICBjb25zdCBzaWRlcyA9IFNpZGVTdHlsZS5idWlsZFNpZGVzKGNlbGxzLCByZXNvbHV0aW9uKVxuICAgICAgICBpZiAoc2lkZXMubGVuZ3RoID09IDApIHJldHVyblxuXG4gICAgICAgIC8vZ2V0IHNpZGUgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKHNpZGVzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vZHJhdyBzaWRlc1xuXG4gICAgICAgIGN0eC5saW5lQ2FwID0gJ2J1dHQnXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAqIDAuNVxuICAgICAgICBmb3IgKGxldCBzaWRlIG9mIHNpZGVzKSB7XG4gICAgICAgICAgICAvL2NvbG9yXG4gICAgICAgICAgICAvKiogQHR5cGUge3N0cmluZ3x1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihzaWRlLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT0gJ25vbmUnKSBjb250aW51ZVxuXG4gICAgICAgICAgICBpZiAodGhpcy5kaWFtb25kKSB7XG4gICAgICAgICAgICAgICAgLy9zZXQgY29sb3JcbiAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gY29sXG5cbiAgICAgICAgICAgICAgICAvL2RyYXcgZGlhbW9uZFxuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBzaWRlLngsXG4gICAgICAgICAgICAgICAgICAgIHkgPSBzaWRlLnlcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKHggLSByMiwgeSlcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKHgsIHkgKyByMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKHggKyByMiwgeSlcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKHgsIHkgLSByMilcbiAgICAgICAgICAgICAgICBjdHguY2xvc2VQYXRoKClcbiAgICAgICAgICAgICAgICBjdHguZmlsbCgpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vd2lkdGhcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChzaWRlLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8PSAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAgICAgLy9sZW5ndGhcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICAgICAgY29uc3QgbEcgPSB0aGlzLmxlbmd0aCA/IHRoaXMubGVuZ3RoKHNpZGUsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICBpZiAoIWxHIHx8IGxHIDw9IDApIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgY29uc3QgbEcyID0gbEcgKiAwLjVcblxuICAgICAgICAgICAgICAgIC8vc2V0IHdpZHRoXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHdHXG4gICAgICAgICAgICAgICAgLy9zZXQgY29sb3JcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBjb2xcblxuICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50IHdpdGggY29ycmVjdCBvcmllbnRhdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBzaWRlLngsXG4gICAgICAgICAgICAgICAgICAgIHkgPSBzaWRlLnlcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBpZiAoc2lkZS5vciA9PT0gJ3YnKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oeCwgeSAtIGxHMilcbiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4LCB5ICsgbEcyKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oeCAtIGxHMiwgeSlcbiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4ICsgbEcyLCB5KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoJy4uL2NvcmUvRGF0YXNldCcpLkNlbGw+fSBjZWxscyBUaGUgY2VsbHMgdG8gdXNlIHRvIGJ1aWxkIHRoZSBzaWRlcy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiBUaGUgY2VsbHMgcmVzb2x1dGlvblxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gd2l0aEhvcml6b250YWwgU2V0IHRvIHRydWUgdG8gYnVpbGQgaG9yaXpvbnRhbCBzaWRlcywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gd2l0aFZlcnRpY2FsIFNldCB0byB0cnVlIHRvIGJ1aWxkIHZlcnRpY2FsIHNpZGVzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBjZW50ZXIgU2V0IHRvIHRydWUgc28gdGhhdCB0aGUgc2lkZSBjb29yZGluYXRlIGFyZSB0aG9zZSBvZiBpdHMgY2VudGVyIHBvaW50IHJhdGhlciB0aGFuIGl0cyBsZWZ0L2JvdHRvbSBwb2ludCAodGhlIHNpZGUgeCx5IGNvb3JkaW5hdGVzIGFyZSB0aG9zZSBvZiB0aGUgbGVmdCBwb2ludCBmb3IgaG9yaXpvbnRhbCBzaWRlcywgYW5kIG9mIHRoZSBib3R0b20gcG9pbnQgZm9yIHZlcnRpY2FsIHNpZGVzKVxuICAgICAqIEByZXR1cm5zIHsgQXJyYXkuPFNpZGU+IH1cbiAgICAgKi9cbiAgICBzdGF0aWMgYnVpbGRTaWRlcyhjZWxscywgcmVzb2x1dGlvbiwgd2l0aEhvcml6b250YWwgPSB0cnVlLCB3aXRoVmVydGljYWwgPSB0cnVlLCBjZW50ZXIgPSB0cnVlKSB7XG4gICAgICAgIC8qKiBAdHlwZSB7IEFycmF5LjxTaWRlPiB9ICovXG4gICAgICAgIGNvbnN0IHNpZGVzID0gW11cblxuICAgICAgICBjb25zdCByMiA9IGNlbnRlciA/IHJlc29sdXRpb24gLyAyIDogMFxuXG4gICAgICAgIC8vbWFrZSBob3Jpem9udGFsIHNpZGVzXG4gICAgICAgIC8vc29ydCBjZWxscyBieSB4IGFuZCB5XG4gICAgICAgIGNlbGxzLnNvcnQoKGMxLCBjMikgPT4gKGMyLnggPT0gYzEueCA/IGMxLnkgLSBjMi55IDogYzEueCAtIGMyLngpKVxuICAgICAgICBsZXQgYzEgPSBjZWxsc1swXVxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgYzIgPSBjZWxsc1tpXVxuXG4gICAgICAgICAgICBpZiAoYzEueSArIHJlc29sdXRpb24gPT0gYzIueSAmJiBjMS54ID09IGMyLngpXG4gICAgICAgICAgICAgICAgLy9jZWxscyBpbiBzYW1lIGNvbHVtbiBhbmQgdG91Y2ggYWxvbmcgaG9yaXpvbnRhbCBzaWRlXG4gICAgICAgICAgICAgICAgLy9tYWtlIHNoYXJlZCBzaWRlXG4gICAgICAgICAgICAgICAgc2lkZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG9yOiAnaCcsXG4gICAgICAgICAgICAgICAgICAgIHg6IGMxLnggKyByMixcbiAgICAgICAgICAgICAgICAgICAgeTogYzIueSxcbiAgICAgICAgICAgICAgICAgICAgYzE6IGMxLFxuICAgICAgICAgICAgICAgICAgICBjMjogYzIsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vY2VsbHMgZG8gbm90IHRvdWNoIGFsb25nIGhvcml6b250YWwgc2lkZVxuICAgICAgICAgICAgICAgIC8vbWFrZSB0d28gc2lkZXM6IHRvcCBvbmUgZm9yIGMxLCBib3R0b20gZm9yIGMyXG4gICAgICAgICAgICAgICAgc2lkZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG9yOiAnaCcsXG4gICAgICAgICAgICAgICAgICAgIHg6IGMxLnggKyByMixcbiAgICAgICAgICAgICAgICAgICAgeTogYzEueSArIHJlc29sdXRpb24sXG4gICAgICAgICAgICAgICAgICAgIGMxOiBjMSxcbiAgICAgICAgICAgICAgICAgICAgYzI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBvcjogJ2gnLFxuICAgICAgICAgICAgICAgICAgICB4OiBjMi54ICsgcjIsXG4gICAgICAgICAgICAgICAgICAgIHk6IGMyLnksXG4gICAgICAgICAgICAgICAgICAgIGMxOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGMyOiBjMixcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjMSA9IGMyXG4gICAgICAgIH1cblxuICAgICAgICAvL21ha2UgdmVydGljYWwgc2lkZXNcbiAgICAgICAgLy9zb3J0IGNlbGxzIGJ5IHkgYW5kIHhcbiAgICAgICAgY2VsbHMuc29ydCgoYzEsIGMyKSA9PiAoYzIueSA9PSBjMS55ID8gYzEueCAtIGMyLnggOiBjMS55IC0gYzIueSkpXG4gICAgICAgIGMxID0gY2VsbHNbMF1cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGMyID0gY2VsbHNbaV1cblxuICAgICAgICAgICAgaWYgKGMxLnggKyByZXNvbHV0aW9uID09IGMyLnggJiYgYzEueSA9PSBjMi55KVxuICAgICAgICAgICAgICAgIC8vY2VsbHMgaW4gc2FtZSByb3cgYW5kIHRvdWNoIGFsb25nIHZlcnRpY2FsIHNpZGVcbiAgICAgICAgICAgICAgICAvL21ha2Ugc2hhcmVkIHNpZGVcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgb3I6ICd2JyxcbiAgICAgICAgICAgICAgICAgICAgeDogYzEueCArIHJlc29sdXRpb24sXG4gICAgICAgICAgICAgICAgICAgIHk6IGMxLnkgKyByMixcbiAgICAgICAgICAgICAgICAgICAgYzE6IGMxLFxuICAgICAgICAgICAgICAgICAgICBjMjogYzIsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vY2VsbHMgZG8gbm90IHRvdWNoIGFsb25nIHZlcnRpY2FsIHNpZGVcbiAgICAgICAgICAgICAgICAvL21ha2UgdHdvIHNpZGVzOiByaWdodCBvbmUgZm9yIGMxLCBsZWZ0IGZvciBjMlxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBvcjogJ3YnLFxuICAgICAgICAgICAgICAgICAgICB4OiBjMS54ICsgcmVzb2x1dGlvbixcbiAgICAgICAgICAgICAgICAgICAgeTogYzEueSArIHIyLFxuICAgICAgICAgICAgICAgICAgICBjMTogYzEsXG4gICAgICAgICAgICAgICAgICAgIGMyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgb3I6ICd2JyxcbiAgICAgICAgICAgICAgICAgICAgeDogYzIueCxcbiAgICAgICAgICAgICAgICAgICAgeTogYzIueSArIHIyLFxuICAgICAgICAgICAgICAgICAgICBjMTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBjMjogYzIsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYzEgPSBjMlxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaWRlc1xuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuaW1wb3J0IHsgbWFrZVdlYkdMQ2FudmFzIH0gZnJvbSAnLi4vdXRpbHMvd2ViR0xVdGlscy5qcydcbmltcG9ydCB7IFdlYkdMU3F1YXJlQ29sb3JpbmdDYXRBZHZhbmNlZCB9IGZyb20gJy4uL3V0aWxzL1dlYkdMU3F1YXJlQ29sb3JpbmdDYXRBZHZhbmNlZC5qcydcblxuLyoqXG4gKiBTdHlsZSBiYXNlZCBvbiB3ZWJHTFxuICogVG8gc2hvdyBjZWxscyBhcyBjb2xvcmVkIHNxdWFyZXMsIGZyb20gY2F0ZWdvcmllcy5cbiAqIEFsbCBjZWxscyBhcmUgZHJhd24gYXMgc3F1YXJlcywgd2l0aCB0aGUgc2FtZSBzaXplXG4gKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY2F0ZWdvcnkgY29kZSBvZiB0aGUgY2VsbCwgZm9yIGNvbG9yaW5nLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29kZSA9IG9wdHMuY29kZVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZGljdGlvbmFyeSAoY29kZSAtPiBjb2xvcikgd2hpY2ggZ2l2ZXMgdGhlIGNvbG9yIG9mIGVhY2ggY2F0ZWdvcnkgY29kZS5cbiAgICAgICAgICogQHR5cGUge29iamVjdH0gKi9cbiAgICAgICAgb3B0cy5jb2xvciA9IG9wdHMuY29sb3IgfHwgdW5kZWZpbmVkXG5cbiAgICAgICAgLyoqIEB0eXBlIHsgQXJyYXkuPHN0cmluZz4gfSAqL1xuICAgICAgICBjb25zdCBjb2RlcyA9IE9iamVjdC5rZXlzKG9wdHMuY29sb3IpXG5cbiAgICAgICAgLyoqIEB0eXBlIHsgb2JqZWN0IH0gQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5jYXRUb0kgPSB7fVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVzLmxlbmd0aDsgaSsrKSB0aGlzLmNhdFRvSVtjb2Rlc1tpXV0gPSBpICsgJydcblxuICAgICAgICAvKiogQHR5cGUgeyBBcnJheS48c3RyaW5nPiB9IEBwcml2YXRlICovXG4gICAgICAgIHRoaXMuY29sb3JzID0gW11cbiAgICAgICAgZm9yIChjb25zdCBjb2RlIG9mIGNvZGVzKSB0aGlzLmNvbG9ycy5wdXNoKG9wdHMuY29sb3JbJycgKyBjb2RlXSlcblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgdGhlIGNlbGxzLCBpbiBnZW9ncmFwaGljYWwgdW5pdC4gQWxsIGNlbGxzIGhhdmUgdGhlIHNhbWUgc2l6ZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIC8vIChyZXNvbHV0aW9uLCB6KSA9PiAuLi5cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUgeyBXZWJHTFNxdWFyZUNvbG9yaW5nQ2F0QWR2YW5jZWQgfSAqL1xuICAgICAgICB0aGlzLndncCA9IG5ldyBXZWJHTFNxdWFyZUNvbG9yaW5nQ2F0QWR2YW5jZWQodGhpcy5jb2xvcnMpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG5cbiAgICAgICAgLy9hZGQgdmVydGljZSBhbmQgZnJhZ21lbnQgZGF0YVxuICAgICAgICBjb25zdCByMiA9IHJlc29sdXRpb24gLyAyXG4gICAgICAgIGxldCBjLFxuICAgICAgICAgICAgbmIgPSBjZWxscy5sZW5ndGhcbiAgICAgICAgY29uc3QgdmVydGljZXNCdWZmZXIgPSBbXVxuICAgICAgICBjb25zdCBpQnVmZmVyID0gW11cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKSB7XG4gICAgICAgICAgICBjID0gY2VsbHNbaV1cbiAgICAgICAgICAgIGNvbnN0IGNhdCA9IHRoaXMuY29kZShjKVxuICAgICAgICAgICAgaWYgKGNhdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVW5leHBlY3RlZCBjYXRlZ29yeTogJyArIGNhdClcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgICAgICBjb25zdCBpXyA9IHRoaXMuY2F0VG9JW2NhdF1cbiAgICAgICAgICAgIGlmIChpc05hTigraV8pKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1VuZXhwZWN0ZWQgY2F0ZWdvcnkgaW5kZXg6ICcgKyBjYXQgKyAnICcgKyBpXylcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmVydGljZXNCdWZmZXIucHVzaChjLnggKyByMiwgYy55ICsgcjIpXG4gICAgICAgICAgICBpQnVmZmVyLnB1c2goK2lfKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jcmVhdGUgY2FudmFzIGFuZCB3ZWJnbCByZW5kZXJlclxuICAgICAgICBjb25zdCBjdldHTCA9IG1ha2VXZWJHTENhbnZhcyhnZW9DYW52YXMudyArICcnLCBnZW9DYW52YXMuaCArICcnKVxuICAgICAgICBpZiAoIWN2V0dMKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyB3ZWJHTCcpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vZHJhd1xuICAgICAgICBjb25zdCBzaXplR2VvID0gdGhpcy5zaXplID8gdGhpcy5zaXplKHJlc29sdXRpb24sIHopIDogcmVzb2x1dGlvbiArIDAuMiAqIHpcbiAgICAgICAgdGhpcy53Z3AuZHJhdyhjdldHTC5nbCwgdmVydGljZXNCdWZmZXIsIGlCdWZmZXIsIGdlb0NhbnZhcy5nZXRXZWJHTFRyYW5zZm9ybSgpLCBzaXplR2VvIC8geilcblxuICAgICAgICAvL2RyYXcgaW4gY2FudmFzIGdlb1xuICAgICAgICBnZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG4gICAgICAgIGdlb0NhbnZhcy5vZmZzY3JlZW5DdHguZHJhd0ltYWdlKGN2V0dMLmNhbnZhcywgMCwgMClcblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6IH0pXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5pbXBvcnQgeyBtYWtlV2ViR0xDYW52YXMgfSBmcm9tICcuLi91dGlscy93ZWJHTFV0aWxzLmpzJ1xuaW1wb3J0IHsgV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkIH0gZnJvbSAnLi4vdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkLmpzJ1xuXG4vKipcbiAqIFN0eWxlIGJhc2VkIG9uIHdlYkdMXG4gKiBUbyBzaG93IGNlbGxzIGFzIGNvbG9yZWQgc3F1YXJlcywgd2l0aCBjb21wdXRhdGlvbiBvZiB0aGUgY29sb3JzIG9uIEdQVSBzaWRlIChmYXN0ZXIgdGhhbiBKYXZhU2NyaXB0IHNpZGUpLlxuICogQWxscyBzcXVhcmVzIHdpdGggdGhlIHNhbWUgc2l6ZVxuICpcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFNxdWFyZUNvbG9yV2ViR0xTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgdCB2YWx1ZSAod2l0aGluIFswLDFdKSBmb3IgYSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLG51bWJlcixudW1iZXIsb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMudEZ1biA9IG9wdHMudEZ1biAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogRGlzdHJpYnV0aW9uIHN0cmV0Y2hpbmcgbWV0aG9kLlxuICAgICAgICAgKiBUaGUgc3RyZXRjaGluZyBpcyBwZXJmb3JtZWQgb24gR1BVIHNpZGUgKGZyYWdtZW50IHNoYWRlcikuXG4gICAgICAgICAqIEB0eXBlIHt7IGZ1bjpzdHJpbmcsIGFscGhhOm51bWJlciB9fSAqL1xuICAgICAgICB0aGlzLnN0cmV0Y2hpbmcgPSBvcHRzLnN0cmV0Y2hpbmdcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHNhbXBsZSBvZiB0aGUgY29sb3IgcmFtcC5cbiAgICAgICAgICogVGhlIGNvbG9yIGlzIGNvbXB1dGVkIG9uIEdQVSBzaWRlIChmcmFnbWVudCBzaGFkZXIpIGJhc2VkIG9uIHRob3NlIHZhbHVlcyAobGluZWFyIGludGVycG9sYXRpb24pLlxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPHN0cmluZz59ICovXG4gICAgICAgIHRoaXMuY29sb3JzID1cbiAgICAgICAgICAgIG9wdHMuY29sb3JzIHx8XG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgJ3JnYigxNTgsIDEsIDY2KScsXG4gICAgICAgICAgICAgICAgJ3JnYigyNDgsIDE0MiwgODMpJyxcbiAgICAgICAgICAgICAgICAncmdiKDI1MSwgMjQ4LCAxNzYpJyxcbiAgICAgICAgICAgICAgICAncmdiKDEzNywgMjA3LCAxNjUpJyxcbiAgICAgICAgICAgICAgICAncmdiKDk0LCA3OSwgMTYyKScsXG4gICAgICAgICAgICBdLnJldmVyc2UoKVxuICAgICAgICBpZiAob3B0cy5jb2xvcilcbiAgICAgICAgICAgIHRoaXMuY29sb3JzID0gW1xuICAgICAgICAgICAgICAgIG9wdHMuY29sb3IoMCksXG4gICAgICAgICAgICAgICAgb3B0cy5jb2xvcigwLjIpLFxuICAgICAgICAgICAgICAgIG9wdHMuY29sb3IoMC40KSxcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuNiksXG4gICAgICAgICAgICAgICAgb3B0cy5jb2xvcigwLjgpLFxuICAgICAgICAgICAgICAgIG9wdHMuY29sb3IoMSksXG4gICAgICAgICAgICBdXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlZmluZSB0aGUgb3BhY2l0eSBvZiB0aGUgc3R5bGUsIHdpdGhpbiBbMCwxXS5cbiAgICAgICAgICogSWYgdGhpcyBvcGFjaXR5IGlzIGRlZmluZWQsIHRoZSBpbmRpdmlkdWFsIGNvbG9yIG9wYWNpdHkgd2lsbCBiZSBpZ25vcmVkLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm9wYWNpdHkgPSBvcHRzLm9wYWNpdHkgLy8gKHIseikgPT4gLi4uXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIHRoZSBjZWxscywgaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuIEFsbCBjZWxscyBoYXZlIHRoZSBzYW1lIHNpemUuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZSAvLyAocmVzb2x1dGlvbiwgeikgPT4gLi4uXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG5cbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vY3JlYXRlIGNhbnZhcyBhbmQgd2ViZ2wgcmVuZGVyZXJcbiAgICAgICAgLy9mb3Igb3BhY2l0eSBjb250cm9sLCBzZWU6IGh0dHBzOi8vd2ViZ2xmdW5kYW1lbnRhbHMub3JnL3dlYmdsL2xlc3NvbnMvd2ViZ2wtYW5kLWFscGhhLmh0bWxcbiAgICAgICAgY29uc3QgY3ZXR0wgPSBtYWtlV2ViR0xDYW52YXMoXG4gICAgICAgICAgICBnZW9DYW52YXMudyArICcnLFxuICAgICAgICAgICAgZ2VvQ2FudmFzLmggKyAnJyxcbiAgICAgICAgICAgIHRoaXMub3BhY2l0eSAhPSB1bmRlZmluZWQgPyB7IHByZW11bHRpcGxpZWRBbHBoYTogZmFsc2UgfSA6IHVuZGVmaW5lZFxuICAgICAgICApXG4gICAgICAgIGlmICghY3ZXR0wpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHdlYkdMJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy9hZGQgdmVydGljZSBhbmQgZnJhZ21lbnQgZGF0YVxuICAgICAgICBjb25zdCByMiA9IHJlc29sdXRpb24gLyAyXG4gICAgICAgIGNvbnN0IHZlcnRpY2VzQnVmZmVyID0gW11cbiAgICAgICAgY29uc3QgdEJ1ZmZlciA9IFtdXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLnRGdW4oY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxuICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCB8fCB0ID09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgICAgICAgIHZlcnRpY2VzQnVmZmVyLnB1c2goY2VsbC54ICsgcjIsIGNlbGwueSArIHIyKVxuICAgICAgICAgICAgdEJ1ZmZlci5wdXNoKHQgPiAxID8gMSA6IHQgPCAwID8gMCA6IHQpXG4gICAgICAgIH1cblxuICAgICAgICAvL2NvbXB1dGUgcGl4ZWwgc2l6ZVxuICAgICAgICBjb25zdCBzaXplR2VvID0gdGhpcy5zaXplID8gdGhpcy5zaXplKHJlc29sdXRpb24sIHopIDogcmVzb2x1dGlvbiArIDAuMiAqIHpcblxuICAgICAgICAvL2NvbXB1dGUgb3BhY2l0eVxuICAgICAgICBjb25zdCBvcCA9IHRoaXMub3BhY2l0eSA/IHRoaXMub3BhY2l0eShyZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHdncCA9IG5ldyBXZWJHTFNxdWFyZUNvbG9yaW5nQWR2YW5jZWQoY3ZXR0wuZ2wsIHRoaXMuY29sb3JzLCB0aGlzLnN0cmV0Y2hpbmcsIHNpemVHZW8gLyB6LCBvcClcblxuICAgICAgICAvL2RyYXdcbiAgICAgICAgd2dwLmRyYXcodmVydGljZXNCdWZmZXIsIHRCdWZmZXIsIGdlb0NhbnZhcy5nZXRXZWJHTFRyYW5zZm9ybSgpKVxuXG4gICAgICAgIC8vIGRyYXcgaW4gY2FudmFzIGdlb1xuICAgICAgICAvLyBOT1RFOiBkcmF3aW5nIGVhY2ggdGlsZSB0aGlzIHdheSBpcyB2ZXJ5IGluZWZmaWNpZW50LiBXZWJHTCBpcyBiZXN0IHVzZWQgd2l0aCBmZXdlciwgaGVhdmllci9sYXJnZXIgZHJhdyBjYWxscy5cbiAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuICAgICAgICBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4LmRyYXdJbWFnZShjdldHTC5jYW52YXMsIDAsIDApXG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcblxuLyoqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJva2VTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCxudW1iZXIsbnVtYmVyLG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnN0cm9rZUNvbG9yID0gb3B0cy5zdHJva2VDb2xvciB8fCAoKCkgPT4gJyM2NjYnKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgYSBjZWxsIGluIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLG51bWJlcixudW1iZXIsb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZSB8fCAoKGNlbGwsIHJlc29sdXRpb24pID0+IHJlc29sdXRpb24pIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBUaGUgc3Ryb2tlIGxpbmUgd2lkdGggaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsbnVtYmVyLG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zdHJva2VXaWR0aCA9IG9wdHMuc3Ryb2tlV2lkdGggfHwgKChjZWxsLCByZXNvbHV0aW9uLCB6KSA9PiB6ICogMS41KSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNoYXBlIG9mIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIsb2JqZWN0KTppbXBvcnQoXCIuLi9jb3JlL1N0eWxlLmpzXCIpLlNoYXBlfSAqL1xuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAoKCkgPT4gJ3NxdWFyZScpIC8vKGMscix6LHZzKSA9PiB7fVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgc3F1YXJlcywgd2l0aCB2YXJpb3VzIGNvbG9ycyBhbmQgc2l6ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuICAgICAgICBjb25zdCBjdHggPSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4XG5cbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAqIDAuNVxuICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAvL2NvbG9yXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLnN0cm9rZUNvbG9yID8gdGhpcy5zdHJva2VDb2xvcihjLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT09ICdub25lJykgY29udGludWVcbiAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGNvbFxuXG4gICAgICAgICAgICAvL3NpemUgLSBpbiBnZW8gdW5pdFxuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2l6ZSA/IHRoaXMuc2l6ZShjLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogcmVzb2x1dGlvblxuXG4gICAgICAgICAgICAvL3dpZHRoXG4gICAgICAgICAgICBjb25zdCB3aSA9IHRoaXMuc3Ryb2tlV2lkdGggPyB0aGlzLnN0cm9rZVdpZHRoKGMsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiAxICogelxuICAgICAgICAgICAgaWYgKCF3aSB8fCB3aSA8PSAwKSBjb250aW51ZVxuICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHdpXG5cbiAgICAgICAgICAgIC8vc2hhcGVcbiAgICAgICAgICAgIGNvbnN0IHNoYXBlID0gdGhpcy5zaGFwZSA/IHRoaXMuc2hhcGUoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6ICdzcXVhcmUnXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdub25lJykgY29udGludWVcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjLCByZXNvbHV0aW9uLCB6KVxuXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdzcXVhcmUnKSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IHNxdWFyZVxuICAgICAgICAgICAgICAgIGNvbnN0IGQgPSByZXNvbHV0aW9uICogKDEgLSBzaXplIC8gcmVzb2x1dGlvbikgKiAwLjVcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHgucmVjdChjLnggKyBkICsgb2Zmc2V0LmR4LCBjLnkgKyBkICsgb2Zmc2V0LmR5LCBzaXplLCBzaXplKVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ2NpcmNsZScpIHtcbiAgICAgICAgICAgICAgICAvL2RyYXcgY2lyY2xlXG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4LmFyYyhjLnggKyByMiArIG9mZnNldC5keCwgYy55ICsgcjIgKyBvZmZzZXQuZHksIHNpemUgKiAwLjUsIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSlcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdkaWFtb25kJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHMyID0gc2l6ZSAqIDAuNVxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oYy54ICsgcjIgLSBzMiwgYy55ICsgcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyByMiwgYy55ICsgcjIgKyBzMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHIyICsgczIsIGMueSArIHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcjIsIGMueSArIHIyIC0gczIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyByMiAtIHMyLCBjLnkgKyByMilcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdkb251dCcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3RyaWFuZ2xlX3VwJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyMiA9IChzaXplIC0gcmVzb2x1dGlvbikgLyAyXG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjLnggLSBkcjIsIGMueSAtIGRyMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHIyLCBjLnkgKyByZXNvbHV0aW9uICsgZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcmVzb2x1dGlvbiArIGRyMiwgYy55IC0gZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3RyaWFuZ2xlX2Rvd24nKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHIyID0gKHNpemUgLSByZXNvbHV0aW9uKSAvIDJcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKGMueCAtIGRyMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHIyLCBjLnkgLSBkcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgKyByZXNvbHV0aW9uICsgZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3RyaWFuZ2xlX2xlZnQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHIyID0gKHNpemUgLSByZXNvbHV0aW9uKSAvIDJcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggLSBkcjIsIGMueSArIHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcmVzb2x1dGlvbiArIGRyMiwgYy55IC0gZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3RyaWFuZ2xlX3JpZ2h0Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyMiA9IChzaXplIC0gcmVzb2x1dGlvbikgLyAyXG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjLnggLSBkcjIsIGMueSAtIGRyMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSArIHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54IC0gZHIyLCBjLnkgKyByZXNvbHV0aW9uICsgZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2hhcGU6JyArIHNoYXBlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFNpZGVTdHlsZSB9IGZyb20gJy4vU2lkZVN0eWxlLmpzJ1xuaW1wb3J0IHsgU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUgfSBmcm9tICcuL1NxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlLmpzJ1xuaW1wb3J0IHsgY2xhc3NpZmllciBhcyBjbEZ1biwgY29sb3JDbGFzc2lmaWVyIGFzIGNjbEZ1biB9IGZyb20gJy4uL3V0aWxzL3NjYWxlLmpzJ1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9tYW5pZm9sZC5uZXQvZG9jL21mZDkvZXhhbXBsZV9fdGFuYWthX2NvbnRvdXJzLmh0bVxuICpcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFRhbmFrYVN0eWxlIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCk6bnVtYmVyfSB2YWx1ZSBGdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHZhbHVlIG9mIGEgY2VsbFxuICAgICAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IGJyZWFrcyBUaGUgYnJlYWsgdmFsdWVzXG4gICAgICogQHBhcmFtIHtBcnJheS48c3RyaW5nPn0gY29sb3JzIFRoZSBjb2xvcnMsIG9uZSBtb3JlIHRoYW4gdGhlIGJyZWFrIHZhbHVlc1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICogQHJldHVybnMge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL1N0eWxlXCIpLlN0eWxlPn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0KHZhbHVlLCBicmVha3MsIGNvbG9ycywgb3B0cyA9IHt9KSB7XG4gICAgICAgIC8vc2hhZG93IGNvbG9yc1xuICAgICAgICBvcHRzLmNvbG9yRGFyayA9IG9wdHMuY29sb3JEYXJrIHx8ICcjMTExJ1xuICAgICAgICBvcHRzLmNvbG9yQnJpZ2h0ID0gb3B0cy5jb2xvckJyaWdodCB8fCAnI2RkZCdcblxuICAgICAgICAvKiogQHR5cGUgeyBmdW5jdGlvbihudW1iZXIsIG51bWJlcik6bnVtYmVyIH0gKi9cbiAgICAgICAgb3B0cy53aWR0aCA9XG4gICAgICAgICAgICBvcHRzLndpZHRoIHx8XG4gICAgICAgICAgICAoKHNpZGVWYWx1ZSwgcmVzb2x1dGlvbiwgeikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pbldHID0gMSAqIHpcbiAgICAgICAgICAgICAgICBjb25zdCBtYXhXRyA9IDQgKiB6XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RlcCA9IChtYXhXRyAtIG1pbldHKSAvIDNcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5taW4obWluV0cgKyAoc2lkZVZhbHVlIC0gMSkgKiBzdGVwLCBtYXhXRylcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgLy9tYWtlIGNsYXNzaWZpZXJcbiAgICAgICAgY29uc3QgY2xhc3NpZmllciA9IGNsRnVuKGJyZWFrcylcbiAgICAgICAgLy9tYWtlIGNvbG9ycyB0YWJsZVxuICAgICAgICBjb25zdCBjb2xvcnNEaWN0ID0ge31cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIGNvbG9yc0RpY3RbaSArICcnXSA9IGNvbG9yc1tpXVxuXG4gICAgICAgIGNvbnN0IGNlbGxTdHlsZSA9IG5ldyBTcXVhcmVDb2xvckNhdGVnb3J5V2ViR0xTdHlsZSh7XG4gICAgICAgICAgICBjb2RlOiAoY2VsbCkgPT4gY2xhc3NpZmllcih2YWx1ZShjZWxsKSksXG4gICAgICAgICAgICBjb2xvcjogY29sb3JzRGljdCxcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBnZXRTaWRlVmFsdWUgPSAoc2lkZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2wxID0gc2lkZS5jMSA/IGNsYXNzaWZpZXIodmFsdWUoc2lkZS5jMSkpIDogLTFcbiAgICAgICAgICAgIGNvbnN0IGNsMiA9IHNpZGUuYzIgPyBjbGFzc2lmaWVyKHZhbHVlKHNpZGUuYzIpKSA6IC0xXG4gICAgICAgICAgICByZXR1cm4gY2wxIC0gY2wyXG4gICAgICAgIH1cblxuICAgICAgICAvKiogVGhlIHNpZGUgc3R5bGUsIGZvciB0aGUgc2hhZG93IGVmZmVjdCAqL1xuICAgICAgICBjb25zdCBzaWRlU3R5bGUgPSBuZXcgU2lkZVN0eWxlKHtcbiAgICAgICAgICAgIC8vd2hpdGUgb3IgYmxhY2ssIGRlcGVuZGluZyBvbiBvcmllbnRhdGlvbiBhbmQgdmFsdWVcbiAgICAgICAgICAgIGNvbG9yOiAoc2lkZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBnZXRTaWRlVmFsdWUoc2lkZSlcbiAgICAgICAgICAgICAgICBpZiAodiA9PT0gMCkgcmV0dXJuXG4gICAgICAgICAgICAgICAgaWYgKHNpZGUub3IgPT09ICd2JykgcmV0dXJuIHYgPCAwID8gb3B0cy5jb2xvckJyaWdodCA6IG9wdHMuY29sb3JEYXJrXG4gICAgICAgICAgICAgICAgcmV0dXJuIHYgPCAwID8gb3B0cy5jb2xvckRhcmsgOiBvcHRzLmNvbG9yQnJpZ2h0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy93aWR0aCBkZXBlbmRzIG9uIHRoZSB2YWx1ZSwgdGhhdCBpcyB0aGUgbnVtYmVyIG9mIGNsYXNzZXMgb2YgZGlmZmVyZW5jZVxuICAgICAgICAgICAgd2lkdGg6IChzaWRlLCByZXNvbHV0aW9uLCB6KSA9PiBvcHRzLndpZHRoKE1hdGguYWJzKGdldFNpZGVWYWx1ZShzaWRlKSksIHJlc29sdXRpb24sIHopLFxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBbY2VsbFN0eWxlLCBzaWRlU3R5bGVdXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5cbi8qKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgVGV4dFN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHRleHQgb2YgYSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudGV4dCA9IG9wdHMudGV4dCB8fCAoKCkgPT4gJ1gnKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnYmxhY2snKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGZvbnQgc2l6ZSBvZiBhIGNlbGwgaW4gZ2VvIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmZvbnRTaXplID0gb3B0cy5mb250U2l6ZSB8fCAoKGNlbGwsIHJlc29sdXRpb24pID0+IHJlc29sdXRpb24pIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBUaGUgdGV4dCBmb250IGZhbWlseS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmZvbnRGYW1pbHkgPSBvcHRzLmZvbnRGYW1pbHkgfHwgKCgpID0+ICdBcmlhbCcpXG5cbiAgICAgICAgLyoqIFRoZSB0ZXh0IGZvbnQgd2VpZ2h0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuZm9udFdlaWdodCA9IG9wdHMuZm9udFdlaWdodCB8fCAoKCkgPT4gJ2JvbGQnKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgdGV4dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuICAgICAgICBjb25zdCBjdHggPSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4XG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL2RyYXcgd2l0aCBIVE1MIGNhbnZhc1xuICAgICAgICAvL2luIHNjcmVlbiBjb29yZGluYXRlc1xuICAgICAgICBnZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG5cbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgLy9nZXQgY2VsbCB0ZXh0XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy50ZXh0ID8gdGhpcy50ZXh0KGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICh0ZXh0ID09IHVuZGVmaW5lZCB8fCB0ZXh0ID09IG51bGwgfHwgdGV4dCArICcnID09PSAnJykgY29udGludWVcblxuICAgICAgICAgICAgLy9jb2xvclxuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFjb2wpIGNvbnRpbnVlXG4gICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gY29sXG5cbiAgICAgICAgICAgIC8vZm9udCBzaXplXG4gICAgICAgICAgICAvL3NpemUgLSBpbiBwaXhlbCB1bml0XG4gICAgICAgICAgICBjb25zdCBmb250U2l6ZVBpeCA9IHRoaXMuZm9udFNpemUoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSAvIHpcbiAgICAgICAgICAgIGlmICghZm9udFNpemVQaXgpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vc2V0IGZvbnRcbiAgICAgICAgICAgIGNvbnN0IGZvbnRGYW1pbHkgPSB0aGlzLmZvbnRGYW1pbHkgPyB0aGlzLmZvbnRGYW1pbHkoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6ICdBcmlhbCdcbiAgICAgICAgICAgIGNvbnN0IGZvbnRXZWlnaHQgPSB0aGlzLmZvbnRXZWlnaHQgPyB0aGlzLmZvbnRXZWlnaHQoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6ICdib2xkJ1xuICAgICAgICAgICAgY3R4LmZvbnQgPSBmb250V2VpZ2h0ICsgJyAnICsgZm9udFNpemVQaXggKyAncHggJyArIGZvbnRGYW1pbHlcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByZXNvbHV0aW9uLCB6KVxuXG4gICAgICAgICAgICAvL3RleHQgcG9zaXRpb25cbiAgICAgICAgICAgIGN0eC50ZXh0QWxpZ24gPSAnY2VudGVyJ1xuICAgICAgICAgICAgY29uc3QgdHggPSBnZW9DYW52YXMuZ2VvVG9QaXhYKGNlbGwueCArIHJlc29sdXRpb24gKiAwLjUgKyBvZmZzZXQuZHgpXG4gICAgICAgICAgICBjb25zdCB0eSA9IGdlb0NhbnZhcy5nZW9Ub1BpeFkoY2VsbC55ICsgcmVzb2x1dGlvbiAqIDAuNSArIG9mZnNldC5keSkgKyBmb250U2l6ZVBpeCAqIDAuMyAvL2l0IHNob3VsZCBiZSAwLjUgYnV0IDAuMyBzZWVtcyB0byB3b3JrIGJldHRlclxuXG4gICAgICAgICAgICAvL2RyYXcgdGhlIHRleHRcbiAgICAgICAgICAgIGN0eC5maWxsVGV4dCh0ZXh0LCB0eCwgdHkpXG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkIGEgZnVuY3Rpb24gWzAsMV0tPnN0cmluZyBmb3IgY2hhcmFjdGVycyBsZWdlbmRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz59IGNoYXJzXG4gICAgICogQHBhcmFtIHsoZnVuY3Rpb24obnVtYmVyKTpudW1iZXIpfHVuZGVmaW5lZH0gc2NhbGVcbiAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIHRleHRTY2FsZShjaGFycywgc2NhbGUgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbmIgPSBjaGFycy5sZW5ndGhcbiAgICAgICAgcmV0dXJuICh0KSA9PiB7XG4gICAgICAgICAgICBpZiAoc2NhbGUpIHQgPSBzY2FsZSh0KVxuICAgICAgICAgICAgaWYgKHQgPT0gMCkgcmV0dXJuICcnXG4gICAgICAgICAgICBpZiAodCA+PSAxKSByZXR1cm4gY2hhcnNbbmIgLSAxXVxuICAgICAgICAgICAgcmV0dXJuIGNoYXJzW01hdGguZmxvb3IodCAqIG5iKV1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKiogQHR5cGVkZWYge1wiZmlyc3RcInxcImJvdHRvbVwifFwiY2VudGVyXCJ8XCJ0b3BcInxcImxhc3RcIn0gQW5jaG9yTW9kZVlFbnVtICovXG5cbi8qKlxuICogU2hvdyBjZWxsIGFzIHRpbWVzZXJpZXMgY2hhcnRcbiAqIENhbiBiZSB1c2VkIGZvciBzcGFya2xpbmUgbWFwIG9mIGh0dHBzOi8vZGF0YWdpc3RpcHMuaHlwb3RoZXNlcy5vcmcvNDg4XG4gKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgVGltZVNlcmllc1N0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogVGhlIGNvbHVtbnMgb2YgdGhlIHRpbWUgc2VyaWVzLCBvcmRlcmVkIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIuXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48c3RyaW5nPn0gKi9cbiAgICAgICAgdGhpcy50cyA9IG9wdHMudHNcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiBzcGVjaWZ5aW5nIHdoZW4gYSB2YWx1ZSBzaG91bGQgYmUgY29uc2lkZXJlZCBhcyBcIm5vIGRhdGFcIiBhbmQgdGh1cyBub3QgaWdub3JlZC4gVGhlIGxpbmUgd2lsbCBoYXZlIGEgYnJlYWsgYXQgdGhlc2UgdmFsdWVzLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oc3RyaW5nKTpib29sZWFufSAqL1xuICAgICAgICB0aGlzLm5vRGF0YSA9IG9wdHMubm9EYXRhIHx8ICgodikgPT4gdiA9PT0gdW5kZWZpbmVkIHx8IHYgPT0gJycgfHwgdiA9PT0gbnVsbCB8fCBpc05hTigrdikpXG5cbiAgICAgICAgLy94XG4gICAgICAgIC8qKiBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm9mZnNldFggPSBvcHRzLm9mZnNldFggfHwgKChjLCByLCB6KSA9PiAwKVxuICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgKChjLCByLCB6KSA9PiByKVxuXG4gICAgICAgIC8veVxuICAgICAgICAvKiogaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5vZmZzZXRZID0gb3B0cy5vZmZzZXRZIHx8ICgoYywgciwgeikgPT4gMClcbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gb3B0cy5oZWlnaHQgfHwgKChjLCByLCB6KSA9PiByKVxuICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIpOkFuY2hvck1vZGVZRW51bX0gKi9cbiAgICAgICAgdGhpcy5hbmNob3JNb2RlWSA9IG9wdHMuYW5jaG9yTW9kZVkgfHwgKChjLCByLCB6KSA9PiAnY2VudGVyJylcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHdpZHRoIG9mIHRoZSBsaW5lLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMubGluZVdpZHRoID0gb3B0cy5saW5lV2lkdGggfHwgKCh2LCByLCBzLCB6KSA9PiAxLjUgKiB6KVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGNoYXJ0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnYmxhY2snKSAvLyhjLHIseix2cykgPT4ge31cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHRleHQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgY29uc3QgY3R4ID0gZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL2NvbXB1dGUgY2VsbCBhbXBsaXR1ZGVcbiAgICAgICAgY29uc3QgZ2V0QW1wbGl0dWRlID0gKGMpID0+IHtcbiAgICAgICAgICAgIGxldCBtaW4sIG1heFxuICAgICAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLnRzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsID0gY1t0XVxuICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGlmIChtaW4gPT0gdW5kZWZpbmVkIHx8IHZhbCA8IG1pbikgbWluID0gdmFsXG4gICAgICAgICAgICAgICAgaWYgKG1heCA9PSB1bmRlZmluZWQgfHwgdmFsID4gbWF4KSBtYXggPSB2YWxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtaW4gPT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICByZXR1cm4gbWF4IC0gbWluXG4gICAgICAgIH1cblxuICAgICAgICAvL2NvbXB1dGUgbWF4IGFtcGxpdHVkZVxuICAgICAgICBsZXQgYW1wTWF4XG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGFtcCA9IGdldEFtcGxpdHVkZShjKVxuICAgICAgICAgICAgaWYgKGFtcCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAoYW1wTWF4ID09IHVuZGVmaW5lZCB8fCBhbXAgPiBhbXBNYXgpIGFtcE1heCA9IGFtcFxuICAgICAgICB9XG4gICAgICAgIGlmICghYW1wTWF4KSByZXR1cm5cblxuICAgICAgICBjb25zdCBuYiA9IHRoaXMudHMubGVuZ3RoXG5cbiAgICAgICAgY3R4LmxpbmVDYXAgPSAnYnV0dCdcbiAgICAgICAgZm9yIChsZXQgYyBvZiBjZWxscykge1xuICAgICAgICAgICAgLy9saW5lIHdpZHRoXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCB3RyA9IHRoaXMubGluZVdpZHRoID8gdGhpcy5saW5lV2lkdGgoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vbGluZSBjb2xvclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFjb2wpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8veFxuICAgICAgICAgICAgY29uc3Qgb2ZmWCA9IHRoaXMub2Zmc2V0WCA/IHRoaXMub2Zmc2V0WChjLCByZXNvbHV0aW9uLCB6KSA6IDBcbiAgICAgICAgICAgIGlmIChvZmZYID09IHVuZGVmaW5lZCB8fCBpc05hTihvZmZYKSkgY29udGludWVcbiAgICAgICAgICAgIGNvbnN0IHcgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChjLCByZXNvbHV0aW9uLCB6KSA6IHJlc29sdXRpb25cbiAgICAgICAgICAgIGlmICh3ID09IHVuZGVmaW5lZCB8fCBpc05hTih3KSkgY29udGludWVcblxuICAgICAgICAgICAgLy95XG4gICAgICAgICAgICBjb25zdCBvZmZZID0gdGhpcy5vZmZzZXRZID8gdGhpcy5vZmZzZXRZKGMsIHJlc29sdXRpb24sIHopIDogMFxuICAgICAgICAgICAgaWYgKG9mZlkgPT0gdW5kZWZpbmVkIHx8IGlzTmFOKG9mZlkpKSBjb250aW51ZVxuICAgICAgICAgICAgY29uc3QgaCA9IHRoaXMuaGVpZ2h0ID8gdGhpcy5oZWlnaHQoYywgcmVzb2x1dGlvbiwgeikgOiByZXNvbHV0aW9uXG4gICAgICAgICAgICBpZiAoaCA9PSB1bmRlZmluZWQgfHwgaXNOYU4oaCkpIGNvbnRpbnVlXG4gICAgICAgICAgICBjb25zdCBhbmNoWSA9IHRoaXMuYW5jaG9yTW9kZVkgPyB0aGlzLmFuY2hvck1vZGVZKGMsIHJlc29sdXRpb24sIHopIDogJ2NlbnRlcidcbiAgICAgICAgICAgIGlmICghYW5jaFkpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSB3R1xuICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gY29sXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBhbmNob3IgWSBmaWd1cmVzXG4gICAgICAgICAgICBsZXQgdmFsMCwgeTBcbiAgICAgICAgICAgIGlmIChhbmNoWSA9PT0gJ2ZpcnN0Jykge1xuICAgICAgICAgICAgICAgIC8vZ2V0IGZpcnN0IHZhbHVlXG4gICAgICAgICAgICAgICAgdmFsMCA9IGNbdGhpcy50c1swXV1cbiAgICAgICAgICAgICAgICB5MCA9IDBcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5jaFkgPT09ICdsYXN0Jykge1xuICAgICAgICAgICAgICAgIC8vZ2V0IGxhc3QgdmFsdWVcbiAgICAgICAgICAgICAgICB2YWwwID0gY1t0aGlzLnRzW3RoaXMudHMubGVuZ3RoIC0gMV1dXG4gICAgICAgICAgICAgICAgeTAgPSAwXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFuY2hZID09PSAnYm90dG9tJykge1xuICAgICAgICAgICAgICAgIC8vZ2V0IG1pblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy50cykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSArY1t0XVxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsID09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbDAgPT0gdW5kZWZpbmVkIHx8IHZhbCA8IHZhbDApIHZhbDAgPSB2YWxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeTAgPSAwXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFuY2hZID09PSAndG9wJykge1xuICAgICAgICAgICAgICAgIC8vZ2V0IG1heFxuICAgICAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy50cykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSArY1t0XVxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsID09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbDAgPT0gdW5kZWZpbmVkIHx8IHZhbCA+IHZhbDApIHZhbDAgPSB2YWxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeTAgPSByZXNvbHV0aW9uXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFuY2hZID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgICAgIC8vZ2V0IG1pbiBhbmQgbWF4XG4gICAgICAgICAgICAgICAgbGV0IG1pbiwgbWF4XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNbdF1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGlmIChtaW4gPT0gdW5kZWZpbmVkIHx8IHZhbCA8IG1pbikgbWluID0gdmFsXG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXggPT0gdW5kZWZpbmVkIHx8IHZhbCA+IG1heCkgbWF4ID0gdmFsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhbDAgPSAoK21heCArICttaW4pICogMC41XG4gICAgICAgICAgICAgICAgeTAgPSByZXNvbHV0aW9uIC8gMlxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVW5leHBlY3RlZCBhbmNob3JNb2RlWTogJyArIGFuY2hZKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qL2RyYXcgbGluZVxuICAgICAgICAgICAgaWYgKHZhbDAgPT0gdW5kZWZpbmVkIHx8IGlzTmFOKHZhbDApKSBjb250aW51ZVxuICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBjb25zdCBzWCA9IHcgLyAobmIgLSAxKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsID0gY1t0aGlzLnRzW2ldXVxuICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gdW5kZWZpbmVkIHx8IGlzTmFOKHZhbCkpIGJyZWFrXG4gICAgICAgICAgICAgICAgaWYgKGkgPT0gMClcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyhjLnggKyBpICogc1ggKyBvZmZYLCBjLnkgKyB5MCArICh2YWwgLSB2YWwwKSAqIGggLyBhbXBNYXggKyBvZmZZKVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjLnggKyBpICogc1ggKyBvZmZYLCBjLnkgKyB5MCArICh2YWwgLSB2YWwwKSAqIGggLyBhbXBNYXggKyBvZmZZKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpKi9cblxuICAgICAgICAgICAgLy9kcmF3IGxpbmUsIHNlZ21lbnQgYnkgc2VnbWVudFxuICAgICAgICAgICAgY29uc3Qgc1ggPSB3IC8gKG5iIC0gMSlcblxuICAgICAgICAgICAgLy9oYW5kbGUgZmlyc3QgcG9pbnRcbiAgICAgICAgICAgIGxldCB2MCA9IGNbdGhpcy50c1swXV1cbiAgICAgICAgICAgIGlmICghdGhpcy5ub0RhdGEodjApKSB7XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjLnggKyBvZmZYLCBjLnkgKyB5MCArICgodjAgLSB2YWwwKSAqIGgpIC8gYW1wTWF4ICsgb2ZmWSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vY29uc29sZS5sb2codjAsIGlzTmFOKHYwKSlcblxuICAgICAgICAgICAgbGV0IHYxXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG5iOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2MSA9IGNbdGhpcy50c1tpXV1cblxuICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50IGZyb20gdjAgdG8gdjFcblxuICAgICAgICAgICAgICAgIC8vYm90aCBwb2ludHMgJ25vIGRhdGEnXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubm9EYXRhKHYwKSAmJiB0aGlzLm5vRGF0YSh2MSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9zZWNvbmQgcG9pbnQgJ25vIGRhdGEnXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5ub0RhdGEodjApICYmIHRoaXMubm9EYXRhKHYxKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcblxuICAgICAgICAgICAgICAgICAgICAvL2ZpcnN0IHBvaW50ICdubyBkYXRhJ1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub0RhdGEodjApICYmICF0aGlzLm5vRGF0YSh2MSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oYy54ICsgaSAqIHNYICsgb2ZmWCwgYy55ICsgeTAgKyAoKHYxIC0gdmFsMCkgKiBoKSAvIGFtcE1heCArIG9mZlkpXG5cbiAgICAgICAgICAgICAgICAgICAgLy9ib3RoIHBvaW50cyBoYXZlIGRhdGE6IHRyYWNlIGxpbmVcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIGkgKiBzWCArIG9mZlgsIGMueSArIHkwICsgKCh2MSAtIHZhbDApICogaCkgLyBhbXBNYXggKyBvZmZZKVxuICAgICAgICAgICAgICAgICAgICAvL2lmIGl0IGlzIHRoZSBsYXN0IHBvaW50LCBzdHJva2VcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gbmIgLSAxKSBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdjAgPSB2MVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kLCBpZiBhbnlcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBpbml0U2hhZGVyUHJvZ3JhbSwgY3JlYXRlU2hhZGVyIH0gZnJvbSAnLi93ZWJHTFV0aWxzLmpzJ1xuaW1wb3J0IHsgY29sb3IgfSBmcm9tICdkMy1jb2xvcidcblxuLyoqXG4gKiBFdmVyeXRoaW5nIHRvIGVhc2lseSBkcmF3IGNvbG9yZWQgc3F1YXJlcyB3aXRoIHdlYkdMLlxuICogQWxsIHRoZSBzYW1lIHNpemUsIGJ1dCBkaWZmZXJlbnQgZmlsbCBjb2xvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkdMU3F1YXJlQ29sb3Jpbmcge1xuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZ2wsIHNpemVQaXgpIHtcbiAgICAgICAgdGhpcy5nbCA9IGdsXG4gICAgICAgIHRoaXMuc2l6ZVBpeCA9IHNpemVQaXggfHwgMTAuMFxuXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IGluaXRTaGFkZXJQcm9ncmFtKFxuICAgICAgICAgICAgZ2wsXG4gICAgICAgICAgICBjcmVhdGVTaGFkZXIoXG4gICAgICAgICAgICAgICAgZ2wsXG4gICAgICAgICAgICAgICAgZ2wuVkVSVEVYX1NIQURFUixcbiAgICAgICAgICAgICAgICBgXG4gICAgICAgICAgICBhdHRyaWJ1dGUgdmVjMiBwb3M7XG4gICAgICAgICAgICB1bmlmb3JtIGZsb2F0IHNpemVQaXg7XG4gICAgICAgICAgICB1bmlmb3JtIG1hdDMgbWF0O1xuICAgICAgICAgICAgYXR0cmlidXRlIHZlYzQgY29sb3I7XG4gICAgICAgICAgICB2YXJ5aW5nIHZlYzQgdkNvbG9yO1xuICAgICAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQobWF0ICogdmVjMyhwb3MsIDEuMCksIDEuMCk7XG4gICAgICAgICAgICAgIGdsX1BvaW50U2l6ZSA9IHNpemVQaXg7XG4gICAgICAgICAgICAgIHZDb2xvciA9IGNvbG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGBcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBjcmVhdGVTaGFkZXIoXG4gICAgICAgICAgICAgICAgZ2wsXG4gICAgICAgICAgICAgICAgZ2wuRlJBR01FTlRfU0hBREVSLFxuICAgICAgICAgICAgICAgIGBcbiAgICAgICAgICAgIHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuICAgICAgICAgICAgdmFyeWluZyB2ZWM0IHZDb2xvcjtcbiAgICAgICAgICAgIHZvaWQgbWFpbih2b2lkKSB7XG4gICAgICAgICAgICAgICAgdmVjNCB2Q29sb3JfID0gdkNvbG9yIC8gMjU1LjA7XG4gICAgICAgICAgICAgICAgdkNvbG9yX1szXSA9IDI1NS4wICogdkNvbG9yX1szXTtcbiAgICAgICAgICAgICAgICBnbF9GcmFnQ29sb3IgPSB2Q29sb3JfO1xuICAgICAgICAgICAgfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICBnbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbSlcblxuICAgICAgICAvL2J1ZmZlciBkYXRhXG4gICAgICAgIHRoaXMudmVydGljZXNCdWZmZXIgPSBbXVxuICAgICAgICB0aGlzLmNvbG9yc0J1ZmZlciA9IFtdXG4gICAgfVxuXG4gICAgLyoqIEFkZCBkYXRhIHRvIHZlcnRpY2VzL3NpemUvY29sb3IgYnVmZmVycyBmb3IgY29sb3Igc3F1YXJlcyBkcmF3aW5nICovXG4gICAgYWRkUG9pbnREYXRhKHhDLCB5QywgY29sKSB7XG4gICAgICAgIC8vY29udmVydCBjb2xvclxuICAgICAgICBjb25zdCBjYyA9IGNvbG9yKGNvbClcbiAgICAgICAgLy9jb25zdCBjYyA9IHtyOjQ1LGc6ODcsYjo5OCxvcGFjaXR5OjAuOX1cbiAgICAgICAgaWYgKCFjYykgcmV0dXJuXG5cbiAgICAgICAgLy92ZXJ0aWNlc1xuICAgICAgICB0aGlzLnZlcnRpY2VzQnVmZmVyLnB1c2goeEMsIHlDKVxuICAgICAgICAvL2NvbG9yXG4gICAgICAgIHRoaXMuY29sb3JzQnVmZmVyLnB1c2goY2MuciwgY2MuZywgY2MuYiwgY2Mub3BhY2l0eSlcbiAgICB9XG5cbiAgICBhZGRQb2ludERhdGEyKHhDLCB5QywgciwgZywgYiwgb3BhY2l0eSkge1xuICAgICAgICAvL3ZlcnRpY2VzXG4gICAgICAgIHRoaXMudmVydGljZXNCdWZmZXIucHVzaCh4QywgeUMpXG4gICAgICAgIC8vY29sb3JcbiAgICAgICAgdGhpcy5jb2xvcnNCdWZmZXIucHVzaChyLCBnLCBiLCBvcGFjaXR5KVxuICAgIH1cblxuICAgIC8qKiAgKi9cbiAgICBkcmF3KHRyYW5zZm9NYXQpIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsXG5cbiAgICAgICAgLy92ZXJ0aWNlIGRhdGFcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGdsLmNyZWF0ZUJ1ZmZlcigpKVxuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheSh0aGlzLnZlcnRpY2VzQnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24odGhpcy5wcm9ncmFtLCAncG9zJylcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgMiwgLy9udW1Db21wb25lbnRzXG4gICAgICAgICAgICBnbC5GTE9BVCwgLy90eXBlXG4gICAgICAgICAgICBmYWxzZSwgLy9ub3JtYWxpc2VcbiAgICAgICAgICAgIDAsIC8vc3RyaWRlXG4gICAgICAgICAgICAwIC8vb2Zmc2V0XG4gICAgICAgIClcbiAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkocG9zaXRpb24pXG5cbiAgICAgICAgLy9jb2xvciBkYXRhXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkodGhpcy5jb2xvcnNCdWZmZXIpLCBnbC5TVEFUSUNfRFJBVylcbiAgICAgICAgdmFyIGNvbG9yID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24odGhpcy5wcm9ncmFtLCAnY29sb3InKVxuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGNvbG9yLCA0LCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApXG4gICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGNvbG9yKVxuXG4gICAgICAgIC8vc2l6ZVBpeFxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ3NpemVQaXgnKSwgMS4wICogdGhpcy5zaXplUGl4KVxuXG4gICAgICAgIC8vdHJhbnNmb3JtYXRpb25cbiAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDNmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCAnbWF0JyksIGZhbHNlLCBuZXcgRmxvYXQzMkFycmF5KHRyYW5zZm9NYXQpKVxuXG4gICAgICAgIC8vIEVuYWJsZSB0aGUgZGVwdGggdGVzdFxuICAgICAgICAvL2dsLmVuYWJsZShnbC5ERVBUSF9URVNUKTtcbiAgICAgICAgLy8gQ2xlYXIgdGhlIGNvbG9yIGJ1ZmZlciBiaXRcbiAgICAgICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVClcbiAgICAgICAgLy8gU2V0IHRoZSB2aWV3IHBvcnRcbiAgICAgICAgLy9nbC52aWV3cG9ydCgwLCAwLCBjZy53LCBjZy5oKTtcblxuICAgICAgICBnbC5kcmF3QXJyYXlzKGdsLlBPSU5UUywgMCwgdGhpcy52ZXJ0aWNlc0J1ZmZlci5sZW5ndGggLyAyKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgaW5pdFNoYWRlclByb2dyYW0sIGNyZWF0ZVNoYWRlciB9IGZyb20gJy4vd2ViR0xVdGlscy5qcydcbmltcG9ydCB7IGNvbG9yIH0gZnJvbSAnZDMtY29sb3InXG5cbi8qKlxuICogRXZlcnl0aGluZyB0byBlYXNpbHkgZHJhdyBjb2xvcmVkIHNxdWFyZXMgd2l0aCB3ZWJHTC5cbiAqIEFsbCB0aGUgc2FtZSBzaXplLCBidXQgZGlmZmVyZW50IGZpbGwgY29sb3IuXG4gKiBUaGUgY29sb3IgaW50ZXJwb2xhdGlvbiBpcyBjb21wdXRlZCBpbiB0aGUgZnJhZ21lbnQgc2hhZGVyIHByb2dyYW0sIGJ5IHRoZSBHUFUsIHRodXMgaXQgaXMgbGVzcyBmbGV4aWJsZSBidXQgZmFzdGVyLlxuICovXG5leHBvcnQgY2xhc3MgV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkIHtcbiAgICAvL3NlZTpcbiAgICAvL2h0dHBzOi8vd2ViZ2xmdW5kYW1lbnRhbHMub3JnL3dlYmdsL2xlc3NvbnMvZnIvd2ViZ2wtc2hhZGVycy1hbmQtZ2xzbC5odG1sI2xlcy11bmlmb3Jtcy1kYW5zLWxlcy1zaGFkZXJzLWRlLXZlcnRleFxuICAgIC8vaHR0cHM6Ly90aGVib29rb2ZzaGFkZXJzLmNvbS9nbG9zc2FyeS8/c2VhcmNoPW1peFxuICAgIC8vaHR0cHM6Ly90aGVib29rb2ZzaGFkZXJzLmNvbS8wNi9cbiAgICAvL2h0dHBzOi8vdGhlYm9va29mc2hhZGVycy5jb20vZ2xvc3NhcnkvXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gZ2xcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxTdHJpbmc+fSBjb2xvcnNcbiAgICAgKiBAcGFyYW0ge3tmdW46c3RyaW5nLGFscGhhOm51bWJlcn19IHN0cmV0Y2hpbmdcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZVBpeFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfHVuZGVmaW5lZH0gZ2xvYmFsT3BhY2l0eVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGdsLCBjb2xvcnMsIHN0cmV0Y2hpbmcsIHNpemVQaXggPSAxMCwgZ2xvYmFsT3BhY2l0eSA9IHVuZGVmaW5lZCkge1xuICAgICAgICAvKiogQHR5cGUge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gKi9cbiAgICAgICAgdGhpcy5nbCA9IGdsXG4gICAgICAgIC8vZ2wucGl4ZWxTdG9yZWkoZ2wuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLCB0cnVlKTtcbiAgICAgICAgLy9nbC5ibGVuZEZ1bmMoZ2wuU1JDX0FMUEhBLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcbiAgICAgICAgLy9nbC5ibGVuZEZ1bmMoZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcblxuICAgICAgICAvKiogQHR5cGUge1dlYkdMU2hhZGVyfSAqL1xuICAgICAgICBjb25zdCB2U2hhZGVyID0gY3JlYXRlU2hhZGVyKFxuICAgICAgICAgICAgZ2wsXG4gICAgICAgICAgICBnbC5WRVJURVhfU0hBREVSLFxuICAgICAgICAgICAgYFxuICAgICAgICBhdHRyaWJ1dGUgdmVjMiBwb3M7XG4gICAgICAgIHVuaWZvcm0gZmxvYXQgc2l6ZVBpeDtcbiAgICAgICAgdW5pZm9ybSBtYXQzIG1hdDtcblxuICAgICAgICBhdHRyaWJ1dGUgZmxvYXQgdDtcbiAgICAgICAgdmFyeWluZyBmbG9hdCB2dDtcblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KG1hdCAqIHZlYzMocG9zLCAxLjApLCAxLjApO1xuICAgICAgICAgIGdsX1BvaW50U2l6ZSA9IHNpemVQaXg7XG4gICAgICAgICAgdnQgPSB0O1xuICAgICAgICB9XG4gICAgICBgXG4gICAgICAgIClcblxuICAgICAgICAvL3ByZXBhcmUgZnJhZ21lbnQgc2hhZGVyIGNvZGVcbiAgICAgICAgLy9kZWNsYXJlIHRoZSB1bmlmb3JtIGFuZCBvdGhlciB2YXJpYWJsZXNcbiAgICAgICAgbGV0IGZzaFN0cmluZyA9XG4gICAgICAgICAgICAnJyArXG4gICAgICAgICAgICAncHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XFxuJyArXG4gICAgICAgICAgICAndmFyeWluZyBmbG9hdCB2dDtcXG4nICtcbiAgICAgICAgICAgICd1bmlmb3JtIGZsb2F0IGFscGhhO1xcbicgK1xuICAgICAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXQgPSBbXVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSBvdXQucHVzaCgndW5pZm9ybSB2ZWM0IGMnICsgaSArICc7XFxuJylcbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0LmpvaW4oJycpXG4gICAgICAgICAgICB9KSgpICtcbiAgICAgICAgICAgIC8vc3RhcnQgdGhlIG1haW4gZnVuY3Rpb24sIGFwcGx5IHRoZSBzdHJldGNoaW5nIG9mIHRcbiAgICAgICAgICAgICd2b2lkIG1haW4odm9pZCkge1xcbidcblxuICAgICAgICBpZiAoc3RyZXRjaGluZykge1xuICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdwb3cnKVxuICAgICAgICAgICAgICAgIC8vc1BvdyA9ICh0LCBhbHBoYSA9IDMpID0+IE1hdGgucG93KHQsIGFscGhhKTtcbiAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSBwb3codnQsIGFscGhhKTtcXG4nXG4gICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmZ1biA9PSAncG93SW52JylcbiAgICAgICAgICAgICAgICAvL3NQb3dSZXYgPSAodCwgYWxwaGEgPSAzKSA9PiAxIC0gTWF0aC5wb3coMSAtIHQsIDEgLyBhbHBoYSk7XG4gICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gMS4wLXBvdygxLjAtdnQsIDEuMC9hbHBoYSk7XFxuJ1xuICAgICAgICAgICAgZWxzZSBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ2V4cCcpXG4gICAgICAgICAgICAgICAgLy9zRXhwID0gKHQsIGFscGhhID0gMykgPT4gYWxwaGEgPT0gMCA/IHQgOiAoTWF0aC5leHAodCAqIGFscGhhKSAtIDEpIC8gKE1hdGguZXhwKGFscGhhKSAtIDEpO1xuICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPVxuICAgICAgICAgICAgICAgICAgICBzdHJldGNoaW5nLmFscGhhID09IDBcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYGZsb2F0IHQgPSB2dDtgXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICcgICBmbG9hdCB0ID0gKGV4cCh2dCAqIGFscGhhKSAtIDEuMCkgLyAoZXhwKGFscGhhKSAtIDEuMCk7XFxuJ1xuICAgICAgICAgICAgZWxzZSBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ2xvZycpXG4gICAgICAgICAgICAgICAgLy9zRXhwUmV2ID0gKHQsIGFscGhhID0gMykgPT4gYWxwaGEgPT0gMCA/IHQgOiAxIC0gKDEgLyBhbHBoYSkgKiBNYXRoLmxvZyhNYXRoLmV4cChhbHBoYSkgKiAoMSAtIHQpICsgdCk7XG4gICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9XG4gICAgICAgICAgICAgICAgICAgIHN0cmV0Y2hpbmcuYWxwaGEgPT0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgZmxvYXQgdCA9IHZ0O2BcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJyAgIGZsb2F0IHQgPSAxLjAgLSAoMS4wIC8gYWxwaGEpICogbG9nKGV4cChhbHBoYSkgKiAoMS4wIC0gdnQpICsgdnQpO1xcbidcbiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdjaXJjbGUnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcuYWxwaGEgPT0gMClcbiAgICAgICAgICAgICAgICAgICAgLy9pZiAoYWxwaGEgPT0gMCkgcmV0dXJuIHQ7XG4gICAgICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgZmxvYXQgdCA9IHZ0O1xcbidcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmFscGhhID09IDEpXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChhbHBoYSA9PSAxKSByZXR1cm4gTWF0aC5zcXJ0KDIgKiB0IC0gdCAqIHQpO1xuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSBzcXJ0KHZ0ICogKDIuMCAtIHZ0KSk7XFxuJ1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IGEgPSBhbHBoYSAvICgxIC0gYWxwaGEpO1xuICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBNYXRoLnNxcnQoMSAvIChhICogYSkgKyB0ICogKDIgLyBhICsgMiAtIHQpKSAtIDEgLyBhO1xuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz1cbiAgICAgICAgICAgICAgICAgICAgICAgICcgICBmbG9hdCBhID0gYWxwaGEgLyAoMS4wIC0gYWxwaGEpO1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyAgIGZsb2F0IHQgPSBzcXJ0KDEuMCAvIChhICogYSkgKyB2dCAqICggMi4wL2EgKyAyLjAgLSB2dCApKSAtIDEuMCAvIGE7XFxuJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ2NpcmNsZUludicpIHtcbiAgICAgICAgICAgICAgICAvLyAxIC0gc0NpcmNsZUxvdygxIC0gdCwgYWxwaGEpXG4gICAgICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcuYWxwaGEgPT0gMClcbiAgICAgICAgICAgICAgICAgICAgLy9pZiAoYWxwaGEgPT0gMCkgcmV0dXJuIHQ7XG4gICAgICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgZmxvYXQgdCA9IHZ0O1xcbidcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmFscGhhID09IDEpXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChhbHBoYSA9PSAxKSByZXR1cm4gTWF0aC5zcXJ0KDIgKiB0IC0gdCAqIHQpO1xuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSAxLjAgLSBzcXJ0KCgxLjAgLSB2dCkgKiAoMS4wICsgdnQpKTtcXG4nXG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc3QgYSA9IGFscGhhIC8gKDEgLSBhbHBoYSk7XG4gICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIE1hdGguc3FydCgxIC8gKGEgKiBhKSArICgyICogdCkgLyBhICsgMiAqIHQgLSB0ICogdCkgLSAxIC8gYTtcbiAgICAgICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9XG4gICAgICAgICAgICAgICAgICAgICAgICAnICAgZmxvYXQgYSA9IGFscGhhIC8gKDEuMCAtIGFscGhhKTtcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgICBmbG9hdCB0ID0gMS4wIC0gc3FydCgxLjAgLyAoYSAqIGEpICsgKDEuMC12dCkgKiAoIDIuMC9hICsgMS4wICsgdnQgKSkgKyAxLjAgLyBhO1xcbidcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuZXhwZWN0ZWQgc3RyZXRjaGluZyBmdW5jdGlvbiBjb2RlOiAnICsgc3RyZXRjaGluZy5mdW4pXG4gICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gdnQ7XFxuJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gdnQ7XFxuJ1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaG9vc2UgaW5pdGlhbCBhbmQgZmluYWwgY29sb3JzLCBhbmQgYWRqdXN0IHQgdmFsdWVcbiAgICAgICAgaWYgKGNvbG9ycy5sZW5ndGggPT0gMSkgZnNoU3RyaW5nICs9ICcgICB2ZWM0IGNJPWMwO1xcbiAgIHZlYzQgY0Y9YzA7XFxuJ1xuICAgICAgICBlbHNlIGlmIChjb2xvcnMubGVuZ3RoID09IDIpIGZzaFN0cmluZyArPSAnICAgdmVjNCBjST1jMDtcXG4gICB2ZWM0IGNGPWMxO1xcbidcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuYiA9IGNvbG9ycy5sZW5ndGggLSAxXG4gICAgICAgICAgICBjb25zdCBuYnMgPSBuYiArICcuMCdcbiAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgdmVjNCBjSTtcXG4nXG4gICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIHZlYzQgY0Y7XFxuJ1xuICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBpZih0PDEuMC8nICsgbmJzICsgJykgeyBjST1jMDsgY0Y9YzE7IHQ9dConICsgbmJzICsgJzsgfVxcbidcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAyOyBpIDwgbmI7IGkrKylcbiAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz1cbiAgICAgICAgICAgICAgICAgICAgJyAgIGVsc2UgaWYodDwnICtcbiAgICAgICAgICAgICAgICAgICAgaSArXG4gICAgICAgICAgICAgICAgICAgICcuMC8nICtcbiAgICAgICAgICAgICAgICAgICAgbmJzICtcbiAgICAgICAgICAgICAgICAgICAgJykgeyBjST1jJyArXG4gICAgICAgICAgICAgICAgICAgIChpIC0gMSkgK1xuICAgICAgICAgICAgICAgICAgICAnOyBjRj1jJyArXG4gICAgICAgICAgICAgICAgICAgIGkgK1xuICAgICAgICAgICAgICAgICAgICAnOyB0PScgK1xuICAgICAgICAgICAgICAgICAgICBuYnMgK1xuICAgICAgICAgICAgICAgICAgICAnKnQtJyArXG4gICAgICAgICAgICAgICAgICAgIChpIC0gMSkgK1xuICAgICAgICAgICAgICAgICAgICAnLjA7IH1cXG4nXG4gICAgICAgICAgICBmc2hTdHJpbmcgKz1cbiAgICAgICAgICAgICAgICAnICAgZWxzZSB7IGNJPWMnICsgKG5iIC0gMSkgKyAnOyBjRj1jJyArIG5iICsgJzsgdD0nICsgbmJzICsgJyp0LScgKyAobmIgLSAxKSArICcuMDsgfVxcbidcbiAgICAgICAgfVxuXG4gICAgICAgIC8vb25lIHNpbmdsZSBjb2xvclxuICAgICAgICBpZiAoY29sb3JzLmxlbmd0aCA9PSAxKSBmc2hTdHJpbmcgKz0gJyAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoYzBbMF0sIGMwWzFdLCBjMFsyXSwgYzBbM10pO31cXG4nXG4gICAgICAgIC8vc2V0IGludGVycG9sYXRlZCBjb2xvciwgYmV0d2VlbiBpbml0aWFsIGFuZCBmaW5hbCBvbmVcbiAgICAgICAgZWxzZSBmc2hTdHJpbmcgKz0gJyAgIGdsX0ZyYWdDb2xvciA9IG1peChjSSwgY0YsIHQpO31cXG4nXG5cbiAgICAgICAgLy9jb25zb2xlLmxvZyhmc2hTdHJpbmcpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcn0gKi9cbiAgICAgICAgY29uc3QgZlNoYWRlciA9IGNyZWF0ZVNoYWRlcihnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCBmc2hTdHJpbmcpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFByb2dyYW19ICovXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IGluaXRTaGFkZXJQcm9ncmFtKGdsLCB2U2hhZGVyLCBmU2hhZGVyKVxuICAgICAgICBnbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbSlcblxuICAgICAgICAvL3NldCB1bmlmb3Jtc1xuXG4gICAgICAgIC8vc2l6ZVBpeFxuICAgICAgICAvL1RPRE86IGJ1ZyBoZXJlLiBTZWVtcyB0byBiZSBsaW1pdGVkIHRvIHNvbWUgdGhyZXNob2xkIHZhbHVlIChhcm91bmQgMjUwKS5cbiAgICAgICAgZ2wudW5pZm9ybTFmKGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sICdzaXplUGl4JyksIDEuMCAqIHNpemVQaXgpXG5cbiAgICAgICAgLy9zdHJldGNoaW5nIGFscGhhIGZhY3RvclxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ2FscGhhJyksIHN0cmV0Y2hpbmcgPyAxLjAgKiBzdHJldGNoaW5nLmFscGhhIDogMC4wKVxuXG4gICAgICAgIC8vY29sb3JzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gY29sb3IoY29sb3JzW2ldKVxuXG4gICAgICAgICAgICBsZXQgb3BhY2l0eSA9IGMub3BhY2l0eVxuICAgICAgICAgICAgaWYgKGMub3BhY2l0eSA9PSAxICYmIGdsb2JhbE9wYWNpdHkgIT0gdW5kZWZpbmVkKSBvcGFjaXR5ID0gZ2xvYmFsT3BhY2l0eVxuXG4gICAgICAgICAgICBnbC51bmlmb3JtNGZ2KGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sICdjJyArIGkpLCBbXG4gICAgICAgICAgICAgICAgK2MuciAvIDI1NS4wLFxuICAgICAgICAgICAgICAgICtjLmcgLyAyNTUuMCxcbiAgICAgICAgICAgICAgICArYy5iIC8gMjU1LjAsXG4gICAgICAgICAgICAgICAgK29wYWNpdHksXG4gICAgICAgICAgICBdKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqICAqL1xuICAgIGRyYXcodmVydGljZXNCdWZmZXIsIHRCdWZmZXIsIHRyYW5zZm9NYXQpIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsXG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSB0aGlzLnByb2dyYW1cblxuICAgICAgICAvL3ZlcnRpY2UgZGF0YVxuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZ2wuY3JlYXRlQnVmZmVyKCkpXG4gICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KHZlcnRpY2VzQnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgJ3BvcycpXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoXG4gICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgIDIsIC8vbnVtQ29tcG9uZW50c1xuICAgICAgICAgICAgZ2wuRkxPQVQsIC8vdHlwZVxuICAgICAgICAgICAgZmFsc2UsIC8vbm9ybWFsaXNlXG4gICAgICAgICAgICAwLCAvL3N0cmlkZVxuICAgICAgICAgICAgMCAvL29mZnNldFxuICAgICAgICApXG4gICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uKVxuXG4gICAgICAgIC8vdCBkYXRhXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkodEJ1ZmZlciksIGdsLlNUQVRJQ19EUkFXKVxuICAgICAgICBjb25zdCB0ID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgJ3QnKVxuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHQsIDEsIGdsLkZMT0FULCBmYWxzZSwgMCwgMClcbiAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkodClcblxuICAgICAgICAvL3RyYW5zZm9ybWF0aW9uXG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXgzZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdtYXQnKSwgZmFsc2UsIG5ldyBGbG9hdDMyQXJyYXkodHJhbnNmb01hdCkpXG5cbiAgICAgICAgLy8gRW5hYmxlIHRoZSBkZXB0aCB0ZXN0XG4gICAgICAgIC8vZ2wuZW5hYmxlKGdsLkRFUFRIX1RFU1QpO1xuICAgICAgICAvLyBDbGVhciB0aGUgY29sb3IgYnVmZmVyIGJpdFxuICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUKVxuICAgICAgICAvLyBTZXQgdGhlIHZpZXcgcG9ydFxuICAgICAgICAvL2dsLnZpZXdwb3J0KDAsIDAsIGNnLncsIGNnLmgpO1xuXG4gICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuUE9JTlRTLCAwLCB2ZXJ0aWNlc0J1ZmZlci5sZW5ndGggLyAyKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgaW5pdFNoYWRlclByb2dyYW0sIGNyZWF0ZVNoYWRlciB9IGZyb20gJy4vd2ViR0xVdGlscy5qcydcbmltcG9ydCB7IGNvbG9yIH0gZnJvbSAnZDMtY29sb3InXG5cbi8qKlxuICogRXZlcnl0aGluZyB0byBlYXNpbHkgZHJhdyBjb2xvcmVkIHNxdWFyZXMgd2l0aCB3ZWJHTC5cbiAqIEFsbCB0aGUgc2FtZSBzaXplLCBidXQgZGlmZmVyZW50IGZpbGwgY29sb3IuXG4gKiBDb2xvciBiYXNlZCBvbiBjYXRlZ29yaWVzLlxuICovXG5leHBvcnQgY2xhc3MgV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+fSBjb2xvcnNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb2xvcnMpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48c3RyaW5nPn0gKi9cbiAgICAgICAgdGhpcy5jb2xvcnMgPSBjb2xvcnNcblxuICAgICAgICAvKiogVmVjdG9yIHNoYWRlciBwcm9ncmFtXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudnNoU3RyaW5nID0gYFxuICAgICAgICBhdHRyaWJ1dGUgdmVjMiBwb3M7XG4gICAgICAgIHVuaWZvcm0gZmxvYXQgc2l6ZVBpeDtcbiAgICAgICAgdW5pZm9ybSBtYXQzIG1hdDtcblxuICAgICAgICBhdHRyaWJ1dGUgZmxvYXQgaTtcbiAgICAgICAgdmFyeWluZyBmbG9hdCB2aTtcblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KG1hdCAqIHZlYzMocG9zLCAxLjApLCAxLjApO1xuICAgICAgICAgIGdsX1BvaW50U2l6ZSA9IHNpemVQaXg7XG4gICAgICAgICAgdmkgPSBpO1xuICAgICAgICB9XG4gICAgICAgIGBcblxuICAgICAgICAvL3ByZXBhcmUgZnJhZ21lbnQgc2hhZGVyIGNvZGVcbiAgICAgICAgLy9kZWNsYXJlIHRoZSB1bmlmb3JtIGFuZCBvdGhlciB2YXJpYWJsZXNcbiAgICAgICAgY29uc3Qgb3V0ID0gW11cbiAgICAgICAgb3V0LnB1c2goJ3ByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xcbnZhcnlpbmcgZmxvYXQgdmk7XFxuJylcbiAgICAgICAgLy9hZGQgY29sb3IgdW5pZm9ybXNcbiAgICAgICAgb3V0LnB1c2goJ3VuaWZvcm0gdmVjNCcpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA+IDApIG91dC5wdXNoKCcsJylcbiAgICAgICAgICAgIG91dC5wdXNoKCcgYycgKyBpKVxuICAgICAgICB9XG4gICAgICAgIG91dC5wdXNoKCc7XFxuJylcbiAgICAgICAgLy9zdGFydCB0aGUgbWFpbiBmdW5jdGlvblxuICAgICAgICBvdXQucHVzaCgndm9pZCBtYWluKHZvaWQpIHtcXG4nKVxuICAgICAgICAvL2Nob29zZSBjb2xvciBpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA+IDApIG91dC5wdXNoKCdlbHNlICcpXG4gICAgICAgICAgICBvdXQucHVzaCgnaWYodmk9PScpXG4gICAgICAgICAgICBvdXQucHVzaChpKVxuICAgICAgICAgICAgb3V0LnB1c2goJy4wKSBnbF9GcmFnQ29sb3IgPSB2ZWM0KGMnKVxuICAgICAgICAgICAgb3V0LnB1c2goaSlcbiAgICAgICAgICAgIG91dC5wdXNoKCdbMF0sIGMnKVxuICAgICAgICAgICAgb3V0LnB1c2goaSlcbiAgICAgICAgICAgIG91dC5wdXNoKCdbMV0sIGMnKVxuICAgICAgICAgICAgb3V0LnB1c2goaSlcbiAgICAgICAgICAgIG91dC5wdXNoKCdbMl0sIGMnKVxuICAgICAgICAgICAgb3V0LnB1c2goaSlcbiAgICAgICAgICAgIG91dC5wdXNoKCdbM10pO1xcbicpXG4gICAgICAgIH1cbiAgICAgICAgb3V0LnB1c2goJ2Vsc2UgZ2xfRnJhZ0NvbG9yID0gdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApO1xcbn0nKVxuICAgICAgICAvKiogRnJhZ21lbnQgc2hhZGVyIHByb2dyYW1cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5mc2hTdHJpbmcgPSBvdXQuam9pbignJylcbiAgICB9XG5cbiAgICAvKiogICovXG4gICAgZHJhdyhnbCwgdmVydGljZXNCdWZmZXIsIGlCdWZmZXIsIHRyYW5zZm9NYXQsIHNpemVQaXggPSAxMCkge1xuICAgICAgICAvKiogQHR5cGUge1dlYkdMU2hhZGVyfSAqL1xuICAgICAgICBjb25zdCB2U2hhZGVyID0gY3JlYXRlU2hhZGVyKGdsLCBnbC5WRVJURVhfU0hBREVSLCB0aGlzLnZzaFN0cmluZylcblxuICAgICAgICAvKiogQHR5cGUge1dlYkdMU2hhZGVyfSAqL1xuICAgICAgICBjb25zdCBmU2hhZGVyID0gY3JlYXRlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIHRoaXMuZnNoU3RyaW5nKVxuXG4gICAgICAgIC8qKiBAdHlwZSB7V2ViR0xQcm9ncmFtfSAqL1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gaW5pdFNoYWRlclByb2dyYW0oZ2wsIHZTaGFkZXIsIGZTaGFkZXIpXG4gICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSlcblxuICAgICAgICAvL3NldCB1bmlmb3Jtc1xuXG4gICAgICAgIC8vc2l6ZVBpeFxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdzaXplUGl4JyksIDEuMCAqIHNpemVQaXgpXG5cbiAgICAgICAgLy9jb2xvcnNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYyA9IGNvbG9yKHRoaXMuY29sb3JzW2ldKVxuICAgICAgICAgICAgZ2wudW5pZm9ybTRmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgJ2MnICsgaSksIFtcbiAgICAgICAgICAgICAgICArYy5yIC8gMjU1LjAsXG4gICAgICAgICAgICAgICAgK2MuZyAvIDI1NS4wLFxuICAgICAgICAgICAgICAgICtjLmIgLyAyNTUuMCxcbiAgICAgICAgICAgICAgICArYy5vcGFjaXR5LFxuICAgICAgICAgICAgXSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdmVydGljZSBkYXRhXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkodmVydGljZXNCdWZmZXIpLCBnbC5TVEFUSUNfRFJBVylcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAncG9zJylcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgMiwgLy9udW1Db21wb25lbnRzXG4gICAgICAgICAgICBnbC5GTE9BVCwgLy90eXBlXG4gICAgICAgICAgICBmYWxzZSwgLy9ub3JtYWxpc2VcbiAgICAgICAgICAgIDAsIC8vc3RyaWRlXG4gICAgICAgICAgICAwIC8vb2Zmc2V0XG4gICAgICAgIClcbiAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkocG9zaXRpb24pXG5cbiAgICAgICAgLy9pIGRhdGFcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGdsLmNyZWF0ZUJ1ZmZlcigpKVxuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheShpQnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXG4gICAgICAgIGNvbnN0IGkgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAnaScpXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoaSwgMSwgZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKVxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShpKVxuXG4gICAgICAgIC8vdHJhbnNmb3JtYXRpb25cbiAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDNmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgJ21hdCcpLCBmYWxzZSwgbmV3IEZsb2F0MzJBcnJheSh0cmFuc2ZvTWF0KSlcblxuICAgICAgICAvLyBFbmFibGUgdGhlIGRlcHRoIHRlc3RcbiAgICAgICAgLy9nbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgICAgIC8vIENsZWFyIHRoZSBjb2xvciBidWZmZXIgYml0XG4gICAgICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQpXG4gICAgICAgIC8vIFNldCB0aGUgdmlldyBwb3J0XG4gICAgICAgIC8vZ2wudmlld3BvcnQoMCwgMCwgY2cudywgY2cuaCk7XG5cbiAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5QT0lOVFMsIDAsIHZlcnRpY2VzQnVmZmVyLmxlbmd0aCAvIDIpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBleHRlbnQsIG1heCB9IGZyb20gJ2QzLWFycmF5J1xuaW1wb3J0IHsgc2NhbGVRdWFudGlsZSB9IGZyb20gJ2QzLXNjYWxlJ1xuXG4vKipcbiAqIEEgc2NhbGUgaXMgc2ltcGx5IGEgZnVuY3Rpb24gdGhhdCBtYXAgYSBkb21haW4gdG8gYSByYW5nZS5cbiAqIEB0eXBlZGVmIHtmdW5jdGlvbihudW1iZXIpOm51bWJlcn0gU2NhbGUgKi9cblxuLyoqXG4gKiBBIHNjYWxlIHdob3NlIHJhbmdlIGlzIGEgY29sb3IgKHN0cmluZykuXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmd9IENvbG9yU2NhbGUgKi9cblxuLyoqXG4gKiBAbW9kdWxlIHV0aWxzXG4gKi9cblxuLyoqXG4gKiBHZW5lcmljIGZ1bmN0aW9uIGZvciB2aWV3IHNjYWxlIC0gY29udGludW91cyBvciBkaXNjcmV0ZVxuICpcbiAqIEBwYXJhbSB7eyB2YWx1ZUZ1bmN0aW9uOmZ1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsKTpudW1iZXIsIG1pblZhbHVlPzpudW1iZXIsIG1pblNpemVQaXg/Om51bWJlciwgbWF4U2l6ZUZhY3Rvcj86bnVtYmVyLCByYW5nZT86W251bWJlciwgbnVtYmVyXSwgZG9tYWluPzpbbnVtYmVyLCBudW1iZXJdLCBzdHJldGNoaW5nPzpmdW5jdGlvbihudW1iZXIpOm51bWJlciwgY2xhc3NOdW1iZXI/Om51bWJlcn19IG9wdHNcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+KTpTY2FsZX1cbiAqL1xuZXhwb3J0IGNvbnN0IHZpZXdTY2FsZSA9IChvcHRzKSA9PiB7XG4gICAgY29uc3QgdmFsdWVGdW5jdGlvbiA9IG9wdHMudmFsdWVGdW5jdGlvblxuICAgIGNvbnN0IG1pblZhbHVlID0gb3B0cy5taW5WYWx1ZSB8fCAwXG4gICAgY29uc3QgbWluU2l6ZVBpeCA9IG9wdHMubWluU2l6ZVBpeCB8fCAwXG4gICAgY29uc3QgbWF4U2l6ZUZhY3RvciA9IG9wdHMubWF4U2l6ZUZhY3RvciB8fCAxXG4gICAgY29uc3Qgc3RyZXRjaGluZyA9IG9wdHMuc3RyZXRjaGluZ1xuICAgIGNvbnN0IHJhbmdlXyA9IG9wdHMucmFuZ2VcbiAgICBjb25zdCBkb21haW5fID0gb3B0cy5kb21haW5cbiAgICBjb25zdCBjbGFzc051bWJlciA9IG9wdHMuY2xhc3NOdW1iZXJcbiAgICByZXR1cm4gKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA9PiB7XG4gICAgICAgIGNvbnN0IGRvbWFpbiA9IGRvbWFpbl8gfHwgW21pblZhbHVlLCBtYXgoY2VsbHMsIHZhbHVlRnVuY3Rpb24pXVxuICAgICAgICBjb25zdCByYW5nZSA9IHJhbmdlXyB8fCBbbWluU2l6ZVBpeCAqIHosIHJlc29sdXRpb24gKiBtYXhTaXplRmFjdG9yXVxuICAgICAgICBjb25zdCBkb21haW5TaXplID0gZG9tYWluWzFdIC0gZG9tYWluWzBdLFxuICAgICAgICAgICAgZG9tYWluTWluID0gZG9tYWluWzBdXG4gICAgICAgIGNvbnN0IHJhbmdlU2l6ZSA9IHJhbmdlWzFdIC0gcmFuZ2VbMF0sXG4gICAgICAgICAgICByYW5nZU1pbiA9IHJhbmdlWzBdXG4gICAgICAgIHJldHVybiAodCkgPT4ge1xuICAgICAgICAgICAgLy9zY2FsZSB0byBbMCwxXVxuICAgICAgICAgICAgdCA9ICh0IC0gZG9tYWluTWluKSAvIGRvbWFpblNpemVcbiAgICAgICAgICAgIC8vc3RyZXRjaFxuICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcpIHQgPSBzdHJldGNoaW5nKHQpXG4gICAgICAgICAgICAvL2NsYXNzaWZ5XG4gICAgICAgICAgICBpZiAoY2xhc3NOdW1iZXIpIHQgPSB0ID09IDEgPyAxIDogTWF0aC5mbG9vcih0ICogY2xhc3NOdW1iZXIpIC8gKGNsYXNzTnVtYmVyIC0gMSlcbiAgICAgICAgICAgIC8vc2NhbGUgdG8gcmFuZ2VcbiAgICAgICAgICAgIHJldHVybiByYW5nZU1pbiArIHQgKiByYW5nZVNpemVcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBHZW5lcmljIGZ1bmN0aW9uIGZvciB2aWV3IHNjYWxlIC0gcXVhbnRpbGVcbiAqXG4gKiBAcGFyYW0ge3sgdmFsdWVGdW5jdGlvbjpmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbCk6bnVtYmVyLCBjbGFzc051bWJlcj86bnVtYmVyLCBtaW5TaXplUGl4PzpudW1iZXIsIG1heFNpemVGYWN0b3I/Om51bWJlciB9fSBvcHRzXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oQXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPik6U2NhbGV9XG4gKi9cbmV4cG9ydCBjb25zdCB2aWV3U2NhbGVRdWFudGlsZSA9IChvcHRzKSA9PiB7XG4gICAgY29uc3QgdmFsdWVGdW5jdGlvbiA9IG9wdHMudmFsdWVGdW5jdGlvblxuICAgIGNvbnN0IGNsYXNzTnVtYmVyID0gb3B0cy5jbGFzc051bWJlciB8fCAxMlxuICAgIGNvbnN0IG1pblNpemVQaXggPSBvcHRzLm1pblNpemVQaXggfHwgMVxuICAgIGNvbnN0IG1heFNpemVGYWN0b3IgPSBvcHRzLm1heFNpemVGYWN0b3IgfHwgMVxuICAgIGNvbnN0IHNjYWxlID0gc2NhbGVRdWFudGlsZSgpXG4gICAgcmV0dXJuIChjZWxscywgcmVzb2x1dGlvbiwgeikgPT4ge1xuICAgICAgICBzY2FsZS5kb21haW4oY2VsbHMubWFwKHZhbHVlRnVuY3Rpb24pKVxuICAgICAgICBjb25zdCBtaW5TaXplR2VvID0gbWluU2l6ZVBpeCAqIHosXG4gICAgICAgICAgICBtYXhTaXplR2VvID0gcmVzb2x1dGlvbiAqIG1heFNpemVGYWN0b3JcbiAgICAgICAgc2NhbGUucmFuZ2UoXG4gICAgICAgICAgICBBcnJheS5mcm9tKFxuICAgICAgICAgICAgICAgIHsgbGVuZ3RoOiBjbGFzc051bWJlciB9LFxuICAgICAgICAgICAgICAgIChfLCBpKSA9PiBtaW5TaXplR2VvICsgKGkgKiAobWF4U2l6ZUdlbyAtIG1pblNpemVHZW8pKSAvIChjbGFzc051bWJlciAtIDEpXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgc2NhbGUuYnJlYWtzID0gc2NhbGUucXVhbnRpbGVzKClcbiAgICAgICAgc2NhbGUudmFsdWVzID0gc2NhbGUucmFuZ2UoKVxuICAgICAgICByZXR1cm4gc2NhbGVcbiAgICB9XG59XG5cbi8qKlxuICogR2VuZXJpYyBmdW5jdGlvbiBmb3IgY29sb3IgdmlldyBzY2FsZSAtIGNvbnRpbnVvdXMgb3IgZGlzY3JldGVcbiAqXG4gKiBAcGFyYW0ge3sgdmFsdWVGdW5jdGlvbjpmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbCk6bnVtYmVyLCBjb2xvclNjYWxlPzpmdW5jdGlvbihudW1iZXIpOnN0cmluZywgY29sb3JzPzpBcnJheS48c3RyaW5nPiwgc3RyZXRjaGluZz86ZnVuY3Rpb24obnVtYmVyKTpudW1iZXIgfX0gb3B0c1xuICogQHJldHVybnMge2Z1bmN0aW9uKEFycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD4pOkNvbG9yU2NhbGV9XG4gKi9cbmV4cG9ydCBjb25zdCB2aWV3U2NhbGVDb2xvciA9IChvcHRzKSA9PiB7XG4gICAgY29uc3QgdmFsdWVGdW5jdGlvbiA9IG9wdHMudmFsdWVGdW5jdGlvblxuICAgIGNvbnN0IHN0cmV0Y2hpbmcgPSBvcHRzLnN0cmV0Y2hpbmdcbiAgICBsZXQgY29sb3JTY2FsZSA9IG9wdHMuY29sb3JTY2FsZSB8fCAoKCkgPT4gJ3B1cnBsZScpXG5cbiAgICAvL2Rpc2NyZXRlIGNvbG9ycyBjYXNlOiBidWlsZCBjb250aW51b3VzIGNvbG9yIHNjYWxlIGZyb20gZGlzY3JldGUgb25lcy5cbiAgICBjb25zdCBuYkNsYXNzID0gb3B0cy5jb2xvcnM/Lmxlbmd0aFxuICAgIGlmIChvcHRzLmNvbG9ycyAmJiBuYkNsYXNzKVxuICAgICAgICBjb2xvclNjYWxlID0gKHQpID0+IG9wdHMuY29sb3JzW3QgPT0gMSA/IG5iQ2xhc3MgLSAxIDogTWF0aC5mbG9vcih0ICogbmJDbGFzcyldXG5cbiAgICByZXR1cm4gKGNlbGxzKSA9PiB7XG4gICAgICAgIGlmIChjZWxscy5sZW5ndGggPT0gMCB8fCAhY2VsbHMpIHJldHVyblxuICAgICAgICAvKiogQHR5cGUge1t1bmRlZmluZWQsIHVuZGVmaW5lZF0gfCBbbnVtYmVyLCBudW1iZXJdfSAqL1xuICAgICAgICBjb25zdCBkb21haW4gPSBleHRlbnQoY2VsbHMsIHZhbHVlRnVuY3Rpb24pXG4gICAgICAgIGlmIChkb21haW5bMF0gPT0gdW5kZWZpbmVkKSByZXR1cm5cbiAgICAgICAgY29uc3QgZG9tYWluU2l6ZSA9IGRvbWFpblsxXSAtIGRvbWFpblswXVxuICAgICAgICBjb25zdCBzY2FsZSA9ICh0KSA9PiB7XG4gICAgICAgICAgICAvL3NjYWxlIHRvIFswLDFdXG4gICAgICAgICAgICB0ID0gKHQgLSBkb21haW5bMF0pIC8gZG9tYWluU2l6ZVxuICAgICAgICAgICAgLy9zdHJldGNoXG4gICAgICAgICAgICBpZiAoc3RyZXRjaGluZykgdCA9IHN0cmV0Y2hpbmcodClcbiAgICAgICAgICAgIHJldHVybiBjb2xvclNjYWxlKHQpXG4gICAgICAgIH1cbiAgICAgICAgLy9mdW5jdGlvbiB0aGF0IHJldHVybiB0aGUgZG9tYWluIHZhbHVlIGZyb20gdGhlIFswLDFdIHJhbmdlLlxuICAgICAgICBzY2FsZS5pbnZlcnQgPSAodCkgPT4ge1xuICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcpIHQgPSBzdHJldGNoaW5nLmludmVydCh0KVxuICAgICAgICAgICAgcmV0dXJuIGRvbWFpblswXSArIHQgKiBkb21haW5TaXplXG4gICAgICAgIH1cbiAgICAgICAgLy9kaXNjcmV0ZSBjb2xvcnM6IHJldHVybiB0aGUgYnJlYWtzXG4gICAgICAgIGlmIChvcHRzLmNvbG9ycyAmJiBuYkNsYXNzKSB7XG4gICAgICAgICAgICBzY2FsZS5icmVha3MgPSBbXVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBuYkNsYXNzOyBpKyspIHNjYWxlLmJyZWFrcy5wdXNoKHNjYWxlLmludmVydChpIC8gbmJDbGFzcykpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2NhbGVcbiAgICB9XG59XG5cbi8qKlxuICogR2VuZXJpYyBmdW5jdGlvbiBmb3IgY29sb3IgdmlldyBzY2FsZSAtIHF1YW50aWxlXG4gKlxuICogQHBhcmFtIHt7IHZhbHVlRnVuY3Rpb246ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGwpOm51bWJlciwgY2xhc3NOdW1iZXI/Om51bWJlciwgY29sb3JzPzpBcnJheS48c3RyaW5nPiwgY29sb3JTY2FsZT86ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmcgfX0gb3B0c1xuICogQHJldHVybnMge2Z1bmN0aW9uKEFycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD4pOkNvbG9yU2NhbGV9XG4gKi9cbmV4cG9ydCBjb25zdCB2aWV3U2NhbGVDb2xvclF1YW50aWxlID0gKG9wdHMpID0+IHtcbiAgICBjb25zdCB2YWx1ZUZ1bmN0aW9uID0gb3B0cy52YWx1ZUZ1bmN0aW9uXG4gICAgY29uc3QgY2xhc3NOdW1iZXIgPSBvcHRzLmNsYXNzTnVtYmVyIHx8IDEyXG5cbiAgICBsZXQgY29sb3JzID0gb3B0cy5jb2xvcnNcbiAgICBpZiAob3B0cy5jb2xvclNjYWxlKSBjb2xvcnMgPSBkaXNjcmV0ZUNvbG9ycyhvcHRzLmNvbG9yU2NhbGUsIGNsYXNzTnVtYmVyKVxuICAgIGNvbG9ycyA9XG4gICAgICAgIGNvbG9ycyB8fFxuICAgICAgICBBcnJheS5mcm9tKFxuICAgICAgICAgICAgeyBsZW5ndGg6IGNsYXNzTnVtYmVyIH0sXG4gICAgICAgICAgICAoXywgaSkgPT4gJ3JnYignICsgTWF0aC5mbG9vcigoMjU1ICogaSkgLyAoY2xhc3NOdW1iZXIgLSAxKSkgKyAnLDE1MCwxNTApJ1xuICAgICAgICApXG5cbiAgICBjb25zdCBzY2FsZSA9IHNjYWxlUXVhbnRpbGUoKS5yYW5nZShjb2xvcnMpXG4gICAgcmV0dXJuIChjZWxscykgPT4ge1xuICAgICAgICBzY2FsZS5kb21haW4oY2VsbHMubWFwKHZhbHVlRnVuY3Rpb24pKVxuICAgICAgICBzY2FsZS5icmVha3MgPSBzY2FsZS5xdWFudGlsZXMoKVxuICAgICAgICBzY2FsZS5jb2xvcnMgPSBjb2xvcnNcbiAgICAgICAgcmV0dXJuIHNjYWxlXG4gICAgfVxufVxuXG4vKipcbiAqIENvbWJpbmUgdmlldyBzY2FsZSBmdW5jdGlvbnNcbiAqXG4gKiBAcGFyYW0geyp9IG9ialxuICogQHJldHVybnMge2Z1bmN0aW9ufVxuICovXG5leHBvcnQgY29uc3Qgdmlld1NjYWxlQ29tYmluYXRpb24gPSAob2JqKSA9PiB7XG4gICAgLy9vYmo6IHByb3AgYW5kIGEgZnVuY3Rpb24gdG8gY2FsbFxuICAgIHJldHVybiAoY2VsbHMsIHJlc29sdXRpb24sIHopID0+IHtcbiAgICAgICAgY29uc3Qgb3V0ID0ge31cbiAgICAgICAgZm9yIChjb25zdCBwIGluIG9iaikge1xuICAgICAgICAgICAgb3V0W3BdID0gb2JqW3BdKGNlbGxzLCByZXNvbHV0aW9uLCB6KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRcbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJuIGEgY2xhc3NpZmllciBmdW5jdGlvbiBmcm9tIGJyZWFrIHZhbHVlcy5cbiAqIFRoZSBjbGFzc2lmaWVyIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNsYXNzIGlkIChmcm9tIDAgdG8gYnJlYWtzLmxlbmd0aCkgZnJvbSBhIHZhbHVlIHRvIGNsYXNzaWZpeS5cbiAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IGJyZWFrcyB0aGUgYnJlYWtzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmaWVyKGJyZWFrcykge1xuICAgIGNvbnN0IGJsID0gYnJlYWtzLmxlbmd0aFxuICAgIGNvbnN0IGNsYXNzaWZpZXIgPSAodmFsdWUpID0+IHtcbiAgICAgICAgbGV0IGkgPSAwXG4gICAgICAgIHdoaWxlIChpIDwgYmwpIHtcbiAgICAgICAgICAgIGNvbnN0IGJyZWFrXyA9IGJyZWFrc1tpXVxuICAgICAgICAgICAgaWYgKHZhbHVlIDw9IGJyZWFrXykgcmV0dXJuIGlcbiAgICAgICAgICAgIGkrK1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpXG4gICAgfVxuICAgIGNsYXNzaWZpZXIuYnJlYWtzID0gYnJlYWtzXG4gICAgcmV0dXJuIGNsYXNzaWZpZXJcbn1cblxuLyoqXG4gKiBSZXR1cm4gYSBjb2xvciBjbGFzc2lmaWVyIGZ1bmN0aW9uIGZyb20gYnJlYWsgdmFsdWVzLlxuICogVGhlIGNsYXNzaWZpZXIgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29sb3IgZnJvbSBhIHZhbHVlIHRvIGNsYXNzaWZpeS5cbiAqIFRoZXJlIHNob3VsZCBiZSBvbmUgY29sb3IgbW9yZSB0aGFuIGJyZWFrIHZhbHVlcy5cbiAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IGJyZWFrcyB0aGUgYnJlYWtzXG4gKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+fSBjb2xvcnMgdGhlIGNvbG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29sb3JDbGFzc2lmaWVyKGJyZWFrcywgY29sb3JzKSB7XG4gICAgY29uc3QgY2xhc3NpZmllcl8gPSBjbGFzc2lmaWVyKGJyZWFrcylcbiAgICBjb25zdCBjb2xvckNsYXNzaWZpZXIgPSAodmFsdWUpID0+IGNvbG9yc1tjbGFzc2lmaWVyXyh2YWx1ZSldXG4gICAgY29sb3JDbGFzc2lmaWVyLmJyZWFrcyA9IGJyZWFrc1xuICAgIGNvbG9yQ2xhc3NpZmllci5jb2xvcnMgPSBjb2xvcnNcbiAgICByZXR1cm4gY29sb3JDbGFzc2lmaWVyXG59XG5cbi8qKlxuICogTWFrZSBhcnJheSBvZiBjb2xvcnMgZnJvbSBhIGNvbG9yU2NhbGUuXG4gKiBJdCBpcyBhIGtpbmQgb2Ygc2FtcGxpbmcsIG9yIHVuLWludGVycG9sYXRpb25cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6c3RyaW5nfSBjb2xvclNjYWxlXG4gKiBAcGFyYW0ge251bWJlcn0gbmJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc2NyZXRlQ29sb3JzKGNvbG9yU2NhbGUsIG5iKSB7XG4gICAgaWYgKG5iID09IDEpIHJldHVybiBbY29sb3JTY2FsZSgwLjUpXVxuICAgIGNvbnN0IG91dCA9IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKSBvdXQucHVzaChjb2xvclNjYWxlKGkgLyAobmIgLSAxKSkpXG4gICAgcmV0dXJuIG91dFxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIEBtb2R1bGUgdXRpbHNcbiAqL1xuXG4vL1RPRE8gaW52ZXJ0IGZvciBjaXJjdWxhclxuLy9UT0RPIHVzZSBNYXRoLnNxcnRcbi8vVE9ETyB2YWxpZGF0ZVxuXG4vKipcbiAqIFNvbWUgZnVuY3Rpb24gWzAsMV0tPlswLDFdIHRvIHN0cmV0Y2ggcmFuZ2Ugb2YgdmFsdWVzLlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vZXVyb3N0YXQvZ3JpZHZpei9ibG9iL21hc3Rlci9kb2NzL3JlZmVyZW5jZS5tZCNzdHJldGNoaW5nXG4gKiBAc2VlIGh0dHBzOi8vb2JzZXJ2YWJsZWhxLmNvbS9AamdhZmZ1cmkvc3RyZXRjaGluZ1xuICovXG5cbi8vaWRlbnRpdHkgZnVuY3Rpb25cbmNvbnN0IGlkZW50aXR5ID0gKHQpID0+IHRcbmlkZW50aXR5LmludmVydCA9IGlkZW50aXR5XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGJhc2VcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihudW1iZXIpOm51bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IGV4cG9uZW50aWFsU2NhbGUgPSAoYmFzZSA9IDMpID0+IHtcbiAgICBpZiAoYmFzZSA9PSAwKSByZXR1cm4gaWRlbnRpdHlcbiAgICBjb25zdCBhID0gTWF0aC5leHAoYmFzZSkgLSAxXG4gICAgY29uc3QgZiA9ICh0KSA9PiAoTWF0aC5leHAodCAqIGJhc2UpIC0gMSkgLyBhXG4gICAgZi5pbnZlcnQgPSAodCkgPT4gTWF0aC5sb2coYSAqIHQgKyAxKSAvIGJhc2VcbiAgICByZXR1cm4gZlxufVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBiYXNlXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBsb2dhcml0aG1pY1NjYWxlID0gKGJhc2UgPSAzKSA9PiB7XG4gICAgaWYgKGJhc2UgPT0gMCkgcmV0dXJuIGlkZW50aXR5XG4gICAgY29uc3QgYSA9IE1hdGguZXhwKGJhc2UpLFxuICAgICAgICBiID0gMSAtIGFcbiAgICBjb25zdCBmID0gKHQpID0+IDEgLSBNYXRoLmxvZyhhICsgdCAqIGIpIC8gYmFzZVxuICAgIGYuaW52ZXJ0ID0gKHQpID0+IChNYXRoLmV4cCgoMSAtIHQpICogYmFzZSkgLSBhKSAvIGJcbiAgICByZXR1cm4gZlxufVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBleHBvbmVudFxuICogQHJldHVybnMge2Z1bmN0aW9uKG51bWJlcik6bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgcG93ZXJTY2FsZSA9IChleHBvbmVudCA9IDMpID0+IHtcbiAgICBpZiAoZXhwb25lbnQgPT0gMSkgcmV0dXJuIGlkZW50aXR5XG4gICAgLy9UT0RPIGlmIChleHBvbmVudCA9PSAwLjUpIHJldHVybiBNYXRoLnNxcnRcbiAgICBjb25zdCBmID0gKHQpID0+IE1hdGgucG93KHQsIGV4cG9uZW50KVxuICAgIGNvbnN0IGEgPSAxIC8gZXhwb25lbnRcbiAgICBmLmludmVydCA9ICh0KSA9PiBNYXRoLnBvdyh0LCBhKVxuICAgIHJldHVybiBmXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGV4cG9uZW50XG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBwb3dlckludmVyc2VTY2FsZSA9IChleHBvbmVudCA9IDMpID0+IHtcbiAgICBpZiAoZXhwb25lbnQgPT0gMSkgcmV0dXJuIGlkZW50aXR5XG4gICAgLy9UT0RPIGlmIChleHBvbmVudCA9PSAyKSByZXR1cm4gdCA9PiAxIC0gTWF0aC5zcXJ0KDEgLSB0KVxuICAgIGNvbnN0IGEgPSAxIC8gZXhwb25lbnRcbiAgICBjb25zdCBmID0gKHQpID0+IDEgLSBNYXRoLnBvdygxIC0gdCwgYSlcbiAgICBmLmludmVydCA9ICh0KSA9PiAxIC0gTWF0aC5wb3coMSAtIHQsIGV4cG9uZW50KVxuICAgIHJldHVybiBmXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGNpcmN1bGFyaXR5XG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBjaXJjdWxhclNjYWxlID0gKGNpcmN1bGFyaXR5ID0gMC44KSA9PiB7XG4gICAgaWYgKGNpcmN1bGFyaXR5ID09IDApIHJldHVybiBpZGVudGl0eVxuICAgIGlmIChjaXJjdWxhcml0eSA9PSAxKSByZXR1cm4gKHQpID0+IE1hdGguc3FydCh0ICogKDIgLSB0KSlcbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgYSA9IGNpcmN1bGFyaXR5IC8gKDEgLSBjaXJjdWxhcml0eSlcbiAgICAgICAgcmV0dXJuICh0KSA9PiBNYXRoLnNxcnQoMSAvIChhICogYSkgKyB0ICogKDIgLyBhICsgMiAtIHQpKSAtIDEgLyBhXG4gICAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBjaXJjdWxhcml0eVxuICogQHJldHVybnMge2Z1bmN0aW9uKG51bWJlcik6bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgY2lyY3VsYXJJbnZlcnNlU2NhbGUgPSAoY2lyY3VsYXJpdHkgPSAwLjgpID0+IHtcbiAgICBpZiAoY2lyY3VsYXJpdHkgPT0gMCkgcmV0dXJuIGlkZW50aXR5XG4gICAgY29uc3QgZiA9IGNpcmN1bGFyU2NhbGUoY2lyY3VsYXJpdHkpXG4gICAgcmV0dXJuICh0KSA9PiAxIC0gZigxIC0gdClcbn1cblxuLy90ZXN0XG4vKlxuY29uc3QgdGVzdCA9IChmLCBmdW4sIGEsIGVyciA9IDFlLTEyKSA9PiB7XG4gICAgZm9yIChsZXQgdCA9IDA7IHQgPD0gMTsgdCArPSAxIC8gNTApIHtcbiAgICAgICAgY29uc3QgZXIgPSB0IC0gZi5pbnZlcnQoZih0KSlcbiAgICAgICAgaWYgKE1hdGguYWJzKGVyKSA8IGVycikgY29udGludWVcbiAgICAgICAgY29uc29sZS5sb2coZnVuLCBhLCBlcilcbiAgICB9XG59XG5cbmZvciAobGV0IGZ1biBvZiBbcG93ZXJTY2FsZSwgcG93ZXJJbnZlcnNlU2NhbGVdKVxuICAgIGZvciAobGV0IGV4cCA9IC0zMDsgZXhwIDw9IDUwOyBleHAgKz0gMSkge1xuICAgICAgICBpZiAoZXhwID09IDApIGNvbnRpbnVlXG4gICAgICAgIGNvbnN0IGYgPSBmdW4oZXhwKVxuICAgICAgICB0ZXN0KGYsIGZ1biwgZXhwKVxuICAgIH1cblxuXG5mb3IgKGxldCBmdW4gb2YgW2V4cG9uZW50aWFsU2NhbGUsIGxvZ2FyaXRobWljU2NhbGVdKVxuICAgIGZvciAobGV0IGJhc2UgPSAtMjA7IGJhc2UgPD0gMjA7IGJhc2UgKz0gMSkge1xuICAgICAgICAvL2lmIChleHAgPT0gMCkgY29udGludWVcbiAgICAgICAgY29uc3QgZiA9IGZ1bihiYXNlKVxuICAgICAgICB0ZXN0KGYsIGZ1biwgYmFzZSwgMWUtMTApXG4gICAgfVxuKi9cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgaW50ZXJwb2xhdGVMYWIgfSBmcm9tICdkMy1pbnRlcnBvbGF0ZSdcblxuZXhwb3J0IGNvbnN0IHRlcm5hcnlDbGFzc2lmaWVyID0gKHByb3BlcnRpZXMsIHRvdGFsRnVuY3Rpb24sIG9wdHMgPSB7fSkgPT4ge1xuICAgIC8vdGhlIHRocmVlIHByb3BlcnRpZXNcbiAgICBjb25zdCBwMCA9IHByb3BlcnRpZXNbMF0sXG4gICAgICAgIHAxID0gcHJvcGVydGllc1sxXSxcbiAgICAgICAgcDIgPSBwcm9wZXJ0aWVzWzJdXG5cbiAgICAvL3RoZSBjbGFzc2lmaWVyIGNlbnRlciBwb2ludC4gc3VtIG11c3QgYmUgZXF1YWwgdG8gMVxuICAgIGNvbnN0IFtjMCwgYzEsIGMyXSA9IG9wdHMuY2VudGVyIHx8IFsxIC8gMywgMSAvIDMsIDEgLyAzXVxuXG4gICAgLy9wYXJhbWV0ZXIgdG8gZGVjaWRlIHdldGhlciB0byB1c2UgbWl4ZWQgY2xhc3NlcyBtMCwgbTEsIG0yLlxuICAgIGNvbnN0IHdpdGhNaXhlZENsYXNzZXMgPSBvcHRzLndpdGhNaXhlZENsYXNzZXMgIT0gdW5kZWZpbmVkID8gb3B0cy53aXRoTWl4ZWRDbGFzc2VzIDogdHJ1ZVxuXG4gICAgLy9wYXJhbWV0ZXIgdG8gZGVjaWRlIHdldGhlciB0byB1c2UgYSBjZW50cmFsIGNsYXNzLCBhbmQgdGhlIHNpemUgb2YgdGhpcyBjZW50cmFsIGNsYXNzLlxuICAgIC8vc2V0IHRvIDAgb3IgdW5kZWZpbmVkIGZvciBub3Qgc2hvd2luZyBhbnkgY2VudHJhbCBjbGFzcy4gU2V0IHRvIDEgZm9yIGEgY2VudHJhbCBjbGFzcyB0aGF0IGNvbnRhaW5zIHRoZSBtaXggY2xhc3Nlc1xuICAgIGNvbnN0IGNjID0gb3B0cy5jZW50ZXJDb2VmZmljaWVudCA/IDEgLSBvcHRzLmNlbnRlckNvZWZmaWNpZW50IDogdW5kZWZpbmVkXG5cbiAgICAvL3RoZSBvdXRwdXQgY2xhc3NpZmllciBtZXRob2RcbiAgICBjb25zdCBmdW4gPSAoYykgPT4ge1xuICAgICAgICAvL2dldCB0b3RhbFxuICAgICAgICBjb25zdCB0b3QgPSB0b3RhbEZ1bmN0aW9uKGMpXG4gICAgICAgIGlmICghdG90KSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIC8vY29tcHV0ZSBzaGFyZXNcbiAgICAgICAgY29uc3QgW3MwLCBzMSwgczJdID0gWytjW3AwXSAvIHRvdCwgK2NbcDFdIC8gdG90LCArY1twMl0gLyB0b3RdXG5cbiAgICAgICAgLy9jbGFzcyAwXG4gICAgICAgIGlmIChzMCA+PSBjMCAmJiBzMSA8PSBjMSAmJiBzMiA8PSBjMikge1xuICAgICAgICAgICAgLy9jZW50cmFsIGNsYXNzIG5lYXIgY2xhc3MgMFxuICAgICAgICAgICAgaWYgKGNjICE9IHVuZGVmaW5lZCAmJiAoczIgLSBjMikgKiAoYzEgLSBjYyAqIGMxKSA+PSAoczEgLSBjYyAqIGMxKSAqIChjYyAqIGMyIC0gYzIpKVxuICAgICAgICAgICAgICAgIHJldHVybiAnY2VudGVyJ1xuICAgICAgICAgICAgcmV0dXJuICcwJ1xuICAgICAgICB9XG4gICAgICAgIC8vY2xhc3MgMVxuICAgICAgICBpZiAoczAgPD0gYzAgJiYgczEgPj0gYzEgJiYgczIgPD0gYzIpIHtcbiAgICAgICAgICAgIC8vY2VudHJhbCBjbGFzcyBuZWFyIGNsYXNzIDFcbiAgICAgICAgICAgIGlmIChjYyAhPSB1bmRlZmluZWQgJiYgKHMyIC0gYzIpICogKGMwIC0gY2MgKiBjMCkgPj0gKHMwIC0gY2MgKiBjMCkgKiAoY2MgKiBjMiAtIGMyKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NlbnRlcidcbiAgICAgICAgICAgIHJldHVybiAnMSdcbiAgICAgICAgfVxuICAgICAgICAvL2NsYXNzIDJcbiAgICAgICAgaWYgKHMwIDw9IGMwICYmIHMxIDw9IGMxICYmIHMyID49IGMyKSB7XG4gICAgICAgICAgICAvL2NlbnRyYWwgY2xhc3MgbmVhciBjbGFzcyAyXG4gICAgICAgICAgICBpZiAoY2MgIT0gdW5kZWZpbmVkICYmIChzMSAtIGMxKSAqIChjMCAtIGNjICogYzApID49IChzMCAtIGNjICogYzApICogKGNjICogYzEgLSBjMSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuICdjZW50ZXInXG4gICAgICAgICAgICByZXR1cm4gJzInXG4gICAgICAgIH1cbiAgICAgICAgLy9taWRkbGUgY2xhc3MgMCAtIGludGVyc2VjdGlvbiBjbGFzcyAxIGFuZCAyXG4gICAgICAgIGlmIChzMCA8PSBjMCAmJiBzMSA+PSBjMSAmJiBzMiA+PSBjMikge1xuICAgICAgICAgICAgLy9jZW50cmFsIGNsYXNzXG4gICAgICAgICAgICBpZiAoY2MgIT0gdW5kZWZpbmVkICYmIHMwID4gY2MgKiBjMCkgcmV0dXJuICdjZW50ZXInXG4gICAgICAgICAgICBpZiAod2l0aE1peGVkQ2xhc3NlcykgcmV0dXJuICdtMTInXG4gICAgICAgICAgICByZXR1cm4gczEgPiBzMiA/ICcxJyA6ICcyJ1xuICAgICAgICB9XG4gICAgICAgIC8vbWlkZGxlIGNsYXNzIDEgLSBpbnRlcnNlY3Rpb24gY2xhc3MgMCBhbmQgMVxuICAgICAgICBpZiAoczAgPj0gYzAgJiYgczEgPD0gYzEgJiYgczIgPj0gYzIpIHtcbiAgICAgICAgICAgIC8vY2VudHJhbCBjbGFzc1xuICAgICAgICAgICAgaWYgKGNjICE9IHVuZGVmaW5lZCAmJiBzMSA+IGNjICogYzEpIHJldHVybiAnY2VudGVyJ1xuICAgICAgICAgICAgaWYgKHdpdGhNaXhlZENsYXNzZXMpIHJldHVybiAnbTAyJ1xuICAgICAgICAgICAgcmV0dXJuIHMwID4gczIgPyAnMCcgOiAnMidcbiAgICAgICAgfVxuICAgICAgICAvL21pZGRsZSBjbGFzcyAyIC0gaW50ZXJzZWN0aW9uIGNsYXNzIDAgYW5kIDFcbiAgICAgICAgaWYgKHMwID49IGMwICYmIHMxID49IGMxICYmIHMyIDw9IGMyKSB7XG4gICAgICAgICAgICAvL2NlbnRyYWwgY2xhc3NcbiAgICAgICAgICAgIGlmIChjYyAhPSB1bmRlZmluZWQgJiYgczIgPiBjYyAqIGMyKSByZXR1cm4gJ2NlbnRlcidcbiAgICAgICAgICAgIGlmICh3aXRoTWl4ZWRDbGFzc2VzKSByZXR1cm4gJ20wMSdcbiAgICAgICAgICAgIHJldHVybiBzMSA+IHMwID8gJzEnIDogJzAnXG4gICAgICAgIH1cbiAgICAgICAgLy9zaG91bGQgbm90IGhhcHBlblxuICAgICAgICByZXR1cm4gJ3Vua25vd24nXG4gICAgfVxuXG4gICAgLy9hdHRhY2ggaW5mb3JtYXRpb24gdG8gb3V0cHV0IGZ1bmN0aW9uXG4gICAgZnVuLmNlbnRlciA9IFtjMCwgYzEsIGMyXVxuICAgIGZ1bi5jZW50ZXJDb2VmZmljaWVudCA9IG9wdHMuY2VudGVyQ29lZmZpY2llbnRcblxuICAgIHJldHVybiBmdW5cbn1cblxuZXhwb3J0IGNvbnN0IHRlcm5hcnlDb2xvckNsYXNzaWZpZXIgPSAocHJvcGVydGllcywgdG90YWxGdW5jdGlvbiwgY29sb3JzLCBvcHRzID0ge30pID0+IHtcbiAgICAvL3RoZSB0aHJlZSBjb2xvcnNcbiAgICBjb25zdCBbY29sb3IwLCBjb2xvcjEsIGNvbG9yMl0gPSBjb2xvcnMgfHwgWydyZWQnLCAnZ3JlZW4nLCAnYmx1ZSddXG5cbiAgICAvL3RoZSBjb2xvciBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uXG4gICAgY29uc3QgY29sb3JJbnRlcnBvbGF0aW9uID0gb3B0cy5jb2xvckludGVycG9sYXRpb24gfHwgaW50ZXJwb2xhdGVMYWJcblxuICAgIC8vcGFyYW1ldGVyIHRvIGRlY2lkZSB3ZXRoZXIgdG8gdXNlIG1peGVkIGNsYXNzZXMuXG4gICAgY29uc3Qgd2l0aE1peGVkQ2xhc3NlcyA9IG9wdHMud2l0aE1peGVkQ2xhc3NlcyAhPSB1bmRlZmluZWQgPyBvcHRzLndpdGhNaXhlZENsYXNzZXMgOiB0cnVlXG4gICAgLy9odHRwczovL2QzanMub3JnL2QzLWludGVycG9sYXRlL2NvbG9yXG4gICAgY29uc3QgbWl4Q29sb3JGdW5jdGlvbiA9IChjb2xvcjEsIGNvbG9yMikgPT4gY29sb3JJbnRlcnBvbGF0aW9uKGNvbG9yMSwgY29sb3IyKSgwLjUpXG4gICAgLy90aGUgY29sb3JzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1peGVkIGNsYXNzZXNcbiAgICBjb25zdCBbbWl4Q29sb3IwLCBtaXhDb2xvcjEsIG1peENvbG9yMl0gPVxuICAgICAgICBvcHRzLm1peGVkQ29sb3JzIHx8IHdpdGhNaXhlZENsYXNzZXNcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgbWl4Q29sb3JGdW5jdGlvbihjb2xvcjEsIGNvbG9yMiksXG4gICAgICAgICAgICAgICAgICBtaXhDb2xvckZ1bmN0aW9uKGNvbG9yMCwgY29sb3IyKSxcbiAgICAgICAgICAgICAgICAgIG1peENvbG9yRnVuY3Rpb24oY29sb3IwLCBjb2xvcjEpLFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICA6IFtdXG5cbiAgICAvL3RoZSBjZW50cmFsIGNvbG9yLCB1c2VkIGZvciB0aGUgY2VudHJhbCBjbGFzcywgaWYgYW55LiBUaGUgY2VudHJhbCBjbGFzcyBpcyB0aGUgY2xhc3Mgb2YgcmVsYXRpdmVseSBiYWxhbmNlZCB2YWx1ZXMsIGFyb3VuZCB0aGUgY2VudGVyIHBvaW50XG4gICAgY29uc3QgY2VudGVyQ29sb3IgPVxuICAgICAgICBvcHRzLmNlbnRlckNvbG9yIHx8IGNvbG9ySW50ZXJwb2xhdGlvbihtaXhDb2xvckZ1bmN0aW9uKGNvbG9yMCwgY29sb3IxKSwgY29sb3IyKSgwLjMzMylcblxuICAgIC8vbWFrZSBjbGFzc2lmaWVyXG4gICAgY29uc3QgY2xhc3NpZmllciA9IHRlcm5hcnlDbGFzc2lmaWVyKHByb3BlcnRpZXMsIHRvdGFsRnVuY3Rpb24sIG9wdHMpXG5cbiAgICAvL3RoZSBvdXRwdXQgY29sb3IgY2xhc3NpZmllciBtZXRob2RcbiAgICBjb25zdCBmdW4gPSAoYykgPT4ge1xuICAgICAgICBjb25zdCBjbGEgPSBjbGFzc2lmaWVyKGMpXG4gICAgICAgIGlmIChjbGEgPT0gJzAnKSByZXR1cm4gY29sb3IwXG4gICAgICAgIGlmIChjbGEgPT0gJzEnKSByZXR1cm4gY29sb3IxXG4gICAgICAgIGlmIChjbGEgPT0gJzInKSByZXR1cm4gY29sb3IyXG4gICAgICAgIGlmIChjbGEgPT0gJ20xMicpIHJldHVybiBtaXhDb2xvcjBcbiAgICAgICAgaWYgKGNsYSA9PSAnbTAyJykgcmV0dXJuIG1peENvbG9yMVxuICAgICAgICBpZiAoY2xhID09ICdtMDEnKSByZXR1cm4gbWl4Q29sb3IyXG4gICAgICAgIGlmIChjbGEgPT0gJ2NlbnRlcicpIHJldHVybiBjZW50ZXJDb2xvclxuICAgICAgICByZXR1cm4gb3B0cy5kZWZhdWx0Q29sb3IgfHwgJ2JsYWNrJ1xuICAgIH1cbiAgICBmdW4uY2VudGVyID0gY2xhc3NpZmllci5jZW50ZXJcbiAgICBmdW4uY2VudGVyQ29lZmZpY2llbnQgPSBvcHRzLmNlbnRlckNvZWZmaWNpZW50XG4gICAgZnVuLmNvbG9ycyA9IFtjb2xvcjAsIGNvbG9yMSwgY29sb3IyXVxuICAgIGZ1bi5taXhDb2xvcnMgPSBbbWl4Q29sb3IwLCBtaXhDb2xvcjEsIG1peENvbG9yMl1cbiAgICBmdW4uY2VudGVyQ29sb3IgPSBjZW50ZXJDb2xvclxuICAgIGZ1bi5jbGFzc2lmaWVyID0gY2xhc3NpZmllclxuXG4gICAgcmV0dXJuIGZ1blxufVxuXG5cblxuXG4vLyBPTEQgVkVSU0lPTlNcblxuLypcbmNvbnN0IG9yZGVyZWRJbmRleGVzRGVjID0gYXJyID0+IFsuLi5hcnIua2V5cygpXS5zb3J0KChhLCBiKSA9PiBhcnJbYl0gLSBhcnJbYV0pO1xuY29uc3Qgb3JkZXJlZEluZGV4ZXNJbmMgPSBhcnIgPT4gWy4uLmFyci5rZXlzKCldLnNvcnQoKGEsIGIpID0+IGFyclthXSAtIGFycltiXSk7XG5cbmV4cG9ydCBjb25zdCB0ZXJuYXJ5Q2xhc3NpZmllciA9IChwcm9wZXJ0aWVzLCB0b3RhbEZ1bmN0aW9uLCBvcHRzID0ge30pID0+IHtcbiAgICBjb25zdCBsb3dUaHJlc2hvbGQgPSBvcHRzLmxvd1RocmVzaG9sZCB8fCBbMSAvIDMsIDEgLyAzLCAxIC8gM11cbiAgICBjb25zdCBoaWdoVGhyZXNob2xkID0gb3B0cy5oaWdoVGhyZXNob2xkIHx8IFsyIC8gMywgMiAvIDMsIDIgLyAzXVxuICAgIGNvbnN0IGNvbG9ycyA9IG9wdHMuY29sb3JzIHx8IFtcInJlZFwiLCBcImdyZWVuXCIsIFwiYmx1ZVwiXVxuICAgIGNvbnN0IGNvbG9ySW50ZXJwb2xhdGlvbiA9IG9wdHMuY29sb3JJbnRlcnBvbGF0aW9uIHx8IGludGVycG9sYXRlTGFiXG5cbiAgICAvL2h0dHBzOi8vZDNqcy5vcmcvZDMtaW50ZXJwb2xhdGUvY29sb3JcbiAgICBjb25zdCBtaWRkbGVDb2xvckZ1bmN0aW9uID0gKGNvbG9yMSwgY29sb3IyKSA9PiBjb2xvckludGVycG9sYXRpb24oY29sb3IxLCBjb2xvcjIpKDAuNSlcbiAgICBjb25zdCBtaWRkbGVDb2xvcnMgPSBvcHRzLm1pZGRsZUNvbG9ycyB8fCBbbWlkZGxlQ29sb3JGdW5jdGlvbihjb2xvcnNbMV0sIGNvbG9yc1syXSksIG1pZGRsZUNvbG9yRnVuY3Rpb24oY29sb3JzWzBdLCBjb2xvcnNbMl0pLCBtaWRkbGVDb2xvckZ1bmN0aW9uKGNvbG9yc1swXSwgY29sb3JzWzFdKV1cbiAgICBjb25zdCBjZW50ZXJDb2xvciA9IG9wdHMuY2VudGVyQ29sb3IgfHwgY29sb3JJbnRlcnBvbGF0aW9uKG1pZGRsZUNvbG9yc1syXSwgY29sb3JzWzJdKSgwLjMzMylcblxuICAgIGNvbnN0IGhpZ2hfID0gb3JkZXJlZEluZGV4ZXNEZWMoaGlnaFRocmVzaG9sZClcbiAgICBjb25zdCBsb3dfID0gb3JkZXJlZEluZGV4ZXNJbmMobG93VGhyZXNob2xkKVxuXG4gICAgY29uc3QgcDAgPSBwcm9wZXJ0aWVzWzBdLCBwMSA9IHByb3BlcnRpZXNbMV0sIHAyID0gcHJvcGVydGllc1syXVxuICAgIGNvbnN0IGZ1biA9IGMgPT4ge1xuICAgICAgICAvL2dldCB0b3RhbFxuICAgICAgICBjb25zdCB0b3QgPSB0b3RhbEZ1bmN0aW9uKGMpXG4gICAgICAgIGlmICghdG90KSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIC8vY29tcHV0ZSBzaGFyZXNcbiAgICAgICAgY29uc3Qgc2hhcmVzID0gWytjW3AwXSAvIHRvdCwgK2NbcDFdIC8gdG90LCArY1twMl0gLyB0b3RdXG4gICAgICAgIC8vcmV0dXJuIGNvbG9yc1xuICAgICAgICAvL3N0YXJ0IGZpcnN0IHdpdGggdGhlIGV4dHJlbWUgaGlnaCAodHJpYW5nbGVzKTogZnJvbSB0aGUgbGFyZ2VyIHZhbHVlIChzbWFsbCB0cmlhbmdsZSkgdG8gdGhlIGxvd2VyIHZhbHVlIChsYXJnZSB0cmlhbmdsZSlcbiAgICAgICAgZm9yIChsZXQgaSBvZiBoaWdoXykgaWYgKHNoYXJlc1tpXSA+IGhpZ2hUaHJlc2hvbGRbaV0pIHJldHVybiBjb2xvcnNbaV1cbiAgICAgICAgLy90aGVuIGRyYXcgdGhlIGV4dHJlbWUgbG93ICh0cmFwZXppdW1zKTogZnJvbSB0aGUgbG93ZXIgdmFsdWUgKHNtYWxsIHRyYXBleml1bXMpIHRvIHRoZSBsYXJnZXIgdmFsdWVzIChsYXJnZSB0cmFwZXppdW0pXG4gICAgICAgIGZvciAobGV0IGkgb2YgbG93XykgaWYgKHNoYXJlc1tpXSA8IGxvd1RocmVzaG9sZFtpXSkgcmV0dXJuIG1pZGRsZUNvbG9yc1tpXVxuICAgICAgICAvL2Vsc2UgY2VudHJhbCBjb2xvclxuICAgICAgICByZXR1cm4gY2VudGVyQ29sb3JcbiAgICB9XG4gICAgZnVuLmxvd1RocmVzaG9sZCA9IGxvd1RocmVzaG9sZFxuICAgIGZ1bi5oaWdoVGhyZXNob2xkID0gaGlnaFRocmVzaG9sZFxuICAgIGZ1bi5jb2xvcnMgPSBjb2xvcnNcbiAgICBmdW4ubWlkZGxlQ29sb3JzID0gbWlkZGxlQ29sb3JzXG4gICAgZnVuLmNlbnRlckNvbG9yID0gY2VudGVyQ29sb3JcbiAgICBmdW4ubG93SW5kZXggPSBsb3dfXG4gICAgZnVuLmhpZ2hJbmRleCA9IGhpZ2hfXG4gICAgcmV0dXJuIGZ1blxufVxuKi9cblxuLypcbmV4cG9ydCBjb25zdCB0ZXJuYXJ5Q2xhc3NpZmllcjMgPSAocHJvcGVydGllcywgdG90YWxGdW5jdGlvbiwgb3B0cyA9IHt9KSA9PiB7XG4gICAgY29uc3QgW2EwMSwgYTEyLCBhMjBdID0gb3B0cy50aHJlc2hvbGRzIHx8IFsxLzMsIDEvMywgMS8zXVxuICAgIGNvbnN0IFtjMCwgYzEsIGMyXSA9IG9wdHMuY29sb3JzIHx8IFtcInJlZFwiLCBcImdyZWVuXCIsIFwiYmx1ZVwiXVxuICAgIGNvbnN0IGNlbnRlckNvbG9yID0gb3B0cy5jZW50ZXJDb2xvciB8fCBcImdyYXlcIlxuXG4gICAgY29uc3QgZmZmID0gYSA9PiBhID09IDEgPyBJbmZpbml0eSA6IGEgLyAoMSAtIGEpXG4gICAgY29uc3QgYzAxID0gZmZmKGEwMSksIGMxMiA9IGZmZihhMTIpLCBjMjAgPSBmZmYoYTIwKVxuXG4gICAgY29uc3QgcDAgPSBwcm9wZXJ0aWVzWzBdLCBwMSA9IHByb3BlcnRpZXNbMV0sIHAyID0gcHJvcGVydGllc1syXVxuICAgIGNvbnN0IGZ1biA9IGMgPT4ge1xuICAgICAgICAvL2dldCB0b3RhbFxuICAgICAgICBjb25zdCB0b3QgPSB0b3RhbEZ1bmN0aW9uKGMpXG4gICAgICAgIGlmICghdG90KSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIC8vY29tcHV0ZSBzaGFyZXNcbiAgICAgICAgY29uc3QgW3MwLCBzMSwgczJdID0gWytjW3AwXSAvIHRvdCwgK2NbcDFdIC8gdG90LCArY1twMl0gLyB0b3RdXG4gICAgICAgIC8vcmV0dXJuIGNvbG9yc1xuICAgICAgICBpZiAoczAgKiBjMDEgPiBzMSAmJiBzMCA+IHMyICogYzIwKSByZXR1cm4gYzBcbiAgICAgICAgZWxzZSBpZiAoczEgPiBzMCAqIGMwMSAmJiBzMSAqIGMxMiA+IHMyKSByZXR1cm4gYzFcbiAgICAgICAgZWxzZSBpZiAoczIgKiBjMjAgPiBzMCAmJiBzMiA+IHMxICogYzEyKSByZXR1cm4gYzJcbiAgICAgICAgZWxzZSByZXR1cm4gY2VudGVyQ29sb3JcbiAgICB9XG4gICAgZnVuLmNvbG9ycyA9IFtjMCwgYzEsIGMyXVxuICAgIGZ1bi5jZW50ZXJDb2xvciA9IGNlbnRlckNvbG9yXG4gICAgcmV0dXJuIGZ1blxufVxuKi9cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBHZXQgdGhlIGNsYXNzIGlkIGZyb20gYSB2YWx1ZSBhbmQgY2xhc3MgYnJlYWsgdmFsdWVzXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHYgdGhlIHZhbHVlXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSBicmVha3MgdGhlIGJyZWFrc1xuICogQHJldHVybnMgVGhlIGNsYXNzIGlkLCBmcm9tIDAgdG8gYnJlYWtzLmxlbmd0aFxuICogQGRlcHJlY2F0ZWQgdXNlIGdldENsYXNzaWZpZXIgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENsYXNzKHYsIGJyZWFrcykge1xuICAgIGlmICghYnJlYWtzKSByZXR1cm5cbiAgICBpZiAoYnJlYWtzLmxlbmd0aCA9PSAwKSByZXR1cm4gMFxuICAgIGlmICh2IDw9IGJyZWFrc1swXSkgcmV0dXJuIDBcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGJyZWFrcy5sZW5ndGg7IGkrKykgaWYgKGJyZWFrc1tpIC0gMV0gPCB2ICYmIHYgPD0gYnJlYWtzW2ldKSByZXR1cm4gaVxuICAgIHJldHVybiBicmVha3MubGVuZ3RoXG59XG5cbi8vdGFrZSAnbmljZScgdmFsdWUgKHBvd2VyIG9mIHRlbiwgb3IgbXVsdGlwbGUpXG5leHBvcnQgZnVuY3Rpb24gbmljZSh2LCBtdWx0aXBsZXMgPSBbOCwgNiwgNSwgNCwgMi41LCAyXSkge1xuICAgIC8vY29tcHV0ZSBiaWdnZXIgcG93ZXIgb2YgdGVuIGJlbG93XG4gICAgY29uc3Qgdl8gPSBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihNYXRoLmxvZzEwKHYpKSlcbiAgICBmb3IgKGxldCBtdWx0aXBsZSBvZiBtdWx0aXBsZXMpIGlmICh2XyAqIG11bHRpcGxlIDw9IHYpIHJldHVybiB2XyAqIG11bHRpcGxlXG4gICAgcmV0dXJuIHZfXG59XG5cbi8qXG4vL25vIGxvbmdlciB1c2VkXG5leHBvcnQgZnVuY3Rpb24gbG9hZEltYWdlKHNyYykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkgeyByZXNvbHZlKGltZyk7IH07XG4gICAgICAgIGltZy5vbmVycm9yID0gZnVuY3Rpb24gKCkgeyByZWplY3QobmV3IEVycm9yKCdFcnJvciBsb2FkaW5nIGltYWdlJykpOyB9O1xuICAgICAgICBpbWcuc3JjID0gc3JjO1xuICAgIH0pO1xufVxuKi9cblxuLypcbmV4cG9ydCBsZXQgbW9uaXRvciA9IGZhbHNlXG5cbmxldCBwcmV2aW91c0RhdGVcbmV4cG9ydCBmdW5jdGlvbiBtb25pdG9yRHVyYXRpb24obWVzc2FnZSkge1xuICAgIGNvbnN0IG5vd0RhdGUgPSBEYXRlLm5vdygpXG5cbiAgICAvL2ZpcnN0IGNhbGxcbiAgICBpZiAoIXByZXZpb3VzRGF0ZSkge1xuICAgICAgICBwcmV2aW91c0RhdGUgPSBub3dEYXRlXG4gICAgICAgIGNvbnNvbGUubG9nKHByZXZpb3VzRGF0ZSwgbWVzc2FnZSlcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZCA9IG5vd0RhdGUgLSBwcmV2aW91c0RhdGVcbiAgICBwcmV2aW91c0RhdGUgPSBub3dEYXRlXG4gICAgY29uc29sZS5sb2coZCwgbWVzc2FnZSlcbn1cbiovXG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHdpZHRoXG4gKiBAcGFyYW0ge3N0cmluZ30gaGVpZ2h0XG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICogQHJldHVybnMge3tjYW52YXM6SFRNTENhbnZhc0VsZW1lbnQsIGdsOldlYkdMUmVuZGVyaW5nQ29udGV4dH19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlV2ViR0xDYW52YXMod2lkdGgsIGhlaWdodCwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcbiAgICBjYW52YXMuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHdpZHRoKVxuICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGhlaWdodClcbiAgICAvKiogQHR5cGUge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gKi9cbiAgICBjb25zdCBnbCA9IGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcsIG9wdHMpXG4gICAgaWYgKCFnbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBpbml0aWFsaXplIFdlYkdMLiBZb3VyIGJyb3dzZXIgb3IgbWFjaGluZSBtYXkgbm90IHN1cHBvcnQgaXQuJylcbiAgICB9XG4gICAgcmV0dXJuIHsgY2FudmFzOiBjYW52YXMsIGdsOiBnbCB9XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIHNoYWRlciBwcm9ncmFtLCBzbyBXZWJHTCBrbm93cyBob3cgdG8gZHJhdyBvdXIgZGF0YVxuICpcbiAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbFxuICogQHBhcmFtICB7Li4uV2ViR0xTaGFkZXJ9IHNoYWRlcnNcbiAqIEByZXR1cm5zIHtXZWJHTFByb2dyYW19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0U2hhZGVyUHJvZ3JhbShnbCwgLi4uc2hhZGVycykge1xuICAgIC8qKiBAdHlwZSB7V2ViR0xQcm9ncmFtfG51bGx9ICovXG4gICAgY29uc3QgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKVxuICAgIGlmIChwcm9ncmFtID09IG51bGwpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSB3ZWJHTCBwcm9ncmFtJylcbiAgICBmb3IgKGNvbnN0IHNoYWRlciBvZiBzaGFkZXJzKSBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgc2hhZGVyKVxuICAgIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pXG4gICAgaWYgKGdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMpKSByZXR1cm4gcHJvZ3JhbVxuICAgIHRocm93IG5ldyBFcnJvcihnbC5nZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtKSB8fCAnQ2Fubm90IGNyZWF0ZSB3ZWJHTCBwcm9ncmFtICgyKScpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNoYWRlciBvZiB0aGUgZ2l2ZW4gdHlwZSwgdXBsb2FkcyB0aGUgc291cmNlIGFuZCBjb21waWxlcyBpdC5cbiAqXG4gKiBAcGFyYW0ge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2xcbiAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlXG4gKiBAcGFyYW0gIHsuLi5zdHJpbmd9IHNvdXJjZXNcbiAqIEByZXR1cm5zIHtXZWJHTFNoYWRlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNoYWRlcihnbCwgdHlwZSwgLi4uc291cmNlcykge1xuICAgIC8qKiBAdHlwZSB7V2ViR0xTaGFkZXJ8bnVsbH0gKi9cbiAgICBjb25zdCBzaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIodHlwZSlcbiAgICBpZiAoc2hhZGVyID09IG51bGwpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSB3ZWJHTCBzaGFkZXInKVxuICAgIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsIHNvdXJjZXMuam9pbignXFxuJykpXG4gICAgZ2wuY29tcGlsZVNoYWRlcihzaGFkZXIpXG4gICAgaWYgKGdsLmdldFNoYWRlclBhcmFtZXRlcihzaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSkgcmV0dXJuIHNoYWRlclxuICAgIHRocm93IG5ldyBFcnJvcihnbC5nZXRTaGFkZXJJbmZvTG9nKHNoYWRlcikgfHwgJ0Nhbm5vdCBjcmVhdGUgd2ViR0wgc2hhZGVyICgyKScpXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgd2ViR0wgaXMgc3VwcG9ydGVkXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1dlYkdMU3VwcG9ydCgpIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxuICAgICAgICByZXR1cm4gISEoXG4gICAgICAgICAgICAhIXdpbmRvdy5XZWJHTFJlbmRlcmluZ0NvbnRleHQgJiZcbiAgICAgICAgICAgIChjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnKSB8fCBjYW52YXMuZ2V0Q29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJykpXG4gICAgICAgIClcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxufVxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8vIHRoZSBhcHBsaWNhdGlvblxuZXhwb3J0IHsgTWFwIH0gZnJvbSAnLi9jb3JlL01hcC5qcydcbmV4cG9ydCB7IEdlb0NhbnZhcyB9IGZyb20gJy4vY29yZS9HZW9DYW52YXMuanMnXG5leHBvcnQgeyBTdHlsZSB9IGZyb20gJy4vY29yZS9TdHlsZS5qcydcbmV4cG9ydCB7IExheWVyIH0gZnJvbSAnLi9jb3JlL0xheWVyLmpzJ1xuZXhwb3J0IHsgRGF0YXNldCB9IGZyb20gJy4vY29yZS9EYXRhc2V0LmpzJ1xuZXhwb3J0IHsgTXVsdGlSZXNvbHV0aW9uRGF0YXNldCB9IGZyb20gJy4vY29yZS9NdWx0aVJlc29sdXRpb25EYXRhc2V0LmpzJ1xuXG4vLyBleHBvcnQgZGF0YXNldCB0eXBlc1xuZXhwb3J0IHsgVGlsZWRHcmlkIH0gZnJvbSAnLi9kYXRhc2V0L1RpbGVkR3JpZC5qcydcbmV4cG9ydCB7IENTVkdyaWQgfSBmcm9tICcuL2RhdGFzZXQvQ1NWR3JpZC5qcydcbmV4cG9ydCB7IEpTR3JpZCB9IGZyb20gJy4vZGF0YXNldC9KU0dyaWQuanMnXG5cbi8vIGV4cG9ydCBzdHlsZXNcbmV4cG9ydCB7IFNoYXBlQ29sb3JTaXplU3R5bGUgfSBmcm9tICcuL3N0eWxlL1NoYXBlQ29sb3JTaXplU3R5bGUuanMnXG5leHBvcnQgeyBTdHJva2VTdHlsZSB9IGZyb20gJy4vc3R5bGUvU3Ryb2tlU3R5bGUuanMnXG5leHBvcnQgeyBKb3lQbG90U3R5bGUgfSBmcm9tICcuL3N0eWxlL0pveVBsb3RTdHlsZS5qcydcbmV4cG9ydCB7IENvbXBvc2l0aW9uU3R5bGUgfSBmcm9tICcuL3N0eWxlL0NvbXBvc2l0aW9uU3R5bGUuanMnXG5leHBvcnQgeyBTZWdtZW50U3R5bGUgfSBmcm9tICcuL3N0eWxlL1NlZ21lbnRTdHlsZS5qcydcbmV4cG9ydCB7IFRleHRTdHlsZSB9IGZyb20gJy4vc3R5bGUvVGV4dFN0eWxlLmpzJ1xuZXhwb3J0IHsgUGlsbGFyU3R5bGUgfSBmcm9tICcuL3N0eWxlL1BpbGxhclN0eWxlLmpzJ1xuZXhwb3J0IHsgU2lkZVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TaWRlU3R5bGUuanMnXG4vL2V4cG9ydCB7IENvbnRvdXJTdHlsZSB9IGZyb20gJy4vc3R5bGUvQ29udG91clN0eWxlLmpzJ1xuZXhwb3J0IHsgU2lkZUNhdGVnb3J5U3R5bGUgfSBmcm9tICcuL3N0eWxlL1NpZGVDYXRlZ29yeVN0eWxlLmpzJ1xuZXhwb3J0IHsgRG90RGVuc2l0eVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9Eb3REZW5zaXR5U3R5bGUuanMnXG5leHBvcnQgeyBUYW5ha2FTdHlsZSB9IGZyb20gJy4vc3R5bGUvVGFuYWthU3R5bGUuanMnXG5leHBvcnQgeyBMZWdvU3R5bGUgfSBmcm9tICcuL3N0eWxlL0xlZ29TdHlsZS5qcydcbmV4cG9ydCB7IFNxdWFyZUNvbG9yV2ViR0xTdHlsZSB9IGZyb20gJy4vc3R5bGUvU3F1YXJlQ29sb3JXZWJHTFN0eWxlLmpzJ1xuZXhwb3J0IHsgU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUgfSBmcm9tICcuL3N0eWxlL1NxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlLmpzJ1xuZXhwb3J0IHsgTW9zYWljU3R5bGUgfSBmcm9tICcuL3N0eWxlL01vc2FpY1N0eWxlLmpzJ1xuZXhwb3J0IHsgTmluamFTdGFyU3R5bGUgfSBmcm9tICcuL3N0eWxlL05pbmphU3RhclN0eWxlLmpzJ1xuZXhwb3J0IHsgVGltZVNlcmllc1N0eWxlIH0gZnJvbSAnLi9zdHlsZS9UaW1lU2VyaWVzU3R5bGUuanMnXG5leHBvcnQgeyBJc29GZW5jZVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9Jc29GZW5jZVN0eWxlLmpzJ1xuZXhwb3J0IHsgSW1hZ2VTdHlsZSB9IGZyb20gJy4vc3R5bGUvSW1hZ2VTdHlsZS5qcydcblxuLy8gZXhwb3J0IGFkZGl0aW9uYWwgbGF5ZXJzXG5leHBvcnQgeyBHcmlkTGF5ZXIgfSBmcm9tICcuL2xheWVyL0dyaWRMYXllci5qcydcbmV4cG9ydCB7IEJhY2tncm91bmRMYXllciB9IGZyb20gJy4vbGF5ZXIvQmFja2dyb3VuZExheWVyLmpzJ1xuZXhwb3J0IHsgQmFja2dyb3VuZExheWVyV01TIH0gZnJvbSAnLi9sYXllci9CYWNrZ3JvdW5kTGF5ZXJXTVMuanMnXG5leHBvcnQgeyBCYWNrZ3JvdW5kTGF5ZXJJbWFnZSB9IGZyb20gJy4vbGF5ZXIvQmFja2dyb3VuZExheWVySW1hZ2UuanMnXG5leHBvcnQgeyBMYWJlbExheWVyIH0gZnJvbSAnLi9sYXllci9MYWJlbExheWVyLmpzJ1xuZXhwb3J0IHsgR2VvSlNPTkxheWVyIH0gZnJvbSAnLi9sYXllci9HZW9KU09OTGF5ZXIuanMnXG5cbi8vIGV4cG9ydCBsZWdlbmRzXG5leHBvcnQgeyBDb2xvckxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL0NvbG9yTGVnZW5kLmpzJ1xuZXhwb3J0IHsgQ29sb3JEaXNjcmV0ZUxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL0NvbG9yRGlzY3JldGVMZWdlbmQuanMnXG5leHBvcnQgeyBDb2xvckNhdGVnb3J5TGVnZW5kIH0gZnJvbSAnLi9sZWdlbmQvQ29sb3JDYXRlZ29yeUxlZ2VuZC5qcydcbmV4cG9ydCB7XG4gICAgU2l6ZUxlZ2VuZCxcbiAgICBzaXplTGVnZW5kLFxuICAgIHNpemVMZWdlbmRWaWV3U2NhbGUsXG4gICAgc2l6ZURpc2NyZXRlTGVnZW5kLFxuICAgIHNpemVEaXNjcmV0ZVZpZXdTY2FsZUxlZ2VuZCxcbn0gZnJvbSAnLi9sZWdlbmQvU2l6ZUxlZ2VuZC5qcydcbmV4cG9ydCB7IE9yaWVudGF0aW9uTGVnZW5kLCBvcmllbnRhdGlvbkxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL09yaWVudGF0aW9uTGVnZW5kLmpzJ1xuZXhwb3J0IHsgVGVybmFyeUxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL1Rlcm5hcnlMZWdlbmQuanMnXG5cbi8vIGV4cG9ydCB7IGdvVG9TdHJhaWdodCwgem9vbVRvIH0gZnJvbSBcIi4vdXRpbHMvem9vbVV0aWxzXCJcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvc3RyZXRjaGluZy5qcydcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvc2NhbGUuanMnXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL3Rlcm5hcnkuanMnXG5leHBvcnQgeyBuaWNlIH0gZnJvbSAnLi91dGlscy91dGlscy5qcydcblxuaW1wb3J0IHsgR2VvQ2FudmFzIH0gZnJvbSAnLi9jb3JlL0dlb0NhbnZhcy5qcydcbmV4cG9ydCBjb25zdCBnZXRQYXJhbWV0ZXJCeU5hbWUgPSBHZW9DYW52YXMuZ2V0UGFyYW1ldGVyQnlOYW1lXG5cbi8vIHNldCBkZWZhdWx0IGQzIGxvY2FsZVxuaW1wb3J0IHsgZm9ybWF0RGVmYXVsdExvY2FsZSB9IGZyb20gJ2QzLWZvcm1hdCdcbmZvcm1hdERlZmF1bHRMb2NhbGUoe1xuICAgIGRlY2ltYWw6ICcuJyxcbiAgICB0aG91c2FuZHM6ICcgJyxcbiAgICBncm91cGluZzogWzNdLFxuICAgIGN1cnJlbmN5OiBbJycsICfigqwnXSxcbn0pXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
16257
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUF5QixJQUFJO0FBQzdCLHdDQUF3QyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUk7QUFDMUQsd0NBQXdDLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUMxRCwwQ0FBMEMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUNuRSwwQ0FBMEMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUNuRSx3Q0FBd0MsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJO0FBQzFELDBDQUEwQyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJOztBQUVuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFtQyxlQUFlLFlBQVksU0FBUztBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3hIb0M7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLDBCQUEwQiw4Q0FBTTtBQUN2QztBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQ3BHQTtBQUNZOztBQUVaO0FBQ0E7QUFDQSxjQUFjLHVCQUF1Qjs7QUFFckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsZUFBZSx3QkFBd0I7QUFDdkMsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixnQkFBZ0IsNkVBQTZFO0FBQzdGO0FBQ0E7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHdCQUF3QjtBQUMxQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixzQ0FBc0M7QUFDeEQ7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQix1Q0FBdUM7QUFDekQ7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixjQUFjO0FBQ2hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLDBDQUEwQztBQUN6RCxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxnQ0FBZ0M7QUFDL0MsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixvQkFBb0I7QUFDcEMsZUFBZSxjQUFjO0FBQzdCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLFFBQVE7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsY0FBYztBQUNoQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQ3pKQTtBQUNZOztBQUVaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQiwwQkFBMEI7QUFDNUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHFDQUFxQztBQUN2RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsMkNBQTJDO0FBQzdEOztBQUVBLG1CQUFtQixxQ0FBcUM7QUFDeEQ7QUFDQSxtQkFBbUIsOERBQThEO0FBQ2pGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvQ0FBb0M7QUFDbkQsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN0VBO0FBQ1k7O0FBRVosZ0JBQWdCLDBEQUEwRDs7QUFFMUU7QUFDQTtBQUNBLGNBQWMsa0NBQWtDOztBQUVoRCxDQUFxQztBQUNpQjs7QUFFdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0EsZUFBZSxtQkFBbUI7QUFDbEMsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsbUJBQW1CO0FBQ3RDOztBQUVBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsMEJBQTBCO0FBQzVDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekIsc0JBQXNCOztBQUV0QjtBQUNBLGtCQUFrQixRQUFRO0FBQzFCOztBQUVBLG1CQUFtQixpQ0FBaUM7QUFDcEQ7O0FBRUEsbUJBQW1CLGlDQUFpQztBQUNwRDs7QUFFQSxtQkFBbUIsaUNBQWlDO0FBQ3BEOztBQUVBO0FBQ0EsbUJBQW1CLFVBQVU7QUFDN0Isd0JBQXdCO0FBQ3hCOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUIsaURBQVk7QUFDakM7QUFDQTtBQUNBLHNCQUFzQiw2Q0FBTTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7O0FBRXhDO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsY0FBYyx3REFBTTs7QUFFcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixrQkFBa0I7QUFDckM7QUFDQSxtQkFBbUIsa0JBQWtCO0FBQ3JDO0FBQ0EsbUJBQW1CLGtCQUFrQjtBQUNyQztBQUNBLG1CQUFtQixrQkFBa0I7QUFDckM7O0FBRUE7QUFDQSxtQkFBbUIsZ0JBQWdCO0FBQ25DOztBQUVBO0FBQ0Esb0JBQW9CLHdEQUF3RDtBQUM1RSw0QkFBNEI7QUFDNUI7O0FBRUEsa0JBQWtCLE1BQU07QUFDeEI7QUFDQTtBQUNBOztBQUVBLGdCQUFnQixnQkFBZ0I7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDBCQUEwQjtBQUM1QztBQUNBO0FBQ0E7O0FBRUEsZ0JBQWdCLGdCQUFnQjtBQUNoQztBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixpQkFBaUIsVUFBVTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDN2FBO0FBQ1k7O0FBRVosQ0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxvQkFBb0Isa0RBQVE7QUFDbkM7QUFDQTtBQUNBO0FBQ0EsZUFBZSxpQ0FBaUM7QUFDaEQsZUFBZSxRQUFRO0FBQ3ZCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0QkE7QUFDWTs7QUFFWixDQUFxQzs7QUFFckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLFFBQVE7QUFDM0I7O0FBRUE7O0FBRUEsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBLG1CQUFtQixRQUFRO0FBQzNCOztBQUVBO0FBQ0EsZ0NBQWdDLHdEQUFNOztBQUV0QztBQUNBLHVCQUF1Qix3REFBTTtBQUM3QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzR0E7QUFDWTs7QUFFWjtBQUNBLENBQTBDO0FBQ0o7QUFDZ0I7QUFDVTs7QUFFaEU7QUFDcUM7O0FBRXJDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSxlQUFlLGdCQUFnQjtBQUMvQixlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7O0FBRUE7QUFDQSxtQkFBbUIsbUJBQW1CO0FBQ3RDOztBQUVBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0EsNkJBQTZCLG9EQUFTOztBQUV0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYyx3REFBTTtBQUNwQjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLFNBQVM7QUFDM0IsMkJBQTJCLGdEQUFPOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHdCQUF3QjtBQUMxQzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCLHdEQUFNO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsbUVBQW1FO0FBQ2xGLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLE1BQU07QUFDeEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnQkFBZ0IsWUFBWTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsZ0VBQWdFLGFBQWE7QUFDakc7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixvQkFBb0I7QUFDcEMsa0JBQWtCLGdFQUFnRTtBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLFFBQVE7QUFDckQsdUJBQXVCLDRCQUE0QjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVCQUF1Qix1Q0FBdUM7QUFDOUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7O0FBRUE7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixlQUFlLGtCQUFrQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsK0JBQStCO0FBQ2pEO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsUUFBUSxZQUFZLE1BQU07QUFDMUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLDBCQUEwQjtBQUM1QztBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsZ0JBQWdCLGNBQWMsTUFBTTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixnQkFBZ0IsY0FBYyxNQUFNO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRLGNBQWMsTUFBTTtBQUM1QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLCtCQUErQiwrREFBVztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQ0FBb0MseUVBQWdCO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7O0FBRUEsa0JBQWtCLE1BQU07QUFDeEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDbmdCQTtBQUNZOztBQUVaO0FBQ0E7QUFDQSw2QkFBNkIsY0FBYztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsZUFBZSxnQkFBZ0I7QUFDL0IsZUFBZSxrRkFBa0Y7QUFDakcsaUJBQWlCLDBEQUEwRDtBQUMzRTtBQUNBLGdEQUFnRDtBQUNoRDs7QUFFQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEM7O0FBRUE7QUFDQSxrQkFBa0IscUNBQXFDO0FBQ3ZEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLDRDQUE0QztBQUMzRCxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGdCQUFnQjtBQUMvQixlQUFlLDhDQUE4QztBQUM3RCxpQkFBaUIsMERBQTBEO0FBQzNFLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7Ozs7Ozs7Ozs7Ozs7OztBQzVGQTtBQUNZOztBQUVaLENBQXdDOztBQUV4QyxjQUFjLDJHQUEyRzs7QUFFekg7QUFDQTtBQUNBO0FBQ0EsYUFBYSxnRUFBZ0U7O0FBRTdFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLG9CQUFvQixrREFBUTtBQUNuQztBQUNBO0FBQ0EsZ0JBQWdCLGdIQUFnSCxvQkFBb0Isc0tBQXNLO0FBQzFUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLHFCQUFxQjtBQUN2Qzs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLDBEQUEwRDtBQUM1RTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLGtEQUFrRCxzQkFBc0I7QUFDMUYsc0RBQXNELGNBQWM7O0FBRXBFO0FBQ0Esa0JBQWtCLG9CQUFvQjtBQUN0Qzs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLG1DQUFtQztBQUNyRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0NBQWtDO0FBQ2pELGVBQWUsaUNBQWlDO0FBQ2hELGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsa0JBQWtCLGtEQUFrRCxzQkFBc0I7QUFDMUY7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGtEQUFrRCxzQkFBc0IsY0FBYyxNQUFNO0FBQzVHO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGlCQUFpQixNQUFNO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLG1DQUFtQztBQUNsRCxpQkFBaUIsTUFBTTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDakdBO0FBQ1k7O0FBRVosQ0FBcUM7QUFDckMsV0FBVyxhQUFhOztBQUV4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjs7QUFFQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0EsbUJBQW1CLGFBQWE7QUFDaEM7QUFDQSxtQkFBbUIsYUFBYTtBQUNoQzs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLGtDQUFrQztBQUNwRDtBQUNBLGNBQWMsd0RBQU07QUFDcEIsY0FBYyx3REFBTTs7QUFFcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGVBQWUsWUFBWTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFlBQVk7QUFDM0IsZUFBZSxTQUFTO0FBQ3hCLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3JMQTtBQUNZOztBQUVaLGdCQUFnQiwrREFBK0Qsa0JBQWtCLGlGQUFpRjs7QUFFbEwsQ0FBOEI7QUFDYzs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sc0JBQXNCLHFEQUFPO0FBQ3BDO0FBQ0EsZUFBZSw4QkFBOEI7QUFDN0MsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixnQkFBZ0Isc0ZBQXNGO0FBQ3RHO0FBQ0EsK0NBQStDO0FBQy9DOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsMkNBQTJDO0FBQzdEOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjs7QUFFQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZSxtREFBbUQ7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLG1DQUFtQyxvREFBRzs7QUFFdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUseUNBQXlDO0FBQ3hELGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQy9HQTtBQUNZOztBQUVaLENBQTRDOztBQUU1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxxQkFBcUIscURBQU87QUFDbkM7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZUFBZSxnQkFBZ0I7QUFDL0IsaUJBQWlCO0FBQ2pCO0FBQ0EsNENBQTRDO0FBQzVDOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsMkNBQTJDO0FBQzdEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxtREFBbUQ7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSx5Q0FBeUM7QUFDeEQsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0REE7QUFDWTs7QUFFWixnQkFBZ0IsK0RBQStELGtCQUFrQixpRkFBaUY7O0FBRWxMO0FBQ0EsQ0FBNEM7QUFDNUMsV0FBVywyQkFBMkI7O0FBRXRDO0FBQ29DOztBQUVwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyx3QkFBd0IscURBQU87QUFDdEM7QUFDQSxlQUFlLDhCQUE4QjtBQUM3QyxlQUFlLFFBQVE7QUFDdkIsZ0JBQWdCLHVHQUF1RztBQUN2SDtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSx1Q0FBdUMsb0RBQUk7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSx5Q0FBeUM7QUFDeEQsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSx5Q0FBeUM7QUFDeEQsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGdCQUFnQix5REFBeUQ7O0FBRXpFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRCQUE0QixZQUFZO0FBQ3hDLGdDQUFnQyxZQUFZO0FBQzVDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixlQUFlLGFBQWE7QUFDNUIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLCtCQUErQiw2Q0FBRyxJQUFJLFNBQVMsRUFBRSxHQUFHLEdBQUcsR0FBRyxTQUFTLFFBQVE7O0FBRTNFOztBQUVBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsaURBQWlELEdBQUcsSUFBSSxJQUFJO0FBQzVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0IseUJBQXlCO0FBQ3pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUseUNBQXlDO0FBQ3hELGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLG1EQUFtRDtBQUN0RTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLHlDQUF5QztBQUM1RDs7QUFFQSxrREFBa0Qsa0NBQWtDO0FBQ3BGO0FBQ0Esc0RBQXNELGtDQUFrQztBQUN4RjtBQUNBLDJCQUEyQixRQUFRO0FBQ25DO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsZUFBZSx3Q0FBd0M7QUFDdkQ7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQSxlQUFlLFFBQVE7QUFDdkI7O0FBRUE7QUFDQTs7QUFFQSxlQUFlLHNDQUFzQztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDN1NBO0FBQ1k7O0FBRVosQ0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLDhCQUE4QixpREFBSztBQUMxQztBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBLG1CQUFtQix1Q0FBdUM7QUFDMUQ7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7O0FBRUE7QUFDQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDOztBQUVBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlLHlCQUF5QjtBQUN4QyxlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSx1Q0FBdUM7QUFDdEQsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFCQUFxQiw4QkFBOEI7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCLFVBQVU7QUFDckMsK0JBQStCLFVBQVU7QUFDekM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQzVLQTtBQUNZOztBQUVaLENBQXdDOztBQUV4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLG1DQUFtQyxpREFBSztBQUMvQztBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCOztBQUVBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTtBQUNBLG1CQUFtQixRQUFRO0FBQzNCOztBQUVBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCOztBQUVBO0FBQ0Esa0JBQWtCLDRCQUE0QjtBQUM5QztBQUNBOztBQUVBO0FBQ0EsZUFBZSwwQ0FBMEM7QUFDekQsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoRkE7QUFDWTs7QUFFWixDQUF3Qzs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxpQ0FBaUMsaURBQUs7QUFDN0M7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjs7QUFFQSxtQkFBbUIsNEJBQTRCO0FBQy9DOztBQUVBLG1CQUFtQixrQkFBa0I7QUFDckM7QUFDQSxtQkFBbUIsa0JBQWtCO0FBQ3JDO0FBQ0EsbUJBQW1CLGtCQUFrQjtBQUNyQztBQUNBLG1CQUFtQixrQkFBa0I7QUFDckM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLHVDQUF1QztBQUN0RCxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdkdBO0FBQ1k7O0FBRVosQ0FBd0M7QUFDVDs7QUFFL0I7QUFDQTtBQUNBO0FBQ0E7QUFDTywyQkFBMkIsaURBQUs7QUFDdkM7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsMEJBQTBCO0FBQzVDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQ0FBZ0M7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZ0NBQWdDO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQ0FBZ0M7QUFDbEQ7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGdDQUFnQztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQ0FBZ0M7QUFDbEQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixnQ0FBZ0M7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZ0NBQWdDO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixrREFBa0Q7QUFDcEU7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQiw0QkFBNEI7QUFDOUM7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGVBQWUsMENBQTBDO0FBQ3pELGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsZUFBZTtBQUMvQztBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlLGlCQUFpQjtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsZ0NBQWdDLG9EQUFJOztBQUVwQyx3QkFBd0IsaUJBQWlCO0FBQ3pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDck5BO0FBQ1k7O0FBRVosQ0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLHdCQUF3QixpREFBSztBQUNwQztBQUNBLGVBQWUsbUdBQW1HO0FBQ2xILGVBQWUsdUNBQXVDO0FBQ3RELGdCQUFnQixvTkFBb047QUFDcE87QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQTs7QUFFQSxtQkFBbUIsbUdBQW1HO0FBQ3RIOztBQUVBLG1CQUFtQix1Q0FBdUM7QUFDMUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IseURBQXlEO0FBQzNFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixnREFBZ0Q7QUFDbkU7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSwrRUFBK0U7QUFDOUYsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsZ0NBQWdDO0FBQy9DLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ25KQTtBQUNZOztBQUVaLENBQXdDO0FBQ1Y7O0FBRTlCO0FBQ0EsY0FBYyxvQ0FBb0M7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLHlCQUF5QixpREFBSztBQUNyQztBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQiwrQkFBK0I7QUFDakQ7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQiwrQkFBK0I7QUFDakQ7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQiwrQkFBK0I7QUFDakQ7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQiwrQkFBK0I7QUFDakQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQzs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHlCQUF5QjtBQUMzQzs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLDJCQUEyQjtBQUM3Qzs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHVDQUF1QztBQUN0RCxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlLGlCQUFpQjtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLGdCQUFnQjtBQUN4QywrQkFBK0IsNkNBQUc7O0FBRWxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDak1BO0FBQ1k7O0FBRVosQ0FBMEM7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLGtDQUFrQyxtREFBTTtBQUMvQyxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHlCQUF5QjtBQUMzQzs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLGtDQUFrQztBQUNwRDtBQUNBLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx3QkFBd0IsUUFBUTtBQUNoQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1R0E7QUFDWTs7QUFFWixDQUEwQzs7QUFFMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxrQ0FBa0MsbURBQU07QUFDL0MsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBOztBQUVBLDRCQUE0Qiw0REFBNEQ7QUFDeEY7QUFDQSw0QkFBNEIsNERBQTREO0FBQ3hGOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCLCtDQUErQztBQUMvRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdCQUF3QixRQUFRO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLFFBQVE7QUFDaEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDbkdBO0FBQ1k7O0FBRVosQ0FBMEM7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sMEJBQTBCLG1EQUFNO0FBQ3ZDLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQkFBZ0IsK0NBQStDO0FBQy9EO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLGVBQWU7O0FBRW5GOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLE9BQU87QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdCQUF3QixnQkFBZ0I7QUFDeEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0Esd0JBQXdCLGdCQUFnQjtBQUN4Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsSEE7QUFDWTs7QUFFWixDQUEwQzs7QUFFMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sZ0NBQWdDLG1EQUFNO0FBQzdDLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQiwyR0FBMkc7QUFDNUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLGdCQUFnQjtBQUMzQixXQUFXLGdCQUFnQjtBQUMzQixXQUFXLFFBQVE7QUFDbkIsZUFBZTtBQUNmO0FBQ08sMERBQTBEO0FBQ2pFO0FBQ0Esb0JBQW9CLHlCQUF5QjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3hGQTtBQUNZOztBQUVaLENBQTBDO0FBQ0Y7QUFDVjs7QUFFOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08seUJBQXlCLG1EQUFNO0FBQ3RDLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQiw4RkFBOEY7QUFDbEg7O0FBRUE7QUFDQSxvQkFBb0IsMENBQTBDO0FBQzlEOztBQUVBO0FBQ0Esb0JBQW9CLHdDQUF3QztBQUM1RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLG1HQUFtRztBQUNwSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrRUFBK0U7QUFDL0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxnQkFBZ0I7QUFDM0IsV0FBVyx5QkFBeUI7QUFDcEMsWUFBWSxTQUFTO0FBQ3JCLGFBQWE7QUFDYjtBQUNPLDJDQUEyQztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxZQUFZLHFEQUFxRDtBQUNqRSxXQUFXLEdBQUc7QUFDZCxhQUFhO0FBQ2I7QUFDTyw2Q0FBNkM7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMscURBQUksTUFBTSxvREFBRztBQUN4RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGlCQUFpQjtBQUM3QixZQUFZLGlCQUFpQjtBQUM3QixZQUFZLFNBQVM7QUFDckIsYUFBYTtBQUNiO0FBQ08sb0RBQW9EO0FBQzNEO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxRQUFRO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZLFNBQVM7QUFDckIsWUFBWSxTQUFTO0FBQ3JCLGFBQWE7QUFDYjtBQUNPLDJEQUEyRDtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVksMEJBQTBCO0FBQ3RDLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDL05BO0FBQ1k7O0FBRVosQ0FBcUM7QUFDSzs7QUFFMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLDRCQUE0QixtREFBTTtBQUN6QyxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQsd0RBQXdEO0FBQ2pILG9CQUFvQix5REFBTTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLDJEQUEyRDtBQUMzRCxvQkFBb0Isd0RBQU07QUFDMUI7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsVUFBVTs7QUFFVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZCQUE2QixTQUFTO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkJBQTZCLFNBQVM7QUFDdEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQzdTQTtBQUNZOztBQUVaLENBQXdDOztBQUV4QyxjQUFjLG9FQUFvRTs7QUFFbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sK0JBQStCLGlEQUFLO0FBQzNDLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixtRkFBbUY7QUFDckc7O0FBRUE7QUFDQSxrQkFBa0IsNEVBQTRFO0FBQzlGOztBQUVBO0FBQ0Esa0JBQWtCLHlFQUF5RTtBQUMzRjs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLHlFQUF5RTtBQUMzRjs7QUFFQTtBQUNBLGtCQUFrQix5RUFBeUU7QUFDM0Y7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSwyQ0FBMkM7QUFDMUQsZUFBZSwwQ0FBMEM7QUFDekQsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG1DQUFtQyxRQUFRO0FBQzNDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxtQ0FBbUMsUUFBUTtBQUMzQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG1DQUFtQyxRQUFRO0FBQzNDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2QkFBNkIsaUVBQWlFO0FBQzlGO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbFNBO0FBQ1k7O0FBRVosQ0FBd0M7QUFDQTtBQUNtQztBQUNOO0FBQ3JDOztBQUVoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sOEJBQThCLGlEQUFLO0FBQzFDLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQiw0RUFBNEU7QUFDOUY7O0FBRUE7QUFDQSxrQkFBa0IsNEVBQTRFO0FBQzlGOztBQUVBO0FBQ0Esa0JBQWtCLHdDQUF3QztBQUMxRDs7QUFFQTtBQUNBLGtCQUFrQix3Q0FBd0M7QUFDMUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHdDQUF3QztBQUN2RCxlQUFlLHVDQUF1QztBQUN0RCxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFCQUFxQixxREFBWTs7QUFFakM7O0FBRUEsWUFBWSx1RUFBaUI7QUFDN0I7QUFDQSwwQkFBMEIscUVBQWU7QUFDekM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2QkFBNkIsOEVBQW1COztBQUVoRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCLG9EQUFLO0FBQ2hDOztBQUVBO0FBQ0EsZ0NBQWdDLGdCQUFnQjtBQUNoRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLGdCQUFnQjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZCQUE2QixpRUFBaUU7QUFDOUY7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3BJQTtBQUNZOztBQUVaLENBQXdDOztBQUV4QztBQUNBO0FBQ0E7QUFDQTtBQUNPLHlCQUF5QixpREFBSztBQUNyQyxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsNEVBQTRFO0FBQzlGOztBQUVBO0FBQ0EsbUJBQW1CLG1GQUFtRjtBQUN0Rzs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTs7QUFFQTtBQUNBLGVBQWUsMkNBQTJDO0FBQzFELGVBQWUsMENBQTBDO0FBQ3pELGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkJBQTZCLGlFQUFpRTtBQUM5RjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ25HQTtBQUNZOztBQUVaLENBQXdDO0FBQ0U7O0FBRTFDLGVBQWUsNkhBQTZIOztBQUU1STtBQUNBO0FBQ0E7QUFDQTtBQUNPLDRCQUE0QixpREFBSztBQUN4QyxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCOztBQUVBO0FBQ0Esa0JBQWtCLDRFQUE0RTtBQUM5Rjs7QUFFQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCOztBQUVBO0FBQ0Esa0JBQWtCLHlFQUF5RTtBQUMzRjs7QUFFQTtBQUNBLGtCQUFrQix5RUFBeUU7QUFDM0Y7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixTQUFTO0FBQzNCOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsU0FBUztBQUMzQjtBQUNBOztBQUVBO0FBQ0EsZUFBZSwyQ0FBMkM7QUFDMUQsZUFBZSwwQ0FBMEM7QUFDekQsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0IsY0FBYztBQUNsQyxzQkFBc0Isb0RBQVM7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2QkFBNkIsaUVBQWlFO0FBQzlGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4TkE7QUFDWTs7QUFFWixDQUF3Qzs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDTywyQkFBMkIsaURBQUs7QUFDdkMsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLDRFQUE0RTtBQUM5Rjs7QUFFQTtBQUNBLGtCQUFrQixpQkFBaUIsdUJBQXVCLHdCQUF3QjtBQUNsRjtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQix1QkFBdUIsd0JBQXdCO0FBQ2xGO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCLHVCQUF1Qix3QkFBd0I7QUFDbEY7QUFDQTs7QUFFQTtBQUNBLGVBQWUsMkNBQTJDO0FBQzFELGVBQWUsMENBQTBDO0FBQ3pELGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFCQUFxQix5QkFBeUI7QUFDOUMscUJBQXFCOztBQUVyQjtBQUNBO0FBQ0EsMkJBQTJCLFdBQVc7QUFDdEM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7O0FBRUE7QUFDQSwrQkFBK0IsV0FBVztBQUMxQztBQUNBLDJCQUEyQixRQUFRO0FBQ25DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5SEE7QUFDWTs7QUFFWixDQUE4QztBQUNBO0FBQ29DO0FBQzFDOztBQUV4QztBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsK0NBQStDO0FBQy9DOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUIsd0RBQVc7QUFDOUI7QUFDQSx3QkFBd0Isd0RBQVc7QUFDbkM7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQix1RUFBdUU7QUFDdEc7QUFDQTs7QUFFQTtBQUNBLGVBQWUsb0RBQW9EO0FBQ25FLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCLDRGQUE2QixHQUFHLDBCQUEwQjtBQUNoRjtBQUNBLHdCQUF3Qix3REFBVyxHQUFHLDhEQUE4RDs7QUFFcEcsMkNBQTJDLGtEQUFrRDtBQUM3RjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixpREFBSztBQUNoQyxnQkFBZ0Isa0JBQWtCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3R0E7QUFDWTs7QUFFWixDQUF3Qzs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDTywwQkFBMEIsaURBQUs7QUFDdEMsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLDRFQUE0RTtBQUM5Rjs7QUFFQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCOztBQUVBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7O0FBRUE7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlLHdDQUF3QztBQUN2RCxlQUFlLHVDQUF1QztBQUN0RCxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZCQUE2QixpRUFBaUU7QUFDOUY7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ2xHQTtBQUNZOztBQUVaLENBQXdDOztBQUV4QztBQUNBO0FBQ0E7QUFDQTtBQUNPLDZCQUE2QixpREFBSztBQUN6QyxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsNEVBQTRFO0FBQzlGOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiw0RUFBNEU7QUFDOUY7O0FBRUE7QUFDQSxrQkFBa0IsaURBQWlEO0FBQ25FO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGVBQWUsMkNBQTJDO0FBQzFELGVBQWUsdUNBQXVDO0FBQ3RELGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2QkFBNkIsaUVBQWlFO0FBQzlGO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyR0E7QUFDWTs7QUFFWixDQUF3Qzs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDTywwQkFBMEIsaURBQUs7QUFDdEMsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLDRFQUE0RTtBQUM5Rjs7QUFFQTtBQUNBLGtCQUFrQiw0RUFBNEU7QUFDOUY7O0FBRUE7QUFDQSxrQkFBa0IsNEVBQTRFO0FBQzlGOztBQUVBO0FBQ0Esa0JBQWtCLHlDQUF5QztBQUMzRDs7QUFFQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjs7QUFFQTtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0E7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBLG1CQUFtQixRQUFRO0FBQzNCOztBQUVBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHdDQUF3QztBQUN2RCxlQUFlLHVDQUF1QztBQUN0RCxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRDQUE0QyxzQ0FBc0M7QUFDbEY7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGtCQUFrQjtBQUN6QztBQUNBOztBQUVBO0FBQ0EsdUJBQXVCLGtCQUFrQjtBQUN6QztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGtCQUFrQjtBQUN6QztBQUNBOztBQUVBO0FBQ0EsdUJBQXVCLGtCQUFrQjtBQUN6QztBQUNBOztBQUVBO0FBQ0EsdUJBQXVCLGtCQUFrQjtBQUN6QztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDZCQUE2QixpRUFBaUU7QUFDOUY7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQzlNQTtBQUNZOztBQUVaLENBQXdDOztBQUV4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTywyQkFBMkIsaURBQUs7QUFDdkMsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLDRFQUE0RTtBQUM5Rjs7QUFFQTtBQUNBLGtCQUFrQiw0RUFBNEU7QUFDOUY7O0FBRUE7QUFDQSxrQkFBa0IsNEVBQTRFO0FBQzlGOztBQUVBO0FBQ0Esa0JBQWtCLDRFQUE0RTtBQUM5RjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsd0NBQXdDO0FBQ3ZELGVBQWUsdUNBQXVDO0FBQ3RELGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTs7QUFFQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTs7QUFFQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTs7QUFFQTtBQUNBLHVCQUF1QixRQUFRO0FBQy9CO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2QkFBNkIsa0VBQWtFO0FBQy9GO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4R0E7QUFDWTs7QUFFWixDQUF3Qzs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxrQ0FBa0MsaURBQUs7QUFDOUMsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHVGQUF1RjtBQUMxRzs7QUFFQSxtQkFBbUIsdUZBQXVGO0FBQzFHOztBQUVBLG1CQUFtQiwrR0FBK0c7QUFDbEk7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLDJDQUEyQztBQUMxRCxlQUFlLDBDQUEwQztBQUN6RCxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZCQUE2QixrRUFBa0U7QUFDL0Y7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ2xKQTtBQUNZOztBQUVaLENBQTBDOztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxnQ0FBZ0Msb0RBQVM7QUFDaEQsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLG9FQUFvRTtBQUN0Rjs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTs7QUFFQTtBQUNBLGVBQWUsMkNBQTJDO0FBQzFELGVBQWUsMENBQTBDO0FBQ3pELGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsb0JBQW9CLHVDQUF1QztBQUMzRCxzQkFBc0Isb0RBQVM7QUFDL0I7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkJBQTZCLGlFQUFpRTtBQUM5RjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDL0dBO0FBQ1k7O0FBRVosQ0FBd0M7O0FBRXhDLGdCQUFnQixnSUFBZ0k7O0FBRWhKO0FBQ0EsYUFBYSx5Q0FBeUM7O0FBRXREO0FBQ0E7QUFDQTtBQUNBO0FBQ08sd0JBQXdCLGlEQUFLO0FBQ3BDLGdCQUFnQixRQUFRO0FBQ3hCLHlCQUF5QjtBQUN6Qjs7QUFFQTtBQUNBLGtCQUFrQiwrQ0FBK0M7QUFDakU7O0FBRUE7QUFDQSxrQkFBa0IsK0NBQStDO0FBQ2pFOztBQUVBO0FBQ0Esa0JBQWtCLCtDQUErQztBQUNqRTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLHdDQUF3QztBQUN2RCxlQUFlLFFBQVE7QUFDdkIsZUFBZSx1Q0FBdUM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSwyQkFBMkIsa0JBQWtCO0FBQzdDO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkIsa0JBQWtCO0FBQzdDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2QkFBNkIsaUVBQWlFO0FBQzlGOztBQUVBO0FBQ0E7QUFDQSxlQUFlLHdDQUF3QztBQUN2RCxlQUFlLFFBQVE7QUFDdkIsZUFBZSxTQUFTO0FBQ3hCLGVBQWUsU0FBUztBQUN4QixlQUFlLFNBQVM7QUFDeEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSxvQkFBb0IsZUFBZTtBQUNuQzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixrQkFBa0I7QUFDMUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixrQkFBa0I7QUFDMUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbk5BO0FBQ1k7O0FBRVosQ0FBd0M7QUFDZ0I7QUFDbUM7O0FBRTNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyw0Q0FBNEMsaURBQUs7QUFDeEQsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0Isb0RBQW9EO0FBQ3RFOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjs7QUFFQSxvQkFBb0IsaUJBQWlCO0FBQ3JDOztBQUVBLG9CQUFvQixTQUFTO0FBQzdCO0FBQ0Esd0JBQXdCLGtCQUFrQjs7QUFFMUMsb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsZ0NBQWdDO0FBQ2xEOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUIsaUNBQWlDO0FBQ3BELHVCQUF1QixvR0FBOEI7QUFDckQ7O0FBRUE7QUFDQSxlQUFlLDJDQUEyQztBQUMxRCxlQUFlLDBDQUEwQztBQUN6RCxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsUUFBUTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCLHFFQUFlO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2QkFBNkIsMkNBQTJDO0FBQ3hFO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzFHQTtBQUNZOztBQUVaLENBQXdDO0FBQ2dCO0FBQzZCOztBQUVyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sb0NBQW9DLGlEQUFLO0FBQ2hELGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLHlFQUF5RTtBQUMzRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsNEJBQTRCO0FBQ2hEOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQ0FBZ0M7QUFDbEQ7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixnQ0FBZ0M7QUFDbEQ7QUFDQTs7QUFFQTtBQUNBLGVBQWUsMkNBQTJDO0FBQzFELGVBQWUsMENBQTBDO0FBQ3pELGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNCQUFzQixxRUFBZTtBQUNyQztBQUNBO0FBQ0EsMENBQTBDLDRCQUE0QjtBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHdCQUF3Qiw4RkFBMkI7O0FBRW5EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2QkFBNkIsaUVBQWlFO0FBQzlGO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3SEE7QUFDWTs7QUFFWixDQUF3Qzs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDTywwQkFBMEIsaURBQUs7QUFDdEMsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLHlFQUF5RTtBQUMzRjs7QUFFQTtBQUNBLGtCQUFrQix5RUFBeUU7QUFDM0Y7O0FBRUE7QUFDQSxrQkFBa0IseUVBQXlFO0FBQzNGOztBQUVBO0FBQ0Esa0JBQWtCLG1HQUFtRztBQUNySDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsd0NBQXdDO0FBQ3ZELGVBQWUsdUNBQXVDO0FBQ3RELGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2QkFBNkIsaUVBQWlFO0FBQzlGO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3RJQTtBQUNZOztBQUVaLENBQTBDO0FBQ3dDO0FBQ0E7O0FBRWxGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSxlQUFlLG9EQUFvRDtBQUNuRSxlQUFlLGdCQUFnQjtBQUMvQixlQUFlLGdCQUFnQjtBQUMvQixlQUFlLFFBQVE7QUFDdkIsaUJBQWlCO0FBQ2pCO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0Isa0NBQWtDO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBLDJCQUEyQiwyREFBSztBQUNoQztBQUNBO0FBQ0Esd0JBQXdCLG1CQUFtQjs7QUFFM0MsOEJBQThCLDRGQUE2QjtBQUMzRDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOEJBQThCLG9EQUFTO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNwRUE7QUFDWTs7QUFFWixDQUF3Qzs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDTyx3QkFBd0IsaURBQUs7QUFDcEMsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLDRFQUE0RTtBQUM5Rjs7QUFFQTtBQUNBLGtCQUFrQiw0RUFBNEU7QUFDOUY7O0FBRUE7QUFDQSxrQkFBa0IsMkVBQTJFO0FBQzdGOztBQUVBO0FBQ0Esa0JBQWtCLDRFQUE0RTtBQUM5Rjs7QUFFQTtBQUNBLGtCQUFrQiw0RUFBNEU7QUFDOUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHdDQUF3QztBQUN2RCxlQUFlLHVDQUF1QztBQUN0RCxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2QkFBNkIsaUVBQWlFO0FBQzlGOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsZ0JBQWdCO0FBQy9CLGVBQWUscUNBQXFDO0FBQ3BELGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDN0dBO0FBQ1k7O0FBRVosQ0FBd0M7O0FBRXhDLGNBQWMsd0NBQXdDOztBQUV0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLDhCQUE4QixpREFBSztBQUMxQyxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDOztBQUVBO0FBQ0Esa0JBQWtCLDBCQUEwQjtBQUM1Qzs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLGtFQUFrRTtBQUNwRjtBQUNBLG1CQUFtQixrRUFBa0U7QUFDckY7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixrRUFBa0U7QUFDcEY7QUFDQSxtQkFBbUIsa0VBQWtFO0FBQ3JGO0FBQ0EsbUJBQW1CLDJFQUEyRTtBQUM5Rjs7QUFFQTtBQUNBLGtCQUFrQiw0RUFBNEU7QUFDOUY7O0FBRUE7QUFDQSxrQkFBa0IsNEVBQTRFO0FBQzlGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSwyQ0FBMkM7QUFDMUQsZUFBZSwwQ0FBMEM7QUFDekQsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTs7QUFFQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsUUFBUTtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0QkFBNEIsUUFBUTtBQUNwQzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7O0FBRUE7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZCQUE2QixpRUFBaUU7QUFDOUY7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3TkE7QUFDWTs7QUFFWixDQUFpRTtBQUNqQzs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSxlQUFlLHVCQUF1QjtBQUN0QztBQUNBO0FBQ0E7QUFDQTs7QUFFQSx1QkFBdUIsaUVBQWlCO0FBQ3hDO0FBQ0EsWUFBWSw0REFBWTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDREQUFZO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLG9EQUFLO0FBQ3hCLHNCQUFzQjtBQUN0Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3JIQTtBQUNZOztBQUVaLENBQWlFO0FBQ2pDOztBQUVoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlLEdBQUc7QUFDbEIsZUFBZSxnQkFBZ0I7QUFDL0IsZ0JBQWdCLDBCQUEwQjtBQUMxQyxlQUFlLFFBQVE7QUFDdkIsZUFBZSxrQkFBa0I7QUFDakM7QUFDQTtBQUNBLG1CQUFtQix1QkFBdUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLGFBQWE7QUFDaEMsd0JBQXdCLDREQUFZO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDLDhCQUE4QjtBQUM5QixpQ0FBaUM7QUFDakM7QUFDQTtBQUNBLGdDQUFnQyxtQkFBbUIsdUNBQXVDO0FBQzFGO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsOEJBQThCOztBQUU5QjtBQUNBO0FBQ0E7QUFDQSwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBLHNFQUFzRTtBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QyxxRkFBcUY7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEMsZ0dBQWdHO0FBQ2hHO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0EscUVBQXFFO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTREO0FBQzVELGdHQUFnRztBQUNoRztBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQTtBQUNBLG1GQUFtRjtBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RDtBQUM1RCw0R0FBNEc7QUFDNUc7QUFDQSxjQUFjO0FBQ2Q7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQSxVQUFVO0FBQ1YsMENBQTBDO0FBQzFDOztBQUVBO0FBQ0EsNERBQTRELGdCQUFnQjtBQUM1RSxpRUFBaUUsZ0JBQWdCO0FBQ2pGO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQyxxQ0FBcUM7QUFDckMscURBQXFELE9BQU8sT0FBTyxrQkFBa0I7QUFDckYsNEJBQTRCLFFBQVE7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQSwyQkFBMkIsc0JBQXNCLGdCQUFnQixxQ0FBcUM7QUFDdEc7O0FBRUE7QUFDQSxrR0FBa0c7QUFDbEc7QUFDQSw2REFBNkQ7O0FBRTdEOztBQUVBLG1CQUFtQixhQUFhO0FBQ2hDLHdCQUF3Qiw0REFBWTs7QUFFcEMsbUJBQW1CLGNBQWM7QUFDakMsdUJBQXVCLGlFQUFpQjtBQUN4Qzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHdCQUF3QixtQkFBbUI7QUFDM0Msc0JBQXNCLG9EQUFLOztBQUUzQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyT0E7QUFDWTs7QUFFWixDQUFpRTtBQUNqQzs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSxlQUFlLGdCQUFnQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDOztBQUVBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLG1CQUFtQjtBQUM3RDtBQUNBO0FBQ0Esd0JBQXdCLG1CQUFtQjtBQUMzQztBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQSx3QkFBd0IsbUJBQW1CO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQSwrREFBK0QsR0FBRztBQUNsRTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQixhQUFhO0FBQ2hDLHdCQUF3Qiw0REFBWTs7QUFFcEMsbUJBQW1CLGFBQWE7QUFDaEMsd0JBQXdCLDREQUFZOztBQUVwQyxtQkFBbUIsY0FBYztBQUNqQyx3QkFBd0IsaUVBQWlCO0FBQ3pDOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx3QkFBd0Isd0JBQXdCO0FBQ2hELHNCQUFzQixvREFBSztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDcElBO0FBQ1k7O0FBRVosQ0FBc0M7QUFDRTs7QUFFeEM7QUFDQTtBQUNBLGFBQWEseUJBQXlCOztBQUV0QztBQUNBO0FBQ0EsYUFBYSx5QkFBeUI7O0FBRXRDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLDBPQUEwTztBQUN2UCxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxvREFBRztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsaUlBQWlJO0FBQzlJLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isb0RBQWE7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHFCQUFxQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsbUtBQW1LO0FBQ2hMLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUIsMkNBQTJDO0FBQzlELHVCQUF1QixvREFBTTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGFBQWE7QUFDekM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsbUpBQW1KO0FBQ2hLLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxxQkFBcUI7QUFDbkM7QUFDQTs7QUFFQSxrQkFBa0Isb0RBQWE7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxnQkFBZ0I7QUFDM0I7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxnQkFBZ0I7QUFDM0IsV0FBVyxnQkFBZ0I7QUFDM0I7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcseUJBQXlCO0FBQ3BDLFdBQVcsUUFBUTtBQUNuQjtBQUNPO0FBQ1A7QUFDQTtBQUNBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDek5BO0FBQ1k7O0FBRVo7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdCQUF3QixXQUFXO0FBQ25DO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBLHlCQUF5QixZQUFZO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdkhBO0FBQ1k7O0FBRVosQ0FBK0M7O0FBRXhDLCtEQUErRDtBQUN0RTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFTyw0RUFBNEU7QUFDbkY7QUFDQTs7QUFFQTtBQUNBLDBEQUEwRCxzREFBYzs7QUFFeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7O0FBS0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHNFQUFzRTtBQUN0RTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdUVBQXVFO0FBQ3ZFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQy9NQTtBQUNZOztBQUVaO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLGdCQUFnQjtBQUMzQjtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixtQkFBbUI7QUFDdkM7QUFDQTs7QUFFQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DLG9DQUFvQztBQUNwQztBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6REE7QUFDWTs7QUFFWjtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGNBQWM7QUFDZDtBQUNPLGlEQUFpRDtBQUN4RDtBQUNBO0FBQ0E7QUFDQSxlQUFlLHVCQUF1QjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHVCQUF1QjtBQUNsQyxZQUFZLGdCQUFnQjtBQUM1QixhQUFhO0FBQ2I7QUFDTztBQUNQLGVBQWUsbUJBQW1CO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcsUUFBUTtBQUNuQixZQUFZLFdBQVc7QUFDdkIsYUFBYTtBQUNiO0FBQ087QUFDUCxlQUFlLGtCQUFrQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7Ozs7Ozs7VUN2RUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTs7Ozs7V0N0QkE7V0FDQTtXQUNBO1dBQ0E7V0FDQSx5Q0FBeUMsd0NBQXdDO1dBQ2pGO1dBQ0E7V0FDQTs7Ozs7V0NQQTs7Ozs7V0NBQTtXQUNBO1dBQ0E7V0FDQSx1REFBdUQsaUJBQWlCO1dBQ3hFO1dBQ0EsZ0RBQWdELGFBQWE7V0FDN0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQUNZOztBQUVaO0FBQ21DO0FBQ1k7QUFDUjtBQUNBO0FBQ0k7QUFDOEI7O0FBRXpFO0FBQ2tEO0FBQ0o7QUFDRjs7QUFFNUM7QUFDb0U7QUFDaEI7QUFDRTtBQUNRO0FBQ1I7QUFDTjtBQUNJO0FBQ0o7QUFDaEQsV0FBVyxlQUFlO0FBQ3NDO0FBQ0o7QUFDUjtBQUNKO0FBQ3dCO0FBQ2dCO0FBQ3BDO0FBQ007QUFDRTtBQUNKO0FBQ047O0FBRWxEO0FBQ2dEO0FBQ1k7QUFDTTtBQUNJO0FBQ3BCO0FBQ0k7O0FBRXREO0FBQ3FEO0FBQ2dCO0FBQ0E7QUFPdEM7QUFDcUQ7QUFDM0I7O0FBRXpELFlBQVksdUJBQXVCO0FBQ0U7QUFDTDtBQUNFO0FBQ0s7O0FBRXZDLENBQStDO0FBQ3hDLDJCQUEyQix5REFBUzs7QUFFM0M7QUFDQSxDQUErQztBQUMvQyxzREFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZHZpei93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvYXNjZW5kaW5nLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2Jpc2VjdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9iaXNlY3Rvci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9kZXNjZW5kaW5nLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2V4dGVudC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9ncmVhdGVzdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tYXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbWF4SW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbWluLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21pbkluZGV4LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL251bWJlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9wZXJtdXRlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3F1YW50aWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3F1aWNrc2VsZWN0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3NvcnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvY29sb3IuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvZGVmaW5lLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtY29sb3Ivc3JjL2xhYi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9tYXRoLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZGlzcGF0Y2gvc3JjL2Rpc3BhdGNoLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvbm9kcmFnLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvbm9ldmVudC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWRzdi9zcmMvY3N2LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZHN2L3NyYy9kc3YuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1kc3Yvc3JjL3Rzdi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL2N1YmljLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZmV0Y2gvc3JjL2Rzdi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZldGNoL3NyYy9qc29uLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZmV0Y2gvc3JjL3RleHQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2RlZmF1bHRMb2NhbGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2V4cG9uZW50LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXREZWNpbWFsLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRHcm91cC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0TnVtZXJhbHMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFByZWZpeEF1dG8uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFJvdW5kZWQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFNwZWNpZmllci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0VHJpbS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0VHlwZXMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2lkZW50aXR5LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9sb2NhbGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvYmFzaXMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvYmFzaXNDbG9zZWQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvY29sb3IuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvY29uc3RhbnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvbGFiLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL251bWJlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9yZ2IuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvc3RyaW5nLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9kZWNvbXBvc2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL2luZGV4LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9wYXJzZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy96b29tLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtcmFuZG9tL3NyYy9kZWZhdWx0U291cmNlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtcmFuZG9tL3NyYy9ub3JtYWwuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvaW5pdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9xdWFudGlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvYXJyYXkuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2NvbnN0YW50LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9jcmVhdG9yLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9tYXRjaGVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9uYW1lc3BhY2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL25hbWVzcGFjZXMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3BvaW50ZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2FwcGVuZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2F0dHIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9jYWxsLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2xhc3NlZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2Nsb25lLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZGF0YS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2RhdHVtLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZGlzcGF0Y2guanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lYWNoLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZW1wdHkuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lbnRlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2V4aXQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9odG1sLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pbnNlcnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2pvaW4uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9sb3dlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL21lcmdlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbm9kZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL25vZGVzLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vb24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9vcmRlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3Byb3BlcnR5LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vcmFpc2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9yZW1vdmUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3QuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3RBbGwuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3RDaGlsZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdENoaWxkcmVuLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2l6ZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NvcnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zcGFyc2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3RleHQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdG9yLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3RvckFsbC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc291cmNlRXZlbnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3dpbmRvdy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRpbWVyL3NyYy90aW1lb3V0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdGltZXIvc3JjL3RpbWVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvYWN0aXZlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9pbnRlcnJ1cHQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vaW50ZXJydXB0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL3RyYW5zaXRpb24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2F0dHIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2F0dHJUd2Vlbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZGVsYXkuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2R1cmF0aW9uLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lYXNlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lYXNlVmFyeWluZy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZW5kLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2luZGV4LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9pbnRlcnBvbGF0ZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vbWVyZ2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL29uLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9yZW1vdmUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NjaGVkdWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zZWxlY3QuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdEFsbC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2VsZWN0aW9uLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc3R5bGVUd2Vlbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdGV4dC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdGV4dFR3ZWVuLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90cmFuc2l0aW9uLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90d2Vlbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL2NvbnN0YW50LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvZXZlbnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL25vZXZlbnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy90cmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy96b29tLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvYnV0dG9uL0J1dHRvbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2J1dHRvbi9GdWxsc2NyZWVuQnV0dG9uLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvYnV0dG9uL1pvb21CdXR0b25zLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvY29yZS9EYXRhc2V0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvY29yZS9EcmF3YWJsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2NvcmUvR2VvQ2FudmFzLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvY29yZS9MYXllci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2NvcmUvTGVnZW5kLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvY29yZS9NYXAuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9jb3JlL011bHRpUmVzb2x1dGlvbkRhdGFzZXQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9jb3JlL1N0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvY29yZS9Ub29sdGlwLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvZGF0YXNldC9DU1ZHcmlkLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvZGF0YXNldC9KU0dyaWQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9kYXRhc2V0L1RpbGVkR3JpZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xheWVyL0JhY2tncm91bmRMYXllci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xheWVyL0JhY2tncm91bmRMYXllckltYWdlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGF5ZXIvQmFja2dyb3VuZExheWVyV01TLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGF5ZXIvR2VvSlNPTkxheWVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGF5ZXIvR3JpZExheWVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGF5ZXIvTGFiZWxMYXllci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xlZ2VuZC9Db2xvckNhdGVnb3J5TGVnZW5kLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGVnZW5kL0NvbG9yRGlzY3JldGVMZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sZWdlbmQvQ29sb3JMZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sZWdlbmQvT3JpZW50YXRpb25MZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sZWdlbmQvU2l6ZUxlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xlZ2VuZC9UZXJuYXJ5TGVnZW5kLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvQ29tcG9zaXRpb25TdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL0RvdERlbnNpdHlTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL0ltYWdlU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9Jc29GZW5jZVN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvSm95UGxvdFN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvTGVnb1N0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvTW9zYWljU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9OaW5qYVN0YXJTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1BpbGxhclN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvU2VnbWVudFN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvU2hhcGVDb2xvclNpemVTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1NpZGVDYXRlZ29yeVN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvU2lkZVN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9TcXVhcmVDb2xvcldlYkdMU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9TdHJva2VTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1RhbmFrYVN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvVGV4dFN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvVGltZVNlcmllc1N0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3V0aWxzL1dlYkdMU3F1YXJlQ29sb3JpbmdBZHZhbmNlZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3V0aWxzL1dlYkdMU3F1YXJlQ29sb3JpbmdDYXRBZHZhbmNlZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3V0aWxzL3NjYWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvdXRpbHMvc3RyZXRjaGluZy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3V0aWxzL3Rlcm5hcnkuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy91dGlscy91dGlscy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3V0aWxzL3dlYkdMVXRpbHMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9ncmlkdml6L3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9ncmlkdml6L3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vZ3JpZHZpei93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiZ3JpZHZpelwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJncmlkdml6XCJdID0gZmFjdG9yeSgpO1xufSkoc2VsZiwgKCkgPT4ge1xucmV0dXJuICIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7XG4gIHJldHVybiBhID09IG51bGwgfHwgYiA9PSBudWxsID8gTmFOIDogYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47XG59XG4iLCJpbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuL2FzY2VuZGluZy5qc1wiO1xuaW1wb3J0IGJpc2VjdG9yIGZyb20gXCIuL2Jpc2VjdG9yLmpzXCI7XG5pbXBvcnQgbnVtYmVyIGZyb20gXCIuL251bWJlci5qc1wiO1xuXG5jb25zdCBhc2NlbmRpbmdCaXNlY3QgPSBiaXNlY3Rvcihhc2NlbmRpbmcpO1xuZXhwb3J0IGNvbnN0IGJpc2VjdFJpZ2h0ID0gYXNjZW5kaW5nQmlzZWN0LnJpZ2h0O1xuZXhwb3J0IGNvbnN0IGJpc2VjdExlZnQgPSBhc2NlbmRpbmdCaXNlY3QubGVmdDtcbmV4cG9ydCBjb25zdCBiaXNlY3RDZW50ZXIgPSBiaXNlY3RvcihudW1iZXIpLmNlbnRlcjtcbmV4cG9ydCBkZWZhdWx0IGJpc2VjdFJpZ2h0O1xuIiwiaW1wb3J0IGFzY2VuZGluZyBmcm9tIFwiLi9hc2NlbmRpbmcuanNcIjtcbmltcG9ydCBkZXNjZW5kaW5nIGZyb20gXCIuL2Rlc2NlbmRpbmcuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmlzZWN0b3IoZikge1xuICBsZXQgY29tcGFyZTEsIGNvbXBhcmUyLCBkZWx0YTtcblxuICAvLyBJZiBhbiBhY2Nlc3NvciBpcyBzcGVjaWZpZWQsIHByb21vdGUgaXQgdG8gYSBjb21wYXJhdG9yLiBJbiB0aGlzIGNhc2Ugd2VcbiAgLy8gY2FuIHRlc3Qgd2hldGhlciB0aGUgc2VhcmNoIHZhbHVlIGlzIChzZWxmLSkgY29tcGFyYWJsZS4gV2UgY2Fu4oCZdCBkbyB0aGlzXG4gIC8vIGZvciBhIGNvbXBhcmF0b3IgKGV4Y2VwdCBmb3Igc3BlY2lmaWMsIGtub3duIGNvbXBhcmF0b3JzKSBiZWNhdXNlIHdlIGNhbuKAmXRcbiAgLy8gdGVsbCBpZiB0aGUgY29tcGFyYXRvciBpcyBzeW1tZXRyaWMsIGFuZCBhbiBhc3ltbWV0cmljIGNvbXBhcmF0b3IgY2Fu4oCZdCBiZVxuICAvLyB1c2VkIHRvIHRlc3Qgd2hldGhlciBhIHNpbmdsZSB2YWx1ZSBpcyBjb21wYXJhYmxlLlxuICBpZiAoZi5sZW5ndGggIT09IDIpIHtcbiAgICBjb21wYXJlMSA9IGFzY2VuZGluZztcbiAgICBjb21wYXJlMiA9IChkLCB4KSA9PiBhc2NlbmRpbmcoZihkKSwgeCk7XG4gICAgZGVsdGEgPSAoZCwgeCkgPT4gZihkKSAtIHg7XG4gIH0gZWxzZSB7XG4gICAgY29tcGFyZTEgPSBmID09PSBhc2NlbmRpbmcgfHwgZiA9PT0gZGVzY2VuZGluZyA/IGYgOiB6ZXJvO1xuICAgIGNvbXBhcmUyID0gZjtcbiAgICBkZWx0YSA9IGY7XG4gIH1cblxuICBmdW5jdGlvbiBsZWZ0KGEsIHgsIGxvID0gMCwgaGkgPSBhLmxlbmd0aCkge1xuICAgIGlmIChsbyA8IGhpKSB7XG4gICAgICBpZiAoY29tcGFyZTEoeCwgeCkgIT09IDApIHJldHVybiBoaTtcbiAgICAgIGRvIHtcbiAgICAgICAgY29uc3QgbWlkID0gKGxvICsgaGkpID4+PiAxO1xuICAgICAgICBpZiAoY29tcGFyZTIoYVttaWRdLCB4KSA8IDApIGxvID0gbWlkICsgMTtcbiAgICAgICAgZWxzZSBoaSA9IG1pZDtcbiAgICAgIH0gd2hpbGUgKGxvIDwgaGkpO1xuICAgIH1cbiAgICByZXR1cm4gbG87XG4gIH1cblxuICBmdW5jdGlvbiByaWdodChhLCB4LCBsbyA9IDAsIGhpID0gYS5sZW5ndGgpIHtcbiAgICBpZiAobG8gPCBoaSkge1xuICAgICAgaWYgKGNvbXBhcmUxKHgsIHgpICE9PSAwKSByZXR1cm4gaGk7XG4gICAgICBkbyB7XG4gICAgICAgIGNvbnN0IG1pZCA9IChsbyArIGhpKSA+Pj4gMTtcbiAgICAgICAgaWYgKGNvbXBhcmUyKGFbbWlkXSwgeCkgPD0gMCkgbG8gPSBtaWQgKyAxO1xuICAgICAgICBlbHNlIGhpID0gbWlkO1xuICAgICAgfSB3aGlsZSAobG8gPCBoaSk7XG4gICAgfVxuICAgIHJldHVybiBsbztcbiAgfVxuXG4gIGZ1bmN0aW9uIGNlbnRlcihhLCB4LCBsbyA9IDAsIGhpID0gYS5sZW5ndGgpIHtcbiAgICBjb25zdCBpID0gbGVmdChhLCB4LCBsbywgaGkgLSAxKTtcbiAgICByZXR1cm4gaSA+IGxvICYmIGRlbHRhKGFbaSAtIDFdLCB4KSA+IC1kZWx0YShhW2ldLCB4KSA/IGkgLSAxIDogaTtcbiAgfVxuXG4gIHJldHVybiB7bGVmdCwgY2VudGVyLCByaWdodH07XG59XG5cbmZ1bmN0aW9uIHplcm8oKSB7XG4gIHJldHVybiAwO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGVzY2VuZGluZyhhLCBiKSB7XG4gIHJldHVybiBhID09IG51bGwgfHwgYiA9PSBudWxsID8gTmFOXG4gICAgOiBiIDwgYSA/IC0xXG4gICAgOiBiID4gYSA/IDFcbiAgICA6IGIgPj0gYSA/IDBcbiAgICA6IE5hTjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGV4dGVudCh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1pbjtcbiAgbGV0IG1heDtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICBpZiAobWluID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPj0gdmFsdWUpIG1pbiA9IG1heCA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChtaW4gPiB2YWx1ZSkgbWluID0gdmFsdWU7XG4gICAgICAgICAgaWYgKG1heCA8IHZhbHVlKSBtYXggPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsKSB7XG4gICAgICAgIGlmIChtaW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICh2YWx1ZSA+PSB2YWx1ZSkgbWluID0gbWF4ID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG1pbiA+IHZhbHVlKSBtaW4gPSB2YWx1ZTtcbiAgICAgICAgICBpZiAobWF4IDwgdmFsdWUpIG1heCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbbWluLCBtYXhdO1xufVxuIiwiaW1wb3J0IGFzY2VuZGluZyBmcm9tIFwiLi9hc2NlbmRpbmcuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ3JlYXRlc3QodmFsdWVzLCBjb21wYXJlID0gYXNjZW5kaW5nKSB7XG4gIGxldCBtYXg7XG4gIGxldCBkZWZpbmVkID0gZmFsc2U7XG4gIGlmIChjb21wYXJlLmxlbmd0aCA9PT0gMSkge1xuICAgIGxldCBtYXhWYWx1ZTtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdmFsdWVzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbXBhcmUoZWxlbWVudCk7XG4gICAgICBpZiAoZGVmaW5lZFxuICAgICAgICAgID8gYXNjZW5kaW5nKHZhbHVlLCBtYXhWYWx1ZSkgPiAwXG4gICAgICAgICAgOiBhc2NlbmRpbmcodmFsdWUsIHZhbHVlKSA9PT0gMCkge1xuICAgICAgICBtYXggPSBlbGVtZW50O1xuICAgICAgICBtYXhWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBkZWZpbmVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmIChkZWZpbmVkXG4gICAgICAgICAgPyBjb21wYXJlKHZhbHVlLCBtYXgpID4gMFxuICAgICAgICAgIDogY29tcGFyZSh2YWx1ZSwgdmFsdWUpID09PSAwKSB7XG4gICAgICAgIG1heCA9IHZhbHVlO1xuICAgICAgICBkZWZpbmVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1heDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1heCh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1heDtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1heDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1heEluZGV4KHZhbHVlcywgdmFsdWVvZikge1xuICBsZXQgbWF4O1xuICBsZXQgbWF4SW5kZXggPSAtMTtcbiAgbGV0IGluZGV4ID0gLTE7XG4gIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgKytpbmRleDtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsXG4gICAgICAgICAgJiYgKG1heCA8IHZhbHVlIHx8IChtYXggPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpKSB7XG4gICAgICAgIG1heCA9IHZhbHVlLCBtYXhJbmRleCA9IGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsXG4gICAgICAgICAgJiYgKG1heCA8IHZhbHVlIHx8IChtYXggPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpKSB7XG4gICAgICAgIG1heCA9IHZhbHVlLCBtYXhJbmRleCA9IGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbWF4SW5kZXg7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtaW4odmFsdWVzLCB2YWx1ZW9mKSB7XG4gIGxldCBtaW47XG4gIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGxcbiAgICAgICAgICAmJiAobWluID4gdmFsdWUgfHwgKG1pbiA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWluID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBpbmRleCA9IC0xO1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWUsICsraW5kZXgsIHZhbHVlcykpICE9IG51bGxcbiAgICAgICAgICAmJiAobWluID4gdmFsdWUgfHwgKG1pbiA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWluID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtaW47XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtaW5JbmRleCh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1pbjtcbiAgbGV0IG1pbkluZGV4ID0gLTE7XG4gIGxldCBpbmRleCA9IC0xO1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICsraW5kZXg7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbFxuICAgICAgICAgICYmIChtaW4gPiB2YWx1ZSB8fCAobWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtaW4gPSB2YWx1ZSwgbWluSW5kZXggPSBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbFxuICAgICAgICAgICYmIChtaW4gPiB2YWx1ZSB8fCAobWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtaW4gPSB2YWx1ZSwgbWluSW5kZXggPSBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1pbkluZGV4O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbnVtYmVyKHgpIHtcbiAgcmV0dXJuIHggPT09IG51bGwgPyBOYU4gOiAreDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBudW1iZXJzKHZhbHVlcywgdmFsdWVvZikge1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAodmFsdWUgPSArdmFsdWUpID49IHZhbHVlKSB7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsICYmICh2YWx1ZSA9ICt2YWx1ZSkgPj0gdmFsdWUpIHtcbiAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwZXJtdXRlKHNvdXJjZSwga2V5cykge1xuICByZXR1cm4gQXJyYXkuZnJvbShrZXlzLCBrZXkgPT4gc291cmNlW2tleV0pO1xufVxuIiwiaW1wb3J0IG1heCBmcm9tIFwiLi9tYXguanNcIjtcbmltcG9ydCBtYXhJbmRleCBmcm9tIFwiLi9tYXhJbmRleC5qc1wiO1xuaW1wb3J0IG1pbiBmcm9tIFwiLi9taW4uanNcIjtcbmltcG9ydCBtaW5JbmRleCBmcm9tIFwiLi9taW5JbmRleC5qc1wiO1xuaW1wb3J0IHF1aWNrc2VsZWN0IGZyb20gXCIuL3F1aWNrc2VsZWN0LmpzXCI7XG5pbXBvcnQgbnVtYmVyLCB7bnVtYmVyc30gZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5pbXBvcnQge2FzY2VuZGluZ0RlZmluZWR9IGZyb20gXCIuL3NvcnQuanNcIjtcbmltcG9ydCBncmVhdGVzdCBmcm9tIFwiLi9ncmVhdGVzdC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWFudGlsZSh2YWx1ZXMsIHAsIHZhbHVlb2YpIHtcbiAgdmFsdWVzID0gRmxvYXQ2NEFycmF5LmZyb20obnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpKTtcbiAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpIHx8IGlzTmFOKHAgPSArcCkpIHJldHVybjtcbiAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuIG1pbih2YWx1ZXMpO1xuICBpZiAocCA+PSAxKSByZXR1cm4gbWF4KHZhbHVlcyk7XG4gIHZhciBuLFxuICAgICAgaSA9IChuIC0gMSkgKiBwLFxuICAgICAgaTAgPSBNYXRoLmZsb29yKGkpLFxuICAgICAgdmFsdWUwID0gbWF4KHF1aWNrc2VsZWN0KHZhbHVlcywgaTApLnN1YmFycmF5KDAsIGkwICsgMSkpLFxuICAgICAgdmFsdWUxID0gbWluKHZhbHVlcy5zdWJhcnJheShpMCArIDEpKTtcbiAgcmV0dXJuIHZhbHVlMCArICh2YWx1ZTEgLSB2YWx1ZTApICogKGkgLSBpMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWFudGlsZVNvcnRlZCh2YWx1ZXMsIHAsIHZhbHVlb2YgPSBudW1iZXIpIHtcbiAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpIHx8IGlzTmFOKHAgPSArcCkpIHJldHVybjtcbiAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1swXSwgMCwgdmFsdWVzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1tuIC0gMV0sIG4gLSAxLCB2YWx1ZXMpO1xuICB2YXIgbixcbiAgICAgIGkgPSAobiAtIDEpICogcCxcbiAgICAgIGkwID0gTWF0aC5mbG9vcihpKSxcbiAgICAgIHZhbHVlMCA9ICt2YWx1ZW9mKHZhbHVlc1tpMF0sIGkwLCB2YWx1ZXMpLFxuICAgICAgdmFsdWUxID0gK3ZhbHVlb2YodmFsdWVzW2kwICsgMV0sIGkwICsgMSwgdmFsdWVzKTtcbiAgcmV0dXJuIHZhbHVlMCArICh2YWx1ZTEgLSB2YWx1ZTApICogKGkgLSBpMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWFudGlsZUluZGV4KHZhbHVlcywgcCwgdmFsdWVvZiA9IG51bWJlcikge1xuICBpZiAoaXNOYU4ocCA9ICtwKSkgcmV0dXJuO1xuICBudW1iZXJzID0gRmxvYXQ2NEFycmF5LmZyb20odmFsdWVzLCAoXywgaSkgPT4gbnVtYmVyKHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSk7XG4gIGlmIChwIDw9IDApIHJldHVybiBtaW5JbmRleChudW1iZXJzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuIG1heEluZGV4KG51bWJlcnMpO1xuICB2YXIgbnVtYmVycyxcbiAgICAgIGluZGV4ID0gVWludDMyQXJyYXkuZnJvbSh2YWx1ZXMsIChfLCBpKSA9PiBpKSxcbiAgICAgIGogPSBudW1iZXJzLmxlbmd0aCAtIDEsXG4gICAgICBpID0gTWF0aC5mbG9vcihqICogcCk7XG4gIHF1aWNrc2VsZWN0KGluZGV4LCBpLCAwLCBqLCAoaSwgaikgPT4gYXNjZW5kaW5nRGVmaW5lZChudW1iZXJzW2ldLCBudW1iZXJzW2pdKSk7XG4gIGkgPSBncmVhdGVzdChpbmRleC5zdWJhcnJheSgwLCBpICsgMSksIChpKSA9PiBudW1iZXJzW2ldKTtcbiAgcmV0dXJuIGkgPj0gMCA/IGkgOiAtMTtcbn1cbiIsImltcG9ydCB7YXNjZW5kaW5nRGVmaW5lZCwgY29tcGFyZURlZmluZWR9IGZyb20gXCIuL3NvcnQuanNcIjtcblxuLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL21vdXJuZXIvcXVpY2tzZWxlY3Rcbi8vIElTQyBsaWNlbnNlLCBDb3B5cmlnaHQgMjAxOCBWbGFkaW1pciBBZ2Fmb25raW4uXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWlja3NlbGVjdChhcnJheSwgaywgbGVmdCA9IDAsIHJpZ2h0ID0gSW5maW5pdHksIGNvbXBhcmUpIHtcbiAgayA9IE1hdGguZmxvb3Ioayk7XG4gIGxlZnQgPSBNYXRoLmZsb29yKE1hdGgubWF4KDAsIGxlZnQpKTtcbiAgcmlnaHQgPSBNYXRoLmZsb29yKE1hdGgubWluKGFycmF5Lmxlbmd0aCAtIDEsIHJpZ2h0KSk7XG5cbiAgaWYgKCEobGVmdCA8PSBrICYmIGsgPD0gcmlnaHQpKSByZXR1cm4gYXJyYXk7XG5cbiAgY29tcGFyZSA9IGNvbXBhcmUgPT09IHVuZGVmaW5lZCA/IGFzY2VuZGluZ0RlZmluZWQgOiBjb21wYXJlRGVmaW5lZChjb21wYXJlKTtcblxuICB3aGlsZSAocmlnaHQgPiBsZWZ0KSB7XG4gICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkge1xuICAgICAgY29uc3QgbiA9IHJpZ2h0IC0gbGVmdCArIDE7XG4gICAgICBjb25zdCBtID0gayAtIGxlZnQgKyAxO1xuICAgICAgY29uc3QgeiA9IE1hdGgubG9nKG4pO1xuICAgICAgY29uc3QgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7XG4gICAgICBjb25zdCBzZCA9IDAuNSAqIE1hdGguc3FydCh6ICogcyAqIChuIC0gcykgLyBuKSAqIChtIC0gbiAvIDIgPCAwID8gLTEgOiAxKTtcbiAgICAgIGNvbnN0IG5ld0xlZnQgPSBNYXRoLm1heChsZWZ0LCBNYXRoLmZsb29yKGsgLSBtICogcyAvIG4gKyBzZCkpO1xuICAgICAgY29uc3QgbmV3UmlnaHQgPSBNYXRoLm1pbihyaWdodCwgTWF0aC5mbG9vcihrICsgKG4gLSBtKSAqIHMgLyBuICsgc2QpKTtcbiAgICAgIHF1aWNrc2VsZWN0KGFycmF5LCBrLCBuZXdMZWZ0LCBuZXdSaWdodCwgY29tcGFyZSk7XG4gICAgfVxuXG4gICAgY29uc3QgdCA9IGFycmF5W2tdO1xuICAgIGxldCBpID0gbGVmdDtcbiAgICBsZXQgaiA9IHJpZ2h0O1xuXG4gICAgc3dhcChhcnJheSwgbGVmdCwgayk7XG4gICAgaWYgKGNvbXBhcmUoYXJyYXlbcmlnaHRdLCB0KSA+IDApIHN3YXAoYXJyYXksIGxlZnQsIHJpZ2h0KTtcblxuICAgIHdoaWxlIChpIDwgaikge1xuICAgICAgc3dhcChhcnJheSwgaSwgaiksICsraSwgLS1qO1xuICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbaV0sIHQpIDwgMCkgKytpO1xuICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbal0sIHQpID4gMCkgLS1qO1xuICAgIH1cblxuICAgIGlmIChjb21wYXJlKGFycmF5W2xlZnRdLCB0KSA9PT0gMCkgc3dhcChhcnJheSwgbGVmdCwgaik7XG4gICAgZWxzZSArK2osIHN3YXAoYXJyYXksIGosIHJpZ2h0KTtcblxuICAgIGlmIChqIDw9IGspIGxlZnQgPSBqICsgMTtcbiAgICBpZiAoayA8PSBqKSByaWdodCA9IGogLSAxO1xuICB9XG5cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5mdW5jdGlvbiBzd2FwKGFycmF5LCBpLCBqKSB7XG4gIGNvbnN0IHQgPSBhcnJheVtpXTtcbiAgYXJyYXlbaV0gPSBhcnJheVtqXTtcbiAgYXJyYXlbal0gPSB0O1xufVxuIiwiaW1wb3J0IGFzY2VuZGluZyBmcm9tIFwiLi9hc2NlbmRpbmcuanNcIjtcbmltcG9ydCBwZXJtdXRlIGZyb20gXCIuL3Blcm11dGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc29ydCh2YWx1ZXMsIC4uLkYpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZXNbU3ltYm9sLml0ZXJhdG9yXSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwidmFsdWVzIGlzIG5vdCBpdGVyYWJsZVwiKTtcbiAgdmFsdWVzID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICBsZXQgW2ZdID0gRjtcbiAgaWYgKChmICYmIGYubGVuZ3RoICE9PSAyKSB8fCBGLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCBpbmRleCA9IFVpbnQzMkFycmF5LmZyb20odmFsdWVzLCAoZCwgaSkgPT4gaSk7XG4gICAgaWYgKEYubGVuZ3RoID4gMSkge1xuICAgICAgRiA9IEYubWFwKGYgPT4gdmFsdWVzLm1hcChmKSk7XG4gICAgICBpbmRleC5zb3J0KChpLCBqKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZiBvZiBGKSB7XG4gICAgICAgICAgY29uc3QgYyA9IGFzY2VuZGluZ0RlZmluZWQoZltpXSwgZltqXSk7XG4gICAgICAgICAgaWYgKGMpIHJldHVybiBjO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZiA9IHZhbHVlcy5tYXAoZik7XG4gICAgICBpbmRleC5zb3J0KChpLCBqKSA9PiBhc2NlbmRpbmdEZWZpbmVkKGZbaV0sIGZbal0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHBlcm11dGUodmFsdWVzLCBpbmRleCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlcy5zb3J0KGNvbXBhcmVEZWZpbmVkKGYpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVEZWZpbmVkKGNvbXBhcmUgPSBhc2NlbmRpbmcpIHtcbiAgaWYgKGNvbXBhcmUgPT09IGFzY2VuZGluZykgcmV0dXJuIGFzY2VuZGluZ0RlZmluZWQ7XG4gIGlmICh0eXBlb2YgY29tcGFyZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiY29tcGFyZSBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgcmV0dXJuIChhLCBiKSA9PiB7XG4gICAgY29uc3QgeCA9IGNvbXBhcmUoYSwgYik7XG4gICAgaWYgKHggfHwgeCA9PT0gMCkgcmV0dXJuIHg7XG4gICAgcmV0dXJuIChjb21wYXJlKGIsIGIpID09PSAwKSAtIChjb21wYXJlKGEsIGEpID09PSAwKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzY2VuZGluZ0RlZmluZWQoYSwgYikge1xuICByZXR1cm4gKGEgPT0gbnVsbCB8fCAhKGEgPj0gYSkpIC0gKGIgPT0gbnVsbCB8fCAhKGIgPj0gYikpIHx8IChhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCk7XG59XG4iLCJpbXBvcnQgZGVmaW5lLCB7ZXh0ZW5kfSBmcm9tIFwiLi9kZWZpbmUuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIENvbG9yKCkge31cblxuZXhwb3J0IHZhciBkYXJrZXIgPSAwLjc7XG5leHBvcnQgdmFyIGJyaWdodGVyID0gMSAvIGRhcmtlcjtcblxudmFyIHJlSSA9IFwiXFxcXHMqKFsrLV0/XFxcXGQrKVxcXFxzKlwiLFxuICAgIHJlTiA9IFwiXFxcXHMqKFsrLV0/KD86XFxcXGQqXFxcXC4pP1xcXFxkKyg/OltlRV1bKy1dP1xcXFxkKyk/KVxcXFxzKlwiLFxuICAgIHJlUCA9IFwiXFxcXHMqKFsrLV0/KD86XFxcXGQqXFxcXC4pP1xcXFxkKyg/OltlRV1bKy1dP1xcXFxkKyk/KSVcXFxccypcIixcbiAgICByZUhleCA9IC9eIyhbMC05YS1mXXszLDh9KSQvLFxuICAgIHJlUmdiSW50ZWdlciA9IG5ldyBSZWdFeHAoYF5yZ2JcXFxcKCR7cmVJfSwke3JlSX0sJHtyZUl9XFxcXCkkYCksXG4gICAgcmVSZ2JQZXJjZW50ID0gbmV3IFJlZ0V4cChgXnJnYlxcXFwoJHtyZVB9LCR7cmVQfSwke3JlUH1cXFxcKSRgKSxcbiAgICByZVJnYmFJbnRlZ2VyID0gbmV3IFJlZ0V4cChgXnJnYmFcXFxcKCR7cmVJfSwke3JlSX0sJHtyZUl9LCR7cmVOfVxcXFwpJGApLFxuICAgIHJlUmdiYVBlcmNlbnQgPSBuZXcgUmVnRXhwKGBecmdiYVxcXFwoJHtyZVB9LCR7cmVQfSwke3JlUH0sJHtyZU59XFxcXCkkYCksXG4gICAgcmVIc2xQZXJjZW50ID0gbmV3IFJlZ0V4cChgXmhzbFxcXFwoJHtyZU59LCR7cmVQfSwke3JlUH1cXFxcKSRgKSxcbiAgICByZUhzbGFQZXJjZW50ID0gbmV3IFJlZ0V4cChgXmhzbGFcXFxcKCR7cmVOfSwke3JlUH0sJHtyZVB9LCR7cmVOfVxcXFwpJGApO1xuXG52YXIgbmFtZWQgPSB7XG4gIGFsaWNlYmx1ZTogMHhmMGY4ZmYsXG4gIGFudGlxdWV3aGl0ZTogMHhmYWViZDcsXG4gIGFxdWE6IDB4MDBmZmZmLFxuICBhcXVhbWFyaW5lOiAweDdmZmZkNCxcbiAgYXp1cmU6IDB4ZjBmZmZmLFxuICBiZWlnZTogMHhmNWY1ZGMsXG4gIGJpc3F1ZTogMHhmZmU0YzQsXG4gIGJsYWNrOiAweDAwMDAwMCxcbiAgYmxhbmNoZWRhbG1vbmQ6IDB4ZmZlYmNkLFxuICBibHVlOiAweDAwMDBmZixcbiAgYmx1ZXZpb2xldDogMHg4YTJiZTIsXG4gIGJyb3duOiAweGE1MmEyYSxcbiAgYnVybHl3b29kOiAweGRlYjg4NyxcbiAgY2FkZXRibHVlOiAweDVmOWVhMCxcbiAgY2hhcnRyZXVzZTogMHg3ZmZmMDAsXG4gIGNob2NvbGF0ZTogMHhkMjY5MWUsXG4gIGNvcmFsOiAweGZmN2Y1MCxcbiAgY29ybmZsb3dlcmJsdWU6IDB4NjQ5NWVkLFxuICBjb3Juc2lsazogMHhmZmY4ZGMsXG4gIGNyaW1zb246IDB4ZGMxNDNjLFxuICBjeWFuOiAweDAwZmZmZixcbiAgZGFya2JsdWU6IDB4MDAwMDhiLFxuICBkYXJrY3lhbjogMHgwMDhiOGIsXG4gIGRhcmtnb2xkZW5yb2Q6IDB4Yjg4NjBiLFxuICBkYXJrZ3JheTogMHhhOWE5YTksXG4gIGRhcmtncmVlbjogMHgwMDY0MDAsXG4gIGRhcmtncmV5OiAweGE5YTlhOSxcbiAgZGFya2toYWtpOiAweGJkYjc2YixcbiAgZGFya21hZ2VudGE6IDB4OGIwMDhiLFxuICBkYXJrb2xpdmVncmVlbjogMHg1NTZiMmYsXG4gIGRhcmtvcmFuZ2U6IDB4ZmY4YzAwLFxuICBkYXJrb3JjaGlkOiAweDk5MzJjYyxcbiAgZGFya3JlZDogMHg4YjAwMDAsXG4gIGRhcmtzYWxtb246IDB4ZTk5NjdhLFxuICBkYXJrc2VhZ3JlZW46IDB4OGZiYzhmLFxuICBkYXJrc2xhdGVibHVlOiAweDQ4M2Q4YixcbiAgZGFya3NsYXRlZ3JheTogMHgyZjRmNGYsXG4gIGRhcmtzbGF0ZWdyZXk6IDB4MmY0ZjRmLFxuICBkYXJrdHVycXVvaXNlOiAweDAwY2VkMSxcbiAgZGFya3Zpb2xldDogMHg5NDAwZDMsXG4gIGRlZXBwaW5rOiAweGZmMTQ5MyxcbiAgZGVlcHNreWJsdWU6IDB4MDBiZmZmLFxuICBkaW1ncmF5OiAweDY5Njk2OSxcbiAgZGltZ3JleTogMHg2OTY5NjksXG4gIGRvZGdlcmJsdWU6IDB4MWU5MGZmLFxuICBmaXJlYnJpY2s6IDB4YjIyMjIyLFxuICBmbG9yYWx3aGl0ZTogMHhmZmZhZjAsXG4gIGZvcmVzdGdyZWVuOiAweDIyOGIyMixcbiAgZnVjaHNpYTogMHhmZjAwZmYsXG4gIGdhaW5zYm9ybzogMHhkY2RjZGMsXG4gIGdob3N0d2hpdGU6IDB4ZjhmOGZmLFxuICBnb2xkOiAweGZmZDcwMCxcbiAgZ29sZGVucm9kOiAweGRhYTUyMCxcbiAgZ3JheTogMHg4MDgwODAsXG4gIGdyZWVuOiAweDAwODAwMCxcbiAgZ3JlZW55ZWxsb3c6IDB4YWRmZjJmLFxuICBncmV5OiAweDgwODA4MCxcbiAgaG9uZXlkZXc6IDB4ZjBmZmYwLFxuICBob3RwaW5rOiAweGZmNjliNCxcbiAgaW5kaWFucmVkOiAweGNkNWM1YyxcbiAgaW5kaWdvOiAweDRiMDA4MixcbiAgaXZvcnk6IDB4ZmZmZmYwLFxuICBraGFraTogMHhmMGU2OGMsXG4gIGxhdmVuZGVyOiAweGU2ZTZmYSxcbiAgbGF2ZW5kZXJibHVzaDogMHhmZmYwZjUsXG4gIGxhd25ncmVlbjogMHg3Y2ZjMDAsXG4gIGxlbW9uY2hpZmZvbjogMHhmZmZhY2QsXG4gIGxpZ2h0Ymx1ZTogMHhhZGQ4ZTYsXG4gIGxpZ2h0Y29yYWw6IDB4ZjA4MDgwLFxuICBsaWdodGN5YW46IDB4ZTBmZmZmLFxuICBsaWdodGdvbGRlbnJvZHllbGxvdzogMHhmYWZhZDIsXG4gIGxpZ2h0Z3JheTogMHhkM2QzZDMsXG4gIGxpZ2h0Z3JlZW46IDB4OTBlZTkwLFxuICBsaWdodGdyZXk6IDB4ZDNkM2QzLFxuICBsaWdodHBpbms6IDB4ZmZiNmMxLFxuICBsaWdodHNhbG1vbjogMHhmZmEwN2EsXG4gIGxpZ2h0c2VhZ3JlZW46IDB4MjBiMmFhLFxuICBsaWdodHNreWJsdWU6IDB4ODdjZWZhLFxuICBsaWdodHNsYXRlZ3JheTogMHg3Nzg4OTksXG4gIGxpZ2h0c2xhdGVncmV5OiAweDc3ODg5OSxcbiAgbGlnaHRzdGVlbGJsdWU6IDB4YjBjNGRlLFxuICBsaWdodHllbGxvdzogMHhmZmZmZTAsXG4gIGxpbWU6IDB4MDBmZjAwLFxuICBsaW1lZ3JlZW46IDB4MzJjZDMyLFxuICBsaW5lbjogMHhmYWYwZTYsXG4gIG1hZ2VudGE6IDB4ZmYwMGZmLFxuICBtYXJvb246IDB4ODAwMDAwLFxuICBtZWRpdW1hcXVhbWFyaW5lOiAweDY2Y2RhYSxcbiAgbWVkaXVtYmx1ZTogMHgwMDAwY2QsXG4gIG1lZGl1bW9yY2hpZDogMHhiYTU1ZDMsXG4gIG1lZGl1bXB1cnBsZTogMHg5MzcwZGIsXG4gIG1lZGl1bXNlYWdyZWVuOiAweDNjYjM3MSxcbiAgbWVkaXVtc2xhdGVibHVlOiAweDdiNjhlZSxcbiAgbWVkaXVtc3ByaW5nZ3JlZW46IDB4MDBmYTlhLFxuICBtZWRpdW10dXJxdW9pc2U6IDB4NDhkMWNjLFxuICBtZWRpdW12aW9sZXRyZWQ6IDB4YzcxNTg1LFxuICBtaWRuaWdodGJsdWU6IDB4MTkxOTcwLFxuICBtaW50Y3JlYW06IDB4ZjVmZmZhLFxuICBtaXN0eXJvc2U6IDB4ZmZlNGUxLFxuICBtb2NjYXNpbjogMHhmZmU0YjUsXG4gIG5hdmFqb3doaXRlOiAweGZmZGVhZCxcbiAgbmF2eTogMHgwMDAwODAsXG4gIG9sZGxhY2U6IDB4ZmRmNWU2LFxuICBvbGl2ZTogMHg4MDgwMDAsXG4gIG9saXZlZHJhYjogMHg2YjhlMjMsXG4gIG9yYW5nZTogMHhmZmE1MDAsXG4gIG9yYW5nZXJlZDogMHhmZjQ1MDAsXG4gIG9yY2hpZDogMHhkYTcwZDYsXG4gIHBhbGVnb2xkZW5yb2Q6IDB4ZWVlOGFhLFxuICBwYWxlZ3JlZW46IDB4OThmYjk4LFxuICBwYWxldHVycXVvaXNlOiAweGFmZWVlZSxcbiAgcGFsZXZpb2xldHJlZDogMHhkYjcwOTMsXG4gIHBhcGF5YXdoaXA6IDB4ZmZlZmQ1LFxuICBwZWFjaHB1ZmY6IDB4ZmZkYWI5LFxuICBwZXJ1OiAweGNkODUzZixcbiAgcGluazogMHhmZmMwY2IsXG4gIHBsdW06IDB4ZGRhMGRkLFxuICBwb3dkZXJibHVlOiAweGIwZTBlNixcbiAgcHVycGxlOiAweDgwMDA4MCxcbiAgcmViZWNjYXB1cnBsZTogMHg2NjMzOTksXG4gIHJlZDogMHhmZjAwMDAsXG4gIHJvc3licm93bjogMHhiYzhmOGYsXG4gIHJveWFsYmx1ZTogMHg0MTY5ZTEsXG4gIHNhZGRsZWJyb3duOiAweDhiNDUxMyxcbiAgc2FsbW9uOiAweGZhODA3MixcbiAgc2FuZHlicm93bjogMHhmNGE0NjAsXG4gIHNlYWdyZWVuOiAweDJlOGI1NyxcbiAgc2Vhc2hlbGw6IDB4ZmZmNWVlLFxuICBzaWVubmE6IDB4YTA1MjJkLFxuICBzaWx2ZXI6IDB4YzBjMGMwLFxuICBza3libHVlOiAweDg3Y2VlYixcbiAgc2xhdGVibHVlOiAweDZhNWFjZCxcbiAgc2xhdGVncmF5OiAweDcwODA5MCxcbiAgc2xhdGVncmV5OiAweDcwODA5MCxcbiAgc25vdzogMHhmZmZhZmEsXG4gIHNwcmluZ2dyZWVuOiAweDAwZmY3ZixcbiAgc3RlZWxibHVlOiAweDQ2ODJiNCxcbiAgdGFuOiAweGQyYjQ4YyxcbiAgdGVhbDogMHgwMDgwODAsXG4gIHRoaXN0bGU6IDB4ZDhiZmQ4LFxuICB0b21hdG86IDB4ZmY2MzQ3LFxuICB0dXJxdW9pc2U6IDB4NDBlMGQwLFxuICB2aW9sZXQ6IDB4ZWU4MmVlLFxuICB3aGVhdDogMHhmNWRlYjMsXG4gIHdoaXRlOiAweGZmZmZmZixcbiAgd2hpdGVzbW9rZTogMHhmNWY1ZjUsXG4gIHllbGxvdzogMHhmZmZmMDAsXG4gIHllbGxvd2dyZWVuOiAweDlhY2QzMlxufTtcblxuZGVmaW5lKENvbG9yLCBjb2xvciwge1xuICBjb3B5KGNoYW5uZWxzKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IHRoaXMuY29uc3RydWN0b3IsIHRoaXMsIGNoYW5uZWxzKTtcbiAgfSxcbiAgZGlzcGxheWFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKTtcbiAgfSxcbiAgaGV4OiBjb2xvcl9mb3JtYXRIZXgsIC8vIERlcHJlY2F0ZWQhIFVzZSBjb2xvci5mb3JtYXRIZXguXG4gIGZvcm1hdEhleDogY29sb3JfZm9ybWF0SGV4LFxuICBmb3JtYXRIZXg4OiBjb2xvcl9mb3JtYXRIZXg4LFxuICBmb3JtYXRIc2w6IGNvbG9yX2Zvcm1hdEhzbCxcbiAgZm9ybWF0UmdiOiBjb2xvcl9mb3JtYXRSZ2IsXG4gIHRvU3RyaW5nOiBjb2xvcl9mb3JtYXRSZ2Jcbn0pO1xuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRIZXgoKSB7XG4gIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleCgpO1xufVxuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRIZXg4KCkge1xuICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXg4KCk7XG59XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdEhzbCgpIHtcbiAgcmV0dXJuIGhzbENvbnZlcnQodGhpcykuZm9ybWF0SHNsKCk7XG59XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdFJnYigpIHtcbiAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbG9yKGZvcm1hdCkge1xuICB2YXIgbSwgbDtcbiAgZm9ybWF0ID0gKGZvcm1hdCArIFwiXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gKG0gPSByZUhleC5leGVjKGZvcm1hdCkpID8gKGwgPSBtWzFdLmxlbmd0aCwgbSA9IHBhcnNlSW50KG1bMV0sIDE2KSwgbCA9PT0gNiA/IHJnYm4obSkgLy8gI2ZmMDAwMFxuICAgICAgOiBsID09PSAzID8gbmV3IFJnYigobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpLCAxKSAvLyAjZjAwXG4gICAgICA6IGwgPT09IDggPyByZ2JhKG0gPj4gMjQgJiAweGZmLCBtID4+IDE2ICYgMHhmZiwgbSA+PiA4ICYgMHhmZiwgKG0gJiAweGZmKSAvIDB4ZmYpIC8vICNmZjAwMDAwMFxuICAgICAgOiBsID09PSA0ID8gcmdiYSgobSA+PiAxMiAmIDB4ZikgfCAobSA+PiA4ICYgMHhmMCksIChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4ZjApLCAobSA+PiA0ICYgMHhmKSB8IChtICYgMHhmMCksICgoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpKSAvIDB4ZmYpIC8vICNmMDAwXG4gICAgICA6IG51bGwpIC8vIGludmFsaWQgaGV4XG4gICAgICA6IChtID0gcmVSZ2JJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0sIG1bMl0sIG1bM10sIDEpIC8vIHJnYigyNTUsIDAsIDApXG4gICAgICA6IChtID0gcmVSZ2JQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIDEpIC8vIHJnYigxMDAlLCAwJSwgMCUpXG4gICAgICA6IChtID0gcmVSZ2JhSW50ZWdlci5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdLCBtWzJdLCBtWzNdLCBtWzRdKSAvLyByZ2JhKDI1NSwgMCwgMCwgMSlcbiAgICAgIDogKG0gPSByZVJnYmFQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIG1bNF0pIC8vIHJnYigxMDAlLCAwJSwgMCUsIDEpXG4gICAgICA6IChtID0gcmVIc2xQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBoc2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIDEpIC8vIGhzbCgxMjAsIDUwJSwgNTAlKVxuICAgICAgOiAobSA9IHJlSHNsYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgbVs0XSkgLy8gaHNsYSgxMjAsIDUwJSwgNTAlLCAxKVxuICAgICAgOiBuYW1lZC5oYXNPd25Qcm9wZXJ0eShmb3JtYXQpID8gcmdibihuYW1lZFtmb3JtYXRdKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgOiBmb3JtYXQgPT09IFwidHJhbnNwYXJlbnRcIiA/IG5ldyBSZ2IoTmFOLCBOYU4sIE5hTiwgMClcbiAgICAgIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gcmdibihuKSB7XG4gIHJldHVybiBuZXcgUmdiKG4gPj4gMTYgJiAweGZmLCBuID4+IDggJiAweGZmLCBuICYgMHhmZiwgMSk7XG59XG5cbmZ1bmN0aW9uIHJnYmEociwgZywgYiwgYSkge1xuICBpZiAoYSA8PSAwKSByID0gZyA9IGIgPSBOYU47XG4gIHJldHVybiBuZXcgUmdiKHIsIGcsIGIsIGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmdiQ29udmVydChvKSB7XG4gIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvcikpIG8gPSBjb2xvcihvKTtcbiAgaWYgKCFvKSByZXR1cm4gbmV3IFJnYjtcbiAgbyA9IG8ucmdiKCk7XG4gIHJldHVybiBuZXcgUmdiKG8uciwgby5nLCBvLmIsIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZ2IociwgZywgYiwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IHJnYkNvbnZlcnQocikgOiBuZXcgUmdiKHIsIGcsIGIsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJnYihyLCBnLCBiLCBvcGFjaXR5KSB7XG4gIHRoaXMuciA9ICtyO1xuICB0aGlzLmcgPSArZztcbiAgdGhpcy5iID0gK2I7XG4gIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5O1xufVxuXG5kZWZpbmUoUmdiLCByZ2IsIGV4dGVuZChDb2xvciwge1xuICBicmlnaHRlcihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspO1xuICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciA6IE1hdGgucG93KGRhcmtlciwgayk7XG4gICAgcmV0dXJuIG5ldyBSZ2IodGhpcy5yICogaywgdGhpcy5nICogaywgdGhpcy5iICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgcmdiKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBjbGFtcCgpIHtcbiAgICByZXR1cm4gbmV3IFJnYihjbGFtcGkodGhpcy5yKSwgY2xhbXBpKHRoaXMuZyksIGNsYW1waSh0aGlzLmIpLCBjbGFtcGEodGhpcy5vcGFjaXR5KSk7XG4gIH0sXG4gIGRpc3BsYXlhYmxlKCkge1xuICAgIHJldHVybiAoLTAuNSA8PSB0aGlzLnIgJiYgdGhpcy5yIDwgMjU1LjUpXG4gICAgICAgICYmICgtMC41IDw9IHRoaXMuZyAmJiB0aGlzLmcgPCAyNTUuNSlcbiAgICAgICAgJiYgKC0wLjUgPD0gdGhpcy5iICYmIHRoaXMuYiA8IDI1NS41KVxuICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpO1xuICB9LFxuICBoZXg6IHJnYl9mb3JtYXRIZXgsIC8vIERlcHJlY2F0ZWQhIFVzZSBjb2xvci5mb3JtYXRIZXguXG4gIGZvcm1hdEhleDogcmdiX2Zvcm1hdEhleCxcbiAgZm9ybWF0SGV4ODogcmdiX2Zvcm1hdEhleDgsXG4gIGZvcm1hdFJnYjogcmdiX2Zvcm1hdFJnYixcbiAgdG9TdHJpbmc6IHJnYl9mb3JtYXRSZ2Jcbn0pKTtcblxuZnVuY3Rpb24gcmdiX2Zvcm1hdEhleCgpIHtcbiAgcmV0dXJuIGAjJHtoZXgodGhpcy5yKX0ke2hleCh0aGlzLmcpfSR7aGV4KHRoaXMuYil9YDtcbn1cblxuZnVuY3Rpb24gcmdiX2Zvcm1hdEhleDgoKSB7XG4gIHJldHVybiBgIyR7aGV4KHRoaXMucil9JHtoZXgodGhpcy5nKX0ke2hleCh0aGlzLmIpfSR7aGV4KChpc05hTih0aGlzLm9wYWNpdHkpID8gMSA6IHRoaXMub3BhY2l0eSkgKiAyNTUpfWA7XG59XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRSZ2IoKSB7XG4gIGNvbnN0IGEgPSBjbGFtcGEodGhpcy5vcGFjaXR5KTtcbiAgcmV0dXJuIGAke2EgPT09IDEgPyBcInJnYihcIiA6IFwicmdiYShcIn0ke2NsYW1waSh0aGlzLnIpfSwgJHtjbGFtcGkodGhpcy5nKX0sICR7Y2xhbXBpKHRoaXMuYil9JHthID09PSAxID8gXCIpXCIgOiBgLCAke2F9KWB9YDtcbn1cblxuZnVuY3Rpb24gY2xhbXBhKG9wYWNpdHkpIHtcbiAgcmV0dXJuIGlzTmFOKG9wYWNpdHkpID8gMSA6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIG9wYWNpdHkpKTtcbn1cblxuZnVuY3Rpb24gY2xhbXBpKHZhbHVlKSB7XG4gIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodmFsdWUpIHx8IDApKTtcbn1cblxuZnVuY3Rpb24gaGV4KHZhbHVlKSB7XG4gIHZhbHVlID0gY2xhbXBpKHZhbHVlKTtcbiAgcmV0dXJuICh2YWx1ZSA8IDE2ID8gXCIwXCIgOiBcIlwiKSArIHZhbHVlLnRvU3RyaW5nKDE2KTtcbn1cblxuZnVuY3Rpb24gaHNsYShoLCBzLCBsLCBhKSB7XG4gIGlmIChhIDw9IDApIGggPSBzID0gbCA9IE5hTjtcbiAgZWxzZSBpZiAobCA8PSAwIHx8IGwgPj0gMSkgaCA9IHMgPSBOYU47XG4gIGVsc2UgaWYgKHMgPD0gMCkgaCA9IE5hTjtcbiAgcmV0dXJuIG5ldyBIc2woaCwgcywgbCwgYSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc2xDb252ZXJ0KG8pIHtcbiAgaWYgKG8gaW5zdGFuY2VvZiBIc2wpIHJldHVybiBuZXcgSHNsKG8uaCwgby5zLCBvLmwsIG8ub3BhY2l0eSk7XG4gIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvcikpIG8gPSBjb2xvcihvKTtcbiAgaWYgKCFvKSByZXR1cm4gbmV3IEhzbDtcbiAgaWYgKG8gaW5zdGFuY2VvZiBIc2wpIHJldHVybiBvO1xuICBvID0gby5yZ2IoKTtcbiAgdmFyIHIgPSBvLnIgLyAyNTUsXG4gICAgICBnID0gby5nIC8gMjU1LFxuICAgICAgYiA9IG8uYiAvIDI1NSxcbiAgICAgIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpLFxuICAgICAgbWF4ID0gTWF0aC5tYXgociwgZywgYiksXG4gICAgICBoID0gTmFOLFxuICAgICAgcyA9IG1heCAtIG1pbixcbiAgICAgIGwgPSAobWF4ICsgbWluKSAvIDI7XG4gIGlmIChzKSB7XG4gICAgaWYgKHIgPT09IG1heCkgaCA9IChnIC0gYikgLyBzICsgKGcgPCBiKSAqIDY7XG4gICAgZWxzZSBpZiAoZyA9PT0gbWF4KSBoID0gKGIgLSByKSAvIHMgKyAyO1xuICAgIGVsc2UgaCA9IChyIC0gZykgLyBzICsgNDtcbiAgICBzIC89IGwgPCAwLjUgPyBtYXggKyBtaW4gOiAyIC0gbWF4IC0gbWluO1xuICAgIGggKj0gNjA7XG4gIH0gZWxzZSB7XG4gICAgcyA9IGwgPiAwICYmIGwgPCAxID8gMCA6IGg7XG4gIH1cbiAgcmV0dXJuIG5ldyBIc2woaCwgcywgbCwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhzbChoLCBzLCBsLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gaHNsQ29udmVydChoKSA6IG5ldyBIc2woaCwgcywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5mdW5jdGlvbiBIc2woaCwgcywgbCwgb3BhY2l0eSkge1xuICB0aGlzLmggPSAraDtcbiAgdGhpcy5zID0gK3M7XG4gIHRoaXMubCA9ICtsO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKEhzbCwgaHNsLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTtcbiAgICByZXR1cm4gbmV3IEhzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgZGFya2VyKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTtcbiAgICByZXR1cm4gbmV3IEhzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgcmdiKCkge1xuICAgIHZhciBoID0gdGhpcy5oICUgMzYwICsgKHRoaXMuaCA8IDApICogMzYwLFxuICAgICAgICBzID0gaXNOYU4oaCkgfHwgaXNOYU4odGhpcy5zKSA/IDAgOiB0aGlzLnMsXG4gICAgICAgIGwgPSB0aGlzLmwsXG4gICAgICAgIG0yID0gbCArIChsIDwgMC41ID8gbCA6IDEgLSBsKSAqIHMsXG4gICAgICAgIG0xID0gMiAqIGwgLSBtMjtcbiAgICByZXR1cm4gbmV3IFJnYihcbiAgICAgIGhzbDJyZ2IoaCA+PSAyNDAgPyBoIC0gMjQwIDogaCArIDEyMCwgbTEsIG0yKSxcbiAgICAgIGhzbDJyZ2IoaCwgbTEsIG0yKSxcbiAgICAgIGhzbDJyZ2IoaCA8IDEyMCA/IGggKyAyNDAgOiBoIC0gMTIwLCBtMSwgbTIpLFxuICAgICAgdGhpcy5vcGFjaXR5XG4gICAgKTtcbiAgfSxcbiAgY2xhbXAoKSB7XG4gICAgcmV0dXJuIG5ldyBIc2woY2xhbXBoKHRoaXMuaCksIGNsYW1wdCh0aGlzLnMpLCBjbGFtcHQodGhpcy5sKSwgY2xhbXBhKHRoaXMub3BhY2l0eSkpO1xuICB9LFxuICBkaXNwbGF5YWJsZSgpIHtcbiAgICByZXR1cm4gKDAgPD0gdGhpcy5zICYmIHRoaXMucyA8PSAxIHx8IGlzTmFOKHRoaXMucykpXG4gICAgICAgICYmICgwIDw9IHRoaXMubCAmJiB0aGlzLmwgPD0gMSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTtcbiAgfSxcbiAgZm9ybWF0SHNsKCkge1xuICAgIGNvbnN0IGEgPSBjbGFtcGEodGhpcy5vcGFjaXR5KTtcbiAgICByZXR1cm4gYCR7YSA9PT0gMSA/IFwiaHNsKFwiIDogXCJoc2xhKFwifSR7Y2xhbXBoKHRoaXMuaCl9LCAke2NsYW1wdCh0aGlzLnMpICogMTAwfSUsICR7Y2xhbXB0KHRoaXMubCkgKiAxMDB9JSR7YSA9PT0gMSA/IFwiKVwiIDogYCwgJHthfSlgfWA7XG4gIH1cbn0pKTtcblxuZnVuY3Rpb24gY2xhbXBoKHZhbHVlKSB7XG4gIHZhbHVlID0gKHZhbHVlIHx8IDApICUgMzYwO1xuICByZXR1cm4gdmFsdWUgPCAwID8gdmFsdWUgKyAzNjAgOiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gY2xhbXB0KHZhbHVlKSB7XG4gIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB2YWx1ZSB8fCAwKSk7XG59XG5cbi8qIEZyb20gRnZEIDEzLjM3LCBDU1MgQ29sb3IgTW9kdWxlIExldmVsIDMgKi9cbmZ1bmN0aW9uIGhzbDJyZ2IoaCwgbTEsIG0yKSB7XG4gIHJldHVybiAoaCA8IDYwID8gbTEgKyAobTIgLSBtMSkgKiBoIC8gNjBcbiAgICAgIDogaCA8IDE4MCA/IG0yXG4gICAgICA6IGggPCAyNDAgPyBtMSArIChtMiAtIG0xKSAqICgyNDAgLSBoKSAvIDYwXG4gICAgICA6IG0xKSAqIDI1NTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnN0cnVjdG9yLCBmYWN0b3J5LCBwcm90b3R5cGUpIHtcbiAgY29uc3RydWN0b3IucHJvdG90eXBlID0gZmFjdG9yeS5wcm90b3R5cGUgPSBwcm90b3R5cGU7XG4gIHByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKHBhcmVudCwgZGVmaW5pdGlvbikge1xuICB2YXIgcHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQucHJvdG90eXBlKTtcbiAgZm9yICh2YXIga2V5IGluIGRlZmluaXRpb24pIHByb3RvdHlwZVtrZXldID0gZGVmaW5pdGlvbltrZXldO1xuICByZXR1cm4gcHJvdG90eXBlO1xufVxuIiwiaW1wb3J0IGRlZmluZSwge2V4dGVuZH0gZnJvbSBcIi4vZGVmaW5lLmpzXCI7XG5pbXBvcnQge0NvbG9yLCByZ2JDb252ZXJ0LCBSZ2J9IGZyb20gXCIuL2NvbG9yLmpzXCI7XG5pbXBvcnQge2RlZ3JlZXMsIHJhZGlhbnN9IGZyb20gXCIuL21hdGguanNcIjtcblxuLy8gaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0BtYm9zdG9jay9sYWItYW5kLXJnYlxuY29uc3QgSyA9IDE4LFxuICAgIFhuID0gMC45NjQyMixcbiAgICBZbiA9IDEsXG4gICAgWm4gPSAwLjgyNTIxLFxuICAgIHQwID0gNCAvIDI5LFxuICAgIHQxID0gNiAvIDI5LFxuICAgIHQyID0gMyAqIHQxICogdDEsXG4gICAgdDMgPSB0MSAqIHQxICogdDE7XG5cbmZ1bmN0aW9uIGxhYkNvbnZlcnQobykge1xuICBpZiAobyBpbnN0YW5jZW9mIExhYikgcmV0dXJuIG5ldyBMYWIoby5sLCBvLmEsIG8uYiwgby5vcGFjaXR5KTtcbiAgaWYgKG8gaW5zdGFuY2VvZiBIY2wpIHJldHVybiBoY2wybGFiKG8pO1xuICBpZiAoIShvIGluc3RhbmNlb2YgUmdiKSkgbyA9IHJnYkNvbnZlcnQobyk7XG4gIHZhciByID0gcmdiMmxyZ2Ioby5yKSxcbiAgICAgIGcgPSByZ2IybHJnYihvLmcpLFxuICAgICAgYiA9IHJnYjJscmdiKG8uYiksXG4gICAgICB5ID0geHl6MmxhYigoMC4yMjI1MDQ1ICogciArIDAuNzE2ODc4NiAqIGcgKyAwLjA2MDYxNjkgKiBiKSAvIFluKSwgeCwgejtcbiAgaWYgKHIgPT09IGcgJiYgZyA9PT0gYikgeCA9IHogPSB5OyBlbHNlIHtcbiAgICB4ID0geHl6MmxhYigoMC40MzYwNzQ3ICogciArIDAuMzg1MDY0OSAqIGcgKyAwLjE0MzA4MDQgKiBiKSAvIFhuKTtcbiAgICB6ID0geHl6MmxhYigoMC4wMTM5MzIyICogciArIDAuMDk3MTA0NSAqIGcgKyAwLjcxNDE3MzMgKiBiKSAvIFpuKTtcbiAgfVxuICByZXR1cm4gbmV3IExhYigxMTYgKiB5IC0gMTYsIDUwMCAqICh4IC0geSksIDIwMCAqICh5IC0geiksIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBncmF5KGwsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIG5ldyBMYWIobCwgMCwgMCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsYWIobCwgYSwgYiwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGxhYkNvbnZlcnQobCkgOiBuZXcgTGFiKGwsIGEsIGIsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIExhYihsLCBhLCBiLCBvcGFjaXR5KSB7XG4gIHRoaXMubCA9ICtsO1xuICB0aGlzLmEgPSArYTtcbiAgdGhpcy5iID0gK2I7XG4gIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5O1xufVxuXG5kZWZpbmUoTGFiLCBsYWIsIGV4dGVuZChDb2xvciwge1xuICBicmlnaHRlcihrKSB7XG4gICAgcmV0dXJuIG5ldyBMYWIodGhpcy5sICsgSyAqIChrID09IG51bGwgPyAxIDogayksIHRoaXMuYSwgdGhpcy5iLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXIoaykge1xuICAgIHJldHVybiBuZXcgTGFiKHRoaXMubCAtIEsgKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgcmdiKCkge1xuICAgIHZhciB5ID0gKHRoaXMubCArIDE2KSAvIDExNixcbiAgICAgICAgeCA9IGlzTmFOKHRoaXMuYSkgPyB5IDogeSArIHRoaXMuYSAvIDUwMCxcbiAgICAgICAgeiA9IGlzTmFOKHRoaXMuYikgPyB5IDogeSAtIHRoaXMuYiAvIDIwMDtcbiAgICB4ID0gWG4gKiBsYWIyeHl6KHgpO1xuICAgIHkgPSBZbiAqIGxhYjJ4eXooeSk7XG4gICAgeiA9IFpuICogbGFiMnh5eih6KTtcbiAgICByZXR1cm4gbmV3IFJnYihcbiAgICAgIGxyZ2IycmdiKCAzLjEzMzg1NjEgKiB4IC0gMS42MTY4NjY3ICogeSAtIDAuNDkwNjE0NiAqIHopLFxuICAgICAgbHJnYjJyZ2IoLTAuOTc4NzY4NCAqIHggKyAxLjkxNjE0MTUgKiB5ICsgMC4wMzM0NTQwICogeiksXG4gICAgICBscmdiMnJnYiggMC4wNzE5NDUzICogeCAtIDAuMjI4OTkxNCAqIHkgKyAxLjQwNTI0MjcgKiB6KSxcbiAgICAgIHRoaXMub3BhY2l0eVxuICAgICk7XG4gIH1cbn0pKTtcblxuZnVuY3Rpb24geHl6MmxhYih0KSB7XG4gIHJldHVybiB0ID4gdDMgPyBNYXRoLnBvdyh0LCAxIC8gMykgOiB0IC8gdDIgKyB0MDtcbn1cblxuZnVuY3Rpb24gbGFiMnh5eih0KSB7XG4gIHJldHVybiB0ID4gdDEgPyB0ICogdCAqIHQgOiB0MiAqICh0IC0gdDApO1xufVxuXG5mdW5jdGlvbiBscmdiMnJnYih4KSB7XG4gIHJldHVybiAyNTUgKiAoeCA8PSAwLjAwMzEzMDggPyAxMi45MiAqIHggOiAxLjA1NSAqIE1hdGgucG93KHgsIDEgLyAyLjQpIC0gMC4wNTUpO1xufVxuXG5mdW5jdGlvbiByZ2IybHJnYih4KSB7XG4gIHJldHVybiAoeCAvPSAyNTUpIDw9IDAuMDQwNDUgPyB4IC8gMTIuOTIgOiBNYXRoLnBvdygoeCArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xufVxuXG5mdW5jdGlvbiBoY2xDb252ZXJ0KG8pIHtcbiAgaWYgKG8gaW5zdGFuY2VvZiBIY2wpIHJldHVybiBuZXcgSGNsKG8uaCwgby5jLCBvLmwsIG8ub3BhY2l0eSk7XG4gIGlmICghKG8gaW5zdGFuY2VvZiBMYWIpKSBvID0gbGFiQ29udmVydChvKTtcbiAgaWYgKG8uYSA9PT0gMCAmJiBvLmIgPT09IDApIHJldHVybiBuZXcgSGNsKE5hTiwgMCA8IG8ubCAmJiBvLmwgPCAxMDAgPyAwIDogTmFOLCBvLmwsIG8ub3BhY2l0eSk7XG4gIHZhciBoID0gTWF0aC5hdGFuMihvLmIsIG8uYSkgKiBkZWdyZWVzO1xuICByZXR1cm4gbmV3IEhjbChoIDwgMCA/IGggKyAzNjAgOiBoLCBNYXRoLnNxcnQoby5hICogby5hICsgby5iICogby5iKSwgby5sLCBvLm9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGNoKGwsIGMsIGgsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBoY2xDb252ZXJ0KGwpIDogbmV3IEhjbChoLCBjLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoY2woaCwgYywgbCwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhjbENvbnZlcnQoaCkgOiBuZXcgSGNsKGgsIGMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEhjbChoLCBjLCBsLCBvcGFjaXR5KSB7XG4gIHRoaXMuaCA9ICtoO1xuICB0aGlzLmMgPSArYztcbiAgdGhpcy5sID0gK2w7XG4gIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5O1xufVxuXG5mdW5jdGlvbiBoY2wybGFiKG8pIHtcbiAgaWYgKGlzTmFOKG8uaCkpIHJldHVybiBuZXcgTGFiKG8ubCwgMCwgMCwgby5vcGFjaXR5KTtcbiAgdmFyIGggPSBvLmggKiByYWRpYW5zO1xuICByZXR1cm4gbmV3IExhYihvLmwsIE1hdGguY29zKGgpICogby5jLCBNYXRoLnNpbihoKSAqIG8uYywgby5vcGFjaXR5KTtcbn1cblxuZGVmaW5lKEhjbCwgaGNsLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXIoaykge1xuICAgIHJldHVybiBuZXcgSGNsKHRoaXMuaCwgdGhpcy5jLCB0aGlzLmwgKyBLICogKGsgPT0gbnVsbCA/IDEgOiBrKSwgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgZGFya2VyKGspIHtcbiAgICByZXR1cm4gbmV3IEhjbCh0aGlzLmgsIHRoaXMuYywgdGhpcy5sIC0gSyAqIChrID09IG51bGwgPyAxIDogayksIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYigpIHtcbiAgICByZXR1cm4gaGNsMmxhYih0aGlzKS5yZ2IoKTtcbiAgfVxufSkpO1xuIiwiZXhwb3J0IGNvbnN0IHJhZGlhbnMgPSBNYXRoLlBJIC8gMTgwO1xuZXhwb3J0IGNvbnN0IGRlZ3JlZXMgPSAxODAgLyBNYXRoLlBJO1xuIiwidmFyIG5vb3AgPSB7dmFsdWU6ICgpID0+IHt9fTtcblxuZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aCwgXyA9IHt9LCB0OyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKCEodCA9IGFyZ3VtZW50c1tpXSArIFwiXCIpIHx8ICh0IGluIF8pIHx8IC9bXFxzLl0vLnRlc3QodCkpIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgdHlwZTogXCIgKyB0KTtcbiAgICBfW3RdID0gW107XG4gIH1cbiAgcmV0dXJuIG5ldyBEaXNwYXRjaChfKTtcbn1cblxuZnVuY3Rpb24gRGlzcGF0Y2goXykge1xuICB0aGlzLl8gPSBfO1xufVxuXG5mdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMsIHR5cGVzKSB7XG4gIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxccysvKS5tYXAoZnVuY3Rpb24odCkge1xuICAgIHZhciBuYW1lID0gXCJcIiwgaSA9IHQuaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKGkgPj0gMCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTtcbiAgICBpZiAodCAmJiAhdHlwZXMuaGFzT3duUHJvcGVydHkodCkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0KTtcbiAgICByZXR1cm4ge3R5cGU6IHQsIG5hbWU6IG5hbWV9O1xuICB9KTtcbn1cblxuRGlzcGF0Y2gucHJvdG90eXBlID0gZGlzcGF0Y2gucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRGlzcGF0Y2gsXG4gIG9uOiBmdW5jdGlvbih0eXBlbmFtZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgXyA9IHRoaXMuXyxcbiAgICAgICAgVCA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgXCJcIiwgXyksXG4gICAgICAgIHQsXG4gICAgICAgIGkgPSAtMSxcbiAgICAgICAgbiA9IFQubGVuZ3RoO1xuXG4gICAgLy8gSWYgbm8gY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBjYWxsYmFjayBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSAmJiAodCA9IGdldChfW3RdLCB0eXBlbmFtZS5uYW1lKSkpIHJldHVybiB0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIGEgdHlwZSB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS5cbiAgICAvLyBPdGhlcndpc2UsIGlmIGEgbnVsbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZW1vdmUgY2FsbGJhY2tzIG9mIHRoZSBnaXZlbiBuYW1lLlxuICAgIGlmIChjYWxsYmFjayAhPSBudWxsICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGNhbGxiYWNrOiBcIiArIGNhbGxiYWNrKTtcbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgaWYgKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIGNhbGxiYWNrKTtcbiAgICAgIGVsc2UgaWYgKGNhbGxiYWNrID09IG51bGwpIGZvciAodCBpbiBfKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIG51bGwpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBjb3B5OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY29weSA9IHt9LCBfID0gdGhpcy5fO1xuICAgIGZvciAodmFyIHQgaW4gXykgY29weVt0XSA9IF9bdF0uc2xpY2UoKTtcbiAgICByZXR1cm4gbmV3IERpc3BhdGNoKGNvcHkpO1xuICB9LFxuICBjYWxsOiBmdW5jdGlvbih0eXBlLCB0aGF0KSB7XG4gICAgaWYgKChuID0gYXJndW1lbnRzLmxlbmd0aCAtIDIpID4gMCkgZm9yICh2YXIgYXJncyA9IG5ldyBBcnJheShuKSwgaSA9IDAsIG4sIHQ7IGkgPCBuOyArK2kpIGFyZ3NbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgZm9yICh0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24odHlwZSwgdGhhdCwgYXJncykge1xuICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgZm9yICh2YXIgdCA9IHRoaXMuX1t0eXBlXSwgaSA9IDAsIG4gPSB0Lmxlbmd0aDsgaSA8IG47ICsraSkgdFtpXS52YWx1ZS5hcHBseSh0aGF0LCBhcmdzKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0KHR5cGUsIG5hbWUpIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aCwgYzsgaSA8IG47ICsraSkge1xuICAgIGlmICgoYyA9IHR5cGVbaV0pLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHJldHVybiBjLnZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXQodHlwZSwgbmFtZSwgY2FsbGJhY2spIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgIGlmICh0eXBlW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHR5cGVbaV0gPSBub29wLCB0eXBlID0gdHlwZS5zbGljZSgwLCBpKS5jb25jYXQodHlwZS5zbGljZShpICsgMSkpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChjYWxsYmFjayAhPSBudWxsKSB0eXBlLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiBjYWxsYmFja30pO1xuICByZXR1cm4gdHlwZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGlzcGF0Y2g7XG4iLCJpbXBvcnQge3NlbGVjdH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IG5vZXZlbnQsIHtub25wYXNzaXZlY2FwdHVyZX0gZnJvbSBcIi4vbm9ldmVudC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2aWV3KSB7XG4gIHZhciByb290ID0gdmlldy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgICBzZWxlY3Rpb24gPSBzZWxlY3Qodmlldykub24oXCJkcmFnc3RhcnQuZHJhZ1wiLCBub2V2ZW50LCBub25wYXNzaXZlY2FwdHVyZSk7XG4gIGlmIChcIm9uc2VsZWN0c3RhcnRcIiBpbiByb290KSB7XG4gICAgc2VsZWN0aW9uLm9uKFwic2VsZWN0c3RhcnQuZHJhZ1wiLCBub2V2ZW50LCBub25wYXNzaXZlY2FwdHVyZSk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5fX25vc2VsZWN0ID0gcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0O1xuICAgIHJvb3Quc3R5bGUuTW96VXNlclNlbGVjdCA9IFwibm9uZVwiO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB5ZXNkcmFnKHZpZXcsIG5vY2xpY2spIHtcbiAgdmFyIHJvb3QgPSB2aWV3LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdCh2aWV3KS5vbihcImRyYWdzdGFydC5kcmFnXCIsIG51bGwpO1xuICBpZiAobm9jbGljaykge1xuICAgIHNlbGVjdGlvbi5vbihcImNsaWNrLmRyYWdcIiwgbm9ldmVudCwgbm9ucGFzc2l2ZWNhcHR1cmUpO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHNlbGVjdGlvbi5vbihcImNsaWNrLmRyYWdcIiwgbnVsbCk7IH0sIDApO1xuICB9XG4gIGlmIChcIm9uc2VsZWN0c3RhcnRcIiBpbiByb290KSB7XG4gICAgc2VsZWN0aW9uLm9uKFwic2VsZWN0c3RhcnQuZHJhZ1wiLCBudWxsKTtcbiAgfSBlbHNlIHtcbiAgICByb290LnN0eWxlLk1velVzZXJTZWxlY3QgPSByb290Ll9fbm9zZWxlY3Q7XG4gICAgZGVsZXRlIHJvb3QuX19ub3NlbGVjdDtcbiAgfVxufVxuIiwiLy8gVGhlc2UgYXJlIHR5cGljYWxseSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggbm9ldmVudCB0byBlbnN1cmUgdGhhdCB3ZSBjYW5cbi8vIHByZXZlbnREZWZhdWx0IG9uIHRoZSBldmVudC5cbmV4cG9ydCBjb25zdCBub25wYXNzaXZlID0ge3Bhc3NpdmU6IGZhbHNlfTtcbmV4cG9ydCBjb25zdCBub25wYXNzaXZlY2FwdHVyZSA9IHtjYXB0dXJlOiB0cnVlLCBwYXNzaXZlOiBmYWxzZX07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3Byb3BhZ2F0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cbiIsImltcG9ydCBkc3YgZnJvbSBcIi4vZHN2LmpzXCI7XG5cbnZhciBjc3YgPSBkc3YoXCIsXCIpO1xuXG5leHBvcnQgdmFyIGNzdlBhcnNlID0gY3N2LnBhcnNlO1xuZXhwb3J0IHZhciBjc3ZQYXJzZVJvd3MgPSBjc3YucGFyc2VSb3dzO1xuZXhwb3J0IHZhciBjc3ZGb3JtYXQgPSBjc3YuZm9ybWF0O1xuZXhwb3J0IHZhciBjc3ZGb3JtYXRCb2R5ID0gY3N2LmZvcm1hdEJvZHk7XG5leHBvcnQgdmFyIGNzdkZvcm1hdFJvd3MgPSBjc3YuZm9ybWF0Um93cztcbmV4cG9ydCB2YXIgY3N2Rm9ybWF0Um93ID0gY3N2LmZvcm1hdFJvdztcbmV4cG9ydCB2YXIgY3N2Rm9ybWF0VmFsdWUgPSBjc3YuZm9ybWF0VmFsdWU7XG4iLCJ2YXIgRU9MID0ge30sXG4gICAgRU9GID0ge30sXG4gICAgUVVPVEUgPSAzNCxcbiAgICBORVdMSU5FID0gMTAsXG4gICAgUkVUVVJOID0gMTM7XG5cbmZ1bmN0aW9uIG9iamVjdENvbnZlcnRlcihjb2x1bW5zKSB7XG4gIHJldHVybiBuZXcgRnVuY3Rpb24oXCJkXCIsIFwicmV0dXJuIHtcIiArIGNvbHVtbnMubWFwKGZ1bmN0aW9uKG5hbWUsIGkpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobmFtZSkgKyBcIjogZFtcIiArIGkgKyBcIl0gfHwgXFxcIlxcXCJcIjtcbiAgfSkuam9pbihcIixcIikgKyBcIn1cIik7XG59XG5cbmZ1bmN0aW9uIGN1c3RvbUNvbnZlcnRlcihjb2x1bW5zLCBmKSB7XG4gIHZhciBvYmplY3QgPSBvYmplY3RDb252ZXJ0ZXIoY29sdW1ucyk7XG4gIHJldHVybiBmdW5jdGlvbihyb3csIGkpIHtcbiAgICByZXR1cm4gZihvYmplY3Qocm93KSwgaSwgY29sdW1ucyk7XG4gIH07XG59XG5cbi8vIENvbXB1dGUgdW5pcXVlIGNvbHVtbnMgaW4gb3JkZXIgb2YgZGlzY292ZXJ5LlxuZnVuY3Rpb24gaW5mZXJDb2x1bW5zKHJvd3MpIHtcbiAgdmFyIGNvbHVtblNldCA9IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICBjb2x1bW5zID0gW107XG5cbiAgcm93cy5mb3JFYWNoKGZ1bmN0aW9uKHJvdykge1xuICAgIGZvciAodmFyIGNvbHVtbiBpbiByb3cpIHtcbiAgICAgIGlmICghKGNvbHVtbiBpbiBjb2x1bW5TZXQpKSB7XG4gICAgICAgIGNvbHVtbnMucHVzaChjb2x1bW5TZXRbY29sdW1uXSA9IGNvbHVtbik7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY29sdW1ucztcbn1cblxuZnVuY3Rpb24gcGFkKHZhbHVlLCB3aWR0aCkge1xuICB2YXIgcyA9IHZhbHVlICsgXCJcIiwgbGVuZ3RoID0gcy5sZW5ndGg7XG4gIHJldHVybiBsZW5ndGggPCB3aWR0aCA/IG5ldyBBcnJheSh3aWR0aCAtIGxlbmd0aCArIDEpLmpvaW4oMCkgKyBzIDogcztcbn1cblxuZnVuY3Rpb24gZm9ybWF0WWVhcih5ZWFyKSB7XG4gIHJldHVybiB5ZWFyIDwgMCA/IFwiLVwiICsgcGFkKC15ZWFyLCA2KVxuICAgIDogeWVhciA+IDk5OTkgPyBcIitcIiArIHBhZCh5ZWFyLCA2KVxuICAgIDogcGFkKHllYXIsIDQpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXREYXRlKGRhdGUpIHtcbiAgdmFyIGhvdXJzID0gZGF0ZS5nZXRVVENIb3VycygpLFxuICAgICAgbWludXRlcyA9IGRhdGUuZ2V0VVRDTWludXRlcygpLFxuICAgICAgc2Vjb25kcyA9IGRhdGUuZ2V0VVRDU2Vjb25kcygpLFxuICAgICAgbWlsbGlzZWNvbmRzID0gZGF0ZS5nZXRVVENNaWxsaXNlY29uZHMoKTtcbiAgcmV0dXJuIGlzTmFOKGRhdGUpID8gXCJJbnZhbGlkIERhdGVcIlxuICAgICAgOiBmb3JtYXRZZWFyKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSwgNCkgKyBcIi1cIiArIHBhZChkYXRlLmdldFVUQ01vbnRoKCkgKyAxLCAyKSArIFwiLVwiICsgcGFkKGRhdGUuZ2V0VVRDRGF0ZSgpLCAyKVxuICAgICAgKyAobWlsbGlzZWNvbmRzID8gXCJUXCIgKyBwYWQoaG91cnMsIDIpICsgXCI6XCIgKyBwYWQobWludXRlcywgMikgKyBcIjpcIiArIHBhZChzZWNvbmRzLCAyKSArIFwiLlwiICsgcGFkKG1pbGxpc2Vjb25kcywgMykgKyBcIlpcIlxuICAgICAgOiBzZWNvbmRzID8gXCJUXCIgKyBwYWQoaG91cnMsIDIpICsgXCI6XCIgKyBwYWQobWludXRlcywgMikgKyBcIjpcIiArIHBhZChzZWNvbmRzLCAyKSArIFwiWlwiXG4gICAgICA6IG1pbnV0ZXMgfHwgaG91cnMgPyBcIlRcIiArIHBhZChob3VycywgMikgKyBcIjpcIiArIHBhZChtaW51dGVzLCAyKSArIFwiWlwiXG4gICAgICA6IFwiXCIpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihkZWxpbWl0ZXIpIHtcbiAgdmFyIHJlRm9ybWF0ID0gbmV3IFJlZ0V4cChcIltcXFwiXCIgKyBkZWxpbWl0ZXIgKyBcIlxcblxccl1cIiksXG4gICAgICBERUxJTUlURVIgPSBkZWxpbWl0ZXIuY2hhckNvZGVBdCgwKTtcblxuICBmdW5jdGlvbiBwYXJzZSh0ZXh0LCBmKSB7XG4gICAgdmFyIGNvbnZlcnQsIGNvbHVtbnMsIHJvd3MgPSBwYXJzZVJvd3ModGV4dCwgZnVuY3Rpb24ocm93LCBpKSB7XG4gICAgICBpZiAoY29udmVydCkgcmV0dXJuIGNvbnZlcnQocm93LCBpIC0gMSk7XG4gICAgICBjb2x1bW5zID0gcm93LCBjb252ZXJ0ID0gZiA/IGN1c3RvbUNvbnZlcnRlcihyb3csIGYpIDogb2JqZWN0Q29udmVydGVyKHJvdyk7XG4gICAgfSk7XG4gICAgcm93cy5jb2x1bW5zID0gY29sdW1ucyB8fCBbXTtcbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlUm93cyh0ZXh0LCBmKSB7XG4gICAgdmFyIHJvd3MgPSBbXSwgLy8gb3V0cHV0IHJvd3NcbiAgICAgICAgTiA9IHRleHQubGVuZ3RoLFxuICAgICAgICBJID0gMCwgLy8gY3VycmVudCBjaGFyYWN0ZXIgaW5kZXhcbiAgICAgICAgbiA9IDAsIC8vIGN1cnJlbnQgbGluZSBudW1iZXJcbiAgICAgICAgdCwgLy8gY3VycmVudCB0b2tlblxuICAgICAgICBlb2YgPSBOIDw9IDAsIC8vIGN1cnJlbnQgdG9rZW4gZm9sbG93ZWQgYnkgRU9GP1xuICAgICAgICBlb2wgPSBmYWxzZTsgLy8gY3VycmVudCB0b2tlbiBmb2xsb3dlZCBieSBFT0w/XG5cbiAgICAvLyBTdHJpcCB0aGUgdHJhaWxpbmcgbmV3bGluZS5cbiAgICBpZiAodGV4dC5jaGFyQ29kZUF0KE4gLSAxKSA9PT0gTkVXTElORSkgLS1OO1xuICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoTiAtIDEpID09PSBSRVRVUk4pIC0tTjtcblxuICAgIGZ1bmN0aW9uIHRva2VuKCkge1xuICAgICAgaWYgKGVvZikgcmV0dXJuIEVPRjtcbiAgICAgIGlmIChlb2wpIHJldHVybiBlb2wgPSBmYWxzZSwgRU9MO1xuXG4gICAgICAvLyBVbmVzY2FwZSBxdW90ZXMuXG4gICAgICB2YXIgaSwgaiA9IEksIGM7XG4gICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGopID09PSBRVU9URSkge1xuICAgICAgICB3aGlsZSAoSSsrIDwgTiAmJiB0ZXh0LmNoYXJDb2RlQXQoSSkgIT09IFFVT1RFIHx8IHRleHQuY2hhckNvZGVBdCgrK0kpID09PSBRVU9URSk7XG4gICAgICAgIGlmICgoaSA9IEkpID49IE4pIGVvZiA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKChjID0gdGV4dC5jaGFyQ29kZUF0KEkrKykpID09PSBORVdMSU5FKSBlb2wgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmIChjID09PSBSRVRVUk4pIHsgZW9sID0gdHJ1ZTsgaWYgKHRleHQuY2hhckNvZGVBdChJKSA9PT0gTkVXTElORSkgKytJOyB9XG4gICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKGogKyAxLCBpIC0gMSkucmVwbGFjZSgvXCJcIi9nLCBcIlxcXCJcIik7XG4gICAgICB9XG5cbiAgICAgIC8vIEZpbmQgbmV4dCBkZWxpbWl0ZXIgb3IgbmV3bGluZS5cbiAgICAgIHdoaWxlIChJIDwgTikge1xuICAgICAgICBpZiAoKGMgPSB0ZXh0LmNoYXJDb2RlQXQoaSA9IEkrKykpID09PSBORVdMSU5FKSBlb2wgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmIChjID09PSBSRVRVUk4pIHsgZW9sID0gdHJ1ZTsgaWYgKHRleHQuY2hhckNvZGVBdChJKSA9PT0gTkVXTElORSkgKytJOyB9XG4gICAgICAgIGVsc2UgaWYgKGMgIT09IERFTElNSVRFUikgY29udGludWU7XG4gICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKGosIGkpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXR1cm4gbGFzdCB0b2tlbiBiZWZvcmUgRU9GLlxuICAgICAgcmV0dXJuIGVvZiA9IHRydWUsIHRleHQuc2xpY2UoaiwgTik7XG4gICAgfVxuXG4gICAgd2hpbGUgKCh0ID0gdG9rZW4oKSkgIT09IEVPRikge1xuICAgICAgdmFyIHJvdyA9IFtdO1xuICAgICAgd2hpbGUgKHQgIT09IEVPTCAmJiB0ICE9PSBFT0YpIHJvdy5wdXNoKHQpLCB0ID0gdG9rZW4oKTtcbiAgICAgIGlmIChmICYmIChyb3cgPSBmKHJvdywgbisrKSkgPT0gbnVsbCkgY29udGludWU7XG4gICAgICByb3dzLnB1c2gocm93KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHByZWZvcm1hdEJvZHkocm93cywgY29sdW1ucykge1xuICAgIHJldHVybiByb3dzLm1hcChmdW5jdGlvbihyb3cpIHtcbiAgICAgIHJldHVybiBjb2x1bW5zLm1hcChmdW5jdGlvbihjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdFZhbHVlKHJvd1tjb2x1bW5dKTtcbiAgICAgIH0pLmpvaW4oZGVsaW1pdGVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdChyb3dzLCBjb2x1bW5zKSB7XG4gICAgaWYgKGNvbHVtbnMgPT0gbnVsbCkgY29sdW1ucyA9IGluZmVyQ29sdW1ucyhyb3dzKTtcbiAgICByZXR1cm4gW2NvbHVtbnMubWFwKGZvcm1hdFZhbHVlKS5qb2luKGRlbGltaXRlcildLmNvbmNhdChwcmVmb3JtYXRCb2R5KHJvd3MsIGNvbHVtbnMpKS5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0Qm9keShyb3dzLCBjb2x1bW5zKSB7XG4gICAgaWYgKGNvbHVtbnMgPT0gbnVsbCkgY29sdW1ucyA9IGluZmVyQ29sdW1ucyhyb3dzKTtcbiAgICByZXR1cm4gcHJlZm9ybWF0Qm9keShyb3dzLCBjb2x1bW5zKS5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0Um93cyhyb3dzKSB7XG4gICAgcmV0dXJuIHJvd3MubWFwKGZvcm1hdFJvdykuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFJvdyhyb3cpIHtcbiAgICByZXR1cm4gcm93Lm1hcChmb3JtYXRWYWx1ZSkuam9pbihkZWxpbWl0ZXIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0VmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IFwiXCJcbiAgICAgICAgOiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyBmb3JtYXREYXRlKHZhbHVlKVxuICAgICAgICA6IHJlRm9ybWF0LnRlc3QodmFsdWUgKz0gXCJcIikgPyBcIlxcXCJcIiArIHZhbHVlLnJlcGxhY2UoL1wiL2csIFwiXFxcIlxcXCJcIikgKyBcIlxcXCJcIlxuICAgICAgICA6IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYXJzZTogcGFyc2UsXG4gICAgcGFyc2VSb3dzOiBwYXJzZVJvd3MsXG4gICAgZm9ybWF0OiBmb3JtYXQsXG4gICAgZm9ybWF0Qm9keTogZm9ybWF0Qm9keSxcbiAgICBmb3JtYXRSb3dzOiBmb3JtYXRSb3dzLFxuICAgIGZvcm1hdFJvdzogZm9ybWF0Um93LFxuICAgIGZvcm1hdFZhbHVlOiBmb3JtYXRWYWx1ZVxuICB9O1xufVxuIiwiaW1wb3J0IGRzdiBmcm9tIFwiLi9kc3YuanNcIjtcblxudmFyIHRzdiA9IGRzdihcIlxcdFwiKTtcblxuZXhwb3J0IHZhciB0c3ZQYXJzZSA9IHRzdi5wYXJzZTtcbmV4cG9ydCB2YXIgdHN2UGFyc2VSb3dzID0gdHN2LnBhcnNlUm93cztcbmV4cG9ydCB2YXIgdHN2Rm9ybWF0ID0gdHN2LmZvcm1hdDtcbmV4cG9ydCB2YXIgdHN2Rm9ybWF0Qm9keSA9IHRzdi5mb3JtYXRCb2R5O1xuZXhwb3J0IHZhciB0c3ZGb3JtYXRSb3dzID0gdHN2LmZvcm1hdFJvd3M7XG5leHBvcnQgdmFyIHRzdkZvcm1hdFJvdyA9IHRzdi5mb3JtYXRSb3c7XG5leHBvcnQgdmFyIHRzdkZvcm1hdFZhbHVlID0gdHN2LmZvcm1hdFZhbHVlO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGN1YmljSW4odCkge1xuICByZXR1cm4gdCAqIHQgKiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3ViaWNPdXQodCkge1xuICByZXR1cm4gLS10ICogdCAqIHQgKyAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3ViaWNJbk91dCh0KSB7XG4gIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHQgKiB0ICogdCA6ICh0IC09IDIpICogdCAqIHQgKyAyKSAvIDI7XG59XG4iLCJpbXBvcnQge2NzdlBhcnNlLCBkc3ZGb3JtYXQsIHRzdlBhcnNlfSBmcm9tIFwiZDMtZHN2XCI7XG5pbXBvcnQgdGV4dCBmcm9tIFwiLi90ZXh0LmpzXCI7XG5cbmZ1bmN0aW9uIGRzdlBhcnNlKHBhcnNlKSB7XG4gIHJldHVybiBmdW5jdGlvbihpbnB1dCwgaW5pdCwgcm93KSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgdHlwZW9mIGluaXQgPT09IFwiZnVuY3Rpb25cIikgcm93ID0gaW5pdCwgaW5pdCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGV4dChpbnB1dCwgaW5pdCkudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHBhcnNlKHJlc3BvbnNlLCByb3cpO1xuICAgIH0pO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkc3YoZGVsaW1pdGVyLCBpbnB1dCwgaW5pdCwgcm93KSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiBpbml0ID09PSBcImZ1bmN0aW9uXCIpIHJvdyA9IGluaXQsIGluaXQgPSB1bmRlZmluZWQ7XG4gIHZhciBmb3JtYXQgPSBkc3ZGb3JtYXQoZGVsaW1pdGVyKTtcbiAgcmV0dXJuIHRleHQoaW5wdXQsIGluaXQpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICByZXR1cm4gZm9ybWF0LnBhcnNlKHJlc3BvbnNlLCByb3cpO1xuICB9KTtcbn1cblxuZXhwb3J0IHZhciBjc3YgPSBkc3ZQYXJzZShjc3ZQYXJzZSk7XG5leHBvcnQgdmFyIHRzdiA9IGRzdlBhcnNlKHRzdlBhcnNlKTtcbiIsImZ1bmN0aW9uIHJlc3BvbnNlSnNvbihyZXNwb25zZSkge1xuICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzICsgXCIgXCIgKyByZXNwb25zZS5zdGF0dXNUZXh0KTtcbiAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA0IHx8IHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA1KSByZXR1cm47XG4gIHJldHVybiByZXNwb25zZS5qc29uKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGlucHV0LCBpbml0KSB7XG4gIHJldHVybiBmZXRjaChpbnB1dCwgaW5pdCkudGhlbihyZXNwb25zZUpzb24pO1xufVxuIiwiZnVuY3Rpb24gcmVzcG9uc2VUZXh0KHJlc3BvbnNlKSB7XG4gIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXMgKyBcIiBcIiArIHJlc3BvbnNlLnN0YXR1c1RleHQpO1xuICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnB1dCwgaW5pdCkge1xuICByZXR1cm4gZmV0Y2goaW5wdXQsIGluaXQpLnRoZW4ocmVzcG9uc2VUZXh0KTtcbn1cbiIsImltcG9ydCBmb3JtYXRMb2NhbGUgZnJvbSBcIi4vbG9jYWxlLmpzXCI7XG5cbnZhciBsb2NhbGU7XG5leHBvcnQgdmFyIGZvcm1hdDtcbmV4cG9ydCB2YXIgZm9ybWF0UHJlZml4O1xuXG5kZWZhdWx0TG9jYWxlKHtcbiAgdGhvdXNhbmRzOiBcIixcIixcbiAgZ3JvdXBpbmc6IFszXSxcbiAgY3VycmVuY3k6IFtcIiRcIiwgXCJcIl1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZWZhdWx0TG9jYWxlKGRlZmluaXRpb24pIHtcbiAgbG9jYWxlID0gZm9ybWF0TG9jYWxlKGRlZmluaXRpb24pO1xuICBmb3JtYXQgPSBsb2NhbGUuZm9ybWF0O1xuICBmb3JtYXRQcmVmaXggPSBsb2NhbGUuZm9ybWF0UHJlZml4O1xuICByZXR1cm4gbG9jYWxlO1xufVxuIiwiaW1wb3J0IHtmb3JtYXREZWNpbWFsUGFydHN9IGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4geCA9IGZvcm1hdERlY2ltYWxQYXJ0cyhNYXRoLmFicyh4KSksIHggPyB4WzFdIDogTmFOO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gTWF0aC5hYnMoeCA9IE1hdGgucm91bmQoeCkpID49IDFlMjFcbiAgICAgID8geC50b0xvY2FsZVN0cmluZyhcImVuXCIpLnJlcGxhY2UoLywvZywgXCJcIilcbiAgICAgIDogeC50b1N0cmluZygxMCk7XG59XG5cbi8vIENvbXB1dGVzIHRoZSBkZWNpbWFsIGNvZWZmaWNpZW50IGFuZCBleHBvbmVudCBvZiB0aGUgc3BlY2lmaWVkIG51bWJlciB4IHdpdGhcbi8vIHNpZ25pZmljYW50IGRpZ2l0cyBwLCB3aGVyZSB4IGlzIHBvc2l0aXZlIGFuZCBwIGlzIGluIFsxLCAyMV0gb3IgdW5kZWZpbmVkLlxuLy8gRm9yIGV4YW1wbGUsIGZvcm1hdERlY2ltYWxQYXJ0cygxLjIzKSByZXR1cm5zIFtcIjEyM1wiLCAwXS5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREZWNpbWFsUGFydHMoeCwgcCkge1xuICBpZiAoKGkgPSAoeCA9IHAgPyB4LnRvRXhwb25lbnRpYWwocCAtIDEpIDogeC50b0V4cG9uZW50aWFsKCkpLmluZGV4T2YoXCJlXCIpKSA8IDApIHJldHVybiBudWxsOyAvLyBOYU4sIMKxSW5maW5pdHlcbiAgdmFyIGksIGNvZWZmaWNpZW50ID0geC5zbGljZSgwLCBpKTtcblxuICAvLyBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRvRXhwb25lbnRpYWwgZWl0aGVyIGhhcyB0aGUgZm9ybSBcXGRcXC5cXGQrZVstK11cXGQrXG4gIC8vIChlLmcuLCAxLjJlKzMpIG9yIHRoZSBmb3JtIFxcZGVbLStdXFxkKyAoZS5nLiwgMWUrMykuXG4gIHJldHVybiBbXG4gICAgY29lZmZpY2llbnQubGVuZ3RoID4gMSA/IGNvZWZmaWNpZW50WzBdICsgY29lZmZpY2llbnQuc2xpY2UoMikgOiBjb2VmZmljaWVudCxcbiAgICAreC5zbGljZShpICsgMSlcbiAgXTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGdyb3VwaW5nLCB0aG91c2FuZHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCB3aWR0aCkge1xuICAgIHZhciBpID0gdmFsdWUubGVuZ3RoLFxuICAgICAgICB0ID0gW10sXG4gICAgICAgIGogPSAwLFxuICAgICAgICBnID0gZ3JvdXBpbmdbMF0sXG4gICAgICAgIGxlbmd0aCA9IDA7XG5cbiAgICB3aGlsZSAoaSA+IDAgJiYgZyA+IDApIHtcbiAgICAgIGlmIChsZW5ndGggKyBnICsgMSA+IHdpZHRoKSBnID0gTWF0aC5tYXgoMSwgd2lkdGggLSBsZW5ndGgpO1xuICAgICAgdC5wdXNoKHZhbHVlLnN1YnN0cmluZyhpIC09IGcsIGkgKyBnKSk7XG4gICAgICBpZiAoKGxlbmd0aCArPSBnICsgMSkgPiB3aWR0aCkgYnJlYWs7XG4gICAgICBnID0gZ3JvdXBpbmdbaiA9IChqICsgMSkgJSBncm91cGluZy5sZW5ndGhdO1xuICAgIH1cblxuICAgIHJldHVybiB0LnJldmVyc2UoKS5qb2luKHRob3VzYW5kcyk7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihudW1lcmFscykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvWzAtOV0vZywgZnVuY3Rpb24oaSkge1xuICAgICAgcmV0dXJuIG51bWVyYWxzWytpXTtcbiAgICB9KTtcbiAgfTtcbn1cbiIsImltcG9ydCB7Zm9ybWF0RGVjaW1hbFBhcnRzfSBmcm9tIFwiLi9mb3JtYXREZWNpbWFsLmpzXCI7XG5cbmV4cG9ydCB2YXIgcHJlZml4RXhwb25lbnQ7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgsIHApIHtcbiAgdmFyIGQgPSBmb3JtYXREZWNpbWFsUGFydHMoeCwgcCk7XG4gIGlmICghZCkgcmV0dXJuIHggKyBcIlwiO1xuICB2YXIgY29lZmZpY2llbnQgPSBkWzBdLFxuICAgICAgZXhwb25lbnQgPSBkWzFdLFxuICAgICAgaSA9IGV4cG9uZW50IC0gKHByZWZpeEV4cG9uZW50ID0gTWF0aC5tYXgoLTgsIE1hdGgubWluKDgsIE1hdGguZmxvb3IoZXhwb25lbnQgLyAzKSkpICogMykgKyAxLFxuICAgICAgbiA9IGNvZWZmaWNpZW50Lmxlbmd0aDtcbiAgcmV0dXJuIGkgPT09IG4gPyBjb2VmZmljaWVudFxuICAgICAgOiBpID4gbiA/IGNvZWZmaWNpZW50ICsgbmV3IEFycmF5KGkgLSBuICsgMSkuam9pbihcIjBcIilcbiAgICAgIDogaSA+IDAgPyBjb2VmZmljaWVudC5zbGljZSgwLCBpKSArIFwiLlwiICsgY29lZmZpY2llbnQuc2xpY2UoaSlcbiAgICAgIDogXCIwLlwiICsgbmV3IEFycmF5KDEgLSBpKS5qb2luKFwiMFwiKSArIGZvcm1hdERlY2ltYWxQYXJ0cyh4LCBNYXRoLm1heCgwLCBwICsgaSAtIDEpKVswXTsgLy8gbGVzcyB0aGFuIDF5IVxufVxuIiwiaW1wb3J0IHtmb3JtYXREZWNpbWFsUGFydHN9IGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCwgcCkge1xuICB2YXIgZCA9IGZvcm1hdERlY2ltYWxQYXJ0cyh4LCBwKTtcbiAgaWYgKCFkKSByZXR1cm4geCArIFwiXCI7XG4gIHZhciBjb2VmZmljaWVudCA9IGRbMF0sXG4gICAgICBleHBvbmVudCA9IGRbMV07XG4gIHJldHVybiBleHBvbmVudCA8IDAgPyBcIjAuXCIgKyBuZXcgQXJyYXkoLWV4cG9uZW50KS5qb2luKFwiMFwiKSArIGNvZWZmaWNpZW50XG4gICAgICA6IGNvZWZmaWNpZW50Lmxlbmd0aCA+IGV4cG9uZW50ICsgMSA/IGNvZWZmaWNpZW50LnNsaWNlKDAsIGV4cG9uZW50ICsgMSkgKyBcIi5cIiArIGNvZWZmaWNpZW50LnNsaWNlKGV4cG9uZW50ICsgMSlcbiAgICAgIDogY29lZmZpY2llbnQgKyBuZXcgQXJyYXkoZXhwb25lbnQgLSBjb2VmZmljaWVudC5sZW5ndGggKyAyKS5qb2luKFwiMFwiKTtcbn1cbiIsIi8vIFtbZmlsbF1hbGlnbl1bc2lnbl1bc3ltYm9sXVswXVt3aWR0aF1bLF1bLnByZWNpc2lvbl1bfl1bdHlwZV1cbnZhciByZSA9IC9eKD86KC4pPyhbPD49Xl0pKT8oWytcXC0oIF0pPyhbJCNdKT8oMCk/KFxcZCspPygsKT8oXFwuXFxkKyk/KH4pPyhbYS16JV0pPyQvaTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcikge1xuICBpZiAoIShtYXRjaCA9IHJlLmV4ZWMoc3BlY2lmaWVyKSkpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgZm9ybWF0OiBcIiArIHNwZWNpZmllcik7XG4gIHZhciBtYXRjaDtcbiAgcmV0dXJuIG5ldyBGb3JtYXRTcGVjaWZpZXIoe1xuICAgIGZpbGw6IG1hdGNoWzFdLFxuICAgIGFsaWduOiBtYXRjaFsyXSxcbiAgICBzaWduOiBtYXRjaFszXSxcbiAgICBzeW1ib2w6IG1hdGNoWzRdLFxuICAgIHplcm86IG1hdGNoWzVdLFxuICAgIHdpZHRoOiBtYXRjaFs2XSxcbiAgICBjb21tYTogbWF0Y2hbN10sXG4gICAgcHJlY2lzaW9uOiBtYXRjaFs4XSAmJiBtYXRjaFs4XS5zbGljZSgxKSxcbiAgICB0cmltOiBtYXRjaFs5XSxcbiAgICB0eXBlOiBtYXRjaFsxMF1cbiAgfSk7XG59XG5cbmZvcm1hdFNwZWNpZmllci5wcm90b3R5cGUgPSBGb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlOyAvLyBpbnN0YW5jZW9mXG5cbmV4cG9ydCBmdW5jdGlvbiBGb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSB7XG4gIHRoaXMuZmlsbCA9IHNwZWNpZmllci5maWxsID09PSB1bmRlZmluZWQgPyBcIiBcIiA6IHNwZWNpZmllci5maWxsICsgXCJcIjtcbiAgdGhpcy5hbGlnbiA9IHNwZWNpZmllci5hbGlnbiA9PT0gdW5kZWZpbmVkID8gXCI+XCIgOiBzcGVjaWZpZXIuYWxpZ24gKyBcIlwiO1xuICB0aGlzLnNpZ24gPSBzcGVjaWZpZXIuc2lnbiA9PT0gdW5kZWZpbmVkID8gXCItXCIgOiBzcGVjaWZpZXIuc2lnbiArIFwiXCI7XG4gIHRoaXMuc3ltYm9sID0gc3BlY2lmaWVyLnN5bWJvbCA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IHNwZWNpZmllci5zeW1ib2wgKyBcIlwiO1xuICB0aGlzLnplcm8gPSAhIXNwZWNpZmllci56ZXJvO1xuICB0aGlzLndpZHRoID0gc3BlY2lmaWVyLndpZHRoID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiArc3BlY2lmaWVyLndpZHRoO1xuICB0aGlzLmNvbW1hID0gISFzcGVjaWZpZXIuY29tbWE7XG4gIHRoaXMucHJlY2lzaW9uID0gc3BlY2lmaWVyLnByZWNpc2lvbiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogK3NwZWNpZmllci5wcmVjaXNpb247XG4gIHRoaXMudHJpbSA9ICEhc3BlY2lmaWVyLnRyaW07XG4gIHRoaXMudHlwZSA9IHNwZWNpZmllci50eXBlID09PSB1bmRlZmluZWQgPyBcIlwiIDogc3BlY2lmaWVyLnR5cGUgKyBcIlwiO1xufVxuXG5Gb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmZpbGxcbiAgICAgICsgdGhpcy5hbGlnblxuICAgICAgKyB0aGlzLnNpZ25cbiAgICAgICsgdGhpcy5zeW1ib2xcbiAgICAgICsgKHRoaXMuemVybyA/IFwiMFwiIDogXCJcIilcbiAgICAgICsgKHRoaXMud2lkdGggPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBNYXRoLm1heCgxLCB0aGlzLndpZHRoIHwgMCkpXG4gICAgICArICh0aGlzLmNvbW1hID8gXCIsXCIgOiBcIlwiKVxuICAgICAgKyAodGhpcy5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBcIi5cIiArIE1hdGgubWF4KDAsIHRoaXMucHJlY2lzaW9uIHwgMCkpXG4gICAgICArICh0aGlzLnRyaW0gPyBcIn5cIiA6IFwiXCIpXG4gICAgICArIHRoaXMudHlwZTtcbn07XG4iLCIvLyBUcmltcyBpbnNpZ25pZmljYW50IHplcm9zLCBlLmcuLCByZXBsYWNlcyAxLjIwMDBrIHdpdGggMS4yay5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHMpIHtcbiAgb3V0OiBmb3IgKHZhciBuID0gcy5sZW5ndGgsIGkgPSAxLCBpMCA9IC0xLCBpMTsgaSA8IG47ICsraSkge1xuICAgIHN3aXRjaCAoc1tpXSkge1xuICAgICAgY2FzZSBcIi5cIjogaTAgPSBpMSA9IGk7IGJyZWFrO1xuICAgICAgY2FzZSBcIjBcIjogaWYgKGkwID09PSAwKSBpMCA9IGk7IGkxID0gaTsgYnJlYWs7XG4gICAgICBkZWZhdWx0OiBpZiAoIStzW2ldKSBicmVhayBvdXQ7IGlmIChpMCA+IDApIGkwID0gMDsgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBpMCA+IDAgPyBzLnNsaWNlKDAsIGkwKSArIHMuc2xpY2UoaTEgKyAxKSA6IHM7XG59XG4iLCJpbXBvcnQgZm9ybWF0RGVjaW1hbCBmcm9tIFwiLi9mb3JtYXREZWNpbWFsLmpzXCI7XG5pbXBvcnQgZm9ybWF0UHJlZml4QXV0byBmcm9tIFwiLi9mb3JtYXRQcmVmaXhBdXRvLmpzXCI7XG5pbXBvcnQgZm9ybWF0Um91bmRlZCBmcm9tIFwiLi9mb3JtYXRSb3VuZGVkLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgXCIlXCI6ICh4LCBwKSA9PiAoeCAqIDEwMCkudG9GaXhlZChwKSxcbiAgXCJiXCI6ICh4KSA9PiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDIpLFxuICBcImNcIjogKHgpID0+IHggKyBcIlwiLFxuICBcImRcIjogZm9ybWF0RGVjaW1hbCxcbiAgXCJlXCI6ICh4LCBwKSA9PiB4LnRvRXhwb25lbnRpYWwocCksXG4gIFwiZlwiOiAoeCwgcCkgPT4geC50b0ZpeGVkKHApLFxuICBcImdcIjogKHgsIHApID0+IHgudG9QcmVjaXNpb24ocCksXG4gIFwib1wiOiAoeCkgPT4gTWF0aC5yb3VuZCh4KS50b1N0cmluZyg4KSxcbiAgXCJwXCI6ICh4LCBwKSA9PiBmb3JtYXRSb3VuZGVkKHggKiAxMDAsIHApLFxuICBcInJcIjogZm9ybWF0Um91bmRlZCxcbiAgXCJzXCI6IGZvcm1hdFByZWZpeEF1dG8sXG4gIFwiWFwiOiAoeCkgPT4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSxcbiAgXCJ4XCI6ICh4KSA9PiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDE2KVxufTtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHg7XG59XG4iLCJpbXBvcnQgZXhwb25lbnQgZnJvbSBcIi4vZXhwb25lbnQuanNcIjtcbmltcG9ydCBmb3JtYXRHcm91cCBmcm9tIFwiLi9mb3JtYXRHcm91cC5qc1wiO1xuaW1wb3J0IGZvcm1hdE51bWVyYWxzIGZyb20gXCIuL2Zvcm1hdE51bWVyYWxzLmpzXCI7XG5pbXBvcnQgZm9ybWF0U3BlY2lmaWVyIGZyb20gXCIuL2Zvcm1hdFNwZWNpZmllci5qc1wiO1xuaW1wb3J0IGZvcm1hdFRyaW0gZnJvbSBcIi4vZm9ybWF0VHJpbS5qc1wiO1xuaW1wb3J0IGZvcm1hdFR5cGVzIGZyb20gXCIuL2Zvcm1hdFR5cGVzLmpzXCI7XG5pbXBvcnQge3ByZWZpeEV4cG9uZW50fSBmcm9tIFwiLi9mb3JtYXRQcmVmaXhBdXRvLmpzXCI7XG5pbXBvcnQgaWRlbnRpdHkgZnJvbSBcIi4vaWRlbnRpdHkuanNcIjtcblxudmFyIG1hcCA9IEFycmF5LnByb3RvdHlwZS5tYXAsXG4gICAgcHJlZml4ZXMgPSBbXCJ5XCIsXCJ6XCIsXCJhXCIsXCJmXCIsXCJwXCIsXCJuXCIsXCLCtVwiLFwibVwiLFwiXCIsXCJrXCIsXCJNXCIsXCJHXCIsXCJUXCIsXCJQXCIsXCJFXCIsXCJaXCIsXCJZXCJdO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihsb2NhbGUpIHtcbiAgdmFyIGdyb3VwID0gbG9jYWxlLmdyb3VwaW5nID09PSB1bmRlZmluZWQgfHwgbG9jYWxlLnRob3VzYW5kcyA9PT0gdW5kZWZpbmVkID8gaWRlbnRpdHkgOiBmb3JtYXRHcm91cChtYXAuY2FsbChsb2NhbGUuZ3JvdXBpbmcsIE51bWJlciksIGxvY2FsZS50aG91c2FuZHMgKyBcIlwiKSxcbiAgICAgIGN1cnJlbmN5UHJlZml4ID0gbG9jYWxlLmN1cnJlbmN5ID09PSB1bmRlZmluZWQgPyBcIlwiIDogbG9jYWxlLmN1cnJlbmN5WzBdICsgXCJcIixcbiAgICAgIGN1cnJlbmN5U3VmZml4ID0gbG9jYWxlLmN1cnJlbmN5ID09PSB1bmRlZmluZWQgPyBcIlwiIDogbG9jYWxlLmN1cnJlbmN5WzFdICsgXCJcIixcbiAgICAgIGRlY2ltYWwgPSBsb2NhbGUuZGVjaW1hbCA9PT0gdW5kZWZpbmVkID8gXCIuXCIgOiBsb2NhbGUuZGVjaW1hbCArIFwiXCIsXG4gICAgICBudW1lcmFscyA9IGxvY2FsZS5udW1lcmFscyA9PT0gdW5kZWZpbmVkID8gaWRlbnRpdHkgOiBmb3JtYXROdW1lcmFscyhtYXAuY2FsbChsb2NhbGUubnVtZXJhbHMsIFN0cmluZykpLFxuICAgICAgcGVyY2VudCA9IGxvY2FsZS5wZXJjZW50ID09PSB1bmRlZmluZWQgPyBcIiVcIiA6IGxvY2FsZS5wZXJjZW50ICsgXCJcIixcbiAgICAgIG1pbnVzID0gbG9jYWxlLm1pbnVzID09PSB1bmRlZmluZWQgPyBcIuKIklwiIDogbG9jYWxlLm1pbnVzICsgXCJcIixcbiAgICAgIG5hbiA9IGxvY2FsZS5uYW4gPT09IHVuZGVmaW5lZCA/IFwiTmFOXCIgOiBsb2NhbGUubmFuICsgXCJcIjtcblxuICBmdW5jdGlvbiBuZXdGb3JtYXQoc3BlY2lmaWVyKSB7XG4gICAgc3BlY2lmaWVyID0gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcik7XG5cbiAgICB2YXIgZmlsbCA9IHNwZWNpZmllci5maWxsLFxuICAgICAgICBhbGlnbiA9IHNwZWNpZmllci5hbGlnbixcbiAgICAgICAgc2lnbiA9IHNwZWNpZmllci5zaWduLFxuICAgICAgICBzeW1ib2wgPSBzcGVjaWZpZXIuc3ltYm9sLFxuICAgICAgICB6ZXJvID0gc3BlY2lmaWVyLnplcm8sXG4gICAgICAgIHdpZHRoID0gc3BlY2lmaWVyLndpZHRoLFxuICAgICAgICBjb21tYSA9IHNwZWNpZmllci5jb21tYSxcbiAgICAgICAgcHJlY2lzaW9uID0gc3BlY2lmaWVyLnByZWNpc2lvbixcbiAgICAgICAgdHJpbSA9IHNwZWNpZmllci50cmltLFxuICAgICAgICB0eXBlID0gc3BlY2lmaWVyLnR5cGU7XG5cbiAgICAvLyBUaGUgXCJuXCIgdHlwZSBpcyBhbiBhbGlhcyBmb3IgXCIsZ1wiLlxuICAgIGlmICh0eXBlID09PSBcIm5cIikgY29tbWEgPSB0cnVlLCB0eXBlID0gXCJnXCI7XG5cbiAgICAvLyBUaGUgXCJcIiB0eXBlLCBhbmQgYW55IGludmFsaWQgdHlwZSwgaXMgYW4gYWxpYXMgZm9yIFwiLjEyfmdcIi5cbiAgICBlbHNlIGlmICghZm9ybWF0VHlwZXNbdHlwZV0pIHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkICYmIChwcmVjaXNpb24gPSAxMiksIHRyaW0gPSB0cnVlLCB0eXBlID0gXCJnXCI7XG5cbiAgICAvLyBJZiB6ZXJvIGZpbGwgaXMgc3BlY2lmaWVkLCBwYWRkaW5nIGdvZXMgYWZ0ZXIgc2lnbiBhbmQgYmVmb3JlIGRpZ2l0cy5cbiAgICBpZiAoemVybyB8fCAoZmlsbCA9PT0gXCIwXCIgJiYgYWxpZ24gPT09IFwiPVwiKSkgemVybyA9IHRydWUsIGZpbGwgPSBcIjBcIiwgYWxpZ24gPSBcIj1cIjtcblxuICAgIC8vIENvbXB1dGUgdGhlIHByZWZpeCBhbmQgc3VmZml4LlxuICAgIC8vIEZvciBTSS1wcmVmaXgsIHRoZSBzdWZmaXggaXMgbGF6aWx5IGNvbXB1dGVkLlxuICAgIHZhciBwcmVmaXggPSBzeW1ib2wgPT09IFwiJFwiID8gY3VycmVuY3lQcmVmaXggOiBzeW1ib2wgPT09IFwiI1wiICYmIC9bYm94WF0vLnRlc3QodHlwZSkgPyBcIjBcIiArIHR5cGUudG9Mb3dlckNhc2UoKSA6IFwiXCIsXG4gICAgICAgIHN1ZmZpeCA9IHN5bWJvbCA9PT0gXCIkXCIgPyBjdXJyZW5jeVN1ZmZpeCA6IC9bJXBdLy50ZXN0KHR5cGUpID8gcGVyY2VudCA6IFwiXCI7XG5cbiAgICAvLyBXaGF0IGZvcm1hdCBmdW5jdGlvbiBzaG91bGQgd2UgdXNlP1xuICAgIC8vIElzIHRoaXMgYW4gaW50ZWdlciB0eXBlP1xuICAgIC8vIENhbiB0aGlzIHR5cGUgZ2VuZXJhdGUgZXhwb25lbnRpYWwgbm90YXRpb24/XG4gICAgdmFyIGZvcm1hdFR5cGUgPSBmb3JtYXRUeXBlc1t0eXBlXSxcbiAgICAgICAgbWF5YmVTdWZmaXggPSAvW2RlZmdwcnMlXS8udGVzdCh0eXBlKTtcblxuICAgIC8vIFNldCB0aGUgZGVmYXVsdCBwcmVjaXNpb24gaWYgbm90IHNwZWNpZmllZCxcbiAgICAvLyBvciBjbGFtcCB0aGUgc3BlY2lmaWVkIHByZWNpc2lvbiB0byB0aGUgc3VwcG9ydGVkIHJhbmdlLlxuICAgIC8vIEZvciBzaWduaWZpY2FudCBwcmVjaXNpb24sIGl0IG11c3QgYmUgaW4gWzEsIDIxXS5cbiAgICAvLyBGb3IgZml4ZWQgcHJlY2lzaW9uLCBpdCBtdXN0IGJlIGluIFswLCAyMF0uXG4gICAgcHJlY2lzaW9uID0gcHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyA2XG4gICAgICAgIDogL1tncHJzXS8udGVzdCh0eXBlKSA/IE1hdGgubWF4KDEsIE1hdGgubWluKDIxLCBwcmVjaXNpb24pKVxuICAgICAgICA6IE1hdGgubWF4KDAsIE1hdGgubWluKDIwLCBwcmVjaXNpb24pKTtcblxuICAgIGZ1bmN0aW9uIGZvcm1hdCh2YWx1ZSkge1xuICAgICAgdmFyIHZhbHVlUHJlZml4ID0gcHJlZml4LFxuICAgICAgICAgIHZhbHVlU3VmZml4ID0gc3VmZml4LFxuICAgICAgICAgIGksIG4sIGM7XG5cbiAgICAgIGlmICh0eXBlID09PSBcImNcIikge1xuICAgICAgICB2YWx1ZVN1ZmZpeCA9IGZvcm1hdFR5cGUodmFsdWUpICsgdmFsdWVTdWZmaXg7XG4gICAgICAgIHZhbHVlID0gXCJcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gK3ZhbHVlO1xuXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgc2lnbi4gLTAgaXMgbm90IGxlc3MgdGhhbiAwLCBidXQgMSAvIC0wIGlzIVxuICAgICAgICB2YXIgdmFsdWVOZWdhdGl2ZSA9IHZhbHVlIDwgMCB8fCAxIC8gdmFsdWUgPCAwO1xuXG4gICAgICAgIC8vIFBlcmZvcm0gdGhlIGluaXRpYWwgZm9ybWF0dGluZy5cbiAgICAgICAgdmFsdWUgPSBpc05hTih2YWx1ZSkgPyBuYW4gOiBmb3JtYXRUeXBlKE1hdGguYWJzKHZhbHVlKSwgcHJlY2lzaW9uKTtcblxuICAgICAgICAvLyBUcmltIGluc2lnbmlmaWNhbnQgemVyb3MuXG4gICAgICAgIGlmICh0cmltKSB2YWx1ZSA9IGZvcm1hdFRyaW0odmFsdWUpO1xuXG4gICAgICAgIC8vIElmIGEgbmVnYXRpdmUgdmFsdWUgcm91bmRzIHRvIHplcm8gYWZ0ZXIgZm9ybWF0dGluZywgYW5kIG5vIGV4cGxpY2l0IHBvc2l0aXZlIHNpZ24gaXMgcmVxdWVzdGVkLCBoaWRlIHRoZSBzaWduLlxuICAgICAgICBpZiAodmFsdWVOZWdhdGl2ZSAmJiArdmFsdWUgPT09IDAgJiYgc2lnbiAhPT0gXCIrXCIpIHZhbHVlTmVnYXRpdmUgPSBmYWxzZTtcblxuICAgICAgICAvLyBDb21wdXRlIHRoZSBwcmVmaXggYW5kIHN1ZmZpeC5cbiAgICAgICAgdmFsdWVQcmVmaXggPSAodmFsdWVOZWdhdGl2ZSA/IChzaWduID09PSBcIihcIiA/IHNpZ24gOiBtaW51cykgOiBzaWduID09PSBcIi1cIiB8fCBzaWduID09PSBcIihcIiA/IFwiXCIgOiBzaWduKSArIHZhbHVlUHJlZml4O1xuICAgICAgICB2YWx1ZVN1ZmZpeCA9ICh0eXBlID09PSBcInNcIiA/IHByZWZpeGVzWzggKyBwcmVmaXhFeHBvbmVudCAvIDNdIDogXCJcIikgKyB2YWx1ZVN1ZmZpeCArICh2YWx1ZU5lZ2F0aXZlICYmIHNpZ24gPT09IFwiKFwiID8gXCIpXCIgOiBcIlwiKTtcblxuICAgICAgICAvLyBCcmVhayB0aGUgZm9ybWF0dGVkIHZhbHVlIGludG8gdGhlIGludGVnZXIg4oCcdmFsdWXigJ0gcGFydCB0aGF0IGNhbiBiZVxuICAgICAgICAvLyBncm91cGVkLCBhbmQgZnJhY3Rpb25hbCBvciBleHBvbmVudGlhbCDigJxzdWZmaXjigJ0gcGFydCB0aGF0IGlzIG5vdC5cbiAgICAgICAgaWYgKG1heWJlU3VmZml4KSB7XG4gICAgICAgICAgaSA9IC0xLCBuID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICAgICAgICBpZiAoYyA9IHZhbHVlLmNoYXJDb2RlQXQoaSksIDQ4ID4gYyB8fCBjID4gNTcpIHtcbiAgICAgICAgICAgICAgdmFsdWVTdWZmaXggPSAoYyA9PT0gNDYgPyBkZWNpbWFsICsgdmFsdWUuc2xpY2UoaSArIDEpIDogdmFsdWUuc2xpY2UoaSkpICsgdmFsdWVTdWZmaXg7XG4gICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgZmlsbCBjaGFyYWN0ZXIgaXMgbm90IFwiMFwiLCBncm91cGluZyBpcyBhcHBsaWVkIGJlZm9yZSBwYWRkaW5nLlxuICAgICAgaWYgKGNvbW1hICYmICF6ZXJvKSB2YWx1ZSA9IGdyb3VwKHZhbHVlLCBJbmZpbml0eSk7XG5cbiAgICAgIC8vIENvbXB1dGUgdGhlIHBhZGRpbmcuXG4gICAgICB2YXIgbGVuZ3RoID0gdmFsdWVQcmVmaXgubGVuZ3RoICsgdmFsdWUubGVuZ3RoICsgdmFsdWVTdWZmaXgubGVuZ3RoLFxuICAgICAgICAgIHBhZGRpbmcgPSBsZW5ndGggPCB3aWR0aCA/IG5ldyBBcnJheSh3aWR0aCAtIGxlbmd0aCArIDEpLmpvaW4oZmlsbCkgOiBcIlwiO1xuXG4gICAgICAvLyBJZiB0aGUgZmlsbCBjaGFyYWN0ZXIgaXMgXCIwXCIsIGdyb3VwaW5nIGlzIGFwcGxpZWQgYWZ0ZXIgcGFkZGluZy5cbiAgICAgIGlmIChjb21tYSAmJiB6ZXJvKSB2YWx1ZSA9IGdyb3VwKHBhZGRpbmcgKyB2YWx1ZSwgcGFkZGluZy5sZW5ndGggPyB3aWR0aCAtIHZhbHVlU3VmZml4Lmxlbmd0aCA6IEluZmluaXR5KSwgcGFkZGluZyA9IFwiXCI7XG5cbiAgICAgIC8vIFJlY29uc3RydWN0IHRoZSBmaW5hbCBvdXRwdXQgYmFzZWQgb24gdGhlIGRlc2lyZWQgYWxpZ25tZW50LlxuICAgICAgc3dpdGNoIChhbGlnbikge1xuICAgICAgICBjYXNlIFwiPFwiOiB2YWx1ZSA9IHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmc7IGJyZWFrO1xuICAgICAgICBjYXNlIFwiPVwiOiB2YWx1ZSA9IHZhbHVlUHJlZml4ICsgcGFkZGluZyArIHZhbHVlICsgdmFsdWVTdWZmaXg7IGJyZWFrO1xuICAgICAgICBjYXNlIFwiXlwiOiB2YWx1ZSA9IHBhZGRpbmcuc2xpY2UoMCwgbGVuZ3RoID0gcGFkZGluZy5sZW5ndGggPj4gMSkgKyB2YWx1ZVByZWZpeCArIHZhbHVlICsgdmFsdWVTdWZmaXggKyBwYWRkaW5nLnNsaWNlKGxlbmd0aCk7IGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiB2YWx1ZSA9IHBhZGRpbmcgKyB2YWx1ZVByZWZpeCArIHZhbHVlICsgdmFsdWVTdWZmaXg7IGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVtZXJhbHModmFsdWUpO1xuICAgIH1cblxuICAgIGZvcm1hdC50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHNwZWNpZmllciArIFwiXCI7XG4gICAgfTtcblxuICAgIHJldHVybiBmb3JtYXQ7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRQcmVmaXgoc3BlY2lmaWVyLCB2YWx1ZSkge1xuICAgIHZhciBmID0gbmV3Rm9ybWF0KChzcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSwgc3BlY2lmaWVyLnR5cGUgPSBcImZcIiwgc3BlY2lmaWVyKSksXG4gICAgICAgIGUgPSBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCh2YWx1ZSkgLyAzKSkpICogMyxcbiAgICAgICAgayA9IE1hdGgucG93KDEwLCAtZSksXG4gICAgICAgIHByZWZpeCA9IHByZWZpeGVzWzggKyBlIC8gM107XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gZihrICogdmFsdWUpICsgcHJlZml4O1xuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGZvcm1hdDogbmV3Rm9ybWF0LFxuICAgIGZvcm1hdFByZWZpeDogZm9ybWF0UHJlZml4XG4gIH07XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYmFzaXModDEsIHYwLCB2MSwgdjIsIHYzKSB7XG4gIHZhciB0MiA9IHQxICogdDEsIHQzID0gdDIgKiB0MTtcbiAgcmV0dXJuICgoMSAtIDMgKiB0MSArIDMgKiB0MiAtIHQzKSAqIHYwXG4gICAgICArICg0IC0gNiAqIHQyICsgMyAqIHQzKSAqIHYxXG4gICAgICArICgxICsgMyAqIHQxICsgMyAqIHQyIC0gMyAqIHQzKSAqIHYyXG4gICAgICArIHQzICogdjMpIC8gNjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWVzKSB7XG4gIHZhciBuID0gdmFsdWVzLmxlbmd0aCAtIDE7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdmFyIGkgPSB0IDw9IDAgPyAodCA9IDApIDogdCA+PSAxID8gKHQgPSAxLCBuIC0gMSkgOiBNYXRoLmZsb29yKHQgKiBuKSxcbiAgICAgICAgdjEgPSB2YWx1ZXNbaV0sXG4gICAgICAgIHYyID0gdmFsdWVzW2kgKyAxXSxcbiAgICAgICAgdjAgPSBpID4gMCA/IHZhbHVlc1tpIC0gMV0gOiAyICogdjEgLSB2MixcbiAgICAgICAgdjMgPSBpIDwgbiAtIDEgPyB2YWx1ZXNbaSArIDJdIDogMiAqIHYyIC0gdjE7XG4gICAgcmV0dXJuIGJhc2lzKCh0IC0gaSAvIG4pICogbiwgdjAsIHYxLCB2MiwgdjMpO1xuICB9O1xufVxuIiwiaW1wb3J0IHtiYXNpc30gZnJvbSBcIi4vYmFzaXMuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWVzKSB7XG4gIHZhciBuID0gdmFsdWVzLmxlbmd0aDtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgaSA9IE1hdGguZmxvb3IoKCh0ICU9IDEpIDwgMCA/ICsrdCA6IHQpICogbiksXG4gICAgICAgIHYwID0gdmFsdWVzWyhpICsgbiAtIDEpICUgbl0sXG4gICAgICAgIHYxID0gdmFsdWVzW2kgJSBuXSxcbiAgICAgICAgdjIgPSB2YWx1ZXNbKGkgKyAxKSAlIG5dLFxuICAgICAgICB2MyA9IHZhbHVlc1soaSArIDIpICUgbl07XG4gICAgcmV0dXJuIGJhc2lzKCh0IC0gaSAvIG4pICogbiwgdjAsIHYxLCB2MiwgdjMpO1xuICB9O1xufVxuIiwiaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5cbmZ1bmN0aW9uIGxpbmVhcihhLCBkKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGEgKyB0ICogZDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZXhwb25lbnRpYWwoYSwgYiwgeSkge1xuICByZXR1cm4gYSA9IE1hdGgucG93KGEsIHkpLCBiID0gTWF0aC5wb3coYiwgeSkgLSBhLCB5ID0gMSAvIHksIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gTWF0aC5wb3coYSArIHQgKiBiLCB5KTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGh1ZShhLCBiKSB7XG4gIHZhciBkID0gYiAtIGE7XG4gIHJldHVybiBkID8gbGluZWFyKGEsIGQgPiAxODAgfHwgZCA8IC0xODAgPyBkIC0gMzYwICogTWF0aC5yb3VuZChkIC8gMzYwKSA6IGQpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnYW1tYSh5KSB7XG4gIHJldHVybiAoeSA9ICt5KSA9PT0gMSA/IG5vZ2FtbWEgOiBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGIgLSBhID8gZXhwb25lbnRpYWwoYSwgYiwgeSkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbm9nYW1tYShhLCBiKSB7XG4gIHZhciBkID0gYiAtIGE7XG4gIHJldHVybiBkID8gbGluZWFyKGEsIGQpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCB4ID0+ICgpID0+IHg7XG4iLCJpbXBvcnQge2xhYiBhcyBjb2xvckxhYn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQgY29sb3IgZnJvbSBcIi4vY29sb3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGFiKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGwgPSBjb2xvcigoc3RhcnQgPSBjb2xvckxhYihzdGFydCkpLmwsIChlbmQgPSBjb2xvckxhYihlbmQpKS5sKSxcbiAgICAgIGEgPSBjb2xvcihzdGFydC5hLCBlbmQuYSksXG4gICAgICBiID0gY29sb3Ioc3RhcnQuYiwgZW5kLmIpLFxuICAgICAgb3BhY2l0eSA9IGNvbG9yKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICBzdGFydC5sID0gbCh0KTtcbiAgICBzdGFydC5hID0gYSh0KTtcbiAgICBzdGFydC5iID0gYih0KTtcbiAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTtcbiAgICByZXR1cm4gc3RhcnQgKyBcIlwiO1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gYSA9ICthLCBiID0gK2IsIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYSAqICgxIC0gdCkgKyBiICogdDtcbiAgfTtcbn1cbiIsImltcG9ydCB7cmdiIGFzIGNvbG9yUmdifSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCBiYXNpcyBmcm9tIFwiLi9iYXNpcy5qc1wiO1xuaW1wb3J0IGJhc2lzQ2xvc2VkIGZyb20gXCIuL2Jhc2lzQ2xvc2VkLmpzXCI7XG5pbXBvcnQgbm9nYW1tYSwge2dhbW1hfSBmcm9tIFwiLi9jb2xvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gcmdiR2FtbWEoeSkge1xuICB2YXIgY29sb3IgPSBnYW1tYSh5KTtcblxuICBmdW5jdGlvbiByZ2Ioc3RhcnQsIGVuZCkge1xuICAgIHZhciByID0gY29sb3IoKHN0YXJ0ID0gY29sb3JSZ2Ioc3RhcnQpKS5yLCAoZW5kID0gY29sb3JSZ2IoZW5kKSkuciksXG4gICAgICAgIGcgPSBjb2xvcihzdGFydC5nLCBlbmQuZyksXG4gICAgICAgIGIgPSBjb2xvcihzdGFydC5iLCBlbmQuYiksXG4gICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgc3RhcnQuciA9IHIodCk7XG4gICAgICBzdGFydC5nID0gZyh0KTtcbiAgICAgIHN0YXJ0LmIgPSBiKHQpO1xuICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7XG4gICAgICByZXR1cm4gc3RhcnQgKyBcIlwiO1xuICAgIH07XG4gIH1cblxuICByZ2IuZ2FtbWEgPSByZ2JHYW1tYTtcblxuICByZXR1cm4gcmdiO1xufSkoMSk7XG5cbmZ1bmN0aW9uIHJnYlNwbGluZShzcGxpbmUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGNvbG9ycykge1xuICAgIHZhciBuID0gY29sb3JzLmxlbmd0aCxcbiAgICAgICAgciA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgZyA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgYiA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgaSwgY29sb3I7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgY29sb3IgPSBjb2xvclJnYihjb2xvcnNbaV0pO1xuICAgICAgcltpXSA9IGNvbG9yLnIgfHwgMDtcbiAgICAgIGdbaV0gPSBjb2xvci5nIHx8IDA7XG4gICAgICBiW2ldID0gY29sb3IuYiB8fCAwO1xuICAgIH1cbiAgICByID0gc3BsaW5lKHIpO1xuICAgIGcgPSBzcGxpbmUoZyk7XG4gICAgYiA9IHNwbGluZShiKTtcbiAgICBjb2xvci5vcGFjaXR5ID0gMTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgY29sb3IuciA9IHIodCk7XG4gICAgICBjb2xvci5nID0gZyh0KTtcbiAgICAgIGNvbG9yLmIgPSBiKHQpO1xuICAgICAgcmV0dXJuIGNvbG9yICsgXCJcIjtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgdmFyIHJnYkJhc2lzID0gcmdiU3BsaW5lKGJhc2lzKTtcbmV4cG9ydCB2YXIgcmdiQmFzaXNDbG9zZWQgPSByZ2JTcGxpbmUoYmFzaXNDbG9zZWQpO1xuIiwiaW1wb3J0IG51bWJlciBmcm9tIFwiLi9udW1iZXIuanNcIjtcblxudmFyIHJlQSA9IC9bLStdPyg/OlxcZCtcXC4/XFxkKnxcXC4/XFxkKykoPzpbZUVdWy0rXT9cXGQrKT8vZyxcbiAgICByZUIgPSBuZXcgUmVnRXhwKHJlQS5zb3VyY2UsIFwiZ1wiKTtcblxuZnVuY3Rpb24gemVybyhiKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb25lKGIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYih0KSArIFwiXCI7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIGJpID0gcmVBLmxhc3RJbmRleCA9IHJlQi5sYXN0SW5kZXggPSAwLCAvLyBzY2FuIGluZGV4IGZvciBuZXh0IG51bWJlciBpbiBiXG4gICAgICBhbSwgLy8gY3VycmVudCBtYXRjaCBpbiBhXG4gICAgICBibSwgLy8gY3VycmVudCBtYXRjaCBpbiBiXG4gICAgICBicywgLy8gc3RyaW5nIHByZWNlZGluZyBjdXJyZW50IG51bWJlciBpbiBiLCBpZiBhbnlcbiAgICAgIGkgPSAtMSwgLy8gaW5kZXggaW4gc1xuICAgICAgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnNcbiAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnNcblxuICAvLyBDb2VyY2UgaW5wdXRzIHRvIHN0cmluZ3MuXG4gIGEgPSBhICsgXCJcIiwgYiA9IGIgKyBcIlwiO1xuXG4gIC8vIEludGVycG9sYXRlIHBhaXJzIG9mIG51bWJlcnMgaW4gYSAmIGIuXG4gIHdoaWxlICgoYW0gPSByZUEuZXhlYyhhKSlcbiAgICAgICYmIChibSA9IHJlQi5leGVjKGIpKSkge1xuICAgIGlmICgoYnMgPSBibS5pbmRleCkgPiBiaSkgeyAvLyBhIHN0cmluZyBwcmVjZWRlcyB0aGUgbmV4dCBudW1iZXIgaW4gYlxuICAgICAgYnMgPSBiLnNsaWNlKGJpLCBicyk7XG4gICAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICAgIGVsc2Ugc1srK2ldID0gYnM7XG4gICAgfVxuICAgIGlmICgoYW0gPSBhbVswXSkgPT09IChibSA9IGJtWzBdKSkgeyAvLyBudW1iZXJzIGluIGEgJiBiIG1hdGNoXG4gICAgICBpZiAoc1tpXSkgc1tpXSArPSBibTsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICAgIGVsc2Ugc1srK2ldID0gYm07XG4gICAgfSBlbHNlIHsgLy8gaW50ZXJwb2xhdGUgbm9uLW1hdGNoaW5nIG51bWJlcnNcbiAgICAgIHNbKytpXSA9IG51bGw7XG4gICAgICBxLnB1c2goe2k6IGksIHg6IG51bWJlcihhbSwgYm0pfSk7XG4gICAgfVxuICAgIGJpID0gcmVCLmxhc3RJbmRleDtcbiAgfVxuXG4gIC8vIEFkZCByZW1haW5zIG9mIGIuXG4gIGlmIChiaSA8IGIubGVuZ3RoKSB7XG4gICAgYnMgPSBiLnNsaWNlKGJpKTtcbiAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICBlbHNlIHNbKytpXSA9IGJzO1xuICB9XG5cbiAgLy8gU3BlY2lhbCBvcHRpbWl6YXRpb24gZm9yIG9ubHkgYSBzaW5nbGUgbWF0Y2guXG4gIC8vIE90aGVyd2lzZSwgaW50ZXJwb2xhdGUgZWFjaCBvZiB0aGUgbnVtYmVycyBhbmQgcmVqb2luIHRoZSBzdHJpbmcuXG4gIHJldHVybiBzLmxlbmd0aCA8IDIgPyAocVswXVxuICAgICAgPyBvbmUocVswXS54KVxuICAgICAgOiB6ZXJvKGIpKVxuICAgICAgOiAoYiA9IHEubGVuZ3RoLCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG87IGkgPCBiOyArK2kpIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTtcbiAgICAgICAgICByZXR1cm4gcy5qb2luKFwiXCIpO1xuICAgICAgICB9KTtcbn1cbiIsInZhciBkZWdyZWVzID0gMTgwIC8gTWF0aC5QSTtcblxuZXhwb3J0IHZhciBpZGVudGl0eSA9IHtcbiAgdHJhbnNsYXRlWDogMCxcbiAgdHJhbnNsYXRlWTogMCxcbiAgcm90YXRlOiAwLFxuICBza2V3WDogMCxcbiAgc2NhbGVYOiAxLFxuICBzY2FsZVk6IDFcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgdmFyIHNjYWxlWCwgc2NhbGVZLCBza2V3WDtcbiAgaWYgKHNjYWxlWCA9IE1hdGguc3FydChhICogYSArIGIgKiBiKSkgYSAvPSBzY2FsZVgsIGIgLz0gc2NhbGVYO1xuICBpZiAoc2tld1ggPSBhICogYyArIGIgKiBkKSBjIC09IGEgKiBza2V3WCwgZCAtPSBiICogc2tld1g7XG4gIGlmIChzY2FsZVkgPSBNYXRoLnNxcnQoYyAqIGMgKyBkICogZCkpIGMgLz0gc2NhbGVZLCBkIC89IHNjYWxlWSwgc2tld1ggLz0gc2NhbGVZO1xuICBpZiAoYSAqIGQgPCBiICogYykgYSA9IC1hLCBiID0gLWIsIHNrZXdYID0gLXNrZXdYLCBzY2FsZVggPSAtc2NhbGVYO1xuICByZXR1cm4ge1xuICAgIHRyYW5zbGF0ZVg6IGUsXG4gICAgdHJhbnNsYXRlWTogZixcbiAgICByb3RhdGU6IE1hdGguYXRhbjIoYiwgYSkgKiBkZWdyZWVzLFxuICAgIHNrZXdYOiBNYXRoLmF0YW4oc2tld1gpICogZGVncmVlcyxcbiAgICBzY2FsZVg6IHNjYWxlWCxcbiAgICBzY2FsZVk6IHNjYWxlWVxuICB9O1xufVxuIiwiaW1wb3J0IG51bWJlciBmcm9tIFwiLi4vbnVtYmVyLmpzXCI7XG5pbXBvcnQge3BhcnNlQ3NzLCBwYXJzZVN2Z30gZnJvbSBcIi4vcGFyc2UuanNcIjtcblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2UsIHB4Q29tbWEsIHB4UGFyZW4sIGRlZ1BhcmVuKSB7XG5cbiAgZnVuY3Rpb24gcG9wKHMpIHtcbiAgICByZXR1cm4gcy5sZW5ndGggPyBzLnBvcCgpICsgXCIgXCIgOiBcIlwiO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNsYXRlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7XG4gICAgaWYgKHhhICE9PSB4YiB8fCB5YSAhPT0geWIpIHtcbiAgICAgIHZhciBpID0gcy5wdXNoKFwidHJhbnNsYXRlKFwiLCBudWxsLCBweENvbW1hLCBudWxsLCBweFBhcmVuKTtcbiAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IG51bWJlcih4YSwgeGIpfSwge2k6IGkgLSAyLCB4OiBudW1iZXIoeWEsIHliKX0pO1xuICAgIH0gZWxzZSBpZiAoeGIgfHwgeWIpIHtcbiAgICAgIHMucHVzaChcInRyYW5zbGF0ZShcIiArIHhiICsgcHhDb21tYSArIHliICsgcHhQYXJlbik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcm90YXRlKGEsIGIsIHMsIHEpIHtcbiAgICBpZiAoYSAhPT0gYikge1xuICAgICAgaWYgKGEgLSBiID4gMTgwKSBiICs9IDM2MDsgZWxzZSBpZiAoYiAtIGEgPiAxODApIGEgKz0gMzYwOyAvLyBzaG9ydGVzdCBwYXRoXG4gICAgICBxLnB1c2goe2k6IHMucHVzaChwb3AocykgKyBcInJvdGF0ZShcIiwgbnVsbCwgZGVnUGFyZW4pIC0gMiwgeDogbnVtYmVyKGEsIGIpfSk7XG4gICAgfSBlbHNlIGlmIChiKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJyb3RhdGUoXCIgKyBiICsgZGVnUGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNrZXdYKGEsIGIsIHMsIHEpIHtcbiAgICBpZiAoYSAhPT0gYikge1xuICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgXCJza2V3WChcIiwgbnVsbCwgZGVnUGFyZW4pIC0gMiwgeDogbnVtYmVyKGEsIGIpfSk7XG4gICAgfSBlbHNlIGlmIChiKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJza2V3WChcIiArIGIgKyBkZWdQYXJlbik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2NhbGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHtcbiAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5Yikge1xuICAgICAgdmFyIGkgPSBzLnB1c2gocG9wKHMpICsgXCJzY2FsZShcIiwgbnVsbCwgXCIsXCIsIG51bGwsIFwiKVwiKTtcbiAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IG51bWJlcih4YSwgeGIpfSwge2k6IGkgLSAyLCB4OiBudW1iZXIoeWEsIHliKX0pO1xuICAgIH0gZWxzZSBpZiAoeGIgIT09IDEgfHwgeWIgIT09IDEpIHtcbiAgICAgIHMucHVzaChwb3AocykgKyBcInNjYWxlKFwiICsgeGIgKyBcIixcIiArIHliICsgXCIpXCIpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbihhLCBiKSB7XG4gICAgdmFyIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzXG4gICAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnNcbiAgICBhID0gcGFyc2UoYSksIGIgPSBwYXJzZShiKTtcbiAgICB0cmFuc2xhdGUoYS50cmFuc2xhdGVYLCBhLnRyYW5zbGF0ZVksIGIudHJhbnNsYXRlWCwgYi50cmFuc2xhdGVZLCBzLCBxKTtcbiAgICByb3RhdGUoYS5yb3RhdGUsIGIucm90YXRlLCBzLCBxKTtcbiAgICBza2V3WChhLnNrZXdYLCBiLnNrZXdYLCBzLCBxKTtcbiAgICBzY2FsZShhLnNjYWxlWCwgYS5zY2FsZVksIGIuc2NhbGVYLCBiLnNjYWxlWSwgcywgcSk7XG4gICAgYSA9IGIgPSBudWxsOyAvLyBnY1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICB2YXIgaSA9IC0xLCBuID0gcS5sZW5ndGgsIG87XG4gICAgICB3aGlsZSAoKytpIDwgbikgc1sobyA9IHFbaV0pLmldID0gby54KHQpO1xuICAgICAgcmV0dXJuIHMuam9pbihcIlwiKTtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtQ3NzID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VDc3MsIFwicHgsIFwiLCBcInB4KVwiLCBcImRlZylcIik7XG5leHBvcnQgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtU3ZnID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VTdmcsIFwiLCBcIiwgXCIpXCIsIFwiKVwiKTtcbiIsImltcG9ydCBkZWNvbXBvc2UsIHtpZGVudGl0eX0gZnJvbSBcIi4vZGVjb21wb3NlLmpzXCI7XG5cbnZhciBzdmdOb2RlO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ3NzKHZhbHVlKSB7XG4gIGNvbnN0IG0gPSBuZXcgKHR5cGVvZiBET01NYXRyaXggPT09IFwiZnVuY3Rpb25cIiA/IERPTU1hdHJpeCA6IFdlYktpdENTU01hdHJpeCkodmFsdWUgKyBcIlwiKTtcbiAgcmV0dXJuIG0uaXNJZGVudGl0eSA/IGlkZW50aXR5IDogZGVjb21wb3NlKG0uYSwgbS5iLCBtLmMsIG0uZCwgbS5lLCBtLmYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdmcodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBpZGVudGl0eTtcbiAgaWYgKCFzdmdOb2RlKSBzdmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJnXCIpO1xuICBzdmdOb2RlLnNldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiLCB2YWx1ZSk7XG4gIGlmICghKHZhbHVlID0gc3ZnTm9kZS50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKSkgcmV0dXJuIGlkZW50aXR5O1xuICB2YWx1ZSA9IHZhbHVlLm1hdHJpeDtcbiAgcmV0dXJuIGRlY29tcG9zZSh2YWx1ZS5hLCB2YWx1ZS5iLCB2YWx1ZS5jLCB2YWx1ZS5kLCB2YWx1ZS5lLCB2YWx1ZS5mKTtcbn1cbiIsInZhciBlcHNpbG9uMiA9IDFlLTEyO1xuXG5mdW5jdGlvbiBjb3NoKHgpIHtcbiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKHgpKSArIDEgLyB4KSAvIDI7XG59XG5cbmZ1bmN0aW9uIHNpbmgoeCkge1xuICByZXR1cm4gKCh4ID0gTWF0aC5leHAoeCkpIC0gMSAvIHgpIC8gMjtcbn1cblxuZnVuY3Rpb24gdGFuaCh4KSB7XG4gIHJldHVybiAoKHggPSBNYXRoLmV4cCgyICogeCkpIC0gMSkgLyAoeCArIDEpO1xufVxuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gem9vbVJobyhyaG8sIHJobzIsIHJobzQpIHtcblxuICAvLyBwMCA9IFt1eDAsIHV5MCwgdzBdXG4gIC8vIHAxID0gW3V4MSwgdXkxLCB3MV1cbiAgZnVuY3Rpb24gem9vbShwMCwgcDEpIHtcbiAgICB2YXIgdXgwID0gcDBbMF0sIHV5MCA9IHAwWzFdLCB3MCA9IHAwWzJdLFxuICAgICAgICB1eDEgPSBwMVswXSwgdXkxID0gcDFbMV0sIHcxID0gcDFbMl0sXG4gICAgICAgIGR4ID0gdXgxIC0gdXgwLFxuICAgICAgICBkeSA9IHV5MSAtIHV5MCxcbiAgICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeSxcbiAgICAgICAgaSxcbiAgICAgICAgUztcblxuICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgdTAg4omFIHUxLlxuICAgIGlmIChkMiA8IGVwc2lsb24yKSB7XG4gICAgICBTID0gTWF0aC5sb2codzEgLyB3MCkgLyByaG87XG4gICAgICBpID0gZnVuY3Rpb24odCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHV4MCArIHQgKiBkeCxcbiAgICAgICAgICB1eTAgKyB0ICogZHksXG4gICAgICAgICAgdzAgKiBNYXRoLmV4cChyaG8gKiB0ICogUylcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZW5lcmFsIGNhc2UuXG4gICAgZWxzZSB7XG4gICAgICB2YXIgZDEgPSBNYXRoLnNxcnQoZDIpLFxuICAgICAgICAgIGIwID0gKHcxICogdzEgLSB3MCAqIHcwICsgcmhvNCAqIGQyKSAvICgyICogdzAgKiByaG8yICogZDEpLFxuICAgICAgICAgIGIxID0gKHcxICogdzEgLSB3MCAqIHcwIC0gcmhvNCAqIGQyKSAvICgyICogdzEgKiByaG8yICogZDEpLFxuICAgICAgICAgIHIwID0gTWF0aC5sb2coTWF0aC5zcXJ0KGIwICogYjAgKyAxKSAtIGIwKSxcbiAgICAgICAgICByMSA9IE1hdGgubG9nKE1hdGguc3FydChiMSAqIGIxICsgMSkgLSBiMSk7XG4gICAgICBTID0gKHIxIC0gcjApIC8gcmhvO1xuICAgICAgaSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgdmFyIHMgPSB0ICogUyxcbiAgICAgICAgICAgIGNvc2hyMCA9IGNvc2gocjApLFxuICAgICAgICAgICAgdSA9IHcwIC8gKHJobzIgKiBkMSkgKiAoY29zaHIwICogdGFuaChyaG8gKiBzICsgcjApIC0gc2luaChyMCkpO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHV4MCArIHUgKiBkeCxcbiAgICAgICAgICB1eTAgKyB1ICogZHksXG4gICAgICAgICAgdzAgKiBjb3NocjAgLyBjb3NoKHJobyAqIHMgKyByMClcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpLmR1cmF0aW9uID0gUyAqIDEwMDAgKiByaG8gLyBNYXRoLlNRUlQyO1xuXG4gICAgcmV0dXJuIGk7XG4gIH1cblxuICB6b29tLnJobyA9IGZ1bmN0aW9uKF8pIHtcbiAgICB2YXIgXzEgPSBNYXRoLm1heCgxZS0zLCArXyksIF8yID0gXzEgKiBfMSwgXzQgPSBfMiAqIF8yO1xuICAgIHJldHVybiB6b29tUmhvKF8xLCBfMiwgXzQpO1xuICB9O1xuXG4gIHJldHVybiB6b29tO1xufSkoTWF0aC5TUVJUMiwgMiwgNCk7XG4iLCJleHBvcnQgZGVmYXVsdCBNYXRoLnJhbmRvbTtcbiIsImltcG9ydCBkZWZhdWx0U291cmNlIGZyb20gXCIuL2RlZmF1bHRTb3VyY2UuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIHNvdXJjZVJhbmRvbU5vcm1hbChzb3VyY2UpIHtcbiAgZnVuY3Rpb24gcmFuZG9tTm9ybWFsKG11LCBzaWdtYSkge1xuICAgIHZhciB4LCByO1xuICAgIG11ID0gbXUgPT0gbnVsbCA/IDAgOiArbXU7XG4gICAgc2lnbWEgPSBzaWdtYSA9PSBudWxsID8gMSA6ICtzaWdtYTtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgeTtcblxuICAgICAgLy8gSWYgYXZhaWxhYmxlLCB1c2UgdGhlIHNlY29uZCBwcmV2aW91c2x5LWdlbmVyYXRlZCB1bmlmb3JtIHJhbmRvbS5cbiAgICAgIGlmICh4ICE9IG51bGwpIHkgPSB4LCB4ID0gbnVsbDtcblxuICAgICAgLy8gT3RoZXJ3aXNlLCBnZW5lcmF0ZSBhIG5ldyB4IGFuZCB5LlxuICAgICAgZWxzZSBkbyB7XG4gICAgICAgIHggPSBzb3VyY2UoKSAqIDIgLSAxO1xuICAgICAgICB5ID0gc291cmNlKCkgKiAyIC0gMTtcbiAgICAgICAgciA9IHggKiB4ICsgeSAqIHk7XG4gICAgICB9IHdoaWxlICghciB8fCByID4gMSk7XG5cbiAgICAgIHJldHVybiBtdSArIHNpZ21hICogeSAqIE1hdGguc3FydCgtMiAqIE1hdGgubG9nKHIpIC8gcik7XG4gICAgfTtcbiAgfVxuXG4gIHJhbmRvbU5vcm1hbC5zb3VyY2UgPSBzb3VyY2VSYW5kb21Ob3JtYWw7XG5cbiAgcmV0dXJuIHJhbmRvbU5vcm1hbDtcbn0pKGRlZmF1bHRTb3VyY2UpO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGluaXRSYW5nZShkb21haW4sIHJhbmdlKSB7XG4gIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogYnJlYWs7XG4gICAgY2FzZSAxOiB0aGlzLnJhbmdlKGRvbWFpbik7IGJyZWFrO1xuICAgIGRlZmF1bHQ6IHRoaXMucmFuZ2UocmFuZ2UpLmRvbWFpbihkb21haW4pOyBicmVhaztcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRJbnRlcnBvbGF0b3IoZG9tYWluLCBpbnRlcnBvbGF0b3IpIHtcbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiBicmVhaztcbiAgICBjYXNlIDE6IHtcbiAgICAgIGlmICh0eXBlb2YgZG9tYWluID09PSBcImZ1bmN0aW9uXCIpIHRoaXMuaW50ZXJwb2xhdG9yKGRvbWFpbik7XG4gICAgICBlbHNlIHRoaXMucmFuZ2UoZG9tYWluKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICB0aGlzLmRvbWFpbihkb21haW4pO1xuICAgICAgaWYgKHR5cGVvZiBpbnRlcnBvbGF0b3IgPT09IFwiZnVuY3Rpb25cIikgdGhpcy5pbnRlcnBvbGF0b3IoaW50ZXJwb2xhdG9yKTtcbiAgICAgIGVsc2UgdGhpcy5yYW5nZShpbnRlcnBvbGF0b3IpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufVxuIiwiaW1wb3J0IHthc2NlbmRpbmcsIGJpc2VjdCwgcXVhbnRpbGVTb3J0ZWQgYXMgdGhyZXNob2xkfSBmcm9tIFwiZDMtYXJyYXlcIjtcbmltcG9ydCB7aW5pdFJhbmdlfSBmcm9tIFwiLi9pbml0LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHF1YW50aWxlKCkge1xuICB2YXIgZG9tYWluID0gW10sXG4gICAgICByYW5nZSA9IFtdLFxuICAgICAgdGhyZXNob2xkcyA9IFtdLFxuICAgICAgdW5rbm93bjtcblxuICBmdW5jdGlvbiByZXNjYWxlKCkge1xuICAgIHZhciBpID0gMCwgbiA9IE1hdGgubWF4KDEsIHJhbmdlLmxlbmd0aCk7XG4gICAgdGhyZXNob2xkcyA9IG5ldyBBcnJheShuIC0gMSk7XG4gICAgd2hpbGUgKCsraSA8IG4pIHRocmVzaG9sZHNbaSAtIDFdID0gdGhyZXNob2xkKGRvbWFpbiwgaSAvIG4pO1xuICAgIHJldHVybiBzY2FsZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNjYWxlKHgpIHtcbiAgICByZXR1cm4geCA9PSBudWxsIHx8IGlzTmFOKHggPSAreCkgPyB1bmtub3duIDogcmFuZ2VbYmlzZWN0KHRocmVzaG9sZHMsIHgpXTtcbiAgfVxuXG4gIHNjYWxlLmludmVydEV4dGVudCA9IGZ1bmN0aW9uKHkpIHtcbiAgICB2YXIgaSA9IHJhbmdlLmluZGV4T2YoeSk7XG4gICAgcmV0dXJuIGkgPCAwID8gW05hTiwgTmFOXSA6IFtcbiAgICAgIGkgPiAwID8gdGhyZXNob2xkc1tpIC0gMV0gOiBkb21haW5bMF0sXG4gICAgICBpIDwgdGhyZXNob2xkcy5sZW5ndGggPyB0aHJlc2hvbGRzW2ldIDogZG9tYWluW2RvbWFpbi5sZW5ndGggLSAxXVxuICAgIF07XG4gIH07XG5cbiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbi5zbGljZSgpO1xuICAgIGRvbWFpbiA9IFtdO1xuICAgIGZvciAobGV0IGQgb2YgXykgaWYgKGQgIT0gbnVsbCAmJiAhaXNOYU4oZCA9ICtkKSkgZG9tYWluLnB1c2goZCk7XG4gICAgZG9tYWluLnNvcnQoYXNjZW5kaW5nKTtcbiAgICByZXR1cm4gcmVzY2FsZSgpO1xuICB9O1xuXG4gIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlID0gQXJyYXkuZnJvbShfKSwgcmVzY2FsZSgpKSA6IHJhbmdlLnNsaWNlKCk7XG4gIH07XG5cbiAgc2NhbGUudW5rbm93biA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh1bmtub3duID0gXywgc2NhbGUpIDogdW5rbm93bjtcbiAgfTtcblxuICBzY2FsZS5xdWFudGlsZXMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhyZXNob2xkcy5zbGljZSgpO1xuICB9O1xuXG4gIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gcXVhbnRpbGUoKVxuICAgICAgICAuZG9tYWluKGRvbWFpbilcbiAgICAgICAgLnJhbmdlKHJhbmdlKVxuICAgICAgICAudW5rbm93bih1bmtub3duKTtcbiAgfTtcblxuICByZXR1cm4gaW5pdFJhbmdlLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpO1xufVxuIiwiLy8gR2l2ZW4gc29tZXRoaW5nIGFycmF5IGxpa2UgKG9yIG51bGwpLCByZXR1cm5zIHNvbWV0aGluZyB0aGF0IGlzIHN0cmljdGx5IGFuXG4vLyBhcnJheS4gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IGFycmF5LWxpa2Ugb2JqZWN0cyBwYXNzZWQgdG8gZDMuc2VsZWN0QWxsXG4vLyBvciBzZWxlY3Rpb24uc2VsZWN0QWxsIGFyZSBjb252ZXJ0ZWQgaW50byBwcm9wZXIgYXJyYXlzIHdoZW4gY3JlYXRpbmcgYVxuLy8gc2VsZWN0aW9uOyB3ZSBkb27igJl0IGV2ZXIgd2FudCB0byBjcmVhdGUgYSBzZWxlY3Rpb24gYmFja2VkIGJ5IGEgbGl2ZVxuLy8gSFRNTENvbGxlY3Rpb24gb3IgTm9kZUxpc3QuIEhvd2V2ZXIsIG5vdGUgdGhhdCBzZWxlY3Rpb24uc2VsZWN0QWxsIHdpbGwgdXNlIGFcbi8vIHN0YXRpYyBOb2RlTGlzdCBhcyBhIGdyb3VwLCBzaW5jZSBpdCBzYWZlbHkgZGVyaXZlZCBmcm9tIHF1ZXJ5U2VsZWN0b3JBbGwuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhcnJheSh4KSB7XG4gIHJldHVybiB4ID09IG51bGwgPyBbXSA6IEFycmF5LmlzQXJyYXkoeCkgPyB4IDogQXJyYXkuZnJvbSh4KTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB4O1xuICB9O1xufVxuIiwiaW1wb3J0IG5hbWVzcGFjZSBmcm9tIFwiLi9uYW1lc3BhY2UuanNcIjtcbmltcG9ydCB7eGh0bWx9IGZyb20gXCIuL25hbWVzcGFjZXMuanNcIjtcblxuZnVuY3Rpb24gY3JlYXRvckluaGVyaXQobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRvY3VtZW50ID0gdGhpcy5vd25lckRvY3VtZW50LFxuICAgICAgICB1cmkgPSB0aGlzLm5hbWVzcGFjZVVSSTtcbiAgICByZXR1cm4gdXJpID09PSB4aHRtbCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJID09PSB4aHRtbFxuICAgICAgICA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSlcbiAgICAgICAgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlModXJpLCBuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRvckZpeGVkKGZ1bGxuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTtcbiAgcmV0dXJuIChmdWxsbmFtZS5sb2NhbFxuICAgICAgPyBjcmVhdG9yRml4ZWRcbiAgICAgIDogY3JlYXRvckluaGVyaXQpKGZ1bGxuYW1lKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoaWxkTWF0Y2hlcihzZWxlY3Rvcikge1xuICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgIHJldHVybiBub2RlLm1hdGNoZXMoc2VsZWN0b3IpO1xuICB9O1xufVxuXG4iLCJpbXBvcnQgbmFtZXNwYWNlcyBmcm9tIFwiLi9uYW1lc3BhY2VzLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIHByZWZpeCA9IG5hbWUgKz0gXCJcIiwgaSA9IHByZWZpeC5pbmRleE9mKFwiOlwiKTtcbiAgaWYgKGkgPj0gMCAmJiAocHJlZml4ID0gbmFtZS5zbGljZSgwLCBpKSkgIT09IFwieG1sbnNcIikgbmFtZSA9IG5hbWUuc2xpY2UoaSArIDEpO1xuICByZXR1cm4gbmFtZXNwYWNlcy5oYXNPd25Qcm9wZXJ0eShwcmVmaXgpID8ge3NwYWNlOiBuYW1lc3BhY2VzW3ByZWZpeF0sIGxvY2FsOiBuYW1lfSA6IG5hbWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG59XG4iLCJleHBvcnQgdmFyIHhodG1sID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc3ZnOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gIHhodG1sOiB4aHRtbCxcbiAgeGxpbms6IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxuICB4bWw6IFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCIsXG4gIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvXCJcbn07XG4iLCJpbXBvcnQgc291cmNlRXZlbnQgZnJvbSBcIi4vc291cmNlRXZlbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZXZlbnQsIG5vZGUpIHtcbiAgZXZlbnQgPSBzb3VyY2VFdmVudChldmVudCk7XG4gIGlmIChub2RlID09PSB1bmRlZmluZWQpIG5vZGUgPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuICBpZiAobm9kZSkge1xuICAgIHZhciBzdmcgPSBub2RlLm93bmVyU1ZHRWxlbWVudCB8fCBub2RlO1xuICAgIGlmIChzdmcuY3JlYXRlU1ZHUG9pbnQpIHtcbiAgICAgIHZhciBwb2ludCA9IHN2Zy5jcmVhdGVTVkdQb2ludCgpO1xuICAgICAgcG9pbnQueCA9IGV2ZW50LmNsaWVudFgsIHBvaW50LnkgPSBldmVudC5jbGllbnRZO1xuICAgICAgcG9pbnQgPSBwb2ludC5tYXRyaXhUcmFuc2Zvcm0obm9kZS5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpO1xuICAgICAgcmV0dXJuIFtwb2ludC54LCBwb2ludC55XTtcbiAgICB9XG4gICAgaWYgKG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7XG4gICAgICB2YXIgcmVjdCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICByZXR1cm4gW2V2ZW50LmNsaWVudFggLSByZWN0LmxlZnQgLSBub2RlLmNsaWVudExlZnQsIGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCAtIG5vZGUuY2xpZW50VG9wXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtldmVudC5wYWdlWCwgZXZlbnQucGFnZVldO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb24sIHJvb3R9IGZyb20gXCIuL3NlbGVjdGlvbi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiXG4gICAgICA/IG5ldyBTZWxlY3Rpb24oW1tkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKV1dLCBbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSlcbiAgICAgIDogbmV3IFNlbGVjdGlvbihbW3NlbGVjdG9yXV0sIHJvb3QpO1xufVxuIiwiaW1wb3J0IGNyZWF0b3IgZnJvbSBcIi4uL2NyZWF0b3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpO1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9KTtcbn1cbiIsImltcG9ydCBuYW1lc3BhY2UgZnJvbSBcIi4uL25hbWVzcGFjZS5qc1wiO1xuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlTlMoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50KG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudE5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHZhbHVlKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoZnVsbG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHYpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUoKTtcbiAgICByZXR1cm4gZnVsbG5hbWUubG9jYWxcbiAgICAgICAgPyBub2RlLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbClcbiAgICAgICAgOiBub2RlLmdldEF0dHJpYnV0ZShmdWxsbmFtZSk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJSZW1vdmVOUyA6IGF0dHJSZW1vdmUpIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TIDogYXR0ckZ1bmN0aW9uKVxuICAgICAgOiAoZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyA6IGF0dHJDb25zdGFudCkpKShmdWxsbmFtZSwgdmFsdWUpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbMF07XG4gIGFyZ3VtZW50c1swXSA9IHRoaXM7XG4gIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwiZnVuY3Rpb24gY2xhc3NBcnJheShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy50cmltKCkuc3BsaXQoL158XFxzKy8pO1xufVxuXG5mdW5jdGlvbiBjbGFzc0xpc3Qobm9kZSkge1xuICByZXR1cm4gbm9kZS5jbGFzc0xpc3QgfHwgbmV3IENsYXNzTGlzdChub2RlKTtcbn1cblxuZnVuY3Rpb24gQ2xhc3NMaXN0KG5vZGUpIHtcbiAgdGhpcy5fbm9kZSA9IG5vZGU7XG4gIHRoaXMuX25hbWVzID0gY2xhc3NBcnJheShub2RlLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpIHx8IFwiXCIpO1xufVxuXG5DbGFzc0xpc3QucHJvdG90eXBlID0ge1xuICBhZGQ6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgaWYgKGkgPCAwKSB7XG4gICAgICB0aGlzLl9uYW1lcy5wdXNoKG5hbWUpO1xuICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLl9uYW1lcy5qb2luKFwiIFwiKSk7XG4gICAgfVxuICB9LFxuICByZW1vdmU6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgaWYgKGkgPj0gMCkge1xuICAgICAgdGhpcy5fbmFtZXMuc3BsaWNlKGksIDEpO1xuICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLl9uYW1lcy5qb2luKFwiIFwiKSk7XG4gICAgfVxuICB9LFxuICBjb250YWluczogZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpID49IDA7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNsYXNzZWRBZGQobm9kZSwgbmFtZXMpIHtcbiAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgd2hpbGUgKCsraSA8IG4pIGxpc3QuYWRkKG5hbWVzW2ldKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZFJlbW92ZShub2RlLCBuYW1lcykge1xuICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICB3aGlsZSAoKytpIDwgbikgbGlzdC5yZW1vdmUobmFtZXNbaV0pO1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkVHJ1ZShuYW1lcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgY2xhc3NlZEFkZCh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRGYWxzZShuYW1lcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgY2xhc3NlZFJlbW92ZSh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRGdW5jdGlvbihuYW1lcywgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICh2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpID8gY2xhc3NlZEFkZCA6IGNsYXNzZWRSZW1vdmUpKHRoaXMsIG5hbWVzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIG5hbWVzID0gY2xhc3NBcnJheShuYW1lICsgXCJcIik7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIGxpc3QgPSBjbGFzc0xpc3QodGhpcy5ub2RlKCkpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gICAgd2hpbGUgKCsraSA8IG4pIGlmICghbGlzdC5jb250YWlucyhuYW1lc1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IGNsYXNzZWRGdW5jdGlvbiA6IHZhbHVlXG4gICAgICA/IGNsYXNzZWRUcnVlXG4gICAgICA6IGNsYXNzZWRGYWxzZSkobmFtZXMsIHZhbHVlKSk7XG59XG4iLCJmdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmVTaGFsbG93KCkge1xuICB2YXIgY2xvbmUgPSB0aGlzLmNsb25lTm9kZShmYWxzZSksIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcpIDogY2xvbmU7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZURlZXAoKSB7XG4gIHZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKHRydWUpLCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gIHJldHVybiBwYXJlbnQgPyBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lLCB0aGlzLm5leHRTaWJsaW5nKSA6IGNsb25lO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihkZWVwKSB7XG4gIHJldHVybiB0aGlzLnNlbGVjdChkZWVwID8gc2VsZWN0aW9uX2Nsb25lRGVlcCA6IHNlbGVjdGlvbl9jbG9uZVNoYWxsb3cpO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQge0VudGVyTm9kZX0gZnJvbSBcIi4vZW50ZXIuanNcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi4vY29uc3RhbnQuanNcIjtcblxuZnVuY3Rpb24gYmluZEluZGV4KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEpIHtcbiAgdmFyIGkgPSAwLFxuICAgICAgbm9kZSxcbiAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLFxuICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuXG4gIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBmaXQgaW50byB1cGRhdGUuXG4gIC8vIFB1dCBhbnkgbnVsbCBub2RlcyBpbnRvIGVudGVyLlxuICAvLyBQdXQgYW55IHJlbWFpbmluZyBkYXRhIGludG8gZW50ZXIuXG4gIGZvciAoOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7XG4gICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07XG4gICAgICB1cGRhdGVbaV0gPSBub2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTtcbiAgICB9XG4gIH1cblxuICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZG9u4oCZdCBmaXQgaW50byBleGl0LlxuICBmb3IgKDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICBleGl0W2ldID0gbm9kZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYmluZEtleShwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhLCBrZXkpIHtcbiAgdmFyIGksXG4gICAgICBub2RlLFxuICAgICAgbm9kZUJ5S2V5VmFsdWUgPSBuZXcgTWFwLFxuICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsXG4gICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsXG4gICAgICBrZXlWYWx1ZXMgPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpLFxuICAgICAga2V5VmFsdWU7XG5cbiAgLy8gQ29tcHV0ZSB0aGUga2V5IGZvciBlYWNoIG5vZGUuXG4gIC8vIElmIG11bHRpcGxlIG5vZGVzIGhhdmUgdGhlIHNhbWUga2V5LCB0aGUgZHVwbGljYXRlcyBhcmUgYWRkZWQgdG8gZXhpdC5cbiAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICBrZXlWYWx1ZXNbaV0gPSBrZXlWYWx1ZSA9IGtleS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSArIFwiXCI7XG4gICAgICBpZiAobm9kZUJ5S2V5VmFsdWUuaGFzKGtleVZhbHVlKSkge1xuICAgICAgICBleGl0W2ldID0gbm9kZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGVCeUtleVZhbHVlLnNldChrZXlWYWx1ZSwgbm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ29tcHV0ZSB0aGUga2V5IGZvciBlYWNoIGRhdHVtLlxuICAvLyBJZiB0aGVyZSBhIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5LCBqb2luIGFuZCBhZGQgaXQgdG8gdXBkYXRlLlxuICAvLyBJZiB0aGVyZSBpcyBub3QgKG9yIHRoZSBrZXkgaXMgYSBkdXBsaWNhdGUpLCBhZGQgaXQgdG8gZW50ZXIuXG4gIGZvciAoaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyArK2kpIHtcbiAgICBrZXlWYWx1ZSA9IGtleS5jYWxsKHBhcmVudCwgZGF0YVtpXSwgaSwgZGF0YSkgKyBcIlwiO1xuICAgIGlmIChub2RlID0gbm9kZUJ5S2V5VmFsdWUuZ2V0KGtleVZhbHVlKSkge1xuICAgICAgdXBkYXRlW2ldID0gbm9kZTtcbiAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldO1xuICAgICAgbm9kZUJ5S2V5VmFsdWUuZGVsZXRlKGtleVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIGFueSByZW1haW5pbmcgbm9kZXMgdGhhdCB3ZXJlIG5vdCBib3VuZCB0byBkYXRhIHRvIGV4aXQuXG4gIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWVzW2ldKSA9PT0gbm9kZSkpIHtcbiAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkYXR1bShub2RlKSB7XG4gIHJldHVybiBub2RlLl9fZGF0YV9fO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIEFycmF5LmZyb20odGhpcywgZGF0dW0pO1xuXG4gIHZhciBiaW5kID0ga2V5ID8gYmluZEtleSA6IGJpbmRJbmRleCxcbiAgICAgIHBhcmVudHMgPSB0aGlzLl9wYXJlbnRzLFxuICAgICAgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzO1xuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdmFsdWUgPSBjb25zdGFudCh2YWx1ZSk7XG5cbiAgZm9yICh2YXIgbSA9IGdyb3Vwcy5sZW5ndGgsIHVwZGF0ZSA9IG5ldyBBcnJheShtKSwgZW50ZXIgPSBuZXcgQXJyYXkobSksIGV4aXQgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgdmFyIHBhcmVudCA9IHBhcmVudHNbal0sXG4gICAgICAgIGdyb3VwID0gZ3JvdXBzW2pdLFxuICAgICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgICAgZGF0YSA9IGFycmF5bGlrZSh2YWx1ZS5jYWxsKHBhcmVudCwgcGFyZW50ICYmIHBhcmVudC5fX2RhdGFfXywgaiwgcGFyZW50cykpLFxuICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsXG4gICAgICAgIGVudGVyR3JvdXAgPSBlbnRlcltqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSxcbiAgICAgICAgdXBkYXRlR3JvdXAgPSB1cGRhdGVbal0gPSBuZXcgQXJyYXkoZGF0YUxlbmd0aCksXG4gICAgICAgIGV4aXRHcm91cCA9IGV4aXRbal0gPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpO1xuXG4gICAgYmluZChwYXJlbnQsIGdyb3VwLCBlbnRlckdyb3VwLCB1cGRhdGVHcm91cCwgZXhpdEdyb3VwLCBkYXRhLCBrZXkpO1xuXG4gICAgLy8gTm93IGNvbm5lY3QgdGhlIGVudGVyIG5vZGVzIHRvIHRoZWlyIGZvbGxvd2luZyB1cGRhdGUgbm9kZSwgc3VjaCB0aGF0XG4gICAgLy8gYXBwZW5kQ2hpbGQgY2FuIGluc2VydCB0aGUgbWF0ZXJpYWxpemVkIGVudGVyIG5vZGUgYmVmb3JlIHRoaXMgbm9kZSxcbiAgICAvLyByYXRoZXIgdGhhbiBhdCB0aGUgZW5kIG9mIHRoZSBwYXJlbnQgbm9kZS5cbiAgICBmb3IgKHZhciBpMCA9IDAsIGkxID0gMCwgcHJldmlvdXMsIG5leHQ7IGkwIDwgZGF0YUxlbmd0aDsgKytpMCkge1xuICAgICAgaWYgKHByZXZpb3VzID0gZW50ZXJHcm91cFtpMF0pIHtcbiAgICAgICAgaWYgKGkwID49IGkxKSBpMSA9IGkwICsgMTtcbiAgICAgICAgd2hpbGUgKCEobmV4dCA9IHVwZGF0ZUdyb3VwW2kxXSkgJiYgKytpMSA8IGRhdGFMZW5ndGgpO1xuICAgICAgICBwcmV2aW91cy5fbmV4dCA9IG5leHQgfHwgbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGUgPSBuZXcgU2VsZWN0aW9uKHVwZGF0ZSwgcGFyZW50cyk7XG4gIHVwZGF0ZS5fZW50ZXIgPSBlbnRlcjtcbiAgdXBkYXRlLl9leGl0ID0gZXhpdDtcbiAgcmV0dXJuIHVwZGF0ZTtcbn1cblxuLy8gR2l2ZW4gc29tZSBkYXRhLCB0aGlzIHJldHVybnMgYW4gYXJyYXktbGlrZSB2aWV3IG9mIGl0OiBhbiBvYmplY3QgdGhhdFxuLy8gZXhwb3NlcyBhIGxlbmd0aCBwcm9wZXJ0eSBhbmQgYWxsb3dzIG51bWVyaWMgaW5kZXhpbmcuIE5vdGUgdGhhdCB1bmxpa2Vcbi8vIHNlbGVjdEFsbCwgdGhpcyBpc27igJl0IHdvcnJpZWQgYWJvdXQg4oCcbGl2ZeKAnSBjb2xsZWN0aW9ucyBiZWNhdXNlIHRoZSByZXN1bHRpbmdcbi8vIGFycmF5IHdpbGwgb25seSBiZSB1c2VkIGJyaWVmbHkgd2hpbGUgZGF0YSBpcyBiZWluZyBib3VuZC4gKEl0IGlzIHBvc3NpYmxlIHRvXG4vLyBjYXVzZSB0aGUgZGF0YSB0byBjaGFuZ2Ugd2hpbGUgaXRlcmF0aW5nIGJ5IHVzaW5nIGEga2V5IGZ1bmN0aW9uLCBidXQgcGxlYXNlXG4vLyBkb27igJl0OyB3ZeKAmWQgcmF0aGVyIGF2b2lkIGEgZ3JhdHVpdG91cyBjb3B5LilcbmZ1bmN0aW9uIGFycmF5bGlrZShkYXRhKSB7XG4gIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJiBcImxlbmd0aFwiIGluIGRhdGFcbiAgICA/IGRhdGEgLy8gQXJyYXksIFR5cGVkQXJyYXksIE5vZGVMaXN0LCBhcnJheS1saWtlXG4gICAgOiBBcnJheS5mcm9tKGRhdGEpOyAvLyBNYXAsIFNldCwgaXRlcmFibGUsIHN0cmluZywgb3IgYW55dGhpbmcgZWxzZVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5wcm9wZXJ0eShcIl9fZGF0YV9fXCIsIHZhbHVlKVxuICAgICAgOiB0aGlzLm5vZGUoKS5fX2RhdGFfXztcbn1cbiIsImltcG9ydCBkZWZhdWx0VmlldyBmcm9tIFwiLi4vd2luZG93LmpzXCI7XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQobm9kZSwgdHlwZSwgcGFyYW1zKSB7XG4gIHZhciB3aW5kb3cgPSBkZWZhdWx0Vmlldyhub2RlKSxcbiAgICAgIGV2ZW50ID0gd2luZG93LkN1c3RvbUV2ZW50O1xuXG4gIGlmICh0eXBlb2YgZXZlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGV2ZW50ID0gbmV3IGV2ZW50KHR5cGUsIHBhcmFtcyk7XG4gIH0gZWxzZSB7XG4gICAgZXZlbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKTtcbiAgICBpZiAocGFyYW1zKSBldmVudC5pbml0RXZlbnQodHlwZSwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlKSwgZXZlbnQuZGV0YWlsID0gcGFyYW1zLmRldGFpbDtcbiAgICBlbHNlIGV2ZW50LmluaXRFdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UpO1xuICB9XG5cbiAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hDb25zdGFudCh0eXBlLCBwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRnVuY3Rpb24odHlwZSwgcGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCB0eXBlLCBwYXJhbXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHR5cGUsIHBhcmFtcykge1xuICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgcGFyYW1zID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gZGlzcGF0Y2hGdW5jdGlvblxuICAgICAgOiBkaXNwYXRjaENvbnN0YW50KSh0eXBlLCBwYXJhbXMpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIGNhbGxiYWNrLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiAhdGhpcy5ub2RlKCk7XG59XG4iLCJpbXBvcnQgc3BhcnNlIGZyb20gXCIuL3NwYXJzZS5qc1wiO1xuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9lbnRlciB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRW50ZXJOb2RlKHBhcmVudCwgZGF0dW0pIHtcbiAgdGhpcy5vd25lckRvY3VtZW50ID0gcGFyZW50Lm93bmVyRG9jdW1lbnQ7XG4gIHRoaXMubmFtZXNwYWNlVVJJID0gcGFyZW50Lm5hbWVzcGFjZVVSSTtcbiAgdGhpcy5fbmV4dCA9IG51bGw7XG4gIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgdGhpcy5fX2RhdGFfXyA9IGRhdHVtO1xufVxuXG5FbnRlck5vZGUucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRW50ZXJOb2RlLFxuICBhcHBlbmRDaGlsZDogZnVuY3Rpb24oY2hpbGQpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIHRoaXMuX25leHQpOyB9LFxuICBpbnNlcnRCZWZvcmU6IGZ1bmN0aW9uKGNoaWxkLCBuZXh0KSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBuZXh0KTsgfSxcbiAgcXVlcnlTZWxlY3RvcjogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsgfSxcbiAgcXVlcnlTZWxlY3RvckFsbDogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsgfVxufTtcbiIsImltcG9ydCBzcGFyc2UgZnJvbSBcIi4vc3BhcnNlLmpzXCI7XG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2V4aXQgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IG1hdGNoZXIgZnJvbSBcIi4uL21hdGNoZXIuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gXCJmdW5jdGlvblwiKSBtYXRjaCA9IG1hdGNoZXIobWF0Y2gpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBtYXRjaC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkge1xuICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJmdW5jdGlvbiBodG1sUmVtb3ZlKCkge1xuICB0aGlzLmlubmVySFRNTCA9IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGh0bWxDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5pbm5lckhUTUwgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaHRtbEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5pbm5lckhUTUwgPSB2ID09IG51bGwgPyBcIlwiIDogdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IGh0bWxSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGh0bWxGdW5jdGlvblxuICAgICAgICAgIDogaHRtbENvbnN0YW50KSh2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpLmlubmVySFRNTDtcbn1cbiIsImltcG9ydCBzZWxlY3Rpb25fc2VsZWN0IGZyb20gXCIuL3NlbGVjdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RBbGwgZnJvbSBcIi4vc2VsZWN0QWxsLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NlbGVjdENoaWxkIGZyb20gXCIuL3NlbGVjdENoaWxkLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NlbGVjdENoaWxkcmVuIGZyb20gXCIuL3NlbGVjdENoaWxkcmVuLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2ZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGF0YSBmcm9tIFwiLi9kYXRhLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VudGVyIGZyb20gXCIuL2VudGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2V4aXQgZnJvbSBcIi4vZXhpdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9qb2luIGZyb20gXCIuL2pvaW4uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbWVyZ2UgZnJvbSBcIi4vbWVyZ2UuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fb3JkZXIgZnJvbSBcIi4vb3JkZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc29ydCBmcm9tIFwiLi9zb3J0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2NhbGwgZnJvbSBcIi4vY2FsbC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9ub2RlcyBmcm9tIFwiLi9ub2Rlcy5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9ub2RlIGZyb20gXCIuL25vZGUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2l6ZSBmcm9tIFwiLi9zaXplLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VtcHR5IGZyb20gXCIuL2VtcHR5LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VhY2ggZnJvbSBcIi4vZWFjaC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9hdHRyIGZyb20gXCIuL2F0dHIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc3R5bGUgZnJvbSBcIi4vc3R5bGUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fcHJvcGVydHkgZnJvbSBcIi4vcHJvcGVydHkuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2xhc3NlZCBmcm9tIFwiLi9jbGFzc2VkLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3RleHQgZnJvbSBcIi4vdGV4dC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9odG1sIGZyb20gXCIuL2h0bWwuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fcmFpc2UgZnJvbSBcIi4vcmFpc2UuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbG93ZXIgZnJvbSBcIi4vbG93ZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fYXBwZW5kIGZyb20gXCIuL2FwcGVuZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9pbnNlcnQgZnJvbSBcIi4vaW5zZXJ0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3JlbW92ZSBmcm9tIFwiLi9yZW1vdmUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2xvbmUgZnJvbSBcIi4vY2xvbmUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGF0dW0gZnJvbSBcIi4vZGF0dW0uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fb24gZnJvbSBcIi4vb24uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGlzcGF0Y2ggZnJvbSBcIi4vZGlzcGF0Y2guanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faXRlcmF0b3IgZnJvbSBcIi4vaXRlcmF0b3IuanNcIjtcblxuZXhwb3J0IHZhciByb290ID0gW251bGxdO1xuXG5leHBvcnQgZnVuY3Rpb24gU2VsZWN0aW9uKGdyb3VwcywgcGFyZW50cykge1xuICB0aGlzLl9ncm91cHMgPSBncm91cHM7XG4gIHRoaXMuX3BhcmVudHMgPSBwYXJlbnRzO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0sIHJvb3QpO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0aW9uKCkge1xuICByZXR1cm4gdGhpcztcbn1cblxuU2VsZWN0aW9uLnByb3RvdHlwZSA9IHNlbGVjdGlvbi5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBTZWxlY3Rpb24sXG4gIHNlbGVjdDogc2VsZWN0aW9uX3NlbGVjdCxcbiAgc2VsZWN0QWxsOiBzZWxlY3Rpb25fc2VsZWN0QWxsLFxuICBzZWxlY3RDaGlsZDogc2VsZWN0aW9uX3NlbGVjdENoaWxkLFxuICBzZWxlY3RDaGlsZHJlbjogc2VsZWN0aW9uX3NlbGVjdENoaWxkcmVuLFxuICBmaWx0ZXI6IHNlbGVjdGlvbl9maWx0ZXIsXG4gIGRhdGE6IHNlbGVjdGlvbl9kYXRhLFxuICBlbnRlcjogc2VsZWN0aW9uX2VudGVyLFxuICBleGl0OiBzZWxlY3Rpb25fZXhpdCxcbiAgam9pbjogc2VsZWN0aW9uX2pvaW4sXG4gIG1lcmdlOiBzZWxlY3Rpb25fbWVyZ2UsXG4gIHNlbGVjdGlvbjogc2VsZWN0aW9uX3NlbGVjdGlvbixcbiAgb3JkZXI6IHNlbGVjdGlvbl9vcmRlcixcbiAgc29ydDogc2VsZWN0aW9uX3NvcnQsXG4gIGNhbGw6IHNlbGVjdGlvbl9jYWxsLFxuICBub2Rlczogc2VsZWN0aW9uX25vZGVzLFxuICBub2RlOiBzZWxlY3Rpb25fbm9kZSxcbiAgc2l6ZTogc2VsZWN0aW9uX3NpemUsXG4gIGVtcHR5OiBzZWxlY3Rpb25fZW1wdHksXG4gIGVhY2g6IHNlbGVjdGlvbl9lYWNoLFxuICBhdHRyOiBzZWxlY3Rpb25fYXR0cixcbiAgc3R5bGU6IHNlbGVjdGlvbl9zdHlsZSxcbiAgcHJvcGVydHk6IHNlbGVjdGlvbl9wcm9wZXJ0eSxcbiAgY2xhc3NlZDogc2VsZWN0aW9uX2NsYXNzZWQsXG4gIHRleHQ6IHNlbGVjdGlvbl90ZXh0LFxuICBodG1sOiBzZWxlY3Rpb25faHRtbCxcbiAgcmFpc2U6IHNlbGVjdGlvbl9yYWlzZSxcbiAgbG93ZXI6IHNlbGVjdGlvbl9sb3dlcixcbiAgYXBwZW5kOiBzZWxlY3Rpb25fYXBwZW5kLFxuICBpbnNlcnQ6IHNlbGVjdGlvbl9pbnNlcnQsXG4gIHJlbW92ZTogc2VsZWN0aW9uX3JlbW92ZSxcbiAgY2xvbmU6IHNlbGVjdGlvbl9jbG9uZSxcbiAgZGF0dW06IHNlbGVjdGlvbl9kYXR1bSxcbiAgb246IHNlbGVjdGlvbl9vbixcbiAgZGlzcGF0Y2g6IHNlbGVjdGlvbl9kaXNwYXRjaCxcbiAgW1N5bWJvbC5pdGVyYXRvcl06IHNlbGVjdGlvbl9pdGVyYXRvclxufTtcblxuZXhwb3J0IGRlZmF1bHQgc2VsZWN0aW9uO1xuIiwiaW1wb3J0IGNyZWF0b3IgZnJvbSBcIi4uL2NyZWF0b3IuanNcIjtcbmltcG9ydCBzZWxlY3RvciBmcm9tIFwiLi4vc2VsZWN0b3IuanNcIjtcblxuZnVuY3Rpb24gY29uc3RhbnROdWxsKCkge1xuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgYmVmb3JlKSB7XG4gIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gXCJmdW5jdGlvblwiID8gbmFtZSA6IGNyZWF0b3IobmFtZSksXG4gICAgICBzZWxlY3QgPSBiZWZvcmUgPT0gbnVsbCA/IGNvbnN0YW50TnVsbCA6IHR5cGVvZiBiZWZvcmUgPT09IFwiZnVuY3Rpb25cIiA/IGJlZm9yZSA6IHNlbGVjdG9yKGJlZm9yZSk7XG4gIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IG51bGwpO1xuICB9KTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKigpIHtcbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHlpZWxkIG5vZGU7XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihvbmVudGVyLCBvbnVwZGF0ZSwgb25leGl0KSB7XG4gIHZhciBlbnRlciA9IHRoaXMuZW50ZXIoKSwgdXBkYXRlID0gdGhpcywgZXhpdCA9IHRoaXMuZXhpdCgpO1xuICBpZiAodHlwZW9mIG9uZW50ZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGVudGVyID0gb25lbnRlcihlbnRlcik7XG4gICAgaWYgKGVudGVyKSBlbnRlciA9IGVudGVyLnNlbGVjdGlvbigpO1xuICB9IGVsc2Uge1xuICAgIGVudGVyID0gZW50ZXIuYXBwZW5kKG9uZW50ZXIgKyBcIlwiKTtcbiAgfVxuICBpZiAob251cGRhdGUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZSA9IG9udXBkYXRlKHVwZGF0ZSk7XG4gICAgaWYgKHVwZGF0ZSkgdXBkYXRlID0gdXBkYXRlLnNlbGVjdGlvbigpO1xuICB9XG4gIGlmIChvbmV4aXQgPT0gbnVsbCkgZXhpdC5yZW1vdmUoKTsgZWxzZSBvbmV4aXQoZXhpdCk7XG4gIHJldHVybiBlbnRlciAmJiB1cGRhdGUgPyBlbnRlci5tZXJnZSh1cGRhdGUpLm9yZGVyKCkgOiB1cGRhdGU7XG59XG4iLCJmdW5jdGlvbiBsb3dlcigpIHtcbiAgaWYgKHRoaXMucHJldmlvdXNTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMsIHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gobG93ZXIpO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgdmFyIHNlbGVjdGlvbiA9IGNvbnRleHQuc2VsZWN0aW9uID8gY29udGV4dC5zZWxlY3Rpb24oKSA6IGNvbnRleHQ7XG5cbiAgZm9yICh2YXIgZ3JvdXBzMCA9IHRoaXMuX2dyb3VwcywgZ3JvdXBzMSA9IHNlbGVjdGlvbi5fZ3JvdXBzLCBtMCA9IGdyb3VwczAubGVuZ3RoLCBtMSA9IGdyb3VwczEubGVuZ3RoLCBtID0gTWF0aC5taW4obTAsIG0xKSwgbWVyZ2VzID0gbmV3IEFycmF5KG0wKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91cDFbaV0pIHtcbiAgICAgICAgbWVyZ2VbaV0gPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBqIDwgbTA7ICsraikge1xuICAgIG1lcmdlc1tqXSA9IGdyb3VwczBbal07XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgIHZhciBub2RlID0gZ3JvdXBbaV07XG4gICAgICBpZiAobm9kZSkgcmV0dXJuIG5vZGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20odGhpcyk7XG59XG4iLCJmdW5jdGlvbiBjb250ZXh0TGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudCwgdGhpcy5fX2RhdGFfXyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lcykge1xuICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykubWFwKGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgbmFtZSA9IFwiXCIsIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgcmV0dXJuIHt0eXBlOiB0LCBuYW1lOiBuYW1lfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9uUmVtb3ZlKHR5cGVuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgb24gPSB0aGlzLl9fb247XG4gICAgaWYgKCFvbikgcmV0dXJuO1xuICAgIGZvciAodmFyIGogPSAwLCBpID0gLTEsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHtcbiAgICAgIGlmIChvID0gb25bal0sICghdHlwZW5hbWUudHlwZSB8fCBvLnR5cGUgPT09IHR5cGVuYW1lLnR5cGUpICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLm9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25bKytpXSA9IG87XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgrK2kpIG9uLmxlbmd0aCA9IGk7XG4gICAgZWxzZSBkZWxldGUgdGhpcy5fX29uO1xuICB9O1xufVxuXG5mdW5jdGlvbiBvbkFkZCh0eXBlbmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBvbiA9IHRoaXMuX19vbiwgbywgbGlzdGVuZXIgPSBjb250ZXh0TGlzdGVuZXIodmFsdWUpO1xuICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICAgIGlmICgobyA9IG9uW2pdKS50eXBlID09PSB0eXBlbmFtZS50eXBlICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLm9wdGlvbnMpO1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyID0gbGlzdGVuZXIsIG8ub3B0aW9ucyA9IG9wdGlvbnMpO1xuICAgICAgICBvLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGVuYW1lLnR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICBvID0ge3R5cGU6IHR5cGVuYW1lLnR5cGUsIG5hbWU6IHR5cGVuYW1lLm5hbWUsIHZhbHVlOiB2YWx1ZSwgbGlzdGVuZXI6IGxpc3RlbmVyLCBvcHRpb25zOiBvcHRpb25zfTtcbiAgICBpZiAoIW9uKSB0aGlzLl9fb24gPSBbb107XG4gICAgZWxzZSBvbi5wdXNoKG8pO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0eXBlbmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgdmFyIHR5cGVuYW1lcyA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgXCJcIiksIGksIG4gPSB0eXBlbmFtZXMubGVuZ3RoLCB0O1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBvbiA9IHRoaXMubm9kZSgpLl9fb247XG4gICAgaWYgKG9uKSBmb3IgKHZhciBqID0gMCwgbSA9IG9uLmxlbmd0aCwgbzsgaiA8IG07ICsraikge1xuICAgICAgZm9yIChpID0gMCwgbyA9IG9uW2pdOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICgodCA9IHR5cGVuYW1lc1tpXSkudHlwZSA9PT0gby50eXBlICYmIHQubmFtZSA9PT0gby5uYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIG8udmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb24gPSB2YWx1ZSA/IG9uQWRkIDogb25SZW1vdmU7XG4gIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHRoaXMuZWFjaChvbih0eXBlbmFtZXNbaV0sIHZhbHVlLCBvcHRpb25zKSk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gLTEsIG0gPSBncm91cHMubGVuZ3RoOyArK2ogPCBtOykge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gZ3JvdXAubGVuZ3RoIC0gMSwgbmV4dCA9IGdyb3VwW2ldLCBub2RlOyAtLWkgPj0gMDspIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgaWYgKG5leHQgJiYgbm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuZXh0KSBeIDQpIG5leHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgbmV4dCk7XG4gICAgICAgIG5leHQgPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuIiwiZnVuY3Rpb24gcHJvcGVydHlSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgZGVsZXRlIHRoaXNbbmFtZV07XG4gIH07XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5Q29uc3RhbnQobmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXNbbmFtZV0gPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlGdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSB0aGlzW25hbWVdO1xuICAgIGVsc2UgdGhpc1tuYW1lXSA9IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMVxuICAgICAgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IHByb3BlcnR5UmVtb3ZlIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHByb3BlcnR5RnVuY3Rpb25cbiAgICAgICAgICA6IHByb3BlcnR5Q29uc3RhbnQpKG5hbWUsIHZhbHVlKSlcbiAgICAgIDogdGhpcy5ub2RlKClbbmFtZV07XG59XG4iLCJmdW5jdGlvbiByYWlzZSgpIHtcbiAgaWYgKHRoaXMubmV4dFNpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gocmFpc2UpO1xufVxuIiwiZnVuY3Rpb24gcmVtb3ZlKCkge1xuICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lYWNoKHJlbW92ZSk7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzZWxlY3RvciBmcm9tIFwiLi4vc2VsZWN0b3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IHNlbGVjdG9yKHNlbGVjdCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgc3Vibm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAoc3Vibm9kZSA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkpIHtcbiAgICAgICAgaWYgKFwiX19kYXRhX19cIiBpbiBub2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5fX2RhdGFfXztcbiAgICAgICAgc3ViZ3JvdXBbaV0gPSBzdWJub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBhcnJheSBmcm9tIFwiLi4vYXJyYXkuanNcIjtcbmltcG9ydCBzZWxlY3RvckFsbCBmcm9tIFwiLi4vc2VsZWN0b3JBbGwuanNcIjtcblxuZnVuY3Rpb24gYXJyYXlBbGwoc2VsZWN0KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYXJyYXkoc2VsZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgaWYgKHR5cGVvZiBzZWxlY3QgPT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gYXJyYXlBbGwoc2VsZWN0KTtcbiAgZWxzZSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHN1Ymdyb3Vwcy5wdXNoKHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSk7XG4gICAgICAgIHBhcmVudHMucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHBhcmVudHMpO1xufVxuIiwiaW1wb3J0IHtjaGlsZE1hdGNoZXJ9IGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbnZhciBmaW5kID0gQXJyYXkucHJvdG90eXBlLmZpbmQ7XG5cbmZ1bmN0aW9uIGNoaWxkRmluZChtYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZpbmQuY2FsbCh0aGlzLmNoaWxkcmVuLCBtYXRjaCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNoaWxkRmlyc3QoKSB7XG4gIHJldHVybiB0aGlzLmZpcnN0RWxlbWVudENoaWxkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3QobWF0Y2ggPT0gbnVsbCA/IGNoaWxkRmlyc3RcbiAgICAgIDogY2hpbGRGaW5kKHR5cGVvZiBtYXRjaCA9PT0gXCJmdW5jdGlvblwiID8gbWF0Y2ggOiBjaGlsZE1hdGNoZXIobWF0Y2gpKSk7XG59XG4iLCJpbXBvcnQge2NoaWxkTWF0Y2hlcn0gZnJvbSBcIi4uL21hdGNoZXIuanNcIjtcblxudmFyIGZpbHRlciA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXI7XG5cbmZ1bmN0aW9uIGNoaWxkcmVuKCkge1xuICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuKTtcbn1cblxuZnVuY3Rpb24gY2hpbGRyZW5GaWx0ZXIobWF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmaWx0ZXIuY2FsbCh0aGlzLmNoaWxkcmVuLCBtYXRjaCk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIHJldHVybiB0aGlzLnNlbGVjdEFsbChtYXRjaCA9PSBudWxsID8gY2hpbGRyZW5cbiAgICAgIDogY2hpbGRyZW5GaWx0ZXIodHlwZW9mIG1hdGNoID09PSBcImZ1bmN0aW9uXCIgPyBtYXRjaCA6IGNoaWxkTWF0Y2hlcihtYXRjaCkpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICBsZXQgc2l6ZSA9IDA7XG4gIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzKSArK3NpemU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgcmV0dXJuIHNpemU7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29tcGFyZSkge1xuICBpZiAoIWNvbXBhcmUpIGNvbXBhcmUgPSBhc2NlbmRpbmc7XG5cbiAgZnVuY3Rpb24gY29tcGFyZU5vZGUoYSwgYikge1xuICAgIHJldHVybiBhICYmIGIgPyBjb21wYXJlKGEuX19kYXRhX18sIGIuX19kYXRhX18pIDogIWEgLSAhYjtcbiAgfVxuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHNvcnRncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHNvcnRncm91cCA9IHNvcnRncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHNvcnRncm91cFtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICAgIHNvcnRncm91cC5zb3J0KGNvbXBhcmVOb2RlKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHNvcnRncm91cHMsIHRoaXMuX3BhcmVudHMpLm9yZGVyKCk7XG59XG5cbmZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7XG4gIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHVwZGF0ZSkge1xuICByZXR1cm4gbmV3IEFycmF5KHVwZGF0ZS5sZW5ndGgpO1xufVxuIiwiaW1wb3J0IGRlZmF1bHRWaWV3IGZyb20gXCIuLi93aW5kb3cuanNcIjtcblxuZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVDb25zdGFudChuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUsIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVGdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICAgIGVsc2UgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2LCBwcmlvcml0eSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDFcbiAgICAgID8gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgICA/IHN0eWxlUmVtb3ZlIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgID8gc3R5bGVGdW5jdGlvblxuICAgICAgICAgICAgOiBzdHlsZUNvbnN0YW50KShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkgPT0gbnVsbCA/IFwiXCIgOiBwcmlvcml0eSkpXG4gICAgICA6IHN0eWxlVmFsdWUodGhpcy5ub2RlKCksIG5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3R5bGVWYWx1ZShub2RlLCBuYW1lKSB7XG4gIHJldHVybiBub2RlLnN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSlcbiAgICAgIHx8IGRlZmF1bHRWaWV3KG5vZGUpLmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTtcbn1cbiIsImZ1bmN0aW9uIHRleHRSZW1vdmUoKSB7XG4gIHRoaXMudGV4dENvbnRlbnQgPSBcIlwiO1xufVxuXG5mdW5jdGlvbiB0ZXh0Q29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHYgPT0gbnVsbCA/IFwiXCIgOiB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbFxuICAgICAgICAgID8gdGV4dFJlbW92ZSA6ICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gdGV4dEZ1bmN0aW9uXG4gICAgICAgICAgOiB0ZXh0Q29uc3RhbnQpKHZhbHVlKSlcbiAgICAgIDogdGhpcy5ub2RlKCkudGV4dENvbnRlbnQ7XG59XG4iLCJmdW5jdGlvbiBub25lKCkge31cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBub25lIDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gIH07XG59XG4iLCJmdW5jdGlvbiBlbXB0eSgpIHtcbiAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gc2VsZWN0b3IgPT0gbnVsbCA/IGVtcHR5IDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCkge1xuICBsZXQgc291cmNlRXZlbnQ7XG4gIHdoaWxlIChzb3VyY2VFdmVudCA9IGV2ZW50LnNvdXJjZUV2ZW50KSBldmVudCA9IHNvdXJjZUV2ZW50O1xuICByZXR1cm4gZXZlbnQ7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlKSB7XG4gIHJldHVybiAobm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykgLy8gbm9kZSBpcyBhIE5vZGVcbiAgICAgIHx8IChub2RlLmRvY3VtZW50ICYmIG5vZGUpIC8vIG5vZGUgaXMgYSBXaW5kb3dcbiAgICAgIHx8IG5vZGUuZGVmYXVsdFZpZXc7IC8vIG5vZGUgaXMgYSBEb2N1bWVudFxufVxuIiwiaW1wb3J0IHtUaW1lcn0gZnJvbSBcIi4vdGltZXIuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7XG4gIHZhciB0ID0gbmV3IFRpbWVyO1xuICBkZWxheSA9IGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5O1xuICB0LnJlc3RhcnQoZWxhcHNlZCA9PiB7XG4gICAgdC5zdG9wKCk7XG4gICAgY2FsbGJhY2soZWxhcHNlZCArIGRlbGF5KTtcbiAgfSwgZGVsYXksIHRpbWUpO1xuICByZXR1cm4gdDtcbn1cbiIsInZhciBmcmFtZSA9IDAsIC8vIGlzIGFuIGFuaW1hdGlvbiBmcmFtZSBwZW5kaW5nP1xuICAgIHRpbWVvdXQgPSAwLCAvLyBpcyBhIHRpbWVvdXQgcGVuZGluZz9cbiAgICBpbnRlcnZhbCA9IDAsIC8vIGFyZSBhbnkgdGltZXJzIGFjdGl2ZT9cbiAgICBwb2tlRGVsYXkgPSAxMDAwLCAvLyBob3cgZnJlcXVlbnRseSB3ZSBjaGVjayBmb3IgY2xvY2sgc2tld1xuICAgIHRhc2tIZWFkLFxuICAgIHRhc2tUYWlsLFxuICAgIGNsb2NrTGFzdCA9IDAsXG4gICAgY2xvY2tOb3cgPSAwLFxuICAgIGNsb2NrU2tldyA9IDAsXG4gICAgY2xvY2sgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09IFwib2JqZWN0XCIgJiYgcGVyZm9ybWFuY2Uubm93ID8gcGVyZm9ybWFuY2UgOiBEYXRlLFxuICAgIHNldEZyYW1lID0gdHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIiAmJiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykgOiBmdW5jdGlvbihmKSB7IHNldFRpbWVvdXQoZiwgMTcpOyB9O1xuXG5leHBvcnQgZnVuY3Rpb24gbm93KCkge1xuICByZXR1cm4gY2xvY2tOb3cgfHwgKHNldEZyYW1lKGNsZWFyTm93KSwgY2xvY2tOb3cgPSBjbG9jay5ub3coKSArIGNsb2NrU2tldyk7XG59XG5cbmZ1bmN0aW9uIGNsZWFyTm93KCkge1xuICBjbG9ja05vdyA9IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBUaW1lcigpIHtcbiAgdGhpcy5fY2FsbCA9XG4gIHRoaXMuX3RpbWUgPVxuICB0aGlzLl9uZXh0ID0gbnVsbDtcbn1cblxuVGltZXIucHJvdG90eXBlID0gdGltZXIucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVGltZXIsXG4gIHJlc3RhcnQ6IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO1xuICAgIHRpbWUgPSAodGltZSA9PSBudWxsID8gbm93KCkgOiArdGltZSkgKyAoZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXkpO1xuICAgIGlmICghdGhpcy5fbmV4dCAmJiB0YXNrVGFpbCAhPT0gdGhpcykge1xuICAgICAgaWYgKHRhc2tUYWlsKSB0YXNrVGFpbC5fbmV4dCA9IHRoaXM7XG4gICAgICBlbHNlIHRhc2tIZWFkID0gdGhpcztcbiAgICAgIHRhc2tUYWlsID0gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fY2FsbCA9IGNhbGxiYWNrO1xuICAgIHRoaXMuX3RpbWUgPSB0aW1lO1xuICAgIHNsZWVwKCk7XG4gIH0sXG4gIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9jYWxsKSB7XG4gICAgICB0aGlzLl9jYWxsID0gbnVsbDtcbiAgICAgIHRoaXMuX3RpbWUgPSBJbmZpbml0eTtcbiAgICAgIHNsZWVwKCk7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdGltZXIoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7XG4gIHZhciB0ID0gbmV3IFRpbWVyO1xuICB0LnJlc3RhcnQoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKTtcbiAgcmV0dXJuIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aW1lckZsdXNoKCkge1xuICBub3coKTsgLy8gR2V0IHRoZSBjdXJyZW50IHRpbWUsIGlmIG5vdCBhbHJlYWR5IHNldC5cbiAgKytmcmFtZTsgLy8gUHJldGVuZCB3ZeKAmXZlIHNldCBhbiBhbGFybSwgaWYgd2UgaGF2ZW7igJl0IGFscmVhZHkuXG4gIHZhciB0ID0gdGFza0hlYWQsIGU7XG4gIHdoaWxlICh0KSB7XG4gICAgaWYgKChlID0gY2xvY2tOb3cgLSB0Ll90aW1lKSA+PSAwKSB0Ll9jYWxsLmNhbGwodW5kZWZpbmVkLCBlKTtcbiAgICB0ID0gdC5fbmV4dDtcbiAgfVxuICAtLWZyYW1lO1xufVxuXG5mdW5jdGlvbiB3YWtlKCkge1xuICBjbG9ja05vdyA9IChjbG9ja0xhc3QgPSBjbG9jay5ub3coKSkgKyBjbG9ja1NrZXc7XG4gIGZyYW1lID0gdGltZW91dCA9IDA7XG4gIHRyeSB7XG4gICAgdGltZXJGbHVzaCgpO1xuICB9IGZpbmFsbHkge1xuICAgIGZyYW1lID0gMDtcbiAgICBuYXAoKTtcbiAgICBjbG9ja05vdyA9IDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9rZSgpIHtcbiAgdmFyIG5vdyA9IGNsb2NrLm5vdygpLCBkZWxheSA9IG5vdyAtIGNsb2NrTGFzdDtcbiAgaWYgKGRlbGF5ID4gcG9rZURlbGF5KSBjbG9ja1NrZXcgLT0gZGVsYXksIGNsb2NrTGFzdCA9IG5vdztcbn1cblxuZnVuY3Rpb24gbmFwKCkge1xuICB2YXIgdDAsIHQxID0gdGFza0hlYWQsIHQyLCB0aW1lID0gSW5maW5pdHk7XG4gIHdoaWxlICh0MSkge1xuICAgIGlmICh0MS5fY2FsbCkge1xuICAgICAgaWYgKHRpbWUgPiB0MS5fdGltZSkgdGltZSA9IHQxLl90aW1lO1xuICAgICAgdDAgPSB0MSwgdDEgPSB0MS5fbmV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgdDIgPSB0MS5fbmV4dCwgdDEuX25leHQgPSBudWxsO1xuICAgICAgdDEgPSB0MCA/IHQwLl9uZXh0ID0gdDIgOiB0YXNrSGVhZCA9IHQyO1xuICAgIH1cbiAgfVxuICB0YXNrVGFpbCA9IHQwO1xuICBzbGVlcCh0aW1lKTtcbn1cblxuZnVuY3Rpb24gc2xlZXAodGltZSkge1xuICBpZiAoZnJhbWUpIHJldHVybjsgLy8gU29vbmVzdCBhbGFybSBhbHJlYWR5IHNldCwgb3Igd2lsbCBiZS5cbiAgaWYgKHRpbWVvdXQpIHRpbWVvdXQgPSBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gIHZhciBkZWxheSA9IHRpbWUgLSBjbG9ja05vdzsgLy8gU3RyaWN0bHkgbGVzcyB0aGFuIGlmIHdlIHJlY29tcHV0ZWQgY2xvY2tOb3cuXG4gIGlmIChkZWxheSA+IDI0KSB7XG4gICAgaWYgKHRpbWUgPCBJbmZpbml0eSkgdGltZW91dCA9IHNldFRpbWVvdXQod2FrZSwgdGltZSAtIGNsb2NrLm5vdygpIC0gY2xvY2tTa2V3KTtcbiAgICBpZiAoaW50ZXJ2YWwpIGludGVydmFsID0gY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFpbnRlcnZhbCkgY2xvY2tMYXN0ID0gY2xvY2subm93KCksIGludGVydmFsID0gc2V0SW50ZXJ2YWwocG9rZSwgcG9rZURlbGF5KTtcbiAgICBmcmFtZSA9IDEsIHNldEZyYW1lKHdha2UpO1xuICB9XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL3RyYW5zaXRpb24vaW5kZXguanNcIjtcbmltcG9ydCB7U0NIRURVTEVEfSBmcm9tIFwiLi90cmFuc2l0aW9uL3NjaGVkdWxlLmpzXCI7XG5cbnZhciByb290ID0gW251bGxdO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCBuYW1lKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbixcbiAgICAgIHNjaGVkdWxlLFxuICAgICAgaTtcblxuICBpZiAoc2NoZWR1bGVzKSB7XG4gICAgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgXCJcIjtcbiAgICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7XG4gICAgICBpZiAoKHNjaGVkdWxlID0gc2NoZWR1bGVzW2ldKS5zdGF0ZSA+IFNDSEVEVUxFRCAmJiBzY2hlZHVsZS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbihbW25vZGVdXSwgcm9vdCwgbmFtZSwgK2kpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwiaW1wb3J0IFwiLi9zZWxlY3Rpb24vaW5kZXguanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0cmFuc2l0aW9ufSBmcm9tIFwiLi90cmFuc2l0aW9uL2luZGV4LmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgYWN0aXZlfSBmcm9tIFwiLi9hY3RpdmUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnJ1cHR9IGZyb20gXCIuL2ludGVycnVwdC5qc1wiO1xuIiwiaW1wb3J0IHtTVEFSVElORywgRU5ESU5HLCBFTkRFRH0gZnJvbSBcIi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCBuYW1lKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbixcbiAgICAgIHNjaGVkdWxlLFxuICAgICAgYWN0aXZlLFxuICAgICAgZW1wdHkgPSB0cnVlLFxuICAgICAgaTtcblxuICBpZiAoIXNjaGVkdWxlcykgcmV0dXJuO1xuXG4gIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArIFwiXCI7XG5cbiAgZm9yIChpIGluIHNjaGVkdWxlcykge1xuICAgIGlmICgoc2NoZWR1bGUgPSBzY2hlZHVsZXNbaV0pLm5hbWUgIT09IG5hbWUpIHsgZW1wdHkgPSBmYWxzZTsgY29udGludWU7IH1cbiAgICBhY3RpdmUgPSBzY2hlZHVsZS5zdGF0ZSA+IFNUQVJUSU5HICYmIHNjaGVkdWxlLnN0YXRlIDwgRU5ESU5HO1xuICAgIHNjaGVkdWxlLnN0YXRlID0gRU5ERUQ7XG4gICAgc2NoZWR1bGUudGltZXIuc3RvcCgpO1xuICAgIHNjaGVkdWxlLm9uLmNhbGwoYWN0aXZlID8gXCJpbnRlcnJ1cHRcIiA6IFwiY2FuY2VsXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNjaGVkdWxlLmluZGV4LCBzY2hlZHVsZS5ncm91cCk7XG4gICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgfVxuXG4gIGlmIChlbXB0eSkgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uO1xufVxuIiwiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCBzZWxlY3Rpb25faW50ZXJydXB0IGZyb20gXCIuL2ludGVycnVwdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl90cmFuc2l0aW9uIGZyb20gXCIuL3RyYW5zaXRpb24uanNcIjtcblxuc2VsZWN0aW9uLnByb3RvdHlwZS5pbnRlcnJ1cHQgPSBzZWxlY3Rpb25faW50ZXJydXB0O1xuc2VsZWN0aW9uLnByb3RvdHlwZS50cmFuc2l0aW9uID0gc2VsZWN0aW9uX3RyYW5zaXRpb247XG4iLCJpbXBvcnQgaW50ZXJydXB0IGZyb20gXCIuLi9pbnRlcnJ1cHQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuICAgIGludGVycnVwdCh0aGlzLCBuYW1lKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb24sIG5ld0lkfSBmcm9tIFwiLi4vdHJhbnNpdGlvbi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlIGZyb20gXCIuLi90cmFuc2l0aW9uL3NjaGVkdWxlLmpzXCI7XG5pbXBvcnQge2Vhc2VDdWJpY0luT3V0fSBmcm9tIFwiZDMtZWFzZVwiO1xuaW1wb3J0IHtub3d9IGZyb20gXCJkMy10aW1lclwiO1xuXG52YXIgZGVmYXVsdFRpbWluZyA9IHtcbiAgdGltZTogbnVsbCwgLy8gU2V0IG9uIHVzZS5cbiAgZGVsYXk6IDAsXG4gIGR1cmF0aW9uOiAyNTAsXG4gIGVhc2U6IGVhc2VDdWJpY0luT3V0XG59O1xuXG5mdW5jdGlvbiBpbmhlcml0KG5vZGUsIGlkKSB7XG4gIHZhciB0aW1pbmc7XG4gIHdoaWxlICghKHRpbWluZyA9IG5vZGUuX190cmFuc2l0aW9uKSB8fCAhKHRpbWluZyA9IHRpbWluZ1tpZF0pKSB7XG4gICAgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHJhbnNpdGlvbiAke2lkfSBub3QgZm91bmRgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRpbWluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgaWQsXG4gICAgICB0aW1pbmc7XG5cbiAgaWYgKG5hbWUgaW5zdGFuY2VvZiBUcmFuc2l0aW9uKSB7XG4gICAgaWQgPSBuYW1lLl9pZCwgbmFtZSA9IG5hbWUuX25hbWU7XG4gIH0gZWxzZSB7XG4gICAgaWQgPSBuZXdJZCgpLCAodGltaW5nID0gZGVmYXVsdFRpbWluZykudGltZSA9IG5vdygpLCBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyBcIlwiO1xuICB9XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgc2NoZWR1bGUobm9kZSwgbmFtZSwgaWQsIGksIGdyb3VwLCB0aW1pbmcgfHwgaW5oZXJpdChub2RlLCBpZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTtcbn1cbiIsImltcG9ydCB7aW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmcgYXMgaW50ZXJwb2xhdGVUcmFuc2Zvcm19IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHtuYW1lc3BhY2V9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7dHdlZW5WYWx1ZX0gZnJvbSBcIi4vdHdlZW4uanNcIjtcbmltcG9ydCBpbnRlcnBvbGF0ZSBmcm9tIFwiLi9pbnRlcnBvbGF0ZS5qc1wiO1xuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlTlMoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50KG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCIsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnROUyhmdWxsbmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIixcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb24obmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAsIHZhbHVlMSA9IHZhbHVlKHRoaXMpLCBzdHJpbmcxO1xuICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwLCB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwgc3RyaW5nMTtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpLCBpID0gZnVsbG5hbWUgPT09IFwidHJhbnNmb3JtXCIgPyBpbnRlcnBvbGF0ZVRyYW5zZm9ybSA6IGludGVycG9sYXRlO1xuICByZXR1cm4gdGhpcy5hdHRyVHdlZW4obmFtZSwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24pKGZ1bGxuYW1lLCBpLCB0d2VlblZhbHVlKHRoaXMsIFwiYXR0ci5cIiArIG5hbWUsIHZhbHVlKSlcbiAgICAgIDogdmFsdWUgPT0gbnVsbCA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJSZW1vdmVOUyA6IGF0dHJSZW1vdmUpKGZ1bGxuYW1lKVxuICAgICAgOiAoZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyA6IGF0dHJDb25zdGFudCkoZnVsbG5hbWUsIGksIHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge25hbWVzcGFjZX0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuXG5mdW5jdGlvbiBhdHRySW50ZXJwb2xhdGUobmFtZSwgaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIGkuY2FsbCh0aGlzLCB0KSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJJbnRlcnBvbGF0ZU5TKGZ1bGxuYW1lLCBpKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIGkuY2FsbCh0aGlzLCB0KSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJUd2Vlbk5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIGF0dHJJbnRlcnBvbGF0ZU5TKGZ1bGxuYW1lLCBpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZnVuY3Rpb24gYXR0clR3ZWVuKG5hbWUsIHZhbHVlKSB7XG4gIHZhciB0MCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgYXR0ckludGVycG9sYXRlKG5hbWUsIGkpO1xuICAgIHJldHVybiB0MDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIga2V5ID0gXCJhdHRyLlwiICsgbmFtZTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG4gIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgKGZ1bGxuYW1lLmxvY2FsID8gYXR0clR3ZWVuTlMgOiBhdHRyVHdlZW4pKGZ1bGxuYW1lLCB2YWx1ZSkpO1xufVxuIiwiaW1wb3J0IHtnZXQsIGluaXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGRlbGF5RnVuY3Rpb24oaWQsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBpbml0KHRoaXMsIGlkKS5kZWxheSA9ICt2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkZWxheUNvbnN0YW50KGlkLCB2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPSArdmFsdWUsIGZ1bmN0aW9uKCkge1xuICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gdmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGRlbGF5RnVuY3Rpb25cbiAgICAgICAgICA6IGRlbGF5Q29uc3RhbnQpKGlkLCB2YWx1ZSkpXG4gICAgICA6IGdldCh0aGlzLm5vZGUoKSwgaWQpLmRlbGF5O1xufVxuIiwiaW1wb3J0IHtnZXQsIHNldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZHVyYXRpb25GdW5jdGlvbihpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHNldCh0aGlzLCBpZCkuZHVyYXRpb24gPSArdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZHVyYXRpb25Db25zdGFudChpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmR1cmF0aW9uID0gdmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGR1cmF0aW9uRnVuY3Rpb25cbiAgICAgICAgICA6IGR1cmF0aW9uQ29uc3RhbnQpKGlkLCB2YWx1ZSkpXG4gICAgICA6IGdldCh0aGlzLm5vZGUoKSwgaWQpLmR1cmF0aW9uO1xufVxuIiwiaW1wb3J0IHtnZXQsIHNldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZWFzZUNvbnN0YW50KGlkLCB2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHNldCh0aGlzLCBpZCkuZWFzZSA9IHZhbHVlO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2goZWFzZUNvbnN0YW50KGlkLCB2YWx1ZSkpXG4gICAgICA6IGdldCh0aGlzLm5vZGUoKSwgaWQpLmVhc2U7XG59XG4iLCJpbXBvcnQge3NldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZWFzZVZhcnlpbmcoaWQsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHR5cGVvZiB2ICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgICBzZXQodGhpcywgaWQpLmVhc2UgPSB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMuZWFjaChlYXNlVmFyeWluZyh0aGlzLl9pZCwgdmFsdWUpKTtcbn1cbiIsImltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG9uMCwgb24xLCB0aGF0ID0gdGhpcywgaWQgPSB0aGF0Ll9pZCwgc2l6ZSA9IHRoYXQuc2l6ZSgpO1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIGNhbmNlbCA9IHt2YWx1ZTogcmVqZWN0fSxcbiAgICAgICAgZW5kID0ge3ZhbHVlOiBmdW5jdGlvbigpIHsgaWYgKC0tc2l6ZSA9PT0gMCkgcmVzb2x2ZSgpOyB9fTtcblxuICAgIHRoYXQuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgICAgb24gPSBzY2hlZHVsZS5vbjtcblxuICAgICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICAgIGlmIChvbiAhPT0gb24wKSB7XG4gICAgICAgIG9uMSA9IChvbjAgPSBvbikuY29weSgpO1xuICAgICAgICBvbjEuXy5jYW5jZWwucHVzaChjYW5jZWwpO1xuICAgICAgICBvbjEuXy5pbnRlcnJ1cHQucHVzaChjYW5jZWwpO1xuICAgICAgICBvbjEuXy5lbmQucHVzaChlbmQpO1xuICAgICAgfVxuXG4gICAgICBzY2hlZHVsZS5vbiA9IG9uMTtcbiAgICB9KTtcblxuICAgIC8vIFRoZSBzZWxlY3Rpb24gd2FzIGVtcHR5LCByZXNvbHZlIGVuZCBpbW1lZGlhdGVseVxuICAgIGlmIChzaXplID09PSAwKSByZXNvbHZlKCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHttYXRjaGVyfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIGlmICh0eXBlb2YgbWF0Y2ggIT09IFwiZnVuY3Rpb25cIikgbWF0Y2ggPSBtYXRjaGVyKG1hdGNoKTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gW10sIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHtcbiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCB0aGlzLl9uYW1lLCB0aGlzLl9pZCk7XG59XG4iLCJpbXBvcnQge3NlbGVjdGlvbn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHRyYW5zaXRpb25fYXR0ciBmcm9tIFwiLi9hdHRyLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9hdHRyVHdlZW4gZnJvbSBcIi4vYXR0clR3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9kZWxheSBmcm9tIFwiLi9kZWxheS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZHVyYXRpb24gZnJvbSBcIi4vZHVyYXRpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2Vhc2UgZnJvbSBcIi4vZWFzZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZWFzZVZhcnlpbmcgZnJvbSBcIi4vZWFzZVZhcnlpbmcuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2ZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX21lcmdlIGZyb20gXCIuL21lcmdlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9vbiBmcm9tIFwiLi9vbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fcmVtb3ZlIGZyb20gXCIuL3JlbW92ZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0IGZyb20gXCIuL3NlbGVjdC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0QWxsIGZyb20gXCIuL3NlbGVjdEFsbC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0aW9uIGZyb20gXCIuL3NlbGVjdGlvbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc3R5bGUgZnJvbSBcIi4vc3R5bGUuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3N0eWxlVHdlZW4gZnJvbSBcIi4vc3R5bGVUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdGV4dCBmcm9tIFwiLi90ZXh0LmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90ZXh0VHdlZW4gZnJvbSBcIi4vdGV4dFR3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90cmFuc2l0aW9uIGZyb20gXCIuL3RyYW5zaXRpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3R3ZWVuIGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lbmQgZnJvbSBcIi4vZW5kLmpzXCI7XG5cbnZhciBpZCA9IDA7XG5cbmV4cG9ydCBmdW5jdGlvbiBUcmFuc2l0aW9uKGdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpIHtcbiAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzO1xuICB0aGlzLl9wYXJlbnRzID0gcGFyZW50cztcbiAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gIHRoaXMuX2lkID0gaWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zaXRpb24obmFtZSkge1xuICByZXR1cm4gc2VsZWN0aW9uKCkudHJhbnNpdGlvbihuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5ld0lkKCkge1xuICByZXR1cm4gKytpZDtcbn1cblxudmFyIHNlbGVjdGlvbl9wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlO1xuXG5UcmFuc2l0aW9uLnByb3RvdHlwZSA9IHRyYW5zaXRpb24ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVHJhbnNpdGlvbixcbiAgc2VsZWN0OiB0cmFuc2l0aW9uX3NlbGVjdCxcbiAgc2VsZWN0QWxsOiB0cmFuc2l0aW9uX3NlbGVjdEFsbCxcbiAgc2VsZWN0Q2hpbGQ6IHNlbGVjdGlvbl9wcm90b3R5cGUuc2VsZWN0Q2hpbGQsXG4gIHNlbGVjdENoaWxkcmVuOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNlbGVjdENoaWxkcmVuLFxuICBmaWx0ZXI6IHRyYW5zaXRpb25fZmlsdGVyLFxuICBtZXJnZTogdHJhbnNpdGlvbl9tZXJnZSxcbiAgc2VsZWN0aW9uOiB0cmFuc2l0aW9uX3NlbGVjdGlvbixcbiAgdHJhbnNpdGlvbjogdHJhbnNpdGlvbl90cmFuc2l0aW9uLFxuICBjYWxsOiBzZWxlY3Rpb25fcHJvdG90eXBlLmNhbGwsXG4gIG5vZGVzOiBzZWxlY3Rpb25fcHJvdG90eXBlLm5vZGVzLFxuICBub2RlOiBzZWxlY3Rpb25fcHJvdG90eXBlLm5vZGUsXG4gIHNpemU6IHNlbGVjdGlvbl9wcm90b3R5cGUuc2l6ZSxcbiAgZW1wdHk6IHNlbGVjdGlvbl9wcm90b3R5cGUuZW1wdHksXG4gIGVhY2g6IHNlbGVjdGlvbl9wcm90b3R5cGUuZWFjaCxcbiAgb246IHRyYW5zaXRpb25fb24sXG4gIGF0dHI6IHRyYW5zaXRpb25fYXR0cixcbiAgYXR0clR3ZWVuOiB0cmFuc2l0aW9uX2F0dHJUd2VlbixcbiAgc3R5bGU6IHRyYW5zaXRpb25fc3R5bGUsXG4gIHN0eWxlVHdlZW46IHRyYW5zaXRpb25fc3R5bGVUd2VlbixcbiAgdGV4dDogdHJhbnNpdGlvbl90ZXh0LFxuICB0ZXh0VHdlZW46IHRyYW5zaXRpb25fdGV4dFR3ZWVuLFxuICByZW1vdmU6IHRyYW5zaXRpb25fcmVtb3ZlLFxuICB0d2VlbjogdHJhbnNpdGlvbl90d2VlbixcbiAgZGVsYXk6IHRyYW5zaXRpb25fZGVsYXksXG4gIGR1cmF0aW9uOiB0cmFuc2l0aW9uX2R1cmF0aW9uLFxuICBlYXNlOiB0cmFuc2l0aW9uX2Vhc2UsXG4gIGVhc2VWYXJ5aW5nOiB0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nLFxuICBlbmQ6IHRyYW5zaXRpb25fZW5kLFxuICBbU3ltYm9sLml0ZXJhdG9yXTogc2VsZWN0aW9uX3Byb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdXG59O1xuIiwiaW1wb3J0IHtjb2xvcn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQge2ludGVycG9sYXRlTnVtYmVyLCBpbnRlcnBvbGF0ZVJnYiwgaW50ZXJwb2xhdGVTdHJpbmd9IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBjO1xuICByZXR1cm4gKHR5cGVvZiBiID09PSBcIm51bWJlclwiID8gaW50ZXJwb2xhdGVOdW1iZXJcbiAgICAgIDogYiBpbnN0YW5jZW9mIGNvbG9yID8gaW50ZXJwb2xhdGVSZ2JcbiAgICAgIDogKGMgPSBjb2xvcihiKSkgPyAoYiA9IGMsIGludGVycG9sYXRlUmdiKVxuICAgICAgOiBpbnRlcnBvbGF0ZVN0cmluZykoYSwgYik7XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHRyYW5zaXRpb24pIHtcbiAgaWYgKHRyYW5zaXRpb24uX2lkICE9PSB0aGlzLl9pZCkgdGhyb3cgbmV3IEVycm9yO1xuXG4gIGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSB0cmFuc2l0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkge1xuICAgICAgICBtZXJnZVtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IGogPCBtMDsgKytqKSB7XG4gICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTtcbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRoaXMuX2lkKTtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXQsIGluaXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIHN0YXJ0KG5hbWUpIHtcbiAgcmV0dXJuIChuYW1lICsgXCJcIikudHJpbSgpLnNwbGl0KC9efFxccysvKS5ldmVyeShmdW5jdGlvbih0KSB7XG4gICAgdmFyIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIHJldHVybiAhdCB8fCB0ID09PSBcInN0YXJ0XCI7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvbkZ1bmN0aW9uKGlkLCBuYW1lLCBsaXN0ZW5lcikge1xuICB2YXIgb24wLCBvbjEsIHNpdCA9IHN0YXJ0KG5hbWUpID8gaW5pdCA6IHNldDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNpdCh0aGlzLCBpZCksXG4gICAgICAgIG9uID0gc2NoZWR1bGUub247XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKG9uICE9PSBvbjApIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24obmFtZSwgbGlzdGVuZXIpO1xuXG4gICAgc2NoZWR1bGUub24gPSBvbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIGxpc3RlbmVyKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMlxuICAgICAgPyBnZXQodGhpcy5ub2RlKCksIGlkKS5vbi5vbihuYW1lKVxuICAgICAgOiB0aGlzLmVhY2gob25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpKTtcbn1cbiIsImZ1bmN0aW9uIHJlbW92ZUZ1bmN0aW9uKGlkKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICAgIGZvciAodmFyIGkgaW4gdGhpcy5fX3RyYW5zaXRpb24pIGlmICgraSAhPT0gaWQpIHJldHVybjtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5vbihcImVuZC5yZW1vdmVcIiwgcmVtb3ZlRnVuY3Rpb24odGhpcy5faWQpKTtcbn1cbiIsImltcG9ydCB7ZGlzcGF0Y2h9IGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuaW1wb3J0IHt0aW1lciwgdGltZW91dH0gZnJvbSBcImQzLXRpbWVyXCI7XG5cbnZhciBlbXB0eU9uID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcImVuZFwiLCBcImNhbmNlbFwiLCBcImludGVycnVwdFwiKTtcbnZhciBlbXB0eVR3ZWVuID0gW107XG5cbmV4cG9ydCB2YXIgQ1JFQVRFRCA9IDA7XG5leHBvcnQgdmFyIFNDSEVEVUxFRCA9IDE7XG5leHBvcnQgdmFyIFNUQVJUSU5HID0gMjtcbmV4cG9ydCB2YXIgU1RBUlRFRCA9IDM7XG5leHBvcnQgdmFyIFJVTk5JTkcgPSA0O1xuZXhwb3J0IHZhciBFTkRJTkcgPSA1O1xuZXhwb3J0IHZhciBFTkRFRCA9IDY7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUsIG5hbWUsIGlkLCBpbmRleCwgZ3JvdXAsIHRpbWluZykge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb247XG4gIGlmICghc2NoZWR1bGVzKSBub2RlLl9fdHJhbnNpdGlvbiA9IHt9O1xuICBlbHNlIGlmIChpZCBpbiBzY2hlZHVsZXMpIHJldHVybjtcbiAgY3JlYXRlKG5vZGUsIGlkLCB7XG4gICAgbmFtZTogbmFtZSxcbiAgICBpbmRleDogaW5kZXgsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay5cbiAgICBncm91cDogZ3JvdXAsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay5cbiAgICBvbjogZW1wdHlPbixcbiAgICB0d2VlbjogZW1wdHlUd2VlbixcbiAgICB0aW1lOiB0aW1pbmcudGltZSxcbiAgICBkZWxheTogdGltaW5nLmRlbGF5LFxuICAgIGR1cmF0aW9uOiB0aW1pbmcuZHVyYXRpb24sXG4gICAgZWFzZTogdGltaW5nLmVhc2UsXG4gICAgdGltZXI6IG51bGwsXG4gICAgc3RhdGU6IENSRUFURURcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7XG4gIGlmIChzY2hlZHVsZS5zdGF0ZSA+IENSRUFURUQpIHRocm93IG5ldyBFcnJvcihcInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZFwiKTtcbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7XG4gIGlmIChzY2hlZHVsZS5zdGF0ZSA+IFNUQVJURUQpIHRocm93IG5ldyBFcnJvcihcInRvbyBsYXRlOyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldChub2RlLCBpZCkge1xuICB2YXIgc2NoZWR1bGUgPSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgaWYgKCFzY2hlZHVsZSB8fCAhKHNjaGVkdWxlID0gc2NoZWR1bGVbaWRdKSkgdGhyb3cgbmV3IEVycm9yKFwidHJhbnNpdGlvbiBub3QgZm91bmRcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlKG5vZGUsIGlkLCBzZWxmKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbixcbiAgICAgIHR3ZWVuO1xuXG4gIC8vIEluaXRpYWxpemUgdGhlIHNlbGYgdGltZXIgd2hlbiB0aGUgdHJhbnNpdGlvbiBpcyBjcmVhdGVkLlxuICAvLyBOb3RlIHRoZSBhY3R1YWwgZGVsYXkgaXMgbm90IGtub3duIHVudGlsIHRoZSBmaXJzdCBjYWxsYmFjayFcbiAgc2NoZWR1bGVzW2lkXSA9IHNlbGY7XG4gIHNlbGYudGltZXIgPSB0aW1lcihzY2hlZHVsZSwgMCwgc2VsZi50aW1lKTtcblxuICBmdW5jdGlvbiBzY2hlZHVsZShlbGFwc2VkKSB7XG4gICAgc2VsZi5zdGF0ZSA9IFNDSEVEVUxFRDtcbiAgICBzZWxmLnRpbWVyLnJlc3RhcnQoc3RhcnQsIHNlbGYuZGVsYXksIHNlbGYudGltZSk7XG5cbiAgICAvLyBJZiB0aGUgZWxhcHNlZCBkZWxheSBpcyBsZXNzIHRoYW4gb3VyIGZpcnN0IHNsZWVwLCBzdGFydCBpbW1lZGlhdGVseS5cbiAgICBpZiAoc2VsZi5kZWxheSA8PSBlbGFwc2VkKSBzdGFydChlbGFwc2VkIC0gc2VsZi5kZWxheSk7XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydChlbGFwc2VkKSB7XG4gICAgdmFyIGksIGosIG4sIG87XG5cbiAgICAvLyBJZiB0aGUgc3RhdGUgaXMgbm90IFNDSEVEVUxFRCwgdGhlbiB3ZSBwcmV2aW91c2x5IGVycm9yZWQgb24gc3RhcnQuXG4gICAgaWYgKHNlbGYuc3RhdGUgIT09IFNDSEVEVUxFRCkgcmV0dXJuIHN0b3AoKTtcblxuICAgIGZvciAoaSBpbiBzY2hlZHVsZXMpIHtcbiAgICAgIG8gPSBzY2hlZHVsZXNbaV07XG4gICAgICBpZiAoby5uYW1lICE9PSBzZWxmLm5hbWUpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBXaGlsZSB0aGlzIGVsZW1lbnQgYWxyZWFkeSBoYXMgYSBzdGFydGluZyB0cmFuc2l0aW9uIGR1cmluZyB0aGlzIGZyYW1lLFxuICAgICAgLy8gZGVmZXIgc3RhcnRpbmcgYW4gaW50ZXJydXB0aW5nIHRyYW5zaXRpb24gdW50aWwgdGhhdCB0cmFuc2l0aW9uIGhhcyBhXG4gICAgICAvLyBjaGFuY2UgdG8gdGljayAoYW5kIHBvc3NpYmx5IGVuZCk7IHNlZSBkMy9kMy10cmFuc2l0aW9uIzU0IVxuICAgICAgaWYgKG8uc3RhdGUgPT09IFNUQVJURUQpIHJldHVybiB0aW1lb3V0KHN0YXJ0KTtcblxuICAgICAgLy8gSW50ZXJydXB0IHRoZSBhY3RpdmUgdHJhbnNpdGlvbiwgaWYgYW55LlxuICAgICAgaWYgKG8uc3RhdGUgPT09IFJVTk5JTkcpIHtcbiAgICAgICAgby5zdGF0ZSA9IEVOREVEO1xuICAgICAgICBvLnRpbWVyLnN0b3AoKTtcbiAgICAgICAgby5vbi5jYWxsKFwiaW50ZXJydXB0XCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApO1xuICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldO1xuICAgICAgfVxuXG4gICAgICAvLyBDYW5jZWwgYW55IHByZS1lbXB0ZWQgdHJhbnNpdGlvbnMuXG4gICAgICBlbHNlIGlmICgraSA8IGlkKSB7XG4gICAgICAgIG8uc3RhdGUgPSBFTkRFRDtcbiAgICAgICAgby50aW1lci5zdG9wKCk7XG4gICAgICAgIG8ub24uY2FsbChcImNhbmNlbFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBvLmluZGV4LCBvLmdyb3VwKTtcbiAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZlciB0aGUgZmlyc3QgdGljayB0byBlbmQgb2YgdGhlIGN1cnJlbnQgZnJhbWU7IHNlZSBkMy9kMyMxNTc2LlxuICAgIC8vIE5vdGUgdGhlIHRyYW5zaXRpb24gbWF5IGJlIGNhbmNlbGVkIGFmdGVyIHN0YXJ0IGFuZCBiZWZvcmUgdGhlIGZpcnN0IHRpY2shXG4gICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgc2NoZWR1bGVkIGJlZm9yZSB0aGUgc3RhcnQgZXZlbnQ7IHNlZSBkMy9kMy10cmFuc2l0aW9uIzE2IVxuICAgIC8vIEFzc3VtaW5nIHRoaXMgaXMgc3VjY2Vzc2Z1bCwgc3Vic2VxdWVudCBjYWxsYmFja3MgZ28gc3RyYWlnaHQgdG8gdGljay5cbiAgICB0aW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHNlbGYuc3RhdGUgPT09IFNUQVJURUQpIHtcbiAgICAgICAgc2VsZi5zdGF0ZSA9IFJVTk5JTkc7XG4gICAgICAgIHNlbGYudGltZXIucmVzdGFydCh0aWNrLCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpO1xuICAgICAgICB0aWNrKGVsYXBzZWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRGlzcGF0Y2ggdGhlIHN0YXJ0IGV2ZW50LlxuICAgIC8vIE5vdGUgdGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZSB0d2VlbiBhcmUgaW5pdGlhbGl6ZWQuXG4gICAgc2VsZi5zdGF0ZSA9IFNUQVJUSU5HO1xuICAgIHNlbGYub24uY2FsbChcInN0YXJ0XCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApO1xuICAgIGlmIChzZWxmLnN0YXRlICE9PSBTVEFSVElORykgcmV0dXJuOyAvLyBpbnRlcnJ1cHRlZFxuICAgIHNlbGYuc3RhdGUgPSBTVEFSVEVEO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgdHdlZW4sIGRlbGV0aW5nIG51bGwgdHdlZW4uXG4gICAgdHdlZW4gPSBuZXcgQXJyYXkobiA9IHNlbGYudHdlZW4ubGVuZ3RoKTtcbiAgICBmb3IgKGkgPSAwLCBqID0gLTE7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChvID0gc2VsZi50d2VlbltpXS52YWx1ZS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApKSB7XG4gICAgICAgIHR3ZWVuWysral0gPSBvO1xuICAgICAgfVxuICAgIH1cbiAgICB0d2Vlbi5sZW5ndGggPSBqICsgMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpY2soZWxhcHNlZCkge1xuICAgIHZhciB0ID0gZWxhcHNlZCA8IHNlbGYuZHVyYXRpb24gPyBzZWxmLmVhc2UuY2FsbChudWxsLCBlbGFwc2VkIC8gc2VsZi5kdXJhdGlvbikgOiAoc2VsZi50aW1lci5yZXN0YXJ0KHN0b3ApLCBzZWxmLnN0YXRlID0gRU5ESU5HLCAxKSxcbiAgICAgICAgaSA9IC0xLFxuICAgICAgICBuID0gdHdlZW4ubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIHR3ZWVuW2ldLmNhbGwobm9kZSwgdCk7XG4gICAgfVxuXG4gICAgLy8gRGlzcGF0Y2ggdGhlIGVuZCBldmVudC5cbiAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gRU5ESU5HKSB7XG4gICAgICBzZWxmLm9uLmNhbGwoXCJlbmRcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7XG4gICAgICBzdG9wKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RvcCgpIHtcbiAgICBzZWxmLnN0YXRlID0gRU5ERUQ7XG4gICAgc2VsZi50aW1lci5zdG9wKCk7XG4gICAgZGVsZXRlIHNjaGVkdWxlc1tpZF07XG4gICAgZm9yICh2YXIgaSBpbiBzY2hlZHVsZXMpIHJldHVybjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHtzZWxlY3Rvcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQgPSB0aGlzLl9pZDtcblxuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7XG4gICAgICAgIGlmIChcIl9fZGF0YV9fXCIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187XG4gICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTtcbiAgICAgICAgc2NoZWR1bGUoc3ViZ3JvdXBbaV0sIG5hbWUsIGlkLCBpLCBzdWJncm91cCwgZ2V0KG5vZGUsIGlkKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwiaW1wb3J0IHtzZWxlY3RvckFsbH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQgPSB0aGlzLl9pZDtcblxuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIGZvciAodmFyIGNoaWxkcmVuID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApLCBjaGlsZCwgaW5oZXJpdCA9IGdldChub2RlLCBpZCksIGsgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBrIDwgbDsgKytrKSB7XG4gICAgICAgICAgaWYgKGNoaWxkID0gY2hpbGRyZW5ba10pIHtcbiAgICAgICAgICAgIHNjaGVkdWxlKGNoaWxkLCBuYW1lLCBpZCwgaywgY2hpbGRyZW4sIGluaGVyaXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdWJncm91cHMucHVzaChjaGlsZHJlbik7XG4gICAgICAgIHBhcmVudHMucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCBwYXJlbnRzLCBuYW1lLCBpZCk7XG59XG4iLCJpbXBvcnQge3NlbGVjdGlvbn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuXG52YXIgU2VsZWN0aW9uID0gc2VsZWN0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvcjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2dyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJpbXBvcnQge2ludGVycG9sYXRlVHJhbnNmb3JtQ3NzIGFzIGludGVycG9sYXRlVHJhbnNmb3JtfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCB7c3R5bGV9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuaW1wb3J0IHt0d2VlblZhbHVlfSBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IGludGVycG9sYXRlIGZyb20gXCIuL2ludGVycG9sYXRlLmpzXCI7XG5cbmZ1bmN0aW9uIHN0eWxlTnVsbChuYW1lLCBpbnRlcnBvbGF0ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gc3R5bGUodGhpcywgbmFtZSksXG4gICAgICAgIHN0cmluZzEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGUodGhpcywgbmFtZSkpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCBzdHJpbmcxMCA9IHN0cmluZzEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZVJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUNvbnN0YW50KG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCIsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gc3R5bGUodGhpcywgbmFtZSksXG4gICAgICAgIHZhbHVlMSA9IHZhbHVlKHRoaXMpLFxuICAgICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHN0cmluZzEgPSB2YWx1ZTEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGUodGhpcywgbmFtZSkpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVNYXliZVJlbW92ZShpZCwgbmFtZSkge1xuICB2YXIgb24wLCBvbjEsIGxpc3RlbmVyMCwga2V5ID0gXCJzdHlsZS5cIiArIG5hbWUsIGV2ZW50ID0gXCJlbmQuXCIgKyBrZXksIHJlbW92ZTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIG9uID0gc2NoZWR1bGUub24sXG4gICAgICAgIGxpc3RlbmVyID0gc2NoZWR1bGUudmFsdWVba2V5XSA9PSBudWxsID8gcmVtb3ZlIHx8IChyZW1vdmUgPSBzdHlsZVJlbW92ZShuYW1lKSkgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKG9uICE9PSBvbjAgfHwgbGlzdGVuZXIwICE9PSBsaXN0ZW5lcikgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihldmVudCwgbGlzdGVuZXIwID0gbGlzdGVuZXIpO1xuXG4gICAgc2NoZWR1bGUub24gPSBvbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICB2YXIgaSA9IChuYW1lICs9IFwiXCIpID09PSBcInRyYW5zZm9ybVwiID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm0gOiBpbnRlcnBvbGF0ZTtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyB0aGlzXG4gICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZU51bGwobmFtZSwgaSkpXG4gICAgICAub24oXCJlbmQuc3R5bGUuXCIgKyBuYW1lLCBzdHlsZVJlbW92ZShuYW1lKSlcbiAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVGdW5jdGlvbihuYW1lLCBpLCB0d2VlblZhbHVlKHRoaXMsIFwic3R5bGUuXCIgKyBuYW1lLCB2YWx1ZSkpKVxuICAgICAgLmVhY2goc3R5bGVNYXliZVJlbW92ZSh0aGlzLl9pZCwgbmFtZSkpXG4gICAgOiB0aGlzXG4gICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZUNvbnN0YW50KG5hbWUsIGksIHZhbHVlKSwgcHJpb3JpdHkpXG4gICAgICAub24oXCJlbmQuc3R5bGUuXCIgKyBuYW1lLCBudWxsKTtcbn1cbiIsImZ1bmN0aW9uIHN0eWxlSW50ZXJwb2xhdGUobmFtZSwgaSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIGkuY2FsbCh0aGlzLCB0KSwgcHJpb3JpdHkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICB2YXIgdCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQgPSAoaTAgPSBpKSAmJiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KTtcbiAgICByZXR1cm4gdDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIGtleSA9IFwic3R5bGUuXCIgKyAobmFtZSArPSBcIlwiKTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gdGhpcy50d2VlbihrZXksIHN0eWxlVHdlZW4obmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyBcIlwiIDogcHJpb3JpdHkpKTtcbn1cbiIsImltcG9ydCB7dHdlZW5WYWx1ZX0gZnJvbSBcIi4vdHdlZW4uanNcIjtcblxuZnVuY3Rpb24gdGV4dENvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlMSA9IHZhbHVlKHRoaXMpO1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTEgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZTE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzLnR3ZWVuKFwidGV4dFwiLCB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyB0ZXh0RnVuY3Rpb24odHdlZW5WYWx1ZSh0aGlzLCBcInRleHRcIiwgdmFsdWUpKVxuICAgICAgOiB0ZXh0Q29uc3RhbnQodmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZSArIFwiXCIpKTtcbn1cbiIsImZ1bmN0aW9uIHRleHRJbnRlcnBvbGF0ZShpKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IGkuY2FsbCh0aGlzLCB0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dFR3ZWVuKHZhbHVlKSB7XG4gIHZhciB0MCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgdGV4dEludGVycG9sYXRlKGkpO1xuICAgIHJldHVybiB0MDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIga2V5ID0gXCJ0ZXh0XCI7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMSkgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCB0ZXh0VHdlZW4odmFsdWUpKTtcbn1cbiIsImltcG9ydCB7VHJhbnNpdGlvbiwgbmV3SWR9IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2NoZWR1bGUsIHtnZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsXG4gICAgICBpZDAgPSB0aGlzLl9pZCxcbiAgICAgIGlkMSA9IG5ld0lkKCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgdmFyIGluaGVyaXQgPSBnZXQobm9kZSwgaWQwKTtcbiAgICAgICAgc2NoZWR1bGUobm9kZSwgbmFtZSwgaWQxLCBpLCBncm91cCwge1xuICAgICAgICAgIHRpbWU6IGluaGVyaXQudGltZSArIGluaGVyaXQuZGVsYXkgKyBpbmhlcml0LmR1cmF0aW9uLFxuICAgICAgICAgIGRlbGF5OiAwLFxuICAgICAgICAgIGR1cmF0aW9uOiBpbmhlcml0LmR1cmF0aW9uLFxuICAgICAgICAgIGVhc2U6IGluaGVyaXQuZWFzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZDEpO1xufVxuIiwiaW1wb3J0IHtnZXQsIHNldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gdHdlZW5SZW1vdmUoaWQsIG5hbWUpIHtcbiAgdmFyIHR3ZWVuMCwgdHdlZW4xO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgdHdlZW4gPSBzY2hlZHVsZS50d2VlbjtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgdHdlZW4gd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKHR3ZWVuICE9PSB0d2VlbjApIHtcbiAgICAgIHR3ZWVuMSA9IHR3ZWVuMCA9IHR3ZWVuO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICh0d2VlbjFbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgIHR3ZWVuMSA9IHR3ZWVuMS5zbGljZSgpO1xuICAgICAgICAgIHR3ZWVuMS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdHdlZW5GdW5jdGlvbihpZCwgbmFtZSwgdmFsdWUpIHtcbiAgdmFyIHR3ZWVuMCwgdHdlZW4xO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIHR3ZWVuID0gc2NoZWR1bGUudHdlZW47XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIHR3ZWVuIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7XG4gICAgICB0d2VlbjEgPSAodHdlZW4wID0gdHdlZW4pLnNsaWNlKCk7XG4gICAgICBmb3IgKHZhciB0ID0ge25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0sIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICB0d2VlbjFbaV0gPSB0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaSA9PT0gbikgdHdlZW4xLnB1c2godCk7XG4gICAgfVxuXG4gICAgc2NoZWR1bGUudHdlZW4gPSB0d2VlbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIG5hbWUgKz0gXCJcIjtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgdHdlZW4gPSBnZXQodGhpcy5ub2RlKCksIGlkKS50d2VlbjtcbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR3ZWVuLmxlbmd0aCwgdDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKCh0ID0gdHdlZW5baV0pLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHQudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbCA/IHR3ZWVuUmVtb3ZlIDogdHdlZW5GdW5jdGlvbikoaWQsIG5hbWUsIHZhbHVlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0d2VlblZhbHVlKHRyYW5zaXRpb24sIG5hbWUsIHZhbHVlKSB7XG4gIHZhciBpZCA9IHRyYW5zaXRpb24uX2lkO1xuXG4gIHRyYW5zaXRpb24uZWFjaChmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpO1xuICAgIChzY2hlZHVsZS52YWx1ZSB8fCAoc2NoZWR1bGUudmFsdWUgPSB7fSkpW25hbWVdID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gZ2V0KG5vZGUsIGlkKS52YWx1ZVtuYW1lXTtcbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IHggPT4gKCkgPT4geDtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFpvb21FdmVudCh0eXBlLCB7XG4gIHNvdXJjZUV2ZW50LFxuICB0YXJnZXQsXG4gIHRyYW5zZm9ybSxcbiAgZGlzcGF0Y2hcbn0pIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgIHR5cGU6IHt2YWx1ZTogdHlwZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICBzb3VyY2VFdmVudDoge3ZhbHVlOiBzb3VyY2VFdmVudCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICB0YXJnZXQ6IHt2YWx1ZTogdGFyZ2V0LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHRyYW5zZm9ybToge3ZhbHVlOiB0cmFuc2Zvcm0sIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgXzoge3ZhbHVlOiBkaXNwYXRjaH1cbiAgfSk7XG59XG4iLCJleHBvcnQge2RlZmF1bHQgYXMgem9vbX0gZnJvbSBcIi4vem9vbS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHpvb21UcmFuc2Zvcm0sIGlkZW50aXR5IGFzIHpvb21JZGVudGl0eSwgVHJhbnNmb3JtIGFzIFpvb21UcmFuc2Zvcm19IGZyb20gXCIuL3RyYW5zZm9ybS5qc1wiO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIG5vcHJvcGFnYXRpb24oZXZlbnQpIHtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIFRyYW5zZm9ybShrLCB4LCB5KSB7XG4gIHRoaXMuayA9IGs7XG4gIHRoaXMueCA9IHg7XG4gIHRoaXMueSA9IHk7XG59XG5cblRyYW5zZm9ybS5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBUcmFuc2Zvcm0sXG4gIHNjYWxlOiBmdW5jdGlvbihrKSB7XG4gICAgcmV0dXJuIGsgPT09IDEgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmsgKiBrLCB0aGlzLngsIHRoaXMueSk7XG4gIH0sXG4gIHRyYW5zbGF0ZTogZnVuY3Rpb24oeCwgeSkge1xuICAgIHJldHVybiB4ID09PSAwICYgeSA9PT0gMCA/IHRoaXMgOiBuZXcgVHJhbnNmb3JtKHRoaXMuaywgdGhpcy54ICsgdGhpcy5rICogeCwgdGhpcy55ICsgdGhpcy5rICogeSk7XG4gIH0sXG4gIGFwcGx5OiBmdW5jdGlvbihwb2ludCkge1xuICAgIHJldHVybiBbcG9pbnRbMF0gKiB0aGlzLmsgKyB0aGlzLngsIHBvaW50WzFdICogdGhpcy5rICsgdGhpcy55XTtcbiAgfSxcbiAgYXBwbHlYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIHggKiB0aGlzLmsgKyB0aGlzLng7XG4gIH0sXG4gIGFwcGx5WTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiB5ICogdGhpcy5rICsgdGhpcy55O1xuICB9LFxuICBpbnZlcnQ6IGZ1bmN0aW9uKGxvY2F0aW9uKSB7XG4gICAgcmV0dXJuIFsobG9jYXRpb25bMF0gLSB0aGlzLngpIC8gdGhpcy5rLCAobG9jYXRpb25bMV0gLSB0aGlzLnkpIC8gdGhpcy5rXTtcbiAgfSxcbiAgaW52ZXJ0WDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiAoeCAtIHRoaXMueCkgLyB0aGlzLms7XG4gIH0sXG4gIGludmVydFk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4gKHkgLSB0aGlzLnkpIC8gdGhpcy5rO1xuICB9LFxuICByZXNjYWxlWDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiB4LmNvcHkoKS5kb21haW4oeC5yYW5nZSgpLm1hcCh0aGlzLmludmVydFgsIHRoaXMpLm1hcCh4LmludmVydCwgeCkpO1xuICB9LFxuICByZXNjYWxlWTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiB5LmNvcHkoKS5kb21haW4oeS5yYW5nZSgpLm1hcCh0aGlzLmludmVydFksIHRoaXMpLm1hcCh5LmludmVydCwgeSkpO1xuICB9LFxuICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwidHJhbnNsYXRlKFwiICsgdGhpcy54ICsgXCIsXCIgKyB0aGlzLnkgKyBcIikgc2NhbGUoXCIgKyB0aGlzLmsgKyBcIilcIjtcbiAgfVxufTtcblxuZXhwb3J0IHZhciBpZGVudGl0eSA9IG5ldyBUcmFuc2Zvcm0oMSwgMCwgMCk7XG5cbnRyYW5zZm9ybS5wcm90b3R5cGUgPSBUcmFuc2Zvcm0ucHJvdG90eXBlO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2Zvcm0obm9kZSkge1xuICB3aGlsZSAoIW5vZGUuX196b29tKSBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkgcmV0dXJuIGlkZW50aXR5O1xuICByZXR1cm4gbm9kZS5fX3pvb207XG59XG4iLCJpbXBvcnQge2Rpc3BhdGNofSBmcm9tIFwiZDMtZGlzcGF0Y2hcIjtcbmltcG9ydCB7ZHJhZ0Rpc2FibGUsIGRyYWdFbmFibGV9IGZyb20gXCJkMy1kcmFnXCI7XG5pbXBvcnQge2ludGVycG9sYXRlWm9vbX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge3NlbGVjdCwgcG9pbnRlcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtpbnRlcnJ1cHR9IGZyb20gXCJkMy10cmFuc2l0aW9uXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBab29tRXZlbnQgZnJvbSBcIi4vZXZlbnQuanNcIjtcbmltcG9ydCB7VHJhbnNmb3JtLCBpZGVudGl0eX0gZnJvbSBcIi4vdHJhbnNmb3JtLmpzXCI7XG5pbXBvcnQgbm9ldmVudCwge25vcHJvcGFnYXRpb259IGZyb20gXCIuL25vZXZlbnQuanNcIjtcblxuLy8gSWdub3JlIHJpZ2h0LWNsaWNrLCBzaW5jZSB0aGF0IHNob3VsZCBvcGVuIHRoZSBjb250ZXh0IG1lbnUuXG4vLyBleGNlcHQgZm9yIHBpbmNoLXRvLXpvb20sIHdoaWNoIGlzIHNlbnQgYXMgYSB3aGVlbCtjdHJsS2V5IGV2ZW50XG5mdW5jdGlvbiBkZWZhdWx0RmlsdGVyKGV2ZW50KSB7XG4gIHJldHVybiAoIWV2ZW50LmN0cmxLZXkgfHwgZXZlbnQudHlwZSA9PT0gJ3doZWVsJykgJiYgIWV2ZW50LmJ1dHRvbjtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEV4dGVudCgpIHtcbiAgdmFyIGUgPSB0aGlzO1xuICBpZiAoZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHtcbiAgICBlID0gZS5vd25lclNWR0VsZW1lbnQgfHwgZTtcbiAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIpKSB7XG4gICAgICBlID0gZS52aWV3Qm94LmJhc2VWYWw7XG4gICAgICByZXR1cm4gW1tlLngsIGUueV0sIFtlLnggKyBlLndpZHRoLCBlLnkgKyBlLmhlaWdodF1dO1xuICAgIH1cbiAgICByZXR1cm4gW1swLCAwXSwgW2Uud2lkdGguYmFzZVZhbC52YWx1ZSwgZS5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dO1xuICB9XG4gIHJldHVybiBbWzAsIDBdLCBbZS5jbGllbnRXaWR0aCwgZS5jbGllbnRIZWlnaHRdXTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFRyYW5zZm9ybSgpIHtcbiAgcmV0dXJuIHRoaXMuX196b29tIHx8IGlkZW50aXR5O1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0V2hlZWxEZWx0YShldmVudCkge1xuICByZXR1cm4gLWV2ZW50LmRlbHRhWSAqIChldmVudC5kZWx0YU1vZGUgPT09IDEgPyAwLjA1IDogZXZlbnQuZGVsdGFNb2RlID8gMSA6IDAuMDAyKSAqIChldmVudC5jdHJsS2V5ID8gMTAgOiAxKTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFRvdWNoYWJsZSgpIHtcbiAgcmV0dXJuIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyB8fCAoXCJvbnRvdWNoc3RhcnRcIiBpbiB0aGlzKTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdENvbnN0cmFpbih0cmFuc2Zvcm0sIGV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSB7XG4gIHZhciBkeDAgPSB0cmFuc2Zvcm0uaW52ZXJ0WChleHRlbnRbMF1bMF0pIC0gdHJhbnNsYXRlRXh0ZW50WzBdWzBdLFxuICAgICAgZHgxID0gdHJhbnNmb3JtLmludmVydFgoZXh0ZW50WzFdWzBdKSAtIHRyYW5zbGF0ZUV4dGVudFsxXVswXSxcbiAgICAgIGR5MCA9IHRyYW5zZm9ybS5pbnZlcnRZKGV4dGVudFswXVsxXSkgLSB0cmFuc2xhdGVFeHRlbnRbMF1bMV0sXG4gICAgICBkeTEgPSB0cmFuc2Zvcm0uaW52ZXJ0WShleHRlbnRbMV1bMV0pIC0gdHJhbnNsYXRlRXh0ZW50WzFdWzFdO1xuICByZXR1cm4gdHJhbnNmb3JtLnRyYW5zbGF0ZShcbiAgICBkeDEgPiBkeDAgPyAoZHgwICsgZHgxKSAvIDIgOiBNYXRoLm1pbigwLCBkeDApIHx8IE1hdGgubWF4KDAsIGR4MSksXG4gICAgZHkxID4gZHkwID8gKGR5MCArIGR5MSkgLyAyIDogTWF0aC5taW4oMCwgZHkwKSB8fCBNYXRoLm1heCgwLCBkeTEpXG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgZmlsdGVyID0gZGVmYXVsdEZpbHRlcixcbiAgICAgIGV4dGVudCA9IGRlZmF1bHRFeHRlbnQsXG4gICAgICBjb25zdHJhaW4gPSBkZWZhdWx0Q29uc3RyYWluLFxuICAgICAgd2hlZWxEZWx0YSA9IGRlZmF1bHRXaGVlbERlbHRhLFxuICAgICAgdG91Y2hhYmxlID0gZGVmYXVsdFRvdWNoYWJsZSxcbiAgICAgIHNjYWxlRXh0ZW50ID0gWzAsIEluZmluaXR5XSxcbiAgICAgIHRyYW5zbGF0ZUV4dGVudCA9IFtbLUluZmluaXR5LCAtSW5maW5pdHldLCBbSW5maW5pdHksIEluZmluaXR5XV0sXG4gICAgICBkdXJhdGlvbiA9IDI1MCxcbiAgICAgIGludGVycG9sYXRlID0gaW50ZXJwb2xhdGVab29tLFxuICAgICAgbGlzdGVuZXJzID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcInpvb21cIiwgXCJlbmRcIiksXG4gICAgICB0b3VjaHN0YXJ0aW5nLFxuICAgICAgdG91Y2hmaXJzdCxcbiAgICAgIHRvdWNoZW5kaW5nLFxuICAgICAgdG91Y2hEZWxheSA9IDUwMCxcbiAgICAgIHdoZWVsRGVsYXkgPSAxNTAsXG4gICAgICBjbGlja0Rpc3RhbmNlMiA9IDAsXG4gICAgICB0YXBEaXN0YW5jZSA9IDEwO1xuXG4gIGZ1bmN0aW9uIHpvb20oc2VsZWN0aW9uKSB7XG4gICAgc2VsZWN0aW9uXG4gICAgICAgIC5wcm9wZXJ0eShcIl9fem9vbVwiLCBkZWZhdWx0VHJhbnNmb3JtKVxuICAgICAgICAub24oXCJ3aGVlbC56b29tXCIsIHdoZWVsZWQsIHtwYXNzaXZlOiBmYWxzZX0pXG4gICAgICAgIC5vbihcIm1vdXNlZG93bi56b29tXCIsIG1vdXNlZG93bmVkKVxuICAgICAgICAub24oXCJkYmxjbGljay56b29tXCIsIGRibGNsaWNrZWQpXG4gICAgICAuZmlsdGVyKHRvdWNoYWJsZSlcbiAgICAgICAgLm9uKFwidG91Y2hzdGFydC56b29tXCIsIHRvdWNoc3RhcnRlZClcbiAgICAgICAgLm9uKFwidG91Y2htb3ZlLnpvb21cIiwgdG91Y2htb3ZlZClcbiAgICAgICAgLm9uKFwidG91Y2hlbmQuem9vbSB0b3VjaGNhbmNlbC56b29tXCIsIHRvdWNoZW5kZWQpXG4gICAgICAgIC5zdHlsZShcIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvclwiLCBcInJnYmEoMCwwLDAsMClcIik7XG4gIH1cblxuICB6b29tLnRyYW5zZm9ybSA9IGZ1bmN0aW9uKGNvbGxlY3Rpb24sIHRyYW5zZm9ybSwgcG9pbnQsIGV2ZW50KSB7XG4gICAgdmFyIHNlbGVjdGlvbiA9IGNvbGxlY3Rpb24uc2VsZWN0aW9uID8gY29sbGVjdGlvbi5zZWxlY3Rpb24oKSA6IGNvbGxlY3Rpb247XG4gICAgc2VsZWN0aW9uLnByb3BlcnR5KFwiX196b29tXCIsIGRlZmF1bHRUcmFuc2Zvcm0pO1xuICAgIGlmIChjb2xsZWN0aW9uICE9PSBzZWxlY3Rpb24pIHtcbiAgICAgIHNjaGVkdWxlKGNvbGxlY3Rpb24sIHRyYW5zZm9ybSwgcG9pbnQsIGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0aW9uLmludGVycnVwdCgpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgIGdlc3R1cmUodGhpcywgYXJndW1lbnRzKVxuICAgICAgICAgIC5ldmVudChldmVudClcbiAgICAgICAgICAuc3RhcnQoKVxuICAgICAgICAgIC56b29tKG51bGwsIHR5cGVvZiB0cmFuc2Zvcm0gPT09IFwiZnVuY3Rpb25cIiA/IHRyYW5zZm9ybS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogdHJhbnNmb3JtKVxuICAgICAgICAgIC5lbmQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB6b29tLnNjYWxlQnkgPSBmdW5jdGlvbihzZWxlY3Rpb24sIGssIHAsIGV2ZW50KSB7XG4gICAgem9vbS5zY2FsZVRvKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgazAgPSB0aGlzLl9fem9vbS5rLFxuICAgICAgICAgIGsxID0gdHlwZW9mIGsgPT09IFwiZnVuY3Rpb25cIiA/IGsuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGs7XG4gICAgICByZXR1cm4gazAgKiBrMTtcbiAgICB9LCBwLCBldmVudCk7XG4gIH07XG5cbiAgem9vbS5zY2FsZVRvID0gZnVuY3Rpb24oc2VsZWN0aW9uLCBrLCBwLCBldmVudCkge1xuICAgIHpvb20udHJhbnNmb3JtKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZSA9IGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICAgIHQwID0gdGhpcy5fX3pvb20sXG4gICAgICAgICAgcDAgPSBwID09IG51bGwgPyBjZW50cm9pZChlKSA6IHR5cGVvZiBwID09PSBcImZ1bmN0aW9uXCIgPyBwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBwLFxuICAgICAgICAgIHAxID0gdDAuaW52ZXJ0KHAwKSxcbiAgICAgICAgICBrMSA9IHR5cGVvZiBrID09PSBcImZ1bmN0aW9uXCIgPyBrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrO1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodDAsIGsxKSwgcDAsIHAxKSwgZSwgdHJhbnNsYXRlRXh0ZW50KTtcbiAgICB9LCBwLCBldmVudCk7XG4gIH07XG5cbiAgem9vbS50cmFuc2xhdGVCeSA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgeCwgeSwgZXZlbnQpIHtcbiAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbih0aGlzLl9fem9vbS50cmFuc2xhdGUoXG4gICAgICAgIHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyB4LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB4LFxuICAgICAgICB0eXBlb2YgeSA9PT0gXCJmdW5jdGlvblwiID8geS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogeVxuICAgICAgKSwgZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRyYW5zbGF0ZUV4dGVudCk7XG4gICAgfSwgbnVsbCwgZXZlbnQpO1xuICB9O1xuXG4gIHpvb20udHJhbnNsYXRlVG8gPSBmdW5jdGlvbihzZWxlY3Rpb24sIHgsIHksIHAsIGV2ZW50KSB7XG4gICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlID0gZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgICAgdCA9IHRoaXMuX196b29tLFxuICAgICAgICAgIHAwID0gcCA9PSBudWxsID8gY2VudHJvaWQoZSkgOiB0eXBlb2YgcCA9PT0gXCJmdW5jdGlvblwiID8gcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogcDtcbiAgICAgIHJldHVybiBjb25zdHJhaW4oaWRlbnRpdHkudHJhbnNsYXRlKHAwWzBdLCBwMFsxXSkuc2NhbGUodC5rKS50cmFuc2xhdGUoXG4gICAgICAgIHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyAteC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogLXgsXG4gICAgICAgIHR5cGVvZiB5ID09PSBcImZ1bmN0aW9uXCIgPyAteS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogLXlcbiAgICAgICksIGUsIHRyYW5zbGF0ZUV4dGVudCk7XG4gICAgfSwgcCwgZXZlbnQpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHNjYWxlKHRyYW5zZm9ybSwgaykge1xuICAgIGsgPSBNYXRoLm1heChzY2FsZUV4dGVudFswXSwgTWF0aC5taW4oc2NhbGVFeHRlbnRbMV0sIGspKTtcbiAgICByZXR1cm4gayA9PT0gdHJhbnNmb3JtLmsgPyB0cmFuc2Zvcm0gOiBuZXcgVHJhbnNmb3JtKGssIHRyYW5zZm9ybS54LCB0cmFuc2Zvcm0ueSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2xhdGUodHJhbnNmb3JtLCBwMCwgcDEpIHtcbiAgICB2YXIgeCA9IHAwWzBdIC0gcDFbMF0gKiB0cmFuc2Zvcm0uaywgeSA9IHAwWzFdIC0gcDFbMV0gKiB0cmFuc2Zvcm0uaztcbiAgICByZXR1cm4geCA9PT0gdHJhbnNmb3JtLnggJiYgeSA9PT0gdHJhbnNmb3JtLnkgPyB0cmFuc2Zvcm0gOiBuZXcgVHJhbnNmb3JtKHRyYW5zZm9ybS5rLCB4LCB5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNlbnRyb2lkKGV4dGVudCkge1xuICAgIHJldHVybiBbKCtleHRlbnRbMF1bMF0gKyArZXh0ZW50WzFdWzBdKSAvIDIsICgrZXh0ZW50WzBdWzFdICsgK2V4dGVudFsxXVsxXSkgLyAyXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNjaGVkdWxlKHRyYW5zaXRpb24sIHRyYW5zZm9ybSwgcG9pbnQsIGV2ZW50KSB7XG4gICAgdHJhbnNpdGlvblxuICAgICAgICAub24oXCJzdGFydC56b29tXCIsIGZ1bmN0aW9uKCkgeyBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cykuZXZlbnQoZXZlbnQpLnN0YXJ0KCk7IH0pXG4gICAgICAgIC5vbihcImludGVycnVwdC56b29tIGVuZC56b29tXCIsIGZ1bmN0aW9uKCkgeyBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cykuZXZlbnQoZXZlbnQpLmVuZCgpOyB9KVxuICAgICAgICAudHdlZW4oXCJ6b29tXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAgICAgICAgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgZyA9IGdlc3R1cmUodGhhdCwgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICAgICAgICBlID0gZXh0ZW50LmFwcGx5KHRoYXQsIGFyZ3MpLFxuICAgICAgICAgICAgICBwID0gcG9pbnQgPT0gbnVsbCA/IGNlbnRyb2lkKGUpIDogdHlwZW9mIHBvaW50ID09PSBcImZ1bmN0aW9uXCIgPyBwb2ludC5hcHBseSh0aGF0LCBhcmdzKSA6IHBvaW50LFxuICAgICAgICAgICAgICB3ID0gTWF0aC5tYXgoZVsxXVswXSAtIGVbMF1bMF0sIGVbMV1bMV0gLSBlWzBdWzFdKSxcbiAgICAgICAgICAgICAgYSA9IHRoYXQuX196b29tLFxuICAgICAgICAgICAgICBiID0gdHlwZW9mIHRyYW5zZm9ybSA9PT0gXCJmdW5jdGlvblwiID8gdHJhbnNmb3JtLmFwcGx5KHRoYXQsIGFyZ3MpIDogdHJhbnNmb3JtLFxuICAgICAgICAgICAgICBpID0gaW50ZXJwb2xhdGUoYS5pbnZlcnQocCkuY29uY2F0KHcgLyBhLmspLCBiLmludmVydChwKS5jb25jYXQodyAvIGIuaykpO1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBpZiAodCA9PT0gMSkgdCA9IGI7IC8vIEF2b2lkIHJvdW5kaW5nIGVycm9yIG9uIGVuZC5cbiAgICAgICAgICAgIGVsc2UgeyB2YXIgbCA9IGkodCksIGsgPSB3IC8gbFsyXTsgdCA9IG5ldyBUcmFuc2Zvcm0oaywgcFswXSAtIGxbMF0gKiBrLCBwWzFdIC0gbFsxXSAqIGspOyB9XG4gICAgICAgICAgICBnLnpvb20obnVsbCwgdCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXN0dXJlKHRoYXQsIGFyZ3MsIGNsZWFuKSB7XG4gICAgcmV0dXJuICghY2xlYW4gJiYgdGhhdC5fX3pvb21pbmcpIHx8IG5ldyBHZXN0dXJlKHRoYXQsIGFyZ3MpO1xuICB9XG5cbiAgZnVuY3Rpb24gR2VzdHVyZSh0aGF0LCBhcmdzKSB7XG4gICAgdGhpcy50aGF0ID0gdGhhdDtcbiAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIHRoaXMuYWN0aXZlID0gMDtcbiAgICB0aGlzLnNvdXJjZUV2ZW50ID0gbnVsbDtcbiAgICB0aGlzLmV4dGVudCA9IGV4dGVudC5hcHBseSh0aGF0LCBhcmdzKTtcbiAgICB0aGlzLnRhcHMgPSAwO1xuICB9XG5cbiAgR2VzdHVyZS5wcm90b3R5cGUgPSB7XG4gICAgZXZlbnQ6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQpIHRoaXMuc291cmNlRXZlbnQgPSBldmVudDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgc3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCsrdGhpcy5hY3RpdmUgPT09IDEpIHtcbiAgICAgICAgdGhpcy50aGF0Ll9fem9vbWluZyA9IHRoaXM7XG4gICAgICAgIHRoaXMuZW1pdChcInN0YXJ0XCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICB6b29tOiBmdW5jdGlvbihrZXksIHRyYW5zZm9ybSkge1xuICAgICAgaWYgKHRoaXMubW91c2UgJiYga2V5ICE9PSBcIm1vdXNlXCIpIHRoaXMubW91c2VbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMubW91c2VbMF0pO1xuICAgICAgaWYgKHRoaXMudG91Y2gwICYmIGtleSAhPT0gXCJ0b3VjaFwiKSB0aGlzLnRvdWNoMFsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy50b3VjaDBbMF0pO1xuICAgICAgaWYgKHRoaXMudG91Y2gxICYmIGtleSAhPT0gXCJ0b3VjaFwiKSB0aGlzLnRvdWNoMVsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy50b3VjaDFbMF0pO1xuICAgICAgdGhpcy50aGF0Ll9fem9vbSA9IHRyYW5zZm9ybTtcbiAgICAgIHRoaXMuZW1pdChcInpvb21cIik7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGVuZDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoLS10aGlzLmFjdGl2ZSA9PT0gMCkge1xuICAgICAgICBkZWxldGUgdGhpcy50aGF0Ll9fem9vbWluZztcbiAgICAgICAgdGhpcy5lbWl0KFwiZW5kXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBlbWl0OiBmdW5jdGlvbih0eXBlKSB7XG4gICAgICB2YXIgZCA9IHNlbGVjdCh0aGlzLnRoYXQpLmRhdHVtKCk7XG4gICAgICBsaXN0ZW5lcnMuY2FsbChcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdGhpcy50aGF0LFxuICAgICAgICBuZXcgWm9vbUV2ZW50KHR5cGUsIHtcbiAgICAgICAgICBzb3VyY2VFdmVudDogdGhpcy5zb3VyY2VFdmVudCxcbiAgICAgICAgICB0YXJnZXQ6IHpvb20sXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICB0cmFuc2Zvcm06IHRoaXMudGhhdC5fX3pvb20sXG4gICAgICAgICAgZGlzcGF0Y2g6IGxpc3RlbmVyc1xuICAgICAgICB9KSxcbiAgICAgICAgZFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gd2hlZWxlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICB0ID0gdGhpcy5fX3pvb20sXG4gICAgICAgIGsgPSBNYXRoLm1heChzY2FsZUV4dGVudFswXSwgTWF0aC5taW4oc2NhbGVFeHRlbnRbMV0sIHQuayAqIE1hdGgucG93KDIsIHdoZWVsRGVsdGEuYXBwbHkodGhpcywgYXJndW1lbnRzKSkpKSxcbiAgICAgICAgcCA9IHBvaW50ZXIoZXZlbnQpO1xuXG4gICAgLy8gSWYgdGhlIG1vdXNlIGlzIGluIHRoZSBzYW1lIGxvY2F0aW9uIGFzIGJlZm9yZSwgcmV1c2UgaXQuXG4gICAgLy8gSWYgdGhlcmUgd2VyZSByZWNlbnQgd2hlZWwgZXZlbnRzLCByZXNldCB0aGUgd2hlZWwgaWRsZSB0aW1lb3V0LlxuICAgIGlmIChnLndoZWVsKSB7XG4gICAgICBpZiAoZy5tb3VzZVswXVswXSAhPT0gcFswXSB8fCBnLm1vdXNlWzBdWzFdICE9PSBwWzFdKSB7XG4gICAgICAgIGcubW91c2VbMV0gPSB0LmludmVydChnLm1vdXNlWzBdID0gcCk7XG4gICAgICB9XG4gICAgICBjbGVhclRpbWVvdXQoZy53aGVlbCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhpcyB3aGVlbCBldmVudCB3b27igJl0IHRyaWdnZXIgYSB0cmFuc2Zvcm0gY2hhbmdlLCBpZ25vcmUgaXQuXG4gICAgZWxzZSBpZiAodC5rID09PSBrKSByZXR1cm47XG5cbiAgICAvLyBPdGhlcndpc2UsIGNhcHR1cmUgdGhlIG1vdXNlIHBvaW50IGFuZCBsb2NhdGlvbiBhdCB0aGUgc3RhcnQuXG4gICAgZWxzZSB7XG4gICAgICBnLm1vdXNlID0gW3AsIHQuaW52ZXJ0KHApXTtcbiAgICAgIGludGVycnVwdCh0aGlzKTtcbiAgICAgIGcuc3RhcnQoKTtcbiAgICB9XG5cbiAgICBub2V2ZW50KGV2ZW50KTtcbiAgICBnLndoZWVsID0gc2V0VGltZW91dCh3aGVlbGlkbGVkLCB3aGVlbERlbGF5KTtcbiAgICBnLnpvb20oXCJtb3VzZVwiLCBjb25zdHJhaW4odHJhbnNsYXRlKHNjYWxlKHQsIGspLCBnLm1vdXNlWzBdLCBnLm1vdXNlWzFdKSwgZy5leHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkpO1xuXG4gICAgZnVuY3Rpb24gd2hlZWxpZGxlZCgpIHtcbiAgICAgIGcud2hlZWwgPSBudWxsO1xuICAgICAgZy5lbmQoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtb3VzZWRvd25lZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICh0b3VjaGVuZGluZyB8fCAhZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgY3VycmVudFRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQsXG4gICAgICAgIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MsIHRydWUpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgdiA9IHNlbGVjdChldmVudC52aWV3KS5vbihcIm1vdXNlbW92ZS56b29tXCIsIG1vdXNlbW92ZWQsIHRydWUpLm9uKFwibW91c2V1cC56b29tXCIsIG1vdXNldXBwZWQsIHRydWUpLFxuICAgICAgICBwID0gcG9pbnRlcihldmVudCwgY3VycmVudFRhcmdldCksXG4gICAgICAgIHgwID0gZXZlbnQuY2xpZW50WCxcbiAgICAgICAgeTAgPSBldmVudC5jbGllbnRZO1xuXG4gICAgZHJhZ0Rpc2FibGUoZXZlbnQudmlldyk7XG4gICAgbm9wcm9wYWdhdGlvbihldmVudCk7XG4gICAgZy5tb3VzZSA9IFtwLCB0aGlzLl9fem9vbS5pbnZlcnQocCldO1xuICAgIGludGVycnVwdCh0aGlzKTtcbiAgICBnLnN0YXJ0KCk7XG5cbiAgICBmdW5jdGlvbiBtb3VzZW1vdmVkKGV2ZW50KSB7XG4gICAgICBub2V2ZW50KGV2ZW50KTtcbiAgICAgIGlmICghZy5tb3ZlZCkge1xuICAgICAgICB2YXIgZHggPSBldmVudC5jbGllbnRYIC0geDAsIGR5ID0gZXZlbnQuY2xpZW50WSAtIHkwO1xuICAgICAgICBnLm1vdmVkID0gZHggKiBkeCArIGR5ICogZHkgPiBjbGlja0Rpc3RhbmNlMjtcbiAgICAgIH1cbiAgICAgIGcuZXZlbnQoZXZlbnQpXG4gICAgICAgLnpvb20oXCJtb3VzZVwiLCBjb25zdHJhaW4odHJhbnNsYXRlKGcudGhhdC5fX3pvb20sIGcubW91c2VbMF0gPSBwb2ludGVyKGV2ZW50LCBjdXJyZW50VGFyZ2V0KSwgZy5tb3VzZVsxXSksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb3VzZXVwcGVkKGV2ZW50KSB7XG4gICAgICB2Lm9uKFwibW91c2Vtb3ZlLnpvb20gbW91c2V1cC56b29tXCIsIG51bGwpO1xuICAgICAgZHJhZ0VuYWJsZShldmVudC52aWV3LCBnLm1vdmVkKTtcbiAgICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgICAgZy5ldmVudChldmVudCkuZW5kKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGJsY2xpY2tlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgdDAgPSB0aGlzLl9fem9vbSxcbiAgICAgICAgcDAgPSBwb2ludGVyKGV2ZW50LmNoYW5nZWRUb3VjaGVzID8gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0gOiBldmVudCwgdGhpcyksXG4gICAgICAgIHAxID0gdDAuaW52ZXJ0KHAwKSxcbiAgICAgICAgazEgPSB0MC5rICogKGV2ZW50LnNoaWZ0S2V5ID8gMC41IDogMiksXG4gICAgICAgIHQxID0gY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0MCwgazEpLCBwMCwgcDEpLCBleHRlbnQuYXBwbHkodGhpcywgYXJncyksIHRyYW5zbGF0ZUV4dGVudCk7XG5cbiAgICBub2V2ZW50KGV2ZW50KTtcbiAgICBpZiAoZHVyYXRpb24gPiAwKSBzZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKGR1cmF0aW9uKS5jYWxsKHNjaGVkdWxlLCB0MSwgcDAsIGV2ZW50KTtcbiAgICBlbHNlIHNlbGVjdCh0aGlzKS5jYWxsKHpvb20udHJhbnNmb3JtLCB0MSwgcDAsIGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNoc3RhcnRlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LnRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCxcbiAgICAgICAgZyA9IGdlc3R1cmUodGhpcywgYXJncywgZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoID09PSBuKS5ldmVudChldmVudCksXG4gICAgICAgIHN0YXJ0ZWQsIGksIHQsIHA7XG5cbiAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB0ID0gdG91Y2hlc1tpXSwgcCA9IHBvaW50ZXIodCwgdGhpcyk7XG4gICAgICBwID0gW3AsIHRoaXMuX196b29tLmludmVydChwKSwgdC5pZGVudGlmaWVyXTtcbiAgICAgIGlmICghZy50b3VjaDApIGcudG91Y2gwID0gcCwgc3RhcnRlZCA9IHRydWUsIGcudGFwcyA9IDEgKyAhIXRvdWNoc3RhcnRpbmc7XG4gICAgICBlbHNlIGlmICghZy50b3VjaDEgJiYgZy50b3VjaDBbMl0gIT09IHBbMl0pIGcudG91Y2gxID0gcCwgZy50YXBzID0gMDtcbiAgICB9XG5cbiAgICBpZiAodG91Y2hzdGFydGluZykgdG91Y2hzdGFydGluZyA9IGNsZWFyVGltZW91dCh0b3VjaHN0YXJ0aW5nKTtcblxuICAgIGlmIChzdGFydGVkKSB7XG4gICAgICBpZiAoZy50YXBzIDwgMikgdG91Y2hmaXJzdCA9IHBbMF0sIHRvdWNoc3RhcnRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaHN0YXJ0aW5nID0gbnVsbDsgfSwgdG91Y2hEZWxheSk7XG4gICAgICBpbnRlcnJ1cHQodGhpcyk7XG4gICAgICBnLnN0YXJ0KCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2htb3ZlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghdGhpcy5fX3pvb21pbmcpIHJldHVybjtcbiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCwgaSwgdCwgcCwgbDtcblxuICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIHQgPSB0b3VjaGVzW2ldLCBwID0gcG9pbnRlcih0LCB0aGlzKTtcbiAgICAgIGlmIChnLnRvdWNoMCAmJiBnLnRvdWNoMFsyXSA9PT0gdC5pZGVudGlmaWVyKSBnLnRvdWNoMFswXSA9IHA7XG4gICAgICBlbHNlIGlmIChnLnRvdWNoMSAmJiBnLnRvdWNoMVsyXSA9PT0gdC5pZGVudGlmaWVyKSBnLnRvdWNoMVswXSA9IHA7XG4gICAgfVxuICAgIHQgPSBnLnRoYXQuX196b29tO1xuICAgIGlmIChnLnRvdWNoMSkge1xuICAgICAgdmFyIHAwID0gZy50b3VjaDBbMF0sIGwwID0gZy50b3VjaDBbMV0sXG4gICAgICAgICAgcDEgPSBnLnRvdWNoMVswXSwgbDEgPSBnLnRvdWNoMVsxXSxcbiAgICAgICAgICBkcCA9IChkcCA9IHAxWzBdIC0gcDBbMF0pICogZHAgKyAoZHAgPSBwMVsxXSAtIHAwWzFdKSAqIGRwLFxuICAgICAgICAgIGRsID0gKGRsID0gbDFbMF0gLSBsMFswXSkgKiBkbCArIChkbCA9IGwxWzFdIC0gbDBbMV0pICogZGw7XG4gICAgICB0ID0gc2NhbGUodCwgTWF0aC5zcXJ0KGRwIC8gZGwpKTtcbiAgICAgIHAgPSBbKHAwWzBdICsgcDFbMF0pIC8gMiwgKHAwWzFdICsgcDFbMV0pIC8gMl07XG4gICAgICBsID0gWyhsMFswXSArIGwxWzBdKSAvIDIsIChsMFsxXSArIGwxWzFdKSAvIDJdO1xuICAgIH1cbiAgICBlbHNlIGlmIChnLnRvdWNoMCkgcCA9IGcudG91Y2gwWzBdLCBsID0gZy50b3VjaDBbMV07XG4gICAgZWxzZSByZXR1cm47XG5cbiAgICBnLnpvb20oXCJ0b3VjaFwiLCBjb25zdHJhaW4odHJhbnNsYXRlKHQsIHAsIGwpLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaGVuZGVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCF0aGlzLl9fem9vbWluZykgcmV0dXJuO1xuICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzKS5ldmVudChldmVudCksXG4gICAgICAgIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCB0O1xuXG4gICAgbm9wcm9wYWdhdGlvbihldmVudCk7XG4gICAgaWYgKHRvdWNoZW5kaW5nKSBjbGVhclRpbWVvdXQodG91Y2hlbmRpbmcpO1xuICAgIHRvdWNoZW5kaW5nID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdG91Y2hlbmRpbmcgPSBudWxsOyB9LCB0b3VjaERlbGF5KTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB0ID0gdG91Y2hlc1tpXTtcbiAgICAgIGlmIChnLnRvdWNoMCAmJiBnLnRvdWNoMFsyXSA9PT0gdC5pZGVudGlmaWVyKSBkZWxldGUgZy50b3VjaDA7XG4gICAgICBlbHNlIGlmIChnLnRvdWNoMSAmJiBnLnRvdWNoMVsyXSA9PT0gdC5pZGVudGlmaWVyKSBkZWxldGUgZy50b3VjaDE7XG4gICAgfVxuICAgIGlmIChnLnRvdWNoMSAmJiAhZy50b3VjaDApIGcudG91Y2gwID0gZy50b3VjaDEsIGRlbGV0ZSBnLnRvdWNoMTtcbiAgICBpZiAoZy50b3VjaDApIGcudG91Y2gwWzFdID0gdGhpcy5fX3pvb20uaW52ZXJ0KGcudG91Y2gwWzBdKTtcbiAgICBlbHNlIHtcbiAgICAgIGcuZW5kKCk7XG4gICAgICAvLyBJZiB0aGlzIHdhcyBhIGRibHRhcCwgcmVyb3V0ZSB0byB0aGUgKG9wdGlvbmFsKSBkYmxjbGljay56b29tIGhhbmRsZXIuXG4gICAgICBpZiAoZy50YXBzID09PSAyKSB7XG4gICAgICAgIHQgPSBwb2ludGVyKHQsIHRoaXMpO1xuICAgICAgICBpZiAoTWF0aC5oeXBvdCh0b3VjaGZpcnN0WzBdIC0gdFswXSwgdG91Y2hmaXJzdFsxXSAtIHRbMV0pIDwgdGFwRGlzdGFuY2UpIHtcbiAgICAgICAgICB2YXIgcCA9IHNlbGVjdCh0aGlzKS5vbihcImRibGNsaWNrLnpvb21cIik7XG4gICAgICAgICAgaWYgKHApIHAuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHpvb20ud2hlZWxEZWx0YSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh3aGVlbERlbHRhID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIHpvb20pIDogd2hlZWxEZWx0YTtcbiAgfTtcblxuICB6b29tLmZpbHRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmaWx0ZXIgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIHpvb20pIDogZmlsdGVyO1xuICB9O1xuXG4gIHpvb20udG91Y2hhYmxlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRvdWNoYWJsZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgem9vbSkgOiB0b3VjaGFibGU7XG4gIH07XG5cbiAgem9vbS5leHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZXh0ZW50ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChbWytfWzBdWzBdLCArX1swXVsxXV0sIFsrX1sxXVswXSwgK19bMV1bMV1dXSksIHpvb20pIDogZXh0ZW50O1xuICB9O1xuXG4gIHpvb20uc2NhbGVFeHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGVFeHRlbnRbMF0gPSArX1swXSwgc2NhbGVFeHRlbnRbMV0gPSArX1sxXSwgem9vbSkgOiBbc2NhbGVFeHRlbnRbMF0sIHNjYWxlRXh0ZW50WzFdXTtcbiAgfTtcblxuICB6b29tLnRyYW5zbGF0ZUV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2xhdGVFeHRlbnRbMF1bMF0gPSArX1swXVswXSwgdHJhbnNsYXRlRXh0ZW50WzFdWzBdID0gK19bMV1bMF0sIHRyYW5zbGF0ZUV4dGVudFswXVsxXSA9ICtfWzBdWzFdLCB0cmFuc2xhdGVFeHRlbnRbMV1bMV0gPSArX1sxXVsxXSwgem9vbSkgOiBbW3RyYW5zbGF0ZUV4dGVudFswXVswXSwgdHJhbnNsYXRlRXh0ZW50WzBdWzFdXSwgW3RyYW5zbGF0ZUV4dGVudFsxXVswXSwgdHJhbnNsYXRlRXh0ZW50WzFdWzFdXV07XG4gIH07XG5cbiAgem9vbS5jb25zdHJhaW4gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY29uc3RyYWluID0gXywgem9vbSkgOiBjb25zdHJhaW47XG4gIH07XG5cbiAgem9vbS5kdXJhdGlvbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkdXJhdGlvbiA9ICtfLCB6b29tKSA6IGR1cmF0aW9uO1xuICB9O1xuXG4gIHpvb20uaW50ZXJwb2xhdGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaW50ZXJwb2xhdGUgPSBfLCB6b29tKSA6IGludGVycG9sYXRlO1xuICB9O1xuXG4gIHpvb20ub24gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmFsdWUgPSBsaXN0ZW5lcnMub24uYXBwbHkobGlzdGVuZXJzLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbGlzdGVuZXJzID8gem9vbSA6IHZhbHVlO1xuICB9O1xuXG4gIHpvb20uY2xpY2tEaXN0YW5jZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGlja0Rpc3RhbmNlMiA9IChfID0gK18pICogXywgem9vbSkgOiBNYXRoLnNxcnQoY2xpY2tEaXN0YW5jZTIpO1xuICB9O1xuXG4gIHpvb20udGFwRGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGFwRGlzdGFuY2UgPSArXywgem9vbSkgOiB0YXBEaXN0YW5jZTtcbiAgfTtcblxuICByZXR1cm4gem9vbTtcbn1cbiIsImltcG9ydCB7IHNlbGVjdCB9IGZyb20gJ2QzLXNlbGVjdGlvbidcblxuLyoqXG4gKiBQYXJlbnQgY2xhc3MgZm9yIGJ1dHRvbiBlbGVtZW50cyB1c2VkIHRvIGludGVyYWN0IHdpdGggdGhlIGdyaWR2aXogdmlld2VyLlxuICpcbiAqIEBtb2R1bGUgYnV0dG9uXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBCdXR0b24ge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXG4gICAgICogb3B0cy5wYXJlbnROb2RlXG4gICAgICogb3B0cy5pZFxuICAgICAqIG9wdHMudGl0bGVcbiAgICAgKiBvcHRzLmNsYXNzXG4gICAgICogb3B0cy5vbkNsaWNrRnVuY3Rpb25cbiAgICAgKiBvcHRzLnhcbiAgICAgKiBvcHRzLnlcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzID0ge30pIHtcbiAgICAgICAgdGhpcy5tYXAgPSBvcHRzLm1hcFxuICAgICAgICB0aGlzLnBhcmVudE5vZGUgPSBvcHRzLnBhcmVudE5vZGUgfHwgb3B0cy5tYXAuY29udGFpbmVyXG5cbiAgICAgICAgLy8gdGhlIGRpdiBlbGVtZW50XG4gICAgICAgIGlmIChvcHRzLmlkKSB0aGlzLmRpdiA9IHNlbGVjdCgnIycgKyBvcHRzLmlkKVxuXG4gICAgICAgIGlmICghdGhpcy5kaXYgfHwgdGhpcy5kaXYuZW1wdHkoKSkge1xuICAgICAgICAgICAgdGhpcy5kaXYgPSBzZWxlY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpXG4gICAgICAgICAgICBpZiAob3B0cy5pZCkgdGhpcy5kaXYuYXR0cignaWQnLCBvcHRzLmlkKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdHMudGl0bGUpIHRoaXMuZGl2LmF0dHIoJ3RpdGxlJywgb3B0cy50aXRsZSlcbiAgICAgICAgaWYgKG9wdHMuY2xhc3MpIHRoaXMuZGl2LmF0dHIoJ2NsYXNzJywgb3B0cy5jbGFzcylcblxuICAgICAgICAvLyBhZGQgZXZlbnRzXG4gICAgICAgIGlmIChvcHRzLm9uQ2xpY2tGdW5jdGlvbikgdGhpcy5kaXYub24oJ2NsaWNrJywgb3B0cy5vbkNsaWNrRnVuY3Rpb24pXG5cbiAgICAgICAgLy9zZXQgc3R5bGVzXG4gICAgICAgIHRoaXMuc3R5bGUoXG4gICAgICAgICAgICAnYm94LXNoYWRvdycsXG4gICAgICAgICAgICAnMCA3cHggOHB4IHJnYmEoMCw0NywxMDMsLjA4KSwgMCAwIDIycHggcmdiYSgwLDQ3LDEwMywuMDQpLCAwIDEycHggMTdweCByZ2JhKDAsNDcsMTAzLC4wNCksIDAgLTRweCA0cHggcmdiYSgwLDQ3LDEwMywuMDQpJ1xuICAgICAgICApIC8vLmVjbC11LXNoYWRvdy0zXG4gICAgICAgIHRoaXMuc3R5bGUoJ2JhY2tncm91bmQtY29sb3InLCAnI2ZmZmZmZicpXG4gICAgICAgIHRoaXMuc3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJylcbiAgICAgICAgdGhpcy5zdHlsZSgnY3Vyc29yJywgJ3BvaW50ZXInKVxuICAgICAgICB0aGlzLnN0eWxlKCdkaXNwbGF5JywgJ2ZsZXgnKVxuICAgICAgICB0aGlzLnN0eWxlKCdqdXN0aWZ5LWNvbnRlbnQnLCAnY2VudGVyJylcbiAgICAgICAgdGhpcy5zdHlsZSgnYWxpZ24taXRlbXMnLCAnY2VudGVyJylcbiAgICAgICAgdGhpcy5zdHlsZSgnd2lkdGgnLCAnMzVweCcpXG4gICAgICAgIHRoaXMuc3R5bGUoJ2hlaWdodCcsICczMHB4JylcbiAgICAgICAgLy8gdGhpcy5zdHlsZShwYWRkaW5nICwgJzRweCdcblxuICAgICAgICAvLyBhcHBlbmQgdG8gcGFyZW50XG4gICAgICAgIHRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzLmRpdi5ub2RlKCkpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwbHkgYSBzdHlsZSB0byB0aGUgYnV0dG9uIGRpdi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2XG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICovXG4gICAgc3R5bGUoaywgdikge1xuICAgICAgICB0aGlzLmRpdi5zdHlsZShrLCB2KVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJ1dHRvbiB9IGZyb20gJy4vQnV0dG9uLmpzJ1xuXG4vKipcbiAqIEJ1dHRvbiBmb3IgdG9nZ2xpbmcgZnVsbHNjcmVlbiBtb2RlXG4gKlxuICogQG1vZHVsZSBidXR0b25cbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEZ1bGxzY3JlZW5CdXR0b24gZXh0ZW5kcyBCdXR0b24ge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXG4gICAgICogb3B0cy5wYXJlbnROb2RlIC0gdGhlIG5vZGUgdGhhdCB0aGUgYnV0dG9uIGlzIGFwcGVuZGVkIHRvXG4gICAgICogb3B0cy5jYW52YXMgLSB0aGUgZ3JpZHZpeiBjYW52YXNcbiAgICAgKiBvcHRzLmlkXG4gICAgICogb3B0cy50aXRsZSAtIEhUTUwgdGl0bGUgYXR0cmlidXRlXG4gICAgICogb3B0cy5jbGFzcyAtIGNzcyBjbGFzc1xuICAgICAqIG9wdHMub25DbGlja0Z1bmN0aW9uXG4gICAgICogb3B0cy54IC0geCBwb3NpdGlvbiBvZiB0aGUgYnV0dG9uXG4gICAgICogb3B0cy55IC0geSBwb3NpdGlvbiBvZiB0aGUgYnV0dG9uXG4gICAgICovXG5cbiAgICAvLyBkZWZhdWx0IHN0YXRlXG4gICAgaXNGdWxsc2NyZWVuID0gZmFsc2VcblxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcblxuICAgICAgICAvLyBhcHBlbmQgZnVsbHNjcmVlbiBpY29uIHRvIGJ1dHRvbiBjb250YWluZXJcbiAgICAgICAgdGhpcy5kaXYubm9kZSgpLmlubmVySFRNTCA9IGBcbiAgICAgICAgPHN2Z1xuICAgICAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IDEuMnJlbTsgd2lkdGg6IDEuMnJlbTsgZmlsbDpibGFjazsgbWFyZ2luOjA7XCJcbiAgICAgICAgICAgIGZvY3VzYWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxzdmcgZmlsbD1cIiMwMDAwMDBcIiB2aWV3Qm94PVwiMCAwIDk2IDk2XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHRpdGxlLz5cbiAgICAgICAgICAgIDxnPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0zMCwwSDZBNS45OTY2LDUuOTk2NiwwLDAsMCwwLDZWMzBhNiw2LDAsMCwwLDEyLDBWMTJIMzBBNiw2LDAsMCwwLDMwLDBaXCIvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk05MCwwSDY2YTYsNiwwLDAsMCwwLDEySDg0VjMwYTYsNiwwLDAsMCwxMiwwVjZBNS45OTY2LDUuOTk2NiwwLDAsMCw5MCwwWlwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMzAsODRIMTJWNjZBNiw2LDAsMCwwLDAsNjZWOTBhNS45OTY2LDUuOTk2NiwwLDAsMCw2LDZIMzBhNiw2LDAsMCwwLDAtMTJaXCIvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk05MCw2MGE1Ljk5NjYsNS45OTY2LDAsMCwwLTYsNlY4NEg2NmE2LDYsMCwwLDAsMCwxMkg5MGE1Ljk5NjYsNS45OTY2LDAsMCwwLDYtNlY2NkE1Ljk5NjYsNS45OTY2LDAsMCwwLDkwLDYwWlwiLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgYFxuXG4gICAgICAgIC8vc2F2ZSBpbml0aWFsIG1hcCBkaW1lbnNpb25zXG4gICAgICAgIHRoaXMuZGVmYXVsdEhlaWdodCA9IHRoaXMubWFwLmhcbiAgICAgICAgdGhpcy5kZWZhdWx0V2lkdGggPSB0aGlzLm1hcC53XG5cbiAgICAgICAgLy8gZXZlbnQgaGFuZGxlclxuICAgICAgICB0aGlzLmRpdi5vbignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkNsaWNrRnVuY3Rpb24oZSlcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5kaXYub24oJ21vdXNlb3ZlcicsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywgJ2xpZ2h0Z3JleScpXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuZGl2Lm9uKCdtb3VzZW91dCcsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNmZmZmZmYnKVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vc2V0IHBvc2l0aW9uXG4gICAgICAgIGlmIChvcHRzLngpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ2xlZnQnLCBvcHRzLnggKyAncHgnKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdHlsZSgncmlnaHQnLCAnMTBweCcpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMueSkge1xuICAgICAgICAgICAgdGhpcy5zdHlsZSgndG9wJywgb3B0cy55ICsgJ3B4JylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ3RvcCcsICc5MHB4JylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQ2xpY2tGdW5jdGlvbihlKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRnVsbHNjcmVlbikge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUZ1bGxzY3JlZW4odGhpcy5tYXAuY29udGFpbmVyKVxuICAgICAgICAgICAgLy9yZXNpemUgY2FudmFzIHRvIGRlZmF1bHRcbiAgICAgICAgICAgIHRoaXMubWFwLmggPSB0aGlzLmRlZmF1bHRIZWlnaHRcbiAgICAgICAgICAgIHRoaXMubWFwLncgPSB0aGlzLmRlZmF1bHRXaWR0aFxuICAgICAgICAgICAgdGhpcy5tYXAuZ2VvQ2FudmFzLmggPSB0aGlzLmRlZmF1bHRIZWlnaHRcbiAgICAgICAgICAgIHRoaXMubWFwLmdlb0NhbnZhcy53ID0gdGhpcy5kZWZhdWx0V2lkdGhcbiAgICAgICAgICAgIHRoaXMubWFwLmdlb0NhbnZhcy5jYW52YXMuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcnICsgdGhpcy5kZWZhdWx0V2lkdGgpXG4gICAgICAgICAgICB0aGlzLm1hcC5nZW9DYW52YXMuY2FudmFzLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJycgKyB0aGlzLmRlZmF1bHRIZWlnaHQpXG4gICAgICAgICAgICB0aGlzLm1hcC5yZWRyYXcoKVxuICAgICAgICAgICAgdGhpcy5pc0Z1bGxzY3JlZW4gPSBmYWxzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcGVuRnVsbHNjcmVlbih0aGlzLm1hcC5jb250YWluZXIpXG4gICAgICAgICAgICAvL3Jlc2l6ZSBjYW52YXMgdG8gZnVsbHNjcmVlblxuICAgICAgICAgICAgdGhpcy5tYXAuaCA9IHdpbmRvdy5zY3JlZW4uaGVpZ2h0XG4gICAgICAgICAgICB0aGlzLm1hcC53ID0gd2luZG93LnNjcmVlbi53aWR0aFxuICAgICAgICAgICAgdGhpcy5pc0Z1bGxzY3JlZW4gPSB0cnVlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBPcGVuIGZ1bGxzY3JlZW4gKi9cbiAgICBvcGVuRnVsbHNjcmVlbihlbGVtKSB7XG4gICAgICAgIGlmIChlbGVtLnJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICBlbGVtLnJlcXVlc3RGdWxsc2NyZWVuKClcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAvKiBTYWZhcmkgKi9cbiAgICAgICAgICAgIGVsZW0ud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4oKVxuICAgICAgICB9IGVsc2UgaWYgKGVsZW0ubXNSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgLyogSUUxMSAqL1xuICAgICAgICAgICAgZWxlbS5tc1JlcXVlc3RGdWxsc2NyZWVuKClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qIENsb3NlIGZ1bGxzY3JlZW4gKi9cbiAgICBjbG9zZUZ1bGxzY3JlZW4oKSB7XG4gICAgICAgIGlmIChkb2N1bWVudC5leGl0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVxuICAgICAgICB9IGVsc2UgaWYgKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAvKiBTYWZhcmkgKi9cbiAgICAgICAgICAgIGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKClcbiAgICAgICAgfSBlbHNlIGlmIChkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAvKiBJRTExICovXG4gICAgICAgICAgICBkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IEJ1dHRvbiB9IGZyb20gJy4vQnV0dG9uLmpzJ1xuXG4vKipcbiAqIEJ1dHRvbiBmb3IgdG9nZ2xpbmcgZnVsbHNjcmVlbiBtb2RlXG4gKlxuICogQG1vZHVsZSBidXR0b25cbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFpvb21CdXR0b25zIGV4dGVuZHMgQnV0dG9uIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcblxuICAgICAgICB0aGlzLm9uWm9vbSA9IG9wdHMub25ab29tIC8vIGN1c3RvbSB1c2VyIGV2ZW50IGhhbmRsZXJcbiAgICAgICAgdGhpcy5kZWx0YSA9IG9wdHMuZGVsdGEgfHwgMC4yXG5cbiAgICAgICAgLy8gQ3JlYXRlIHpvb20gaW4gYnV0dG9uXG4gICAgICAgIHRoaXMuem9vbUluQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXG4gICAgICAgIHRoaXMuem9vbUluQnRuLmlkID0gJ3pvb20taW4nXG4gICAgICAgIHRoaXMuem9vbUluQnRuLmNsYXNzTmFtZSA9ICdncmlkdml6LXpvb20tYnV0dG9uJ1xuICAgICAgICB0aGlzLnpvb21JbkJ0bi50aXRsZSA9ICdab29tIGluJ1xuICAgICAgICB0aGlzLnpvb21JbkJ0bi50ZXh0Q29udGVudCA9ICcrJ1xuICAgICAgICB0aGlzLnpvb21JbkJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvb21JbihlKVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLnpvb21JbkJ0bi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvb21JbkJ0bi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnbGlnaHRncmV5J1xuICAgICAgICB9KVxuICAgICAgICB0aGlzLnpvb21JbkJ0bi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuem9vbUluQnRuLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcjZmZmZmZmJ1xuICAgICAgICB9KVxuXG4gICAgICAgIC8vIENyZWF0ZSB6b29tIG91dCBidXR0b25cbiAgICAgICAgdGhpcy56b29tT3V0QnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXG4gICAgICAgIHRoaXMuem9vbU91dEJ0bi5pZCA9ICd6b29tLW91dCdcbiAgICAgICAgdGhpcy56b29tT3V0QnRuLmNsYXNzTmFtZSA9ICdncmlkdml6LXpvb20tYnV0dG9uJ1xuICAgICAgICB0aGlzLnpvb21PdXRCdG4udGl0bGUgPSAnWm9vbSBvdXQnXG4gICAgICAgIHRoaXMuem9vbU91dEJ0bi50ZXh0Q29udGVudCA9ICctJ1xuICAgICAgICB0aGlzLnpvb21PdXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy56b29tT3V0KGUpXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuem9vbU91dEJ0bi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvb21PdXRCdG4uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ2xpZ2h0Z3JleSdcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy56b29tT3V0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy56b29tT3V0QnRuLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcjZmZmZmZmJ1xuICAgICAgICB9KVxuXG4gICAgICAgIC8vIFNldCBjb21tb24gc3R5bGVzIGZvciBidXR0b25zXG4gICAgICAgIGNvbnN0IGJ1dHRvbnMgPSBbdGhpcy56b29tSW5CdG4sIHRoaXMuem9vbU91dEJ0bl1cbiAgICAgICAgYnV0dG9ucy5mb3JFYWNoKChidG4sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBidG4uc3R5bGUuYWxpZ25JdGVtcyA9ICdjZW50ZXInXG4gICAgICAgICAgICBidG4uc3R5bGUuanVzdGlmeUNvbnRlbnQgPSAnY2VudGVyJ1xuICAgICAgICAgICAgYnRuLnN0eWxlLmRpc3BsYXkgPSAnZmxleCdcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5ib3JkZXIgPSAnbm9uZSdcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5jb2xvciA9ICdibGFjaydcbiAgICAgICAgICAgIGJ0bi5zdHlsZS50ZXh0QWxpZ24gPSAnY2VudGVyJ1xuICAgICAgICAgICAgYnRuLnN0eWxlLnRleHREZWNvcmF0aW9uID0gJ25vbmUnXG4gICAgICAgICAgICBidG4uc3R5bGUucGFkZGluZyA9ICc0cHgnXG4gICAgICAgICAgICBidG4uc3R5bGUuZm9udFNpemUgPSAnMjRweCdcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5mb250V2VpZ2h0ID0gJ2JvbGQnXG4gICAgICAgICAgICBidG4uc3R5bGUudXNlclNlbGVjdCA9ICdub25lJ1xuICAgICAgICAgICAgYnRuLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcjZmZmZmZmJ1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKSBidG4uc3R5bGUuYm9yZGVyQm90dG9tID0gJzFweCBzb2xpZCBncmV5JyAvLyBab29tIGluIGJ1dHRvbiBvbmx5XG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gVW5zZXQgcGFyZW50IGNsYXNzIGhlaWdodCBhbmQgZGlzcGxheSBmb3IgZHVhbCBidXR0b25zXG4gICAgICAgIHRoaXMuc3R5bGUoJ2hlaWdodCcsICd1bnNldCcpXG4gICAgICAgIHRoaXMuc3R5bGUoJ2Rpc3BsYXknLCAndW5zZXQnKVxuXG4gICAgICAgIC8vIFNldCBwb3NpdGlvblxuICAgICAgICBpZiAob3B0cy54KSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlKCdsZWZ0Jywgb3B0cy54ICsgJ3B4JylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ3JpZ2h0JywgJzEwcHgnKVxuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRzLnkpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ3RvcCcsIG9wdHMueSArICdweCcpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlKCd0b3AnLCAnMTBweCcpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBlbmQgYnV0dG9ucyB0byB0aGUgY29udGFpbmVyXG4gICAgICAgIHRoaXMuZGl2Lm5vZGUoKS5hcHBlbmRDaGlsZCh0aGlzLnpvb21JbkJ0bilcbiAgICAgICAgdGhpcy5kaXYubm9kZSgpLmFwcGVuZENoaWxkKHRoaXMuem9vbU91dEJ0bilcbiAgICB9XG5cbiAgICAvKiBab29tIGluICovXG4gICAgem9vbUluKGUpIHtcbiAgICAgICAgdGhpcy5tYXAuc2V0Wm9vbSh0aGlzLm1hcC5nZXRab29tKCkgKiAoMSAtIHRoaXMuZGVsdGEpKS5yZWRyYXcoKVxuICAgICAgICBpZiAodGhpcy5vblpvb20pIHRoaXMub25ab29tKGUpXG4gICAgfVxuXG4gICAgLyogWm9vbSBvdXQgKi9cbiAgICB6b29tT3V0KGUpIHtcbiAgICAgICAgdGhpcy5tYXAuc2V0Wm9vbSh0aGlzLm1hcC5nZXRab29tKCkgKiAoMSArIHRoaXMuZGVsdGEpKS5yZWRyYXcoKVxuICAgICAgICBpZiAodGhpcy5vblpvb20pIHRoaXMub25ab29tKGUpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIEEgZ3JpZCBjZWxsLlxuICogQHR5cGVkZWYge3t4OiBudW1iZXIsIHk6IG51bWJlcn19IENlbGwgKi9cblxuLyoqXG4gKiBBIGRhdGFzZXQgY29tcG9uZW50LCBvZiBncmlkIGNlbGxzLlxuICogQGFic3RyYWN0XG4gKlxuICogQG1vZHVsZSBjb3JlXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhc2V0IHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vTWFwLmpzXCIpLk1hcH0gbWFwIFRoZSBtYXAuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIG9mIHRoZSBkYXRhc2V0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZSBkYXRhc2V0IHJlc29sdXRpb24sIGluIHRoZSBDUlMgZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICogQHBhcmFtIHt7cHJlcHJvY2Vzcz86ZnVuY3Rpb24oQ2VsbCk6Ym9vbGVhbiwgbWl4ZWRSZXNvbHV0aW9uPzpmdW5jdGlvbihDZWxsKTpudW1iZXJ9fSBvcHRzXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWFwLCB1cmwsIHJlc29sdXRpb24sIG9wdHMgPSB7fSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIG1hcC5cbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKiBAdHlwZSB7aW1wb3J0KFwiLi9NYXAuanNcIikuTWFwfSAqL1xuICAgICAgICB0aGlzLm1hcCA9IG1hcFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdXJsIG9mIHRoZSBkYXRhc2V0LlxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudXJsID0gdXJsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkYXRhc2V0IHJlc29sdXRpb24gaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5yZXNvbHV0aW9uID0gcmVzb2x1dGlvblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBjYXNlIHRoZSBkYXRhc2V0IGlzIGEgZGF0YXNldCB3aXRoIGNlbGxzIGhhdmluZyBkaWZmZXJlbnQgcmVzb2x1dGlvbixcbiAgICAgICAgICogdGhpcyBpcyB0aGUgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSByZXNvbHV0aW9uIG9mIGVhY2ggY2VsbC5cbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKiBAdHlwZSB7KGZ1bmN0aW9uKENlbGwpOm51bWJlciApfCB1bmRlZmluZWQgfSAqL1xuICAgICAgICB0aGlzLm1peGVkUmVzb2x1dGlvbiA9IG9wdHMubWl4ZWRSZXNvbHV0aW9uXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgcHJlcHJvY2VzcyB0byBydW4gb24gZWFjaCBjZWxsIGFmdGVyIGxvYWRpbmcuIEl0IGNhbiBiZSB1c2VkIHRvIGFwcGx5IHNvbWUgc3BlY2lmaWMgdHJlYXRtZW50IGJlZm9yZSBvciBjb21wdXRlIGEgbmV3IGNvbHVtbi4gQW5kIGFsc28gdG8gZGV0ZXJtaW5lIHdoaWNoIGNlbGxzIHRvIGtlZXAgYWZ0ZXIgbG9hZGluZy5cbiAgICAgICAgICogQHR5cGUgeyhmdW5jdGlvbihDZWxsKTpib29sZWFuICl8IHVuZGVmaW5lZCB9ICovXG4gICAgICAgIHRoaXMucHJlcHJvY2VzcyA9IG9wdHMucHJlcHJvY2VzcyB8fCB1bmRlZmluZWRcblxuICAgICAgICAvKiogVGhlIGNlbGxzIHdpdGhpbiB0aGUgdmlld1xuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48Q2VsbD59ICovXG4gICAgICAgIHRoaXMuY2VsbHNWaWV3Q2FjaGUgPSBbXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3QgZGF0YSB3aXRoaW4gYSBnZW9ncmFwaGljIGVudmVsb3BlLlxuICAgICAqXG4gICAgICogQGFic3RyYWN0XG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0dlb0NhbnZhc1wiKS5FbnZlbG9wZXx1bmRlZmluZWR9IGV4dEdlb1xuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIGdldERhdGEoZXh0R2VvID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIGdldERhdGEgbm90IGltcGxlbWVudGVkLicpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsbCB0aGUgdmlldyBjYWNoZSB3aXRoIGFsbCBjZWxscyB3aGljaCBhcmUgd2l0aGluIGEgZ2VvZ3JhcGhpY2FsIGVudmVsb3BlLlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9HZW9DYW52YXNcIikuRW52ZWxvcGV9IGV4dEdlbyBUaGUgdmlldyBnZW9ncmFwaGljYWwgZW52ZWxvcGUuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgdXBkYXRlVmlld0NhY2hlKGV4dEdlbykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCB1cGRhdGVWaWV3Q2FjaGUgbm90IGltcGxlbWVudGVkLicpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgY2VsbCB1bmRlciBhIGdpdmVuIHBvc2l0aW9uLCBpZiBhbnkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3t4Om51bWJlcix5Om51bWJlcn19IHBvc0dlb1xuICAgICAqIEBwYXJhbSB7QXJyYXkuPENlbGw+fSBjZWxscyBTb21lIGNlbGxzIGZyb20gdGhlIGRhdGFzZXQgKGEgc3Vic2V0IGlmIG5lY2Vzc2FyeSwgdXN1YWxseSB0aGUgdmlldyBjYWNoZSkuXG4gICAgICogQHJldHVybnMge0NlbGx8dW5kZWZpbmVkfVxuICAgICAqL1xuICAgIGdldENlbGxGcm9tUG9zaXRpb24ocG9zR2VvLCBjZWxscykge1xuICAgICAgICAvL2NvbXB1dGUgY2FuZGlkYXRlIGNlbGwgcG9zaXRpb25cbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIC8vY29uc3QgciA9IHRoaXMuZ2V0UmVzb2x1dGlvbigpXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAvL2NvbnN0IGNlbGxYID0gciAqIE1hdGguZmxvb3IocG9zR2VvLnggLyByKVxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgLy9jb25zdCBjZWxsWSA9IHIgKiBNYXRoLmZsb29yKHBvc0dlby55IC8gcilcblxuICAgICAgICAvKi9nZXQgY2VsbFxuICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIGlmIChjZWxsLnggIT0gY2VsbFgpIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAoY2VsbC55ICE9IGNlbGxZKSBjb250aW51ZVxuICAgICAgICAgICAgcmV0dXJuIGNlbGxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkKi9cblxuICAgICAgICAvL3JhcmUgY2FzZSBvZiBtaXhlZCByZXNvbHV0aW9uIGRhdGFzZXRcbiAgICAgICAgaWYgKHRoaXMubWl4ZWRSZXNvbHV0aW9uKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgICAgICAgICBjb25zdCByID0gK3RoaXMubWl4ZWRSZXNvbHV0aW9uKGMpXG4gICAgICAgICAgICAgICAgaWYgKHBvc0dlby54IDwgYy54KSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMueCArIHIgPCBwb3NHZW8ueCkgY29udGludWVcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwb3NHZW8ueSA8IGMueSkgY29udGludWVcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjLnkgKyByIDwgcG9zR2VvLnkpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gY1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9XG5cbiAgICAgICAgLy9jb21tb24gY2FzZVxuXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICBjb25zdCByID0gdGhpcy5nZXRSZXNvbHV0aW9uKClcbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICBpZiAocG9zR2VvLnggPCBjZWxsLngpIGNvbnRpbnVlXG4gICAgICAgICAgICBlbHNlIGlmIChjZWxsLnggKyByIDwgcG9zR2VvLngpIGNvbnRpbnVlXG4gICAgICAgICAgICBlbHNlIGlmIChwb3NHZW8ueSA8IGNlbGwueSkgY29udGludWVcbiAgICAgICAgICAgIGVsc2UgaWYgKGNlbGwueSArIHIgPCBwb3NHZW8ueSkgY29udGludWVcbiAgICAgICAgICAgIGVsc2UgcmV0dXJuIGNlbGxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgLy9nZXR0ZXJzIGFuZCBzZXR0ZXJzXG5cbiAgICAvKiogQHJldHVybnMge251bWJlcn0gKi9cbiAgICBnZXRSZXNvbHV0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHV0aW9uXG4gICAgfVxuXG4gICAgLyoqIEByZXR1cm5zIHtBcnJheS48Q2VsbD59ICovXG4gICAgZ2V0Vmlld0NhY2hlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jZWxsc1ZpZXdDYWNoZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgcmVsZXZhbnQgZGF0YXNldCBmb3IgYSBzcGVjaWZpZWQgem9vbS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gelxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW5QaXhlbHNQZXJDZWxsXG4gICAgICogQHJldHVybnMge0RhdGFzZXR8dW5kZWZpbmVkfVxuICAgICAqICovXG4gICAgZ2V0RGF0YXNldCh6LCBtaW5QaXhlbHNQZXJDZWxsKSB7XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIFRoaXMgaXMgYW4gYWJzdHJhY3QgY2xhc3MgdXNlZCB0byBncm91cCBlbGVtZW50cyBzaGFyZWQgYmV0d2VlbiBMYXllciBhbmQgU3R5bGUgY2xhc3Nlcy5cbiAqXG4gKiBAYWJzdHJhY3RcbiAqIEBtb2R1bGUgY29yZVxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgRHJhd2FibGUge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHNwZWNpZnlpbmcgaWYgdGhlIGVsZW1lbnQgc2hvdWxkIGJlIHZpc2libGUgb3Igbm90LlxuICAgICAgICAgKiBUaGUgZnVuY3Rpb24gcGFyYW1ldGVyIGlzIHRoZSB6b29tIGxldmVsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyKTpib29sZWFufSAqL1xuICAgICAgICB0aGlzLnZpc2libGUgPSBvcHRzLnZpc2libGVcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGFscGhhICh0cmFuc3BhcmVuY3kvb3BhY2l0eSksIGJldHdlZW4gMC4wIChmdWxseSB0cmFuc3BhcmVudCkgYW5kIDEuMCAoZnVsbHkgb3BhcXVlKS5cbiAgICAgICAgICogIFRoZSBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgdGhlIHpvb20gbGV2ZWwuXG4gICAgICAgICAqIChzZWUgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEOiBnbG9iYWxBbHBoYSBwcm9wZXJ0eSlcbiAgICAgICAgICogQHR5cGUgeyhmdW5jdGlvbihudW1iZXIpOm51bWJlcil8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmFscGhhID0gb3B0cy5hbHBoYVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgYmxlbmQgb3BlcmF0aW9uLlxuICAgICAgICAgKiBUaGUgZnVuY3Rpb24gcGFyYW1ldGVyIGlzIHRoZSB6b29tIGxldmVsLlxuICAgICAgICAgKiAoc2VlIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDogZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uIHByb3BlcnR5KVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyKTpHbG9iYWxDb21wb3NpdGVPcGVyYXRpb259ICovXG4gICAgICAgIHRoaXMuYmxlbmRPcGVyYXRpb24gPSBvcHRzLmJsZW5kT3BlcmF0aW9uIHx8ICgoeikgPT4gJ3NvdXJjZS1vdmVyJylcblxuICAgICAgICAvKiogQHR5cGUgeyhmdW5jdGlvbihudW1iZXIpOnN0cmluZyl8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmZpbHRlckNvbG9yID0gb3B0cy5maWx0ZXJDb2xvciAvLyAoeikgPT4gXCIjZWVlN1wiXG4gICAgICAgIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKG51bWJlcik6R2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9ufFwibm9uZVwiKXx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMuZmlsdGVyQmxlbmRPcGVyYXRpb24gPSBvcHRzLmZpbHRlckJsZW5kT3BlcmF0aW9uIC8vICh6KSA9PiBcIm11bHRpcGx5XCJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGxheWVyIGZpbHRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXMgVGhlIGNhbnZhcyB3aGVyZSB0byBkcmF3IHRoZSBsYXllci5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKi9cbiAgICBkcmF3RmlsdGVyKGdlb0NhbnZhcykge1xuICAgICAgICAvL25vIGZpbHRlcjogcmV0dXJuXG4gICAgICAgIGlmICghdGhpcy5maWx0ZXJDb2xvcikgcmV0dXJuXG5cbiAgICAgICAgLy9nZXQgZmlsdGVyXG4gICAgICAgIGNvbnN0IGZjID0gdGhpcy5maWx0ZXJDb2xvcihnZW9DYW52YXMudmlldy56KVxuXG4gICAgICAgIC8vbm8gZmlsdGVyOiByZXR1cm5cbiAgICAgICAgaWYgKCFmYyB8fCBmYyA9PSAnbm9uZScpIHJldHVyblxuXG4gICAgICAgIC8vZHJhdyBmaWx0ZXJcblxuICAgICAgICAvL3NldCBjb2xvclxuICAgICAgICBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4LmZpbGxTdHlsZSA9IGZjXG5cbiAgICAgICAgLy9zYXZlIGJsZW5kIG1vZGUgYW5kIHNldCBuZXcsIGlmIGFueVxuICAgICAgICBsZXQgYm8gPSB1bmRlZmluZWQsIGJvMiA9IHVuZGVmaW5lZFxuICAgICAgICBpZiAodGhpcy5maWx0ZXJCbGVuZE9wZXJhdGlvbikge1xuICAgICAgICAgICAgYm8gPSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvblxuICAgICAgICAgICAgYm8yID0gdGhpcy5maWx0ZXJCbGVuZE9wZXJhdGlvbihnZW9DYW52YXMudmlldy56KVxuICAgICAgICB9XG4gICAgICAgIGlmIChibzIgJiYgYm8yICE9IFwibm9uZVwiKSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGJvMjtcblxuICAgICAgICAvL2RyYXdcbiAgICAgICAgZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eC5maWxsUmVjdCgwLCAwLCBnZW9DYW52YXMudywgZ2VvQ2FudmFzLmgpXG5cbiAgICAgICAgLy9yZXN0b3JlIGJsZW5kIG1vZGVcbiAgICAgICAgaWYgKGJvKSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGJvO1xuXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKiogQHR5cGVkZWYgeyB7eE1pbjogbnVtYmVyLCB4TWF4OiBudW1iZXIsIHlNaW46IG51bWJlciwgeU1heDogbnVtYmVyfSB9IEVudmVsb3BlICovXG5cbi8qKlxuICogQSB2aWV3c2hlZC5cbiAqIEB0eXBlZGVmIHt7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn19IFZpZXcgKi9cblxuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJ1xuaW1wb3J0IHsgem9vbSBhcyBkM3pvb20sIHpvb21JZGVudGl0eSB9IGZyb20gJ2QzLXpvb20nXG5cbi8qKlxuICogQSBIVE1MIGNhbnZhcyBmb3IgZ2VvIGRhdGEgZGlzcGxheSwgZW5oYW5jZWQgd2l0aCB6b29tIGFuZCBwYW4gY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBtb2R1bGUgY29yZVxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgR2VvQ2FudmFzIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBjYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSB2aWV3XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdmlld1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6IFRoZSB6b29tIGxldmVsIG9mIHRoZSB2aWV3IChwaXhlbCBzaXplLCBpbiBncm91bmQgbSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNhbnZhcywgeCA9IDAsIHkgPSAwLCB6ID0gMCwgb3B0cyA9IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLm9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEB0eXBlIHtIVE1MQ2FudmFzRWxlbWVudH0gKi9cbiAgICAgICAgdGhpcy5jYW52YXMgPSBjYW52YXNcblxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy53ID0gdGhpcy5jYW52YXMub2Zmc2V0V2lkdGhcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuaCA9IHRoaXMuY2FudmFzLm9mZnNldEhlaWdodFxuXG4gICAgICAgIC8vIEFkanVzdCBjYW52YXMgd2lkdGggYW5kIGhlaWdodCBiYXNlZCBvbiBkZXZpY2UgcGl4ZWwgcmF0aW9cbiAgICAgICAgLy9jb25zdCBkcHIgPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxIC8vIEdldCB0aGUgZGV2aWNlIHBpeGVsIHJhdGlvXG4gICAgICAgIC8vdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLncgKiBkcHIgLy8gU2V0IGNhbnZhcyB3aWR0aFxuICAgICAgICAvL1xcc3RoaXMuY2FudmFzLmhlaWdodCA9IHRoaXMuaCAqIGRwciAvLyBTZXQgY2FudmFzIGhlaWdodFxuXG4gICAgICAgIC8vIENyZWF0ZSBvZmZzY3JlZW4gY2FudmFzIGZvciBkcmF3aW5nIG9wZXJhdGlvbnNcbiAgICAgICAgdGhpcy5vZmZzY3JlZW5DYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxuICAgICAgICB0aGlzLm9mZnNjcmVlbkNhbnZhcy53aWR0aCA9IHRoaXMud1xuICAgICAgICB0aGlzLm9mZnNjcmVlbkNhbnZhcy5oZWlnaHQgPSB0aGlzLmhcblxuICAgICAgICBjb25zdCBjdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpXG4gICAgICAgIGNvbnN0IG9mZnNjcmVlbkN0eCA9IHRoaXMub2Zmc2NyZWVuQ2FudmFzLmdldENvbnRleHQoJzJkJylcbiAgICAgICAgaWYgKCFjdHgpIHRocm93ICdJbXBvc3NpYmxlIHRvIGNyZWF0ZSBjYW52YXMgMkQgY29udGV4dCdcbiAgICAgICAgaWYgKCFvZmZzY3JlZW5DdHgpIHRocm93ICdJbXBvc3NpYmxlIHRvIGNyZWF0ZSBjYW52YXMgMkQgY29udGV4dCdcbiAgICAgICAgLyoqQHR5cGUge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gKi9cbiAgICAgICAgdGhpcy5jdHggPSBjdHhcbiAgICAgICAgdGhpcy5vZmZzY3JlZW5DdHggPSBvZmZzY3JlZW5DdHhcbiAgICAgICAgLy90aGlzLmN0eC5zY2FsZShkcHIsIGRwcikgLy8gU2NhbGUgdGhlIGNvbnRleHRcblxuICAgICAgICAvKipcbiAgICAgICAgICogejogcGl4ZWwgc2l6ZSwgaW4gbS9waXhcbiAgICAgICAgICogQHR5cGUge1ZpZXd9ICAqL1xuICAgICAgICB0aGlzLnZpZXcgPSB7IHg6IHgsIHk6IHksIHo6IHogfVxuXG4gICAgICAgIC8qKiBCYWNrZ3JvdW5kIGNvbG9yLlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmJhY2tncm91bmRDb2xvciA9IG9wdHMuYmFja2dyb3VuZENvbG9yIHx8ICd3aGl0ZSdcblxuICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKG9iamVjdHx1bmRlZmluZWQpOnZvaWR9ICovXG4gICAgICAgIHRoaXMub25ab29tU3RhcnRGdW4gPSBvcHRzLm9uWm9vbVN0YXJ0RnVuXG5cbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihvYmplY3R8dW5kZWZpbmVkKTp2b2lkfSAqL1xuICAgICAgICB0aGlzLm9uWm9vbUVuZEZ1biA9IG9wdHMub25ab29tRW5kRnVuXG5cbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihvYmplY3R8dW5kZWZpbmVkKTp2b2lkfSAqL1xuICAgICAgICB0aGlzLm9uWm9vbUZ1biA9IG9wdHMub25ab29tRnVuXG5cbiAgICAgICAgLy9jdXJyZW50IGV4dGVudFxuICAgICAgICAvKiogQHR5cGUge0VudmVsb3BlfSAqL1xuICAgICAgICB0aGlzLmV4dEdlbyA9IHsgeE1pbjogTmFOLCB4TWF4OiBOYU4sIHlNaW46IE5hTiwgeU1heDogTmFOIH1cbiAgICAgICAgdGhpcy51cGRhdGVFeHRlbnRHZW8oKVxuXG4gICAgICAgIC8vcmVseSBvbiBkMyBmb3Igem9vbVxuICAgICAgICBpZiAoIW9wdHMuZGlzYWJsZVpvb20pIHtcbiAgICAgICAgICAgIGxldCB0UCA9IHpvb21JZGVudGl0eVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbGV0IGRlYm91bmNlVGltZW91dCA9IG51bGwgLy8gQWRkIGEgZGVib3VuY2UgdGltZW91dCB2YXJpYWJsZVxuICAgICAgICAgICAgY29uc3QgeiA9IGQzem9vbSgpXG4gICAgICAgICAgICAgICAgLy8gdG8gbWFrZSB0aGUgem9vbWluZyBhIGJpdCBmYXN0ZXJcbiAgICAgICAgICAgICAgICAud2hlZWxEZWx0YSgoZSkgPT4gLWUuZGVsdGFZICogKGUuZGVsdGFNb2RlID09PSAxID8gMC4wNyA6IGUuZGVsdGFNb2RlID8gMSA6IDAuMDA0KSlcbiAgICAgICAgICAgICAgICAub24oJ3pvb20nLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gZS50cmFuc2Zvcm1cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgem9vbUZhY3RvciA9IHRQLmsgLyB0LmtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHpvb21GYWN0b3IgPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9wYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR4ID0gdFAueCAtIHQueFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHkgPSB0UC55IC0gdC55XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhbihkeCAqIHRoaXMudmlldy56LCAtZHkgKiB0aGlzLnZpZXcueilcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVpvb20oZSwgem9vbUZhY3RvcilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0UCA9IHRcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vblpvb21GdW4pIHRoaXMub25ab29tRnVuKGUpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAub24oJ3N0YXJ0JywgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnQgb2Ygem9vbSBldmVudFxuICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHRoZSBjdXJyZW50IGNhbnZhcyBzdGF0ZSB0byBrZWVwIG9uc2NyZWVuIGR1cmluZyBwYW4vem9vbSBiZWZvcmUgcmVkcmF3aW5nXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5jID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmMuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcnICsgdGhpcy53KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuYy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuYy5nZXRDb250ZXh0KCcyZCcpPy5kcmF3SW1hZ2UodGhpcy5jYW52YXMsIDAsIDApXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keCA9IDBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR5ID0gMFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZiA9IDFcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25ab29tU3RhcnRGdW4pIHRoaXMub25ab29tU3RhcnRGdW4oZSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5vbignZW5kJywgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZW5kIG9mIHBhbi96b29tIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVkcmF3KClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlID0geyBjOiBudWxsLCBkeDogMCwgZHk6IDAsIGY6IDEgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uWm9vbUVuZEZ1bikgdGhpcy5vblpvb21FbmRGdW4oZSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgeihzZWxlY3QodGhpcy5jYW52YXMpKVxuXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVab29tID0gKGV2ZW50LCB6b29tRmFjdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gY2FuY2VsIG9uZ29pbmcgZGF0YSByZXF1ZXN0c1xuICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsQ3VycmVudFJlcXVlc3RzKClcbiAgICAgICAgICAgICAgICBjb25zdCBzZSA9IGV2ZW50LnNvdXJjZUV2ZW50XG5cbiAgICAgICAgICAgICAgICBpZiAoc2UgaW5zdGFuY2VvZiBXaGVlbEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vem9vbSBhdCB0aGUgbW91c2UgcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgdGhpcy56b29tKFxuICAgICAgICAgICAgICAgICAgICAgICAgem9vbUZhY3RvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGl4VG9HZW9YKHNlLm9mZnNldFgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5waXhUb0dlb1koc2Uub2Zmc2V0WSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2UgaW5zdGFuY2VvZiBUb3VjaEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29tcHV0ZSBhdmVyYWdlIHBvc2l0aW9uIG9mIHRoZSB0b3VjaGVzXG4gICAgICAgICAgICAgICAgICAgIGxldCB0eCA9IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eSA9IDBcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdHQgb2Ygc2UudGFyZ2V0VG91Y2hlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHggKz0gdHQuY2xpZW50WFxuICAgICAgICAgICAgICAgICAgICAgICAgdHkgKz0gdHQuY2xpZW50WVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHR4IC89IHNlLnRhcmdldFRvdWNoZXMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgIHR5IC89IHNlLnRhcmdldFRvdWNoZXMubGVuZ3RoXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQWRqdXN0IGZvciBjb250YWluZXIncyBvZmZzZXRcbiAgICAgICAgICAgICAgICAgICAgLy8gdHggLT0gY29udGFpbmVyUmVjdC5sZWZ0XG4gICAgICAgICAgICAgICAgICAgIC8vIHR5IC09IGNvbnRhaW5lclJlY3QudG9wXG5cbiAgICAgICAgICAgICAgICAgICAgLy96b29tIGF0IHRoaXMgYXZlcmFnZSBwb3NpdGlvblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnpvb20oem9vbUZhY3RvciwgdGhpcy5waXhUb0dlb1godHgpLCB0aGlzLnBpeFRvR2VvWSh0eSkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jZW50ZXIgZXh0ZW50XG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy54TWluID0gb3B0cy5jZW50ZXJFeHRlbnQgPyBvcHRzLmNlbnRlckV4dGVudFswXSA6IHVuZGVmaW5lZFxuICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMueU1pbiA9IG9wdHMuY2VudGVyRXh0ZW50ID8gb3B0cy5jZW50ZXJFeHRlbnRbMV0gOiB1bmRlZmluZWRcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLnhNYXggPSBvcHRzLmNlbnRlckV4dGVudCA/IG9wdHMuY2VudGVyRXh0ZW50WzJdIDogdW5kZWZpbmVkXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy55TWF4ID0gb3B0cy5jZW50ZXJFeHRlbnQgPyBvcHRzLmNlbnRlckV4dGVudFszXSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8qKiBab29tIGV4dGVudCwgdG8gbGltaXQgem9vbSBpbiBhbmQgb3V0XG4gICAgICAgICAqICBAdHlwZSB7QXJyYXkuPG51bWJlcj59ICovXG4gICAgICAgIHRoaXMuem9vbUV4dGVudCA9IG9wdHMuem9vbUV4dGVudCB8fCBbMCwgSW5maW5pdHldXG5cbiAgICAgICAgLyoqIENhbnZhcyBzdGF0ZSwgdG8gYmUgdXNlZCB0byBhdm9pZCB1bm5lY2Vzc2FyeSByZWRyYXdzIG9uIHpvb20vcGFuXG4gICAgICAgICAqICBAdHlwZSB7e2M6SFRNTENhbnZhc0VsZW1lbnR8bnVsbCxkeDpudW1iZXIsZHk6bnVtYmVyLGY6bnVtYmVyfX0gKi9cbiAgICAgICAgdGhpcy5jYW52YXNTYXZlID0geyBjOiBudWxsLCBkeDogMCwgZHk6IDAsIGY6IDEgfVxuICAgIH1cblxuICAgIC8qKiBAcmV0dXJucyB7Vmlld30gKi9cbiAgICBnZXRWaWV3KCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3XG4gICAgfVxuXG4gICAgLyoqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHYgKi9cbiAgICBzZXRDZW50ZXJFeHRlbnQodikge1xuICAgICAgICB0aGlzLnhNaW4gPSB2WzBdXG4gICAgICAgIHRoaXMueU1pbiA9IHZbMV1cbiAgICAgICAgdGhpcy54TWF4ID0gdlsyXVxuICAgICAgICB0aGlzLnlNYXggPSB2WzNdXG4gICAgfVxuICAgIC8qKiBAcmV0dXJucyB7QXJyYXkuPG51bWJlcnx1bmRlZmluZWQ+fSAqL1xuICAgIGdldENlbnRlckV4dGVudCgpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLnhNaW4sIHRoaXMueU1pbiwgdGhpcy54TWF4LCB0aGlzLnlNYXhdXG4gICAgfVxuXG4gICAgLyoqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHYgKi9cbiAgICBzZXRab29tRXh0ZW50KHYpIHtcbiAgICAgICAgdGhpcy56b29tRXh0ZW50ID0gdlxuICAgIH1cbiAgICAvKiogQHJldHVybnMge0FycmF5LjxudW1iZXI+fSAqL1xuICAgIGdldFpvb21FeHRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnpvb21FeHRlbnRcbiAgICB9XG5cbiAgICAvKiogSW5pdGlhbGlzZSBjYW52YXMgdHJhbnNmb3JtIHdpdGggaWRlbnRpdHkgdHJhbnNmb3JtYXRpb24uICovXG4gICAgaW5pdENhbnZhc1RyYW5zZm9ybSgpIHtcbiAgICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApXG4gICAgICAgIHRoaXMub2Zmc2NyZWVuQ3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKVxuICAgIH1cblxuICAgIC8qKiBJbml0aWFsaXNlIGNhbnZhcyB0cmFuc2Zvcm0gd2l0aCBnZW8gdG8gc2NyZWVuIHRyYW5zZm9ybWF0aW9uLCBzbyB0aGF0IGdlbyBvYmplY3RzIGNhbiBiZSBkcmF3biBkaXJlY3RseSBpbiBnZW8gY29vcmRpbmF0ZXMuICovXG4gICAgc2V0Q2FudmFzVHJhbnNmb3JtKCkge1xuICAgICAgICBjb25zdCBrID0gMSAvIHRoaXMudmlldy56XG4gICAgICAgIGNvbnN0IHR4ID0gLXRoaXMudmlldy54IC8gdGhpcy52aWV3LnogKyB0aGlzLncgKiAwLjVcbiAgICAgICAgY29uc3QgdHkgPSB0aGlzLnZpZXcueSAvIHRoaXMudmlldy56ICsgdGhpcy5oICogMC41XG4gICAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybShrLCAwLCAwLCAtaywgdHgsIHR5KVxuICAgICAgICB0aGlzLm9mZnNjcmVlbkN0eC5zZXRUcmFuc2Zvcm0oaywgMCwgMCwgLWssIHR4LCB0eSlcbiAgICB9XG5cbiAgICAvKiogR2V0IHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdG8gd2ViR0wgc2NyZWVuIGNvb3JkaW5hdGVzLCB3aXRoaW4gWy0xLDFdKlstMSwxXSAqL1xuICAgIGdldFdlYkdMVHJhbnNmb3JtKCkge1xuICAgICAgICBjb25zdCBreCA9IDIuMCAvICh0aGlzLncgKiB0aGlzLnZpZXcueilcbiAgICAgICAgY29uc3Qga3kgPSAyLjAgLyAodGhpcy5oICogdGhpcy52aWV3LnopXG4gICAgICAgIHJldHVybiBba3gsIDAuMCwgMC4wLCAwLjAsIGt5LCAwLjAsIC1reCAqIHRoaXMudmlldy54LCAta3kgKiB0aGlzLnZpZXcueSwgMS4wXVxuICAgIH1cblxuICAgIC8qKiBUaGUgZnVuY3Rpb24gc3BlY2lmeWluZyBob3cgdG8gZHJhdyB0aGUgbWFwLiAqL1xuICAgIHJlZHJhdygpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgcmVkcmF3IG5vdCBpbXBsZW1lbnRlZC4nKVxuICAgIH1cblxuICAgIC8qKiBXaGVuIHRoZSB6b29tIGxldmVsIGNoYW5nZXMsIGVuc3VyZXMgdGhhdCBhbnkgb25nb2luZyByZXF1ZXN0cyBhcmUgYWJvcnRlZCBiZWZvcmUgbmV3IG9uZXMgYXJlIGluaXRpYXRlZC4gKi9cbiAgICBjYW5jZWxDdXJyZW50UmVxdWVzdHMoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIGNhbmNlbEN1cnJlbnRSZXF1ZXN0cyBub3QgaW1wbGVtZW50ZWQuJylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhci4gVG8gYmUgdXNlZCBiZWZvcmUgYSByZWRyYXcgZm9yIGV4YW1wbGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yXG4gICAgICovXG4gICAgY2xlYXIoY29sb3IgPSAnd2hpdGUnKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMudHJhbnNwYXJlbnRCYWNrZ3JvdW5kKSB7XG4gICAgICAgICAgICB0aGlzLmN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy53LCB0aGlzLmgpXG4gICAgICAgICAgICB0aGlzLm9mZnNjcmVlbkN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy53LCB0aGlzLmgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdHgpIHRoaXMuY3R4LmZpbGxTdHlsZSA9IGNvbG9yXG4gICAgICAgICAgICBpZiAodGhpcy5vZmZzY3JlZW5DdHgpIHRoaXMub2Zmc2NyZWVuQ3R4LmZpbGxTdHlsZSA9IGNvbG9yXG4gICAgICAgICAgICB0aGlzLmN0eC5maWxsUmVjdCgwLCAwLCB0aGlzLncsIHRoaXMuaClcbiAgICAgICAgICAgIHRoaXMub2Zmc2NyZWVuQ3R4LmZpbGxSZWN0KDAsIDAsIHRoaXMudywgdGhpcy5oKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGR4R2VvXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGR5R2VvXG4gICAgICovXG4gICAgcGFuKGR4R2VvID0gMCwgZHlHZW8gPSAwKSB7XG4gICAgICAgIC8vZW5zdXJlcyB4L3kgZXh0ZW50XG4gICAgICAgIGlmICh0aGlzLnhNaW4gIT0gdW5kZWZpbmVkICYmIHRoaXMudmlldy54ICsgZHhHZW8gPCB0aGlzLnhNaW4pIGR4R2VvID0gdGhpcy54TWluIC0gdGhpcy52aWV3LnhcbiAgICAgICAgaWYgKHRoaXMueU1pbiAhPSB1bmRlZmluZWQgJiYgdGhpcy52aWV3LnkgKyBkeUdlbyA8IHRoaXMueU1pbikgZHlHZW8gPSB0aGlzLnlNaW4gLSB0aGlzLnZpZXcueVxuICAgICAgICBpZiAodGhpcy54TWF4ICE9IHVuZGVmaW5lZCAmJiB0aGlzLnZpZXcueCArIGR4R2VvID4gdGhpcy54TWF4KSBkeEdlbyA9IHRoaXMueE1heCAtIHRoaXMudmlldy54XG4gICAgICAgIGlmICh0aGlzLnlNYXggIT0gdW5kZWZpbmVkICYmIHRoaXMudmlldy55ICsgZHlHZW8gPiB0aGlzLnlNYXgpIGR5R2VvID0gdGhpcy55TWF4IC0gdGhpcy52aWV3LnlcblxuICAgICAgICAvL3BhblxuICAgICAgICB0aGlzLnZpZXcueCArPSBkeEdlb1xuICAgICAgICB0aGlzLnZpZXcueSArPSBkeUdlb1xuICAgICAgICB0aGlzLnVwZGF0ZUV4dGVudEdlbygpXG5cbiAgICAgICAgaWYgKHRoaXMuY2FudmFzU2F2ZS5jKSB7XG4gICAgICAgICAgICBjb25zdCBzY2FsZSA9IDEgLyB0aGlzLnZpZXcuelxuXG4gICAgICAgICAgICAvLyBVcGRhdGUgc2F2ZWQgY2FudmFzIG9mZnNldFxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR4IC09IGR4R2VvICogc2NhbGVcbiAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keSArPSBkeUdlbyAqIHNjYWxlXG5cbiAgICAgICAgICAgIC8vIGNsZWFyIGNhbnZhc1xuICAgICAgICAgICAgdGhpcy5jbGVhcih0aGlzLmJhY2tncm91bmRDb2xvcilcblxuICAgICAgICAgICAgLy8gdGhpcyBkb2VzbnQgd29yayBvbiBtb2JpbGUgaHR0cHM6Ly9naXRodWIuY29tL2V1cm9zdGF0L2dyaWR2aXovaXNzdWVzLzk4XG4gICAgICAgICAgICAvL3RoaXMuY3R4LmRyYXdJbWFnZSh0aGlzLmNhbnZhc1NhdmUuYywgdGhpcy5jYW52YXNTYXZlLmR4LCB0aGlzLmNhbnZhc1NhdmUuZHkpXG4gICAgICAgICAgICB0aGlzLm9mZnNjcmVlbkN0eC5kcmF3SW1hZ2UodGhpcy5jYW52YXNTYXZlLmMsIHRoaXMuY2FudmFzU2F2ZS5keCwgdGhpcy5jYW52YXNTYXZlLmR5KVxuXG4gICAgICAgICAgICAvLyBSZW5kZXIgdGhlIG9mZnNjcmVlbiBjYW52YXMgdG8gdGhlIHZpc2libGUgY29udGV4dFxuICAgICAgICAgICAgLy8gdGhpcy5jbGVhcih0aGlzLmJhY2tncm91bmRDb2xvcilcbiAgICAgICAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZSh0aGlzLm9mZnNjcmVlbkN0eC5jYW52YXMsIDAsIDApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnbm8gY2FudmFzIHNhdmUnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogWm9vbS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZiBUaGUgem9vbSBmYWN0b3IsIHdpdGhpbiBdMCwgSW5maW5pdHldLiAxIGlzIGZvciBubyBjaGFuZ2UuIDwxIHRvIHpvb20taW4sID4xIHRvIHpvb20tb3V0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4R2VvIFRoZSB4IGdlbyBwb3NpdGlvbiBmaXhlZCBpbiB0aGUgc2NyZWVuLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5R2VvIFRoZSB5IGdlbyBwb3NpdGlvbiBmaXhlZCBpbiB0aGUgc2NyZWVuLlxuICAgICAqL1xuICAgIHpvb20oZiA9IDEsIHhHZW8gPSB0aGlzLnZpZXcueCwgeUdlbyA9IHRoaXMudmlldy55KSB7XG4gICAgICAgIC8vVE9ETyBmb3JjZSBnZW8gZXh0ZW5kIHRvIHJlbWFpblxuXG4gICAgICAgIC8vdHJ5aW5nIHRvIHpvb20gaW4vb3V0IGJleW9uZCBsaW1pdFxuICAgICAgICBpZiAodGhpcy56b29tRXh0ZW50WzBdID09IHRoaXMudmlldy56ICYmIGYgPD0gMSkgcmV0dXJuXG4gICAgICAgIGlmICh0aGlzLnpvb21FeHRlbnRbMV0gPT0gdGhpcy52aWV3LnogJiYgZiA+PSAxKSByZXR1cm5cblxuICAgICAgICAvL2Vuc3VyZSB6b29tIGV4dGVudCBwcmVzZXJ2ZWRcbiAgICAgICAgY29uc3QgbmV3WmYgPSBmICogdGhpcy52aWV3LnpcbiAgICAgICAgaWYgKG5ld1pmIDwgdGhpcy56b29tRXh0ZW50WzBdKSBmID0gdGhpcy56b29tRXh0ZW50WzBdIC8gdGhpcy52aWV3LnpcbiAgICAgICAgaWYgKG5ld1pmID4gdGhpcy56b29tRXh0ZW50WzFdKSBmID0gdGhpcy56b29tRXh0ZW50WzFdIC8gdGhpcy52aWV3LnpcblxuICAgICAgICB0aGlzLnZpZXcueiAqPSBmXG5cbiAgICAgICAgLy9jb21wdXRlIHBhblxuICAgICAgICBsZXQgZHhHZW8gPSAoeEdlbyAtIHRoaXMudmlldy54KSAqICgxIC0gZilcbiAgICAgICAgbGV0IGR5R2VvID0gKHlHZW8gLSB0aGlzLnZpZXcueSkgKiAoMSAtIGYpXG5cbiAgICAgICAgLy9lbnN1cmVzIHgveSBleHRlbnRcbiAgICAgICAgaWYgKHRoaXMueE1pbiAhPSB1bmRlZmluZWQgJiYgdGhpcy52aWV3LnggKyBkeEdlbyA8IHRoaXMueE1pbikgZHhHZW8gPSB0aGlzLnhNaW4gLSB0aGlzLnZpZXcueFxuICAgICAgICBpZiAodGhpcy55TWluICE9IHVuZGVmaW5lZCAmJiB0aGlzLnZpZXcueSArIGR5R2VvIDwgdGhpcy55TWluKSBkeUdlbyA9IHRoaXMueU1pbiAtIHRoaXMudmlldy55XG4gICAgICAgIGlmICh0aGlzLnhNYXggIT0gdW5kZWZpbmVkICYmIHRoaXMudmlldy54ICsgZHhHZW8gPiB0aGlzLnhNYXgpIGR4R2VvID0gdGhpcy54TWF4IC0gdGhpcy52aWV3LnhcbiAgICAgICAgaWYgKHRoaXMueU1heCAhPSB1bmRlZmluZWQgJiYgdGhpcy52aWV3LnkgKyBkeUdlbyA+IHRoaXMueU1heCkgZHlHZW8gPSB0aGlzLnlNYXggLSB0aGlzLnZpZXcueVxuXG4gICAgICAgIC8vcGFuXG4gICAgICAgIHRoaXMudmlldy54ICs9IGR4R2VvXG4gICAgICAgIHRoaXMudmlldy55ICs9IGR5R2VvXG4gICAgICAgIHRoaXMudXBkYXRlRXh0ZW50R2VvKClcblxuICAgICAgICAvLyB6b29tIGluIG9uIHRoZSBjdXJyZW50IGNhbnZhcyBzdGF0ZVxuICAgICAgICBpZiAodGhpcy5jYW52YXNTYXZlLmMpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXIodGhpcy5iYWNrZ3JvdW5kQ29sb3IpXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZiAvPSBmXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHggPSB0aGlzLmdlb1RvUGl4WCh4R2VvKSAqICgxIC0gdGhpcy5jYW52YXNTYXZlLmYpXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHkgPSB0aGlzLmdlb1RvUGl4WSh5R2VvKSAqICgxIC0gdGhpcy5jYW52YXNTYXZlLmYpXG4gICAgICAgICAgICB0aGlzLmNsZWFyKHRoaXMuYmFja2dyb3VuZENvbG9yKVxuICAgICAgICAgICAgdGhpcy5vZmZzY3JlZW5DdHguZHJhd0ltYWdlKFxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5jLFxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keCxcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHksXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmYgKiB0aGlzLmNhbnZhc1NhdmUuYy53aWR0aCxcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZiAqIHRoaXMuY2FudmFzU2F2ZS5jLmhlaWdodFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKFxuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2NyZWVuQ2FudmFzLCAvLyBVc2Ugb2Zmc2NyZWVuIGNhbnZhcyBhcyB0aGUgc291cmNlXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAwLCAvLyBQb3NpdGlvbiB0aGUgb2Zmc2NyZWVuIGNhbnZhcyBhdCB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBtYWluIGNhbnZhc1xuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzLndpZHRoLCAvLyBUaGUgd2lkdGggb2YgdGhlIHZpc2libGUgY2FudmFzXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0IC8vIFRoZSBoZWlnaHQgb2YgdGhlIHZpc2libGUgY2FudmFzXG4gICAgICAgICAgICApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWFyZ2luUHhcbiAgICAgKiBAcmV0dXJucyB7RW52ZWxvcGV9IFRoZSBlbnZlbG9wZSBvZiB0aGUgdmlldywgaW4gZ2VvIGNvb3JkaW5hdGVzLlxuICAgICAqL1xuICAgIHVwZGF0ZUV4dGVudEdlbyhtYXJnaW5QeCA9IDIwKSB7XG4gICAgICAgIHRoaXMuZXh0R2VvID0ge1xuICAgICAgICAgICAgeE1pbjogdGhpcy5waXhUb0dlb1goLW1hcmdpblB4KSxcbiAgICAgICAgICAgIHhNYXg6IHRoaXMucGl4VG9HZW9YKHRoaXMudyArIG1hcmdpblB4KSxcbiAgICAgICAgICAgIHlNaW46IHRoaXMucGl4VG9HZW9ZKHRoaXMuaCArIG1hcmdpblB4KSxcbiAgICAgICAgICAgIHlNYXg6IHRoaXMucGl4VG9HZW9ZKC1tYXJnaW5QeCksXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZXh0R2VvXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIG9iamVjdCBoYXMgdG8gYmUgZHJhd25cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7e3g6bnVtYmVyLHk6bnVtYmVyfX0gb2JqXG4gICAgICovXG4gICAgdG9EcmF3KG9iaikge1xuICAgICAgICBpZiAob2JqLnggPCB0aGlzLmV4dEdlby54TWluKSByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYgKG9iai54ID4gdGhpcy5leHRHZW8ueE1heCkgcmV0dXJuIGZhbHNlXG4gICAgICAgIGlmIChvYmoueSA8IHRoaXMuZXh0R2VvLnlNaW4pIHJldHVybiBmYWxzZVxuICAgICAgICBpZiAob2JqLnkgPiB0aGlzLmV4dEdlby55TWF4KSByZXR1cm4gZmFsc2VcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvL2NvbnZlcnNpb24gZnVuY3Rpb25zXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHhHZW8gR2VvIHggY29vcmRpbmF0ZSwgaW4gbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBTY3JlZW4geCBjb29yZGluYXRlLCBpbiBwaXguXG4gICAgICovXG4gICAgZ2VvVG9QaXhYKHhHZW8pIHtcbiAgICAgICAgcmV0dXJuICh4R2VvIC0gdGhpcy52aWV3LngpIC8gdGhpcy52aWV3LnogKyB0aGlzLncgKiAwLjVcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlHZW8gR2VvIHkgY29vcmRpbmF0ZSwgaW4gbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBTY3JlZW4geSBjb29yZGluYXRlLCBpbiBwaXguXG4gICAgICovXG4gICAgZ2VvVG9QaXhZKHlHZW8pIHtcbiAgICAgICAgcmV0dXJuIC0oeUdlbyAtIHRoaXMudmlldy55KSAvIHRoaXMudmlldy56ICsgdGhpcy5oICogMC41XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IFNjcmVlbiB4IGNvb3JkaW5hdGUsIGluIHBpeC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBHZW8geCBjb29yZGluYXRlLCBpbiBtLlxuICAgICAqL1xuICAgIHBpeFRvR2VvWCh4KSB7XG4gICAgICAgIHJldHVybiAoeCAtIHRoaXMudyAqIDAuNSkgKiB0aGlzLnZpZXcueiArIHRoaXMudmlldy54XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IFNjcmVlbiB5IGNvb3JkaW5hdGUsIGluIHBpeC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBHZW8geSBjb29yZGluYXRlLCBpbiBtLlxuICAgICAqL1xuICAgIHBpeFRvR2VvWSh5KSB7XG4gICAgICAgIHJldHVybiAtKHkgLSB0aGlzLmggKiAwLjUpICogdGhpcy52aWV3LnogKyB0aGlzLnZpZXcueVxuICAgIH1cblxuICAgIC8qKiBHZXQgeCx5LHogZWxlbWVudHMgZnJvbSBVUkwgYW5kIGFzc2lnbiB0aGVtIHRvIHRoZSB2aWV3LiAqL1xuICAgIHNldFZpZXdGcm9tVVJMKCkge1xuICAgICAgICBjb25zdCB4ID0gR2VvQ2FudmFzLmdldFBhcmFtZXRlckJ5TmFtZSgneCcpLFxuICAgICAgICAgICAgeSA9IEdlb0NhbnZhcy5nZXRQYXJhbWV0ZXJCeU5hbWUoJ3knKSxcbiAgICAgICAgICAgIHogPSBHZW9DYW52YXMuZ2V0UGFyYW1ldGVyQnlOYW1lKCd6JylcbiAgICAgICAgaWYgKHggIT0gbnVsbCAmJiB4ICE9IHVuZGVmaW5lZCAmJiAhaXNOYU4oK3gpKSB0aGlzLnZpZXcueCA9ICt4XG4gICAgICAgIGlmICh5ICE9IG51bGwgJiYgeSAhPSB1bmRlZmluZWQgJiYgIWlzTmFOKCt5KSkgdGhpcy52aWV3LnkgPSAreVxuICAgICAgICBpZiAoeiAhPSBudWxsICYmIHogIT0gdW5kZWZpbmVkICYmICFpc05hTigreikpIHRoaXMudmlldy56ID0gK3pcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBVUkwgcGFyYW1ldGVyIGJ5IG5hbWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRQYXJhbWV0ZXJCeU5hbWUobmFtZSkge1xuICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC9bXFxbXS8sICdcXFxcWycpLnJlcGxhY2UoL1tcXF1dLywgJ1xcXFxdJylcbiAgICAgICAgdmFyIHJlZ2V4ID0gbmV3IFJlZ0V4cCgnW1xcXFw/Jl0nICsgbmFtZSArICc9KFteJiNdKiknKSxcbiAgICAgICAgICAgIHJlc3VsdHMgPSByZWdleC5leGVjKGxvY2F0aW9uLnNlYXJjaClcbiAgICAgICAgcmV0dXJuICFyZXN1bHRzID8gbnVsbCA6IGRlY29kZVVSSUNvbXBvbmVudChyZXN1bHRzWzFdLnJlcGxhY2UoL1xcKy9nLCAnICcpKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgRHJhd2FibGUgfSBmcm9tICcuL0RyYXdhYmxlLmpzJ1xuXG4vKipcbiAqIEBtb2R1bGUgY29yZVxuICogQGFic3RyYWN0XG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBMYXllciBleHRlbmRzIERyYXdhYmxlIHtcbiAgICAvKipcbiAgICAgKiBEcmF3IGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBsZWdlbmRcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKi9cbiAgICBkcmF3KGdlb0NhbnZhcywgbGVnZW5kID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIGRyYXcgbm90IGltcGxlbWVudGVkLicpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICdkMy1zZWxlY3Rpb24nXG5cbi8qKlxuICogQSBsZWdlbmQgY29udGFpbmVyLlxuICpcbiAqIEBtb2R1bGUgY29yZVxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgTGVnZW5kIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5pZCA9IG9wdHMuaWRcblxuICAgICAgICAvL1RPRE8gc3RvcCB1c2luZyBpdC4gVXNlIHN0eWxlIG1ldGhvZCBiZWxvdyBpbnN0ZWFkLlxuXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLnRvcCA9IG9wdHMudG9wXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLmJvdHRvbSA9IG9wdHMuYm90dG9tXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLmxlZnQgPSBvcHRzLmxlZnRcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXMucmlnaHQgPSBvcHRzLnJpZ2h0XG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSBvcHRzLmJhY2tncm91bmQgfHwgJ25vbmUnXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLnBhZGRpbmcgPSBvcHRzLnBhZGRpbmcgfHwgJzVweCdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXMuYm9yZGVyID0gb3B0cy5ib3JkZXIgfHwgJzBweCdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXNbJ2JvcmRlci1yYWRpdXMnXSA9IG9wdHNbJ2JvcmRlci1yYWRpdXMnXSB8fCAnbm9uZSdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXNbJ2JveC1zaGFkb3cnXSA9IG9wdHNbJ2JveC1zaGFkb3cnXSB8fCAnbm9uZSdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXNbJ2ZvbnQtZmFtaWx5J10gPSBvcHRzWydmb250LWZhbWlseSddIHx8ICdIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmJ1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgLy90aGlzLndpZHRoID0gb3B0cy53aWR0aFxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgLy90aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0XG5cbiAgICAgICAgLy90aGUgZGl2IGVsZW1lbnRcbiAgICAgICAgaWYgKHRoaXMuaWQpIHRoaXMuZGl2ID0gc2VsZWN0KCcjJyArIHRoaXMuaWQpXG5cbiAgICAgICAgaWYgKCF0aGlzLmRpdiB8fCB0aGlzLmRpdi5lbXB0eSgpKSB7XG4gICAgICAgICAgICB0aGlzLmRpdiA9IHNlbGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSlcbiAgICAgICAgICAgIGlmICh0aGlzLmlkKSB0aGlzLmRpdi5hdHRyKCdpZCcsIHRoaXMuaWQpXG4gICAgICAgIH1cblxuICAgICAgICAvL3NldCBzdHlsZVxuICAgICAgICB0aGlzLmRpdi5zdHlsZSgnYmFja2dyb3VuZCcsIHRoaXMuYmFja2dyb3VuZClcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoJ3BhZGRpbmcnLCB0aGlzLnBhZGRpbmcpXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKCdib3JkZXInLCB0aGlzLmJvcmRlcilcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoJ2JvcmRlci1yYWRpdXMnLCB0aGlzWydib3JkZXItcmFkaXVzJ10pXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKCdib3gtc2hhZG93JywgdGhpc1snYm94LXNoYWRvdyddKVxuICAgICAgICB0aGlzLmRpdi5zdHlsZSgnZm9udC1mYW1pbHknLCB0aGlzWydmb250LWZhbWlseSddKVxuXG4gICAgICAgIC8vaWYgKHRoaXMud2lkdGgpIHRoaXMuZGl2LnN0eWxlKCd3aWR0aCcsIHRoaXMud2lkdGgpXG4gICAgICAgIC8vaWYgKHRoaXMuaGVpZ2h0KSB0aGlzLmRpdi5zdHlsZSgnaGVpZ2h0JywgdGhpcy5oZWlnaHQpXG5cbiAgICAgICAgLy90aXRsZVxuICAgICAgICB0aGlzLnRpdGxlID0gb3B0cy50aXRsZVxuICAgICAgICB0aGlzLnRpdGxlRm9udFNpemUgPSBvcHRzLnRpdGxlRm9udFNpemUgfHwgJzAuOGVtJ1xuICAgICAgICB0aGlzLnRpdGxlRm9udFdlaWdodCA9IG9wdHMudGl0bGVGb250V2VpZ2h0IHx8ICdib2xkJ1xuXG4gICAgICAgIC8vbGFiZWxcbiAgICAgICAgdGhpcy5sYWJlbEZvbnRTaXplID0gb3B0cy5sYWJlbEZvbnRTaXplIHx8ICcwLjhlbSdcbiAgICAgICAgdGhpcy5sYWJlbFVuaXRUZXh0ID0gb3B0cy5sYWJlbFVuaXRUZXh0IHx8ICcnXG4gICAgICAgIHRoaXMubGFiZWxGb3JtYXQgPSBvcHRzLmxhYmVsRm9ybWF0XG4gICAgfVxuXG4gICAgbWFrZVRpdGxlKCkge1xuICAgICAgICBpZiAoIXRoaXMudGl0bGUpIHJldHVyblxuICAgICAgICB0aGlzLmRpdlxuICAgICAgICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy50aXRsZUZvbnRTaXplKVxuICAgICAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsIHRoaXMudGl0bGVGb250V2VpZ2h0KVxuICAgICAgICAgICAgLnN0eWxlKCdtYXJnaW4tYm90dG9tJywgJzdweCcpXG4gICAgICAgICAgICAudGV4dCh0aGlzLnRpdGxlKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwcGx5IGEgc3R5bGUgdG8gdGhlIGxlZ2VuZCBkaXYuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdlxuICAgICAqIEByZXR1cm5zIHt0aGlzfHN0cmluZ31cbiAgICAgKi9cbiAgICBzdHlsZShrLCB2KSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHJldHVybiB0aGlzLmRpdi5zdHlsZShrKVxuICAgICAgICB0aGlzLmRpdi5zdHlsZShrLCB2KVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgdXBkYXRlKG9wdHMgPSB7fSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdMZWdlbmQgdXBkYXRlIG5vdCBpbXBsZW1lbnRlZCB5ZXQuJylcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8vIGludGVybmFsIGltcG9ydHNcbmltcG9ydCB7IEdlb0NhbnZhcyB9IGZyb20gJy4vR2VvQ2FudmFzLmpzJ1xuaW1wb3J0IHsgVG9vbHRpcCB9IGZyb20gJy4vVG9vbHRpcC5qcydcbmltcG9ydCB7IFpvb21CdXR0b25zIH0gZnJvbSAnLi4vYnV0dG9uL1pvb21CdXR0b25zLmpzJ1xuaW1wb3J0IHsgRnVsbHNjcmVlbkJ1dHRvbiB9IGZyb20gJy4uL2J1dHRvbi9GdWxsc2NyZWVuQnV0dG9uLmpzJ1xuXG4vLyBleHRlcm5hbCBpbXBvcnRzXG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICdkMy1zZWxlY3Rpb24nXG5cbi8qKlxuICogQSBncmlkdml6IGFwcGxpY2F0aW9uLlxuICpcbiAqIEBtb2R1bGUgY29yZVxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgTWFwIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0hUTUxEaXZFbGVtZW50fSBjb250YWluZXJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbnRhaW5lciwgb3B0cykge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgbGF5ZXJzLlxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPGltcG9ydChcIi4vTGF5ZXIuanNcIikuTGF5ZXI+fVxuICAgICAgICAgKiAqL1xuICAgICAgICB0aGlzLmxheWVycyA9IG9wdHMubGF5ZXJzIHx8IFtdXG5cbiAgICAgICAgLy9nZXQgY29udGFpbmVyIGVsZW1lbnRcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXIgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dyaWR2aXonKVxuICAgICAgICBpZiAoIXRoaXMuY29udGFpbmVyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3QgZmluZCBncmlkdml6IGNvbnRhaW5lciBlbGVtZW50LicpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9hYnNvbHV0ZS1wb3NpdGlvbmluZy1pbnNpZGUtcmVsYXRpdmUtcG9zaXRpb25pbmcvXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJyAvLyBjb250YWluZXIgZWxlbWVudCBtdXN0IGhhdmUgcmVsYXRpdmUgcG9zaXRpb25pbmdcblxuICAgICAgICAvL3NldCBkaW1lbnNpb25zXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLncgPSBvcHRzLncgfHwgdGhpcy5jb250YWluZXIub2Zmc2V0V2lkdGhcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuaCA9IG9wdHMuaCB8fCB0aGlzLmNvbnRhaW5lci5vZmZzZXRIZWlnaHRcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIG1haW4gY2FudmFzIChmb3IgcmVuZGVyaW5nIHRvIHNjcmVlbilcbiAgICAgICAgLyoqIEB0eXBlIHtIVE1MQ2FudmFzRWxlbWVudH0gKi9cbiAgICAgICAgdGhpcy5fY2FudmFzID0gb3B0cy5jYW52YXMgfHwgdGhpcy5pbml0aWFsaXNlQ2FudmFzKClcblxuICAgICAgICAvKiogIEluaXRpYWxpemUgR2VvQ2FudmFzXG4gICAgICAgICAqIEB0eXBlIHtHZW9DYW52YXN9XG4gICAgICAgICAqIEBwcml2YXRlICovXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzID0gbmV3IEdlb0NhbnZhcyh0aGlzLl9jYW52YXMsIG9wdHMueCwgb3B0cy55LCBvcHRzLnosIG9wdHMpXG5cbiAgICAgICAgdGhpcy5nZW9DYW52YXMucmVkcmF3ID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWRyYXcoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbmNlbEN1cnJlbnRSZXF1ZXN0cyA9ICgpID0+IHtcbiAgICAgICAgICAgIC8vIHdoZW4gdGhlIHpvb20gbGV2ZWwgY2hhbmdlcywgYXZvaWQgZHJhd2luZyBvdXRkYXRlZCB0aWxlcywgYW5kIGVuc3VyZSB0aGF0IHJlcXVlc3RzIGFyZSBwcm9wZXJseSBhYm9ydGVkIHdoZW4gbmVjZXNzYXJ5XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XG4gICAgICAgICAgICAgICAgLy9tdWx0aXJlc1xuICAgICAgICAgICAgICAgIGlmIChsYXllci5kYXRhc2V0Py5kYXRhc2V0cykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgbGF5ZXIuZGF0YXNldD8uZGF0YXNldHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhc2V0Py5jYW5jZWxDdXJyZW50UmVxdWVzdHMpIGRhdGFzZXQuY2FuY2VsQ3VycmVudFJlcXVlc3RzKClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL3NpbmdsZSByZXNcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXIuZGF0YXNldD8uY2FuY2VsQ3VycmVudFJlcXVlc3RzKSBsYXllci5kYXRhc2V0Py5jYW5jZWxDdXJyZW50UmVxdWVzdHMoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gbGVnZW5kIGRpdlxuICAgICAgICB0aGlzLmxlZ2VuZCA9IG9wdHMubGVnZW5kQ29udGFpbmVyXG4gICAgICAgICAgICA/IHNlbGVjdChvcHRzLmxlZ2VuZENvbnRhaW5lcikgLy8gV3JhcCB0aGUgcHJvdmlkZWQgSFRNTCBub2RlIGluIGEgRDMgc2VsZWN0aW9uXG4gICAgICAgICAgICA6IG51bGxcbiAgICAgICAgaWYgKCF0aGlzLmxlZ2VuZCkgdGhpcy5pbml0aWFsaXNlTGVnZW5kKClcblxuICAgICAgICAvL3Rvb2x0aXBcblxuICAgICAgICAvLyBzZXQgQXBwIGNvbnRhaW5lciBhcyBkZWZhdWx0IHBhcmVudCBlbGVtZW50IGZvciB0b29sdGlwXG4gICAgICAgIGlmICghb3B0cy50b29sdGlwKSBvcHRzLnRvb2x0aXAgPSB7fVxuICAgICAgICBpZiAoIW9wdHMudG9vbHRpcC5wYXJlbnRFbGVtZW50KSBvcHRzLnRvb2x0aXAucGFyZW50RWxlbWVudCA9IHRoaXMuY29udGFpbmVyXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtUb29sdGlwfSAqL1xuICAgICAgICB0aGlzLnRvb2x0aXAgPSBuZXcgVG9vbHRpcChvcHRzLnRvb2x0aXApXG5cbiAgICAgICAgLy8gYWRkIGV2ZW50IGxpc3RlbmVycyB0byBjb250YWluZXJcbiAgICAgICAgdGhpcy5tb3VzZU92ZXJIYW5kbGVyID0gKGUpID0+IHRoaXMuZm9jdXNDZWxsKGUpXG4gICAgICAgIHRoaXMubW91c2VNb3ZlSGFuZGxlciA9IChlKSA9PiB0aGlzLmZvY3VzQ2VsbChlKVxuICAgICAgICB0aGlzLm1vdXNlT3V0SGFuZGxlciA9IChlKSA9PiB0aGlzLnRvb2x0aXAuaGlkZSgpXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCB0aGlzLm1vdXNlT3ZlckhhbmRsZXIpXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm1vdXNlTW92ZUhhbmRsZXIpXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIHRoaXMubW91c2VPdXRIYW5kbGVyKVxuXG4gICAgICAgIC8vIGxpc3RlbiBmb3IgcmVzaXplIGV2ZW50cyBvbiB0aGUgQXBwJ3MgY29udGFpbmVyIGFuZCBoYW5kbGUgdGhlbVxuICAgICAgICB0aGlzLmRlZmluZVJlc2l6ZU9ic2VydmVyKClcblxuICAgICAgICAvLyBhZGQgZXh0cmEgbG9naWMgdG8gb25ab29tU3RhcnRGdW5cbiAgICAgICAgdGhpcy5nZW9DYW52YXMub25ab29tU3RhcnRGdW4gPSAoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdHMub25ab29tU3RhcnRGdW4pIG9wdHMub25ab29tU3RhcnRGdW4oZSlcbiAgICAgICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vZm9yIG1vdXNlIG92ZXJcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtIVE1MQ2FudmFzRWxlbWVudHxudWxsfSAqL1xuICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSBudWxsXG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25SZWN0YW5nbGVDb2xvciA9IG9wdHMuc2VsZWN0aW9uUmVjdGFuZ2xlQ29sb3IgfHwgJyNGRjYzNDcnXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXggPSBvcHRzLnNlbGVjdGlvblJlY3RhbmdsZVdpZHRoUGl4IHx8ICgoKSA9PiA0KSAvLyhyLHopID0+IHt9XG5cbiAgICAgICAgLy8gdHJhbnNwYXJlbnQgYmFja2dyb3VuZCAoZS5nLiBsZWFmbGV0KSAncmVkIHBhaW50aW5nJyBmaXhcbiAgICAgICAgdGhpcy50cmFuc3BhcmVudEJhY2tncm91bmQgPSBvcHRzLnRyYW5zcGFyZW50QmFja2dyb3VuZFxuXG4gICAgICAgIC8vc2V0IGRlZmF1bHQgZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uXG4gICAgICAgIHRoaXMuZGVmYXVsdEdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9XG4gICAgICAgICAgICBvcHRzLmRlZmF1bHRHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gfHwgdGhpcy5nZW9DYW52YXMuY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAcmV0dXJucyB7SFRNTENhbnZhc0VsZW1lbnR9XG4gICAgICovXG4gICAgaW5pdGlhbGlzZUNhbnZhcygpIHtcbiAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcbiAgICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcbiAgICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJycgKyB0aGlzLmgpXG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGNhbnZhcylcbiAgICAgICAgcmV0dXJuIGNhbnZhc1xuICAgIH1cblxuICAgIGluaXRpYWxpc2VMZWdlbmQoKSB7XG4gICAgICAgIHRoaXMubGVnZW5kID0gc2VsZWN0KHRoaXMuY29udGFpbmVyKVxuICAgICAgICAgICAgLmFwcGVuZCgnZGl2JykgLy8gQ3JlYXRlIGEgbmV3IGNvbnRhaW5lclxuICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ2dyaWR2aXotbGVnZW5kJylcbiAgICAgICAgICAgIC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxuICAgICAgICAgICAgLnN0eWxlKCd3aWR0aCcsICdhdXRvJylcbiAgICAgICAgICAgIC5zdHlsZSgnaGVpZ2h0JywgJ2F1dG8nKVxuICAgICAgICAgICAgLnN0eWxlKCdiYWNrZ3JvdW5kJywgJyNGRkZGRkYnKVxuICAgICAgICAgICAgLy8uc3R5bGUoXCJwYWRkaW5nXCIsIHRoaXMucGFkZGluZylcbiAgICAgICAgICAgIC5zdHlsZSgnYm9yZGVyJywgJzBweCcpXG4gICAgICAgICAgICAvLy5zdHlsZSgnYm9yZGVyLXJhZGl1cycsICc1cHgnKVxuICAgICAgICAgICAgLnN0eWxlKCdib3gtc2hhZG93JywgJzNweCAzcHggM3B4IGdyZXksIC0zcHggLTNweCAzcHggI2RkZCcpXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtZmFtaWx5JywgJ0hlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYnKVxuICAgICAgICAgICAgLnN0eWxlKCdib3R0b20nLCAnMTVweCcpXG4gICAgICAgICAgICAuc3R5bGUoJ3JpZ2h0JywgJzE1cHgnKVxuICAgICAgICAvL2hpZGVcbiAgICAgICAgLy8uc3R5bGUoXCJ2aXNpYmlsaXR5XCIsIFwiaGlkZGVuXCIpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0L2dldCBsYXllciBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7dW5kZWZpbmVkfGltcG9ydChcIi4vTGF5ZXIuanNcIikuTGF5ZXJ8aW1wb3J0KFwiLi9MYXllci5qc1wiKS5MYXllcltdfSBsYXllcnNcbiAgICAgKiBAcmV0dXJucyB7IHRoaXMgfCBpbXBvcnQoXCIuL0xheWVyLmpzXCIpLkxheWVyW10gfVxuICAgICAqL1xuICAgIGxheWVyc18obGF5ZXJzKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5sYXllcnNcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShsYXllcnMpKSB0aGlzLmxheWVycyA9IGxheWVyc1xuICAgICAgICAgICAgZWxzZSB0aGlzLmxheWVycyA9IFtsYXllcnNdXG4gICAgICAgIGVsc2UgdGhpcy5sYXllcnMgPSBhcmd1bWVudHNcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge3RoaXN9ICovXG4gICAgcmVkcmF3KCkge1xuICAgICAgICAvL3JlbW92ZSBsZWdlbmQgZWxlbWVudHNcbiAgICAgICAgaWYgKHRoaXMubGVnZW5kKSB0aGlzLmxlZ2VuZC5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxuXG4gICAgICAgIC8vY2xlYXJcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNsZWFyKHRoaXMuZ2VvQ2FudmFzLmJhY2tncm91bmRDb2xvcilcblxuICAgICAgICBjb25zdCB6ID0gdGhpcy5nZW9DYW52YXMudmlldy56XG4gICAgICAgIHRoaXMudXBkYXRlRXh0ZW50R2VvKClcblxuICAgICAgICAvL2dvIHRocm91Z2ggdGhlIGxheWVyc1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XG4gICAgICAgICAgICAvL2NoZWNrIGlmIGxheWVyIGlzIHZpc2libGVcbiAgICAgICAgICAgIGlmIChsYXllci52aXNpYmxlICYmICFsYXllci52aXNpYmxlKHopKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3NldCBsYXllciBhbHBoYSBhbmQgYmxlbmQgbW9kZVxuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMub2Zmc2NyZWVuQ3R4Lmdsb2JhbEFscGhhID0gbGF5ZXIuYWxwaGEgPyBsYXllci5hbHBoYSh6KSA6IDEuMFxuICAgICAgICAgICAgaWYgKGxheWVyLmJsZW5kT3BlcmF0aW9uKSB0aGlzLmdlb0NhbnZhcy5vZmZzY3JlZW5DdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gbGF5ZXIuYmxlbmRPcGVyYXRpb24oeilcblxuICAgICAgICAgICAgLy9zZXQgYWZmaW4gdHJhbnNmb3JtIHRvIGRyYXcgd2l0aCBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXNcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLnNldENhbnZhc1RyYW5zZm9ybSgpXG5cbiAgICAgICAgICAgIC8vZHJhdyBsYXllclxuICAgICAgICAgICAgbGF5ZXIuZHJhdyh0aGlzLmdlb0NhbnZhcywgdGhpcy5sZWdlbmQpXG5cbiAgICAgICAgICAgIC8vZHJhdyBsYXllciBmaWx0ZXJcbiAgICAgICAgICAgIGlmIChsYXllci5maWx0ZXJDb2xvcikgbGF5ZXIuZHJhd0ZpbHRlcih0aGlzLmdlb0NhbnZhcylcblxuICAgICAgICAgICAgLy9yZXN0b3JlIGRlZmF1bHQgYWxwaGEgYW5kIGJsZW5kIG9wZXJhdGlvblxuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMub2Zmc2NyZWVuQ3R4Lmdsb2JhbEFscGhhID0gMS4wXG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5vZmZzY3JlZW5DdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gdGhpcy5kZWZhdWx0R2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uXG4gICAgICAgIH1cblxuICAgICAgICAvLyBvbmUgZHJhd0ltYWdlIGNhbGw6IGRyYXcgdGhlIG9mZnNjcmVlbiBjYW52YXMgdG8gdGhlIG1haW4gY2FudmFzXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuICAgICAgICB0aGlzLmdlb0NhbnZhcy5jdHguZHJhd0ltYWdlKHRoaXMuZ2VvQ2FudmFzLm9mZnNjcmVlbkNhbnZhcywgMCwgMClcblxuICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSBudWxsXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWFyZ2luUHhcbiAgICAgKiBAcmV0dXJucyB7aW1wb3J0KCcuL0dlb0NhbnZhcy5qcycpLkVudmVsb3BlfVxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICB1cGRhdGVFeHRlbnRHZW8obWFyZ2luUHggPSAyMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW9DYW52YXMudXBkYXRlRXh0ZW50R2VvKG1hcmdpblB4KVxuICAgIH1cblxuICAgIC8qKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUgKi9cbiAgICBmb2N1c0NlbGwoZSkge1xuICAgICAgICAvL2NvbXB1dGUgbW91c2UgZ2VvIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IG1vdXNlUG9zaXRpb25HZW8gPSB7XG4gICAgICAgICAgICB4OiB0aGlzLmdlb0NhbnZhcy5waXhUb0dlb1goZS5vZmZzZXRYICsgdGhpcy50b29sdGlwLnhNb3VzZU9mZnNldCksXG4gICAgICAgICAgICB5OiB0aGlzLmdlb0NhbnZhcy5waXhUb0dlb1koZS5vZmZzZXRZICsgdGhpcy50b29sdGlwLnlNb3VzZU9mZnNldCksXG4gICAgICAgIH1cbiAgICAgICAgLyoqIEB0eXBlIHt7Y2VsbDppbXBvcnQoJy4vRGF0YXNldC5qcycpLkNlbGwsaHRtbDpzdHJpbmcscmVzb2x1dGlvbjpudW1iZXJ9IHwgdW5kZWZpbmVkfSAqL1xuICAgICAgICBjb25zdCBmb2N1cyA9IHRoaXMuZ2V0Q2VsbEZvY3VzSW5mbyhtb3VzZVBvc2l0aW9uR2VvKVxuXG4gICAgICAgIC8vIHRyYW5zcGFyZW50IGJhY2tncm91bmQgKGUuZy4gbGVhZmxldCkgJ3JlZCBwYWludGluZycgZml4XG4gICAgICAgIGlmICh0aGlzLnRyYW5zcGFyZW50QmFja2dyb3VuZCkge1xuICAgICAgICAgICAgaWYgKGZvY3VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLmh0bWwoZm9jdXMuaHRtbClcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuc2V0UG9zaXRpb24oZSlcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuc2hvdygpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcnICsgdGhpcy53KVxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJycgKyB0aGlzLmgpXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZ2V0Q29udGV4dCgnMmQnKT8uZHJhd0ltYWdlKHRoaXMuZ2VvQ2FudmFzLmNhbnZhcywgMCwgMClcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZm9jdXMpIHtcbiAgICAgICAgICAgIHRoaXMudG9vbHRpcC5odG1sKGZvY3VzLmh0bWwpXG4gICAgICAgICAgICB0aGlzLnRvb2x0aXAuc2V0UG9zaXRpb24oZSlcbiAgICAgICAgICAgIHRoaXMudG9vbHRpcC5zaG93KClcblxuICAgICAgICAgICAgLy9zaG93IGNlbGwgcG9zaXRpb24gYXMgYSByZWN0YW5nbGVcbiAgICAgICAgICAgIGlmICghdGhpcy5jYW52YXNTYXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcnICsgdGhpcy53KVxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5nZXRDb250ZXh0KCcyZCcpPy5kcmF3SW1hZ2UodGhpcy5nZW9DYW52YXMub2Zmc2NyZWVuQ2FudmFzLCAwLCAwKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5vZmZzY3JlZW5DdHguZHJhd0ltYWdlKHRoaXMuY2FudmFzU2F2ZSwgMCwgMClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9kcmF3IGltYWdlIHNhdmVkICsgZHJhdyByZWN0YW5nbGVcbiAgICAgICAgICAgIGNvbnN0IHJlY3RXUGl4ID0gdGhpcy5zZWxlY3Rpb25SZWN0YW5nbGVXaWR0aFBpeFxuICAgICAgICAgICAgICAgID8gdGhpcy5zZWxlY3Rpb25SZWN0YW5nbGVXaWR0aFBpeChmb2N1cy5yZXNvbHV0aW9uLCB0aGlzLmdlb0NhbnZhcy52aWV3LnopXG4gICAgICAgICAgICAgICAgOiA0XG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5zZWxlY3Rpb25SZWN0YW5nbGVDb2xvclxuICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHJlY3RXUGl4XG4gICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcblxuICAgICAgICAgICAgY3R4LnJlY3QoXG4gICAgICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuZ2VvVG9QaXhYKGZvY3VzLmNlbGwueCkgLSByZWN0V1BpeCAvIDIsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuZ2VvVG9QaXhZKGZvY3VzLmNlbGwueSkgKyByZWN0V1BpeCAvIDIsXG4gICAgICAgICAgICAgICAgZm9jdXMucmVzb2x1dGlvbiAvIHRoaXMuZ2VvQ2FudmFzLnZpZXcueiArIHJlY3RXUGl4LFxuICAgICAgICAgICAgICAgIC1mb2N1cy5yZXNvbHV0aW9uIC8gdGhpcy5nZW9DYW52YXMudmlldy56IC0gcmVjdFdQaXhcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuY3R4LmRyYXdJbWFnZSh0aGlzLmdlb0NhbnZhcy5vZmZzY3JlZW5DYW52YXMsIDAsIDApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpXG4gICAgICAgICAgICBpZiAodGhpcy5jYW52YXNTYXZlKSB0aGlzLmdlb0NhbnZhcy5jdHguZHJhd0ltYWdlKHRoaXMuY2FudmFzU2F2ZSwgMCwgMClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgY2VsbCBIVE1MIGluZm8gYXQgYSBnaXZlbiBnZW8gcG9zaXRpb24uXG4gICAgICogVGhpcyBpcyB1c2VmdWxsIGZvciB1c2VyIGludGVyYWN0aW9ucywgdG8gc2hvdyB0aGlzIGluZm8gd2hlcmUgdGhlIHVzZXIgY2xpY2tzIGZvciBleGFtcGxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHt7eDpudW1iZXIseTpudW1iZXJ9fSBwb3NHZW9cbiAgICAgKiBAcmV0dXJucyB7e2NlbGw6aW1wb3J0KCcuL0RhdGFzZXQuanMnKS5DZWxsLGh0bWw6c3RyaW5nLHJlc29sdXRpb246bnVtYmVyfSB8IHVuZGVmaW5lZH1cbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgZ2V0Q2VsbEZvY3VzSW5mbyhwb3NHZW8pIHtcbiAgICAgICAgLy9nbyB0aHJvdWdoIHRoZSBsYXllcnMsIHN0YXJ0aW5nIGZyb20gdG9wXG4gICAgICAgIGNvbnN0IHogPSB0aGlzLmdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMubGF5ZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vTGF5ZXIuanNcIikuTGF5ZXJ9ICovXG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMubGF5ZXJzW2ldXG4gICAgICAgICAgICBpZiAobGF5ZXIudmlzaWJsZSAmJiAhbGF5ZXIudmlzaWJsZSh6KSkgY29udGludWVcbiAgICAgICAgICAgIGlmIChsYXllci5jZWxsSW5mb0hUTUwgPT09ICdub25lJykgY29udGludWUgLy8gdGhpcyBpcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gbm90IHNob3cgdG9vbHRpcHMgZm9yIGxheWVycyAnb24gdG9wJyAoZS5nLiBwb3B1bGF0aW9uIGNpcmNsZXMgb24gdG9wIG9mIHNxdWFyZXMpXG4gICAgICAgICAgICBpZiAoIWxheWVyLmNlbGxJbmZvSFRNTCkgY29udGludWVcbiAgICAgICAgICAgIGlmICghbGF5ZXIuZ2V0RGF0YXNldCkgY29udGludWVcbiAgICAgICAgICAgIGNvbnN0IGRzYyA9IGxheWVyLmdldERhdGFzZXQoeilcbiAgICAgICAgICAgIGlmICghZHNjKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2dldCBjZWxsIGF0IG1vdXNlIHBvc2l0aW9uXG4gICAgICAgICAgICAvKiogQHR5cGUge2ltcG9ydCgnLi9EYXRhc2V0LmpzJykuQ2VsbHx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBjZWxsID0gZHNjLmdldENlbGxGcm9tUG9zaXRpb24ocG9zR2VvLCBkc2MuZ2V0Vmlld0NhY2hlKCkpXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKGNlbGwsIGRzYy5yZXNvbHV0aW9uKVxuICAgICAgICAgICAgaWYgKCFjZWxsKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICAgICAgICAgIC8vcmFyZSBjYXNlIGZvciBhIGRhdGFzZXQgd2l0aCBtaXhlZCByZXNvbHV0aW9uc1xuICAgICAgICAgICAgaWYgKGRzYy5taXhlZFJlc29sdXRpb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCByID0gK2RzYy5taXhlZFJlc29sdXRpb24oY2VsbClcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gbGF5ZXIuY2VsbEluZm9IVE1MKGNlbGwsIHIpXG4gICAgICAgICAgICAgICAgaWYgKCFodG1sKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgY2VsbDogY2VsbCwgaHRtbDogaHRtbCwgcmVzb2x1dGlvbjogciB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBsYXllci5jZWxsSW5mb0hUTUwoY2VsbCwgZHNjLmdldFJlc29sdXRpb24oKSlcbiAgICAgICAgICAgIGlmICghaHRtbCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgICAgcmV0dXJuIHsgY2VsbDogY2VsbCwgaHRtbDogaHRtbCwgcmVzb2x1dGlvbjogZHNjLmdldFJlc29sdXRpb24oKSB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gICAgICogQHBhcmFtIHtudW1iZXJ8dW5kZWZpbmVkfSB6XG4gICAgICovXG4gICAgc2V0Vmlldyh4LCB5LCB6ID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLnZpZXcueCA9IHhcbiAgICAgICAgdGhpcy5nZW9DYW52YXMudmlldy55ID0geVxuICAgICAgICBpZiAoeiAhPSB1bmRlZmluZWQpIHRoaXMuZ2VvQ2FudmFzLnZpZXcueiA9IHpcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge2ltcG9ydCgnLi9HZW9DYW52YXMuanMnKS5WaWV3fSAqL1xuICAgIGdldFZpZXcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb0NhbnZhcy52aWV3XG4gICAgfVxuXG4gICAgLyoqIEByZXR1cm5zIHtudW1iZXJ9ICovXG4gICAgZ2V0Wm9vbSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VvQ2FudmFzLnZpZXcuelxuICAgIH1cbiAgICAvKiogQHBhcmFtIHtudW1iZXJ9IHogQHJldHVybnMge3RoaXN9ICovXG4gICAgc2V0Wm9vbSh6KSB7XG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLnZpZXcueiA9IHpcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge0FycmF5LjxudW1iZXJ8dW5kZWZpbmVkPn0gKi9cbiAgICBnZXRDZW50ZXJFeHRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb0NhbnZhcy5nZXRDZW50ZXJFeHRlbnQoKVxuICAgIH1cbiAgICAvKiogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gdmFsIEByZXR1cm5zIHt0aGlzfSAqL1xuICAgIHNldENlbnRlckV4dGVudCh2YWwpIHtcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuc2V0Q2VudGVyRXh0ZW50KHZhbClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge0FycmF5LjxudW1iZXI+fSAqL1xuICAgIGdldFpvb21FeHRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb0NhbnZhcy5nZXRab29tRXh0ZW50KClcbiAgICB9XG4gICAgLyoqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHZhbCBAcmV0dXJucyB7dGhpc30gKi9cbiAgICBzZXRab29tRXh0ZW50KHZhbCkge1xuICAgICAgICB0aGlzLmdlb0NhbnZhcy5zZXRab29tRXh0ZW50KHZhbClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgICBnZXRCYWNrZ3JvdW5kQ29sb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb0NhbnZhcy5iYWNrZ3JvdW5kQ29sb3JcbiAgICB9XG4gICAgLyoqIEBwYXJhbSB7c3RyaW5nfSB2YWwgQHJldHVybnMge3RoaXN9ICovXG4gICAgc2V0QmFja2dyb3VuZENvbG9yKHZhbCkge1xuICAgICAgICB0aGlzLmdlb0NhbnZhcy5iYWNrZ3JvdW5kQ29sb3IgPSB2YWxcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgc2V0IG9mIHpvb20gYnV0dG9ucyB0byB0aGUgbWFwXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIGFkZFpvb21CdXR0b25zKG9wdHMpIHtcbiAgICAgICAgLy8gKiBvcHRzLmlkXG4gICAgICAgIC8vICogb3B0cy5vblpvb20gLSBjdXN0b20gZXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICAvLyAqIG9wdHMueFxuICAgICAgICAvLyAqIG9wdHMueVxuICAgICAgICAvLyAqIG9wdHMuZGVsdGEgLSB6b29tIGRlbHRhIGFwcGxpZWQgb24gZWFjaCBjbGlja1xuXG4gICAgICAgIHRoaXMuem9vbUJ1dHRvbnMgPSBuZXcgWm9vbUJ1dHRvbnMoe1xuICAgICAgICAgICAgbWFwOiB0aGlzLFxuICAgICAgICAgICAgaWQ6IG9wdHM/LmlkIHx8ICdncmlkdml6LXpvb20tYnV0dG9ucy0nICsgdGhpcy5jb250YWluZXIuaWQsXG4gICAgICAgICAgICBjbGFzczogb3B0cz8uY2xhc3MsXG4gICAgICAgICAgICB4OiBvcHRzPy54LFxuICAgICAgICAgICAgeTogb3B0cz8ueSxcbiAgICAgICAgICAgIG9uWm9vbTogb3B0cz8ub25ab29tLFxuICAgICAgICAgICAgZGVsdGE6IG9wdHM/LmRlbHRhIHx8IDAuMixcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBmdWxsc2NyZWVuIHRvZ2dsZSBidXR0b24gdG8gdGhlIGFwcFxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICAgKi9cbiAgICBhZGRGdWxsc2NyZWVuQnV0dG9uKG9wdHMpIHtcbiAgICAgICAgLy8gKiBvcHRzLm1hcCAtIHRoZSBncmlkdml6IG1hcFxuICAgICAgICAvLyAqIG9wdHMuaWRcbiAgICAgICAgLy8gKiBvcHRzLnhcbiAgICAgICAgLy8gKiBvcHRzLnlcblxuICAgICAgICB0aGlzLmZ1bGxzY3JlZW5CdXR0b24gPSBuZXcgRnVsbHNjcmVlbkJ1dHRvbih7XG4gICAgICAgICAgICBtYXA6IHRoaXMsXG4gICAgICAgICAgICBpZDogb3B0cz8uaWQgfHwgJ2dyaWR2aXotZnVsbHNjcmVlbi1idXR0b24nLFxuICAgICAgICAgICAgY2xhc3M6IG9wdHM/LmNsYXNzLFxuICAgICAgICAgICAgeDogb3B0cz8ueCxcbiAgICAgICAgICAgIHk6IG9wdHM/LnksXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge3RoaXN9ICovXG4gICAgc2V0Vmlld0Zyb21VUkwoKSB7XG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLnNldFZpZXdGcm9tVVJMKClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQWRkIGEgcmVzaXplIGV2ZW50IG9ic2VydmVyIHRvIHRoZSBBcHBzIGNvbnRhaW5lciBhbmQgdXBkYXRlIHRoZSBjYW52YXMgYWNjb3JkaW5nbHlcbiAgICAgKiBAbWVtYmVyb2YgQXBwXG4gICAgICovXG4gICAgZGVmaW5lUmVzaXplT2JzZXJ2ZXIoKSB7XG4gICAgICAgIC8vIFRyYWNrIHdoZXRoZXIgdGhlIG9ic2VydmVyIGlzIGN1cnJlbnRseSBwcm9jZXNzaW5nIGEgcmVzaXplIGV2ZW50XG4gICAgICAgIGxldCByZXNpemVQZW5kaW5nID0gZmFsc2VcblxuICAgICAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGVudHJpZXMpIHx8ICFlbnRyaWVzLmxlbmd0aCkgcmV0dXJuXG5cbiAgICAgICAgICAgIGxldCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lclxuXG4gICAgICAgICAgICAvLyBFbnN1cmUgdGhlIGNvbnRhaW5lciBoYXMgdmFsaWQgZGltZW5zaW9uc1xuICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5jbGllbnRXaWR0aCA+IDAgJiYgY29udGFpbmVyLmNsaWVudEhlaWdodCA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc2l6ZVBlbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzaXplUGVuZGluZyA9IHRydWUgLy8gUHJldmVudCBvdmVybGFwcGluZyByZXNpemUgdHJpZ2dlcnNcblxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZVBlbmRpbmcgPSBmYWxzZSAvLyBSZXNldCB0aGUgZmxhZyBhZnRlciBwcm9jZXNzaW5nXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBzaXplIGNoYW5nZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmggIT09IGNvbnRhaW5lci5jbGllbnRIZWlnaHQgfHwgdGhpcy53ICE9PSBjb250YWluZXIuY2xpZW50V2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmggPSBjb250YWluZXIuY2xpZW50SGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53ID0gY29udGFpbmVyLmNsaWVudFdpZHRoXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZ2VvQ2FudmFzIHNpemVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuaCA9IHRoaXMuaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLncgPSB0aGlzLndcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5jYW52YXMuc2V0QXR0cmlidXRlKCd3aWR0aCcsIFN0cmluZyh0aGlzLncpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIFN0cmluZyh0aGlzLmgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLm9mZnNjcmVlbkNhbnZhcy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgU3RyaW5nKHRoaXMudykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMub2Zmc2NyZWVuQ2FudmFzLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgU3RyaW5nKHRoaXMuaCkpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZHJhdygpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPcHRpb25hbGx5IHJlcG9zaXRpb24gVUkgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAodGhpcy56b29tQnV0dG9ucykgdGhpcy56b29tQnV0dG9ucy5ub2RlLnN0eWxlLmxlZnQgPSB0aGlzLncgLSA1MCArICdweCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHRoaXMuZnVsbHNjcmVlbkJ1dHRvbikgdGhpcy5mdWxsc2NyZWVuQnV0dG9uLm5vZGUuc3R5bGUubGVmdCA9IHRoaXMudyAtIDUwICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmNvbnRhaW5lcilcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gRGVzdHJveSB0aGUgbWFwIGFuZCBpdCdzIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqIFRoaXMgc2hvdWxkIHNpZ25pZmljYW50bHkgcmVkdWNlIHRoZSBtZW1vcnkgdXNlZCB3aGVuIGNyZWF0aW5nIGFuZCBkZXN0cm95aW5nIGdyaWR2aXogbWFwIGluc3RhbmNlcyAoZm9yIGV4YW1wbGUgaW4gbGVhZmxldC1ncmlkdml6KVxuICAgICAqIEBtZW1iZXJvZiBBcHBcbiAgICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgICAvLyBjbGVhciBsYXllcnNcbiAgICAgICAgdGhpcy5sYXllcnMgPSBbXVxuICAgICAgICB0aGlzLmJnTGF5ZXJzID0gW11cblxuICAgICAgICAvLyByZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gY29udGFpbmVyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIHRoaXMubW91c2VPdmVySGFuZGxlcilcbiAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5tb3VzZU1vdmVIYW5kbGVyKVxuICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIHRoaXMubW91c2VPdXRIYW5kbGVyKVxuXG4gICAgICAgIC8vIHJlbW92ZSBjYW52YXNcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuY2FudmFzLnJlbW92ZSgpXG5cbiAgICAgICAgLy8gcmVtb3ZlIGxlZ2VuZFxuICAgICAgICB0aGlzLmxlZ2VuZD8ucmVtb3ZlKClcblxuICAgICAgICAvLyByZW1vdmUgdG9vbHRpcFxuICAgICAgICB0aGlzLnRvb2x0aXAudG9vbHRpcD8ucmVtb3ZlKClcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogQSBtdWx0aSByZXNvbHV0aW9uIGRhdGFzZXQgb2YgZ3JpZCBjZWxscy5cbiAqIEl0IGNvbnNpc3RzIG9mIGRpZmZlcmVudCB7QGxpbmsgRGF0YXNldH1zIGZvciBlYWNoIHJlc29sdXRpb24uXG4gKlxuICogQGFic3RyYWN0XG4gKlxuICogQG1vZHVsZSBjb3JlXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBNdWx0aVJlc29sdXRpb25EYXRhc2V0IHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSByZXNvbHV0aW9ucyBUaGUgcmVzb2x1dGlvbnMgb2YgdGhlIGRhdGFzZXRzLCBpbiBDUlMgZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkRhdGFzZXQ+fGZ1bmN0aW9uKG51bWJlcik6aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkRhdGFzZXR9IGRhdGFzZXRzIFRoZSBkYXRhc2V0cyBsaXN0LCBvbmUgcGVyIHJlc29sdXRpb24uIE9yIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgZGF0YXNldCBmcm9tIGEgcmVzb2x1dGlvbiB2YWx1ZS5cbiAgICAgKiBAcGFyYW0geyB7cHJlcHJvY2Vzcz86ZnVuY3Rpb24oaW1wb3J0KFwiLi9EYXRhc2V0XCIpLkNlbGwpOmJvb2xlYW59IH0gb3B0cyBPcHRpb25zLiBwcmVwcm9jZXNzOiBBIGZ1bmN0aW9uIHRvIGFwcGx5IG9uIGVhY2ggZGF0YXNldCBjZWxsIHRvIHByZXBhcmUgaXRzIHZhbHVlcy4gQ2FuIGJlIHVzZWQgYWxzbyB0byBzZWxlY3QgY2VsbHMgdG8ga2VlcC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihyZXNvbHV0aW9ucywgZGF0YXNldHMsIG9wdHMgPSB7fSkge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBUaGUgcmVzb2x1dGlvbnMgb2YgdGhlIGRhdGFzZXRzLCBpbiBDUlMgZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cbiAgICAgICAgdGhpcy5yZXNvbHV0aW9ucyA9IHJlc29sdXRpb25zXG5cbiAgICAgICAgLyoqIFRoZSBkYXRhc2V0cy4gSWYgdGhlIGxpc3QgaXMgbm90IGV4cGxpY3RlbHkgZGVmaW5lZCwgYnVpbGQgaXQgZnJvbSB0aGUgcmVzb2x1dGlvbiBsaXN0IHdpdGggdGhlIGZ1bmN0aW9uXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkRhdGFzZXQ+fSAqL1xuICAgICAgICB0aGlzLmRhdGFzZXRzID0gdHlwZW9mIGRhdGFzZXRzID09PSAnZnVuY3Rpb24nID8gdGhpcy5yZXNvbHV0aW9ucy5tYXAoZGF0YXNldHMpIDogZGF0YXNldHNcblxuICAgICAgICAvL3RoZXJlIG11c3QgYmUgYXMgbWFueSBkYXRhc2V0cyBhcyByZXNvbHV0aW9uc1xuICAgICAgICBpZiAodGhpcy5kYXRhc2V0cy5sZW5ndGggPiAxICYmIHRoaXMuZGF0YXNldHMubGVuZ3RoICE9IHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICdVbmNvbXBhdGlibGUgbnVtYmVyIG9mIGRhdGFzZXRzIGFuZCByZXNvbHV0aW9uczogJyArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNldHMubGVuZ3RoICtcbiAgICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvbHV0aW9ucy5sZW5ndGhcbiAgICAgICAgICAgIClcblxuICAgICAgICAvL3NldCBkYXRhc2V0IHByZXByb2Nlc3NlcyBpZiBzcGVjaWZpZWRcbiAgICAgICAgaWYgKG9wdHMucHJlcHJvY2VzcykgdGhpcy5zZXRQcmVwb2Nlc3NlcyhvcHRzLnByZXByb2Nlc3MpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSByZWxldmFudCBkYXRhc2V0IGZvciBhIHNwZWNpZmllZCB6b29tLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pblBpeGVsc1BlckNlbGxcbiAgICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkRhdGFzZXR8dW5kZWZpbmVkfVxuICAgICAqICovXG4gICAgZ2V0RGF0YXNldCh6LCBtaW5QaXhlbHNQZXJDZWxsKSB7XG4gICAgICAgIC8vc3BlY2lhbCBjYXNlIHdoaXRoIHNpbmdsZSBkYXRhc2V0XG4gICAgICAgIGlmICh0aGlzLmRhdGFzZXRzLmxlbmd0aCA9PSAxKSByZXR1cm4gdGhpcy5kYXRhc2V0c1swXVxuXG4gICAgICAgIGNvbnN0IHJzID0gdGhpcy5yZXNvbHV0aW9uc1xuICAgICAgICBsZXQgaSA9IDBcbiAgICAgICAgbGV0IHpfID0gcnNbaV0gLyBtaW5QaXhlbHNQZXJDZWxsXG4gICAgICAgIHdoaWxlICh6XyA8IHogJiYgaSA8IHJzLmxlbmd0aCkge1xuICAgICAgICAgICAgaSsrXG4gICAgICAgICAgICB6XyA9IHJzW2ldIC8gbWluUGl4ZWxzUGVyQ2VsbFxuICAgICAgICB9XG4gICAgICAgIC8vaWYgKGkgPT0gMCkgcmV0dXJuIHRoaXMuZGF0YXNldC5kYXRhc2V0c1swXTtcbiAgICAgICAgLy9yZXR1cm4gdGhpcy5kYXRhc2V0LmRhdGFzZXRzW2kgLSAxXTtcbiAgICAgICAgaWYgKGkgPT0gcnMubGVuZ3RoKSByZXR1cm4gdGhpcy5kYXRhc2V0c1tycy5sZW5ndGggLSAxXVxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhc2V0c1tpXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBhIHByZXByb2Nlc3MgZnVuY3Rpb24gZm9yIGFsbCBkYXRhc2V0cy5cbiAgICAgKiBUaGlzIGlzIGEgZnVuY3Rpb24gYXBwbGllZCBvbiBlYWNoIGNlbGwgYWZ0ZXIgaXQgaGFzIGJlZW4gbG9hZGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihpbXBvcnQoXCIuL0RhdGFzZXRcIikuQ2VsbCk6Ym9vbGVhbn0gcHJlcHJvY2Vzc1xuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIHNldFByZXBvY2Vzc2VzKHByZXByb2Nlc3MpIHtcbiAgICAgICAgZm9yIChsZXQgZHMgb2YgdGhpcy5kYXRhc2V0cykgZHMucHJlcHJvY2VzcyA9IHByZXByb2Nlc3NcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGZ1bmN0aW9uIHRvIGVhc2UgdGhlIGNyZWF0aW9uIG9mIG11bHRpIHJlc29sdXRpb24gZGF0YXNldHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSByZXNvbHV0aW9ucyBUaGUgcmVzb2x1dGlvbnMgb2YgdGhlIGRhdGFzZXRzLCBpbiBDUlMgZ2VvZ3JhcGhpY2FsIHVuaXRcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkRhdGFzZXR9IHJlc1RvRGF0YXNldCBGdW5jdGlvbiByZXR1cm5pbmcgYSBkYXRhc2V0IGZyb20gYSByZXNvbHV0aW9uXG4gICAgICogQHBhcmFtIHsge3ByZXByb2Nlc3M/OmZ1bmN0aW9uKGltcG9ydChcIi4vRGF0YXNldFwiKS5DZWxsKTpib29sZWFufSB9IG9wdHMgT3B0aW9ucy4gcHJlcHJvY2VzczogQSBmdW5jdGlvbiB0byBhcHBseSBvbiBlYWNoIGRhdGFzZXQgY2VsbCB0byBwcmVwYXJlIGl0cyB2YWx1ZXNcbiAgICAgKiBAcmV0dXJucyB7TXVsdGlSZXNvbHV0aW9uRGF0YXNldH1cbiAgICAgKi9cbiAgICAvKnN0YXRpYyBtYWtlKHJlc29sdXRpb25zLCByZXNUb0RhdGFzZXQsIG9wdHMpIHtcbiAgICAgICAgLy9tYWtlIGRhdGFzZXRzXG4gICAgICAgIGNvbnN0IGRzYyA9IFtdXG4gICAgICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc29sdXRpb25zKSBkc2MucHVzaChyZXNUb0RhdGFzZXQocmVzKSlcbiAgICAgICAgLy9tYWtlIG11bHRpIHJlc29sdXRpb24gZGF0YXNldFxuICAgICAgICByZXR1cm4gbmV3IE11bHRpUmVzb2x1dGlvbkRhdGFzZXQoZHNjLCByZXNvbHV0aW9ucywgb3B0cylcbiAgICB9Ki9cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgRHJhd2FibGUgfSBmcm9tICcuL0RyYXdhYmxlLmpzJ1xuXG4vKiogQHR5cGVkZWYge1wic3F1YXJlXCJ8XCJjaXJjbGVcInxcImRpYW1vbmRcInxcImRvbnV0XCJ8XCJ0cmlhbmdsZV91cFwifFwidHJpYW5nbGVfZG93blwifFwidHJpYW5nbGVfbGVmdFwifFwidHJpYW5nbGVfcmlnaHRcInxcIm5vbmVcIn0gU2hhcGUgKi9cblxuLyoqXG4gKiB2aWV3U2NhbGUgdHlwZVxuICogUmV0dXJucyBhbiBvYmplY3QgZnJvbSBhIGxpc3Qgb2YgY2VsbHMsXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oQXJyYXkuPGltcG9ydCgnLi9EYXRhc2V0LmpzJykuQ2VsbD4sbnVtYmVyLCBudW1iZXIpOip9IFZpZXdTY2FsZSAqL1xuXG4vKipcbiAqIEEgc3R5bGUsIHRvIHNob3cgYSBncmlkIGRhdGFzZXQuXG4gKlxuICogQG1vZHVsZSBjb3JlXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHlsZSBleHRlbmRzIERyYXdhYmxlIHtcbiAgICAvKipcbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKiBAcGFyYW0ge3tmaWx0ZXI/OmZ1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6Ym9vbGVhbiwgb2Zmc2V0PzpmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsIG51bWJlciwgbnVtYmVyKTp7ZHg6bnVtYmVyLGR5Om51bWJlcn0sIHZpc2libGU/OmZ1bmN0aW9uKG51bWJlcik6Ym9vbGVhbixhbHBoYT86ZnVuY3Rpb24obnVtYmVyKTpudW1iZXIsYmxlbmRPcGVyYXRpb24/OmZ1bmN0aW9uKG51bWJlcik6R2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uLGRyYXdGdW4/OmZ1bmN0aW9uLHZpZXdTY2FsZT86Vmlld1NjYWxlfX0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge1ZpZXdTY2FsZXx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMudmlld1NjYWxlID0gb3B0cy52aWV3U2NhbGVcblxuICAgICAgICAvKiogQSBmaWx0ZXIgZnVuY3Rpb24gdG8gYXBwbHkgdG8gdGhlIGNlbGwgbGlzdCwgdG8gZmlsdGVyIG91dCBzb21lIGNlbGxzIG5vdCB0byBiZSBkcmF3biAoc3VjaCBhcyBmb3IgZXhhbXBsZSB0aGUgY2VsbHMgd2l0aCB2YWx1ZT0wKS5cbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKiBAdHlwZSB7KGZ1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6Ym9vbGVhbikgfCB1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMuZmlsdGVyID0gb3B0cy5maWx0ZXIgfHwgdW5kZWZpbmVkXG5cbiAgICAgICAgLyoqIEFuIG9mZnNldC4gVGhpcyBpcyB0byBhbHRlciB0aGUgcG9zaXRpb24gb2YgYWxsIHN5bWJvbHMgaW4gYSBnaXZlbiBkaXJlY3Rpb24uIEluIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsbnVtYmVyLG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9fSAqL1xuICAgICAgICB0aGlzLm9mZnNldCA9IG9wdHMub2Zmc2V0IHx8ICgoYywgciwgeikgPT4gKHsgZHg6IDAsIGR5OiAwIH0pKVxuXG4gICAgICAgIC8qKiBBIGRyYXcgZnVuY3Rpb24gZm9yIHRoZSBzdHlsZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9ufHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy5kcmF3RnVuID0gb3B0cy5kcmF3RnVuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwdWJsaWNcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuL0xlZ2VuZFwiKS5MZWdlbmQ+fSAqL1xuICAgICAgICB0aGlzLmxlZ2VuZHMgPSBbXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGw+fSBjZWxscyBUaGUgY2VsbHMgdG8gZHJhdy5cbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGVtLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZWlyIHJlc29sdXRpb24gKGluIGdlb2dyYXBoaWMgdW5pdClcbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcbiAgICAgICAgaWYgKHRoaXMuZHJhd0Z1bikgdGhpcy5kcmF3RnVuKGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pXG4gICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgZHJhdyBub3QgaW1wbGVtZW50ZWQuJylcbiAgICB9XG5cbiAgICAvL2dldHRlcnMgYW5kIHNldHRlcnNcblxuICAgIC8qKiBAcmV0dXJucyB7ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsLG51bWJlcixudW1iZXIpOntkeDpudW1iZXIsZHk6bnVtYmVyfX0gKi9cbiAgICBnZXRPZmZzZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9mZnNldFxuICAgIH1cbiAgICAvKiogQHBhcmFtIHtmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsbnVtYmVyLG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9fSB2YWwgQHJldHVybnMge3RoaXN9ICovXG4gICAgc2V0T2Zmc2V0KHZhbCkge1xuICAgICAgICB0aGlzLm9mZnNldCA9IHZhbFxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKiBVcGRhdGUgbGVnZW5kcyBvZiB0aGUgc3R5bGUsIGlmIGFueVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICogQHJldHVybnMge3RoaXN9ICovXG4gICAgdXBkYXRlTGVnZW5kcyhvcHRzKSB7XG4gICAgICAgIFN0eWxlLnVwZGF0ZUxlZ2VuZHNSZWN1cnNpdmUodGhpcy5sZWdlbmRzLCBvcHRzKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIHN0YXRpYyB1cGRhdGVMZWdlbmRzUmVjdXJzaXZlKGxnLCBvcHRzKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxnKSkgZm9yIChjb25zdCBsZ18gb2YgbGcpIHRoaXMudXBkYXRlTGVnZW5kc1JlY3Vyc2l2ZShsZ18sIG9wdHMpXG4gICAgICAgIGVsc2UgbGcudXBkYXRlKG9wdHMpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi9MZWdlbmRcIikuTGVnZW5kPn0gbGVnZW5kc1xuICAgICAqIEByZXR1cm5zIHt0aGlzfSAqL1xuICAgIGFkZExlZ2VuZHMobGVnZW5kcykge1xuICAgICAgICBmb3IgKGxldCBsZWdlbmQgb2YgbGVnZW5kcykgdGhpcy5sZWdlbmRzLnB1c2gobGVnZW5kKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJ1xuLy9pbXBvcnQgeyB0cmFuc2l0aW9uIH0gZnJvbSBcImQzLXRyYW5zaXRpb25cIjtcblxuLyoqXG4gKiBBIGdlbmVyaWMgY2xhc3MgdG8gbWFrZSBhIHRvb2x0aXAuXG4gKiBJdCBpcyBhIGRpdiBlbGVtZW50LCB3aGljaCBjYW4gYmUgbW92ZWQgdW5kZXIgdGhlIG1vdXNlIHBvaW50ZXIgYW5kIGZpbGxlZCB3aXRoIHNvbWUgaW5mb3JtYXRpb24gaW4gaHRtbC5cbiAqIEBtb2R1bGUgY29yZVxuICovXG5leHBvcnQgY2xhc3MgVG9vbHRpcCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMubWF4V2lkdGggPSBvcHRzLm1heFdpZHRoIHx8ICcyMGVtJ1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5mb250U2l6ZSA9IG9wdHMuZm9udFNpemUgfHwgJzEuMmVtJ1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kID0gb3B0cy5iYWNrZ3JvdW5kIHx8ICd3aGl0ZSdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMucGFkZGluZyA9IG9wdHMucGFkZGluZyB8fCAnNXB4J1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5ib3JkZXIgPSBvcHRzLmJvcmRlciB8fCAnMHB4J1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpc1snYm9yZGVyLXJhZGl1cyddID0gb3B0c1snYm9yZGVyLXJhZGl1cyddIHx8ICcwcHgnXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzWydib3gtc2hhZG93J10gPSBvcHRzWydib3gtc2hhZG93J10gfHwgJzVweCA1cHggNXB4IGdyZXknXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzWydmb250LWZhbWlseSddID0gb3B0c1snZm9udC1mYW1pbHknXSB8fCAnSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZidcblxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy50cmFuc2l0aW9uRHVyYXRpb24gPSBvcHRzLnRyYW5zaXRpb25EdXJhdGlvbiB8fCAxMDBcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMueE9mZnNldCA9IG9wdHMueE9mZnNldCB8fCAzMFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy55T2Zmc2V0ID0gb3B0cy55T2Zmc2V0IHx8IDIwXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAvLyBlLmcuIHRvIHByZXZlbnQgbW91c2UgY3Vyc29yIGNvdmVyaW5nIGNlbGwgYmVpbmcgaGlnaGxpZ2h0ZWRcbiAgICAgICAgdGhpcy55TW91c2VPZmZzZXQgPSBvcHRzLnlNb3VzZU9mZnNldCB8fCAwXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnhNb3VzZU9mZnNldCA9IG9wdHMueE1vdXNlT2Zmc2V0IHx8IDBcbiAgICAgICAgLyoqIEB0eXBlIHtIVE1MRWxlbWVudH0gKi9cbiAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50ID0gb3B0cy5wYXJlbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHlcbiAgICAgICAgLyoqIEB0eXBlIHtIVE1MRWxlbWVudH0gKi9cbiAgICAgICAgdGhpcy50b29sdGlwRWxlbWVudCA9IG9wdHMudG9vbHRpcEVsZW1lbnQgfHwgbnVsbFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHVibGljXG4gICAgICAgICAqIEB0eXBlIHtpbXBvcnQoXCJkMy1zZWxlY3Rpb25cIikuU2VsZWN0aW9ufSAqL1xuICAgICAgICB0aGlzLnRvb2x0aXAgPSBvcHRzLnRvb2x0aXBFbGVtZW50XG4gICAgICAgICAgICA/IHNlbGVjdChvcHRzLnRvb2x0aXBFbGVtZW50KSAvLyBXcmFwIHRoZSBwcm92aWRlZCBIVE1MIG5vZGUgaW4gYSBEMyBzZWxlY3Rpb25cbiAgICAgICAgICAgIDogc2VsZWN0KHRoaXMucGFyZW50RWxlbWVudCkuYXBwZW5kKCdkaXYnKS5hdHRyKCdpZCcsICdncmlkdml6LXRvb2x0aXAnKS5hdHRyKCdjbGFzcycsICdncmlkdml6LXRvb2x0aXAnKSAvLyBjcmVhdGUgZGVmYXVsdCBlbGVtZW50XG5cbiAgICAgICAgLy9pbml0aWFsaXNlXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnbWF4LXdpZHRoJywgdGhpcy5tYXhXaWR0aClcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdvdmVyZmxvdycsICdoaWRkZW4nKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMuZm9udFNpemUpXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnYmFja2dyb3VuZCcsIHRoaXMuYmFja2dyb3VuZClcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdwYWRkaW5nJywgdGhpcy5wYWRkaW5nKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2JvcmRlcicsIHRoaXMuYm9yZGVyKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2JvcmRlci1yYWRpdXMnLCB0aGlzWydib3JkZXItcmFkaXVzJ10pXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnYm94LXNoYWRvdycsIHRoaXNbJ2JveC1zaGFkb3cnXSlcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdmb250LWZhbWlseScsIHRoaXNbJ2ZvbnQtZmFtaWx5J10pXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ29wYWNpdHknLCAnMCcpXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgndGV4dC13cmFwJywgJ25vd3JhcCcpXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnei1pbmRleCcsIDk5OTk5OTk5KSAvLyBpbXBvcnRhbnQgZm9yIGxlYWZsZXQtZ3JpZHZpeiBldGNcblxuICAgICAgICAvLyB0aGVzZSBwbGFjZWhvbGRlcnMgYXJlIG5lZWRlZCB0byBwcmV2ZW50IGFuIGluZmluaXRlIERPTSByZXNpemVPYnNlcnZlciBsb29wOlxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2xlZnQnLCAnMCcpXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgndG9wJywgJzAnKVxuXG4gICAgICAgIC8vIGFyaWEtbGFiZWxzICh0aGFua3MgdG8gd2FobGF0bGFzKVxuICAgICAgICB0aGlzLnRvb2x0aXAuYXR0cigncm9sZScsICd0b29sdGlwJykuYXR0cignYXJpYS1saXZlJywgJ3BvbGl0ZScpXG4gICAgfVxuXG4gICAgLyoqIFNob3cgdGhlIHRvb2x0aXAgKi9cbiAgICBzaG93KCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMudG9vbHRpcC50cmFuc2l0aW9uKCkuZHVyYXRpb24odGhpcy50cmFuc2l0aW9uRHVyYXRpb24pLnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICB9XG5cbiAgICAvKiogSGlkZSB0aGUgdG9vbHRpcCAqL1xuICAgIGhpZGUoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy50b29sdGlwLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0aGlzLnRyYW5zaXRpb25EdXJhdGlvbikuc3R5bGUoJ29wYWNpdHknLCAwKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY29udGVudCBvZiB0aGUgdG9vbHRpcC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHRtbFxuICAgICAqL1xuICAgIGh0bWwoaHRtbCkge1xuICAgICAgICB0aGlzLnRvb2x0aXAuaHRtbChodG1sKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgcG9zaXRpb24gb2YgdGhlIHRvb2x0aXAgYXQgdGhlIG1vdXNlIGV2ZW50IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnRcbiAgICAgKi9cbiAgICBzZXRQb3NpdGlvbihldmVudCkge1xuICAgICAgICAvLyBHZXQgdGhlIGJvdW5kaW5nIHJlY3Qgb2YgdGhlIHBhcmVudCBjb250YWluZXIgKG1hcDIpXG4gICAgICAgIGxldCBwYXJlbnRSZWN0ID0gdGhpcy5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG5cbiAgICAgICAgLy8gR2V0IHRoZSBtb3VzZSBwb3NpdGlvbiAocmVsYXRpdmUgdG8gdGhlIHBhcmVudCBjb250YWluZXIpXG4gICAgICAgIGxldCB4ID0gZXZlbnQuY2xpZW50WCAtIHBhcmVudFJlY3QubGVmdCArIHRoaXMueE9mZnNldCAvLyBSZWxhdGl2ZSB0byBwYXJlbnRcbiAgICAgICAgbGV0IHkgPSBldmVudC5jbGllbnRZIC0gcGFyZW50UmVjdC50b3AgLSB0aGlzLnlPZmZzZXQgLy8gUmVsYXRpdmUgdG8gcGFyZW50XG5cbiAgICAgICAgLy8gTm93LCBhcHBseSB0aGUgcG9zaXRpb24gdG8gdGhlIHRvb2x0aXBcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdsZWZ0JywgeCArICdweCcpLnN0eWxlKCd0b3AnLCB5ICsgJ3B4JylcblxuICAgICAgICAvLyBFbnN1cmUgdGhlIHRvb2x0aXAgc3RheXMgaW5zaWRlIHRoZSBwYXJlbnQgY29udGFpbmVyXG4gICAgICAgIHRoaXMuZW5zdXJlVG9vbHRpcEluc2lkZUNvbnRhaW5lcihldmVudCwgcGFyZW50UmVjdCwgdGhpcy50b29sdGlwLm5vZGUoKSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uIGVuc3VyZVRvb2x0aXBJbnNpZGVDb250YWluZXJcbiAgICAgKiBAZGVzY3JpcHRpb24gUHJldmVudHMgdGhlIHRvb2x0aXAgZnJvbSBvdmVyZmxvd2luZyBvdXQgb2YgdGhlIEFwcCBjb250YWluZXIgKGVuc3VyZXMgdGhhdCB0aGUgdG9vbHRpcCBpcyBpbnNpZGUgdGhlIGdyaWR2aXogY29udGFpbmVyKVxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnRcbiAgICAgKiBAcGFyYW0ge0RPTVJlY3R9IHBhcmVudFJlY3RcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0b29sdGlwTm9kZVxuICAgICAqL1xuICAgIGVuc3VyZVRvb2x0aXBJbnNpZGVDb250YWluZXIoZXZlbnQsIHBhcmVudFJlY3QsIHRvb2x0aXBOb2RlKSB7XG4gICAgICAgIGxldCBub2RlID0gdG9vbHRpcE5vZGVcbiAgICAgICAgbGV0IHBhcmVudFdpZHRoID0gcGFyZW50UmVjdC53aWR0aFxuICAgICAgICBsZXQgcGFyZW50SGVpZ2h0ID0gcGFyZW50UmVjdC5oZWlnaHRcblxuICAgICAgICAvLyBFbnN1cmUgdG9vbHRpcCBkb2Vzbid0IGdvIGJleW9uZCB0aGUgcmlnaHQgZWRnZVxuICAgICAgICBpZiAobm9kZS5vZmZzZXRMZWZ0ICsgbm9kZS5jbGllbnRXaWR0aCA+IHBhcmVudFdpZHRoKSB7XG4gICAgICAgICAgICBsZXQgbGVmdCA9IGV2ZW50LmNsaWVudFggLSBub2RlLmNsaWVudFdpZHRoIC0gdGhpcy54T2Zmc2V0XG4gICAgICAgICAgICBub2RlLnN0eWxlLmxlZnQgPSBsZWZ0ICsgJ3B4J1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5zdXJlIHRvb2x0aXAgZG9lc24ndCBnbyBiZXlvbmQgdGhlIGJvdHRvbSBlZGdlXG4gICAgICAgIGlmIChub2RlLm9mZnNldFRvcCArIG5vZGUuY2xpZW50SGVpZ2h0ID4gcGFyZW50SGVpZ2h0KSB7XG4gICAgICAgICAgICBub2RlLnN0eWxlLnRvcCA9IHBhcmVudEhlaWdodCAtIG5vZGUuY2xpZW50SGVpZ2h0ICsgJ3B4J1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5zdXJlIHRvb2x0aXAgZG9lc24ndCBnbyBhYm92ZSB0aGUgdG9wIGVkZ2VcbiAgICAgICAgaWYgKG5vZGUub2Zmc2V0VG9wIDwgMCkge1xuICAgICAgICAgICAgbm9kZS5zdHlsZS50b3AgPSAwICsgJ3B4J1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5zdXJlIHRvb2x0aXAgZG9lc24ndCBnbyBiZXlvbmQgdGhlIGxlZnQgZWRnZVxuICAgICAgICBpZiAobm9kZS5vZmZzZXRMZWZ0IDwgMCkge1xuICAgICAgICAgICAgbm9kZS5zdHlsZS5sZWZ0ID0gMCArICdweCdcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qXG5cdG15Lm1vdXNlb3ZlciA9IGZ1bmN0aW9uIChldmVudCwgaHRtbCkge1xuXHRcdGlmIChodG1sKSBteS5odG1sKGh0bWwpO1xuXHRcdG15LnNldFBvc2l0aW9uKGV2ZW50KTtcblx0XHRteS5zaG93KClcblx0XHQvL3RoaXMuZW5zdXJlVG9vbHRpcEluc2lkZUNvbnRhaW5lcigpO1xuXHR9O1xuXHRcblx0bXkubW91c2Vtb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0bXkuc2V0UG9zaXRpb24oZXZlbnQpO1xuXHRcdC8vdGhpcy5lbnN1cmVUb29sdGlwSW5zaWRlQ29udGFpbmVyKCk7XG5cdH07XG5cdFxuXHRteS5tb3VzZW91dCA9IGZ1bmN0aW9uICgpIHtcblx0XHRteS5oaWRlKCk7XG5cdH07Ki9cblxuICAgIHN0eWxlKGssIHYpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgcmV0dXJuIHRoaXMudG9vbHRpcC5zdHlsZShrKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoaywgdilcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBhdHRyKGssIHYpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgcmV0dXJuIHRoaXMudG9vbHRpcC5hdHRyKGspXG4gICAgICAgIHRoaXMudG9vbHRpcC5hdHRyKGssIHYpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKiogQHR5cGVkZWYge3sgZGltczogb2JqZWN0LCBjcnM6IHN0cmluZywgdGlsZVNpemVDZWxsOiBudW1iZXIsIG9yaWdpblBvaW50OiB7eDpudW1iZXIseTpudW1iZXJ9LCByZXNvbHV0aW9uR2VvOiBudW1iZXIsIHRpbGluZ0JvdW5kczppbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZSB9fSBHcmlkSW5mbyAqL1xuXG5pbXBvcnQgeyBkc3YgfSBmcm9tICdkMy1mZXRjaCdcbmltcG9ydCB7IERhdGFzZXQgfSBmcm9tICcuLi9jb3JlL0RhdGFzZXQuanMnXG5cbi8qKlxuICogQSBkYXRhc2V0IGNvbXBvc2VkIG9mIGEgc2luZ2xlIENTViBmaWxlIChub3QgdGlsZWQpLlxuICpcbiAqIEBtb2R1bGUgZGF0YXNldFxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQ1NWR3JpZCBleHRlbmRzIERhdGFzZXQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9NYXAuanNcIikuTWFwfSBtYXAgVGhlIG1hcC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgb2YgdGhlIGRhdGFzZXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb24gVGhlIGRhdGFzZXQgcmVzb2x1dGlvbiBpbiBnZW9ncmFwaGljYWwgdW5pdC5cbiAgICAgKiBAcGFyYW0ge3twcmVwcm9jZXNzPzooZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwpOmJvb2xlYW4pLGRlbGltaXRlcj86c3RyaW5nfX0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1hcCwgdXJsLCByZXNvbHV0aW9uLCBvcHRzID0ge30pIHtcbiAgICAgICAgc3VwZXIobWFwLCB1cmwsIHJlc29sdXRpb24sIG9wdHMpXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSAqL1xuICAgICAgICB0aGlzLmNlbGxzID0gW11cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5kZWxpbWl0ZXIgPSBvcHRzLmRlbGltaXRlciB8fCAnLCdcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICogQHByaXZhdGUgICovXG4gICAgICAgIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPSAnbm90TG9hZGVkJ1xuXG4gICAgICAgIC8vZ2V0IGRhdGFcbiAgICAgICAgdGhpcy5nZXREYXRhKHVuZGVmaW5lZClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0IGRhdGEgd2l0aGluIGEgZ2VvZ3JhcGhpYyBlbnZlbG9wZS5cbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfHVuZGVmaW5lZH0gZVxuICAgICAqL1xuICAgIGdldERhdGEoZSkge1xuICAgICAgICAvL2NoZWNrIGlmIGRhdGEgYWxyZWFkeSBsb2FkZWRcbiAgICAgICAgaWYgKHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgIT0gJ25vdExvYWRlZCcpIHJldHVybiB0aGlzXG5cbiAgICAgICAgLy9sb2FkIGRhdGFcbiAgICAgICAgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9ICdsb2FkaW5nJ1xuICAgICAgICA7KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGRzdih0aGlzLmRlbGltaXRlciwgdGhpcy51cmwpXG5cbiAgICAgICAgICAgICAgICAvL2NvbnZlcnQgY29vcmRpbmF0ZXMgaW4gbnVtYmVyc1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGMueCA9ICtjLnhcbiAgICAgICAgICAgICAgICAgICAgYy55ID0gK2MueVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vcHJlcHJvY2Vzcy9maWx0ZXJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmVwcm9jZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMgPSBbXVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IHRoaXMucHJlcHJvY2VzcyhjKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxzLnB1c2goYylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMgPSBkYXRhXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIGNoZWNrIGlmIHJlZHJhdyBpcyBuZWNlc3NhcnlcbiAgICAgICAgICAgICAgICAvL3RoYXQgaXMgaWYgdGhlIGRhdGFzZXQgYmVsb25ncyB0byBhIGxheWVyIHdoaWNoIGlzIHZpc2libGUgYXQgdGhlIGN1cnJlbnQgem9vbSBsZXZlbFxuXG4gICAgICAgICAgICAgICAgLy9yZWRyYXcgbWFwXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWFwKSB0aGlzLm1hcC5yZWRyYXcoKVxuXG4gICAgICAgICAgICAgICAgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9ICdsb2FkZWQnXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIC8vbWFyayBhcyBmYWlsZWRcbiAgICAgICAgICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcbiAgICAgICAgICAgICAgICB0aGlzLmNlbGxzID0gW11cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsbCB0aGUgdmlldyBjYWNoZSB3aXRoIGFsbCBjZWxscyB3aGljaCBhcmUgd2l0aGluIGEgZ2VvZ3JhcGhpY2FsIGVudmVsb3BlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZX0gZXh0R2VvXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgdXBkYXRlVmlld0NhY2hlKGV4dEdlbykge1xuICAgICAgICAvL2RhdGEgbm90IGxvYWRlZCB5ZXRcbiAgICAgICAgaWYgKCF0aGlzLmNlbGxzKSByZXR1cm5cblxuICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlID0gW11cbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIHRoaXMuY2VsbHMpIHtcbiAgICAgICAgICAgIGlmICgrY2VsbC54ICsgdGhpcy5yZXNvbHV0aW9uIDwgZXh0R2VvLnhNaW4pIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAoK2NlbGwueCAtIHRoaXMucmVzb2x1dGlvbiA+IGV4dEdlby54TWF4KSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKCtjZWxsLnkgKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueU1pbikgY29udGludWVcbiAgICAgICAgICAgIGlmICgrY2VsbC55IC0gdGhpcy5yZXNvbHV0aW9uID4gZXh0R2VvLnlNYXgpIGNvbnRpbnVlXG4gICAgICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlLnB1c2goY2VsbClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgRGF0YXNldCB9IGZyb20gJy4uL2NvcmUvRGF0YXNldC5qcydcblxuLyoqXG4gKiBBIGRhdGFzZXQgY29tcG9zZWQgb2YgY2VsbHMgZGVmaW5lZCBpbiBqYXZhc2NyaXB0LCBvciBsb2FkZWQgb3V0c2lkZSBvZiBncmlkdml6IG1hcC5cbiAqXG4gKiBAbW9kdWxlIGRhdGFzZXRcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEpTR3JpZCBleHRlbmRzIERhdGFzZXQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZSBkYXRhc2V0IHJlc29sdXRpb24gaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICogQHBhcmFtIHtBcnJheS48T2JqZWN0Pn0gY2VsbHMgVGhlIGNlbGxzLlxuICAgICAqIEBwYXJhbSB7fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocmVzb2x1dGlvbiwgY2VsbHMsIG9wdHMgPSB7fSkge1xuICAgICAgICBzdXBlcih1bmRlZmluZWQsICcnLCByZXNvbHV0aW9uLCBvcHRzKVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbD59ICovXG4gICAgICAgIHRoaXMuY2VsbHMgPSBjZWxscyB8fCBbXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3QgZGF0YSB3aXRoaW4gYSBnZW9ncmFwaGljIGVudmVsb3BlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZXx1bmRlZmluZWR9IGVcbiAgICAgKi9cbiAgICBnZXREYXRhKGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWxsIHRoZSB2aWV3IGNhY2hlIHdpdGggYWxsIGNlbGxzIHdoaWNoIGFyZSB3aXRoaW4gYSBnZW9ncmFwaGljYWwgZW52ZWxvcGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfSBleHRHZW9cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICB1cGRhdGVWaWV3Q2FjaGUoZXh0R2VvKSB7XG4gICAgICAgIC8vZGF0YSBub3QgbG9hZGVkIHlldFxuICAgICAgICBpZiAoIXRoaXMuY2VsbHMpIHJldHVyblxuXG4gICAgICAgIHRoaXMuY2VsbHNWaWV3Q2FjaGUgPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgdGhpcy5jZWxscykge1xuICAgICAgICAgICAgaWYgKCtjZWxsLnggKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueE1pbikgY29udGludWVcbiAgICAgICAgICAgIGlmICgrY2VsbC54IC0gdGhpcy5yZXNvbHV0aW9uID4gZXh0R2VvLnhNYXgpIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAoK2NlbGwueSArIHRoaXMucmVzb2x1dGlvbiA8IGV4dEdlby55TWluKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKCtjZWxsLnkgLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueU1heCkgY29udGludWVcbiAgICAgICAgICAgIHRoaXMuY2VsbHNWaWV3Q2FjaGUucHVzaChjZWxsKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKiogQHR5cGVkZWYge3sgZGltczogb2JqZWN0LCBjcnM6IHN0cmluZywgdGlsZVNpemVDZWxsOiBudW1iZXIsIG9yaWdpblBvaW50OiB7eDpudW1iZXIseTpudW1iZXJ9LCByZXNvbHV0aW9uR2VvOiBudW1iZXIsIHRpbGluZ0JvdW5kczppbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZSB9fSBHcmlkSW5mbyAqL1xuXG4vLyBpbnRlcm5hbFxuaW1wb3J0IHsgRGF0YXNldCB9IGZyb20gJy4uL2NvcmUvRGF0YXNldC5qcydcbi8vaW1wb3J0IHsgbW9uaXRvciwgbW9uaXRvckR1cmF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvVXRpbHMuanMnXG5cbi8vIGV4dGVybmFsXG5pbXBvcnQgeyBqc29uLCBjc3YgfSBmcm9tICdkMy1mZXRjaCdcblxuLyoqXG4gKiBBIHRpbGVkIGRhdGFzZXQsIGNvbXBvc2VkIG9mIENTViB0aWxlcy5cbiAqXG4gKiBAbW9kdWxlIGRhdGFzZXRcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFRpbGVkR3JpZCBleHRlbmRzIERhdGFzZXQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9NYXAuanNcIikuTWFwfSBtYXAgVGhlIG1hcC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgb2YgdGhlIGRhdGFzZXQuXG4gICAgICogQHBhcmFtIHt7cHJlcHJvY2Vzcz86KGZ1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsKTpib29sZWFuKSwgb25seURyYXdXaGVuQWxsVGlsZXNSZWFkeTpib29sZWFufX0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1hcCwgdXJsLCBvcHRzID0ge30pIHtcbiAgICAgICAgc3VwZXIobWFwLCB1cmwsIDAsIG9wdHMpXG4gICAgICAgIHRoaXMub25seURyYXdXaGVuQWxsVGlsZXNSZWFkeSA9IG9wdHMub25seURyYXdXaGVuQWxsVGlsZXNSZWFkeSB8fCBmYWxzZVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGdyaWQgaW5mbyBvYmplY3QsIGZyb20gdGhlIGluZm8uanNvbiBmaWxlLlxuICAgICAgICAgKiAgQHR5cGUge0dyaWRJbmZvIHwgdW5kZWZpbmVkfVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiAgKi9cbiAgICAgICAgdGhpcy5pbmZvID0gdW5kZWZpbmVkXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqIEBwcml2YXRlICAqL1xuICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ25vdExvYWRlZCdcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGNhY2hlIG9mIHRoZSBsb2FkZWQgdGlsZXMuIEl0IGlzIGRvdWJsZSBpbmRleGVkOiBieSB4VCBhbmQgdGhlbiB5VC5cbiAgICAgICAgICogRXhhbXBsZTogdGhpcy5jYWNoZVt4VF1beVRdIHJldHVybnMgdGhlIHRpbGUgYXQgW3hUXVt5VF0gbG9jYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICAgICAqICovXG4gICAgICAgIHRoaXMuY2FjaGUgPSB7fVxuXG4gICAgICAgIC8vbGF1bmNoIGxvYWRpbmdcbiAgICAgICAgdGhpcy5sb2FkSW5mbygpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCB0aGUgaW5mby5qc29uIGZyb20gdGhlIHVybC5cbiAgICAgKiBAcmV0dXJucyB0aGlzXG4gICAgICovXG4gICAgbG9hZEluZm8oKSB7XG4gICAgICAgIGlmICghdGhpcy5pbmZvICYmIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPT09ICdub3RMb2FkZWQnKSB7XG4gICAgICAgICAgICA7KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQganNvbih0aGlzLnVybCArICdpbmZvLmpzb24nKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZm8gPSBkYXRhXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb2x1dGlvbiA9IGRhdGEucmVzb2x1dGlvbkdlb1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ2xvYWRlZCdcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXAucmVkcmF3KClcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvL21hcmsgYXMgZmFpbGVkXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPSAnZmFpbGVkJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID09PSAnbG9hZGVkJyB8fCB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID09PSAnZmFpbGVkJykgdGhpcy5tYXAucmVkcmF3KClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlIGEgdGlsaW5nIGVudmVsb3BlIGZyb20gYSBnZW9ncmFwaGljYWwgZW52ZWxvcGUuXG4gICAgICogVGhpcyBpcyB0aGUgZnVuY3Rpb24gdG8gdXNlIHRvIGtub3cgd2hpY2ggdGlsZXMgdG8gZG93bmxvYWQgZm9yIGEgZ2VvZ3JhcGhpY2FsIHZpZXcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfSBlXG4gICAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfHVuZGVmaW5lZH1cbiAgICAgKi9cbiAgICBnZXRUaWxpbmdFbnZlbG9wZShlKSB7XG4gICAgICAgIGlmICghdGhpcy5pbmZvKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRJbmZvKClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG8gPSB0aGlzLmluZm8ub3JpZ2luUG9pbnQsXG4gICAgICAgICAgICByID0gdGhpcy5pbmZvLnJlc29sdXRpb25HZW8sXG4gICAgICAgICAgICBzID0gdGhpcy5pbmZvLnRpbGVTaXplQ2VsbFxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TWluOiBNYXRoLmZsb29yKChlLnhNaW4gLSBwby54KSAvIChyICogcykpLFxuICAgICAgICAgICAgeE1heDogTWF0aC5mbG9vcigoZS54TWF4IC0gcG8ueCkgLyAociAqIHMpKSxcbiAgICAgICAgICAgIHlNaW46IE1hdGguZmxvb3IoKGUueU1pbiAtIHBvLnkpIC8gKHIgKiBzKSksXG4gICAgICAgICAgICB5TWF4OiBNYXRoLmZsb29yKChlLnlNYXggLSBwby55KSAvIChyICogcykpLFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBkYXRhIHdpdGhpbiBhIGdlb2dyYXBoaWMgZW52ZWxvcGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ltcG9ydCgnLi4vY29yZS9HZW9DYW52YXMuanMnKS5FbnZlbG9wZX0gZXh0R2VvXG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICovXG4gICAgYXN5bmMgZ2V0RGF0YShleHRHZW8pIHtcbiAgICAgICAgaWYgKCF0aGlzLmluZm8pIHJldHVybiB0aGlzXG5cbiAgICAgICAgLy8gQ3JlYXRlIGFuIEFib3J0Q29udHJvbGxlciBmb3IgdGhlIGN1cnJlbnQgZGF0YSByZXF1ZXN0XG4gICAgICAgIHRoaXMuYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuYWJvcnRDb250cm9sbGVyLnNpZ25hbFxuXG4gICAgICAgIC8vIEdldCB0aGUgdGlsaW5nIGVudmVsb3BlIGFuZCBjaGVjayBib3VuZHNcbiAgICAgICAgY29uc3QgdGIgPSB0aGlzLmdldFRpbGluZ0VudmVsb3BlKGV4dEdlbylcbiAgICAgICAgaWYgKCF0YikgcmV0dXJuIHRoaXNcblxuICAgICAgICBjb25zdCB7IHhNaW46IGdiWE1pbiwgeE1heDogZ2JYTWF4LCB5TWluOiBnYllNaW4sIHlNYXg6IGdiWU1heCB9ID0gdGhpcy5pbmZvLnRpbGluZ0JvdW5kc1xuXG4gICAgICAgIGNvbnN0IHhNaW4gPSBNYXRoLm1heCh0Yi54TWluLCBnYlhNaW4pXG4gICAgICAgIGNvbnN0IHhNYXggPSBNYXRoLm1pbih0Yi54TWF4LCBnYlhNYXgpXG4gICAgICAgIGNvbnN0IHlNaW4gPSBNYXRoLm1heCh0Yi55TWluLCBnYllNaW4pXG4gICAgICAgIGNvbnN0IHlNYXggPSBNYXRoLm1pbih0Yi55TWF4LCBnYllNYXgpXG5cbiAgICAgICAgY29uc3QgdG90YWxUaWxlcyA9ICh4TWF4IC0geE1pbiArIDEpICogKHlNYXggLSB5TWluICsgMSlcbiAgICAgICAgbGV0IHByb2Nlc3NlZFRpbGVzID0gMFxuICAgICAgICBjb25zdCB0aWxlUHJvbWlzZXMgPSBbXVxuXG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciB0aWxlcyB3aXRoaW4gYm91bmRzXG4gICAgICAgIGZvciAobGV0IHhUID0geE1pbjsgeFQgPD0geE1heDsgeFQrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeVQgPSB5TWluOyB5VCA8PSB5TWF4OyB5VCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3hUXSkgdGhpcy5jYWNoZVt4VF0gPSB7fVxuXG4gICAgICAgICAgICAgICAgLy8gU2tpcCBhbHJlYWR5IGxvYWRlZCB0aWxlcyBvciByZXRyeSBmYWlsZWQgb25lc1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhY2hlW3hUXVt5VF0gJiYgdGhpcy5jYWNoZVt4VF1beVRdICE9PSAnZmFpbGVkJykge1xuICAgICAgICAgICAgICAgICAgICArK3Byb2Nlc3NlZFRpbGVzXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTWFyayB0aWxlIGFzIGxvYWRpbmdcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlW3hUXVt5VF0gPSAnbG9hZGluZydcblxuICAgICAgICAgICAgICAgIHRpbGVQcm9taXNlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRUaWxlKHhULCB5VCwgc2lnbmFsKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHRpbGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlW3hUXVt5VF0gPSB0aWxlXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIHRoZSBsYXN0IHRpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0xhc3RUaWxlID0gKytwcm9jZXNzZWRUaWxlcyA9PT0gdG90YWxUaWxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tBbmRSZWRyYXcodGlsZSwgaXNMYXN0VGlsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVbeFRdW3lUXSA9ICdmYWlsZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKytwcm9jZXNzZWRUaWxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQodGlsZVByb21pc2VzKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgYSB0aWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHhUXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlUXG4gICAgICogQHBhcmFtIHtBYm9ydFNpZ25hbH0gc2lnbmFsXG4gICAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICAgKi9cbiAgICBhc3luYyBsb2FkVGlsZSh4VCwgeVQsIHNpZ25hbCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGNzdihgJHt0aGlzLnVybH0ke3hUfS8ke3lUfS5jc3ZgLCB7IHNpZ25hbCB9KVxuXG4gICAgICAgICAgICBjb25zdCBjZWxscyA9IHRoaXMucHJlcHJvY2VzcyA/IGRhdGEuZmlsdGVyKChjZWxsKSA9PiB0aGlzLnByZXByb2Nlc3MoY2VsbCkgIT09IGZhbHNlKSA6IGRhdGFcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmluZm8pIHRocm93IG5ldyBFcnJvcignVGlsZSBpbmZvIHVua25vd24nKVxuXG4gICAgICAgICAgICByZXR1cm4gZ2V0R3JpZFRpbGUoY2VsbHMsIHhULCB5VCwgdGhpcy5pbmZvKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgVGlsZSByZXF1ZXN0IGZvciAke3hUfSwgJHt5VH0gd2FzIGFib3J0ZWQuYClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWwgb25nb2luZyBkYXRhIHJlcXVlc3RzIHdoZW4gem9vbSBsZXZlbCBjaGFuZ2VzLlxuICAgICAqL1xuICAgIGNhbmNlbEN1cnJlbnRSZXF1ZXN0cygpIHtcbiAgICAgICAgaWYgKHRoaXMuYWJvcnRDb250cm9sbGVyKSB7XG4gICAgICAgICAgICB0aGlzLmFib3J0Q29udHJvbGxlci5hYm9ydCgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjaGVja0FuZFJlZHJhdyh0aWxlLCBpc0xhc3RUaWxlKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGFueSB2aXNpYmxlIGxheWVyIGRlcGVuZHMgb24gdGhpcyBkYXRhc2V0XG4gICAgICAgIC8vIGNoZWNrIGlmIHJlZHJhdyBpcyByZWFsbHkgbmVlZGVkLCB0aGF0IGlzIGlmOlxuICAgICAgICAvLyAxLiB0aGUgZGF0YXNldCBiZWxvbmdzIHRvIGEgbGF5ZXIgd2hpY2ggaXMgdmlzaWJsZSBhdCB0aGUgY3VycmVudCB6b29tIGxldmVsXG4gICAgICAgIGxldCBuZWVkc1JlZHJhdyA9IGZhbHNlXG4gICAgICAgIC8vZ28gdGhyb3VnaCB0aGUgbGF5ZXJzXG4gICAgICAgIGNvbnN0IHogPSB0aGlzLm1hcC5nZXRab29tKClcbiAgICAgICAgZm9yIChjb25zdCBsYXkgb2YgdGhpcy5tYXAubGF5ZXJzKSB7XG4gICAgICAgICAgICBpZiAobGF5LnZpc2libGUgJiYgIWxheS52aXNpYmxlKHopKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKCFsYXkuZ2V0RGF0YXNldCkgY29udGludWVcbiAgICAgICAgICAgIGlmIChsYXkuZ2V0RGF0YXNldCh6KSAhPSB0aGlzKSBjb250aW51ZVxuICAgICAgICAgICAgLy9mb3VuZCBvbmUgbGF5ZXIuIE5vIG5lZWQgdG8gc2VlayBtb3JlLlxuICAgICAgICAgICAgbmVlZHNSZWRyYXcgPSB0cnVlXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFuZWVkc1JlZHJhdykgcmV0dXJuXG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGlsZSBpbnRlcnNlY3RzIHRoZSBjdXJyZW50IHZpZXdcbiAgICAgICAgY29uc3QgZW52ID0gdGhpcy5tYXAudXBkYXRlRXh0ZW50R2VvKClcbiAgICAgICAgY29uc3QgeyB4TWluLCB4TWF4LCB5TWluLCB5TWF4IH0gPSB0aWxlLmV4dEdlb1xuICAgICAgICBpZiAoZW52LnhNYXggPD0geE1pbiB8fCBlbnYueE1pbiA+PSB4TWF4IHx8IGVudi55TWF4IDw9IHlNaW4gfHwgZW52LnlNaW4gPj0geU1heCkgcmV0dXJuXG5cbiAgICAgICAgLy8gVHJpZ2dlciByZWRyYXdcbiAgICAgICAgaWYgKHRoaXMub25seURyYXdXaGVuQWxsVGlsZXNSZWFkeSkge1xuICAgICAgICAgICAgaWYgKGlzTGFzdFRpbGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hcC5yZWRyYXcoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tYXAucmVkcmF3KClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbGwgdGhlIHZpZXcgY2FjaGUgd2l0aCBhbGwgY2VsbHMgd2hpY2ggYXJlIHdpdGhpbiBhIGdlb2dyYXBoaWNhbCBlbnZlbG9wZS5cbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfSBleHRHZW9cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICB1cGRhdGVWaWV3Q2FjaGUoZXh0R2VvKSB7XG4gICAgICAgIC8vXG4gICAgICAgIHRoaXMuY2VsbHNWaWV3Q2FjaGUgPSBbXVxuXG4gICAgICAgIC8vY2hlY2sgaWYgaW5mbyBoYXMgYmVlbiBsb2FkZWRcbiAgICAgICAgaWYgKCF0aGlzLmluZm8pIHJldHVyblxuXG4gICAgICAgIC8vdGlsZXMgd2l0aGluIHRoZSBzY29wZVxuICAgICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgY29uc3QgdGIgPSB0aGlzLmdldFRpbGluZ0VudmVsb3BlKGV4dEdlbylcbiAgICAgICAgaWYgKCF0YikgcmV0dXJuXG5cbiAgICAgICAgLy9ncmlkIGJvdW5kc1xuICAgICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfSAqL1xuICAgICAgICBjb25zdCBnYiA9IHRoaXMuaW5mby50aWxpbmdCb3VuZHNcblxuICAgICAgICBmb3IgKGxldCB4VCA9IE1hdGgubWF4KHRiLnhNaW4sIGdiLnhNaW4pOyB4VCA8PSBNYXRoLm1pbih0Yi54TWF4LCBnYi54TWF4KTsgeFQrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3hUXSkgY29udGludWVcbiAgICAgICAgICAgIGZvciAobGV0IHlUID0gTWF0aC5tYXgodGIueU1pbiwgZ2IueU1pbik7IHlUIDw9IE1hdGgubWluKHRiLnlNYXgsIGdiLnlNYXgpOyB5VCsrKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgdGlsZVxuICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7b2JqZWN0fSAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLmNhY2hlW3hUXVt5VF1cbiAgICAgICAgICAgICAgICBpZiAoIXRpbGUgfHwgdHlwZW9mIHRpbGUgPT09ICdzdHJpbmcnKSBjb250aW51ZVxuXG4gICAgICAgICAgICAgICAgLy9nZXQgY2VsbHNcbiAgICAgICAgICAgICAgICAvL3RoaXMuY2VsbHNWaWV3Q2FjaGUgPSB0aGlzLmNlbGxzVmlld0NhY2hlLmNvbmNhdCh0aWxlLmNlbGxzKVxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIHRpbGUuY2VsbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCtjZWxsLnggKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueE1pbikgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKCtjZWxsLnggLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueE1heCkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKCtjZWxsLnkgKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueU1pbikgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKCtjZWxsLnkgLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueU1heCkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsc1ZpZXdDYWNoZS5wdXNoKGNlbGwpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRHcmlkVGlsZShjZWxscywgeFQsIHlULCBncmlkSW5mbykge1xuICAgIGNvbnN0IHRpbGUgPSB7fVxuXG4gICAgLyoqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSAqL1xuICAgIHRpbGUuY2VsbHMgPSBjZWxsc1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIHRpbGUueCA9IHhUXG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGlsZS55ID0geVRcblxuICAgIGNvbnN0IHIgPSBncmlkSW5mby5yZXNvbHV0aW9uR2VvXG4gICAgY29uc3QgcyA9IGdyaWRJbmZvLnRpbGVTaXplQ2VsbFxuXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5FbnZlbG9wZX0gKi9cbiAgICB0aWxlLmV4dEdlbyA9IHtcbiAgICAgICAgeE1pbjogZ3JpZEluZm8ub3JpZ2luUG9pbnQueCArIHIgKiBzICogdGlsZS54LFxuICAgICAgICB4TWF4OiBncmlkSW5mby5vcmlnaW5Qb2ludC54ICsgciAqIHMgKiAodGlsZS54ICsgMSksXG4gICAgICAgIHlNaW46IGdyaWRJbmZvLm9yaWdpblBvaW50LnkgKyByICogcyAqIHRpbGUueSxcbiAgICAgICAgeU1heDogZ3JpZEluZm8ub3JpZ2luUG9pbnQueSArIHIgKiBzICogKHRpbGUueSArIDEpLFxuICAgIH1cblxuICAgIC8vY29udmVydCBjZWxsIGNvb3JkaW5hdGVzIGludG8gZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzXG4gICAgZm9yIChsZXQgY2VsbCBvZiB0aWxlLmNlbGxzKSB7XG4gICAgICAgIGNlbGwueCA9IHRpbGUuZXh0R2VvLnhNaW4gKyBjZWxsLnggKiByXG4gICAgICAgIGNlbGwueSA9IHRpbGUuZXh0R2VvLnlNaW4gKyBjZWxsLnkgKiByXG4gICAgfVxuXG4gICAgcmV0dXJuIHRpbGVcbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xuXG4vKipcbiAqXG4gKiBBIG1hcCBiYWNrZ3JvdW5kIGxheWVyIGluIFwiU2xpcHB5IG1hcFwiIFhZWiBzdGFuZGFyZC5cbiAqIFNlZSBodHRwczovL3dpa2kub3BlbnN0cmVldG1hcC5vcmcvd2lraS9TbGlwcHlfbWFwX3RpbGVuYW1lc1xuICogaHR0cHM6Ly93d3cubWFwdGlsZXIuY29tL2dvb2dsZS1tYXBzLWNvb3JkaW5hdGVzLXRpbGUtYm91bmRzLXByb2plY3Rpb24vIzYvMjcuODgvNDQuNDhcbiAqXG4gKiBAbW9kdWxlIGxheWVyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBCYWNrZ3JvdW5kTGF5ZXIgZXh0ZW5kcyBMYXllciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIFRoZSBpbWFnZSBjYWNoZSwgaW5kZXhlZCBieSB6L3kveFxuICAgICAgICAgKiBAcHJpdmF0ZSAqL1xuICAgICAgICB0aGlzLmNhY2hlID0ge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy51cmwgPSBvcHRzLnVybFxuICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudXJsRnVuID0gb3B0cy51cmxGdW4gfHwgKCh4LCB5LCB6KSA9PiB0aGlzLnVybCArIHogKyAnLycgKyB4ICsgJy8nICsgeSArICcucG5nJylcblxuICAgICAgICAvKiogVGhlIGdyb3VuZCByZXNvbHV0aW9ucyBvZiB0aGUgem9vbSBsZXZlbHMsIHN0YXJ0aW5nIGZyb20gdGhlIHNtYWxsZXN0IChtb3N0IHpvb21lZC1vdXQsIHVzdWFsbHkgMCkgdG8gdGhlIGxhcmdlc3QgKG1vc3Qgem9vbWVkLWluKS5cbiAgICAgICAgICogVXN1YWxseSBkaXZpZGVkIGJ5IDIgZm9yIGVhY2ggem9vbSBsZXZlbCBpbmNyZW1lbnQuXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cbiAgICAgICAgdGhpcy5yZXNvbHV0aW9ucyA9IG9wdHMucmVzb2x1dGlvbnNcbiAgICAgICAgaWYgKCF0aGlzLnJlc29sdXRpb25zIHx8IHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoID09IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJlc29sdXRpb25zIHByb3ZpZGVkIGZvciBiYWNrZ3JvdW5kIGxheWVyJylcblxuICAgICAgICAvKiogVGhlIHRpbGUgc2l6ZSwgaW4gbnVtYmVyIG9mIHBpeGVsc1xuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm5iUGl4ID0gb3B0cy5uYlBpeCB8fCAyNTZcblxuICAgICAgICAvKiogQ1JTIGNvb3JkaW5hdGVzIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgdG9wIGxlZnQgdGlsZSwgdGhlIG9uZSB3aXRoIGNvZGUgLzAvMC5wbmcuXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cbiAgICAgICAgdGhpcy5vcmlnaW4gPSBvcHRzLm9yaWdpbiB8fCBbMCwgMF1cblxuICAgICAgICAvKiogVGhlIGNvZGUgb2YgdGhlIHNtYWxsZXN0IChtb3N0IHpvb21lZC1vdXQpIHpvb20gbGV2ZWwsIGluIGNhc2UgaXQgaXMgbm90IDAuXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuejAgPSBvcHRzLnowIHx8IDBcblxuICAgICAgICAvKiogQSBjb2VmZmljaWVudCB0byBhZGp1c3QgdGhlIGJhY2tncm91biByZXNvbHV0aW9uIHdpdGggdGhlIHNjcmVlbiByZXNvbHV0aW9uLlxuICAgICAgICAgKiAgSWYgdGhlIGJhY2tncm91bmQgaW1hZ2VzIGFyZSB0b28gcGl4ZWxpc2VkLCByZWR1Y2UgdGhlIHZhbHVlLlxuICAgICAgICAgKiAgSWYgdGhlcmUgYXJlIHRvbyBtYW55IGltYWdlcyB0byBkb3dubG9hZCwgaW5jcmVhc2UgdGhlIHZhbHVlLlxuICAgICAgICAgKiAgRGVmYXVsdCB2YWx1ZSBpcyAxLjBcbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5waXhlbGF0aW9uQ29lZmZpY2llbnQgPSBvcHRzLnBpeGVsYXRpb25Db2VmZmljaWVudCB8fCAxLjBcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgei94L3kgY2FjaGUgZGF0YS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gelxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlcbiAgICAgKiBAcmV0dXJucyB7SFRNTEltYWdlRWxlbWVudHxzdHJpbmd8dW5kZWZpbmVkfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0KHosIHgsIHkpIHtcbiAgICAgICAgbGV0IGQgPSB0aGlzLmNhY2hlW3pdXG4gICAgICAgIGlmICghZCkgcmV0dXJuXG4gICAgICAgIGQgPSBkW3hdXG4gICAgICAgIGlmICghZCkgcmV0dXJuXG4gICAgICAgIHJldHVybiBkW3ldXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHV0IGltYWdlIGluIGNhY2hlLlxuICAgICAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudHxzdHJpbmd9IGltZ1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geVxuICAgICAqIEByZXR1cm5zXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwdXQoaW1nLCB6LCB4LCB5KSB7XG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt6XSkgdGhpcy5jYWNoZVt6XSA9IHt9XG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt6XVt4XSkgdGhpcy5jYWNoZVt6XVt4XSA9IHt9XG4gICAgICAgIHRoaXMuY2FjaGVbel1beF1beV0gPSBpbWdcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGUgbGF5ZXIuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZHJhdyhnZW9DYW52YXMpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlc29sdXRpb25zIHx8IHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHJlc29sdXRpb25zIHByb3ZpZGVkIGZvciBiYWNrZ3JvdW5kIGxheWVyJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgY29uc3QgeDAgPSB0aGlzLm9yaWdpblswXSwgeTAgPSB0aGlzLm9yaWdpblsxXVxuXG4gICAgICAgIC8vZ2V0IHpvb20gbGV2ZWwgYW5kIHJlc29sdXRpb25cbiAgICAgICAgbGV0IHpfID0gMFxuICAgICAgICBmb3IgKHpfID0gMDsgel8gPCB0aGlzLnJlc29sdXRpb25zLmxlbmd0aDsgel8rKykgaWYgKHRoaXMucmVzb2x1dGlvbnNbel9dIDwgeiAqIHRoaXMucGl4ZWxhdGlvbkNvZWZmaWNpZW50KSBicmVha1xuICAgICAgICB6XyAtPSAxXG4gICAgICAgIHpfID0gTWF0aC5tYXgoMCwgel8pXG4gICAgICAgIHpfID0gTWF0aC5taW4oel8sIHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoIC0gMSlcbiAgICAgICAgY29uc3QgcmVzID0gdGhpcy5yZXNvbHV0aW9uc1t6X11cbiAgICAgICAgel8gKz0gdGhpcy56MFxuXG4gICAgICAgIGNvbnN0IHNpemVHID0gdGhpcy5uYlBpeCAqIHJlc1xuICAgICAgICBjb25zdCBzaXplID0gc2l6ZUcgLyB6XG5cbiAgICAgICAgLy9nZXQgdGlsZSBudW1iZXJzXG4gICAgICAgIGNvbnN0IHhHZW9Ub1RNUyA9ICh4KSA9PiBNYXRoLmNlaWwoKHggLSB4MCkgLyBzaXplRylcbiAgICAgICAgY29uc3QgeUdlb1RvVE1TID0gKHkpID0+IE1hdGguY2VpbCgtKHkgLSB5MCkgLyBzaXplRylcbiAgICAgICAgY29uc3QgeE1pbiA9IHhHZW9Ub1RNUyhnZW9DYW52YXMuZXh0R2VvLnhNaW4pIC0gMVxuICAgICAgICBjb25zdCB4TWF4ID0geEdlb1RvVE1TKGdlb0NhbnZhcy5leHRHZW8ueE1heClcbiAgICAgICAgY29uc3QgeU1heCA9IHlHZW9Ub1RNUyhnZW9DYW52YXMuZXh0R2VvLnlNaW4pXG4gICAgICAgIGNvbnN0IHlNaW4gPSB5R2VvVG9UTVMoZ2VvQ2FudmFzLmV4dEdlby55TWF4KSAtIDFcblxuICAgICAgICAvL2hhbmRsZSBpbWFnZXNcbiAgICAgICAgZm9yIChsZXQgeCA9IHhNaW47IHggPCB4TWF4OyB4KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHkgPSB5TWluOyB5IDwgeU1heDsgeSsrKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgaW1hZ2VcbiAgICAgICAgICAgICAgICBsZXQgaW1nID0gdGhpcy5nZXQoel8sIHgsIHkpXG5cbiAgICAgICAgICAgICAgICAvL25vIGltYWdlOiBsb2FkIGltYWdlIGZyb20gVVJMXG4gICAgICAgICAgICAgICAgaWYgKCFpbWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXQoaW1nLCB6XywgeCwgeSlcbiAgICAgICAgICAgICAgICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5yZWRyYXcoKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGltZy5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jYXNlIHdoZW4gbm8gaW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHV0KCdmYWlsZWQnLCB6XywgeCwgeSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpbWcuc3JjID0gdGhpcy51cmxGdW4oeCwgeSwgel8pXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9jYXNlIHdoZW4gbm8gaW1hZ2UgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgaWYgKGltZyA9PT0gJ2ZhaWxlZCcpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgaWYgKCEoaW1nIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coaW1nKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaW1nLndpZHRoID09IDAgfHwgaW1nLmhlaWdodCA9PSAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAgICAgLy9kcmF3IGltYWdlXG4gICAgICAgICAgICAgICAgY29uc3QgeEdlbyA9IHgwICsgeCAqIHNpemVHXG4gICAgICAgICAgICAgICAgY29uc3QgeUdlbyA9IHkwIC0geSAqIHNpemVHXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4LmRyYXdJbWFnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGltZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5nZW9Ub1BpeFgoeEdlbyksXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuZ2VvVG9QaXhZKHlHZW8pLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAvL2NnLmN0eC5kcmF3SW1hZ2UoaW1nLCB4R2VvLCB5R2VvLCBzaXplRywgLXNpemVHKVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBMYXllciB9IGZyb20gJy4uL2NvcmUvTGF5ZXIuanMnXG5cbi8qKlxuICpcbiAqIEEgbWFwIGJhY2tncm91bmQgbGF5ZXIgY29tcG9zZWQgb2YgYSBzaW5nbGUgaW1hZ2UgZmlsZSwgZ2VvbG9jYXRlZC5cbiAqXG4gKiBAbW9kdWxlIGxheWVyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBCYWNrZ3JvdW5kTGF5ZXJJbWFnZSBleHRlbmRzIExheWVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogVGhlIGltYWdlIGZpbGUgVVJMXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudXJsID0gb3B0cy51cmxcblxuICAgICAgICAvKiogVGhlIGltYWdlIGxlZnQgY29vcmRpbmF0ZVxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnhNaW4gPSBvcHRzLnhNaW4gfHwgMFxuICAgICAgICAvKiogVGhlIGltYWdlIHRvcCBjb29yZGluYXRlXG4gICAgICAgICAqICBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnlNYXggPSBvcHRzLnlNYXggfHwgMFxuXG4gICAgICAgIC8qKiBUaGUgaW1hZ2Ugd2lkdGgsIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8IDIwMDAwXG4gICAgICAgIC8qKiBUaGUgaW1hZ2UgaGVpZ2h0LCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0IHx8IDIwMDAwXG5cbiAgICAgICAgLyoqIFRoZSBpbWFnZSBvYmplY3RcbiAgICAgICAgICogQHR5cGUge0hUTUxJbWFnZUVsZW1lbnR8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmltZyA9IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXMgVGhlIGNhbnZhcyB3aGVyZSB0byBkcmF3IHRoZSBsYXllci5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBkcmF3KGdlb0NhbnZhcykge1xuICAgICAgICAvL3VwZGF0ZSBtYXAgZXh0ZW50XG4gICAgICAgIC8vZ2VvQ2FudmFzLnVwZGF0ZUV4dGVudEdlbygwKVxuXG4gICAgICAgIGlmICh0aGlzLmltZykge1xuICAgICAgICAgICAgLy90aGUgaW1hZ2Ugd2FzIGFscmVhZHkgZG93bmxvYWRlZDogZHJhdyBpdFxuXG4gICAgICAgICAgICAvL2NvbXB1dGUgc2NyZWVuIGNvb3JkaW5hdGVzIGFuZCBzaXplIHJhdGlvXG4gICAgICAgICAgICBjb25zdCB4ID0gZ2VvQ2FudmFzLmdlb1RvUGl4WCh0aGlzLnhNaW4pXG4gICAgICAgICAgICBjb25zdCB5ID0gZ2VvQ2FudmFzLmdlb1RvUGl4WSh0aGlzLnlNYXgpXG4gICAgICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLmdldFZpZXcoKS56XG5cbiAgICAgICAgICAgIC8vZHJhdyBpbWFnZVxuICAgICAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuICAgICAgICAgICAgZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eC5kcmF3SW1hZ2UodGhpcy5pbWcsIHgsIHksIHRoaXMud2lkdGggLyB6LCB0aGlzLmhlaWdodCAvIHopXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL3JldHJpZXZlIGltYWdlXG5cbiAgICAgICAgICAgIGlmICghdGhpcy5pbWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmltZyA9IG5ldyBJbWFnZSgpXG4gICAgICAgICAgICAgICAgdGhpcy5pbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMucmVkcmF3KClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pbWcub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9jYXNlIHdoZW4gbm8gaW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgcmV0cmlldmUgYmFja2dyb3VuZCBpbWFnZSBmcm9tJywgdGhpcy51cmwpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL3NldCBVUkwgdG8gbGF1bmNoIHRoZSBkb3dubG9hZFxuICAgICAgICAgICAgdGhpcy5pbWcuc3JjID0gdGhpcy51cmxcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xuXG4vKipcbiAqXG4gKiBBIG1hcCBXTVMgYmFja2dyb3VuZCBsYXllci5cbiAqXG4gKiBAbW9kdWxlIGxheWVyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBCYWNrZ3JvdW5kTGF5ZXJXTVMgZXh0ZW5kcyBMYXllciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudXJsID0gb3B0cy51cmxcblxuICAgICAgICAvKiogQHR5cGUge0hUTUxJbWFnZUVsZW1lbnR8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmltZyA9IHVuZGVmaW5lZFxuXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy54TWluID0gdW5kZWZpbmVkXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy54TWF4ID0gdW5kZWZpbmVkXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy55TWluID0gdW5kZWZpbmVkXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy55TWF4ID0gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgLyoqIENoZWNrIGlmIHRoZSB2aWV3IGhhcyBtb3ZlZCBhbmQgYSBuZXcgaW1hZ2UgbmVlZHMgdG8gYmUgcmV0cmlldmVkLlxuICAgICAqIEBwcml2YXRlICovXG4gICAgaGFzTW92ZWQoZXh0R2VvKSB7XG4gICAgICAgIGlmIChleHRHZW8ueE1pbiAhPSB0aGlzLnhNaW4pIHJldHVybiB0cnVlXG4gICAgICAgIGVsc2UgaWYgKGV4dEdlby54TWF4ICE9IHRoaXMueE1heCkgcmV0dXJuIHRydWVcbiAgICAgICAgZWxzZSBpZiAoZXh0R2VvLnlNaW4gIT0gdGhpcy55TWluKSByZXR1cm4gdHJ1ZVxuICAgICAgICBlbHNlIGlmIChleHRHZW8ueU1heCAhPSB0aGlzLnlNYXgpIHJldHVybiB0cnVlXG4gICAgICAgIGVsc2UgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGRyYXcoZ2VvQ2FudmFzKSB7XG4gICAgICAgIC8vdXBkYXRlIG1hcCBleHRlbnRcbiAgICAgICAgZ2VvQ2FudmFzLnVwZGF0ZUV4dGVudEdlbygwKVxuXG4gICAgICAgIGlmICghdGhpcy5oYXNNb3ZlZChnZW9DYW52YXMuZXh0R2VvKSAmJiB0aGlzLmltZykge1xuICAgICAgICAgICAgLy90aGUgbWFwIGRpZCBub3QgbW92ZSBhbmQgdGhlIGltYWdlIHdhcyBhbHJlYWR5IGRvd25sb2FkZWQ6IGRyYXcgdGhlIGltYWdlXG4gICAgICAgICAgICBnZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG4gICAgICAgICAgICBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4LmRyYXdJbWFnZSh0aGlzLmltZywgMCwgMCwgZ2VvQ2FudmFzLncsIGdlb0NhbnZhcy5oKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy90aGUgbWFwIG1vdmVkOiByZXRyaWV2ZSBuZXcgaW1hZ2VcblxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHRoaXMueE1pbiA9IGdlb0NhbnZhcy5leHRHZW8ueE1pblxuICAgICAgICAgICAgdGhpcy54TWF4ID0gZ2VvQ2FudmFzLmV4dEdlby54TWF4XG4gICAgICAgICAgICB0aGlzLnlNaW4gPSBnZW9DYW52YXMuZXh0R2VvLnlNaW5cbiAgICAgICAgICAgIHRoaXMueU1heCA9IGdlb0NhbnZhcy5leHRHZW8ueU1heFxuXG4gICAgICAgICAgICAvL2J1aWxkIFdNUyBVUkxcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IFtdXG4gICAgICAgICAgICB1cmwucHVzaCh0aGlzLnVybClcbiAgICAgICAgICAgIHVybC5wdXNoKCcmd2lkdGg9JylcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy53KVxuICAgICAgICAgICAgdXJsLnB1c2goJyZoZWlnaHQ9JylcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5oKVxuICAgICAgICAgICAgLy9iYm94OiB4bWluIHltaW4geG1heCB5bWF4XG4gICAgICAgICAgICB1cmwucHVzaCgnJmJib3g9JylcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5leHRHZW8ueE1pbilcbiAgICAgICAgICAgIHVybC5wdXNoKCcsJylcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5leHRHZW8ueU1pbilcbiAgICAgICAgICAgIHVybC5wdXNoKCcsJylcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5leHRHZW8ueE1heClcbiAgICAgICAgICAgIHVybC5wdXNoKCcsJylcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5leHRHZW8ueU1heClcblxuICAgICAgICAgICAgY29uc3QgdXJsUyA9IHVybC5qb2luKCcnKVxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh1cmxTKVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW1nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbWcgPSBuZXcgSW1hZ2UoKVxuICAgICAgICAgICAgICAgIHRoaXMuaW1nLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLnJlZHJhdygpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuaW1nLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vY2FzZSB3aGVuIG5vIGltYWdlXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IHJldHJpZXZlIFdNUyBiYWNrZ3JvdW5kIGltYWdlIGZyb20nLCB1cmxTKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9zZXQgVVJMIHRvIGxhdW5jaCB0aGUgZG93bmxvYWRcbiAgICAgICAgICAgIHRoaXMuaW1nLnNyYyA9IHVybFNcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xuaW1wb3J0IHsganNvbiB9IGZyb20gJ2QzLWZldGNoJ1xuXG4vKipcbiAqIEBtb2R1bGUgbGF5ZXJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEdlb0pTT05MYXllciBleHRlbmRzIExheWVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy51cmwgPSBvcHRzLnVybFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHByZXByb2Nlc3MgdG8gcnVuIG9uIGVhY2ggZmVhdHVyZSBhZnRlciBsb2FkaW5nLlxuICAgICAgICAgKiBJdCBjYW4gYmUgdXNlZCB0byBhcHBseSBzb21lIHNwZWNpZmljIHRyZWF0bWVudCBiZWZvcmUsIGZvcm1hdCB0aGUgbGFiZWwgZGF0YSwgcHJvamVjdCBjb29yZGluYXRlcywgZXRjLlxuICAgICAgICAgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGxhYmVsIHNob3VsZCBub3QgYmUga2VwdC5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCk6Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzID0gb3B0cy5wcmVwcm9jZXNzXG5cbiAgICAgICAgLy9mb3IgcG9pbnRzXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAoKGYsIHopID0+ICdjaXJjbGUnKVxuICAgICAgICAvKipcbiAgICAgICAgICogSW4gcGl4ZWxcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIHx8ICgoZiwgeikgPT4gMTApXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnN0cm9rZVN0eWxlID0gb3B0cy5zdHJva2VTdHlsZSB8fCAoKGYsIHopID0+ICdyZWQnKVxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5maWxsU3R5bGUgPSBvcHRzLmZpbGxTdHlsZSB8fCAoKGYsIHopID0+ICdibGFjaycpXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBwaXhlbFxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmxpbmVXaWR0aCA9IG9wdHMubGluZVdpZHRoIHx8ICgoZiwgeikgPT4gMilcblxuICAgICAgICAvL2ZvciBsaW5lc1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKGYsIHopID0+ICdncmF5JylcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluIHBpeGVsXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihvYmplY3QsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgoZiwgeikgPT4gMilcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihvYmplY3QsbnVtYmVyKTpBcnJheS48bnVtYmVyPnx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMubGluZURhc2ggPSBvcHRzLmxpbmVEYXNoIHx8ICgoZiwgeikgPT4gdW5kZWZpbmVkKVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPG9iamVjdD4gfCB1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMuZnMgPSB1bmRlZmluZWRcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ25vdExvYWRlZCdcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IHRoZSBsYXllci5cbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGUgbGF5ZXIuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZHJhdyhnZW9DYW52YXMpIHtcbiAgICAgICAgLy9sb2FkIGRhdGEsIGlmIG5vdCBkb25lIHlldC5cbiAgICAgICAgaWYgKCF0aGlzLmZzKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWQoZ2VvQ2FudmFzLnJlZHJhdylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgY29uc3QgY3R4ID0gZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuXG4gICAgICAgIGZvciAoY29uc3QgZiBvZiB0aGlzLmZzKSB7XG4gICAgICAgICAgICBjb25zdCBndCA9IGYuZ2VvbWV0cnkudHlwZVxuXG4gICAgICAgICAgICBpZiAoZ3QgPT0gJ1BvaW50Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBmLmdlb21ldHJ5LmNvb3JkaW5hdGVzXG5cbiAgICAgICAgICAgICAgICAvL2dldCBzdHlsZSBwYXJhbWV0ZXJzIGZvciB0aGUgcG9pbnQgZmVhdHVyZVxuICAgICAgICAgICAgICAgIGNvbnN0IHNoYXBlID0gdGhpcy5zaGFwZShmLCB6KVxuICAgICAgICAgICAgICAgIGlmICghc2hhcGUgfHwgc2hhcGUgPT0gJ25vbmUnKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnNpemUoZiwgeikgKiB6XG4gICAgICAgICAgICAgICAgaWYgKCFzaXplKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGNvbnN0IHN0cm9rZVN0eWxlID0gdGhpcy5zdHJva2VTdHlsZShmLCB6KVxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGxTdHlsZSA9IHRoaXMuZmlsbFN0eWxlKGYsIHopXG4gICAgICAgICAgICAgICAgY29uc3QgbGluZVdpZHRoID0gdGhpcy5saW5lV2lkdGgoZiwgeikgKiB6XG5cbiAgICAgICAgICAgICAgICAvL3NldCBjYW52YXMgZHJhd2luZyBwYXJhbWV0ZXJzXG4gICAgICAgICAgICAgICAgaWYgKHN0cm9rZVN0eWxlKSBjdHguc3Ryb2tlU3R5bGUgPSBzdHJva2VTdHlsZVxuICAgICAgICAgICAgICAgIGlmIChmaWxsU3R5bGUpIGN0eC5maWxsU3R5bGUgPSBmaWxsU3R5bGVcbiAgICAgICAgICAgICAgICBpZiAobGluZVdpZHRoKSBjdHgubGluZVdpZHRoID0gbGluZVdpZHRoXG5cbiAgICAgICAgICAgICAgICBpZiAoc2hhcGUgPT0gJ2NpcmNsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kcmF3IGNpcmNsZSAtIGZpbGwgYW5kIHN0cm9rZVxuICAgICAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgY3R4LmFyYyhjWzBdLCBjWzFdLCBzaXplIC8gMiwgMCwgMiAqIE1hdGguUEksIGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlsbFN0eWxlKSBjdHguZmlsbCgpXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHJva2VTdHlsZSAmJiBsaW5lV2lkdGgpIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT0gJ3NxdWFyZScpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kcmF3IHNxdWFyZSAtIGZpbGwgYW5kIHN0cm9rZVxuICAgICAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgY3R4LnJlY3QoY1swXSAtIHNpemUgLyAyLCBjWzFdIC0gc2l6ZSAvIDIsIHNpemUsIHNpemUpXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWxsU3R5bGUpIGN0eC5maWxsKClcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cm9rZVN0eWxlICYmIGxpbmVXaWR0aCkgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVW5leHBlY3RlZCBzaGFwZSBmb3IgcG9pbnQgZ2VvanNvbjogJyArIHNoYXBlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZ3QgPT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3MgPSBmLmdlb21ldHJ5LmNvb3JkaW5hdGVzXG4gICAgICAgICAgICAgICAgaWYgKGNzLmxlbmd0aCA8IDIpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgICAgICAvL3NldCBjb2xvclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IoZiwgeilcbiAgICAgICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT0gJ25vbmUnKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGNvbFxuXG4gICAgICAgICAgICAgICAgLy9zZXQgbGluZXdpZHRoXG4gICAgICAgICAgICAgICAgY29uc3Qgd1AgPSB0aGlzLndpZHRoKGYsIHopXG4gICAgICAgICAgICAgICAgaWYgKCF3UCB8fCB3UCA8IDApIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHdQICogelxuXG4gICAgICAgICAgICAgICAgLy9zZXQgbGluZSBkYXNoXG4gICAgICAgICAgICAgICAgY29uc3QgbGRQID0gdGhpcy5saW5lRGFzaChmLCB6KVxuICAgICAgICAgICAgICAgIGlmIChsZFApIGN0eC5zZXRMaW5lRGFzaChsZFApXG5cbiAgICAgICAgICAgICAgICAvL2RyYXcgbGluZVxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oY3NbMF1bMF0sIGNzWzBdWzFdKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY3MubGVuZ3RoOyBpKyspIGN0eC5saW5lVG8oY3NbaV1bMF0sIGNzW2ldWzFdKVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVW5zdXBwb3J0ZWQgZ2VvbWV0cnkgdHlwZSBpbiBHZW9KU09OTGF5ZXI6ICcgKyBndClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vLi4uXG4gICAgICAgIGN0eC5zZXRMaW5lRGFzaChbXSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGRhdGEgZm9yIGxhYmVscywgZnJvbSBVUkwgdGhpcy51cmxcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk6dm9pZH0gY2FsbGJhY2tcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGFzeW5jIGxvYWQoY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLnVybCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZhaWxlZCBsb2FkaW5nIGJvdW5kYXJpZXM6IE5vIFVSTCBzcGVjaWZpZWQuICcgKyB0aGlzLnVybClcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdmYWlsZWQnXG4gICAgICAgICAgICB0aGlzLmxhYmVscyA9IFtdXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hlY2sgaWYgZGF0YSBhbHJlYWR5IGxvYWRlZFxuICAgICAgICBpZiAodGhpcy5sb2FkaW5nU3RhdHVzICE9ICdub3RMb2FkZWQnKSByZXR1cm5cblxuICAgICAgICAvL2xvYWQgZGF0YVxuICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnbG9hZGluZydcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZGF0YV8gPSBhd2FpdCBqc29uKHRoaXMudXJsKVxuXG4gICAgICAgICAgICAvKiogQHR5cGUgeyBBcnJheS48b2JqZWN0PiB9ICovXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gZGF0YV8uZmVhdHVyZXNcblxuICAgICAgICAgICAgLy9wcmVwcm9jZXNzL2ZpbHRlclxuICAgICAgICAgICAgaWYgKHRoaXMucHJlcHJvY2Vzcykge1xuICAgICAgICAgICAgICAgIHRoaXMuZnMgPSBbXVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0aGlzLnByZXByb2Nlc3MoYylcbiAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnMucHVzaChjKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9zdG9yZSBsYWJlbHNcbiAgICAgICAgICAgICAgICB0aGlzLmZzID0gZGF0YVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnbG9hZGVkJ1xuXG4gICAgICAgICAgICAvL3JlZHJhd1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIGxvYWRpbmcgYm91bmRhcmllcyBmcm9tICcgKyB0aGlzLnVybClcbiAgICAgICAgICAgIHRoaXMuZnMgPSBbXVxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xuXG4vKipcbiAqIEEgbGF5ZXIsIHdoaWNoIHNwZWNpZmllcyBhIGRhdGFzZXQgdG8gYmUgc2hvd24gd2l0aCBzcGVjaWZpZWQgc3R5bGVzLlxuICpcbiAqIEBtb2R1bGUgbGF5ZXJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEdyaWRMYXllciBleHRlbmRzIExheWVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5EYXRhc2V0fGltcG9ydChcIi4uL2NvcmUvTXVsdGlSZXNvbHV0aW9uRGF0YXNldFwiKS5NdWx0aVJlc29sdXRpb25EYXRhc2V0fSBkYXRhc2V0IFRoZSBkYXRhc2V0IHRvIHNob3cuXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9TdHlsZVwiKS5TdHlsZT59IHN0eWxlcyBUaGUgc3R5bGVzLCBvcmRlcmVkIGluIGRyYXdpbmcgb3JkZXIuXG4gICAgICogQHBhcmFtIHt7dmlzaWJsZT86ZnVuY3Rpb24obnVtYmVyKTpib29sZWFuLGFscGhhPzpmdW5jdGlvbihudW1iZXIpOm51bWJlcixibGVuZE9wZXJhdGlvbj86ZnVuY3Rpb24obnVtYmVyKTpHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24sbWluUGl4ZWxzUGVyQ2VsbD86bnVtYmVyLGNlbGxJbmZvSFRNTD86ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGwpOnN0cmluZ319IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihkYXRhc2V0LCBzdHlsZXMsIG9wdHMgPSB7fSkge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkRhdGFzZXR8aW1wb3J0KFwiLi4vY29yZS9NdWx0aVJlc29sdXRpb25EYXRhc2V0XCIpLk11bHRpUmVzb2x1dGlvbkRhdGFzZXR9ICovXG4gICAgICAgIHRoaXMuZGF0YXNldCA9IGRhdGFzZXRcblxuICAgICAgICAvKiogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL1N0eWxlXCIpLlN0eWxlPn0gKi9cbiAgICAgICAgdGhpcy5zdHlsZXMgPSBzdHlsZXNcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCB3aGVuIHRoZSBkYXRhc2V0IGlzIGEgTXVsdGlSZXNvbHV0aW9uRGF0YXNldC5cbiAgICAgICAgICogSXQgZGVmaW5lcyB0aGUgbWluaW11bSBudW1iZXIgb2YgcGl4ZWxzIGEgZ3JpZCBjZWxsIHNob3VsZCBoYXZlIHRvIHNlbGVjdCB0aGUgZGF0YXNldCB0byBkaXNwbGF5IGJhc2VkIG9uIGl0cyByZXNvbHV0aW9uLlxuICAgICAgICAgKiBBIGxvdyB2YWx1ZSwgbWVhbnMgdGhhdCB0aGUgbWFwIHdpbGwgYmUgbW9yZSBkZXRhaWxsZWQgKHNtYWxsZXIgY2VsbHMpLlxuICAgICAgICAgKiBBIGhpZ2ggdmFsdWUsIG1lYW5zIHRoYXQgdGhlIG1hcCB3aWxsIGJlIGxlc3MgZGV0YWlsbGVkIChsYXJnZXIgY2VsbHMpLlxuICAgICAgICAgKiBUaGlzIHZhbHVlIHNob3VsZCBiZSBoaWdoZXIgdGhhbiAxLCBvdGhlcndpc2UgaXQgbWVhbnMgYSBncmlkIGNlbGwgaXMgc21hbGxlciB0aGFuIHRoZSBzY3JlZW4gcmVzb2x1dGlvbi5cbiAgICAgICAgICogRm9yIG1vcmUgY29tcGxleCBjZWxsIHJlcHJlc2VudGF0aW9ucyB0aGF0IHJlcXVpcmUgc29tZSBtb3JlIG1hcCBzcGFjZSwgdGhpcyB2YWx1ZSBzaG91bGQgYmUgaGlnaGVyLlxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm1pblBpeGVsc1BlckNlbGwgPSBvcHRzLm1pblBpeGVsc1BlckNlbGwgfHwgM1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZnVuY3Rpb24gcmV0dXJuaW5nIGNlbGwgaW5mb3JtYXRpb24gYXMgSFRNTC5cbiAgICAgICAgICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgdG9vbHRpcCBpbmZvcm1hdGlvbi5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsLCBudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jZWxsSW5mb0hUTUwgPSBvcHRzLmNlbGxJbmZvSFRNTCB8fCBHcmlkTGF5ZXIuZGVmYXVsdENlbGxJbmZvSFRNTFxuICAgIH1cblxuICAgIC8qKiAqL1xuICAgIGRyYXcoZ2VvQ2FudmFzLCBsZWdlbmQpIHtcbiAgICAgICAgLy9nZXQgem9vbSBsZXZlbFxuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuICAgICAgICBjb25zdCBjdHggPSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4XG5cbiAgICAgICAgLy9nZXQgbGF5ZXIgZGF0YXNldCBjb21wb25lbnRcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkRhdGFzZXR8dW5kZWZpbmVkfSAqL1xuICAgICAgICBjb25zdCBkc2MgPSB0aGlzLmdldERhdGFzZXQoeilcbiAgICAgICAgaWYgKCFkc2MpIHJldHVyblxuXG4gICAgICAgIC8vbGF1bmNoIGRhdGEgZG93bmxvYWQsIGlmIG5lY2Vzc2FyeVxuICAgICAgICBkc2MuZ2V0RGF0YShnZW9DYW52YXMuZXh0R2VvKVxuXG4gICAgICAgIC8vdXBkYXRlIGRhdGFzZXQgdmlldyBjYWNoZVxuICAgICAgICBkc2MudXBkYXRlVmlld0NhY2hlKGdlb0NhbnZhcy5leHRHZW8pXG5cbiAgICAgICAgLy9kcmF3IGNlbGxzLCBzdHlsZSBieSBzdHlsZVxuICAgICAgICBmb3IgKGNvbnN0IHMgb2YgdGhpcy5zdHlsZXMpIHtcbiAgICAgICAgICAgIC8vY2hlY2sgaWYgc3R5bGUgaXMgdmlzaWJsZVxuICAgICAgICAgICAgaWYgKHMudmlzaWJsZSAmJiAhcy52aXNpYmxlKHopKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3NldCBzdHlsZSBhbHBoYSBhbmQgYmxlbmQgbW9kZVxuICAgICAgICAgICAgLy9UT0RPOiBtdWx0aXBseSBieSBsYXllciBhbHBoYSA/XG4gICAgICAgICAgICBjdHguZ2xvYmFsQWxwaGEgPSBzLmFscGhhID8gcy5hbHBoYSh6KSA6IDEuMFxuICAgICAgICAgICAgaWYgKHMuYmxlbmRPcGVyYXRpb24pIGN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBzLmJsZW5kT3BlcmF0aW9uKHopXG5cbiAgICAgICAgICAgIC8vc2V0IGFmZmluIHRyYW5zZm9ybSB0byBkcmF3IHdpdGggZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzXG4gICAgICAgICAgICBnZW9DYW52YXMuc2V0Q2FudmFzVHJhbnNmb3JtKClcblxuICAgICAgICAgICAgLy9kcmF3IHdpdGggc3R5bGVcbiAgICAgICAgICAgIHMuZHJhdyhkc2MuZ2V0Vmlld0NhY2hlKCksIGdlb0NhbnZhcywgZHNjLmdldFJlc29sdXRpb24oKSlcblxuICAgICAgICAgICAgLy9kcmF3IHN0eWxlIGZpbHRlclxuICAgICAgICAgICAgaWYgKHMuZmlsdGVyQ29sb3IpIHMuZHJhd0ZpbHRlcihnZW9DYW52YXMpXG4gICAgICAgIH1cblxuICAgICAgICAvL2FkZCBsZWdlbmQgZWxlbWVudFxuICAgICAgICBpZiAobGVnZW5kKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHMgb2YgdGhpcy5zdHlsZXMpIHtcbiAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIHN0eWxlIGlzIHZpc2libGVcbiAgICAgICAgICAgICAgICBpZiAocy52aXNpYmxlICYmICFzLnZpc2libGUoeikpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgR3JpZExheWVyLmFkZExlZ2VuZHMobGVnZW5kLCBzLmxlZ2VuZHMpXG5cbiAgICAgICAgICAgICAgICAvL2Nhc2UgZm9yIHN0eWxlcyBvZiBzdHlsZXMsIGxpa2Uga2VybmVsIHNtb290aGluZ1xuICAgICAgICAgICAgICAgIC8vVE9ETyBkbyBiZXR0ZXJcbiAgICAgICAgICAgICAgICBpZiAoc1snc3R5bGVzJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzMiBvZiBzWydzdHlsZXMnXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMyLnZpc2libGUgJiYgIXMyLnZpc2libGUoeikpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICBHcmlkTGF5ZXIuYWRkTGVnZW5kcyhsZWdlbmQsIHMyLmxlZ2VuZHMpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBzdGF0aWMgYWRkTGVnZW5kcyhsZWdlbmRDb21wLCBsZykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShsZykpIGZvciAoY29uc3QgbGdfIG9mIGxnKSB0aGlzLmFkZExlZ2VuZHMobGVnZW5kQ29tcCwgbGdfKVxuICAgICAgICBlbHNlIGxlZ2VuZENvbXAubm9kZSgpLmFwcGVuZChsZy5kaXYubm9kZSgpKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgcmVsZXZhbnQgZGF0YXNldCBjb21wb25lbnQgZm9yIGEgc3BlY2lmaWVkIHpvb20uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gelxuICAgICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuRGF0YXNldHx1bmRlZmluZWR9XG4gICAgICogKi9cbiAgICBnZXREYXRhc2V0KHopIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YXNldC5nZXREYXRhc2V0KHosIHRoaXMubWluUGl4ZWxzUGVyQ2VsbClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQvZ2V0IHN0eWxlIHN0YWNrLlxuICAgICAqXG4gICAgICogQHBhcmFtIHt1bmRlZmluZWR8aW1wb3J0KFwiLi4vY29yZS9TdHlsZVwiKS5TdHlsZXxBcnJheS48aW1wb3J0KFwiLi4vY29yZS9TdHlsZVwiKS5TdHlsZT59IHN0eWxlc1xuICAgICAqIEByZXR1cm5zIHsgdGhpcyB8IEFycmF5LjxpbXBvcnQoXCIuLi9jb3JlL1N0eWxlXCIpLlN0eWxlPiB9XG4gICAgICovXG4gICAgc3R5bGVzXyhzdHlsZXMpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB0aGlzLnN0eWxlc1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHN0eWxlcykpIHRoaXMuc3R5bGVzID0gc3R5bGVzXG4gICAgICAgICAgICBlbHNlIHRoaXMuc3R5bGVzID0gW3N0eWxlc11cbiAgICAgICAgZWxzZSB0aGlzLnN0eWxlcyA9IGFyZ3VtZW50c1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IGZ1bmN0aW9uIHJldHVybmluZyBjZWxsIGluZm9ybWF0aW9uIGFzIEhUTUwuXG4gICAgICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgdG9vbHRpcCBpbmZvcm1hdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGx9IGNlbGxcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBkZWZhdWx0Q2VsbEluZm9IVE1MKGNlbGwpIHtcbiAgICAgICAgY29uc3QgYnVmID0gW11cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY2VsbCkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICd4JykgY29udGludWVcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICd5JykgY29udGludWVcbiAgICAgICAgICAgIGJ1Zi5wdXNoKCc8Yj4nLCBrZXksICc8L2I+JywgJyA6ICcsIGNlbGxba2V5XSwgJzxicj4nKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWYuam9pbignJylcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IExheWVyIH0gZnJvbSAnLi4vY29yZS9MYXllci5qcydcbmltcG9ydCB7IGNzdiB9IGZyb20gJ2QzLWZldGNoJ1xuXG4vKiogQSBsYWJlbC4gVGhlIG5hbWUgaXMgdGhlIHRleHQgdG8gc2hvdy4gKHgseSkgYXJlIHRoZSBjb29yZGluYXRlcyBpbiB0aGUgc2FtZSBDUlMgYXMgdGhlIGdyaWQuXG4gKiBAdHlwZWRlZiB7e25hbWU6IHN0cmluZywgeDpudW1iZXIsIHk6bnVtYmVyIH19IExhYmVsICovXG5cbi8qKlxuICogQSAoZ2VuZXJpYykgbGF5ZXIgZm9yIHBsYWNlbmFtZSBsYWJlbHMsIHRvIGJlIHNob3duIG9uIHRvcCBvZiB0aGUgZ3JpZCBsYXllcnMuXG4gKiBUaGUgaW5wdXQgaXMgYSBDU1YgZmlsZSB3aXRoIHRoZSBwb3NpdGlvbiAoeCwgeSkgb2YgdGhlIGxhYmVscyBhbmQgbmFtZSArIHNvbWUgb3RoZXIgaW5mbyBvbiB0aGUgbGFiZWwgaW1wb3J0YW5jZS5cbiAqIElmIHRoZSBsYWJlbCBkYXRhIGlzIG5vdCBpbiB0aGUgZXhwZWN0ZWQgZm9ybWF0IG9yIGluIHRoZSBzYW1lIENSUyBhcyB0aGUgZ3JpZCwgaXQgY2FuIGJlIGNvcnJlY3RlZCB3aXRoIHRoZSBcInByZXByb2Nlc3NcIiBmdW5jdGlvbi5cbiAqIFRoZSBzZWxlY3Rpb24gb2YgdGhlIGxhYmVsLCB0aGVpciBzdHlsZSAoZm9udCwgd2VpZ2h0LCBldGMuKSBhbmQgY29sb3IgY2FuIGJlIHNwZWNpZmllZCBkZXBlbmRpbmcgb24gdGhlaXIgaW1wb3J0YW5jZSBhbmQgdGhlIHpvb20gbGV2ZWwuXG4gKlxuICogQG1vZHVsZSBsYXllclxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgTGFiZWxMYXllciBleHRlbmRzIExheWVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIFVSTCBvZiB0aGUgbGFiZWwgZGF0YSwgYXMgQ1NWIGZpbGUuXG4gICAgICAgICAqIFRoZSBmaWxlIHNob3VsZCBjb250YWluIHRoZSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBsYWJlbCBzdWNoIGFzIHRoZSB0ZXh0LCB0aGUgcG9zaXRpb24gYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgZGlzcGxheSBvZiB0aGUgbGFiZWwgYWNjb3JkaW5nIHRvIHRoZSB6b29tIGxldmVsLlxuICAgICAgICAgKiBJZiBuZWNlc3NhcnksIHRoaXMgZGF0YSBjYW4gYmUgcmVmb3JtYXRlZCB3aXRoIHRoZSAncHJlcHJvY2VzcycgcGFyYW1ldGVyLlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnVybCA9IG9wdHMudXJsXG5cbiAgICAgICAgLyoqIFNwZWNpZnkgaWYgYW5kIGhvdyBhIGxhYmVsIHNob3VsZCBiZSBkcmF3biwgZGVwZW5kaW5nIG9uIGl0cyBpbXBvcnRhbmNlIGFuZCB0aGUgem9vbSBsZXZlbC5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKExhYmVsLG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnN0eWxlID0gb3B0cy5zdHlsZSB8fCAoKCkgPT4gJzEuMmVtIEFyaWFsJylcblxuICAgICAgICAvKiogU3BlY2lmeSB0aGUgbGFiZWwgY29sb3IsIGRlcGVuZGluZyBvbiBpdHMgaW1wb3J0YW5jZSBhbmQgdGhlIHpvb20gbGV2ZWwuXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihMYWJlbCxudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKG9wdHMuZGFyayA/ICgpID0+ICd3aGl0ZScgOiAoKSA9PiAnYmxhY2snKVxuXG4gICAgICAgIC8qKiBTcGVjaWZ5IHRoZSBsYWJlbCBoYWxvIGNvbG9yLCBkZXBlbmRpbmcgb24gaXRzIGltcG9ydGFuY2UgYW5kIHRoZSB6b29tIGxldmVsLlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oTGFiZWwsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuaGFsb0NvbG9yID0gb3B0cy5oYWxvQ29sb3IgfHwgKG9wdHMuZGFyayA/ICgpID0+ICdibGFjaycgOiAoKSA9PiAnd2hpdGUnKVxuXG4gICAgICAgIC8qKiBTcGVjaWZ5IHRoZSBsYWJlbCBoYWxvIHdpZHRoLCBkZXBlbmRpbmcgb24gaXRzIGltcG9ydGFuY2UgYW5kIHRoZSB6b29tIGxldmVsLlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oTGFiZWwsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuaGFsb1dpZHRoID0gb3B0cy5oYWxvV2lkdGggfHwgKCgpID0+IDIuNSlcblxuICAgICAgICAvKiogVGhlIGFuY2hvciB3aGVyZSB0byBkcmF3IHRoZSB0ZXh0LCBmcm9tIGxhYmVsIHBvc2l0aW9uLiBTZWUgSFRNTC1jYW52YXMgdGV4dEFsaWduIHByb3BlcnR5LlxuICAgICAgICAgKiBcImxlZnRcIiB8fCBcInJpZ2h0XCIgfHwgXCJjZW50ZXJcIiB8fCBcInN0YXJ0XCIgfHwgXCJlbmRcIlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7Q2FudmFzVGV4dEFsaWdufSAqL1xuICAgICAgICB0aGlzLnRleHRBbGlnbiA9IG9wdHMudGV4dEFsaWduIHx8ICdzdGFydCdcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxudW1iZXI+fSAqL1xuICAgICAgICB0aGlzLm9mZnNldFBpeCA9IG9wdHMub2Zmc2V0UGl4IHx8IFs1LCA1XVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHByZXByb2Nlc3MgdG8gcnVuIG9uIGVhY2ggbGFiZWwgYWZ0ZXIgbG9hZGluZy5cbiAgICAgICAgICogSXQgY2FuIGJlIHVzZWQgdG8gYXBwbHkgc29tZSBzcGVjaWZpYyB0cmVhdG1lbnQgYmVmb3JlLCBmb3JtYXQgdGhlIGxhYmVsIGRhdGEsIHByb2plY3QgY29vcmRpbmF0ZXMsIGV0Yy5cbiAgICAgICAgICogUmV0dXJuIGZhbHNlIGlmIHRoZSBsYWJlbCBzaG91bGQgbm90IGJlIGtlcHQuXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihMYWJlbCk6Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzID0gb3B0cy5wcmVwcm9jZXNzXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48TGFiZWw+IHwgdW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmxhYmVscyA9IHVuZGVmaW5lZFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnbm90TG9hZGVkJ1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgdGhlIGxhYmVsIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGRyYXcoZ2VvQ2FudmFzKSB7XG4gICAgICAgIC8vbG9hZCBsYWJlbHMsIGlmIG5vdCBkb25lIHlldC5cbiAgICAgICAgaWYgKCF0aGlzLmxhYmVscykge1xuICAgICAgICAgICAgdGhpcy5sb2FkKGdlb0NhbnZhcy5yZWRyYXcpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICAvL3RleHQgYWxpZ25cbiAgICAgICAgY3R4LnRleHRBbGlnbiA9IHRoaXMudGV4dEFsaWduIHx8ICdzdGFydCdcblxuICAgICAgICAvL2xpbmUgam9pbiBhbmQgY2FwXG4gICAgICAgIGN0eC5saW5lSm9pbiA9ICdiZXZlbCcgLy98fCBcInJvdW5kXCIgfHwgXCJtaXRlclwiO1xuICAgICAgICBjdHgubGluZUNhcCA9ICdidXR0JyAvL3x8IFwicm91bmRcIiB8fCBcInNxdWFyZVwiO1xuXG4gICAgICAgIC8vZHJhdyBpbiBwaXggY29vcmRpbmF0ZXNcbiAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuXG4gICAgICAgIC8vZHJhdyBsYWJlbHMsIG9uZSBieSBvbmVcbiAgICAgICAgZm9yIChjb25zdCBsYiBvZiB0aGlzLmxhYmVscykge1xuICAgICAgICAgICAgLy9nZXQgbGFiZWwgc3R5bGVcbiAgICAgICAgICAgIGNvbnN0IHN0ID0gdGhpcy5zdHlsZShsYiwgeilcbiAgICAgICAgICAgIGlmICghc3QpIGNvbnRpbnVlXG4gICAgICAgICAgICBjdHguZm9udCA9IHN0XG5cbiAgICAgICAgICAgIC8vY2hlY2sgbGFiZWwgd2l0aGluIHRoZSB2aWV3LCB0byBiZSBkcmF3blxuICAgICAgICAgICAgaWYgKCFnZW9DYW52YXMudG9EcmF3KGxiKSkgY29udGludWVcblxuICAgICAgICAgICAgLy9wb3NpdGlvblxuICAgICAgICAgICAgY29uc3QgeFAgPSBnZW9DYW52YXMuZ2VvVG9QaXhYKGxiLngpICsgdGhpcy5vZmZzZXRQaXhbMF1cbiAgICAgICAgICAgIGNvbnN0IHlQID0gZ2VvQ2FudmFzLmdlb1RvUGl4WShsYi55KSAtIHRoaXMub2Zmc2V0UGl4WzFdXG5cbiAgICAgICAgICAgIC8vbGFiZWwgc3Ryb2tlLCBmb3IgdGhlIGhhbG9cbiAgICAgICAgICAgIGlmICh0aGlzLmhhbG9Db2xvciAmJiB0aGlzLmhhbG9XaWR0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhjID0gdGhpcy5oYWxvQ29sb3IobGIsIHopXG4gICAgICAgICAgICAgICAgY29uc3QgaHcgPSB0aGlzLmhhbG9XaWR0aChsYiwgeilcbiAgICAgICAgICAgICAgICBpZiAoaGMgJiYgaHcgJiYgaHcgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGhjXG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSBod1xuICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlVGV4dChsYi5uYW1lLCB4UCwgeVApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL2xhYmVsIGZpbGxcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbG9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvcihsYiwgeilcbiAgICAgICAgICAgICAgICBpZiAoY29sKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBjb2xcbiAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxUZXh0KGxiLm5hbWUsIHhQLCB5UClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGRhdGEgZm9yIGxhYmVscywgZnJvbSBVUkwgdGhpcy51cmxcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk6dm9pZH0gY2FsbGJhY2tcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGFzeW5jIGxvYWQoY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLnVybCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZhaWxlZCBsb2FkaW5nIGxhYmVsczogTm8gVVJMIHNwZWNpZmllZC4gJyArIHRoaXMudXJsKVxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcbiAgICAgICAgICAgIHRoaXMubGFiZWxzID0gW11cbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBkYXRhIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIGlmICh0aGlzLmxvYWRpbmdTdGF0dXMgIT0gJ25vdExvYWRlZCcpIHJldHVyblxuXG4gICAgICAgIC8vbG9hZCBkYXRhXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdsb2FkaW5nJ1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvKiogQHR5cGUgeyBBcnJheS48TGFiZWw+IH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBjc3YodGhpcy51cmwpXG5cbiAgICAgICAgICAgIC8vcHJlcHJvY2Vzcy9maWx0ZXJcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXByb2Nlc3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVscyA9IFtdXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IHRoaXMucHJlcHJvY2VzcyhjKVxuICAgICAgICAgICAgICAgICAgICBpZiAoYiA9PSBmYWxzZSkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbHMucHVzaChjKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9zdG9yZSBsYWJlbHNcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVscyA9IGRhdGFcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2xvYWRlZCdcblxuICAgICAgICAgICAgLy9yZWRyYXdcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZhaWxlZCBsb2FkaW5nIGxhYmVscyBmcm9tICcgKyB0aGlzLnVybClcbiAgICAgICAgICAgIHRoaXMubGFiZWxzID0gW11cbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdmYWlsZWQnXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJy4uL2NvcmUvTGVnZW5kLmpzJ1xuXG4vKipcbiAqIEEgbGVnZW5kIGVsZW1lbnQgZm9yIGNvbG9yIGNhdGVncm9yaWVzLlxuICpcbiAqIEBtb2R1bGUgbGVnZW5kXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2xvckNhdGVnb3J5TGVnZW5kIGV4dGVuZHMgTGVnZW5kIHtcbiAgICAvKiogQHBhcmFtIHtPYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLy9jb2wvY2F0ZWdvcmllcyBhcnJheSwgaW4gZGlzcGxheSBvcmRlclxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge0FycmF5Ljxbc3RyaW5nLHN0cmluZ10+fSAqL1xuICAgICAgICB0aGlzLmNvbG9yTGFiZWwgPSBvcHRzLmNvbG9yTGFiZWwgfHwgW1snZ3JheScsICctJ11dXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb3JlL1N0eWxlLmpzXCIpLlNoYXBlfSAqL1xuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAnY2lyY2xlJ1xuICAgICAgICB0aGlzLmRpbWVuc2lvbiA9IG9wdHMuZGltZW5zaW9uIHx8IHsgcjogOCB9XG4gICAgICAgIHRoaXMuc3Ryb2tlQ29sb3IgPSBvcHRzLnN0cm9rZUNvbG9yIHx8ICdncmF5J1xuICAgICAgICB0aGlzLnN0cm9rZVdpZHRoID0gb3B0cy5zdHJva2VXaWR0aCB8fCAxXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICovXG4gICAgdXBkYXRlKCkge1xuICAgICAgICAvL2NsZWFyXG4gICAgICAgIHRoaXMuZGl2LnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpXG5cbiAgICAgICAgLy90aXRsZVxuICAgICAgICB0aGlzLm1ha2VUaXRsZSgpXG5cbiAgICAgICAgLy9jYXRlZ29yaWVzXG4gICAgICAgIGNvbnN0IG5iID0gdGhpcy5jb2xvckxhYmVsLmxlbmd0aFxuICAgICAgICBpZiAobmIgPT0gMCkgcmV0dXJuXG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjYXQgPSB0aGlzLmNvbG9yTGFiZWxbaV1cblxuICAgICAgICAgICAgLy9tYWtlIGRpdiBmb3IgY2F0ZWdvcnlcbiAgICAgICAgICAgIGNvbnN0IGQgPSB0aGlzLmRpdi5hcHBlbmQoJ2RpdicpXG4gICAgICAgICAgICAvL3RvIGVuYWJsZSB2ZXJ0aWNhbCBjZW50ZXJpbmdcbiAgICAgICAgICAgIC8vLnN0eWxlKFwicG9zaXRpb25cIiwgXCJyZWxhdGl2ZVwiKVxuXG4gICAgICAgICAgICBjb25zdCBzdyA9IHRoaXMuc3Ryb2tlV2lkdGhcblxuICAgICAgICAgICAgLy9kcmF3IGdyYXBoaWMgZWxlbWVudDogYm94IC8gY2lyY2xlXG4gICAgICAgICAgICBpZiAodGhpcy5zaGFwZSA9PT0gJ3NxdWFyZScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoID0gdGhpcy5kaW1lbnNpb24uaCB8fCAxNVxuICAgICAgICAgICAgICAgIGNvbnN0IHcgPSB0aGlzLmRpbWVuc2lvbi53IHx8IDIwXG4gICAgICAgICAgICAgICAgZC5hcHBlbmQoJ2RpdicpXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdpbmxpbmUnKVxuXG4gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3N2ZycpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHcgKyAyICogc3cpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoICsgMiAqIHN3KVxuXG4gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3JlY3QnKVxuICAgICAgICAgICAgICAgICAgICAuYXR0cigneCcsIHN3KVxuICAgICAgICAgICAgICAgICAgICAuYXR0cigneScsIHN3KVxuICAgICAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCB3KVxuICAgICAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgaClcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgY2F0WzBdKVxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuc3Ryb2tlQ29sb3IpXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaGFwZSA9PT0gJ2NpcmNsZScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy5kaW1lbnNpb24uciB8fCA4XG4gICAgICAgICAgICAgICAgY29uc3QgaCA9IDIgKiByICsgMiAqIHN3XG4gICAgICAgICAgICAgICAgZC5hcHBlbmQoJ2RpdicpXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdpbmxpbmUnKVxuXG4gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3N2ZycpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIGgpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoKVxuXG4gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ2NpcmNsZScpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdjeCcsIHIgKyBzdylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2N5JywgciArIHN3KVxuICAgICAgICAgICAgICAgICAgICAuYXR0cigncicsIHIpXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsIGNhdFswXSlcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLnN0cm9rZUNvbG9yKVxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIHRoaXMuc3Ryb2tlV2lkdGgpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaGFwZTonICsgdGhpcy5zaGFwZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy93cml0ZSBsYWJlbCB0ZXh0XG4gICAgICAgICAgICBkLmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgICAgICAvL3Nob3cgb24gcmlnaHQgb2YgZ3JhcGhpY1xuICAgICAgICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdpbmxpbmUnKVxuXG4gICAgICAgICAgICAgICAgLy9jZW50ZXIgdmVydGljYWxseVxuICAgICAgICAgICAgICAgIC8vLnN0eWxlKFwicG9zaXRpb25cIiwgXCJhYnNvbHV0ZVwiKS5zdHlsZShcInRvcFwiLCBcIjBcIikuc3R5bGUoXCJib3R0b21cIiwgXCIwXCIpXG5cbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3BhZGRpbmctbGVmdCcsICc1cHgnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5sYWJlbEZvbnRTaXplKVxuICAgICAgICAgICAgICAgIC50ZXh0KGNhdFsxXSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi4vY29yZS9MZWdlbmQuanMnXG5cbi8qKlxuICogQSBsZWdlbmQgZWxlbWVudCBmb3IgZGlzY3JldGUgY29sb3Igc3R5bGUuXG4gKiBJbnNwaXJhdGlvbjogaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0BkMy9jb2xvci1sZWdlbmRcbiAqXG4gKiBAbW9kdWxlIGxlZ2VuZFxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQ29sb3JEaXNjcmV0ZUxlZ2VuZCBleHRlbmRzIExlZ2VuZCB7XG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBAcHJpdmF0ZSBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL1N0eWxlJykuVmlld1NjYWxlKTpBcnJheS48c3RyaW5nPn0gKi9cbiAgICAgICAgdGhpcy5jb2xvcnMgPSBvcHRzLmNvbG9yc1xuICAgICAgICAvKiogQHByaXZhdGUgQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9TdHlsZScpLlZpZXdTY2FsZSk6QXJyYXkuPG51bWJlcj59ICovXG4gICAgICAgIHRoaXMuYnJlYWtzID0gb3B0cy5icmVha3NcblxuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAzMDBcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAxNVxuXG4gICAgICAgIHRoaXMudGlja1NpemUgPSBvcHRzLnRpY2tTaXplIHx8IDNcblxuICAgICAgICAvL2xhYmVsXG4gICAgICAgIHRoaXMuaW52ZXJ0ID0gb3B0cy5pbnZlcnRcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3t2aWV3U2NhbGU6aW1wb3J0KCcuLi9jb3JlL1N0eWxlJykuVmlld1NjYWxlfSB9IG9wdHNcbiAgICAgKi9cbiAgICB1cGRhdGUob3B0cykge1xuICAgICAgICAvL2NsZWFyXG4gICAgICAgIHRoaXMuZGl2LnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpXG5cbiAgICAgICAgLy90aXRsZVxuICAgICAgICB0aGlzLm1ha2VUaXRsZSgpXG5cbiAgICAgICAgLy9nZXQgY29sb3JzIGFuZCBicmVha3NcbiAgICAgICAgY29uc3QgY29sb3JzID0gdGhpcy5jb2xvcnMob3B0cy52aWV3U2NhbGUpXG4gICAgICAgIGNvbnN0IGJyZWFrcyA9IHRoaXMuYnJlYWtzKG9wdHMudmlld1NjYWxlKVxuICAgICAgICBpZiAoIWJyZWFrcykgcmV0dXJuXG5cbiAgICAgICAgLy9jbGFzc2VzXG4gICAgICAgIGNvbnN0IG5iID0gY29sb3JzLmxlbmd0aFxuICAgICAgICBpZiAobmIgPT0gMCkgcmV0dXJuXG4gICAgICAgIGNvbnN0IHcgPSB0aGlzLndpZHRoIC8gbmJcblxuICAgICAgICAvL21ha2Ugc3ZnIGVsZW1lbnRcbiAgICAgICAgY29uc3Qgc3ZnID0gdGhpcy5kaXZcbiAgICAgICAgICAgIC5hcHBlbmQoJ3N2ZycpXG4gICAgICAgICAgICAuYXR0cignd2lkdGgnLCB0aGlzLndpZHRoKVxuICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHRoaXMuaGVpZ2h0ICsgdGhpcy50aWNrU2l6ZSArIDIgKyAxMClcblxuICAgICAgICAvL2RyYXcgZ3JhcGhpYyBlbGVtZW50c1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5iOyBpKyspIHtcbiAgICAgICAgICAgIHN2Zy5hcHBlbmQoJ3JlY3QnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgaSAqIHcpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3knLCAwKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHcpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHRoaXMuaGVpZ2h0KVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsIGNvbG9yc1tpXSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdGljayBsaW5lXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbmI7IGkrKykge1xuICAgICAgICAgICAgc3ZnLmFwcGVuZCgnbGluZScpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gxJywgdyAqIGkpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kxJywgMClcbiAgICAgICAgICAgICAgICAuYXR0cigneDInLCB3ICogaSlcbiAgICAgICAgICAgICAgICAuYXR0cigneTInLCB0aGlzLmhlaWdodCArIHRoaXMudGlja1NpemUpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAnYmxhY2snKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9sYWJlbHNcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBuYjsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbGFiZWwgPSBicmVha3NbaSAtIDFdXG4gICAgICAgICAgICBpZiAoaXNOYU4obGFiZWwpIHx8IGxhYmVsID09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgICAgICAgIGlmICh0aGlzLmxhYmVsRm9ybWF0KSBsYWJlbCA9IHRoaXMubGFiZWxGb3JtYXQobGFiZWwsIGkpXG5cbiAgICAgICAgICAgIC8vbGFiZWxcbiAgICAgICAgICAgIHN2Zy5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsICd0aWNrbGFiZWxfJyArIGkpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCB3ICogaSlcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIHRoaXMuaGVpZ2h0ICsgdGhpcy50aWNrU2l6ZSArIDIpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLmxhYmVsRm9udFNpemUpXG4gICAgICAgICAgICAgICAgLy8uc3R5bGUoXCJmb250LXdlaWdodFwiLCBcImJvbGRcIilcbiAgICAgICAgICAgICAgICAvLy5zdHlsZShcImZvbnQtZmFtaWx5XCIsIFwiQXJpYWxcIilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdhbGlnbm1lbnQtYmFzZWxpbmUnLCAndG9wJylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2RvbWluYW50LWJhc2VsaW5lJywgJ2hhbmdpbmcnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgncG9pbnRlci1ldmVudHMnLCAnbm9uZScpXG4gICAgICAgICAgICAgICAgLnRleHQobGFiZWwpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJy4uL2NvcmUvTGVnZW5kLmpzJ1xuXG4vKipcbiAqIEEgbGVnZW5kIGVsZW1lbnQgZm9yIGNvbnRpbnVvdXMgY29sb3Igc3R5bGUuXG4gKiBJbnNwaXJhdGlvbjogaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0BkMy9jb2xvci1sZWdlbmRcbiAqXG4gKiBAbW9kdWxlIGxlZ2VuZFxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQ29sb3JMZWdlbmQgZXh0ZW5kcyBMZWdlbmQge1xuICAgIC8qKiBAcGFyYW0ge09iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvL2EgZnVuY3Rpb24gWzAsMV0tPmNvbG9yIGZvciBjb250aW51b3VzIGNvbG9ycy5cbiAgICAgICAgLy9pdCBjYW4gdGFrZSBhcyBzZWNvbmQgYXJndW1lbnQgdGhlIHZpZXdzY2FsZS5cbiAgICAgICAgdGhpcy5jb2xvclNjYWxlID0gb3B0cy5jb2xvclNjYWxlXG5cbiAgICAgICAgLy9mdW5jdGlvbiAodFswLDFdKSAtPiB2YWx1ZSAoZm9yIGxhYmVsIHRleHQpXG4gICAgICAgIC8vaXQgY2FuIHRha2UgYXMgc2Vjb25kIGFyZ3VtZW50IHRoZSB2aWV3c2NhbGUuXG4gICAgICAgIHRoaXMudGV4dFNjYWxlID0gb3B0cy50ZXh0U2NhbGUgfHwgKCh0KSA9PiB0KVxuXG4gICAgICAgIHRoaXMubWFyZ2luID0gb3B0cy5tYXJnaW4gfHwgNVxuXG4gICAgICAgIC8vcmVwbGFjZSB3aXRoIGxhYmVscyA/XG4gICAgICAgIHRoaXMudGlja1NpemUgPSBvcHRzLnRpY2tTaXplIHx8IDZcbiAgICAgICAgdGhpcy50aWNrcyA9IG9wdHMudGlja3MgfHwgTWF0aC5mbG9vcih0aGlzLndpZHRoIC8gNTApXG4gICAgICAgIHRoaXMudGlja0Zvcm1hdCA9IG9wdHMudGlja0Zvcm1hdFxuICAgICAgICB0aGlzLnRpY2tVbml0ID0gb3B0cy50aWNrVW5pdFxuXG4gICAgICAgIHRoaXMuZm9udFNpemUgPSBvcHRzLmZvbnRTaXplIHx8ICcwLjhlbSdcbiAgICAgICAgdGhpcy5pbnZlcnQgPSBvcHRzLmludmVydFxuXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8IDMwMFxuICAgICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0IHx8IDE1XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHt7dmlld1NjYWxlOmltcG9ydCgnLi4vY29yZS9TdHlsZScpLlZpZXdTY2FsZX0gfSBvcHRzXG4gICAgICovXG4gICAgdXBkYXRlKG9wdHMpIHtcbiAgICAgICAgLy9jbGVhclxuICAgICAgICB0aGlzLmRpdi5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxuXG4gICAgICAgIC8vdGl0bGVcbiAgICAgICAgdGhpcy5tYWtlVGl0bGUoKVxuXG4gICAgICAgIGNvbnN0IHN2Z1cgPSB0aGlzLndpZHRoICsgMiAqIHRoaXMubWFyZ2luXG4gICAgICAgIGNvbnN0IHN2Z0ggPSB0aGlzLmhlaWdodCArIHRoaXMubWFyZ2luICsgdGhpcy50aWNrU2l6ZSArIDEwXG4gICAgICAgIGNvbnN0IHN2ZyA9IHRoaXMuZGl2LmFwcGVuZCgnc3ZnJykuYXR0cignd2lkdGgnLCBzdmdXKS5hdHRyKCdoZWlnaHQnLCBzdmdIKVxuICAgICAgICAvLyAgPHJlY3Qgd2lkdGg9XCIzMDBcIiBoZWlnaHQ9XCIxMDBcIiBzdHlsZT1cImZpbGw6cmdiKDAsMCwyNTUpO3N0cm9rZS13aWR0aDozO3N0cm9rZTpyZ2IoMCwwLDApXCIgLz5cblxuICAgICAgICBjb25zdCBnID0gc3ZnLmFwcGVuZCgnZycpLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIHRoaXMubWFyZ2luICsgJyAnICsgMCArICcpJylcblxuICAgICAgICAvL2RyYXcgY29sb3IgYmFyXG4gICAgICAgIGNvbnN0IHcgPSB0aGlzLndpZHRoLFxuICAgICAgICAgICAgaCA9IHRoaXMuaGVpZ2h0XG4gICAgICAgIGNvbnN0IHN0ZXAgPSA1XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdzsgaSArPSBzdGVwKSB7XG4gICAgICAgICAgICBsZXQgdCA9IGkgLyAodyAtIDEpXG4gICAgICAgICAgICBpZiAodGhpcy5pbnZlcnQpIHQgPSAxIC0gdFxuICAgICAgICAgICAgZy5hcHBlbmQoJ3JlY3QnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgaSlcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIDApXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgc3RlcClcbiAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgaClcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCB0aGlzLmNvbG9yU2NhbGUodCwgb3B0cy52aWV3U2NhbGUpKVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRpY2tzOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB0ID0gaSAvICh0aGlzLnRpY2tzIC0gMSlcblxuICAgICAgICAgICAgLy90aWNrIGxpbmVcbiAgICAgICAgICAgIGcuYXBwZW5kKCdsaW5lJylcbiAgICAgICAgICAgICAgICAuYXR0cigneDEnLCB3ICogdClcbiAgICAgICAgICAgICAgICAuYXR0cigneTEnLCAwKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd4MicsIHcgKiB0KVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5MicsIGggKyB0aGlzLnRpY2tTaXplKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJ2JsYWNrJylcblxuICAgICAgICAgICAgLy9wcmVwYXJlIHRpY2sgbGFiZWxcbiAgICAgICAgICAgIGcuYXBwZW5kKCd0ZXh0JylcbiAgICAgICAgICAgICAgICAuYXR0cignaWQnLCAndGlja2xhYmVsXycgKyBpKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgdyAqIHQpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3knLCBoICsgdGhpcy50aWNrU2l6ZSArIDIpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLmZvbnRTaXplKVxuICAgICAgICAgICAgICAgIC8vLnN0eWxlKFwiZm9udC13ZWlnaHRcIiwgXCJib2xkXCIpXG4gICAgICAgICAgICAgICAgLy8uc3R5bGUoXCJmb250LWZhbWlseVwiLCBcIkFyaWFsXCIpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsIGkgPT0gMCA/ICdzdGFydCcgOiBpID09IHRoaXMudGlja3MgLSAxID8gJ2VuZCcgOiAnbWlkZGxlJylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2FsaWdubWVudC1iYXNlbGluZScsICd0b3AnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZG9taW5hbnQtYmFzZWxpbmUnLCAnaGFuZ2luZycpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdwb2ludGVyLWV2ZW50cycsICdub25lJylcbiAgICAgICAgICAgIC8vLnRleHQoXCItXCIpXG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSB0aWNrIGxhYmVsc1xuXG4gICAgICAgIC8vbGFiZWwgdGV4dCBmb3JtYXRcbiAgICAgICAgY29uc3QgZiA9IHRoaXMudGlja0Zvcm1hdCAmJiB0aGlzLnRpY2tGb3JtYXQgIT0gJ3RleHQnID8gdGhpcy50aWNrRm9ybWF0IDogKHYpID0+IHZcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRpY2tzOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB0ID0gaSAvICh0aGlzLnRpY2tzIC0gMSlcblxuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMudGV4dFNjYWxlKHQsIG9wdHMudmlld1NjYWxlKVxuICAgICAgICAgICAgY29uc3QgdGV4dCA9ICh2ID8gZih2KSA6ICcwJykgKyAodGhpcy50aWNrVW5pdCA/IHRoaXMudGlja1VuaXQgOiAnJylcbiAgICAgICAgICAgIGlmICh0ZXh0ID09IHVuZGVmaW5lZCkgY29udGludWVcblxuICAgICAgICAgICAgLy90aWNrIGxhYmVsXG4gICAgICAgICAgICB0aGlzLmRpdi5zZWxlY3QoJyMnICsgJ3RpY2tsYWJlbF8nICsgaSkudGV4dCh0ZXh0KVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBMZWdlbmQgfSBmcm9tICcuLi9jb3JlL0xlZ2VuZC5qcydcblxuLyoqXG4gKiBBIGxlZ2VuZCBlbGVtZW50IGZvciBzZWdtZW50IG9yaWVudGF0aW9uLlxuICpcbiAqIEBtb2R1bGUgbGVnZW5kXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBPcmllbnRhdGlvbkxlZ2VuZCBleHRlbmRzIExlZ2VuZCB7XG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8vb3JpZW50YXRpb25cbiAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IG9wdHMub3JpZW50YXRpb24gfHwgMFxuICAgICAgICAvL2NvbG9yXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgocmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA9PiAnZ3JheScpXG4gICAgICAgIC8vd2lkdGhcbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgKChyZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpID0+IDMgKiB6KVxuICAgICAgICAvL2xlbmd0aFxuICAgICAgICB0aGlzLmxlbmd0aCA9IG9wdHMubGVuZ3RoIHx8ICgocmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA9PiByZXNvbHV0aW9uKVxuXG4gICAgICAgIC8vbGFiZWxcbiAgICAgICAgdGhpcy5sYWJlbCA9IG9wdHMubGFiZWwgfHwgJy0nXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHt7IHN0eWxlOiBpbXBvcnQoXCIuLi9zdHlsZS9TZWdtZW50U3R5bGUuanNcIikuU2VnbWVudFN0eWxlLCByZXNvbHV0aW9uOiBudW1iZXIsIHo6IG51bWJlciwgdmlld1NjYWxlOm9iamVjdCB9fSBvcHRzXG4gICAgICovXG4gICAgdXBkYXRlKG9wdHMpIHtcbiAgICAgICAgLy9jbGVhclxuICAgICAgICB0aGlzLmRpdi5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxuXG4gICAgICAgIC8vdGl0bGVcbiAgICAgICAgdGhpcy5tYWtlVGl0bGUoKVxuXG4gICAgICAgIGNvbnN0IGQgPSB0aGlzLmRpdi5hcHBlbmQoJ2RpdicpXG5cbiAgICAgICAgLy9jb21wdXRlIHNlZ21lbnQgY29sb3IsIHdpZHRoIGFuZCBsZW5ndGhcbiAgICAgICAgY29uc3QgY29sb3IgPSB0aGlzLmNvbG9yKG9wdHMucmVzb2x1dGlvbiwgb3B0cy56LCBvcHRzLnZpZXdTY2FsZSlcbiAgICAgICAgY29uc3Qgd2lkdGhQaXggPSB0aGlzLndpZHRoKG9wdHMucmVzb2x1dGlvbiwgb3B0cy56LCBvcHRzLnZpZXdTY2FsZSkgLyBvcHRzLnpcbiAgICAgICAgY29uc3QgbGVuZ3RoUGl4ID0gdGhpcy5sZW5ndGgob3B0cy5yZXNvbHV0aW9uLCBvcHRzLnosIG9wdHMudmlld1NjYWxlKSAvIG9wdHMuelxuXG4gICAgICAgIC8vZHJhdyBTVkcgc2VnbWVudFxuICAgICAgICBjb25zdCBzdmdTID0gTWF0aC5tYXgobGVuZ3RoUGl4LCB3aWR0aFBpeClcbiAgICAgICAgY29uc3Qgc3ZnID0gZC5hcHBlbmQoJ3N2ZycpLmF0dHIoJ3dpZHRoJywgc3ZnUykuYXR0cignaGVpZ2h0Jywgc3ZnUykuc3R5bGUoJycsICdpbmxpbmUtYmxvY2snKVxuXG4gICAgICAgIGNvbnN0IGNvcyA9IE1hdGguY29zKCgtdGhpcy5vcmllbnRhdGlvbiAqIE1hdGguUEkpIC8gMTgwKVxuICAgICAgICBjb25zdCBzaW4gPSBNYXRoLnNpbigoLXRoaXMub3JpZW50YXRpb24gKiBNYXRoLlBJKSAvIDE4MClcbiAgICAgICAgY29uc3QgZGMgPSBzdmdTICogMC41LFxuICAgICAgICAgICAgbDIgPSBsZW5ndGhQaXggKiAwLjVcbiAgICAgICAgc3ZnLmFwcGVuZCgnbGluZScpXG4gICAgICAgICAgICAuYXR0cigneDEnLCBkYyAtIGNvcyAqIGwyKVxuICAgICAgICAgICAgLmF0dHIoJ3kxJywgZGMgLSBzaW4gKiBsMilcbiAgICAgICAgICAgIC5hdHRyKCd4MicsIGRjICsgY29zICogbDIpXG4gICAgICAgICAgICAuYXR0cigneTInLCBkYyArIHNpbiAqIGwyKVxuICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCBjb2xvcilcbiAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgd2lkdGhQaXgpXG5cbiAgICAgICAgLy9sYWJlbFxuICAgICAgICBkLmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdpbmxpbmUnKVxuICAgICAgICAgICAgLnN0eWxlKCdwYWRkaW5nLWxlZnQnLCAnNXB4JylcbiAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5sYWJlbEZvbnRTaXplKVxuICAgICAgICAgICAgLnRleHQodGhpcy5sYWJlbCArICh0aGlzLmxhYmVsVW5pdFRleHQgPyAnICcgOiAnJykgKyB0aGlzLmxhYmVsVW5pdFRleHQpXG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSBvcmllbnRhdGlvbnNcbiAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz59IGxhYmVsc1xuICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAqIEByZXR1cm5zICB7IEFycmF5LjxPcmllbnRhdGlvbkxlZ2VuZD4gfVxuICovXG5leHBvcnQgZnVuY3Rpb24gb3JpZW50YXRpb25MZWdlbmQob3JpZW50YXRpb25zLCBsYWJlbHMsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGxlZ2VuZHMgPSBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3JpZW50YXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG9wdHMudGl0bGUgPSBpID09IDAgPyBvcHRzLnRpdGxlIDogdW5kZWZpbmVkXG4gICAgICAgIG9wdHMub3JpZW50YXRpb24gPSBvcmllbnRhdGlvbnNbaV1cbiAgICAgICAgb3B0cy5sYWJlbCA9IGxhYmVsc1tpXVxuICAgICAgICBsZWdlbmRzLnB1c2gobmV3IE9yaWVudGF0aW9uTGVnZW5kKG9wdHMpKVxuICAgIH1cbiAgICByZXR1cm4gbGVnZW5kc1xufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBMZWdlbmQgfSBmcm9tICcuLi9jb3JlL0xlZ2VuZC5qcydcbmltcG9ydCB7IG5pY2UgfSBmcm9tICcuLi91dGlscy91dGlscy5qcydcbmltcG9ydCB7IG1heCB9IGZyb20gJ2QzLWFycmF5J1xuXG4vKipcbiAqIEEgbGVnZW5kIGVsZW1lbnQgZm9yIHByb3BvcnRpb25hbCBzeW1ib2xzLlxuICpcbiAqIEBtb2R1bGUgbGVnZW5kXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTaXplTGVnZW5kIGV4dGVuZHMgTGVnZW5kIHtcbiAgICAvKiogQHBhcmFtIHtPYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB0ZXh0IGxhYmVsLCBmcm9tIHRoZSB2aWV3IHNjYWxlIGFuZCBsaXN0IG9mIGNlbGxzLCByZXNvbHV0aW9uIGFuZCB6b29tXG4gICAgICAgICAqICBAdHlwZSB7IGZ1bmN0aW9uKG9iamVjdCwgQXJyYXkuPGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbD4sIG51bWJlciwgbnVtYmVyKToobnVtYmVyfHN0cmluZykgfSAqL1xuICAgICAgICB0aGlzLmxhYmVsID0gb3B0cy5sYWJlbCB8fCB1bmRlZmluZWRcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgdGhlIGxlZ2VuZCBzeW1ib2wsIGluIGdlbyBVb00sIGZyb20gdGhlIHZpZXdzY2FsZSwgcmVzb2x1dGlvbiBhbmQgem9vbVxuICAgICAgICAgKiAgQHR5cGUgeyBmdW5jdGlvbihvYmplY3QsIG51bWJlciwgbnVtYmVyKTpudW1iZXIgfSAqL1xuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgfHwgdW5kZWZpbmVkXG5cbiAgICAgICAgLy9zeW1ib2xcbiAgICAgICAgLyoqICBAdHlwZSB7KGltcG9ydChcIi4uL2NvcmUvU3R5bGVcIikuU2hhcGUpfFwibGluZVwifSAqL1xuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAnY2lyY2xlJ1xuXG4gICAgICAgIC8vZ2VuZXJhbCBjYXNlXG4gICAgICAgIHRoaXMuZmlsbENvbG9yID0gb3B0cy5maWxsQ29sb3IgfHwgJ25vbmUnXG4gICAgICAgIHRoaXMuc3Ryb2tlQ29sb3IgPSBvcHRzLnN0cm9rZUNvbG9yIHx8ICdncmF5J1xuICAgICAgICB0aGlzLnN0cm9rZVdpZHRoID0gb3B0cy5zdHJva2VXaWR0aCB8fCAxXG5cbiAgICAgICAgLy9mb3IgbGluZSBzaGFwZVxuICAgICAgICAvL1RPRE8gdGhpcy5vcmllbnRhdGlvbiA9IG9wdHMub3JpZW50YXRpb24gfHwgMFxuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAnZ3JheSdcbiAgICAgICAgdGhpcy5sZW5ndGggPSBvcHRzLmxlbmd0aCB8fCAoKHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgPT4gcmVzb2x1dGlvbilcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3sgdmlld1NjYWxlOm9iamVjdCwgcmVzb2x1dGlvbjogbnVtYmVyLCB6Om51bWJlciwgY2VsbHM6QXJyYXkuPGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbD4gfX0gb3B0c1xuICAgICAqL1xuICAgIHVwZGF0ZShvcHRzKSB7XG4gICAgICAgIC8vY2xlYXJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcblxuICAgICAgICAvL3RpdGxlXG4gICAgICAgIHRoaXMubWFrZVRpdGxlKClcblxuICAgICAgICAvL2dldCBsYWJlbC4gTWF5IG5vdCBiZSBhIG51bWJlciAoISlcbiAgICAgICAgbGV0IGxhYmVsID0gdGhpcy5sYWJlbChvcHRzLnZpZXdTY2FsZSwgb3B0cy5jZWxscywgb3B0cy5yZXNvbHV0aW9uLCBvcHRzLnopXG5cbiAgICAgICAgLy9jb21wdXRlIHNpemUgb2Ygc3ltYm9sLCBpbiBwaXhcbiAgICAgICAgbGV0IHNpemVQaXhcbiAgICAgICAgaWYgKHRoaXMuc2l6ZSkgc2l6ZVBpeCA9IHRoaXMuc2l6ZShvcHRzLnZpZXdTY2FsZSwgb3B0cy5yZXNvbHV0aW9uLCBvcHRzLnopIC8gb3B0cy56XG4gICAgICAgIGVsc2Ugc2l6ZVBpeCA9IG9wdHMudmlld1NjYWxlKCtsYWJlbCkgLyBvcHRzLnpcbiAgICAgICAgaWYgKCFzaXplUGl4KSByZXR1cm5cblxuICAgICAgICAvL2Zvcm1hdCBsYWJlbCwgaWYgc3BlY2lmaWVkIGFuZCBwb3NzaWJsZVxuICAgICAgICBpZiAodGhpcy5sYWJlbEZvcm1hdCAmJiAhaXNOYU4oK2xhYmVsKSkgbGFiZWwgPSB0aGlzLmxhYmVsRm9ybWF0KGxhYmVsKVxuXG4gICAgICAgIGNvbnN0IGQgPSB0aGlzLmRpdi5hcHBlbmQoJ2RpdicpXG4gICAgICAgIC8vdG8gZW5hYmxlIHZlcnRpY2FsIGNlbnRlcmluZ1xuICAgICAgICAvLy5zdHlsZShcInBvc2l0aW9uXCIsIFwicmVsYXRpdmVcIilcblxuICAgICAgICAvL2RlZmF1bHQgc3ZnIGNvbnN0cnVjdGlvbiwgZm9yIHNxdWFyZSBhbmQgY2lyY2xlXG4gICAgICAgIGNvbnN0IHN2ZyA9ICgpID0+XG4gICAgICAgICAgICBkXG4gICAgICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCBzaXplUGl4ICsgdGhpcy5zdHJva2VXaWR0aCArIDIpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHNpemVQaXggKyB0aGlzLnN0cm9rZVdpZHRoICsgMilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJycsICdpbmxpbmUtYmxvY2snKVxuXG4gICAgICAgIGlmICh0aGlzLnNoYXBlID09PSAnc3F1YXJlJykge1xuICAgICAgICAgICAgc3ZnKClcbiAgICAgICAgICAgICAgICAuYXBwZW5kKCdyZWN0JylcbiAgICAgICAgICAgICAgICAuYXR0cigneCcsIDApXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3knLCAwKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHNpemVQaXgpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHNpemVQaXgpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgdGhpcy5maWxsQ29sb3IpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLnN0cm9rZUNvbG9yKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnY2lyY2xlJykge1xuICAgICAgICAgICAgLy8gPGNpcmNsZSBjeD1cIjUwXCIgY3k9XCI1MFwiIHI9XCI0MFwiIHN0cm9rZT1cImJsYWNrXCIgc3Ryb2tlLXdpZHRoPVwiM1wiIGZpbGw9XCJyZWRcIiAvPlxuICAgICAgICAgICAgY29uc3QgciA9IChzaXplUGl4ICsgdGhpcy5zdHJva2VXaWR0aCkgKiAwLjVcbiAgICAgICAgICAgIHN2ZygpXG4gICAgICAgICAgICAgICAgLmFwcGVuZCgnY2lyY2xlJylcbiAgICAgICAgICAgICAgICAuYXR0cignY3gnLCByICsgMSlcbiAgICAgICAgICAgICAgICAuYXR0cignY3knLCByICsgMSlcbiAgICAgICAgICAgICAgICAuYXR0cigncicsIHIpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgdGhpcy5maWxsQ29sb3IpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLnN0cm9rZUNvbG9yKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnZG9udXQnKSB7XG4gICAgICAgICAgICAvL1RPRE9cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnZGlhbW9uZCcpIHtcbiAgICAgICAgICAgIC8vVE9ET1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hhcGUgPT09ICdsaW5lJykge1xuICAgICAgICAgICAgLy9nZXQgc2VnbWVudCBsZW5ndGhcbiAgICAgICAgICAgIGxldCBsZW5ndGhQaXggPSB0aGlzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8gdGhpcy5sZW5ndGgob3B0cy5yZXNvbHV0aW9uLCBvcHRzLnosIG9wdHMudmlld1NjYWxlKVxuICAgICAgICAgICAgICAgIDogb3B0cy5yZXNvbHV0aW9uXG4gICAgICAgICAgICBsZW5ndGhQaXggLz0gb3B0cy56XG5cbiAgICAgICAgICAgIGNvbnN0IHN2ZyA9IGRcbiAgICAgICAgICAgICAgICAuYXBwZW5kKCdzdmcnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIGxlbmd0aFBpeClcbiAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0Jywgc2l6ZVBpeClcbiAgICAgICAgICAgICAgICAuc3R5bGUoJycsICdpbmxpbmUtYmxvY2snKVxuXG4gICAgICAgICAgICAvL1RPRE8gb3JpZW50YXRpb25cbiAgICAgICAgICAgIC8vPGxpbmUgeDE9XCIwXCIgeTE9XCIwXCIgeDI9XCIyMDBcIiB5Mj1cIjIwMFwiIHN0eWxlPVwic3Ryb2tlOnJnYigyNTUsMCwwKTtzdHJva2Utd2lkdGg6MlwiIC8+XG4gICAgICAgICAgICBzdmcuYXBwZW5kKCdsaW5lJylcbiAgICAgICAgICAgICAgICAuYXR0cigneDEnLCAwKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5MScsIHNpemVQaXggLyAyKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd4MicsIGxlbmd0aFBpeClcbiAgICAgICAgICAgICAgICAuYXR0cigneTInLCBzaXplUGl4IC8gMilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuY29sb3IpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCBzaXplUGl4KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNoYXBlOicgKyB0aGlzLnNoYXBlKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9sYWJlbFxuICAgICAgICBkLmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdpbmxpbmUnKVxuICAgICAgICAgICAgLnN0eWxlKCdwYWRkaW5nLWxlZnQnLCAnNXB4JylcbiAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5sYWJlbEZvbnRTaXplKVxuICAgICAgICAgICAgLnRleHQobGFiZWwgKyAodGhpcy5sYWJlbFVuaXRUZXh0ID8gJyAnIDogJycpICsgdGhpcy5sYWJlbFVuaXRUZXh0KVxuICAgIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSB2YWx1ZXNcbiAqIEBwYXJhbSB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ9IHNpemVcbiAqIEBwYXJhbSB7IG9iamVjdCB9IG9wdHNcbiAqIEByZXR1cm5zIHtBcnJheS48U2l6ZUxlZ2VuZD59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaXplTGVnZW5kKHZhbHVlcywgc2l6ZSwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgbGVnZW5kcyA9IFtdXG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgIG9wdHMudGl0bGUgPSB2YWx1ZSA9PSB2YWx1ZXNbMF0gPyBvcHRzLnRpdGxlIDogdW5kZWZpbmVkXG4gICAgICAgIG9wdHMuc2l6ZSA9ICgpID0+IHNpemUodmFsdWUpXG4gICAgICAgIG9wdHMubGFiZWwgPSAoKSA9PiB2YWx1ZVxuICAgICAgICBsZWdlbmRzLnB1c2gobmV3IFNpemVMZWdlbmQob3B0cykpXG4gICAgfVxuICAgIHJldHVybiBsZWdlbmRzXG59XG5cbi8qKlxuICogQHBhcmFtIHsgZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsKTpudW1iZXIgfSB2YWx1ZVxuICogQHBhcmFtIHsqfSBvcHRzXG4gKiBAcmV0dXJucyB7QXJyYXkuPFNpemVMZWdlbmQ+fVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2l6ZUxlZ2VuZFZpZXdTY2FsZSh2YWx1ZSwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgayA9IG9wdHMuayB8fCBbMC45LCAwLjUsIDAuMiwgMC4wNV1cbiAgICBjb25zdCBsZWdlbmRzID0gW11cbiAgICBmb3IgKGxldCBrXyBvZiBrKSB7XG4gICAgICAgIG9wdHMudGl0bGUgPSBrXyA9PSBrWzBdID8gb3B0cy50aXRsZSA6IHVuZGVmaW5lZFxuICAgICAgICBvcHRzLmxhYmVsID0gKHZpZXdTY2FsZSwgY2VsbHMpID0+IG5pY2Uoa18gKiBtYXgoY2VsbHMsIHZhbHVlKSlcbiAgICAgICAgbGVnZW5kcy5wdXNoKG5ldyBTaXplTGVnZW5kKG9wdHMpKVxuICAgIH1cbiAgICByZXR1cm4gbGVnZW5kc1xufVxuXG4vKipcbiAqIEEgZnVuY3Rpb24gd2hpY2ggcmV0dXJuIGEgc3RhY2sgb2Ygc2l6ZSBsZWdlbmRzIGZvciBhIGRpc2NyZXRlIGNsYXNzaWZpY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7IEFycmF5LjxudW1iZXI+IH0gYnJlYWtzXG4gKiBAcGFyYW0geyBBcnJheS48bnVtYmVyPiB9IHNpemVzXG4gKiBAcGFyYW0geyBvYmplY3QgfSBvcHRzXG4gKiBAcmV0dXJucyB7QXJyYXkuPFNpemVMZWdlbmQ+fVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2l6ZURpc2NyZXRlTGVnZW5kKGJyZWFrcywgc2l6ZXMsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGYgPSBvcHRzLmxhYmVsRm9ybWF0IHx8ICgoeCkgPT4geClcbiAgICBjb25zdCBsYWJlbFRleHQgPSBvcHRzLmxhYmVsVGV4dCB8fCBkZWZhdWx0TGFiZWxUZXh0KGYpXG4gICAgY29uc3QgbGVnZW5kcyA9IFtdXG4gICAgZm9yIChsZXQgaSA9IHNpemVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIG9wdHMudGl0bGUgPSBpID09IHNpemVzLmxlbmd0aCAtIDEgPyBvcHRzLnRpdGxlIDogdW5kZWZpbmVkXG4gICAgICAgIG9wdHMuc2l6ZSA9ICgpID0+IHNpemVzW2ldXG4gICAgICAgIG9wdHMubGFiZWwgPSAoKSA9PiBsYWJlbFRleHQoYnJlYWtzW2kgLSAxXSwgYnJlYWtzW2ldKVxuICAgICAgICBsZWdlbmRzLnB1c2gobmV3IFNpemVMZWdlbmQob3B0cykpXG4gICAgfVxuICAgIHJldHVybiBsZWdlbmRzXG59XG5cbi8qKlxuICogQSBmdW5jdGlvbiB3aGljaCByZXR1cm4gYSBzdGFjayBvZiBzaXplIGxlZ2VuZHMgZm9yIGEgZGlzY3JldGUgY2xhc3NpZmljYXRpb24gdXNpbmcgYSB2aWV3c2NhbGUuXG4gKiBAcGFyYW0geyBudW1iZXIgfSBjbGFzc051bWJlclxuICogQHBhcmFtIHsgb2JqZWN0IH0gb3B0c1xuICogQHJldHVybnMge0FycmF5LjxTaXplTGVnZW5kPn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpemVEaXNjcmV0ZVZpZXdTY2FsZUxlZ2VuZChjbGFzc051bWJlciwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgZiA9IG9wdHMubGFiZWxGb3JtYXQgfHwgKCh4KSA9PiB4KVxuICAgIGNvbnN0IGxhYmVsVGV4dCA9IG9wdHMubGFiZWxUZXh0IHx8IGRlZmF1bHRMYWJlbFRleHQoZilcbiAgICBjb25zdCBsZWdlbmRzID0gW11cbiAgICBjb25zdCB2aWV3U2NhbGVGdW4gPSBvcHRzLnZpZXdTY2FsZUZ1biB8fCAoKHQpID0+IHQpIC8vVE9ETyBkbyBpdCBkaWZmZXJlbnRseT8gQXQgc2l6ZWxlZ2VuZCBsZXZlbCAhXG4gICAgZm9yIChsZXQgaSA9IGNsYXNzTnVtYmVyIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgb3B0cy50aXRsZSA9IGkgPT0gY2xhc3NOdW1iZXIgLSAxID8gb3B0cy50aXRsZSA6IHVuZGVmaW5lZFxuICAgICAgICBvcHRzLnNpemUgPSAodmlld1NjYWxlKSA9PiB2aWV3U2NhbGVGdW4odmlld1NjYWxlKS52YWx1ZXNbaV1cbiAgICAgICAgb3B0cy5sYWJlbCA9ICh2aWV3U2NhbGUpID0+XG4gICAgICAgICAgICBsYWJlbFRleHQodmlld1NjYWxlRnVuKHZpZXdTY2FsZSkuYnJlYWtzW2kgLSAxXSwgdmlld1NjYWxlRnVuKHZpZXdTY2FsZSkuYnJlYWtzW2ldKVxuICAgICAgICBsZWdlbmRzLnB1c2gobmV3IFNpemVMZWdlbmQob3B0cykpXG4gICAgfVxuICAgIHJldHVybiBsZWdlbmRzXG59XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBmdW5jdGlvbiB0byBmb3JtYXQgbGFiZXJscyBmb3IgZGlzY3JldGUgc2NhbGUgbGVnZW5kcy5cbiAqIEBwYXJhbSB7IGZ1bmN0aW9uKG51bWJlcik6c3RyaW5nIH0gZm9ybWF0XG4gKiBAcmV0dXJucyB7IGZ1bmN0aW9uKG51bWJlcnx1bmRlZmluZWQsIG51bWJlcnx1bmRlZmluZWQpOiBzdHJpbmcgfVxuICovXG5mdW5jdGlvbiBkZWZhdWx0TGFiZWxUZXh0KGZvcm1hdCkge1xuICAgIHJldHVybiAodjAsIHYxKSA9PiB7XG4gICAgICAgIGlmICh2MCA9PSB1bmRlZmluZWQgJiYgdjEgPT0gdW5kZWZpbmVkKSByZXR1cm4gJydcbiAgICAgICAgaWYgKHYxID09IHVuZGVmaW5lZCkgcmV0dXJuICc+ICcgKyBmb3JtYXQodjApXG4gICAgICAgIGlmICh2MCA9PSB1bmRlZmluZWQpIHJldHVybiAnPCAnICsgZm9ybWF0KHYxKVxuICAgICAgICByZXR1cm4gZm9ybWF0KHYwKSArICcgLSAnICsgZm9ybWF0KHYxKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJ1xuaW1wb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi4vY29yZS9MZWdlbmQuanMnXG5cbi8qKlxuICpcbiAqIEBtb2R1bGUgbGVnZW5kXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBUZXJuYXJ5TGVnZW5kIGV4dGVuZHMgTGVnZW5kIHtcbiAgICAvKiogQHBhcmFtIHtPYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLy9jbGFzc2lmaWVyXG4gICAgICAgIHRoaXMuY2xhc3NpZmllciA9IG9wdHMuY2xhc3NpZmllclxuXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8IDE1MFxuICAgICAgICB0aGlzLnNlbGVjdGlvbkNvbG9yID0gdGhpcy5zZWxlY3Rpb25Db2xvciB8fCAncmVkJ1xuICAgICAgICB0aGlzLnRvb2x0aXAgPSBvcHRzLnRvb2x0aXBcbiAgICAgICAgdGhpcy50ZXh0cyA9IG9wdHMudGV4dHNcblxuICAgICAgICB0aGlzLmxlZnRUZXh0ID0gb3B0cy5sZWZ0VGV4dCB8fCAnQ2F0ZWdvcnkgMCdcbiAgICAgICAgdGhpcy50b3BUZXh0ID0gb3B0cy50b3BUZXh0IHx8ICdDYXRlZ29yeSAxJ1xuICAgICAgICB0aGlzLnJpZ2h0VGV4dCA9IG9wdHMucmlnaHRUZXh0IHx8ICdDYXRlZ29yeSAyJ1xuXG4gICAgICAgIHRoaXMuY2VudGVyQ29lZmZpY2llbnQgPSBvcHRzLmNlbnRlckNvZWZmaWNpZW50IHx8IHRoaXMuY2xhc3NpZmllci5jZW50ZXJDb2VmZmljaWVudFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7e30gfSBvcHRzXG4gICAgICovXG4gICAgdXBkYXRlKG9wdHMpIHtcbiAgICAgICAgLy9jbGVhclxuICAgICAgICB0aGlzLmRpdi5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxuXG4gICAgICAgIC8vdGl0bGVcbiAgICAgICAgdGhpcy5tYWtlVGl0bGUoKVxuXG4gICAgICAgIGNvbnN0IHNxcnQzb3ZlcjIgPSAwLjg2NjAyNVxuICAgICAgICBjb25zdCB3ID0gdGhpcy53aWR0aCxcbiAgICAgICAgICAgIGggPSB3ICogc3FydDNvdmVyMlxuICAgICAgICBjb25zdCBjbGFzc2lmaWVyID0gdGhpcy5jbGFzc2lmaWVyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbkNvbG9yID0gdGhpcy5zZWxlY3Rpb25Db2xvclxuICAgICAgICBjb25zdCBzZWxlY3Rpb25TdHJva2VXaWR0aCA9IDBcbiAgICAgICAgY29uc3QgdHQgPSB0aGlzLnRvb2x0aXBcbiAgICAgICAgY29uc3QgdGV4dHMgPSB0aGlzLnRleHRzIHx8IHt9XG5cbiAgICAgICAgY29uc3QgcGFkZGluZyA9IDJcbiAgICAgICAgY29uc3QgZm9udFNpemUgPSAxMlxuXG4gICAgICAgIC8vbWFrZSBzdmcgZWxlbWVudFxuICAgICAgICBjb25zdCBzdmcgPSB0aGlzLmRpdlxuICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHcgKyBzZWxlY3Rpb25TdHJva2VXaWR0aClcbiAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoICsgNCAqIHBhZGRpbmcgKyAyICogZm9udFNpemUpXG5cbiAgICAgICAgLy90b3AgbGFiZWxcbiAgICAgICAgc3ZnLmFwcGVuZCgndGV4dCcpXG4gICAgICAgICAgICAuYXR0cigneCcsIHcgLyAyKVxuICAgICAgICAgICAgLmF0dHIoJ3knLCBwYWRkaW5nICsgZm9udFNpemUpXG4gICAgICAgICAgICAudGV4dCh0aGlzLnRvcFRleHQpXG4gICAgICAgICAgICAuYXR0cignZm9udC1zaXplJywgZm9udFNpemUpXG4gICAgICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgICAgLy9sZWZ0IGxhYmVsXG4gICAgICAgIHN2Zy5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAgICAgLmF0dHIoJ3gnLCAwKVxuICAgICAgICAgICAgLmF0dHIoJ3knLCAzICogcGFkZGluZyArIDIgKiBmb250U2l6ZSArIGgpXG4gICAgICAgICAgICAudGV4dCh0aGlzLmxlZnRUZXh0KVxuICAgICAgICAgICAgLmF0dHIoJ2ZvbnQtc2l6ZScsIGZvbnRTaXplKVxuICAgICAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ3N0YXJ0JylcbiAgICAgICAgLy9yaWdodCBsYWJlbFxuICAgICAgICBzdmcuYXBwZW5kKCd0ZXh0JylcbiAgICAgICAgICAgIC5hdHRyKCd4JywgdylcbiAgICAgICAgICAgIC5hdHRyKCd5JywgMyAqIHBhZGRpbmcgKyAyICogZm9udFNpemUgKyBoKVxuICAgICAgICAgICAgLnRleHQodGhpcy5yaWdodFRleHQpXG4gICAgICAgICAgICAuYXR0cignZm9udC1zaXplJywgZm9udFNpemUpXG4gICAgICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnZW5kJylcblxuICAgICAgICAvL3RyaWFuZ2xlIGdyb3VwXG4gICAgICAgIGNvbnN0IGcgPSBzdmdcbiAgICAgICAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAgICAgJ3RyYW5zZm9ybScsXG4gICAgICAgICAgICAgICAgJ3RyYW5zbGF0ZSgnICtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uU3Ryb2tlV2lkdGggLyAyICtcbiAgICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvblN0cm9rZVdpZHRoIC8gMiArICgyICogcGFkZGluZyArIGZvbnRTaXplKSkgK1xuICAgICAgICAgICAgICAgICAgICAnKSdcbiAgICAgICAgICAgIClcblxuICAgICAgICAvL2NvbW1vbiBmdW5jdGlvbiBmb3IgdHJpYW5nbGUgcGF0Y2hlc1xuICAgICAgICBjb25zdCBzZXRBdHRyaWJ1dGVzID0gKGVsdCwgY29sb3IsIHRleHQpID0+IHtcbiAgICAgICAgICAgIC8vZWx0LnJhaXNlKCk7XG4gICAgICAgICAgICBlbHQuYXR0cignZmlsbCcsIGNvbG9yKVxuICAgICAgICAgICAgICAgIC8vLmF0dHIoXCJzdHJva2VcIiwgY29sb3JPdmVyKVxuICAgICAgICAgICAgICAgIC8vLmF0dHIoXCJzdHJva2Utd2lkdGhcIiwgMClcbiAgICAgICAgICAgICAgICAvLy5hdHRyKFwic3Ryb2tlLWxpbmVqb2luXCIsIFwicm91bmRcIilcbiAgICAgICAgICAgICAgICAub24oJ21vdXNlb3ZlcicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpOyBzZWxlY3QodGhpcykuYXR0cihcInN0cm9rZS13aWR0aFwiLCBzZWxlY3Rpb25TdHJva2VXaWR0aCk7Ki9cbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHRoaXMpLmF0dHIoJ2ZpbGwnLCBzZWxlY3Rpb25Db2xvcilcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0dCB8fCAhdGV4dCkgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIHR0Lmh0bWwodGV4dClcbiAgICAgICAgICAgICAgICAgICAgdHQuc2V0UG9zaXRpb24oZSlcbiAgICAgICAgICAgICAgICAgICAgdHQuc2hvdygpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAub24oJ21vdXNlb3V0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvKnNlbGVjdCh0aGlzKS5hdHRyKFwic3Ryb2tlLXdpZHRoXCIsIDApOyovXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdCh0aGlzKS5hdHRyKCdmaWxsJywgY29sb3IpXG4gICAgICAgICAgICAgICAgICAgIGlmICh0dCkgdHQuaGlkZSgpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGlmICh0dCAmJiB0ZXh0KVxuICAgICAgICAgICAgICAgIGVsdC5vbignbW91c2Vtb3ZlJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdHQuc2V0UG9zaXRpb24oZSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jb25zdCBbYzAsIGMxLCBjMl0gPSBjbGFzc2lmaWVyLmNlbnRlclxuXG4gICAgICAgIC8vdHJhcGV6aXVtIHMwXG4gICAgICAgIGNvbnN0IHQwID0gZ1xuICAgICAgICAgICAgLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAuYXR0cihcbiAgICAgICAgICAgICAgICAncG9pbnRzJyxcbiAgICAgICAgICAgICAgICAnMCwnICtcbiAgICAgICAgICAgICAgICAgICAgaCArXG4gICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgIHcgLyAzICtcbiAgICAgICAgICAgICAgICAgICAgJywnICtcbiAgICAgICAgICAgICAgICAgICAgaCArXG4gICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgIHcgLyAyICtcbiAgICAgICAgICAgICAgICAgICAgJywnICtcbiAgICAgICAgICAgICAgICAgICAgKGggKiAyKSAvIDMgK1xuICAgICAgICAgICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgICAgICAgICB3IC8gNiArXG4gICAgICAgICAgICAgICAgICAgICcsJyArXG4gICAgICAgICAgICAgICAgICAgIChoICogMikgLyAzXG4gICAgICAgICAgICApXG4gICAgICAgIHNldEF0dHJpYnV0ZXModDAsIGNsYXNzaWZpZXIuY29sb3JzWzBdLCB0ZXh0c1snMCddKVxuICAgICAgICAvL3RyYXBleml1bSBzMVxuICAgICAgICBjb25zdCB0MSA9IGdcbiAgICAgICAgICAgIC5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAgICAgJ3BvaW50cycsXG4gICAgICAgICAgICAgICAgdyAvIDIgK1xuICAgICAgICAgICAgICAgICAgICAnLDAgJyArXG4gICAgICAgICAgICAgICAgICAgICh3ICogMikgLyAzICtcbiAgICAgICAgICAgICAgICAgICAgJywnICtcbiAgICAgICAgICAgICAgICAgICAgaCAvIDMgK1xuICAgICAgICAgICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgICAgICAgICB3IC8gMiArXG4gICAgICAgICAgICAgICAgICAgICcsJyArXG4gICAgICAgICAgICAgICAgICAgIChoICogMikgLyAzICtcbiAgICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgdyAvIDMgK1xuICAgICAgICAgICAgICAgICAgICAnLCcgK1xuICAgICAgICAgICAgICAgICAgICBoIC8gM1xuICAgICAgICAgICAgKVxuICAgICAgICBzZXRBdHRyaWJ1dGVzKHQxLCBjbGFzc2lmaWVyLmNvbG9yc1sxXSwgdGV4dHNbJzEnXSlcbiAgICAgICAgLy90cmFwZXppdW0gczJcbiAgICAgICAgY29uc3QgdDIgPSBnXG4gICAgICAgICAgICAuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgIC5hdHRyKFxuICAgICAgICAgICAgICAgICdwb2ludHMnLFxuICAgICAgICAgICAgICAgIHcgK1xuICAgICAgICAgICAgICAgICAgICAnLCcgK1xuICAgICAgICAgICAgICAgICAgICBoICtcbiAgICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgKHcgKiA1KSAvIDYgK1xuICAgICAgICAgICAgICAgICAgICAnLCcgK1xuICAgICAgICAgICAgICAgICAgICAoMiAqIGgpIC8gMyArXG4gICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgIHcgLyAyICtcbiAgICAgICAgICAgICAgICAgICAgJywnICtcbiAgICAgICAgICAgICAgICAgICAgKGggKiAyKSAvIDMgK1xuICAgICAgICAgICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgICAgICAgICAodyAqIDIpIC8gMyArXG4gICAgICAgICAgICAgICAgICAgICcsJyArXG4gICAgICAgICAgICAgICAgICAgIGhcbiAgICAgICAgICAgIClcbiAgICAgICAgc2V0QXR0cmlidXRlcyh0MiwgY2xhc3NpZmllci5jb2xvcnNbMl0sIHRleHRzWycyJ10pXG4gICAgICAgIC8vdHJpYW5nbGUgczBcbiAgICAgICAgY29uc3QgdDBfID0gZ1xuICAgICAgICAgICAgLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAuYXR0cihcbiAgICAgICAgICAgICAgICAncG9pbnRzJyxcbiAgICAgICAgICAgICAgICB3IC8gMiArXG4gICAgICAgICAgICAgICAgICAgICcsJyArXG4gICAgICAgICAgICAgICAgICAgIChoICogMikgLyAzICtcbiAgICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgKHcgKiA1KSAvIDYgK1xuICAgICAgICAgICAgICAgICAgICAnLCcgK1xuICAgICAgICAgICAgICAgICAgICAoaCAqIDIpIC8gMyArXG4gICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgICh3ICogMikgLyAzICtcbiAgICAgICAgICAgICAgICAgICAgJywnICtcbiAgICAgICAgICAgICAgICAgICAgaCAvIDNcbiAgICAgICAgICAgIClcbiAgICAgICAgc2V0QXR0cmlidXRlcyh0MF8sIGNsYXNzaWZpZXIubWl4Q29sb3JzWzBdLCB0ZXh0c1snbTEyJ10pXG4gICAgICAgIC8vdHJpYW5nbGUgczFcbiAgICAgICAgY29uc3QgdDFfID0gZ1xuICAgICAgICAgICAgLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAuYXR0cigncG9pbnRzJywgdyAvIDIgKyAnLCcgKyAoaCAqIDIpIC8gMyArICcgJyArIHcgLyAzICsgJywnICsgaCArICcgJyArICh3ICogMikgLyAzICsgJywnICsgaClcbiAgICAgICAgc2V0QXR0cmlidXRlcyh0MV8sIGNsYXNzaWZpZXIubWl4Q29sb3JzWzFdLCB0ZXh0c1snbTAyJ10pXG4gICAgICAgIC8vdHJpYW5nbGUgczJcbiAgICAgICAgY29uc3QgdDJfID0gZ1xuICAgICAgICAgICAgLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAuYXR0cihcbiAgICAgICAgICAgICAgICAncG9pbnRzJyxcbiAgICAgICAgICAgICAgICB3IC8gMiArICcsJyArIChoICogMikgLyAzICsgJyAnICsgdyAvIDYgKyAnLCcgKyAoaCAqIDIpIC8gMyArICcgJyArIHcgLyAzICsgJywnICsgaCAvIDNcbiAgICAgICAgICAgIClcbiAgICAgICAgc2V0QXR0cmlidXRlcyh0Ml8sIGNsYXNzaWZpZXIubWl4Q29sb3JzWzJdLCB0ZXh0c1snbTAxJ10pXG5cbiAgICAgICAgLy9jZW50ZXJcbiAgICAgICAgaWYgKHRoaXMuY2VudGVyQ29lZmZpY2llbnQpIHtcbiAgICAgICAgICAgIC8vVE9ETyBtYWtlIGl0IGFuIGhleGFnb24gIVxuICAgICAgICAgICAgY29uc3QgY2VudGVyID0gZ1xuICAgICAgICAgICAgICAgIC5hcHBlbmQoJ2NpcmNsZScpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2N4JywgdyAvIDIpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2N5JywgKGggKiAyKSAvIDMpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3InLCAodGhpcy5jZW50ZXJDb2VmZmljaWVudCAqIGgpIC8gMylcbiAgICAgICAgICAgIHNldEF0dHJpYnV0ZXMoY2VudGVyLCBjbGFzc2lmaWVyLmNlbnRlckNvbG9yLCB0ZXh0c1snY2VudGVyJ10pXG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICBsZXQgbWlkZGxlLCBsZWZ0LCB0b3AsIHJpZ2h0LCBsZWZ0XywgYm90dG9tXywgcmlnaHRfXG4gICAgICAgIGlmICghdGhpcy5yZWFsKSB7XG5cbiAgICAgICAgICAgIC8vMCBsZWZ0IHRyaWFuZ2xlXG4gICAgICAgICAgICBsZWZ0ID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCBcIjAsXCIgKyBoICsgXCIgXCIgKyAodyAvIDMpICsgXCIsXCIgKyBoICsgXCIgXCIgKyAodyAvIDYpICsgXCIsXCIgKyAoMiAqIGggLyAzKSlcbiAgICAgICAgICAgIC8vMSB0b3AgdHJpYW5nbGVcbiAgICAgICAgICAgIHRvcCA9IGcuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgKHcgLyAzKSArIFwiLFwiICsgKGggLyAzKSArIFwiIFwiICsgKHcgKiAyIC8gMykgKyBcIixcIiArIChoIC8gMykgKyBcIiBcIiArICh3IC8gMikgKyBcIiwwXCIpXG4gICAgICAgICAgICAvLzIgcmlnaHQgdHJpYW5nbGVcbiAgICAgICAgICAgIHJpZ2h0ID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCAodyAqIDIgLyAzKSArIFwiLFwiICsgaCArIFwiIFwiICsgdyArIFwiLFwiICsgaCArIFwiIFwiICsgKHcgKiA1IC8gNikgKyBcIixcIiArICgyICogaCAvIDMpKVxuICAgICAgICAgICAgLy9taWRkbGUgdHJpYW5nbGVcbiAgICAgICAgICAgIG1pZGRsZSA9IGcuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgKHcgLyAyKSArIFwiLFwiICsgKGggLyAzKSArIFwiIFwiICsgKHcgLyA0KSArIFwiLFwiICsgKGggKiA1IC8gNikgKyBcIiBcIiArICgzICogdyAvIDQpICsgXCIsXCIgKyAoaCAqIDUgLyA2KSlcbiAgICAgICAgICAgIC8vMDEgbGVmdCB0cmFwZXppdW1cbiAgICAgICAgICAgIGxlZnRfID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCAodyAvIDYpICsgXCIsXCIgKyAoaCAqIDIgLyAzKSArIFwiIFwiICsgKHcgLyA0KSArIFwiLFwiICsgKGggKiA1IC8gNikgKyBcIiBcIiArICh3IC8gMikgKyBcIixcIiArIChoIC8gMykgKyBcIiBcIiArICh3IC8gMykgKyBcIixcIiArIChoIC8gMykpXG4gICAgICAgICAgICAvLzAyIGJvdHRvbSB0cmFwZXppdW1cbiAgICAgICAgICAgIGJvdHRvbV8gPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsICh3IC8gMykgKyBcIixcIiArIChoKSArIFwiIFwiICsgKDIgKiB3IC8gMykgKyBcIixcIiArIChoKSArIFwiIFwiICsgKHcgKiAzIC8gNCkgKyBcIixcIiArIChoICogNSAvIDYpICsgXCIgXCIgKyAodyAvIDQpICsgXCIsXCIgKyAoaCAqIDUgLyA2KSlcbiAgICAgICAgICAgIC8vMTIgcmlnaHQgdHJhcGV6aXVtXG4gICAgICAgICAgICByaWdodF8gPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsICh3IC8gMikgKyBcIixcIiArIChoIC8gMykgKyBcIiBcIiArICh3ICogMyAvIDQpICsgXCIsXCIgKyAoaCAqIDUgLyA2KSArIFwiIFwiICsgKHcgKiA1IC8gNikgKyBcIixcIiArIChoICogMiAvIDMpICsgXCIgXCIgKyAodyAqIDIgLyAzKSArIFwiLFwiICsgKGggLyAzKSlcblxuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAvL21pZGRsZSB0cmlhbmdsZVxuICAgICAgICAgICAgbWlkZGxlID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCAodyAvIDIpICsgXCIsMCAwLFwiICsgaCArIFwiIFwiICsgdyArIFwiLFwiICsgaClcblxuICAgICAgICAgICAgLy9kcmF3IHRyYXBleml1bVxuICAgICAgICAgICAgLy9kcmF3IGxhcmdlIHRyYXBleml1bSBmaXJzdFxuICAgICAgICAgICAgZm9yIChsZXQgaV8gPSAyOyBpXyA+PSAwOyBpXy0tKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuY2xhc3NpZmllci5sb3dJbmRleFtpX11cbiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy5jbGFzc2lmaWVyLmxvd1RocmVzaG9sZFtpXVxuICAgICAgICAgICAgICAgIGlmIChpID09IDIpXG4gICAgICAgICAgICAgICAgICAgIC8vMDEgbGVmdCB0cmFwZXppdW1cbiAgICAgICAgICAgICAgICAgICAgbGVmdF8gPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgdyAvIDIgKyBcIiwwIDAsXCIgKyBoICsgXCIgXCIgKyB3ICogciArIFwiLFwiICsgaCArIFwiIFwiICsgdyAqICgxICsgcikgLyAyICsgXCIsXCIgKyByICogaClcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpID09IDEpXG4gICAgICAgICAgICAgICAgICAgIC8vMDIgYm90dG9tIHRyYXBleml1bVxuICAgICAgICAgICAgICAgICAgICBib3R0b21fID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIFwiMCxcIiArIGggKyBcIiBcIiArIHcgKyBcIixcIiArIGggKyBcIiBcIiArIHcgKiAoMSAtIHIgLyAyKSArIFwiLFwiICsgaCAqICgxIC0gcikgKyBcIiBcIiArIHIgKiB3IC8gMiArIFwiLFwiICsgaCAqICgxIC0gcikpXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAvLzEyIHJpZ2h0IHRyYXBleml1bVxuICAgICAgICAgICAgICAgICAgICByaWdodF8gPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgdyArIFwiLFwiICsgaCArIFwiIFwiICsgdyAvIDIgKyBcIiwwIFwiICsgdyAqICgxIC0gcikgLyAyICsgXCIsXCIgKyBoICogciArIFwiIFwiICsgdyAqICgxIC0gcikgKyBcIixcIiArIGgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vZHJhdyB0cmlhbmdsZXNcbiAgICAgICAgICAgIC8vZHJhdyBsYXJnZSB0cmlhbmdsZXMgZmlyc3RcbiAgICAgICAgICAgIGZvciAobGV0IGlfID0gMjsgaV8gPj0gMDsgaV8tLSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLmNsYXNzaWZpZXIuaGlnaEluZGV4W2lfXVxuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLmNsYXNzaWZpZXIuaGlnaFRocmVzaG9sZFtpXVxuXG4gICAgICAgICAgICAgICAgaWYgKGkgPT0gMilcbiAgICAgICAgICAgICAgICAgICAgLy8yIHJpZ2h0IHRyaWFuZ2xlXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIHcgKyBcIixcIiArIGggKyBcIiBcIiArIHcgKiByICsgXCIsXCIgKyBoICsgXCIgXCIgKyB3ICogKDEgKyByKSAvIDIgKyBcIixcIiArIGggKiByKVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPT0gMSlcbiAgICAgICAgICAgICAgICAgICAgLy8xIHRvcCB0cmlhbmdsZVxuICAgICAgICAgICAgICAgICAgICB0b3AgPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgKHcgLyAyKSArIFwiLDAgXCIgKyB3ICogciAvIDIgKyBcIixcIiArIGggKiAoMSAtIHIpICsgXCIgXCIgKyB3ICogKDEgLSByIC8gMikgKyBcIixcIiArIGggKiAoMSAtIHIpKVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgLy8wIGxlZnQgdHJpYW5nbGVcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGcuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCBcIjAsXCIgKyBoICsgXCIgXCIgKyB3ICogKDEgLSByKSArIFwiLFwiICsgaCArIFwiIFwiICsgdyAqICgxIC0gcikgLyAyICsgXCIsXCIgKyBoICogcilcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9Ki9cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcblxuLyoqIEB0eXBlZGVmIHtcImZsYWdcInxcInBpZWNoYXJ0XCJ8XCJyaW5nXCJ8XCJzZWdtZW50XCJ8XCJyYWRhclwifFwiYWdlcHlyYW1pZFwifFwiaGFsZnRvbmVcIn0gQ29tcG9zaXRpb25UeXBlICovXG5cbi8qKlxuICogQSBzdHlsZSBzaG93aW5nIHRoZSBjb21wb3NpdGlvbiBvZiBhIHRvdGFsIGluIGRpZmZlcmVudCBjYXRlZ29yaWVzLCB3aXRoIGRpZmZlcmVudCBjb2xvciBodWVzLlxuICogSXQgY29uc2lzdHMgb2YgYSBzeW1ib2wgd2l0aCBkaWZmZXJlbnQgcGFydHMsIHdob3NlIHNpemUgcmVmbGVjdCB0aGUgcHJvcG9ydGlvbiBvZiB0aGUgY29ycmVzcG9uZGluZyBjYXRlZ29yeS5cbiAqIEZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHN5bWJvbHMsIEBzZWUgQ29tcG9zaXRpb25UeXBlXG4gKiBUaGUgc3ltYm9sIGNhbiBiZSBzY2FsZWQgZGVwZW5kaW5nIG9uIHRoZSBjZWxsIGltcG9ydGFuY2UuXG4gKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQ29tcG9zaXRpb25TdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkaWN0aW9uYXJ5IChzdHJpbmcgLT4gY29sb3IpIHdoaWNoIGdpdmUgdGhlIGNvbG9yIG9mIGVhY2ggY2F0ZWdvcnkuXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB0eXBlIG9mIGRlY29tcG9zaXRpb24gc3ltYm9sIG9mIGEgY2VsbCwgQHNlZSBDb21wb3NpdGlvblR5cGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlciwgbnVtYmVyLG9iamVjdCk6Q29tcG9zaXRpb25UeXBlfSAqL1xuICAgICAgICB0aGlzLnR5cGUgPSBvcHRzLnR5cGUgfHwgKCgpID0+ICdmbGFnJykgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIGEgY2VsbCBpbiBnZW9ncmFwaGljYWwgdW5pdC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgfHwgKChjLCByKSA9PiByKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogRm9yIHN0eWxlIHR5cGVzIHdpdGggc3RyaXBlcyAoZmxhZywgc2VnbWVudCksIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgc3RyaXBlcyAoMCBmb3IgaG9yaXpvbnRhbCwgb3RoZXIgZm9yIHZlcnRpY2FsKS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIsb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuc3RyaXBlc09yaWVudGF0aW9uID0gb3B0cy5zdHJpcGVzT3JpZW50YXRpb24gfHwgKCgpID0+IDApIC8vKGMscix6LHZzKSA9PiAuLi5cblxuICAgICAgICAvKiogVGhlIGZ1bmN0aW9uIHNwZWNpZnlpbmcgYW4gb2Zmc2V0IGFuZ2xlIGZvciBhIHJhZGFyLCBoYWxmdG9uZSBvciBwaWUgY2hhcnQgc3R5bGUuXG4gICAgICAgICAqIFRoZSBhbmdsZSBpcyBzcGVjaWZpZWQgaW4gZGVncmVlLiBUaGUgcm90YXRpb24gaXMgYW50aS1jbG9ja3dpc2UuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyLG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm9mZnNldEFuZ2xlID0gb3B0cy5vZmZzZXRBbmdsZSB8fCAoKCkgPT4gMCkgLy8oYyxyLHosdnMpID0+IC4uLlxuXG4gICAgICAgIC8qKiBUaGUgZnVuY3Rpb24gc3BlY2lmeWluZyB0aGUgaGVpZ2h0IG9mIHRoZSBhZ2UgcHlyYW1pZCwgaW4gZ2VvIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyLG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmFnZVB5cmFtaWRIZWlnaHQgPSBvcHRzLmFnZVB5cmFtaWRIZWlnaHQgfHwgKChjLCByKSA9PiByKSAvLyhjLHIseix2cykgPT4gLi4uXG5cbiAgICAgICAgLyoqIEZvciBwaWUgY2hhcnQsIHRoaXMgaXMgcGFyYW1ldGVyIGZvciBpbnRlcm5hbCByYWRpdXMsIHNvIHRoYXQgdGhlIHBpZSBjaGFydCBsb29rcyBsaWtlIGEgZG9udXQuXG4gICAgICAgICAqIDAgZm9yIG5vcm1hbCBwaWUgY2hhcnRzLCAwLjUgdG8gZW1wdHkgaGFsZiBvZiB0aGUgcmFkaXVzLlxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnBpZUNoYXJ0SW50ZXJuYWxSYWRpdXNGYWN0b3IgPSBvcHRzLnBpZUNoYXJ0SW50ZXJuYWxSYWRpdXNGYWN0b3IgfHwgMFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgc3F1YXJlcyBkZXBlbmRpbmcgb24gdGhlaXIgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgY29uc3QgY3R4ID0gZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL25iIGNhdGVnb3JpZXMgLSB1c2VkIGZvciByYWRhciBhbmQgYWdlcHlyYW1pZFxuICAgICAgICBjb25zdCBuYkNhdCA9IE9iamVjdC5lbnRyaWVzKHRoaXMuY29sb3IpLmxlbmd0aFxuXG4gICAgICAgIC8vZHJhdyBjYWxsc1xuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAvL3NpemVcbiAgICAgICAgICAgIGNvbnN0IHNHID0gdGhpcy5zaXplID8gdGhpcy5zaXplKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiByZXNvbHV0aW9uXG4gICAgICAgICAgICBpZiAoIXNHKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGNlbGwsIHJlc29sdXRpb24sIHopXG5cbiAgICAgICAgICAgIC8vZ2V0IHN5bWJvbCB0eXBlXG4gICAgICAgICAgICBjb25zdCB0eXBlXyA9IHRoaXMudHlwZSA/IHRoaXMudHlwZShjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogJ2ZsYWcnXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBjZW50ZXIgcG9zaXRpb25cbiAgICAgICAgICAgIGNvbnN0IHhjID0gY2VsbC54ICsgb2Zmc2V0LmR4ICsgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcgPyAwIDogcmVzb2x1dGlvbiAqIDAuNSlcbiAgICAgICAgICAgIGNvbnN0IHljID0gY2VsbC55ICsgb2Zmc2V0LmR5ICsgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcgPyAwIDogcmVzb2x1dGlvbiAqIDAuNSlcblxuICAgICAgICAgICAgLy9jb21wdXRlIG9mZnNldCBhbmdsZSwgd2hlbiByZWxldmFudFxuICAgICAgICAgICAgY29uc3Qgb2ZmQW5nID0gdGhpcy5vZmZzZXRBbmdsZVxuICAgICAgICAgICAgICAgID8gKHRoaXMub2Zmc2V0QW5nbGUoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSAqIE1hdGguUEkpIC8gMTgwXG4gICAgICAgICAgICAgICAgOiAwXG5cbiAgICAgICAgICAgIGlmICh0eXBlXyA9PT0gJ2FnZXB5cmFtaWQnIHx8IHR5cGVfID09PSAncmFkYXInIHx8IHR5cGVfID09PSAnaGFsZnRvbmUnKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgY2VsbCBjYXRlZ29yeSBtYXggdmFsdWVcbiAgICAgICAgICAgICAgICBsZXQgbWF4VmFsID0gLUluZmluaXR5XG4gICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuY29sb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSArY2VsbFtrZXldXG4gICAgICAgICAgICAgICAgICAgIGlmICh2ID4gbWF4VmFsKSBtYXhWYWwgPSB2XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9jdW11bFxuICAgICAgICAgICAgICAgIGxldCBjdW11bCA9IDBcbiAgICAgICAgICAgICAgICBpZiAodHlwZV8gPT09ICdhZ2VweXJhbWlkJyAmJiB0aGlzLmFnZVB5cmFtaWRIZWlnaHQpXG4gICAgICAgICAgICAgICAgICAgIGN1bXVsID0gKHJlc29sdXRpb24gLSB0aGlzLmFnZVB5cmFtaWRIZWlnaHQoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSkgLyAyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVfID09PSAncmFkYXInIHx8IHR5cGVfID09PSAnaGFsZnRvbmUnKSBjdW11bCA9IE1hdGguUEkgLyAyICsgb2ZmQW5nXG5cbiAgICAgICAgICAgICAgICAvL2NvbXB1dGUgdGhlIGluY3JlbWVudCwgd2hpY2ggaXMgdGhlIHZhbHVlIHRvIGluY3JlbWVudCB0aGUgY3VtdWwgZm9yIGVhY2ggY2F0ZWdvcnlcbiAgICAgICAgICAgICAgICBjb25zdCBpbmNyID1cbiAgICAgICAgICAgICAgICAgICAgdHlwZV8gPT09ICdhZ2VweXJhbWlkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyAodGhpcy5hZ2VQeXJhbWlkSGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuYWdlUHlyYW1pZEhlaWdodChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJlc29sdXRpb24pIC8gbmJDYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdHlwZV8gPT09ICdyYWRhcicgfHwgdHlwZV8gPT09ICdoYWxmdG9uZSdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKDIgKiBNYXRoLlBJKSAvIG5iQ2F0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIGlmIChpbmNyID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzeW1ib2wgdHlwZTonICsgdHlwZV8pXG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBbY29sdW1uLCBjb2xvcl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5jb2xvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vc2V0IGNhdGVnb3J5IGNvbG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gY29sb3JcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9nZXQgY2F0ZWdvcnkgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNlbGxbY29sdW1uXVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbXB1dGUgY2F0ZWdvcnkgbGVuZ3RoIC0gaW4gZ2VvXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdHID0gKHNHICogdmFsKSAvIG1heFZhbFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgYmFyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFJlY3QoeGMgKyAocmVzb2x1dGlvbiAtIHdHKSAvIDIsIHljICsgY3VtdWwsIHdHLCBpbmNyKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL25leHQgaGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICBjdW11bCArPSBpbmNyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZV8gPT09ICdyYWRhcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vc2V0IGNhdGVnb3J5IGNvbG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gY29sb3JcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9nZXQgY2F0ZWdyb3kgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNlbGxbY29sdW1uXVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbXB1dGUgY2F0ZWdvcnkgcmFkaXVzIC0gaW4gZ2VvXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc3QgckcgPSB0aGlzLnJhZGl1cyh2YWwsIHIsIHN0YXQsIGNlbGxTdGF0LCB6KVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgckcgPSAoc0cgLyAyKSAqIE1hdGguc3FydCh2YWwgLyBtYXhWYWwpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBhbmd1bGFyIHNlY3RvclxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHgubW92ZVRvKHhjLCB5YylcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5hcmMoeGMsIHljLCByRywgY3VtdWwgLSBpbmNyLCBjdW11bClcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oeGMsIHljKVxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGwoKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL25leHQgYW5ndWxhciBzZWN0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1bXVsICs9IGluY3JcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlXyA9PT0gJ2hhbGZ0b25lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9zZXQgY2F0ZWdvcnkgY29sb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBjb2xvclxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2dldCBjYXRlZ3JveSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gY2VsbFtjb2x1bW5dXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29tcHV0ZSBjYXRlZ29yeSByYWRpdXMgLSBpbiBnZW9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgckcgPSBzRyAqIDAuMzMzICogTWF0aC5zcXJ0KHZhbCAvIG1heFZhbClcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3IGNpcmNsZVxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguYXJjKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjICsgcmVzb2x1dGlvbiAqIDAuMjUgKiBNYXRoLmNvcyhjdW11bCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeWMgKyByZXNvbHV0aW9uICogMC4yNSAqIE1hdGguc2luKGN1bXVsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByRyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBNYXRoLlBJXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbCgpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vbmV4dCBhbmd1bGFyIHNlY3RvclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWwgKz0gaW5jclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHN5bWJvbCB0eXBlOicgKyB0eXBlXylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9jb21wdXRlIHRvdGFsXG4gICAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGNvbHVtbiBvZiBPYmplY3Qua2V5cyh0aGlzLmNvbG9yKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gK2NlbGxbY29sdW1uXVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXYpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHZcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF0b3RhbCB8fCBpc05hTih0b3RhbCkpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgICAgICAvL2RyYXcgZGVjb21wb3NpdGlvbiBzeW1ib2xcbiAgICAgICAgICAgICAgICBsZXQgY3VtdWwgPSAwXG4gICAgICAgICAgICAgICAgY29uc3QgZCA9IHJlc29sdXRpb24gKiAoMSAtIHNHIC8gcmVzb2x1dGlvbikgKiAwLjVcbiAgICAgICAgICAgICAgICBjb25zdCBvcmkgPSB0aGlzLnN0cmlwZXNPcmllbnRhdGlvbihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBbY29sdW1uLCBjb2xvcl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5jb2xvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9nZXQgc2hhcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmUgPSBjZWxsW2NvbHVtbl0gLyB0b3RhbFxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNoYXJlIHx8IGlzTmFOKHNoYXJlKSkgY29udGludWVcblxuICAgICAgICAgICAgICAgICAgICAvL3NldCBjb2xvclxuICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gY29sb3JcblxuICAgICAgICAgICAgICAgICAgICAvL2RyYXcgc3ltYm9sIHBhcnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVfID09PSAnZmxhZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBmbGFnIHN0cmlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9ob3Jpem9udGFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnggKyBkICsgb2Zmc2V0LmR4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnkgKyBkICsgY3VtdWwgKiBzRyArIG9mZnNldC5keSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlICogc0dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmVydGljYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFJlY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueCArIGQgKyBjdW11bCAqIHNHICsgb2Zmc2V0LmR4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnkgKyBkICsgb2Zmc2V0LmR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZSAqIHNHLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzR1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlXyA9PT0gJ3BpZWNoYXJ0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3IHBpZSBjaGFydCBhbmd1bGFyIHNlY3RvclxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbXB1dGUgYW5nbGVzXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhMSA9IGN1bXVsICogMiAqIE1hdGguUElcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGEyID0gKGN1bXVsICsgc2hhcmUpICogMiAqIE1hdGguUElcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oeGMsIHljKVxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmFyYyh4YywgeWMsIHNHICogMC41LCBhMSArIG9mZkFuZywgYTIgKyBvZmZBbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5waWVDaGFydEludGVybmFsUmFkaXVzRmFjdG9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5hcmMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5YyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0cgKiAwLjUgKiB0aGlzLnBpZUNoYXJ0SW50ZXJuYWxSYWRpdXNGYWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGExICsgb2ZmQW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhMiArIG9mZkFuZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGwoKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVfID09PSAncmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyByaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5hcmMoeGMsIHljLCBNYXRoLnNxcnQoMSAtIGN1bXVsKSAqIHNHICogMC41LCAwLCAyICogTWF0aC5QSSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5maWxsKClcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlXyA9PT0gJ3NlZ21lbnQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgc2VnbWVudCBzZWN0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0cgPSAoc0cgKiBzRykgLyByZXNvbHV0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2hvcml6b250YWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFJlY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueCArIG9mZnNldC5keCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC55ICsgKHJlc29sdXRpb24gLSB3RykgLyAyICsgY3VtdWwgKiB3RyArIG9mZnNldC5keSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmUgKiB3R1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92ZXJ0aWNhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5maWxsUmVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC54ICsgY3VtdWwgKiByZXNvbHV0aW9uICsgb2Zmc2V0LmR4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnkgKyAocmVzb2x1dGlvbiAtIHdHKSAvIDIgKyBvZmZzZXQuZHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlICogcmVzb2x1dGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc3ltYm9sIHR5cGU6JyArIHR5cGVfKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY3VtdWwgKz0gc2hhcmVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuaW1wb3J0IHsgcmFuZG9tTm9ybWFsIH0gZnJvbSAnZDMtcmFuZG9tJ1xuaW1wb3J0IHsgY2hlY2tXZWJHTFN1cHBvcnQsIG1ha2VXZWJHTENhbnZhcyB9IGZyb20gJy4uL3V0aWxzL3dlYkdMVXRpbHMuanMnXG5pbXBvcnQgeyBXZWJHTFNxdWFyZUNvbG9yaW5nIH0gZnJvbSAnLi4vdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZy5qcydcbmltcG9ydCB7IGNvbG9yIH0gZnJvbSAnZDMtY29sb3InXG5cbi8qKlxuICpcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIERvdERlbnNpdHlTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBudW1iZXIgb2YgZG90cyBmb3IgYSBjZWxsIHZhbHVlLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuZG90TnVtYmVyID0gb3B0cy5kb3ROdW1iZXIgfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiByZXNvbHV0aW9uIC8gMTAwKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogVGhlIGNvbG9yIG9mIHRoZSBkb3RzLiBTYW1lIGNvbG9yIGZvciBhbGwgZG90cyB3aXRoaW4gYSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnI0ZGNTczMycpIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiB0aGUgZG90cywgaW4gZ2VvIHVuaXQuIFNhbWUgc2l6ZSBmb3IgYWxsIGNlbGxzLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLCBudW1iZXIsb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuZG90U2l6ZSA9IG9wdHMuZG90U2l6ZSB8fCAoKHJlc29sdXRpb24sIHopID0+IDEuNSAqIHopIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2lnbWEgb2YgdGhlIGRvdHMgZGlzdHJpYnV0aW9uLiBTYW1lIHZhbHVlIGZvciBhbGwgY2VsbHMuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsIG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaWdtYSA9IG9wdHMuc2lnbWEgfHwgKChyZXNvbHV0aW9uLCB6KSA9PiByZXNvbHV0aW9uIC8gMikgLy8oYyxyLHosdnMpID0+IHt9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBjZWxscyBhcyB0ZXh0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG5cbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vZ2V0IHNpemVcbiAgICAgICAgY29uc3Qgc0dlbyA9IHRoaXMuZG90U2l6ZSA/IHRoaXMuZG90U2l6ZShyZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogelxuXG4gICAgICAgIC8vbWFrZSByYW5kb20gZnVuY3Rpb25cbiAgICAgICAgY29uc3Qgc2lnID0gdGhpcy5zaWdtYSA/IHRoaXMuc2lnbWEocmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHJlc29sdXRpb24gKiAwLjRcbiAgICAgICAgY29uc3QgcmFuZCA9IHJhbmRvbU5vcm1hbCgwLCBzaWcpXG5cbiAgICAgICAgY29uc3QgY3R4ID0gZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuXG4gICAgICAgIGlmIChjaGVja1dlYkdMU3VwcG9ydCgpKSB7XG4gICAgICAgICAgICAvL2NyZWF0ZSBjYW52YXMgYW5kIHdlYmdsIHJlbmRlcmVyXG4gICAgICAgICAgICBjb25zdCBjdldHTCA9IG1ha2VXZWJHTENhbnZhcyhnZW9DYW52YXMudyArICcnLCBnZW9DYW52YXMuaCArICcnKVxuICAgICAgICAgICAgaWYgKCFjdldHTCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHdlYkdMJylcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9jcmVhdGUgd2ViR0wgcHJvZ3JhbVxuICAgICAgICAgICAgY29uc3QgcHJvZyA9IG5ldyBXZWJHTFNxdWFyZUNvbG9yaW5nKGN2V0dMLmdsLCBzR2VvIC8geilcblxuICAgICAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uIC8gMlxuXG4gICAgICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgY29sb3JcbiAgICAgICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcbiAgICAgICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT09ICdub25lJykgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vbnVtYmVyIG9mIGRvdHNcbiAgICAgICAgICAgICAgICBjb25zdCBkb3ROdW1iZXIgPSB0aGlzLmRvdE51bWJlcihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG5cbiAgICAgICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByZXNvbHV0aW9uLCB6KVxuXG4gICAgICAgICAgICAgICAgLy9jZWxsIGNlbnRlclxuICAgICAgICAgICAgICAgIGNvbnN0IGN4ID0gY2VsbC54ICsgb2Zmc2V0LmR4ICsgcjJcbiAgICAgICAgICAgICAgICBjb25zdCBjeSA9IGNlbGwueSArIG9mZnNldC5keSArIHIyXG5cbiAgICAgICAgICAgICAgICAvL2NvbnZlcnQgY29sb3JcbiAgICAgICAgICAgICAgICBjb25zdCBjYyA9IGNvbG9yKGNvbClcbiAgICAgICAgICAgICAgICBpZiAoIWNjKSByZXR1cm5cblxuICAgICAgICAgICAgICAgIC8vcmFuZG9tIHBvaW50c1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGRvdE51bWJlcjsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBwcm9nLmFkZFBvaW50RGF0YTIoY3ggKyByYW5kKCksIGN5ICsgcmFuZCgpLCBjYy5yLCBjYy5nLCBjYy5iLCBjYy5vcGFjaXR5KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL2RyYXdcbiAgICAgICAgICAgIHByb2cuZHJhdyhnZW9DYW52YXMuZ2V0V2ViR0xUcmFuc2Zvcm0oKSlcblxuICAgICAgICAgICAgLy9kcmF3IGluIGNhbnZhcyBnZW9cbiAgICAgICAgICAgIGdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcbiAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoY3ZXR0wuY2FudmFzLCAwLCAwKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgICAgIC8vZ2V0IGNvbG9yXG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvcihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG4gICAgICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09PSAnbm9uZScpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgLy9zZXQgY29sb3JcbiAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gY29sXG5cbiAgICAgICAgICAgICAgICAvL251bWJlciBvZiBkb3RzXG4gICAgICAgICAgICAgICAgY29uc3QgZG90TnVtYmVyID0gdGhpcy5kb3ROdW1iZXIoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxuXG4gICAgICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgcmVzb2x1dGlvbiwgeilcblxuICAgICAgICAgICAgICAgIC8vZHJhdyByYW5kb20gZG90c1xuICAgICAgICAgICAgICAgIGNvbnN0IGN4ID0gY2VsbC54ICsgb2Zmc2V0LmR4ICsgcmVzb2x1dGlvbiAvIDIsXG4gICAgICAgICAgICAgICAgICAgIGN5ID0gY2VsbC55ICsgb2Zmc2V0LmR5ICsgcmVzb2x1dGlvbiAvIDJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBkb3ROdW1iZXI7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFJlY3QoY3ggKyByYW5kKCksIGN5ICsgcmFuZCgpLCBzR2VvLCBzR2VvKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5cbi8qKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgSW1hZ2VTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBpbWFnZSBVUkwgb2YgYSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuaW1hZ2UgPSBvcHRzLmltYWdlIHx8ICgoKSA9PiAnJykgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIFRoZSBpbWFnZSBzaXplIGluIGdyb3VuZCBtZXRlcnNcbiAgICAgICAgICogIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gICAgICAgICovXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZSB8fCAoKGNlbGwsIHJlc29sdXRpb24pID0+IHJlc29sdXRpb24pXG5cbiAgICAgICAgLyoqIERpY3Rpb25uYXJ5IG9mIHByZWxvYWRlZCBpbWFnZXMuIHVybCAtPiBpbWFnZVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fSAqL1xuICAgICAgICB0aGlzLmNhY2hlID0ge31cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgYXN5bmMgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56LFxuICAgICAgICAgICAgcmVzb2x1dGlvblBpeCA9IHJlc29sdXRpb24gLyB6XG5cbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vZHJhdyBpbiBzY3JlZW4gY29vcmRpbmF0ZXNcbiAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vZ2V0IGNlbGwgaW1hZ2UgdXJsXG4gICAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmltYWdlKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcbiAgICAgICAgICAgIGlmICghdXJsKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3NpemUgYW5kIHBvc2l0aW9uIHZhbHVlc1xuICAgICAgICAgICAgbGV0IHNpemVQaXggPSB0aGlzLnNpemUoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSAvIHpcbiAgICAgICAgICAgIGlmICghc2l6ZVBpeCkgY29udGludWVcblxuICAgICAgICAgICAgLy9nZXQgaW1hZ2UgZnJvbSBjYWNoZVxuICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLmNhY2hlW3VybF1cblxuICAgICAgICAgICAgLy9sb2FkaW5nLCBrZWVwIHdhaXRpbmdcbiAgICAgICAgICAgIGlmIChpbWFnZSA9PSAnbG9hZGluZycpIHJldHVyblxuICAgICAgICAgICAgLy9ubyBpbWFnZTogbG9hZCBpdFxuICAgICAgICAgICAgZWxzZSBpZiAoIWltYWdlKSB7XG4gICAgICAgICAgICAgICAgLy90YWcgYXMgbG9hZGluZ1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVbdXJsXSA9ICdsb2FkaW5nJ1xuXG4gICAgICAgICAgICAgICAgLy9kZWZpbmUgaW1hZ2VcbiAgICAgICAgICAgICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKVxuICAgICAgICAgICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vc3RvcmUgaW1hZ2UgZGF0YSBpbiBjYWNoZSBhbmQgcmVkcmF3XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVbdXJsXSA9IGltZ1xuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMucmVkcmF3KClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW1nLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vY2FzZSB3aGVuIG5vIGltYWdlXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IHJldHJpZXZlIGltYWdlIGZyb20nLCB1cmwpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vc2V0IFVSTCB0byBsYXVuY2ggdGhlIGRvd25sb2FkXG4gICAgICAgICAgICAgICAgaW1nLnNyYyA9IHVybFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL2RyYXcgaW1hZ2VcbiAgICAgICAgICAgICAgICBjb25zdCBkID0gKHJlc29sdXRpb25QaXggLSBzaXplUGl4KSAvIDJcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4LmRyYXdJbWFnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmdlb1RvUGl4WChjZWxsLngpICsgZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5nZW9Ub1BpeFkoY2VsbC55KSArIGQgLSByZXNvbHV0aW9uUGl4LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZVBpeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVQaXhcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcbmltcG9ydCB7IFNpZGVTdHlsZSB9IGZyb20gJy4vU2lkZVN0eWxlLmpzJ1xuXG4vKiogQHR5cGVkZWYge3t4Om51bWJlcix5Om51bWJlcixvcjpcInZcInxcImhcIixjMTppbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGx8dW5kZWZpbmVkLGMyOmltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbHx1bmRlZmluZWR9fSBTaWRlICovXG5cbi8qKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgSXNvRmVuY2VTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkaWN0aW9uYXJ5IChzdHJpbmcgLT4gY29sb3IpIHdoaWNoIGdpdmUgdGhlIGNvbG9yIG9mIGVhY2ggY2F0ZWdvcnkuXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBoZWlnaHQgb2YgYSBjZWxsIGluIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gb3B0cy5oZWlnaHQgfHwgKChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpID0+IHJlc29sdXRpb24gKiAwLjQpXG5cbiAgICAgICAgLyoqIFRoZSBwZXJzcGVjdGl2ZSBhbmdsZSwgaW4gZGVncmVlLCB3aXRoaW4gWy0xODAsMTgwXSwgZnJvbSBbTyx4XSBheGlzLlxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmFuZ2xlID0gb3B0cy5hbmdsZSAhPSB1bmRlZmluZWQgPyBvcHRzLmFuZ2xlIDogNTBcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvcm5lciBsaW5lIHN0cm9rZSBzdHlsZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCxudW1iZXIsbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvcm5lckxpbmVTdHJva2VDb2xvciA9IG9wdHMuY29ybmVyTGluZVN0cm9rZUNvbG9yIHx8ICgoYywgciwgeiwgYW5nbGUpID0+ICcjOTk5JylcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvcm5lciBsaW5lIHdpZHRoLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLG51bWJlcixudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuY29ybmVyTGluZVdpZHRoID0gb3B0cy5jb3JuZXJMaW5lV2lkdGggfHwgKChjLCByLCB6LCBhbmdsZSkgPT4gKGFuZ2xlICUgOTAgPT0gMCA/IDAgOiAwLjggKiB6KSlcblxuICAgICAgICAvKipcbiAgICAgICAgICogU2hvdyB2ZXJ0aWNhbCBjcm9zcy1zZWN0aW9ucy5cbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59ICovXG4gICAgICAgIHRoaXMuc1ZlcnQgPSBvcHRzLnNWZXJ0ICE9IHVuZGVmaW5lZCA/IG9wdHMuc1ZlcnQgOiB0cnVlXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNob3cgaG9yaXpvbnRhbCBjcm9zcy1zZWN0aW9ucy5cbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59ICovXG4gICAgICAgIHRoaXMuc0hvciA9IG9wdHMuc0hvciAhPSB1bmRlZmluZWQgPyBvcHRzLnNIb3IgOiB0cnVlXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9uYiBjYXRlZ29yaWVzIC0gdXNlZCBmb3IgcmFkYXIgYW5kIGFnZXB5cmFtaWRcbiAgICAgICAgY29uc3QgY2F0cyA9IE9iamVjdC5rZXlzKHRoaXMuY29sb3IpXG5cbiAgICAgICAgLy9oYWxmIHJlc29sdXRpb25cbiAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uIC8gMlxuXG4gICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KHVuZGVmaW5lZCwgcmVzb2x1dGlvbiwgeiksXG4gICAgICAgICAgICBkeCA9IG9mZnNldC5keCxcbiAgICAgICAgICAgIGR5ID0gb2Zmc2V0LmR5XG5cbiAgICAgICAgLy9tYWtlIHNpZGVzXG4gICAgICAgIC8qKiAgQHR5cGUge0FycmF5LjxTaWRlPn0gKi9cbiAgICAgICAgY29uc3Qgc2lkZXMgPSBTaWRlU3R5bGUuYnVpbGRTaWRlcyhcbiAgICAgICAgICAgIGNlbGxzLFxuICAgICAgICAgICAgcmVzb2x1dGlvbixcbiAgICAgICAgICAgIHRoaXMuYW5nbGUgJSAxODAgIT0gOTAgJiYgdGhpcy5zVmVydCxcbiAgICAgICAgICAgIHRoaXMuYW5nbGUgJSAxODAgIT0gMCAmJiB0aGlzLnNIb3JcbiAgICAgICAgKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGlmIChzaWRlcy5sZW5ndGggPT0gMCkgcmV0dXJuXG5cbiAgICAgICAgLy9hbmdsZSBpbiByYWRpYW5zXG4gICAgICAgIGNvbnN0IGFSYWQgPSAodGhpcy5hbmdsZSAqIE1hdGguUEkpIC8gMTgwLFxuICAgICAgICAgICAgY29zID0gTWF0aC5jb3MoYVJhZCksXG4gICAgICAgICAgICBzaW4gPSBNYXRoLnNpbihhUmFkKVxuXG4gICAgICAgIC8vc29ydCBzaWRlcyBzbyB0aGF0IHRoZSBiYWNrIG9uZXMgYXJlIGRyYXduIGZpcnN0LiBUaGlzIGRlcGVuZHMgb24gdGhlIGFuZ2xlLlxuICAgICAgICAvL2RlcGVuZGluZyBvbiBkaXN0YW5jZSB0byB0aGUgcmVmZXJlbmNlIGNvcm5lciBwb2ludFxuICAgICAgICBjb25zdCB4Q29ybmVyID0gTWF0aC5hYnModGhpcy5hbmdsZSkgPCA5MCA/IGdlb0NhbnZhcy5leHRHZW8ueE1pbiA6IGdlb0NhbnZhcy5leHRHZW8ueE1heFxuICAgICAgICBjb25zdCB5Q29ybmVyID0gdGhpcy5hbmdsZSA8IDAgPyBnZW9DYW52YXMuZXh0R2VvLnlNYXggOiBnZW9DYW52YXMuZXh0R2VvLnlNaW5cbiAgICAgICAgc2lkZXMuc29ydChcbiAgICAgICAgICAgIChzMSwgczIpID0+XG4gICAgICAgICAgICAgICAgTWF0aC5oeXBvdChzMi54IC0geENvcm5lciwgczIueSAtIHlDb3JuZXIpIC0gTWF0aC5oeXBvdChzMS54IC0geENvcm5lciwgczEueSAtIHlDb3JuZXIpXG4gICAgICAgIClcblxuICAgICAgICAvL3ByZXBhcmUgZnVuY3Rpb24gdG8gZHJhdyBjb3JuZXIgbGluZSBmb3IgYSBjZWxsICpjKlxuICAgICAgICBjb25zdCBkcmF3Q29ybmVyTGluZSA9IChjZWxsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNlbGwpIHJldHVyblxuICAgICAgICAgICAgLy9saW5lIHN0eWxlXG4gICAgICAgICAgICBjb25zdCBsdyA9IHRoaXMuY29ybmVyTGluZVdpZHRoID8gdGhpcy5jb3JuZXJMaW5lV2lkdGgoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdGhpcy5hbmdsZSkgOiAwLjggKiB6XG4gICAgICAgICAgICBpZiAobHcgPT0gMCkgcmV0dXJuXG4gICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmNvcm5lckxpbmVTdHJva2VDb2xvclxuICAgICAgICAgICAgICAgID8gdGhpcy5jb3JuZXJMaW5lU3Ryb2tlQ29sb3IoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdGhpcy5hbmdsZSlcbiAgICAgICAgICAgICAgICA6ICcjMzMzJ1xuICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IGx3XG5cbiAgICAgICAgICAgIC8vaGVpZ2h0IC0gaW4gZ2VvXG4gICAgICAgICAgICBjb25zdCBoRyA9IHRoaXMuaGVpZ2h0KGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcblxuICAgICAgICAgICAgLy9kcmF3IGxpbmVcbiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgY3R4Lm1vdmVUbyhjZWxsLnggKyByMiArIGR4LCBjZWxsLnkgKyByMiArIGR5KVxuICAgICAgICAgICAgY3R4LmxpbmVUbyhjZWxsLnggKyByMiArIGhHICogY29zICsgZHgsIGNlbGwueSArIHIyICsgaEcgKiBzaW4gKyBkeSlcbiAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9kcmF3IHNpZGVzXG4gICAgICAgIGN0eC5saW5lQ2FwID0gJ3JvdW5kJ1xuICAgICAgICBmb3IgKGxldCBzaWRlIG9mIHNpZGVzKSB7XG4gICAgICAgICAgICBjb25zdCBjMSA9IHNpZGUuYzEsXG4gICAgICAgICAgICAgICAgYzIgPSBzaWRlLmMyLFxuICAgICAgICAgICAgICAgIHggPSBzaWRlLngsXG4gICAgICAgICAgICAgICAgeSA9IHNpZGUueVxuXG4gICAgICAgICAgICAvL2hlaWdodHMgLSBpbiBnZW9cbiAgICAgICAgICAgIGNvbnN0IGhHMSA9IGMxID8gdGhpcy5oZWlnaHQoYzEsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiAwLFxuICAgICAgICAgICAgICAgIGhHMiA9IGMyID8gdGhpcy5oZWlnaHQoYzIsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiAwXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSB0b3RhbHMgZm9yIGJvdGggY2VsbHNcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsMSA9IGNvbXB1dGVUb3RhbChjMSwgY2F0cyksXG4gICAgICAgICAgICAgICAgdG90YWwyID0gY29tcHV0ZVRvdGFsKGMyLCBjYXRzKVxuICAgICAgICAgICAgaWYgKHRvdGFsMSA9PSAwICYmIHRvdGFsMiA9PSAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICBsZXQgY3VtdWwxID0gMCxcbiAgICAgICAgICAgICAgICBjdW11bDIgPSAwXG4gICAgICAgICAgICBmb3IgKGxldCBbY29sdW1uLCBjb2xvcl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5jb2xvcikpIHtcbiAgICAgICAgICAgICAgICAvL2RyYXcgc3RyaXBlIG9mIHNpZGUgcyBhbmQgY2F0ZWdvcnkgY29sdW1uXG5cbiAgICAgICAgICAgICAgICAvL2dldCB2YWx1ZXMgZm9yIGJvdGggY2VsbHNcbiAgICAgICAgICAgICAgICBsZXQgdjEgPSBjMSA/ICtjMVtjb2x1bW5dIDogMFxuICAgICAgICAgICAgICAgIGxldCB2MiA9IGMyID8gK2MyW2NvbHVtbl0gOiAwXG4gICAgICAgICAgICAgICAgaWYgKHYxID09IDAgJiYgdjIgPT0gMCkgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vY29tcHV0ZSBoZWlnaHRzXG4gICAgICAgICAgICAgICAgY29uc3QgaDEgPSAoaEcxICogY3VtdWwxKSAvIHRvdGFsMSB8fCAwXG4gICAgICAgICAgICAgICAgY29uc3QgaDFuID0gKGhHMSAqIChjdW11bDEgKyB2MSkpIC8gdG90YWwxIHx8IDBcbiAgICAgICAgICAgICAgICBjb25zdCBoMiA9IChoRzIgKiBjdW11bDIpIC8gdG90YWwyIHx8IDBcbiAgICAgICAgICAgICAgICBjb25zdCBoMm4gPSAoaEcyICogKGN1bXVsMiArIHYyKSkgLyB0b3RhbDIgfHwgMFxuXG4gICAgICAgICAgICAgICAgLy9tYWtlIHBhdGhcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBpZiAoc2lkZS5vciA9PSAnaCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9ob3Jpem9udGFsIHNpZGUgLSB2ZXJ0aWNhbCBzZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIC8vYm90dG9tIGxlZnRcbiAgICAgICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyh4ICsgaDEgKiBjb3MgKyBkeCwgeSAtIHIyICsgaDEgKiBzaW4gKyBkeSlcbiAgICAgICAgICAgICAgICAgICAgLy90b3AgbGVmdFxuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKHggKyBoMiAqIGNvcyArIGR4LCB5ICsgcjIgKyBoMiAqIHNpbiArIGR5KVxuICAgICAgICAgICAgICAgICAgICAvL3RvcCByaWdodFxuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKHggKyBoMm4gKiBjb3MgKyBkeCwgeSArIHIyICsgaDJuICogc2luICsgZHkpXG4gICAgICAgICAgICAgICAgICAgIC8vYm90dG9tIHJpZ2h0XG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oeCArIGgxbiAqIGNvcyArIGR4LCB5IC0gcjIgKyBoMW4gKiBzaW4gKyBkeSlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL3ZlcnRpY2FsIHNpZGUgLSBob3Jpem9udGFsIHNlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgLy9ib3R0b20gbGVmdFxuICAgICAgICAgICAgICAgICAgICBjdHgubW92ZVRvKHggLSByMiArIGgxICogY29zICsgZHgsIHkgKyBoMSAqIHNpbiArIGR5KVxuICAgICAgICAgICAgICAgICAgICAvL2JvdHRvbSByaWdodFxuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKHggKyByMiArIGgyICogY29zICsgZHgsIHkgKyBoMiAqIHNpbiArIGR5KVxuICAgICAgICAgICAgICAgICAgICAvL3RvcCByaWdodFxuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKHggKyByMiArIGgybiAqIGNvcyArIGR4LCB5ICsgaDJuICogc2luICsgZHkpXG4gICAgICAgICAgICAgICAgICAgIC8vdG9wIGxlZnRcbiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4IC0gcjIgKyBoMW4gKiBjb3MgKyBkeCwgeSArIGgxbiAqIHNpbiArIGR5KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL2NnLmN0eC5jbG9zZVBhdGgoKVxuXG4gICAgICAgICAgICAgICAgLy9maWxsXG4gICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbG9yXG4gICAgICAgICAgICAgICAgY3R4LmZpbGwoKVxuXG4gICAgICAgICAgICAgICAgY3VtdWwxICs9IHYxXG4gICAgICAgICAgICAgICAgY3VtdWwyICs9IHYyXG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gZHJhdyBvbmx5IG9uZSBsaW5lXG4gICAgICAgICAgICAgICAgLy9kcmF3IGNvcm5lciBsaW5lXG4gICAgICAgICAgICAgICAgLy9pZiAoc2lkZS5vciA9PSBcImhcIikge1xuICAgICAgICAgICAgICAgIGRyYXdDb3JuZXJMaW5lKGMxKVxuICAgICAgICAgICAgICAgIGRyYXdDb3JuZXJMaW5lKGMyKVxuICAgICAgICAgICAgICAgIC8vaWYgKHRoaXMuYW5nbGUgPiAwICYmIHNpZGUub3IgPT0gXCJoXCIpIGRyYXdDb3JuZXJMaW5lKGMyKVxuICAgICAgICAgICAgICAgIC8vZWxzZSBkcmF3Q29ybmVyTGluZShjMilcbiAgICAgICAgICAgICAgICAvL31cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXG4gICAgfVxufVxuXG5jb25zdCBjb21wdXRlVG90YWwgPSAoY2VsbCwgY2F0ZWdvcmllcykgPT4ge1xuICAgIGlmICghY2VsbCkgcmV0dXJuIDBcbiAgICBsZXQgdG90YWwgPSAwXG4gICAgZm9yIChsZXQgY29sdW1uIG9mIGNhdGVnb3JpZXMpIHtcbiAgICAgICAgY29uc3QgdiA9IGNlbGxbY29sdW1uXVxuICAgICAgICBpZiAoIXYpIGNvbnRpbnVlXG4gICAgICAgIHRvdGFsICs9ICt2XG4gICAgfVxuICAgIHJldHVybiB0b3RhbCB8fCAwXG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcblxuLyoqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBKb3lQbG90U3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgaGVpZ2h0IG9mIGEgY2VsbCBpbiBnZW9ncmFwaGljYWwgdW5pdC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0IHx8ICgoYywgcikgPT4gciAqIE1hdGgucmFuZG9tKCkpIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLHttaW46bnVtYmVyLCBtYXg6bnVtYmVyfSxudW1iZXIsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMubGluZUNvbG9yID0gb3B0cy5saW5lQ29sb3IgfHwgKCh5LCB5cywgciwgeikgPT4gJyNCQkInKVxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcix7bWluOm51bWJlciwgbWF4Om51bWJlcn0sbnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmxpbmVXaWR0aCA9IG9wdHMubGluZVdpZHRoIHx8ICgoeSwgeXMsIHIsIHopID0+IHopXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLHttaW46bnVtYmVyLCBtYXg6bnVtYmVyfSxudW1iZXIsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuZmlsbENvbG9yID0gb3B0cy5maWxsQ29sb3IgfHwgKCh5LCB5cywgciwgeikgPT4gJyNjMDhjNTk2OCcpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9pbmRleCBjZWxscyBieSB5IGFuZCB4XG4gICAgICAgIC8qKiAgQHR5cGUge29iamVjdH0gKi9cbiAgICAgICAgY29uc3QgaW5kID0ge31cbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICBsZXQgcm93ID0gaW5kW2NlbGwueV1cbiAgICAgICAgICAgIGlmICghcm93KSB7XG4gICAgICAgICAgICAgICAgcm93ID0ge31cbiAgICAgICAgICAgICAgICBpbmRbY2VsbC55XSA9IHJvd1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcm93W2NlbGwueF0gPSB0aGlzLmhlaWdodChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG4gICAgICAgIH1cblxuICAgICAgICAvL2NvbXB1dGUgZXh0ZW50XG4gICAgICAgIGNvbnN0IGUgPSBnZW9DYW52YXMuZXh0R2VvXG4gICAgICAgIGlmICghZSkgcmV0dXJuXG4gICAgICAgIGNvbnN0IHhNaW4gPSBNYXRoLmZsb29yKGUueE1pbiAvIHJlc29sdXRpb24pICogcmVzb2x1dGlvblxuICAgICAgICBjb25zdCB4TWF4ID0gTWF0aC5mbG9vcihlLnhNYXggLyByZXNvbHV0aW9uKSAqIHJlc29sdXRpb25cbiAgICAgICAgY29uc3QgeU1pbiA9IE1hdGguZmxvb3IoZS55TWluIC8gcmVzb2x1dGlvbikgKiByZXNvbHV0aW9uXG4gICAgICAgIGNvbnN0IHlNYXggPSBNYXRoLmZsb29yKGUueU1heCAvIHJlc29sdXRpb24pICogcmVzb2x1dGlvblxuXG4gICAgICAgIC8qKiAgQHR5cGUge3ttaW46bnVtYmVyLCBtYXg6bnVtYmVyfX0gKi9cbiAgICAgICAgY29uc3QgeXMgPSB7IG1pbjogeU1pbiwgbWF4OiB5TWF4IH1cblxuICAgICAgICAvL2RyYXcgbGluZXMsIHJvdyBieSByb3csIHN0YXRpbmcgZnJvbSB0aGUgdG9wXG4gICAgICAgIGN0eC5saW5lSm9pbiA9ICdyb3VuZCdcbiAgICAgICAgZm9yIChsZXQgeSA9IHlNYXg7IHkgPj0geU1pbjsgeSAtPSByZXNvbHV0aW9uKSB7XG4gICAgICAgICAgICAvL2dldCByb3dcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IGluZFt5XVxuXG4gICAgICAgICAgICAvL25vIHJvd1xuICAgICAgICAgICAgaWYgKCFyb3cpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vcGxhY2UgZmlyc3QgcG9pbnRcbiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgY3R4Lm1vdmVUbyh4TWluIC0gcmVzb2x1dGlvbiAvIDIsIHkpXG5cbiAgICAgICAgICAgIC8vc3RvcmUgdGhlIHByZXZpb3VzIGhlaWdodFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgbGV0IGhHX1xuXG4gICAgICAgICAgICAvL2dvIHRocm91Z2ggdGhlIGxpbmUgY2VsbHNcbiAgICAgICAgICAgIGZvciAobGV0IHggPSB4TWluOyB4IDw9IHhNYXg7IHggKz0gcmVzb2x1dGlvbikge1xuICAgICAgICAgICAgICAgIC8vZ2V0IGNvbHVtbiB2YWx1ZVxuICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAgICAgICAgIGxldCBoRyA9IHJvd1t4XVxuICAgICAgICAgICAgICAgIGlmICghaEcpIGhHID0gMFxuXG4gICAgICAgICAgICAgICAgaWYgKGhHIHx8IGhHXykge1xuICAgICAgICAgICAgICAgICAgICAvL2RyYXcgbGluZSBvbmx5IHdoZW4gYXQgbGVhc3Qgb25lIG9mIGJvdGggdmFsdWVzIGlzIG5vbi1udWxsXG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyB0ZXN0IGJlemllckN1cnZlVG9cbiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4ICsgcmVzb2x1dGlvbiAvIDIsIHkgKyBoRylcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL2Vsc2UgbW92ZSB0aGUgcG9pbnRcbiAgICAgICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyh4ICsgcmVzb2x1dGlvbiAvIDIsIHkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vc3RvcmUgdGhlIHByZXZpb3VzIHZhbHVlXG4gICAgICAgICAgICAgICAgaEdfID0gaEdcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9sYXN0IHBvaW50XG4gICAgICAgICAgICBpZiAoaEdfKSBjdHgubGluZVRvKHhNYXggKyByZXNvbHV0aW9uIC8gMiwgeSlcblxuICAgICAgICAgICAgLy9kcmF3IGZpbGxcbiAgICAgICAgICAgIGNvbnN0IGZjID0gdGhpcy5maWxsQ29sb3IoeSwgeXMsIHJlc29sdXRpb24sIHopXG4gICAgICAgICAgICBpZiAoZmMgJiYgZmMgIT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGZjXG4gICAgICAgICAgICAgICAgY3R4LmZpbGwoKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL2RyYXcgbGluZVxuICAgICAgICAgICAgY29uc3QgbGMgPSB0aGlzLmxpbmVDb2xvcih5LCB5cywgcmVzb2x1dGlvbiwgeilcbiAgICAgICAgICAgIGNvbnN0IGx3ID0gdGhpcy5saW5lV2lkdGgoeSwgeXMsIHJlc29sdXRpb24sIHopXG4gICAgICAgICAgICBpZiAobGMgJiYgbGMgIT0gJ25vbmUnICYmIGx3ID4gMCkge1xuICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGxjXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IGx3XG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFRhbmFrYVN0eWxlIH0gZnJvbSAnLi9UYW5ha2FTdHlsZS5qcydcbmltcG9ydCB7IFN0cm9rZVN0eWxlIH0gZnJvbSAnLi9TdHJva2VTdHlsZS5qcydcbmltcG9ydCB7IFNxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlIH0gZnJvbSAnLi9TcXVhcmVDb2xvckNhdGVnb3J5V2ViR0xTdHlsZS5qcydcbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcblxuLyoqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBMZWdvU3R5bGUge1xuICAgIHN0YXRpYyBnZXQodmFsdWUsIGJyZWFrcywgY29sb3JzLCBvcHRzID0ge30pIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvL3RoZSBjb2xvcnNcbiAgICAgICAgLy9odHRwOi8vd3d3Lmplbm55c2NyYXlvbmNvbGxlY3Rpb24uY29tLzIwMjEvMDYvYWxsLWN1cnJlbnQtbGVnby1jb2xvcnMuaHRtbFxuICAgICAgICAvL2h0dHBzOi8vbGVvbmF3aWN6LmdpdGh1Yi5pby9sZWdvY29sb3JzL3JlZmVyZW5jZS9maWd1cmVzL1JFQURNRS1wbG90LTEucG5nXG4gICAgICAgIC8qb3B0cy5jb2xvcnMgPSBvcHRzLmNvbG9ycyB8fCBbXG4gICAgICAgICAgICAnIzAwODUyYicsIC8vZGFya2VyIGdyZWVuXG4gICAgICAgICAgICAnI2FmZDI0NicsIC8vbGlnaHQgZ3JlZW5cbiAgICAgICAgICAgICcjZmFjODBhJywgLy9kYXJrIHllbGxvd1xuICAgICAgICAgICAgJyNiYjgwNWEnLCAvL2Jyb3duXG4gICAgICAgICAgICAnI2Q2NzkyMycsIC8vbW9zdGFyZFxuICAgICAgICAgICAgJyNjYjRlMjknLCAvL3JlZGlzaFxuICAgICAgICAgICAgJyNiNDAwMDAnLCAvL3JlZFxuICAgICAgICAgICAgJyM3MjAwMTInLCAvL2RhcmsgcmVkXG4gICAgICAgICAgICAvL1wicHVycGxlXCIsXG4gICAgICAgICAgICAvL1wiI2VlZVwiIC8vd2hpdGhlXG4gICAgICAgIF0qL1xuXG4gICAgICAgIG9wdHMuY29sRGFyayA9IG9wdHMuY29sRGFyayB8fCAnIzMzMydcbiAgICAgICAgb3B0cy5jb2xCcmlnaHQgPSBvcHRzLmNvbEJyaWdodCB8fCAnI2FhYSdcbiAgICAgICAgb3B0cy53aWR0aEZhY3RvciA9IG9wdHMud2lkdGhGYWN0b3IgfHwgMC4xMlxuXG4gICAgICAgIC8vcmV1c2UgdGFuYWthIGFzIGJhc2lzXG4gICAgICAgIGNvbnN0IHRzID0gVGFuYWthU3R5bGUuZ2V0KHZhbHVlLCBicmVha3MsIGNvbG9ycywgb3B0cylcbiAgICAgICAgLy9zdHlsZSB0byBzaG93IGxpbWl0cyBiZXR3ZWVuIHBpZWNlc1xuICAgICAgICBjb25zdCBzc3QgPSBuZXcgU3Ryb2tlU3R5bGUoe1xuICAgICAgICAgICAgc3Ryb2tlQ29sb3I6ICgpID0+ICcjNjY2JyxcbiAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAoYywgciwgeikgPT4gMC4yICogeixcbiAgICAgICAgICAgIGZpbHRlcjogb3B0cy5maWx0ZXIsXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHRzWzBdLFxuICAgICAgICAgICAgc3N0LFxuICAgICAgICAgICAgdHNbMV0sXG4gICAgICAgICAgICBuZXcgTGVnb1RvcFN0eWxlKHsgY29sRGFyazogb3B0cy5jb2xEYXJrLCBjb2xCcmlnaHQ6IG9wdHMuY29sQnJpZ2h0LCBmaWx0ZXI6IG9wdHMuZmlsdGVyIH0pLFxuICAgICAgICBdXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwpOnN0cmluZ30gY29kZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBjb2xvclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICogQHJldHVybnMge0FycmF5LjxTdHlsZT59XG4gICAgICovXG4gICAgc3RhdGljIGdldENhdGVnb3J5KGNvZGUsIGNvbG9yLCBvcHRzKSB7XG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgb3B0cy5jb2xEYXJrID0gb3B0cy5jb2xEYXJrIHx8ICcjMzMzJ1xuICAgICAgICBvcHRzLmNvbEJyaWdodCA9IG9wdHMuY29sQnJpZ2h0IHx8ICcjYWFhJ1xuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHMgPSBuZXcgU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUoeyBjb2RlOiBjb2RlLCBjb2xvcjogY29sb3IgfSlcbiAgICAgICAgLy9zdHlsZSB0byBzaG93IGxpbWl0cyBiZXR3ZWVuIHBpZWNlc1xuICAgICAgICBjb25zdCBzc3QgPSBuZXcgU3Ryb2tlU3R5bGUoeyBzdHJva2VDb2xvcjogKCkgPT4gJyM2NjYnLCBzdHJva2VXaWR0aDogKGMsIHIsIHopID0+IDAuMiAqIHogfSlcblxuICAgICAgICByZXR1cm4gW3MsIHNzdCwgbmV3IExlZ29Ub3BTdHlsZSh7IGNvbERhcms6IG9wdHMuY29sRGFyaywgY29sQnJpZ2h0OiBvcHRzLmNvbEJyaWdodCB9KV1cbiAgICB9XG59XG5cbi8qKlxuICogQSBzdHlsZSB0byBkcmF3IHRvcCBjaXJjbGUgb2YgbGVnbyBicmlja3MuXG4gKi9cbmNsYXNzIExlZ29Ub3BTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R8dW5kZWZpbmVkfSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuICAgICAgICB0aGlzLmNvbERhcmsgPSBvcHRzLmNvbERhcmsgfHwgJyMzMzMnXG4gICAgICAgIHRoaXMuY29sQnJpZ2h0ID0gb3B0cy5jb2xCcmlnaHQgfHwgJyNhYWEnXG4gICAgfVxuXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICBjdHgubGluZVdpZHRoID0gMC42ICogZ2VvQ2FudmFzLnZpZXcuelxuXG4gICAgICAgIC8vZGFyayBwYXJ0XG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sRGFya1xuICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgIGN0eC5hcmMoYy54ICsgciAqIDAuNSwgYy55ICsgciAqIDAuNSwgciAqIDAuNTUgKiAwLjUsIE1hdGguUEkgLyA0LCAtTWF0aC5QSSAqICgzIC8gNCksIHRydWUpXG4gICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vYnJpZ2h0IHBhcnRcbiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb2xCcmlnaHRcbiAgICAgICAgZm9yIChsZXQgYyBvZiBjZWxscykge1xuICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBjdHguYXJjKGMueCArIHIgKiAwLjUsIGMueSArIHIgKiAwLjUsIHIgKiAwLjU1ICogMC41LCBNYXRoLlBJIC8gNCwgLU1hdGguUEkgKiAoMyAvIDQpLCBmYWxzZSlcbiAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5cbi8qKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgTW9zYWljU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGNlbGwuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+ICcjRUE2QkFDJykgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIFRoZSBtb3NhaWMgZmFjdG9yLCB3aXRoaW4gWzAsMC41XS4gU2V0IHRvIDAgZm9yIG5vIG1vc2FpYyBlZmZlY3QuIFNldCB0byAwLjUgZm9yIHN0cm9uZyBtb3NhaWMgZWZmZWN0LlxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm1vc2FpY0ZhY3RvciA9IG9wdHMubW9zYWljRmFjdG9yIHx8IDAuMTVcblxuICAgICAgICAvKiogVGhlIG1vc2FpYyBzaGFkb3cgZmFjdG9yLCB3aXRoaW4gWzAsMC41XS4gU2V0IHRvIDAgZm9yIG5vIG1vc2FpYyBzaGFkb3cuIFNldCB0byAwLjUgZm9yIHN0cm9uZyBtb3NhaWMgc2hhZG93LlxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnNoYWRvd0ZhY3RvciA9IG9wdHMuc2hhZG93RmFjdG9yIHx8IDAuMlxuXG4gICAgICAgIC8qKiBUaGUgbW9zYWljIHNoYWRvdyBjb2xvci5cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5zaGFkb3dDb2xvciA9IG9wdHMuc2hhZG93Q29sb3IgfHwgJyM1NTUnXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgY29uc3QgY3R4ID0gZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL3NldCBzdHJva2Ugc3R5bGUsIGZvciBzaGFkb3dcbiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5zaGFkb3dDb2xvclxuICAgICAgICBjdHgubGluZVdpZHRoID0gdGhpcy5zaGFkb3dGYWN0b3IgKiByZXNvbHV0aW9uXG4gICAgICAgIGN0eC5saW5lSm9pbiA9ICdyb3VuZCdcbiAgICAgICAgY3R4LmxpbmVDYXAgPSAnYnV0dCdcblxuICAgICAgICAvL2Z1bmN0aW9uIHRvIGNvbXB1dGUgcG9zaXRpb24gbW9zYWljIGVmZmVjdFxuICAgICAgICBjb25zdCBkID0gcmVzb2x1dGlvbiAqIHRoaXMubW9zYWljRmFjdG9yXG4gICAgICAgIGNvbnN0IG1vc2FpYyA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IHg6IE1hdGgucmFuZG9tKCkgKiBkLCB5OiBNYXRoLnJhbmRvbSgpICogZCB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAvL3NldCBmaWxsIGNvbG9yXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT09ICdub25lJykgY29udGludWVcbiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBjb2xcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByZXNvbHV0aW9uLCB6KVxuXG4gICAgICAgICAgICAvL2NvbXB1dGUgcG9zaXRpb24gbW9zYWljIGVmZmVjdFxuICAgICAgICAgICAgY29uc3QgbGwgPSBtb3NhaWMoKSxcbiAgICAgICAgICAgICAgICB1bCA9IG1vc2FpYygpLFxuICAgICAgICAgICAgICAgIGxyID0gbW9zYWljKCksXG4gICAgICAgICAgICAgICAgdXIgPSBtb3NhaWMoKVxuXG4gICAgICAgICAgICAvL3N0cm9rZVxuICAgICAgICAgICAgaWYgKHRoaXMuc2hhZG93RmFjdG9yID4gMCkge1xuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgbGwueCwgY2VsbC55ICsgb2Zmc2V0LmR5ICsgbGwueSlcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGNlbGwueCArIG9mZnNldC5keCArIHJlc29sdXRpb24gLSBsci54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyBsci55KVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgcmVzb2x1dGlvbiAtIHVyLngsIGNlbGwueSArIG9mZnNldC5keSArIHJlc29sdXRpb24gLSB1ci55KVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL2ZpbGxcblxuICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBjdHgubW92ZVRvKGNlbGwueCArIG9mZnNldC5keCArIGxsLngsIGNlbGwueSArIG9mZnNldC5keSArIGxsLnkpXG4gICAgICAgICAgICBjdHgubGluZVRvKGNlbGwueCArIG9mZnNldC5keCArIHJlc29sdXRpb24gLSBsci54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyBsci55KVxuICAgICAgICAgICAgY3R4LmxpbmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyByZXNvbHV0aW9uIC0gdXIueCwgY2VsbC55ICsgb2Zmc2V0LmR5ICsgcmVzb2x1dGlvbiAtIHVyLnkpXG4gICAgICAgICAgICBjdHgubGluZVRvKGNlbGwueCArIG9mZnNldC5keCArIHVsLngsIGNlbGwueSArIG9mZnNldC5keSArIHJlc29sdXRpb24gLSB1bC55KVxuICAgICAgICAgICAgY3R4LmZpbGwoKVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcblxuLyoqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBOaW5qYVN0YXJTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gJyNFQTZCQUMnKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgYSBjZWxsLCB3aXRoaW4gWzAsMV06XG4gICAgICAgICAqICAtIDAsIG5vdGhpbmcgc2hvd25cbiAgICAgICAgICogIC0gMSwgZW50aXJlIHNxdWFyZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZSB8fCAoKGNlbGwsIHJlc29sdXRpb24pID0+IHJlc29sdXRpb24pIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2hhcGUuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAoKCkgPT4gJ28nKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuICAgICAgICBjb25zdCBjdHggPSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4XG5cbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAqIDAuNVxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAvL2NvbG9yXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT09ICdub25lJykgY29udGludWVcbiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBjb2xcblxuICAgICAgICAgICAgLy9zaXplIC0gaW4gZ2VvIHVuaXRcbiAgICAgICAgICAgIGxldCBrID0gdGhpcy5zaXplKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcbiAgICAgICAgICAgIGsgPSBrIDwgMCA/IDAgOiBrID4gMSA/IDEgOiBrXG4gICAgICAgICAgICBjb25zdCBzRzIgPSBrICogcjJcblxuICAgICAgICAgICAgLy9zaGFwZVxuICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSB0aGlzLnNoYXBlID8gdGhpcy5zaGFwZShjZWxsKSA6ICdvJ1xuICAgICAgICAgICAgaWYgKHNoYXBlID09PSAnbm9uZScpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgLy9UT0RPIHVzZVxuICAgICAgICAgICAgLy9jb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByLCB6KVxuXG4gICAgICAgICAgICAvL2NlbnRlciBwb3NpdGlvblxuICAgICAgICAgICAgY29uc3QgY3ggPSBjZWxsLnggKyByMlxuICAgICAgICAgICAgY29uc3QgY3kgPSBjZWxsLnkgKyByMlxuXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdwJykge1xuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oY3gsIGN5ICsgcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCArIHNHMiwgY3kgKyBzRzIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCArIHIyLCBjeSlcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGN4ICsgc0cyLCBjeSAtIHNHMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGN4LCBjeSAtIHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oY3ggLSBzRzIsIGN5IC0gc0cyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oY3ggLSByMiwgY3kpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCAtIHNHMiwgY3kgKyBzRzIpXG4gICAgICAgICAgICAgICAgY3R4LmZpbGwoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ28nKSB7XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjeCwgY3kgKyBzRzIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCArIHIyLCBjeSArIHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oY3ggKyBzRzIsIGN5KVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oY3ggKyByMiwgY3kgLSByMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGN4LCBjeSAtIHNHMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGN4IC0gcjIsIGN5IC0gcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCAtIHNHMiwgY3kpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCAtIHIyLCBjeSArIHIyKVxuICAgICAgICAgICAgICAgIGN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNoYXBlOicgKyBzaGFwZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5cbi8qKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgUGlsbGFyU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgaGVpZ2h0IG9mIHRoZSBsaW5lIHJlcHJlc2VudGluZyBhIGNlbGwsIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodFxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGxpbmUgcmVwcmVzZW50aW5nIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gJyNjMDhjNTknKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHdpZHRoIG9mIHRoZSBsaW5lIHJlcHJlc2VudGluZyBhIGNlbGwsIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiAwLjUgKiByZXNvbHV0aW9uKVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgd2lkdGggb2YgdGhlIGxpbmUgcmVwcmVzZW50aW5nIGEgY2VsbCwgaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlciwgbnVtYmVyLG9iamVjdCk6Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5zaW1wbGUgPSBvcHRzLnNpbXBsZSB8fCAoKCkgPT4gZmFsc2UpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMudmlld0hlaWdodEZhY3RvciA9IG9wdHMudmlld0hlaWdodEZhY3RvciB8fCAxLjVcbiAgICAgICAgLy8wLDAgaXMgdGhlIGNlbnRlclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy52aWV3U1ggPSBvcHRzLnZpZXdTWCA9PSB1bmRlZmluZWQgPyAwIDogb3B0cy52aWV3U1hcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMudmlld1NZID0gb3B0cy52aWV3U1kgPT0gdW5kZWZpbmVkID8gLTAuNSA6IG9wdHMudmlld1NZXG5cbiAgICAgICAgLy9UT0RPIHJlcGxhY2Ugd2l0aCBzdW4gbG9jYXRpb24gP1xuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaGFkb3dEaXJlY3Rpb24gPVxuICAgICAgICAgICAgb3B0cy5zaGFkb3dEaXJlY3Rpb24gPT0gdW5kZWZpbmVkID8gKC00MC4zICogTWF0aC5QSSkgLyAxODAuMCA6IG9wdHMuc2hhZG93RGlyZWN0aW9uXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnNoYWRvd0ZhY3RvciA9IG9wdHMuc2hhZG93RmFjdG9yIHx8IDAuM1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5zaGFkb3dDb2xvciA9IG9wdHMuc2hhZG93Q29sb3IgfHwgJyMwMDAwMDAzMydcblxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5vdXRsaW5lQ29sID0gb3B0cy5vdXRsaW5lQ29sIHx8ICcjRkZGRkZGJ1xuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5vdXRsaW5lV2lkdGhQaXggPSBvcHRzLm91dGxpbmVXaWR0aFBpeCA9PSB1bmRlZmluZWQgPyAwLjUgOiBvcHRzLm91dGxpbmVXaWR0aFBpeFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgc2VnbWVudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgY29uc3QgY3R4ID0gZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL2dldCB2aWV3IGNlbnRlciBnZW8gcG9zaXRpb25cbiAgICAgICAgY29uc3QgY3Z4ID0gZ2VvQ2FudmFzLnZpZXcueCArIHRoaXMudmlld1NYICogZ2VvQ2FudmFzLncgKiB6XG4gICAgICAgIGNvbnN0IGN2eSA9IGdlb0NhbnZhcy52aWV3LnkgKyB0aGlzLnZpZXdTWSAqIGdlb0NhbnZhcy5oICogelxuICAgICAgICAvL2dldCB2aWV3IGhlaWdodFxuICAgICAgICBjb25zdCBIID0gdGhpcy52aWV3SGVpZ2h0RmFjdG9yICogKGdlb0NhbnZhcy53ICsgZ2VvQ2FudmFzLmgpICogMC41ICogelxuXG4gICAgICAgIC8vc29ydCBjZWxscyBieSB5IGFuZCB4XG4gICAgICAgIC8vY29uc3QgZGlzdFRvVmlld0NlbnRlciA9IChjKSA9PiB7IGNvbnN0IGR4ID0gY3Z4IC0gYy54LCBkeSA9IGN2eSAtIGMueTsgcmV0dXJuIE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSkgfVxuICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IDEwMDAwMDAwMCAqIChjMi55IC0gYzEueSkgKyBjMS54IC0gYzIueClcblxuICAgICAgICAvL2dldCBzaW1wbGUgaW5mb3JtYXRpb25cbiAgICAgICAgY29uc3Qgc2ltcGxlID0gdGhpcy5zaW1wbGUocmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxuXG4gICAgICAgIGN0eC5saW5lQ2FwID0gc2ltcGxlID8gJ2J1dHQnIDogJ3JvdW5kJ1xuXG4gICAgICAgIC8vZHJhdyBzaGFkb3dzXG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHRoaXMuc2hhZG93Q29sb3JcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHRoaXMuc2hhZG93Q29sb3JcbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgLy93aWR0aFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIXdHIHx8IHdHIDwgMCkgY29udGludWVcblxuICAgICAgICAgICAgLy9oZWlnaHRcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGhHID0gdGhpcy5oZWlnaHQgPyB0aGlzLmhlaWdodChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWhHIHx8IGhHIDwgMCkgY29udGludWVcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICAvL1RPRE8gdXNlIHRoYXRcbiAgICAgICAgICAgIC8vY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoYywgcmVzb2x1dGlvbiwgeilcblxuICAgICAgICAgICAgLy9zZXQgd2lkdGhcbiAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSB3R1xuXG4gICAgICAgICAgICAvL2NvbXB1dGUgY2VsbCBjZW50ZXIgcG9zdGl0aW9uXG4gICAgICAgICAgICBjb25zdCBjeCA9IGNlbGwueCArIHJlc29sdXRpb24gLyAyXG4gICAgICAgICAgICBjb25zdCBjeSA9IGNlbGwueSArIHJlc29sdXRpb24gLyAyXG4gICAgICAgICAgICBjb25zdCBscyA9IGhHICogdGhpcy5zaGFkb3dGYWN0b3JcblxuICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnRcbiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgY3R4Lm1vdmVUbyhjeCwgY3kpXG4gICAgICAgICAgICBjdHgubGluZVRvKGN4ICsgbHMgKiBNYXRoLmNvcyh0aGlzLnNoYWRvd0RpcmVjdGlvbiksIGN5ICsgbHMgKiBNYXRoLnNpbih0aGlzLnNoYWRvd0RpcmVjdGlvbikpXG4gICAgICAgICAgICBjdHguc3Ryb2tlKClcblxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgIGlmICh0aGlzLnNpbXBsZSkge1xuICAgICAgICAgICAgICAgIC8vZHJhdyBiYXNlIGNpcmNsZVxuICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgICAgICBjZy5jdHguYXJjKFxuICAgICAgICAgICAgICAgICAgICBjeCwgY3ksXG4gICAgICAgICAgICAgICAgICAgIHdHICogMC41LFxuICAgICAgICAgICAgICAgICAgICAwLCAyICogTWF0aC5QSSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIC8vY2cuY3R4LnN0cm9rZSgpO1xuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsKCk7XG4gICAgICAgICAgICB9Ki9cbiAgICAgICAgfVxuXG4gICAgICAgIC8vZHJhdyBwaWxsYXJzXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vY29sb3JcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghY29sKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3dpZHRoXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCB3RyA9IHRoaXMud2lkdGggPyB0aGlzLndpZHRoKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghd0cgfHwgd0cgPCAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2hlaWdodFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3QgaEcgPSB0aGlzLmhlaWdodCA/IHRoaXMuaGVpZ2h0KGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghaEcgfHwgaEcgPCAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgIC8vVE9ETyB1c2UgdGhhdFxuICAgICAgICAgICAgLy9jb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjLCByZXNvbHV0aW9uLCB6KVxuXG4gICAgICAgICAgICAvL2NvbXB1dGUgY2VsbCBjZW50ZXIgcG9zdGl0aW9uXG4gICAgICAgICAgICBjb25zdCBjeCA9IGNlbGwueCArIHJlc29sdXRpb24gLyAyXG4gICAgICAgICAgICBjb25zdCBjeSA9IGNlbGwueSArIHJlc29sdXRpb24gLyAyXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBhbmdsZVxuICAgICAgICAgICAgY29uc3QgZHggPSBjeCAtIGN2eCxcbiAgICAgICAgICAgICAgICBkeSA9IGN5IC0gY3Z5XG4gICAgICAgICAgICBjb25zdCBhID0gTWF0aC5hdGFuMihkeSwgZHgpXG4gICAgICAgICAgICBjb25zdCBEID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KVxuICAgICAgICAgICAgY29uc3QgZCA9IChEICogaEcpIC8gKEggLSBoRylcblxuICAgICAgICAgICAgaWYgKHNpbXBsZSkge1xuICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50XG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gY29sXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHdHXG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjeCwgY3kpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCArIGQgKiBNYXRoLmNvcyhhKSwgY3kgKyBkICogTWF0aC5zaW4oYSkpXG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vZHJhdyBiYWNrZ3JvdW5kIHNlZ21lbnRcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSB0aGlzLm91dGxpbmVDb2xcbiAgICAgICAgICAgICAgICBjdHgubGluZVdpZHRoID0gd0cgKyAyICogdGhpcy5vdXRsaW5lV2lkdGhQaXggKiB6XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjeCwgY3kpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCArIGQgKiBNYXRoLmNvcyhhKSwgY3kgKyBkICogTWF0aC5zaW4oYSkpXG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG5cbiAgICAgICAgICAgICAgICAvL2RyYXcgc2VnbWVudFxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGNvbFxuICAgICAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSB3R1xuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oY3gsIGN5KVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oY3ggKyBkICogTWF0aC5jb3MoYSksIGN5ICsgZCAqIE1hdGguc2luKGEpKVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuXG4gICAgICAgICAgICAgICAgLy9kcmF3IHRvcCBjaXJjbGVcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSB0aGlzLm91dGxpbmVDb2xcbiAgICAgICAgICAgICAgICAvL2NnLmN0eC5maWxsU3R5bGUgPSBcIiNjMDhjNTlcIlxuICAgICAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSB0aGlzLm91dGxpbmVXaWR0aFBpeCAqIHpcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHguYXJjKGN4ICsgZCAqIE1hdGguY29zKGEpLCBjeSArIGQgKiBNYXRoLnNpbihhKSwgd0cgKiAwLjUsIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSlcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgICAgICAvL2NnLmN0eC5maWxsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL2luIGNhc2UuLi5cbiAgICAgICAgY3R4LmxpbmVDYXAgPSAnYnV0dCdcblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKipcbiAqIEEgc3R5bGUgd2hlcmUgZWFjaCBjZWxsIGlzIHJlcHJlc2VudGVkIGJ5IGEgc2VnbWVudCB3aG9zZSBsZW5ndGgsIHdpZHRoLCBjb2xvciBhbmQgb3JpZW50YXRpb24gY2FuIHZhcnkgYWNjb3JkaW5nIHRvIHN0YXRpc3RpY2FsIHZhbHVlcy5cbiAqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWdtZW50U3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGNlbGwgc2VnbWVudC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gJyNFQTZCQUMnKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHdpZHRoIG9mIHRoZSBzZWdtZW50IHJlcHJlc2VudGluZyBhIGNlbGwsIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiByZXNvbHV0aW9uICogMC4xKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGxlbmd0aCBvZiB0aGUgc2VnbWVudCByZXByZXNlbnRpbmcgYSBjZWxsLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMubGVuZ3RoID0gb3B0cy5sZW5ndGggfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiByZXNvbHV0aW9uICogMC45KSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIG9yaWVudGF0aW9uIChpbiBkZWdyZWVzKSBvZiB0aGUgc2VnbWVudCByZXByZXNlbnRpbmcgYSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMub3JpZW50YXRpb24gPSBvcHRzLm9yaWVudGF0aW9uIHx8ICgoKSA9PiAxODAgKiBNYXRoLnJhbmRvbSgpKSAvLyhjLHIseix2cykgPT4ge31cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHNlZ21lbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9cbiAgICAgICAgY3R4LmxpbmVDYXAgPSAnYnV0dCdcblxuICAgICAgICAvL2NvbnZlcnNpb24gZmFjdG9yIGRlZ3JlZSAtPiByYWRpYW5cbiAgICAgICAgY29uc3QgZiA9IE1hdGguUEkgLyAxODBcblxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAvL2NvbG9yXG4gICAgICAgICAgICAvKiogQHR5cGUge3N0cmluZ3x1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWNvbCkgY29udGludWVcblxuICAgICAgICAgICAgLy93aWR0aFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIXdHIHx8IHdHIDwgMCkgY29udGludWVcblxuICAgICAgICAgICAgLy9sZW5ndGhcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGxHID0gdGhpcy5sZW5ndGggPyB0aGlzLmxlbmd0aChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWxHIHx8IGxHIDwgMCkgY29udGludWVcblxuICAgICAgICAgICAgLy9vcmllbnRhdGlvbiAoaW4gcmFkaWFuKVxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgICAgICBjb25zdCBvciA9IHRoaXMub3JpZW50YXRpb24oY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSAqIGZcbiAgICAgICAgICAgIGlmIChvciA9PT0gdW5kZWZpbmVkIHx8IGlzTmFOKG9yKSkgY29udGludWVcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByZXNvbHV0aW9uLCB6KVxuXG4gICAgICAgICAgICAvL3NldCBjb2xvciBhbmQgd2lkdGhcbiAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGNvbFxuICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHdHXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBzZWdtZW50IGNlbnRlciBwb3N0aXRpb25cbiAgICAgICAgICAgIGNvbnN0IGN4ID0gY2VsbC54ICsgcmVzb2x1dGlvbiAvIDIgKyBvZmZzZXQuZHhcbiAgICAgICAgICAgIGNvbnN0IGN5ID0gY2VsbC55ICsgcmVzb2x1dGlvbiAvIDIgKyBvZmZzZXQuZHlcblxuICAgICAgICAgICAgLy9jb21wdXRlIHNlZ21lbnQgZGlyZWN0aW9uXG4gICAgICAgICAgICBjb25zdCBkeCA9IDAuNSAqIE1hdGguY29zKG9yKSAqIGxHXG4gICAgICAgICAgICBjb25zdCBkeSA9IDAuNSAqIE1hdGguc2luKG9yKSAqIGxHXG5cbiAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50XG4gICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgIGN0eC5tb3ZlVG8oY3ggLSBkeCwgY3kgLSBkeSlcbiAgICAgICAgICAgIGN0eC5saW5lVG8oY3ggKyBkeCwgY3kgKyBkeSlcbiAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyB2aWV3U2NhbGU6IHZpZXdTY2FsZSwgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgY2VsbHM6IGNlbGxzIH0pXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5cbi8qKlxuICogQSB2ZXJ5IGdlbmVyaWMgc3R5bGUgdGhhdCBzaG93cyBncmlkIGNlbGxzIHdpdGggc3BlY2lmaWMgY29sb3IsIHNpemUgYW5kIHNoYXBlLlxuICogSXQgY2FuIGJlIHVzZWQgdG8gc2hvdyB2YXJpYWJsZXMgYXMgY2VsbCBjb2xvcnMsIGNlbGwgc2l6ZSwgY2VsbCBzaGFwZSwgb3IgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSB0aHJlZSB2aXN1YWwgdmFyaWFibGVzLlxuICpcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFNoYXBlQ29sb3JTaXplU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuICAgICAgICAvKiogQHR5cGUgeyhmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOnN0cmluZykgfCBzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICcjRUE2QkFDJ1xuXG4gICAgICAgIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyKSB8IG51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIHx8ICgoY2VsbCwgcmVzb2x1dGlvbikgPT4gcmVzb2x1dGlvbilcblxuICAgICAgICAvKiogQHR5cGUgeyhmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsIG51bWJlcixvYmplY3QpOmltcG9ydChcIi4uL2NvcmUvU3R5bGUuanNcIikuU2hhcGUpIHwgc3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAnc3F1YXJlJ1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgc3F1YXJlcywgd2l0aCB2YXJpb3VzIGNvbG9ycyBhbmQgc2l6ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzIC0gVGhlIGdyaWQgY2VsbHMgdG8gZHJhdy5cbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzIC0gVGhlIGNhbnZhcyB0byBkcmF3IG9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIC0gUmVzb2x1dGlvbiBvZiB0aGUgZ3JpZC5cbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL3pvb21cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uICogMC41XG5cbiAgICAgICAgLy8gUHJlY29tcHV0ZSBpZiBjb2xvciwgc2l6ZSwgYW5kIHNoYXBlIGFyZSBmdW5jdGlvbnMsIGZvciBlZmZpY2llbmN5XG4gICAgICAgIGNvbnN0IGlzQ29sb3JGdW5jdGlvbiA9IHR5cGVvZiB0aGlzLmNvbG9yID09PSAnZnVuY3Rpb24nXG4gICAgICAgIGNvbnN0IGlzU2l6ZUZ1bmN0aW9uID0gdHlwZW9mIHRoaXMuc2l6ZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICBjb25zdCBpc1NoYXBlRnVuY3Rpb24gPSB0eXBlb2YgdGhpcy5zaGFwZSA9PT0gJ2Z1bmN0aW9uJ1xuXG4gICAgICAgIGNvbnN0IGRlZmF1bHRDb2xvciA9IHRoaXMuY29sb3IgfHwgJ2JsYWNrJ1xuICAgICAgICBjb25zdCBkZWZhdWx0U2l6ZSA9IHRoaXMuc2l6ZSB8fCByZXNvbHV0aW9uXG4gICAgICAgIGNvbnN0IGRlZmF1bHRTaGFwZSA9IHRoaXMuc2hhcGUgfHwgJ3NxdWFyZSdcblxuICAgICAgICAvLyBPcHRpbWl6ZWRcbiAgICAgICAgY29uc3QgY29sb3JGdW5jdGlvbiA9IGlzQ29sb3JGdW5jdGlvbiA/IHRoaXMuY29sb3IgOiBudWxsXG4gICAgICAgIGNvbnN0IHNpemVGdW5jdGlvbiA9IGlzU2l6ZUZ1bmN0aW9uID8gdGhpcy5zaXplIDogbnVsbFxuICAgICAgICBjb25zdCBzaGFwZUZ1bmN0aW9uID0gaXNTaGFwZUZ1bmN0aW9uID8gdGhpcy5zaGFwZSA6IG51bGxcblxuICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAvLyBEZXRlcm1pbmUgY29sb3JcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgY29sID0gY29sb3JGdW5jdGlvbiA/IGNvbG9yRnVuY3Rpb24oYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IGRlZmF1bHRDb2xvclxuICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09PSAnbm9uZScpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vIERldGVybWluZSBzaXplXG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSBzaXplRnVuY3Rpb24gPyBzaXplRnVuY3Rpb24oYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IGRlZmF1bHRTaXplXG4gICAgICAgICAgICBpZiAoIXNpemUpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vIERldGVybWluZSBzaGFwZVxuICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBzaGFwZSA9IHNoYXBlRnVuY3Rpb24gPyBzaGFwZUZ1bmN0aW9uKGMsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiBkZWZhdWx0U2hhcGVcbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ25vbmUnKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGMsIHJlc29sdXRpb24sIHopXG5cbiAgICAgICAgICAgIC8vZ2V0IGNvbnRleHRcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcbiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBjb2xcbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ3NxdWFyZScpIHtcbiAgICAgICAgICAgICAgICAvL2RyYXcgc3F1YXJlXG4gICAgICAgICAgICAgICAgY29uc3QgZCA9IHJlc29sdXRpb24gKiAoMSAtIHNpemUgLyByZXNvbHV0aW9uKSAqIDAuNVxuICAgICAgICAgICAgICAgIGN0eC5maWxsUmVjdChjLnggKyBkICsgb2Zmc2V0LmR4LCBjLnkgKyBkICsgb2Zmc2V0LmR5LCBzaXplLCBzaXplKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ2NpcmNsZScpIHtcbiAgICAgICAgICAgICAgICAvL2RyYXcgY2lyY2xlXG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4LmFyYyhjLnggKyByMiArIG9mZnNldC5keCwgYy55ICsgcjIgKyBvZmZzZXQuZHksIHNpemUgKiAwLjUsIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSlcbiAgICAgICAgICAgICAgICBjdHguZmlsbCgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnZG9udXQnKSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IGRvbnV0XG4gICAgICAgICAgICAgICAgY29uc3QgeGMgPSBjLnggKyByMiArIG9mZnNldC5keCxcbiAgICAgICAgICAgICAgICAgICAgeWMgPSBjLnkgKyByMiArIG9mZnNldC5keVxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oeGMsIHljKVxuICAgICAgICAgICAgICAgIGN0eC5hcmMoeGMsIHljLCByMiwgMCwgMiAqIE1hdGguUEkpXG4gICAgICAgICAgICAgICAgY3R4LmFyYyh4YywgeWMsICgxIC0gc2l6ZSAvIHJlc29sdXRpb24pICogcjIsIDAsIDIgKiBNYXRoLlBJLCB0cnVlKVxuICAgICAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdkaWFtb25kJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHMyID0gc2l6ZSAqIDAuNVxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oYy54ICsgcjIgLSBzMiwgYy55ICsgcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyByMiwgYy55ICsgcjIgKyBzMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHIyICsgczIsIGMueSArIHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcjIsIGMueSArIHIyIC0gczIpXG4gICAgICAgICAgICAgICAgY3R4LmZpbGwoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3RyaWFuZ2xlX3VwJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyMiA9IChzaXplIC0gcmVzb2x1dGlvbikgLyAyXG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjLnggLSBkcjIsIGMueSAtIGRyMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHIyLCBjLnkgKyByZXNvbHV0aW9uICsgZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcmVzb2x1dGlvbiArIGRyMiwgYy55IC0gZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICd0cmlhbmdsZV9kb3duJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyMiA9IChzaXplIC0gcmVzb2x1dGlvbikgLyAyXG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjLnggLSBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyByMiwgYy55IC0gZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcmVzb2x1dGlvbiArIGRyMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcbiAgICAgICAgICAgICAgICBjdHguZmlsbCgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAndHJpYW5nbGVfbGVmdCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oYy54ICsgcmVzb2x1dGlvbiArIGRyMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCAtIGRyMiwgYy55ICsgcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgLSBkcjIpXG4gICAgICAgICAgICAgICAgY3R4LmZpbGwoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3RyaWFuZ2xlX3JpZ2h0Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyMiA9IChzaXplIC0gcmVzb2x1dGlvbikgLyAyXG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjLnggLSBkcjIsIGMueSAtIGRyMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSArIHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54IC0gZHIyLCBjLnkgKyByZXNvbHV0aW9uICsgZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNoYXBlOicgKyBzaGFwZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgdmlld1NjYWxlOiB2aWV3U2NhbGUsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIGNlbGxzOiBjZWxscyB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU2lkZVN0eWxlIH0gZnJvbSAnLi9TaWRlU3R5bGUuanMnXG5cbi8qKlxuICogQSBzdHlsZSB0byBzaG93IHRoZSBzaWRlcyBvZiBncmlkIGNlbGxzIGJhc2VkIG9uIHRoZWlyIGRpZmZlcmVudCBjYXRlZ29yaWVzLlxuICpcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFNpZGVDYXRlZ29yeVN0eWxlIGV4dGVuZHMgU2lkZVN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjYXRlZ29yeSBjb2RlIG9mIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2RlID0gb3B0cy5jb2RlXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkaWN0aW9uYXJ5IChzdHJpbmcgLT4gY29sb3IpIHdoaWNoIGdpdmUgdGhlIGNvbG9yIG9mIGVhY2ggY2F0ZWdvcnkuXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICAvL2J1aWxkIHNpZGVzXG5cbiAgICAgICAgLyoqICBAdHlwZSB7QXJyYXkuPGltcG9ydCgnLi9TaWRlU3R5bGUuanMnKS5TaWRlPn0gKi9cbiAgICAgICAgY29uc3Qgc2lkZXMgPSBTaWRlU3R5bGUuYnVpbGRTaWRlcyhjZWxscywgcmVzb2x1dGlvbilcbiAgICAgICAgaWYgKHNpZGVzLmxlbmd0aCA9PSAwKSByZXR1cm5cblxuICAgICAgICAvL2dldCBzaWRlIHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShzaWRlcywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL2RyYXcgc2lkZXNcblxuICAgICAgICBjdHgubGluZUNhcCA9ICdidXR0J1xuICAgICAgICBjb25zdCByMiA9IHJlc29sdXRpb24gKiAwLjVcbiAgICAgICAgZm9yIChsZXQgc2lkZSBvZiBzaWRlcykge1xuICAgICAgICAgICAgLy9nZXQgY2F0ZWdvcnkgY29kZXMgZm9yIGJvdGggY2VsbHNcbiAgICAgICAgICAgIGNvbnN0IGNvZGUxID0gc2lkZS5jMSA/IHRoaXMuY29kZShzaWRlLmMxLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgY29uc3QgY29kZTIgPSBzaWRlLmMyID8gdGhpcy5jb2RlKHNpZGUuYzIsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoY29kZTEgPT0gY29kZTIpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vd2lkdGhcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoc2lkZSwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8PSAwKSBjb250aW51ZVxuICAgICAgICAgICAgY29uc3QgdzIgPSB3RyAqIDAuNVxuXG4gICAgICAgICAgICAvL3NldCB3aWR0aFxuICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHdHXG5cbiAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50IHdpdGggY29ycmVjdCBvcmllbnRhdGlvblxuICAgICAgICAgICAgaWYgKHNpZGUub3IgPT09ICdoJykge1xuICAgICAgICAgICAgICAgIC8vdG9wIGxpbmVcbiAgICAgICAgICAgICAgICBpZiAoY29kZTIpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sb3JbY29kZTJdXG4gICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oc2lkZS54IC0gcjIsIHNpZGUueSArIHcyKVxuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKHNpZGUueCArIHIyLCBzaWRlLnkgKyB3MilcbiAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9ib3R0b20gbGluZVxuICAgICAgICAgICAgICAgIGlmIChjb2RlMSkge1xuICAgICAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb2xvcltjb2RlMV1cbiAgICAgICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhzaWRlLnggLSByMiwgc2lkZS55IC0gdzIpXG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oc2lkZS54ICsgcjIsIHNpZGUueSAtIHcyKVxuICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vcmlnaHQgbGluZVxuICAgICAgICAgICAgICAgIGlmIChjb2RlMikge1xuICAgICAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb2xvcltjb2RlMl1cbiAgICAgICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhzaWRlLnggKyB3Miwgc2lkZS55IC0gcjIpXG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oc2lkZS54ICsgdzIsIHNpZGUueSArIHIyKVxuICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL2xlZnQgbGluZVxuICAgICAgICAgICAgICAgIGlmIChjb2RlMSkge1xuICAgICAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb2xvcltjb2RlMV1cbiAgICAgICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhzaWRlLnggLSB3Miwgc2lkZS55IC0gcjIpXG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oc2lkZS54IC0gdzIsIHNpZGUueSArIHIyKVxuICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKiogQHR5cGVkZWYge3sgeDpudW1iZXIsIHk6bnVtYmVyLCBvcjpcInZcInxcImhcIiwgYzE6KGltcG9ydCgnLi4vY29yZS9EYXRhc2V0JykuQ2VsbCl8dW5kZWZpbmVkLCBjMjooaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQnKS5DZWxsKXx1bmRlZmluZWQgfX0gU2lkZSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtmdW5jdGlvbihBcnJheS48U2lkZT4sbnVtYmVyLCBudW1iZXIpOip9IFNpZGVWaWV3U2NhbGUgKi9cblxuLyoqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTaWRlU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiBhIGNlbGwgc2lkZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKFNpZGUsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKChzaWRlLCByZXNvbHV0aW9uLCB6LCBzaWRlVmlld1NjYWxlKSA9PiAnI0VBNkJBQycpXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiBhIGNlbGwgc2lkZSwgaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKFNpZGUsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgKChzaWRlLCByZXNvbHV0aW9uLCB6LCBzaWRlVmlld1NjYWxlKSA9PiByZXNvbHV0aW9uIC8gNSlcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGxlbmd0aCBvZiBhIGNlbGwgc2lkZSwgaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKFNpZGUsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5sZW5ndGggPSBvcHRzLmxlbmd0aCB8fCAoKHNpZGUsIHJlc29sdXRpb24sIHosIHNpZGVWaWV3U2NhbGUpID0+IHJlc29sdXRpb24pXG5cbiAgICAgICAgLyoqIFNldCB0byBBIG9yIHRydWUgc28gdGhhdCB0aGUgc2lkZSBpcyBkcmF3biBhcyBhIGRpYW1vbmQgKi9cbiAgICAgICAgdGhpcy5kaWFtb25kID0gb3B0cy5kaWFtb25kXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICAvL2J1aWxkIHNpZGVzXG5cbiAgICAgICAgLyoqICBAdHlwZSB7QXJyYXkuPFNpZGU+fSAqL1xuICAgICAgICBjb25zdCBzaWRlcyA9IFNpZGVTdHlsZS5idWlsZFNpZGVzKGNlbGxzLCByZXNvbHV0aW9uKVxuICAgICAgICBpZiAoc2lkZXMubGVuZ3RoID09IDApIHJldHVyblxuXG4gICAgICAgIC8vZ2V0IHNpZGUgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKHNpZGVzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vZHJhdyBzaWRlc1xuXG4gICAgICAgIGN0eC5saW5lQ2FwID0gJ2J1dHQnXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAqIDAuNVxuICAgICAgICBmb3IgKGxldCBzaWRlIG9mIHNpZGVzKSB7XG4gICAgICAgICAgICAvL2NvbG9yXG4gICAgICAgICAgICAvKiogQHR5cGUge3N0cmluZ3x1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihzaWRlLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT0gJ25vbmUnKSBjb250aW51ZVxuXG4gICAgICAgICAgICBpZiAodGhpcy5kaWFtb25kKSB7XG4gICAgICAgICAgICAgICAgLy9zZXQgY29sb3JcbiAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gY29sXG5cbiAgICAgICAgICAgICAgICAvL2RyYXcgZGlhbW9uZFxuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBzaWRlLngsXG4gICAgICAgICAgICAgICAgICAgIHkgPSBzaWRlLnlcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKHggLSByMiwgeSlcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKHgsIHkgKyByMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKHggKyByMiwgeSlcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKHgsIHkgLSByMilcbiAgICAgICAgICAgICAgICBjdHguY2xvc2VQYXRoKClcbiAgICAgICAgICAgICAgICBjdHguZmlsbCgpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vd2lkdGhcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChzaWRlLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8PSAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAgICAgLy9sZW5ndGhcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICAgICAgY29uc3QgbEcgPSB0aGlzLmxlbmd0aCA/IHRoaXMubGVuZ3RoKHNpZGUsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICBpZiAoIWxHIHx8IGxHIDw9IDApIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgY29uc3QgbEcyID0gbEcgKiAwLjVcblxuICAgICAgICAgICAgICAgIC8vc2V0IHdpZHRoXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHdHXG4gICAgICAgICAgICAgICAgLy9zZXQgY29sb3JcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBjb2xcblxuICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50IHdpdGggY29ycmVjdCBvcmllbnRhdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBzaWRlLngsXG4gICAgICAgICAgICAgICAgICAgIHkgPSBzaWRlLnlcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBpZiAoc2lkZS5vciA9PT0gJ3YnKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oeCwgeSAtIGxHMilcbiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4LCB5ICsgbEcyKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oeCAtIGxHMiwgeSlcbiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4ICsgbEcyLCB5KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoJy4uL2NvcmUvRGF0YXNldCcpLkNlbGw+fSBjZWxscyBUaGUgY2VsbHMgdG8gdXNlIHRvIGJ1aWxkIHRoZSBzaWRlcy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiBUaGUgY2VsbHMgcmVzb2x1dGlvblxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gd2l0aEhvcml6b250YWwgU2V0IHRvIHRydWUgdG8gYnVpbGQgaG9yaXpvbnRhbCBzaWRlcywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gd2l0aFZlcnRpY2FsIFNldCB0byB0cnVlIHRvIGJ1aWxkIHZlcnRpY2FsIHNpZGVzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBjZW50ZXIgU2V0IHRvIHRydWUgc28gdGhhdCB0aGUgc2lkZSBjb29yZGluYXRlIGFyZSB0aG9zZSBvZiBpdHMgY2VudGVyIHBvaW50IHJhdGhlciB0aGFuIGl0cyBsZWZ0L2JvdHRvbSBwb2ludCAodGhlIHNpZGUgeCx5IGNvb3JkaW5hdGVzIGFyZSB0aG9zZSBvZiB0aGUgbGVmdCBwb2ludCBmb3IgaG9yaXpvbnRhbCBzaWRlcywgYW5kIG9mIHRoZSBib3R0b20gcG9pbnQgZm9yIHZlcnRpY2FsIHNpZGVzKVxuICAgICAqIEByZXR1cm5zIHsgQXJyYXkuPFNpZGU+IH1cbiAgICAgKi9cbiAgICBzdGF0aWMgYnVpbGRTaWRlcyhjZWxscywgcmVzb2x1dGlvbiwgd2l0aEhvcml6b250YWwgPSB0cnVlLCB3aXRoVmVydGljYWwgPSB0cnVlLCBjZW50ZXIgPSB0cnVlKSB7XG4gICAgICAgIC8qKiBAdHlwZSB7IEFycmF5LjxTaWRlPiB9ICovXG4gICAgICAgIGNvbnN0IHNpZGVzID0gW11cblxuICAgICAgICBjb25zdCByMiA9IGNlbnRlciA/IHJlc29sdXRpb24gLyAyIDogMFxuXG4gICAgICAgIC8vbWFrZSBob3Jpem9udGFsIHNpZGVzXG4gICAgICAgIC8vc29ydCBjZWxscyBieSB4IGFuZCB5XG4gICAgICAgIGNlbGxzLnNvcnQoKGMxLCBjMikgPT4gKGMyLnggPT0gYzEueCA/IGMxLnkgLSBjMi55IDogYzEueCAtIGMyLngpKVxuICAgICAgICBsZXQgYzEgPSBjZWxsc1swXVxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgYzIgPSBjZWxsc1tpXVxuXG4gICAgICAgICAgICBpZiAoYzEueSArIHJlc29sdXRpb24gPT0gYzIueSAmJiBjMS54ID09IGMyLngpXG4gICAgICAgICAgICAgICAgLy9jZWxscyBpbiBzYW1lIGNvbHVtbiBhbmQgdG91Y2ggYWxvbmcgaG9yaXpvbnRhbCBzaWRlXG4gICAgICAgICAgICAgICAgLy9tYWtlIHNoYXJlZCBzaWRlXG4gICAgICAgICAgICAgICAgc2lkZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG9yOiAnaCcsXG4gICAgICAgICAgICAgICAgICAgIHg6IGMxLnggKyByMixcbiAgICAgICAgICAgICAgICAgICAgeTogYzIueSxcbiAgICAgICAgICAgICAgICAgICAgYzE6IGMxLFxuICAgICAgICAgICAgICAgICAgICBjMjogYzIsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vY2VsbHMgZG8gbm90IHRvdWNoIGFsb25nIGhvcml6b250YWwgc2lkZVxuICAgICAgICAgICAgICAgIC8vbWFrZSB0d28gc2lkZXM6IHRvcCBvbmUgZm9yIGMxLCBib3R0b20gZm9yIGMyXG4gICAgICAgICAgICAgICAgc2lkZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG9yOiAnaCcsXG4gICAgICAgICAgICAgICAgICAgIHg6IGMxLnggKyByMixcbiAgICAgICAgICAgICAgICAgICAgeTogYzEueSArIHJlc29sdXRpb24sXG4gICAgICAgICAgICAgICAgICAgIGMxOiBjMSxcbiAgICAgICAgICAgICAgICAgICAgYzI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBvcjogJ2gnLFxuICAgICAgICAgICAgICAgICAgICB4OiBjMi54ICsgcjIsXG4gICAgICAgICAgICAgICAgICAgIHk6IGMyLnksXG4gICAgICAgICAgICAgICAgICAgIGMxOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGMyOiBjMixcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjMSA9IGMyXG4gICAgICAgIH1cblxuICAgICAgICAvL21ha2UgdmVydGljYWwgc2lkZXNcbiAgICAgICAgLy9zb3J0IGNlbGxzIGJ5IHkgYW5kIHhcbiAgICAgICAgY2VsbHMuc29ydCgoYzEsIGMyKSA9PiAoYzIueSA9PSBjMS55ID8gYzEueCAtIGMyLnggOiBjMS55IC0gYzIueSkpXG4gICAgICAgIGMxID0gY2VsbHNbMF1cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGMyID0gY2VsbHNbaV1cblxuICAgICAgICAgICAgaWYgKGMxLnggKyByZXNvbHV0aW9uID09IGMyLnggJiYgYzEueSA9PSBjMi55KVxuICAgICAgICAgICAgICAgIC8vY2VsbHMgaW4gc2FtZSByb3cgYW5kIHRvdWNoIGFsb25nIHZlcnRpY2FsIHNpZGVcbiAgICAgICAgICAgICAgICAvL21ha2Ugc2hhcmVkIHNpZGVcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgb3I6ICd2JyxcbiAgICAgICAgICAgICAgICAgICAgeDogYzEueCArIHJlc29sdXRpb24sXG4gICAgICAgICAgICAgICAgICAgIHk6IGMxLnkgKyByMixcbiAgICAgICAgICAgICAgICAgICAgYzE6IGMxLFxuICAgICAgICAgICAgICAgICAgICBjMjogYzIsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vY2VsbHMgZG8gbm90IHRvdWNoIGFsb25nIHZlcnRpY2FsIHNpZGVcbiAgICAgICAgICAgICAgICAvL21ha2UgdHdvIHNpZGVzOiByaWdodCBvbmUgZm9yIGMxLCBsZWZ0IGZvciBjMlxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBvcjogJ3YnLFxuICAgICAgICAgICAgICAgICAgICB4OiBjMS54ICsgcmVzb2x1dGlvbixcbiAgICAgICAgICAgICAgICAgICAgeTogYzEueSArIHIyLFxuICAgICAgICAgICAgICAgICAgICBjMTogYzEsXG4gICAgICAgICAgICAgICAgICAgIGMyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgb3I6ICd2JyxcbiAgICAgICAgICAgICAgICAgICAgeDogYzIueCxcbiAgICAgICAgICAgICAgICAgICAgeTogYzIueSArIHIyLFxuICAgICAgICAgICAgICAgICAgICBjMTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBjMjogYzIsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYzEgPSBjMlxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaWRlc1xuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuaW1wb3J0IHsgbWFrZVdlYkdMQ2FudmFzIH0gZnJvbSAnLi4vdXRpbHMvd2ViR0xVdGlscy5qcydcbmltcG9ydCB7IFdlYkdMU3F1YXJlQ29sb3JpbmdDYXRBZHZhbmNlZCB9IGZyb20gJy4uL3V0aWxzL1dlYkdMU3F1YXJlQ29sb3JpbmdDYXRBZHZhbmNlZC5qcydcblxuLyoqXG4gKiBTdHlsZSBiYXNlZCBvbiB3ZWJHTFxuICogVG8gc2hvdyBjZWxscyBhcyBjb2xvcmVkIHNxdWFyZXMsIGZyb20gY2F0ZWdvcmllcy5cbiAqIEFsbCBjZWxscyBhcmUgZHJhd24gYXMgc3F1YXJlcywgd2l0aCB0aGUgc2FtZSBzaXplXG4gKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY2F0ZWdvcnkgY29kZSBvZiB0aGUgY2VsbCwgZm9yIGNvbG9yaW5nLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29kZSA9IG9wdHMuY29kZVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZGljdGlvbmFyeSAoY29kZSAtPiBjb2xvcikgd2hpY2ggZ2l2ZXMgdGhlIGNvbG9yIG9mIGVhY2ggY2F0ZWdvcnkgY29kZS5cbiAgICAgICAgICogQHR5cGUge29iamVjdH0gKi9cbiAgICAgICAgb3B0cy5jb2xvciA9IG9wdHMuY29sb3IgfHwgdW5kZWZpbmVkXG5cbiAgICAgICAgLyoqIEB0eXBlIHsgQXJyYXkuPHN0cmluZz4gfSAqL1xuICAgICAgICBjb25zdCBjb2RlcyA9IE9iamVjdC5rZXlzKG9wdHMuY29sb3IpXG5cbiAgICAgICAgLyoqIEB0eXBlIHsgb2JqZWN0IH0gQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5jYXRUb0kgPSB7fVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVzLmxlbmd0aDsgaSsrKSB0aGlzLmNhdFRvSVtjb2Rlc1tpXV0gPSBpICsgJydcblxuICAgICAgICAvKiogQHR5cGUgeyBBcnJheS48c3RyaW5nPiB9IEBwcml2YXRlICovXG4gICAgICAgIHRoaXMuY29sb3JzID0gW11cbiAgICAgICAgZm9yIChjb25zdCBjb2RlIG9mIGNvZGVzKSB0aGlzLmNvbG9ycy5wdXNoKG9wdHMuY29sb3JbJycgKyBjb2RlXSlcblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgdGhlIGNlbGxzLCBpbiBnZW9ncmFwaGljYWwgdW5pdC4gQWxsIGNlbGxzIGhhdmUgdGhlIHNhbWUgc2l6ZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIC8vIChyZXNvbHV0aW9uLCB6KSA9PiAuLi5cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUgeyBXZWJHTFNxdWFyZUNvbG9yaW5nQ2F0QWR2YW5jZWQgfSAqL1xuICAgICAgICB0aGlzLndncCA9IG5ldyBXZWJHTFNxdWFyZUNvbG9yaW5nQ2F0QWR2YW5jZWQodGhpcy5jb2xvcnMpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG5cbiAgICAgICAgLy9hZGQgdmVydGljZSBhbmQgZnJhZ21lbnQgZGF0YVxuICAgICAgICBjb25zdCByMiA9IHJlc29sdXRpb24gLyAyXG4gICAgICAgIGxldCBjLFxuICAgICAgICAgICAgbmIgPSBjZWxscy5sZW5ndGhcbiAgICAgICAgY29uc3QgdmVydGljZXNCdWZmZXIgPSBbXVxuICAgICAgICBjb25zdCBpQnVmZmVyID0gW11cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKSB7XG4gICAgICAgICAgICBjID0gY2VsbHNbaV1cbiAgICAgICAgICAgIGNvbnN0IGNhdCA9IHRoaXMuY29kZShjKVxuICAgICAgICAgICAgaWYgKGNhdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVW5leHBlY3RlZCBjYXRlZ29yeTogJyArIGNhdClcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgICAgICBjb25zdCBpXyA9IHRoaXMuY2F0VG9JW2NhdF1cbiAgICAgICAgICAgIGlmIChpc05hTigraV8pKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1VuZXhwZWN0ZWQgY2F0ZWdvcnkgaW5kZXg6ICcgKyBjYXQgKyAnICcgKyBpXylcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmVydGljZXNCdWZmZXIucHVzaChjLnggKyByMiwgYy55ICsgcjIpXG4gICAgICAgICAgICBpQnVmZmVyLnB1c2goK2lfKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jcmVhdGUgY2FudmFzIGFuZCB3ZWJnbCByZW5kZXJlclxuICAgICAgICBjb25zdCBjdldHTCA9IG1ha2VXZWJHTENhbnZhcyhnZW9DYW52YXMudyArICcnLCBnZW9DYW52YXMuaCArICcnKVxuICAgICAgICBpZiAoIWN2V0dMKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyB3ZWJHTCcpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vZHJhd1xuICAgICAgICBjb25zdCBzaXplR2VvID0gdGhpcy5zaXplID8gdGhpcy5zaXplKHJlc29sdXRpb24sIHopIDogcmVzb2x1dGlvbiArIDAuMiAqIHpcbiAgICAgICAgdGhpcy53Z3AuZHJhdyhjdldHTC5nbCwgdmVydGljZXNCdWZmZXIsIGlCdWZmZXIsIGdlb0NhbnZhcy5nZXRXZWJHTFRyYW5zZm9ybSgpLCBzaXplR2VvIC8geilcblxuICAgICAgICAvL2RyYXcgaW4gY2FudmFzIGdlb1xuICAgICAgICBnZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG4gICAgICAgIGdlb0NhbnZhcy5vZmZzY3JlZW5DdHguZHJhd0ltYWdlKGN2V0dMLmNhbnZhcywgMCwgMClcblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6IH0pXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5pbXBvcnQgeyBtYWtlV2ViR0xDYW52YXMgfSBmcm9tICcuLi91dGlscy93ZWJHTFV0aWxzLmpzJ1xuaW1wb3J0IHsgV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkIH0gZnJvbSAnLi4vdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkLmpzJ1xuXG4vKipcbiAqIFN0eWxlIGJhc2VkIG9uIHdlYkdMXG4gKiBUbyBzaG93IGNlbGxzIGFzIGNvbG9yZWQgc3F1YXJlcywgd2l0aCBjb21wdXRhdGlvbiBvZiB0aGUgY29sb3JzIG9uIEdQVSBzaWRlIChmYXN0ZXIgdGhhbiBKYXZhU2NyaXB0IHNpZGUpLlxuICogQWxscyBzcXVhcmVzIHdpdGggdGhlIHNhbWUgc2l6ZVxuICpcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFNxdWFyZUNvbG9yV2ViR0xTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgdCB2YWx1ZSAod2l0aGluIFswLDFdKSBmb3IgYSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLG51bWJlcixudW1iZXIsb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMudEZ1biA9IG9wdHMudEZ1biAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogRGlzdHJpYnV0aW9uIHN0cmV0Y2hpbmcgbWV0aG9kLlxuICAgICAgICAgKiBUaGUgc3RyZXRjaGluZyBpcyBwZXJmb3JtZWQgb24gR1BVIHNpZGUgKGZyYWdtZW50IHNoYWRlcikuXG4gICAgICAgICAqIEB0eXBlIHt7IGZ1bjpzdHJpbmcsIGFscGhhOm51bWJlciB9fSAqL1xuICAgICAgICB0aGlzLnN0cmV0Y2hpbmcgPSBvcHRzLnN0cmV0Y2hpbmdcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHNhbXBsZSBvZiB0aGUgY29sb3IgcmFtcC5cbiAgICAgICAgICogVGhlIGNvbG9yIGlzIGNvbXB1dGVkIG9uIEdQVSBzaWRlIChmcmFnbWVudCBzaGFkZXIpIGJhc2VkIG9uIHRob3NlIHZhbHVlcyAobGluZWFyIGludGVycG9sYXRpb24pLlxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPHN0cmluZz59ICovXG4gICAgICAgIHRoaXMuY29sb3JzID1cbiAgICAgICAgICAgIG9wdHMuY29sb3JzIHx8XG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgJ3JnYigxNTgsIDEsIDY2KScsXG4gICAgICAgICAgICAgICAgJ3JnYigyNDgsIDE0MiwgODMpJyxcbiAgICAgICAgICAgICAgICAncmdiKDI1MSwgMjQ4LCAxNzYpJyxcbiAgICAgICAgICAgICAgICAncmdiKDEzNywgMjA3LCAxNjUpJyxcbiAgICAgICAgICAgICAgICAncmdiKDk0LCA3OSwgMTYyKScsXG4gICAgICAgICAgICBdLnJldmVyc2UoKVxuICAgICAgICBpZiAob3B0cy5jb2xvcilcbiAgICAgICAgICAgIHRoaXMuY29sb3JzID0gW1xuICAgICAgICAgICAgICAgIG9wdHMuY29sb3IoMCksXG4gICAgICAgICAgICAgICAgb3B0cy5jb2xvcigwLjIpLFxuICAgICAgICAgICAgICAgIG9wdHMuY29sb3IoMC40KSxcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuNiksXG4gICAgICAgICAgICAgICAgb3B0cy5jb2xvcigwLjgpLFxuICAgICAgICAgICAgICAgIG9wdHMuY29sb3IoMSksXG4gICAgICAgICAgICBdXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlZmluZSB0aGUgb3BhY2l0eSBvZiB0aGUgc3R5bGUsIHdpdGhpbiBbMCwxXS5cbiAgICAgICAgICogSWYgdGhpcyBvcGFjaXR5IGlzIGRlZmluZWQsIHRoZSBpbmRpdmlkdWFsIGNvbG9yIG9wYWNpdHkgd2lsbCBiZSBpZ25vcmVkLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm9wYWNpdHkgPSBvcHRzLm9wYWNpdHkgLy8gKHIseikgPT4gLi4uXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIHRoZSBjZWxscywgaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuIEFsbCBjZWxscyBoYXZlIHRoZSBzYW1lIHNpemUuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZSAvLyAocmVzb2x1dGlvbiwgeikgPT4gLi4uXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG5cbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vY3JlYXRlIGNhbnZhcyBhbmQgd2ViZ2wgcmVuZGVyZXJcbiAgICAgICAgLy9mb3Igb3BhY2l0eSBjb250cm9sLCBzZWU6IGh0dHBzOi8vd2ViZ2xmdW5kYW1lbnRhbHMub3JnL3dlYmdsL2xlc3NvbnMvd2ViZ2wtYW5kLWFscGhhLmh0bWxcbiAgICAgICAgY29uc3QgY3ZXR0wgPSBtYWtlV2ViR0xDYW52YXMoXG4gICAgICAgICAgICBnZW9DYW52YXMudyArICcnLFxuICAgICAgICAgICAgZ2VvQ2FudmFzLmggKyAnJyxcbiAgICAgICAgICAgIHRoaXMub3BhY2l0eSAhPSB1bmRlZmluZWQgPyB7IHByZW11bHRpcGxpZWRBbHBoYTogZmFsc2UgfSA6IHVuZGVmaW5lZFxuICAgICAgICApXG4gICAgICAgIGlmICghY3ZXR0wpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHdlYkdMJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy9hZGQgdmVydGljZSBhbmQgZnJhZ21lbnQgZGF0YVxuICAgICAgICBjb25zdCByMiA9IHJlc29sdXRpb24gLyAyXG4gICAgICAgIGNvbnN0IHZlcnRpY2VzQnVmZmVyID0gW11cbiAgICAgICAgY29uc3QgdEJ1ZmZlciA9IFtdXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLnRGdW4oY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxuICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCB8fCB0ID09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgICAgICAgIHZlcnRpY2VzQnVmZmVyLnB1c2goY2VsbC54ICsgcjIsIGNlbGwueSArIHIyKVxuICAgICAgICAgICAgdEJ1ZmZlci5wdXNoKHQgPiAxID8gMSA6IHQgPCAwID8gMCA6IHQpXG4gICAgICAgIH1cblxuICAgICAgICAvL2NvbXB1dGUgcGl4ZWwgc2l6ZVxuICAgICAgICBjb25zdCBzaXplR2VvID0gdGhpcy5zaXplID8gdGhpcy5zaXplKHJlc29sdXRpb24sIHopIDogcmVzb2x1dGlvbiArIDAuMiAqIHpcblxuICAgICAgICAvL2NvbXB1dGUgb3BhY2l0eVxuICAgICAgICBjb25zdCBvcCA9IHRoaXMub3BhY2l0eSA/IHRoaXMub3BhY2l0eShyZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHdncCA9IG5ldyBXZWJHTFNxdWFyZUNvbG9yaW5nQWR2YW5jZWQoY3ZXR0wuZ2wsIHRoaXMuY29sb3JzLCB0aGlzLnN0cmV0Y2hpbmcsIHNpemVHZW8gLyB6LCBvcClcblxuICAgICAgICAvL2RyYXdcbiAgICAgICAgd2dwLmRyYXcodmVydGljZXNCdWZmZXIsIHRCdWZmZXIsIGdlb0NhbnZhcy5nZXRXZWJHTFRyYW5zZm9ybSgpKVxuXG4gICAgICAgIC8vIGRyYXcgaW4gY2FudmFzIGdlb1xuICAgICAgICAvLyBOT1RFOiBkcmF3aW5nIGVhY2ggdGlsZSB0aGlzIHdheSBpcyB2ZXJ5IGluZWZmaWNpZW50LiBXZWJHTCBpcyBiZXN0IHVzZWQgd2l0aCBmZXdlciwgaGVhdmllci9sYXJnZXIgZHJhdyBjYWxscy5cbiAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuICAgICAgICBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4LmRyYXdJbWFnZShjdldHTC5jYW52YXMsIDAsIDApXG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcblxuLyoqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJva2VTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCxudW1iZXIsbnVtYmVyLG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnN0cm9rZUNvbG9yID0gb3B0cy5zdHJva2VDb2xvciB8fCAoKCkgPT4gJyM2NjYnKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgYSBjZWxsIGluIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLG51bWJlcixudW1iZXIsb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZSB8fCAoKGNlbGwsIHJlc29sdXRpb24pID0+IHJlc29sdXRpb24pIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBUaGUgc3Ryb2tlIGxpbmUgd2lkdGggaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsbnVtYmVyLG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zdHJva2VXaWR0aCA9IG9wdHMuc3Ryb2tlV2lkdGggfHwgKChjZWxsLCByZXNvbHV0aW9uLCB6KSA9PiB6ICogMS41KSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNoYXBlIG9mIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIsb2JqZWN0KTppbXBvcnQoXCIuLi9jb3JlL1N0eWxlLmpzXCIpLlNoYXBlfSAqL1xuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAoKCkgPT4gJ3NxdWFyZScpIC8vKGMscix6LHZzKSA9PiB7fVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgc3F1YXJlcywgd2l0aCB2YXJpb3VzIGNvbG9ycyBhbmQgc2l6ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuICAgICAgICBjb25zdCBjdHggPSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4XG5cbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAqIDAuNVxuICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAvL2NvbG9yXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLnN0cm9rZUNvbG9yID8gdGhpcy5zdHJva2VDb2xvcihjLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT09ICdub25lJykgY29udGludWVcbiAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGNvbFxuXG4gICAgICAgICAgICAvL3NpemUgLSBpbiBnZW8gdW5pdFxuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2l6ZSA/IHRoaXMuc2l6ZShjLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogcmVzb2x1dGlvblxuXG4gICAgICAgICAgICAvL3dpZHRoXG4gICAgICAgICAgICBjb25zdCB3aSA9IHRoaXMuc3Ryb2tlV2lkdGggPyB0aGlzLnN0cm9rZVdpZHRoKGMsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiAxICogelxuICAgICAgICAgICAgaWYgKCF3aSB8fCB3aSA8PSAwKSBjb250aW51ZVxuICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHdpXG5cbiAgICAgICAgICAgIC8vc2hhcGVcbiAgICAgICAgICAgIGNvbnN0IHNoYXBlID0gdGhpcy5zaGFwZSA/IHRoaXMuc2hhcGUoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6ICdzcXVhcmUnXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdub25lJykgY29udGludWVcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjLCByZXNvbHV0aW9uLCB6KVxuXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdzcXVhcmUnKSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IHNxdWFyZVxuICAgICAgICAgICAgICAgIGNvbnN0IGQgPSByZXNvbHV0aW9uICogKDEgLSBzaXplIC8gcmVzb2x1dGlvbikgKiAwLjVcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHgucmVjdChjLnggKyBkICsgb2Zmc2V0LmR4LCBjLnkgKyBkICsgb2Zmc2V0LmR5LCBzaXplLCBzaXplKVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ2NpcmNsZScpIHtcbiAgICAgICAgICAgICAgICAvL2RyYXcgY2lyY2xlXG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4LmFyYyhjLnggKyByMiArIG9mZnNldC5keCwgYy55ICsgcjIgKyBvZmZzZXQuZHksIHNpemUgKiAwLjUsIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSlcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdkaWFtb25kJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHMyID0gc2l6ZSAqIDAuNVxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oYy54ICsgcjIgLSBzMiwgYy55ICsgcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyByMiwgYy55ICsgcjIgKyBzMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHIyICsgczIsIGMueSArIHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcjIsIGMueSArIHIyIC0gczIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyByMiAtIHMyLCBjLnkgKyByMilcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdkb251dCcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3RyaWFuZ2xlX3VwJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyMiA9IChzaXplIC0gcmVzb2x1dGlvbikgLyAyXG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjLnggLSBkcjIsIGMueSAtIGRyMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHIyLCBjLnkgKyByZXNvbHV0aW9uICsgZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcmVzb2x1dGlvbiArIGRyMiwgYy55IC0gZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3RyaWFuZ2xlX2Rvd24nKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHIyID0gKHNpemUgLSByZXNvbHV0aW9uKSAvIDJcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKGMueCAtIGRyMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHIyLCBjLnkgLSBkcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgKyByZXNvbHV0aW9uICsgZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3RyaWFuZ2xlX2xlZnQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHIyID0gKHNpemUgLSByZXNvbHV0aW9uKSAvIDJcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggLSBkcjIsIGMueSArIHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcmVzb2x1dGlvbiArIGRyMiwgYy55IC0gZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3RyaWFuZ2xlX3JpZ2h0Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyMiA9IChzaXplIC0gcmVzb2x1dGlvbikgLyAyXG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjLnggLSBkcjIsIGMueSAtIGRyMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSArIHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54IC0gZHIyLCBjLnkgKyByZXNvbHV0aW9uICsgZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2hhcGU6JyArIHNoYXBlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFNpZGVTdHlsZSB9IGZyb20gJy4vU2lkZVN0eWxlLmpzJ1xuaW1wb3J0IHsgU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUgfSBmcm9tICcuL1NxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlLmpzJ1xuaW1wb3J0IHsgY2xhc3NpZmllciBhcyBjbEZ1biwgY29sb3JDbGFzc2lmaWVyIGFzIGNjbEZ1biB9IGZyb20gJy4uL3V0aWxzL3NjYWxlLmpzJ1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9tYW5pZm9sZC5uZXQvZG9jL21mZDkvZXhhbXBsZV9fdGFuYWthX2NvbnRvdXJzLmh0bVxuICpcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFRhbmFrYVN0eWxlIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCk6bnVtYmVyfSB2YWx1ZSBGdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHZhbHVlIG9mIGEgY2VsbFxuICAgICAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IGJyZWFrcyBUaGUgYnJlYWsgdmFsdWVzXG4gICAgICogQHBhcmFtIHtBcnJheS48c3RyaW5nPn0gY29sb3JzIFRoZSBjb2xvcnMsIG9uZSBtb3JlIHRoYW4gdGhlIGJyZWFrIHZhbHVlc1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICogQHJldHVybnMge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL1N0eWxlXCIpLlN0eWxlPn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0KHZhbHVlLCBicmVha3MsIGNvbG9ycywgb3B0cyA9IHt9KSB7XG4gICAgICAgIC8vc2hhZG93IGNvbG9yc1xuICAgICAgICBvcHRzLmNvbG9yRGFyayA9IG9wdHMuY29sb3JEYXJrIHx8ICcjMTExJ1xuICAgICAgICBvcHRzLmNvbG9yQnJpZ2h0ID0gb3B0cy5jb2xvckJyaWdodCB8fCAnI2RkZCdcblxuICAgICAgICAvKiogQHR5cGUgeyBmdW5jdGlvbihudW1iZXIsIG51bWJlcik6bnVtYmVyIH0gKi9cbiAgICAgICAgb3B0cy53aWR0aCA9XG4gICAgICAgICAgICBvcHRzLndpZHRoIHx8XG4gICAgICAgICAgICAoKHNpZGVWYWx1ZSwgcmVzb2x1dGlvbiwgeikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pbldHID0gMSAqIHpcbiAgICAgICAgICAgICAgICBjb25zdCBtYXhXRyA9IDQgKiB6XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RlcCA9IChtYXhXRyAtIG1pbldHKSAvIDNcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5taW4obWluV0cgKyAoc2lkZVZhbHVlIC0gMSkgKiBzdGVwLCBtYXhXRylcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgLy9tYWtlIGNsYXNzaWZpZXJcbiAgICAgICAgY29uc3QgY2xhc3NpZmllciA9IGNsRnVuKGJyZWFrcylcbiAgICAgICAgLy9tYWtlIGNvbG9ycyB0YWJsZVxuICAgICAgICBjb25zdCBjb2xvcnNEaWN0ID0ge31cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIGNvbG9yc0RpY3RbaSArICcnXSA9IGNvbG9yc1tpXVxuXG4gICAgICAgIGNvbnN0IGNlbGxTdHlsZSA9IG5ldyBTcXVhcmVDb2xvckNhdGVnb3J5V2ViR0xTdHlsZSh7XG4gICAgICAgICAgICBjb2RlOiAoY2VsbCkgPT4gY2xhc3NpZmllcih2YWx1ZShjZWxsKSksXG4gICAgICAgICAgICBjb2xvcjogY29sb3JzRGljdCxcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBnZXRTaWRlVmFsdWUgPSAoc2lkZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2wxID0gc2lkZS5jMSA/IGNsYXNzaWZpZXIodmFsdWUoc2lkZS5jMSkpIDogLTFcbiAgICAgICAgICAgIGNvbnN0IGNsMiA9IHNpZGUuYzIgPyBjbGFzc2lmaWVyKHZhbHVlKHNpZGUuYzIpKSA6IC0xXG4gICAgICAgICAgICByZXR1cm4gY2wxIC0gY2wyXG4gICAgICAgIH1cblxuICAgICAgICAvKiogVGhlIHNpZGUgc3R5bGUsIGZvciB0aGUgc2hhZG93IGVmZmVjdCAqL1xuICAgICAgICBjb25zdCBzaWRlU3R5bGUgPSBuZXcgU2lkZVN0eWxlKHtcbiAgICAgICAgICAgIC8vd2hpdGUgb3IgYmxhY2ssIGRlcGVuZGluZyBvbiBvcmllbnRhdGlvbiBhbmQgdmFsdWVcbiAgICAgICAgICAgIGNvbG9yOiAoc2lkZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBnZXRTaWRlVmFsdWUoc2lkZSlcbiAgICAgICAgICAgICAgICBpZiAodiA9PT0gMCkgcmV0dXJuXG4gICAgICAgICAgICAgICAgaWYgKHNpZGUub3IgPT09ICd2JykgcmV0dXJuIHYgPCAwID8gb3B0cy5jb2xvckJyaWdodCA6IG9wdHMuY29sb3JEYXJrXG4gICAgICAgICAgICAgICAgcmV0dXJuIHYgPCAwID8gb3B0cy5jb2xvckRhcmsgOiBvcHRzLmNvbG9yQnJpZ2h0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy93aWR0aCBkZXBlbmRzIG9uIHRoZSB2YWx1ZSwgdGhhdCBpcyB0aGUgbnVtYmVyIG9mIGNsYXNzZXMgb2YgZGlmZmVyZW5jZVxuICAgICAgICAgICAgd2lkdGg6IChzaWRlLCByZXNvbHV0aW9uLCB6KSA9PiBvcHRzLndpZHRoKE1hdGguYWJzKGdldFNpZGVWYWx1ZShzaWRlKSksIHJlc29sdXRpb24sIHopLFxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBbY2VsbFN0eWxlLCBzaWRlU3R5bGVdXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5cbi8qKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgVGV4dFN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHRleHQgb2YgYSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudGV4dCA9IG9wdHMudGV4dCB8fCAoKCkgPT4gJ1gnKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnYmxhY2snKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGZvbnQgc2l6ZSBvZiBhIGNlbGwgaW4gZ2VvIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmZvbnRTaXplID0gb3B0cy5mb250U2l6ZSB8fCAoKGNlbGwsIHJlc29sdXRpb24pID0+IHJlc29sdXRpb24pIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBUaGUgdGV4dCBmb250IGZhbWlseS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmZvbnRGYW1pbHkgPSBvcHRzLmZvbnRGYW1pbHkgfHwgKCgpID0+ICdBcmlhbCcpXG5cbiAgICAgICAgLyoqIFRoZSB0ZXh0IGZvbnQgd2VpZ2h0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuZm9udFdlaWdodCA9IG9wdHMuZm9udFdlaWdodCB8fCAoKCkgPT4gJ2JvbGQnKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgdGV4dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuICAgICAgICBjb25zdCBjdHggPSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4XG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL2RyYXcgd2l0aCBIVE1MIGNhbnZhc1xuICAgICAgICAvL2luIHNjcmVlbiBjb29yZGluYXRlc1xuICAgICAgICBnZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG5cbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgLy9nZXQgY2VsbCB0ZXh0XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy50ZXh0ID8gdGhpcy50ZXh0KGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICh0ZXh0ID09IHVuZGVmaW5lZCB8fCB0ZXh0ID09IG51bGwgfHwgdGV4dCArICcnID09PSAnJykgY29udGludWVcblxuICAgICAgICAgICAgLy9jb2xvclxuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFjb2wpIGNvbnRpbnVlXG4gICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gY29sXG5cbiAgICAgICAgICAgIC8vZm9udCBzaXplXG4gICAgICAgICAgICAvL3NpemUgLSBpbiBwaXhlbCB1bml0XG4gICAgICAgICAgICBjb25zdCBmb250U2l6ZVBpeCA9IHRoaXMuZm9udFNpemUoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSAvIHpcbiAgICAgICAgICAgIGlmICghZm9udFNpemVQaXgpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vc2V0IGZvbnRcbiAgICAgICAgICAgIGNvbnN0IGZvbnRGYW1pbHkgPSB0aGlzLmZvbnRGYW1pbHkgPyB0aGlzLmZvbnRGYW1pbHkoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6ICdBcmlhbCdcbiAgICAgICAgICAgIGNvbnN0IGZvbnRXZWlnaHQgPSB0aGlzLmZvbnRXZWlnaHQgPyB0aGlzLmZvbnRXZWlnaHQoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6ICdib2xkJ1xuICAgICAgICAgICAgY3R4LmZvbnQgPSBmb250V2VpZ2h0ICsgJyAnICsgZm9udFNpemVQaXggKyAncHggJyArIGZvbnRGYW1pbHlcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByZXNvbHV0aW9uLCB6KVxuXG4gICAgICAgICAgICAvL3RleHQgcG9zaXRpb25cbiAgICAgICAgICAgIGN0eC50ZXh0QWxpZ24gPSAnY2VudGVyJ1xuICAgICAgICAgICAgY29uc3QgdHggPSBnZW9DYW52YXMuZ2VvVG9QaXhYKGNlbGwueCArIHJlc29sdXRpb24gKiAwLjUgKyBvZmZzZXQuZHgpXG4gICAgICAgICAgICBjb25zdCB0eSA9IGdlb0NhbnZhcy5nZW9Ub1BpeFkoY2VsbC55ICsgcmVzb2x1dGlvbiAqIDAuNSArIG9mZnNldC5keSkgKyBmb250U2l6ZVBpeCAqIDAuMyAvL2l0IHNob3VsZCBiZSAwLjUgYnV0IDAuMyBzZWVtcyB0byB3b3JrIGJldHRlclxuXG4gICAgICAgICAgICAvL2RyYXcgdGhlIHRleHRcbiAgICAgICAgICAgIGN0eC5maWxsVGV4dCh0ZXh0LCB0eCwgdHkpXG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkIGEgZnVuY3Rpb24gWzAsMV0tPnN0cmluZyBmb3IgY2hhcmFjdGVycyBsZWdlbmRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz59IGNoYXJzXG4gICAgICogQHBhcmFtIHsoZnVuY3Rpb24obnVtYmVyKTpudW1iZXIpfHVuZGVmaW5lZH0gc2NhbGVcbiAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIHRleHRTY2FsZShjaGFycywgc2NhbGUgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbmIgPSBjaGFycy5sZW5ndGhcbiAgICAgICAgcmV0dXJuICh0KSA9PiB7XG4gICAgICAgICAgICBpZiAoc2NhbGUpIHQgPSBzY2FsZSh0KVxuICAgICAgICAgICAgaWYgKHQgPT0gMCkgcmV0dXJuICcnXG4gICAgICAgICAgICBpZiAodCA+PSAxKSByZXR1cm4gY2hhcnNbbmIgLSAxXVxuICAgICAgICAgICAgcmV0dXJuIGNoYXJzW01hdGguZmxvb3IodCAqIG5iKV1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKiogQHR5cGVkZWYge1wiZmlyc3RcInxcImJvdHRvbVwifFwiY2VudGVyXCJ8XCJ0b3BcInxcImxhc3RcIn0gQW5jaG9yTW9kZVlFbnVtICovXG5cbi8qKlxuICogU2hvdyBjZWxsIGFzIHRpbWVzZXJpZXMgY2hhcnRcbiAqIENhbiBiZSB1c2VkIGZvciBzcGFya2xpbmUgbWFwIG9mIGh0dHBzOi8vZGF0YWdpc3RpcHMuaHlwb3RoZXNlcy5vcmcvNDg4XG4gKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgVGltZVNlcmllc1N0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogVGhlIGNvbHVtbnMgb2YgdGhlIHRpbWUgc2VyaWVzLCBvcmRlcmVkIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIuXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48c3RyaW5nPn0gKi9cbiAgICAgICAgdGhpcy50cyA9IG9wdHMudHNcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiBzcGVjaWZ5aW5nIHdoZW4gYSB2YWx1ZSBzaG91bGQgYmUgY29uc2lkZXJlZCBhcyBcIm5vIGRhdGFcIiBhbmQgdGh1cyBub3QgaWdub3JlZC4gVGhlIGxpbmUgd2lsbCBoYXZlIGEgYnJlYWsgYXQgdGhlc2UgdmFsdWVzLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oc3RyaW5nKTpib29sZWFufSAqL1xuICAgICAgICB0aGlzLm5vRGF0YSA9IG9wdHMubm9EYXRhIHx8ICgodikgPT4gdiA9PT0gdW5kZWZpbmVkIHx8IHYgPT0gJycgfHwgdiA9PT0gbnVsbCB8fCBpc05hTigrdikpXG5cbiAgICAgICAgLy94XG4gICAgICAgIC8qKiBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm9mZnNldFggPSBvcHRzLm9mZnNldFggfHwgKChjLCByLCB6KSA9PiAwKVxuICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgKChjLCByLCB6KSA9PiByKVxuXG4gICAgICAgIC8veVxuICAgICAgICAvKiogaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5vZmZzZXRZID0gb3B0cy5vZmZzZXRZIHx8ICgoYywgciwgeikgPT4gMClcbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gb3B0cy5oZWlnaHQgfHwgKChjLCByLCB6KSA9PiByKVxuICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIpOkFuY2hvck1vZGVZRW51bX0gKi9cbiAgICAgICAgdGhpcy5hbmNob3JNb2RlWSA9IG9wdHMuYW5jaG9yTW9kZVkgfHwgKChjLCByLCB6KSA9PiAnY2VudGVyJylcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHdpZHRoIG9mIHRoZSBsaW5lLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMubGluZVdpZHRoID0gb3B0cy5saW5lV2lkdGggfHwgKCh2LCByLCBzLCB6KSA9PiAxLjUgKiB6KVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGNoYXJ0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnYmxhY2snKSAvLyhjLHIseix2cykgPT4ge31cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHRleHQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgY29uc3QgY3R4ID0gZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL2NvbXB1dGUgY2VsbCBhbXBsaXR1ZGVcbiAgICAgICAgY29uc3QgZ2V0QW1wbGl0dWRlID0gKGMpID0+IHtcbiAgICAgICAgICAgIGxldCBtaW4sIG1heFxuICAgICAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLnRzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsID0gY1t0XVxuICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGlmIChtaW4gPT0gdW5kZWZpbmVkIHx8IHZhbCA8IG1pbikgbWluID0gdmFsXG4gICAgICAgICAgICAgICAgaWYgKG1heCA9PSB1bmRlZmluZWQgfHwgdmFsID4gbWF4KSBtYXggPSB2YWxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtaW4gPT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICByZXR1cm4gbWF4IC0gbWluXG4gICAgICAgIH1cblxuICAgICAgICAvL2NvbXB1dGUgbWF4IGFtcGxpdHVkZVxuICAgICAgICBsZXQgYW1wTWF4XG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGFtcCA9IGdldEFtcGxpdHVkZShjKVxuICAgICAgICAgICAgaWYgKGFtcCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAoYW1wTWF4ID09IHVuZGVmaW5lZCB8fCBhbXAgPiBhbXBNYXgpIGFtcE1heCA9IGFtcFxuICAgICAgICB9XG4gICAgICAgIGlmICghYW1wTWF4KSByZXR1cm5cblxuICAgICAgICBjb25zdCBuYiA9IHRoaXMudHMubGVuZ3RoXG5cbiAgICAgICAgY3R4LmxpbmVDYXAgPSAnYnV0dCdcbiAgICAgICAgZm9yIChsZXQgYyBvZiBjZWxscykge1xuICAgICAgICAgICAgLy9saW5lIHdpZHRoXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCB3RyA9IHRoaXMubGluZVdpZHRoID8gdGhpcy5saW5lV2lkdGgoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vbGluZSBjb2xvclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFjb2wpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8veFxuICAgICAgICAgICAgY29uc3Qgb2ZmWCA9IHRoaXMub2Zmc2V0WCA/IHRoaXMub2Zmc2V0WChjLCByZXNvbHV0aW9uLCB6KSA6IDBcbiAgICAgICAgICAgIGlmIChvZmZYID09IHVuZGVmaW5lZCB8fCBpc05hTihvZmZYKSkgY29udGludWVcbiAgICAgICAgICAgIGNvbnN0IHcgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChjLCByZXNvbHV0aW9uLCB6KSA6IHJlc29sdXRpb25cbiAgICAgICAgICAgIGlmICh3ID09IHVuZGVmaW5lZCB8fCBpc05hTih3KSkgY29udGludWVcblxuICAgICAgICAgICAgLy95XG4gICAgICAgICAgICBjb25zdCBvZmZZID0gdGhpcy5vZmZzZXRZID8gdGhpcy5vZmZzZXRZKGMsIHJlc29sdXRpb24sIHopIDogMFxuICAgICAgICAgICAgaWYgKG9mZlkgPT0gdW5kZWZpbmVkIHx8IGlzTmFOKG9mZlkpKSBjb250aW51ZVxuICAgICAgICAgICAgY29uc3QgaCA9IHRoaXMuaGVpZ2h0ID8gdGhpcy5oZWlnaHQoYywgcmVzb2x1dGlvbiwgeikgOiByZXNvbHV0aW9uXG4gICAgICAgICAgICBpZiAoaCA9PSB1bmRlZmluZWQgfHwgaXNOYU4oaCkpIGNvbnRpbnVlXG4gICAgICAgICAgICBjb25zdCBhbmNoWSA9IHRoaXMuYW5jaG9yTW9kZVkgPyB0aGlzLmFuY2hvck1vZGVZKGMsIHJlc29sdXRpb24sIHopIDogJ2NlbnRlcidcbiAgICAgICAgICAgIGlmICghYW5jaFkpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSB3R1xuICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gY29sXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBhbmNob3IgWSBmaWd1cmVzXG4gICAgICAgICAgICBsZXQgdmFsMCwgeTBcbiAgICAgICAgICAgIGlmIChhbmNoWSA9PT0gJ2ZpcnN0Jykge1xuICAgICAgICAgICAgICAgIC8vZ2V0IGZpcnN0IHZhbHVlXG4gICAgICAgICAgICAgICAgdmFsMCA9IGNbdGhpcy50c1swXV1cbiAgICAgICAgICAgICAgICB5MCA9IDBcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5jaFkgPT09ICdsYXN0Jykge1xuICAgICAgICAgICAgICAgIC8vZ2V0IGxhc3QgdmFsdWVcbiAgICAgICAgICAgICAgICB2YWwwID0gY1t0aGlzLnRzW3RoaXMudHMubGVuZ3RoIC0gMV1dXG4gICAgICAgICAgICAgICAgeTAgPSAwXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFuY2hZID09PSAnYm90dG9tJykge1xuICAgICAgICAgICAgICAgIC8vZ2V0IG1pblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy50cykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSArY1t0XVxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsID09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbDAgPT0gdW5kZWZpbmVkIHx8IHZhbCA8IHZhbDApIHZhbDAgPSB2YWxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeTAgPSAwXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFuY2hZID09PSAndG9wJykge1xuICAgICAgICAgICAgICAgIC8vZ2V0IG1heFxuICAgICAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy50cykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSArY1t0XVxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsID09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbDAgPT0gdW5kZWZpbmVkIHx8IHZhbCA+IHZhbDApIHZhbDAgPSB2YWxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeTAgPSByZXNvbHV0aW9uXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFuY2hZID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgICAgIC8vZ2V0IG1pbiBhbmQgbWF4XG4gICAgICAgICAgICAgICAgbGV0IG1pbiwgbWF4XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNbdF1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGlmIChtaW4gPT0gdW5kZWZpbmVkIHx8IHZhbCA8IG1pbikgbWluID0gdmFsXG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXggPT0gdW5kZWZpbmVkIHx8IHZhbCA+IG1heCkgbWF4ID0gdmFsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhbDAgPSAoK21heCArICttaW4pICogMC41XG4gICAgICAgICAgICAgICAgeTAgPSByZXNvbHV0aW9uIC8gMlxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVW5leHBlY3RlZCBhbmNob3JNb2RlWTogJyArIGFuY2hZKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qL2RyYXcgbGluZVxuICAgICAgICAgICAgaWYgKHZhbDAgPT0gdW5kZWZpbmVkIHx8IGlzTmFOKHZhbDApKSBjb250aW51ZVxuICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBjb25zdCBzWCA9IHcgLyAobmIgLSAxKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsID0gY1t0aGlzLnRzW2ldXVxuICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gdW5kZWZpbmVkIHx8IGlzTmFOKHZhbCkpIGJyZWFrXG4gICAgICAgICAgICAgICAgaWYgKGkgPT0gMClcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyhjLnggKyBpICogc1ggKyBvZmZYLCBjLnkgKyB5MCArICh2YWwgLSB2YWwwKSAqIGggLyBhbXBNYXggKyBvZmZZKVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjLnggKyBpICogc1ggKyBvZmZYLCBjLnkgKyB5MCArICh2YWwgLSB2YWwwKSAqIGggLyBhbXBNYXggKyBvZmZZKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpKi9cblxuICAgICAgICAgICAgLy9kcmF3IGxpbmUsIHNlZ21lbnQgYnkgc2VnbWVudFxuICAgICAgICAgICAgY29uc3Qgc1ggPSB3IC8gKG5iIC0gMSlcblxuICAgICAgICAgICAgLy9oYW5kbGUgZmlyc3QgcG9pbnRcbiAgICAgICAgICAgIGxldCB2MCA9IGNbdGhpcy50c1swXV1cbiAgICAgICAgICAgIGlmICghdGhpcy5ub0RhdGEodjApKSB7XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjLnggKyBvZmZYLCBjLnkgKyB5MCArICgodjAgLSB2YWwwKSAqIGgpIC8gYW1wTWF4ICsgb2ZmWSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vY29uc29sZS5sb2codjAsIGlzTmFOKHYwKSlcblxuICAgICAgICAgICAgbGV0IHYxXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG5iOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2MSA9IGNbdGhpcy50c1tpXV1cblxuICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50IGZyb20gdjAgdG8gdjFcblxuICAgICAgICAgICAgICAgIC8vYm90aCBwb2ludHMgJ25vIGRhdGEnXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubm9EYXRhKHYwKSAmJiB0aGlzLm5vRGF0YSh2MSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9zZWNvbmQgcG9pbnQgJ25vIGRhdGEnXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5ub0RhdGEodjApICYmIHRoaXMubm9EYXRhKHYxKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcblxuICAgICAgICAgICAgICAgICAgICAvL2ZpcnN0IHBvaW50ICdubyBkYXRhJ1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub0RhdGEodjApICYmICF0aGlzLm5vRGF0YSh2MSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oYy54ICsgaSAqIHNYICsgb2ZmWCwgYy55ICsgeTAgKyAoKHYxIC0gdmFsMCkgKiBoKSAvIGFtcE1heCArIG9mZlkpXG5cbiAgICAgICAgICAgICAgICAgICAgLy9ib3RoIHBvaW50cyBoYXZlIGRhdGE6IHRyYWNlIGxpbmVcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIGkgKiBzWCArIG9mZlgsIGMueSArIHkwICsgKCh2MSAtIHZhbDApICogaCkgLyBhbXBNYXggKyBvZmZZKVxuICAgICAgICAgICAgICAgICAgICAvL2lmIGl0IGlzIHRoZSBsYXN0IHBvaW50LCBzdHJva2VcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gbmIgLSAxKSBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdjAgPSB2MVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kLCBpZiBhbnlcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBpbml0U2hhZGVyUHJvZ3JhbSwgY3JlYXRlU2hhZGVyIH0gZnJvbSAnLi93ZWJHTFV0aWxzLmpzJ1xuaW1wb3J0IHsgY29sb3IgfSBmcm9tICdkMy1jb2xvcidcblxuLyoqXG4gKiBFdmVyeXRoaW5nIHRvIGVhc2lseSBkcmF3IGNvbG9yZWQgc3F1YXJlcyB3aXRoIHdlYkdMLlxuICogQWxsIHRoZSBzYW1lIHNpemUsIGJ1dCBkaWZmZXJlbnQgZmlsbCBjb2xvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkdMU3F1YXJlQ29sb3Jpbmcge1xuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZ2wsIHNpemVQaXgpIHtcbiAgICAgICAgdGhpcy5nbCA9IGdsXG4gICAgICAgIHRoaXMuc2l6ZVBpeCA9IHNpemVQaXggfHwgMTAuMFxuXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IGluaXRTaGFkZXJQcm9ncmFtKFxuICAgICAgICAgICAgZ2wsXG4gICAgICAgICAgICBjcmVhdGVTaGFkZXIoXG4gICAgICAgICAgICAgICAgZ2wsXG4gICAgICAgICAgICAgICAgZ2wuVkVSVEVYX1NIQURFUixcbiAgICAgICAgICAgICAgICBgXG4gICAgICAgICAgICBhdHRyaWJ1dGUgdmVjMiBwb3M7XG4gICAgICAgICAgICB1bmlmb3JtIGZsb2F0IHNpemVQaXg7XG4gICAgICAgICAgICB1bmlmb3JtIG1hdDMgbWF0O1xuICAgICAgICAgICAgYXR0cmlidXRlIHZlYzQgY29sb3I7XG4gICAgICAgICAgICB2YXJ5aW5nIHZlYzQgdkNvbG9yO1xuICAgICAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQobWF0ICogdmVjMyhwb3MsIDEuMCksIDEuMCk7XG4gICAgICAgICAgICAgIGdsX1BvaW50U2l6ZSA9IHNpemVQaXg7XG4gICAgICAgICAgICAgIHZDb2xvciA9IGNvbG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGBcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBjcmVhdGVTaGFkZXIoXG4gICAgICAgICAgICAgICAgZ2wsXG4gICAgICAgICAgICAgICAgZ2wuRlJBR01FTlRfU0hBREVSLFxuICAgICAgICAgICAgICAgIGBcbiAgICAgICAgICAgIHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuICAgICAgICAgICAgdmFyeWluZyB2ZWM0IHZDb2xvcjtcbiAgICAgICAgICAgIHZvaWQgbWFpbih2b2lkKSB7XG4gICAgICAgICAgICAgICAgdmVjNCB2Q29sb3JfID0gdkNvbG9yIC8gMjU1LjA7XG4gICAgICAgICAgICAgICAgdkNvbG9yX1szXSA9IDI1NS4wICogdkNvbG9yX1szXTtcbiAgICAgICAgICAgICAgICBnbF9GcmFnQ29sb3IgPSB2Q29sb3JfO1xuICAgICAgICAgICAgfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICBnbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbSlcblxuICAgICAgICAvL2J1ZmZlciBkYXRhXG4gICAgICAgIHRoaXMudmVydGljZXNCdWZmZXIgPSBbXVxuICAgICAgICB0aGlzLmNvbG9yc0J1ZmZlciA9IFtdXG4gICAgfVxuXG4gICAgLyoqIEFkZCBkYXRhIHRvIHZlcnRpY2VzL3NpemUvY29sb3IgYnVmZmVycyBmb3IgY29sb3Igc3F1YXJlcyBkcmF3aW5nICovXG4gICAgYWRkUG9pbnREYXRhKHhDLCB5QywgY29sKSB7XG4gICAgICAgIC8vY29udmVydCBjb2xvclxuICAgICAgICBjb25zdCBjYyA9IGNvbG9yKGNvbClcbiAgICAgICAgLy9jb25zdCBjYyA9IHtyOjQ1LGc6ODcsYjo5OCxvcGFjaXR5OjAuOX1cbiAgICAgICAgaWYgKCFjYykgcmV0dXJuXG5cbiAgICAgICAgLy92ZXJ0aWNlc1xuICAgICAgICB0aGlzLnZlcnRpY2VzQnVmZmVyLnB1c2goeEMsIHlDKVxuICAgICAgICAvL2NvbG9yXG4gICAgICAgIHRoaXMuY29sb3JzQnVmZmVyLnB1c2goY2MuciwgY2MuZywgY2MuYiwgY2Mub3BhY2l0eSlcbiAgICB9XG5cbiAgICBhZGRQb2ludERhdGEyKHhDLCB5QywgciwgZywgYiwgb3BhY2l0eSkge1xuICAgICAgICAvL3ZlcnRpY2VzXG4gICAgICAgIHRoaXMudmVydGljZXNCdWZmZXIucHVzaCh4QywgeUMpXG4gICAgICAgIC8vY29sb3JcbiAgICAgICAgdGhpcy5jb2xvcnNCdWZmZXIucHVzaChyLCBnLCBiLCBvcGFjaXR5KVxuICAgIH1cblxuICAgIC8qKiAgKi9cbiAgICBkcmF3KHRyYW5zZm9NYXQpIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsXG5cbiAgICAgICAgLy92ZXJ0aWNlIGRhdGFcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGdsLmNyZWF0ZUJ1ZmZlcigpKVxuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheSh0aGlzLnZlcnRpY2VzQnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24odGhpcy5wcm9ncmFtLCAncG9zJylcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgMiwgLy9udW1Db21wb25lbnRzXG4gICAgICAgICAgICBnbC5GTE9BVCwgLy90eXBlXG4gICAgICAgICAgICBmYWxzZSwgLy9ub3JtYWxpc2VcbiAgICAgICAgICAgIDAsIC8vc3RyaWRlXG4gICAgICAgICAgICAwIC8vb2Zmc2V0XG4gICAgICAgIClcbiAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkocG9zaXRpb24pXG5cbiAgICAgICAgLy9jb2xvciBkYXRhXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkodGhpcy5jb2xvcnNCdWZmZXIpLCBnbC5TVEFUSUNfRFJBVylcbiAgICAgICAgdmFyIGNvbG9yID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24odGhpcy5wcm9ncmFtLCAnY29sb3InKVxuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGNvbG9yLCA0LCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApXG4gICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGNvbG9yKVxuXG4gICAgICAgIC8vc2l6ZVBpeFxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ3NpemVQaXgnKSwgMS4wICogdGhpcy5zaXplUGl4KVxuXG4gICAgICAgIC8vdHJhbnNmb3JtYXRpb25cbiAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDNmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCAnbWF0JyksIGZhbHNlLCBuZXcgRmxvYXQzMkFycmF5KHRyYW5zZm9NYXQpKVxuXG4gICAgICAgIC8vIEVuYWJsZSB0aGUgZGVwdGggdGVzdFxuICAgICAgICAvL2dsLmVuYWJsZShnbC5ERVBUSF9URVNUKTtcbiAgICAgICAgLy8gQ2xlYXIgdGhlIGNvbG9yIGJ1ZmZlciBiaXRcbiAgICAgICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVClcbiAgICAgICAgLy8gU2V0IHRoZSB2aWV3IHBvcnRcbiAgICAgICAgLy9nbC52aWV3cG9ydCgwLCAwLCBjZy53LCBjZy5oKTtcblxuICAgICAgICBnbC5kcmF3QXJyYXlzKGdsLlBPSU5UUywgMCwgdGhpcy52ZXJ0aWNlc0J1ZmZlci5sZW5ndGggLyAyKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgaW5pdFNoYWRlclByb2dyYW0sIGNyZWF0ZVNoYWRlciB9IGZyb20gJy4vd2ViR0xVdGlscy5qcydcbmltcG9ydCB7IGNvbG9yIH0gZnJvbSAnZDMtY29sb3InXG5cbi8qKlxuICogRXZlcnl0aGluZyB0byBlYXNpbHkgZHJhdyBjb2xvcmVkIHNxdWFyZXMgd2l0aCB3ZWJHTC5cbiAqIEFsbCB0aGUgc2FtZSBzaXplLCBidXQgZGlmZmVyZW50IGZpbGwgY29sb3IuXG4gKiBUaGUgY29sb3IgaW50ZXJwb2xhdGlvbiBpcyBjb21wdXRlZCBpbiB0aGUgZnJhZ21lbnQgc2hhZGVyIHByb2dyYW0sIGJ5IHRoZSBHUFUsIHRodXMgaXQgaXMgbGVzcyBmbGV4aWJsZSBidXQgZmFzdGVyLlxuICovXG5leHBvcnQgY2xhc3MgV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkIHtcbiAgICAvL3NlZTpcbiAgICAvL2h0dHBzOi8vd2ViZ2xmdW5kYW1lbnRhbHMub3JnL3dlYmdsL2xlc3NvbnMvZnIvd2ViZ2wtc2hhZGVycy1hbmQtZ2xzbC5odG1sI2xlcy11bmlmb3Jtcy1kYW5zLWxlcy1zaGFkZXJzLWRlLXZlcnRleFxuICAgIC8vaHR0cHM6Ly90aGVib29rb2ZzaGFkZXJzLmNvbS9nbG9zc2FyeS8/c2VhcmNoPW1peFxuICAgIC8vaHR0cHM6Ly90aGVib29rb2ZzaGFkZXJzLmNvbS8wNi9cbiAgICAvL2h0dHBzOi8vdGhlYm9va29mc2hhZGVycy5jb20vZ2xvc3NhcnkvXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gZ2xcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxTdHJpbmc+fSBjb2xvcnNcbiAgICAgKiBAcGFyYW0ge3tmdW46c3RyaW5nLGFscGhhOm51bWJlcn19IHN0cmV0Y2hpbmdcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZVBpeFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfHVuZGVmaW5lZH0gZ2xvYmFsT3BhY2l0eVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGdsLCBjb2xvcnMsIHN0cmV0Y2hpbmcsIHNpemVQaXggPSAxMCwgZ2xvYmFsT3BhY2l0eSA9IHVuZGVmaW5lZCkge1xuICAgICAgICAvKiogQHR5cGUge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gKi9cbiAgICAgICAgdGhpcy5nbCA9IGdsXG4gICAgICAgIC8vZ2wucGl4ZWxTdG9yZWkoZ2wuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLCB0cnVlKTtcbiAgICAgICAgLy9nbC5ibGVuZEZ1bmMoZ2wuU1JDX0FMUEhBLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcbiAgICAgICAgLy9nbC5ibGVuZEZ1bmMoZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcblxuICAgICAgICAvKiogQHR5cGUge1dlYkdMU2hhZGVyfSAqL1xuICAgICAgICBjb25zdCB2U2hhZGVyID0gY3JlYXRlU2hhZGVyKFxuICAgICAgICAgICAgZ2wsXG4gICAgICAgICAgICBnbC5WRVJURVhfU0hBREVSLFxuICAgICAgICAgICAgYFxuICAgICAgICBhdHRyaWJ1dGUgdmVjMiBwb3M7XG4gICAgICAgIHVuaWZvcm0gZmxvYXQgc2l6ZVBpeDtcbiAgICAgICAgdW5pZm9ybSBtYXQzIG1hdDtcblxuICAgICAgICBhdHRyaWJ1dGUgZmxvYXQgdDtcbiAgICAgICAgdmFyeWluZyBmbG9hdCB2dDtcblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KG1hdCAqIHZlYzMocG9zLCAxLjApLCAxLjApO1xuICAgICAgICAgIGdsX1BvaW50U2l6ZSA9IHNpemVQaXg7XG4gICAgICAgICAgdnQgPSB0O1xuICAgICAgICB9XG4gICAgICBgXG4gICAgICAgIClcblxuICAgICAgICAvL3ByZXBhcmUgZnJhZ21lbnQgc2hhZGVyIGNvZGVcbiAgICAgICAgLy9kZWNsYXJlIHRoZSB1bmlmb3JtIGFuZCBvdGhlciB2YXJpYWJsZXNcbiAgICAgICAgbGV0IGZzaFN0cmluZyA9XG4gICAgICAgICAgICAnJyArXG4gICAgICAgICAgICAncHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XFxuJyArXG4gICAgICAgICAgICAndmFyeWluZyBmbG9hdCB2dDtcXG4nICtcbiAgICAgICAgICAgICd1bmlmb3JtIGZsb2F0IGFscGhhO1xcbicgK1xuICAgICAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXQgPSBbXVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSBvdXQucHVzaCgndW5pZm9ybSB2ZWM0IGMnICsgaSArICc7XFxuJylcbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0LmpvaW4oJycpXG4gICAgICAgICAgICB9KSgpICtcbiAgICAgICAgICAgIC8vc3RhcnQgdGhlIG1haW4gZnVuY3Rpb24sIGFwcGx5IHRoZSBzdHJldGNoaW5nIG9mIHRcbiAgICAgICAgICAgICd2b2lkIG1haW4odm9pZCkge1xcbidcblxuICAgICAgICBpZiAoc3RyZXRjaGluZykge1xuICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdwb3cnKVxuICAgICAgICAgICAgICAgIC8vc1BvdyA9ICh0LCBhbHBoYSA9IDMpID0+IE1hdGgucG93KHQsIGFscGhhKTtcbiAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSBwb3codnQsIGFscGhhKTtcXG4nXG4gICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmZ1biA9PSAncG93SW52JylcbiAgICAgICAgICAgICAgICAvL3NQb3dSZXYgPSAodCwgYWxwaGEgPSAzKSA9PiAxIC0gTWF0aC5wb3coMSAtIHQsIDEgLyBhbHBoYSk7XG4gICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gMS4wLXBvdygxLjAtdnQsIDEuMC9hbHBoYSk7XFxuJ1xuICAgICAgICAgICAgZWxzZSBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ2V4cCcpXG4gICAgICAgICAgICAgICAgLy9zRXhwID0gKHQsIGFscGhhID0gMykgPT4gYWxwaGEgPT0gMCA/IHQgOiAoTWF0aC5leHAodCAqIGFscGhhKSAtIDEpIC8gKE1hdGguZXhwKGFscGhhKSAtIDEpO1xuICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPVxuICAgICAgICAgICAgICAgICAgICBzdHJldGNoaW5nLmFscGhhID09IDBcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYGZsb2F0IHQgPSB2dDtgXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICcgICBmbG9hdCB0ID0gKGV4cCh2dCAqIGFscGhhKSAtIDEuMCkgLyAoZXhwKGFscGhhKSAtIDEuMCk7XFxuJ1xuICAgICAgICAgICAgZWxzZSBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ2xvZycpXG4gICAgICAgICAgICAgICAgLy9zRXhwUmV2ID0gKHQsIGFscGhhID0gMykgPT4gYWxwaGEgPT0gMCA/IHQgOiAxIC0gKDEgLyBhbHBoYSkgKiBNYXRoLmxvZyhNYXRoLmV4cChhbHBoYSkgKiAoMSAtIHQpICsgdCk7XG4gICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9XG4gICAgICAgICAgICAgICAgICAgIHN0cmV0Y2hpbmcuYWxwaGEgPT0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgZmxvYXQgdCA9IHZ0O2BcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJyAgIGZsb2F0IHQgPSAxLjAgLSAoMS4wIC8gYWxwaGEpICogbG9nKGV4cChhbHBoYSkgKiAoMS4wIC0gdnQpICsgdnQpO1xcbidcbiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdjaXJjbGUnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcuYWxwaGEgPT0gMClcbiAgICAgICAgICAgICAgICAgICAgLy9pZiAoYWxwaGEgPT0gMCkgcmV0dXJuIHQ7XG4gICAgICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgZmxvYXQgdCA9IHZ0O1xcbidcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmFscGhhID09IDEpXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChhbHBoYSA9PSAxKSByZXR1cm4gTWF0aC5zcXJ0KDIgKiB0IC0gdCAqIHQpO1xuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSBzcXJ0KHZ0ICogKDIuMCAtIHZ0KSk7XFxuJ1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IGEgPSBhbHBoYSAvICgxIC0gYWxwaGEpO1xuICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBNYXRoLnNxcnQoMSAvIChhICogYSkgKyB0ICogKDIgLyBhICsgMiAtIHQpKSAtIDEgLyBhO1xuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz1cbiAgICAgICAgICAgICAgICAgICAgICAgICcgICBmbG9hdCBhID0gYWxwaGEgLyAoMS4wIC0gYWxwaGEpO1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyAgIGZsb2F0IHQgPSBzcXJ0KDEuMCAvIChhICogYSkgKyB2dCAqICggMi4wL2EgKyAyLjAgLSB2dCApKSAtIDEuMCAvIGE7XFxuJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ2NpcmNsZUludicpIHtcbiAgICAgICAgICAgICAgICAvLyAxIC0gc0NpcmNsZUxvdygxIC0gdCwgYWxwaGEpXG4gICAgICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcuYWxwaGEgPT0gMClcbiAgICAgICAgICAgICAgICAgICAgLy9pZiAoYWxwaGEgPT0gMCkgcmV0dXJuIHQ7XG4gICAgICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgZmxvYXQgdCA9IHZ0O1xcbidcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmFscGhhID09IDEpXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChhbHBoYSA9PSAxKSByZXR1cm4gTWF0aC5zcXJ0KDIgKiB0IC0gdCAqIHQpO1xuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSAxLjAgLSBzcXJ0KCgxLjAgLSB2dCkgKiAoMS4wICsgdnQpKTtcXG4nXG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc3QgYSA9IGFscGhhIC8gKDEgLSBhbHBoYSk7XG4gICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIE1hdGguc3FydCgxIC8gKGEgKiBhKSArICgyICogdCkgLyBhICsgMiAqIHQgLSB0ICogdCkgLSAxIC8gYTtcbiAgICAgICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9XG4gICAgICAgICAgICAgICAgICAgICAgICAnICAgZmxvYXQgYSA9IGFscGhhIC8gKDEuMCAtIGFscGhhKTtcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgICBmbG9hdCB0ID0gMS4wIC0gc3FydCgxLjAgLyAoYSAqIGEpICsgKDEuMC12dCkgKiAoIDIuMC9hICsgMS4wICsgdnQgKSkgKyAxLjAgLyBhO1xcbidcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuZXhwZWN0ZWQgc3RyZXRjaGluZyBmdW5jdGlvbiBjb2RlOiAnICsgc3RyZXRjaGluZy5mdW4pXG4gICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gdnQ7XFxuJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gdnQ7XFxuJ1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaG9vc2UgaW5pdGlhbCBhbmQgZmluYWwgY29sb3JzLCBhbmQgYWRqdXN0IHQgdmFsdWVcbiAgICAgICAgaWYgKGNvbG9ycy5sZW5ndGggPT0gMSkgZnNoU3RyaW5nICs9ICcgICB2ZWM0IGNJPWMwO1xcbiAgIHZlYzQgY0Y9YzA7XFxuJ1xuICAgICAgICBlbHNlIGlmIChjb2xvcnMubGVuZ3RoID09IDIpIGZzaFN0cmluZyArPSAnICAgdmVjNCBjST1jMDtcXG4gICB2ZWM0IGNGPWMxO1xcbidcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuYiA9IGNvbG9ycy5sZW5ndGggLSAxXG4gICAgICAgICAgICBjb25zdCBuYnMgPSBuYiArICcuMCdcbiAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgdmVjNCBjSTtcXG4nXG4gICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIHZlYzQgY0Y7XFxuJ1xuICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBpZih0PDEuMC8nICsgbmJzICsgJykgeyBjST1jMDsgY0Y9YzE7IHQ9dConICsgbmJzICsgJzsgfVxcbidcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAyOyBpIDwgbmI7IGkrKylcbiAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz1cbiAgICAgICAgICAgICAgICAgICAgJyAgIGVsc2UgaWYodDwnICtcbiAgICAgICAgICAgICAgICAgICAgaSArXG4gICAgICAgICAgICAgICAgICAgICcuMC8nICtcbiAgICAgICAgICAgICAgICAgICAgbmJzICtcbiAgICAgICAgICAgICAgICAgICAgJykgeyBjST1jJyArXG4gICAgICAgICAgICAgICAgICAgIChpIC0gMSkgK1xuICAgICAgICAgICAgICAgICAgICAnOyBjRj1jJyArXG4gICAgICAgICAgICAgICAgICAgIGkgK1xuICAgICAgICAgICAgICAgICAgICAnOyB0PScgK1xuICAgICAgICAgICAgICAgICAgICBuYnMgK1xuICAgICAgICAgICAgICAgICAgICAnKnQtJyArXG4gICAgICAgICAgICAgICAgICAgIChpIC0gMSkgK1xuICAgICAgICAgICAgICAgICAgICAnLjA7IH1cXG4nXG4gICAgICAgICAgICBmc2hTdHJpbmcgKz1cbiAgICAgICAgICAgICAgICAnICAgZWxzZSB7IGNJPWMnICsgKG5iIC0gMSkgKyAnOyBjRj1jJyArIG5iICsgJzsgdD0nICsgbmJzICsgJyp0LScgKyAobmIgLSAxKSArICcuMDsgfVxcbidcbiAgICAgICAgfVxuXG4gICAgICAgIC8vb25lIHNpbmdsZSBjb2xvclxuICAgICAgICBpZiAoY29sb3JzLmxlbmd0aCA9PSAxKSBmc2hTdHJpbmcgKz0gJyAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoYzBbMF0sIGMwWzFdLCBjMFsyXSwgYzBbM10pO31cXG4nXG4gICAgICAgIC8vc2V0IGludGVycG9sYXRlZCBjb2xvciwgYmV0d2VlbiBpbml0aWFsIGFuZCBmaW5hbCBvbmVcbiAgICAgICAgZWxzZSBmc2hTdHJpbmcgKz0gJyAgIGdsX0ZyYWdDb2xvciA9IG1peChjSSwgY0YsIHQpO31cXG4nXG5cbiAgICAgICAgLy9jb25zb2xlLmxvZyhmc2hTdHJpbmcpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcn0gKi9cbiAgICAgICAgY29uc3QgZlNoYWRlciA9IGNyZWF0ZVNoYWRlcihnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCBmc2hTdHJpbmcpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFByb2dyYW19ICovXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IGluaXRTaGFkZXJQcm9ncmFtKGdsLCB2U2hhZGVyLCBmU2hhZGVyKVxuICAgICAgICBnbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbSlcblxuICAgICAgICAvL3NldCB1bmlmb3Jtc1xuXG4gICAgICAgIC8vc2l6ZVBpeFxuICAgICAgICAvL1RPRE86IGJ1ZyBoZXJlLiBTZWVtcyB0byBiZSBsaW1pdGVkIHRvIHNvbWUgdGhyZXNob2xkIHZhbHVlIChhcm91bmQgMjUwKS5cbiAgICAgICAgZ2wudW5pZm9ybTFmKGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sICdzaXplUGl4JyksIDEuMCAqIHNpemVQaXgpXG5cbiAgICAgICAgLy9zdHJldGNoaW5nIGFscGhhIGZhY3RvclxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ2FscGhhJyksIHN0cmV0Y2hpbmcgPyAxLjAgKiBzdHJldGNoaW5nLmFscGhhIDogMC4wKVxuXG4gICAgICAgIC8vY29sb3JzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gY29sb3IoY29sb3JzW2ldKVxuXG4gICAgICAgICAgICBsZXQgb3BhY2l0eSA9IGMub3BhY2l0eVxuICAgICAgICAgICAgaWYgKGMub3BhY2l0eSA9PSAxICYmIGdsb2JhbE9wYWNpdHkgIT0gdW5kZWZpbmVkKSBvcGFjaXR5ID0gZ2xvYmFsT3BhY2l0eVxuXG4gICAgICAgICAgICBnbC51bmlmb3JtNGZ2KGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sICdjJyArIGkpLCBbXG4gICAgICAgICAgICAgICAgK2MuciAvIDI1NS4wLFxuICAgICAgICAgICAgICAgICtjLmcgLyAyNTUuMCxcbiAgICAgICAgICAgICAgICArYy5iIC8gMjU1LjAsXG4gICAgICAgICAgICAgICAgK29wYWNpdHksXG4gICAgICAgICAgICBdKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqICAqL1xuICAgIGRyYXcodmVydGljZXNCdWZmZXIsIHRCdWZmZXIsIHRyYW5zZm9NYXQpIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsXG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSB0aGlzLnByb2dyYW1cblxuICAgICAgICAvL3ZlcnRpY2UgZGF0YVxuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZ2wuY3JlYXRlQnVmZmVyKCkpXG4gICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KHZlcnRpY2VzQnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgJ3BvcycpXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoXG4gICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgIDIsIC8vbnVtQ29tcG9uZW50c1xuICAgICAgICAgICAgZ2wuRkxPQVQsIC8vdHlwZVxuICAgICAgICAgICAgZmFsc2UsIC8vbm9ybWFsaXNlXG4gICAgICAgICAgICAwLCAvL3N0cmlkZVxuICAgICAgICAgICAgMCAvL29mZnNldFxuICAgICAgICApXG4gICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uKVxuXG4gICAgICAgIC8vdCBkYXRhXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkodEJ1ZmZlciksIGdsLlNUQVRJQ19EUkFXKVxuICAgICAgICBjb25zdCB0ID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgJ3QnKVxuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHQsIDEsIGdsLkZMT0FULCBmYWxzZSwgMCwgMClcbiAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkodClcblxuICAgICAgICAvL3RyYW5zZm9ybWF0aW9uXG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXgzZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdtYXQnKSwgZmFsc2UsIG5ldyBGbG9hdDMyQXJyYXkodHJhbnNmb01hdCkpXG5cbiAgICAgICAgLy8gRW5hYmxlIHRoZSBkZXB0aCB0ZXN0XG4gICAgICAgIC8vZ2wuZW5hYmxlKGdsLkRFUFRIX1RFU1QpO1xuICAgICAgICAvLyBDbGVhciB0aGUgY29sb3IgYnVmZmVyIGJpdFxuICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUKVxuICAgICAgICAvLyBTZXQgdGhlIHZpZXcgcG9ydFxuICAgICAgICAvL2dsLnZpZXdwb3J0KDAsIDAsIGNnLncsIGNnLmgpO1xuXG4gICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuUE9JTlRTLCAwLCB2ZXJ0aWNlc0J1ZmZlci5sZW5ndGggLyAyKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgaW5pdFNoYWRlclByb2dyYW0sIGNyZWF0ZVNoYWRlciB9IGZyb20gJy4vd2ViR0xVdGlscy5qcydcbmltcG9ydCB7IGNvbG9yIH0gZnJvbSAnZDMtY29sb3InXG5cbi8qKlxuICogRXZlcnl0aGluZyB0byBlYXNpbHkgZHJhdyBjb2xvcmVkIHNxdWFyZXMgd2l0aCB3ZWJHTC5cbiAqIEFsbCB0aGUgc2FtZSBzaXplLCBidXQgZGlmZmVyZW50IGZpbGwgY29sb3IuXG4gKiBDb2xvciBiYXNlZCBvbiBjYXRlZ29yaWVzLlxuICovXG5leHBvcnQgY2xhc3MgV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+fSBjb2xvcnNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb2xvcnMpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48c3RyaW5nPn0gKi9cbiAgICAgICAgdGhpcy5jb2xvcnMgPSBjb2xvcnNcblxuICAgICAgICAvKiogVmVjdG9yIHNoYWRlciBwcm9ncmFtXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudnNoU3RyaW5nID0gYFxuICAgICAgICBhdHRyaWJ1dGUgdmVjMiBwb3M7XG4gICAgICAgIHVuaWZvcm0gZmxvYXQgc2l6ZVBpeDtcbiAgICAgICAgdW5pZm9ybSBtYXQzIG1hdDtcblxuICAgICAgICBhdHRyaWJ1dGUgZmxvYXQgaTtcbiAgICAgICAgdmFyeWluZyBmbG9hdCB2aTtcblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KG1hdCAqIHZlYzMocG9zLCAxLjApLCAxLjApO1xuICAgICAgICAgIGdsX1BvaW50U2l6ZSA9IHNpemVQaXg7XG4gICAgICAgICAgdmkgPSBpO1xuICAgICAgICB9XG4gICAgICAgIGBcblxuICAgICAgICAvL3ByZXBhcmUgZnJhZ21lbnQgc2hhZGVyIGNvZGVcbiAgICAgICAgLy9kZWNsYXJlIHRoZSB1bmlmb3JtIGFuZCBvdGhlciB2YXJpYWJsZXNcbiAgICAgICAgY29uc3Qgb3V0ID0gW11cbiAgICAgICAgb3V0LnB1c2goJ3ByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xcbnZhcnlpbmcgZmxvYXQgdmk7XFxuJylcbiAgICAgICAgLy9hZGQgY29sb3IgdW5pZm9ybXNcbiAgICAgICAgb3V0LnB1c2goJ3VuaWZvcm0gdmVjNCcpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA+IDApIG91dC5wdXNoKCcsJylcbiAgICAgICAgICAgIG91dC5wdXNoKCcgYycgKyBpKVxuICAgICAgICB9XG4gICAgICAgIG91dC5wdXNoKCc7XFxuJylcbiAgICAgICAgLy9zdGFydCB0aGUgbWFpbiBmdW5jdGlvblxuICAgICAgICBvdXQucHVzaCgndm9pZCBtYWluKHZvaWQpIHtcXG4nKVxuICAgICAgICAvL2Nob29zZSBjb2xvciBpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA+IDApIG91dC5wdXNoKCdlbHNlICcpXG4gICAgICAgICAgICBvdXQucHVzaCgnaWYodmk9PScpXG4gICAgICAgICAgICBvdXQucHVzaChpKVxuICAgICAgICAgICAgb3V0LnB1c2goJy4wKSBnbF9GcmFnQ29sb3IgPSB2ZWM0KGMnKVxuICAgICAgICAgICAgb3V0LnB1c2goaSlcbiAgICAgICAgICAgIG91dC5wdXNoKCdbMF0sIGMnKVxuICAgICAgICAgICAgb3V0LnB1c2goaSlcbiAgICAgICAgICAgIG91dC5wdXNoKCdbMV0sIGMnKVxuICAgICAgICAgICAgb3V0LnB1c2goaSlcbiAgICAgICAgICAgIG91dC5wdXNoKCdbMl0sIGMnKVxuICAgICAgICAgICAgb3V0LnB1c2goaSlcbiAgICAgICAgICAgIG91dC5wdXNoKCdbM10pO1xcbicpXG4gICAgICAgIH1cbiAgICAgICAgb3V0LnB1c2goJ2Vsc2UgZ2xfRnJhZ0NvbG9yID0gdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApO1xcbn0nKVxuICAgICAgICAvKiogRnJhZ21lbnQgc2hhZGVyIHByb2dyYW1cbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5mc2hTdHJpbmcgPSBvdXQuam9pbignJylcbiAgICB9XG5cbiAgICAvKiogICovXG4gICAgZHJhdyhnbCwgdmVydGljZXNCdWZmZXIsIGlCdWZmZXIsIHRyYW5zZm9NYXQsIHNpemVQaXggPSAxMCkge1xuICAgICAgICAvKiogQHR5cGUge1dlYkdMU2hhZGVyfSAqL1xuICAgICAgICBjb25zdCB2U2hhZGVyID0gY3JlYXRlU2hhZGVyKGdsLCBnbC5WRVJURVhfU0hBREVSLCB0aGlzLnZzaFN0cmluZylcblxuICAgICAgICAvKiogQHR5cGUge1dlYkdMU2hhZGVyfSAqL1xuICAgICAgICBjb25zdCBmU2hhZGVyID0gY3JlYXRlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIHRoaXMuZnNoU3RyaW5nKVxuXG4gICAgICAgIC8qKiBAdHlwZSB7V2ViR0xQcm9ncmFtfSAqL1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gaW5pdFNoYWRlclByb2dyYW0oZ2wsIHZTaGFkZXIsIGZTaGFkZXIpXG4gICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSlcblxuICAgICAgICAvL3NldCB1bmlmb3Jtc1xuXG4gICAgICAgIC8vc2l6ZVBpeFxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdzaXplUGl4JyksIDEuMCAqIHNpemVQaXgpXG5cbiAgICAgICAgLy9jb2xvcnNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYyA9IGNvbG9yKHRoaXMuY29sb3JzW2ldKVxuICAgICAgICAgICAgZ2wudW5pZm9ybTRmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgJ2MnICsgaSksIFtcbiAgICAgICAgICAgICAgICArYy5yIC8gMjU1LjAsXG4gICAgICAgICAgICAgICAgK2MuZyAvIDI1NS4wLFxuICAgICAgICAgICAgICAgICtjLmIgLyAyNTUuMCxcbiAgICAgICAgICAgICAgICArYy5vcGFjaXR5LFxuICAgICAgICAgICAgXSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdmVydGljZSBkYXRhXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkodmVydGljZXNCdWZmZXIpLCBnbC5TVEFUSUNfRFJBVylcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAncG9zJylcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgMiwgLy9udW1Db21wb25lbnRzXG4gICAgICAgICAgICBnbC5GTE9BVCwgLy90eXBlXG4gICAgICAgICAgICBmYWxzZSwgLy9ub3JtYWxpc2VcbiAgICAgICAgICAgIDAsIC8vc3RyaWRlXG4gICAgICAgICAgICAwIC8vb2Zmc2V0XG4gICAgICAgIClcbiAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkocG9zaXRpb24pXG5cbiAgICAgICAgLy9pIGRhdGFcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGdsLmNyZWF0ZUJ1ZmZlcigpKVxuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheShpQnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXG4gICAgICAgIGNvbnN0IGkgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAnaScpXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoaSwgMSwgZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKVxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShpKVxuXG4gICAgICAgIC8vdHJhbnNmb3JtYXRpb25cbiAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDNmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgJ21hdCcpLCBmYWxzZSwgbmV3IEZsb2F0MzJBcnJheSh0cmFuc2ZvTWF0KSlcblxuICAgICAgICAvLyBFbmFibGUgdGhlIGRlcHRoIHRlc3RcbiAgICAgICAgLy9nbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgICAgIC8vIENsZWFyIHRoZSBjb2xvciBidWZmZXIgYml0XG4gICAgICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQpXG4gICAgICAgIC8vIFNldCB0aGUgdmlldyBwb3J0XG4gICAgICAgIC8vZ2wudmlld3BvcnQoMCwgMCwgY2cudywgY2cuaCk7XG5cbiAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5QT0lOVFMsIDAsIHZlcnRpY2VzQnVmZmVyLmxlbmd0aCAvIDIpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBleHRlbnQsIG1heCB9IGZyb20gJ2QzLWFycmF5J1xuaW1wb3J0IHsgc2NhbGVRdWFudGlsZSB9IGZyb20gJ2QzLXNjYWxlJ1xuXG4vKipcbiAqIEEgc2NhbGUgaXMgc2ltcGx5IGEgZnVuY3Rpb24gdGhhdCBtYXAgYSBkb21haW4gdG8gYSByYW5nZS5cbiAqIEB0eXBlZGVmIHtmdW5jdGlvbihudW1iZXIpOm51bWJlcn0gU2NhbGUgKi9cblxuLyoqXG4gKiBBIHNjYWxlIHdob3NlIHJhbmdlIGlzIGEgY29sb3IgKHN0cmluZykuXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmd9IENvbG9yU2NhbGUgKi9cblxuLyoqXG4gKiBAbW9kdWxlIHV0aWxzXG4gKi9cblxuLyoqXG4gKiBHZW5lcmljIGZ1bmN0aW9uIGZvciB2aWV3IHNjYWxlIC0gY29udGludW91cyBvciBkaXNjcmV0ZVxuICpcbiAqIEBwYXJhbSB7eyB2YWx1ZUZ1bmN0aW9uOmZ1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsKTpudW1iZXIsIG1pblZhbHVlPzpudW1iZXIsIG1pblNpemVQaXg/Om51bWJlciwgbWF4U2l6ZUZhY3Rvcj86bnVtYmVyLCByYW5nZT86W251bWJlciwgbnVtYmVyXSwgZG9tYWluPzpbbnVtYmVyLCBudW1iZXJdLCBzdHJldGNoaW5nPzpmdW5jdGlvbihudW1iZXIpOm51bWJlciwgY2xhc3NOdW1iZXI/Om51bWJlcn19IG9wdHNcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+KTpTY2FsZX1cbiAqL1xuZXhwb3J0IGNvbnN0IHZpZXdTY2FsZSA9IChvcHRzKSA9PiB7XG4gICAgY29uc3QgdmFsdWVGdW5jdGlvbiA9IG9wdHMudmFsdWVGdW5jdGlvblxuICAgIGNvbnN0IG1pblZhbHVlID0gb3B0cy5taW5WYWx1ZSB8fCAwXG4gICAgY29uc3QgbWluU2l6ZVBpeCA9IG9wdHMubWluU2l6ZVBpeCB8fCAwXG4gICAgY29uc3QgbWF4U2l6ZUZhY3RvciA9IG9wdHMubWF4U2l6ZUZhY3RvciB8fCAxXG4gICAgY29uc3Qgc3RyZXRjaGluZyA9IG9wdHMuc3RyZXRjaGluZ1xuICAgIGNvbnN0IHJhbmdlXyA9IG9wdHMucmFuZ2VcbiAgICBjb25zdCBkb21haW5fID0gb3B0cy5kb21haW5cbiAgICBjb25zdCBjbGFzc051bWJlciA9IG9wdHMuY2xhc3NOdW1iZXJcbiAgICByZXR1cm4gKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA9PiB7XG4gICAgICAgIGNvbnN0IGRvbWFpbiA9IGRvbWFpbl8gfHwgW21pblZhbHVlLCBtYXgoY2VsbHMsIHZhbHVlRnVuY3Rpb24pXVxuICAgICAgICBjb25zdCByYW5nZSA9IHJhbmdlXyB8fCBbbWluU2l6ZVBpeCAqIHosIHJlc29sdXRpb24gKiBtYXhTaXplRmFjdG9yXVxuICAgICAgICBjb25zdCBkb21haW5TaXplID0gZG9tYWluWzFdIC0gZG9tYWluWzBdLFxuICAgICAgICAgICAgZG9tYWluTWluID0gZG9tYWluWzBdXG4gICAgICAgIGNvbnN0IHJhbmdlU2l6ZSA9IHJhbmdlWzFdIC0gcmFuZ2VbMF0sXG4gICAgICAgICAgICByYW5nZU1pbiA9IHJhbmdlWzBdXG4gICAgICAgIHJldHVybiAodCkgPT4ge1xuICAgICAgICAgICAgLy9zY2FsZSB0byBbMCwxXVxuICAgICAgICAgICAgdCA9ICh0IC0gZG9tYWluTWluKSAvIGRvbWFpblNpemVcbiAgICAgICAgICAgIC8vc3RyZXRjaFxuICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcpIHQgPSBzdHJldGNoaW5nKHQpXG4gICAgICAgICAgICAvL2NsYXNzaWZ5XG4gICAgICAgICAgICBpZiAoY2xhc3NOdW1iZXIpIHQgPSB0ID09IDEgPyAxIDogTWF0aC5mbG9vcih0ICogY2xhc3NOdW1iZXIpIC8gKGNsYXNzTnVtYmVyIC0gMSlcbiAgICAgICAgICAgIC8vc2NhbGUgdG8gcmFuZ2VcbiAgICAgICAgICAgIHJldHVybiByYW5nZU1pbiArIHQgKiByYW5nZVNpemVcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBHZW5lcmljIGZ1bmN0aW9uIGZvciB2aWV3IHNjYWxlIC0gcXVhbnRpbGVcbiAqXG4gKiBAcGFyYW0ge3sgdmFsdWVGdW5jdGlvbjpmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbCk6bnVtYmVyLCBjbGFzc051bWJlcj86bnVtYmVyLCBtaW5TaXplUGl4PzpudW1iZXIsIG1heFNpemVGYWN0b3I/Om51bWJlciB9fSBvcHRzXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oQXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPik6U2NhbGV9XG4gKi9cbmV4cG9ydCBjb25zdCB2aWV3U2NhbGVRdWFudGlsZSA9IChvcHRzKSA9PiB7XG4gICAgY29uc3QgdmFsdWVGdW5jdGlvbiA9IG9wdHMudmFsdWVGdW5jdGlvblxuICAgIGNvbnN0IGNsYXNzTnVtYmVyID0gb3B0cy5jbGFzc051bWJlciB8fCAxMlxuICAgIGNvbnN0IG1pblNpemVQaXggPSBvcHRzLm1pblNpemVQaXggfHwgMVxuICAgIGNvbnN0IG1heFNpemVGYWN0b3IgPSBvcHRzLm1heFNpemVGYWN0b3IgfHwgMVxuICAgIGNvbnN0IHNjYWxlID0gc2NhbGVRdWFudGlsZSgpXG4gICAgcmV0dXJuIChjZWxscywgcmVzb2x1dGlvbiwgeikgPT4ge1xuICAgICAgICBzY2FsZS5kb21haW4oY2VsbHMubWFwKHZhbHVlRnVuY3Rpb24pKVxuICAgICAgICBjb25zdCBtaW5TaXplR2VvID0gbWluU2l6ZVBpeCAqIHosXG4gICAgICAgICAgICBtYXhTaXplR2VvID0gcmVzb2x1dGlvbiAqIG1heFNpemVGYWN0b3JcbiAgICAgICAgc2NhbGUucmFuZ2UoXG4gICAgICAgICAgICBBcnJheS5mcm9tKFxuICAgICAgICAgICAgICAgIHsgbGVuZ3RoOiBjbGFzc051bWJlciB9LFxuICAgICAgICAgICAgICAgIChfLCBpKSA9PiBtaW5TaXplR2VvICsgKGkgKiAobWF4U2l6ZUdlbyAtIG1pblNpemVHZW8pKSAvIChjbGFzc051bWJlciAtIDEpXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgc2NhbGUuYnJlYWtzID0gc2NhbGUucXVhbnRpbGVzKClcbiAgICAgICAgc2NhbGUudmFsdWVzID0gc2NhbGUucmFuZ2UoKVxuICAgICAgICByZXR1cm4gc2NhbGVcbiAgICB9XG59XG5cbi8qKlxuICogR2VuZXJpYyBmdW5jdGlvbiBmb3IgY29sb3IgdmlldyBzY2FsZSAtIGNvbnRpbnVvdXMgb3IgZGlzY3JldGVcbiAqXG4gKiBAcGFyYW0ge3sgdmFsdWVGdW5jdGlvbjpmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbCk6bnVtYmVyLCBjb2xvclNjYWxlPzpmdW5jdGlvbihudW1iZXIpOnN0cmluZywgY29sb3JzPzpBcnJheS48c3RyaW5nPiwgc3RyZXRjaGluZz86ZnVuY3Rpb24obnVtYmVyKTpudW1iZXIgfX0gb3B0c1xuICogQHJldHVybnMge2Z1bmN0aW9uKEFycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD4pOkNvbG9yU2NhbGV9XG4gKi9cbmV4cG9ydCBjb25zdCB2aWV3U2NhbGVDb2xvciA9IChvcHRzKSA9PiB7XG4gICAgY29uc3QgdmFsdWVGdW5jdGlvbiA9IG9wdHMudmFsdWVGdW5jdGlvblxuICAgIGNvbnN0IHN0cmV0Y2hpbmcgPSBvcHRzLnN0cmV0Y2hpbmdcbiAgICBsZXQgY29sb3JTY2FsZSA9IG9wdHMuY29sb3JTY2FsZSB8fCAoKCkgPT4gJ3B1cnBsZScpXG5cbiAgICAvL2Rpc2NyZXRlIGNvbG9ycyBjYXNlOiBidWlsZCBjb250aW51b3VzIGNvbG9yIHNjYWxlIGZyb20gZGlzY3JldGUgb25lcy5cbiAgICBjb25zdCBuYkNsYXNzID0gb3B0cy5jb2xvcnM/Lmxlbmd0aFxuICAgIGlmIChvcHRzLmNvbG9ycyAmJiBuYkNsYXNzKVxuICAgICAgICBjb2xvclNjYWxlID0gKHQpID0+IG9wdHMuY29sb3JzW3QgPT0gMSA/IG5iQ2xhc3MgLSAxIDogTWF0aC5mbG9vcih0ICogbmJDbGFzcyldXG5cbiAgICByZXR1cm4gKGNlbGxzKSA9PiB7XG4gICAgICAgIGlmIChjZWxscy5sZW5ndGggPT0gMCB8fCAhY2VsbHMpIHJldHVyblxuICAgICAgICAvKiogQHR5cGUge1t1bmRlZmluZWQsIHVuZGVmaW5lZF0gfCBbbnVtYmVyLCBudW1iZXJdfSAqL1xuICAgICAgICBjb25zdCBkb21haW4gPSBleHRlbnQoY2VsbHMsIHZhbHVlRnVuY3Rpb24pXG4gICAgICAgIGlmIChkb21haW5bMF0gPT0gdW5kZWZpbmVkKSByZXR1cm5cbiAgICAgICAgY29uc3QgZG9tYWluU2l6ZSA9IGRvbWFpblsxXSAtIGRvbWFpblswXVxuICAgICAgICBjb25zdCBzY2FsZSA9ICh0KSA9PiB7XG4gICAgICAgICAgICAvL3NjYWxlIHRvIFswLDFdXG4gICAgICAgICAgICB0ID0gKHQgLSBkb21haW5bMF0pIC8gZG9tYWluU2l6ZVxuICAgICAgICAgICAgLy9zdHJldGNoXG4gICAgICAgICAgICBpZiAoc3RyZXRjaGluZykgdCA9IHN0cmV0Y2hpbmcodClcbiAgICAgICAgICAgIHJldHVybiBjb2xvclNjYWxlKHQpXG4gICAgICAgIH1cbiAgICAgICAgLy9mdW5jdGlvbiB0aGF0IHJldHVybiB0aGUgZG9tYWluIHZhbHVlIGZyb20gdGhlIFswLDFdIHJhbmdlLlxuICAgICAgICBzY2FsZS5pbnZlcnQgPSAodCkgPT4ge1xuICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcpIHQgPSBzdHJldGNoaW5nLmludmVydCh0KVxuICAgICAgICAgICAgcmV0dXJuIGRvbWFpblswXSArIHQgKiBkb21haW5TaXplXG4gICAgICAgIH1cbiAgICAgICAgLy9kaXNjcmV0ZSBjb2xvcnM6IHJldHVybiB0aGUgYnJlYWtzXG4gICAgICAgIGlmIChvcHRzLmNvbG9ycyAmJiBuYkNsYXNzKSB7XG4gICAgICAgICAgICBzY2FsZS5icmVha3MgPSBbXVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBuYkNsYXNzOyBpKyspIHNjYWxlLmJyZWFrcy5wdXNoKHNjYWxlLmludmVydChpIC8gbmJDbGFzcykpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2NhbGVcbiAgICB9XG59XG5cbi8qKlxuICogR2VuZXJpYyBmdW5jdGlvbiBmb3IgY29sb3IgdmlldyBzY2FsZSAtIHF1YW50aWxlXG4gKlxuICogQHBhcmFtIHt7IHZhbHVlRnVuY3Rpb246ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGwpOm51bWJlciwgY2xhc3NOdW1iZXI/Om51bWJlciwgY29sb3JzPzpBcnJheS48c3RyaW5nPiwgY29sb3JTY2FsZT86ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmcgfX0gb3B0c1xuICogQHJldHVybnMge2Z1bmN0aW9uKEFycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD4pOkNvbG9yU2NhbGV9XG4gKi9cbmV4cG9ydCBjb25zdCB2aWV3U2NhbGVDb2xvclF1YW50aWxlID0gKG9wdHMpID0+IHtcbiAgICBjb25zdCB2YWx1ZUZ1bmN0aW9uID0gb3B0cy52YWx1ZUZ1bmN0aW9uXG4gICAgY29uc3QgY2xhc3NOdW1iZXIgPSBvcHRzLmNsYXNzTnVtYmVyIHx8IDEyXG5cbiAgICBsZXQgY29sb3JzID0gb3B0cy5jb2xvcnNcbiAgICBpZiAob3B0cy5jb2xvclNjYWxlKSBjb2xvcnMgPSBkaXNjcmV0ZUNvbG9ycyhvcHRzLmNvbG9yU2NhbGUsIGNsYXNzTnVtYmVyKVxuICAgIGNvbG9ycyA9XG4gICAgICAgIGNvbG9ycyB8fFxuICAgICAgICBBcnJheS5mcm9tKFxuICAgICAgICAgICAgeyBsZW5ndGg6IGNsYXNzTnVtYmVyIH0sXG4gICAgICAgICAgICAoXywgaSkgPT4gJ3JnYignICsgTWF0aC5mbG9vcigoMjU1ICogaSkgLyAoY2xhc3NOdW1iZXIgLSAxKSkgKyAnLDE1MCwxNTApJ1xuICAgICAgICApXG5cbiAgICBjb25zdCBzY2FsZSA9IHNjYWxlUXVhbnRpbGUoKS5yYW5nZShjb2xvcnMpXG4gICAgcmV0dXJuIChjZWxscykgPT4ge1xuICAgICAgICBzY2FsZS5kb21haW4oY2VsbHMubWFwKHZhbHVlRnVuY3Rpb24pKVxuICAgICAgICBzY2FsZS5icmVha3MgPSBzY2FsZS5xdWFudGlsZXMoKVxuICAgICAgICBzY2FsZS5jb2xvcnMgPSBjb2xvcnNcbiAgICAgICAgcmV0dXJuIHNjYWxlXG4gICAgfVxufVxuXG4vKipcbiAqIENvbWJpbmUgdmlldyBzY2FsZSBmdW5jdGlvbnNcbiAqXG4gKiBAcGFyYW0geyp9IG9ialxuICogQHJldHVybnMge2Z1bmN0aW9ufVxuICovXG5leHBvcnQgY29uc3Qgdmlld1NjYWxlQ29tYmluYXRpb24gPSAob2JqKSA9PiB7XG4gICAgLy9vYmo6IHByb3AgYW5kIGEgZnVuY3Rpb24gdG8gY2FsbFxuICAgIHJldHVybiAoY2VsbHMsIHJlc29sdXRpb24sIHopID0+IHtcbiAgICAgICAgY29uc3Qgb3V0ID0ge31cbiAgICAgICAgZm9yIChjb25zdCBwIGluIG9iaikge1xuICAgICAgICAgICAgb3V0W3BdID0gb2JqW3BdKGNlbGxzLCByZXNvbHV0aW9uLCB6KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRcbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJuIGEgY2xhc3NpZmllciBmdW5jdGlvbiBmcm9tIGJyZWFrIHZhbHVlcy5cbiAqIFRoZSBjbGFzc2lmaWVyIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNsYXNzIGlkIChmcm9tIDAgdG8gYnJlYWtzLmxlbmd0aCkgZnJvbSBhIHZhbHVlIHRvIGNsYXNzaWZpeS5cbiAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IGJyZWFrcyB0aGUgYnJlYWtzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmaWVyKGJyZWFrcykge1xuICAgIGNvbnN0IGJsID0gYnJlYWtzLmxlbmd0aFxuICAgIGNvbnN0IGNsYXNzaWZpZXIgPSAodmFsdWUpID0+IHtcbiAgICAgICAgbGV0IGkgPSAwXG4gICAgICAgIHdoaWxlIChpIDwgYmwpIHtcbiAgICAgICAgICAgIGNvbnN0IGJyZWFrXyA9IGJyZWFrc1tpXVxuICAgICAgICAgICAgaWYgKHZhbHVlIDw9IGJyZWFrXykgcmV0dXJuIGlcbiAgICAgICAgICAgIGkrK1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpXG4gICAgfVxuICAgIGNsYXNzaWZpZXIuYnJlYWtzID0gYnJlYWtzXG4gICAgcmV0dXJuIGNsYXNzaWZpZXJcbn1cblxuLyoqXG4gKiBSZXR1cm4gYSBjb2xvciBjbGFzc2lmaWVyIGZ1bmN0aW9uIGZyb20gYnJlYWsgdmFsdWVzLlxuICogVGhlIGNsYXNzaWZpZXIgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29sb3IgZnJvbSBhIHZhbHVlIHRvIGNsYXNzaWZpeS5cbiAqIFRoZXJlIHNob3VsZCBiZSBvbmUgY29sb3IgbW9yZSB0aGFuIGJyZWFrIHZhbHVlcy5cbiAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IGJyZWFrcyB0aGUgYnJlYWtzXG4gKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+fSBjb2xvcnMgdGhlIGNvbG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29sb3JDbGFzc2lmaWVyKGJyZWFrcywgY29sb3JzKSB7XG4gICAgY29uc3QgY2xhc3NpZmllcl8gPSBjbGFzc2lmaWVyKGJyZWFrcylcbiAgICBjb25zdCBjb2xvckNsYXNzaWZpZXIgPSAodmFsdWUpID0+IGNvbG9yc1tjbGFzc2lmaWVyXyh2YWx1ZSldXG4gICAgY29sb3JDbGFzc2lmaWVyLmJyZWFrcyA9IGJyZWFrc1xuICAgIGNvbG9yQ2xhc3NpZmllci5jb2xvcnMgPSBjb2xvcnNcbiAgICByZXR1cm4gY29sb3JDbGFzc2lmaWVyXG59XG5cbi8qKlxuICogTWFrZSBhcnJheSBvZiBjb2xvcnMgZnJvbSBhIGNvbG9yU2NhbGUuXG4gKiBJdCBpcyBhIGtpbmQgb2Ygc2FtcGxpbmcsIG9yIHVuLWludGVycG9sYXRpb25cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6c3RyaW5nfSBjb2xvclNjYWxlXG4gKiBAcGFyYW0ge251bWJlcn0gbmJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc2NyZXRlQ29sb3JzKGNvbG9yU2NhbGUsIG5iKSB7XG4gICAgaWYgKG5iID09IDEpIHJldHVybiBbY29sb3JTY2FsZSgwLjUpXVxuICAgIGNvbnN0IG91dCA9IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKSBvdXQucHVzaChjb2xvclNjYWxlKGkgLyAobmIgLSAxKSkpXG4gICAgcmV0dXJuIG91dFxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIEBtb2R1bGUgdXRpbHNcbiAqL1xuXG4vL1RPRE8gaW52ZXJ0IGZvciBjaXJjdWxhclxuLy9UT0RPIHVzZSBNYXRoLnNxcnRcbi8vVE9ETyB2YWxpZGF0ZVxuXG4vKipcbiAqIFNvbWUgZnVuY3Rpb24gWzAsMV0tPlswLDFdIHRvIHN0cmV0Y2ggcmFuZ2Ugb2YgdmFsdWVzLlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vZXVyb3N0YXQvZ3JpZHZpei9ibG9iL21hc3Rlci9kb2NzL3JlZmVyZW5jZS5tZCNzdHJldGNoaW5nXG4gKiBAc2VlIGh0dHBzOi8vb2JzZXJ2YWJsZWhxLmNvbS9AamdhZmZ1cmkvc3RyZXRjaGluZ1xuICovXG5cbi8vaWRlbnRpdHkgZnVuY3Rpb25cbmNvbnN0IGlkZW50aXR5ID0gKHQpID0+IHRcbmlkZW50aXR5LmludmVydCA9IGlkZW50aXR5XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGJhc2VcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihudW1iZXIpOm51bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IGV4cG9uZW50aWFsU2NhbGUgPSAoYmFzZSA9IDMpID0+IHtcbiAgICBpZiAoYmFzZSA9PSAwKSByZXR1cm4gaWRlbnRpdHlcbiAgICBjb25zdCBhID0gTWF0aC5leHAoYmFzZSkgLSAxXG4gICAgY29uc3QgZiA9ICh0KSA9PiAoTWF0aC5leHAodCAqIGJhc2UpIC0gMSkgLyBhXG4gICAgZi5pbnZlcnQgPSAodCkgPT4gTWF0aC5sb2coYSAqIHQgKyAxKSAvIGJhc2VcbiAgICByZXR1cm4gZlxufVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBiYXNlXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBsb2dhcml0aG1pY1NjYWxlID0gKGJhc2UgPSAzKSA9PiB7XG4gICAgaWYgKGJhc2UgPT0gMCkgcmV0dXJuIGlkZW50aXR5XG4gICAgY29uc3QgYSA9IE1hdGguZXhwKGJhc2UpLFxuICAgICAgICBiID0gMSAtIGFcbiAgICBjb25zdCBmID0gKHQpID0+IDEgLSBNYXRoLmxvZyhhICsgdCAqIGIpIC8gYmFzZVxuICAgIGYuaW52ZXJ0ID0gKHQpID0+IChNYXRoLmV4cCgoMSAtIHQpICogYmFzZSkgLSBhKSAvIGJcbiAgICByZXR1cm4gZlxufVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBleHBvbmVudFxuICogQHJldHVybnMge2Z1bmN0aW9uKG51bWJlcik6bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgcG93ZXJTY2FsZSA9IChleHBvbmVudCA9IDMpID0+IHtcbiAgICBpZiAoZXhwb25lbnQgPT0gMSkgcmV0dXJuIGlkZW50aXR5XG4gICAgLy9UT0RPIGlmIChleHBvbmVudCA9PSAwLjUpIHJldHVybiBNYXRoLnNxcnRcbiAgICBjb25zdCBmID0gKHQpID0+IE1hdGgucG93KHQsIGV4cG9uZW50KVxuICAgIGNvbnN0IGEgPSAxIC8gZXhwb25lbnRcbiAgICBmLmludmVydCA9ICh0KSA9PiBNYXRoLnBvdyh0LCBhKVxuICAgIHJldHVybiBmXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGV4cG9uZW50XG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBwb3dlckludmVyc2VTY2FsZSA9IChleHBvbmVudCA9IDMpID0+IHtcbiAgICBpZiAoZXhwb25lbnQgPT0gMSkgcmV0dXJuIGlkZW50aXR5XG4gICAgLy9UT0RPIGlmIChleHBvbmVudCA9PSAyKSByZXR1cm4gdCA9PiAxIC0gTWF0aC5zcXJ0KDEgLSB0KVxuICAgIGNvbnN0IGEgPSAxIC8gZXhwb25lbnRcbiAgICBjb25zdCBmID0gKHQpID0+IDEgLSBNYXRoLnBvdygxIC0gdCwgYSlcbiAgICBmLmludmVydCA9ICh0KSA9PiAxIC0gTWF0aC5wb3coMSAtIHQsIGV4cG9uZW50KVxuICAgIHJldHVybiBmXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGNpcmN1bGFyaXR5XG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBjaXJjdWxhclNjYWxlID0gKGNpcmN1bGFyaXR5ID0gMC44KSA9PiB7XG4gICAgaWYgKGNpcmN1bGFyaXR5ID09IDApIHJldHVybiBpZGVudGl0eVxuICAgIGlmIChjaXJjdWxhcml0eSA9PSAxKSByZXR1cm4gKHQpID0+IE1hdGguc3FydCh0ICogKDIgLSB0KSlcbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgYSA9IGNpcmN1bGFyaXR5IC8gKDEgLSBjaXJjdWxhcml0eSlcbiAgICAgICAgcmV0dXJuICh0KSA9PiBNYXRoLnNxcnQoMSAvIChhICogYSkgKyB0ICogKDIgLyBhICsgMiAtIHQpKSAtIDEgLyBhXG4gICAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBjaXJjdWxhcml0eVxuICogQHJldHVybnMge2Z1bmN0aW9uKG51bWJlcik6bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgY2lyY3VsYXJJbnZlcnNlU2NhbGUgPSAoY2lyY3VsYXJpdHkgPSAwLjgpID0+IHtcbiAgICBpZiAoY2lyY3VsYXJpdHkgPT0gMCkgcmV0dXJuIGlkZW50aXR5XG4gICAgY29uc3QgZiA9IGNpcmN1bGFyU2NhbGUoY2lyY3VsYXJpdHkpXG4gICAgcmV0dXJuICh0KSA9PiAxIC0gZigxIC0gdClcbn1cblxuLy90ZXN0XG4vKlxuY29uc3QgdGVzdCA9IChmLCBmdW4sIGEsIGVyciA9IDFlLTEyKSA9PiB7XG4gICAgZm9yIChsZXQgdCA9IDA7IHQgPD0gMTsgdCArPSAxIC8gNTApIHtcbiAgICAgICAgY29uc3QgZXIgPSB0IC0gZi5pbnZlcnQoZih0KSlcbiAgICAgICAgaWYgKE1hdGguYWJzKGVyKSA8IGVycikgY29udGludWVcbiAgICAgICAgY29uc29sZS5sb2coZnVuLCBhLCBlcilcbiAgICB9XG59XG5cbmZvciAobGV0IGZ1biBvZiBbcG93ZXJTY2FsZSwgcG93ZXJJbnZlcnNlU2NhbGVdKVxuICAgIGZvciAobGV0IGV4cCA9IC0zMDsgZXhwIDw9IDUwOyBleHAgKz0gMSkge1xuICAgICAgICBpZiAoZXhwID09IDApIGNvbnRpbnVlXG4gICAgICAgIGNvbnN0IGYgPSBmdW4oZXhwKVxuICAgICAgICB0ZXN0KGYsIGZ1biwgZXhwKVxuICAgIH1cblxuXG5mb3IgKGxldCBmdW4gb2YgW2V4cG9uZW50aWFsU2NhbGUsIGxvZ2FyaXRobWljU2NhbGVdKVxuICAgIGZvciAobGV0IGJhc2UgPSAtMjA7IGJhc2UgPD0gMjA7IGJhc2UgKz0gMSkge1xuICAgICAgICAvL2lmIChleHAgPT0gMCkgY29udGludWVcbiAgICAgICAgY29uc3QgZiA9IGZ1bihiYXNlKVxuICAgICAgICB0ZXN0KGYsIGZ1biwgYmFzZSwgMWUtMTApXG4gICAgfVxuKi9cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgaW50ZXJwb2xhdGVMYWIgfSBmcm9tICdkMy1pbnRlcnBvbGF0ZSdcblxuZXhwb3J0IGNvbnN0IHRlcm5hcnlDbGFzc2lmaWVyID0gKHByb3BlcnRpZXMsIHRvdGFsRnVuY3Rpb24sIG9wdHMgPSB7fSkgPT4ge1xuICAgIC8vdGhlIHRocmVlIHByb3BlcnRpZXNcbiAgICBjb25zdCBwMCA9IHByb3BlcnRpZXNbMF0sXG4gICAgICAgIHAxID0gcHJvcGVydGllc1sxXSxcbiAgICAgICAgcDIgPSBwcm9wZXJ0aWVzWzJdXG5cbiAgICAvL3RoZSBjbGFzc2lmaWVyIGNlbnRlciBwb2ludC4gc3VtIG11c3QgYmUgZXF1YWwgdG8gMVxuICAgIGNvbnN0IFtjMCwgYzEsIGMyXSA9IG9wdHMuY2VudGVyIHx8IFsxIC8gMywgMSAvIDMsIDEgLyAzXVxuXG4gICAgLy9wYXJhbWV0ZXIgdG8gZGVjaWRlIHdldGhlciB0byB1c2UgbWl4ZWQgY2xhc3NlcyBtMCwgbTEsIG0yLlxuICAgIGNvbnN0IHdpdGhNaXhlZENsYXNzZXMgPSBvcHRzLndpdGhNaXhlZENsYXNzZXMgIT0gdW5kZWZpbmVkID8gb3B0cy53aXRoTWl4ZWRDbGFzc2VzIDogdHJ1ZVxuXG4gICAgLy9wYXJhbWV0ZXIgdG8gZGVjaWRlIHdldGhlciB0byB1c2UgYSBjZW50cmFsIGNsYXNzLCBhbmQgdGhlIHNpemUgb2YgdGhpcyBjZW50cmFsIGNsYXNzLlxuICAgIC8vc2V0IHRvIDAgb3IgdW5kZWZpbmVkIGZvciBub3Qgc2hvd2luZyBhbnkgY2VudHJhbCBjbGFzcy4gU2V0IHRvIDEgZm9yIGEgY2VudHJhbCBjbGFzcyB0aGF0IGNvbnRhaW5zIHRoZSBtaXggY2xhc3Nlc1xuICAgIGNvbnN0IGNjID0gb3B0cy5jZW50ZXJDb2VmZmljaWVudCA/IDEgLSBvcHRzLmNlbnRlckNvZWZmaWNpZW50IDogdW5kZWZpbmVkXG5cbiAgICAvL3RoZSBvdXRwdXQgY2xhc3NpZmllciBtZXRob2RcbiAgICBjb25zdCBmdW4gPSAoYykgPT4ge1xuICAgICAgICAvL2dldCB0b3RhbFxuICAgICAgICBjb25zdCB0b3QgPSB0b3RhbEZ1bmN0aW9uKGMpXG4gICAgICAgIGlmICghdG90KSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIC8vY29tcHV0ZSBzaGFyZXNcbiAgICAgICAgY29uc3QgW3MwLCBzMSwgczJdID0gWytjW3AwXSAvIHRvdCwgK2NbcDFdIC8gdG90LCArY1twMl0gLyB0b3RdXG5cbiAgICAgICAgLy9jbGFzcyAwXG4gICAgICAgIGlmIChzMCA+PSBjMCAmJiBzMSA8PSBjMSAmJiBzMiA8PSBjMikge1xuICAgICAgICAgICAgLy9jZW50cmFsIGNsYXNzIG5lYXIgY2xhc3MgMFxuICAgICAgICAgICAgaWYgKGNjICE9IHVuZGVmaW5lZCAmJiAoczIgLSBjMikgKiAoYzEgLSBjYyAqIGMxKSA+PSAoczEgLSBjYyAqIGMxKSAqIChjYyAqIGMyIC0gYzIpKVxuICAgICAgICAgICAgICAgIHJldHVybiAnY2VudGVyJ1xuICAgICAgICAgICAgcmV0dXJuICcwJ1xuICAgICAgICB9XG4gICAgICAgIC8vY2xhc3MgMVxuICAgICAgICBpZiAoczAgPD0gYzAgJiYgczEgPj0gYzEgJiYgczIgPD0gYzIpIHtcbiAgICAgICAgICAgIC8vY2VudHJhbCBjbGFzcyBuZWFyIGNsYXNzIDFcbiAgICAgICAgICAgIGlmIChjYyAhPSB1bmRlZmluZWQgJiYgKHMyIC0gYzIpICogKGMwIC0gY2MgKiBjMCkgPj0gKHMwIC0gY2MgKiBjMCkgKiAoY2MgKiBjMiAtIGMyKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NlbnRlcidcbiAgICAgICAgICAgIHJldHVybiAnMSdcbiAgICAgICAgfVxuICAgICAgICAvL2NsYXNzIDJcbiAgICAgICAgaWYgKHMwIDw9IGMwICYmIHMxIDw9IGMxICYmIHMyID49IGMyKSB7XG4gICAgICAgICAgICAvL2NlbnRyYWwgY2xhc3MgbmVhciBjbGFzcyAyXG4gICAgICAgICAgICBpZiAoY2MgIT0gdW5kZWZpbmVkICYmIChzMSAtIGMxKSAqIChjMCAtIGNjICogYzApID49IChzMCAtIGNjICogYzApICogKGNjICogYzEgLSBjMSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuICdjZW50ZXInXG4gICAgICAgICAgICByZXR1cm4gJzInXG4gICAgICAgIH1cbiAgICAgICAgLy9taWRkbGUgY2xhc3MgMCAtIGludGVyc2VjdGlvbiBjbGFzcyAxIGFuZCAyXG4gICAgICAgIGlmIChzMCA8PSBjMCAmJiBzMSA+PSBjMSAmJiBzMiA+PSBjMikge1xuICAgICAgICAgICAgLy9jZW50cmFsIGNsYXNzXG4gICAgICAgICAgICBpZiAoY2MgIT0gdW5kZWZpbmVkICYmIHMwID4gY2MgKiBjMCkgcmV0dXJuICdjZW50ZXInXG4gICAgICAgICAgICBpZiAod2l0aE1peGVkQ2xhc3NlcykgcmV0dXJuICdtMTInXG4gICAgICAgICAgICByZXR1cm4gczEgPiBzMiA/ICcxJyA6ICcyJ1xuICAgICAgICB9XG4gICAgICAgIC8vbWlkZGxlIGNsYXNzIDEgLSBpbnRlcnNlY3Rpb24gY2xhc3MgMCBhbmQgMVxuICAgICAgICBpZiAoczAgPj0gYzAgJiYgczEgPD0gYzEgJiYgczIgPj0gYzIpIHtcbiAgICAgICAgICAgIC8vY2VudHJhbCBjbGFzc1xuICAgICAgICAgICAgaWYgKGNjICE9IHVuZGVmaW5lZCAmJiBzMSA+IGNjICogYzEpIHJldHVybiAnY2VudGVyJ1xuICAgICAgICAgICAgaWYgKHdpdGhNaXhlZENsYXNzZXMpIHJldHVybiAnbTAyJ1xuICAgICAgICAgICAgcmV0dXJuIHMwID4gczIgPyAnMCcgOiAnMidcbiAgICAgICAgfVxuICAgICAgICAvL21pZGRsZSBjbGFzcyAyIC0gaW50ZXJzZWN0aW9uIGNsYXNzIDAgYW5kIDFcbiAgICAgICAgaWYgKHMwID49IGMwICYmIHMxID49IGMxICYmIHMyIDw9IGMyKSB7XG4gICAgICAgICAgICAvL2NlbnRyYWwgY2xhc3NcbiAgICAgICAgICAgIGlmIChjYyAhPSB1bmRlZmluZWQgJiYgczIgPiBjYyAqIGMyKSByZXR1cm4gJ2NlbnRlcidcbiAgICAgICAgICAgIGlmICh3aXRoTWl4ZWRDbGFzc2VzKSByZXR1cm4gJ20wMSdcbiAgICAgICAgICAgIHJldHVybiBzMSA+IHMwID8gJzEnIDogJzAnXG4gICAgICAgIH1cbiAgICAgICAgLy9zaG91bGQgbm90IGhhcHBlblxuICAgICAgICByZXR1cm4gJ3Vua25vd24nXG4gICAgfVxuXG4gICAgLy9hdHRhY2ggaW5mb3JtYXRpb24gdG8gb3V0cHV0IGZ1bmN0aW9uXG4gICAgZnVuLmNlbnRlciA9IFtjMCwgYzEsIGMyXVxuICAgIGZ1bi5jZW50ZXJDb2VmZmljaWVudCA9IG9wdHMuY2VudGVyQ29lZmZpY2llbnRcblxuICAgIHJldHVybiBmdW5cbn1cblxuZXhwb3J0IGNvbnN0IHRlcm5hcnlDb2xvckNsYXNzaWZpZXIgPSAocHJvcGVydGllcywgdG90YWxGdW5jdGlvbiwgY29sb3JzLCBvcHRzID0ge30pID0+IHtcbiAgICAvL3RoZSB0aHJlZSBjb2xvcnNcbiAgICBjb25zdCBbY29sb3IwLCBjb2xvcjEsIGNvbG9yMl0gPSBjb2xvcnMgfHwgWydyZWQnLCAnZ3JlZW4nLCAnYmx1ZSddXG5cbiAgICAvL3RoZSBjb2xvciBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uXG4gICAgY29uc3QgY29sb3JJbnRlcnBvbGF0aW9uID0gb3B0cy5jb2xvckludGVycG9sYXRpb24gfHwgaW50ZXJwb2xhdGVMYWJcblxuICAgIC8vcGFyYW1ldGVyIHRvIGRlY2lkZSB3ZXRoZXIgdG8gdXNlIG1peGVkIGNsYXNzZXMuXG4gICAgY29uc3Qgd2l0aE1peGVkQ2xhc3NlcyA9IG9wdHMud2l0aE1peGVkQ2xhc3NlcyAhPSB1bmRlZmluZWQgPyBvcHRzLndpdGhNaXhlZENsYXNzZXMgOiB0cnVlXG4gICAgLy9odHRwczovL2QzanMub3JnL2QzLWludGVycG9sYXRlL2NvbG9yXG4gICAgY29uc3QgbWl4Q29sb3JGdW5jdGlvbiA9IChjb2xvcjEsIGNvbG9yMikgPT4gY29sb3JJbnRlcnBvbGF0aW9uKGNvbG9yMSwgY29sb3IyKSgwLjUpXG4gICAgLy90aGUgY29sb3JzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1peGVkIGNsYXNzZXNcbiAgICBjb25zdCBbbWl4Q29sb3IwLCBtaXhDb2xvcjEsIG1peENvbG9yMl0gPVxuICAgICAgICBvcHRzLm1peGVkQ29sb3JzIHx8IHdpdGhNaXhlZENsYXNzZXNcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgbWl4Q29sb3JGdW5jdGlvbihjb2xvcjEsIGNvbG9yMiksXG4gICAgICAgICAgICAgICAgICBtaXhDb2xvckZ1bmN0aW9uKGNvbG9yMCwgY29sb3IyKSxcbiAgICAgICAgICAgICAgICAgIG1peENvbG9yRnVuY3Rpb24oY29sb3IwLCBjb2xvcjEpLFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICA6IFtdXG5cbiAgICAvL3RoZSBjZW50cmFsIGNvbG9yLCB1c2VkIGZvciB0aGUgY2VudHJhbCBjbGFzcywgaWYgYW55LiBUaGUgY2VudHJhbCBjbGFzcyBpcyB0aGUgY2xhc3Mgb2YgcmVsYXRpdmVseSBiYWxhbmNlZCB2YWx1ZXMsIGFyb3VuZCB0aGUgY2VudGVyIHBvaW50XG4gICAgY29uc3QgY2VudGVyQ29sb3IgPVxuICAgICAgICBvcHRzLmNlbnRlckNvbG9yIHx8IGNvbG9ySW50ZXJwb2xhdGlvbihtaXhDb2xvckZ1bmN0aW9uKGNvbG9yMCwgY29sb3IxKSwgY29sb3IyKSgwLjMzMylcblxuICAgIC8vbWFrZSBjbGFzc2lmaWVyXG4gICAgY29uc3QgY2xhc3NpZmllciA9IHRlcm5hcnlDbGFzc2lmaWVyKHByb3BlcnRpZXMsIHRvdGFsRnVuY3Rpb24sIG9wdHMpXG5cbiAgICAvL3RoZSBvdXRwdXQgY29sb3IgY2xhc3NpZmllciBtZXRob2RcbiAgICBjb25zdCBmdW4gPSAoYykgPT4ge1xuICAgICAgICBjb25zdCBjbGEgPSBjbGFzc2lmaWVyKGMpXG4gICAgICAgIGlmIChjbGEgPT0gJzAnKSByZXR1cm4gY29sb3IwXG4gICAgICAgIGlmIChjbGEgPT0gJzEnKSByZXR1cm4gY29sb3IxXG4gICAgICAgIGlmIChjbGEgPT0gJzInKSByZXR1cm4gY29sb3IyXG4gICAgICAgIGlmIChjbGEgPT0gJ20xMicpIHJldHVybiBtaXhDb2xvcjBcbiAgICAgICAgaWYgKGNsYSA9PSAnbTAyJykgcmV0dXJuIG1peENvbG9yMVxuICAgICAgICBpZiAoY2xhID09ICdtMDEnKSByZXR1cm4gbWl4Q29sb3IyXG4gICAgICAgIGlmIChjbGEgPT0gJ2NlbnRlcicpIHJldHVybiBjZW50ZXJDb2xvclxuICAgICAgICByZXR1cm4gb3B0cy5kZWZhdWx0Q29sb3IgfHwgJ2JsYWNrJ1xuICAgIH1cbiAgICBmdW4uY2VudGVyID0gY2xhc3NpZmllci5jZW50ZXJcbiAgICBmdW4uY2VudGVyQ29lZmZpY2llbnQgPSBvcHRzLmNlbnRlckNvZWZmaWNpZW50XG4gICAgZnVuLmNvbG9ycyA9IFtjb2xvcjAsIGNvbG9yMSwgY29sb3IyXVxuICAgIGZ1bi5taXhDb2xvcnMgPSBbbWl4Q29sb3IwLCBtaXhDb2xvcjEsIG1peENvbG9yMl1cbiAgICBmdW4uY2VudGVyQ29sb3IgPSBjZW50ZXJDb2xvclxuICAgIGZ1bi5jbGFzc2lmaWVyID0gY2xhc3NpZmllclxuXG4gICAgcmV0dXJuIGZ1blxufVxuXG5cblxuXG4vLyBPTEQgVkVSU0lPTlNcblxuLypcbmNvbnN0IG9yZGVyZWRJbmRleGVzRGVjID0gYXJyID0+IFsuLi5hcnIua2V5cygpXS5zb3J0KChhLCBiKSA9PiBhcnJbYl0gLSBhcnJbYV0pO1xuY29uc3Qgb3JkZXJlZEluZGV4ZXNJbmMgPSBhcnIgPT4gWy4uLmFyci5rZXlzKCldLnNvcnQoKGEsIGIpID0+IGFyclthXSAtIGFycltiXSk7XG5cbmV4cG9ydCBjb25zdCB0ZXJuYXJ5Q2xhc3NpZmllciA9IChwcm9wZXJ0aWVzLCB0b3RhbEZ1bmN0aW9uLCBvcHRzID0ge30pID0+IHtcbiAgICBjb25zdCBsb3dUaHJlc2hvbGQgPSBvcHRzLmxvd1RocmVzaG9sZCB8fCBbMSAvIDMsIDEgLyAzLCAxIC8gM11cbiAgICBjb25zdCBoaWdoVGhyZXNob2xkID0gb3B0cy5oaWdoVGhyZXNob2xkIHx8IFsyIC8gMywgMiAvIDMsIDIgLyAzXVxuICAgIGNvbnN0IGNvbG9ycyA9IG9wdHMuY29sb3JzIHx8IFtcInJlZFwiLCBcImdyZWVuXCIsIFwiYmx1ZVwiXVxuICAgIGNvbnN0IGNvbG9ySW50ZXJwb2xhdGlvbiA9IG9wdHMuY29sb3JJbnRlcnBvbGF0aW9uIHx8IGludGVycG9sYXRlTGFiXG5cbiAgICAvL2h0dHBzOi8vZDNqcy5vcmcvZDMtaW50ZXJwb2xhdGUvY29sb3JcbiAgICBjb25zdCBtaWRkbGVDb2xvckZ1bmN0aW9uID0gKGNvbG9yMSwgY29sb3IyKSA9PiBjb2xvckludGVycG9sYXRpb24oY29sb3IxLCBjb2xvcjIpKDAuNSlcbiAgICBjb25zdCBtaWRkbGVDb2xvcnMgPSBvcHRzLm1pZGRsZUNvbG9ycyB8fCBbbWlkZGxlQ29sb3JGdW5jdGlvbihjb2xvcnNbMV0sIGNvbG9yc1syXSksIG1pZGRsZUNvbG9yRnVuY3Rpb24oY29sb3JzWzBdLCBjb2xvcnNbMl0pLCBtaWRkbGVDb2xvckZ1bmN0aW9uKGNvbG9yc1swXSwgY29sb3JzWzFdKV1cbiAgICBjb25zdCBjZW50ZXJDb2xvciA9IG9wdHMuY2VudGVyQ29sb3IgfHwgY29sb3JJbnRlcnBvbGF0aW9uKG1pZGRsZUNvbG9yc1syXSwgY29sb3JzWzJdKSgwLjMzMylcblxuICAgIGNvbnN0IGhpZ2hfID0gb3JkZXJlZEluZGV4ZXNEZWMoaGlnaFRocmVzaG9sZClcbiAgICBjb25zdCBsb3dfID0gb3JkZXJlZEluZGV4ZXNJbmMobG93VGhyZXNob2xkKVxuXG4gICAgY29uc3QgcDAgPSBwcm9wZXJ0aWVzWzBdLCBwMSA9IHByb3BlcnRpZXNbMV0sIHAyID0gcHJvcGVydGllc1syXVxuICAgIGNvbnN0IGZ1biA9IGMgPT4ge1xuICAgICAgICAvL2dldCB0b3RhbFxuICAgICAgICBjb25zdCB0b3QgPSB0b3RhbEZ1bmN0aW9uKGMpXG4gICAgICAgIGlmICghdG90KSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIC8vY29tcHV0ZSBzaGFyZXNcbiAgICAgICAgY29uc3Qgc2hhcmVzID0gWytjW3AwXSAvIHRvdCwgK2NbcDFdIC8gdG90LCArY1twMl0gLyB0b3RdXG4gICAgICAgIC8vcmV0dXJuIGNvbG9yc1xuICAgICAgICAvL3N0YXJ0IGZpcnN0IHdpdGggdGhlIGV4dHJlbWUgaGlnaCAodHJpYW5nbGVzKTogZnJvbSB0aGUgbGFyZ2VyIHZhbHVlIChzbWFsbCB0cmlhbmdsZSkgdG8gdGhlIGxvd2VyIHZhbHVlIChsYXJnZSB0cmlhbmdsZSlcbiAgICAgICAgZm9yIChsZXQgaSBvZiBoaWdoXykgaWYgKHNoYXJlc1tpXSA+IGhpZ2hUaHJlc2hvbGRbaV0pIHJldHVybiBjb2xvcnNbaV1cbiAgICAgICAgLy90aGVuIGRyYXcgdGhlIGV4dHJlbWUgbG93ICh0cmFwZXppdW1zKTogZnJvbSB0aGUgbG93ZXIgdmFsdWUgKHNtYWxsIHRyYXBleml1bXMpIHRvIHRoZSBsYXJnZXIgdmFsdWVzIChsYXJnZSB0cmFwZXppdW0pXG4gICAgICAgIGZvciAobGV0IGkgb2YgbG93XykgaWYgKHNoYXJlc1tpXSA8IGxvd1RocmVzaG9sZFtpXSkgcmV0dXJuIG1pZGRsZUNvbG9yc1tpXVxuICAgICAgICAvL2Vsc2UgY2VudHJhbCBjb2xvclxuICAgICAgICByZXR1cm4gY2VudGVyQ29sb3JcbiAgICB9XG4gICAgZnVuLmxvd1RocmVzaG9sZCA9IGxvd1RocmVzaG9sZFxuICAgIGZ1bi5oaWdoVGhyZXNob2xkID0gaGlnaFRocmVzaG9sZFxuICAgIGZ1bi5jb2xvcnMgPSBjb2xvcnNcbiAgICBmdW4ubWlkZGxlQ29sb3JzID0gbWlkZGxlQ29sb3JzXG4gICAgZnVuLmNlbnRlckNvbG9yID0gY2VudGVyQ29sb3JcbiAgICBmdW4ubG93SW5kZXggPSBsb3dfXG4gICAgZnVuLmhpZ2hJbmRleCA9IGhpZ2hfXG4gICAgcmV0dXJuIGZ1blxufVxuKi9cblxuLypcbmV4cG9ydCBjb25zdCB0ZXJuYXJ5Q2xhc3NpZmllcjMgPSAocHJvcGVydGllcywgdG90YWxGdW5jdGlvbiwgb3B0cyA9IHt9KSA9PiB7XG4gICAgY29uc3QgW2EwMSwgYTEyLCBhMjBdID0gb3B0cy50aHJlc2hvbGRzIHx8IFsxLzMsIDEvMywgMS8zXVxuICAgIGNvbnN0IFtjMCwgYzEsIGMyXSA9IG9wdHMuY29sb3JzIHx8IFtcInJlZFwiLCBcImdyZWVuXCIsIFwiYmx1ZVwiXVxuICAgIGNvbnN0IGNlbnRlckNvbG9yID0gb3B0cy5jZW50ZXJDb2xvciB8fCBcImdyYXlcIlxuXG4gICAgY29uc3QgZmZmID0gYSA9PiBhID09IDEgPyBJbmZpbml0eSA6IGEgLyAoMSAtIGEpXG4gICAgY29uc3QgYzAxID0gZmZmKGEwMSksIGMxMiA9IGZmZihhMTIpLCBjMjAgPSBmZmYoYTIwKVxuXG4gICAgY29uc3QgcDAgPSBwcm9wZXJ0aWVzWzBdLCBwMSA9IHByb3BlcnRpZXNbMV0sIHAyID0gcHJvcGVydGllc1syXVxuICAgIGNvbnN0IGZ1biA9IGMgPT4ge1xuICAgICAgICAvL2dldCB0b3RhbFxuICAgICAgICBjb25zdCB0b3QgPSB0b3RhbEZ1bmN0aW9uKGMpXG4gICAgICAgIGlmICghdG90KSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIC8vY29tcHV0ZSBzaGFyZXNcbiAgICAgICAgY29uc3QgW3MwLCBzMSwgczJdID0gWytjW3AwXSAvIHRvdCwgK2NbcDFdIC8gdG90LCArY1twMl0gLyB0b3RdXG4gICAgICAgIC8vcmV0dXJuIGNvbG9yc1xuICAgICAgICBpZiAoczAgKiBjMDEgPiBzMSAmJiBzMCA+IHMyICogYzIwKSByZXR1cm4gYzBcbiAgICAgICAgZWxzZSBpZiAoczEgPiBzMCAqIGMwMSAmJiBzMSAqIGMxMiA+IHMyKSByZXR1cm4gYzFcbiAgICAgICAgZWxzZSBpZiAoczIgKiBjMjAgPiBzMCAmJiBzMiA+IHMxICogYzEyKSByZXR1cm4gYzJcbiAgICAgICAgZWxzZSByZXR1cm4gY2VudGVyQ29sb3JcbiAgICB9XG4gICAgZnVuLmNvbG9ycyA9IFtjMCwgYzEsIGMyXVxuICAgIGZ1bi5jZW50ZXJDb2xvciA9IGNlbnRlckNvbG9yXG4gICAgcmV0dXJuIGZ1blxufVxuKi9cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBHZXQgdGhlIGNsYXNzIGlkIGZyb20gYSB2YWx1ZSBhbmQgY2xhc3MgYnJlYWsgdmFsdWVzXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHYgdGhlIHZhbHVlXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSBicmVha3MgdGhlIGJyZWFrc1xuICogQHJldHVybnMgVGhlIGNsYXNzIGlkLCBmcm9tIDAgdG8gYnJlYWtzLmxlbmd0aFxuICogQGRlcHJlY2F0ZWQgdXNlIGdldENsYXNzaWZpZXIgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENsYXNzKHYsIGJyZWFrcykge1xuICAgIGlmICghYnJlYWtzKSByZXR1cm5cbiAgICBpZiAoYnJlYWtzLmxlbmd0aCA9PSAwKSByZXR1cm4gMFxuICAgIGlmICh2IDw9IGJyZWFrc1swXSkgcmV0dXJuIDBcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGJyZWFrcy5sZW5ndGg7IGkrKykgaWYgKGJyZWFrc1tpIC0gMV0gPCB2ICYmIHYgPD0gYnJlYWtzW2ldKSByZXR1cm4gaVxuICAgIHJldHVybiBicmVha3MubGVuZ3RoXG59XG5cbi8vdGFrZSAnbmljZScgdmFsdWUgKHBvd2VyIG9mIHRlbiwgb3IgbXVsdGlwbGUpXG5leHBvcnQgZnVuY3Rpb24gbmljZSh2LCBtdWx0aXBsZXMgPSBbOCwgNiwgNSwgNCwgMi41LCAyXSkge1xuICAgIC8vY29tcHV0ZSBiaWdnZXIgcG93ZXIgb2YgdGVuIGJlbG93XG4gICAgY29uc3Qgdl8gPSBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihNYXRoLmxvZzEwKHYpKSlcbiAgICBmb3IgKGxldCBtdWx0aXBsZSBvZiBtdWx0aXBsZXMpIGlmICh2XyAqIG11bHRpcGxlIDw9IHYpIHJldHVybiB2XyAqIG11bHRpcGxlXG4gICAgcmV0dXJuIHZfXG59XG5cbi8qXG4vL25vIGxvbmdlciB1c2VkXG5leHBvcnQgZnVuY3Rpb24gbG9hZEltYWdlKHNyYykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkgeyByZXNvbHZlKGltZyk7IH07XG4gICAgICAgIGltZy5vbmVycm9yID0gZnVuY3Rpb24gKCkgeyByZWplY3QobmV3IEVycm9yKCdFcnJvciBsb2FkaW5nIGltYWdlJykpOyB9O1xuICAgICAgICBpbWcuc3JjID0gc3JjO1xuICAgIH0pO1xufVxuKi9cblxuLypcbmV4cG9ydCBsZXQgbW9uaXRvciA9IGZhbHNlXG5cbmxldCBwcmV2aW91c0RhdGVcbmV4cG9ydCBmdW5jdGlvbiBtb25pdG9yRHVyYXRpb24obWVzc2FnZSkge1xuICAgIGNvbnN0IG5vd0RhdGUgPSBEYXRlLm5vdygpXG5cbiAgICAvL2ZpcnN0IGNhbGxcbiAgICBpZiAoIXByZXZpb3VzRGF0ZSkge1xuICAgICAgICBwcmV2aW91c0RhdGUgPSBub3dEYXRlXG4gICAgICAgIGNvbnNvbGUubG9nKHByZXZpb3VzRGF0ZSwgbWVzc2FnZSlcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZCA9IG5vd0RhdGUgLSBwcmV2aW91c0RhdGVcbiAgICBwcmV2aW91c0RhdGUgPSBub3dEYXRlXG4gICAgY29uc29sZS5sb2coZCwgbWVzc2FnZSlcbn1cbiovXG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHdpZHRoXG4gKiBAcGFyYW0ge3N0cmluZ30gaGVpZ2h0XG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICogQHJldHVybnMge3tjYW52YXM6SFRNTENhbnZhc0VsZW1lbnQsIGdsOldlYkdMUmVuZGVyaW5nQ29udGV4dH19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlV2ViR0xDYW52YXMod2lkdGgsIGhlaWdodCwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcbiAgICBjYW52YXMuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHdpZHRoKVxuICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGhlaWdodClcbiAgICAvKiogQHR5cGUge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gKi9cbiAgICBjb25zdCBnbCA9IGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcsIG9wdHMpXG4gICAgaWYgKCFnbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBpbml0aWFsaXplIFdlYkdMLiBZb3VyIGJyb3dzZXIgb3IgbWFjaGluZSBtYXkgbm90IHN1cHBvcnQgaXQuJylcbiAgICB9XG4gICAgcmV0dXJuIHsgY2FudmFzOiBjYW52YXMsIGdsOiBnbCB9XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIHNoYWRlciBwcm9ncmFtLCBzbyBXZWJHTCBrbm93cyBob3cgdG8gZHJhdyBvdXIgZGF0YVxuICpcbiAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbFxuICogQHBhcmFtICB7Li4uV2ViR0xTaGFkZXJ9IHNoYWRlcnNcbiAqIEByZXR1cm5zIHtXZWJHTFByb2dyYW19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0U2hhZGVyUHJvZ3JhbShnbCwgLi4uc2hhZGVycykge1xuICAgIC8qKiBAdHlwZSB7V2ViR0xQcm9ncmFtfG51bGx9ICovXG4gICAgY29uc3QgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKVxuICAgIGlmIChwcm9ncmFtID09IG51bGwpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSB3ZWJHTCBwcm9ncmFtJylcbiAgICBmb3IgKGNvbnN0IHNoYWRlciBvZiBzaGFkZXJzKSBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgc2hhZGVyKVxuICAgIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pXG4gICAgaWYgKGdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMpKSByZXR1cm4gcHJvZ3JhbVxuICAgIHRocm93IG5ldyBFcnJvcihnbC5nZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtKSB8fCAnQ2Fubm90IGNyZWF0ZSB3ZWJHTCBwcm9ncmFtICgyKScpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNoYWRlciBvZiB0aGUgZ2l2ZW4gdHlwZSwgdXBsb2FkcyB0aGUgc291cmNlIGFuZCBjb21waWxlcyBpdC5cbiAqXG4gKiBAcGFyYW0ge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2xcbiAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlXG4gKiBAcGFyYW0gIHsuLi5zdHJpbmd9IHNvdXJjZXNcbiAqIEByZXR1cm5zIHtXZWJHTFNoYWRlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNoYWRlcihnbCwgdHlwZSwgLi4uc291cmNlcykge1xuICAgIC8qKiBAdHlwZSB7V2ViR0xTaGFkZXJ8bnVsbH0gKi9cbiAgICBjb25zdCBzaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIodHlwZSlcbiAgICBpZiAoc2hhZGVyID09IG51bGwpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSB3ZWJHTCBzaGFkZXInKVxuICAgIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsIHNvdXJjZXMuam9pbignXFxuJykpXG4gICAgZ2wuY29tcGlsZVNoYWRlcihzaGFkZXIpXG4gICAgaWYgKGdsLmdldFNoYWRlclBhcmFtZXRlcihzaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSkgcmV0dXJuIHNoYWRlclxuICAgIHRocm93IG5ldyBFcnJvcihnbC5nZXRTaGFkZXJJbmZvTG9nKHNoYWRlcikgfHwgJ0Nhbm5vdCBjcmVhdGUgd2ViR0wgc2hhZGVyICgyKScpXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgd2ViR0wgaXMgc3VwcG9ydGVkXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1dlYkdMU3VwcG9ydCgpIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxuICAgICAgICByZXR1cm4gISEoXG4gICAgICAgICAgICAhIXdpbmRvdy5XZWJHTFJlbmRlcmluZ0NvbnRleHQgJiZcbiAgICAgICAgICAgIChjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnKSB8fCBjYW52YXMuZ2V0Q29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJykpXG4gICAgICAgIClcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxufVxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8vIHRoZSBhcHBsaWNhdGlvblxuZXhwb3J0IHsgTWFwIH0gZnJvbSAnLi9jb3JlL01hcC5qcydcbmV4cG9ydCB7IEdlb0NhbnZhcyB9IGZyb20gJy4vY29yZS9HZW9DYW52YXMuanMnXG5leHBvcnQgeyBTdHlsZSB9IGZyb20gJy4vY29yZS9TdHlsZS5qcydcbmV4cG9ydCB7IExheWVyIH0gZnJvbSAnLi9jb3JlL0xheWVyLmpzJ1xuZXhwb3J0IHsgRGF0YXNldCB9IGZyb20gJy4vY29yZS9EYXRhc2V0LmpzJ1xuZXhwb3J0IHsgTXVsdGlSZXNvbHV0aW9uRGF0YXNldCB9IGZyb20gJy4vY29yZS9NdWx0aVJlc29sdXRpb25EYXRhc2V0LmpzJ1xuXG4vLyBleHBvcnQgZGF0YXNldCB0eXBlc1xuZXhwb3J0IHsgVGlsZWRHcmlkIH0gZnJvbSAnLi9kYXRhc2V0L1RpbGVkR3JpZC5qcydcbmV4cG9ydCB7IENTVkdyaWQgfSBmcm9tICcuL2RhdGFzZXQvQ1NWR3JpZC5qcydcbmV4cG9ydCB7IEpTR3JpZCB9IGZyb20gJy4vZGF0YXNldC9KU0dyaWQuanMnXG5cbi8vIGV4cG9ydCBzdHlsZXNcbmV4cG9ydCB7IFNoYXBlQ29sb3JTaXplU3R5bGUgfSBmcm9tICcuL3N0eWxlL1NoYXBlQ29sb3JTaXplU3R5bGUuanMnXG5leHBvcnQgeyBTdHJva2VTdHlsZSB9IGZyb20gJy4vc3R5bGUvU3Ryb2tlU3R5bGUuanMnXG5leHBvcnQgeyBKb3lQbG90U3R5bGUgfSBmcm9tICcuL3N0eWxlL0pveVBsb3RTdHlsZS5qcydcbmV4cG9ydCB7IENvbXBvc2l0aW9uU3R5bGUgfSBmcm9tICcuL3N0eWxlL0NvbXBvc2l0aW9uU3R5bGUuanMnXG5leHBvcnQgeyBTZWdtZW50U3R5bGUgfSBmcm9tICcuL3N0eWxlL1NlZ21lbnRTdHlsZS5qcydcbmV4cG9ydCB7IFRleHRTdHlsZSB9IGZyb20gJy4vc3R5bGUvVGV4dFN0eWxlLmpzJ1xuZXhwb3J0IHsgUGlsbGFyU3R5bGUgfSBmcm9tICcuL3N0eWxlL1BpbGxhclN0eWxlLmpzJ1xuZXhwb3J0IHsgU2lkZVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TaWRlU3R5bGUuanMnXG4vL2V4cG9ydCB7IENvbnRvdXJTdHlsZSB9IGZyb20gJy4vc3R5bGUvQ29udG91clN0eWxlLmpzJ1xuZXhwb3J0IHsgU2lkZUNhdGVnb3J5U3R5bGUgfSBmcm9tICcuL3N0eWxlL1NpZGVDYXRlZ29yeVN0eWxlLmpzJ1xuZXhwb3J0IHsgRG90RGVuc2l0eVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9Eb3REZW5zaXR5U3R5bGUuanMnXG5leHBvcnQgeyBUYW5ha2FTdHlsZSB9IGZyb20gJy4vc3R5bGUvVGFuYWthU3R5bGUuanMnXG5leHBvcnQgeyBMZWdvU3R5bGUgfSBmcm9tICcuL3N0eWxlL0xlZ29TdHlsZS5qcydcbmV4cG9ydCB7IFNxdWFyZUNvbG9yV2ViR0xTdHlsZSB9IGZyb20gJy4vc3R5bGUvU3F1YXJlQ29sb3JXZWJHTFN0eWxlLmpzJ1xuZXhwb3J0IHsgU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUgfSBmcm9tICcuL3N0eWxlL1NxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlLmpzJ1xuZXhwb3J0IHsgTW9zYWljU3R5bGUgfSBmcm9tICcuL3N0eWxlL01vc2FpY1N0eWxlLmpzJ1xuZXhwb3J0IHsgTmluamFTdGFyU3R5bGUgfSBmcm9tICcuL3N0eWxlL05pbmphU3RhclN0eWxlLmpzJ1xuZXhwb3J0IHsgVGltZVNlcmllc1N0eWxlIH0gZnJvbSAnLi9zdHlsZS9UaW1lU2VyaWVzU3R5bGUuanMnXG5leHBvcnQgeyBJc29GZW5jZVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9Jc29GZW5jZVN0eWxlLmpzJ1xuZXhwb3J0IHsgSW1hZ2VTdHlsZSB9IGZyb20gJy4vc3R5bGUvSW1hZ2VTdHlsZS5qcydcblxuLy8gZXhwb3J0IGFkZGl0aW9uYWwgbGF5ZXJzXG5leHBvcnQgeyBHcmlkTGF5ZXIgfSBmcm9tICcuL2xheWVyL0dyaWRMYXllci5qcydcbmV4cG9ydCB7IEJhY2tncm91bmRMYXllciB9IGZyb20gJy4vbGF5ZXIvQmFja2dyb3VuZExheWVyLmpzJ1xuZXhwb3J0IHsgQmFja2dyb3VuZExheWVyV01TIH0gZnJvbSAnLi9sYXllci9CYWNrZ3JvdW5kTGF5ZXJXTVMuanMnXG5leHBvcnQgeyBCYWNrZ3JvdW5kTGF5ZXJJbWFnZSB9IGZyb20gJy4vbGF5ZXIvQmFja2dyb3VuZExheWVySW1hZ2UuanMnXG5leHBvcnQgeyBMYWJlbExheWVyIH0gZnJvbSAnLi9sYXllci9MYWJlbExheWVyLmpzJ1xuZXhwb3J0IHsgR2VvSlNPTkxheWVyIH0gZnJvbSAnLi9sYXllci9HZW9KU09OTGF5ZXIuanMnXG5cbi8vIGV4cG9ydCBsZWdlbmRzXG5leHBvcnQgeyBDb2xvckxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL0NvbG9yTGVnZW5kLmpzJ1xuZXhwb3J0IHsgQ29sb3JEaXNjcmV0ZUxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL0NvbG9yRGlzY3JldGVMZWdlbmQuanMnXG5leHBvcnQgeyBDb2xvckNhdGVnb3J5TGVnZW5kIH0gZnJvbSAnLi9sZWdlbmQvQ29sb3JDYXRlZ29yeUxlZ2VuZC5qcydcbmV4cG9ydCB7XG4gICAgU2l6ZUxlZ2VuZCxcbiAgICBzaXplTGVnZW5kLFxuICAgIHNpemVMZWdlbmRWaWV3U2NhbGUsXG4gICAgc2l6ZURpc2NyZXRlTGVnZW5kLFxuICAgIHNpemVEaXNjcmV0ZVZpZXdTY2FsZUxlZ2VuZCxcbn0gZnJvbSAnLi9sZWdlbmQvU2l6ZUxlZ2VuZC5qcydcbmV4cG9ydCB7IE9yaWVudGF0aW9uTGVnZW5kLCBvcmllbnRhdGlvbkxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL09yaWVudGF0aW9uTGVnZW5kLmpzJ1xuZXhwb3J0IHsgVGVybmFyeUxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL1Rlcm5hcnlMZWdlbmQuanMnXG5cbi8vIGV4cG9ydCB7IGdvVG9TdHJhaWdodCwgem9vbVRvIH0gZnJvbSBcIi4vdXRpbHMvem9vbVV0aWxzXCJcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvc3RyZXRjaGluZy5qcydcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvc2NhbGUuanMnXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL3Rlcm5hcnkuanMnXG5leHBvcnQgeyBuaWNlIH0gZnJvbSAnLi91dGlscy91dGlscy5qcydcblxuaW1wb3J0IHsgR2VvQ2FudmFzIH0gZnJvbSAnLi9jb3JlL0dlb0NhbnZhcy5qcydcbmV4cG9ydCBjb25zdCBnZXRQYXJhbWV0ZXJCeU5hbWUgPSBHZW9DYW52YXMuZ2V0UGFyYW1ldGVyQnlOYW1lXG5cbi8vIHNldCBkZWZhdWx0IGQzIGxvY2FsZVxuaW1wb3J0IHsgZm9ybWF0RGVmYXVsdExvY2FsZSB9IGZyb20gJ2QzLWZvcm1hdCdcbmZvcm1hdERlZmF1bHRMb2NhbGUoe1xuICAgIGRlY2ltYWw6ICcuJyxcbiAgICB0aG91c2FuZHM6ICcgJyxcbiAgICBncm91cGluZzogWzNdLFxuICAgIGN1cnJlbmN5OiBbJycsICfigqwnXSxcbn0pXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=