@clockworkdog/cogs-client 1.5.2 → 1.5.3

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.
@@ -134,12 +134,13 @@ class AudioPlayer {
134
134
  // Once clip starts, check if it should actually be paused or stopped
135
135
  // If not, then update state to 'playing'
136
136
  clipPlayer.player.once('play', () => {
137
- const clipState = clipPlayer.activeClips[soundId].state;
138
- if (clipState.type === 'pause_requested') {
137
+ var _a;
138
+ const clipState = (_a = clipPlayer.activeClips[soundId]) === null || _a === void 0 ? void 0 : _a.state;
139
+ if ((clipState === null || clipState === void 0 ? void 0 : clipState.type) === 'pause_requested') {
139
140
  log('Clip started playing but should be paused', { path, soundId });
140
141
  this.pauseAudioClip(path, { fade: clipState.fade }, soundId, true);
141
142
  }
142
- else if (clipState.type === 'stop_requested') {
143
+ else if ((clipState === null || clipState === void 0 ? void 0 : clipState.type) === 'stop_requested') {
143
144
  log('Clip started playing but should be stopped', { path, soundId });
144
145
  this.stopAudioClip(path, { fade: clipState.fade }, soundId, true);
145
146
  }
@@ -7289,4 +7290,4 @@ module.exports = ReconnectingWebSocket;
7289
7290
  },{}]},{},[6])(6)
7290
7291
  });
7291
7292
 
7292
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJkaXN0L0F1ZGlvUGxheWVyLmpzIiwiZGlzdC9Db2dzQ29ubmVjdGlvbi5qcyIsImRpc3QvUnRzcFN0cmVhbWVyLmpzIiwiZGlzdC9WaWRlb1BsYXllci5qcyIsImRpc3QvaGVscGVycy91cmxzLmpzIiwiZGlzdC9pbmRleC5qcyIsImRpc3QvdHlwZXMvQXVkaW9TdGF0ZS5qcyIsImRpc3QvdHlwZXMvVmlkZW9TdGF0ZS5qcyIsImRpc3QvdHlwZXMvdmFsdWVUeXBlcy5qcyIsIm5vZGVfbW9kdWxlcy9AY2xvY2t3b3JrZG9nL21lZGlhLXN0cmVhbS1saWJyYXJ5LWJyb3dzZXIvZGlzdC9pbmRleC5janMuanMiLCJub2RlX21vZHVsZXMvYmFzZTY0LWpzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9ob3dsZXIvZGlzdC9ob3dsZXIuanMiLCJub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvcmVjb25uZWN0aW5nLXdlYnNvY2tldC9kaXN0L3JlY29ubmVjdGluZy13ZWJzb2NrZXQtY2pzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzliQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDanZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3pwR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgaG93bGVyXzEgPSByZXF1aXJlKFwiaG93bGVyXCIpO1xuY29uc3QgdXJsc18xID0gcmVxdWlyZShcIi4vaGVscGVycy91cmxzXCIpO1xuY29uc3QgREVCVUcgPSB0cnVlO1xuLy8gQ2hlY2sgYW4gaU9TLW9ubHkgcHJvcGVydHkgKFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTmF2aWdhdG9yI25vbi1zdGFuZGFyZF9wcm9wZXJ0aWVzKVxuY29uc3QgSVNfSU9TID0gdHlwZW9mIG5hdmlnYXRvci5zdGFuZGFsb25lICE9PSAndW5kZWZpbmVkJztcbmNsYXNzIEF1ZGlvUGxheWVyIHtcbiAgICBjb25zdHJ1Y3Rvcihjb2dzQ29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0ID0gbmV3IEV2ZW50VGFyZ2V0KCk7XG4gICAgICAgIHRoaXMuZ2xvYmFsVm9sdW1lID0gMTtcbiAgICAgICAgdGhpcy5hdWRpb0NsaXBQbGF5ZXJzID0ge307XG4gICAgICAgIHRoaXMuc2lua0lkID0gJyc7XG4gICAgICAgIC8vIFNlbmQgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGVhY2ggY2xpcCB0byBDT0dTXG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignYXVkaW9DbGlwU3RhdGUnLCAoeyBkZXRhaWwgfSkgPT4ge1xuICAgICAgICAgICAgY29nc0Nvbm5lY3Rpb24uc2VuZE1lZGlhQ2xpcFN0YXRlKGRldGFpbCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBMaXN0ZW4gZm9yIGF1ZGlvIGNvbnRyb2wgbWVzc2FnZXNcbiAgICAgICAgY29nc0Nvbm5lY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRldGFpbDtcbiAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbWVkaWFfY29uZmlnX3VwZGF0ZSc6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmdsb2JhbFZvbHVtZSAhPT0gbWVzc2FnZS5nbG9iYWxWb2x1bWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0R2xvYmFsVm9sdW1lKG1lc3NhZ2UuZ2xvYmFsVm9sdW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5hdWRpb091dHB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaW5rSWQgPSBjb2dzQ29ubmVjdGlvbi5nZXRBdWRpb1NpbmtJZChtZXNzYWdlLmF1ZGlvT3V0cHV0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXVkaW9TaW5rKHNpbmtJZCAhPT0gbnVsbCAmJiBzaW5rSWQgIT09IHZvaWQgMCA/IHNpbmtJZCA6ICcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbmZpZyhtZXNzYWdlLmZpbGVzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnYXVkaW9fcGxheSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxheUF1ZGlvQ2xpcChtZXNzYWdlLmZpbGUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlJZDogbWVzc2FnZS5wbGF5SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWU6IG1lc3NhZ2Uudm9sdW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcDogQm9vbGVhbihtZXNzYWdlLmxvb3ApLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmFkZTogbWVzc2FnZS5mYWRlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnYXVkaW9fcGF1c2UnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdXNlQXVkaW9DbGlwKG1lc3NhZ2UuZmlsZSwgeyBmYWRlOiBtZXNzYWdlLmZhZGUgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2F1ZGlvX3N0b3AnOlxuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5maWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BBdWRpb0NsaXAobWVzc2FnZS5maWxlLCB7IGZhZGU6IG1lc3NhZ2UuZmFkZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcEFsbEF1ZGlvQ2xpcHMoeyBmYWRlOiBtZXNzYWdlLmZhZGUgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnYXVkaW9fc2V0X2NsaXBfdm9sdW1lJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdWRpb0NsaXBWb2x1bWUobWVzc2FnZS5maWxlLCB7IHZvbHVtZTogbWVzc2FnZS52b2x1bWUsIGZhZGU6IG1lc3NhZ2UuZmFkZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBPbiBjb25uZWN0aW9uLCBzZW5kIHRoZSBjdXJyZW50IHBsYXlpbmcgc3RhdGUgb2YgYWxsIGNsaXBzXG4gICAgICAgIC8vIChVc3VhbGx5IGVtcHR5IHVubGVzcyB3ZWJzb2NrZXQgaXMgcmVjb25uZWN0aW5nKVxuICAgICAgICBjb25zdCBzZW5kSW5pdGlhbENsaXBTdGF0ZXMgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWxlcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuYXVkaW9DbGlwUGxheWVycykubWFwKChbZmlsZSwgcGxheWVyXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUNsaXBzID0gT2JqZWN0LnZhbHVlcyhwbGF5ZXIuYWN0aXZlQ2xpcHMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGFjdGl2ZUNsaXBzLnNvbWUoKHsgc3RhdGUgfSkgPT4gc3RhdGUudHlwZSA9PT0gJ3BsYXlpbmcnIHx8XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnR5cGUgPT09ICdwYXVzaW5nJyB8fFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS50eXBlID09PSAnc3RvcHBpbmcnIHx8XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnR5cGUgPT09ICdwbGF5X3JlcXVlc3RlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUudHlwZSA9PT0gJ3BhdXNlX3JlcXVlc3RlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUudHlwZSA9PT0gJ3N0b3BfcmVxdWVzdGVkJylcbiAgICAgICAgICAgICAgICAgICAgPyAncGxheWluZydcbiAgICAgICAgICAgICAgICAgICAgOiBhY3RpdmVDbGlwcy5zb21lKCh7IHN0YXRlIH0pID0+IHN0YXRlLnR5cGUgPT09ICdwYXVzZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAncGF1c2VkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnc3RvcHBlZCc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtmaWxlLCBzdGF0dXNdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb2dzQ29ubmVjdGlvbi5zZW5kSW5pdGlhbE1lZGlhQ2xpcFN0YXRlcyh7IG1lZGlhVHlwZTogJ2F1ZGlvJywgZmlsZXMgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvZ3NDb25uZWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCBzZW5kSW5pdGlhbENsaXBTdGF0ZXMpO1xuICAgICAgICBzZW5kSW5pdGlhbENsaXBTdGF0ZXMoKTtcbiAgICB9XG4gICAgc2V0R2xvYmFsVm9sdW1lKHZvbHVtZSkge1xuICAgICAgICB0aGlzLmdsb2JhbFZvbHVtZSA9IHZvbHVtZTtcbiAgICAgICAgaG93bGVyXzEuSG93bGVyLnZvbHVtZSh2b2x1bWUpO1xuICAgICAgICB0aGlzLm5vdGlmeVN0YXRlTGlzdGVuZXJzKCk7XG4gICAgfVxuICAgIHBsYXlBdWRpb0NsaXAocGF0aCwgeyBwbGF5SWQsIHZvbHVtZSwgZmFkZSwgbG9vcCB9KSB7XG4gICAgICAgIGxvZygnUGxheWluZyBjbGlwJywgeyBwYXRoIH0pO1xuICAgICAgICBpZiAoIShwYXRoIGluIHRoaXMuYXVkaW9DbGlwUGxheWVycykpIHtcbiAgICAgICAgICAgIGxvZygnQ3JlYXRpbmcgZXBoZW1lcmFsIGNsaXAnLCB7IHBhdGggfSk7XG4gICAgICAgICAgICB0aGlzLmF1ZGlvQ2xpcFBsYXllcnNbcGF0aF0gPSB0aGlzLmNyZWF0ZUNsaXAocGF0aCwgeyBwcmVsb2FkOiBmYWxzZSwgZXBoZW1lcmFsOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlQXVkaW9DbGlwUGxheWVyKHBhdGgsIChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICAvLyBQYXVzZWQgY2xpcHMgbmVlZCB0byBiZSBwbGF5ZWQgYWdhaW5cbiAgICAgICAgICAgIGNvbnN0IHBhdXNlZFNvdW5kSWRzID0gT2JqZWN0LmVudHJpZXMoY2xpcFBsYXllci5hY3RpdmVDbGlwcylcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChbLCB7IHN0YXRlIH1dKSA9PiBzdGF0ZS50eXBlID09PSAncGF1c2VkJyB8fCBzdGF0ZS50eXBlID09PSAncGF1c2luZycpXG4gICAgICAgICAgICAgICAgLm1hcCgoW2lkXSkgPT4gcGFyc2VJbnQoaWQpKTtcbiAgICAgICAgICAgIHBhdXNlZFNvdW5kSWRzLmZvckVhY2goKHNvdW5kSWQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2coJ1Jlc3VtaW5nIHBhdXNlZCBjbGlwJywgeyBzb3VuZElkIH0pO1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLnBsYXkoc291bmRJZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIENsaXBzIHdpdGggcGF1c2UgcmVxdWVzdGVkIG5vIGxvbmdlciBuZWVkIHRvIHBhdXNlLCB0aGV5IGNhbiBjb250aW51ZSBwbGF5aW5nIG5vd1xuICAgICAgICAgICAgY29uc3QgcGF1c2VSZXF1ZXN0ZWRTb3VuZElkcyA9IE9iamVjdC5lbnRyaWVzKGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHMpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoWywgeyBzdGF0ZSB9XSkgPT4gc3RhdGUudHlwZSA9PT0gJ3BhdXNlX3JlcXVlc3RlZCcpXG4gICAgICAgICAgICAgICAgLm1hcCgoW2lkXSkgPT4gcGFyc2VJbnQoaWQpKTtcbiAgICAgICAgICAgIC8vIElmIG5vIGN1cnJlbnRseSBwYXVzZWQvcGF1c2luZy9wYXVzZV9yZXF1ZXN0ZWQgY2xpcHMsIHBsYXkgYSBuZXcgY2xpcFxuICAgICAgICAgICAgY29uc3QgbmV3U291bmRJZHMgPSBwYXVzZWRTb3VuZElkcy5sZW5ndGggPiAwIHx8IHBhdXNlUmVxdWVzdGVkU291bmRJZHMubGVuZ3RoID4gMCA/IFtdIDogW2NsaXBQbGF5ZXIucGxheWVyLnBsYXkoKV07XG4gICAgICAgICAgICAvLyBwYXVzZWQgYW5kIHBhdXNlX3JlcXVlc3RlZCBjbGlwcyB0cmVhdGVkIHRoZSBzYW1lLCB0aGV5IHNob3VsZCBoYXZlIHRoZWlyIHByb3BlcnRpZXNcbiAgICAgICAgICAgIC8vIHVwZGF0ZWQgd2l0aCB0aGUgbGF0ZXN0IHBsYXkgYWN0aW9uJ3MgcHJvcGVydGllc1xuICAgICAgICAgICAgWy4uLnBhdXNlZFNvdW5kSWRzLCAuLi5wYXVzZVJlcXVlc3RlZFNvdW5kSWRzLCAuLi5uZXdTb3VuZElkc10uZm9yRWFjaCgoc291bmRJZCkgPT4ge1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLmxvb3AobG9vcCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgLy8gQ2xlYW51cCBhbnkgb2xkIGNhbGxiYWNrcyBmaXJzdFxuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm9mZigncGxheScsIHVuZGVmaW5lZCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub2ZmKCdwYXVzZScsIHVuZGVmaW5lZCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub2ZmKCdmYWRlJywgdW5kZWZpbmVkLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vZmYoJ2VuZCcsIHVuZGVmaW5lZCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub2ZmKCdzdG9wJywgdW5kZWZpbmVkLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAvLyBOb24tcHJlbG9hZGVkIGNsaXBzIGRvbid0IHlldCBoYXZlIGFuIEhUTUwgYXVkaW8gbm9kZVxuICAgICAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gc2V0IHRoZSBhdWRpbyBvdXRwdXQgd2hlbiBpdCdzIHBsYXlpbmdcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vbmNlKCdwbGF5JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZXRQbGF5ZXJTaW5rSWQoY2xpcFBsYXllci5wbGF5ZXIsIHRoaXMuc2lua0lkKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vbmNlKCdzdG9wJywgKCkgPT4gdGhpcy5oYW5kbGVTdG9wcGVkQ2xpcChwYXRoLCBwbGF5SWQsIHNvdW5kSWQpLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAvLyBMb29waW5nIGNsaXBzIGZpcmUgdGhlICdlbmQnIGNhbGxiYWNrIG9uIGV2ZXJ5IGxvb3BcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKChfYSA9IGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHNbc291bmRJZF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sb29wKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdG9wcGVkQ2xpcChwYXRoLCBwbGF5SWQsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlQ2xpcCA9IHtcbiAgICAgICAgICAgICAgICAgICAgcGxheUlkLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogeyB0eXBlOiAncGxheV9yZXF1ZXN0ZWQnIH0sXG4gICAgICAgICAgICAgICAgICAgIGxvb3AsXG4gICAgICAgICAgICAgICAgICAgIHZvbHVtZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIC8vIE9uY2UgY2xpcCBzdGFydHMsIGNoZWNrIGlmIGl0IHNob3VsZCBhY3R1YWxseSBiZSBwYXVzZWQgb3Igc3RvcHBlZFxuICAgICAgICAgICAgICAgIC8vIElmIG5vdCwgdGhlbiB1cGRhdGUgc3RhdGUgdG8gJ3BsYXlpbmcnXG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub25jZSgncGxheScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xpcFN0YXRlID0gY2xpcFBsYXllci5hY3RpdmVDbGlwc1tzb3VuZElkXS5zdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXBTdGF0ZS50eXBlID09PSAncGF1c2VfcmVxdWVzdGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdDbGlwIHN0YXJ0ZWQgcGxheWluZyBidXQgc2hvdWxkIGJlIHBhdXNlZCcsIHsgcGF0aCwgc291bmRJZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGF1c2VBdWRpb0NsaXAocGF0aCwgeyBmYWRlOiBjbGlwU3RhdGUuZmFkZSB9LCBzb3VuZElkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjbGlwU3RhdGUudHlwZSA9PT0gJ3N0b3BfcmVxdWVzdGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdDbGlwIHN0YXJ0ZWQgcGxheWluZyBidXQgc2hvdWxkIGJlIHN0b3BwZWQnLCB7IHBhdGgsIHNvdW5kSWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BBdWRpb0NsaXAocGF0aCwgeyBmYWRlOiBjbGlwU3RhdGUuZmFkZSB9LCBzb3VuZElkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aXZlQXVkaW9DbGlwKHBhdGgsIHNvdW5kSWQsIChjbGlwKSA9PiAoeyAuLi5jbGlwLCBzdGF0ZTogeyB0eXBlOiAncGxheWluZycgfSB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAvLyBUbyBmYWRlIG9yIHRvIG5vIGZhZGU/XG4gICAgICAgICAgICAgICAgaWYgKGlzRmFkZVZhbGlkKGZhZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGZhZGUgd2hlbiBjbGlwIHN0YXJ0c1xuICAgICAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci52b2x1bWUoMCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm11dGUoZmFsc2UsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vbmNlKCdwbGF5JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmFkZUF1ZGlvUGxheWVyVm9sdW1lKGNsaXBQbGF5ZXIucGxheWVyLCB2b2x1bWUsIGZhZGUgKiAxMDAwLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZXRBdWRpb1BsYXllclZvbHVtZShjbGlwUGxheWVyLnBsYXllciwgdm9sdW1lLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVHJhY2sgbmV3L3VwZGF0ZWQgYWN0aXZlIGNsaXBcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLmFjdGl2ZUNsaXBzID0geyAuLi5jbGlwUGxheWVyLmFjdGl2ZUNsaXBzLCBbc291bmRJZF06IGFjdGl2ZUNsaXAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXI7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm5vdGlmeUNsaXBTdGF0ZUxpc3RlbmVycyhwbGF5SWQsIHBhdGgsICdwbGF5aW5nJyk7XG4gICAgfVxuICAgIHBhdXNlQXVkaW9DbGlwKHBhdGgsIHsgZmFkZSB9LCBvbmx5U291bmRJZCwgYWxsb3dJZlBhdXNlUmVxdWVzdGVkKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIC8vIE5vIGFjdGl2ZSBjbGlwcyB0byBwYXVzZVxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoKF9iID0gKF9hID0gdGhpcy5hdWRpb0NsaXBQbGF5ZXJzW3BhdGhdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWN0aXZlQ2xpcHMpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHt9KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUF1ZGlvQ2xpcFBsYXllcihwYXRoLCAoY2xpcFBsYXllcikgPT4ge1xuICAgICAgICAgICAgY2xpcFBsYXllci5hY3RpdmVDbGlwcyA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhjbGlwUGxheWVyLmFjdGl2ZUNsaXBzKS5tYXAoKFtzb3VuZElkU3RyLCBjbGlwXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdW5kSWQgPSBwYXJzZUludChzb3VuZElkU3RyKTtcbiAgICAgICAgICAgICAgICAvLyBJZiBvbmx5U291bmRJZCBzcGVjaWZpZWQsIG9ubHkgdXBkYXRlIHRoYXQgY2xpcFxuICAgICAgICAgICAgICAgIGlmIChvbmx5U291bmRJZCA9PT0gdW5kZWZpbmVkIHx8IG9ubHlTb3VuZElkID09PSBzb3VuZElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoYWxsb3dJZlBhdXNlUmVxdWVzdGVkICYmIGNsaXAuc3RhdGUudHlwZSA9PT0gJ3BhdXNlX3JlcXVlc3RlZCcpIHx8IGNsaXAuc3RhdGUudHlwZSA9PT0gJ3BsYXlpbmcnIHx8IGNsaXAuc3RhdGUudHlwZSA9PT0gJ3BhdXNpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNGYWRlVmFsaWQoZmFkZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWRlIHRoZW4gcGF1c2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vbmNlKCdmYWRlJywgKHNvdW5kSWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIucGF1c2Uoc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aXZlQXVkaW9DbGlwKHBhdGgsIHNvdW5kSWQsIChjbGlwKSA9PiAoeyAuLi5jbGlwLCBzdGF0ZTogeyB0eXBlOiAncGF1c2VkJyB9IH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnMoY2xpcC5wbGF5SWQsIHBhdGgsICdwYXVzZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWRlQXVkaW9QbGF5ZXJWb2x1bWUoY2xpcFBsYXllci5wbGF5ZXIsIDAsIGZhZGUgKiAxMDAwLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwLnN0YXRlID0geyB0eXBlOiAncGF1c2luZycgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhdXNlIG5vd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLnBhdXNlKHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAuc3RhdGUgPSB7IHR5cGU6ICdwYXVzZWQnIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnMoY2xpcC5wbGF5SWQsIHBhdGgsICdwYXVzZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBDbGlwIGhhc24ndCBzdGFydGVkIHBsYXlpbmcgeWV0LCBvciBoYXMgYWxyZWFkeSBoYWQgcGF1c2VfcmVxdWVzdGVkIChidXQgZmFkZSBtYXkgaGF2ZSBjaGFuZ2VkIHNvIHVwZGF0ZSBoZXJlKVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjbGlwLnN0YXRlLnR5cGUgPT09ICdwbGF5X3JlcXVlc3RlZCcgfHwgY2xpcC5zdGF0ZS50eXBlID09PSAncGF1c2VfcmVxdWVzdGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xpcC5zdGF0ZSA9IHsgdHlwZTogJ3BhdXNlX3JlcXVlc3RlZCcsIGZhZGUgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gW3NvdW5kSWRTdHIsIGNsaXBdO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXI7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdG9wQXVkaW9DbGlwKHBhdGgsIHsgZmFkZSB9LCBvbmx5U291bmRJZCwgYWxsb3dJZlN0b3BSZXF1ZXN0ZWQpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgLy8gTm8gYWN0aXZlIGNsaXBzIHRvIHN0b3BcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKChfYiA9IChfYSA9IHRoaXMuYXVkaW9DbGlwUGxheWVyc1twYXRoXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFjdGl2ZUNsaXBzKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB7fSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVBdWRpb0NsaXBQbGF5ZXIocGF0aCwgKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgIGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoY2xpcFBsYXllci5hY3RpdmVDbGlwcykubWFwKChbc291bmRJZFN0ciwgY2xpcF0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VuZElkID0gcGFyc2VJbnQoc291bmRJZFN0cik7XG4gICAgICAgICAgICAgICAgLy8gSWYgb25seVNvdW5kSWQgc3BlY2lmaWVkLCBvbmx5IHVwZGF0ZSB0aGF0IGNsaXBcbiAgICAgICAgICAgICAgICBpZiAob25seVNvdW5kSWQgPT09IHVuZGVmaW5lZCB8fCBvbmx5U291bmRJZCA9PT0gc291bmRJZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGFsbG93SWZTdG9wUmVxdWVzdGVkICYmIGNsaXAuc3RhdGUudHlwZSA9PT0gJ3N0b3BfcmVxdWVzdGVkJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAuc3RhdGUudHlwZSA9PT0gJ3BsYXlpbmcnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGlwLnN0YXRlLnR5cGUgPT09ICdwYXVzaW5nJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xpcC5zdGF0ZS50eXBlID09PSAncGF1c2VkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xpcC5zdGF0ZS50eXBlID09PSAnc3RvcHBpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNGYWRlVmFsaWQoZmFkZSkgJiYgY2xpcC5zdGF0ZS50eXBlICE9PSAncGF1c2VkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFudXAgYW55IG9sZCBmYWRlIGNhbGxiYWNrcyBmaXJzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSBjYXN0IG9uY2UgaHR0cHM6Ly9naXRodWIuY29tL0RlZmluaXRlbHlUeXBlZC9EZWZpbml0ZWx5VHlwZWQvcHVsbC81OTQxMSBpcyBtZXJnZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vZmYoJ2ZhZGUnLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWRlQXVkaW9QbGF5ZXJWb2x1bWUoY2xpcFBsYXllci5wbGF5ZXIsIDAsIGZhZGUgKiAxMDAwLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgY2FsbGJhY2sgYWZ0ZXIgc3RhcnRpbmcgbmV3IGZhZGUsIG90aGVyd2lzZSBpdCB3aWxsIGZpcmUgc3RyYWlnaHQgYXdheSBhcyB0aGUgcHJldmlvdXMgZmFkZSBpcyBjYW5jZWxsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vbmNlKCdmYWRlJywgKHNvdW5kSWQpID0+IGNsaXBQbGF5ZXIucGxheWVyLnN0b3Aoc291bmRJZCksIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAuc3RhdGUgPSB7IHR5cGU6ICdzdG9wcGluZycgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLnN0b3Aoc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xpcCBoYXNuJ3Qgc3RhcnRlZCBwbGF5aW5nIHlldCwgb3IgaGFzIGFscmVhZHkgaGFkIHN0b3BfcmVxdWVzdGVkIChidXQgZmFkZSBtYXkgaGF2ZSBjaGFuZ2VkIHNvIHVwZGF0ZSBoZXJlKVxuICAgICAgICAgICAgICAgICAgICAvLyBvciBoYXMgcGF1c2VfcmVxdWVzdGVkLCBidXQgc3RvcCB0YWtlcyBwcmVjZWRlbmNlXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNsaXAuc3RhdGUudHlwZSA9PT0gJ3BsYXlfcmVxdWVzdGVkJyB8fCBjbGlwLnN0YXRlLnR5cGUgPT09ICdwYXVzZV9yZXF1ZXN0ZWQnIHx8IGNsaXAuc3RhdGUudHlwZSA9PT0gJ3N0b3BfcmVxdWVzdGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKFwiVHJ5aW5nIHRvIHN0b3AgY2xpcCB3aGljaCBoYXNuJ3Qgc3RhcnRlZCBwbGF5aW5nIHlldFwiLCB7IHBhdGgsIHNvdW5kSWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGlwLnN0YXRlID0geyB0eXBlOiAnc3RvcF9yZXF1ZXN0ZWQnLCBmYWRlIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtzb3VuZElkU3RyLCBjbGlwXTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVyO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RvcEFsbEF1ZGlvQ2xpcHMob3B0aW9ucykge1xuICAgICAgICBsb2coJ1N0b3BwaW5nIGFsbCBjbGlwcycpO1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmF1ZGlvQ2xpcFBsYXllcnMpLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3RvcEF1ZGlvQ2xpcChwYXRoLCBvcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNldEF1ZGlvQ2xpcFZvbHVtZShwYXRoLCB7IHZvbHVtZSwgZmFkZSB9KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGlmICghKHZvbHVtZSA+PSAwICYmIHZvbHVtZSA8PSAxKSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIHZvbHVtZScsIHZvbHVtZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gYWN0aXZlIGNsaXBzIHRvIHNldCB2b2x1bWUgZm9yXG4gICAgICAgIGlmIChPYmplY3Qua2V5cygoX2IgPSAoX2EgPSB0aGlzLmF1ZGlvQ2xpcFBsYXllcnNbcGF0aF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hY3RpdmVDbGlwcykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDoge30pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlQXVkaW9DbGlwUGxheWVyKHBhdGgsIChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICBjbGlwUGxheWVyLmFjdGl2ZUNsaXBzID0gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHMpLm1hcCgoW3NvdW5kSWRTdHIsIGNsaXBdKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gSWdub3JlZCBmb3IgcGF1c2luZy9zdG9wcGluZyBpbnN0YW5jZXNcbiAgICAgICAgICAgICAgICBpZiAoY2xpcC5zdGF0ZS50eXBlICE9PSAncGF1c2luZycgJiYgY2xpcC5zdGF0ZS50eXBlICE9PSAnc3RvcHBpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdW5kSWQgPSBwYXJzZUludChzb3VuZElkU3RyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmFkZVZhbGlkKGZhZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmYWRlQXVkaW9QbGF5ZXJWb2x1bWUoY2xpcFBsYXllci5wbGF5ZXIsIHZvbHVtZSwgZmFkZSAqIDEwMDAsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXVkaW9QbGF5ZXJWb2x1bWUoY2xpcFBsYXllci5wbGF5ZXIsIHZvbHVtZSwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtzb3VuZElkU3RyLCB7IC4uLmNsaXAsIHZvbHVtZSB9XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbc291bmRJZFN0ciwgY2xpcF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXI7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBoYW5kbGVTdG9wcGVkQ2xpcChwYXRoLCBwbGF5SWQsIHNvdW5kSWQpIHtcbiAgICAgICAgdGhpcy51cGRhdGVBdWRpb0NsaXBQbGF5ZXIocGF0aCwgKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgIGRlbGV0ZSBjbGlwUGxheWVyLmFjdGl2ZUNsaXBzW3NvdW5kSWRdO1xuICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXI7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm5vdGlmeUNsaXBTdGF0ZUxpc3RlbmVycyhwbGF5SWQsIHBhdGgsICdzdG9wcGVkJyk7XG4gICAgfVxuICAgIHVwZGF0ZUFjdGl2ZUF1ZGlvQ2xpcChwYXRoLCBzb3VuZElkLCB1cGRhdGUpIHtcbiAgICAgICAgdGhpcy51cGRhdGVBdWRpb0NsaXBQbGF5ZXIocGF0aCwgKGNsaXBQbGF5ZXIpID0+IHNvdW5kSWQgaW4gY2xpcFBsYXllci5hY3RpdmVDbGlwc1xuICAgICAgICAgICAgPyB7IC4uLmNsaXBQbGF5ZXIsIGFjdGl2ZUNsaXBzOiB7IC4uLmNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHMsIFtzb3VuZElkXTogdXBkYXRlKGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHNbc291bmRJZF0pIH0gfVxuICAgICAgICAgICAgOiBjbGlwUGxheWVyKTtcbiAgICB9XG4gICAgdXBkYXRlQXVkaW9DbGlwUGxheWVyKHBhdGgsIHVwZGF0ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmIChwYXRoIGluIHRoaXMuYXVkaW9DbGlwUGxheWVycykge1xuICAgICAgICAgICAgdGhpcy5hdWRpb0NsaXBQbGF5ZXJzID0geyAuLi50aGlzLmF1ZGlvQ2xpcFBsYXllcnMsIFtwYXRoXTogdXBkYXRlKHRoaXMuYXVkaW9DbGlwUGxheWVyc1twYXRoXSkgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPbmNlIGxhc3QgaW5zdGFuY2Ugb2YgYW4gZXBoZW1lcmFsIGNsaXAgaXMgcmVtb3ZlZCwgY2xlYW51cCBhbmQgcmVtb3ZlIHRoZSBwbGF5ZXJcbiAgICAgICAgY29uc3QgY2xpcFBsYXllciA9IHRoaXMuYXVkaW9DbGlwUGxheWVyc1twYXRoXTtcbiAgICAgICAgaWYgKGNsaXBQbGF5ZXIgJiYgT2JqZWN0LmtleXMoKF9hID0gY2xpcFBsYXllci5hY3RpdmVDbGlwcykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDoge30pLmxlbmd0aCA9PT0gMCAmJiBjbGlwUGxheWVyLmNvbmZpZy5lcGhlbWVyYWwpIHtcbiAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLnVubG9hZCgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYXVkaW9DbGlwUGxheWVyc1twYXRoXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vdGlmeVN0YXRlTGlzdGVuZXJzKCk7XG4gICAgfVxuICAgIHNldEF1ZGlvU2luayhzaW5rSWQpIHtcbiAgICAgICAgbG9nKGBTZXR0aW5nIHNpbmsgSUQgZm9yIGFsbCBjbGlwczpgLCBzaW5rSWQpO1xuICAgICAgICBmb3IgKGNvbnN0IGNsaXBQbGF5ZXIgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmF1ZGlvQ2xpcFBsYXllcnMpKSB7XG4gICAgICAgICAgICBzZXRQbGF5ZXJTaW5rSWQoY2xpcFBsYXllci5wbGF5ZXIsIHNpbmtJZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zaW5rSWQgPSBzaW5rSWQ7XG4gICAgfVxuICAgIHVwZGF0ZUNvbmZpZyhuZXdGaWxlcykge1xuICAgICAgICBjb25zdCBuZXdBdWRpb0ZpbGVzID0gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG5ld0ZpbGVzKS5maWx0ZXIoKGZpbGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBmaWxlWzFdLnR5cGU7XG4gICAgICAgICAgICAvLyBDT0dTIDQuNiBkaWQgbm90IHNlbmQgYSBgdHlwZWAgYnV0IG9ubHkgcmVwb3J0ZWQgYXVkaW8gZmlsZXNcbiAgICAgICAgICAgIC8vIHNvIHdlIGFzc3VtZSBhdWRpbyBpZiBubyBgdHlwZWAgaXMgZ2l2ZW5cbiAgICAgICAgICAgIHJldHVybiB0eXBlID09PSAnYXVkaW8nIHx8ICF0eXBlO1xuICAgICAgICB9KSk7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzQ2xpcFBsYXllcnMgPSB0aGlzLmF1ZGlvQ2xpcFBsYXllcnM7XG4gICAgICAgIHRoaXMuYXVkaW9DbGlwUGxheWVycyA9ICgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjbGlwUGxheWVycyA9IHsgLi4ucHJldmlvdXNDbGlwUGxheWVycyB9O1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZENsaXBzID0gT2JqZWN0LmtleXMocHJldmlvdXNDbGlwUGxheWVycykuZmlsdGVyKChwcmV2aW91c0ZpbGUpID0+ICEocHJldmlvdXNGaWxlIGluIG5ld0F1ZGlvRmlsZXMpICYmICFwcmV2aW91c0NsaXBQbGF5ZXJzW3ByZXZpb3VzRmlsZV0uY29uZmlnLmVwaGVtZXJhbCk7XG4gICAgICAgICAgICByZW1vdmVkQ2xpcHMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IHByZXZpb3VzQ2xpcFBsYXllcnNbZmlsZV0ucGxheWVyO1xuICAgICAgICAgICAgICAgIHBsYXllci51bmxvYWQoKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgY2xpcFBsYXllcnNbZmlsZV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGFkZGVkQ2xpcHMgPSBPYmplY3QuZW50cmllcyhuZXdBdWRpb0ZpbGVzKS5maWx0ZXIoKFtuZXdmaWxlXSkgPT4gIXByZXZpb3VzQ2xpcFBsYXllcnNbbmV3ZmlsZV0pO1xuICAgICAgICAgICAgYWRkZWRDbGlwcy5mb3JFYWNoKChbcGF0aCwgY29uZmlnXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXJzW3BhdGhdID0gdGhpcy5jcmVhdGVDbGlwKHBhdGgsIHsgLi4uY29uZmlnLCBlcGhlbWVyYWw6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkQ2xpcHMgPSBPYmplY3Qua2V5cyhwcmV2aW91c0NsaXBQbGF5ZXJzKS5maWx0ZXIoKHByZXZpb3VzRmlsZSkgPT4gcHJldmlvdXNGaWxlIGluIG5ld0F1ZGlvRmlsZXMpO1xuICAgICAgICAgICAgdXBkYXRlZENsaXBzLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyc1twYXRoXSA9IHRoaXMudXBkYXRlZENsaXAocGF0aCwgY2xpcFBsYXllcnNbcGF0aF0sIHsgLi4ubmV3QXVkaW9GaWxlc1twYXRoXSwgZXBoZW1lcmFsOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXJzO1xuICAgICAgICB9KSgpO1xuICAgICAgICB0aGlzLm5vdGlmeVN0YXRlTGlzdGVuZXJzKCk7XG4gICAgfVxuICAgIG5vdGlmeVN0YXRlTGlzdGVuZXJzKCkge1xuICAgICAgICBjb25zdCBjbGlwcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuYXVkaW9DbGlwUGxheWVycykucmVkdWNlKChjbGlwcywgW3BhdGgsIGNsaXBQbGF5ZXJdKSA9PiB7XG4gICAgICAgICAgICBjbGlwc1twYXRoXSA9IHtcbiAgICAgICAgICAgICAgICBjb25maWc6IHsgcHJlbG9hZDogY2xpcFBsYXllci5jb25maWcucHJlbG9hZCwgZXBoZW1lcmFsOiBjbGlwUGxheWVyLmNvbmZpZy5lcGhlbWVyYWwgfSxcbiAgICAgICAgICAgICAgICBhY3RpdmVDbGlwczogY2xpcFBsYXllci5hY3RpdmVDbGlwcyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gY2xpcHM7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgICAgY29uc3QgaXNQbGF5aW5nID0gT2JqZWN0LnZhbHVlcyh0aGlzLmF1ZGlvQ2xpcFBsYXllcnMpLnNvbWUoKHsgYWN0aXZlQ2xpcHMgfSkgPT4gT2JqZWN0LnZhbHVlcyhhY3RpdmVDbGlwcykuc29tZSgoY2xpcCkgPT4gY2xpcC5zdGF0ZS50eXBlID09PSAncGxheWluZycgfHwgY2xpcC5zdGF0ZS50eXBlID09PSAncGF1c2luZycgfHwgY2xpcC5zdGF0ZS50eXBlID09PSAnc3RvcHBpbmcnKSk7XG4gICAgICAgIGNvbnN0IGF1ZGlvU3RhdGUgPSB7XG4gICAgICAgICAgICBnbG9iYWxWb2x1bWU6IHRoaXMuZ2xvYmFsVm9sdW1lLFxuICAgICAgICAgICAgaXNQbGF5aW5nLFxuICAgICAgICAgICAgY2xpcHMsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnc3RhdGUnLCBhdWRpb1N0YXRlKTtcbiAgICB9XG4gICAgbm90aWZ5Q2xpcFN0YXRlTGlzdGVuZXJzKHBsYXlJZCwgZmlsZSwgc3RhdHVzKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnYXVkaW9DbGlwU3RhdGUnLCB7IG1lZGlhVHlwZTogJ2F1ZGlvJywgcGxheUlkLCBmaWxlLCBzdGF0dXMgfSk7XG4gICAgfVxuICAgIC8vIFR5cGUtc2FmZSB3cmFwcGVyIGFyb3VuZCBFdmVudFRhcmdldFxuICAgIGFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5ldmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBkaXNwYXRjaEV2ZW50KHR5cGUsIGRldGFpbCkge1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KHR5cGUsIHsgZGV0YWlsIH0pKTtcbiAgICB9XG4gICAgY3JlYXRlUGxheWVyKHBhdGgsIGNvbmZpZykge1xuICAgICAgICBjb25zdCBwbGF5ZXIgPSBuZXcgaG93bGVyXzEuSG93bCh7XG4gICAgICAgICAgICBzcmM6IHVybHNfMS5hc3NldFVybChwYXRoKSxcbiAgICAgICAgICAgIGF1dG9wbGF5OiBmYWxzZSxcbiAgICAgICAgICAgIGxvb3A6IGZhbHNlLFxuICAgICAgICAgICAgdm9sdW1lOiAxLFxuICAgICAgICAgICAgaHRtbDU6IHRydWUsXG4gICAgICAgICAgICBwcmVsb2FkOiBjb25maWcucHJlbG9hZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHNldFBsYXllclNpbmtJZChwbGF5ZXIsIHRoaXMuc2lua0lkKTtcbiAgICAgICAgcmV0dXJuIHBsYXllcjtcbiAgICB9XG4gICAgY3JlYXRlQ2xpcChmaWxlLCBjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIHBsYXllcjogdGhpcy5jcmVhdGVQbGF5ZXIoZmlsZSwgY29uZmlnKSxcbiAgICAgICAgICAgIGFjdGl2ZUNsaXBzOiB7fSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdXBkYXRlZENsaXAoY2xpcFBhdGgsIHByZXZpb3VzQ2xpcCwgbmV3Q29uZmlnKSB7XG4gICAgICAgIGNvbnN0IGNsaXAgPSB7IC4uLnByZXZpb3VzQ2xpcCwgY29uZmlnOiBuZXdDb25maWcgfTtcbiAgICAgICAgaWYgKHByZXZpb3VzQ2xpcC5jb25maWcucHJlbG9hZCAhPT0gbmV3Q29uZmlnLnByZWxvYWQpIHtcbiAgICAgICAgICAgIGNsaXAucGxheWVyLnVubG9hZCgpO1xuICAgICAgICAgICAgY2xpcC5wbGF5ZXIgPSB0aGlzLmNyZWF0ZVBsYXllcihjbGlwUGF0aCwgbmV3Q29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xpcDtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBBdWRpb1BsYXllcjtcbmZ1bmN0aW9uIGxvZyguLi5kYXRhKSB7XG4gICAgaWYgKERFQlVHKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKC4uLmRhdGEpO1xuICAgIH1cbn1cbi8qKlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoaXMgaXMgdGhpcyBhIHZhbGlkIGZhZGUgZHVyYXRpb24uIEFsd2F5cyByZXR1cm5zIGBmYWxzZWAgb24gaU9TXG4gKi9cbmZ1bmN0aW9uIGlzRmFkZVZhbGlkKGZhZGUpIHtcbiAgICByZXR1cm4gIUlTX0lPUyAmJiB0eXBlb2YgZmFkZSA9PT0gJ251bWJlcicgJiYgIWlzTmFOKGZhZGUpICYmIGZhZGUgPiAwO1xufVxuZnVuY3Rpb24gc2V0UGxheWVyU2lua0lkKHBsYXllciwgc2lua0lkKSB7XG4gICAgdmFyIF9hO1xuICAgIGlmIChzaW5rSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChwbGF5ZXIuX2h0bWw1KSB7XG4gICAgICAgIChfYSA9IHBsYXllci5fc291bmRzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZm9yRWFjaCgoc291bmQpID0+IHtcbiAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICAoX2IgPSAoX2EgPSBzb3VuZC5fbm9kZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNldFNpbmtJZCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EsIHNpbmtJZCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gVE9ETzogaGFuZGxlIHdlYiBhdWRpb1xuICAgICAgICBjb25zb2xlLndhcm4oJ0Nhbm5vdCBzZXQgc2luayBJRDogd2ViIGF1ZGlvIG5vdCBzdXBwb3J0ZWQnLCBwbGF5ZXIpO1xuICAgIH1cbn1cbi8qKlxuICogU2V0IGF1ZGlvIHZvbHVtZVxuICpcbiAqIFRoaXMgZG9lc24ndCB3b3JrIG9uIGlPUyAodm9sdW1lIGlzIHJlYWQtb25seSkgc28gYXQgbGVhc3QgbXV0ZSBpdCBpZiB0aGUgdm9sdW1lIGlzIHplcm9cbiAqL1xuZnVuY3Rpb24gc2V0QXVkaW9QbGF5ZXJWb2x1bWUoaG93bCwgdm9sdW1lLCBzb3VuZElkKSB7XG4gICAgaG93bC52b2x1bWUodm9sdW1lLCBzb3VuZElkKTtcbiAgICBob3dsLm11dGUodm9sdW1lID09PSAwLCBzb3VuZElkKTtcbn1cbi8qKlxuICogRmFkZSB0byBhdWRpbyB2b2x1bWVcbiAqXG4gKiBUaGlzIGRvZXNuJ3Qgd29yayBvbiBpT1MgKHZvbHVtZSBpcyByZWFkLW9ubHkpIHNvIGF0IGxlYXN0IG11dGUgaXQgaWYgdGhlIHZvbHVtZSBpcyB6ZXJvXG4gKi9cbmZ1bmN0aW9uIGZhZGVBdWRpb1BsYXllclZvbHVtZShob3dsLCB2b2x1bWUsIGZhZGUsIHNvdW5kSWQpIHtcbiAgICBob3dsLm11dGUoZmFsc2UsIHNvdW5kSWQpO1xuICAgIGhvd2wuZmFkZShob3dsLnZvbHVtZShzb3VuZElkKSwgdm9sdW1lLCBmYWRlLCBzb3VuZElkKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgdmFsdWVUeXBlc18xID0gcmVxdWlyZShcIi4vdHlwZXMvdmFsdWVUeXBlc1wiKTtcbmNvbnN0IHJlY29ubmVjdGluZ193ZWJzb2NrZXRfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwicmVjb25uZWN0aW5nLXdlYnNvY2tldFwiKSk7XG5jb25zdCB1cmxzXzEgPSByZXF1aXJlKFwiLi9oZWxwZXJzL3VybHNcIik7XG5jbGFzcyBDb2dzQ29ubmVjdGlvbiB7XG4gICAgY29uc3RydWN0b3IoeyBob3N0bmFtZSA9IGRvY3VtZW50LmxvY2F0aW9uLmhvc3RuYW1lLCBwb3J0ID0gdXJsc18xLkNPR1NfU0VSVkVSX1BPUlQgfSA9IHt9LCBvdXRwdXRQb3J0VmFsdWVzID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5ldmVudFRhcmdldCA9IG5ldyBFdmVudFRhcmdldCgpO1xuICAgICAgICB0aGlzLmN1cnJlbnRDb25maWcgPSB7fTsgLy8gUmVjZWl2ZWQgb24gb3BlbiBjb25uZWN0aW9uXG4gICAgICAgIHRoaXMuY3VycmVudElucHV0UG9ydFZhbHVlcyA9IHt9OyAvLyBSZWNlaXZlZCBvbiBvcGVuIGNvbm5lY3Rpb25cbiAgICAgICAgdGhpcy5jdXJyZW50T3V0cHV0UG9ydFZhbHVlcyA9IHt9OyAvLyBTZW50IG9uIG9wZW4gY29ubmVjdGlvblxuICAgICAgICB0aGlzLl9zaG93UGhhc2UgPSB2YWx1ZVR5cGVzXzEuU2hvd1BoYXNlLlNldHVwO1xuICAgICAgICB0aGlzLl90aW1lclN0YXRlID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhY2hlZCBhdWRpbyBvdXRwdXRzIHVzZSB0byBsb29rIHVwIHRoZSBkZXZpY2Uvc2luayBJRCB3aGVuIGEgZGlmZmVyZW50IGRldmljZSBsYWJlbCBpcyByZXF1ZXN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYXVkaW9PdXRwdXRzID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zZWxlY3RlZEF1ZGlvT3V0cHV0ID0gJyc7XG4gICAgICAgIHRoaXMuY3VycmVudE91dHB1dFBvcnRWYWx1ZXMgPSB7IC4uLm91dHB1dFBvcnRWYWx1ZXMgfTtcbiAgICAgICAgY29uc3QgeyB1c2VSZWNvbm5lY3RpbmdXZWJzb2NrZXQsIHBhdGgsIHBhdGhQYXJhbXMgfSA9IHdlYnNvY2tldFBhcmFtZXRlcnNGcm9tVXJsKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICBjb25zdCBzb2NrZXRVcmwgPSBgd3M6Ly8ke2hvc3RuYW1lfToke3BvcnR9JHtwYXRofSR7cGF0aFBhcmFtcyA/ICc/JyArIHBhdGhQYXJhbXMgOiAnJ31gO1xuICAgICAgICB0aGlzLndlYnNvY2tldCA9IHVzZVJlY29ubmVjdGluZ1dlYnNvY2tldCA/IG5ldyByZWNvbm5lY3Rpbmdfd2Vic29ja2V0XzEuZGVmYXVsdChzb2NrZXRVcmwpIDogbmV3IFdlYlNvY2tldChzb2NrZXRVcmwpO1xuICAgICAgICB0aGlzLndlYnNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDb25maWcgPSB7fTsgLy8gUmVjZWl2ZWQgb24gb3BlbiBjb25uZWN0aW9uXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRJbnB1dFBvcnRWYWx1ZXMgPSB7fTsgLy8gUmVjZWl2ZWQgb24gb3BlbiBjb25uZWN0aW9uXG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ29wZW4nLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgdGhpcy5zZXRPdXRwdXRQb3J0VmFsdWVzKHRoaXMuY3VycmVudE91dHB1dFBvcnRWYWx1ZXMpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLndlYnNvY2tldC5vbmNsb3NlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdjbG9zZScsIHVuZGVmaW5lZCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMud2Vic29ja2V0Lm9ubWVzc2FnZSA9ICh7IGRhdGEgfSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZWQuY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDb25maWcgPSBwYXJzZWQuY29uZmlnO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdjb25maWcnLCB0aGlzLmN1cnJlbnRDb25maWcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcnNlZC51cGRhdGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJbnB1dFBvcnRWYWx1ZXMgPSB7IC4uLnRoaXMuY3VycmVudElucHV0UG9ydFZhbHVlcywgLi4ucGFyc2VkLnVwZGF0ZXMgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgndXBkYXRlcycsIHBhcnNlZC51cGRhdGVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXJzZWQuZXZlbnQgJiYgcGFyc2VkLmV2ZW50LmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdldmVudCcsIHBhcnNlZC5ldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHBhcnNlZC5tZXNzYWdlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwYXJzZWQubWVzc2FnZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYWRqdXN0YWJsZV90aW1lcl91cGRhdGUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90aW1lclN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25NaWxsaXM6IHBhcnNlZC5tZXNzYWdlLmR1cmF0aW9uTWlsbGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlja2luZzogcGFyc2VkLm1lc3NhZ2UudGlja2luZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc2hvd19waGFzZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Nob3dQaGFzZSA9IHBhcnNlZC5tZXNzYWdlLnBoYXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnbWVzc2FnZScsIHBhcnNlZC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0Vycm9yIGhhbmRsaW5nIGRhdGEnLCBkYXRhLCBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuYWJsZSB0byBwYXJzZSBpbmNvbWluZyBkYXRhIGZyb20gc2VydmVyJywgZGF0YSwgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIFNlbmQgYSBsaXN0IG9mIGF1ZGlvIG91dHB1dHMgdG8gQ09HUyBhbmQga2VlcCBpdCB1cCB0byBkYXRlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZnJlc2hBdWRpb091dHB1dHMgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gYG5hdmlnYXRvci5tZWRpYURldmljZXNgIGlzIHVuZGVmaW5lZCBvbiBDT0dTIEFWIDw9IDQuNSBiZWNhdXNlIG9mIHNlY3VyZSBvcmlnaW4gcGVybWlzc2lvbnNcbiAgICAgICAgICAgICAgICBpZiAobmF2aWdhdG9yLm1lZGlhRGV2aWNlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb091dHB1dHMgPSAoYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKCkpLmZpbHRlcigoeyBraW5kIH0pID0+IGtpbmQgPT09ICdhdWRpb291dHB1dCcpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbmRBdWRpb091dHB1dHMoYXVkaW9PdXRwdXRzKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdWRpb091dHB1dHMgPSBhdWRpb091dHB1dHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsIHJlZnJlc2hBdWRpb091dHB1dHMpO1xuICAgICAgICAgICAgKF9hID0gbmF2aWdhdG9yLm1lZGlhRGV2aWNlcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFkZEV2ZW50TGlzdGVuZXIoJ2RldmljZWNoYW5nZScsIHJlZnJlc2hBdWRpb091dHB1dHMpO1xuICAgICAgICAgICAgcmVmcmVzaEF1ZGlvT3V0cHV0cygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBjb25maWcoKSB7XG4gICAgICAgIHJldHVybiB7IC4uLnRoaXMuY3VycmVudENvbmZpZyB9O1xuICAgIH1cbiAgICBnZXQgaW5wdXRQb3J0VmFsdWVzKCkge1xuICAgICAgICByZXR1cm4geyAuLi50aGlzLmN1cnJlbnRJbnB1dFBvcnRWYWx1ZXMgfTtcbiAgICB9XG4gICAgZ2V0IG91dHB1dFBvcnRWYWx1ZXMoKSB7XG4gICAgICAgIHJldHVybiB7IC4uLnRoaXMuY3VycmVudE91dHB1dFBvcnRWYWx1ZXMgfTtcbiAgICB9XG4gICAgZ2V0IHNob3dQaGFzZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nob3dQaGFzZTtcbiAgICB9XG4gICAgZ2V0IHRpbWVyU3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aW1lclN0YXRlID8geyAuLi50aGlzLl90aW1lclN0YXRlIH0gOiBudWxsO1xuICAgIH1cbiAgICBnZXQgc2VsZWN0ZWRBdWRpb091dHB1dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkQXVkaW9PdXRwdXQ7XG4gICAgfVxuICAgIGdldCBpc0Nvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2Vic29ja2V0LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOO1xuICAgIH1cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy53ZWJzb2NrZXQuY2xvc2UoKTtcbiAgICB9XG4gICAgc2VuZEV2ZW50KGV2ZW50TmFtZSwgLi4uW2V2ZW50VmFsdWVdKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLndlYnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBldmVudDoge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IGV2ZW50TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGV2ZW50VmFsdWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRPdXRwdXRQb3J0VmFsdWVzKHZhbHVlcykge1xuICAgICAgICB0aGlzLmN1cnJlbnRPdXRwdXRQb3J0VmFsdWVzID0geyAuLi50aGlzLmN1cnJlbnRPdXRwdXRQb3J0VmFsdWVzLCAuLi52YWx1ZXMgfTtcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMud2Vic29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoeyB1cGRhdGVzOiB2YWx1ZXMgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldEF1ZGlvU2lua0lkKGF1ZGlvT3V0cHV0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiBhdWRpb091dHB1dCA/IChfYiA9IChfYSA9IHRoaXMuYXVkaW9PdXRwdXRzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZmluZCgoeyBsYWJlbCB9KSA9PiBsYWJlbCA9PT0gYXVkaW9PdXRwdXQpKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZGV2aWNlSWQgOiAnJztcbiAgICB9XG4gICAgc2VuZEluaXRpYWxNZWRpYUNsaXBTdGF0ZXMoYWxsTWVkaWFDbGlwU3RhdGVzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLndlYnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHsgYWxsTWVkaWFDbGlwU3RhdGVzIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZW5kTWVkaWFDbGlwU3RhdGUobWVkaWFDbGlwU3RhdGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMud2Vic29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoeyBtZWRpYUNsaXBTdGF0ZSB9KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2VuZEF1ZGlvT3V0cHV0cyhhdWRpb091dHB1dHMpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMud2Vic29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoeyBhdWRpb091dHB1dHMgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3cgb3IgaGlkZSB0aGUgcGx1Z2luIHdpbmRvdy5cbiAgICAgKiBAcGFyYW0gdmlzaWJsZSBXaGV0aGVyIHRvIHNob3cgb3IgaGlkZSB0aGUgd2luZG93XG4gICAgICogVGhpcyBpcyBvbmx5IHJlbGV2YW50IGZvciBwbHVnaW5zLCBub3QgZm9yIE1lZGlhIE1hc3RlciBjb250ZW50LlxuICAgICAqL1xuICAgIHNldFBsdWdpbldpbmRvd1Zpc2libGUodmlzaWJsZSkge1xuICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhpcy53ZWJzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7IHdpbmRvdzogeyB2aXNpYmxlIH0gfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFR5cGUtc2FmZSB3cmFwcGVyIGFyb3VuZCBFdmVudFRhcmdldFxuICAgIGFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5ldmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBkaXNwYXRjaEV2ZW50KHR5cGUsIGRldGFpbCkge1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KHR5cGUsIHsgZGV0YWlsIH0pKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBDb2dzQ29ubmVjdGlvbjtcbmZ1bmN0aW9uIHdlYnNvY2tldFBhcmFtZXRlcnNGcm9tVXJsKHVybCkge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2U7XG4gICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTCh1cmwpO1xuICAgIGNvbnN0IHBhdGhQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHBhcnNlZFVybC5zZWFyY2hQYXJhbXMpO1xuICAgIGNvbnN0IGxvY2FsQ2xpZW50SWQgPSBwYXRoUGFyYW1zLmdldCgnbG9jYWxfaWQnKTtcbiAgICBjb25zdCBpc1NpbXVsYXRvciA9IHBhdGhQYXJhbXMuZ2V0KCdzaW11bGF0b3InKSA9PT0gJ3RydWUnO1xuICAgIGNvbnN0IGRpc3BsYXkgPSAoX2EgPSBwYXRoUGFyYW1zLmdldCgnZGlzcGxheScpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJztcbiAgICBjb25zdCBwbHVnaW5JZCA9IHBhcnNlZFVybC5wYXRobmFtZS5zdGFydHNXaXRoKCcvcGx1Z2luLycpID8gZGVjb2RlVVJJQ29tcG9uZW50KHBhcnNlZFVybC5wYXRobmFtZS5zcGxpdCgnLycpWzJdKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAobG9jYWxDbGllbnRJZCkge1xuICAgICAgICBjb25zdCB0eXBlID0gKF9iID0gcGF0aFBhcmFtcy5nZXQoJ3QnKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XG4gICAgICAgIHBhdGhQYXJhbXMuZGVsZXRlKCdsb2NhbF9pZCcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGF0aDogYC9sb2NhbC8ke2VuY29kZVVSSUNvbXBvbmVudChsb2NhbENsaWVudElkKX1gLFxuICAgICAgICAgICAgcGF0aFBhcmFtczogbmV3IFVSTFNlYXJjaFBhcmFtcyh7IHQ6IHR5cGUgfSksXG4gICAgICAgICAgICB1c2VSZWNvbm5lY3RpbmdXZWJzb2NrZXQ6IHRydWUsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzU2ltdWxhdG9yKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSAoX2MgPSBwYXRoUGFyYW1zLmdldCgnbmFtZScpKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAnJztcbiAgICAgICAgcGF0aFBhcmFtcy5kZWxldGUoJ3NpbXVsYXRvcicpO1xuICAgICAgICBwYXRoUGFyYW1zLmRlbGV0ZSgnbmFtZScpO1xuICAgICAgICByZXR1cm4geyBwYXRoOiBgL3NpbXVsYXRvci8ke2VuY29kZVVSSUNvbXBvbmVudChuYW1lKX1gLCBwYXRoUGFyYW1zLCB1c2VSZWNvbm5lY3RpbmdXZWJzb2NrZXQ6IHRydWUgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZGlzcGxheSkge1xuICAgICAgICBjb25zdCBkaXNwbGF5SWRJbmRleCA9IChfZCA9IHBhdGhQYXJhbXMuZ2V0KCdkaXNwbGF5SWRJbmRleCcpKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAnJztcbiAgICAgICAgcGF0aFBhcmFtcy5kZWxldGUoJ2Rpc3BsYXknKTtcbiAgICAgICAgcGF0aFBhcmFtcy5kZWxldGUoJ2Rpc3BsYXlJZEluZGV4Jyk7XG4gICAgICAgIHJldHVybiB7IHBhdGg6IGAvZGlzcGxheS8ke2VuY29kZVVSSUNvbXBvbmVudChkaXNwbGF5KX0vJHtlbmNvZGVVUklDb21wb25lbnQoZGlzcGxheUlkSW5kZXgpfWAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAocGx1Z2luSWQpIHtcbiAgICAgICAgcmV0dXJuIHsgcGF0aDogYC9wbHVnaW4vJHtlbmNvZGVVUklDb21wb25lbnQocGx1Z2luSWQpfWAsIHVzZVJlY29ubmVjdGluZ1dlYnNvY2tldDogdHJ1ZSB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsID0gKF9lID0gcGF0aFBhcmFtcy5nZXQoJ3NlcmlhbCcpKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAnJztcbiAgICAgICAgcGF0aFBhcmFtcy5kZWxldGUoJ3NlcmlhbCcpO1xuICAgICAgICByZXR1cm4geyBwYXRoOiBgL2NsaWVudC8ke2VuY29kZVVSSUNvbXBvbmVudChzZXJpYWwpfWAsIHBhdGhQYXJhbXMgfTtcbiAgICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuTElWRV9WSURFT19QTEFZQkFDS19SQVRFID0gdm9pZCAwO1xuY29uc3QgbWVkaWFfc3RyZWFtX2xpYnJhcnlfYnJvd3Nlcl8xID0gcmVxdWlyZShcIkBjbG9ja3dvcmtkb2cvbWVkaWEtc3RyZWFtLWxpYnJhcnktYnJvd3NlclwiKTtcbmNvbnN0IHVybHNfMSA9IHJlcXVpcmUoXCIuL2hlbHBlcnMvdXJsc1wiKTtcbmNvbnN0IERFRkFVTFRfVklERU9fUExBWUJBQ0tfUkFURSA9IDE7XG4vLyBVc2UgYSBmYXN0ZXItdGhhbi1yZWFsdGltZSBwbGF5YmFjayByYXRlIGJ5IGRlZmF1bHRcbi8vIHNvIHRoYXQgaXQga2VlcHMgdXAgd2l0aCBhIHJlYWx0aW1lIHN0cmVhbSBpbiBjYXNlIG9mIHZpZGVvIGJ1ZmZlcmluZ1xuZXhwb3J0cy5MSVZFX1ZJREVPX1BMQVlCQUNLX1JBVEUgPSAxLjE7XG4vKipcbiAqIE1hbmFnZXMgYSB3ZWJzb2NrZXQgY29ubmVjdGlvbiB0byB0aGUgQ09HUyBUQ1AgcmVsYXkgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2VuZCBSVFNQIHZpZGVvXG4gKiBmZWVkcyB0byB0aGUgd2ViLlxuICovXG5jbGFzcyBSdHNwU3RyZWFtZXIge1xuICAgIGNvbnN0cnVjdG9yKHsgaG9zdG5hbWUgPSBkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZSwgcG9ydCA9IHVybHNfMS5DT0dTX1NFUlZFUl9QT1JULCBwYXRoID0gJy90Y3AtcHJveHknLCB9ID0ge30pIHtcbiAgICAgICAgdGhpcy5fd2Vic29ja2V0VXJpID0gYHdzOi8vJHtob3N0bmFtZX06JHtwb3J0fSR7cGF0aH1gO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydCBhbiBSVFNQIHZpZGVvIHN0cmVhbSBvbiB3aXRoIHRoZSBnaXZlbiBVUkkgb24gdGhlIGdpdmVuIHZpZGVvIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggYSBmdW5jdGlvbiB0byBjbG9zZSB0aGUgcGlwZWxpbmVcbiAgICAgKi9cbiAgICBwbGF5KHBhcmFtcykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHsgdXJpLCB2aWRlb0VsZW1lbnQgfSA9IHBhcmFtcztcbiAgICAgICAgdmlkZW9FbGVtZW50LnBsYXlzSW5saW5lID0gdHJ1ZTsgLy8gUmVxdWlyZWQgZm9yIGlPU1xuICAgICAgICBsZXQgcGlwZWxpbmU7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGlwZWxpbmUgPSAoKSA9PiB7XG4gICAgICAgICAgICBwaXBlbGluZSA9PT0gbnVsbCB8fCBwaXBlbGluZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGlwZWxpbmUuY2xvc2UoKTtcbiAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3IG1lZGlhX3N0cmVhbV9saWJyYXJ5X2Jyb3dzZXJfMS5IdG1sNVZpZGVvUGlwZWxpbmUoe1xuICAgICAgICAgICAgICAgIHdzOiB7IHVyaTogdGhpcy5fd2Vic29ja2V0VXJpIH0sXG4gICAgICAgICAgICAgICAgcnRzcDogeyB1cmk6IHVyaSB9LFxuICAgICAgICAgICAgICAgIG1lZGlhRWxlbWVudDogdmlkZW9FbGVtZW50LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBSZXN0YXJ0IHN0cmVhbSBvbiBSVENQIEJZRSAoc3RyZWFtIGVuZGVkKVxuICAgICAgICAgICAgcGlwZWxpbmUucnRzcC5vblJ0Y3AgPSAocnRjcCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtZWRpYV9zdHJlYW1fbGlicmFyeV9icm93c2VyXzEuaXNSdGNwQnllKHJ0Y3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdWaWRlbyBzdHJlYW0gZW5kZWQuIFJlc3RhcnRpbmcuJyk7XG4gICAgICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHN0YXJ0UGlwZWxpbmUsIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBTdGFydCBwbGF5YmFjayB3aGVuIHJlYWR5XG4gICAgICAgICAgICBwaXBlbGluZS5yZWFkeS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBwaXBlbGluZS5ydHNwLnBsYXkoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBzdGFydFBpcGVsaW5lKCk7XG4gICAgICAgIGlmIChwYXJhbXMucGxheWJhY2tSYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBwbGF5YmFja1JhdGUgPSAoX2EgPSBwYXJhbXMucGxheWJhY2tSYXRlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBERUZBVUxUX1ZJREVPX1BMQVlCQUNLX1JBVEU7XG4gICAgICAgICAgICB2aWRlb0VsZW1lbnQucGxheWJhY2tSYXRlID0gcGxheWJhY2tSYXRlO1xuICAgICAgICAgICAgdmlkZW9FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BsYXknLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50LnBsYXliYWNrUmF0ZSA9IHBsYXliYWNrUmF0ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZW1vdmVSZXN0YXJ0TGlzdGVuZXJzID0gbnVsbDtcbiAgICAgICAgaWYgKHBhcmFtcy5yZXN0YXJ0SWZTdG9wcGVkKSB7XG4gICAgICAgICAgICBsZXQgcGxheWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGludGVydmFsID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZVRpbWVVcGRhdGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcGxheWluZyA9IHRydWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlUGxheSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBwbGF5aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB2aWRlb0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndGltZXVwZGF0ZScsIGhhbmRsZVRpbWVVcGRhdGUpO1xuICAgICAgICAgICAgICAgIGlmICghaW50ZXJ2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYXlpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVmlkZW8gc3RvcHBlZCBwbGF5aW5nLiBSZXN0YXJ0aW5nLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoc3RhcnRQaXBlbGluZSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF5aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0sIDIwMDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVQYXVzZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB2aWRlb0VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGltZXVwZGF0ZScsIGhhbmRsZVRpbWVVcGRhdGUpO1xuICAgICAgICAgICAgICAgIGlmIChpbnRlcnZhbCkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2aWRlb0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncGxheScsIGhhbmRsZVBsYXkpO1xuICAgICAgICAgICAgdmlkZW9FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BhdXNlJywgaGFuZGxlUGF1c2UpO1xuICAgICAgICAgICAgcmVtb3ZlUmVzdGFydExpc3RlbmVycyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVQYXVzZSgpO1xuICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwbGF5JywgaGFuZGxlUGxheSk7XG4gICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BhdXNlJywgaGFuZGxlUGF1c2UpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2xvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBwaXBlbGluZSA9PT0gbnVsbCB8fCBwaXBlbGluZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGlwZWxpbmUuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICByZW1vdmVSZXN0YXJ0TGlzdGVuZXJzID09PSBudWxsIHx8IHJlbW92ZVJlc3RhcnRMaXN0ZW5lcnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlbW92ZVJlc3RhcnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUnRzcFN0cmVhbWVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCB1cmxzXzEgPSByZXF1aXJlKFwiLi9oZWxwZXJzL3VybHNcIik7XG5jb25zdCBWaWRlb1N0YXRlXzEgPSByZXF1aXJlKFwiLi90eXBlcy9WaWRlb1N0YXRlXCIpO1xuY29uc3QgREVGQVVMVF9QQVJFTlRfRUxFTUVOVCA9IGRvY3VtZW50LmJvZHk7XG5jbGFzcyBWaWRlb1BsYXllciB7XG4gICAgY29uc3RydWN0b3IoY29nc0Nvbm5lY3Rpb24sIHBhcmVudEVsZW1lbnQgPSBERUZBVUxUX1BBUkVOVF9FTEVNRU5UKSB7XG4gICAgICAgIHRoaXMuZXZlbnRUYXJnZXQgPSBuZXcgRXZlbnRUYXJnZXQoKTtcbiAgICAgICAgdGhpcy5nbG9iYWxWb2x1bWUgPSAxO1xuICAgICAgICB0aGlzLnZpZGVvQ2xpcFBsYXllcnMgPSB7fTtcbiAgICAgICAgdGhpcy5zaW5rSWQgPSAnJztcbiAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50ID0gcGFyZW50RWxlbWVudDtcbiAgICAgICAgLy8gU2VuZCB0aGUgY3VycmVudCBzdGF0dXMgb2YgZWFjaCBjbGlwIHRvIENPR1NcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCd2aWRlb0NsaXBTdGF0ZScsICh7IGRldGFpbCB9KSA9PiB7XG4gICAgICAgICAgICBjb2dzQ29ubmVjdGlvbi5zZW5kTWVkaWFDbGlwU3RhdGUoZGV0YWlsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIExpc3RlbiBmb3IgdmlkZW8gY29udHJvbCBtZXNzYWdlc1xuICAgICAgICBjb2dzQ29ubmVjdGlvbi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXZlbnQuZGV0YWlsO1xuICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdtZWRpYV9jb25maWdfdXBkYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRHbG9iYWxWb2x1bWUobWVzc2FnZS5nbG9iYWxWb2x1bWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5hdWRpb091dHB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaW5rSWQgPSBjb2dzQ29ubmVjdGlvbi5nZXRBdWRpb1NpbmtJZChtZXNzYWdlLmF1ZGlvT3V0cHV0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXVkaW9TaW5rKHNpbmtJZCAhPT0gbnVsbCAmJiBzaW5rSWQgIT09IHZvaWQgMCA/IHNpbmtJZCA6ICcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbmZpZyhtZXNzYWdlLmZpbGVzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndmlkZW9fcGxheSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxheVZpZGVvQ2xpcChtZXNzYWdlLmZpbGUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlJZDogbWVzc2FnZS5wbGF5SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWU6IG1lc3NhZ2Uudm9sdW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcDogQm9vbGVhbihtZXNzYWdlLmxvb3ApLFxuICAgICAgICAgICAgICAgICAgICAgICAgZml0OiBtZXNzYWdlLmZpdCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3ZpZGVvX3BhdXNlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXVzZVZpZGVvQ2xpcCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd2aWRlb19zdG9wJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wVmlkZW9DbGlwKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3ZpZGVvX3NldF92b2x1bWUnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZpZGVvQ2xpcFZvbHVtZSh7IHZvbHVtZTogbWVzc2FnZS52b2x1bWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3ZpZGVvX3NldF9maXQnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZpZGVvQ2xpcEZpdCh7IGZpdDogbWVzc2FnZS5maXQgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gT24gY29ubmVjdGlvbiwgc2VuZCB0aGUgY3VycmVudCBwbGF5aW5nIHN0YXRlIG9mIGFsbCBjbGlwc1xuICAgICAgICAvLyAoVXN1YWxseSBlbXB0eSB1bmxlc3Mgd2Vic29ja2V0IGlzIHJlY29ubmVjdGluZylcbiAgICAgICAgY29uc3Qgc2VuZEluaXRpYWxDbGlwU3RhdGVzID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlsZXMgPSBPYmplY3QuZW50cmllcyh0aGlzLnZpZGVvQ2xpcFBsYXllcnMpLm1hcCgoW2ZpbGUsIHBsYXllcl0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGF0dXMgPSAhcGxheWVyLnZpZGVvRWxlbWVudC5wYXVzZWRcbiAgICAgICAgICAgICAgICAgICAgPyAncGxheWluZydcbiAgICAgICAgICAgICAgICAgICAgOiBwbGF5ZXIudmlkZW9FbGVtZW50LmN1cnJlbnRUaW1lID09PSAwIHx8IHBsYXllci52aWRlb0VsZW1lbnQuY3VycmVudFRpbWUgPT09IHBsYXllci52aWRlb0VsZW1lbnQuZHVyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3BhdXNlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJ3N0b3BwZWQnO1xuICAgICAgICAgICAgICAgIHJldHVybiBbZmlsZSwgc3RhdHVzXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29nc0Nvbm5lY3Rpb24uc2VuZEluaXRpYWxNZWRpYUNsaXBTdGF0ZXMoeyBtZWRpYVR5cGU6ICd2aWRlbycsIGZpbGVzIH0pO1xuICAgICAgICB9O1xuICAgICAgICBjb2dzQ29ubmVjdGlvbi5hZGRFdmVudExpc3RlbmVyKCdvcGVuJywgc2VuZEluaXRpYWxDbGlwU3RhdGVzKTtcbiAgICAgICAgc2VuZEluaXRpYWxDbGlwU3RhdGVzKCk7XG4gICAgfVxuICAgIHNldFBhcmVudEVsZW1lbnQocGFyZW50RWxlbWVudCkge1xuICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQgPSBwYXJlbnRFbGVtZW50O1xuICAgICAgICBPYmplY3QudmFsdWVzKHRoaXMudmlkZW9DbGlwUGxheWVycykuZm9yRWFjaCgoY2xpcFBsYXllcikgPT4ge1xuICAgICAgICAgICAgcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChjbGlwUGxheWVyLnZpZGVvRWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXNldFBhcmVudEVsZW1lbnQoKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyZW50RWxlbWVudChERUZBVUxUX1BBUkVOVF9FTEVNRU5UKTtcbiAgICB9XG4gICAgc2V0R2xvYmFsVm9sdW1lKGdsb2JhbFZvbHVtZSkge1xuICAgICAgICBPYmplY3QudmFsdWVzKHRoaXMudmlkZW9DbGlwUGxheWVycykuZm9yRWFjaCgoY2xpcFBsYXllcikgPT4ge1xuICAgICAgICAgICAgc2V0VmlkZW9FbGVtZW50Vm9sdW1lKGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LCBjbGlwUGxheWVyLnZvbHVtZSAqIGdsb2JhbFZvbHVtZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmdsb2JhbFZvbHVtZSA9IGdsb2JhbFZvbHVtZTtcbiAgICAgICAgdGhpcy5ub3RpZnlTdGF0ZUxpc3RlbmVycygpO1xuICAgIH1cbiAgICBwbGF5VmlkZW9DbGlwKHBhdGgsIHsgcGxheUlkLCB2b2x1bWUsIGxvb3AsIGZpdCB9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCF0aGlzLnZpZGVvQ2xpcFBsYXllcnNbcGF0aF0pIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW9DbGlwUGxheWVyc1twYXRoXSA9IHRoaXMuY3JlYXRlQ2xpcFBsYXllcihwYXRoLCB7IHByZWxvYWQ6ICdub25lJywgZXBoZW1lcmFsOiB0cnVlLCBmaXQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUncyBhbHJlYWR5IGEgcGVuZGluZyBjbGlwLCB3aGljaCBoYXMgbm93IGJlZW4gc3VwZXJzZWRlZCBhbmQgYWJvcnQgdGhlIHBsYXkgb3BlcmF0aW9uXG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdDbGlwKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZGVvQ2xpcFBsYXllcih0aGlzLnBlbmRpbmdDbGlwLnBhdGgsIChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci52aWRlb0VsZW1lbnQubG9hZCgpOyAvLyBSZXNldHMgdGhlIG1lZGlhIGVsZW1lbnRcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5ldyBwZW5kaW5nIGNsaXAgaXMgdmlkZW8gYmVpbmcgcmVxdWVzdGVkXG4gICAgICAgIGlmICgoKF9hID0gdGhpcy5hY3RpdmVDbGlwKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucGF0aCkgIT09IHBhdGgpIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSB7IHBhdGgsIHBsYXlJZCwgYWN0aW9uT25jZVBsYXlpbmc6ICdwbGF5JyB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldHVwIGFuZCBwbGF5IHRoZSBwZW5kaW5nIGNsaXAncyBwbGF5ZXJcbiAgICAgICAgdGhpcy51cGRhdGVWaWRlb0NsaXBQbGF5ZXIocGF0aCwgKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgIGNsaXBQbGF5ZXIudm9sdW1lID0gdm9sdW1lO1xuICAgICAgICAgICAgc2V0VmlkZW9FbGVtZW50Vm9sdW1lKGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LCB2b2x1bWUgKiB0aGlzLmdsb2JhbFZvbHVtZSk7XG4gICAgICAgICAgICBjbGlwUGxheWVyLnZpZGVvRWxlbWVudC5sb29wID0gbG9vcDtcbiAgICAgICAgICAgIGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LnN0eWxlLm9iamVjdEZpdCA9IGZpdDtcbiAgICAgICAgICAgIGlmIChjbGlwUGxheWVyLnZpZGVvRWxlbWVudC5jdXJyZW50VGltZSA9PT0gY2xpcFBsYXllci52aWRlb0VsZW1lbnQuZHVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnZpZGVvRWxlbWVudC5jdXJyZW50VGltZSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjbGlwUGxheWVyLnZpZGVvRWxlbWVudC5wbGF5KCk7XG4gICAgICAgICAgICAvLyBEaXNwbGF5IHJpZ2h0IGF3YXkgaWYgdGhlcmUncyBjdXJyZW50bHkgbm8gYWN0aXZlIGNsaXBcbiAgICAgICAgICAgIGlmICghdGhpcy5hY3RpdmVDbGlwKSB7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci52aWRlb0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBhdXNlVmlkZW9DbGlwKCkge1xuICAgICAgICAvLyBQZW5kaW5nIGNsaXAgc2hvdWxkIGJlIHBhdXNlZCB3aGVuIGl0IGxvYWRzIGFuZCBiZWNvbWVzIGFjdGl2ZVxuICAgICAgICBpZiAodGhpcy5wZW5kaW5nQ2xpcCkge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcC5hY3Rpb25PbmNlUGxheWluZyA9ICdwYXVzZSc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUGF1c2UgdGhlIGN1cnJlbnRseSBhY3RpdmUgY2xpcFxuICAgICAgICBpZiAodGhpcy5hY3RpdmVDbGlwKSB7XG4gICAgICAgICAgICBjb25zdCB7IHBsYXlJZCwgcGF0aCB9ID0gdGhpcy5hY3RpdmVDbGlwO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWaWRlb0NsaXBQbGF5ZXIocGF0aCwgKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgKF9hID0gY2xpcFBsYXllci52aWRlb0VsZW1lbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wYXVzZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVyO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNsaXBTdGF0ZUxpc3RlbmVycyhwbGF5SWQsIHBhdGgsICdwYXVzZWQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdG9wVmlkZW9DbGlwKCkge1xuICAgICAgICAvLyBQZW5kaW5nIGNsaXAgc2hvdWxkIGJlIHN0b3BwZWQgd2hlbiBpdCBsb2FkcyBhbmQgYmVjb21lcyBhY3RpdmVcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0NsaXApIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0NsaXAuYWN0aW9uT25jZVBsYXlpbmcgPSAnc3RvcCc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3RvcCB0aGUgY3VycmVudGx5IGFjdGl2ZSBjbGlwXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUNsaXApIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU3RvcHBlZENsaXAodGhpcy5hY3RpdmVDbGlwLnBhdGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldFZpZGVvQ2xpcFZvbHVtZSh7IHZvbHVtZSB9KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcGVuZGluZyBjbGlwLCB0aGlzIGlzIGxhdGVzdCB0byBoYXZlIGJlZW4gcGxheWVkIHNvIHVwZGF0ZSBpdHMgdm9sdW1lXG4gICAgICAgIGNvbnN0IGNsaXBUb1VwZGF0ZSA9IChfYiA9IChfYSA9IHRoaXMucGVuZGluZ0NsaXApICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuYWN0aXZlQ2xpcCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAoIWNsaXBUb1VwZGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKHZvbHVtZSA+PSAwICYmIHZvbHVtZSA8PSAxKSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIHZvbHVtZScsIHZvbHVtZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVWaWRlb0NsaXBQbGF5ZXIoY2xpcFRvVXBkYXRlLnBhdGgsIChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2xpcFBsYXllci52aWRlb0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnZvbHVtZSA9IHZvbHVtZTtcbiAgICAgICAgICAgICAgICBzZXRWaWRlb0VsZW1lbnRWb2x1bWUoY2xpcFBsYXllci52aWRlb0VsZW1lbnQsIHZvbHVtZSAqIHRoaXMuZ2xvYmFsVm9sdW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVyO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2V0VmlkZW9DbGlwRml0KHsgZml0IH0pIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBwZW5kaW5nIGNsaXAsIHRoaXMgaXMgbGF0ZXN0IHRvIGhhdmUgYmVlbiBwbGF5ZWQgc28gdXBkYXRlIGl0cyBmaXRcbiAgICAgICAgY29uc3QgY2xpcFRvVXBkYXRlID0gKF9iID0gKF9hID0gdGhpcy5wZW5kaW5nQ2xpcCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5hY3RpdmVDbGlwKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghY2xpcFRvVXBkYXRlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVWaWRlb0NsaXBQbGF5ZXIoY2xpcFRvVXBkYXRlLnBhdGgsIChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2xpcFBsYXllci52aWRlb0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnZpZGVvRWxlbWVudC5zdHlsZS5vYmplY3RGaXQgPSBmaXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGhhbmRsZVN0b3BwZWRDbGlwKHBhdGgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIXRoaXMuYWN0aXZlQ2xpcCB8fCB0aGlzLmFjdGl2ZUNsaXAucGF0aCAhPT0gcGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBsYXlJZCA9IHRoaXMuYWN0aXZlQ2xpcC5wbGF5SWQ7XG4gICAgICAgIC8vIE9uY2UgYW4gZXBoZW1lcmFsIGNsaXAgc3RvcHMsIGNsZWFudXAgYW5kIHJlbW92ZSB0aGUgcGxheWVyXG4gICAgICAgIGlmICgoX2EgPSB0aGlzLnZpZGVvQ2xpcFBsYXllcnNbdGhpcy5hY3RpdmVDbGlwLnBhdGhdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29uZmlnLmVwaGVtZXJhbCkge1xuICAgICAgICAgICAgdGhpcy51bmxvYWRDbGlwKHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWN0aXZlQ2xpcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy51cGRhdGVWaWRlb0NsaXBQbGF5ZXIocGF0aCwgKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgIGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LnBhdXNlKCk7XG4gICAgICAgICAgICBjbGlwUGxheWVyLnZpZGVvRWxlbWVudC5jdXJyZW50VGltZSA9IDA7XG4gICAgICAgICAgICBjbGlwUGxheWVyLnZpZGVvRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXI7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm5vdGlmeUNsaXBTdGF0ZUxpc3RlbmVycyhwbGF5SWQsIHBhdGgsICdzdG9wcGVkJyk7XG4gICAgfVxuICAgIHVwZGF0ZVZpZGVvQ2xpcFBsYXllcihwYXRoLCB1cGRhdGUpIHtcbiAgICAgICAgaWYgKHRoaXMudmlkZW9DbGlwUGxheWVyc1twYXRoXSkge1xuICAgICAgICAgICAgY29uc3QgbmV3UGxheWVyID0gdXBkYXRlKHRoaXMudmlkZW9DbGlwUGxheWVyc1twYXRoXSk7XG4gICAgICAgICAgICBpZiAobmV3UGxheWVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb0NsaXBQbGF5ZXJzW3BhdGhdID0gbmV3UGxheWVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudmlkZW9DbGlwUGxheWVyc1twYXRoXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubm90aWZ5U3RhdGVMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRBdWRpb1Npbmsoc2lua0lkKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2xpcFBsYXllciBvZiBPYmplY3QudmFsdWVzKHRoaXMudmlkZW9DbGlwUGxheWVycykpIHtcbiAgICAgICAgICAgIHNldFBsYXllclNpbmtJZChjbGlwUGxheWVyLCBzaW5rSWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2lua0lkID0gc2lua0lkO1xuICAgIH1cbiAgICB1cGRhdGVDb25maWcobmV3UGF0aHMpIHtcbiAgICAgICAgY29uc3QgbmV3VmlkZW9QYXRocyA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhuZXdQYXRocykuZmlsdGVyKChbLCB7IHR5cGUgfV0pID0+IHR5cGUgPT09ICd2aWRlbycgfHwgIXR5cGUpKTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNDbGlwUGxheWVycyA9IHRoaXMudmlkZW9DbGlwUGxheWVycztcbiAgICAgICAgdGhpcy52aWRlb0NsaXBQbGF5ZXJzID0gKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNsaXBQbGF5ZXJzID0geyAuLi5wcmV2aW91c0NsaXBQbGF5ZXJzIH07XG4gICAgICAgICAgICBjb25zdCByZW1vdmVkQ2xpcHMgPSBPYmplY3Qua2V5cyhwcmV2aW91c0NsaXBQbGF5ZXJzKS5maWx0ZXIoKHByZXZpb3VzUGF0aCkgPT4gIShwcmV2aW91c1BhdGggaW4gbmV3VmlkZW9QYXRocykpO1xuICAgICAgICAgICAgcmVtb3ZlZENsaXBzLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAgICAgICAgIGlmICgoKF9hID0gdGhpcy5hY3RpdmVDbGlwKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucGF0aCkgPT09IHBhdGggJiYgKChfYiA9IHByZXZpb3VzQ2xpcFBsYXllcnNbcGF0aF0pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jb25maWcuZXBoZW1lcmFsKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVWaWRlb0NsaXBQbGF5ZXIocGF0aCwgKHBsYXllcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyLmNvbmZpZyA9IHsgLi4ucGxheWVyLmNvbmZpZywgZXBoZW1lcmFsOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheWVyO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudW5sb2FkQ2xpcChwYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNsaXBQbGF5ZXJzW3BhdGhdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgYWRkZWRDbGlwcyA9IE9iamVjdC5lbnRyaWVzKG5ld1ZpZGVvUGF0aHMpLmZpbHRlcigoW25ld0ZpbGVdKSA9PiAhcHJldmlvdXNDbGlwUGxheWVyc1tuZXdGaWxlXSk7XG4gICAgICAgICAgICBhZGRlZENsaXBzLmZvckVhY2goKFtwYXRoLCBjb25maWddKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllcnNbcGF0aF0gPSB0aGlzLmNyZWF0ZUNsaXBQbGF5ZXIocGF0aCwgeyAuLi5jb25maWcsIHByZWxvYWQ6IHByZWxvYWRTdHJpbmcoY29uZmlnLnByZWxvYWQpLCBlcGhlbWVyYWw6IGZhbHNlLCBmaXQ6ICdjb250YWluJyB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlZENsaXBzID0gT2JqZWN0LmVudHJpZXMocHJldmlvdXNDbGlwUGxheWVycykuZmlsdGVyKChbcHJldmlvdXNQYXRoXSkgPT4gcHJldmlvdXNQYXRoIGluIG5ld1ZpZGVvUGF0aHMpO1xuICAgICAgICAgICAgdXBkYXRlZENsaXBzLmZvckVhY2goKFtwYXRoLCBwcmV2aW91c0NsaXBQbGF5ZXJdKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzQ2xpcFBsYXllci5jb25maWcucHJlbG9hZCAhPT0gbmV3VmlkZW9QYXRoc1twYXRoXS5wcmVsb2FkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmlkZW9DbGlwUGxheWVyKHBhdGgsIChwbGF5ZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllci5jb25maWcgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucGxheWVyLmNvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkOiBwcmVsb2FkU3RyaW5nKG5ld1ZpZGVvUGF0aHNbcGF0aF0ucHJlbG9hZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBoZW1lcmFsOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIudmlkZW9FbGVtZW50LnByZWxvYWQgPSBwbGF5ZXIuY29uZmlnLnByZWxvYWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheWVyO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVycztcbiAgICAgICAgfSkoKTtcbiAgICAgICAgdGhpcy5ub3RpZnlTdGF0ZUxpc3RlbmVycygpO1xuICAgIH1cbiAgICBub3RpZnlTdGF0ZUxpc3RlbmVycygpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nO1xuICAgICAgICBjb25zdCBWaWRlb1N0YXRlID0ge1xuICAgICAgICAgICAgZ2xvYmFsVm9sdW1lOiB0aGlzLmdsb2JhbFZvbHVtZSxcbiAgICAgICAgICAgIGlzUGxheWluZzogdGhpcy5hY3RpdmVDbGlwID8gISgoX2EgPSB0aGlzLnZpZGVvQ2xpcFBsYXllcnNbdGhpcy5hY3RpdmVDbGlwLnBhdGhdLnZpZGVvRWxlbWVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBhdXNlZCkgOiBmYWxzZSxcbiAgICAgICAgICAgIGNsaXBzOiB7IC4uLnRoaXMudmlkZW9DbGlwUGxheWVycyB9LFxuICAgICAgICAgICAgYWN0aXZlQ2xpcDogdGhpcy5hY3RpdmVDbGlwXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IHRoaXMuYWN0aXZlQ2xpcC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogISgoX2IgPSB0aGlzLnZpZGVvQ2xpcFBsYXllcnNbdGhpcy5hY3RpdmVDbGlwLnBhdGhdLnZpZGVvRWxlbWVudCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnBhdXNlZCkgPyBWaWRlb1N0YXRlXzEuQWN0aXZlVmlkZW9DbGlwU3RhdGUuUGxheWluZyA6IFZpZGVvU3RhdGVfMS5BY3RpdmVWaWRlb0NsaXBTdGF0ZS5QYXVzZWQsXG4gICAgICAgICAgICAgICAgICAgIGxvb3A6IChfZCA9IChfYyA9IHRoaXMudmlkZW9DbGlwUGxheWVyc1t0aGlzLmFjdGl2ZUNsaXAucGF0aF0udmlkZW9FbGVtZW50KSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubG9vcCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHZvbHVtZTogKChfZSA9IHRoaXMudmlkZW9DbGlwUGxheWVyc1t0aGlzLmFjdGl2ZUNsaXAucGF0aF0udmlkZW9FbGVtZW50KSA9PT0gbnVsbCB8fCBfZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2UubXV0ZWQpID8gMFxuICAgICAgICAgICAgICAgICAgICAgICAgOiAoX2cgPSAoX2YgPSB0aGlzLnZpZGVvQ2xpcFBsYXllcnNbdGhpcy5hY3RpdmVDbGlwLnBhdGhdLnZpZGVvRWxlbWVudCkgPT09IG51bGwgfHwgX2YgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9mLnZvbHVtZSkgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogMCxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnc3RhdGUnLCBWaWRlb1N0YXRlKTtcbiAgICB9XG4gICAgbm90aWZ5Q2xpcFN0YXRlTGlzdGVuZXJzKHBsYXlJZCwgZmlsZSwgc3RhdHVzKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgndmlkZW9DbGlwU3RhdGUnLCB7IHBsYXlJZCwgbWVkaWFUeXBlOiAndmlkZW8nLCBmaWxlLCBzdGF0dXMgfSk7XG4gICAgfVxuICAgIC8vIFR5cGUtc2FmZSB3cmFwcGVyIGFyb3VuZCBFdmVudFRhcmdldFxuICAgIGFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5ldmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBkaXNwYXRjaEV2ZW50KHR5cGUsIGRldGFpbCkge1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KHR5cGUsIHsgZGV0YWlsIH0pKTtcbiAgICB9XG4gICAgY3JlYXRlVmlkZW9FbGVtZW50KHBhdGgsIGNvbmZpZywgeyB2b2x1bWUgfSkge1xuICAgICAgICBjb25zdCB2aWRlb0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgICAgICB2aWRlb0VsZW1lbnQucGxheXNJbmxpbmUgPSB0cnVlOyAvLyBSZXF1aXJlZCBmb3IgaU9TXG4gICAgICAgIHZpZGVvRWxlbWVudC5zcmMgPSB1cmxzXzEuYXNzZXRVcmwocGF0aCk7XG4gICAgICAgIHZpZGVvRWxlbWVudC5hdXRvcGxheSA9IGZhbHNlO1xuICAgICAgICB2aWRlb0VsZW1lbnQubG9vcCA9IGZhbHNlO1xuICAgICAgICBzZXRWaWRlb0VsZW1lbnRWb2x1bWUodmlkZW9FbGVtZW50LCB2b2x1bWUgKiB0aGlzLmdsb2JhbFZvbHVtZSk7XG4gICAgICAgIHZpZGVvRWxlbWVudC5wcmVsb2FkID0gY29uZmlnLnByZWxvYWQ7XG4gICAgICAgIHZpZGVvRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdwbGF5aW5nJywgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgIC8vIElmIHRoZSBjbGlwIGlzIHN0aWxsIHRoZSBwZW5kaW5nIG9uZSB3aGVuIGl0IGFjdHVhbGx5IHN0YXJ0IHBsYXlpbmcsIHRoZW4gZW5zdXJlIGl0IGlzIGluIHRoZSBjb3JyZWN0IHN0YXRlXG4gICAgICAgICAgICBpZiAoKChfYSA9IHRoaXMucGVuZGluZ0NsaXApID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wYXRoKSA9PT0gcGF0aCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5wZW5kaW5nQ2xpcC5hY3Rpb25PbmNlUGxheWluZykge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdwbGF5Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udGludWUgcGxheWluZywgc2hvdyB0aGUgdmlkZW8gZWxlbWVudCwgYW5kIG5vdGlmeSBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2xpcFN0YXRlTGlzdGVuZXJzKHRoaXMucGVuZGluZ0NsaXAucGxheUlkLCBwYXRoLCAncGxheWluZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncGF1c2UnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXVzZSBwbGF5YmFjaywgc2hvdyB0aGUgdmlkZW8gZWxlbWVudCwgYW5kIG5vdGlmeSBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnModGhpcy5wZW5kaW5nQ2xpcC5wbGF5SWQsIHBhdGgsICdwYXVzZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N0b3AnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXVzZSBwbGF5YmFjaywgbGVhdmUgdGhlIHZpZGVvIGVsZW1lbnQgaGlkZGVuLCBhbmQgbm90aWZ5IGxpc3RlbmVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50LnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNsaXBTdGF0ZUxpc3RlbmVycyh0aGlzLnBlbmRpbmdDbGlwLnBsYXlJZCwgcGF0aCwgJ3N0b3BwZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIHdhcyBhIHByZXZpb3VzbHkgYWN0aXZlIGNsaXAsIHRoZW4gc3RvcCBpdFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZUNsaXApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdG9wcGVkQ2xpcCh0aGlzLmFjdGl2ZUNsaXAucGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2xpcCA9IHRoaXMucGVuZGluZ0NsaXA7XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCgoX2IgPSB0aGlzLmFjdGl2ZUNsaXApID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5wYXRoKSA9PT0gcGF0aCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHdlIHdlcmUgdGhlIGFjdGl2ZSBjbGlwIHRoZW4ganVzdCBub3RpZnkgbGlzdGVuZXJzIHRoYXQgd2UgYXJlIG5vdyBwbGF5aW5nXG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnModGhpcy5hY3RpdmVDbGlwLnBsYXlJZCwgcGF0aCwgJ3BsYXlpbmcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBpdCBzaG91bGRuJ3QgYmUgcGxheWluZywgbGlrZSBiZWNhdXNlIGFub3RoZXIgY2xpcCBiZWNhbWUgcGVuZGluZyBiZWZvcmUgd2UgbG9hZGVkLFxuICAgICAgICAgICAgICAgIC8vIHNvIHdlIHBhdXNlIGFuZCBkb24ndCBzaG93IG9yIG5vdGlmeSBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICB2aWRlb0VsZW1lbnQucGF1c2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHZpZGVvRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdlbmRlZCcsICgpID0+IHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBpZiB0aGVyZSdzIGEgcGVuZGluZyBjbGlwLCBhcyBvbmNlIHRoYXQgc3RhcnRzIHBsYXlpbmcgdGhlIGFjdGl2ZSBjbGlwIHdpbGwgYmUgc3RvcHBlZFxuICAgICAgICAgICAgLy8gQWxzbyBpZ25vcmUgaWYgdGhlIHZpZGVvIGlzIHNldCB0byBsb29wXG4gICAgICAgICAgICBpZiAoIXRoaXMucGVuZGluZ0NsaXAgJiYgIXZpZGVvRWxlbWVudC5sb29wKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdG9wcGVkQ2xpcChwYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHZpZGVvRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIHZpZGVvRWxlbWVudC5zdHlsZS50b3AgPSAnMCc7XG4gICAgICAgIHZpZGVvRWxlbWVudC5zdHlsZS5sZWZ0ID0gJzAnO1xuICAgICAgICB2aWRlb0VsZW1lbnQuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICAgIHZpZGVvRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG4gICAgICAgIHZpZGVvRWxlbWVudC5zdHlsZS5vYmplY3RGaXQgPSBjb25maWcuZml0O1xuICAgICAgICB2aWRlb0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKHZpZGVvRWxlbWVudCk7XG4gICAgICAgIHJldHVybiB2aWRlb0VsZW1lbnQ7XG4gICAgfVxuICAgIGNyZWF0ZUNsaXBQbGF5ZXIocGF0aCwgY29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHZvbHVtZSA9IDE7XG4gICAgICAgIGNvbnN0IHBsYXllciA9IHtcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIHZpZGVvRWxlbWVudDogdGhpcy5jcmVhdGVWaWRlb0VsZW1lbnQocGF0aCwgY29uZmlnLCB7IHZvbHVtZSB9KSxcbiAgICAgICAgICAgIHZvbHVtZSxcbiAgICAgICAgfTtcbiAgICAgICAgc2V0UGxheWVyU2lua0lkKHBsYXllciwgdGhpcy5zaW5rSWQpO1xuICAgICAgICByZXR1cm4gcGxheWVyO1xuICAgIH1cbiAgICB1bmxvYWRDbGlwKHBhdGgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgaWYgKCgoX2EgPSB0aGlzLmFjdGl2ZUNsaXApID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wYXRoKSA9PT0gcGF0aCkge1xuICAgICAgICAgICAgY29uc3QgcGxheUlkID0gdGhpcy5hY3RpdmVDbGlwLnBsYXlJZDtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2xpcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2xpcFN0YXRlTGlzdGVuZXJzKHBsYXlJZCwgcGF0aCwgJ3N0b3BwZWQnKTtcbiAgICAgICAgfVxuICAgICAgICAoX2IgPSB0aGlzLnZpZGVvQ2xpcFBsYXllcnNbcGF0aF0pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi52aWRlb0VsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMudXBkYXRlVmlkZW9DbGlwUGxheWVyKHBhdGgsICgpID0+IG51bGwpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFZpZGVvUGxheWVyO1xuZnVuY3Rpb24gcHJlbG9hZFN0cmluZyhwcmVsb2FkKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBwcmVsb2FkID09PSAnc3RyaW5nJyA/IHByZWxvYWQgOiBwcmVsb2FkID8gJ2F1dG8nIDogJ25vbmUnO1xufVxuZnVuY3Rpb24gc2V0UGxheWVyU2lua0lkKHBsYXllciwgc2lua0lkKSB7XG4gICAgaWYgKHNpbmtJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwbGF5ZXIudmlkZW9FbGVtZW50LnNldFNpbmtJZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwbGF5ZXIudmlkZW9FbGVtZW50LnNldFNpbmtJZChzaW5rSWQpO1xuICAgIH1cbn1cbi8qKlxuICogU2V0IHZpZGVvIHZvbHVtZVxuICpcbiAqIFRoaXMgZG9lc24ndCB3b3JrIG9uIGlPUyAodm9sdW1lIGlzIHJlYWQtb25seSkgc28gYXQgbGVhc3QgbXV0ZSBpdCBpZiB0aGUgdm9sdW1lIGlzIHplcm9cbiAqL1xuZnVuY3Rpb24gc2V0VmlkZW9FbGVtZW50Vm9sdW1lKHZpZGVvRWxlbWVudCwgdm9sdW1lKSB7XG4gICAgdmlkZW9FbGVtZW50LnZvbHVtZSA9IHZvbHVtZTtcbiAgICB2aWRlb0VsZW1lbnQubXV0ZWQgPSB2b2x1bWUgPT09IDA7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucHJlbG9hZFVybCA9IGV4cG9ydHMuYXNzZXRVcmwgPSBleHBvcnRzLkNPR1NfU0VSVkVSX1BPUlQgPSB2b2lkIDA7XG5leHBvcnRzLkNPR1NfU0VSVkVSX1BPUlQgPSAxMjA5NTtcbmZ1bmN0aW9uIGFzc2V0VXJsKGZpbGUpIHtcbiAgICBjb25zdCBsb2NhdGlvbiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93LmxvY2F0aW9uIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBgJHtsb2NhdGlvbiA9PT0gbnVsbCB8fCBsb2NhdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogbG9jYXRpb24ucHJvdG9jb2x9Ly8ke2xvY2F0aW9uID09PSBudWxsIHx8IGxvY2F0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsb2NhdGlvbi5ob3N0bmFtZX06JHtleHBvcnRzLkNPR1NfU0VSVkVSX1BPUlR9L2Fzc2V0cy8ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlKX1gO1xufVxuZXhwb3J0cy5hc3NldFVybCA9IGFzc2V0VXJsO1xuYXN5bmMgZnVuY3Rpb24gcHJlbG9hZFVybCh1cmwpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgLy8gV2UgdXNlZCBhcnJheUJ1ZmZlcigpYCBpbnN0ZWFkIG9mIGBibG9iKClgIGJlY2F1c2UgdGhlIGxhdHRlciBzZWVtcyB0byBmYWlsIG9uIFBpcyB3aGVuIHByZWxvYWRpbmcgc29tZSBmaWxlc1xuICAgIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFthd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpXSkpO1xufVxuZXhwb3J0cy5wcmVsb2FkVXJsID0gcHJlbG9hZFVybDtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnByZWxvYWRVcmwgPSBleHBvcnRzLmFzc2V0VXJsID0gZXhwb3J0cy5Db2dzVmlkZW9QbGF5ZXIgPSBleHBvcnRzLkxJVkVfVklERU9fUExBWUJBQ0tfUkFURSA9IGV4cG9ydHMuQ29nc1J0c3BTdHJlYW1lciA9IGV4cG9ydHMuQ29nc0F1ZGlvUGxheWVyID0gZXhwb3J0cy5Db2dzQ29ubmVjdGlvbiA9IHZvaWQgMDtcbnZhciBDb2dzQ29ubmVjdGlvbl8xID0gcmVxdWlyZShcIi4vQ29nc0Nvbm5lY3Rpb25cIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb2dzQ29ubmVjdGlvblwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gX19pbXBvcnREZWZhdWx0KENvZ3NDb25uZWN0aW9uXzEpLmRlZmF1bHQ7IH0gfSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vdHlwZXMvdmFsdWVUeXBlc1wiKSwgZXhwb3J0cyk7XG52YXIgQXVkaW9QbGF5ZXJfMSA9IHJlcXVpcmUoXCIuL0F1ZGlvUGxheWVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29nc0F1ZGlvUGxheWVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2ltcG9ydERlZmF1bHQoQXVkaW9QbGF5ZXJfMSkuZGVmYXVsdDsgfSB9KTtcbnZhciBSdHNwU3RyZWFtZXJfMSA9IHJlcXVpcmUoXCIuL1J0c3BTdHJlYW1lclwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvZ3NSdHNwU3RyZWFtZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9faW1wb3J0RGVmYXVsdChSdHNwU3RyZWFtZXJfMSkuZGVmYXVsdDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxJVkVfVklERU9fUExBWUJBQ0tfUkFURVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gUnRzcFN0cmVhbWVyXzEuTElWRV9WSURFT19QTEFZQkFDS19SQVRFOyB9IH0pO1xudmFyIFZpZGVvUGxheWVyXzEgPSByZXF1aXJlKFwiLi9WaWRlb1BsYXllclwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvZ3NWaWRlb1BsYXllclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gX19pbXBvcnREZWZhdWx0KFZpZGVvUGxheWVyXzEpLmRlZmF1bHQ7IH0gfSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vdHlwZXMvQXVkaW9TdGF0ZVwiKSwgZXhwb3J0cyk7XG52YXIgdXJsc18xID0gcmVxdWlyZShcIi4vaGVscGVycy91cmxzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiYXNzZXRVcmxcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVybHNfMS5hc3NldFVybDsgfSB9KTtcbnZhciB1cmxzXzIgPSByZXF1aXJlKFwiLi9oZWxwZXJzL3VybHNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJwcmVsb2FkVXJsXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB1cmxzXzIucHJlbG9hZFVybDsgfSB9KTtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFjdGl2ZVZpZGVvQ2xpcFN0YXRlID0gdm9pZCAwO1xudmFyIEFjdGl2ZVZpZGVvQ2xpcFN0YXRlO1xuKGZ1bmN0aW9uIChBY3RpdmVWaWRlb0NsaXBTdGF0ZSkge1xuICAgIEFjdGl2ZVZpZGVvQ2xpcFN0YXRlW1wiUGF1c2VkXCJdID0gXCJwYXVzZWRcIjtcbiAgICBBY3RpdmVWaWRlb0NsaXBTdGF0ZVtcIlBsYXlpbmdcIl0gPSBcInBsYXlpbmdcIjtcbn0pKEFjdGl2ZVZpZGVvQ2xpcFN0YXRlID0gZXhwb3J0cy5BY3RpdmVWaWRlb0NsaXBTdGF0ZSB8fCAoZXhwb3J0cy5BY3RpdmVWaWRlb0NsaXBTdGF0ZSA9IHt9KSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU2hvd1BoYXNlID0gdm9pZCAwO1xudmFyIFNob3dQaGFzZTtcbihmdW5jdGlvbiAoU2hvd1BoYXNlKSB7XG4gICAgU2hvd1BoYXNlW1wiU2V0dXBcIl0gPSBcInNldHVwXCI7XG4gICAgU2hvd1BoYXNlW1wiUHJlc2hvd1wiXSA9IFwicHJlLXNob3dcIjtcbiAgICBTaG93UGhhc2VbXCJJblByb2dyZXNzXCJdID0gXCJpbiBwcm9ncmVzc1wiO1xuICAgIFNob3dQaGFzZVtcIkZpbmlzaGVkXCJdID0gXCJmaW5pc2hlZFwiO1xufSkoU2hvd1BoYXNlID0gZXhwb3J0cy5TaG93UGhhc2UgfHwgKGV4cG9ydHMuU2hvd1BoYXNlID0ge30pKTtcbiIsInZhciBmYT1PYmplY3QuY3JlYXRlO3ZhciBGdD1PYmplY3QuZGVmaW5lUHJvcGVydHk7dmFyIGNhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7dmFyIGxhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzO3ZhciBkYT1PYmplY3QuZ2V0UHJvdG90eXBlT2YscGE9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgaGE9KHIsZSk9PigpPT4ociYmKGU9cihyPTApKSxlKTt2YXIgUz0ocixlKT0+KCk9PihlfHxyKChlPXtleHBvcnRzOnt9fSkuZXhwb3J0cyxlKSxlLmV4cG9ydHMpLFB0PShyLGUpPT57Zm9yKHZhciB0IGluIGUpRnQocix0LHtnZXQ6ZVt0XSxlbnVtZXJhYmxlOiEwfSl9LHNpPShyLGUsdCxuKT0+e2lmKGUmJnR5cGVvZiBlPT1cIm9iamVjdFwifHx0eXBlb2YgZT09XCJmdW5jdGlvblwiKWZvcihsZXQgaSBvZiBsYShlKSkhcGEuY2FsbChyLGkpJiZpIT09dCYmRnQocixpLHtnZXQ6KCk9PmVbaV0sZW51bWVyYWJsZTohKG49Y2EoZSxpKSl8fG4uZW51bWVyYWJsZX0pO3JldHVybiByfTt2YXIgQz0ocixlLHQpPT4odD1yIT1udWxsP2ZhKGRhKHIpKTp7fSxzaShlfHwhcnx8IXIuX19lc01vZHVsZT9GdCh0LFwiZGVmYXVsdFwiLHt2YWx1ZTpyLGVudW1lcmFibGU6ITB9KTp0LHIpKSxtYT1yPT5zaShGdCh7fSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxyKTt2YXIgZmk9UyhrdD0+e1widXNlIHN0cmljdFwiO2MoKTtrdC5ieXRlTGVuZ3RoPXlhO2t0LnRvQnl0ZUFycmF5PXhhO2t0LmZyb21CeXRlQXJyYXk9dmE7dmFyIG5lPVtdLEs9W10sZ2E9dHlwZW9mIFVpbnQ4QXJyYXk8XCJ1XCI/VWludDhBcnJheTpBcnJheSxWcj1cIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky9cIjtmb3IoRmU9MCxhaT1Wci5sZW5ndGg7RmU8YWk7KytGZSluZVtGZV09VnJbRmVdLEtbVnIuY2hhckNvZGVBdChGZSldPUZlO3ZhciBGZSxhaTtLW1wiLVwiLmNoYXJDb2RlQXQoMCldPTYyO0tbXCJfXCIuY2hhckNvZGVBdCgwKV09NjM7ZnVuY3Rpb24gdWkocil7dmFyIGU9ci5sZW5ndGg7aWYoZSU0PjApdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNFwiKTt2YXIgdD1yLmluZGV4T2YoXCI9XCIpO3Q9PT0tMSYmKHQ9ZSk7dmFyIG49dD09PWU/MDo0LXQlNDtyZXR1cm5bdCxuXX1mdW5jdGlvbiB5YShyKXt2YXIgZT11aShyKSx0PWVbMF0sbj1lWzFdO3JldHVybih0K24pKjMvNC1ufWZ1bmN0aW9uIGJhKHIsZSx0KXtyZXR1cm4oZSt0KSozLzQtdH1mdW5jdGlvbiB4YShyKXt2YXIgZSx0PXVpKHIpLG49dFswXSxpPXRbMV0sbz1uZXcgZ2EoYmEocixuLGkpKSxzPTAsYT1pPjA/bi00Om4sdTtmb3IodT0wO3U8YTt1Kz00KWU9S1tyLmNoYXJDb2RlQXQodSldPDwxOHxLW3IuY2hhckNvZGVBdCh1KzEpXTw8MTJ8S1tyLmNoYXJDb2RlQXQodSsyKV08PDZ8S1tyLmNoYXJDb2RlQXQodSszKV0sb1tzKytdPWU+PjE2JjI1NSxvW3MrK109ZT4+OCYyNTUsb1tzKytdPWUmMjU1O3JldHVybiBpPT09MiYmKGU9S1tyLmNoYXJDb2RlQXQodSldPDwyfEtbci5jaGFyQ29kZUF0KHUrMSldPj40LG9bcysrXT1lJjI1NSksaT09PTEmJihlPUtbci5jaGFyQ29kZUF0KHUpXTw8MTB8S1tyLmNoYXJDb2RlQXQodSsxKV08PDR8S1tyLmNoYXJDb2RlQXQodSsyKV0+PjIsb1tzKytdPWU+PjgmMjU1LG9bcysrXT1lJjI1NSksb31mdW5jdGlvbiBfYShyKXtyZXR1cm4gbmVbcj4+MTgmNjNdK25lW3I+PjEyJjYzXStuZVtyPj42JjYzXStuZVtyJjYzXX1mdW5jdGlvbiB3YShyLGUsdCl7Zm9yKHZhciBuLGk9W10sbz1lO288dDtvKz0zKW49KHJbb108PDE2JjE2NzExNjgwKSsocltvKzFdPDw4JjY1MjgwKSsocltvKzJdJjI1NSksaS5wdXNoKF9hKG4pKTtyZXR1cm4gaS5qb2luKFwiXCIpfWZ1bmN0aW9uIHZhKHIpe2Zvcih2YXIgZSx0PXIubGVuZ3RoLG49dCUzLGk9W10sbz0xNjM4MyxzPTAsYT10LW47czxhO3MrPW8paS5wdXNoKHdhKHIscyxzK28+YT9hOnMrbykpO3JldHVybiBuPT09MT8oZT1yW3QtMV0saS5wdXNoKG5lW2U+PjJdK25lW2U8PDQmNjNdK1wiPT1cIikpOm49PT0yJiYoZT0oclt0LTJdPDw4KStyW3QtMV0saS5wdXNoKG5lW2U+PjEwXStuZVtlPj40JjYzXStuZVtlPDwyJjYzXStcIj1cIikpLGkuam9pbihcIlwiKX19KTt2YXIgY2k9Uyh6cj0+e2MoKTt6ci5yZWFkPWZ1bmN0aW9uKHIsZSx0LG4saSl7dmFyIG8scyxhPWkqOC1uLTEsdT0oMTw8YSktMSxmPXU+PjEsbD0tNyxkPXQ/aS0xOjAsaD10Py0xOjEsbT1yW2UrZF07Zm9yKGQrPWgsbz1tJigxPDwtbCktMSxtPj49LWwsbCs9YTtsPjA7bz1vKjI1NityW2UrZF0sZCs9aCxsLT04KTtmb3Iocz1vJigxPDwtbCktMSxvPj49LWwsbCs9bjtsPjA7cz1zKjI1NityW2UrZF0sZCs9aCxsLT04KTtpZihvPT09MClvPTEtZjtlbHNle2lmKG89PT11KXJldHVybiBzP05hTjoobT8tMToxKSooMS8wKTtzPXMrTWF0aC5wb3coMixuKSxvPW8tZn1yZXR1cm4obT8tMToxKSpzKk1hdGgucG93KDIsby1uKX07enIud3JpdGU9ZnVuY3Rpb24ocixlLHQsbixpLG8pe3ZhciBzLGEsdSxmPW8qOC1pLTEsbD0oMTw8ZiktMSxkPWw+PjEsaD1pPT09MjM/TWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLG09bj8wOm8tMSxiPW4/MTotMSx5PWU8MHx8ZT09PTAmJjEvZTwwPzE6MDtmb3IoZT1NYXRoLmFicyhlKSxpc05hTihlKXx8ZT09PTEvMD8oYT1pc05hTihlKT8xOjAscz1sKToocz1NYXRoLmZsb29yKE1hdGgubG9nKGUpL01hdGguTE4yKSxlKih1PU1hdGgucG93KDIsLXMpKTwxJiYocy0tLHUqPTIpLHMrZD49MT9lKz1oL3U6ZSs9aCpNYXRoLnBvdygyLDEtZCksZSp1Pj0yJiYocysrLHUvPTIpLHMrZD49bD8oYT0wLHM9bCk6cytkPj0xPyhhPShlKnUtMSkqTWF0aC5wb3coMixpKSxzPXMrZCk6KGE9ZSpNYXRoLnBvdygyLGQtMSkqTWF0aC5wb3coMixpKSxzPTApKTtpPj04O3JbdCttXT1hJjI1NSxtKz1iLGEvPTI1NixpLT04KTtmb3Iocz1zPDxpfGEsZis9aTtmPjA7clt0K21dPXMmMjU1LG0rPWIscy89MjU2LGYtPTgpO3JbdCttLWJdfD15KjEyOH19KTt2YXIgWGU9UyhLZT0+e1widXNlIHN0cmljdFwiO2MoKTt2YXIgWXI9ZmkoKSx6ZT1jaSgpLGxpPXR5cGVvZiBTeW1ib2w9PVwiZnVuY3Rpb25cIiYmdHlwZW9mIFN5bWJvbC5mb3I9PVwiZnVuY3Rpb25cIj9TeW1ib2wuZm9yKFwibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b21cIik6bnVsbDtLZS5CdWZmZXI9cDtLZS5TbG93QnVmZmVyPUJhO0tlLklOU1BFQ1RfTUFYX0JZVEVTPTUwO3ZhciBPdD0yMTQ3NDgzNjQ3O0tlLmtNYXhMZW5ndGg9T3Q7cC5UWVBFRF9BUlJBWV9TVVBQT1JUPUVhKCk7IXAuVFlQRURfQVJSQVlfU1VQUE9SVCYmdHlwZW9mIGNvbnNvbGU8XCJ1XCImJnR5cGVvZiBjb25zb2xlLmVycm9yPT1cImZ1bmN0aW9uXCImJmNvbnNvbGUuZXJyb3IoXCJUaGlzIGJyb3dzZXIgbGFja3MgdHlwZWQgYXJyYXkgKFVpbnQ4QXJyYXkpIHN1cHBvcnQgd2hpY2ggaXMgcmVxdWlyZWQgYnkgYGJ1ZmZlcmAgdjUueC4gVXNlIGBidWZmZXJgIHY0LnggaWYgeW91IHJlcXVpcmUgb2xkIGJyb3dzZXIgc3VwcG9ydC5cIik7ZnVuY3Rpb24gRWEoKXt0cnl7bGV0IHI9bmV3IFVpbnQ4QXJyYXkoMSksZT17Zm9vOmZ1bmN0aW9uKCl7cmV0dXJuIDQyfX07cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZihlLFVpbnQ4QXJyYXkucHJvdG90eXBlKSxPYmplY3Quc2V0UHJvdG90eXBlT2YocixlKSxyLmZvbygpPT09NDJ9Y2F0Y2h7cmV0dXJuITF9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShwLnByb3RvdHlwZSxcInBhcmVudFwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2lmKCEhcC5pc0J1ZmZlcih0aGlzKSlyZXR1cm4gdGhpcy5idWZmZXJ9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHAucHJvdG90eXBlLFwib2Zmc2V0XCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7aWYoISFwLmlzQnVmZmVyKHRoaXMpKXJldHVybiB0aGlzLmJ5dGVPZmZzZXR9fSk7ZnVuY3Rpb24gZGUocil7aWYocj5PdCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJytyKydcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKTtsZXQgZT1uZXcgVWludDhBcnJheShyKTtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKGUscC5wcm90b3R5cGUpLGV9ZnVuY3Rpb24gcChyLGUsdCl7aWYodHlwZW9mIHI9PVwibnVtYmVyXCIpe2lmKHR5cGVvZiBlPT1cInN0cmluZ1wiKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInN0cmluZ1wiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJyk7cmV0dXJuIFFyKHIpfXJldHVybiBtaShyLGUsdCl9cC5wb29sU2l6ZT04MTkyO2Z1bmN0aW9uIG1pKHIsZSx0KXtpZih0eXBlb2Ygcj09XCJzdHJpbmdcIilyZXR1cm4gUmEocixlKTtpZihBcnJheUJ1ZmZlci5pc1ZpZXcocikpcmV0dXJuIFRhKHIpO2lmKHI9PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlIFwiK3R5cGVvZiByKTtpZihpZShyLEFycmF5QnVmZmVyKXx8ciYmaWUoci5idWZmZXIsQXJyYXlCdWZmZXIpfHx0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXI8XCJ1XCImJihpZShyLFNoYXJlZEFycmF5QnVmZmVyKXx8ciYmaWUoci5idWZmZXIsU2hhcmVkQXJyYXlCdWZmZXIpKSlyZXR1cm4gWHIocixlLHQpO2lmKHR5cGVvZiByPT1cIm51bWJlclwiKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJyk7bGV0IG49ci52YWx1ZU9mJiZyLnZhbHVlT2YoKTtpZihuIT1udWxsJiZuIT09cilyZXR1cm4gcC5mcm9tKG4sZSx0KTtsZXQgaT1DYShyKTtpZihpKXJldHVybiBpO2lmKHR5cGVvZiBTeW1ib2w8XCJ1XCImJlN5bWJvbC50b1ByaW1pdGl2ZSE9bnVsbCYmdHlwZW9mIHJbU3ltYm9sLnRvUHJpbWl0aXZlXT09XCJmdW5jdGlvblwiKXJldHVybiBwLmZyb20ocltTeW1ib2wudG9QcmltaXRpdmVdKFwic3RyaW5nXCIpLGUsdCk7dGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlIFwiK3R5cGVvZiByKX1wLmZyb209ZnVuY3Rpb24ocixlLHQpe3JldHVybiBtaShyLGUsdCl9O09iamVjdC5zZXRQcm90b3R5cGVPZihwLnByb3RvdHlwZSxVaW50OEFycmF5LnByb3RvdHlwZSk7T2JqZWN0LnNldFByb3RvdHlwZU9mKHAsVWludDhBcnJheSk7ZnVuY3Rpb24gZ2kocil7aWYodHlwZW9mIHIhPVwibnVtYmVyXCIpdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlcicpO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJytyKydcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKX1mdW5jdGlvbiBTYShyLGUsdCl7cmV0dXJuIGdpKHIpLHI8PTA/ZGUocik6ZSE9PXZvaWQgMD90eXBlb2YgdD09XCJzdHJpbmdcIj9kZShyKS5maWxsKGUsdCk6ZGUocikuZmlsbChlKTpkZShyKX1wLmFsbG9jPWZ1bmN0aW9uKHIsZSx0KXtyZXR1cm4gU2EocixlLHQpfTtmdW5jdGlvbiBRcihyKXtyZXR1cm4gZ2kociksZGUocjwwPzA6WnIocil8MCl9cC5hbGxvY1Vuc2FmZT1mdW5jdGlvbihyKXtyZXR1cm4gUXIocil9O3AuYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKHIpe3JldHVybiBRcihyKX07ZnVuY3Rpb24gUmEocixlKXtpZigodHlwZW9mIGUhPVwic3RyaW5nXCJ8fGU9PT1cIlwiKSYmKGU9XCJ1dGY4XCIpLCFwLmlzRW5jb2RpbmcoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlVua25vd24gZW5jb2Rpbmc6IFwiK2UpO2xldCB0PXlpKHIsZSl8MCxuPWRlKHQpLGk9bi53cml0ZShyLGUpO3JldHVybiBpIT09dCYmKG49bi5zbGljZSgwLGkpKSxufWZ1bmN0aW9uIEtyKHIpe2xldCBlPXIubGVuZ3RoPDA/MDpacihyLmxlbmd0aCl8MCx0PWRlKGUpO2ZvcihsZXQgbj0wO248ZTtuKz0xKXRbbl09cltuXSYyNTU7cmV0dXJuIHR9ZnVuY3Rpb24gVGEocil7aWYoaWUocixVaW50OEFycmF5KSl7bGV0IGU9bmV3IFVpbnQ4QXJyYXkocik7cmV0dXJuIFhyKGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpfXJldHVybiBLcihyKX1mdW5jdGlvbiBYcihyLGUsdCl7aWYoZTwwfHxyLmJ5dGVMZW5ndGg8ZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJvZmZzZXRcIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKTtpZihyLmJ5dGVMZW5ndGg8ZSsodHx8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wibGVuZ3RoXCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJyk7bGV0IG47cmV0dXJuIGU9PT12b2lkIDAmJnQ9PT12b2lkIDA/bj1uZXcgVWludDhBcnJheShyKTp0PT09dm9pZCAwP249bmV3IFVpbnQ4QXJyYXkocixlKTpuPW5ldyBVaW50OEFycmF5KHIsZSx0KSxPYmplY3Quc2V0UHJvdG90eXBlT2YobixwLnByb3RvdHlwZSksbn1mdW5jdGlvbiBDYShyKXtpZihwLmlzQnVmZmVyKHIpKXtsZXQgZT1acihyLmxlbmd0aCl8MCx0PWRlKGUpO3JldHVybiB0Lmxlbmd0aD09PTB8fHIuY29weSh0LDAsMCxlKSx0fWlmKHIubGVuZ3RoIT09dm9pZCAwKXJldHVybiB0eXBlb2Ygci5sZW5ndGghPVwibnVtYmVyXCJ8fHRuKHIubGVuZ3RoKT9kZSgwKTpLcihyKTtpZihyLnR5cGU9PT1cIkJ1ZmZlclwiJiZBcnJheS5pc0FycmF5KHIuZGF0YSkpcmV0dXJuIEtyKHIuZGF0YSl9ZnVuY3Rpb24gWnIocil7aWYocj49T3QpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemU6IDB4XCIrT3QudG9TdHJpbmcoMTYpK1wiIGJ5dGVzXCIpO3JldHVybiByfDB9ZnVuY3Rpb24gQmEocil7cmV0dXJuK3IhPXImJihyPTApLHAuYWxsb2MoK3IpfXAuaXNCdWZmZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPW51bGwmJmUuX2lzQnVmZmVyPT09ITAmJmUhPT1wLnByb3RvdHlwZX07cC5jb21wYXJlPWZ1bmN0aW9uKGUsdCl7aWYoaWUoZSxVaW50OEFycmF5KSYmKGU9cC5mcm9tKGUsZS5vZmZzZXQsZS5ieXRlTGVuZ3RoKSksaWUodCxVaW50OEFycmF5KSYmKHQ9cC5mcm9tKHQsdC5vZmZzZXQsdC5ieXRlTGVuZ3RoKSksIXAuaXNCdWZmZXIoZSl8fCFwLmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImJ1ZjFcIiwgXCJidWYyXCIgYXJndW1lbnRzIG11c3QgYmUgb25lIG9mIHR5cGUgQnVmZmVyIG9yIFVpbnQ4QXJyYXknKTtpZihlPT09dClyZXR1cm4gMDtsZXQgbj1lLmxlbmd0aCxpPXQubGVuZ3RoO2ZvcihsZXQgbz0wLHM9TWF0aC5taW4obixpKTtvPHM7KytvKWlmKGVbb10hPT10W29dKXtuPWVbb10saT10W29dO2JyZWFrfXJldHVybiBuPGk/LTE6aTxuPzE6MH07cC5pc0VuY29kaW5nPWZ1bmN0aW9uKGUpe3N3aXRjaChTdHJpbmcoZSkudG9Mb3dlckNhc2UoKSl7Y2FzZVwiaGV4XCI6Y2FzZVwidXRmOFwiOmNhc2VcInV0Zi04XCI6Y2FzZVwiYXNjaWlcIjpjYXNlXCJsYXRpbjFcIjpjYXNlXCJiaW5hcnlcIjpjYXNlXCJiYXNlNjRcIjpjYXNlXCJ1Y3MyXCI6Y2FzZVwidWNzLTJcIjpjYXNlXCJ1dGYxNmxlXCI6Y2FzZVwidXRmLTE2bGVcIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX07cC5jb25jYXQ9ZnVuY3Rpb24oZSx0KXtpZighQXJyYXkuaXNBcnJheShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZihlLmxlbmd0aD09PTApcmV0dXJuIHAuYWxsb2MoMCk7bGV0IG47aWYodD09PXZvaWQgMClmb3IodD0wLG49MDtuPGUubGVuZ3RoOysrbil0Kz1lW25dLmxlbmd0aDtsZXQgaT1wLmFsbG9jVW5zYWZlKHQpLG89MDtmb3Iobj0wO248ZS5sZW5ndGg7KytuKXtsZXQgcz1lW25dO2lmKGllKHMsVWludDhBcnJheSkpbytzLmxlbmd0aD5pLmxlbmd0aD8ocC5pc0J1ZmZlcihzKXx8KHM9cC5mcm9tKHMpKSxzLmNvcHkoaSxvKSk6VWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoaSxzLG8pO2Vsc2UgaWYocC5pc0J1ZmZlcihzKSlzLmNvcHkoaSxvKTtlbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO28rPXMubGVuZ3RofXJldHVybiBpfTtmdW5jdGlvbiB5aShyLGUpe2lmKHAuaXNCdWZmZXIocikpcmV0dXJuIHIubGVuZ3RoO2lmKEFycmF5QnVmZmVyLmlzVmlldyhyKXx8aWUocixBcnJheUJ1ZmZlcikpcmV0dXJuIHIuYnl0ZUxlbmd0aDtpZih0eXBlb2YgciE9XCJzdHJpbmdcIil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJzdHJpbmdcIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBvciBBcnJheUJ1ZmZlci4gUmVjZWl2ZWQgdHlwZSAnK3R5cGVvZiByKTtsZXQgdD1yLmxlbmd0aCxuPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdPT09ITA7aWYoIW4mJnQ9PT0wKXJldHVybiAwO2xldCBpPSExO2Zvcig7Oylzd2l0Y2goZSl7Y2FzZVwiYXNjaWlcIjpjYXNlXCJsYXRpbjFcIjpjYXNlXCJiaW5hcnlcIjpyZXR1cm4gdDtjYXNlXCJ1dGY4XCI6Y2FzZVwidXRmLThcIjpyZXR1cm4gSnIocikubGVuZ3RoO2Nhc2VcInVjczJcIjpjYXNlXCJ1Y3MtMlwiOmNhc2VcInV0ZjE2bGVcIjpjYXNlXCJ1dGYtMTZsZVwiOnJldHVybiB0KjI7Y2FzZVwiaGV4XCI6cmV0dXJuIHQ+Pj4xO2Nhc2VcImJhc2U2NFwiOnJldHVybiBUaShyKS5sZW5ndGg7ZGVmYXVsdDppZihpKXJldHVybiBuPy0xOkpyKHIpLmxlbmd0aDtlPShcIlwiK2UpLnRvTG93ZXJDYXNlKCksaT0hMH19cC5ieXRlTGVuZ3RoPXlpO2Z1bmN0aW9uIE1hKHIsZSx0KXtsZXQgbj0hMTtpZigoZT09PXZvaWQgMHx8ZTwwKSYmKGU9MCksZT50aGlzLmxlbmd0aHx8KCh0PT09dm9pZCAwfHx0PnRoaXMubGVuZ3RoKSYmKHQ9dGhpcy5sZW5ndGgpLHQ8PTApfHwodD4+Pj0wLGU+Pj49MCx0PD1lKSlyZXR1cm5cIlwiO2ZvcihyfHwocj1cInV0ZjhcIik7Oylzd2l0Y2gocil7Y2FzZVwiaGV4XCI6cmV0dXJuIE5hKHRoaXMsZSx0KTtjYXNlXCJ1dGY4XCI6Y2FzZVwidXRmLThcIjpyZXR1cm4geGkodGhpcyxlLHQpO2Nhc2VcImFzY2lpXCI6cmV0dXJuIFVhKHRoaXMsZSx0KTtjYXNlXCJsYXRpbjFcIjpjYXNlXCJiaW5hcnlcIjpyZXR1cm4gRGEodGhpcyxlLHQpO2Nhc2VcImJhc2U2NFwiOnJldHVybiBrYSh0aGlzLGUsdCk7Y2FzZVwidWNzMlwiOmNhc2VcInVjcy0yXCI6Y2FzZVwidXRmMTZsZVwiOmNhc2VcInV0Zi0xNmxlXCI6cmV0dXJuIEhhKHRoaXMsZSx0KTtkZWZhdWx0OmlmKG4pdGhyb3cgbmV3IFR5cGVFcnJvcihcIlVua25vd24gZW5jb2Rpbmc6IFwiK3IpO3I9KHIrXCJcIikudG9Mb3dlckNhc2UoKSxuPSEwfX1wLnByb3RvdHlwZS5faXNCdWZmZXI9ITA7ZnVuY3Rpb24gUGUocixlLHQpe2xldCBuPXJbZV07cltlXT1yW3RdLHJbdF09bn1wLnByb3RvdHlwZS5zd2FwMTY9ZnVuY3Rpb24oKXtsZXQgZT10aGlzLmxlbmd0aDtpZihlJTIhPT0wKXRocm93IG5ldyBSYW5nZUVycm9yKFwiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHNcIik7Zm9yKGxldCB0PTA7dDxlO3QrPTIpUGUodGhpcyx0LHQrMSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbigpe2xldCBlPXRoaXMubGVuZ3RoO2lmKGUlNCE9PTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0c1wiKTtmb3IobGV0IHQ9MDt0PGU7dCs9NClQZSh0aGlzLHQsdCszKSxQZSh0aGlzLHQrMSx0KzIpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5zd2FwNjQ9ZnVuY3Rpb24oKXtsZXQgZT10aGlzLmxlbmd0aDtpZihlJTghPT0wKXRocm93IG5ldyBSYW5nZUVycm9yKFwiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHNcIik7Zm9yKGxldCB0PTA7dDxlO3QrPTgpUGUodGhpcyx0LHQrNyksUGUodGhpcyx0KzEsdCs2KSxQZSh0aGlzLHQrMix0KzUpLFBlKHRoaXMsdCszLHQrNCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7bGV0IGU9dGhpcy5sZW5ndGg7cmV0dXJuIGU9PT0wP1wiXCI6YXJndW1lbnRzLmxlbmd0aD09PTA/eGkodGhpcywwLGUpOk1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07cC5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmc9cC5wcm90b3R5cGUudG9TdHJpbmc7cC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKGUpe2lmKCFwLmlzQnVmZmVyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyXCIpO3JldHVybiB0aGlzPT09ZT8hMDpwLmNvbXBhcmUodGhpcyxlKT09PTB9O3AucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXtsZXQgZT1cIlwiLHQ9S2UuSU5TUEVDVF9NQVhfQllURVM7cmV0dXJuIGU9dGhpcy50b1N0cmluZyhcImhleFwiLDAsdCkucmVwbGFjZSgvKC57Mn0pL2csXCIkMSBcIikudHJpbSgpLHRoaXMubGVuZ3RoPnQmJihlKz1cIiAuLi4gXCIpLFwiPEJ1ZmZlciBcIitlK1wiPlwifTtsaSYmKHAucHJvdG90eXBlW2xpXT1wLnByb3RvdHlwZS5pbnNwZWN0KTtwLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKGUsdCxuLGksbyl7aWYoaWUoZSxVaW50OEFycmF5KSYmKGU9cC5mcm9tKGUsZS5vZmZzZXQsZS5ieXRlTGVuZ3RoKSksIXAuaXNCdWZmZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwidGFyZ2V0XCIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBCdWZmZXIgb3IgVWludDhBcnJheS4gUmVjZWl2ZWQgdHlwZSAnK3R5cGVvZiBlKTtpZih0PT09dm9pZCAwJiYodD0wKSxuPT09dm9pZCAwJiYobj1lP2UubGVuZ3RoOjApLGk9PT12b2lkIDAmJihpPTApLG89PT12b2lkIDAmJihvPXRoaXMubGVuZ3RoKSx0PDB8fG4+ZS5sZW5ndGh8fGk8MHx8bz50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIm91dCBvZiByYW5nZSBpbmRleFwiKTtpZihpPj1vJiZ0Pj1uKXJldHVybiAwO2lmKGk+PW8pcmV0dXJuLTE7aWYodD49bilyZXR1cm4gMTtpZih0Pj4+PTAsbj4+Pj0wLGk+Pj49MCxvPj4+PTAsdGhpcz09PWUpcmV0dXJuIDA7bGV0IHM9by1pLGE9bi10LHU9TWF0aC5taW4ocyxhKSxmPXRoaXMuc2xpY2UoaSxvKSxsPWUuc2xpY2UodCxuKTtmb3IobGV0IGQ9MDtkPHU7KytkKWlmKGZbZF0hPT1sW2RdKXtzPWZbZF0sYT1sW2RdO2JyZWFrfXJldHVybiBzPGE/LTE6YTxzPzE6MH07ZnVuY3Rpb24gYmkocixlLHQsbixpKXtpZihyLmxlbmd0aD09PTApcmV0dXJuLTE7aWYodHlwZW9mIHQ9PVwic3RyaW5nXCI/KG49dCx0PTApOnQ+MjE0NzQ4MzY0Nz90PTIxNDc0ODM2NDc6dDwtMjE0NzQ4MzY0OCYmKHQ9LTIxNDc0ODM2NDgpLHQ9K3QsdG4odCkmJih0PWk/MDpyLmxlbmd0aC0xKSx0PDAmJih0PXIubGVuZ3RoK3QpLHQ+PXIubGVuZ3RoKXtpZihpKXJldHVybi0xO3Q9ci5sZW5ndGgtMX1lbHNlIGlmKHQ8MClpZihpKXQ9MDtlbHNlIHJldHVybi0xO2lmKHR5cGVvZiBlPT1cInN0cmluZ1wiJiYoZT1wLmZyb20oZSxuKSkscC5pc0J1ZmZlcihlKSlyZXR1cm4gZS5sZW5ndGg9PT0wPy0xOmRpKHIsZSx0LG4saSk7aWYodHlwZW9mIGU9PVwibnVtYmVyXCIpcmV0dXJuIGU9ZSYyNTUsdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y9PVwiZnVuY3Rpb25cIj9pP1VpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChyLGUsdCk6VWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChyLGUsdCk6ZGkocixbZV0sdCxuLGkpO3Rocm93IG5ldyBUeXBlRXJyb3IoXCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXJcIil9ZnVuY3Rpb24gZGkocixlLHQsbixpKXtsZXQgbz0xLHM9ci5sZW5ndGgsYT1lLmxlbmd0aDtpZihuIT09dm9pZCAwJiYobj1TdHJpbmcobikudG9Mb3dlckNhc2UoKSxuPT09XCJ1Y3MyXCJ8fG49PT1cInVjcy0yXCJ8fG49PT1cInV0ZjE2bGVcInx8bj09PVwidXRmLTE2bGVcIikpe2lmKHIubGVuZ3RoPDJ8fGUubGVuZ3RoPDIpcmV0dXJuLTE7bz0yLHMvPTIsYS89Mix0Lz0yfWZ1bmN0aW9uIHUobCxkKXtyZXR1cm4gbz09PTE/bFtkXTpsLnJlYWRVSW50MTZCRShkKm8pfWxldCBmO2lmKGkpe2xldCBsPS0xO2ZvcihmPXQ7ZjxzO2YrKylpZih1KHIsZik9PT11KGUsbD09PS0xPzA6Zi1sKSl7aWYobD09PS0xJiYobD1mKSxmLWwrMT09PWEpcmV0dXJuIGwqb31lbHNlIGwhPT0tMSYmKGYtPWYtbCksbD0tMX1lbHNlIGZvcih0K2E+cyYmKHQ9cy1hKSxmPXQ7Zj49MDtmLS0pe2xldCBsPSEwO2ZvcihsZXQgZD0wO2Q8YTtkKyspaWYodShyLGYrZCkhPT11KGUsZCkpe2w9ITE7YnJlYWt9aWYobClyZXR1cm4gZn1yZXR1cm4tMX1wLnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuaW5kZXhPZihlLHQsbikhPT0tMX07cC5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGJpKHRoaXMsZSx0LG4sITApfTtwLnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGJpKHRoaXMsZSx0LG4sITEpfTtmdW5jdGlvbiBMYShyLGUsdCxuKXt0PU51bWJlcih0KXx8MDtsZXQgaT1yLmxlbmd0aC10O24/KG49TnVtYmVyKG4pLG4+aSYmKG49aSkpOm49aTtsZXQgbz1lLmxlbmd0aDtuPm8vMiYmKG49by8yKTtsZXQgcztmb3Iocz0wO3M8bjsrK3Mpe2xldCBhPXBhcnNlSW50KGUuc3Vic3RyKHMqMiwyKSwxNik7aWYodG4oYSkpcmV0dXJuIHM7clt0K3NdPWF9cmV0dXJuIHN9ZnVuY3Rpb24gSWEocixlLHQsbil7cmV0dXJuIFV0KEpyKGUsci5sZW5ndGgtdCkscix0LG4pfWZ1bmN0aW9uIEFhKHIsZSx0LG4pe3JldHVybiBVdCgkYShlKSxyLHQsbil9ZnVuY3Rpb24gRmEocixlLHQsbil7cmV0dXJuIFV0KFRpKGUpLHIsdCxuKX1mdW5jdGlvbiBQYShyLGUsdCxuKXtyZXR1cm4gVXQoR2EoZSxyLmxlbmd0aC10KSxyLHQsbil9cC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24oZSx0LG4saSl7aWYodD09PXZvaWQgMClpPVwidXRmOFwiLG49dGhpcy5sZW5ndGgsdD0wO2Vsc2UgaWYobj09PXZvaWQgMCYmdHlwZW9mIHQ9PVwic3RyaW5nXCIpaT10LG49dGhpcy5sZW5ndGgsdD0wO2Vsc2UgaWYoaXNGaW5pdGUodCkpdD10Pj4+MCxpc0Zpbml0ZShuKT8obj1uPj4+MCxpPT09dm9pZCAwJiYoaT1cInV0ZjhcIikpOihpPW4sbj12b2lkIDApO2Vsc2UgdGhyb3cgbmV3IEVycm9yKFwiQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWRcIik7bGV0IG89dGhpcy5sZW5ndGgtdDtpZigobj09PXZvaWQgMHx8bj5vKSYmKG49byksZS5sZW5ndGg+MCYmKG48MHx8dDwwKXx8dD50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkF0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzXCIpO2l8fChpPVwidXRmOFwiKTtsZXQgcz0hMTtmb3IoOzspc3dpdGNoKGkpe2Nhc2VcImhleFwiOnJldHVybiBMYSh0aGlzLGUsdCxuKTtjYXNlXCJ1dGY4XCI6Y2FzZVwidXRmLThcIjpyZXR1cm4gSWEodGhpcyxlLHQsbik7Y2FzZVwiYXNjaWlcIjpjYXNlXCJsYXRpbjFcIjpjYXNlXCJiaW5hcnlcIjpyZXR1cm4gQWEodGhpcyxlLHQsbik7Y2FzZVwiYmFzZTY0XCI6cmV0dXJuIEZhKHRoaXMsZSx0LG4pO2Nhc2VcInVjczJcIjpjYXNlXCJ1Y3MtMlwiOmNhc2VcInV0ZjE2bGVcIjpjYXNlXCJ1dGYtMTZsZVwiOnJldHVybiBQYSh0aGlzLGUsdCxuKTtkZWZhdWx0OmlmKHMpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlVua25vd24gZW5jb2Rpbmc6IFwiK2kpO2k9KFwiXCIraSkudG9Mb3dlckNhc2UoKSxzPSEwfX07cC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6XCJCdWZmZXJcIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O2Z1bmN0aW9uIGthKHIsZSx0KXtyZXR1cm4gZT09PTAmJnQ9PT1yLmxlbmd0aD9Zci5mcm9tQnl0ZUFycmF5KHIpOllyLmZyb21CeXRlQXJyYXkoci5zbGljZShlLHQpKX1mdW5jdGlvbiB4aShyLGUsdCl7dD1NYXRoLm1pbihyLmxlbmd0aCx0KTtsZXQgbj1bXSxpPWU7Zm9yKDtpPHQ7KXtsZXQgbz1yW2ldLHM9bnVsbCxhPW8+MjM5PzQ6bz4yMjM/MzpvPjE5MT8yOjE7aWYoaSthPD10KXtsZXQgdSxmLGwsZDtzd2l0Y2goYSl7Y2FzZSAxOm88MTI4JiYocz1vKTticmVhaztjYXNlIDI6dT1yW2krMV0sKHUmMTkyKT09PTEyOCYmKGQ9KG8mMzEpPDw2fHUmNjMsZD4xMjcmJihzPWQpKTticmVhaztjYXNlIDM6dT1yW2krMV0sZj1yW2krMl0sKHUmMTkyKT09PTEyOCYmKGYmMTkyKT09PTEyOCYmKGQ9KG8mMTUpPDwxMnwodSY2Myk8PDZ8ZiY2MyxkPjIwNDcmJihkPDU1Mjk2fHxkPjU3MzQzKSYmKHM9ZCkpO2JyZWFrO2Nhc2UgNDp1PXJbaSsxXSxmPXJbaSsyXSxsPXJbaSszXSwodSYxOTIpPT09MTI4JiYoZiYxOTIpPT09MTI4JiYobCYxOTIpPT09MTI4JiYoZD0obyYxNSk8PDE4fCh1JjYzKTw8MTJ8KGYmNjMpPDw2fGwmNjMsZD42NTUzNSYmZDwxMTE0MTEyJiYocz1kKSl9fXM9PT1udWxsPyhzPTY1NTMzLGE9MSk6cz42NTUzNSYmKHMtPTY1NTM2LG4ucHVzaChzPj4+MTAmMTAyM3w1NTI5Nikscz01NjMyMHxzJjEwMjMpLG4ucHVzaChzKSxpKz1hfXJldHVybiBPYShuKX12YXIgcGk9NDA5NjtmdW5jdGlvbiBPYShyKXtsZXQgZT1yLmxlbmd0aDtpZihlPD1waSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcscik7bGV0IHQ9XCJcIixuPTA7Zm9yKDtuPGU7KXQrPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHIuc2xpY2UobixuKz1waSkpO3JldHVybiB0fWZ1bmN0aW9uIFVhKHIsZSx0KXtsZXQgbj1cIlwiO3Q9TWF0aC5taW4oci5sZW5ndGgsdCk7Zm9yKGxldCBpPWU7aTx0OysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHJbaV0mMTI3KTtyZXR1cm4gbn1mdW5jdGlvbiBEYShyLGUsdCl7bGV0IG49XCJcIjt0PU1hdGgubWluKHIubGVuZ3RoLHQpO2ZvcihsZXQgaT1lO2k8dDsrK2kpbis9U3RyaW5nLmZyb21DaGFyQ29kZShyW2ldKTtyZXR1cm4gbn1mdW5jdGlvbiBOYShyLGUsdCl7bGV0IG49ci5sZW5ndGg7KCFlfHxlPDApJiYoZT0wKSwoIXR8fHQ8MHx8dD5uKSYmKHQ9bik7bGV0IGk9XCJcIjtmb3IobGV0IG89ZTtvPHQ7KytvKWkrPVZhW3Jbb11dO3JldHVybiBpfWZ1bmN0aW9uIEhhKHIsZSx0KXtsZXQgbj1yLnNsaWNlKGUsdCksaT1cIlwiO2ZvcihsZXQgbz0wO288bi5sZW5ndGgtMTtvKz0yKWkrPVN0cmluZy5mcm9tQ2hhckNvZGUobltvXStuW28rMV0qMjU2KTtyZXR1cm4gaX1wLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbihlLHQpe2xldCBuPXRoaXMubGVuZ3RoO2U9fn5lLHQ9dD09PXZvaWQgMD9uOn5+dCxlPDA/KGUrPW4sZTwwJiYoZT0wKSk6ZT5uJiYoZT1uKSx0PDA/KHQrPW4sdDwwJiYodD0wKSk6dD5uJiYodD1uKSx0PGUmJih0PWUpO2xldCBpPXRoaXMuc3ViYXJyYXkoZSx0KTtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKGkscC5wcm90b3R5cGUpLGl9O2Z1bmN0aW9uIEQocixlLHQpe2lmKHIlMSE9PTB8fHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIm9mZnNldCBpcyBub3QgdWludFwiKTtpZihyK2U+dCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGhcIil9cC5wcm90b3R5cGUucmVhZFVpbnRMRT1wLnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKGUsdCxuKXtlPWU+Pj4wLHQ9dD4+PjAsbnx8RChlLHQsdGhpcy5sZW5ndGgpO2xldCBpPXRoaXNbZV0sbz0xLHM9MDtmb3IoOysrczx0JiYobyo9MjU2KTspaSs9dGhpc1tlK3NdKm87cmV0dXJuIGl9O3AucHJvdG90eXBlLnJlYWRVaW50QkU9cC5wcm90b3R5cGUucmVhZFVJbnRCRT1mdW5jdGlvbihlLHQsbil7ZT1lPj4+MCx0PXQ+Pj4wLG58fEQoZSx0LHRoaXMubGVuZ3RoKTtsZXQgaT10aGlzW2UrLS10XSxvPTE7Zm9yKDt0PjAmJihvKj0yNTYpOylpKz10aGlzW2UrLS10XSpvO3JldHVybiBpfTtwLnByb3RvdHlwZS5yZWFkVWludDg9cC5wcm90b3R5cGUucmVhZFVJbnQ4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDEsdGhpcy5sZW5ndGgpLHRoaXNbZV19O3AucHJvdG90eXBlLnJlYWRVaW50MTZMRT1wLnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lPj4+MCx0fHxEKGUsMix0aGlzLmxlbmd0aCksdGhpc1tlXXx0aGlzW2UrMV08PDh9O3AucHJvdG90eXBlLnJlYWRVaW50MTZCRT1wLnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lPj4+MCx0fHxEKGUsMix0aGlzLmxlbmd0aCksdGhpc1tlXTw8OHx0aGlzW2UrMV19O3AucHJvdG90eXBlLnJlYWRVaW50MzJMRT1wLnByb3RvdHlwZS5yZWFkVUludDMyTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lPj4+MCx0fHxEKGUsNCx0aGlzLmxlbmd0aCksKHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTYpK3RoaXNbZSszXSoxNjc3NzIxNn07cC5wcm90b3R5cGUucmVhZFVpbnQzMkJFPXAucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbihlLHQpe3JldHVybiBlPWU+Pj4wLHR8fEQoZSw0LHRoaXMubGVuZ3RoKSx0aGlzW2VdKjE2Nzc3MjE2Kyh0aGlzW2UrMV08PDE2fHRoaXNbZSsyXTw8OHx0aGlzW2UrM10pfTtwLnByb3RvdHlwZS5yZWFkQmlnVUludDY0TEU9YmUoZnVuY3Rpb24oZSl7ZT1lPj4+MCxZZShlLFwib2Zmc2V0XCIpO2xldCB0PXRoaXNbZV0sbj10aGlzW2UrN107KHQ9PT12b2lkIDB8fG49PT12b2lkIDApJiZ3dChlLHRoaXMubGVuZ3RoLTgpO2xldCBpPXQrdGhpc1srK2VdKjIqKjgrdGhpc1srK2VdKjIqKjE2K3RoaXNbKytlXSoyKioyNCxvPXRoaXNbKytlXSt0aGlzWysrZV0qMioqOCt0aGlzWysrZV0qMioqMTYrbioyKioyNDtyZXR1cm4gQmlnSW50KGkpKyhCaWdJbnQobyk8PEJpZ0ludCgzMikpfSk7cC5wcm90b3R5cGUucmVhZEJpZ1VJbnQ2NEJFPWJlKGZ1bmN0aW9uKGUpe2U9ZT4+PjAsWWUoZSxcIm9mZnNldFwiKTtsZXQgdD10aGlzW2VdLG49dGhpc1tlKzddOyh0PT09dm9pZCAwfHxuPT09dm9pZCAwKSYmd3QoZSx0aGlzLmxlbmd0aC04KTtsZXQgaT10KjIqKjI0K3RoaXNbKytlXSoyKioxNit0aGlzWysrZV0qMioqOCt0aGlzWysrZV0sbz10aGlzWysrZV0qMioqMjQrdGhpc1srK2VdKjIqKjE2K3RoaXNbKytlXSoyKio4K247cmV0dXJuKEJpZ0ludChpKTw8QmlnSW50KDMyKSkrQmlnSW50KG8pfSk7cC5wcm90b3R5cGUucmVhZEludExFPWZ1bmN0aW9uKGUsdCxuKXtlPWU+Pj4wLHQ9dD4+PjAsbnx8RChlLHQsdGhpcy5sZW5ndGgpO2xldCBpPXRoaXNbZV0sbz0xLHM9MDtmb3IoOysrczx0JiYobyo9MjU2KTspaSs9dGhpc1tlK3NdKm87cmV0dXJuIG8qPTEyOCxpPj1vJiYoaS09TWF0aC5wb3coMiw4KnQpKSxpfTtwLnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24oZSx0LG4pe2U9ZT4+PjAsdD10Pj4+MCxufHxEKGUsdCx0aGlzLmxlbmd0aCk7bGV0IGk9dCxvPTEscz10aGlzW2UrLS1pXTtmb3IoO2k+MCYmKG8qPTI1Nik7KXMrPXRoaXNbZSstLWldKm87cmV0dXJuIG8qPTEyOCxzPj1vJiYocy09TWF0aC5wb3coMiw4KnQpKSxzfTtwLnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiBlPWU+Pj4wLHR8fEQoZSwxLHRoaXMubGVuZ3RoKSx0aGlzW2VdJjEyOD8oMjU1LXRoaXNbZV0rMSkqLTE6dGhpc1tlXX07cC5wcm90b3R5cGUucmVhZEludDE2TEU9ZnVuY3Rpb24oZSx0KXtlPWU+Pj4wLHR8fEQoZSwyLHRoaXMubGVuZ3RoKTtsZXQgbj10aGlzW2VdfHRoaXNbZSsxXTw8ODtyZXR1cm4gbiYzMjc2OD9ufDQyOTQ5MDE3NjA6bn07cC5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24oZSx0KXtlPWU+Pj4wLHR8fEQoZSwyLHRoaXMubGVuZ3RoKTtsZXQgbj10aGlzW2UrMV18dGhpc1tlXTw8ODtyZXR1cm4gbiYzMjc2OD9ufDQyOTQ5MDE3NjA6bn07cC5wcm90b3R5cGUucmVhZEludDMyTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lPj4+MCx0fHxEKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXXx0aGlzW2UrMV08PDh8dGhpc1tlKzJdPDwxNnx0aGlzW2UrM108PDI0fTtwLnByb3RvdHlwZS5yZWFkSW50MzJCRT1mdW5jdGlvbihlLHQpe3JldHVybiBlPWU+Pj4wLHR8fEQoZSw0LHRoaXMubGVuZ3RoKSx0aGlzW2VdPDwyNHx0aGlzW2UrMV08PDE2fHRoaXNbZSsyXTw8OHx0aGlzW2UrM119O3AucHJvdG90eXBlLnJlYWRCaWdJbnQ2NExFPWJlKGZ1bmN0aW9uKGUpe2U9ZT4+PjAsWWUoZSxcIm9mZnNldFwiKTtsZXQgdD10aGlzW2VdLG49dGhpc1tlKzddOyh0PT09dm9pZCAwfHxuPT09dm9pZCAwKSYmd3QoZSx0aGlzLmxlbmd0aC04KTtsZXQgaT10aGlzW2UrNF0rdGhpc1tlKzVdKjIqKjgrdGhpc1tlKzZdKjIqKjE2KyhuPDwyNCk7cmV0dXJuKEJpZ0ludChpKTw8QmlnSW50KDMyKSkrQmlnSW50KHQrdGhpc1srK2VdKjIqKjgrdGhpc1srK2VdKjIqKjE2K3RoaXNbKytlXSoyKioyNCl9KTtwLnByb3RvdHlwZS5yZWFkQmlnSW50NjRCRT1iZShmdW5jdGlvbihlKXtlPWU+Pj4wLFllKGUsXCJvZmZzZXRcIik7bGV0IHQ9dGhpc1tlXSxuPXRoaXNbZSs3XTsodD09PXZvaWQgMHx8bj09PXZvaWQgMCkmJnd0KGUsdGhpcy5sZW5ndGgtOCk7bGV0IGk9KHQ8PDI0KSt0aGlzWysrZV0qMioqMTYrdGhpc1srK2VdKjIqKjgrdGhpc1srK2VdO3JldHVybihCaWdJbnQoaSk8PEJpZ0ludCgzMikpK0JpZ0ludCh0aGlzWysrZV0qMioqMjQrdGhpc1srK2VdKjIqKjE2K3RoaXNbKytlXSoyKio4K24pfSk7cC5wcm90b3R5cGUucmVhZEZsb2F0TEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lPj4+MCx0fHxEKGUsNCx0aGlzLmxlbmd0aCksemUucmVhZCh0aGlzLGUsITAsMjMsNCl9O3AucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDQsdGhpcy5sZW5ndGgpLHplLnJlYWQodGhpcyxlLCExLDIzLDQpfTtwLnByb3RvdHlwZS5yZWFkRG91YmxlTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lPj4+MCx0fHxEKGUsOCx0aGlzLmxlbmd0aCksemUucmVhZCh0aGlzLGUsITAsNTIsOCl9O3AucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbihlLHQpe3JldHVybiBlPWU+Pj4wLHR8fEQoZSw4LHRoaXMubGVuZ3RoKSx6ZS5yZWFkKHRoaXMsZSwhMSw1Miw4KX07ZnVuY3Rpb24gVyhyLGUsdCxuLGksbyl7aWYoIXAuaXNCdWZmZXIocikpdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJyk7aWYoZT5pfHxlPG8pdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7aWYodCtuPnIubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiSW5kZXggb3V0IG9mIHJhbmdlXCIpfXAucHJvdG90eXBlLndyaXRlVWludExFPXAucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uKGUsdCxuLGkpe2lmKGU9K2UsdD10Pj4+MCxuPW4+Pj4wLCFpKXtsZXQgYT1NYXRoLnBvdygyLDgqbiktMTtXKHRoaXMsZSx0LG4sYSwwKX1sZXQgbz0xLHM9MDtmb3IodGhpc1t0XT1lJjI1NTsrK3M8biYmKG8qPTI1Nik7KXRoaXNbdCtzXT1lL28mMjU1O3JldHVybiB0K259O3AucHJvdG90eXBlLndyaXRlVWludEJFPXAucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uKGUsdCxuLGkpe2lmKGU9K2UsdD10Pj4+MCxuPW4+Pj4wLCFpKXtsZXQgYT1NYXRoLnBvdygyLDgqbiktMTtXKHRoaXMsZSx0LG4sYSwwKX1sZXQgbz1uLTEscz0xO2Zvcih0aGlzW3Qrb109ZSYyNTU7LS1vPj0wJiYocyo9MjU2KTspdGhpc1t0K29dPWUvcyYyNTU7cmV0dXJuIHQrbn07cC5wcm90b3R5cGUud3JpdGVVaW50OD1wLnByb3RvdHlwZS53cml0ZVVJbnQ4PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLG58fFcodGhpcyxlLHQsMSwyNTUsMCksdGhpc1t0XT1lJjI1NSx0KzF9O3AucHJvdG90eXBlLndyaXRlVWludDE2TEU9cC5wcm90b3R5cGUud3JpdGVVSW50MTZMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdD10Pj4+MCxufHxXKHRoaXMsZSx0LDIsNjU1MzUsMCksdGhpc1t0XT1lJjI1NSx0aGlzW3QrMV09ZT4+PjgsdCsyfTtwLnByb3RvdHlwZS53cml0ZVVpbnQxNkJFPXAucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHQ9dD4+PjAsbnx8Vyh0aGlzLGUsdCwyLDY1NTM1LDApLHRoaXNbdF09ZT4+PjgsdGhpc1t0KzFdPWUmMjU1LHQrMn07cC5wcm90b3R5cGUud3JpdGVVaW50MzJMRT1wLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLG58fFcodGhpcyxlLHQsNCw0Mjk0OTY3Mjk1LDApLHRoaXNbdCszXT1lPj4+MjQsdGhpc1t0KzJdPWU+Pj4xNix0aGlzW3QrMV09ZT4+PjgsdGhpc1t0XT1lJjI1NSx0KzR9O3AucHJvdG90eXBlLndyaXRlVWludDMyQkU9cC5wcm90b3R5cGUud3JpdGVVSW50MzJCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdD10Pj4+MCxufHxXKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSx0aGlzW3RdPWU+Pj4yNCx0aGlzW3QrMV09ZT4+PjE2LHRoaXNbdCsyXT1lPj4+OCx0aGlzW3QrM109ZSYyNTUsdCs0fTtmdW5jdGlvbiBfaShyLGUsdCxuLGkpe1JpKGUsbixpLHIsdCw3KTtsZXQgbz1OdW1iZXIoZSZCaWdJbnQoNDI5NDk2NzI5NSkpO3JbdCsrXT1vLG89bz4+OCxyW3QrK109byxvPW8+Pjgsclt0KytdPW8sbz1vPj44LHJbdCsrXT1vO2xldCBzPU51bWJlcihlPj5CaWdJbnQoMzIpJkJpZ0ludCg0Mjk0OTY3Mjk1KSk7cmV0dXJuIHJbdCsrXT1zLHM9cz4+OCxyW3QrK109cyxzPXM+Pjgsclt0KytdPXMscz1zPj44LHJbdCsrXT1zLHR9ZnVuY3Rpb24gd2kocixlLHQsbixpKXtSaShlLG4saSxyLHQsNyk7bGV0IG89TnVtYmVyKGUmQmlnSW50KDQyOTQ5NjcyOTUpKTtyW3QrN109byxvPW8+Pjgsclt0KzZdPW8sbz1vPj44LHJbdCs1XT1vLG89bz4+OCxyW3QrNF09bztsZXQgcz1OdW1iZXIoZT4+QmlnSW50KDMyKSZCaWdJbnQoNDI5NDk2NzI5NSkpO3JldHVybiByW3QrM109cyxzPXM+Pjgsclt0KzJdPXMscz1zPj44LHJbdCsxXT1zLHM9cz4+OCxyW3RdPXMsdCs4fXAucHJvdG90eXBlLndyaXRlQmlnVUludDY0TEU9YmUoZnVuY3Rpb24oZSx0PTApe3JldHVybiBfaSh0aGlzLGUsdCxCaWdJbnQoMCksQmlnSW50KFwiMHhmZmZmZmZmZmZmZmZmZmZmXCIpKX0pO3AucHJvdG90eXBlLndyaXRlQmlnVUludDY0QkU9YmUoZnVuY3Rpb24oZSx0PTApe3JldHVybiB3aSh0aGlzLGUsdCxCaWdJbnQoMCksQmlnSW50KFwiMHhmZmZmZmZmZmZmZmZmZmZmXCIpKX0pO3AucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24oZSx0LG4saSl7aWYoZT0rZSx0PXQ+Pj4wLCFpKXtsZXQgdT1NYXRoLnBvdygyLDgqbi0xKTtXKHRoaXMsZSx0LG4sdS0xLC11KX1sZXQgbz0wLHM9MSxhPTA7Zm9yKHRoaXNbdF09ZSYyNTU7KytvPG4mJihzKj0yNTYpOyllPDAmJmE9PT0wJiZ0aGlzW3Qrby0xXSE9PTAmJihhPTEpLHRoaXNbdCtvXT0oZS9zPj4wKS1hJjI1NTtyZXR1cm4gdCtufTtwLnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKGUsdCxuLGkpe2lmKGU9K2UsdD10Pj4+MCwhaSl7bGV0IHU9TWF0aC5wb3coMiw4Km4tMSk7Vyh0aGlzLGUsdCxuLHUtMSwtdSl9bGV0IG89bi0xLHM9MSxhPTA7Zm9yKHRoaXNbdCtvXT1lJjI1NTstLW8+PTAmJihzKj0yNTYpOyllPDAmJmE9PT0wJiZ0aGlzW3QrbysxXSE9PTAmJihhPTEpLHRoaXNbdCtvXT0oZS9zPj4wKS1hJjI1NTtyZXR1cm4gdCtufTtwLnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHQ9dD4+PjAsbnx8Vyh0aGlzLGUsdCwxLDEyNywtMTI4KSxlPDAmJihlPTI1NStlKzEpLHRoaXNbdF09ZSYyNTUsdCsxfTtwLnByb3RvdHlwZS53cml0ZUludDE2TEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHQ9dD4+PjAsbnx8Vyh0aGlzLGUsdCwyLDMyNzY3LC0zMjc2OCksdGhpc1t0XT1lJjI1NSx0aGlzW3QrMV09ZT4+PjgsdCsyfTtwLnByb3RvdHlwZS53cml0ZUludDE2QkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHQ9dD4+PjAsbnx8Vyh0aGlzLGUsdCwyLDMyNzY3LC0zMjc2OCksdGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09ZSYyNTUsdCsyfTtwLnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHQ9dD4+PjAsbnx8Vyh0aGlzLGUsdCw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHRoaXNbdF09ZSYyNTUsdGhpc1t0KzFdPWU+Pj44LHRoaXNbdCsyXT1lPj4+MTYsdGhpc1t0KzNdPWU+Pj4yNCx0KzR9O3AucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdD10Pj4+MCxufHxXKHRoaXMsZSx0LDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksZTwwJiYoZT00Mjk0OTY3Mjk1K2UrMSksdGhpc1t0XT1lPj4+MjQsdGhpc1t0KzFdPWU+Pj4xNix0aGlzW3QrMl09ZT4+PjgsdGhpc1t0KzNdPWUmMjU1LHQrNH07cC5wcm90b3R5cGUud3JpdGVCaWdJbnQ2NExFPWJlKGZ1bmN0aW9uKGUsdD0wKXtyZXR1cm4gX2kodGhpcyxlLHQsLUJpZ0ludChcIjB4ODAwMDAwMDAwMDAwMDAwMFwiKSxCaWdJbnQoXCIweDdmZmZmZmZmZmZmZmZmZmZcIikpfSk7cC5wcm90b3R5cGUud3JpdGVCaWdJbnQ2NEJFPWJlKGZ1bmN0aW9uKGUsdD0wKXtyZXR1cm4gd2kodGhpcyxlLHQsLUJpZ0ludChcIjB4ODAwMDAwMDAwMDAwMDAwMFwiKSxCaWdJbnQoXCIweDdmZmZmZmZmZmZmZmZmZmZcIikpfSk7ZnVuY3Rpb24gdmkocixlLHQsbixpLG8pe2lmKHQrbj5yLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkluZGV4IG91dCBvZiByYW5nZVwiKTtpZih0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbmRleCBvdXQgb2YgcmFuZ2VcIil9ZnVuY3Rpb24gRWkocixlLHQsbixpKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLGl8fHZpKHIsZSx0LDQsMzQwMjgyMzQ2NjM4NTI4ODZlMjIsLTM0MDI4MjM0NjYzODUyODg2ZTIyKSx6ZS53cml0ZShyLGUsdCxuLDIzLDQpLHQrNH1wLnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBFaSh0aGlzLGUsdCwhMCxuKX07cC5wcm90b3R5cGUud3JpdGVGbG9hdEJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gRWkodGhpcyxlLHQsITEsbil9O2Z1bmN0aW9uIFNpKHIsZSx0LG4saSl7cmV0dXJuIGU9K2UsdD10Pj4+MCxpfHx2aShyLGUsdCw4LDE3OTc2OTMxMzQ4NjIzMTU3ZTI5MiwtMTc5NzY5MzEzNDg2MjMxNTdlMjkyKSx6ZS53cml0ZShyLGUsdCxuLDUyLDgpLHQrOH1wLnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gU2kodGhpcyxlLHQsITAsbil9O3AucHJvdG90eXBlLndyaXRlRG91YmxlQkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBTaSh0aGlzLGUsdCwhMSxuKX07cC5wcm90b3R5cGUuY29weT1mdW5jdGlvbihlLHQsbixpKXtpZighcC5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXJndW1lbnQgc2hvdWxkIGJlIGEgQnVmZmVyXCIpO2lmKG58fChuPTApLCFpJiZpIT09MCYmKGk9dGhpcy5sZW5ndGgpLHQ+PWUubGVuZ3RoJiYodD1lLmxlbmd0aCksdHx8KHQ9MCksaT4wJiZpPG4mJihpPW4pLGk9PT1ufHxlLmxlbmd0aD09PTB8fHRoaXMubGVuZ3RoPT09MClyZXR1cm4gMDtpZih0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJ0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzXCIpO2lmKG48MHx8bj49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbmRleCBvdXQgb2YgcmFuZ2VcIik7aWYoaTwwKXRocm93IG5ldyBSYW5nZUVycm9yKFwic291cmNlRW5kIG91dCBvZiBib3VuZHNcIik7aT50aGlzLmxlbmd0aCYmKGk9dGhpcy5sZW5ndGgpLGUubGVuZ3RoLXQ8aS1uJiYoaT1lLmxlbmd0aC10K24pO2xldCBvPWktbjtyZXR1cm4gdGhpcz09PWUmJnR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluPT1cImZ1bmN0aW9uXCI/dGhpcy5jb3B5V2l0aGluKHQsbixpKTpVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChlLHRoaXMuc3ViYXJyYXkobixpKSx0KSxvfTtwLnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uKGUsdCxuLGkpe2lmKHR5cGVvZiBlPT1cInN0cmluZ1wiKXtpZih0eXBlb2YgdD09XCJzdHJpbmdcIj8oaT10LHQ9MCxuPXRoaXMubGVuZ3RoKTp0eXBlb2Ygbj09XCJzdHJpbmdcIiYmKGk9bixuPXRoaXMubGVuZ3RoKSxpIT09dm9pZCAwJiZ0eXBlb2YgaSE9XCJzdHJpbmdcIil0aHJvdyBuZXcgVHlwZUVycm9yKFwiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZ1wiKTtpZih0eXBlb2YgaT09XCJzdHJpbmdcIiYmIXAuaXNFbmNvZGluZyhpKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5rbm93biBlbmNvZGluZzogXCIraSk7aWYoZS5sZW5ndGg9PT0xKXtsZXQgcz1lLmNoYXJDb2RlQXQoMCk7KGk9PT1cInV0ZjhcIiYmczwxMjh8fGk9PT1cImxhdGluMVwiKSYmKGU9cyl9fWVsc2UgdHlwZW9mIGU9PVwibnVtYmVyXCI/ZT1lJjI1NTp0eXBlb2YgZT09XCJib29sZWFuXCImJihlPU51bWJlcihlKSk7aWYodDwwfHx0aGlzLmxlbmd0aDx0fHx0aGlzLmxlbmd0aDxuKXRocm93IG5ldyBSYW5nZUVycm9yKFwiT3V0IG9mIHJhbmdlIGluZGV4XCIpO2lmKG48PXQpcmV0dXJuIHRoaXM7dD10Pj4+MCxuPW49PT12b2lkIDA/dGhpcy5sZW5ndGg6bj4+PjAsZXx8KGU9MCk7bGV0IG87aWYodHlwZW9mIGU9PVwibnVtYmVyXCIpZm9yKG89dDtvPG47KytvKXRoaXNbb109ZTtlbHNle2xldCBzPXAuaXNCdWZmZXIoZSk/ZTpwLmZyb20oZSxpKSxhPXMubGVuZ3RoO2lmKGE9PT0wKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSB2YWx1ZSBcIicrZSsnXCIgaXMgaW52YWxpZCBmb3IgYXJndW1lbnQgXCJ2YWx1ZVwiJyk7Zm9yKG89MDtvPG4tdDsrK28pdGhpc1tvK3RdPXNbbyVhXX1yZXR1cm4gdGhpc307dmFyIFZlPXt9O2Z1bmN0aW9uIGVuKHIsZSx0KXtWZVtyXT1jbGFzcyBleHRlbmRzIHR7Y29uc3RydWN0b3IoKXtzdXBlcigpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwibWVzc2FnZVwiLHt2YWx1ZTplLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0aGlzLm5hbWU9YCR7dGhpcy5uYW1lfSBbJHtyfV1gLHRoaXMuc3RhY2ssZGVsZXRlIHRoaXMubmFtZX1nZXQgY29kZSgpe3JldHVybiByfXNldCBjb2RlKGkpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiY29kZVwiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTppLHdyaXRhYmxlOiEwfSl9dG9TdHJpbmcoKXtyZXR1cm5gJHt0aGlzLm5hbWV9IFske3J9XTogJHt0aGlzLm1lc3NhZ2V9YH19fWVuKFwiRVJSX0JVRkZFUl9PVVRfT0ZfQk9VTkRTXCIsZnVuY3Rpb24ocil7cmV0dXJuIHI/YCR7cn0gaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzYDpcIkF0dGVtcHQgdG8gYWNjZXNzIG1lbW9yeSBvdXRzaWRlIGJ1ZmZlciBib3VuZHNcIn0sUmFuZ2VFcnJvcik7ZW4oXCJFUlJfSU5WQUxJRF9BUkdfVFlQRVwiLGZ1bmN0aW9uKHIsZSl7cmV0dXJuYFRoZSBcIiR7cn1cIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCB0eXBlICR7dHlwZW9mIGV9YH0sVHlwZUVycm9yKTtlbihcIkVSUl9PVVRfT0ZfUkFOR0VcIixmdW5jdGlvbihyLGUsdCl7bGV0IG49YFRoZSB2YWx1ZSBvZiBcIiR7cn1cIiBpcyBvdXQgb2YgcmFuZ2UuYCxpPXQ7cmV0dXJuIE51bWJlci5pc0ludGVnZXIodCkmJk1hdGguYWJzKHQpPjIqKjMyP2k9aGkoU3RyaW5nKHQpKTp0eXBlb2YgdD09XCJiaWdpbnRcIiYmKGk9U3RyaW5nKHQpLCh0PkJpZ0ludCgyKSoqQmlnSW50KDMyKXx8dDwtKEJpZ0ludCgyKSoqQmlnSW50KDMyKSkpJiYoaT1oaShpKSksaSs9XCJuXCIpLG4rPWAgSXQgbXVzdCBiZSAke2V9LiBSZWNlaXZlZCAke2l9YCxufSxSYW5nZUVycm9yKTtmdW5jdGlvbiBoaShyKXtsZXQgZT1cIlwiLHQ9ci5sZW5ndGgsbj1yWzBdPT09XCItXCI/MTowO2Zvcig7dD49bis0O3QtPTMpZT1gXyR7ci5zbGljZSh0LTMsdCl9JHtlfWA7cmV0dXJuYCR7ci5zbGljZSgwLHQpfSR7ZX1gfWZ1bmN0aW9uIHFhKHIsZSx0KXtZZShlLFwib2Zmc2V0XCIpLChyW2VdPT09dm9pZCAwfHxyW2UrdF09PT12b2lkIDApJiZ3dChlLHIubGVuZ3RoLSh0KzEpKX1mdW5jdGlvbiBSaShyLGUsdCxuLGksbyl7aWYocj50fHxyPGUpe2xldCBzPXR5cGVvZiBlPT1cImJpZ2ludFwiP1wiblwiOlwiXCIsYTt0aHJvdyBvPjM/ZT09PTB8fGU9PT1CaWdJbnQoMCk/YT1gPj0gMCR7c30gYW5kIDwgMiR7c30gKiogJHsobysxKSo4fSR7c31gOmE9YD49IC0oMiR7c30gKiogJHsobysxKSo4LTF9JHtzfSkgYW5kIDwgMiAqKiAkeyhvKzEpKjgtMX0ke3N9YDphPWA+PSAke2V9JHtzfSBhbmQgPD0gJHt0fSR7c31gLG5ldyBWZS5FUlJfT1VUX09GX1JBTkdFKFwidmFsdWVcIixhLHIpfXFhKG4saSxvKX1mdW5jdGlvbiBZZShyLGUpe2lmKHR5cGVvZiByIT1cIm51bWJlclwiKXRocm93IG5ldyBWZS5FUlJfSU5WQUxJRF9BUkdfVFlQRShlLFwibnVtYmVyXCIscil9ZnVuY3Rpb24gd3QocixlLHQpe3Rocm93IE1hdGguZmxvb3IocikhPT1yPyhZZShyLHQpLG5ldyBWZS5FUlJfT1VUX09GX1JBTkdFKHR8fFwib2Zmc2V0XCIsXCJhbiBpbnRlZ2VyXCIscikpOmU8MD9uZXcgVmUuRVJSX0JVRkZFUl9PVVRfT0ZfQk9VTkRTOm5ldyBWZS5FUlJfT1VUX09GX1JBTkdFKHR8fFwib2Zmc2V0XCIsYD49ICR7dD8xOjB9IGFuZCA8PSAke2V9YCxyKX12YXIgamE9L1teKy8wLTlBLVphLXotX10vZztmdW5jdGlvbiBXYShyKXtpZihyPXIuc3BsaXQoXCI9XCIpWzBdLHI9ci50cmltKCkucmVwbGFjZShqYSxcIlwiKSxyLmxlbmd0aDwyKXJldHVyblwiXCI7Zm9yKDtyLmxlbmd0aCU0IT09MDspcj1yK1wiPVwiO3JldHVybiByfWZ1bmN0aW9uIEpyKHIsZSl7ZT1lfHwxLzA7bGV0IHQsbj1yLmxlbmd0aCxpPW51bGwsbz1bXTtmb3IobGV0IHM9MDtzPG47KytzKXtpZih0PXIuY2hhckNvZGVBdChzKSx0PjU1Mjk1JiZ0PDU3MzQ0KXtpZighaSl7aWYodD41NjMxOSl7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWVsc2UgaWYocysxPT09bil7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWk9dDtjb250aW51ZX1pZih0PDU2MzIwKXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSksaT10O2NvbnRpbnVlfXQ9KGktNTUyOTY8PDEwfHQtNTYzMjApKzY1NTM2fWVsc2UgaSYmKGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2lmKGk9bnVsbCx0PDEyOCl7aWYoKGUtPTEpPDApYnJlYWs7by5wdXNoKHQpfWVsc2UgaWYodDwyMDQ4KXtpZigoZS09Mik8MClicmVhaztvLnB1c2godD4+NnwxOTIsdCY2M3wxMjgpfWVsc2UgaWYodDw2NTUzNil7aWYoKGUtPTMpPDApYnJlYWs7by5wdXNoKHQ+PjEyfDIyNCx0Pj42JjYzfDEyOCx0JjYzfDEyOCl9ZWxzZSBpZih0PDExMTQxMTIpe2lmKChlLT00KTwwKWJyZWFrO28ucHVzaCh0Pj4xOHwyNDAsdD4+MTImNjN8MTI4LHQ+PjYmNjN8MTI4LHQmNjN8MTI4KX1lbHNlIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY29kZSBwb2ludFwiKX1yZXR1cm4gb31mdW5jdGlvbiAkYShyKXtsZXQgZT1bXTtmb3IobGV0IHQ9MDt0PHIubGVuZ3RoOysrdCllLnB1c2goci5jaGFyQ29kZUF0KHQpJjI1NSk7cmV0dXJuIGV9ZnVuY3Rpb24gR2EocixlKXtsZXQgdCxuLGksbz1bXTtmb3IobGV0IHM9MDtzPHIubGVuZ3RoJiYhKChlLT0yKTwwKTsrK3MpdD1yLmNoYXJDb2RlQXQocyksbj10Pj44LGk9dCUyNTYsby5wdXNoKGkpLG8ucHVzaChuKTtyZXR1cm4gb31mdW5jdGlvbiBUaShyKXtyZXR1cm4gWXIudG9CeXRlQXJyYXkoV2EocikpfWZ1bmN0aW9uIFV0KHIsZSx0LG4pe2xldCBpO2ZvcihpPTA7aTxuJiYhKGkrdD49ZS5sZW5ndGh8fGk+PXIubGVuZ3RoKTsrK2kpZVtpK3RdPXJbaV07cmV0dXJuIGl9ZnVuY3Rpb24gaWUocixlKXtyZXR1cm4gciBpbnN0YW5jZW9mIGV8fHIhPW51bGwmJnIuY29uc3RydWN0b3IhPW51bGwmJnIuY29uc3RydWN0b3IubmFtZSE9bnVsbCYmci5jb25zdHJ1Y3Rvci5uYW1lPT09ZS5uYW1lfWZ1bmN0aW9uIHRuKHIpe3JldHVybiByIT09cn12YXIgVmE9ZnVuY3Rpb24oKXtsZXQgcj1cIjAxMjM0NTY3ODlhYmNkZWZcIixlPW5ldyBBcnJheSgyNTYpO2ZvcihsZXQgdD0wO3Q8MTY7Kyt0KXtsZXQgbj10KjE2O2ZvcihsZXQgaT0wO2k8MTY7KytpKWVbbitpXT1yW3RdK3JbaV19cmV0dXJuIGV9KCk7ZnVuY3Rpb24gYmUocil7cmV0dXJuIHR5cGVvZiBCaWdJbnQ+XCJ1XCI/emE6cn1mdW5jdGlvbiB6YSgpe3Rocm93IG5ldyBFcnJvcihcIkJpZ0ludCBub3Qgc3VwcG9ydGVkXCIpfX0pO3ZhciBJaT1TKChjbCxMaSk9PntjKCk7dmFyIFA9TGkuZXhwb3J0cz17fSxvZSxzZTtmdW5jdGlvbiBybigpe3Rocm93IG5ldyBFcnJvcihcInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcIil9ZnVuY3Rpb24gbm4oKXt0aHJvdyBuZXcgRXJyb3IoXCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcIil9KGZ1bmN0aW9uKCl7dHJ5e3R5cGVvZiBzZXRUaW1lb3V0PT1cImZ1bmN0aW9uXCI/b2U9c2V0VGltZW91dDpvZT1ybn1jYXRjaHtvZT1ybn10cnl7dHlwZW9mIGNsZWFyVGltZW91dD09XCJmdW5jdGlvblwiP3NlPWNsZWFyVGltZW91dDpzZT1ubn1jYXRjaHtzZT1ubn19KSgpO2Z1bmN0aW9uIENpKHIpe2lmKG9lPT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dChyLDApO2lmKChvZT09PXJufHwhb2UpJiZzZXRUaW1lb3V0KXJldHVybiBvZT1zZXRUaW1lb3V0LHNldFRpbWVvdXQociwwKTt0cnl7cmV0dXJuIG9lKHIsMCl9Y2F0Y2h7dHJ5e3JldHVybiBvZS5jYWxsKG51bGwsciwwKX1jYXRjaHtyZXR1cm4gb2UuY2FsbCh0aGlzLHIsMCl9fX1mdW5jdGlvbiBZYShyKXtpZihzZT09PWNsZWFyVGltZW91dClyZXR1cm4gY2xlYXJUaW1lb3V0KHIpO2lmKChzZT09PW5ufHwhc2UpJiZjbGVhclRpbWVvdXQpcmV0dXJuIHNlPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQocik7dHJ5e3JldHVybiBzZShyKX1jYXRjaHt0cnl7cmV0dXJuIHNlLmNhbGwobnVsbCxyKX1jYXRjaHtyZXR1cm4gc2UuY2FsbCh0aGlzLHIpfX19dmFyIHBlPVtdLEplPSExLGtlLER0PS0xO2Z1bmN0aW9uIEthKCl7IUplfHwha2V8fChKZT0hMSxrZS5sZW5ndGg/cGU9a2UuY29uY2F0KHBlKTpEdD0tMSxwZS5sZW5ndGgmJkJpKCkpfWZ1bmN0aW9uIEJpKCl7aWYoIUplKXt2YXIgcj1DaShLYSk7SmU9ITA7Zm9yKHZhciBlPXBlLmxlbmd0aDtlOyl7Zm9yKGtlPXBlLHBlPVtdOysrRHQ8ZTspa2UmJmtlW0R0XS5ydW4oKTtEdD0tMSxlPXBlLmxlbmd0aH1rZT1udWxsLEplPSExLFlhKHIpfX1QLm5leHRUaWNrPWZ1bmN0aW9uKHIpe3ZhciBlPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKWVbdC0xXT1hcmd1bWVudHNbdF07cGUucHVzaChuZXcgTWkocixlKSkscGUubGVuZ3RoPT09MSYmIUplJiZDaShCaSl9O2Z1bmN0aW9uIE1pKHIsZSl7dGhpcy5mdW49cix0aGlzLmFycmF5PWV9TWkucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe3RoaXMuZnVuLmFwcGx5KG51bGwsdGhpcy5hcnJheSl9O1AudGl0bGU9XCJicm93c2VyXCI7UC5icm93c2VyPSEwO1AuZW52PXt9O1AuYXJndj1bXTtQLnZlcnNpb249XCJcIjtQLnZlcnNpb25zPXt9O2Z1bmN0aW9uIGhlKCl7fVAub249aGU7UC5hZGRMaXN0ZW5lcj1oZTtQLm9uY2U9aGU7UC5vZmY9aGU7UC5yZW1vdmVMaXN0ZW5lcj1oZTtQLnJlbW92ZUFsbExpc3RlbmVycz1oZTtQLmVtaXQ9aGU7UC5wcmVwZW5kTGlzdGVuZXI9aGU7UC5wcmVwZW5kT25jZUxpc3RlbmVyPWhlO1AubGlzdGVuZXJzPWZ1bmN0aW9uKHIpe3JldHVybltdfTtQLmJpbmRpbmc9ZnVuY3Rpb24ocil7dGhyb3cgbmV3IEVycm9yKFwicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWRcIil9O1AuY3dkPWZ1bmN0aW9uKCl7cmV0dXJuXCIvXCJ9O1AuY2hkaXI9ZnVuY3Rpb24ocil7dGhyb3cgbmV3IEVycm9yKFwicHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkXCIpfTtQLnVtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIDB9fSk7dmFyIEFpLFhhLGM9aGEoKCk9PntBaT1DKFhlKCkpLFhhPUMoSWkoKSk7d2luZG93LkJ1ZmZlcj1BaS5CdWZmZXI7d2luZG93LnByb2Nlc3M9WGF9KTt2YXIgamk9UygobGwsb24pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO3ZhciBRZT10eXBlb2YgUmVmbGVjdD09XCJvYmplY3RcIj9SZWZsZWN0Om51bGwsRmk9UWUmJnR5cGVvZiBRZS5hcHBseT09XCJmdW5jdGlvblwiP1FlLmFwcGx5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoZSx0LG4pfSxOdDtRZSYmdHlwZW9mIFFlLm93bktleXM9PVwiZnVuY3Rpb25cIj9OdD1RZS5vd25LZXlzOk9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM/TnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpKX06TnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpfTtmdW5jdGlvbiBKYShyKXtjb25zb2xlJiZjb25zb2xlLndhcm4mJmNvbnNvbGUud2FybihyKX12YXIga2k9TnVtYmVyLmlzTmFOfHxmdW5jdGlvbihlKXtyZXR1cm4gZSE9PWV9O2Z1bmN0aW9uIEIoKXtCLmluaXQuY2FsbCh0aGlzKX1vbi5leHBvcnRzPUI7b24uZXhwb3J0cy5vbmNlPXR1O0IuRXZlbnRFbWl0dGVyPUI7Qi5wcm90b3R5cGUuX2V2ZW50cz12b2lkIDA7Qi5wcm90b3R5cGUuX2V2ZW50c0NvdW50PTA7Qi5wcm90b3R5cGUuX21heExpc3RlbmVycz12b2lkIDA7dmFyIFBpPTEwO2Z1bmN0aW9uIEh0KHIpe2lmKHR5cGVvZiByIT1cImZ1bmN0aW9uXCIpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwibGlzdGVuZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2Ygcil9T2JqZWN0LmRlZmluZVByb3BlcnR5KEIsXCJkZWZhdWx0TWF4TGlzdGVuZXJzXCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFBpfSxzZXQ6ZnVuY3Rpb24ocil7aWYodHlwZW9mIHIhPVwibnVtYmVyXCJ8fHI8MHx8a2kocikpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcImRlZmF1bHRNYXhMaXN0ZW5lcnNcIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK3IrXCIuXCIpO1BpPXJ9fSk7Qi5pbml0PWZ1bmN0aW9uKCl7KHRoaXMuX2V2ZW50cz09PXZvaWQgMHx8dGhpcy5fZXZlbnRzPT09T2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpJiYodGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fZXZlbnRzQ291bnQ9MCksdGhpcy5fbWF4TGlzdGVuZXJzPXRoaXMuX21heExpc3RlbmVyc3x8dm9pZCAwfTtCLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGUhPVwibnVtYmVyXCJ8fGU8MHx8a2koZSkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcIm5cIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK2UrXCIuXCIpO3JldHVybiB0aGlzLl9tYXhMaXN0ZW5lcnM9ZSx0aGlzfTtmdW5jdGlvbiBPaShyKXtyZXR1cm4gci5fbWF4TGlzdGVuZXJzPT09dm9pZCAwP0IuZGVmYXVsdE1heExpc3RlbmVyczpyLl9tYXhMaXN0ZW5lcnN9Qi5wcm90b3R5cGUuZ2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIE9pKHRoaXMpfTtCLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0LnB1c2goYXJndW1lbnRzW25dKTt2YXIgaT1lPT09XCJlcnJvclwiLG89dGhpcy5fZXZlbnRzO2lmKG8hPT12b2lkIDApaT1pJiZvLmVycm9yPT09dm9pZCAwO2Vsc2UgaWYoIWkpcmV0dXJuITE7aWYoaSl7dmFyIHM7aWYodC5sZW5ndGg+MCYmKHM9dFswXSkscyBpbnN0YW5jZW9mIEVycm9yKXRocm93IHM7dmFyIGE9bmV3IEVycm9yKFwiVW5oYW5kbGVkIGVycm9yLlwiKyhzP1wiIChcIitzLm1lc3NhZ2UrXCIpXCI6XCJcIikpO3Rocm93IGEuY29udGV4dD1zLGF9dmFyIHU9b1tlXTtpZih1PT09dm9pZCAwKXJldHVybiExO2lmKHR5cGVvZiB1PT1cImZ1bmN0aW9uXCIpRmkodSx0aGlzLHQpO2Vsc2UgZm9yKHZhciBmPXUubGVuZ3RoLGw9cWkodSxmKSxuPTA7bjxmOysrbilGaShsW25dLHRoaXMsdCk7cmV0dXJuITB9O2Z1bmN0aW9uIFVpKHIsZSx0LG4pe3ZhciBpLG8scztpZihIdCh0KSxvPXIuX2V2ZW50cyxvPT09dm9pZCAwPyhvPXIuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHIuX2V2ZW50c0NvdW50PTApOihvLm5ld0xpc3RlbmVyIT09dm9pZCAwJiYoci5lbWl0KFwibmV3TGlzdGVuZXJcIixlLHQubGlzdGVuZXI/dC5saXN0ZW5lcjp0KSxvPXIuX2V2ZW50cykscz1vW2VdKSxzPT09dm9pZCAwKXM9b1tlXT10LCsrci5fZXZlbnRzQ291bnQ7ZWxzZSBpZih0eXBlb2Ygcz09XCJmdW5jdGlvblwiP3M9b1tlXT1uP1t0LHNdOltzLHRdOm4/cy51bnNoaWZ0KHQpOnMucHVzaCh0KSxpPU9pKHIpLGk+MCYmcy5sZW5ndGg+aSYmIXMud2FybmVkKXtzLndhcm5lZD0hMDt2YXIgYT1uZXcgRXJyb3IoXCJQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuIFwiK3MubGVuZ3RoK1wiIFwiK1N0cmluZyhlKStcIiBsaXN0ZW5lcnMgYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0XCIpO2EubmFtZT1cIk1heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZ1wiLGEuZW1pdHRlcj1yLGEudHlwZT1lLGEuY291bnQ9cy5sZW5ndGgsSmEoYSl9cmV0dXJuIHJ9Qi5wcm90b3R5cGUuYWRkTGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gVWkodGhpcyxlLHQsITEpfTtCLnByb3RvdHlwZS5vbj1CLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtCLnByb3RvdHlwZS5wcmVwZW5kTGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gVWkodGhpcyxlLHQsITApfTtmdW5jdGlvbiBRYSgpe2lmKCF0aGlzLmZpcmVkKXJldHVybiB0aGlzLnRhcmdldC5yZW1vdmVMaXN0ZW5lcih0aGlzLnR5cGUsdGhpcy53cmFwRm4pLHRoaXMuZmlyZWQ9ITAsYXJndW1lbnRzLmxlbmd0aD09PTA/dGhpcy5saXN0ZW5lci5jYWxsKHRoaXMudGFyZ2V0KTp0aGlzLmxpc3RlbmVyLmFwcGx5KHRoaXMudGFyZ2V0LGFyZ3VtZW50cyl9ZnVuY3Rpb24gRGkocixlLHQpe3ZhciBuPXtmaXJlZDohMSx3cmFwRm46dm9pZCAwLHRhcmdldDpyLHR5cGU6ZSxsaXN0ZW5lcjp0fSxpPVFhLmJpbmQobik7cmV0dXJuIGkubGlzdGVuZXI9dCxuLndyYXBGbj1pLGl9Qi5wcm90b3R5cGUub25jZT1mdW5jdGlvbihlLHQpe3JldHVybiBIdCh0KSx0aGlzLm9uKGUsRGkodGhpcyxlLHQpKSx0aGlzfTtCLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIEh0KHQpLHRoaXMucHJlcGVuZExpc3RlbmVyKGUsRGkodGhpcyxlLHQpKSx0aGlzfTtCLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3ZhciBuLGksbyxzLGE7aWYoSHQodCksaT10aGlzLl9ldmVudHMsaT09PXZvaWQgMClyZXR1cm4gdGhpcztpZihuPWlbZV0sbj09PXZvaWQgMClyZXR1cm4gdGhpcztpZihuPT09dHx8bi5saXN0ZW5lcj09PXQpLS10aGlzLl9ldmVudHNDb3VudD09PTA/dGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCk6KGRlbGV0ZSBpW2VdLGkucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdChcInJlbW92ZUxpc3RlbmVyXCIsZSxuLmxpc3RlbmVyfHx0KSk7ZWxzZSBpZih0eXBlb2YgbiE9XCJmdW5jdGlvblwiKXtmb3Iobz0tMSxzPW4ubGVuZ3RoLTE7cz49MDtzLS0paWYobltzXT09PXR8fG5bc10ubGlzdGVuZXI9PT10KXthPW5bc10ubGlzdGVuZXIsbz1zO2JyZWFrfWlmKG88MClyZXR1cm4gdGhpcztvPT09MD9uLnNoaWZ0KCk6WmEobixvKSxuLmxlbmd0aD09PTEmJihpW2VdPW5bMF0pLGkucmVtb3ZlTGlzdGVuZXIhPT12b2lkIDAmJnRoaXMuZW1pdChcInJlbW92ZUxpc3RlbmVyXCIsZSxhfHx0KX1yZXR1cm4gdGhpc307Qi5wcm90b3R5cGUub2ZmPUIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyO0IucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbihlKXt2YXIgdCxuLGk7aWYobj10aGlzLl9ldmVudHMsbj09PXZvaWQgMClyZXR1cm4gdGhpcztpZihuLnJlbW92ZUxpc3RlbmVyPT09dm9pZCAwKXJldHVybiBhcmd1bWVudHMubGVuZ3RoPT09MD8odGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fZXZlbnRzQ291bnQ9MCk6bltlXSE9PXZvaWQgMCYmKC0tdGhpcy5fZXZlbnRzQ291bnQ9PT0wP3RoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpOmRlbGV0ZSBuW2VdKSx0aGlzO2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0wKXt2YXIgbz1PYmplY3Qua2V5cyhuKSxzO2ZvcihpPTA7aTxvLmxlbmd0aDsrK2kpcz1vW2ldLHMhPT1cInJlbW92ZUxpc3RlbmVyXCImJnRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKHMpO3JldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhcInJlbW92ZUxpc3RlbmVyXCIpLHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTAsdGhpc31pZih0PW5bZV0sdHlwZW9mIHQ9PVwiZnVuY3Rpb25cIil0aGlzLnJlbW92ZUxpc3RlbmVyKGUsdCk7ZWxzZSBpZih0IT09dm9pZCAwKWZvcihpPXQubGVuZ3RoLTE7aT49MDtpLS0pdGhpcy5yZW1vdmVMaXN0ZW5lcihlLHRbaV0pO3JldHVybiB0aGlzfTtmdW5jdGlvbiBOaShyLGUsdCl7dmFyIG49ci5fZXZlbnRzO2lmKG49PT12b2lkIDApcmV0dXJuW107dmFyIGk9bltlXTtyZXR1cm4gaT09PXZvaWQgMD9bXTp0eXBlb2YgaT09XCJmdW5jdGlvblwiP3Q/W2kubGlzdGVuZXJ8fGldOltpXTp0P2V1KGkpOnFpKGksaS5sZW5ndGgpfUIucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbihlKXtyZXR1cm4gTmkodGhpcyxlLCEwKX07Qi5wcm90b3R5cGUucmF3TGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3JldHVybiBOaSh0aGlzLGUsITEpfTtCLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24ocixlKXtyZXR1cm4gdHlwZW9mIHIubGlzdGVuZXJDb3VudD09XCJmdW5jdGlvblwiP3IubGlzdGVuZXJDb3VudChlKTpIaS5jYWxsKHIsZSl9O0IucHJvdG90eXBlLmxpc3RlbmVyQ291bnQ9SGk7ZnVuY3Rpb24gSGkocil7dmFyIGU9dGhpcy5fZXZlbnRzO2lmKGUhPT12b2lkIDApe3ZhciB0PWVbcl07aWYodHlwZW9mIHQ9PVwiZnVuY3Rpb25cIilyZXR1cm4gMTtpZih0IT09dm9pZCAwKXJldHVybiB0Lmxlbmd0aH1yZXR1cm4gMH1CLnByb3RvdHlwZS5ldmVudE5hbWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50PjA/TnQodGhpcy5fZXZlbnRzKTpbXX07ZnVuY3Rpb24gcWkocixlKXtmb3IodmFyIHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7KytuKXRbbl09cltuXTtyZXR1cm4gdH1mdW5jdGlvbiBaYShyLGUpe2Zvcig7ZSsxPHIubGVuZ3RoO2UrKylyW2VdPXJbZSsxXTtyLnBvcCgpfWZ1bmN0aW9uIGV1KHIpe2Zvcih2YXIgZT1uZXcgQXJyYXkoci5sZW5ndGgpLHQ9MDt0PGUubGVuZ3RoOysrdCllW3RdPXJbdF0ubGlzdGVuZXJ8fHJbdF07cmV0dXJuIGV9ZnVuY3Rpb24gdHUocixlKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24odCxuKXtmdW5jdGlvbiBpKCl7byE9PXZvaWQgMCYmci5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsbyksdChbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpfXZhciBvO2UhPT1cImVycm9yXCImJihvPWZ1bmN0aW9uKGEpe3IucmVtb3ZlTGlzdGVuZXIoZSxpKSxuKGEpfSxyLm9uY2UoXCJlcnJvclwiLG8pKSxyLm9uY2UoZSxpKX0pfX0pO3ZhciBPZT1TKChkbCxzbik9PntjKCk7dHlwZW9mIE9iamVjdC5jcmVhdGU9PVwiZnVuY3Rpb25cIj9zbi5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dCYmKGUuc3VwZXJfPXQsZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSkpfTpzbi5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7aWYodCl7ZS5zdXBlcl89dDt2YXIgbj1mdW5jdGlvbigpe307bi5wcm90b3R5cGU9dC5wcm90b3R5cGUsZS5wcm90b3R5cGU9bmV3IG4sZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZX19fSk7dmFyIHVuPVMoKHBsLGFuKT0+e1widXNlIHN0cmljdFwiO2MoKTt2YXIgWmU9dHlwZW9mIFJlZmxlY3Q9PVwib2JqZWN0XCI/UmVmbGVjdDpudWxsLFdpPVplJiZ0eXBlb2YgWmUuYXBwbHk9PVwiZnVuY3Rpb25cIj9aZS5hcHBseTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGUsdCxuKX0scXQ7WmUmJnR5cGVvZiBaZS5vd25LZXlzPT1cImZ1bmN0aW9uXCI/cXQ9WmUub3duS2V5czpPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzP3F0PWZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKS5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKSl9OnF0PWZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKX07ZnVuY3Rpb24gcnUocil7Y29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4ocil9dmFyIEdpPU51bWJlci5pc05hTnx8ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT1lfTtmdW5jdGlvbiBNKCl7TS5pbml0LmNhbGwodGhpcyl9YW4uZXhwb3J0cz1NO2FuLmV4cG9ydHMub25jZT1zdTtNLkV2ZW50RW1pdHRlcj1NO00ucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwO00ucHJvdG90eXBlLl9ldmVudHNDb3VudD0wO00ucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwO3ZhciAkaT0xMDtmdW5jdGlvbiBqdChyKXtpZih0eXBlb2YgciE9XCJmdW5jdGlvblwiKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIHIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShNLFwiZGVmYXVsdE1heExpc3RlbmVyc1wiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiAkaX0sc2V0OmZ1bmN0aW9uKHIpe2lmKHR5cGVvZiByIT1cIm51bWJlclwifHxyPDB8fEdpKHIpKXRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJkZWZhdWx0TWF4TGlzdGVuZXJzXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJytyK1wiLlwiKTskaT1yfX0pO00uaW5pdD1mdW5jdGlvbigpeyh0aGlzLl9ldmVudHM9PT12b2lkIDB8fHRoaXMuX2V2ZW50cz09PU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSYmKHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApLHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH07TS5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlIT1cIm51bWJlclwifHxlPDB8fEdpKGUpKXRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJuXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJytlK1wiLlwiKTtyZXR1cm4gdGhpcy5fbWF4TGlzdGVuZXJzPWUsdGhpc307ZnVuY3Rpb24gVmkocil7cmV0dXJuIHIuX21heExpc3RlbmVycz09PXZvaWQgMD9NLmRlZmF1bHRNYXhMaXN0ZW5lcnM6ci5fbWF4TGlzdGVuZXJzfU0ucHJvdG90eXBlLmdldE1heExpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybiBWaSh0aGlzKX07TS5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdC5wdXNoKGFyZ3VtZW50c1tuXSk7dmFyIGk9ZT09PVwiZXJyb3JcIixvPXRoaXMuX2V2ZW50cztpZihvIT09dm9pZCAwKWk9aSYmby5lcnJvcj09PXZvaWQgMDtlbHNlIGlmKCFpKXJldHVybiExO2lmKGkpe3ZhciBzO2lmKHQubGVuZ3RoPjAmJihzPXRbMF0pLHMgaW5zdGFuY2VvZiBFcnJvcil0aHJvdyBzO3ZhciBhPW5ldyBFcnJvcihcIlVuaGFuZGxlZCBlcnJvci5cIisocz9cIiAoXCIrcy5tZXNzYWdlK1wiKVwiOlwiXCIpKTt0aHJvdyBhLmNvbnRleHQ9cyxhfXZhciB1PW9bZV07aWYodT09PXZvaWQgMClyZXR1cm4hMTtpZih0eXBlb2YgdT09XCJmdW5jdGlvblwiKVdpKHUsdGhpcyx0KTtlbHNlIGZvcih2YXIgZj11Lmxlbmd0aCxsPUppKHUsZiksbj0wO248ZjsrK24pV2kobFtuXSx0aGlzLHQpO3JldHVybiEwfTtmdW5jdGlvbiB6aShyLGUsdCxuKXt2YXIgaSxvLHM7aWYoanQodCksbz1yLl9ldmVudHMsbz09PXZvaWQgMD8obz1yLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSxyLl9ldmVudHNDb3VudD0wKTooby5uZXdMaXN0ZW5lciE9PXZvaWQgMCYmKHIuZW1pdChcIm5ld0xpc3RlbmVyXCIsZSx0Lmxpc3RlbmVyP3QubGlzdGVuZXI6dCksbz1yLl9ldmVudHMpLHM9b1tlXSkscz09PXZvaWQgMClzPW9bZV09dCwrK3IuX2V2ZW50c0NvdW50O2Vsc2UgaWYodHlwZW9mIHM9PVwiZnVuY3Rpb25cIj9zPW9bZV09bj9bdCxzXTpbcyx0XTpuP3MudW5zaGlmdCh0KTpzLnB1c2godCksaT1WaShyKSxpPjAmJnMubGVuZ3RoPmkmJiFzLndhcm5lZCl7cy53YXJuZWQ9ITA7dmFyIGE9bmV3IEVycm9yKFwiUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiBcIitzLmxlbmd0aCtcIiBcIitTdHJpbmcoZSkrXCIgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdFwiKTthLm5hbWU9XCJNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmdcIixhLmVtaXR0ZXI9cixhLnR5cGU9ZSxhLmNvdW50PXMubGVuZ3RoLHJ1KGEpfXJldHVybiByfU0ucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHppKHRoaXMsZSx0LCExKX07TS5wcm90b3R5cGUub249TS5wcm90b3R5cGUuYWRkTGlzdGVuZXI7TS5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHppKHRoaXMsZSx0LCEwKX07ZnVuY3Rpb24gbnUoKXtpZighdGhpcy5maXJlZClyZXR1cm4gdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLHRoaXMud3JhcEZuKSx0aGlzLmZpcmVkPSEwLGFyZ3VtZW50cy5sZW5ndGg9PT0wP3RoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk6dGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCxhcmd1bWVudHMpfWZ1bmN0aW9uIFlpKHIsZSx0KXt2YXIgbj17ZmlyZWQ6ITEsd3JhcEZuOnZvaWQgMCx0YXJnZXQ6cix0eXBlOmUsbGlzdGVuZXI6dH0saT1udS5iaW5kKG4pO3JldHVybiBpLmxpc3RlbmVyPXQsbi53cmFwRm49aSxpfU0ucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4ganQodCksdGhpcy5vbihlLFlpKHRoaXMsZSx0KSksdGhpc307TS5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3JldHVybiBqdCh0KSx0aGlzLnByZXBlbmRMaXN0ZW5lcihlLFlpKHRoaXMsZSx0KSksdGhpc307TS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXt2YXIgbixpLG8scyxhO2lmKGp0KHQpLGk9dGhpcy5fZXZlbnRzLGk9PT12b2lkIDApcmV0dXJuIHRoaXM7aWYobj1pW2VdLG49PT12b2lkIDApcmV0dXJuIHRoaXM7aWYobj09PXR8fG4ubGlzdGVuZXI9PT10KS0tdGhpcy5fZXZlbnRzQ291bnQ9PT0wP3RoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpOihkZWxldGUgaVtlXSxpLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoXCJyZW1vdmVMaXN0ZW5lclwiLGUsbi5saXN0ZW5lcnx8dCkpO2Vsc2UgaWYodHlwZW9mIG4hPVwiZnVuY3Rpb25cIil7Zm9yKG89LTEscz1uLmxlbmd0aC0xO3M+PTA7cy0tKWlmKG5bc109PT10fHxuW3NdLmxpc3RlbmVyPT09dCl7YT1uW3NdLmxpc3RlbmVyLG89czticmVha31pZihvPDApcmV0dXJuIHRoaXM7bz09PTA/bi5zaGlmdCgpOml1KG4sbyksbi5sZW5ndGg9PT0xJiYoaVtlXT1uWzBdKSxpLnJlbW92ZUxpc3RlbmVyIT09dm9pZCAwJiZ0aGlzLmVtaXQoXCJyZW1vdmVMaXN0ZW5lclwiLGUsYXx8dCl9cmV0dXJuIHRoaXN9O00ucHJvdG90eXBlLm9mZj1NLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcjtNLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7dmFyIHQsbixpO2lmKG49dGhpcy5fZXZlbnRzLG49PT12b2lkIDApcmV0dXJuIHRoaXM7aWYobi5yZW1vdmVMaXN0ZW5lcj09PXZvaWQgMClyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTA/KHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApOm5bZV0hPT12b2lkIDAmJigtLXRoaXMuX2V2ZW50c0NvdW50PT09MD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTpkZWxldGUgbltlXSksdGhpcztpZihhcmd1bWVudHMubGVuZ3RoPT09MCl7dmFyIG89T2JqZWN0LmtleXMobikscztmb3IoaT0wO2k8by5sZW5ndGg7KytpKXM9b1tpXSxzIT09XCJyZW1vdmVMaXN0ZW5lclwiJiZ0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhzKTtyZXR1cm4gdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJyZW1vdmVMaXN0ZW5lclwiKSx0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wLHRoaXN9aWYodD1uW2VdLHR5cGVvZiB0PT1cImZ1bmN0aW9uXCIpdGhpcy5yZW1vdmVMaXN0ZW5lcihlLHQpO2Vsc2UgaWYodCE9PXZvaWQgMClmb3IoaT10Lmxlbmd0aC0xO2k+PTA7aS0tKXRoaXMucmVtb3ZlTGlzdGVuZXIoZSx0W2ldKTtyZXR1cm4gdGhpc307ZnVuY3Rpb24gS2kocixlLHQpe3ZhciBuPXIuX2V2ZW50cztpZihuPT09dm9pZCAwKXJldHVybltdO3ZhciBpPW5bZV07cmV0dXJuIGk9PT12b2lkIDA/W106dHlwZW9mIGk9PVwiZnVuY3Rpb25cIj90P1tpLmxpc3RlbmVyfHxpXTpbaV06dD9vdShpKTpKaShpLGkubGVuZ3RoKX1NLnByb3RvdHlwZS5saXN0ZW5lcnM9ZnVuY3Rpb24oZSl7cmV0dXJuIEtpKHRoaXMsZSwhMCl9O00ucHJvdG90eXBlLnJhd0xpc3RlbmVycz1mdW5jdGlvbihlKXtyZXR1cm4gS2kodGhpcyxlLCExKX07TS5saXN0ZW5lckNvdW50PWZ1bmN0aW9uKHIsZSl7cmV0dXJuIHR5cGVvZiByLmxpc3RlbmVyQ291bnQ9PVwiZnVuY3Rpb25cIj9yLmxpc3RlbmVyQ291bnQoZSk6WGkuY2FsbChyLGUpfTtNLnByb3RvdHlwZS5saXN0ZW5lckNvdW50PVhpO2Z1bmN0aW9uIFhpKHIpe3ZhciBlPXRoaXMuX2V2ZW50cztpZihlIT09dm9pZCAwKXt2YXIgdD1lW3JdO2lmKHR5cGVvZiB0PT1cImZ1bmN0aW9uXCIpcmV0dXJuIDE7aWYodCE9PXZvaWQgMClyZXR1cm4gdC5sZW5ndGh9cmV0dXJuIDB9TS5wcm90b3R5cGUuZXZlbnROYW1lcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudHNDb3VudD4wP3F0KHRoaXMuX2V2ZW50cyk6W119O2Z1bmN0aW9uIEppKHIsZSl7Zm9yKHZhciB0PW5ldyBBcnJheShlKSxuPTA7bjxlOysrbil0W25dPXJbbl07cmV0dXJuIHR9ZnVuY3Rpb24gaXUocixlKXtmb3IoO2UrMTxyLmxlbmd0aDtlKyspcltlXT1yW2UrMV07ci5wb3AoKX1mdW5jdGlvbiBvdShyKXtmb3IodmFyIGU9bmV3IEFycmF5KHIubGVuZ3RoKSx0PTA7dDxlLmxlbmd0aDsrK3QpZVt0XT1yW3RdLmxpc3RlbmVyfHxyW3RdO3JldHVybiBlfWZ1bmN0aW9uIHN1KHIsZSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gaSgpe28hPT12b2lkIDAmJnIucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLG8pLHQoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKX12YXIgbztlIT09XCJlcnJvclwiJiYobz1mdW5jdGlvbihhKXtyLnJlbW92ZUxpc3RlbmVyKGUsaSksbihhKX0sci5vbmNlKFwiZXJyb3JcIixvKSksci5vbmNlKGUsaSl9KX19KTt2YXIgZm49UygoaGwsUWkpPT57YygpO1FpLmV4cG9ydHM9dW4oKS5FdmVudEVtaXR0ZXJ9KTt2YXIgY249UygoKT0+e2MoKX0pO3ZhciBybz1TKCh5bCx0byk9PntcInVzZSBzdHJpY3RcIjtjKCk7ZnVuY3Rpb24gWmkocixlKXt2YXIgdD1PYmplY3Qua2V5cyhyKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgbj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHIpO2UmJihuPW4uZmlsdGVyKGZ1bmN0aW9uKGkpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsaSkuZW51bWVyYWJsZX0pKSx0LnB1c2guYXBwbHkodCxuKX1yZXR1cm4gdH1mdW5jdGlvbiBhdShyKXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgdD1hcmd1bWVudHNbZV0hPW51bGw/YXJndW1lbnRzW2VdOnt9O2UlMj9aaShPYmplY3QodCksITApLmZvckVhY2goZnVuY3Rpb24obil7dXUocixuLHRbbl0pfSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMocixPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSk6WmkoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLG4sT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LG4pKX0pfXJldHVybiByfWZ1bmN0aW9uIHV1KHIsZSx0KXtyZXR1cm4gZSBpbiByP09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLGUse3ZhbHVlOnQsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTpyW2VdPXQscn1mdW5jdGlvbiBmdShyLGUpe2lmKCEociBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gZW8ocixlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIG49ZVt0XTtuLmVudW1lcmFibGU9bi5lbnVtZXJhYmxlfHwhMSxuLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBuJiYobi53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsbi5rZXksbil9fWZ1bmN0aW9uIGN1KHIsZSx0KXtyZXR1cm4gZSYmZW8oci5wcm90b3R5cGUsZSksdCYmZW8ocix0KSxyfXZhciBsdT1YZSgpLFd0PWx1LkJ1ZmZlcixkdT1jbigpLGxuPWR1Lmluc3BlY3QscHU9bG4mJmxuLmN1c3RvbXx8XCJpbnNwZWN0XCI7ZnVuY3Rpb24gaHUocixlLHQpe1d0LnByb3RvdHlwZS5jb3B5LmNhbGwocixlLHQpfXRvLmV4cG9ydHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiByKCl7ZnUodGhpcyxyKSx0aGlzLmhlYWQ9bnVsbCx0aGlzLnRhaWw9bnVsbCx0aGlzLmxlbmd0aD0wfXJldHVybiBjdShyLFt7a2V5OlwicHVzaFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBuPXtkYXRhOnQsbmV4dDpudWxsfTt0aGlzLmxlbmd0aD4wP3RoaXMudGFpbC5uZXh0PW46dGhpcy5oZWFkPW4sdGhpcy50YWlsPW4sKyt0aGlzLmxlbmd0aH19LHtrZXk6XCJ1bnNoaWZ0XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIG49e2RhdGE6dCxuZXh0OnRoaXMuaGVhZH07dGhpcy5sZW5ndGg9PT0wJiYodGhpcy50YWlsPW4pLHRoaXMuaGVhZD1uLCsrdGhpcy5sZW5ndGh9fSx7a2V5Olwic2hpZnRcIix2YWx1ZTpmdW5jdGlvbigpe2lmKHRoaXMubGVuZ3RoIT09MCl7dmFyIHQ9dGhpcy5oZWFkLmRhdGE7cmV0dXJuIHRoaXMubGVuZ3RoPT09MT90aGlzLmhlYWQ9dGhpcy50YWlsPW51bGw6dGhpcy5oZWFkPXRoaXMuaGVhZC5uZXh0LC0tdGhpcy5sZW5ndGgsdH19fSx7a2V5OlwiY2xlYXJcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbCx0aGlzLmxlbmd0aD0wfX0se2tleTpcImpvaW5cIix2YWx1ZTpmdW5jdGlvbih0KXtpZih0aGlzLmxlbmd0aD09PTApcmV0dXJuXCJcIjtmb3IodmFyIG49dGhpcy5oZWFkLGk9XCJcIituLmRhdGE7bj1uLm5leHQ7KWkrPXQrbi5kYXRhO3JldHVybiBpfX0se2tleTpcImNvbmNhdFwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHRoaXMubGVuZ3RoPT09MClyZXR1cm4gV3QuYWxsb2MoMCk7Zm9yKHZhciBuPVd0LmFsbG9jVW5zYWZlKHQ+Pj4wKSxpPXRoaXMuaGVhZCxvPTA7aTspaHUoaS5kYXRhLG4sbyksbys9aS5kYXRhLmxlbmd0aCxpPWkubmV4dDtyZXR1cm4gbn19LHtrZXk6XCJjb25zdW1lXCIsdmFsdWU6ZnVuY3Rpb24odCxuKXt2YXIgaTtyZXR1cm4gdDx0aGlzLmhlYWQuZGF0YS5sZW5ndGg/KGk9dGhpcy5oZWFkLmRhdGEuc2xpY2UoMCx0KSx0aGlzLmhlYWQuZGF0YT10aGlzLmhlYWQuZGF0YS5zbGljZSh0KSk6dD09PXRoaXMuaGVhZC5kYXRhLmxlbmd0aD9pPXRoaXMuc2hpZnQoKTppPW4/dGhpcy5fZ2V0U3RyaW5nKHQpOnRoaXMuX2dldEJ1ZmZlcih0KSxpfX0se2tleTpcImZpcnN0XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oZWFkLmRhdGF9fSx7a2V5OlwiX2dldFN0cmluZ1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuaGVhZCxpPTEsbz1uLmRhdGE7Zm9yKHQtPW8ubGVuZ3RoO249bi5uZXh0Oyl7dmFyIHM9bi5kYXRhLGE9dD5zLmxlbmd0aD9zLmxlbmd0aDp0O2lmKGE9PT1zLmxlbmd0aD9vKz1zOm8rPXMuc2xpY2UoMCx0KSx0LT1hLHQ9PT0wKXthPT09cy5sZW5ndGg/KCsraSxuLm5leHQ/dGhpcy5oZWFkPW4ubmV4dDp0aGlzLmhlYWQ9dGhpcy50YWlsPW51bGwpOih0aGlzLmhlYWQ9bixuLmRhdGE9cy5zbGljZShhKSk7YnJlYWt9KytpfXJldHVybiB0aGlzLmxlbmd0aC09aSxvfX0se2tleTpcIl9nZXRCdWZmZXJcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgbj1XdC5hbGxvY1Vuc2FmZSh0KSxpPXRoaXMuaGVhZCxvPTE7Zm9yKGkuZGF0YS5jb3B5KG4pLHQtPWkuZGF0YS5sZW5ndGg7aT1pLm5leHQ7KXt2YXIgcz1pLmRhdGEsYT10PnMubGVuZ3RoP3MubGVuZ3RoOnQ7aWYocy5jb3B5KG4sbi5sZW5ndGgtdCwwLGEpLHQtPWEsdD09PTApe2E9PT1zLmxlbmd0aD8oKytvLGkubmV4dD90aGlzLmhlYWQ9aS5uZXh0OnRoaXMuaGVhZD10aGlzLnRhaWw9bnVsbCk6KHRoaXMuaGVhZD1pLGkuZGF0YT1zLnNsaWNlKGEpKTticmVha30rK299cmV0dXJuIHRoaXMubGVuZ3RoLT1vLG59fSx7a2V5OnB1LHZhbHVlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGxuKHRoaXMsYXUoe30sbix7ZGVwdGg6MCxjdXN0b21JbnNwZWN0OiExfSkpfX1dKSxyfSgpfSk7dmFyIHBuPVMoKGJsLGlvKT0+e1widXNlIHN0cmljdFwiO2MoKTtmdW5jdGlvbiBtdShyLGUpe3ZhciB0PXRoaXMsbj10aGlzLl9yZWFkYWJsZVN0YXRlJiZ0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCxpPXRoaXMuX3dyaXRhYmxlU3RhdGUmJnRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkO3JldHVybiBufHxpPyhlP2Uocik6ciYmKHRoaXMuX3dyaXRhYmxlU3RhdGU/dGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWR8fCh0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMCxwcm9jZXNzLm5leHRUaWNrKGRuLHRoaXMscikpOnByb2Nlc3MubmV4dFRpY2soZG4sdGhpcyxyKSksdGhpcyk6KHRoaXMuX3JlYWRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD0hMCksdGhpcy5fd3JpdGFibGVTdGF0ZSYmKHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkPSEwKSx0aGlzLl9kZXN0cm95KHJ8fG51bGwsZnVuY3Rpb24obyl7IWUmJm8/dC5fd3JpdGFibGVTdGF0ZT90Ll93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD9wcm9jZXNzLm5leHRUaWNrKCR0LHQpOih0Ll93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMCxwcm9jZXNzLm5leHRUaWNrKG5vLHQsbykpOnByb2Nlc3MubmV4dFRpY2sobm8sdCxvKTplPyhwcm9jZXNzLm5leHRUaWNrKCR0LHQpLGUobykpOnByb2Nlc3MubmV4dFRpY2soJHQsdCl9KSx0aGlzKX1mdW5jdGlvbiBubyhyLGUpe2RuKHIsZSksJHQocil9ZnVuY3Rpb24gJHQocil7ci5fd3JpdGFibGVTdGF0ZSYmIXIuX3dyaXRhYmxlU3RhdGUuZW1pdENsb3NlfHxyLl9yZWFkYWJsZVN0YXRlJiYhci5fcmVhZGFibGVTdGF0ZS5lbWl0Q2xvc2V8fHIuZW1pdChcImNsb3NlXCIpfWZ1bmN0aW9uIGd1KCl7dGhpcy5fcmVhZGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkPSExLHRoaXMuX3JlYWRhYmxlU3RhdGUucmVhZGluZz0hMSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZGVkPSExLHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZD0hMSksdGhpcy5fd3JpdGFibGVTdGF0ZSYmKHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQ9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRpbmc9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5hbENhbGxlZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLnByZWZpbmlzaGVkPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQ9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITEpfWZ1bmN0aW9uIGRuKHIsZSl7ci5lbWl0KFwiZXJyb3JcIixlKX1mdW5jdGlvbiB5dShyLGUpe3ZhciB0PXIuX3JlYWRhYmxlU3RhdGUsbj1yLl93cml0YWJsZVN0YXRlO3QmJnQuYXV0b0Rlc3Ryb3l8fG4mJm4uYXV0b0Rlc3Ryb3k/ci5kZXN0cm95KGUpOnIuZW1pdChcImVycm9yXCIsZSl9aW8uZXhwb3J0cz17ZGVzdHJveTptdSx1bmRlc3Ryb3k6Z3UsZXJyb3JPckRlc3Ryb3k6eXV9fSk7dmFyIFVlPVMoKHhsLGFvKT0+e1widXNlIHN0cmljdFwiO2MoKTtmdW5jdGlvbiBidShyLGUpe3IucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUpLHIucHJvdG90eXBlLmNvbnN0cnVjdG9yPXIsci5fX3Byb3RvX189ZX12YXIgc289e307ZnVuY3Rpb24gWChyLGUsdCl7dHx8KHQ9RXJyb3IpO2Z1bmN0aW9uIG4obyxzLGEpe3JldHVybiB0eXBlb2YgZT09XCJzdHJpbmdcIj9lOmUobyxzLGEpfXZhciBpPWZ1bmN0aW9uKG8pe2J1KHMsbyk7ZnVuY3Rpb24gcyhhLHUsZil7cmV0dXJuIG8uY2FsbCh0aGlzLG4oYSx1LGYpKXx8dGhpc31yZXR1cm4gc30odCk7aS5wcm90b3R5cGUubmFtZT10Lm5hbWUsaS5wcm90b3R5cGUuY29kZT1yLHNvW3JdPWl9ZnVuY3Rpb24gb28ocixlKXtpZihBcnJheS5pc0FycmF5KHIpKXt2YXIgdD1yLmxlbmd0aDtyZXR1cm4gcj1yLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gU3RyaW5nKG4pfSksdD4yP1wib25lIG9mIFwiLmNvbmNhdChlLFwiIFwiKS5jb25jYXQoci5zbGljZSgwLHQtMSkuam9pbihcIiwgXCIpLFwiLCBvciBcIikrclt0LTFdOnQ9PT0yP1wib25lIG9mIFwiLmNvbmNhdChlLFwiIFwiKS5jb25jYXQoclswXSxcIiBvciBcIikuY29uY2F0KHJbMV0pOlwib2YgXCIuY29uY2F0KGUsXCIgXCIpLmNvbmNhdChyWzBdKX1lbHNlIHJldHVyblwib2YgXCIuY29uY2F0KGUsXCIgXCIpLmNvbmNhdChTdHJpbmcocikpfWZ1bmN0aW9uIHh1KHIsZSx0KXtyZXR1cm4gci5zdWJzdHIoIXR8fHQ8MD8wOit0LGUubGVuZ3RoKT09PWV9ZnVuY3Rpb24gX3UocixlLHQpe3JldHVybih0PT09dm9pZCAwfHx0PnIubGVuZ3RoKSYmKHQ9ci5sZW5ndGgpLHIuc3Vic3RyaW5nKHQtZS5sZW5ndGgsdCk9PT1lfWZ1bmN0aW9uIHd1KHIsZSx0KXtyZXR1cm4gdHlwZW9mIHQhPVwibnVtYmVyXCImJih0PTApLHQrZS5sZW5ndGg+ci5sZW5ndGg/ITE6ci5pbmRleE9mKGUsdCkhPT0tMX1YKFwiRVJSX0lOVkFMSURfT1BUX1ZBTFVFXCIsZnVuY3Rpb24ocixlKXtyZXR1cm4nVGhlIHZhbHVlIFwiJytlKydcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCInK3IrJ1wiJ30sVHlwZUVycm9yKTtYKFwiRVJSX0lOVkFMSURfQVJHX1RZUEVcIixmdW5jdGlvbihyLGUsdCl7dmFyIG47dHlwZW9mIGU9PVwic3RyaW5nXCImJnh1KGUsXCJub3QgXCIpPyhuPVwibXVzdCBub3QgYmVcIixlPWUucmVwbGFjZSgvXm5vdCAvLFwiXCIpKTpuPVwibXVzdCBiZVwiO3ZhciBpO2lmKF91KHIsXCIgYXJndW1lbnRcIikpaT1cIlRoZSBcIi5jb25jYXQocixcIiBcIikuY29uY2F0KG4sXCIgXCIpLmNvbmNhdChvbyhlLFwidHlwZVwiKSk7ZWxzZXt2YXIgbz13dShyLFwiLlwiKT9cInByb3BlcnR5XCI6XCJhcmd1bWVudFwiO2k9J1RoZSBcIicuY29uY2F0KHIsJ1wiICcpLmNvbmNhdChvLFwiIFwiKS5jb25jYXQobixcIiBcIikuY29uY2F0KG9vKGUsXCJ0eXBlXCIpKX1yZXR1cm4gaSs9XCIuIFJlY2VpdmVkIHR5cGUgXCIuY29uY2F0KHR5cGVvZiB0KSxpfSxUeXBlRXJyb3IpO1goXCJFUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GXCIsXCJzdHJlYW0ucHVzaCgpIGFmdGVyIEVPRlwiKTtYKFwiRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URURcIixmdW5jdGlvbihyKXtyZXR1cm5cIlRoZSBcIityK1wiIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWRcIn0pO1goXCJFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRVwiLFwiUHJlbWF0dXJlIGNsb3NlXCIpO1goXCJFUlJfU1RSRUFNX0RFU1RST1lFRFwiLGZ1bmN0aW9uKHIpe3JldHVyblwiQ2Fubm90IGNhbGwgXCIrcitcIiBhZnRlciBhIHN0cmVhbSB3YXMgZGVzdHJveWVkXCJ9KTtYKFwiRVJSX01VTFRJUExFX0NBTExCQUNLXCIsXCJDYWxsYmFjayBjYWxsZWQgbXVsdGlwbGUgdGltZXNcIik7WChcIkVSUl9TVFJFQU1fQ0FOTk9UX1BJUEVcIixcIkNhbm5vdCBwaXBlLCBub3QgcmVhZGFibGVcIik7WChcIkVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EXCIsXCJ3cml0ZSBhZnRlciBlbmRcIik7WChcIkVSUl9TVFJFQU1fTlVMTF9WQUxVRVNcIixcIk1heSBub3Qgd3JpdGUgbnVsbCB2YWx1ZXMgdG8gc3RyZWFtXCIsVHlwZUVycm9yKTtYKFwiRVJSX1VOS05PV05fRU5DT0RJTkdcIixmdW5jdGlvbihyKXtyZXR1cm5cIlVua25vd24gZW5jb2Rpbmc6IFwiK3J9LFR5cGVFcnJvcik7WChcIkVSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlRcIixcInN0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50XCIpO2FvLmV4cG9ydHMuY29kZXM9c299KTt2YXIgaG49UygoX2wsdW8pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO3ZhciB2dT1VZSgpLmNvZGVzLkVSUl9JTlZBTElEX09QVF9WQUxVRTtmdW5jdGlvbiBFdShyLGUsdCl7cmV0dXJuIHIuaGlnaFdhdGVyTWFyayE9bnVsbD9yLmhpZ2hXYXRlck1hcms6ZT9yW3RdOm51bGx9ZnVuY3Rpb24gU3UocixlLHQsbil7dmFyIGk9RXUoZSxuLHQpO2lmKGkhPW51bGwpe2lmKCEoaXNGaW5pdGUoaSkmJk1hdGguZmxvb3IoaSk9PT1pKXx8aTwwKXt2YXIgbz1uP3Q6XCJoaWdoV2F0ZXJNYXJrXCI7dGhyb3cgbmV3IHZ1KG8saSl9cmV0dXJuIE1hdGguZmxvb3IoaSl9cmV0dXJuIHIub2JqZWN0TW9kZT8xNjoxNioxMDI0fXVvLmV4cG9ydHM9e2dldEhpZ2hXYXRlck1hcms6U3V9fSk7dmFyIGNvPVMoKHdsLGZvKT0+e2MoKTtmby5leHBvcnRzPVJ1O2Z1bmN0aW9uIFJ1KHIsZSl7aWYobW4oXCJub0RlcHJlY2F0aW9uXCIpKXJldHVybiByO3ZhciB0PSExO2Z1bmN0aW9uIG4oKXtpZighdCl7aWYobW4oXCJ0aHJvd0RlcHJlY2F0aW9uXCIpKXRocm93IG5ldyBFcnJvcihlKTttbihcInRyYWNlRGVwcmVjYXRpb25cIik/Y29uc29sZS50cmFjZShlKTpjb25zb2xlLndhcm4oZSksdD0hMH1yZXR1cm4gci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIG59ZnVuY3Rpb24gbW4ocil7dHJ5e2lmKCFnbG9iYWwubG9jYWxTdG9yYWdlKXJldHVybiExfWNhdGNoe3JldHVybiExfXZhciBlPWdsb2JhbC5sb2NhbFN0b3JhZ2Vbcl07cmV0dXJuIGU9PW51bGw/ITE6U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCk9PT1cInRydWVcIn19KTt2YXIgYm49UygodmwseW8pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO3lvLmV4cG9ydHM9RjtmdW5jdGlvbiBwbyhyKXt2YXIgZT10aGlzO3RoaXMubmV4dD1udWxsLHRoaXMuZW50cnk9bnVsbCx0aGlzLmZpbmlzaD1mdW5jdGlvbigpe1F1KGUscil9fXZhciBldDtGLldyaXRhYmxlU3RhdGU9RXQ7dmFyIFR1PXtkZXByZWNhdGU6Y28oKX0saG89Zm4oKSxWdD1YZSgpLkJ1ZmZlcixDdT1nbG9iYWwuVWludDhBcnJheXx8ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIEJ1KHIpe3JldHVybiBWdC5mcm9tKHIpfWZ1bmN0aW9uIE11KHIpe3JldHVybiBWdC5pc0J1ZmZlcihyKXx8ciBpbnN0YW5jZW9mIEN1fXZhciB5bj1wbigpLEx1PWhuKCksSXU9THUuZ2V0SGlnaFdhdGVyTWFyayx4ZT1VZSgpLmNvZGVzLEF1PXhlLkVSUl9JTlZBTElEX0FSR19UWVBFLEZ1PXhlLkVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVELFB1PXhlLkVSUl9NVUxUSVBMRV9DQUxMQkFDSyxrdT14ZS5FUlJfU1RSRUFNX0NBTk5PVF9QSVBFLE91PXhlLkVSUl9TVFJFQU1fREVTVFJPWUVELFV1PXhlLkVSUl9TVFJFQU1fTlVMTF9WQUxVRVMsRHU9eGUuRVJSX1NUUkVBTV9XUklURV9BRlRFUl9FTkQsTnU9eGUuRVJSX1VOS05PV05fRU5DT0RJTkcsdHQ9eW4uZXJyb3JPckRlc3Ryb3k7T2UoKShGLGhvKTtmdW5jdGlvbiBIdSgpe31mdW5jdGlvbiBFdChyLGUsdCl7ZXQ9ZXR8fERlKCkscj1yfHx7fSx0eXBlb2YgdCE9XCJib29sZWFuXCImJih0PWUgaW5zdGFuY2VvZiBldCksdGhpcy5vYmplY3RNb2RlPSEhci5vYmplY3RNb2RlLHQmJih0aGlzLm9iamVjdE1vZGU9dGhpcy5vYmplY3RNb2RlfHwhIXIud3JpdGFibGVPYmplY3RNb2RlKSx0aGlzLmhpZ2hXYXRlck1hcms9SXUodGhpcyxyLFwid3JpdGFibGVIaWdoV2F0ZXJNYXJrXCIsdCksdGhpcy5maW5hbENhbGxlZD0hMSx0aGlzLm5lZWREcmFpbj0hMSx0aGlzLmVuZGluZz0hMSx0aGlzLmVuZGVkPSExLHRoaXMuZmluaXNoZWQ9ITEsdGhpcy5kZXN0cm95ZWQ9ITE7dmFyIG49ci5kZWNvZGVTdHJpbmdzPT09ITE7dGhpcy5kZWNvZGVTdHJpbmdzPSFuLHRoaXMuZGVmYXVsdEVuY29kaW5nPXIuZGVmYXVsdEVuY29kaW5nfHxcInV0ZjhcIix0aGlzLmxlbmd0aD0wLHRoaXMud3JpdGluZz0hMSx0aGlzLmNvcmtlZD0wLHRoaXMuc3luYz0hMCx0aGlzLmJ1ZmZlclByb2Nlc3Npbmc9ITEsdGhpcy5vbndyaXRlPWZ1bmN0aW9uKGkpe3p1KGUsaSl9LHRoaXMud3JpdGVjYj1udWxsLHRoaXMud3JpdGVsZW49MCx0aGlzLmJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMucGVuZGluZ2NiPTAsdGhpcy5wcmVmaW5pc2hlZD0hMSx0aGlzLmVycm9yRW1pdHRlZD0hMSx0aGlzLmVtaXRDbG9zZT1yLmVtaXRDbG9zZSE9PSExLHRoaXMuYXV0b0Rlc3Ryb3k9ISFyLmF1dG9EZXN0cm95LHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQ9MCx0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZT1uZXcgcG8odGhpcyl9RXQucHJvdG90eXBlLmdldEJ1ZmZlcj1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLmJ1ZmZlcmVkUmVxdWVzdCx0PVtdO2U7KXQucHVzaChlKSxlPWUubmV4dDtyZXR1cm4gdH07KGZ1bmN0aW9uKCl7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eShFdC5wcm90b3R5cGUsXCJidWZmZXJcIix7Z2V0OlR1LmRlcHJlY2F0ZShmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEJ1ZmZlcigpfSxcIl93cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyIGluc3RlYWQuXCIsXCJERVAwMDAzXCIpfSl9Y2F0Y2h7fX0pKCk7dmFyIEd0O3R5cGVvZiBTeW1ib2w9PVwiZnVuY3Rpb25cIiYmU3ltYm9sLmhhc0luc3RhbmNlJiZ0eXBlb2YgRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV09PVwiZnVuY3Rpb25cIj8oR3Q9RnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0sT2JqZWN0LmRlZmluZVByb3BlcnR5KEYsU3ltYm9sLmhhc0luc3RhbmNlLHt2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gR3QuY2FsbCh0aGlzLGUpPyEwOnRoaXMhPT1GPyExOmUmJmUuX3dyaXRhYmxlU3RhdGUgaW5zdGFuY2VvZiBFdH19KSk6R3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiB0aGlzfTtmdW5jdGlvbiBGKHIpe2V0PWV0fHxEZSgpO3ZhciBlPXRoaXMgaW5zdGFuY2VvZiBldDtpZighZSYmIUd0LmNhbGwoRix0aGlzKSlyZXR1cm4gbmV3IEYocik7dGhpcy5fd3JpdGFibGVTdGF0ZT1uZXcgRXQocix0aGlzLGUpLHRoaXMud3JpdGFibGU9ITAsciYmKHR5cGVvZiByLndyaXRlPT1cImZ1bmN0aW9uXCImJih0aGlzLl93cml0ZT1yLndyaXRlKSx0eXBlb2Ygci53cml0ZXY9PVwiZnVuY3Rpb25cIiYmKHRoaXMuX3dyaXRldj1yLndyaXRldiksdHlwZW9mIHIuZGVzdHJveT09XCJmdW5jdGlvblwiJiYodGhpcy5fZGVzdHJveT1yLmRlc3Ryb3kpLHR5cGVvZiByLmZpbmFsPT1cImZ1bmN0aW9uXCImJih0aGlzLl9maW5hbD1yLmZpbmFsKSksaG8uY2FsbCh0aGlzKX1GLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKCl7dHQodGhpcyxuZXcga3UpfTtmdW5jdGlvbiBxdShyLGUpe3ZhciB0PW5ldyBEdTt0dChyLHQpLHByb2Nlc3MubmV4dFRpY2soZSx0KX1mdW5jdGlvbiBqdShyLGUsdCxuKXt2YXIgaTtyZXR1cm4gdD09PW51bGw/aT1uZXcgVXU6dHlwZW9mIHQhPVwic3RyaW5nXCImJiFlLm9iamVjdE1vZGUmJihpPW5ldyBBdShcImNodW5rXCIsW1wic3RyaW5nXCIsXCJCdWZmZXJcIl0sdCkpLGk/KHR0KHIsaSkscHJvY2Vzcy5uZXh0VGljayhuLGkpLCExKTohMH1GLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihyLGUsdCl7dmFyIG49dGhpcy5fd3JpdGFibGVTdGF0ZSxpPSExLG89IW4ub2JqZWN0TW9kZSYmTXUocik7cmV0dXJuIG8mJiFWdC5pc0J1ZmZlcihyKSYmKHI9QnUocikpLHR5cGVvZiBlPT1cImZ1bmN0aW9uXCImJih0PWUsZT1udWxsKSxvP2U9XCJidWZmZXJcIjplfHwoZT1uLmRlZmF1bHRFbmNvZGluZyksdHlwZW9mIHQhPVwiZnVuY3Rpb25cIiYmKHQ9SHUpLG4uZW5kaW5nP3F1KHRoaXMsdCk6KG98fGp1KHRoaXMsbixyLHQpKSYmKG4ucGVuZGluZ2NiKyssaT0kdSh0aGlzLG4sbyxyLGUsdCkpLGl9O0YucHJvdG90eXBlLmNvcms9ZnVuY3Rpb24oKXt0aGlzLl93cml0YWJsZVN0YXRlLmNvcmtlZCsrfTtGLnByb3RvdHlwZS51bmNvcms9ZnVuY3Rpb24oKXt2YXIgcj10aGlzLl93cml0YWJsZVN0YXRlO3IuY29ya2VkJiYoci5jb3JrZWQtLSwhci53cml0aW5nJiYhci5jb3JrZWQmJiFyLmJ1ZmZlclByb2Nlc3NpbmcmJnIuYnVmZmVyZWRSZXF1ZXN0JiZtbyh0aGlzLHIpKX07Ri5wcm90b3R5cGUuc2V0RGVmYXVsdEVuY29kaW5nPWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlPT1cInN0cmluZ1wiJiYoZT1lLnRvTG93ZXJDYXNlKCkpLCEoW1wiaGV4XCIsXCJ1dGY4XCIsXCJ1dGYtOFwiLFwiYXNjaWlcIixcImJpbmFyeVwiLFwiYmFzZTY0XCIsXCJ1Y3MyXCIsXCJ1Y3MtMlwiLFwidXRmMTZsZVwiLFwidXRmLTE2bGVcIixcInJhd1wiXS5pbmRleE9mKChlK1wiXCIpLnRvTG93ZXJDYXNlKCkpPi0xKSl0aHJvdyBuZXcgTnUoZSk7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nPWUsdGhpc307T2JqZWN0LmRlZmluZVByb3BlcnR5KEYucHJvdG90eXBlLFwid3JpdGFibGVCdWZmZXJcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSYmdGhpcy5fd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIoKX19KTtmdW5jdGlvbiBXdShyLGUsdCl7cmV0dXJuIXIub2JqZWN0TW9kZSYmci5kZWNvZGVTdHJpbmdzIT09ITEmJnR5cGVvZiBlPT1cInN0cmluZ1wiJiYoZT1WdC5mcm9tKGUsdCkpLGV9T2JqZWN0LmRlZmluZVByb3BlcnR5KEYucHJvdG90eXBlLFwid3JpdGFibGVIaWdoV2F0ZXJNYXJrXCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya319KTtmdW5jdGlvbiAkdShyLGUsdCxuLGksbyl7aWYoIXQpe3ZhciBzPVd1KGUsbixpKTtuIT09cyYmKHQ9ITAsaT1cImJ1ZmZlclwiLG49cyl9dmFyIGE9ZS5vYmplY3RNb2RlPzE6bi5sZW5ndGg7ZS5sZW5ndGgrPWE7dmFyIHU9ZS5sZW5ndGg8ZS5oaWdoV2F0ZXJNYXJrO2lmKHV8fChlLm5lZWREcmFpbj0hMCksZS53cml0aW5nfHxlLmNvcmtlZCl7dmFyIGY9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O2UubGFzdEJ1ZmZlcmVkUmVxdWVzdD17Y2h1bms6bixlbmNvZGluZzppLGlzQnVmOnQsY2FsbGJhY2s6byxuZXh0Om51bGx9LGY/Zi5uZXh0PWUubGFzdEJ1ZmZlcmVkUmVxdWVzdDplLmJ1ZmZlcmVkUmVxdWVzdD1lLmxhc3RCdWZmZXJlZFJlcXVlc3QsZS5idWZmZXJlZFJlcXVlc3RDb3VudCs9MX1lbHNlIGduKHIsZSwhMSxhLG4saSxvKTtyZXR1cm4gdX1mdW5jdGlvbiBnbihyLGUsdCxuLGksbyxzKXtlLndyaXRlbGVuPW4sZS53cml0ZWNiPXMsZS53cml0aW5nPSEwLGUuc3luYz0hMCxlLmRlc3Ryb3llZD9lLm9ud3JpdGUobmV3IE91KFwid3JpdGVcIikpOnQ/ci5fd3JpdGV2KGksZS5vbndyaXRlKTpyLl93cml0ZShpLG8sZS5vbndyaXRlKSxlLnN5bmM9ITF9ZnVuY3Rpb24gR3UocixlLHQsbixpKXstLWUucGVuZGluZ2NiLHQ/KHByb2Nlc3MubmV4dFRpY2soaSxuKSxwcm9jZXNzLm5leHRUaWNrKHZ0LHIsZSksci5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAsdHQocixuKSk6KGkobiksci5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAsdHQocixuKSx2dChyLGUpKX1mdW5jdGlvbiBWdShyKXtyLndyaXRpbmc9ITEsci53cml0ZWNiPW51bGwsci5sZW5ndGgtPXIud3JpdGVsZW4sci53cml0ZWxlbj0wfWZ1bmN0aW9uIHp1KHIsZSl7dmFyIHQ9ci5fd3JpdGFibGVTdGF0ZSxuPXQuc3luYyxpPXQud3JpdGVjYjtpZih0eXBlb2YgaSE9XCJmdW5jdGlvblwiKXRocm93IG5ldyBQdTtpZihWdSh0KSxlKUd1KHIsdCxuLGUsaSk7ZWxzZXt2YXIgbz1nbyh0KXx8ci5kZXN0cm95ZWQ7IW8mJiF0LmNvcmtlZCYmIXQuYnVmZmVyUHJvY2Vzc2luZyYmdC5idWZmZXJlZFJlcXVlc3QmJm1vKHIsdCksbj9wcm9jZXNzLm5leHRUaWNrKGxvLHIsdCxvLGkpOmxvKHIsdCxvLGkpfX1mdW5jdGlvbiBsbyhyLGUsdCxuKXt0fHxZdShyLGUpLGUucGVuZGluZ2NiLS0sbigpLHZ0KHIsZSl9ZnVuY3Rpb24gWXUocixlKXtlLmxlbmd0aD09PTAmJmUubmVlZERyYWluJiYoZS5uZWVkRHJhaW49ITEsci5lbWl0KFwiZHJhaW5cIikpfWZ1bmN0aW9uIG1vKHIsZSl7ZS5idWZmZXJQcm9jZXNzaW5nPSEwO3ZhciB0PWUuYnVmZmVyZWRSZXF1ZXN0O2lmKHIuX3dyaXRldiYmdCYmdC5uZXh0KXt2YXIgbj1lLmJ1ZmZlcmVkUmVxdWVzdENvdW50LGk9bmV3IEFycmF5KG4pLG89ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU7by5lbnRyeT10O2Zvcih2YXIgcz0wLGE9ITA7dDspaVtzXT10LHQuaXNCdWZ8fChhPSExKSx0PXQubmV4dCxzKz0xO2kuYWxsQnVmZmVycz1hLGduKHIsZSwhMCxlLmxlbmd0aCxpLFwiXCIsby5maW5pc2gpLGUucGVuZGluZ2NiKyssZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwsby5uZXh0PyhlLmNvcmtlZFJlcXVlc3RzRnJlZT1vLm5leHQsby5uZXh0PW51bGwpOmUuY29ya2VkUmVxdWVzdHNGcmVlPW5ldyBwbyhlKSxlLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTB9ZWxzZXtmb3IoO3Q7KXt2YXIgdT10LmNodW5rLGY9dC5lbmNvZGluZyxsPXQuY2FsbGJhY2ssZD1lLm9iamVjdE1vZGU/MTp1Lmxlbmd0aDtpZihnbihyLGUsITEsZCx1LGYsbCksdD10Lm5leHQsZS5idWZmZXJlZFJlcXVlc3RDb3VudC0tLGUud3JpdGluZylicmVha310PT09bnVsbCYmKGUubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsKX1lLmJ1ZmZlcmVkUmVxdWVzdD10LGUuYnVmZmVyUHJvY2Vzc2luZz0hMX1GLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24ocixlLHQpe3QobmV3IEZ1KFwiX3dyaXRlKClcIikpfTtGLnByb3RvdHlwZS5fd3JpdGV2PW51bGw7Ri5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHIsZSx0KXt2YXIgbj10aGlzLl93cml0YWJsZVN0YXRlO3JldHVybiB0eXBlb2Ygcj09XCJmdW5jdGlvblwiPyh0PXIscj1udWxsLGU9bnVsbCk6dHlwZW9mIGU9PVwiZnVuY3Rpb25cIiYmKHQ9ZSxlPW51bGwpLHIhPW51bGwmJnRoaXMud3JpdGUocixlKSxuLmNvcmtlZCYmKG4uY29ya2VkPTEsdGhpcy51bmNvcmsoKSksbi5lbmRpbmd8fEp1KHRoaXMsbix0KSx0aGlzfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoRi5wcm90b3R5cGUsXCJ3cml0YWJsZUxlbmd0aFwiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmxlbmd0aH19KTtmdW5jdGlvbiBnbyhyKXtyZXR1cm4gci5lbmRpbmcmJnIubGVuZ3RoPT09MCYmci5idWZmZXJlZFJlcXVlc3Q9PT1udWxsJiYhci5maW5pc2hlZCYmIXIud3JpdGluZ31mdW5jdGlvbiBLdShyLGUpe3IuX2ZpbmFsKGZ1bmN0aW9uKHQpe2UucGVuZGluZ2NiLS0sdCYmdHQocix0KSxlLnByZWZpbmlzaGVkPSEwLHIuZW1pdChcInByZWZpbmlzaFwiKSx2dChyLGUpfSl9ZnVuY3Rpb24gWHUocixlKXshZS5wcmVmaW5pc2hlZCYmIWUuZmluYWxDYWxsZWQmJih0eXBlb2Ygci5fZmluYWw9PVwiZnVuY3Rpb25cIiYmIWUuZGVzdHJveWVkPyhlLnBlbmRpbmdjYisrLGUuZmluYWxDYWxsZWQ9ITAscHJvY2Vzcy5uZXh0VGljayhLdSxyLGUpKTooZS5wcmVmaW5pc2hlZD0hMCxyLmVtaXQoXCJwcmVmaW5pc2hcIikpKX1mdW5jdGlvbiB2dChyLGUpe3ZhciB0PWdvKGUpO2lmKHQmJihYdShyLGUpLGUucGVuZGluZ2NiPT09MCYmKGUuZmluaXNoZWQ9ITAsci5lbWl0KFwiZmluaXNoXCIpLGUuYXV0b0Rlc3Ryb3kpKSl7dmFyIG49ci5fcmVhZGFibGVTdGF0ZTsoIW58fG4uYXV0b0Rlc3Ryb3kmJm4uZW5kRW1pdHRlZCkmJnIuZGVzdHJveSgpfXJldHVybiB0fWZ1bmN0aW9uIEp1KHIsZSx0KXtlLmVuZGluZz0hMCx2dChyLGUpLHQmJihlLmZpbmlzaGVkP3Byb2Nlc3MubmV4dFRpY2sodCk6ci5vbmNlKFwiZmluaXNoXCIsdCkpLGUuZW5kZWQ9ITAsci53cml0YWJsZT0hMX1mdW5jdGlvbiBRdShyLGUsdCl7dmFyIG49ci5lbnRyeTtmb3Ioci5lbnRyeT1udWxsO247KXt2YXIgaT1uLmNhbGxiYWNrO2UucGVuZGluZ2NiLS0saSh0KSxuPW4ubmV4dH1lLmNvcmtlZFJlcXVlc3RzRnJlZS5uZXh0PXJ9T2JqZWN0LmRlZmluZVByb3BlcnR5KEYucHJvdG90eXBlLFwiZGVzdHJveWVkXCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGU9PT12b2lkIDA/ITE6dGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWR9LHNldDpmdW5jdGlvbihlKXshdGhpcy5fd3JpdGFibGVTdGF0ZXx8KHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkPWUpfX0pO0YucHJvdG90eXBlLmRlc3Ryb3k9eW4uZGVzdHJveTtGLnByb3RvdHlwZS5fdW5kZXN0cm95PXluLnVuZGVzdHJveTtGLnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbihyLGUpe2Uocil9fSk7dmFyIERlPVMoKEVsLHhvKT0+e1widXNlIHN0cmljdFwiO2MoKTt2YXIgWnU9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKHIpe3ZhciBlPVtdO2Zvcih2YXIgdCBpbiByKWUucHVzaCh0KTtyZXR1cm4gZX07eG8uZXhwb3J0cz1hZTt2YXIgYm89d24oKSxfbj1ibigpO09lKCkoYWUsYm8pO2Zvcih4bj1adShfbi5wcm90b3R5cGUpLHp0PTA7enQ8eG4ubGVuZ3RoO3p0KyspWXQ9eG5benRdLGFlLnByb3RvdHlwZVtZdF18fChhZS5wcm90b3R5cGVbWXRdPV9uLnByb3RvdHlwZVtZdF0pO3ZhciB4bixZdCx6dDtmdW5jdGlvbiBhZShyKXtpZighKHRoaXMgaW5zdGFuY2VvZiBhZSkpcmV0dXJuIG5ldyBhZShyKTtiby5jYWxsKHRoaXMsciksX24uY2FsbCh0aGlzLHIpLHRoaXMuYWxsb3dIYWxmT3Blbj0hMCxyJiYoci5yZWFkYWJsZT09PSExJiYodGhpcy5yZWFkYWJsZT0hMSksci53cml0YWJsZT09PSExJiYodGhpcy53cml0YWJsZT0hMSksci5hbGxvd0hhbGZPcGVuPT09ITEmJih0aGlzLmFsbG93SGFsZk9wZW49ITEsdGhpcy5vbmNlKFwiZW5kXCIsZWYpKSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGFlLnByb3RvdHlwZSxcIndyaXRhYmxlSGlnaFdhdGVyTWFya1wiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcmt9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGFlLnByb3RvdHlwZSxcIndyaXRhYmxlQnVmZmVyXCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUmJnRoaXMuX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyKCl9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGFlLnByb3RvdHlwZSxcIndyaXRhYmxlTGVuZ3RoXCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUubGVuZ3RofX0pO2Z1bmN0aW9uIGVmKCl7dGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZHx8cHJvY2Vzcy5uZXh0VGljayh0Zix0aGlzKX1mdW5jdGlvbiB0ZihyKXtyLmVuZCgpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShhZS5wcm90b3R5cGUsXCJkZXN0cm95ZWRcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZT09PXZvaWQgMHx8dGhpcy5fd3JpdGFibGVTdGF0ZT09PXZvaWQgMD8hMTp0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCYmdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWR9LHNldDpmdW5jdGlvbihlKXt0aGlzLl9yZWFkYWJsZVN0YXRlPT09dm9pZCAwfHx0aGlzLl93cml0YWJsZVN0YXRlPT09dm9pZCAwfHwodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9ZSx0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD1lKX19KX0pO3ZhciB2bz1TKCh2bix3byk9PntjKCk7dmFyIEt0PVhlKCksdWU9S3QuQnVmZmVyO2Z1bmN0aW9uIF9vKHIsZSl7Zm9yKHZhciB0IGluIHIpZVt0XT1yW3RdfXVlLmZyb20mJnVlLmFsbG9jJiZ1ZS5hbGxvY1Vuc2FmZSYmdWUuYWxsb2NVbnNhZmVTbG93P3dvLmV4cG9ydHM9S3Q6KF9vKEt0LHZuKSx2bi5CdWZmZXI9TmUpO2Z1bmN0aW9uIE5lKHIsZSx0KXtyZXR1cm4gdWUocixlLHQpfU5lLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHVlLnByb3RvdHlwZSk7X28odWUsTmUpO05lLmZyb209ZnVuY3Rpb24ocixlLHQpe2lmKHR5cGVvZiByPT1cIm51bWJlclwiKXRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlclwiKTtyZXR1cm4gdWUocixlLHQpfTtOZS5hbGxvYz1mdW5jdGlvbihyLGUsdCl7aWYodHlwZW9mIHIhPVwibnVtYmVyXCIpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXJcIik7dmFyIG49dWUocik7cmV0dXJuIGUhPT12b2lkIDA/dHlwZW9mIHQ9PVwic3RyaW5nXCI/bi5maWxsKGUsdCk6bi5maWxsKGUpOm4uZmlsbCgwKSxufTtOZS5hbGxvY1Vuc2FmZT1mdW5jdGlvbihyKXtpZih0eXBlb2YgciE9XCJudW1iZXJcIil0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlclwiKTtyZXR1cm4gdWUocil9O05lLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbihyKXtpZih0eXBlb2YgciE9XCJudW1iZXJcIil0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlclwiKTtyZXR1cm4gS3QuU2xvd0J1ZmZlcihyKX19KTt2YXIgUm49UyhTbz0+e1widXNlIHN0cmljdFwiO2MoKTt2YXIgU249dm8oKS5CdWZmZXIsRW89U24uaXNFbmNvZGluZ3x8ZnVuY3Rpb24ocil7c3dpdGNoKHI9XCJcIityLHImJnIudG9Mb3dlckNhc2UoKSl7Y2FzZVwiaGV4XCI6Y2FzZVwidXRmOFwiOmNhc2VcInV0Zi04XCI6Y2FzZVwiYXNjaWlcIjpjYXNlXCJiaW5hcnlcIjpjYXNlXCJiYXNlNjRcIjpjYXNlXCJ1Y3MyXCI6Y2FzZVwidWNzLTJcIjpjYXNlXCJ1dGYxNmxlXCI6Y2FzZVwidXRmLTE2bGVcIjpjYXNlXCJyYXdcIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX07ZnVuY3Rpb24gcmYocil7aWYoIXIpcmV0dXJuXCJ1dGY4XCI7Zm9yKHZhciBlOzspc3dpdGNoKHIpe2Nhc2VcInV0ZjhcIjpjYXNlXCJ1dGYtOFwiOnJldHVyblwidXRmOFwiO2Nhc2VcInVjczJcIjpjYXNlXCJ1Y3MtMlwiOmNhc2VcInV0ZjE2bGVcIjpjYXNlXCJ1dGYtMTZsZVwiOnJldHVyblwidXRmMTZsZVwiO2Nhc2VcImxhdGluMVwiOmNhc2VcImJpbmFyeVwiOnJldHVyblwibGF0aW4xXCI7Y2FzZVwiYmFzZTY0XCI6Y2FzZVwiYXNjaWlcIjpjYXNlXCJoZXhcIjpyZXR1cm4gcjtkZWZhdWx0OmlmKGUpcmV0dXJuO3I9KFwiXCIrcikudG9Mb3dlckNhc2UoKSxlPSEwfX1mdW5jdGlvbiBuZihyKXt2YXIgZT1yZihyKTtpZih0eXBlb2YgZSE9XCJzdHJpbmdcIiYmKFNuLmlzRW5jb2Rpbmc9PT1Fb3x8IUVvKHIpKSl0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGVuY29kaW5nOiBcIityKTtyZXR1cm4gZXx8cn1Tby5TdHJpbmdEZWNvZGVyPVN0O2Z1bmN0aW9uIFN0KHIpe3RoaXMuZW5jb2Rpbmc9bmYocik7dmFyIGU7c3dpdGNoKHRoaXMuZW5jb2Rpbmcpe2Nhc2VcInV0ZjE2bGVcIjp0aGlzLnRleHQ9Y2YsdGhpcy5lbmQ9bGYsZT00O2JyZWFrO2Nhc2VcInV0ZjhcIjp0aGlzLmZpbGxMYXN0PWFmLGU9NDticmVhaztjYXNlXCJiYXNlNjRcIjp0aGlzLnRleHQ9ZGYsdGhpcy5lbmQ9cGYsZT0zO2JyZWFrO2RlZmF1bHQ6dGhpcy53cml0ZT1oZix0aGlzLmVuZD1tZjtyZXR1cm59dGhpcy5sYXN0TmVlZD0wLHRoaXMubGFzdFRvdGFsPTAsdGhpcy5sYXN0Q2hhcj1Tbi5hbGxvY1Vuc2FmZShlKX1TdC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24ocil7aWYoci5sZW5ndGg9PT0wKXJldHVyblwiXCI7dmFyIGUsdDtpZih0aGlzLmxhc3ROZWVkKXtpZihlPXRoaXMuZmlsbExhc3QociksZT09PXZvaWQgMClyZXR1cm5cIlwiO3Q9dGhpcy5sYXN0TmVlZCx0aGlzLmxhc3ROZWVkPTB9ZWxzZSB0PTA7cmV0dXJuIHQ8ci5sZW5ndGg/ZT9lK3RoaXMudGV4dChyLHQpOnRoaXMudGV4dChyLHQpOmV8fFwiXCJ9O1N0LnByb3RvdHlwZS5lbmQ9ZmY7U3QucHJvdG90eXBlLnRleHQ9dWY7U3QucHJvdG90eXBlLmZpbGxMYXN0PWZ1bmN0aW9uKHIpe2lmKHRoaXMubGFzdE5lZWQ8PXIubGVuZ3RoKXJldHVybiByLmNvcHkodGhpcy5sYXN0Q2hhcix0aGlzLmxhc3RUb3RhbC10aGlzLmxhc3ROZWVkLDAsdGhpcy5sYXN0TmVlZCksdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLDAsdGhpcy5sYXN0VG90YWwpO3IuY29weSh0aGlzLmxhc3RDaGFyLHRoaXMubGFzdFRvdGFsLXRoaXMubGFzdE5lZWQsMCxyLmxlbmd0aCksdGhpcy5sYXN0TmVlZC09ci5sZW5ndGh9O2Z1bmN0aW9uIEVuKHIpe3JldHVybiByPD0xMjc/MDpyPj41PT09Nj8yOnI+PjQ9PT0xND8zOnI+PjM9PT0zMD80OnI+PjY9PT0yPy0xOi0yfWZ1bmN0aW9uIG9mKHIsZSx0KXt2YXIgbj1lLmxlbmd0aC0xO2lmKG48dClyZXR1cm4gMDt2YXIgaT1FbihlW25dKTtyZXR1cm4gaT49MD8oaT4wJiYoci5sYXN0TmVlZD1pLTEpLGkpOi0tbjx0fHxpPT09LTI/MDooaT1FbihlW25dKSxpPj0wPyhpPjAmJihyLmxhc3ROZWVkPWktMiksaSk6LS1uPHR8fGk9PT0tMj8wOihpPUVuKGVbbl0pLGk+PTA/KGk+MCYmKGk9PT0yP2k9MDpyLmxhc3ROZWVkPWktMyksaSk6MCkpfWZ1bmN0aW9uIHNmKHIsZSx0KXtpZigoZVswXSYxOTIpIT09MTI4KXJldHVybiByLmxhc3ROZWVkPTAsXCJcXHVGRkZEXCI7aWYoci5sYXN0TmVlZD4xJiZlLmxlbmd0aD4xKXtpZigoZVsxXSYxOTIpIT09MTI4KXJldHVybiByLmxhc3ROZWVkPTEsXCJcXHVGRkZEXCI7aWYoci5sYXN0TmVlZD4yJiZlLmxlbmd0aD4yJiYoZVsyXSYxOTIpIT09MTI4KXJldHVybiByLmxhc3ROZWVkPTIsXCJcXHVGRkZEXCJ9fWZ1bmN0aW9uIGFmKHIpe3ZhciBlPXRoaXMubGFzdFRvdGFsLXRoaXMubGFzdE5lZWQsdD1zZih0aGlzLHIsZSk7aWYodCE9PXZvaWQgMClyZXR1cm4gdDtpZih0aGlzLmxhc3ROZWVkPD1yLmxlbmd0aClyZXR1cm4gci5jb3B5KHRoaXMubGFzdENoYXIsZSwwLHRoaXMubGFzdE5lZWQpLHRoaXMubGFzdENoYXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywwLHRoaXMubGFzdFRvdGFsKTtyLmNvcHkodGhpcy5sYXN0Q2hhcixlLDAsci5sZW5ndGgpLHRoaXMubGFzdE5lZWQtPXIubGVuZ3RofWZ1bmN0aW9uIHVmKHIsZSl7dmFyIHQ9b2YodGhpcyxyLGUpO2lmKCF0aGlzLmxhc3ROZWVkKXJldHVybiByLnRvU3RyaW5nKFwidXRmOFwiLGUpO3RoaXMubGFzdFRvdGFsPXQ7dmFyIG49ci5sZW5ndGgtKHQtdGhpcy5sYXN0TmVlZCk7cmV0dXJuIHIuY29weSh0aGlzLmxhc3RDaGFyLDAsbiksci50b1N0cmluZyhcInV0ZjhcIixlLG4pfWZ1bmN0aW9uIGZmKHIpe3ZhciBlPXImJnIubGVuZ3RoP3RoaXMud3JpdGUocik6XCJcIjtyZXR1cm4gdGhpcy5sYXN0TmVlZD9lK1wiXFx1RkZGRFwiOmV9ZnVuY3Rpb24gY2YocixlKXtpZigoci5sZW5ndGgtZSklMj09PTApe3ZhciB0PXIudG9TdHJpbmcoXCJ1dGYxNmxlXCIsZSk7aWYodCl7dmFyIG49dC5jaGFyQ29kZUF0KHQubGVuZ3RoLTEpO2lmKG4+PTU1Mjk2JiZuPD01NjMxOSlyZXR1cm4gdGhpcy5sYXN0TmVlZD0yLHRoaXMubGFzdFRvdGFsPTQsdGhpcy5sYXN0Q2hhclswXT1yW3IubGVuZ3RoLTJdLHRoaXMubGFzdENoYXJbMV09cltyLmxlbmd0aC0xXSx0LnNsaWNlKDAsLTEpfXJldHVybiB0fXJldHVybiB0aGlzLmxhc3ROZWVkPTEsdGhpcy5sYXN0VG90YWw9Mix0aGlzLmxhc3RDaGFyWzBdPXJbci5sZW5ndGgtMV0sci50b1N0cmluZyhcInV0ZjE2bGVcIixlLHIubGVuZ3RoLTEpfWZ1bmN0aW9uIGxmKHIpe3ZhciBlPXImJnIubGVuZ3RoP3RoaXMud3JpdGUocik6XCJcIjtpZih0aGlzLmxhc3ROZWVkKXt2YXIgdD10aGlzLmxhc3RUb3RhbC10aGlzLmxhc3ROZWVkO3JldHVybiBlK3RoaXMubGFzdENoYXIudG9TdHJpbmcoXCJ1dGYxNmxlXCIsMCx0KX1yZXR1cm4gZX1mdW5jdGlvbiBkZihyLGUpe3ZhciB0PShyLmxlbmd0aC1lKSUzO3JldHVybiB0PT09MD9yLnRvU3RyaW5nKFwiYmFzZTY0XCIsZSk6KHRoaXMubGFzdE5lZWQ9My10LHRoaXMubGFzdFRvdGFsPTMsdD09PTE/dGhpcy5sYXN0Q2hhclswXT1yW3IubGVuZ3RoLTFdOih0aGlzLmxhc3RDaGFyWzBdPXJbci5sZW5ndGgtMl0sdGhpcy5sYXN0Q2hhclsxXT1yW3IubGVuZ3RoLTFdKSxyLnRvU3RyaW5nKFwiYmFzZTY0XCIsZSxyLmxlbmd0aC10KSl9ZnVuY3Rpb24gcGYocil7dmFyIGU9ciYmci5sZW5ndGg/dGhpcy53cml0ZShyKTpcIlwiO3JldHVybiB0aGlzLmxhc3ROZWVkP2UrdGhpcy5sYXN0Q2hhci50b1N0cmluZyhcImJhc2U2NFwiLDAsMy10aGlzLmxhc3ROZWVkKTplfWZ1bmN0aW9uIGhmKHIpe3JldHVybiByLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpfWZ1bmN0aW9uIG1mKHIpe3JldHVybiByJiZyLmxlbmd0aD90aGlzLndyaXRlKHIpOlwiXCJ9fSk7dmFyIFh0PVMoKFJsLENvKT0+e1widXNlIHN0cmljdFwiO2MoKTt2YXIgUm89VWUoKS5jb2Rlcy5FUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRTtmdW5jdGlvbiBnZihyKXt2YXIgZT0hMTtyZXR1cm4gZnVuY3Rpb24oKXtpZighZSl7ZT0hMDtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheSh0KSxpPTA7aTx0O2krKyluW2ldPWFyZ3VtZW50c1tpXTtyLmFwcGx5KHRoaXMsbil9fX1mdW5jdGlvbiB5Zigpe31mdW5jdGlvbiBiZihyKXtyZXR1cm4gci5zZXRIZWFkZXImJnR5cGVvZiByLmFib3J0PT1cImZ1bmN0aW9uXCJ9ZnVuY3Rpb24gVG8ocixlLHQpe2lmKHR5cGVvZiBlPT1cImZ1bmN0aW9uXCIpcmV0dXJuIFRvKHIsbnVsbCxlKTtlfHwoZT17fSksdD1nZih0fHx5Zik7dmFyIG49ZS5yZWFkYWJsZXx8ZS5yZWFkYWJsZSE9PSExJiZyLnJlYWRhYmxlLGk9ZS53cml0YWJsZXx8ZS53cml0YWJsZSE9PSExJiZyLndyaXRhYmxlLG89ZnVuY3Rpb24oKXtyLndyaXRhYmxlfHxhKCl9LHM9ci5fd3JpdGFibGVTdGF0ZSYmci5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZCxhPWZ1bmN0aW9uKCl7aT0hMSxzPSEwLG58fHQuY2FsbChyKX0sdT1yLl9yZWFkYWJsZVN0YXRlJiZyLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQsZj1mdW5jdGlvbigpe249ITEsdT0hMCxpfHx0LmNhbGwocil9LGw9ZnVuY3Rpb24oYil7dC5jYWxsKHIsYil9LGQ9ZnVuY3Rpb24oKXt2YXIgYjtpZihuJiYhdSlyZXR1cm4oIXIuX3JlYWRhYmxlU3RhdGV8fCFyLl9yZWFkYWJsZVN0YXRlLmVuZGVkKSYmKGI9bmV3IFJvKSx0LmNhbGwocixiKTtpZihpJiYhcylyZXR1cm4oIXIuX3dyaXRhYmxlU3RhdGV8fCFyLl93cml0YWJsZVN0YXRlLmVuZGVkKSYmKGI9bmV3IFJvKSx0LmNhbGwocixiKX0saD1mdW5jdGlvbigpe3IucmVxLm9uKFwiZmluaXNoXCIsYSl9O3JldHVybiBiZihyKT8oci5vbihcImNvbXBsZXRlXCIsYSksci5vbihcImFib3J0XCIsZCksci5yZXE/aCgpOnIub24oXCJyZXF1ZXN0XCIsaCkpOmkmJiFyLl93cml0YWJsZVN0YXRlJiYoci5vbihcImVuZFwiLG8pLHIub24oXCJjbG9zZVwiLG8pKSxyLm9uKFwiZW5kXCIsZiksci5vbihcImZpbmlzaFwiLGEpLGUuZXJyb3IhPT0hMSYmci5vbihcImVycm9yXCIsbCksci5vbihcImNsb3NlXCIsZCksZnVuY3Rpb24oKXtyLnJlbW92ZUxpc3RlbmVyKFwiY29tcGxldGVcIixhKSxyLnJlbW92ZUxpc3RlbmVyKFwiYWJvcnRcIixkKSxyLnJlbW92ZUxpc3RlbmVyKFwicmVxdWVzdFwiLGgpLHIucmVxJiZyLnJlcS5yZW1vdmVMaXN0ZW5lcihcImZpbmlzaFwiLGEpLHIucmVtb3ZlTGlzdGVuZXIoXCJlbmRcIixvKSxyLnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIixvKSxyLnJlbW92ZUxpc3RlbmVyKFwiZmluaXNoXCIsYSksci5yZW1vdmVMaXN0ZW5lcihcImVuZFwiLGYpLHIucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLGwpLHIucmVtb3ZlTGlzdGVuZXIoXCJjbG9zZVwiLGQpfX1Dby5leHBvcnRzPVRvfSk7dmFyIE1vPVMoKFRsLEJvKT0+e1widXNlIHN0cmljdFwiO2MoKTt2YXIgSnQ7ZnVuY3Rpb24gX2UocixlLHQpe3JldHVybiBlIGluIHI/T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsZSx7dmFsdWU6dCxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnJbZV09dCxyfXZhciB4Zj1YdCgpLHdlPVN5bWJvbChcImxhc3RSZXNvbHZlXCIpLEhlPVN5bWJvbChcImxhc3RSZWplY3RcIiksUnQ9U3ltYm9sKFwiZXJyb3JcIiksUXQ9U3ltYm9sKFwiZW5kZWRcIikscWU9U3ltYm9sKFwibGFzdFByb21pc2VcIiksVG49U3ltYm9sKFwiaGFuZGxlUHJvbWlzZVwiKSxqZT1TeW1ib2woXCJzdHJlYW1cIik7ZnVuY3Rpb24gdmUocixlKXtyZXR1cm57dmFsdWU6cixkb25lOmV9fWZ1bmN0aW9uIF9mKHIpe3ZhciBlPXJbd2VdO2lmKGUhPT1udWxsKXt2YXIgdD1yW2plXS5yZWFkKCk7dCE9PW51bGwmJihyW3FlXT1udWxsLHJbd2VdPW51bGwscltIZV09bnVsbCxlKHZlKHQsITEpKSl9fWZ1bmN0aW9uIHdmKHIpe3Byb2Nlc3MubmV4dFRpY2soX2Yscil9ZnVuY3Rpb24gdmYocixlKXtyZXR1cm4gZnVuY3Rpb24odCxuKXtyLnRoZW4oZnVuY3Rpb24oKXtpZihlW1F0XSl7dCh2ZSh2b2lkIDAsITApKTtyZXR1cm59ZVtUbl0odCxuKX0sbil9fXZhciBFZj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZnVuY3Rpb24oKXt9KSxTZj1PYmplY3Quc2V0UHJvdG90eXBlT2YoKEp0PXtnZXQgc3RyZWFtKCl7cmV0dXJuIHRoaXNbamVdfSxuZXh0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXNbUnRdO2lmKHQhPT1udWxsKXJldHVybiBQcm9taXNlLnJlamVjdCh0KTtpZih0aGlzW1F0XSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZlKHZvaWQgMCwhMCkpO2lmKHRoaXNbamVdLmRlc3Ryb3llZClyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocyxhKXtwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCl7ZVtSdF0/YShlW1J0XSk6cyh2ZSh2b2lkIDAsITApKX0pfSk7dmFyIG49dGhpc1txZV0saTtpZihuKWk9bmV3IFByb21pc2UodmYobix0aGlzKSk7ZWxzZXt2YXIgbz10aGlzW2plXS5yZWFkKCk7aWYobyE9PW51bGwpcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2ZShvLCExKSk7aT1uZXcgUHJvbWlzZSh0aGlzW1RuXSl9cmV0dXJuIHRoaXNbcWVdPWksaX19LF9lKEp0LFN5bWJvbC5hc3luY0l0ZXJhdG9yLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxfZShKdCxcInJldHVyblwiLGZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24odCxuKXtlW2plXS5kZXN0cm95KG51bGwsZnVuY3Rpb24oaSl7aWYoaSl7bihpKTtyZXR1cm59dCh2ZSh2b2lkIDAsITApKX0pfSl9KSxKdCksRWYpLFJmPWZ1bmN0aW9uKGUpe3ZhciB0LG49T2JqZWN0LmNyZWF0ZShTZiwodD17fSxfZSh0LGplLHt2YWx1ZTplLHdyaXRhYmxlOiEwfSksX2UodCx3ZSx7dmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLF9lKHQsSGUse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KSxfZSh0LFJ0LHt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSksX2UodCxRdCx7dmFsdWU6ZS5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkLHdyaXRhYmxlOiEwfSksX2UodCxUbix7dmFsdWU6ZnVuY3Rpb24obyxzKXt2YXIgYT1uW2plXS5yZWFkKCk7YT8obltxZV09bnVsbCxuW3dlXT1udWxsLG5bSGVdPW51bGwsbyh2ZShhLCExKSkpOihuW3dlXT1vLG5bSGVdPXMpfSx3cml0YWJsZTohMH0pLHQpKTtyZXR1cm4gbltxZV09bnVsbCx4ZihlLGZ1bmN0aW9uKGkpe2lmKGkmJmkuY29kZSE9PVwiRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0VcIil7dmFyIG89bltIZV07byE9PW51bGwmJihuW3FlXT1udWxsLG5bd2VdPW51bGwsbltIZV09bnVsbCxvKGkpKSxuW1J0XT1pO3JldHVybn12YXIgcz1uW3dlXTtzIT09bnVsbCYmKG5bcWVdPW51bGwsblt3ZV09bnVsbCxuW0hlXT1udWxsLHModmUodm9pZCAwLCEwKSkpLG5bUXRdPSEwfSksZS5vbihcInJlYWRhYmxlXCIsd2YuYmluZChudWxsLG4pKSxufTtCby5leHBvcnRzPVJmfSk7dmFyIElvPVMoKENsLExvKT0+e2MoKTtMby5leHBvcnRzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFwiUmVhZGFibGUuZnJvbSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBicm93c2VyXCIpfX0pO3ZhciB3bj1TKChNbCxxbyk9PntcInVzZSBzdHJpY3RcIjtjKCk7cW8uZXhwb3J0cz1FO3ZhciBydDtFLlJlYWRhYmxlU3RhdGU9a287dmFyIEJsPXVuKCkuRXZlbnRFbWl0dGVyLFBvPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUubGlzdGVuZXJzKHQpLmxlbmd0aH0sQ3Q9Zm4oKSxadD1YZSgpLkJ1ZmZlcixUZj1nbG9iYWwuVWludDhBcnJheXx8ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIENmKHIpe3JldHVybiBadC5mcm9tKHIpfWZ1bmN0aW9uIEJmKHIpe3JldHVybiBadC5pc0J1ZmZlcihyKXx8ciBpbnN0YW5jZW9mIFRmfXZhciBDbj1jbigpLHg7Q24mJkNuLmRlYnVnbG9nP3g9Q24uZGVidWdsb2coXCJzdHJlYW1cIik6eD1mdW5jdGlvbigpe307dmFyIE1mPXJvKCksUG49cG4oKSxMZj1obigpLElmPUxmLmdldEhpZ2hXYXRlck1hcmssZXI9VWUoKS5jb2RlcyxBZj1lci5FUlJfSU5WQUxJRF9BUkdfVFlQRSxGZj1lci5FUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GLFBmPWVyLkVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVELGtmPWVyLkVSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlQsbnQsQm4sTW47T2UoKShFLEN0KTt2YXIgVHQ9UG4uZXJyb3JPckRlc3Ryb3ksTG49W1wiZXJyb3JcIixcImNsb3NlXCIsXCJkZXN0cm95XCIsXCJwYXVzZVwiLFwicmVzdW1lXCJdO2Z1bmN0aW9uIE9mKHIsZSx0KXtpZih0eXBlb2Ygci5wcmVwZW5kTGlzdGVuZXI9PVwiZnVuY3Rpb25cIilyZXR1cm4gci5wcmVwZW5kTGlzdGVuZXIoZSx0KTshci5fZXZlbnRzfHwhci5fZXZlbnRzW2VdP3Iub24oZSx0KTpBcnJheS5pc0FycmF5KHIuX2V2ZW50c1tlXSk/ci5fZXZlbnRzW2VdLnVuc2hpZnQodCk6ci5fZXZlbnRzW2VdPVt0LHIuX2V2ZW50c1tlXV19ZnVuY3Rpb24ga28ocixlLHQpe3J0PXJ0fHxEZSgpLHI9cnx8e30sdHlwZW9mIHQhPVwiYm9vbGVhblwiJiYodD1lIGluc3RhbmNlb2YgcnQpLHRoaXMub2JqZWN0TW9kZT0hIXIub2JqZWN0TW9kZSx0JiYodGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISFyLnJlYWRhYmxlT2JqZWN0TW9kZSksdGhpcy5oaWdoV2F0ZXJNYXJrPUlmKHRoaXMscixcInJlYWRhYmxlSGlnaFdhdGVyTWFya1wiLHQpLHRoaXMuYnVmZmVyPW5ldyBNZix0aGlzLmxlbmd0aD0wLHRoaXMucGlwZXM9bnVsbCx0aGlzLnBpcGVzQ291bnQ9MCx0aGlzLmZsb3dpbmc9bnVsbCx0aGlzLmVuZGVkPSExLHRoaXMuZW5kRW1pdHRlZD0hMSx0aGlzLnJlYWRpbmc9ITEsdGhpcy5zeW5jPSEwLHRoaXMubmVlZFJlYWRhYmxlPSExLHRoaXMuZW1pdHRlZFJlYWRhYmxlPSExLHRoaXMucmVhZGFibGVMaXN0ZW5pbmc9ITEsdGhpcy5yZXN1bWVTY2hlZHVsZWQ9ITEsdGhpcy5wYXVzZWQ9ITAsdGhpcy5lbWl0Q2xvc2U9ci5lbWl0Q2xvc2UhPT0hMSx0aGlzLmF1dG9EZXN0cm95PSEhci5hdXRvRGVzdHJveSx0aGlzLmRlc3Ryb3llZD0hMSx0aGlzLmRlZmF1bHRFbmNvZGluZz1yLmRlZmF1bHRFbmNvZGluZ3x8XCJ1dGY4XCIsdGhpcy5hd2FpdERyYWluPTAsdGhpcy5yZWFkaW5nTW9yZT0hMSx0aGlzLmRlY29kZXI9bnVsbCx0aGlzLmVuY29kaW5nPW51bGwsci5lbmNvZGluZyYmKG50fHwobnQ9Um4oKS5TdHJpbmdEZWNvZGVyKSx0aGlzLmRlY29kZXI9bmV3IG50KHIuZW5jb2RpbmcpLHRoaXMuZW5jb2Rpbmc9ci5lbmNvZGluZyl9ZnVuY3Rpb24gRShyKXtpZihydD1ydHx8RGUoKSwhKHRoaXMgaW5zdGFuY2VvZiBFKSlyZXR1cm4gbmV3IEUocik7dmFyIGU9dGhpcyBpbnN0YW5jZW9mIHJ0O3RoaXMuX3JlYWRhYmxlU3RhdGU9bmV3IGtvKHIsdGhpcyxlKSx0aGlzLnJlYWRhYmxlPSEwLHImJih0eXBlb2Ygci5yZWFkPT1cImZ1bmN0aW9uXCImJih0aGlzLl9yZWFkPXIucmVhZCksdHlwZW9mIHIuZGVzdHJveT09XCJmdW5jdGlvblwiJiYodGhpcy5fZGVzdHJveT1yLmRlc3Ryb3kpKSxDdC5jYWxsKHRoaXMpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShFLnByb3RvdHlwZSxcImRlc3Ryb3llZFwiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlPT09dm9pZCAwPyExOnRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkfSxzZXQ6ZnVuY3Rpb24oZSl7IXRoaXMuX3JlYWRhYmxlU3RhdGV8fCh0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD1lKX19KTtFLnByb3RvdHlwZS5kZXN0cm95PVBuLmRlc3Ryb3k7RS5wcm90b3R5cGUuX3VuZGVzdHJveT1Qbi51bmRlc3Ryb3k7RS5wcm90b3R5cGUuX2Rlc3Ryb3k9ZnVuY3Rpb24ocixlKXtlKHIpfTtFLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHIsZSl7dmFyIHQ9dGhpcy5fcmVhZGFibGVTdGF0ZSxuO3JldHVybiB0Lm9iamVjdE1vZGU/bj0hMDp0eXBlb2Ygcj09XCJzdHJpbmdcIiYmKGU9ZXx8dC5kZWZhdWx0RW5jb2RpbmcsZSE9PXQuZW5jb2RpbmcmJihyPVp0LmZyb20ocixlKSxlPVwiXCIpLG49ITApLE9vKHRoaXMscixlLCExLG4pfTtFLnByb3RvdHlwZS51bnNoaWZ0PWZ1bmN0aW9uKHIpe3JldHVybiBPbyh0aGlzLHIsbnVsbCwhMCwhMSl9O2Z1bmN0aW9uIE9vKHIsZSx0LG4saSl7eChcInJlYWRhYmxlQWRkQ2h1bmtcIixlKTt2YXIgbz1yLl9yZWFkYWJsZVN0YXRlO2lmKGU9PT1udWxsKW8ucmVhZGluZz0hMSxOZihyLG8pO2Vsc2V7dmFyIHM7aWYoaXx8KHM9VWYobyxlKSkscylUdChyLHMpO2Vsc2UgaWYoby5vYmplY3RNb2RlfHxlJiZlLmxlbmd0aD4wKWlmKHR5cGVvZiBlIT1cInN0cmluZ1wiJiYhby5vYmplY3RNb2RlJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSkhPT1adC5wcm90b3R5cGUmJihlPUNmKGUpKSxuKW8uZW5kRW1pdHRlZD9UdChyLG5ldyBrZik6SW4ocixvLGUsITApO2Vsc2UgaWYoby5lbmRlZClUdChyLG5ldyBGZik7ZWxzZXtpZihvLmRlc3Ryb3llZClyZXR1cm4hMTtvLnJlYWRpbmc9ITEsby5kZWNvZGVyJiYhdD8oZT1vLmRlY29kZXIud3JpdGUoZSksby5vYmplY3RNb2RlfHxlLmxlbmd0aCE9PTA/SW4ocixvLGUsITEpOkZuKHIsbykpOkluKHIsbyxlLCExKX1lbHNlIG58fChvLnJlYWRpbmc9ITEsRm4ocixvKSl9cmV0dXJuIW8uZW5kZWQmJihvLmxlbmd0aDxvLmhpZ2hXYXRlck1hcmt8fG8ubGVuZ3RoPT09MCl9ZnVuY3Rpb24gSW4ocixlLHQsbil7ZS5mbG93aW5nJiZlLmxlbmd0aD09PTAmJiFlLnN5bmM/KGUuYXdhaXREcmFpbj0wLHIuZW1pdChcImRhdGFcIix0KSk6KGUubGVuZ3RoKz1lLm9iamVjdE1vZGU/MTp0Lmxlbmd0aCxuP2UuYnVmZmVyLnVuc2hpZnQodCk6ZS5idWZmZXIucHVzaCh0KSxlLm5lZWRSZWFkYWJsZSYmdHIocikpLEZuKHIsZSl9ZnVuY3Rpb24gVWYocixlKXt2YXIgdDtyZXR1cm4hQmYoZSkmJnR5cGVvZiBlIT1cInN0cmluZ1wiJiZlIT09dm9pZCAwJiYhci5vYmplY3RNb2RlJiYodD1uZXcgQWYoXCJjaHVua1wiLFtcInN0cmluZ1wiLFwiQnVmZmVyXCIsXCJVaW50OEFycmF5XCJdLGUpKSx0fUUucHJvdG90eXBlLmlzUGF1c2VkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZz09PSExfTtFLnByb3RvdHlwZS5zZXRFbmNvZGluZz1mdW5jdGlvbihyKXtudHx8KG50PVJuKCkuU3RyaW5nRGVjb2Rlcik7dmFyIGU9bmV3IG50KHIpO3RoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2Rlcj1lLHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5jb2Rpbmc9dGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyLmVuY29kaW5nO2Zvcih2YXIgdD10aGlzLl9yZWFkYWJsZVN0YXRlLmJ1ZmZlci5oZWFkLG49XCJcIjt0IT09bnVsbDspbis9ZS53cml0ZSh0LmRhdGEpLHQ9dC5uZXh0O3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmJ1ZmZlci5jbGVhcigpLG4hPT1cIlwiJiZ0aGlzLl9yZWFkYWJsZVN0YXRlLmJ1ZmZlci5wdXNoKG4pLHRoaXMuX3JlYWRhYmxlU3RhdGUubGVuZ3RoPW4ubGVuZ3RoLHRoaXN9O3ZhciBBbz0xMDczNzQxODI0O2Z1bmN0aW9uIERmKHIpe3JldHVybiByPj1Bbz9yPUFvOihyLS0scnw9cj4+PjEscnw9cj4+PjIscnw9cj4+PjQscnw9cj4+Pjgscnw9cj4+PjE2LHIrKykscn1mdW5jdGlvbiBGbyhyLGUpe3JldHVybiByPD0wfHxlLmxlbmd0aD09PTAmJmUuZW5kZWQ/MDplLm9iamVjdE1vZGU/MTpyIT09cj9lLmZsb3dpbmcmJmUubGVuZ3RoP2UuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg6ZS5sZW5ndGg6KHI+ZS5oaWdoV2F0ZXJNYXJrJiYoZS5oaWdoV2F0ZXJNYXJrPURmKHIpKSxyPD1lLmxlbmd0aD9yOmUuZW5kZWQ/ZS5sZW5ndGg6KGUubmVlZFJlYWRhYmxlPSEwLDApKX1FLnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKHIpe3goXCJyZWFkXCIscikscj1wYXJzZUludChyLDEwKTt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlLHQ9cjtpZihyIT09MCYmKGUuZW1pdHRlZFJlYWRhYmxlPSExKSxyPT09MCYmZS5uZWVkUmVhZGFibGUmJigoZS5oaWdoV2F0ZXJNYXJrIT09MD9lLmxlbmd0aD49ZS5oaWdoV2F0ZXJNYXJrOmUubGVuZ3RoPjApfHxlLmVuZGVkKSlyZXR1cm4geChcInJlYWQ6IGVtaXRSZWFkYWJsZVwiLGUubGVuZ3RoLGUuZW5kZWQpLGUubGVuZ3RoPT09MCYmZS5lbmRlZD9Bbih0aGlzKTp0cih0aGlzKSxudWxsO2lmKHI9Rm8ocixlKSxyPT09MCYmZS5lbmRlZClyZXR1cm4gZS5sZW5ndGg9PT0wJiZBbih0aGlzKSxudWxsO3ZhciBuPWUubmVlZFJlYWRhYmxlO3goXCJuZWVkIHJlYWRhYmxlXCIsbiksKGUubGVuZ3RoPT09MHx8ZS5sZW5ndGgtcjxlLmhpZ2hXYXRlck1hcmspJiYobj0hMCx4KFwibGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmtcIixuKSksZS5lbmRlZHx8ZS5yZWFkaW5nPyhuPSExLHgoXCJyZWFkaW5nIG9yIGVuZGVkXCIsbikpOm4mJih4KFwiZG8gcmVhZFwiKSxlLnJlYWRpbmc9ITAsZS5zeW5jPSEwLGUubGVuZ3RoPT09MCYmKGUubmVlZFJlYWRhYmxlPSEwKSx0aGlzLl9yZWFkKGUuaGlnaFdhdGVyTWFyayksZS5zeW5jPSExLGUucmVhZGluZ3x8KHI9Rm8odCxlKSkpO3ZhciBpO3JldHVybiByPjA/aT1ObyhyLGUpOmk9bnVsbCxpPT09bnVsbD8oZS5uZWVkUmVhZGFibGU9ZS5sZW5ndGg8PWUuaGlnaFdhdGVyTWFyayxyPTApOihlLmxlbmd0aC09cixlLmF3YWl0RHJhaW49MCksZS5sZW5ndGg9PT0wJiYoZS5lbmRlZHx8KGUubmVlZFJlYWRhYmxlPSEwKSx0IT09ciYmZS5lbmRlZCYmQW4odGhpcykpLGkhPT1udWxsJiZ0aGlzLmVtaXQoXCJkYXRhXCIsaSksaX07ZnVuY3Rpb24gTmYocixlKXtpZih4KFwib25Fb2ZDaHVua1wiKSwhZS5lbmRlZCl7aWYoZS5kZWNvZGVyKXt2YXIgdD1lLmRlY29kZXIuZW5kKCk7dCYmdC5sZW5ndGgmJihlLmJ1ZmZlci5wdXNoKHQpLGUubGVuZ3RoKz1lLm9iamVjdE1vZGU/MTp0Lmxlbmd0aCl9ZS5lbmRlZD0hMCxlLnN5bmM/dHIocik6KGUubmVlZFJlYWRhYmxlPSExLGUuZW1pdHRlZFJlYWRhYmxlfHwoZS5lbWl0dGVkUmVhZGFibGU9ITAsVW8ocikpKX19ZnVuY3Rpb24gdHIocil7dmFyIGU9ci5fcmVhZGFibGVTdGF0ZTt4KFwiZW1pdFJlYWRhYmxlXCIsZS5uZWVkUmVhZGFibGUsZS5lbWl0dGVkUmVhZGFibGUpLGUubmVlZFJlYWRhYmxlPSExLGUuZW1pdHRlZFJlYWRhYmxlfHwoeChcImVtaXRSZWFkYWJsZVwiLGUuZmxvd2luZyksZS5lbWl0dGVkUmVhZGFibGU9ITAscHJvY2Vzcy5uZXh0VGljayhVbyxyKSl9ZnVuY3Rpb24gVW8ocil7dmFyIGU9ci5fcmVhZGFibGVTdGF0ZTt4KFwiZW1pdFJlYWRhYmxlX1wiLGUuZGVzdHJveWVkLGUubGVuZ3RoLGUuZW5kZWQpLCFlLmRlc3Ryb3llZCYmKGUubGVuZ3RofHxlLmVuZGVkKSYmKHIuZW1pdChcInJlYWRhYmxlXCIpLGUuZW1pdHRlZFJlYWRhYmxlPSExKSxlLm5lZWRSZWFkYWJsZT0hZS5mbG93aW5nJiYhZS5lbmRlZCYmZS5sZW5ndGg8PWUuaGlnaFdhdGVyTWFyayxrbihyKX1mdW5jdGlvbiBGbihyLGUpe2UucmVhZGluZ01vcmV8fChlLnJlYWRpbmdNb3JlPSEwLHByb2Nlc3MubmV4dFRpY2soSGYscixlKSl9ZnVuY3Rpb24gSGYocixlKXtmb3IoOyFlLnJlYWRpbmcmJiFlLmVuZGVkJiYoZS5sZW5ndGg8ZS5oaWdoV2F0ZXJNYXJrfHxlLmZsb3dpbmcmJmUubGVuZ3RoPT09MCk7KXt2YXIgdD1lLmxlbmd0aDtpZih4KFwibWF5YmVSZWFkTW9yZSByZWFkIDBcIiksci5yZWFkKDApLHQ9PT1lLmxlbmd0aClicmVha31lLnJlYWRpbmdNb3JlPSExfUUucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHIpe1R0KHRoaXMsbmV3IFBmKFwiX3JlYWQoKVwiKSl9O0UucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24ocixlKXt2YXIgdD10aGlzLG49dGhpcy5fcmVhZGFibGVTdGF0ZTtzd2l0Y2gobi5waXBlc0NvdW50KXtjYXNlIDA6bi5waXBlcz1yO2JyZWFrO2Nhc2UgMTpuLnBpcGVzPVtuLnBpcGVzLHJdO2JyZWFrO2RlZmF1bHQ6bi5waXBlcy5wdXNoKHIpO2JyZWFrfW4ucGlwZXNDb3VudCs9MSx4KFwicGlwZSBjb3VudD0lZCBvcHRzPSVqXCIsbi5waXBlc0NvdW50LGUpO3ZhciBpPSghZXx8ZS5lbmQhPT0hMSkmJnIhPT1wcm9jZXNzLnN0ZG91dCYmciE9PXByb2Nlc3Muc3RkZXJyLG89aT9hOnk7bi5lbmRFbWl0dGVkP3Byb2Nlc3MubmV4dFRpY2sobyk6dC5vbmNlKFwiZW5kXCIsbyksci5vbihcInVucGlwZVwiLHMpO2Z1bmN0aW9uIHModyxfKXt4KFwib251bnBpcGVcIiksdz09PXQmJl8mJl8uaGFzVW5waXBlZD09PSExJiYoXy5oYXNVbnBpcGVkPSEwLGwoKSl9ZnVuY3Rpb24gYSgpe3goXCJvbmVuZFwiKSxyLmVuZCgpfXZhciB1PXFmKHQpO3Iub24oXCJkcmFpblwiLHUpO3ZhciBmPSExO2Z1bmN0aW9uIGwoKXt4KFwiY2xlYW51cFwiKSxyLnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIixtKSxyLnJlbW92ZUxpc3RlbmVyKFwiZmluaXNoXCIsYiksci5yZW1vdmVMaXN0ZW5lcihcImRyYWluXCIsdSksci5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsaCksci5yZW1vdmVMaXN0ZW5lcihcInVucGlwZVwiLHMpLHQucmVtb3ZlTGlzdGVuZXIoXCJlbmRcIixhKSx0LnJlbW92ZUxpc3RlbmVyKFwiZW5kXCIseSksdC5yZW1vdmVMaXN0ZW5lcihcImRhdGFcIixkKSxmPSEwLG4uYXdhaXREcmFpbiYmKCFyLl93cml0YWJsZVN0YXRlfHxyLl93cml0YWJsZVN0YXRlLm5lZWREcmFpbikmJnUoKX10Lm9uKFwiZGF0YVwiLGQpO2Z1bmN0aW9uIGQodyl7eChcIm9uZGF0YVwiKTt2YXIgXz1yLndyaXRlKHcpO3goXCJkZXN0LndyaXRlXCIsXyksXz09PSExJiYoKG4ucGlwZXNDb3VudD09PTEmJm4ucGlwZXM9PT1yfHxuLnBpcGVzQ291bnQ+MSYmSG8obi5waXBlcyxyKSE9PS0xKSYmIWYmJih4KFwiZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlXCIsbi5hd2FpdERyYWluKSxuLmF3YWl0RHJhaW4rKyksdC5wYXVzZSgpKX1mdW5jdGlvbiBoKHcpe3goXCJvbmVycm9yXCIsdykseSgpLHIucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLGgpLFBvKHIsXCJlcnJvclwiKT09PTAmJlR0KHIsdyl9T2YocixcImVycm9yXCIsaCk7ZnVuY3Rpb24gbSgpe3IucmVtb3ZlTGlzdGVuZXIoXCJmaW5pc2hcIixiKSx5KCl9ci5vbmNlKFwiY2xvc2VcIixtKTtmdW5jdGlvbiBiKCl7eChcIm9uZmluaXNoXCIpLHIucmVtb3ZlTGlzdGVuZXIoXCJjbG9zZVwiLG0pLHkoKX1yLm9uY2UoXCJmaW5pc2hcIixiKTtmdW5jdGlvbiB5KCl7eChcInVucGlwZVwiKSx0LnVucGlwZShyKX1yZXR1cm4gci5lbWl0KFwicGlwZVwiLHQpLG4uZmxvd2luZ3x8KHgoXCJwaXBlIHJlc3VtZVwiKSx0LnJlc3VtZSgpKSxyfTtmdW5jdGlvbiBxZihyKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD1yLl9yZWFkYWJsZVN0YXRlO3goXCJwaXBlT25EcmFpblwiLHQuYXdhaXREcmFpbiksdC5hd2FpdERyYWluJiZ0LmF3YWl0RHJhaW4tLSx0LmF3YWl0RHJhaW49PT0wJiZQbyhyLFwiZGF0YVwiKSYmKHQuZmxvd2luZz0hMCxrbihyKSl9fUUucHJvdG90eXBlLnVucGlwZT1mdW5jdGlvbihyKXt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlLHQ9e2hhc1VucGlwZWQ6ITF9O2lmKGUucGlwZXNDb3VudD09PTApcmV0dXJuIHRoaXM7aWYoZS5waXBlc0NvdW50PT09MSlyZXR1cm4gciYmciE9PWUucGlwZXM/dGhpczoocnx8KHI9ZS5waXBlcyksZS5waXBlcz1udWxsLGUucGlwZXNDb3VudD0wLGUuZmxvd2luZz0hMSxyJiZyLmVtaXQoXCJ1bnBpcGVcIix0aGlzLHQpLHRoaXMpO2lmKCFyKXt2YXIgbj1lLnBpcGVzLGk9ZS5waXBlc0NvdW50O2UucGlwZXM9bnVsbCxlLnBpcGVzQ291bnQ9MCxlLmZsb3dpbmc9ITE7Zm9yKHZhciBvPTA7bzxpO28rKyluW29dLmVtaXQoXCJ1bnBpcGVcIix0aGlzLHtoYXNVbnBpcGVkOiExfSk7cmV0dXJuIHRoaXN9dmFyIHM9SG8oZS5waXBlcyxyKTtyZXR1cm4gcz09PS0xP3RoaXM6KGUucGlwZXMuc3BsaWNlKHMsMSksZS5waXBlc0NvdW50LT0xLGUucGlwZXNDb3VudD09PTEmJihlLnBpcGVzPWUucGlwZXNbMF0pLHIuZW1pdChcInVucGlwZVwiLHRoaXMsdCksdGhpcyl9O0UucHJvdG90eXBlLm9uPWZ1bmN0aW9uKHIsZSl7dmFyIHQ9Q3QucHJvdG90eXBlLm9uLmNhbGwodGhpcyxyLGUpLG49dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gcj09PVwiZGF0YVwiPyhuLnJlYWRhYmxlTGlzdGVuaW5nPXRoaXMubGlzdGVuZXJDb3VudChcInJlYWRhYmxlXCIpPjAsbi5mbG93aW5nIT09ITEmJnRoaXMucmVzdW1lKCkpOnI9PT1cInJlYWRhYmxlXCImJiFuLmVuZEVtaXR0ZWQmJiFuLnJlYWRhYmxlTGlzdGVuaW5nJiYobi5yZWFkYWJsZUxpc3RlbmluZz1uLm5lZWRSZWFkYWJsZT0hMCxuLmZsb3dpbmc9ITEsbi5lbWl0dGVkUmVhZGFibGU9ITEseChcIm9uIHJlYWRhYmxlXCIsbi5sZW5ndGgsbi5yZWFkaW5nKSxuLmxlbmd0aD90cih0aGlzKTpuLnJlYWRpbmd8fHByb2Nlc3MubmV4dFRpY2soamYsdGhpcykpLHR9O0UucHJvdG90eXBlLmFkZExpc3RlbmVyPUUucHJvdG90eXBlLm9uO0UucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKHIsZSl7dmFyIHQ9Q3QucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyLmNhbGwodGhpcyxyLGUpO3JldHVybiByPT09XCJyZWFkYWJsZVwiJiZwcm9jZXNzLm5leHRUaWNrKERvLHRoaXMpLHR9O0UucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbihyKXt2YXIgZT1DdC5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4ocj09PVwicmVhZGFibGVcInx8cj09PXZvaWQgMCkmJnByb2Nlc3MubmV4dFRpY2soRG8sdGhpcyksZX07ZnVuY3Rpb24gRG8ocil7dmFyIGU9ci5fcmVhZGFibGVTdGF0ZTtlLnJlYWRhYmxlTGlzdGVuaW5nPXIubGlzdGVuZXJDb3VudChcInJlYWRhYmxlXCIpPjAsZS5yZXN1bWVTY2hlZHVsZWQmJiFlLnBhdXNlZD9lLmZsb3dpbmc9ITA6ci5saXN0ZW5lckNvdW50KFwiZGF0YVwiKT4wJiZyLnJlc3VtZSgpfWZ1bmN0aW9uIGpmKHIpe3goXCJyZWFkYWJsZSBuZXh0dGljayByZWFkIDBcIiksci5yZWFkKDApfUUucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe3ZhciByPXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuIHIuZmxvd2luZ3x8KHgoXCJyZXN1bWVcIiksci5mbG93aW5nPSFyLnJlYWRhYmxlTGlzdGVuaW5nLFdmKHRoaXMscikpLHIucGF1c2VkPSExLHRoaXN9O2Z1bmN0aW9uIFdmKHIsZSl7ZS5yZXN1bWVTY2hlZHVsZWR8fChlLnJlc3VtZVNjaGVkdWxlZD0hMCxwcm9jZXNzLm5leHRUaWNrKCRmLHIsZSkpfWZ1bmN0aW9uICRmKHIsZSl7eChcInJlc3VtZVwiLGUucmVhZGluZyksZS5yZWFkaW5nfHxyLnJlYWQoMCksZS5yZXN1bWVTY2hlZHVsZWQ9ITEsci5lbWl0KFwicmVzdW1lXCIpLGtuKHIpLGUuZmxvd2luZyYmIWUucmVhZGluZyYmci5yZWFkKDApfUUucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7cmV0dXJuIHgoXCJjYWxsIHBhdXNlIGZsb3dpbmc9JWpcIix0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpLHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyE9PSExJiYoeChcInBhdXNlXCIpLHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZz0hMSx0aGlzLmVtaXQoXCJwYXVzZVwiKSksdGhpcy5fcmVhZGFibGVTdGF0ZS5wYXVzZWQ9ITAsdGhpc307ZnVuY3Rpb24ga24ocil7dmFyIGU9ci5fcmVhZGFibGVTdGF0ZTtmb3IoeChcImZsb3dcIixlLmZsb3dpbmcpO2UuZmxvd2luZyYmci5yZWFkKCkhPT1udWxsOyk7fUUucHJvdG90eXBlLndyYXA9ZnVuY3Rpb24ocil7dmFyIGU9dGhpcyx0PXRoaXMuX3JlYWRhYmxlU3RhdGUsbj0hMTtyLm9uKFwiZW5kXCIsZnVuY3Rpb24oKXtpZih4KFwid3JhcHBlZCBlbmRcIiksdC5kZWNvZGVyJiYhdC5lbmRlZCl7dmFyIHM9dC5kZWNvZGVyLmVuZCgpO3MmJnMubGVuZ3RoJiZlLnB1c2gocyl9ZS5wdXNoKG51bGwpfSksci5vbihcImRhdGFcIixmdW5jdGlvbihzKXtpZih4KFwid3JhcHBlZCBkYXRhXCIpLHQuZGVjb2RlciYmKHM9dC5kZWNvZGVyLndyaXRlKHMpKSwhKHQub2JqZWN0TW9kZSYmcz09bnVsbCkmJiEoIXQub2JqZWN0TW9kZSYmKCFzfHwhcy5sZW5ndGgpKSl7dmFyIGE9ZS5wdXNoKHMpO2F8fChuPSEwLHIucGF1c2UoKSl9fSk7Zm9yKHZhciBpIGluIHIpdGhpc1tpXT09PXZvaWQgMCYmdHlwZW9mIHJbaV09PVwiZnVuY3Rpb25cIiYmKHRoaXNbaV09ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHJbYV0uYXBwbHkocixhcmd1bWVudHMpfX0oaSkpO2Zvcih2YXIgbz0wO288TG4ubGVuZ3RoO28rKylyLm9uKExuW29dLHRoaXMuZW1pdC5iaW5kKHRoaXMsTG5bb10pKTtyZXR1cm4gdGhpcy5fcmVhZD1mdW5jdGlvbihzKXt4KFwid3JhcHBlZCBfcmVhZFwiLHMpLG4mJihuPSExLHIucmVzdW1lKCkpfSx0aGlzfTt0eXBlb2YgU3ltYm9sPT1cImZ1bmN0aW9uXCImJihFLnByb3RvdHlwZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gQm49PT12b2lkIDAmJihCbj1NbygpKSxCbih0aGlzKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShFLnByb3RvdHlwZSxcInJlYWRhYmxlSGlnaFdhdGVyTWFya1wiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcmt9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEUucHJvdG90eXBlLFwicmVhZGFibGVCdWZmZXJcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSYmdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXJ9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEUucHJvdG90eXBlLFwicmVhZGFibGVGbG93aW5nXCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZ30sc2V0OmZ1bmN0aW9uKGUpe3RoaXMuX3JlYWRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmc9ZSl9fSk7RS5fZnJvbUxpc3Q9Tm87T2JqZWN0LmRlZmluZVByb3BlcnR5KEUucHJvdG90eXBlLFwicmVhZGFibGVMZW5ndGhcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5sZW5ndGh9fSk7ZnVuY3Rpb24gTm8ocixlKXtpZihlLmxlbmd0aD09PTApcmV0dXJuIG51bGw7dmFyIHQ7cmV0dXJuIGUub2JqZWN0TW9kZT90PWUuYnVmZmVyLnNoaWZ0KCk6IXJ8fHI+PWUubGVuZ3RoPyhlLmRlY29kZXI/dD1lLmJ1ZmZlci5qb2luKFwiXCIpOmUuYnVmZmVyLmxlbmd0aD09PTE/dD1lLmJ1ZmZlci5maXJzdCgpOnQ9ZS5idWZmZXIuY29uY2F0KGUubGVuZ3RoKSxlLmJ1ZmZlci5jbGVhcigpKTp0PWUuYnVmZmVyLmNvbnN1bWUocixlLmRlY29kZXIpLHR9ZnVuY3Rpb24gQW4ocil7dmFyIGU9ci5fcmVhZGFibGVTdGF0ZTt4KFwiZW5kUmVhZGFibGVcIixlLmVuZEVtaXR0ZWQpLGUuZW5kRW1pdHRlZHx8KGUuZW5kZWQ9ITAscHJvY2Vzcy5uZXh0VGljayhHZixlLHIpKX1mdW5jdGlvbiBHZihyLGUpe2lmKHgoXCJlbmRSZWFkYWJsZU5UXCIsci5lbmRFbWl0dGVkLHIubGVuZ3RoKSwhci5lbmRFbWl0dGVkJiZyLmxlbmd0aD09PTAmJihyLmVuZEVtaXR0ZWQ9ITAsZS5yZWFkYWJsZT0hMSxlLmVtaXQoXCJlbmRcIiksci5hdXRvRGVzdHJveSkpe3ZhciB0PWUuX3dyaXRhYmxlU3RhdGU7KCF0fHx0LmF1dG9EZXN0cm95JiZ0LmZpbmlzaGVkKSYmZS5kZXN0cm95KCl9fXR5cGVvZiBTeW1ib2w9PVwiZnVuY3Rpb25cIiYmKEUuZnJvbT1mdW5jdGlvbihyLGUpe3JldHVybiBNbj09PXZvaWQgMCYmKE1uPUlvKCkpLE1uKEUscixlKX0pO2Z1bmN0aW9uIEhvKHIsZSl7Zm9yKHZhciB0PTAsbj1yLmxlbmd0aDt0PG47dCsrKWlmKHJbdF09PT1lKXJldHVybiB0O3JldHVybi0xfX0pO3ZhciBPbj1TKChMbCxXbyk9PntcInVzZSBzdHJpY3RcIjtjKCk7V28uZXhwb3J0cz1tZTt2YXIgcnI9VWUoKS5jb2RlcyxWZj1yci5FUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCx6Zj1yci5FUlJfTVVMVElQTEVfQ0FMTEJBQ0ssWWY9cnIuRVJSX1RSQU5TRk9STV9BTFJFQURZX1RSQU5TRk9STUlORyxLZj1yci5FUlJfVFJBTlNGT1JNX1dJVEhfTEVOR1RIXzAsbnI9RGUoKTtPZSgpKG1lLG5yKTtmdW5jdGlvbiBYZihyLGUpe3ZhciB0PXRoaXMuX3RyYW5zZm9ybVN0YXRlO3QudHJhbnNmb3JtaW5nPSExO3ZhciBuPXQud3JpdGVjYjtpZihuPT09bnVsbClyZXR1cm4gdGhpcy5lbWl0KFwiZXJyb3JcIixuZXcgemYpO3Qud3JpdGVjaHVuaz1udWxsLHQud3JpdGVjYj1udWxsLGUhPW51bGwmJnRoaXMucHVzaChlKSxuKHIpO3ZhciBpPXRoaXMuX3JlYWRhYmxlU3RhdGU7aS5yZWFkaW5nPSExLChpLm5lZWRSZWFkYWJsZXx8aS5sZW5ndGg8aS5oaWdoV2F0ZXJNYXJrKSYmdGhpcy5fcmVhZChpLmhpZ2hXYXRlck1hcmspfWZ1bmN0aW9uIG1lKHIpe2lmKCEodGhpcyBpbnN0YW5jZW9mIG1lKSlyZXR1cm4gbmV3IG1lKHIpO25yLmNhbGwodGhpcyxyKSx0aGlzLl90cmFuc2Zvcm1TdGF0ZT17YWZ0ZXJUcmFuc2Zvcm06WGYuYmluZCh0aGlzKSxuZWVkVHJhbnNmb3JtOiExLHRyYW5zZm9ybWluZzohMSx3cml0ZWNiOm51bGwsd3JpdGVjaHVuazpudWxsLHdyaXRlZW5jb2Rpbmc6bnVsbH0sdGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGU9ITAsdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jPSExLHImJih0eXBlb2Ygci50cmFuc2Zvcm09PVwiZnVuY3Rpb25cIiYmKHRoaXMuX3RyYW5zZm9ybT1yLnRyYW5zZm9ybSksdHlwZW9mIHIuZmx1c2g9PVwiZnVuY3Rpb25cIiYmKHRoaXMuX2ZsdXNoPXIuZmx1c2gpKSx0aGlzLm9uKFwicHJlZmluaXNoXCIsSmYpfWZ1bmN0aW9uIEpmKCl7dmFyIHI9dGhpczt0eXBlb2YgdGhpcy5fZmx1c2g9PVwiZnVuY3Rpb25cIiYmIXRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkP3RoaXMuX2ZsdXNoKGZ1bmN0aW9uKGUsdCl7am8ocixlLHQpfSk6am8odGhpcyxudWxsLG51bGwpfW1lLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHIsZSl7cmV0dXJuIHRoaXMuX3RyYW5zZm9ybVN0YXRlLm5lZWRUcmFuc2Zvcm09ITEsbnIucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLHIsZSl9O21lLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKHIsZSx0KXt0KG5ldyBWZihcIl90cmFuc2Zvcm0oKVwiKSl9O21lLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24ocixlLHQpe3ZhciBuPXRoaXMuX3RyYW5zZm9ybVN0YXRlO2lmKG4ud3JpdGVjYj10LG4ud3JpdGVjaHVuaz1yLG4ud3JpdGVlbmNvZGluZz1lLCFuLnRyYW5zZm9ybWluZyl7dmFyIGk9dGhpcy5fcmVhZGFibGVTdGF0ZTsobi5uZWVkVHJhbnNmb3JtfHxpLm5lZWRSZWFkYWJsZXx8aS5sZW5ndGg8aS5oaWdoV2F0ZXJNYXJrKSYmdGhpcy5fcmVhZChpLmhpZ2hXYXRlck1hcmspfX07bWUucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHIpe3ZhciBlPXRoaXMuX3RyYW5zZm9ybVN0YXRlO2Uud3JpdGVjaHVuayE9PW51bGwmJiFlLnRyYW5zZm9ybWluZz8oZS50cmFuc2Zvcm1pbmc9ITAsdGhpcy5fdHJhbnNmb3JtKGUud3JpdGVjaHVuayxlLndyaXRlZW5jb2RpbmcsZS5hZnRlclRyYW5zZm9ybSkpOmUubmVlZFRyYW5zZm9ybT0hMH07bWUucHJvdG90eXBlLl9kZXN0cm95PWZ1bmN0aW9uKHIsZSl7bnIucHJvdG90eXBlLl9kZXN0cm95LmNhbGwodGhpcyxyLGZ1bmN0aW9uKHQpe2UodCl9KX07ZnVuY3Rpb24gam8ocixlLHQpe2lmKGUpcmV0dXJuIHIuZW1pdChcImVycm9yXCIsZSk7aWYodCE9bnVsbCYmci5wdXNoKHQpLHIuX3dyaXRhYmxlU3RhdGUubGVuZ3RoKXRocm93IG5ldyBLZjtpZihyLl90cmFuc2Zvcm1TdGF0ZS50cmFuc2Zvcm1pbmcpdGhyb3cgbmV3IFlmO3JldHVybiByLnB1c2gobnVsbCl9fSk7dmFyIFZvPVMoKElsLEdvKT0+e1widXNlIHN0cmljdFwiO2MoKTtHby5leHBvcnRzPUJ0O3ZhciAkbz1PbigpO09lKCkoQnQsJG8pO2Z1bmN0aW9uIEJ0KHIpe2lmKCEodGhpcyBpbnN0YW5jZW9mIEJ0KSlyZXR1cm4gbmV3IEJ0KHIpOyRvLmNhbGwodGhpcyxyKX1CdC5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbihyLGUsdCl7dChudWxsLHIpfX0pO3ZhciBKbz1TKChBbCxYbyk9PntcInVzZSBzdHJpY3RcIjtjKCk7dmFyIFVuO2Z1bmN0aW9uIFFmKHIpe3ZhciBlPSExO3JldHVybiBmdW5jdGlvbigpe2V8fChlPSEwLHIuYXBwbHkodm9pZCAwLGFyZ3VtZW50cykpfX12YXIgS289VWUoKS5jb2RlcyxaZj1Lby5FUlJfTUlTU0lOR19BUkdTLGVjPUtvLkVSUl9TVFJFQU1fREVTVFJPWUVEO2Z1bmN0aW9uIHpvKHIpe2lmKHIpdGhyb3cgcn1mdW5jdGlvbiB0YyhyKXtyZXR1cm4gci5zZXRIZWFkZXImJnR5cGVvZiByLmFib3J0PT1cImZ1bmN0aW9uXCJ9ZnVuY3Rpb24gcmMocixlLHQsbil7bj1RZihuKTt2YXIgaT0hMTtyLm9uKFwiY2xvc2VcIixmdW5jdGlvbigpe2k9ITB9KSxVbj09PXZvaWQgMCYmKFVuPVh0KCkpLFVuKHIse3JlYWRhYmxlOmUsd3JpdGFibGU6dH0sZnVuY3Rpb24ocyl7aWYocylyZXR1cm4gbihzKTtpPSEwLG4oKX0pO3ZhciBvPSExO3JldHVybiBmdW5jdGlvbihzKXtpZighaSYmIW8pe2lmKG89ITAsdGMocikpcmV0dXJuIHIuYWJvcnQoKTtpZih0eXBlb2Ygci5kZXN0cm95PT1cImZ1bmN0aW9uXCIpcmV0dXJuIHIuZGVzdHJveSgpO24oc3x8bmV3IGVjKFwicGlwZVwiKSl9fX1mdW5jdGlvbiBZbyhyKXtyKCl9ZnVuY3Rpb24gbmMocixlKXtyZXR1cm4gci5waXBlKGUpfWZ1bmN0aW9uIGljKHIpe3JldHVybiFyLmxlbmd0aHx8dHlwZW9mIHJbci5sZW5ndGgtMV0hPVwiZnVuY3Rpb25cIj96bzpyLnBvcCgpfWZ1bmN0aW9uIG9jKCl7Zm9yKHZhciByPWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkociksdD0wO3Q8cjt0KyspZVt0XT1hcmd1bWVudHNbdF07dmFyIG49aWMoZSk7aWYoQXJyYXkuaXNBcnJheShlWzBdKSYmKGU9ZVswXSksZS5sZW5ndGg8Mil0aHJvdyBuZXcgWmYoXCJzdHJlYW1zXCIpO3ZhciBpLG89ZS5tYXAoZnVuY3Rpb24ocyxhKXt2YXIgdT1hPGUubGVuZ3RoLTEsZj1hPjA7cmV0dXJuIHJjKHMsdSxmLGZ1bmN0aW9uKGwpe2l8fChpPWwpLGwmJm8uZm9yRWFjaChZbyksIXUmJihvLmZvckVhY2goWW8pLG4oaSkpfSl9KTtyZXR1cm4gZS5yZWR1Y2UobmMpfVhvLmV4cG9ydHM9b2N9KTt2YXIgTj1TKChGbCxRbyk9PntjKCk7UW8uZXhwb3J0cz1KO3ZhciBEbj1qaSgpLkV2ZW50RW1pdHRlcixzYz1PZSgpO3NjKEosRG4pO0ouUmVhZGFibGU9d24oKTtKLldyaXRhYmxlPWJuKCk7Si5EdXBsZXg9RGUoKTtKLlRyYW5zZm9ybT1PbigpO0ouUGFzc1Rocm91Z2g9Vm8oKTtKLmZpbmlzaGVkPVh0KCk7Si5waXBlbGluZT1KbygpO0ouU3RyZWFtPUo7ZnVuY3Rpb24gSigpe0RuLmNhbGwodGhpcyl9Si5wcm90b3R5cGUucGlwZT1mdW5jdGlvbihyLGUpe3ZhciB0PXRoaXM7ZnVuY3Rpb24gbihsKXtyLndyaXRhYmxlJiZyLndyaXRlKGwpPT09ITEmJnQucGF1c2UmJnQucGF1c2UoKX10Lm9uKFwiZGF0YVwiLG4pO2Z1bmN0aW9uIGkoKXt0LnJlYWRhYmxlJiZ0LnJlc3VtZSYmdC5yZXN1bWUoKX1yLm9uKFwiZHJhaW5cIixpKSwhci5faXNTdGRpbyYmKCFlfHxlLmVuZCE9PSExKSYmKHQub24oXCJlbmRcIixzKSx0Lm9uKFwiY2xvc2VcIixhKSk7dmFyIG89ITE7ZnVuY3Rpb24gcygpe298fChvPSEwLHIuZW5kKCkpfWZ1bmN0aW9uIGEoKXtvfHwobz0hMCx0eXBlb2Ygci5kZXN0cm95PT1cImZ1bmN0aW9uXCImJnIuZGVzdHJveSgpKX1mdW5jdGlvbiB1KGwpe2lmKGYoKSxEbi5saXN0ZW5lckNvdW50KHRoaXMsXCJlcnJvclwiKT09PTApdGhyb3cgbH10Lm9uKFwiZXJyb3JcIix1KSxyLm9uKFwiZXJyb3JcIix1KTtmdW5jdGlvbiBmKCl7dC5yZW1vdmVMaXN0ZW5lcihcImRhdGFcIixuKSxyLnJlbW92ZUxpc3RlbmVyKFwiZHJhaW5cIixpKSx0LnJlbW92ZUxpc3RlbmVyKFwiZW5kXCIscyksdC5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsYSksdC5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsdSksci5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsdSksdC5yZW1vdmVMaXN0ZW5lcihcImVuZFwiLGYpLHQucmVtb3ZlTGlzdGVuZXIoXCJjbG9zZVwiLGYpLHIucmVtb3ZlTGlzdGVuZXIoXCJjbG9zZVwiLGYpfXJldHVybiB0Lm9uKFwiZW5kXCIsZiksdC5vbihcImNsb3NlXCIsZiksci5vbihcImNsb3NlXCIsZiksci5lbWl0KFwicGlwZVwiLHQpLHJ9fSk7dmFyIHVzPVMoKHlkLGFzKT0+e2MoKTt2YXIgYXQ9MWUzLHV0PWF0KjYwLGZ0PXV0KjYwLCRlPWZ0KjI0LGZjPSRlKjcsY2M9JGUqMzY1LjI1O2FzLmV4cG9ydHM9ZnVuY3Rpb24ocixlKXtlPWV8fHt9O3ZhciB0PXR5cGVvZiByO2lmKHQ9PT1cInN0cmluZ1wiJiZyLmxlbmd0aD4wKXJldHVybiBsYyhyKTtpZih0PT09XCJudW1iZXJcIiYmaXNGaW5pdGUocikpcmV0dXJuIGUubG9uZz9wYyhyKTpkYyhyKTt0aHJvdyBuZXcgRXJyb3IoXCJ2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPVwiK0pTT04uc3RyaW5naWZ5KHIpKX07ZnVuY3Rpb24gbGMocil7aWYocj1TdHJpbmcociksIShyLmxlbmd0aD4xMDApKXt2YXIgZT0vXigtPyg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMocik7aWYoISFlKXt2YXIgdD1wYXJzZUZsb2F0KGVbMV0pLG49KGVbMl18fFwibXNcIikudG9Mb3dlckNhc2UoKTtzd2l0Y2gobil7Y2FzZVwieWVhcnNcIjpjYXNlXCJ5ZWFyXCI6Y2FzZVwieXJzXCI6Y2FzZVwieXJcIjpjYXNlXCJ5XCI6cmV0dXJuIHQqY2M7Y2FzZVwid2Vla3NcIjpjYXNlXCJ3ZWVrXCI6Y2FzZVwid1wiOnJldHVybiB0KmZjO2Nhc2VcImRheXNcIjpjYXNlXCJkYXlcIjpjYXNlXCJkXCI6cmV0dXJuIHQqJGU7Y2FzZVwiaG91cnNcIjpjYXNlXCJob3VyXCI6Y2FzZVwiaHJzXCI6Y2FzZVwiaHJcIjpjYXNlXCJoXCI6cmV0dXJuIHQqZnQ7Y2FzZVwibWludXRlc1wiOmNhc2VcIm1pbnV0ZVwiOmNhc2VcIm1pbnNcIjpjYXNlXCJtaW5cIjpjYXNlXCJtXCI6cmV0dXJuIHQqdXQ7Y2FzZVwic2Vjb25kc1wiOmNhc2VcInNlY29uZFwiOmNhc2VcInNlY3NcIjpjYXNlXCJzZWNcIjpjYXNlXCJzXCI6cmV0dXJuIHQqYXQ7Y2FzZVwibWlsbGlzZWNvbmRzXCI6Y2FzZVwibWlsbGlzZWNvbmRcIjpjYXNlXCJtc2Vjc1wiOmNhc2VcIm1zZWNcIjpjYXNlXCJtc1wiOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJufX19fWZ1bmN0aW9uIGRjKHIpe3ZhciBlPU1hdGguYWJzKHIpO3JldHVybiBlPj0kZT9NYXRoLnJvdW5kKHIvJGUpK1wiZFwiOmU+PWZ0P01hdGgucm91bmQoci9mdCkrXCJoXCI6ZT49dXQ/TWF0aC5yb3VuZChyL3V0KStcIm1cIjplPj1hdD9NYXRoLnJvdW5kKHIvYXQpK1wic1wiOnIrXCJtc1wifWZ1bmN0aW9uIHBjKHIpe3ZhciBlPU1hdGguYWJzKHIpO3JldHVybiBlPj0kZT9mcihyLGUsJGUsXCJkYXlcIik6ZT49ZnQ/ZnIocixlLGZ0LFwiaG91clwiKTplPj11dD9mcihyLGUsdXQsXCJtaW51dGVcIik6ZT49YXQ/ZnIocixlLGF0LFwic2Vjb25kXCIpOnIrXCIgbXNcIn1mdW5jdGlvbiBmcihyLGUsdCxuKXt2YXIgaT1lPj10KjEuNTtyZXR1cm4gTWF0aC5yb3VuZChyL3QpK1wiIFwiK24rKGk/XCJzXCI6XCJcIil9fSk7dmFyIGNzPVMoKGJkLGZzKT0+e2MoKTtmdW5jdGlvbiBoYyhyKXt0LmRlYnVnPXQsdC5kZWZhdWx0PXQsdC5jb2VyY2U9dSx0LmRpc2FibGU9byx0LmVuYWJsZT1pLHQuZW5hYmxlZD1zLHQuaHVtYW5pemU9dXMoKSx0LmRlc3Ryb3k9ZixPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGw9Pnt0W2xdPXJbbF19KSx0Lm5hbWVzPVtdLHQuc2tpcHM9W10sdC5mb3JtYXR0ZXJzPXt9O2Z1bmN0aW9uIGUobCl7bGV0IGQ9MDtmb3IobGV0IGg9MDtoPGwubGVuZ3RoO2grKylkPShkPDw1KS1kK2wuY2hhckNvZGVBdChoKSxkfD0wO3JldHVybiB0LmNvbG9yc1tNYXRoLmFicyhkKSV0LmNvbG9ycy5sZW5ndGhdfXQuc2VsZWN0Q29sb3I9ZTtmdW5jdGlvbiB0KGwpe2xldCBkLGg9bnVsbCxtLGI7ZnVuY3Rpb24geSguLi53KXtpZigheS5lbmFibGVkKXJldHVybjtsZXQgXz15LHY9TnVtYmVyKG5ldyBEYXRlKSxxPXYtKGR8fHYpO18uZGlmZj1xLF8ucHJldj1kLF8uY3Vycj12LGQ9dix3WzBdPXQuY29lcmNlKHdbMF0pLHR5cGVvZiB3WzBdIT1cInN0cmluZ1wiJiZ3LnVuc2hpZnQoXCIlT1wiKTtsZXQgQT0wO3dbMF09d1swXS5yZXBsYWNlKC8lKFthLXpBLVolXSkvZywoWSxHZSk9PntpZihZPT09XCIlJVwiKXJldHVyblwiJVwiO0ErKztsZXQgSWU9dC5mb3JtYXR0ZXJzW0dlXTtpZih0eXBlb2YgSWU9PVwiZnVuY3Rpb25cIil7bGV0IEFlPXdbQV07WT1JZS5jYWxsKF8sQWUpLHcuc3BsaWNlKEEsMSksQS0tfXJldHVybiBZfSksdC5mb3JtYXRBcmdzLmNhbGwoXyx3KSwoXy5sb2d8fHQubG9nKS5hcHBseShfLHcpfXJldHVybiB5Lm5hbWVzcGFjZT1sLHkudXNlQ29sb3JzPXQudXNlQ29sb3JzKCkseS5jb2xvcj10LnNlbGVjdENvbG9yKGwpLHkuZXh0ZW5kPW4seS5kZXN0cm95PXQuZGVzdHJveSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSxcImVuYWJsZWRcIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITEsZ2V0OigpPT5oIT09bnVsbD9oOihtIT09dC5uYW1lc3BhY2VzJiYobT10Lm5hbWVzcGFjZXMsYj10LmVuYWJsZWQobCkpLGIpLHNldDp3PT57aD13fX0pLHR5cGVvZiB0LmluaXQ9PVwiZnVuY3Rpb25cIiYmdC5pbml0KHkpLHl9ZnVuY3Rpb24gbihsLGQpe2xldCBoPXQodGhpcy5uYW1lc3BhY2UrKHR5cGVvZiBkPlwidVwiP1wiOlwiOmQpK2wpO3JldHVybiBoLmxvZz10aGlzLmxvZyxofWZ1bmN0aW9uIGkobCl7dC5zYXZlKGwpLHQubmFtZXNwYWNlcz1sLHQubmFtZXM9W10sdC5za2lwcz1bXTtsZXQgZCxoPSh0eXBlb2YgbD09XCJzdHJpbmdcIj9sOlwiXCIpLnNwbGl0KC9bXFxzLF0rLyksbT1oLmxlbmd0aDtmb3IoZD0wO2Q8bTtkKyspIWhbZF18fChsPWhbZF0ucmVwbGFjZSgvXFwqL2csXCIuKj9cIiksbFswXT09PVwiLVwiP3Quc2tpcHMucHVzaChuZXcgUmVnRXhwKFwiXlwiK2wuc2xpY2UoMSkrXCIkXCIpKTp0Lm5hbWVzLnB1c2gobmV3IFJlZ0V4cChcIl5cIitsK1wiJFwiKSkpfWZ1bmN0aW9uIG8oKXtsZXQgbD1bLi4udC5uYW1lcy5tYXAoYSksLi4udC5za2lwcy5tYXAoYSkubWFwKGQ9PlwiLVwiK2QpXS5qb2luKFwiLFwiKTtyZXR1cm4gdC5lbmFibGUoXCJcIiksbH1mdW5jdGlvbiBzKGwpe2lmKGxbbC5sZW5ndGgtMV09PT1cIipcIilyZXR1cm4hMDtsZXQgZCxoO2ZvcihkPTAsaD10LnNraXBzLmxlbmd0aDtkPGg7ZCsrKWlmKHQuc2tpcHNbZF0udGVzdChsKSlyZXR1cm4hMTtmb3IoZD0wLGg9dC5uYW1lcy5sZW5ndGg7ZDxoO2QrKylpZih0Lm5hbWVzW2RdLnRlc3QobCkpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gYShsKXtyZXR1cm4gbC50b1N0cmluZygpLnN1YnN0cmluZygyLGwudG9TdHJpbmcoKS5sZW5ndGgtMikucmVwbGFjZSgvXFwuXFwqXFw/JC8sXCIqXCIpfWZ1bmN0aW9uIHUobCl7cmV0dXJuIGwgaW5zdGFuY2VvZiBFcnJvcj9sLnN0YWNrfHxsLm1lc3NhZ2U6bH1mdW5jdGlvbiBmKCl7Y29uc29sZS53YXJuKFwiSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLlwiKX1yZXR1cm4gdC5lbmFibGUodC5sb2FkKCkpLHR9ZnMuZXhwb3J0cz1oY30pO3ZhciBsZT1TKCh6LGNyKT0+e2MoKTt6LmZvcm1hdEFyZ3M9Z2M7ei5zYXZlPXljO3oubG9hZD1iYzt6LnVzZUNvbG9ycz1tYzt6LnN0b3JhZ2U9eGMoKTt6LmRlc3Ryb3k9KCgpPT57bGV0IHI9ITE7cmV0dXJuKCk9PntyfHwocj0hMCxjb25zb2xlLndhcm4oXCJJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuXCIpKX19KSgpO3ouY29sb3JzPVtcIiMwMDAwQ0NcIixcIiMwMDAwRkZcIixcIiMwMDMzQ0NcIixcIiMwMDMzRkZcIixcIiMwMDY2Q0NcIixcIiMwMDY2RkZcIixcIiMwMDk5Q0NcIixcIiMwMDk5RkZcIixcIiMwMENDMDBcIixcIiMwMENDMzNcIixcIiMwMENDNjZcIixcIiMwMENDOTlcIixcIiMwMENDQ0NcIixcIiMwMENDRkZcIixcIiMzMzAwQ0NcIixcIiMzMzAwRkZcIixcIiMzMzMzQ0NcIixcIiMzMzMzRkZcIixcIiMzMzY2Q0NcIixcIiMzMzY2RkZcIixcIiMzMzk5Q0NcIixcIiMzMzk5RkZcIixcIiMzM0NDMDBcIixcIiMzM0NDMzNcIixcIiMzM0NDNjZcIixcIiMzM0NDOTlcIixcIiMzM0NDQ0NcIixcIiMzM0NDRkZcIixcIiM2NjAwQ0NcIixcIiM2NjAwRkZcIixcIiM2NjMzQ0NcIixcIiM2NjMzRkZcIixcIiM2NkNDMDBcIixcIiM2NkNDMzNcIixcIiM5OTAwQ0NcIixcIiM5OTAwRkZcIixcIiM5OTMzQ0NcIixcIiM5OTMzRkZcIixcIiM5OUNDMDBcIixcIiM5OUNDMzNcIixcIiNDQzAwMDBcIixcIiNDQzAwMzNcIixcIiNDQzAwNjZcIixcIiNDQzAwOTlcIixcIiNDQzAwQ0NcIixcIiNDQzAwRkZcIixcIiNDQzMzMDBcIixcIiNDQzMzMzNcIixcIiNDQzMzNjZcIixcIiNDQzMzOTlcIixcIiNDQzMzQ0NcIixcIiNDQzMzRkZcIixcIiNDQzY2MDBcIixcIiNDQzY2MzNcIixcIiNDQzk5MDBcIixcIiNDQzk5MzNcIixcIiNDQ0NDMDBcIixcIiNDQ0NDMzNcIixcIiNGRjAwMDBcIixcIiNGRjAwMzNcIixcIiNGRjAwNjZcIixcIiNGRjAwOTlcIixcIiNGRjAwQ0NcIixcIiNGRjAwRkZcIixcIiNGRjMzMDBcIixcIiNGRjMzMzNcIixcIiNGRjMzNjZcIixcIiNGRjMzOTlcIixcIiNGRjMzQ0NcIixcIiNGRjMzRkZcIixcIiNGRjY2MDBcIixcIiNGRjY2MzNcIixcIiNGRjk5MDBcIixcIiNGRjk5MzNcIixcIiNGRkNDMDBcIixcIiNGRkNDMzNcIl07ZnVuY3Rpb24gbWMoKXtyZXR1cm4gdHlwZW9mIHdpbmRvdzxcInVcIiYmd2luZG93LnByb2Nlc3MmJih3aW5kb3cucHJvY2Vzcy50eXBlPT09XCJyZW5kZXJlclwifHx3aW5kb3cucHJvY2Vzcy5fX253anMpPyEwOnR5cGVvZiBuYXZpZ2F0b3I8XCJ1XCImJm5hdmlnYXRvci51c2VyQWdlbnQmJm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvKGVkZ2V8dHJpZGVudClcXC8oXFxkKykvKT8hMTp0eXBlb2YgZG9jdW1lbnQ8XCJ1XCImJmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlJiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuV2Via2l0QXBwZWFyYW5jZXx8dHlwZW9mIHdpbmRvdzxcInVcIiYmd2luZG93LmNvbnNvbGUmJih3aW5kb3cuY29uc29sZS5maXJlYnVnfHx3aW5kb3cuY29uc29sZS5leGNlcHRpb24mJndpbmRvdy5jb25zb2xlLnRhYmxlKXx8dHlwZW9mIG5hdmlnYXRvcjxcInVcIiYmbmF2aWdhdG9yLnVzZXJBZ2VudCYmbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9maXJlZm94XFwvKFxcZCspLykmJnBhcnNlSW50KFJlZ0V4cC4kMSwxMCk+PTMxfHx0eXBlb2YgbmF2aWdhdG9yPFwidVwiJiZuYXZpZ2F0b3IudXNlckFnZW50JiZuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2FwcGxld2Via2l0XFwvKFxcZCspLyl9ZnVuY3Rpb24gZ2Mocil7aWYoclswXT0odGhpcy51c2VDb2xvcnM/XCIlY1wiOlwiXCIpK3RoaXMubmFtZXNwYWNlKyh0aGlzLnVzZUNvbG9ycz9cIiAlY1wiOlwiIFwiKStyWzBdKyh0aGlzLnVzZUNvbG9ycz9cIiVjIFwiOlwiIFwiKStcIitcIitjci5leHBvcnRzLmh1bWFuaXplKHRoaXMuZGlmZiksIXRoaXMudXNlQ29sb3JzKXJldHVybjtsZXQgZT1cImNvbG9yOiBcIit0aGlzLmNvbG9yO3Iuc3BsaWNlKDEsMCxlLFwiY29sb3I6IGluaGVyaXRcIik7bGV0IHQ9MCxuPTA7clswXS5yZXBsYWNlKC8lW2EtekEtWiVdL2csaT0+e2khPT1cIiUlXCImJih0KyssaT09PVwiJWNcIiYmKG49dCkpfSksci5zcGxpY2UobiwwLGUpfXoubG9nPWNvbnNvbGUuZGVidWd8fGNvbnNvbGUubG9nfHwoKCk9Pnt9KTtmdW5jdGlvbiB5YyhyKXt0cnl7cj96LnN0b3JhZ2Uuc2V0SXRlbShcImRlYnVnXCIscik6ei5zdG9yYWdlLnJlbW92ZUl0ZW0oXCJkZWJ1Z1wiKX1jYXRjaHt9fWZ1bmN0aW9uIGJjKCl7bGV0IHI7dHJ5e3I9ei5zdG9yYWdlLmdldEl0ZW0oXCJkZWJ1Z1wiKX1jYXRjaHt9cmV0dXJuIXImJnR5cGVvZiBwcm9jZXNzPFwidVwiJiZcImVudlwiaW4gcHJvY2VzcyYmKHI9cHJvY2Vzcy5lbnYuREVCVUcpLHJ9ZnVuY3Rpb24geGMoKXt0cnl7cmV0dXJuIGxvY2FsU3RvcmFnZX1jYXRjaHt9fWNyLmV4cG9ydHM9Y3MoKSh6KTt2YXJ7Zm9ybWF0dGVyczpfY309Y3IuZXhwb3J0cztfYy5qPWZ1bmN0aW9uKHIpe3RyeXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkocil9Y2F0Y2goZSl7cmV0dXJuXCJbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogXCIrZS5tZXNzYWdlfX19KTt2YXIgbmE9Uyh0aT0+e1widXNlIHN0cmljdFwiO2MoKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGksXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIHJhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcigpe3RoaXMuX2RhdGFMZW5ndGg9MCx0aGlzLl9idWZmZXJMZW5ndGg9MCx0aGlzLl9zdGF0ZT1uZXcgSW50MzJBcnJheSg0KSx0aGlzLl9idWZmZXI9bmV3IEFycmF5QnVmZmVyKDY4KSx0aGlzLl9idWZmZXI4PW5ldyBVaW50OEFycmF5KHRoaXMuX2J1ZmZlciwwLDY4KSx0aGlzLl9idWZmZXIzMj1uZXcgVWludDMyQXJyYXkodGhpcy5fYnVmZmVyLDAsMTcpLHRoaXMuc3RhcnQoKX1yZXR1cm4gci5oYXNoU3RyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ9PT12b2lkIDAmJih0PSExKSx0aGlzLm9uZVBhc3NIYXNoZXIuc3RhcnQoKS5hcHBlbmRTdHIoZSkuZW5kKHQpfSxyLmhhc2hBc2NpaVN0cj1mdW5jdGlvbihlLHQpe3JldHVybiB0PT09dm9pZCAwJiYodD0hMSksdGhpcy5vbmVQYXNzSGFzaGVyLnN0YXJ0KCkuYXBwZW5kQXNjaWlTdHIoZSkuZW5kKHQpfSxyLl9oZXg9ZnVuY3Rpb24oZSl7dmFyIHQ9ci5oZXhDaGFycyxuPXIuaGV4T3V0LGksbyxzLGE7Zm9yKGE9MDthPDQ7YSs9MSlmb3Iobz1hKjgsaT1lW2FdLHM9MDtzPDg7cys9MiluW28rMStzXT10LmNoYXJBdChpJjE1KSxpPj4+PTQsbltvKzArc109dC5jaGFyQXQoaSYxNSksaT4+Pj00O3JldHVybiBuLmpvaW4oXCJcIil9LHIuX21kNWN5Y2xlPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZVswXSxpPWVbMV0sbz1lWzJdLHM9ZVszXTtuKz0oaSZvfH5pJnMpK3RbMF0tNjgwODc2OTM2fDAsbj0objw8N3xuPj4+MjUpK2l8MCxzKz0obiZpfH5uJm8pK3RbMV0tMzg5NTY0NTg2fDAscz0oczw8MTJ8cz4+PjIwKStufDAsbys9KHMmbnx+cyZpKSt0WzJdKzYwNjEwNTgxOXwwLG89KG88PDE3fG8+Pj4xNSkrc3wwLGkrPShvJnN8fm8mbikrdFszXS0xMDQ0NTI1MzMwfDAsaT0oaTw8MjJ8aT4+PjEwKStvfDAsbis9KGkmb3x+aSZzKSt0WzRdLTE3NjQxODg5N3wwLG49KG48PDd8bj4+PjI1KStpfDAscys9KG4maXx+biZvKSt0WzVdKzEyMDAwODA0MjZ8MCxzPShzPDwxMnxzPj4+MjApK258MCxvKz0ocyZufH5zJmkpK3RbNl0tMTQ3MzIzMTM0MXwwLG89KG88PDE3fG8+Pj4xNSkrc3wwLGkrPShvJnN8fm8mbikrdFs3XS00NTcwNTk4M3wwLGk9KGk8PDIyfGk+Pj4xMCkrb3wwLG4rPShpJm98fmkmcykrdFs4XSsxNzcwMDM1NDE2fDAsbj0objw8N3xuPj4+MjUpK2l8MCxzKz0obiZpfH5uJm8pK3RbOV0tMTk1ODQxNDQxN3wwLHM9KHM8PDEyfHM+Pj4yMCkrbnwwLG8rPShzJm58fnMmaSkrdFsxMF0tNDIwNjN8MCxvPShvPDwxN3xvPj4+MTUpK3N8MCxpKz0obyZzfH5vJm4pK3RbMTFdLTE5OTA0MDQxNjJ8MCxpPShpPDwyMnxpPj4+MTApK298MCxuKz0oaSZvfH5pJnMpK3RbMTJdKzE4MDQ2MDM2ODJ8MCxuPShuPDw3fG4+Pj4yNSkraXwwLHMrPShuJml8fm4mbykrdFsxM10tNDAzNDExMDF8MCxzPShzPDwxMnxzPj4+MjApK258MCxvKz0ocyZufH5zJmkpK3RbMTRdLTE1MDIwMDIyOTB8MCxvPShvPDwxN3xvPj4+MTUpK3N8MCxpKz0obyZzfH5vJm4pK3RbMTVdKzEyMzY1MzUzMjl8MCxpPShpPDwyMnxpPj4+MTApK298MCxuKz0oaSZzfG8mfnMpK3RbMV0tMTY1Nzk2NTEwfDAsbj0objw8NXxuPj4+MjcpK2l8MCxzKz0obiZvfGkmfm8pK3RbNl0tMTA2OTUwMTYzMnwwLHM9KHM8PDl8cz4+PjIzKStufDAsbys9KHMmaXxuJn5pKSt0WzExXSs2NDM3MTc3MTN8MCxvPShvPDwxNHxvPj4+MTgpK3N8MCxpKz0obyZufHMmfm4pK3RbMF0tMzczODk3MzAyfDAsaT0oaTw8MjB8aT4+PjEyKStvfDAsbis9KGkmc3xvJn5zKSt0WzVdLTcwMTU1ODY5MXwwLG49KG48PDV8bj4+PjI3KStpfDAscys9KG4mb3xpJn5vKSt0WzEwXSszODAxNjA4M3wwLHM9KHM8PDl8cz4+PjIzKStufDAsbys9KHMmaXxuJn5pKSt0WzE1XS02NjA0NzgzMzV8MCxvPShvPDwxNHxvPj4+MTgpK3N8MCxpKz0obyZufHMmfm4pK3RbNF0tNDA1NTM3ODQ4fDAsaT0oaTw8MjB8aT4+PjEyKStvfDAsbis9KGkmc3xvJn5zKSt0WzldKzU2ODQ0NjQzOHwwLG49KG48PDV8bj4+PjI3KStpfDAscys9KG4mb3xpJn5vKSt0WzE0XS0xMDE5ODAzNjkwfDAscz0oczw8OXxzPj4+MjMpK258MCxvKz0ocyZpfG4mfmkpK3RbM10tMTg3MzYzOTYxfDAsbz0obzw8MTR8bz4+PjE4KStzfDAsaSs9KG8mbnxzJn5uKSt0WzhdKzExNjM1MzE1MDF8MCxpPShpPDwyMHxpPj4+MTIpK298MCxuKz0oaSZzfG8mfnMpK3RbMTNdLTE0NDQ2ODE0Njd8MCxuPShuPDw1fG4+Pj4yNykraXwwLHMrPShuJm98aSZ+bykrdFsyXS01MTQwMzc4NHwwLHM9KHM8PDl8cz4+PjIzKStufDAsbys9KHMmaXxuJn5pKSt0WzddKzE3MzUzMjg0NzN8MCxvPShvPDwxNHxvPj4+MTgpK3N8MCxpKz0obyZufHMmfm4pK3RbMTJdLTE5MjY2MDc3MzR8MCxpPShpPDwyMHxpPj4+MTIpK298MCxuKz0oaV5vXnMpK3RbNV0tMzc4NTU4fDAsbj0objw8NHxuPj4+MjgpK2l8MCxzKz0obl5pXm8pK3RbOF0tMjAyMjU3NDQ2M3wwLHM9KHM8PDExfHM+Pj4yMSkrbnwwLG8rPShzXm5eaSkrdFsxMV0rMTgzOTAzMDU2MnwwLG89KG88PDE2fG8+Pj4xNikrc3wwLGkrPShvXnNebikrdFsxNF0tMzUzMDk1NTZ8MCxpPShpPDwyM3xpPj4+OSkrb3wwLG4rPShpXm9ecykrdFsxXS0xNTMwOTkyMDYwfDAsbj0objw8NHxuPj4+MjgpK2l8MCxzKz0obl5pXm8pK3RbNF0rMTI3Mjg5MzM1M3wwLHM9KHM8PDExfHM+Pj4yMSkrbnwwLG8rPShzXm5eaSkrdFs3XS0xNTU0OTc2MzJ8MCxvPShvPDwxNnxvPj4+MTYpK3N8MCxpKz0ob15zXm4pK3RbMTBdLTEwOTQ3MzA2NDB8MCxpPShpPDwyM3xpPj4+OSkrb3wwLG4rPShpXm9ecykrdFsxM10rNjgxMjc5MTc0fDAsbj0objw8NHxuPj4+MjgpK2l8MCxzKz0obl5pXm8pK3RbMF0tMzU4NTM3MjIyfDAscz0oczw8MTF8cz4+PjIxKStufDAsbys9KHNebl5pKSt0WzNdLTcyMjUyMTk3OXwwLG89KG88PDE2fG8+Pj4xNikrc3wwLGkrPShvXnNebikrdFs2XSs3NjAyOTE4OXwwLGk9KGk8PDIzfGk+Pj45KStvfDAsbis9KGleb15zKSt0WzldLTY0MDM2NDQ4N3wwLG49KG48PDR8bj4+PjI4KStpfDAscys9KG5eaV5vKSt0WzEyXS00MjE4MTU4MzV8MCxzPShzPDwxMXxzPj4+MjEpK258MCxvKz0oc15uXmkpK3RbMTVdKzUzMDc0MjUyMHwwLG89KG88PDE2fG8+Pj4xNikrc3wwLGkrPShvXnNebikrdFsyXS05OTUzMzg2NTF8MCxpPShpPDwyM3xpPj4+OSkrb3wwLG4rPShvXihpfH5zKSkrdFswXS0xOTg2MzA4NDR8MCxuPShuPDw2fG4+Pj4yNikraXwwLHMrPShpXihufH5vKSkrdFs3XSsxMTI2ODkxNDE1fDAscz0oczw8MTB8cz4+PjIyKStufDAsbys9KG5eKHN8fmkpKSt0WzE0XS0xNDE2MzU0OTA1fDAsbz0obzw8MTV8bz4+PjE3KStzfDAsaSs9KHNeKG98fm4pKSt0WzVdLTU3NDM0MDU1fDAsaT0oaTw8MjF8aT4+PjExKStvfDAsbis9KG9eKGl8fnMpKSt0WzEyXSsxNzAwNDg1NTcxfDAsbj0objw8NnxuPj4+MjYpK2l8MCxzKz0oaV4obnx+bykpK3RbM10tMTg5NDk4NjYwNnwwLHM9KHM8PDEwfHM+Pj4yMikrbnwwLG8rPShuXihzfH5pKSkrdFsxMF0tMTA1MTUyM3wwLG89KG88PDE1fG8+Pj4xNykrc3wwLGkrPShzXihvfH5uKSkrdFsxXS0yMDU0OTIyNzk5fDAsaT0oaTw8MjF8aT4+PjExKStvfDAsbis9KG9eKGl8fnMpKSt0WzhdKzE4NzMzMTMzNTl8MCxuPShuPDw2fG4+Pj4yNikraXwwLHMrPShpXihufH5vKSkrdFsxNV0tMzA2MTE3NDR8MCxzPShzPDwxMHxzPj4+MjIpK258MCxvKz0obl4oc3x+aSkpK3RbNl0tMTU2MDE5ODM4MHwwLG89KG88PDE1fG8+Pj4xNykrc3wwLGkrPShzXihvfH5uKSkrdFsxM10rMTMwOTE1MTY0OXwwLGk9KGk8PDIxfGk+Pj4xMSkrb3wwLG4rPShvXihpfH5zKSkrdFs0XS0xNDU1MjMwNzB8MCxuPShuPDw2fG4+Pj4yNikraXwwLHMrPShpXihufH5vKSkrdFsxMV0tMTEyMDIxMDM3OXwwLHM9KHM8PDEwfHM+Pj4yMikrbnwwLG8rPShuXihzfH5pKSkrdFsyXSs3MTg3ODcyNTl8MCxvPShvPDwxNXxvPj4+MTcpK3N8MCxpKz0oc14ob3x+bikpK3RbOV0tMzQzNDg1NTUxfDAsaT0oaTw8MjF8aT4+PjExKStvfDAsZVswXT1uK2VbMF18MCxlWzFdPWkrZVsxXXwwLGVbMl09bytlWzJdfDAsZVszXT1zK2VbM118MH0sci5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YUxlbmd0aD0wLHRoaXMuX2J1ZmZlckxlbmd0aD0wLHRoaXMuX3N0YXRlLnNldChyLnN0YXRlSWRlbnRpdHkpLHRoaXN9LHIucHJvdG90eXBlLmFwcGVuZFN0cj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9idWZmZXI4LG49dGhpcy5fYnVmZmVyMzIsaT10aGlzLl9idWZmZXJMZW5ndGgsbyxzO2ZvcihzPTA7czxlLmxlbmd0aDtzKz0xKXtpZihvPWUuY2hhckNvZGVBdChzKSxvPDEyOCl0W2krK109bztlbHNlIGlmKG88MjA0OCl0W2krK109KG8+Pj42KSsxOTIsdFtpKytdPW8mNjN8MTI4O2Vsc2UgaWYobzw1NTI5Nnx8bz41NjMxOSl0W2krK109KG8+Pj4xMikrMjI0LHRbaSsrXT1vPj4+NiY2M3wxMjgsdFtpKytdPW8mNjN8MTI4O2Vsc2V7aWYobz0oby01NTI5NikqMTAyNCsoZS5jaGFyQ29kZUF0KCsrcyktNTYzMjApKzY1NTM2LG8+MTExNDExMSl0aHJvdyBuZXcgRXJyb3IoXCJVbmljb2RlIHN0YW5kYXJkIHN1cHBvcnRzIGNvZGUgcG9pbnRzIHVwIHRvIFUrMTBGRkZGXCIpO3RbaSsrXT0obz4+PjE4KSsyNDAsdFtpKytdPW8+Pj4xMiY2M3wxMjgsdFtpKytdPW8+Pj42JjYzfDEyOCx0W2krK109byY2M3wxMjh9aT49NjQmJih0aGlzLl9kYXRhTGVuZ3RoKz02NCxyLl9tZDVjeWNsZSh0aGlzLl9zdGF0ZSxuKSxpLT02NCxuWzBdPW5bMTZdKX1yZXR1cm4gdGhpcy5fYnVmZmVyTGVuZ3RoPWksdGhpc30sci5wcm90b3R5cGUuYXBwZW5kQXNjaWlTdHI9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMuX2J1ZmZlcjgsbj10aGlzLl9idWZmZXIzMixpPXRoaXMuX2J1ZmZlckxlbmd0aCxvLHM9MDs7KXtmb3Iobz1NYXRoLm1pbihlLmxlbmd0aC1zLDY0LWkpO28tLTspdFtpKytdPWUuY2hhckNvZGVBdChzKyspO2lmKGk8NjQpYnJlYWs7dGhpcy5fZGF0YUxlbmd0aCs9NjQsci5fbWQ1Y3ljbGUodGhpcy5fc3RhdGUsbiksaT0wfXJldHVybiB0aGlzLl9idWZmZXJMZW5ndGg9aSx0aGlzfSxyLnByb3RvdHlwZS5hcHBlbmRCeXRlQXJyYXk9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMuX2J1ZmZlcjgsbj10aGlzLl9idWZmZXIzMixpPXRoaXMuX2J1ZmZlckxlbmd0aCxvLHM9MDs7KXtmb3Iobz1NYXRoLm1pbihlLmxlbmd0aC1zLDY0LWkpO28tLTspdFtpKytdPWVbcysrXTtpZihpPDY0KWJyZWFrO3RoaXMuX2RhdGFMZW5ndGgrPTY0LHIuX21kNWN5Y2xlKHRoaXMuX3N0YXRlLG4pLGk9MH1yZXR1cm4gdGhpcy5fYnVmZmVyTGVuZ3RoPWksdGhpc30sci5wcm90b3R5cGUuZ2V0U3RhdGU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9zdGF0ZTtyZXR1cm57YnVmZmVyOlN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxBcnJheS5mcm9tKHRoaXMuX2J1ZmZlcjgpKSxidWZsZW46dGhpcy5fYnVmZmVyTGVuZ3RoLGxlbmd0aDp0aGlzLl9kYXRhTGVuZ3RoLHN0YXRlOltlWzBdLGVbMV0sZVsyXSxlWzNdXX19LHIucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKGUpe3ZhciB0PWUuYnVmZmVyLG49ZS5zdGF0ZSxpPXRoaXMuX3N0YXRlLG87Zm9yKHRoaXMuX2RhdGFMZW5ndGg9ZS5sZW5ndGgsdGhpcy5fYnVmZmVyTGVuZ3RoPWUuYnVmbGVuLGlbMF09blswXSxpWzFdPW5bMV0saVsyXT1uWzJdLGlbM109blszXSxvPTA7bzx0Lmxlbmd0aDtvKz0xKXRoaXMuX2J1ZmZlcjhbb109dC5jaGFyQ29kZUF0KG8pfSxyLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24oZSl7ZT09PXZvaWQgMCYmKGU9ITEpO3ZhciB0PXRoaXMuX2J1ZmZlckxlbmd0aCxuPXRoaXMuX2J1ZmZlcjgsaT10aGlzLl9idWZmZXIzMixvPSh0Pj4yKSsxO3RoaXMuX2RhdGFMZW5ndGgrPXQ7dmFyIHM9dGhpcy5fZGF0YUxlbmd0aCo4O2lmKG5bdF09MTI4LG5bdCsxXT1uW3QrMl09blt0KzNdPTAsaS5zZXQoci5idWZmZXIzMklkZW50aXR5LnN1YmFycmF5KG8pLG8pLHQ+NTUmJihyLl9tZDVjeWNsZSh0aGlzLl9zdGF0ZSxpKSxpLnNldChyLmJ1ZmZlcjMySWRlbnRpdHkpKSxzPD00Mjk0OTY3Mjk1KWlbMTRdPXM7ZWxzZXt2YXIgYT1zLnRvU3RyaW5nKDE2KS5tYXRjaCgvKC4qPykoLnswLDh9KSQvKTtpZihhPT09bnVsbClyZXR1cm47dmFyIHU9cGFyc2VJbnQoYVsyXSwxNiksZj1wYXJzZUludChhWzFdLDE2KXx8MDtpWzE0XT11LGlbMTVdPWZ9cmV0dXJuIHIuX21kNWN5Y2xlKHRoaXMuX3N0YXRlLGkpLGU/dGhpcy5fc3RhdGU6ci5faGV4KHRoaXMuX3N0YXRlKX0sci5zdGF0ZUlkZW50aXR5PW5ldyBJbnQzMkFycmF5KFsxNzMyNTg0MTkzLC0yNzE3MzM4NzksLTE3MzI1ODQxOTQsMjcxNzMzODc4XSksci5idWZmZXIzMklkZW50aXR5PW5ldyBJbnQzMkFycmF5KFswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXSksci5oZXhDaGFycz1cIjAxMjM0NTY3ODlhYmNkZWZcIixyLmhleE91dD1bXSxyLm9uZVBhc3NIYXNoZXI9bmV3IHIscn0oKTt0aS5NZDU9cmE7aWYocmEuaGFzaFN0cihcImhlbGxvXCIpIT09XCI1ZDQxNDAyYWJjNGIyYTc2Yjk3MTlkOTExMDE3YzU5MlwiKXRocm93IG5ldyBFcnJvcihcIk1kNSBzZWxmIHRlc3QgZmFpbGVkLlwiKX0pO3ZhciBpbD17fTtQdChpbCx7QUFDRGVwYXk6KCk9Pm90LEJhc2ljRGVwYXk6KCk9PnNyLENhbnZhc1Npbms6KCk9PnN0LEgyNjREZXBheTooKT0+Y3QsSHRtbDVDYW52YXNQaXBlbGluZTooKT0+SHIsSHRtbDVWaWRlb01ldGFkYXRhUGlwZWxpbmU6KCk9PnFyLEh0bWw1VmlkZW9QaXBlbGluZTooKT0+X3QsSHR0cE1zZVBpcGVsaW5lOigpPT5HcixIdHRwU291cmNlOigpPT5kcixJbnNwZWN0b3I6KCk9PnByLEpQRUdEZXBheTooKT0+bHQsTWVzc2FnZVR5cGU6KCk9PkksTWV0YWRhdGFQaXBlbGluZTooKT0+anIsTXA0Q2FwdHVyZTooKT0+bXIsTXA0TXV4ZXI6KCk9PnB0LE1zZVNpbms6KCk9PlRlLE9OVklGRGVwYXk6KCk9PkNlLFBpcGVsaW5lOigpPT5CZSxSVENQUGFja2V0VHlwZTooKT0+S24sUlRTUFJlc3BvbnNlRXJyb3I6KCk9Pkl0LFJUU1BfTUVUSE9EOigpPT5PcixSdHNwTWpwZWdQaXBlbGluZTooKT0+eHQsUnRzcE1wNFBpcGVsaW5lOigpPT5idCxSdHNwUGFyc2VyOigpPT5tdCxSdHNwUGlwZWxpbmU6KCk9PmVlLFJ0c3BTZXNzaW9uOigpPT55dCxTREVTSXRlbTooKT0+Sm4sU1I6KCk9PkhzLFNjaGVkdWxlcjooKT0+V2UsU2luazooKT0+USxTb3VyY2U6KCk9PlYsVHViZTooKT0+UixXU1NvdXJjZTooKT0+RyxXc1NkcFBpcGVsaW5lOigpPT5XcixhZGRSVFNQUmV0cnk6KCk9PmFhLGJvZHlPZmZzZXQ6KCk9PkFyLGNTcmM6KCk9Pm5zLGNTcmNDb3VudDooKT0+U2UsY29tcG9uZW50czooKT0+ZWksY29ubmVjdGlvbkVuZGVkOigpPT5Mcixjb250ZW50QmFzZTooKT0+QnIsY29udGVudExvY2F0aW9uOigpPT5NcixjcmVhdGVUcmFuc2Zvcm06KCk9PnllLGV4dEhlYWRlcjooKT0+aXMsZXh0SGVhZGVyTGVuZ3RoOigpPT5NdCxleHRlbnNpb246KCk9Pm9yLGV4dHJhY3RIZWFkZXJWYWx1ZTooKT0+cmUsZXh0cmFjdFVSSXM6KCk9PkpzLGdldFRpbWU6KCk9PlByLGlzUnRjcEFwcDooKT0+JHMsaXNSdGNwQnllOigpPT53cixpc1J0Y3BSUjooKT0+anMsaXNSdGNwU0RFUzooKT0+V3MsaXNSdGNwU1I6KCk9Pl9yLG1hcmtlcjooKT0+Y2UsbWVzc2FnZUZyb21CdWZmZXI6KCk9PlNyLHBhZGRpbmc6KCk9PmVzLHBhcnNlOigpPT5RbixwYXJzZVJ0Y3A6KCk9PlhuLHBheWxvYWQ6KCk9PloscGF5bG9hZFR5cGU6KCk9Pk8scGlwZWxpbmVzOigpPT5uaSxyYW5nZTooKT0+SXIscnRjcE1lc3NhZ2VGcm9tQnVmZmVyOigpPT54cixzU3JjOigpPT5ycyxzZXF1ZW5jZTooKT0+UnIsc2VxdWVuY2VOdW1iZXI6KCk9PnRzLHNlc3Npb25JZDooKT0+VHIsc2Vzc2lvblRpbWVvdXQ6KCk9PkNyLHN0YXR1c0NvZGU6KCk9Pmh0LHRpbWVzdGFtcDooKT0+SCx1dGlsczooKT0+aWksdmVyc2lvbjooKT0+Wm99KTttb2R1bGUuZXhwb3J0cz1tYShpbCk7YygpO3ZhciBlaT17fTtQdChlaSx7QUFDRGVwYXk6KCk9Pm90LEJhc2ljRGVwYXk6KCk9PnNyLENhbnZhc1Npbms6KCk9PnN0LEgyNjREZXBheTooKT0+Y3QsSHR0cFNvdXJjZTooKT0+ZHIsSW5zcGVjdG9yOigpPT5wcixKUEVHRGVwYXk6KCk9Pmx0LE1lc3NhZ2VUeXBlOigpPT5JLE1wNENhcHR1cmU6KCk9Pm1yLE1wNE11eGVyOigpPT5wdCxNc2VTaW5rOigpPT5UZSxPTlZJRkRlcGF5OigpPT5DZSxSVFNQUmVzcG9uc2VFcnJvcjooKT0+SXQsUlRTUF9NRVRIT0Q6KCk9Pk9yLFJ0c3BQYXJzZXI6KCk9Pm10LFJ0c3BTZXNzaW9uOigpPT55dCxTaW5rOigpPT5RLFNvdXJjZTooKT0+VixUdWJlOigpPT5SLFdTU291cmNlOigpPT5HLGNyZWF0ZVRyYW5zZm9ybTooKT0+eWV9KTtjKCk7YygpO3ZhciBnZT1DKE4oKSk7YygpO3ZhciBFZT1DKE4oKSksZmU9Y2xhc3N7c3RhdGljIGNvbnN1bWVyKGU9KCk9Pnt9KXtyZXR1cm4gbmV3IEVlLldyaXRhYmxlKHtvYmplY3RNb2RlOiEwLHdyaXRlKHQsbixpKXtlKHQpLGkoKX19KX1zdGF0aWMgcGVla2VyKGUpe2lmKHR5cGVvZiBlIT1cImZ1bmN0aW9uXCIpdGhyb3cgbmV3IEVycm9yKFwieW91IG11c3Qgc3VwcGx5IGEgZnVuY3Rpb25cIik7cmV0dXJuIG5ldyBFZS5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtKHQsbixpKXtlKHQpLGkodm9pZCAwLHQpfX0pfXN0YXRpYyBwcm9kdWNlcihlKXtsZXQgdD0wO3JldHVybiBuZXcgRWUuUmVhZGFibGUoe29iamVjdE1vZGU6ITAscmVhZCgpe2UhPT12b2lkIDAmJih0PGUubGVuZ3RoP3RoaXMucHVzaChlW3QrK10pOnRoaXMucHVzaChudWxsKSl9fSl9c3RhdGljIHJlY29yZGVyKGUsdCl7cmV0dXJuIG5ldyBFZS5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtKG4saSxvKXtsZXQgcz1EYXRlLm5vdygpLGE9T2JqZWN0LmFzc2lnbih7fSxuLHtkYXRhOm4uZGF0YS50b1N0cmluZyhcImJhc2U2NFwiKX0pO3Qud3JpdGUoSlNPTi5zdHJpbmdpZnkoe3R5cGU6ZSx0aW1lc3RhbXA6cyxtZXNzYWdlOmF9LG51bGwsMikpLHQud3JpdGUoYCxcbmApLG8odm9pZCAwLG4pfX0pfXN0YXRpYyByZXBsYXllcihlKXtsZXQgdD0wLG49ZVswXS50aW1lc3RhbXA7cmV0dXJuIG5ldyBFZS5SZWFkYWJsZSh7b2JqZWN0TW9kZTohMCxyZWFkKCl7bGV0IGk9ZVt0KytdO2lmKGkpe2xldHt0eXBlOm8sdGltZXN0YW1wOnMsbWVzc2FnZTphfT1pLHU9cy1uO2lmKG49cyxhKXtsZXQgZj1hLmRhdGE/QnVmZmVyLmZyb20oYS5kYXRhLFwiYmFzZTY0XCIpOkJ1ZmZlci5hbGxvYygwKSxsPU9iamVjdC5hc3NpZ24oe30sYSx7ZGF0YTpmfSk7dGhpcy5wdXNoKHt0eXBlOm8sZGVsYXk6dSxtc2c6bH0pfWVsc2UgdGhpcy5wdXNoKHt0eXBlOm8sZGVsYXk6dSxtc2c6bnVsbH0pfWVsc2UgdGhpcy5wdXNoKG51bGwpfX0pfX07dmFyIGlyPWNsYXNze30sVj1jbGFzcyBleHRlbmRzIGlye2NvbnN0cnVjdG9yKHQ9bmV3IGdlLlJlYWRhYmxlKHtvYmplY3RNb2RlOiEwfSksbj1uZXcgZ2UuV3JpdGFibGUoe29iamVjdE1vZGU6ITB9KSl7c3VwZXIoKTt0aGlzLmluY29taW5nPXQsdGhpcy5vdXRnb2luZz1uLHRoaXMubmV4dD1udWxsLHRoaXMucHJldj1udWxsfXN0YXRpYyBmcm9tTWVzc2FnZXModCl7cmV0dXJuIG5ldyBWKGZlLnByb2R1Y2VyKHQpLGZlLmNvbnN1bWVyKCkpfWNvbm5lY3QodCl7aWYodD09PW51bGwpcmV0dXJuIHRoaXM7aWYodGhpcy5uZXh0IT09bnVsbHx8dC5wcmV2IT09bnVsbCl0aHJvdyBuZXcgRXJyb3IoXCJjb25uZWN0aW9uIGZhaWxlZDogY29tcG9uZW50KHMpIGFscmVhZHkgY29ubmVjdGVkXCIpO2lmKCF0aGlzLmluY29taW5nLnJlYWRhYmxlfHwhdGhpcy5vdXRnb2luZy53cml0YWJsZSl0aHJvdyBuZXcgRXJyb3IoXCJjb25uZWN0aW9uIGZhaWxlZDogdGhpcyBjb21wb25lbnQgbm90IGNvbXBhdGlibGVcIik7aWYoIXQuaW5jb21pbmcud3JpdGFibGV8fCF0Lm91dGdvaW5nLnJlYWRhYmxlKXRocm93IG5ldyBFcnJvcihcImNvbm5lY3Rpb24gZmFpbGVkOiBuZXh0IGNvbXBvbmVudCBub3QgY29tcGF0aWJsZVwiKTt0cnl7dGhpcy5pbmNvbWluZy5waXBlKHQuaW5jb21pbmcpLHQub3V0Z29pbmcucGlwZSh0aGlzLm91dGdvaW5nKX1jYXRjaChvKXt0aHJvdyBuZXcgRXJyb3IoYGNvbm5lY3Rpb24gZmFpbGVkOiAke28ubWVzc2FnZX1gKX1sZXQgbj1vPT57dGhpcy5pbmNvbWluZy5lbWl0KFwiZXJyb3JcIixvKX07dC5pbmNvbWluZy5vbihcImVycm9yXCIsbik7bGV0IGk9bz0+e3Qub3V0Z29pbmcuZW1pdChcImVycm9yXCIsbyl9O3JldHVybiB0aGlzLm91dGdvaW5nLm9uKFwiZXJyb3JcIixpKSx0aGlzLm5leHQ9dCx0LnByZXY9dGhpcyx0aGlzLl9pbmNvbWluZ0Vycm9ySGFuZGxlcj1uLHRoaXMuX291dGdvaW5nRXJyb3JIYW5kbGVyPWksdH1kaXNjb25uZWN0KCl7bGV0IHQ9dGhpcy5uZXh0O3JldHVybiB0IT09bnVsbCYmKHRoaXMuaW5jb21pbmcudW5waXBlKHQuaW5jb21pbmcpLHQub3V0Z29pbmcudW5waXBlKHRoaXMub3V0Z29pbmcpLHR5cGVvZiB0aGlzLl9pbmNvbWluZ0Vycm9ySGFuZGxlcjxcInVcIiYmdC5pbmNvbWluZy5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsdGhpcy5faW5jb21pbmdFcnJvckhhbmRsZXIpLHR5cGVvZiB0aGlzLl9vdXRnb2luZ0Vycm9ySGFuZGxlcjxcInVcIiYmdGhpcy5vdXRnb2luZy5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsdGhpcy5fb3V0Z29pbmdFcnJvckhhbmRsZXIpLHRoaXMubmV4dD1udWxsLHQucHJldj1udWxsLGRlbGV0ZSB0aGlzLl9pbmNvbWluZ0Vycm9ySGFuZGxlcixkZWxldGUgdGhpcy5fb3V0Z29pbmdFcnJvckhhbmRsZXIpLHRoaXN9fSxSPWNsYXNzIGV4dGVuZHMgVntjb25zdHJ1Y3Rvcih0PW5ldyBnZS5QYXNzVGhyb3VnaCh7b2JqZWN0TW9kZTohMH0pLG49bmV3IGdlLlBhc3NUaHJvdWdoKHtvYmplY3RNb2RlOiEwfSkpe3N1cGVyKHQsbik7dGhpcy5pbmNvbWluZz10LHRoaXMub3V0Z29pbmc9bn1zdGF0aWMgZnJvbUhhbmRsZXJzKHQsbil7bGV0IGk9dD9mZS5wZWVrZXIodCk6dm9pZCAwLG89bj9mZS5wZWVrZXIobik6dm9pZCAwO3JldHVybiBuZXcgUihpLG8pfX0sUT1jbGFzcyBleHRlbmRzIGlye2NvbnN0cnVjdG9yKHQ9bmV3IGdlLldyaXRhYmxlKHtvYmplY3RNb2RlOiEwfSksbj1uZXcgZ2UuUmVhZGFibGUoe29iamVjdE1vZGU6ITB9KSl7c3VwZXIoKTt0aGlzLmluY29taW5nPXQsdGhpcy5vdXRnb2luZz1uLHRoaXMubmV4dD1udWxsLHRoaXMucHJldj1udWxsfXN0YXRpYyBmcm9tSGFuZGxlcih0KXtsZXQgbj1uZXcgUShmZS5jb25zdW1lcih0KSxmZS5wcm9kdWNlcih2b2lkIDApKTtyZXR1cm4gbi5pbmNvbWluZy5vbihcImZpbmlzaFwiLCgpPT57bi5vdXRnb2luZy5wdXNoKG51bGwpfSksbn1jb25uZWN0KCl7dGhyb3cgbmV3IEVycm9yKFwiY29ubmVjdGlvbiBmYWlsZWQ6IGF0dGVtcHRpbmcgdG8gY29ubmVjdCBhZnRlciBhIHNpbmtcIil9ZGlzY29ubmVjdCgpe3JldHVybiB0aGlzfX07YygpO2MoKTtjKCk7dmFyIGl0PVsxMjgsNjQsMzIsMTYsOCw0LDIsMV07dmFyIFpvPXI9PnJbMF0+Pj42LGVzPXI9PiEhKHJbMF0maXRbMl0pLG9yPXI9PiEhKHJbMF0maXRbM10pLFNlPXI9PnJbMF0mMTUsY2U9cj0+ISEoclsxXSZpdFswXSksTz1yPT5yWzFdJjEyNyx0cz1yPT5yLnJlYWRVSW50MTZCRSgyKSxIPXI9PnIucmVhZFVJbnQzMkJFKDQpLHJzPXI9PnIucmVhZFVJbnQzMkJFKDgpLG5zPShyLGU9MCk9PlNlKHIpPmU/ci5yZWFkVUludDMyQkUoMTIrZSo0KTowLE10PXI9Pm9yKHIpP3IucmVhZFVJbnQxNkJFKDEyK1NlKHIpKjQrMik6MCxpcz1yPT5NdChyKT09PTA/QnVmZmVyLmZyb20oW10pOnIuc2xpY2UoMTIrU2UocikqNCwxMitTZShyKSo0KzQrTXQocikqNCksWj1yPT5vcihyKT9yLnNsaWNlKDEyK1NlKHIpKjQrNCtNdChyKSo0KTpyLnNsaWNlKDEyK1NlKHIpKjQpO2MoKTt2YXIgST0oZD0+KGRbZC5VTktOT1dOPTBdPVwiVU5LTk9XTlwiLGRbZC5SQVc9MV09XCJSQVdcIixkW2QuUlRQPTJdPVwiUlRQXCIsZFtkLlJUQ1A9M109XCJSVENQXCIsZFtkLlJUU1A9NF09XCJSVFNQXCIsZFtkLlNEUD01XT1cIlNEUFwiLGRbZC5FTEVNRU5UQVJZPTZdPVwiRUxFTUVOVEFSWVwiLGRbZC5IMjY0PTddPVwiSDI2NFwiLGRbZC5JU09NPThdPVwiSVNPTVwiLGRbZC5YTUw9OV09XCJYTUxcIixkW2QuSlBFRz0xMF09XCJKUEVHXCIsZCkpKEl8fHt9KTtjKCk7ZnVuY3Rpb24gb3MocixlLHQpe2xldCBuPVooci5kYXRhKSxpPTA7aWYoZSl7bGV0IHM9bi5yZWFkVUludDE2QkUoMCk7aT0yKyhzK3MlOCkvOH1sZXQgbz17dHlwZTo2LGRhdGE6bi5zbGljZShpKSxwYXlsb2FkVHlwZTpPKHIuZGF0YSksdGltZXN0YW1wOkgoci5kYXRhKSxudHBUaW1lc3RhbXA6ci5udHBUaW1lc3RhbXB9O3Qobyl9YygpO3ZhciBzcz1DKE4oKSkseWU9cj0+bmV3IHNzLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm06cn0pO3ZhciBvdD1jbGFzcyBleHRlbmRzIFJ7Y29uc3RydWN0b3IoKXtsZXQgZSx0LG49eWUoZnVuY3Rpb24oaSxvLHMpe2lmKGkudHlwZT09PTUpe2xldCBhO2ZvcihsZXQgdSBvZiBpLnNkcC5tZWRpYSl1LnR5cGU9PT1cImF1ZGlvXCImJnUuZm10cCYmdS5mbXRwLnBhcmFtZXRlcnMmJnUuZm10cC5wYXJhbWV0ZXJzLm1vZGU9PT1cIkFBQy1oYnJcIiYmKGE9dSk7aWYoYSYmYS5ydHBtYXAhPT12b2lkIDApe2U9TnVtYmVyKGEucnRwbWFwLnBheWxvYWRUeXBlKTtsZXQgdT1hLmZtdHAucGFyYW1ldGVycyxmPU51bWJlcih1LnNpemVsZW5ndGgpfHwwLGw9TnVtYmVyKHUuaW5kZXhsZW5ndGgpfHwwLGQ9TnVtYmVyKHUuaW5kZXhkZWx0YWxlbmd0aCl8fDAsaD1OdW1iZXIodS5jdHNkZWx0YWxlbmd0aCl8fDAsbT1OdW1iZXIodS5kdHNkZWx0YWxlbmd0aCl8fDAsYj1OdW1iZXIodS5yYW5kb21hY2Nlc3NpbmRpY2F0aW9uKXx8MCx5PU51bWJlcih1LnN0cmVhbXN0YXRlaW5kaWNhdGlvbil8fDAsdz1OdW1iZXIodS5hdXhpbGlhcnlkYXRhc2l6ZWxlbmd0aCl8fDA7dD1mK01hdGgubWF4KGwsZCkraCttK2IreSt3PjB9cyh2b2lkIDAsaSl9ZWxzZSBpLnR5cGU9PT0yJiZPKGkuZGF0YSk9PT1lPyhvcyhpLHQsdGhpcy5wdXNoLmJpbmQodGhpcykpLHMoKSk6cyh2b2lkIDAsaSl9KTtzdXBlcihuKX19O2MoKTt2YXIgc3I9Y2xhc3MgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKGUpe2lmKGU9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwieW91IG11c3Qgc3VwcGx5IGEgcGF5bG9hZCB0eXBlIHRvIEJhc2ljRGVwYXlDb21wb25lbnRcIik7bGV0IHQ9QnVmZmVyLmFsbG9jKDApLG49eWUoZnVuY3Rpb24oaSxvLHMpe2lmKGkudHlwZT09PTImJk8oaS5kYXRhKT09PWUpe2xldCBhPVooaS5kYXRhKTt0PUJ1ZmZlci5jb25jYXQoW3QsYV0pLGNlKGkuZGF0YSkmJih0Lmxlbmd0aD4wJiZ0aGlzLnB1c2goe2RhdGE6dCx0aW1lc3RhbXA6SChpLmRhdGEpLG50cFRpbWVzdGFtcDppLm50cFRpbWVzdGFtcCxwYXlsb2FkVHlwZTpPKGkuZGF0YSksdHlwZTo2fSksdD1CdWZmZXIuYWxsb2MoMCkpLHMoKX1lbHNlIHModm9pZCAwLGkpfSk7c3VwZXIobil9fTtjKCk7YygpO3ZhciBhcj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuZWxhcHNlZD0wLHRoaXMuc3RhcnRlZD0wLHRoaXMuc3RvcHBlZD0hMH1zdGFydCgpe3RoaXMuc3RvcHBlZCYmKHRoaXMuc3RhcnRlZD13aW5kb3cucGVyZm9ybWFuY2Uubm93KCksdGhpcy5zdG9wcGVkPSExKX1zdG9wKCl7dGhpcy5zdG9wcGVkfHwodGhpcy5lbGFwc2VkPXRoaXMubm93KCksdGhpcy5zdG9wcGVkPSEwKX1yZXNldCgpe3RoaXMuZWxhcHNlZD0wLHRoaXMuc3RhcnRlZD0wLHRoaXMuc3RvcHBlZD0hMH1ub3coKXtyZXR1cm4gdGhpcy5zdG9wcGVkP3RoaXMuZWxhcHNlZDp0aGlzLmVsYXBzZWQrKHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKS10aGlzLnN0YXJ0ZWQpfXBsYXkoKXt0aGlzLnN0YXJ0KCl9cGF1c2UoKXt0aGlzLnN0b3AoKX1nZXQgY3VycmVudFRpbWUoKXtyZXR1cm4gdGhpcy5ub3coKS8xZTN9fTtjKCk7dmFyIFdlPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxuPTEwKXt0aGlzLl9jbG9jaz1lLHRoaXMuX2hhbmRsZXI9dCx0aGlzLl90b2xlcmFuY2U9bix0aGlzLl9uZXh0UnVuPTAsdGhpcy5fbmV4dFBsYXk9MCx0aGlzLl9maWZvPVtdLHRoaXMuX250cFByZXNlbnRhdGlvblRpbWU9MCx0aGlzLl9zdXNwZW5kZWQ9ITF9cmVzZXQoKXtjbGVhclRpbWVvdXQodGhpcy5fbmV4dFJ1biksY2xlYXJUaW1lb3V0KHRoaXMuX25leHRQbGF5KSx0aGlzLl9maWZvPVtdLHRoaXMuX250cFByZXNlbnRhdGlvblRpbWU9MCx0aGlzLl9zdXNwZW5kZWQ9ITF9aW5pdChlKXt0aGlzLl9udHBQcmVzZW50YXRpb25UaW1lPWV9c3VzcGVuZCgpe2NsZWFyVGltZW91dCh0aGlzLl9uZXh0UGxheSksdGhpcy5fc3VzcGVuZGVkPSEwfXJlc3VtZSgpe3RoaXMuX3N1c3BlbmRlZD0hMSx0aGlzLnJ1bih2b2lkIDApfXJ1bihlKXtpZihjbGVhclRpbWVvdXQodGhpcy5fbmV4dFJ1biksdHlwZW9mIHRoaXMuX250cFByZXNlbnRhdGlvblRpbWU+XCJ1XCJ8fCh0eXBlb2YgZTxcInVcIiYmdGhpcy5fZmlmby5wdXNoKGUpLHRoaXMuX3N1c3BlbmRlZCl8fHRoaXMuX2ZpZm8ubGVuZ3RoPT09MClyZXR1cm47bGV0IHQ9MCxuO2Rve2xldCBpPXRoaXMuX2ZpZm8uc2hpZnQoKTtpZihpPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcImludGVybmFsIGVycm9yOiBtZXNzYWdlIHNob3VsZCBuZXZlciBiZSB1bmRlZmluZWRcIik7bj1pO2xldCBvPW4ubnRwVGltZXN0YW1wO2lmKG89PT12b2lkIDApY29udGludWU7dD1vLXRoaXMuX250cFByZXNlbnRhdGlvblRpbWUtdGhpcy5fY2xvY2suY3VycmVudFRpbWUqMWUzLE1hdGguYWJzKHQpPHRoaXMuX3RvbGVyYW5jZSYmdGhpcy5faGFuZGxlciYmdGhpcy5faGFuZGxlcihuKX13aGlsZSh0PHRoaXMuX3RvbGVyYW5jZSYmdGhpcy5fZmlmby5sZW5ndGg+MCk7dDwtdGhpcy5fdG9sZXJhbmNlPyhjbGVhclRpbWVvdXQodGhpcy5fbmV4dFBsYXkpLHRoaXMuX2Nsb2NrLnBhdXNlKCksdGhpcy5fbmV4dFBsYXk9d2luZG93LnNldFRpbWVvdXQoKCk9PnRoaXMuX2Nsb2NrLnBsYXkoKSwtdCkpOnQ+dGhpcy5fdG9sZXJhbmNlJiYodGhpcy5fZmlmby51bnNoaWZ0KG4pLHRoaXMuX25leHRSdW49d2luZG93LnNldFRpbWVvdXQoKCk9PnRoaXMucnVuKHZvaWQgMCksdCkpfX07dmFyIHVyPUMoTigpKSxhYz1yPT57ci5iaXRyYXRlPTAsci5mcmFtZXJhdGU9MCxyLnJlbmRlcmVkRnJhbWVzPTB9LHVjPXI9PntsZXQgZT0wLHQ9MCxuPTA7cmV0dXJuKGkse2J5dGVMZW5ndGg6byxkdXJhdGlvbjpzfSk9PntpZihlKz1vLHQrPXMsbisrLHQ+PXIpe2xldCBhPTgqZSx1PW4sZj10L3I7aS5iaXRyYXRlPWEvZixpLmZyYW1lcmF0ZT11L2YsZT0wLHQ9MCxuPTB9fX0sc3Q9Y2xhc3MgZXh0ZW5kcyBRe2NvbnN0cnVjdG9yKHQpe2lmKHQ9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwiY2FudmFzIGVsZW1lbnQgYXJndW1lbnQgbWlzc2luZ1wiKTtsZXQgbj0wLGk9MCxvPTAscz17Yml0cmF0ZTowLGZyYW1lcmF0ZTowLHJlbmRlcmVkRnJhbWVzOjB9LGEsdT1udWxsO3dpbmRvdy5jcmVhdGVJbWFnZUJpdG1hcCE9PXZvaWQgMCYmKHU9dC5nZXRDb250ZXh0KFwiYml0bWFwcmVuZGVyZXJcIikpLHU9PT1udWxsJiYodT10LmdldENvbnRleHQoXCIyZFwiKSk7bGV0IGY7aWYodT09PW51bGwpZj0oKT0+e307ZWxzZSBpZihcInRyYW5zZmVyRnJvbUltYWdlQml0bWFwXCJpbiB1KXtsZXQgXz11O2Y9KHtibG9iOnZ9KT0+e3MucmVuZGVyZWRGcmFtZXMrKyx3aW5kb3cuY3JlYXRlSW1hZ2VCaXRtYXAodikudGhlbihxPT57Xy50cmFuc2ZlckZyb21JbWFnZUJpdG1hcChxKX0pLmNhdGNoKCgpPT57fSl9fWVsc2V7bGV0IF89dSx2PW5ldyBJbWFnZTt2Lm9ubG9hZD0oKT0+e18uZHJhd0ltYWdlKHYsMCwwKX0sZj0oe2Jsb2I6cX0pPT57cy5yZW5kZXJlZEZyYW1lcysrO2xldCBBPXdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKHEpO3Yuc3JjPUF9fWxldCBsPW5ldyBhcixkPW5ldyBXZShsLGYpLGg9MCxtPSgpPT57dGhpcy5vbkNhbnBsYXkmJnRoaXMub25DYW5wbGF5KCl9LGI9Xz0+e3RoaXMub25TeW5jJiZ0aGlzLm9uU3luYyhfKX0seT1uZXcgdXIuV3JpdGFibGUoe29iamVjdE1vZGU6ITAsd3JpdGU6KF8sdixxKT0+e2lmKF8udHlwZT09PTUpe2wucmVzZXQoKSxkLnJlc2V0KCksbj0wO2xldCBBPV8uc2RwLm1lZGlhLmZpbmQoaj0+ai50eXBlPT09XCJ2aWRlb1wiJiZqLnJ0cG1hcCE9PXZvaWQgMCYmai5ydHBtYXAuZW5jb2RpbmdOYW1lPT09XCJKUEVHXCIpO0EhPT12b2lkIDAmJkEucnRwbWFwIT09dm9pZCAwJiYobz1BLnJ0cG1hcC5jbG9ja3JhdGUsYWMocyksYT11YyhvKSkscSgpfWVsc2UgaWYoXy50eXBlPT09MTApe2xldHt0aW1lc3RhbXA6QSxudHBUaW1lc3RhbXA6an09XztpZighbil7bj1BLGk9QTtsZXR7d2lkdGg6SWUsaGVpZ2h0OkFlfT1fLmZyYW1lc2l6ZTt0LndpZHRoPUllLHQuaGVpZ2h0PUFlLGQuaW5pdCgwKX1sZXQgWT0xZTMqKEEtbikvbyxHZT1uZXcgd2luZG93LkJsb2IoW18uZGF0YV0se3R5cGU6XCJpbWFnZS9qcGVnXCJ9KTshaCYmaiYmKGg9ai1ZLGIoaCkpLGQucnVuKHtudHBUaW1lc3RhbXA6WSxibG9iOkdlfSksQT09PW4mJm0oKSxhKHMse2J5dGVMZW5ndGg6Xy5kYXRhLmxlbmd0aCxkdXJhdGlvbjpBLWl9KSxpPUEscSgpfWVsc2UgcSgpfX0pLHc9bmV3IHVyLlJlYWRhYmxlKHtvYmplY3RNb2RlOiEwLHJlYWQ6ZnVuY3Rpb24oKXt9fSk7dy5vbihcImVycm9yXCIsKCk9Pntjb25zb2xlLndhcm4oXCJvdXRnb2luZyBzdHJlYW0gYnJva2Ugc29tZXdoZXJlXCIpfSk7c3VwZXIoeSx3KTt0aGlzLl9jbG9jaz1sLHRoaXMuX3NjaGVkdWxlcj1kLHRoaXMuX2luZm89cyx0aGlzLm9uQ2FucGxheT12b2lkIDAsdGhpcy5vblN5bmM9dm9pZCAwfWdldCBjdXJyZW50VGltZSgpe3JldHVybiB0aGlzLl9jbG9jay5jdXJyZW50VGltZX1wYXVzZSgpe3RoaXMuX3NjaGVkdWxlci5zdXNwZW5kKCksdGhpcy5fY2xvY2sucGF1c2UoKX1wbGF5KCl7dGhpcy5fY2xvY2sucGxheSgpLHRoaXMuX3NjaGVkdWxlci5yZXN1bWUoKX1nZXQgYml0cmF0ZSgpe3JldHVybiB0aGlzLl9pbmZvLmJpdHJhdGV9Z2V0IGZyYW1lcmF0ZSgpe3JldHVybiB0aGlzLl9pbmZvLmZyYW1lcmF0ZX19O2MoKTt2YXIgZHM9QyhOKCkpO2MoKTt2YXIgbHM9QyhsZSgpKTt2YXIgd2M9KDAsbHMuZGVmYXVsdCkoXCJtc2w6aDI2NGRlcGF5XCIpLGxyPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5fYnVmZmVyPUJ1ZmZlci5hbGxvYygwKX1wYXJzZShlKXtsZXQgdD1aKGUuZGF0YSksbj10WzBdJjMxO2lmKG49PT0yOCl7bGV0IGk9dFswXSxvPXRbMV0scz0hIShvPj43KSxhPW8mMzEsdT1pJjIyNHxhLGY9byY2NDtpZihzKXJldHVybiB0aGlzLl9idWZmZXI9QnVmZmVyLmNvbmNhdChbQnVmZmVyLmZyb20oWzAsMCwwLDAsdV0pLHQuc2xpY2UoMildKSxudWxsO2lmKGYpe2xldCBsPUJ1ZmZlci5jb25jYXQoW3RoaXMuX2J1ZmZlcix0LnNsaWNlKDIpXSk7bC53cml0ZVVJbnQzMkJFKGwubGVuZ3RoLTQsMCk7bGV0IGQ9e2RhdGE6bCx0eXBlOjcsdGltZXN0YW1wOkgoZS5kYXRhKSxudHBUaW1lc3RhbXA6ZS5udHBUaW1lc3RhbXAscGF5bG9hZFR5cGU6TyhlLmRhdGEpLG5hbFR5cGU6YX07cmV0dXJuIHRoaXMuX2J1ZmZlcj1CdWZmZXIuYWxsb2MoMCksZH1lbHNlIHJldHVybiB0aGlzLl9idWZmZXI9QnVmZmVyLmNvbmNhdChbdGhpcy5fYnVmZmVyLHQuc2xpY2UoMildKSxudWxsfWVsc2UgaWYoKG49PT0xfHxuPT09NSkmJnRoaXMuX2J1ZmZlci5sZW5ndGg9PT0wKXtsZXQgaT1CdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbShbMCwwLDAsMF0pLHRdKTtpLndyaXRlVUludDMyQkUoaS5sZW5ndGgtNCwwKTtsZXQgbz17ZGF0YTppLHR5cGU6Nyx0aW1lc3RhbXA6SChlLmRhdGEpLG50cFRpbWVzdGFtcDplLm50cFRpbWVzdGFtcCxwYXlsb2FkVHlwZTpPKGUuZGF0YSksbmFsVHlwZTpufTtyZXR1cm4gdGhpcy5fYnVmZmVyPUJ1ZmZlci5hbGxvYygwKSxvfWVsc2UgcmV0dXJuIHdjKGBIMjY0ZGVwYXlDb21wb25lbnQgY2FuIG9ubHkgZXh0cmFjdCB0eXBlcyAxLDUgYW5kIDI4LCBnb3QgJHtufWApLHRoaXMuX2J1ZmZlcj1CdWZmZXIuYWxsb2MoMCksbnVsbH19O3ZhciBjdD1jbGFzcyBleHRlbmRzIFJ7Y29uc3RydWN0b3IoKXtsZXQgZSx0PSExLG49W10saT1uZXcgbHIsbz1uZXcgZHMuVHJhbnNmb3JtKHtvYmplY3RNb2RlOiEwLHRyYW5zZm9ybTpmdW5jdGlvbihzLGEsdSl7aWYocy50eXBlPT09NSl7bGV0IGY9cy5zZHAubWVkaWEuZmluZChsPT5sLnR5cGU9PT1cInZpZGVvXCImJmwucnRwbWFwIT09dm9pZCAwJiZsLnJ0cG1hcC5lbmNvZGluZ05hbWU9PT1cIkgyNjRcIik7ZiE9PXZvaWQgMCYmZi5ydHBtYXAhPT12b2lkIDAmJihlPWYucnRwbWFwLnBheWxvYWRUeXBlKSx1KHZvaWQgMCxzKX1lbHNlIGlmKHMudHlwZT09PTImJk8ocy5kYXRhKT09PWUpe2xldCBmPWNlKHMuZGF0YSksbD1pLnBhcnNlKHMpO2lmKGw9PT1udWxsfHwhdCYmbC5uYWxUeXBlIT09NSl7dSgpO3JldHVybn10PSEwLG4ucHVzaChsLmRhdGEpLGYmJih0aGlzLnB1c2goey4uLmwsZGF0YTpuLmxlbmd0aD09PTE/blswXTpCdWZmZXIuY29uY2F0KG4pfSksbj1bXSksdSgpfWVsc2UgdSh2b2lkIDAscyl9fSk7c3VwZXIobyl9fTtjKCk7dmFyIHBzPUMobGUoKSk7dmFyIGhzPUMoTigpKTt2YXIgTm49KDAscHMuZGVmYXVsdCkoXCJtc2w6aHR0cC1zb3VyY2VcIiksZHI9Y2xhc3MgZXh0ZW5kcyBWe2NvbnN0cnVjdG9yKHQpe2xldHt1cmk6bixvcHRpb25zOml9PXQsbz1uZXcgaHMuUmVhZGFibGUoe29iamVjdE1vZGU6ITAscmVhZDpmdW5jdGlvbigpe319KTtvLm9uKFwiZXJyb3JcIixzPT57Y29uc29sZS53YXJuKFwiY2xvc2luZyBzb2NrZXQgZHVlIHRvIGluY29taW5nIGVycm9yXCIscyksdGhpcy5fcmVhZGVyJiZ0aGlzLl9yZWFkZXIuY2FuY2VsKCl9KTtzdXBlcihvKTtvLl9yZWFkPSgpPT57dGhpcy5fcHVsbCgpfSx0aGlzLnVyaT1uLHRoaXMub3B0aW9ucz1pLHRoaXMuX2FsbERvbmU9ITF9cGxheSgpe2lmKHRoaXMudXJpPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcImNhbm5vdCBzdGFydCBwbGF5aW5nIHdoZW4gdGhlcmUgaXMgbm8gVVJJXCIpO3RoaXMuX2Fib3J0Q29udHJvbGxlcj1uZXcgQWJvcnRDb250cm9sbGVyLHRoaXMubGVuZ3RoPTAsZmV0Y2godGhpcy51cmkse2NyZWRlbnRpYWxzOlwiaW5jbHVkZVwiLHNpZ25hbDp0aGlzLl9hYm9ydENvbnRyb2xsZXIuc2lnbmFsLC4uLnRoaXMub3B0aW9uc30pLnRoZW4odD0+e2lmKHQuYm9keT09PW51bGwpdGhyb3cgbmV3IEVycm9yKFwiZW1wdHkgcmVzcG9uc2UgYm9keVwiKTt0aGlzLm9uSGVhZGVycyYmdGhpcy5vbkhlYWRlcnModC5oZWFkZXJzKSx0aGlzLl9yZWFkZXI9dC5ib2R5LmdldFJlYWRlcigpLHRoaXMuX3B1bGwoKX0pLmNhdGNoKHQ9Pntjb25zb2xlLmVycm9yKFwiaHR0cC1zb3VyY2U6IGZldGNoIGZhaWxlZDogXCIsdCl9KX1hYm9ydCgpe3RoaXMuX3JlYWRlciYmdGhpcy5fcmVhZGVyLmNhbmNlbCgpLmNhdGNoKHQ9Pntjb25zb2xlLmxvZyhcImh0dHAtc291cmNlOiBjYW5jZWwgcmVhZGVyIGZhaWxlZDogXCIsdCl9KSx0aGlzLl9hYm9ydENvbnRyb2xsZXImJnRoaXMuX2Fib3J0Q29udHJvbGxlci5hYm9ydCgpfV9pc0Nsb3NlZCgpe3JldHVybiB0aGlzLl9hbGxEb25lfV9jbG9zZSgpe3RoaXMuX3JlYWRlcj12b2lkIDAsdGhpcy5fYWxsRG9uZT0hMCx0aGlzLmluY29taW5nLnB1c2gobnVsbCksdGhpcy5vblNlcnZlckNsb3NlPy4oKX1fcHVsbCgpe3RoaXMuX3JlYWRlciE9PXZvaWQgMCYmdGhpcy5fcmVhZGVyLnJlYWQoKS50aGVuKCh7ZG9uZTp0LHZhbHVlOm59KT0+e2lmKHQpe3RoaXMuX2lzQ2xvc2VkKCl8fChObihcImZldGNoIGNvbXBsZXRlZCwgdG90YWwgZG93bmxvYWRlZDogXCIsdGhpcy5sZW5ndGgsXCIgYnl0ZXNcIiksdGhpcy5fY2xvc2UoKSk7cmV0dXJufWlmKG49PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwiZXhwZWN0ZWQgdmFsdWUgdG8gYmUgZGVmaW5lZFwiKTtpZih0aGlzLmxlbmd0aD09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJleHBlY3RlZCBsZW5ndGggdG8gYmUgZGVmaW5lZFwiKTt0aGlzLmxlbmd0aCs9bi5sZW5ndGg7bGV0IGk9QnVmZmVyLmZyb20obik7dGhpcy5pbmNvbWluZy5wdXNoKHtkYXRhOmksdHlwZToxfSk/dGhpcy5fcHVsbCgpOk5uKFwiZG93bnN0cmVhbSBiYWNrIHByZXNzdXJlOiBwYXVzaW5nIHJlYWRcIil9KS5jYXRjaCh0PT57Tm4oXCJodHRwLXNvdXJjZTogcmVhZCBmYWlsZWQ6IFwiLHQpLHRoaXMuX2lzQ2xvc2VkKCl8fHRoaXMuX2Nsb3NlKCl9KX19O2MoKTt2YXIgSG49QyhOKCkpLG1zPShyLGUpPT57bGV0IHQ9RGF0ZS5ub3coKSxuPWk9PntsZXQgbz1EYXRlLm5vdygpO2NvbnNvbGUubG9nKGAke3J9OiArJHtvLXR9bXNgLGkpLHQ9b307cmV0dXJuIGU9PT12b2lkIDA/bjppPT5pLnR5cGU9PT1lJiZuKGkpfSxwcj1jbGFzcyBleHRlbmRzIFJ7Y29uc3RydWN0b3IoZSl7bGV0IHQ9bXMoXCJpbmNvbWluZ1wiLGUpLG49bmV3IEhuLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm06ZnVuY3Rpb24ocyxhLHUpe3QocyksdSh2b2lkIDAscyl9fSksaT1tcyhcIm91dGdvaW5nXCIsZSksbz1uZXcgSG4uVHJhbnNmb3JtKHtvYmplY3RNb2RlOiEwLHRyYW5zZm9ybTpmdW5jdGlvbihzLGEsdSl7aShzKSx1KHZvaWQgMCxzKX19KTtzdXBlcihuLG8pfX07YygpO2MoKTtjKCk7ZnVuY3Rpb24gU3MoKXtyZXR1cm4gQnVmZmVyLmZyb20oWzI1NSwyMTZdKX1mdW5jdGlvbiBScyhyLGUpe2xldCB0PXImMT8xMjg6NjQsbj1yJjI/MTI4OjY0O2lmKGUubGVuZ3RoIT09dCtuKXRocm93IG5ldyBFcnJvcihcImludmFsaWQgcXVhbnRpemF0aW9uIHRhYmxlXCIpO2xldCBpPUJ1ZmZlci5mcm9tKFsyNTUsMjE5LDAsdCszLDBdKSxvPUJ1ZmZlci5mcm9tKFsyNTUsMjE5LDAsbiszLDFdKTtyZXR1cm4gQnVmZmVyLmNvbmNhdChbaSxlLnNsaWNlKDAsdCksbyxlLnNsaWNlKHQpXSl9ZnVuY3Rpb24gVHMocixlLHQpe3JldHVybiBCdWZmZXIuZnJvbShbMjU1LDE5MiwwLDE3LDgsZT4+OCxlLHI+PjgsciwzLDAsdD09PTA/MzM6MzQsMCwxLDE3LDEsMiwxNywxXSl9dmFyIGdzPVswLDEsNSwxLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwXSx5cz1bMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMV0sYnM9WzAsMiwxLDMsMywyLDQsMyw1LDUsNCw0LDAsMCwxLDEyNV0seHM9WzEsMiwzLDAsNCwxNyw1LDE4LDMzLDQ5LDY1LDYsMTksODEsOTcsNywzNCwxMTMsMjAsNTAsMTI5LDE0NSwxNjEsOCwzNSw2NiwxNzcsMTkzLDIxLDgyLDIwOSwyNDAsMzYsNTEsOTgsMTE0LDEzMCw5LDEwLDIyLDIzLDI0LDI1LDI2LDM3LDM4LDM5LDQwLDQxLDQyLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDk5LDEwMCwxMDEsMTAyLDEwMywxMDQsMTA1LDEwNiwxMTUsMTE2LDExNywxMTgsMTE5LDEyMCwxMjEsMTIyLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLDE1MywxNTQsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSwxNzAsMTc4LDE3OSwxODAsMTgxLDE4MiwxODMsMTg0LDE4NSwxODYsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MF0sX3M9WzAsMywxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwwLDBdLHdzPVswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExXSx2cz1bMCwyLDEsMiw0LDQsMyw0LDcsNSw0LDQsMCwxLDIsMTE5XSxFcz1bMCwxLDIsMywxNyw0LDUsMzMsNDksNiwxOCw2NSw4MSw3LDk3LDExMywxOSwzNCw1MCwxMjksOCwyMCw2NiwxNDUsMTYxLDE3NywxOTMsOSwzNSw1MSw4MiwyNDAsMjEsOTgsMTE0LDIwOSwxMCwyMiwzNiw1MiwyMjUsMzcsMjQxLDIzLDI0LDI1LDI2LDM4LDM5LDQwLDQxLDQyLDUzLDU0LDU1LDU2LDU3LDU4LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDk5LDEwMCwxMDEsMTAyLDEwMywxMDQsMTA1LDEwNiwxMTUsMTE2LDExNywxMTgsMTE5LDEyMCwxMjEsMTIyLDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE2MiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksMTcwLDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDI0MiwyNDMsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDksMjUwXTtmdW5jdGlvbiBDcygpe2xldCByPVtbMjU1LDE5NiwwLDMrZ3MubGVuZ3RoK3lzLmxlbmd0aCwwXSxncyx5c10sZT1bWzI1NSwxOTYsMCwzK2JzLmxlbmd0aCt4cy5sZW5ndGgsMTw8NHwwXSxicyx4c10sdD1bWzI1NSwxOTYsMCwzK19zLmxlbmd0aCt3cy5sZW5ndGgsMDw8NHwxXSxfcyx3c10sbj1bWzI1NSwxOTYsMCwzK3ZzLmxlbmd0aCtFcy5sZW5ndGgsMTw8NHwxXSx2cyxFc107cmV0dXJuIEJ1ZmZlci5jb25jYXQoWy4uLnIubWFwKEJ1ZmZlci5mcm9tKSwuLi5lLm1hcChCdWZmZXIuZnJvbSksLi4udC5tYXAoQnVmZmVyLmZyb20pLC4uLm4ubWFwKEJ1ZmZlci5mcm9tKV0pfWZ1bmN0aW9uIEJzKCl7cmV0dXJuIEJ1ZmZlci5mcm9tKFsyNTUsMjE4LDAsMTIsMywwLDAsMSwxNywyLDE3LDAsNjMsMF0pfWZ1bmN0aW9uIE1zKHIpe3JldHVybiBCdWZmZXIuZnJvbShbMjU1LDIyMSwwLDQscj4+OCxyJjI1NV0pfWMoKTtjKCk7ZnVuY3Rpb24gaHIocixlLHQpe3JldHVybiByPnQ/dDpyPGU/ZTpyfXZhciBFYz1bMTYsMTEsMTIsMTQsMTIsMTAsMTYsMTQsMTMsMTQsMTgsMTcsMTYsMTksMjQsNDAsMjYsMjQsMjIsMjIsMjQsNDksMzUsMzcsMjksNDAsNTgsNTEsNjEsNjAsNTcsNTEsNTYsNTUsNjQsNzIsOTIsNzgsNjQsNjgsODcsNjksNTUsNTYsODAsMTA5LDgxLDg3LDk1LDk4LDEwMywxMDQsMTAzLDYyLDc3LDExMywxMjEsMTEyLDEwMCwxMjAsOTIsMTAxLDEwMyw5OV0sU2M9WzE3LDE4LDE4LDI0LDIxLDI0LDQ3LDI2LDI2LDQ3LDk5LDY2LDU2LDY2LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5XTtmdW5jdGlvbiBMcyhyKXtsZXQgZT1ocihyLDEsOTkpLHQ9QnVmZmVyLmFsbG9jKDEyOCksbj1yPDUwP01hdGguZmxvb3IoNWUzL2UpOjIwMC1lKjI7Zm9yKGxldCBpPTA7aTw2NDtpKyspe2xldCBvPU1hdGguZmxvb3IoKEVjW2ldKm4rNTApLzEwMCkscz1NYXRoLmZsb29yKChTY1tpXSpuKzUwKS8xMDApO3Qud3JpdGVVSW50OChocihvLDEsMjU1KSxpKSx0LndyaXRlVUludDgoaHIocywxLDI1NSksaSs2NCl9cmV0dXJuIHR9ZnVuY3Rpb24gcW4ocj0wLGU9MCl7bGV0IHQ9U3MoKSxuPUNzKCksaT1CcygpO3JldHVybiBmdW5jdGlvbihzKXtsZXQgYSx1PVtdO2ZvcihsZXQgXyBvZiBzKXtsZXQgdj1aKF8pLHE9di5yZWFkVUludDgoMCksQT12LnJlYWRVSW50OCgxKTw8MTZ8di5yZWFkVUludDgoMik8PDh8di5yZWFkVUludDgoMyksaj12LnJlYWRVSW50OCg0KSxZPXYucmVhZFVJbnQ4KDUpLEdlPXYucmVhZFVJbnQ4KDYpKjh8fHIsSWU9di5yZWFkVUludDgoNykqOHx8ZTt2PXYuc2xpY2UoOCk7bGV0IEFlPTA7aWYoaj49NjQmJmo8PTEyNyYmKEFlPXYucmVhZFVJbnQxNkJFKDApLHY9di5zbGljZSg0KSksWT49MTI4JiZBPT09MCl7bGV0IG9pPXYucmVhZFVJbnQ4KDEpLEF0PXYucmVhZFVJbnQxNkJFKDIpLHVhPXYuc2xpY2UoNCw0K0F0KTthPXt0eXBlU3BlY2lmaWM6cSx0eXBlOmosd2lkdGg6R2UsaGVpZ2h0OkllLERSSTpBZSxwcmVjaXNpb246b2kscVRhYmxlOnVhfSx2PXYuc2xpY2UoNCtBdCl9ZWxzZSBpZihZPDEyOCYmQT09PTApe2xldCBBdD1McyhZKTthPXt0eXBlU3BlY2lmaWM6cSx0eXBlOmosd2lkdGg6R2UsaGVpZ2h0OkllLERSSTpBZSxwcmVjaXNpb246MCxxVGFibGU6QXR9fXUucHVzaCh2KX1pZihhPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcIm5vIHF1YW50aXphdGlvbiBoZWFkZXIgcHJlc2VudFwiKTtsZXR7cHJlY2lzaW9uOmYscVRhYmxlOmwsdHlwZTpkLHdpZHRoOmgsaGVpZ2h0Om19PWEsYj1ScyhmLGwpLHk9YS5EUkk9PT0wP0J1ZmZlci5hbGxvYygwKTpNcyhhLkRSSSksdz1UcyhoLG0sZCk7cmV0dXJue3NpemU6e3dpZHRoOmgsaGVpZ2h0Om19LGRhdGE6QnVmZmVyLmNvbmNhdChbdCxiLHksdyxuLGksLi4udV0pfX19dmFyIElzPUMoTigpKTt2YXIgbHQ9Y2xhc3MgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKCl7bGV0IGUsdD1bXSxuLGk9bmV3IElzLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm06ZnVuY3Rpb24obyxzLGEpe2lmKG8udHlwZT09PTUpe2xldCB1PW8uc2RwLm1lZGlhLmZpbmQoZj0+Zi50eXBlPT09XCJ2aWRlb1wiJiZmLnJ0cG1hcCE9PXZvaWQgMCYmZi5ydHBtYXAuZW5jb2RpbmdOYW1lPT09XCJKUEVHXCIpO2lmKHUhPT12b2lkIDAmJnUucnRwbWFwIT09dm9pZCAwKXtlPU51bWJlcih1LnJ0cG1hcC5wYXlsb2FkVHlwZSk7bGV0IGY9dS5mcmFtZXNpemU7aWYoZiE9PXZvaWQgMCl7bGV0W2wsZF09ZjtuPXFuKGwsZCl9ZWxzZSBuPXFuKCl9YSh2b2lkIDAsbyl9ZWxzZSBpZihvLnR5cGU9PT0yJiZPKG8uZGF0YSk9PT1lKXtpZih0LnB1c2goby5kYXRhKSxjZShvLmRhdGEpJiZ0Lmxlbmd0aD4wKXtsZXQgdT1uKHQpO3RoaXMucHVzaCh7dGltZXN0YW1wOkgoby5kYXRhKSxudHBUaW1lc3RhbXA6by5udHBUaW1lc3RhbXAscGF5bG9hZFR5cGU6TyhvLmRhdGEpLGRhdGE6dS5kYXRhLGZyYW1lc2l6ZTp1LnNpemUsdHlwZToxMH0pLHQ9W119YSgpfWVsc2UgYSh2b2lkIDAsbyl9fSk7c3VwZXIoaSl9fTtjKCk7dmFyIGpuPUMobGUoKSk7dmFyIEFzPUMoTigpKTt2YXIgUmM9MjI1ZTYsbXI9Y2xhc3MgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKHQ9UmMpe2xldCBuPW5ldyBBcy5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtOihpLG8scyk9Pnt0aGlzLl9hY3RpdmUmJmkudHlwZT09PTgmJmkudHJhY2tzIT09dm9pZCAwJiYodGhpcy5fY2FwdHVyZT0hMCksdGhpcy5fY2FwdHVyZSYmaS50eXBlPT09OCYmKHRoaXMuX2J1ZmZlck9mZnNldDx0aGlzLl9idWZmZXIuYnl0ZUxlbmd0aC1pLmRhdGEuYnl0ZUxlbmd0aD8oaS5kYXRhLmNvcHkodGhpcy5fYnVmZmVyLHRoaXMuX2J1ZmZlck9mZnNldCksdGhpcy5fYnVmZmVyT2Zmc2V0Kz1pLmRhdGEuYnl0ZUxlbmd0aCk6dGhpcy5zdG9wKCkpLHModm9pZCAwLGkpfX0pO24ub24oXCJmaW5pc2hcIiwoKT0+e3RoaXMuc3RvcCgpfSk7c3VwZXIobik7dGhpcy5fYnVmZmVyPUJ1ZmZlci5hbGxvY1Vuc2FmZSgwKSx0aGlzLl9idWZmZXJTaXplPXQsdGhpcy5fYnVmZmVyT2Zmc2V0PTAsdGhpcy5fYWN0aXZlPSExLHRoaXMuX2NhcHR1cmU9ITEsdGhpcy5fY2FwdHVyZUNhbGxiYWNrPSgpPT57fX1zdGFydCh0KXt0aGlzLl9hY3RpdmV8fCgoMCxqbi5kZWZhdWx0KShcIm1zbDpjYXB0dXJlOnN0YXJ0XCIpKHQpLHRoaXMuX2NhcHR1cmVDYWxsYmFjaz10LHRoaXMuX2J1ZmZlcj1CdWZmZXIuYWxsb2NVbnNhZmUodGhpcy5fYnVmZmVyU2l6ZSksdGhpcy5fYnVmZmVyT2Zmc2V0PTAsdGhpcy5fYWN0aXZlPSEwKX1zdG9wKCl7aWYodGhpcy5fYWN0aXZlKXsoMCxqbi5kZWZhdWx0KShcIm1zbDpjYXB0dXJlOnN0b3BcIikoYGNhcHR1cmVkIGJ5dGVzOiAke3RoaXMuX2J1ZmZlck9mZnNldH1gKTt0cnl7dGhpcy5fY2FwdHVyZUNhbGxiYWNrKHRoaXMuX2J1ZmZlci5zbGljZSgwLHRoaXMuX2J1ZmZlck9mZnNldCkpfWNhdGNoKHQpe2NvbnNvbGUuZXJyb3IodCl9dGhpcy5fYnVmZmVyPUJ1ZmZlci5hbGxvY1Vuc2FmZSgwKSx0aGlzLl9idWZmZXJPZmZzZXQ9MCx0aGlzLl9hY3RpdmU9ITEsdGhpcy5fY2FwdHVyZT0hMX19fTtjKCk7dmFyIFluPUMobGUoKSk7YygpO3ZhciBXbj1NYXRoLnBvdygyLDMyKSwkPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuYnl0ZUxlbmd0aD1lfX0sdGU9Y2xhc3MgZXh0ZW5kcyAke2NvbnN0cnVjdG9yKHQ9MCl7c3VwZXIodCk7dGhpcy5jb3B5PSh0LG4pPT57dC5maWxsKDAsbixuK3RoaXMuYnl0ZUxlbmd0aCl9fWxvYWQoKXt9fSxSZT1jbGFzcyBleHRlbmRzICR7Y29uc3RydWN0b3IodCl7c3VwZXIodC5sZW5ndGgpO3RoaXMuY29weT0odCxuKT0+e2ZvcihsZXQgaT0wO2k8dGhpcy5ieXRlTGVuZ3RoO2krPTEpdFtuK2ldPXRoaXMudmFsdWUuY2hhckNvZGVBdChpKX07dGhpcy5sb2FkPSh0LG4pPT57dGhpcy52YWx1ZT10LnNsaWNlKG4sbit0aGlzLmJ5dGVMZW5ndGgpLnRvU3RyaW5nKFwiYXNjaWlcIil9O3RoaXMudmFsdWU9dH19LGs9Y2xhc3MgZXh0ZW5kcyAke2NvbnN0cnVjdG9yKHQ9MCl7c3VwZXIoMSk7dGhpcy5jb3B5PSh0LG4pPT57dC53cml0ZVVJbnQ4KHRoaXMudmFsdWUsbil9O3RoaXMubG9hZD0odCxuKT0+e3RoaXMudmFsdWU9dC5yZWFkVUludDgobil9O3RoaXMudmFsdWU9dH19LEx0PWNsYXNzIGV4dGVuZHMgJHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0Lmxlbmd0aCk7dGhpcy5jb3B5PSh0LG4pPT57Zm9yKGxldCBpPTA7aTx0aGlzLnZhbHVlLmxlbmd0aDsrK2kpdC53cml0ZVVJbnQ4KHRoaXMudmFsdWVbaV0sbitpKX07dGhpcy5sb2FkPSh0LG4pPT57Zm9yKGxldCBpPTA7aTx0aGlzLnZhbHVlLmxlbmd0aDsrK2kpdGhpcy52YWx1ZVtpXT10LnJlYWRVSW50OChuK2kpfTt0aGlzLnZhbHVlPXR9fSxMPWNsYXNzIGV4dGVuZHMgJHtjb25zdHJ1Y3Rvcih0PTApe3N1cGVyKDIpO3RoaXMuY29weT0odCxuKT0+e3Qud3JpdGVVSW50MTZCRSh0aGlzLnZhbHVlLG4pfTt0aGlzLmxvYWQ9KHQsbik9Pnt0aGlzLnZhbHVlPXQucmVhZFVJbnQxNkJFKG4pfTt0aGlzLnZhbHVlPXR9fSwkbj1jbGFzcyBleHRlbmRzICR7Y29uc3RydWN0b3IodD0wKXtzdXBlcigzKTt0aGlzLmNvcHk9KHQsbik9Pnt0LndyaXRlVUludDgodGhpcy52YWx1ZT4+MTYmMjU1LG4pLHQud3JpdGVVSW50OCh0aGlzLnZhbHVlPj44JjI1NSxuKzEpLHQud3JpdGVVSW50OCh0aGlzLnZhbHVlJjI1NSxuKzIpfTt0aGlzLmxvYWQ9KHQsbik9Pnt0aGlzLnZhbHVlPXQucmVhZFVJbnQ4KG4pPDwxNit0LnJlYWRVSW50OChuKzEpPDw4K3QucmVhZFVJbnQ4KG4rMil9O3RoaXMudmFsdWU9dH19LEduPWNsYXNzIGV4dGVuZHMgJHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0Lmxlbmd0aCoyKTt0aGlzLmNvcHk9KHQsbik9Pntmb3IobGV0IGk9MDtpPHRoaXMudmFsdWUubGVuZ3RoOysraSl0LndyaXRlVUludDE2QkUodGhpcy52YWx1ZVtpXSxuKzIqaSl9O3RoaXMubG9hZD0odCxuKT0+e2ZvcihsZXQgaT0wO2k8dGhpcy52YWx1ZS5sZW5ndGg7KytpKXRoaXMudmFsdWVbaV09dC5yZWFkVUludDE2QkUobisyKmkpfTt0aGlzLnZhbHVlPXR9fSxnPWNsYXNzIGV4dGVuZHMgJHtjb25zdHJ1Y3Rvcih0PTApe3N1cGVyKDQpO3RoaXMuY29weT0odCxuKT0+e3Qud3JpdGVVSW50MzJCRSh0aGlzLnZhbHVlLG4pfTt0aGlzLmxvYWQ9KHQsbik9Pnt0aGlzLnZhbHVlPXQucmVhZFVJbnQzMkJFKG4pfTt0aGlzLnZhbHVlPXR9fSxkdD1jbGFzcyBleHRlbmRzICR7Y29uc3RydWN0b3IodCl7c3VwZXIodC5sZW5ndGgqNCk7dGhpcy5jb3B5PSh0LG4pPT57Zm9yKGxldCBpPTA7aTx0aGlzLnZhbHVlLmxlbmd0aDsrK2kpdC53cml0ZVVJbnQzMkJFKHRoaXMudmFsdWVbaV0sbis0KmkpfTt0aGlzLmxvYWQ9KHQsbik9Pntmb3IobGV0IGk9MDtpPHRoaXMudmFsdWUubGVuZ3RoOysraSl0aGlzLnZhbHVlW2ldPXQucmVhZFVJbnQzMkJFKG4rNCppKX07dGhpcy52YWx1ZT10fX0sVm49Y2xhc3MgZXh0ZW5kcyAke2NvbnN0cnVjdG9yKHQ9MCl7c3VwZXIoOCk7dGhpcy5jb3B5PSh0LG4pPT57bGV0IGk9dGhpcy52YWx1ZS9XbnwwLG89dGhpcy52YWx1ZS1pKlduO3Qud3JpdGVVSW50MzJCRShpLG4pLHQud3JpdGVVSW50MzJCRShvLG4rNCl9O3RoaXMubG9hZD0odCxuKT0+e2xldCBpPXQucmVhZFVJbnQzMkJFKG4pLG89dC5yZWFkVUludDMyQkUobis0KTt0aGlzLnZhbHVlPWkqV24rb307dGhpcy52YWx1ZT10fX0sRnM9ZnVuY3Rpb24ocj0wKXtyZXR1cm4gY2xhc3MgZXh0ZW5kcyAke2NvbnN0cnVjdG9yKG4pe3N1cGVyKDApO3RoaXMuY29weT0obixpKT0+e2xldCBvPTA7Zm9yKGxldCBzIG9mIHRoaXMudmFsdWUpcy5jb3B5KG4saStvKSxvKz1zLmJ5dGVMZW5ndGh9O3RoaXMubG9hZD0oKT0+e307dGhpcy52YWx1ZT1uLnJlZHVjZSgoaSxvKT0+aS5jb25jYXQobmV3IEwoby5sZW5ndGgpLG5ldyBMdChvKSksW25ldyBrKHJ8bi5sZW5ndGgpXSksdGhpcy5ieXRlTGVuZ3RoPXRoaXMudmFsdWUucmVkdWNlKChpLG8pPT5pK28uYnl0ZUxlbmd0aCwwKX19fSxQcz17ZnR5cDp7Y29udGFpbmVyOlwiZmlsZVwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMCxib2R5OltbXCJtYWpvcl9icmFuZFwiLFJlLFwiaXNvbVwiXSxbXCJtaW5vcl92ZXJzaW9uXCIsZywwXSxbXCJjb21wYXRpYmxlX2JyYW5kc1wiLFJlLFwibXA0MVwiXV19LG1vb3Y6e2NvbnRhaW5lcjpcImZpbGVcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITB9LG1kYXQ6e2NvbnRhaW5lcjpcImZpbGVcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJhbnlcIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbXX0sbXZoZDp7Y29udGFpbmVyOlwibW9vdlwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1wiY3JlYXRpb25fdGltZVwiLGcsMF0sW1wibW9kaWZpY2F0aW9uX3RpbWVcIixnLDBdLFtcInRpbWVzY2FsZVwiLGcsMWUzXSxbXCJkdXJhdGlvblwiLGcsNDI5NDk2NzI5NV0sW1wicmF0ZVwiLGcsNjU1MzZdLFtcInZvbHVtZVwiLEwsMjU2XSxbXCJyZXNlcnZlZFwiLHRlLDEwXSxbXCJtYXRyaXhcIixkdCxbNjU1MzYsMCwwLDAsNjU1MzYsMCwwLDAsMTA3Mzc0MTgyNF1dLFtcInByZV9kZWZpbmVkXCIsdGUsMjRdLFtcIm5leHRfdHJhY2tfSURcIixnLDQyOTQ5NjcyOTVdXX0sdHJhazp7Y29udGFpbmVyOlwibW9vdlwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZStcIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITB9LHRraGQ6e2NvbnRhaW5lcjpcInRyYWtcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGNvbmZpZzp7ZmxhZ3M6M30sYm9keTpbW1wiY3JlYXRpb25fdGltZVwiLGcsMF0sW1wibW9kaWZpY2F0aW9uX3RpbWVcIixnLDBdLFtcInRyYWNrX0lEXCIsZywxXSxbXCJyZXNlcnZlZFwiLHRlLDRdLFtcImR1cmF0aW9uXCIsZywwXSxbXCJyZXNlcnZlZDJcIix0ZSw4XSxbXCJsYXllclwiLEwsMF0sW1wiYWx0ZXJuYXRlX2dyb3VwXCIsTCwwXSxbXCJ2b2x1bWVcIixMLDI1Nl0sW1wicmVzZXJ2ZWQzXCIsdGUsMl0sW1wibWF0cml4XCIsZHQsWzY1NTM2LDAsMCwwLDY1NTM2LDAsMCwwLDEwNzM3NDE4MjRdXSxbXCJ3aWR0aFwiLGcsMF0sW1wiaGVpZ2h0XCIsZywwXV19LHRyZWY6e2NvbnRhaW5lcjpcInRyYWtcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJvbmUtXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiExfSxtZGlhOntjb250YWluZXI6XCJ0cmFrXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwfSxtZGhkOntjb250YWluZXI6XCJtZGlhXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJjcmVhdGlvbl90aW1lXCIsZywwXSxbXCJtb2RpZmljYXRpb25fdGltZVwiLGcsMF0sW1widGltZXNjYWxlXCIsZywxZTNdLFtcImR1cmF0aW9uXCIsZyw0Mjk0OTY3Mjk1XSxbXCJsYW5ndWFnZVwiLEwsMF0sW1wicHJlX2RlZmluZWRcIixMLDBdXX0saGRscjp7Y29udGFpbmVyOlwibWRpYVwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1wicHJlZGVmaW5lZFwiLGcsMF0sW1wiaGFuZGxlcl90eXBlXCIsUmUsXCJ2aWRlXCJdLFtcInJlc2VydmVkXCIsdGUsMTJdLFtcIm5hbWVcIixSZSxcIlZpZGVvSGFuZGxlclxcMFwiXV19LG1pbmY6e2NvbnRhaW5lcjpcIm1kaWFcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITB9LHZtaGQ6e2NvbnRhaW5lcjpcIm1pbmZcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGNvbmZpZzp7ZmxhZ3M6MX0sYm9keTpbW1wiZ3JhcGhpY3Ntb2RlXCIsTCwwXSxbXCJvcGNvbG9yXCIsR24sWzAsMCwwXV1dfSxzbWhkOntjb250YWluZXI6XCJtaW5mXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJiYWxhbmNlXCIsTCwwXSxbXCJyZXNlcnZlZFwiLExdXX0sZGluZjp7Y29udGFpbmVyOlwibWluZlwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMH0sZHJlZjp7Y29udGFpbmVyOlwiZGluZlwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITAsYm9keTpbW1wiZW50cnlfY291bnRcIixnLDBdXX0sXCJ1cmwgXCI6e2NvbnRhaW5lcjpcImRyZWZcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmUrXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxjb25maWc6e2ZsYWdzOjF9LGJvZHk6W119LHN0Ymw6e2NvbnRhaW5lcjpcIm1pbmZcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITB9LHN0dHM6e2NvbnRhaW5lcjpcInN0YmxcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcImVudHJ5X2NvdW50XCIsZywwXV19LHN0c2Q6e2NvbnRhaW5lcjpcInN0YmxcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiEwLGJvZHk6W1tcImVudHJ5X2NvdW50XCIsZywxXV19LGF2YzE6e2NvbnRhaW5lcjpcInN0c2RcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJvbmVcIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITAsYm9keTpbW1wicmVzZXJ2ZWRcIix0ZSw2XSxbXCJkYXRhX3JlZmVyZW5jZV9pbmRleFwiLEwsMV0sW1wicHJlX2RlZmluZWRcIixMLDBdLFtcInJlc2VydmVkMlwiLHRlLDJdLFtcInByZV9kZWZpbmVkMlwiLGR0LFswLDAsMF1dLFtcIndpZHRoXCIsTCwxOTIwXSxbXCJoZWlnaHRcIixMLDEwODBdLFtcImhvcml6cmVzb2x1dGlvblwiLGcsNDcxODU5Ml0sW1widmVydHJlc29sdXRpb25cIixnLDQ3MTg1OTJdLFtcInJlc2VydmVkM1wiLGcsMF0sW1wiZnJhbWVfY291bnRcIixMLDFdLFtcImNvbXByZXNzb3JuYW1lXCIsTHQsQnVmZmVyLmFsbG9jKDMyKV0sW1wiZGVwdGhcIixMLDI0XSxbXCJwcmVfZGVmaW5lZDNcIixMLDY1NTM1XV19LGF2Y0M6e2NvbnRhaW5lcjpcImF2YzFcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJvbmVcIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1wiY29uZmlndXJhdGlvblZlcnNpb25cIixrLDFdLFtcIkFWQ1Byb2ZpbGVJbmRpY2F0aW9uXCIsayw3N10sW1wicHJvZmlsZV9jb21wYXRpYmlsaXR5XCIsaywwXSxbXCJBVkNMZXZlbEluZGljYXRpb25cIixrLDQxXSxbXCJsZW5ndGhTaXplTWludXNPbmVcIixrLDI1NV0sW1wic2VxdWVuY2VQYXJhbWV0ZXJTZXRzXCIsRnMoMjI0KSxbXV0sW1wicGljdHVyZVBhcmFtZXRlclNldHNcIixGcygpLFtdXV19LG1wNGE6e2NvbnRhaW5lcjpcInN0c2RcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJvbmVcIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITAsYm9keTpbW1wicmVzZXJ2ZWRcIix0ZSw2XSxbXCJkYXRhX3JlZmVyZW5jZV9pbmRleFwiLEwsMV0sW1wicmVzZXJ2ZWQyXCIsZHQsWzAsMF1dLFtcImNoYW5uZWxjb3VudFwiLEwsMl0sW1wic2FtcGxlc2l6ZVwiLEwsMTZdLFtcInByZV9kZWZpbmVkXCIsTCwwXSxbXCJyZXNlcnZlZDNcIixMLDBdLFtcInNhbXBsZXJhdGVcIixnLDBdXX0sZXNkczp7Y29udGFpbmVyOlwibXA0YVwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1wiRVNfRGVzY3JUYWdcIixrLDNdLFtcIkVTX0Rlc2NyTGVuZ3RoXCIsaywyNV0sW1wiRVNfSURcIixMLDFdLFtcImZsYWdzQW5kU3RyZWFtUHJpb3JpdHlcIixrLDBdLFtcIkRlY29kZXJDb25maWdEZXNjclRhZ1wiLGssNF0sW1wiRGVjb2RlckNvbmZpZ0Rlc2NyTGVuZ3RoXCIsaywxN10sW1wib2JqZWN0UHJvZmlsZUluZGljYXRpb25cIixrLDY0XSxbXCJzdHJlYW1UeXBlVXBzdHJlYW1SZXNlcnZlZFwiLGssMjFdLFtcImJ1ZmZlclNpemVEQlwiLEx0LFswLDAsMF1dLFtcIm1heEJpdFJhdGVcIixnLDBdLFtcImF2Z0JpdFJhdGVcIixnLDBdLFtcIkRlY1NwZWNpZmljSW5mb1Nob3J0VGFnXCIsayw1XSxbXCJEZWNTcGVjaWZpY0luZm9TaG9ydExlbmd0aFwiLGssMl0sW1wiYXVkaW9Db25maWdCeXRlc1wiLEwsMF0sW1wiU0xDb25maWdEZXNjclRhZ1wiLGssNl0sW1wiU0xDb25maWdEZXNjckxlbmd0aFwiLGssMV0sW1wiU0xDb25maWdEZXNjclByZWRlZmluZWRcIixrLDJdXX0sc3Rzejp7Y29udGFpbmVyOlwic3RibFwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1wic2FtcGxlX3NpemVcIixnLDBdLFtcInNhbXBsZV9jb3VudFwiLGcsMF1dfSxzdHNjOntjb250YWluZXI6XCJzdGJsXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJlbnRyeV9jb3VudFwiLGcsMF1dfSxzdGNvOntjb250YWluZXI6XCJzdGJsXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJlbnRyeV9jb3VudFwiLGcsMF1dfSxzdHNzOntjb250YWluZXI6XCJzdGJsXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lLVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1wiZW50cnlfY291bnRcIixnLDBdXX0sZWR0czp7Y29udGFpbmVyOlwidHJha1wiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZS1cIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITB9LGVsc3Q6e2NvbnRhaW5lcjpcImVkdHNcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJvbmUtXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJlbnRyeV9jb3VudFwiLGcsMV0sW1wic2VnbWVudF9kdXJhdGlvblwiLGcsMF0sW1wibWVkaWFfdGltZVwiLGcsNDI5NDk2NzI5NV0sW1wibWVkaWFfcmF0ZV9pbnRlZ2VyXCIsTCwxXSxbXCJtZWRpYV9yYXRlX2ZyYWN0aW9uXCIsTCwwXV19LG12ZXg6e2NvbnRhaW5lcjpcIm1vb3ZcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJvbmUtXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwfSxtZWhkOntjb250YWluZXI6XCJtdmV4XCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lLVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1wiZnJhZ21lbnRfZHVyYXRpb25cIixnLDBdXX0sdHJleDp7Y29udGFpbmVyOlwibXZleFwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZStcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcInRyYWNrX0lEXCIsZywxXSxbXCJkZWZhdWx0X3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleFwiLGcsMV0sW1wiZGVmYXVsdF9zYW1wbGVfZHVyYXRpb25cIixnLDBdLFtcImRlZmF1bHRfc2FtcGxlX3NpemVcIixnLDBdLFtcImRlZmF1bHRfc2FtcGxlX2ZsYWdzXCIsZywwXV19LG1vb2Y6e2NvbnRhaW5lcjpcImZpbGVcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJ6ZXJvK1wiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMX0sbWZoZDp7Y29udGFpbmVyOlwibW9vZlwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1wic2VxdWVuY2VfbnVtYmVyXCIsZywwXV19LHRyYWY6e2NvbnRhaW5lcjpcIm1vb2ZcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJ6ZXJvK1wiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMH0sdGZoZDp7Y29udGFpbmVyOlwidHJhZlwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsY29uZmlnOntmbGFnczozMn0sYm9keTpbW1widHJhY2tfSURcIixnLDFdLFtcImRlZmF1bHRfc2FtcGxlX2ZsYWdzXCIsZywwXV19LHRmZHQ6e2NvbnRhaW5lcjpcInRyYWZcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJvbmUtXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxjb25maWc6e3ZlcnNpb246MX0sYm9keTpbW1wiYmFzZU1lZGlhRGVjb2RlVGltZVwiLFZuLDBdXX0sdHJ1bjp7Y29udGFpbmVyOlwidHJhZlwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcInplcm8rXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxjb25maWc6e2ZsYWdzOjc3M30sYm9keTpbW1wic2FtcGxlX2NvdW50XCIsZywxXSxbXCJkYXRhX29mZnNldFwiLGcsMF0sW1wiZmlyc3Rfc2FtcGxlX2ZsYWdzXCIsZywwXSxbXCJzYW1wbGVfZHVyYXRpb25cIixnLDBdLFtcInNhbXBsZV9zaXplXCIsZywwXV19LFwiLi4uLlwiOntib3g6XCJCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbXX0sZmlsZTp7Ym94OlwiTm9uZVwiLGlzX2NvbnRhaW5lcjohMCxtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIn19LHpuPWNsYXNze3N0YXRpYyBOb25lKCl7cmV0dXJuW119c3RhdGljIEJveChlKXtyZXR1cm5bW1wic2l6ZVwiLGcsMF0sW1widHlwZVwiLFJlLGVdXX1zdGF0aWMgRnVsbEJveChlKXtyZXR1cm5bXS5jb25jYXQodGhpcy5Cb3goZSksW1tcInZlcnNpb25cIixrLDBdLFtcImZsYWdzXCIsJG4sMF1dKX19LFQ9Y2xhc3MgZXh0ZW5kcyAke2NvbnN0cnVjdG9yKHQsbil7c3VwZXIoMCk7dGhpcy50eXBlPXQ7bGV0IGk9UHNbdGhpcy50eXBlXTtpZihpPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgdW5rbm93biBib3ggdHlwZTogJHt0fWApO3RoaXMuY29uZmlnPU9iamVjdC5hc3NpZ24oe30saS5jb25maWcsbik7bGV0IG89em5baS5ib3hdKHRoaXMudHlwZSkscz1pLmJvZHl8fFtdO3RoaXMuc3RydWN0PW5ldyBNYXA7bGV0IGE9MDtmb3IobGV0W3UsZixsXW9mW10uY29uY2F0KG8scykpe2lmKHRoaXMuaGFzKHUpKXRocm93IG5ldyBFcnJvcihcIlRyeWluZyB0byBhZGQgZXhpc3Rpbmcga2V5XCIpO2xldCBkPWw7dGhpcy5jb25maWdbdV0mJihkPXRoaXMuY29uZmlnW3VdKTtsZXQgaD1uZXcgZihkKTt0aGlzLnN0cnVjdC5zZXQodSx7b2Zmc2V0OmEsZWxlbWVudDpofSksYSs9aC5ieXRlTGVuZ3RofXRoaXMuYnl0ZUxlbmd0aD1hfWVsZW1lbnQodCl7bGV0IG49dGhpcy5zdHJ1Y3QuZ2V0KHQpO2lmKG49PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBrZXlcIik7cmV0dXJuIG4uZWxlbWVudH1zZXQodCxuKXt0aGlzLmVsZW1lbnQodCkudmFsdWU9bn1nZXQodCl7cmV0dXJuIHRoaXMuZWxlbWVudCh0KS52YWx1ZX1vZmZzZXQodCl7bGV0IG49dGhpcy5zdHJ1Y3QuZ2V0KHQpO2lmKG49PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBrZXlcIik7cmV0dXJuIG4ub2Zmc2V0fWhhcyh0KXtyZXR1cm4gdGhpcy5zdHJ1Y3QuaGFzKHQpfWFkZCh0LG4pe2lmKHRoaXMuaGFzKHQpKXRocm93IG5ldyBFcnJvcihcIlRyeWluZyB0byBhZGQgZXhpc3Rpbmcga2V5XCIpO3JldHVybiB0aGlzLnN0cnVjdC5zZXQodCx7b2Zmc2V0OnRoaXMuYnl0ZUxlbmd0aCxlbGVtZW50Om59KSx0aGlzLmJ5dGVMZW5ndGgrPW4uYnl0ZUxlbmd0aCx0aGlzfWJ1ZmZlcigpe2xldCB0PUJ1ZmZlci5hbGxvY1Vuc2FmZSh0aGlzLmJ5dGVMZW5ndGgpO3JldHVybiB0aGlzLmNvcHkodCksdH1jb3B5KHQsbj0wKXt0aGlzLnNldChcInNpemVcIix0aGlzLmJ5dGVMZW5ndGgpO2ZvcihsZXQgaSBvZiB0aGlzLnN0cnVjdC52YWx1ZXMoKSlpLmVsZW1lbnQuY29weSh0LG4raS5vZmZzZXQpfWxvYWQodCxuPTApe2ZvcihsZXQgaSBvZiB0aGlzLnN0cnVjdC52YWx1ZXMoKSlpLmVsZW1lbnQubG9hZCE9PXZvaWQgMCYmaS5lbGVtZW50LmxvYWQodCxuK2kub2Zmc2V0KX1mb3JtYXQodD0wKXtsZXQgbj1bXCIgXCIucmVwZWF0KHQpK2BbJHt0aGlzLnR5cGV9XSAoJHt0aGlzLmJ5dGVMZW5ndGh9KWBdO2ZvcihsZXRbaSxvXW9mIHRoaXMuc3RydWN0KXtsZXQgcz1vLmVsZW1lbnQ7cy5mb3JtYXQhPT12b2lkIDA/bi5wdXNoKHMuZm9ybWF0KHQrMikpOm4ucHVzaChcIiBcIi5yZXBlYXQodCsyKStgJHtpfSA9ICR7cy52YWx1ZX0gKCR7cy5ieXRlTGVuZ3RofSlgKX1yZXR1cm4gbi5qb2luKGBcbmApfXByaW50KHQpe2NvbnNvbGUud2Fybih0aGlzLmZvcm1hdCh0KSl9fSxVPWNsYXNzIGV4dGVuZHMgVHtjb25zdHJ1Y3Rvcih0LG4sLi4uaSl7c3VwZXIodCxuKTt0aGlzLmJveFNpemU9MCx0aGlzLmFwcGVuZCguLi5pKX1hcHBlbmQoLi4udCl7Zm9yKGxldCBuIG9mIHQpdGhpcy5hZGQoYGJveF8ke3RoaXMuYm94U2l6ZSsrfWAsbik7cmV0dXJuIHRoaXN9cGFyc2UodCl7bGV0IG49W107Zm9yKDt0LmJ5dGVMZW5ndGg+MDspe2xldCBpPW5ldyBSZShcIi4uLi5cIik7aS5sb2FkKHQsNCk7bGV0IG89aS52YWx1ZSxzPVBzW29dLGE7aWYocyE9PXZvaWQgMCl7aWYocy5pc19jb250YWluZXIpe2E9bmV3IFUobyksYS5sb2FkKHQpO2xldCB1PWEucGFyc2UodC5zbGljZShhLmJ5dGVMZW5ndGgsYS5nZXQoXCJzaXplXCIpKSk7bi5wdXNoKC4uLnUpfWVsc2UgaWYoYT1uZXcgVChvKSxhLmxvYWQodCksbz09PVwiYXZjQ1wiKXtsZXQgdT1hLmVsZW1lbnQoXCJBVkNQcm9maWxlSW5kaWNhdGlvblwiKS52YWx1ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwwKSxmPWEuZWxlbWVudChcInByb2ZpbGVfY29tcGF0aWJpbGl0eVwiKS52YWx1ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwwKSxsPWEuZWxlbWVudChcIkFWQ0xldmVsSW5kaWNhdGlvblwiKS52YWx1ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwwKTtuLnB1c2goe3R5cGU6XCJ2aWRlb1wiLG1pbWU6YGF2YzEuJHt1fSR7Zn0ke2x9YH0pfWVsc2UgaWYobz09PVwiZXNkc1wiKXtsZXQgZj1hLmVsZW1lbnQoXCJhdWRpb0NvbmZpZ0J5dGVzXCIpLnZhbHVlPj4+MTEmMzE7bi5wdXNoKHt0eXBlOlwiYXVkaW9cIixtaW1lOmBtcDRhLjQwLiR7Zn1gfSl9fWVsc2UgYT1uZXcgVChcIi4uLi5cIiksYS5sb2FkKHQpLGEudHlwZT1hLmdldChcInR5cGVcIik7dGhpcy5hcHBlbmQoYSksdD10LnNsaWNlKGEuZ2V0KFwic2l6ZVwiKSl9cmV0dXJuIG59fTtjKCk7YygpO3ZhciBUYz17MTpcIkFBQyBNYWluXCIsMjpcIkFBQyBMQ1wifSxDYz17MDpcIjk2IGtIelwiLDE6XCI4OC4yIGtIelwiLDI6XCI2NCBrSHpcIiwzOlwiNDgga0h6XCIsNDpcIjQ0LjEga0h6XCIsNTpcIjMyIGtIelwiLDY6XCIyNCBrSHpcIiw3OlwiMjIuMDUga0h6XCIsODpcIjE2IGtIelwiLDk6XCIxMiBrSHpcIiwxMDpcIjExLjAyNSBrSHpcIiwxMTpcIjgga0h6XCIsMTI6XCI3LjM1IGtIelwifSxCYz17MTpcIk1vbm9cIiwyOlwiU3RlcmVvXCJ9LE1jPXI9PntsZXQgZT1yPj4+MTEmMzEsdD1yPj4+NyYxNSxuPXI+Pj4zJjE1LGk9VGNbZV18fGBBQUMgKCR7ZX0pYCxvPUNjW3RdfHxcInVua25vd25cIixzPUJjW25dfHxuLnRvU3RyaW5nKCk7cmV0dXJue2NvZGluZzppLHNhbXBsaW5nUmF0ZTpvLGNoYW5uZWxzOnN9fSxrcz0ocixlLHQpPT57bGV0IG49TnVtYmVyKHIuZm10cC5wYXJhbWV0ZXJzLmJpdHJhdGUpfHwzMmU0LGk9cGFyc2VJbnQoci5mbXRwLnBhcmFtZXRlcnMuY29uZmlnLnN1YnN0cigwLDQpLDE2KSxvPWk+Pj4xMSYzMTtyZXR1cm57dGtoZDp7dHJhY2tfSUQ6dCxjcmVhdGlvbl90aW1lOmUsbW9kaWZpY2F0aW9uX3RpbWU6ZSx3aWR0aDowLGhlaWdodDowLHZvbHVtZToxfSxtZGhkOnt0aW1lc2NhbGU6TnVtYmVyKHIucnRwbWFwLmNsb2NrcmF0ZSksY3JlYXRpb25fdGltZTplLG1vZGlmaWNhdGlvbl90aW1lOmUsZHVyYXRpb246MH0saGRscjp7aGFuZGxlcl90eXBlOlwic291blwiLG5hbWU6XCJTb3VuZEhhbmRsZXJcXDBcIn0sbWVkaWFIZWFkZXJCb3g6bmV3IFQoXCJzbWhkXCIpLHNhbXBsZUVudHJ5Qm94Om5ldyBVKFwibXA0YVwiLHtzYW1wbGVyYXRlOnIucnRwbWFwLmNsb2NrcmF0ZTw8MTY+Pj4wfSxuZXcgVChcImVzZHNcIix7YXVkaW9Db25maWdCeXRlczppLG1heEJpdFJhdGU6bixhdmdCaXRSYXRlOm59KSksZGVmYXVsdEZyYW1lRHVyYXRpb246MTAyNCxtaW1lOmBtcDRhLjQwLiR7b31gLGNvZGVjOk1jKGkpfX07YygpO2MoKTtmdW5jdGlvbiBMYyhyKXtyZXR1cm4gcj42NCYmcjw5MT9yLTY1OnI+OTYmJnI8MTIzP3ItNzE6cj40NyYmcjw1OD9yKzQ6cj09PTQzPzYyOnI9PT00Nz82MzowfWZ1bmN0aW9uIE9zKHIsZSl7bGV0IHQ9ci5yZXBsYWNlKC9bXkEtWmEtejAtOSsvXS9nLFwiXCIpLG49dC5sZW5ndGgsaT1lP01hdGguY2VpbCgobiozKzE+PjIpL2UpKmU6biozKzE+PjIsbz1uZXcgVWludDhBcnJheShpKSxzLGEsdT0wLGY9MDtmb3IobGV0IGw9MDtsPG47bCsrKWlmKGE9bCYzLHV8PUxjKHQuY2hhckNvZGVBdChsKSk8PDE4LTYqYSxhPT09M3x8bi1sPT09MSl7Zm9yKHM9MDtzPDMmJmY8aTtzKyssZisrKW9bZl09dT4+PigxNj4+PnMmMjQpJjI1NTt1PTB9cmV0dXJuIG99YygpO2MoKTt2YXIgZ3I9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5fYnVmZmVyPWUsdGhpcy5fZGF0YVZpZXc9bmV3IERhdGFWaWV3KHRoaXMuX2J1ZmZlciksdGhpcy5fb2Zmc2V0PTAsdGhpcy5fYml0cG9zPTAsdGhpcy5fYnl0ZT0wfXJlYWRVaW50OChlKXtyZXR1cm4gdGhpcy5fZGF0YVZpZXcuZ2V0VWludDgoZSl9cmVhZFVpbnQxNihlKXtyZXR1cm4gdGhpcy5fZGF0YVZpZXcuZ2V0VWludDE2KGUpfXJlYWRVaW50MzIoZSl7cmV0dXJuIHRoaXMuX2RhdGFWaWV3LmdldFVpbnQzMihlKX1yZWFkTmV4dCgpe2xldCBlPXRoaXMucmVhZFVpbnQ4KHRoaXMuX29mZnNldCk7cmV0dXJuIHRoaXMuX29mZnNldCs9MSxlfXJlYWRCaXRzKGUpe2lmKGU+MzJ8fGU9PT0wKXRocm93IG5ldyBFcnJvcihcImxlbmd0aCBoYXMgdG8gYmUgYmV0d2VlbiAwIC0gMzEgYml0c1wiKTtsZXQgdD0wO2ZvcihsZXQgbj0xO248PWU7KytuKXRoaXMuX2JpdHBvcz09PTAmJih0aGlzLl9ieXRlPXRoaXMucmVhZE5leHQoKSksdD10PDwxfHRoaXMuX2J5dGU+PjgtKyt0aGlzLl9iaXRwb3MmMSx0aGlzLl9iaXRwb3MlPTg7cmV0dXJuIHR9cmVhZFVuc2lnbmVkRXhwR29sb21iKCl7bGV0IGU9MDtmb3IoO3RoaXMucmVhZEJpdHMoMSkhPT0xOyllKys7aWYoZT09PTApcmV0dXJuIDA7aWYoZT49MzEpdGhyb3cgbmV3IEVycm9yKFwicmVhZCB1bnNpZ25lZCBleHBvbmVudGlhbCBHb2xvbWI6IGludGVybmFsIGVycm9yXCIpO2xldCB0PXRoaXMucmVhZEJpdHMoZSk7cmV0dXJuIHR8PTE8PGUsdC0xfXJlYWRTaWduZWRFeHBHb2xvbWIoKXtsZXQgZT10aGlzLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpO3JldHVybiBlJjE/ZT1lKzE+PjE6ZT0tKGU+PjEpLGV9c2l6ZSgpe3JldHVybiB0aGlzLl9idWZmZXIuYnl0ZUxlbmd0aH1nZXRVaW50OEFycmF5KCl7cmV0dXJuIG5ldyBVaW50OEFycmF5KHRoaXMuX2J1ZmZlcil9Z2V0QXJyYXlCdWZmZXIoKXtyZXR1cm4gdGhpcy5fYnVmZmVyfX07dmFyIHlyPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMucmVhZGVyPW5ldyBncihlKX1wYXJzZSgpe3RoaXMucmVhZGVyLnJlYWROZXh0KCk7bGV0IGU9dGhpcy5yZWFkZXIucmVhZE5leHQoKTt0aGlzLnJlYWRlci5yZWFkTmV4dCgpO2xldCB0PXRoaXMucmVhZGVyLnJlYWROZXh0KCk7aWYodGhpcy5yZWFkZXIucmVhZFVuc2lnbmVkRXhwR29sb21iKCksWzEwMCwxMTAsMTIyLDI0NCw0NCw4Myw4NiwxMThdLmluY2x1ZGVzKGUpKXtsZXQgYj10aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKTtpZihiPT09MyYmdGhpcy5yZWFkZXIucmVhZEJpdHMoMSksdGhpcy5yZWFkZXIucmVhZFVuc2lnbmVkRXhwR29sb21iKCksdGhpcy5yZWFkZXIucmVhZFVuc2lnbmVkRXhwR29sb21iKCksdGhpcy5yZWFkZXIucmVhZEJpdHMoMSksdGhpcy5yZWFkZXIucmVhZEJpdHMoMSkpZm9yKGxldCB3PTA7dzwoYiE9PTM/ODoxMik7dysrKXRoaXMucmVhZGVyLnJlYWRCaXRzKDEpfXRoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpO2xldCBuPXRoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpO2lmKG49PT0wKXRoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpO2Vsc2UgaWYobj09PTEpe2xldCBiPTA7dGhpcy5yZWFkZXIucmVhZEJpdHMoMSksdGhpcy5yZWFkZXIucmVhZFNpZ25lZEV4cEdvbG9tYigpLHRoaXMucmVhZGVyLnJlYWRTaWduZWRFeHBHb2xvbWIoKSxiPXRoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpO2ZvcihsZXQgeT0wO3k8Yjt5KyspdGhpcy5yZWFkZXIucmVhZFNpZ25lZEV4cEdvbG9tYigpfXRoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpLHRoaXMucmVhZGVyLnJlYWRCaXRzKDEpO2xldCBpPXRoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpLG89dGhpcy5yZWFkZXIucmVhZFVuc2lnbmVkRXhwR29sb21iKCkscz10aGlzLnJlYWRlci5yZWFkQml0cygxKTt0aGlzLnJlYWRlci5yZWFkQml0cygxKTtsZXQgYT10aGlzLnJlYWRlci5yZWFkQml0cygxKSx1PWE/dGhpcy5yZWFkZXIucmVhZFVuc2lnbmVkRXhwR29sb21iKCk6MCxmPWE/dGhpcy5yZWFkZXIucmVhZFVuc2lnbmVkRXhwR29sb21iKCk6MCxsPWE/dGhpcy5yZWFkZXIucmVhZFVuc2lnbmVkRXhwR29sb21iKCk6MCxkPWE/dGhpcy5yZWFkZXIucmVhZFVuc2lnbmVkRXhwR29sb21iKCk6MCxoPShpKzEpKjE2LXUqMi1mKjIsbT0oMi1zKSoobysxKSoxNi1sKjItZCoyO3JldHVybntwcm9maWxlOmUsbGV2ZWw6dC8xMCx3aWR0aDpoLGhlaWdodDptfX19O3ZhciBJYz17NjY6XCJCYXNlbGluZVwiLDc3OlwiTWFpblwiLDEwMDpcIkhpZ2hcIn0sQWM9cj0+e2xldCBlPXBhcnNlSW50KHIuc3Vic3RyKDAsMiksMTYpLHQ9cGFyc2VJbnQoci5zdWJzdHIoNCwyKSwxNiksbj1JY1tlXXx8ZS50b1N0cmluZygpLGk9KHQvMTApLnRvRml4ZWQoMSk7cmV0dXJue2NvZGluZzpcIkguMjY0XCIscHJvZmlsZTpuLGxldmVsOml9fSxVcz0ocixlLHQpPT57bGV0IG49ci5mbXRwLnBhcmFtZXRlcnNbXCJwcm9maWxlLWxldmVsLWlkXCJdLGk9ci5mbXRwLnBhcmFtZXRlcnNbXCJzcHJvcC1wYXJhbWV0ZXItc2V0c1wiXS5zcGxpdChcIixcIikubWFwKE9zKSxvPWkuc2xpY2UoMCwxKSxzPWkuc2xpY2UoMSksYT1uZXcgeXIob1swXS5idWZmZXIpLnBhcnNlKCksdT0zNjAwO3JldHVybnttZWRpYUhlYWRlckJveDpuZXcgVChcInZtaGRcIiksc2FtcGxlRW50cnlCb3g6bmV3IFUoXCJhdmMxXCIse3dpZHRoOmEud2lkdGgsaGVpZ2h0OmEuaGVpZ2h0fSxuZXcgVChcImF2Y0NcIix7QVZDUHJvZmlsZUluZGljYXRpb246b1swXVsxXSxwcm9maWxlX2NvbXBhdGliaWxpdHk6b1swXVsyXSxBVkNMZXZlbEluZGljYXRpb246b1swXVszXSxzZXF1ZW5jZVBhcmFtZXRlclNldHM6byxwaWN0dXJlUGFyYW1ldGVyU2V0czpzfSkpLHRraGQ6e3RyYWNrX0lEOnQsY3JlYXRpb25fdGltZTplLG1vZGlmaWNhdGlvbl90aW1lOmUsd2lkdGg6YS53aWR0aDw8MTYsaGVpZ2h0OmEuaGVpZ2h0PDwxNix2b2x1bWU6MH0saGRscjp7fSxtZGhkOnt0aW1lc2NhbGU6ci5ydHBtYXAuY2xvY2tyYXRlLGNyZWF0aW9uX3RpbWU6ZSxtb2RpZmljYXRpb25fdGltZTplLGR1cmF0aW9uOjB9LGRlZmF1bHRGcmFtZUR1cmF0aW9uOnIuZnJhbWVyYXRlIT09dm9pZCAwJiZyLmZyYW1lcmF0ZT4wJiZOdW1iZXIoci5ydHBtYXAuY2xvY2tyYXRlKS9OdW1iZXIoci5mcmFtZXJhdGUpfHx1LG1pbWU6YGF2YzEuJHtufWAsY29kZWM6QWMobil9fTt2YXIgRHM9e1wiTVBFRzQtR0VORVJJQ1wiOmtzLEgyNjQ6VXN9LEZjPSgpPT4oe2xhc3RUaW1lc3RhbXA6MCxiYXNlTWVkaWFEZWNvZGVUaW1lOjAsZGVmYXVsdEZyYW1lRHVyYXRpb246MCxjbG9ja3JhdGU6MCxiaXRyYXRlOjAsZnJhbWVyYXRlOjAsY3VtdWxhdGl2ZUJ5dGVMZW5ndGg6MCxjdW11bGF0aXZlRHVyYXRpb246MCxjdW11bGF0aXZlRnJhbWVzOjB9KSxQYz0ocix7Ynl0ZUxlbmd0aDplLGR1cmF0aW9uOnR9KT0+e2lmKHIuY3VtdWxhdGl2ZUJ5dGVMZW5ndGgrPWUsci5jdW11bGF0aXZlRHVyYXRpb24rPXQsci5jdW11bGF0aXZlRnJhbWVzKyssci5jdW11bGF0aXZlRHVyYXRpb24+PXIuY2xvY2tyYXRlKXtsZXQgbj04KnIuY3VtdWxhdGl2ZUJ5dGVMZW5ndGgsaT1yLmN1bXVsYXRpdmVGcmFtZXMsbz1yLmN1bXVsYXRpdmVEdXJhdGlvbi9yLmNsb2NrcmF0ZTtyLmJpdHJhdGU9bi9vLHIuZnJhbWVyYXRlPWkvbyxyLmN1bXVsYXRpdmVCeXRlTGVuZ3RoPTAsci5jdW11bGF0aXZlRHVyYXRpb249MCxyLmN1bXVsYXRpdmVGcmFtZXM9MH19LGJyPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy50cmFja0lkTWFwPXt9LHRoaXMuc2VxdWVuY2VOdW1iZXI9MCx0aGlzLm50cFByZXNlbnRhdGlvblRpbWU9MCx0aGlzLnRyYWNrRGF0YT1bXX10cmFrKGUpe2xldCB0PW5ldyBVKFwidHJha1wiKSxuPW5ldyBVKFwibWRpYVwiKSxpPW5ldyBVKFwibWluZlwiKSxvPW5ldyBVKFwiZGluZlwiKSxzPW5ldyBVKFwiZHJlZlwiKSxhPW5ldyBVKFwic3RibFwiKTtyZXR1cm4gcy5zZXQoXCJlbnRyeV9jb3VudFwiLDEpLHQuYXBwZW5kKG5ldyBUKFwidGtoZFwiLGUudGtoZCksbi5hcHBlbmQobmV3IFQoXCJtZGhkXCIsZS5tZGhkKSxuZXcgVChcImhkbHJcIixlLmhkbHIpLGkuYXBwZW5kKGUubWVkaWFIZWFkZXJCb3gsby5hcHBlbmQocy5hcHBlbmQobmV3IFQoXCJ1cmwgXCIpKSksYS5hcHBlbmQobmV3IFUoXCJzdHNkXCIsdm9pZCAwLGUuc2FtcGxlRW50cnlCb3gpLG5ldyBUKFwic3R0c1wiKSxuZXcgVChcInN0c2NcIiksbmV3IFQoXCJzdGNvXCIpLG5ldyBUKFwic3RzelwiKSxuZXcgVChcInN0c3NcIikpKSkpLHR9bW9vdihlLHQpe2xldCBuPW5ldyBVKFwibW9vdlwiKTtuLmFwcGVuZChuZXcgVChcIm12aGRcIix7Y3JlYXRpb25fdGltZTp0LG1vZGlmaWNhdGlvbl90aW1lOnQsZHVyYXRpb246MH0pKTtsZXQgaT1uZXcgVShcIm12ZXhcIik7dGhpcy50cmFja0lkTWFwPXt9LHRoaXMuc2VxdWVuY2VOdW1iZXI9MCx0aGlzLm50cFByZXNlbnRhdGlvblRpbWU9MDtsZXQgbz0wO3JldHVybiB0aGlzLnRyYWNrRGF0YT1bXSxlLm1lZGlhLmZvckVhY2gocz0+e2lmKHMucnRwbWFwPT09dm9pZCAwKXJldHVybjtsZXQgYT1zLnJ0cG1hcC5wYXlsb2FkVHlwZSx1PXMucnRwbWFwLmVuY29kaW5nTmFtZTtpZihEc1t1XSE9PXZvaWQgMCl7dGhpcy50cmFja0lkTWFwW2FdPSsrbyxzLnR5cGUudG9Mb3dlckNhc2UoKT09PVwidmlkZW9cIiYmKHRoaXMudmlkZW9UcmFja0lkPW8pO2xldCBmPURzW3VdKHMsdCxvKTtzLm1pbWU9Zi5taW1lLHMuY29kZWM9Zi5jb2RlYztsZXQgbD1GYygpO2wuY2xvY2tyYXRlPXMucnRwbWFwLmNsb2NrcmF0ZSxsLmRlZmF1bHRGcmFtZUR1cmF0aW9uPWYuZGVmYXVsdEZyYW1lRHVyYXRpb24sdGhpcy50cmFja0RhdGEucHVzaChsKTtsZXQgZD10aGlzLnRyYWsoZik7bi5hcHBlbmQoZCksaS5hcHBlbmQobmV3IFQoXCJ0cmV4XCIse3RyYWNrX0lEOm99KSl9fSksbi5hcHBlbmQoaSksbn1tb29mKGUpe2xldHt0cmFja0lkOnQsdGltZXN0YW1wOm4sYnl0ZUxlbmd0aDppfT1lLG89dC0xLHM9dGhpcy50cmFja0RhdGFbb10sYT1zLmxhc3RUaW1lc3RhbXAhPT0wP24tcy5sYXN0VGltZXN0YW1wfDA6cy5kZWZhdWx0RnJhbWVEdXJhdGlvbix1PWE+MD9hOnMuZGVmYXVsdEZyYW1lRHVyYXRpb247cy5sYXN0VGltZXN0YW1wPWE+MD9uOnMubGFzdFRpbWVzdGFtcCt1O2xldCBmPW5ldyBVKFwibW9vZlwiKSxsPW5ldyBVKFwidHJhZlwiKSxkPW5ldyBUKFwidHJ1blwiLHtzYW1wbGVfZHVyYXRpb246dSxzYW1wbGVfc2l6ZTppLGZpcnN0X3NhbXBsZV9mbGFnczo2NH0pO3JldHVybiBmLmFwcGVuZChuZXcgVChcIm1maGRcIix7c2VxdWVuY2VfbnVtYmVyOnRoaXMuc2VxdWVuY2VOdW1iZXIrK30pLGwuYXBwZW5kKG5ldyBUKFwidGZoZFwiLHt0cmFja19JRDp0fSksbmV3IFQoXCJ0ZmR0XCIse2Jhc2VNZWRpYURlY29kZVRpbWU6cy5iYXNlTWVkaWFEZWNvZGVUaW1lfSksZCkpLHMuYmFzZU1lZGlhRGVjb2RlVGltZSs9dSxkLnNldChcImRhdGFfb2Zmc2V0XCIsZi5ieXRlTGVuZ3RoKzgpLFBjKHMse2J5dGVMZW5ndGg6aSxkdXJhdGlvbjp1fSksZn1tZGF0KGUpe2xldCB0PW5ldyBUKFwibWRhdFwiKTtyZXR1cm4gdC5hZGQoXCJkYXRhXCIsZSksdH1zZXRQcmVzZW50YXRpb25UaW1lKGUsdCl7aWYoIXRoaXMubnRwUHJlc2VudGF0aW9uVGltZSYmdCYmZT09PXRoaXMudmlkZW9UcmFja0lkKXtsZXQgbj1lLTEsaT10aGlzLnRyYWNrRGF0YVtuXTt0aGlzLm50cFByZXNlbnRhdGlvblRpbWU9dC0xZTMqKGkuYmFzZU1lZGlhRGVjb2RlVGltZS9pLmNsb2NrcmF0ZSl9fX07dmFyIE5zPUMoTigpKTt2YXIgcHQ9Y2xhc3MgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKCl7bGV0IHQ9bmV3IGJyLG49bz0+e3RoaXMub25TeW5jJiZ0aGlzLm9uU3luYyhvKX0saT1uZXcgTnMuVHJhbnNmb3JtKHtvYmplY3RNb2RlOiEwLHRyYW5zZm9ybTpmdW5jdGlvbihvLHMsYSl7aWYoby50eXBlPT09NSl7bGV0IHU9TWF0aC5mbG9vcihuZXcgRGF0ZSgpLmdldFRpbWUoKS8xZTMrMjA4Mjg1MmUzKSxmPW5ldyBUKFwiZnR5cFwiKSxsPXQubW9vdihvLnNkcCx1KSxkPUJ1ZmZlci5hbGxvY1Vuc2FmZShmLmJ5dGVMZW5ndGgrbC5ieXRlTGVuZ3RoKTtmLmNvcHkoZCwwKSxsLmNvcHkoZCxmLmJ5dGVMZW5ndGgpLCgwLFluLmRlZmF1bHQpKFwibXNsOm1wNDppc29tXCIpKGBmdHlwOiAke2YuZm9ybWF0KCl9YCksKDAsWW4uZGVmYXVsdCkoXCJtc2w6bXA0Omlzb21cIikoYG1vb3Y6ICR7bC5mb3JtYXQoKX1gKTtsZXQgaD1vLnNkcC5tZWRpYS5tYXAobT0+KHt0eXBlOm0udHlwZSxlbmNvZGluZzptLnJ0cG1hcCYmbS5ydHBtYXAuZW5jb2RpbmdOYW1lLG1pbWU6bS5taW1lLGNvZGVjOm0uY29kZWN9KSk7dGhpcy5wdXNoKHt0eXBlOjgsZGF0YTpkLHRyYWNrczpoLGZ0eXA6Zixtb292Omx9KX1lbHNlIGlmKG8udHlwZT09PTZ8fG8udHlwZT09PTcpe2xldHtwYXlsb2FkVHlwZTp1LHRpbWVzdGFtcDpmLG50cFRpbWVzdGFtcDpsfT1vLGQ9dC50cmFja0lkTWFwW3VdO2lmKGQpe3QubnRwUHJlc2VudGF0aW9uVGltZXx8KHQuc2V0UHJlc2VudGF0aW9uVGltZShkLGwpLHQubnRwUHJlc2VudGF0aW9uVGltZSYmbih0Lm50cFByZXNlbnRhdGlvblRpbWUpKTtsZXQgaCxtPW8udHlwZT09PTc/by5uYWxUeXBlPT09NTp2b2lkIDA7dC5udHBQcmVzZW50YXRpb25UaW1lJiZtJiZvLm50cFRpbWVzdGFtcCE9PXZvaWQgMCYmKGg9KG8ubnRwVGltZXN0YW1wLXQubnRwUHJlc2VudGF0aW9uVGltZSkvMWUzKTtsZXQgYj1vLmRhdGEuYnl0ZUxlbmd0aCx5PXQubW9vZih7dHJhY2tJZDpkLHRpbWVzdGFtcDpmLGJ5dGVMZW5ndGg6Yn0pLHc9dC5tZGF0KG8uZGF0YSksXz1CdWZmZXIuYWxsb2NVbnNhZmUoeS5ieXRlTGVuZ3RoK3cuYnl0ZUxlbmd0aCk7eS5jb3B5KF8sMCksdy5jb3B5KF8seS5ieXRlTGVuZ3RoKSx0aGlzLnB1c2goe3R5cGU6OCxkYXRhOl8sbW9vZjp5LG1kYXQ6dyxudHBUaW1lc3RhbXA6bCxjaGVja3BvaW50VGltZTpofSl9fWVsc2UgdGhpcy5wdXNoKG8pO2EoKX19KTtzdXBlcihpKTt0aGlzLmJveEJ1aWxkZXI9dH1nZXQgYml0cmF0ZSgpe3JldHVybiB0aGlzLmJveEJ1aWxkZXIudHJhY2tEYXRhJiZ0aGlzLmJveEJ1aWxkZXIudHJhY2tEYXRhLm1hcCh0PT50LmJpdHJhdGUpfWdldCBmcmFtZXJhdGUoKXtyZXR1cm4gdGhpcy5ib3hCdWlsZGVyLnRyYWNrRGF0YSYmdGhpcy5ib3hCdWlsZGVyLnRyYWNrRGF0YS5tYXAodD0+dC5mcmFtZXJhdGUpfWdldCBudHBQcmVzZW50YXRpb25UaW1lKCl7cmV0dXJuIHRoaXMuYm94QnVpbGRlci5udHBQcmVzZW50YXRpb25UaW1lfX07YygpO3ZhciBWcz1DKGxlKCkpO3ZhciB2cj1DKE4oKSk7YygpO3ZhciBLbj0obz0+KG9bby5TUj0yMDBdPVwiU1JcIixvW28uUlI9MjAxXT1cIlJSXCIsb1tvLlNERVM9MjAyXT1cIlNERVNcIixvW28uQllFPTIwM109XCJCWUVcIixvW28uQVBQPTIwNF09XCJBUFBcIixvKSkoS258fHt9KSxrYz1yPT4oe3ZlcnNpb246clswXT4+PjYscGFkZGluZzohIShyWzBdJml0WzJdKSxjb3VudDpyWzBdJjMxLHBhY2tldFR5cGU6ci5yZWFkVUludDgoMSksbGVuZ3RoOnIucmVhZFVJbnQxNkJFKDIpfSksWG49cj0+e2xldCBlPWtjKHIpO3N3aXRjaChlLnBhY2tldFR5cGUpe2Nhc2UgMjAwOnJldHVybiBPYyhyLGUpO2Nhc2UgMjAxOnJldHVybiBVYyhyLGUpO2Nhc2UgMjAyOnJldHVybiBEYyhyLGUpO2Nhc2UgMjAzOnJldHVybiBOYyhyLGUpO2Nhc2UgMjA0OnJldHVybiBIYyhyLGUpO2RlZmF1bHQ6cmV0dXJuIGV9fSx4cj0ocixlKT0+KHt0eXBlOjMsZGF0YTplLGNoYW5uZWw6cixydGNwOlhuKGUpfSksSHM9e3BhY2tldFR5cGU6MjAwfSxxcz0ocixlLHQpPT57bGV0IG49W107Zm9yKGxldCBpPTA7aTxyO2krKyl7bGV0IG89dCtpKjI0O24ucHVzaCh7c3luY1NvdXJjZTplLnJlYWRVSW50MzJCRShvKzApLGZyYWN0aW9uTG9zdDplLnJlYWRVSW50OChvKzQpLGN1bXVsYXRpdmVOdW1iZXJPZlBhY2tldHNMb3N0OmUucmVhZFVJbnRCRShvKzUsMyksZXh0ZW5kZWRIaWdoZXN0U2VxdWVuY2VOdW1iZXJSZWNlaXZlZDplLnJlYWRVSW50MzJCRShvKzgpLGludGVyYXJyaXZhbEppdHRlcjplLnJlYWRVSW50MzJCRShvKzEyKSxsYXN0U1JUaW1lc3RhbXA6ZS5yZWFkVUludDMyQkUobysxNiksZGVsYXlTaW5jZUxhc3RTUjplLnJlYWRVSW50MzJCRShvKzIwKX0pfXJldHVybiBufSxPYz0ocixlKT0+KHsuLi5lLHN5bmNTb3VyY2U6ci5yZWFkVUludDMyQkUoNCksbnRwTW9zdDpyLnJlYWRVSW50MzJCRSg4KSxudHBMZWFzdDpyLnJlYWRVSW50MzJCRSgxMikscnRwVGltZXN0YW1wOnIucmVhZFVJbnQzMkJFKDE2KSxzZW5kZXJzUGFja2V0Q291bnQ6ci5yZWFkVUludDMyQkUoMjApLHNlbmRlcnNPY3RldENvdW50OnIucmVhZFVJbnQzMkJFKDI0KSxyZXBvcnRzOnFzKGUuY291bnQsciwyOCl9KSxfcj1yPT5yLnBhY2tldFR5cGU9PT0yMDAsVWM9KHIsZSk9Pih7Li4uZSxzeW5jU291cmNlOnIucmVhZFVJbnQzMkJFKDQpLHJlcG9ydHM6cXMoZS5jb3VudCxyLDgpfSksanM9cj0+ci5wYWNrZXRUeXBlPT09MjAxLEpuPSh1PT4odVt1LkNOQU1FPTFdPVwiQ05BTUVcIix1W3UuTkFNRT0yXT1cIk5BTUVcIix1W3UuRU1BSUw9M109XCJFTUFJTFwiLHVbdS5QSE9ORT00XT1cIlBIT05FXCIsdVt1LkxPQz01XT1cIkxPQ1wiLHVbdS5UT09MPTZdPVwiVE9PTFwiLHVbdS5OT1RFPTddPVwiTk9URVwiLHVbdS5QUklWPThdPVwiUFJJVlwiLHUpKShKbnx8e30pLERjPShyLGUpPT57bGV0IHQ9W10sbj00O2ZvcihsZXQgaT0wO2k8ZS5jb3VudDtpKyspe2xldCBvPXtzb3VyY2U6ci5yZWFkVUludDMyQkUobiksaXRlbXM6W119O2ZvcihuKz00Ozspe2xldCBzPXIucmVhZFVJbnQ4KG4rKyk7aWYocz09PTApe24lNCE9PTAmJihuKz00LW4lNCk7YnJlYWt9bGV0IGE9ci5yZWFkVUludDgobisrKTtpZihzPT09OCl7bGV0IHU9ci5yZWFkVUludDgobiksZj1yLnRvU3RyaW5nKFwidXRmOFwiLG4rMSxuKzErdSksbD1yLnRvU3RyaW5nKFwidXRmOFwiLG4rMSt1LG4rYSk7by5pdGVtcy5wdXNoKFs4LGYsbF0pfWVsc2V7bGV0IHU9ci50b1N0cmluZyhcInV0ZjhcIixuLG4rYSk7by5pdGVtcy5wdXNoKFtzLHVdKX1uKz1hfXQucHVzaChvKX1yZXR1cm57Li4uZSxzeW5jU291cmNlOnIucmVhZFVJbnQzMkJFKDQpLHNvdXJjZURlc2NyaXB0aW9uczp0fX0sV3M9cj0+ci5wYWNrZXRUeXBlPT09MjAyLE5jPShyLGUpPT57bGV0IHQ9W107Zm9yKGxldCBpPTA7aTxlLmNvdW50O2krKyl0LnB1c2goci5yZWFkVUludDMyQkUoNCs0KmkpKTtsZXQgbjtpZihlLmxlbmd0aD5lLmNvdW50KXtsZXQgaT00KzQqZS5jb3VudCxvPXIucmVhZFVJbnQ4KGkpO249ci50b1N0cmluZyhcInV0Zi04XCIsaSsxLGkrMStvKX1yZXR1cm57Li4uZSxzb3VyY2VzOnQscmVhc29uOm59fSx3cj1yPT5yLnBhY2tldFR5cGU9PT0yMDMsSGM9KHIsZSk9Pih7Li4uZSxzdWJ0eXBlOmUuY291bnQsc291cmNlOnIucmVhZFVJbnQzMkJFKDQpLG5hbWU6ci50b1N0cmluZyhcImFzY2lpXCIsOCwxMiksZGF0YTpyLnNsaWNlKDEyKX0pLCRzPXI9PnIucGFja2V0VHlwZT09PTIwNDt2YXIgcWM9MTAwLEdzPSgwLFZzLmRlZmF1bHQpKFwibXNsOm1zZVwiKSxUZT1jbGFzcyBleHRlbmRzIFF7Y29uc3RydWN0b3IodCl7aWYodD09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJ2aWRlbyBlbGVtZW50IGFyZ3VtZW50IG1pc3NpbmdcIik7bGV0IG4saSxvPW5ldyB2ci5Xcml0YWJsZSh7b2JqZWN0TW9kZTohMCx3cml0ZTooYSx1LGYpPT57aWYoYS50eXBlPT09OClpZih0aGlzLl9kb25lPWYsYS50cmFja3MhPT12b2lkIDB8fGEubWltZSE9PXZvaWQgMCl7bGV0IGw9YS50cmFja3M/P1tdLGQ9bC5tYXAoeT0+eS5taW1lKS5maWx0ZXIoeT0+eSksaD1kLmxlbmd0aCE9PTA/ZC5qb2luKFwiLCBcIik6XCJhdmMxLjY0MDAyOSwgbXA0YS40MC4yXCIsbT1hLm1pbWU/P2B2aWRlby9tcDQ7IGNvZGVjcz1cIiR7aH1cImA7aWYoIU1lZGlhU291cmNlLmlzVHlwZVN1cHBvcnRlZChtKSl7by5lbWl0KFwiZXJyb3JcIixgdW5zdXBwb3J0ZWQgbWVkaWEgdHlwZTogJHttfWApO3JldHVybn10aGlzLl9sYXN0Q2hlY2twb2ludFRpbWU9MCxuPW5ldyBNZWRpYVNvdXJjZSx0LnNyYz13aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChuKTtsZXQgYj0oKT0+e2lmKG49PT12b2lkIDApe28uZW1pdChcImVycm9yXCIsXCJubyBNZWRpYVNvdXJjZSBpbnN0YW5jZVwiKTtyZXR1cm59d2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodC5zcmMpLG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNvdXJjZW9wZW5cIixiKSx0aGlzLm9uU291cmNlT3BlbiYmdGhpcy5vblNvdXJjZU9wZW4obixsKSxpPXRoaXMuYWRkU291cmNlQnVmZmVyKHQsbixtKSxpLm9uZXJyb3I9eT0+e2NvbnNvbGUuZXJyb3IoXCJlcnJvciBvbiBTb3VyY2VCdWZmZXI6IFwiLHkpLG8uZW1pdChcImVycm9yXCIpfTt0cnl7aS5hcHBlbmRCdWZmZXIoYS5kYXRhKX1jYXRjaCh5KXtHcyhcImZhaWxlZCB0byBhcHBlbmQgdG8gU291cmNlQnVmZmVyOiBcIix5LGEpfX07bi5hZGRFdmVudExpc3RlbmVyKFwic291cmNlb3BlblwiLGIpfWVsc2V7dGhpcy5fbGFzdENoZWNrcG9pbnRUaW1lPWEuY2hlY2twb2ludFRpbWUhPT12b2lkIDA/YS5jaGVja3BvaW50VGltZTp0aGlzLl9sYXN0Q2hlY2twb2ludFRpbWU7dHJ5e2k/LmFwcGVuZEJ1ZmZlcihhLmRhdGEpfWNhdGNoKGwpe0dzKFwiZmFpbGVkIHRvIGFwcGVuZCB0byBTb3VyY2VCdWZmZXI6IFwiLGwsYSl9fWVsc2UgYS50eXBlPT09MyYmd3IoYS5ydGNwKSYmbj8ucmVhZHlTdGF0ZT09PVwib3BlblwiJiZuLmVuZE9mU3RyZWFtKCksZigpfX0pO28ub24oXCJmaW5pc2hcIiwoKT0+e2NvbnNvbGUud2FybihcImluY29taW5nIHN0cmVhbSBmaW5pc2hlZDogZW5kIHN0cmVhbVwiKSxuJiZuLnJlYWR5U3RhdGU9PT1cIm9wZW5cIiYmbi5lbmRPZlN0cmVhbSgpfSksby5vbihcImVycm9yXCIsYT0+e2NvbnNvbGUuZXJyb3IoXCJlcnJvciBvbiBpbmNvbWluZyBzdHJlYW06IFwiLGEpLGkmJmkudXBkYXRpbmc/aS5hZGRFdmVudExpc3RlbmVyKFwidXBkYXRlZW5kXCIsKCk9PntuPy5yZWFkeVN0YXRlPT09XCJvcGVuXCImJm4uZW5kT2ZTdHJlYW0oKX0pOm4/LnJlYWR5U3RhdGU9PT1cIm9wZW5cIiYmbi5lbmRPZlN0cmVhbSgpfSk7bGV0IHM9bmV3IHZyLlJlYWRhYmxlKHtvYmplY3RNb2RlOiEwLHJlYWQ6ZnVuY3Rpb24oKXt9fSk7cy5vbihcImVycm9yXCIsKCk9Pntjb25zb2xlLndhcm4oXCJvdXRnb2luZyBzdHJlYW0gYnJva2Ugc29tZXdoZXJlXCIpfSk7c3VwZXIobyxzKTt0aGlzLl92aWRlb0VsPXQsdGhpcy5fbGFzdENoZWNrcG9pbnRUaW1lPTB9YWRkU291cmNlQnVmZmVyKHQsbixpKXtsZXQgbz1uLmFkZFNvdXJjZUJ1ZmZlcihpKSxzPTAsYT0oKT0+e2lmKCsrcyxzPnFjJiZvLmJ1ZmZlcmVkLmxlbmd0aCl7cz0wO2xldCB1PW8uYnVmZmVyZWQubGVuZ3RoLTEsZj1vLmJ1ZmZlcmVkLnN0YXJ0KHUpLGw9TWF0aC5taW4odC5jdXJyZW50VGltZSx0aGlzLl9sYXN0Q2hlY2twb2ludFRpbWUpLTEwO3RyeXtpZihsPmYpe28ucmVtb3ZlKGYsbCk7cmV0dXJufX1jYXRjaChkKXtjb25zb2xlLndhcm4oZCl9fXRoaXMuX2RvbmUmJnRoaXMuX2RvbmUoKX07cmV0dXJuIG8uYWRkRXZlbnRMaXN0ZW5lcihcInVwZGF0ZWVuZFwiLGEpLG99Z2V0IGN1cnJlbnRUaW1lKCl7cmV0dXJuIHRoaXMuX3ZpZGVvRWwuY3VycmVudFRpbWV9YXN5bmMgcGxheSgpe3JldHVybiBhd2FpdCB0aGlzLl92aWRlb0VsLnBsYXkoKX1wYXVzZSgpe3JldHVybiB0aGlzLl92aWRlb0VsLnBhdXNlKCl9fTtjKCk7dmFyIHpzPUMoTigpKTt2YXIgQ2U9Y2xhc3MgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKCl7bGV0IGUsdD1bXSxuPW5ldyB6cy5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtOmZ1bmN0aW9uKGksbyxzKXtpZihpLnR5cGU9PT01KXtsZXQgYTtmb3IobGV0IHUgb2YgaS5zZHAubWVkaWEpdS50eXBlPT09XCJhcHBsaWNhdGlvblwiJiZ1LnJ0cG1hcCYmdS5ydHBtYXAuZW5jb2RpbmdOYW1lPT09XCJWTkQuT05WSUYuTUVUQURBVEFcIiYmKGE9dSk7YSYmYS5ydHBtYXAmJihlPU51bWJlcihhLnJ0cG1hcC5wYXlsb2FkVHlwZSkpLHModm9pZCAwLGkpfWVsc2UgaWYoaS50eXBlPT09MiYmTyhpLmRhdGEpPT09ZSl7aWYodC5wdXNoKFooaS5kYXRhKSksY2UoaS5kYXRhKSYmdC5sZW5ndGg+MCl7bGV0IGE9e3RpbWVzdGFtcDpIKGkuZGF0YSksbnRwVGltZXN0YW1wOmkubnRwVGltZXN0YW1wLHBheWxvYWRUeXBlOk8oaS5kYXRhKSxkYXRhOkJ1ZmZlci5jb25jYXQodCksdHlwZTo5fTtzKHZvaWQgMCxhKSx0PVtdO3JldHVybn1zKCl9ZWxzZSBzKHZvaWQgMCxpKX19KTtzdXBlcihuKX19O2MoKTt2YXIgWm49QyhOKCkpO2MoKTt2YXIgWXM9QyhsZSgpKSxqYz1cIlJUU1AvMS4wXCIsS3M9cj0+e2lmKCFyLm1ldGhvZHx8IXIudXJpKXRocm93IG5ldyBFcnJvcihcIm1lc3NhZ2UgbmVlZHMgdG8gY29udGFpbiBhIG1ldGhvZCBhbmQgYSB1cmlcIik7bGV0IGU9ci5wcm90b2NvbHx8amMsdD1yLmhlYWRlcnN8fHt9LG49W2Ake3IubWV0aG9kfSAke3IudXJpfSAke2V9YCxPYmplY3QuZW50cmllcyh0KS5tYXAoKFtpLG9dKT0+aStcIjogXCIrbykuam9pbihgXFxyXG5gKSxgXFxyXG5gXS5qb2luKGBcXHJcbmApO3JldHVybigwLFlzLmRlZmF1bHQpKFwibXNsOnJ0c3A6b3V0Z29pbmdcIikobiksQnVmZmVyLmZyb20obil9O2MoKTtjKCk7dmFyIFdjPShyLGUsdD0wKT0+e2xldCBuPWBcbiR7ZX1gO3Q9ci5pbmRleE9mKG4sdCk7bGV0IGk9MCxvPVtdO2Zvcig7dD49MDspaT1yLmluZGV4T2YoYFxuYCx0K24ubGVuZ3RoKSxvLnB1c2goci50b1N0cmluZyhcImFzY2lpXCIsdCtuLmxlbmd0aCxpKS50cmltKCkpLHQ9ci5pbmRleE9mKG4saSk7cmV0dXJuIG99LCRjPXI9PnIubWF0Y2goL15tPS8pLEVyPShyLGUpPT57bGV0IHQ9ZS5pbmRleE9mKHIpO3JldHVybiB0PDA/W2Uuc2xpY2UoMCldOltlLnNsaWNlKDAsdCksZS5zbGljZSh0KzEpXX0sWHM9e2ZtdHA6cj0+e2xldFtlLHRdPUVyKFwiIFwiLHIpO3N3aXRjaChlKXtkZWZhdWx0OmxldCBuPXQ/dC50cmltKCkuc3BsaXQoXCI7XCIpOltdLGk9e307cmV0dXJuIG4uZm9yRWFjaChvPT57bGV0W3MsYV09RXIoXCI9XCIsbyksdT1zLnRyaW0oKS50b0xvd2VyQ2FzZSgpO3UhPT1cIlwiJiYoaVt1XT1hLnRyaW0oKSl9KSx7Zm9ybWF0OmUscGFyYW1ldGVyczppfX19LGZyYW1lcmF0ZTpOdW1iZXIscnRwbWFwOnI9PntsZXRbZSx0XT1FcihcIiBcIixyKSxbbixpLG9dPXQudG9VcHBlckNhc2UoKS5zcGxpdChcIi9cIik7cmV0dXJuIG89PT12b2lkIDA/e3BheWxvYWRUeXBlOk51bWJlcihlKSxlbmNvZGluZ05hbWU6bixjbG9ja3JhdGU6TnVtYmVyKGkpfTp7cGF5bG9hZFR5cGU6TnVtYmVyKGUpLGVuY29kaW5nTmFtZTpuLGNsb2NrcmF0ZTpOdW1iZXIoaSksZW5jb2RpbmdQYXJhbWV0ZXJzOm99fSx0cmFuc2Zvcm06cj0+ci5zcGxpdChcIjtcIikubWFwKGU9PmUuc3BsaXQoXCIsXCIpLm1hcChOdW1iZXIpKSxcIngtc2Vuc29yLXRyYW5zZm9ybVwiOnI9PnIuc3BsaXQoXCI7XCIpLm1hcChlPT5lLnNwbGl0KFwiLFwiKS5tYXAoTnVtYmVyKSksZnJhbWVzaXplOnI9PnIuc3BsaXQoXCIgXCIpWzFdLnNwbGl0KFwiLVwiKS5tYXAoTnVtYmVyKX0sR2M9cj0+e2xldFtlLHRdPUVyKFwiOlwiLHIpO3JldHVybiB0PT09dm9pZCAwP3tbZV06ITB9OlhzW2VdIT09dm9pZCAwP3tbZV06WHNbZV0odCl9OntbZV06dH19LFZjPXI9PntsZXQgZT1yLnNsaWNlKDAsMSksdD1yLnNsaWNlKDIpO3N3aXRjaChlKXtjYXNlXCJ2XCI6cmV0dXJue3ZlcnNpb246dH07Y2FzZVwib1wiOmxldFtuLGksbyxzLGEsdV09dC5zcGxpdChcIiBcIik7cmV0dXJue29yaWdpbjp7YWRkclR5cGU6YSxuZXRUeXBlOnMsc2Vzc2lvbklkOmksc2Vzc2lvblZlcnNpb246byx1bmljYXN0QWRkcmVzczp1LHVzZXJuYW1lOm59fTtjYXNlXCJzXCI6cmV0dXJue3Nlc3Npb25OYW1lOnR9O2Nhc2VcImlcIjpyZXR1cm57c2Vzc2lvbkluZm9ybWF0aW9uOnR9O2Nhc2VcInVcIjpyZXR1cm57dXJpOnR9O2Nhc2VcImVcIjpyZXR1cm57ZW1haWw6dH07Y2FzZVwicFwiOnJldHVybntwaG9uZTp0fTtjYXNlXCJjXCI6bGV0W2YsbCxkXT10LnNwbGl0KFwiIFwiKTtyZXR1cm57Y29ubmVjdGlvbkRhdGE6e2FkZHJUeXBlOmwsY29ubmVjdGlvbkFkZHJlc3M6ZCxuZXRUeXBlOmZ9fTtjYXNlXCJiXCI6bGV0W2gsbV09dC5zcGxpdChcIjpcIik7cmV0dXJue2J3dHlwZTpoLGJhbmR3aWR0aDptfTtjYXNlXCJ0XCI6bGV0W2IseV09dC5zcGxpdChcIiBcIikubWFwKE51bWJlcik7cmV0dXJue3RpbWU6e3N0YXJ0VGltZTpiLHN0b3BUaW1lOnl9fTtjYXNlXCJyXCI6bGV0W3csXywuLi52XT10LnNwbGl0KFwiIFwiKS5tYXAoTnVtYmVyKTtyZXR1cm57cmVwZWF0VGltZXM6e3JlcGVhdEludGVydmFsOncsYWN0aXZlRHVyYXRpb246XyxvZmZzZXRzOnZ9fTtjYXNlXCJ6XCI6cmV0dXJuO2Nhc2VcImtcIjpyZXR1cm47Y2FzZVwiYVwiOnJldHVybiBHYyh0KTtjYXNlXCJtXCI6bGV0W3EsQSxqLFldPXQuc3BsaXQoXCIgXCIpO3JldHVybnt0eXBlOnEscG9ydDpOdW1iZXIoQSkscHJvdG9jb2w6aixmbXQ6TnVtYmVyKFkpfTtkZWZhdWx0On19LEpzPXI9PntsZXQgZT1yLmluZGV4T2YoYFxubT1gKTtyZXR1cm4gV2MocixcImE9Y29udHJvbDpcIixlKX0sUW49cj0+e2xldCBlPXIudG9TdHJpbmcoXCJhc2NpaVwiKS5zcGxpdChgXG5gKS5tYXAobz0+by50cmltKCkpLHQ9e3Nlc3Npb246e30sbWVkaWE6W119LG49MCxpPXQuc2Vzc2lvbjtmb3IobGV0IG8gb2YgZSkkYyhvKSYmKHQubWVkaWFbbl09e30saT10Lm1lZGlhW25dLCsrbiksaT1PYmplY3QuYXNzaWduKGksVmMobykpO3JldHVybiB0fSxTcj1yPT4oe3R5cGU6NSxkYXRhOnIsc2RwOlFuKHIpfSk7YygpO3ZhciByZT0ocixlKT0+e2xldCB0PWBcbiR7ZS50b0xvd2VyQ2FzZSgpfTogYCxuPXIudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YodCk7aWYobj49MCl7bGV0IGk9ci5pbmRleE9mKGBcbmAsbit0Lmxlbmd0aCk7cmV0dXJuIHIudG9TdHJpbmcoXCJhc2NpaVwiLG4rdC5sZW5ndGgsaSkudHJpbSgpfXJldHVybiBudWxsfSxScj1yPT57bGV0IGU9cmUocixcIkNTZXFcIik7cmV0dXJuIGUhPT1udWxsP051bWJlcihlKTpudWxsfSxUcj1yPT57bGV0IGU9cmUocixcIlNlc3Npb25cIik7cmV0dXJuIGU/ZS5zcGxpdChcIjtcIilbMF06bnVsbH0sQ3I9cj0+e2xldCBlPXJlKHIsXCJTZXNzaW9uXCIpO2lmKGU9PT1udWxsKXJldHVybiBudWxsO2xldCB0PTYwLG49XCJ0aW1lb3V0PVwiLGk9ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2Yobik7aWYoaSE9PS0xKXtsZXQgbz1lLnN1YnN0cmluZyhpK24ubGVuZ3RoKTtvPW8uc3BsaXQoXCI7XCIpWzBdO2xldCBzPXBhcnNlSW50KG8pO3JldHVybiBpc05hTihzKT90OnN9cmV0dXJuIHR9LGh0PXI9Pk51bWJlcihyLnRvU3RyaW5nKFwiYXNjaWlcIiw5LDEyKSksQnI9cj0+cmUocixcIkNvbnRlbnQtQmFzZVwiKSxNcj1yPT5yZShyLFwiQ29udGVudC1Mb2NhdGlvblwiKSxMcj1yPT57bGV0IGU9cmUocixcIkNvbm5lY3Rpb25cIik7cmV0dXJuIGUhPT1udWxsJiZlLnRvTG93ZXJDYXNlKCk9PT1cImNsb3NlXCJ9LElyPXI9PntsZXQgZT1yZShyLFwiUmFuZ2VcIik7aWYoZSE9PW51bGwpcmV0dXJuIGUuc3BsaXQoXCI9XCIpWzFdLnNwbGl0KFwiLVwiKX0sQXI9cj0+e2xldCBlPVtgXG5cbmAsXCJcXHJcXHJcIixgXFxyXG5cXHJcbmBdLm1hcCh0PT57bGV0IG49ci5pbmRleE9mKHQpO3JldHVybiBuIT09LTE/bit0Lmxlbmd0aDpufSkuZmlsdGVyKHQ9PnQhPT0tMSk7cmV0dXJuIGUubGVuZ3RoPjA/ZS5yZWR1Y2UoKHQsbik9Pk1hdGgubWluKHQsbikpOi0xfTt2YXIgWnM9NCxRcz0zNix6Yz1yPT57bGV0IGU9QnVmZmVyLmFsbG9jKFpzKSx0PTAsbj0wO2Zvcig7bjxlLmxlbmd0aDspe2xldCB1PXJbdCsrXSxmPU1hdGgubWluKHUubGVuZ3RoLGUubGVuZ3RoLW4pO3UuY29weShlLG4sMCxmKSxuKz1mfWxldCBpPWVbMV0sbz1lLmxlbmd0aCxzPWUucmVhZFVJbnQxNkJFKDIpLGE9bytzO3JldHVybntjaGFubmVsOmksYmVnaW46byxlbmQ6YX19LEZyPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5fY2h1bmtzPVtdO3RoaXMuX2xlbmd0aD0wO3RoaXMuX3N0YXRlPTA7dGhpcy5faW5pdCgpfV9pbml0KCl7dGhpcy5fY2h1bmtzPVtdLHRoaXMuX2xlbmd0aD0wLHRoaXMuX3N0YXRlPTB9X3B1c2goZSl7dGhpcy5fY2h1bmtzLnB1c2goZSksdGhpcy5fbGVuZ3RoKz1lLmxlbmd0aH1fcGFyc2VSdHNwKCl7bGV0IGU9W10sdD1CdWZmZXIuY29uY2F0KHRoaXMuX2NodW5rcyksbj1Bcih0KTtpZihuPT09LTEpcmV0dXJuIGU7bGV0IGk9bixvPXJlKHQsXCJDb250ZW50LUxlbmd0aFwiKTtpZihvJiZwYXJzZUludChvKT50Lmxlbmd0aC1pKXJldHVybiBlO2lmKHRoaXMuX2luaXQoKSxpPT09dC5sZW5ndGh8fHRbaV09PT1Rcyl7bGV0IHM9dC5zbGljZSgwLGkpO2UucHVzaCh7dHlwZTo0LGRhdGE6c30pO2xldCBhPXQuc2xpY2UoaSk7dGhpcy5fcHVzaChhKX1lbHNle2xldCBzPXQsYT10LnNsaWNlKGkpO2UucHVzaCh7dHlwZTo0LGRhdGE6c30pLGUucHVzaChTcihhKSl9cmV0dXJuIGV9X3BhcnNlSW50ZXJsZWF2ZWQoKXtsZXQgZT1bXTtpZih0aGlzLl9sZW5ndGg8WnN8fCh0aGlzLl9wYWNrZXR8fCh0aGlzLl9wYWNrZXQ9emModGhpcy5fY2h1bmtzKSksdGhpcy5fbGVuZ3RoPHRoaXMuX3BhY2tldC5lbmQpKXJldHVybiBlO2xldCB0PUJ1ZmZlci5jb25jYXQodGhpcy5fY2h1bmtzKSxuPXQuc2xpY2UodGhpcy5fcGFja2V0LmJlZ2luLHRoaXMuX3BhY2tldC5lbmQpLGk9dC5zbGljZSh0aGlzLl9wYWNrZXQuZW5kKSxvPXRoaXMuX3BhY2tldC5jaGFubmVsO2lmKGRlbGV0ZSB0aGlzLl9wYWNrZXQsdGhpcy5faW5pdCgpLHRoaXMuX3B1c2goaSksbyUyPT09MCllLnB1c2goe3R5cGU6MixkYXRhOm4sY2hhbm5lbDpvfSk7ZWxzZXtsZXQgcz1uO2Rve2xldCBhPXMucmVhZFVJbnQxNkJFKDIpKjQrNDtlLnB1c2goeHIobyxzLnNsaWNlKDAsYSkpKSxzPXMuc2xpY2UoYSl9d2hpbGUocy5sZW5ndGg+MCl9cmV0dXJuIGV9X3NldFN0YXRlKCl7Zm9yKDt0aGlzLl9jaHVua3MubGVuZ3RoPjAmJnRoaXMuX2NodW5rc1swXS5sZW5ndGg9PT0wOyl0aGlzLl9jaHVua3Muc2hpZnQoKTtsZXQgZT10aGlzLl9jaHVua3NbMF07aWYodGhpcy5fY2h1bmtzLmxlbmd0aD09PTApdGhpcy5fc3RhdGU9MDtlbHNlIGlmKGVbMF09PT1Rcyl0aGlzLl9zdGF0ZT0xO2Vsc2UgaWYoZS50b1N0cmluZyhcImFzY2lpXCIsMCw0KT09PVwiUlRTUFwiKXRoaXMuX3N0YXRlPTI7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY2h1bmsgb2YgbGVuZ3RoICR7ZS5sZW5ndGh9YCl9cGFyc2UoZSl7dGhpcy5fcHVzaChlKSx0aGlzLl9zdGF0ZT09PTAmJnRoaXMuX3NldFN0YXRlKCk7bGV0IHQ9W10sbj0hMTtmb3IoOyFuOyl7bGV0IGk9W107c3dpdGNoKHRoaXMuX3N0YXRlKXtjYXNlIDA6YnJlYWs7Y2FzZSAxOmk9dGhpcy5fcGFyc2VJbnRlcmxlYXZlZCgpO2JyZWFrO2Nhc2UgMjppPXRoaXMuX3BhcnNlUnRzcCgpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKFwiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGVcIil9aS5sZW5ndGg+MD90PXQuY29uY2F0KGkpOm49ITAsdGhpcy5fc2V0U3RhdGUoKX1yZXR1cm4gdH19O3ZhciBtdD1jbGFzcyBleHRlbmRzIFJ7Y29uc3RydWN0b3IoKXtsZXQgZT1uZXcgRnIsdD1uZXcgWm4uVHJhbnNmb3JtKHtvYmplY3RNb2RlOiEwLHRyYW5zZm9ybTpmdW5jdGlvbihpLG8scyl7aWYoaS50eXBlPT09MSl0cnl7ZS5wYXJzZShpLmRhdGEpLmZvckVhY2goYT0+dC5wdXNoKGEpKSxzKCl9Y2F0Y2goYSl7cyhhKX1lbHNlIHModm9pZCAwLGkpfX0pLG49bmV3IFpuLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm06ZnVuY3Rpb24oaSxvLHMpe2lmKGkudHlwZT09PTQpe2xldCBhPUtzKGkpO3Modm9pZCAwLHt0eXBlOjEsZGF0YTphfSl9ZWxzZSBzKHZvaWQgMCxpKX19KTtzdXBlcih0LG4pfX07YygpO3ZhciBrcj1DKGxlKCkpO2MoKTt2YXIgZ3Q9KHIsZSk9PntsZXQgdDtpZihlIT09dm9pZCAwKXtpZih0eXBlb2YgZSE9XCJvYmplY3RcIil0aHJvdyBuZXcgRXJyb3IoXCJtZXJnZSBleHBlY3RzIG92ZXJyaWRlIHRvIGJlIGFuIG9iamVjdCFcIik7dD1PYmplY3Qua2V5cyhlKS5yZWR1Y2UoKG4saSk9PihlW2ldIT09dm9pZCAwJiYobltpXT1lW2ldKSxuKSx7fSl9cmV0dXJuIE9iamVjdC5hc3NpZ24oe30scix0KX07dmFyIGVhPUMoTigpKTtjKCk7dmFyIFljPURhdGUuVVRDKDE5MDAsMCwxKTtmdW5jdGlvbiBQcihyLGUpe2xldCB0PShyK2UvNDI5NDk2NzI5NikqMWUzO3JldHVybiBZYyt0fWZ1bmN0aW9uIEtjKHIpe3JldHVybi9eW146XSs6XFwvXFwvLy50ZXN0KHIpfXZhciBPcj0ocz0+KHMuT1BUSU9OUz1cIk9QVElPTlNcIixzLkRFU0NSSUJFPVwiREVTQ1JJQkVcIixzLlNFVFVQPVwiU0VUVVBcIixzLlBMQVk9XCJQTEFZXCIscy5QQVVTRT1cIlBBVVNFXCIscy5URUFSRE9XTj1cIlRFQVJET1dOXCIscykpKE9yfHx7fSksWGM9NSxKYz0ocj10eXBlb2Ygd2luZG93PlwidVwiP1wiXCI6d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLGU9W10pPT4oe3VyaTplLmxlbmd0aD4wP2BydHNwOi8vJHtyfS9heGlzLW1lZGlhL21lZGlhLmFtcD8ke2Uuam9pbihcIiZcIil9YDpgcnRzcDovLyR7cn0vYXhpcy1tZWRpYS9tZWRpYS5hbXBgfSksSXQ9Y2xhc3MgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcih0LG4pe3N1cGVyKHQpO3RoaXMubmFtZT1cIlJUU1BSZXNwb25zZUVycm9yXCIsdGhpcy5jb2RlPW59fSx5dD1jbGFzcyBleHRlbmRzIFJ7Y29uc3RydWN0b3IodD17fSl7bGV0e3VyaTpuLGhlYWRlcnM6aSxkZWZhdWx0SGVhZGVyczpvfT1ndChKYyh0Lmhvc3RuYW1lLHQucGFyYW1ldGVycyksdCkscz1uZXcgZWEuVHJhbnNmb3JtKHtvYmplY3RNb2RlOiEwLHRyYW5zZm9ybTooYSx1LGYpPT57YS50eXBlPT09ND8odGhpcy5fb25SdHNwKGEpLGYoKSk6YS50eXBlPT09Mz8odGhpcy5fb25SdGNwKGEpLHRoaXMub25SdGNwJiZ0aGlzLm9uUnRjcChhLnJ0Y3ApLGYodm9pZCAwLGEpKTphLnR5cGU9PT0yPyh0aGlzLl9vblJ0cChhKSxmKHZvaWQgMCxhKSk6KGEudHlwZT09PTUmJih0aGlzLl9vblNkcChhKSx0aGlzLm9uU2RwJiZ0aGlzLm9uU2RwKGEuc2RwKSksZih2b2lkIDAsYSkpfX0pO3Mub24oXCJlbmRcIiwoKT0+e3RoaXMuX291dGdvaW5nQ2xvc2VkPSEwfSk7c3VwZXIocyk7dGhpcy5fb3V0Z29pbmdDbG9zZWQ9ITEsdGhpcy5fcmVzZXQoKSx0aGlzLnVwZGF0ZShuLGksbyksdGhpcy5fc2Vzc2lvbkNvbnRyb2xVUkw9dGhpcy5fY29udHJvbFVSTCgpfXVwZGF0ZSh0LG49e30saT17fSl7aWYodD09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJZb3UgbXVzdCBzdXBwbHkgYW4gdXJpIHdoZW4gY3JlYXRpbmcgYSBSdHNwU2Vzc2lvbkNvbXBvbmVudFwiKTt0aGlzLnVyaT10LHRoaXMuZGVmYXVsdEhlYWRlcnM9aSx0aGlzLmhlYWRlcnM9T2JqZWN0LmFzc2lnbih7W1wiT1BUSU9OU1wiXTp7fSxbXCJQTEFZXCJdOnt9LFtcIlNFVFVQXCJdOntCbG9ja3NpemU6XCI2NDAwMFwifSxbXCJERVNDUklCRVwiXTp7QWNjZXB0OlwiYXBwbGljYXRpb24vc2RwXCJ9LFtcIlBBVVNFXCJdOnt9fSxuKX1fcmVzZXQoKXt0aGlzLl9zZXF1ZW5jZT0xLHRoaXMucmV0cnk9KCk9PmNvbnNvbGUuZXJyb3IoXCJObyByZXF1ZXN0IHNlbnQsIGNhbid0IHJldHJ5XCIpLHRoaXMuX2NhbGxTdGFjaz1bXSx0aGlzLl9jYWxsSGlzdG9yeT1bXSx0aGlzLl9zdGF0ZT1cImlkbGVcIix0aGlzLl93YWl0aW5nPSExLHRoaXMuX2NvbnRlbnRCYXNlPW51bGwsdGhpcy5fc2Vzc2lvbklkPW51bGwsdGhpcy5fcmVuZXdTZXNzaW9uSW50ZXJ2YWwhPT1udWxsJiZjbGVhckludGVydmFsKHRoaXMuX3JlbmV3U2Vzc2lvbkludGVydmFsKSx0aGlzLl9yZW5ld1Nlc3Npb25JbnRlcnZhbD1udWxsLHRoaXMudDA9dm9pZCAwLHRoaXMubjA9dm9pZCAwLHRoaXMuY2xvY2tyYXRlcz12b2lkIDB9X2NvbnRyb2xVUkwodCl7aWYodCE9PXZvaWQgMCYmS2ModCkpcmV0dXJuIHQ7bGV0IG49dGhpcy5fY29udGVudEJhc2U/P3RoaXMuX2NvbnRlbnRMb2NhdGlvbj8/dGhpcy51cmk7aWYobj09bnVsbCl0aHJvdyBuZXcgRXJyb3IoXCJyZWxhdGl2ZSBvciBtaXNzaW5nIGNvbnRyb2wgYXR0cmlidXRlIGJ1dCBubyBiYXNlIFVSTCBhdmFpbGFibGVcIik7cmV0dXJuIHQ9PT12b2lkIDB8fHQ9PT1cIipcIj9uOm5ldyBVUkwodCxuKS5ocmVmfV9vblJ0c3AodCl7dGhpcy5fd2FpdGluZz0hMTtsZXQgbj1odCh0LmRhdGEpLGk9THIodC5kYXRhKSxvPVJyKHQuZGF0YSk7aWYobz09PW51bGwpdGhyb3cgbmV3IEVycm9yKFwicnRzcDogZXhwZWN0ZWQgc2VxdWVuY2UgbnVtYmVyXCIpO2lmKHRoaXMuX2NhbGxIaXN0b3J5PT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcInJ0c3A6IGludGVybmFsIGVycm9yXCIpO2xldCBzPXRoaXMuX2NhbGxIaXN0b3J5W28tMV07aWYoKDAsa3IuZGVmYXVsdCkoXCJtc2w6cnRzcDppbmNvbWluZ1wiKShgJHt0LmRhdGF9YCksIXRoaXMuX3Nlc3Npb25JZCYmIWkpe3RoaXMuX3Nlc3Npb25JZD1Ucih0LmRhdGEpO2xldCBhPUNyKHQuZGF0YSk7YSE9PW51bGwmJih0aGlzLl9yZW5ld1Nlc3Npb25JbnRlcnZhbCE9PW51bGwmJmNsZWFySW50ZXJ2YWwodGhpcy5fcmVuZXdTZXNzaW9uSW50ZXJ2YWwpLHRoaXMuX3JlbmV3U2Vzc2lvbkludGVydmFsPXNldEludGVydmFsKCgpPT57dGhpcy5fZW5xdWV1ZSh7bWV0aG9kOlwiT1BUSU9OU1wifSksdGhpcy5fZGVxdWV1ZSgpfSxNYXRoLm1heChYYyxhLTUpKjFlMykpfXRoaXMuX2NvbnRlbnRCYXNlfHwodGhpcy5fY29udGVudEJhc2U9QnIodC5kYXRhKSksdGhpcy5fY29udGVudExvY2F0aW9ufHwodGhpcy5fY29udGVudExvY2F0aW9uPU1yKHQuZGF0YSkpLG4+PTQwMCYmdGhpcy5vbkVycm9yJiZ0aGlzLm9uRXJyb3IobmV3IEl0KHQuZGF0YS50b1N0cmluZyhcImFzY2lpXCIpLG4pKSxzPT09XCJQTEFZXCImJnRoaXMub25QbGF5JiZ0aGlzLm9uUGxheShJcih0LmRhdGEpKSxpJiYoKDAsa3IuZGVmYXVsdCkoXCJtc2w6cnRzcDppbmNvbWluZ1wiKShgUlRTUCBTZXNzaW9uICR7dGhpcy5fc2Vzc2lvbklkfSBlbmRlZCB3aXRoIHN0YXR1c0NvZGU6ICR7bn1gKSx0aGlzLl9zZXNzaW9uSWQ9bnVsbCksdGhpcy5fZGVxdWV1ZSgpfV9vblJ0Y3AodCl7aWYodGhpcy50MD09PXZvaWQgMHx8dGhpcy5uMD09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJydHNwOiBpbnRlcm5hbCBlcnJvclwiKTtpZihfcih0LnJ0Y3ApKXtsZXQgbj10LmNoYW5uZWwtMTt0aGlzLnQwW25dPXQucnRjcC5ydHBUaW1lc3RhbXAsdGhpcy5uMFtuXT1Qcih0LnJ0Y3AubnRwTW9zdCx0LnJ0Y3AubnRwTGVhc3QpfX1fb25SdHAodCl7aWYodGhpcy50MD09PXZvaWQgMHx8dGhpcy5uMD09PXZvaWQgMHx8dGhpcy5jbG9ja3JhdGVzPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcInJ0c3A6IGludGVybmFsIGVycm9yXCIpO2xldCBuPXQuY2hhbm5lbCxpPXRoaXMudDBbbl0sbz10aGlzLm4wW25dO2lmKHR5cGVvZiBpPFwidVwiJiZ0eXBlb2YgbzxcInVcIil7bGV0IHM9dGhpcy5jbG9ja3JhdGVzW25dLHU9SCh0LmRhdGEpLWl8MDt0Lm50cFRpbWVzdGFtcD11L3MqMWUzK299fV9vblNkcCh0KXt0aGlzLm4wPXt9LHRoaXMudDA9e30sdGhpcy5jbG9ja3JhdGVzPXt9LHRoaXMuX3Nlc3Npb25Db250cm9sVVJMPXRoaXMuX2NvbnRyb2xVUkwodC5zZHAuc2Vzc2lvbi5jb250cm9sKSx0LnNkcC5tZWRpYS5mb3JFYWNoKChuLGkpPT57aWYobi5ydHBtYXA9PT12b2lkIDApcmV0dXJuO2xldHtjbG9ja3JhdGU6b309bi5ydHBtYXAscz1pKjIsYT1zKzEsdT1uLmNvbnRyb2w9PT12b2lkIDA/dGhpcy5fc2Vzc2lvbkNvbnRyb2xVUkw6dGhpcy5fY29udHJvbFVSTChuLmNvbnRyb2wpO3RoaXMuX2VucXVldWUoe21ldGhvZDpcIlNFVFVQXCIsaGVhZGVyczp7VHJhbnNwb3J0OlwiUlRQL0FWUC9UQ1A7dW5pY2FzdDtpbnRlcmxlYXZlZD1cIitzK1wiLVwiK2F9LHVyaTp1fSksdGhpcy5jbG9ja3JhdGVzIT09dm9pZCAwJiYodGhpcy5jbG9ja3JhdGVzW3NdPW8pfSksdGhpcy5fc3RhdGU9PT1cInBsYXlpbmdcIiYmdGhpcy5fZW5xdWV1ZSh7bWV0aG9kOlwiUExBWVwiLGhlYWRlcnM6e1JhbmdlOmBucHQ9JHt0aGlzLnN0YXJ0VGltZXx8MH0tYH0sdXJpOnRoaXMuX3Nlc3Npb25Db250cm9sVVJMfSksdGhpcy5fZGVxdWV1ZSgpfXBsYXkodD0wKXtpZih0aGlzLl9zdGF0ZT09PVwiaWRsZVwiKXRoaXMuc3RhcnRUaW1lPU51bWJlcih0KXx8MCx0aGlzLl9lbnF1ZXVlKHttZXRob2Q6XCJPUFRJT05TXCJ9KSx0aGlzLl9lbnF1ZXVlKHttZXRob2Q6XCJERVNDUklCRVwifSk7ZWxzZSBpZih0aGlzLl9zdGF0ZT09PVwicGF1c2VkXCIpe2lmKHRoaXMuX3Nlc3Npb25JZD09PW51bGx8fHRoaXMuX3Nlc3Npb25JZD09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJydHNwOiBpbnRlcm5hbCBlcnJvclwiKTt0aGlzLl9lbnF1ZXVlKHttZXRob2Q6XCJQTEFZXCIsaGVhZGVyczp7U2Vzc2lvbjp0aGlzLl9zZXNzaW9uSWR9LHVyaTp0aGlzLl9zZXNzaW9uQ29udHJvbFVSTH0pfXRoaXMuX3N0YXRlPVwicGxheWluZ1wiLHRoaXMuX2RlcXVldWUoKX1wYXVzZSgpe3RoaXMuX2VucXVldWUoe21ldGhvZDpcIlBBVVNFXCJ9KSx0aGlzLl9zdGF0ZT1cInBhdXNlZFwiLHRoaXMuX2RlcXVldWUoKX1zdG9wKCl7dGhpcy5fc2Vzc2lvbklkP3RoaXMuX2VucXVldWUoe21ldGhvZDpcIlRFQVJET1dOXCJ9KTp0aGlzLl9jYWxsU3RhY2s9W10sdGhpcy5fc3RhdGU9XCJpZGxlXCIsdGhpcy5fcmVuZXdTZXNzaW9uSW50ZXJ2YWwhPT1udWxsJiYoY2xlYXJJbnRlcnZhbCh0aGlzLl9yZW5ld1Nlc3Npb25JbnRlcnZhbCksdGhpcy5fcmVuZXdTZXNzaW9uSW50ZXJ2YWw9bnVsbCksdGhpcy5fZGVxdWV1ZSgpfXNlbmQodCl7bGV0e21ldGhvZDpuLGhlYWRlcnM6aSx1cmk6b309dDtpZihuPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcIm1pc3NpbmcgbWV0aG9kIHdoZW4gc2VuZCByZXF1ZXN0XCIpO2lmKHRoaXMuX3dhaXRpbmc9ITAsdGhpcy5yZXRyeT10aGlzLnNlbmQuYmluZCh0aGlzLHQpLHRoaXMuX3NlcXVlbmNlPT09dm9pZCAwfHx0aGlzLmhlYWRlcnM9PT12b2lkIDB8fHRoaXMuX2NhbGxIaXN0b3J5PT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcInJ0c3A6IGludGVybmFsIGVycm9yXCIpO2xldCBzPU9iamVjdC5hc3NpZ24oe3R5cGU6NCx1cmk6b3x8dGhpcy5fc2Vzc2lvbkNvbnRyb2xVUkwsZGF0YTpCdWZmZXIuYWxsb2MoMCl9LHttZXRob2Q6bixoZWFkZXJzOml9LHtoZWFkZXJzOk9iamVjdC5hc3NpZ24oe0NTZXE6dGhpcy5fc2VxdWVuY2UrK30sdGhpcy5kZWZhdWx0SGVhZGVycyx0aGlzLmhlYWRlcnNbbl0saSl9KTt0aGlzLl9zZXNzaW9uSWQmJihzLmhlYWRlcnMuU2Vzc2lvbj10aGlzLl9zZXNzaW9uSWQpLHRoaXMuX2NhbGxIaXN0b3J5LnB1c2gobiksdGhpcy5fb3V0Z29pbmdDbG9zZWQ/KDAsa3IuZGVmYXVsdCkoXCJtc2w6cnRzcDpvdXRnb2luZ1wiKShgVW5hYmxlIHRvIHNlbmQgJHtufSwgY29ubmVjdGlvbiBjbG9zZWRgKTp0aGlzLm91dGdvaW5nLnB1c2gocyl9X2VucXVldWUodCl7aWYodGhpcy5fY2FsbFN0YWNrPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcInJ0c3A6IGludGVybmFsIGVycm9yXCIpO3RoaXMuX2NhbGxTdGFjay5wdXNoKHQpfV9kZXF1ZXVlKCl7aWYodGhpcy5fY2FsbFN0YWNrPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcInJ0c3A6IGludGVybmFsIGVycm9yXCIpO2lmKCF0aGlzLl93YWl0aW5nJiZ0aGlzLl9jYWxsU3RhY2subGVuZ3RoPjApe2xldCB0PXRoaXMuX2NhbGxTdGFjay5zaGlmdCgpO3QhPT12b2lkIDAmJnRoaXMuc2VuZCh0KX19fTtjKCk7dmFyIFVyPUMobGUoKSk7dmFyIERyPUMoTigpKTtjKCk7dmFyIFFjPTEwMDA3LFpjPShyPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGU9d2luZG93LmxvY2F0aW9uLnByb3RvY29sKT0+KHt1cmk6YCR7ZT09PVwiaHR0cHM6XCI/XCJ3c3M6XCI6XCJ3czpcIn0vLyR7cn0vcnRzcC1vdmVyLXdlYnNvY2tldGAsdG9rZW5Vcmk6YCR7ZX0vLyR7cn0vYXhpcy1jZ2kvcnRzcHdzc2Vzc2lvbi5jZ2lgLHByb3RvY29sOlwiYmluYXJ5XCIsdGltZW91dDpRY30pLHRhPWFzeW5jKHI9e30pPT57bGV0e3VyaTplLHRva2VuVXJpOnQscHJvdG9jb2w6bix0aW1lb3V0Oml9PWd0KFpjKHIuaG9zdCxyLnNjaGVtZSkscik7aWYoZT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJ3czogaW50ZXJuYWwgZXJyb3JcIik7cmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChvLHMpPT57dHJ5e2xldCBhPW5ldyBXZWJTb2NrZXQoZSxuKSx1PXNldFRpbWVvdXQoKCk9PntjbGVhclRpbWVvdXQodSksYS5yZWFkeVN0YXRlPT09V2ViU29ja2V0LkNPTk5FQ1RJTkcmJihhLm9uZXJyb3I9bnVsbCxzKG5ldyBFcnJvcihcIndlYnNvY2tldCBjb25uZWN0aW9uIHRpbWVkIG91dFwiKSkpfSxpKTthLmJpbmFyeVR5cGU9XCJhcnJheWJ1ZmZlclwiLGEub25lcnJvcj1mPT57Y2xlYXJUaW1lb3V0KHUpO2Z1bmN0aW9uIGwoKXtpZih0aGlzLnN0YXR1cz49NDAwKXtjb25zb2xlLndhcm4oXCJmYWlsZWQgdG8gbG9hZCB0b2tlblwiLHRoaXMuc3RhdHVzLHRoaXMucmVzcG9uc2VUZXh0KSxzKGYpO3JldHVybn1sZXQgaD10aGlzLnJlc3BvbnNlVGV4dC50cmltKCksbT1gJHtlfT9ydHNwd3NzZXNzaW9uPSR7aH1gLGI9bmV3IFdlYlNvY2tldChtLG4pO2IuYmluYXJ5VHlwZT1cImFycmF5YnVmZmVyXCIsYi5vbmVycm9yPXk9PntzKHkpfSxiLm9ub3Blbj0oKT0+byhiKX1sZXQgZD1uZXcgWE1MSHR0cFJlcXVlc3Q7ZC5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLGwpLGQuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsaD0+e2NvbnNvbGUud2FybihcImZhaWxlZCB0byBnZXQgdG9rZW5cIikscyhoKX0pLGQuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsKCk9PnMoZikpLGQub3BlbihcIkdFVFwiLGAke3R9PyR7RGF0ZS5ub3coKX1gKTt0cnl7ZC5zZW5kKCl9Y2F0Y2h7cyhmKX19LGEub25vcGVuPSgpPT57Y2xlYXJUaW1lb3V0KHUpLG8oYSl9fWNhdGNoKGEpe3MoYSl9fSl9O3ZhciBlbD0xMDAxLEc9Y2xhc3MgZXh0ZW5kcyBWe2NvbnN0cnVjdG9yKHQpe2lmKHQ9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwic29ja2V0IGFyZ3VtZW50IG1pc3NpbmdcIik7bGV0IG49bmV3IERyLlJlYWRhYmxlKHtvYmplY3RNb2RlOiEwLHJlYWQ6ZnVuY3Rpb24oKXt9fSk7dC5vbm1lc3NhZ2U9bz0+e2xldCBzPUJ1ZmZlci5mcm9tKG8uZGF0YSk7bi5wdXNoKHtkYXRhOnMsdHlwZToxfSl8fHQucmVhZHlTdGF0ZT09PVdlYlNvY2tldC5PUEVOJiYoKDAsVXIuZGVmYXVsdCkoXCJtc2w6d2Vic29ja2V0OmluY29taW5nXCIpKFwiZG93bnN0cmVhbSBmcm96ZW5cIiksdC5jbG9zZSgpKX0sbi5vbihcImVycm9yXCIsbz0+e2NvbnNvbGUud2FybihcImNsb3Npbmcgc29ja2V0IGR1ZSB0byBpbmNvbWluZyBlcnJvclwiLG8pLHQuY2xvc2UoKX0pO2xldCBpPW5ldyBEci5Xcml0YWJsZSh7b2JqZWN0TW9kZTohMCx3cml0ZTpmdW5jdGlvbihvLHMsYSl7dHJ5e3Quc2VuZChvLmRhdGEpfWNhdGNoe2NvbnNvbGUud2FybihcIm1lc3NhZ2UgbG9zdCBkdXJpbmcgc2VuZDpcIixvKX1hKCl9fSk7aS5vbihcImVycm9yXCIsbz0+e2NvbnNvbGUud2FybihcImVycm9yIGR1cmluZyB3ZWJzb2NrZXQgc2VuZCwgaWdub3Jpbmc6XCIsbyl9KSxpLm9uKFwiZmluaXNoXCIsKCk9PnsoMCxVci5kZWZhdWx0KShcIm1zbDp3ZWJzb2NrZXQ6b3V0Z29pbmdcIikoXCJmaW5pc2hcIiksdC5yZWFkeVN0YXRlIT09V2ViU29ja2V0LkNMT1NFRCYmdC5jbG9zZSgpfSksdC5vbmNsb3NlPW89PnsoMCxVci5kZWZhdWx0KShcIm1zbDp3ZWJzb2NrZXQ6Y2xvc2VcIikoYCR7by5jb2RlfWApLG8uY29kZT09PWVsJiZ0aGlzLm9uU2VydmVyQ2xvc2UmJnRoaXMub25TZXJ2ZXJDbG9zZSgpLG4ucHVzaChudWxsKSxpLmVuZCgpfTtzdXBlcihuLGkpfXN0YXRpYyBhc3luYyBvcGVuKHQpe3JldHVybiBhd2FpdCB0YSh0KS50aGVuKG49Pm5ldyBHKG4pKX19O3ZhciBuaT17fTtQdChuaSx7SHRtbDVDYW52YXNQaXBlbGluZTooKT0+SHIsSHRtbDVWaWRlb01ldGFkYXRhUGlwZWxpbmU6KCk9PnFyLEh0bWw1VmlkZW9QaXBlbGluZTooKT0+X3QsSHR0cE1zZVBpcGVsaW5lOigpPT5HcixNZXRhZGF0YVBpcGVsaW5lOigpPT5qcixQaXBlbGluZTooKT0+QmUsUnRzcE1qcGVnUGlwZWxpbmU6KCk9Pnh0LFJ0c3BNcDRQaXBlbGluZTooKT0+YnQsUnRzcFBpcGVsaW5lOigpPT5lZSxXc1NkcFBpcGVsaW5lOigpPT5Xcn0pO2MoKTtjKCk7dmFyIEJlPWNsYXNze2NvbnN0cnVjdG9yKC4uLmUpe2xldFt0LC4uLm5dPWU7dGhpcy5fc2V0PW5ldyBTZXQoZSksdGhpcy5maXJzdENvbXBvbmVudD10LHRoaXMubGFzdENvbXBvbmVudD1uLnJlZHVjZSgoaSxvKT0+aS5jb25uZWN0KG8pLHQpfWluaXQoLi4uZSl7bGV0W3QsLi4ubl09ZTt0aGlzLl9zZXQ9bmV3IFNldChlKSx0aGlzLmZpcnN0Q29tcG9uZW50PXQsdGhpcy5sYXN0Q29tcG9uZW50PW4ucmVkdWNlKChpLG8pPT5pLmNvbm5lY3QobyksdCl9aW5zZXJ0QWZ0ZXIoZSx0KXtpZighdGhpcy5fc2V0LmhhcyhlKSl0aHJvdyBuZXcgRXJyb3IoXCJpbnNlcnRpb24gcG9pbnQgbm90IHBhcnQgb2YgcGlwZWxpbmVcIik7aWYodGhpcy5fc2V0Lmhhcyh0KSl0aHJvdyBuZXcgRXJyb3IoXCJuZXcgY29tcG9uZW50IGFscmVhZHkgaW4gdGhlIHBpcGVsaW5lXCIpO2xldCBuPWUubmV4dDtyZXR1cm4gbj09PW51bGw/KGUuY29ubmVjdCh0KSx0aGlzLmxhc3RDb21wb25lbnQ9dCk6KGUuZGlzY29ubmVjdCgpLGUuY29ubmVjdCh0KS5jb25uZWN0KG4pKSx0aGlzLl9zZXQuYWRkKHQpLHRoaXN9aW5zZXJ0QmVmb3JlKGUsdCl7aWYoIXRoaXMuX3NldC5oYXMoZSkpdGhyb3cgbmV3IEVycm9yKFwiaW5zZXJ0aW9uIHBvaW50IG5vdCBwYXJ0IG9mIHBpcGVsaW5lXCIpO2lmKHRoaXMuX3NldC5oYXModCkpdGhyb3cgbmV3IEVycm9yKFwibmV3IGNvbXBvbmVudCBhbHJlYWR5IGluIHRoZSBwaXBlbGluZVwiKTtsZXQgbj1lLnByZXY7cmV0dXJuIG49PT1udWxsPyh0LmNvbm5lY3QoZSksdGhpcy5maXJzdENvbXBvbmVudD10KToobi5kaXNjb25uZWN0KCksbi5jb25uZWN0KHQpLmNvbm5lY3QoZSkpLHRoaXMuX3NldC5hZGQodCksdGhpc31yZW1vdmUoZSl7aWYoIXRoaXMuX3NldC5oYXMoZSkpdGhyb3cgbmV3IEVycm9yKFwiY29tcG9uZW50IG5vdCBwYXJ0IG9mIHBpcGVsaW5lXCIpO2xldCB0PWUucHJldixuPWUubmV4dDtpZih0PT09bnVsbCYmbj09PW51bGwpdGhyb3cgbmV3IEVycm9yKFwiY2Fubm90IHJlbW92ZSBsYXN0IGNvbXBvbmVudFwiKTtyZXR1cm4gdD09PW51bGwmJm4hPT1udWxsPyhlLmRpc2Nvbm5lY3QoKSx0aGlzLmZpcnN0Q29tcG9uZW50PW4pOnQhPT1udWxsJiZuPT09bnVsbD8odC5kaXNjb25uZWN0KCksdGhpcy5sYXN0Q29tcG9uZW50PXQpOnQhPT1udWxsJiZuIT09bnVsbCYmKHQuZGlzY29ubmVjdCgpLGUuZGlzY29ubmVjdCgpLHQuY29ubmVjdChuKSksdGhpcy5fc2V0LmRlbGV0ZShlKSx0aGlzfWFwcGVuZCguLi5lKXtyZXR1cm4gZS5mb3JFYWNoKHQ9Pnt0aGlzLmluc2VydEFmdGVyKHRoaXMubGFzdENvbXBvbmVudCx0KX0pLHRoaXN9cHJlcGVuZCguLi5lKXtyZXR1cm4gZS5mb3JFYWNoKHQ9Pnt0aGlzLmluc2VydEJlZm9yZSh0aGlzLmZpcnN0Q29tcG9uZW50LHQpfSksdGhpc319O2MoKTt2YXIgZWU9Y2xhc3MgZXh0ZW5kcyBCZXtjb25zdHJ1Y3Rvcih0KXtsZXQgbj1uZXcgbXQsaT1uZXcgeXQodCk7aS5vblNkcD1vPT57dGhpcy5vblNkcCYmdGhpcy5vblNkcChvKX0saS5vblBsYXk9bz0+e3RoaXMub25QbGF5JiZ0aGlzLm9uUGxheShvKX07c3VwZXIobixpKTt0aGlzLnJ0c3A9aX19O2MoKTt2YXIgYnQ9Y2xhc3MgZXh0ZW5kcyBlZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTtsZXQgbj1uZXcgY3QsaT1uZXcgb3Qsbz1uZXcgcHQ7by5vblN5bmM9cz0+e3RoaXMub25TeW5jJiZ0aGlzLm9uU3luYyhzKX0sdGhpcy5hcHBlbmQobixpLG8pLHRoaXMuX21wNE11eGVyPW99Z2V0IGJpdHJhdGUoKXtyZXR1cm4gdGhpcy5fbXA0TXV4ZXIuYml0cmF0ZX1nZXQgZnJhbWVyYXRlKCl7cmV0dXJuIHRoaXMuX21wNE11eGVyLmZyYW1lcmF0ZX19O2MoKTt2YXIgeHQ9Y2xhc3MgZXh0ZW5kcyBlZXtjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtsZXQgdD1uZXcgbHQ7dGhpcy5hcHBlbmQodCl9fTtjKCk7YygpO2MoKTt2YXIgTWU9QyhuYSgpKSxOcj1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy5uYz0oKT0+KCsrdGhpcy5jb3VudCx0aGlzLmNvdW50LnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LFwiMFwiKSk7dGhpcy5jbm9uY2U9KCk9Pm5ldyBBcnJheSg0KS5maWxsKDApLm1hcCgoKT0+TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjI1NikpLm1hcChlPT5lLnRvU3RyaW5nKDE2KSkuam9pbihcIlwiKTt0aGlzLmhhMT1lPT57bGV0IHQ9dGhpcy5oYTFCYXNlO3JldHVybiB0aGlzLmFsZ29yaXRobT09PVwibWQ1LXNlc3NcIiYmKHQ9bmV3IE1lLk1kNSgpLmFwcGVuZFN0cihgJHt0fToke3RoaXMubm9uY2V9OiR7ZX1gKS5lbmQoKS50b1N0cmluZygpKSx0fTt0aGlzLmhhMj0oZSx0LG49XCJcIik9PntsZXQgaT1uZXcgTWUuTWQ1KCkuYXBwZW5kU3RyKGAke2V9OiR7dH1gKS5lbmQoKS50b1N0cmluZygpO2lmKHRoaXMuYWxnb3JpdGhtPT09XCJtZDUtc2Vzc1wiKXtsZXQgbz1uZXcgTWUuTWQ1KCkuYXBwZW5kU3RyKG4pLmVuZCgpLnRvU3RyaW5nKCk7aT1uZXcgTWUuTWQ1KCkuYXBwZW5kU3RyKGAke2V9OiR7dH06JHtvfWApLmVuZCgpLnRvU3RyaW5nKCl9cmV0dXJuIGl9O3RoaXMuYXV0aG9yaXphdGlvbj0oZT1cIkdFVFwiLHQ9XCJcIixuKT0+e2xldCBpPXRoaXMubmMoKSxvPXRoaXMuY25vbmNlKCkscz10aGlzLmhhMShvKSxhPXRoaXMuaGEyKGUsdCxuKSx1PXRoaXMucW9wPT09dm9pZCAwP25ldyBNZS5NZDUoKS5hcHBlbmRTdHIoYCR7c306JHt0aGlzLm5vbmNlfToke2F9YCkuZW5kKCkudG9TdHJpbmcoKTpuZXcgTWUuTWQ1KCkuYXBwZW5kU3RyKGAke3N9OiR7dGhpcy5ub25jZX06JHtpfToke299OiR7dGhpcy5xb3B9OiR7YX1gKS5lbmQoKS50b1N0cmluZygpLGY9W107cmV0dXJuIGYucHVzaChgdXNlcm5hbWU9XCIke3RoaXMudXNlcm5hbWV9XCJgKSxmLnB1c2goYHJlYWxtPVwiJHt0aGlzLnJlYWxtfVwiYCksZi5wdXNoKGBub25jZT1cIiR7dGhpcy5ub25jZX1cImApLGYucHVzaChgdXJpPVwiJHt0fVwiYCksdGhpcy5xb3AhPT12b2lkIDAmJihmLnB1c2goYHFvcD0ke3RoaXMucW9wfWApLGYucHVzaChgbmM9JHtpfWApLGYucHVzaChgY25vbmNlPVwiJHtvfVwiYCkpLGYucHVzaChgcmVzcG9uc2U9XCIke3V9XCJgKSx0aGlzLm9wYXF1ZSE9PXZvaWQgMCYmZi5wdXNoKGBvcGFxdWU9XCIke3RoaXMub3BhcXVlfVwiYCksYERpZ2VzdCAke2Yuam9pbihcIiwgXCIpfWB9O2xldCBpPWUuZ2V0KFwicmVhbG1cIik7aWYoaT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJubyByZWFsbSBpbiBkaWdlc3QgY2hhbGxlbmdlXCIpO3RoaXMucmVhbG09aSx0aGlzLmhhMUJhc2U9bmV3IE1lLk1kNSgpLmFwcGVuZFN0cihgJHt0fToke2l9OiR7bn1gKS5lbmQoKS50b1N0cmluZygpO2xldCBvPWUuZ2V0KFwibm9uY2VcIik7aWYobz09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJubyBub25jZSBpbiBkaWdlc3QgY2hhbGxlbmdlXCIpO3RoaXMubm9uY2U9byx0aGlzLm9wYXF1ZT1lLmdldChcIm9wYXF1ZVwiKTtsZXQgcz1lLmdldChcImFsZ29yaXRobVwiKTtzIT09dm9pZCAwP3M9PT1cIm1kNVwiP3RoaXMuYWxnb3JpdGhtPVwibWQ1XCI6cz09PVwibWQ1LXNlc3NcIiYmKHRoaXMuYWxnb3JpdGhtPVwibWQ1LXNlc3NcIik6dGhpcy5hbGdvcml0aG09XCJtZDVcIjtsZXQgYT1lLmdldChcInFvcFwiKTtpZihhIT09dm9pZCAwKXtsZXQgdT1hLnNwbGl0KFwiLFwiKS5tYXAoZj0+Zi50cmltKCkpO3Uuc29tZShmPT5mPT09XCJhdXRoXCIpP3RoaXMucW9wPVwiYXV0aFwiOnUuc29tZShmPT5mPT09XCJhdXRoLWludFwiKSYmKHRoaXMucW9wPVwiYXV0aC1pbnRcIil9dGhpcy5jb3VudD0wLHRoaXMudXNlcm5hbWU9dH19O2MoKTt2YXIgaWE9cj0+e2xldFssZSwuLi50XT1yLnNwbGl0KFwiIFwiKSxuPVtdLGk9L1xccyooW149XSspPVwiKFteXCJdKilcIiw/L2dtLG87ZG8gaWYobz1pLmV4ZWModC5qb2luKFwiIFwiKSksbyE9PW51bGwpe2xldFssYSx1XT1vO24ucHVzaChbYSx1XSl9d2hpbGUobyE9PW51bGwpO2xldCBzPW5ldyBNYXAobik7cmV0dXJue3R5cGU6ZS50b0xvd2VyQ2FzZSgpLHBhcmFtczpzfX07dmFyIHRsPTQwMSxybD17dXNlcm5hbWU6XCJyb290XCIscGFzc3dvcmQ6XCJwYXNzXCJ9LExlPWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3RvcihlPXt9KXtsZXR7dXNlcm5hbWU6dCxwYXNzd29yZDpufT1ndChybCxlKTtpZih0PT09dm9pZCAwfHxuPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcIm5lZWQgdXNlcm5hbWUgYW5kIHBhc3N3b3JkXCIpO2xldCBpLG8scz15ZShmdW5jdGlvbih1LGYsbCl7dS50eXBlPT09NCYmKGk9dSxvJiZ1LmhlYWRlcnMmJih1LmhlYWRlcnMuQXV0aG9yaXphdGlvbj1vKSksbCh2b2lkIDAsdSl9KSxhPXllKGZ1bmN0aW9uKHUsZixsKXtpZih1LnR5cGU9PT00JiZodCh1LmRhdGEpPT09dGwpe2xldCBoPXUuZGF0YS50b1N0cmluZygpLnNwbGl0KGBcbmApLmZpbmQoYj0+L1dXVy1BdXRoL2kudGVzdChiKSk7aWYoaD09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJjYW5ub3QgZmluZCBXV1ctQXV0aGVudGljYXRlIGhlYWRlclwiKTtsZXQgbT1pYShoKTtpZihtLnR5cGU9PT1cImJhc2ljXCIpbz1cIkJhc2ljIFwiK0J1ZmZlci5mcm9tKHQrXCI6XCIrbikudG9TdHJpbmcoXCJiYXNlNjRcIik7ZWxzZSBpZihtLnR5cGU9PT1cImRpZ2VzdFwiKW89bmV3IE5yKG0ucGFyYW1zLHQsbikuYXV0aG9yaXphdGlvbihpLm1ldGhvZCxpLnVyaSk7ZWxzZSByZXR1cm47cy53cml0ZShpLCgpPT5sKCkpfWVsc2UgbCh2b2lkIDAsdSl9KTtzdXBlcihhLHMpfX07dmFyIEhyPWNsYXNzIGV4dGVuZHMgeHR7Y29uc3RydWN0b3IodCl7bGV0e3dzOm4scnRzcDppLG1lZGlhRWxlbWVudDpvLGF1dGg6c309dDtzdXBlcihpKTtpZihzKXtsZXQgZj1uZXcgTGUocyk7dGhpcy5pbnNlcnRCZWZvcmUodGhpcy5ydHNwLGYpfWxldCBhPW5ldyBzdChvKTthLm9uQ2FucGxheT0oKT0+e2EucGxheSgpLHRoaXMub25DYW5wbGF5JiZ0aGlzLm9uQ2FucGxheSgpfSxhLm9uU3luYz1mPT57dGhpcy5vblN5bmMmJnRoaXMub25TeW5jKGYpfSx0aGlzLmFwcGVuZChhKSx0aGlzLl9zaW5rPWE7bGV0IHU9Ry5vcGVuKG4pO3RoaXMucmVhZHk9dS50aGVuKGY9PntmLm9uU2VydmVyQ2xvc2U9KCk9Pnt0aGlzLm9uU2VydmVyQ2xvc2UmJnRoaXMub25TZXJ2ZXJDbG9zZSgpfSx0aGlzLnByZXBlbmQoZiksdGhpcy5fc3JjPWZ9KX1jbG9zZSgpe3RoaXMuX3NyYyYmdGhpcy5fc3JjLm91dGdvaW5nLmVuZCgpfWdldCBjdXJyZW50VGltZSgpe3JldHVybiB0aGlzLl9zaW5rLmN1cnJlbnRUaW1lfXBsYXkoKXtyZXR1cm4gdGhpcy5fc2luay5wbGF5KCl9cGF1c2UoKXtyZXR1cm4gdGhpcy5fc2luay5wYXVzZSgpfWdldCBiaXRyYXRlKCl7cmV0dXJuIHRoaXMuX3NpbmsuYml0cmF0ZX1nZXQgZnJhbWVyYXRlKCl7cmV0dXJuIHRoaXMuX3NpbmsuZnJhbWVyYXRlfX07YygpO3ZhciBfdD1jbGFzcyBleHRlbmRzIGJ0e2NvbnN0cnVjdG9yKHQpe2xldHt3czpuLHJ0c3A6aSxtZWRpYUVsZW1lbnQ6byxhdXRoOnN9PXQ7c3VwZXIoaSk7aWYocyl7bGV0IGY9bmV3IExlKHMpO3RoaXMuaW5zZXJ0QmVmb3JlKHRoaXMucnRzcCxmKX1sZXQgYT1uZXcgVGUobyk7YS5vblNvdXJjZU9wZW49KGYsbCk9Pnt0aGlzLnRyYWNrcz1sLHRoaXMub25Tb3VyY2VPcGVuJiZ0aGlzLm9uU291cmNlT3BlbihmLGwpfSx0aGlzLmFwcGVuZChhKSx0aGlzLl9zaW5rPWE7bGV0IHU9Ry5vcGVuKG4pO3RoaXMucmVhZHk9dS50aGVuKGY9PntmLm9uU2VydmVyQ2xvc2U9KCk9Pnt0aGlzLm9uU2VydmVyQ2xvc2UmJnRoaXMub25TZXJ2ZXJDbG9zZSgpfSx0aGlzLnByZXBlbmQoZiksdGhpcy5fc3JjPWZ9KX1jbG9zZSgpe3RoaXMuX3NyYyYmdGhpcy5fc3JjLm91dGdvaW5nLmVuZCgpfWdldCBjdXJyZW50VGltZSgpe3JldHVybiB0aGlzLl9zaW5rLmN1cnJlbnRUaW1lfWFzeW5jIHBsYXkoKXtyZXR1cm4gYXdhaXQgdGhpcy5fc2luay5wbGF5KCl9cGF1c2UoKXtyZXR1cm4gdGhpcy5fc2luay5wYXVzZSgpfX07YygpO3ZhciBxcj1jbGFzcyBleHRlbmRzIF90e2NvbnN0cnVjdG9yKGUpe2xldHttZXRhZGF0YUhhbmRsZXI6dH09ZTtzdXBlcihlKTtsZXQgbj1uZXcgQ2U7dGhpcy5pbnNlcnRBZnRlcih0aGlzLnJ0c3Asbik7bGV0IGk9Ui5mcm9tSGFuZGxlcnMobz0+e28udHlwZT09PTkmJnQobyl9LHZvaWQgMCk7dGhpcy5pbnNlcnRBZnRlcihuLGkpfX07YygpO3ZhciBubD17cGFyYW1ldGVyczpbXCJhdWRpbz0wXCIsXCJ2aWRlbz0wXCIsXCJldmVudD1vblwiLFwicHR6PWFsbFwiXX0sanI9Y2xhc3MgZXh0ZW5kcyBlZXtjb25zdHJ1Y3Rvcih0KXtsZXR7d3M6bixydHNwOmksbWV0YWRhdGFIYW5kbGVyOm99PXQ7c3VwZXIoT2JqZWN0LmFzc2lnbih7fSxubCxpKSk7bGV0IHM9bmV3IENlO3RoaXMuYXBwZW5kKHMpO2xldCBhPVEuZnJvbUhhbmRsZXIoZj0+e2YudHlwZT09PTkmJm8oZil9KTt0aGlzLmFwcGVuZChhKTtsZXQgdT1HLm9wZW4obik7dGhpcy5yZWFkeT11LnRoZW4oZj0+e2Yub25TZXJ2ZXJDbG9zZT0oKT0+e3RoaXMub25TZXJ2ZXJDbG9zZSYmdGhpcy5vblNlcnZlckNsb3NlKCl9LHRoaXMucHJlcGVuZChmKSx0aGlzLl9zcmM9Zn0pfWNsb3NlKCl7dGhpcy5fc3JjJiZ0aGlzLl9zcmMub3V0Z29pbmcuZW5kKCl9fTtjKCk7dmFyIFdyPWNsYXNzIGV4dGVuZHMgZWV7Y29uc3RydWN0b3IodCl7bGV0e3dzOm4scnRzcDppLGF1dGg6b309dDtzdXBlcihpKTtpZihvKXtsZXQgYT1uZXcgTGUobyk7dGhpcy5pbnNlcnRCZWZvcmUodGhpcy5ydHNwLGEpfWxldCBzPUcub3BlbihuKTt0aGlzLnJlYWR5PXMudGhlbihhPT57YS5vblNlcnZlckNsb3NlPSgpPT57dGhpcy5vblNlcnZlckNsb3NlJiZ0aGlzLm9uU2VydmVyQ2xvc2UoKX0sdGhpcy5wcmVwZW5kKGEpLHRoaXMuX3NyYz1hfSl9Y2xvc2UoKXt0aGlzLl9zcmMmJnRoaXMuX3NyYy5vdXRnb2luZy5lbmQoKX1nZXQgc2RwKCl7cmV0dXJuIHRoaXMucmVhZHkudGhlbihhc3luYygpPT57bGV0IHQ9bmV3IFByb21pc2Uobj0+e3RoaXMucnRzcC5vblNkcD1ufSk7cmV0dXJuIHRoaXMucnRzcC5zZW5kKHttZXRob2Q6XCJERVNDUklCRVwifSksdGhpcy5ydHNwLnNlbmQoe21ldGhvZDpcIlRFQVJET1dOXCJ9KSxhd2FpdCB0fSl9fTtjKCk7YygpO3ZhciBvYT1DKGxlKCkpO3ZhciBzYT1DKE4oKSk7dmFyIHJpPSgwLG9hLmRlZmF1bHQpKFwibXNsOmh0dHAtbXA0XCIpLCRyPWNsYXNzIGV4dGVuZHMgVntjb25zdHJ1Y3Rvcih0KXtsZXR7dXJpOm4sb3B0aW9uczppfT10LG89bmV3IHNhLlJlYWRhYmxlKHtvYmplY3RNb2RlOiEwLHJlYWQ6ZnVuY3Rpb24oKXt9fSk7by5vbihcImVycm9yXCIscz0+e2NvbnNvbGUud2FybihcImNsb3Npbmcgc29ja2V0IGR1ZSB0byBpbmNvbWluZyBlcnJvclwiLHMpLHRoaXMuX3JlYWRlciYmdGhpcy5fcmVhZGVyLmNhbmNlbCgpfSk7c3VwZXIobyk7by5fcmVhZD0oKT0+e3RoaXMuX3B1bGwoKX0sdGhpcy51cmk9bix0aGlzLm9wdGlvbnM9aSx0aGlzLl9hbGxEb25lPSExfXBsYXkoKXtpZih0aGlzLnVyaT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJjYW5ub3Qgc3RhcnQgcGxheWluZyB3aGVuIHRoZXJlIGlzIG5vIFVSSVwiKTt0aGlzLl9hYm9ydENvbnRyb2xsZXI9bmV3IEFib3J0Q29udHJvbGxlcix0aGlzLmxlbmd0aD0wLGZldGNoKHRoaXMudXJpLHtjcmVkZW50aWFsczpcImluY2x1ZGVcIixzaWduYWw6dGhpcy5fYWJvcnRDb250cm9sbGVyLnNpZ25hbCwuLi50aGlzLm9wdGlvbnN9KS50aGVuKHQ9PntpZih0LmJvZHk9PT1udWxsKXRocm93IG5ldyBFcnJvcihcImVtcHR5IHJlc3BvbnNlIGJvZHlcIik7bGV0IG49dC5oZWFkZXJzLmdldChcIkNvbnRlbnQtVHlwZVwiKTt0aGlzLmluY29taW5nLnB1c2goe2RhdGE6QnVmZmVyLmFsbG9jKDApLHR5cGU6OCxtaW1lOm59KSx0aGlzLm9uSGVhZGVycyYmdGhpcy5vbkhlYWRlcnModC5oZWFkZXJzKSx0aGlzLl9yZWFkZXI9dC5ib2R5LmdldFJlYWRlcigpLHRoaXMuX3B1bGwoKX0pLmNhdGNoKHQ9Pntjb25zb2xlLmVycm9yKFwiaHR0cC1zb3VyY2U6IGZldGNoIGZhaWxlZDogXCIsdCl9KX1hYm9ydCgpe3RoaXMuX3JlYWRlciYmdGhpcy5fcmVhZGVyLmNhbmNlbCgpLmNhdGNoKHQ9Pntjb25zb2xlLmxvZyhcImh0dHAtc291cmNlOiBjYW5jZWwgcmVhZGVyIGZhaWxlZDogXCIsdCl9KSx0aGlzLl9hYm9ydENvbnRyb2xsZXImJnRoaXMuX2Fib3J0Q29udHJvbGxlci5hYm9ydCgpfV9pc0Nsb3NlZCgpe3JldHVybiB0aGlzLl9hbGxEb25lfV9jbG9zZSgpe3RoaXMuX3JlYWRlcj12b2lkIDAsdGhpcy5fYWxsRG9uZT0hMCx0aGlzLmluY29taW5nLnB1c2gobnVsbCksdGhpcy5vblNlcnZlckNsb3NlPy4oKX1fcHVsbCgpe3RoaXMuX3JlYWRlciE9PXZvaWQgMCYmdGhpcy5fcmVhZGVyLnJlYWQoKS50aGVuKCh7ZG9uZTp0LHZhbHVlOm59KT0+e2lmKHQpe3RoaXMuX2lzQ2xvc2VkKCl8fChyaShcImZldGNoIGNvbXBsZXRlZCwgdG90YWwgZG93bmxvYWRlZDogXCIsdGhpcy5sZW5ndGgsXCIgYnl0ZXNcIiksdGhpcy5fY2xvc2UoKSk7cmV0dXJufWlmKG49PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwiZXhwZWN0ZWQgdmFsdWUgdG8gYmUgZGVmaW5lZFwiKTtpZih0aGlzLmxlbmd0aD09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJleHBlY3RlZCBsZW5ndGggdG8gYmUgZGVmaW5lZFwiKTt0aGlzLmxlbmd0aCs9bi5sZW5ndGg7bGV0IGk9QnVmZmVyLmZyb20obik7dGhpcy5pbmNvbWluZy5wdXNoKHtkYXRhOmksdHlwZTo4fSk/dGhpcy5fcHVsbCgpOnJpKFwiZG93bnN0cmVhbSBiYWNrIHByZXNzdXJlOiBwYXVzaW5nIHJlYWRcIil9KS5jYXRjaCh0PT57cmkoXCJodHRwLXNvdXJjZTogcmVhZCBmYWlsZWQ6IFwiLHQpLHRoaXMuX2lzQ2xvc2VkKCl8fHRoaXMuX2Nsb3NlKCl9KX19O3ZhciBHcj1jbGFzcyBleHRlbmRzIEJle2NvbnN0cnVjdG9yKHQpe2xldHtodHRwOm4sbWVkaWFFbGVtZW50Oml9PXQsbz1uZXcgJHIobikscz1uZXcgVGUoaSk7by5vbkhlYWRlcnM9YT0+e3RoaXMub25IZWFkZXJzJiZ0aGlzLm9uSGVhZGVycyhhKX0sby5vblNlcnZlckNsb3NlPSgpPT50aGlzLm9uU2VydmVyQ2xvc2U/LigpO3N1cGVyKG8scyk7dGhpcy5fc3JjPW8sdGhpcy5fc2luaz1zLHRoaXMuaHR0cD1vfWNsb3NlKCl7dGhpcy5fc3JjJiZ0aGlzLl9zcmMuYWJvcnQoKX1nZXQgY3VycmVudFRpbWUoKXtyZXR1cm4gdGhpcy5fc2luay5jdXJyZW50VGltZX1hc3luYyBwbGF5KCl7cmV0dXJuIGF3YWl0IHRoaXMuX3NpbmsucGxheSgpfXBhdXNlKCl7cmV0dXJuIHRoaXMuX3NpbmsucGF1c2UoKX19O3ZhciBpaT17fTtQdChpaSx7UlRDUFBhY2tldFR5cGU6KCk9PktuLFNERVNJdGVtOigpPT5KbixTUjooKT0+SHMsU2NoZWR1bGVyOigpPT5XZSxhZGRSVFNQUmV0cnk6KCk9PmFhLGJvZHlPZmZzZXQ6KCk9PkFyLGNTcmM6KCk9Pm5zLGNTcmNDb3VudDooKT0+U2UsY29ubmVjdGlvbkVuZGVkOigpPT5Mcixjb250ZW50QmFzZTooKT0+QnIsY29udGVudExvY2F0aW9uOigpPT5NcixleHRIZWFkZXI6KCk9PmlzLGV4dEhlYWRlckxlbmd0aDooKT0+TXQsZXh0ZW5zaW9uOigpPT5vcixleHRyYWN0SGVhZGVyVmFsdWU6KCk9PnJlLGV4dHJhY3RVUklzOigpPT5KcyxnZXRUaW1lOigpPT5Qcixpc1J0Y3BBcHA6KCk9PiRzLGlzUnRjcEJ5ZTooKT0+d3IsaXNSdGNwUlI6KCk9PmpzLGlzUnRjcFNERVM6KCk9PldzLGlzUnRjcFNSOigpPT5fcixtYXJrZXI6KCk9PmNlLG1lc3NhZ2VGcm9tQnVmZmVyOigpPT5TcixwYWRkaW5nOigpPT5lcyxwYXJzZTooKT0+UW4scGFyc2VSdGNwOigpPT5YbixwYXlsb2FkOigpPT5aLHBheWxvYWRUeXBlOigpPT5PLHJhbmdlOigpPT5JcixydGNwTWVzc2FnZUZyb21CdWZmZXI6KCk9PnhyLHNTcmM6KCk9PnJzLHNlcXVlbmNlOigpPT5ScixzZXF1ZW5jZU51bWJlcjooKT0+dHMsc2Vzc2lvbklkOigpPT5UcixzZXNzaW9uVGltZW91dDooKT0+Q3Isc3RhdHVzQ29kZTooKT0+aHQsdGltZXN0YW1wOigpPT5ILHZlcnNpb246KCk9PlpvfSk7YygpO2MoKTtjKCk7dmFyIGFhPShyLHttYXhSZXRyaWVzOmUsZXJyb3JzOnR9PXttYXhSZXRyaWVzOjIwLGVycm9yczpbNTAzXX0pPT57bGV0IG49MCxpPXIub25FcnJvcjtyLm9uRXJyb3I9bz0+e2lmKGk/LihvKSwhIXQuaW5jbHVkZXMoby5jb2RlKSl7aWYoKG4rPTEpPmUpe2NvbnNvbGUubG9nKFwicmV0cnksIHRvbyBtYW55XCIsbixlKTtyZXR1cm59c2V0VGltZW91dCgoKT0+ci5yZXRyeT8uKCksbioxMDApfX19O1xuLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiEgaWVlZTc1NC4gQlNELTMtQ2xhdXNlIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqL1xuLyohIHNhZmUtYnVmZmVyLiBNSVQgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5janMuanMubWFwXG4iLCIndXNlIHN0cmljdCdcblxuZXhwb3J0cy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuZXhwb3J0cy50b0J5dGVBcnJheSA9IHRvQnl0ZUFycmF5XG5leHBvcnRzLmZyb21CeXRlQXJyYXkgPSBmcm9tQnl0ZUFycmF5XG5cbnZhciBsb29rdXAgPSBbXVxudmFyIHJldkxvb2t1cCA9IFtdXG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5XG5cbnZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXG5mb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICBsb29rdXBbaV0gPSBjb2RlW2ldXG4gIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaVxufVxuXG4vLyBTdXBwb3J0IGRlY29kaW5nIFVSTC1zYWZlIGJhc2U2NCBzdHJpbmdzLCBhcyBOb2RlLmpzIGRvZXMuXG4vLyBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jhc2U2NCNVUkxfYXBwbGljYXRpb25zXG5yZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldID0gNjJcbnJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2M1xuXG5mdW5jdGlvbiBnZXRMZW5zIChiNjQpIHtcbiAgdmFyIGxlbiA9IGI2NC5sZW5ndGhcblxuICBpZiAobGVuICUgNCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKVxuICB9XG5cbiAgLy8gVHJpbSBvZmYgZXh0cmEgYnl0ZXMgYWZ0ZXIgcGxhY2Vob2xkZXIgYnl0ZXMgYXJlIGZvdW5kXG4gIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2JlYXRnYW1taXQvYmFzZTY0LWpzL2lzc3Vlcy80MlxuICB2YXIgdmFsaWRMZW4gPSBiNjQuaW5kZXhPZignPScpXG4gIGlmICh2YWxpZExlbiA9PT0gLTEpIHZhbGlkTGVuID0gbGVuXG5cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IHZhbGlkTGVuID09PSBsZW5cbiAgICA/IDBcbiAgICA6IDQgLSAodmFsaWRMZW4gJSA0KVxuXG4gIHJldHVybiBbdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbl1cbn1cblxuLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChiNjQpIHtcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuICByZXR1cm4gKCh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCkgLSBwbGFjZUhvbGRlcnNMZW5cbn1cblxuZnVuY3Rpb24gX2J5dGVMZW5ndGggKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikge1xuICByZXR1cm4gKCh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCkgLSBwbGFjZUhvbGRlcnNMZW5cbn1cblxuZnVuY3Rpb24gdG9CeXRlQXJyYXkgKGI2NCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpXG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF1cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV1cblxuICB2YXIgYXJyID0gbmV3IEFycihfYnl0ZUxlbmd0aChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pKVxuXG4gIHZhciBjdXJCeXRlID0gMFxuXG4gIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgdmFyIGxlbiA9IHBsYWNlSG9sZGVyc0xlbiA+IDBcbiAgICA/IHZhbGlkTGVuIC0gNFxuICAgIDogdmFsaWRMZW5cblxuICB2YXIgaVxuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTgpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildIDw8IDYpIHxcbiAgICAgIHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDE2KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAyKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0KVxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMSkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyKVxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0IChudW0pIHtcbiAgcmV0dXJuIGxvb2t1cFtudW0gPj4gMTggJiAweDNGXSArXG4gICAgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDYgJiAweDNGXSArXG4gICAgbG9va3VwW251bSAmIDB4M0ZdXG59XG5cbmZ1bmN0aW9uIGVuY29kZUNodW5rICh1aW50OCwgc3RhcnQsIGVuZCkge1xuICB2YXIgdG1wXG4gIHZhciBvdXRwdXQgPSBbXVxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMykge1xuICAgIHRtcCA9XG4gICAgICAoKHVpbnQ4W2ldIDw8IDE2KSAmIDB4RkYwMDAwKSArXG4gICAgICAoKHVpbnQ4W2kgKyAxXSA8PCA4KSAmIDB4RkYwMCkgK1xuICAgICAgKHVpbnQ4W2kgKyAyXSAmIDB4RkYpXG4gICAgb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0KHRtcCkpXG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBmcm9tQnl0ZUFycmF5ICh1aW50OCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGhcbiAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG4gIHZhciBwYXJ0cyA9IFtdXG4gIHZhciBtYXhDaHVua0xlbmd0aCA9IDE2MzgzIC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsodWludDgsIGksIChpICsgbWF4Q2h1bmtMZW5ndGgpID4gbGVuMiA/IGxlbjIgOiAoaSArIG1heENodW5rTGVuZ3RoKSkpXG4gIH1cblxuICAvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG4gIGlmIChleHRyYUJ5dGVzID09PSAxKSB7XG4gICAgdG1wID0gdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAyXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCA0KSAmIDB4M0ZdICtcbiAgICAgICc9PSdcbiAgICApXG4gIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA9PT0gMikge1xuICAgIHRtcCA9ICh1aW50OFtsZW4gLSAyXSA8PCA4KSArIHVpbnQ4W2xlbiAtIDFdXG4gICAgcGFydHMucHVzaChcbiAgICAgIGxvb2t1cFt0bXAgPj4gMTBdICtcbiAgICAgIGxvb2t1cFsodG1wID4+IDQpICYgMHgzRl0gK1xuICAgICAgbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXSArXG4gICAgICAnPSdcbiAgICApXG4gIH1cblxuICByZXR1cm4gcGFydHMuam9pbignJylcbn1cbiIsIi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCdiYXNlNjQtanMnKVxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0JylcblxuZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuXG52YXIgS19NQVhfTEVOR1RIID0gMHg3ZmZmZmZmZlxuZXhwb3J0cy5rTWF4TGVuZ3RoID0gS19NQVhfTEVOR1RIXG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFByaW50IHdhcm5pbmcgYW5kIHJlY29tbWVuZCB1c2luZyBgYnVmZmVyYCB2NC54IHdoaWNoIGhhcyBhbiBPYmplY3RcbiAqICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIFdlIHJlcG9ydCB0aGF0IHRoZSBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGlmIHRoZSBhcmUgbm90IHN1YmNsYXNzYWJsZVxuICogdXNpbmcgX19wcm90b19fLiBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YFxuICogKFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4KS4gSUUgMTAgbGFja3Mgc3VwcG9ydFxuICogZm9yIF9fcHJvdG9fXyBhbmQgaGFzIGEgYnVnZ3kgdHlwZWQgYXJyYXkgaW1wbGVtZW50YXRpb24uXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gdHlwZWRBcnJheVN1cHBvcnQoKVxuXG5pZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gIGNvbnNvbGUuZXJyb3IoXG4gICAgJ1RoaXMgYnJvd3NlciBsYWNrcyB0eXBlZCBhcnJheSAoVWludDhBcnJheSkgc3VwcG9ydCB3aGljaCBpcyByZXF1aXJlZCBieSAnICtcbiAgICAnYGJ1ZmZlcmAgdjUueC4gVXNlIGBidWZmZXJgIHY0LnggaWYgeW91IHJlcXVpcmUgb2xkIGJyb3dzZXIgc3VwcG9ydC4nXG4gIClcbn1cblxuZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQgKCkge1xuICAvLyBDYW4gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWQ/XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gICAgYXJyLl9fcHJvdG9fXyA9IHsgX19wcm90b19fOiBVaW50OEFycmF5LnByb3RvdHlwZSwgZm9vOiBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9IH1cbiAgICByZXR1cm4gYXJyLmZvbygpID09PSA0MlxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlci5wcm90b3R5cGUsICdwYXJlbnQnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKHRoaXMpKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyXG4gIH1cbn0pXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIucHJvdG90eXBlLCAnb2Zmc2V0Jywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0aGlzKSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIHJldHVybiB0aGlzLmJ5dGVPZmZzZXRcbiAgfVxufSlcblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKGxlbmd0aCA+IEtfTUFYX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgXCInICsgbGVuZ3RoICsgJ1wiIGlzIGludmFsaWQgZm9yIG9wdGlvbiBcInNpemVcIicpXG4gIH1cbiAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2VcbiAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgYnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIGJ1ZlxufVxuXG4vKipcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgaGF2ZSB0aGVpclxuICogcHJvdG90eXBlIGNoYW5nZWQgdG8gYEJ1ZmZlci5wcm90b3R5cGVgLiBGdXJ0aGVybW9yZSwgYEJ1ZmZlcmAgaXMgYSBzdWJjbGFzcyBvZlxuICogYFVpbnQ4QXJyYXlgLCBzbyB0aGUgcmV0dXJuZWQgaW5zdGFuY2VzIHdpbGwgaGF2ZSBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgbWV0aG9kc1xuICogYW5kIHRoZSBgVWludDhBcnJheWAgbWV0aG9kcy4gU3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXRcbiAqIHJldHVybnMgYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogVGhlIGBVaW50OEFycmF5YCBwcm90b3R5cGUgcmVtYWlucyB1bm1vZGlmaWVkLlxuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgLy8gQ29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmdPck9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdUaGUgXCJzdHJpbmdcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLiBSZWNlaXZlZCB0eXBlIG51bWJlcidcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKGFyZylcbiAgfVxuICByZXR1cm4gZnJvbShhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuLy8gRml4IHN1YmFycmF5KCkgaW4gRVMyMDE2LiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL3B1bGwvOTdcbmlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wuc3BlY2llcyAhPSBudWxsICYmXG4gICAgQnVmZmVyW1N5bWJvbC5zcGVjaWVzXSA9PT0gQnVmZmVyKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIsIFN5bWJvbC5zcGVjaWVzLCB7XG4gICAgdmFsdWU6IG51bGwsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KVxufVxuXG5CdWZmZXIucG9vbFNpemUgPSA4MTkyIC8vIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25cblxuZnVuY3Rpb24gZnJvbSAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0KVxuICB9XG5cbiAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh2YWx1ZSlcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksICcgK1xuICAgICAgJ29yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHZhbHVlKVxuICAgIClcbiAgfVxuXG4gIGlmIChpc0luc3RhbmNlKHZhbHVlLCBBcnJheUJ1ZmZlcikgfHxcbiAgICAgICh2YWx1ZSAmJiBpc0luc3RhbmNlKHZhbHVlLmJ1ZmZlciwgQXJyYXlCdWZmZXIpKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCB0eXBlIG51bWJlcidcbiAgICApXG4gIH1cblxuICB2YXIgdmFsdWVPZiA9IHZhbHVlLnZhbHVlT2YgJiYgdmFsdWUudmFsdWVPZigpXG4gIGlmICh2YWx1ZU9mICE9IG51bGwgJiYgdmFsdWVPZiAhPT0gdmFsdWUpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWVPZiwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgdmFyIGIgPSBmcm9tT2JqZWN0KHZhbHVlKVxuICBpZiAoYikgcmV0dXJuIGJcblxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvUHJpbWl0aXZlICE9IG51bGwgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZVtTeW1ib2wudG9QcmltaXRpdmVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKFxuICAgICAgdmFsdWVbU3ltYm9sLnRvUHJpbWl0aXZlXSgnc3RyaW5nJyksIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aFxuICAgIClcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksICcgK1xuICAgICdvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSAnICsgKHR5cGVvZiB2YWx1ZSlcbiAgKVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEJ1ZmZlcihhcmcsIGVuY29kaW5nKSBidXQgdGhyb3dzIGEgVHlwZUVycm9yXG4gKiBpZiB2YWx1ZSBpcyBhIG51bWJlci5cbiAqIEJ1ZmZlci5mcm9tKHN0clssIGVuY29kaW5nXSlcbiAqIEJ1ZmZlci5mcm9tKGFycmF5KVxuICogQnVmZmVyLmZyb20oYnVmZmVyKVxuICogQnVmZmVyLmZyb20oYXJyYXlCdWZmZXJbLCBieXRlT2Zmc2V0WywgbGVuZ3RoXV0pXG4gKiovXG5CdWZmZXIuZnJvbSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBmcm9tKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbi8vIE5vdGU6IENoYW5nZSBwcm90b3R5cGUgKmFmdGVyKiBCdWZmZXIuZnJvbSBpcyBkZWZpbmVkIHRvIHdvcmthcm91bmQgQ2hyb21lIGJ1Zzpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL3B1bGwvMTQ4XG5CdWZmZXIucHJvdG90eXBlLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXkucHJvdG90eXBlXG5CdWZmZXIuX19wcm90b19fID0gVWludDhBcnJheVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgXCInICsgc2l6ZSArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFsbG9jIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIGlmIChzaXplIDw9IDApIHtcbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUpXG4gIH1cbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9ubHkgcGF5IGF0dGVudGlvbiB0byBlbmNvZGluZyBpZiBpdCdzIGEgc3RyaW5nLiBUaGlzXG4gICAgLy8gcHJldmVudHMgYWNjaWRlbnRhbGx5IHNlbmRpbmcgaW4gYSBudW1iZXIgdGhhdCB3b3VsZFxuICAgIC8vIGJlIGludGVycHJldHRlZCBhcyBhIHN0YXJ0IG9mZnNldC5cbiAgICByZXR1cm4gdHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJ1xuICAgICAgPyBjcmVhdGVCdWZmZXIoc2l6ZSkuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICAgIDogY3JlYXRlQnVmZmVyKHNpemUpLmZpbGwoZmlsbClcbiAgfVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKVxuICoqL1xuQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIHJldHVybiBhbGxvYyhzaXplLCBmaWxsLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmUgKHNpemUpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUgPCAwID8gMCA6IGNoZWNrZWQoc2l6ZSkgfCAwKVxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gQnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKHNpemUpXG59XG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gU2xvd0J1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICovXG5CdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKHNpemUpXG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgfVxuXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICB9XG5cbiAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwXG4gIHZhciBidWYgPSBjcmVhdGVCdWZmZXIobGVuZ3RoKVxuXG4gIHZhciBhY3R1YWwgPSBidWYud3JpdGUoc3RyaW5nLCBlbmNvZGluZylcblxuICBpZiAoYWN0dWFsICE9PSBsZW5ndGgpIHtcbiAgICAvLyBXcml0aW5nIGEgaGV4IHN0cmluZywgZm9yIGV4YW1wbGUsIHRoYXQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIHdpbGxcbiAgICAvLyBjYXVzZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBpbnZhbGlkIGNoYXJhY3RlciB0byBiZSBpZ25vcmVkLiAoZS5nLlxuICAgIC8vICdhYnh4Y2QnIHdpbGwgYmUgdHJlYXRlZCBhcyAnYWInKVxuICAgIGJ1ZiA9IGJ1Zi5zbGljZSgwLCBhY3R1YWwpXG4gIH1cblxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGggPCAwID8gMCA6IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdmFyIGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICBidWZbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiBidWZcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyIChhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcIm9mZnNldFwiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQgKyAobGVuZ3RoIHx8IDApKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wibGVuZ3RoXCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIHZhciBidWZcbiAgaWYgKGJ5dGVPZmZzZXQgPT09IHVuZGVmaW5lZCAmJiBsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5KVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gIH0gZWxzZSB7XG4gICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG4gIGJ1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIHJldHVybiBidWZcbn1cblxuZnVuY3Rpb24gZnJvbU9iamVjdCAob2JqKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIob2JqKSkge1xuICAgIHZhciBsZW4gPSBjaGVja2VkKG9iai5sZW5ndGgpIHwgMFxuICAgIHZhciBidWYgPSBjcmVhdGVCdWZmZXIobGVuKVxuXG4gICAgaWYgKGJ1Zi5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBidWZcbiAgICB9XG5cbiAgICBvYmouY29weShidWYsIDAsIDAsIGxlbilcbiAgICByZXR1cm4gYnVmXG4gIH1cblxuICBpZiAob2JqLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBvYmoubGVuZ3RoICE9PSAnbnVtYmVyJyB8fCBudW1iZXJJc05hTihvYmoubGVuZ3RoKSkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcigwKVxuICAgIH1cbiAgICByZXR1cm4gZnJvbUFycmF5TGlrZShvYmopXG4gIH1cblxuICBpZiAob2JqLnR5cGUgPT09ICdCdWZmZXInICYmIEFycmF5LmlzQXJyYXkob2JqLmRhdGEpKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUxpa2Uob2JqLmRhdGEpXG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tlZCAobGVuZ3RoKSB7XG4gIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IEtfTUFYX0xFTkdUSGAgaGVyZSBiZWNhdXNlIHRoYXQgZmFpbHMgd2hlblxuICAvLyBsZW5ndGggaXMgTmFOICh3aGljaCBpcyBvdGhlcndpc2UgY29lcmNlZCB0byB6ZXJvLilcbiAgaWYgKGxlbmd0aCA+PSBLX01BWF9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZTogMHgnICsgS19NQVhfTEVOR1RILnRvU3RyaW5nKDE2KSArICcgYnl0ZXMnKVxuICB9XG4gIHJldHVybiBsZW5ndGggfCAwXG59XG5cbmZ1bmN0aW9uIFNsb3dCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAoK2xlbmd0aCAhPSBsZW5ndGgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgICBsZW5ndGggPSAwXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5hbGxvYygrbGVuZ3RoKVxufVxuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlciAoYikge1xuICByZXR1cm4gYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyID09PSB0cnVlICYmXG4gICAgYiAhPT0gQnVmZmVyLnByb3RvdHlwZSAvLyBzbyBCdWZmZXIuaXNCdWZmZXIoQnVmZmVyLnByb3RvdHlwZSkgd2lsbCBiZSBmYWxzZVxufVxuXG5CdWZmZXIuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgaWYgKGlzSW5zdGFuY2UoYSwgVWludDhBcnJheSkpIGEgPSBCdWZmZXIuZnJvbShhLCBhLm9mZnNldCwgYS5ieXRlTGVuZ3RoKVxuICBpZiAoaXNJbnN0YW5jZShiLCBVaW50OEFycmF5KSkgYiA9IEJ1ZmZlci5mcm9tKGIsIGIub2Zmc2V0LCBiLmJ5dGVMZW5ndGgpXG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGEpIHx8ICFCdWZmZXIuaXNCdWZmZXIoYikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcImJ1ZjFcIiwgXCJidWYyXCIgYXJndW1lbnRzIG11c3QgYmUgb25lIG9mIHR5cGUgQnVmZmVyIG9yIFVpbnQ4QXJyYXknXG4gICAgKVxuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiAwXG5cbiAgdmFyIHggPSBhLmxlbmd0aFxuICB2YXIgeSA9IGIubGVuZ3RoXG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IE1hdGgubWluKHgsIHkpOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgeCA9IGFbaV1cbiAgICAgIHkgPSBiW2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuQnVmZmVyLmlzRW5jb2RpbmcgPSBmdW5jdGlvbiBpc0VuY29kaW5nIChlbmNvZGluZykge1xuICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdsYXRpbjEnOlxuICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1Y3MtMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdCAobGlzdCwgbGVuZ3RoKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShsaXN0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gIH1cblxuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApXG4gIH1cblxuICB2YXIgaVxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBsZW5ndGggPSAwXG4gICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgIGxlbmd0aCArPSBsaXN0W2ldLmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIHZhciBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKVxuICB2YXIgcG9zID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgIHZhciBidWYgPSBsaXN0W2ldXG4gICAgaWYgKGlzSW5zdGFuY2UoYnVmLCBVaW50OEFycmF5KSkge1xuICAgICAgYnVmID0gQnVmZmVyLmZyb20oYnVmKVxuICAgIH1cbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH1cbiAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBpc0luc3RhbmNlKHN0cmluZywgQXJyYXlCdWZmZXIpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5ieXRlTGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJzdHJpbmdcIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBvciBBcnJheUJ1ZmZlci4gJyArXG4gICAgICAnUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHN0cmluZ1xuICAgIClcbiAgfVxuXG4gIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBtdXN0TWF0Y2ggPSAoYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdID09PSB0cnVlKVxuICBpZiAoIW11c3RNYXRjaCAmJiBsZW4gPT09IDApIHJldHVybiAwXG5cbiAgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxlblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIGxlbiAqIDJcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBsZW4gPj4+IDFcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHtcbiAgICAgICAgICByZXR1cm4gbXVzdE1hdGNoID8gLTEgOiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aCAvLyBhc3N1bWUgdXRmOFxuICAgICAgICB9XG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcblxuZnVuY3Rpb24gc2xvd1RvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuXG4gIC8vIE5vIG5lZWQgdG8gdmVyaWZ5IHRoYXQgXCJ0aGlzLmxlbmd0aCA8PSBNQVhfVUlOVDMyXCIgc2luY2UgaXQncyBhIHJlYWQtb25seVxuICAvLyBwcm9wZXJ0eSBvZiBhIHR5cGVkIGFycmF5LlxuXG4gIC8vIFRoaXMgYmVoYXZlcyBuZWl0aGVyIGxpa2UgU3RyaW5nIG5vciBVaW50OEFycmF5IGluIHRoYXQgd2Ugc2V0IHN0YXJ0L2VuZFxuICAvLyB0byB0aGVpciB1cHBlci9sb3dlciBib3VuZHMgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvdXQgb2YgcmFuZ2UuXG4gIC8vIHVuZGVmaW5lZCBpcyBoYW5kbGVkIHNwZWNpYWxseSBhcyBwZXIgRUNNQS0yNjIgNnRoIEVkaXRpb24sXG4gIC8vIFNlY3Rpb24gMTMuMy4zLjcgUnVudGltZSBTZW1hbnRpY3M6IEtleWVkQmluZGluZ0luaXRpYWxpemF0aW9uLlxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCB8fCBzdGFydCA8IDApIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICAvLyBSZXR1cm4gZWFybHkgaWYgc3RhcnQgPiB0aGlzLmxlbmd0aC4gRG9uZSBoZXJlIHRvIHByZXZlbnQgcG90ZW50aWFsIHVpbnQzMlxuICAvLyBjb2VyY2lvbiBmYWlsIGJlbG93LlxuICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChlbmQgPD0gMCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgLy8gRm9yY2UgY29lcnNpb24gdG8gdWludDMyLiBUaGlzIHdpbGwgYWxzbyBjb2VyY2UgZmFsc2V5L05hTiB2YWx1ZXMgdG8gMC5cbiAgZW5kID4+Pj0gMFxuICBzdGFydCA+Pj49IDBcblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHV0ZjE2bGVTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGBCdWZmZXIuaXNCdWZmZXJgIChhbmQgdGhlIGBpcy1idWZmZXJgIG5wbSBwYWNrYWdlKVxuLy8gdG8gZGV0ZWN0IGEgQnVmZmVyIGluc3RhbmNlLiBJdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgYGluc3RhbmNlb2YgQnVmZmVyYFxuLy8gcmVsaWFibHkgaW4gYSBicm93c2VyaWZ5IGNvbnRleHQgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBtdWx0aXBsZSBkaWZmZXJlbnRcbi8vIGNvcGllcyBvZiB0aGUgJ2J1ZmZlcicgcGFja2FnZSBpbiB1c2UuIFRoaXMgbWV0aG9kIHdvcmtzIGV2ZW4gZm9yIEJ1ZmZlclxuLy8gaW5zdGFuY2VzIHRoYXQgd2VyZSBjcmVhdGVkIGZyb20gYW5vdGhlciBjb3B5IG9mIHRoZSBgYnVmZmVyYCBwYWNrYWdlLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9pc3N1ZXMvMTU0XG5CdWZmZXIucHJvdG90eXBlLl9pc0J1ZmZlciA9IHRydWVcblxuZnVuY3Rpb24gc3dhcCAoYiwgbiwgbSkge1xuICB2YXIgaSA9IGJbbl1cbiAgYltuXSA9IGJbbV1cbiAgYlttXSA9IGlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMTYgPSBmdW5jdGlvbiBzd2FwMTYgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAxKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDMyID0gZnVuY3Rpb24gc3dhcDMyICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA0ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgMilcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXA2NCA9IGZ1bmN0aW9uIHN3YXA2NCAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgOCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDcpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDYpXG4gICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpXG4gICAgc3dhcCh0aGlzLCBpICsgMywgaSArIDQpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nID0gQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZ1xuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLnJlcGxhY2UoLyguezJ9KS9nLCAnJDEgJykudHJpbSgpXG4gIGlmICh0aGlzLmxlbmd0aCA+IG1heCkgc3RyICs9ICcgLi4uICdcbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgaWYgKGlzSW5zdGFuY2UodGFyZ2V0LCBVaW50OEFycmF5KSkge1xuICAgIHRhcmdldCA9IEJ1ZmZlci5mcm9tKHRhcmdldCwgdGFyZ2V0Lm9mZnNldCwgdGFyZ2V0LmJ5dGVMZW5ndGgpXG4gIH1cbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwidGFyZ2V0XCIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBCdWZmZXIgb3IgVWludDhBcnJheS4gJyArXG4gICAgICAnUmVjZWl2ZWQgdHlwZSAnICsgKHR5cGVvZiB0YXJnZXQpXG4gICAgKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNTdGFydCA9IDBcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwXG4gIGVuZCA+Pj49IDBcbiAgdGhpc1N0YXJ0ID4+Pj0gMFxuICB0aGlzRW5kID4+Pj0gMFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwXG5cbiAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gIHZhciB5ID0gZW5kIC0gc3RhcnRcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldXG4gICAgICB5ID0gdGFyZ2V0Q29weVtpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAvLyBDb2VyY2UgdG8gTnVtYmVyLlxuICBpZiAobnVtYmVySXNOYU4oYnl0ZU9mZnNldCkpIHtcbiAgICAvLyBieXRlT2Zmc2V0OiBpdCBpdCdzIHVuZGVmaW5lZCwgbnVsbCwgTmFOLCBcImZvb1wiLCBldGMsIHNlYXJjaCB3aG9sZSBidWZmZXJcbiAgICBieXRlT2Zmc2V0ID0gZGlyID8gMCA6IChidWZmZXIubGVuZ3RoIC0gMSlcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0OiBuZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyXG4gIGlmIChieXRlT2Zmc2V0IDwgMCkgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggKyBieXRlT2Zmc2V0XG4gIGlmIChieXRlT2Zmc2V0ID49IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICBpZiAoZGlyKSByZXR1cm4gLTFcbiAgICBlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMVxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAwKSB7XG4gICAgaWYgKGRpcikgYnl0ZU9mZnNldCA9IDBcbiAgICBlbHNlIHJldHVybiAtMVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIHZhbFxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWwgPSBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKVxuICB9XG5cbiAgLy8gRmluYWxseSwgc2VhcmNoIGVpdGhlciBpbmRleE9mIChpZiBkaXIgaXMgdHJ1ZSkgb3IgbGFzdEluZGV4T2ZcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBsb29raW5nIGZvciBlbXB0eSBzdHJpbmcvYnVmZmVyIGFsd2F5cyBmYWlsc1xuICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDB4RkYgLy8gU2VhcmNoIGZvciBhIGJ5dGUgdmFsdWUgWzAtMjU1XVxuICAgIGlmICh0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGRpcikge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCBbIHZhbCBdLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuZnVuY3Rpb24gYXJyYXlJbmRleE9mIChhcnIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICB2YXIgaW5kZXhTaXplID0gMVxuICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aFxuICB2YXIgdmFsTGVuZ3RoID0gdmFsLmxlbmd0aFxuXG4gIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICBpZiAoZW5jb2RpbmcgPT09ICd1Y3MyJyB8fCBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fFxuICAgICAgICBlbmNvZGluZyA9PT0gJ3V0ZjE2bGUnIHx8IGVuY29kaW5nID09PSAndXRmLTE2bGUnKSB7XG4gICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9XG4gICAgICBpbmRleFNpemUgPSAyXG4gICAgICBhcnJMZW5ndGggLz0gMlxuICAgICAgdmFsTGVuZ3RoIC89IDJcbiAgICAgIGJ5dGVPZmZzZXQgLz0gMlxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWQgKGJ1ZiwgaSkge1xuICAgIGlmIChpbmRleFNpemUgPT09IDEpIHtcbiAgICAgIHJldHVybiBidWZbaV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1Zi5yZWFkVUludDE2QkUoaSAqIGluZGV4U2l6ZSlcbiAgICB9XG4gIH1cblxuICB2YXIgaVxuICBpZiAoZGlyKSB7XG4gICAgdmFyIGZvdW5kSW5kZXggPSAtMVxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPCBhcnJMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlYWQoYXJyLCBpKSA9PT0gcmVhZCh2YWwsIGZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4KSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpXG4gICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbExlbmd0aCkgcmV0dXJuIGZvdW5kSW5kZXggKiBpbmRleFNpemVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSAtMSkgaSAtPSBpIC0gZm91bmRJbmRleFxuICAgICAgICBmb3VuZEluZGV4ID0gLTFcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpIGJ5dGVPZmZzZXQgPSBhcnJMZW5ndGggLSB2YWxMZW5ndGhcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGZvdW5kID0gdHJ1ZVxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWxMZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocmVhZChhcnIsIGkgKyBqKSAhPT0gcmVhZCh2YWwsIGopKSB7XG4gICAgICAgICAgZm91bmQgPSBmYWxzZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0aGlzLmluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykgIT09IC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIHRydWUpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZmFsc2UpXG59XG5cbmZ1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICB2YXIgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldFxuICBpZiAoIWxlbmd0aCkge1xuICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpXG4gICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gICAgfVxuICB9XG5cbiAgdmFyIHN0ckxlbiA9IHN0cmluZy5sZW5ndGhcblxuICBpZiAobGVuZ3RoID4gc3RyTGVuIC8gMikge1xuICAgIGxlbmd0aCA9IHN0ckxlbiAvIDJcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHBhcnNlZCA9IHBhcnNlSW50KHN0cmluZy5zdWJzdHIoaSAqIDIsIDIpLCAxNilcbiAgICBpZiAobnVtYmVySXNOYU4ocGFyc2VkKSkgcmV0dXJuIGlcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSBwYXJzZWRcbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiB1dGY4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGY4VG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBhc2NpaVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGxhdGluMVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGFzY2lpV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiYXNlNjRXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gdWNzMldyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIG9mZnNldFssIGxlbmd0aF1bLCBlbmNvZGluZ10pXG4gIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggPj4+IDBcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4J1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgICA6IChmaXJzdEJ5dGUgPiAweEJGKSA/IDJcbiAgICAgICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHZhciByZXMgPSAnJ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyAoYnl0ZXNbaSArIDFdICogMjU2KSlcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgc3RhcnQgPSB+fnN0YXJ0XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gbGVuXG4gICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIH0gZWxzZSBpZiAoc3RhcnQgPiBsZW4pIHtcbiAgICBzdGFydCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuXG4gICAgaWYgKGVuZCA8IDApIGVuZCA9IDBcbiAgfSBlbHNlIGlmIChlbmQgPiBsZW4pIHtcbiAgICBlbmQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICB2YXIgbmV3QnVmID0gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKVxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICBuZXdCdWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gbmV3QnVmXG59XG5cbi8qXG4gKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJ1ZmZlciBpc24ndCB0cnlpbmcgdG8gd3JpdGUgb3V0IG9mIGJvdW5kcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tPZmZzZXQgKG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgaWYgKChvZmZzZXQgJSAxKSAhPT0gMCB8fCBvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50JylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUgPSBmdW5jdGlvbiByZWFkVUludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAoKHRoaXNbb2Zmc2V0XSkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAodGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gKiAweDEwMDAwMDApICtcbiAgICAoKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgdGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aFxuICB2YXIgbXVsID0gMVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWldXG4gIHdoaWxlIChpID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gKHRoaXNbb2Zmc2V0XSlcbiAgcmV0dXJuICgoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTEpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbiByZWFkSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0pIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSA8PCAyNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFID0gZnVuY3Rpb24gcmVhZERvdWJsZUxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KVxufVxuXG5mdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpXG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlVUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsICg4ICogYnl0ZUxlbmd0aCkgLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IDBcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpIC0gMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludEJFID0gZnVuY3Rpb24gd3JpdGVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCAoOCAqIGJ5dGVMZW5ndGgpIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSArIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDQsIDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24gd3JpdGVGbG9hdEJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA4LCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDUyLCA4KVxuICByZXR1cm4gb2Zmc2V0ICsgOFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbi8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgc2hvdWxkIGJlIGEgQnVmZmVyJylcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kICYmIGVuZCAhPT0gMCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aFxuICBpZiAoIXRhcmdldFN0YXJ0KSB0YXJnZXRTdGFydCA9IDBcbiAgaWYgKGVuZCA+IDAgJiYgZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMFxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlRW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIC8vIEFyZSB3ZSBvb2I/XG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCA8IGVuZCAtIHN0YXJ0KSB7XG4gICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnRcbiAgfVxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQgJiYgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBVc2UgYnVpbHQtaW4gd2hlbiBhdmFpbGFibGUsIG1pc3NpbmcgZnJvbSBJRTExXG4gICAgdGhpcy5jb3B5V2l0aGluKHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKVxuICB9IGVsc2UgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yICh2YXIgaSA9IGxlbiAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgIHRhcmdldCxcbiAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZCksXG4gICAgICB0YXJnZXRTdGFydFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0XG4gICAgICBzdGFydCA9IDBcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfVxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApXG4gICAgICBpZiAoKGVuY29kaW5nID09PSAndXRmOCcgJiYgY29kZSA8IDEyOCkgfHxcbiAgICAgICAgICBlbmNvZGluZyA9PT0gJ2xhdGluMScpIHtcbiAgICAgICAgLy8gRmFzdCBwYXRoOiBJZiBgdmFsYCBmaXRzIGludG8gYSBzaW5nbGUgYnl0ZSwgdXNlIHRoYXQgbnVtZXJpYyB2YWx1ZS5cbiAgICAgICAgdmFsID0gY29kZVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDI1NVxuICB9XG5cbiAgLy8gSW52YWxpZCByYW5nZXMgYXJlIG5vdCBzZXQgdG8gYSBkZWZhdWx0LCBzbyBjYW4gcmFuZ2UgY2hlY2sgZWFybHkuXG4gIGlmIChzdGFydCA8IDAgfHwgdGhpcy5sZW5ndGggPCBzdGFydCB8fCB0aGlzLmxlbmd0aCA8IGVuZCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdPdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzdGFydCA9IHN0YXJ0ID4+PiAwXG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5sZW5ndGggOiBlbmQgPj4+IDBcblxuICBpZiAoIXZhbCkgdmFsID0gMFxuXG4gIHZhciBpXG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIHRoaXNbaV0gPSB2YWxcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJ5dGVzID0gQnVmZmVyLmlzQnVmZmVyKHZhbClcbiAgICAgID8gdmFsXG4gICAgICA6IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aFxuICAgIGlmIChsZW4gPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyB2YWwgK1xuICAgICAgICAnXCIgaXMgaW52YWxpZCBmb3IgYXJndW1lbnQgXCJ2YWx1ZVwiJylcbiAgICB9XG4gICAgZm9yIChpID0gMDsgaSA8IGVuZCAtIHN0YXJ0OyArK2kpIHtcbiAgICAgIHRoaXNbaSArIHN0YXJ0XSA9IGJ5dGVzW2kgJSBsZW5dXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG52YXIgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSB0YWtlcyBlcXVhbCBzaWducyBhcyBlbmQgb2YgdGhlIEJhc2U2NCBlbmNvZGluZ1xuICBzdHIgPSBzdHIuc3BsaXQoJz0nKVswXVxuICAvLyBOb2RlIHN0cmlwcyBvdXQgaW52YWxpZCBjaGFyYWN0ZXJzIGxpa2UgXFxuIGFuZCBcXHQgZnJvbSB0aGUgc3RyaW5nLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgc3RyID0gc3RyLnRyaW0oKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiB0b0hleCAobikge1xuICBpZiAobiA8IDE2KSByZXR1cm4gJzAnICsgbi50b1N0cmluZygxNilcbiAgcmV0dXJuIG4udG9TdHJpbmcoMTYpXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgdmFyIGNvZGVQb2ludFxuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgdmFyIGJ5dGVzID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcbiAgICBpZiAoY29kZVBvaW50ID4gMHhEN0ZGICYmIGNvZGVQb2ludCA8IDB4RTAwMCkge1xuICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICghbGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyBubyBsZWFkIHlldFxuICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMiBsZWFkcyBpbiBhIHJvd1xuICAgICAgaWYgKGNvZGVQb2ludCA8IDB4REMwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMFxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cbi8vIEFycmF5QnVmZmVyIG9yIFVpbnQ4QXJyYXkgb2JqZWN0cyBmcm9tIG90aGVyIGNvbnRleHRzIChpLmUuIGlmcmFtZXMpIGRvIG5vdCBwYXNzXG4vLyB0aGUgYGluc3RhbmNlb2ZgIGNoZWNrIGJ1dCB0aGV5IHNob3VsZCBiZSB0cmVhdGVkIGFzIG9mIHRoYXQgdHlwZS5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvaXNzdWVzLzE2NlxuZnVuY3Rpb24gaXNJbnN0YW5jZSAob2JqLCB0eXBlKSB7XG4gIHJldHVybiBvYmogaW5zdGFuY2VvZiB0eXBlIHx8XG4gICAgKG9iaiAhPSBudWxsICYmIG9iai5jb25zdHJ1Y3RvciAhPSBudWxsICYmIG9iai5jb25zdHJ1Y3Rvci5uYW1lICE9IG51bGwgJiZcbiAgICAgIG9iai5jb25zdHJ1Y3Rvci5uYW1lID09PSB0eXBlLm5hbWUpXG59XG5mdW5jdGlvbiBudW1iZXJJc05hTiAob2JqKSB7XG4gIC8vIEZvciBJRTExIHN1cHBvcnRcbiAgcmV0dXJuIG9iaiAhPT0gb2JqIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG59XG4iLCIvKiFcbiAqICBob3dsZXIuanMgdjIuMi4xXG4gKiAgaG93bGVyanMuY29tXG4gKlxuICogIChjKSAyMDEzLTIwMjAsIEphbWVzIFNpbXBzb24gb2YgR29sZEZpcmUgU3R1ZGlvc1xuICogIGdvbGRmaXJlc3R1ZGlvcy5jb21cbiAqXG4gKiAgTUlUIExpY2Vuc2VcbiAqL1xuXG4oZnVuY3Rpb24oKSB7XG5cbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKiBHbG9iYWwgTWV0aG9kcyAqKi9cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBnbG9iYWwgY29udHJvbGxlci4gQWxsIGNvbnRhaW5lZCBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIGFwcGx5XG4gICAqIHRvIGFsbCBzb3VuZHMgdGhhdCBhcmUgY3VycmVudGx5IHBsYXlpbmcgb3Igd2lsbCBiZSBpbiB0aGUgZnV0dXJlLlxuICAgKi9cbiAgdmFyIEhvd2xlckdsb2JhbCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaW5pdCgpO1xuICB9O1xuICBIb3dsZXJHbG9iYWwucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIGdsb2JhbCBIb3dsZXIgb2JqZWN0LlxuICAgICAqIEByZXR1cm4ge0hvd2xlcn1cbiAgICAgKi9cbiAgICBpbml0OiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcyB8fCBIb3dsZXI7XG5cbiAgICAgIC8vIENyZWF0ZSBhIGdsb2JhbCBJRCBjb3VudGVyLlxuICAgICAgc2VsZi5fY291bnRlciA9IDEwMDA7XG5cbiAgICAgIC8vIFBvb2wgb2YgdW5sb2NrZWQgSFRNTDUgQXVkaW8gb2JqZWN0cy5cbiAgICAgIHNlbGYuX2h0bWw1QXVkaW9Qb29sID0gW107XG4gICAgICBzZWxmLmh0bWw1UG9vbFNpemUgPSAxMDtcblxuICAgICAgLy8gSW50ZXJuYWwgcHJvcGVydGllcy5cbiAgICAgIHNlbGYuX2NvZGVjcyA9IHt9O1xuICAgICAgc2VsZi5faG93bHMgPSBbXTtcbiAgICAgIHNlbGYuX211dGVkID0gZmFsc2U7XG4gICAgICBzZWxmLl92b2x1bWUgPSAxO1xuICAgICAgc2VsZi5fY2FuUGxheUV2ZW50ID0gJ2NhbnBsYXl0aHJvdWdoJztcbiAgICAgIHNlbGYuX25hdmlnYXRvciA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cubmF2aWdhdG9yKSA/IHdpbmRvdy5uYXZpZ2F0b3IgOiBudWxsO1xuXG4gICAgICAvLyBQdWJsaWMgcHJvcGVydGllcy5cbiAgICAgIHNlbGYubWFzdGVyR2FpbiA9IG51bGw7XG4gICAgICBzZWxmLm5vQXVkaW8gPSBmYWxzZTtcbiAgICAgIHNlbGYudXNpbmdXZWJBdWRpbyA9IHRydWU7XG4gICAgICBzZWxmLmF1dG9TdXNwZW5kID0gdHJ1ZTtcbiAgICAgIHNlbGYuY3R4ID0gbnVsbDtcblxuICAgICAgLy8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgdGhlIGF1dG8gYXVkaW8gdW5sb2NrZXIuXG4gICAgICBzZWxmLmF1dG9VbmxvY2sgPSB0cnVlO1xuXG4gICAgICAvLyBTZXR1cCB0aGUgdmFyaW91cyBzdGF0ZSB2YWx1ZXMgZm9yIGdsb2JhbCB0cmFja2luZy5cbiAgICAgIHNlbGYuX3NldHVwKCk7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQvc2V0IHRoZSBnbG9iYWwgdm9sdW1lIGZvciBhbGwgc291bmRzLlxuICAgICAqIEBwYXJhbSAge0Zsb2F0fSB2b2wgVm9sdW1lIGZyb20gMC4wIHRvIDEuMC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsZXIvRmxvYXR9ICAgICBSZXR1cm5zIHNlbGYgb3IgY3VycmVudCB2b2x1bWUuXG4gICAgICovXG4gICAgdm9sdW1lOiBmdW5jdGlvbih2b2wpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcyB8fCBIb3dsZXI7XG4gICAgICB2b2wgPSBwYXJzZUZsb2F0KHZvbCk7XG5cbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW4gQXVkaW9Db250ZXh0IGNyZWF0ZWQgeWV0LCBydW4gdGhlIHNldHVwLlxuICAgICAgaWYgKCFzZWxmLmN0eCkge1xuICAgICAgICBzZXR1cEF1ZGlvQ29udGV4dCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgdm9sID49IDAgJiYgdm9sIDw9IDEpIHtcbiAgICAgICAgc2VsZi5fdm9sdW1lID0gdm9sO1xuXG4gICAgICAgIC8vIERvbid0IHVwZGF0ZSBhbnkgb2YgdGhlIG5vZGVzIGlmIHdlIGFyZSBtdXRlZC5cbiAgICAgICAgaWYgKHNlbGYuX211dGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXaGVuIHVzaW5nIFdlYiBBdWRpbywgd2UganVzdCBuZWVkIHRvIGFkanVzdCB0aGUgbWFzdGVyIGdhaW4uXG4gICAgICAgIGlmIChzZWxmLnVzaW5nV2ViQXVkaW8pIHtcbiAgICAgICAgICBzZWxmLm1hc3RlckdhaW4uZ2Fpbi5zZXRWYWx1ZUF0VGltZSh2b2wsIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFuZCBjaGFuZ2Ugdm9sdW1lIGZvciBhbGwgSFRNTDUgYXVkaW8gbm9kZXMuXG4gICAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9ob3dscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICghc2VsZi5faG93bHNbaV0uX3dlYkF1ZGlvKSB7XG4gICAgICAgICAgICAvLyBHZXQgYWxsIG9mIHRoZSBzb3VuZHMgaW4gdGhpcyBIb3dsIGdyb3VwLlxuICAgICAgICAgICAgdmFyIGlkcyA9IHNlbGYuX2hvd2xzW2ldLl9nZXRTb3VuZElkcygpO1xuXG4gICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHNvdW5kcyBhbmQgY2hhbmdlIHRoZSB2b2x1bWVzLlxuICAgICAgICAgICAgZm9yICh2YXIgaj0wOyBqPGlkcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICB2YXIgc291bmQgPSBzZWxmLl9ob3dsc1tpXS5fc291bmRCeUlkKGlkc1tqXSk7XG5cbiAgICAgICAgICAgICAgaWYgKHNvdW5kICYmIHNvdW5kLl9ub2RlKSB7XG4gICAgICAgICAgICAgICAgc291bmQuX25vZGUudm9sdW1lID0gc291bmQuX3ZvbHVtZSAqIHZvbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZi5fdm9sdW1lO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgbXV0aW5nIGFuZCB1bm11dGluZyBnbG9iYWxseS5cbiAgICAgKiBAcGFyYW0gIHtCb29sZWFufSBtdXRlZCBJcyBtdXRlZCBvciBub3QuXG4gICAgICovXG4gICAgbXV0ZTogZnVuY3Rpb24obXV0ZWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcyB8fCBIb3dsZXI7XG5cbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW4gQXVkaW9Db250ZXh0IGNyZWF0ZWQgeWV0LCBydW4gdGhlIHNldHVwLlxuICAgICAgaWYgKCFzZWxmLmN0eCkge1xuICAgICAgICBzZXR1cEF1ZGlvQ29udGV4dCgpO1xuICAgICAgfVxuXG4gICAgICBzZWxmLl9tdXRlZCA9IG11dGVkO1xuXG4gICAgICAvLyBXaXRoIFdlYiBBdWRpbywgd2UganVzdCBuZWVkIHRvIG11dGUgdGhlIG1hc3RlciBnYWluLlxuICAgICAgaWYgKHNlbGYudXNpbmdXZWJBdWRpbykge1xuICAgICAgICBzZWxmLm1hc3RlckdhaW4uZ2Fpbi5zZXRWYWx1ZUF0VGltZShtdXRlZCA/IDAgOiBzZWxmLl92b2x1bWUsIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBMb29wIHRocm91Z2ggYW5kIG11dGUgYWxsIEhUTUw1IEF1ZGlvIG5vZGVzLlxuICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX2hvd2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghc2VsZi5faG93bHNbaV0uX3dlYkF1ZGlvKSB7XG4gICAgICAgICAgLy8gR2V0IGFsbCBvZiB0aGUgc291bmRzIGluIHRoaXMgSG93bCBncm91cC5cbiAgICAgICAgICB2YXIgaWRzID0gc2VsZi5faG93bHNbaV0uX2dldFNvdW5kSWRzKCk7XG5cbiAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHNvdW5kcyBhbmQgbWFyayB0aGUgYXVkaW8gbm9kZSBhcyBtdXRlZC5cbiAgICAgICAgICBmb3IgKHZhciBqPTA7IGo8aWRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgc291bmQgPSBzZWxmLl9ob3dsc1tpXS5fc291bmRCeUlkKGlkc1tqXSk7XG5cbiAgICAgICAgICAgIGlmIChzb3VuZCAmJiBzb3VuZC5fbm9kZSkge1xuICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5tdXRlZCA9IChtdXRlZCkgPyB0cnVlIDogc291bmQuX211dGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHN0b3BwaW5nIGFsbCBzb3VuZHMgZ2xvYmFsbHkuXG4gICAgICovXG4gICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuXG4gICAgICAvLyBMb29wIHRocm91Z2ggYWxsIEhvd2xzIGFuZCBzdG9wIHRoZW0uXG4gICAgICBmb3IgKHZhciBpPTA7IGk8c2VsZi5faG93bHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc2VsZi5faG93bHNbaV0uc3RvcCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVW5sb2FkIGFuZCBkZXN0cm95IGFsbCBjdXJyZW50bHkgbG9hZGVkIEhvd2wgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJuIHtIb3dsZXJ9XG4gICAgICovXG4gICAgdW5sb2FkOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcyB8fCBIb3dsZXI7XG5cbiAgICAgIGZvciAodmFyIGk9c2VsZi5faG93bHMubGVuZ3RoLTE7IGk+PTA7IGktLSkge1xuICAgICAgICBzZWxmLl9ob3dsc1tpXS51bmxvYWQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IEF1ZGlvQ29udGV4dCB0byBtYWtlIHN1cmUgaXQgaXMgZnVsbHkgcmVzZXQuXG4gICAgICBpZiAoc2VsZi51c2luZ1dlYkF1ZGlvICYmIHNlbGYuY3R4ICYmIHR5cGVvZiBzZWxmLmN0eC5jbG9zZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc2VsZi5jdHguY2xvc2UoKTtcbiAgICAgICAgc2VsZi5jdHggPSBudWxsO1xuICAgICAgICBzZXR1cEF1ZGlvQ29udGV4dCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgZm9yIGNvZGVjIHN1cHBvcnQgb2Ygc3BlY2lmaWMgZXh0ZW5zaW9uLlxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gZXh0IEF1ZGlvIGZpbGUgZXh0ZW50aW9uLlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgY29kZWNzOiBmdW5jdGlvbihleHQpIHtcbiAgICAgIHJldHVybiAodGhpcyB8fCBIb3dsZXIpLl9jb2RlY3NbZXh0LnJlcGxhY2UoL154LS8sICcnKV07XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldHVwIHZhcmlvdXMgc3RhdGUgdmFsdWVzIGZvciBnbG9iYWwgdHJhY2tpbmcuXG4gICAgICogQHJldHVybiB7SG93bGVyfVxuICAgICAqL1xuICAgIF9zZXR1cDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuXG4gICAgICAvLyBLZWVwcyB0cmFjayBvZiB0aGUgc3VzcGVuZC9yZXN1bWUgc3RhdGUgb2YgdGhlIEF1ZGlvQ29udGV4dC5cbiAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmN0eCA/IHNlbGYuY3R4LnN0YXRlIHx8ICdzdXNwZW5kZWQnIDogJ3N1c3BlbmRlZCc7XG5cbiAgICAgIC8vIEF1dG9tYXRpY2FsbHkgYmVnaW4gdGhlIDMwLXNlY29uZCBzdXNwZW5kIHByb2Nlc3NcbiAgICAgIHNlbGYuX2F1dG9TdXNwZW5kKCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGF1ZGlvIGlzIGF2YWlsYWJsZS5cbiAgICAgIGlmICghc2VsZi51c2luZ1dlYkF1ZGlvKSB7XG4gICAgICAgIC8vIE5vIGF1ZGlvIGlzIGF2YWlsYWJsZSBvbiB0aGlzIHN5c3RlbSBpZiBub0F1ZGlvIGlzIHNldCB0byB0cnVlLlxuICAgICAgICBpZiAodHlwZW9mIEF1ZGlvICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgdGVzdCA9IG5ldyBBdWRpbygpO1xuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgY2FucGxheXRocm91Z2ggZXZlbnQgaXMgYXZhaWxhYmxlLlxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0ZXN0Lm9uY2FucGxheXRocm91Z2ggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHNlbGYuX2NhblBsYXlFdmVudCA9ICdjYW5wbGF5JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgIHNlbGYubm9BdWRpbyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGYubm9BdWRpbyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGVzdCB0byBtYWtlIHN1cmUgYXVkaW8gaXNuJ3QgZGlzYWJsZWQgaW4gSW50ZXJuZXQgRXhwbG9yZXIuXG4gICAgICB0cnkge1xuICAgICAgICB2YXIgdGVzdCA9IG5ldyBBdWRpbygpO1xuICAgICAgICBpZiAodGVzdC5tdXRlZCkge1xuICAgICAgICAgIHNlbGYubm9BdWRpbyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgIC8vIENoZWNrIGZvciBzdXBwb3J0ZWQgY29kZWNzLlxuICAgICAgaWYgKCFzZWxmLm5vQXVkaW8pIHtcbiAgICAgICAgc2VsZi5fc2V0dXBDb2RlY3MoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENoZWNrIGZvciBicm93c2VyIHN1cHBvcnQgZm9yIHZhcmlvdXMgY29kZWNzIGFuZCBjYWNoZSB0aGUgcmVzdWx0cy5cbiAgICAgKiBAcmV0dXJuIHtIb3dsZXJ9XG4gICAgICovXG4gICAgX3NldHVwQ29kZWNzOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcyB8fCBIb3dsZXI7XG4gICAgICB2YXIgYXVkaW9UZXN0ID0gbnVsbDtcblxuICAgICAgLy8gTXVzdCB3cmFwIGluIGEgdHJ5L2NhdGNoIGJlY2F1c2UgSUUxMSBpbiBzZXJ2ZXIgbW9kZSB0aHJvd3MgYW4gZXJyb3IuXG4gICAgICB0cnkge1xuICAgICAgICBhdWRpb1Rlc3QgPSAodHlwZW9mIEF1ZGlvICE9PSAndW5kZWZpbmVkJykgPyBuZXcgQXVkaW8oKSA6IG51bGw7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9XG5cbiAgICAgIGlmICghYXVkaW9UZXN0IHx8IHR5cGVvZiBhdWRpb1Rlc3QuY2FuUGxheVR5cGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9XG5cbiAgICAgIHZhciBtcGVnVGVzdCA9IGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vbXBlZzsnKS5yZXBsYWNlKC9ebm8kLywgJycpO1xuXG4gICAgICAvLyBPcGVyYSB2ZXJzaW9uIDwzMyBoYXMgbWl4ZWQgTVAzIHN1cHBvcnQsIHNvIHdlIG5lZWQgdG8gY2hlY2sgZm9yIGFuZCBibG9jayBpdC5cbiAgICAgIHZhciBjaGVja09wZXJhID0gc2VsZi5fbmF2aWdhdG9yICYmIHNlbGYuX25hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09QUlxcLyhbMC02XS4pL2cpO1xuICAgICAgdmFyIGlzT2xkT3BlcmEgPSAoY2hlY2tPcGVyYSAmJiBwYXJzZUludChjaGVja09wZXJhWzBdLnNwbGl0KCcvJylbMV0sIDEwKSA8IDMzKTtcblxuICAgICAgc2VsZi5fY29kZWNzID0ge1xuICAgICAgICBtcDM6ICEhKCFpc09sZE9wZXJhICYmIChtcGVnVGVzdCB8fCBhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL21wMzsnKS5yZXBsYWNlKC9ebm8kLywgJycpKSksXG4gICAgICAgIG1wZWc6ICEhbXBlZ1Rlc3QsXG4gICAgICAgIG9wdXM6ICEhYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9vZ2c7IGNvZGVjcz1cIm9wdXNcIicpLnJlcGxhY2UoL15ubyQvLCAnJyksXG4gICAgICAgIG9nZzogISFhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL29nZzsgY29kZWNzPVwidm9yYmlzXCInKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICBvZ2E6ICEhYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9vZ2c7IGNvZGVjcz1cInZvcmJpc1wiJykucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgd2F2OiAhIShhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL3dhdjsgY29kZWNzPVwiMVwiJykgfHwgYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby93YXYnKSkucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgYWFjOiAhIWF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vYWFjOycpLnJlcGxhY2UoL15ubyQvLCAnJyksXG4gICAgICAgIGNhZjogISFhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL3gtY2FmOycpLnJlcGxhY2UoL15ubyQvLCAnJyksXG4gICAgICAgIG00YTogISEoYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby94LW00YTsnKSB8fCBhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL200YTsnKSB8fCBhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL2FhYzsnKSkucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgbTRiOiAhIShhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL3gtbTRiOycpIHx8IGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vbTRiOycpIHx8IGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vYWFjOycpKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICBtcDQ6ICEhKGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8veC1tcDQ7JykgfHwgYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9tcDQ7JykgfHwgYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9hYWM7JykpLnJlcGxhY2UoL15ubyQvLCAnJyksXG4gICAgICAgIHdlYmE6ICEhYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby93ZWJtOyBjb2RlY3M9XCJ2b3JiaXNcIicpLnJlcGxhY2UoL15ubyQvLCAnJyksXG4gICAgICAgIHdlYm06ICEhYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby93ZWJtOyBjb2RlY3M9XCJ2b3JiaXNcIicpLnJlcGxhY2UoL15ubyQvLCAnJyksXG4gICAgICAgIGRvbGJ5OiAhIWF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vbXA0OyBjb2RlY3M9XCJlYy0zXCInKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICBmbGFjOiAhIShhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL3gtZmxhYzsnKSB8fCBhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL2ZsYWM7JykpLnJlcGxhY2UoL15ubyQvLCAnJylcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTb21lIGJyb3dzZXJzL2RldmljZXMgd2lsbCBvbmx5IGFsbG93IGF1ZGlvIHRvIGJlIHBsYXllZCBhZnRlciBhIHVzZXIgaW50ZXJhY3Rpb24uXG4gICAgICogQXR0ZW1wdCB0byBhdXRvbWF0aWNhbGx5IHVubG9jayBhdWRpbyBvbiB0aGUgZmlyc3QgdXNlciBpbnRlcmFjdGlvbi5cbiAgICAgKiBDb25jZXB0IGZyb206IGh0dHA6Ly9wYXVsYmFrYXVzLmNvbS90dXRvcmlhbHMvaHRtbDUvd2ViLWF1ZGlvLW9uLWlvcy9cbiAgICAgKiBAcmV0dXJuIHtIb3dsZXJ9XG4gICAgICovXG4gICAgX3VubG9ja0F1ZGlvOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcyB8fCBIb3dsZXI7XG5cbiAgICAgIC8vIE9ubHkgcnVuIHRoaXMgaWYgV2ViIEF1ZGlvIGlzIHN1cHBvcnRlZCBhbmQgaXQgaGFzbid0IGFscmVhZHkgYmVlbiB1bmxvY2tlZC5cbiAgICAgIGlmIChzZWxmLl9hdWRpb1VubG9ja2VkIHx8ICFzZWxmLmN0eCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNlbGYuX2F1ZGlvVW5sb2NrZWQgPSBmYWxzZTtcbiAgICAgIHNlbGYuYXV0b1VubG9jayA9IGZhbHNlO1xuXG4gICAgICAvLyBTb21lIG1vYmlsZSBkZXZpY2VzL3BsYXRmb3JtcyBoYXZlIGRpc3RvcnRpb24gaXNzdWVzIHdoZW4gb3BlbmluZy9jbG9zaW5nIHRhYnMgYW5kL29yIHdlYiB2aWV3cy5cbiAgICAgIC8vIEJ1Z3MgaW4gdGhlIGJyb3dzZXIgKGVzcGVjaWFsbHkgTW9iaWxlIFNhZmFyaSkgY2FuIGNhdXNlIHRoZSBzYW1wbGVSYXRlIHRvIGNoYW5nZSBmcm9tIDQ0MTAwIHRvIDQ4MDAwLlxuICAgICAgLy8gQnkgY2FsbGluZyBIb3dsZXIudW5sb2FkKCksIHdlIGNyZWF0ZSBhIG5ldyBBdWRpb0NvbnRleHQgd2l0aCB0aGUgY29ycmVjdCBzYW1wbGVSYXRlLlxuICAgICAgaWYgKCFzZWxmLl9tb2JpbGVVbmxvYWRlZCAmJiBzZWxmLmN0eC5zYW1wbGVSYXRlICE9PSA0NDEwMCkge1xuICAgICAgICBzZWxmLl9tb2JpbGVVbmxvYWRlZCA9IHRydWU7XG4gICAgICAgIHNlbGYudW5sb2FkKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNjcmF0Y2ggYnVmZmVyIGZvciBlbmFibGluZyBpT1MgdG8gZGlzcG9zZSBvZiB3ZWIgYXVkaW8gYnVmZmVycyBjb3JyZWN0bHksIGFzIHBlcjpcbiAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjQxMTk2ODRcbiAgICAgIHNlbGYuX3NjcmF0Y2hCdWZmZXIgPSBzZWxmLmN0eC5jcmVhdGVCdWZmZXIoMSwgMSwgMjIwNTApO1xuXG4gICAgICAvLyBDYWxsIHRoaXMgbWV0aG9kIG9uIHRvdWNoIHN0YXJ0IHRvIGNyZWF0ZSBhbmQgcGxheSBhIGJ1ZmZlcixcbiAgICAgIC8vIHRoZW4gY2hlY2sgaWYgdGhlIGF1ZGlvIGFjdHVhbGx5IHBsYXllZCB0byBkZXRlcm1pbmUgaWZcbiAgICAgIC8vIGF1ZGlvIGhhcyBub3cgYmVlbiB1bmxvY2tlZCBvbiBpT1MsIEFuZHJvaWQsIGV0Yy5cbiAgICAgIHZhciB1bmxvY2sgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIHBvb2wgb2YgdW5sb2NrZWQgSFRNTDUgQXVkaW8gb2JqZWN0cyB0aGF0IGNhblxuICAgICAgICAvLyBiZSB1c2VkIGZvciBwbGF5aW5nIHNvdW5kcyB3aXRob3V0IHVzZXIgaW50ZXJhY3Rpb24uIEhUTUw1XG4gICAgICAgIC8vIEF1ZGlvIG9iamVjdHMgbXVzdCBiZSBpbmRpdmlkdWFsbHkgdW5sb2NrZWQsIGFzIG9wcG9zZWRcbiAgICAgICAgLy8gdG8gdGhlIFdlYkF1ZGlvIEFQSSB3aGljaCBvbmx5IG5lZWRzIGEgc2luZ2xlIGFjdGl2YXRpb24uXG4gICAgICAgIC8vIFRoaXMgbXVzdCBvY2N1ciBiZWZvcmUgV2ViQXVkaW8gc2V0dXAgb3IgdGhlIHNvdXJjZS5vbmVuZGVkXG4gICAgICAgIC8vIGV2ZW50IHdpbGwgbm90IGZpcmUuXG4gICAgICAgIHdoaWxlIChzZWxmLl9odG1sNUF1ZGlvUG9vbC5sZW5ndGggPCBzZWxmLmh0bWw1UG9vbFNpemUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGF1ZGlvTm9kZSA9IG5ldyBBdWRpbygpO1xuXG4gICAgICAgICAgICAvLyBNYXJrIHRoaXMgQXVkaW8gb2JqZWN0IGFzIHVubG9ja2VkIHRvIGVuc3VyZSBpdCBjYW4gZ2V0IHJldHVybmVkXG4gICAgICAgICAgICAvLyB0byB0aGUgdW5sb2NrZWQgcG9vbCB3aGVuIHJlbGVhc2VkLlxuICAgICAgICAgICAgYXVkaW9Ob2RlLl91bmxvY2tlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIEFkZCB0aGUgYXVkaW8gbm9kZSB0byB0aGUgcG9vbC5cbiAgICAgICAgICAgIHNlbGYuX3JlbGVhc2VIdG1sNUF1ZGlvKGF1ZGlvTm9kZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc2VsZi5ub0F1ZGlvID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbnkgYXNzaWduZWQgYXVkaW8gbm9kZXMgYW5kIHVubG9jayB0aGVtLlxuICAgICAgICBmb3IgKHZhciBpPTA7IGk8c2VsZi5faG93bHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoIXNlbGYuX2hvd2xzW2ldLl93ZWJBdWRpbykge1xuICAgICAgICAgICAgLy8gR2V0IGFsbCBvZiB0aGUgc291bmRzIGluIHRoaXMgSG93bCBncm91cC5cbiAgICAgICAgICAgIHZhciBpZHMgPSBzZWxmLl9ob3dsc1tpXS5fZ2V0U291bmRJZHMoKTtcblxuICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBzb3VuZHMgYW5kIHVubG9jayB0aGUgYXVkaW8gbm9kZXMuXG4gICAgICAgICAgICBmb3IgKHZhciBqPTA7IGo8aWRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgIHZhciBzb3VuZCA9IHNlbGYuX2hvd2xzW2ldLl9zb3VuZEJ5SWQoaWRzW2pdKTtcblxuICAgICAgICAgICAgICBpZiAoc291bmQgJiYgc291bmQuX25vZGUgJiYgIXNvdW5kLl9ub2RlLl91bmxvY2tlZCkge1xuICAgICAgICAgICAgICAgIHNvdW5kLl9ub2RlLl91bmxvY2tlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgc291bmQuX25vZGUubG9hZCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRml4IEFuZHJvaWQgY2FuIG5vdCBwbGF5IGluIHN1c3BlbmQgc3RhdGUuXG4gICAgICAgIHNlbGYuX2F1dG9SZXN1bWUoKTtcblxuICAgICAgICAvLyBDcmVhdGUgYW4gZW1wdHkgYnVmZmVyLlxuICAgICAgICB2YXIgc291cmNlID0gc2VsZi5jdHguY3JlYXRlQnVmZmVyU291cmNlKCk7XG4gICAgICAgIHNvdXJjZS5idWZmZXIgPSBzZWxmLl9zY3JhdGNoQnVmZmVyO1xuICAgICAgICBzb3VyY2UuY29ubmVjdChzZWxmLmN0eC5kZXN0aW5hdGlvbik7XG5cbiAgICAgICAgLy8gUGxheSB0aGUgZW1wdHkgYnVmZmVyLlxuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZS5zdGFydCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBzb3VyY2Uubm90ZU9uKDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNvdXJjZS5zdGFydCgwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGxpbmcgcmVzdW1lKCkgb24gYSBzdGFjayBpbml0aWF0ZWQgYnkgdXNlciBnZXN0dXJlIGlzIHdoYXQgYWN0dWFsbHkgdW5sb2NrcyB0aGUgYXVkaW8gb24gQW5kcm9pZCBDaHJvbWUgPj0gNTUuXG4gICAgICAgIGlmICh0eXBlb2Ygc2VsZi5jdHgucmVzdW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2VsZi5jdHgucmVzdW1lKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXR1cCBhIHRpbWVvdXQgdG8gY2hlY2sgdGhhdCB3ZSBhcmUgdW5sb2NrZWQgb24gdGhlIG5leHQgZXZlbnQgbG9vcC5cbiAgICAgICAgc291cmNlLm9uZW5kZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICBzb3VyY2UuZGlzY29ubmVjdCgwKTtcblxuICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgdW5sb2NrZWQgc3RhdGUgYW5kIHByZXZlbnQgdGhpcyBjaGVjayBmcm9tIGhhcHBlbmluZyBhZ2Fpbi5cbiAgICAgICAgICBzZWxmLl9hdWRpb1VubG9ja2VkID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIFJlbW92ZSB0aGUgdG91Y2ggc3RhcnQgbGlzdGVuZXIuXG4gICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHVubG9jaywgdHJ1ZSk7XG4gICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB1bmxvY2ssIHRydWUpO1xuICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdW5sb2NrLCB0cnVlKTtcblxuICAgICAgICAgIC8vIExldCBhbGwgc291bmRzIGtub3cgdGhhdCBhdWRpbyBoYXMgYmVlbiB1bmxvY2tlZC5cbiAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8c2VsZi5faG93bHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHNlbGYuX2hvd2xzW2ldLl9lbWl0KCd1bmxvY2snKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9O1xuXG4gICAgICAvLyBTZXR1cCBhIHRvdWNoIHN0YXJ0IGxpc3RlbmVyIHRvIGF0dGVtcHQgYW4gdW5sb2NrIGluLlxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHVubG9jaywgdHJ1ZSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHVubG9jaywgdHJ1ZSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHVubG9jaywgdHJ1ZSk7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgYW4gdW5sb2NrZWQgSFRNTDUgQXVkaW8gb2JqZWN0IGZyb20gdGhlIHBvb2wuIElmIG5vbmUgYXJlIGxlZnQsXG4gICAgICogcmV0dXJuIGEgbmV3IEF1ZGlvIG9iamVjdCBhbmQgdGhyb3cgYSB3YXJuaW5nLlxuICAgICAqIEByZXR1cm4ge0F1ZGlvfSBIVE1MNSBBdWRpbyBvYmplY3QuXG4gICAgICovXG4gICAgX29idGFpbkh0bWw1QXVkaW86IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzIHx8IEhvd2xlcjtcblxuICAgICAgLy8gUmV0dXJuIHRoZSBuZXh0IG9iamVjdCBmcm9tIHRoZSBwb29sIGlmIG9uZSBleGlzdHMuXG4gICAgICBpZiAoc2VsZi5faHRtbDVBdWRpb1Bvb2wubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzZWxmLl9odG1sNUF1ZGlvUG9vbC5wb3AoKTtcbiAgICAgIH1cblxuICAgICAgLy8uQ2hlY2sgaWYgdGhlIGF1ZGlvIGlzIGxvY2tlZCBhbmQgdGhyb3cgYSB3YXJuaW5nLlxuICAgICAgdmFyIHRlc3RQbGF5ID0gbmV3IEF1ZGlvKCkucGxheSgpO1xuICAgICAgaWYgKHRlc3RQbGF5ICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJyAmJiAodGVzdFBsYXkgaW5zdGFuY2VvZiBQcm9taXNlIHx8IHR5cGVvZiB0ZXN0UGxheS50aGVuID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICB0ZXN0UGxheS5jYXRjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0hUTUw1IEF1ZGlvIHBvb2wgZXhoYXVzdGVkLCByZXR1cm5pbmcgcG90ZW50aWFsbHkgbG9ja2VkIGF1ZGlvIG9iamVjdC4nKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgQXVkaW8oKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFuIGFjdGl2YXRlZCBIVE1MNSBBdWRpbyBvYmplY3QgdG8gdGhlIHBvb2wuXG4gICAgICogQHJldHVybiB7SG93bGVyfVxuICAgICAqL1xuICAgIF9yZWxlYXNlSHRtbDVBdWRpbzogZnVuY3Rpb24oYXVkaW8pIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcyB8fCBIb3dsZXI7XG5cbiAgICAgIC8vIERvbid0IGFkZCBhdWRpbyB0byB0aGUgcG9vbCBpZiB3ZSBkb24ndCBrbm93IGlmIGl0IGhhcyBiZWVuIHVubG9ja2VkLlxuICAgICAgaWYgKGF1ZGlvLl91bmxvY2tlZCkge1xuICAgICAgICBzZWxmLl9odG1sNUF1ZGlvUG9vbC5wdXNoKGF1ZGlvKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEF1dG9tYXRpY2FsbHkgc3VzcGVuZCB0aGUgV2ViIEF1ZGlvIEF1ZGlvQ29udGV4dCBhZnRlciBubyBzb3VuZCBoYXMgcGxheWVkIGZvciAzMCBzZWNvbmRzLlxuICAgICAqIFRoaXMgc2F2ZXMgcHJvY2Vzc2luZy9lbmVyZ3kgYW5kIGZpeGVzIHZhcmlvdXMgYnJvd3Nlci1zcGVjaWZpYyBidWdzIHdpdGggYXVkaW8gZ2V0dGluZyBzdHVjay5cbiAgICAgKiBAcmV0dXJuIHtIb3dsZXJ9XG4gICAgICovXG4gICAgX2F1dG9TdXNwZW5kOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgaWYgKCFzZWxmLmF1dG9TdXNwZW5kIHx8ICFzZWxmLmN0eCB8fCB0eXBlb2Ygc2VsZi5jdHguc3VzcGVuZCA9PT0gJ3VuZGVmaW5lZCcgfHwgIUhvd2xlci51c2luZ1dlYkF1ZGlvKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgYW55IHNvdW5kcyBhcmUgcGxheWluZy5cbiAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9ob3dscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2VsZi5faG93bHNbaV0uX3dlYkF1ZGlvKSB7XG4gICAgICAgICAgZm9yICh2YXIgaj0wOyBqPHNlbGYuX2hvd2xzW2ldLl9zb3VuZHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmICghc2VsZi5faG93bHNbaV0uX3NvdW5kc1tqXS5fcGF1c2VkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2VsZi5fc3VzcGVuZFRpbWVyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dChzZWxmLl9zdXNwZW5kVGltZXIpO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBubyBzb3VuZCBoYXMgcGxheWVkIGFmdGVyIDMwIHNlY29uZHMsIHN1c3BlbmQgdGhlIGNvbnRleHQuXG4gICAgICBzZWxmLl9zdXNwZW5kVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIXNlbGYuYXV0b1N1c3BlbmQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzZWxmLl9zdXNwZW5kVGltZXIgPSBudWxsO1xuICAgICAgICBzZWxmLnN0YXRlID0gJ3N1c3BlbmRpbmcnO1xuXG4gICAgICAgIC8vIEhhbmRsZSB1cGRhdGluZyB0aGUgc3RhdGUgb2YgdGhlIGF1ZGlvIGNvbnRleHQgYWZ0ZXIgc3VzcGVuZGluZy5cbiAgICAgICAgdmFyIGhhbmRsZVN1c3BlbnNpb24gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICBzZWxmLnN0YXRlID0gJ3N1c3BlbmRlZCc7XG5cbiAgICAgICAgICBpZiAoc2VsZi5fcmVzdW1lQWZ0ZXJTdXNwZW5kKSB7XG4gICAgICAgICAgICBkZWxldGUgc2VsZi5fcmVzdW1lQWZ0ZXJTdXNwZW5kO1xuICAgICAgICAgICAgc2VsZi5fYXV0b1Jlc3VtZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBFaXRoZXIgdGhlIHN0YXRlIGdldHMgc3VzcGVuZGVkIG9yIGl0IGlzIGludGVycnVwdGVkLlxuICAgICAgICAvLyBFaXRoZXIgd2F5LCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgc3RhdGUgdG8gc3VzcGVuZGVkLlxuICAgICAgICBzZWxmLmN0eC5zdXNwZW5kKCkudGhlbihoYW5kbGVTdXNwZW5zaW9uLCBoYW5kbGVTdXNwZW5zaW9uKTtcbiAgICAgIH0sIDMwMDAwKTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEF1dG9tYXRpY2FsbHkgcmVzdW1lIHRoZSBXZWIgQXVkaW8gQXVkaW9Db250ZXh0IHdoZW4gYSBuZXcgc291bmQgaXMgcGxheWVkLlxuICAgICAqIEByZXR1cm4ge0hvd2xlcn1cbiAgICAgKi9cbiAgICBfYXV0b1Jlc3VtZTogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIGlmICghc2VsZi5jdHggfHwgdHlwZW9mIHNlbGYuY3R4LnJlc3VtZSA9PT0gJ3VuZGVmaW5lZCcgfHwgIUhvd2xlci51c2luZ1dlYkF1ZGlvKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGYuc3RhdGUgPT09ICdydW5uaW5nJyAmJiBzZWxmLmN0eC5zdGF0ZSAhPT0gJ2ludGVycnVwdGVkJyAmJiBzZWxmLl9zdXNwZW5kVGltZXIpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHNlbGYuX3N1c3BlbmRUaW1lcik7XG4gICAgICAgIHNlbGYuX3N1c3BlbmRUaW1lciA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHNlbGYuc3RhdGUgPT09ICdzdXNwZW5kZWQnIHx8IHNlbGYuc3RhdGUgPT09ICdydW5uaW5nJyAmJiBzZWxmLmN0eC5zdGF0ZSA9PT0gJ2ludGVycnVwdGVkJykge1xuICAgICAgICBzZWxmLmN0eC5yZXN1bWUoKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHNlbGYuc3RhdGUgPSAncnVubmluZyc7XG5cbiAgICAgICAgICAvLyBFbWl0IHRvIGFsbCBIb3dscyB0aGF0IHRoZSBhdWRpbyBoYXMgcmVzdW1lZC5cbiAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8c2VsZi5faG93bHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHNlbGYuX2hvd2xzW2ldLl9lbWl0KCdyZXN1bWUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChzZWxmLl9zdXNwZW5kVGltZXIpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoc2VsZi5fc3VzcGVuZFRpbWVyKTtcbiAgICAgICAgICBzZWxmLl9zdXNwZW5kVGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNlbGYuc3RhdGUgPT09ICdzdXNwZW5kaW5nJykge1xuICAgICAgICBzZWxmLl9yZXN1bWVBZnRlclN1c3BlbmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG4gIH07XG5cbiAgLy8gU2V0dXAgdGhlIGdsb2JhbCBhdWRpbyBjb250cm9sbGVyLlxuICB2YXIgSG93bGVyID0gbmV3IEhvd2xlckdsb2JhbCgpO1xuXG4gIC8qKiBHcm91cCBNZXRob2RzICoqL1xuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gYXVkaW8gZ3JvdXAgY29udHJvbGxlci5cbiAgICogQHBhcmFtIHtPYmplY3R9IG8gUGFzc2VkIGluIHByb3BlcnRpZXMgZm9yIHRoaXMgZ3JvdXAuXG4gICAqL1xuICB2YXIgSG93bCA9IGZ1bmN0aW9uKG8pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBUaHJvdyBhbiBlcnJvciBpZiBubyBzb3VyY2UgaXMgcHJvdmlkZWQuXG4gICAgaWYgKCFvLnNyYyB8fCBvLnNyYy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0FuIGFycmF5IG9mIHNvdXJjZSBmaWxlcyBtdXN0IGJlIHBhc3NlZCB3aXRoIGFueSBuZXcgSG93bC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZWxmLmluaXQobyk7XG4gIH07XG4gIEhvd2wucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgYSBuZXcgSG93bCBncm91cCBvYmplY3QuXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBvIFBhc3NlZCBpbiBwcm9wZXJ0aWVzIGZvciB0aGlzIGdyb3VwLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgaW5pdDogZnVuY3Rpb24obykge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFuIEF1ZGlvQ29udGV4dCBjcmVhdGVkIHlldCwgcnVuIHRoZSBzZXR1cC5cbiAgICAgIGlmICghSG93bGVyLmN0eCkge1xuICAgICAgICBzZXR1cEF1ZGlvQ29udGV4dCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXR1cCB1c2VyLWRlZmluZWQgZGVmYXVsdCBwcm9wZXJ0aWVzLlxuICAgICAgc2VsZi5fYXV0b3BsYXkgPSBvLmF1dG9wbGF5IHx8IGZhbHNlO1xuICAgICAgc2VsZi5fZm9ybWF0ID0gKHR5cGVvZiBvLmZvcm1hdCAhPT0gJ3N0cmluZycpID8gby5mb3JtYXQgOiBbby5mb3JtYXRdO1xuICAgICAgc2VsZi5faHRtbDUgPSBvLmh0bWw1IHx8IGZhbHNlO1xuICAgICAgc2VsZi5fbXV0ZWQgPSBvLm11dGUgfHwgZmFsc2U7XG4gICAgICBzZWxmLl9sb29wID0gby5sb29wIHx8IGZhbHNlO1xuICAgICAgc2VsZi5fcG9vbCA9IG8ucG9vbCB8fCA1O1xuICAgICAgc2VsZi5fcHJlbG9hZCA9ICh0eXBlb2Ygby5wcmVsb2FkID09PSAnYm9vbGVhbicgfHwgby5wcmVsb2FkID09PSAnbWV0YWRhdGEnKSA/IG8ucHJlbG9hZCA6IHRydWU7XG4gICAgICBzZWxmLl9yYXRlID0gby5yYXRlIHx8IDE7XG4gICAgICBzZWxmLl9zcHJpdGUgPSBvLnNwcml0ZSB8fCB7fTtcbiAgICAgIHNlbGYuX3NyYyA9ICh0eXBlb2Ygby5zcmMgIT09ICdzdHJpbmcnKSA/IG8uc3JjIDogW28uc3JjXTtcbiAgICAgIHNlbGYuX3ZvbHVtZSA9IG8udm9sdW1lICE9PSB1bmRlZmluZWQgPyBvLnZvbHVtZSA6IDE7XG4gICAgICBzZWxmLl94aHIgPSB7XG4gICAgICAgIG1ldGhvZDogby54aHIgJiYgby54aHIubWV0aG9kID8gby54aHIubWV0aG9kIDogJ0dFVCcsXG4gICAgICAgIGhlYWRlcnM6IG8ueGhyICYmIG8ueGhyLmhlYWRlcnMgPyBvLnhoci5oZWFkZXJzIDogbnVsbCxcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiBvLnhociAmJiBvLnhoci53aXRoQ3JlZGVudGlhbHMgPyBvLnhoci53aXRoQ3JlZGVudGlhbHMgOiBmYWxzZSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFNldHVwIGFsbCBvdGhlciBkZWZhdWx0IHByb3BlcnRpZXMuXG4gICAgICBzZWxmLl9kdXJhdGlvbiA9IDA7XG4gICAgICBzZWxmLl9zdGF0ZSA9ICd1bmxvYWRlZCc7XG4gICAgICBzZWxmLl9zb3VuZHMgPSBbXTtcbiAgICAgIHNlbGYuX2VuZFRpbWVycyA9IHt9O1xuICAgICAgc2VsZi5fcXVldWUgPSBbXTtcbiAgICAgIHNlbGYuX3BsYXlMb2NrID0gZmFsc2U7XG5cbiAgICAgIC8vIFNldHVwIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgIHNlbGYuX29uZW5kID0gby5vbmVuZCA/IFt7Zm46IG8ub25lbmR9XSA6IFtdO1xuICAgICAgc2VsZi5fb25mYWRlID0gby5vbmZhZGUgPyBbe2ZuOiBvLm9uZmFkZX1dIDogW107XG4gICAgICBzZWxmLl9vbmxvYWQgPSBvLm9ubG9hZCA/IFt7Zm46IG8ub25sb2FkfV0gOiBbXTtcbiAgICAgIHNlbGYuX29ubG9hZGVycm9yID0gby5vbmxvYWRlcnJvciA/IFt7Zm46IG8ub25sb2FkZXJyb3J9XSA6IFtdO1xuICAgICAgc2VsZi5fb25wbGF5ZXJyb3IgPSBvLm9ucGxheWVycm9yID8gW3tmbjogby5vbnBsYXllcnJvcn1dIDogW107XG4gICAgICBzZWxmLl9vbnBhdXNlID0gby5vbnBhdXNlID8gW3tmbjogby5vbnBhdXNlfV0gOiBbXTtcbiAgICAgIHNlbGYuX29ucGxheSA9IG8ub25wbGF5ID8gW3tmbjogby5vbnBsYXl9XSA6IFtdO1xuICAgICAgc2VsZi5fb25zdG9wID0gby5vbnN0b3AgPyBbe2ZuOiBvLm9uc3RvcH1dIDogW107XG4gICAgICBzZWxmLl9vbm11dGUgPSBvLm9ubXV0ZSA/IFt7Zm46IG8ub25tdXRlfV0gOiBbXTtcbiAgICAgIHNlbGYuX29udm9sdW1lID0gby5vbnZvbHVtZSA/IFt7Zm46IG8ub252b2x1bWV9XSA6IFtdO1xuICAgICAgc2VsZi5fb25yYXRlID0gby5vbnJhdGUgPyBbe2ZuOiBvLm9ucmF0ZX1dIDogW107XG4gICAgICBzZWxmLl9vbnNlZWsgPSBvLm9uc2VlayA/IFt7Zm46IG8ub25zZWVrfV0gOiBbXTtcbiAgICAgIHNlbGYuX29udW5sb2NrID0gby5vbnVubG9jayA/IFt7Zm46IG8ub251bmxvY2t9XSA6IFtdO1xuICAgICAgc2VsZi5fb25yZXN1bWUgPSBbXTtcblxuICAgICAgLy8gV2ViIEF1ZGlvIG9yIEhUTUw1IEF1ZGlvP1xuICAgICAgc2VsZi5fd2ViQXVkaW8gPSBIb3dsZXIudXNpbmdXZWJBdWRpbyAmJiAhc2VsZi5faHRtbDU7XG5cbiAgICAgIC8vIEF1dG9tYXRpY2FsbHkgdHJ5IHRvIGVuYWJsZSBhdWRpby5cbiAgICAgIGlmICh0eXBlb2YgSG93bGVyLmN0eCAhPT0gJ3VuZGVmaW5lZCcgJiYgSG93bGVyLmN0eCAmJiBIb3dsZXIuYXV0b1VubG9jaykge1xuICAgICAgICBIb3dsZXIuX3VubG9ja0F1ZGlvKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhpcyBIb3dsIGdyb3VwIGluIHRoZSBnbG9iYWwgY29udHJvbGxlci5cbiAgICAgIEhvd2xlci5faG93bHMucHVzaChzZWxmKTtcblxuICAgICAgLy8gSWYgdGhleSBzZWxlY3RlZCBhdXRvcGxheSwgYWRkIGEgcGxheSBldmVudCB0byB0aGUgbG9hZCBxdWV1ZS5cbiAgICAgIGlmIChzZWxmLl9hdXRvcGxheSkge1xuICAgICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgICBldmVudDogJ3BsYXknLFxuICAgICAgICAgIGFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzZWxmLnBsYXkoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2FkIHRoZSBzb3VyY2UgZmlsZSB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC5cbiAgICAgIGlmIChzZWxmLl9wcmVsb2FkICYmIHNlbGYuX3ByZWxvYWQgIT09ICdub25lJykge1xuICAgICAgICBzZWxmLmxvYWQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIExvYWQgdGhlIGF1ZGlvIGZpbGUuXG4gICAgICogQHJldHVybiB7SG93bGVyfVxuICAgICAqL1xuICAgIGxvYWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHVybCA9IG51bGw7XG5cbiAgICAgIC8vIElmIG5vIGF1ZGlvIGlzIGF2YWlsYWJsZSwgcXVpdCBpbW1lZGlhdGVseS5cbiAgICAgIGlmIChIb3dsZXIubm9BdWRpbykge1xuICAgICAgICBzZWxmLl9lbWl0KCdsb2FkZXJyb3InLCBudWxsLCAnTm8gYXVkaW8gc3VwcG9ydC4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBNYWtlIHN1cmUgb3VyIHNvdXJjZSBpcyBpbiBhbiBhcnJheS5cbiAgICAgIGlmICh0eXBlb2Ygc2VsZi5fc3JjID09PSAnc3RyaW5nJykge1xuICAgICAgICBzZWxmLl9zcmMgPSBbc2VsZi5fc3JjXTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBzb3VyY2VzIGFuZCBwaWNrIHRoZSBmaXJzdCBvbmUgdGhhdCBpcyBjb21wYXRpYmxlLlxuICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX3NyYy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZXh0LCBzdHI7XG5cbiAgICAgICAgaWYgKHNlbGYuX2Zvcm1hdCAmJiBzZWxmLl9mb3JtYXRbaV0pIHtcbiAgICAgICAgICAvLyBJZiBhbiBleHRlbnNpb24gd2FzIHNwZWNpZmllZCwgdXNlIHRoYXQgaW5zdGVhZC5cbiAgICAgICAgICBleHQgPSBzZWxmLl9mb3JtYXRbaV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBzb3VyY2UgaXMgYSBzdHJpbmcuXG4gICAgICAgICAgc3RyID0gc2VsZi5fc3JjW2ldO1xuICAgICAgICAgIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgc2VsZi5fZW1pdCgnbG9hZGVycm9yJywgbnVsbCwgJ05vbi1zdHJpbmcgZm91bmQgaW4gc2VsZWN0ZWQgYXVkaW8gc291cmNlcyAtIGlnbm9yaW5nLicpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRXh0cmFjdCB0aGUgZmlsZSBleHRlbnNpb24gZnJvbSB0aGUgVVJMIG9yIGJhc2U2NCBkYXRhIFVSSS5cbiAgICAgICAgICBleHQgPSAvXmRhdGE6YXVkaW9cXC8oW147LF0rKTsvaS5leGVjKHN0cik7XG4gICAgICAgICAgaWYgKCFleHQpIHtcbiAgICAgICAgICAgIGV4dCA9IC9cXC4oW14uXSspJC8uZXhlYyhzdHIuc3BsaXQoJz8nLCAxKVswXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGV4dCkge1xuICAgICAgICAgICAgZXh0ID0gZXh0WzFdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9nIGEgd2FybmluZyBpZiBubyBleHRlbnNpb24gd2FzIGZvdW5kLlxuICAgICAgICBpZiAoIWV4dCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybignTm8gZmlsZSBleHRlbnNpb24gd2FzIGZvdW5kLiBDb25zaWRlciB1c2luZyB0aGUgXCJmb3JtYXRcIiBwcm9wZXJ0eSBvciBzcGVjaWZ5IGFuIGV4dGVuc2lvbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgZXh0ZW5zaW9uIGlzIGF2YWlsYWJsZS5cbiAgICAgICAgaWYgKGV4dCAmJiBIb3dsZXIuY29kZWNzKGV4dCkpIHtcbiAgICAgICAgICB1cmwgPSBzZWxmLl9zcmNbaV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgc2VsZi5fZW1pdCgnbG9hZGVycm9yJywgbnVsbCwgJ05vIGNvZGVjIHN1cHBvcnQgZm9yIHNlbGVjdGVkIGF1ZGlvIHNvdXJjZXMuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2VsZi5fc3JjID0gdXJsO1xuICAgICAgc2VsZi5fc3RhdGUgPSAnbG9hZGluZyc7XG5cbiAgICAgIC8vIElmIHRoZSBob3N0aW5nIHBhZ2UgaXMgSFRUUFMgYW5kIHRoZSBzb3VyY2UgaXNuJ3QsXG4gICAgICAvLyBkcm9wIGRvd24gdG8gSFRNTDUgQXVkaW8gdG8gYXZvaWQgTWl4ZWQgQ29udGVudCBlcnJvcnMuXG4gICAgICBpZiAod2luZG93LmxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JyAmJiB1cmwuc2xpY2UoMCwgNSkgPT09ICdodHRwOicpIHtcbiAgICAgICAgc2VsZi5faHRtbDUgPSB0cnVlO1xuICAgICAgICBzZWxmLl93ZWJBdWRpbyA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgc291bmQgb2JqZWN0IGFuZCBhZGQgaXQgdG8gdGhlIHBvb2wuXG4gICAgICBuZXcgU291bmQoc2VsZik7XG5cbiAgICAgIC8vIExvYWQgYW5kIGRlY29kZSB0aGUgYXVkaW8gZGF0YSBmb3IgcGxheWJhY2suXG4gICAgICBpZiAoc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgbG9hZEJ1ZmZlcihzZWxmKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFBsYXkgYSBzb3VuZCBvciByZXN1bWUgcHJldmlvdXMgcGxheWJhY2suXG4gICAgICogQHBhcmFtICB7U3RyaW5nL051bWJlcn0gc3ByaXRlICAgU3ByaXRlIG5hbWUgZm9yIHNwcml0ZSBwbGF5YmFjayBvciBzb3VuZCBpZCB0byBjb250aW51ZSBwcmV2aW91cy5cbiAgICAgKiBAcGFyYW0gIHtCb29sZWFufSBpbnRlcm5hbCBJbnRlcm5hbCBVc2U6IHRydWUgcHJldmVudHMgZXZlbnQgZmlyaW5nLlxuICAgICAqIEByZXR1cm4ge051bWJlcn0gICAgICAgICAgU291bmQgSUQuXG4gICAgICovXG4gICAgcGxheTogZnVuY3Rpb24oc3ByaXRlLCBpbnRlcm5hbCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGlkID0gbnVsbDtcblxuICAgICAgLy8gRGV0ZXJtaW5lIGlmIGEgc3ByaXRlLCBzb3VuZCBpZCBvciBub3RoaW5nIHdhcyBwYXNzZWRcbiAgICAgIGlmICh0eXBlb2Ygc3ByaXRlID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZCA9IHNwcml0ZTtcbiAgICAgICAgc3ByaXRlID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNwcml0ZSA9PT0gJ3N0cmluZycgJiYgc2VsZi5fc3RhdGUgPT09ICdsb2FkZWQnICYmICFzZWxmLl9zcHJpdGVbc3ByaXRlXSkge1xuICAgICAgICAvLyBJZiB0aGUgcGFzc2VkIHNwcml0ZSBkb2Vzbid0IGV4aXN0LCBkbyBub3RoaW5nLlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNwcml0ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gVXNlIHRoZSBkZWZhdWx0IHNvdW5kIHNwcml0ZSAocGxheXMgdGhlIGZ1bGwgYXVkaW8gbGVuZ3RoKS5cbiAgICAgICAgc3ByaXRlID0gJ19fZGVmYXVsdCc7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBzaW5nbGUgcGF1c2VkIHNvdW5kIHRoYXQgaXNuJ3QgZW5kZWQuXG4gICAgICAgIC8vIElmIHRoZXJlIGlzLCBwbGF5IHRoYXQgc291bmQuIElmIG5vdCwgY29udGludWUgYXMgdXN1YWwuXG4gICAgICAgIGlmICghc2VsZi5fcGxheUxvY2spIHtcbiAgICAgICAgICB2YXIgbnVtID0gMDtcbiAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8c2VsZi5fc291bmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoc2VsZi5fc291bmRzW2ldLl9wYXVzZWQgJiYgIXNlbGYuX3NvdW5kc1tpXS5fZW5kZWQpIHtcbiAgICAgICAgICAgICAgbnVtKys7XG4gICAgICAgICAgICAgIGlkID0gc2VsZi5fc291bmRzW2ldLl9pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobnVtID09PSAxKSB7XG4gICAgICAgICAgICBzcHJpdGUgPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCB0aGUgc2VsZWN0ZWQgbm9kZSwgb3IgZ2V0IG9uZSBmcm9tIHRoZSBwb29sLlxuICAgICAgdmFyIHNvdW5kID0gaWQgPyBzZWxmLl9zb3VuZEJ5SWQoaWQpIDogc2VsZi5faW5hY3RpdmVTb3VuZCgpO1xuXG4gICAgICAvLyBJZiB0aGUgc291bmQgZG9lc24ndCBleGlzdCwgZG8gbm90aGluZy5cbiAgICAgIGlmICghc291bmQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIFNlbGVjdCB0aGUgc3ByaXRlIGRlZmluaXRpb24uXG4gICAgICBpZiAoaWQgJiYgIXNwcml0ZSkge1xuICAgICAgICBzcHJpdGUgPSBzb3VuZC5fc3ByaXRlIHx8ICdfX2RlZmF1bHQnO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgc291bmQgaGFzbid0IGxvYWRlZCwgd2UgbXVzdCB3YWl0IHRvIGdldCB0aGUgYXVkaW8ncyBkdXJhdGlvbi5cbiAgICAgIC8vIFdlIGFsc28gbmVlZCB0byB3YWl0IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBydW4gaW50byByYWNlIGNvbmRpdGlvbnMgd2l0aFxuICAgICAgLy8gdGhlIG9yZGVyIG9mIGZ1bmN0aW9uIGNhbGxzLlxuICAgICAgaWYgKHNlbGYuX3N0YXRlICE9PSAnbG9hZGVkJykge1xuICAgICAgICAvLyBTZXQgdGhlIHNwcml0ZSB2YWx1ZSBvbiB0aGlzIHNvdW5kLlxuICAgICAgICBzb3VuZC5fc3ByaXRlID0gc3ByaXRlO1xuXG4gICAgICAgIC8vIE1hcmsgdGhpcyBzb3VuZCBhcyBub3QgZW5kZWQgaW4gY2FzZSBhbm90aGVyIHNvdW5kIGlzIHBsYXllZCBiZWZvcmUgdGhpcyBvbmUgbG9hZHMuXG4gICAgICAgIHNvdW5kLl9lbmRlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgc291bmQgdG8gdGhlIHF1ZXVlIHRvIGJlIHBsYXllZCBvbiBsb2FkLlxuICAgICAgICB2YXIgc291bmRJZCA9IHNvdW5kLl9pZDtcbiAgICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgICAgZXZlbnQ6ICdwbGF5JyxcbiAgICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5wbGF5KHNvdW5kSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHNvdW5kSWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIERvbid0IHBsYXkgdGhlIHNvdW5kIGlmIGFuIGlkIHdhcyBwYXNzZWQgYW5kIGl0IGlzIGFscmVhZHkgcGxheWluZy5cbiAgICAgIGlmIChpZCAmJiAhc291bmQuX3BhdXNlZCkge1xuICAgICAgICAvLyBUcmlnZ2VyIHRoZSBwbGF5IGV2ZW50LCBpbiBvcmRlciB0byBrZWVwIGl0ZXJhdGluZyB0aHJvdWdoIHF1ZXVlLlxuICAgICAgICBpZiAoIWludGVybmFsKSB7XG4gICAgICAgICAgc2VsZi5fbG9hZFF1ZXVlKCdwbGF5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc291bmQuX2lkO1xuICAgICAgfVxuXG4gICAgICAvLyBNYWtlIHN1cmUgdGhlIEF1ZGlvQ29udGV4dCBpc24ndCBzdXNwZW5kZWQsIGFuZCByZXN1bWUgaXQgaWYgaXQgaXMuXG4gICAgICBpZiAoc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgSG93bGVyLl9hdXRvUmVzdW1lKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIERldGVybWluZSBob3cgbG9uZyB0byBwbGF5IGZvciBhbmQgd2hlcmUgdG8gc3RhcnQgcGxheWluZy5cbiAgICAgIHZhciBzZWVrID0gTWF0aC5tYXgoMCwgc291bmQuX3NlZWsgPiAwID8gc291bmQuX3NlZWsgOiBzZWxmLl9zcHJpdGVbc3ByaXRlXVswXSAvIDEwMDApO1xuICAgICAgdmFyIGR1cmF0aW9uID0gTWF0aC5tYXgoMCwgKChzZWxmLl9zcHJpdGVbc3ByaXRlXVswXSArIHNlbGYuX3Nwcml0ZVtzcHJpdGVdWzFdKSAvIDEwMDApIC0gc2Vlayk7XG4gICAgICB2YXIgdGltZW91dCA9IChkdXJhdGlvbiAqIDEwMDApIC8gTWF0aC5hYnMoc291bmQuX3JhdGUpO1xuICAgICAgdmFyIHN0YXJ0ID0gc2VsZi5fc3ByaXRlW3Nwcml0ZV1bMF0gLyAxMDAwO1xuICAgICAgdmFyIHN0b3AgPSAoc2VsZi5fc3ByaXRlW3Nwcml0ZV1bMF0gKyBzZWxmLl9zcHJpdGVbc3ByaXRlXVsxXSkgLyAxMDAwO1xuICAgICAgc291bmQuX3Nwcml0ZSA9IHNwcml0ZTtcblxuICAgICAgLy8gTWFyayB0aGUgc291bmQgYXMgZW5kZWQgaW5zdGFudGx5IHNvIHRoYXQgdGhpcyBhc3luYyBwbGF5YmFja1xuICAgICAgLy8gZG9lc24ndCBnZXQgZ3JhYmJlZCBieSBhbm90aGVyIGNhbGwgdG8gcGxheSB3aGlsZSB0aGlzIG9uZSB3YWl0cyB0byBzdGFydC5cbiAgICAgIHNvdW5kLl9lbmRlZCA9IGZhbHNlO1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIHNvdW5kLlxuICAgICAgdmFyIHNldFBhcmFtcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBzb3VuZC5fcGF1c2VkID0gZmFsc2U7XG4gICAgICAgIHNvdW5kLl9zZWVrID0gc2VlaztcbiAgICAgICAgc291bmQuX3N0YXJ0ID0gc3RhcnQ7XG4gICAgICAgIHNvdW5kLl9zdG9wID0gc3RvcDtcbiAgICAgICAgc291bmQuX2xvb3AgPSAhIShzb3VuZC5fbG9vcCB8fCBzZWxmLl9zcHJpdGVbc3ByaXRlXVsyXSk7XG4gICAgICB9O1xuXG4gICAgICAvLyBFbmQgdGhlIHNvdW5kIGluc3RhbnRseSBpZiBzZWVrIGlzIGF0IHRoZSBlbmQuXG4gICAgICBpZiAoc2VlayA+PSBzdG9wKSB7XG4gICAgICAgIHNlbGYuX2VuZGVkKHNvdW5kKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBCZWdpbiB0aGUgYWN0dWFsIHBsYXliYWNrLlxuICAgICAgdmFyIG5vZGUgPSBzb3VuZC5fbm9kZTtcbiAgICAgIGlmIChzZWxmLl93ZWJBdWRpbykge1xuICAgICAgICAvLyBGaXJlIHRoaXMgd2hlbiB0aGUgc291bmQgaXMgcmVhZHkgdG8gcGxheSB0byBiZWdpbiBXZWIgQXVkaW8gcGxheWJhY2suXG4gICAgICAgIHZhciBwbGF5V2ViQXVkaW8gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICBzZWxmLl9wbGF5TG9jayA9IGZhbHNlO1xuICAgICAgICAgIHNldFBhcmFtcygpO1xuICAgICAgICAgIHNlbGYuX3JlZnJlc2hCdWZmZXIoc291bmQpO1xuXG4gICAgICAgICAgLy8gU2V0dXAgdGhlIHBsYXliYWNrIHBhcmFtcy5cbiAgICAgICAgICB2YXIgdm9sID0gKHNvdW5kLl9tdXRlZCB8fCBzZWxmLl9tdXRlZCkgPyAwIDogc291bmQuX3ZvbHVtZTtcbiAgICAgICAgICBub2RlLmdhaW4uc2V0VmFsdWVBdFRpbWUodm9sLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICBzb3VuZC5fcGxheVN0YXJ0ID0gSG93bGVyLmN0eC5jdXJyZW50VGltZTtcblxuICAgICAgICAgIC8vIFBsYXkgdGhlIHNvdW5kIHVzaW5nIHRoZSBzdXBwb3J0ZWQgbWV0aG9kLlxuICAgICAgICAgIGlmICh0eXBlb2Ygbm9kZS5idWZmZXJTb3VyY2Uuc3RhcnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBzb3VuZC5fbG9vcCA/IG5vZGUuYnVmZmVyU291cmNlLm5vdGVHcmFpbk9uKDAsIHNlZWssIDg2NDAwKSA6IG5vZGUuYnVmZmVyU291cmNlLm5vdGVHcmFpbk9uKDAsIHNlZWssIGR1cmF0aW9uKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc291bmQuX2xvb3AgPyBub2RlLmJ1ZmZlclNvdXJjZS5zdGFydCgwLCBzZWVrLCA4NjQwMCkgOiBub2RlLmJ1ZmZlclNvdXJjZS5zdGFydCgwLCBzZWVrLCBkdXJhdGlvbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU3RhcnQgYSBuZXcgdGltZXIgaWYgbm9uZSBpcyBwcmVzZW50LlxuICAgICAgICAgIGlmICh0aW1lb3V0ICE9PSBJbmZpbml0eSkge1xuICAgICAgICAgICAgc2VsZi5fZW5kVGltZXJzW3NvdW5kLl9pZF0gPSBzZXRUaW1lb3V0KHNlbGYuX2VuZGVkLmJpbmQoc2VsZiwgc291bmQpLCB0aW1lb3V0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWludGVybmFsKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBzZWxmLl9lbWl0KCdwbGF5Jywgc291bmQuX2lkKTtcbiAgICAgICAgICAgICAgc2VsZi5fbG9hZFF1ZXVlKCk7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKEhvd2xlci5zdGF0ZSA9PT0gJ3J1bm5pbmcnICYmIEhvd2xlci5jdHguc3RhdGUgIT09ICdpbnRlcnJ1cHRlZCcpIHtcbiAgICAgICAgICBwbGF5V2ViQXVkaW8oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxmLl9wbGF5TG9jayA9IHRydWU7XG5cbiAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgYXVkaW8gY29udGV4dCB0byByZXN1bWUgYmVmb3JlIHBsYXlpbmcuXG4gICAgICAgICAgc2VsZi5vbmNlKCdyZXN1bWUnLCBwbGF5V2ViQXVkaW8pO1xuXG4gICAgICAgICAgLy8gQ2FuY2VsIHRoZSBlbmQgdGltZXIuXG4gICAgICAgICAgc2VsZi5fY2xlYXJUaW1lcihzb3VuZC5faWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGaXJlIHRoaXMgd2hlbiB0aGUgc291bmQgaXMgcmVhZHkgdG8gcGxheSB0byBiZWdpbiBIVE1MNSBBdWRpbyBwbGF5YmFjay5cbiAgICAgICAgdmFyIHBsYXlIdG1sNSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIG5vZGUuY3VycmVudFRpbWUgPSBzZWVrO1xuICAgICAgICAgIG5vZGUubXV0ZWQgPSBzb3VuZC5fbXV0ZWQgfHwgc2VsZi5fbXV0ZWQgfHwgSG93bGVyLl9tdXRlZCB8fCBub2RlLm11dGVkO1xuICAgICAgICAgIG5vZGUudm9sdW1lID0gc291bmQuX3ZvbHVtZSAqIEhvd2xlci52b2x1bWUoKTtcbiAgICAgICAgICBub2RlLnBsYXliYWNrUmF0ZSA9IHNvdW5kLl9yYXRlO1xuXG4gICAgICAgICAgLy8gU29tZSBicm93c2VycyB3aWxsIHRocm93IGFuIGVycm9yIGlmIHRoaXMgaXMgY2FsbGVkIHdpdGhvdXQgdXNlciBpbnRlcmFjdGlvbi5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIHBsYXkgPSBub2RlLnBsYXkoKTtcblxuICAgICAgICAgICAgLy8gU3VwcG9ydCBvbGRlciBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgcHJvbWlzZXMsIGFuZCB0aHVzIGRvbid0IGhhdmUgdGhpcyBpc3N1ZS5cbiAgICAgICAgICAgIGlmIChwbGF5ICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJyAmJiAocGxheSBpbnN0YW5jZW9mIFByb21pc2UgfHwgdHlwZW9mIHBsYXkudGhlbiA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgICAgICAgLy8gSW1wbGVtZW50cyBhIGxvY2sgdG8gcHJldmVudCBET01FeGNlcHRpb246IFRoZSBwbGF5KCkgcmVxdWVzdCB3YXMgaW50ZXJydXB0ZWQgYnkgYSBjYWxsIHRvIHBhdXNlKCkuXG4gICAgICAgICAgICAgIHNlbGYuX3BsYXlMb2NrID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAvLyBTZXQgcGFyYW0gdmFsdWVzIGltbWVkaWF0ZWx5LlxuICAgICAgICAgICAgICBzZXRQYXJhbXMoKTtcblxuICAgICAgICAgICAgICAvLyBSZWxlYXNlcyB0aGUgbG9jayBhbmQgZXhlY3V0ZXMgcXVldWVkIGFjdGlvbnMuXG4gICAgICAgICAgICAgIHBsYXlcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgIHNlbGYuX3BsYXlMb2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICBub2RlLl91bmxvY2tlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICBpZiAoIWludGVybmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2VtaXQoJ3BsYXknLCBzb3VuZC5faWQpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2FkUXVldWUoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgIHNlbGYuX3BsYXlMb2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICBzZWxmLl9lbWl0KCdwbGF5ZXJyb3InLCBzb3VuZC5faWQsICdQbGF5YmFjayB3YXMgdW5hYmxlIHRvIHN0YXJ0LiBUaGlzIGlzIG1vc3QgY29tbW9ubHkgYW4gaXNzdWUgJyArXG4gICAgICAgICAgICAgICAgICAgICdvbiBtb2JpbGUgZGV2aWNlcyBhbmQgQ2hyb21lIHdoZXJlIHBsYXliYWNrIHdhcyBub3Qgd2l0aGluIGEgdXNlciBpbnRlcmFjdGlvbi4nKTtcblxuICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGVuZGVkIGFuZCBwYXVzZWQgdmFsdWVzLlxuICAgICAgICAgICAgICAgICAgc291bmQuX2VuZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIHNvdW5kLl9wYXVzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghaW50ZXJuYWwpIHtcbiAgICAgICAgICAgICAgc2VsZi5fcGxheUxvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgc2V0UGFyYW1zKCk7XG4gICAgICAgICAgICAgIHNlbGYuX2VtaXQoJ3BsYXknLCBzb3VuZC5faWQpO1xuICAgICAgICAgICAgICBzZWxmLl9sb2FkUXVldWUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2V0dGluZyByYXRlIGJlZm9yZSBwbGF5aW5nIHdvbid0IHdvcmsgaW4gSUUsIHNvIHdlIHNldCBpdCBhZ2FpbiBoZXJlLlxuICAgICAgICAgICAgbm9kZS5wbGF5YmFja1JhdGUgPSBzb3VuZC5fcmF0ZTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIG5vZGUgaXMgc3RpbGwgcGF1c2VkLCB0aGVuIHdlIGNhbiBhc3N1bWUgdGhlcmUgd2FzIGEgcGxheWJhY2sgaXNzdWUuXG4gICAgICAgICAgICBpZiAobm9kZS5wYXVzZWQpIHtcbiAgICAgICAgICAgICAgc2VsZi5fZW1pdCgncGxheWVycm9yJywgc291bmQuX2lkLCAnUGxheWJhY2sgd2FzIHVuYWJsZSB0byBzdGFydC4gVGhpcyBpcyBtb3N0IGNvbW1vbmx5IGFuIGlzc3VlICcgK1xuICAgICAgICAgICAgICAgICdvbiBtb2JpbGUgZGV2aWNlcyBhbmQgQ2hyb21lIHdoZXJlIHBsYXliYWNrIHdhcyBub3Qgd2l0aGluIGEgdXNlciBpbnRlcmFjdGlvbi4nKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTZXR1cCB0aGUgZW5kIHRpbWVyIG9uIHNwcml0ZXMgb3IgbGlzdGVuIGZvciB0aGUgZW5kZWQgZXZlbnQuXG4gICAgICAgICAgICBpZiAoc3ByaXRlICE9PSAnX19kZWZhdWx0JyB8fCBzb3VuZC5fbG9vcCkge1xuICAgICAgICAgICAgICBzZWxmLl9lbmRUaW1lcnNbc291bmQuX2lkXSA9IHNldFRpbWVvdXQoc2VsZi5fZW5kZWQuYmluZChzZWxmLCBzb3VuZCksIHRpbWVvdXQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2VsZi5fZW5kVGltZXJzW3NvdW5kLl9pZF0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAvLyBGaXJlIGVuZGVkIG9uIHRoaXMgYXVkaW8gbm9kZS5cbiAgICAgICAgICAgICAgICBzZWxmLl9lbmRlZChzb3VuZCk7XG5cbiAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGlzIGxpc3RlbmVyLlxuICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZW5kZWQnLCBzZWxmLl9lbmRUaW1lcnNbc291bmQuX2lkXSwgZmFsc2UpO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgc2VsZi5fZW5kVGltZXJzW3NvdW5kLl9pZF0sIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHNlbGYuX2VtaXQoJ3BsYXllcnJvcicsIHNvdW5kLl9pZCwgZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gSWYgdGhpcyBpcyBzdHJlYW1pbmcgYXVkaW8sIG1ha2Ugc3VyZSB0aGUgc3JjIGlzIHNldCBhbmQgbG9hZCBhZ2Fpbi5cbiAgICAgICAgaWYgKG5vZGUuc3JjID09PSAnZGF0YTphdWRpby93YXY7YmFzZTY0LFVrbEdSaWdBQUFCWFFWWkZabTEwSUJJQUFBQUJBQUVBUkt3QUFJaFlBUUFDQUJBQUFBQmtZWFJoQWdBQUFBRUEnKSB7XG4gICAgICAgICAgbm9kZS5zcmMgPSBzZWxmLl9zcmM7XG4gICAgICAgICAgbm9kZS5sb2FkKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQbGF5IGltbWVkaWF0ZWx5IGlmIHJlYWR5LCBvciB3YWl0IGZvciB0aGUgJ2NhbnBsYXl0aHJvdWdoJ2UgdmVudC5cbiAgICAgICAgdmFyIGxvYWRlZE5vUmVhZHlTdGF0ZSA9ICh3aW5kb3cgJiYgd2luZG93LmVqZWN0YSkgfHwgKCFub2RlLnJlYWR5U3RhdGUgJiYgSG93bGVyLl9uYXZpZ2F0b3IuaXNDb2Nvb25KUyk7XG4gICAgICAgIGlmIChub2RlLnJlYWR5U3RhdGUgPj0gMyB8fCBsb2FkZWROb1JlYWR5U3RhdGUpIHtcbiAgICAgICAgICBwbGF5SHRtbDUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxmLl9wbGF5TG9jayA9IHRydWU7XG5cbiAgICAgICAgICB2YXIgbGlzdGVuZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIC8vIEJlZ2luIHBsYXliYWNrLlxuICAgICAgICAgICAgcGxheUh0bWw1KCk7XG5cbiAgICAgICAgICAgIC8vIENsZWFyIHRoaXMgbGlzdGVuZXIuXG4gICAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoSG93bGVyLl9jYW5QbGF5RXZlbnQsIGxpc3RlbmVyLCBmYWxzZSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoSG93bGVyLl9jYW5QbGF5RXZlbnQsIGxpc3RlbmVyLCBmYWxzZSk7XG5cbiAgICAgICAgICAvLyBDYW5jZWwgdGhlIGVuZCB0aW1lci5cbiAgICAgICAgICBzZWxmLl9jbGVhclRpbWVyKHNvdW5kLl9pZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNvdW5kLl9pZDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUGF1c2UgcGxheWJhY2sgYW5kIHNhdmUgY3VycmVudCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkIFRoZSBzb3VuZCBJRCAoZW1wdHkgdG8gcGF1c2UgYWxsIGluIGdyb3VwKS5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIHBhdXNlOiBmdW5jdGlvbihpZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyBJZiB0aGUgc291bmQgaGFzbid0IGxvYWRlZCBvciBhIHBsYXkoKSBwcm9taXNlIGlzIHBlbmRpbmcsIGFkZCBpdCB0byB0aGUgbG9hZCBxdWV1ZSB0byBwYXVzZSB3aGVuIGNhcGFibGUuXG4gICAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnIHx8IHNlbGYuX3BsYXlMb2NrKSB7XG4gICAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICAgIGV2ZW50OiAncGF1c2UnLFxuICAgICAgICAgIGFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzZWxmLnBhdXNlKGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBubyBpZCBpcyBwYXNzZWQsIGdldCBhbGwgSUQncyB0byBiZSBwYXVzZWQuXG4gICAgICB2YXIgaWRzID0gc2VsZi5fZ2V0U291bmRJZHMoaWQpO1xuXG4gICAgICBmb3IgKHZhciBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIENsZWFyIHRoZSBlbmQgdGltZXIuXG4gICAgICAgIHNlbGYuX2NsZWFyVGltZXIoaWRzW2ldKTtcblxuICAgICAgICAvLyBHZXQgdGhlIHNvdW5kLlxuICAgICAgICB2YXIgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWRzW2ldKTtcblxuICAgICAgICBpZiAoc291bmQgJiYgIXNvdW5kLl9wYXVzZWQpIHtcbiAgICAgICAgICAvLyBSZXNldCB0aGUgc2VlayBwb3NpdGlvbi5cbiAgICAgICAgICBzb3VuZC5fc2VlayA9IHNlbGYuc2VlayhpZHNbaV0pO1xuICAgICAgICAgIHNvdW5kLl9yYXRlU2VlayA9IDA7XG4gICAgICAgICAgc291bmQuX3BhdXNlZCA9IHRydWU7XG5cbiAgICAgICAgICAvLyBTdG9wIGN1cnJlbnRseSBydW5uaW5nIGZhZGVzLlxuICAgICAgICAgIHNlbGYuX3N0b3BGYWRlKGlkc1tpXSk7XG5cbiAgICAgICAgICBpZiAoc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbykge1xuICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHNvdW5kIGhhcyBiZWVuIGNyZWF0ZWQuXG4gICAgICAgICAgICAgIGlmICghc291bmQuX25vZGUuYnVmZmVyU291cmNlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAodHlwZW9mIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5zdG9wID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5ub3RlT2ZmKDApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5zdG9wKDApO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIGJ1ZmZlciBzb3VyY2UuXG4gICAgICAgICAgICAgIHNlbGYuX2NsZWFuQnVmZmVyKHNvdW5kLl9ub2RlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzTmFOKHNvdW5kLl9ub2RlLmR1cmF0aW9uKSB8fCBzb3VuZC5fbm9kZS5kdXJhdGlvbiA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUucGF1c2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaXJlIHRoZSBwYXVzZSBldmVudCwgdW5sZXNzIGB0cnVlYCBpcyBwYXNzZWQgYXMgdGhlIDJuZCBhcmd1bWVudC5cbiAgICAgICAgaWYgKCFhcmd1bWVudHNbMV0pIHtcbiAgICAgICAgICBzZWxmLl9lbWl0KCdwYXVzZScsIHNvdW5kID8gc291bmQuX2lkIDogbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN0b3AgcGxheWJhY2sgYW5kIHJlc2V0IHRvIHN0YXJ0LlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgVGhlIHNvdW5kIElEIChlbXB0eSB0byBzdG9wIGFsbCBpbiBncm91cCkuXG4gICAgICogQHBhcmFtICB7Qm9vbGVhbn0gaW50ZXJuYWwgSW50ZXJuYWwgVXNlOiB0cnVlIHByZXZlbnRzIGV2ZW50IGZpcmluZy5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIHN0b3A6IGZ1bmN0aW9uKGlkLCBpbnRlcm5hbCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyBJZiB0aGUgc291bmQgaGFzbid0IGxvYWRlZCwgYWRkIGl0IHRvIHRoZSBsb2FkIHF1ZXVlIHRvIHN0b3Agd2hlbiBjYXBhYmxlLlxuICAgICAgaWYgKHNlbGYuX3N0YXRlICE9PSAnbG9hZGVkJyB8fCBzZWxmLl9wbGF5TG9jaykge1xuICAgICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgICBldmVudDogJ3N0b3AnLFxuICAgICAgICAgIGFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzZWxmLnN0b3AoaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIGlkIGlzIHBhc3NlZCwgZ2V0IGFsbCBJRCdzIHRvIGJlIHN0b3BwZWQuXG4gICAgICB2YXIgaWRzID0gc2VsZi5fZ2V0U291bmRJZHMoaWQpO1xuXG4gICAgICBmb3IgKHZhciBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIENsZWFyIHRoZSBlbmQgdGltZXIuXG4gICAgICAgIHNlbGYuX2NsZWFyVGltZXIoaWRzW2ldKTtcblxuICAgICAgICAvLyBHZXQgdGhlIHNvdW5kLlxuICAgICAgICB2YXIgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWRzW2ldKTtcblxuICAgICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgICAvLyBSZXNldCB0aGUgc2VlayBwb3NpdGlvbi5cbiAgICAgICAgICBzb3VuZC5fc2VlayA9IHNvdW5kLl9zdGFydCB8fCAwO1xuICAgICAgICAgIHNvdW5kLl9yYXRlU2VlayA9IDA7XG4gICAgICAgICAgc291bmQuX3BhdXNlZCA9IHRydWU7XG4gICAgICAgICAgc291bmQuX2VuZGVkID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIFN0b3AgY3VycmVudGx5IHJ1bm5pbmcgZmFkZXMuXG4gICAgICAgICAgc2VsZi5fc3RvcEZhZGUoaWRzW2ldKTtcblxuICAgICAgICAgIGlmIChzb3VuZC5fbm9kZSkge1xuICAgICAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgc291bmQncyBBdWRpb0J1ZmZlclNvdXJjZU5vZGUgaGFzIGJlZW4gY3JlYXRlZC5cbiAgICAgICAgICAgICAgaWYgKHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc291bmQuX25vZGUuYnVmZmVyU291cmNlLnN0b3AgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2Uubm90ZU9mZigwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLnN0b3AoMCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIGJ1ZmZlciBzb3VyY2UuXG4gICAgICAgICAgICAgICAgc2VsZi5fY2xlYW5CdWZmZXIoc291bmQuX25vZGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc05hTihzb3VuZC5fbm9kZS5kdXJhdGlvbikgfHwgc291bmQuX25vZGUuZHVyYXRpb24gPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9ub2RlLmN1cnJlbnRUaW1lID0gc291bmQuX3N0YXJ0IHx8IDA7XG4gICAgICAgICAgICAgIHNvdW5kLl9ub2RlLnBhdXNlKCk7XG5cbiAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGxpdmUgc3RyZWFtLCBzdG9wIGRvd25sb2FkIG9uY2UgdGhlIGF1ZGlvIGlzIHN0b3BwZWQuXG4gICAgICAgICAgICAgIGlmIChzb3VuZC5fbm9kZS5kdXJhdGlvbiA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgICAgICBzZWxmLl9jbGVhclNvdW5kKHNvdW5kLl9ub2RlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghaW50ZXJuYWwpIHtcbiAgICAgICAgICAgIHNlbGYuX2VtaXQoJ3N0b3AnLCBzb3VuZC5faWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTXV0ZS91bm11dGUgYSBzaW5nbGUgc291bmQgb3IgYWxsIHNvdW5kcyBpbiB0aGlzIEhvd2wgZ3JvdXAuXG4gICAgICogQHBhcmFtICB7Qm9vbGVhbn0gbXV0ZWQgU2V0IHRvIHRydWUgdG8gbXV0ZSBhbmQgZmFsc2UgdG8gdW5tdXRlLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgICAgVGhlIHNvdW5kIElEIHRvIHVwZGF0ZSAob21pdCB0byBtdXRlL3VubXV0ZSBhbGwpLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgbXV0ZTogZnVuY3Rpb24obXV0ZWQsIGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gbXV0ZSB3aGVuIGNhcGFibGUuXG4gICAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnfHwgc2VsZi5fcGxheUxvY2spIHtcbiAgICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgICAgZXZlbnQ6ICdtdXRlJyxcbiAgICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5tdXRlKG11dGVkLCBpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgYXBwbHlpbmcgbXV0ZS91bm11dGUgdG8gYWxsIHNvdW5kcywgdXBkYXRlIHRoZSBncm91cCdzIHZhbHVlLlxuICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBtdXRlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgc2VsZi5fbXV0ZWQgPSBtdXRlZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5fbXV0ZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gaWQgaXMgcGFzc2VkLCBnZXQgYWxsIElEJ3MgdG8gYmUgbXV0ZWQuXG4gICAgICB2YXIgaWRzID0gc2VsZi5fZ2V0U291bmRJZHMoaWQpO1xuXG4gICAgICBmb3IgKHZhciBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIEdldCB0aGUgc291bmQuXG4gICAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZHNbaV0pO1xuXG4gICAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICAgIHNvdW5kLl9tdXRlZCA9IG11dGVkO1xuXG4gICAgICAgICAgLy8gQ2FuY2VsIGFjdGl2ZSBmYWRlIGFuZCBzZXQgdGhlIHZvbHVtZSB0byB0aGUgZW5kIHZhbHVlLlxuICAgICAgICAgIGlmIChzb3VuZC5faW50ZXJ2YWwpIHtcbiAgICAgICAgICAgIHNlbGYuX3N0b3BGYWRlKHNvdW5kLl9pZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvICYmIHNvdW5kLl9ub2RlKSB7XG4gICAgICAgICAgICBzb3VuZC5fbm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKG11dGVkID8gMCA6IHNvdW5kLl92b2x1bWUsIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgIHNvdW5kLl9ub2RlLm11dGVkID0gSG93bGVyLl9tdXRlZCA/IHRydWUgOiBtdXRlZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWxmLl9lbWl0KCdtdXRlJywgc291bmQuX2lkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0L3NldCB0aGUgdm9sdW1lIG9mIHRoaXMgc291bmQgb3Igb2YgdGhlIEhvd2wgZ3JvdXAuIFRoaXMgbWV0aG9kIGNhbiBvcHRpb25hbGx5IHRha2UgMCwgMSBvciAyIGFyZ3VtZW50cy5cbiAgICAgKiAgIHZvbHVtZSgpIC0+IFJldHVybnMgdGhlIGdyb3VwJ3Mgdm9sdW1lIHZhbHVlLlxuICAgICAqICAgdm9sdW1lKGlkKSAtPiBSZXR1cm5zIHRoZSBzb3VuZCBpZCdzIGN1cnJlbnQgdm9sdW1lLlxuICAgICAqICAgdm9sdW1lKHZvbCkgLT4gU2V0cyB0aGUgdm9sdW1lIG9mIGFsbCBzb3VuZHMgaW4gdGhpcyBIb3dsIGdyb3VwLlxuICAgICAqICAgdm9sdW1lKHZvbCwgaWQpIC0+IFNldHMgdGhlIHZvbHVtZSBvZiBwYXNzZWQgc291bmQgaWQuXG4gICAgICogQHJldHVybiB7SG93bC9OdW1iZXJ9IFJldHVybnMgc2VsZiBvciBjdXJyZW50IHZvbHVtZS5cbiAgICAgKi9cbiAgICB2b2x1bWU6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICB2YXIgdm9sLCBpZDtcblxuICAgICAgLy8gRGV0ZXJtaW5lIHRoZSB2YWx1ZXMgYmFzZWQgb24gYXJndW1lbnRzLlxuICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGdyb3Vwcycgdm9sdW1lLlxuICAgICAgICByZXR1cm4gc2VsZi5fdm9sdW1lO1xuICAgICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMSB8fCBhcmdzLmxlbmd0aCA9PT0gMiAmJiB0eXBlb2YgYXJnc1sxXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhpcyBpcyBhbiBJRCwgYW5kIGlmIG5vdCwgYXNzdW1lIGl0IGlzIGEgbmV3IHZvbHVtZS5cbiAgICAgICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKCk7XG4gICAgICAgIHZhciBpbmRleCA9IGlkcy5pbmRleE9mKGFyZ3NbMF0pO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgIGlkID0gcGFyc2VJbnQoYXJnc1swXSwgMTApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZvbCA9IHBhcnNlRmxvYXQoYXJnc1swXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPj0gMikge1xuICAgICAgICB2b2wgPSBwYXJzZUZsb2F0KGFyZ3NbMF0pO1xuICAgICAgICBpZCA9IHBhcnNlSW50KGFyZ3NbMV0sIDEwKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHRoZSB2b2x1bWUgb3IgcmV0dXJuIHRoZSBjdXJyZW50IHZvbHVtZS5cbiAgICAgIHZhciBzb3VuZDtcbiAgICAgIGlmICh0eXBlb2Ygdm9sICE9PSAndW5kZWZpbmVkJyAmJiB2b2wgPj0gMCAmJiB2b2wgPD0gMSkge1xuICAgICAgICAvLyBJZiB0aGUgc291bmQgaGFzbid0IGxvYWRlZCwgYWRkIGl0IHRvIHRoZSBsb2FkIHF1ZXVlIHRvIGNoYW5nZSB2b2x1bWUgd2hlbiBjYXBhYmxlLlxuICAgICAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnfHwgc2VsZi5fcGxheUxvY2spIHtcbiAgICAgICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgIGV2ZW50OiAndm9sdW1lJyxcbiAgICAgICAgICAgIGFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHNlbGYudm9sdW1lLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIGdyb3VwIHZvbHVtZS5cbiAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBzZWxmLl92b2x1bWUgPSB2b2w7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgb25lIG9yIGFsbCB2b2x1bWVzLlxuICAgICAgICBpZCA9IHNlbGYuX2dldFNvdW5kSWRzKGlkKTtcbiAgICAgICAgZm9yICh2YXIgaT0wOyBpPGlkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgLy8gR2V0IHRoZSBzb3VuZC5cbiAgICAgICAgICBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZFtpXSk7XG5cbiAgICAgICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgICAgIHNvdW5kLl92b2x1bWUgPSB2b2w7XG5cbiAgICAgICAgICAgIC8vIFN0b3AgY3VycmVudGx5IHJ1bm5pbmcgZmFkZXMuXG4gICAgICAgICAgICBpZiAoIWFyZ3NbMl0pIHtcbiAgICAgICAgICAgICAgc2VsZi5fc3RvcEZhZGUoaWRbaV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8gJiYgc291bmQuX25vZGUgJiYgIXNvdW5kLl9tdXRlZCkge1xuICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKHZvbCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdW5kLl9ub2RlICYmICFzb3VuZC5fbXV0ZWQpIHtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUudm9sdW1lID0gdm9sICogSG93bGVyLnZvbHVtZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZWxmLl9lbWl0KCd2b2x1bWUnLCBzb3VuZC5faWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc291bmQgPSBpZCA/IHNlbGYuX3NvdW5kQnlJZChpZCkgOiBzZWxmLl9zb3VuZHNbMF07XG4gICAgICAgIHJldHVybiBzb3VuZCA/IHNvdW5kLl92b2x1bWUgOiAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmFkZSBhIGN1cnJlbnRseSBwbGF5aW5nIHNvdW5kIGJldHdlZW4gdHdvIHZvbHVtZXMgKGlmIG5vIGlkIGlzIHBhc3NlZCwgYWxsIHNvdW5kcyB3aWxsIGZhZGUpLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gZnJvbSBUaGUgdmFsdWUgdG8gZmFkZSBmcm9tICgwLjAgdG8gMS4wKS5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHRvICAgVGhlIHZvbHVtZSB0byBmYWRlIHRvICgwLjAgdG8gMS4wKS5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGxlbiAgVGltZSBpbiBtaWxsaXNlY29uZHMgdG8gZmFkZS5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkICAgVGhlIHNvdW5kIGlkIChvbWl0IHRvIGZhZGUgYWxsIHNvdW5kcykuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBmYWRlOiBmdW5jdGlvbihmcm9tLCB0bywgbGVuLCBpZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyBJZiB0aGUgc291bmQgaGFzbid0IGxvYWRlZCwgYWRkIGl0IHRvIHRoZSBsb2FkIHF1ZXVlIHRvIGZhZGUgd2hlbiBjYXBhYmxlLlxuICAgICAgaWYgKHNlbGYuX3N0YXRlICE9PSAnbG9hZGVkJyB8fCBzZWxmLl9wbGF5TG9jaykge1xuICAgICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgICBldmVudDogJ2ZhZGUnLFxuICAgICAgICAgIGFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzZWxmLmZhZGUoZnJvbSwgdG8sIGxlbiwgaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgdG8vZnJvbS9sZW4gdmFsdWVzIGFyZSBudW1iZXJzLlxuICAgICAgZnJvbSA9IE1hdGgubWluKE1hdGgubWF4KDAsIHBhcnNlRmxvYXQoZnJvbSkpLCAxKTtcbiAgICAgIHRvID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgcGFyc2VGbG9hdCh0bykpLCAxKTtcbiAgICAgIGxlbiA9IHBhcnNlRmxvYXQobGVuKTtcblxuICAgICAgLy8gU2V0IHRoZSB2b2x1bWUgdG8gdGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAgc2VsZi52b2x1bWUoZnJvbSwgaWQpO1xuXG4gICAgICAvLyBGYWRlIHRoZSB2b2x1bWUgb2Ygb25lIG9yIGFsbCBzb3VuZHMuXG4gICAgICB2YXIgaWRzID0gc2VsZi5fZ2V0U291bmRJZHMoaWQpO1xuICAgICAgZm9yICh2YXIgaT0wOyBpPGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBHZXQgdGhlIHNvdW5kLlxuICAgICAgICB2YXIgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWRzW2ldKTtcblxuICAgICAgICAvLyBDcmVhdGUgYSBsaW5lYXIgZmFkZSBvciBmYWxsIGJhY2sgdG8gdGltZW91dHMgd2l0aCBIVE1MNSBBdWRpby5cbiAgICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgICAgLy8gU3RvcCB0aGUgcHJldmlvdXMgZmFkZSBpZiBubyBzcHJpdGUgaXMgYmVpbmcgdXNlZCAob3RoZXJ3aXNlLCB2b2x1bWUgaGFuZGxlcyB0aGlzKS5cbiAgICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgICBzZWxmLl9zdG9wRmFkZShpZHNbaV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIHdlIGFyZSB1c2luZyBXZWIgQXVkaW8sIGxldCB0aGUgbmF0aXZlIG1ldGhvZHMgZG8gdGhlIGFjdHVhbCBmYWRlLlxuICAgICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbyAmJiAhc291bmQuX211dGVkKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFRpbWUgPSBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lO1xuICAgICAgICAgICAgdmFyIGVuZCA9IGN1cnJlbnRUaW1lICsgKGxlbiAvIDEwMDApO1xuICAgICAgICAgICAgc291bmQuX3ZvbHVtZSA9IGZyb207XG4gICAgICAgICAgICBzb3VuZC5fbm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKGZyb20sIGN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgIHNvdW5kLl9ub2RlLmdhaW4ubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUodG8sIGVuZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi5fc3RhcnRGYWRlSW50ZXJ2YWwoc291bmQsIGZyb20sIHRvLCBsZW4sIGlkc1tpXSwgdHlwZW9mIGlkID09PSAndW5kZWZpbmVkJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN0YXJ0cyB0aGUgaW50ZXJuYWwgaW50ZXJ2YWwgdG8gZmFkZSBhIHNvdW5kLlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gc291bmQgUmVmZXJlbmNlIHRvIHNvdW5kIHRvIGZhZGUuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBmcm9tIFRoZSB2YWx1ZSB0byBmYWRlIGZyb20gKDAuMCB0byAxLjApLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gdG8gICBUaGUgdm9sdW1lIHRvIGZhZGUgdG8gKDAuMCB0byAxLjApLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gbGVuICBUaW1lIGluIG1pbGxpc2Vjb25kcyB0byBmYWRlLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgICBUaGUgc291bmQgaWQgdG8gZmFkZS5cbiAgICAgKiBAcGFyYW0gIHtCb29sZWFufSBpc0dyb3VwICAgSWYgdHJ1ZSwgc2V0IHRoZSB2b2x1bWUgb24gdGhlIGdyb3VwLlxuICAgICAqL1xuICAgIF9zdGFydEZhZGVJbnRlcnZhbDogZnVuY3Rpb24oc291bmQsIGZyb20sIHRvLCBsZW4sIGlkLCBpc0dyb3VwKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgdm9sID0gZnJvbTtcbiAgICAgIHZhciBkaWZmID0gdG8gLSBmcm9tO1xuICAgICAgdmFyIHN0ZXBzID0gTWF0aC5hYnMoZGlmZiAvIDAuMDEpO1xuICAgICAgdmFyIHN0ZXBMZW4gPSBNYXRoLm1heCg0LCAoc3RlcHMgPiAwKSA/IGxlbiAvIHN0ZXBzIDogbGVuKTtcbiAgICAgIHZhciBsYXN0VGljayA9IERhdGUubm93KCk7XG5cbiAgICAgIC8vIFN0b3JlIHRoZSB2YWx1ZSBiZWluZyBmYWRlZCB0by5cbiAgICAgIHNvdW5kLl9mYWRlVG8gPSB0bztcblxuICAgICAgLy8gVXBkYXRlIHRoZSB2b2x1bWUgdmFsdWUgb24gZWFjaCBpbnRlcnZhbCB0aWNrLlxuICAgICAgc291bmQuX2ludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgdm9sdW1lIGJhc2VkIG9uIHRoZSB0aW1lIHNpbmNlIHRoZSBsYXN0IHRpY2suXG4gICAgICAgIHZhciB0aWNrID0gKERhdGUubm93KCkgLSBsYXN0VGljaykgLyBsZW47XG4gICAgICAgIGxhc3RUaWNrID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdm9sICs9IGRpZmYgKiB0aWNrO1xuXG4gICAgICAgIC8vIFJvdW5kIHRvIHdpdGhpbiAyIGRlY2ltYWwgcG9pbnRzLlxuICAgICAgICB2b2wgPSBNYXRoLnJvdW5kKHZvbCAqIDEwMCkgLyAxMDA7XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB2b2x1bWUgaXMgaW4gdGhlIHJpZ2h0IGJvdW5kcy5cbiAgICAgICAgaWYgKGRpZmYgPCAwKSB7XG4gICAgICAgICAgdm9sID0gTWF0aC5tYXgodG8sIHZvbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdm9sID0gTWF0aC5taW4odG8sIHZvbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGFuZ2UgdGhlIHZvbHVtZS5cbiAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgICAgc291bmQuX3ZvbHVtZSA9IHZvbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxmLnZvbHVtZSh2b2wsIHNvdW5kLl9pZCwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIGdyb3VwJ3Mgdm9sdW1lLlxuICAgICAgICBpZiAoaXNHcm91cCkge1xuICAgICAgICAgIHNlbGYuX3ZvbHVtZSA9IHZvbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdoZW4gdGhlIGZhZGUgaXMgY29tcGxldGUsIHN0b3AgaXQgYW5kIGZpcmUgZXZlbnQuXG4gICAgICAgIGlmICgodG8gPCBmcm9tICYmIHZvbCA8PSB0bykgfHwgKHRvID4gZnJvbSAmJiB2b2wgPj0gdG8pKSB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChzb3VuZC5faW50ZXJ2YWwpO1xuICAgICAgICAgIHNvdW5kLl9pbnRlcnZhbCA9IG51bGw7XG4gICAgICAgICAgc291bmQuX2ZhZGVUbyA9IG51bGw7XG4gICAgICAgICAgc2VsZi52b2x1bWUodG8sIHNvdW5kLl9pZCk7XG4gICAgICAgICAgc2VsZi5fZW1pdCgnZmFkZScsIHNvdW5kLl9pZCk7XG4gICAgICAgIH1cbiAgICAgIH0sIHN0ZXBMZW4pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBtZXRob2QgdGhhdCBzdG9wcyB0aGUgY3VycmVudGx5IHBsYXlpbmcgZmFkZSB3aGVuXG4gICAgICogYSBuZXcgZmFkZSBzdGFydHMsIHZvbHVtZSBpcyBjaGFuZ2VkIG9yIHRoZSBzb3VuZCBpcyBzdG9wcGVkLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgVGhlIHNvdW5kIGlkLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgX3N0b3BGYWRlOiBmdW5jdGlvbihpZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkKTtcblxuICAgICAgaWYgKHNvdW5kICYmIHNvdW5kLl9pbnRlcnZhbCkge1xuICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgICBzb3VuZC5fbm9kZS5nYWluLmNhbmNlbFNjaGVkdWxlZFZhbHVlcyhIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNsZWFySW50ZXJ2YWwoc291bmQuX2ludGVydmFsKTtcbiAgICAgICAgc291bmQuX2ludGVydmFsID0gbnVsbDtcbiAgICAgICAgc2VsZi52b2x1bWUoc291bmQuX2ZhZGVUbywgaWQpO1xuICAgICAgICBzb3VuZC5fZmFkZVRvID0gbnVsbDtcbiAgICAgICAgc2VsZi5fZW1pdCgnZmFkZScsIGlkKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldC9zZXQgdGhlIGxvb3AgcGFyYW1ldGVyIG9uIGEgc291bmQuIFRoaXMgbWV0aG9kIGNhbiBvcHRpb25hbGx5IHRha2UgMCwgMSBvciAyIGFyZ3VtZW50cy5cbiAgICAgKiAgIGxvb3AoKSAtPiBSZXR1cm5zIHRoZSBncm91cCdzIGxvb3AgdmFsdWUuXG4gICAgICogICBsb29wKGlkKSAtPiBSZXR1cm5zIHRoZSBzb3VuZCBpZCdzIGxvb3AgdmFsdWUuXG4gICAgICogICBsb29wKGxvb3ApIC0+IFNldHMgdGhlIGxvb3AgdmFsdWUgZm9yIGFsbCBzb3VuZHMgaW4gdGhpcyBIb3dsIGdyb3VwLlxuICAgICAqICAgbG9vcChsb29wLCBpZCkgLT4gU2V0cyB0aGUgbG9vcCB2YWx1ZSBvZiBwYXNzZWQgc291bmQgaWQuXG4gICAgICogQHJldHVybiB7SG93bC9Cb29sZWFufSBSZXR1cm5zIHNlbGYgb3IgY3VycmVudCBsb29wIHZhbHVlLlxuICAgICAqL1xuICAgIGxvb3A6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICB2YXIgbG9vcCwgaWQsIHNvdW5kO1xuXG4gICAgICAvLyBEZXRlcm1pbmUgdGhlIHZhbHVlcyBmb3IgbG9vcCBhbmQgaWQuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSBncm91J3MgbG9vcCB2YWx1ZS5cbiAgICAgICAgcmV0dXJuIHNlbGYuX2xvb3A7XG4gICAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYXJnc1swXSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgbG9vcCA9IGFyZ3NbMF07XG4gICAgICAgICAgc2VsZi5fbG9vcCA9IGxvb3A7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmV0dXJuIHRoaXMgc291bmQncyBsb29wIHZhbHVlLlxuICAgICAgICAgIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKHBhcnNlSW50KGFyZ3NbMF0sIDEwKSk7XG4gICAgICAgICAgcmV0dXJuIHNvdW5kID8gc291bmQuX2xvb3AgOiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBsb29wID0gYXJnc1swXTtcbiAgICAgICAgaWQgPSBwYXJzZUludChhcmdzWzFdLCAxMCk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIGlkIGlzIHBhc3NlZCwgZ2V0IGFsbCBJRCdzIHRvIGJlIGxvb3BlZC5cbiAgICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG4gICAgICBmb3IgKHZhciBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkc1tpXSk7XG5cbiAgICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgICAgc291bmQuX2xvb3AgPSBsb29wO1xuICAgICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbyAmJiBzb3VuZC5fbm9kZSAmJiBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UpIHtcbiAgICAgICAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5sb29wID0gbG9vcDtcbiAgICAgICAgICAgIGlmIChsb29wKSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5sb29wU3RhcnQgPSBzb3VuZC5fc3RhcnQgfHwgMDtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLmxvb3BFbmQgPSBzb3VuZC5fc3RvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldC9zZXQgdGhlIHBsYXliYWNrIHJhdGUgb2YgYSBzb3VuZC4gVGhpcyBtZXRob2QgY2FuIG9wdGlvbmFsbHkgdGFrZSAwLCAxIG9yIDIgYXJndW1lbnRzLlxuICAgICAqICAgcmF0ZSgpIC0+IFJldHVybnMgdGhlIGZpcnN0IHNvdW5kIG5vZGUncyBjdXJyZW50IHBsYXliYWNrIHJhdGUuXG4gICAgICogICByYXRlKGlkKSAtPiBSZXR1cm5zIHRoZSBzb3VuZCBpZCdzIGN1cnJlbnQgcGxheWJhY2sgcmF0ZS5cbiAgICAgKiAgIHJhdGUocmF0ZSkgLT4gU2V0cyB0aGUgcGxheWJhY2sgcmF0ZSBvZiBhbGwgc291bmRzIGluIHRoaXMgSG93bCBncm91cC5cbiAgICAgKiAgIHJhdGUocmF0ZSwgaWQpIC0+IFNldHMgdGhlIHBsYXliYWNrIHJhdGUgb2YgcGFzc2VkIHNvdW5kIGlkLlxuICAgICAqIEByZXR1cm4ge0hvd2wvTnVtYmVyfSBSZXR1cm5zIHNlbGYgb3IgdGhlIGN1cnJlbnQgcGxheWJhY2sgcmF0ZS5cbiAgICAgKi9cbiAgICByYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgdmFyIHJhdGUsIGlkO1xuXG4gICAgICAvLyBEZXRlcm1pbmUgdGhlIHZhbHVlcyBiYXNlZCBvbiBhcmd1bWVudHMuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gV2Ugd2lsbCBzaW1wbHkgcmV0dXJuIHRoZSBjdXJyZW50IHJhdGUgb2YgdGhlIGZpcnN0IG5vZGUuXG4gICAgICAgIGlkID0gc2VsZi5fc291bmRzWzBdLl9pZDtcbiAgICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhpcyBpcyBhbiBJRCwgYW5kIGlmIG5vdCwgYXNzdW1lIGl0IGlzIGEgbmV3IHJhdGUgdmFsdWUuXG4gICAgICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcygpO1xuICAgICAgICB2YXIgaW5kZXggPSBpZHMuaW5kZXhPZihhcmdzWzBdKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBpZCA9IHBhcnNlSW50KGFyZ3NbMF0sIDEwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByYXRlID0gcGFyc2VGbG9hdChhcmdzWzBdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICByYXRlID0gcGFyc2VGbG9hdChhcmdzWzBdKTtcbiAgICAgICAgaWQgPSBwYXJzZUludChhcmdzWzFdLCAxMCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgcGxheWJhY2sgcmF0ZSBvciByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUuXG4gICAgICB2YXIgc291bmQ7XG4gICAgICBpZiAodHlwZW9mIHJhdGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gY2hhbmdlIHBsYXliYWNrIHJhdGUgd2hlbiBjYXBhYmxlLlxuICAgICAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnIHx8IHNlbGYuX3BsYXlMb2NrKSB7XG4gICAgICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgICAgICBldmVudDogJ3JhdGUnLFxuICAgICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgc2VsZi5yYXRlLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIGdyb3VwIHJhdGUuXG4gICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgc2VsZi5fcmF0ZSA9IHJhdGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgb25lIG9yIGFsbCB2b2x1bWVzLlxuICAgICAgICBpZCA9IHNlbGYuX2dldFNvdW5kSWRzKGlkKTtcbiAgICAgICAgZm9yICh2YXIgaT0wOyBpPGlkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgLy8gR2V0IHRoZSBzb3VuZC5cbiAgICAgICAgICBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZFtpXSk7XG5cbiAgICAgICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2Ygb3VyIHBvc2l0aW9uIHdoZW4gdGhlIHJhdGUgY2hhbmdlZCBhbmQgdXBkYXRlIHRoZSBwbGF5YmFja1xuICAgICAgICAgICAgLy8gc3RhcnQgcG9zaXRpb24gc28gd2UgY2FuIHByb3Blcmx5IGFkanVzdCB0aGUgc2VlayBwb3NpdGlvbiBmb3IgdGltZSBlbGFwc2VkLlxuICAgICAgICAgICAgaWYgKHNlbGYucGxheWluZyhpZFtpXSkpIHtcbiAgICAgICAgICAgICAgc291bmQuX3JhdGVTZWVrID0gc2VsZi5zZWVrKGlkW2ldKTtcbiAgICAgICAgICAgICAgc291bmQuX3BsYXlTdGFydCA9IHNlbGYuX3dlYkF1ZGlvID8gSG93bGVyLmN0eC5jdXJyZW50VGltZSA6IHNvdW5kLl9wbGF5U3RhcnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzb3VuZC5fcmF0ZSA9IHJhdGU7XG5cbiAgICAgICAgICAgIC8vIENoYW5nZSB0aGUgcGxheWJhY2sgcmF0ZS5cbiAgICAgICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbyAmJiBzb3VuZC5fbm9kZSAmJiBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UpIHtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLnBsYXliYWNrUmF0ZS5zZXRWYWx1ZUF0VGltZShyYXRlLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUucGxheWJhY2tSYXRlID0gcmF0ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHRpbWVycy5cbiAgICAgICAgICAgIHZhciBzZWVrID0gc2VsZi5zZWVrKGlkW2ldKTtcbiAgICAgICAgICAgIHZhciBkdXJhdGlvbiA9ICgoc2VsZi5fc3ByaXRlW3NvdW5kLl9zcHJpdGVdWzBdICsgc2VsZi5fc3ByaXRlW3NvdW5kLl9zcHJpdGVdWzFdKSAvIDEwMDApIC0gc2VlaztcbiAgICAgICAgICAgIHZhciB0aW1lb3V0ID0gKGR1cmF0aW9uICogMTAwMCkgLyBNYXRoLmFicyhzb3VuZC5fcmF0ZSk7XG5cbiAgICAgICAgICAgIC8vIFN0YXJ0IGEgbmV3IGVuZCB0aW1lciBpZiBzb3VuZCBpcyBhbHJlYWR5IHBsYXlpbmcuXG4gICAgICAgICAgICBpZiAoc2VsZi5fZW5kVGltZXJzW2lkW2ldXSB8fCAhc291bmQuX3BhdXNlZCkge1xuICAgICAgICAgICAgICBzZWxmLl9jbGVhclRpbWVyKGlkW2ldKTtcbiAgICAgICAgICAgICAgc2VsZi5fZW5kVGltZXJzW2lkW2ldXSA9IHNldFRpbWVvdXQoc2VsZi5fZW5kZWQuYmluZChzZWxmLCBzb3VuZCksIHRpbWVvdXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZWxmLl9lbWl0KCdyYXRlJywgc291bmQuX2lkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkKTtcbiAgICAgICAgcmV0dXJuIHNvdW5kID8gc291bmQuX3JhdGUgOiBzZWxmLl9yYXRlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0L3NldCB0aGUgc2VlayBwb3NpdGlvbiBvZiBhIHNvdW5kLiBUaGlzIG1ldGhvZCBjYW4gb3B0aW9uYWxseSB0YWtlIDAsIDEgb3IgMiBhcmd1bWVudHMuXG4gICAgICogICBzZWVrKCkgLT4gUmV0dXJucyB0aGUgZmlyc3Qgc291bmQgbm9kZSdzIGN1cnJlbnQgc2VlayBwb3NpdGlvbi5cbiAgICAgKiAgIHNlZWsoaWQpIC0+IFJldHVybnMgdGhlIHNvdW5kIGlkJ3MgY3VycmVudCBzZWVrIHBvc2l0aW9uLlxuICAgICAqICAgc2VlayhzZWVrKSAtPiBTZXRzIHRoZSBzZWVrIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBzb3VuZCBub2RlLlxuICAgICAqICAgc2VlayhzZWVrLCBpZCkgLT4gU2V0cyB0aGUgc2VlayBwb3NpdGlvbiBvZiBwYXNzZWQgc291bmQgaWQuXG4gICAgICogQHJldHVybiB7SG93bC9OdW1iZXJ9IFJldHVybnMgc2VsZiBvciB0aGUgY3VycmVudCBzZWVrIHBvc2l0aW9uLlxuICAgICAqL1xuICAgIHNlZWs6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICB2YXIgc2VlaywgaWQ7XG5cbiAgICAgIC8vIERldGVybWluZSB0aGUgdmFsdWVzIGJhc2VkIG9uIGFyZ3VtZW50cy5cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBXZSB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIGZpcnN0IG5vZGUuXG4gICAgICAgIGlkID0gc2VsZi5fc291bmRzWzBdLl9pZDtcbiAgICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhpcyBpcyBhbiBJRCwgYW5kIGlmIG5vdCwgYXNzdW1lIGl0IGlzIGEgbmV3IHNlZWsgcG9zaXRpb24uXG4gICAgICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcygpO1xuICAgICAgICB2YXIgaW5kZXggPSBpZHMuaW5kZXhPZihhcmdzWzBdKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBpZCA9IHBhcnNlSW50KGFyZ3NbMF0sIDEwKTtcbiAgICAgICAgfSBlbHNlIGlmIChzZWxmLl9zb3VuZHMubGVuZ3RoKSB7XG4gICAgICAgICAgaWQgPSBzZWxmLl9zb3VuZHNbMF0uX2lkO1xuICAgICAgICAgIHNlZWsgPSBwYXJzZUZsb2F0KGFyZ3NbMF0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHNlZWsgPSBwYXJzZUZsb2F0KGFyZ3NbMF0pO1xuICAgICAgICBpZCA9IHBhcnNlSW50KGFyZ3NbMV0sIDEwKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gSUQsIGJhaWwgb3V0LlxuICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gc2VlayB3aGVuIGNhcGFibGUuXG4gICAgICBpZiAodHlwZW9mIHNlZWsgPT09ICdudW1iZXInICYmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcgfHwgc2VsZi5fcGxheUxvY2spKSB7XG4gICAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICAgIGV2ZW50OiAnc2VlaycsXG4gICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYuc2Vlay5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdGhlIHNvdW5kLlxuICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkKTtcblxuICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2VlayA9PT0gJ251bWJlcicgJiYgc2VlayA+PSAwKSB7XG4gICAgICAgICAgLy8gUGF1c2UgdGhlIHNvdW5kIGFuZCB1cGRhdGUgcG9zaXRpb24gZm9yIHJlc3RhcnRpbmcgcGxheWJhY2suXG4gICAgICAgICAgdmFyIHBsYXlpbmcgPSBzZWxmLnBsYXlpbmcoaWQpO1xuICAgICAgICAgIGlmIChwbGF5aW5nKSB7XG4gICAgICAgICAgICBzZWxmLnBhdXNlKGlkLCB0cnVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBNb3ZlIHRoZSBwb3NpdGlvbiBvZiB0aGUgdHJhY2sgYW5kIGNhbmNlbCB0aW1lci5cbiAgICAgICAgICBzb3VuZC5fc2VlayA9IHNlZWs7XG4gICAgICAgICAgc291bmQuX2VuZGVkID0gZmFsc2U7XG4gICAgICAgICAgc2VsZi5fY2xlYXJUaW1lcihpZCk7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgdGhlIHNlZWsgcG9zaXRpb24gZm9yIEhUTUw1IEF1ZGlvLlxuICAgICAgICAgIGlmICghc2VsZi5fd2ViQXVkaW8gJiYgc291bmQuX25vZGUgJiYgIWlzTmFOKHNvdW5kLl9ub2RlLmR1cmF0aW9uKSkge1xuICAgICAgICAgICAgc291bmQuX25vZGUuY3VycmVudFRpbWUgPSBzZWVrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNlZWsgYW5kIGVtaXQgd2hlbiByZWFkeS5cbiAgICAgICAgICB2YXIgc2Vla0FuZEVtaXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYuX2VtaXQoJ3NlZWsnLCBpZCk7XG5cbiAgICAgICAgICAgIC8vIFJlc3RhcnQgdGhlIHBsYXliYWNrIGlmIHRoZSBzb3VuZCB3YXMgcGxheWluZy5cbiAgICAgICAgICAgIGlmIChwbGF5aW5nKSB7XG4gICAgICAgICAgICAgIHNlbGYucGxheShpZCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBwbGF5IGxvY2sgdG8gYmUgdW5zZXQgYmVmb3JlIGVtaXR0aW5nIChIVE1MNSBBdWRpbykuXG4gICAgICAgICAgaWYgKHBsYXlpbmcgJiYgIXNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgICAgICB2YXIgZW1pdFNlZWsgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKCFzZWxmLl9wbGF5TG9jaykge1xuICAgICAgICAgICAgICAgIHNlZWtBbmRFbWl0KCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChlbWl0U2VlaywgMCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGVtaXRTZWVrLCAwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2Vla0FuZEVtaXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgICAgICB2YXIgcmVhbFRpbWUgPSBzZWxmLnBsYXlpbmcoaWQpID8gSG93bGVyLmN0eC5jdXJyZW50VGltZSAtIHNvdW5kLl9wbGF5U3RhcnQgOiAwO1xuICAgICAgICAgICAgdmFyIHJhdGVTZWVrID0gc291bmQuX3JhdGVTZWVrID8gc291bmQuX3JhdGVTZWVrIC0gc291bmQuX3NlZWsgOiAwO1xuICAgICAgICAgICAgcmV0dXJuIHNvdW5kLl9zZWVrICsgKHJhdGVTZWVrICsgcmVhbFRpbWUgKiBNYXRoLmFicyhzb3VuZC5fcmF0ZSkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc291bmQuX25vZGUuY3VycmVudFRpbWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIHNwZWNpZmljIHNvdW5kIGlzIGN1cnJlbnRseSBwbGF5aW5nIG9yIG5vdCAoaWYgaWQgaXMgcHJvdmlkZWQpLCBvciBjaGVjayBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIHNvdW5kcyBpbiB0aGUgZ3JvdXAgaXMgcGxheWluZyBvciBub3QuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSAgaWQgVGhlIHNvdW5kIGlkIHRvIGNoZWNrLiBJZiBub25lIGlzIHBhc3NlZCwgdGhlIHdob2xlIHNvdW5kIGdyb3VwIGlzIGNoZWNrZWQuXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiBwbGF5aW5nIGFuZCBmYWxzZSBpZiBub3QuXG4gICAgICovXG4gICAgcGxheWluZzogZnVuY3Rpb24oaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gQ2hlY2sgdGhlIHBhc3NlZCBzb3VuZCBJRCAoaWYgYW55KS5cbiAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZCk7XG4gICAgICAgIHJldHVybiBzb3VuZCA/ICFzb3VuZC5fcGF1c2VkIDogZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIE90aGVyd2lzZSwgbG9vcCB0aHJvdWdoIGFsbCBzb3VuZHMgYW5kIGNoZWNrIGlmIGFueSBhcmUgcGxheWluZy5cbiAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9zb3VuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFzZWxmLl9zb3VuZHNbaV0uX3BhdXNlZCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBkdXJhdGlvbiBvZiB0aGlzIHNvdW5kLiBQYXNzaW5nIGEgc291bmQgaWQgd2lsbCByZXR1cm4gdGhlIHNwcml0ZSBkdXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkIFRoZSBzb3VuZCBpZCB0byBjaGVjay4gSWYgbm9uZSBpcyBwYXNzZWQsIHJldHVybiBmdWxsIHNvdXJjZSBkdXJhdGlvbi5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IEF1ZGlvIGR1cmF0aW9uIGluIHNlY29uZHMuXG4gICAgICovXG4gICAgZHVyYXRpb246IGZ1bmN0aW9uKGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgZHVyYXRpb24gPSBzZWxmLl9kdXJhdGlvbjtcblxuICAgICAgLy8gSWYgd2UgcGFzcyBhbiBJRCwgZ2V0IHRoZSBzb3VuZCBhbmQgcmV0dXJuIHRoZSBzcHJpdGUgbGVuZ3RoLlxuICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkKTtcbiAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICBkdXJhdGlvbiA9IHNlbGYuX3Nwcml0ZVtzb3VuZC5fc3ByaXRlXVsxXSAvIDEwMDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkdXJhdGlvbjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBsb2FkZWQgc3RhdGUgb2YgdGhpcyBIb3dsLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gJ3VubG9hZGVkJywgJ2xvYWRpbmcnLCAnbG9hZGVkJ1xuICAgICAqL1xuICAgIHN0YXRlOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVW5sb2FkIGFuZCBkZXN0cm95IHRoZSBjdXJyZW50IEhvd2wgb2JqZWN0LlxuICAgICAqIFRoaXMgd2lsbCBpbW1lZGlhdGVseSBzdG9wIGFsbCBzb3VuZCBpbnN0YW5jZXMgYXR0YWNoZWQgdG8gdGhpcyBncm91cC5cbiAgICAgKi9cbiAgICB1bmxvYWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyBTdG9wIHBsYXlpbmcgYW55IGFjdGl2ZSBzb3VuZHMuXG4gICAgICB2YXIgc291bmRzID0gc2VsZi5fc291bmRzO1xuICAgICAgZm9yICh2YXIgaT0wOyBpPHNvdW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBTdG9wIHRoZSBzb3VuZCBpZiBpdCBpcyBjdXJyZW50bHkgcGxheWluZy5cbiAgICAgICAgaWYgKCFzb3VuZHNbaV0uX3BhdXNlZCkge1xuICAgICAgICAgIHNlbGYuc3RvcChzb3VuZHNbaV0uX2lkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgc291cmNlIG9yIGRpc2Nvbm5lY3QuXG4gICAgICAgIGlmICghc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgICAvLyBTZXQgdGhlIHNvdXJjZSB0byAwLXNlY29uZCBzaWxlbmNlIHRvIHN0b3AgYW55IGRvd25sb2FkaW5nIChleGNlcHQgaW4gSUUpLlxuICAgICAgICAgIHNlbGYuX2NsZWFyU291bmQoc291bmRzW2ldLl9ub2RlKTtcblxuICAgICAgICAgIC8vIFJlbW92ZSBhbnkgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAgICAgIHNvdW5kc1tpXS5fbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIHNvdW5kc1tpXS5fZXJyb3JGbiwgZmFsc2UpO1xuICAgICAgICAgIHNvdW5kc1tpXS5fbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEhvd2xlci5fY2FuUGxheUV2ZW50LCBzb3VuZHNbaV0uX2xvYWRGbiwgZmFsc2UpO1xuICAgICAgICAgIHNvdW5kc1tpXS5fbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmRlZCcsIHNvdW5kc1tpXS5fZW5kRm4sIGZhbHNlKTtcblxuICAgICAgICAgIC8vIFJlbGVhc2UgdGhlIEF1ZGlvIG9iamVjdCBiYWNrIHRvIHRoZSBwb29sLlxuICAgICAgICAgIEhvd2xlci5fcmVsZWFzZUh0bWw1QXVkaW8oc291bmRzW2ldLl9ub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtcHR5IG91dCBhbGwgb2YgdGhlIG5vZGVzLlxuICAgICAgICBkZWxldGUgc291bmRzW2ldLl9ub2RlO1xuXG4gICAgICAgIC8vIE1ha2Ugc3VyZSBhbGwgdGltZXJzIGFyZSBjbGVhcmVkIG91dC5cbiAgICAgICAgc2VsZi5fY2xlYXJUaW1lcihzb3VuZHNbaV0uX2lkKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVtb3ZlIHRoZSByZWZlcmVuY2VzIGluIHRoZSBnbG9iYWwgSG93bGVyIG9iamVjdC5cbiAgICAgIHZhciBpbmRleCA9IEhvd2xlci5faG93bHMuaW5kZXhPZihzZWxmKTtcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIEhvd2xlci5faG93bHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cblxuICAgICAgLy8gRGVsZXRlIHRoaXMgc291bmQgZnJvbSB0aGUgY2FjaGUgKGlmIG5vIG90aGVyIEhvd2wgaXMgdXNpbmcgaXQpLlxuICAgICAgdmFyIHJlbUNhY2hlID0gdHJ1ZTtcbiAgICAgIGZvciAoaT0wOyBpPEhvd2xlci5faG93bHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKEhvd2xlci5faG93bHNbaV0uX3NyYyA9PT0gc2VsZi5fc3JjIHx8IHNlbGYuX3NyYy5pbmRleE9mKEhvd2xlci5faG93bHNbaV0uX3NyYykgPj0gMCkge1xuICAgICAgICAgIHJlbUNhY2hlID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNhY2hlICYmIHJlbUNhY2hlKSB7XG4gICAgICAgIGRlbGV0ZSBjYWNoZVtzZWxmLl9zcmNdO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciBnbG9iYWwgZXJyb3JzLlxuICAgICAgSG93bGVyLm5vQXVkaW8gPSBmYWxzZTtcblxuICAgICAgLy8gQ2xlYXIgb3V0IGBzZWxmYC5cbiAgICAgIHNlbGYuX3N0YXRlID0gJ3VubG9hZGVkJztcbiAgICAgIHNlbGYuX3NvdW5kcyA9IFtdO1xuICAgICAgc2VsZiA9IG51bGw7XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gdG8gYSBjdXN0b20gZXZlbnQuXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSAgIGV2ZW50IEV2ZW50IG5hbWUuXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IGZuICAgIExpc3RlbmVyIHRvIGNhbGwuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSAgIGlkICAgIChvcHRpb25hbCkgT25seSBsaXN0ZW4gdG8gZXZlbnRzIGZvciB0aGlzIHNvdW5kLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gICBvbmNlICAoSU5URVJOQUwpIE1hcmtzIGV2ZW50IHRvIGZpcmUgb25seSBvbmNlLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgb246IGZ1bmN0aW9uKGV2ZW50LCBmbiwgaWQsIG9uY2UpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBldmVudHMgPSBzZWxmWydfb24nICsgZXZlbnRdO1xuXG4gICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGV2ZW50cy5wdXNoKG9uY2UgPyB7aWQ6IGlkLCBmbjogZm4sIG9uY2U6IG9uY2V9IDoge2lkOiBpZCwgZm46IGZufSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBjdXN0b20gZXZlbnQuIENhbGwgd2l0aG91dCBwYXJhbWV0ZXJzIHRvIHJlbW92ZSBhbGwgZXZlbnRzLlxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gICBldmVudCBFdmVudCBuYW1lLlxuICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmbiAgICBMaXN0ZW5lciB0byByZW1vdmUuIExlYXZlIGVtcHR5IHRvIHJlbW92ZSBhbGwuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSAgIGlkICAgIChvcHRpb25hbCkgT25seSByZW1vdmUgZXZlbnRzIGZvciB0aGlzIHNvdW5kLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgb2ZmOiBmdW5jdGlvbihldmVudCwgZm4sIGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgZXZlbnRzID0gc2VsZlsnX29uJyArIGV2ZW50XTtcbiAgICAgIHZhciBpID0gMDtcblxuICAgICAgLy8gQWxsb3cgcGFzc2luZyBqdXN0IGFuIGV2ZW50IGFuZCBJRC5cbiAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlkID0gZm47XG4gICAgICAgIGZuID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGZuIHx8IGlkKSB7XG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCBldmVudCBzdG9yZSBhbmQgcmVtb3ZlIHRoZSBwYXNzZWQgZnVuY3Rpb24uXG4gICAgICAgIGZvciAoaT0wOyBpPGV2ZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBpc0lkID0gKGlkID09PSBldmVudHNbaV0uaWQpO1xuICAgICAgICAgIGlmIChmbiA9PT0gZXZlbnRzW2ldLmZuICYmIGlzSWQgfHwgIWZuICYmIGlzSWQpIHtcbiAgICAgICAgICAgIGV2ZW50cy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQpIHtcbiAgICAgICAgLy8gQ2xlYXIgb3V0IGFsbCBldmVudHMgb2YgdGhpcyB0eXBlLlxuICAgICAgICBzZWxmWydfb24nICsgZXZlbnRdID0gW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDbGVhciBvdXQgYWxsIGV2ZW50cyBvZiBldmVyeSB0eXBlLlxuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHNlbGYpO1xuICAgICAgICBmb3IgKGk9MDsgaTxrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKChrZXlzW2ldLmluZGV4T2YoJ19vbicpID09PSAwKSAmJiBBcnJheS5pc0FycmF5KHNlbGZba2V5c1tpXV0pKSB7XG4gICAgICAgICAgICBzZWxmW2tleXNbaV1dID0gW107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gdG8gYSBjdXN0b20gZXZlbnQgYW5kIHJlbW92ZSBpdCBvbmNlIGZpcmVkLlxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gICBldmVudCBFdmVudCBuYW1lLlxuICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmbiAgICBMaXN0ZW5lciB0byBjYWxsLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gICBpZCAgICAob3B0aW9uYWwpIE9ubHkgbGlzdGVuIHRvIGV2ZW50cyBmb3IgdGhpcyBzb3VuZC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIG9uY2U6IGZ1bmN0aW9uKGV2ZW50LCBmbiwgaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gU2V0dXAgdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgc2VsZi5vbihldmVudCwgZm4sIGlkLCAxKTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEVtaXQgYWxsIGV2ZW50cyBvZiBhIHNwZWNpZmljIHR5cGUgYW5kIHBhc3MgdGhlIHNvdW5kIGlkLlxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gZXZlbnQgRXZlbnQgbmFtZS5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkICAgIFNvdW5kIElELlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gbXNnICAgTWVzc2FnZSB0byBnbyB3aXRoIGV2ZW50LlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgX2VtaXQ6IGZ1bmN0aW9uKGV2ZW50LCBpZCwgbXNnKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgZXZlbnRzID0gc2VsZlsnX29uJyArIGV2ZW50XTtcblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIGV2ZW50IHN0b3JlIGFuZCBmaXJlIGFsbCBmdW5jdGlvbnMuXG4gICAgICBmb3IgKHZhciBpPWV2ZW50cy5sZW5ndGgtMTsgaT49MDsgaS0tKSB7XG4gICAgICAgIC8vIE9ubHkgZmlyZSB0aGUgbGlzdGVuZXIgaWYgdGhlIGNvcnJlY3QgSUQgaXMgdXNlZC5cbiAgICAgICAgaWYgKCFldmVudHNbaV0uaWQgfHwgZXZlbnRzW2ldLmlkID09PSBpZCB8fCBldmVudCA9PT0gJ2xvYWQnKSB7XG4gICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbihmbikge1xuICAgICAgICAgICAgZm4uY2FsbCh0aGlzLCBpZCwgbXNnKTtcbiAgICAgICAgICB9LmJpbmQoc2VsZiwgZXZlbnRzW2ldLmZuKSwgMCk7XG5cbiAgICAgICAgICAvLyBJZiB0aGlzIGV2ZW50IHdhcyBzZXR1cCB3aXRoIGBvbmNlYCwgcmVtb3ZlIGl0LlxuICAgICAgICAgIGlmIChldmVudHNbaV0ub25jZSkge1xuICAgICAgICAgICAgc2VsZi5vZmYoZXZlbnQsIGV2ZW50c1tpXS5mbiwgZXZlbnRzW2ldLmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUGFzcyB0aGUgZXZlbnQgdHlwZSBpbnRvIGxvYWQgcXVldWUgc28gdGhhdCBpdCBjYW4gY29udGludWUgc3RlcHBpbmcuXG4gICAgICBzZWxmLl9sb2FkUXVldWUoZXZlbnQpO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUXVldWUgb2YgYWN0aW9ucyBpbml0aWF0ZWQgYmVmb3JlIHRoZSBzb3VuZCBoYXMgbG9hZGVkLlxuICAgICAqIFRoZXNlIHdpbGwgYmUgY2FsbGVkIGluIHNlcXVlbmNlLCB3aXRoIHRoZSBuZXh0IG9ubHkgZmlyaW5nXG4gICAgICogYWZ0ZXIgdGhlIHByZXZpb3VzIGhhcyBmaW5pc2hlZCBleGVjdXRpbmcgKGV2ZW4gaWYgYXN5bmMgbGlrZSBwbGF5KS5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIF9sb2FkUXVldWU6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIGlmIChzZWxmLl9xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciB0YXNrID0gc2VsZi5fcXVldWVbMF07XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoaXMgdGFzayBpZiBhIG1hdGNoaW5nIGV2ZW50IHdhcyBwYXNzZWQuXG4gICAgICAgIGlmICh0YXNrLmV2ZW50ID09PSBldmVudCkge1xuICAgICAgICAgIHNlbGYuX3F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgc2VsZi5fbG9hZFF1ZXVlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSdW4gdGhlIHRhc2sgaWYgbm8gZXZlbnQgdHlwZSBpcyBwYXNzZWQuXG4gICAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgICB0YXNrLmFjdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHBsYXliYWNrIGVuZHMgYXQgdGhlIGVuZCBvZiB0aGUgZHVyYXRpb24uXG4gICAgICogQHBhcmFtICB7U291bmR9IHNvdW5kIFRoZSBzb3VuZCBvYmplY3QgdG8gd29yayB3aXRoLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgX2VuZGVkOiBmdW5jdGlvbihzb3VuZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHNwcml0ZSA9IHNvdW5kLl9zcHJpdGU7XG5cbiAgICAgIC8vIElmIHdlIGFyZSB1c2luZyBJRSBhbmQgdGhlcmUgd2FzIG5ldHdvcmsgbGF0ZW5jeSB3ZSBtYXkgYmUgY2xpcHBpbmdcbiAgICAgIC8vIGF1ZGlvIGJlZm9yZSBpdCBjb21wbGV0ZXMgcGxheWluZy4gTGV0cyBjaGVjayB0aGUgbm9kZSB0byBtYWtlIHN1cmUgaXRcbiAgICAgIC8vIGJlbGlldmVzIGl0IGhhcyBjb21wbGV0ZWQsIGJlZm9yZSBlbmRpbmcgdGhlIHBsYXliYWNrLlxuICAgICAgaWYgKCFzZWxmLl93ZWJBdWRpbyAmJiBzb3VuZC5fbm9kZSAmJiAhc291bmQuX25vZGUucGF1c2VkICYmICFzb3VuZC5fbm9kZS5lbmRlZCAmJiBzb3VuZC5fbm9kZS5jdXJyZW50VGltZSA8IHNvdW5kLl9zdG9wKSB7XG4gICAgICAgIHNldFRpbWVvdXQoc2VsZi5fZW5kZWQuYmluZChzZWxmLCBzb3VuZCksIDEwMCk7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfVxuXG4gICAgICAvLyBTaG91bGQgdGhpcyBzb3VuZCBsb29wP1xuICAgICAgdmFyIGxvb3AgPSAhIShzb3VuZC5fbG9vcCB8fCBzZWxmLl9zcHJpdGVbc3ByaXRlXVsyXSk7XG5cbiAgICAgIC8vIEZpcmUgdGhlIGVuZGVkIGV2ZW50LlxuICAgICAgc2VsZi5fZW1pdCgnZW5kJywgc291bmQuX2lkKTtcblxuICAgICAgLy8gUmVzdGFydCB0aGUgcGxheWJhY2sgZm9yIEhUTUw1IEF1ZGlvIGxvb3AuXG4gICAgICBpZiAoIXNlbGYuX3dlYkF1ZGlvICYmIGxvb3ApIHtcbiAgICAgICAgc2VsZi5zdG9wKHNvdW5kLl9pZCwgdHJ1ZSkucGxheShzb3VuZC5faWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXN0YXJ0IHRoaXMgdGltZXIgaWYgb24gYSBXZWIgQXVkaW8gbG9vcC5cbiAgICAgIGlmIChzZWxmLl93ZWJBdWRpbyAmJiBsb29wKSB7XG4gICAgICAgIHNlbGYuX2VtaXQoJ3BsYXknLCBzb3VuZC5faWQpO1xuICAgICAgICBzb3VuZC5fc2VlayA9IHNvdW5kLl9zdGFydCB8fCAwO1xuICAgICAgICBzb3VuZC5fcmF0ZVNlZWsgPSAwO1xuICAgICAgICBzb3VuZC5fcGxheVN0YXJ0ID0gSG93bGVyLmN0eC5jdXJyZW50VGltZTtcblxuICAgICAgICB2YXIgdGltZW91dCA9ICgoc291bmQuX3N0b3AgLSBzb3VuZC5fc3RhcnQpICogMTAwMCkgLyBNYXRoLmFicyhzb3VuZC5fcmF0ZSk7XG4gICAgICAgIHNlbGYuX2VuZFRpbWVyc1tzb3VuZC5faWRdID0gc2V0VGltZW91dChzZWxmLl9lbmRlZC5iaW5kKHNlbGYsIHNvdW5kKSwgdGltZW91dCk7XG4gICAgICB9XG5cbiAgICAgIC8vIE1hcmsgdGhlIG5vZGUgYXMgcGF1c2VkLlxuICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvICYmICFsb29wKSB7XG4gICAgICAgIHNvdW5kLl9wYXVzZWQgPSB0cnVlO1xuICAgICAgICBzb3VuZC5fZW5kZWQgPSB0cnVlO1xuICAgICAgICBzb3VuZC5fc2VlayA9IHNvdW5kLl9zdGFydCB8fCAwO1xuICAgICAgICBzb3VuZC5fcmF0ZVNlZWsgPSAwO1xuICAgICAgICBzZWxmLl9jbGVhclRpbWVyKHNvdW5kLl9pZCk7XG5cbiAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIGJ1ZmZlciBzb3VyY2UuXG4gICAgICAgIHNlbGYuX2NsZWFuQnVmZmVyKHNvdW5kLl9ub2RlKTtcblxuICAgICAgICAvLyBBdHRlbXB0IHRvIGF1dG8tc3VzcGVuZCBBdWRpb0NvbnRleHQgaWYgbm8gc291bmRzIGFyZSBzdGlsbCBwbGF5aW5nLlxuICAgICAgICBIb3dsZXIuX2F1dG9TdXNwZW5kKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdoZW4gdXNpbmcgYSBzcHJpdGUsIGVuZCB0aGUgdHJhY2suXG4gICAgICBpZiAoIXNlbGYuX3dlYkF1ZGlvICYmICFsb29wKSB7XG4gICAgICAgIHNlbGYuc3RvcChzb3VuZC5faWQsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgdGhlIGVuZCB0aW1lciBmb3IgYSBzb3VuZCBwbGF5YmFjay5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkIFRoZSBzb3VuZCBJRC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIF9jbGVhclRpbWVyOiBmdW5jdGlvbihpZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICBpZiAoc2VsZi5fZW5kVGltZXJzW2lkXSkge1xuICAgICAgICAvLyBDbGVhciB0aGUgdGltZW91dCBvciByZW1vdmUgdGhlIGVuZGVkIGxpc3RlbmVyLlxuICAgICAgICBpZiAodHlwZW9mIHNlbGYuX2VuZFRpbWVyc1tpZF0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoc2VsZi5fZW5kVGltZXJzW2lkXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkKTtcbiAgICAgICAgICBpZiAoc291bmQgJiYgc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgIHNvdW5kLl9ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgc2VsZi5fZW5kVGltZXJzW2lkXSwgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSBzZWxmLl9lbmRUaW1lcnNbaWRdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBzb3VuZCBpZGVudGlmaWVkIGJ5IHRoaXMgSUQsIG9yIHJldHVybiBudWxsLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgU291bmQgSURcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9ICAgIFNvdW5kIG9iamVjdCBvciBudWxsLlxuICAgICAqL1xuICAgIF9zb3VuZEJ5SWQ6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgc291bmRzIGFuZCBmaW5kIHRoZSBvbmUgd2l0aCB0aGlzIElELlxuICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX3NvdW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaWQgPT09IHNlbGYuX3NvdW5kc1tpXS5faWQpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5fc291bmRzW2ldO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYW4gaW5hY3RpdmUgc291bmQgZnJvbSB0aGUgcG9vbCBvciBjcmVhdGUgYSBuZXcgb25lLlxuICAgICAqIEByZXR1cm4ge1NvdW5kfSBTb3VuZCBwbGF5YmFjayBvYmplY3QuXG4gICAgICovXG4gICAgX2luYWN0aXZlU291bmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICBzZWxmLl9kcmFpbigpO1xuXG4gICAgICAvLyBGaW5kIHRoZSBmaXJzdCBpbmFjdGl2ZSBub2RlIHRvIHJlY3ljbGUuXG4gICAgICBmb3IgKHZhciBpPTA7IGk8c2VsZi5fc291bmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzZWxmLl9zb3VuZHNbaV0uX2VuZGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuX3NvdW5kc1tpXS5yZXNldCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIGluYWN0aXZlIG5vZGUgd2FzIGZvdW5kLCBjcmVhdGUgYSBuZXcgb25lLlxuICAgICAgcmV0dXJuIG5ldyBTb3VuZChzZWxmKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRHJhaW4gZXhjZXNzIGluYWN0aXZlIHNvdW5kcyBmcm9tIHRoZSBwb29sLlxuICAgICAqL1xuICAgIF9kcmFpbjogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgbGltaXQgPSBzZWxmLl9wb29sO1xuICAgICAgdmFyIGNudCA9IDA7XG4gICAgICB2YXIgaSA9IDA7XG5cbiAgICAgIC8vIElmIHRoZXJlIGFyZSBsZXNzIHNvdW5kcyB0aGFuIHRoZSBtYXggcG9vbCBzaXplLCB3ZSBhcmUgZG9uZS5cbiAgICAgIGlmIChzZWxmLl9zb3VuZHMubGVuZ3RoIDwgbGltaXQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGluYWN0aXZlIHNvdW5kcy5cbiAgICAgIGZvciAoaT0wOyBpPHNlbGYuX3NvdW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2VsZi5fc291bmRzW2ldLl9lbmRlZCkge1xuICAgICAgICAgIGNudCsrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSBleGNlc3MgaW5hY3RpdmUgc291bmRzLCBnb2luZyBpbiByZXZlcnNlIG9yZGVyLlxuICAgICAgZm9yIChpPXNlbGYuX3NvdW5kcy5sZW5ndGggLSAxOyBpPj0wOyBpLS0pIHtcbiAgICAgICAgaWYgKGNudCA8PSBsaW1pdCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxmLl9zb3VuZHNbaV0uX2VuZGVkKSB7XG4gICAgICAgICAgLy8gRGlzY29ubmVjdCB0aGUgYXVkaW8gc291cmNlIHdoZW4gdXNpbmcgV2ViIEF1ZGlvLlxuICAgICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbyAmJiBzZWxmLl9zb3VuZHNbaV0uX25vZGUpIHtcbiAgICAgICAgICAgIHNlbGYuX3NvdW5kc1tpXS5fbm9kZS5kaXNjb25uZWN0KDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlbW92ZSBzb3VuZHMgdW50aWwgd2UgaGF2ZSB0aGUgcG9vbCBzaXplLlxuICAgICAgICAgIHNlbGYuX3NvdW5kcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgY250LS07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBJRCdzIGZyb20gdGhlIHNvdW5kcyBwb29sLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgT25seSByZXR1cm4gb25lIElEIGlmIG9uZSBpcyBwYXNzZWQuXG4gICAgICogQHJldHVybiB7QXJyYXl9ICAgIEFycmF5IG9mIElEcy5cbiAgICAgKi9cbiAgICBfZ2V0U291bmRJZHM6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIGlmICh0eXBlb2YgaWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBpZHMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX3NvdW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlkcy5wdXNoKHNlbGYuX3NvdW5kc1tpXS5faWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGlkcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbaWRdO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMb2FkIHRoZSBzb3VuZCBiYWNrIGludG8gdGhlIGJ1ZmZlciBzb3VyY2UuXG4gICAgICogQHBhcmFtICB7U291bmR9IHNvdW5kIFRoZSBzb3VuZCBvYmplY3QgdG8gd29yayB3aXRoLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgX3JlZnJlc2hCdWZmZXI6IGZ1bmN0aW9uKHNvdW5kKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIFNldHVwIHRoZSBidWZmZXIgc291cmNlIGZvciBwbGF5YmFjay5cbiAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZSA9IEhvd2xlci5jdHguY3JlYXRlQnVmZmVyU291cmNlKCk7XG4gICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UuYnVmZmVyID0gY2FjaGVbc2VsZi5fc3JjXTtcblxuICAgICAgLy8gQ29ubmVjdCB0byB0aGUgY29ycmVjdCBub2RlLlxuICAgICAgaWYgKHNvdW5kLl9wYW5uZXIpIHtcbiAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLmNvbm5lY3Qoc291bmQuX3Bhbm5lcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UuY29ubmVjdChzb3VuZC5fbm9kZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldHVwIGxvb3BpbmcgYW5kIHBsYXliYWNrIHJhdGUuXG4gICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UubG9vcCA9IHNvdW5kLl9sb29wO1xuICAgICAgaWYgKHNvdW5kLl9sb29wKSB7XG4gICAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5sb29wU3RhcnQgPSBzb3VuZC5fc3RhcnQgfHwgMDtcbiAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLmxvb3BFbmQgPSBzb3VuZC5fc3RvcCB8fCAwO1xuICAgICAgfVxuICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLnBsYXliYWNrUmF0ZS5zZXRWYWx1ZUF0VGltZShzb3VuZC5fcmF0ZSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQcmV2ZW50IG1lbW9yeSBsZWFrcyBieSBjbGVhbmluZyB1cCB0aGUgYnVmZmVyIHNvdXJjZSBhZnRlciBwbGF5YmFjay5cbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IG5vZGUgU291bmQncyBhdWRpbyBub2RlIGNvbnRhaW5pbmcgdGhlIGJ1ZmZlciBzb3VyY2UuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBfY2xlYW5CdWZmZXI6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBpc0lPUyA9IEhvd2xlci5fbmF2aWdhdG9yICYmIEhvd2xlci5fbmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCdBcHBsZScpID49IDA7XG5cbiAgICAgIGlmIChIb3dsZXIuX3NjcmF0Y2hCdWZmZXIgJiYgbm9kZS5idWZmZXJTb3VyY2UpIHtcbiAgICAgICAgbm9kZS5idWZmZXJTb3VyY2Uub25lbmRlZCA9IG51bGw7XG4gICAgICAgIG5vZGUuYnVmZmVyU291cmNlLmRpc2Nvbm5lY3QoMCk7XG4gICAgICAgIGlmIChpc0lPUykge1xuICAgICAgICAgIHRyeSB7IG5vZGUuYnVmZmVyU291cmNlLmJ1ZmZlciA9IEhvd2xlci5fc2NyYXRjaEJ1ZmZlcjsgfSBjYXRjaChlKSB7fVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBub2RlLmJ1ZmZlclNvdXJjZSA9IG51bGw7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHNvdXJjZSB0byBhIDAtc2Vjb25kIHNpbGVuY2UgdG8gc3RvcCBhbnkgZG93bmxvYWRpbmcgKGV4Y2VwdCBpbiBJRSkuXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBub2RlIEF1ZGlvIG5vZGUgdG8gY2xlYXIuXG4gICAgICovXG4gICAgX2NsZWFyU291bmQ6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHZhciBjaGVja0lFID0gL01TSUUgfFRyaWRlbnRcXC8vLnRlc3QoSG93bGVyLl9uYXZpZ2F0b3IgJiYgSG93bGVyLl9uYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICAgIGlmICghY2hlY2tJRSkge1xuICAgICAgICBub2RlLnNyYyA9ICdkYXRhOmF1ZGlvL3dhdjtiYXNlNjQsVWtsR1JpZ0FBQUJYUVZaRlptMTBJQklBQUFBQkFBRUFSS3dBQUloWUFRQUNBQkFBQUFCa1lYUmhBZ0FBQUFFQSc7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKiBTaW5nbGUgU291bmQgTWV0aG9kcyAqKi9cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAvKipcbiAgICogU2V0dXAgdGhlIHNvdW5kIG9iamVjdCwgd2hpY2ggZWFjaCBub2RlIGF0dGFjaGVkIHRvIGEgSG93bCBncm91cCBpcyBjb250YWluZWQgaW4uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBob3dsIFRoZSBIb3dsIHBhcmVudCBncm91cC5cbiAgICovXG4gIHZhciBTb3VuZCA9IGZ1bmN0aW9uKGhvd2wpIHtcbiAgICB0aGlzLl9wYXJlbnQgPSBob3dsO1xuICAgIHRoaXMuaW5pdCgpO1xuICB9O1xuICBTb3VuZC5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBhIG5ldyBTb3VuZCBvYmplY3QuXG4gICAgICogQHJldHVybiB7U291bmR9XG4gICAgICovXG4gICAgaW5pdDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgcGFyZW50ID0gc2VsZi5fcGFyZW50O1xuXG4gICAgICAvLyBTZXR1cCB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzLlxuICAgICAgc2VsZi5fbXV0ZWQgPSBwYXJlbnQuX211dGVkO1xuICAgICAgc2VsZi5fbG9vcCA9IHBhcmVudC5fbG9vcDtcbiAgICAgIHNlbGYuX3ZvbHVtZSA9IHBhcmVudC5fdm9sdW1lO1xuICAgICAgc2VsZi5fcmF0ZSA9IHBhcmVudC5fcmF0ZTtcbiAgICAgIHNlbGYuX3NlZWsgPSAwO1xuICAgICAgc2VsZi5fcGF1c2VkID0gdHJ1ZTtcbiAgICAgIHNlbGYuX2VuZGVkID0gdHJ1ZTtcbiAgICAgIHNlbGYuX3Nwcml0ZSA9ICdfX2RlZmF1bHQnO1xuXG4gICAgICAvLyBHZW5lcmF0ZSBhIHVuaXF1ZSBJRCBmb3IgdGhpcyBzb3VuZC5cbiAgICAgIHNlbGYuX2lkID0gKytIb3dsZXIuX2NvdW50ZXI7XG5cbiAgICAgIC8vIEFkZCBpdHNlbGYgdG8gdGhlIHBhcmVudCdzIHBvb2wuXG4gICAgICBwYXJlbnQuX3NvdW5kcy5wdXNoKHNlbGYpO1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIG5ldyBub2RlLlxuICAgICAgc2VsZi5jcmVhdGUoKTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbmQgc2V0dXAgYSBuZXcgc291bmQgb2JqZWN0LCB3aGV0aGVyIEhUTUw1IEF1ZGlvIG9yIFdlYiBBdWRpby5cbiAgICAgKiBAcmV0dXJuIHtTb3VuZH1cbiAgICAgKi9cbiAgICBjcmVhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHBhcmVudCA9IHNlbGYuX3BhcmVudDtcbiAgICAgIHZhciB2b2x1bWUgPSAoSG93bGVyLl9tdXRlZCB8fCBzZWxmLl9tdXRlZCB8fCBzZWxmLl9wYXJlbnQuX211dGVkKSA/IDAgOiBzZWxmLl92b2x1bWU7XG5cbiAgICAgIGlmIChwYXJlbnQuX3dlYkF1ZGlvKSB7XG4gICAgICAgIC8vIENyZWF0ZSB0aGUgZ2FpbiBub2RlIGZvciBjb250cm9sbGluZyB2b2x1bWUgKHRoZSBzb3VyY2Ugd2lsbCBjb25uZWN0IHRvIHRoaXMpLlxuICAgICAgICBzZWxmLl9ub2RlID0gKHR5cGVvZiBIb3dsZXIuY3R4LmNyZWF0ZUdhaW4gPT09ICd1bmRlZmluZWQnKSA/IEhvd2xlci5jdHguY3JlYXRlR2Fpbk5vZGUoKSA6IEhvd2xlci5jdHguY3JlYXRlR2FpbigpO1xuICAgICAgICBzZWxmLl9ub2RlLmdhaW4uc2V0VmFsdWVBdFRpbWUodm9sdW1lLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgc2VsZi5fbm9kZS5wYXVzZWQgPSB0cnVlO1xuICAgICAgICBzZWxmLl9ub2RlLmNvbm5lY3QoSG93bGVyLm1hc3RlckdhaW4pO1xuICAgICAgfSBlbHNlIGlmICghSG93bGVyLm5vQXVkaW8pIHtcbiAgICAgICAgLy8gR2V0IGFuIHVubG9ja2VkIEF1ZGlvIG9iamVjdCBmcm9tIHRoZSBwb29sLlxuICAgICAgICBzZWxmLl9ub2RlID0gSG93bGVyLl9vYnRhaW5IdG1sNUF1ZGlvKCk7XG5cbiAgICAgICAgLy8gTGlzdGVuIGZvciBlcnJvcnMgKGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3NwZWMtYXV0aG9yLXZpZXcvc3BlYy5odG1sI21lZGlhZXJyb3IpLlxuICAgICAgICBzZWxmLl9lcnJvckZuID0gc2VsZi5fZXJyb3JMaXN0ZW5lci5iaW5kKHNlbGYpO1xuICAgICAgICBzZWxmLl9ub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgc2VsZi5fZXJyb3JGbiwgZmFsc2UpO1xuXG4gICAgICAgIC8vIExpc3RlbiBmb3IgJ2NhbnBsYXl0aHJvdWdoJyBldmVudCB0byBsZXQgdXMga25vdyB0aGUgc291bmQgaXMgcmVhZHkuXG4gICAgICAgIHNlbGYuX2xvYWRGbiA9IHNlbGYuX2xvYWRMaXN0ZW5lci5iaW5kKHNlbGYpO1xuICAgICAgICBzZWxmLl9ub2RlLmFkZEV2ZW50TGlzdGVuZXIoSG93bGVyLl9jYW5QbGF5RXZlbnQsIHNlbGYuX2xvYWRGbiwgZmFsc2UpO1xuXG4gICAgICAgIC8vIExpc3RlbiBmb3IgdGhlICdlbmRlZCcgZXZlbnQgb24gdGhlIHNvdW5kIHRvIGFjY291bnQgZm9yIGVkZ2UtY2FzZSB3aGVyZVxuICAgICAgICAvLyBhIGZpbml0ZSBzb3VuZCBoYXMgYSBkdXJhdGlvbiBvZiBJbmZpbml0eS5cbiAgICAgICAgc2VsZi5fZW5kRm4gPSBzZWxmLl9lbmRMaXN0ZW5lci5iaW5kKHNlbGYpO1xuICAgICAgICBzZWxmLl9ub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgc2VsZi5fZW5kRm4sIGZhbHNlKTtcblxuICAgICAgICAvLyBTZXR1cCB0aGUgbmV3IGF1ZGlvIG5vZGUuXG4gICAgICAgIHNlbGYuX25vZGUuc3JjID0gcGFyZW50Ll9zcmM7XG4gICAgICAgIHNlbGYuX25vZGUucHJlbG9hZCA9IHBhcmVudC5fcHJlbG9hZCA9PT0gdHJ1ZSA/ICdhdXRvJyA6IHBhcmVudC5fcHJlbG9hZDtcbiAgICAgICAgc2VsZi5fbm9kZS52b2x1bWUgPSB2b2x1bWUgKiBIb3dsZXIudm9sdW1lKCk7XG5cbiAgICAgICAgLy8gQmVnaW4gbG9hZGluZyB0aGUgc291cmNlLlxuICAgICAgICBzZWxmLl9ub2RlLmxvYWQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlc2V0IHRoZSBwYXJhbWV0ZXJzIG9mIHRoaXMgc291bmQgdG8gdGhlIG9yaWdpbmFsIHN0YXRlIChmb3IgcmVjeWNsZSkuXG4gICAgICogQHJldHVybiB7U291bmR9XG4gICAgICovXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHBhcmVudCA9IHNlbGYuX3BhcmVudDtcblxuICAgICAgLy8gUmVzZXQgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzIG9mIHRoaXMgc291bmQuXG4gICAgICBzZWxmLl9tdXRlZCA9IHBhcmVudC5fbXV0ZWQ7XG4gICAgICBzZWxmLl9sb29wID0gcGFyZW50Ll9sb29wO1xuICAgICAgc2VsZi5fdm9sdW1lID0gcGFyZW50Ll92b2x1bWU7XG4gICAgICBzZWxmLl9yYXRlID0gcGFyZW50Ll9yYXRlO1xuICAgICAgc2VsZi5fc2VlayA9IDA7XG4gICAgICBzZWxmLl9yYXRlU2VlayA9IDA7XG4gICAgICBzZWxmLl9wYXVzZWQgPSB0cnVlO1xuICAgICAgc2VsZi5fZW5kZWQgPSB0cnVlO1xuICAgICAgc2VsZi5fc3ByaXRlID0gJ19fZGVmYXVsdCc7XG5cbiAgICAgIC8vIEdlbmVyYXRlIGEgbmV3IElEIHNvIHRoYXQgaXQgaXNuJ3QgY29uZnVzZWQgd2l0aCB0aGUgcHJldmlvdXMgc291bmQuXG4gICAgICBzZWxmLl9pZCA9ICsrSG93bGVyLl9jb3VudGVyO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSFRNTDUgQXVkaW8gZXJyb3IgbGlzdGVuZXIgY2FsbGJhY2suXG4gICAgICovXG4gICAgX2Vycm9yTGlzdGVuZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyBGaXJlIGFuIGVycm9yIGV2ZW50IGFuZCBwYXNzIGJhY2sgdGhlIGNvZGUuXG4gICAgICBzZWxmLl9wYXJlbnQuX2VtaXQoJ2xvYWRlcnJvcicsIHNlbGYuX2lkLCBzZWxmLl9ub2RlLmVycm9yID8gc2VsZi5fbm9kZS5lcnJvci5jb2RlIDogMCk7XG5cbiAgICAgIC8vIENsZWFyIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICAgIHNlbGYuX25vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBzZWxmLl9lcnJvckZuLCBmYWxzZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEhUTUw1IEF1ZGlvIGNhbnBsYXl0aHJvdWdoIGxpc3RlbmVyIGNhbGxiYWNrLlxuICAgICAqL1xuICAgIF9sb2FkTGlzdGVuZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHBhcmVudCA9IHNlbGYuX3BhcmVudDtcblxuICAgICAgLy8gUm91bmQgdXAgdGhlIGR1cmF0aW9uIHRvIGFjY291bnQgZm9yIHRoZSBsb3dlciBwcmVjaXNpb24gaW4gSFRNTDUgQXVkaW8uXG4gICAgICBwYXJlbnQuX2R1cmF0aW9uID0gTWF0aC5jZWlsKHNlbGYuX25vZGUuZHVyYXRpb24gKiAxMCkgLyAxMDtcblxuICAgICAgLy8gU2V0dXAgYSBzcHJpdGUgaWYgbm9uZSBpcyBkZWZpbmVkLlxuICAgICAgaWYgKE9iamVjdC5rZXlzKHBhcmVudC5fc3ByaXRlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcGFyZW50Ll9zcHJpdGUgPSB7X19kZWZhdWx0OiBbMCwgcGFyZW50Ll9kdXJhdGlvbiAqIDEwMDBdfTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudC5fc3RhdGUgIT09ICdsb2FkZWQnKSB7XG4gICAgICAgIHBhcmVudC5fc3RhdGUgPSAnbG9hZGVkJztcbiAgICAgICAgcGFyZW50Ll9lbWl0KCdsb2FkJyk7XG4gICAgICAgIHBhcmVudC5fbG9hZFF1ZXVlKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFyIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICAgIHNlbGYuX25vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihIb3dsZXIuX2NhblBsYXlFdmVudCwgc2VsZi5fbG9hZEZuLCBmYWxzZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEhUTUw1IEF1ZGlvIGVuZGVkIGxpc3RlbmVyIGNhbGxiYWNrLlxuICAgICAqL1xuICAgIF9lbmRMaXN0ZW5lcjogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgcGFyZW50ID0gc2VsZi5fcGFyZW50O1xuXG4gICAgICAvLyBPbmx5IGhhbmRsZSB0aGUgYGVuZGVkYGAgZXZlbnQgaWYgdGhlIGR1cmF0aW9uIGlzIEluZmluaXR5LlxuICAgICAgaWYgKHBhcmVudC5fZHVyYXRpb24gPT09IEluZmluaXR5KSB7XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgcGFyZW50IGR1cmF0aW9uIHRvIG1hdGNoIHRoZSByZWFsIGF1ZGlvIGR1cmF0aW9uLlxuICAgICAgICAvLyBSb3VuZCB1cCB0aGUgZHVyYXRpb24gdG8gYWNjb3VudCBmb3IgdGhlIGxvd2VyIHByZWNpc2lvbiBpbiBIVE1MNSBBdWRpby5cbiAgICAgICAgcGFyZW50Ll9kdXJhdGlvbiA9IE1hdGguY2VpbChzZWxmLl9ub2RlLmR1cmF0aW9uICogMTApIC8gMTA7XG5cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBzcHJpdGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgcmVhbCBkdXJhdGlvbi5cbiAgICAgICAgaWYgKHBhcmVudC5fc3ByaXRlLl9fZGVmYXVsdFsxXSA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICBwYXJlbnQuX3Nwcml0ZS5fX2RlZmF1bHRbMV0gPSBwYXJlbnQuX2R1cmF0aW9uICogMTAwMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJ1biB0aGUgcmVndWxhciBlbmRlZCBtZXRob2QuXG4gICAgICAgIHBhcmVudC5fZW5kZWQoc2VsZik7XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFyIHRoZSBldmVudCBsaXN0ZW5lciBzaW5jZSB0aGUgZHVyYXRpb24gaXMgbm93IGNvcnJlY3QuXG4gICAgICBzZWxmLl9ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgc2VsZi5fZW5kRm4sIGZhbHNlKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqIEhlbHBlciBNZXRob2RzICoqL1xuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHZhciBjYWNoZSA9IHt9O1xuXG4gIC8qKlxuICAgKiBCdWZmZXIgYSBzb3VuZCBmcm9tIFVSTCwgRGF0YSBVUkkgb3IgY2FjaGUgYW5kIGRlY29kZSB0byBhdWRpbyBzb3VyY2UgKFdlYiBBdWRpbyBBUEkpLlxuICAgKiBAcGFyYW0gIHtIb3dsfSBzZWxmXG4gICAqL1xuICB2YXIgbG9hZEJ1ZmZlciA9IGZ1bmN0aW9uKHNlbGYpIHtcbiAgICB2YXIgdXJsID0gc2VsZi5fc3JjO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGJ1ZmZlciBoYXMgYWxyZWFkeSBiZWVuIGNhY2hlZCBhbmQgdXNlIGl0IGluc3RlYWQuXG4gICAgaWYgKGNhY2hlW3VybF0pIHtcbiAgICAgIC8vIFNldCB0aGUgZHVyYXRpb24gZnJvbSB0aGUgY2FjaGUuXG4gICAgICBzZWxmLl9kdXJhdGlvbiA9IGNhY2hlW3VybF0uZHVyYXRpb247XG5cbiAgICAgIC8vIExvYWQgdGhlIHNvdW5kIGludG8gdGhpcyBIb3dsLlxuICAgICAgbG9hZFNvdW5kKHNlbGYpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKC9eZGF0YTpbXjtdKztiYXNlNjQsLy50ZXN0KHVybCkpIHtcbiAgICAgIC8vIERlY29kZSB0aGUgYmFzZTY0IGRhdGEgVVJJIHdpdGhvdXQgWEhSLCBzaW5jZSBzb21lIGJyb3dzZXJzIGRvbid0IHN1cHBvcnQgaXQuXG4gICAgICB2YXIgZGF0YSA9IGF0b2IodXJsLnNwbGl0KCcsJylbMV0pO1xuICAgICAgdmFyIGRhdGFWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5sZW5ndGgpO1xuICAgICAgZm9yICh2YXIgaT0wOyBpPGRhdGEubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgZGF0YVZpZXdbaV0gPSBkYXRhLmNoYXJDb2RlQXQoaSk7XG4gICAgICB9XG5cbiAgICAgIGRlY29kZUF1ZGlvRGF0YShkYXRhVmlldy5idWZmZXIsIHNlbGYpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMb2FkIHRoZSBidWZmZXIgZnJvbSB0aGUgVVJMLlxuICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgeGhyLm9wZW4oc2VsZi5feGhyLm1ldGhvZCwgdXJsLCB0cnVlKTtcbiAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSBzZWxmLl94aHIud2l0aENyZWRlbnRpYWxzO1xuICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7XG5cbiAgICAgIC8vIEFwcGx5IGFueSBjdXN0b20gaGVhZGVycyB0byB0aGUgcmVxdWVzdC5cbiAgICAgIGlmIChzZWxmLl94aHIuaGVhZGVycykge1xuICAgICAgICBPYmplY3Qua2V5cyhzZWxmLl94aHIuaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihrZXksIHNlbGYuX3hoci5oZWFkZXJzW2tleV0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZ2V0IGEgc3VjY2Vzc2Z1bCByZXNwb25zZSBiYWNrLlxuICAgICAgICB2YXIgY29kZSA9ICh4aHIuc3RhdHVzICsgJycpWzBdO1xuICAgICAgICBpZiAoY29kZSAhPT0gJzAnICYmIGNvZGUgIT09ICcyJyAmJiBjb2RlICE9PSAnMycpIHtcbiAgICAgICAgICBzZWxmLl9lbWl0KCdsb2FkZXJyb3InLCBudWxsLCAnRmFpbGVkIGxvYWRpbmcgYXVkaW8gZmlsZSB3aXRoIHN0YXR1czogJyArIHhoci5zdGF0dXMgKyAnLicpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlY29kZUF1ZGlvRGF0YSh4aHIucmVzcG9uc2UsIHNlbGYpO1xuICAgICAgfTtcbiAgICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGFuIGVycm9yLCBzd2l0Y2ggdG8gSFRNTDUgQXVkaW8uXG4gICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbykge1xuICAgICAgICAgIHNlbGYuX2h0bWw1ID0gdHJ1ZTtcbiAgICAgICAgICBzZWxmLl93ZWJBdWRpbyA9IGZhbHNlO1xuICAgICAgICAgIHNlbGYuX3NvdW5kcyA9IFtdO1xuICAgICAgICAgIGRlbGV0ZSBjYWNoZVt1cmxdO1xuICAgICAgICAgIHNlbGYubG9hZCgpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgc2FmZVhoclNlbmQoeGhyKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFNlbmQgdGhlIFhIUiByZXF1ZXN0IHdyYXBwZWQgaW4gYSB0cnkvY2F0Y2guXG4gICAqIEBwYXJhbSAge09iamVjdH0geGhyIFhIUiB0byBzZW5kLlxuICAgKi9cbiAgdmFyIHNhZmVYaHJTZW5kID0gZnVuY3Rpb24oeGhyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHhoci5zZW5kKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgeGhyLm9uZXJyb3IoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIERlY29kZSBhdWRpbyBkYXRhIGZyb20gYW4gYXJyYXkgYnVmZmVyLlxuICAgKiBAcGFyYW0gIHtBcnJheUJ1ZmZlcn0gYXJyYXlidWZmZXIgVGhlIGF1ZGlvIGRhdGEuXG4gICAqIEBwYXJhbSAge0hvd2x9ICAgICAgICBzZWxmXG4gICAqL1xuICB2YXIgZGVjb2RlQXVkaW9EYXRhID0gZnVuY3Rpb24oYXJyYXlidWZmZXIsIHNlbGYpIHtcbiAgICAvLyBGaXJlIGEgbG9hZCBlcnJvciBpZiBzb21ldGhpbmcgYnJva2UuXG4gICAgdmFyIGVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLl9lbWl0KCdsb2FkZXJyb3InLCBudWxsLCAnRGVjb2RpbmcgYXVkaW8gZGF0YSBmYWlsZWQuJyk7XG4gICAgfTtcblxuICAgIC8vIExvYWQgdGhlIHNvdW5kIG9uIHN1Y2Nlc3MuXG4gICAgdmFyIHN1Y2Nlc3MgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgICAgIGlmIChidWZmZXIgJiYgc2VsZi5fc291bmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY2FjaGVbc2VsZi5fc3JjXSA9IGJ1ZmZlcjtcbiAgICAgICAgbG9hZFNvdW5kKHNlbGYsIGJ1ZmZlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcigpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBEZWNvZGUgdGhlIGJ1ZmZlciBpbnRvIGFuIGF1ZGlvIHNvdXJjZS5cbiAgICBpZiAodHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmIEhvd2xlci5jdHguZGVjb2RlQXVkaW9EYXRhLmxlbmd0aCA9PT0gMSkge1xuICAgICAgSG93bGVyLmN0eC5kZWNvZGVBdWRpb0RhdGEoYXJyYXlidWZmZXIpLnRoZW4oc3VjY2VzcykuY2F0Y2goZXJyb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICBIb3dsZXIuY3R4LmRlY29kZUF1ZGlvRGF0YShhcnJheWJ1ZmZlciwgc3VjY2VzcywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTb3VuZCBpcyBub3cgbG9hZGVkLCBzbyBmaW5pc2ggc2V0dGluZyBldmVyeXRoaW5nIHVwIGFuZCBmaXJlIHRoZSBsb2FkZWQgZXZlbnQuXG4gICAqIEBwYXJhbSAge0hvd2x9IHNlbGZcbiAgICogQHBhcmFtICB7T2JqZWN0fSBidWZmZXIgVGhlIGRlY29kZWQgYnVmZmVyIHNvdW5kIHNvdXJjZS5cbiAgICovXG4gIHZhciBsb2FkU291bmQgPSBmdW5jdGlvbihzZWxmLCBidWZmZXIpIHtcbiAgICAvLyBTZXQgdGhlIGR1cmF0aW9uLlxuICAgIGlmIChidWZmZXIgJiYgIXNlbGYuX2R1cmF0aW9uKSB7XG4gICAgICBzZWxmLl9kdXJhdGlvbiA9IGJ1ZmZlci5kdXJhdGlvbjtcbiAgICB9XG5cbiAgICAvLyBTZXR1cCBhIHNwcml0ZSBpZiBub25lIGlzIGRlZmluZWQuXG4gICAgaWYgKE9iamVjdC5rZXlzKHNlbGYuX3Nwcml0ZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBzZWxmLl9zcHJpdGUgPSB7X19kZWZhdWx0OiBbMCwgc2VsZi5fZHVyYXRpb24gKiAxMDAwXX07XG4gICAgfVxuXG4gICAgLy8gRmlyZSB0aGUgbG9hZGVkIGV2ZW50LlxuICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgIHNlbGYuX3N0YXRlID0gJ2xvYWRlZCc7XG4gICAgICBzZWxmLl9lbWl0KCdsb2FkJyk7XG4gICAgICBzZWxmLl9sb2FkUXVldWUoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldHVwIHRoZSBhdWRpbyBjb250ZXh0IHdoZW4gYXZhaWxhYmxlLCBvciBzd2l0Y2ggdG8gSFRNTDUgQXVkaW8gbW9kZS5cbiAgICovXG4gIHZhciBzZXR1cEF1ZGlvQ29udGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIElmIHdlIGhhdmUgYWxyZWFkeSBkZXRlY3RlZCB0aGF0IFdlYiBBdWRpbyBpc24ndCBzdXBwb3J0ZWQsIGRvbid0IHJ1biB0aGlzIHN0ZXAgYWdhaW4uXG4gICAgaWYgKCFIb3dsZXIudXNpbmdXZWJBdWRpbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHdlIGFyZSB1c2luZyBXZWIgQXVkaW8gYW5kIHNldHVwIHRoZSBBdWRpb0NvbnRleHQgaWYgd2UgYXJlLlxuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIEF1ZGlvQ29udGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgSG93bGVyLmN0eCA9IG5ldyBBdWRpb0NvbnRleHQoKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHdlYmtpdEF1ZGlvQ29udGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgSG93bGVyLmN0eCA9IG5ldyB3ZWJraXRBdWRpb0NvbnRleHQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIEhvd2xlci51c2luZ1dlYkF1ZGlvID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICBIb3dsZXIudXNpbmdXZWJBdWRpbyA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBhdWRpbyBjb250ZXh0IGNyZWF0aW9uIHN0aWxsIGZhaWxlZCwgc2V0IHVzaW5nIHdlYiBhdWRpbyB0byBmYWxzZS5cbiAgICBpZiAoIUhvd2xlci5jdHgpIHtcbiAgICAgIEhvd2xlci51c2luZ1dlYkF1ZGlvID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgYSB3ZWJ2aWV3IGlzIGJlaW5nIHVzZWQgb24gaU9TOCBvciBlYXJsaWVyIChyYXRoZXIgdGhhbiB0aGUgYnJvd3NlcikuXG4gICAgLy8gSWYgaXQgaXMsIGRpc2FibGUgV2ViIEF1ZGlvIGFzIGl0IGNhdXNlcyBjcmFzaGluZy5cbiAgICB2YXIgaU9TID0gKC9pUChob25lfG9kfGFkKS8udGVzdChIb3dsZXIuX25hdmlnYXRvciAmJiBIb3dsZXIuX25hdmlnYXRvci5wbGF0Zm9ybSkpO1xuICAgIHZhciBhcHBWZXJzaW9uID0gSG93bGVyLl9uYXZpZ2F0b3IgJiYgSG93bGVyLl9uYXZpZ2F0b3IuYXBwVmVyc2lvbi5tYXRjaCgvT1MgKFxcZCspXyhcXGQrKV8/KFxcZCspPy8pO1xuICAgIHZhciB2ZXJzaW9uID0gYXBwVmVyc2lvbiA/IHBhcnNlSW50KGFwcFZlcnNpb25bMV0sIDEwKSA6IG51bGw7XG4gICAgaWYgKGlPUyAmJiB2ZXJzaW9uICYmIHZlcnNpb24gPCA5KSB7XG4gICAgICB2YXIgc2FmYXJpID0gL3NhZmFyaS8udGVzdChIb3dsZXIuX25hdmlnYXRvciAmJiBIb3dsZXIuX25hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSk7XG4gICAgICBpZiAoSG93bGVyLl9uYXZpZ2F0b3IgJiYgIXNhZmFyaSkge1xuICAgICAgICBIb3dsZXIudXNpbmdXZWJBdWRpbyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhbmQgZXhwb3NlIHRoZSBtYXN0ZXIgR2Fpbk5vZGUgd2hlbiB1c2luZyBXZWIgQXVkaW8gKHVzZWZ1bCBmb3IgcGx1Z2lucyBvciBhZHZhbmNlZCB1c2FnZSkuXG4gICAgaWYgKEhvd2xlci51c2luZ1dlYkF1ZGlvKSB7XG4gICAgICBIb3dsZXIubWFzdGVyR2FpbiA9ICh0eXBlb2YgSG93bGVyLmN0eC5jcmVhdGVHYWluID09PSAndW5kZWZpbmVkJykgPyBIb3dsZXIuY3R4LmNyZWF0ZUdhaW5Ob2RlKCkgOiBIb3dsZXIuY3R4LmNyZWF0ZUdhaW4oKTtcbiAgICAgIEhvd2xlci5tYXN0ZXJHYWluLmdhaW4uc2V0VmFsdWVBdFRpbWUoSG93bGVyLl9tdXRlZCA/IDAgOiBIb3dsZXIuX3ZvbHVtZSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICBIb3dsZXIubWFzdGVyR2Fpbi5jb25uZWN0KEhvd2xlci5jdHguZGVzdGluYXRpb24pO1xuICAgIH1cblxuICAgIC8vIFJlLXJ1biB0aGUgc2V0dXAgb24gSG93bGVyLlxuICAgIEhvd2xlci5fc2V0dXAoKTtcbiAgfTtcblxuICAvLyBBZGQgc3VwcG9ydCBmb3IgQU1EIChBc3luY2hyb25vdXMgTW9kdWxlIERlZmluaXRpb24pIGxpYnJhcmllcyBzdWNoIGFzIHJlcXVpcmUuanMuXG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoW10sIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgSG93bGVyOiBIb3dsZXIsXG4gICAgICAgIEhvd2w6IEhvd2xcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvLyBBZGQgc3VwcG9ydCBmb3IgQ29tbW9uSlMgbGlicmFyaWVzIHN1Y2ggYXMgYnJvd3NlcmlmeS5cbiAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgIGV4cG9ydHMuSG93bGVyID0gSG93bGVyO1xuICAgIGV4cG9ydHMuSG93bCA9IEhvd2w7XG4gIH1cblxuICAvLyBBZGQgdG8gZ2xvYmFsIGluIE5vZGUuanMgKGZvciB0ZXN0aW5nLCBldGMpLlxuICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBnbG9iYWwuSG93bGVyR2xvYmFsID0gSG93bGVyR2xvYmFsO1xuICAgIGdsb2JhbC5Ib3dsZXIgPSBIb3dsZXI7XG4gICAgZ2xvYmFsLkhvd2wgPSBIb3dsO1xuICAgIGdsb2JhbC5Tb3VuZCA9IFNvdW5kO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7ICAvLyBEZWZpbmUgZ2xvYmFsbHkgaW4gY2FzZSBBTUQgaXMgbm90IGF2YWlsYWJsZSBvciB1bnVzZWQuXG4gICAgd2luZG93Lkhvd2xlckdsb2JhbCA9IEhvd2xlckdsb2JhbDtcbiAgICB3aW5kb3cuSG93bGVyID0gSG93bGVyO1xuICAgIHdpbmRvdy5Ib3dsID0gSG93bDtcbiAgICB3aW5kb3cuU291bmQgPSBTb3VuZDtcbiAgfVxufSkoKTtcblxuXG4vKiFcbiAqICBTcGF0aWFsIFBsdWdpbiAtIEFkZHMgc3VwcG9ydCBmb3Igc3RlcmVvIGFuZCAzRCBhdWRpbyB3aGVyZSBXZWIgQXVkaW8gaXMgc3VwcG9ydGVkLlxuICogIFxuICogIGhvd2xlci5qcyB2Mi4yLjFcbiAqICBob3dsZXJqcy5jb21cbiAqXG4gKiAgKGMpIDIwMTMtMjAyMCwgSmFtZXMgU2ltcHNvbiBvZiBHb2xkRmlyZSBTdHVkaW9zXG4gKiAgZ29sZGZpcmVzdHVkaW9zLmNvbVxuICpcbiAqICBNSVQgTGljZW5zZVxuICovXG5cbihmdW5jdGlvbigpIHtcblxuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gU2V0dXAgZGVmYXVsdCBwcm9wZXJ0aWVzLlxuICBIb3dsZXJHbG9iYWwucHJvdG90eXBlLl9wb3MgPSBbMCwgMCwgMF07XG4gIEhvd2xlckdsb2JhbC5wcm90b3R5cGUuX29yaWVudGF0aW9uID0gWzAsIDAsIC0xLCAwLCAxLCAwXTtcblxuICAvKiogR2xvYmFsIE1ldGhvZHMgKiovXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgdG8gdXBkYXRlIHRoZSBzdGVyZW8gcGFubmluZyBwb3NpdGlvbiBvZiBhbGwgY3VycmVudCBIb3dscy5cbiAgICogRnV0dXJlIEhvd2xzIHdpbGwgbm90IHVzZSB0aGlzIHZhbHVlIHVubGVzcyBleHBsaWNpdGx5IHNldC5cbiAgICogQHBhcmFtICB7TnVtYmVyfSBwYW4gQSB2YWx1ZSBvZiAtMS4wIGlzIGFsbCB0aGUgd2F5IGxlZnQgYW5kIDEuMCBpcyBhbGwgdGhlIHdheSByaWdodC5cbiAgICogQHJldHVybiB7SG93bGVyL051bWJlcn0gICAgIFNlbGYgb3IgY3VycmVudCBzdGVyZW8gcGFubmluZyB2YWx1ZS5cbiAgICovXG4gIEhvd2xlckdsb2JhbC5wcm90b3R5cGUuc3RlcmVvID0gZnVuY3Rpb24ocGFuKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gU3RvcCByaWdodCBoZXJlIGlmIG5vdCB1c2luZyBXZWIgQXVkaW8uXG4gICAgaWYgKCFzZWxmLmN0eCB8fCAhc2VsZi5jdHgubGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgSG93bHMgYW5kIHVwZGF0ZSB0aGVpciBzdGVyZW8gcGFubmluZy5cbiAgICBmb3IgKHZhciBpPXNlbGYuX2hvd2xzLmxlbmd0aC0xOyBpPj0wOyBpLS0pIHtcbiAgICAgIHNlbGYuX2hvd2xzW2ldLnN0ZXJlbyhwYW4pO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQvc2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgbGlzdGVuZXIgaW4gM0QgY2FydGVzaWFuIHNwYWNlLiBTb3VuZHMgdXNpbmdcbiAgICogM0QgcG9zaXRpb24gd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgbGlzdGVuZXIncyBwb3NpdGlvbi5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB4IFRoZSB4LXBvc2l0aW9uIG9mIHRoZSBsaXN0ZW5lci5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB5IFRoZSB5LXBvc2l0aW9uIG9mIHRoZSBsaXN0ZW5lci5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB6IFRoZSB6LXBvc2l0aW9uIG9mIHRoZSBsaXN0ZW5lci5cbiAgICogQHJldHVybiB7SG93bGVyL0FycmF5fSAgIFNlbGYgb3IgY3VycmVudCBsaXN0ZW5lciBwb3NpdGlvbi5cbiAgICovXG4gIEhvd2xlckdsb2JhbC5wcm90b3R5cGUucG9zID0gZnVuY3Rpb24oeCwgeSwgeikge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIC8vIFN0b3AgcmlnaHQgaGVyZSBpZiBub3QgdXNpbmcgV2ViIEF1ZGlvLlxuICAgIGlmICghc2VsZi5jdHggfHwgIXNlbGYuY3R4Lmxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbiAgICAvLyBTZXQgdGhlIGRlZmF1bHRzIGZvciBvcHRpb25hbCAneScgJiAneicuXG4gICAgeSA9ICh0eXBlb2YgeSAhPT0gJ251bWJlcicpID8gc2VsZi5fcG9zWzFdIDogeTtcbiAgICB6ID0gKHR5cGVvZiB6ICE9PSAnbnVtYmVyJykgPyBzZWxmLl9wb3NbMl0gOiB6O1xuXG4gICAgaWYgKHR5cGVvZiB4ID09PSAnbnVtYmVyJykge1xuICAgICAgc2VsZi5fcG9zID0gW3gsIHksIHpdO1xuXG4gICAgICBpZiAodHlwZW9mIHNlbGYuY3R4Lmxpc3RlbmVyLnBvc2l0aW9uWCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc2VsZi5jdHgubGlzdGVuZXIucG9zaXRpb25YLnNldFRhcmdldEF0VGltZShzZWxmLl9wb3NbMF0sIEhvd2xlci5jdHguY3VycmVudFRpbWUsIDAuMSk7XG4gICAgICAgIHNlbGYuY3R4Lmxpc3RlbmVyLnBvc2l0aW9uWS5zZXRUYXJnZXRBdFRpbWUoc2VsZi5fcG9zWzFdLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lLCAwLjEpO1xuICAgICAgICBzZWxmLmN0eC5saXN0ZW5lci5wb3NpdGlvblouc2V0VGFyZ2V0QXRUaW1lKHNlbGYuX3Bvc1syXSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSwgMC4xKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYuY3R4Lmxpc3RlbmVyLnNldFBvc2l0aW9uKHNlbGYuX3Bvc1swXSwgc2VsZi5fcG9zWzFdLCBzZWxmLl9wb3NbMl0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc2VsZi5fcG9zO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQvc2V0IHRoZSBkaXJlY3Rpb24gdGhlIGxpc3RlbmVyIGlzIHBvaW50aW5nIGluIHRoZSAzRCBjYXJ0ZXNpYW4gc3BhY2UuXG4gICAqIEEgZnJvbnQgYW5kIHVwIHZlY3RvciBtdXN0IGJlIHByb3ZpZGVkLiBUaGUgZnJvbnQgaXMgdGhlIGRpcmVjdGlvbiB0aGVcbiAgICogZmFjZSBvZiB0aGUgbGlzdGVuZXIgaXMgcG9pbnRpbmcsIGFuZCB1cCBpcyB0aGUgZGlyZWN0aW9uIHRoZSB0b3Agb2YgdGhlXG4gICAqIGxpc3RlbmVyIGlzIHBvaW50aW5nLiBUaHVzLCB0aGVzZSB2YWx1ZXMgYXJlIGV4cGVjdGVkIHRvIGJlIGF0IHJpZ2h0IGFuZ2xlc1xuICAgKiBmcm9tIGVhY2ggb3RoZXIuXG4gICAqIEBwYXJhbSAge051bWJlcn0geCAgIFRoZSB4LW9yaWVudGF0aW9uIG9mIHRoZSBsaXN0ZW5lci5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB5ICAgVGhlIHktb3JpZW50YXRpb24gb2YgdGhlIGxpc3RlbmVyLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHogICBUaGUgei1vcmllbnRhdGlvbiBvZiB0aGUgbGlzdGVuZXIuXG4gICAqIEBwYXJhbSAge051bWJlcn0geFVwIFRoZSB4LW9yaWVudGF0aW9uIG9mIHRoZSB0b3Agb2YgdGhlIGxpc3RlbmVyLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHlVcCBUaGUgeS1vcmllbnRhdGlvbiBvZiB0aGUgdG9wIG9mIHRoZSBsaXN0ZW5lci5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB6VXAgVGhlIHotb3JpZW50YXRpb24gb2YgdGhlIHRvcCBvZiB0aGUgbGlzdGVuZXIuXG4gICAqIEByZXR1cm4ge0hvd2xlci9BcnJheX0gICAgIFJldHVybnMgc2VsZiBvciB0aGUgY3VycmVudCBvcmllbnRhdGlvbiB2ZWN0b3JzLlxuICAgKi9cbiAgSG93bGVyR2xvYmFsLnByb3RvdHlwZS5vcmllbnRhdGlvbiA9IGZ1bmN0aW9uKHgsIHksIHosIHhVcCwgeVVwLCB6VXApIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBTdG9wIHJpZ2h0IGhlcmUgaWYgbm90IHVzaW5nIFdlYiBBdWRpby5cbiAgICBpZiAoIXNlbGYuY3R4IHx8ICFzZWxmLmN0eC5saXN0ZW5lcikge1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBkZWZhdWx0cyBmb3Igb3B0aW9uYWwgJ3knICYgJ3onLlxuICAgIHZhciBvciA9IHNlbGYuX29yaWVudGF0aW9uO1xuICAgIHkgPSAodHlwZW9mIHkgIT09ICdudW1iZXInKSA/IG9yWzFdIDogeTtcbiAgICB6ID0gKHR5cGVvZiB6ICE9PSAnbnVtYmVyJykgPyBvclsyXSA6IHo7XG4gICAgeFVwID0gKHR5cGVvZiB4VXAgIT09ICdudW1iZXInKSA/IG9yWzNdIDogeFVwO1xuICAgIHlVcCA9ICh0eXBlb2YgeVVwICE9PSAnbnVtYmVyJykgPyBvcls0XSA6IHlVcDtcbiAgICB6VXAgPSAodHlwZW9mIHpVcCAhPT0gJ251bWJlcicpID8gb3JbNV0gOiB6VXA7XG5cbiAgICBpZiAodHlwZW9mIHggPT09ICdudW1iZXInKSB7XG4gICAgICBzZWxmLl9vcmllbnRhdGlvbiA9IFt4LCB5LCB6LCB4VXAsIHlVcCwgelVwXTtcblxuICAgICAgaWYgKHR5cGVvZiBzZWxmLmN0eC5saXN0ZW5lci5mb3J3YXJkWCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc2VsZi5jdHgubGlzdGVuZXIuZm9yd2FyZFguc2V0VGFyZ2V0QXRUaW1lKHgsIEhvd2xlci5jdHguY3VycmVudFRpbWUsIDAuMSk7XG4gICAgICAgIHNlbGYuY3R4Lmxpc3RlbmVyLmZvcndhcmRZLnNldFRhcmdldEF0VGltZSh5LCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lLCAwLjEpO1xuICAgICAgICBzZWxmLmN0eC5saXN0ZW5lci5mb3J3YXJkWi5zZXRUYXJnZXRBdFRpbWUoeiwgSG93bGVyLmN0eC5jdXJyZW50VGltZSwgMC4xKTtcbiAgICAgICAgc2VsZi5jdHgubGlzdGVuZXIudXBYLnNldFRhcmdldEF0VGltZSh4VXAsIEhvd2xlci5jdHguY3VycmVudFRpbWUsIDAuMSk7XG4gICAgICAgIHNlbGYuY3R4Lmxpc3RlbmVyLnVwWS5zZXRUYXJnZXRBdFRpbWUoeVVwLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lLCAwLjEpO1xuICAgICAgICBzZWxmLmN0eC5saXN0ZW5lci51cFouc2V0VGFyZ2V0QXRUaW1lKHpVcCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSwgMC4xKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYuY3R4Lmxpc3RlbmVyLnNldE9yaWVudGF0aW9uKHgsIHksIHosIHhVcCwgeVVwLCB6VXApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGY7XG4gIH07XG5cbiAgLyoqIEdyb3VwIE1ldGhvZHMgKiovXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIEFkZCBuZXcgcHJvcGVydGllcyB0byB0aGUgY29yZSBpbml0LlxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gX3N1cGVyIENvcmUgaW5pdCBtZXRob2QuXG4gICAqIEByZXR1cm4ge0hvd2x9XG4gICAqL1xuICBIb3dsLnByb3RvdHlwZS5pbml0ID0gKGZ1bmN0aW9uKF9zdXBlcikge1xuICAgIHJldHVybiBmdW5jdGlvbihvKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIFNldHVwIHVzZXItZGVmaW5lZCBkZWZhdWx0IHByb3BlcnRpZXMuXG4gICAgICBzZWxmLl9vcmllbnRhdGlvbiA9IG8ub3JpZW50YXRpb24gfHwgWzEsIDAsIDBdO1xuICAgICAgc2VsZi5fc3RlcmVvID0gby5zdGVyZW8gfHwgbnVsbDtcbiAgICAgIHNlbGYuX3BvcyA9IG8ucG9zIHx8IG51bGw7XG4gICAgICBzZWxmLl9wYW5uZXJBdHRyID0ge1xuICAgICAgICBjb25lSW5uZXJBbmdsZTogdHlwZW9mIG8uY29uZUlubmVyQW5nbGUgIT09ICd1bmRlZmluZWQnID8gby5jb25lSW5uZXJBbmdsZSA6IDM2MCxcbiAgICAgICAgY29uZU91dGVyQW5nbGU6IHR5cGVvZiBvLmNvbmVPdXRlckFuZ2xlICE9PSAndW5kZWZpbmVkJyA/IG8uY29uZU91dGVyQW5nbGUgOiAzNjAsXG4gICAgICAgIGNvbmVPdXRlckdhaW46IHR5cGVvZiBvLmNvbmVPdXRlckdhaW4gIT09ICd1bmRlZmluZWQnID8gby5jb25lT3V0ZXJHYWluIDogMCxcbiAgICAgICAgZGlzdGFuY2VNb2RlbDogdHlwZW9mIG8uZGlzdGFuY2VNb2RlbCAhPT0gJ3VuZGVmaW5lZCcgPyBvLmRpc3RhbmNlTW9kZWwgOiAnaW52ZXJzZScsXG4gICAgICAgIG1heERpc3RhbmNlOiB0eXBlb2Ygby5tYXhEaXN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLm1heERpc3RhbmNlIDogMTAwMDAsXG4gICAgICAgIHBhbm5pbmdNb2RlbDogdHlwZW9mIG8ucGFubmluZ01vZGVsICE9PSAndW5kZWZpbmVkJyA/IG8ucGFubmluZ01vZGVsIDogJ0hSVEYnLFxuICAgICAgICByZWZEaXN0YW5jZTogdHlwZW9mIG8ucmVmRGlzdGFuY2UgIT09ICd1bmRlZmluZWQnID8gby5yZWZEaXN0YW5jZSA6IDEsXG4gICAgICAgIHJvbGxvZmZGYWN0b3I6IHR5cGVvZiBvLnJvbGxvZmZGYWN0b3IgIT09ICd1bmRlZmluZWQnID8gby5yb2xsb2ZmRmFjdG9yIDogMVxuICAgICAgfTtcblxuICAgICAgLy8gU2V0dXAgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAgc2VsZi5fb25zdGVyZW8gPSBvLm9uc3RlcmVvID8gW3tmbjogby5vbnN0ZXJlb31dIDogW107XG4gICAgICBzZWxmLl9vbnBvcyA9IG8ub25wb3MgPyBbe2ZuOiBvLm9ucG9zfV0gOiBbXTtcbiAgICAgIHNlbGYuX29ub3JpZW50YXRpb24gPSBvLm9ub3JpZW50YXRpb24gPyBbe2ZuOiBvLm9ub3JpZW50YXRpb259XSA6IFtdO1xuXG4gICAgICAvLyBDb21wbGV0ZSBpbml0aWxpemF0aW9uIHdpdGggaG93bGVyLmpzIGNvcmUncyBpbml0IGZ1bmN0aW9uLlxuICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIG8pO1xuICAgIH07XG4gIH0pKEhvd2wucHJvdG90eXBlLmluaXQpO1xuXG4gIC8qKlxuICAgKiBHZXQvc2V0IHRoZSBzdGVyZW8gcGFubmluZyBvZiB0aGUgYXVkaW8gc291cmNlIGZvciB0aGlzIHNvdW5kIG9yIGFsbCBpbiB0aGUgZ3JvdXAuXG4gICAqIEBwYXJhbSAge051bWJlcn0gcGFuICBBIHZhbHVlIG9mIC0xLjAgaXMgYWxsIHRoZSB3YXkgbGVmdCBhbmQgMS4wIGlzIGFsbCB0aGUgd2F5IHJpZ2h0LlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkIChvcHRpb25hbCkgVGhlIHNvdW5kIElELiBJZiBub25lIGlzIHBhc3NlZCwgYWxsIGluIGdyb3VwIHdpbGwgYmUgdXBkYXRlZC5cbiAgICogQHJldHVybiB7SG93bC9OdW1iZXJ9ICAgIFJldHVybnMgc2VsZiBvciB0aGUgY3VycmVudCBzdGVyZW8gcGFubmluZyB2YWx1ZS5cbiAgICovXG4gIEhvd2wucHJvdG90eXBlLnN0ZXJlbyA9IGZ1bmN0aW9uKHBhbiwgaWQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBTdG9wIHJpZ2h0IGhlcmUgaWYgbm90IHVzaW5nIFdlYiBBdWRpby5cbiAgICBpZiAoIXNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgc291bmQgaGFzbid0IGxvYWRlZCwgYWRkIGl0IHRvIHRoZSBsb2FkIHF1ZXVlIHRvIGNoYW5nZSBzdGVyZW8gcGFuIHdoZW4gY2FwYWJsZS5cbiAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnKSB7XG4gICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgZXZlbnQ6ICdzdGVyZW8nLFxuICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHNlbGYuc3RlcmVvKHBhbiwgaWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIFBhbm5lclN0ZXJlb05vZGUgc3VwcG9ydCBhbmQgZmFsbGJhY2sgdG8gUGFubmVyTm9kZSBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICAgIHZhciBwYW5uZXJUeXBlID0gKHR5cGVvZiBIb3dsZXIuY3R4LmNyZWF0ZVN0ZXJlb1Bhbm5lciA9PT0gJ3VuZGVmaW5lZCcpID8gJ3NwYXRpYWwnIDogJ3N0ZXJlbyc7XG5cbiAgICAvLyBTZXR1cCB0aGUgZ3JvdXAncyBzdGVyZW8gcGFubmluZyBpZiBubyBJRCBpcyBwYXNzZWQuXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIFJldHVybiB0aGUgZ3JvdXAncyBzdGVyZW8gcGFubmluZyBpZiBubyBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQuXG4gICAgICBpZiAodHlwZW9mIHBhbiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc2VsZi5fc3RlcmVvID0gcGFuO1xuICAgICAgICBzZWxmLl9wb3MgPSBbcGFuLCAwLCAwXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzZWxmLl9zdGVyZW87XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hhbmdlIHRoZSBzdHJlbyBwYW5uaW5nIG9mIG9uZSBvciBhbGwgc291bmRzIGluIGdyb3VwLlxuICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG4gICAgZm9yICh2YXIgaT0wOyBpPGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gR2V0IHRoZSBzb3VuZC5cbiAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZHNbaV0pO1xuXG4gICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYW4gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgc291bmQuX3N0ZXJlbyA9IHBhbjtcbiAgICAgICAgICBzb3VuZC5fcG9zID0gW3BhbiwgMCwgMF07XG5cbiAgICAgICAgICBpZiAoc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGFyZSBmYWxsaW5nIGJhY2ssIG1ha2Ugc3VyZSB0aGUgcGFubmluZ01vZGVsIGlzIGVxdWFscG93ZXIuXG4gICAgICAgICAgICBzb3VuZC5fcGFubmVyQXR0ci5wYW5uaW5nTW9kZWwgPSAnZXF1YWxwb3dlcic7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgcGFubmVyIHNldHVwIGFuZCBjcmVhdGUgYSBuZXcgb25lIGlmIG5vdC5cbiAgICAgICAgICAgIGlmICghc291bmQuX3Bhbm5lciB8fCAhc291bmQuX3Bhbm5lci5wYW4pIHtcbiAgICAgICAgICAgICAgc2V0dXBQYW5uZXIoc291bmQsIHBhbm5lclR5cGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGFubmVyVHlwZSA9PT0gJ3NwYXRpYWwnKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2Ygc291bmQuX3Bhbm5lci5wb3NpdGlvblggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgc291bmQuX3Bhbm5lci5wb3NpdGlvblguc2V0VmFsdWVBdFRpbWUocGFuLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWS5zZXRWYWx1ZUF0VGltZSgwLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWi5zZXRWYWx1ZUF0VGltZSgwLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLnNldFBvc2l0aW9uKHBhbiwgMCwgMCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIucGFuLnNldFZhbHVlQXRUaW1lKHBhbiwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi5fZW1pdCgnc3RlcmVvJywgc291bmQuX2lkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gc291bmQuX3N0ZXJlbztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQvc2V0IHRoZSAzRCBzcGF0aWFsIHBvc2l0aW9uIG9mIHRoZSBhdWRpbyBzb3VyY2UgZm9yIHRoaXMgc291bmQgb3IgZ3JvdXAgcmVsYXRpdmUgdG8gdGhlIGdsb2JhbCBsaXN0ZW5lci5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB4ICBUaGUgeC1wb3NpdGlvbiBvZiB0aGUgYXVkaW8gc291cmNlLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHkgIFRoZSB5LXBvc2l0aW9uIG9mIHRoZSBhdWRpbyBzb3VyY2UuXG4gICAqIEBwYXJhbSAge051bWJlcn0geiAgVGhlIHotcG9zaXRpb24gb2YgdGhlIGF1ZGlvIHNvdXJjZS5cbiAgICogQHBhcmFtICB7TnVtYmVyfSBpZCAob3B0aW9uYWwpIFRoZSBzb3VuZCBJRC4gSWYgbm9uZSBpcyBwYXNzZWQsIGFsbCBpbiBncm91cCB3aWxsIGJlIHVwZGF0ZWQuXG4gICAqIEByZXR1cm4ge0hvd2wvQXJyYXl9ICAgIFJldHVybnMgc2VsZiBvciB0aGUgY3VycmVudCAzRCBzcGF0aWFsIHBvc2l0aW9uOiBbeCwgeSwgel0uXG4gICAqL1xuICBIb3dsLnByb3RvdHlwZS5wb3MgPSBmdW5jdGlvbih4LCB5LCB6LCBpZCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIC8vIFN0b3AgcmlnaHQgaGVyZSBpZiBub3QgdXNpbmcgV2ViIEF1ZGlvLlxuICAgIGlmICghc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gY2hhbmdlIHBvc2l0aW9uIHdoZW4gY2FwYWJsZS5cbiAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnKSB7XG4gICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgZXZlbnQ6ICdwb3MnLFxuICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHNlbGYucG9zKHgsIHksIHosIGlkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgZGVmYXVsdHMgZm9yIG9wdGlvbmFsICd5JyAmICd6Jy5cbiAgICB5ID0gKHR5cGVvZiB5ICE9PSAnbnVtYmVyJykgPyAwIDogeTtcbiAgICB6ID0gKHR5cGVvZiB6ICE9PSAnbnVtYmVyJykgPyAtMC41IDogejtcblxuICAgIC8vIFNldHVwIHRoZSBncm91cCdzIHNwYXRpYWwgcG9zaXRpb24gaWYgbm8gSUQgaXMgcGFzc2VkLlxuICAgIGlmICh0eXBlb2YgaWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBSZXR1cm4gdGhlIGdyb3VwJ3Mgc3BhdGlhbCBwb3NpdGlvbiBpZiBubyBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQuXG4gICAgICBpZiAodHlwZW9mIHggPT09ICdudW1iZXInKSB7XG4gICAgICAgIHNlbGYuX3BvcyA9IFt4LCB5LCB6XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzZWxmLl9wb3M7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hhbmdlIHRoZSBzcGF0aWFsIHBvc2l0aW9uIG9mIG9uZSBvciBhbGwgc291bmRzIGluIGdyb3VwLlxuICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG4gICAgZm9yICh2YXIgaT0wOyBpPGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gR2V0IHRoZSBzb3VuZC5cbiAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZHNbaV0pO1xuXG4gICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB4ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHNvdW5kLl9wb3MgPSBbeCwgeSwgel07XG5cbiAgICAgICAgICBpZiAoc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgcGFubmVyIHNldHVwIGFuZCBjcmVhdGUgYSBuZXcgb25lIGlmIG5vdC5cbiAgICAgICAgICAgIGlmICghc291bmQuX3Bhbm5lciB8fCBzb3VuZC5fcGFubmVyLnBhbikge1xuICAgICAgICAgICAgICBzZXR1cFBhbm5lcihzb3VuZCwgJ3NwYXRpYWwnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgc291bmQuX3Bhbm5lci5wb3NpdGlvblguc2V0VmFsdWVBdFRpbWUoeCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIucG9zaXRpb25ZLnNldFZhbHVlQXRUaW1lKHksIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWi5zZXRWYWx1ZUF0VGltZSh6LCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIuc2V0UG9zaXRpb24oeCwgeSwgeik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi5fZW1pdCgncG9zJywgc291bmQuX2lkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gc291bmQuX3BvcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQvc2V0IHRoZSBkaXJlY3Rpb24gdGhlIGF1ZGlvIHNvdXJjZSBpcyBwb2ludGluZyBpbiB0aGUgM0QgY2FydGVzaWFuIGNvb3JkaW5hdGVcbiAgICogc3BhY2UuIERlcGVuZGluZyBvbiBob3cgZGlyZWN0aW9uIHRoZSBzb3VuZCBpcywgYmFzZWQgb24gdGhlIGBjb25lYCBhdHRyaWJ1dGVzLFxuICAgKiBhIHNvdW5kIHBvaW50aW5nIGF3YXkgZnJvbSB0aGUgbGlzdGVuZXIgY2FuIGJlIHF1aWV0IG9yIHNpbGVudC5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB4ICBUaGUgeC1vcmllbnRhdGlvbiBvZiB0aGUgc291cmNlLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHkgIFRoZSB5LW9yaWVudGF0aW9uIG9mIHRoZSBzb3VyY2UuXG4gICAqIEBwYXJhbSAge051bWJlcn0geiAgVGhlIHotb3JpZW50YXRpb24gb2YgdGhlIHNvdXJjZS5cbiAgICogQHBhcmFtICB7TnVtYmVyfSBpZCAob3B0aW9uYWwpIFRoZSBzb3VuZCBJRC4gSWYgbm9uZSBpcyBwYXNzZWQsIGFsbCBpbiBncm91cCB3aWxsIGJlIHVwZGF0ZWQuXG4gICAqIEByZXR1cm4ge0hvd2wvQXJyYXl9ICAgIFJldHVybnMgc2VsZiBvciB0aGUgY3VycmVudCAzRCBzcGF0aWFsIG9yaWVudGF0aW9uOiBbeCwgeSwgel0uXG4gICAqL1xuICBIb3dsLnByb3RvdHlwZS5vcmllbnRhdGlvbiA9IGZ1bmN0aW9uKHgsIHksIHosIGlkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gU3RvcCByaWdodCBoZXJlIGlmIG5vdCB1c2luZyBXZWIgQXVkaW8uXG4gICAgaWYgKCFzZWxmLl93ZWJBdWRpbykge1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIGFkZCBpdCB0byB0aGUgbG9hZCBxdWV1ZSB0byBjaGFuZ2Ugb3JpZW50YXRpb24gd2hlbiBjYXBhYmxlLlxuICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICBldmVudDogJ29yaWVudGF0aW9uJyxcbiAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBzZWxmLm9yaWVudGF0aW9uKHgsIHksIHosIGlkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgZGVmYXVsdHMgZm9yIG9wdGlvbmFsICd5JyAmICd6Jy5cbiAgICB5ID0gKHR5cGVvZiB5ICE9PSAnbnVtYmVyJykgPyBzZWxmLl9vcmllbnRhdGlvblsxXSA6IHk7XG4gICAgeiA9ICh0eXBlb2YgeiAhPT0gJ251bWJlcicpID8gc2VsZi5fb3JpZW50YXRpb25bMl0gOiB6O1xuXG4gICAgLy8gU2V0dXAgdGhlIGdyb3VwJ3Mgc3BhdGlhbCBvcmllbnRhdGlvbiBpZiBubyBJRCBpcyBwYXNzZWQuXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIFJldHVybiB0aGUgZ3JvdXAncyBzcGF0aWFsIG9yaWVudGF0aW9uIGlmIG5vIHBhcmFtZXRlcnMgYXJlIHBhc3NlZC5cbiAgICAgIGlmICh0eXBlb2YgeCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc2VsZi5fb3JpZW50YXRpb24gPSBbeCwgeSwgel07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc2VsZi5fb3JpZW50YXRpb247XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hhbmdlIHRoZSBzcGF0aWFsIG9yaWVudGF0aW9uIG9mIG9uZSBvciBhbGwgc291bmRzIGluIGdyb3VwLlxuICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG4gICAgZm9yICh2YXIgaT0wOyBpPGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gR2V0IHRoZSBzb3VuZC5cbiAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZHNbaV0pO1xuXG4gICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB4ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHNvdW5kLl9vcmllbnRhdGlvbiA9IFt4LCB5LCB6XTtcblxuICAgICAgICAgIGlmIChzb3VuZC5fbm9kZSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBwYW5uZXIgc2V0dXAgYW5kIGNyZWF0ZSBhIG5ldyBvbmUgaWYgbm90LlxuICAgICAgICAgICAgaWYgKCFzb3VuZC5fcGFubmVyKSB7XG4gICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgcG9zaXRpb24gdG8gc2V0dXAgdGhlIG5vZGUgd2l0aC5cbiAgICAgICAgICAgICAgaWYgKCFzb3VuZC5fcG9zKSB7XG4gICAgICAgICAgICAgICAgc291bmQuX3BvcyA9IHNlbGYuX3BvcyB8fCBbMCwgMCwgLTAuNV07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzZXR1cFBhbm5lcihzb3VuZCwgJ3NwYXRpYWwnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VuZC5fcGFubmVyLm9yaWVudGF0aW9uWCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgc291bmQuX3Bhbm5lci5vcmllbnRhdGlvblguc2V0VmFsdWVBdFRpbWUoeCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIub3JpZW50YXRpb25ZLnNldFZhbHVlQXRUaW1lKHksIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLm9yaWVudGF0aW9uWi5zZXRWYWx1ZUF0VGltZSh6LCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIuc2V0T3JpZW50YXRpb24oeCwgeSwgeik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi5fZW1pdCgnb3JpZW50YXRpb24nLCBzb3VuZC5faWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBzb3VuZC5fb3JpZW50YXRpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZjtcbiAgfTtcblxuICAvKipcbiAgICogR2V0L3NldCB0aGUgcGFubmVyIG5vZGUncyBhdHRyaWJ1dGVzIGZvciBhIHNvdW5kIG9yIGdyb3VwIG9mIHNvdW5kcy5cbiAgICogVGhpcyBtZXRob2QgY2FuIG9wdGlvbmFsbCB0YWtlIDAsIDEgb3IgMiBhcmd1bWVudHMuXG4gICAqICAgcGFubmVyQXR0cigpIC0+IFJldHVybnMgdGhlIGdyb3VwJ3MgdmFsdWVzLlxuICAgKiAgIHBhbm5lckF0dHIoaWQpIC0+IFJldHVybnMgdGhlIHNvdW5kIGlkJ3MgdmFsdWVzLlxuICAgKiAgIHBhbm5lckF0dHIobykgLT4gU2V0J3MgdGhlIHZhbHVlcyBvZiBhbGwgc291bmRzIGluIHRoaXMgSG93bCBncm91cC5cbiAgICogICBwYW5uZXJBdHRyKG8sIGlkKSAtPiBTZXQncyB0aGUgdmFsdWVzIG9mIHBhc3NlZCBzb3VuZCBpZC5cbiAgICpcbiAgICogICBBdHRyaWJ1dGVzOlxuICAgKiAgICAgY29uZUlubmVyQW5nbGUgLSAoMzYwIGJ5IGRlZmF1bHQpIEEgcGFyYW1ldGVyIGZvciBkaXJlY3Rpb25hbCBhdWRpbyBzb3VyY2VzLCB0aGlzIGlzIGFuIGFuZ2xlLCBpbiBkZWdyZWVzLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICBpbnNpZGUgb2Ygd2hpY2ggdGhlcmUgd2lsbCBiZSBubyB2b2x1bWUgcmVkdWN0aW9uLlxuICAgKiAgICAgY29uZU91dGVyQW5nbGUgLSAoMzYwIGJ5IGRlZmF1bHQpIEEgcGFyYW1ldGVyIGZvciBkaXJlY3Rpb25hbCBhdWRpbyBzb3VyY2VzLCB0aGlzIGlzIGFuIGFuZ2xlLCBpbiBkZWdyZWVzLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICBvdXRzaWRlIG9mIHdoaWNoIHRoZSB2b2x1bWUgd2lsbCBiZSByZWR1Y2VkIHRvIGEgY29uc3RhbnQgdmFsdWUgb2YgYGNvbmVPdXRlckdhaW5gLlxuICAgKiAgICAgY29uZU91dGVyR2FpbiAtICgwIGJ5IGRlZmF1bHQpIEEgcGFyYW1ldGVyIGZvciBkaXJlY3Rpb25hbCBhdWRpbyBzb3VyY2VzLCB0aGlzIGlzIHRoZSBnYWluIG91dHNpZGUgb2YgdGhlXG4gICAqICAgICAgICAgICAgICAgICAgICAgYGNvbmVPdXRlckFuZ2xlYC4gSXQgaXMgYSBsaW5lYXIgdmFsdWUgaW4gdGhlIHJhbmdlIGBbMCwgMV1gLlxuICAgKiAgICAgZGlzdGFuY2VNb2RlbCAtICgnaW52ZXJzZScgYnkgZGVmYXVsdCkgRGV0ZXJtaW5lcyBhbGdvcml0aG0gdXNlZCB0byByZWR1Y2Ugdm9sdW1lIGFzIGF1ZGlvIG1vdmVzIGF3YXkgZnJvbVxuICAgKiAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLiBDYW4gYmUgYGxpbmVhcmAsIGBpbnZlcnNlYCBvciBgZXhwb25lbnRpYWwuXG4gICAqICAgICBtYXhEaXN0YW5jZSAtICgxMDAwMCBieSBkZWZhdWx0KSBUaGUgbWF4aW11bSBkaXN0YW5jZSBiZXR3ZWVuIHNvdXJjZSBhbmQgbGlzdGVuZXIsIGFmdGVyIHdoaWNoIHRoZSB2b2x1bWVcbiAgICogICAgICAgICAgICAgICAgICAgd2lsbCBub3QgYmUgcmVkdWNlZCBhbnkgZnVydGhlci5cbiAgICogICAgIHJlZkRpc3RhbmNlIC0gKDEgYnkgZGVmYXVsdCkgQSByZWZlcmVuY2UgZGlzdGFuY2UgZm9yIHJlZHVjaW5nIHZvbHVtZSBhcyBzb3VyY2UgbW92ZXMgZnVydGhlciBmcm9tIHRoZSBsaXN0ZW5lci5cbiAgICogICAgICAgICAgICAgICAgICAgVGhpcyBpcyBzaW1wbHkgYSB2YXJpYWJsZSBvZiB0aGUgZGlzdGFuY2UgbW9kZWwgYW5kIGhhcyBhIGRpZmZlcmVudCBlZmZlY3QgZGVwZW5kaW5nIG9uIHdoaWNoIG1vZGVsXG4gICAqICAgICAgICAgICAgICAgICAgIGlzIHVzZWQgYW5kIHRoZSBzY2FsZSBvZiB5b3VyIGNvb3JkaW5hdGVzLiBHZW5lcmFsbHksIHZvbHVtZSB3aWxsIGJlIGVxdWFsIHRvIDEgYXQgdGhpcyBkaXN0YW5jZS5cbiAgICogICAgIHJvbGxvZmZGYWN0b3IgLSAoMSBieSBkZWZhdWx0KSBIb3cgcXVpY2tseSB0aGUgdm9sdW1lIHJlZHVjZXMgYXMgc291cmNlIG1vdmVzIGZyb20gbGlzdGVuZXIuIFRoaXMgaXMgc2ltcGx5IGFcbiAgICogICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBvZiB0aGUgZGlzdGFuY2UgbW9kZWwgYW5kIGNhbiBiZSBpbiB0aGUgcmFuZ2Ugb2YgYFswLCAxXWAgd2l0aCBgbGluZWFyYCBhbmQgYFswLCDiiJ5dYFxuICAgKiAgICAgICAgICAgICAgICAgICAgIHdpdGggYGludmVyc2VgIGFuZCBgZXhwb25lbnRpYWxgLlxuICAgKiAgICAgcGFubmluZ01vZGVsIC0gKCdIUlRGJyBieSBkZWZhdWx0KSBEZXRlcm1pbmVzIHdoaWNoIHNwYXRpYWxpemF0aW9uIGFsZ29yaXRobSBpcyB1c2VkIHRvIHBvc2l0aW9uIGF1ZGlvLlxuICAgKiAgICAgICAgICAgICAgICAgICAgIENhbiBiZSBgSFJURmAgb3IgYGVxdWFscG93ZXJgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtIb3dsL09iamVjdH0gUmV0dXJucyBzZWxmIG9yIGN1cnJlbnQgcGFubmVyIGF0dHJpYnV0ZXMuXG4gICAqL1xuICBIb3dsLnByb3RvdHlwZS5wYW5uZXJBdHRyID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIHZhciBvLCBpZCwgc291bmQ7XG5cbiAgICAvLyBTdG9wIHJpZ2h0IGhlcmUgaWYgbm90IHVzaW5nIFdlYiBBdWRpby5cbiAgICBpZiAoIXNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgdGhlIHZhbHVlcyBiYXNlZCBvbiBhcmd1bWVudHMuXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBSZXR1cm4gdGhlIGdyb3VwJ3MgcGFubmVyIGF0dHJpYnV0ZSB2YWx1ZXMuXG4gICAgICByZXR1cm4gc2VsZi5fcGFubmVyQXR0cjtcbiAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG8gPSBhcmdzWzBdO1xuXG4gICAgICAgIC8vIFNldCB0aGUgZ3JvdSdzIHBhbm5lciBhdHRyaWJ1dGUgdmFsdWVzLlxuICAgICAgICBpZiAodHlwZW9mIGlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGlmICghby5wYW5uZXJBdHRyKSB7XG4gICAgICAgICAgICBvLnBhbm5lckF0dHIgPSB7XG4gICAgICAgICAgICAgIGNvbmVJbm5lckFuZ2xlOiBvLmNvbmVJbm5lckFuZ2xlLFxuICAgICAgICAgICAgICBjb25lT3V0ZXJBbmdsZTogby5jb25lT3V0ZXJBbmdsZSxcbiAgICAgICAgICAgICAgY29uZU91dGVyR2Fpbjogby5jb25lT3V0ZXJHYWluLFxuICAgICAgICAgICAgICBkaXN0YW5jZU1vZGVsOiBvLmRpc3RhbmNlTW9kZWwsXG4gICAgICAgICAgICAgIG1heERpc3RhbmNlOiBvLm1heERpc3RhbmNlLFxuICAgICAgICAgICAgICByZWZEaXN0YW5jZTogby5yZWZEaXN0YW5jZSxcbiAgICAgICAgICAgICAgcm9sbG9mZkZhY3Rvcjogby5yb2xsb2ZmRmFjdG9yLFxuICAgICAgICAgICAgICBwYW5uaW5nTW9kZWw6IG8ucGFubmluZ01vZGVsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlbGYuX3Bhbm5lckF0dHIgPSB7XG4gICAgICAgICAgICBjb25lSW5uZXJBbmdsZTogdHlwZW9mIG8ucGFubmVyQXR0ci5jb25lSW5uZXJBbmdsZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLnBhbm5lckF0dHIuY29uZUlubmVyQW5nbGUgOiBzZWxmLl9jb25lSW5uZXJBbmdsZSxcbiAgICAgICAgICAgIGNvbmVPdXRlckFuZ2xlOiB0eXBlb2Ygby5wYW5uZXJBdHRyLmNvbmVPdXRlckFuZ2xlICE9PSAndW5kZWZpbmVkJyA/IG8ucGFubmVyQXR0ci5jb25lT3V0ZXJBbmdsZSA6IHNlbGYuX2NvbmVPdXRlckFuZ2xlLFxuICAgICAgICAgICAgY29uZU91dGVyR2FpbjogdHlwZW9mIG8ucGFubmVyQXR0ci5jb25lT3V0ZXJHYWluICE9PSAndW5kZWZpbmVkJyA/IG8ucGFubmVyQXR0ci5jb25lT3V0ZXJHYWluIDogc2VsZi5fY29uZU91dGVyR2FpbixcbiAgICAgICAgICAgIGRpc3RhbmNlTW9kZWw6IHR5cGVvZiBvLnBhbm5lckF0dHIuZGlzdGFuY2VNb2RlbCAhPT0gJ3VuZGVmaW5lZCcgPyBvLnBhbm5lckF0dHIuZGlzdGFuY2VNb2RlbCA6IHNlbGYuX2Rpc3RhbmNlTW9kZWwsXG4gICAgICAgICAgICBtYXhEaXN0YW5jZTogdHlwZW9mIG8ucGFubmVyQXR0ci5tYXhEaXN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLnBhbm5lckF0dHIubWF4RGlzdGFuY2UgOiBzZWxmLl9tYXhEaXN0YW5jZSxcbiAgICAgICAgICAgIHJlZkRpc3RhbmNlOiB0eXBlb2Ygby5wYW5uZXJBdHRyLnJlZkRpc3RhbmNlICE9PSAndW5kZWZpbmVkJyA/IG8ucGFubmVyQXR0ci5yZWZEaXN0YW5jZSA6IHNlbGYuX3JlZkRpc3RhbmNlLFxuICAgICAgICAgICAgcm9sbG9mZkZhY3RvcjogdHlwZW9mIG8ucGFubmVyQXR0ci5yb2xsb2ZmRmFjdG9yICE9PSAndW5kZWZpbmVkJyA/IG8ucGFubmVyQXR0ci5yb2xsb2ZmRmFjdG9yIDogc2VsZi5fcm9sbG9mZkZhY3RvcixcbiAgICAgICAgICAgIHBhbm5pbmdNb2RlbDogdHlwZW9mIG8ucGFubmVyQXR0ci5wYW5uaW5nTW9kZWwgIT09ICd1bmRlZmluZWQnID8gby5wYW5uZXJBdHRyLnBhbm5pbmdNb2RlbCA6IHNlbGYuX3Bhbm5pbmdNb2RlbFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJldHVybiB0aGlzIHNvdW5kJ3MgcGFubmVyIGF0dHJpYnV0ZSB2YWx1ZXMuXG4gICAgICAgIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKHBhcnNlSW50KGFyZ3NbMF0sIDEwKSk7XG4gICAgICAgIHJldHVybiBzb3VuZCA/IHNvdW5kLl9wYW5uZXJBdHRyIDogc2VsZi5fcGFubmVyQXR0cjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICBvID0gYXJnc1swXTtcbiAgICAgIGlkID0gcGFyc2VJbnQoYXJnc1sxXSwgMTApO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgdmFsdWVzIG9mIHRoZSBzcGVjaWZpZWQgc291bmRzLlxuICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG4gICAgZm9yICh2YXIgaT0wOyBpPGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWRzW2ldKTtcblxuICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgIC8vIE1lcmdlIHRoZSBuZXcgdmFsdWVzIGludG8gdGhlIHNvdW5kLlxuICAgICAgICB2YXIgcGEgPSBzb3VuZC5fcGFubmVyQXR0cjtcbiAgICAgICAgcGEgPSB7XG4gICAgICAgICAgY29uZUlubmVyQW5nbGU6IHR5cGVvZiBvLmNvbmVJbm5lckFuZ2xlICE9PSAndW5kZWZpbmVkJyA/IG8uY29uZUlubmVyQW5nbGUgOiBwYS5jb25lSW5uZXJBbmdsZSxcbiAgICAgICAgICBjb25lT3V0ZXJBbmdsZTogdHlwZW9mIG8uY29uZU91dGVyQW5nbGUgIT09ICd1bmRlZmluZWQnID8gby5jb25lT3V0ZXJBbmdsZSA6IHBhLmNvbmVPdXRlckFuZ2xlLFxuICAgICAgICAgIGNvbmVPdXRlckdhaW46IHR5cGVvZiBvLmNvbmVPdXRlckdhaW4gIT09ICd1bmRlZmluZWQnID8gby5jb25lT3V0ZXJHYWluIDogcGEuY29uZU91dGVyR2FpbixcbiAgICAgICAgICBkaXN0YW5jZU1vZGVsOiB0eXBlb2Ygby5kaXN0YW5jZU1vZGVsICE9PSAndW5kZWZpbmVkJyA/IG8uZGlzdGFuY2VNb2RlbCA6IHBhLmRpc3RhbmNlTW9kZWwsXG4gICAgICAgICAgbWF4RGlzdGFuY2U6IHR5cGVvZiBvLm1heERpc3RhbmNlICE9PSAndW5kZWZpbmVkJyA/IG8ubWF4RGlzdGFuY2UgOiBwYS5tYXhEaXN0YW5jZSxcbiAgICAgICAgICByZWZEaXN0YW5jZTogdHlwZW9mIG8ucmVmRGlzdGFuY2UgIT09ICd1bmRlZmluZWQnID8gby5yZWZEaXN0YW5jZSA6IHBhLnJlZkRpc3RhbmNlLFxuICAgICAgICAgIHJvbGxvZmZGYWN0b3I6IHR5cGVvZiBvLnJvbGxvZmZGYWN0b3IgIT09ICd1bmRlZmluZWQnID8gby5yb2xsb2ZmRmFjdG9yIDogcGEucm9sbG9mZkZhY3RvcixcbiAgICAgICAgICBwYW5uaW5nTW9kZWw6IHR5cGVvZiBvLnBhbm5pbmdNb2RlbCAhPT0gJ3VuZGVmaW5lZCcgPyBvLnBhbm5pbmdNb2RlbCA6IHBhLnBhbm5pbmdNb2RlbFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgcGFubmVyIHZhbHVlcyBvciBjcmVhdGUgYSBuZXcgcGFubmVyIGlmIG5vbmUgZXhpc3RzLlxuICAgICAgICB2YXIgcGFubmVyID0gc291bmQuX3Bhbm5lcjtcbiAgICAgICAgaWYgKHBhbm5lcikge1xuICAgICAgICAgIHBhbm5lci5jb25lSW5uZXJBbmdsZSA9IHBhLmNvbmVJbm5lckFuZ2xlO1xuICAgICAgICAgIHBhbm5lci5jb25lT3V0ZXJBbmdsZSA9IHBhLmNvbmVPdXRlckFuZ2xlO1xuICAgICAgICAgIHBhbm5lci5jb25lT3V0ZXJHYWluID0gcGEuY29uZU91dGVyR2FpbjtcbiAgICAgICAgICBwYW5uZXIuZGlzdGFuY2VNb2RlbCA9IHBhLmRpc3RhbmNlTW9kZWw7XG4gICAgICAgICAgcGFubmVyLm1heERpc3RhbmNlID0gcGEubWF4RGlzdGFuY2U7XG4gICAgICAgICAgcGFubmVyLnJlZkRpc3RhbmNlID0gcGEucmVmRGlzdGFuY2U7XG4gICAgICAgICAgcGFubmVyLnJvbGxvZmZGYWN0b3IgPSBwYS5yb2xsb2ZmRmFjdG9yO1xuICAgICAgICAgIHBhbm5lci5wYW5uaW5nTW9kZWwgPSBwYS5wYW5uaW5nTW9kZWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgYSBwb3NpdGlvbiB0byBzZXR1cCB0aGUgbm9kZSB3aXRoLlxuICAgICAgICAgIGlmICghc291bmQuX3Bvcykge1xuICAgICAgICAgICAgc291bmQuX3BvcyA9IHNlbGYuX3BvcyB8fCBbMCwgMCwgLTAuNV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHBhbm5lciBub2RlLlxuICAgICAgICAgIHNldHVwUGFubmVyKHNvdW5kLCAnc3BhdGlhbCcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGY7XG4gIH07XG5cbiAgLyoqIFNpbmdsZSBTb3VuZCBNZXRob2RzICoqL1xuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBBZGQgbmV3IHByb3BlcnRpZXMgdG8gdGhlIGNvcmUgU291bmQgaW5pdC5cbiAgICogQHBhcmFtICB7RnVuY3Rpb259IF9zdXBlciBDb3JlIFNvdW5kIGluaXQgbWV0aG9kLlxuICAgKiBAcmV0dXJuIHtTb3VuZH1cbiAgICovXG4gIFNvdW5kLnByb3RvdHlwZS5pbml0ID0gKGZ1bmN0aW9uKF9zdXBlcikge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBwYXJlbnQgPSBzZWxmLl9wYXJlbnQ7XG5cbiAgICAgIC8vIFNldHVwIHVzZXItZGVmaW5lZCBkZWZhdWx0IHByb3BlcnRpZXMuXG4gICAgICBzZWxmLl9vcmllbnRhdGlvbiA9IHBhcmVudC5fb3JpZW50YXRpb247XG4gICAgICBzZWxmLl9zdGVyZW8gPSBwYXJlbnQuX3N0ZXJlbztcbiAgICAgIHNlbGYuX3BvcyA9IHBhcmVudC5fcG9zO1xuICAgICAgc2VsZi5fcGFubmVyQXR0ciA9IHBhcmVudC5fcGFubmVyQXR0cjtcblxuICAgICAgLy8gQ29tcGxldGUgaW5pdGlsaXphdGlvbiB3aXRoIGhvd2xlci5qcyBjb3JlIFNvdW5kJ3MgaW5pdCBmdW5jdGlvbi5cbiAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuXG4gICAgICAvLyBJZiBhIHN0ZXJlbyBvciBwb3NpdGlvbiB3YXMgc3BlY2lmaWVkLCBzZXQgaXQgdXAuXG4gICAgICBpZiAoc2VsZi5fc3RlcmVvKSB7XG4gICAgICAgIHBhcmVudC5zdGVyZW8oc2VsZi5fc3RlcmVvKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZi5fcG9zKSB7XG4gICAgICAgIHBhcmVudC5wb3Moc2VsZi5fcG9zWzBdLCBzZWxmLl9wb3NbMV0sIHNlbGYuX3Bvc1syXSwgc2VsZi5faWQpO1xuICAgICAgfVxuICAgIH07XG4gIH0pKFNvdW5kLnByb3RvdHlwZS5pbml0KTtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIFNvdW5kLnJlc2V0IG1ldGhvZCB0byBjbGVhbiB1cCBwcm9wZXJ0aWVzIGZyb20gdGhlIHNwYXRpYWwgcGx1Z2luLlxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gX3N1cGVyIFNvdW5kIHJlc2V0IG1ldGhvZC5cbiAgICogQHJldHVybiB7U291bmR9XG4gICAqL1xuICBTb3VuZC5wcm90b3R5cGUucmVzZXQgPSAoZnVuY3Rpb24oX3N1cGVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHBhcmVudCA9IHNlbGYuX3BhcmVudDtcblxuICAgICAgLy8gUmVzZXQgYWxsIHNwYXRpYWwgcGx1Z2luIHByb3BlcnRpZXMgb24gdGhpcyBzb3VuZC5cbiAgICAgIHNlbGYuX29yaWVudGF0aW9uID0gcGFyZW50Ll9vcmllbnRhdGlvbjtcbiAgICAgIHNlbGYuX3N0ZXJlbyA9IHBhcmVudC5fc3RlcmVvO1xuICAgICAgc2VsZi5fcG9zID0gcGFyZW50Ll9wb3M7XG4gICAgICBzZWxmLl9wYW5uZXJBdHRyID0gcGFyZW50Ll9wYW5uZXJBdHRyO1xuXG4gICAgICAvLyBJZiBhIHN0ZXJlbyBvciBwb3NpdGlvbiB3YXMgc3BlY2lmaWVkLCBzZXQgaXQgdXAuXG4gICAgICBpZiAoc2VsZi5fc3RlcmVvKSB7XG4gICAgICAgIHBhcmVudC5zdGVyZW8oc2VsZi5fc3RlcmVvKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZi5fcG9zKSB7XG4gICAgICAgIHBhcmVudC5wb3Moc2VsZi5fcG9zWzBdLCBzZWxmLl9wb3NbMV0sIHNlbGYuX3Bvc1syXSwgc2VsZi5faWQpO1xuICAgICAgfSBlbHNlIGlmIChzZWxmLl9wYW5uZXIpIHtcbiAgICAgICAgLy8gRGlzY29ubmVjdCB0aGUgcGFubmVyLlxuICAgICAgICBzZWxmLl9wYW5uZXIuZGlzY29ubmVjdCgwKTtcbiAgICAgICAgc2VsZi5fcGFubmVyID0gdW5kZWZpbmVkO1xuICAgICAgICBwYXJlbnQuX3JlZnJlc2hCdWZmZXIoc2VsZik7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbXBsZXRlIHJlc2V0dGluZyBvZiB0aGUgc291bmQuXG4gICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgfTtcbiAgfSkoU291bmQucHJvdG90eXBlLnJlc2V0KTtcblxuICAvKiogSGVscGVyIE1ldGhvZHMgKiovXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBwYW5uZXIgbm9kZSBhbmQgc2F2ZSBpdCBvbiB0aGUgc291bmQuXG4gICAqIEBwYXJhbSAge1NvdW5kfSBzb3VuZCBTcGVjaWZpYyBzb3VuZCB0byBzZXR1cCBwYW5uaW5nIG9uLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUeXBlIG9mIHBhbm5lciB0byBjcmVhdGU6ICdzdGVyZW8nIG9yICdzcGF0aWFsJy5cbiAgICovXG4gIHZhciBzZXR1cFBhbm5lciA9IGZ1bmN0aW9uKHNvdW5kLCB0eXBlKSB7XG4gICAgdHlwZSA9IHR5cGUgfHwgJ3NwYXRpYWwnO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBuZXcgcGFubmVyIG5vZGUuXG4gICAgaWYgKHR5cGUgPT09ICdzcGF0aWFsJykge1xuICAgICAgc291bmQuX3Bhbm5lciA9IEhvd2xlci5jdHguY3JlYXRlUGFubmVyKCk7XG4gICAgICBzb3VuZC5fcGFubmVyLmNvbmVJbm5lckFuZ2xlID0gc291bmQuX3Bhbm5lckF0dHIuY29uZUlubmVyQW5nbGU7XG4gICAgICBzb3VuZC5fcGFubmVyLmNvbmVPdXRlckFuZ2xlID0gc291bmQuX3Bhbm5lckF0dHIuY29uZU91dGVyQW5nbGU7XG4gICAgICBzb3VuZC5fcGFubmVyLmNvbmVPdXRlckdhaW4gPSBzb3VuZC5fcGFubmVyQXR0ci5jb25lT3V0ZXJHYWluO1xuICAgICAgc291bmQuX3Bhbm5lci5kaXN0YW5jZU1vZGVsID0gc291bmQuX3Bhbm5lckF0dHIuZGlzdGFuY2VNb2RlbDtcbiAgICAgIHNvdW5kLl9wYW5uZXIubWF4RGlzdGFuY2UgPSBzb3VuZC5fcGFubmVyQXR0ci5tYXhEaXN0YW5jZTtcbiAgICAgIHNvdW5kLl9wYW5uZXIucmVmRGlzdGFuY2UgPSBzb3VuZC5fcGFubmVyQXR0ci5yZWZEaXN0YW5jZTtcbiAgICAgIHNvdW5kLl9wYW5uZXIucm9sbG9mZkZhY3RvciA9IHNvdW5kLl9wYW5uZXJBdHRyLnJvbGxvZmZGYWN0b3I7XG4gICAgICBzb3VuZC5fcGFubmVyLnBhbm5pbmdNb2RlbCA9IHNvdW5kLl9wYW5uZXJBdHRyLnBhbm5pbmdNb2RlbDtcblxuICAgICAgaWYgKHR5cGVvZiBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc291bmQuX3Bhbm5lci5wb3NpdGlvblguc2V0VmFsdWVBdFRpbWUoc291bmQuX3Bvc1swXSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgIHNvdW5kLl9wYW5uZXIucG9zaXRpb25ZLnNldFZhbHVlQXRUaW1lKHNvdW5kLl9wb3NbMV0sIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWi5zZXRWYWx1ZUF0VGltZShzb3VuZC5fcG9zWzJdLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvdW5kLl9wYW5uZXIuc2V0UG9zaXRpb24oc291bmQuX3Bvc1swXSwgc291bmQuX3Bvc1sxXSwgc291bmQuX3Bvc1syXSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc291bmQuX3Bhbm5lci5vcmllbnRhdGlvblggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNvdW5kLl9wYW5uZXIub3JpZW50YXRpb25YLnNldFZhbHVlQXRUaW1lKHNvdW5kLl9vcmllbnRhdGlvblswXSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgIHNvdW5kLl9wYW5uZXIub3JpZW50YXRpb25ZLnNldFZhbHVlQXRUaW1lKHNvdW5kLl9vcmllbnRhdGlvblsxXSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgIHNvdW5kLl9wYW5uZXIub3JpZW50YXRpb25aLnNldFZhbHVlQXRUaW1lKHNvdW5kLl9vcmllbnRhdGlvblsyXSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzb3VuZC5fcGFubmVyLnNldE9yaWVudGF0aW9uKHNvdW5kLl9vcmllbnRhdGlvblswXSwgc291bmQuX29yaWVudGF0aW9uWzFdLCBzb3VuZC5fb3JpZW50YXRpb25bMl0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzb3VuZC5fcGFubmVyID0gSG93bGVyLmN0eC5jcmVhdGVTdGVyZW9QYW5uZXIoKTtcbiAgICAgIHNvdW5kLl9wYW5uZXIucGFuLnNldFZhbHVlQXRUaW1lKHNvdW5kLl9zdGVyZW8sIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgIH1cblxuICAgIHNvdW5kLl9wYW5uZXIuY29ubmVjdChzb3VuZC5fbm9kZSk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGNvbm5lY3Rpb25zLlxuICAgIGlmICghc291bmQuX3BhdXNlZCkge1xuICAgICAgc291bmQuX3BhcmVudC5wYXVzZShzb3VuZC5faWQsIHRydWUpLnBsYXkoc291bmQuX2lkLCB0cnVlKTtcbiAgICB9XG4gIH07XG59KSgpO1xuIiwiLyohIGllZWU3NTQuIEJTRC0zLUNsYXVzZSBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbmV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gKGUgKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gKG0gKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAoKHZhbHVlICogYykgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXHJcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXHJcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcblxyXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXHJcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcclxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcclxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cclxuXHJcblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xyXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cblxudmFyIEV2ZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gRXZlbnQodHlwZSwgdGFyZ2V0KSB7XHJcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XHJcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcclxuICAgIH1cclxuICAgIHJldHVybiBFdmVudDtcclxufSgpKTtcclxudmFyIEVycm9yRXZlbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XHJcbiAgICBfX2V4dGVuZHMoRXJyb3JFdmVudCwgX3N1cGVyKTtcclxuICAgIGZ1bmN0aW9uIEVycm9yRXZlbnQoZXJyb3IsIHRhcmdldCkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsICdlcnJvcicsIHRhcmdldCkgfHwgdGhpcztcclxuICAgICAgICBfdGhpcy5tZXNzYWdlID0gZXJyb3IubWVzc2FnZTtcclxuICAgICAgICBfdGhpcy5lcnJvciA9IGVycm9yO1xyXG4gICAgICAgIHJldHVybiBfdGhpcztcclxuICAgIH1cclxuICAgIHJldHVybiBFcnJvckV2ZW50O1xyXG59KEV2ZW50KSk7XHJcbnZhciBDbG9zZUV2ZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xyXG4gICAgX19leHRlbmRzKENsb3NlRXZlbnQsIF9zdXBlcik7XHJcbiAgICBmdW5jdGlvbiBDbG9zZUV2ZW50KGNvZGUsIHJlYXNvbiwgdGFyZ2V0KSB7XHJcbiAgICAgICAgaWYgKGNvZGUgPT09IHZvaWQgMCkgeyBjb2RlID0gMTAwMDsgfVxyXG4gICAgICAgIGlmIChyZWFzb24gPT09IHZvaWQgMCkgeyByZWFzb24gPSAnJzsgfVxyXG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsICdjbG9zZScsIHRhcmdldCkgfHwgdGhpcztcclxuICAgICAgICBfdGhpcy53YXNDbGVhbiA9IHRydWU7XHJcbiAgICAgICAgX3RoaXMuY29kZSA9IGNvZGU7XHJcbiAgICAgICAgX3RoaXMucmVhc29uID0gcmVhc29uO1xyXG4gICAgICAgIHJldHVybiBfdGhpcztcclxuICAgIH1cclxuICAgIHJldHVybiBDbG9zZUV2ZW50O1xyXG59KEV2ZW50KSk7XG5cbi8qIVxyXG4gKiBSZWNvbm5lY3RpbmcgV2ViU29ja2V0XHJcbiAqIGJ5IFBlZHJvIExhZGFyaWEgPHBlZHJvLmxhZGFyaWFAZ21haWwuY29tPlxyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vcGxhZGFyaWEvcmVjb25uZWN0aW5nLXdlYnNvY2tldFxyXG4gKiBMaWNlbnNlIE1JVFxyXG4gKi9cclxudmFyIGdldEdsb2JhbFdlYlNvY2tldCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICh0eXBlb2YgV2ViU29ja2V0ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICByZXR1cm4gV2ViU29ja2V0O1xyXG4gICAgfVxyXG59O1xyXG4vKipcclxuICogUmV0dXJucyB0cnVlIGlmIGdpdmVuIGFyZ3VtZW50IGxvb2tzIGxpa2UgYSBXZWJTb2NrZXQgY2xhc3NcclxuICovXHJcbnZhciBpc1dlYlNvY2tldCA9IGZ1bmN0aW9uICh3KSB7IHJldHVybiB0eXBlb2YgdyAhPT0gJ3VuZGVmaW5lZCcgJiYgISF3ICYmIHcuQ0xPU0lORyA9PT0gMjsgfTtcclxudmFyIERFRkFVTFQgPSB7XHJcbiAgICBtYXhSZWNvbm5lY3Rpb25EZWxheTogMTAwMDAsXHJcbiAgICBtaW5SZWNvbm5lY3Rpb25EZWxheTogMTAwMCArIE1hdGgucmFuZG9tKCkgKiA0MDAwLFxyXG4gICAgbWluVXB0aW1lOiA1MDAwLFxyXG4gICAgcmVjb25uZWN0aW9uRGVsYXlHcm93RmFjdG9yOiAxLjMsXHJcbiAgICBjb25uZWN0aW9uVGltZW91dDogNDAwMCxcclxuICAgIG1heFJldHJpZXM6IEluZmluaXR5LFxyXG4gICAgbWF4RW5xdWV1ZWRNZXNzYWdlczogSW5maW5pdHksXHJcbiAgICBzdGFydENsb3NlZDogZmFsc2UsXHJcbiAgICBkZWJ1ZzogZmFsc2UsXHJcbn07XHJcbnZhciBSZWNvbm5lY3RpbmdXZWJTb2NrZXQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBSZWNvbm5lY3RpbmdXZWJTb2NrZXQodXJsLCBwcm90b2NvbHMsIG9wdGlvbnMpIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XHJcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzID0ge1xyXG4gICAgICAgICAgICBlcnJvcjogW10sXHJcbiAgICAgICAgICAgIG1lc3NhZ2U6IFtdLFxyXG4gICAgICAgICAgICBvcGVuOiBbXSxcclxuICAgICAgICAgICAgY2xvc2U6IFtdLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fcmV0cnlDb3VudCA9IC0xO1xyXG4gICAgICAgIHRoaXMuX3Nob3VsZFJlY29ubmVjdCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fY29ubmVjdExvY2sgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9iaW5hcnlUeXBlID0gJ2Jsb2InO1xyXG4gICAgICAgIHRoaXMuX2Nsb3NlQ2FsbGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZVF1ZXVlID0gW107XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gZXZlbnQgbGlzdGVuZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uJ3MgcmVhZHlTdGF0ZSBjaGFuZ2VzIHRvIENMT1NFRFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub25jbG9zZSA9IG51bGw7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gZXZlbnQgbGlzdGVuZXIgdG8gYmUgY2FsbGVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vbmVycm9yID0gbnVsbDtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBldmVudCBsaXN0ZW5lciB0byBiZSBjYWxsZWQgd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vbm1lc3NhZ2UgPSBudWxsO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGV2ZW50IGxpc3RlbmVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbidzIHJlYWR5U3RhdGUgY2hhbmdlcyB0byBPUEVOO1xyXG4gICAgICAgICAqIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgcmVhZHkgdG8gc2VuZCBhbmQgcmVjZWl2ZSBkYXRhXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vbm9wZW4gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2hhbmRsZU9wZW4gPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgX3RoaXMuX2RlYnVnKCdvcGVuIGV2ZW50Jyk7XHJcbiAgICAgICAgICAgIHZhciBfYSA9IF90aGlzLl9vcHRpb25zLm1pblVwdGltZSwgbWluVXB0aW1lID0gX2EgPT09IHZvaWQgMCA/IERFRkFVTFQubWluVXB0aW1lIDogX2E7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChfdGhpcy5fY29ubmVjdFRpbWVvdXQpO1xyXG4gICAgICAgICAgICBfdGhpcy5fdXB0aW1lVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuX2FjY2VwdE9wZW4oKTsgfSwgbWluVXB0aW1lKTtcclxuICAgICAgICAgICAgX3RoaXMuX3dzLmJpbmFyeVR5cGUgPSBfdGhpcy5fYmluYXJ5VHlwZTtcclxuICAgICAgICAgICAgLy8gc2VuZCBlbnF1ZXVlZCBtZXNzYWdlcyAobWVzc2FnZXMgc2VudCBiZWZvcmUgd2Vic29ja2V0IG9wZW4gZXZlbnQpXHJcbiAgICAgICAgICAgIF90aGlzLl9tZXNzYWdlUXVldWUuZm9yRWFjaChmdW5jdGlvbiAobWVzc2FnZSkgeyByZXR1cm4gX3RoaXMuX3dzLnNlbmQobWVzc2FnZSk7IH0pO1xyXG4gICAgICAgICAgICBfdGhpcy5fbWVzc2FnZVF1ZXVlID0gW107XHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5vbm9wZW4pIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLm9ub3BlbihldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgX3RoaXMuX2xpc3RlbmVycy5vcGVuLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7IHJldHVybiBfdGhpcy5fY2FsbEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTsgfSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9oYW5kbGVNZXNzYWdlID0gZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIF90aGlzLl9kZWJ1ZygnbWVzc2FnZSBldmVudCcpO1xyXG4gICAgICAgICAgICBpZiAoX3RoaXMub25tZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5vbm1lc3NhZ2UoZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF90aGlzLl9saXN0ZW5lcnMubWVzc2FnZS5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikgeyByZXR1cm4gX3RoaXMuX2NhbGxFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7IH0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5faGFuZGxlRXJyb3IgPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgX3RoaXMuX2RlYnVnKCdlcnJvciBldmVudCcsIGV2ZW50Lm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBfdGhpcy5fZGlzY29ubmVjdCh1bmRlZmluZWQsIGV2ZW50Lm1lc3NhZ2UgPT09ICdUSU1FT1VUJyA/ICd0aW1lb3V0JyA6IHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5vbmVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5vbmVycm9yKGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfdGhpcy5fZGVidWcoJ2V4ZWMgZXJyb3IgbGlzdGVuZXJzJyk7XHJcbiAgICAgICAgICAgIF90aGlzLl9saXN0ZW5lcnMuZXJyb3IuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIF90aGlzLl9jYWxsRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpOyB9KTtcclxuICAgICAgICAgICAgX3RoaXMuX2Nvbm5lY3QoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX2hhbmRsZUNsb3NlID0gZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIF90aGlzLl9kZWJ1ZygnY2xvc2UgZXZlbnQnKTtcclxuICAgICAgICAgICAgX3RoaXMuX2NsZWFyVGltZW91dHMoKTtcclxuICAgICAgICAgICAgaWYgKF90aGlzLl9zaG91bGRSZWNvbm5lY3QpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9jb25uZWN0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKF90aGlzLm9uY2xvc2UpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLm9uY2xvc2UoZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF90aGlzLl9saXN0ZW5lcnMuY2xvc2UuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIF90aGlzLl9jYWxsRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpOyB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3VybCA9IHVybDtcclxuICAgICAgICB0aGlzLl9wcm90b2NvbHMgPSBwcm90b2NvbHM7XHJcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuc3RhcnRDbG9zZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2hvdWxkUmVjb25uZWN0ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2Nvbm5lY3QoKTtcclxuICAgIH1cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQsIFwiQ09OTkVDVElOR1wiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldCwgXCJPUEVOXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LCBcIkNMT1NJTkdcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gMjtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQsIFwiQ0xPU0VEXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDM7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZSwgXCJDT05ORUNUSU5HXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlY29ubmVjdGluZ1dlYlNvY2tldC5DT05ORUNUSU5HO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUsIFwiT1BFTlwiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZWNvbm5lY3RpbmdXZWJTb2NrZXQuT1BFTjtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLCBcIkNMT1NJTkdcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVjb25uZWN0aW5nV2ViU29ja2V0LkNMT1NJTkc7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZSwgXCJDTE9TRURcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVjb25uZWN0aW5nV2ViU29ja2V0LkNMT1NFRDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLCBcImJpbmFyeVR5cGVcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd3MgPyB0aGlzLl93cy5iaW5hcnlUeXBlIDogdGhpcy5fYmluYXJ5VHlwZTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2JpbmFyeVR5cGUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3dzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl93cy5iaW5hcnlUeXBlID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLCBcInJldHJ5Q291bnRcIiwge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvciBjb25uZWN0aW9uIHJldHJpZXNcclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuX3JldHJ5Q291bnQsIDApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUsIFwiYnVmZmVyZWRBbW91bnRcIiwge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSB0aGF0IGhhdmUgYmVlbiBxdWV1ZWQgdXNpbmcgY2FsbHMgdG8gc2VuZCgpIGJ1dCBub3QgeWV0XHJcbiAgICAgICAgICogdHJhbnNtaXR0ZWQgdG8gdGhlIG5ldHdvcmsuIFRoaXMgdmFsdWUgcmVzZXRzIHRvIHplcm8gb25jZSBhbGwgcXVldWVkIGRhdGEgaGFzIGJlZW4gc2VudC5cclxuICAgICAgICAgKiBUaGlzIHZhbHVlIGRvZXMgbm90IHJlc2V0IHRvIHplcm8gd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQ7IGlmIHlvdSBrZWVwIGNhbGxpbmcgc2VuZCgpLFxyXG4gICAgICAgICAqIHRoaXMgd2lsbCBjb250aW51ZSB0byBjbGltYi4gUmVhZCBvbmx5XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBieXRlcyA9IHRoaXMuX21lc3NhZ2VRdWV1ZS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgbWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjYyArPSBtZXNzYWdlLmxlbmd0aDsgLy8gbm90IGJ5dGUgc2l6ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWVzc2FnZSBpbnN0YW5jZW9mIEJsb2IpIHtcclxuICAgICAgICAgICAgICAgICAgICBhY2MgKz0gbWVzc2FnZS5zaXplO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWNjICs9IG1lc3NhZ2UuYnl0ZUxlbmd0aDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XHJcbiAgICAgICAgICAgIH0sIDApO1xyXG4gICAgICAgICAgICByZXR1cm4gYnl0ZXMgKyAodGhpcy5fd3MgPyB0aGlzLl93cy5idWZmZXJlZEFtb3VudCA6IDApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUsIFwiZXh0ZW5zaW9uc1wiLCB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGV4dGVuc2lvbnMgc2VsZWN0ZWQgYnkgdGhlIHNlcnZlci4gVGhpcyBpcyBjdXJyZW50bHkgb25seSB0aGUgZW1wdHkgc3RyaW5nIG9yIGEgbGlzdCBvZlxyXG4gICAgICAgICAqIGV4dGVuc2lvbnMgYXMgbmVnb3RpYXRlZCBieSB0aGUgY29ubmVjdGlvblxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd3MgPyB0aGlzLl93cy5leHRlbnNpb25zIDogJyc7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZSwgXCJwcm90b2NvbFwiLCB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgbmFtZSBvZiB0aGUgc3ViLXByb3RvY29sIHRoZSBzZXJ2ZXIgc2VsZWN0ZWQ7XHJcbiAgICAgICAgICogdGhpcyB3aWxsIGJlIG9uZSBvZiB0aGUgc3RyaW5ncyBzcGVjaWZpZWQgaW4gdGhlIHByb3RvY29scyBwYXJhbWV0ZXIgd2hlbiBjcmVhdGluZyB0aGVcclxuICAgICAgICAgKiBXZWJTb2NrZXQgb2JqZWN0XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93cyA/IHRoaXMuX3dzLnByb3RvY29sIDogJyc7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZSwgXCJyZWFkeVN0YXRlXCIsIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgY29ubmVjdGlvbjsgdGhpcyBpcyBvbmUgb2YgdGhlIFJlYWR5IHN0YXRlIGNvbnN0YW50c1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fd3MpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93cy5yZWFkeVN0YXRlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcHRpb25zLnN0YXJ0Q2xvc2VkXHJcbiAgICAgICAgICAgICAgICA/IFJlY29ubmVjdGluZ1dlYlNvY2tldC5DTE9TRURcclxuICAgICAgICAgICAgICAgIDogUmVjb25uZWN0aW5nV2ViU29ja2V0LkNPTk5FQ1RJTkc7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZSwgXCJ1cmxcIiwge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBVUkwgYXMgcmVzb2x2ZWQgYnkgdGhlIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93cyA/IHRoaXMuX3dzLnVybCA6ICcnO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgLyoqXHJcbiAgICAgKiBDbG9zZXMgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIG9yIGNvbm5lY3Rpb24gYXR0ZW1wdCwgaWYgYW55LiBJZiB0aGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5XHJcbiAgICAgKiBDTE9TRUQsIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZ1xyXG4gICAgICovXHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKGNvZGUsIHJlYXNvbikge1xyXG4gICAgICAgIGlmIChjb2RlID09PSB2b2lkIDApIHsgY29kZSA9IDEwMDA7IH1cclxuICAgICAgICB0aGlzLl9jbG9zZUNhbGxlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fc2hvdWxkUmVjb25uZWN0ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fY2xlYXJUaW1lb3V0cygpO1xyXG4gICAgICAgIGlmICghdGhpcy5fd3MpIHtcclxuICAgICAgICAgICAgdGhpcy5fZGVidWcoJ2Nsb3NlIGVucXVldWVkOiBubyB3cyBpbnN0YW5jZScpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl93cy5yZWFkeVN0YXRlID09PSB0aGlzLkNMT1NFRCkge1xyXG4gICAgICAgICAgICB0aGlzLl9kZWJ1ZygnY2xvc2U6IGFscmVhZHkgY2xvc2VkJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fd3MuY2xvc2UoY29kZSwgcmVhc29uKTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIENsb3NlcyB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gb3IgY29ubmVjdGlvbiBhdHRlbXB0IGFuZCBjb25uZWN0cyBhZ2Fpbi5cclxuICAgICAqIFJlc2V0cyByZXRyeSBjb3VudGVyO1xyXG4gICAgICovXHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLnJlY29ubmVjdCA9IGZ1bmN0aW9uIChjb2RlLCByZWFzb24pIHtcclxuICAgICAgICB0aGlzLl9zaG91bGRSZWNvbm5lY3QgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2Nsb3NlQ2FsbGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fcmV0cnlDb3VudCA9IC0xO1xyXG4gICAgICAgIGlmICghdGhpcy5fd3MgfHwgdGhpcy5fd3MucmVhZHlTdGF0ZSA9PT0gdGhpcy5DTE9TRUQpIHtcclxuICAgICAgICAgICAgdGhpcy5fY29ubmVjdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZGlzY29ubmVjdChjb2RlLCByZWFzb24pO1xyXG4gICAgICAgICAgICB0aGlzLl9jb25uZWN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogRW5xdWV1ZSBzcGVjaWZpZWQgZGF0YSB0byBiZSB0cmFuc21pdHRlZCB0byB0aGUgc2VydmVyIG92ZXIgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uXHJcbiAgICAgKi9cclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3dzICYmIHRoaXMuX3dzLnJlYWR5U3RhdGUgPT09IHRoaXMuT1BFTikge1xyXG4gICAgICAgICAgICB0aGlzLl9kZWJ1Zygnc2VuZCcsIGRhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLl93cy5zZW5kKGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIF9hID0gdGhpcy5fb3B0aW9ucy5tYXhFbnF1ZXVlZE1lc3NhZ2VzLCBtYXhFbnF1ZXVlZE1lc3NhZ2VzID0gX2EgPT09IHZvaWQgMCA/IERFRkFVTFQubWF4RW5xdWV1ZWRNZXNzYWdlcyA6IF9hO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fbWVzc2FnZVF1ZXVlLmxlbmd0aCA8IG1heEVucXVldWVkTWVzc2FnZXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKCdlbnF1ZXVlJywgZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tZXNzYWdlUXVldWUucHVzaChkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIGFuIGV2ZW50IGhhbmRsZXIgb2YgYSBzcGVjaWZpYyBldmVudCB0eXBlXHJcbiAgICAgKi9cclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uICh0eXBlLCBsaXN0ZW5lcikge1xyXG4gICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnNbdHlwZV0pIHtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnNbdHlwZV0ucHVzaChsaXN0ZW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgIHZhciBlXzEsIF9hO1xyXG4gICAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnNbZXZlbnQudHlwZV07XHJcbiAgICAgICAgaWYgKGxpc3RlbmVycykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbGlzdGVuZXJzXzEgPSBfX3ZhbHVlcyhsaXN0ZW5lcnMpLCBsaXN0ZW5lcnNfMV8xID0gbGlzdGVuZXJzXzEubmV4dCgpOyAhbGlzdGVuZXJzXzFfMS5kb25lOyBsaXN0ZW5lcnNfMV8xID0gbGlzdGVuZXJzXzEubmV4dCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzXzFfMS52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWxsRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XHJcbiAgICAgICAgICAgIGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXJzXzFfMSAmJiAhbGlzdGVuZXJzXzFfMS5kb25lICYmIChfYSA9IGxpc3RlbmVyc18xLnJldHVybikpIF9hLmNhbGwobGlzdGVuZXJzXzEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lclxyXG4gICAgICovXHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAodHlwZSwgbGlzdGVuZXIpIHtcclxuICAgICAgICBpZiAodGhpcy5fbGlzdGVuZXJzW3R5cGVdKSB7XHJcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzW3R5cGVdID0gdGhpcy5fbGlzdGVuZXJzW3R5cGVdLmZpbHRlcihmdW5jdGlvbiAobCkgeyByZXR1cm4gbCAhPT0gbGlzdGVuZXI7IH0pO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl9kZWJ1ZyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgYXJncyA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuZGVidWcpIHtcclxuICAgICAgICAgICAgLy8gbm90IHVzaW5nIHNwcmVhZCBiZWNhdXNlIGNvbXBpbGVkIHZlcnNpb24gdXNlcyBTeW1ib2xzXHJcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZy5hcHBseShjb25zb2xlLCBfX3NwcmVhZChbJ1JXUz4nXSwgYXJncykpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl9nZXROZXh0RGVsYXkgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIF9hID0gdGhpcy5fb3B0aW9ucywgX2IgPSBfYS5yZWNvbm5lY3Rpb25EZWxheUdyb3dGYWN0b3IsIHJlY29ubmVjdGlvbkRlbGF5R3Jvd0ZhY3RvciA9IF9iID09PSB2b2lkIDAgPyBERUZBVUxULnJlY29ubmVjdGlvbkRlbGF5R3Jvd0ZhY3RvciA6IF9iLCBfYyA9IF9hLm1pblJlY29ubmVjdGlvbkRlbGF5LCBtaW5SZWNvbm5lY3Rpb25EZWxheSA9IF9jID09PSB2b2lkIDAgPyBERUZBVUxULm1pblJlY29ubmVjdGlvbkRlbGF5IDogX2MsIF9kID0gX2EubWF4UmVjb25uZWN0aW9uRGVsYXksIG1heFJlY29ubmVjdGlvbkRlbGF5ID0gX2QgPT09IHZvaWQgMCA/IERFRkFVTFQubWF4UmVjb25uZWN0aW9uRGVsYXkgOiBfZDtcclxuICAgICAgICB2YXIgZGVsYXkgPSAwO1xyXG4gICAgICAgIGlmICh0aGlzLl9yZXRyeUNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICBkZWxheSA9XHJcbiAgICAgICAgICAgICAgICBtaW5SZWNvbm5lY3Rpb25EZWxheSAqIE1hdGgucG93KHJlY29ubmVjdGlvbkRlbGF5R3Jvd0ZhY3RvciwgdGhpcy5fcmV0cnlDb3VudCAtIDEpO1xyXG4gICAgICAgICAgICBpZiAoZGVsYXkgPiBtYXhSZWNvbm5lY3Rpb25EZWxheSkge1xyXG4gICAgICAgICAgICAgICAgZGVsYXkgPSBtYXhSZWNvbm5lY3Rpb25EZWxheTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9kZWJ1ZygnbmV4dCBkZWxheScsIGRlbGF5KTtcclxuICAgICAgICByZXR1cm4gZGVsYXk7XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5fd2FpdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIF90aGlzLl9nZXROZXh0RGVsYXkoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5fZ2V0TmV4dFVybCA9IGZ1bmN0aW9uICh1cmxQcm92aWRlcikge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdXJsUHJvdmlkZXIgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodXJsUHJvdmlkZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIHVybFByb3ZpZGVyID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHZhciB1cmwgPSB1cmxQcm92aWRlcigpO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodXJsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoISF1cmwudGhlbikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVybDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBVUkwnKTtcclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl9jb25uZWN0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgaWYgKHRoaXMuX2Nvbm5lY3RMb2NrIHx8ICF0aGlzLl9zaG91bGRSZWNvbm5lY3QpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jb25uZWN0TG9jayA9IHRydWU7XHJcbiAgICAgICAgdmFyIF9hID0gdGhpcy5fb3B0aW9ucywgX2IgPSBfYS5tYXhSZXRyaWVzLCBtYXhSZXRyaWVzID0gX2IgPT09IHZvaWQgMCA/IERFRkFVTFQubWF4UmV0cmllcyA6IF9iLCBfYyA9IF9hLmNvbm5lY3Rpb25UaW1lb3V0LCBjb25uZWN0aW9uVGltZW91dCA9IF9jID09PSB2b2lkIDAgPyBERUZBVUxULmNvbm5lY3Rpb25UaW1lb3V0IDogX2MsIF9kID0gX2EuV2ViU29ja2V0LCBXZWJTb2NrZXQgPSBfZCA9PT0gdm9pZCAwID8gZ2V0R2xvYmFsV2ViU29ja2V0KCkgOiBfZDtcclxuICAgICAgICBpZiAodGhpcy5fcmV0cnlDb3VudCA+PSBtYXhSZXRyaWVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKCdtYXggcmV0cmllcyByZWFjaGVkJywgdGhpcy5fcmV0cnlDb3VudCwgJz49JywgbWF4UmV0cmllcyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fcmV0cnlDb3VudCsrO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnKCdjb25uZWN0JywgdGhpcy5fcmV0cnlDb3VudCk7XHJcbiAgICAgICAgdGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCk7XHJcbiAgICAgICAgaWYgKCFpc1dlYlNvY2tldChXZWJTb2NrZXQpKSB7XHJcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdObyB2YWxpZCBXZWJTb2NrZXQgY2xhc3MgcHJvdmlkZWQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fd2FpdCgpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLl9nZXROZXh0VXJsKF90aGlzLl91cmwpOyB9KVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAodXJsKSB7XHJcbiAgICAgICAgICAgIC8vIGNsb3NlIGNvdWxkIGJlIGNhbGxlZCBiZWZvcmUgY3JlYXRpbmcgdGhlIHdzXHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5fY2xvc2VDYWxsZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfdGhpcy5fZGVidWcoJ2Nvbm5lY3QnLCB7IHVybDogdXJsLCBwcm90b2NvbHM6IF90aGlzLl9wcm90b2NvbHMgfSk7XHJcbiAgICAgICAgICAgIF90aGlzLl93cyA9IF90aGlzLl9wcm90b2NvbHNcclxuICAgICAgICAgICAgICAgID8gbmV3IFdlYlNvY2tldCh1cmwsIF90aGlzLl9wcm90b2NvbHMpXHJcbiAgICAgICAgICAgICAgICA6IG5ldyBXZWJTb2NrZXQodXJsKTtcclxuICAgICAgICAgICAgX3RoaXMuX3dzLmJpbmFyeVR5cGUgPSBfdGhpcy5fYmluYXJ5VHlwZTtcclxuICAgICAgICAgICAgX3RoaXMuX2Nvbm5lY3RMb2NrID0gZmFsc2U7XHJcbiAgICAgICAgICAgIF90aGlzLl9hZGRMaXN0ZW5lcnMoKTtcclxuICAgICAgICAgICAgX3RoaXMuX2Nvbm5lY3RUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5faGFuZGxlVGltZW91dCgpOyB9LCBjb25uZWN0aW9uVGltZW91dCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5faGFuZGxlVGltZW91dCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLl9kZWJ1ZygndGltZW91dCBldmVudCcpO1xyXG4gICAgICAgIHRoaXMuX2hhbmRsZUVycm9yKG5ldyBFcnJvckV2ZW50KEVycm9yKCdUSU1FT1VUJyksIHRoaXMpKTtcclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl9kaXNjb25uZWN0ID0gZnVuY3Rpb24gKGNvZGUsIHJlYXNvbikge1xyXG4gICAgICAgIGlmIChjb2RlID09PSB2b2lkIDApIHsgY29kZSA9IDEwMDA7IH1cclxuICAgICAgICB0aGlzLl9jbGVhclRpbWVvdXRzKCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLl93cykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dzLmNsb3NlKGNvZGUsIHJlYXNvbik7XHJcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZUNsb3NlKG5ldyBDbG9zZUV2ZW50KGNvZGUsIHJlYXNvbiwgdGhpcykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuX2FjY2VwdE9wZW4gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5fZGVidWcoJ2FjY2VwdCBvcGVuJyk7XHJcbiAgICAgICAgdGhpcy5fcmV0cnlDb3VudCA9IDA7XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5fY2FsbEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQsIGxpc3RlbmVyKSB7XHJcbiAgICAgICAgaWYgKCdoYW5kbGVFdmVudCcgaW4gbGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVFdmVudChldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgIGxpc3RlbmVyKGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5fcmVtb3ZlTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fd3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9kZWJ1ZygncmVtb3ZlTGlzdGVuZXJzJyk7XHJcbiAgICAgICAgdGhpcy5fd3MucmVtb3ZlRXZlbnRMaXN0ZW5lcignb3BlbicsIHRoaXMuX2hhbmRsZU9wZW4pO1xyXG4gICAgICAgIHRoaXMuX3dzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgdGhpcy5faGFuZGxlQ2xvc2UpO1xyXG4gICAgICAgIHRoaXMuX3dzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9oYW5kbGVNZXNzYWdlKTtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgdGhpcy5fd3MucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCB0aGlzLl9oYW5kbGVFcnJvcik7XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5fYWRkTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fd3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9kZWJ1ZygnYWRkTGlzdGVuZXJzJyk7XHJcbiAgICAgICAgdGhpcy5fd3MuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsIHRoaXMuX2hhbmRsZU9wZW4pO1xyXG4gICAgICAgIHRoaXMuX3dzLmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgdGhpcy5faGFuZGxlQ2xvc2UpO1xyXG4gICAgICAgIHRoaXMuX3dzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9oYW5kbGVNZXNzYWdlKTtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgdGhpcy5fd3MuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCB0aGlzLl9oYW5kbGVFcnJvcik7XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5fY2xlYXJUaW1lb3V0cyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fY29ubmVjdFRpbWVvdXQpO1xyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl91cHRpbWVUaW1lb3V0KTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gUmVjb25uZWN0aW5nV2ViU29ja2V0O1xyXG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlY29ubmVjdGluZ1dlYlNvY2tldDtcbiJdfQ==
7293
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJkaXN0L0F1ZGlvUGxheWVyLmpzIiwiZGlzdC9Db2dzQ29ubmVjdGlvbi5qcyIsImRpc3QvUnRzcFN0cmVhbWVyLmpzIiwiZGlzdC9WaWRlb1BsYXllci5qcyIsImRpc3QvaGVscGVycy91cmxzLmpzIiwiZGlzdC9pbmRleC5qcyIsImRpc3QvdHlwZXMvQXVkaW9TdGF0ZS5qcyIsImRpc3QvdHlwZXMvVmlkZW9TdGF0ZS5qcyIsImRpc3QvdHlwZXMvdmFsdWVUeXBlcy5qcyIsIm5vZGVfbW9kdWxlcy9AY2xvY2t3b3JrZG9nL21lZGlhLXN0cmVhbS1saWJyYXJ5LWJyb3dzZXIvZGlzdC9pbmRleC5janMuanMiLCJub2RlX21vZHVsZXMvYmFzZTY0LWpzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9ob3dsZXIvZGlzdC9ob3dsZXIuanMiLCJub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvcmVjb25uZWN0aW5nLXdlYnNvY2tldC9kaXN0L3JlY29ubmVjdGluZy13ZWJzb2NrZXQtY2pzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaE5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeFlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN0SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNqdkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDenBHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBob3dsZXJfMSA9IHJlcXVpcmUoXCJob3dsZXJcIik7XG5jb25zdCB1cmxzXzEgPSByZXF1aXJlKFwiLi9oZWxwZXJzL3VybHNcIik7XG5jb25zdCBERUJVRyA9IHRydWU7XG4vLyBDaGVjayBhbiBpT1Mtb25seSBwcm9wZXJ0eSAoU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9OYXZpZ2F0b3Ijbm9uLXN0YW5kYXJkX3Byb3BlcnRpZXMpXG5jb25zdCBJU19JT1MgPSB0eXBlb2YgbmF2aWdhdG9yLnN0YW5kYWxvbmUgIT09ICd1bmRlZmluZWQnO1xuY2xhc3MgQXVkaW9QbGF5ZXIge1xuICAgIGNvbnN0cnVjdG9yKGNvZ3NDb25uZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuZXZlbnRUYXJnZXQgPSBuZXcgRXZlbnRUYXJnZXQoKTtcbiAgICAgICAgdGhpcy5nbG9iYWxWb2x1bWUgPSAxO1xuICAgICAgICB0aGlzLmF1ZGlvQ2xpcFBsYXllcnMgPSB7fTtcbiAgICAgICAgdGhpcy5zaW5rSWQgPSAnJztcbiAgICAgICAgLy8gU2VuZCB0aGUgY3VycmVudCBzdGF0dXMgb2YgZWFjaCBjbGlwIHRvIENPR1NcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdhdWRpb0NsaXBTdGF0ZScsICh7IGRldGFpbCB9KSA9PiB7XG4gICAgICAgICAgICBjb2dzQ29ubmVjdGlvbi5zZW5kTWVkaWFDbGlwU3RhdGUoZGV0YWlsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIExpc3RlbiBmb3IgYXVkaW8gY29udHJvbCBtZXNzYWdlc1xuICAgICAgICBjb2dzQ29ubmVjdGlvbi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXZlbnQuZGV0YWlsO1xuICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdtZWRpYV9jb25maWdfdXBkYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2xvYmFsVm9sdW1lICE9PSBtZXNzYWdlLmdsb2JhbFZvbHVtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRHbG9iYWxWb2x1bWUobWVzc2FnZS5nbG9iYWxWb2x1bWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmF1ZGlvT3V0cHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpbmtJZCA9IGNvZ3NDb25uZWN0aW9uLmdldEF1ZGlvU2lua0lkKG1lc3NhZ2UuYXVkaW9PdXRwdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdWRpb1Npbmsoc2lua0lkICE9PSBudWxsICYmIHNpbmtJZCAhPT0gdm9pZCAwID8gc2lua0lkIDogJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ29uZmlnKG1lc3NhZ2UuZmlsZXMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdhdWRpb19wbGF5JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5QXVkaW9DbGlwKG1lc3NhZ2UuZmlsZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGxheUlkOiBtZXNzYWdlLnBsYXlJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZTogbWVzc2FnZS52b2x1bWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wOiBCb29sZWFuKG1lc3NhZ2UubG9vcCksXG4gICAgICAgICAgICAgICAgICAgICAgICBmYWRlOiBtZXNzYWdlLmZhZGUsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdhdWRpb19wYXVzZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGF1c2VBdWRpb0NsaXAobWVzc2FnZS5maWxlLCB7IGZhZGU6IG1lc3NhZ2UuZmFkZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnYXVkaW9fc3RvcCc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcEF1ZGlvQ2xpcChtZXNzYWdlLmZpbGUsIHsgZmFkZTogbWVzc2FnZS5mYWRlIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wQWxsQXVkaW9DbGlwcyh7IGZhZGU6IG1lc3NhZ2UuZmFkZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdhdWRpb19zZXRfY2xpcF92b2x1bWUnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF1ZGlvQ2xpcFZvbHVtZShtZXNzYWdlLmZpbGUsIHsgdm9sdW1lOiBtZXNzYWdlLnZvbHVtZSwgZmFkZTogbWVzc2FnZS5mYWRlIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIE9uIGNvbm5lY3Rpb24sIHNlbmQgdGhlIGN1cnJlbnQgcGxheWluZyBzdGF0ZSBvZiBhbGwgY2xpcHNcbiAgICAgICAgLy8gKFVzdWFsbHkgZW1wdHkgdW5sZXNzIHdlYnNvY2tldCBpcyByZWNvbm5lY3RpbmcpXG4gICAgICAgIGNvbnN0IHNlbmRJbml0aWFsQ2xpcFN0YXRlcyA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gT2JqZWN0LmVudHJpZXModGhpcy5hdWRpb0NsaXBQbGF5ZXJzKS5tYXAoKFtmaWxlLCBwbGF5ZXJdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlQ2xpcHMgPSBPYmplY3QudmFsdWVzKHBsYXllci5hY3RpdmVDbGlwcyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gYWN0aXZlQ2xpcHMuc29tZSgoeyBzdGF0ZSB9KSA9PiBzdGF0ZS50eXBlID09PSAncGxheWluZycgfHxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUudHlwZSA9PT0gJ3BhdXNpbmcnIHx8XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnR5cGUgPT09ICdzdG9wcGluZycgfHxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUudHlwZSA9PT0gJ3BsYXlfcmVxdWVzdGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS50eXBlID09PSAncGF1c2VfcmVxdWVzdGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS50eXBlID09PSAnc3RvcF9yZXF1ZXN0ZWQnKVxuICAgICAgICAgICAgICAgICAgICA/ICdwbGF5aW5nJ1xuICAgICAgICAgICAgICAgICAgICA6IGFjdGl2ZUNsaXBzLnNvbWUoKHsgc3RhdGUgfSkgPT4gc3RhdGUudHlwZSA9PT0gJ3BhdXNlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdwYXVzZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICdzdG9wcGVkJztcbiAgICAgICAgICAgICAgICByZXR1cm4gW2ZpbGUsIHN0YXR1c107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvZ3NDb25uZWN0aW9uLnNlbmRJbml0aWFsTWVkaWFDbGlwU3RhdGVzKHsgbWVkaWFUeXBlOiAnYXVkaW8nLCBmaWxlcyB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29nc0Nvbm5lY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsIHNlbmRJbml0aWFsQ2xpcFN0YXRlcyk7XG4gICAgICAgIHNlbmRJbml0aWFsQ2xpcFN0YXRlcygpO1xuICAgIH1cbiAgICBzZXRHbG9iYWxWb2x1bWUodm9sdW1lKSB7XG4gICAgICAgIHRoaXMuZ2xvYmFsVm9sdW1lID0gdm9sdW1lO1xuICAgICAgICBob3dsZXJfMS5Ib3dsZXIudm9sdW1lKHZvbHVtZSk7XG4gICAgICAgIHRoaXMubm90aWZ5U3RhdGVMaXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgcGxheUF1ZGlvQ2xpcChwYXRoLCB7IHBsYXlJZCwgdm9sdW1lLCBmYWRlLCBsb29wIH0pIHtcbiAgICAgICAgbG9nKCdQbGF5aW5nIGNsaXAnLCB7IHBhdGggfSk7XG4gICAgICAgIGlmICghKHBhdGggaW4gdGhpcy5hdWRpb0NsaXBQbGF5ZXJzKSkge1xuICAgICAgICAgICAgbG9nKCdDcmVhdGluZyBlcGhlbWVyYWwgY2xpcCcsIHsgcGF0aCB9KTtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9DbGlwUGxheWVyc1twYXRoXSA9IHRoaXMuY3JlYXRlQ2xpcChwYXRoLCB7IHByZWxvYWQ6IGZhbHNlLCBlcGhlbWVyYWw6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVBdWRpb0NsaXBQbGF5ZXIocGF0aCwgKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgIC8vIFBhdXNlZCBjbGlwcyBuZWVkIHRvIGJlIHBsYXllZCBhZ2FpblxuICAgICAgICAgICAgY29uc3QgcGF1c2VkU291bmRJZHMgPSBPYmplY3QuZW50cmllcyhjbGlwUGxheWVyLmFjdGl2ZUNsaXBzKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKFssIHsgc3RhdGUgfV0pID0+IHN0YXRlLnR5cGUgPT09ICdwYXVzZWQnIHx8IHN0YXRlLnR5cGUgPT09ICdwYXVzaW5nJylcbiAgICAgICAgICAgICAgICAubWFwKChbaWRdKSA9PiBwYXJzZUludChpZCkpO1xuICAgICAgICAgICAgcGF1c2VkU291bmRJZHMuZm9yRWFjaCgoc291bmRJZCkgPT4ge1xuICAgICAgICAgICAgICAgIGxvZygnUmVzdW1pbmcgcGF1c2VkIGNsaXAnLCB7IHNvdW5kSWQgfSk7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIucGxheShzb3VuZElkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gQ2xpcHMgd2l0aCBwYXVzZSByZXF1ZXN0ZWQgbm8gbG9uZ2VyIG5lZWQgdG8gcGF1c2UsIHRoZXkgY2FuIGNvbnRpbnVlIHBsYXlpbmcgbm93XG4gICAgICAgICAgICBjb25zdCBwYXVzZVJlcXVlc3RlZFNvdW5kSWRzID0gT2JqZWN0LmVudHJpZXMoY2xpcFBsYXllci5hY3RpdmVDbGlwcylcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChbLCB7IHN0YXRlIH1dKSA9PiBzdGF0ZS50eXBlID09PSAncGF1c2VfcmVxdWVzdGVkJylcbiAgICAgICAgICAgICAgICAubWFwKChbaWRdKSA9PiBwYXJzZUludChpZCkpO1xuICAgICAgICAgICAgLy8gSWYgbm8gY3VycmVudGx5IHBhdXNlZC9wYXVzaW5nL3BhdXNlX3JlcXVlc3RlZCBjbGlwcywgcGxheSBhIG5ldyBjbGlwXG4gICAgICAgICAgICBjb25zdCBuZXdTb3VuZElkcyA9IHBhdXNlZFNvdW5kSWRzLmxlbmd0aCA+IDAgfHwgcGF1c2VSZXF1ZXN0ZWRTb3VuZElkcy5sZW5ndGggPiAwID8gW10gOiBbY2xpcFBsYXllci5wbGF5ZXIucGxheSgpXTtcbiAgICAgICAgICAgIC8vIHBhdXNlZCBhbmQgcGF1c2VfcmVxdWVzdGVkIGNsaXBzIHRyZWF0ZWQgdGhlIHNhbWUsIHRoZXkgc2hvdWxkIGhhdmUgdGhlaXIgcHJvcGVydGllc1xuICAgICAgICAgICAgLy8gdXBkYXRlZCB3aXRoIHRoZSBsYXRlc3QgcGxheSBhY3Rpb24ncyBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBbLi4ucGF1c2VkU291bmRJZHMsIC4uLnBhdXNlUmVxdWVzdGVkU291bmRJZHMsIC4uLm5ld1NvdW5kSWRzXS5mb3JFYWNoKChzb3VuZElkKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIubG9vcChsb29wLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAvLyBDbGVhbnVwIGFueSBvbGQgY2FsbGJhY2tzIGZpcnN0XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub2ZmKCdwbGF5JywgdW5kZWZpbmVkLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vZmYoJ3BhdXNlJywgdW5kZWZpbmVkLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vZmYoJ2ZhZGUnLCB1bmRlZmluZWQsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm9mZignZW5kJywgdW5kZWZpbmVkLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vZmYoJ3N0b3AnLCB1bmRlZmluZWQsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIC8vIE5vbi1wcmVsb2FkZWQgY2xpcHMgZG9uJ3QgeWV0IGhhdmUgYW4gSFRNTCBhdWRpbyBub2RlXG4gICAgICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBzZXQgdGhlIGF1ZGlvIG91dHB1dCB3aGVuIGl0J3MgcGxheWluZ1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm9uY2UoJ3BsYXknLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNldFBsYXllclNpbmtJZChjbGlwUGxheWVyLnBsYXllciwgdGhpcy5zaW5rSWQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm9uY2UoJ3N0b3AnLCAoKSA9PiB0aGlzLmhhbmRsZVN0b3BwZWRDbGlwKHBhdGgsIHBsYXlJZCwgc291bmRJZCksIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIC8vIExvb3BpbmcgY2xpcHMgZmlyZSB0aGUgJ2VuZCcgY2FsbGJhY2sgb24gZXZlcnkgbG9vcFxuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoKF9hID0gY2xpcFBsYXllci5hY3RpdmVDbGlwc1tzb3VuZElkXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxvb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVN0b3BwZWRDbGlwKHBhdGgsIHBsYXlJZCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVDbGlwID0ge1xuICAgICAgICAgICAgICAgICAgICBwbGF5SWQsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiB7IHR5cGU6ICdwbGF5X3JlcXVlc3RlZCcgfSxcbiAgICAgICAgICAgICAgICAgICAgbG9vcCxcbiAgICAgICAgICAgICAgICAgICAgdm9sdW1lLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gT25jZSBjbGlwIHN0YXJ0cywgY2hlY2sgaWYgaXQgc2hvdWxkIGFjdHVhbGx5IGJlIHBhdXNlZCBvciBzdG9wcGVkXG4gICAgICAgICAgICAgICAgLy8gSWYgbm90LCB0aGVuIHVwZGF0ZSBzdGF0ZSB0byAncGxheWluZydcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vbmNlKCdwbGF5JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsaXBTdGF0ZSA9IChfYSA9IGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHNbc291bmRJZF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChjbGlwU3RhdGUgPT09IG51bGwgfHwgY2xpcFN0YXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjbGlwU3RhdGUudHlwZSkgPT09ICdwYXVzZV9yZXF1ZXN0ZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ0NsaXAgc3RhcnRlZCBwbGF5aW5nIGJ1dCBzaG91bGQgYmUgcGF1c2VkJywgeyBwYXRoLCBzb3VuZElkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXVzZUF1ZGlvQ2xpcChwYXRoLCB7IGZhZGU6IGNsaXBTdGF0ZS5mYWRlIH0sIHNvdW5kSWQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChjbGlwU3RhdGUgPT09IG51bGwgfHwgY2xpcFN0YXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjbGlwU3RhdGUudHlwZSkgPT09ICdzdG9wX3JlcXVlc3RlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnQ2xpcCBzdGFydGVkIHBsYXlpbmcgYnV0IHNob3VsZCBiZSBzdG9wcGVkJywgeyBwYXRoLCBzb3VuZElkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wQXVkaW9DbGlwKHBhdGgsIHsgZmFkZTogY2xpcFN0YXRlLmZhZGUgfSwgc291bmRJZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUF1ZGlvQ2xpcChwYXRoLCBzb3VuZElkLCAoY2xpcCkgPT4gKHsgLi4uY2xpcCwgc3RhdGU6IHsgdHlwZTogJ3BsYXlpbmcnIH0gfSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgLy8gVG8gZmFkZSBvciB0byBubyBmYWRlP1xuICAgICAgICAgICAgICAgIGlmIChpc0ZhZGVWYWxpZChmYWRlKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBmYWRlIHdoZW4gY2xpcCBzdGFydHNcbiAgICAgICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIudm9sdW1lKDAsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5tdXRlKGZhbHNlLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub25jZSgncGxheScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhZGVBdWRpb1BsYXllclZvbHVtZShjbGlwUGxheWVyLnBsYXllciwgdm9sdW1lLCBmYWRlICogMTAwMCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0QXVkaW9QbGF5ZXJWb2x1bWUoY2xpcFBsYXllci5wbGF5ZXIsIHZvbHVtZSwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRyYWNrIG5ldy91cGRhdGVkIGFjdGl2ZSBjbGlwXG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5hY3RpdmVDbGlwcyA9IHsgLi4uY2xpcFBsYXllci5hY3RpdmVDbGlwcywgW3NvdW5kSWRdOiBhY3RpdmVDbGlwIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVyO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnMocGxheUlkLCBwYXRoLCAncGxheWluZycpO1xuICAgIH1cbiAgICBwYXVzZUF1ZGlvQ2xpcChwYXRoLCB7IGZhZGUgfSwgb25seVNvdW5kSWQsIGFsbG93SWZQYXVzZVJlcXVlc3RlZCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAvLyBObyBhY3RpdmUgY2xpcHMgdG8gcGF1c2VcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKChfYiA9IChfYSA9IHRoaXMuYXVkaW9DbGlwUGxheWVyc1twYXRoXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFjdGl2ZUNsaXBzKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB7fSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVBdWRpb0NsaXBQbGF5ZXIocGF0aCwgKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgIGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoY2xpcFBsYXllci5hY3RpdmVDbGlwcykubWFwKChbc291bmRJZFN0ciwgY2xpcF0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VuZElkID0gcGFyc2VJbnQoc291bmRJZFN0cik7XG4gICAgICAgICAgICAgICAgLy8gSWYgb25seVNvdW5kSWQgc3BlY2lmaWVkLCBvbmx5IHVwZGF0ZSB0aGF0IGNsaXBcbiAgICAgICAgICAgICAgICBpZiAob25seVNvdW5kSWQgPT09IHVuZGVmaW5lZCB8fCBvbmx5U291bmRJZCA9PT0gc291bmRJZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGFsbG93SWZQYXVzZVJlcXVlc3RlZCAmJiBjbGlwLnN0YXRlLnR5cGUgPT09ICdwYXVzZV9yZXF1ZXN0ZWQnKSB8fCBjbGlwLnN0YXRlLnR5cGUgPT09ICdwbGF5aW5nJyB8fCBjbGlwLnN0YXRlLnR5cGUgPT09ICdwYXVzaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmFkZVZhbGlkKGZhZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFkZSB0aGVuIHBhdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub25jZSgnZmFkZScsIChzb3VuZElkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLnBhdXNlKHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUF1ZGlvQ2xpcChwYXRoLCBzb3VuZElkLCAoY2xpcCkgPT4gKHsgLi4uY2xpcCwgc3RhdGU6IHsgdHlwZTogJ3BhdXNlZCcgfSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2xpcFN0YXRlTGlzdGVuZXJzKGNsaXAucGxheUlkLCBwYXRoLCAncGF1c2VkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFkZUF1ZGlvUGxheWVyVm9sdW1lKGNsaXBQbGF5ZXIucGxheWVyLCAwLCBmYWRlICogMTAwMCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcC5zdGF0ZSA9IHsgdHlwZTogJ3BhdXNpbmcnIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXVzZSBub3dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5wYXVzZShzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwLnN0YXRlID0geyB0eXBlOiAncGF1c2VkJyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2xpcFN0YXRlTGlzdGVuZXJzKGNsaXAucGxheUlkLCBwYXRoLCAncGF1c2VkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xpcCBoYXNuJ3Qgc3RhcnRlZCBwbGF5aW5nIHlldCwgb3IgaGFzIGFscmVhZHkgaGFkIHBhdXNlX3JlcXVlc3RlZCAoYnV0IGZhZGUgbWF5IGhhdmUgY2hhbmdlZCBzbyB1cGRhdGUgaGVyZSlcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2xpcC5zdGF0ZS50eXBlID09PSAncGxheV9yZXF1ZXN0ZWQnIHx8IGNsaXAuc3RhdGUudHlwZSA9PT0gJ3BhdXNlX3JlcXVlc3RlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAuc3RhdGUgPSB7IHR5cGU6ICdwYXVzZV9yZXF1ZXN0ZWQnLCBmYWRlIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtzb3VuZElkU3RyLCBjbGlwXTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVyO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RvcEF1ZGlvQ2xpcChwYXRoLCB7IGZhZGUgfSwgb25seVNvdW5kSWQsIGFsbG93SWZTdG9wUmVxdWVzdGVkKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIC8vIE5vIGFjdGl2ZSBjbGlwcyB0byBzdG9wXG4gICAgICAgIGlmIChPYmplY3Qua2V5cygoX2IgPSAoX2EgPSB0aGlzLmF1ZGlvQ2xpcFBsYXllcnNbcGF0aF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hY3RpdmVDbGlwcykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDoge30pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlQXVkaW9DbGlwUGxheWVyKHBhdGgsIChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICBjbGlwUGxheWVyLmFjdGl2ZUNsaXBzID0gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHMpLm1hcCgoW3NvdW5kSWRTdHIsIGNsaXBdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291bmRJZCA9IHBhcnNlSW50KHNvdW5kSWRTdHIpO1xuICAgICAgICAgICAgICAgIC8vIElmIG9ubHlTb3VuZElkIHNwZWNpZmllZCwgb25seSB1cGRhdGUgdGhhdCBjbGlwXG4gICAgICAgICAgICAgICAgaWYgKG9ubHlTb3VuZElkID09PSB1bmRlZmluZWQgfHwgb25seVNvdW5kSWQgPT09IHNvdW5kSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChhbGxvd0lmU3RvcFJlcXVlc3RlZCAmJiBjbGlwLnN0YXRlLnR5cGUgPT09ICdzdG9wX3JlcXVlc3RlZCcpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGlwLnN0YXRlLnR5cGUgPT09ICdwbGF5aW5nJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xpcC5zdGF0ZS50eXBlID09PSAncGF1c2luZycgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAuc3RhdGUudHlwZSA9PT0gJ3BhdXNlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAuc3RhdGUudHlwZSA9PT0gJ3N0b3BwaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmFkZVZhbGlkKGZhZGUpICYmIGNsaXAuc3RhdGUudHlwZSAhPT0gJ3BhdXNlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhbnVwIGFueSBvbGQgZmFkZSBjYWxsYmFja3MgZmlyc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZW1vdmUgY2FzdCBvbmNlIGh0dHBzOi8vZ2l0aHViLmNvbS9EZWZpbml0ZWx5VHlwZWQvRGVmaW5pdGVseVR5cGVkL3B1bGwvNTk0MTEgaXMgbWVyZ2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub2ZmKCdmYWRlJywgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFkZUF1ZGlvUGxheWVyVm9sdW1lKGNsaXBQbGF5ZXIucGxheWVyLCAwLCBmYWRlICogMTAwMCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGNhbGxiYWNrIGFmdGVyIHN0YXJ0aW5nIG5ldyBmYWRlLCBvdGhlcndpc2UgaXQgd2lsbCBmaXJlIHN0cmFpZ2h0IGF3YXkgYXMgdGhlIHByZXZpb3VzIGZhZGUgaXMgY2FuY2VsbGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub25jZSgnZmFkZScsIChzb3VuZElkKSA9PiBjbGlwUGxheWVyLnBsYXllci5zdG9wKHNvdW5kSWQpLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwLnN0YXRlID0geyB0eXBlOiAnc3RvcHBpbmcnIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5zdG9wKHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIENsaXAgaGFzbid0IHN0YXJ0ZWQgcGxheWluZyB5ZXQsIG9yIGhhcyBhbHJlYWR5IGhhZCBzdG9wX3JlcXVlc3RlZCAoYnV0IGZhZGUgbWF5IGhhdmUgY2hhbmdlZCBzbyB1cGRhdGUgaGVyZSlcbiAgICAgICAgICAgICAgICAgICAgLy8gb3IgaGFzIHBhdXNlX3JlcXVlc3RlZCwgYnV0IHN0b3AgdGFrZXMgcHJlY2VkZW5jZVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjbGlwLnN0YXRlLnR5cGUgPT09ICdwbGF5X3JlcXVlc3RlZCcgfHwgY2xpcC5zdGF0ZS50eXBlID09PSAncGF1c2VfcmVxdWVzdGVkJyB8fCBjbGlwLnN0YXRlLnR5cGUgPT09ICdzdG9wX3JlcXVlc3RlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhcIlRyeWluZyB0byBzdG9wIGNsaXAgd2hpY2ggaGFzbid0IHN0YXJ0ZWQgcGxheWluZyB5ZXRcIiwgeyBwYXRoLCBzb3VuZElkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xpcC5zdGF0ZSA9IHsgdHlwZTogJ3N0b3BfcmVxdWVzdGVkJywgZmFkZSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbc291bmRJZFN0ciwgY2xpcF07XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0b3BBbGxBdWRpb0NsaXBzKG9wdGlvbnMpIHtcbiAgICAgICAgbG9nKCdTdG9wcGluZyBhbGwgY2xpcHMnKTtcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5hdWRpb0NsaXBQbGF5ZXJzKS5mb3JFYWNoKChwYXRoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0b3BBdWRpb0NsaXAocGF0aCwgb3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzZXRBdWRpb0NsaXBWb2x1bWUocGF0aCwgeyB2b2x1bWUsIGZhZGUgfSkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBpZiAoISh2b2x1bWUgPj0gMCAmJiB2b2x1bWUgPD0gMSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCB2b2x1bWUnLCB2b2x1bWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGFjdGl2ZSBjbGlwcyB0byBzZXQgdm9sdW1lIGZvclxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoKF9iID0gKF9hID0gdGhpcy5hdWRpb0NsaXBQbGF5ZXJzW3BhdGhdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWN0aXZlQ2xpcHMpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHt9KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUF1ZGlvQ2xpcFBsYXllcihwYXRoLCAoY2xpcFBsYXllcikgPT4ge1xuICAgICAgICAgICAgY2xpcFBsYXllci5hY3RpdmVDbGlwcyA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhjbGlwUGxheWVyLmFjdGl2ZUNsaXBzKS5tYXAoKFtzb3VuZElkU3RyLCBjbGlwXSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIElnbm9yZWQgZm9yIHBhdXNpbmcvc3RvcHBpbmcgaW5zdGFuY2VzXG4gICAgICAgICAgICAgICAgaWYgKGNsaXAuc3RhdGUudHlwZSAhPT0gJ3BhdXNpbmcnICYmIGNsaXAuc3RhdGUudHlwZSAhPT0gJ3N0b3BwaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VuZElkID0gcGFyc2VJbnQoc291bmRJZFN0cik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0ZhZGVWYWxpZChmYWRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmFkZUF1ZGlvUGxheWVyVm9sdW1lKGNsaXBQbGF5ZXIucGxheWVyLCB2b2x1bWUsIGZhZGUgKiAxMDAwLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEF1ZGlvUGxheWVyVm9sdW1lKGNsaXBQbGF5ZXIucGxheWVyLCB2b2x1bWUsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbc291bmRJZFN0ciwgeyAuLi5jbGlwLCB2b2x1bWUgfV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3NvdW5kSWRTdHIsIGNsaXBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVyO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaGFuZGxlU3RvcHBlZENsaXAocGF0aCwgcGxheUlkLCBzb3VuZElkKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQXVkaW9DbGlwUGxheWVyKHBhdGgsIChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgY2xpcFBsYXllci5hY3RpdmVDbGlwc1tzb3VuZElkXTtcbiAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVyO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnMocGxheUlkLCBwYXRoLCAnc3RvcHBlZCcpO1xuICAgIH1cbiAgICB1cGRhdGVBY3RpdmVBdWRpb0NsaXAocGF0aCwgc291bmRJZCwgdXBkYXRlKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQXVkaW9DbGlwUGxheWVyKHBhdGgsIChjbGlwUGxheWVyKSA9PiBzb3VuZElkIGluIGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHNcbiAgICAgICAgICAgID8geyAuLi5jbGlwUGxheWVyLCBhY3RpdmVDbGlwczogeyAuLi5jbGlwUGxheWVyLmFjdGl2ZUNsaXBzLCBbc291bmRJZF06IHVwZGF0ZShjbGlwUGxheWVyLmFjdGl2ZUNsaXBzW3NvdW5kSWRdKSB9IH1cbiAgICAgICAgICAgIDogY2xpcFBsYXllcik7XG4gICAgfVxuICAgIHVwZGF0ZUF1ZGlvQ2xpcFBsYXllcihwYXRoLCB1cGRhdGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAocGF0aCBpbiB0aGlzLmF1ZGlvQ2xpcFBsYXllcnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9DbGlwUGxheWVycyA9IHsgLi4udGhpcy5hdWRpb0NsaXBQbGF5ZXJzLCBbcGF0aF06IHVwZGF0ZSh0aGlzLmF1ZGlvQ2xpcFBsYXllcnNbcGF0aF0pIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gT25jZSBsYXN0IGluc3RhbmNlIG9mIGFuIGVwaGVtZXJhbCBjbGlwIGlzIHJlbW92ZWQsIGNsZWFudXAgYW5kIHJlbW92ZSB0aGUgcGxheWVyXG4gICAgICAgIGNvbnN0IGNsaXBQbGF5ZXIgPSB0aGlzLmF1ZGlvQ2xpcFBsYXllcnNbcGF0aF07XG4gICAgICAgIGlmIChjbGlwUGxheWVyICYmIE9iamVjdC5rZXlzKChfYSA9IGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHt9KS5sZW5ndGggPT09IDAgJiYgY2xpcFBsYXllci5jb25maWcuZXBoZW1lcmFsKSB7XG4gICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci51bmxvYWQoKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmF1ZGlvQ2xpcFBsYXllcnNbcGF0aF07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub3RpZnlTdGF0ZUxpc3RlbmVycygpO1xuICAgIH1cbiAgICBzZXRBdWRpb1Npbmsoc2lua0lkKSB7XG4gICAgICAgIGxvZyhgU2V0dGluZyBzaW5rIElEIGZvciBhbGwgY2xpcHM6YCwgc2lua0lkKTtcbiAgICAgICAgZm9yIChjb25zdCBjbGlwUGxheWVyIG9mIE9iamVjdC52YWx1ZXModGhpcy5hdWRpb0NsaXBQbGF5ZXJzKSkge1xuICAgICAgICAgICAgc2V0UGxheWVyU2lua0lkKGNsaXBQbGF5ZXIucGxheWVyLCBzaW5rSWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2lua0lkID0gc2lua0lkO1xuICAgIH1cbiAgICB1cGRhdGVDb25maWcobmV3RmlsZXMpIHtcbiAgICAgICAgY29uc3QgbmV3QXVkaW9GaWxlcyA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhuZXdGaWxlcykuZmlsdGVyKChmaWxlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0eXBlID0gZmlsZVsxXS50eXBlO1xuICAgICAgICAgICAgLy8gQ09HUyA0LjYgZGlkIG5vdCBzZW5kIGEgYHR5cGVgIGJ1dCBvbmx5IHJlcG9ydGVkIGF1ZGlvIGZpbGVzXG4gICAgICAgICAgICAvLyBzbyB3ZSBhc3N1bWUgYXVkaW8gaWYgbm8gYHR5cGVgIGlzIGdpdmVuXG4gICAgICAgICAgICByZXR1cm4gdHlwZSA9PT0gJ2F1ZGlvJyB8fCAhdHlwZTtcbiAgICAgICAgfSkpO1xuICAgICAgICBjb25zdCBwcmV2aW91c0NsaXBQbGF5ZXJzID0gdGhpcy5hdWRpb0NsaXBQbGF5ZXJzO1xuICAgICAgICB0aGlzLmF1ZGlvQ2xpcFBsYXllcnMgPSAoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2xpcFBsYXllcnMgPSB7IC4uLnByZXZpb3VzQ2xpcFBsYXllcnMgfTtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZWRDbGlwcyA9IE9iamVjdC5rZXlzKHByZXZpb3VzQ2xpcFBsYXllcnMpLmZpbHRlcigocHJldmlvdXNGaWxlKSA9PiAhKHByZXZpb3VzRmlsZSBpbiBuZXdBdWRpb0ZpbGVzKSAmJiAhcHJldmlvdXNDbGlwUGxheWVyc1twcmV2aW91c0ZpbGVdLmNvbmZpZy5lcGhlbWVyYWwpO1xuICAgICAgICAgICAgcmVtb3ZlZENsaXBzLmZvckVhY2goKGZpbGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwbGF5ZXIgPSBwcmV2aW91c0NsaXBQbGF5ZXJzW2ZpbGVdLnBsYXllcjtcbiAgICAgICAgICAgICAgICBwbGF5ZXIudW5sb2FkKCk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGNsaXBQbGF5ZXJzW2ZpbGVdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBhZGRlZENsaXBzID0gT2JqZWN0LmVudHJpZXMobmV3QXVkaW9GaWxlcykuZmlsdGVyKChbbmV3ZmlsZV0pID0+ICFwcmV2aW91c0NsaXBQbGF5ZXJzW25ld2ZpbGVdKTtcbiAgICAgICAgICAgIGFkZGVkQ2xpcHMuZm9yRWFjaCgoW3BhdGgsIGNvbmZpZ10pID0+IHtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyc1twYXRoXSA9IHRoaXMuY3JlYXRlQ2xpcChwYXRoLCB7IC4uLmNvbmZpZywgZXBoZW1lcmFsOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlZENsaXBzID0gT2JqZWN0LmtleXMocHJldmlvdXNDbGlwUGxheWVycykuZmlsdGVyKChwcmV2aW91c0ZpbGUpID0+IHByZXZpb3VzRmlsZSBpbiBuZXdBdWRpb0ZpbGVzKTtcbiAgICAgICAgICAgIHVwZGF0ZWRDbGlwcy5mb3JFYWNoKChwYXRoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllcnNbcGF0aF0gPSB0aGlzLnVwZGF0ZWRDbGlwKHBhdGgsIGNsaXBQbGF5ZXJzW3BhdGhdLCB7IC4uLm5ld0F1ZGlvRmlsZXNbcGF0aF0sIGVwaGVtZXJhbDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVycztcbiAgICAgICAgfSkoKTtcbiAgICAgICAgdGhpcy5ub3RpZnlTdGF0ZUxpc3RlbmVycygpO1xuICAgIH1cbiAgICBub3RpZnlTdGF0ZUxpc3RlbmVycygpIHtcbiAgICAgICAgY29uc3QgY2xpcHMgPSBPYmplY3QuZW50cmllcyh0aGlzLmF1ZGlvQ2xpcFBsYXllcnMpLnJlZHVjZSgoY2xpcHMsIFtwYXRoLCBjbGlwUGxheWVyXSkgPT4ge1xuICAgICAgICAgICAgY2xpcHNbcGF0aF0gPSB7XG4gICAgICAgICAgICAgICAgY29uZmlnOiB7IHByZWxvYWQ6IGNsaXBQbGF5ZXIuY29uZmlnLnByZWxvYWQsIGVwaGVtZXJhbDogY2xpcFBsYXllci5jb25maWcuZXBoZW1lcmFsIH0sXG4gICAgICAgICAgICAgICAgYWN0aXZlQ2xpcHM6IGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHMsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGNsaXBzO1xuICAgICAgICB9LCB7fSk7XG4gICAgICAgIGNvbnN0IGlzUGxheWluZyA9IE9iamVjdC52YWx1ZXModGhpcy5hdWRpb0NsaXBQbGF5ZXJzKS5zb21lKCh7IGFjdGl2ZUNsaXBzIH0pID0+IE9iamVjdC52YWx1ZXMoYWN0aXZlQ2xpcHMpLnNvbWUoKGNsaXApID0+IGNsaXAuc3RhdGUudHlwZSA9PT0gJ3BsYXlpbmcnIHx8IGNsaXAuc3RhdGUudHlwZSA9PT0gJ3BhdXNpbmcnIHx8IGNsaXAuc3RhdGUudHlwZSA9PT0gJ3N0b3BwaW5nJykpO1xuICAgICAgICBjb25zdCBhdWRpb1N0YXRlID0ge1xuICAgICAgICAgICAgZ2xvYmFsVm9sdW1lOiB0aGlzLmdsb2JhbFZvbHVtZSxcbiAgICAgICAgICAgIGlzUGxheWluZyxcbiAgICAgICAgICAgIGNsaXBzLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ3N0YXRlJywgYXVkaW9TdGF0ZSk7XG4gICAgfVxuICAgIG5vdGlmeUNsaXBTdGF0ZUxpc3RlbmVycyhwbGF5SWQsIGZpbGUsIHN0YXR1cykge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ2F1ZGlvQ2xpcFN0YXRlJywgeyBtZWRpYVR5cGU6ICdhdWRpbycsIHBsYXlJZCwgZmlsZSwgc3RhdHVzIH0pO1xuICAgIH1cbiAgICAvLyBUeXBlLXNhZmUgd3JhcHBlciBhcm91bmQgRXZlbnRUYXJnZXRcbiAgICBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5ldmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICB9XG4gICAgZGlzcGF0Y2hFdmVudCh0eXBlLCBkZXRhaWwpIHtcbiAgICAgICAgdGhpcy5ldmVudFRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCh0eXBlLCB7IGRldGFpbCB9KSk7XG4gICAgfVxuICAgIGNyZWF0ZVBsYXllcihwYXRoLCBjb25maWcpIHtcbiAgICAgICAgY29uc3QgcGxheWVyID0gbmV3IGhvd2xlcl8xLkhvd2woe1xuICAgICAgICAgICAgc3JjOiB1cmxzXzEuYXNzZXRVcmwocGF0aCksXG4gICAgICAgICAgICBhdXRvcGxheTogZmFsc2UsXG4gICAgICAgICAgICBsb29wOiBmYWxzZSxcbiAgICAgICAgICAgIHZvbHVtZTogMSxcbiAgICAgICAgICAgIGh0bWw1OiB0cnVlLFxuICAgICAgICAgICAgcHJlbG9hZDogY29uZmlnLnByZWxvYWQsXG4gICAgICAgIH0pO1xuICAgICAgICBzZXRQbGF5ZXJTaW5rSWQocGxheWVyLCB0aGlzLnNpbmtJZCk7XG4gICAgICAgIHJldHVybiBwbGF5ZXI7XG4gICAgfVxuICAgIGNyZWF0ZUNsaXAoZmlsZSwgY29uZmlnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICBwbGF5ZXI6IHRoaXMuY3JlYXRlUGxheWVyKGZpbGUsIGNvbmZpZyksXG4gICAgICAgICAgICBhY3RpdmVDbGlwczoge30sXG4gICAgICAgIH07XG4gICAgfVxuICAgIHVwZGF0ZWRDbGlwKGNsaXBQYXRoLCBwcmV2aW91c0NsaXAsIG5ld0NvbmZpZykge1xuICAgICAgICBjb25zdCBjbGlwID0geyAuLi5wcmV2aW91c0NsaXAsIGNvbmZpZzogbmV3Q29uZmlnIH07XG4gICAgICAgIGlmIChwcmV2aW91c0NsaXAuY29uZmlnLnByZWxvYWQgIT09IG5ld0NvbmZpZy5wcmVsb2FkKSB7XG4gICAgICAgICAgICBjbGlwLnBsYXllci51bmxvYWQoKTtcbiAgICAgICAgICAgIGNsaXAucGxheWVyID0gdGhpcy5jcmVhdGVQbGF5ZXIoY2xpcFBhdGgsIG5ld0NvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsaXA7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gQXVkaW9QbGF5ZXI7XG5mdW5jdGlvbiBsb2coLi4uZGF0YSkge1xuICAgIGlmIChERUJVRykge1xuICAgICAgICBjb25zb2xlLmxvZyguLi5kYXRhKTtcbiAgICB9XG59XG4vKipcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGlzIHRoaXMgYSB2YWxpZCBmYWRlIGR1cmF0aW9uLiBBbHdheXMgcmV0dXJucyBgZmFsc2VgIG9uIGlPU1xuICovXG5mdW5jdGlvbiBpc0ZhZGVWYWxpZChmYWRlKSB7XG4gICAgcmV0dXJuICFJU19JT1MgJiYgdHlwZW9mIGZhZGUgPT09ICdudW1iZXInICYmICFpc05hTihmYWRlKSAmJiBmYWRlID4gMDtcbn1cbmZ1bmN0aW9uIHNldFBsYXllclNpbmtJZChwbGF5ZXIsIHNpbmtJZCkge1xuICAgIHZhciBfYTtcbiAgICBpZiAoc2lua0lkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocGxheWVyLl9odG1sNSkge1xuICAgICAgICAoX2EgPSBwbGF5ZXIuX3NvdW5kcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZvckVhY2goKHNvdW5kKSA9PiB7XG4gICAgICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAgICAgKF9iID0gKF9hID0gc291bmQuX25vZGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zZXRTaW5rSWQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCBzaW5rSWQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIFRPRE86IGhhbmRsZSB3ZWIgYXVkaW9cbiAgICAgICAgY29uc29sZS53YXJuKCdDYW5ub3Qgc2V0IHNpbmsgSUQ6IHdlYiBhdWRpbyBub3Qgc3VwcG9ydGVkJywgcGxheWVyKTtcbiAgICB9XG59XG4vKipcbiAqIFNldCBhdWRpbyB2b2x1bWVcbiAqXG4gKiBUaGlzIGRvZXNuJ3Qgd29yayBvbiBpT1MgKHZvbHVtZSBpcyByZWFkLW9ubHkpIHNvIGF0IGxlYXN0IG11dGUgaXQgaWYgdGhlIHZvbHVtZSBpcyB6ZXJvXG4gKi9cbmZ1bmN0aW9uIHNldEF1ZGlvUGxheWVyVm9sdW1lKGhvd2wsIHZvbHVtZSwgc291bmRJZCkge1xuICAgIGhvd2wudm9sdW1lKHZvbHVtZSwgc291bmRJZCk7XG4gICAgaG93bC5tdXRlKHZvbHVtZSA9PT0gMCwgc291bmRJZCk7XG59XG4vKipcbiAqIEZhZGUgdG8gYXVkaW8gdm9sdW1lXG4gKlxuICogVGhpcyBkb2Vzbid0IHdvcmsgb24gaU9TICh2b2x1bWUgaXMgcmVhZC1vbmx5KSBzbyBhdCBsZWFzdCBtdXRlIGl0IGlmIHRoZSB2b2x1bWUgaXMgemVyb1xuICovXG5mdW5jdGlvbiBmYWRlQXVkaW9QbGF5ZXJWb2x1bWUoaG93bCwgdm9sdW1lLCBmYWRlLCBzb3VuZElkKSB7XG4gICAgaG93bC5tdXRlKGZhbHNlLCBzb3VuZElkKTtcbiAgICBob3dsLmZhZGUoaG93bC52b2x1bWUoc291bmRJZCksIHZvbHVtZSwgZmFkZSwgc291bmRJZCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHZhbHVlVHlwZXNfMSA9IHJlcXVpcmUoXCIuL3R5cGVzL3ZhbHVlVHlwZXNcIik7XG5jb25zdCByZWNvbm5lY3Rpbmdfd2Vic29ja2V0XzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcInJlY29ubmVjdGluZy13ZWJzb2NrZXRcIikpO1xuY29uc3QgdXJsc18xID0gcmVxdWlyZShcIi4vaGVscGVycy91cmxzXCIpO1xuY2xhc3MgQ29nc0Nvbm5lY3Rpb24ge1xuICAgIGNvbnN0cnVjdG9yKHsgaG9zdG5hbWUgPSBkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZSwgcG9ydCA9IHVybHNfMS5DT0dTX1NFUlZFUl9QT1JUIH0gPSB7fSwgb3V0cHV0UG9ydFZhbHVlcyA9IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuZXZlbnRUYXJnZXQgPSBuZXcgRXZlbnRUYXJnZXQoKTtcbiAgICAgICAgdGhpcy5jdXJyZW50Q29uZmlnID0ge307IC8vIFJlY2VpdmVkIG9uIG9wZW4gY29ubmVjdGlvblxuICAgICAgICB0aGlzLmN1cnJlbnRJbnB1dFBvcnRWYWx1ZXMgPSB7fTsgLy8gUmVjZWl2ZWQgb24gb3BlbiBjb25uZWN0aW9uXG4gICAgICAgIHRoaXMuY3VycmVudE91dHB1dFBvcnRWYWx1ZXMgPSB7fTsgLy8gU2VudCBvbiBvcGVuIGNvbm5lY3Rpb25cbiAgICAgICAgdGhpcy5fc2hvd1BoYXNlID0gdmFsdWVUeXBlc18xLlNob3dQaGFzZS5TZXR1cDtcbiAgICAgICAgdGhpcy5fdGltZXJTdGF0ZSA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWNoZWQgYXVkaW8gb3V0cHV0cyB1c2UgdG8gbG9vayB1cCB0aGUgZGV2aWNlL3NpbmsgSUQgd2hlbiBhIGRpZmZlcmVudCBkZXZpY2UgbGFiZWwgaXMgcmVxdWVzdGVkXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmF1ZGlvT3V0cHV0cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRBdWRpb091dHB1dCA9ICcnO1xuICAgICAgICB0aGlzLmN1cnJlbnRPdXRwdXRQb3J0VmFsdWVzID0geyAuLi5vdXRwdXRQb3J0VmFsdWVzIH07XG4gICAgICAgIGNvbnN0IHsgdXNlUmVjb25uZWN0aW5nV2Vic29ja2V0LCBwYXRoLCBwYXRoUGFyYW1zIH0gPSB3ZWJzb2NrZXRQYXJhbWV0ZXJzRnJvbVVybChkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgY29uc3Qgc29ja2V0VXJsID0gYHdzOi8vJHtob3N0bmFtZX06JHtwb3J0fSR7cGF0aH0ke3BhdGhQYXJhbXMgPyAnPycgKyBwYXRoUGFyYW1zIDogJyd9YDtcbiAgICAgICAgdGhpcy53ZWJzb2NrZXQgPSB1c2VSZWNvbm5lY3RpbmdXZWJzb2NrZXQgPyBuZXcgcmVjb25uZWN0aW5nX3dlYnNvY2tldF8xLmRlZmF1bHQoc29ja2V0VXJsKSA6IG5ldyBXZWJTb2NrZXQoc29ja2V0VXJsKTtcbiAgICAgICAgdGhpcy53ZWJzb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q29uZmlnID0ge307IC8vIFJlY2VpdmVkIG9uIG9wZW4gY29ubmVjdGlvblxuICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5wdXRQb3J0VmFsdWVzID0ge307IC8vIFJlY2VpdmVkIG9uIG9wZW4gY29ubmVjdGlvblxuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdvcGVuJywgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHRoaXMuc2V0T3V0cHV0UG9ydFZhbHVlcyh0aGlzLmN1cnJlbnRPdXRwdXRQb3J0VmFsdWVzKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy53ZWJzb2NrZXQub25jbG9zZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnY2xvc2UnLCB1bmRlZmluZWQpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLndlYnNvY2tldC5vbm1lc3NhZ2UgPSAoeyBkYXRhIH0pID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkLmNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q29uZmlnID0gcGFyc2VkLmNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnY29uZmlnJywgdGhpcy5jdXJyZW50Q29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXJzZWQudXBkYXRlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5wdXRQb3J0VmFsdWVzID0geyAuLi50aGlzLmN1cnJlbnRJbnB1dFBvcnRWYWx1ZXMsIC4uLnBhcnNlZC51cGRhdGVzIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ3VwZGF0ZXMnLCBwYXJzZWQudXBkYXRlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyc2VkLmV2ZW50ICYmIHBhcnNlZC5ldmVudC5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnZXZlbnQnLCBwYXJzZWQuZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBwYXJzZWQubWVzc2FnZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocGFyc2VkLm1lc3NhZ2UudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FkanVzdGFibGVfdGltZXJfdXBkYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGltZXJTdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uTWlsbGlzOiBwYXJzZWQubWVzc2FnZS5kdXJhdGlvbk1pbGxpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tpbmc6IHBhcnNlZC5tZXNzYWdlLnRpY2tpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Nob3dfcGhhc2UnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaG93UGhhc2UgPSBwYXJzZWQubWVzc2FnZS5waGFzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ21lc3NhZ2UnLCBwYXJzZWQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdFcnJvciBoYW5kbGluZyBkYXRhJywgZGF0YSwgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmFibGUgdG8gcGFyc2UgaW5jb21pbmcgZGF0YSBmcm9tIHNlcnZlcicsIGRhdGEsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBTZW5kIGEgbGlzdCBvZiBhdWRpbyBvdXRwdXRzIHRvIENPR1MgYW5kIGtlZXAgaXQgdXAgdG8gZGF0ZVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCByZWZyZXNoQXVkaW9PdXRwdXRzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzYCBpcyB1bmRlZmluZWQgb24gQ09HUyBBViA8PSA0LjUgYmVjYXVzZSBvZiBzZWN1cmUgb3JpZ2luIHBlcm1pc3Npb25zXG4gICAgICAgICAgICAgICAgaWYgKG5hdmlnYXRvci5tZWRpYURldmljZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9PdXRwdXRzID0gKGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpKS5maWx0ZXIoKHsga2luZCB9KSA9PiBraW5kID09PSAnYXVkaW9vdXRwdXQnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZW5kQXVkaW9PdXRwdXRzKGF1ZGlvT3V0cHV0cyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9PdXRwdXRzID0gYXVkaW9PdXRwdXRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCByZWZyZXNoQXVkaW9PdXRwdXRzKTtcbiAgICAgICAgICAgIChfYSA9IG5hdmlnYXRvci5tZWRpYURldmljZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hZGRFdmVudExpc3RlbmVyKCdkZXZpY2VjaGFuZ2UnLCByZWZyZXNoQXVkaW9PdXRwdXRzKTtcbiAgICAgICAgICAgIHJlZnJlc2hBdWRpb091dHB1dHMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgY29uZmlnKCkge1xuICAgICAgICByZXR1cm4geyAuLi50aGlzLmN1cnJlbnRDb25maWcgfTtcbiAgICB9XG4gICAgZ2V0IGlucHV0UG9ydFZhbHVlcygpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4udGhpcy5jdXJyZW50SW5wdXRQb3J0VmFsdWVzIH07XG4gICAgfVxuICAgIGdldCBvdXRwdXRQb3J0VmFsdWVzKCkge1xuICAgICAgICByZXR1cm4geyAuLi50aGlzLmN1cnJlbnRPdXRwdXRQb3J0VmFsdWVzIH07XG4gICAgfVxuICAgIGdldCBzaG93UGhhc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaG93UGhhc2U7XG4gICAgfVxuICAgIGdldCB0aW1lclN0YXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGltZXJTdGF0ZSA/IHsgLi4udGhpcy5fdGltZXJTdGF0ZSB9IDogbnVsbDtcbiAgICB9XG4gICAgZ2V0IHNlbGVjdGVkQXVkaW9PdXRwdXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZEF1ZGlvT3V0cHV0O1xuICAgIH1cbiAgICBnZXQgaXNDb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndlYnNvY2tldC5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTjtcbiAgICB9XG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMud2Vic29ja2V0LmNsb3NlKCk7XG4gICAgfVxuICAgIHNlbmRFdmVudChldmVudE5hbWUsIC4uLltldmVudFZhbHVlXSkge1xuICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhpcy53ZWJzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBldmVudE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBldmVudFZhbHVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0T3V0cHV0UG9ydFZhbHVlcyh2YWx1ZXMpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50T3V0cHV0UG9ydFZhbHVlcyA9IHsgLi4udGhpcy5jdXJyZW50T3V0cHV0UG9ydFZhbHVlcywgLi4udmFsdWVzIH07XG4gICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLndlYnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHsgdXBkYXRlczogdmFsdWVzIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRBdWRpb1NpbmtJZChhdWRpb091dHB1dCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gYXVkaW9PdXRwdXQgPyAoX2IgPSAoX2EgPSB0aGlzLmF1ZGlvT3V0cHV0cykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZpbmQoKHsgbGFiZWwgfSkgPT4gbGFiZWwgPT09IGF1ZGlvT3V0cHV0KSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmRldmljZUlkIDogJyc7XG4gICAgfVxuICAgIHNlbmRJbml0aWFsTWVkaWFDbGlwU3RhdGVzKGFsbE1lZGlhQ2xpcFN0YXRlcykge1xuICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhpcy53ZWJzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7IGFsbE1lZGlhQ2xpcFN0YXRlcyB9KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2VuZE1lZGlhQ2xpcFN0YXRlKG1lZGlhQ2xpcFN0YXRlKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLndlYnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHsgbWVkaWFDbGlwU3RhdGUgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNlbmRBdWRpb091dHB1dHMoYXVkaW9PdXRwdXRzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLndlYnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHsgYXVkaW9PdXRwdXRzIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaG93IG9yIGhpZGUgdGhlIHBsdWdpbiB3aW5kb3cuXG4gICAgICogQHBhcmFtIHZpc2libGUgV2hldGhlciB0byBzaG93IG9yIGhpZGUgdGhlIHdpbmRvd1xuICAgICAqIFRoaXMgaXMgb25seSByZWxldmFudCBmb3IgcGx1Z2lucywgbm90IGZvciBNZWRpYSBNYXN0ZXIgY29udGVudC5cbiAgICAgKi9cbiAgICBzZXRQbHVnaW5XaW5kb3dWaXNpYmxlKHZpc2libGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMud2Vic29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoeyB3aW5kb3c6IHsgdmlzaWJsZSB9IH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUeXBlLXNhZmUgd3JhcHBlciBhcm91bmQgRXZlbnRUYXJnZXRcbiAgICBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5ldmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICB9XG4gICAgZGlzcGF0Y2hFdmVudCh0eXBlLCBkZXRhaWwpIHtcbiAgICAgICAgdGhpcy5ldmVudFRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCh0eXBlLCB7IGRldGFpbCB9KSk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gQ29nc0Nvbm5lY3Rpb247XG5mdW5jdGlvbiB3ZWJzb2NrZXRQYXJhbWV0ZXJzRnJvbVVybCh1cmwpIHtcbiAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lO1xuICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwodXJsKTtcbiAgICBjb25zdCBwYXRoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJzZWRVcmwuc2VhcmNoUGFyYW1zKTtcbiAgICBjb25zdCBsb2NhbENsaWVudElkID0gcGF0aFBhcmFtcy5nZXQoJ2xvY2FsX2lkJyk7XG4gICAgY29uc3QgaXNTaW11bGF0b3IgPSBwYXRoUGFyYW1zLmdldCgnc2ltdWxhdG9yJykgPT09ICd0cnVlJztcbiAgICBjb25zdCBkaXNwbGF5ID0gKF9hID0gcGF0aFBhcmFtcy5nZXQoJ2Rpc3BsYXknKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJyc7XG4gICAgY29uc3QgcGx1Z2luSWQgPSBwYXJzZWRVcmwucGF0aG5hbWUuc3RhcnRzV2l0aCgnL3BsdWdpbi8nKSA/IGRlY29kZVVSSUNvbXBvbmVudChwYXJzZWRVcmwucGF0aG5hbWUuc3BsaXQoJy8nKVsyXSkgOiB1bmRlZmluZWQ7XG4gICAgaWYgKGxvY2FsQ2xpZW50SWQpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IChfYiA9IHBhdGhQYXJhbXMuZ2V0KCd0JykpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xuICAgICAgICBwYXRoUGFyYW1zLmRlbGV0ZSgnbG9jYWxfaWQnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhdGg6IGAvbG9jYWwvJHtlbmNvZGVVUklDb21wb25lbnQobG9jYWxDbGllbnRJZCl9YCxcbiAgICAgICAgICAgIHBhdGhQYXJhbXM6IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyB0OiB0eXBlIH0pLFxuICAgICAgICAgICAgdXNlUmVjb25uZWN0aW5nV2Vic29ja2V0OiB0cnVlLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1NpbXVsYXRvcikge1xuICAgICAgICBjb25zdCBuYW1lID0gKF9jID0gcGF0aFBhcmFtcy5nZXQoJ25hbWUnKSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogJyc7XG4gICAgICAgIHBhdGhQYXJhbXMuZGVsZXRlKCdzaW11bGF0b3InKTtcbiAgICAgICAgcGF0aFBhcmFtcy5kZWxldGUoJ25hbWUnKTtcbiAgICAgICAgcmV0dXJuIHsgcGF0aDogYC9zaW11bGF0b3IvJHtlbmNvZGVVUklDb21wb25lbnQobmFtZSl9YCwgcGF0aFBhcmFtcywgdXNlUmVjb25uZWN0aW5nV2Vic29ja2V0OiB0cnVlIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKGRpc3BsYXkpIHtcbiAgICAgICAgY29uc3QgZGlzcGxheUlkSW5kZXggPSAoX2QgPSBwYXRoUGFyYW1zLmdldCgnZGlzcGxheUlkSW5kZXgnKSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogJyc7XG4gICAgICAgIHBhdGhQYXJhbXMuZGVsZXRlKCdkaXNwbGF5Jyk7XG4gICAgICAgIHBhdGhQYXJhbXMuZGVsZXRlKCdkaXNwbGF5SWRJbmRleCcpO1xuICAgICAgICByZXR1cm4geyBwYXRoOiBgL2Rpc3BsYXkvJHtlbmNvZGVVUklDb21wb25lbnQoZGlzcGxheSl9LyR7ZW5jb2RlVVJJQ29tcG9uZW50KGRpc3BsYXlJZEluZGV4KX1gIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKHBsdWdpbklkKSB7XG4gICAgICAgIHJldHVybiB7IHBhdGg6IGAvcGx1Z2luLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHBsdWdpbklkKX1gLCB1c2VSZWNvbm5lY3RpbmdXZWJzb2NrZXQ6IHRydWUgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbCA9IChfZSA9IHBhdGhQYXJhbXMuZ2V0KCdzZXJpYWwnKSkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogJyc7XG4gICAgICAgIHBhdGhQYXJhbXMuZGVsZXRlKCdzZXJpYWwnKTtcbiAgICAgICAgcmV0dXJuIHsgcGF0aDogYC9jbGllbnQvJHtlbmNvZGVVUklDb21wb25lbnQoc2VyaWFsKX1gLCBwYXRoUGFyYW1zIH07XG4gICAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkxJVkVfVklERU9fUExBWUJBQ0tfUkFURSA9IHZvaWQgMDtcbmNvbnN0IG1lZGlhX3N0cmVhbV9saWJyYXJ5X2Jyb3dzZXJfMSA9IHJlcXVpcmUoXCJAY2xvY2t3b3JrZG9nL21lZGlhLXN0cmVhbS1saWJyYXJ5LWJyb3dzZXJcIik7XG5jb25zdCB1cmxzXzEgPSByZXF1aXJlKFwiLi9oZWxwZXJzL3VybHNcIik7XG5jb25zdCBERUZBVUxUX1ZJREVPX1BMQVlCQUNLX1JBVEUgPSAxO1xuLy8gVXNlIGEgZmFzdGVyLXRoYW4tcmVhbHRpbWUgcGxheWJhY2sgcmF0ZSBieSBkZWZhdWx0XG4vLyBzbyB0aGF0IGl0IGtlZXBzIHVwIHdpdGggYSByZWFsdGltZSBzdHJlYW0gaW4gY2FzZSBvZiB2aWRlbyBidWZmZXJpbmdcbmV4cG9ydHMuTElWRV9WSURFT19QTEFZQkFDS19SQVRFID0gMS4xO1xuLyoqXG4gKiBNYW5hZ2VzIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIENPR1MgVENQIHJlbGF5IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHNlbmQgUlRTUCB2aWRlb1xuICogZmVlZHMgdG8gdGhlIHdlYi5cbiAqL1xuY2xhc3MgUnRzcFN0cmVhbWVyIHtcbiAgICBjb25zdHJ1Y3Rvcih7IGhvc3RuYW1lID0gZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUsIHBvcnQgPSB1cmxzXzEuQ09HU19TRVJWRVJfUE9SVCwgcGF0aCA9ICcvdGNwLXByb3h5JywgfSA9IHt9KSB7XG4gICAgICAgIHRoaXMuX3dlYnNvY2tldFVyaSA9IGB3czovLyR7aG9zdG5hbWV9OiR7cG9ydH0ke3BhdGh9YDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnQgYW4gUlRTUCB2aWRlbyBzdHJlYW0gb24gd2l0aCB0aGUgZ2l2ZW4gVVJJIG9uIHRoZSBnaXZlbiB2aWRlbyBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIGEgZnVuY3Rpb24gdG8gY2xvc2UgdGhlIHBpcGVsaW5lXG4gICAgICovXG4gICAgcGxheShwYXJhbXMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCB7IHVyaSwgdmlkZW9FbGVtZW50IH0gPSBwYXJhbXM7XG4gICAgICAgIHZpZGVvRWxlbWVudC5wbGF5c0lubGluZSA9IHRydWU7IC8vIFJlcXVpcmVkIGZvciBpT1NcbiAgICAgICAgbGV0IHBpcGVsaW5lO1xuICAgICAgICBjb25zdCBzdGFydFBpcGVsaW5lID0gKCkgPT4ge1xuICAgICAgICAgICAgcGlwZWxpbmUgPT09IG51bGwgfHwgcGlwZWxpbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBpcGVsaW5lLmNsb3NlKCk7XG4gICAgICAgICAgICBwaXBlbGluZSA9IG5ldyBtZWRpYV9zdHJlYW1fbGlicmFyeV9icm93c2VyXzEuSHRtbDVWaWRlb1BpcGVsaW5lKHtcbiAgICAgICAgICAgICAgICB3czogeyB1cmk6IHRoaXMuX3dlYnNvY2tldFVyaSB9LFxuICAgICAgICAgICAgICAgIHJ0c3A6IHsgdXJpOiB1cmkgfSxcbiAgICAgICAgICAgICAgICBtZWRpYUVsZW1lbnQ6IHZpZGVvRWxlbWVudCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gUmVzdGFydCBzdHJlYW0gb24gUlRDUCBCWUUgKHN0cmVhbSBlbmRlZClcbiAgICAgICAgICAgIHBpcGVsaW5lLnJ0c3Aub25SdGNwID0gKHJ0Y3ApID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobWVkaWFfc3RyZWFtX2xpYnJhcnlfYnJvd3Nlcl8xLmlzUnRjcEJ5ZShydGNwKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVmlkZW8gc3RyZWFtIGVuZGVkLiBSZXN0YXJ0aW5nLicpO1xuICAgICAgICAgICAgICAgICAgICB2aWRlb0VsZW1lbnQucGF1c2UoKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChzdGFydFBpcGVsaW5lLCAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gU3RhcnQgcGxheWJhY2sgd2hlbiByZWFkeVxuICAgICAgICAgICAgcGlwZWxpbmUucmVhZHkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcGlwZWxpbmUucnRzcC5wbGF5KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgc3RhcnRQaXBlbGluZSgpO1xuICAgICAgICBpZiAocGFyYW1zLnBsYXliYWNrUmF0ZSkge1xuICAgICAgICAgICAgY29uc3QgcGxheWJhY2tSYXRlID0gKF9hID0gcGFyYW1zLnBsYXliYWNrUmF0ZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogREVGQVVMVF9WSURFT19QTEFZQkFDS19SQVRFO1xuICAgICAgICAgICAgdmlkZW9FbGVtZW50LnBsYXliYWNrUmF0ZSA9IHBsYXliYWNrUmF0ZTtcbiAgICAgICAgICAgIHZpZGVvRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdwbGF5JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5wbGF5YmFja1JhdGUgPSBwbGF5YmFja1JhdGU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVtb3ZlUmVzdGFydExpc3RlbmVycyA9IG51bGw7XG4gICAgICAgIGlmIChwYXJhbXMucmVzdGFydElmU3RvcHBlZCkge1xuICAgICAgICAgICAgbGV0IHBsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBpbnRlcnZhbCA9IG51bGw7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVUaW1lVXBkYXRlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHBsYXlpbmcgPSB0cnVlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZVBsYXkgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcGxheWluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RpbWV1cGRhdGUnLCBoYW5kbGVUaW1lVXBkYXRlKTtcbiAgICAgICAgICAgICAgICBpZiAoIWludGVydmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwbGF5aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1ZpZGVvIHN0b3BwZWQgcGxheWluZy4gUmVzdGFydGluZy4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0VsZW1lbnQucGF1c2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHN0YXJ0UGlwZWxpbmUsIDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGxheWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9LCAyMDAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlUGF1c2UgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RpbWV1cGRhdGUnLCBoYW5kbGVUaW1lVXBkYXRlKTtcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJ2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgICAgICAgICAgIGludGVydmFsID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmlkZW9FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BsYXknLCBoYW5kbGVQbGF5KTtcbiAgICAgICAgICAgIHZpZGVvRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdwYXVzZScsIGhhbmRsZVBhdXNlKTtcbiAgICAgICAgICAgIHJlbW92ZVJlc3RhcnRMaXN0ZW5lcnMgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlUGF1c2UoKTtcbiAgICAgICAgICAgICAgICB2aWRlb0VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGxheScsIGhhbmRsZVBsYXkpO1xuICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwYXVzZScsIGhhbmRsZVBhdXNlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNsb3NlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcGlwZWxpbmUgPT09IG51bGwgfHwgcGlwZWxpbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBpcGVsaW5lLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgcmVtb3ZlUmVzdGFydExpc3RlbmVycyA9PT0gbnVsbCB8fCByZW1vdmVSZXN0YXJ0TGlzdGVuZXJzID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZW1vdmVSZXN0YXJ0TGlzdGVuZXJzKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFJ0c3BTdHJlYW1lcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgdXJsc18xID0gcmVxdWlyZShcIi4vaGVscGVycy91cmxzXCIpO1xuY29uc3QgVmlkZW9TdGF0ZV8xID0gcmVxdWlyZShcIi4vdHlwZXMvVmlkZW9TdGF0ZVwiKTtcbmNvbnN0IERFRkFVTFRfUEFSRU5UX0VMRU1FTlQgPSBkb2N1bWVudC5ib2R5O1xuY2xhc3MgVmlkZW9QbGF5ZXIge1xuICAgIGNvbnN0cnVjdG9yKGNvZ3NDb25uZWN0aW9uLCBwYXJlbnRFbGVtZW50ID0gREVGQVVMVF9QQVJFTlRfRUxFTUVOVCkge1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0ID0gbmV3IEV2ZW50VGFyZ2V0KCk7XG4gICAgICAgIHRoaXMuZ2xvYmFsVm9sdW1lID0gMTtcbiAgICAgICAgdGhpcy52aWRlb0NsaXBQbGF5ZXJzID0ge307XG4gICAgICAgIHRoaXMuc2lua0lkID0gJyc7XG4gICAgICAgIHRoaXMucGFyZW50RWxlbWVudCA9IHBhcmVudEVsZW1lbnQ7XG4gICAgICAgIC8vIFNlbmQgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGVhY2ggY2xpcCB0byBDT0dTXG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigndmlkZW9DbGlwU3RhdGUnLCAoeyBkZXRhaWwgfSkgPT4ge1xuICAgICAgICAgICAgY29nc0Nvbm5lY3Rpb24uc2VuZE1lZGlhQ2xpcFN0YXRlKGRldGFpbCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBMaXN0ZW4gZm9yIHZpZGVvIGNvbnRyb2wgbWVzc2FnZXNcbiAgICAgICAgY29nc0Nvbm5lY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRldGFpbDtcbiAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbWVkaWFfY29uZmlnX3VwZGF0ZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0R2xvYmFsVm9sdW1lKG1lc3NhZ2UuZ2xvYmFsVm9sdW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXVkaW9PdXRwdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lua0lkID0gY29nc0Nvbm5lY3Rpb24uZ2V0QXVkaW9TaW5rSWQobWVzc2FnZS5hdWRpb091dHB1dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF1ZGlvU2luayhzaW5rSWQgIT09IG51bGwgJiYgc2lua0lkICE9PSB2b2lkIDAgPyBzaW5rSWQgOiAnJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDb25maWcobWVzc2FnZS5maWxlcyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3ZpZGVvX3BsYXknOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlWaWRlb0NsaXAobWVzc2FnZS5maWxlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF5SWQ6IG1lc3NhZ2UucGxheUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lOiBtZXNzYWdlLnZvbHVtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3A6IEJvb2xlYW4obWVzc2FnZS5sb29wKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpdDogbWVzc2FnZS5maXQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd2aWRlb19wYXVzZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGF1c2VWaWRlb0NsaXAoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndmlkZW9fc3RvcCc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcFZpZGVvQ2xpcCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd2aWRlb19zZXRfdm9sdW1lJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWaWRlb0NsaXBWb2x1bWUoeyB2b2x1bWU6IG1lc3NhZ2Uudm9sdW1lIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd2aWRlb19zZXRfZml0JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWaWRlb0NsaXBGaXQoeyBmaXQ6IG1lc3NhZ2UuZml0IH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIE9uIGNvbm5lY3Rpb24sIHNlbmQgdGhlIGN1cnJlbnQgcGxheWluZyBzdGF0ZSBvZiBhbGwgY2xpcHNcbiAgICAgICAgLy8gKFVzdWFsbHkgZW1wdHkgdW5sZXNzIHdlYnNvY2tldCBpcyByZWNvbm5lY3RpbmcpXG4gICAgICAgIGNvbnN0IHNlbmRJbml0aWFsQ2xpcFN0YXRlcyA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gT2JqZWN0LmVudHJpZXModGhpcy52aWRlb0NsaXBQbGF5ZXJzKS5tYXAoKFtmaWxlLCBwbGF5ZXJdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gIXBsYXllci52aWRlb0VsZW1lbnQucGF1c2VkXG4gICAgICAgICAgICAgICAgICAgID8gJ3BsYXlpbmcnXG4gICAgICAgICAgICAgICAgICAgIDogcGxheWVyLnZpZGVvRWxlbWVudC5jdXJyZW50VGltZSA9PT0gMCB8fCBwbGF5ZXIudmlkZW9FbGVtZW50LmN1cnJlbnRUaW1lID09PSBwbGF5ZXIudmlkZW9FbGVtZW50LmR1cmF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdwYXVzZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICdzdG9wcGVkJztcbiAgICAgICAgICAgICAgICByZXR1cm4gW2ZpbGUsIHN0YXR1c107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvZ3NDb25uZWN0aW9uLnNlbmRJbml0aWFsTWVkaWFDbGlwU3RhdGVzKHsgbWVkaWFUeXBlOiAndmlkZW8nLCBmaWxlcyB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29nc0Nvbm5lY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsIHNlbmRJbml0aWFsQ2xpcFN0YXRlcyk7XG4gICAgICAgIHNlbmRJbml0aWFsQ2xpcFN0YXRlcygpO1xuICAgIH1cbiAgICBzZXRQYXJlbnRFbGVtZW50KHBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50ID0gcGFyZW50RWxlbWVudDtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyh0aGlzLnZpZGVvQ2xpcFBsYXllcnMpLmZvckVhY2goKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoY2xpcFBsYXllci52aWRlb0VsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVzZXRQYXJlbnRFbGVtZW50KCkge1xuICAgICAgICB0aGlzLnNldFBhcmVudEVsZW1lbnQoREVGQVVMVF9QQVJFTlRfRUxFTUVOVCk7XG4gICAgfVxuICAgIHNldEdsb2JhbFZvbHVtZShnbG9iYWxWb2x1bWUpIHtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyh0aGlzLnZpZGVvQ2xpcFBsYXllcnMpLmZvckVhY2goKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgIHNldFZpZGVvRWxlbWVudFZvbHVtZShjbGlwUGxheWVyLnZpZGVvRWxlbWVudCwgY2xpcFBsYXllci52b2x1bWUgKiBnbG9iYWxWb2x1bWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5nbG9iYWxWb2x1bWUgPSBnbG9iYWxWb2x1bWU7XG4gICAgICAgIHRoaXMubm90aWZ5U3RhdGVMaXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgcGxheVZpZGVvQ2xpcChwYXRoLCB7IHBsYXlJZCwgdm9sdW1lLCBsb29wLCBmaXQgfSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICghdGhpcy52aWRlb0NsaXBQbGF5ZXJzW3BhdGhdKSB7XG4gICAgICAgICAgICB0aGlzLnZpZGVvQ2xpcFBsYXllcnNbcGF0aF0gPSB0aGlzLmNyZWF0ZUNsaXBQbGF5ZXIocGF0aCwgeyBwcmVsb2FkOiAnbm9uZScsIGVwaGVtZXJhbDogdHJ1ZSwgZml0IH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZXJlJ3MgYWxyZWFkeSBhIHBlbmRpbmcgY2xpcCwgd2hpY2ggaGFzIG5vdyBiZWVuIHN1cGVyc2VkZWQgYW5kIGFib3J0IHRoZSBwbGF5IG9wZXJhdGlvblxuICAgICAgICBpZiAodGhpcy5wZW5kaW5nQ2xpcCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWaWRlb0NsaXBQbGF5ZXIodGhpcy5wZW5kaW5nQ2xpcC5wYXRoLCAoY2xpcFBsYXllcikgPT4ge1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LmxvYWQoKTsgLy8gUmVzZXRzIHRoZSBtZWRpYSBlbGVtZW50XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOZXcgcGVuZGluZyBjbGlwIGlzIHZpZGVvIGJlaW5nIHJlcXVlc3RlZFxuICAgICAgICBpZiAoKChfYSA9IHRoaXMuYWN0aXZlQ2xpcCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBhdGgpICE9PSBwYXRoKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdDbGlwID0geyBwYXRoLCBwbGF5SWQsIGFjdGlvbk9uY2VQbGF5aW5nOiAncGxheScgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXR1cCBhbmQgcGxheSB0aGUgcGVuZGluZyBjbGlwJ3MgcGxheWVyXG4gICAgICAgIHRoaXMudXBkYXRlVmlkZW9DbGlwUGxheWVyKHBhdGgsIChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICBjbGlwUGxheWVyLnZvbHVtZSA9IHZvbHVtZTtcbiAgICAgICAgICAgIHNldFZpZGVvRWxlbWVudFZvbHVtZShjbGlwUGxheWVyLnZpZGVvRWxlbWVudCwgdm9sdW1lICogdGhpcy5nbG9iYWxWb2x1bWUpO1xuICAgICAgICAgICAgY2xpcFBsYXllci52aWRlb0VsZW1lbnQubG9vcCA9IGxvb3A7XG4gICAgICAgICAgICBjbGlwUGxheWVyLnZpZGVvRWxlbWVudC5zdHlsZS5vYmplY3RGaXQgPSBmaXQ7XG4gICAgICAgICAgICBpZiAoY2xpcFBsYXllci52aWRlb0VsZW1lbnQuY3VycmVudFRpbWUgPT09IGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LmR1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci52aWRlb0VsZW1lbnQuY3VycmVudFRpbWUgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xpcFBsYXllci52aWRlb0VsZW1lbnQucGxheSgpO1xuICAgICAgICAgICAgLy8gRGlzcGxheSByaWdodCBhd2F5IGlmIHRoZXJlJ3MgY3VycmVudGx5IG5vIGFjdGl2ZSBjbGlwXG4gICAgICAgICAgICBpZiAoIXRoaXMuYWN0aXZlQ2xpcCkge1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXI7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwYXVzZVZpZGVvQ2xpcCgpIHtcbiAgICAgICAgLy8gUGVuZGluZyBjbGlwIHNob3VsZCBiZSBwYXVzZWQgd2hlbiBpdCBsb2FkcyBhbmQgYmVjb21lcyBhY3RpdmVcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0NsaXApIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0NsaXAuYWN0aW9uT25jZVBsYXlpbmcgPSAncGF1c2UnO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBhdXNlIHRoZSBjdXJyZW50bHkgYWN0aXZlIGNsaXBcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlQ2xpcCkge1xuICAgICAgICAgICAgY29uc3QgeyBwbGF5SWQsIHBhdGggfSA9IHRoaXMuYWN0aXZlQ2xpcDtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmlkZW9DbGlwUGxheWVyKHBhdGgsIChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIChfYSA9IGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucGF1c2UoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnMocGxheUlkLCBwYXRoLCAncGF1c2VkJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RvcFZpZGVvQ2xpcCgpIHtcbiAgICAgICAgLy8gUGVuZGluZyBjbGlwIHNob3VsZCBiZSBzdG9wcGVkIHdoZW4gaXQgbG9hZHMgYW5kIGJlY29tZXMgYWN0aXZlXG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdDbGlwKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdDbGlwLmFjdGlvbk9uY2VQbGF5aW5nID0gJ3N0b3AnO1xuICAgICAgICB9XG4gICAgICAgIC8vIFN0b3AgdGhlIGN1cnJlbnRseSBhY3RpdmUgY2xpcFxuICAgICAgICBpZiAodGhpcy5hY3RpdmVDbGlwKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVN0b3BwZWRDbGlwKHRoaXMuYWN0aXZlQ2xpcC5wYXRoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRWaWRlb0NsaXBWb2x1bWUoeyB2b2x1bWUgfSkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHBlbmRpbmcgY2xpcCwgdGhpcyBpcyBsYXRlc3QgdG8gaGF2ZSBiZWVuIHBsYXllZCBzbyB1cGRhdGUgaXRzIHZvbHVtZVxuICAgICAgICBjb25zdCBjbGlwVG9VcGRhdGUgPSAoX2IgPSAoX2EgPSB0aGlzLnBlbmRpbmdDbGlwKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLmFjdGl2ZUNsaXApICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFjbGlwVG9VcGRhdGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISh2b2x1bWUgPj0gMCAmJiB2b2x1bWUgPD0gMSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCB2b2x1bWUnLCB2b2x1bWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlVmlkZW9DbGlwUGxheWVyKGNsaXBUb1VwZGF0ZS5wYXRoLCAoY2xpcFBsYXllcikgPT4ge1xuICAgICAgICAgICAgaWYgKGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci52b2x1bWUgPSB2b2x1bWU7XG4gICAgICAgICAgICAgICAgc2V0VmlkZW9FbGVtZW50Vm9sdW1lKGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LCB2b2x1bWUgKiB0aGlzLmdsb2JhbFZvbHVtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNldFZpZGVvQ2xpcEZpdCh7IGZpdCB9KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcGVuZGluZyBjbGlwLCB0aGlzIGlzIGxhdGVzdCB0byBoYXZlIGJlZW4gcGxheWVkIHNvIHVwZGF0ZSBpdHMgZml0XG4gICAgICAgIGNvbnN0IGNsaXBUb1VwZGF0ZSA9IChfYiA9IChfYSA9IHRoaXMucGVuZGluZ0NsaXApICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuYWN0aXZlQ2xpcCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAoIWNsaXBUb1VwZGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlVmlkZW9DbGlwUGxheWVyKGNsaXBUb1VwZGF0ZS5wYXRoLCAoY2xpcFBsYXllcikgPT4ge1xuICAgICAgICAgICAgaWYgKGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci52aWRlb0VsZW1lbnQuc3R5bGUub2JqZWN0Rml0ID0gZml0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXI7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBoYW5kbGVTdG9wcGVkQ2xpcChwYXRoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZUNsaXAgfHwgdGhpcy5hY3RpdmVDbGlwLnBhdGggIT09IHBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwbGF5SWQgPSB0aGlzLmFjdGl2ZUNsaXAucGxheUlkO1xuICAgICAgICAvLyBPbmNlIGFuIGVwaGVtZXJhbCBjbGlwIHN0b3BzLCBjbGVhbnVwIGFuZCByZW1vdmUgdGhlIHBsYXllclxuICAgICAgICBpZiAoKF9hID0gdGhpcy52aWRlb0NsaXBQbGF5ZXJzW3RoaXMuYWN0aXZlQ2xpcC5wYXRoXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNvbmZpZy5lcGhlbWVyYWwpIHtcbiAgICAgICAgICAgIHRoaXMudW5sb2FkQ2xpcChwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjdGl2ZUNsaXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudXBkYXRlVmlkZW9DbGlwUGxheWVyKHBhdGgsIChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICBjbGlwUGxheWVyLnZpZGVvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICAgICAgY2xpcFBsYXllci52aWRlb0VsZW1lbnQuY3VycmVudFRpbWUgPSAwO1xuICAgICAgICAgICAgY2xpcFBsYXllci52aWRlb0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVyO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnMocGxheUlkLCBwYXRoLCAnc3RvcHBlZCcpO1xuICAgIH1cbiAgICB1cGRhdGVWaWRlb0NsaXBQbGF5ZXIocGF0aCwgdXBkYXRlKSB7XG4gICAgICAgIGlmICh0aGlzLnZpZGVvQ2xpcFBsYXllcnNbcGF0aF0pIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1BsYXllciA9IHVwZGF0ZSh0aGlzLnZpZGVvQ2xpcFBsYXllcnNbcGF0aF0pO1xuICAgICAgICAgICAgaWYgKG5ld1BsYXllcikge1xuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9DbGlwUGxheWVyc1twYXRoXSA9IG5ld1BsYXllcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZpZGVvQ2xpcFBsYXllcnNbcGF0aF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm5vdGlmeVN0YXRlTGlzdGVuZXJzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0QXVkaW9TaW5rKHNpbmtJZCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNsaXBQbGF5ZXIgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLnZpZGVvQ2xpcFBsYXllcnMpKSB7XG4gICAgICAgICAgICBzZXRQbGF5ZXJTaW5rSWQoY2xpcFBsYXllciwgc2lua0lkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNpbmtJZCA9IHNpbmtJZDtcbiAgICB9XG4gICAgdXBkYXRlQ29uZmlnKG5ld1BhdGhzKSB7XG4gICAgICAgIGNvbnN0IG5ld1ZpZGVvUGF0aHMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMobmV3UGF0aHMpLmZpbHRlcigoWywgeyB0eXBlIH1dKSA9PiB0eXBlID09PSAndmlkZW8nIHx8ICF0eXBlKSk7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzQ2xpcFBsYXllcnMgPSB0aGlzLnZpZGVvQ2xpcFBsYXllcnM7XG4gICAgICAgIHRoaXMudmlkZW9DbGlwUGxheWVycyA9ICgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjbGlwUGxheWVycyA9IHsgLi4ucHJldmlvdXNDbGlwUGxheWVycyB9O1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZENsaXBzID0gT2JqZWN0LmtleXMocHJldmlvdXNDbGlwUGxheWVycykuZmlsdGVyKChwcmV2aW91c1BhdGgpID0+ICEocHJldmlvdXNQYXRoIGluIG5ld1ZpZGVvUGF0aHMpKTtcbiAgICAgICAgICAgIHJlbW92ZWRDbGlwcy5mb3JFYWNoKChwYXRoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgICAgICBpZiAoKChfYSA9IHRoaXMuYWN0aXZlQ2xpcCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBhdGgpID09PSBwYXRoICYmICgoX2IgPSBwcmV2aW91c0NsaXBQbGF5ZXJzW3BhdGhdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY29uZmlnLmVwaGVtZXJhbCkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmlkZW9DbGlwUGxheWVyKHBhdGgsIChwbGF5ZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllci5jb25maWcgPSB7IC4uLnBsYXllci5jb25maWcsIGVwaGVtZXJhbDogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXllcjtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVubG9hZENsaXAocGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjbGlwUGxheWVyc1twYXRoXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGFkZGVkQ2xpcHMgPSBPYmplY3QuZW50cmllcyhuZXdWaWRlb1BhdGhzKS5maWx0ZXIoKFtuZXdGaWxlXSkgPT4gIXByZXZpb3VzQ2xpcFBsYXllcnNbbmV3RmlsZV0pO1xuICAgICAgICAgICAgYWRkZWRDbGlwcy5mb3JFYWNoKChbcGF0aCwgY29uZmlnXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXJzW3BhdGhdID0gdGhpcy5jcmVhdGVDbGlwUGxheWVyKHBhdGgsIHsgLi4uY29uZmlnLCBwcmVsb2FkOiBwcmVsb2FkU3RyaW5nKGNvbmZpZy5wcmVsb2FkKSwgZXBoZW1lcmFsOiBmYWxzZSwgZml0OiAnY29udGFpbicgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRDbGlwcyA9IE9iamVjdC5lbnRyaWVzKHByZXZpb3VzQ2xpcFBsYXllcnMpLmZpbHRlcigoW3ByZXZpb3VzUGF0aF0pID0+IHByZXZpb3VzUGF0aCBpbiBuZXdWaWRlb1BhdGhzKTtcbiAgICAgICAgICAgIHVwZGF0ZWRDbGlwcy5mb3JFYWNoKChbcGF0aCwgcHJldmlvdXNDbGlwUGxheWVyXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c0NsaXBQbGF5ZXIuY29uZmlnLnByZWxvYWQgIT09IG5ld1ZpZGVvUGF0aHNbcGF0aF0ucHJlbG9hZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZGVvQ2xpcFBsYXllcihwYXRoLCAocGxheWVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIuY29uZmlnID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnBsYXllci5jb25maWcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZDogcHJlbG9hZFN0cmluZyhuZXdWaWRlb1BhdGhzW3BhdGhdLnByZWxvYWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwaGVtZXJhbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyLnZpZGVvRWxlbWVudC5wcmVsb2FkID0gcGxheWVyLmNvbmZpZy5wcmVsb2FkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXllcjtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcnM7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIHRoaXMubm90aWZ5U3RhdGVMaXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgbm90aWZ5U3RhdGVMaXN0ZW5lcnMoKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZztcbiAgICAgICAgY29uc3QgVmlkZW9TdGF0ZSA9IHtcbiAgICAgICAgICAgIGdsb2JhbFZvbHVtZTogdGhpcy5nbG9iYWxWb2x1bWUsXG4gICAgICAgICAgICBpc1BsYXlpbmc6IHRoaXMuYWN0aXZlQ2xpcCA/ICEoKF9hID0gdGhpcy52aWRlb0NsaXBQbGF5ZXJzW3RoaXMuYWN0aXZlQ2xpcC5wYXRoXS52aWRlb0VsZW1lbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wYXVzZWQpIDogZmFsc2UsXG4gICAgICAgICAgICBjbGlwczogeyAuLi50aGlzLnZpZGVvQ2xpcFBsYXllcnMgfSxcbiAgICAgICAgICAgIGFjdGl2ZUNsaXA6IHRoaXMuYWN0aXZlQ2xpcFxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiB0aGlzLmFjdGl2ZUNsaXAucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6ICEoKF9iID0gdGhpcy52aWRlb0NsaXBQbGF5ZXJzW3RoaXMuYWN0aXZlQ2xpcC5wYXRoXS52aWRlb0VsZW1lbnQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5wYXVzZWQpID8gVmlkZW9TdGF0ZV8xLkFjdGl2ZVZpZGVvQ2xpcFN0YXRlLlBsYXlpbmcgOiBWaWRlb1N0YXRlXzEuQWN0aXZlVmlkZW9DbGlwU3RhdGUuUGF1c2VkLFxuICAgICAgICAgICAgICAgICAgICBsb29wOiAoX2QgPSAoX2MgPSB0aGlzLnZpZGVvQ2xpcFBsYXllcnNbdGhpcy5hY3RpdmVDbGlwLnBhdGhdLnZpZGVvRWxlbWVudCkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmxvb3ApICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB2b2x1bWU6ICgoX2UgPSB0aGlzLnZpZGVvQ2xpcFBsYXllcnNbdGhpcy5hY3RpdmVDbGlwLnBhdGhdLnZpZGVvRWxlbWVudCkgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLm11dGVkKSA/IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogKF9nID0gKF9mID0gdGhpcy52aWRlb0NsaXBQbGF5ZXJzW3RoaXMuYWN0aXZlQ2xpcC5wYXRoXS52aWRlb0VsZW1lbnQpID09PSBudWxsIHx8IF9mID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZi52b2x1bWUpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IDAsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ3N0YXRlJywgVmlkZW9TdGF0ZSk7XG4gICAgfVxuICAgIG5vdGlmeUNsaXBTdGF0ZUxpc3RlbmVycyhwbGF5SWQsIGZpbGUsIHN0YXR1cykge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ3ZpZGVvQ2xpcFN0YXRlJywgeyBwbGF5SWQsIG1lZGlhVHlwZTogJ3ZpZGVvJywgZmlsZSwgc3RhdHVzIH0pO1xuICAgIH1cbiAgICAvLyBUeXBlLXNhZmUgd3JhcHBlciBhcm91bmQgRXZlbnRUYXJnZXRcbiAgICBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5ldmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICB9XG4gICAgZGlzcGF0Y2hFdmVudCh0eXBlLCBkZXRhaWwpIHtcbiAgICAgICAgdGhpcy5ldmVudFRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCh0eXBlLCB7IGRldGFpbCB9KSk7XG4gICAgfVxuICAgIGNyZWF0ZVZpZGVvRWxlbWVudChwYXRoLCBjb25maWcsIHsgdm9sdW1lIH0pIHtcbiAgICAgICAgY29uc3QgdmlkZW9FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcbiAgICAgICAgdmlkZW9FbGVtZW50LnBsYXlzSW5saW5lID0gdHJ1ZTsgLy8gUmVxdWlyZWQgZm9yIGlPU1xuICAgICAgICB2aWRlb0VsZW1lbnQuc3JjID0gdXJsc18xLmFzc2V0VXJsKHBhdGgpO1xuICAgICAgICB2aWRlb0VsZW1lbnQuYXV0b3BsYXkgPSBmYWxzZTtcbiAgICAgICAgdmlkZW9FbGVtZW50Lmxvb3AgPSBmYWxzZTtcbiAgICAgICAgc2V0VmlkZW9FbGVtZW50Vm9sdW1lKHZpZGVvRWxlbWVudCwgdm9sdW1lICogdGhpcy5nbG9iYWxWb2x1bWUpO1xuICAgICAgICB2aWRlb0VsZW1lbnQucHJlbG9hZCA9IGNvbmZpZy5wcmVsb2FkO1xuICAgICAgICB2aWRlb0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncGxheWluZycsICgpID0+IHtcbiAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICAvLyBJZiB0aGUgY2xpcCBpcyBzdGlsbCB0aGUgcGVuZGluZyBvbmUgd2hlbiBpdCBhY3R1YWxseSBzdGFydCBwbGF5aW5nLCB0aGVuIGVuc3VyZSBpdCBpcyBpbiB0aGUgY29ycmVjdCBzdGF0ZVxuICAgICAgICAgICAgaWYgKCgoX2EgPSB0aGlzLnBlbmRpbmdDbGlwKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucGF0aCkgPT09IHBhdGgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMucGVuZGluZ0NsaXAuYWN0aW9uT25jZVBsYXlpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncGxheSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlIHBsYXlpbmcsIHNob3cgdGhlIHZpZGVvIGVsZW1lbnQsIGFuZCBub3RpZnkgbGlzdGVuZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNsaXBTdGF0ZUxpc3RlbmVycyh0aGlzLnBlbmRpbmdDbGlwLnBsYXlJZCwgcGF0aCwgJ3BsYXlpbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3BhdXNlJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGF1c2UgcGxheWJhY2ssIHNob3cgdGhlIHZpZGVvIGVsZW1lbnQsIGFuZCBub3RpZnkgbGlzdGVuZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0VsZW1lbnQucGF1c2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2xpcFN0YXRlTGlzdGVuZXJzKHRoaXMucGVuZGluZ0NsaXAucGxheUlkLCBwYXRoLCAncGF1c2VkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlICdzdG9wJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGF1c2UgcGxheWJhY2ssIGxlYXZlIHRoZSB2aWRlbyBlbGVtZW50IGhpZGRlbiwgYW5kIG5vdGlmeSBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnModGhpcy5wZW5kaW5nQ2xpcC5wbGF5SWQsIHBhdGgsICdzdG9wcGVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSB3YXMgYSBwcmV2aW91c2x5IGFjdGl2ZSBjbGlwLCB0aGVuIHN0b3AgaXRcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVDbGlwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU3RvcHBlZENsaXAodGhpcy5hY3RpdmVDbGlwLnBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUNsaXAgPSB0aGlzLnBlbmRpbmdDbGlwO1xuICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgoKF9iID0gdGhpcy5hY3RpdmVDbGlwKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IucGF0aCkgPT09IHBhdGgpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSB3ZXJlIHRoZSBhY3RpdmUgY2xpcCB0aGVuIGp1c3Qgbm90aWZ5IGxpc3RlbmVycyB0aGF0IHdlIGFyZSBub3cgcGxheWluZ1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2xpcFN0YXRlTGlzdGVuZXJzKHRoaXMuYWN0aXZlQ2xpcC5wbGF5SWQsIHBhdGgsICdwbGF5aW5nJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgaXQgc2hvdWxkbid0IGJlIHBsYXlpbmcsIGxpa2UgYmVjYXVzZSBhbm90aGVyIGNsaXAgYmVjYW1lIHBlbmRpbmcgYmVmb3JlIHdlIGxvYWRlZCxcbiAgICAgICAgICAgICAgICAvLyBzbyB3ZSBwYXVzZSBhbmQgZG9uJ3Qgc2hvdyBvciBub3RpZnkgbGlzdGVuZXJzXG4gICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50LnBhdXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB2aWRlb0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgaWYgdGhlcmUncyBhIHBlbmRpbmcgY2xpcCwgYXMgb25jZSB0aGF0IHN0YXJ0cyBwbGF5aW5nIHRoZSBhY3RpdmUgY2xpcCB3aWxsIGJlIHN0b3BwZWRcbiAgICAgICAgICAgIC8vIEFsc28gaWdub3JlIGlmIHRoZSB2aWRlbyBpcyBzZXQgdG8gbG9vcFxuICAgICAgICAgICAgaWYgKCF0aGlzLnBlbmRpbmdDbGlwICYmICF2aWRlb0VsZW1lbnQubG9vcCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU3RvcHBlZENsaXAocGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB2aWRlb0VsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICB2aWRlb0VsZW1lbnQuc3R5bGUudG9wID0gJzAnO1xuICAgICAgICB2aWRlb0VsZW1lbnQuc3R5bGUubGVmdCA9ICcwJztcbiAgICAgICAgdmlkZW9FbGVtZW50LnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgICB2aWRlb0VsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xuICAgICAgICB2aWRlb0VsZW1lbnQuc3R5bGUub2JqZWN0Rml0ID0gY29uZmlnLmZpdDtcbiAgICAgICAgdmlkZW9FbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIHRoaXMucGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZCh2aWRlb0VsZW1lbnQpO1xuICAgICAgICByZXR1cm4gdmlkZW9FbGVtZW50O1xuICAgIH1cbiAgICBjcmVhdGVDbGlwUGxheWVyKHBhdGgsIGNvbmZpZykge1xuICAgICAgICBjb25zdCB2b2x1bWUgPSAxO1xuICAgICAgICBjb25zdCBwbGF5ZXIgPSB7XG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICB2aWRlb0VsZW1lbnQ6IHRoaXMuY3JlYXRlVmlkZW9FbGVtZW50KHBhdGgsIGNvbmZpZywgeyB2b2x1bWUgfSksXG4gICAgICAgICAgICB2b2x1bWUsXG4gICAgICAgIH07XG4gICAgICAgIHNldFBsYXllclNpbmtJZChwbGF5ZXIsIHRoaXMuc2lua0lkKTtcbiAgICAgICAgcmV0dXJuIHBsYXllcjtcbiAgICB9XG4gICAgdW5sb2FkQ2xpcChwYXRoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGlmICgoKF9hID0gdGhpcy5hY3RpdmVDbGlwKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucGF0aCkgPT09IHBhdGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHBsYXlJZCA9IHRoaXMuYWN0aXZlQ2xpcC5wbGF5SWQ7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUNsaXAgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNsaXBTdGF0ZUxpc3RlbmVycyhwbGF5SWQsIHBhdGgsICdzdG9wcGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgKF9iID0gdGhpcy52aWRlb0NsaXBQbGF5ZXJzW3BhdGhdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IudmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICB0aGlzLnVwZGF0ZVZpZGVvQ2xpcFBsYXllcihwYXRoLCAoKSA9PiBudWxsKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBWaWRlb1BsYXllcjtcbmZ1bmN0aW9uIHByZWxvYWRTdHJpbmcocHJlbG9hZCkge1xuICAgIHJldHVybiB0eXBlb2YgcHJlbG9hZCA9PT0gJ3N0cmluZycgPyBwcmVsb2FkIDogcHJlbG9hZCA/ICdhdXRvJyA6ICdub25lJztcbn1cbmZ1bmN0aW9uIHNldFBsYXllclNpbmtJZChwbGF5ZXIsIHNpbmtJZCkge1xuICAgIGlmIChzaW5rSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGxheWVyLnZpZGVvRWxlbWVudC5zZXRTaW5rSWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcGxheWVyLnZpZGVvRWxlbWVudC5zZXRTaW5rSWQoc2lua0lkKTtcbiAgICB9XG59XG4vKipcbiAqIFNldCB2aWRlbyB2b2x1bWVcbiAqXG4gKiBUaGlzIGRvZXNuJ3Qgd29yayBvbiBpT1MgKHZvbHVtZSBpcyByZWFkLW9ubHkpIHNvIGF0IGxlYXN0IG11dGUgaXQgaWYgdGhlIHZvbHVtZSBpcyB6ZXJvXG4gKi9cbmZ1bmN0aW9uIHNldFZpZGVvRWxlbWVudFZvbHVtZSh2aWRlb0VsZW1lbnQsIHZvbHVtZSkge1xuICAgIHZpZGVvRWxlbWVudC52b2x1bWUgPSB2b2x1bWU7XG4gICAgdmlkZW9FbGVtZW50Lm11dGVkID0gdm9sdW1lID09PSAwO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnByZWxvYWRVcmwgPSBleHBvcnRzLmFzc2V0VXJsID0gZXhwb3J0cy5DT0dTX1NFUlZFUl9QT1JUID0gdm9pZCAwO1xuZXhwb3J0cy5DT0dTX1NFUlZFUl9QT1JUID0gMTIwOTU7XG5mdW5jdGlvbiBhc3NldFVybChmaWxlKSB7XG4gICAgY29uc3QgbG9jYXRpb24gPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdy5sb2NhdGlvbiA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gYCR7bG9jYXRpb24gPT09IG51bGwgfHwgbG9jYXRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxvY2F0aW9uLnByb3RvY29sfS8vJHtsb2NhdGlvbiA9PT0gbnVsbCB8fCBsb2NhdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogbG9jYXRpb24uaG9zdG5hbWV9OiR7ZXhwb3J0cy5DT0dTX1NFUlZFUl9QT1JUfS9hc3NldHMvJHtlbmNvZGVVUklDb21wb25lbnQoZmlsZSl9YDtcbn1cbmV4cG9ydHMuYXNzZXRVcmwgPSBhc3NldFVybDtcbmFzeW5jIGZ1bmN0aW9uIHByZWxvYWRVcmwodXJsKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgIC8vIFdlIHVzZWQgYXJyYXlCdWZmZXIoKWAgaW5zdGVhZCBvZiBgYmxvYigpYCBiZWNhdXNlIHRoZSBsYXR0ZXIgc2VlbXMgdG8gZmFpbCBvbiBQaXMgd2hlbiBwcmVsb2FkaW5nIHNvbWUgZmlsZXNcbiAgICByZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKV0pKTtcbn1cbmV4cG9ydHMucHJlbG9hZFVybCA9IHByZWxvYWRVcmw7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wcmVsb2FkVXJsID0gZXhwb3J0cy5hc3NldFVybCA9IGV4cG9ydHMuQ29nc1ZpZGVvUGxheWVyID0gZXhwb3J0cy5MSVZFX1ZJREVPX1BMQVlCQUNLX1JBVEUgPSBleHBvcnRzLkNvZ3NSdHNwU3RyZWFtZXIgPSBleHBvcnRzLkNvZ3NBdWRpb1BsYXllciA9IGV4cG9ydHMuQ29nc0Nvbm5lY3Rpb24gPSB2b2lkIDA7XG52YXIgQ29nc0Nvbm5lY3Rpb25fMSA9IHJlcXVpcmUoXCIuL0NvZ3NDb25uZWN0aW9uXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29nc0Nvbm5lY3Rpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9faW1wb3J0RGVmYXVsdChDb2dzQ29ubmVjdGlvbl8xKS5kZWZhdWx0OyB9IH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3R5cGVzL3ZhbHVlVHlwZXNcIiksIGV4cG9ydHMpO1xudmFyIEF1ZGlvUGxheWVyXzEgPSByZXF1aXJlKFwiLi9BdWRpb1BsYXllclwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvZ3NBdWRpb1BsYXllclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gX19pbXBvcnREZWZhdWx0KEF1ZGlvUGxheWVyXzEpLmRlZmF1bHQ7IH0gfSk7XG52YXIgUnRzcFN0cmVhbWVyXzEgPSByZXF1aXJlKFwiLi9SdHNwU3RyZWFtZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb2dzUnRzcFN0cmVhbWVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2ltcG9ydERlZmF1bHQoUnRzcFN0cmVhbWVyXzEpLmRlZmF1bHQ7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJMSVZFX1ZJREVPX1BMQVlCQUNLX1JBVEVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFJ0c3BTdHJlYW1lcl8xLkxJVkVfVklERU9fUExBWUJBQ0tfUkFURTsgfSB9KTtcbnZhciBWaWRlb1BsYXllcl8xID0gcmVxdWlyZShcIi4vVmlkZW9QbGF5ZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb2dzVmlkZW9QbGF5ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9faW1wb3J0RGVmYXVsdChWaWRlb1BsYXllcl8xKS5kZWZhdWx0OyB9IH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3R5cGVzL0F1ZGlvU3RhdGVcIiksIGV4cG9ydHMpO1xudmFyIHVybHNfMSA9IHJlcXVpcmUoXCIuL2hlbHBlcnMvdXJsc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImFzc2V0VXJsXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB1cmxzXzEuYXNzZXRVcmw7IH0gfSk7XG52YXIgdXJsc18yID0gcmVxdWlyZShcIi4vaGVscGVycy91cmxzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwicHJlbG9hZFVybFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdXJsc18yLnByZWxvYWRVcmw7IH0gfSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5BY3RpdmVWaWRlb0NsaXBTdGF0ZSA9IHZvaWQgMDtcbnZhciBBY3RpdmVWaWRlb0NsaXBTdGF0ZTtcbihmdW5jdGlvbiAoQWN0aXZlVmlkZW9DbGlwU3RhdGUpIHtcbiAgICBBY3RpdmVWaWRlb0NsaXBTdGF0ZVtcIlBhdXNlZFwiXSA9IFwicGF1c2VkXCI7XG4gICAgQWN0aXZlVmlkZW9DbGlwU3RhdGVbXCJQbGF5aW5nXCJdID0gXCJwbGF5aW5nXCI7XG59KShBY3RpdmVWaWRlb0NsaXBTdGF0ZSA9IGV4cG9ydHMuQWN0aXZlVmlkZW9DbGlwU3RhdGUgfHwgKGV4cG9ydHMuQWN0aXZlVmlkZW9DbGlwU3RhdGUgPSB7fSkpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNob3dQaGFzZSA9IHZvaWQgMDtcbnZhciBTaG93UGhhc2U7XG4oZnVuY3Rpb24gKFNob3dQaGFzZSkge1xuICAgIFNob3dQaGFzZVtcIlNldHVwXCJdID0gXCJzZXR1cFwiO1xuICAgIFNob3dQaGFzZVtcIlByZXNob3dcIl0gPSBcInByZS1zaG93XCI7XG4gICAgU2hvd1BoYXNlW1wiSW5Qcm9ncmVzc1wiXSA9IFwiaW4gcHJvZ3Jlc3NcIjtcbiAgICBTaG93UGhhc2VbXCJGaW5pc2hlZFwiXSA9IFwiZmluaXNoZWRcIjtcbn0pKFNob3dQaGFzZSA9IGV4cG9ydHMuU2hvd1BoYXNlIHx8IChleHBvcnRzLlNob3dQaGFzZSA9IHt9KSk7XG4iLCJ2YXIgZmE9T2JqZWN0LmNyZWF0ZTt2YXIgRnQ9T2JqZWN0LmRlZmluZVByb3BlcnR5O3ZhciBjYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO3ZhciBsYT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lczt2YXIgZGE9T2JqZWN0LmdldFByb3RvdHlwZU9mLHBhPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIGhhPShyLGUpPT4oKT0+KHImJihlPXIocj0wKSksZSk7dmFyIFM9KHIsZSk9PigpPT4oZXx8cigoZT17ZXhwb3J0czp7fX0pLmV4cG9ydHMsZSksZS5leHBvcnRzKSxQdD0ocixlKT0+e2Zvcih2YXIgdCBpbiBlKUZ0KHIsdCx7Z2V0OmVbdF0sZW51bWVyYWJsZTohMH0pfSxzaT0ocixlLHQsbik9PntpZihlJiZ0eXBlb2YgZT09XCJvYmplY3RcInx8dHlwZW9mIGU9PVwiZnVuY3Rpb25cIilmb3IobGV0IGkgb2YgbGEoZSkpIXBhLmNhbGwocixpKSYmaSE9PXQmJkZ0KHIsaSx7Z2V0OigpPT5lW2ldLGVudW1lcmFibGU6IShuPWNhKGUsaSkpfHxuLmVudW1lcmFibGV9KTtyZXR1cm4gcn07dmFyIEM9KHIsZSx0KT0+KHQ9ciE9bnVsbD9mYShkYShyKSk6e30sc2koZXx8IXJ8fCFyLl9fZXNNb2R1bGU/RnQodCxcImRlZmF1bHRcIix7dmFsdWU6cixlbnVtZXJhYmxlOiEwfSk6dCxyKSksbWE9cj0+c2koRnQoe30sXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSkscik7dmFyIGZpPVMoa3Q9PntcInVzZSBzdHJpY3RcIjtjKCk7a3QuYnl0ZUxlbmd0aD15YTtrdC50b0J5dGVBcnJheT14YTtrdC5mcm9tQnl0ZUFycmF5PXZhO3ZhciBuZT1bXSxLPVtdLGdhPXR5cGVvZiBVaW50OEFycmF5PFwidVwiP1VpbnQ4QXJyYXk6QXJyYXksVnI9XCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCI7Zm9yKEZlPTAsYWk9VnIubGVuZ3RoO0ZlPGFpOysrRmUpbmVbRmVdPVZyW0ZlXSxLW1ZyLmNoYXJDb2RlQXQoRmUpXT1GZTt2YXIgRmUsYWk7S1tcIi1cIi5jaGFyQ29kZUF0KDApXT02MjtLW1wiX1wiLmNoYXJDb2RlQXQoMCldPTYzO2Z1bmN0aW9uIHVpKHIpe3ZhciBlPXIubGVuZ3RoO2lmKGUlND4wKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDRcIik7dmFyIHQ9ci5pbmRleE9mKFwiPVwiKTt0PT09LTEmJih0PWUpO3ZhciBuPXQ9PT1lPzA6NC10JTQ7cmV0dXJuW3Qsbl19ZnVuY3Rpb24geWEocil7dmFyIGU9dWkociksdD1lWzBdLG49ZVsxXTtyZXR1cm4odCtuKSozLzQtbn1mdW5jdGlvbiBiYShyLGUsdCl7cmV0dXJuKGUrdCkqMy80LXR9ZnVuY3Rpb24geGEocil7dmFyIGUsdD11aShyKSxuPXRbMF0saT10WzFdLG89bmV3IGdhKGJhKHIsbixpKSkscz0wLGE9aT4wP24tNDpuLHU7Zm9yKHU9MDt1PGE7dSs9NCllPUtbci5jaGFyQ29kZUF0KHUpXTw8MTh8S1tyLmNoYXJDb2RlQXQodSsxKV08PDEyfEtbci5jaGFyQ29kZUF0KHUrMildPDw2fEtbci5jaGFyQ29kZUF0KHUrMyldLG9bcysrXT1lPj4xNiYyNTUsb1tzKytdPWU+PjgmMjU1LG9bcysrXT1lJjI1NTtyZXR1cm4gaT09PTImJihlPUtbci5jaGFyQ29kZUF0KHUpXTw8MnxLW3IuY2hhckNvZGVBdCh1KzEpXT4+NCxvW3MrK109ZSYyNTUpLGk9PT0xJiYoZT1LW3IuY2hhckNvZGVBdCh1KV08PDEwfEtbci5jaGFyQ29kZUF0KHUrMSldPDw0fEtbci5jaGFyQ29kZUF0KHUrMildPj4yLG9bcysrXT1lPj44JjI1NSxvW3MrK109ZSYyNTUpLG99ZnVuY3Rpb24gX2Eocil7cmV0dXJuIG5lW3I+PjE4JjYzXStuZVtyPj4xMiY2M10rbmVbcj4+NiY2M10rbmVbciY2M119ZnVuY3Rpb24gd2EocixlLHQpe2Zvcih2YXIgbixpPVtdLG89ZTtvPHQ7bys9MyluPShyW29dPDwxNiYxNjcxMTY4MCkrKHJbbysxXTw8OCY2NTI4MCkrKHJbbysyXSYyNTUpLGkucHVzaChfYShuKSk7cmV0dXJuIGkuam9pbihcIlwiKX1mdW5jdGlvbiB2YShyKXtmb3IodmFyIGUsdD1yLmxlbmd0aCxuPXQlMyxpPVtdLG89MTYzODMscz0wLGE9dC1uO3M8YTtzKz1vKWkucHVzaCh3YShyLHMscytvPmE/YTpzK28pKTtyZXR1cm4gbj09PTE/KGU9clt0LTFdLGkucHVzaChuZVtlPj4yXStuZVtlPDw0JjYzXStcIj09XCIpKTpuPT09MiYmKGU9KHJbdC0yXTw8OCkrclt0LTFdLGkucHVzaChuZVtlPj4xMF0rbmVbZT4+NCY2M10rbmVbZTw8MiY2M10rXCI9XCIpKSxpLmpvaW4oXCJcIil9fSk7dmFyIGNpPVMoenI9PntjKCk7enIucmVhZD1mdW5jdGlvbihyLGUsdCxuLGkpe3ZhciBvLHMsYT1pKjgtbi0xLHU9KDE8PGEpLTEsZj11Pj4xLGw9LTcsZD10P2ktMTowLGg9dD8tMToxLG09cltlK2RdO2ZvcihkKz1oLG89bSYoMTw8LWwpLTEsbT4+PS1sLGwrPWE7bD4wO289byoyNTYrcltlK2RdLGQrPWgsbC09OCk7Zm9yKHM9byYoMTw8LWwpLTEsbz4+PS1sLGwrPW47bD4wO3M9cyoyNTYrcltlK2RdLGQrPWgsbC09OCk7aWYobz09PTApbz0xLWY7ZWxzZXtpZihvPT09dSlyZXR1cm4gcz9OYU46KG0/LTE6MSkqKDEvMCk7cz1zK01hdGgucG93KDIsbiksbz1vLWZ9cmV0dXJuKG0/LTE6MSkqcypNYXRoLnBvdygyLG8tbil9O3pyLndyaXRlPWZ1bmN0aW9uKHIsZSx0LG4saSxvKXt2YXIgcyxhLHUsZj1vKjgtaS0xLGw9KDE8PGYpLTEsZD1sPj4xLGg9aT09PTIzP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxtPW4/MDpvLTEsYj1uPzE6LTEseT1lPDB8fGU9PT0wJiYxL2U8MD8xOjA7Zm9yKGU9TWF0aC5hYnMoZSksaXNOYU4oZSl8fGU9PT0xLzA/KGE9aXNOYU4oZSk/MTowLHM9bCk6KHM9TWF0aC5mbG9vcihNYXRoLmxvZyhlKS9NYXRoLkxOMiksZSoodT1NYXRoLnBvdygyLC1zKSk8MSYmKHMtLSx1Kj0yKSxzK2Q+PTE/ZSs9aC91OmUrPWgqTWF0aC5wb3coMiwxLWQpLGUqdT49MiYmKHMrKyx1Lz0yKSxzK2Q+PWw/KGE9MCxzPWwpOnMrZD49MT8oYT0oZSp1LTEpKk1hdGgucG93KDIsaSkscz1zK2QpOihhPWUqTWF0aC5wb3coMixkLTEpKk1hdGgucG93KDIsaSkscz0wKSk7aT49ODtyW3QrbV09YSYyNTUsbSs9YixhLz0yNTYsaS09OCk7Zm9yKHM9czw8aXxhLGYrPWk7Zj4wO3JbdCttXT1zJjI1NSxtKz1iLHMvPTI1NixmLT04KTtyW3QrbS1iXXw9eSoxMjh9fSk7dmFyIFhlPVMoS2U9PntcInVzZSBzdHJpY3RcIjtjKCk7dmFyIFlyPWZpKCksemU9Y2koKSxsaT10eXBlb2YgU3ltYm9sPT1cImZ1bmN0aW9uXCImJnR5cGVvZiBTeW1ib2wuZm9yPT1cImZ1bmN0aW9uXCI/U3ltYm9sLmZvcihcIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tXCIpOm51bGw7S2UuQnVmZmVyPXA7S2UuU2xvd0J1ZmZlcj1CYTtLZS5JTlNQRUNUX01BWF9CWVRFUz01MDt2YXIgT3Q9MjE0NzQ4MzY0NztLZS5rTWF4TGVuZ3RoPU90O3AuVFlQRURfQVJSQVlfU1VQUE9SVD1FYSgpOyFwLlRZUEVEX0FSUkFZX1NVUFBPUlQmJnR5cGVvZiBjb25zb2xlPFwidVwiJiZ0eXBlb2YgY29uc29sZS5lcnJvcj09XCJmdW5jdGlvblwiJiZjb25zb2xlLmVycm9yKFwiVGhpcyBicm93c2VyIGxhY2tzIHR5cGVkIGFycmF5IChVaW50OEFycmF5KSBzdXBwb3J0IHdoaWNoIGlzIHJlcXVpcmVkIGJ5IGBidWZmZXJgIHY1LnguIFVzZSBgYnVmZmVyYCB2NC54IGlmIHlvdSByZXF1aXJlIG9sZCBicm93c2VyIHN1cHBvcnQuXCIpO2Z1bmN0aW9uIEVhKCl7dHJ5e2xldCByPW5ldyBVaW50OEFycmF5KDEpLGU9e2ZvbzpmdW5jdGlvbigpe3JldHVybiA0Mn19O3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YoZSxVaW50OEFycmF5LnByb3RvdHlwZSksT2JqZWN0LnNldFByb3RvdHlwZU9mKHIsZSksci5mb28oKT09PTQyfWNhdGNoe3JldHVybiExfX1PYmplY3QuZGVmaW5lUHJvcGVydHkocC5wcm90b3R5cGUsXCJwYXJlbnRcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtpZighIXAuaXNCdWZmZXIodGhpcykpcmV0dXJuIHRoaXMuYnVmZmVyfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShwLnByb3RvdHlwZSxcIm9mZnNldFwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2lmKCEhcC5pc0J1ZmZlcih0aGlzKSlyZXR1cm4gdGhpcy5ieXRlT2Zmc2V0fX0pO2Z1bmN0aW9uIGRlKHIpe2lmKHI+T3QpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicrcisnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJyk7bGV0IGU9bmV3IFVpbnQ4QXJyYXkocik7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZihlLHAucHJvdG90eXBlKSxlfWZ1bmN0aW9uIHAocixlLHQpe2lmKHR5cGVvZiByPT1cIm51bWJlclwiKXtpZih0eXBlb2YgZT09XCJzdHJpbmdcIil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJzdHJpbmdcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLiBSZWNlaXZlZCB0eXBlIG51bWJlcicpO3JldHVybiBRcihyKX1yZXR1cm4gbWkocixlLHQpfXAucG9vbFNpemU9ODE5MjtmdW5jdGlvbiBtaShyLGUsdCl7aWYodHlwZW9mIHI9PVwic3RyaW5nXCIpcmV0dXJuIFJhKHIsZSk7aWYoQXJyYXlCdWZmZXIuaXNWaWV3KHIpKXJldHVybiBUYShyKTtpZihyPT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSBcIit0eXBlb2Ygcik7aWYoaWUocixBcnJheUJ1ZmZlcil8fHImJmllKHIuYnVmZmVyLEFycmF5QnVmZmVyKXx8dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyPFwidVwiJiYoaWUocixTaGFyZWRBcnJheUJ1ZmZlcil8fHImJmllKHIuYnVmZmVyLFNoYXJlZEFycmF5QnVmZmVyKSkpcmV0dXJuIFhyKHIsZSx0KTtpZih0eXBlb2Ygcj09XCJudW1iZXJcIil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCB0eXBlIG51bWJlcicpO2xldCBuPXIudmFsdWVPZiYmci52YWx1ZU9mKCk7aWYobiE9bnVsbCYmbiE9PXIpcmV0dXJuIHAuZnJvbShuLGUsdCk7bGV0IGk9Q2Eocik7aWYoaSlyZXR1cm4gaTtpZih0eXBlb2YgU3ltYm9sPFwidVwiJiZTeW1ib2wudG9QcmltaXRpdmUhPW51bGwmJnR5cGVvZiByW1N5bWJvbC50b1ByaW1pdGl2ZV09PVwiZnVuY3Rpb25cIilyZXR1cm4gcC5mcm9tKHJbU3ltYm9sLnRvUHJpbWl0aXZlXShcInN0cmluZ1wiKSxlLHQpO3Rocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSBcIit0eXBlb2Ygcil9cC5mcm9tPWZ1bmN0aW9uKHIsZSx0KXtyZXR1cm4gbWkocixlLHQpfTtPYmplY3Quc2V0UHJvdG90eXBlT2YocC5wcm90b3R5cGUsVWludDhBcnJheS5wcm90b3R5cGUpO09iamVjdC5zZXRQcm90b3R5cGVPZihwLFVpbnQ4QXJyYXkpO2Z1bmN0aW9uIGdpKHIpe2lmKHR5cGVvZiByIT1cIm51bWJlclwiKXRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXInKTtpZihyPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicrcisnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJyl9ZnVuY3Rpb24gU2EocixlLHQpe3JldHVybiBnaShyKSxyPD0wP2RlKHIpOmUhPT12b2lkIDA/dHlwZW9mIHQ9PVwic3RyaW5nXCI/ZGUocikuZmlsbChlLHQpOmRlKHIpLmZpbGwoZSk6ZGUocil9cC5hbGxvYz1mdW5jdGlvbihyLGUsdCl7cmV0dXJuIFNhKHIsZSx0KX07ZnVuY3Rpb24gUXIocil7cmV0dXJuIGdpKHIpLGRlKHI8MD8wOlpyKHIpfDApfXAuYWxsb2NVbnNhZmU9ZnVuY3Rpb24ocil7cmV0dXJuIFFyKHIpfTtwLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbihyKXtyZXR1cm4gUXIocil9O2Z1bmN0aW9uIFJhKHIsZSl7aWYoKHR5cGVvZiBlIT1cInN0cmluZ1wifHxlPT09XCJcIikmJihlPVwidXRmOFwiKSwhcC5pc0VuY29kaW5nKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJVbmtub3duIGVuY29kaW5nOiBcIitlKTtsZXQgdD15aShyLGUpfDAsbj1kZSh0KSxpPW4ud3JpdGUocixlKTtyZXR1cm4gaSE9PXQmJihuPW4uc2xpY2UoMCxpKSksbn1mdW5jdGlvbiBLcihyKXtsZXQgZT1yLmxlbmd0aDwwPzA6WnIoci5sZW5ndGgpfDAsdD1kZShlKTtmb3IobGV0IG49MDtuPGU7bis9MSl0W25dPXJbbl0mMjU1O3JldHVybiB0fWZ1bmN0aW9uIFRhKHIpe2lmKGllKHIsVWludDhBcnJheSkpe2xldCBlPW5ldyBVaW50OEFycmF5KHIpO3JldHVybiBYcihlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKX1yZXR1cm4gS3Iocil9ZnVuY3Rpb24gWHIocixlLHQpe2lmKGU8MHx8ci5ieXRlTGVuZ3RoPGUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wib2Zmc2V0XCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJyk7aWYoci5ieXRlTGVuZ3RoPGUrKHR8fDApKXRocm93IG5ldyBSYW5nZUVycm9yKCdcImxlbmd0aFwiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpO2xldCBuO3JldHVybiBlPT09dm9pZCAwJiZ0PT09dm9pZCAwP249bmV3IFVpbnQ4QXJyYXkocik6dD09PXZvaWQgMD9uPW5ldyBVaW50OEFycmF5KHIsZSk6bj1uZXcgVWludDhBcnJheShyLGUsdCksT2JqZWN0LnNldFByb3RvdHlwZU9mKG4scC5wcm90b3R5cGUpLG59ZnVuY3Rpb24gQ2Eocil7aWYocC5pc0J1ZmZlcihyKSl7bGV0IGU9WnIoci5sZW5ndGgpfDAsdD1kZShlKTtyZXR1cm4gdC5sZW5ndGg9PT0wfHxyLmNvcHkodCwwLDAsZSksdH1pZihyLmxlbmd0aCE9PXZvaWQgMClyZXR1cm4gdHlwZW9mIHIubGVuZ3RoIT1cIm51bWJlclwifHx0bihyLmxlbmd0aCk/ZGUoMCk6S3Iocik7aWYoci50eXBlPT09XCJCdWZmZXJcIiYmQXJyYXkuaXNBcnJheShyLmRhdGEpKXJldHVybiBLcihyLmRhdGEpfWZ1bmN0aW9uIFpyKHIpe2lmKHI+PU90KXRocm93IG5ldyBSYW5nZUVycm9yKFwiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweFwiK090LnRvU3RyaW5nKDE2KStcIiBieXRlc1wiKTtyZXR1cm4gcnwwfWZ1bmN0aW9uIEJhKHIpe3JldHVybityIT1yJiYocj0wKSxwLmFsbG9jKCtyKX1wLmlzQnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVybiBlIT1udWxsJiZlLl9pc0J1ZmZlcj09PSEwJiZlIT09cC5wcm90b3R5cGV9O3AuY29tcGFyZT1mdW5jdGlvbihlLHQpe2lmKGllKGUsVWludDhBcnJheSkmJihlPXAuZnJvbShlLGUub2Zmc2V0LGUuYnl0ZUxlbmd0aCkpLGllKHQsVWludDhBcnJheSkmJih0PXAuZnJvbSh0LHQub2Zmc2V0LHQuYnl0ZUxlbmd0aCkpLCFwLmlzQnVmZmVyKGUpfHwhcC5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJidWYxXCIsIFwiYnVmMlwiIGFyZ3VtZW50cyBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5Jyk7aWYoZT09PXQpcmV0dXJuIDA7bGV0IG49ZS5sZW5ndGgsaT10Lmxlbmd0aDtmb3IobGV0IG89MCxzPU1hdGgubWluKG4saSk7bzxzOysrbylpZihlW29dIT09dFtvXSl7bj1lW29dLGk9dFtvXTticmVha31yZXR1cm4gbjxpPy0xOmk8bj8xOjB9O3AuaXNFbmNvZGluZz1mdW5jdGlvbihlKXtzd2l0Y2goU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2VcImhleFwiOmNhc2VcInV0ZjhcIjpjYXNlXCJ1dGYtOFwiOmNhc2VcImFzY2lpXCI6Y2FzZVwibGF0aW4xXCI6Y2FzZVwiYmluYXJ5XCI6Y2FzZVwiYmFzZTY0XCI6Y2FzZVwidWNzMlwiOmNhc2VcInVjcy0yXCI6Y2FzZVwidXRmMTZsZVwiOmNhc2VcInV0Zi0xNmxlXCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19O3AuY29uY2F0PWZ1bmN0aW9uKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7aWYoZS5sZW5ndGg9PT0wKXJldHVybiBwLmFsbG9jKDApO2xldCBuO2lmKHQ9PT12b2lkIDApZm9yKHQ9MCxuPTA7bjxlLmxlbmd0aDsrK24pdCs9ZVtuXS5sZW5ndGg7bGV0IGk9cC5hbGxvY1Vuc2FmZSh0KSxvPTA7Zm9yKG49MDtuPGUubGVuZ3RoOysrbil7bGV0IHM9ZVtuXTtpZihpZShzLFVpbnQ4QXJyYXkpKW8rcy5sZW5ndGg+aS5sZW5ndGg/KHAuaXNCdWZmZXIocyl8fChzPXAuZnJvbShzKSkscy5jb3B5KGksbykpOlVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGkscyxvKTtlbHNlIGlmKHAuaXNCdWZmZXIocykpcy5jb3B5KGksbyk7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtvKz1zLmxlbmd0aH1yZXR1cm4gaX07ZnVuY3Rpb24geWkocixlKXtpZihwLmlzQnVmZmVyKHIpKXJldHVybiByLmxlbmd0aDtpZihBcnJheUJ1ZmZlci5pc1ZpZXcocil8fGllKHIsQXJyYXlCdWZmZXIpKXJldHVybiByLmJ5dGVMZW5ndGg7aWYodHlwZW9mIHIhPVwic3RyaW5nXCIpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgb3IgQXJyYXlCdWZmZXIuIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2Ygcik7bGV0IHQ9ci5sZW5ndGgsbj1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXT09PSEwO2lmKCFuJiZ0PT09MClyZXR1cm4gMDtsZXQgaT0hMTtmb3IoOzspc3dpdGNoKGUpe2Nhc2VcImFzY2lpXCI6Y2FzZVwibGF0aW4xXCI6Y2FzZVwiYmluYXJ5XCI6cmV0dXJuIHQ7Y2FzZVwidXRmOFwiOmNhc2VcInV0Zi04XCI6cmV0dXJuIEpyKHIpLmxlbmd0aDtjYXNlXCJ1Y3MyXCI6Y2FzZVwidWNzLTJcIjpjYXNlXCJ1dGYxNmxlXCI6Y2FzZVwidXRmLTE2bGVcIjpyZXR1cm4gdCoyO2Nhc2VcImhleFwiOnJldHVybiB0Pj4+MTtjYXNlXCJiYXNlNjRcIjpyZXR1cm4gVGkocikubGVuZ3RoO2RlZmF1bHQ6aWYoaSlyZXR1cm4gbj8tMTpKcihyKS5sZW5ndGg7ZT0oXCJcIitlKS50b0xvd2VyQ2FzZSgpLGk9ITB9fXAuYnl0ZUxlbmd0aD15aTtmdW5jdGlvbiBNYShyLGUsdCl7bGV0IG49ITE7aWYoKGU9PT12b2lkIDB8fGU8MCkmJihlPTApLGU+dGhpcy5sZW5ndGh8fCgodD09PXZvaWQgMHx8dD50aGlzLmxlbmd0aCkmJih0PXRoaXMubGVuZ3RoKSx0PD0wKXx8KHQ+Pj49MCxlPj4+PTAsdDw9ZSkpcmV0dXJuXCJcIjtmb3Iocnx8KHI9XCJ1dGY4XCIpOzspc3dpdGNoKHIpe2Nhc2VcImhleFwiOnJldHVybiBOYSh0aGlzLGUsdCk7Y2FzZVwidXRmOFwiOmNhc2VcInV0Zi04XCI6cmV0dXJuIHhpKHRoaXMsZSx0KTtjYXNlXCJhc2NpaVwiOnJldHVybiBVYSh0aGlzLGUsdCk7Y2FzZVwibGF0aW4xXCI6Y2FzZVwiYmluYXJ5XCI6cmV0dXJuIERhKHRoaXMsZSx0KTtjYXNlXCJiYXNlNjRcIjpyZXR1cm4ga2EodGhpcyxlLHQpO2Nhc2VcInVjczJcIjpjYXNlXCJ1Y3MtMlwiOmNhc2VcInV0ZjE2bGVcIjpjYXNlXCJ1dGYtMTZsZVwiOnJldHVybiBIYSh0aGlzLGUsdCk7ZGVmYXVsdDppZihuKXRocm93IG5ldyBUeXBlRXJyb3IoXCJVbmtub3duIGVuY29kaW5nOiBcIityKTtyPShyK1wiXCIpLnRvTG93ZXJDYXNlKCksbj0hMH19cC5wcm90b3R5cGUuX2lzQnVmZmVyPSEwO2Z1bmN0aW9uIFBlKHIsZSx0KXtsZXQgbj1yW2VdO3JbZV09clt0XSxyW3RdPW59cC5wcm90b3R5cGUuc3dhcDE2PWZ1bmN0aW9uKCl7bGV0IGU9dGhpcy5sZW5ndGg7aWYoZSUyIT09MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzXCIpO2ZvcihsZXQgdD0wO3Q8ZTt0Kz0yKVBlKHRoaXMsdCx0KzEpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXtsZXQgZT10aGlzLmxlbmd0aDtpZihlJTQhPT0wKXRocm93IG5ldyBSYW5nZUVycm9yKFwiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHNcIik7Zm9yKGxldCB0PTA7dDxlO3QrPTQpUGUodGhpcyx0LHQrMyksUGUodGhpcyx0KzEsdCsyKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuc3dhcDY0PWZ1bmN0aW9uKCl7bGV0IGU9dGhpcy5sZW5ndGg7aWYoZSU4IT09MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzXCIpO2ZvcihsZXQgdD0wO3Q8ZTt0Kz04KVBlKHRoaXMsdCx0KzcpLFBlKHRoaXMsdCsxLHQrNiksUGUodGhpcyx0KzIsdCs1KSxQZSh0aGlzLHQrMyx0KzQpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2xldCBlPXRoaXMubGVuZ3RoO3JldHVybiBlPT09MD9cIlwiOmFyZ3VtZW50cy5sZW5ndGg9PT0wP3hpKHRoaXMsMCxlKTpNYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3AucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nPXAucHJvdG90eXBlLnRvU3RyaW5nO3AucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtpZighcC5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlclwiKTtyZXR1cm4gdGhpcz09PWU/ITA6cC5jb21wYXJlKHRoaXMsZSk9PT0wfTtwLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7bGV0IGU9XCJcIix0PUtlLklOU1BFQ1RfTUFYX0JZVEVTO3JldHVybiBlPXRoaXMudG9TdHJpbmcoXCJoZXhcIiwwLHQpLnJlcGxhY2UoLyguezJ9KS9nLFwiJDEgXCIpLnRyaW0oKSx0aGlzLmxlbmd0aD50JiYoZSs9XCIgLi4uIFwiKSxcIjxCdWZmZXIgXCIrZStcIj5cIn07bGkmJihwLnByb3RvdHlwZVtsaV09cC5wcm90b3R5cGUuaW5zcGVjdCk7cC5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbihlLHQsbixpLG8pe2lmKGllKGUsVWludDhBcnJheSkmJihlPXAuZnJvbShlLGUub2Zmc2V0LGUuYnl0ZUxlbmd0aCkpLCFwLmlzQnVmZmVyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInRhcmdldFwiIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgQnVmZmVyIG9yIFVpbnQ4QXJyYXkuIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgZSk7aWYodD09PXZvaWQgMCYmKHQ9MCksbj09PXZvaWQgMCYmKG49ZT9lLmxlbmd0aDowKSxpPT09dm9pZCAwJiYoaT0wKSxvPT09dm9pZCAwJiYobz10aGlzLmxlbmd0aCksdDwwfHxuPmUubGVuZ3RofHxpPDB8fG8+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJvdXQgb2YgcmFuZ2UgaW5kZXhcIik7aWYoaT49byYmdD49bilyZXR1cm4gMDtpZihpPj1vKXJldHVybi0xO2lmKHQ+PW4pcmV0dXJuIDE7aWYodD4+Pj0wLG4+Pj49MCxpPj4+PTAsbz4+Pj0wLHRoaXM9PT1lKXJldHVybiAwO2xldCBzPW8taSxhPW4tdCx1PU1hdGgubWluKHMsYSksZj10aGlzLnNsaWNlKGksbyksbD1lLnNsaWNlKHQsbik7Zm9yKGxldCBkPTA7ZDx1OysrZClpZihmW2RdIT09bFtkXSl7cz1mW2RdLGE9bFtkXTticmVha31yZXR1cm4gczxhPy0xOmE8cz8xOjB9O2Z1bmN0aW9uIGJpKHIsZSx0LG4saSl7aWYoci5sZW5ndGg9PT0wKXJldHVybi0xO2lmKHR5cGVvZiB0PT1cInN0cmluZ1wiPyhuPXQsdD0wKTp0PjIxNDc0ODM2NDc/dD0yMTQ3NDgzNjQ3OnQ8LTIxNDc0ODM2NDgmJih0PS0yMTQ3NDgzNjQ4KSx0PSt0LHRuKHQpJiYodD1pPzA6ci5sZW5ndGgtMSksdDwwJiYodD1yLmxlbmd0aCt0KSx0Pj1yLmxlbmd0aCl7aWYoaSlyZXR1cm4tMTt0PXIubGVuZ3RoLTF9ZWxzZSBpZih0PDApaWYoaSl0PTA7ZWxzZSByZXR1cm4tMTtpZih0eXBlb2YgZT09XCJzdHJpbmdcIiYmKGU9cC5mcm9tKGUsbikpLHAuaXNCdWZmZXIoZSkpcmV0dXJuIGUubGVuZ3RoPT09MD8tMTpkaShyLGUsdCxuLGkpO2lmKHR5cGVvZiBlPT1cIm51bWJlclwiKXJldHVybiBlPWUmMjU1LHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mPT1cImZ1bmN0aW9uXCI/aT9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwocixlLHQpOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwocixlLHQpOmRpKHIsW2VdLHQsbixpKTt0aHJvdyBuZXcgVHlwZUVycm9yKFwidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyXCIpfWZ1bmN0aW9uIGRpKHIsZSx0LG4saSl7bGV0IG89MSxzPXIubGVuZ3RoLGE9ZS5sZW5ndGg7aWYobiE9PXZvaWQgMCYmKG49U3RyaW5nKG4pLnRvTG93ZXJDYXNlKCksbj09PVwidWNzMlwifHxuPT09XCJ1Y3MtMlwifHxuPT09XCJ1dGYxNmxlXCJ8fG49PT1cInV0Zi0xNmxlXCIpKXtpZihyLmxlbmd0aDwyfHxlLmxlbmd0aDwyKXJldHVybi0xO289MixzLz0yLGEvPTIsdC89Mn1mdW5jdGlvbiB1KGwsZCl7cmV0dXJuIG89PT0xP2xbZF06bC5yZWFkVUludDE2QkUoZCpvKX1sZXQgZjtpZihpKXtsZXQgbD0tMTtmb3IoZj10O2Y8cztmKyspaWYodShyLGYpPT09dShlLGw9PT0tMT8wOmYtbCkpe2lmKGw9PT0tMSYmKGw9ZiksZi1sKzE9PT1hKXJldHVybiBsKm99ZWxzZSBsIT09LTEmJihmLT1mLWwpLGw9LTF9ZWxzZSBmb3IodCthPnMmJih0PXMtYSksZj10O2Y+PTA7Zi0tKXtsZXQgbD0hMDtmb3IobGV0IGQ9MDtkPGE7ZCsrKWlmKHUocixmK2QpIT09dShlLGQpKXtsPSExO2JyZWFrfWlmKGwpcmV0dXJuIGZ9cmV0dXJuLTF9cC5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmluZGV4T2YoZSx0LG4pIT09LTF9O3AucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBiaSh0aGlzLGUsdCxuLCEwKX07cC5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBiaSh0aGlzLGUsdCxuLCExKX07ZnVuY3Rpb24gTGEocixlLHQsbil7dD1OdW1iZXIodCl8fDA7bGV0IGk9ci5sZW5ndGgtdDtuPyhuPU51bWJlcihuKSxuPmkmJihuPWkpKTpuPWk7bGV0IG89ZS5sZW5ndGg7bj5vLzImJihuPW8vMik7bGV0IHM7Zm9yKHM9MDtzPG47KytzKXtsZXQgYT1wYXJzZUludChlLnN1YnN0cihzKjIsMiksMTYpO2lmKHRuKGEpKXJldHVybiBzO3JbdCtzXT1hfXJldHVybiBzfWZ1bmN0aW9uIElhKHIsZSx0LG4pe3JldHVybiBVdChKcihlLHIubGVuZ3RoLXQpLHIsdCxuKX1mdW5jdGlvbiBBYShyLGUsdCxuKXtyZXR1cm4gVXQoJGEoZSkscix0LG4pfWZ1bmN0aW9uIEZhKHIsZSx0LG4pe3JldHVybiBVdChUaShlKSxyLHQsbil9ZnVuY3Rpb24gUGEocixlLHQsbil7cmV0dXJuIFV0KEdhKGUsci5sZW5ndGgtdCkscix0LG4pfXAucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKGUsdCxuLGkpe2lmKHQ9PT12b2lkIDApaT1cInV0ZjhcIixuPXRoaXMubGVuZ3RoLHQ9MDtlbHNlIGlmKG49PT12b2lkIDAmJnR5cGVvZiB0PT1cInN0cmluZ1wiKWk9dCxuPXRoaXMubGVuZ3RoLHQ9MDtlbHNlIGlmKGlzRmluaXRlKHQpKXQ9dD4+PjAsaXNGaW5pdGUobik/KG49bj4+PjAsaT09PXZvaWQgMCYmKGk9XCJ1dGY4XCIpKTooaT1uLG49dm9pZCAwKTtlbHNlIHRocm93IG5ldyBFcnJvcihcIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkXCIpO2xldCBvPXRoaXMubGVuZ3RoLXQ7aWYoKG49PT12b2lkIDB8fG4+bykmJihuPW8pLGUubGVuZ3RoPjAmJihuPDB8fHQ8MCl8fHQ+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kc1wiKTtpfHwoaT1cInV0ZjhcIik7bGV0IHM9ITE7Zm9yKDs7KXN3aXRjaChpKXtjYXNlXCJoZXhcIjpyZXR1cm4gTGEodGhpcyxlLHQsbik7Y2FzZVwidXRmOFwiOmNhc2VcInV0Zi04XCI6cmV0dXJuIElhKHRoaXMsZSx0LG4pO2Nhc2VcImFzY2lpXCI6Y2FzZVwibGF0aW4xXCI6Y2FzZVwiYmluYXJ5XCI6cmV0dXJuIEFhKHRoaXMsZSx0LG4pO2Nhc2VcImJhc2U2NFwiOnJldHVybiBGYSh0aGlzLGUsdCxuKTtjYXNlXCJ1Y3MyXCI6Y2FzZVwidWNzLTJcIjpjYXNlXCJ1dGYxNmxlXCI6Y2FzZVwidXRmLTE2bGVcIjpyZXR1cm4gUGEodGhpcyxlLHQsbik7ZGVmYXVsdDppZihzKXRocm93IG5ldyBUeXBlRXJyb3IoXCJVbmtub3duIGVuY29kaW5nOiBcIitpKTtpPShcIlwiK2kpLnRvTG93ZXJDYXNlKCkscz0hMH19O3AucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt0eXBlOlwiQnVmZmVyXCIsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9fTtmdW5jdGlvbiBrYShyLGUsdCl7cmV0dXJuIGU9PT0wJiZ0PT09ci5sZW5ndGg/WXIuZnJvbUJ5dGVBcnJheShyKTpZci5mcm9tQnl0ZUFycmF5KHIuc2xpY2UoZSx0KSl9ZnVuY3Rpb24geGkocixlLHQpe3Q9TWF0aC5taW4oci5sZW5ndGgsdCk7bGV0IG49W10saT1lO2Zvcig7aTx0Oyl7bGV0IG89cltpXSxzPW51bGwsYT1vPjIzOT80Om8+MjIzPzM6bz4xOTE/MjoxO2lmKGkrYTw9dCl7bGV0IHUsZixsLGQ7c3dpdGNoKGEpe2Nhc2UgMTpvPDEyOCYmKHM9byk7YnJlYWs7Y2FzZSAyOnU9cltpKzFdLCh1JjE5Mik9PT0xMjgmJihkPShvJjMxKTw8Nnx1JjYzLGQ+MTI3JiYocz1kKSk7YnJlYWs7Y2FzZSAzOnU9cltpKzFdLGY9cltpKzJdLCh1JjE5Mik9PT0xMjgmJihmJjE5Mik9PT0xMjgmJihkPShvJjE1KTw8MTJ8KHUmNjMpPDw2fGYmNjMsZD4yMDQ3JiYoZDw1NTI5Nnx8ZD41NzM0MykmJihzPWQpKTticmVhaztjYXNlIDQ6dT1yW2krMV0sZj1yW2krMl0sbD1yW2krM10sKHUmMTkyKT09PTEyOCYmKGYmMTkyKT09PTEyOCYmKGwmMTkyKT09PTEyOCYmKGQ9KG8mMTUpPDwxOHwodSY2Myk8PDEyfChmJjYzKTw8NnxsJjYzLGQ+NjU1MzUmJmQ8MTExNDExMiYmKHM9ZCkpfX1zPT09bnVsbD8ocz02NTUzMyxhPTEpOnM+NjU1MzUmJihzLT02NTUzNixuLnB1c2gocz4+PjEwJjEwMjN8NTUyOTYpLHM9NTYzMjB8cyYxMDIzKSxuLnB1c2gocyksaSs9YX1yZXR1cm4gT2Eobil9dmFyIHBpPTQwOTY7ZnVuY3Rpb24gT2Eocil7bGV0IGU9ci5sZW5ndGg7aWYoZTw9cGkpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHIpO2xldCB0PVwiXCIsbj0wO2Zvcig7bjxlOyl0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxyLnNsaWNlKG4sbis9cGkpKTtyZXR1cm4gdH1mdW5jdGlvbiBVYShyLGUsdCl7bGV0IG49XCJcIjt0PU1hdGgubWluKHIubGVuZ3RoLHQpO2ZvcihsZXQgaT1lO2k8dDsrK2kpbis9U3RyaW5nLmZyb21DaGFyQ29kZShyW2ldJjEyNyk7cmV0dXJuIG59ZnVuY3Rpb24gRGEocixlLHQpe2xldCBuPVwiXCI7dD1NYXRoLm1pbihyLmxlbmd0aCx0KTtmb3IobGV0IGk9ZTtpPHQ7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUocltpXSk7cmV0dXJuIG59ZnVuY3Rpb24gTmEocixlLHQpe2xldCBuPXIubGVuZ3RoOyghZXx8ZTwwKSYmKGU9MCksKCF0fHx0PDB8fHQ+bikmJih0PW4pO2xldCBpPVwiXCI7Zm9yKGxldCBvPWU7bzx0OysrbylpKz1WYVtyW29dXTtyZXR1cm4gaX1mdW5jdGlvbiBIYShyLGUsdCl7bGV0IG49ci5zbGljZShlLHQpLGk9XCJcIjtmb3IobGV0IG89MDtvPG4ubGVuZ3RoLTE7bys9MilpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG5bb10rbltvKzFdKjI1Nik7cmV0dXJuIGl9cC5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24oZSx0KXtsZXQgbj10aGlzLmxlbmd0aDtlPX5+ZSx0PXQ9PT12b2lkIDA/bjp+fnQsZTwwPyhlKz1uLGU8MCYmKGU9MCkpOmU+biYmKGU9biksdDwwPyh0Kz1uLHQ8MCYmKHQ9MCkpOnQ+biYmKHQ9biksdDxlJiYodD1lKTtsZXQgaT10aGlzLnN1YmFycmF5KGUsdCk7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZihpLHAucHJvdG90eXBlKSxpfTtmdW5jdGlvbiBEKHIsZSx0KXtpZihyJTEhPT0wfHxyPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJvZmZzZXQgaXMgbm90IHVpbnRcIik7aWYocitlPnQpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoXCIpfXAucHJvdG90eXBlLnJlYWRVaW50TEU9cC5wcm90b3R5cGUucmVhZFVJbnRMRT1mdW5jdGlvbihlLHQsbil7ZT1lPj4+MCx0PXQ+Pj4wLG58fEQoZSx0LHRoaXMubGVuZ3RoKTtsZXQgaT10aGlzW2VdLG89MSxzPTA7Zm9yKDsrK3M8dCYmKG8qPTI1Nik7KWkrPXRoaXNbZStzXSpvO3JldHVybiBpfTtwLnByb3RvdHlwZS5yZWFkVWludEJFPXAucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24oZSx0LG4pe2U9ZT4+PjAsdD10Pj4+MCxufHxEKGUsdCx0aGlzLmxlbmd0aCk7bGV0IGk9dGhpc1tlKy0tdF0sbz0xO2Zvcig7dD4wJiYobyo9MjU2KTspaSs9dGhpc1tlKy0tdF0qbztyZXR1cm4gaX07cC5wcm90b3R5cGUucmVhZFVpbnQ4PXAucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiBlPWU+Pj4wLHR8fEQoZSwxLHRoaXMubGVuZ3RoKSx0aGlzW2VdfTtwLnByb3RvdHlwZS5yZWFkVWludDE2TEU9cC5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDIsdGhpcy5sZW5ndGgpLHRoaXNbZV18dGhpc1tlKzFdPDw4fTtwLnByb3RvdHlwZS5yZWFkVWludDE2QkU9cC5wcm90b3R5cGUucmVhZFVJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDIsdGhpcy5sZW5ndGgpLHRoaXNbZV08PDh8dGhpc1tlKzFdfTtwLnByb3RvdHlwZS5yZWFkVWludDMyTEU9cC5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDQsdGhpcy5sZW5ndGgpLCh0aGlzW2VdfHRoaXNbZSsxXTw8OHx0aGlzW2UrMl08PDE2KSt0aGlzW2UrM10qMTY3NzcyMTZ9O3AucHJvdG90eXBlLnJlYWRVaW50MzJCRT1wLnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lPj4+MCx0fHxEKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXSoxNjc3NzIxNisodGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdKX07cC5wcm90b3R5cGUucmVhZEJpZ1VJbnQ2NExFPWJlKGZ1bmN0aW9uKGUpe2U9ZT4+PjAsWWUoZSxcIm9mZnNldFwiKTtsZXQgdD10aGlzW2VdLG49dGhpc1tlKzddOyh0PT09dm9pZCAwfHxuPT09dm9pZCAwKSYmd3QoZSx0aGlzLmxlbmd0aC04KTtsZXQgaT10K3RoaXNbKytlXSoyKio4K3RoaXNbKytlXSoyKioxNit0aGlzWysrZV0qMioqMjQsbz10aGlzWysrZV0rdGhpc1srK2VdKjIqKjgrdGhpc1srK2VdKjIqKjE2K24qMioqMjQ7cmV0dXJuIEJpZ0ludChpKSsoQmlnSW50KG8pPDxCaWdJbnQoMzIpKX0pO3AucHJvdG90eXBlLnJlYWRCaWdVSW50NjRCRT1iZShmdW5jdGlvbihlKXtlPWU+Pj4wLFllKGUsXCJvZmZzZXRcIik7bGV0IHQ9dGhpc1tlXSxuPXRoaXNbZSs3XTsodD09PXZvaWQgMHx8bj09PXZvaWQgMCkmJnd0KGUsdGhpcy5sZW5ndGgtOCk7bGV0IGk9dCoyKioyNCt0aGlzWysrZV0qMioqMTYrdGhpc1srK2VdKjIqKjgrdGhpc1srK2VdLG89dGhpc1srK2VdKjIqKjI0K3RoaXNbKytlXSoyKioxNit0aGlzWysrZV0qMioqOCtuO3JldHVybihCaWdJbnQoaSk8PEJpZ0ludCgzMikpK0JpZ0ludChvKX0pO3AucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbihlLHQsbil7ZT1lPj4+MCx0PXQ+Pj4wLG58fEQoZSx0LHRoaXMubGVuZ3RoKTtsZXQgaT10aGlzW2VdLG89MSxzPTA7Zm9yKDsrK3M8dCYmKG8qPTI1Nik7KWkrPXRoaXNbZStzXSpvO3JldHVybiBvKj0xMjgsaT49byYmKGktPU1hdGgucG93KDIsOCp0KSksaX07cC5wcm90b3R5cGUucmVhZEludEJFPWZ1bmN0aW9uKGUsdCxuKXtlPWU+Pj4wLHQ9dD4+PjAsbnx8RChlLHQsdGhpcy5sZW5ndGgpO2xldCBpPXQsbz0xLHM9dGhpc1tlKy0taV07Zm9yKDtpPjAmJihvKj0yNTYpOylzKz10aGlzW2UrLS1pXSpvO3JldHVybiBvKj0xMjgscz49byYmKHMtPU1hdGgucG93KDIsOCp0KSksc307cC5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lPj4+MCx0fHxEKGUsMSx0aGlzLmxlbmd0aCksdGhpc1tlXSYxMjg/KDI1NS10aGlzW2VdKzEpKi0xOnRoaXNbZV19O3AucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7ZT1lPj4+MCx0fHxEKGUsMix0aGlzLmxlbmd0aCk7bGV0IG49dGhpc1tlXXx0aGlzW2UrMV08PDg7cmV0dXJuIG4mMzI3Njg/bnw0Mjk0OTAxNzYwOm59O3AucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7ZT1lPj4+MCx0fHxEKGUsMix0aGlzLmxlbmd0aCk7bGV0IG49dGhpc1tlKzFdfHRoaXNbZV08PDg7cmV0dXJuIG4mMzI3Njg/bnw0Mjk0OTAxNzYwOm59O3AucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTZ8dGhpc1tlKzNdPDwyNH07cC5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lPj4+MCx0fHxEKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXTw8MjR8dGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdfTtwLnByb3RvdHlwZS5yZWFkQmlnSW50NjRMRT1iZShmdW5jdGlvbihlKXtlPWU+Pj4wLFllKGUsXCJvZmZzZXRcIik7bGV0IHQ9dGhpc1tlXSxuPXRoaXNbZSs3XTsodD09PXZvaWQgMHx8bj09PXZvaWQgMCkmJnd0KGUsdGhpcy5sZW5ndGgtOCk7bGV0IGk9dGhpc1tlKzRdK3RoaXNbZSs1XSoyKio4K3RoaXNbZSs2XSoyKioxNisobjw8MjQpO3JldHVybihCaWdJbnQoaSk8PEJpZ0ludCgzMikpK0JpZ0ludCh0K3RoaXNbKytlXSoyKio4K3RoaXNbKytlXSoyKioxNit0aGlzWysrZV0qMioqMjQpfSk7cC5wcm90b3R5cGUucmVhZEJpZ0ludDY0QkU9YmUoZnVuY3Rpb24oZSl7ZT1lPj4+MCxZZShlLFwib2Zmc2V0XCIpO2xldCB0PXRoaXNbZV0sbj10aGlzW2UrN107KHQ9PT12b2lkIDB8fG49PT12b2lkIDApJiZ3dChlLHRoaXMubGVuZ3RoLTgpO2xldCBpPSh0PDwyNCkrdGhpc1srK2VdKjIqKjE2K3RoaXNbKytlXSoyKio4K3RoaXNbKytlXTtyZXR1cm4oQmlnSW50KGkpPDxCaWdJbnQoMzIpKStCaWdJbnQodGhpc1srK2VdKjIqKjI0K3RoaXNbKytlXSoyKioxNit0aGlzWysrZV0qMioqOCtuKX0pO3AucHJvdG90eXBlLnJlYWRGbG9hdExFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDQsdGhpcy5sZW5ndGgpLHplLnJlYWQodGhpcyxlLCEwLDIzLDQpfTtwLnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbihlLHQpe3JldHVybiBlPWU+Pj4wLHR8fEQoZSw0LHRoaXMubGVuZ3RoKSx6ZS5yZWFkKHRoaXMsZSwhMSwyMyw0KX07cC5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDgsdGhpcy5sZW5ndGgpLHplLnJlYWQodGhpcyxlLCEwLDUyLDgpfTtwLnByb3RvdHlwZS5yZWFkRG91YmxlQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lPj4+MCx0fHxEKGUsOCx0aGlzLmxlbmd0aCksemUucmVhZCh0aGlzLGUsITEsNTIsOCl9O2Z1bmN0aW9uIFcocixlLHQsbixpLG8pe2lmKCFwLmlzQnVmZmVyKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKGU+aXx8ZTxvKXRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO2lmKHQrbj5yLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkluZGV4IG91dCBvZiByYW5nZVwiKX1wLnByb3RvdHlwZS53cml0ZVVpbnRMRT1wLnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbihlLHQsbixpKXtpZihlPStlLHQ9dD4+PjAsbj1uPj4+MCwhaSl7bGV0IGE9TWF0aC5wb3coMiw4Km4pLTE7Vyh0aGlzLGUsdCxuLGEsMCl9bGV0IG89MSxzPTA7Zm9yKHRoaXNbdF09ZSYyNTU7KytzPG4mJihvKj0yNTYpOyl0aGlzW3Qrc109ZS9vJjI1NTtyZXR1cm4gdCtufTtwLnByb3RvdHlwZS53cml0ZVVpbnRCRT1wLnByb3RvdHlwZS53cml0ZVVJbnRCRT1mdW5jdGlvbihlLHQsbixpKXtpZihlPStlLHQ9dD4+PjAsbj1uPj4+MCwhaSl7bGV0IGE9TWF0aC5wb3coMiw4Km4pLTE7Vyh0aGlzLGUsdCxuLGEsMCl9bGV0IG89bi0xLHM9MTtmb3IodGhpc1t0K29dPWUmMjU1Oy0tbz49MCYmKHMqPTI1Nik7KXRoaXNbdCtvXT1lL3MmMjU1O3JldHVybiB0K259O3AucHJvdG90eXBlLndyaXRlVWludDg9cC5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdD10Pj4+MCxufHxXKHRoaXMsZSx0LDEsMjU1LDApLHRoaXNbdF09ZSYyNTUsdCsxfTtwLnByb3RvdHlwZS53cml0ZVVpbnQxNkxFPXAucHJvdG90eXBlLndyaXRlVUludDE2TEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHQ9dD4+PjAsbnx8Vyh0aGlzLGUsdCwyLDY1NTM1LDApLHRoaXNbdF09ZSYyNTUsdGhpc1t0KzFdPWU+Pj44LHQrMn07cC5wcm90b3R5cGUud3JpdGVVaW50MTZCRT1wLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLG58fFcodGhpcyxlLHQsMiw2NTUzNSwwKSx0aGlzW3RdPWU+Pj44LHRoaXNbdCsxXT1lJjI1NSx0KzJ9O3AucHJvdG90eXBlLndyaXRlVWludDMyTEU9cC5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdD10Pj4+MCxufHxXKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSx0aGlzW3QrM109ZT4+PjI0LHRoaXNbdCsyXT1lPj4+MTYsdGhpc1t0KzFdPWU+Pj44LHRoaXNbdF09ZSYyNTUsdCs0fTtwLnByb3RvdHlwZS53cml0ZVVpbnQzMkJFPXAucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHQ9dD4+PjAsbnx8Vyh0aGlzLGUsdCw0LDQyOTQ5NjcyOTUsMCksdGhpc1t0XT1lPj4+MjQsdGhpc1t0KzFdPWU+Pj4xNix0aGlzW3QrMl09ZT4+PjgsdGhpc1t0KzNdPWUmMjU1LHQrNH07ZnVuY3Rpb24gX2kocixlLHQsbixpKXtSaShlLG4saSxyLHQsNyk7bGV0IG89TnVtYmVyKGUmQmlnSW50KDQyOTQ5NjcyOTUpKTtyW3QrK109byxvPW8+Pjgsclt0KytdPW8sbz1vPj44LHJbdCsrXT1vLG89bz4+OCxyW3QrK109bztsZXQgcz1OdW1iZXIoZT4+QmlnSW50KDMyKSZCaWdJbnQoNDI5NDk2NzI5NSkpO3JldHVybiByW3QrK109cyxzPXM+Pjgsclt0KytdPXMscz1zPj44LHJbdCsrXT1zLHM9cz4+OCxyW3QrK109cyx0fWZ1bmN0aW9uIHdpKHIsZSx0LG4saSl7UmkoZSxuLGkscix0LDcpO2xldCBvPU51bWJlcihlJkJpZ0ludCg0Mjk0OTY3Mjk1KSk7clt0KzddPW8sbz1vPj44LHJbdCs2XT1vLG89bz4+OCxyW3QrNV09byxvPW8+Pjgsclt0KzRdPW87bGV0IHM9TnVtYmVyKGU+PkJpZ0ludCgzMikmQmlnSW50KDQyOTQ5NjcyOTUpKTtyZXR1cm4gclt0KzNdPXMscz1zPj44LHJbdCsyXT1zLHM9cz4+OCxyW3QrMV09cyxzPXM+Pjgsclt0XT1zLHQrOH1wLnByb3RvdHlwZS53cml0ZUJpZ1VJbnQ2NExFPWJlKGZ1bmN0aW9uKGUsdD0wKXtyZXR1cm4gX2kodGhpcyxlLHQsQmlnSW50KDApLEJpZ0ludChcIjB4ZmZmZmZmZmZmZmZmZmZmZlwiKSl9KTtwLnByb3RvdHlwZS53cml0ZUJpZ1VJbnQ2NEJFPWJlKGZ1bmN0aW9uKGUsdD0wKXtyZXR1cm4gd2kodGhpcyxlLHQsQmlnSW50KDApLEJpZ0ludChcIjB4ZmZmZmZmZmZmZmZmZmZmZlwiKSl9KTtwLnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKGUsdCxuLGkpe2lmKGU9K2UsdD10Pj4+MCwhaSl7bGV0IHU9TWF0aC5wb3coMiw4Km4tMSk7Vyh0aGlzLGUsdCxuLHUtMSwtdSl9bGV0IG89MCxzPTEsYT0wO2Zvcih0aGlzW3RdPWUmMjU1OysrbzxuJiYocyo9MjU2KTspZTwwJiZhPT09MCYmdGhpc1t0K28tMV0hPT0wJiYoYT0xKSx0aGlzW3Qrb109KGUvcz4+MCktYSYyNTU7cmV0dXJuIHQrbn07cC5wcm90b3R5cGUud3JpdGVJbnRCRT1mdW5jdGlvbihlLHQsbixpKXtpZihlPStlLHQ9dD4+PjAsIWkpe2xldCB1PU1hdGgucG93KDIsOCpuLTEpO1codGhpcyxlLHQsbix1LTEsLXUpfWxldCBvPW4tMSxzPTEsYT0wO2Zvcih0aGlzW3Qrb109ZSYyNTU7LS1vPj0wJiYocyo9MjU2KTspZTwwJiZhPT09MCYmdGhpc1t0K28rMV0hPT0wJiYoYT0xKSx0aGlzW3Qrb109KGUvcz4+MCktYSYyNTU7cmV0dXJuIHQrbn07cC5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLG58fFcodGhpcyxlLHQsMSwxMjcsLTEyOCksZTwwJiYoZT0yNTUrZSsxKSx0aGlzW3RdPWUmMjU1LHQrMX07cC5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLG58fFcodGhpcyxlLHQsMiwzMjc2NywtMzI3NjgpLHRoaXNbdF09ZSYyNTUsdGhpc1t0KzFdPWU+Pj44LHQrMn07cC5wcm90b3R5cGUud3JpdGVJbnQxNkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLG58fFcodGhpcyxlLHQsMiwzMjc2NywtMzI3NjgpLHRoaXNbdF09ZT4+PjgsdGhpc1t0KzFdPWUmMjU1LHQrMn07cC5wcm90b3R5cGUud3JpdGVJbnQzMkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLG58fFcodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSx0aGlzW3RdPWUmMjU1LHRoaXNbdCsxXT1lPj4+OCx0aGlzW3QrMl09ZT4+PjE2LHRoaXNbdCszXT1lPj4+MjQsdCs0fTtwLnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHQ9dD4+PjAsbnx8Vyh0aGlzLGUsdCw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLGU8MCYmKGU9NDI5NDk2NzI5NStlKzEpLHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT1lJjI1NSx0KzR9O3AucHJvdG90eXBlLndyaXRlQmlnSW50NjRMRT1iZShmdW5jdGlvbihlLHQ9MCl7cmV0dXJuIF9pKHRoaXMsZSx0LC1CaWdJbnQoXCIweDgwMDAwMDAwMDAwMDAwMDBcIiksQmlnSW50KFwiMHg3ZmZmZmZmZmZmZmZmZmZmXCIpKX0pO3AucHJvdG90eXBlLndyaXRlQmlnSW50NjRCRT1iZShmdW5jdGlvbihlLHQ9MCl7cmV0dXJuIHdpKHRoaXMsZSx0LC1CaWdJbnQoXCIweDgwMDAwMDAwMDAwMDAwMDBcIiksQmlnSW50KFwiMHg3ZmZmZmZmZmZmZmZmZmZmXCIpKX0pO2Z1bmN0aW9uIHZpKHIsZSx0LG4saSxvKXtpZih0K24+ci5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbmRleCBvdXQgb2YgcmFuZ2VcIik7aWYodDwwKXRocm93IG5ldyBSYW5nZUVycm9yKFwiSW5kZXggb3V0IG9mIHJhbmdlXCIpfWZ1bmN0aW9uIEVpKHIsZSx0LG4saSl7cmV0dXJuIGU9K2UsdD10Pj4+MCxpfHx2aShyLGUsdCw0LDM0MDI4MjM0NjYzODUyODg2ZTIyLC0zNDAyODIzNDY2Mzg1Mjg4NmUyMiksemUud3JpdGUocixlLHQsbiwyMyw0KSx0KzR9cC5wcm90b3R5cGUud3JpdGVGbG9hdExFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gRWkodGhpcyxlLHQsITAsbil9O3AucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIEVpKHRoaXMsZSx0LCExLG4pfTtmdW5jdGlvbiBTaShyLGUsdCxuLGkpe3JldHVybiBlPStlLHQ9dD4+PjAsaXx8dmkocixlLHQsOCwxNzk3NjkzMTM0ODYyMzE1N2UyOTIsLTE3OTc2OTMxMzQ4NjIzMTU3ZTI5MiksemUud3JpdGUocixlLHQsbiw1Miw4KSx0Kzh9cC5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIFNpKHRoaXMsZSx0LCEwLG4pfTtwLnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gU2kodGhpcyxlLHQsITEsbil9O3AucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oZSx0LG4saSl7aWYoIXAuaXNCdWZmZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcImFyZ3VtZW50IHNob3VsZCBiZSBhIEJ1ZmZlclwiKTtpZihufHwobj0wKSwhaSYmaSE9PTAmJihpPXRoaXMubGVuZ3RoKSx0Pj1lLmxlbmd0aCYmKHQ9ZS5sZW5ndGgpLHR8fCh0PTApLGk+MCYmaTxuJiYoaT1uKSxpPT09bnx8ZS5sZW5ndGg9PT0wfHx0aGlzLmxlbmd0aD09PTApcmV0dXJuIDA7aWYodDwwKXRocm93IG5ldyBSYW5nZUVycm9yKFwidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kc1wiKTtpZihuPDB8fG4+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiSW5kZXggb3V0IG9mIHJhbmdlXCIpO2lmKGk8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzXCIpO2k+dGhpcy5sZW5ndGgmJihpPXRoaXMubGVuZ3RoKSxlLmxlbmd0aC10PGktbiYmKGk9ZS5sZW5ndGgtdCtuKTtsZXQgbz1pLW47cmV0dXJuIHRoaXM9PT1lJiZ0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbj09XCJmdW5jdGlvblwiP3RoaXMuY29weVdpdGhpbih0LG4saSk6VWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoZSx0aGlzLnN1YmFycmF5KG4saSksdCksb307cC5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbihlLHQsbixpKXtpZih0eXBlb2YgZT09XCJzdHJpbmdcIil7aWYodHlwZW9mIHQ9PVwic3RyaW5nXCI/KGk9dCx0PTAsbj10aGlzLmxlbmd0aCk6dHlwZW9mIG49PVwic3RyaW5nXCImJihpPW4sbj10aGlzLmxlbmd0aCksaSE9PXZvaWQgMCYmdHlwZW9mIGkhPVwic3RyaW5nXCIpdGhyb3cgbmV3IFR5cGVFcnJvcihcImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmdcIik7aWYodHlwZW9mIGk9PVwic3RyaW5nXCImJiFwLmlzRW5jb2RpbmcoaSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlVua25vd24gZW5jb2Rpbmc6IFwiK2kpO2lmKGUubGVuZ3RoPT09MSl7bGV0IHM9ZS5jaGFyQ29kZUF0KDApOyhpPT09XCJ1dGY4XCImJnM8MTI4fHxpPT09XCJsYXRpbjFcIikmJihlPXMpfX1lbHNlIHR5cGVvZiBlPT1cIm51bWJlclwiP2U9ZSYyNTU6dHlwZW9mIGU9PVwiYm9vbGVhblwiJiYoZT1OdW1iZXIoZSkpO2lmKHQ8MHx8dGhpcy5sZW5ndGg8dHx8dGhpcy5sZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk91dCBvZiByYW5nZSBpbmRleFwiKTtpZihuPD10KXJldHVybiB0aGlzO3Q9dD4+PjAsbj1uPT09dm9pZCAwP3RoaXMubGVuZ3RoOm4+Pj4wLGV8fChlPTApO2xldCBvO2lmKHR5cGVvZiBlPT1cIm51bWJlclwiKWZvcihvPXQ7bzxuOysrbyl0aGlzW29dPWU7ZWxzZXtsZXQgcz1wLmlzQnVmZmVyKGUpP2U6cC5mcm9tKGUsaSksYT1zLmxlbmd0aDtpZihhPT09MCl0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgdmFsdWUgXCInK2UrJ1wiIGlzIGludmFsaWQgZm9yIGFyZ3VtZW50IFwidmFsdWVcIicpO2ZvcihvPTA7bzxuLXQ7KytvKXRoaXNbbyt0XT1zW28lYV19cmV0dXJuIHRoaXN9O3ZhciBWZT17fTtmdW5jdGlvbiBlbihyLGUsdCl7VmVbcl09Y2xhc3MgZXh0ZW5kcyB0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcIm1lc3NhZ2VcIix7dmFsdWU6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdGhpcy5uYW1lPWAke3RoaXMubmFtZX0gWyR7cn1dYCx0aGlzLnN0YWNrLGRlbGV0ZSB0aGlzLm5hbWV9Z2V0IGNvZGUoKXtyZXR1cm4gcn1zZXQgY29kZShpKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcImNvZGVcIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6aSx3cml0YWJsZTohMH0pfXRvU3RyaW5nKCl7cmV0dXJuYCR7dGhpcy5uYW1lfSBbJHtyfV06ICR7dGhpcy5tZXNzYWdlfWB9fX1lbihcIkVSUl9CVUZGRVJfT1VUX09GX0JPVU5EU1wiLGZ1bmN0aW9uKHIpe3JldHVybiByP2Ake3J9IGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kc2A6XCJBdHRlbXB0IHRvIGFjY2VzcyBtZW1vcnkgb3V0c2lkZSBidWZmZXIgYm91bmRzXCJ9LFJhbmdlRXJyb3IpO2VuKFwiRVJSX0lOVkFMSURfQVJHX1RZUEVcIixmdW5jdGlvbihyLGUpe3JldHVybmBUaGUgXCIke3J9XCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSAke3R5cGVvZiBlfWB9LFR5cGVFcnJvcik7ZW4oXCJFUlJfT1VUX09GX1JBTkdFXCIsZnVuY3Rpb24ocixlLHQpe2xldCBuPWBUaGUgdmFsdWUgb2YgXCIke3J9XCIgaXMgb3V0IG9mIHJhbmdlLmAsaT10O3JldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHQpJiZNYXRoLmFicyh0KT4yKiozMj9pPWhpKFN0cmluZyh0KSk6dHlwZW9mIHQ9PVwiYmlnaW50XCImJihpPVN0cmluZyh0KSwodD5CaWdJbnQoMikqKkJpZ0ludCgzMil8fHQ8LShCaWdJbnQoMikqKkJpZ0ludCgzMikpKSYmKGk9aGkoaSkpLGkrPVwiblwiKSxuKz1gIEl0IG11c3QgYmUgJHtlfS4gUmVjZWl2ZWQgJHtpfWAsbn0sUmFuZ2VFcnJvcik7ZnVuY3Rpb24gaGkocil7bGV0IGU9XCJcIix0PXIubGVuZ3RoLG49clswXT09PVwiLVwiPzE6MDtmb3IoO3Q+PW4rNDt0LT0zKWU9YF8ke3Iuc2xpY2UodC0zLHQpfSR7ZX1gO3JldHVybmAke3Iuc2xpY2UoMCx0KX0ke2V9YH1mdW5jdGlvbiBxYShyLGUsdCl7WWUoZSxcIm9mZnNldFwiKSwocltlXT09PXZvaWQgMHx8cltlK3RdPT09dm9pZCAwKSYmd3QoZSxyLmxlbmd0aC0odCsxKSl9ZnVuY3Rpb24gUmkocixlLHQsbixpLG8pe2lmKHI+dHx8cjxlKXtsZXQgcz10eXBlb2YgZT09XCJiaWdpbnRcIj9cIm5cIjpcIlwiLGE7dGhyb3cgbz4zP2U9PT0wfHxlPT09QmlnSW50KDApP2E9YD49IDAke3N9IGFuZCA8IDIke3N9ICoqICR7KG8rMSkqOH0ke3N9YDphPWA+PSAtKDIke3N9ICoqICR7KG8rMSkqOC0xfSR7c30pIGFuZCA8IDIgKiogJHsobysxKSo4LTF9JHtzfWA6YT1gPj0gJHtlfSR7c30gYW5kIDw9ICR7dH0ke3N9YCxuZXcgVmUuRVJSX09VVF9PRl9SQU5HRShcInZhbHVlXCIsYSxyKX1xYShuLGksbyl9ZnVuY3Rpb24gWWUocixlKXtpZih0eXBlb2YgciE9XCJudW1iZXJcIil0aHJvdyBuZXcgVmUuRVJSX0lOVkFMSURfQVJHX1RZUEUoZSxcIm51bWJlclwiLHIpfWZ1bmN0aW9uIHd0KHIsZSx0KXt0aHJvdyBNYXRoLmZsb29yKHIpIT09cj8oWWUocix0KSxuZXcgVmUuRVJSX09VVF9PRl9SQU5HRSh0fHxcIm9mZnNldFwiLFwiYW4gaW50ZWdlclwiLHIpKTplPDA/bmV3IFZlLkVSUl9CVUZGRVJfT1VUX09GX0JPVU5EUzpuZXcgVmUuRVJSX09VVF9PRl9SQU5HRSh0fHxcIm9mZnNldFwiLGA+PSAke3Q/MTowfSBhbmQgPD0gJHtlfWAscil9dmFyIGphPS9bXisvMC05QS1aYS16LV9dL2c7ZnVuY3Rpb24gV2Eocil7aWYocj1yLnNwbGl0KFwiPVwiKVswXSxyPXIudHJpbSgpLnJlcGxhY2UoamEsXCJcIiksci5sZW5ndGg8MilyZXR1cm5cIlwiO2Zvcig7ci5sZW5ndGglNCE9PTA7KXI9citcIj1cIjtyZXR1cm4gcn1mdW5jdGlvbiBKcihyLGUpe2U9ZXx8MS8wO2xldCB0LG49ci5sZW5ndGgsaT1udWxsLG89W107Zm9yKGxldCBzPTA7czxuOysrcyl7aWYodD1yLmNoYXJDb2RlQXQocyksdD41NTI5NSYmdDw1NzM0NCl7aWYoIWkpe2lmKHQ+NTYzMTkpeyhlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1lbHNlIGlmKHMrMT09PW4peyhlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pPXQ7Y29udGludWV9aWYodDw1NjMyMCl7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpLGk9dDtjb250aW51ZX10PShpLTU1Mjk2PDwxMHx0LTU2MzIwKSs2NTUzNn1lbHNlIGkmJihlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtpZihpPW51bGwsdDwxMjgpe2lmKChlLT0xKTwwKWJyZWFrO28ucHVzaCh0KX1lbHNlIGlmKHQ8MjA0OCl7aWYoKGUtPTIpPDApYnJlYWs7by5wdXNoKHQ+PjZ8MTkyLHQmNjN8MTI4KX1lbHNlIGlmKHQ8NjU1MzYpe2lmKChlLT0zKTwwKWJyZWFrO28ucHVzaCh0Pj4xMnwyMjQsdD4+NiY2M3wxMjgsdCY2M3wxMjgpfWVsc2UgaWYodDwxMTE0MTEyKXtpZigoZS09NCk8MClicmVhaztvLnB1c2godD4+MTh8MjQwLHQ+PjEyJjYzfDEyOCx0Pj42JjYzfDEyOCx0JjYzfDEyOCl9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvZGUgcG9pbnRcIil9cmV0dXJuIG99ZnVuY3Rpb24gJGEocil7bGV0IGU9W107Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDsrK3QpZS5wdXNoKHIuY2hhckNvZGVBdCh0KSYyNTUpO3JldHVybiBlfWZ1bmN0aW9uIEdhKHIsZSl7bGV0IHQsbixpLG89W107Zm9yKGxldCBzPTA7czxyLmxlbmd0aCYmISgoZS09Mik8MCk7KytzKXQ9ci5jaGFyQ29kZUF0KHMpLG49dD4+OCxpPXQlMjU2LG8ucHVzaChpKSxvLnB1c2gobik7cmV0dXJuIG99ZnVuY3Rpb24gVGkocil7cmV0dXJuIFlyLnRvQnl0ZUFycmF5KFdhKHIpKX1mdW5jdGlvbiBVdChyLGUsdCxuKXtsZXQgaTtmb3IoaT0wO2k8biYmIShpK3Q+PWUubGVuZ3RofHxpPj1yLmxlbmd0aCk7KytpKWVbaSt0XT1yW2ldO3JldHVybiBpfWZ1bmN0aW9uIGllKHIsZSl7cmV0dXJuIHIgaW5zdGFuY2VvZiBlfHxyIT1udWxsJiZyLmNvbnN0cnVjdG9yIT1udWxsJiZyLmNvbnN0cnVjdG9yLm5hbWUhPW51bGwmJnIuY29uc3RydWN0b3IubmFtZT09PWUubmFtZX1mdW5jdGlvbiB0bihyKXtyZXR1cm4gciE9PXJ9dmFyIFZhPWZ1bmN0aW9uKCl7bGV0IHI9XCIwMTIzNDU2Nzg5YWJjZGVmXCIsZT1uZXcgQXJyYXkoMjU2KTtmb3IobGV0IHQ9MDt0PDE2OysrdCl7bGV0IG49dCoxNjtmb3IobGV0IGk9MDtpPDE2OysraSllW24raV09clt0XStyW2ldfXJldHVybiBlfSgpO2Z1bmN0aW9uIGJlKHIpe3JldHVybiB0eXBlb2YgQmlnSW50PlwidVwiP3phOnJ9ZnVuY3Rpb24gemEoKXt0aHJvdyBuZXcgRXJyb3IoXCJCaWdJbnQgbm90IHN1cHBvcnRlZFwiKX19KTt2YXIgSWk9UygoY2wsTGkpPT57YygpO3ZhciBQPUxpLmV4cG9ydHM9e30sb2Usc2U7ZnVuY3Rpb24gcm4oKXt0aHJvdyBuZXcgRXJyb3IoXCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkXCIpfWZ1bmN0aW9uIG5uKCl7dGhyb3cgbmV3IEVycm9yKFwiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkXCIpfShmdW5jdGlvbigpe3RyeXt0eXBlb2Ygc2V0VGltZW91dD09XCJmdW5jdGlvblwiP29lPXNldFRpbWVvdXQ6b2U9cm59Y2F0Y2h7b2U9cm59dHJ5e3R5cGVvZiBjbGVhclRpbWVvdXQ9PVwiZnVuY3Rpb25cIj9zZT1jbGVhclRpbWVvdXQ6c2U9bm59Y2F0Y2h7c2U9bm59fSkoKTtmdW5jdGlvbiBDaShyKXtpZihvZT09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQociwwKTtpZigob2U9PT1ybnx8IW9lKSYmc2V0VGltZW91dClyZXR1cm4gb2U9c2V0VGltZW91dCxzZXRUaW1lb3V0KHIsMCk7dHJ5e3JldHVybiBvZShyLDApfWNhdGNoe3RyeXtyZXR1cm4gb2UuY2FsbChudWxsLHIsMCl9Y2F0Y2h7cmV0dXJuIG9lLmNhbGwodGhpcyxyLDApfX19ZnVuY3Rpb24gWWEocil7aWYoc2U9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChyKTtpZigoc2U9PT1ubnx8IXNlKSYmY2xlYXJUaW1lb3V0KXJldHVybiBzZT1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KHIpO3RyeXtyZXR1cm4gc2Uocil9Y2F0Y2h7dHJ5e3JldHVybiBzZS5jYWxsKG51bGwscil9Y2F0Y2h7cmV0dXJuIHNlLmNhbGwodGhpcyxyKX19fXZhciBwZT1bXSxKZT0hMSxrZSxEdD0tMTtmdW5jdGlvbiBLYSgpeyFKZXx8IWtlfHwoSmU9ITEsa2UubGVuZ3RoP3BlPWtlLmNvbmNhdChwZSk6RHQ9LTEscGUubGVuZ3RoJiZCaSgpKX1mdW5jdGlvbiBCaSgpe2lmKCFKZSl7dmFyIHI9Q2koS2EpO0plPSEwO2Zvcih2YXIgZT1wZS5sZW5ndGg7ZTspe2ZvcihrZT1wZSxwZT1bXTsrK0R0PGU7KWtlJiZrZVtEdF0ucnVuKCk7RHQ9LTEsZT1wZS5sZW5ndGh9a2U9bnVsbCxKZT0hMSxZYShyKX19UC5uZXh0VGljaz1mdW5jdGlvbihyKXt2YXIgZT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyllW3QtMV09YXJndW1lbnRzW3RdO3BlLnB1c2gobmV3IE1pKHIsZSkpLHBlLmxlbmd0aD09PTEmJiFKZSYmQ2koQmkpfTtmdW5jdGlvbiBNaShyLGUpe3RoaXMuZnVuPXIsdGhpcy5hcnJheT1lfU1pLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfTtQLnRpdGxlPVwiYnJvd3NlclwiO1AuYnJvd3Nlcj0hMDtQLmVudj17fTtQLmFyZ3Y9W107UC52ZXJzaW9uPVwiXCI7UC52ZXJzaW9ucz17fTtmdW5jdGlvbiBoZSgpe31QLm9uPWhlO1AuYWRkTGlzdGVuZXI9aGU7UC5vbmNlPWhlO1Aub2ZmPWhlO1AucmVtb3ZlTGlzdGVuZXI9aGU7UC5yZW1vdmVBbGxMaXN0ZW5lcnM9aGU7UC5lbWl0PWhlO1AucHJlcGVuZExpc3RlbmVyPWhlO1AucHJlcGVuZE9uY2VMaXN0ZW5lcj1oZTtQLmxpc3RlbmVycz1mdW5jdGlvbihyKXtyZXR1cm5bXX07UC5iaW5kaW5nPWZ1bmN0aW9uKHIpe3Rocm93IG5ldyBFcnJvcihcInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkXCIpfTtQLmN3ZD1mdW5jdGlvbigpe3JldHVyblwiL1wifTtQLmNoZGlyPWZ1bmN0aW9uKHIpe3Rocm93IG5ldyBFcnJvcihcInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZFwiKX07UC51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwfX0pO3ZhciBBaSxYYSxjPWhhKCgpPT57QWk9QyhYZSgpKSxYYT1DKElpKCkpO3dpbmRvdy5CdWZmZXI9QWkuQnVmZmVyO3dpbmRvdy5wcm9jZXNzPVhhfSk7dmFyIGppPVMoKGxsLG9uKT0+e1widXNlIHN0cmljdFwiO2MoKTt2YXIgUWU9dHlwZW9mIFJlZmxlY3Q9PVwib2JqZWN0XCI/UmVmbGVjdDpudWxsLEZpPVFlJiZ0eXBlb2YgUWUuYXBwbHk9PVwiZnVuY3Rpb25cIj9RZS5hcHBseTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGUsdCxuKX0sTnQ7UWUmJnR5cGVvZiBRZS5vd25LZXlzPT1cImZ1bmN0aW9uXCI/TnQ9UWUub3duS2V5czpPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzP050PWZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKS5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKSl9Ok50PWZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKX07ZnVuY3Rpb24gSmEocil7Y29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4ocil9dmFyIGtpPU51bWJlci5pc05hTnx8ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT1lfTtmdW5jdGlvbiBCKCl7Qi5pbml0LmNhbGwodGhpcyl9b24uZXhwb3J0cz1CO29uLmV4cG9ydHMub25jZT10dTtCLkV2ZW50RW1pdHRlcj1CO0IucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwO0IucHJvdG90eXBlLl9ldmVudHNDb3VudD0wO0IucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwO3ZhciBQaT0xMDtmdW5jdGlvbiBIdChyKXtpZih0eXBlb2YgciE9XCJmdW5jdGlvblwiKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIHIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShCLFwiZGVmYXVsdE1heExpc3RlbmVyc1wiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBQaX0sc2V0OmZ1bmN0aW9uKHIpe2lmKHR5cGVvZiByIT1cIm51bWJlclwifHxyPDB8fGtpKHIpKXRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJkZWZhdWx0TWF4TGlzdGVuZXJzXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJytyK1wiLlwiKTtQaT1yfX0pO0IuaW5pdD1mdW5jdGlvbigpeyh0aGlzLl9ldmVudHM9PT12b2lkIDB8fHRoaXMuX2V2ZW50cz09PU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSYmKHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApLHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH07Qi5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlIT1cIm51bWJlclwifHxlPDB8fGtpKGUpKXRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJuXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJytlK1wiLlwiKTtyZXR1cm4gdGhpcy5fbWF4TGlzdGVuZXJzPWUsdGhpc307ZnVuY3Rpb24gT2kocil7cmV0dXJuIHIuX21heExpc3RlbmVycz09PXZvaWQgMD9CLmRlZmF1bHRNYXhMaXN0ZW5lcnM6ci5fbWF4TGlzdGVuZXJzfUIucHJvdG90eXBlLmdldE1heExpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybiBPaSh0aGlzKX07Qi5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdC5wdXNoKGFyZ3VtZW50c1tuXSk7dmFyIGk9ZT09PVwiZXJyb3JcIixvPXRoaXMuX2V2ZW50cztpZihvIT09dm9pZCAwKWk9aSYmby5lcnJvcj09PXZvaWQgMDtlbHNlIGlmKCFpKXJldHVybiExO2lmKGkpe3ZhciBzO2lmKHQubGVuZ3RoPjAmJihzPXRbMF0pLHMgaW5zdGFuY2VvZiBFcnJvcil0aHJvdyBzO3ZhciBhPW5ldyBFcnJvcihcIlVuaGFuZGxlZCBlcnJvci5cIisocz9cIiAoXCIrcy5tZXNzYWdlK1wiKVwiOlwiXCIpKTt0aHJvdyBhLmNvbnRleHQ9cyxhfXZhciB1PW9bZV07aWYodT09PXZvaWQgMClyZXR1cm4hMTtpZih0eXBlb2YgdT09XCJmdW5jdGlvblwiKUZpKHUsdGhpcyx0KTtlbHNlIGZvcih2YXIgZj11Lmxlbmd0aCxsPXFpKHUsZiksbj0wO248ZjsrK24pRmkobFtuXSx0aGlzLHQpO3JldHVybiEwfTtmdW5jdGlvbiBVaShyLGUsdCxuKXt2YXIgaSxvLHM7aWYoSHQodCksbz1yLl9ldmVudHMsbz09PXZvaWQgMD8obz1yLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSxyLl9ldmVudHNDb3VudD0wKTooby5uZXdMaXN0ZW5lciE9PXZvaWQgMCYmKHIuZW1pdChcIm5ld0xpc3RlbmVyXCIsZSx0Lmxpc3RlbmVyP3QubGlzdGVuZXI6dCksbz1yLl9ldmVudHMpLHM9b1tlXSkscz09PXZvaWQgMClzPW9bZV09dCwrK3IuX2V2ZW50c0NvdW50O2Vsc2UgaWYodHlwZW9mIHM9PVwiZnVuY3Rpb25cIj9zPW9bZV09bj9bdCxzXTpbcyx0XTpuP3MudW5zaGlmdCh0KTpzLnB1c2godCksaT1PaShyKSxpPjAmJnMubGVuZ3RoPmkmJiFzLndhcm5lZCl7cy53YXJuZWQ9ITA7dmFyIGE9bmV3IEVycm9yKFwiUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiBcIitzLmxlbmd0aCtcIiBcIitTdHJpbmcoZSkrXCIgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdFwiKTthLm5hbWU9XCJNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmdcIixhLmVtaXR0ZXI9cixhLnR5cGU9ZSxhLmNvdW50PXMubGVuZ3RoLEphKGEpfXJldHVybiByfUIucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIFVpKHRoaXMsZSx0LCExKX07Qi5wcm90b3R5cGUub249Qi5wcm90b3R5cGUuYWRkTGlzdGVuZXI7Qi5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIFVpKHRoaXMsZSx0LCEwKX07ZnVuY3Rpb24gUWEoKXtpZighdGhpcy5maXJlZClyZXR1cm4gdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLHRoaXMud3JhcEZuKSx0aGlzLmZpcmVkPSEwLGFyZ3VtZW50cy5sZW5ndGg9PT0wP3RoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk6dGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCxhcmd1bWVudHMpfWZ1bmN0aW9uIERpKHIsZSx0KXt2YXIgbj17ZmlyZWQ6ITEsd3JhcEZuOnZvaWQgMCx0YXJnZXQ6cix0eXBlOmUsbGlzdGVuZXI6dH0saT1RYS5iaW5kKG4pO3JldHVybiBpLmxpc3RlbmVyPXQsbi53cmFwRm49aSxpfUIucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSHQodCksdGhpcy5vbihlLERpKHRoaXMsZSx0KSksdGhpc307Qi5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3JldHVybiBIdCh0KSx0aGlzLnByZXBlbmRMaXN0ZW5lcihlLERpKHRoaXMsZSx0KSksdGhpc307Qi5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXt2YXIgbixpLG8scyxhO2lmKEh0KHQpLGk9dGhpcy5fZXZlbnRzLGk9PT12b2lkIDApcmV0dXJuIHRoaXM7aWYobj1pW2VdLG49PT12b2lkIDApcmV0dXJuIHRoaXM7aWYobj09PXR8fG4ubGlzdGVuZXI9PT10KS0tdGhpcy5fZXZlbnRzQ291bnQ9PT0wP3RoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpOihkZWxldGUgaVtlXSxpLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoXCJyZW1vdmVMaXN0ZW5lclwiLGUsbi5saXN0ZW5lcnx8dCkpO2Vsc2UgaWYodHlwZW9mIG4hPVwiZnVuY3Rpb25cIil7Zm9yKG89LTEscz1uLmxlbmd0aC0xO3M+PTA7cy0tKWlmKG5bc109PT10fHxuW3NdLmxpc3RlbmVyPT09dCl7YT1uW3NdLmxpc3RlbmVyLG89czticmVha31pZihvPDApcmV0dXJuIHRoaXM7bz09PTA/bi5zaGlmdCgpOlphKG4sbyksbi5sZW5ndGg9PT0xJiYoaVtlXT1uWzBdKSxpLnJlbW92ZUxpc3RlbmVyIT09dm9pZCAwJiZ0aGlzLmVtaXQoXCJyZW1vdmVMaXN0ZW5lclwiLGUsYXx8dCl9cmV0dXJuIHRoaXN9O0IucHJvdG90eXBlLm9mZj1CLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcjtCLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7dmFyIHQsbixpO2lmKG49dGhpcy5fZXZlbnRzLG49PT12b2lkIDApcmV0dXJuIHRoaXM7aWYobi5yZW1vdmVMaXN0ZW5lcj09PXZvaWQgMClyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTA/KHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApOm5bZV0hPT12b2lkIDAmJigtLXRoaXMuX2V2ZW50c0NvdW50PT09MD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTpkZWxldGUgbltlXSksdGhpcztpZihhcmd1bWVudHMubGVuZ3RoPT09MCl7dmFyIG89T2JqZWN0LmtleXMobikscztmb3IoaT0wO2k8by5sZW5ndGg7KytpKXM9b1tpXSxzIT09XCJyZW1vdmVMaXN0ZW5lclwiJiZ0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhzKTtyZXR1cm4gdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJyZW1vdmVMaXN0ZW5lclwiKSx0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wLHRoaXN9aWYodD1uW2VdLHR5cGVvZiB0PT1cImZ1bmN0aW9uXCIpdGhpcy5yZW1vdmVMaXN0ZW5lcihlLHQpO2Vsc2UgaWYodCE9PXZvaWQgMClmb3IoaT10Lmxlbmd0aC0xO2k+PTA7aS0tKXRoaXMucmVtb3ZlTGlzdGVuZXIoZSx0W2ldKTtyZXR1cm4gdGhpc307ZnVuY3Rpb24gTmkocixlLHQpe3ZhciBuPXIuX2V2ZW50cztpZihuPT09dm9pZCAwKXJldHVybltdO3ZhciBpPW5bZV07cmV0dXJuIGk9PT12b2lkIDA/W106dHlwZW9mIGk9PVwiZnVuY3Rpb25cIj90P1tpLmxpc3RlbmVyfHxpXTpbaV06dD9ldShpKTpxaShpLGkubGVuZ3RoKX1CLnByb3RvdHlwZS5saXN0ZW5lcnM9ZnVuY3Rpb24oZSl7cmV0dXJuIE5pKHRoaXMsZSwhMCl9O0IucHJvdG90eXBlLnJhd0xpc3RlbmVycz1mdW5jdGlvbihlKXtyZXR1cm4gTmkodGhpcyxlLCExKX07Qi5saXN0ZW5lckNvdW50PWZ1bmN0aW9uKHIsZSl7cmV0dXJuIHR5cGVvZiByLmxpc3RlbmVyQ291bnQ9PVwiZnVuY3Rpb25cIj9yLmxpc3RlbmVyQ291bnQoZSk6SGkuY2FsbChyLGUpfTtCLnByb3RvdHlwZS5saXN0ZW5lckNvdW50PUhpO2Z1bmN0aW9uIEhpKHIpe3ZhciBlPXRoaXMuX2V2ZW50cztpZihlIT09dm9pZCAwKXt2YXIgdD1lW3JdO2lmKHR5cGVvZiB0PT1cImZ1bmN0aW9uXCIpcmV0dXJuIDE7aWYodCE9PXZvaWQgMClyZXR1cm4gdC5sZW5ndGh9cmV0dXJuIDB9Qi5wcm90b3R5cGUuZXZlbnROYW1lcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudHNDb3VudD4wP050KHRoaXMuX2V2ZW50cyk6W119O2Z1bmN0aW9uIHFpKHIsZSl7Zm9yKHZhciB0PW5ldyBBcnJheShlKSxuPTA7bjxlOysrbil0W25dPXJbbl07cmV0dXJuIHR9ZnVuY3Rpb24gWmEocixlKXtmb3IoO2UrMTxyLmxlbmd0aDtlKyspcltlXT1yW2UrMV07ci5wb3AoKX1mdW5jdGlvbiBldShyKXtmb3IodmFyIGU9bmV3IEFycmF5KHIubGVuZ3RoKSx0PTA7dDxlLmxlbmd0aDsrK3QpZVt0XT1yW3RdLmxpc3RlbmVyfHxyW3RdO3JldHVybiBlfWZ1bmN0aW9uIHR1KHIsZSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gaSgpe28hPT12b2lkIDAmJnIucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLG8pLHQoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKX12YXIgbztlIT09XCJlcnJvclwiJiYobz1mdW5jdGlvbihhKXtyLnJlbW92ZUxpc3RlbmVyKGUsaSksbihhKX0sci5vbmNlKFwiZXJyb3JcIixvKSksci5vbmNlKGUsaSl9KX19KTt2YXIgT2U9UygoZGwsc24pPT57YygpO3R5cGVvZiBPYmplY3QuY3JlYXRlPT1cImZ1bmN0aW9uXCI/c24uZXhwb3J0cz1mdW5jdGlvbihlLHQpe3QmJihlLnN1cGVyXz10LGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pKX06c24uZXhwb3J0cz1mdW5jdGlvbihlLHQpe2lmKHQpe2Uuc3VwZXJfPXQ7dmFyIG49ZnVuY3Rpb24oKXt9O24ucHJvdG90eXBlPXQucHJvdG90eXBlLGUucHJvdG90eXBlPW5ldyBuLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWV9fX0pO3ZhciB1bj1TKChwbCxhbik9PntcInVzZSBzdHJpY3RcIjtjKCk7dmFyIFplPXR5cGVvZiBSZWZsZWN0PT1cIm9iamVjdFwiP1JlZmxlY3Q6bnVsbCxXaT1aZSYmdHlwZW9mIFplLmFwcGx5PT1cImZ1bmN0aW9uXCI/WmUuYXBwbHk6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChlLHQsbil9LHF0O1plJiZ0eXBlb2YgWmUub3duS2V5cz09XCJmdW5jdGlvblwiP3F0PVplLm93bktleXM6T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scz9xdD1mdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSkuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSkpfTpxdD1mdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSl9O2Z1bmN0aW9uIHJ1KHIpe2NvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKHIpfXZhciBHaT1OdW1iZXIuaXNOYU58fGZ1bmN0aW9uKGUpe3JldHVybiBlIT09ZX07ZnVuY3Rpb24gTSgpe00uaW5pdC5jYWxsKHRoaXMpfWFuLmV4cG9ydHM9TTthbi5leHBvcnRzLm9uY2U9c3U7TS5FdmVudEVtaXR0ZXI9TTtNLnByb3RvdHlwZS5fZXZlbnRzPXZvaWQgMDtNLnByb3RvdHlwZS5fZXZlbnRzQ291bnQ9MDtNLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzPXZvaWQgMDt2YXIgJGk9MTA7ZnVuY3Rpb24ganQocil7aWYodHlwZW9mIHIhPVwiZnVuY3Rpb25cIil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnK3R5cGVvZiByKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoTSxcImRlZmF1bHRNYXhMaXN0ZW5lcnNcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gJGl9LHNldDpmdW5jdGlvbihyKXtpZih0eXBlb2YgciE9XCJudW1iZXJcInx8cjwwfHxHaShyKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiZGVmYXVsdE1heExpc3RlbmVyc1wiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcrcitcIi5cIik7JGk9cn19KTtNLmluaXQ9ZnVuY3Rpb24oKXsodGhpcy5fZXZlbnRzPT09dm9pZCAwfHx0aGlzLl9ldmVudHM9PT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykmJih0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKSx0aGlzLl9tYXhMaXN0ZW5lcnM9dGhpcy5fbWF4TGlzdGVuZXJzfHx2b2lkIDB9O00ucHJvdG90eXBlLnNldE1heExpc3RlbmVycz1mdW5jdGlvbihlKXtpZih0eXBlb2YgZSE9XCJudW1iZXJcInx8ZTwwfHxHaShlKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiblwiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcrZStcIi5cIik7cmV0dXJuIHRoaXMuX21heExpc3RlbmVycz1lLHRoaXN9O2Z1bmN0aW9uIFZpKHIpe3JldHVybiByLl9tYXhMaXN0ZW5lcnM9PT12b2lkIDA/TS5kZWZhdWx0TWF4TGlzdGVuZXJzOnIuX21heExpc3RlbmVyc31NLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24oKXtyZXR1cm4gVmkodGhpcyl9O00ucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXQucHVzaChhcmd1bWVudHNbbl0pO3ZhciBpPWU9PT1cImVycm9yXCIsbz10aGlzLl9ldmVudHM7aWYobyE9PXZvaWQgMClpPWkmJm8uZXJyb3I9PT12b2lkIDA7ZWxzZSBpZighaSlyZXR1cm4hMTtpZihpKXt2YXIgcztpZih0Lmxlbmd0aD4wJiYocz10WzBdKSxzIGluc3RhbmNlb2YgRXJyb3IpdGhyb3cgczt2YXIgYT1uZXcgRXJyb3IoXCJVbmhhbmRsZWQgZXJyb3IuXCIrKHM/XCIgKFwiK3MubWVzc2FnZStcIilcIjpcIlwiKSk7dGhyb3cgYS5jb250ZXh0PXMsYX12YXIgdT1vW2VdO2lmKHU9PT12b2lkIDApcmV0dXJuITE7aWYodHlwZW9mIHU9PVwiZnVuY3Rpb25cIilXaSh1LHRoaXMsdCk7ZWxzZSBmb3IodmFyIGY9dS5sZW5ndGgsbD1KaSh1LGYpLG49MDtuPGY7KytuKVdpKGxbbl0sdGhpcyx0KTtyZXR1cm4hMH07ZnVuY3Rpb24gemkocixlLHQsbil7dmFyIGksbyxzO2lmKGp0KHQpLG89ci5fZXZlbnRzLG89PT12b2lkIDA/KG89ci5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksci5fZXZlbnRzQ291bnQ9MCk6KG8ubmV3TGlzdGVuZXIhPT12b2lkIDAmJihyLmVtaXQoXCJuZXdMaXN0ZW5lclwiLGUsdC5saXN0ZW5lcj90Lmxpc3RlbmVyOnQpLG89ci5fZXZlbnRzKSxzPW9bZV0pLHM9PT12b2lkIDApcz1vW2VdPXQsKytyLl9ldmVudHNDb3VudDtlbHNlIGlmKHR5cGVvZiBzPT1cImZ1bmN0aW9uXCI/cz1vW2VdPW4/W3Qsc106W3MsdF06bj9zLnVuc2hpZnQodCk6cy5wdXNoKHQpLGk9VmkociksaT4wJiZzLmxlbmd0aD5pJiYhcy53YXJuZWQpe3Mud2FybmVkPSEwO3ZhciBhPW5ldyBFcnJvcihcIlBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gXCIrcy5sZW5ndGgrXCIgXCIrU3RyaW5nKGUpK1wiIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXRcIik7YS5uYW1lPVwiTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nXCIsYS5lbWl0dGVyPXIsYS50eXBlPWUsYS5jb3VudD1zLmxlbmd0aCxydShhKX1yZXR1cm4gcn1NLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3JldHVybiB6aSh0aGlzLGUsdCwhMSl9O00ucHJvdG90eXBlLm9uPU0ucHJvdG90eXBlLmFkZExpc3RlbmVyO00ucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3JldHVybiB6aSh0aGlzLGUsdCwhMCl9O2Z1bmN0aW9uIG51KCl7aWYoIXRoaXMuZmlyZWQpcmV0dXJuIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSx0aGlzLndyYXBGbiksdGhpcy5maXJlZD0hMCxhcmd1bWVudHMubGVuZ3RoPT09MD90aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQpOnRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsYXJndW1lbnRzKX1mdW5jdGlvbiBZaShyLGUsdCl7dmFyIG49e2ZpcmVkOiExLHdyYXBGbjp2b2lkIDAsdGFyZ2V0OnIsdHlwZTplLGxpc3RlbmVyOnR9LGk9bnUuYmluZChuKTtyZXR1cm4gaS5saXN0ZW5lcj10LG4ud3JhcEZuPWksaX1NLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGp0KHQpLHRoaXMub24oZSxZaSh0aGlzLGUsdCkpLHRoaXN9O00ucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4ganQodCksdGhpcy5wcmVwZW5kTGlzdGVuZXIoZSxZaSh0aGlzLGUsdCkpLHRoaXN9O00ucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7dmFyIG4saSxvLHMsYTtpZihqdCh0KSxpPXRoaXMuX2V2ZW50cyxpPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKG49aVtlXSxuPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKG49PT10fHxuLmxpc3RlbmVyPT09dCktLXRoaXMuX2V2ZW50c0NvdW50PT09MD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTooZGVsZXRlIGlbZV0saS5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KFwicmVtb3ZlTGlzdGVuZXJcIixlLG4ubGlzdGVuZXJ8fHQpKTtlbHNlIGlmKHR5cGVvZiBuIT1cImZ1bmN0aW9uXCIpe2ZvcihvPS0xLHM9bi5sZW5ndGgtMTtzPj0wO3MtLSlpZihuW3NdPT09dHx8bltzXS5saXN0ZW5lcj09PXQpe2E9bltzXS5saXN0ZW5lcixvPXM7YnJlYWt9aWYobzwwKXJldHVybiB0aGlzO289PT0wP24uc2hpZnQoKTppdShuLG8pLG4ubGVuZ3RoPT09MSYmKGlbZV09blswXSksaS5yZW1vdmVMaXN0ZW5lciE9PXZvaWQgMCYmdGhpcy5lbWl0KFwicmVtb3ZlTGlzdGVuZXJcIixlLGF8fHQpfXJldHVybiB0aGlzfTtNLnByb3RvdHlwZS5vZmY9TS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7TS5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3ZhciB0LG4saTtpZihuPXRoaXMuX2V2ZW50cyxuPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKG4ucmVtb3ZlTGlzdGVuZXI9PT12b2lkIDApcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0wPyh0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKTpuW2VdIT09dm9pZCAwJiYoLS10aGlzLl9ldmVudHNDb3VudD09PTA/dGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCk6ZGVsZXRlIG5bZV0pLHRoaXM7aWYoYXJndW1lbnRzLmxlbmd0aD09PTApe3ZhciBvPU9iamVjdC5rZXlzKG4pLHM7Zm9yKGk9MDtpPG8ubGVuZ3RoOysraSlzPW9baV0scyE9PVwicmVtb3ZlTGlzdGVuZXJcIiYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMocyk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKFwicmVtb3ZlTGlzdGVuZXJcIiksdGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fZXZlbnRzQ291bnQ9MCx0aGlzfWlmKHQ9bltlXSx0eXBlb2YgdD09XCJmdW5jdGlvblwiKXRoaXMucmVtb3ZlTGlzdGVuZXIoZSx0KTtlbHNlIGlmKHQhPT12b2lkIDApZm9yKGk9dC5sZW5ndGgtMTtpPj0wO2ktLSl0aGlzLnJlbW92ZUxpc3RlbmVyKGUsdFtpXSk7cmV0dXJuIHRoaXN9O2Z1bmN0aW9uIEtpKHIsZSx0KXt2YXIgbj1yLl9ldmVudHM7aWYobj09PXZvaWQgMClyZXR1cm5bXTt2YXIgaT1uW2VdO3JldHVybiBpPT09dm9pZCAwP1tdOnR5cGVvZiBpPT1cImZ1bmN0aW9uXCI/dD9baS5saXN0ZW5lcnx8aV06W2ldOnQ/b3UoaSk6SmkoaSxpLmxlbmd0aCl9TS5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3JldHVybiBLaSh0aGlzLGUsITApfTtNLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7cmV0dXJuIEtpKHRoaXMsZSwhMSl9O00ubGlzdGVuZXJDb3VudD1mdW5jdGlvbihyLGUpe3JldHVybiB0eXBlb2Ygci5saXN0ZW5lckNvdW50PT1cImZ1bmN0aW9uXCI/ci5saXN0ZW5lckNvdW50KGUpOlhpLmNhbGwocixlKX07TS5wcm90b3R5cGUubGlzdGVuZXJDb3VudD1YaTtmdW5jdGlvbiBYaShyKXt2YXIgZT10aGlzLl9ldmVudHM7aWYoZSE9PXZvaWQgMCl7dmFyIHQ9ZVtyXTtpZih0eXBlb2YgdD09XCJmdW5jdGlvblwiKXJldHVybiAxO2lmKHQhPT12b2lkIDApcmV0dXJuIHQubGVuZ3RofXJldHVybiAwfU0ucHJvdG90eXBlLmV2ZW50TmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQ+MD9xdCh0aGlzLl9ldmVudHMpOltdfTtmdW5jdGlvbiBKaShyLGUpe2Zvcih2YXIgdD1uZXcgQXJyYXkoZSksbj0wO248ZTsrK24pdFtuXT1yW25dO3JldHVybiB0fWZ1bmN0aW9uIGl1KHIsZSl7Zm9yKDtlKzE8ci5sZW5ndGg7ZSsrKXJbZV09cltlKzFdO3IucG9wKCl9ZnVuY3Rpb24gb3Uocil7Zm9yKHZhciBlPW5ldyBBcnJheShyLmxlbmd0aCksdD0wO3Q8ZS5sZW5ndGg7Kyt0KWVbdF09clt0XS5saXN0ZW5lcnx8clt0XTtyZXR1cm4gZX1mdW5jdGlvbiBzdShyLGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGkoKXtvIT09dm9pZCAwJiZyLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIixvKSx0KFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSl9dmFyIG87ZSE9PVwiZXJyb3JcIiYmKG89ZnVuY3Rpb24oYSl7ci5yZW1vdmVMaXN0ZW5lcihlLGkpLG4oYSl9LHIub25jZShcImVycm9yXCIsbykpLHIub25jZShlLGkpfSl9fSk7dmFyIGZuPVMoKGhsLFFpKT0+e2MoKTtRaS5leHBvcnRzPXVuKCkuRXZlbnRFbWl0dGVyfSk7dmFyIGNuPVMoKCk9PntjKCl9KTt2YXIgcm89UygoeWwsdG8pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO2Z1bmN0aW9uIFppKHIsZSl7dmFyIHQ9T2JqZWN0LmtleXMocik7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG49T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhyKTtlJiYobj1uLmZpbHRlcihmdW5jdGlvbihpKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLGkpLmVudW1lcmFibGV9KSksdC5wdXNoLmFwcGx5KHQsbil9cmV0dXJuIHR9ZnVuY3Rpb24gYXUocil7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIHQ9YXJndW1lbnRzW2VdIT1udWxsP2FyZ3VtZW50c1tlXTp7fTtlJTI/WmkoT2JqZWN0KHQpLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3V1KHIsbix0W25dKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHIsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpOlppKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbihuKXtPYmplY3QuZGVmaW5lUHJvcGVydHkocixuLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKSl9KX1yZXR1cm4gcn1mdW5jdGlvbiB1dShyLGUsdCl7cmV0dXJuIGUgaW4gcj9PYmplY3QuZGVmaW5lUHJvcGVydHkocixlLHt2YWx1ZTp0LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6cltlXT10LHJ9ZnVuY3Rpb24gZnUocixlKXtpZighKHIgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIGVvKHIsZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciBuPWVbdF07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLG4ua2V5LG4pfX1mdW5jdGlvbiBjdShyLGUsdCl7cmV0dXJuIGUmJmVvKHIucHJvdG90eXBlLGUpLHQmJmVvKHIsdCkscn12YXIgbHU9WGUoKSxXdD1sdS5CdWZmZXIsZHU9Y24oKSxsbj1kdS5pbnNwZWN0LHB1PWxuJiZsbi5jdXN0b218fFwiaW5zcGVjdFwiO2Z1bmN0aW9uIGh1KHIsZSx0KXtXdC5wcm90b3R5cGUuY29weS5jYWxsKHIsZSx0KX10by5leHBvcnRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcigpe2Z1KHRoaXMsciksdGhpcy5oZWFkPW51bGwsdGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH1yZXR1cm4gY3Uocixbe2tleTpcInB1c2hcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgbj17ZGF0YTp0LG5leHQ6bnVsbH07dGhpcy5sZW5ndGg+MD90aGlzLnRhaWwubmV4dD1uOnRoaXMuaGVhZD1uLHRoaXMudGFpbD1uLCsrdGhpcy5sZW5ndGh9fSx7a2V5OlwidW5zaGlmdFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBuPXtkYXRhOnQsbmV4dDp0aGlzLmhlYWR9O3RoaXMubGVuZ3RoPT09MCYmKHRoaXMudGFpbD1uKSx0aGlzLmhlYWQ9biwrK3RoaXMubGVuZ3RofX0se2tleTpcInNoaWZ0XCIsdmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLmxlbmd0aCE9PTApe3ZhciB0PXRoaXMuaGVhZC5kYXRhO3JldHVybiB0aGlzLmxlbmd0aD09PTE/dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsOnRoaXMuaGVhZD10aGlzLmhlYWQubmV4dCwtLXRoaXMubGVuZ3RoLHR9fX0se2tleTpcImNsZWFyXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmhlYWQ9dGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH19LHtrZXk6XCJqb2luXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodGhpcy5sZW5ndGg9PT0wKXJldHVyblwiXCI7Zm9yKHZhciBuPXRoaXMuaGVhZCxpPVwiXCIrbi5kYXRhO249bi5uZXh0OylpKz10K24uZGF0YTtyZXR1cm4gaX19LHtrZXk6XCJjb25jYXRcIix2YWx1ZTpmdW5jdGlvbih0KXtpZih0aGlzLmxlbmd0aD09PTApcmV0dXJuIFd0LmFsbG9jKDApO2Zvcih2YXIgbj1XdC5hbGxvY1Vuc2FmZSh0Pj4+MCksaT10aGlzLmhlYWQsbz0wO2k7KWh1KGkuZGF0YSxuLG8pLG8rPWkuZGF0YS5sZW5ndGgsaT1pLm5leHQ7cmV0dXJuIG59fSx7a2V5OlwiY29uc3VtZVwiLHZhbHVlOmZ1bmN0aW9uKHQsbil7dmFyIGk7cmV0dXJuIHQ8dGhpcy5oZWFkLmRhdGEubGVuZ3RoPyhpPXRoaXMuaGVhZC5kYXRhLnNsaWNlKDAsdCksdGhpcy5oZWFkLmRhdGE9dGhpcy5oZWFkLmRhdGEuc2xpY2UodCkpOnQ9PT10aGlzLmhlYWQuZGF0YS5sZW5ndGg/aT10aGlzLnNoaWZ0KCk6aT1uP3RoaXMuX2dldFN0cmluZyh0KTp0aGlzLl9nZXRCdWZmZXIodCksaX19LHtrZXk6XCJmaXJzdFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGVhZC5kYXRhfX0se2tleTpcIl9nZXRTdHJpbmdcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgbj10aGlzLmhlYWQsaT0xLG89bi5kYXRhO2Zvcih0LT1vLmxlbmd0aDtuPW4ubmV4dDspe3ZhciBzPW4uZGF0YSxhPXQ+cy5sZW5ndGg/cy5sZW5ndGg6dDtpZihhPT09cy5sZW5ndGg/bys9czpvKz1zLnNsaWNlKDAsdCksdC09YSx0PT09MCl7YT09PXMubGVuZ3RoPygrK2ksbi5uZXh0P3RoaXMuaGVhZD1uLm5leHQ6dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsKToodGhpcy5oZWFkPW4sbi5kYXRhPXMuc2xpY2UoYSkpO2JyZWFrfSsraX1yZXR1cm4gdGhpcy5sZW5ndGgtPWksb319LHtrZXk6XCJfZ2V0QnVmZmVyXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIG49V3QuYWxsb2NVbnNhZmUodCksaT10aGlzLmhlYWQsbz0xO2ZvcihpLmRhdGEuY29weShuKSx0LT1pLmRhdGEubGVuZ3RoO2k9aS5uZXh0Oyl7dmFyIHM9aS5kYXRhLGE9dD5zLmxlbmd0aD9zLmxlbmd0aDp0O2lmKHMuY29weShuLG4ubGVuZ3RoLXQsMCxhKSx0LT1hLHQ9PT0wKXthPT09cy5sZW5ndGg/KCsrbyxpLm5leHQ/dGhpcy5oZWFkPWkubmV4dDp0aGlzLmhlYWQ9dGhpcy50YWlsPW51bGwpOih0aGlzLmhlYWQ9aSxpLmRhdGE9cy5zbGljZShhKSk7YnJlYWt9KytvfXJldHVybiB0aGlzLmxlbmd0aC09byxufX0se2tleTpwdSx2YWx1ZTpmdW5jdGlvbih0LG4pe3JldHVybiBsbih0aGlzLGF1KHt9LG4se2RlcHRoOjAsY3VzdG9tSW5zcGVjdDohMX0pKX19XSkscn0oKX0pO3ZhciBwbj1TKChibCxpbyk9PntcInVzZSBzdHJpY3RcIjtjKCk7ZnVuY3Rpb24gbXUocixlKXt2YXIgdD10aGlzLG49dGhpcy5fcmVhZGFibGVTdGF0ZSYmdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQsaT10aGlzLl93cml0YWJsZVN0YXRlJiZ0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtyZXR1cm4gbnx8aT8oZT9lKHIpOnImJih0aGlzLl93cml0YWJsZVN0YXRlP3RoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkfHwodGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAscHJvY2Vzcy5uZXh0VGljayhkbix0aGlzLHIpKTpwcm9jZXNzLm5leHRUaWNrKGRuLHRoaXMscikpLHRoaXMpOih0aGlzLl9yZWFkYWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITApLHRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD0hMCksdGhpcy5fZGVzdHJveShyfHxudWxsLGZ1bmN0aW9uKG8peyFlJiZvP3QuX3dyaXRhYmxlU3RhdGU/dC5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ/cHJvY2Vzcy5uZXh0VGljaygkdCx0KToodC5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAscHJvY2Vzcy5uZXh0VGljayhubyx0LG8pKTpwcm9jZXNzLm5leHRUaWNrKG5vLHQsbyk6ZT8ocHJvY2Vzcy5uZXh0VGljaygkdCx0KSxlKG8pKTpwcm9jZXNzLm5leHRUaWNrKCR0LHQpfSksdGhpcyl9ZnVuY3Rpb24gbm8ocixlKXtkbihyLGUpLCR0KHIpfWZ1bmN0aW9uICR0KHIpe3IuX3dyaXRhYmxlU3RhdGUmJiFyLl93cml0YWJsZVN0YXRlLmVtaXRDbG9zZXx8ci5fcmVhZGFibGVTdGF0ZSYmIXIuX3JlYWRhYmxlU3RhdGUuZW1pdENsb3NlfHxyLmVtaXQoXCJjbG9zZVwiKX1mdW5jdGlvbiBndSgpe3RoaXMuX3JlYWRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD0hMSx0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRpbmc9ITEsdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRlZD0hMSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQ9ITEpLHRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kaW5nPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluYWxDYWxsZWQ9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5wcmVmaW5pc2hlZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSExKX1mdW5jdGlvbiBkbihyLGUpe3IuZW1pdChcImVycm9yXCIsZSl9ZnVuY3Rpb24geXUocixlKXt2YXIgdD1yLl9yZWFkYWJsZVN0YXRlLG49ci5fd3JpdGFibGVTdGF0ZTt0JiZ0LmF1dG9EZXN0cm95fHxuJiZuLmF1dG9EZXN0cm95P3IuZGVzdHJveShlKTpyLmVtaXQoXCJlcnJvclwiLGUpfWlvLmV4cG9ydHM9e2Rlc3Ryb3k6bXUsdW5kZXN0cm95Omd1LGVycm9yT3JEZXN0cm95Onl1fX0pO3ZhciBVZT1TKCh4bCxhbyk9PntcInVzZSBzdHJpY3RcIjtjKCk7ZnVuY3Rpb24gYnUocixlKXtyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSxyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1yLHIuX19wcm90b19fPWV9dmFyIHNvPXt9O2Z1bmN0aW9uIFgocixlLHQpe3R8fCh0PUVycm9yKTtmdW5jdGlvbiBuKG8scyxhKXtyZXR1cm4gdHlwZW9mIGU9PVwic3RyaW5nXCI/ZTplKG8scyxhKX12YXIgaT1mdW5jdGlvbihvKXtidShzLG8pO2Z1bmN0aW9uIHMoYSx1LGYpe3JldHVybiBvLmNhbGwodGhpcyxuKGEsdSxmKSl8fHRoaXN9cmV0dXJuIHN9KHQpO2kucHJvdG90eXBlLm5hbWU9dC5uYW1lLGkucHJvdG90eXBlLmNvZGU9cixzb1tyXT1pfWZ1bmN0aW9uIG9vKHIsZSl7aWYoQXJyYXkuaXNBcnJheShyKSl7dmFyIHQ9ci5sZW5ndGg7cmV0dXJuIHI9ci5tYXAoZnVuY3Rpb24obil7cmV0dXJuIFN0cmluZyhuKX0pLHQ+Mj9cIm9uZSBvZiBcIi5jb25jYXQoZSxcIiBcIikuY29uY2F0KHIuc2xpY2UoMCx0LTEpLmpvaW4oXCIsIFwiKSxcIiwgb3IgXCIpK3JbdC0xXTp0PT09Mj9cIm9uZSBvZiBcIi5jb25jYXQoZSxcIiBcIikuY29uY2F0KHJbMF0sXCIgb3IgXCIpLmNvbmNhdChyWzFdKTpcIm9mIFwiLmNvbmNhdChlLFwiIFwiKS5jb25jYXQoclswXSl9ZWxzZSByZXR1cm5cIm9mIFwiLmNvbmNhdChlLFwiIFwiKS5jb25jYXQoU3RyaW5nKHIpKX1mdW5jdGlvbiB4dShyLGUsdCl7cmV0dXJuIHIuc3Vic3RyKCF0fHx0PDA/MDordCxlLmxlbmd0aCk9PT1lfWZ1bmN0aW9uIF91KHIsZSx0KXtyZXR1cm4odD09PXZvaWQgMHx8dD5yLmxlbmd0aCkmJih0PXIubGVuZ3RoKSxyLnN1YnN0cmluZyh0LWUubGVuZ3RoLHQpPT09ZX1mdW5jdGlvbiB3dShyLGUsdCl7cmV0dXJuIHR5cGVvZiB0IT1cIm51bWJlclwiJiYodD0wKSx0K2UubGVuZ3RoPnIubGVuZ3RoPyExOnIuaW5kZXhPZihlLHQpIT09LTF9WChcIkVSUl9JTlZBTElEX09QVF9WQUxVRVwiLGZ1bmN0aW9uKHIsZSl7cmV0dXJuJ1RoZSB2YWx1ZSBcIicrZSsnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwiJytyKydcIid9LFR5cGVFcnJvcik7WChcIkVSUl9JTlZBTElEX0FSR19UWVBFXCIsZnVuY3Rpb24ocixlLHQpe3ZhciBuO3R5cGVvZiBlPT1cInN0cmluZ1wiJiZ4dShlLFwibm90IFwiKT8obj1cIm11c3Qgbm90IGJlXCIsZT1lLnJlcGxhY2UoL15ub3QgLyxcIlwiKSk6bj1cIm11c3QgYmVcIjt2YXIgaTtpZihfdShyLFwiIGFyZ3VtZW50XCIpKWk9XCJUaGUgXCIuY29uY2F0KHIsXCIgXCIpLmNvbmNhdChuLFwiIFwiKS5jb25jYXQob28oZSxcInR5cGVcIikpO2Vsc2V7dmFyIG89d3UocixcIi5cIik/XCJwcm9wZXJ0eVwiOlwiYXJndW1lbnRcIjtpPSdUaGUgXCInLmNvbmNhdChyLCdcIiAnKS5jb25jYXQobyxcIiBcIikuY29uY2F0KG4sXCIgXCIpLmNvbmNhdChvbyhlLFwidHlwZVwiKSl9cmV0dXJuIGkrPVwiLiBSZWNlaXZlZCB0eXBlIFwiLmNvbmNhdCh0eXBlb2YgdCksaX0sVHlwZUVycm9yKTtYKFwiRVJSX1NUUkVBTV9QVVNIX0FGVEVSX0VPRlwiLFwic3RyZWFtLnB1c2goKSBhZnRlciBFT0ZcIik7WChcIkVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEXCIsZnVuY3Rpb24ocil7cmV0dXJuXCJUaGUgXCIrcitcIiBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkXCJ9KTtYKFwiRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0VcIixcIlByZW1hdHVyZSBjbG9zZVwiKTtYKFwiRVJSX1NUUkVBTV9ERVNUUk9ZRURcIixmdW5jdGlvbihyKXtyZXR1cm5cIkNhbm5vdCBjYWxsIFwiK3IrXCIgYWZ0ZXIgYSBzdHJlYW0gd2FzIGRlc3Ryb3llZFwifSk7WChcIkVSUl9NVUxUSVBMRV9DQUxMQkFDS1wiLFwiQ2FsbGJhY2sgY2FsbGVkIG11bHRpcGxlIHRpbWVzXCIpO1goXCJFUlJfU1RSRUFNX0NBTk5PVF9QSVBFXCIsXCJDYW5ub3QgcGlwZSwgbm90IHJlYWRhYmxlXCIpO1goXCJFUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORFwiLFwid3JpdGUgYWZ0ZXIgZW5kXCIpO1goXCJFUlJfU1RSRUFNX05VTExfVkFMVUVTXCIsXCJNYXkgbm90IHdyaXRlIG51bGwgdmFsdWVzIHRvIHN0cmVhbVwiLFR5cGVFcnJvcik7WChcIkVSUl9VTktOT1dOX0VOQ09ESU5HXCIsZnVuY3Rpb24ocil7cmV0dXJuXCJVbmtub3duIGVuY29kaW5nOiBcIityfSxUeXBlRXJyb3IpO1goXCJFUlJfU1RSRUFNX1VOU0hJRlRfQUZURVJfRU5EX0VWRU5UXCIsXCJzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudFwiKTthby5leHBvcnRzLmNvZGVzPXNvfSk7dmFyIGhuPVMoKF9sLHVvKT0+e1widXNlIHN0cmljdFwiO2MoKTt2YXIgdnU9VWUoKS5jb2Rlcy5FUlJfSU5WQUxJRF9PUFRfVkFMVUU7ZnVuY3Rpb24gRXUocixlLHQpe3JldHVybiByLmhpZ2hXYXRlck1hcmshPW51bGw/ci5oaWdoV2F0ZXJNYXJrOmU/clt0XTpudWxsfWZ1bmN0aW9uIFN1KHIsZSx0LG4pe3ZhciBpPUV1KGUsbix0KTtpZihpIT1udWxsKXtpZighKGlzRmluaXRlKGkpJiZNYXRoLmZsb29yKGkpPT09aSl8fGk8MCl7dmFyIG89bj90OlwiaGlnaFdhdGVyTWFya1wiO3Rocm93IG5ldyB2dShvLGkpfXJldHVybiBNYXRoLmZsb29yKGkpfXJldHVybiByLm9iamVjdE1vZGU/MTY6MTYqMTAyNH11by5leHBvcnRzPXtnZXRIaWdoV2F0ZXJNYXJrOlN1fX0pO3ZhciBjbz1TKCh3bCxmbyk9PntjKCk7Zm8uZXhwb3J0cz1SdTtmdW5jdGlvbiBSdShyLGUpe2lmKG1uKFwibm9EZXByZWNhdGlvblwiKSlyZXR1cm4gcjt2YXIgdD0hMTtmdW5jdGlvbiBuKCl7aWYoIXQpe2lmKG1uKFwidGhyb3dEZXByZWNhdGlvblwiKSl0aHJvdyBuZXcgRXJyb3IoZSk7bW4oXCJ0cmFjZURlcHJlY2F0aW9uXCIpP2NvbnNvbGUudHJhY2UoZSk6Y29uc29sZS53YXJuKGUpLHQ9ITB9cmV0dXJuIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBufWZ1bmN0aW9uIG1uKHIpe3RyeXtpZighZ2xvYmFsLmxvY2FsU3RvcmFnZSlyZXR1cm4hMX1jYXRjaHtyZXR1cm4hMX12YXIgZT1nbG9iYWwubG9jYWxTdG9yYWdlW3JdO3JldHVybiBlPT1udWxsPyExOlN0cmluZyhlKS50b0xvd2VyQ2FzZSgpPT09XCJ0cnVlXCJ9fSk7dmFyIGJuPVMoKHZsLHlvKT0+e1widXNlIHN0cmljdFwiO2MoKTt5by5leHBvcnRzPUY7ZnVuY3Rpb24gcG8ocil7dmFyIGU9dGhpczt0aGlzLm5leHQ9bnVsbCx0aGlzLmVudHJ5PW51bGwsdGhpcy5maW5pc2g9ZnVuY3Rpb24oKXtRdShlLHIpfX12YXIgZXQ7Ri5Xcml0YWJsZVN0YXRlPUV0O3ZhciBUdT17ZGVwcmVjYXRlOmNvKCl9LGhvPWZuKCksVnQ9WGUoKS5CdWZmZXIsQ3U9Z2xvYmFsLlVpbnQ4QXJyYXl8fGZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBCdShyKXtyZXR1cm4gVnQuZnJvbShyKX1mdW5jdGlvbiBNdShyKXtyZXR1cm4gVnQuaXNCdWZmZXIocil8fHIgaW5zdGFuY2VvZiBDdX12YXIgeW49cG4oKSxMdT1obigpLEl1PUx1LmdldEhpZ2hXYXRlck1hcmsseGU9VWUoKS5jb2RlcyxBdT14ZS5FUlJfSU5WQUxJRF9BUkdfVFlQRSxGdT14ZS5FUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCxQdT14ZS5FUlJfTVVMVElQTEVfQ0FMTEJBQ0ssa3U9eGUuRVJSX1NUUkVBTV9DQU5OT1RfUElQRSxPdT14ZS5FUlJfU1RSRUFNX0RFU1RST1lFRCxVdT14ZS5FUlJfU1RSRUFNX05VTExfVkFMVUVTLER1PXhlLkVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5ELE51PXhlLkVSUl9VTktOT1dOX0VOQ09ESU5HLHR0PXluLmVycm9yT3JEZXN0cm95O09lKCkoRixobyk7ZnVuY3Rpb24gSHUoKXt9ZnVuY3Rpb24gRXQocixlLHQpe2V0PWV0fHxEZSgpLHI9cnx8e30sdHlwZW9mIHQhPVwiYm9vbGVhblwiJiYodD1lIGluc3RhbmNlb2YgZXQpLHRoaXMub2JqZWN0TW9kZT0hIXIub2JqZWN0TW9kZSx0JiYodGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISFyLndyaXRhYmxlT2JqZWN0TW9kZSksdGhpcy5oaWdoV2F0ZXJNYXJrPUl1KHRoaXMscixcIndyaXRhYmxlSGlnaFdhdGVyTWFya1wiLHQpLHRoaXMuZmluYWxDYWxsZWQ9ITEsdGhpcy5uZWVkRHJhaW49ITEsdGhpcy5lbmRpbmc9ITEsdGhpcy5lbmRlZD0hMSx0aGlzLmZpbmlzaGVkPSExLHRoaXMuZGVzdHJveWVkPSExO3ZhciBuPXIuZGVjb2RlU3RyaW5ncz09PSExO3RoaXMuZGVjb2RlU3RyaW5ncz0hbix0aGlzLmRlZmF1bHRFbmNvZGluZz1yLmRlZmF1bHRFbmNvZGluZ3x8XCJ1dGY4XCIsdGhpcy5sZW5ndGg9MCx0aGlzLndyaXRpbmc9ITEsdGhpcy5jb3JrZWQ9MCx0aGlzLnN5bmM9ITAsdGhpcy5idWZmZXJQcm9jZXNzaW5nPSExLHRoaXMub253cml0ZT1mdW5jdGlvbihpKXt6dShlLGkpfSx0aGlzLndyaXRlY2I9bnVsbCx0aGlzLndyaXRlbGVuPTAsdGhpcy5idWZmZXJlZFJlcXVlc3Q9bnVsbCx0aGlzLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCx0aGlzLnBlbmRpbmdjYj0wLHRoaXMucHJlZmluaXNoZWQ9ITEsdGhpcy5lcnJvckVtaXR0ZWQ9ITEsdGhpcy5lbWl0Q2xvc2U9ci5lbWl0Q2xvc2UhPT0hMSx0aGlzLmF1dG9EZXN0cm95PSEhci5hdXRvRGVzdHJveSx0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTAsdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IHBvKHRoaXMpfUV0LnByb3RvdHlwZS5nZXRCdWZmZXI9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5idWZmZXJlZFJlcXVlc3QsdD1bXTtlOyl0LnB1c2goZSksZT1lLm5leHQ7cmV0dXJuIHR9OyhmdW5jdGlvbigpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoRXQucHJvdG90eXBlLFwiYnVmZmVyXCIse2dldDpUdS5kZXByZWNhdGUoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRCdWZmZXIoKX0sXCJfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciBpbnN0ZWFkLlwiLFwiREVQMDAwM1wiKX0pfWNhdGNoe319KSgpO3ZhciBHdDt0eXBlb2YgU3ltYm9sPT1cImZ1bmN0aW9uXCImJlN5bWJvbC5oYXNJbnN0YW5jZSYmdHlwZW9mIEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdPT1cImZ1bmN0aW9uXCI/KEd0PUZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGLFN5bWJvbC5oYXNJbnN0YW5jZSx7dmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEd0LmNhbGwodGhpcyxlKT8hMDp0aGlzIT09Rj8hMTplJiZlLl93cml0YWJsZVN0YXRlIGluc3RhbmNlb2YgRXR9fSkpOkd0PWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgdGhpc307ZnVuY3Rpb24gRihyKXtldD1ldHx8RGUoKTt2YXIgZT10aGlzIGluc3RhbmNlb2YgZXQ7aWYoIWUmJiFHdC5jYWxsKEYsdGhpcykpcmV0dXJuIG5ldyBGKHIpO3RoaXMuX3dyaXRhYmxlU3RhdGU9bmV3IEV0KHIsdGhpcyxlKSx0aGlzLndyaXRhYmxlPSEwLHImJih0eXBlb2Ygci53cml0ZT09XCJmdW5jdGlvblwiJiYodGhpcy5fd3JpdGU9ci53cml0ZSksdHlwZW9mIHIud3JpdGV2PT1cImZ1bmN0aW9uXCImJih0aGlzLl93cml0ZXY9ci53cml0ZXYpLHR5cGVvZiByLmRlc3Ryb3k9PVwiZnVuY3Rpb25cIiYmKHRoaXMuX2Rlc3Ryb3k9ci5kZXN0cm95KSx0eXBlb2Ygci5maW5hbD09XCJmdW5jdGlvblwiJiYodGhpcy5fZmluYWw9ci5maW5hbCkpLGhvLmNhbGwodGhpcyl9Ri5wcm90b3R5cGUucGlwZT1mdW5jdGlvbigpe3R0KHRoaXMsbmV3IGt1KX07ZnVuY3Rpb24gcXUocixlKXt2YXIgdD1uZXcgRHU7dHQocix0KSxwcm9jZXNzLm5leHRUaWNrKGUsdCl9ZnVuY3Rpb24ganUocixlLHQsbil7dmFyIGk7cmV0dXJuIHQ9PT1udWxsP2k9bmV3IFV1OnR5cGVvZiB0IT1cInN0cmluZ1wiJiYhZS5vYmplY3RNb2RlJiYoaT1uZXcgQXUoXCJjaHVua1wiLFtcInN0cmluZ1wiLFwiQnVmZmVyXCJdLHQpKSxpPyh0dChyLGkpLHByb2Nlc3MubmV4dFRpY2sobixpKSwhMSk6ITB9Ri5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24ocixlLHQpe3ZhciBuPXRoaXMuX3dyaXRhYmxlU3RhdGUsaT0hMSxvPSFuLm9iamVjdE1vZGUmJk11KHIpO3JldHVybiBvJiYhVnQuaXNCdWZmZXIocikmJihyPUJ1KHIpKSx0eXBlb2YgZT09XCJmdW5jdGlvblwiJiYodD1lLGU9bnVsbCksbz9lPVwiYnVmZmVyXCI6ZXx8KGU9bi5kZWZhdWx0RW5jb2RpbmcpLHR5cGVvZiB0IT1cImZ1bmN0aW9uXCImJih0PUh1KSxuLmVuZGluZz9xdSh0aGlzLHQpOihvfHxqdSh0aGlzLG4scix0KSkmJihuLnBlbmRpbmdjYisrLGk9JHUodGhpcyxuLG8scixlLHQpKSxpfTtGLnByb3RvdHlwZS5jb3JrPWZ1bmN0aW9uKCl7dGhpcy5fd3JpdGFibGVTdGF0ZS5jb3JrZWQrK307Ri5wcm90b3R5cGUudW5jb3JrPWZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5fd3JpdGFibGVTdGF0ZTtyLmNvcmtlZCYmKHIuY29ya2VkLS0sIXIud3JpdGluZyYmIXIuY29ya2VkJiYhci5idWZmZXJQcm9jZXNzaW5nJiZyLmJ1ZmZlcmVkUmVxdWVzdCYmbW8odGhpcyxyKSl9O0YucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZz1mdW5jdGlvbihlKXtpZih0eXBlb2YgZT09XCJzdHJpbmdcIiYmKGU9ZS50b0xvd2VyQ2FzZSgpKSwhKFtcImhleFwiLFwidXRmOFwiLFwidXRmLThcIixcImFzY2lpXCIsXCJiaW5hcnlcIixcImJhc2U2NFwiLFwidWNzMlwiLFwidWNzLTJcIixcInV0ZjE2bGVcIixcInV0Zi0xNmxlXCIsXCJyYXdcIl0uaW5kZXhPZigoZStcIlwiKS50b0xvd2VyQ2FzZSgpKT4tMSkpdGhyb3cgbmV3IE51KGUpO3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmRlZmF1bHRFbmNvZGluZz1lLHRoaXN9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShGLnByb3RvdHlwZSxcIndyaXRhYmxlQnVmZmVyXCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUmJnRoaXMuX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyKCl9fSk7ZnVuY3Rpb24gV3UocixlLHQpe3JldHVybiFyLm9iamVjdE1vZGUmJnIuZGVjb2RlU3RyaW5ncyE9PSExJiZ0eXBlb2YgZT09XCJzdHJpbmdcIiYmKGU9VnQuZnJvbShlLHQpKSxlfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShGLnByb3RvdHlwZSxcIndyaXRhYmxlSGlnaFdhdGVyTWFya1wiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcmt9fSk7ZnVuY3Rpb24gJHUocixlLHQsbixpLG8pe2lmKCF0KXt2YXIgcz1XdShlLG4saSk7biE9PXMmJih0PSEwLGk9XCJidWZmZXJcIixuPXMpfXZhciBhPWUub2JqZWN0TW9kZT8xOm4ubGVuZ3RoO2UubGVuZ3RoKz1hO3ZhciB1PWUubGVuZ3RoPGUuaGlnaFdhdGVyTWFyaztpZih1fHwoZS5uZWVkRHJhaW49ITApLGUud3JpdGluZ3x8ZS5jb3JrZWQpe3ZhciBmPWUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9e2NodW5rOm4sZW5jb2Rpbmc6aSxpc0J1Zjp0LGNhbGxiYWNrOm8sbmV4dDpudWxsfSxmP2YubmV4dD1lLmxhc3RCdWZmZXJlZFJlcXVlc3Q6ZS5idWZmZXJlZFJlcXVlc3Q9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0LGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQrPTF9ZWxzZSBnbihyLGUsITEsYSxuLGksbyk7cmV0dXJuIHV9ZnVuY3Rpb24gZ24ocixlLHQsbixpLG8scyl7ZS53cml0ZWxlbj1uLGUud3JpdGVjYj1zLGUud3JpdGluZz0hMCxlLnN5bmM9ITAsZS5kZXN0cm95ZWQ/ZS5vbndyaXRlKG5ldyBPdShcIndyaXRlXCIpKTp0P3IuX3dyaXRldihpLGUub253cml0ZSk6ci5fd3JpdGUoaSxvLGUub253cml0ZSksZS5zeW5jPSExfWZ1bmN0aW9uIEd1KHIsZSx0LG4saSl7LS1lLnBlbmRpbmdjYix0Pyhwcm9jZXNzLm5leHRUaWNrKGksbikscHJvY2Vzcy5uZXh0VGljayh2dCxyLGUpLHIuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwLHR0KHIsbikpOihpKG4pLHIuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwLHR0KHIsbiksdnQocixlKSl9ZnVuY3Rpb24gVnUocil7ci53cml0aW5nPSExLHIud3JpdGVjYj1udWxsLHIubGVuZ3RoLT1yLndyaXRlbGVuLHIud3JpdGVsZW49MH1mdW5jdGlvbiB6dShyLGUpe3ZhciB0PXIuX3dyaXRhYmxlU3RhdGUsbj10LnN5bmMsaT10LndyaXRlY2I7aWYodHlwZW9mIGkhPVwiZnVuY3Rpb25cIil0aHJvdyBuZXcgUHU7aWYoVnUodCksZSlHdShyLHQsbixlLGkpO2Vsc2V7dmFyIG89Z28odCl8fHIuZGVzdHJveWVkOyFvJiYhdC5jb3JrZWQmJiF0LmJ1ZmZlclByb2Nlc3NpbmcmJnQuYnVmZmVyZWRSZXF1ZXN0JiZtbyhyLHQpLG4/cHJvY2Vzcy5uZXh0VGljayhsbyxyLHQsbyxpKTpsbyhyLHQsbyxpKX19ZnVuY3Rpb24gbG8ocixlLHQsbil7dHx8WXUocixlKSxlLnBlbmRpbmdjYi0tLG4oKSx2dChyLGUpfWZ1bmN0aW9uIFl1KHIsZSl7ZS5sZW5ndGg9PT0wJiZlLm5lZWREcmFpbiYmKGUubmVlZERyYWluPSExLHIuZW1pdChcImRyYWluXCIpKX1mdW5jdGlvbiBtbyhyLGUpe2UuYnVmZmVyUHJvY2Vzc2luZz0hMDt2YXIgdD1lLmJ1ZmZlcmVkUmVxdWVzdDtpZihyLl93cml0ZXYmJnQmJnQubmV4dCl7dmFyIG49ZS5idWZmZXJlZFJlcXVlc3RDb3VudCxpPW5ldyBBcnJheShuKSxvPWUuY29ya2VkUmVxdWVzdHNGcmVlO28uZW50cnk9dDtmb3IodmFyIHM9MCxhPSEwO3Q7KWlbc109dCx0LmlzQnVmfHwoYT0hMSksdD10Lm5leHQscys9MTtpLmFsbEJ1ZmZlcnM9YSxnbihyLGUsITAsZS5sZW5ndGgsaSxcIlwiLG8uZmluaXNoKSxlLnBlbmRpbmdjYisrLGUubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLG8ubmV4dD8oZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9by5uZXh0LG8ubmV4dD1udWxsKTplLmNvcmtlZFJlcXVlc3RzRnJlZT1uZXcgcG8oZSksZS5idWZmZXJlZFJlcXVlc3RDb3VudD0wfWVsc2V7Zm9yKDt0Oyl7dmFyIHU9dC5jaHVuayxmPXQuZW5jb2RpbmcsbD10LmNhbGxiYWNrLGQ9ZS5vYmplY3RNb2RlPzE6dS5sZW5ndGg7aWYoZ24ocixlLCExLGQsdSxmLGwpLHQ9dC5uZXh0LGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQtLSxlLndyaXRpbmcpYnJlYWt9dD09PW51bGwmJihlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCl9ZS5idWZmZXJlZFJlcXVlc3Q9dCxlLmJ1ZmZlclByb2Nlc3Npbmc9ITF9Ri5wcm90b3R5cGUuX3dyaXRlPWZ1bmN0aW9uKHIsZSx0KXt0KG5ldyBGdShcIl93cml0ZSgpXCIpKX07Ri5wcm90b3R5cGUuX3dyaXRldj1udWxsO0YucHJvdG90eXBlLmVuZD1mdW5jdGlvbihyLGUsdCl7dmFyIG49dGhpcy5fd3JpdGFibGVTdGF0ZTtyZXR1cm4gdHlwZW9mIHI9PVwiZnVuY3Rpb25cIj8odD1yLHI9bnVsbCxlPW51bGwpOnR5cGVvZiBlPT1cImZ1bmN0aW9uXCImJih0PWUsZT1udWxsKSxyIT1udWxsJiZ0aGlzLndyaXRlKHIsZSksbi5jb3JrZWQmJihuLmNvcmtlZD0xLHRoaXMudW5jb3JrKCkpLG4uZW5kaW5nfHxKdSh0aGlzLG4sdCksdGhpc307T2JqZWN0LmRlZmluZVByb3BlcnR5KEYucHJvdG90eXBlLFwid3JpdGFibGVMZW5ndGhcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5sZW5ndGh9fSk7ZnVuY3Rpb24gZ28ocil7cmV0dXJuIHIuZW5kaW5nJiZyLmxlbmd0aD09PTAmJnIuYnVmZmVyZWRSZXF1ZXN0PT09bnVsbCYmIXIuZmluaXNoZWQmJiFyLndyaXRpbmd9ZnVuY3Rpb24gS3UocixlKXtyLl9maW5hbChmdW5jdGlvbih0KXtlLnBlbmRpbmdjYi0tLHQmJnR0KHIsdCksZS5wcmVmaW5pc2hlZD0hMCxyLmVtaXQoXCJwcmVmaW5pc2hcIiksdnQocixlKX0pfWZ1bmN0aW9uIFh1KHIsZSl7IWUucHJlZmluaXNoZWQmJiFlLmZpbmFsQ2FsbGVkJiYodHlwZW9mIHIuX2ZpbmFsPT1cImZ1bmN0aW9uXCImJiFlLmRlc3Ryb3llZD8oZS5wZW5kaW5nY2IrKyxlLmZpbmFsQ2FsbGVkPSEwLHByb2Nlc3MubmV4dFRpY2soS3UscixlKSk6KGUucHJlZmluaXNoZWQ9ITAsci5lbWl0KFwicHJlZmluaXNoXCIpKSl9ZnVuY3Rpb24gdnQocixlKXt2YXIgdD1nbyhlKTtpZih0JiYoWHUocixlKSxlLnBlbmRpbmdjYj09PTAmJihlLmZpbmlzaGVkPSEwLHIuZW1pdChcImZpbmlzaFwiKSxlLmF1dG9EZXN0cm95KSkpe3ZhciBuPXIuX3JlYWRhYmxlU3RhdGU7KCFufHxuLmF1dG9EZXN0cm95JiZuLmVuZEVtaXR0ZWQpJiZyLmRlc3Ryb3koKX1yZXR1cm4gdH1mdW5jdGlvbiBKdShyLGUsdCl7ZS5lbmRpbmc9ITAsdnQocixlKSx0JiYoZS5maW5pc2hlZD9wcm9jZXNzLm5leHRUaWNrKHQpOnIub25jZShcImZpbmlzaFwiLHQpKSxlLmVuZGVkPSEwLHIud3JpdGFibGU9ITF9ZnVuY3Rpb24gUXUocixlLHQpe3ZhciBuPXIuZW50cnk7Zm9yKHIuZW50cnk9bnVsbDtuOyl7dmFyIGk9bi5jYWxsYmFjaztlLnBlbmRpbmdjYi0tLGkodCksbj1uLm5leHR9ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dD1yfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShGLnByb3RvdHlwZSxcImRlc3Ryb3llZFwiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlPT09dm9pZCAwPyExOnRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkfSxzZXQ6ZnVuY3Rpb24oZSl7IXRoaXMuX3dyaXRhYmxlU3RhdGV8fCh0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD1lKX19KTtGLnByb3RvdHlwZS5kZXN0cm95PXluLmRlc3Ryb3k7Ri5wcm90b3R5cGUuX3VuZGVzdHJveT15bi51bmRlc3Ryb3k7Ri5wcm90b3R5cGUuX2Rlc3Ryb3k9ZnVuY3Rpb24ocixlKXtlKHIpfX0pO3ZhciBEZT1TKChFbCx4byk9PntcInVzZSBzdHJpY3RcIjtjKCk7dmFyIFp1PU9iamVjdC5rZXlzfHxmdW5jdGlvbihyKXt2YXIgZT1bXTtmb3IodmFyIHQgaW4gcillLnB1c2godCk7cmV0dXJuIGV9O3hvLmV4cG9ydHM9YWU7dmFyIGJvPXduKCksX249Ym4oKTtPZSgpKGFlLGJvKTtmb3IoeG49WnUoX24ucHJvdG90eXBlKSx6dD0wO3p0PHhuLmxlbmd0aDt6dCsrKVl0PXhuW3p0XSxhZS5wcm90b3R5cGVbWXRdfHwoYWUucHJvdG90eXBlW1l0XT1fbi5wcm90b3R5cGVbWXRdKTt2YXIgeG4sWXQsenQ7ZnVuY3Rpb24gYWUocil7aWYoISh0aGlzIGluc3RhbmNlb2YgYWUpKXJldHVybiBuZXcgYWUocik7Ym8uY2FsbCh0aGlzLHIpLF9uLmNhbGwodGhpcyxyKSx0aGlzLmFsbG93SGFsZk9wZW49ITAsciYmKHIucmVhZGFibGU9PT0hMSYmKHRoaXMucmVhZGFibGU9ITEpLHIud3JpdGFibGU9PT0hMSYmKHRoaXMud3JpdGFibGU9ITEpLHIuYWxsb3dIYWxmT3Blbj09PSExJiYodGhpcy5hbGxvd0hhbGZPcGVuPSExLHRoaXMub25jZShcImVuZFwiLGVmKSkpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShhZS5wcm90b3R5cGUsXCJ3cml0YWJsZUhpZ2hXYXRlck1hcmtcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhZS5wcm90b3R5cGUsXCJ3cml0YWJsZUJ1ZmZlclwiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlJiZ0aGlzLl93cml0YWJsZVN0YXRlLmdldEJ1ZmZlcigpfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhZS5wcm90b3R5cGUsXCJ3cml0YWJsZUxlbmd0aFwiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmxlbmd0aH19KTtmdW5jdGlvbiBlZigpe3RoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWR8fHByb2Nlc3MubmV4dFRpY2sodGYsdGhpcyl9ZnVuY3Rpb24gdGYocil7ci5lbmQoKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoYWUucHJvdG90eXBlLFwiZGVzdHJveWVkXCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGU9PT12b2lkIDB8fHRoaXMuX3dyaXRhYmxlU3RhdGU9PT12b2lkIDA/ITE6dGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQmJnRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkfSxzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5fcmVhZGFibGVTdGF0ZT09PXZvaWQgMHx8dGhpcy5fd3JpdGFibGVTdGF0ZT09PXZvaWQgMHx8KHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkPWUsdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ9ZSl9fSl9KTt2YXIgdm89Uygodm4sd28pPT57YygpO3ZhciBLdD1YZSgpLHVlPUt0LkJ1ZmZlcjtmdW5jdGlvbiBfbyhyLGUpe2Zvcih2YXIgdCBpbiByKWVbdF09clt0XX11ZS5mcm9tJiZ1ZS5hbGxvYyYmdWUuYWxsb2NVbnNhZmUmJnVlLmFsbG9jVW5zYWZlU2xvdz93by5leHBvcnRzPUt0OihfbyhLdCx2biksdm4uQnVmZmVyPU5lKTtmdW5jdGlvbiBOZShyLGUsdCl7cmV0dXJuIHVlKHIsZSx0KX1OZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh1ZS5wcm90b3R5cGUpO19vKHVlLE5lKTtOZS5mcm9tPWZ1bmN0aW9uKHIsZSx0KXtpZih0eXBlb2Ygcj09XCJudW1iZXJcIil0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXJcIik7cmV0dXJuIHVlKHIsZSx0KX07TmUuYWxsb2M9ZnVuY3Rpb24ocixlLHQpe2lmKHR5cGVvZiByIT1cIm51bWJlclwiKXRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyXCIpO3ZhciBuPXVlKHIpO3JldHVybiBlIT09dm9pZCAwP3R5cGVvZiB0PT1cInN0cmluZ1wiP24uZmlsbChlLHQpOm4uZmlsbChlKTpuLmZpbGwoMCksbn07TmUuYWxsb2NVbnNhZmU9ZnVuY3Rpb24ocil7aWYodHlwZW9mIHIhPVwibnVtYmVyXCIpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXJcIik7cmV0dXJuIHVlKHIpfTtOZS5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24ocil7aWYodHlwZW9mIHIhPVwibnVtYmVyXCIpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXJcIik7cmV0dXJuIEt0LlNsb3dCdWZmZXIocil9fSk7dmFyIFJuPVMoU289PntcInVzZSBzdHJpY3RcIjtjKCk7dmFyIFNuPXZvKCkuQnVmZmVyLEVvPVNuLmlzRW5jb2Rpbmd8fGZ1bmN0aW9uKHIpe3N3aXRjaChyPVwiXCIrcixyJiZyLnRvTG93ZXJDYXNlKCkpe2Nhc2VcImhleFwiOmNhc2VcInV0ZjhcIjpjYXNlXCJ1dGYtOFwiOmNhc2VcImFzY2lpXCI6Y2FzZVwiYmluYXJ5XCI6Y2FzZVwiYmFzZTY0XCI6Y2FzZVwidWNzMlwiOmNhc2VcInVjcy0yXCI6Y2FzZVwidXRmMTZsZVwiOmNhc2VcInV0Zi0xNmxlXCI6Y2FzZVwicmF3XCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19O2Z1bmN0aW9uIHJmKHIpe2lmKCFyKXJldHVyblwidXRmOFwiO2Zvcih2YXIgZTs7KXN3aXRjaChyKXtjYXNlXCJ1dGY4XCI6Y2FzZVwidXRmLThcIjpyZXR1cm5cInV0ZjhcIjtjYXNlXCJ1Y3MyXCI6Y2FzZVwidWNzLTJcIjpjYXNlXCJ1dGYxNmxlXCI6Y2FzZVwidXRmLTE2bGVcIjpyZXR1cm5cInV0ZjE2bGVcIjtjYXNlXCJsYXRpbjFcIjpjYXNlXCJiaW5hcnlcIjpyZXR1cm5cImxhdGluMVwiO2Nhc2VcImJhc2U2NFwiOmNhc2VcImFzY2lpXCI6Y2FzZVwiaGV4XCI6cmV0dXJuIHI7ZGVmYXVsdDppZihlKXJldHVybjtyPShcIlwiK3IpLnRvTG93ZXJDYXNlKCksZT0hMH19ZnVuY3Rpb24gbmYocil7dmFyIGU9cmYocik7aWYodHlwZW9mIGUhPVwic3RyaW5nXCImJihTbi5pc0VuY29kaW5nPT09RW98fCFFbyhyKSkpdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBlbmNvZGluZzogXCIrcik7cmV0dXJuIGV8fHJ9U28uU3RyaW5nRGVjb2Rlcj1TdDtmdW5jdGlvbiBTdChyKXt0aGlzLmVuY29kaW5nPW5mKHIpO3ZhciBlO3N3aXRjaCh0aGlzLmVuY29kaW5nKXtjYXNlXCJ1dGYxNmxlXCI6dGhpcy50ZXh0PWNmLHRoaXMuZW5kPWxmLGU9NDticmVhaztjYXNlXCJ1dGY4XCI6dGhpcy5maWxsTGFzdD1hZixlPTQ7YnJlYWs7Y2FzZVwiYmFzZTY0XCI6dGhpcy50ZXh0PWRmLHRoaXMuZW5kPXBmLGU9MzticmVhaztkZWZhdWx0OnRoaXMud3JpdGU9aGYsdGhpcy5lbmQ9bWY7cmV0dXJufXRoaXMubGFzdE5lZWQ9MCx0aGlzLmxhc3RUb3RhbD0wLHRoaXMubGFzdENoYXI9U24uYWxsb2NVbnNhZmUoZSl9U3QucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHIpe2lmKHIubGVuZ3RoPT09MClyZXR1cm5cIlwiO3ZhciBlLHQ7aWYodGhpcy5sYXN0TmVlZCl7aWYoZT10aGlzLmZpbGxMYXN0KHIpLGU9PT12b2lkIDApcmV0dXJuXCJcIjt0PXRoaXMubGFzdE5lZWQsdGhpcy5sYXN0TmVlZD0wfWVsc2UgdD0wO3JldHVybiB0PHIubGVuZ3RoP2U/ZSt0aGlzLnRleHQocix0KTp0aGlzLnRleHQocix0KTplfHxcIlwifTtTdC5wcm90b3R5cGUuZW5kPWZmO1N0LnByb3RvdHlwZS50ZXh0PXVmO1N0LnByb3RvdHlwZS5maWxsTGFzdD1mdW5jdGlvbihyKXtpZih0aGlzLmxhc3ROZWVkPD1yLmxlbmd0aClyZXR1cm4gci5jb3B5KHRoaXMubGFzdENoYXIsdGhpcy5sYXN0VG90YWwtdGhpcy5sYXN0TmVlZCwwLHRoaXMubGFzdE5lZWQpLHRoaXMubGFzdENoYXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywwLHRoaXMubGFzdFRvdGFsKTtyLmNvcHkodGhpcy5sYXN0Q2hhcix0aGlzLmxhc3RUb3RhbC10aGlzLmxhc3ROZWVkLDAsci5sZW5ndGgpLHRoaXMubGFzdE5lZWQtPXIubGVuZ3RofTtmdW5jdGlvbiBFbihyKXtyZXR1cm4gcjw9MTI3PzA6cj4+NT09PTY/MjpyPj40PT09MTQ/MzpyPj4zPT09MzA/NDpyPj42PT09Mj8tMTotMn1mdW5jdGlvbiBvZihyLGUsdCl7dmFyIG49ZS5sZW5ndGgtMTtpZihuPHQpcmV0dXJuIDA7dmFyIGk9RW4oZVtuXSk7cmV0dXJuIGk+PTA/KGk+MCYmKHIubGFzdE5lZWQ9aS0xKSxpKTotLW48dHx8aT09PS0yPzA6KGk9RW4oZVtuXSksaT49MD8oaT4wJiYoci5sYXN0TmVlZD1pLTIpLGkpOi0tbjx0fHxpPT09LTI/MDooaT1FbihlW25dKSxpPj0wPyhpPjAmJihpPT09Mj9pPTA6ci5sYXN0TmVlZD1pLTMpLGkpOjApKX1mdW5jdGlvbiBzZihyLGUsdCl7aWYoKGVbMF0mMTkyKSE9PTEyOClyZXR1cm4gci5sYXN0TmVlZD0wLFwiXFx1RkZGRFwiO2lmKHIubGFzdE5lZWQ+MSYmZS5sZW5ndGg+MSl7aWYoKGVbMV0mMTkyKSE9PTEyOClyZXR1cm4gci5sYXN0TmVlZD0xLFwiXFx1RkZGRFwiO2lmKHIubGFzdE5lZWQ+MiYmZS5sZW5ndGg+MiYmKGVbMl0mMTkyKSE9PTEyOClyZXR1cm4gci5sYXN0TmVlZD0yLFwiXFx1RkZGRFwifX1mdW5jdGlvbiBhZihyKXt2YXIgZT10aGlzLmxhc3RUb3RhbC10aGlzLmxhc3ROZWVkLHQ9c2YodGhpcyxyLGUpO2lmKHQhPT12b2lkIDApcmV0dXJuIHQ7aWYodGhpcy5sYXN0TmVlZDw9ci5sZW5ndGgpcmV0dXJuIHIuY29weSh0aGlzLmxhc3RDaGFyLGUsMCx0aGlzLmxhc3ROZWVkKSx0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsMCx0aGlzLmxhc3RUb3RhbCk7ci5jb3B5KHRoaXMubGFzdENoYXIsZSwwLHIubGVuZ3RoKSx0aGlzLmxhc3ROZWVkLT1yLmxlbmd0aH1mdW5jdGlvbiB1ZihyLGUpe3ZhciB0PW9mKHRoaXMscixlKTtpZighdGhpcy5sYXN0TmVlZClyZXR1cm4gci50b1N0cmluZyhcInV0ZjhcIixlKTt0aGlzLmxhc3RUb3RhbD10O3ZhciBuPXIubGVuZ3RoLSh0LXRoaXMubGFzdE5lZWQpO3JldHVybiByLmNvcHkodGhpcy5sYXN0Q2hhciwwLG4pLHIudG9TdHJpbmcoXCJ1dGY4XCIsZSxuKX1mdW5jdGlvbiBmZihyKXt2YXIgZT1yJiZyLmxlbmd0aD90aGlzLndyaXRlKHIpOlwiXCI7cmV0dXJuIHRoaXMubGFzdE5lZWQ/ZStcIlxcdUZGRkRcIjplfWZ1bmN0aW9uIGNmKHIsZSl7aWYoKHIubGVuZ3RoLWUpJTI9PT0wKXt2YXIgdD1yLnRvU3RyaW5nKFwidXRmMTZsZVwiLGUpO2lmKHQpe3ZhciBuPXQuY2hhckNvZGVBdCh0Lmxlbmd0aC0xKTtpZihuPj01NTI5NiYmbjw9NTYzMTkpcmV0dXJuIHRoaXMubGFzdE5lZWQ9Mix0aGlzLmxhc3RUb3RhbD00LHRoaXMubGFzdENoYXJbMF09cltyLmxlbmd0aC0yXSx0aGlzLmxhc3RDaGFyWzFdPXJbci5sZW5ndGgtMV0sdC5zbGljZSgwLC0xKX1yZXR1cm4gdH1yZXR1cm4gdGhpcy5sYXN0TmVlZD0xLHRoaXMubGFzdFRvdGFsPTIsdGhpcy5sYXN0Q2hhclswXT1yW3IubGVuZ3RoLTFdLHIudG9TdHJpbmcoXCJ1dGYxNmxlXCIsZSxyLmxlbmd0aC0xKX1mdW5jdGlvbiBsZihyKXt2YXIgZT1yJiZyLmxlbmd0aD90aGlzLndyaXRlKHIpOlwiXCI7aWYodGhpcy5sYXN0TmVlZCl7dmFyIHQ9dGhpcy5sYXN0VG90YWwtdGhpcy5sYXN0TmVlZDtyZXR1cm4gZSt0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKFwidXRmMTZsZVwiLDAsdCl9cmV0dXJuIGV9ZnVuY3Rpb24gZGYocixlKXt2YXIgdD0oci5sZW5ndGgtZSklMztyZXR1cm4gdD09PTA/ci50b1N0cmluZyhcImJhc2U2NFwiLGUpOih0aGlzLmxhc3ROZWVkPTMtdCx0aGlzLmxhc3RUb3RhbD0zLHQ9PT0xP3RoaXMubGFzdENoYXJbMF09cltyLmxlbmd0aC0xXToodGhpcy5sYXN0Q2hhclswXT1yW3IubGVuZ3RoLTJdLHRoaXMubGFzdENoYXJbMV09cltyLmxlbmd0aC0xXSksci50b1N0cmluZyhcImJhc2U2NFwiLGUsci5sZW5ndGgtdCkpfWZ1bmN0aW9uIHBmKHIpe3ZhciBlPXImJnIubGVuZ3RoP3RoaXMud3JpdGUocik6XCJcIjtyZXR1cm4gdGhpcy5sYXN0TmVlZD9lK3RoaXMubGFzdENoYXIudG9TdHJpbmcoXCJiYXNlNjRcIiwwLDMtdGhpcy5sYXN0TmVlZCk6ZX1mdW5jdGlvbiBoZihyKXtyZXR1cm4gci50b1N0cmluZyh0aGlzLmVuY29kaW5nKX1mdW5jdGlvbiBtZihyKXtyZXR1cm4gciYmci5sZW5ndGg/dGhpcy53cml0ZShyKTpcIlwifX0pO3ZhciBYdD1TKChSbCxDbyk9PntcInVzZSBzdHJpY3RcIjtjKCk7dmFyIFJvPVVlKCkuY29kZXMuRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0U7ZnVuY3Rpb24gZ2Yocil7dmFyIGU9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoIWUpe2U9ITA7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkodCksaT0wO2k8dDtpKyspbltpXT1hcmd1bWVudHNbaV07ci5hcHBseSh0aGlzLG4pfX19ZnVuY3Rpb24geWYoKXt9ZnVuY3Rpb24gYmYocil7cmV0dXJuIHIuc2V0SGVhZGVyJiZ0eXBlb2Ygci5hYm9ydD09XCJmdW5jdGlvblwifWZ1bmN0aW9uIFRvKHIsZSx0KXtpZih0eXBlb2YgZT09XCJmdW5jdGlvblwiKXJldHVybiBUbyhyLG51bGwsZSk7ZXx8KGU9e30pLHQ9Z2YodHx8eWYpO3ZhciBuPWUucmVhZGFibGV8fGUucmVhZGFibGUhPT0hMSYmci5yZWFkYWJsZSxpPWUud3JpdGFibGV8fGUud3JpdGFibGUhPT0hMSYmci53cml0YWJsZSxvPWZ1bmN0aW9uKCl7ci53cml0YWJsZXx8YSgpfSxzPXIuX3dyaXRhYmxlU3RhdGUmJnIuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQsYT1mdW5jdGlvbigpe2k9ITEscz0hMCxufHx0LmNhbGwocil9LHU9ci5fcmVhZGFibGVTdGF0ZSYmci5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkLGY9ZnVuY3Rpb24oKXtuPSExLHU9ITAsaXx8dC5jYWxsKHIpfSxsPWZ1bmN0aW9uKGIpe3QuY2FsbChyLGIpfSxkPWZ1bmN0aW9uKCl7dmFyIGI7aWYobiYmIXUpcmV0dXJuKCFyLl9yZWFkYWJsZVN0YXRlfHwhci5fcmVhZGFibGVTdGF0ZS5lbmRlZCkmJihiPW5ldyBSbyksdC5jYWxsKHIsYik7aWYoaSYmIXMpcmV0dXJuKCFyLl93cml0YWJsZVN0YXRlfHwhci5fd3JpdGFibGVTdGF0ZS5lbmRlZCkmJihiPW5ldyBSbyksdC5jYWxsKHIsYil9LGg9ZnVuY3Rpb24oKXtyLnJlcS5vbihcImZpbmlzaFwiLGEpfTtyZXR1cm4gYmYocik/KHIub24oXCJjb21wbGV0ZVwiLGEpLHIub24oXCJhYm9ydFwiLGQpLHIucmVxP2goKTpyLm9uKFwicmVxdWVzdFwiLGgpKTppJiYhci5fd3JpdGFibGVTdGF0ZSYmKHIub24oXCJlbmRcIixvKSxyLm9uKFwiY2xvc2VcIixvKSksci5vbihcImVuZFwiLGYpLHIub24oXCJmaW5pc2hcIixhKSxlLmVycm9yIT09ITEmJnIub24oXCJlcnJvclwiLGwpLHIub24oXCJjbG9zZVwiLGQpLGZ1bmN0aW9uKCl7ci5yZW1vdmVMaXN0ZW5lcihcImNvbXBsZXRlXCIsYSksci5yZW1vdmVMaXN0ZW5lcihcImFib3J0XCIsZCksci5yZW1vdmVMaXN0ZW5lcihcInJlcXVlc3RcIixoKSxyLnJlcSYmci5yZXEucmVtb3ZlTGlzdGVuZXIoXCJmaW5pc2hcIixhKSxyLnJlbW92ZUxpc3RlbmVyKFwiZW5kXCIsbyksci5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsbyksci5yZW1vdmVMaXN0ZW5lcihcImZpbmlzaFwiLGEpLHIucmVtb3ZlTGlzdGVuZXIoXCJlbmRcIixmKSxyLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIixsKSxyLnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIixkKX19Q28uZXhwb3J0cz1Ub30pO3ZhciBNbz1TKChUbCxCbyk9PntcInVzZSBzdHJpY3RcIjtjKCk7dmFyIEp0O2Z1bmN0aW9uIF9lKHIsZSx0KXtyZXR1cm4gZSBpbiByP09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLGUse3ZhbHVlOnQsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTpyW2VdPXQscn12YXIgeGY9WHQoKSx3ZT1TeW1ib2woXCJsYXN0UmVzb2x2ZVwiKSxIZT1TeW1ib2woXCJsYXN0UmVqZWN0XCIpLFJ0PVN5bWJvbChcImVycm9yXCIpLFF0PVN5bWJvbChcImVuZGVkXCIpLHFlPVN5bWJvbChcImxhc3RQcm9taXNlXCIpLFRuPVN5bWJvbChcImhhbmRsZVByb21pc2VcIiksamU9U3ltYm9sKFwic3RyZWFtXCIpO2Z1bmN0aW9uIHZlKHIsZSl7cmV0dXJue3ZhbHVlOnIsZG9uZTplfX1mdW5jdGlvbiBfZihyKXt2YXIgZT1yW3dlXTtpZihlIT09bnVsbCl7dmFyIHQ9cltqZV0ucmVhZCgpO3QhPT1udWxsJiYocltxZV09bnVsbCxyW3dlXT1udWxsLHJbSGVdPW51bGwsZSh2ZSh0LCExKSkpfX1mdW5jdGlvbiB3ZihyKXtwcm9jZXNzLm5leHRUaWNrKF9mLHIpfWZ1bmN0aW9uIHZmKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7ci50aGVuKGZ1bmN0aW9uKCl7aWYoZVtRdF0pe3QodmUodm9pZCAwLCEwKSk7cmV0dXJufWVbVG5dKHQsbil9LG4pfX12YXIgRWY9T2JqZWN0LmdldFByb3RvdHlwZU9mKGZ1bmN0aW9uKCl7fSksU2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mKChKdD17Z2V0IHN0cmVhbSgpe3JldHVybiB0aGlzW2plXX0sbmV4dDpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzW1J0XTtpZih0IT09bnVsbClyZXR1cm4gUHJvbWlzZS5yZWplY3QodCk7aWYodGhpc1tRdF0pcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2ZSh2b2lkIDAsITApKTtpZih0aGlzW2plXS5kZXN0cm95ZWQpcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHMsYSl7cHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpe2VbUnRdP2EoZVtSdF0pOnModmUodm9pZCAwLCEwKSl9KX0pO3ZhciBuPXRoaXNbcWVdLGk7aWYobilpPW5ldyBQcm9taXNlKHZmKG4sdGhpcykpO2Vsc2V7dmFyIG89dGhpc1tqZV0ucmVhZCgpO2lmKG8hPT1udWxsKXJldHVybiBQcm9taXNlLnJlc29sdmUodmUobywhMSkpO2k9bmV3IFByb21pc2UodGhpc1tUbl0pfXJldHVybiB0aGlzW3FlXT1pLGl9fSxfZShKdCxTeW1ib2wuYXN5bmNJdGVyYXRvcixmdW5jdGlvbigpe3JldHVybiB0aGlzfSksX2UoSnQsXCJyZXR1cm5cIixmdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQsbil7ZVtqZV0uZGVzdHJveShudWxsLGZ1bmN0aW9uKGkpe2lmKGkpe24oaSk7cmV0dXJufXQodmUodm9pZCAwLCEwKSl9KX0pfSksSnQpLEVmKSxSZj1mdW5jdGlvbihlKXt2YXIgdCxuPU9iamVjdC5jcmVhdGUoU2YsKHQ9e30sX2UodCxqZSx7dmFsdWU6ZSx3cml0YWJsZTohMH0pLF9lKHQsd2Use3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KSxfZSh0LEhlLHt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSksX2UodCxSdCx7dmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLF9lKHQsUXQse3ZhbHVlOmUuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCx3cml0YWJsZTohMH0pLF9lKHQsVG4se3ZhbHVlOmZ1bmN0aW9uKG8scyl7dmFyIGE9bltqZV0ucmVhZCgpO2E/KG5bcWVdPW51bGwsblt3ZV09bnVsbCxuW0hlXT1udWxsLG8odmUoYSwhMSkpKTooblt3ZV09byxuW0hlXT1zKX0sd3JpdGFibGU6ITB9KSx0KSk7cmV0dXJuIG5bcWVdPW51bGwseGYoZSxmdW5jdGlvbihpKXtpZihpJiZpLmNvZGUhPT1cIkVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFXCIpe3ZhciBvPW5bSGVdO28hPT1udWxsJiYobltxZV09bnVsbCxuW3dlXT1udWxsLG5bSGVdPW51bGwsbyhpKSksbltSdF09aTtyZXR1cm59dmFyIHM9blt3ZV07cyE9PW51bGwmJihuW3FlXT1udWxsLG5bd2VdPW51bGwsbltIZV09bnVsbCxzKHZlKHZvaWQgMCwhMCkpKSxuW1F0XT0hMH0pLGUub24oXCJyZWFkYWJsZVwiLHdmLmJpbmQobnVsbCxuKSksbn07Qm8uZXhwb3J0cz1SZn0pO3ZhciBJbz1TKChDbCxMbyk9PntjKCk7TG8uZXhwb3J0cz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcIlJlYWRhYmxlLmZyb20gaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgYnJvd3NlclwiKX19KTt2YXIgd249UygoTWwscW8pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO3FvLmV4cG9ydHM9RTt2YXIgcnQ7RS5SZWFkYWJsZVN0YXRlPWtvO3ZhciBCbD11bigpLkV2ZW50RW1pdHRlcixQbz1mdW5jdGlvbihlLHQpe3JldHVybiBlLmxpc3RlbmVycyh0KS5sZW5ndGh9LEN0PWZuKCksWnQ9WGUoKS5CdWZmZXIsVGY9Z2xvYmFsLlVpbnQ4QXJyYXl8fGZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBDZihyKXtyZXR1cm4gWnQuZnJvbShyKX1mdW5jdGlvbiBCZihyKXtyZXR1cm4gWnQuaXNCdWZmZXIocil8fHIgaW5zdGFuY2VvZiBUZn12YXIgQ249Y24oKSx4O0NuJiZDbi5kZWJ1Z2xvZz94PUNuLmRlYnVnbG9nKFwic3RyZWFtXCIpOng9ZnVuY3Rpb24oKXt9O3ZhciBNZj1ybygpLFBuPXBuKCksTGY9aG4oKSxJZj1MZi5nZXRIaWdoV2F0ZXJNYXJrLGVyPVVlKCkuY29kZXMsQWY9ZXIuRVJSX0lOVkFMSURfQVJHX1RZUEUsRmY9ZXIuRVJSX1NUUkVBTV9QVVNIX0FGVEVSX0VPRixQZj1lci5FUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCxrZj1lci5FUlJfU1RSRUFNX1VOU0hJRlRfQUZURVJfRU5EX0VWRU5ULG50LEJuLE1uO09lKCkoRSxDdCk7dmFyIFR0PVBuLmVycm9yT3JEZXN0cm95LExuPVtcImVycm9yXCIsXCJjbG9zZVwiLFwiZGVzdHJveVwiLFwicGF1c2VcIixcInJlc3VtZVwiXTtmdW5jdGlvbiBPZihyLGUsdCl7aWYodHlwZW9mIHIucHJlcGVuZExpc3RlbmVyPT1cImZ1bmN0aW9uXCIpcmV0dXJuIHIucHJlcGVuZExpc3RlbmVyKGUsdCk7IXIuX2V2ZW50c3x8IXIuX2V2ZW50c1tlXT9yLm9uKGUsdCk6QXJyYXkuaXNBcnJheShyLl9ldmVudHNbZV0pP3IuX2V2ZW50c1tlXS51bnNoaWZ0KHQpOnIuX2V2ZW50c1tlXT1bdCxyLl9ldmVudHNbZV1dfWZ1bmN0aW9uIGtvKHIsZSx0KXtydD1ydHx8RGUoKSxyPXJ8fHt9LHR5cGVvZiB0IT1cImJvb2xlYW5cIiYmKHQ9ZSBpbnN0YW5jZW9mIHJ0KSx0aGlzLm9iamVjdE1vZGU9ISFyLm9iamVjdE1vZGUsdCYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhci5yZWFkYWJsZU9iamVjdE1vZGUpLHRoaXMuaGlnaFdhdGVyTWFyaz1JZih0aGlzLHIsXCJyZWFkYWJsZUhpZ2hXYXRlck1hcmtcIix0KSx0aGlzLmJ1ZmZlcj1uZXcgTWYsdGhpcy5sZW5ndGg9MCx0aGlzLnBpcGVzPW51bGwsdGhpcy5waXBlc0NvdW50PTAsdGhpcy5mbG93aW5nPW51bGwsdGhpcy5lbmRlZD0hMSx0aGlzLmVuZEVtaXR0ZWQ9ITEsdGhpcy5yZWFkaW5nPSExLHRoaXMuc3luYz0hMCx0aGlzLm5lZWRSZWFkYWJsZT0hMSx0aGlzLmVtaXR0ZWRSZWFkYWJsZT0hMSx0aGlzLnJlYWRhYmxlTGlzdGVuaW5nPSExLHRoaXMucmVzdW1lU2NoZWR1bGVkPSExLHRoaXMucGF1c2VkPSEwLHRoaXMuZW1pdENsb3NlPXIuZW1pdENsb3NlIT09ITEsdGhpcy5hdXRvRGVzdHJveT0hIXIuYXV0b0Rlc3Ryb3ksdGhpcy5kZXN0cm95ZWQ9ITEsdGhpcy5kZWZhdWx0RW5jb2Rpbmc9ci5kZWZhdWx0RW5jb2Rpbmd8fFwidXRmOFwiLHRoaXMuYXdhaXREcmFpbj0wLHRoaXMucmVhZGluZ01vcmU9ITEsdGhpcy5kZWNvZGVyPW51bGwsdGhpcy5lbmNvZGluZz1udWxsLHIuZW5jb2RpbmcmJihudHx8KG50PVJuKCkuU3RyaW5nRGVjb2RlciksdGhpcy5kZWNvZGVyPW5ldyBudChyLmVuY29kaW5nKSx0aGlzLmVuY29kaW5nPXIuZW5jb2RpbmcpfWZ1bmN0aW9uIEUocil7aWYocnQ9cnR8fERlKCksISh0aGlzIGluc3RhbmNlb2YgRSkpcmV0dXJuIG5ldyBFKHIpO3ZhciBlPXRoaXMgaW5zdGFuY2VvZiBydDt0aGlzLl9yZWFkYWJsZVN0YXRlPW5ldyBrbyhyLHRoaXMsZSksdGhpcy5yZWFkYWJsZT0hMCxyJiYodHlwZW9mIHIucmVhZD09XCJmdW5jdGlvblwiJiYodGhpcy5fcmVhZD1yLnJlYWQpLHR5cGVvZiByLmRlc3Ryb3k9PVwiZnVuY3Rpb25cIiYmKHRoaXMuX2Rlc3Ryb3k9ci5kZXN0cm95KSksQ3QuY2FsbCh0aGlzKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoRS5wcm90b3R5cGUsXCJkZXN0cm95ZWRcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZT09PXZvaWQgMD8hMTp0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZH0sc2V0OmZ1bmN0aW9uKGUpeyF0aGlzLl9yZWFkYWJsZVN0YXRlfHwodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9ZSl9fSk7RS5wcm90b3R5cGUuZGVzdHJveT1Qbi5kZXN0cm95O0UucHJvdG90eXBlLl91bmRlc3Ryb3k9UG4udW5kZXN0cm95O0UucHJvdG90eXBlLl9kZXN0cm95PWZ1bmN0aW9uKHIsZSl7ZShyKX07RS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihyLGUpe3ZhciB0PXRoaXMuX3JlYWRhYmxlU3RhdGUsbjtyZXR1cm4gdC5vYmplY3RNb2RlP249ITA6dHlwZW9mIHI9PVwic3RyaW5nXCImJihlPWV8fHQuZGVmYXVsdEVuY29kaW5nLGUhPT10LmVuY29kaW5nJiYocj1adC5mcm9tKHIsZSksZT1cIlwiKSxuPSEwKSxPbyh0aGlzLHIsZSwhMSxuKX07RS5wcm90b3R5cGUudW5zaGlmdD1mdW5jdGlvbihyKXtyZXR1cm4gT28odGhpcyxyLG51bGwsITAsITEpfTtmdW5jdGlvbiBPbyhyLGUsdCxuLGkpe3goXCJyZWFkYWJsZUFkZENodW5rXCIsZSk7dmFyIG89ci5fcmVhZGFibGVTdGF0ZTtpZihlPT09bnVsbClvLnJlYWRpbmc9ITEsTmYocixvKTtlbHNle3ZhciBzO2lmKGl8fChzPVVmKG8sZSkpLHMpVHQocixzKTtlbHNlIGlmKG8ub2JqZWN0TW9kZXx8ZSYmZS5sZW5ndGg+MClpZih0eXBlb2YgZSE9XCJzdHJpbmdcIiYmIW8ub2JqZWN0TW9kZSYmT2JqZWN0LmdldFByb3RvdHlwZU9mKGUpIT09WnQucHJvdG90eXBlJiYoZT1DZihlKSksbilvLmVuZEVtaXR0ZWQ/VHQocixuZXcga2YpOkluKHIsbyxlLCEwKTtlbHNlIGlmKG8uZW5kZWQpVHQocixuZXcgRmYpO2Vsc2V7aWYoby5kZXN0cm95ZWQpcmV0dXJuITE7by5yZWFkaW5nPSExLG8uZGVjb2RlciYmIXQ/KGU9by5kZWNvZGVyLndyaXRlKGUpLG8ub2JqZWN0TW9kZXx8ZS5sZW5ndGghPT0wP0luKHIsbyxlLCExKTpGbihyLG8pKTpJbihyLG8sZSwhMSl9ZWxzZSBufHwoby5yZWFkaW5nPSExLEZuKHIsbykpfXJldHVybiFvLmVuZGVkJiYoby5sZW5ndGg8by5oaWdoV2F0ZXJNYXJrfHxvLmxlbmd0aD09PTApfWZ1bmN0aW9uIEluKHIsZSx0LG4pe2UuZmxvd2luZyYmZS5sZW5ndGg9PT0wJiYhZS5zeW5jPyhlLmF3YWl0RHJhaW49MCxyLmVtaXQoXCJkYXRhXCIsdCkpOihlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6dC5sZW5ndGgsbj9lLmJ1ZmZlci51bnNoaWZ0KHQpOmUuYnVmZmVyLnB1c2godCksZS5uZWVkUmVhZGFibGUmJnRyKHIpKSxGbihyLGUpfWZ1bmN0aW9uIFVmKHIsZSl7dmFyIHQ7cmV0dXJuIUJmKGUpJiZ0eXBlb2YgZSE9XCJzdHJpbmdcIiYmZSE9PXZvaWQgMCYmIXIub2JqZWN0TW9kZSYmKHQ9bmV3IEFmKFwiY2h1bmtcIixbXCJzdHJpbmdcIixcIkJ1ZmZlclwiLFwiVWludDhBcnJheVwiXSxlKSksdH1FLnByb3RvdHlwZS5pc1BhdXNlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmc9PT0hMX07RS5wcm90b3R5cGUuc2V0RW5jb2Rpbmc9ZnVuY3Rpb24ocil7bnR8fChudD1SbigpLlN0cmluZ0RlY29kZXIpO3ZhciBlPW5ldyBudChyKTt0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXI9ZSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nPXRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2Rlci5lbmNvZGluZztmb3IodmFyIHQ9dGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIuaGVhZCxuPVwiXCI7dCE9PW51bGw7KW4rPWUud3JpdGUodC5kYXRhKSx0PXQubmV4dDtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIuY2xlYXIoKSxuIT09XCJcIiYmdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIucHVzaChuKSx0aGlzLl9yZWFkYWJsZVN0YXRlLmxlbmd0aD1uLmxlbmd0aCx0aGlzfTt2YXIgQW89MTA3Mzc0MTgyNDtmdW5jdGlvbiBEZihyKXtyZXR1cm4gcj49QW8/cj1Bbzooci0tLHJ8PXI+Pj4xLHJ8PXI+Pj4yLHJ8PXI+Pj40LHJ8PXI+Pj44LHJ8PXI+Pj4xNixyKyspLHJ9ZnVuY3Rpb24gRm8ocixlKXtyZXR1cm4gcjw9MHx8ZS5sZW5ndGg9PT0wJiZlLmVuZGVkPzA6ZS5vYmplY3RNb2RlPzE6ciE9PXI/ZS5mbG93aW5nJiZlLmxlbmd0aD9lLmJ1ZmZlci5oZWFkLmRhdGEubGVuZ3RoOmUubGVuZ3RoOihyPmUuaGlnaFdhdGVyTWFyayYmKGUuaGlnaFdhdGVyTWFyaz1EZihyKSkscjw9ZS5sZW5ndGg/cjplLmVuZGVkP2UubGVuZ3RoOihlLm5lZWRSZWFkYWJsZT0hMCwwKSl9RS5wcm90b3R5cGUucmVhZD1mdW5jdGlvbihyKXt4KFwicmVhZFwiLHIpLHI9cGFyc2VJbnQociwxMCk7dmFyIGU9dGhpcy5fcmVhZGFibGVTdGF0ZSx0PXI7aWYociE9PTAmJihlLmVtaXR0ZWRSZWFkYWJsZT0hMSkscj09PTAmJmUubmVlZFJlYWRhYmxlJiYoKGUuaGlnaFdhdGVyTWFyayE9PTA/ZS5sZW5ndGg+PWUuaGlnaFdhdGVyTWFyazplLmxlbmd0aD4wKXx8ZS5lbmRlZCkpcmV0dXJuIHgoXCJyZWFkOiBlbWl0UmVhZGFibGVcIixlLmxlbmd0aCxlLmVuZGVkKSxlLmxlbmd0aD09PTAmJmUuZW5kZWQ/QW4odGhpcyk6dHIodGhpcyksbnVsbDtpZihyPUZvKHIsZSkscj09PTAmJmUuZW5kZWQpcmV0dXJuIGUubGVuZ3RoPT09MCYmQW4odGhpcyksbnVsbDt2YXIgbj1lLm5lZWRSZWFkYWJsZTt4KFwibmVlZCByZWFkYWJsZVwiLG4pLChlLmxlbmd0aD09PTB8fGUubGVuZ3RoLXI8ZS5oaWdoV2F0ZXJNYXJrKSYmKG49ITAseChcImxlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrXCIsbikpLGUuZW5kZWR8fGUucmVhZGluZz8obj0hMSx4KFwicmVhZGluZyBvciBlbmRlZFwiLG4pKTpuJiYoeChcImRvIHJlYWRcIiksZS5yZWFkaW5nPSEwLGUuc3luYz0hMCxlLmxlbmd0aD09PTAmJihlLm5lZWRSZWFkYWJsZT0hMCksdGhpcy5fcmVhZChlLmhpZ2hXYXRlck1hcmspLGUuc3luYz0hMSxlLnJlYWRpbmd8fChyPUZvKHQsZSkpKTt2YXIgaTtyZXR1cm4gcj4wP2k9Tm8ocixlKTppPW51bGwsaT09PW51bGw/KGUubmVlZFJlYWRhYmxlPWUubGVuZ3RoPD1lLmhpZ2hXYXRlck1hcmsscj0wKTooZS5sZW5ndGgtPXIsZS5hd2FpdERyYWluPTApLGUubGVuZ3RoPT09MCYmKGUuZW5kZWR8fChlLm5lZWRSZWFkYWJsZT0hMCksdCE9PXImJmUuZW5kZWQmJkFuKHRoaXMpKSxpIT09bnVsbCYmdGhpcy5lbWl0KFwiZGF0YVwiLGkpLGl9O2Z1bmN0aW9uIE5mKHIsZSl7aWYoeChcIm9uRW9mQ2h1bmtcIiksIWUuZW5kZWQpe2lmKGUuZGVjb2Rlcil7dmFyIHQ9ZS5kZWNvZGVyLmVuZCgpO3QmJnQubGVuZ3RoJiYoZS5idWZmZXIucHVzaCh0KSxlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6dC5sZW5ndGgpfWUuZW5kZWQ9ITAsZS5zeW5jP3RyKHIpOihlLm5lZWRSZWFkYWJsZT0hMSxlLmVtaXR0ZWRSZWFkYWJsZXx8KGUuZW1pdHRlZFJlYWRhYmxlPSEwLFVvKHIpKSl9fWZ1bmN0aW9uIHRyKHIpe3ZhciBlPXIuX3JlYWRhYmxlU3RhdGU7eChcImVtaXRSZWFkYWJsZVwiLGUubmVlZFJlYWRhYmxlLGUuZW1pdHRlZFJlYWRhYmxlKSxlLm5lZWRSZWFkYWJsZT0hMSxlLmVtaXR0ZWRSZWFkYWJsZXx8KHgoXCJlbWl0UmVhZGFibGVcIixlLmZsb3dpbmcpLGUuZW1pdHRlZFJlYWRhYmxlPSEwLHByb2Nlc3MubmV4dFRpY2soVW8scikpfWZ1bmN0aW9uIFVvKHIpe3ZhciBlPXIuX3JlYWRhYmxlU3RhdGU7eChcImVtaXRSZWFkYWJsZV9cIixlLmRlc3Ryb3llZCxlLmxlbmd0aCxlLmVuZGVkKSwhZS5kZXN0cm95ZWQmJihlLmxlbmd0aHx8ZS5lbmRlZCkmJihyLmVtaXQoXCJyZWFkYWJsZVwiKSxlLmVtaXR0ZWRSZWFkYWJsZT0hMSksZS5uZWVkUmVhZGFibGU9IWUuZmxvd2luZyYmIWUuZW5kZWQmJmUubGVuZ3RoPD1lLmhpZ2hXYXRlck1hcmssa24ocil9ZnVuY3Rpb24gRm4ocixlKXtlLnJlYWRpbmdNb3JlfHwoZS5yZWFkaW5nTW9yZT0hMCxwcm9jZXNzLm5leHRUaWNrKEhmLHIsZSkpfWZ1bmN0aW9uIEhmKHIsZSl7Zm9yKDshZS5yZWFkaW5nJiYhZS5lbmRlZCYmKGUubGVuZ3RoPGUuaGlnaFdhdGVyTWFya3x8ZS5mbG93aW5nJiZlLmxlbmd0aD09PTApOyl7dmFyIHQ9ZS5sZW5ndGg7aWYoeChcIm1heWJlUmVhZE1vcmUgcmVhZCAwXCIpLHIucmVhZCgwKSx0PT09ZS5sZW5ndGgpYnJlYWt9ZS5yZWFkaW5nTW9yZT0hMX1FLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbihyKXtUdCh0aGlzLG5ldyBQZihcIl9yZWFkKClcIikpfTtFLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKHIsZSl7dmFyIHQ9dGhpcyxuPXRoaXMuX3JlYWRhYmxlU3RhdGU7c3dpdGNoKG4ucGlwZXNDb3VudCl7Y2FzZSAwOm4ucGlwZXM9cjticmVhaztjYXNlIDE6bi5waXBlcz1bbi5waXBlcyxyXTticmVhaztkZWZhdWx0Om4ucGlwZXMucHVzaChyKTticmVha31uLnBpcGVzQ291bnQrPTEseChcInBpcGUgY291bnQ9JWQgb3B0cz0lalwiLG4ucGlwZXNDb3VudCxlKTt2YXIgaT0oIWV8fGUuZW5kIT09ITEpJiZyIT09cHJvY2Vzcy5zdGRvdXQmJnIhPT1wcm9jZXNzLnN0ZGVycixvPWk/YTp5O24uZW5kRW1pdHRlZD9wcm9jZXNzLm5leHRUaWNrKG8pOnQub25jZShcImVuZFwiLG8pLHIub24oXCJ1bnBpcGVcIixzKTtmdW5jdGlvbiBzKHcsXyl7eChcIm9udW5waXBlXCIpLHc9PT10JiZfJiZfLmhhc1VucGlwZWQ9PT0hMSYmKF8uaGFzVW5waXBlZD0hMCxsKCkpfWZ1bmN0aW9uIGEoKXt4KFwib25lbmRcIiksci5lbmQoKX12YXIgdT1xZih0KTtyLm9uKFwiZHJhaW5cIix1KTt2YXIgZj0hMTtmdW5jdGlvbiBsKCl7eChcImNsZWFudXBcIiksci5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsbSksci5yZW1vdmVMaXN0ZW5lcihcImZpbmlzaFwiLGIpLHIucmVtb3ZlTGlzdGVuZXIoXCJkcmFpblwiLHUpLHIucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLGgpLHIucmVtb3ZlTGlzdGVuZXIoXCJ1bnBpcGVcIixzKSx0LnJlbW92ZUxpc3RlbmVyKFwiZW5kXCIsYSksdC5yZW1vdmVMaXN0ZW5lcihcImVuZFwiLHkpLHQucmVtb3ZlTGlzdGVuZXIoXCJkYXRhXCIsZCksZj0hMCxuLmF3YWl0RHJhaW4mJighci5fd3JpdGFibGVTdGF0ZXx8ci5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pJiZ1KCl9dC5vbihcImRhdGFcIixkKTtmdW5jdGlvbiBkKHcpe3goXCJvbmRhdGFcIik7dmFyIF89ci53cml0ZSh3KTt4KFwiZGVzdC53cml0ZVwiLF8pLF89PT0hMSYmKChuLnBpcGVzQ291bnQ9PT0xJiZuLnBpcGVzPT09cnx8bi5waXBlc0NvdW50PjEmJkhvKG4ucGlwZXMscikhPT0tMSkmJiFmJiYoeChcImZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZVwiLG4uYXdhaXREcmFpbiksbi5hd2FpdERyYWluKyspLHQucGF1c2UoKSl9ZnVuY3Rpb24gaCh3KXt4KFwib25lcnJvclwiLHcpLHkoKSxyLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIixoKSxQbyhyLFwiZXJyb3JcIik9PT0wJiZUdChyLHcpfU9mKHIsXCJlcnJvclwiLGgpO2Z1bmN0aW9uIG0oKXtyLnJlbW92ZUxpc3RlbmVyKFwiZmluaXNoXCIsYikseSgpfXIub25jZShcImNsb3NlXCIsbSk7ZnVuY3Rpb24gYigpe3goXCJvbmZpbmlzaFwiKSxyLnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIixtKSx5KCl9ci5vbmNlKFwiZmluaXNoXCIsYik7ZnVuY3Rpb24geSgpe3goXCJ1bnBpcGVcIiksdC51bnBpcGUocil9cmV0dXJuIHIuZW1pdChcInBpcGVcIix0KSxuLmZsb3dpbmd8fCh4KFwicGlwZSByZXN1bWVcIiksdC5yZXN1bWUoKSkscn07ZnVuY3Rpb24gcWYocil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9ci5fcmVhZGFibGVTdGF0ZTt4KFwicGlwZU9uRHJhaW5cIix0LmF3YWl0RHJhaW4pLHQuYXdhaXREcmFpbiYmdC5hd2FpdERyYWluLS0sdC5hd2FpdERyYWluPT09MCYmUG8ocixcImRhdGFcIikmJih0LmZsb3dpbmc9ITAsa24ocikpfX1FLnByb3RvdHlwZS51bnBpcGU9ZnVuY3Rpb24ocil7dmFyIGU9dGhpcy5fcmVhZGFibGVTdGF0ZSx0PXtoYXNVbnBpcGVkOiExfTtpZihlLnBpcGVzQ291bnQ9PT0wKXJldHVybiB0aGlzO2lmKGUucGlwZXNDb3VudD09PTEpcmV0dXJuIHImJnIhPT1lLnBpcGVzP3RoaXM6KHJ8fChyPWUucGlwZXMpLGUucGlwZXM9bnVsbCxlLnBpcGVzQ291bnQ9MCxlLmZsb3dpbmc9ITEsciYmci5lbWl0KFwidW5waXBlXCIsdGhpcyx0KSx0aGlzKTtpZighcil7dmFyIG49ZS5waXBlcyxpPWUucGlwZXNDb3VudDtlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExO2Zvcih2YXIgbz0wO288aTtvKyspbltvXS5lbWl0KFwidW5waXBlXCIsdGhpcyx7aGFzVW5waXBlZDohMX0pO3JldHVybiB0aGlzfXZhciBzPUhvKGUucGlwZXMscik7cmV0dXJuIHM9PT0tMT90aGlzOihlLnBpcGVzLnNwbGljZShzLDEpLGUucGlwZXNDb3VudC09MSxlLnBpcGVzQ291bnQ9PT0xJiYoZS5waXBlcz1lLnBpcGVzWzBdKSxyLmVtaXQoXCJ1bnBpcGVcIix0aGlzLHQpLHRoaXMpfTtFLnByb3RvdHlwZS5vbj1mdW5jdGlvbihyLGUpe3ZhciB0PUN0LnByb3RvdHlwZS5vbi5jYWxsKHRoaXMscixlKSxuPXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuIHI9PT1cImRhdGFcIj8obi5yZWFkYWJsZUxpc3RlbmluZz10aGlzLmxpc3RlbmVyQ291bnQoXCJyZWFkYWJsZVwiKT4wLG4uZmxvd2luZyE9PSExJiZ0aGlzLnJlc3VtZSgpKTpyPT09XCJyZWFkYWJsZVwiJiYhbi5lbmRFbWl0dGVkJiYhbi5yZWFkYWJsZUxpc3RlbmluZyYmKG4ucmVhZGFibGVMaXN0ZW5pbmc9bi5uZWVkUmVhZGFibGU9ITAsbi5mbG93aW5nPSExLG4uZW1pdHRlZFJlYWRhYmxlPSExLHgoXCJvbiByZWFkYWJsZVwiLG4ubGVuZ3RoLG4ucmVhZGluZyksbi5sZW5ndGg/dHIodGhpcyk6bi5yZWFkaW5nfHxwcm9jZXNzLm5leHRUaWNrKGpmLHRoaXMpKSx0fTtFLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1FLnByb3RvdHlwZS5vbjtFLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbihyLGUpe3ZhciB0PUN0LnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lci5jYWxsKHRoaXMscixlKTtyZXR1cm4gcj09PVwicmVhZGFibGVcIiYmcHJvY2Vzcy5uZXh0VGljayhEbyx0aGlzKSx0fTtFLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24ocil7dmFyIGU9Q3QucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuKHI9PT1cInJlYWRhYmxlXCJ8fHI9PT12b2lkIDApJiZwcm9jZXNzLm5leHRUaWNrKERvLHRoaXMpLGV9O2Z1bmN0aW9uIERvKHIpe3ZhciBlPXIuX3JlYWRhYmxlU3RhdGU7ZS5yZWFkYWJsZUxpc3RlbmluZz1yLmxpc3RlbmVyQ291bnQoXCJyZWFkYWJsZVwiKT4wLGUucmVzdW1lU2NoZWR1bGVkJiYhZS5wYXVzZWQ/ZS5mbG93aW5nPSEwOnIubGlzdGVuZXJDb3VudChcImRhdGFcIik+MCYmci5yZXN1bWUoKX1mdW5jdGlvbiBqZihyKXt4KFwicmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwXCIpLHIucmVhZCgwKX1FLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXt2YXIgcj10aGlzLl9yZWFkYWJsZVN0YXRlO3JldHVybiByLmZsb3dpbmd8fCh4KFwicmVzdW1lXCIpLHIuZmxvd2luZz0hci5yZWFkYWJsZUxpc3RlbmluZyxXZih0aGlzLHIpKSxyLnBhdXNlZD0hMSx0aGlzfTtmdW5jdGlvbiBXZihyLGUpe2UucmVzdW1lU2NoZWR1bGVkfHwoZS5yZXN1bWVTY2hlZHVsZWQ9ITAscHJvY2Vzcy5uZXh0VGljaygkZixyLGUpKX1mdW5jdGlvbiAkZihyLGUpe3goXCJyZXN1bWVcIixlLnJlYWRpbmcpLGUucmVhZGluZ3x8ci5yZWFkKDApLGUucmVzdW1lU2NoZWR1bGVkPSExLHIuZW1pdChcInJlc3VtZVwiKSxrbihyKSxlLmZsb3dpbmcmJiFlLnJlYWRpbmcmJnIucmVhZCgwKX1FLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3JldHVybiB4KFwiY2FsbCBwYXVzZSBmbG93aW5nPSVqXCIsdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSx0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmchPT0hMSYmKHgoXCJwYXVzZVwiKSx0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmc9ITEsdGhpcy5lbWl0KFwicGF1c2VcIikpLHRoaXMuX3JlYWRhYmxlU3RhdGUucGF1c2VkPSEwLHRoaXN9O2Z1bmN0aW9uIGtuKHIpe3ZhciBlPXIuX3JlYWRhYmxlU3RhdGU7Zm9yKHgoXCJmbG93XCIsZS5mbG93aW5nKTtlLmZsb3dpbmcmJnIucmVhZCgpIT09bnVsbDspO31FLnByb3RvdHlwZS53cmFwPWZ1bmN0aW9uKHIpe3ZhciBlPXRoaXMsdD10aGlzLl9yZWFkYWJsZVN0YXRlLG49ITE7ci5vbihcImVuZFwiLGZ1bmN0aW9uKCl7aWYoeChcIndyYXBwZWQgZW5kXCIpLHQuZGVjb2RlciYmIXQuZW5kZWQpe3ZhciBzPXQuZGVjb2Rlci5lbmQoKTtzJiZzLmxlbmd0aCYmZS5wdXNoKHMpfWUucHVzaChudWxsKX0pLHIub24oXCJkYXRhXCIsZnVuY3Rpb24ocyl7aWYoeChcIndyYXBwZWQgZGF0YVwiKSx0LmRlY29kZXImJihzPXQuZGVjb2Rlci53cml0ZShzKSksISh0Lm9iamVjdE1vZGUmJnM9PW51bGwpJiYhKCF0Lm9iamVjdE1vZGUmJighc3x8IXMubGVuZ3RoKSkpe3ZhciBhPWUucHVzaChzKTthfHwobj0hMCxyLnBhdXNlKCkpfX0pO2Zvcih2YXIgaSBpbiByKXRoaXNbaV09PT12b2lkIDAmJnR5cGVvZiByW2ldPT1cImZ1bmN0aW9uXCImJih0aGlzW2ldPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiByW2FdLmFwcGx5KHIsYXJndW1lbnRzKX19KGkpKTtmb3IodmFyIG89MDtvPExuLmxlbmd0aDtvKyspci5vbihMbltvXSx0aGlzLmVtaXQuYmluZCh0aGlzLExuW29dKSk7cmV0dXJuIHRoaXMuX3JlYWQ9ZnVuY3Rpb24ocyl7eChcIndyYXBwZWQgX3JlYWRcIixzKSxuJiYobj0hMSxyLnJlc3VtZSgpKX0sdGhpc307dHlwZW9mIFN5bWJvbD09XCJmdW5jdGlvblwiJiYoRS5wcm90b3R5cGVbU3ltYm9sLmFzeW5jSXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIEJuPT09dm9pZCAwJiYoQm49TW8oKSksQm4odGhpcyl9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoRS5wcm90b3R5cGUsXCJyZWFkYWJsZUhpZ2hXYXRlck1hcmtcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShFLnByb3RvdHlwZSxcInJlYWRhYmxlQnVmZmVyXCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUmJnRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShFLnByb3RvdHlwZSxcInJlYWRhYmxlRmxvd2luZ1wiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmd9LHNldDpmdW5jdGlvbihlKXt0aGlzLl9yZWFkYWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nPWUpfX0pO0UuX2Zyb21MaXN0PU5vO09iamVjdC5kZWZpbmVQcm9wZXJ0eShFLnByb3RvdHlwZSxcInJlYWRhYmxlTGVuZ3RoXCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUubGVuZ3RofX0pO2Z1bmN0aW9uIE5vKHIsZSl7aWYoZS5sZW5ndGg9PT0wKXJldHVybiBudWxsO3ZhciB0O3JldHVybiBlLm9iamVjdE1vZGU/dD1lLmJ1ZmZlci5zaGlmdCgpOiFyfHxyPj1lLmxlbmd0aD8oZS5kZWNvZGVyP3Q9ZS5idWZmZXIuam9pbihcIlwiKTplLmJ1ZmZlci5sZW5ndGg9PT0xP3Q9ZS5idWZmZXIuZmlyc3QoKTp0PWUuYnVmZmVyLmNvbmNhdChlLmxlbmd0aCksZS5idWZmZXIuY2xlYXIoKSk6dD1lLmJ1ZmZlci5jb25zdW1lKHIsZS5kZWNvZGVyKSx0fWZ1bmN0aW9uIEFuKHIpe3ZhciBlPXIuX3JlYWRhYmxlU3RhdGU7eChcImVuZFJlYWRhYmxlXCIsZS5lbmRFbWl0dGVkKSxlLmVuZEVtaXR0ZWR8fChlLmVuZGVkPSEwLHByb2Nlc3MubmV4dFRpY2soR2YsZSxyKSl9ZnVuY3Rpb24gR2YocixlKXtpZih4KFwiZW5kUmVhZGFibGVOVFwiLHIuZW5kRW1pdHRlZCxyLmxlbmd0aCksIXIuZW5kRW1pdHRlZCYmci5sZW5ndGg9PT0wJiYoci5lbmRFbWl0dGVkPSEwLGUucmVhZGFibGU9ITEsZS5lbWl0KFwiZW5kXCIpLHIuYXV0b0Rlc3Ryb3kpKXt2YXIgdD1lLl93cml0YWJsZVN0YXRlOyghdHx8dC5hdXRvRGVzdHJveSYmdC5maW5pc2hlZCkmJmUuZGVzdHJveSgpfX10eXBlb2YgU3ltYm9sPT1cImZ1bmN0aW9uXCImJihFLmZyb209ZnVuY3Rpb24ocixlKXtyZXR1cm4gTW49PT12b2lkIDAmJihNbj1JbygpKSxNbihFLHIsZSl9KTtmdW5jdGlvbiBIbyhyLGUpe2Zvcih2YXIgdD0wLG49ci5sZW5ndGg7dDxuO3QrKylpZihyW3RdPT09ZSlyZXR1cm4gdDtyZXR1cm4tMX19KTt2YXIgT249UygoTGwsV28pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO1dvLmV4cG9ydHM9bWU7dmFyIHJyPVVlKCkuY29kZXMsVmY9cnIuRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsemY9cnIuRVJSX01VTFRJUExFX0NBTExCQUNLLFlmPXJyLkVSUl9UUkFOU0ZPUk1fQUxSRUFEWV9UUkFOU0ZPUk1JTkcsS2Y9cnIuRVJSX1RSQU5TRk9STV9XSVRIX0xFTkdUSF8wLG5yPURlKCk7T2UoKShtZSxucik7ZnVuY3Rpb24gWGYocixlKXt2YXIgdD10aGlzLl90cmFuc2Zvcm1TdGF0ZTt0LnRyYW5zZm9ybWluZz0hMTt2YXIgbj10LndyaXRlY2I7aWYobj09PW51bGwpcmV0dXJuIHRoaXMuZW1pdChcImVycm9yXCIsbmV3IHpmKTt0LndyaXRlY2h1bms9bnVsbCx0LndyaXRlY2I9bnVsbCxlIT1udWxsJiZ0aGlzLnB1c2goZSksbihyKTt2YXIgaT10aGlzLl9yZWFkYWJsZVN0YXRlO2kucmVhZGluZz0hMSwoaS5uZWVkUmVhZGFibGV8fGkubGVuZ3RoPGkuaGlnaFdhdGVyTWFyaykmJnRoaXMuX3JlYWQoaS5oaWdoV2F0ZXJNYXJrKX1mdW5jdGlvbiBtZShyKXtpZighKHRoaXMgaW5zdGFuY2VvZiBtZSkpcmV0dXJuIG5ldyBtZShyKTtuci5jYWxsKHRoaXMsciksdGhpcy5fdHJhbnNmb3JtU3RhdGU9e2FmdGVyVHJhbnNmb3JtOlhmLmJpbmQodGhpcyksbmVlZFRyYW5zZm9ybTohMSx0cmFuc2Zvcm1pbmc6ITEsd3JpdGVjYjpudWxsLHdyaXRlY2h1bms6bnVsbCx3cml0ZWVuY29kaW5nOm51bGx9LHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlPSEwLHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYz0hMSxyJiYodHlwZW9mIHIudHJhbnNmb3JtPT1cImZ1bmN0aW9uXCImJih0aGlzLl90cmFuc2Zvcm09ci50cmFuc2Zvcm0pLHR5cGVvZiByLmZsdXNoPT1cImZ1bmN0aW9uXCImJih0aGlzLl9mbHVzaD1yLmZsdXNoKSksdGhpcy5vbihcInByZWZpbmlzaFwiLEpmKX1mdW5jdGlvbiBKZigpe3ZhciByPXRoaXM7dHlwZW9mIHRoaXMuX2ZsdXNoPT1cImZ1bmN0aW9uXCImJiF0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD90aGlzLl9mbHVzaChmdW5jdGlvbihlLHQpe2pvKHIsZSx0KX0pOmpvKHRoaXMsbnVsbCxudWxsKX1tZS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihyLGUpe3JldHVybiB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtPSExLG5yLnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcyxyLGUpfTttZS5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbihyLGUsdCl7dChuZXcgVmYoXCJfdHJhbnNmb3JtKClcIikpfTttZS5wcm90b3R5cGUuX3dyaXRlPWZ1bmN0aW9uKHIsZSx0KXt2YXIgbj10aGlzLl90cmFuc2Zvcm1TdGF0ZTtpZihuLndyaXRlY2I9dCxuLndyaXRlY2h1bms9cixuLndyaXRlZW5jb2Rpbmc9ZSwhbi50cmFuc2Zvcm1pbmcpe3ZhciBpPXRoaXMuX3JlYWRhYmxlU3RhdGU7KG4ubmVlZFRyYW5zZm9ybXx8aS5uZWVkUmVhZGFibGV8fGkubGVuZ3RoPGkuaGlnaFdhdGVyTWFyaykmJnRoaXMuX3JlYWQoaS5oaWdoV2F0ZXJNYXJrKX19O21lLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbihyKXt2YXIgZT10aGlzLl90cmFuc2Zvcm1TdGF0ZTtlLndyaXRlY2h1bmshPT1udWxsJiYhZS50cmFuc2Zvcm1pbmc/KGUudHJhbnNmb3JtaW5nPSEwLHRoaXMuX3RyYW5zZm9ybShlLndyaXRlY2h1bmssZS53cml0ZWVuY29kaW5nLGUuYWZ0ZXJUcmFuc2Zvcm0pKTplLm5lZWRUcmFuc2Zvcm09ITB9O21lLnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbihyLGUpe25yLnByb3RvdHlwZS5fZGVzdHJveS5jYWxsKHRoaXMscixmdW5jdGlvbih0KXtlKHQpfSl9O2Z1bmN0aW9uIGpvKHIsZSx0KXtpZihlKXJldHVybiByLmVtaXQoXCJlcnJvclwiLGUpO2lmKHQhPW51bGwmJnIucHVzaCh0KSxyLl93cml0YWJsZVN0YXRlLmxlbmd0aCl0aHJvdyBuZXcgS2Y7aWYoci5fdHJhbnNmb3JtU3RhdGUudHJhbnNmb3JtaW5nKXRocm93IG5ldyBZZjtyZXR1cm4gci5wdXNoKG51bGwpfX0pO3ZhciBWbz1TKChJbCxHbyk9PntcInVzZSBzdHJpY3RcIjtjKCk7R28uZXhwb3J0cz1CdDt2YXIgJG89T24oKTtPZSgpKEJ0LCRvKTtmdW5jdGlvbiBCdChyKXtpZighKHRoaXMgaW5zdGFuY2VvZiBCdCkpcmV0dXJuIG5ldyBCdChyKTskby5jYWxsKHRoaXMscil9QnQucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24ocixlLHQpe3QobnVsbCxyKX19KTt2YXIgSm89UygoQWwsWG8pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO3ZhciBVbjtmdW5jdGlvbiBRZihyKXt2YXIgZT0hMTtyZXR1cm4gZnVuY3Rpb24oKXtlfHwoZT0hMCxyLmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpKX19dmFyIEtvPVVlKCkuY29kZXMsWmY9S28uRVJSX01JU1NJTkdfQVJHUyxlYz1Lby5FUlJfU1RSRUFNX0RFU1RST1lFRDtmdW5jdGlvbiB6byhyKXtpZihyKXRocm93IHJ9ZnVuY3Rpb24gdGMocil7cmV0dXJuIHIuc2V0SGVhZGVyJiZ0eXBlb2Ygci5hYm9ydD09XCJmdW5jdGlvblwifWZ1bmN0aW9uIHJjKHIsZSx0LG4pe249UWYobik7dmFyIGk9ITE7ci5vbihcImNsb3NlXCIsZnVuY3Rpb24oKXtpPSEwfSksVW49PT12b2lkIDAmJihVbj1YdCgpKSxVbihyLHtyZWFkYWJsZTplLHdyaXRhYmxlOnR9LGZ1bmN0aW9uKHMpe2lmKHMpcmV0dXJuIG4ocyk7aT0hMCxuKCl9KTt2YXIgbz0hMTtyZXR1cm4gZnVuY3Rpb24ocyl7aWYoIWkmJiFvKXtpZihvPSEwLHRjKHIpKXJldHVybiByLmFib3J0KCk7aWYodHlwZW9mIHIuZGVzdHJveT09XCJmdW5jdGlvblwiKXJldHVybiByLmRlc3Ryb3koKTtuKHN8fG5ldyBlYyhcInBpcGVcIikpfX19ZnVuY3Rpb24gWW8ocil7cigpfWZ1bmN0aW9uIG5jKHIsZSl7cmV0dXJuIHIucGlwZShlKX1mdW5jdGlvbiBpYyhyKXtyZXR1cm4hci5sZW5ndGh8fHR5cGVvZiByW3IubGVuZ3RoLTFdIT1cImZ1bmN0aW9uXCI/em86ci5wb3AoKX1mdW5jdGlvbiBvYygpe2Zvcih2YXIgcj1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHIpLHQ9MDt0PHI7dCsrKWVbdF09YXJndW1lbnRzW3RdO3ZhciBuPWljKGUpO2lmKEFycmF5LmlzQXJyYXkoZVswXSkmJihlPWVbMF0pLGUubGVuZ3RoPDIpdGhyb3cgbmV3IFpmKFwic3RyZWFtc1wiKTt2YXIgaSxvPWUubWFwKGZ1bmN0aW9uKHMsYSl7dmFyIHU9YTxlLmxlbmd0aC0xLGY9YT4wO3JldHVybiByYyhzLHUsZixmdW5jdGlvbihsKXtpfHwoaT1sKSxsJiZvLmZvckVhY2goWW8pLCF1JiYoby5mb3JFYWNoKFlvKSxuKGkpKX0pfSk7cmV0dXJuIGUucmVkdWNlKG5jKX1Yby5leHBvcnRzPW9jfSk7dmFyIE49UygoRmwsUW8pPT57YygpO1FvLmV4cG9ydHM9Sjt2YXIgRG49amkoKS5FdmVudEVtaXR0ZXIsc2M9T2UoKTtzYyhKLERuKTtKLlJlYWRhYmxlPXduKCk7Si5Xcml0YWJsZT1ibigpO0ouRHVwbGV4PURlKCk7Si5UcmFuc2Zvcm09T24oKTtKLlBhc3NUaHJvdWdoPVZvKCk7Si5maW5pc2hlZD1YdCgpO0oucGlwZWxpbmU9Sm8oKTtKLlN0cmVhbT1KO2Z1bmN0aW9uIEooKXtEbi5jYWxsKHRoaXMpfUoucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24ocixlKXt2YXIgdD10aGlzO2Z1bmN0aW9uIG4obCl7ci53cml0YWJsZSYmci53cml0ZShsKT09PSExJiZ0LnBhdXNlJiZ0LnBhdXNlKCl9dC5vbihcImRhdGFcIixuKTtmdW5jdGlvbiBpKCl7dC5yZWFkYWJsZSYmdC5yZXN1bWUmJnQucmVzdW1lKCl9ci5vbihcImRyYWluXCIsaSksIXIuX2lzU3RkaW8mJighZXx8ZS5lbmQhPT0hMSkmJih0Lm9uKFwiZW5kXCIscyksdC5vbihcImNsb3NlXCIsYSkpO3ZhciBvPSExO2Z1bmN0aW9uIHMoKXtvfHwobz0hMCxyLmVuZCgpKX1mdW5jdGlvbiBhKCl7b3x8KG89ITAsdHlwZW9mIHIuZGVzdHJveT09XCJmdW5jdGlvblwiJiZyLmRlc3Ryb3koKSl9ZnVuY3Rpb24gdShsKXtpZihmKCksRG4ubGlzdGVuZXJDb3VudCh0aGlzLFwiZXJyb3JcIik9PT0wKXRocm93IGx9dC5vbihcImVycm9yXCIsdSksci5vbihcImVycm9yXCIsdSk7ZnVuY3Rpb24gZigpe3QucmVtb3ZlTGlzdGVuZXIoXCJkYXRhXCIsbiksci5yZW1vdmVMaXN0ZW5lcihcImRyYWluXCIsaSksdC5yZW1vdmVMaXN0ZW5lcihcImVuZFwiLHMpLHQucmVtb3ZlTGlzdGVuZXIoXCJjbG9zZVwiLGEpLHQucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLHUpLHIucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLHUpLHQucmVtb3ZlTGlzdGVuZXIoXCJlbmRcIixmKSx0LnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIixmKSxyLnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIixmKX1yZXR1cm4gdC5vbihcImVuZFwiLGYpLHQub24oXCJjbG9zZVwiLGYpLHIub24oXCJjbG9zZVwiLGYpLHIuZW1pdChcInBpcGVcIix0KSxyfX0pO3ZhciB1cz1TKCh5ZCxhcyk9PntjKCk7dmFyIGF0PTFlMyx1dD1hdCo2MCxmdD11dCo2MCwkZT1mdCoyNCxmYz0kZSo3LGNjPSRlKjM2NS4yNTthcy5leHBvcnRzPWZ1bmN0aW9uKHIsZSl7ZT1lfHx7fTt2YXIgdD10eXBlb2YgcjtpZih0PT09XCJzdHJpbmdcIiYmci5sZW5ndGg+MClyZXR1cm4gbGMocik7aWYodD09PVwibnVtYmVyXCImJmlzRmluaXRlKHIpKXJldHVybiBlLmxvbmc/cGMocik6ZGMocik7dGhyb3cgbmV3IEVycm9yKFwidmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD1cIitKU09OLnN0cmluZ2lmeShyKSl9O2Z1bmN0aW9uIGxjKHIpe2lmKHI9U3RyaW5nKHIpLCEoci5sZW5ndGg+MTAwKSl7dmFyIGU9L14oLT8oPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKHIpO2lmKCEhZSl7dmFyIHQ9cGFyc2VGbG9hdChlWzFdKSxuPShlWzJdfHxcIm1zXCIpLnRvTG93ZXJDYXNlKCk7c3dpdGNoKG4pe2Nhc2VcInllYXJzXCI6Y2FzZVwieWVhclwiOmNhc2VcInlyc1wiOmNhc2VcInlyXCI6Y2FzZVwieVwiOnJldHVybiB0KmNjO2Nhc2VcIndlZWtzXCI6Y2FzZVwid2Vla1wiOmNhc2VcIndcIjpyZXR1cm4gdCpmYztjYXNlXCJkYXlzXCI6Y2FzZVwiZGF5XCI6Y2FzZVwiZFwiOnJldHVybiB0KiRlO2Nhc2VcImhvdXJzXCI6Y2FzZVwiaG91clwiOmNhc2VcImhyc1wiOmNhc2VcImhyXCI6Y2FzZVwiaFwiOnJldHVybiB0KmZ0O2Nhc2VcIm1pbnV0ZXNcIjpjYXNlXCJtaW51dGVcIjpjYXNlXCJtaW5zXCI6Y2FzZVwibWluXCI6Y2FzZVwibVwiOnJldHVybiB0KnV0O2Nhc2VcInNlY29uZHNcIjpjYXNlXCJzZWNvbmRcIjpjYXNlXCJzZWNzXCI6Y2FzZVwic2VjXCI6Y2FzZVwic1wiOnJldHVybiB0KmF0O2Nhc2VcIm1pbGxpc2Vjb25kc1wiOmNhc2VcIm1pbGxpc2Vjb25kXCI6Y2FzZVwibXNlY3NcIjpjYXNlXCJtc2VjXCI6Y2FzZVwibXNcIjpyZXR1cm4gdDtkZWZhdWx0OnJldHVybn19fX1mdW5jdGlvbiBkYyhyKXt2YXIgZT1NYXRoLmFicyhyKTtyZXR1cm4gZT49JGU/TWF0aC5yb3VuZChyLyRlKStcImRcIjplPj1mdD9NYXRoLnJvdW5kKHIvZnQpK1wiaFwiOmU+PXV0P01hdGgucm91bmQoci91dCkrXCJtXCI6ZT49YXQ/TWF0aC5yb3VuZChyL2F0KStcInNcIjpyK1wibXNcIn1mdW5jdGlvbiBwYyhyKXt2YXIgZT1NYXRoLmFicyhyKTtyZXR1cm4gZT49JGU/ZnIocixlLCRlLFwiZGF5XCIpOmU+PWZ0P2ZyKHIsZSxmdCxcImhvdXJcIik6ZT49dXQ/ZnIocixlLHV0LFwibWludXRlXCIpOmU+PWF0P2ZyKHIsZSxhdCxcInNlY29uZFwiKTpyK1wiIG1zXCJ9ZnVuY3Rpb24gZnIocixlLHQsbil7dmFyIGk9ZT49dCoxLjU7cmV0dXJuIE1hdGgucm91bmQoci90KStcIiBcIituKyhpP1wic1wiOlwiXCIpfX0pO3ZhciBjcz1TKChiZCxmcyk9PntjKCk7ZnVuY3Rpb24gaGMocil7dC5kZWJ1Zz10LHQuZGVmYXVsdD10LHQuY29lcmNlPXUsdC5kaXNhYmxlPW8sdC5lbmFibGU9aSx0LmVuYWJsZWQ9cyx0Lmh1bWFuaXplPXVzKCksdC5kZXN0cm95PWYsT2JqZWN0LmtleXMocikuZm9yRWFjaChsPT57dFtsXT1yW2xdfSksdC5uYW1lcz1bXSx0LnNraXBzPVtdLHQuZm9ybWF0dGVycz17fTtmdW5jdGlvbiBlKGwpe2xldCBkPTA7Zm9yKGxldCBoPTA7aDxsLmxlbmd0aDtoKyspZD0oZDw8NSktZCtsLmNoYXJDb2RlQXQoaCksZHw9MDtyZXR1cm4gdC5jb2xvcnNbTWF0aC5hYnMoZCkldC5jb2xvcnMubGVuZ3RoXX10LnNlbGVjdENvbG9yPWU7ZnVuY3Rpb24gdChsKXtsZXQgZCxoPW51bGwsbSxiO2Z1bmN0aW9uIHkoLi4udyl7aWYoIXkuZW5hYmxlZClyZXR1cm47bGV0IF89eSx2PU51bWJlcihuZXcgRGF0ZSkscT12LShkfHx2KTtfLmRpZmY9cSxfLnByZXY9ZCxfLmN1cnI9dixkPXYsd1swXT10LmNvZXJjZSh3WzBdKSx0eXBlb2Ygd1swXSE9XCJzdHJpbmdcIiYmdy51bnNoaWZ0KFwiJU9cIik7bGV0IEE9MDt3WzBdPXdbMF0ucmVwbGFjZSgvJShbYS16QS1aJV0pL2csKFksR2UpPT57aWYoWT09PVwiJSVcIilyZXR1cm5cIiVcIjtBKys7bGV0IEllPXQuZm9ybWF0dGVyc1tHZV07aWYodHlwZW9mIEllPT1cImZ1bmN0aW9uXCIpe2xldCBBZT13W0FdO1k9SWUuY2FsbChfLEFlKSx3LnNwbGljZShBLDEpLEEtLX1yZXR1cm4gWX0pLHQuZm9ybWF0QXJncy5jYWxsKF8sdyksKF8ubG9nfHx0LmxvZykuYXBwbHkoXyx3KX1yZXR1cm4geS5uYW1lc3BhY2U9bCx5LnVzZUNvbG9ycz10LnVzZUNvbG9ycygpLHkuY29sb3I9dC5zZWxlY3RDb2xvcihsKSx5LmV4dGVuZD1uLHkuZGVzdHJveT10LmRlc3Ryb3ksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksXCJlbmFibGVkXCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiExLGdldDooKT0+aCE9PW51bGw/aDoobSE9PXQubmFtZXNwYWNlcyYmKG09dC5uYW1lc3BhY2VzLGI9dC5lbmFibGVkKGwpKSxiKSxzZXQ6dz0+e2g9d319KSx0eXBlb2YgdC5pbml0PT1cImZ1bmN0aW9uXCImJnQuaW5pdCh5KSx5fWZ1bmN0aW9uIG4obCxkKXtsZXQgaD10KHRoaXMubmFtZXNwYWNlKyh0eXBlb2YgZD5cInVcIj9cIjpcIjpkKStsKTtyZXR1cm4gaC5sb2c9dGhpcy5sb2csaH1mdW5jdGlvbiBpKGwpe3Quc2F2ZShsKSx0Lm5hbWVzcGFjZXM9bCx0Lm5hbWVzPVtdLHQuc2tpcHM9W107bGV0IGQsaD0odHlwZW9mIGw9PVwic3RyaW5nXCI/bDpcIlwiKS5zcGxpdCgvW1xccyxdKy8pLG09aC5sZW5ndGg7Zm9yKGQ9MDtkPG07ZCsrKSFoW2RdfHwobD1oW2RdLnJlcGxhY2UoL1xcKi9nLFwiLio/XCIpLGxbMF09PT1cIi1cIj90LnNraXBzLnB1c2gobmV3IFJlZ0V4cChcIl5cIitsLnNsaWNlKDEpK1wiJFwiKSk6dC5uYW1lcy5wdXNoKG5ldyBSZWdFeHAoXCJeXCIrbCtcIiRcIikpKX1mdW5jdGlvbiBvKCl7bGV0IGw9Wy4uLnQubmFtZXMubWFwKGEpLC4uLnQuc2tpcHMubWFwKGEpLm1hcChkPT5cIi1cIitkKV0uam9pbihcIixcIik7cmV0dXJuIHQuZW5hYmxlKFwiXCIpLGx9ZnVuY3Rpb24gcyhsKXtpZihsW2wubGVuZ3RoLTFdPT09XCIqXCIpcmV0dXJuITA7bGV0IGQsaDtmb3IoZD0wLGg9dC5za2lwcy5sZW5ndGg7ZDxoO2QrKylpZih0LnNraXBzW2RdLnRlc3QobCkpcmV0dXJuITE7Zm9yKGQ9MCxoPXQubmFtZXMubGVuZ3RoO2Q8aDtkKyspaWYodC5uYW1lc1tkXS50ZXN0KGwpKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGEobCl7cmV0dXJuIGwudG9TdHJpbmcoKS5zdWJzdHJpbmcoMixsLnRvU3RyaW5nKCkubGVuZ3RoLTIpLnJlcGxhY2UoL1xcLlxcKlxcPyQvLFwiKlwiKX1mdW5jdGlvbiB1KGwpe3JldHVybiBsIGluc3RhbmNlb2YgRXJyb3I/bC5zdGFja3x8bC5tZXNzYWdlOmx9ZnVuY3Rpb24gZigpe2NvbnNvbGUud2FybihcIkluc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC5cIil9cmV0dXJuIHQuZW5hYmxlKHQubG9hZCgpKSx0fWZzLmV4cG9ydHM9aGN9KTt2YXIgbGU9Uygoeixjcik9PntjKCk7ei5mb3JtYXRBcmdzPWdjO3ouc2F2ZT15Yzt6LmxvYWQ9YmM7ei51c2VDb2xvcnM9bWM7ei5zdG9yYWdlPXhjKCk7ei5kZXN0cm95PSgoKT0+e2xldCByPSExO3JldHVybigpPT57cnx8KHI9ITAsY29uc29sZS53YXJuKFwiSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLlwiKSl9fSkoKTt6LmNvbG9ycz1bXCIjMDAwMENDXCIsXCIjMDAwMEZGXCIsXCIjMDAzM0NDXCIsXCIjMDAzM0ZGXCIsXCIjMDA2NkNDXCIsXCIjMDA2NkZGXCIsXCIjMDA5OUNDXCIsXCIjMDA5OUZGXCIsXCIjMDBDQzAwXCIsXCIjMDBDQzMzXCIsXCIjMDBDQzY2XCIsXCIjMDBDQzk5XCIsXCIjMDBDQ0NDXCIsXCIjMDBDQ0ZGXCIsXCIjMzMwMENDXCIsXCIjMzMwMEZGXCIsXCIjMzMzM0NDXCIsXCIjMzMzM0ZGXCIsXCIjMzM2NkNDXCIsXCIjMzM2NkZGXCIsXCIjMzM5OUNDXCIsXCIjMzM5OUZGXCIsXCIjMzNDQzAwXCIsXCIjMzNDQzMzXCIsXCIjMzNDQzY2XCIsXCIjMzNDQzk5XCIsXCIjMzNDQ0NDXCIsXCIjMzNDQ0ZGXCIsXCIjNjYwMENDXCIsXCIjNjYwMEZGXCIsXCIjNjYzM0NDXCIsXCIjNjYzM0ZGXCIsXCIjNjZDQzAwXCIsXCIjNjZDQzMzXCIsXCIjOTkwMENDXCIsXCIjOTkwMEZGXCIsXCIjOTkzM0NDXCIsXCIjOTkzM0ZGXCIsXCIjOTlDQzAwXCIsXCIjOTlDQzMzXCIsXCIjQ0MwMDAwXCIsXCIjQ0MwMDMzXCIsXCIjQ0MwMDY2XCIsXCIjQ0MwMDk5XCIsXCIjQ0MwMENDXCIsXCIjQ0MwMEZGXCIsXCIjQ0MzMzAwXCIsXCIjQ0MzMzMzXCIsXCIjQ0MzMzY2XCIsXCIjQ0MzMzk5XCIsXCIjQ0MzM0NDXCIsXCIjQ0MzM0ZGXCIsXCIjQ0M2NjAwXCIsXCIjQ0M2NjMzXCIsXCIjQ0M5OTAwXCIsXCIjQ0M5OTMzXCIsXCIjQ0NDQzAwXCIsXCIjQ0NDQzMzXCIsXCIjRkYwMDAwXCIsXCIjRkYwMDMzXCIsXCIjRkYwMDY2XCIsXCIjRkYwMDk5XCIsXCIjRkYwMENDXCIsXCIjRkYwMEZGXCIsXCIjRkYzMzAwXCIsXCIjRkYzMzMzXCIsXCIjRkYzMzY2XCIsXCIjRkYzMzk5XCIsXCIjRkYzM0NDXCIsXCIjRkYzM0ZGXCIsXCIjRkY2NjAwXCIsXCIjRkY2NjMzXCIsXCIjRkY5OTAwXCIsXCIjRkY5OTMzXCIsXCIjRkZDQzAwXCIsXCIjRkZDQzMzXCJdO2Z1bmN0aW9uIG1jKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3c8XCJ1XCImJndpbmRvdy5wcm9jZXNzJiYod2luZG93LnByb2Nlc3MudHlwZT09PVwicmVuZGVyZXJcInx8d2luZG93LnByb2Nlc3MuX19ud2pzKT8hMDp0eXBlb2YgbmF2aWdhdG9yPFwidVwiJiZuYXZpZ2F0b3IudXNlckFnZW50JiZuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goLyhlZGdlfHRyaWRlbnQpXFwvKFxcZCspLyk/ITE6dHlwZW9mIGRvY3VtZW50PFwidVwiJiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQmJmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLldlYmtpdEFwcGVhcmFuY2V8fHR5cGVvZiB3aW5kb3c8XCJ1XCImJndpbmRvdy5jb25zb2xlJiYod2luZG93LmNvbnNvbGUuZmlyZWJ1Z3x8d2luZG93LmNvbnNvbGUuZXhjZXB0aW9uJiZ3aW5kb3cuY29uc29sZS50YWJsZSl8fHR5cGVvZiBuYXZpZ2F0b3I8XCJ1XCImJm5hdmlnYXRvci51c2VyQWdlbnQmJm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS8pJiZwYXJzZUludChSZWdFeHAuJDEsMTApPj0zMXx8dHlwZW9mIG5hdmlnYXRvcjxcInVcIiYmbmF2aWdhdG9yLnVzZXJBZ2VudCYmbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pfWZ1bmN0aW9uIGdjKHIpe2lmKHJbMF09KHRoaXMudXNlQ29sb3JzP1wiJWNcIjpcIlwiKSt0aGlzLm5hbWVzcGFjZSsodGhpcy51c2VDb2xvcnM/XCIgJWNcIjpcIiBcIikrclswXSsodGhpcy51c2VDb2xvcnM/XCIlYyBcIjpcIiBcIikrXCIrXCIrY3IuZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpLCF0aGlzLnVzZUNvbG9ycylyZXR1cm47bGV0IGU9XCJjb2xvcjogXCIrdGhpcy5jb2xvcjtyLnNwbGljZSgxLDAsZSxcImNvbG9yOiBpbmhlcml0XCIpO2xldCB0PTAsbj0wO3JbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLGk9PntpIT09XCIlJVwiJiYodCsrLGk9PT1cIiVjXCImJihuPXQpKX0pLHIuc3BsaWNlKG4sMCxlKX16LmxvZz1jb25zb2xlLmRlYnVnfHxjb25zb2xlLmxvZ3x8KCgpPT57fSk7ZnVuY3Rpb24geWMocil7dHJ5e3I/ei5zdG9yYWdlLnNldEl0ZW0oXCJkZWJ1Z1wiLHIpOnouc3RvcmFnZS5yZW1vdmVJdGVtKFwiZGVidWdcIil9Y2F0Y2h7fX1mdW5jdGlvbiBiYygpe2xldCByO3RyeXtyPXouc3RvcmFnZS5nZXRJdGVtKFwiZGVidWdcIil9Y2F0Y2h7fXJldHVybiFyJiZ0eXBlb2YgcHJvY2VzczxcInVcIiYmXCJlbnZcImluIHByb2Nlc3MmJihyPXByb2Nlc3MuZW52LkRFQlVHKSxyfWZ1bmN0aW9uIHhjKCl7dHJ5e3JldHVybiBsb2NhbFN0b3JhZ2V9Y2F0Y2h7fX1jci5leHBvcnRzPWNzKCkoeik7dmFye2Zvcm1hdHRlcnM6X2N9PWNyLmV4cG9ydHM7X2Muaj1mdW5jdGlvbihyKXt0cnl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHIpfWNhdGNoKGUpe3JldHVyblwiW1VuZXhwZWN0ZWRKU09OUGFyc2VFcnJvcl06IFwiK2UubWVzc2FnZX19fSk7dmFyIG5hPVModGk9PntcInVzZSBzdHJpY3RcIjtjKCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRpLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciByYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHIoKXt0aGlzLl9kYXRhTGVuZ3RoPTAsdGhpcy5fYnVmZmVyTGVuZ3RoPTAsdGhpcy5fc3RhdGU9bmV3IEludDMyQXJyYXkoNCksdGhpcy5fYnVmZmVyPW5ldyBBcnJheUJ1ZmZlcig2OCksdGhpcy5fYnVmZmVyOD1uZXcgVWludDhBcnJheSh0aGlzLl9idWZmZXIsMCw2OCksdGhpcy5fYnVmZmVyMzI9bmV3IFVpbnQzMkFycmF5KHRoaXMuX2J1ZmZlciwwLDE3KSx0aGlzLnN0YXJ0KCl9cmV0dXJuIHIuaGFzaFN0cj1mdW5jdGlvbihlLHQpe3JldHVybiB0PT09dm9pZCAwJiYodD0hMSksdGhpcy5vbmVQYXNzSGFzaGVyLnN0YXJ0KCkuYXBwZW5kU3RyKGUpLmVuZCh0KX0sci5oYXNoQXNjaWlTdHI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD09PXZvaWQgMCYmKHQ9ITEpLHRoaXMub25lUGFzc0hhc2hlci5zdGFydCgpLmFwcGVuZEFzY2lpU3RyKGUpLmVuZCh0KX0sci5faGV4PWZ1bmN0aW9uKGUpe3ZhciB0PXIuaGV4Q2hhcnMsbj1yLmhleE91dCxpLG8scyxhO2ZvcihhPTA7YTw0O2ErPTEpZm9yKG89YSo4LGk9ZVthXSxzPTA7czw4O3MrPTIpbltvKzErc109dC5jaGFyQXQoaSYxNSksaT4+Pj00LG5bbyswK3NdPXQuY2hhckF0KGkmMTUpLGk+Pj49NDtyZXR1cm4gbi5qb2luKFwiXCIpfSxyLl9tZDVjeWNsZT1mdW5jdGlvbihlLHQpe3ZhciBuPWVbMF0saT1lWzFdLG89ZVsyXSxzPWVbM107bis9KGkmb3x+aSZzKSt0WzBdLTY4MDg3NjkzNnwwLG49KG48PDd8bj4+PjI1KStpfDAscys9KG4maXx+biZvKSt0WzFdLTM4OTU2NDU4NnwwLHM9KHM8PDEyfHM+Pj4yMCkrbnwwLG8rPShzJm58fnMmaSkrdFsyXSs2MDYxMDU4MTl8MCxvPShvPDwxN3xvPj4+MTUpK3N8MCxpKz0obyZzfH5vJm4pK3RbM10tMTA0NDUyNTMzMHwwLGk9KGk8PDIyfGk+Pj4xMCkrb3wwLG4rPShpJm98fmkmcykrdFs0XS0xNzY0MTg4OTd8MCxuPShuPDw3fG4+Pj4yNSkraXwwLHMrPShuJml8fm4mbykrdFs1XSsxMjAwMDgwNDI2fDAscz0oczw8MTJ8cz4+PjIwKStufDAsbys9KHMmbnx+cyZpKSt0WzZdLTE0NzMyMzEzNDF8MCxvPShvPDwxN3xvPj4+MTUpK3N8MCxpKz0obyZzfH5vJm4pK3RbN10tNDU3MDU5ODN8MCxpPShpPDwyMnxpPj4+MTApK298MCxuKz0oaSZvfH5pJnMpK3RbOF0rMTc3MDAzNTQxNnwwLG49KG48PDd8bj4+PjI1KStpfDAscys9KG4maXx+biZvKSt0WzldLTE5NTg0MTQ0MTd8MCxzPShzPDwxMnxzPj4+MjApK258MCxvKz0ocyZufH5zJmkpK3RbMTBdLTQyMDYzfDAsbz0obzw8MTd8bz4+PjE1KStzfDAsaSs9KG8mc3x+byZuKSt0WzExXS0xOTkwNDA0MTYyfDAsaT0oaTw8MjJ8aT4+PjEwKStvfDAsbis9KGkmb3x+aSZzKSt0WzEyXSsxODA0NjAzNjgyfDAsbj0objw8N3xuPj4+MjUpK2l8MCxzKz0obiZpfH5uJm8pK3RbMTNdLTQwMzQxMTAxfDAscz0oczw8MTJ8cz4+PjIwKStufDAsbys9KHMmbnx+cyZpKSt0WzE0XS0xNTAyMDAyMjkwfDAsbz0obzw8MTd8bz4+PjE1KStzfDAsaSs9KG8mc3x+byZuKSt0WzE1XSsxMjM2NTM1MzI5fDAsaT0oaTw8MjJ8aT4+PjEwKStvfDAsbis9KGkmc3xvJn5zKSt0WzFdLTE2NTc5NjUxMHwwLG49KG48PDV8bj4+PjI3KStpfDAscys9KG4mb3xpJn5vKSt0WzZdLTEwNjk1MDE2MzJ8MCxzPShzPDw5fHM+Pj4yMykrbnwwLG8rPShzJml8biZ+aSkrdFsxMV0rNjQzNzE3NzEzfDAsbz0obzw8MTR8bz4+PjE4KStzfDAsaSs9KG8mbnxzJn5uKSt0WzBdLTM3Mzg5NzMwMnwwLGk9KGk8PDIwfGk+Pj4xMikrb3wwLG4rPShpJnN8byZ+cykrdFs1XS03MDE1NTg2OTF8MCxuPShuPDw1fG4+Pj4yNykraXwwLHMrPShuJm98aSZ+bykrdFsxMF0rMzgwMTYwODN8MCxzPShzPDw5fHM+Pj4yMykrbnwwLG8rPShzJml8biZ+aSkrdFsxNV0tNjYwNDc4MzM1fDAsbz0obzw8MTR8bz4+PjE4KStzfDAsaSs9KG8mbnxzJn5uKSt0WzRdLTQwNTUzNzg0OHwwLGk9KGk8PDIwfGk+Pj4xMikrb3wwLG4rPShpJnN8byZ+cykrdFs5XSs1Njg0NDY0Mzh8MCxuPShuPDw1fG4+Pj4yNykraXwwLHMrPShuJm98aSZ+bykrdFsxNF0tMTAxOTgwMzY5MHwwLHM9KHM8PDl8cz4+PjIzKStufDAsbys9KHMmaXxuJn5pKSt0WzNdLTE4NzM2Mzk2MXwwLG89KG88PDE0fG8+Pj4xOCkrc3wwLGkrPShvJm58cyZ+bikrdFs4XSsxMTYzNTMxNTAxfDAsaT0oaTw8MjB8aT4+PjEyKStvfDAsbis9KGkmc3xvJn5zKSt0WzEzXS0xNDQ0NjgxNDY3fDAsbj0objw8NXxuPj4+MjcpK2l8MCxzKz0obiZvfGkmfm8pK3RbMl0tNTE0MDM3ODR8MCxzPShzPDw5fHM+Pj4yMykrbnwwLG8rPShzJml8biZ+aSkrdFs3XSsxNzM1MzI4NDczfDAsbz0obzw8MTR8bz4+PjE4KStzfDAsaSs9KG8mbnxzJn5uKSt0WzEyXS0xOTI2NjA3NzM0fDAsaT0oaTw8MjB8aT4+PjEyKStvfDAsbis9KGleb15zKSt0WzVdLTM3ODU1OHwwLG49KG48PDR8bj4+PjI4KStpfDAscys9KG5eaV5vKSt0WzhdLTIwMjI1NzQ0NjN8MCxzPShzPDwxMXxzPj4+MjEpK258MCxvKz0oc15uXmkpK3RbMTFdKzE4MzkwMzA1NjJ8MCxvPShvPDwxNnxvPj4+MTYpK3N8MCxpKz0ob15zXm4pK3RbMTRdLTM1MzA5NTU2fDAsaT0oaTw8MjN8aT4+PjkpK298MCxuKz0oaV5vXnMpK3RbMV0tMTUzMDk5MjA2MHwwLG49KG48PDR8bj4+PjI4KStpfDAscys9KG5eaV5vKSt0WzRdKzEyNzI4OTMzNTN8MCxzPShzPDwxMXxzPj4+MjEpK258MCxvKz0oc15uXmkpK3RbN10tMTU1NDk3NjMyfDAsbz0obzw8MTZ8bz4+PjE2KStzfDAsaSs9KG9ec15uKSt0WzEwXS0xMDk0NzMwNjQwfDAsaT0oaTw8MjN8aT4+PjkpK298MCxuKz0oaV5vXnMpK3RbMTNdKzY4MTI3OTE3NHwwLG49KG48PDR8bj4+PjI4KStpfDAscys9KG5eaV5vKSt0WzBdLTM1ODUzNzIyMnwwLHM9KHM8PDExfHM+Pj4yMSkrbnwwLG8rPShzXm5eaSkrdFszXS03MjI1MjE5Nzl8MCxvPShvPDwxNnxvPj4+MTYpK3N8MCxpKz0ob15zXm4pK3RbNl0rNzYwMjkxODl8MCxpPShpPDwyM3xpPj4+OSkrb3wwLG4rPShpXm9ecykrdFs5XS02NDAzNjQ0ODd8MCxuPShuPDw0fG4+Pj4yOCkraXwwLHMrPShuXmlebykrdFsxMl0tNDIxODE1ODM1fDAscz0oczw8MTF8cz4+PjIxKStufDAsbys9KHNebl5pKSt0WzE1XSs1MzA3NDI1MjB8MCxvPShvPDwxNnxvPj4+MTYpK3N8MCxpKz0ob15zXm4pK3RbMl0tOTk1MzM4NjUxfDAsaT0oaTw8MjN8aT4+PjkpK298MCxuKz0ob14oaXx+cykpK3RbMF0tMTk4NjMwODQ0fDAsbj0objw8NnxuPj4+MjYpK2l8MCxzKz0oaV4obnx+bykpK3RbN10rMTEyNjg5MTQxNXwwLHM9KHM8PDEwfHM+Pj4yMikrbnwwLG8rPShuXihzfH5pKSkrdFsxNF0tMTQxNjM1NDkwNXwwLG89KG88PDE1fG8+Pj4xNykrc3wwLGkrPShzXihvfH5uKSkrdFs1XS01NzQzNDA1NXwwLGk9KGk8PDIxfGk+Pj4xMSkrb3wwLG4rPShvXihpfH5zKSkrdFsxMl0rMTcwMDQ4NTU3MXwwLG49KG48PDZ8bj4+PjI2KStpfDAscys9KGleKG58fm8pKSt0WzNdLTE4OTQ5ODY2MDZ8MCxzPShzPDwxMHxzPj4+MjIpK258MCxvKz0obl4oc3x+aSkpK3RbMTBdLTEwNTE1MjN8MCxvPShvPDwxNXxvPj4+MTcpK3N8MCxpKz0oc14ob3x+bikpK3RbMV0tMjA1NDkyMjc5OXwwLGk9KGk8PDIxfGk+Pj4xMSkrb3wwLG4rPShvXihpfH5zKSkrdFs4XSsxODczMzEzMzU5fDAsbj0objw8NnxuPj4+MjYpK2l8MCxzKz0oaV4obnx+bykpK3RbMTVdLTMwNjExNzQ0fDAscz0oczw8MTB8cz4+PjIyKStufDAsbys9KG5eKHN8fmkpKSt0WzZdLTE1NjAxOTgzODB8MCxvPShvPDwxNXxvPj4+MTcpK3N8MCxpKz0oc14ob3x+bikpK3RbMTNdKzEzMDkxNTE2NDl8MCxpPShpPDwyMXxpPj4+MTEpK298MCxuKz0ob14oaXx+cykpK3RbNF0tMTQ1NTIzMDcwfDAsbj0objw8NnxuPj4+MjYpK2l8MCxzKz0oaV4obnx+bykpK3RbMTFdLTExMjAyMTAzNzl8MCxzPShzPDwxMHxzPj4+MjIpK258MCxvKz0obl4oc3x+aSkpK3RbMl0rNzE4Nzg3MjU5fDAsbz0obzw8MTV8bz4+PjE3KStzfDAsaSs9KHNeKG98fm4pKSt0WzldLTM0MzQ4NTU1MXwwLGk9KGk8PDIxfGk+Pj4xMSkrb3wwLGVbMF09bitlWzBdfDAsZVsxXT1pK2VbMV18MCxlWzJdPW8rZVsyXXwwLGVbM109cytlWzNdfDB9LHIucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGFMZW5ndGg9MCx0aGlzLl9idWZmZXJMZW5ndGg9MCx0aGlzLl9zdGF0ZS5zZXQoci5zdGF0ZUlkZW50aXR5KSx0aGlzfSxyLnByb3RvdHlwZS5hcHBlbmRTdHI9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fYnVmZmVyOCxuPXRoaXMuX2J1ZmZlcjMyLGk9dGhpcy5fYnVmZmVyTGVuZ3RoLG8scztmb3Iocz0wO3M8ZS5sZW5ndGg7cys9MSl7aWYobz1lLmNoYXJDb2RlQXQocyksbzwxMjgpdFtpKytdPW87ZWxzZSBpZihvPDIwNDgpdFtpKytdPShvPj4+NikrMTkyLHRbaSsrXT1vJjYzfDEyODtlbHNlIGlmKG88NTUyOTZ8fG8+NTYzMTkpdFtpKytdPShvPj4+MTIpKzIyNCx0W2krK109bz4+PjYmNjN8MTI4LHRbaSsrXT1vJjYzfDEyODtlbHNle2lmKG89KG8tNTUyOTYpKjEwMjQrKGUuY2hhckNvZGVBdCgrK3MpLTU2MzIwKSs2NTUzNixvPjExMTQxMTEpdGhyb3cgbmV3IEVycm9yKFwiVW5pY29kZSBzdGFuZGFyZCBzdXBwb3J0cyBjb2RlIHBvaW50cyB1cCB0byBVKzEwRkZGRlwiKTt0W2krK109KG8+Pj4xOCkrMjQwLHRbaSsrXT1vPj4+MTImNjN8MTI4LHRbaSsrXT1vPj4+NiY2M3wxMjgsdFtpKytdPW8mNjN8MTI4fWk+PTY0JiYodGhpcy5fZGF0YUxlbmd0aCs9NjQsci5fbWQ1Y3ljbGUodGhpcy5fc3RhdGUsbiksaS09NjQsblswXT1uWzE2XSl9cmV0dXJuIHRoaXMuX2J1ZmZlckxlbmd0aD1pLHRoaXN9LHIucHJvdG90eXBlLmFwcGVuZEFzY2lpU3RyPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLl9idWZmZXI4LG49dGhpcy5fYnVmZmVyMzIsaT10aGlzLl9idWZmZXJMZW5ndGgsbyxzPTA7Oyl7Zm9yKG89TWF0aC5taW4oZS5sZW5ndGgtcyw2NC1pKTtvLS07KXRbaSsrXT1lLmNoYXJDb2RlQXQocysrKTtpZihpPDY0KWJyZWFrO3RoaXMuX2RhdGFMZW5ndGgrPTY0LHIuX21kNWN5Y2xlKHRoaXMuX3N0YXRlLG4pLGk9MH1yZXR1cm4gdGhpcy5fYnVmZmVyTGVuZ3RoPWksdGhpc30sci5wcm90b3R5cGUuYXBwZW5kQnl0ZUFycmF5PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLl9idWZmZXI4LG49dGhpcy5fYnVmZmVyMzIsaT10aGlzLl9idWZmZXJMZW5ndGgsbyxzPTA7Oyl7Zm9yKG89TWF0aC5taW4oZS5sZW5ndGgtcyw2NC1pKTtvLS07KXRbaSsrXT1lW3MrK107aWYoaTw2NClicmVhazt0aGlzLl9kYXRhTGVuZ3RoKz02NCxyLl9tZDVjeWNsZSh0aGlzLl9zdGF0ZSxuKSxpPTB9cmV0dXJuIHRoaXMuX2J1ZmZlckxlbmd0aD1pLHRoaXN9LHIucHJvdG90eXBlLmdldFN0YXRlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fc3RhdGU7cmV0dXJue2J1ZmZlcjpTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsQXJyYXkuZnJvbSh0aGlzLl9idWZmZXI4KSksYnVmbGVuOnRoaXMuX2J1ZmZlckxlbmd0aCxsZW5ndGg6dGhpcy5fZGF0YUxlbmd0aCxzdGF0ZTpbZVswXSxlWzFdLGVbMl0sZVszXV19fSxyLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihlKXt2YXIgdD1lLmJ1ZmZlcixuPWUuc3RhdGUsaT10aGlzLl9zdGF0ZSxvO2Zvcih0aGlzLl9kYXRhTGVuZ3RoPWUubGVuZ3RoLHRoaXMuX2J1ZmZlckxlbmd0aD1lLmJ1ZmxlbixpWzBdPW5bMF0saVsxXT1uWzFdLGlbMl09blsyXSxpWzNdPW5bM10sbz0wO288dC5sZW5ndGg7bys9MSl0aGlzLl9idWZmZXI4W29dPXQuY2hhckNvZGVBdChvKX0sci5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKGUpe2U9PT12b2lkIDAmJihlPSExKTt2YXIgdD10aGlzLl9idWZmZXJMZW5ndGgsbj10aGlzLl9idWZmZXI4LGk9dGhpcy5fYnVmZmVyMzIsbz0odD4+MikrMTt0aGlzLl9kYXRhTGVuZ3RoKz10O3ZhciBzPXRoaXMuX2RhdGFMZW5ndGgqODtpZihuW3RdPTEyOCxuW3QrMV09blt0KzJdPW5bdCszXT0wLGkuc2V0KHIuYnVmZmVyMzJJZGVudGl0eS5zdWJhcnJheShvKSxvKSx0PjU1JiYoci5fbWQ1Y3ljbGUodGhpcy5fc3RhdGUsaSksaS5zZXQoci5idWZmZXIzMklkZW50aXR5KSksczw9NDI5NDk2NzI5NSlpWzE0XT1zO2Vsc2V7dmFyIGE9cy50b1N0cmluZygxNikubWF0Y2goLyguKj8pKC57MCw4fSkkLyk7aWYoYT09PW51bGwpcmV0dXJuO3ZhciB1PXBhcnNlSW50KGFbMl0sMTYpLGY9cGFyc2VJbnQoYVsxXSwxNil8fDA7aVsxNF09dSxpWzE1XT1mfXJldHVybiByLl9tZDVjeWNsZSh0aGlzLl9zdGF0ZSxpKSxlP3RoaXMuX3N0YXRlOnIuX2hleCh0aGlzLl9zdGF0ZSl9LHIuc3RhdGVJZGVudGl0eT1uZXcgSW50MzJBcnJheShbMTczMjU4NDE5MywtMjcxNzMzODc5LC0xNzMyNTg0MTk0LDI3MTczMzg3OF0pLHIuYnVmZmVyMzJJZGVudGl0eT1uZXcgSW50MzJBcnJheShbMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF0pLHIuaGV4Q2hhcnM9XCIwMTIzNDU2Nzg5YWJjZGVmXCIsci5oZXhPdXQ9W10sci5vbmVQYXNzSGFzaGVyPW5ldyByLHJ9KCk7dGkuTWQ1PXJhO2lmKHJhLmhhc2hTdHIoXCJoZWxsb1wiKSE9PVwiNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTJcIil0aHJvdyBuZXcgRXJyb3IoXCJNZDUgc2VsZiB0ZXN0IGZhaWxlZC5cIil9KTt2YXIgaWw9e307UHQoaWwse0FBQ0RlcGF5OigpPT5vdCxCYXNpY0RlcGF5OigpPT5zcixDYW52YXNTaW5rOigpPT5zdCxIMjY0RGVwYXk6KCk9PmN0LEh0bWw1Q2FudmFzUGlwZWxpbmU6KCk9PkhyLEh0bWw1VmlkZW9NZXRhZGF0YVBpcGVsaW5lOigpPT5xcixIdG1sNVZpZGVvUGlwZWxpbmU6KCk9Pl90LEh0dHBNc2VQaXBlbGluZTooKT0+R3IsSHR0cFNvdXJjZTooKT0+ZHIsSW5zcGVjdG9yOigpPT5wcixKUEVHRGVwYXk6KCk9Pmx0LE1lc3NhZ2VUeXBlOigpPT5JLE1ldGFkYXRhUGlwZWxpbmU6KCk9PmpyLE1wNENhcHR1cmU6KCk9Pm1yLE1wNE11eGVyOigpPT5wdCxNc2VTaW5rOigpPT5UZSxPTlZJRkRlcGF5OigpPT5DZSxQaXBlbGluZTooKT0+QmUsUlRDUFBhY2tldFR5cGU6KCk9PktuLFJUU1BSZXNwb25zZUVycm9yOigpPT5JdCxSVFNQX01FVEhPRDooKT0+T3IsUnRzcE1qcGVnUGlwZWxpbmU6KCk9Pnh0LFJ0c3BNcDRQaXBlbGluZTooKT0+YnQsUnRzcFBhcnNlcjooKT0+bXQsUnRzcFBpcGVsaW5lOigpPT5lZSxSdHNwU2Vzc2lvbjooKT0+eXQsU0RFU0l0ZW06KCk9PkpuLFNSOigpPT5IcyxTY2hlZHVsZXI6KCk9PldlLFNpbms6KCk9PlEsU291cmNlOigpPT5WLFR1YmU6KCk9PlIsV1NTb3VyY2U6KCk9PkcsV3NTZHBQaXBlbGluZTooKT0+V3IsYWRkUlRTUFJldHJ5OigpPT5hYSxib2R5T2Zmc2V0OigpPT5BcixjU3JjOigpPT5ucyxjU3JjQ291bnQ6KCk9PlNlLGNvbXBvbmVudHM6KCk9PmVpLGNvbm5lY3Rpb25FbmRlZDooKT0+THIsY29udGVudEJhc2U6KCk9PkJyLGNvbnRlbnRMb2NhdGlvbjooKT0+TXIsY3JlYXRlVHJhbnNmb3JtOigpPT55ZSxleHRIZWFkZXI6KCk9PmlzLGV4dEhlYWRlckxlbmd0aDooKT0+TXQsZXh0ZW5zaW9uOigpPT5vcixleHRyYWN0SGVhZGVyVmFsdWU6KCk9PnJlLGV4dHJhY3RVUklzOigpPT5KcyxnZXRUaW1lOigpPT5Qcixpc1J0Y3BBcHA6KCk9PiRzLGlzUnRjcEJ5ZTooKT0+d3IsaXNSdGNwUlI6KCk9PmpzLGlzUnRjcFNERVM6KCk9PldzLGlzUnRjcFNSOigpPT5fcixtYXJrZXI6KCk9PmNlLG1lc3NhZ2VGcm9tQnVmZmVyOigpPT5TcixwYWRkaW5nOigpPT5lcyxwYXJzZTooKT0+UW4scGFyc2VSdGNwOigpPT5YbixwYXlsb2FkOigpPT5aLHBheWxvYWRUeXBlOigpPT5PLHBpcGVsaW5lczooKT0+bmkscmFuZ2U6KCk9PklyLHJ0Y3BNZXNzYWdlRnJvbUJ1ZmZlcjooKT0+eHIsc1NyYzooKT0+cnMsc2VxdWVuY2U6KCk9PlJyLHNlcXVlbmNlTnVtYmVyOigpPT50cyxzZXNzaW9uSWQ6KCk9PlRyLHNlc3Npb25UaW1lb3V0OigpPT5DcixzdGF0dXNDb2RlOigpPT5odCx0aW1lc3RhbXA6KCk9PkgsdXRpbHM6KCk9PmlpLHZlcnNpb246KCk9PlpvfSk7bW9kdWxlLmV4cG9ydHM9bWEoaWwpO2MoKTt2YXIgZWk9e307UHQoZWkse0FBQ0RlcGF5OigpPT5vdCxCYXNpY0RlcGF5OigpPT5zcixDYW52YXNTaW5rOigpPT5zdCxIMjY0RGVwYXk6KCk9PmN0LEh0dHBTb3VyY2U6KCk9PmRyLEluc3BlY3RvcjooKT0+cHIsSlBFR0RlcGF5OigpPT5sdCxNZXNzYWdlVHlwZTooKT0+SSxNcDRDYXB0dXJlOigpPT5tcixNcDRNdXhlcjooKT0+cHQsTXNlU2luazooKT0+VGUsT05WSUZEZXBheTooKT0+Q2UsUlRTUFJlc3BvbnNlRXJyb3I6KCk9Pkl0LFJUU1BfTUVUSE9EOigpPT5PcixSdHNwUGFyc2VyOigpPT5tdCxSdHNwU2Vzc2lvbjooKT0+eXQsU2luazooKT0+USxTb3VyY2U6KCk9PlYsVHViZTooKT0+UixXU1NvdXJjZTooKT0+RyxjcmVhdGVUcmFuc2Zvcm06KCk9PnllfSk7YygpO2MoKTt2YXIgZ2U9QyhOKCkpO2MoKTt2YXIgRWU9QyhOKCkpLGZlPWNsYXNze3N0YXRpYyBjb25zdW1lcihlPSgpPT57fSl7cmV0dXJuIG5ldyBFZS5Xcml0YWJsZSh7b2JqZWN0TW9kZTohMCx3cml0ZSh0LG4saSl7ZSh0KSxpKCl9fSl9c3RhdGljIHBlZWtlcihlKXtpZih0eXBlb2YgZSE9XCJmdW5jdGlvblwiKXRocm93IG5ldyBFcnJvcihcInlvdSBtdXN0IHN1cHBseSBhIGZ1bmN0aW9uXCIpO3JldHVybiBuZXcgRWUuVHJhbnNmb3JtKHtvYmplY3RNb2RlOiEwLHRyYW5zZm9ybSh0LG4saSl7ZSh0KSxpKHZvaWQgMCx0KX19KX1zdGF0aWMgcHJvZHVjZXIoZSl7bGV0IHQ9MDtyZXR1cm4gbmV3IEVlLlJlYWRhYmxlKHtvYmplY3RNb2RlOiEwLHJlYWQoKXtlIT09dm9pZCAwJiYodDxlLmxlbmd0aD90aGlzLnB1c2goZVt0KytdKTp0aGlzLnB1c2gobnVsbCkpfX0pfXN0YXRpYyByZWNvcmRlcihlLHQpe3JldHVybiBuZXcgRWUuVHJhbnNmb3JtKHtvYmplY3RNb2RlOiEwLHRyYW5zZm9ybShuLGksbyl7bGV0IHM9RGF0ZS5ub3coKSxhPU9iamVjdC5hc3NpZ24oe30sbix7ZGF0YTpuLmRhdGEudG9TdHJpbmcoXCJiYXNlNjRcIil9KTt0LndyaXRlKEpTT04uc3RyaW5naWZ5KHt0eXBlOmUsdGltZXN0YW1wOnMsbWVzc2FnZTphfSxudWxsLDIpKSx0LndyaXRlKGAsXG5gKSxvKHZvaWQgMCxuKX19KX1zdGF0aWMgcmVwbGF5ZXIoZSl7bGV0IHQ9MCxuPWVbMF0udGltZXN0YW1wO3JldHVybiBuZXcgRWUuUmVhZGFibGUoe29iamVjdE1vZGU6ITAscmVhZCgpe2xldCBpPWVbdCsrXTtpZihpKXtsZXR7dHlwZTpvLHRpbWVzdGFtcDpzLG1lc3NhZ2U6YX09aSx1PXMtbjtpZihuPXMsYSl7bGV0IGY9YS5kYXRhP0J1ZmZlci5mcm9tKGEuZGF0YSxcImJhc2U2NFwiKTpCdWZmZXIuYWxsb2MoMCksbD1PYmplY3QuYXNzaWduKHt9LGEse2RhdGE6Zn0pO3RoaXMucHVzaCh7dHlwZTpvLGRlbGF5OnUsbXNnOmx9KX1lbHNlIHRoaXMucHVzaCh7dHlwZTpvLGRlbGF5OnUsbXNnOm51bGx9KX1lbHNlIHRoaXMucHVzaChudWxsKX19KX19O3ZhciBpcj1jbGFzc3t9LFY9Y2xhc3MgZXh0ZW5kcyBpcntjb25zdHJ1Y3Rvcih0PW5ldyBnZS5SZWFkYWJsZSh7b2JqZWN0TW9kZTohMH0pLG49bmV3IGdlLldyaXRhYmxlKHtvYmplY3RNb2RlOiEwfSkpe3N1cGVyKCk7dGhpcy5pbmNvbWluZz10LHRoaXMub3V0Z29pbmc9bix0aGlzLm5leHQ9bnVsbCx0aGlzLnByZXY9bnVsbH1zdGF0aWMgZnJvbU1lc3NhZ2VzKHQpe3JldHVybiBuZXcgVihmZS5wcm9kdWNlcih0KSxmZS5jb25zdW1lcigpKX1jb25uZWN0KHQpe2lmKHQ9PT1udWxsKXJldHVybiB0aGlzO2lmKHRoaXMubmV4dCE9PW51bGx8fHQucHJldiE9PW51bGwpdGhyb3cgbmV3IEVycm9yKFwiY29ubmVjdGlvbiBmYWlsZWQ6IGNvbXBvbmVudChzKSBhbHJlYWR5IGNvbm5lY3RlZFwiKTtpZighdGhpcy5pbmNvbWluZy5yZWFkYWJsZXx8IXRoaXMub3V0Z29pbmcud3JpdGFibGUpdGhyb3cgbmV3IEVycm9yKFwiY29ubmVjdGlvbiBmYWlsZWQ6IHRoaXMgY29tcG9uZW50IG5vdCBjb21wYXRpYmxlXCIpO2lmKCF0LmluY29taW5nLndyaXRhYmxlfHwhdC5vdXRnb2luZy5yZWFkYWJsZSl0aHJvdyBuZXcgRXJyb3IoXCJjb25uZWN0aW9uIGZhaWxlZDogbmV4dCBjb21wb25lbnQgbm90IGNvbXBhdGlibGVcIik7dHJ5e3RoaXMuaW5jb21pbmcucGlwZSh0LmluY29taW5nKSx0Lm91dGdvaW5nLnBpcGUodGhpcy5vdXRnb2luZyl9Y2F0Y2gobyl7dGhyb3cgbmV3IEVycm9yKGBjb25uZWN0aW9uIGZhaWxlZDogJHtvLm1lc3NhZ2V9YCl9bGV0IG49bz0+e3RoaXMuaW5jb21pbmcuZW1pdChcImVycm9yXCIsbyl9O3QuaW5jb21pbmcub24oXCJlcnJvclwiLG4pO2xldCBpPW89Pnt0Lm91dGdvaW5nLmVtaXQoXCJlcnJvclwiLG8pfTtyZXR1cm4gdGhpcy5vdXRnb2luZy5vbihcImVycm9yXCIsaSksdGhpcy5uZXh0PXQsdC5wcmV2PXRoaXMsdGhpcy5faW5jb21pbmdFcnJvckhhbmRsZXI9bix0aGlzLl9vdXRnb2luZ0Vycm9ySGFuZGxlcj1pLHR9ZGlzY29ubmVjdCgpe2xldCB0PXRoaXMubmV4dDtyZXR1cm4gdCE9PW51bGwmJih0aGlzLmluY29taW5nLnVucGlwZSh0LmluY29taW5nKSx0Lm91dGdvaW5nLnVucGlwZSh0aGlzLm91dGdvaW5nKSx0eXBlb2YgdGhpcy5faW5jb21pbmdFcnJvckhhbmRsZXI8XCJ1XCImJnQuaW5jb21pbmcucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLHRoaXMuX2luY29taW5nRXJyb3JIYW5kbGVyKSx0eXBlb2YgdGhpcy5fb3V0Z29pbmdFcnJvckhhbmRsZXI8XCJ1XCImJnRoaXMub3V0Z29pbmcucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLHRoaXMuX291dGdvaW5nRXJyb3JIYW5kbGVyKSx0aGlzLm5leHQ9bnVsbCx0LnByZXY9bnVsbCxkZWxldGUgdGhpcy5faW5jb21pbmdFcnJvckhhbmRsZXIsZGVsZXRlIHRoaXMuX291dGdvaW5nRXJyb3JIYW5kbGVyKSx0aGlzfX0sUj1jbGFzcyBleHRlbmRzIFZ7Y29uc3RydWN0b3IodD1uZXcgZ2UuUGFzc1Rocm91Z2goe29iamVjdE1vZGU6ITB9KSxuPW5ldyBnZS5QYXNzVGhyb3VnaCh7b2JqZWN0TW9kZTohMH0pKXtzdXBlcih0LG4pO3RoaXMuaW5jb21pbmc9dCx0aGlzLm91dGdvaW5nPW59c3RhdGljIGZyb21IYW5kbGVycyh0LG4pe2xldCBpPXQ/ZmUucGVla2VyKHQpOnZvaWQgMCxvPW4/ZmUucGVla2VyKG4pOnZvaWQgMDtyZXR1cm4gbmV3IFIoaSxvKX19LFE9Y2xhc3MgZXh0ZW5kcyBpcntjb25zdHJ1Y3Rvcih0PW5ldyBnZS5Xcml0YWJsZSh7b2JqZWN0TW9kZTohMH0pLG49bmV3IGdlLlJlYWRhYmxlKHtvYmplY3RNb2RlOiEwfSkpe3N1cGVyKCk7dGhpcy5pbmNvbWluZz10LHRoaXMub3V0Z29pbmc9bix0aGlzLm5leHQ9bnVsbCx0aGlzLnByZXY9bnVsbH1zdGF0aWMgZnJvbUhhbmRsZXIodCl7bGV0IG49bmV3IFEoZmUuY29uc3VtZXIodCksZmUucHJvZHVjZXIodm9pZCAwKSk7cmV0dXJuIG4uaW5jb21pbmcub24oXCJmaW5pc2hcIiwoKT0+e24ub3V0Z29pbmcucHVzaChudWxsKX0pLG59Y29ubmVjdCgpe3Rocm93IG5ldyBFcnJvcihcImNvbm5lY3Rpb24gZmFpbGVkOiBhdHRlbXB0aW5nIHRvIGNvbm5lY3QgYWZ0ZXIgYSBzaW5rXCIpfWRpc2Nvbm5lY3QoKXtyZXR1cm4gdGhpc319O2MoKTtjKCk7YygpO3ZhciBpdD1bMTI4LDY0LDMyLDE2LDgsNCwyLDFdO3ZhciBabz1yPT5yWzBdPj4+Nixlcz1yPT4hIShyWzBdJml0WzJdKSxvcj1yPT4hIShyWzBdJml0WzNdKSxTZT1yPT5yWzBdJjE1LGNlPXI9PiEhKHJbMV0maXRbMF0pLE89cj0+clsxXSYxMjcsdHM9cj0+ci5yZWFkVUludDE2QkUoMiksSD1yPT5yLnJlYWRVSW50MzJCRSg0KSxycz1yPT5yLnJlYWRVSW50MzJCRSg4KSxucz0ocixlPTApPT5TZShyKT5lP3IucmVhZFVJbnQzMkJFKDEyK2UqNCk6MCxNdD1yPT5vcihyKT9yLnJlYWRVSW50MTZCRSgxMitTZShyKSo0KzIpOjAsaXM9cj0+TXQocik9PT0wP0J1ZmZlci5mcm9tKFtdKTpyLnNsaWNlKDEyK1NlKHIpKjQsMTIrU2UocikqNCs0K010KHIpKjQpLFo9cj0+b3Iocik/ci5zbGljZSgxMitTZShyKSo0KzQrTXQocikqNCk6ci5zbGljZSgxMitTZShyKSo0KTtjKCk7dmFyIEk9KGQ9PihkW2QuVU5LTk9XTj0wXT1cIlVOS05PV05cIixkW2QuUkFXPTFdPVwiUkFXXCIsZFtkLlJUUD0yXT1cIlJUUFwiLGRbZC5SVENQPTNdPVwiUlRDUFwiLGRbZC5SVFNQPTRdPVwiUlRTUFwiLGRbZC5TRFA9NV09XCJTRFBcIixkW2QuRUxFTUVOVEFSWT02XT1cIkVMRU1FTlRBUllcIixkW2QuSDI2ND03XT1cIkgyNjRcIixkW2QuSVNPTT04XT1cIklTT01cIixkW2QuWE1MPTldPVwiWE1MXCIsZFtkLkpQRUc9MTBdPVwiSlBFR1wiLGQpKShJfHx7fSk7YygpO2Z1bmN0aW9uIG9zKHIsZSx0KXtsZXQgbj1aKHIuZGF0YSksaT0wO2lmKGUpe2xldCBzPW4ucmVhZFVJbnQxNkJFKDApO2k9MisocytzJTgpLzh9bGV0IG89e3R5cGU6NixkYXRhOm4uc2xpY2UoaSkscGF5bG9hZFR5cGU6TyhyLmRhdGEpLHRpbWVzdGFtcDpIKHIuZGF0YSksbnRwVGltZXN0YW1wOnIubnRwVGltZXN0YW1wfTt0KG8pfWMoKTt2YXIgc3M9QyhOKCkpLHllPXI9Pm5ldyBzcy5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtOnJ9KTt2YXIgb3Q9Y2xhc3MgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKCl7bGV0IGUsdCxuPXllKGZ1bmN0aW9uKGksbyxzKXtpZihpLnR5cGU9PT01KXtsZXQgYTtmb3IobGV0IHUgb2YgaS5zZHAubWVkaWEpdS50eXBlPT09XCJhdWRpb1wiJiZ1LmZtdHAmJnUuZm10cC5wYXJhbWV0ZXJzJiZ1LmZtdHAucGFyYW1ldGVycy5tb2RlPT09XCJBQUMtaGJyXCImJihhPXUpO2lmKGEmJmEucnRwbWFwIT09dm9pZCAwKXtlPU51bWJlcihhLnJ0cG1hcC5wYXlsb2FkVHlwZSk7bGV0IHU9YS5mbXRwLnBhcmFtZXRlcnMsZj1OdW1iZXIodS5zaXplbGVuZ3RoKXx8MCxsPU51bWJlcih1LmluZGV4bGVuZ3RoKXx8MCxkPU51bWJlcih1LmluZGV4ZGVsdGFsZW5ndGgpfHwwLGg9TnVtYmVyKHUuY3RzZGVsdGFsZW5ndGgpfHwwLG09TnVtYmVyKHUuZHRzZGVsdGFsZW5ndGgpfHwwLGI9TnVtYmVyKHUucmFuZG9tYWNjZXNzaW5kaWNhdGlvbil8fDAseT1OdW1iZXIodS5zdHJlYW1zdGF0ZWluZGljYXRpb24pfHwwLHc9TnVtYmVyKHUuYXV4aWxpYXJ5ZGF0YXNpemVsZW5ndGgpfHwwO3Q9ZitNYXRoLm1heChsLGQpK2grbStiK3krdz4wfXModm9pZCAwLGkpfWVsc2UgaS50eXBlPT09MiYmTyhpLmRhdGEpPT09ZT8ob3MoaSx0LHRoaXMucHVzaC5iaW5kKHRoaXMpKSxzKCkpOnModm9pZCAwLGkpfSk7c3VwZXIobil9fTtjKCk7dmFyIHNyPWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3RvcihlKXtpZihlPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcInlvdSBtdXN0IHN1cHBseSBhIHBheWxvYWQgdHlwZSB0byBCYXNpY0RlcGF5Q29tcG9uZW50XCIpO2xldCB0PUJ1ZmZlci5hbGxvYygwKSxuPXllKGZ1bmN0aW9uKGksbyxzKXtpZihpLnR5cGU9PT0yJiZPKGkuZGF0YSk9PT1lKXtsZXQgYT1aKGkuZGF0YSk7dD1CdWZmZXIuY29uY2F0KFt0LGFdKSxjZShpLmRhdGEpJiYodC5sZW5ndGg+MCYmdGhpcy5wdXNoKHtkYXRhOnQsdGltZXN0YW1wOkgoaS5kYXRhKSxudHBUaW1lc3RhbXA6aS5udHBUaW1lc3RhbXAscGF5bG9hZFR5cGU6TyhpLmRhdGEpLHR5cGU6Nn0pLHQ9QnVmZmVyLmFsbG9jKDApKSxzKCl9ZWxzZSBzKHZvaWQgMCxpKX0pO3N1cGVyKG4pfX07YygpO2MoKTt2YXIgYXI9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmVsYXBzZWQ9MCx0aGlzLnN0YXJ0ZWQ9MCx0aGlzLnN0b3BwZWQ9ITB9c3RhcnQoKXt0aGlzLnN0b3BwZWQmJih0aGlzLnN0YXJ0ZWQ9d2luZG93LnBlcmZvcm1hbmNlLm5vdygpLHRoaXMuc3RvcHBlZD0hMSl9c3RvcCgpe3RoaXMuc3RvcHBlZHx8KHRoaXMuZWxhcHNlZD10aGlzLm5vdygpLHRoaXMuc3RvcHBlZD0hMCl9cmVzZXQoKXt0aGlzLmVsYXBzZWQ9MCx0aGlzLnN0YXJ0ZWQ9MCx0aGlzLnN0b3BwZWQ9ITB9bm93KCl7cmV0dXJuIHRoaXMuc3RvcHBlZD90aGlzLmVsYXBzZWQ6dGhpcy5lbGFwc2VkKyh3aW5kb3cucGVyZm9ybWFuY2Uubm93KCktdGhpcy5zdGFydGVkKX1wbGF5KCl7dGhpcy5zdGFydCgpfXBhdXNlKCl7dGhpcy5zdG9wKCl9Z2V0IGN1cnJlbnRUaW1lKCl7cmV0dXJuIHRoaXMubm93KCkvMWUzfX07YygpO3ZhciBXZT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbj0xMCl7dGhpcy5fY2xvY2s9ZSx0aGlzLl9oYW5kbGVyPXQsdGhpcy5fdG9sZXJhbmNlPW4sdGhpcy5fbmV4dFJ1bj0wLHRoaXMuX25leHRQbGF5PTAsdGhpcy5fZmlmbz1bXSx0aGlzLl9udHBQcmVzZW50YXRpb25UaW1lPTAsdGhpcy5fc3VzcGVuZGVkPSExfXJlc2V0KCl7Y2xlYXJUaW1lb3V0KHRoaXMuX25leHRSdW4pLGNsZWFyVGltZW91dCh0aGlzLl9uZXh0UGxheSksdGhpcy5fZmlmbz1bXSx0aGlzLl9udHBQcmVzZW50YXRpb25UaW1lPTAsdGhpcy5fc3VzcGVuZGVkPSExfWluaXQoZSl7dGhpcy5fbnRwUHJlc2VudGF0aW9uVGltZT1lfXN1c3BlbmQoKXtjbGVhclRpbWVvdXQodGhpcy5fbmV4dFBsYXkpLHRoaXMuX3N1c3BlbmRlZD0hMH1yZXN1bWUoKXt0aGlzLl9zdXNwZW5kZWQ9ITEsdGhpcy5ydW4odm9pZCAwKX1ydW4oZSl7aWYoY2xlYXJUaW1lb3V0KHRoaXMuX25leHRSdW4pLHR5cGVvZiB0aGlzLl9udHBQcmVzZW50YXRpb25UaW1lPlwidVwifHwodHlwZW9mIGU8XCJ1XCImJnRoaXMuX2ZpZm8ucHVzaChlKSx0aGlzLl9zdXNwZW5kZWQpfHx0aGlzLl9maWZvLmxlbmd0aD09PTApcmV0dXJuO2xldCB0PTAsbjtkb3tsZXQgaT10aGlzLl9maWZvLnNoaWZ0KCk7aWYoaT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJpbnRlcm5hbCBlcnJvcjogbWVzc2FnZSBzaG91bGQgbmV2ZXIgYmUgdW5kZWZpbmVkXCIpO249aTtsZXQgbz1uLm50cFRpbWVzdGFtcDtpZihvPT09dm9pZCAwKWNvbnRpbnVlO3Q9by10aGlzLl9udHBQcmVzZW50YXRpb25UaW1lLXRoaXMuX2Nsb2NrLmN1cnJlbnRUaW1lKjFlMyxNYXRoLmFicyh0KTx0aGlzLl90b2xlcmFuY2UmJnRoaXMuX2hhbmRsZXImJnRoaXMuX2hhbmRsZXIobil9d2hpbGUodDx0aGlzLl90b2xlcmFuY2UmJnRoaXMuX2ZpZm8ubGVuZ3RoPjApO3Q8LXRoaXMuX3RvbGVyYW5jZT8oY2xlYXJUaW1lb3V0KHRoaXMuX25leHRQbGF5KSx0aGlzLl9jbG9jay5wYXVzZSgpLHRoaXMuX25leHRQbGF5PXdpbmRvdy5zZXRUaW1lb3V0KCgpPT50aGlzLl9jbG9jay5wbGF5KCksLXQpKTp0PnRoaXMuX3RvbGVyYW5jZSYmKHRoaXMuX2ZpZm8udW5zaGlmdChuKSx0aGlzLl9uZXh0UnVuPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT50aGlzLnJ1bih2b2lkIDApLHQpKX19O3ZhciB1cj1DKE4oKSksYWM9cj0+e3IuYml0cmF0ZT0wLHIuZnJhbWVyYXRlPTAsci5yZW5kZXJlZEZyYW1lcz0wfSx1Yz1yPT57bGV0IGU9MCx0PTAsbj0wO3JldHVybihpLHtieXRlTGVuZ3RoOm8sZHVyYXRpb246c30pPT57aWYoZSs9byx0Kz1zLG4rKyx0Pj1yKXtsZXQgYT04KmUsdT1uLGY9dC9yO2kuYml0cmF0ZT1hL2YsaS5mcmFtZXJhdGU9dS9mLGU9MCx0PTAsbj0wfX19LHN0PWNsYXNzIGV4dGVuZHMgUXtjb25zdHJ1Y3Rvcih0KXtpZih0PT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcImNhbnZhcyBlbGVtZW50IGFyZ3VtZW50IG1pc3NpbmdcIik7bGV0IG49MCxpPTAsbz0wLHM9e2JpdHJhdGU6MCxmcmFtZXJhdGU6MCxyZW5kZXJlZEZyYW1lczowfSxhLHU9bnVsbDt3aW5kb3cuY3JlYXRlSW1hZ2VCaXRtYXAhPT12b2lkIDAmJih1PXQuZ2V0Q29udGV4dChcImJpdG1hcHJlbmRlcmVyXCIpKSx1PT09bnVsbCYmKHU9dC5nZXRDb250ZXh0KFwiMmRcIikpO2xldCBmO2lmKHU9PT1udWxsKWY9KCk9Pnt9O2Vsc2UgaWYoXCJ0cmFuc2ZlckZyb21JbWFnZUJpdG1hcFwiaW4gdSl7bGV0IF89dTtmPSh7YmxvYjp2fSk9PntzLnJlbmRlcmVkRnJhbWVzKyssd2luZG93LmNyZWF0ZUltYWdlQml0bWFwKHYpLnRoZW4ocT0+e18udHJhbnNmZXJGcm9tSW1hZ2VCaXRtYXAocSl9KS5jYXRjaCgoKT0+e30pfX1lbHNle2xldCBfPXUsdj1uZXcgSW1hZ2U7di5vbmxvYWQ9KCk9PntfLmRyYXdJbWFnZSh2LDAsMCl9LGY9KHtibG9iOnF9KT0+e3MucmVuZGVyZWRGcmFtZXMrKztsZXQgQT13aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChxKTt2LnNyYz1BfX1sZXQgbD1uZXcgYXIsZD1uZXcgV2UobCxmKSxoPTAsbT0oKT0+e3RoaXMub25DYW5wbGF5JiZ0aGlzLm9uQ2FucGxheSgpfSxiPV89Pnt0aGlzLm9uU3luYyYmdGhpcy5vblN5bmMoXyl9LHk9bmV3IHVyLldyaXRhYmxlKHtvYmplY3RNb2RlOiEwLHdyaXRlOihfLHYscSk9PntpZihfLnR5cGU9PT01KXtsLnJlc2V0KCksZC5yZXNldCgpLG49MDtsZXQgQT1fLnNkcC5tZWRpYS5maW5kKGo9PmoudHlwZT09PVwidmlkZW9cIiYmai5ydHBtYXAhPT12b2lkIDAmJmoucnRwbWFwLmVuY29kaW5nTmFtZT09PVwiSlBFR1wiKTtBIT09dm9pZCAwJiZBLnJ0cG1hcCE9PXZvaWQgMCYmKG89QS5ydHBtYXAuY2xvY2tyYXRlLGFjKHMpLGE9dWMobykpLHEoKX1lbHNlIGlmKF8udHlwZT09PTEwKXtsZXR7dGltZXN0YW1wOkEsbnRwVGltZXN0YW1wOmp9PV87aWYoIW4pe249QSxpPUE7bGV0e3dpZHRoOkllLGhlaWdodDpBZX09Xy5mcmFtZXNpemU7dC53aWR0aD1JZSx0LmhlaWdodD1BZSxkLmluaXQoMCl9bGV0IFk9MWUzKihBLW4pL28sR2U9bmV3IHdpbmRvdy5CbG9iKFtfLmRhdGFdLHt0eXBlOlwiaW1hZ2UvanBlZ1wifSk7IWgmJmomJihoPWotWSxiKGgpKSxkLnJ1bih7bnRwVGltZXN0YW1wOlksYmxvYjpHZX0pLEE9PT1uJiZtKCksYShzLHtieXRlTGVuZ3RoOl8uZGF0YS5sZW5ndGgsZHVyYXRpb246QS1pfSksaT1BLHEoKX1lbHNlIHEoKX19KSx3PW5ldyB1ci5SZWFkYWJsZSh7b2JqZWN0TW9kZTohMCxyZWFkOmZ1bmN0aW9uKCl7fX0pO3cub24oXCJlcnJvclwiLCgpPT57Y29uc29sZS53YXJuKFwib3V0Z29pbmcgc3RyZWFtIGJyb2tlIHNvbWV3aGVyZVwiKX0pO3N1cGVyKHksdyk7dGhpcy5fY2xvY2s9bCx0aGlzLl9zY2hlZHVsZXI9ZCx0aGlzLl9pbmZvPXMsdGhpcy5vbkNhbnBsYXk9dm9pZCAwLHRoaXMub25TeW5jPXZvaWQgMH1nZXQgY3VycmVudFRpbWUoKXtyZXR1cm4gdGhpcy5fY2xvY2suY3VycmVudFRpbWV9cGF1c2UoKXt0aGlzLl9zY2hlZHVsZXIuc3VzcGVuZCgpLHRoaXMuX2Nsb2NrLnBhdXNlKCl9cGxheSgpe3RoaXMuX2Nsb2NrLnBsYXkoKSx0aGlzLl9zY2hlZHVsZXIucmVzdW1lKCl9Z2V0IGJpdHJhdGUoKXtyZXR1cm4gdGhpcy5faW5mby5iaXRyYXRlfWdldCBmcmFtZXJhdGUoKXtyZXR1cm4gdGhpcy5faW5mby5mcmFtZXJhdGV9fTtjKCk7dmFyIGRzPUMoTigpKTtjKCk7dmFyIGxzPUMobGUoKSk7dmFyIHdjPSgwLGxzLmRlZmF1bHQpKFwibXNsOmgyNjRkZXBheVwiKSxscj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2J1ZmZlcj1CdWZmZXIuYWxsb2MoMCl9cGFyc2UoZSl7bGV0IHQ9WihlLmRhdGEpLG49dFswXSYzMTtpZihuPT09Mjgpe2xldCBpPXRbMF0sbz10WzFdLHM9ISEobz4+NyksYT1vJjMxLHU9aSYyMjR8YSxmPW8mNjQ7aWYocylyZXR1cm4gdGhpcy5fYnVmZmVyPUJ1ZmZlci5jb25jYXQoW0J1ZmZlci5mcm9tKFswLDAsMCwwLHVdKSx0LnNsaWNlKDIpXSksbnVsbDtpZihmKXtsZXQgbD1CdWZmZXIuY29uY2F0KFt0aGlzLl9idWZmZXIsdC5zbGljZSgyKV0pO2wud3JpdGVVSW50MzJCRShsLmxlbmd0aC00LDApO2xldCBkPXtkYXRhOmwsdHlwZTo3LHRpbWVzdGFtcDpIKGUuZGF0YSksbnRwVGltZXN0YW1wOmUubnRwVGltZXN0YW1wLHBheWxvYWRUeXBlOk8oZS5kYXRhKSxuYWxUeXBlOmF9O3JldHVybiB0aGlzLl9idWZmZXI9QnVmZmVyLmFsbG9jKDApLGR9ZWxzZSByZXR1cm4gdGhpcy5fYnVmZmVyPUJ1ZmZlci5jb25jYXQoW3RoaXMuX2J1ZmZlcix0LnNsaWNlKDIpXSksbnVsbH1lbHNlIGlmKChuPT09MXx8bj09PTUpJiZ0aGlzLl9idWZmZXIubGVuZ3RoPT09MCl7bGV0IGk9QnVmZmVyLmNvbmNhdChbQnVmZmVyLmZyb20oWzAsMCwwLDBdKSx0XSk7aS53cml0ZVVJbnQzMkJFKGkubGVuZ3RoLTQsMCk7bGV0IG89e2RhdGE6aSx0eXBlOjcsdGltZXN0YW1wOkgoZS5kYXRhKSxudHBUaW1lc3RhbXA6ZS5udHBUaW1lc3RhbXAscGF5bG9hZFR5cGU6TyhlLmRhdGEpLG5hbFR5cGU6bn07cmV0dXJuIHRoaXMuX2J1ZmZlcj1CdWZmZXIuYWxsb2MoMCksb31lbHNlIHJldHVybiB3YyhgSDI2NGRlcGF5Q29tcG9uZW50IGNhbiBvbmx5IGV4dHJhY3QgdHlwZXMgMSw1IGFuZCAyOCwgZ290ICR7bn1gKSx0aGlzLl9idWZmZXI9QnVmZmVyLmFsbG9jKDApLG51bGx9fTt2YXIgY3Q9Y2xhc3MgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKCl7bGV0IGUsdD0hMSxuPVtdLGk9bmV3IGxyLG89bmV3IGRzLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm06ZnVuY3Rpb24ocyxhLHUpe2lmKHMudHlwZT09PTUpe2xldCBmPXMuc2RwLm1lZGlhLmZpbmQobD0+bC50eXBlPT09XCJ2aWRlb1wiJiZsLnJ0cG1hcCE9PXZvaWQgMCYmbC5ydHBtYXAuZW5jb2RpbmdOYW1lPT09XCJIMjY0XCIpO2YhPT12b2lkIDAmJmYucnRwbWFwIT09dm9pZCAwJiYoZT1mLnJ0cG1hcC5wYXlsb2FkVHlwZSksdSh2b2lkIDAscyl9ZWxzZSBpZihzLnR5cGU9PT0yJiZPKHMuZGF0YSk9PT1lKXtsZXQgZj1jZShzLmRhdGEpLGw9aS5wYXJzZShzKTtpZihsPT09bnVsbHx8IXQmJmwubmFsVHlwZSE9PTUpe3UoKTtyZXR1cm59dD0hMCxuLnB1c2gobC5kYXRhKSxmJiYodGhpcy5wdXNoKHsuLi5sLGRhdGE6bi5sZW5ndGg9PT0xP25bMF06QnVmZmVyLmNvbmNhdChuKX0pLG49W10pLHUoKX1lbHNlIHUodm9pZCAwLHMpfX0pO3N1cGVyKG8pfX07YygpO3ZhciBwcz1DKGxlKCkpO3ZhciBocz1DKE4oKSk7dmFyIE5uPSgwLHBzLmRlZmF1bHQpKFwibXNsOmh0dHAtc291cmNlXCIpLGRyPWNsYXNzIGV4dGVuZHMgVntjb25zdHJ1Y3Rvcih0KXtsZXR7dXJpOm4sb3B0aW9uczppfT10LG89bmV3IGhzLlJlYWRhYmxlKHtvYmplY3RNb2RlOiEwLHJlYWQ6ZnVuY3Rpb24oKXt9fSk7by5vbihcImVycm9yXCIscz0+e2NvbnNvbGUud2FybihcImNsb3Npbmcgc29ja2V0IGR1ZSB0byBpbmNvbWluZyBlcnJvclwiLHMpLHRoaXMuX3JlYWRlciYmdGhpcy5fcmVhZGVyLmNhbmNlbCgpfSk7c3VwZXIobyk7by5fcmVhZD0oKT0+e3RoaXMuX3B1bGwoKX0sdGhpcy51cmk9bix0aGlzLm9wdGlvbnM9aSx0aGlzLl9hbGxEb25lPSExfXBsYXkoKXtpZih0aGlzLnVyaT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJjYW5ub3Qgc3RhcnQgcGxheWluZyB3aGVuIHRoZXJlIGlzIG5vIFVSSVwiKTt0aGlzLl9hYm9ydENvbnRyb2xsZXI9bmV3IEFib3J0Q29udHJvbGxlcix0aGlzLmxlbmd0aD0wLGZldGNoKHRoaXMudXJpLHtjcmVkZW50aWFsczpcImluY2x1ZGVcIixzaWduYWw6dGhpcy5fYWJvcnRDb250cm9sbGVyLnNpZ25hbCwuLi50aGlzLm9wdGlvbnN9KS50aGVuKHQ9PntpZih0LmJvZHk9PT1udWxsKXRocm93IG5ldyBFcnJvcihcImVtcHR5IHJlc3BvbnNlIGJvZHlcIik7dGhpcy5vbkhlYWRlcnMmJnRoaXMub25IZWFkZXJzKHQuaGVhZGVycyksdGhpcy5fcmVhZGVyPXQuYm9keS5nZXRSZWFkZXIoKSx0aGlzLl9wdWxsKCl9KS5jYXRjaCh0PT57Y29uc29sZS5lcnJvcihcImh0dHAtc291cmNlOiBmZXRjaCBmYWlsZWQ6IFwiLHQpfSl9YWJvcnQoKXt0aGlzLl9yZWFkZXImJnRoaXMuX3JlYWRlci5jYW5jZWwoKS5jYXRjaCh0PT57Y29uc29sZS5sb2coXCJodHRwLXNvdXJjZTogY2FuY2VsIHJlYWRlciBmYWlsZWQ6IFwiLHQpfSksdGhpcy5fYWJvcnRDb250cm9sbGVyJiZ0aGlzLl9hYm9ydENvbnRyb2xsZXIuYWJvcnQoKX1faXNDbG9zZWQoKXtyZXR1cm4gdGhpcy5fYWxsRG9uZX1fY2xvc2UoKXt0aGlzLl9yZWFkZXI9dm9pZCAwLHRoaXMuX2FsbERvbmU9ITAsdGhpcy5pbmNvbWluZy5wdXNoKG51bGwpLHRoaXMub25TZXJ2ZXJDbG9zZT8uKCl9X3B1bGwoKXt0aGlzLl9yZWFkZXIhPT12b2lkIDAmJnRoaXMuX3JlYWRlci5yZWFkKCkudGhlbigoe2RvbmU6dCx2YWx1ZTpufSk9PntpZih0KXt0aGlzLl9pc0Nsb3NlZCgpfHwoTm4oXCJmZXRjaCBjb21wbGV0ZWQsIHRvdGFsIGRvd25sb2FkZWQ6IFwiLHRoaXMubGVuZ3RoLFwiIGJ5dGVzXCIpLHRoaXMuX2Nsb3NlKCkpO3JldHVybn1pZihuPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcImV4cGVjdGVkIHZhbHVlIHRvIGJlIGRlZmluZWRcIik7aWYodGhpcy5sZW5ndGg9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwiZXhwZWN0ZWQgbGVuZ3RoIHRvIGJlIGRlZmluZWRcIik7dGhpcy5sZW5ndGgrPW4ubGVuZ3RoO2xldCBpPUJ1ZmZlci5mcm9tKG4pO3RoaXMuaW5jb21pbmcucHVzaCh7ZGF0YTppLHR5cGU6MX0pP3RoaXMuX3B1bGwoKTpObihcImRvd25zdHJlYW0gYmFjayBwcmVzc3VyZTogcGF1c2luZyByZWFkXCIpfSkuY2F0Y2godD0+e05uKFwiaHR0cC1zb3VyY2U6IHJlYWQgZmFpbGVkOiBcIix0KSx0aGlzLl9pc0Nsb3NlZCgpfHx0aGlzLl9jbG9zZSgpfSl9fTtjKCk7dmFyIEhuPUMoTigpKSxtcz0ocixlKT0+e2xldCB0PURhdGUubm93KCksbj1pPT57bGV0IG89RGF0ZS5ub3coKTtjb25zb2xlLmxvZyhgJHtyfTogKyR7by10fW1zYCxpKSx0PW99O3JldHVybiBlPT09dm9pZCAwP246aT0+aS50eXBlPT09ZSYmbihpKX0scHI9Y2xhc3MgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKGUpe2xldCB0PW1zKFwiaW5jb21pbmdcIixlKSxuPW5ldyBIbi5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtOmZ1bmN0aW9uKHMsYSx1KXt0KHMpLHUodm9pZCAwLHMpfX0pLGk9bXMoXCJvdXRnb2luZ1wiLGUpLG89bmV3IEhuLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm06ZnVuY3Rpb24ocyxhLHUpe2kocyksdSh2b2lkIDAscyl9fSk7c3VwZXIobixvKX19O2MoKTtjKCk7YygpO2Z1bmN0aW9uIFNzKCl7cmV0dXJuIEJ1ZmZlci5mcm9tKFsyNTUsMjE2XSl9ZnVuY3Rpb24gUnMocixlKXtsZXQgdD1yJjE/MTI4OjY0LG49ciYyPzEyODo2NDtpZihlLmxlbmd0aCE9PXQrbil0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHF1YW50aXphdGlvbiB0YWJsZVwiKTtsZXQgaT1CdWZmZXIuZnJvbShbMjU1LDIxOSwwLHQrMywwXSksbz1CdWZmZXIuZnJvbShbMjU1LDIxOSwwLG4rMywxXSk7cmV0dXJuIEJ1ZmZlci5jb25jYXQoW2ksZS5zbGljZSgwLHQpLG8sZS5zbGljZSh0KV0pfWZ1bmN0aW9uIFRzKHIsZSx0KXtyZXR1cm4gQnVmZmVyLmZyb20oWzI1NSwxOTIsMCwxNyw4LGU+PjgsZSxyPj44LHIsMywwLHQ9PT0wPzMzOjM0LDAsMSwxNywxLDIsMTcsMV0pfXZhciBncz1bMCwxLDUsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMF0seXM9WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTFdLGJzPVswLDIsMSwzLDMsMiw0LDMsNSw1LDQsNCwwLDAsMSwxMjVdLHhzPVsxLDIsMywwLDQsMTcsNSwxOCwzMyw0OSw2NSw2LDE5LDgxLDk3LDcsMzQsMTEzLDIwLDUwLDEyOSwxNDUsMTYxLDgsMzUsNjYsMTc3LDE5MywyMSw4MiwyMDksMjQwLDM2LDUxLDk4LDExNCwxMzAsOSwxMCwyMiwyMywyNCwyNSwyNiwzNywzOCwzOSw0MCw0MSw0Miw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw4Myw4NCw4NSw4Niw4Nyw4OCw4OSw5MCw5OSwxMDAsMTAxLDEwMiwxMDMsMTA0LDEwNSwxMDYsMTE1LDExNiwxMTcsMTE4LDExOSwxMjAsMTIxLDEyMiwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE2MiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksMTcwLDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTBdLF9zPVswLDMsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwwXSx3cz1bMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMV0sdnM9WzAsMiwxLDIsNCw0LDMsNCw3LDUsNCw0LDAsMSwyLDExOV0sRXM9WzAsMSwyLDMsMTcsNCw1LDMzLDQ5LDYsMTgsNjUsODEsNyw5NywxMTMsMTksMzQsNTAsMTI5LDgsMjAsNjYsMTQ1LDE2MSwxNzcsMTkzLDksMzUsNTEsODIsMjQwLDIxLDk4LDExNCwyMDksMTAsMjIsMzYsNTIsMjI1LDM3LDI0MSwyMywyNCwyNSwyNiwzOCwzOSw0MCw0MSw0Miw1Myw1NCw1NSw1Niw1Nyw1OCw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw4Myw4NCw4NSw4Niw4Nyw4OCw4OSw5MCw5OSwxMDAsMTAxLDEwMiwxMDMsMTA0LDEwNSwxMDYsMTE1LDExNiwxMTcsMTE4LDExOSwxMjAsMTIxLDEyMiwxMzAsMTMxLDEzMiwxMzMsMTM0LDEzNSwxMzYsMTM3LDEzOCwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywxNjgsMTY5LDE3MCwxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywxODQsMTg1LDE4NiwxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MF07ZnVuY3Rpb24gQ3MoKXtsZXQgcj1bWzI1NSwxOTYsMCwzK2dzLmxlbmd0aCt5cy5sZW5ndGgsMF0sZ3MseXNdLGU9W1syNTUsMTk2LDAsMyticy5sZW5ndGgreHMubGVuZ3RoLDE8PDR8MF0sYnMseHNdLHQ9W1syNTUsMTk2LDAsMytfcy5sZW5ndGgrd3MubGVuZ3RoLDA8PDR8MV0sX3Msd3NdLG49W1syNTUsMTk2LDAsMyt2cy5sZW5ndGgrRXMubGVuZ3RoLDE8PDR8MV0sdnMsRXNdO3JldHVybiBCdWZmZXIuY29uY2F0KFsuLi5yLm1hcChCdWZmZXIuZnJvbSksLi4uZS5tYXAoQnVmZmVyLmZyb20pLC4uLnQubWFwKEJ1ZmZlci5mcm9tKSwuLi5uLm1hcChCdWZmZXIuZnJvbSldKX1mdW5jdGlvbiBCcygpe3JldHVybiBCdWZmZXIuZnJvbShbMjU1LDIxOCwwLDEyLDMsMCwwLDEsMTcsMiwxNywwLDYzLDBdKX1mdW5jdGlvbiBNcyhyKXtyZXR1cm4gQnVmZmVyLmZyb20oWzI1NSwyMjEsMCw0LHI+PjgsciYyNTVdKX1jKCk7YygpO2Z1bmN0aW9uIGhyKHIsZSx0KXtyZXR1cm4gcj50P3Q6cjxlP2U6cn12YXIgRWM9WzE2LDExLDEyLDE0LDEyLDEwLDE2LDE0LDEzLDE0LDE4LDE3LDE2LDE5LDI0LDQwLDI2LDI0LDIyLDIyLDI0LDQ5LDM1LDM3LDI5LDQwLDU4LDUxLDYxLDYwLDU3LDUxLDU2LDU1LDY0LDcyLDkyLDc4LDY0LDY4LDg3LDY5LDU1LDU2LDgwLDEwOSw4MSw4Nyw5NSw5OCwxMDMsMTA0LDEwMyw2Miw3NywxMTMsMTIxLDExMiwxMDAsMTIwLDkyLDEwMSwxMDMsOTldLFNjPVsxNywxOCwxOCwyNCwyMSwyNCw0NywyNiwyNiw0Nyw5OSw2Niw1Niw2Niw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OV07ZnVuY3Rpb24gTHMocil7bGV0IGU9aHIociwxLDk5KSx0PUJ1ZmZlci5hbGxvYygxMjgpLG49cjw1MD9NYXRoLmZsb29yKDVlMy9lKToyMDAtZSoyO2ZvcihsZXQgaT0wO2k8NjQ7aSsrKXtsZXQgbz1NYXRoLmZsb29yKChFY1tpXSpuKzUwKS8xMDApLHM9TWF0aC5mbG9vcigoU2NbaV0qbis1MCkvMTAwKTt0LndyaXRlVUludDgoaHIobywxLDI1NSksaSksdC53cml0ZVVJbnQ4KGhyKHMsMSwyNTUpLGkrNjQpfXJldHVybiB0fWZ1bmN0aW9uIHFuKHI9MCxlPTApe2xldCB0PVNzKCksbj1DcygpLGk9QnMoKTtyZXR1cm4gZnVuY3Rpb24ocyl7bGV0IGEsdT1bXTtmb3IobGV0IF8gb2Ygcyl7bGV0IHY9WihfKSxxPXYucmVhZFVJbnQ4KDApLEE9di5yZWFkVUludDgoMSk8PDE2fHYucmVhZFVJbnQ4KDIpPDw4fHYucmVhZFVJbnQ4KDMpLGo9di5yZWFkVUludDgoNCksWT12LnJlYWRVSW50OCg1KSxHZT12LnJlYWRVSW50OCg2KSo4fHxyLEllPXYucmVhZFVJbnQ4KDcpKjh8fGU7dj12LnNsaWNlKDgpO2xldCBBZT0wO2lmKGo+PTY0JiZqPD0xMjcmJihBZT12LnJlYWRVSW50MTZCRSgwKSx2PXYuc2xpY2UoNCkpLFk+PTEyOCYmQT09PTApe2xldCBvaT12LnJlYWRVSW50OCgxKSxBdD12LnJlYWRVSW50MTZCRSgyKSx1YT12LnNsaWNlKDQsNCtBdCk7YT17dHlwZVNwZWNpZmljOnEsdHlwZTpqLHdpZHRoOkdlLGhlaWdodDpJZSxEUkk6QWUscHJlY2lzaW9uOm9pLHFUYWJsZTp1YX0sdj12LnNsaWNlKDQrQXQpfWVsc2UgaWYoWTwxMjgmJkE9PT0wKXtsZXQgQXQ9THMoWSk7YT17dHlwZVNwZWNpZmljOnEsdHlwZTpqLHdpZHRoOkdlLGhlaWdodDpJZSxEUkk6QWUscHJlY2lzaW9uOjAscVRhYmxlOkF0fX11LnB1c2godil9aWYoYT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJubyBxdWFudGl6YXRpb24gaGVhZGVyIHByZXNlbnRcIik7bGV0e3ByZWNpc2lvbjpmLHFUYWJsZTpsLHR5cGU6ZCx3aWR0aDpoLGhlaWdodDptfT1hLGI9UnMoZixsKSx5PWEuRFJJPT09MD9CdWZmZXIuYWxsb2MoMCk6TXMoYS5EUkkpLHc9VHMoaCxtLGQpO3JldHVybntzaXplOnt3aWR0aDpoLGhlaWdodDptfSxkYXRhOkJ1ZmZlci5jb25jYXQoW3QsYix5LHcsbixpLC4uLnVdKX19fXZhciBJcz1DKE4oKSk7dmFyIGx0PWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3Rvcigpe2xldCBlLHQ9W10sbixpPW5ldyBJcy5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtOmZ1bmN0aW9uKG8scyxhKXtpZihvLnR5cGU9PT01KXtsZXQgdT1vLnNkcC5tZWRpYS5maW5kKGY9PmYudHlwZT09PVwidmlkZW9cIiYmZi5ydHBtYXAhPT12b2lkIDAmJmYucnRwbWFwLmVuY29kaW5nTmFtZT09PVwiSlBFR1wiKTtpZih1IT09dm9pZCAwJiZ1LnJ0cG1hcCE9PXZvaWQgMCl7ZT1OdW1iZXIodS5ydHBtYXAucGF5bG9hZFR5cGUpO2xldCBmPXUuZnJhbWVzaXplO2lmKGYhPT12b2lkIDApe2xldFtsLGRdPWY7bj1xbihsLGQpfWVsc2Ugbj1xbigpfWEodm9pZCAwLG8pfWVsc2UgaWYoby50eXBlPT09MiYmTyhvLmRhdGEpPT09ZSl7aWYodC5wdXNoKG8uZGF0YSksY2Uoby5kYXRhKSYmdC5sZW5ndGg+MCl7bGV0IHU9bih0KTt0aGlzLnB1c2goe3RpbWVzdGFtcDpIKG8uZGF0YSksbnRwVGltZXN0YW1wOm8ubnRwVGltZXN0YW1wLHBheWxvYWRUeXBlOk8oby5kYXRhKSxkYXRhOnUuZGF0YSxmcmFtZXNpemU6dS5zaXplLHR5cGU6MTB9KSx0PVtdfWEoKX1lbHNlIGEodm9pZCAwLG8pfX0pO3N1cGVyKGkpfX07YygpO3ZhciBqbj1DKGxlKCkpO3ZhciBBcz1DKE4oKSk7dmFyIFJjPTIyNWU2LG1yPWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3Rvcih0PVJjKXtsZXQgbj1uZXcgQXMuVHJhbnNmb3JtKHtvYmplY3RNb2RlOiEwLHRyYW5zZm9ybTooaSxvLHMpPT57dGhpcy5fYWN0aXZlJiZpLnR5cGU9PT04JiZpLnRyYWNrcyE9PXZvaWQgMCYmKHRoaXMuX2NhcHR1cmU9ITApLHRoaXMuX2NhcHR1cmUmJmkudHlwZT09PTgmJih0aGlzLl9idWZmZXJPZmZzZXQ8dGhpcy5fYnVmZmVyLmJ5dGVMZW5ndGgtaS5kYXRhLmJ5dGVMZW5ndGg/KGkuZGF0YS5jb3B5KHRoaXMuX2J1ZmZlcix0aGlzLl9idWZmZXJPZmZzZXQpLHRoaXMuX2J1ZmZlck9mZnNldCs9aS5kYXRhLmJ5dGVMZW5ndGgpOnRoaXMuc3RvcCgpKSxzKHZvaWQgMCxpKX19KTtuLm9uKFwiZmluaXNoXCIsKCk9Pnt0aGlzLnN0b3AoKX0pO3N1cGVyKG4pO3RoaXMuX2J1ZmZlcj1CdWZmZXIuYWxsb2NVbnNhZmUoMCksdGhpcy5fYnVmZmVyU2l6ZT10LHRoaXMuX2J1ZmZlck9mZnNldD0wLHRoaXMuX2FjdGl2ZT0hMSx0aGlzLl9jYXB0dXJlPSExLHRoaXMuX2NhcHR1cmVDYWxsYmFjaz0oKT0+e319c3RhcnQodCl7dGhpcy5fYWN0aXZlfHwoKDAsam4uZGVmYXVsdCkoXCJtc2w6Y2FwdHVyZTpzdGFydFwiKSh0KSx0aGlzLl9jYXB0dXJlQ2FsbGJhY2s9dCx0aGlzLl9idWZmZXI9QnVmZmVyLmFsbG9jVW5zYWZlKHRoaXMuX2J1ZmZlclNpemUpLHRoaXMuX2J1ZmZlck9mZnNldD0wLHRoaXMuX2FjdGl2ZT0hMCl9c3RvcCgpe2lmKHRoaXMuX2FjdGl2ZSl7KDAsam4uZGVmYXVsdCkoXCJtc2w6Y2FwdHVyZTpzdG9wXCIpKGBjYXB0dXJlZCBieXRlczogJHt0aGlzLl9idWZmZXJPZmZzZXR9YCk7dHJ5e3RoaXMuX2NhcHR1cmVDYWxsYmFjayh0aGlzLl9idWZmZXIuc2xpY2UoMCx0aGlzLl9idWZmZXJPZmZzZXQpKX1jYXRjaCh0KXtjb25zb2xlLmVycm9yKHQpfXRoaXMuX2J1ZmZlcj1CdWZmZXIuYWxsb2NVbnNhZmUoMCksdGhpcy5fYnVmZmVyT2Zmc2V0PTAsdGhpcy5fYWN0aXZlPSExLHRoaXMuX2NhcHR1cmU9ITF9fX07YygpO3ZhciBZbj1DKGxlKCkpO2MoKTt2YXIgV249TWF0aC5wb3coMiwzMiksJD1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLmJ5dGVMZW5ndGg9ZX19LHRlPWNsYXNzIGV4dGVuZHMgJHtjb25zdHJ1Y3Rvcih0PTApe3N1cGVyKHQpO3RoaXMuY29weT0odCxuKT0+e3QuZmlsbCgwLG4sbit0aGlzLmJ5dGVMZW5ndGgpfX1sb2FkKCl7fX0sUmU9Y2xhc3MgZXh0ZW5kcyAke2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQubGVuZ3RoKTt0aGlzLmNvcHk9KHQsbik9Pntmb3IobGV0IGk9MDtpPHRoaXMuYnl0ZUxlbmd0aDtpKz0xKXRbbitpXT10aGlzLnZhbHVlLmNoYXJDb2RlQXQoaSl9O3RoaXMubG9hZD0odCxuKT0+e3RoaXMudmFsdWU9dC5zbGljZShuLG4rdGhpcy5ieXRlTGVuZ3RoKS50b1N0cmluZyhcImFzY2lpXCIpfTt0aGlzLnZhbHVlPXR9fSxrPWNsYXNzIGV4dGVuZHMgJHtjb25zdHJ1Y3Rvcih0PTApe3N1cGVyKDEpO3RoaXMuY29weT0odCxuKT0+e3Qud3JpdGVVSW50OCh0aGlzLnZhbHVlLG4pfTt0aGlzLmxvYWQ9KHQsbik9Pnt0aGlzLnZhbHVlPXQucmVhZFVJbnQ4KG4pfTt0aGlzLnZhbHVlPXR9fSxMdD1jbGFzcyBleHRlbmRzICR7Y29uc3RydWN0b3IodCl7c3VwZXIodC5sZW5ndGgpO3RoaXMuY29weT0odCxuKT0+e2ZvcihsZXQgaT0wO2k8dGhpcy52YWx1ZS5sZW5ndGg7KytpKXQud3JpdGVVSW50OCh0aGlzLnZhbHVlW2ldLG4raSl9O3RoaXMubG9hZD0odCxuKT0+e2ZvcihsZXQgaT0wO2k8dGhpcy52YWx1ZS5sZW5ndGg7KytpKXRoaXMudmFsdWVbaV09dC5yZWFkVUludDgobitpKX07dGhpcy52YWx1ZT10fX0sTD1jbGFzcyBleHRlbmRzICR7Y29uc3RydWN0b3IodD0wKXtzdXBlcigyKTt0aGlzLmNvcHk9KHQsbik9Pnt0LndyaXRlVUludDE2QkUodGhpcy52YWx1ZSxuKX07dGhpcy5sb2FkPSh0LG4pPT57dGhpcy52YWx1ZT10LnJlYWRVSW50MTZCRShuKX07dGhpcy52YWx1ZT10fX0sJG49Y2xhc3MgZXh0ZW5kcyAke2NvbnN0cnVjdG9yKHQ9MCl7c3VwZXIoMyk7dGhpcy5jb3B5PSh0LG4pPT57dC53cml0ZVVJbnQ4KHRoaXMudmFsdWU+PjE2JjI1NSxuKSx0LndyaXRlVUludDgodGhpcy52YWx1ZT4+OCYyNTUsbisxKSx0LndyaXRlVUludDgodGhpcy52YWx1ZSYyNTUsbisyKX07dGhpcy5sb2FkPSh0LG4pPT57dGhpcy52YWx1ZT10LnJlYWRVSW50OChuKTw8MTYrdC5yZWFkVUludDgobisxKTw8OCt0LnJlYWRVSW50OChuKzIpfTt0aGlzLnZhbHVlPXR9fSxHbj1jbGFzcyBleHRlbmRzICR7Y29uc3RydWN0b3IodCl7c3VwZXIodC5sZW5ndGgqMik7dGhpcy5jb3B5PSh0LG4pPT57Zm9yKGxldCBpPTA7aTx0aGlzLnZhbHVlLmxlbmd0aDsrK2kpdC53cml0ZVVJbnQxNkJFKHRoaXMudmFsdWVbaV0sbisyKmkpfTt0aGlzLmxvYWQ9KHQsbik9Pntmb3IobGV0IGk9MDtpPHRoaXMudmFsdWUubGVuZ3RoOysraSl0aGlzLnZhbHVlW2ldPXQucmVhZFVJbnQxNkJFKG4rMippKX07dGhpcy52YWx1ZT10fX0sZz1jbGFzcyBleHRlbmRzICR7Y29uc3RydWN0b3IodD0wKXtzdXBlcig0KTt0aGlzLmNvcHk9KHQsbik9Pnt0LndyaXRlVUludDMyQkUodGhpcy52YWx1ZSxuKX07dGhpcy5sb2FkPSh0LG4pPT57dGhpcy52YWx1ZT10LnJlYWRVSW50MzJCRShuKX07dGhpcy52YWx1ZT10fX0sZHQ9Y2xhc3MgZXh0ZW5kcyAke2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQubGVuZ3RoKjQpO3RoaXMuY29weT0odCxuKT0+e2ZvcihsZXQgaT0wO2k8dGhpcy52YWx1ZS5sZW5ndGg7KytpKXQud3JpdGVVSW50MzJCRSh0aGlzLnZhbHVlW2ldLG4rNCppKX07dGhpcy5sb2FkPSh0LG4pPT57Zm9yKGxldCBpPTA7aTx0aGlzLnZhbHVlLmxlbmd0aDsrK2kpdGhpcy52YWx1ZVtpXT10LnJlYWRVSW50MzJCRShuKzQqaSl9O3RoaXMudmFsdWU9dH19LFZuPWNsYXNzIGV4dGVuZHMgJHtjb25zdHJ1Y3Rvcih0PTApe3N1cGVyKDgpO3RoaXMuY29weT0odCxuKT0+e2xldCBpPXRoaXMudmFsdWUvV258MCxvPXRoaXMudmFsdWUtaSpXbjt0LndyaXRlVUludDMyQkUoaSxuKSx0LndyaXRlVUludDMyQkUobyxuKzQpfTt0aGlzLmxvYWQ9KHQsbik9PntsZXQgaT10LnJlYWRVSW50MzJCRShuKSxvPXQucmVhZFVJbnQzMkJFKG4rNCk7dGhpcy52YWx1ZT1pKlduK299O3RoaXMudmFsdWU9dH19LEZzPWZ1bmN0aW9uKHI9MCl7cmV0dXJuIGNsYXNzIGV4dGVuZHMgJHtjb25zdHJ1Y3RvcihuKXtzdXBlcigwKTt0aGlzLmNvcHk9KG4saSk9PntsZXQgbz0wO2ZvcihsZXQgcyBvZiB0aGlzLnZhbHVlKXMuY29weShuLGkrbyksbys9cy5ieXRlTGVuZ3RofTt0aGlzLmxvYWQ9KCk9Pnt9O3RoaXMudmFsdWU9bi5yZWR1Y2UoKGksbyk9PmkuY29uY2F0KG5ldyBMKG8ubGVuZ3RoKSxuZXcgTHQobykpLFtuZXcgayhyfG4ubGVuZ3RoKV0pLHRoaXMuYnl0ZUxlbmd0aD10aGlzLnZhbHVlLnJlZHVjZSgoaSxvKT0+aStvLmJ5dGVMZW5ndGgsMCl9fX0sUHM9e2Z0eXA6e2NvbnRhaW5lcjpcImZpbGVcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITAsYm9keTpbW1wibWFqb3JfYnJhbmRcIixSZSxcImlzb21cIl0sW1wibWlub3JfdmVyc2lvblwiLGcsMF0sW1wiY29tcGF0aWJsZV9icmFuZHNcIixSZSxcIm1wNDFcIl1dfSxtb292Ontjb250YWluZXI6XCJmaWxlXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwfSxtZGF0Ontjb250YWluZXI6XCJmaWxlXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5OlwiYW55XCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W119LG12aGQ6e2NvbnRhaW5lcjpcIm1vb3ZcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcImNyZWF0aW9uX3RpbWVcIixnLDBdLFtcIm1vZGlmaWNhdGlvbl90aW1lXCIsZywwXSxbXCJ0aW1lc2NhbGVcIixnLDFlM10sW1wiZHVyYXRpb25cIixnLDQyOTQ5NjcyOTVdLFtcInJhdGVcIixnLDY1NTM2XSxbXCJ2b2x1bWVcIixMLDI1Nl0sW1wicmVzZXJ2ZWRcIix0ZSwxMF0sW1wibWF0cml4XCIsZHQsWzY1NTM2LDAsMCwwLDY1NTM2LDAsMCwwLDEwNzM3NDE4MjRdXSxbXCJwcmVfZGVmaW5lZFwiLHRlLDI0XSxbXCJuZXh0X3RyYWNrX0lEXCIsZyw0Mjk0OTY3Mjk1XV19LHRyYWs6e2NvbnRhaW5lcjpcIm1vb3ZcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmUrXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwfSx0a2hkOntjb250YWluZXI6XCJ0cmFrXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxjb25maWc6e2ZsYWdzOjN9LGJvZHk6W1tcImNyZWF0aW9uX3RpbWVcIixnLDBdLFtcIm1vZGlmaWNhdGlvbl90aW1lXCIsZywwXSxbXCJ0cmFja19JRFwiLGcsMV0sW1wicmVzZXJ2ZWRcIix0ZSw0XSxbXCJkdXJhdGlvblwiLGcsMF0sW1wicmVzZXJ2ZWQyXCIsdGUsOF0sW1wibGF5ZXJcIixMLDBdLFtcImFsdGVybmF0ZV9ncm91cFwiLEwsMF0sW1widm9sdW1lXCIsTCwyNTZdLFtcInJlc2VydmVkM1wiLHRlLDJdLFtcIm1hdHJpeFwiLGR0LFs2NTUzNiwwLDAsMCw2NTUzNiwwLDAsMCwxMDczNzQxODI0XV0sW1wid2lkdGhcIixnLDBdLFtcImhlaWdodFwiLGcsMF1dfSx0cmVmOntjb250YWluZXI6XCJ0cmFrXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lLVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMX0sbWRpYTp7Y29udGFpbmVyOlwidHJha1wiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMH0sbWRoZDp7Y29udGFpbmVyOlwibWRpYVwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1wiY3JlYXRpb25fdGltZVwiLGcsMF0sW1wibW9kaWZpY2F0aW9uX3RpbWVcIixnLDBdLFtcInRpbWVzY2FsZVwiLGcsMWUzXSxbXCJkdXJhdGlvblwiLGcsNDI5NDk2NzI5NV0sW1wibGFuZ3VhZ2VcIixMLDBdLFtcInByZV9kZWZpbmVkXCIsTCwwXV19LGhkbHI6e2NvbnRhaW5lcjpcIm1kaWFcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcInByZWRlZmluZWRcIixnLDBdLFtcImhhbmRsZXJfdHlwZVwiLFJlLFwidmlkZVwiXSxbXCJyZXNlcnZlZFwiLHRlLDEyXSxbXCJuYW1lXCIsUmUsXCJWaWRlb0hhbmRsZXJcXDBcIl1dfSxtaW5mOntjb250YWluZXI6XCJtZGlhXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwfSx2bWhkOntjb250YWluZXI6XCJtaW5mXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxjb25maWc6e2ZsYWdzOjF9LGJvZHk6W1tcImdyYXBoaWNzbW9kZVwiLEwsMF0sW1wib3Bjb2xvclwiLEduLFswLDAsMF1dXX0sc21oZDp7Y29udGFpbmVyOlwibWluZlwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1wiYmFsYW5jZVwiLEwsMF0sW1wicmVzZXJ2ZWRcIixMXV19LGRpbmY6e2NvbnRhaW5lcjpcIm1pbmZcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITB9LGRyZWY6e2NvbnRhaW5lcjpcImRpbmZcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiEwLGJvZHk6W1tcImVudHJ5X2NvdW50XCIsZywwXV19LFwidXJsIFwiOntjb250YWluZXI6XCJkcmVmXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lK1wiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsY29uZmlnOntmbGFnczoxfSxib2R5OltdfSxzdGJsOntjb250YWluZXI6XCJtaW5mXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwfSxzdHRzOntjb250YWluZXI6XCJzdGJsXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJlbnRyeV9jb3VudFwiLGcsMF1dfSxzdHNkOntjb250YWluZXI6XCJzdGJsXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMCxib2R5OltbXCJlbnRyeV9jb3VudFwiLGcsMV1dfSxhdmMxOntjb250YWluZXI6XCJzdHNkXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwLGJvZHk6W1tcInJlc2VydmVkXCIsdGUsNl0sW1wiZGF0YV9yZWZlcmVuY2VfaW5kZXhcIixMLDFdLFtcInByZV9kZWZpbmVkXCIsTCwwXSxbXCJyZXNlcnZlZDJcIix0ZSwyXSxbXCJwcmVfZGVmaW5lZDJcIixkdCxbMCwwLDBdXSxbXCJ3aWR0aFwiLEwsMTkyMF0sW1wiaGVpZ2h0XCIsTCwxMDgwXSxbXCJob3JpenJlc29sdXRpb25cIixnLDQ3MTg1OTJdLFtcInZlcnRyZXNvbHV0aW9uXCIsZyw0NzE4NTkyXSxbXCJyZXNlcnZlZDNcIixnLDBdLFtcImZyYW1lX2NvdW50XCIsTCwxXSxbXCJjb21wcmVzc29ybmFtZVwiLEx0LEJ1ZmZlci5hbGxvYygzMildLFtcImRlcHRoXCIsTCwyNF0sW1wicHJlX2RlZmluZWQzXCIsTCw2NTUzNV1dfSxhdmNDOntjb250YWluZXI6XCJhdmMxXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcImNvbmZpZ3VyYXRpb25WZXJzaW9uXCIsaywxXSxbXCJBVkNQcm9maWxlSW5kaWNhdGlvblwiLGssNzddLFtcInByb2ZpbGVfY29tcGF0aWJpbGl0eVwiLGssMF0sW1wiQVZDTGV2ZWxJbmRpY2F0aW9uXCIsayw0MV0sW1wibGVuZ3RoU2l6ZU1pbnVzT25lXCIsaywyNTVdLFtcInNlcXVlbmNlUGFyYW1ldGVyU2V0c1wiLEZzKDIyNCksW11dLFtcInBpY3R1cmVQYXJhbWV0ZXJTZXRzXCIsRnMoKSxbXV1dfSxtcDRhOntjb250YWluZXI6XCJzdHNkXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwLGJvZHk6W1tcInJlc2VydmVkXCIsdGUsNl0sW1wiZGF0YV9yZWZlcmVuY2VfaW5kZXhcIixMLDFdLFtcInJlc2VydmVkMlwiLGR0LFswLDBdXSxbXCJjaGFubmVsY291bnRcIixMLDJdLFtcInNhbXBsZXNpemVcIixMLDE2XSxbXCJwcmVfZGVmaW5lZFwiLEwsMF0sW1wicmVzZXJ2ZWQzXCIsTCwwXSxbXCJzYW1wbGVyYXRlXCIsZywwXV19LGVzZHM6e2NvbnRhaW5lcjpcIm1wNGFcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcIkVTX0Rlc2NyVGFnXCIsaywzXSxbXCJFU19EZXNjckxlbmd0aFwiLGssMjVdLFtcIkVTX0lEXCIsTCwxXSxbXCJmbGFnc0FuZFN0cmVhbVByaW9yaXR5XCIsaywwXSxbXCJEZWNvZGVyQ29uZmlnRGVzY3JUYWdcIixrLDRdLFtcIkRlY29kZXJDb25maWdEZXNjckxlbmd0aFwiLGssMTddLFtcIm9iamVjdFByb2ZpbGVJbmRpY2F0aW9uXCIsayw2NF0sW1wic3RyZWFtVHlwZVVwc3RyZWFtUmVzZXJ2ZWRcIixrLDIxXSxbXCJidWZmZXJTaXplREJcIixMdCxbMCwwLDBdXSxbXCJtYXhCaXRSYXRlXCIsZywwXSxbXCJhdmdCaXRSYXRlXCIsZywwXSxbXCJEZWNTcGVjaWZpY0luZm9TaG9ydFRhZ1wiLGssNV0sW1wiRGVjU3BlY2lmaWNJbmZvU2hvcnRMZW5ndGhcIixrLDJdLFtcImF1ZGlvQ29uZmlnQnl0ZXNcIixMLDBdLFtcIlNMQ29uZmlnRGVzY3JUYWdcIixrLDZdLFtcIlNMQ29uZmlnRGVzY3JMZW5ndGhcIixrLDFdLFtcIlNMQ29uZmlnRGVzY3JQcmVkZWZpbmVkXCIsaywyXV19LHN0c3o6e2NvbnRhaW5lcjpcInN0YmxcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcInNhbXBsZV9zaXplXCIsZywwXSxbXCJzYW1wbGVfY291bnRcIixnLDBdXX0sc3RzYzp7Y29udGFpbmVyOlwic3RibFwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1wiZW50cnlfY291bnRcIixnLDBdXX0sc3Rjbzp7Y29udGFpbmVyOlwic3RibFwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1wiZW50cnlfY291bnRcIixnLDBdXX0sc3Rzczp7Y29udGFpbmVyOlwic3RibFwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZS1cIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcImVudHJ5X2NvdW50XCIsZywwXV19LGVkdHM6e2NvbnRhaW5lcjpcInRyYWtcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJvbmUtXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwfSxlbHN0Ontjb250YWluZXI6XCJlZHRzXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lLVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1wiZW50cnlfY291bnRcIixnLDFdLFtcInNlZ21lbnRfZHVyYXRpb25cIixnLDBdLFtcIm1lZGlhX3RpbWVcIixnLDQyOTQ5NjcyOTVdLFtcIm1lZGlhX3JhdGVfaW50ZWdlclwiLEwsMV0sW1wibWVkaWFfcmF0ZV9mcmFjdGlvblwiLEwsMF1dfSxtdmV4Ontjb250YWluZXI6XCJtb292XCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lLVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMH0sbWVoZDp7Y29udGFpbmVyOlwibXZleFwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZS1cIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcImZyYWdtZW50X2R1cmF0aW9uXCIsZywwXV19LHRyZXg6e2NvbnRhaW5lcjpcIm12ZXhcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmUrXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJ0cmFja19JRFwiLGcsMV0sW1wiZGVmYXVsdF9zYW1wbGVfZGVzY3JpcHRpb25faW5kZXhcIixnLDFdLFtcImRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uXCIsZywwXSxbXCJkZWZhdWx0X3NhbXBsZV9zaXplXCIsZywwXSxbXCJkZWZhdWx0X3NhbXBsZV9mbGFnc1wiLGcsMF1dfSxtb29mOntjb250YWluZXI6XCJmaWxlXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5OlwiemVybytcIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITF9LG1maGQ6e2NvbnRhaW5lcjpcIm1vb2ZcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcInNlcXVlbmNlX251bWJlclwiLGcsMF1dfSx0cmFmOntjb250YWluZXI6XCJtb29mXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5OlwiemVybytcIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITB9LHRmaGQ6e2NvbnRhaW5lcjpcInRyYWZcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGNvbmZpZzp7ZmxhZ3M6MzJ9LGJvZHk6W1tcInRyYWNrX0lEXCIsZywxXSxbXCJkZWZhdWx0X3NhbXBsZV9mbGFnc1wiLGcsMF1dfSx0ZmR0Ontjb250YWluZXI6XCJ0cmFmXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lLVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsY29uZmlnOnt2ZXJzaW9uOjF9LGJvZHk6W1tcImJhc2VNZWRpYURlY29kZVRpbWVcIixWbiwwXV19LHRydW46e2NvbnRhaW5lcjpcInRyYWZcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJ6ZXJvK1wiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsY29uZmlnOntmbGFnczo3NzN9LGJvZHk6W1tcInNhbXBsZV9jb3VudFwiLGcsMV0sW1wiZGF0YV9vZmZzZXRcIixnLDBdLFtcImZpcnN0X3NhbXBsZV9mbGFnc1wiLGcsMF0sW1wic2FtcGxlX2R1cmF0aW9uXCIsZywwXSxbXCJzYW1wbGVfc2l6ZVwiLGcsMF1dfSxcIi4uLi5cIjp7Ym94OlwiQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W119LGZpbGU6e2JveDpcIk5vbmVcIixpc19jb250YWluZXI6ITAsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCJ9fSx6bj1jbGFzc3tzdGF0aWMgTm9uZSgpe3JldHVybltdfXN0YXRpYyBCb3goZSl7cmV0dXJuW1tcInNpemVcIixnLDBdLFtcInR5cGVcIixSZSxlXV19c3RhdGljIEZ1bGxCb3goZSl7cmV0dXJuW10uY29uY2F0KHRoaXMuQm94KGUpLFtbXCJ2ZXJzaW9uXCIsaywwXSxbXCJmbGFnc1wiLCRuLDBdXSl9fSxUPWNsYXNzIGV4dGVuZHMgJHtjb25zdHJ1Y3Rvcih0LG4pe3N1cGVyKDApO3RoaXMudHlwZT10O2xldCBpPVBzW3RoaXMudHlwZV07aWYoaT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gYm94IHR5cGU6ICR7dH1gKTt0aGlzLmNvbmZpZz1PYmplY3QuYXNzaWduKHt9LGkuY29uZmlnLG4pO2xldCBvPXpuW2kuYm94XSh0aGlzLnR5cGUpLHM9aS5ib2R5fHxbXTt0aGlzLnN0cnVjdD1uZXcgTWFwO2xldCBhPTA7Zm9yKGxldFt1LGYsbF1vZltdLmNvbmNhdChvLHMpKXtpZih0aGlzLmhhcyh1KSl0aHJvdyBuZXcgRXJyb3IoXCJUcnlpbmcgdG8gYWRkIGV4aXN0aW5nIGtleVwiKTtsZXQgZD1sO3RoaXMuY29uZmlnW3VdJiYoZD10aGlzLmNvbmZpZ1t1XSk7bGV0IGg9bmV3IGYoZCk7dGhpcy5zdHJ1Y3Quc2V0KHUse29mZnNldDphLGVsZW1lbnQ6aH0pLGErPWguYnl0ZUxlbmd0aH10aGlzLmJ5dGVMZW5ndGg9YX1lbGVtZW50KHQpe2xldCBuPXRoaXMuc3RydWN0LmdldCh0KTtpZihuPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcImludmFsaWQga2V5XCIpO3JldHVybiBuLmVsZW1lbnR9c2V0KHQsbil7dGhpcy5lbGVtZW50KHQpLnZhbHVlPW59Z2V0KHQpe3JldHVybiB0aGlzLmVsZW1lbnQodCkudmFsdWV9b2Zmc2V0KHQpe2xldCBuPXRoaXMuc3RydWN0LmdldCh0KTtpZihuPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcImludmFsaWQga2V5XCIpO3JldHVybiBuLm9mZnNldH1oYXModCl7cmV0dXJuIHRoaXMuc3RydWN0Lmhhcyh0KX1hZGQodCxuKXtpZih0aGlzLmhhcyh0KSl0aHJvdyBuZXcgRXJyb3IoXCJUcnlpbmcgdG8gYWRkIGV4aXN0aW5nIGtleVwiKTtyZXR1cm4gdGhpcy5zdHJ1Y3Quc2V0KHQse29mZnNldDp0aGlzLmJ5dGVMZW5ndGgsZWxlbWVudDpufSksdGhpcy5ieXRlTGVuZ3RoKz1uLmJ5dGVMZW5ndGgsdGhpc31idWZmZXIoKXtsZXQgdD1CdWZmZXIuYWxsb2NVbnNhZmUodGhpcy5ieXRlTGVuZ3RoKTtyZXR1cm4gdGhpcy5jb3B5KHQpLHR9Y29weSh0LG49MCl7dGhpcy5zZXQoXCJzaXplXCIsdGhpcy5ieXRlTGVuZ3RoKTtmb3IobGV0IGkgb2YgdGhpcy5zdHJ1Y3QudmFsdWVzKCkpaS5lbGVtZW50LmNvcHkodCxuK2kub2Zmc2V0KX1sb2FkKHQsbj0wKXtmb3IobGV0IGkgb2YgdGhpcy5zdHJ1Y3QudmFsdWVzKCkpaS5lbGVtZW50LmxvYWQhPT12b2lkIDAmJmkuZWxlbWVudC5sb2FkKHQsbitpLm9mZnNldCl9Zm9ybWF0KHQ9MCl7bGV0IG49W1wiIFwiLnJlcGVhdCh0KStgWyR7dGhpcy50eXBlfV0gKCR7dGhpcy5ieXRlTGVuZ3RofSlgXTtmb3IobGV0W2ksb11vZiB0aGlzLnN0cnVjdCl7bGV0IHM9by5lbGVtZW50O3MuZm9ybWF0IT09dm9pZCAwP24ucHVzaChzLmZvcm1hdCh0KzIpKTpuLnB1c2goXCIgXCIucmVwZWF0KHQrMikrYCR7aX0gPSAke3MudmFsdWV9ICgke3MuYnl0ZUxlbmd0aH0pYCl9cmV0dXJuIG4uam9pbihgXG5gKX1wcmludCh0KXtjb25zb2xlLndhcm4odGhpcy5mb3JtYXQodCkpfX0sVT1jbGFzcyBleHRlbmRzIFR7Y29uc3RydWN0b3IodCxuLC4uLmkpe3N1cGVyKHQsbik7dGhpcy5ib3hTaXplPTAsdGhpcy5hcHBlbmQoLi4uaSl9YXBwZW5kKC4uLnQpe2ZvcihsZXQgbiBvZiB0KXRoaXMuYWRkKGBib3hfJHt0aGlzLmJveFNpemUrK31gLG4pO3JldHVybiB0aGlzfXBhcnNlKHQpe2xldCBuPVtdO2Zvcig7dC5ieXRlTGVuZ3RoPjA7KXtsZXQgaT1uZXcgUmUoXCIuLi4uXCIpO2kubG9hZCh0LDQpO2xldCBvPWkudmFsdWUscz1Qc1tvXSxhO2lmKHMhPT12b2lkIDApe2lmKHMuaXNfY29udGFpbmVyKXthPW5ldyBVKG8pLGEubG9hZCh0KTtsZXQgdT1hLnBhcnNlKHQuc2xpY2UoYS5ieXRlTGVuZ3RoLGEuZ2V0KFwic2l6ZVwiKSkpO24ucHVzaCguLi51KX1lbHNlIGlmKGE9bmV3IFQobyksYS5sb2FkKHQpLG89PT1cImF2Y0NcIil7bGV0IHU9YS5lbGVtZW50KFwiQVZDUHJvZmlsZUluZGljYXRpb25cIikudmFsdWUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsMCksZj1hLmVsZW1lbnQoXCJwcm9maWxlX2NvbXBhdGliaWxpdHlcIikudmFsdWUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsMCksbD1hLmVsZW1lbnQoXCJBVkNMZXZlbEluZGljYXRpb25cIikudmFsdWUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsMCk7bi5wdXNoKHt0eXBlOlwidmlkZW9cIixtaW1lOmBhdmMxLiR7dX0ke2Z9JHtsfWB9KX1lbHNlIGlmKG89PT1cImVzZHNcIil7bGV0IGY9YS5lbGVtZW50KFwiYXVkaW9Db25maWdCeXRlc1wiKS52YWx1ZT4+PjExJjMxO24ucHVzaCh7dHlwZTpcImF1ZGlvXCIsbWltZTpgbXA0YS40MC4ke2Z9YH0pfX1lbHNlIGE9bmV3IFQoXCIuLi4uXCIpLGEubG9hZCh0KSxhLnR5cGU9YS5nZXQoXCJ0eXBlXCIpO3RoaXMuYXBwZW5kKGEpLHQ9dC5zbGljZShhLmdldChcInNpemVcIikpfXJldHVybiBufX07YygpO2MoKTt2YXIgVGM9ezE6XCJBQUMgTWFpblwiLDI6XCJBQUMgTENcIn0sQ2M9ezA6XCI5NiBrSHpcIiwxOlwiODguMiBrSHpcIiwyOlwiNjQga0h6XCIsMzpcIjQ4IGtIelwiLDQ6XCI0NC4xIGtIelwiLDU6XCIzMiBrSHpcIiw2OlwiMjQga0h6XCIsNzpcIjIyLjA1IGtIelwiLDg6XCIxNiBrSHpcIiw5OlwiMTIga0h6XCIsMTA6XCIxMS4wMjUga0h6XCIsMTE6XCI4IGtIelwiLDEyOlwiNy4zNSBrSHpcIn0sQmM9ezE6XCJNb25vXCIsMjpcIlN0ZXJlb1wifSxNYz1yPT57bGV0IGU9cj4+PjExJjMxLHQ9cj4+PjcmMTUsbj1yPj4+MyYxNSxpPVRjW2VdfHxgQUFDICgke2V9KWAsbz1DY1t0XXx8XCJ1bmtub3duXCIscz1CY1tuXXx8bi50b1N0cmluZygpO3JldHVybntjb2Rpbmc6aSxzYW1wbGluZ1JhdGU6byxjaGFubmVsczpzfX0sa3M9KHIsZSx0KT0+e2xldCBuPU51bWJlcihyLmZtdHAucGFyYW1ldGVycy5iaXRyYXRlKXx8MzJlNCxpPXBhcnNlSW50KHIuZm10cC5wYXJhbWV0ZXJzLmNvbmZpZy5zdWJzdHIoMCw0KSwxNiksbz1pPj4+MTEmMzE7cmV0dXJue3RraGQ6e3RyYWNrX0lEOnQsY3JlYXRpb25fdGltZTplLG1vZGlmaWNhdGlvbl90aW1lOmUsd2lkdGg6MCxoZWlnaHQ6MCx2b2x1bWU6MX0sbWRoZDp7dGltZXNjYWxlOk51bWJlcihyLnJ0cG1hcC5jbG9ja3JhdGUpLGNyZWF0aW9uX3RpbWU6ZSxtb2RpZmljYXRpb25fdGltZTplLGR1cmF0aW9uOjB9LGhkbHI6e2hhbmRsZXJfdHlwZTpcInNvdW5cIixuYW1lOlwiU291bmRIYW5kbGVyXFwwXCJ9LG1lZGlhSGVhZGVyQm94Om5ldyBUKFwic21oZFwiKSxzYW1wbGVFbnRyeUJveDpuZXcgVShcIm1wNGFcIix7c2FtcGxlcmF0ZTpyLnJ0cG1hcC5jbG9ja3JhdGU8PDE2Pj4+MH0sbmV3IFQoXCJlc2RzXCIse2F1ZGlvQ29uZmlnQnl0ZXM6aSxtYXhCaXRSYXRlOm4sYXZnQml0UmF0ZTpufSkpLGRlZmF1bHRGcmFtZUR1cmF0aW9uOjEwMjQsbWltZTpgbXA0YS40MC4ke299YCxjb2RlYzpNYyhpKX19O2MoKTtjKCk7ZnVuY3Rpb24gTGMocil7cmV0dXJuIHI+NjQmJnI8OTE/ci02NTpyPjk2JiZyPDEyMz9yLTcxOnI+NDcmJnI8NTg/cis0OnI9PT00Mz82MjpyPT09NDc/NjM6MH1mdW5jdGlvbiBPcyhyLGUpe2xldCB0PXIucmVwbGFjZSgvW15BLVphLXowLTkrL10vZyxcIlwiKSxuPXQubGVuZ3RoLGk9ZT9NYXRoLmNlaWwoKG4qMysxPj4yKS9lKSplOm4qMysxPj4yLG89bmV3IFVpbnQ4QXJyYXkoaSkscyxhLHU9MCxmPTA7Zm9yKGxldCBsPTA7bDxuO2wrKylpZihhPWwmMyx1fD1MYyh0LmNoYXJDb2RlQXQobCkpPDwxOC02KmEsYT09PTN8fG4tbD09PTEpe2ZvcihzPTA7czwzJiZmPGk7cysrLGYrKylvW2ZdPXU+Pj4oMTY+Pj5zJjI0KSYyNTU7dT0wfXJldHVybiBvfWMoKTtjKCk7dmFyIGdyPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuX2J1ZmZlcj1lLHRoaXMuX2RhdGFWaWV3PW5ldyBEYXRhVmlldyh0aGlzLl9idWZmZXIpLHRoaXMuX29mZnNldD0wLHRoaXMuX2JpdHBvcz0wLHRoaXMuX2J5dGU9MH1yZWFkVWludDgoZSl7cmV0dXJuIHRoaXMuX2RhdGFWaWV3LmdldFVpbnQ4KGUpfXJlYWRVaW50MTYoZSl7cmV0dXJuIHRoaXMuX2RhdGFWaWV3LmdldFVpbnQxNihlKX1yZWFkVWludDMyKGUpe3JldHVybiB0aGlzLl9kYXRhVmlldy5nZXRVaW50MzIoZSl9cmVhZE5leHQoKXtsZXQgZT10aGlzLnJlYWRVaW50OCh0aGlzLl9vZmZzZXQpO3JldHVybiB0aGlzLl9vZmZzZXQrPTEsZX1yZWFkQml0cyhlKXtpZihlPjMyfHxlPT09MCl0aHJvdyBuZXcgRXJyb3IoXCJsZW5ndGggaGFzIHRvIGJlIGJldHdlZW4gMCAtIDMxIGJpdHNcIik7bGV0IHQ9MDtmb3IobGV0IG49MTtuPD1lOysrbil0aGlzLl9iaXRwb3M9PT0wJiYodGhpcy5fYnl0ZT10aGlzLnJlYWROZXh0KCkpLHQ9dDw8MXx0aGlzLl9ieXRlPj44LSsrdGhpcy5fYml0cG9zJjEsdGhpcy5fYml0cG9zJT04O3JldHVybiB0fXJlYWRVbnNpZ25lZEV4cEdvbG9tYigpe2xldCBlPTA7Zm9yKDt0aGlzLnJlYWRCaXRzKDEpIT09MTspZSsrO2lmKGU9PT0wKXJldHVybiAwO2lmKGU+PTMxKXRocm93IG5ldyBFcnJvcihcInJlYWQgdW5zaWduZWQgZXhwb25lbnRpYWwgR29sb21iOiBpbnRlcm5hbCBlcnJvclwiKTtsZXQgdD10aGlzLnJlYWRCaXRzKGUpO3JldHVybiB0fD0xPDxlLHQtMX1yZWFkU2lnbmVkRXhwR29sb21iKCl7bGV0IGU9dGhpcy5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKTtyZXR1cm4gZSYxP2U9ZSsxPj4xOmU9LShlPj4xKSxlfXNpemUoKXtyZXR1cm4gdGhpcy5fYnVmZmVyLmJ5dGVMZW5ndGh9Z2V0VWludDhBcnJheSgpe3JldHVybiBuZXcgVWludDhBcnJheSh0aGlzLl9idWZmZXIpfWdldEFycmF5QnVmZmVyKCl7cmV0dXJuIHRoaXMuX2J1ZmZlcn19O3ZhciB5cj1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLnJlYWRlcj1uZXcgZ3IoZSl9cGFyc2UoKXt0aGlzLnJlYWRlci5yZWFkTmV4dCgpO2xldCBlPXRoaXMucmVhZGVyLnJlYWROZXh0KCk7dGhpcy5yZWFkZXIucmVhZE5leHQoKTtsZXQgdD10aGlzLnJlYWRlci5yZWFkTmV4dCgpO2lmKHRoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpLFsxMDAsMTEwLDEyMiwyNDQsNDQsODMsODYsMTE4XS5pbmNsdWRlcyhlKSl7bGV0IGI9dGhpcy5yZWFkZXIucmVhZFVuc2lnbmVkRXhwR29sb21iKCk7aWYoYj09PTMmJnRoaXMucmVhZGVyLnJlYWRCaXRzKDEpLHRoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpLHRoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpLHRoaXMucmVhZGVyLnJlYWRCaXRzKDEpLHRoaXMucmVhZGVyLnJlYWRCaXRzKDEpKWZvcihsZXQgdz0wO3c8KGIhPT0zPzg6MTIpO3crKyl0aGlzLnJlYWRlci5yZWFkQml0cygxKX10aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKTtsZXQgbj10aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKTtpZihuPT09MCl0aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKTtlbHNlIGlmKG49PT0xKXtsZXQgYj0wO3RoaXMucmVhZGVyLnJlYWRCaXRzKDEpLHRoaXMucmVhZGVyLnJlYWRTaWduZWRFeHBHb2xvbWIoKSx0aGlzLnJlYWRlci5yZWFkU2lnbmVkRXhwR29sb21iKCksYj10aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKTtmb3IobGV0IHk9MDt5PGI7eSsrKXRoaXMucmVhZGVyLnJlYWRTaWduZWRFeHBHb2xvbWIoKX10aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKSx0aGlzLnJlYWRlci5yZWFkQml0cygxKTtsZXQgaT10aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKSxvPXRoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpLHM9dGhpcy5yZWFkZXIucmVhZEJpdHMoMSk7dGhpcy5yZWFkZXIucmVhZEJpdHMoMSk7bGV0IGE9dGhpcy5yZWFkZXIucmVhZEJpdHMoMSksdT1hP3RoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpOjAsZj1hP3RoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpOjAsbD1hP3RoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpOjAsZD1hP3RoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpOjAsaD0oaSsxKSoxNi11KjItZioyLG09KDItcykqKG8rMSkqMTYtbCoyLWQqMjtyZXR1cm57cHJvZmlsZTplLGxldmVsOnQvMTAsd2lkdGg6aCxoZWlnaHQ6bX19fTt2YXIgSWM9ezY2OlwiQmFzZWxpbmVcIiw3NzpcIk1haW5cIiwxMDA6XCJIaWdoXCJ9LEFjPXI9PntsZXQgZT1wYXJzZUludChyLnN1YnN0cigwLDIpLDE2KSx0PXBhcnNlSW50KHIuc3Vic3RyKDQsMiksMTYpLG49SWNbZV18fGUudG9TdHJpbmcoKSxpPSh0LzEwKS50b0ZpeGVkKDEpO3JldHVybntjb2Rpbmc6XCJILjI2NFwiLHByb2ZpbGU6bixsZXZlbDppfX0sVXM9KHIsZSx0KT0+e2xldCBuPXIuZm10cC5wYXJhbWV0ZXJzW1wicHJvZmlsZS1sZXZlbC1pZFwiXSxpPXIuZm10cC5wYXJhbWV0ZXJzW1wic3Byb3AtcGFyYW1ldGVyLXNldHNcIl0uc3BsaXQoXCIsXCIpLm1hcChPcyksbz1pLnNsaWNlKDAsMSkscz1pLnNsaWNlKDEpLGE9bmV3IHlyKG9bMF0uYnVmZmVyKS5wYXJzZSgpLHU9MzYwMDtyZXR1cm57bWVkaWFIZWFkZXJCb3g6bmV3IFQoXCJ2bWhkXCIpLHNhbXBsZUVudHJ5Qm94Om5ldyBVKFwiYXZjMVwiLHt3aWR0aDphLndpZHRoLGhlaWdodDphLmhlaWdodH0sbmV3IFQoXCJhdmNDXCIse0FWQ1Byb2ZpbGVJbmRpY2F0aW9uOm9bMF1bMV0scHJvZmlsZV9jb21wYXRpYmlsaXR5Om9bMF1bMl0sQVZDTGV2ZWxJbmRpY2F0aW9uOm9bMF1bM10sc2VxdWVuY2VQYXJhbWV0ZXJTZXRzOm8scGljdHVyZVBhcmFtZXRlclNldHM6c30pKSx0a2hkOnt0cmFja19JRDp0LGNyZWF0aW9uX3RpbWU6ZSxtb2RpZmljYXRpb25fdGltZTplLHdpZHRoOmEud2lkdGg8PDE2LGhlaWdodDphLmhlaWdodDw8MTYsdm9sdW1lOjB9LGhkbHI6e30sbWRoZDp7dGltZXNjYWxlOnIucnRwbWFwLmNsb2NrcmF0ZSxjcmVhdGlvbl90aW1lOmUsbW9kaWZpY2F0aW9uX3RpbWU6ZSxkdXJhdGlvbjowfSxkZWZhdWx0RnJhbWVEdXJhdGlvbjpyLmZyYW1lcmF0ZSE9PXZvaWQgMCYmci5mcmFtZXJhdGU+MCYmTnVtYmVyKHIucnRwbWFwLmNsb2NrcmF0ZSkvTnVtYmVyKHIuZnJhbWVyYXRlKXx8dSxtaW1lOmBhdmMxLiR7bn1gLGNvZGVjOkFjKG4pfX07dmFyIERzPXtcIk1QRUc0LUdFTkVSSUNcIjprcyxIMjY0OlVzfSxGYz0oKT0+KHtsYXN0VGltZXN0YW1wOjAsYmFzZU1lZGlhRGVjb2RlVGltZTowLGRlZmF1bHRGcmFtZUR1cmF0aW9uOjAsY2xvY2tyYXRlOjAsYml0cmF0ZTowLGZyYW1lcmF0ZTowLGN1bXVsYXRpdmVCeXRlTGVuZ3RoOjAsY3VtdWxhdGl2ZUR1cmF0aW9uOjAsY3VtdWxhdGl2ZUZyYW1lczowfSksUGM9KHIse2J5dGVMZW5ndGg6ZSxkdXJhdGlvbjp0fSk9PntpZihyLmN1bXVsYXRpdmVCeXRlTGVuZ3RoKz1lLHIuY3VtdWxhdGl2ZUR1cmF0aW9uKz10LHIuY3VtdWxhdGl2ZUZyYW1lcysrLHIuY3VtdWxhdGl2ZUR1cmF0aW9uPj1yLmNsb2NrcmF0ZSl7bGV0IG49OCpyLmN1bXVsYXRpdmVCeXRlTGVuZ3RoLGk9ci5jdW11bGF0aXZlRnJhbWVzLG89ci5jdW11bGF0aXZlRHVyYXRpb24vci5jbG9ja3JhdGU7ci5iaXRyYXRlPW4vbyxyLmZyYW1lcmF0ZT1pL28sci5jdW11bGF0aXZlQnl0ZUxlbmd0aD0wLHIuY3VtdWxhdGl2ZUR1cmF0aW9uPTAsci5jdW11bGF0aXZlRnJhbWVzPTB9fSxicj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMudHJhY2tJZE1hcD17fSx0aGlzLnNlcXVlbmNlTnVtYmVyPTAsdGhpcy5udHBQcmVzZW50YXRpb25UaW1lPTAsdGhpcy50cmFja0RhdGE9W119dHJhayhlKXtsZXQgdD1uZXcgVShcInRyYWtcIiksbj1uZXcgVShcIm1kaWFcIiksaT1uZXcgVShcIm1pbmZcIiksbz1uZXcgVShcImRpbmZcIikscz1uZXcgVShcImRyZWZcIiksYT1uZXcgVShcInN0YmxcIik7cmV0dXJuIHMuc2V0KFwiZW50cnlfY291bnRcIiwxKSx0LmFwcGVuZChuZXcgVChcInRraGRcIixlLnRraGQpLG4uYXBwZW5kKG5ldyBUKFwibWRoZFwiLGUubWRoZCksbmV3IFQoXCJoZGxyXCIsZS5oZGxyKSxpLmFwcGVuZChlLm1lZGlhSGVhZGVyQm94LG8uYXBwZW5kKHMuYXBwZW5kKG5ldyBUKFwidXJsIFwiKSkpLGEuYXBwZW5kKG5ldyBVKFwic3RzZFwiLHZvaWQgMCxlLnNhbXBsZUVudHJ5Qm94KSxuZXcgVChcInN0dHNcIiksbmV3IFQoXCJzdHNjXCIpLG5ldyBUKFwic3Rjb1wiKSxuZXcgVChcInN0c3pcIiksbmV3IFQoXCJzdHNzXCIpKSkpKSx0fW1vb3YoZSx0KXtsZXQgbj1uZXcgVShcIm1vb3ZcIik7bi5hcHBlbmQobmV3IFQoXCJtdmhkXCIse2NyZWF0aW9uX3RpbWU6dCxtb2RpZmljYXRpb25fdGltZTp0LGR1cmF0aW9uOjB9KSk7bGV0IGk9bmV3IFUoXCJtdmV4XCIpO3RoaXMudHJhY2tJZE1hcD17fSx0aGlzLnNlcXVlbmNlTnVtYmVyPTAsdGhpcy5udHBQcmVzZW50YXRpb25UaW1lPTA7bGV0IG89MDtyZXR1cm4gdGhpcy50cmFja0RhdGE9W10sZS5tZWRpYS5mb3JFYWNoKHM9PntpZihzLnJ0cG1hcD09PXZvaWQgMClyZXR1cm47bGV0IGE9cy5ydHBtYXAucGF5bG9hZFR5cGUsdT1zLnJ0cG1hcC5lbmNvZGluZ05hbWU7aWYoRHNbdV0hPT12b2lkIDApe3RoaXMudHJhY2tJZE1hcFthXT0rK28scy50eXBlLnRvTG93ZXJDYXNlKCk9PT1cInZpZGVvXCImJih0aGlzLnZpZGVvVHJhY2tJZD1vKTtsZXQgZj1Ec1t1XShzLHQsbyk7cy5taW1lPWYubWltZSxzLmNvZGVjPWYuY29kZWM7bGV0IGw9RmMoKTtsLmNsb2NrcmF0ZT1zLnJ0cG1hcC5jbG9ja3JhdGUsbC5kZWZhdWx0RnJhbWVEdXJhdGlvbj1mLmRlZmF1bHRGcmFtZUR1cmF0aW9uLHRoaXMudHJhY2tEYXRhLnB1c2gobCk7bGV0IGQ9dGhpcy50cmFrKGYpO24uYXBwZW5kKGQpLGkuYXBwZW5kKG5ldyBUKFwidHJleFwiLHt0cmFja19JRDpvfSkpfX0pLG4uYXBwZW5kKGkpLG59bW9vZihlKXtsZXR7dHJhY2tJZDp0LHRpbWVzdGFtcDpuLGJ5dGVMZW5ndGg6aX09ZSxvPXQtMSxzPXRoaXMudHJhY2tEYXRhW29dLGE9cy5sYXN0VGltZXN0YW1wIT09MD9uLXMubGFzdFRpbWVzdGFtcHwwOnMuZGVmYXVsdEZyYW1lRHVyYXRpb24sdT1hPjA/YTpzLmRlZmF1bHRGcmFtZUR1cmF0aW9uO3MubGFzdFRpbWVzdGFtcD1hPjA/bjpzLmxhc3RUaW1lc3RhbXArdTtsZXQgZj1uZXcgVShcIm1vb2ZcIiksbD1uZXcgVShcInRyYWZcIiksZD1uZXcgVChcInRydW5cIix7c2FtcGxlX2R1cmF0aW9uOnUsc2FtcGxlX3NpemU6aSxmaXJzdF9zYW1wbGVfZmxhZ3M6NjR9KTtyZXR1cm4gZi5hcHBlbmQobmV3IFQoXCJtZmhkXCIse3NlcXVlbmNlX251bWJlcjp0aGlzLnNlcXVlbmNlTnVtYmVyKyt9KSxsLmFwcGVuZChuZXcgVChcInRmaGRcIix7dHJhY2tfSUQ6dH0pLG5ldyBUKFwidGZkdFwiLHtiYXNlTWVkaWFEZWNvZGVUaW1lOnMuYmFzZU1lZGlhRGVjb2RlVGltZX0pLGQpKSxzLmJhc2VNZWRpYURlY29kZVRpbWUrPXUsZC5zZXQoXCJkYXRhX29mZnNldFwiLGYuYnl0ZUxlbmd0aCs4KSxQYyhzLHtieXRlTGVuZ3RoOmksZHVyYXRpb246dX0pLGZ9bWRhdChlKXtsZXQgdD1uZXcgVChcIm1kYXRcIik7cmV0dXJuIHQuYWRkKFwiZGF0YVwiLGUpLHR9c2V0UHJlc2VudGF0aW9uVGltZShlLHQpe2lmKCF0aGlzLm50cFByZXNlbnRhdGlvblRpbWUmJnQmJmU9PT10aGlzLnZpZGVvVHJhY2tJZCl7bGV0IG49ZS0xLGk9dGhpcy50cmFja0RhdGFbbl07dGhpcy5udHBQcmVzZW50YXRpb25UaW1lPXQtMWUzKihpLmJhc2VNZWRpYURlY29kZVRpbWUvaS5jbG9ja3JhdGUpfX19O3ZhciBOcz1DKE4oKSk7dmFyIHB0PWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3Rvcigpe2xldCB0PW5ldyBicixuPW89Pnt0aGlzLm9uU3luYyYmdGhpcy5vblN5bmMobyl9LGk9bmV3IE5zLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm06ZnVuY3Rpb24obyxzLGEpe2lmKG8udHlwZT09PTUpe2xldCB1PU1hdGguZmxvb3IobmV3IERhdGUoKS5nZXRUaW1lKCkvMWUzKzIwODI4NTJlMyksZj1uZXcgVChcImZ0eXBcIiksbD10Lm1vb3Yoby5zZHAsdSksZD1CdWZmZXIuYWxsb2NVbnNhZmUoZi5ieXRlTGVuZ3RoK2wuYnl0ZUxlbmd0aCk7Zi5jb3B5KGQsMCksbC5jb3B5KGQsZi5ieXRlTGVuZ3RoKSwoMCxZbi5kZWZhdWx0KShcIm1zbDptcDQ6aXNvbVwiKShgZnR5cDogJHtmLmZvcm1hdCgpfWApLCgwLFluLmRlZmF1bHQpKFwibXNsOm1wNDppc29tXCIpKGBtb292OiAke2wuZm9ybWF0KCl9YCk7bGV0IGg9by5zZHAubWVkaWEubWFwKG09Pih7dHlwZTptLnR5cGUsZW5jb2Rpbmc6bS5ydHBtYXAmJm0ucnRwbWFwLmVuY29kaW5nTmFtZSxtaW1lOm0ubWltZSxjb2RlYzptLmNvZGVjfSkpO3RoaXMucHVzaCh7dHlwZTo4LGRhdGE6ZCx0cmFja3M6aCxmdHlwOmYsbW9vdjpsfSl9ZWxzZSBpZihvLnR5cGU9PT02fHxvLnR5cGU9PT03KXtsZXR7cGF5bG9hZFR5cGU6dSx0aW1lc3RhbXA6ZixudHBUaW1lc3RhbXA6bH09byxkPXQudHJhY2tJZE1hcFt1XTtpZihkKXt0Lm50cFByZXNlbnRhdGlvblRpbWV8fCh0LnNldFByZXNlbnRhdGlvblRpbWUoZCxsKSx0Lm50cFByZXNlbnRhdGlvblRpbWUmJm4odC5udHBQcmVzZW50YXRpb25UaW1lKSk7bGV0IGgsbT1vLnR5cGU9PT03P28ubmFsVHlwZT09PTU6dm9pZCAwO3QubnRwUHJlc2VudGF0aW9uVGltZSYmbSYmby5udHBUaW1lc3RhbXAhPT12b2lkIDAmJihoPShvLm50cFRpbWVzdGFtcC10Lm50cFByZXNlbnRhdGlvblRpbWUpLzFlMyk7bGV0IGI9by5kYXRhLmJ5dGVMZW5ndGgseT10Lm1vb2Yoe3RyYWNrSWQ6ZCx0aW1lc3RhbXA6ZixieXRlTGVuZ3RoOmJ9KSx3PXQubWRhdChvLmRhdGEpLF89QnVmZmVyLmFsbG9jVW5zYWZlKHkuYnl0ZUxlbmd0aCt3LmJ5dGVMZW5ndGgpO3kuY29weShfLDApLHcuY29weShfLHkuYnl0ZUxlbmd0aCksdGhpcy5wdXNoKHt0eXBlOjgsZGF0YTpfLG1vb2Y6eSxtZGF0OncsbnRwVGltZXN0YW1wOmwsY2hlY2twb2ludFRpbWU6aH0pfX1lbHNlIHRoaXMucHVzaChvKTthKCl9fSk7c3VwZXIoaSk7dGhpcy5ib3hCdWlsZGVyPXR9Z2V0IGJpdHJhdGUoKXtyZXR1cm4gdGhpcy5ib3hCdWlsZGVyLnRyYWNrRGF0YSYmdGhpcy5ib3hCdWlsZGVyLnRyYWNrRGF0YS5tYXAodD0+dC5iaXRyYXRlKX1nZXQgZnJhbWVyYXRlKCl7cmV0dXJuIHRoaXMuYm94QnVpbGRlci50cmFja0RhdGEmJnRoaXMuYm94QnVpbGRlci50cmFja0RhdGEubWFwKHQ9PnQuZnJhbWVyYXRlKX1nZXQgbnRwUHJlc2VudGF0aW9uVGltZSgpe3JldHVybiB0aGlzLmJveEJ1aWxkZXIubnRwUHJlc2VudGF0aW9uVGltZX19O2MoKTt2YXIgVnM9QyhsZSgpKTt2YXIgdnI9QyhOKCkpO2MoKTt2YXIgS249KG89PihvW28uU1I9MjAwXT1cIlNSXCIsb1tvLlJSPTIwMV09XCJSUlwiLG9bby5TREVTPTIwMl09XCJTREVTXCIsb1tvLkJZRT0yMDNdPVwiQllFXCIsb1tvLkFQUD0yMDRdPVwiQVBQXCIsbykpKEtufHx7fSksa2M9cj0+KHt2ZXJzaW9uOnJbMF0+Pj42LHBhZGRpbmc6ISEoclswXSZpdFsyXSksY291bnQ6clswXSYzMSxwYWNrZXRUeXBlOnIucmVhZFVJbnQ4KDEpLGxlbmd0aDpyLnJlYWRVSW50MTZCRSgyKX0pLFhuPXI9PntsZXQgZT1rYyhyKTtzd2l0Y2goZS5wYWNrZXRUeXBlKXtjYXNlIDIwMDpyZXR1cm4gT2MocixlKTtjYXNlIDIwMTpyZXR1cm4gVWMocixlKTtjYXNlIDIwMjpyZXR1cm4gRGMocixlKTtjYXNlIDIwMzpyZXR1cm4gTmMocixlKTtjYXNlIDIwNDpyZXR1cm4gSGMocixlKTtkZWZhdWx0OnJldHVybiBlfX0seHI9KHIsZSk9Pih7dHlwZTozLGRhdGE6ZSxjaGFubmVsOnIscnRjcDpYbihlKX0pLEhzPXtwYWNrZXRUeXBlOjIwMH0scXM9KHIsZSx0KT0+e2xldCBuPVtdO2ZvcihsZXQgaT0wO2k8cjtpKyspe2xldCBvPXQraSoyNDtuLnB1c2goe3N5bmNTb3VyY2U6ZS5yZWFkVUludDMyQkUobyswKSxmcmFjdGlvbkxvc3Q6ZS5yZWFkVUludDgobys0KSxjdW11bGF0aXZlTnVtYmVyT2ZQYWNrZXRzTG9zdDplLnJlYWRVSW50QkUobys1LDMpLGV4dGVuZGVkSGlnaGVzdFNlcXVlbmNlTnVtYmVyUmVjZWl2ZWQ6ZS5yZWFkVUludDMyQkUobys4KSxpbnRlcmFycml2YWxKaXR0ZXI6ZS5yZWFkVUludDMyQkUobysxMiksbGFzdFNSVGltZXN0YW1wOmUucmVhZFVJbnQzMkJFKG8rMTYpLGRlbGF5U2luY2VMYXN0U1I6ZS5yZWFkVUludDMyQkUobysyMCl9KX1yZXR1cm4gbn0sT2M9KHIsZSk9Pih7Li4uZSxzeW5jU291cmNlOnIucmVhZFVJbnQzMkJFKDQpLG50cE1vc3Q6ci5yZWFkVUludDMyQkUoOCksbnRwTGVhc3Q6ci5yZWFkVUludDMyQkUoMTIpLHJ0cFRpbWVzdGFtcDpyLnJlYWRVSW50MzJCRSgxNiksc2VuZGVyc1BhY2tldENvdW50OnIucmVhZFVJbnQzMkJFKDIwKSxzZW5kZXJzT2N0ZXRDb3VudDpyLnJlYWRVSW50MzJCRSgyNCkscmVwb3J0czpxcyhlLmNvdW50LHIsMjgpfSksX3I9cj0+ci5wYWNrZXRUeXBlPT09MjAwLFVjPShyLGUpPT4oey4uLmUsc3luY1NvdXJjZTpyLnJlYWRVSW50MzJCRSg0KSxyZXBvcnRzOnFzKGUuY291bnQsciw4KX0pLGpzPXI9PnIucGFja2V0VHlwZT09PTIwMSxKbj0odT0+KHVbdS5DTkFNRT0xXT1cIkNOQU1FXCIsdVt1Lk5BTUU9Ml09XCJOQU1FXCIsdVt1LkVNQUlMPTNdPVwiRU1BSUxcIix1W3UuUEhPTkU9NF09XCJQSE9ORVwiLHVbdS5MT0M9NV09XCJMT0NcIix1W3UuVE9PTD02XT1cIlRPT0xcIix1W3UuTk9URT03XT1cIk5PVEVcIix1W3UuUFJJVj04XT1cIlBSSVZcIix1KSkoSm58fHt9KSxEYz0ocixlKT0+e2xldCB0PVtdLG49NDtmb3IobGV0IGk9MDtpPGUuY291bnQ7aSsrKXtsZXQgbz17c291cmNlOnIucmVhZFVJbnQzMkJFKG4pLGl0ZW1zOltdfTtmb3Iobis9NDs7KXtsZXQgcz1yLnJlYWRVSW50OChuKyspO2lmKHM9PT0wKXtuJTQhPT0wJiYobis9NC1uJTQpO2JyZWFrfWxldCBhPXIucmVhZFVJbnQ4KG4rKyk7aWYocz09PTgpe2xldCB1PXIucmVhZFVJbnQ4KG4pLGY9ci50b1N0cmluZyhcInV0ZjhcIixuKzEsbisxK3UpLGw9ci50b1N0cmluZyhcInV0ZjhcIixuKzErdSxuK2EpO28uaXRlbXMucHVzaChbOCxmLGxdKX1lbHNle2xldCB1PXIudG9TdHJpbmcoXCJ1dGY4XCIsbixuK2EpO28uaXRlbXMucHVzaChbcyx1XSl9bis9YX10LnB1c2gobyl9cmV0dXJuey4uLmUsc3luY1NvdXJjZTpyLnJlYWRVSW50MzJCRSg0KSxzb3VyY2VEZXNjcmlwdGlvbnM6dH19LFdzPXI9PnIucGFja2V0VHlwZT09PTIwMixOYz0ocixlKT0+e2xldCB0PVtdO2ZvcihsZXQgaT0wO2k8ZS5jb3VudDtpKyspdC5wdXNoKHIucmVhZFVJbnQzMkJFKDQrNCppKSk7bGV0IG47aWYoZS5sZW5ndGg+ZS5jb3VudCl7bGV0IGk9NCs0KmUuY291bnQsbz1yLnJlYWRVSW50OChpKTtuPXIudG9TdHJpbmcoXCJ1dGYtOFwiLGkrMSxpKzErbyl9cmV0dXJuey4uLmUsc291cmNlczp0LHJlYXNvbjpufX0sd3I9cj0+ci5wYWNrZXRUeXBlPT09MjAzLEhjPShyLGUpPT4oey4uLmUsc3VidHlwZTplLmNvdW50LHNvdXJjZTpyLnJlYWRVSW50MzJCRSg0KSxuYW1lOnIudG9TdHJpbmcoXCJhc2NpaVwiLDgsMTIpLGRhdGE6ci5zbGljZSgxMil9KSwkcz1yPT5yLnBhY2tldFR5cGU9PT0yMDQ7dmFyIHFjPTEwMCxHcz0oMCxWcy5kZWZhdWx0KShcIm1zbDptc2VcIiksVGU9Y2xhc3MgZXh0ZW5kcyBRe2NvbnN0cnVjdG9yKHQpe2lmKHQ9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwidmlkZW8gZWxlbWVudCBhcmd1bWVudCBtaXNzaW5nXCIpO2xldCBuLGksbz1uZXcgdnIuV3JpdGFibGUoe29iamVjdE1vZGU6ITAsd3JpdGU6KGEsdSxmKT0+e2lmKGEudHlwZT09PTgpaWYodGhpcy5fZG9uZT1mLGEudHJhY2tzIT09dm9pZCAwfHxhLm1pbWUhPT12b2lkIDApe2xldCBsPWEudHJhY2tzPz9bXSxkPWwubWFwKHk9PnkubWltZSkuZmlsdGVyKHk9PnkpLGg9ZC5sZW5ndGghPT0wP2Quam9pbihcIiwgXCIpOlwiYXZjMS42NDAwMjksIG1wNGEuNDAuMlwiLG09YS5taW1lPz9gdmlkZW8vbXA0OyBjb2RlY3M9XCIke2h9XCJgO2lmKCFNZWRpYVNvdXJjZS5pc1R5cGVTdXBwb3J0ZWQobSkpe28uZW1pdChcImVycm9yXCIsYHVuc3VwcG9ydGVkIG1lZGlhIHR5cGU6ICR7bX1gKTtyZXR1cm59dGhpcy5fbGFzdENoZWNrcG9pbnRUaW1lPTAsbj1uZXcgTWVkaWFTb3VyY2UsdC5zcmM9d2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwobik7bGV0IGI9KCk9PntpZihuPT09dm9pZCAwKXtvLmVtaXQoXCJlcnJvclwiLFwibm8gTWVkaWFTb3VyY2UgaW5zdGFuY2VcIik7cmV0dXJufXdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHQuc3JjKSxuLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzb3VyY2VvcGVuXCIsYiksdGhpcy5vblNvdXJjZU9wZW4mJnRoaXMub25Tb3VyY2VPcGVuKG4sbCksaT10aGlzLmFkZFNvdXJjZUJ1ZmZlcih0LG4sbSksaS5vbmVycm9yPXk9Pntjb25zb2xlLmVycm9yKFwiZXJyb3Igb24gU291cmNlQnVmZmVyOiBcIix5KSxvLmVtaXQoXCJlcnJvclwiKX07dHJ5e2kuYXBwZW5kQnVmZmVyKGEuZGF0YSl9Y2F0Y2goeSl7R3MoXCJmYWlsZWQgdG8gYXBwZW5kIHRvIFNvdXJjZUJ1ZmZlcjogXCIseSxhKX19O24uYWRkRXZlbnRMaXN0ZW5lcihcInNvdXJjZW9wZW5cIixiKX1lbHNle3RoaXMuX2xhc3RDaGVja3BvaW50VGltZT1hLmNoZWNrcG9pbnRUaW1lIT09dm9pZCAwP2EuY2hlY2twb2ludFRpbWU6dGhpcy5fbGFzdENoZWNrcG9pbnRUaW1lO3RyeXtpPy5hcHBlbmRCdWZmZXIoYS5kYXRhKX1jYXRjaChsKXtHcyhcImZhaWxlZCB0byBhcHBlbmQgdG8gU291cmNlQnVmZmVyOiBcIixsLGEpfX1lbHNlIGEudHlwZT09PTMmJndyKGEucnRjcCkmJm4/LnJlYWR5U3RhdGU9PT1cIm9wZW5cIiYmbi5lbmRPZlN0cmVhbSgpLGYoKX19KTtvLm9uKFwiZmluaXNoXCIsKCk9Pntjb25zb2xlLndhcm4oXCJpbmNvbWluZyBzdHJlYW0gZmluaXNoZWQ6IGVuZCBzdHJlYW1cIiksbiYmbi5yZWFkeVN0YXRlPT09XCJvcGVuXCImJm4uZW5kT2ZTdHJlYW0oKX0pLG8ub24oXCJlcnJvclwiLGE9Pntjb25zb2xlLmVycm9yKFwiZXJyb3Igb24gaW5jb21pbmcgc3RyZWFtOiBcIixhKSxpJiZpLnVwZGF0aW5nP2kuYWRkRXZlbnRMaXN0ZW5lcihcInVwZGF0ZWVuZFwiLCgpPT57bj8ucmVhZHlTdGF0ZT09PVwib3BlblwiJiZuLmVuZE9mU3RyZWFtKCl9KTpuPy5yZWFkeVN0YXRlPT09XCJvcGVuXCImJm4uZW5kT2ZTdHJlYW0oKX0pO2xldCBzPW5ldyB2ci5SZWFkYWJsZSh7b2JqZWN0TW9kZTohMCxyZWFkOmZ1bmN0aW9uKCl7fX0pO3Mub24oXCJlcnJvclwiLCgpPT57Y29uc29sZS53YXJuKFwib3V0Z29pbmcgc3RyZWFtIGJyb2tlIHNvbWV3aGVyZVwiKX0pO3N1cGVyKG8scyk7dGhpcy5fdmlkZW9FbD10LHRoaXMuX2xhc3RDaGVja3BvaW50VGltZT0wfWFkZFNvdXJjZUJ1ZmZlcih0LG4saSl7bGV0IG89bi5hZGRTb3VyY2VCdWZmZXIoaSkscz0wLGE9KCk9PntpZigrK3Mscz5xYyYmby5idWZmZXJlZC5sZW5ndGgpe3M9MDtsZXQgdT1vLmJ1ZmZlcmVkLmxlbmd0aC0xLGY9by5idWZmZXJlZC5zdGFydCh1KSxsPU1hdGgubWluKHQuY3VycmVudFRpbWUsdGhpcy5fbGFzdENoZWNrcG9pbnRUaW1lKS0xMDt0cnl7aWYobD5mKXtvLnJlbW92ZShmLGwpO3JldHVybn19Y2F0Y2goZCl7Y29uc29sZS53YXJuKGQpfX10aGlzLl9kb25lJiZ0aGlzLl9kb25lKCl9O3JldHVybiBvLmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVlbmRcIixhKSxvfWdldCBjdXJyZW50VGltZSgpe3JldHVybiB0aGlzLl92aWRlb0VsLmN1cnJlbnRUaW1lfWFzeW5jIHBsYXkoKXtyZXR1cm4gYXdhaXQgdGhpcy5fdmlkZW9FbC5wbGF5KCl9cGF1c2UoKXtyZXR1cm4gdGhpcy5fdmlkZW9FbC5wYXVzZSgpfX07YygpO3ZhciB6cz1DKE4oKSk7dmFyIENlPWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3Rvcigpe2xldCBlLHQ9W10sbj1uZXcgenMuVHJhbnNmb3JtKHtvYmplY3RNb2RlOiEwLHRyYW5zZm9ybTpmdW5jdGlvbihpLG8scyl7aWYoaS50eXBlPT09NSl7bGV0IGE7Zm9yKGxldCB1IG9mIGkuc2RwLm1lZGlhKXUudHlwZT09PVwiYXBwbGljYXRpb25cIiYmdS5ydHBtYXAmJnUucnRwbWFwLmVuY29kaW5nTmFtZT09PVwiVk5ELk9OVklGLk1FVEFEQVRBXCImJihhPXUpO2EmJmEucnRwbWFwJiYoZT1OdW1iZXIoYS5ydHBtYXAucGF5bG9hZFR5cGUpKSxzKHZvaWQgMCxpKX1lbHNlIGlmKGkudHlwZT09PTImJk8oaS5kYXRhKT09PWUpe2lmKHQucHVzaChaKGkuZGF0YSkpLGNlKGkuZGF0YSkmJnQubGVuZ3RoPjApe2xldCBhPXt0aW1lc3RhbXA6SChpLmRhdGEpLG50cFRpbWVzdGFtcDppLm50cFRpbWVzdGFtcCxwYXlsb2FkVHlwZTpPKGkuZGF0YSksZGF0YTpCdWZmZXIuY29uY2F0KHQpLHR5cGU6OX07cyh2b2lkIDAsYSksdD1bXTtyZXR1cm59cygpfWVsc2Ugcyh2b2lkIDAsaSl9fSk7c3VwZXIobil9fTtjKCk7dmFyIFpuPUMoTigpKTtjKCk7dmFyIFlzPUMobGUoKSksamM9XCJSVFNQLzEuMFwiLEtzPXI9PntpZighci5tZXRob2R8fCFyLnVyaSl0aHJvdyBuZXcgRXJyb3IoXCJtZXNzYWdlIG5lZWRzIHRvIGNvbnRhaW4gYSBtZXRob2QgYW5kIGEgdXJpXCIpO2xldCBlPXIucHJvdG9jb2x8fGpjLHQ9ci5oZWFkZXJzfHx7fSxuPVtgJHtyLm1ldGhvZH0gJHtyLnVyaX0gJHtlfWAsT2JqZWN0LmVudHJpZXModCkubWFwKChbaSxvXSk9PmkrXCI6IFwiK28pLmpvaW4oYFxcclxuYCksYFxcclxuYF0uam9pbihgXFxyXG5gKTtyZXR1cm4oMCxZcy5kZWZhdWx0KShcIm1zbDpydHNwOm91dGdvaW5nXCIpKG4pLEJ1ZmZlci5mcm9tKG4pfTtjKCk7YygpO3ZhciBXYz0ocixlLHQ9MCk9PntsZXQgbj1gXG4ke2V9YDt0PXIuaW5kZXhPZihuLHQpO2xldCBpPTAsbz1bXTtmb3IoO3Q+PTA7KWk9ci5pbmRleE9mKGBcbmAsdCtuLmxlbmd0aCksby5wdXNoKHIudG9TdHJpbmcoXCJhc2NpaVwiLHQrbi5sZW5ndGgsaSkudHJpbSgpKSx0PXIuaW5kZXhPZihuLGkpO3JldHVybiBvfSwkYz1yPT5yLm1hdGNoKC9ebT0vKSxFcj0ocixlKT0+e2xldCB0PWUuaW5kZXhPZihyKTtyZXR1cm4gdDwwP1tlLnNsaWNlKDApXTpbZS5zbGljZSgwLHQpLGUuc2xpY2UodCsxKV19LFhzPXtmbXRwOnI9PntsZXRbZSx0XT1FcihcIiBcIixyKTtzd2l0Y2goZSl7ZGVmYXVsdDpsZXQgbj10P3QudHJpbSgpLnNwbGl0KFwiO1wiKTpbXSxpPXt9O3JldHVybiBuLmZvckVhY2gobz0+e2xldFtzLGFdPUVyKFwiPVwiLG8pLHU9cy50cmltKCkudG9Mb3dlckNhc2UoKTt1IT09XCJcIiYmKGlbdV09YS50cmltKCkpfSkse2Zvcm1hdDplLHBhcmFtZXRlcnM6aX19fSxmcmFtZXJhdGU6TnVtYmVyLHJ0cG1hcDpyPT57bGV0W2UsdF09RXIoXCIgXCIsciksW24saSxvXT10LnRvVXBwZXJDYXNlKCkuc3BsaXQoXCIvXCIpO3JldHVybiBvPT09dm9pZCAwP3twYXlsb2FkVHlwZTpOdW1iZXIoZSksZW5jb2RpbmdOYW1lOm4sY2xvY2tyYXRlOk51bWJlcihpKX06e3BheWxvYWRUeXBlOk51bWJlcihlKSxlbmNvZGluZ05hbWU6bixjbG9ja3JhdGU6TnVtYmVyKGkpLGVuY29kaW5nUGFyYW1ldGVyczpvfX0sdHJhbnNmb3JtOnI9PnIuc3BsaXQoXCI7XCIpLm1hcChlPT5lLnNwbGl0KFwiLFwiKS5tYXAoTnVtYmVyKSksXCJ4LXNlbnNvci10cmFuc2Zvcm1cIjpyPT5yLnNwbGl0KFwiO1wiKS5tYXAoZT0+ZS5zcGxpdChcIixcIikubWFwKE51bWJlcikpLGZyYW1lc2l6ZTpyPT5yLnNwbGl0KFwiIFwiKVsxXS5zcGxpdChcIi1cIikubWFwKE51bWJlcil9LEdjPXI9PntsZXRbZSx0XT1FcihcIjpcIixyKTtyZXR1cm4gdD09PXZvaWQgMD97W2VdOiEwfTpYc1tlXSE9PXZvaWQgMD97W2VdOlhzW2VdKHQpfTp7W2VdOnR9fSxWYz1yPT57bGV0IGU9ci5zbGljZSgwLDEpLHQ9ci5zbGljZSgyKTtzd2l0Y2goZSl7Y2FzZVwidlwiOnJldHVybnt2ZXJzaW9uOnR9O2Nhc2VcIm9cIjpsZXRbbixpLG8scyxhLHVdPXQuc3BsaXQoXCIgXCIpO3JldHVybntvcmlnaW46e2FkZHJUeXBlOmEsbmV0VHlwZTpzLHNlc3Npb25JZDppLHNlc3Npb25WZXJzaW9uOm8sdW5pY2FzdEFkZHJlc3M6dSx1c2VybmFtZTpufX07Y2FzZVwic1wiOnJldHVybntzZXNzaW9uTmFtZTp0fTtjYXNlXCJpXCI6cmV0dXJue3Nlc3Npb25JbmZvcm1hdGlvbjp0fTtjYXNlXCJ1XCI6cmV0dXJue3VyaTp0fTtjYXNlXCJlXCI6cmV0dXJue2VtYWlsOnR9O2Nhc2VcInBcIjpyZXR1cm57cGhvbmU6dH07Y2FzZVwiY1wiOmxldFtmLGwsZF09dC5zcGxpdChcIiBcIik7cmV0dXJue2Nvbm5lY3Rpb25EYXRhOnthZGRyVHlwZTpsLGNvbm5lY3Rpb25BZGRyZXNzOmQsbmV0VHlwZTpmfX07Y2FzZVwiYlwiOmxldFtoLG1dPXQuc3BsaXQoXCI6XCIpO3JldHVybntid3R5cGU6aCxiYW5kd2lkdGg6bX07Y2FzZVwidFwiOmxldFtiLHldPXQuc3BsaXQoXCIgXCIpLm1hcChOdW1iZXIpO3JldHVybnt0aW1lOntzdGFydFRpbWU6YixzdG9wVGltZTp5fX07Y2FzZVwiclwiOmxldFt3LF8sLi4udl09dC5zcGxpdChcIiBcIikubWFwKE51bWJlcik7cmV0dXJue3JlcGVhdFRpbWVzOntyZXBlYXRJbnRlcnZhbDp3LGFjdGl2ZUR1cmF0aW9uOl8sb2Zmc2V0czp2fX07Y2FzZVwielwiOnJldHVybjtjYXNlXCJrXCI6cmV0dXJuO2Nhc2VcImFcIjpyZXR1cm4gR2ModCk7Y2FzZVwibVwiOmxldFtxLEEsaixZXT10LnNwbGl0KFwiIFwiKTtyZXR1cm57dHlwZTpxLHBvcnQ6TnVtYmVyKEEpLHByb3RvY29sOmosZm10Ok51bWJlcihZKX07ZGVmYXVsdDp9fSxKcz1yPT57bGV0IGU9ci5pbmRleE9mKGBcbm09YCk7cmV0dXJuIFdjKHIsXCJhPWNvbnRyb2w6XCIsZSl9LFFuPXI9PntsZXQgZT1yLnRvU3RyaW5nKFwiYXNjaWlcIikuc3BsaXQoYFxuYCkubWFwKG89Pm8udHJpbSgpKSx0PXtzZXNzaW9uOnt9LG1lZGlhOltdfSxuPTAsaT10LnNlc3Npb247Zm9yKGxldCBvIG9mIGUpJGMobykmJih0Lm1lZGlhW25dPXt9LGk9dC5tZWRpYVtuXSwrK24pLGk9T2JqZWN0LmFzc2lnbihpLFZjKG8pKTtyZXR1cm4gdH0sU3I9cj0+KHt0eXBlOjUsZGF0YTpyLHNkcDpRbihyKX0pO2MoKTt2YXIgcmU9KHIsZSk9PntsZXQgdD1gXG4ke2UudG9Mb3dlckNhc2UoKX06IGAsbj1yLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKHQpO2lmKG4+PTApe2xldCBpPXIuaW5kZXhPZihgXG5gLG4rdC5sZW5ndGgpO3JldHVybiByLnRvU3RyaW5nKFwiYXNjaWlcIixuK3QubGVuZ3RoLGkpLnRyaW0oKX1yZXR1cm4gbnVsbH0sUnI9cj0+e2xldCBlPXJlKHIsXCJDU2VxXCIpO3JldHVybiBlIT09bnVsbD9OdW1iZXIoZSk6bnVsbH0sVHI9cj0+e2xldCBlPXJlKHIsXCJTZXNzaW9uXCIpO3JldHVybiBlP2Uuc3BsaXQoXCI7XCIpWzBdOm51bGx9LENyPXI9PntsZXQgZT1yZShyLFwiU2Vzc2lvblwiKTtpZihlPT09bnVsbClyZXR1cm4gbnVsbDtsZXQgdD02MCxuPVwidGltZW91dD1cIixpPWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKG4pO2lmKGkhPT0tMSl7bGV0IG89ZS5zdWJzdHJpbmcoaStuLmxlbmd0aCk7bz1vLnNwbGl0KFwiO1wiKVswXTtsZXQgcz1wYXJzZUludChvKTtyZXR1cm4gaXNOYU4ocyk/dDpzfXJldHVybiB0fSxodD1yPT5OdW1iZXIoci50b1N0cmluZyhcImFzY2lpXCIsOSwxMikpLEJyPXI9PnJlKHIsXCJDb250ZW50LUJhc2VcIiksTXI9cj0+cmUocixcIkNvbnRlbnQtTG9jYXRpb25cIiksTHI9cj0+e2xldCBlPXJlKHIsXCJDb25uZWN0aW9uXCIpO3JldHVybiBlIT09bnVsbCYmZS50b0xvd2VyQ2FzZSgpPT09XCJjbG9zZVwifSxJcj1yPT57bGV0IGU9cmUocixcIlJhbmdlXCIpO2lmKGUhPT1udWxsKXJldHVybiBlLnNwbGl0KFwiPVwiKVsxXS5zcGxpdChcIi1cIil9LEFyPXI9PntsZXQgZT1bYFxuXG5gLFwiXFxyXFxyXCIsYFxcclxuXFxyXG5gXS5tYXAodD0+e2xldCBuPXIuaW5kZXhPZih0KTtyZXR1cm4gbiE9PS0xP24rdC5sZW5ndGg6bn0pLmZpbHRlcih0PT50IT09LTEpO3JldHVybiBlLmxlbmd0aD4wP2UucmVkdWNlKCh0LG4pPT5NYXRoLm1pbih0LG4pKTotMX07dmFyIFpzPTQsUXM9MzYsemM9cj0+e2xldCBlPUJ1ZmZlci5hbGxvYyhacyksdD0wLG49MDtmb3IoO248ZS5sZW5ndGg7KXtsZXQgdT1yW3QrK10sZj1NYXRoLm1pbih1Lmxlbmd0aCxlLmxlbmd0aC1uKTt1LmNvcHkoZSxuLDAsZiksbis9Zn1sZXQgaT1lWzFdLG89ZS5sZW5ndGgscz1lLnJlYWRVSW50MTZCRSgyKSxhPW8rcztyZXR1cm57Y2hhbm5lbDppLGJlZ2luOm8sZW5kOmF9fSxGcj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2NodW5rcz1bXTt0aGlzLl9sZW5ndGg9MDt0aGlzLl9zdGF0ZT0wO3RoaXMuX2luaXQoKX1faW5pdCgpe3RoaXMuX2NodW5rcz1bXSx0aGlzLl9sZW5ndGg9MCx0aGlzLl9zdGF0ZT0wfV9wdXNoKGUpe3RoaXMuX2NodW5rcy5wdXNoKGUpLHRoaXMuX2xlbmd0aCs9ZS5sZW5ndGh9X3BhcnNlUnRzcCgpe2xldCBlPVtdLHQ9QnVmZmVyLmNvbmNhdCh0aGlzLl9jaHVua3MpLG49QXIodCk7aWYobj09PS0xKXJldHVybiBlO2xldCBpPW4sbz1yZSh0LFwiQ29udGVudC1MZW5ndGhcIik7aWYobyYmcGFyc2VJbnQobyk+dC5sZW5ndGgtaSlyZXR1cm4gZTtpZih0aGlzLl9pbml0KCksaT09PXQubGVuZ3RofHx0W2ldPT09UXMpe2xldCBzPXQuc2xpY2UoMCxpKTtlLnB1c2goe3R5cGU6NCxkYXRhOnN9KTtsZXQgYT10LnNsaWNlKGkpO3RoaXMuX3B1c2goYSl9ZWxzZXtsZXQgcz10LGE9dC5zbGljZShpKTtlLnB1c2goe3R5cGU6NCxkYXRhOnN9KSxlLnB1c2goU3IoYSkpfXJldHVybiBlfV9wYXJzZUludGVybGVhdmVkKCl7bGV0IGU9W107aWYodGhpcy5fbGVuZ3RoPFpzfHwodGhpcy5fcGFja2V0fHwodGhpcy5fcGFja2V0PXpjKHRoaXMuX2NodW5rcykpLHRoaXMuX2xlbmd0aDx0aGlzLl9wYWNrZXQuZW5kKSlyZXR1cm4gZTtsZXQgdD1CdWZmZXIuY29uY2F0KHRoaXMuX2NodW5rcyksbj10LnNsaWNlKHRoaXMuX3BhY2tldC5iZWdpbix0aGlzLl9wYWNrZXQuZW5kKSxpPXQuc2xpY2UodGhpcy5fcGFja2V0LmVuZCksbz10aGlzLl9wYWNrZXQuY2hhbm5lbDtpZihkZWxldGUgdGhpcy5fcGFja2V0LHRoaXMuX2luaXQoKSx0aGlzLl9wdXNoKGkpLG8lMj09PTApZS5wdXNoKHt0eXBlOjIsZGF0YTpuLGNoYW5uZWw6b30pO2Vsc2V7bGV0IHM9bjtkb3tsZXQgYT1zLnJlYWRVSW50MTZCRSgyKSo0KzQ7ZS5wdXNoKHhyKG8scy5zbGljZSgwLGEpKSkscz1zLnNsaWNlKGEpfXdoaWxlKHMubGVuZ3RoPjApfXJldHVybiBlfV9zZXRTdGF0ZSgpe2Zvcig7dGhpcy5fY2h1bmtzLmxlbmd0aD4wJiZ0aGlzLl9jaHVua3NbMF0ubGVuZ3RoPT09MDspdGhpcy5fY2h1bmtzLnNoaWZ0KCk7bGV0IGU9dGhpcy5fY2h1bmtzWzBdO2lmKHRoaXMuX2NodW5rcy5sZW5ndGg9PT0wKXRoaXMuX3N0YXRlPTA7ZWxzZSBpZihlWzBdPT09UXMpdGhpcy5fc3RhdGU9MTtlbHNlIGlmKGUudG9TdHJpbmcoXCJhc2NpaVwiLDAsNCk9PT1cIlJUU1BcIil0aGlzLl9zdGF0ZT0yO2Vsc2UgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNodW5rIG9mIGxlbmd0aCAke2UubGVuZ3RofWApfXBhcnNlKGUpe3RoaXMuX3B1c2goZSksdGhpcy5fc3RhdGU9PT0wJiZ0aGlzLl9zZXRTdGF0ZSgpO2xldCB0PVtdLG49ITE7Zm9yKDshbjspe2xldCBpPVtdO3N3aXRjaCh0aGlzLl9zdGF0ZSl7Y2FzZSAwOmJyZWFrO2Nhc2UgMTppPXRoaXMuX3BhcnNlSW50ZXJsZWF2ZWQoKTticmVhaztjYXNlIDI6aT10aGlzLl9wYXJzZVJ0c3AoKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihcImludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlXCIpfWkubGVuZ3RoPjA/dD10LmNvbmNhdChpKTpuPSEwLHRoaXMuX3NldFN0YXRlKCl9cmV0dXJuIHR9fTt2YXIgbXQ9Y2xhc3MgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKCl7bGV0IGU9bmV3IEZyLHQ9bmV3IFpuLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm06ZnVuY3Rpb24oaSxvLHMpe2lmKGkudHlwZT09PTEpdHJ5e2UucGFyc2UoaS5kYXRhKS5mb3JFYWNoKGE9PnQucHVzaChhKSkscygpfWNhdGNoKGEpe3MoYSl9ZWxzZSBzKHZvaWQgMCxpKX19KSxuPW5ldyBabi5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtOmZ1bmN0aW9uKGksbyxzKXtpZihpLnR5cGU9PT00KXtsZXQgYT1LcyhpKTtzKHZvaWQgMCx7dHlwZToxLGRhdGE6YX0pfWVsc2Ugcyh2b2lkIDAsaSl9fSk7c3VwZXIodCxuKX19O2MoKTt2YXIga3I9QyhsZSgpKTtjKCk7dmFyIGd0PShyLGUpPT57bGV0IHQ7aWYoZSE9PXZvaWQgMCl7aWYodHlwZW9mIGUhPVwib2JqZWN0XCIpdGhyb3cgbmV3IEVycm9yKFwibWVyZ2UgZXhwZWN0cyBvdmVycmlkZSB0byBiZSBhbiBvYmplY3QhXCIpO3Q9T2JqZWN0LmtleXMoZSkucmVkdWNlKChuLGkpPT4oZVtpXSE9PXZvaWQgMCYmKG5baV09ZVtpXSksbikse30pfXJldHVybiBPYmplY3QuYXNzaWduKHt9LHIsdCl9O3ZhciBlYT1DKE4oKSk7YygpO3ZhciBZYz1EYXRlLlVUQygxOTAwLDAsMSk7ZnVuY3Rpb24gUHIocixlKXtsZXQgdD0ocitlLzQyOTQ5NjcyOTYpKjFlMztyZXR1cm4gWWMrdH1mdW5jdGlvbiBLYyhyKXtyZXR1cm4vXlteOl0rOlxcL1xcLy8udGVzdChyKX12YXIgT3I9KHM9PihzLk9QVElPTlM9XCJPUFRJT05TXCIscy5ERVNDUklCRT1cIkRFU0NSSUJFXCIscy5TRVRVUD1cIlNFVFVQXCIscy5QTEFZPVwiUExBWVwiLHMuUEFVU0U9XCJQQVVTRVwiLHMuVEVBUkRPV049XCJURUFSRE9XTlwiLHMpKShPcnx8e30pLFhjPTUsSmM9KHI9dHlwZW9mIHdpbmRvdz5cInVcIj9cIlwiOndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSxlPVtdKT0+KHt1cmk6ZS5sZW5ndGg+MD9gcnRzcDovLyR7cn0vYXhpcy1tZWRpYS9tZWRpYS5hbXA/JHtlLmpvaW4oXCImXCIpfWA6YHJ0c3A6Ly8ke3J9L2F4aXMtbWVkaWEvbWVkaWEuYW1wYH0pLEl0PWNsYXNzIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCxuKXtzdXBlcih0KTt0aGlzLm5hbWU9XCJSVFNQUmVzcG9uc2VFcnJvclwiLHRoaXMuY29kZT1ufX0seXQ9Y2xhc3MgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKHQ9e30pe2xldHt1cmk6bixoZWFkZXJzOmksZGVmYXVsdEhlYWRlcnM6b309Z3QoSmModC5ob3N0bmFtZSx0LnBhcmFtZXRlcnMpLHQpLHM9bmV3IGVhLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm06KGEsdSxmKT0+e2EudHlwZT09PTQ/KHRoaXMuX29uUnRzcChhKSxmKCkpOmEudHlwZT09PTM/KHRoaXMuX29uUnRjcChhKSx0aGlzLm9uUnRjcCYmdGhpcy5vblJ0Y3AoYS5ydGNwKSxmKHZvaWQgMCxhKSk6YS50eXBlPT09Mj8odGhpcy5fb25SdHAoYSksZih2b2lkIDAsYSkpOihhLnR5cGU9PT01JiYodGhpcy5fb25TZHAoYSksdGhpcy5vblNkcCYmdGhpcy5vblNkcChhLnNkcCkpLGYodm9pZCAwLGEpKX19KTtzLm9uKFwiZW5kXCIsKCk9Pnt0aGlzLl9vdXRnb2luZ0Nsb3NlZD0hMH0pO3N1cGVyKHMpO3RoaXMuX291dGdvaW5nQ2xvc2VkPSExLHRoaXMuX3Jlc2V0KCksdGhpcy51cGRhdGUobixpLG8pLHRoaXMuX3Nlc3Npb25Db250cm9sVVJMPXRoaXMuX2NvbnRyb2xVUkwoKX11cGRhdGUodCxuPXt9LGk9e30pe2lmKHQ9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwiWW91IG11c3Qgc3VwcGx5IGFuIHVyaSB3aGVuIGNyZWF0aW5nIGEgUnRzcFNlc3Npb25Db21wb25lbnRcIik7dGhpcy51cmk9dCx0aGlzLmRlZmF1bHRIZWFkZXJzPWksdGhpcy5oZWFkZXJzPU9iamVjdC5hc3NpZ24oe1tcIk9QVElPTlNcIl06e30sW1wiUExBWVwiXTp7fSxbXCJTRVRVUFwiXTp7QmxvY2tzaXplOlwiNjQwMDBcIn0sW1wiREVTQ1JJQkVcIl06e0FjY2VwdDpcImFwcGxpY2F0aW9uL3NkcFwifSxbXCJQQVVTRVwiXTp7fX0sbil9X3Jlc2V0KCl7dGhpcy5fc2VxdWVuY2U9MSx0aGlzLnJldHJ5PSgpPT5jb25zb2xlLmVycm9yKFwiTm8gcmVxdWVzdCBzZW50LCBjYW4ndCByZXRyeVwiKSx0aGlzLl9jYWxsU3RhY2s9W10sdGhpcy5fY2FsbEhpc3Rvcnk9W10sdGhpcy5fc3RhdGU9XCJpZGxlXCIsdGhpcy5fd2FpdGluZz0hMSx0aGlzLl9jb250ZW50QmFzZT1udWxsLHRoaXMuX3Nlc3Npb25JZD1udWxsLHRoaXMuX3JlbmV3U2Vzc2lvbkludGVydmFsIT09bnVsbCYmY2xlYXJJbnRlcnZhbCh0aGlzLl9yZW5ld1Nlc3Npb25JbnRlcnZhbCksdGhpcy5fcmVuZXdTZXNzaW9uSW50ZXJ2YWw9bnVsbCx0aGlzLnQwPXZvaWQgMCx0aGlzLm4wPXZvaWQgMCx0aGlzLmNsb2NrcmF0ZXM9dm9pZCAwfV9jb250cm9sVVJMKHQpe2lmKHQhPT12b2lkIDAmJktjKHQpKXJldHVybiB0O2xldCBuPXRoaXMuX2NvbnRlbnRCYXNlPz90aGlzLl9jb250ZW50TG9jYXRpb24/P3RoaXMudXJpO2lmKG49PW51bGwpdGhyb3cgbmV3IEVycm9yKFwicmVsYXRpdmUgb3IgbWlzc2luZyBjb250cm9sIGF0dHJpYnV0ZSBidXQgbm8gYmFzZSBVUkwgYXZhaWxhYmxlXCIpO3JldHVybiB0PT09dm9pZCAwfHx0PT09XCIqXCI/bjpuZXcgVVJMKHQsbikuaHJlZn1fb25SdHNwKHQpe3RoaXMuX3dhaXRpbmc9ITE7bGV0IG49aHQodC5kYXRhKSxpPUxyKHQuZGF0YSksbz1Scih0LmRhdGEpO2lmKG89PT1udWxsKXRocm93IG5ldyBFcnJvcihcInJ0c3A6IGV4cGVjdGVkIHNlcXVlbmNlIG51bWJlclwiKTtpZih0aGlzLl9jYWxsSGlzdG9yeT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJydHNwOiBpbnRlcm5hbCBlcnJvclwiKTtsZXQgcz10aGlzLl9jYWxsSGlzdG9yeVtvLTFdO2lmKCgwLGtyLmRlZmF1bHQpKFwibXNsOnJ0c3A6aW5jb21pbmdcIikoYCR7dC5kYXRhfWApLCF0aGlzLl9zZXNzaW9uSWQmJiFpKXt0aGlzLl9zZXNzaW9uSWQ9VHIodC5kYXRhKTtsZXQgYT1Dcih0LmRhdGEpO2EhPT1udWxsJiYodGhpcy5fcmVuZXdTZXNzaW9uSW50ZXJ2YWwhPT1udWxsJiZjbGVhckludGVydmFsKHRoaXMuX3JlbmV3U2Vzc2lvbkludGVydmFsKSx0aGlzLl9yZW5ld1Nlc3Npb25JbnRlcnZhbD1zZXRJbnRlcnZhbCgoKT0+e3RoaXMuX2VucXVldWUoe21ldGhvZDpcIk9QVElPTlNcIn0pLHRoaXMuX2RlcXVldWUoKX0sTWF0aC5tYXgoWGMsYS01KSoxZTMpKX10aGlzLl9jb250ZW50QmFzZXx8KHRoaXMuX2NvbnRlbnRCYXNlPUJyKHQuZGF0YSkpLHRoaXMuX2NvbnRlbnRMb2NhdGlvbnx8KHRoaXMuX2NvbnRlbnRMb2NhdGlvbj1Ncih0LmRhdGEpKSxuPj00MDAmJnRoaXMub25FcnJvciYmdGhpcy5vbkVycm9yKG5ldyBJdCh0LmRhdGEudG9TdHJpbmcoXCJhc2NpaVwiKSxuKSkscz09PVwiUExBWVwiJiZ0aGlzLm9uUGxheSYmdGhpcy5vblBsYXkoSXIodC5kYXRhKSksaSYmKCgwLGtyLmRlZmF1bHQpKFwibXNsOnJ0c3A6aW5jb21pbmdcIikoYFJUU1AgU2Vzc2lvbiAke3RoaXMuX3Nlc3Npb25JZH0gZW5kZWQgd2l0aCBzdGF0dXNDb2RlOiAke259YCksdGhpcy5fc2Vzc2lvbklkPW51bGwpLHRoaXMuX2RlcXVldWUoKX1fb25SdGNwKHQpe2lmKHRoaXMudDA9PT12b2lkIDB8fHRoaXMubjA9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwicnRzcDogaW50ZXJuYWwgZXJyb3JcIik7aWYoX3IodC5ydGNwKSl7bGV0IG49dC5jaGFubmVsLTE7dGhpcy50MFtuXT10LnJ0Y3AucnRwVGltZXN0YW1wLHRoaXMubjBbbl09UHIodC5ydGNwLm50cE1vc3QsdC5ydGNwLm50cExlYXN0KX19X29uUnRwKHQpe2lmKHRoaXMudDA9PT12b2lkIDB8fHRoaXMubjA9PT12b2lkIDB8fHRoaXMuY2xvY2tyYXRlcz09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJydHNwOiBpbnRlcm5hbCBlcnJvclwiKTtsZXQgbj10LmNoYW5uZWwsaT10aGlzLnQwW25dLG89dGhpcy5uMFtuXTtpZih0eXBlb2YgaTxcInVcIiYmdHlwZW9mIG88XCJ1XCIpe2xldCBzPXRoaXMuY2xvY2tyYXRlc1tuXSx1PUgodC5kYXRhKS1pfDA7dC5udHBUaW1lc3RhbXA9dS9zKjFlMytvfX1fb25TZHAodCl7dGhpcy5uMD17fSx0aGlzLnQwPXt9LHRoaXMuY2xvY2tyYXRlcz17fSx0aGlzLl9zZXNzaW9uQ29udHJvbFVSTD10aGlzLl9jb250cm9sVVJMKHQuc2RwLnNlc3Npb24uY29udHJvbCksdC5zZHAubWVkaWEuZm9yRWFjaCgobixpKT0+e2lmKG4ucnRwbWFwPT09dm9pZCAwKXJldHVybjtsZXR7Y2xvY2tyYXRlOm99PW4ucnRwbWFwLHM9aSoyLGE9cysxLHU9bi5jb250cm9sPT09dm9pZCAwP3RoaXMuX3Nlc3Npb25Db250cm9sVVJMOnRoaXMuX2NvbnRyb2xVUkwobi5jb250cm9sKTt0aGlzLl9lbnF1ZXVlKHttZXRob2Q6XCJTRVRVUFwiLGhlYWRlcnM6e1RyYW5zcG9ydDpcIlJUUC9BVlAvVENQO3VuaWNhc3Q7aW50ZXJsZWF2ZWQ9XCIrcytcIi1cIithfSx1cmk6dX0pLHRoaXMuY2xvY2tyYXRlcyE9PXZvaWQgMCYmKHRoaXMuY2xvY2tyYXRlc1tzXT1vKX0pLHRoaXMuX3N0YXRlPT09XCJwbGF5aW5nXCImJnRoaXMuX2VucXVldWUoe21ldGhvZDpcIlBMQVlcIixoZWFkZXJzOntSYW5nZTpgbnB0PSR7dGhpcy5zdGFydFRpbWV8fDB9LWB9LHVyaTp0aGlzLl9zZXNzaW9uQ29udHJvbFVSTH0pLHRoaXMuX2RlcXVldWUoKX1wbGF5KHQ9MCl7aWYodGhpcy5fc3RhdGU9PT1cImlkbGVcIil0aGlzLnN0YXJ0VGltZT1OdW1iZXIodCl8fDAsdGhpcy5fZW5xdWV1ZSh7bWV0aG9kOlwiT1BUSU9OU1wifSksdGhpcy5fZW5xdWV1ZSh7bWV0aG9kOlwiREVTQ1JJQkVcIn0pO2Vsc2UgaWYodGhpcy5fc3RhdGU9PT1cInBhdXNlZFwiKXtpZih0aGlzLl9zZXNzaW9uSWQ9PT1udWxsfHx0aGlzLl9zZXNzaW9uSWQ9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwicnRzcDogaW50ZXJuYWwgZXJyb3JcIik7dGhpcy5fZW5xdWV1ZSh7bWV0aG9kOlwiUExBWVwiLGhlYWRlcnM6e1Nlc3Npb246dGhpcy5fc2Vzc2lvbklkfSx1cmk6dGhpcy5fc2Vzc2lvbkNvbnRyb2xVUkx9KX10aGlzLl9zdGF0ZT1cInBsYXlpbmdcIix0aGlzLl9kZXF1ZXVlKCl9cGF1c2UoKXt0aGlzLl9lbnF1ZXVlKHttZXRob2Q6XCJQQVVTRVwifSksdGhpcy5fc3RhdGU9XCJwYXVzZWRcIix0aGlzLl9kZXF1ZXVlKCl9c3RvcCgpe3RoaXMuX3Nlc3Npb25JZD90aGlzLl9lbnF1ZXVlKHttZXRob2Q6XCJURUFSRE9XTlwifSk6dGhpcy5fY2FsbFN0YWNrPVtdLHRoaXMuX3N0YXRlPVwiaWRsZVwiLHRoaXMuX3JlbmV3U2Vzc2lvbkludGVydmFsIT09bnVsbCYmKGNsZWFySW50ZXJ2YWwodGhpcy5fcmVuZXdTZXNzaW9uSW50ZXJ2YWwpLHRoaXMuX3JlbmV3U2Vzc2lvbkludGVydmFsPW51bGwpLHRoaXMuX2RlcXVldWUoKX1zZW5kKHQpe2xldHttZXRob2Q6bixoZWFkZXJzOmksdXJpOm99PXQ7aWYobj09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJtaXNzaW5nIG1ldGhvZCB3aGVuIHNlbmQgcmVxdWVzdFwiKTtpZih0aGlzLl93YWl0aW5nPSEwLHRoaXMucmV0cnk9dGhpcy5zZW5kLmJpbmQodGhpcyx0KSx0aGlzLl9zZXF1ZW5jZT09PXZvaWQgMHx8dGhpcy5oZWFkZXJzPT09dm9pZCAwfHx0aGlzLl9jYWxsSGlzdG9yeT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJydHNwOiBpbnRlcm5hbCBlcnJvclwiKTtsZXQgcz1PYmplY3QuYXNzaWduKHt0eXBlOjQsdXJpOm98fHRoaXMuX3Nlc3Npb25Db250cm9sVVJMLGRhdGE6QnVmZmVyLmFsbG9jKDApfSx7bWV0aG9kOm4saGVhZGVyczppfSx7aGVhZGVyczpPYmplY3QuYXNzaWduKHtDU2VxOnRoaXMuX3NlcXVlbmNlKyt9LHRoaXMuZGVmYXVsdEhlYWRlcnMsdGhpcy5oZWFkZXJzW25dLGkpfSk7dGhpcy5fc2Vzc2lvbklkJiYocy5oZWFkZXJzLlNlc3Npb249dGhpcy5fc2Vzc2lvbklkKSx0aGlzLl9jYWxsSGlzdG9yeS5wdXNoKG4pLHRoaXMuX291dGdvaW5nQ2xvc2VkPygwLGtyLmRlZmF1bHQpKFwibXNsOnJ0c3A6b3V0Z29pbmdcIikoYFVuYWJsZSB0byBzZW5kICR7bn0sIGNvbm5lY3Rpb24gY2xvc2VkYCk6dGhpcy5vdXRnb2luZy5wdXNoKHMpfV9lbnF1ZXVlKHQpe2lmKHRoaXMuX2NhbGxTdGFjaz09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJydHNwOiBpbnRlcm5hbCBlcnJvclwiKTt0aGlzLl9jYWxsU3RhY2sucHVzaCh0KX1fZGVxdWV1ZSgpe2lmKHRoaXMuX2NhbGxTdGFjaz09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJydHNwOiBpbnRlcm5hbCBlcnJvclwiKTtpZighdGhpcy5fd2FpdGluZyYmdGhpcy5fY2FsbFN0YWNrLmxlbmd0aD4wKXtsZXQgdD10aGlzLl9jYWxsU3RhY2suc2hpZnQoKTt0IT09dm9pZCAwJiZ0aGlzLnNlbmQodCl9fX07YygpO3ZhciBVcj1DKGxlKCkpO3ZhciBEcj1DKE4oKSk7YygpO3ZhciBRYz0xMDAwNyxaYz0ocj13aW5kb3cubG9jYXRpb24uaG9zdCxlPXdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCk9Pih7dXJpOmAke2U9PT1cImh0dHBzOlwiP1wid3NzOlwiOlwid3M6XCJ9Ly8ke3J9L3J0c3Atb3Zlci13ZWJzb2NrZXRgLHRva2VuVXJpOmAke2V9Ly8ke3J9L2F4aXMtY2dpL3J0c3B3c3Nlc3Npb24uY2dpYCxwcm90b2NvbDpcImJpbmFyeVwiLHRpbWVvdXQ6UWN9KSx0YT1hc3luYyhyPXt9KT0+e2xldHt1cmk6ZSx0b2tlblVyaTp0LHByb3RvY29sOm4sdGltZW91dDppfT1ndChaYyhyLmhvc3Qsci5zY2hlbWUpLHIpO2lmKGU9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwid3M6IGludGVybmFsIGVycm9yXCIpO3JldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgobyxzKT0+e3RyeXtsZXQgYT1uZXcgV2ViU29ja2V0KGUsbiksdT1zZXRUaW1lb3V0KCgpPT57Y2xlYXJUaW1lb3V0KHUpLGEucmVhZHlTdGF0ZT09PVdlYlNvY2tldC5DT05ORUNUSU5HJiYoYS5vbmVycm9yPW51bGwscyhuZXcgRXJyb3IoXCJ3ZWJzb2NrZXQgY29ubmVjdGlvbiB0aW1lZCBvdXRcIikpKX0saSk7YS5iaW5hcnlUeXBlPVwiYXJyYXlidWZmZXJcIixhLm9uZXJyb3I9Zj0+e2NsZWFyVGltZW91dCh1KTtmdW5jdGlvbiBsKCl7aWYodGhpcy5zdGF0dXM+PTQwMCl7Y29uc29sZS53YXJuKFwiZmFpbGVkIHRvIGxvYWQgdG9rZW5cIix0aGlzLnN0YXR1cyx0aGlzLnJlc3BvbnNlVGV4dCkscyhmKTtyZXR1cm59bGV0IGg9dGhpcy5yZXNwb25zZVRleHQudHJpbSgpLG09YCR7ZX0/cnRzcHdzc2Vzc2lvbj0ke2h9YCxiPW5ldyBXZWJTb2NrZXQobSxuKTtiLmJpbmFyeVR5cGU9XCJhcnJheWJ1ZmZlclwiLGIub25lcnJvcj15PT57cyh5KX0sYi5vbm9wZW49KCk9Pm8oYil9bGV0IGQ9bmV3IFhNTEh0dHBSZXF1ZXN0O2QuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIixsKSxkLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLGg9Pntjb25zb2xlLndhcm4oXCJmYWlsZWQgdG8gZ2V0IHRva2VuXCIpLHMoaCl9KSxkLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCgpPT5zKGYpKSxkLm9wZW4oXCJHRVRcIixgJHt0fT8ke0RhdGUubm93KCl9YCk7dHJ5e2Quc2VuZCgpfWNhdGNoe3MoZil9fSxhLm9ub3Blbj0oKT0+e2NsZWFyVGltZW91dCh1KSxvKGEpfX1jYXRjaChhKXtzKGEpfX0pfTt2YXIgZWw9MTAwMSxHPWNsYXNzIGV4dGVuZHMgVntjb25zdHJ1Y3Rvcih0KXtpZih0PT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcInNvY2tldCBhcmd1bWVudCBtaXNzaW5nXCIpO2xldCBuPW5ldyBEci5SZWFkYWJsZSh7b2JqZWN0TW9kZTohMCxyZWFkOmZ1bmN0aW9uKCl7fX0pO3Qub25tZXNzYWdlPW89PntsZXQgcz1CdWZmZXIuZnJvbShvLmRhdGEpO24ucHVzaCh7ZGF0YTpzLHR5cGU6MX0pfHx0LnJlYWR5U3RhdGU9PT1XZWJTb2NrZXQuT1BFTiYmKCgwLFVyLmRlZmF1bHQpKFwibXNsOndlYnNvY2tldDppbmNvbWluZ1wiKShcImRvd25zdHJlYW0gZnJvemVuXCIpLHQuY2xvc2UoKSl9LG4ub24oXCJlcnJvclwiLG89Pntjb25zb2xlLndhcm4oXCJjbG9zaW5nIHNvY2tldCBkdWUgdG8gaW5jb21pbmcgZXJyb3JcIixvKSx0LmNsb3NlKCl9KTtsZXQgaT1uZXcgRHIuV3JpdGFibGUoe29iamVjdE1vZGU6ITAsd3JpdGU6ZnVuY3Rpb24obyxzLGEpe3RyeXt0LnNlbmQoby5kYXRhKX1jYXRjaHtjb25zb2xlLndhcm4oXCJtZXNzYWdlIGxvc3QgZHVyaW5nIHNlbmQ6XCIsbyl9YSgpfX0pO2kub24oXCJlcnJvclwiLG89Pntjb25zb2xlLndhcm4oXCJlcnJvciBkdXJpbmcgd2Vic29ja2V0IHNlbmQsIGlnbm9yaW5nOlwiLG8pfSksaS5vbihcImZpbmlzaFwiLCgpPT57KDAsVXIuZGVmYXVsdCkoXCJtc2w6d2Vic29ja2V0Om91dGdvaW5nXCIpKFwiZmluaXNoXCIpLHQucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5DTE9TRUQmJnQuY2xvc2UoKX0pLHQub25jbG9zZT1vPT57KDAsVXIuZGVmYXVsdCkoXCJtc2w6d2Vic29ja2V0OmNsb3NlXCIpKGAke28uY29kZX1gKSxvLmNvZGU9PT1lbCYmdGhpcy5vblNlcnZlckNsb3NlJiZ0aGlzLm9uU2VydmVyQ2xvc2UoKSxuLnB1c2gobnVsbCksaS5lbmQoKX07c3VwZXIobixpKX1zdGF0aWMgYXN5bmMgb3Blbih0KXtyZXR1cm4gYXdhaXQgdGEodCkudGhlbihuPT5uZXcgRyhuKSl9fTt2YXIgbmk9e307UHQobmkse0h0bWw1Q2FudmFzUGlwZWxpbmU6KCk9PkhyLEh0bWw1VmlkZW9NZXRhZGF0YVBpcGVsaW5lOigpPT5xcixIdG1sNVZpZGVvUGlwZWxpbmU6KCk9Pl90LEh0dHBNc2VQaXBlbGluZTooKT0+R3IsTWV0YWRhdGFQaXBlbGluZTooKT0+anIsUGlwZWxpbmU6KCk9PkJlLFJ0c3BNanBlZ1BpcGVsaW5lOigpPT54dCxSdHNwTXA0UGlwZWxpbmU6KCk9PmJ0LFJ0c3BQaXBlbGluZTooKT0+ZWUsV3NTZHBQaXBlbGluZTooKT0+V3J9KTtjKCk7YygpO3ZhciBCZT1jbGFzc3tjb25zdHJ1Y3RvciguLi5lKXtsZXRbdCwuLi5uXT1lO3RoaXMuX3NldD1uZXcgU2V0KGUpLHRoaXMuZmlyc3RDb21wb25lbnQ9dCx0aGlzLmxhc3RDb21wb25lbnQ9bi5yZWR1Y2UoKGksbyk9PmkuY29ubmVjdChvKSx0KX1pbml0KC4uLmUpe2xldFt0LC4uLm5dPWU7dGhpcy5fc2V0PW5ldyBTZXQoZSksdGhpcy5maXJzdENvbXBvbmVudD10LHRoaXMubGFzdENvbXBvbmVudD1uLnJlZHVjZSgoaSxvKT0+aS5jb25uZWN0KG8pLHQpfWluc2VydEFmdGVyKGUsdCl7aWYoIXRoaXMuX3NldC5oYXMoZSkpdGhyb3cgbmV3IEVycm9yKFwiaW5zZXJ0aW9uIHBvaW50IG5vdCBwYXJ0IG9mIHBpcGVsaW5lXCIpO2lmKHRoaXMuX3NldC5oYXModCkpdGhyb3cgbmV3IEVycm9yKFwibmV3IGNvbXBvbmVudCBhbHJlYWR5IGluIHRoZSBwaXBlbGluZVwiKTtsZXQgbj1lLm5leHQ7cmV0dXJuIG49PT1udWxsPyhlLmNvbm5lY3QodCksdGhpcy5sYXN0Q29tcG9uZW50PXQpOihlLmRpc2Nvbm5lY3QoKSxlLmNvbm5lY3QodCkuY29ubmVjdChuKSksdGhpcy5fc2V0LmFkZCh0KSx0aGlzfWluc2VydEJlZm9yZShlLHQpe2lmKCF0aGlzLl9zZXQuaGFzKGUpKXRocm93IG5ldyBFcnJvcihcImluc2VydGlvbiBwb2ludCBub3QgcGFydCBvZiBwaXBlbGluZVwiKTtpZih0aGlzLl9zZXQuaGFzKHQpKXRocm93IG5ldyBFcnJvcihcIm5ldyBjb21wb25lbnQgYWxyZWFkeSBpbiB0aGUgcGlwZWxpbmVcIik7bGV0IG49ZS5wcmV2O3JldHVybiBuPT09bnVsbD8odC5jb25uZWN0KGUpLHRoaXMuZmlyc3RDb21wb25lbnQ9dCk6KG4uZGlzY29ubmVjdCgpLG4uY29ubmVjdCh0KS5jb25uZWN0KGUpKSx0aGlzLl9zZXQuYWRkKHQpLHRoaXN9cmVtb3ZlKGUpe2lmKCF0aGlzLl9zZXQuaGFzKGUpKXRocm93IG5ldyBFcnJvcihcImNvbXBvbmVudCBub3QgcGFydCBvZiBwaXBlbGluZVwiKTtsZXQgdD1lLnByZXYsbj1lLm5leHQ7aWYodD09PW51bGwmJm49PT1udWxsKXRocm93IG5ldyBFcnJvcihcImNhbm5vdCByZW1vdmUgbGFzdCBjb21wb25lbnRcIik7cmV0dXJuIHQ9PT1udWxsJiZuIT09bnVsbD8oZS5kaXNjb25uZWN0KCksdGhpcy5maXJzdENvbXBvbmVudD1uKTp0IT09bnVsbCYmbj09PW51bGw/KHQuZGlzY29ubmVjdCgpLHRoaXMubGFzdENvbXBvbmVudD10KTp0IT09bnVsbCYmbiE9PW51bGwmJih0LmRpc2Nvbm5lY3QoKSxlLmRpc2Nvbm5lY3QoKSx0LmNvbm5lY3QobikpLHRoaXMuX3NldC5kZWxldGUoZSksdGhpc31hcHBlbmQoLi4uZSl7cmV0dXJuIGUuZm9yRWFjaCh0PT57dGhpcy5pbnNlcnRBZnRlcih0aGlzLmxhc3RDb21wb25lbnQsdCl9KSx0aGlzfXByZXBlbmQoLi4uZSl7cmV0dXJuIGUuZm9yRWFjaCh0PT57dGhpcy5pbnNlcnRCZWZvcmUodGhpcy5maXJzdENvbXBvbmVudCx0KX0pLHRoaXN9fTtjKCk7dmFyIGVlPWNsYXNzIGV4dGVuZHMgQmV7Y29uc3RydWN0b3IodCl7bGV0IG49bmV3IG10LGk9bmV3IHl0KHQpO2kub25TZHA9bz0+e3RoaXMub25TZHAmJnRoaXMub25TZHAobyl9LGkub25QbGF5PW89Pnt0aGlzLm9uUGxheSYmdGhpcy5vblBsYXkobyl9O3N1cGVyKG4saSk7dGhpcy5ydHNwPWl9fTtjKCk7dmFyIGJ0PWNsYXNzIGV4dGVuZHMgZWV7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7bGV0IG49bmV3IGN0LGk9bmV3IG90LG89bmV3IHB0O28ub25TeW5jPXM9Pnt0aGlzLm9uU3luYyYmdGhpcy5vblN5bmMocyl9LHRoaXMuYXBwZW5kKG4saSxvKSx0aGlzLl9tcDRNdXhlcj1vfWdldCBiaXRyYXRlKCl7cmV0dXJuIHRoaXMuX21wNE11eGVyLmJpdHJhdGV9Z2V0IGZyYW1lcmF0ZSgpe3JldHVybiB0aGlzLl9tcDRNdXhlci5mcmFtZXJhdGV9fTtjKCk7dmFyIHh0PWNsYXNzIGV4dGVuZHMgZWV7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7bGV0IHQ9bmV3IGx0O3RoaXMuYXBwZW5kKHQpfX07YygpO2MoKTtjKCk7dmFyIE1lPUMobmEoKSksTnI9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMubmM9KCk9PigrK3RoaXMuY291bnQsdGhpcy5jb3VudC50b1N0cmluZygxNikucGFkU3RhcnQoOCxcIjBcIikpO3RoaXMuY25vbmNlPSgpPT5uZXcgQXJyYXkoNCkuZmlsbCgwKS5tYXAoKCk9Pk1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoyNTYpKS5tYXAoZT0+ZS50b1N0cmluZygxNikpLmpvaW4oXCJcIik7dGhpcy5oYTE9ZT0+e2xldCB0PXRoaXMuaGExQmFzZTtyZXR1cm4gdGhpcy5hbGdvcml0aG09PT1cIm1kNS1zZXNzXCImJih0PW5ldyBNZS5NZDUoKS5hcHBlbmRTdHIoYCR7dH06JHt0aGlzLm5vbmNlfToke2V9YCkuZW5kKCkudG9TdHJpbmcoKSksdH07dGhpcy5oYTI9KGUsdCxuPVwiXCIpPT57bGV0IGk9bmV3IE1lLk1kNSgpLmFwcGVuZFN0cihgJHtlfToke3R9YCkuZW5kKCkudG9TdHJpbmcoKTtpZih0aGlzLmFsZ29yaXRobT09PVwibWQ1LXNlc3NcIil7bGV0IG89bmV3IE1lLk1kNSgpLmFwcGVuZFN0cihuKS5lbmQoKS50b1N0cmluZygpO2k9bmV3IE1lLk1kNSgpLmFwcGVuZFN0cihgJHtlfToke3R9OiR7b31gKS5lbmQoKS50b1N0cmluZygpfXJldHVybiBpfTt0aGlzLmF1dGhvcml6YXRpb249KGU9XCJHRVRcIix0PVwiXCIsbik9PntsZXQgaT10aGlzLm5jKCksbz10aGlzLmNub25jZSgpLHM9dGhpcy5oYTEobyksYT10aGlzLmhhMihlLHQsbiksdT10aGlzLnFvcD09PXZvaWQgMD9uZXcgTWUuTWQ1KCkuYXBwZW5kU3RyKGAke3N9OiR7dGhpcy5ub25jZX06JHthfWApLmVuZCgpLnRvU3RyaW5nKCk6bmV3IE1lLk1kNSgpLmFwcGVuZFN0cihgJHtzfToke3RoaXMubm9uY2V9OiR7aX06JHtvfToke3RoaXMucW9wfToke2F9YCkuZW5kKCkudG9TdHJpbmcoKSxmPVtdO3JldHVybiBmLnB1c2goYHVzZXJuYW1lPVwiJHt0aGlzLnVzZXJuYW1lfVwiYCksZi5wdXNoKGByZWFsbT1cIiR7dGhpcy5yZWFsbX1cImApLGYucHVzaChgbm9uY2U9XCIke3RoaXMubm9uY2V9XCJgKSxmLnB1c2goYHVyaT1cIiR7dH1cImApLHRoaXMucW9wIT09dm9pZCAwJiYoZi5wdXNoKGBxb3A9JHt0aGlzLnFvcH1gKSxmLnB1c2goYG5jPSR7aX1gKSxmLnB1c2goYGNub25jZT1cIiR7b31cImApKSxmLnB1c2goYHJlc3BvbnNlPVwiJHt1fVwiYCksdGhpcy5vcGFxdWUhPT12b2lkIDAmJmYucHVzaChgb3BhcXVlPVwiJHt0aGlzLm9wYXF1ZX1cImApLGBEaWdlc3QgJHtmLmpvaW4oXCIsIFwiKX1gfTtsZXQgaT1lLmdldChcInJlYWxtXCIpO2lmKGk9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwibm8gcmVhbG0gaW4gZGlnZXN0IGNoYWxsZW5nZVwiKTt0aGlzLnJlYWxtPWksdGhpcy5oYTFCYXNlPW5ldyBNZS5NZDUoKS5hcHBlbmRTdHIoYCR7dH06JHtpfToke259YCkuZW5kKCkudG9TdHJpbmcoKTtsZXQgbz1lLmdldChcIm5vbmNlXCIpO2lmKG89PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwibm8gbm9uY2UgaW4gZGlnZXN0IGNoYWxsZW5nZVwiKTt0aGlzLm5vbmNlPW8sdGhpcy5vcGFxdWU9ZS5nZXQoXCJvcGFxdWVcIik7bGV0IHM9ZS5nZXQoXCJhbGdvcml0aG1cIik7cyE9PXZvaWQgMD9zPT09XCJtZDVcIj90aGlzLmFsZ29yaXRobT1cIm1kNVwiOnM9PT1cIm1kNS1zZXNzXCImJih0aGlzLmFsZ29yaXRobT1cIm1kNS1zZXNzXCIpOnRoaXMuYWxnb3JpdGhtPVwibWQ1XCI7bGV0IGE9ZS5nZXQoXCJxb3BcIik7aWYoYSE9PXZvaWQgMCl7bGV0IHU9YS5zcGxpdChcIixcIikubWFwKGY9PmYudHJpbSgpKTt1LnNvbWUoZj0+Zj09PVwiYXV0aFwiKT90aGlzLnFvcD1cImF1dGhcIjp1LnNvbWUoZj0+Zj09PVwiYXV0aC1pbnRcIikmJih0aGlzLnFvcD1cImF1dGgtaW50XCIpfXRoaXMuY291bnQ9MCx0aGlzLnVzZXJuYW1lPXR9fTtjKCk7dmFyIGlhPXI9PntsZXRbLGUsLi4udF09ci5zcGxpdChcIiBcIiksbj1bXSxpPS9cXHMqKFtePV0rKT1cIihbXlwiXSopXCIsPy9nbSxvO2RvIGlmKG89aS5leGVjKHQuam9pbihcIiBcIikpLG8hPT1udWxsKXtsZXRbLGEsdV09bztuLnB1c2goW2EsdV0pfXdoaWxlKG8hPT1udWxsKTtsZXQgcz1uZXcgTWFwKG4pO3JldHVybnt0eXBlOmUudG9Mb3dlckNhc2UoKSxwYXJhbXM6c319O3ZhciB0bD00MDEscmw9e3VzZXJuYW1lOlwicm9vdFwiLHBhc3N3b3JkOlwicGFzc1wifSxMZT1jbGFzcyBleHRlbmRzIFJ7Y29uc3RydWN0b3IoZT17fSl7bGV0e3VzZXJuYW1lOnQscGFzc3dvcmQ6bn09Z3QocmwsZSk7aWYodD09PXZvaWQgMHx8bj09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJuZWVkIHVzZXJuYW1lIGFuZCBwYXNzd29yZFwiKTtsZXQgaSxvLHM9eWUoZnVuY3Rpb24odSxmLGwpe3UudHlwZT09PTQmJihpPXUsbyYmdS5oZWFkZXJzJiYodS5oZWFkZXJzLkF1dGhvcml6YXRpb249bykpLGwodm9pZCAwLHUpfSksYT15ZShmdW5jdGlvbih1LGYsbCl7aWYodS50eXBlPT09NCYmaHQodS5kYXRhKT09PXRsKXtsZXQgaD11LmRhdGEudG9TdHJpbmcoKS5zcGxpdChgXG5gKS5maW5kKGI9Pi9XV1ctQXV0aC9pLnRlc3QoYikpO2lmKGg9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwiY2Fubm90IGZpbmQgV1dXLUF1dGhlbnRpY2F0ZSBoZWFkZXJcIik7bGV0IG09aWEoaCk7aWYobS50eXBlPT09XCJiYXNpY1wiKW89XCJCYXNpYyBcIitCdWZmZXIuZnJvbSh0K1wiOlwiK24pLnRvU3RyaW5nKFwiYmFzZTY0XCIpO2Vsc2UgaWYobS50eXBlPT09XCJkaWdlc3RcIilvPW5ldyBOcihtLnBhcmFtcyx0LG4pLmF1dGhvcml6YXRpb24oaS5tZXRob2QsaS51cmkpO2Vsc2UgcmV0dXJuO3Mud3JpdGUoaSwoKT0+bCgpKX1lbHNlIGwodm9pZCAwLHUpfSk7c3VwZXIoYSxzKX19O3ZhciBIcj1jbGFzcyBleHRlbmRzIHh0e2NvbnN0cnVjdG9yKHQpe2xldHt3czpuLHJ0c3A6aSxtZWRpYUVsZW1lbnQ6byxhdXRoOnN9PXQ7c3VwZXIoaSk7aWYocyl7bGV0IGY9bmV3IExlKHMpO3RoaXMuaW5zZXJ0QmVmb3JlKHRoaXMucnRzcCxmKX1sZXQgYT1uZXcgc3Qobyk7YS5vbkNhbnBsYXk9KCk9PnthLnBsYXkoKSx0aGlzLm9uQ2FucGxheSYmdGhpcy5vbkNhbnBsYXkoKX0sYS5vblN5bmM9Zj0+e3RoaXMub25TeW5jJiZ0aGlzLm9uU3luYyhmKX0sdGhpcy5hcHBlbmQoYSksdGhpcy5fc2luaz1hO2xldCB1PUcub3BlbihuKTt0aGlzLnJlYWR5PXUudGhlbihmPT57Zi5vblNlcnZlckNsb3NlPSgpPT57dGhpcy5vblNlcnZlckNsb3NlJiZ0aGlzLm9uU2VydmVyQ2xvc2UoKX0sdGhpcy5wcmVwZW5kKGYpLHRoaXMuX3NyYz1mfSl9Y2xvc2UoKXt0aGlzLl9zcmMmJnRoaXMuX3NyYy5vdXRnb2luZy5lbmQoKX1nZXQgY3VycmVudFRpbWUoKXtyZXR1cm4gdGhpcy5fc2luay5jdXJyZW50VGltZX1wbGF5KCl7cmV0dXJuIHRoaXMuX3NpbmsucGxheSgpfXBhdXNlKCl7cmV0dXJuIHRoaXMuX3NpbmsucGF1c2UoKX1nZXQgYml0cmF0ZSgpe3JldHVybiB0aGlzLl9zaW5rLmJpdHJhdGV9Z2V0IGZyYW1lcmF0ZSgpe3JldHVybiB0aGlzLl9zaW5rLmZyYW1lcmF0ZX19O2MoKTt2YXIgX3Q9Y2xhc3MgZXh0ZW5kcyBidHtjb25zdHJ1Y3Rvcih0KXtsZXR7d3M6bixydHNwOmksbWVkaWFFbGVtZW50Om8sYXV0aDpzfT10O3N1cGVyKGkpO2lmKHMpe2xldCBmPW5ldyBMZShzKTt0aGlzLmluc2VydEJlZm9yZSh0aGlzLnJ0c3AsZil9bGV0IGE9bmV3IFRlKG8pO2Eub25Tb3VyY2VPcGVuPShmLGwpPT57dGhpcy50cmFja3M9bCx0aGlzLm9uU291cmNlT3BlbiYmdGhpcy5vblNvdXJjZU9wZW4oZixsKX0sdGhpcy5hcHBlbmQoYSksdGhpcy5fc2luaz1hO2xldCB1PUcub3BlbihuKTt0aGlzLnJlYWR5PXUudGhlbihmPT57Zi5vblNlcnZlckNsb3NlPSgpPT57dGhpcy5vblNlcnZlckNsb3NlJiZ0aGlzLm9uU2VydmVyQ2xvc2UoKX0sdGhpcy5wcmVwZW5kKGYpLHRoaXMuX3NyYz1mfSl9Y2xvc2UoKXt0aGlzLl9zcmMmJnRoaXMuX3NyYy5vdXRnb2luZy5lbmQoKX1nZXQgY3VycmVudFRpbWUoKXtyZXR1cm4gdGhpcy5fc2luay5jdXJyZW50VGltZX1hc3luYyBwbGF5KCl7cmV0dXJuIGF3YWl0IHRoaXMuX3NpbmsucGxheSgpfXBhdXNlKCl7cmV0dXJuIHRoaXMuX3NpbmsucGF1c2UoKX19O2MoKTt2YXIgcXI9Y2xhc3MgZXh0ZW5kcyBfdHtjb25zdHJ1Y3RvcihlKXtsZXR7bWV0YWRhdGFIYW5kbGVyOnR9PWU7c3VwZXIoZSk7bGV0IG49bmV3IENlO3RoaXMuaW5zZXJ0QWZ0ZXIodGhpcy5ydHNwLG4pO2xldCBpPVIuZnJvbUhhbmRsZXJzKG89PntvLnR5cGU9PT05JiZ0KG8pfSx2b2lkIDApO3RoaXMuaW5zZXJ0QWZ0ZXIobixpKX19O2MoKTt2YXIgbmw9e3BhcmFtZXRlcnM6W1wiYXVkaW89MFwiLFwidmlkZW89MFwiLFwiZXZlbnQ9b25cIixcInB0ej1hbGxcIl19LGpyPWNsYXNzIGV4dGVuZHMgZWV7Y29uc3RydWN0b3IodCl7bGV0e3dzOm4scnRzcDppLG1ldGFkYXRhSGFuZGxlcjpvfT10O3N1cGVyKE9iamVjdC5hc3NpZ24oe30sbmwsaSkpO2xldCBzPW5ldyBDZTt0aGlzLmFwcGVuZChzKTtsZXQgYT1RLmZyb21IYW5kbGVyKGY9PntmLnR5cGU9PT05JiZvKGYpfSk7dGhpcy5hcHBlbmQoYSk7bGV0IHU9Ry5vcGVuKG4pO3RoaXMucmVhZHk9dS50aGVuKGY9PntmLm9uU2VydmVyQ2xvc2U9KCk9Pnt0aGlzLm9uU2VydmVyQ2xvc2UmJnRoaXMub25TZXJ2ZXJDbG9zZSgpfSx0aGlzLnByZXBlbmQoZiksdGhpcy5fc3JjPWZ9KX1jbG9zZSgpe3RoaXMuX3NyYyYmdGhpcy5fc3JjLm91dGdvaW5nLmVuZCgpfX07YygpO3ZhciBXcj1jbGFzcyBleHRlbmRzIGVle2NvbnN0cnVjdG9yKHQpe2xldHt3czpuLHJ0c3A6aSxhdXRoOm99PXQ7c3VwZXIoaSk7aWYobyl7bGV0IGE9bmV3IExlKG8pO3RoaXMuaW5zZXJ0QmVmb3JlKHRoaXMucnRzcCxhKX1sZXQgcz1HLm9wZW4obik7dGhpcy5yZWFkeT1zLnRoZW4oYT0+e2Eub25TZXJ2ZXJDbG9zZT0oKT0+e3RoaXMub25TZXJ2ZXJDbG9zZSYmdGhpcy5vblNlcnZlckNsb3NlKCl9LHRoaXMucHJlcGVuZChhKSx0aGlzLl9zcmM9YX0pfWNsb3NlKCl7dGhpcy5fc3JjJiZ0aGlzLl9zcmMub3V0Z29pbmcuZW5kKCl9Z2V0IHNkcCgpe3JldHVybiB0aGlzLnJlYWR5LnRoZW4oYXN5bmMoKT0+e2xldCB0PW5ldyBQcm9taXNlKG49Pnt0aGlzLnJ0c3Aub25TZHA9bn0pO3JldHVybiB0aGlzLnJ0c3Auc2VuZCh7bWV0aG9kOlwiREVTQ1JJQkVcIn0pLHRoaXMucnRzcC5zZW5kKHttZXRob2Q6XCJURUFSRE9XTlwifSksYXdhaXQgdH0pfX07YygpO2MoKTt2YXIgb2E9QyhsZSgpKTt2YXIgc2E9QyhOKCkpO3ZhciByaT0oMCxvYS5kZWZhdWx0KShcIm1zbDpodHRwLW1wNFwiKSwkcj1jbGFzcyBleHRlbmRzIFZ7Y29uc3RydWN0b3IodCl7bGV0e3VyaTpuLG9wdGlvbnM6aX09dCxvPW5ldyBzYS5SZWFkYWJsZSh7b2JqZWN0TW9kZTohMCxyZWFkOmZ1bmN0aW9uKCl7fX0pO28ub24oXCJlcnJvclwiLHM9Pntjb25zb2xlLndhcm4oXCJjbG9zaW5nIHNvY2tldCBkdWUgdG8gaW5jb21pbmcgZXJyb3JcIixzKSx0aGlzLl9yZWFkZXImJnRoaXMuX3JlYWRlci5jYW5jZWwoKX0pO3N1cGVyKG8pO28uX3JlYWQ9KCk9Pnt0aGlzLl9wdWxsKCl9LHRoaXMudXJpPW4sdGhpcy5vcHRpb25zPWksdGhpcy5fYWxsRG9uZT0hMX1wbGF5KCl7aWYodGhpcy51cmk9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwiY2Fubm90IHN0YXJ0IHBsYXlpbmcgd2hlbiB0aGVyZSBpcyBubyBVUklcIik7dGhpcy5fYWJvcnRDb250cm9sbGVyPW5ldyBBYm9ydENvbnRyb2xsZXIsdGhpcy5sZW5ndGg9MCxmZXRjaCh0aGlzLnVyaSx7Y3JlZGVudGlhbHM6XCJpbmNsdWRlXCIsc2lnbmFsOnRoaXMuX2Fib3J0Q29udHJvbGxlci5zaWduYWwsLi4udGhpcy5vcHRpb25zfSkudGhlbih0PT57aWYodC5ib2R5PT09bnVsbCl0aHJvdyBuZXcgRXJyb3IoXCJlbXB0eSByZXNwb25zZSBib2R5XCIpO2xldCBuPXQuaGVhZGVycy5nZXQoXCJDb250ZW50LVR5cGVcIik7dGhpcy5pbmNvbWluZy5wdXNoKHtkYXRhOkJ1ZmZlci5hbGxvYygwKSx0eXBlOjgsbWltZTpufSksdGhpcy5vbkhlYWRlcnMmJnRoaXMub25IZWFkZXJzKHQuaGVhZGVycyksdGhpcy5fcmVhZGVyPXQuYm9keS5nZXRSZWFkZXIoKSx0aGlzLl9wdWxsKCl9KS5jYXRjaCh0PT57Y29uc29sZS5lcnJvcihcImh0dHAtc291cmNlOiBmZXRjaCBmYWlsZWQ6IFwiLHQpfSl9YWJvcnQoKXt0aGlzLl9yZWFkZXImJnRoaXMuX3JlYWRlci5jYW5jZWwoKS5jYXRjaCh0PT57Y29uc29sZS5sb2coXCJodHRwLXNvdXJjZTogY2FuY2VsIHJlYWRlciBmYWlsZWQ6IFwiLHQpfSksdGhpcy5fYWJvcnRDb250cm9sbGVyJiZ0aGlzLl9hYm9ydENvbnRyb2xsZXIuYWJvcnQoKX1faXNDbG9zZWQoKXtyZXR1cm4gdGhpcy5fYWxsRG9uZX1fY2xvc2UoKXt0aGlzLl9yZWFkZXI9dm9pZCAwLHRoaXMuX2FsbERvbmU9ITAsdGhpcy5pbmNvbWluZy5wdXNoKG51bGwpLHRoaXMub25TZXJ2ZXJDbG9zZT8uKCl9X3B1bGwoKXt0aGlzLl9yZWFkZXIhPT12b2lkIDAmJnRoaXMuX3JlYWRlci5yZWFkKCkudGhlbigoe2RvbmU6dCx2YWx1ZTpufSk9PntpZih0KXt0aGlzLl9pc0Nsb3NlZCgpfHwocmkoXCJmZXRjaCBjb21wbGV0ZWQsIHRvdGFsIGRvd25sb2FkZWQ6IFwiLHRoaXMubGVuZ3RoLFwiIGJ5dGVzXCIpLHRoaXMuX2Nsb3NlKCkpO3JldHVybn1pZihuPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcImV4cGVjdGVkIHZhbHVlIHRvIGJlIGRlZmluZWRcIik7aWYodGhpcy5sZW5ndGg9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwiZXhwZWN0ZWQgbGVuZ3RoIHRvIGJlIGRlZmluZWRcIik7dGhpcy5sZW5ndGgrPW4ubGVuZ3RoO2xldCBpPUJ1ZmZlci5mcm9tKG4pO3RoaXMuaW5jb21pbmcucHVzaCh7ZGF0YTppLHR5cGU6OH0pP3RoaXMuX3B1bGwoKTpyaShcImRvd25zdHJlYW0gYmFjayBwcmVzc3VyZTogcGF1c2luZyByZWFkXCIpfSkuY2F0Y2godD0+e3JpKFwiaHR0cC1zb3VyY2U6IHJlYWQgZmFpbGVkOiBcIix0KSx0aGlzLl9pc0Nsb3NlZCgpfHx0aGlzLl9jbG9zZSgpfSl9fTt2YXIgR3I9Y2xhc3MgZXh0ZW5kcyBCZXtjb25zdHJ1Y3Rvcih0KXtsZXR7aHR0cDpuLG1lZGlhRWxlbWVudDppfT10LG89bmV3ICRyKG4pLHM9bmV3IFRlKGkpO28ub25IZWFkZXJzPWE9Pnt0aGlzLm9uSGVhZGVycyYmdGhpcy5vbkhlYWRlcnMoYSl9LG8ub25TZXJ2ZXJDbG9zZT0oKT0+dGhpcy5vblNlcnZlckNsb3NlPy4oKTtzdXBlcihvLHMpO3RoaXMuX3NyYz1vLHRoaXMuX3Npbms9cyx0aGlzLmh0dHA9b31jbG9zZSgpe3RoaXMuX3NyYyYmdGhpcy5fc3JjLmFib3J0KCl9Z2V0IGN1cnJlbnRUaW1lKCl7cmV0dXJuIHRoaXMuX3NpbmsuY3VycmVudFRpbWV9YXN5bmMgcGxheSgpe3JldHVybiBhd2FpdCB0aGlzLl9zaW5rLnBsYXkoKX1wYXVzZSgpe3JldHVybiB0aGlzLl9zaW5rLnBhdXNlKCl9fTt2YXIgaWk9e307UHQoaWkse1JUQ1BQYWNrZXRUeXBlOigpPT5LbixTREVTSXRlbTooKT0+Sm4sU1I6KCk9PkhzLFNjaGVkdWxlcjooKT0+V2UsYWRkUlRTUFJldHJ5OigpPT5hYSxib2R5T2Zmc2V0OigpPT5BcixjU3JjOigpPT5ucyxjU3JjQ291bnQ6KCk9PlNlLGNvbm5lY3Rpb25FbmRlZDooKT0+THIsY29udGVudEJhc2U6KCk9PkJyLGNvbnRlbnRMb2NhdGlvbjooKT0+TXIsZXh0SGVhZGVyOigpPT5pcyxleHRIZWFkZXJMZW5ndGg6KCk9Pk10LGV4dGVuc2lvbjooKT0+b3IsZXh0cmFjdEhlYWRlclZhbHVlOigpPT5yZSxleHRyYWN0VVJJczooKT0+SnMsZ2V0VGltZTooKT0+UHIsaXNSdGNwQXBwOigpPT4kcyxpc1J0Y3BCeWU6KCk9PndyLGlzUnRjcFJSOigpPT5qcyxpc1J0Y3BTREVTOigpPT5Xcyxpc1J0Y3BTUjooKT0+X3IsbWFya2VyOigpPT5jZSxtZXNzYWdlRnJvbUJ1ZmZlcjooKT0+U3IscGFkZGluZzooKT0+ZXMscGFyc2U6KCk9PlFuLHBhcnNlUnRjcDooKT0+WG4scGF5bG9hZDooKT0+WixwYXlsb2FkVHlwZTooKT0+TyxyYW5nZTooKT0+SXIscnRjcE1lc3NhZ2VGcm9tQnVmZmVyOigpPT54cixzU3JjOigpPT5ycyxzZXF1ZW5jZTooKT0+UnIsc2VxdWVuY2VOdW1iZXI6KCk9PnRzLHNlc3Npb25JZDooKT0+VHIsc2Vzc2lvblRpbWVvdXQ6KCk9PkNyLHN0YXR1c0NvZGU6KCk9Pmh0LHRpbWVzdGFtcDooKT0+SCx2ZXJzaW9uOigpPT5ab30pO2MoKTtjKCk7YygpO3ZhciBhYT0ocix7bWF4UmV0cmllczplLGVycm9yczp0fT17bWF4UmV0cmllczoyMCxlcnJvcnM6WzUwM119KT0+e2xldCBuPTAsaT1yLm9uRXJyb3I7ci5vbkVycm9yPW89PntpZihpPy4obyksISF0LmluY2x1ZGVzKG8uY29kZSkpe2lmKChuKz0xKT5lKXtjb25zb2xlLmxvZyhcInJldHJ5LCB0b28gbWFueVwiLG4sZSk7cmV0dXJufXNldFRpbWVvdXQoKCk9PnIucmV0cnk/LigpLG4qMTAwKX19fTtcbi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyohIGllZWU3NTQuIEJTRC0zLUNsYXVzZSBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbi8qISBzYWZlLWJ1ZmZlci4gTUlUIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqL1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguY2pzLmpzLm1hcFxuIiwiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydHMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcbmV4cG9ydHMudG9CeXRlQXJyYXkgPSB0b0J5dGVBcnJheVxuZXhwb3J0cy5mcm9tQnl0ZUFycmF5ID0gZnJvbUJ5dGVBcnJheVxuXG52YXIgbG9va3VwID0gW11cbnZhciByZXZMb29rdXAgPSBbXVxudmFyIEFyciA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4QXJyYXkgOiBBcnJheVxuXG52YXIgY29kZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJ1xuZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNvZGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgbG9va3VwW2ldID0gY29kZVtpXVxuICByZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXSA9IGlcbn1cblxuLy8gU3VwcG9ydCBkZWNvZGluZyBVUkwtc2FmZSBiYXNlNjQgc3RyaW5ncywgYXMgTm9kZS5qcyBkb2VzLlxuLy8gU2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CYXNlNjQjVVJMX2FwcGxpY2F0aW9uc1xucmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyXG5yZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjNcblxuZnVuY3Rpb24gZ2V0TGVucyAoYjY0KSB7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG5cbiAgaWYgKGxlbiAlIDQgPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0JylcbiAgfVxuXG4gIC8vIFRyaW0gb2ZmIGV4dHJhIGJ5dGVzIGFmdGVyIHBsYWNlaG9sZGVyIGJ5dGVzIGFyZSBmb3VuZFxuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9iZWF0Z2FtbWl0L2Jhc2U2NC1qcy9pc3N1ZXMvNDJcbiAgdmFyIHZhbGlkTGVuID0gYjY0LmluZGV4T2YoJz0nKVxuICBpZiAodmFsaWRMZW4gPT09IC0xKSB2YWxpZExlbiA9IGxlblxuXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSB2YWxpZExlbiA9PT0gbGVuXG4gICAgPyAwXG4gICAgOiA0IC0gKHZhbGlkTGVuICUgNClcblxuICByZXR1cm4gW3ZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW5dXG59XG5cbi8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoYjY0KSB7XG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpXG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF1cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV1cbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIF9ieXRlTGVuZ3RoIChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pIHtcbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIHRvQnl0ZUFycmF5IChiNjQpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG5cbiAgdmFyIGFyciA9IG5ldyBBcnIoX2J5dGVMZW5ndGgoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSlcblxuICB2YXIgY3VyQnl0ZSA9IDBcblxuICAvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzXG4gIHZhciBsZW4gPSBwbGFjZUhvbGRlcnNMZW4gPiAwXG4gICAgPyB2YWxpZExlbiAtIDRcbiAgICA6IHZhbGlkTGVuXG5cbiAgdmFyIGlcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgMTIpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA8PCA2KSB8XG4gICAgICByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXVxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiAxNikgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMikge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPj4gNClcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDEpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCA0KSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPj4gMilcbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIHRyaXBsZXRUb0Jhc2U2NCAobnVtKSB7XG4gIHJldHVybiBsb29rdXBbbnVtID4+IDE4ICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gMTIgJiAweDNGXSArXG4gICAgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gJiAweDNGXVxufVxuXG5mdW5jdGlvbiBlbmNvZGVDaHVuayAodWludDgsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHRtcFxuICB2YXIgb3V0cHV0ID0gW11cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IDMpIHtcbiAgICB0bXAgPVxuICAgICAgKCh1aW50OFtpXSA8PCAxNikgJiAweEZGMDAwMCkgK1xuICAgICAgKCh1aW50OFtpICsgMV0gPDwgOCkgJiAweEZGMDApICtcbiAgICAgICh1aW50OFtpICsgMl0gJiAweEZGKVxuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKVxuICB9XG4gIHJldHVybiBvdXRwdXQuam9pbignJylcbn1cblxuZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSAodWludDgpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVuID0gdWludDgubGVuZ3RoXG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuICB2YXIgcGFydHMgPSBbXVxuICB2YXIgbWF4Q2h1bmtMZW5ndGggPSAxNjM4MyAvLyBtdXN0IGJlIG11bHRpcGxlIG9mIDNcblxuICAvLyBnbyB0aHJvdWdoIHRoZSBhcnJheSBldmVyeSB0aHJlZSBieXRlcywgd2UnbGwgZGVhbCB3aXRoIHRyYWlsaW5nIHN0dWZmIGxhdGVyXG4gIGZvciAodmFyIGkgPSAwLCBsZW4yID0gbGVuIC0gZXh0cmFCeXRlczsgaSA8IGxlbjI7IGkgKz0gbWF4Q2h1bmtMZW5ndGgpIHtcbiAgICBwYXJ0cy5wdXNoKGVuY29kZUNodW5rKHVpbnQ4LCBpLCAoaSArIG1heENodW5rTGVuZ3RoKSA+IGxlbjIgPyBsZW4yIDogKGkgKyBtYXhDaHVua0xlbmd0aCkpKVxuICB9XG5cbiAgLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdXG4gICAgcGFydHMucHVzaChcbiAgICAgIGxvb2t1cFt0bXAgPj4gMl0gK1xuICAgICAgbG9va3VwWyh0bXAgPDwgNCkgJiAweDNGXSArXG4gICAgICAnPT0nXG4gICAgKVxuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDEwXSArXG4gICAgICBsb29rdXBbKHRtcCA+PiA0KSAmIDB4M0ZdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDIpICYgMHgzRl0gK1xuICAgICAgJz0nXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJycpXG59XG4iLCIvKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5cbid1c2Ugc3RyaWN0J1xuXG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnYmFzZTY0LWpzJylcbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxudmFyIEtfTUFYX0xFTkdUSCA9IDB4N2ZmZmZmZmZcbmV4cG9ydHMua01heExlbmd0aCA9IEtfTUFYX0xFTkdUSFxuXG4vKipcbiAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICogICA9PT0gZmFsc2UgICBQcmludCB3YXJuaW5nIGFuZCByZWNvbW1lbmQgdXNpbmcgYGJ1ZmZlcmAgdjQueCB3aGljaCBoYXMgYW4gT2JqZWN0XG4gKiAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICpcbiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAqXG4gKiBXZSByZXBvcnQgdGhhdCB0aGUgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBpZiB0aGUgYXJlIG5vdCBzdWJjbGFzc2FibGVcbiAqIHVzaW5nIF9fcHJvdG9fXy4gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWBcbiAqIChTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOCkuIElFIDEwIGxhY2tzIHN1cHBvcnRcbiAqIGZvciBfX3Byb3RvX18gYW5kIGhhcyBhIGJ1Z2d5IHR5cGVkIGFycmF5IGltcGxlbWVudGF0aW9uLlxuICovXG5CdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IHR5cGVkQXJyYXlTdXBwb3J0KClcblxuaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICBjb25zb2xlLmVycm9yKFxuICAgICdUaGlzIGJyb3dzZXIgbGFja3MgdHlwZWQgYXJyYXkgKFVpbnQ4QXJyYXkpIHN1cHBvcnQgd2hpY2ggaXMgcmVxdWlyZWQgYnkgJyArXG4gICAgJ2BidWZmZXJgIHY1LnguIFVzZSBgYnVmZmVyYCB2NC54IGlmIHlvdSByZXF1aXJlIG9sZCBicm93c2VyIHN1cHBvcnQuJ1xuICApXG59XG5cbmZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0ICgpIHtcbiAgLy8gQ2FuIHR5cGVkIGFycmF5IGluc3RhbmNlcyBjYW4gYmUgYXVnbWVudGVkP1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSgxKVxuICAgIGFyci5fX3Byb3RvX18gPSB7IF9fcHJvdG9fXzogVWludDhBcnJheS5wcm90b3R5cGUsIGZvbzogZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfSB9XG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDJcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIucHJvdG90eXBlLCAncGFyZW50Jywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0aGlzKSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIHJldHVybiB0aGlzLmJ1ZmZlclxuICB9XG59KVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwgJ29mZnNldCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGhpcykpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5ieXRlT2Zmc2V0XG4gIH1cbn0pXG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciAobGVuZ3RoKSB7XG4gIGlmIChsZW5ndGggPiBLX01BWF9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJyArIGxlbmd0aCArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKVxuICB9XG4gIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG4gIHZhciBidWYgPSBuZXcgVWludDhBcnJheShsZW5ndGgpXG4gIGJ1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIHJldHVybiBidWZcbn1cblxuLyoqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGhhdmUgdGhlaXJcbiAqIHByb3RvdHlwZSBjaGFuZ2VkIHRvIGBCdWZmZXIucHJvdG90eXBlYC4gRnVydGhlcm1vcmUsIGBCdWZmZXJgIGlzIGEgc3ViY2xhc3Mgb2ZcbiAqIGBVaW50OEFycmF5YCwgc28gdGhlIHJldHVybmVkIGluc3RhbmNlcyB3aWxsIGhhdmUgYWxsIHRoZSBub2RlIGBCdWZmZXJgIG1ldGhvZHNcbiAqIGFuZCB0aGUgYFVpbnQ4QXJyYXlgIG1ldGhvZHMuIFNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0XG4gKiByZXR1cm5zIGEgc2luZ2xlIG9jdGV0LlxuICpcbiAqIFRoZSBgVWludDhBcnJheWAgcHJvdG90eXBlIHJlbWFpbnMgdW5tb2RpZmllZC5cbiAqL1xuXG5mdW5jdGlvbiBCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4gUmVjZWl2ZWQgdHlwZSBudW1iZXInXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBhbGxvY1Vuc2FmZShhcmcpXG4gIH1cbiAgcmV0dXJuIGZyb20oYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbi8vIEZpeCBzdWJhcnJheSgpIGluIEVTMjAxNi4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzk3XG5pZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnNwZWNpZXMgIT0gbnVsbCAmJlxuICAgIEJ1ZmZlcltTeW1ib2wuc3BlY2llc10gPT09IEJ1ZmZlcikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLCBTeW1ib2wuc3BlY2llcywge1xuICAgIHZhbHVlOiBudWxsLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSlcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbmZ1bmN0aW9uIGZyb20gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldClcbiAgfVxuXG4gIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUxpa2UodmFsdWUpXG4gIH1cblxuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHRocm93IFR5cGVFcnJvcihcbiAgICAgICdUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCAnICtcbiAgICAgICdvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSAnICsgKHR5cGVvZiB2YWx1ZSlcbiAgICApXG4gIH1cblxuICBpZiAoaXNJbnN0YW5jZSh2YWx1ZSwgQXJyYXlCdWZmZXIpIHx8XG4gICAgICAodmFsdWUgJiYgaXNJbnN0YW5jZSh2YWx1ZS5idWZmZXIsIEFycmF5QnVmZmVyKSkpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwidmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSBudW1iZXInXG4gICAgKVxuICB9XG5cbiAgdmFyIHZhbHVlT2YgPSB2YWx1ZS52YWx1ZU9mICYmIHZhbHVlLnZhbHVlT2YoKVxuICBpZiAodmFsdWVPZiAhPSBudWxsICYmIHZhbHVlT2YgIT09IHZhbHVlKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlT2YsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIHZhciBiID0gZnJvbU9iamVjdCh2YWx1ZSlcbiAgaWYgKGIpIHJldHVybiBiXG5cbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1ByaW1pdGl2ZSAhPSBudWxsICYmXG4gICAgICB0eXBlb2YgdmFsdWVbU3ltYm9sLnRvUHJpbWl0aXZlXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShcbiAgICAgIHZhbHVlW1N5bWJvbC50b1ByaW1pdGl2ZV0oJ3N0cmluZycpLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGhcbiAgICApXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICdUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCAnICtcbiAgICAnb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyArICh0eXBlb2YgdmFsdWUpXG4gIClcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbSh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG4vLyBOb3RlOiBDaGFuZ2UgcHJvdG90eXBlICphZnRlciogQnVmZmVyLmZyb20gaXMgZGVmaW5lZCB0byB3b3JrYXJvdW5kIENocm9tZSBidWc6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzE0OFxuQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuQnVmZmVyLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXlcblxuZnVuY3Rpb24gYXNzZXJ0U2l6ZSAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlcicpXG4gIH0gZWxzZSBpZiAoc2l6ZSA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJyArIHNpemUgKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJylcbiAgfVxufVxuXG5mdW5jdGlvbiBhbGxvYyAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICBpZiAoc2l6ZSA8PSAwKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplKVxuICB9XG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPbmx5IHBheSBhdHRlbnRpb24gdG8gZW5jb2RpbmcgaWYgaXQncyBhIHN0cmluZy4gVGhpc1xuICAgIC8vIHByZXZlbnRzIGFjY2lkZW50YWxseSBzZW5kaW5nIGluIGEgbnVtYmVyIHRoYXQgd291bGRcbiAgICAvLyBiZSBpbnRlcnByZXR0ZWQgYXMgYSBzdGFydCBvZmZzZXQuXG4gICAgcmV0dXJuIHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZydcbiAgICAgID8gY3JlYXRlQnVmZmVyKHNpemUpLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgICA6IGNyZWF0ZUJ1ZmZlcihzaXplKS5maWxsKGZpbGwpXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqIGFsbG9jKHNpemVbLCBmaWxsWywgZW5jb2RpbmddXSlcbiAqKi9cbkJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICByZXR1cm4gYWxsb2Moc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlIChzaXplKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplIDwgMCA/IDAgOiBjaGVja2VkKHNpemUpIHwgMClcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB2YXIgYnVmID0gY3JlYXRlQnVmZmVyKGxlbmd0aClcblxuICB2YXIgYWN0dWFsID0gYnVmLndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG5cbiAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgLy8gY2F1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIgdG8gYmUgaWdub3JlZC4gKGUuZy5cbiAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICBidWYgPSBidWYuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlMaWtlIChhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHZhciBidWYgPSBjcmVhdGVCdWZmZXIobGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgYnVmW2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJvZmZzZXRcIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcImxlbmd0aFwiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICB2YXIgYnVmXG4gIGlmIChieXRlT2Zmc2V0ID09PSB1bmRlZmluZWQgJiYgbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0KVxuICB9IGVsc2Uge1xuICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICBidWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICB2YXIgYnVmID0gY3JlYXRlQnVmZmVyKGxlbilcblxuICAgIGlmIChidWYubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gYnVmXG4gICAgfVxuXG4gICAgb2JqLmNvcHkoYnVmLCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIGJ1ZlxuICB9XG5cbiAgaWYgKG9iai5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgbnVtYmVySXNOYU4ob2JqLmxlbmd0aCkpIHtcbiAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIoMClcbiAgICB9XG4gICAgcmV0dXJuIGZyb21BcnJheUxpa2Uob2JqKVxuICB9XG5cbiAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBBcnJheS5pc0FycmF5KG9iai5kYXRhKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKG9iai5kYXRhKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBLX01BWF9MRU5HVEhgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0gS19NQVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIEtfTUFYX0xFTkdUSC50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgbGVuZ3RoID0gMFxuICB9XG4gIHJldHVybiBCdWZmZXIuYWxsb2MoK2xlbmd0aClcbn1cblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuIGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlciA9PT0gdHJ1ZSAmJlxuICAgIGIgIT09IEJ1ZmZlci5wcm90b3R5cGUgLy8gc28gQnVmZmVyLmlzQnVmZmVyKEJ1ZmZlci5wcm90b3R5cGUpIHdpbGwgYmUgZmFsc2Vcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmIChpc0luc3RhbmNlKGEsIFVpbnQ4QXJyYXkpKSBhID0gQnVmZmVyLmZyb20oYSwgYS5vZmZzZXQsIGEuYnl0ZUxlbmd0aClcbiAgaWYgKGlzSW5zdGFuY2UoYiwgVWludDhBcnJheSkpIGIgPSBCdWZmZXIuZnJvbShiLCBiLm9mZnNldCwgYi5ieXRlTGVuZ3RoKVxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJidWYxXCIsIFwiYnVmMlwiIGFyZ3VtZW50cyBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5J1xuICAgIClcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gIHZhciB4ID0gYS5sZW5ndGhcbiAgdmFyIHkgPSBiLmxlbmd0aFxuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgIHggPSBhW2ldXG4gICAgICB5ID0gYltpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbkJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgc3dpdGNoIChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbkJ1ZmZlci5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQgKGxpc3QsIGxlbmd0aCkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICB2YXIgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aClcbiAgdmFyIHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgYnVmID0gbGlzdFtpXVxuICAgIGlmIChpc0luc3RhbmNlKGJ1ZiwgVWludDhBcnJheSkpIHtcbiAgICAgIGJ1ZiA9IEJ1ZmZlci5mcm9tKGJ1ZilcbiAgICB9XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgICB9XG4gICAgYnVmLmNvcHkoYnVmZmVyLCBwb3MpXG4gICAgcG9zICs9IGJ1Zi5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5sZW5ndGhcbiAgfVxuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgaXNJbnN0YW5jZShzdHJpbmcsIEFycmF5QnVmZmVyKSkge1xuICAgIHJldHVybiBzdHJpbmcuYnl0ZUxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgb3IgQXJyYXlCdWZmZXIuICcgK1xuICAgICAgJ1JlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBzdHJpbmdcbiAgICApXG4gIH1cblxuICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbXVzdE1hdGNoID0gKGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSA9PT0gdHJ1ZSlcbiAgaWYgKCFtdXN0TWF0Y2ggJiYgbGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsZW5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB7XG4gICAgICAgICAgcmV0dXJuIG11c3RNYXRjaCA/IC0xIDogdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgfVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5cbmZ1bmN0aW9uIHNsb3dUb1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcblxuICAvLyBObyBuZWVkIHRvIHZlcmlmeSB0aGF0IFwidGhpcy5sZW5ndGggPD0gTUFYX1VJTlQzMlwiIHNpbmNlIGl0J3MgYSByZWFkLW9ubHlcbiAgLy8gcHJvcGVydHkgb2YgYSB0eXBlZCBhcnJheS5cblxuICAvLyBUaGlzIGJlaGF2ZXMgbmVpdGhlciBsaWtlIFN0cmluZyBub3IgVWludDhBcnJheSBpbiB0aGF0IHdlIHNldCBzdGFydC9lbmRcbiAgLy8gdG8gdGhlaXIgdXBwZXIvbG93ZXIgYm91bmRzIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgb3V0IG9mIHJhbmdlLlxuICAvLyB1bmRlZmluZWQgaXMgaGFuZGxlZCBzcGVjaWFsbHkgYXMgcGVyIEVDTUEtMjYyIDZ0aCBFZGl0aW9uLFxuICAvLyBTZWN0aW9uIDEzLjMuMy43IFJ1bnRpbWUgU2VtYW50aWNzOiBLZXllZEJpbmRpbmdJbml0aWFsaXphdGlvbi5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgLy8gUmV0dXJuIGVhcmx5IGlmIHN0YXJ0ID4gdGhpcy5sZW5ndGguIERvbmUgaGVyZSB0byBwcmV2ZW50IHBvdGVudGlhbCB1aW50MzJcbiAgLy8gY29lcmNpb24gZmFpbCBiZWxvdy5cbiAgaWYgKHN0YXJ0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoZW5kIDw9IDApIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIEZvcmNlIGNvZXJzaW9uIHRvIHVpbnQzMi4gVGhpcyB3aWxsIGFsc28gY29lcmNlIGZhbHNleS9OYU4gdmFsdWVzIHRvIDAuXG4gIGVuZCA+Pj49IDBcbiAgc3RhcnQgPj4+PSAwXG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbi8vIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCAoYW5kIHRoZSBgaXMtYnVmZmVyYCBucG0gcGFja2FnZSlcbi8vIHRvIGRldGVjdCBhIEJ1ZmZlciBpbnN0YW5jZS4gSXQncyBub3QgcG9zc2libGUgdG8gdXNlIGBpbnN0YW5jZW9mIEJ1ZmZlcmBcbi8vIHJlbGlhYmx5IGluIGEgYnJvd3NlcmlmeSBjb250ZXh0IGJlY2F1c2UgdGhlcmUgY291bGQgYmUgbXVsdGlwbGUgZGlmZmVyZW50XG4vLyBjb3BpZXMgb2YgdGhlICdidWZmZXInIHBhY2thZ2UgaW4gdXNlLiBUaGlzIG1ldGhvZCB3b3JrcyBldmVuIGZvciBCdWZmZXJcbi8vIGluc3RhbmNlcyB0aGF0IHdlcmUgY3JlYXRlZCBmcm9tIGFub3RoZXIgY29weSBvZiB0aGUgYGJ1ZmZlcmAgcGFja2FnZS5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvaXNzdWVzLzE1NFxuQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlXG5cbmZ1bmN0aW9uIHN3YXAgKGIsIG4sIG0pIHtcbiAgdmFyIGkgPSBiW25dXG4gIGJbbl0gPSBiW21dXG4gIGJbbV0gPSBpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSAyICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMSlcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAzMiA9IGZ1bmN0aW9uIHN3YXAzMiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgNCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDMpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDIpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwNjQgPSBmdW5jdGlvbiBzd2FwNjQgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyA3KVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyA2KVxuICAgIHN3YXAodGhpcywgaSArIDIsIGkgKyA1KVxuICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJydcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1dGY4U2xpY2UodGhpcywgMCwgbGVuZ3RoKVxuICByZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0xvY2FsZVN0cmluZyA9IEJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmdcblxuQnVmZmVyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMgKGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICB2YXIgc3RyID0gJydcbiAgdmFyIG1heCA9IGV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVNcbiAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5yZXBsYWNlKC8oLnsyfSkvZywgJyQxICcpLnRyaW0oKVxuICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKHRhcmdldCwgc3RhcnQsIGVuZCwgdGhpc1N0YXJ0LCB0aGlzRW5kKSB7XG4gIGlmIChpc0luc3RhbmNlKHRhcmdldCwgVWludDhBcnJheSkpIHtcbiAgICB0YXJnZXQgPSBCdWZmZXIuZnJvbSh0YXJnZXQsIHRhcmdldC5vZmZzZXQsIHRhcmdldC5ieXRlTGVuZ3RoKVxuICB9XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcInRhcmdldFwiIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgQnVmZmVyIG9yIFVpbnQ4QXJyYXkuICcgK1xuICAgICAgJ1JlY2VpdmVkIHR5cGUgJyArICh0eXBlb2YgdGFyZ2V0KVxuICAgIClcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gdGFyZ2V0ID8gdGFyZ2V0Lmxlbmd0aCA6IDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzU3RhcnQgPSAwXG4gIH1cbiAgaWYgKHRoaXNFbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNFbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0YXJnZXQubGVuZ3RoIHx8IHRoaXNTdGFydCA8IDAgfHwgdGhpc0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQgJiYgc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuXG4gIHN0YXJ0ID4+Pj0gMFxuICBlbmQgPj4+PSAwXG4gIHRoaXNTdGFydCA+Pj49IDBcbiAgdGhpc0VuZCA+Pj49IDBcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0KSByZXR1cm4gMFxuXG4gIHZhciB4ID0gdGhpc0VuZCAtIHRoaXNTdGFydFxuICB2YXIgeSA9IGVuZCAtIHN0YXJ0XG4gIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KVxuXG4gIHZhciB0aGlzQ29weSA9IHRoaXMuc2xpY2UodGhpc1N0YXJ0LCB0aGlzRW5kKVxuICB2YXIgdGFyZ2V0Q29weSA9IHRhcmdldC5zbGljZShzdGFydCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAodGhpc0NvcHlbaV0gIT09IHRhcmdldENvcHlbaV0pIHtcbiAgICAgIHggPSB0aGlzQ29weVtpXVxuICAgICAgeSA9IHRhcmdldENvcHlbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBGaW5kcyBlaXRoZXIgdGhlIGZpcnN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA+PSBgYnl0ZU9mZnNldGAsXG4vLyBPUiB0aGUgbGFzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPD0gYGJ5dGVPZmZzZXRgLlxuLy9cbi8vIEFyZ3VtZW50czpcbi8vIC0gYnVmZmVyIC0gYSBCdWZmZXIgdG8gc2VhcmNoXG4vLyAtIHZhbCAtIGEgc3RyaW5nLCBCdWZmZXIsIG9yIG51bWJlclxuLy8gLSBieXRlT2Zmc2V0IC0gYW4gaW5kZXggaW50byBgYnVmZmVyYDsgd2lsbCBiZSBjbGFtcGVkIHRvIGFuIGludDMyXG4vLyAtIGVuY29kaW5nIC0gYW4gb3B0aW9uYWwgZW5jb2RpbmcsIHJlbGV2YW50IGlzIHZhbCBpcyBhIHN0cmluZ1xuLy8gLSBkaXIgLSB0cnVlIGZvciBpbmRleE9mLCBmYWxzZSBmb3IgbGFzdEluZGV4T2ZcbmZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mIChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICAvLyBFbXB0eSBidWZmZXIgbWVhbnMgbm8gbWF0Y2hcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybiAtMVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0XG4gIGlmICh0eXBlb2YgYnl0ZU9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXRcbiAgICBieXRlT2Zmc2V0ID0gMFxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSB7XG4gICAgYnl0ZU9mZnNldCA9IDB4N2ZmZmZmZmZcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIHtcbiAgICBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDBcbiAgfVxuICBieXRlT2Zmc2V0ID0gK2J5dGVPZmZzZXQgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKG51bWJlcklzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAodHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgWyB2YWwgXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKG51bWJlcklzTmFOKHBhcnNlZCkpIHJldHVybiBpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBsYXRpbjFXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoID4+PiAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnXG4gICAgKVxuICB9XG5cbiAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZ1xuXG4gIGlmICgoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICB2YXIgcmVzID0gW11cblxuICB2YXIgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIHZhciBjb2RlUG9pbnQgPSBudWxsXG4gICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRikgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKSA/IDNcbiAgICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDBcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIHZhciByZXMgPSAnJ1xuICB2YXIgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBsYXRpbjFTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgdmFyIG91dCA9ICcnXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICB2YXIgcmVzID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgKGJ5dGVzW2kgKyAxXSAqIDI1NikpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZiA9IHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZClcbiAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2VcbiAgbmV3QnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24gcmVhZFVJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICB2YXIgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGhcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgMV0gfCAodGhpc1tvZmZzZXRdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCAoOCAqIGJ5dGVMZW5ndGgpIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgKDggKiBieXRlTGVuZ3RoKSAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IHNob3VsZCBiZSBhIEJ1ZmZlcicpXG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICB2YXIgbGVuID0gZW5kIC0gc3RhcnRcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVXNlIGJ1aWx0LWluIHdoZW4gYXZhaWxhYmxlLCBtaXNzaW5nIGZyb20gSUUxMVxuICAgIHRoaXMuY29weVdpdGhpbih0YXJnZXRTdGFydCwgc3RhcnQsIGVuZClcbiAgfSBlbHNlIGlmICh0aGlzID09PSB0YXJnZXQgJiYgc3RhcnQgPCB0YXJnZXRTdGFydCAmJiB0YXJnZXRTdGFydCA8IGVuZCkge1xuICAgIC8vIGRlc2NlbmRpbmcgY29weSBmcm9tIGVuZFxuICAgIGZvciAodmFyIGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICB0YXJnZXQsXG4gICAgICB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpLFxuICAgICAgdGFyZ2V0U3RhcnRcbiAgICApXG4gIH1cblxuICByZXR1cm4gbGVuXG59XG5cbi8vIFVzYWdlOlxuLy8gICAgYnVmZmVyLmZpbGwobnVtYmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChidWZmZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKHN0cmluZ1ssIG9mZnNldFssIGVuZF1dWywgZW5jb2RpbmddKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsLCBzdGFydCwgZW5kLCBlbmNvZGluZykge1xuICAvLyBIYW5kbGUgc3RyaW5nIGNhc2VzOlxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBzdGFydFxuICAgICAgc3RhcnQgPSAwXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gZW5kXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH1cbiAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgIH1cbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdmFyIGNvZGUgPSB2YWwuY2hhckNvZGVBdCgwKVxuICAgICAgaWYgKChlbmNvZGluZyA9PT0gJ3V0ZjgnICYmIGNvZGUgPCAxMjgpIHx8XG4gICAgICAgICAgZW5jb2RpbmcgPT09ICdsYXRpbjEnKSB7XG4gICAgICAgIC8vIEZhc3QgcGF0aDogSWYgYHZhbGAgZml0cyBpbnRvIGEgc2luZ2xlIGJ5dGUsIHVzZSB0aGF0IG51bWVyaWMgdmFsdWUuXG4gICAgICAgIHZhbCA9IGNvZGVcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAyNTVcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwXG5cbiAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICB0aGlzW2ldID0gdmFsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IEJ1ZmZlci5pc0J1ZmZlcih2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBpZiAobGVuID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgdmFsdWUgXCInICsgdmFsICtcbiAgICAgICAgJ1wiIGlzIGludmFsaWQgZm9yIGFyZ3VtZW50IFwidmFsdWVcIicpXG4gICAgfVxuICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxudmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teKy8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgdGFrZXMgZXF1YWwgc2lnbnMgYXMgZW5kIG9mIHRoZSBCYXNlNjQgZW5jb2RpbmdcbiAgc3RyID0gc3RyLnNwbGl0KCc9JylbMF1cbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0ci50cmltKCkucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIHZhciBjb2RlUG9pbnRcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIHZhciBieXRlcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG9cbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG4vLyBBcnJheUJ1ZmZlciBvciBVaW50OEFycmF5IG9iamVjdHMgZnJvbSBvdGhlciBjb250ZXh0cyAoaS5lLiBpZnJhbWVzKSBkbyBub3QgcGFzc1xuLy8gdGhlIGBpbnN0YW5jZW9mYCBjaGVjayBidXQgdGhleSBzaG91bGQgYmUgdHJlYXRlZCBhcyBvZiB0aGF0IHR5cGUuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2lzc3Vlcy8xNjZcbmZ1bmN0aW9uIGlzSW5zdGFuY2UgKG9iaiwgdHlwZSkge1xuICByZXR1cm4gb2JqIGluc3RhbmNlb2YgdHlwZSB8fFxuICAgIChvYmogIT0gbnVsbCAmJiBvYmouY29uc3RydWN0b3IgIT0gbnVsbCAmJiBvYmouY29uc3RydWN0b3IubmFtZSAhPSBudWxsICYmXG4gICAgICBvYmouY29uc3RydWN0b3IubmFtZSA9PT0gdHlwZS5uYW1lKVxufVxuZnVuY3Rpb24gbnVtYmVySXNOYU4gKG9iaikge1xuICAvLyBGb3IgSUUxMSBzdXBwb3J0XG4gIHJldHVybiBvYmogIT09IG9iaiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuIiwiLyohXG4gKiAgaG93bGVyLmpzIHYyLjIuMVxuICogIGhvd2xlcmpzLmNvbVxuICpcbiAqICAoYykgMjAxMy0yMDIwLCBKYW1lcyBTaW1wc29uIG9mIEdvbGRGaXJlIFN0dWRpb3NcbiAqICBnb2xkZmlyZXN0dWRpb3MuY29tXG4gKlxuICogIE1JVCBMaWNlbnNlXG4gKi9cblxuKGZ1bmN0aW9uKCkge1xuXG4gICd1c2Ugc3RyaWN0JztcblxuICAvKiogR2xvYmFsIE1ldGhvZHMgKiovXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgZ2xvYmFsIGNvbnRyb2xsZXIuIEFsbCBjb250YWluZWQgbWV0aG9kcyBhbmQgcHJvcGVydGllcyBhcHBseVxuICAgKiB0byBhbGwgc291bmRzIHRoYXQgYXJlIGN1cnJlbnRseSBwbGF5aW5nIG9yIHdpbGwgYmUgaW4gdGhlIGZ1dHVyZS5cbiAgICovXG4gIHZhciBIb3dsZXJHbG9iYWwgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmluaXQoKTtcbiAgfTtcbiAgSG93bGVyR2xvYmFsLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoZSBnbG9iYWwgSG93bGVyIG9iamVjdC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsZXJ9XG4gICAgICovXG4gICAgaW5pdDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuXG4gICAgICAvLyBDcmVhdGUgYSBnbG9iYWwgSUQgY291bnRlci5cbiAgICAgIHNlbGYuX2NvdW50ZXIgPSAxMDAwO1xuXG4gICAgICAvLyBQb29sIG9mIHVubG9ja2VkIEhUTUw1IEF1ZGlvIG9iamVjdHMuXG4gICAgICBzZWxmLl9odG1sNUF1ZGlvUG9vbCA9IFtdO1xuICAgICAgc2VsZi5odG1sNVBvb2xTaXplID0gMTA7XG5cbiAgICAgIC8vIEludGVybmFsIHByb3BlcnRpZXMuXG4gICAgICBzZWxmLl9jb2RlY3MgPSB7fTtcbiAgICAgIHNlbGYuX2hvd2xzID0gW107XG4gICAgICBzZWxmLl9tdXRlZCA9IGZhbHNlO1xuICAgICAgc2VsZi5fdm9sdW1lID0gMTtcbiAgICAgIHNlbGYuX2NhblBsYXlFdmVudCA9ICdjYW5wbGF5dGhyb3VnaCc7XG4gICAgICBzZWxmLl9uYXZpZ2F0b3IgPSAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lm5hdmlnYXRvcikgPyB3aW5kb3cubmF2aWdhdG9yIDogbnVsbDtcblxuICAgICAgLy8gUHVibGljIHByb3BlcnRpZXMuXG4gICAgICBzZWxmLm1hc3RlckdhaW4gPSBudWxsO1xuICAgICAgc2VsZi5ub0F1ZGlvID0gZmFsc2U7XG4gICAgICBzZWxmLnVzaW5nV2ViQXVkaW8gPSB0cnVlO1xuICAgICAgc2VsZi5hdXRvU3VzcGVuZCA9IHRydWU7XG4gICAgICBzZWxmLmN0eCA9IG51bGw7XG5cbiAgICAgIC8vIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHRoZSBhdXRvIGF1ZGlvIHVubG9ja2VyLlxuICAgICAgc2VsZi5hdXRvVW5sb2NrID0gdHJ1ZTtcblxuICAgICAgLy8gU2V0dXAgdGhlIHZhcmlvdXMgc3RhdGUgdmFsdWVzIGZvciBnbG9iYWwgdHJhY2tpbmcuXG4gICAgICBzZWxmLl9zZXR1cCgpO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0L3NldCB0aGUgZ2xvYmFsIHZvbHVtZSBmb3IgYWxsIHNvdW5kcy5cbiAgICAgKiBAcGFyYW0gIHtGbG9hdH0gdm9sIFZvbHVtZSBmcm9tIDAuMCB0byAxLjAuXG4gICAgICogQHJldHVybiB7SG93bGVyL0Zsb2F0fSAgICAgUmV0dXJucyBzZWxmIG9yIGN1cnJlbnQgdm9sdW1lLlxuICAgICAqL1xuICAgIHZvbHVtZTogZnVuY3Rpb24odm9sKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuICAgICAgdm9sID0gcGFyc2VGbG9hdCh2b2wpO1xuXG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFuIEF1ZGlvQ29udGV4dCBjcmVhdGVkIHlldCwgcnVuIHRoZSBzZXR1cC5cbiAgICAgIGlmICghc2VsZi5jdHgpIHtcbiAgICAgICAgc2V0dXBBdWRpb0NvbnRleHQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2b2wgIT09ICd1bmRlZmluZWQnICYmIHZvbCA+PSAwICYmIHZvbCA8PSAxKSB7XG4gICAgICAgIHNlbGYuX3ZvbHVtZSA9IHZvbDtcblxuICAgICAgICAvLyBEb24ndCB1cGRhdGUgYW55IG9mIHRoZSBub2RlcyBpZiB3ZSBhcmUgbXV0ZWQuXG4gICAgICAgIGlmIChzZWxmLl9tdXRlZCkge1xuICAgICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2hlbiB1c2luZyBXZWIgQXVkaW8sIHdlIGp1c3QgbmVlZCB0byBhZGp1c3QgdGhlIG1hc3RlciBnYWluLlxuICAgICAgICBpZiAoc2VsZi51c2luZ1dlYkF1ZGlvKSB7XG4gICAgICAgICAgc2VsZi5tYXN0ZXJHYWluLmdhaW4uc2V0VmFsdWVBdFRpbWUodm9sLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbmQgY2hhbmdlIHZvbHVtZSBmb3IgYWxsIEhUTUw1IGF1ZGlvIG5vZGVzLlxuICAgICAgICBmb3IgKHZhciBpPTA7IGk8c2VsZi5faG93bHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoIXNlbGYuX2hvd2xzW2ldLl93ZWJBdWRpbykge1xuICAgICAgICAgICAgLy8gR2V0IGFsbCBvZiB0aGUgc291bmRzIGluIHRoaXMgSG93bCBncm91cC5cbiAgICAgICAgICAgIHZhciBpZHMgPSBzZWxmLl9ob3dsc1tpXS5fZ2V0U291bmRJZHMoKTtcblxuICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBzb3VuZHMgYW5kIGNoYW5nZSB0aGUgdm9sdW1lcy5cbiAgICAgICAgICAgIGZvciAodmFyIGo9MDsgajxpZHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgdmFyIHNvdW5kID0gc2VsZi5faG93bHNbaV0uX3NvdW5kQnlJZChpZHNbal0pO1xuXG4gICAgICAgICAgICAgIGlmIChzb3VuZCAmJiBzb3VuZC5fbm9kZSkge1xuICAgICAgICAgICAgICAgIHNvdW5kLl9ub2RlLnZvbHVtZSA9IHNvdW5kLl92b2x1bWUgKiB2b2w7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGYuX3ZvbHVtZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIG11dGluZyBhbmQgdW5tdXRpbmcgZ2xvYmFsbHkuXG4gICAgICogQHBhcmFtICB7Qm9vbGVhbn0gbXV0ZWQgSXMgbXV0ZWQgb3Igbm90LlxuICAgICAqL1xuICAgIG11dGU6IGZ1bmN0aW9uKG11dGVkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuXG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFuIEF1ZGlvQ29udGV4dCBjcmVhdGVkIHlldCwgcnVuIHRoZSBzZXR1cC5cbiAgICAgIGlmICghc2VsZi5jdHgpIHtcbiAgICAgICAgc2V0dXBBdWRpb0NvbnRleHQoKTtcbiAgICAgIH1cblxuICAgICAgc2VsZi5fbXV0ZWQgPSBtdXRlZDtcblxuICAgICAgLy8gV2l0aCBXZWIgQXVkaW8sIHdlIGp1c3QgbmVlZCB0byBtdXRlIHRoZSBtYXN0ZXIgZ2Fpbi5cbiAgICAgIGlmIChzZWxmLnVzaW5nV2ViQXVkaW8pIHtcbiAgICAgICAgc2VsZi5tYXN0ZXJHYWluLmdhaW4uc2V0VmFsdWVBdFRpbWUobXV0ZWQgPyAwIDogc2VsZi5fdm9sdW1lLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIGFuZCBtdXRlIGFsbCBIVE1MNSBBdWRpbyBub2Rlcy5cbiAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9ob3dscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIXNlbGYuX2hvd2xzW2ldLl93ZWJBdWRpbykge1xuICAgICAgICAgIC8vIEdldCBhbGwgb2YgdGhlIHNvdW5kcyBpbiB0aGlzIEhvd2wgZ3JvdXAuXG4gICAgICAgICAgdmFyIGlkcyA9IHNlbGYuX2hvd2xzW2ldLl9nZXRTb3VuZElkcygpO1xuXG4gICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBzb3VuZHMgYW5kIG1hcmsgdGhlIGF1ZGlvIG5vZGUgYXMgbXV0ZWQuXG4gICAgICAgICAgZm9yICh2YXIgaj0wOyBqPGlkcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIHNvdW5kID0gc2VsZi5faG93bHNbaV0uX3NvdW5kQnlJZChpZHNbal0pO1xuXG4gICAgICAgICAgICBpZiAoc291bmQgJiYgc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUubXV0ZWQgPSAobXV0ZWQpID8gdHJ1ZSA6IHNvdW5kLl9tdXRlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBzdG9wcGluZyBhbGwgc291bmRzIGdsb2JhbGx5LlxuICAgICAqL1xuICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzIHx8IEhvd2xlcjtcblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBIb3dscyBhbmQgc3RvcCB0aGVtLlxuICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX2hvd2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNlbGYuX2hvd2xzW2ldLnN0b3AoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVubG9hZCBhbmQgZGVzdHJveSBhbGwgY3VycmVudGx5IGxvYWRlZCBIb3dsIG9iamVjdHMuXG4gICAgICogQHJldHVybiB7SG93bGVyfVxuICAgICAqL1xuICAgIHVubG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuXG4gICAgICBmb3IgKHZhciBpPXNlbGYuX2hvd2xzLmxlbmd0aC0xOyBpPj0wOyBpLS0pIHtcbiAgICAgICAgc2VsZi5faG93bHNbaV0udW5sb2FkKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBBdWRpb0NvbnRleHQgdG8gbWFrZSBzdXJlIGl0IGlzIGZ1bGx5IHJlc2V0LlxuICAgICAgaWYgKHNlbGYudXNpbmdXZWJBdWRpbyAmJiBzZWxmLmN0eCAmJiB0eXBlb2Ygc2VsZi5jdHguY2xvc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNlbGYuY3R4LmNsb3NlKCk7XG4gICAgICAgIHNlbGYuY3R4ID0gbnVsbDtcbiAgICAgICAgc2V0dXBBdWRpb0NvbnRleHQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENoZWNrIGZvciBjb2RlYyBzdXBwb3J0IG9mIHNwZWNpZmljIGV4dGVuc2lvbi5cbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9IGV4dCBBdWRpbyBmaWxlIGV4dGVudGlvbi5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGNvZGVjczogZnVuY3Rpb24oZXh0KSB7XG4gICAgICByZXR1cm4gKHRoaXMgfHwgSG93bGVyKS5fY29kZWNzW2V4dC5yZXBsYWNlKC9eeC0vLCAnJyldO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXR1cCB2YXJpb3VzIHN0YXRlIHZhbHVlcyBmb3IgZ2xvYmFsIHRyYWNraW5nLlxuICAgICAqIEByZXR1cm4ge0hvd2xlcn1cbiAgICAgKi9cbiAgICBfc2V0dXA6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzIHx8IEhvd2xlcjtcblxuICAgICAgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIHN1c3BlbmQvcmVzdW1lIHN0YXRlIG9mIHRoZSBBdWRpb0NvbnRleHQuXG4gICAgICBzZWxmLnN0YXRlID0gc2VsZi5jdHggPyBzZWxmLmN0eC5zdGF0ZSB8fCAnc3VzcGVuZGVkJyA6ICdzdXNwZW5kZWQnO1xuXG4gICAgICAvLyBBdXRvbWF0aWNhbGx5IGJlZ2luIHRoZSAzMC1zZWNvbmQgc3VzcGVuZCBwcm9jZXNzXG4gICAgICBzZWxmLl9hdXRvU3VzcGVuZCgpO1xuXG4gICAgICAvLyBDaGVjayBpZiBhdWRpbyBpcyBhdmFpbGFibGUuXG4gICAgICBpZiAoIXNlbGYudXNpbmdXZWJBdWRpbykge1xuICAgICAgICAvLyBObyBhdWRpbyBpcyBhdmFpbGFibGUgb24gdGhpcyBzeXN0ZW0gaWYgbm9BdWRpbyBpcyBzZXQgdG8gdHJ1ZS5cbiAgICAgICAgaWYgKHR5cGVvZiBBdWRpbyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIHRlc3QgPSBuZXcgQXVkaW8oKTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNhbnBsYXl0aHJvdWdoIGV2ZW50IGlzIGF2YWlsYWJsZS5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGVzdC5vbmNhbnBsYXl0aHJvdWdoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBzZWxmLl9jYW5QbGF5RXZlbnQgPSAnY2FucGxheSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICBzZWxmLm5vQXVkaW8gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxmLm5vQXVkaW8gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRlc3QgdG8gbWFrZSBzdXJlIGF1ZGlvIGlzbid0IGRpc2FibGVkIGluIEludGVybmV0IEV4cGxvcmVyLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIHRlc3QgPSBuZXcgQXVkaW8oKTtcbiAgICAgICAgaWYgKHRlc3QubXV0ZWQpIHtcbiAgICAgICAgICBzZWxmLm5vQXVkaW8gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgICAvLyBDaGVjayBmb3Igc3VwcG9ydGVkIGNvZGVjcy5cbiAgICAgIGlmICghc2VsZi5ub0F1ZGlvKSB7XG4gICAgICAgIHNlbGYuX3NldHVwQ29kZWNzKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBmb3IgYnJvd3NlciBzdXBwb3J0IGZvciB2YXJpb3VzIGNvZGVjcyBhbmQgY2FjaGUgdGhlIHJlc3VsdHMuXG4gICAgICogQHJldHVybiB7SG93bGVyfVxuICAgICAqL1xuICAgIF9zZXR1cENvZGVjczogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuICAgICAgdmFyIGF1ZGlvVGVzdCA9IG51bGw7XG5cbiAgICAgIC8vIE11c3Qgd3JhcCBpbiBhIHRyeS9jYXRjaCBiZWNhdXNlIElFMTEgaW4gc2VydmVyIG1vZGUgdGhyb3dzIGFuIGVycm9yLlxuICAgICAgdHJ5IHtcbiAgICAgICAgYXVkaW9UZXN0ID0gKHR5cGVvZiBBdWRpbyAhPT0gJ3VuZGVmaW5lZCcpID8gbmV3IEF1ZGlvKCkgOiBudWxsO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWF1ZGlvVGVzdCB8fCB0eXBlb2YgYXVkaW9UZXN0LmNhblBsYXlUeXBlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfVxuXG4gICAgICB2YXIgbXBlZ1Rlc3QgPSBhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL21wZWc7JykucmVwbGFjZSgvXm5vJC8sICcnKTtcblxuICAgICAgLy8gT3BlcmEgdmVyc2lvbiA8MzMgaGFzIG1peGVkIE1QMyBzdXBwb3J0LCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGZvciBhbmQgYmxvY2sgaXQuXG4gICAgICB2YXIgY2hlY2tPcGVyYSA9IHNlbGYuX25hdmlnYXRvciAmJiBzZWxmLl9uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PUFJcXC8oWzAtNl0uKS9nKTtcbiAgICAgIHZhciBpc09sZE9wZXJhID0gKGNoZWNrT3BlcmEgJiYgcGFyc2VJbnQoY2hlY2tPcGVyYVswXS5zcGxpdCgnLycpWzFdLCAxMCkgPCAzMyk7XG5cbiAgICAgIHNlbGYuX2NvZGVjcyA9IHtcbiAgICAgICAgbXAzOiAhISghaXNPbGRPcGVyYSAmJiAobXBlZ1Rlc3QgfHwgYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9tcDM7JykucmVwbGFjZSgvXm5vJC8sICcnKSkpLFxuICAgICAgICBtcGVnOiAhIW1wZWdUZXN0LFxuICAgICAgICBvcHVzOiAhIWF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vb2dnOyBjb2RlY3M9XCJvcHVzXCInKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICBvZ2c6ICEhYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9vZ2c7IGNvZGVjcz1cInZvcmJpc1wiJykucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgb2dhOiAhIWF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vb2dnOyBjb2RlY3M9XCJ2b3JiaXNcIicpLnJlcGxhY2UoL15ubyQvLCAnJyksXG4gICAgICAgIHdhdjogISEoYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby93YXY7IGNvZGVjcz1cIjFcIicpIHx8IGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vd2F2JykpLnJlcGxhY2UoL15ubyQvLCAnJyksXG4gICAgICAgIGFhYzogISFhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL2FhYzsnKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICBjYWY6ICEhYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby94LWNhZjsnKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICBtNGE6ICEhKGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8veC1tNGE7JykgfHwgYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9tNGE7JykgfHwgYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9hYWM7JykpLnJlcGxhY2UoL15ubyQvLCAnJyksXG4gICAgICAgIG00YjogISEoYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby94LW00YjsnKSB8fCBhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL200YjsnKSB8fCBhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL2FhYzsnKSkucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgbXA0OiAhIShhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL3gtbXA0OycpIHx8IGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vbXA0OycpIHx8IGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vYWFjOycpKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICB3ZWJhOiAhIWF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vd2VibTsgY29kZWNzPVwidm9yYmlzXCInKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICB3ZWJtOiAhIWF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vd2VibTsgY29kZWNzPVwidm9yYmlzXCInKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICBkb2xieTogISFhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL21wNDsgY29kZWNzPVwiZWMtM1wiJykucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgZmxhYzogISEoYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby94LWZsYWM7JykgfHwgYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9mbGFjOycpKS5yZXBsYWNlKC9ebm8kLywgJycpXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU29tZSBicm93c2Vycy9kZXZpY2VzIHdpbGwgb25seSBhbGxvdyBhdWRpbyB0byBiZSBwbGF5ZWQgYWZ0ZXIgYSB1c2VyIGludGVyYWN0aW9uLlxuICAgICAqIEF0dGVtcHQgdG8gYXV0b21hdGljYWxseSB1bmxvY2sgYXVkaW8gb24gdGhlIGZpcnN0IHVzZXIgaW50ZXJhY3Rpb24uXG4gICAgICogQ29uY2VwdCBmcm9tOiBodHRwOi8vcGF1bGJha2F1cy5jb20vdHV0b3JpYWxzL2h0bWw1L3dlYi1hdWRpby1vbi1pb3MvXG4gICAgICogQHJldHVybiB7SG93bGVyfVxuICAgICAqL1xuICAgIF91bmxvY2tBdWRpbzogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuXG4gICAgICAvLyBPbmx5IHJ1biB0aGlzIGlmIFdlYiBBdWRpbyBpcyBzdXBwb3J0ZWQgYW5kIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gdW5sb2NrZWQuXG4gICAgICBpZiAoc2VsZi5fYXVkaW9VbmxvY2tlZCB8fCAhc2VsZi5jdHgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZWxmLl9hdWRpb1VubG9ja2VkID0gZmFsc2U7XG4gICAgICBzZWxmLmF1dG9VbmxvY2sgPSBmYWxzZTtcblxuICAgICAgLy8gU29tZSBtb2JpbGUgZGV2aWNlcy9wbGF0Zm9ybXMgaGF2ZSBkaXN0b3J0aW9uIGlzc3VlcyB3aGVuIG9wZW5pbmcvY2xvc2luZyB0YWJzIGFuZC9vciB3ZWIgdmlld3MuXG4gICAgICAvLyBCdWdzIGluIHRoZSBicm93c2VyIChlc3BlY2lhbGx5IE1vYmlsZSBTYWZhcmkpIGNhbiBjYXVzZSB0aGUgc2FtcGxlUmF0ZSB0byBjaGFuZ2UgZnJvbSA0NDEwMCB0byA0ODAwMC5cbiAgICAgIC8vIEJ5IGNhbGxpbmcgSG93bGVyLnVubG9hZCgpLCB3ZSBjcmVhdGUgYSBuZXcgQXVkaW9Db250ZXh0IHdpdGggdGhlIGNvcnJlY3Qgc2FtcGxlUmF0ZS5cbiAgICAgIGlmICghc2VsZi5fbW9iaWxlVW5sb2FkZWQgJiYgc2VsZi5jdHguc2FtcGxlUmF0ZSAhPT0gNDQxMDApIHtcbiAgICAgICAgc2VsZi5fbW9iaWxlVW5sb2FkZWQgPSB0cnVlO1xuICAgICAgICBzZWxmLnVubG9hZCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBTY3JhdGNoIGJ1ZmZlciBmb3IgZW5hYmxpbmcgaU9TIHRvIGRpc3Bvc2Ugb2Ygd2ViIGF1ZGlvIGJ1ZmZlcnMgY29ycmVjdGx5LCBhcyBwZXI6XG4gICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI0MTE5Njg0XG4gICAgICBzZWxmLl9zY3JhdGNoQnVmZmVyID0gc2VsZi5jdHguY3JlYXRlQnVmZmVyKDEsIDEsIDIyMDUwKTtcblxuICAgICAgLy8gQ2FsbCB0aGlzIG1ldGhvZCBvbiB0b3VjaCBzdGFydCB0byBjcmVhdGUgYW5kIHBsYXkgYSBidWZmZXIsXG4gICAgICAvLyB0aGVuIGNoZWNrIGlmIHRoZSBhdWRpbyBhY3R1YWxseSBwbGF5ZWQgdG8gZGV0ZXJtaW5lIGlmXG4gICAgICAvLyBhdWRpbyBoYXMgbm93IGJlZW4gdW5sb2NrZWQgb24gaU9TLCBBbmRyb2lkLCBldGMuXG4gICAgICB2YXIgdW5sb2NrID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAvLyBDcmVhdGUgYSBwb29sIG9mIHVubG9ja2VkIEhUTUw1IEF1ZGlvIG9iamVjdHMgdGhhdCBjYW5cbiAgICAgICAgLy8gYmUgdXNlZCBmb3IgcGxheWluZyBzb3VuZHMgd2l0aG91dCB1c2VyIGludGVyYWN0aW9uLiBIVE1MNVxuICAgICAgICAvLyBBdWRpbyBvYmplY3RzIG11c3QgYmUgaW5kaXZpZHVhbGx5IHVubG9ja2VkLCBhcyBvcHBvc2VkXG4gICAgICAgIC8vIHRvIHRoZSBXZWJBdWRpbyBBUEkgd2hpY2ggb25seSBuZWVkcyBhIHNpbmdsZSBhY3RpdmF0aW9uLlxuICAgICAgICAvLyBUaGlzIG11c3Qgb2NjdXIgYmVmb3JlIFdlYkF1ZGlvIHNldHVwIG9yIHRoZSBzb3VyY2Uub25lbmRlZFxuICAgICAgICAvLyBldmVudCB3aWxsIG5vdCBmaXJlLlxuICAgICAgICB3aGlsZSAoc2VsZi5faHRtbDVBdWRpb1Bvb2wubGVuZ3RoIDwgc2VsZi5odG1sNVBvb2xTaXplKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBhdWRpb05vZGUgPSBuZXcgQXVkaW8oKTtcblxuICAgICAgICAgICAgLy8gTWFyayB0aGlzIEF1ZGlvIG9iamVjdCBhcyB1bmxvY2tlZCB0byBlbnN1cmUgaXQgY2FuIGdldCByZXR1cm5lZFxuICAgICAgICAgICAgLy8gdG8gdGhlIHVubG9ja2VkIHBvb2wgd2hlbiByZWxlYXNlZC5cbiAgICAgICAgICAgIGF1ZGlvTm9kZS5fdW5sb2NrZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBBZGQgdGhlIGF1ZGlvIG5vZGUgdG8gdGhlIHBvb2wuXG4gICAgICAgICAgICBzZWxmLl9yZWxlYXNlSHRtbDVBdWRpbyhhdWRpb05vZGUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNlbGYubm9BdWRpbyA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb29wIHRocm91Z2ggYW55IGFzc2lnbmVkIGF1ZGlvIG5vZGVzIGFuZCB1bmxvY2sgdGhlbS5cbiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX2hvd2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCFzZWxmLl9ob3dsc1tpXS5fd2ViQXVkaW8pIHtcbiAgICAgICAgICAgIC8vIEdldCBhbGwgb2YgdGhlIHNvdW5kcyBpbiB0aGlzIEhvd2wgZ3JvdXAuXG4gICAgICAgICAgICB2YXIgaWRzID0gc2VsZi5faG93bHNbaV0uX2dldFNvdW5kSWRzKCk7XG5cbiAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgc291bmRzIGFuZCB1bmxvY2sgdGhlIGF1ZGlvIG5vZGVzLlxuICAgICAgICAgICAgZm9yICh2YXIgaj0wOyBqPGlkcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICB2YXIgc291bmQgPSBzZWxmLl9ob3dsc1tpXS5fc291bmRCeUlkKGlkc1tqXSk7XG5cbiAgICAgICAgICAgICAgaWYgKHNvdW5kICYmIHNvdW5kLl9ub2RlICYmICFzb3VuZC5fbm9kZS5fdW5sb2NrZWQpIHtcbiAgICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5fdW5sb2NrZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHNvdW5kLl9ub2RlLmxvYWQoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpeCBBbmRyb2lkIGNhbiBub3QgcGxheSBpbiBzdXNwZW5kIHN0YXRlLlxuICAgICAgICBzZWxmLl9hdXRvUmVzdW1lKCk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IGJ1ZmZlci5cbiAgICAgICAgdmFyIHNvdXJjZSA9IHNlbGYuY3R4LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO1xuICAgICAgICBzb3VyY2UuYnVmZmVyID0gc2VsZi5fc2NyYXRjaEJ1ZmZlcjtcbiAgICAgICAgc291cmNlLmNvbm5lY3Qoc2VsZi5jdHguZGVzdGluYXRpb24pO1xuXG4gICAgICAgIC8vIFBsYXkgdGhlIGVtcHR5IGJ1ZmZlci5cbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2Uuc3RhcnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgc291cmNlLm5vdGVPbigwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzb3VyY2Uuc3RhcnQoMCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsaW5nIHJlc3VtZSgpIG9uIGEgc3RhY2sgaW5pdGlhdGVkIGJ5IHVzZXIgZ2VzdHVyZSBpcyB3aGF0IGFjdHVhbGx5IHVubG9ja3MgdGhlIGF1ZGlvIG9uIEFuZHJvaWQgQ2hyb21lID49IDU1LlxuICAgICAgICBpZiAodHlwZW9mIHNlbGYuY3R4LnJlc3VtZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHNlbGYuY3R4LnJlc3VtZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0dXAgYSB0aW1lb3V0IHRvIGNoZWNrIHRoYXQgd2UgYXJlIHVubG9ja2VkIG9uIHRoZSBuZXh0IGV2ZW50IGxvb3AuXG4gICAgICAgIHNvdXJjZS5vbmVuZGVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgc291cmNlLmRpc2Nvbm5lY3QoMCk7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgdGhlIHVubG9ja2VkIHN0YXRlIGFuZCBwcmV2ZW50IHRoaXMgY2hlY2sgZnJvbSBoYXBwZW5pbmcgYWdhaW4uXG4gICAgICAgICAgc2VsZi5fYXVkaW9VbmxvY2tlZCA9IHRydWU7XG5cbiAgICAgICAgICAvLyBSZW1vdmUgdGhlIHRvdWNoIHN0YXJ0IGxpc3RlbmVyLlxuICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB1bmxvY2ssIHRydWUpO1xuICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdW5sb2NrLCB0cnVlKTtcbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHVubG9jaywgdHJ1ZSk7XG5cbiAgICAgICAgICAvLyBMZXQgYWxsIHNvdW5kcyBrbm93IHRoYXQgYXVkaW8gaGFzIGJlZW4gdW5sb2NrZWQuXG4gICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX2hvd2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzZWxmLl9ob3dsc1tpXS5fZW1pdCgndW5sb2NrJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfTtcblxuICAgICAgLy8gU2V0dXAgYSB0b3VjaCBzdGFydCBsaXN0ZW5lciB0byBhdHRlbXB0IGFuIHVubG9jayBpbi5cbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB1bmxvY2ssIHRydWUpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB1bmxvY2ssIHRydWUpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB1bmxvY2ssIHRydWUpO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGFuIHVubG9ja2VkIEhUTUw1IEF1ZGlvIG9iamVjdCBmcm9tIHRoZSBwb29sLiBJZiBub25lIGFyZSBsZWZ0LFxuICAgICAqIHJldHVybiBhIG5ldyBBdWRpbyBvYmplY3QgYW5kIHRocm93IGEgd2FybmluZy5cbiAgICAgKiBAcmV0dXJuIHtBdWRpb30gSFRNTDUgQXVkaW8gb2JqZWN0LlxuICAgICAqL1xuICAgIF9vYnRhaW5IdG1sNUF1ZGlvOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcyB8fCBIb3dsZXI7XG5cbiAgICAgIC8vIFJldHVybiB0aGUgbmV4dCBvYmplY3QgZnJvbSB0aGUgcG9vbCBpZiBvbmUgZXhpc3RzLlxuICAgICAgaWYgKHNlbGYuX2h0bWw1QXVkaW9Qb29sLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc2VsZi5faHRtbDVBdWRpb1Bvb2wucG9wKCk7XG4gICAgICB9XG5cbiAgICAgIC8vLkNoZWNrIGlmIHRoZSBhdWRpbyBpcyBsb2NrZWQgYW5kIHRocm93IGEgd2FybmluZy5cbiAgICAgIHZhciB0ZXN0UGxheSA9IG5ldyBBdWRpbygpLnBsYXkoKTtcbiAgICAgIGlmICh0ZXN0UGxheSAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgKHRlc3RQbGF5IGluc3RhbmNlb2YgUHJvbWlzZSB8fCB0eXBlb2YgdGVzdFBsYXkudGhlbiA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgdGVzdFBsYXkuY2F0Y2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdIVE1MNSBBdWRpbyBwb29sIGV4aGF1c3RlZCwgcmV0dXJuaW5nIHBvdGVudGlhbGx5IGxvY2tlZCBhdWRpbyBvYmplY3QuJyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IEF1ZGlvKCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbiBhY3RpdmF0ZWQgSFRNTDUgQXVkaW8gb2JqZWN0IHRvIHRoZSBwb29sLlxuICAgICAqIEByZXR1cm4ge0hvd2xlcn1cbiAgICAgKi9cbiAgICBfcmVsZWFzZUh0bWw1QXVkaW86IGZ1bmN0aW9uKGF1ZGlvKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuXG4gICAgICAvLyBEb24ndCBhZGQgYXVkaW8gdG8gdGhlIHBvb2wgaWYgd2UgZG9uJ3Qga25vdyBpZiBpdCBoYXMgYmVlbiB1bmxvY2tlZC5cbiAgICAgIGlmIChhdWRpby5fdW5sb2NrZWQpIHtcbiAgICAgICAgc2VsZi5faHRtbDVBdWRpb1Bvb2wucHVzaChhdWRpbyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBdXRvbWF0aWNhbGx5IHN1c3BlbmQgdGhlIFdlYiBBdWRpbyBBdWRpb0NvbnRleHQgYWZ0ZXIgbm8gc291bmQgaGFzIHBsYXllZCBmb3IgMzAgc2Vjb25kcy5cbiAgICAgKiBUaGlzIHNhdmVzIHByb2Nlc3NpbmcvZW5lcmd5IGFuZCBmaXhlcyB2YXJpb3VzIGJyb3dzZXItc3BlY2lmaWMgYnVncyB3aXRoIGF1ZGlvIGdldHRpbmcgc3R1Y2suXG4gICAgICogQHJldHVybiB7SG93bGVyfVxuICAgICAqL1xuICAgIF9hdXRvU3VzcGVuZDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIGlmICghc2VsZi5hdXRvU3VzcGVuZCB8fCAhc2VsZi5jdHggfHwgdHlwZW9mIHNlbGYuY3R4LnN1c3BlbmQgPT09ICd1bmRlZmluZWQnIHx8ICFIb3dsZXIudXNpbmdXZWJBdWRpbykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGFueSBzb3VuZHMgYXJlIHBsYXlpbmcuXG4gICAgICBmb3IgKHZhciBpPTA7IGk8c2VsZi5faG93bHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNlbGYuX2hvd2xzW2ldLl93ZWJBdWRpbykge1xuICAgICAgICAgIGZvciAodmFyIGo9MDsgajxzZWxmLl9ob3dsc1tpXS5fc291bmRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoIXNlbGYuX2hvd2xzW2ldLl9zb3VuZHNbal0uX3BhdXNlZCkge1xuICAgICAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGYuX3N1c3BlbmRUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQoc2VsZi5fc3VzcGVuZFRpbWVyKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gc291bmQgaGFzIHBsYXllZCBhZnRlciAzMCBzZWNvbmRzLCBzdXNwZW5kIHRoZSBjb250ZXh0LlxuICAgICAgc2VsZi5fc3VzcGVuZFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCFzZWxmLmF1dG9TdXNwZW5kKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VsZi5fc3VzcGVuZFRpbWVyID0gbnVsbDtcbiAgICAgICAgc2VsZi5zdGF0ZSA9ICdzdXNwZW5kaW5nJztcblxuICAgICAgICAvLyBIYW5kbGUgdXBkYXRpbmcgdGhlIHN0YXRlIG9mIHRoZSBhdWRpbyBjb250ZXh0IGFmdGVyIHN1c3BlbmRpbmcuXG4gICAgICAgIHZhciBoYW5kbGVTdXNwZW5zaW9uID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgc2VsZi5zdGF0ZSA9ICdzdXNwZW5kZWQnO1xuXG4gICAgICAgICAgaWYgKHNlbGYuX3Jlc3VtZUFmdGVyU3VzcGVuZCkge1xuICAgICAgICAgICAgZGVsZXRlIHNlbGYuX3Jlc3VtZUFmdGVyU3VzcGVuZDtcbiAgICAgICAgICAgIHNlbGYuX2F1dG9SZXN1bWUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRWl0aGVyIHRoZSBzdGF0ZSBnZXRzIHN1c3BlbmRlZCBvciBpdCBpcyBpbnRlcnJ1cHRlZC5cbiAgICAgICAgLy8gRWl0aGVyIHdheSwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIHN0YXRlIHRvIHN1c3BlbmRlZC5cbiAgICAgICAgc2VsZi5jdHguc3VzcGVuZCgpLnRoZW4oaGFuZGxlU3VzcGVuc2lvbiwgaGFuZGxlU3VzcGVuc2lvbik7XG4gICAgICB9LCAzMDAwMCk7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBdXRvbWF0aWNhbGx5IHJlc3VtZSB0aGUgV2ViIEF1ZGlvIEF1ZGlvQ29udGV4dCB3aGVuIGEgbmV3IHNvdW5kIGlzIHBsYXllZC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsZXJ9XG4gICAgICovXG4gICAgX2F1dG9SZXN1bWU6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICBpZiAoIXNlbGYuY3R4IHx8IHR5cGVvZiBzZWxmLmN0eC5yZXN1bWUgPT09ICd1bmRlZmluZWQnIHx8ICFIb3dsZXIudXNpbmdXZWJBdWRpbykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxmLnN0YXRlID09PSAncnVubmluZycgJiYgc2VsZi5jdHguc3RhdGUgIT09ICdpbnRlcnJ1cHRlZCcgJiYgc2VsZi5fc3VzcGVuZFRpbWVyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dChzZWxmLl9zdXNwZW5kVGltZXIpO1xuICAgICAgICBzZWxmLl9zdXNwZW5kVGltZXIgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmIChzZWxmLnN0YXRlID09PSAnc3VzcGVuZGVkJyB8fCBzZWxmLnN0YXRlID09PSAncnVubmluZycgJiYgc2VsZi5jdHguc3RhdGUgPT09ICdpbnRlcnJ1cHRlZCcpIHtcbiAgICAgICAgc2VsZi5jdHgucmVzdW1lKCkudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgICBzZWxmLnN0YXRlID0gJ3J1bm5pbmcnO1xuXG4gICAgICAgICAgLy8gRW1pdCB0byBhbGwgSG93bHMgdGhhdCB0aGUgYXVkaW8gaGFzIHJlc3VtZWQuXG4gICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX2hvd2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzZWxmLl9ob3dsc1tpXS5fZW1pdCgncmVzdW1lJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoc2VsZi5fc3VzcGVuZFRpbWVyKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHNlbGYuX3N1c3BlbmRUaW1lcik7XG4gICAgICAgICAgc2VsZi5fc3VzcGVuZFRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzZWxmLnN0YXRlID09PSAnc3VzcGVuZGluZycpIHtcbiAgICAgICAgc2VsZi5fcmVzdW1lQWZ0ZXJTdXNwZW5kID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuICB9O1xuXG4gIC8vIFNldHVwIHRoZSBnbG9iYWwgYXVkaW8gY29udHJvbGxlci5cbiAgdmFyIEhvd2xlciA9IG5ldyBIb3dsZXJHbG9iYWwoKTtcblxuICAvKiogR3JvdXAgTWV0aG9kcyAqKi9cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGF1ZGlvIGdyb3VwIGNvbnRyb2xsZXIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvIFBhc3NlZCBpbiBwcm9wZXJ0aWVzIGZvciB0aGlzIGdyb3VwLlxuICAgKi9cbiAgdmFyIEhvd2wgPSBmdW5jdGlvbihvKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gVGhyb3cgYW4gZXJyb3IgaWYgbm8gc291cmNlIGlzIHByb3ZpZGVkLlxuICAgIGlmICghby5zcmMgfHwgby5zcmMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdBbiBhcnJheSBvZiBzb3VyY2UgZmlsZXMgbXVzdCBiZSBwYXNzZWQgd2l0aCBhbnkgbmV3IEhvd2wuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2VsZi5pbml0KG8pO1xuICB9O1xuICBIb3dsLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIGEgbmV3IEhvd2wgZ3JvdXAgb2JqZWN0LlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gbyBQYXNzZWQgaW4gcHJvcGVydGllcyBmb3IgdGhpcyBncm91cC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIGluaXQ6IGZ1bmN0aW9uKG8pIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbiBBdWRpb0NvbnRleHQgY3JlYXRlZCB5ZXQsIHJ1biB0aGUgc2V0dXAuXG4gICAgICBpZiAoIUhvd2xlci5jdHgpIHtcbiAgICAgICAgc2V0dXBBdWRpb0NvbnRleHQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0dXAgdXNlci1kZWZpbmVkIGRlZmF1bHQgcHJvcGVydGllcy5cbiAgICAgIHNlbGYuX2F1dG9wbGF5ID0gby5hdXRvcGxheSB8fCBmYWxzZTtcbiAgICAgIHNlbGYuX2Zvcm1hdCA9ICh0eXBlb2Ygby5mb3JtYXQgIT09ICdzdHJpbmcnKSA/IG8uZm9ybWF0IDogW28uZm9ybWF0XTtcbiAgICAgIHNlbGYuX2h0bWw1ID0gby5odG1sNSB8fCBmYWxzZTtcbiAgICAgIHNlbGYuX211dGVkID0gby5tdXRlIHx8IGZhbHNlO1xuICAgICAgc2VsZi5fbG9vcCA9IG8ubG9vcCB8fCBmYWxzZTtcbiAgICAgIHNlbGYuX3Bvb2wgPSBvLnBvb2wgfHwgNTtcbiAgICAgIHNlbGYuX3ByZWxvYWQgPSAodHlwZW9mIG8ucHJlbG9hZCA9PT0gJ2Jvb2xlYW4nIHx8IG8ucHJlbG9hZCA9PT0gJ21ldGFkYXRhJykgPyBvLnByZWxvYWQgOiB0cnVlO1xuICAgICAgc2VsZi5fcmF0ZSA9IG8ucmF0ZSB8fCAxO1xuICAgICAgc2VsZi5fc3ByaXRlID0gby5zcHJpdGUgfHwge307XG4gICAgICBzZWxmLl9zcmMgPSAodHlwZW9mIG8uc3JjICE9PSAnc3RyaW5nJykgPyBvLnNyYyA6IFtvLnNyY107XG4gICAgICBzZWxmLl92b2x1bWUgPSBvLnZvbHVtZSAhPT0gdW5kZWZpbmVkID8gby52b2x1bWUgOiAxO1xuICAgICAgc2VsZi5feGhyID0ge1xuICAgICAgICBtZXRob2Q6IG8ueGhyICYmIG8ueGhyLm1ldGhvZCA/IG8ueGhyLm1ldGhvZCA6ICdHRVQnLFxuICAgICAgICBoZWFkZXJzOiBvLnhociAmJiBvLnhoci5oZWFkZXJzID8gby54aHIuaGVhZGVycyA6IG51bGwsXG4gICAgICAgIHdpdGhDcmVkZW50aWFsczogby54aHIgJiYgby54aHIud2l0aENyZWRlbnRpYWxzID8gby54aHIud2l0aENyZWRlbnRpYWxzIDogZmFsc2UsXG4gICAgICB9O1xuXG4gICAgICAvLyBTZXR1cCBhbGwgb3RoZXIgZGVmYXVsdCBwcm9wZXJ0aWVzLlxuICAgICAgc2VsZi5fZHVyYXRpb24gPSAwO1xuICAgICAgc2VsZi5fc3RhdGUgPSAndW5sb2FkZWQnO1xuICAgICAgc2VsZi5fc291bmRzID0gW107XG4gICAgICBzZWxmLl9lbmRUaW1lcnMgPSB7fTtcbiAgICAgIHNlbGYuX3F1ZXVlID0gW107XG4gICAgICBzZWxmLl9wbGF5TG9jayA9IGZhbHNlO1xuXG4gICAgICAvLyBTZXR1cCBldmVudCBsaXN0ZW5lcnMuXG4gICAgICBzZWxmLl9vbmVuZCA9IG8ub25lbmQgPyBbe2ZuOiBvLm9uZW5kfV0gOiBbXTtcbiAgICAgIHNlbGYuX29uZmFkZSA9IG8ub25mYWRlID8gW3tmbjogby5vbmZhZGV9XSA6IFtdO1xuICAgICAgc2VsZi5fb25sb2FkID0gby5vbmxvYWQgPyBbe2ZuOiBvLm9ubG9hZH1dIDogW107XG4gICAgICBzZWxmLl9vbmxvYWRlcnJvciA9IG8ub25sb2FkZXJyb3IgPyBbe2ZuOiBvLm9ubG9hZGVycm9yfV0gOiBbXTtcbiAgICAgIHNlbGYuX29ucGxheWVycm9yID0gby5vbnBsYXllcnJvciA/IFt7Zm46IG8ub25wbGF5ZXJyb3J9XSA6IFtdO1xuICAgICAgc2VsZi5fb25wYXVzZSA9IG8ub25wYXVzZSA/IFt7Zm46IG8ub25wYXVzZX1dIDogW107XG4gICAgICBzZWxmLl9vbnBsYXkgPSBvLm9ucGxheSA/IFt7Zm46IG8ub25wbGF5fV0gOiBbXTtcbiAgICAgIHNlbGYuX29uc3RvcCA9IG8ub25zdG9wID8gW3tmbjogby5vbnN0b3B9XSA6IFtdO1xuICAgICAgc2VsZi5fb25tdXRlID0gby5vbm11dGUgPyBbe2ZuOiBvLm9ubXV0ZX1dIDogW107XG4gICAgICBzZWxmLl9vbnZvbHVtZSA9IG8ub252b2x1bWUgPyBbe2ZuOiBvLm9udm9sdW1lfV0gOiBbXTtcbiAgICAgIHNlbGYuX29ucmF0ZSA9IG8ub25yYXRlID8gW3tmbjogby5vbnJhdGV9XSA6IFtdO1xuICAgICAgc2VsZi5fb25zZWVrID0gby5vbnNlZWsgPyBbe2ZuOiBvLm9uc2Vla31dIDogW107XG4gICAgICBzZWxmLl9vbnVubG9jayA9IG8ub251bmxvY2sgPyBbe2ZuOiBvLm9udW5sb2NrfV0gOiBbXTtcbiAgICAgIHNlbGYuX29ucmVzdW1lID0gW107XG5cbiAgICAgIC8vIFdlYiBBdWRpbyBvciBIVE1MNSBBdWRpbz9cbiAgICAgIHNlbGYuX3dlYkF1ZGlvID0gSG93bGVyLnVzaW5nV2ViQXVkaW8gJiYgIXNlbGYuX2h0bWw1O1xuXG4gICAgICAvLyBBdXRvbWF0aWNhbGx5IHRyeSB0byBlbmFibGUgYXVkaW8uXG4gICAgICBpZiAodHlwZW9mIEhvd2xlci5jdHggIT09ICd1bmRlZmluZWQnICYmIEhvd2xlci5jdHggJiYgSG93bGVyLmF1dG9VbmxvY2spIHtcbiAgICAgICAgSG93bGVyLl91bmxvY2tBdWRpbygpO1xuICAgICAgfVxuXG4gICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoaXMgSG93bCBncm91cCBpbiB0aGUgZ2xvYmFsIGNvbnRyb2xsZXIuXG4gICAgICBIb3dsZXIuX2hvd2xzLnB1c2goc2VsZik7XG5cbiAgICAgIC8vIElmIHRoZXkgc2VsZWN0ZWQgYXV0b3BsYXksIGFkZCBhIHBsYXkgZXZlbnQgdG8gdGhlIGxvYWQgcXVldWUuXG4gICAgICBpZiAoc2VsZi5fYXV0b3BsYXkpIHtcbiAgICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgICAgZXZlbnQ6ICdwbGF5JyxcbiAgICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5wbGF5KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9hZCB0aGUgc291cmNlIGZpbGUgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuXG4gICAgICBpZiAoc2VsZi5fcHJlbG9hZCAmJiBzZWxmLl9wcmVsb2FkICE9PSAnbm9uZScpIHtcbiAgICAgICAgc2VsZi5sb2FkKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMb2FkIHRoZSBhdWRpbyBmaWxlLlxuICAgICAqIEByZXR1cm4ge0hvd2xlcn1cbiAgICAgKi9cbiAgICBsb2FkOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciB1cmwgPSBudWxsO1xuXG4gICAgICAvLyBJZiBubyBhdWRpbyBpcyBhdmFpbGFibGUsIHF1aXQgaW1tZWRpYXRlbHkuXG4gICAgICBpZiAoSG93bGVyLm5vQXVkaW8pIHtcbiAgICAgICAgc2VsZi5fZW1pdCgnbG9hZGVycm9yJywgbnVsbCwgJ05vIGF1ZGlvIHN1cHBvcnQuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gTWFrZSBzdXJlIG91ciBzb3VyY2UgaXMgaW4gYW4gYXJyYXkuXG4gICAgICBpZiAodHlwZW9mIHNlbGYuX3NyYyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc2VsZi5fc3JjID0gW3NlbGYuX3NyY107XG4gICAgICB9XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgc291cmNlcyBhbmQgcGljayB0aGUgZmlyc3Qgb25lIHRoYXQgaXMgY29tcGF0aWJsZS5cbiAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9zcmMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGV4dCwgc3RyO1xuXG4gICAgICAgIGlmIChzZWxmLl9mb3JtYXQgJiYgc2VsZi5fZm9ybWF0W2ldKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXh0ZW5zaW9uIHdhcyBzcGVjaWZpZWQsIHVzZSB0aGF0IGluc3RlYWQuXG4gICAgICAgICAgZXh0ID0gc2VsZi5fZm9ybWF0W2ldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgc291cmNlIGlzIGEgc3RyaW5nLlxuICAgICAgICAgIHN0ciA9IHNlbGYuX3NyY1tpXTtcbiAgICAgICAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHNlbGYuX2VtaXQoJ2xvYWRlcnJvcicsIG51bGwsICdOb24tc3RyaW5nIGZvdW5kIGluIHNlbGVjdGVkIGF1ZGlvIHNvdXJjZXMgLSBpZ25vcmluZy4nKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIGZpbGUgZXh0ZW5zaW9uIGZyb20gdGhlIFVSTCBvciBiYXNlNjQgZGF0YSBVUkkuXG4gICAgICAgICAgZXh0ID0gL15kYXRhOmF1ZGlvXFwvKFteOyxdKyk7L2kuZXhlYyhzdHIpO1xuICAgICAgICAgIGlmICghZXh0KSB7XG4gICAgICAgICAgICBleHQgPSAvXFwuKFteLl0rKSQvLmV4ZWMoc3RyLnNwbGl0KCc/JywgMSlbMF0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChleHQpIHtcbiAgICAgICAgICAgIGV4dCA9IGV4dFsxXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExvZyBhIHdhcm5pbmcgaWYgbm8gZXh0ZW5zaW9uIHdhcyBmb3VuZC5cbiAgICAgICAgaWYgKCFleHQpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ05vIGZpbGUgZXh0ZW5zaW9uIHdhcyBmb3VuZC4gQ29uc2lkZXIgdXNpbmcgdGhlIFwiZm9ybWF0XCIgcHJvcGVydHkgb3Igc3BlY2lmeSBhbiBleHRlbnNpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGV4dGVuc2lvbiBpcyBhdmFpbGFibGUuXG4gICAgICAgIGlmIChleHQgJiYgSG93bGVyLmNvZGVjcyhleHQpKSB7XG4gICAgICAgICAgdXJsID0gc2VsZi5fc3JjW2ldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdXJsKSB7XG4gICAgICAgIHNlbGYuX2VtaXQoJ2xvYWRlcnJvcicsIG51bGwsICdObyBjb2RlYyBzdXBwb3J0IGZvciBzZWxlY3RlZCBhdWRpbyBzb3VyY2VzLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNlbGYuX3NyYyA9IHVybDtcbiAgICAgIHNlbGYuX3N0YXRlID0gJ2xvYWRpbmcnO1xuXG4gICAgICAvLyBJZiB0aGUgaG9zdGluZyBwYWdlIGlzIEhUVFBTIGFuZCB0aGUgc291cmNlIGlzbid0LFxuICAgICAgLy8gZHJvcCBkb3duIHRvIEhUTUw1IEF1ZGlvIHRvIGF2b2lkIE1peGVkIENvbnRlbnQgZXJyb3JzLlxuICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicgJiYgdXJsLnNsaWNlKDAsIDUpID09PSAnaHR0cDonKSB7XG4gICAgICAgIHNlbGYuX2h0bWw1ID0gdHJ1ZTtcbiAgICAgICAgc2VsZi5fd2ViQXVkaW8gPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IHNvdW5kIG9iamVjdCBhbmQgYWRkIGl0IHRvIHRoZSBwb29sLlxuICAgICAgbmV3IFNvdW5kKHNlbGYpO1xuXG4gICAgICAvLyBMb2FkIGFuZCBkZWNvZGUgdGhlIGF1ZGlvIGRhdGEgZm9yIHBsYXliYWNrLlxuICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgIGxvYWRCdWZmZXIoc2VsZik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQbGF5IGEgc291bmQgb3IgcmVzdW1lIHByZXZpb3VzIHBsYXliYWNrLlxuICAgICAqIEBwYXJhbSAge1N0cmluZy9OdW1iZXJ9IHNwcml0ZSAgIFNwcml0ZSBuYW1lIGZvciBzcHJpdGUgcGxheWJhY2sgb3Igc291bmQgaWQgdG8gY29udGludWUgcHJldmlvdXMuXG4gICAgICogQHBhcmFtICB7Qm9vbGVhbn0gaW50ZXJuYWwgSW50ZXJuYWwgVXNlOiB0cnVlIHByZXZlbnRzIGV2ZW50IGZpcmluZy5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgICAgIFNvdW5kIElELlxuICAgICAqL1xuICAgIHBsYXk6IGZ1bmN0aW9uKHNwcml0ZSwgaW50ZXJuYWwpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBpZCA9IG51bGw7XG5cbiAgICAgIC8vIERldGVybWluZSBpZiBhIHNwcml0ZSwgc291bmQgaWQgb3Igbm90aGluZyB3YXMgcGFzc2VkXG4gICAgICBpZiAodHlwZW9mIHNwcml0ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWQgPSBzcHJpdGU7XG4gICAgICAgIHNwcml0ZSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzcHJpdGUgPT09ICdzdHJpbmcnICYmIHNlbGYuX3N0YXRlID09PSAnbG9hZGVkJyAmJiAhc2VsZi5fc3ByaXRlW3Nwcml0ZV0pIHtcbiAgICAgICAgLy8gSWYgdGhlIHBhc3NlZCBzcHJpdGUgZG9lc24ndCBleGlzdCwgZG8gbm90aGluZy5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzcHJpdGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBzb3VuZCBzcHJpdGUgKHBsYXlzIHRoZSBmdWxsIGF1ZGlvIGxlbmd0aCkuXG4gICAgICAgIHNwcml0ZSA9ICdfX2RlZmF1bHQnO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgc2luZ2xlIHBhdXNlZCBzb3VuZCB0aGF0IGlzbid0IGVuZGVkLlxuICAgICAgICAvLyBJZiB0aGVyZSBpcywgcGxheSB0aGF0IHNvdW5kLiBJZiBub3QsIGNvbnRpbnVlIGFzIHVzdWFsLlxuICAgICAgICBpZiAoIXNlbGYuX3BsYXlMb2NrKSB7XG4gICAgICAgICAgdmFyIG51bSA9IDA7XG4gICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX3NvdW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHNlbGYuX3NvdW5kc1tpXS5fcGF1c2VkICYmICFzZWxmLl9zb3VuZHNbaV0uX2VuZGVkKSB7XG4gICAgICAgICAgICAgIG51bSsrO1xuICAgICAgICAgICAgICBpZCA9IHNlbGYuX3NvdW5kc1tpXS5faWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG51bSA9PT0gMSkge1xuICAgICAgICAgICAgc3ByaXRlID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWQgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdGhlIHNlbGVjdGVkIG5vZGUsIG9yIGdldCBvbmUgZnJvbSB0aGUgcG9vbC5cbiAgICAgIHZhciBzb3VuZCA9IGlkID8gc2VsZi5fc291bmRCeUlkKGlkKSA6IHNlbGYuX2luYWN0aXZlU291bmQoKTtcblxuICAgICAgLy8gSWYgdGhlIHNvdW5kIGRvZXNuJ3QgZXhpc3QsIGRvIG5vdGhpbmcuXG4gICAgICBpZiAoIXNvdW5kKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBTZWxlY3QgdGhlIHNwcml0ZSBkZWZpbml0aW9uLlxuICAgICAgaWYgKGlkICYmICFzcHJpdGUpIHtcbiAgICAgICAgc3ByaXRlID0gc291bmQuX3Nwcml0ZSB8fCAnX19kZWZhdWx0JztcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIHdlIG11c3Qgd2FpdCB0byBnZXQgdGhlIGF1ZGlvJ3MgZHVyYXRpb24uXG4gICAgICAvLyBXZSBhbHNvIG5lZWQgdG8gd2FpdCB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgcnVuIGludG8gcmFjZSBjb25kaXRpb25zIHdpdGhcbiAgICAgIC8vIHRoZSBvcmRlciBvZiBmdW5jdGlvbiBjYWxscy5cbiAgICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgICAgLy8gU2V0IHRoZSBzcHJpdGUgdmFsdWUgb24gdGhpcyBzb3VuZC5cbiAgICAgICAgc291bmQuX3Nwcml0ZSA9IHNwcml0ZTtcblxuICAgICAgICAvLyBNYXJrIHRoaXMgc291bmQgYXMgbm90IGVuZGVkIGluIGNhc2UgYW5vdGhlciBzb3VuZCBpcyBwbGF5ZWQgYmVmb3JlIHRoaXMgb25lIGxvYWRzLlxuICAgICAgICBzb3VuZC5fZW5kZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBBZGQgdGhlIHNvdW5kIHRvIHRoZSBxdWV1ZSB0byBiZSBwbGF5ZWQgb24gbG9hZC5cbiAgICAgICAgdmFyIHNvdW5kSWQgPSBzb3VuZC5faWQ7XG4gICAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICAgIGV2ZW50OiAncGxheScsXG4gICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYucGxheShzb3VuZElkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzb3VuZElkO1xuICAgICAgfVxuXG4gICAgICAvLyBEb24ndCBwbGF5IHRoZSBzb3VuZCBpZiBhbiBpZCB3YXMgcGFzc2VkIGFuZCBpdCBpcyBhbHJlYWR5IHBsYXlpbmcuXG4gICAgICBpZiAoaWQgJiYgIXNvdW5kLl9wYXVzZWQpIHtcbiAgICAgICAgLy8gVHJpZ2dlciB0aGUgcGxheSBldmVudCwgaW4gb3JkZXIgdG8ga2VlcCBpdGVyYXRpbmcgdGhyb3VnaCBxdWV1ZS5cbiAgICAgICAgaWYgKCFpbnRlcm5hbCkge1xuICAgICAgICAgIHNlbGYuX2xvYWRRdWV1ZSgncGxheScpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNvdW5kLl9pZDtcbiAgICAgIH1cblxuICAgICAgLy8gTWFrZSBzdXJlIHRoZSBBdWRpb0NvbnRleHQgaXNuJ3Qgc3VzcGVuZGVkLCBhbmQgcmVzdW1lIGl0IGlmIGl0IGlzLlxuICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgIEhvd2xlci5fYXV0b1Jlc3VtZSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBEZXRlcm1pbmUgaG93IGxvbmcgdG8gcGxheSBmb3IgYW5kIHdoZXJlIHRvIHN0YXJ0IHBsYXlpbmcuXG4gICAgICB2YXIgc2VlayA9IE1hdGgubWF4KDAsIHNvdW5kLl9zZWVrID4gMCA/IHNvdW5kLl9zZWVrIDogc2VsZi5fc3ByaXRlW3Nwcml0ZV1bMF0gLyAxMDAwKTtcbiAgICAgIHZhciBkdXJhdGlvbiA9IE1hdGgubWF4KDAsICgoc2VsZi5fc3ByaXRlW3Nwcml0ZV1bMF0gKyBzZWxmLl9zcHJpdGVbc3ByaXRlXVsxXSkgLyAxMDAwKSAtIHNlZWspO1xuICAgICAgdmFyIHRpbWVvdXQgPSAoZHVyYXRpb24gKiAxMDAwKSAvIE1hdGguYWJzKHNvdW5kLl9yYXRlKTtcbiAgICAgIHZhciBzdGFydCA9IHNlbGYuX3Nwcml0ZVtzcHJpdGVdWzBdIC8gMTAwMDtcbiAgICAgIHZhciBzdG9wID0gKHNlbGYuX3Nwcml0ZVtzcHJpdGVdWzBdICsgc2VsZi5fc3ByaXRlW3Nwcml0ZV1bMV0pIC8gMTAwMDtcbiAgICAgIHNvdW5kLl9zcHJpdGUgPSBzcHJpdGU7XG5cbiAgICAgIC8vIE1hcmsgdGhlIHNvdW5kIGFzIGVuZGVkIGluc3RhbnRseSBzbyB0aGF0IHRoaXMgYXN5bmMgcGxheWJhY2tcbiAgICAgIC8vIGRvZXNuJ3QgZ2V0IGdyYWJiZWQgYnkgYW5vdGhlciBjYWxsIHRvIHBsYXkgd2hpbGUgdGhpcyBvbmUgd2FpdHMgdG8gc3RhcnQuXG4gICAgICBzb3VuZC5fZW5kZWQgPSBmYWxzZTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBzb3VuZC5cbiAgICAgIHZhciBzZXRQYXJhbXMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgc291bmQuX3BhdXNlZCA9IGZhbHNlO1xuICAgICAgICBzb3VuZC5fc2VlayA9IHNlZWs7XG4gICAgICAgIHNvdW5kLl9zdGFydCA9IHN0YXJ0O1xuICAgICAgICBzb3VuZC5fc3RvcCA9IHN0b3A7XG4gICAgICAgIHNvdW5kLl9sb29wID0gISEoc291bmQuX2xvb3AgfHwgc2VsZi5fc3ByaXRlW3Nwcml0ZV1bMl0pO1xuICAgICAgfTtcblxuICAgICAgLy8gRW5kIHRoZSBzb3VuZCBpbnN0YW50bHkgaWYgc2VlayBpcyBhdCB0aGUgZW5kLlxuICAgICAgaWYgKHNlZWsgPj0gc3RvcCkge1xuICAgICAgICBzZWxmLl9lbmRlZChzb3VuZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQmVnaW4gdGhlIGFjdHVhbCBwbGF5YmFjay5cbiAgICAgIHZhciBub2RlID0gc291bmQuX25vZGU7XG4gICAgICBpZiAoc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgLy8gRmlyZSB0aGlzIHdoZW4gdGhlIHNvdW5kIGlzIHJlYWR5IHRvIHBsYXkgdG8gYmVnaW4gV2ViIEF1ZGlvIHBsYXliYWNrLlxuICAgICAgICB2YXIgcGxheVdlYkF1ZGlvID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgc2VsZi5fcGxheUxvY2sgPSBmYWxzZTtcbiAgICAgICAgICBzZXRQYXJhbXMoKTtcbiAgICAgICAgICBzZWxmLl9yZWZyZXNoQnVmZmVyKHNvdW5kKTtcblxuICAgICAgICAgIC8vIFNldHVwIHRoZSBwbGF5YmFjayBwYXJhbXMuXG4gICAgICAgICAgdmFyIHZvbCA9IChzb3VuZC5fbXV0ZWQgfHwgc2VsZi5fbXV0ZWQpID8gMCA6IHNvdW5kLl92b2x1bWU7XG4gICAgICAgICAgbm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKHZvbCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgc291bmQuX3BsYXlTdGFydCA9IEhvd2xlci5jdHguY3VycmVudFRpbWU7XG5cbiAgICAgICAgICAvLyBQbGF5IHRoZSBzb3VuZCB1c2luZyB0aGUgc3VwcG9ydGVkIG1ldGhvZC5cbiAgICAgICAgICBpZiAodHlwZW9mIG5vZGUuYnVmZmVyU291cmNlLnN0YXJ0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgc291bmQuX2xvb3AgPyBub2RlLmJ1ZmZlclNvdXJjZS5ub3RlR3JhaW5PbigwLCBzZWVrLCA4NjQwMCkgOiBub2RlLmJ1ZmZlclNvdXJjZS5ub3RlR3JhaW5PbigwLCBzZWVrLCBkdXJhdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNvdW5kLl9sb29wID8gbm9kZS5idWZmZXJTb3VyY2Uuc3RhcnQoMCwgc2VlaywgODY0MDApIDogbm9kZS5idWZmZXJTb3VyY2Uuc3RhcnQoMCwgc2VlaywgZHVyYXRpb24pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFN0YXJ0IGEgbmV3IHRpbWVyIGlmIG5vbmUgaXMgcHJlc2VudC5cbiAgICAgICAgICBpZiAodGltZW91dCAhPT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgIHNlbGYuX2VuZFRpbWVyc1tzb3VuZC5faWRdID0gc2V0VGltZW91dChzZWxmLl9lbmRlZC5iaW5kKHNlbGYsIHNvdW5kKSwgdGltZW91dCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFpbnRlcm5hbCkge1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgc2VsZi5fZW1pdCgncGxheScsIHNvdW5kLl9pZCk7XG4gICAgICAgICAgICAgIHNlbGYuX2xvYWRRdWV1ZSgpO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChIb3dsZXIuc3RhdGUgPT09ICdydW5uaW5nJyAmJiBIb3dsZXIuY3R4LnN0YXRlICE9PSAnaW50ZXJydXB0ZWQnKSB7XG4gICAgICAgICAgcGxheVdlYkF1ZGlvKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZi5fcGxheUxvY2sgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGF1ZGlvIGNvbnRleHQgdG8gcmVzdW1lIGJlZm9yZSBwbGF5aW5nLlxuICAgICAgICAgIHNlbGYub25jZSgncmVzdW1lJywgcGxheVdlYkF1ZGlvKTtcblxuICAgICAgICAgIC8vIENhbmNlbCB0aGUgZW5kIHRpbWVyLlxuICAgICAgICAgIHNlbGYuX2NsZWFyVGltZXIoc291bmQuX2lkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRmlyZSB0aGlzIHdoZW4gdGhlIHNvdW5kIGlzIHJlYWR5IHRvIHBsYXkgdG8gYmVnaW4gSFRNTDUgQXVkaW8gcGxheWJhY2suXG4gICAgICAgIHZhciBwbGF5SHRtbDUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICBub2RlLmN1cnJlbnRUaW1lID0gc2VlaztcbiAgICAgICAgICBub2RlLm11dGVkID0gc291bmQuX211dGVkIHx8IHNlbGYuX211dGVkIHx8IEhvd2xlci5fbXV0ZWQgfHwgbm9kZS5tdXRlZDtcbiAgICAgICAgICBub2RlLnZvbHVtZSA9IHNvdW5kLl92b2x1bWUgKiBIb3dsZXIudm9sdW1lKCk7XG4gICAgICAgICAgbm9kZS5wbGF5YmFja1JhdGUgPSBzb3VuZC5fcmF0ZTtcblxuICAgICAgICAgIC8vIFNvbWUgYnJvd3NlcnMgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiB0aGlzIGlzIGNhbGxlZCB3aXRob3V0IHVzZXIgaW50ZXJhY3Rpb24uXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBwbGF5ID0gbm9kZS5wbGF5KCk7XG5cbiAgICAgICAgICAgIC8vIFN1cHBvcnQgb2xkZXIgYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IHByb21pc2VzLCBhbmQgdGh1cyBkb24ndCBoYXZlIHRoaXMgaXNzdWUuXG4gICAgICAgICAgICBpZiAocGxheSAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgKHBsYXkgaW5zdGFuY2VvZiBQcm9taXNlIHx8IHR5cGVvZiBwbGF5LnRoZW4gPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICAgICAgICAgIC8vIEltcGxlbWVudHMgYSBsb2NrIHRvIHByZXZlbnQgRE9NRXhjZXB0aW9uOiBUaGUgcGxheSgpIHJlcXVlc3Qgd2FzIGludGVycnVwdGVkIGJ5IGEgY2FsbCB0byBwYXVzZSgpLlxuICAgICAgICAgICAgICBzZWxmLl9wbGF5TG9jayA9IHRydWU7XG5cbiAgICAgICAgICAgICAgLy8gU2V0IHBhcmFtIHZhbHVlcyBpbW1lZGlhdGVseS5cbiAgICAgICAgICAgICAgc2V0UGFyYW1zKCk7XG5cbiAgICAgICAgICAgICAgLy8gUmVsZWFzZXMgdGhlIGxvY2sgYW5kIGV4ZWN1dGVzIHF1ZXVlZCBhY3Rpb25zLlxuICAgICAgICAgICAgICBwbGF5XG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICBzZWxmLl9wbGF5TG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgbm9kZS5fdW5sb2NrZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgaWYgKCFpbnRlcm5hbCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9lbWl0KCdwbGF5Jywgc291bmQuX2lkKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fbG9hZFF1ZXVlKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICBzZWxmLl9wbGF5TG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgc2VsZi5fZW1pdCgncGxheWVycm9yJywgc291bmQuX2lkLCAnUGxheWJhY2sgd2FzIHVuYWJsZSB0byBzdGFydC4gVGhpcyBpcyBtb3N0IGNvbW1vbmx5IGFuIGlzc3VlICcgK1xuICAgICAgICAgICAgICAgICAgICAnb24gbW9iaWxlIGRldmljZXMgYW5kIENocm9tZSB3aGVyZSBwbGF5YmFjayB3YXMgbm90IHdpdGhpbiBhIHVzZXIgaW50ZXJhY3Rpb24uJyk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBlbmRlZCBhbmQgcGF1c2VkIHZhbHVlcy5cbiAgICAgICAgICAgICAgICAgIHNvdW5kLl9lbmRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICBzb3VuZC5fcGF1c2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWludGVybmFsKSB7XG4gICAgICAgICAgICAgIHNlbGYuX3BsYXlMb2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgIHNldFBhcmFtcygpO1xuICAgICAgICAgICAgICBzZWxmLl9lbWl0KCdwbGF5Jywgc291bmQuX2lkKTtcbiAgICAgICAgICAgICAgc2VsZi5fbG9hZFF1ZXVlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNldHRpbmcgcmF0ZSBiZWZvcmUgcGxheWluZyB3b24ndCB3b3JrIGluIElFLCBzbyB3ZSBzZXQgaXQgYWdhaW4gaGVyZS5cbiAgICAgICAgICAgIG5vZGUucGxheWJhY2tSYXRlID0gc291bmQuX3JhdGU7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBub2RlIGlzIHN0aWxsIHBhdXNlZCwgdGhlbiB3ZSBjYW4gYXNzdW1lIHRoZXJlIHdhcyBhIHBsYXliYWNrIGlzc3VlLlxuICAgICAgICAgICAgaWYgKG5vZGUucGF1c2VkKSB7XG4gICAgICAgICAgICAgIHNlbGYuX2VtaXQoJ3BsYXllcnJvcicsIHNvdW5kLl9pZCwgJ1BsYXliYWNrIHdhcyB1bmFibGUgdG8gc3RhcnQuIFRoaXMgaXMgbW9zdCBjb21tb25seSBhbiBpc3N1ZSAnICtcbiAgICAgICAgICAgICAgICAnb24gbW9iaWxlIGRldmljZXMgYW5kIENocm9tZSB3aGVyZSBwbGF5YmFjayB3YXMgbm90IHdpdGhpbiBhIHVzZXIgaW50ZXJhY3Rpb24uJyk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2V0dXAgdGhlIGVuZCB0aW1lciBvbiBzcHJpdGVzIG9yIGxpc3RlbiBmb3IgdGhlIGVuZGVkIGV2ZW50LlxuICAgICAgICAgICAgaWYgKHNwcml0ZSAhPT0gJ19fZGVmYXVsdCcgfHwgc291bmQuX2xvb3ApIHtcbiAgICAgICAgICAgICAgc2VsZi5fZW5kVGltZXJzW3NvdW5kLl9pZF0gPSBzZXRUaW1lb3V0KHNlbGYuX2VuZGVkLmJpbmQoc2VsZiwgc291bmQpLCB0aW1lb3V0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlbGYuX2VuZFRpbWVyc1tzb3VuZC5faWRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgLy8gRmlyZSBlbmRlZCBvbiB0aGlzIGF1ZGlvIG5vZGUuXG4gICAgICAgICAgICAgICAgc2VsZi5fZW5kZWQoc291bmQpO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhpcyBsaXN0ZW5lci5cbiAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgc2VsZi5fZW5kVGltZXJzW3NvdW5kLl9pZF0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdlbmRlZCcsIHNlbGYuX2VuZFRpbWVyc1tzb3VuZC5faWRdLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBzZWxmLl9lbWl0KCdwbGF5ZXJyb3InLCBzb3VuZC5faWQsIGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIElmIHRoaXMgaXMgc3RyZWFtaW5nIGF1ZGlvLCBtYWtlIHN1cmUgdGhlIHNyYyBpcyBzZXQgYW5kIGxvYWQgYWdhaW4uXG4gICAgICAgIGlmIChub2RlLnNyYyA9PT0gJ2RhdGE6YXVkaW8vd2F2O2Jhc2U2NCxVa2xHUmlnQUFBQlhRVlpGWm0xMElCSUFBQUFCQUFFQVJLd0FBSWhZQVFBQ0FCQUFBQUJrWVhSaEFnQUFBQUVBJykge1xuICAgICAgICAgIG5vZGUuc3JjID0gc2VsZi5fc3JjO1xuICAgICAgICAgIG5vZGUubG9hZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGxheSBpbW1lZGlhdGVseSBpZiByZWFkeSwgb3Igd2FpdCBmb3IgdGhlICdjYW5wbGF5dGhyb3VnaCdlIHZlbnQuXG4gICAgICAgIHZhciBsb2FkZWROb1JlYWR5U3RhdGUgPSAod2luZG93ICYmIHdpbmRvdy5lamVjdGEpIHx8ICghbm9kZS5yZWFkeVN0YXRlICYmIEhvd2xlci5fbmF2aWdhdG9yLmlzQ29jb29uSlMpO1xuICAgICAgICBpZiAobm9kZS5yZWFkeVN0YXRlID49IDMgfHwgbG9hZGVkTm9SZWFkeVN0YXRlKSB7XG4gICAgICAgICAgcGxheUh0bWw1KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZi5fcGxheUxvY2sgPSB0cnVlO1xuXG4gICAgICAgICAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvLyBCZWdpbiBwbGF5YmFjay5cbiAgICAgICAgICAgIHBsYXlIdG1sNSgpO1xuXG4gICAgICAgICAgICAvLyBDbGVhciB0aGlzIGxpc3RlbmVyLlxuICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEhvd2xlci5fY2FuUGxheUV2ZW50LCBsaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKEhvd2xlci5fY2FuUGxheUV2ZW50LCBsaXN0ZW5lciwgZmFsc2UpO1xuXG4gICAgICAgICAgLy8gQ2FuY2VsIHRoZSBlbmQgdGltZXIuXG4gICAgICAgICAgc2VsZi5fY2xlYXJUaW1lcihzb3VuZC5faWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzb3VuZC5faWQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFBhdXNlIHBsYXliYWNrIGFuZCBzYXZlIGN1cnJlbnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBpZCBUaGUgc291bmQgSUQgKGVtcHR5IHRvIHBhdXNlIGFsbCBpbiBncm91cCkuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBwYXVzZTogZnVuY3Rpb24oaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQgb3IgYSBwbGF5KCkgcHJvbWlzZSBpcyBwZW5kaW5nLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gcGF1c2Ugd2hlbiBjYXBhYmxlLlxuICAgICAgaWYgKHNlbGYuX3N0YXRlICE9PSAnbG9hZGVkJyB8fCBzZWxmLl9wbGF5TG9jaykge1xuICAgICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgICBldmVudDogJ3BhdXNlJyxcbiAgICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5wYXVzZShpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gaWQgaXMgcGFzc2VkLCBnZXQgYWxsIElEJ3MgdG8gYmUgcGF1c2VkLlxuICAgICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKGlkKTtcblxuICAgICAgZm9yICh2YXIgaT0wOyBpPGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBDbGVhciB0aGUgZW5kIHRpbWVyLlxuICAgICAgICBzZWxmLl9jbGVhclRpbWVyKGlkc1tpXSk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBzb3VuZC5cbiAgICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkc1tpXSk7XG5cbiAgICAgICAgaWYgKHNvdW5kICYmICFzb3VuZC5fcGF1c2VkKSB7XG4gICAgICAgICAgLy8gUmVzZXQgdGhlIHNlZWsgcG9zaXRpb24uXG4gICAgICAgICAgc291bmQuX3NlZWsgPSBzZWxmLnNlZWsoaWRzW2ldKTtcbiAgICAgICAgICBzb3VuZC5fcmF0ZVNlZWsgPSAwO1xuICAgICAgICAgIHNvdW5kLl9wYXVzZWQgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gU3RvcCBjdXJyZW50bHkgcnVubmluZyBmYWRlcy5cbiAgICAgICAgICBzZWxmLl9zdG9wRmFkZShpZHNbaV0pO1xuXG4gICAgICAgICAgaWYgKHNvdW5kLl9ub2RlKSB7XG4gICAgICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBzb3VuZCBoYXMgYmVlbiBjcmVhdGVkLlxuICAgICAgICAgICAgICBpZiAoIXNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2Uuc3RvcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2Uubm90ZU9mZigwKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2Uuc3RvcCgwKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIENsZWFuIHVwIHRoZSBidWZmZXIgc291cmNlLlxuICAgICAgICAgICAgICBzZWxmLl9jbGVhbkJ1ZmZlcihzb3VuZC5fbm9kZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc05hTihzb3VuZC5fbm9kZS5kdXJhdGlvbikgfHwgc291bmQuX25vZGUuZHVyYXRpb24gPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9ub2RlLnBhdXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmlyZSB0aGUgcGF1c2UgZXZlbnQsIHVubGVzcyBgdHJ1ZWAgaXMgcGFzc2VkIGFzIHRoZSAybmQgYXJndW1lbnQuXG4gICAgICAgIGlmICghYXJndW1lbnRzWzFdKSB7XG4gICAgICAgICAgc2VsZi5fZW1pdCgncGF1c2UnLCBzb3VuZCA/IHNvdW5kLl9pZCA6IG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTdG9wIHBsYXliYWNrIGFuZCByZXNldCB0byBzdGFydC5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkIFRoZSBzb3VuZCBJRCAoZW1wdHkgdG8gc3RvcCBhbGwgaW4gZ3JvdXApLlxuICAgICAqIEBwYXJhbSAge0Jvb2xlYW59IGludGVybmFsIEludGVybmFsIFVzZTogdHJ1ZSBwcmV2ZW50cyBldmVudCBmaXJpbmcuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBzdG9wOiBmdW5jdGlvbihpZCwgaW50ZXJuYWwpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIGFkZCBpdCB0byB0aGUgbG9hZCBxdWV1ZSB0byBzdG9wIHdoZW4gY2FwYWJsZS5cbiAgICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcgfHwgc2VsZi5fcGxheUxvY2spIHtcbiAgICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgICAgZXZlbnQ6ICdzdG9wJyxcbiAgICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5zdG9wKGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBubyBpZCBpcyBwYXNzZWQsIGdldCBhbGwgSUQncyB0byBiZSBzdG9wcGVkLlxuICAgICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKGlkKTtcblxuICAgICAgZm9yICh2YXIgaT0wOyBpPGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBDbGVhciB0aGUgZW5kIHRpbWVyLlxuICAgICAgICBzZWxmLl9jbGVhclRpbWVyKGlkc1tpXSk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBzb3VuZC5cbiAgICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkc1tpXSk7XG5cbiAgICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgICAgLy8gUmVzZXQgdGhlIHNlZWsgcG9zaXRpb24uXG4gICAgICAgICAgc291bmQuX3NlZWsgPSBzb3VuZC5fc3RhcnQgfHwgMDtcbiAgICAgICAgICBzb3VuZC5fcmF0ZVNlZWsgPSAwO1xuICAgICAgICAgIHNvdW5kLl9wYXVzZWQgPSB0cnVlO1xuICAgICAgICAgIHNvdW5kLl9lbmRlZCA9IHRydWU7XG5cbiAgICAgICAgICAvLyBTdG9wIGN1cnJlbnRseSBydW5uaW5nIGZhZGVzLlxuICAgICAgICAgIHNlbGYuX3N0b3BGYWRlKGlkc1tpXSk7XG5cbiAgICAgICAgICBpZiAoc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbykge1xuICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHNvdW5kJ3MgQXVkaW9CdWZmZXJTb3VyY2VOb2RlIGhhcyBiZWVuIGNyZWF0ZWQuXG4gICAgICAgICAgICAgIGlmIChzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5zdG9wID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLm5vdGVPZmYoMCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5zdG9wKDApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENsZWFuIHVwIHRoZSBidWZmZXIgc291cmNlLlxuICAgICAgICAgICAgICAgIHNlbGYuX2NsZWFuQnVmZmVyKHNvdW5kLl9ub2RlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICghaXNOYU4oc291bmQuX25vZGUuZHVyYXRpb24pIHx8IHNvdW5kLl9ub2RlLmR1cmF0aW9uID09PSBJbmZpbml0eSkge1xuICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5jdXJyZW50VGltZSA9IHNvdW5kLl9zdGFydCB8fCAwO1xuICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5wYXVzZSgpO1xuXG4gICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBsaXZlIHN0cmVhbSwgc3RvcCBkb3dubG9hZCBvbmNlIHRoZSBhdWRpbyBpcyBzdG9wcGVkLlxuICAgICAgICAgICAgICBpZiAoc291bmQuX25vZGUuZHVyYXRpb24gPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgICAgICAgc2VsZi5fY2xlYXJTb3VuZChzb3VuZC5fbm9kZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWludGVybmFsKSB7XG4gICAgICAgICAgICBzZWxmLl9lbWl0KCdzdG9wJywgc291bmQuX2lkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE11dGUvdW5tdXRlIGEgc2luZ2xlIHNvdW5kIG9yIGFsbCBzb3VuZHMgaW4gdGhpcyBIb3dsIGdyb3VwLlxuICAgICAqIEBwYXJhbSAge0Jvb2xlYW59IG11dGVkIFNldCB0byB0cnVlIHRvIG11dGUgYW5kIGZhbHNlIHRvIHVubXV0ZS5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkICAgIFRoZSBzb3VuZCBJRCB0byB1cGRhdGUgKG9taXQgdG8gbXV0ZS91bm11dGUgYWxsKS5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIG11dGU6IGZ1bmN0aW9uKG11dGVkLCBpZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyBJZiB0aGUgc291bmQgaGFzbid0IGxvYWRlZCwgYWRkIGl0IHRvIHRoZSBsb2FkIHF1ZXVlIHRvIG11dGUgd2hlbiBjYXBhYmxlLlxuICAgICAgaWYgKHNlbGYuX3N0YXRlICE9PSAnbG9hZGVkJ3x8IHNlbGYuX3BsYXlMb2NrKSB7XG4gICAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICAgIGV2ZW50OiAnbXV0ZScsXG4gICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYubXV0ZShtdXRlZCwgaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGFwcGx5aW5nIG11dGUvdW5tdXRlIHRvIGFsbCBzb3VuZHMsIHVwZGF0ZSB0aGUgZ3JvdXAncyB2YWx1ZS5cbiAgICAgIGlmICh0eXBlb2YgaWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbXV0ZWQgPT09ICdib29sZWFuJykge1xuICAgICAgICAgIHNlbGYuX211dGVkID0gbXV0ZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuX211dGVkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIGlkIGlzIHBhc3NlZCwgZ2V0IGFsbCBJRCdzIHRvIGJlIG11dGVkLlxuICAgICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKGlkKTtcblxuICAgICAgZm9yICh2YXIgaT0wOyBpPGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBHZXQgdGhlIHNvdW5kLlxuICAgICAgICB2YXIgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWRzW2ldKTtcblxuICAgICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgICBzb3VuZC5fbXV0ZWQgPSBtdXRlZDtcblxuICAgICAgICAgIC8vIENhbmNlbCBhY3RpdmUgZmFkZSBhbmQgc2V0IHRoZSB2b2x1bWUgdG8gdGhlIGVuZCB2YWx1ZS5cbiAgICAgICAgICBpZiAoc291bmQuX2ludGVydmFsKSB7XG4gICAgICAgICAgICBzZWxmLl9zdG9wRmFkZShzb3VuZC5faWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbyAmJiBzb3VuZC5fbm9kZSkge1xuICAgICAgICAgICAgc291bmQuX25vZGUuZ2Fpbi5zZXRWYWx1ZUF0VGltZShtdXRlZCA/IDAgOiBzb3VuZC5fdm9sdW1lLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNvdW5kLl9ub2RlKSB7XG4gICAgICAgICAgICBzb3VuZC5fbm9kZS5tdXRlZCA9IEhvd2xlci5fbXV0ZWQgPyB0cnVlIDogbXV0ZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi5fZW1pdCgnbXV0ZScsIHNvdW5kLl9pZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldC9zZXQgdGhlIHZvbHVtZSBvZiB0aGlzIHNvdW5kIG9yIG9mIHRoZSBIb3dsIGdyb3VwLiBUaGlzIG1ldGhvZCBjYW4gb3B0aW9uYWxseSB0YWtlIDAsIDEgb3IgMiBhcmd1bWVudHMuXG4gICAgICogICB2b2x1bWUoKSAtPiBSZXR1cm5zIHRoZSBncm91cCdzIHZvbHVtZSB2YWx1ZS5cbiAgICAgKiAgIHZvbHVtZShpZCkgLT4gUmV0dXJucyB0aGUgc291bmQgaWQncyBjdXJyZW50IHZvbHVtZS5cbiAgICAgKiAgIHZvbHVtZSh2b2wpIC0+IFNldHMgdGhlIHZvbHVtZSBvZiBhbGwgc291bmRzIGluIHRoaXMgSG93bCBncm91cC5cbiAgICAgKiAgIHZvbHVtZSh2b2wsIGlkKSAtPiBTZXRzIHRoZSB2b2x1bWUgb2YgcGFzc2VkIHNvdW5kIGlkLlxuICAgICAqIEByZXR1cm4ge0hvd2wvTnVtYmVyfSBSZXR1cm5zIHNlbGYgb3IgY3VycmVudCB2b2x1bWUuXG4gICAgICovXG4gICAgdm9sdW1lOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgdmFyIHZvbCwgaWQ7XG5cbiAgICAgIC8vIERldGVybWluZSB0aGUgdmFsdWVzIGJhc2VkIG9uIGFyZ3VtZW50cy5cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBncm91cHMnIHZvbHVtZS5cbiAgICAgICAgcmV0dXJuIHNlbGYuX3ZvbHVtZTtcbiAgICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDEgfHwgYXJncy5sZW5ndGggPT09IDIgJiYgdHlwZW9mIGFyZ3NbMV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIHRoaXMgaXMgYW4gSUQsIGFuZCBpZiBub3QsIGFzc3VtZSBpdCBpcyBhIG5ldyB2b2x1bWUuXG4gICAgICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcygpO1xuICAgICAgICB2YXIgaW5kZXggPSBpZHMuaW5kZXhPZihhcmdzWzBdKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBpZCA9IHBhcnNlSW50KGFyZ3NbMF0sIDEwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2b2wgPSBwYXJzZUZsb2F0KGFyZ3NbMF0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID49IDIpIHtcbiAgICAgICAgdm9sID0gcGFyc2VGbG9hdChhcmdzWzBdKTtcbiAgICAgICAgaWQgPSBwYXJzZUludChhcmdzWzFdLCAxMCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgdm9sdW1lIG9yIHJldHVybiB0aGUgY3VycmVudCB2b2x1bWUuXG4gICAgICB2YXIgc291bmQ7XG4gICAgICBpZiAodHlwZW9mIHZvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgdm9sID49IDAgJiYgdm9sIDw9IDEpIHtcbiAgICAgICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIGFkZCBpdCB0byB0aGUgbG9hZCBxdWV1ZSB0byBjaGFuZ2Ugdm9sdW1lIHdoZW4gY2FwYWJsZS5cbiAgICAgICAgaWYgKHNlbGYuX3N0YXRlICE9PSAnbG9hZGVkJ3x8IHNlbGYuX3BsYXlMb2NrKSB7XG4gICAgICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgICAgICBldmVudDogJ3ZvbHVtZScsXG4gICAgICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBzZWxmLnZvbHVtZS5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHRoZSBncm91cCB2b2x1bWUuXG4gICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgc2VsZi5fdm9sdW1lID0gdm9sO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIG9uZSBvciBhbGwgdm9sdW1lcy5cbiAgICAgICAgaWQgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG4gICAgICAgIGZvciAodmFyIGk9MDsgaTxpZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIC8vIEdldCB0aGUgc291bmQuXG4gICAgICAgICAgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWRbaV0pO1xuXG4gICAgICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgICAgICBzb3VuZC5fdm9sdW1lID0gdm9sO1xuXG4gICAgICAgICAgICAvLyBTdG9wIGN1cnJlbnRseSBydW5uaW5nIGZhZGVzLlxuICAgICAgICAgICAgaWYgKCFhcmdzWzJdKSB7XG4gICAgICAgICAgICAgIHNlbGYuX3N0b3BGYWRlKGlkW2ldKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvICYmIHNvdW5kLl9ub2RlICYmICFzb3VuZC5fbXV0ZWQpIHtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUuZ2Fpbi5zZXRWYWx1ZUF0VGltZSh2b2wsIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VuZC5fbm9kZSAmJiAhc291bmQuX211dGVkKSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9ub2RlLnZvbHVtZSA9IHZvbCAqIEhvd2xlci52b2x1bWUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2VsZi5fZW1pdCgndm9sdW1lJywgc291bmQuX2lkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvdW5kID0gaWQgPyBzZWxmLl9zb3VuZEJ5SWQoaWQpIDogc2VsZi5fc291bmRzWzBdO1xuICAgICAgICByZXR1cm4gc291bmQgPyBzb3VuZC5fdm9sdW1lIDogMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZhZGUgYSBjdXJyZW50bHkgcGxheWluZyBzb3VuZCBiZXR3ZWVuIHR3byB2b2x1bWVzIChpZiBubyBpZCBpcyBwYXNzZWQsIGFsbCBzb3VuZHMgd2lsbCBmYWRlKS5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGZyb20gVGhlIHZhbHVlIHRvIGZhZGUgZnJvbSAoMC4wIHRvIDEuMCkuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSB0byAgIFRoZSB2b2x1bWUgdG8gZmFkZSB0byAoMC4wIHRvIDEuMCkuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBsZW4gIFRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIGZhZGUuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBpZCAgIFRoZSBzb3VuZCBpZCAob21pdCB0byBmYWRlIGFsbCBzb3VuZHMpLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgZmFkZTogZnVuY3Rpb24oZnJvbSwgdG8sIGxlbiwgaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIGFkZCBpdCB0byB0aGUgbG9hZCBxdWV1ZSB0byBmYWRlIHdoZW4gY2FwYWJsZS5cbiAgICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcgfHwgc2VsZi5fcGxheUxvY2spIHtcbiAgICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgICAgZXZlbnQ6ICdmYWRlJyxcbiAgICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5mYWRlKGZyb20sIHRvLCBsZW4sIGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfVxuXG4gICAgICAvLyBNYWtlIHN1cmUgdGhlIHRvL2Zyb20vbGVuIHZhbHVlcyBhcmUgbnVtYmVycy5cbiAgICAgIGZyb20gPSBNYXRoLm1pbihNYXRoLm1heCgwLCBwYXJzZUZsb2F0KGZyb20pKSwgMSk7XG4gICAgICB0byA9IE1hdGgubWluKE1hdGgubWF4KDAsIHBhcnNlRmxvYXQodG8pKSwgMSk7XG4gICAgICBsZW4gPSBwYXJzZUZsb2F0KGxlbik7XG5cbiAgICAgIC8vIFNldCB0aGUgdm9sdW1lIHRvIHRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgIHNlbGYudm9sdW1lKGZyb20sIGlkKTtcblxuICAgICAgLy8gRmFkZSB0aGUgdm9sdW1lIG9mIG9uZSBvciBhbGwgc291bmRzLlxuICAgICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKGlkKTtcbiAgICAgIGZvciAodmFyIGk9MDsgaTxpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gR2V0IHRoZSBzb3VuZC5cbiAgICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkc1tpXSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgbGluZWFyIGZhZGUgb3IgZmFsbCBiYWNrIHRvIHRpbWVvdXRzIHdpdGggSFRNTDUgQXVkaW8uXG4gICAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICAgIC8vIFN0b3AgdGhlIHByZXZpb3VzIGZhZGUgaWYgbm8gc3ByaXRlIGlzIGJlaW5nIHVzZWQgKG90aGVyd2lzZSwgdm9sdW1lIGhhbmRsZXMgdGhpcykuXG4gICAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgICAgc2VsZi5fc3RvcEZhZGUoaWRzW2ldKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiB3ZSBhcmUgdXNpbmcgV2ViIEF1ZGlvLCBsZXQgdGhlIG5hdGl2ZSBtZXRob2RzIGRvIHRoZSBhY3R1YWwgZmFkZS5cbiAgICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8gJiYgIXNvdW5kLl9tdXRlZCkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRUaW1lID0gSG93bGVyLmN0eC5jdXJyZW50VGltZTtcbiAgICAgICAgICAgIHZhciBlbmQgPSBjdXJyZW50VGltZSArIChsZW4gLyAxMDAwKTtcbiAgICAgICAgICAgIHNvdW5kLl92b2x1bWUgPSBmcm9tO1xuICAgICAgICAgICAgc291bmQuX25vZGUuZ2Fpbi5zZXRWYWx1ZUF0VGltZShmcm9tLCBjdXJyZW50VGltZSk7XG4gICAgICAgICAgICBzb3VuZC5fbm9kZS5nYWluLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKHRvLCBlbmQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlbGYuX3N0YXJ0RmFkZUludGVydmFsKHNvdW5kLCBmcm9tLCB0bywgbGVuLCBpZHNbaV0sIHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTdGFydHMgdGhlIGludGVybmFsIGludGVydmFsIHRvIGZhZGUgYSBzb3VuZC5cbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IHNvdW5kIFJlZmVyZW5jZSB0byBzb3VuZCB0byBmYWRlLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gZnJvbSBUaGUgdmFsdWUgdG8gZmFkZSBmcm9tICgwLjAgdG8gMS4wKS5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHRvICAgVGhlIHZvbHVtZSB0byBmYWRlIHRvICgwLjAgdG8gMS4wKS5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGxlbiAgVGltZSBpbiBtaWxsaXNlY29uZHMgdG8gZmFkZS5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkICAgVGhlIHNvdW5kIGlkIHRvIGZhZGUuXG4gICAgICogQHBhcmFtICB7Qm9vbGVhbn0gaXNHcm91cCAgIElmIHRydWUsIHNldCB0aGUgdm9sdW1lIG9uIHRoZSBncm91cC5cbiAgICAgKi9cbiAgICBfc3RhcnRGYWRlSW50ZXJ2YWw6IGZ1bmN0aW9uKHNvdW5kLCBmcm9tLCB0bywgbGVuLCBpZCwgaXNHcm91cCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHZvbCA9IGZyb207XG4gICAgICB2YXIgZGlmZiA9IHRvIC0gZnJvbTtcbiAgICAgIHZhciBzdGVwcyA9IE1hdGguYWJzKGRpZmYgLyAwLjAxKTtcbiAgICAgIHZhciBzdGVwTGVuID0gTWF0aC5tYXgoNCwgKHN0ZXBzID4gMCkgPyBsZW4gLyBzdGVwcyA6IGxlbik7XG4gICAgICB2YXIgbGFzdFRpY2sgPSBEYXRlLm5vdygpO1xuXG4gICAgICAvLyBTdG9yZSB0aGUgdmFsdWUgYmVpbmcgZmFkZWQgdG8uXG4gICAgICBzb3VuZC5fZmFkZVRvID0gdG87XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgdm9sdW1lIHZhbHVlIG9uIGVhY2ggaW50ZXJ2YWwgdGljay5cbiAgICAgIHNvdW5kLl9pbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBVcGRhdGUgdGhlIHZvbHVtZSBiYXNlZCBvbiB0aGUgdGltZSBzaW5jZSB0aGUgbGFzdCB0aWNrLlxuICAgICAgICB2YXIgdGljayA9IChEYXRlLm5vdygpIC0gbGFzdFRpY2spIC8gbGVuO1xuICAgICAgICBsYXN0VGljayA9IERhdGUubm93KCk7XG4gICAgICAgIHZvbCArPSBkaWZmICogdGljaztcblxuICAgICAgICAvLyBSb3VuZCB0byB3aXRoaW4gMiBkZWNpbWFsIHBvaW50cy5cbiAgICAgICAgdm9sID0gTWF0aC5yb3VuZCh2b2wgKiAxMDApIC8gMTAwO1xuXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgdm9sdW1lIGlzIGluIHRoZSByaWdodCBib3VuZHMuXG4gICAgICAgIGlmIChkaWZmIDwgMCkge1xuICAgICAgICAgIHZvbCA9IE1hdGgubWF4KHRvLCB2b2wpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZvbCA9IE1hdGgubWluKHRvLCB2b2wpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hhbmdlIHRoZSB2b2x1bWUuXG4gICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbykge1xuICAgICAgICAgIHNvdW5kLl92b2x1bWUgPSB2b2w7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZi52b2x1bWUodm9sLCBzb3VuZC5faWQsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHRoZSBncm91cCdzIHZvbHVtZS5cbiAgICAgICAgaWYgKGlzR3JvdXApIHtcbiAgICAgICAgICBzZWxmLl92b2x1bWUgPSB2b2w7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXaGVuIHRoZSBmYWRlIGlzIGNvbXBsZXRlLCBzdG9wIGl0IGFuZCBmaXJlIGV2ZW50LlxuICAgICAgICBpZiAoKHRvIDwgZnJvbSAmJiB2b2wgPD0gdG8pIHx8ICh0byA+IGZyb20gJiYgdm9sID49IHRvKSkge1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwoc291bmQuX2ludGVydmFsKTtcbiAgICAgICAgICBzb3VuZC5faW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICAgIHNvdW5kLl9mYWRlVG8gPSBudWxsO1xuICAgICAgICAgIHNlbGYudm9sdW1lKHRvLCBzb3VuZC5faWQpO1xuICAgICAgICAgIHNlbGYuX2VtaXQoJ2ZhZGUnLCBzb3VuZC5faWQpO1xuICAgICAgICB9XG4gICAgICB9LCBzdGVwTGVuKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgbWV0aG9kIHRoYXQgc3RvcHMgdGhlIGN1cnJlbnRseSBwbGF5aW5nIGZhZGUgd2hlblxuICAgICAqIGEgbmV3IGZhZGUgc3RhcnRzLCB2b2x1bWUgaXMgY2hhbmdlZCBvciB0aGUgc291bmQgaXMgc3RvcHBlZC5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkIFRoZSBzb3VuZCBpZC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIF9zdG9wRmFkZTogZnVuY3Rpb24oaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZCk7XG5cbiAgICAgIGlmIChzb3VuZCAmJiBzb3VuZC5faW50ZXJ2YWwpIHtcbiAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgICAgc291bmQuX25vZGUuZ2Fpbi5jYW5jZWxTY2hlZHVsZWRWYWx1ZXMoSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjbGVhckludGVydmFsKHNvdW5kLl9pbnRlcnZhbCk7XG4gICAgICAgIHNvdW5kLl9pbnRlcnZhbCA9IG51bGw7XG4gICAgICAgIHNlbGYudm9sdW1lKHNvdW5kLl9mYWRlVG8sIGlkKTtcbiAgICAgICAgc291bmQuX2ZhZGVUbyA9IG51bGw7XG4gICAgICAgIHNlbGYuX2VtaXQoJ2ZhZGUnLCBpZCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQvc2V0IHRoZSBsb29wIHBhcmFtZXRlciBvbiBhIHNvdW5kLiBUaGlzIG1ldGhvZCBjYW4gb3B0aW9uYWxseSB0YWtlIDAsIDEgb3IgMiBhcmd1bWVudHMuXG4gICAgICogICBsb29wKCkgLT4gUmV0dXJucyB0aGUgZ3JvdXAncyBsb29wIHZhbHVlLlxuICAgICAqICAgbG9vcChpZCkgLT4gUmV0dXJucyB0aGUgc291bmQgaWQncyBsb29wIHZhbHVlLlxuICAgICAqICAgbG9vcChsb29wKSAtPiBTZXRzIHRoZSBsb29wIHZhbHVlIGZvciBhbGwgc291bmRzIGluIHRoaXMgSG93bCBncm91cC5cbiAgICAgKiAgIGxvb3AobG9vcCwgaWQpIC0+IFNldHMgdGhlIGxvb3AgdmFsdWUgb2YgcGFzc2VkIHNvdW5kIGlkLlxuICAgICAqIEByZXR1cm4ge0hvd2wvQm9vbGVhbn0gUmV0dXJucyBzZWxmIG9yIGN1cnJlbnQgbG9vcCB2YWx1ZS5cbiAgICAgKi9cbiAgICBsb29wOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgdmFyIGxvb3AsIGlkLCBzb3VuZDtcblxuICAgICAgLy8gRGV0ZXJtaW5lIHRoZSB2YWx1ZXMgZm9yIGxvb3AgYW5kIGlkLlxuICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIFJldHVybiB0aGUgZ3JvdSdzIGxvb3AgdmFsdWUuXG4gICAgICAgIHJldHVybiBzZWxmLl9sb29wO1xuICAgICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdib29sZWFuJykge1xuICAgICAgICAgIGxvb3AgPSBhcmdzWzBdO1xuICAgICAgICAgIHNlbGYuX2xvb3AgPSBsb29wO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFJldHVybiB0aGlzIHNvdW5kJ3MgbG9vcCB2YWx1ZS5cbiAgICAgICAgICBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChwYXJzZUludChhcmdzWzBdLCAxMCkpO1xuICAgICAgICAgIHJldHVybiBzb3VuZCA/IHNvdW5kLl9sb29wIDogZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgbG9vcCA9IGFyZ3NbMF07XG4gICAgICAgIGlkID0gcGFyc2VJbnQoYXJnc1sxXSwgMTApO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBubyBpZCBpcyBwYXNzZWQsIGdldCBhbGwgSUQncyB0byBiZSBsb29wZWQuXG4gICAgICB2YXIgaWRzID0gc2VsZi5fZ2V0U291bmRJZHMoaWQpO1xuICAgICAgZm9yICh2YXIgaT0wOyBpPGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZHNbaV0pO1xuXG4gICAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICAgIHNvdW5kLl9sb29wID0gbG9vcDtcbiAgICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8gJiYgc291bmQuX25vZGUgJiYgc291bmQuX25vZGUuYnVmZmVyU291cmNlKSB7XG4gICAgICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UubG9vcCA9IGxvb3A7XG4gICAgICAgICAgICBpZiAobG9vcCkge1xuICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UubG9vcFN0YXJ0ID0gc291bmQuX3N0YXJ0IHx8IDA7XG4gICAgICAgICAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5sb29wRW5kID0gc291bmQuX3N0b3A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQvc2V0IHRoZSBwbGF5YmFjayByYXRlIG9mIGEgc291bmQuIFRoaXMgbWV0aG9kIGNhbiBvcHRpb25hbGx5IHRha2UgMCwgMSBvciAyIGFyZ3VtZW50cy5cbiAgICAgKiAgIHJhdGUoKSAtPiBSZXR1cm5zIHRoZSBmaXJzdCBzb3VuZCBub2RlJ3MgY3VycmVudCBwbGF5YmFjayByYXRlLlxuICAgICAqICAgcmF0ZShpZCkgLT4gUmV0dXJucyB0aGUgc291bmQgaWQncyBjdXJyZW50IHBsYXliYWNrIHJhdGUuXG4gICAgICogICByYXRlKHJhdGUpIC0+IFNldHMgdGhlIHBsYXliYWNrIHJhdGUgb2YgYWxsIHNvdW5kcyBpbiB0aGlzIEhvd2wgZ3JvdXAuXG4gICAgICogICByYXRlKHJhdGUsIGlkKSAtPiBTZXRzIHRoZSBwbGF5YmFjayByYXRlIG9mIHBhc3NlZCBzb3VuZCBpZC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsL051bWJlcn0gUmV0dXJucyBzZWxmIG9yIHRoZSBjdXJyZW50IHBsYXliYWNrIHJhdGUuXG4gICAgICovXG4gICAgcmF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgIHZhciByYXRlLCBpZDtcblxuICAgICAgLy8gRGV0ZXJtaW5lIHRoZSB2YWx1ZXMgYmFzZWQgb24gYXJndW1lbnRzLlxuICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIFdlIHdpbGwgc2ltcGx5IHJldHVybiB0aGUgY3VycmVudCByYXRlIG9mIHRoZSBmaXJzdCBub2RlLlxuICAgICAgICBpZCA9IHNlbGYuX3NvdW5kc1swXS5faWQ7XG4gICAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIHRoaXMgaXMgYW4gSUQsIGFuZCBpZiBub3QsIGFzc3VtZSBpdCBpcyBhIG5ldyByYXRlIHZhbHVlLlxuICAgICAgICB2YXIgaWRzID0gc2VsZi5fZ2V0U291bmRJZHMoKTtcbiAgICAgICAgdmFyIGluZGV4ID0gaWRzLmluZGV4T2YoYXJnc1swXSk7XG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgaWQgPSBwYXJzZUludChhcmdzWzBdLCAxMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmF0ZSA9IHBhcnNlRmxvYXQoYXJnc1swXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgcmF0ZSA9IHBhcnNlRmxvYXQoYXJnc1swXSk7XG4gICAgICAgIGlkID0gcGFyc2VJbnQoYXJnc1sxXSwgMTApO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgdGhlIHBsYXliYWNrIHJhdGUgb3IgcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlLlxuICAgICAgdmFyIHNvdW5kO1xuICAgICAgaWYgKHR5cGVvZiByYXRlID09PSAnbnVtYmVyJykge1xuICAgICAgICAvLyBJZiB0aGUgc291bmQgaGFzbid0IGxvYWRlZCwgYWRkIGl0IHRvIHRoZSBsb2FkIHF1ZXVlIHRvIGNoYW5nZSBwbGF5YmFjayByYXRlIHdoZW4gY2FwYWJsZS5cbiAgICAgICAgaWYgKHNlbGYuX3N0YXRlICE9PSAnbG9hZGVkJyB8fCBzZWxmLl9wbGF5TG9jaykge1xuICAgICAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICAgICAgZXZlbnQ6ICdyYXRlJyxcbiAgICAgICAgICAgIGFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHNlbGYucmF0ZS5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHRoZSBncm91cCByYXRlLlxuICAgICAgICBpZiAodHlwZW9mIGlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHNlbGYuX3JhdGUgPSByYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIG9uZSBvciBhbGwgdm9sdW1lcy5cbiAgICAgICAgaWQgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG4gICAgICAgIGZvciAodmFyIGk9MDsgaTxpZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIC8vIEdldCB0aGUgc291bmQuXG4gICAgICAgICAgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWRbaV0pO1xuXG4gICAgICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIG91ciBwb3NpdGlvbiB3aGVuIHRoZSByYXRlIGNoYW5nZWQgYW5kIHVwZGF0ZSB0aGUgcGxheWJhY2tcbiAgICAgICAgICAgIC8vIHN0YXJ0IHBvc2l0aW9uIHNvIHdlIGNhbiBwcm9wZXJseSBhZGp1c3QgdGhlIHNlZWsgcG9zaXRpb24gZm9yIHRpbWUgZWxhcHNlZC5cbiAgICAgICAgICAgIGlmIChzZWxmLnBsYXlpbmcoaWRbaV0pKSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9yYXRlU2VlayA9IHNlbGYuc2VlayhpZFtpXSk7XG4gICAgICAgICAgICAgIHNvdW5kLl9wbGF5U3RhcnQgPSBzZWxmLl93ZWJBdWRpbyA/IEhvd2xlci5jdHguY3VycmVudFRpbWUgOiBzb3VuZC5fcGxheVN0YXJ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc291bmQuX3JhdGUgPSByYXRlO1xuXG4gICAgICAgICAgICAvLyBDaGFuZ2UgdGhlIHBsYXliYWNrIHJhdGUuXG4gICAgICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8gJiYgc291bmQuX25vZGUgJiYgc291bmQuX25vZGUuYnVmZmVyU291cmNlKSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5wbGF5YmFja1JhdGUuc2V0VmFsdWVBdFRpbWUocmF0ZSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdW5kLl9ub2RlKSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9ub2RlLnBsYXliYWNrUmF0ZSA9IHJhdGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlc2V0IHRoZSB0aW1lcnMuXG4gICAgICAgICAgICB2YXIgc2VlayA9IHNlbGYuc2VlayhpZFtpXSk7XG4gICAgICAgICAgICB2YXIgZHVyYXRpb24gPSAoKHNlbGYuX3Nwcml0ZVtzb3VuZC5fc3ByaXRlXVswXSArIHNlbGYuX3Nwcml0ZVtzb3VuZC5fc3ByaXRlXVsxXSkgLyAxMDAwKSAtIHNlZWs7XG4gICAgICAgICAgICB2YXIgdGltZW91dCA9IChkdXJhdGlvbiAqIDEwMDApIC8gTWF0aC5hYnMoc291bmQuX3JhdGUpO1xuXG4gICAgICAgICAgICAvLyBTdGFydCBhIG5ldyBlbmQgdGltZXIgaWYgc291bmQgaXMgYWxyZWFkeSBwbGF5aW5nLlxuICAgICAgICAgICAgaWYgKHNlbGYuX2VuZFRpbWVyc1tpZFtpXV0gfHwgIXNvdW5kLl9wYXVzZWQpIHtcbiAgICAgICAgICAgICAgc2VsZi5fY2xlYXJUaW1lcihpZFtpXSk7XG4gICAgICAgICAgICAgIHNlbGYuX2VuZFRpbWVyc1tpZFtpXV0gPSBzZXRUaW1lb3V0KHNlbGYuX2VuZGVkLmJpbmQoc2VsZiwgc291bmQpLCB0aW1lb3V0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2VsZi5fZW1pdCgncmF0ZScsIHNvdW5kLl9pZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZCk7XG4gICAgICAgIHJldHVybiBzb3VuZCA/IHNvdW5kLl9yYXRlIDogc2VsZi5fcmF0ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldC9zZXQgdGhlIHNlZWsgcG9zaXRpb24gb2YgYSBzb3VuZC4gVGhpcyBtZXRob2QgY2FuIG9wdGlvbmFsbHkgdGFrZSAwLCAxIG9yIDIgYXJndW1lbnRzLlxuICAgICAqICAgc2VlaygpIC0+IFJldHVybnMgdGhlIGZpcnN0IHNvdW5kIG5vZGUncyBjdXJyZW50IHNlZWsgcG9zaXRpb24uXG4gICAgICogICBzZWVrKGlkKSAtPiBSZXR1cm5zIHRoZSBzb3VuZCBpZCdzIGN1cnJlbnQgc2VlayBwb3NpdGlvbi5cbiAgICAgKiAgIHNlZWsoc2VlaykgLT4gU2V0cyB0aGUgc2VlayBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgc291bmQgbm9kZS5cbiAgICAgKiAgIHNlZWsoc2VlaywgaWQpIC0+IFNldHMgdGhlIHNlZWsgcG9zaXRpb24gb2YgcGFzc2VkIHNvdW5kIGlkLlxuICAgICAqIEByZXR1cm4ge0hvd2wvTnVtYmVyfSBSZXR1cm5zIHNlbGYgb3IgdGhlIGN1cnJlbnQgc2VlayBwb3NpdGlvbi5cbiAgICAgKi9cbiAgICBzZWVrOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgdmFyIHNlZWssIGlkO1xuXG4gICAgICAvLyBEZXRlcm1pbmUgdGhlIHZhbHVlcyBiYXNlZCBvbiBhcmd1bWVudHMuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gV2Ugd2lsbCBzaW1wbHkgcmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBub2RlLlxuICAgICAgICBpZCA9IHNlbGYuX3NvdW5kc1swXS5faWQ7XG4gICAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIHRoaXMgaXMgYW4gSUQsIGFuZCBpZiBub3QsIGFzc3VtZSBpdCBpcyBhIG5ldyBzZWVrIHBvc2l0aW9uLlxuICAgICAgICB2YXIgaWRzID0gc2VsZi5fZ2V0U291bmRJZHMoKTtcbiAgICAgICAgdmFyIGluZGV4ID0gaWRzLmluZGV4T2YoYXJnc1swXSk7XG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgaWQgPSBwYXJzZUludChhcmdzWzBdLCAxMCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2VsZi5fc291bmRzLmxlbmd0aCkge1xuICAgICAgICAgIGlkID0gc2VsZi5fc291bmRzWzBdLl9pZDtcbiAgICAgICAgICBzZWVrID0gcGFyc2VGbG9hdChhcmdzWzBdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBzZWVrID0gcGFyc2VGbG9hdChhcmdzWzBdKTtcbiAgICAgICAgaWQgPSBwYXJzZUludChhcmdzWzFdLCAxMCk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZXJlIGlzIG5vIElELCBiYWlsIG91dC5cbiAgICAgIGlmICh0eXBlb2YgaWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgc291bmQgaGFzbid0IGxvYWRlZCwgYWRkIGl0IHRvIHRoZSBsb2FkIHF1ZXVlIHRvIHNlZWsgd2hlbiBjYXBhYmxlLlxuICAgICAgaWYgKHR5cGVvZiBzZWVrID09PSAnbnVtYmVyJyAmJiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnIHx8IHNlbGYuX3BsYXlMb2NrKSkge1xuICAgICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgICBldmVudDogJ3NlZWsnLFxuICAgICAgICAgIGFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzZWxmLnNlZWsuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IHRoZSBzb3VuZC5cbiAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZCk7XG5cbiAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICBpZiAodHlwZW9mIHNlZWsgPT09ICdudW1iZXInICYmIHNlZWsgPj0gMCkge1xuICAgICAgICAgIC8vIFBhdXNlIHRoZSBzb3VuZCBhbmQgdXBkYXRlIHBvc2l0aW9uIGZvciByZXN0YXJ0aW5nIHBsYXliYWNrLlxuICAgICAgICAgIHZhciBwbGF5aW5nID0gc2VsZi5wbGF5aW5nKGlkKTtcbiAgICAgICAgICBpZiAocGxheWluZykge1xuICAgICAgICAgICAgc2VsZi5wYXVzZShpZCwgdHJ1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gTW92ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHRyYWNrIGFuZCBjYW5jZWwgdGltZXIuXG4gICAgICAgICAgc291bmQuX3NlZWsgPSBzZWVrO1xuICAgICAgICAgIHNvdW5kLl9lbmRlZCA9IGZhbHNlO1xuICAgICAgICAgIHNlbGYuX2NsZWFyVGltZXIoaWQpO1xuXG4gICAgICAgICAgLy8gVXBkYXRlIHRoZSBzZWVrIHBvc2l0aW9uIGZvciBIVE1MNSBBdWRpby5cbiAgICAgICAgICBpZiAoIXNlbGYuX3dlYkF1ZGlvICYmIHNvdW5kLl9ub2RlICYmICFpc05hTihzb3VuZC5fbm9kZS5kdXJhdGlvbikpIHtcbiAgICAgICAgICAgIHNvdW5kLl9ub2RlLmN1cnJlbnRUaW1lID0gc2VlaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZWVrIGFuZCBlbWl0IHdoZW4gcmVhZHkuXG4gICAgICAgICAgdmFyIHNlZWtBbmRFbWl0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzZWxmLl9lbWl0KCdzZWVrJywgaWQpO1xuXG4gICAgICAgICAgICAvLyBSZXN0YXJ0IHRoZSBwbGF5YmFjayBpZiB0aGUgc291bmQgd2FzIHBsYXlpbmcuXG4gICAgICAgICAgICBpZiAocGxheWluZykge1xuICAgICAgICAgICAgICBzZWxmLnBsYXkoaWQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgcGxheSBsb2NrIHRvIGJlIHVuc2V0IGJlZm9yZSBlbWl0dGluZyAoSFRNTDUgQXVkaW8pLlxuICAgICAgICAgIGlmIChwbGF5aW5nICYmICFzZWxmLl93ZWJBdWRpbykge1xuICAgICAgICAgICAgdmFyIGVtaXRTZWVrID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmICghc2VsZi5fcGxheUxvY2spIHtcbiAgICAgICAgICAgICAgICBzZWVrQW5kRW1pdCgpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZW1pdFNlZWssIDApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgc2V0VGltZW91dChlbWl0U2VlaywgMCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlZWtBbmRFbWl0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbykge1xuICAgICAgICAgICAgdmFyIHJlYWxUaW1lID0gc2VsZi5wbGF5aW5nKGlkKSA/IEhvd2xlci5jdHguY3VycmVudFRpbWUgLSBzb3VuZC5fcGxheVN0YXJ0IDogMDtcbiAgICAgICAgICAgIHZhciByYXRlU2VlayA9IHNvdW5kLl9yYXRlU2VlayA/IHNvdW5kLl9yYXRlU2VlayAtIHNvdW5kLl9zZWVrIDogMDtcbiAgICAgICAgICAgIHJldHVybiBzb3VuZC5fc2VlayArIChyYXRlU2VlayArIHJlYWxUaW1lICogTWF0aC5hYnMoc291bmQuX3JhdGUpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHNvdW5kLl9ub2RlLmN1cnJlbnRUaW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBzcGVjaWZpYyBzb3VuZCBpcyBjdXJyZW50bHkgcGxheWluZyBvciBub3QgKGlmIGlkIGlzIHByb3ZpZGVkKSwgb3IgY2hlY2sgaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBzb3VuZHMgaW4gdGhlIGdyb3VwIGlzIHBsYXlpbmcgb3Igbm90LlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gIGlkIFRoZSBzb3VuZCBpZCB0byBjaGVjay4gSWYgbm9uZSBpcyBwYXNzZWQsIHRoZSB3aG9sZSBzb3VuZCBncm91cCBpcyBjaGVja2VkLlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgcGxheWluZyBhbmQgZmFsc2UgaWYgbm90LlxuICAgICAqL1xuICAgIHBsYXlpbmc6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIENoZWNrIHRoZSBwYXNzZWQgc291bmQgSUQgKGlmIGFueSkuXG4gICAgICBpZiAodHlwZW9mIGlkID09PSAnbnVtYmVyJykge1xuICAgICAgICB2YXIgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWQpO1xuICAgICAgICByZXR1cm4gc291bmQgPyAhc291bmQuX3BhdXNlZCA6IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBPdGhlcndpc2UsIGxvb3AgdGhyb3VnaCBhbGwgc291bmRzIGFuZCBjaGVjayBpZiBhbnkgYXJlIHBsYXlpbmcuXG4gICAgICBmb3IgKHZhciBpPTA7IGk8c2VsZi5fc291bmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghc2VsZi5fc291bmRzW2ldLl9wYXVzZWQpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZHVyYXRpb24gb2YgdGhpcyBzb3VuZC4gUGFzc2luZyBhIHNvdW5kIGlkIHdpbGwgcmV0dXJuIHRoZSBzcHJpdGUgZHVyYXRpb24uXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBpZCBUaGUgc291bmQgaWQgdG8gY2hlY2suIElmIG5vbmUgaXMgcGFzc2VkLCByZXR1cm4gZnVsbCBzb3VyY2UgZHVyYXRpb24uXG4gICAgICogQHJldHVybiB7TnVtYmVyfSBBdWRpbyBkdXJhdGlvbiBpbiBzZWNvbmRzLlxuICAgICAqL1xuICAgIGR1cmF0aW9uOiBmdW5jdGlvbihpZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGR1cmF0aW9uID0gc2VsZi5fZHVyYXRpb247XG5cbiAgICAgIC8vIElmIHdlIHBhc3MgYW4gSUQsIGdldCB0aGUgc291bmQgYW5kIHJldHVybiB0aGUgc3ByaXRlIGxlbmd0aC5cbiAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZCk7XG4gICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgZHVyYXRpb24gPSBzZWxmLl9zcHJpdGVbc291bmQuX3Nwcml0ZV1bMV0gLyAxMDAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZHVyYXRpb247XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbG9hZGVkIHN0YXRlIG9mIHRoaXMgSG93bC5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9ICd1bmxvYWRlZCcsICdsb2FkaW5nJywgJ2xvYWRlZCdcbiAgICAgKi9cbiAgICBzdGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3RhdGU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVubG9hZCBhbmQgZGVzdHJveSB0aGUgY3VycmVudCBIb3dsIG9iamVjdC5cbiAgICAgKiBUaGlzIHdpbGwgaW1tZWRpYXRlbHkgc3RvcCBhbGwgc291bmQgaW5zdGFuY2VzIGF0dGFjaGVkIHRvIHRoaXMgZ3JvdXAuXG4gICAgICovXG4gICAgdW5sb2FkOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gU3RvcCBwbGF5aW5nIGFueSBhY3RpdmUgc291bmRzLlxuICAgICAgdmFyIHNvdW5kcyA9IHNlbGYuX3NvdW5kcztcbiAgICAgIGZvciAodmFyIGk9MDsgaTxzb3VuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gU3RvcCB0aGUgc291bmQgaWYgaXQgaXMgY3VycmVudGx5IHBsYXlpbmcuXG4gICAgICAgIGlmICghc291bmRzW2ldLl9wYXVzZWQpIHtcbiAgICAgICAgICBzZWxmLnN0b3Aoc291bmRzW2ldLl9pZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgdGhlIHNvdXJjZSBvciBkaXNjb25uZWN0LlxuICAgICAgICBpZiAoIXNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgICAgLy8gU2V0IHRoZSBzb3VyY2UgdG8gMC1zZWNvbmQgc2lsZW5jZSB0byBzdG9wIGFueSBkb3dubG9hZGluZyAoZXhjZXB0IGluIElFKS5cbiAgICAgICAgICBzZWxmLl9jbGVhclNvdW5kKHNvdW5kc1tpXS5fbm9kZSk7XG5cbiAgICAgICAgICAvLyBSZW1vdmUgYW55IGV2ZW50IGxpc3RlbmVycy5cbiAgICAgICAgICBzb3VuZHNbaV0uX25vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBzb3VuZHNbaV0uX2Vycm9yRm4sIGZhbHNlKTtcbiAgICAgICAgICBzb3VuZHNbaV0uX25vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihIb3dsZXIuX2NhblBsYXlFdmVudCwgc291bmRzW2ldLl9sb2FkRm4sIGZhbHNlKTtcbiAgICAgICAgICBzb3VuZHNbaV0uX25vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZW5kZWQnLCBzb3VuZHNbaV0uX2VuZEZuLCBmYWxzZSk7XG5cbiAgICAgICAgICAvLyBSZWxlYXNlIHRoZSBBdWRpbyBvYmplY3QgYmFjayB0byB0aGUgcG9vbC5cbiAgICAgICAgICBIb3dsZXIuX3JlbGVhc2VIdG1sNUF1ZGlvKHNvdW5kc1tpXS5fbm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbXB0eSBvdXQgYWxsIG9mIHRoZSBub2Rlcy5cbiAgICAgICAgZGVsZXRlIHNvdW5kc1tpXS5fbm9kZTtcblxuICAgICAgICAvLyBNYWtlIHN1cmUgYWxsIHRpbWVycyBhcmUgY2xlYXJlZCBvdXQuXG4gICAgICAgIHNlbGYuX2NsZWFyVGltZXIoc291bmRzW2ldLl9pZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSB0aGUgcmVmZXJlbmNlcyBpbiB0aGUgZ2xvYmFsIEhvd2xlciBvYmplY3QuXG4gICAgICB2YXIgaW5kZXggPSBIb3dsZXIuX2hvd2xzLmluZGV4T2Yoc2VsZik7XG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICBIb3dsZXIuX2hvd2xzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG5cbiAgICAgIC8vIERlbGV0ZSB0aGlzIHNvdW5kIGZyb20gdGhlIGNhY2hlIChpZiBubyBvdGhlciBIb3dsIGlzIHVzaW5nIGl0KS5cbiAgICAgIHZhciByZW1DYWNoZSA9IHRydWU7XG4gICAgICBmb3IgKGk9MDsgaTxIb3dsZXIuX2hvd2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChIb3dsZXIuX2hvd2xzW2ldLl9zcmMgPT09IHNlbGYuX3NyYyB8fCBzZWxmLl9zcmMuaW5kZXhPZihIb3dsZXIuX2hvd2xzW2ldLl9zcmMpID49IDApIHtcbiAgICAgICAgICByZW1DYWNoZSA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjYWNoZSAmJiByZW1DYWNoZSkge1xuICAgICAgICBkZWxldGUgY2FjaGVbc2VsZi5fc3JjXTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgZ2xvYmFsIGVycm9ycy5cbiAgICAgIEhvd2xlci5ub0F1ZGlvID0gZmFsc2U7XG5cbiAgICAgIC8vIENsZWFyIG91dCBgc2VsZmAuXG4gICAgICBzZWxmLl9zdGF0ZSA9ICd1bmxvYWRlZCc7XG4gICAgICBzZWxmLl9zb3VuZHMgPSBbXTtcbiAgICAgIHNlbGYgPSBudWxsO1xuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTGlzdGVuIHRvIGEgY3VzdG9tIGV2ZW50LlxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gICBldmVudCBFdmVudCBuYW1lLlxuICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmbiAgICBMaXN0ZW5lciB0byBjYWxsLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gICBpZCAgICAob3B0aW9uYWwpIE9ubHkgbGlzdGVuIHRvIGV2ZW50cyBmb3IgdGhpcyBzb3VuZC5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9ICAgb25jZSAgKElOVEVSTkFMKSBNYXJrcyBldmVudCB0byBmaXJlIG9ubHkgb25jZS5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIG9uOiBmdW5jdGlvbihldmVudCwgZm4sIGlkLCBvbmNlKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgZXZlbnRzID0gc2VsZlsnX29uJyArIGV2ZW50XTtcblxuICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBldmVudHMucHVzaChvbmNlID8ge2lkOiBpZCwgZm46IGZuLCBvbmNlOiBvbmNlfSA6IHtpZDogaWQsIGZuOiBmbn0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgY3VzdG9tIGV2ZW50LiBDYWxsIHdpdGhvdXQgcGFyYW1ldGVycyB0byByZW1vdmUgYWxsIGV2ZW50cy5cbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgZXZlbnQgRXZlbnQgbmFtZS5cbiAgICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gZm4gICAgTGlzdGVuZXIgdG8gcmVtb3ZlLiBMZWF2ZSBlbXB0eSB0byByZW1vdmUgYWxsLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gICBpZCAgICAob3B0aW9uYWwpIE9ubHkgcmVtb3ZlIGV2ZW50cyBmb3IgdGhpcyBzb3VuZC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIG9mZjogZnVuY3Rpb24oZXZlbnQsIGZuLCBpZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGV2ZW50cyA9IHNlbGZbJ19vbicgKyBldmVudF07XG4gICAgICB2YXIgaSA9IDA7XG5cbiAgICAgIC8vIEFsbG93IHBhc3NpbmcganVzdCBhbiBldmVudCBhbmQgSUQuXG4gICAgICBpZiAodHlwZW9mIGZuID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZCA9IGZuO1xuICAgICAgICBmbiA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChmbiB8fCBpZCkge1xuICAgICAgICAvLyBMb29wIHRocm91Z2ggZXZlbnQgc3RvcmUgYW5kIHJlbW92ZSB0aGUgcGFzc2VkIGZ1bmN0aW9uLlxuICAgICAgICBmb3IgKGk9MDsgaTxldmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgaXNJZCA9IChpZCA9PT0gZXZlbnRzW2ldLmlkKTtcbiAgICAgICAgICBpZiAoZm4gPT09IGV2ZW50c1tpXS5mbiAmJiBpc0lkIHx8ICFmbiAmJiBpc0lkKSB7XG4gICAgICAgICAgICBldmVudHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50KSB7XG4gICAgICAgIC8vIENsZWFyIG91dCBhbGwgZXZlbnRzIG9mIHRoaXMgdHlwZS5cbiAgICAgICAgc2VsZlsnX29uJyArIGV2ZW50XSA9IFtdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ2xlYXIgb3V0IGFsbCBldmVudHMgb2YgZXZlcnkgdHlwZS5cbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhzZWxmKTtcbiAgICAgICAgZm9yIChpPTA7IGk8a2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICgoa2V5c1tpXS5pbmRleE9mKCdfb24nKSA9PT0gMCkgJiYgQXJyYXkuaXNBcnJheShzZWxmW2tleXNbaV1dKSkge1xuICAgICAgICAgICAgc2VsZltrZXlzW2ldXSA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTGlzdGVuIHRvIGEgY3VzdG9tIGV2ZW50IGFuZCByZW1vdmUgaXQgb25jZSBmaXJlZC5cbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgZXZlbnQgRXZlbnQgbmFtZS5cbiAgICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gZm4gICAgTGlzdGVuZXIgdG8gY2FsbC5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9ICAgaWQgICAgKG9wdGlvbmFsKSBPbmx5IGxpc3RlbiB0byBldmVudHMgZm9yIHRoaXMgc291bmQuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBvbmNlOiBmdW5jdGlvbihldmVudCwgZm4sIGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIFNldHVwIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICAgIHNlbGYub24oZXZlbnQsIGZuLCBpZCwgMSk7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBFbWl0IGFsbCBldmVudHMgb2YgYSBzcGVjaWZpYyB0eXBlIGFuZCBwYXNzIHRoZSBzb3VuZCBpZC5cbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9IGV2ZW50IEV2ZW50IG5hbWUuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBpZCAgICBTb3VuZCBJRC5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IG1zZyAgIE1lc3NhZ2UgdG8gZ28gd2l0aCBldmVudC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIF9lbWl0OiBmdW5jdGlvbihldmVudCwgaWQsIG1zZykge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGV2ZW50cyA9IHNlbGZbJ19vbicgKyBldmVudF07XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCBldmVudCBzdG9yZSBhbmQgZmlyZSBhbGwgZnVuY3Rpb25zLlxuICAgICAgZm9yICh2YXIgaT1ldmVudHMubGVuZ3RoLTE7IGk+PTA7IGktLSkge1xuICAgICAgICAvLyBPbmx5IGZpcmUgdGhlIGxpc3RlbmVyIGlmIHRoZSBjb3JyZWN0IElEIGlzIHVzZWQuXG4gICAgICAgIGlmICghZXZlbnRzW2ldLmlkIHx8IGV2ZW50c1tpXS5pZCA9PT0gaWQgfHwgZXZlbnQgPT09ICdsb2FkJykge1xuICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oZm4pIHtcbiAgICAgICAgICAgIGZuLmNhbGwodGhpcywgaWQsIG1zZyk7XG4gICAgICAgICAgfS5iaW5kKHNlbGYsIGV2ZW50c1tpXS5mbiksIDApO1xuXG4gICAgICAgICAgLy8gSWYgdGhpcyBldmVudCB3YXMgc2V0dXAgd2l0aCBgb25jZWAsIHJlbW92ZSBpdC5cbiAgICAgICAgICBpZiAoZXZlbnRzW2ldLm9uY2UpIHtcbiAgICAgICAgICAgIHNlbGYub2ZmKGV2ZW50LCBldmVudHNbaV0uZm4sIGV2ZW50c1tpXS5pZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFBhc3MgdGhlIGV2ZW50IHR5cGUgaW50byBsb2FkIHF1ZXVlIHNvIHRoYXQgaXQgY2FuIGNvbnRpbnVlIHN0ZXBwaW5nLlxuICAgICAgc2VsZi5fbG9hZFF1ZXVlKGV2ZW50KTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFF1ZXVlIG9mIGFjdGlvbnMgaW5pdGlhdGVkIGJlZm9yZSB0aGUgc291bmQgaGFzIGxvYWRlZC5cbiAgICAgKiBUaGVzZSB3aWxsIGJlIGNhbGxlZCBpbiBzZXF1ZW5jZSwgd2l0aCB0aGUgbmV4dCBvbmx5IGZpcmluZ1xuICAgICAqIGFmdGVyIHRoZSBwcmV2aW91cyBoYXMgZmluaXNoZWQgZXhlY3V0aW5nIChldmVuIGlmIGFzeW5jIGxpa2UgcGxheSkuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBfbG9hZFF1ZXVlOiBmdW5jdGlvbihldmVudCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICBpZiAoc2VsZi5fcXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgdGFzayA9IHNlbGYuX3F1ZXVlWzBdO1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aGlzIHRhc2sgaWYgYSBtYXRjaGluZyBldmVudCB3YXMgcGFzc2VkLlxuICAgICAgICBpZiAodGFzay5ldmVudCA9PT0gZXZlbnQpIHtcbiAgICAgICAgICBzZWxmLl9xdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgIHNlbGYuX2xvYWRRdWV1ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUnVuIHRoZSB0YXNrIGlmIG5vIGV2ZW50IHR5cGUgaXMgcGFzc2VkLlxuICAgICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgICAgdGFzay5hY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBwbGF5YmFjayBlbmRzIGF0IHRoZSBlbmQgb2YgdGhlIGR1cmF0aW9uLlxuICAgICAqIEBwYXJhbSAge1NvdW5kfSBzb3VuZCBUaGUgc291bmQgb2JqZWN0IHRvIHdvcmsgd2l0aC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIF9lbmRlZDogZnVuY3Rpb24oc291bmQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBzcHJpdGUgPSBzb3VuZC5fc3ByaXRlO1xuXG4gICAgICAvLyBJZiB3ZSBhcmUgdXNpbmcgSUUgYW5kIHRoZXJlIHdhcyBuZXR3b3JrIGxhdGVuY3kgd2UgbWF5IGJlIGNsaXBwaW5nXG4gICAgICAvLyBhdWRpbyBiZWZvcmUgaXQgY29tcGxldGVzIHBsYXlpbmcuIExldHMgY2hlY2sgdGhlIG5vZGUgdG8gbWFrZSBzdXJlIGl0XG4gICAgICAvLyBiZWxpZXZlcyBpdCBoYXMgY29tcGxldGVkLCBiZWZvcmUgZW5kaW5nIHRoZSBwbGF5YmFjay5cbiAgICAgIGlmICghc2VsZi5fd2ViQXVkaW8gJiYgc291bmQuX25vZGUgJiYgIXNvdW5kLl9ub2RlLnBhdXNlZCAmJiAhc291bmQuX25vZGUuZW5kZWQgJiYgc291bmQuX25vZGUuY3VycmVudFRpbWUgPCBzb3VuZC5fc3RvcCkge1xuICAgICAgICBzZXRUaW1lb3V0KHNlbGYuX2VuZGVkLmJpbmQoc2VsZiwgc291bmQpLCAxMDApO1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgIH1cblxuICAgICAgLy8gU2hvdWxkIHRoaXMgc291bmQgbG9vcD9cbiAgICAgIHZhciBsb29wID0gISEoc291bmQuX2xvb3AgfHwgc2VsZi5fc3ByaXRlW3Nwcml0ZV1bMl0pO1xuXG4gICAgICAvLyBGaXJlIHRoZSBlbmRlZCBldmVudC5cbiAgICAgIHNlbGYuX2VtaXQoJ2VuZCcsIHNvdW5kLl9pZCk7XG5cbiAgICAgIC8vIFJlc3RhcnQgdGhlIHBsYXliYWNrIGZvciBIVE1MNSBBdWRpbyBsb29wLlxuICAgICAgaWYgKCFzZWxmLl93ZWJBdWRpbyAmJiBsb29wKSB7XG4gICAgICAgIHNlbGYuc3RvcChzb3VuZC5faWQsIHRydWUpLnBsYXkoc291bmQuX2lkKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVzdGFydCB0aGlzIHRpbWVyIGlmIG9uIGEgV2ViIEF1ZGlvIGxvb3AuXG4gICAgICBpZiAoc2VsZi5fd2ViQXVkaW8gJiYgbG9vcCkge1xuICAgICAgICBzZWxmLl9lbWl0KCdwbGF5Jywgc291bmQuX2lkKTtcbiAgICAgICAgc291bmQuX3NlZWsgPSBzb3VuZC5fc3RhcnQgfHwgMDtcbiAgICAgICAgc291bmQuX3JhdGVTZWVrID0gMDtcbiAgICAgICAgc291bmQuX3BsYXlTdGFydCA9IEhvd2xlci5jdHguY3VycmVudFRpbWU7XG5cbiAgICAgICAgdmFyIHRpbWVvdXQgPSAoKHNvdW5kLl9zdG9wIC0gc291bmQuX3N0YXJ0KSAqIDEwMDApIC8gTWF0aC5hYnMoc291bmQuX3JhdGUpO1xuICAgICAgICBzZWxmLl9lbmRUaW1lcnNbc291bmQuX2lkXSA9IHNldFRpbWVvdXQoc2VsZi5fZW5kZWQuYmluZChzZWxmLCBzb3VuZCksIHRpbWVvdXQpO1xuICAgICAgfVxuXG4gICAgICAvLyBNYXJrIHRoZSBub2RlIGFzIHBhdXNlZC5cbiAgICAgIGlmIChzZWxmLl93ZWJBdWRpbyAmJiAhbG9vcCkge1xuICAgICAgICBzb3VuZC5fcGF1c2VkID0gdHJ1ZTtcbiAgICAgICAgc291bmQuX2VuZGVkID0gdHJ1ZTtcbiAgICAgICAgc291bmQuX3NlZWsgPSBzb3VuZC5fc3RhcnQgfHwgMDtcbiAgICAgICAgc291bmQuX3JhdGVTZWVrID0gMDtcbiAgICAgICAgc2VsZi5fY2xlYXJUaW1lcihzb3VuZC5faWQpO1xuXG4gICAgICAgIC8vIENsZWFuIHVwIHRoZSBidWZmZXIgc291cmNlLlxuICAgICAgICBzZWxmLl9jbGVhbkJ1ZmZlcihzb3VuZC5fbm9kZSk7XG5cbiAgICAgICAgLy8gQXR0ZW1wdCB0byBhdXRvLXN1c3BlbmQgQXVkaW9Db250ZXh0IGlmIG5vIHNvdW5kcyBhcmUgc3RpbGwgcGxheWluZy5cbiAgICAgICAgSG93bGVyLl9hdXRvU3VzcGVuZCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBXaGVuIHVzaW5nIGEgc3ByaXRlLCBlbmQgdGhlIHRyYWNrLlxuICAgICAgaWYgKCFzZWxmLl93ZWJBdWRpbyAmJiAhbG9vcCkge1xuICAgICAgICBzZWxmLnN0b3Aoc291bmQuX2lkLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENsZWFyIHRoZSBlbmQgdGltZXIgZm9yIGEgc291bmQgcGxheWJhY2suXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBpZCBUaGUgc291bmQgSUQuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBfY2xlYXJUaW1lcjogZnVuY3Rpb24oaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgaWYgKHNlbGYuX2VuZFRpbWVyc1tpZF0pIHtcbiAgICAgICAgLy8gQ2xlYXIgdGhlIHRpbWVvdXQgb3IgcmVtb3ZlIHRoZSBlbmRlZCBsaXN0ZW5lci5cbiAgICAgICAgaWYgKHR5cGVvZiBzZWxmLl9lbmRUaW1lcnNbaWRdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHNlbGYuX2VuZFRpbWVyc1tpZF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZCk7XG4gICAgICAgICAgaWYgKHNvdW5kICYmIHNvdW5kLl9ub2RlKSB7XG4gICAgICAgICAgICBzb3VuZC5fbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmRlZCcsIHNlbGYuX2VuZFRpbWVyc1tpZF0sIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgc2VsZi5fZW5kVGltZXJzW2lkXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgc291bmQgaWRlbnRpZmllZCBieSB0aGlzIElELCBvciByZXR1cm4gbnVsbC5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkIFNvdW5kIElEXG4gICAgICogQHJldHVybiB7T2JqZWN0fSAgICBTb3VuZCBvYmplY3Qgb3IgbnVsbC5cbiAgICAgKi9cbiAgICBfc291bmRCeUlkOiBmdW5jdGlvbihpZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHNvdW5kcyBhbmQgZmluZCB0aGUgb25lIHdpdGggdGhpcyBJRC5cbiAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9zb3VuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGlkID09PSBzZWxmLl9zb3VuZHNbaV0uX2lkKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuX3NvdW5kc1tpXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFuIGluYWN0aXZlIHNvdW5kIGZyb20gdGhlIHBvb2wgb3IgY3JlYXRlIGEgbmV3IG9uZS5cbiAgICAgKiBAcmV0dXJuIHtTb3VuZH0gU291bmQgcGxheWJhY2sgb2JqZWN0LlxuICAgICAqL1xuICAgIF9pbmFjdGl2ZVNvdW5kOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgc2VsZi5fZHJhaW4oKTtcblxuICAgICAgLy8gRmluZCB0aGUgZmlyc3QgaW5hY3RpdmUgbm9kZSB0byByZWN5Y2xlLlxuICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX3NvdW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2VsZi5fc291bmRzW2ldLl9lbmRlZCkge1xuICAgICAgICAgIHJldHVybiBzZWxmLl9zb3VuZHNbaV0ucmVzZXQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBubyBpbmFjdGl2ZSBub2RlIHdhcyBmb3VuZCwgY3JlYXRlIGEgbmV3IG9uZS5cbiAgICAgIHJldHVybiBuZXcgU291bmQoc2VsZik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERyYWluIGV4Y2VzcyBpbmFjdGl2ZSBzb3VuZHMgZnJvbSB0aGUgcG9vbC5cbiAgICAgKi9cbiAgICBfZHJhaW46IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGxpbWl0ID0gc2VsZi5fcG9vbDtcbiAgICAgIHZhciBjbnQgPSAwO1xuICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICAvLyBJZiB0aGVyZSBhcmUgbGVzcyBzb3VuZHMgdGhhbiB0aGUgbWF4IHBvb2wgc2l6ZSwgd2UgYXJlIGRvbmUuXG4gICAgICBpZiAoc2VsZi5fc291bmRzLmxlbmd0aCA8IGxpbWl0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBpbmFjdGl2ZSBzb3VuZHMuXG4gICAgICBmb3IgKGk9MDsgaTxzZWxmLl9zb3VuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNlbGYuX3NvdW5kc1tpXS5fZW5kZWQpIHtcbiAgICAgICAgICBjbnQrKztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgZXhjZXNzIGluYWN0aXZlIHNvdW5kcywgZ29pbmcgaW4gcmV2ZXJzZSBvcmRlci5cbiAgICAgIGZvciAoaT1zZWxmLl9zb3VuZHMubGVuZ3RoIC0gMTsgaT49MDsgaS0tKSB7XG4gICAgICAgIGlmIChjbnQgPD0gbGltaXQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZi5fc291bmRzW2ldLl9lbmRlZCkge1xuICAgICAgICAgIC8vIERpc2Nvbm5lY3QgdGhlIGF1ZGlvIHNvdXJjZSB3aGVuIHVzaW5nIFdlYiBBdWRpby5cbiAgICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8gJiYgc2VsZi5fc291bmRzW2ldLl9ub2RlKSB7XG4gICAgICAgICAgICBzZWxmLl9zb3VuZHNbaV0uX25vZGUuZGlzY29ubmVjdCgwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZW1vdmUgc291bmRzIHVudGlsIHdlIGhhdmUgdGhlIHBvb2wgc2l6ZS5cbiAgICAgICAgICBzZWxmLl9zb3VuZHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIGNudC0tO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgSUQncyBmcm9tIHRoZSBzb3VuZHMgcG9vbC5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkIE9ubHkgcmV0dXJuIG9uZSBJRCBpZiBvbmUgaXMgcGFzc2VkLlxuICAgICAqIEByZXR1cm4ge0FycmF5fSAgICBBcnJheSBvZiBJRHMuXG4gICAgICovXG4gICAgX2dldFNvdW5kSWRzOiBmdW5jdGlvbihpZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICBpZiAodHlwZW9mIGlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YXIgaWRzID0gW107XG4gICAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9zb3VuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZHMucHVzaChzZWxmLl9zb3VuZHNbaV0uX2lkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpZHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW2lkXTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTG9hZCB0aGUgc291bmQgYmFjayBpbnRvIHRoZSBidWZmZXIgc291cmNlLlxuICAgICAqIEBwYXJhbSAge1NvdW5kfSBzb3VuZCBUaGUgc291bmQgb2JqZWN0IHRvIHdvcmsgd2l0aC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIF9yZWZyZXNoQnVmZmVyOiBmdW5jdGlvbihzb3VuZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyBTZXR1cCB0aGUgYnVmZmVyIHNvdXJjZSBmb3IgcGxheWJhY2suXG4gICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UgPSBIb3dsZXIuY3R4LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO1xuICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLmJ1ZmZlciA9IGNhY2hlW3NlbGYuX3NyY107XG5cbiAgICAgIC8vIENvbm5lY3QgdG8gdGhlIGNvcnJlY3Qgbm9kZS5cbiAgICAgIGlmIChzb3VuZC5fcGFubmVyKSB7XG4gICAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5jb25uZWN0KHNvdW5kLl9wYW5uZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLmNvbm5lY3Qoc291bmQuX25vZGUpO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXR1cCBsb29waW5nIGFuZCBwbGF5YmFjayByYXRlLlxuICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLmxvb3AgPSBzb3VuZC5fbG9vcDtcbiAgICAgIGlmIChzb3VuZC5fbG9vcCkge1xuICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UubG9vcFN0YXJ0ID0gc291bmQuX3N0YXJ0IHx8IDA7XG4gICAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5sb29wRW5kID0gc291bmQuX3N0b3AgfHwgMDtcbiAgICAgIH1cbiAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5wbGF5YmFja1JhdGUuc2V0VmFsdWVBdFRpbWUoc291bmQuX3JhdGUsIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUHJldmVudCBtZW1vcnkgbGVha3MgYnkgY2xlYW5pbmcgdXAgdGhlIGJ1ZmZlciBzb3VyY2UgYWZ0ZXIgcGxheWJhY2suXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBub2RlIFNvdW5kJ3MgYXVkaW8gbm9kZSBjb250YWluaW5nIHRoZSBidWZmZXIgc291cmNlLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgX2NsZWFuQnVmZmVyOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgaXNJT1MgPSBIb3dsZXIuX25hdmlnYXRvciAmJiBIb3dsZXIuX25hdmlnYXRvci52ZW5kb3IuaW5kZXhPZignQXBwbGUnKSA+PSAwO1xuXG4gICAgICBpZiAoSG93bGVyLl9zY3JhdGNoQnVmZmVyICYmIG5vZGUuYnVmZmVyU291cmNlKSB7XG4gICAgICAgIG5vZGUuYnVmZmVyU291cmNlLm9uZW5kZWQgPSBudWxsO1xuICAgICAgICBub2RlLmJ1ZmZlclNvdXJjZS5kaXNjb25uZWN0KDApO1xuICAgICAgICBpZiAoaXNJT1MpIHtcbiAgICAgICAgICB0cnkgeyBub2RlLmJ1ZmZlclNvdXJjZS5idWZmZXIgPSBIb3dsZXIuX3NjcmF0Y2hCdWZmZXI7IH0gY2F0Y2goZSkge31cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbm9kZS5idWZmZXJTb3VyY2UgPSBudWxsO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBzb3VyY2UgdG8gYSAwLXNlY29uZCBzaWxlbmNlIHRvIHN0b3AgYW55IGRvd25sb2FkaW5nIChleGNlcHQgaW4gSUUpLlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gbm9kZSBBdWRpbyBub2RlIHRvIGNsZWFyLlxuICAgICAqL1xuICAgIF9jbGVhclNvdW5kOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICB2YXIgY2hlY2tJRSA9IC9NU0lFIHxUcmlkZW50XFwvLy50ZXN0KEhvd2xlci5fbmF2aWdhdG9yICYmIEhvd2xlci5fbmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgICBpZiAoIWNoZWNrSUUpIHtcbiAgICAgICAgbm9kZS5zcmMgPSAnZGF0YTphdWRpby93YXY7YmFzZTY0LFVrbEdSaWdBQUFCWFFWWkZabTEwSUJJQUFBQUJBQUVBUkt3QUFJaFlBUUFDQUJBQUFBQmtZWFJoQWdBQUFBRUEnO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKiogU2luZ2xlIFNvdW5kIE1ldGhvZHMgKiovXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIFNldHVwIHRoZSBzb3VuZCBvYmplY3QsIHdoaWNoIGVhY2ggbm9kZSBhdHRhY2hlZCB0byBhIEhvd2wgZ3JvdXAgaXMgY29udGFpbmVkIGluLlxuICAgKiBAcGFyYW0ge09iamVjdH0gaG93bCBUaGUgSG93bCBwYXJlbnQgZ3JvdXAuXG4gICAqL1xuICB2YXIgU291bmQgPSBmdW5jdGlvbihob3dsKSB7XG4gICAgdGhpcy5fcGFyZW50ID0gaG93bDtcbiAgICB0aGlzLmluaXQoKTtcbiAgfTtcbiAgU291bmQucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgYSBuZXcgU291bmQgb2JqZWN0LlxuICAgICAqIEByZXR1cm4ge1NvdW5kfVxuICAgICAqL1xuICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHBhcmVudCA9IHNlbGYuX3BhcmVudDtcblxuICAgICAgLy8gU2V0dXAgdGhlIGRlZmF1bHQgcGFyYW1ldGVycy5cbiAgICAgIHNlbGYuX211dGVkID0gcGFyZW50Ll9tdXRlZDtcbiAgICAgIHNlbGYuX2xvb3AgPSBwYXJlbnQuX2xvb3A7XG4gICAgICBzZWxmLl92b2x1bWUgPSBwYXJlbnQuX3ZvbHVtZTtcbiAgICAgIHNlbGYuX3JhdGUgPSBwYXJlbnQuX3JhdGU7XG4gICAgICBzZWxmLl9zZWVrID0gMDtcbiAgICAgIHNlbGYuX3BhdXNlZCA9IHRydWU7XG4gICAgICBzZWxmLl9lbmRlZCA9IHRydWU7XG4gICAgICBzZWxmLl9zcHJpdGUgPSAnX19kZWZhdWx0JztcblxuICAgICAgLy8gR2VuZXJhdGUgYSB1bmlxdWUgSUQgZm9yIHRoaXMgc291bmQuXG4gICAgICBzZWxmLl9pZCA9ICsrSG93bGVyLl9jb3VudGVyO1xuXG4gICAgICAvLyBBZGQgaXRzZWxmIHRvIHRoZSBwYXJlbnQncyBwb29sLlxuICAgICAgcGFyZW50Ll9zb3VuZHMucHVzaChzZWxmKTtcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBuZXcgbm9kZS5cbiAgICAgIHNlbGYuY3JlYXRlKCk7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW5kIHNldHVwIGEgbmV3IHNvdW5kIG9iamVjdCwgd2hldGhlciBIVE1MNSBBdWRpbyBvciBXZWIgQXVkaW8uXG4gICAgICogQHJldHVybiB7U291bmR9XG4gICAgICovXG4gICAgY3JlYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBwYXJlbnQgPSBzZWxmLl9wYXJlbnQ7XG4gICAgICB2YXIgdm9sdW1lID0gKEhvd2xlci5fbXV0ZWQgfHwgc2VsZi5fbXV0ZWQgfHwgc2VsZi5fcGFyZW50Ll9tdXRlZCkgPyAwIDogc2VsZi5fdm9sdW1lO1xuXG4gICAgICBpZiAocGFyZW50Ll93ZWJBdWRpbykge1xuICAgICAgICAvLyBDcmVhdGUgdGhlIGdhaW4gbm9kZSBmb3IgY29udHJvbGxpbmcgdm9sdW1lICh0aGUgc291cmNlIHdpbGwgY29ubmVjdCB0byB0aGlzKS5cbiAgICAgICAgc2VsZi5fbm9kZSA9ICh0eXBlb2YgSG93bGVyLmN0eC5jcmVhdGVHYWluID09PSAndW5kZWZpbmVkJykgPyBIb3dsZXIuY3R4LmNyZWF0ZUdhaW5Ob2RlKCkgOiBIb3dsZXIuY3R4LmNyZWF0ZUdhaW4oKTtcbiAgICAgICAgc2VsZi5fbm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKHZvbHVtZSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgIHNlbGYuX25vZGUucGF1c2VkID0gdHJ1ZTtcbiAgICAgICAgc2VsZi5fbm9kZS5jb25uZWN0KEhvd2xlci5tYXN0ZXJHYWluKTtcbiAgICAgIH0gZWxzZSBpZiAoIUhvd2xlci5ub0F1ZGlvKSB7XG4gICAgICAgIC8vIEdldCBhbiB1bmxvY2tlZCBBdWRpbyBvYmplY3QgZnJvbSB0aGUgcG9vbC5cbiAgICAgICAgc2VsZi5fbm9kZSA9IEhvd2xlci5fb2J0YWluSHRtbDVBdWRpbygpO1xuXG4gICAgICAgIC8vIExpc3RlbiBmb3IgZXJyb3JzIChodHRwOi8vZGV2LnczLm9yZy9odG1sNS9zcGVjLWF1dGhvci12aWV3L3NwZWMuaHRtbCNtZWRpYWVycm9yKS5cbiAgICAgICAgc2VsZi5fZXJyb3JGbiA9IHNlbGYuX2Vycm9yTGlzdGVuZXIuYmluZChzZWxmKTtcbiAgICAgICAgc2VsZi5fbm9kZS5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIHNlbGYuX2Vycm9yRm4sIGZhbHNlKTtcblxuICAgICAgICAvLyBMaXN0ZW4gZm9yICdjYW5wbGF5dGhyb3VnaCcgZXZlbnQgdG8gbGV0IHVzIGtub3cgdGhlIHNvdW5kIGlzIHJlYWR5LlxuICAgICAgICBzZWxmLl9sb2FkRm4gPSBzZWxmLl9sb2FkTGlzdGVuZXIuYmluZChzZWxmKTtcbiAgICAgICAgc2VsZi5fbm9kZS5hZGRFdmVudExpc3RlbmVyKEhvd2xlci5fY2FuUGxheUV2ZW50LCBzZWxmLl9sb2FkRm4sIGZhbHNlKTtcblxuICAgICAgICAvLyBMaXN0ZW4gZm9yIHRoZSAnZW5kZWQnIGV2ZW50IG9uIHRoZSBzb3VuZCB0byBhY2NvdW50IGZvciBlZGdlLWNhc2Ugd2hlcmVcbiAgICAgICAgLy8gYSBmaW5pdGUgc291bmQgaGFzIGEgZHVyYXRpb24gb2YgSW5maW5pdHkuXG4gICAgICAgIHNlbGYuX2VuZEZuID0gc2VsZi5fZW5kTGlzdGVuZXIuYmluZChzZWxmKTtcbiAgICAgICAgc2VsZi5fbm9kZS5hZGRFdmVudExpc3RlbmVyKCdlbmRlZCcsIHNlbGYuX2VuZEZuLCBmYWxzZSk7XG5cbiAgICAgICAgLy8gU2V0dXAgdGhlIG5ldyBhdWRpbyBub2RlLlxuICAgICAgICBzZWxmLl9ub2RlLnNyYyA9IHBhcmVudC5fc3JjO1xuICAgICAgICBzZWxmLl9ub2RlLnByZWxvYWQgPSBwYXJlbnQuX3ByZWxvYWQgPT09IHRydWUgPyAnYXV0bycgOiBwYXJlbnQuX3ByZWxvYWQ7XG4gICAgICAgIHNlbGYuX25vZGUudm9sdW1lID0gdm9sdW1lICogSG93bGVyLnZvbHVtZSgpO1xuXG4gICAgICAgIC8vIEJlZ2luIGxvYWRpbmcgdGhlIHNvdXJjZS5cbiAgICAgICAgc2VsZi5fbm9kZS5sb2FkKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXNldCB0aGUgcGFyYW1ldGVycyBvZiB0aGlzIHNvdW5kIHRvIHRoZSBvcmlnaW5hbCBzdGF0ZSAoZm9yIHJlY3ljbGUpLlxuICAgICAqIEByZXR1cm4ge1NvdW5kfVxuICAgICAqL1xuICAgIHJlc2V0OiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBwYXJlbnQgPSBzZWxmLl9wYXJlbnQ7XG5cbiAgICAgIC8vIFJlc2V0IGFsbCBvZiB0aGUgcGFyYW1ldGVycyBvZiB0aGlzIHNvdW5kLlxuICAgICAgc2VsZi5fbXV0ZWQgPSBwYXJlbnQuX211dGVkO1xuICAgICAgc2VsZi5fbG9vcCA9IHBhcmVudC5fbG9vcDtcbiAgICAgIHNlbGYuX3ZvbHVtZSA9IHBhcmVudC5fdm9sdW1lO1xuICAgICAgc2VsZi5fcmF0ZSA9IHBhcmVudC5fcmF0ZTtcbiAgICAgIHNlbGYuX3NlZWsgPSAwO1xuICAgICAgc2VsZi5fcmF0ZVNlZWsgPSAwO1xuICAgICAgc2VsZi5fcGF1c2VkID0gdHJ1ZTtcbiAgICAgIHNlbGYuX2VuZGVkID0gdHJ1ZTtcbiAgICAgIHNlbGYuX3Nwcml0ZSA9ICdfX2RlZmF1bHQnO1xuXG4gICAgICAvLyBHZW5lcmF0ZSBhIG5ldyBJRCBzbyB0aGF0IGl0IGlzbid0IGNvbmZ1c2VkIHdpdGggdGhlIHByZXZpb3VzIHNvdW5kLlxuICAgICAgc2VsZi5faWQgPSArK0hvd2xlci5fY291bnRlcjtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEhUTUw1IEF1ZGlvIGVycm9yIGxpc3RlbmVyIGNhbGxiYWNrLlxuICAgICAqL1xuICAgIF9lcnJvckxpc3RlbmVyOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gRmlyZSBhbiBlcnJvciBldmVudCBhbmQgcGFzcyBiYWNrIHRoZSBjb2RlLlxuICAgICAgc2VsZi5fcGFyZW50Ll9lbWl0KCdsb2FkZXJyb3InLCBzZWxmLl9pZCwgc2VsZi5fbm9kZS5lcnJvciA/IHNlbGYuX25vZGUuZXJyb3IuY29kZSA6IDApO1xuXG4gICAgICAvLyBDbGVhciB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAgICBzZWxmLl9ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgc2VsZi5fZXJyb3JGbiwgZmFsc2UpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBIVE1MNSBBdWRpbyBjYW5wbGF5dGhyb3VnaCBsaXN0ZW5lciBjYWxsYmFjay5cbiAgICAgKi9cbiAgICBfbG9hZExpc3RlbmVyOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBwYXJlbnQgPSBzZWxmLl9wYXJlbnQ7XG5cbiAgICAgIC8vIFJvdW5kIHVwIHRoZSBkdXJhdGlvbiB0byBhY2NvdW50IGZvciB0aGUgbG93ZXIgcHJlY2lzaW9uIGluIEhUTUw1IEF1ZGlvLlxuICAgICAgcGFyZW50Ll9kdXJhdGlvbiA9IE1hdGguY2VpbChzZWxmLl9ub2RlLmR1cmF0aW9uICogMTApIC8gMTA7XG5cbiAgICAgIC8vIFNldHVwIGEgc3ByaXRlIGlmIG5vbmUgaXMgZGVmaW5lZC5cbiAgICAgIGlmIChPYmplY3Qua2V5cyhwYXJlbnQuX3Nwcml0ZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHBhcmVudC5fc3ByaXRlID0ge19fZGVmYXVsdDogWzAsIHBhcmVudC5fZHVyYXRpb24gKiAxMDAwXX07XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJlbnQuX3N0YXRlICE9PSAnbG9hZGVkJykge1xuICAgICAgICBwYXJlbnQuX3N0YXRlID0gJ2xvYWRlZCc7XG4gICAgICAgIHBhcmVudC5fZW1pdCgnbG9hZCcpO1xuICAgICAgICBwYXJlbnQuX2xvYWRRdWV1ZSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAgICBzZWxmLl9ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoSG93bGVyLl9jYW5QbGF5RXZlbnQsIHNlbGYuX2xvYWRGbiwgZmFsc2UpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBIVE1MNSBBdWRpbyBlbmRlZCBsaXN0ZW5lciBjYWxsYmFjay5cbiAgICAgKi9cbiAgICBfZW5kTGlzdGVuZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHBhcmVudCA9IHNlbGYuX3BhcmVudDtcblxuICAgICAgLy8gT25seSBoYW5kbGUgdGhlIGBlbmRlZGBgIGV2ZW50IGlmIHRoZSBkdXJhdGlvbiBpcyBJbmZpbml0eS5cbiAgICAgIGlmIChwYXJlbnQuX2R1cmF0aW9uID09PSBJbmZpbml0eSkge1xuICAgICAgICAvLyBVcGRhdGUgdGhlIHBhcmVudCBkdXJhdGlvbiB0byBtYXRjaCB0aGUgcmVhbCBhdWRpbyBkdXJhdGlvbi5cbiAgICAgICAgLy8gUm91bmQgdXAgdGhlIGR1cmF0aW9uIHRvIGFjY291bnQgZm9yIHRoZSBsb3dlciBwcmVjaXNpb24gaW4gSFRNTDUgQXVkaW8uXG4gICAgICAgIHBhcmVudC5fZHVyYXRpb24gPSBNYXRoLmNlaWwoc2VsZi5fbm9kZS5kdXJhdGlvbiAqIDEwKSAvIDEwO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgc3ByaXRlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHJlYWwgZHVyYXRpb24uXG4gICAgICAgIGlmIChwYXJlbnQuX3Nwcml0ZS5fX2RlZmF1bHRbMV0gPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgcGFyZW50Ll9zcHJpdGUuX19kZWZhdWx0WzFdID0gcGFyZW50Ll9kdXJhdGlvbiAqIDEwMDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSdW4gdGhlIHJlZ3VsYXIgZW5kZWQgbWV0aG9kLlxuICAgICAgICBwYXJlbnQuX2VuZGVkKHNlbGYpO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciB0aGUgZXZlbnQgbGlzdGVuZXIgc2luY2UgdGhlIGR1cmF0aW9uIGlzIG5vdyBjb3JyZWN0LlxuICAgICAgc2VsZi5fbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmRlZCcsIHNlbGYuX2VuZEZuLCBmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBIZWxwZXIgTWV0aG9kcyAqKi9cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICB2YXIgY2FjaGUgPSB7fTtcblxuICAvKipcbiAgICogQnVmZmVyIGEgc291bmQgZnJvbSBVUkwsIERhdGEgVVJJIG9yIGNhY2hlIGFuZCBkZWNvZGUgdG8gYXVkaW8gc291cmNlIChXZWIgQXVkaW8gQVBJKS5cbiAgICogQHBhcmFtICB7SG93bH0gc2VsZlxuICAgKi9cbiAgdmFyIGxvYWRCdWZmZXIgPSBmdW5jdGlvbihzZWxmKSB7XG4gICAgdmFyIHVybCA9IHNlbGYuX3NyYztcblxuICAgIC8vIENoZWNrIGlmIHRoZSBidWZmZXIgaGFzIGFscmVhZHkgYmVlbiBjYWNoZWQgYW5kIHVzZSBpdCBpbnN0ZWFkLlxuICAgIGlmIChjYWNoZVt1cmxdKSB7XG4gICAgICAvLyBTZXQgdGhlIGR1cmF0aW9uIGZyb20gdGhlIGNhY2hlLlxuICAgICAgc2VsZi5fZHVyYXRpb24gPSBjYWNoZVt1cmxdLmR1cmF0aW9uO1xuXG4gICAgICAvLyBMb2FkIHRoZSBzb3VuZCBpbnRvIHRoaXMgSG93bC5cbiAgICAgIGxvYWRTb3VuZChzZWxmKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICgvXmRhdGE6W147XSs7YmFzZTY0LC8udGVzdCh1cmwpKSB7XG4gICAgICAvLyBEZWNvZGUgdGhlIGJhc2U2NCBkYXRhIFVSSSB3aXRob3V0IFhIUiwgc2luY2Ugc29tZSBicm93c2VycyBkb24ndCBzdXBwb3J0IGl0LlxuICAgICAgdmFyIGRhdGEgPSBhdG9iKHVybC5zcGxpdCgnLCcpWzFdKTtcbiAgICAgIHZhciBkYXRhVmlldyA9IG5ldyBVaW50OEFycmF5KGRhdGEubGVuZ3RoKTtcbiAgICAgIGZvciAodmFyIGk9MDsgaTxkYXRhLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGRhdGFWaWV3W2ldID0gZGF0YS5jaGFyQ29kZUF0KGkpO1xuICAgICAgfVxuXG4gICAgICBkZWNvZGVBdWRpb0RhdGEoZGF0YVZpZXcuYnVmZmVyLCBzZWxmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTG9hZCB0aGUgYnVmZmVyIGZyb20gdGhlIFVSTC5cbiAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgIHhoci5vcGVuKHNlbGYuX3hoci5tZXRob2QsIHVybCwgdHJ1ZSk7XG4gICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gc2VsZi5feGhyLndpdGhDcmVkZW50aWFscztcbiAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInO1xuXG4gICAgICAvLyBBcHBseSBhbnkgY3VzdG9tIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3QuXG4gICAgICBpZiAoc2VsZi5feGhyLmhlYWRlcnMpIHtcbiAgICAgICAgT2JqZWN0LmtleXMoc2VsZi5feGhyLmhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoa2V5LCBzZWxmLl94aHIuaGVhZGVyc1trZXldKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGdldCBhIHN1Y2Nlc3NmdWwgcmVzcG9uc2UgYmFjay5cbiAgICAgICAgdmFyIGNvZGUgPSAoeGhyLnN0YXR1cyArICcnKVswXTtcbiAgICAgICAgaWYgKGNvZGUgIT09ICcwJyAmJiBjb2RlICE9PSAnMicgJiYgY29kZSAhPT0gJzMnKSB7XG4gICAgICAgICAgc2VsZi5fZW1pdCgnbG9hZGVycm9yJywgbnVsbCwgJ0ZhaWxlZCBsb2FkaW5nIGF1ZGlvIGZpbGUgd2l0aCBzdGF0dXM6ICcgKyB4aHIuc3RhdHVzICsgJy4nKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBkZWNvZGVBdWRpb0RhdGEoeGhyLnJlc3BvbnNlLCBzZWxmKTtcbiAgICAgIH07XG4gICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciwgc3dpdGNoIHRvIEhUTUw1IEF1ZGlvLlxuICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgICBzZWxmLl9odG1sNSA9IHRydWU7XG4gICAgICAgICAgc2VsZi5fd2ViQXVkaW8gPSBmYWxzZTtcbiAgICAgICAgICBzZWxmLl9zb3VuZHMgPSBbXTtcbiAgICAgICAgICBkZWxldGUgY2FjaGVbdXJsXTtcbiAgICAgICAgICBzZWxmLmxvYWQoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHNhZmVYaHJTZW5kKHhocik7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBTZW5kIHRoZSBYSFIgcmVxdWVzdCB3cmFwcGVkIGluIGEgdHJ5L2NhdGNoLlxuICAgKiBAcGFyYW0gIHtPYmplY3R9IHhociBYSFIgdG8gc2VuZC5cbiAgICovXG4gIHZhciBzYWZlWGhyU2VuZCA9IGZ1bmN0aW9uKHhocikge1xuICAgIHRyeSB7XG4gICAgICB4aHIuc2VuZCgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHhoci5vbmVycm9yKCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBEZWNvZGUgYXVkaW8gZGF0YSBmcm9tIGFuIGFycmF5IGJ1ZmZlci5cbiAgICogQHBhcmFtICB7QXJyYXlCdWZmZXJ9IGFycmF5YnVmZmVyIFRoZSBhdWRpbyBkYXRhLlxuICAgKiBAcGFyYW0gIHtIb3dsfSAgICAgICAgc2VsZlxuICAgKi9cbiAgdmFyIGRlY29kZUF1ZGlvRGF0YSA9IGZ1bmN0aW9uKGFycmF5YnVmZmVyLCBzZWxmKSB7XG4gICAgLy8gRmlyZSBhIGxvYWQgZXJyb3IgaWYgc29tZXRoaW5nIGJyb2tlLlxuICAgIHZhciBlcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5fZW1pdCgnbG9hZGVycm9yJywgbnVsbCwgJ0RlY29kaW5nIGF1ZGlvIGRhdGEgZmFpbGVkLicpO1xuICAgIH07XG5cbiAgICAvLyBMb2FkIHRoZSBzb3VuZCBvbiBzdWNjZXNzLlxuICAgIHZhciBzdWNjZXNzID0gZnVuY3Rpb24oYnVmZmVyKSB7XG4gICAgICBpZiAoYnVmZmVyICYmIHNlbGYuX3NvdW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNhY2hlW3NlbGYuX3NyY10gPSBidWZmZXI7XG4gICAgICAgIGxvYWRTb3VuZChzZWxmLCBidWZmZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRGVjb2RlIHRoZSBidWZmZXIgaW50byBhbiBhdWRpbyBzb3VyY2UuXG4gICAgaWYgKHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJyAmJiBIb3dsZXIuY3R4LmRlY29kZUF1ZGlvRGF0YS5sZW5ndGggPT09IDEpIHtcbiAgICAgIEhvd2xlci5jdHguZGVjb2RlQXVkaW9EYXRhKGFycmF5YnVmZmVyKS50aGVuKHN1Y2Nlc3MpLmNhdGNoKGVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgSG93bGVyLmN0eC5kZWNvZGVBdWRpb0RhdGEoYXJyYXlidWZmZXIsIHN1Y2Nlc3MsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU291bmQgaXMgbm93IGxvYWRlZCwgc28gZmluaXNoIHNldHRpbmcgZXZlcnl0aGluZyB1cCBhbmQgZmlyZSB0aGUgbG9hZGVkIGV2ZW50LlxuICAgKiBAcGFyYW0gIHtIb3dsfSBzZWxmXG4gICAqIEBwYXJhbSAge09iamVjdH0gYnVmZmVyIFRoZSBkZWNvZGVkIGJ1ZmZlciBzb3VuZCBzb3VyY2UuXG4gICAqL1xuICB2YXIgbG9hZFNvdW5kID0gZnVuY3Rpb24oc2VsZiwgYnVmZmVyKSB7XG4gICAgLy8gU2V0IHRoZSBkdXJhdGlvbi5cbiAgICBpZiAoYnVmZmVyICYmICFzZWxmLl9kdXJhdGlvbikge1xuICAgICAgc2VsZi5fZHVyYXRpb24gPSBidWZmZXIuZHVyYXRpb247XG4gICAgfVxuXG4gICAgLy8gU2V0dXAgYSBzcHJpdGUgaWYgbm9uZSBpcyBkZWZpbmVkLlxuICAgIGlmIChPYmplY3Qua2V5cyhzZWxmLl9zcHJpdGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgc2VsZi5fc3ByaXRlID0ge19fZGVmYXVsdDogWzAsIHNlbGYuX2R1cmF0aW9uICogMTAwMF19O1xuICAgIH1cblxuICAgIC8vIEZpcmUgdGhlIGxvYWRlZCBldmVudC5cbiAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnKSB7XG4gICAgICBzZWxmLl9zdGF0ZSA9ICdsb2FkZWQnO1xuICAgICAgc2VsZi5fZW1pdCgnbG9hZCcpO1xuICAgICAgc2VsZi5fbG9hZFF1ZXVlKCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBTZXR1cCB0aGUgYXVkaW8gY29udGV4dCB3aGVuIGF2YWlsYWJsZSwgb3Igc3dpdGNoIHRvIEhUTUw1IEF1ZGlvIG1vZGUuXG4gICAqL1xuICB2YXIgc2V0dXBBdWRpb0NvbnRleHQgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGFscmVhZHkgZGV0ZWN0ZWQgdGhhdCBXZWIgQXVkaW8gaXNuJ3Qgc3VwcG9ydGVkLCBkb24ndCBydW4gdGhpcyBzdGVwIGFnYWluLlxuICAgIGlmICghSG93bGVyLnVzaW5nV2ViQXVkaW8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBhcmUgdXNpbmcgV2ViIEF1ZGlvIGFuZCBzZXR1cCB0aGUgQXVkaW9Db250ZXh0IGlmIHdlIGFyZS5cbiAgICB0cnkge1xuICAgICAgaWYgKHR5cGVvZiBBdWRpb0NvbnRleHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIEhvd2xlci5jdHggPSBuZXcgQXVkaW9Db250ZXh0KCk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB3ZWJraXRBdWRpb0NvbnRleHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIEhvd2xlci5jdHggPSBuZXcgd2Via2l0QXVkaW9Db250ZXh0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBIb3dsZXIudXNpbmdXZWJBdWRpbyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2goZSkge1xuICAgICAgSG93bGVyLnVzaW5nV2ViQXVkaW8gPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgYXVkaW8gY29udGV4dCBjcmVhdGlvbiBzdGlsbCBmYWlsZWQsIHNldCB1c2luZyB3ZWIgYXVkaW8gdG8gZmFsc2UuXG4gICAgaWYgKCFIb3dsZXIuY3R4KSB7XG4gICAgICBIb3dsZXIudXNpbmdXZWJBdWRpbyA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGEgd2VidmlldyBpcyBiZWluZyB1c2VkIG9uIGlPUzggb3IgZWFybGllciAocmF0aGVyIHRoYW4gdGhlIGJyb3dzZXIpLlxuICAgIC8vIElmIGl0IGlzLCBkaXNhYmxlIFdlYiBBdWRpbyBhcyBpdCBjYXVzZXMgY3Jhc2hpbmcuXG4gICAgdmFyIGlPUyA9ICgvaVAoaG9uZXxvZHxhZCkvLnRlc3QoSG93bGVyLl9uYXZpZ2F0b3IgJiYgSG93bGVyLl9uYXZpZ2F0b3IucGxhdGZvcm0pKTtcbiAgICB2YXIgYXBwVmVyc2lvbiA9IEhvd2xlci5fbmF2aWdhdG9yICYmIEhvd2xlci5fbmF2aWdhdG9yLmFwcFZlcnNpb24ubWF0Y2goL09TIChcXGQrKV8oXFxkKylfPyhcXGQrKT8vKTtcbiAgICB2YXIgdmVyc2lvbiA9IGFwcFZlcnNpb24gPyBwYXJzZUludChhcHBWZXJzaW9uWzFdLCAxMCkgOiBudWxsO1xuICAgIGlmIChpT1MgJiYgdmVyc2lvbiAmJiB2ZXJzaW9uIDwgOSkge1xuICAgICAgdmFyIHNhZmFyaSA9IC9zYWZhcmkvLnRlc3QoSG93bGVyLl9uYXZpZ2F0b3IgJiYgSG93bGVyLl9uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgaWYgKEhvd2xlci5fbmF2aWdhdG9yICYmICFzYWZhcmkpIHtcbiAgICAgICAgSG93bGVyLnVzaW5nV2ViQXVkaW8gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYW5kIGV4cG9zZSB0aGUgbWFzdGVyIEdhaW5Ob2RlIHdoZW4gdXNpbmcgV2ViIEF1ZGlvICh1c2VmdWwgZm9yIHBsdWdpbnMgb3IgYWR2YW5jZWQgdXNhZ2UpLlxuICAgIGlmIChIb3dsZXIudXNpbmdXZWJBdWRpbykge1xuICAgICAgSG93bGVyLm1hc3RlckdhaW4gPSAodHlwZW9mIEhvd2xlci5jdHguY3JlYXRlR2FpbiA9PT0gJ3VuZGVmaW5lZCcpID8gSG93bGVyLmN0eC5jcmVhdGVHYWluTm9kZSgpIDogSG93bGVyLmN0eC5jcmVhdGVHYWluKCk7XG4gICAgICBIb3dsZXIubWFzdGVyR2Fpbi5nYWluLnNldFZhbHVlQXRUaW1lKEhvd2xlci5fbXV0ZWQgPyAwIDogSG93bGVyLl92b2x1bWUsIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgSG93bGVyLm1hc3RlckdhaW4uY29ubmVjdChIb3dsZXIuY3R4LmRlc3RpbmF0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBSZS1ydW4gdGhlIHNldHVwIG9uIEhvd2xlci5cbiAgICBIb3dsZXIuX3NldHVwKCk7XG4gIH07XG5cbiAgLy8gQWRkIHN1cHBvcnQgZm9yIEFNRCAoQXN5bmNocm9ub3VzIE1vZHVsZSBEZWZpbml0aW9uKSBsaWJyYXJpZXMgc3VjaCBhcyByZXF1aXJlLmpzLlxuICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgZGVmaW5lKFtdLCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIEhvd2xlcjogSG93bGVyLFxuICAgICAgICBIb3dsOiBIb3dsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLy8gQWRkIHN1cHBvcnQgZm9yIENvbW1vbkpTIGxpYnJhcmllcyBzdWNoIGFzIGJyb3dzZXJpZnkuXG4gIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBleHBvcnRzLkhvd2xlciA9IEhvd2xlcjtcbiAgICBleHBvcnRzLkhvd2wgPSBIb3dsO1xuICB9XG5cbiAgLy8gQWRkIHRvIGdsb2JhbCBpbiBOb2RlLmpzIChmb3IgdGVzdGluZywgZXRjKS5cbiAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgZ2xvYmFsLkhvd2xlckdsb2JhbCA9IEhvd2xlckdsb2JhbDtcbiAgICBnbG9iYWwuSG93bGVyID0gSG93bGVyO1xuICAgIGdsb2JhbC5Ib3dsID0gSG93bDtcbiAgICBnbG9iYWwuU291bmQgPSBTb3VuZDtcbiAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgeyAgLy8gRGVmaW5lIGdsb2JhbGx5IGluIGNhc2UgQU1EIGlzIG5vdCBhdmFpbGFibGUgb3IgdW51c2VkLlxuICAgIHdpbmRvdy5Ib3dsZXJHbG9iYWwgPSBIb3dsZXJHbG9iYWw7XG4gICAgd2luZG93Lkhvd2xlciA9IEhvd2xlcjtcbiAgICB3aW5kb3cuSG93bCA9IEhvd2w7XG4gICAgd2luZG93LlNvdW5kID0gU291bmQ7XG4gIH1cbn0pKCk7XG5cblxuLyohXG4gKiAgU3BhdGlhbCBQbHVnaW4gLSBBZGRzIHN1cHBvcnQgZm9yIHN0ZXJlbyBhbmQgM0QgYXVkaW8gd2hlcmUgV2ViIEF1ZGlvIGlzIHN1cHBvcnRlZC5cbiAqICBcbiAqICBob3dsZXIuanMgdjIuMi4xXG4gKiAgaG93bGVyanMuY29tXG4gKlxuICogIChjKSAyMDEzLTIwMjAsIEphbWVzIFNpbXBzb24gb2YgR29sZEZpcmUgU3R1ZGlvc1xuICogIGdvbGRmaXJlc3R1ZGlvcy5jb21cbiAqXG4gKiAgTUlUIExpY2Vuc2VcbiAqL1xuXG4oZnVuY3Rpb24oKSB7XG5cbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8vIFNldHVwIGRlZmF1bHQgcHJvcGVydGllcy5cbiAgSG93bGVyR2xvYmFsLnByb3RvdHlwZS5fcG9zID0gWzAsIDAsIDBdO1xuICBIb3dsZXJHbG9iYWwucHJvdG90eXBlLl9vcmllbnRhdGlvbiA9IFswLCAwLCAtMSwgMCwgMSwgMF07XG5cbiAgLyoqIEdsb2JhbCBNZXRob2RzICoqL1xuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHRvIHVwZGF0ZSB0aGUgc3RlcmVvIHBhbm5pbmcgcG9zaXRpb24gb2YgYWxsIGN1cnJlbnQgSG93bHMuXG4gICAqIEZ1dHVyZSBIb3dscyB3aWxsIG5vdCB1c2UgdGhpcyB2YWx1ZSB1bmxlc3MgZXhwbGljaXRseSBzZXQuXG4gICAqIEBwYXJhbSAge051bWJlcn0gcGFuIEEgdmFsdWUgb2YgLTEuMCBpcyBhbGwgdGhlIHdheSBsZWZ0IGFuZCAxLjAgaXMgYWxsIHRoZSB3YXkgcmlnaHQuXG4gICAqIEByZXR1cm4ge0hvd2xlci9OdW1iZXJ9ICAgICBTZWxmIG9yIGN1cnJlbnQgc3RlcmVvIHBhbm5pbmcgdmFsdWUuXG4gICAqL1xuICBIb3dsZXJHbG9iYWwucHJvdG90eXBlLnN0ZXJlbyA9IGZ1bmN0aW9uKHBhbikge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIC8vIFN0b3AgcmlnaHQgaGVyZSBpZiBub3QgdXNpbmcgV2ViIEF1ZGlvLlxuICAgIGlmICghc2VsZi5jdHggfHwgIXNlbGYuY3R4Lmxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbiAgICAvLyBMb29wIHRocm91Z2ggYWxsIEhvd2xzIGFuZCB1cGRhdGUgdGhlaXIgc3RlcmVvIHBhbm5pbmcuXG4gICAgZm9yICh2YXIgaT1zZWxmLl9ob3dscy5sZW5ndGgtMTsgaT49MDsgaS0tKSB7XG4gICAgICBzZWxmLl9ob3dsc1tpXS5zdGVyZW8ocGFuKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZjtcbiAgfTtcblxuICAvKipcbiAgICogR2V0L3NldCB0aGUgcG9zaXRpb24gb2YgdGhlIGxpc3RlbmVyIGluIDNEIGNhcnRlc2lhbiBzcGFjZS4gU291bmRzIHVzaW5nXG4gICAqIDNEIHBvc2l0aW9uIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGxpc3RlbmVyJ3MgcG9zaXRpb24uXG4gICAqIEBwYXJhbSAge051bWJlcn0geCBUaGUgeC1wb3NpdGlvbiBvZiB0aGUgbGlzdGVuZXIuXG4gICAqIEBwYXJhbSAge051bWJlcn0geSBUaGUgeS1wb3NpdGlvbiBvZiB0aGUgbGlzdGVuZXIuXG4gICAqIEBwYXJhbSAge051bWJlcn0geiBUaGUgei1wb3NpdGlvbiBvZiB0aGUgbGlzdGVuZXIuXG4gICAqIEByZXR1cm4ge0hvd2xlci9BcnJheX0gICBTZWxmIG9yIGN1cnJlbnQgbGlzdGVuZXIgcG9zaXRpb24uXG4gICAqL1xuICBIb3dsZXJHbG9iYWwucHJvdG90eXBlLnBvcyA9IGZ1bmN0aW9uKHgsIHksIHopIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBTdG9wIHJpZ2h0IGhlcmUgaWYgbm90IHVzaW5nIFdlYiBBdWRpby5cbiAgICBpZiAoIXNlbGYuY3R4IHx8ICFzZWxmLmN0eC5saXN0ZW5lcikge1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBkZWZhdWx0cyBmb3Igb3B0aW9uYWwgJ3knICYgJ3onLlxuICAgIHkgPSAodHlwZW9mIHkgIT09ICdudW1iZXInKSA/IHNlbGYuX3Bvc1sxXSA6IHk7XG4gICAgeiA9ICh0eXBlb2YgeiAhPT0gJ251bWJlcicpID8gc2VsZi5fcG9zWzJdIDogejtcblxuICAgIGlmICh0eXBlb2YgeCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHNlbGYuX3BvcyA9IFt4LCB5LCB6XTtcblxuICAgICAgaWYgKHR5cGVvZiBzZWxmLmN0eC5saXN0ZW5lci5wb3NpdGlvblggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNlbGYuY3R4Lmxpc3RlbmVyLnBvc2l0aW9uWC5zZXRUYXJnZXRBdFRpbWUoc2VsZi5fcG9zWzBdLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lLCAwLjEpO1xuICAgICAgICBzZWxmLmN0eC5saXN0ZW5lci5wb3NpdGlvblkuc2V0VGFyZ2V0QXRUaW1lKHNlbGYuX3Bvc1sxXSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSwgMC4xKTtcbiAgICAgICAgc2VsZi5jdHgubGlzdGVuZXIucG9zaXRpb25aLnNldFRhcmdldEF0VGltZShzZWxmLl9wb3NbMl0sIEhvd2xlci5jdHguY3VycmVudFRpbWUsIDAuMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLmN0eC5saXN0ZW5lci5zZXRQb3NpdGlvbihzZWxmLl9wb3NbMF0sIHNlbGYuX3Bvc1sxXSwgc2VsZi5fcG9zWzJdKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNlbGYuX3BvcztcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZjtcbiAgfTtcblxuICAvKipcbiAgICogR2V0L3NldCB0aGUgZGlyZWN0aW9uIHRoZSBsaXN0ZW5lciBpcyBwb2ludGluZyBpbiB0aGUgM0QgY2FydGVzaWFuIHNwYWNlLlxuICAgKiBBIGZyb250IGFuZCB1cCB2ZWN0b3IgbXVzdCBiZSBwcm92aWRlZC4gVGhlIGZyb250IGlzIHRoZSBkaXJlY3Rpb24gdGhlXG4gICAqIGZhY2Ugb2YgdGhlIGxpc3RlbmVyIGlzIHBvaW50aW5nLCBhbmQgdXAgaXMgdGhlIGRpcmVjdGlvbiB0aGUgdG9wIG9mIHRoZVxuICAgKiBsaXN0ZW5lciBpcyBwb2ludGluZy4gVGh1cywgdGhlc2UgdmFsdWVzIGFyZSBleHBlY3RlZCB0byBiZSBhdCByaWdodCBhbmdsZXNcbiAgICogZnJvbSBlYWNoIG90aGVyLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHggICBUaGUgeC1vcmllbnRhdGlvbiBvZiB0aGUgbGlzdGVuZXIuXG4gICAqIEBwYXJhbSAge051bWJlcn0geSAgIFRoZSB5LW9yaWVudGF0aW9uIG9mIHRoZSBsaXN0ZW5lci5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB6ICAgVGhlIHotb3JpZW50YXRpb24gb2YgdGhlIGxpc3RlbmVyLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHhVcCBUaGUgeC1vcmllbnRhdGlvbiBvZiB0aGUgdG9wIG9mIHRoZSBsaXN0ZW5lci5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB5VXAgVGhlIHktb3JpZW50YXRpb24gb2YgdGhlIHRvcCBvZiB0aGUgbGlzdGVuZXIuXG4gICAqIEBwYXJhbSAge051bWJlcn0gelVwIFRoZSB6LW9yaWVudGF0aW9uIG9mIHRoZSB0b3Agb2YgdGhlIGxpc3RlbmVyLlxuICAgKiBAcmV0dXJuIHtIb3dsZXIvQXJyYXl9ICAgICBSZXR1cm5zIHNlbGYgb3IgdGhlIGN1cnJlbnQgb3JpZW50YXRpb24gdmVjdG9ycy5cbiAgICovXG4gIEhvd2xlckdsb2JhbC5wcm90b3R5cGUub3JpZW50YXRpb24gPSBmdW5jdGlvbih4LCB5LCB6LCB4VXAsIHlVcCwgelVwKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gU3RvcCByaWdodCBoZXJlIGlmIG5vdCB1c2luZyBXZWIgQXVkaW8uXG4gICAgaWYgKCFzZWxmLmN0eCB8fCAhc2VsZi5jdHgubGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgZGVmYXVsdHMgZm9yIG9wdGlvbmFsICd5JyAmICd6Jy5cbiAgICB2YXIgb3IgPSBzZWxmLl9vcmllbnRhdGlvbjtcbiAgICB5ID0gKHR5cGVvZiB5ICE9PSAnbnVtYmVyJykgPyBvclsxXSA6IHk7XG4gICAgeiA9ICh0eXBlb2YgeiAhPT0gJ251bWJlcicpID8gb3JbMl0gOiB6O1xuICAgIHhVcCA9ICh0eXBlb2YgeFVwICE9PSAnbnVtYmVyJykgPyBvclszXSA6IHhVcDtcbiAgICB5VXAgPSAodHlwZW9mIHlVcCAhPT0gJ251bWJlcicpID8gb3JbNF0gOiB5VXA7XG4gICAgelVwID0gKHR5cGVvZiB6VXAgIT09ICdudW1iZXInKSA/IG9yWzVdIDogelVwO1xuXG4gICAgaWYgKHR5cGVvZiB4ID09PSAnbnVtYmVyJykge1xuICAgICAgc2VsZi5fb3JpZW50YXRpb24gPSBbeCwgeSwgeiwgeFVwLCB5VXAsIHpVcF07XG5cbiAgICAgIGlmICh0eXBlb2Ygc2VsZi5jdHgubGlzdGVuZXIuZm9yd2FyZFggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNlbGYuY3R4Lmxpc3RlbmVyLmZvcndhcmRYLnNldFRhcmdldEF0VGltZSh4LCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lLCAwLjEpO1xuICAgICAgICBzZWxmLmN0eC5saXN0ZW5lci5mb3J3YXJkWS5zZXRUYXJnZXRBdFRpbWUoeSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSwgMC4xKTtcbiAgICAgICAgc2VsZi5jdHgubGlzdGVuZXIuZm9yd2FyZFouc2V0VGFyZ2V0QXRUaW1lKHosIEhvd2xlci5jdHguY3VycmVudFRpbWUsIDAuMSk7XG4gICAgICAgIHNlbGYuY3R4Lmxpc3RlbmVyLnVwWC5zZXRUYXJnZXRBdFRpbWUoeFVwLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lLCAwLjEpO1xuICAgICAgICBzZWxmLmN0eC5saXN0ZW5lci51cFkuc2V0VGFyZ2V0QXRUaW1lKHlVcCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSwgMC4xKTtcbiAgICAgICAgc2VsZi5jdHgubGlzdGVuZXIudXBaLnNldFRhcmdldEF0VGltZSh6VXAsIEhvd2xlci5jdHguY3VycmVudFRpbWUsIDAuMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLmN0eC5saXN0ZW5lci5zZXRPcmllbnRhdGlvbih4LCB5LCB6LCB4VXAsIHlVcCwgelVwKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9yO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIC8qKiBHcm91cCBNZXRob2RzICoqL1xuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBBZGQgbmV3IHByb3BlcnRpZXMgdG8gdGhlIGNvcmUgaW5pdC5cbiAgICogQHBhcmFtICB7RnVuY3Rpb259IF9zdXBlciBDb3JlIGluaXQgbWV0aG9kLlxuICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgKi9cbiAgSG93bC5wcm90b3R5cGUuaW5pdCA9IChmdW5jdGlvbihfc3VwZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24obykge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyBTZXR1cCB1c2VyLWRlZmluZWQgZGVmYXVsdCBwcm9wZXJ0aWVzLlxuICAgICAgc2VsZi5fb3JpZW50YXRpb24gPSBvLm9yaWVudGF0aW9uIHx8IFsxLCAwLCAwXTtcbiAgICAgIHNlbGYuX3N0ZXJlbyA9IG8uc3RlcmVvIHx8IG51bGw7XG4gICAgICBzZWxmLl9wb3MgPSBvLnBvcyB8fCBudWxsO1xuICAgICAgc2VsZi5fcGFubmVyQXR0ciA9IHtcbiAgICAgICAgY29uZUlubmVyQW5nbGU6IHR5cGVvZiBvLmNvbmVJbm5lckFuZ2xlICE9PSAndW5kZWZpbmVkJyA/IG8uY29uZUlubmVyQW5nbGUgOiAzNjAsXG4gICAgICAgIGNvbmVPdXRlckFuZ2xlOiB0eXBlb2Ygby5jb25lT3V0ZXJBbmdsZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLmNvbmVPdXRlckFuZ2xlIDogMzYwLFxuICAgICAgICBjb25lT3V0ZXJHYWluOiB0eXBlb2Ygby5jb25lT3V0ZXJHYWluICE9PSAndW5kZWZpbmVkJyA/IG8uY29uZU91dGVyR2FpbiA6IDAsXG4gICAgICAgIGRpc3RhbmNlTW9kZWw6IHR5cGVvZiBvLmRpc3RhbmNlTW9kZWwgIT09ICd1bmRlZmluZWQnID8gby5kaXN0YW5jZU1vZGVsIDogJ2ludmVyc2UnLFxuICAgICAgICBtYXhEaXN0YW5jZTogdHlwZW9mIG8ubWF4RGlzdGFuY2UgIT09ICd1bmRlZmluZWQnID8gby5tYXhEaXN0YW5jZSA6IDEwMDAwLFxuICAgICAgICBwYW5uaW5nTW9kZWw6IHR5cGVvZiBvLnBhbm5pbmdNb2RlbCAhPT0gJ3VuZGVmaW5lZCcgPyBvLnBhbm5pbmdNb2RlbCA6ICdIUlRGJyxcbiAgICAgICAgcmVmRGlzdGFuY2U6IHR5cGVvZiBvLnJlZkRpc3RhbmNlICE9PSAndW5kZWZpbmVkJyA/IG8ucmVmRGlzdGFuY2UgOiAxLFxuICAgICAgICByb2xsb2ZmRmFjdG9yOiB0eXBlb2Ygby5yb2xsb2ZmRmFjdG9yICE9PSAndW5kZWZpbmVkJyA/IG8ucm9sbG9mZkZhY3RvciA6IDFcbiAgICAgIH07XG5cbiAgICAgIC8vIFNldHVwIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgIHNlbGYuX29uc3RlcmVvID0gby5vbnN0ZXJlbyA/IFt7Zm46IG8ub25zdGVyZW99XSA6IFtdO1xuICAgICAgc2VsZi5fb25wb3MgPSBvLm9ucG9zID8gW3tmbjogby5vbnBvc31dIDogW107XG4gICAgICBzZWxmLl9vbm9yaWVudGF0aW9uID0gby5vbm9yaWVudGF0aW9uID8gW3tmbjogby5vbm9yaWVudGF0aW9ufV0gOiBbXTtcblxuICAgICAgLy8gQ29tcGxldGUgaW5pdGlsaXphdGlvbiB3aXRoIGhvd2xlci5qcyBjb3JlJ3MgaW5pdCBmdW5jdGlvbi5cbiAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBvKTtcbiAgICB9O1xuICB9KShIb3dsLnByb3RvdHlwZS5pbml0KTtcblxuICAvKipcbiAgICogR2V0L3NldCB0aGUgc3RlcmVvIHBhbm5pbmcgb2YgdGhlIGF1ZGlvIHNvdXJjZSBmb3IgdGhpcyBzb3VuZCBvciBhbGwgaW4gdGhlIGdyb3VwLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHBhbiAgQSB2YWx1ZSBvZiAtMS4wIGlzIGFsbCB0aGUgd2F5IGxlZnQgYW5kIDEuMCBpcyBhbGwgdGhlIHdheSByaWdodC5cbiAgICogQHBhcmFtICB7TnVtYmVyfSBpZCAob3B0aW9uYWwpIFRoZSBzb3VuZCBJRC4gSWYgbm9uZSBpcyBwYXNzZWQsIGFsbCBpbiBncm91cCB3aWxsIGJlIHVwZGF0ZWQuXG4gICAqIEByZXR1cm4ge0hvd2wvTnVtYmVyfSAgICBSZXR1cm5zIHNlbGYgb3IgdGhlIGN1cnJlbnQgc3RlcmVvIHBhbm5pbmcgdmFsdWUuXG4gICAqL1xuICBIb3dsLnByb3RvdHlwZS5zdGVyZW8gPSBmdW5jdGlvbihwYW4sIGlkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gU3RvcCByaWdodCBoZXJlIGlmIG5vdCB1c2luZyBXZWIgQXVkaW8uXG4gICAgaWYgKCFzZWxmLl93ZWJBdWRpbykge1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIGFkZCBpdCB0byB0aGUgbG9hZCBxdWV1ZSB0byBjaGFuZ2Ugc3RlcmVvIHBhbiB3aGVuIGNhcGFibGUuXG4gICAgaWYgKHNlbGYuX3N0YXRlICE9PSAnbG9hZGVkJykge1xuICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgIGV2ZW50OiAnc3RlcmVvJyxcbiAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBzZWxmLnN0ZXJlbyhwYW4sIGlkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBQYW5uZXJTdGVyZW9Ob2RlIHN1cHBvcnQgYW5kIGZhbGxiYWNrIHRvIFBhbm5lck5vZGUgaWYgaXQgZG9lc24ndCBleGlzdC5cbiAgICB2YXIgcGFubmVyVHlwZSA9ICh0eXBlb2YgSG93bGVyLmN0eC5jcmVhdGVTdGVyZW9QYW5uZXIgPT09ICd1bmRlZmluZWQnKSA/ICdzcGF0aWFsJyA6ICdzdGVyZW8nO1xuXG4gICAgLy8gU2V0dXAgdGhlIGdyb3VwJ3Mgc3RlcmVvIHBhbm5pbmcgaWYgbm8gSUQgaXMgcGFzc2VkLlxuICAgIGlmICh0eXBlb2YgaWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBSZXR1cm4gdGhlIGdyb3VwJ3Mgc3RlcmVvIHBhbm5pbmcgaWYgbm8gcGFyYW1ldGVycyBhcmUgcGFzc2VkLlxuICAgICAgaWYgKHR5cGVvZiBwYW4gPT09ICdudW1iZXInKSB7XG4gICAgICAgIHNlbGYuX3N0ZXJlbyA9IHBhbjtcbiAgICAgICAgc2VsZi5fcG9zID0gW3BhbiwgMCwgMF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc2VsZi5fc3RlcmVvO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoYW5nZSB0aGUgc3RyZW8gcGFubmluZyBvZiBvbmUgb3IgYWxsIHNvdW5kcyBpbiBncm91cC5cbiAgICB2YXIgaWRzID0gc2VsZi5fZ2V0U291bmRJZHMoaWQpO1xuICAgIGZvciAodmFyIGk9MDsgaTxpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIEdldCB0aGUgc291bmQuXG4gICAgICB2YXIgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWRzW2ldKTtcblxuICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcGFuID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHNvdW5kLl9zdGVyZW8gPSBwYW47XG4gICAgICAgICAgc291bmQuX3BvcyA9IFtwYW4sIDAsIDBdO1xuXG4gICAgICAgICAgaWYgKHNvdW5kLl9ub2RlKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBhcmUgZmFsbGluZyBiYWNrLCBtYWtlIHN1cmUgdGhlIHBhbm5pbmdNb2RlbCBpcyBlcXVhbHBvd2VyLlxuICAgICAgICAgICAgc291bmQuX3Bhbm5lckF0dHIucGFubmluZ01vZGVsID0gJ2VxdWFscG93ZXInO1xuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIHBhbm5lciBzZXR1cCBhbmQgY3JlYXRlIGEgbmV3IG9uZSBpZiBub3QuXG4gICAgICAgICAgICBpZiAoIXNvdW5kLl9wYW5uZXIgfHwgIXNvdW5kLl9wYW5uZXIucGFuKSB7XG4gICAgICAgICAgICAgIHNldHVwUGFubmVyKHNvdW5kLCBwYW5uZXJUeXBlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBhbm5lclR5cGUgPT09ICdzcGF0aWFsJykge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIHNvdW5kLl9wYW5uZXIucG9zaXRpb25YICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIucG9zaXRpb25YLnNldFZhbHVlQXRUaW1lKHBhbiwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICAgICAgc291bmQuX3Bhbm5lci5wb3NpdGlvblkuc2V0VmFsdWVBdFRpbWUoMCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICAgICAgc291bmQuX3Bhbm5lci5wb3NpdGlvblouc2V0VmFsdWVBdFRpbWUoMCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc291bmQuX3Bhbm5lci5zZXRQb3NpdGlvbihwYW4sIDAsIDApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLnBhbi5zZXRWYWx1ZUF0VGltZShwYW4sIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlbGYuX2VtaXQoJ3N0ZXJlbycsIHNvdW5kLl9pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHNvdW5kLl9zdGVyZW87XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZjtcbiAgfTtcblxuICAvKipcbiAgICogR2V0L3NldCB0aGUgM0Qgc3BhdGlhbCBwb3NpdGlvbiBvZiB0aGUgYXVkaW8gc291cmNlIGZvciB0aGlzIHNvdW5kIG9yIGdyb3VwIHJlbGF0aXZlIHRvIHRoZSBnbG9iYWwgbGlzdGVuZXIuXG4gICAqIEBwYXJhbSAge051bWJlcn0geCAgVGhlIHgtcG9zaXRpb24gb2YgdGhlIGF1ZGlvIHNvdXJjZS5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB5ICBUaGUgeS1wb3NpdGlvbiBvZiB0aGUgYXVkaW8gc291cmNlLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHogIFRoZSB6LXBvc2l0aW9uIG9mIHRoZSBhdWRpbyBzb3VyY2UuXG4gICAqIEBwYXJhbSAge051bWJlcn0gaWQgKG9wdGlvbmFsKSBUaGUgc291bmQgSUQuIElmIG5vbmUgaXMgcGFzc2VkLCBhbGwgaW4gZ3JvdXAgd2lsbCBiZSB1cGRhdGVkLlxuICAgKiBAcmV0dXJuIHtIb3dsL0FycmF5fSAgICBSZXR1cm5zIHNlbGYgb3IgdGhlIGN1cnJlbnQgM0Qgc3BhdGlhbCBwb3NpdGlvbjogW3gsIHksIHpdLlxuICAgKi9cbiAgSG93bC5wcm90b3R5cGUucG9zID0gZnVuY3Rpb24oeCwgeSwgeiwgaWQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBTdG9wIHJpZ2h0IGhlcmUgaWYgbm90IHVzaW5nIFdlYiBBdWRpby5cbiAgICBpZiAoIXNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgc291bmQgaGFzbid0IGxvYWRlZCwgYWRkIGl0IHRvIHRoZSBsb2FkIHF1ZXVlIHRvIGNoYW5nZSBwb3NpdGlvbiB3aGVuIGNhcGFibGUuXG4gICAgaWYgKHNlbGYuX3N0YXRlICE9PSAnbG9hZGVkJykge1xuICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgIGV2ZW50OiAncG9zJyxcbiAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBzZWxmLnBvcyh4LCB5LCB6LCBpZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbiAgICAvLyBTZXQgdGhlIGRlZmF1bHRzIGZvciBvcHRpb25hbCAneScgJiAneicuXG4gICAgeSA9ICh0eXBlb2YgeSAhPT0gJ251bWJlcicpID8gMCA6IHk7XG4gICAgeiA9ICh0eXBlb2YgeiAhPT0gJ251bWJlcicpID8gLTAuNSA6IHo7XG5cbiAgICAvLyBTZXR1cCB0aGUgZ3JvdXAncyBzcGF0aWFsIHBvc2l0aW9uIGlmIG5vIElEIGlzIHBhc3NlZC5cbiAgICBpZiAodHlwZW9mIGlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gUmV0dXJuIHRoZSBncm91cCdzIHNwYXRpYWwgcG9zaXRpb24gaWYgbm8gcGFyYW1ldGVycyBhcmUgcGFzc2VkLlxuICAgICAgaWYgKHR5cGVvZiB4ID09PSAnbnVtYmVyJykge1xuICAgICAgICBzZWxmLl9wb3MgPSBbeCwgeSwgel07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc2VsZi5fcG9zO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoYW5nZSB0aGUgc3BhdGlhbCBwb3NpdGlvbiBvZiBvbmUgb3IgYWxsIHNvdW5kcyBpbiBncm91cC5cbiAgICB2YXIgaWRzID0gc2VsZi5fZ2V0U291bmRJZHMoaWQpO1xuICAgIGZvciAodmFyIGk9MDsgaTxpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIEdldCB0aGUgc291bmQuXG4gICAgICB2YXIgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWRzW2ldKTtcblxuICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgIGlmICh0eXBlb2YgeCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBzb3VuZC5fcG9zID0gW3gsIHksIHpdO1xuXG4gICAgICAgICAgaWYgKHNvdW5kLl9ub2RlKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIHBhbm5lciBzZXR1cCBhbmQgY3JlYXRlIGEgbmV3IG9uZSBpZiBub3QuXG4gICAgICAgICAgICBpZiAoIXNvdW5kLl9wYW5uZXIgfHwgc291bmQuX3Bhbm5lci5wYW4pIHtcbiAgICAgICAgICAgICAgc2V0dXBQYW5uZXIoc291bmQsICdzcGF0aWFsJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc291bmQuX3Bhbm5lci5wb3NpdGlvblggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIucG9zaXRpb25YLnNldFZhbHVlQXRUaW1lKHgsIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWS5zZXRWYWx1ZUF0VGltZSh5LCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgICAgc291bmQuX3Bhbm5lci5wb3NpdGlvblouc2V0VmFsdWVBdFRpbWUoeiwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLnNldFBvc2l0aW9uKHgsIHksIHopO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlbGYuX2VtaXQoJ3BvcycsIHNvdW5kLl9pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHNvdW5kLl9wb3M7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZjtcbiAgfTtcblxuICAvKipcbiAgICogR2V0L3NldCB0aGUgZGlyZWN0aW9uIHRoZSBhdWRpbyBzb3VyY2UgaXMgcG9pbnRpbmcgaW4gdGhlIDNEIGNhcnRlc2lhbiBjb29yZGluYXRlXG4gICAqIHNwYWNlLiBEZXBlbmRpbmcgb24gaG93IGRpcmVjdGlvbiB0aGUgc291bmQgaXMsIGJhc2VkIG9uIHRoZSBgY29uZWAgYXR0cmlidXRlcyxcbiAgICogYSBzb3VuZCBwb2ludGluZyBhd2F5IGZyb20gdGhlIGxpc3RlbmVyIGNhbiBiZSBxdWlldCBvciBzaWxlbnQuXG4gICAqIEBwYXJhbSAge051bWJlcn0geCAgVGhlIHgtb3JpZW50YXRpb24gb2YgdGhlIHNvdXJjZS5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB5ICBUaGUgeS1vcmllbnRhdGlvbiBvZiB0aGUgc291cmNlLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHogIFRoZSB6LW9yaWVudGF0aW9uIG9mIHRoZSBzb3VyY2UuXG4gICAqIEBwYXJhbSAge051bWJlcn0gaWQgKG9wdGlvbmFsKSBUaGUgc291bmQgSUQuIElmIG5vbmUgaXMgcGFzc2VkLCBhbGwgaW4gZ3JvdXAgd2lsbCBiZSB1cGRhdGVkLlxuICAgKiBAcmV0dXJuIHtIb3dsL0FycmF5fSAgICBSZXR1cm5zIHNlbGYgb3IgdGhlIGN1cnJlbnQgM0Qgc3BhdGlhbCBvcmllbnRhdGlvbjogW3gsIHksIHpdLlxuICAgKi9cbiAgSG93bC5wcm90b3R5cGUub3JpZW50YXRpb24gPSBmdW5jdGlvbih4LCB5LCB6LCBpZCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIC8vIFN0b3AgcmlnaHQgaGVyZSBpZiBub3QgdXNpbmcgV2ViIEF1ZGlvLlxuICAgIGlmICghc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gY2hhbmdlIG9yaWVudGF0aW9uIHdoZW4gY2FwYWJsZS5cbiAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnKSB7XG4gICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgZXZlbnQ6ICdvcmllbnRhdGlvbicsXG4gICAgICAgIGFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgc2VsZi5vcmllbnRhdGlvbih4LCB5LCB6LCBpZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbiAgICAvLyBTZXQgdGhlIGRlZmF1bHRzIGZvciBvcHRpb25hbCAneScgJiAneicuXG4gICAgeSA9ICh0eXBlb2YgeSAhPT0gJ251bWJlcicpID8gc2VsZi5fb3JpZW50YXRpb25bMV0gOiB5O1xuICAgIHogPSAodHlwZW9mIHogIT09ICdudW1iZXInKSA/IHNlbGYuX29yaWVudGF0aW9uWzJdIDogejtcblxuICAgIC8vIFNldHVwIHRoZSBncm91cCdzIHNwYXRpYWwgb3JpZW50YXRpb24gaWYgbm8gSUQgaXMgcGFzc2VkLlxuICAgIGlmICh0eXBlb2YgaWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBSZXR1cm4gdGhlIGdyb3VwJ3Mgc3BhdGlhbCBvcmllbnRhdGlvbiBpZiBubyBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQuXG4gICAgICBpZiAodHlwZW9mIHggPT09ICdudW1iZXInKSB7XG4gICAgICAgIHNlbGYuX29yaWVudGF0aW9uID0gW3gsIHksIHpdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuX29yaWVudGF0aW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoYW5nZSB0aGUgc3BhdGlhbCBvcmllbnRhdGlvbiBvZiBvbmUgb3IgYWxsIHNvdW5kcyBpbiBncm91cC5cbiAgICB2YXIgaWRzID0gc2VsZi5fZ2V0U291bmRJZHMoaWQpO1xuICAgIGZvciAodmFyIGk9MDsgaTxpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIEdldCB0aGUgc291bmQuXG4gICAgICB2YXIgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWRzW2ldKTtcblxuICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgIGlmICh0eXBlb2YgeCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBzb3VuZC5fb3JpZW50YXRpb24gPSBbeCwgeSwgel07XG5cbiAgICAgICAgICBpZiAoc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgcGFubmVyIHNldHVwIGFuZCBjcmVhdGUgYSBuZXcgb25lIGlmIG5vdC5cbiAgICAgICAgICAgIGlmICghc291bmQuX3Bhbm5lcikge1xuICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIHBvc2l0aW9uIHRvIHNldHVwIHRoZSBub2RlIHdpdGguXG4gICAgICAgICAgICAgIGlmICghc291bmQuX3Bvcykge1xuICAgICAgICAgICAgICAgIHNvdW5kLl9wb3MgPSBzZWxmLl9wb3MgfHwgWzAsIDAsIC0wLjVdO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgc2V0dXBQYW5uZXIoc291bmQsICdzcGF0aWFsJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc291bmQuX3Bhbm5lci5vcmllbnRhdGlvblggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIub3JpZW50YXRpb25YLnNldFZhbHVlQXRUaW1lKHgsIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLm9yaWVudGF0aW9uWS5zZXRWYWx1ZUF0VGltZSh5LCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgICAgc291bmQuX3Bhbm5lci5vcmllbnRhdGlvblouc2V0VmFsdWVBdFRpbWUoeiwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLnNldE9yaWVudGF0aW9uKHgsIHksIHopO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlbGYuX2VtaXQoJ29yaWVudGF0aW9uJywgc291bmQuX2lkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gc291bmQuX29yaWVudGF0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGY7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldC9zZXQgdGhlIHBhbm5lciBub2RlJ3MgYXR0cmlidXRlcyBmb3IgYSBzb3VuZCBvciBncm91cCBvZiBzb3VuZHMuXG4gICAqIFRoaXMgbWV0aG9kIGNhbiBvcHRpb25hbGwgdGFrZSAwLCAxIG9yIDIgYXJndW1lbnRzLlxuICAgKiAgIHBhbm5lckF0dHIoKSAtPiBSZXR1cm5zIHRoZSBncm91cCdzIHZhbHVlcy5cbiAgICogICBwYW5uZXJBdHRyKGlkKSAtPiBSZXR1cm5zIHRoZSBzb3VuZCBpZCdzIHZhbHVlcy5cbiAgICogICBwYW5uZXJBdHRyKG8pIC0+IFNldCdzIHRoZSB2YWx1ZXMgb2YgYWxsIHNvdW5kcyBpbiB0aGlzIEhvd2wgZ3JvdXAuXG4gICAqICAgcGFubmVyQXR0cihvLCBpZCkgLT4gU2V0J3MgdGhlIHZhbHVlcyBvZiBwYXNzZWQgc291bmQgaWQuXG4gICAqXG4gICAqICAgQXR0cmlidXRlczpcbiAgICogICAgIGNvbmVJbm5lckFuZ2xlIC0gKDM2MCBieSBkZWZhdWx0KSBBIHBhcmFtZXRlciBmb3IgZGlyZWN0aW9uYWwgYXVkaW8gc291cmNlcywgdGhpcyBpcyBhbiBhbmdsZSwgaW4gZGVncmVlcyxcbiAgICogICAgICAgICAgICAgICAgICAgICAgaW5zaWRlIG9mIHdoaWNoIHRoZXJlIHdpbGwgYmUgbm8gdm9sdW1lIHJlZHVjdGlvbi5cbiAgICogICAgIGNvbmVPdXRlckFuZ2xlIC0gKDM2MCBieSBkZWZhdWx0KSBBIHBhcmFtZXRlciBmb3IgZGlyZWN0aW9uYWwgYXVkaW8gc291cmNlcywgdGhpcyBpcyBhbiBhbmdsZSwgaW4gZGVncmVlcyxcbiAgICogICAgICAgICAgICAgICAgICAgICAgb3V0c2lkZSBvZiB3aGljaCB0aGUgdm9sdW1lIHdpbGwgYmUgcmVkdWNlZCB0byBhIGNvbnN0YW50IHZhbHVlIG9mIGBjb25lT3V0ZXJHYWluYC5cbiAgICogICAgIGNvbmVPdXRlckdhaW4gLSAoMCBieSBkZWZhdWx0KSBBIHBhcmFtZXRlciBmb3IgZGlyZWN0aW9uYWwgYXVkaW8gc291cmNlcywgdGhpcyBpcyB0aGUgZ2FpbiBvdXRzaWRlIG9mIHRoZVxuICAgKiAgICAgICAgICAgICAgICAgICAgIGBjb25lT3V0ZXJBbmdsZWAuIEl0IGlzIGEgbGluZWFyIHZhbHVlIGluIHRoZSByYW5nZSBgWzAsIDFdYC5cbiAgICogICAgIGRpc3RhbmNlTW9kZWwgLSAoJ2ludmVyc2UnIGJ5IGRlZmF1bHQpIERldGVybWluZXMgYWxnb3JpdGhtIHVzZWQgdG8gcmVkdWNlIHZvbHVtZSBhcyBhdWRpbyBtb3ZlcyBhd2F5IGZyb21cbiAgICogICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci4gQ2FuIGJlIGBsaW5lYXJgLCBgaW52ZXJzZWAgb3IgYGV4cG9uZW50aWFsLlxuICAgKiAgICAgbWF4RGlzdGFuY2UgLSAoMTAwMDAgYnkgZGVmYXVsdCkgVGhlIG1heGltdW0gZGlzdGFuY2UgYmV0d2VlbiBzb3VyY2UgYW5kIGxpc3RlbmVyLCBhZnRlciB3aGljaCB0aGUgdm9sdW1lXG4gICAqICAgICAgICAgICAgICAgICAgIHdpbGwgbm90IGJlIHJlZHVjZWQgYW55IGZ1cnRoZXIuXG4gICAqICAgICByZWZEaXN0YW5jZSAtICgxIGJ5IGRlZmF1bHQpIEEgcmVmZXJlbmNlIGRpc3RhbmNlIGZvciByZWR1Y2luZyB2b2x1bWUgYXMgc291cmNlIG1vdmVzIGZ1cnRoZXIgZnJvbSB0aGUgbGlzdGVuZXIuXG4gICAqICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgc2ltcGx5IGEgdmFyaWFibGUgb2YgdGhlIGRpc3RhbmNlIG1vZGVsIGFuZCBoYXMgYSBkaWZmZXJlbnQgZWZmZWN0IGRlcGVuZGluZyBvbiB3aGljaCBtb2RlbFxuICAgKiAgICAgICAgICAgICAgICAgICBpcyB1c2VkIGFuZCB0aGUgc2NhbGUgb2YgeW91ciBjb29yZGluYXRlcy4gR2VuZXJhbGx5LCB2b2x1bWUgd2lsbCBiZSBlcXVhbCB0byAxIGF0IHRoaXMgZGlzdGFuY2UuXG4gICAqICAgICByb2xsb2ZmRmFjdG9yIC0gKDEgYnkgZGVmYXVsdCkgSG93IHF1aWNrbHkgdGhlIHZvbHVtZSByZWR1Y2VzIGFzIHNvdXJjZSBtb3ZlcyBmcm9tIGxpc3RlbmVyLiBUaGlzIGlzIHNpbXBseSBhXG4gICAqICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgb2YgdGhlIGRpc3RhbmNlIG1vZGVsIGFuZCBjYW4gYmUgaW4gdGhlIHJhbmdlIG9mIGBbMCwgMV1gIHdpdGggYGxpbmVhcmAgYW5kIGBbMCwg4oieXWBcbiAgICogICAgICAgICAgICAgICAgICAgICB3aXRoIGBpbnZlcnNlYCBhbmQgYGV4cG9uZW50aWFsYC5cbiAgICogICAgIHBhbm5pbmdNb2RlbCAtICgnSFJURicgYnkgZGVmYXVsdCkgRGV0ZXJtaW5lcyB3aGljaCBzcGF0aWFsaXphdGlvbiBhbGdvcml0aG0gaXMgdXNlZCB0byBwb3NpdGlvbiBhdWRpby5cbiAgICogICAgICAgICAgICAgICAgICAgICBDYW4gYmUgYEhSVEZgIG9yIGBlcXVhbHBvd2VyYC5cbiAgICpcbiAgICogQHJldHVybiB7SG93bC9PYmplY3R9IFJldHVybnMgc2VsZiBvciBjdXJyZW50IHBhbm5lciBhdHRyaWJ1dGVzLlxuICAgKi9cbiAgSG93bC5wcm90b3R5cGUucGFubmVyQXR0ciA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgbywgaWQsIHNvdW5kO1xuXG4gICAgLy8gU3RvcCByaWdodCBoZXJlIGlmIG5vdCB1c2luZyBXZWIgQXVkaW8uXG4gICAgaWYgKCFzZWxmLl93ZWJBdWRpbykge1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lIHRoZSB2YWx1ZXMgYmFzZWQgb24gYXJndW1lbnRzLlxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gUmV0dXJuIHRoZSBncm91cCdzIHBhbm5lciBhdHRyaWJ1dGUgdmFsdWVzLlxuICAgICAgcmV0dXJuIHNlbGYuX3Bhbm5lckF0dHI7XG4gICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnb2JqZWN0Jykge1xuICAgICAgICBvID0gYXJnc1swXTtcblxuICAgICAgICAvLyBTZXQgdGhlIGdyb3UncyBwYW5uZXIgYXR0cmlidXRlIHZhbHVlcy5cbiAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBpZiAoIW8ucGFubmVyQXR0cikge1xuICAgICAgICAgICAgby5wYW5uZXJBdHRyID0ge1xuICAgICAgICAgICAgICBjb25lSW5uZXJBbmdsZTogby5jb25lSW5uZXJBbmdsZSxcbiAgICAgICAgICAgICAgY29uZU91dGVyQW5nbGU6IG8uY29uZU91dGVyQW5nbGUsXG4gICAgICAgICAgICAgIGNvbmVPdXRlckdhaW46IG8uY29uZU91dGVyR2FpbixcbiAgICAgICAgICAgICAgZGlzdGFuY2VNb2RlbDogby5kaXN0YW5jZU1vZGVsLFxuICAgICAgICAgICAgICBtYXhEaXN0YW5jZTogby5tYXhEaXN0YW5jZSxcbiAgICAgICAgICAgICAgcmVmRGlzdGFuY2U6IG8ucmVmRGlzdGFuY2UsXG4gICAgICAgICAgICAgIHJvbGxvZmZGYWN0b3I6IG8ucm9sbG9mZkZhY3RvcixcbiAgICAgICAgICAgICAgcGFubmluZ01vZGVsOiBvLnBhbm5pbmdNb2RlbFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWxmLl9wYW5uZXJBdHRyID0ge1xuICAgICAgICAgICAgY29uZUlubmVyQW5nbGU6IHR5cGVvZiBvLnBhbm5lckF0dHIuY29uZUlubmVyQW5nbGUgIT09ICd1bmRlZmluZWQnID8gby5wYW5uZXJBdHRyLmNvbmVJbm5lckFuZ2xlIDogc2VsZi5fY29uZUlubmVyQW5nbGUsXG4gICAgICAgICAgICBjb25lT3V0ZXJBbmdsZTogdHlwZW9mIG8ucGFubmVyQXR0ci5jb25lT3V0ZXJBbmdsZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLnBhbm5lckF0dHIuY29uZU91dGVyQW5nbGUgOiBzZWxmLl9jb25lT3V0ZXJBbmdsZSxcbiAgICAgICAgICAgIGNvbmVPdXRlckdhaW46IHR5cGVvZiBvLnBhbm5lckF0dHIuY29uZU91dGVyR2FpbiAhPT0gJ3VuZGVmaW5lZCcgPyBvLnBhbm5lckF0dHIuY29uZU91dGVyR2FpbiA6IHNlbGYuX2NvbmVPdXRlckdhaW4sXG4gICAgICAgICAgICBkaXN0YW5jZU1vZGVsOiB0eXBlb2Ygby5wYW5uZXJBdHRyLmRpc3RhbmNlTW9kZWwgIT09ICd1bmRlZmluZWQnID8gby5wYW5uZXJBdHRyLmRpc3RhbmNlTW9kZWwgOiBzZWxmLl9kaXN0YW5jZU1vZGVsLFxuICAgICAgICAgICAgbWF4RGlzdGFuY2U6IHR5cGVvZiBvLnBhbm5lckF0dHIubWF4RGlzdGFuY2UgIT09ICd1bmRlZmluZWQnID8gby5wYW5uZXJBdHRyLm1heERpc3RhbmNlIDogc2VsZi5fbWF4RGlzdGFuY2UsXG4gICAgICAgICAgICByZWZEaXN0YW5jZTogdHlwZW9mIG8ucGFubmVyQXR0ci5yZWZEaXN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLnBhbm5lckF0dHIucmVmRGlzdGFuY2UgOiBzZWxmLl9yZWZEaXN0YW5jZSxcbiAgICAgICAgICAgIHJvbGxvZmZGYWN0b3I6IHR5cGVvZiBvLnBhbm5lckF0dHIucm9sbG9mZkZhY3RvciAhPT0gJ3VuZGVmaW5lZCcgPyBvLnBhbm5lckF0dHIucm9sbG9mZkZhY3RvciA6IHNlbGYuX3JvbGxvZmZGYWN0b3IsXG4gICAgICAgICAgICBwYW5uaW5nTW9kZWw6IHR5cGVvZiBvLnBhbm5lckF0dHIucGFubmluZ01vZGVsICE9PSAndW5kZWZpbmVkJyA/IG8ucGFubmVyQXR0ci5wYW5uaW5nTW9kZWwgOiBzZWxmLl9wYW5uaW5nTW9kZWxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZXR1cm4gdGhpcyBzb3VuZCdzIHBhbm5lciBhdHRyaWJ1dGUgdmFsdWVzLlxuICAgICAgICBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChwYXJzZUludChhcmdzWzBdLCAxMCkpO1xuICAgICAgICByZXR1cm4gc291bmQgPyBzb3VuZC5fcGFubmVyQXR0ciA6IHNlbGYuX3Bhbm5lckF0dHI7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgbyA9IGFyZ3NbMF07XG4gICAgICBpZCA9IHBhcnNlSW50KGFyZ3NbMV0sIDEwKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIHZhbHVlcyBvZiB0aGUgc3BlY2lmaWVkIHNvdW5kcy5cbiAgICB2YXIgaWRzID0gc2VsZi5fZ2V0U291bmRJZHMoaWQpO1xuICAgIGZvciAodmFyIGk9MDsgaTxpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkc1tpXSk7XG5cbiAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICAvLyBNZXJnZSB0aGUgbmV3IHZhbHVlcyBpbnRvIHRoZSBzb3VuZC5cbiAgICAgICAgdmFyIHBhID0gc291bmQuX3Bhbm5lckF0dHI7XG4gICAgICAgIHBhID0ge1xuICAgICAgICAgIGNvbmVJbm5lckFuZ2xlOiB0eXBlb2Ygby5jb25lSW5uZXJBbmdsZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLmNvbmVJbm5lckFuZ2xlIDogcGEuY29uZUlubmVyQW5nbGUsXG4gICAgICAgICAgY29uZU91dGVyQW5nbGU6IHR5cGVvZiBvLmNvbmVPdXRlckFuZ2xlICE9PSAndW5kZWZpbmVkJyA/IG8uY29uZU91dGVyQW5nbGUgOiBwYS5jb25lT3V0ZXJBbmdsZSxcbiAgICAgICAgICBjb25lT3V0ZXJHYWluOiB0eXBlb2Ygby5jb25lT3V0ZXJHYWluICE9PSAndW5kZWZpbmVkJyA/IG8uY29uZU91dGVyR2FpbiA6IHBhLmNvbmVPdXRlckdhaW4sXG4gICAgICAgICAgZGlzdGFuY2VNb2RlbDogdHlwZW9mIG8uZGlzdGFuY2VNb2RlbCAhPT0gJ3VuZGVmaW5lZCcgPyBvLmRpc3RhbmNlTW9kZWwgOiBwYS5kaXN0YW5jZU1vZGVsLFxuICAgICAgICAgIG1heERpc3RhbmNlOiB0eXBlb2Ygby5tYXhEaXN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLm1heERpc3RhbmNlIDogcGEubWF4RGlzdGFuY2UsXG4gICAgICAgICAgcmVmRGlzdGFuY2U6IHR5cGVvZiBvLnJlZkRpc3RhbmNlICE9PSAndW5kZWZpbmVkJyA/IG8ucmVmRGlzdGFuY2UgOiBwYS5yZWZEaXN0YW5jZSxcbiAgICAgICAgICByb2xsb2ZmRmFjdG9yOiB0eXBlb2Ygby5yb2xsb2ZmRmFjdG9yICE9PSAndW5kZWZpbmVkJyA/IG8ucm9sbG9mZkZhY3RvciA6IHBhLnJvbGxvZmZGYWN0b3IsXG4gICAgICAgICAgcGFubmluZ01vZGVsOiB0eXBlb2Ygby5wYW5uaW5nTW9kZWwgIT09ICd1bmRlZmluZWQnID8gby5wYW5uaW5nTW9kZWwgOiBwYS5wYW5uaW5nTW9kZWxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBVcGRhdGUgdGhlIHBhbm5lciB2YWx1ZXMgb3IgY3JlYXRlIGEgbmV3IHBhbm5lciBpZiBub25lIGV4aXN0cy5cbiAgICAgICAgdmFyIHBhbm5lciA9IHNvdW5kLl9wYW5uZXI7XG4gICAgICAgIGlmIChwYW5uZXIpIHtcbiAgICAgICAgICBwYW5uZXIuY29uZUlubmVyQW5nbGUgPSBwYS5jb25lSW5uZXJBbmdsZTtcbiAgICAgICAgICBwYW5uZXIuY29uZU91dGVyQW5nbGUgPSBwYS5jb25lT3V0ZXJBbmdsZTtcbiAgICAgICAgICBwYW5uZXIuY29uZU91dGVyR2FpbiA9IHBhLmNvbmVPdXRlckdhaW47XG4gICAgICAgICAgcGFubmVyLmRpc3RhbmNlTW9kZWwgPSBwYS5kaXN0YW5jZU1vZGVsO1xuICAgICAgICAgIHBhbm5lci5tYXhEaXN0YW5jZSA9IHBhLm1heERpc3RhbmNlO1xuICAgICAgICAgIHBhbm5lci5yZWZEaXN0YW5jZSA9IHBhLnJlZkRpc3RhbmNlO1xuICAgICAgICAgIHBhbm5lci5yb2xsb2ZmRmFjdG9yID0gcGEucm9sbG9mZkZhY3RvcjtcbiAgICAgICAgICBwYW5uZXIucGFubmluZ01vZGVsID0gcGEucGFubmluZ01vZGVsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgcG9zaXRpb24gdG8gc2V0dXAgdGhlIG5vZGUgd2l0aC5cbiAgICAgICAgICBpZiAoIXNvdW5kLl9wb3MpIHtcbiAgICAgICAgICAgIHNvdW5kLl9wb3MgPSBzZWxmLl9wb3MgfHwgWzAsIDAsIC0wLjVdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwYW5uZXIgbm9kZS5cbiAgICAgICAgICBzZXR1cFBhbm5lcihzb3VuZCwgJ3NwYXRpYWwnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIC8qKiBTaW5nbGUgU291bmQgTWV0aG9kcyAqKi9cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAvKipcbiAgICogQWRkIG5ldyBwcm9wZXJ0aWVzIHRvIHRoZSBjb3JlIFNvdW5kIGluaXQuXG4gICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBfc3VwZXIgQ29yZSBTb3VuZCBpbml0IG1ldGhvZC5cbiAgICogQHJldHVybiB7U291bmR9XG4gICAqL1xuICBTb3VuZC5wcm90b3R5cGUuaW5pdCA9IChmdW5jdGlvbihfc3VwZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgcGFyZW50ID0gc2VsZi5fcGFyZW50O1xuXG4gICAgICAvLyBTZXR1cCB1c2VyLWRlZmluZWQgZGVmYXVsdCBwcm9wZXJ0aWVzLlxuICAgICAgc2VsZi5fb3JpZW50YXRpb24gPSBwYXJlbnQuX29yaWVudGF0aW9uO1xuICAgICAgc2VsZi5fc3RlcmVvID0gcGFyZW50Ll9zdGVyZW87XG4gICAgICBzZWxmLl9wb3MgPSBwYXJlbnQuX3BvcztcbiAgICAgIHNlbGYuX3Bhbm5lckF0dHIgPSBwYXJlbnQuX3Bhbm5lckF0dHI7XG5cbiAgICAgIC8vIENvbXBsZXRlIGluaXRpbGl6YXRpb24gd2l0aCBob3dsZXIuanMgY29yZSBTb3VuZCdzIGluaXQgZnVuY3Rpb24uXG4gICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcblxuICAgICAgLy8gSWYgYSBzdGVyZW8gb3IgcG9zaXRpb24gd2FzIHNwZWNpZmllZCwgc2V0IGl0IHVwLlxuICAgICAgaWYgKHNlbGYuX3N0ZXJlbykge1xuICAgICAgICBwYXJlbnQuc3RlcmVvKHNlbGYuX3N0ZXJlbyk7XG4gICAgICB9IGVsc2UgaWYgKHNlbGYuX3Bvcykge1xuICAgICAgICBwYXJlbnQucG9zKHNlbGYuX3Bvc1swXSwgc2VsZi5fcG9zWzFdLCBzZWxmLl9wb3NbMl0sIHNlbGYuX2lkKTtcbiAgICAgIH1cbiAgICB9O1xuICB9KShTb3VuZC5wcm90b3R5cGUuaW5pdCk7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBTb3VuZC5yZXNldCBtZXRob2QgdG8gY2xlYW4gdXAgcHJvcGVydGllcyBmcm9tIHRoZSBzcGF0aWFsIHBsdWdpbi5cbiAgICogQHBhcmFtICB7RnVuY3Rpb259IF9zdXBlciBTb3VuZCByZXNldCBtZXRob2QuXG4gICAqIEByZXR1cm4ge1NvdW5kfVxuICAgKi9cbiAgU291bmQucHJvdG90eXBlLnJlc2V0ID0gKGZ1bmN0aW9uKF9zdXBlcikge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBwYXJlbnQgPSBzZWxmLl9wYXJlbnQ7XG5cbiAgICAgIC8vIFJlc2V0IGFsbCBzcGF0aWFsIHBsdWdpbiBwcm9wZXJ0aWVzIG9uIHRoaXMgc291bmQuXG4gICAgICBzZWxmLl9vcmllbnRhdGlvbiA9IHBhcmVudC5fb3JpZW50YXRpb247XG4gICAgICBzZWxmLl9zdGVyZW8gPSBwYXJlbnQuX3N0ZXJlbztcbiAgICAgIHNlbGYuX3BvcyA9IHBhcmVudC5fcG9zO1xuICAgICAgc2VsZi5fcGFubmVyQXR0ciA9IHBhcmVudC5fcGFubmVyQXR0cjtcblxuICAgICAgLy8gSWYgYSBzdGVyZW8gb3IgcG9zaXRpb24gd2FzIHNwZWNpZmllZCwgc2V0IGl0IHVwLlxuICAgICAgaWYgKHNlbGYuX3N0ZXJlbykge1xuICAgICAgICBwYXJlbnQuc3RlcmVvKHNlbGYuX3N0ZXJlbyk7XG4gICAgICB9IGVsc2UgaWYgKHNlbGYuX3Bvcykge1xuICAgICAgICBwYXJlbnQucG9zKHNlbGYuX3Bvc1swXSwgc2VsZi5fcG9zWzFdLCBzZWxmLl9wb3NbMl0sIHNlbGYuX2lkKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZi5fcGFubmVyKSB7XG4gICAgICAgIC8vIERpc2Nvbm5lY3QgdGhlIHBhbm5lci5cbiAgICAgICAgc2VsZi5fcGFubmVyLmRpc2Nvbm5lY3QoMCk7XG4gICAgICAgIHNlbGYuX3Bhbm5lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgcGFyZW50Ll9yZWZyZXNoQnVmZmVyKHNlbGYpO1xuICAgICAgfVxuXG4gICAgICAvLyBDb21wbGV0ZSByZXNldHRpbmcgb2YgdGhlIHNvdW5kLlxuICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgIH07XG4gIH0pKFNvdW5kLnByb3RvdHlwZS5yZXNldCk7XG5cbiAgLyoqIEhlbHBlciBNZXRob2RzICoqL1xuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgcGFubmVyIG5vZGUgYW5kIHNhdmUgaXQgb24gdGhlIHNvdW5kLlxuICAgKiBAcGFyYW0gIHtTb3VuZH0gc291bmQgU3BlY2lmaWMgc291bmQgdG8gc2V0dXAgcGFubmluZyBvbi5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVHlwZSBvZiBwYW5uZXIgdG8gY3JlYXRlOiAnc3RlcmVvJyBvciAnc3BhdGlhbCcuXG4gICAqL1xuICB2YXIgc2V0dXBQYW5uZXIgPSBmdW5jdGlvbihzb3VuZCwgdHlwZSkge1xuICAgIHR5cGUgPSB0eXBlIHx8ICdzcGF0aWFsJztcblxuICAgIC8vIENyZWF0ZSB0aGUgbmV3IHBhbm5lciBub2RlLlxuICAgIGlmICh0eXBlID09PSAnc3BhdGlhbCcpIHtcbiAgICAgIHNvdW5kLl9wYW5uZXIgPSBIb3dsZXIuY3R4LmNyZWF0ZVBhbm5lcigpO1xuICAgICAgc291bmQuX3Bhbm5lci5jb25lSW5uZXJBbmdsZSA9IHNvdW5kLl9wYW5uZXJBdHRyLmNvbmVJbm5lckFuZ2xlO1xuICAgICAgc291bmQuX3Bhbm5lci5jb25lT3V0ZXJBbmdsZSA9IHNvdW5kLl9wYW5uZXJBdHRyLmNvbmVPdXRlckFuZ2xlO1xuICAgICAgc291bmQuX3Bhbm5lci5jb25lT3V0ZXJHYWluID0gc291bmQuX3Bhbm5lckF0dHIuY29uZU91dGVyR2FpbjtcbiAgICAgIHNvdW5kLl9wYW5uZXIuZGlzdGFuY2VNb2RlbCA9IHNvdW5kLl9wYW5uZXJBdHRyLmRpc3RhbmNlTW9kZWw7XG4gICAgICBzb3VuZC5fcGFubmVyLm1heERpc3RhbmNlID0gc291bmQuX3Bhbm5lckF0dHIubWF4RGlzdGFuY2U7XG4gICAgICBzb3VuZC5fcGFubmVyLnJlZkRpc3RhbmNlID0gc291bmQuX3Bhbm5lckF0dHIucmVmRGlzdGFuY2U7XG4gICAgICBzb3VuZC5fcGFubmVyLnJvbGxvZmZGYWN0b3IgPSBzb3VuZC5fcGFubmVyQXR0ci5yb2xsb2ZmRmFjdG9yO1xuICAgICAgc291bmQuX3Bhbm5lci5wYW5uaW5nTW9kZWwgPSBzb3VuZC5fcGFubmVyQXR0ci5wYW5uaW5nTW9kZWw7XG5cbiAgICAgIGlmICh0eXBlb2Ygc291bmQuX3Bhbm5lci5wb3NpdGlvblggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNvdW5kLl9wYW5uZXIucG9zaXRpb25YLnNldFZhbHVlQXRUaW1lKHNvdW5kLl9wb3NbMF0sIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWS5zZXRWYWx1ZUF0VGltZShzb3VuZC5fcG9zWzFdLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgc291bmQuX3Bhbm5lci5wb3NpdGlvblouc2V0VmFsdWVBdFRpbWUoc291bmQuX3Bvc1syXSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzb3VuZC5fcGFubmVyLnNldFBvc2l0aW9uKHNvdW5kLl9wb3NbMF0sIHNvdW5kLl9wb3NbMV0sIHNvdW5kLl9wb3NbMl0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHNvdW5kLl9wYW5uZXIub3JpZW50YXRpb25YICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBzb3VuZC5fcGFubmVyLm9yaWVudGF0aW9uWC5zZXRWYWx1ZUF0VGltZShzb3VuZC5fb3JpZW50YXRpb25bMF0sIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICBzb3VuZC5fcGFubmVyLm9yaWVudGF0aW9uWS5zZXRWYWx1ZUF0VGltZShzb3VuZC5fb3JpZW50YXRpb25bMV0sIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICBzb3VuZC5fcGFubmVyLm9yaWVudGF0aW9uWi5zZXRWYWx1ZUF0VGltZShzb3VuZC5fb3JpZW50YXRpb25bMl0sIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc291bmQuX3Bhbm5lci5zZXRPcmllbnRhdGlvbihzb3VuZC5fb3JpZW50YXRpb25bMF0sIHNvdW5kLl9vcmllbnRhdGlvblsxXSwgc291bmQuX29yaWVudGF0aW9uWzJdKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc291bmQuX3Bhbm5lciA9IEhvd2xlci5jdHguY3JlYXRlU3RlcmVvUGFubmVyKCk7XG4gICAgICBzb3VuZC5fcGFubmVyLnBhbi5zZXRWYWx1ZUF0VGltZShzb3VuZC5fc3RlcmVvLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICB9XG5cbiAgICBzb3VuZC5fcGFubmVyLmNvbm5lY3Qoc291bmQuX25vZGUpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBjb25uZWN0aW9ucy5cbiAgICBpZiAoIXNvdW5kLl9wYXVzZWQpIHtcbiAgICAgIHNvdW5kLl9wYXJlbnQucGF1c2Uoc291bmQuX2lkLCB0cnVlKS5wbGF5KHNvdW5kLl9pZCwgdHJ1ZSk7XG4gICAgfVxuICB9O1xufSkoKTtcbiIsIi8qISBpZWVlNzU0LiBCU0QtMy1DbGF1c2UgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG5leHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IChlICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IChtICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKCh2YWx1ZSAqIGMpIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxyXG50aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZVxyXG5MaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG5cclxuVEhJUyBDT0RFIElTIFBST1ZJREVEIE9OIEFOICpBUyBJUyogQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxyXG5LSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVEXHJcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXHJcbk1FUkNIQU5UQUJMSVRZIE9SIE5PTi1JTkZSSU5HRU1FTlQuXHJcblxyXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcclxuYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XG5cbnZhciBFdmVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIEV2ZW50KHR5cGUsIHRhcmdldCkge1xyXG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gRXZlbnQ7XHJcbn0oKSk7XHJcbnZhciBFcnJvckV2ZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xyXG4gICAgX19leHRlbmRzKEVycm9yRXZlbnQsIF9zdXBlcik7XHJcbiAgICBmdW5jdGlvbiBFcnJvckV2ZW50KGVycm9yLCB0YXJnZXQpIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCAnZXJyb3InLCB0YXJnZXQpIHx8IHRoaXM7XHJcbiAgICAgICAgX3RoaXMubWVzc2FnZSA9IGVycm9yLm1lc3NhZ2U7XHJcbiAgICAgICAgX3RoaXMuZXJyb3IgPSBlcnJvcjtcclxuICAgICAgICByZXR1cm4gX3RoaXM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gRXJyb3JFdmVudDtcclxufShFdmVudCkpO1xyXG52YXIgQ2xvc2VFdmVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcclxuICAgIF9fZXh0ZW5kcyhDbG9zZUV2ZW50LCBfc3VwZXIpO1xyXG4gICAgZnVuY3Rpb24gQ2xvc2VFdmVudChjb2RlLCByZWFzb24sIHRhcmdldCkge1xyXG4gICAgICAgIGlmIChjb2RlID09PSB2b2lkIDApIHsgY29kZSA9IDEwMDA7IH1cclxuICAgICAgICBpZiAocmVhc29uID09PSB2b2lkIDApIHsgcmVhc29uID0gJyc7IH1cclxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCAnY2xvc2UnLCB0YXJnZXQpIHx8IHRoaXM7XHJcbiAgICAgICAgX3RoaXMud2FzQ2xlYW4gPSB0cnVlO1xyXG4gICAgICAgIF90aGlzLmNvZGUgPSBjb2RlO1xyXG4gICAgICAgIF90aGlzLnJlYXNvbiA9IHJlYXNvbjtcclxuICAgICAgICByZXR1cm4gX3RoaXM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gQ2xvc2VFdmVudDtcclxufShFdmVudCkpO1xuXG4vKiFcclxuICogUmVjb25uZWN0aW5nIFdlYlNvY2tldFxyXG4gKiBieSBQZWRybyBMYWRhcmlhIDxwZWRyby5sYWRhcmlhQGdtYWlsLmNvbT5cclxuICogaHR0cHM6Ly9naXRodWIuY29tL3BsYWRhcmlhL3JlY29ubmVjdGluZy13ZWJzb2NrZXRcclxuICogTGljZW5zZSBNSVRcclxuICovXHJcbnZhciBnZXRHbG9iYWxXZWJTb2NrZXQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBpZiAodHlwZW9mIFdlYlNvY2tldCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgcmV0dXJuIFdlYlNvY2tldDtcclxuICAgIH1cclxufTtcclxuLyoqXHJcbiAqIFJldHVybnMgdHJ1ZSBpZiBnaXZlbiBhcmd1bWVudCBsb29rcyBsaWtlIGEgV2ViU29ja2V0IGNsYXNzXHJcbiAqL1xyXG52YXIgaXNXZWJTb2NrZXQgPSBmdW5jdGlvbiAodykgeyByZXR1cm4gdHlwZW9mIHcgIT09ICd1bmRlZmluZWQnICYmICEhdyAmJiB3LkNMT1NJTkcgPT09IDI7IH07XHJcbnZhciBERUZBVUxUID0ge1xyXG4gICAgbWF4UmVjb25uZWN0aW9uRGVsYXk6IDEwMDAwLFxyXG4gICAgbWluUmVjb25uZWN0aW9uRGVsYXk6IDEwMDAgKyBNYXRoLnJhbmRvbSgpICogNDAwMCxcclxuICAgIG1pblVwdGltZTogNTAwMCxcclxuICAgIHJlY29ubmVjdGlvbkRlbGF5R3Jvd0ZhY3RvcjogMS4zLFxyXG4gICAgY29ubmVjdGlvblRpbWVvdXQ6IDQwMDAsXHJcbiAgICBtYXhSZXRyaWVzOiBJbmZpbml0eSxcclxuICAgIG1heEVucXVldWVkTWVzc2FnZXM6IEluZmluaXR5LFxyXG4gICAgc3RhcnRDbG9zZWQ6IGZhbHNlLFxyXG4gICAgZGVidWc6IGZhbHNlLFxyXG59O1xyXG52YXIgUmVjb25uZWN0aW5nV2ViU29ja2V0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gUmVjb25uZWN0aW5nV2ViU29ja2V0KHVybCwgcHJvdG9jb2xzLCBvcHRpb25zKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxyXG4gICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IHtcclxuICAgICAgICAgICAgZXJyb3I6IFtdLFxyXG4gICAgICAgICAgICBtZXNzYWdlOiBbXSxcclxuICAgICAgICAgICAgb3BlbjogW10sXHJcbiAgICAgICAgICAgIGNsb3NlOiBbXSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3JldHJ5Q291bnQgPSAtMTtcclxuICAgICAgICB0aGlzLl9zaG91bGRSZWNvbm5lY3QgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2Nvbm5lY3RMb2NrID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fYmluYXJ5VHlwZSA9ICdibG9iJztcclxuICAgICAgICB0aGlzLl9jbG9zZUNhbGxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX21lc3NhZ2VRdWV1ZSA9IFtdO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGV2ZW50IGxpc3RlbmVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbidzIHJlYWR5U3RhdGUgY2hhbmdlcyB0byBDTE9TRURcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9uY2xvc2UgPSBudWxsO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGV2ZW50IGxpc3RlbmVyIHRvIGJlIGNhbGxlZCB3aGVuIGFuIGVycm9yIG9jY3Vyc1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub25lcnJvciA9IG51bGw7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gZXZlbnQgbGlzdGVuZXIgdG8gYmUgY2FsbGVkIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlclxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub25tZXNzYWdlID0gbnVsbDtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBldmVudCBsaXN0ZW5lciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24ncyByZWFkeVN0YXRlIGNoYW5nZXMgdG8gT1BFTjtcclxuICAgICAgICAgKiB0aGlzIGluZGljYXRlcyB0aGF0IHRoZSBjb25uZWN0aW9uIGlzIHJlYWR5IHRvIHNlbmQgYW5kIHJlY2VpdmUgZGF0YVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub25vcGVuID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9oYW5kbGVPcGVuID0gZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIF90aGlzLl9kZWJ1Zygnb3BlbiBldmVudCcpO1xyXG4gICAgICAgICAgICB2YXIgX2EgPSBfdGhpcy5fb3B0aW9ucy5taW5VcHRpbWUsIG1pblVwdGltZSA9IF9hID09PSB2b2lkIDAgPyBERUZBVUxULm1pblVwdGltZSA6IF9hO1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoX3RoaXMuX2Nvbm5lY3RUaW1lb3V0KTtcclxuICAgICAgICAgICAgX3RoaXMuX3VwdGltZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLl9hY2NlcHRPcGVuKCk7IH0sIG1pblVwdGltZSk7XHJcbiAgICAgICAgICAgIF90aGlzLl93cy5iaW5hcnlUeXBlID0gX3RoaXMuX2JpbmFyeVR5cGU7XHJcbiAgICAgICAgICAgIC8vIHNlbmQgZW5xdWV1ZWQgbWVzc2FnZXMgKG1lc3NhZ2VzIHNlbnQgYmVmb3JlIHdlYnNvY2tldCBvcGVuIGV2ZW50KVxyXG4gICAgICAgICAgICBfdGhpcy5fbWVzc2FnZVF1ZXVlLmZvckVhY2goZnVuY3Rpb24gKG1lc3NhZ2UpIHsgcmV0dXJuIF90aGlzLl93cy5zZW5kKG1lc3NhZ2UpOyB9KTtcclxuICAgICAgICAgICAgX3RoaXMuX21lc3NhZ2VRdWV1ZSA9IFtdO1xyXG4gICAgICAgICAgICBpZiAoX3RoaXMub25vcGVuKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5vbm9wZW4oZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF90aGlzLl9saXN0ZW5lcnMub3Blbi5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikgeyByZXR1cm4gX3RoaXMuX2NhbGxFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7IH0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5faGFuZGxlTWVzc2FnZSA9IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICBfdGhpcy5fZGVidWcoJ21lc3NhZ2UgZXZlbnQnKTtcclxuICAgICAgICAgICAgaWYgKF90aGlzLm9ubWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMub25tZXNzYWdlKGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfdGhpcy5fbGlzdGVuZXJzLm1lc3NhZ2UuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIF90aGlzLl9jYWxsRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpOyB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX2hhbmRsZUVycm9yID0gZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIF90aGlzLl9kZWJ1ZygnZXJyb3IgZXZlbnQnLCBldmVudC5tZXNzYWdlKTtcclxuICAgICAgICAgICAgX3RoaXMuX2Rpc2Nvbm5lY3QodW5kZWZpbmVkLCBldmVudC5tZXNzYWdlID09PSAnVElNRU9VVCcgPyAndGltZW91dCcgOiB1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICBpZiAoX3RoaXMub25lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMub25lcnJvcihldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgX3RoaXMuX2RlYnVnKCdleGVjIGVycm9yIGxpc3RlbmVycycpO1xyXG4gICAgICAgICAgICBfdGhpcy5fbGlzdGVuZXJzLmVycm9yLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7IHJldHVybiBfdGhpcy5fY2FsbEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTsgfSk7XHJcbiAgICAgICAgICAgIF90aGlzLl9jb25uZWN0KCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9oYW5kbGVDbG9zZSA9IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICBfdGhpcy5fZGVidWcoJ2Nsb3NlIGV2ZW50Jyk7XHJcbiAgICAgICAgICAgIF90aGlzLl9jbGVhclRpbWVvdXRzKCk7XHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5fc2hvdWxkUmVjb25uZWN0KSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fY29ubmVjdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5vbmNsb3NlKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5vbmNsb3NlKGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfdGhpcy5fbGlzdGVuZXJzLmNsb3NlLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7IHJldHVybiBfdGhpcy5fY2FsbEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTsgfSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl91cmwgPSB1cmw7XHJcbiAgICAgICAgdGhpcy5fcHJvdG9jb2xzID0gcHJvdG9jb2xzO1xyXG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLnN0YXJ0Q2xvc2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Nob3VsZFJlY29ubmVjdCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jb25uZWN0KCk7XHJcbiAgICB9XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LCBcIkNPTk5FQ1RJTkdcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQsIFwiT1BFTlwiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldCwgXCJDTE9TSU5HXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDI7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LCBcIkNMT1NFRFwiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAzO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUsIFwiQ09OTkVDVElOR1wiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZWNvbm5lY3RpbmdXZWJTb2NrZXQuQ09OTkVDVElORztcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLCBcIk9QRU5cIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVjb25uZWN0aW5nV2ViU29ja2V0Lk9QRU47XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZSwgXCJDTE9TSU5HXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlY29ubmVjdGluZ1dlYlNvY2tldC5DTE9TSU5HO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUsIFwiQ0xPU0VEXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlY29ubmVjdGluZ1dlYlNvY2tldC5DTE9TRUQ7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZSwgXCJiaW5hcnlUeXBlXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dzID8gdGhpcy5fd3MuYmluYXJ5VHlwZSA6IHRoaXMuX2JpbmFyeVR5cGU7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9iaW5hcnlUeXBlID0gdmFsdWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl93cykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fd3MuYmluYXJ5VHlwZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZSwgXCJyZXRyeUNvdW50XCIsIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb3IgY29ubmVjdGlvbiByZXRyaWVzXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLl9yZXRyeUNvdW50LCAwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLCBcImJ1ZmZlcmVkQW1vdW50XCIsIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgdGhhdCBoYXZlIGJlZW4gcXVldWVkIHVzaW5nIGNhbGxzIHRvIHNlbmQoKSBidXQgbm90IHlldFxyXG4gICAgICAgICAqIHRyYW5zbWl0dGVkIHRvIHRoZSBuZXR3b3JrLiBUaGlzIHZhbHVlIHJlc2V0cyB0byB6ZXJvIG9uY2UgYWxsIHF1ZXVlZCBkYXRhIGhhcyBiZWVuIHNlbnQuXHJcbiAgICAgICAgICogVGhpcyB2YWx1ZSBkb2VzIG5vdCByZXNldCB0byB6ZXJvIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkOyBpZiB5b3Uga2VlcCBjYWxsaW5nIHNlbmQoKSxcclxuICAgICAgICAgKiB0aGlzIHdpbGwgY29udGludWUgdG8gY2xpbWIuIFJlYWQgb25seVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgYnl0ZXMgPSB0aGlzLl9tZXNzYWdlUXVldWUucmVkdWNlKGZ1bmN0aW9uIChhY2MsIG1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICBhY2MgKz0gbWVzc2FnZS5sZW5ndGg7IC8vIG5vdCBieXRlIHNpemVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBCbG9iKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWNjICs9IG1lc3NhZ2Uuc2l6ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjYyArPSBtZXNzYWdlLmJ5dGVMZW5ndGg7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICAgICAgICB9LCAwKTtcclxuICAgICAgICAgICAgcmV0dXJuIGJ5dGVzICsgKHRoaXMuX3dzID8gdGhpcy5fd3MuYnVmZmVyZWRBbW91bnQgOiAwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLCBcImV4dGVuc2lvbnNcIiwge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBleHRlbnNpb25zIHNlbGVjdGVkIGJ5IHRoZSBzZXJ2ZXIuIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgdGhlIGVtcHR5IHN0cmluZyBvciBhIGxpc3Qgb2ZcclxuICAgICAgICAgKiBleHRlbnNpb25zIGFzIG5lZ290aWF0ZWQgYnkgdGhlIGNvbm5lY3Rpb25cclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dzID8gdGhpcy5fd3MuZXh0ZW5zaW9ucyA6ICcnO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUsIFwicHJvdG9jb2xcIiwge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgc3RyaW5nIGluZGljYXRpbmcgdGhlIG5hbWUgb2YgdGhlIHN1Yi1wcm90b2NvbCB0aGUgc2VydmVyIHNlbGVjdGVkO1xyXG4gICAgICAgICAqIHRoaXMgd2lsbCBiZSBvbmUgb2YgdGhlIHN0cmluZ3Mgc3BlY2lmaWVkIGluIHRoZSBwcm90b2NvbHMgcGFyYW1ldGVyIHdoZW4gY3JlYXRpbmcgdGhlXHJcbiAgICAgICAgICogV2ViU29ja2V0IG9iamVjdFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd3MgPyB0aGlzLl93cy5wcm90b2NvbCA6ICcnO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUsIFwicmVhZHlTdGF0ZVwiLCB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbm5lY3Rpb247IHRoaXMgaXMgb25lIG9mIHRoZSBSZWFkeSBzdGF0ZSBjb25zdGFudHNcclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3dzKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd3MucmVhZHlTdGF0ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9ucy5zdGFydENsb3NlZFxyXG4gICAgICAgICAgICAgICAgPyBSZWNvbm5lY3RpbmdXZWJTb2NrZXQuQ0xPU0VEXHJcbiAgICAgICAgICAgICAgICA6IFJlY29ubmVjdGluZ1dlYlNvY2tldC5DT05ORUNUSU5HO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUsIFwidXJsXCIsIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgVVJMIGFzIHJlc29sdmVkIGJ5IHRoZSBjb25zdHJ1Y3RvclxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd3MgPyB0aGlzLl93cy51cmwgOiAnJztcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIC8qKlxyXG4gICAgICogQ2xvc2VzIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBvciBjb25uZWN0aW9uIGF0dGVtcHQsIGlmIGFueS4gSWYgdGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeVxyXG4gICAgICogQ0xPU0VELCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmdcclxuICAgICAqL1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uIChjb2RlLCByZWFzb24pIHtcclxuICAgICAgICBpZiAoY29kZSA9PT0gdm9pZCAwKSB7IGNvZGUgPSAxMDAwOyB9XHJcbiAgICAgICAgdGhpcy5fY2xvc2VDYWxsZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX3Nob3VsZFJlY29ubmVjdCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2NsZWFyVGltZW91dHMoKTtcclxuICAgICAgICBpZiAoIXRoaXMuX3dzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKCdjbG9zZSBlbnF1ZXVlZDogbm8gd3MgaW5zdGFuY2UnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fd3MucmVhZHlTdGF0ZSA9PT0gdGhpcy5DTE9TRUQpIHtcclxuICAgICAgICAgICAgdGhpcy5fZGVidWcoJ2Nsb3NlOiBhbHJlYWR5IGNsb3NlZCcpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3dzLmNsb3NlKGNvZGUsIHJlYXNvbik7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBDbG9zZXMgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIG9yIGNvbm5lY3Rpb24gYXR0ZW1wdCBhbmQgY29ubmVjdHMgYWdhaW4uXHJcbiAgICAgKiBSZXNldHMgcmV0cnkgY291bnRlcjtcclxuICAgICAqL1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5yZWNvbm5lY3QgPSBmdW5jdGlvbiAoY29kZSwgcmVhc29uKSB7XHJcbiAgICAgICAgdGhpcy5fc2hvdWxkUmVjb25uZWN0ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9jbG9zZUNhbGxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3JldHJ5Q291bnQgPSAtMTtcclxuICAgICAgICBpZiAoIXRoaXMuX3dzIHx8IHRoaXMuX3dzLnJlYWR5U3RhdGUgPT09IHRoaXMuQ0xPU0VEKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Rpc2Nvbm5lY3QoY29kZSwgcmVhc29uKTtcclxuICAgICAgICAgICAgdGhpcy5fY29ubmVjdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIEVucXVldWUgc3BlY2lmaWVkIGRhdGEgdG8gYmUgdHJhbnNtaXR0ZWQgdG8gdGhlIHNlcnZlciBvdmVyIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvblxyXG4gICAgICovXHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgIGlmICh0aGlzLl93cyAmJiB0aGlzLl93cy5yZWFkeVN0YXRlID09PSB0aGlzLk9QRU4pIHtcclxuICAgICAgICAgICAgdGhpcy5fZGVidWcoJ3NlbmQnLCBkYXRhKTtcclxuICAgICAgICAgICAgdGhpcy5fd3Muc2VuZChkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBfYSA9IHRoaXMuX29wdGlvbnMubWF4RW5xdWV1ZWRNZXNzYWdlcywgbWF4RW5xdWV1ZWRNZXNzYWdlcyA9IF9hID09PSB2b2lkIDAgPyBERUZBVUxULm1heEVucXVldWVkTWVzc2FnZXMgOiBfYTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX21lc3NhZ2VRdWV1ZS5sZW5ndGggPCBtYXhFbnF1ZXVlZE1lc3NhZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWJ1ZygnZW5xdWV1ZScsIGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWVzc2FnZVF1ZXVlLnB1c2goZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZWdpc3RlciBhbiBldmVudCBoYW5kbGVyIG9mIGEgc3BlY2lmaWMgZXZlbnQgdHlwZVxyXG4gICAgICovXHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAodHlwZSwgbGlzdGVuZXIpIHtcclxuICAgICAgICBpZiAodGhpcy5fbGlzdGVuZXJzW3R5cGVdKSB7XHJcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzW3R5cGVdLnB1c2gobGlzdGVuZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLmRpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICB2YXIgZV8xLCBfYTtcclxuICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzW2V2ZW50LnR5cGVdO1xyXG4gICAgICAgIGlmIChsaXN0ZW5lcnMpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGxpc3RlbmVyc18xID0gX192YWx1ZXMobGlzdGVuZXJzKSwgbGlzdGVuZXJzXzFfMSA9IGxpc3RlbmVyc18xLm5leHQoKTsgIWxpc3RlbmVyc18xXzEuZG9uZTsgbGlzdGVuZXJzXzFfMSA9IGxpc3RlbmVyc18xLm5leHQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsaXN0ZW5lciA9IGxpc3RlbmVyc18xXzEudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxyXG4gICAgICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyc18xXzEgJiYgIWxpc3RlbmVyc18xXzEuZG9uZSAmJiAoX2EgPSBsaXN0ZW5lcnNfMS5yZXR1cm4pKSBfYS5jYWxsKGxpc3RlbmVyc18xKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXJcclxuICAgICAqL1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHR5cGUsIGxpc3RlbmVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2xpc3RlbmVyc1t0eXBlXSkge1xyXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVyc1t0eXBlXSA9IHRoaXMuX2xpc3RlbmVyc1t0eXBlXS5maWx0ZXIoZnVuY3Rpb24gKGwpIHsgcmV0dXJuIGwgIT09IGxpc3RlbmVyOyB9KTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5fZGVidWcgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLmRlYnVnKSB7XHJcbiAgICAgICAgICAgIC8vIG5vdCB1c2luZyBzcHJlYWQgYmVjYXVzZSBjb21waWxlZCB2ZXJzaW9uIHVzZXMgU3ltYm9sc1xyXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcclxuICAgICAgICAgICAgY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgX19zcHJlYWQoWydSV1M+J10sIGFyZ3MpKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5fZ2V0TmV4dERlbGF5ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBfYSA9IHRoaXMuX29wdGlvbnMsIF9iID0gX2EucmVjb25uZWN0aW9uRGVsYXlHcm93RmFjdG9yLCByZWNvbm5lY3Rpb25EZWxheUdyb3dGYWN0b3IgPSBfYiA9PT0gdm9pZCAwID8gREVGQVVMVC5yZWNvbm5lY3Rpb25EZWxheUdyb3dGYWN0b3IgOiBfYiwgX2MgPSBfYS5taW5SZWNvbm5lY3Rpb25EZWxheSwgbWluUmVjb25uZWN0aW9uRGVsYXkgPSBfYyA9PT0gdm9pZCAwID8gREVGQVVMVC5taW5SZWNvbm5lY3Rpb25EZWxheSA6IF9jLCBfZCA9IF9hLm1heFJlY29ubmVjdGlvbkRlbGF5LCBtYXhSZWNvbm5lY3Rpb25EZWxheSA9IF9kID09PSB2b2lkIDAgPyBERUZBVUxULm1heFJlY29ubmVjdGlvbkRlbGF5IDogX2Q7XHJcbiAgICAgICAgdmFyIGRlbGF5ID0gMDtcclxuICAgICAgICBpZiAodGhpcy5fcmV0cnlDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgZGVsYXkgPVxyXG4gICAgICAgICAgICAgICAgbWluUmVjb25uZWN0aW9uRGVsYXkgKiBNYXRoLnBvdyhyZWNvbm5lY3Rpb25EZWxheUdyb3dGYWN0b3IsIHRoaXMuX3JldHJ5Q291bnQgLSAxKTtcclxuICAgICAgICAgICAgaWYgKGRlbGF5ID4gbWF4UmVjb25uZWN0aW9uRGVsYXkpIHtcclxuICAgICAgICAgICAgICAgIGRlbGF5ID0gbWF4UmVjb25uZWN0aW9uRGVsYXk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZGVidWcoJ25leHQgZGVsYXknLCBkZWxheSk7XHJcbiAgICAgICAgcmV0dXJuIGRlbGF5O1xyXG4gICAgfTtcclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuX3dhaXQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBfdGhpcy5fZ2V0TmV4dERlbGF5KCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuX2dldE5leHRVcmwgPSBmdW5jdGlvbiAodXJsUHJvdmlkZXIpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHVybFByb3ZpZGVyID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVybFByb3ZpZGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiB1cmxQcm92aWRlciA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB2YXIgdXJsID0gdXJsUHJvdmlkZXIoKTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVybCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCEhdXJsLnRoZW4pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1cmw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0ludmFsaWQgVVJMJyk7XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5fY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGlmICh0aGlzLl9jb25uZWN0TG9jayB8fCAhdGhpcy5fc2hvdWxkUmVjb25uZWN0KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY29ubmVjdExvY2sgPSB0cnVlO1xyXG4gICAgICAgIHZhciBfYSA9IHRoaXMuX29wdGlvbnMsIF9iID0gX2EubWF4UmV0cmllcywgbWF4UmV0cmllcyA9IF9iID09PSB2b2lkIDAgPyBERUZBVUxULm1heFJldHJpZXMgOiBfYiwgX2MgPSBfYS5jb25uZWN0aW9uVGltZW91dCwgY29ubmVjdGlvblRpbWVvdXQgPSBfYyA9PT0gdm9pZCAwID8gREVGQVVMVC5jb25uZWN0aW9uVGltZW91dCA6IF9jLCBfZCA9IF9hLldlYlNvY2tldCwgV2ViU29ja2V0ID0gX2QgPT09IHZvaWQgMCA/IGdldEdsb2JhbFdlYlNvY2tldCgpIDogX2Q7XHJcbiAgICAgICAgaWYgKHRoaXMuX3JldHJ5Q291bnQgPj0gbWF4UmV0cmllcykge1xyXG4gICAgICAgICAgICB0aGlzLl9kZWJ1ZygnbWF4IHJldHJpZXMgcmVhY2hlZCcsIHRoaXMuX3JldHJ5Q291bnQsICc+PScsIG1heFJldHJpZXMpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3JldHJ5Q291bnQrKztcclxuICAgICAgICB0aGlzLl9kZWJ1ZygnY29ubmVjdCcsIHRoaXMuX3JldHJ5Q291bnQpO1xyXG4gICAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO1xyXG4gICAgICAgIGlmICghaXNXZWJTb2NrZXQoV2ViU29ja2V0KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTm8gdmFsaWQgV2ViU29ja2V0IGNsYXNzIHByb3ZpZGVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3dhaXQoKVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5fZ2V0TmV4dFVybChfdGhpcy5fdXJsKTsgfSlcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHVybCkge1xyXG4gICAgICAgICAgICAvLyBjbG9zZSBjb3VsZCBiZSBjYWxsZWQgYmVmb3JlIGNyZWF0aW5nIHRoZSB3c1xyXG4gICAgICAgICAgICBpZiAoX3RoaXMuX2Nsb3NlQ2FsbGVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgX3RoaXMuX2RlYnVnKCdjb25uZWN0JywgeyB1cmw6IHVybCwgcHJvdG9jb2xzOiBfdGhpcy5fcHJvdG9jb2xzIH0pO1xyXG4gICAgICAgICAgICBfdGhpcy5fd3MgPSBfdGhpcy5fcHJvdG9jb2xzXHJcbiAgICAgICAgICAgICAgICA/IG5ldyBXZWJTb2NrZXQodXJsLCBfdGhpcy5fcHJvdG9jb2xzKVxyXG4gICAgICAgICAgICAgICAgOiBuZXcgV2ViU29ja2V0KHVybCk7XHJcbiAgICAgICAgICAgIF90aGlzLl93cy5iaW5hcnlUeXBlID0gX3RoaXMuX2JpbmFyeVR5cGU7XHJcbiAgICAgICAgICAgIF90aGlzLl9jb25uZWN0TG9jayA9IGZhbHNlO1xyXG4gICAgICAgICAgICBfdGhpcy5fYWRkTGlzdGVuZXJzKCk7XHJcbiAgICAgICAgICAgIF90aGlzLl9jb25uZWN0VGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuX2hhbmRsZVRpbWVvdXQoKTsgfSwgY29ubmVjdGlvblRpbWVvdXQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuX2hhbmRsZVRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5fZGVidWcoJ3RpbWVvdXQgZXZlbnQnKTtcclxuICAgICAgICB0aGlzLl9oYW5kbGVFcnJvcihuZXcgRXJyb3JFdmVudChFcnJvcignVElNRU9VVCcpLCB0aGlzKSk7XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5fZGlzY29ubmVjdCA9IGZ1bmN0aW9uIChjb2RlLCByZWFzb24pIHtcclxuICAgICAgICBpZiAoY29kZSA9PT0gdm9pZCAwKSB7IGNvZGUgPSAxMDAwOyB9XHJcbiAgICAgICAgdGhpcy5fY2xlYXJUaW1lb3V0cygpO1xyXG4gICAgICAgIGlmICghdGhpcy5fd3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9yZW1vdmVMaXN0ZW5lcnMoKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLl93cy5jbG9zZShjb2RlLCByZWFzb24pO1xyXG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVDbG9zZShuZXcgQ2xvc2VFdmVudChjb2RlLCByZWFzb24sIHRoaXMpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl9hY2NlcHRPcGVuID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuX2RlYnVnKCdhY2NlcHQgb3BlbicpO1xyXG4gICAgICAgIHRoaXMuX3JldHJ5Q291bnQgPSAwO1xyXG4gICAgfTtcclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuX2NhbGxFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKGV2ZW50LCBsaXN0ZW5lcikge1xyXG4gICAgICAgIGlmICgnaGFuZGxlRXZlbnQnIGluIGxpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgbGlzdGVuZXIuaGFuZGxlRXZlbnQoZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICBsaXN0ZW5lcihldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuX3JlbW92ZUxpc3RlbmVycyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX3dzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZGVidWcoJ3JlbW92ZUxpc3RlbmVycycpO1xyXG4gICAgICAgIHRoaXMuX3dzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29wZW4nLCB0aGlzLl9oYW5kbGVPcGVuKTtcclxuICAgICAgICB0aGlzLl93cy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbG9zZScsIHRoaXMuX2hhbmRsZUNsb3NlKTtcclxuICAgICAgICB0aGlzLl93cy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5faGFuZGxlTWVzc2FnZSk7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIHRoaXMuX3dzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgdGhpcy5faGFuZGxlRXJyb3IpO1xyXG4gICAgfTtcclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuX2FkZExpc3RlbmVycyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX3dzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZGVidWcoJ2FkZExpc3RlbmVycycpO1xyXG4gICAgICAgIHRoaXMuX3dzLmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCB0aGlzLl9oYW5kbGVPcGVuKTtcclxuICAgICAgICB0aGlzLl93cy5hZGRFdmVudExpc3RlbmVyKCdjbG9zZScsIHRoaXMuX2hhbmRsZUNsb3NlKTtcclxuICAgICAgICB0aGlzLl93cy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5faGFuZGxlTWVzc2FnZSk7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIHRoaXMuX3dzLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgdGhpcy5faGFuZGxlRXJyb3IpO1xyXG4gICAgfTtcclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuX2NsZWFyVGltZW91dHMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2Nvbm5lY3RUaW1lb3V0KTtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdXB0aW1lVGltZW91dCk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIFJlY29ubmVjdGluZ1dlYlNvY2tldDtcclxufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWNvbm5lY3RpbmdXZWJTb2NrZXQ7XG4iXX0=