discord-player 6.5.0 → 6.6.0-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -18,6 +18,7 @@ var __copyProps = (to, from, except, desc) => {
18
18
  }
19
19
  return to;
20
20
  };
21
+ var __reExport = (target2, mod, secondTarget) => (__copyProps(target2, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
21
22
  var __toESM = (mod, isNodeMode, target2) => (target2 = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
23
  isNodeMode || !mod || !mod.__esModule ? __defProp(target2, "default", { value: mod, enumerable: true }) : target2,
23
24
  mod
@@ -65,11 +66,10 @@ __export(src_exports, {
65
66
  FFMPEG_ARGS_PIPED: () => FFMPEG_ARGS_PIPED,
66
67
  FFMPEG_ARGS_STRING: () => FFMPEG_ARGS_STRING,
67
68
  FFMPEG_SRATE_REGEX: () => FFMPEG_SRATE_REGEX,
68
- FFmpeg: () => FFmpeg,
69
69
  FFmpegFilterer: () => FFmpegFilterer,
70
70
  FiltersChain: () => import_equalizer3.FiltersChain,
71
71
  GuildNodeManager: () => GuildNodeManager,
72
- GuildQueue: () => GuildQueue,
72
+ GuildQueue: () => GuildQueue4,
73
73
  GuildQueueAudioFilters: () => GuildQueueAudioFilters,
74
74
  GuildQueueEvent: () => GuildQueueEvent,
75
75
  GuildQueueHistory: () => GuildQueueHistory,
@@ -95,19 +95,21 @@ __export(src_exports, {
95
95
  VolumeTransformer: () => import_equalizer3.VolumeTransformer,
96
96
  createAudioPlayer: () => import_voice7.createAudioPlayer,
97
97
  createFFmpegStream: () => createFFmpegStream,
98
- findFFmpeg: () => findFFmpeg,
98
+ createHook: () => createHook,
99
99
  onAfterCreateStream: () => onAfterCreateStream,
100
100
  onBeforeCreateStream: () => onBeforeCreateStream,
101
101
  useHistory: () => useHistory,
102
+ useMainPlayer: () => useMainPlayer,
102
103
  useMasterPlayer: () => useMasterPlayer,
103
104
  useMetadata: () => useMetadata,
104
105
  usePlayer: () => usePlayer,
105
106
  useQueue: () => useQueue,
106
107
  useTimeline: () => useTimeline,
107
- version: () => version2
108
+ useVolume: () => useVolume,
109
+ version: () => version
108
110
  });
109
111
  module.exports = __toCommonJS(src_exports);
110
- var import_discord5 = require("discord.js");
112
+ var import_discord6 = require("discord.js");
111
113
 
112
114
  // src/utils/PlayerEventsEmitter.ts
113
115
  var import_utils = require("@discord-player/utils");
@@ -496,6 +498,27 @@ var DiscordPlayerErrors = {
496
498
  return message || "No voice connection available, maybe connect to a voice channel first?";
497
499
  }
498
500
  },
501
+ ERR_VOICE_CONNECTION_DESTROYED: {
502
+ name: "ERR_VOICE_CONNECTION_DESTROYED",
503
+ type: Error,
504
+ createError() {
505
+ return "Cannot use destroyed voice connection";
506
+ }
507
+ },
508
+ ERR_NO_VOICE_CHANNEL: {
509
+ name: "ERR_NO_VOICE_CHANNEL",
510
+ type: Error,
511
+ createError() {
512
+ return "Could not get the voice channel";
513
+ }
514
+ },
515
+ ERR_INVALID_VOICE_CHANNEL: {
516
+ name: "ERR_INVALID_VOICE_CHANNEL",
517
+ type: Error,
518
+ createError() {
519
+ return "Expected a voice channel";
520
+ }
521
+ },
499
522
  ERR_NO_RECEIVER: {
500
523
  name: "ERR_NO_RECEIVER",
501
524
  type: Error,
@@ -557,7 +580,7 @@ var ErrorCodes = (() => {
557
580
  for (const prop in DiscordPlayerErrors) {
558
581
  dict[prop] = prop;
559
582
  }
560
- return Object.preventExtensions(dict);
583
+ return Object.freeze(dict);
561
584
  })();
562
585
  var Exceptions = new Proxy(target, handler);
563
586
 
@@ -795,14 +818,17 @@ var ExtractorExecutionContext = class extends PlayerEventsEmitter {
795
818
  const extractor = new _extractor(this, options);
796
819
  try {
797
820
  this.store.set(_extractor.identifier, extractor);
798
- this.player.debug(`${_extractor.identifier} extractor loaded!`);
821
+ if (this.player.hasDebugger)
822
+ this.player.debug(`${_extractor.identifier} extractor loaded!`);
799
823
  this.emit("registered", this, extractor);
800
824
  await extractor.activate();
801
- this.player.debug(`${_extractor.identifier} extractor activated!`);
825
+ if (this.player.hasDebugger)
826
+ this.player.debug(`${_extractor.identifier} extractor activated!`);
802
827
  this.emit("activate", this, extractor);
803
828
  } catch (e) {
804
829
  this.store.delete(_extractor.identifier);
805
- this.player.debug(`${_extractor.identifier} extractor failed to activate! Error: ${e}`);
830
+ if (this.player.hasDebugger)
831
+ this.player.debug(`${_extractor.identifier} extractor failed to activate! Error: ${e}`);
806
832
  this.emit("error", this, extractor, e);
807
833
  }
808
834
  }
@@ -813,13 +839,16 @@ var ExtractorExecutionContext = class extends PlayerEventsEmitter {
813
839
  try {
814
840
  const key = extractor.identifier || this.store.findKey((e) => e === extractor);
815
841
  this.store.delete(key);
816
- this.player.debug(`${extractor.identifier} extractor disabled!`);
842
+ if (this.player.hasDebugger)
843
+ this.player.debug(`${extractor.identifier} extractor disabled!`);
817
844
  this.emit("unregistered", this, extractor);
818
845
  await extractor.deactivate();
819
- this.player.debug(`${extractor.identifier} extractor deactivated!`);
846
+ if (this.player.hasDebugger)
847
+ this.player.debug(`${extractor.identifier} extractor deactivated!`);
820
848
  this.emit("deactivate", this, extractor);
821
849
  } catch (e) {
822
- this.player.debug(`${extractor.identifier} extractor failed to deactivate!`);
850
+ if (this.player.hasDebugger)
851
+ this.player.debug(`${extractor.identifier} extractor failed to deactivate!`);
823
852
  this.emit("error", this, extractor, e);
824
853
  }
825
854
  }
@@ -839,19 +868,22 @@ var ExtractorExecutionContext = class extends PlayerEventsEmitter {
839
868
  for (const ext of this.store.values()) {
840
869
  if (filterBlocked && blocked.some((e) => e === ext.identifier))
841
870
  continue;
842
- this.player.debug(`Executing extractor ${ext.identifier}...`);
871
+ if (this.player.hasDebugger)
872
+ this.player.debug(`Executing extractor ${ext.identifier}...`);
843
873
  const result = await fn(ext).then(
844
874
  (res) => {
845
875
  return res;
846
876
  },
847
877
  (e) => {
848
- this.player.debug(`Extractor ${ext.identifier} failed with error: ${e}`);
878
+ if (this.player.hasDebugger)
879
+ this.player.debug(`Extractor ${ext.identifier} failed with error: ${e}`);
849
880
  return TypeUtil.isError(e) ? e : new Error(`${e}`);
850
881
  }
851
882
  );
852
883
  lastExt = ext;
853
884
  if (result && !TypeUtil.isError(result)) {
854
- this.player.debug(`Extractor ${ext.identifier} executed successfully!`);
885
+ if (this.player.hasDebugger)
886
+ this.player.debug(`Extractor ${ext.identifier} executed successfully!`);
855
887
  return {
856
888
  extractor: ext,
857
889
  error: null,
@@ -872,143 +904,463 @@ var ExtractorExecutionContext = class extends PlayerEventsEmitter {
872
904
  __name(ExtractorExecutionContext, "ExtractorExecutionContext");
873
905
 
874
906
  // src/manager/GuildNodeManager.ts
875
- var import_utils6 = require("@discord-player/utils");
907
+ var import_utils7 = require("@discord-player/utils");
876
908
 
877
909
  // src/manager/GuildQueue.ts
878
910
  var import_discord3 = require("discord.js");
879
- var import_utils4 = require("@discord-player/utils");
880
- var import_voice2 = require("@discordjs/voice");
911
+ var import_utils5 = require("@discord-player/utils");
881
912
 
882
- // src/manager/GuildQueueHistory.ts
913
+ // src/VoiceInterface/StreamDispatcher.ts
914
+ var import_voice2 = require("@discordjs/voice");
883
915
  var import_utils3 = require("@discord-player/utils");
884
- var GuildQueueHistory = class {
885
- constructor(queue) {
886
- this.queue = queue;
887
- this.tracks = new import_utils3.Queue("LIFO");
916
+ var import_equalizer = require("@discord-player/equalizer");
917
+
918
+ // src/manager/VoiceReceiverNode.ts
919
+ var import_stream = require("stream");
920
+ var import_voice = require("@discordjs/voice");
921
+ var prism = __toESM(require("prism-media"));
922
+ var VoiceReceiverNode = class {
923
+ constructor(dispatcher) {
924
+ this.dispatcher = dispatcher;
888
925
  }
889
- get currentTrack() {
890
- return this.queue.dispatcher?.audioResource?.metadata || this.queue.__current;
926
+ createRawTrack(stream, data = {}) {
927
+ data.title ?? (data.title = `Recording ${Date.now()}`);
928
+ return new Track(this.dispatcher.queue.player, {
929
+ author: "Discord",
930
+ description: data.title,
931
+ title: data.title,
932
+ duration: data.duration || "0:00",
933
+ views: 0,
934
+ requestedBy: data.requestedBy,
935
+ thumbnail: data.thumbnail || "https://cdn.discordapp.com/embed/avatars/0.png",
936
+ url: data.url || "https://discord.com",
937
+ source: "arbitrary",
938
+ raw: {
939
+ engine: stream,
940
+ source: "arbitrary"
941
+ }
942
+ });
891
943
  }
892
- get nextTrack() {
893
- return this.queue.tracks.at(0) || null;
944
+ mergeRecordings(streams) {
945
+ throw Exceptions.ERR_NOT_IMPLEMENTED(`${this.constructor.name}.mergeRecordings()`);
894
946
  }
895
- get previousTrack() {
896
- return this.tracks.at(0) || null;
947
+ recordUser(user, options = {
948
+ end: import_voice.EndBehaviorType.AfterSilence,
949
+ mode: "pcm",
950
+ silenceDuration: 1e3
951
+ }) {
952
+ const _user = this.dispatcher.queue.player.client.users.resolveId(user);
953
+ const passThrough = new import_stream.PassThrough();
954
+ const receiver = this.dispatcher.voiceConnection.receiver;
955
+ if (!receiver)
956
+ throw Exceptions.ERR_NO_RECEIVER();
957
+ receiver.speaking.on("start", (userId) => {
958
+ if (userId === _user) {
959
+ const receiveStream = receiver.subscribe(_user, {
960
+ end: {
961
+ behavior: options.end || import_voice.EndBehaviorType.AfterSilence,
962
+ duration: options.silenceDuration ?? 1e3
963
+ }
964
+ });
965
+ setImmediate(async () => {
966
+ if (options.mode === "pcm") {
967
+ const pcm = receiveStream.pipe(
968
+ new (prism.opus || prism.default.opus).Decoder({
969
+ channels: 2,
970
+ frameSize: 960,
971
+ rate: 48e3
972
+ })
973
+ );
974
+ return pcm.pipe(passThrough);
975
+ } else {
976
+ return receiveStream.pipe(passThrough);
977
+ }
978
+ }).unref();
979
+ }
980
+ });
981
+ return passThrough;
897
982
  }
898
- get disabled() {
899
- return this.queue.options.disableHistory;
983
+ };
984
+ __name(VoiceReceiverNode, "VoiceReceiverNode");
985
+
986
+ // src/VoiceInterface/StreamDispatcher.ts
987
+ var StreamDispatcher = class extends import_utils3.EventEmitter {
988
+ constructor(connection, channel, queue, connectionTimeout = 2e4, audioPlayer) {
989
+ super();
990
+ this.queue = queue;
991
+ this.connectionTimeout = connectionTimeout;
992
+ this.receiver = new VoiceReceiverNode(this);
993
+ this.dsp = new import_equalizer.FiltersChain();
994
+ this.voiceConnection = connection;
995
+ this.audioPlayer = audioPlayer || (0, import_voice2.createAudioPlayer)({
996
+ debug: this.queue.hasDebugger
997
+ });
998
+ this.channel = channel;
999
+ this.voiceConnection.on("debug", (m) => void this.emit("debug", m));
1000
+ this.voiceConnection.on("error", (error) => void this.emit("error", error));
1001
+ this.audioPlayer.on("debug", (m) => void this.emit("debug", m));
1002
+ this.audioPlayer.on("error", (error) => void this.emit("error", error));
1003
+ this.dsp.onUpdate = () => {
1004
+ if (!this.dsp)
1005
+ return;
1006
+ if (this.dsp.filters?.filters)
1007
+ this.emit("dsp", this.dsp.filters?.filters);
1008
+ if (this.dsp.biquad?.filter)
1009
+ this.emit("biquad", this.dsp.biquad?.filter);
1010
+ if (this.dsp.equalizer)
1011
+ this.emit("eqBands", this.dsp.equalizer.getEQ());
1012
+ if (this.dsp.volume)
1013
+ this.emit("volume", this.dsp.volume.volume);
1014
+ if (this.dsp.resampler)
1015
+ this.emit("sampleRate", this.dsp.resampler.targetSampleRate);
1016
+ };
1017
+ this.dsp.onError = (e) => this.emit("error", e);
1018
+ this.voiceConnection.on(import_voice2.VoiceConnectionStatus.Disconnected, async (oldState, newState) => {
1019
+ if (newState.reason === import_voice2.VoiceConnectionDisconnectReason.Manual) {
1020
+ this.destroy();
1021
+ return;
1022
+ }
1023
+ if (newState.reason === import_voice2.VoiceConnectionDisconnectReason.WebSocketClose && newState.closeCode === 4014) {
1024
+ try {
1025
+ await (0, import_voice2.entersState)(this.voiceConnection, import_voice2.VoiceConnectionStatus.Connecting, this.connectionTimeout);
1026
+ } catch {
1027
+ try {
1028
+ if (this.voiceConnection.state.status !== import_voice2.VoiceConnectionStatus.Destroyed)
1029
+ this.destroy();
1030
+ } catch (err) {
1031
+ this.emit("error", err);
1032
+ }
1033
+ }
1034
+ } else if (this.voiceConnection.rejoinAttempts < 5) {
1035
+ await Util.wait((this.voiceConnection.rejoinAttempts + 1) * 5e3);
1036
+ this.voiceConnection.rejoin();
1037
+ } else {
1038
+ try {
1039
+ if (this.voiceConnection.state.status !== import_voice2.VoiceConnectionStatus.Destroyed)
1040
+ this.destroy();
1041
+ } catch (err) {
1042
+ this.emit("error", err);
1043
+ }
1044
+ }
1045
+ }).on(import_voice2.VoiceConnectionStatus.Destroyed, () => {
1046
+ this.end();
1047
+ this.queue.emit(GuildQueueEvent.connectionDestroyed, this.queue);
1048
+ });
1049
+ this.audioPlayer.on("stateChange", (oldState, newState) => {
1050
+ if (oldState.status !== import_voice2.AudioPlayerStatus.Paused && newState.status === import_voice2.AudioPlayerStatus.Paused) {
1051
+ this.queue.emit(GuildQueueEvent.playerPause, this.queue);
1052
+ }
1053
+ if (oldState.status === import_voice2.AudioPlayerStatus.Paused && newState.status !== import_voice2.AudioPlayerStatus.Paused) {
1054
+ this.queue.emit(GuildQueueEvent.playerResume, this.queue);
1055
+ }
1056
+ if (newState.status === import_voice2.AudioPlayerStatus.Playing) {
1057
+ if (oldState.status === import_voice2.AudioPlayerStatus.Idle || oldState.status === import_voice2.AudioPlayerStatus.Buffering) {
1058
+ return this.emit("start", this.audioResource);
1059
+ }
1060
+ } else if (newState.status === import_voice2.AudioPlayerStatus.Idle && oldState.status !== import_voice2.AudioPlayerStatus.Idle) {
1061
+ this.emit("finish", this.audioResource);
1062
+ this.dsp.destroy();
1063
+ this.audioResource = null;
1064
+ }
1065
+ });
1066
+ this.voiceConnection.subscribe(this.audioPlayer);
900
1067
  }
901
- get size() {
902
- return this.tracks.size;
1068
+ get paused() {
1069
+ return this.audioPlayer.state.status === import_voice2.AudioPlayerStatus.Paused;
903
1070
  }
904
- getSize() {
905
- return this.size;
1071
+ set paused(val) {
1072
+ val ? this.pause(true) : this.resume();
906
1073
  }
907
- isEmpty() {
908
- return this.tracks.size < 1;
1074
+ isPaused() {
1075
+ return this.paused || this.audioPlayer.state.status === import_voice2.AudioPlayerStatus.AutoPaused;
909
1076
  }
910
- push(track) {
911
- if (this.disabled)
912
- return false;
913
- this.tracks.add(track);
914
- this.resize();
915
- return true;
1077
+ isBuffering() {
1078
+ return this.audioPlayer.state.status === import_voice2.AudioPlayerStatus.Buffering;
916
1079
  }
917
- clear() {
918
- this.tracks.clear();
1080
+ isPlaying() {
1081
+ return this.audioPlayer.state.status === import_voice2.AudioPlayerStatus.Playing;
919
1082
  }
920
- async next() {
921
- const track = this.nextTrack;
922
- if (!track) {
923
- throw Exceptions.ERR_NO_RESULT("No next track in the queue");
924
- }
925
- this.queue.node.skip();
1083
+ isIdle() {
1084
+ return this.audioPlayer.state.status === import_voice2.AudioPlayerStatus.Idle;
926
1085
  }
927
- async previous(preserveCurrent = true) {
928
- const track = this.tracks.dispatch();
929
- if (!track) {
930
- throw Exceptions.ERR_NO_RESULT("No previous track in the queue");
931
- }
932
- const current = this.currentTrack;
933
- await this.queue.node.play(track, { queue: false });
934
- if (current && preserveCurrent)
935
- this.queue.node.insert(current, 0);
1086
+ isDestroyed() {
1087
+ return this.voiceConnection.state.status === import_voice2.VoiceConnectionStatus.Destroyed;
936
1088
  }
937
- back(preserveCurrent = true) {
938
- return this.previous(preserveCurrent);
1089
+ isDisconnected() {
1090
+ return this.voiceConnection.state.status === import_voice2.VoiceConnectionStatus.Disconnected;
939
1091
  }
940
- resize() {
941
- if (!Number.isFinite(this.queue.maxHistorySize))
942
- return;
943
- if (this.tracks.store.length < this.queue.maxHistorySize)
944
- return;
945
- this.tracks.store.splice(this.queue.maxHistorySize);
1092
+ isReady() {
1093
+ return this.voiceConnection.state.status === import_voice2.VoiceConnectionStatus.Ready;
946
1094
  }
947
- };
948
- __name(GuildQueueHistory, "GuildQueueHistory");
949
-
950
- // src/manager/GuildQueuePlayerNode.ts
951
- var import_voice = require("@discordjs/voice");
952
-
953
- // src/utils/QueryResolver.ts
954
- var spotifySongRegex = /^https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(intl-([a-z]|[A-Z])+\/)?(?:track\/|\?uri=spotify:track:)((\w|-){22})(\?si=.+)?$/;
955
- var spotifyPlaylistRegex = /^https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(intl-([a-z]|[A-Z])+\/)?(?:playlist\/|\?uri=spotify:playlist:)((\w|-){22})(\?si=.+)?$/;
956
- var spotifyAlbumRegex = /^https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(intl-([a-z]|[A-Z])+\/)?(?:album\/|\?uri=spotify:album:)((\w|-){22})(\?si=.+)?$/;
957
- var vimeoRegex = /^(http|https)?:\/\/(www\.|player\.)?vimeo\.com\/(?:channels\/(?:\w+\/)?|groups\/([^/]*)\/videos\/|video\/|)(\d+)(?:|\/\?)$/;
958
- var reverbnationRegex = /^https:\/\/(www.)?reverbnation.com\/(.+)\/song\/(.+)$/;
959
- var attachmentRegex = /^https?:\/\/.+$/;
960
- var appleMusicSongRegex = /^https?:\/\/music\.apple\.com\/.+?\/(song|album)\/.+?(\/.+?\?i=|\/)([0-9]+)$/;
961
- var appleMusicPlaylistRegex = /^https?:\/\/music\.apple\.com\/.+?\/playlist\/.+\/pl\.(u-)?[a-zA-Z0-9]+$/;
962
- var appleMusicAlbumRegex = /^https?:\/\/music\.apple\.com\/.+?\/album\/.+\/([0-9]+)$/;
963
- var soundcloudTrackRegex = /^https?:\/\/(m.|www.)?soundcloud.com\/(\w|-)+\/(\w|-)+(.+)?$/;
964
- var soundcloudPlaylistRegex = /^https?:\/\/(m.|www.)?soundcloud.com\/(\w|-)+\/sets\/(\w|-)+(.+)?$/;
965
- var youtubePlaylistRegex = /^https?:\/\/(www.)?youtube.com\/playlist\?list=((PL|FL|UU|LL|RD|OL)[a-zA-Z0-9-_]{16,41})$/;
966
- var youtubeVideoURLRegex = /^((?:https?:)?\/\/)?((?:www|m)\.)?((?:youtube\.com|youtu.be))(\/(?:[\w-]+\?v=|embed\/|v\/)?)([\w-]+)(\S+)?$/;
967
- var youtubeVideoIdRegex = /^[a-zA-Z0-9-_]{11}$/;
968
- var QueryResolver = class {
969
- constructor() {
1095
+ isSignalling() {
1096
+ return this.voiceConnection.state.status === import_voice2.VoiceConnectionStatus.Signalling;
970
1097
  }
971
- static get regex() {
972
- return {
973
- spotifyAlbumRegex,
974
- spotifyPlaylistRegex,
975
- spotifySongRegex,
976
- vimeoRegex,
977
- reverbnationRegex,
978
- attachmentRegex,
979
- appleMusicAlbumRegex,
980
- appleMusicPlaylistRegex,
981
- appleMusicSongRegex,
982
- soundcloudTrackRegex,
983
- soundcloudPlaylistRegex,
984
- youtubePlaylistRegex
985
- };
1098
+ isConnecting() {
1099
+ return this.voiceConnection.state.status === import_voice2.VoiceConnectionStatus.Connecting;
986
1100
  }
987
- static resolve(query, fallbackSearchEngine = QueryType.AUTO_SEARCH) {
988
- if (!TypeUtil.isString(query))
989
- throw Exceptions.ERR_INVALID_ARG_TYPE(query, "string", typeof query);
990
- if (!query.length)
991
- throw Exceptions.ERR_INFO_REQUIRED("query", String(query));
992
- query = !query.includes("youtube.com") ? query.trim() : query.replace(/(m(usic)?|gaming)\./, "").trim();
993
- if (soundcloudPlaylistRegex.test(query))
994
- return QueryType.SOUNDCLOUD_PLAYLIST;
995
- if (soundcloudTrackRegex.test(query))
996
- return QueryType.SOUNDCLOUD_TRACK;
997
- if (spotifyPlaylistRegex.test(query))
998
- return QueryType.SPOTIFY_PLAYLIST;
999
- if (spotifyAlbumRegex.test(query))
1000
- return QueryType.SPOTIFY_ALBUM;
1001
- if (spotifySongRegex.test(query))
1002
- return QueryType.SPOTIFY_SONG;
1003
- if (youtubePlaylistRegex.test(query))
1004
- return QueryType.YOUTUBE_PLAYLIST;
1005
- if (QueryResolver.validateId(query) || QueryResolver.validateURL(query))
1006
- return QueryType.YOUTUBE_VIDEO;
1007
- if (vimeoRegex.test(query))
1008
- return QueryType.VIMEO;
1009
- if (reverbnationRegex.test(query))
1010
- return QueryType.REVERBNATION;
1011
- if (appleMusicAlbumRegex.test(query))
1101
+ async createStream(src, ops) {
1102
+ if (!ops?.disableFilters && this.queue.hasDebugger)
1103
+ this.queue.debug("Initiating DSP filters pipeline...");
1104
+ const stream = !ops?.disableFilters ? this.dsp.create(src, {
1105
+ dsp: {
1106
+ filters: ops?.defaultFilters,
1107
+ disabled: ops?.disableFilters
1108
+ },
1109
+ biquad: ops?.biquadFilter ? {
1110
+ filter: ops.biquadFilter,
1111
+ disabled: ops?.disableBiquad
1112
+ } : void 0,
1113
+ resampler: {
1114
+ targetSampleRate: ops?.sampleRate,
1115
+ disabled: ops?.disableResampler
1116
+ },
1117
+ equalizer: {
1118
+ bandMultiplier: ops?.eq,
1119
+ disabled: ops?.disableEqualizer
1120
+ },
1121
+ volume: {
1122
+ volume: ops?.volume,
1123
+ disabled: ops?.disableVolume
1124
+ }
1125
+ }) : src;
1126
+ if (this.queue.hasDebugger)
1127
+ this.queue.debug("Executing onAfterCreateStream hook...");
1128
+ const postStream = await this.queue.onAfterCreateStream?.(stream, this.queue).catch(
1129
+ () => ({
1130
+ stream,
1131
+ type: ops?.type ?? import_voice2.StreamType.Arbitrary
1132
+ })
1133
+ );
1134
+ if (this.queue.hasDebugger)
1135
+ this.queue.debug("Preparing AudioResource...");
1136
+ this.audioResource = (0, import_voice2.createAudioResource)(postStream?.stream ?? stream, {
1137
+ inputType: postStream?.type ?? ops?.type ?? import_voice2.StreamType.Arbitrary,
1138
+ metadata: ops?.data,
1139
+ inlineVolume: false
1140
+ });
1141
+ return this.audioResource;
1142
+ }
1143
+ get resampler() {
1144
+ return this.dsp?.resampler;
1145
+ }
1146
+ get filters() {
1147
+ return this.dsp?.filters;
1148
+ }
1149
+ get biquad() {
1150
+ return this.dsp?.biquad || null;
1151
+ }
1152
+ get equalizer() {
1153
+ return this.dsp?.equalizer || null;
1154
+ }
1155
+ get status() {
1156
+ return this.audioPlayer.state.status;
1157
+ }
1158
+ disconnect() {
1159
+ try {
1160
+ if (this.audioPlayer)
1161
+ this.audioPlayer.stop(true);
1162
+ if (this.voiceConnection.state.status !== import_voice2.VoiceConnectionStatus.Destroyed)
1163
+ this.voiceConnection.destroy();
1164
+ } catch {
1165
+ }
1166
+ }
1167
+ destroy() {
1168
+ this.disconnect();
1169
+ this.audioPlayer.removeAllListeners();
1170
+ this.voiceConnection.removeAllListeners();
1171
+ this.dsp.destroy();
1172
+ this.audioResource = null;
1173
+ this.emit("destroyed");
1174
+ }
1175
+ end() {
1176
+ try {
1177
+ this.audioPlayer.stop();
1178
+ this.dsp.destroy();
1179
+ } catch {
1180
+ }
1181
+ }
1182
+ pause(interpolateSilence) {
1183
+ const success = this.audioPlayer.pause(interpolateSilence);
1184
+ return success;
1185
+ }
1186
+ resume() {
1187
+ const success = this.audioPlayer.unpause();
1188
+ return success;
1189
+ }
1190
+ async playStream(resource = this.audioResource) {
1191
+ if (!resource) {
1192
+ throw Exceptions.ERR_NO_AUDIO_RESOURCE();
1193
+ }
1194
+ if (resource.ended) {
1195
+ return void this.emit("finish", resource);
1196
+ }
1197
+ if (!this.audioResource)
1198
+ this.audioResource = resource;
1199
+ if (this.voiceConnection.state.status !== import_voice2.VoiceConnectionStatus.Ready) {
1200
+ try {
1201
+ await (0, import_voice2.entersState)(this.voiceConnection, import_voice2.VoiceConnectionStatus.Ready, this.connectionTimeout);
1202
+ } catch (err) {
1203
+ return void this.emit("error", err);
1204
+ }
1205
+ }
1206
+ try {
1207
+ this.audioPlayer.play(resource);
1208
+ } catch (e) {
1209
+ this.emit("error", e);
1210
+ }
1211
+ return this;
1212
+ }
1213
+ setVolume(value) {
1214
+ if (!this.dsp.volume)
1215
+ return false;
1216
+ return this.dsp.volume.setVolume(value);
1217
+ }
1218
+ get volume() {
1219
+ if (!this.dsp.volume)
1220
+ return 100;
1221
+ return this.dsp.volume.volume;
1222
+ }
1223
+ get streamTime() {
1224
+ if (!this.audioResource)
1225
+ return 0;
1226
+ return this.audioResource.playbackDuration;
1227
+ }
1228
+ };
1229
+ __name(StreamDispatcher, "StreamDispatcher");
1230
+
1231
+ // src/manager/GuildQueue.ts
1232
+ var import_voice4 = require("@discordjs/voice");
1233
+
1234
+ // src/manager/GuildQueueHistory.ts
1235
+ var import_utils4 = require("@discord-player/utils");
1236
+ var GuildQueueHistory = class {
1237
+ constructor(queue) {
1238
+ this.queue = queue;
1239
+ this.tracks = new import_utils4.Queue("LIFO");
1240
+ }
1241
+ get currentTrack() {
1242
+ return this.queue.dispatcher?.audioResource?.metadata || this.queue.__current;
1243
+ }
1244
+ get nextTrack() {
1245
+ return this.queue.tracks.at(0) || null;
1246
+ }
1247
+ get previousTrack() {
1248
+ return this.tracks.at(0) || null;
1249
+ }
1250
+ get disabled() {
1251
+ return this.queue.options.disableHistory;
1252
+ }
1253
+ get size() {
1254
+ return this.tracks.size;
1255
+ }
1256
+ getSize() {
1257
+ return this.size;
1258
+ }
1259
+ isEmpty() {
1260
+ return this.tracks.size < 1;
1261
+ }
1262
+ push(track) {
1263
+ if (this.disabled)
1264
+ return false;
1265
+ this.tracks.add(track);
1266
+ this.resize();
1267
+ return true;
1268
+ }
1269
+ clear() {
1270
+ this.tracks.clear();
1271
+ }
1272
+ async next() {
1273
+ const track = this.nextTrack;
1274
+ if (!track) {
1275
+ throw Exceptions.ERR_NO_RESULT("No next track in the queue");
1276
+ }
1277
+ this.queue.node.skip();
1278
+ }
1279
+ async previous(preserveCurrent = true) {
1280
+ const track = this.tracks.dispatch();
1281
+ if (!track) {
1282
+ throw Exceptions.ERR_NO_RESULT("No previous track in the queue");
1283
+ }
1284
+ const current = this.currentTrack;
1285
+ await this.queue.node.play(track, { queue: false });
1286
+ if (current && preserveCurrent)
1287
+ this.queue.node.insert(current, 0);
1288
+ }
1289
+ back(preserveCurrent = true) {
1290
+ return this.previous(preserveCurrent);
1291
+ }
1292
+ resize() {
1293
+ if (!Number.isFinite(this.queue.maxHistorySize))
1294
+ return;
1295
+ if (this.tracks.store.length < this.queue.maxHistorySize)
1296
+ return;
1297
+ this.tracks.store.splice(this.queue.maxHistorySize);
1298
+ }
1299
+ };
1300
+ __name(GuildQueueHistory, "GuildQueueHistory");
1301
+
1302
+ // src/manager/GuildQueuePlayerNode.ts
1303
+ var import_voice3 = require("@discordjs/voice");
1304
+
1305
+ // src/utils/QueryResolver.ts
1306
+ var spotifySongRegex = /^https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(intl-([a-z]|[A-Z])+\/)?(?:track\/|\?uri=spotify:track:)((\w|-){22})(\?si=.+)?$/;
1307
+ var spotifyPlaylistRegex = /^https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(intl-([a-z]|[A-Z])+\/)?(?:playlist\/|\?uri=spotify:playlist:)((\w|-){22})(\?si=.+)?$/;
1308
+ var spotifyAlbumRegex = /^https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(intl-([a-z]|[A-Z])+\/)?(?:album\/|\?uri=spotify:album:)((\w|-){22})(\?si=.+)?$/;
1309
+ var vimeoRegex = /^(http|https)?:\/\/(www\.|player\.)?vimeo\.com\/(?:channels\/(?:\w+\/)?|groups\/([^/]*)\/videos\/|video\/|)(\d+)(?:|\/\?)$/;
1310
+ var reverbnationRegex = /^https:\/\/(www.)?reverbnation.com\/(.+)\/song\/(.+)$/;
1311
+ var attachmentRegex = /^https?:\/\/.+$/;
1312
+ var appleMusicSongRegex = /^https?:\/\/music\.apple\.com\/.+?\/(song|album)\/.+?(\/.+?\?i=|\/)([0-9]+)$/;
1313
+ var appleMusicPlaylistRegex = /^https?:\/\/music\.apple\.com\/.+?\/playlist\/.+\/pl\.(u-)?[a-zA-Z0-9]+$/;
1314
+ var appleMusicAlbumRegex = /^https?:\/\/music\.apple\.com\/.+?\/album\/.+\/([0-9]+)$/;
1315
+ var soundcloudTrackRegex = /^https?:\/\/(m.|www.)?soundcloud.com\/(\w|-)+\/(\w|-)+(.+)?$/;
1316
+ var soundcloudPlaylistRegex = /^https?:\/\/(m.|www.)?soundcloud.com\/(\w|-)+\/sets\/(\w|-)+(.+)?$/;
1317
+ var youtubePlaylistRegex = /^https?:\/\/(www.)?youtube.com\/playlist\?list=((PL|FL|UU|LL|RD|OL)[a-zA-Z0-9-_]{16,41})$/;
1318
+ var youtubeVideoURLRegex = /^((?:https?:)?\/\/)?((?:www|m)\.)?((?:youtube\.com|youtu.be))(\/(?:[\w-]+\?v=|embed\/|v\/)?)([\w-]+)(\S+)?$/;
1319
+ var youtubeVideoIdRegex = /^[a-zA-Z0-9-_]{11}$/;
1320
+ var QueryResolver = class {
1321
+ constructor() {
1322
+ }
1323
+ static get regex() {
1324
+ return {
1325
+ spotifyAlbumRegex,
1326
+ spotifyPlaylistRegex,
1327
+ spotifySongRegex,
1328
+ vimeoRegex,
1329
+ reverbnationRegex,
1330
+ attachmentRegex,
1331
+ appleMusicAlbumRegex,
1332
+ appleMusicPlaylistRegex,
1333
+ appleMusicSongRegex,
1334
+ soundcloudTrackRegex,
1335
+ soundcloudPlaylistRegex,
1336
+ youtubePlaylistRegex
1337
+ };
1338
+ }
1339
+ static resolve(query, fallbackSearchEngine = QueryType.AUTO_SEARCH) {
1340
+ if (!TypeUtil.isString(query))
1341
+ throw Exceptions.ERR_INVALID_ARG_TYPE(query, "string", typeof query);
1342
+ if (!query.length)
1343
+ throw Exceptions.ERR_INFO_REQUIRED("query", String(query));
1344
+ query = !query.includes("youtube.com") ? query.trim() : query.replace(/(m(usic)?|gaming)\./, "").trim();
1345
+ if (soundcloudPlaylistRegex.test(query))
1346
+ return QueryType.SOUNDCLOUD_PLAYLIST;
1347
+ if (soundcloudTrackRegex.test(query))
1348
+ return QueryType.SOUNDCLOUD_TRACK;
1349
+ if (spotifyPlaylistRegex.test(query))
1350
+ return QueryType.SPOTIFY_PLAYLIST;
1351
+ if (spotifyAlbumRegex.test(query))
1352
+ return QueryType.SPOTIFY_ALBUM;
1353
+ if (spotifySongRegex.test(query))
1354
+ return QueryType.SPOTIFY_SONG;
1355
+ if (youtubePlaylistRegex.test(query))
1356
+ return QueryType.YOUTUBE_PLAYLIST;
1357
+ if (QueryResolver.validateId(query) || QueryResolver.validateURL(query))
1358
+ return QueryType.YOUTUBE_VIDEO;
1359
+ if (vimeoRegex.test(query))
1360
+ return QueryType.VIMEO;
1361
+ if (reverbnationRegex.test(query))
1362
+ return QueryType.REVERBNATION;
1363
+ if (appleMusicAlbumRegex.test(query))
1012
1364
  return QueryType.APPLE_MUSIC_ALBUM;
1013
1365
  if (appleMusicPlaylistRegex.test(query))
1014
1366
  return QueryType.APPLE_MUSIC_PLAYLIST;
@@ -1280,7 +1632,7 @@ var GuildQueuePlayerNode = class {
1280
1632
  if (!foundTrack)
1281
1633
  return null;
1282
1634
  this.queue.tracks.removeOne((t) => t.id === foundTrack.id);
1283
- this.queue.player.events.emit("audioTrackRemove", this.queue, foundTrack);
1635
+ this.queue.emit(GuildQueueEvent.audioTrackRemove, this.queue, foundTrack);
1284
1636
  return foundTrack;
1285
1637
  }
1286
1638
  jump(track) {
@@ -1309,7 +1661,7 @@ var GuildQueuePlayerNode = class {
1309
1661
  return false;
1310
1662
  const toRemove = this.queue.tracks.store.filter((_, i) => i <= idx);
1311
1663
  this.queue.tracks.store.splice(0, idx, removed);
1312
- this.queue.player.events.emit("audioTracksRemove", this.queue, toRemove);
1664
+ this.queue.emit(GuildQueueEvent.audioTracksRemove, this.queue, toRemove);
1313
1665
  return this.skip();
1314
1666
  }
1315
1667
  insert(track, index = 0) {
@@ -1318,7 +1670,7 @@ var GuildQueuePlayerNode = class {
1318
1670
  VALIDATE_QUEUE_CAP(this.queue, track);
1319
1671
  this.queue.tracks.store.splice(index, 0, track);
1320
1672
  if (!this.queue.options.noEmitInsert)
1321
- this.queue.player.events.emit("audioTrackAdd", this.queue, track);
1673
+ this.queue.emit(GuildQueueEvent.audioTrackAdd, this.queue, track);
1322
1674
  }
1323
1675
  move(from, to) {
1324
1676
  const removed = this.remove(from);
@@ -1353,14 +1705,14 @@ var GuildQueuePlayerNode = class {
1353
1705
  return false;
1354
1706
  this.queue.dispatcher.end();
1355
1707
  if (force) {
1356
- this.queue.dispatcher.disconnect();
1708
+ this.queue.dispatcher.destroy();
1357
1709
  return true;
1358
1710
  }
1359
1711
  if (this.queue.options.leaveOnStop) {
1360
1712
  const tm = setTimeout(() => {
1361
1713
  if (this.isPlaying() || this.queue.tracks.size)
1362
1714
  return clearTimeout(tm);
1363
- this.queue.dispatcher?.disconnect();
1715
+ this.queue.dispatcher?.destroy();
1364
1716
  }, this.queue.options.leaveOnStopCooldown).unref();
1365
1717
  }
1366
1718
  return true;
@@ -1372,7 +1724,8 @@ var GuildQueuePlayerNode = class {
1372
1724
  if (!this.queue.dispatcher?.voiceConnection) {
1373
1725
  throw Exceptions.ERR_NO_VOICE_CONNECTION();
1374
1726
  }
1375
- this.queue.debug(`Received play request from guild ${this.queue.guild.name} (ID: ${this.queue.guild.id})`);
1727
+ if (this.queue.hasDebugger)
1728
+ this.queue.debug(`Received play request from guild ${this.queue.guild.name} (ID: ${this.queue.guild.id})`);
1376
1729
  options = Object.assign(
1377
1730
  {},
1378
1731
  {
@@ -1383,7 +1736,8 @@ var GuildQueuePlayerNode = class {
1383
1736
  options
1384
1737
  );
1385
1738
  if (res && options.queue) {
1386
- this.queue.debug("Requested option requires to queue the track, adding the given track to queue instead...");
1739
+ if (this.queue.hasDebugger)
1740
+ this.queue.debug("Requested option requires to queue the track, adding the given track to queue instead...");
1387
1741
  return this.queue.addTrack(res);
1388
1742
  }
1389
1743
  const track = res || this.queue.tracks.dispatch();
@@ -1392,12 +1746,15 @@ var GuildQueuePlayerNode = class {
1392
1746
  return;
1393
1747
  throw Exceptions.ERR_NO_RESULT("Play request received but track was not provided");
1394
1748
  }
1395
- this.queue.debug("Requested option requires to play the track, initializing...");
1749
+ if (this.queue.hasDebugger)
1750
+ this.queue.debug("Requested option requires to play the track, initializing...");
1396
1751
  try {
1397
- this.queue.debug(`Initiating stream extraction process...`);
1752
+ if (this.queue.hasDebugger)
1753
+ this.queue.debug(`Initiating stream extraction process...`);
1398
1754
  const src = track.raw?.source || track.source;
1399
1755
  const qt = track.queryType || (src === "spotify" ? "spotifySong" : src === "apple_music" ? "appleMusicSong" : src);
1400
- this.queue.debug(`Executing onBeforeCreateStream hook (QueryType: ${qt})...`);
1756
+ if (this.queue.hasDebugger)
1757
+ this.queue.debug(`Executing onBeforeCreateStream hook (QueryType: ${qt})...`);
1401
1758
  const streamSrc = {
1402
1759
  error: null,
1403
1760
  stream: null
@@ -1413,7 +1770,8 @@ var GuildQueuePlayerNode = class {
1413
1770
  if (!streamSrc.stream && streamSrc.error)
1414
1771
  return __privateMethod(this, _throw, throw_fn).call(this, track, streamSrc.error);
1415
1772
  if (!streamSrc.stream) {
1416
- this.queue.debug("Failed to get stream from onBeforeCreateStream!");
1773
+ if (this.queue.hasDebugger)
1774
+ this.queue.debug("Failed to get stream from onBeforeCreateStream!");
1417
1775
  await __privateMethod(this, _createGenericStream, createGenericStream_fn).call(this, track).then(
1418
1776
  (r) => {
1419
1777
  if (r?.result) {
@@ -1449,7 +1807,7 @@ var GuildQueuePlayerNode = class {
1449
1807
  defaultFilters: this.queue.filters._lastFiltersCache.filters,
1450
1808
  volume: this.queue.filters._lastFiltersCache.volume,
1451
1809
  data: track,
1452
- type: import_voice.StreamType.Raw
1810
+ type: import_voice3.StreamType.Raw
1453
1811
  };
1454
1812
  const trackStreamConfig = {
1455
1813
  dispatcherConfig: createStreamConfig,
@@ -1457,22 +1815,26 @@ var GuildQueuePlayerNode = class {
1457
1815
  };
1458
1816
  let resolver = Util.noop;
1459
1817
  const donePromise = new Promise((resolve) => resolver = resolve);
1460
- const success = this.queue.player.events.emit("willPlayTrack", this.queue, track, trackStreamConfig, resolver);
1818
+ const success = this.queue.emit(GuildQueueEvent.willPlayTrack, this.queue, track, trackStreamConfig, resolver);
1461
1819
  if (!success)
1462
1820
  resolver();
1463
1821
  await donePromise;
1464
1822
  const pcmStream = __privateMethod(this, _createFFmpegStream, createFFmpegStream_fn).call(this, streamSrc.stream, track, options.seek ?? 0, cookies);
1465
1823
  if (options.transitionMode) {
1466
- this.queue.debug(`Transition mode detected, player will wait for buffering timeout to expire (Timeout: ${this.queue.options.bufferingTimeout}ms)`);
1824
+ if (this.queue.hasDebugger)
1825
+ this.queue.debug(`Transition mode detected, player will wait for buffering timeout to expire (Timeout: ${this.queue.options.bufferingTimeout}ms)`);
1467
1826
  await (0, import_promises2.setTimeout)(this.queue.options.bufferingTimeout);
1468
- this.queue.debug("Buffering timeout has expired!");
1827
+ if (this.queue.hasDebugger)
1828
+ this.queue.debug("Buffering timeout has expired!");
1469
1829
  }
1470
- this.queue.debug(`Preparing final stream config: ${JSON.stringify(trackStreamConfig, null, 2)}`);
1830
+ if (this.queue.hasDebugger)
1831
+ this.queue.debug(`Preparing final stream config: ${JSON.stringify(trackStreamConfig, null, 2)}`);
1471
1832
  const resource = await this.queue.dispatcher.createStream(pcmStream, createStreamConfig);
1472
1833
  this.queue.setTransitioning(!!options.transitionMode);
1473
1834
  await __privateMethod(this, _performPlay, performPlay_fn).call(this, resource);
1474
1835
  } catch (e) {
1475
- this.queue.debug(`Failed to initialize audio player: ${e}`);
1836
+ if (this.queue.hasDebugger)
1837
+ this.queue.debug(`Failed to initialize audio player: ${e}`);
1476
1838
  throw e;
1477
1839
  }
1478
1840
  }
@@ -1485,8 +1847,8 @@ throw_fn = /* @__PURE__ */ __name(function(track, error) {
1485
1847
 
1486
1848
  ${error.stack || error}` : ""}`);
1487
1849
  if (this.queue.options.skipOnNoStream) {
1488
- this.queue.player.events.emit("playerSkip", this.queue, track);
1489
- this.queue.player.events.emit("playerError", this.queue, streamDefinitelyFailedMyDearT_TPleaseTrustMeItsNotMyFault, track);
1850
+ this.queue.emit(GuildQueueEvent.playerSkip, this.queue, track);
1851
+ this.queue.emit(GuildQueueEvent.playerError, this.queue, streamDefinitelyFailedMyDearT_TPleaseTrustMeItsNotMyFault, track);
1490
1852
  const nextTrack = this.queue.tracks.dispatch();
1491
1853
  if (nextTrack)
1492
1854
  this.play(nextTrack, { queue: false });
@@ -1496,13 +1858,16 @@ ${error.stack || error}` : ""}`);
1496
1858
  }, "#throw");
1497
1859
  _performPlay = new WeakSet();
1498
1860
  performPlay_fn = /* @__PURE__ */ __name(async function(resource) {
1499
- this.queue.debug("Initializing audio player...");
1861
+ if (this.queue.hasDebugger)
1862
+ this.queue.debug("Initializing audio player...");
1500
1863
  await this.queue.dispatcher.playStream(resource);
1501
- this.queue.debug("Dispatching audio...");
1864
+ if (this.queue.hasDebugger)
1865
+ this.queue.debug("Dispatching audio...");
1502
1866
  }, "#performPlay");
1503
1867
  _createGenericStream = new WeakSet();
1504
1868
  createGenericStream_fn = /* @__PURE__ */ __name(async function(track) {
1505
- this.queue.debug(`Attempting to extract stream for Track { title: ${track.title}, url: ${track.url} } using registered extractors`);
1869
+ if (this.queue.hasDebugger)
1870
+ this.queue.debug(`Attempting to extract stream for Track { title: ${track.title}, url: ${track.url} } using registered extractors`);
1506
1871
  const streamInfo = await this.queue.player.extractors.run(async (extractor) => {
1507
1872
  if (this.queue.player.options.blockStreamFrom?.some((ext) => ext === extractor.identifier))
1508
1873
  return false;
@@ -1512,230 +1877,40 @@ createGenericStream_fn = /* @__PURE__ */ __name(async function(track) {
1512
1877
  return await extractor.stream(track);
1513
1878
  }, false);
1514
1879
  if (!streamInfo || !streamInfo.result) {
1515
- this.queue.debug(`Failed to extract stream for Track { title: ${track.title}, url: ${track.url} } using registered extractors`);
1880
+ if (this.queue.hasDebugger)
1881
+ this.queue.debug(`Failed to extract stream for Track { title: ${track.title}, url: ${track.url} } using registered extractors`);
1516
1882
  return streamInfo || null;
1517
1883
  }
1518
- this.queue.debug(`Stream extraction was successful for Track { title: ${track.title}, url: ${track.url} } (Extractor: ${streamInfo.extractor?.identifier || "N/A"})`);
1884
+ if (this.queue.hasDebugger)
1885
+ this.queue.debug(`Stream extraction was successful for Track { title: ${track.title}, url: ${track.url} } (Extractor: ${streamInfo.extractor?.identifier || "N/A"})`);
1519
1886
  return streamInfo;
1520
1887
  }, "#createGenericStream");
1521
1888
  _createFFmpegStream = new WeakSet();
1522
1889
  createFFmpegStream_fn = /* @__PURE__ */ __name(function(stream, track, seek = 0, cookies) {
1523
1890
  const ffmpegStream = this.queue.filters.ffmpeg.createStream(stream, {
1524
- encoderArgs: this.queue.filters.ffmpeg.filters.length ? ["-af", this.queue.filters.ffmpeg.toString()] : [],
1891
+ encoderArgs: this.queue.filters.ffmpeg.args,
1525
1892
  seek: seek / 1e3,
1526
1893
  fmt: "s16le",
1527
1894
  cookies,
1528
1895
  useLegacyFFmpeg: !!this.queue.player.options.useLegacyFFmpeg
1529
1896
  }).on("error", (err) => {
1530
1897
  const m = `${err}`.toLowerCase();
1531
- this.queue.debug(`Stream closed due to an error from FFmpeg stream: ${err.stack || err.message || err}`);
1898
+ if (this.queue.hasDebugger)
1899
+ this.queue.debug(`Stream closed due to an error from FFmpeg stream: ${err.stack || err.message || err}`);
1532
1900
  if (m.includes("premature close") || m.includes("epipe"))
1533
1901
  return;
1534
- this.queue.player.events.emit("playerError", this.queue, err, track);
1902
+ this.queue.emit(GuildQueueEvent.playerError, this.queue, err, track);
1535
1903
  });
1536
1904
  return ffmpegStream;
1537
1905
  }, "#createFFmpegStream");
1538
1906
 
1539
1907
  // src/manager/GuildQueueAudioFilters.ts
1540
- var import_equalizer = require("@discord-player/equalizer");
1908
+ var import_equalizer2 = require("@discord-player/equalizer");
1541
1909
 
1542
1910
  // src/utils/FFmpegStream.ts
1543
- var prism = __toESM(require("prism-media"));
1544
-
1545
- // src/utils/FFmpeg.ts
1546
- var import_child_process = __toESM(require("child_process"));
1547
- var import_stream = require("stream");
1548
- var validatePathParam = /* @__PURE__ */ __name((t) => {
1549
- if (!TypeUtil.isString(t) || !t)
1550
- throw Exceptions.ERR_INVALID_ARG_TYPE(String(t), "string", typeof t);
1551
- return t;
1552
- }, "validatePathParam");
1553
- var ffmpegInfo = {
1554
- command: null,
1555
- metadata: null,
1556
- version: null,
1557
- isStatic: false
1558
- };
1559
- var isWindows = process.platform === "win32";
1560
- var FFmpegPossibleLocations = [
1561
- {
1562
- getPath() {
1563
- return validatePathParam(process.env.FFMPEG_PATH);
1564
- },
1565
- displayName: "spawn process.env.FFMPEG_PATH"
1566
- },
1567
- {
1568
- getPath() {
1569
- return "ffmpeg";
1570
- },
1571
- displayName: "spawn ffmpeg"
1572
- },
1573
- {
1574
- getPath() {
1575
- return "avconv";
1576
- },
1577
- displayName: "spawn avconv"
1578
- },
1579
- {
1580
- getPath() {
1581
- const loc = "./ffmpeg";
1582
- if (isWindows)
1583
- return loc.concat(".exe");
1584
- return loc;
1585
- },
1586
- displayName: "spawn ./ffmpeg"
1587
- },
1588
- {
1589
- getPath() {
1590
- const loc = "./avconv";
1591
- if (isWindows)
1592
- return loc.concat(".exe");
1593
- return loc;
1594
- },
1595
- displayName: "spawn ./avconv"
1596
- },
1597
- {
1598
- getPath() {
1599
- const mod = require("@ffmpeg-installer/ffmpeg");
1600
- return validatePathParam(mod.default?.path || mod.path || mod);
1601
- },
1602
- displayName: 'require("@ffmpeg-installer/ffmpeg")'
1603
- },
1604
- {
1605
- getPath() {
1606
- const mod = require("ffmpeg-static");
1607
- return validatePathParam(mod.default?.path || mod.path || mod);
1608
- },
1609
- displayName: 'require("ffmpeg-static")'
1610
- },
1611
- {
1612
- getPath() {
1613
- const mod = require("@node-ffmpeg/node-ffmpeg-installer");
1614
- return validatePathParam(mod.default?.path || mod.path || mod);
1615
- },
1616
- displayName: 'require("@node-ffmpeg/node-ffmpeg-installer")'
1617
- },
1618
- {
1619
- getPath() {
1620
- const mod = require("ffmpeg-binaries");
1621
- return validatePathParam(mod.default || mod);
1622
- },
1623
- displayName: 'require("ffmpeg-binaries")'
1624
- }
1625
- ];
1626
- var _FFmpeg = class extends import_stream.Duplex {
1627
- constructor(options = {}) {
1628
- super(options);
1629
- this.process = _FFmpeg.spawn(options);
1630
- const EVENTS = {
1631
- readable: this._reader,
1632
- data: this._reader,
1633
- end: this._reader,
1634
- unpipe: this._reader,
1635
- finish: this._writer,
1636
- drain: this._writer
1637
- };
1638
- this._readableState = this._reader._readableState;
1639
- this._writableState = this._writer._writableState;
1640
- this._copy(["write", "end"], this._writer);
1641
- this._copy(["read", "setEncoding", "pipe", "unpipe"], this._reader);
1642
- for (const method of ["on", "once", "removeListener", "removeAllListeners", "listeners"]) {
1643
- this[method] = (ev, fn) => EVENTS[ev] ? EVENTS[ev][method](ev, fn) : import_stream.Duplex.prototype[method].call(this, ev, fn);
1644
- }
1645
- const processError = /* @__PURE__ */ __name((error) => this.emit("error", error), "processError");
1646
- this._reader.on("error", processError);
1647
- this._writer.on("error", processError);
1648
- }
1649
- static spawn({ args = [], shell = false } = {}) {
1650
- if (!args.includes("-i"))
1651
- args.unshift("-i", "-");
1652
- return import_child_process.default.spawn(this.locate().command, args.concat(["pipe:1"]), { windowsHide: true, shell });
1653
- }
1654
- static isAvailable() {
1655
- return typeof this.locateSafe(false)?.command === "string";
1656
- }
1657
- static locateSafe(force = false) {
1658
- try {
1659
- return this.locate(force);
1660
- } catch {
1661
- return null;
1662
- }
1663
- }
1664
- static locate(force = false) {
1665
- if (ffmpegInfo.command && !force)
1666
- return ffmpegInfo;
1667
- const errStacks = new Array(FFmpegPossibleLocations.length);
1668
- for (const locator of FFmpegPossibleLocations) {
1669
- if (locator == null)
1670
- continue;
1671
- try {
1672
- const command = locator.getPath();
1673
- const result = import_child_process.default.spawnSync(command, ["-h"], {
1674
- windowsHide: true
1675
- });
1676
- if (result.error)
1677
- throw result.error;
1678
- ffmpegInfo.command = command;
1679
- ffmpegInfo.metadata = Buffer.concat(result.output.filter(Boolean)).toString();
1680
- ffmpegInfo.isStatic = locator.displayName.startsWith('require("');
1681
- ffmpegInfo.version = _FFmpeg.VersionRegex.exec(ffmpegInfo.metadata || "")?.[1] || null;
1682
- if (ffmpegInfo.isStatic && !("DP_NO_FFMPEG_WARN" in process.env)) {
1683
- Util.warn("Found ffmpeg-static which is known to be unstable.", "FFmpegStaticWarning");
1684
- }
1685
- return ffmpegInfo;
1686
- } catch (e) {
1687
- errStacks.push(e);
1688
- }
1689
- }
1690
- throw Exceptions.ERR_FFMPEG_LOCATOR([
1691
- "Could not locate ffmpeg. Tried:\n",
1692
- ...FFmpegPossibleLocations.map((loc, i) => ` ${++i}. ${loc.displayName}`),
1693
- "\n",
1694
- `${"=".repeat(5)}Full Stacktrace${"=".repeat(5)}`,
1695
- ...errStacks.map((e) => e.stack || e.message)
1696
- ].join("\n"));
1697
- }
1698
- get _reader() {
1699
- return this.process.stdout;
1700
- }
1701
- get _writer() {
1702
- return this.process.stdin;
1703
- }
1704
- _copy(methods, target2) {
1705
- for (const method of methods) {
1706
- this[method] = target2[method].bind(target2);
1707
- }
1708
- }
1709
- _destroy(err, cb) {
1710
- this._cleanup();
1711
- if (cb)
1712
- return cb(err);
1713
- }
1714
- _final(cb) {
1715
- this._cleanup();
1716
- cb();
1717
- }
1718
- _cleanup() {
1719
- if (this.process) {
1720
- this.once("error", () => {
1721
- });
1722
- this.process.kill("SIGKILL");
1723
- this.process = null;
1724
- }
1725
- }
1726
- toString() {
1727
- if (!ffmpegInfo.metadata)
1728
- return "FFmpeg";
1729
- return ffmpegInfo.metadata;
1730
- }
1731
- };
1732
- var FFmpeg = _FFmpeg;
1733
- __name(FFmpeg, "FFmpeg");
1734
- FFmpeg.VersionRegex = /version (.+) Copyright/im;
1735
- var findFFmpeg = FFmpeg.locate;
1736
-
1737
- // src/utils/FFmpegStream.ts
1738
- var getFFmpegProvider = /* @__PURE__ */ __name((legacy = false) => legacy ? prism.default?.FFmpeg || prism.FFmpeg : FFmpeg, "getFFmpegProvider");
1911
+ var prism2 = __toESM(require("prism-media"));
1912
+ var import_ffmpeg = require("@discord-player/ffmpeg");
1913
+ var getFFmpegProvider = /* @__PURE__ */ __name((legacy = false) => legacy ? prism2.default?.FFmpeg || prism2.FFmpeg : import_ffmpeg.FFmpeg, "getFFmpegProvider");
1739
1914
  function FFMPEG_ARGS_STRING(stream, fmt, cookies) {
1740
1915
  const args = [
1741
1916
  "-reconnect",
@@ -1802,7 +1977,7 @@ __name(createFFmpegStream, "createFFmpegStream");
1802
1977
  var makeBands = /* @__PURE__ */ __name((arr) => {
1803
1978
  return Array.from(
1804
1979
  {
1805
- length: import_equalizer.Equalizer.BAND_COUNT
1980
+ length: import_equalizer2.Equalizer.BAND_COUNT
1806
1981
  },
1807
1982
  (_, i) => ({
1808
1983
  band: i,
@@ -1830,14 +2005,33 @@ var EqualizerConfigurationPreset = {
1830
2005
  SoftRock: makeBands([4, 4, 2.4, -111022e-20, -4, -5.6, -3.2, -111022e-20, 2.4, 8.8]),
1831
2006
  Techno: makeBands([8, 5.6, -111022e-20, -5.6, -4.8, -111022e-20, 8, 9.6, 9.6, 8.8])
1832
2007
  };
1833
- var _ffmpegFilters, _setFilters, setFilters_fn;
2008
+ var _ffmpegFilters, _inputArgs, _setFilters, setFilters_fn;
1834
2009
  var FFmpegFilterer = class {
1835
2010
  constructor(af) {
1836
2011
  this.af = af;
1837
2012
  __privateAdd(this, _setFilters);
1838
2013
  __privateAdd(this, _ffmpegFilters, []);
2014
+ __privateAdd(this, _inputArgs, []);
2015
+ }
2016
+ setInputArgs(args) {
2017
+ if (!args.every((arg) => typeof arg === "string"))
2018
+ throw Exceptions.ERR_INVALID_ARG_TYPE("args", "Array<string>", "invalid item(s)");
2019
+ __privateSet(this, _inputArgs, args);
2020
+ }
2021
+ get inputArgs() {
2022
+ return __privateGet(this, _inputArgs);
2023
+ }
2024
+ get encoderArgs() {
2025
+ if (!this.filters.length)
2026
+ return [];
2027
+ return ["-af", this.toString()];
2028
+ }
2029
+ get args() {
2030
+ return this.inputArgs.concat(this.encoderArgs);
1839
2031
  }
1840
2032
  createStream(source, options) {
2033
+ if (__privateGet(this, _inputArgs).length)
2034
+ options.encoderArgs = [...__privateGet(this, _inputArgs), ...options.encoderArgs || []];
1841
2035
  return createFFmpegStream(source, options);
1842
2036
  }
1843
2037
  setFilters(filters) {
@@ -1900,6 +2094,7 @@ var FFmpegFilterer = class {
1900
2094
  };
1901
2095
  __name(FFmpegFilterer, "FFmpegFilterer");
1902
2096
  _ffmpegFilters = new WeakMap();
2097
+ _inputArgs = new WeakMap();
1903
2098
  _setFilters = new WeakSet();
1904
2099
  setFilters_fn = /* @__PURE__ */ __name(function(filters) {
1905
2100
  const { queue } = this.af;
@@ -1908,7 +2103,7 @@ setFilters_fn = /* @__PURE__ */ __name(function(filters) {
1908
2103
  const seekTime = queue.node.getTimestamp(ignoreFilters)?.current.value || 0;
1909
2104
  __privateSet(this, _ffmpegFilters, [...new Set(filters)]);
1910
2105
  return this.af.triggerReplay(seekTime).then((t) => {
1911
- queue.player.events.emit("audioFiltersUpdate", queue, prev, __privateGet(this, _ffmpegFilters).slice());
2106
+ queue.emit(GuildQueueEvent.audioFiltersUpdate, queue, prev, __privateGet(this, _ffmpegFilters).slice());
1912
2107
  return t;
1913
2108
  });
1914
2109
  }, "#setFilters");
@@ -2029,7 +2224,7 @@ var GuildQueueStatistics = class {
2029
2224
  memoryUsage: process.memoryUsage(),
2030
2225
  versions: {
2031
2226
  node: process.version,
2032
- player: "6.5.0"
2227
+ player: "6.6.0-dev.0"
2033
2228
  }
2034
2229
  };
2035
2230
  }
@@ -2038,11 +2233,12 @@ __name(GuildQueueStatistics, "GuildQueueStatistics");
2038
2233
 
2039
2234
  // src/manager/GuildQueue.ts
2040
2235
  var GuildQueueEvent = {
2041
- audioTrackAdd: "audioTrackadd",
2236
+ audioTrackAdd: "audioTrackAdd",
2042
2237
  audioTracksAdd: "audioTracksAdd",
2043
2238
  audioTrackRemove: "audioTrackRemove",
2044
2239
  audioTracksRemove: "audioTracksRemove",
2045
2240
  connection: "connection",
2241
+ connectionDestroyed: "connectionDestroyed",
2046
2242
  disconnect: "disconnect",
2047
2243
  debug: "debug",
2048
2244
  error: "error",
@@ -2061,10 +2257,13 @@ var GuildQueueEvent = {
2061
2257
  equalizerUpdate: "equalizerUpdate",
2062
2258
  dspUpdate: "dspUpdate",
2063
2259
  audioFiltersUpdate: "audioFiltersUpdate",
2064
- willPlayTrack: "willPlayTrack"
2260
+ willPlayTrack: "willPlayTrack",
2261
+ channelPopulate: "channelPopulate",
2262
+ queueCreate: "queueCreate",
2263
+ queueDelete: "queueDelete"
2065
2264
  };
2066
2265
  var _transitioning, _deleted, _attachListeners, attachListeners_fn, _removeListeners, removeListeners_fn, _performStart, performStart_fn, _performFinish, performFinish_fn, _emitEnd, emitEnd_fn, _handleAutoplay, handleAutoplay_fn;
2067
- var GuildQueue = class {
2266
+ var GuildQueue4 = class {
2068
2267
  constructor(player, options) {
2069
2268
  this.player = player;
2070
2269
  this.options = options;
@@ -2084,13 +2283,13 @@ var GuildQueue = class {
2084
2283
  this.onBeforeCreateStream = /* @__PURE__ */ __name(async () => null, "onBeforeCreateStream");
2085
2284
  this.onAfterCreateStream = /* @__PURE__ */ __name(async (stream) => ({
2086
2285
  stream,
2087
- type: import_voice2.StreamType.Raw
2286
+ type: import_voice4.StreamType.Raw
2088
2287
  }), "onAfterCreateStream");
2089
2288
  this.repeatMode = 0 /* OFF */;
2090
- this.timeouts = new import_utils4.Collection();
2289
+ this.timeouts = new import_utils5.Collection();
2091
2290
  this.stats = new GuildQueueStatistics(this);
2092
2291
  this.tasksQueue = new AsyncQueue();
2093
- this.tracks = new import_utils4.Queue(options.queueStrategy);
2292
+ this.tracks = new import_utils5.Queue(options.queueStrategy);
2094
2293
  if (TypeUtil.isFunction(options.onBeforeCreateStream))
2095
2294
  this.onBeforeCreateStream = options.onBeforeCreateStream;
2096
2295
  if (TypeUtil.isFunction(options.onAfterCreateStream))
@@ -2125,7 +2324,9 @@ var GuildQueue = class {
2125
2324
  options.maxSize = Infinity;
2126
2325
  if (options.maxHistorySize < 1)
2127
2326
  options.maxHistorySize = Infinity;
2128
- this.debug(`GuildQueue initialized for guild ${this.options.guild.name} (ID: ${this.options.guild.id})`);
2327
+ if (this.hasDebugger)
2328
+ this.debug(`GuildQueue initialized for guild ${this.options.guild.name} (ID: ${this.options.guild.id})`);
2329
+ this.emit(GuildQueueEvent.queueCreate, this);
2129
2330
  }
2130
2331
  get estimatedDuration() {
2131
2332
  return this.tracks.store.reduce((a, c) => a + c.durationMS, 0);
@@ -2137,7 +2338,7 @@ var GuildQueue = class {
2137
2338
  return this.dispatcher?.receiver ?? null;
2138
2339
  }
2139
2340
  debug(m) {
2140
- this.player.events.emit("debug", this, m);
2341
+ this.emit(GuildQueueEvent.debug, this, m);
2141
2342
  }
2142
2343
  get metadata() {
2143
2344
  return this.options.metadata;
@@ -2243,9 +2444,9 @@ var GuildQueue = class {
2243
2444
  VALIDATE_QUEUE_CAP(this, toAdd);
2244
2445
  this.tracks.add(toAdd);
2245
2446
  if (isMulti) {
2246
- this.player.events.emit("audioTracksAdd", this, toAdd);
2447
+ this.emit(GuildQueueEvent.audioTracksAdd, this, toAdd);
2247
2448
  } else {
2248
- this.player.events.emit("audioTrackAdd", this, toAdd);
2449
+ this.emit(GuildQueueEvent.audioTrackAdd, this, toAdd);
2249
2450
  }
2250
2451
  }
2251
2452
  removeTrack(track) {
@@ -2263,24 +2464,44 @@ var GuildQueue = class {
2263
2464
  swapTracks(src, dest) {
2264
2465
  return this.node.swap(src, dest);
2265
2466
  }
2467
+ createDispatcher(connection, options = {}) {
2468
+ if (connection.state.status === import_voice4.VoiceConnectionStatus.Destroyed) {
2469
+ throw Exceptions.ERR_VOICE_CONNECTION_DESTROYED();
2470
+ }
2471
+ const channel = this.player.client.channels.cache.get(connection.joinConfig.channelId);
2472
+ if (!channel)
2473
+ throw Exceptions.ERR_NO_VOICE_CHANNEL();
2474
+ if (!channel.isVoiceBased())
2475
+ throw Exceptions.ERR_INVALID_ARG_TYPE("channel", `VoiceBasedChannel (type ${import_discord3.ChannelType.GuildVoice}/${import_discord3.ChannelType.GuildStageVoice})`, String(channel?.type));
2476
+ if (this.dispatcher) {
2477
+ __privateMethod(this, _removeListeners, removeListeners_fn).call(this, this.dispatcher);
2478
+ this.dispatcher.destroy();
2479
+ this.dispatcher = null;
2480
+ }
2481
+ this.dispatcher = new StreamDispatcher(connection, channel, this, options.timeout ?? this.options.connectionTimeout, options.audioPlayer);
2482
+ }
2266
2483
  async connect(channelResolvable, options = {}) {
2267
2484
  const channel = this.player.client.channels.resolve(channelResolvable);
2268
2485
  if (!channel || !channel.isVoiceBased()) {
2269
2486
  throw Exceptions.ERR_INVALID_ARG_TYPE("channel", `VoiceBasedChannel (type ${import_discord3.ChannelType.GuildVoice}/${import_discord3.ChannelType.GuildStageVoice})`, String(channel?.type));
2270
2487
  }
2271
- this.debug(`Connecting to ${channel.type === import_discord3.ChannelType.GuildStageVoice ? "stage" : "voice"} channel ${channel.name} (ID: ${channel.id})`);
2272
- if (this.dispatcher) {
2273
- this.debug("Destroying old connection");
2488
+ if (this.hasDebugger)
2489
+ this.debug(`Connecting to ${channel.type === import_discord3.ChannelType.GuildStageVoice ? "stage" : "voice"} channel ${channel.name} (ID: ${channel.id})`);
2490
+ if (this.dispatcher && channel.id !== this.dispatcher.channel.id) {
2491
+ if (this.hasDebugger)
2492
+ this.debug("Destroying old connection");
2274
2493
  __privateMethod(this, _removeListeners, removeListeners_fn).call(this, this.dispatcher);
2275
- this.dispatcher.disconnect();
2494
+ this.dispatcher.destroy();
2495
+ this.dispatcher = null;
2276
2496
  }
2277
2497
  this.dispatcher = await this.player.voiceUtils.connect(channel, {
2278
2498
  deaf: options.deaf ?? this.options.selfDeaf ?? true,
2279
2499
  maxTime: options?.timeout ?? this.options.connectionTimeout ?? 12e4,
2280
2500
  queue: this,
2281
- audioPlayer: options?.audioPlayer
2501
+ audioPlayer: options?.audioPlayer,
2502
+ group: options.group
2282
2503
  });
2283
- this.player.events.emit("connection", this);
2504
+ this.emit(GuildQueueEvent.connection, this);
2284
2505
  if (this.channel.type === import_discord3.ChannelType.GuildStageVoice) {
2285
2506
  await this.channel.guild.members.me.voice.setSuppressed(false).catch(async () => {
2286
2507
  return await this.channel.guild.members.me.voice.setRequestToSpeak(true).catch(Util.noop);
@@ -2295,13 +2516,16 @@ var GuildQueue = class {
2295
2516
  delete() {
2296
2517
  if (this.player.nodes.delete(this.id)) {
2297
2518
  __privateSet(this, _deleted, true);
2519
+ this.emit(GuildQueueEvent.queueDelete, this);
2298
2520
  }
2299
2521
  }
2300
2522
  revive() {
2301
2523
  if (!this.deleted || this.player.nodes.has(this.id))
2302
2524
  return;
2303
2525
  __privateSet(this, _deleted, false);
2526
+ this.setTransitioning(false);
2304
2527
  this.player.nodes.cache.set(this.id, this);
2528
+ this.player.events.emit(GuildQueueEvent.queueCreate, this);
2305
2529
  }
2306
2530
  setSelfDeaf(mode, reason) {
2307
2531
  return this.guild.members.me.voice.setDeaf(mode, reason);
@@ -2314,94 +2538,114 @@ var GuildQueue = class {
2314
2538
  throw Exceptions.ERR_NO_VOICE_CONNECTION();
2315
2539
  return this.player.play(this.channel, track, options);
2316
2540
  }
2541
+ emit(event, ...args) {
2542
+ if (this.deleted)
2543
+ return false;
2544
+ return this.player.events.emit(event, ...args);
2545
+ }
2546
+ get hasDebugger() {
2547
+ return this.player.events.listenerCount(GuildQueueEvent.debug) > 0;
2548
+ }
2317
2549
  };
2318
- __name(GuildQueue, "GuildQueue");
2550
+ __name(GuildQueue4, "GuildQueue");
2319
2551
  _transitioning = new WeakMap();
2320
2552
  _deleted = new WeakMap();
2321
2553
  _attachListeners = new WeakSet();
2322
2554
  attachListeners_fn = /* @__PURE__ */ __name(function(dispatcher) {
2323
- dispatcher.on("error", (e) => this.player.events.emit("error", this, e));
2324
- dispatcher.on("debug", (m) => this.player.events.emit("debug", this, m));
2555
+ dispatcher.on("error", (e) => this.emit(GuildQueueEvent.error, this, e));
2556
+ dispatcher.on("debug", (m) => this.hasDebugger && this.emit(GuildQueueEvent.debug, this, m));
2325
2557
  dispatcher.on("finish", (r) => __privateMethod(this, _performFinish, performFinish_fn).call(this, r));
2326
2558
  dispatcher.on("start", (r) => __privateMethod(this, _performStart, performStart_fn).call(this, r));
2559
+ dispatcher.on("destroyed", () => {
2560
+ __privateMethod(this, _removeListeners, removeListeners_fn).call(this, dispatcher);
2561
+ this.dispatcher = null;
2562
+ });
2327
2563
  dispatcher.on("dsp", (f) => {
2328
2564
  if (!Object.is(this.filters._lastFiltersCache.filters, f)) {
2329
- this.player.events.emit("dspUpdate", this, this.filters._lastFiltersCache.filters, f);
2565
+ this.emit(GuildQueueEvent.dspUpdate, this, this.filters._lastFiltersCache.filters, f);
2330
2566
  }
2331
2567
  this.filters._lastFiltersCache.filters = f;
2332
2568
  });
2333
2569
  dispatcher.on("biquad", (f) => {
2334
2570
  if (this.filters._lastFiltersCache.biquad !== f) {
2335
- this.player.events.emit("biquadFiltersUpdate", this, this.filters._lastFiltersCache.biquad, f);
2571
+ this.emit(GuildQueueEvent.biquadFiltersUpdate, this, this.filters._lastFiltersCache.biquad, f);
2336
2572
  }
2337
2573
  this.filters._lastFiltersCache.biquad = f;
2338
2574
  });
2339
2575
  dispatcher.on("eqBands", (f) => {
2340
2576
  if (!Object.is(f, this.filters._lastFiltersCache.equalizer)) {
2341
- this.player.events.emit("equalizerUpdate", this, this.filters._lastFiltersCache.equalizer, f);
2577
+ this.emit(GuildQueueEvent.equalizerUpdate, this, this.filters._lastFiltersCache.equalizer, f);
2342
2578
  }
2343
2579
  this.filters._lastFiltersCache.equalizer = f;
2344
2580
  });
2345
2581
  dispatcher.on("volume", (f) => {
2346
2582
  if (this.filters._lastFiltersCache.volume !== f)
2347
- this.player.events.emit("volumeChange", this, this.filters._lastFiltersCache.volume, f);
2583
+ this.emit(GuildQueueEvent.volumeChange, this, this.filters._lastFiltersCache.volume, f);
2348
2584
  this.filters._lastFiltersCache.volume = f;
2349
2585
  });
2350
2586
  }, "#attachListeners");
2351
2587
  _removeListeners = new WeakSet();
2352
- removeListeners_fn = /* @__PURE__ */ __name(function(dispatcher) {
2353
- dispatcher.removeAllListeners();
2588
+ removeListeners_fn = /* @__PURE__ */ __name(function(target2) {
2589
+ target2.removeAllListeners();
2354
2590
  }, "#removeListeners");
2355
2591
  _performStart = new WeakSet();
2356
2592
  performStart_fn = /* @__PURE__ */ __name(function(resource) {
2357
2593
  const track = resource?.metadata || this.currentTrack;
2358
2594
  const reason = this.isTransitioning() ? "filters" : "normal";
2359
- this.debug(
2360
- `Player triggered for Track ${JSON.stringify({
2361
- title: track?.title,
2362
- reason
2363
- })}`
2364
- );
2365
- this.player.events.emit("playerTrigger", this, track, reason);
2595
+ if (this.hasDebugger)
2596
+ this.debug(
2597
+ `Player triggered for Track ${JSON.stringify({
2598
+ title: track?.title,
2599
+ reason
2600
+ })}`
2601
+ );
2602
+ this.emit(GuildQueueEvent.playerTrigger, this, track, reason);
2366
2603
  if (track && !this.isTransitioning())
2367
- this.player.events.emit("playerStart", this, track);
2604
+ this.emit(GuildQueueEvent.playerStart, this, track);
2368
2605
  this.setTransitioning(false);
2369
2606
  }, "#performStart");
2370
2607
  _performFinish = new WeakSet();
2371
2608
  performFinish_fn = /* @__PURE__ */ __name(function(resource) {
2372
2609
  const track = resource?.metadata || this.currentTrack;
2373
- this.debug(
2374
- `Track ${JSON.stringify({
2375
- title: track?.title,
2376
- isTransitionMode: this.isTransitioning()
2377
- })} was marked as finished`
2378
- );
2610
+ if (this.hasDebugger)
2611
+ this.debug(
2612
+ `Track ${JSON.stringify({
2613
+ title: track?.title,
2614
+ isTransitionMode: this.isTransitioning()
2615
+ })} was marked as finished`
2616
+ );
2379
2617
  if (track && !this.isTransitioning()) {
2380
- this.debug("Adding track to history and emitting finish event since transition mode is disabled...");
2618
+ if (this.hasDebugger)
2619
+ this.debug("Adding track to history and emitting finish event since transition mode is disabled...");
2381
2620
  this.history.push(track);
2382
2621
  this.node.resetProgress();
2383
- this.player.events.emit("playerFinish", this, track);
2622
+ this.emit(GuildQueueEvent.playerFinish, this, track);
2384
2623
  if (this.tracks.size < 1 && this.repeatMode === 0 /* OFF */) {
2385
- this.debug("No more tracks left in the queue to play and repeat mode is off, initiating #emitEnd()");
2624
+ if (this.hasDebugger)
2625
+ this.debug("No more tracks left in the queue to play and repeat mode is off, initiating #emitEnd()");
2386
2626
  __privateMethod(this, _emitEnd, emitEnd_fn).call(this);
2387
2627
  } else {
2388
2628
  if (this.repeatMode === 1 /* TRACK */) {
2389
- this.debug("Repeat mode is set to track, repeating last track from the history...");
2629
+ if (this.hasDebugger)
2630
+ this.debug("Repeat mode is set to track, repeating last track from the history...");
2390
2631
  this.__current = this.history.tracks.dispatch() || track;
2391
2632
  return this.node.play(this.__current, { queue: false });
2392
2633
  }
2393
2634
  if (this.repeatMode === 2 /* QUEUE */) {
2394
- this.debug("Repeat mode is set to queue, moving last track from the history to current queue...");
2635
+ if (this.hasDebugger)
2636
+ this.debug("Repeat mode is set to queue, moving last track from the history to current queue...");
2395
2637
  this.tracks.add(this.history.tracks.dispatch() || track);
2396
2638
  }
2397
2639
  if (!this.tracks.size) {
2398
2640
  if (this.repeatMode === 3 /* AUTOPLAY */) {
2399
- this.debug("Repeat mode is set to autoplay, initiating autoplay handler...");
2641
+ if (this.hasDebugger)
2642
+ this.debug("Repeat mode is set to autoplay, initiating autoplay handler...");
2400
2643
  __privateMethod(this, _handleAutoplay, handleAutoplay_fn).call(this, track);
2401
2644
  return;
2402
2645
  }
2403
2646
  } else {
2404
- this.debug("Initializing next track of the queue...");
2647
+ if (this.hasDebugger)
2648
+ this.debug("Initializing next track of the queue...");
2405
2649
  this.__current = this.tracks.dispatch();
2406
2650
  this.node.play(this.__current, {
2407
2651
  queue: false
@@ -2413,7 +2657,7 @@ performFinish_fn = /* @__PURE__ */ __name(function(resource) {
2413
2657
  _emitEnd = new WeakSet();
2414
2658
  emitEnd_fn = /* @__PURE__ */ __name(function() {
2415
2659
  this.__current = null;
2416
- this.player.events.emit("emptyQueue", this);
2660
+ this.emit(GuildQueueEvent.emptyQueue, this);
2417
2661
  if (this.options.leaveOnEnd) {
2418
2662
  const tm = (0, import_timers.setTimeout)(() => {
2419
2663
  if (this.isPlaying())
@@ -2425,22 +2669,28 @@ emitEnd_fn = /* @__PURE__ */ __name(function() {
2425
2669
  _handleAutoplay = new WeakSet();
2426
2670
  handleAutoplay_fn = /* @__PURE__ */ __name(async function(track) {
2427
2671
  try {
2428
- this.debug(`Autoplay >> Finding related tracks for Track ${track.title} (${track.url}) [ext:${track.extractor?.identifier || "N/A"}]`);
2672
+ if (this.hasDebugger)
2673
+ this.debug(`Autoplay >> Finding related tracks for Track ${track.title} (${track.url}) [ext:${track.extractor?.identifier || "N/A"}]`);
2429
2674
  const tracks = (await track.extractor?.getRelatedTracks(track))?.tracks || (await this.player.extractors.run(async (ext) => {
2430
- this.debug(`Autoplay >> Querying extractor ${ext.identifier}`);
2675
+ if (this.hasDebugger)
2676
+ this.debug(`Autoplay >> Querying extractor ${ext.identifier}`);
2431
2677
  const res = await ext.getRelatedTracks(track);
2432
2678
  if (!res.tracks.length) {
2433
- this.debug(`Autoplay >> Extractor ${ext.identifier} failed to provide results.`);
2679
+ if (this.hasDebugger)
2680
+ this.debug(`Autoplay >> Extractor ${ext.identifier} failed to provide results.`);
2434
2681
  return false;
2435
2682
  }
2436
- this.debug(`Autoplay >> Extractor ${ext.identifier} successfully returned results.`);
2683
+ if (this.hasDebugger)
2684
+ this.debug(`Autoplay >> Extractor ${ext.identifier} successfully returned results.`);
2437
2685
  return res.tracks;
2438
2686
  }))?.result || [];
2439
2687
  if (!tracks?.length) {
2440
- this.debug(`Autoplay >> No related tracks found.`);
2688
+ if (this.hasDebugger)
2689
+ this.debug(`Autoplay >> No related tracks found.`);
2441
2690
  throw "no related tracks";
2442
2691
  }
2443
- this.debug(`Autoplay >> Picking random track from first 5 tracks...`);
2692
+ if (this.hasDebugger)
2693
+ this.debug(`Autoplay >> Picking random track from first 5 tracks...`);
2444
2694
  const nextTrack = Util.randomChoice(tracks.slice(0, 5));
2445
2695
  await this.node.play(nextTrack, {
2446
2696
  queue: false,
@@ -2453,9 +2703,9 @@ handleAutoplay_fn = /* @__PURE__ */ __name(async function(track) {
2453
2703
  }, "#handleAutoplay");
2454
2704
 
2455
2705
  // src/utils/__internal__/_container.ts
2456
- var import_utils5 = require("@discord-player/utils");
2457
- var instances = new import_utils5.Collection();
2458
- var globalRegistry = new import_utils5.Collection();
2706
+ var import_utils6 = require("@discord-player/utils");
2707
+ var instances = new import_utils6.Collection();
2708
+ var globalRegistry = new import_utils6.Collection();
2459
2709
 
2460
2710
  // src/utils/__internal__/addPlayer.ts
2461
2711
  function addPlayer(player) {
@@ -2474,467 +2724,127 @@ __name(clearPlayer, "clearPlayer");
2474
2724
 
2475
2725
  // src/utils/__internal__/getPlayers.ts
2476
2726
  function getPlayers() {
2477
- return instances.array();
2478
- }
2479
- __name(getPlayers, "getPlayers");
2480
-
2481
- // src/utils/__internal__/getGlobalRegistry.ts
2482
- function getGlobalRegistry() {
2483
- return globalRegistry;
2484
- }
2485
- __name(getGlobalRegistry, "getGlobalRegistry");
2486
-
2487
- // src/manager/GuildNodeManager.ts
2488
- var GuildNodeManager = class {
2489
- constructor(player) {
2490
- this.player = player;
2491
- this.cache = new import_utils6.Collection();
2492
- }
2493
- create(guild, options = {}) {
2494
- const server = this.player.client.guilds.resolve(guild);
2495
- if (!server) {
2496
- throw Exceptions.ERR_NO_GUILD("Invalid or unknown guild");
2497
- }
2498
- if (this.cache.has(server.id)) {
2499
- return this.cache.get(server.id);
2500
- }
2501
- options.strategy ?? (options.strategy = "FIFO");
2502
- options.volume ?? (options.volume = 100);
2503
- options.equalizer ?? (options.equalizer = []);
2504
- options.a_filter ?? (options.a_filter = []);
2505
- options.disableHistory ?? (options.disableHistory = false);
2506
- options.skipOnNoStream ?? (options.skipOnNoStream = false);
2507
- options.leaveOnEmpty ?? (options.leaveOnEmpty = true);
2508
- options.leaveOnEmptyCooldown ?? (options.leaveOnEmptyCooldown = 0);
2509
- options.leaveOnEnd ?? (options.leaveOnEnd = true);
2510
- options.leaveOnEndCooldown ?? (options.leaveOnEndCooldown = 0);
2511
- options.leaveOnStop ?? (options.leaveOnStop = true);
2512
- options.leaveOnStopCooldown ?? (options.leaveOnStopCooldown = 0);
2513
- options.resampler ?? (options.resampler = 48e3);
2514
- options.selfDeaf ?? (options.selfDeaf = true);
2515
- options.connectionTimeout ?? (options.connectionTimeout = this.player.options.connectionTimeout);
2516
- options.bufferingTimeout ?? (options.bufferingTimeout = 1e3);
2517
- options.maxSize ?? (options.maxSize = Infinity);
2518
- options.maxHistorySize ?? (options.maxHistorySize = Infinity);
2519
- options.preferBridgedMetadata = Boolean(options.preferBridgedMetadata);
2520
- if (getGlobalRegistry().has("@[onBeforeCreateStream]") && !options.onBeforeCreateStream) {
2521
- options.onBeforeCreateStream = getGlobalRegistry().get("@[onBeforeCreateStream]");
2522
- }
2523
- if (getGlobalRegistry().has("@[onAfterCreateStream]") && !options.onAfterCreateStream) {
2524
- options.onAfterCreateStream = getGlobalRegistry().get("@[onAfterCreateStream]");
2525
- }
2526
- const queue = new GuildQueue(this.player, {
2527
- guild: server,
2528
- queueStrategy: options.strategy,
2529
- volume: options.volume,
2530
- equalizer: options.equalizer,
2531
- filterer: options.a_filter,
2532
- biquad: options.biquad,
2533
- resampler: options.resampler,
2534
- disableHistory: options.disableHistory,
2535
- skipOnNoStream: options.skipOnNoStream,
2536
- onBeforeCreateStream: options.onBeforeCreateStream,
2537
- onAfterCreateStream: options.onAfterCreateStream,
2538
- repeatMode: options.repeatMode,
2539
- leaveOnEmpty: options.leaveOnEmpty,
2540
- leaveOnEmptyCooldown: options.leaveOnEmptyCooldown,
2541
- leaveOnEnd: options.leaveOnEnd,
2542
- leaveOnEndCooldown: options.leaveOnEndCooldown,
2543
- leaveOnStop: options.leaveOnStop,
2544
- leaveOnStopCooldown: options.leaveOnStopCooldown,
2545
- metadata: options.metadata,
2546
- connectionTimeout: options.connectionTimeout ?? 12e4,
2547
- selfDeaf: options.selfDeaf,
2548
- ffmpegFilters: options.defaultFFmpegFilters ?? [],
2549
- bufferingTimeout: options.bufferingTimeout,
2550
- noEmitInsert: options.noEmitInsert ?? false,
2551
- preferBridgedMetadata: options.preferBridgedMetadata,
2552
- maxHistorySize: options.maxHistorySize,
2553
- maxSize: options.maxSize
2554
- });
2555
- this.cache.set(server.id, queue);
2556
- return queue;
2557
- }
2558
- get(node) {
2559
- const queue = this.resolve(node);
2560
- if (!queue)
2561
- return null;
2562
- return this.cache.get(queue.id) || null;
2563
- }
2564
- has(node) {
2565
- const id = node instanceof GuildQueue ? node.id : this.player.client.guilds.resolveId(node);
2566
- return this.cache.has(id);
2567
- }
2568
- delete(node) {
2569
- const queue = this.resolve(node);
2570
- if (!queue) {
2571
- throw Exceptions.ERR_NO_GUILD_QUEUE("Cannot delete non-existing queue");
2572
- }
2573
- queue.node.stop(true);
2574
- queue.connection?.removeAllListeners();
2575
- queue.dispatcher?.removeAllListeners();
2576
- queue.dispatcher?.disconnect();
2577
- queue.timeouts.forEach((tm) => clearTimeout(tm));
2578
- queue.history.clear();
2579
- queue.tracks.clear();
2580
- return this.cache.delete(queue.id);
2581
- }
2582
- resolve(node) {
2583
- if (node instanceof GuildQueue) {
2584
- return node;
2585
- }
2586
- return this.cache.get(this.player.client.guilds.resolveId(node));
2587
- }
2588
- resolveId(node) {
2589
- const q = this.resolve(node);
2590
- return q?.id || null;
2591
- }
2592
- };
2593
- __name(GuildNodeManager, "GuildNodeManager");
2594
-
2595
- // src/manager/VoiceReceiverNode.ts
2596
- var import_stream2 = require("stream");
2597
- var import_voice3 = require("@discordjs/voice");
2598
- var prism2 = __toESM(require("prism-media"));
2599
- var VoiceReceiverNode = class {
2600
- constructor(dispatcher) {
2601
- this.dispatcher = dispatcher;
2602
- }
2603
- createRawTrack(stream, data = {}) {
2604
- data.title ?? (data.title = `Recording ${Date.now()}`);
2605
- return new Track(this.dispatcher.queue.player, {
2606
- author: "Discord",
2607
- description: data.title,
2608
- title: data.title,
2609
- duration: data.duration || "0:00",
2610
- views: 0,
2611
- requestedBy: data.requestedBy,
2612
- thumbnail: data.thumbnail || "https://cdn.discordapp.com/embed/avatars/0.png",
2613
- url: data.url || "https://discord.com",
2614
- source: "arbitrary",
2615
- raw: {
2616
- engine: stream,
2617
- source: "arbitrary"
2618
- }
2619
- });
2620
- }
2621
- mergeRecordings(streams) {
2622
- throw Exceptions.ERR_NOT_IMPLEMENTED(`${this.constructor.name}.mergeRecordings()`);
2623
- }
2624
- recordUser(user, options = {
2625
- end: import_voice3.EndBehaviorType.AfterSilence,
2626
- mode: "pcm",
2627
- silenceDuration: 1e3
2628
- }) {
2629
- const _user = this.dispatcher.queue.player.client.users.resolveId(user);
2630
- const passThrough = new import_stream2.PassThrough();
2631
- const receiver = this.dispatcher.voiceConnection.receiver;
2632
- if (!receiver)
2633
- throw Exceptions.ERR_NO_RECEIVER();
2634
- receiver.speaking.on("start", (userId) => {
2635
- if (userId === _user) {
2636
- const receiveStream = receiver.subscribe(_user, {
2637
- end: {
2638
- behavior: options.end || import_voice3.EndBehaviorType.AfterSilence,
2639
- duration: options.silenceDuration ?? 1e3
2640
- }
2641
- });
2642
- setImmediate(async () => {
2643
- if (options.mode === "pcm") {
2644
- const pcm = receiveStream.pipe(
2645
- new (prism2.opus || prism2.default.opus).Decoder({
2646
- channels: 2,
2647
- frameSize: 960,
2648
- rate: 48e3
2649
- })
2650
- );
2651
- return pcm.pipe(passThrough);
2652
- } else {
2653
- return receiveStream.pipe(passThrough);
2654
- }
2655
- }).unref();
2656
- }
2657
- });
2658
- return passThrough;
2659
- }
2660
- };
2661
- __name(VoiceReceiverNode, "VoiceReceiverNode");
2662
-
2663
- // src/VoiceInterface/VoiceUtils.ts
2664
- var import_voice5 = require("@discordjs/voice");
2665
-
2666
- // src/VoiceInterface/StreamDispatcher.ts
2667
- var import_voice4 = require("@discordjs/voice");
2668
- var import_utils7 = require("@discord-player/utils");
2669
- var import_equalizer2 = require("@discord-player/equalizer");
2670
- var needsKeepAlivePatch = (() => {
2671
- if ("DP_NO_KEEPALIVE_PATCH" in process.env)
2672
- return false;
2673
- if (import_voice4.version.includes("-dev") || import_voice4.version.startsWith("1"))
2674
- return false;
2675
- const [, minor, patch] = import_voice4.version.split(".").map((n) => parseInt(n));
2676
- if (isNaN(minor))
2677
- return false;
2678
- return minor > 14 ? false : minor < 15 && patch < 1;
2679
- })();
2680
- var StreamDispatcher = class extends import_utils7.EventEmitter {
2681
- constructor(connection, channel, queue, connectionTimeout = 2e4, audioPlayer) {
2682
- super();
2683
- this.queue = queue;
2684
- this.connectionTimeout = connectionTimeout;
2685
- this.receiver = new VoiceReceiverNode(this);
2686
- this.readyLock = false;
2687
- this.dsp = new import_equalizer2.FiltersChain();
2688
- this.voiceConnection = connection;
2689
- this.audioPlayer = audioPlayer || (0, import_voice4.createAudioPlayer)({
2690
- debug: this.queue.player.events.eventNames().includes("debug")
2691
- });
2692
- this.channel = channel;
2693
- this.voiceConnection.on("debug", (m) => void this.emit("debug", m));
2694
- this.voiceConnection.on("error", (error) => void this.emit("error", error));
2695
- this.audioPlayer.on("debug", (m) => void this.emit("debug", m));
2696
- this.audioPlayer.on("error", (error) => void this.emit("error", error));
2697
- this.dsp.onUpdate = () => {
2698
- if (!this.dsp)
2699
- return;
2700
- if (this.dsp.filters?.filters)
2701
- this.emit("dsp", this.dsp.filters?.filters);
2702
- if (this.dsp.biquad?.filter)
2703
- this.emit("biquad", this.dsp.biquad?.filter);
2704
- if (this.dsp.equalizer)
2705
- this.emit("eqBands", this.dsp.equalizer.getEQ());
2706
- if (this.dsp.volume)
2707
- this.emit("volume", this.dsp.volume.volume);
2708
- if (this.dsp.resampler)
2709
- this.emit("sampleRate", this.dsp.resampler.targetSampleRate);
2710
- };
2711
- this.dsp.onError = (e) => this.emit("error", e);
2712
- this.voiceConnection.on("stateChange", async (oldState, newState) => {
2713
- if (needsKeepAlivePatch) {
2714
- this.queue.debug(`Detected @discordjs/voice version ${import_voice4.version} which needs keepAlive patch, applying patch...`);
2715
- const oldNetworking = Reflect.get(oldState, "networking");
2716
- const newNetworking = Reflect.get(newState, "networking");
2717
- const networkStateChangeHandler = /* @__PURE__ */ __name((_, newNetworkState) => {
2718
- const newUdp = Reflect.get(newNetworkState, "udp");
2719
- clearInterval(newUdp?.keepAliveInterval);
2720
- }, "networkStateChangeHandler");
2721
- oldNetworking?.off("stateChange", networkStateChangeHandler);
2722
- newNetworking?.on("stateChange", networkStateChangeHandler);
2723
- }
2724
- if (newState.status === import_voice4.VoiceConnectionStatus.Disconnected) {
2725
- if (newState.reason === import_voice4.VoiceConnectionDisconnectReason.WebSocketClose && newState.closeCode === 4014) {
2726
- try {
2727
- await (0, import_voice4.entersState)(this.voiceConnection, import_voice4.VoiceConnectionStatus.Connecting, this.connectionTimeout);
2728
- } catch {
2729
- try {
2730
- if (this.voiceConnection.state.status !== import_voice4.VoiceConnectionStatus.Destroyed)
2731
- this.voiceConnection.destroy();
2732
- } catch (err) {
2733
- this.emit("error", err);
2734
- }
2735
- }
2736
- } else if (this.voiceConnection.rejoinAttempts < 5) {
2737
- await Util.wait((this.voiceConnection.rejoinAttempts + 1) * 5e3);
2738
- this.voiceConnection.rejoin();
2739
- } else {
2740
- try {
2741
- if (this.voiceConnection.state.status !== import_voice4.VoiceConnectionStatus.Destroyed)
2742
- this.voiceConnection.destroy();
2743
- } catch (err) {
2744
- this.emit("error", err);
2745
- }
2746
- }
2747
- } else if (newState.status === import_voice4.VoiceConnectionStatus.Destroyed) {
2748
- this.end();
2749
- } else if (!this.readyLock && (newState.status === import_voice4.VoiceConnectionStatus.Connecting || newState.status === import_voice4.VoiceConnectionStatus.Signalling)) {
2750
- this.readyLock = true;
2751
- try {
2752
- await (0, import_voice4.entersState)(this.voiceConnection, import_voice4.VoiceConnectionStatus.Ready, this.connectionTimeout);
2753
- } catch {
2754
- if (this.voiceConnection.state.status !== import_voice4.VoiceConnectionStatus.Destroyed) {
2755
- try {
2756
- this.voiceConnection.destroy();
2757
- } catch (err) {
2758
- this.emit("error", err);
2759
- }
2760
- }
2761
- } finally {
2762
- this.readyLock = false;
2763
- }
2764
- }
2765
- });
2766
- this.audioPlayer.on("stateChange", (oldState, newState) => {
2767
- if (oldState.status !== import_voice4.AudioPlayerStatus.Paused && newState.status === import_voice4.AudioPlayerStatus.Paused) {
2768
- this.queue.player.events.emit("playerPause", this.queue);
2769
- }
2770
- if (oldState.status === import_voice4.AudioPlayerStatus.Paused && newState.status !== import_voice4.AudioPlayerStatus.Paused) {
2771
- this.queue.player.events.emit("playerResume", this.queue);
2772
- }
2773
- if (newState.status === import_voice4.AudioPlayerStatus.Playing) {
2774
- if (oldState.status === import_voice4.AudioPlayerStatus.Idle || oldState.status === import_voice4.AudioPlayerStatus.Buffering) {
2775
- return this.emit("start", this.audioResource);
2776
- }
2777
- } else if (newState.status === import_voice4.AudioPlayerStatus.Idle && oldState.status !== import_voice4.AudioPlayerStatus.Idle) {
2778
- this.emit("finish", this.audioResource);
2779
- this.dsp.destroy();
2780
- this.audioResource = null;
2781
- }
2782
- });
2783
- this.voiceConnection.subscribe(this.audioPlayer);
2784
- }
2785
- get paused() {
2786
- return this.audioPlayer.state.status === import_voice4.AudioPlayerStatus.Paused;
2787
- }
2788
- set paused(val) {
2789
- val ? this.pause(true) : this.resume();
2790
- }
2791
- isPaused() {
2792
- return this.paused || this.audioPlayer.state.status === import_voice4.AudioPlayerStatus.AutoPaused;
2793
- }
2794
- isBuffering() {
2795
- return this.audioPlayer.state.status === import_voice4.AudioPlayerStatus.Buffering;
2796
- }
2797
- isPlaying() {
2798
- return this.audioPlayer.state.status === import_voice4.AudioPlayerStatus.Playing;
2799
- }
2800
- isIdle() {
2801
- return this.audioPlayer.state.status === import_voice4.AudioPlayerStatus.Idle;
2802
- }
2803
- isDestroyed() {
2804
- return this.voiceConnection.state.status === import_voice4.VoiceConnectionStatus.Destroyed;
2805
- }
2806
- isDisconnected() {
2807
- return this.voiceConnection.state.status === import_voice4.VoiceConnectionStatus.Disconnected;
2808
- }
2809
- isReady() {
2810
- return this.voiceConnection.state.status === import_voice4.VoiceConnectionStatus.Ready;
2811
- }
2812
- isSignalling() {
2813
- return this.voiceConnection.state.status === import_voice4.VoiceConnectionStatus.Signalling;
2814
- }
2815
- isConnecting() {
2816
- return this.voiceConnection.state.status === import_voice4.VoiceConnectionStatus.Connecting;
2817
- }
2818
- async createStream(src, ops) {
2819
- if (!ops?.disableFilters)
2820
- this.queue.debug("Initiating DSP filters pipeline...");
2821
- const stream = !ops?.disableFilters ? this.dsp.create(src, {
2822
- dsp: {
2823
- filters: ops?.defaultFilters,
2824
- disabled: ops?.disableFilters
2825
- },
2826
- biquad: ops?.biquadFilter ? {
2827
- filter: ops.biquadFilter,
2828
- disabled: ops?.disableBiquad
2829
- } : void 0,
2830
- resampler: {
2831
- targetSampleRate: ops?.sampleRate,
2832
- disabled: ops?.disableResampler
2833
- },
2834
- equalizer: {
2835
- bandMultiplier: ops?.eq,
2836
- disabled: ops?.disableEqualizer
2837
- },
2838
- volume: {
2839
- volume: ops?.volume,
2840
- disabled: ops?.disableVolume
2841
- }
2842
- }) : src;
2843
- this.queue.debug("Executing onAfterCreateStream hook...");
2844
- const postStream = await this.queue.onAfterCreateStream?.(stream, this.queue).catch(
2845
- () => ({
2846
- stream,
2847
- type: ops?.type ?? import_voice4.StreamType.Arbitrary
2848
- })
2849
- );
2850
- this.queue.debug("Preparing AudioResource...");
2851
- this.audioResource = (0, import_voice4.createAudioResource)(postStream?.stream ?? stream, {
2852
- inputType: postStream?.type ?? ops?.type ?? import_voice4.StreamType.Arbitrary,
2853
- metadata: ops?.data,
2854
- inlineVolume: false
2855
- });
2856
- return this.audioResource;
2857
- }
2858
- get resampler() {
2859
- return this.dsp?.resampler;
2860
- }
2861
- get filters() {
2862
- return this.dsp?.filters;
2863
- }
2864
- get biquad() {
2865
- return this.dsp?.biquad || null;
2866
- }
2867
- get equalizer() {
2868
- return this.dsp?.equalizer || null;
2869
- }
2870
- get status() {
2871
- return this.audioPlayer.state.status;
2727
+ return instances.array();
2728
+ }
2729
+ __name(getPlayers, "getPlayers");
2730
+
2731
+ // src/utils/__internal__/getGlobalRegistry.ts
2732
+ function getGlobalRegistry() {
2733
+ return globalRegistry;
2734
+ }
2735
+ __name(getGlobalRegistry, "getGlobalRegistry");
2736
+
2737
+ // src/manager/GuildNodeManager.ts
2738
+ var GuildNodeManager = class {
2739
+ constructor(player) {
2740
+ this.player = player;
2741
+ this.cache = new import_utils7.Collection();
2872
2742
  }
2873
- disconnect() {
2874
- try {
2875
- if (this.audioPlayer)
2876
- this.audioPlayer.stop(true);
2877
- if (this.voiceConnection.state.status !== import_voice4.VoiceConnectionStatus.Destroyed)
2878
- this.voiceConnection.destroy();
2879
- } catch {
2743
+ create(guild, options = {}) {
2744
+ const server = this.player.client.guilds.resolve(guild);
2745
+ if (!server) {
2746
+ throw Exceptions.ERR_NO_GUILD("Invalid or unknown guild");
2880
2747
  }
2881
- }
2882
- end() {
2883
- try {
2884
- this.audioPlayer.stop();
2885
- } catch {
2748
+ if (this.cache.has(server.id)) {
2749
+ return this.cache.get(server.id);
2750
+ }
2751
+ options.strategy ?? (options.strategy = "FIFO");
2752
+ options.volume ?? (options.volume = 100);
2753
+ options.equalizer ?? (options.equalizer = []);
2754
+ options.a_filter ?? (options.a_filter = []);
2755
+ options.disableHistory ?? (options.disableHistory = false);
2756
+ options.skipOnNoStream ?? (options.skipOnNoStream = false);
2757
+ options.leaveOnEmpty ?? (options.leaveOnEmpty = true);
2758
+ options.leaveOnEmptyCooldown ?? (options.leaveOnEmptyCooldown = 0);
2759
+ options.leaveOnEnd ?? (options.leaveOnEnd = true);
2760
+ options.leaveOnEndCooldown ?? (options.leaveOnEndCooldown = 0);
2761
+ options.leaveOnStop ?? (options.leaveOnStop = true);
2762
+ options.leaveOnStopCooldown ?? (options.leaveOnStopCooldown = 0);
2763
+ options.resampler ?? (options.resampler = 48e3);
2764
+ options.selfDeaf ?? (options.selfDeaf = true);
2765
+ options.connectionTimeout ?? (options.connectionTimeout = this.player.options.connectionTimeout);
2766
+ options.bufferingTimeout ?? (options.bufferingTimeout = 1e3);
2767
+ options.maxSize ?? (options.maxSize = Infinity);
2768
+ options.maxHistorySize ?? (options.maxHistorySize = Infinity);
2769
+ options.preferBridgedMetadata = Boolean(options.preferBridgedMetadata);
2770
+ if (getGlobalRegistry().has("@[onBeforeCreateStream]") && !options.onBeforeCreateStream) {
2771
+ options.onBeforeCreateStream = getGlobalRegistry().get("@[onBeforeCreateStream]");
2772
+ }
2773
+ if (getGlobalRegistry().has("@[onAfterCreateStream]") && !options.onAfterCreateStream) {
2774
+ options.onAfterCreateStream = getGlobalRegistry().get("@[onAfterCreateStream]");
2886
2775
  }
2776
+ const queue = new GuildQueue4(this.player, {
2777
+ guild: server,
2778
+ queueStrategy: options.strategy,
2779
+ volume: options.volume,
2780
+ equalizer: options.equalizer,
2781
+ filterer: options.a_filter,
2782
+ biquad: options.biquad,
2783
+ resampler: options.resampler,
2784
+ disableHistory: options.disableHistory,
2785
+ skipOnNoStream: options.skipOnNoStream,
2786
+ onBeforeCreateStream: options.onBeforeCreateStream,
2787
+ onAfterCreateStream: options.onAfterCreateStream,
2788
+ repeatMode: options.repeatMode,
2789
+ leaveOnEmpty: options.leaveOnEmpty,
2790
+ leaveOnEmptyCooldown: options.leaveOnEmptyCooldown,
2791
+ leaveOnEnd: options.leaveOnEnd,
2792
+ leaveOnEndCooldown: options.leaveOnEndCooldown,
2793
+ leaveOnStop: options.leaveOnStop,
2794
+ leaveOnStopCooldown: options.leaveOnStopCooldown,
2795
+ metadata: options.metadata,
2796
+ connectionTimeout: options.connectionTimeout ?? 12e4,
2797
+ selfDeaf: options.selfDeaf,
2798
+ ffmpegFilters: options.defaultFFmpegFilters ?? [],
2799
+ bufferingTimeout: options.bufferingTimeout,
2800
+ noEmitInsert: options.noEmitInsert ?? false,
2801
+ preferBridgedMetadata: options.preferBridgedMetadata,
2802
+ maxHistorySize: options.maxHistorySize,
2803
+ maxSize: options.maxSize
2804
+ });
2805
+ this.cache.set(server.id, queue);
2806
+ return queue;
2887
2807
  }
2888
- pause(interpolateSilence) {
2889
- const success = this.audioPlayer.pause(interpolateSilence);
2890
- return success;
2808
+ get(node) {
2809
+ const queue = this.resolve(node);
2810
+ if (!queue)
2811
+ return null;
2812
+ return this.cache.get(queue.id) || null;
2891
2813
  }
2892
- resume() {
2893
- const success = this.audioPlayer.unpause();
2894
- return success;
2814
+ has(node) {
2815
+ const id = node instanceof GuildQueue4 ? node.id : this.player.client.guilds.resolveId(node);
2816
+ return this.cache.has(id);
2895
2817
  }
2896
- async playStream(resource = this.audioResource) {
2897
- if (!resource) {
2898
- throw Exceptions.ERR_NO_AUDIO_RESOURCE();
2899
- }
2900
- if (resource.ended) {
2901
- return void this.emit("finish", resource);
2902
- }
2903
- if (!this.audioResource)
2904
- this.audioResource = resource;
2905
- if (this.voiceConnection.state.status !== import_voice4.VoiceConnectionStatus.Ready) {
2906
- try {
2907
- await (0, import_voice4.entersState)(this.voiceConnection, import_voice4.VoiceConnectionStatus.Ready, this.connectionTimeout);
2908
- } catch (err) {
2909
- return void this.emit("error", err);
2910
- }
2911
- }
2912
- try {
2913
- this.audioPlayer.play(resource);
2914
- } catch (e) {
2915
- this.emit("error", e);
2818
+ delete(node) {
2819
+ const queue = this.resolve(node);
2820
+ if (!queue) {
2821
+ throw Exceptions.ERR_NO_GUILD_QUEUE("Cannot delete non-existing queue");
2916
2822
  }
2917
- return this;
2918
- }
2919
- setVolume(value) {
2920
- if (!this.dsp.volume)
2921
- return false;
2922
- return this.dsp.volume.setVolume(value);
2823
+ queue.setTransitioning(true);
2824
+ queue.node.stop(true);
2825
+ queue.connection?.removeAllListeners();
2826
+ queue.dispatcher?.removeAllListeners();
2827
+ queue.dispatcher?.disconnect();
2828
+ queue.timeouts.forEach((tm) => clearTimeout(tm));
2829
+ queue.history.clear();
2830
+ queue.tracks.clear();
2831
+ return this.cache.delete(queue.id);
2923
2832
  }
2924
- get volume() {
2925
- if (!this.dsp.volume)
2926
- return 100;
2927
- return this.dsp.volume.volume;
2833
+ resolve(node) {
2834
+ if (node instanceof GuildQueue4) {
2835
+ return node;
2836
+ }
2837
+ return this.cache.get(this.player.client.guilds.resolveId(node));
2928
2838
  }
2929
- get streamTime() {
2930
- if (!this.audioResource)
2931
- return 0;
2932
- return this.audioResource.playbackDuration;
2839
+ resolveId(node) {
2840
+ const q = this.resolve(node);
2841
+ return q?.id || null;
2933
2842
  }
2934
2843
  };
2935
- __name(StreamDispatcher, "StreamDispatcher");
2844
+ __name(GuildNodeManager, "GuildNodeManager");
2936
2845
 
2937
2846
  // src/VoiceInterface/VoiceUtils.ts
2847
+ var import_voice5 = require("@discordjs/voice");
2938
2848
  var import_utils8 = require("@discord-player/utils");
2939
2849
  var VoiceUtils = class {
2940
2850
  constructor(player) {
@@ -2955,7 +2865,8 @@ var VoiceUtils = class {
2955
2865
  channelId: channel.id,
2956
2866
  adapterCreator: channel.guild.voiceAdapterCreator,
2957
2867
  selfDeaf: Boolean(options?.deaf),
2958
- debug: this.player.events.eventNames().includes("debug")
2868
+ debug: this.player.events.listenerCount("debug") > 0,
2869
+ group: options?.group
2959
2870
  });
2960
2871
  return conn;
2961
2872
  }
@@ -2968,8 +2879,8 @@ var VoiceUtils = class {
2968
2879
  } catch {
2969
2880
  }
2970
2881
  }
2971
- getConnection(guild) {
2972
- return this.cache.get(guild) || (0, import_voice5.getVoiceConnection)(guild);
2882
+ getConnection(guild, group) {
2883
+ return this.cache.get(guild) || (0, import_voice5.getVoiceConnection)(guild, group);
2973
2884
  }
2974
2885
  };
2975
2886
  __name(VoiceUtils, "VoiceUtils");
@@ -3044,11 +2955,114 @@ var DiscordPlayerQueryResultCache = class {
3044
2955
  };
3045
2956
  __name(DiscordPlayerQueryResultCache, "DiscordPlayerQueryResultCache");
3046
2957
 
2958
+ // src/index.ts
2959
+ __reExport(src_exports, require("@discord-player/ffmpeg"), module.exports);
2960
+
3047
2961
  // src/Player.ts
3048
- var import_discord4 = require("discord.js");
2962
+ var import_ffmpeg2 = require("@discord-player/ffmpeg");
2963
+ var import_discord5 = require("discord.js");
3049
2964
  var import_voice6 = require("@discordjs/voice");
2965
+
2966
+ // src/DefaultVoiceStateHandler.ts
2967
+ var import_discord4 = require("discord.js");
2968
+ async function defaultVoiceStateHandler(player, queue, oldState, newState) {
2969
+ if (!queue || !queue.connection || !queue.channel)
2970
+ return;
2971
+ if (oldState.channelId && !newState.channelId && newState.member?.id === newState.guild.members.me?.id) {
2972
+ try {
2973
+ queue.delete();
2974
+ } catch {
2975
+ }
2976
+ return void player.events.emit(GuildQueueEvent.disconnect, queue);
2977
+ }
2978
+ if (!oldState.channelId && newState.channelId && newState.member?.id === newState.guild.members.me?.id) {
2979
+ if (newState.serverMute != null && oldState.serverMute !== newState.serverMute) {
2980
+ queue.node.setPaused(newState.serverMute);
2981
+ } else if (newState.channel?.type === import_discord4.ChannelType.GuildStageVoice && newState.suppress != null && oldState.suppress !== newState.suppress) {
2982
+ queue.node.setPaused(newState.suppress);
2983
+ if (newState.suppress) {
2984
+ newState.guild.members.me?.voice.setRequestToSpeak(true).catch(Util.noop);
2985
+ }
2986
+ }
2987
+ }
2988
+ if (!newState.channelId && oldState.channelId === queue.channel.id) {
2989
+ if (!Util.isVoiceEmpty(queue.channel))
2990
+ return;
2991
+ const timeout = setTimeout(() => {
2992
+ if (!Util.isVoiceEmpty(queue.channel))
2993
+ return;
2994
+ if (!player.nodes.has(queue.guild.id))
2995
+ return;
2996
+ if (queue.options.leaveOnEmpty)
2997
+ queue.delete();
2998
+ player.events.emit(GuildQueueEvent.emptyChannel, queue);
2999
+ }, queue.options.leaveOnEmptyCooldown || 0).unref();
3000
+ queue.timeouts.set(`empty_${oldState.guild.id}`, timeout);
3001
+ }
3002
+ if (newState.channelId && newState.channelId === queue.channel.id) {
3003
+ const emptyTimeout = queue.timeouts.get(`empty_${oldState.guild.id}`);
3004
+ const channelEmpty = Util.isVoiceEmpty(queue.channel);
3005
+ if (!channelEmpty && emptyTimeout) {
3006
+ clearTimeout(emptyTimeout);
3007
+ queue.timeouts.delete(`empty_${oldState.guild.id}`);
3008
+ player.events.emit(GuildQueueEvent.channelPopulate, queue);
3009
+ }
3010
+ }
3011
+ if (oldState.channelId && newState.channelId && oldState.channelId !== newState.channelId) {
3012
+ if (newState.member?.id === newState.guild.members.me?.id) {
3013
+ if (queue.connection && newState.member?.id === newState.guild.members.me?.id)
3014
+ queue.channel = newState.channel;
3015
+ const emptyTimeout = queue.timeouts.get(`empty_${oldState.guild.id}`);
3016
+ const channelEmpty = Util.isVoiceEmpty(queue.channel);
3017
+ if (!channelEmpty && emptyTimeout) {
3018
+ clearTimeout(emptyTimeout);
3019
+ queue.timeouts.delete(`empty_${oldState.guild.id}`);
3020
+ player.events.emit(GuildQueueEvent.channelPopulate, queue);
3021
+ } else {
3022
+ const timeout = setTimeout(() => {
3023
+ if (queue.connection && !Util.isVoiceEmpty(queue.channel))
3024
+ return;
3025
+ if (!player.nodes.has(queue.guild.id))
3026
+ return;
3027
+ if (queue.options.leaveOnEmpty)
3028
+ queue.delete();
3029
+ player.events.emit(GuildQueueEvent.emptyChannel, queue);
3030
+ }, queue.options.leaveOnEmptyCooldown || 0).unref();
3031
+ queue.timeouts.set(`empty_${oldState.guild.id}`, timeout);
3032
+ }
3033
+ } else {
3034
+ if (newState.channelId !== queue.channel.id) {
3035
+ if (!Util.isVoiceEmpty(queue.channel))
3036
+ return;
3037
+ if (queue.timeouts.has(`empty_${oldState.guild.id}`))
3038
+ return;
3039
+ const timeout = setTimeout(() => {
3040
+ if (!Util.isVoiceEmpty(queue.channel))
3041
+ return;
3042
+ if (!player.nodes.has(queue.guild.id))
3043
+ return;
3044
+ if (queue.options.leaveOnEmpty)
3045
+ queue.delete();
3046
+ player.events.emit(GuildQueueEvent.emptyChannel, queue);
3047
+ }, queue.options.leaveOnEmptyCooldown || 0).unref();
3048
+ queue.timeouts.set(`empty_${oldState.guild.id}`, timeout);
3049
+ } else {
3050
+ const emptyTimeout = queue.timeouts.get(`empty_${oldState.guild.id}`);
3051
+ const channelEmpty = Util.isVoiceEmpty(queue.channel);
3052
+ if (!channelEmpty && emptyTimeout) {
3053
+ clearTimeout(emptyTimeout);
3054
+ queue.timeouts.delete(`empty_${oldState.guild.id}`);
3055
+ player.events.emit(GuildQueueEvent.channelPopulate, queue);
3056
+ }
3057
+ }
3058
+ }
3059
+ }
3060
+ }
3061
+ __name(defaultVoiceStateHandler, "defaultVoiceStateHandler");
3062
+
3063
+ // src/Player.ts
3050
3064
  var kSingleton = Symbol("InstanceDiscordPlayerSingleton");
3051
- var _lastLatency, _voiceStateUpdateListener, _lagMonitorTimeout, _lagMonitorInterval;
3065
+ var _lastLatency, _voiceStateUpdateListener, _lagMonitorTimeout, _lagMonitorInterval, _onVoiceStateUpdate;
3052
3066
  var _Player = class extends PlayerEventsEmitter {
3053
3067
  constructor(client, options = {}) {
3054
3068
  if (!options.ignoreInstance && kSingleton in _Player)
@@ -3058,14 +3072,15 @@ var _Player = class extends PlayerEventsEmitter {
3058
3072
  __privateAdd(this, _voiceStateUpdateListener, this.handleVoiceState.bind(this));
3059
3073
  __privateAdd(this, _lagMonitorTimeout, void 0);
3060
3074
  __privateAdd(this, _lagMonitorInterval, void 0);
3061
- this.id = import_discord4.SnowflakeUtil.generate().toString();
3075
+ __privateAdd(this, _onVoiceStateUpdate, defaultVoiceStateHandler);
3076
+ this.id = import_discord5.SnowflakeUtil.generate().toString();
3062
3077
  this.nodes = new GuildNodeManager(this);
3063
3078
  this.voiceUtils = new VoiceUtils(this);
3064
3079
  this.extractors = new ExtractorExecutionContext(this);
3065
3080
  this.events = new PlayerEventsEmitter(["error", "playerError"]);
3066
3081
  this.client = client;
3067
- const ibf = this.client.options.intents instanceof import_discord4.IntentsBitField ? this.client.options.intents : new import_discord4.IntentsBitField(this.client.options.intents);
3068
- if (!ibf.has(import_discord4.IntentsBitField.Flags.GuildVoiceStates)) {
3082
+ const ibf = this.client.options.intents instanceof import_discord5.IntentsBitField ? this.client.options.intents : new import_discord5.IntentsBitField(this.client.options.intents);
3083
+ if (!ibf.has(import_discord5.IntentsBitField.Flags.GuildVoiceStates)) {
3069
3084
  Util.warn('client is missing "GuildVoiceStates" intent', "InvalidIntentsBitField");
3070
3085
  }
3071
3086
  this.options = {
@@ -3089,7 +3104,8 @@ var _Player = class extends PlayerEventsEmitter {
3089
3104
  const start = performance.now();
3090
3105
  __privateSet(this, _lagMonitorTimeout, setTimeout(() => {
3091
3106
  __privateSet(this, _lastLatency, performance.now() - start);
3092
- this.debug(`[Lag Monitor] Event loop latency: ${__privateGet(this, _lastLatency)}ms`);
3107
+ if (this.hasDebugger)
3108
+ this.debug(`[Lag Monitor] Event loop latency: ${__privateGet(this, _lastLatency)}ms`);
3093
3109
  }, 0).unref());
3094
3110
  }, this.options.lagMonitor).unref());
3095
3111
  }
@@ -3103,6 +3119,12 @@ var _Player = class extends PlayerEventsEmitter {
3103
3119
  });
3104
3120
  }
3105
3121
  }
3122
+ get hasDebugger() {
3123
+ return this.listenerCount("debug") > 0;
3124
+ }
3125
+ onVoiceStateUpdate(handler2) {
3126
+ __privateSet(this, _onVoiceStateUpdate, handler2);
3127
+ }
3106
3128
  debug(m) {
3107
3129
  return this.emit("debug", m);
3108
3130
  }
@@ -3151,95 +3173,10 @@ var _Player = class extends PlayerEventsEmitter {
3151
3173
  const queue = this.nodes.get(oldState.guild.id);
3152
3174
  if (!queue || !queue.connection || !queue.channel)
3153
3175
  return;
3154
- const wasHandled = this.events.emit("voiceStateUpdate", queue, oldState, newState);
3176
+ const wasHandled = this.events.emit(GuildQueueEvent.voiceStateUpdate, queue, oldState, newState);
3155
3177
  if (wasHandled && !this.options.lockVoiceStateHandler)
3156
3178
  return;
3157
- if (oldState.channelId && !newState.channelId && newState.member?.id === newState.guild.members.me?.id) {
3158
- try {
3159
- queue.delete();
3160
- } catch {
3161
- }
3162
- return void this.events.emit("disconnect", queue);
3163
- }
3164
- if (!oldState.channelId && newState.channelId && newState.member?.id === newState.guild.members.me?.id) {
3165
- if (newState.serverMute != null && oldState.serverMute !== newState.serverMute) {
3166
- queue.node.setPaused(newState.serverMute);
3167
- } else if (newState.channel?.type === import_discord4.ChannelType.GuildStageVoice && newState.suppress != null && oldState.suppress !== newState.suppress) {
3168
- queue.node.setPaused(newState.suppress);
3169
- if (newState.suppress) {
3170
- newState.guild.members.me?.voice.setRequestToSpeak(true).catch(Util.noop);
3171
- }
3172
- }
3173
- }
3174
- if (!newState.channelId && oldState.channelId === queue.channel.id) {
3175
- if (!Util.isVoiceEmpty(queue.channel))
3176
- return;
3177
- const timeout = setTimeout(() => {
3178
- if (!Util.isVoiceEmpty(queue.channel))
3179
- return;
3180
- if (!this.nodes.has(queue.guild.id))
3181
- return;
3182
- if (queue.options.leaveOnEmpty)
3183
- queue.delete();
3184
- this.events.emit("emptyChannel", queue);
3185
- }, queue.options.leaveOnEmptyCooldown || 0).unref();
3186
- queue.timeouts.set(`empty_${oldState.guild.id}`, timeout);
3187
- }
3188
- if (newState.channelId && newState.channelId === queue.channel.id) {
3189
- const emptyTimeout = queue.timeouts.get(`empty_${oldState.guild.id}`);
3190
- const channelEmpty = Util.isVoiceEmpty(queue.channel);
3191
- if (!channelEmpty && emptyTimeout) {
3192
- clearTimeout(emptyTimeout);
3193
- queue.timeouts.delete(`empty_${oldState.guild.id}`);
3194
- }
3195
- }
3196
- if (oldState.channelId && newState.channelId && oldState.channelId !== newState.channelId) {
3197
- if (newState.member?.id === newState.guild.members.me?.id) {
3198
- if (queue.connection && newState.member?.id === newState.guild.members.me?.id)
3199
- queue.channel = newState.channel;
3200
- const emptyTimeout = queue.timeouts.get(`empty_${oldState.guild.id}`);
3201
- const channelEmpty = Util.isVoiceEmpty(queue.channel);
3202
- if (!channelEmpty && emptyTimeout) {
3203
- clearTimeout(emptyTimeout);
3204
- queue.timeouts.delete(`empty_${oldState.guild.id}`);
3205
- } else {
3206
- const timeout = setTimeout(() => {
3207
- if (queue.connection && !Util.isVoiceEmpty(queue.channel))
3208
- return;
3209
- if (!this.nodes.has(queue.guild.id))
3210
- return;
3211
- if (queue.options.leaveOnEmpty)
3212
- queue.delete();
3213
- this.events.emit("emptyChannel", queue);
3214
- }, queue.options.leaveOnEmptyCooldown || 0).unref();
3215
- queue.timeouts.set(`empty_${oldState.guild.id}`, timeout);
3216
- }
3217
- } else {
3218
- if (newState.channelId !== queue.channel.id) {
3219
- if (!Util.isVoiceEmpty(queue.channel))
3220
- return;
3221
- if (queue.timeouts.has(`empty_${oldState.guild.id}`))
3222
- return;
3223
- const timeout = setTimeout(() => {
3224
- if (!Util.isVoiceEmpty(queue.channel))
3225
- return;
3226
- if (!this.nodes.has(queue.guild.id))
3227
- return;
3228
- if (queue.options.leaveOnEmpty)
3229
- queue.delete();
3230
- this.events.emit("emptyChannel", queue);
3231
- }, queue.options.leaveOnEmptyCooldown || 0).unref();
3232
- queue.timeouts.set(`empty_${oldState.guild.id}`, timeout);
3233
- } else {
3234
- const emptyTimeout = queue.timeouts.get(`empty_${oldState.guild.id}`);
3235
- const channelEmpty = Util.isVoiceEmpty(queue.channel);
3236
- if (!channelEmpty && emptyTimeout) {
3237
- clearTimeout(emptyTimeout);
3238
- queue.timeouts.delete(`empty_${oldState.guild.id}`);
3239
- }
3240
- }
3241
- }
3242
- }
3179
+ return __privateGet(this, _onVoiceStateUpdate).call(this, this, queue, oldState, newState);
3243
3180
  }
3244
3181
  handleVoiceState(oldState, newState) {
3245
3182
  this._handleVoiceState(oldState, newState);
@@ -3263,12 +3200,16 @@ var _Player = class extends PlayerEventsEmitter {
3263
3200
  throw Exceptions.ERR_NO_RESULT(`No results found for "${query}" (Extractor: ${result.extractor?.identifier || "N/A"})`);
3264
3201
  }
3265
3202
  const queue = this.nodes.create(vc.guild, options.nodeOptions);
3266
- this.debug(`[AsyncQueue] Acquiring an entry...`);
3203
+ if (this.hasDebugger)
3204
+ this.debug(`[AsyncQueue] Acquiring an entry...`);
3267
3205
  const entry = queue.tasksQueue.acquire();
3268
- this.debug(`[AsyncQueue] Entry ${entry.id} was acquired successfully!`);
3269
- this.debug(`[AsyncQueue] Waiting for the queue to resolve...`);
3206
+ if (this.hasDebugger)
3207
+ this.debug(`[AsyncQueue] Entry ${entry.id} was acquired successfully!`);
3208
+ if (this.hasDebugger)
3209
+ this.debug(`[AsyncQueue] Waiting for the queue to resolve...`);
3270
3210
  await entry.getTask();
3271
- this.debug(`[AsyncQueue] Entry ${entry.id} was resolved!`);
3211
+ if (this.hasDebugger)
3212
+ this.debug(`[AsyncQueue] Entry ${entry.id} was resolved!`);
3272
3213
  try {
3273
3214
  if (!queue.channel)
3274
3215
  await queue.connect(vc, options.connectionOptions);
@@ -3280,7 +3221,8 @@ var _Player = class extends PlayerEventsEmitter {
3280
3221
  if (!queue.isPlaying())
3281
3222
  await queue.node.play(null, options.audioPlayerOptions);
3282
3223
  } finally {
3283
- this.debug(`[AsyncQueue] Releasing an entry from the queue...`);
3224
+ if (this.hasDebugger)
3225
+ this.debug(`[AsyncQueue] Releasing an entry from the queue...`);
3284
3226
  queue.tasksQueue.release();
3285
3227
  }
3286
3228
  return {
@@ -3328,12 +3270,15 @@ var _Player = class extends PlayerEventsEmitter {
3328
3270
  requestedBy: options.requestedBy
3329
3271
  });
3330
3272
  }
3331
- this.debug(`Searching ${query}`);
3273
+ if (this.hasDebugger)
3274
+ this.debug(`Searching ${query}`);
3332
3275
  let extractor = null;
3333
3276
  options.searchEngine ?? (options.searchEngine = QueryType.AUTO);
3334
- this.debug(`Search engine set to ${options.searchEngine}`);
3277
+ if (this.hasDebugger)
3278
+ this.debug(`Search engine set to ${options.searchEngine}`);
3335
3279
  const queryType = options.searchEngine === QueryType.AUTO ? QueryResolver.resolve(query, options.fallbackSearchEngine) : options.searchEngine;
3336
- this.debug(`Query type identified as ${queryType}`);
3280
+ if (this.hasDebugger)
3281
+ this.debug(`Query type identified as ${queryType}`);
3337
3282
  if (options.searchEngine.startsWith("ext:")) {
3338
3283
  extractor = this.extractors.get(options.searchEngine.substring(4));
3339
3284
  if (!extractor)
@@ -3346,19 +3291,23 @@ var _Player = class extends PlayerEventsEmitter {
3346
3291
  }
3347
3292
  if (!extractor) {
3348
3293
  if (!options.ignoreCache) {
3349
- this.debug(`Checking cache...`);
3294
+ if (this.hasDebugger)
3295
+ this.debug(`Checking cache...`);
3350
3296
  const res2 = await this.queryCache?.resolve({
3351
3297
  query,
3352
3298
  queryType,
3353
3299
  requestedBy: options.requestedBy
3354
3300
  });
3355
3301
  if (res2?.hasTracks()) {
3356
- this.debug(`Cache hit for query ${query}`);
3302
+ if (this.hasDebugger)
3303
+ this.debug(`Cache hit for query ${query}`);
3357
3304
  return res2;
3358
3305
  }
3359
- this.debug(`Cache miss for query ${query}`);
3306
+ if (this.hasDebugger)
3307
+ this.debug(`Cache miss for query ${query}`);
3360
3308
  }
3361
- this.debug(`Executing extractors...`);
3309
+ if (this.hasDebugger)
3310
+ this.debug(`Executing extractors...`);
3362
3311
  extractor = (await this.extractors.run(async (ext) => {
3363
3312
  if (options.blockExtractors?.includes(ext.identifier))
3364
3313
  return false;
@@ -3366,20 +3315,23 @@ var _Player = class extends PlayerEventsEmitter {
3366
3315
  }))?.extractor || null;
3367
3316
  }
3368
3317
  if (!extractor) {
3369
- this.debug("Failed to find appropriate extractor");
3318
+ if (this.hasDebugger)
3319
+ this.debug("Failed to find appropriate extractor");
3370
3320
  return new SearchResult(this, {
3371
3321
  query,
3372
3322
  queryType,
3373
3323
  requestedBy: options.requestedBy
3374
3324
  });
3375
3325
  }
3376
- this.debug(`Executing metadata query using ${extractor.identifier} extractor...`);
3326
+ if (this.hasDebugger)
3327
+ this.debug(`Executing metadata query using ${extractor.identifier} extractor...`);
3377
3328
  const res = await extractor.handle(query, {
3378
3329
  type: queryType,
3379
3330
  requestedBy: options.requestedBy
3380
3331
  }).catch(() => null);
3381
3332
  if (res) {
3382
- this.debug("Metadata query was successful!");
3333
+ if (this.hasDebugger)
3334
+ this.debug("Metadata query was successful!");
3383
3335
  const result2 = new SearchResult(this, {
3384
3336
  query,
3385
3337
  queryType,
@@ -3389,12 +3341,14 @@ var _Player = class extends PlayerEventsEmitter {
3389
3341
  requestedBy: options.requestedBy
3390
3342
  });
3391
3343
  if (!options.ignoreCache) {
3392
- this.debug(`Adding data to cache...`);
3344
+ if (this.hasDebugger)
3345
+ this.debug(`Adding data to cache...`);
3393
3346
  await this.queryCache?.addData(result2);
3394
3347
  }
3395
3348
  return result2;
3396
3349
  }
3397
- this.debug("Failed to find result using appropriate extractor. Querying all extractors...");
3350
+ if (this.hasDebugger)
3351
+ this.debug("Failed to find result using appropriate extractor. Querying all extractors...");
3398
3352
  const result = await this.extractors.run(
3399
3353
  async (ext) => !options.blockExtractors?.includes(ext.identifier) && await ext.validate(query) && ext.handle(query, {
3400
3354
  type: queryType,
@@ -3402,7 +3356,8 @@ var _Player = class extends PlayerEventsEmitter {
3402
3356
  })
3403
3357
  );
3404
3358
  if (!result?.result) {
3405
- this.debug(`Failed to query metadata query using ${result?.extractor.identifier || "N/A"} extractor.`);
3359
+ if (this.hasDebugger)
3360
+ this.debug(`Failed to query metadata query using ${result?.extractor.identifier || "N/A"} extractor.`);
3406
3361
  return new SearchResult(this, {
3407
3362
  query,
3408
3363
  queryType,
@@ -3410,7 +3365,8 @@ var _Player = class extends PlayerEventsEmitter {
3410
3365
  extractor: result?.extractor
3411
3366
  });
3412
3367
  }
3413
- this.debug(`Metadata query was successful using ${result.extractor.identifier}!`);
3368
+ if (this.hasDebugger)
3369
+ this.debug(`Metadata query was successful using ${result.extractor.identifier}!`);
3414
3370
  const data = new SearchResult(this, {
3415
3371
  query,
3416
3372
  queryType,
@@ -3420,7 +3376,8 @@ var _Player = class extends PlayerEventsEmitter {
3420
3376
  requestedBy: options.requestedBy
3421
3377
  });
3422
3378
  if (!options.ignoreCache) {
3423
- this.debug(`Adding data to cache...`);
3379
+ if (this.hasDebugger)
3380
+ this.debug(`Adding data to cache...`);
3424
3381
  await this.queryCache?.addData(data);
3425
3382
  }
3426
3383
  return data;
@@ -3433,15 +3390,15 @@ var _Player = class extends PlayerEventsEmitter {
3433
3390
  line,
3434
3391
  `- discord-player: ${_Player.version}`,
3435
3392
  `- @discordjs/voice: ${import_voice6.version}`,
3436
- `- discord.js: ${import_discord4.version}`,
3393
+ `- discord.js: ${import_discord5.version}`,
3437
3394
  `- ${runtime} version: ${process.version}`,
3438
3395
  (() => {
3439
3396
  if (this.options.useLegacyFFmpeg)
3440
3397
  return "- ffmpeg: N/A (using legacy ffmpeg)";
3441
- const info = FFmpeg.locateSafe();
3398
+ const info = import_ffmpeg2.FFmpeg.locateSafe();
3442
3399
  if (!info)
3443
3400
  return "FFmpeg/Avconv not found";
3444
- return [`- ffmpeg: ${info.version}`, `- command: ${info.command}`, `- libopus: ${info.metadata.includes("--enable-libopus")}`].join("\n");
3401
+ return [`- ffmpeg: ${info.version}`, `- command: ${info.command}`, `- static: ${info.isStatic}`, `- libopus: ${info.metadata.includes("--enable-libopus")}`].join("\n");
3445
3402
  })(),
3446
3403
  "\n",
3447
3404
  "Loaded Extractors:",
@@ -3467,7 +3424,8 @@ _lastLatency = new WeakMap();
3467
3424
  _voiceStateUpdateListener = new WeakMap();
3468
3425
  _lagMonitorTimeout = new WeakMap();
3469
3426
  _lagMonitorInterval = new WeakMap();
3470
- Player.version = "6.5.0";
3427
+ _onVoiceStateUpdate = new WeakMap();
3428
+ Player.version = "6.6.0-dev.0";
3471
3429
  Player._singletonKey = kSingleton;
3472
3430
 
3473
3431
  // src/hooks/common.ts
@@ -3480,6 +3438,14 @@ var getQueue = /* @__PURE__ */ __name((node) => {
3480
3438
  return null;
3481
3439
  return player.nodes.resolve(node) || null;
3482
3440
  }, "getQueue");
3441
+ function createHook(hook) {
3442
+ return hook({
3443
+ getQueue,
3444
+ getPlayer,
3445
+ instances
3446
+ });
3447
+ }
3448
+ __name(createHook, "createHook");
3483
3449
 
3484
3450
  // src/hooks/useHistory.ts
3485
3451
  function useHistory(node) {
@@ -3508,11 +3474,16 @@ function useQueue(node) {
3508
3474
  }
3509
3475
  __name(useQueue, "useQueue");
3510
3476
 
3511
- // src/hooks/useMasterPlayer.ts
3477
+ // src/hooks/useMainPlayer.ts
3512
3478
  function useMasterPlayer() {
3479
+ Util.warn("useMasterPlayer() hook is deprecated, use useMainPlayer() instead.", "DeprecationWarning");
3513
3480
  return getPlayer();
3514
3481
  }
3515
3482
  __name(useMasterPlayer, "useMasterPlayer");
3483
+ function useMainPlayer() {
3484
+ return getPlayer();
3485
+ }
3486
+ __name(useMainPlayer, "useMainPlayer");
3516
3487
 
3517
3488
  // src/hooks/useMetadata.ts
3518
3489
  function useMetadata(node) {
@@ -3577,12 +3548,29 @@ function onBeforeCreateStream(handler2) {
3577
3548
  }
3578
3549
  __name(onBeforeCreateStream, "onBeforeCreateStream");
3579
3550
 
3551
+ // src/hooks/useVolume.ts
3552
+ function useVolume(node) {
3553
+ const queue = getQueue(node);
3554
+ const setter = /* @__PURE__ */ __name((volume) => {
3555
+ if (queue) {
3556
+ if (TypeUtil.isFunction(volume))
3557
+ return queue.node.setVolume(volume(queue.node.volume));
3558
+ return queue.node.setVolume(volume);
3559
+ }
3560
+ }, "setter");
3561
+ const getter = /* @__PURE__ */ __name(() => {
3562
+ return queue?.node.volume;
3563
+ }, "getter");
3564
+ return [getter, setter];
3565
+ }
3566
+ __name(useVolume, "useVolume");
3567
+
3580
3568
  // src/index.ts
3581
3569
  var import_equalizer3 = require("@discord-player/equalizer");
3582
3570
  var import_voice7 = require("@discordjs/voice");
3583
- var version2 = "6.5.0";
3584
- if (!import_discord5.version.startsWith("14")) {
3585
- process.emitWarning(`Discord.js v${import_discord5.version} is incompatible with Discord Player v${version2}! Please use >=v14.x of Discord.js`);
3571
+ var version = "6.6.0-dev.0";
3572
+ if (!import_discord6.version.startsWith("14")) {
3573
+ process.emitWarning(`Discord.js v${import_discord6.version} is incompatible with Discord Player v${version}! Please use >=v14.x of Discord.js`);
3586
3574
  }
3587
3575
  // Annotate the CommonJS export names for ESM import in node:
3588
3576
  0 && (module.exports = {
@@ -3602,7 +3590,6 @@ if (!import_discord5.version.startsWith("14")) {
3602
3590
  FFMPEG_ARGS_PIPED,
3603
3591
  FFMPEG_ARGS_STRING,
3604
3592
  FFMPEG_SRATE_REGEX,
3605
- FFmpeg,
3606
3593
  FFmpegFilterer,
3607
3594
  FiltersChain,
3608
3595
  GuildNodeManager,
@@ -3632,15 +3619,17 @@ if (!import_discord5.version.startsWith("14")) {
3632
3619
  VolumeTransformer,
3633
3620
  createAudioPlayer,
3634
3621
  createFFmpegStream,
3635
- findFFmpeg,
3622
+ createHook,
3636
3623
  onAfterCreateStream,
3637
3624
  onBeforeCreateStream,
3638
3625
  useHistory,
3626
+ useMainPlayer,
3639
3627
  useMasterPlayer,
3640
3628
  useMetadata,
3641
3629
  usePlayer,
3642
3630
  useQueue,
3643
3631
  useTimeline,
3632
+ useVolume,
3644
3633
  version
3645
3634
  });
3646
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyLnRzIiwgIi4uL3NyYy91dGlscy9VdGlsLnRzIiwgIi4uL3NyYy9mYWJyaWMvUGxheWxpc3QudHMiLCAiLi4vc3JjL2ZhYnJpYy9UcmFjay50cyIsICIuLi9zcmMvdHlwZXMvdHlwZXMudHMiLCAiLi4vc3JjL2ZhYnJpYy9TZWFyY2hSZXN1bHQudHMiLCAiLi4vc3JjL3V0aWxzL0F1ZGlvRmlsdGVycy50cyIsICIuLi9zcmMvZXJyb3JzL2luZGV4LnRzIiwgIi4uL3NyYy9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3IudHMiLCAiLi4vc3JjL2V4dHJhY3RvcnMvRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dC50cyIsICIuLi9zcmMvdXRpbHMvVHlwZVV0aWwudHMiLCAiLi4vc3JjL21hbmFnZXIvR3VpbGROb2RlTWFuYWdlci50cyIsICIuLi9zcmMvbWFuYWdlci9HdWlsZFF1ZXVlLnRzIiwgIi4uL3NyYy9tYW5hZ2VyL0d1aWxkUXVldWVIaXN0b3J5LnRzIiwgIi4uL3NyYy9tYW5hZ2VyL0d1aWxkUXVldWVQbGF5ZXJOb2RlLnRzIiwgIi4uL3NyYy91dGlscy9RdWVyeVJlc29sdmVyLnRzIiwgIi4uL3NyYy91dGlscy9Bc3luY1F1ZXVlLnRzIiwgIi4uL3NyYy9tYW5hZ2VyL0d1aWxkUXVldWVBdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL3V0aWxzL0ZGbXBlZ1N0cmVhbS50cyIsICIuLi9zcmMvdXRpbHMvRkZtcGVnLnRzIiwgIi4uL3NyYy9tYW5hZ2VyL0d1aWxkUXVldWVTdGF0aXN0aWNzLnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vX2NvbnRhaW5lci50cyIsICIuLi9zcmMvdXRpbHMvX19pbnRlcm5hbF9fL2FkZFBsYXllci50cyIsICIuLi9zcmMvdXRpbHMvX19pbnRlcm5hbF9fL2NsZWFyUGxheWVyLnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vZ2V0UGxheWVycy50cyIsICIuLi9zcmMvdXRpbHMvX19pbnRlcm5hbF9fL2dldEdsb2JhbFJlZ2lzdHJ5LnRzIiwgIi4uL3NyYy9tYW5hZ2VyL1ZvaWNlUmVjZWl2ZXJOb2RlLnRzIiwgIi4uL3NyYy9Wb2ljZUludGVyZmFjZS9Wb2ljZVV0aWxzLnRzIiwgIi4uL3NyYy9Wb2ljZUludGVyZmFjZS9TdHJlYW1EaXNwYXRjaGVyLnRzIiwgIi4uL3NyYy91dGlscy9RdWVyeUNhY2hlLnRzIiwgIi4uL3NyYy9QbGF5ZXIudHMiLCAiLi4vc3JjL2hvb2tzL2NvbW1vbi50cyIsICIuLi9zcmMvaG9va3MvdXNlSGlzdG9yeS50cyIsICIuLi9zcmMvaG9va3MvdXNlUGxheWVyLnRzIiwgIi4uL3NyYy9ob29rcy91c2VRdWV1ZS50cyIsICIuLi9zcmMvaG9va3MvdXNlTWFzdGVyUGxheWVyLnRzIiwgIi4uL3NyYy9ob29rcy91c2VNZXRhZGF0YS50cyIsICIuLi9zcmMvaG9va3MvdXNlVGltZWxpbmUudHMiLCAiLi4vc3JjL2hvb2tzL3N0cmVhbS9vbkFmdGVyQ3JlYXRlU3RyZWFtLnRzIiwgIi4uL3NyYy9ob29rcy9zdHJlYW0vb25CZWZvcmVDcmVhdGVTdHJlYW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IHZlcnNpb24gYXMgZGpzVmVyc2lvbiB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9BdWRpb0ZpbHRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9mYWJyaWMnO1xuZXhwb3J0ICogZnJvbSAnLi9tYW5hZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vVm9pY2VJbnRlcmZhY2UvVm9pY2VVdGlscyc7XG5leHBvcnQgKiBmcm9tICcuL1ZvaWNlSW50ZXJmYWNlL1N0cmVhbURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9VdGlsJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvVHlwZVV0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9Bc3luY1F1ZXVlJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9GRm1wZWdTdHJlYW0nO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9RdWVyeUNhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0ZGbXBlZyc7XG5leHBvcnQgKiBmcm9tICcuL1BsYXllcic7XG5leHBvcnQgKiBmcm9tICcuL2hvb2tzJztcbmV4cG9ydCB7XG4gICAgQXVkaW9GaWx0ZXJzIGFzIFBDTUF1ZGlvRmlsdGVycyxcbiAgICB0eXBlIEJpcXVhZEZpbHRlcnMsXG4gICAgRmlsdGVyVHlwZSBhcyBCaXF1YWRGaWx0ZXJUeXBlLFxuICAgIHR5cGUgUENNRmlsdGVycyxcbiAgICBRX0JVVFRFUldPUlRILFxuICAgIFZvbHVtZVRyYW5zZm9ybWVyLFxuICAgIEJBU1NfRVFfQkFORFMsXG4gICAgQUZfTklHSFRDT1JFX1JBVEUsXG4gICAgQUZfVkFQT1JXQVZFX1JBVEUsXG4gICAgRmlsdGVyc0NoYWluXG59IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuZXhwb3J0IHsgY3JlYXRlQXVkaW9QbGF5ZXIsIEF1ZGlvUGxheWVyLCB0eXBlIENyZWF0ZUF1ZGlvUGxheWVyT3B0aW9ucyB9IGZyb20gJ0BkaXNjb3JkanMvdm9pY2UnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWluZmVycmFibGUtdHlwZXNcbmV4cG9ydCBjb25zdCB2ZXJzaW9uOiBzdHJpbmcgPSAnNi41LjAnO1xuXG5pZiAoIWRqc1ZlcnNpb24uc3RhcnRzV2l0aCgnMTQnKSkge1xuICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcoYERpc2NvcmQuanMgdiR7ZGpzVmVyc2lvbn0gaXMgaW5jb21wYXRpYmxlIHdpdGggRGlzY29yZCBQbGF5ZXIgdiR7dmVyc2lvbn0hIFBsZWFzZSB1c2UgPj12MTQueCBvZiBEaXNjb3JkLmpzYCk7XG59XG4iLCAiaW1wb3J0IHsgRGVmYXVsdExpc3RlbmVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IExpc3RlbmVyU2lnbmF0dXJlIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IGNsYXNzIFBsYXllckV2ZW50c0VtaXR0ZXI8TCBleHRlbmRzIExpc3RlbmVyU2lnbmF0dXJlPEw+ID0gRGVmYXVsdExpc3RlbmVyPiBleHRlbmRzIEV2ZW50RW1pdHRlcjxMPiB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZXF1aXJlZEV2ZW50czogQXJyYXk8a2V5b2YgTD4gPSBbXSkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCAuLi5hcmdzOiBQYXJhbWV0ZXJzPExbS10+KSB7XG4gICAgICAgIGlmICh0aGlzLnJlcXVpcmVkRXZlbnRzLmluY2x1ZGVzKG5hbWUpICYmICF0aGlzLmV2ZW50TmFtZXMoKS5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoLi4uYXJncyk7XG4gICAgICAgICAgICBVdGlsLndhcm4oXG4gICAgICAgICAgICAgICAgYE5vIGV2ZW50IGxpc3RlbmVyIGZvdW5kIGZvciBldmVudCBcIiR7U3RyaW5nKG5hbWUpfVwiLiBFdmVudHMgJHt0aGlzLnJlcXVpcmVkRXZlbnRzLm1hcCgobSkgPT4gYFwiJHtTdHJpbmcobSl9XCJgKS5qb2luKCcsICcpfSBtdXN0IGhhdmUgZXZlbnQgbGlzdGVuZXJzLmAsXG4gICAgICAgICAgICAgICAgJ1VuaGFuZGxlZEV2ZW50c1dhcm5pbmcnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLmVtaXQobmFtZSwgLi4uYXJncyk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFN0YWdlQ2hhbm5lbCwgVm9pY2VDaGFubmVsIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBUaW1lRGF0YSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICd0aW1lcnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHsgUGxheWxpc3QsIFRyYWNrIH0gZnJvbSAnLi4vZmFicmljJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5jbGFzcyBVdGlsIHtcbiAgICAvKipcbiAgICAgKiBVdGlsc1xuICAgICAqL1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBkdXJhdGlvbiBzdHJpbmdcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZHVyT2JqIFRoZSBkdXJhdGlvbiBvYmplY3RcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBkdXJhdGlvblN0cmluZyhkdXJPYmo6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZHVyT2JqKVxuICAgICAgICAgICAgLm1hcCgobSkgPT4gKGlzTmFOKG0pID8gMCA6IG0pKVxuICAgICAgICAgICAgLmpvaW4oJzonKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgbWlsbGlzZWNvbmRzIHRvIGNvbnN1bWFibGUgdGltZSBvYmplY3RcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWlsbGlzZWNvbmRzIFRoZSB0aW1lIGluIG1zXG4gICAgICogQHJldHVybnMge1RpbWVEYXRhfVxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZU1TKG1pbGxpc2Vjb25kczogbnVtYmVyKSB7XG4gICAgICAgIGlmIChpc05hTihtaWxsaXNlY29uZHMpKSBtaWxsaXNlY29uZHMgPSAwO1xuICAgICAgICBjb25zdCByb3VuZCA9IG1pbGxpc2Vjb25kcyA+IDAgPyBNYXRoLmZsb29yIDogTWF0aC5jZWlsO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXlzOiByb3VuZChtaWxsaXNlY29uZHMgLyA4NjQwMDAwMCksXG4gICAgICAgICAgICBob3Vyczogcm91bmQobWlsbGlzZWNvbmRzIC8gMzYwMDAwMCkgJSAyNCxcbiAgICAgICAgICAgIG1pbnV0ZXM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDYwMDAwKSAlIDYwLFxuICAgICAgICAgICAgc2Vjb25kczogcm91bmQobWlsbGlzZWNvbmRzIC8gMTAwMCkgJSA2MFxuICAgICAgICB9IGFzIFRpbWVEYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyB0aW1lIGNvZGVcbiAgICAgKiBAcGFyYW0ge1RpbWVEYXRhfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gb2JqZWN0XG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgYnVpbGRUaW1lQ29kZShkdXJhdGlvbjogVGltZURhdGEpIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBPYmplY3Qua2V5cyhkdXJhdGlvbik7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVkID0gWydkYXlzJywgJ2hvdXJzJywgJ21pbnV0ZXMnLCAnc2Vjb25kcyddO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGl0ZW1zLmZpbHRlcigoeCkgPT4gcmVxdWlyZWQuaW5jbHVkZXMoeCkpLm1hcCgobSkgPT4gZHVyYXRpb25bbSBhcyBrZXlvZiBUaW1lRGF0YV0pO1xuICAgICAgICBjb25zdCBmaW5hbCA9IHBhcnNlZFxuICAgICAgICAgICAgLnNsaWNlKHBhcnNlZC5maW5kSW5kZXgoKHgpID0+IHggIT09IDApKVxuICAgICAgICAgICAgLm1hcCgoeCkgPT4geC50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykpXG4gICAgICAgICAgICAuam9pbignOicpO1xuXG4gICAgICAgIHJldHVybiBmaW5hbC5sZW5ndGggPD0gMyA/IGAwOiR7ZmluYWwucGFkU3RhcnQoMiwgJzAnKSB8fCAwfWAgOiBmaW5hbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQaWNrcyBsYXN0IGl0ZW0gb2YgdGhlIGdpdmVuIGFycmF5XG4gICAgICogQHBhcmFtIHthbnlbXX0gYXJyIFRoZSBhcnJheVxuICAgICAqIEByZXR1cm5zIHthbnl9XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBzdGF0aWMgbGFzdDxUID0gYW55PihhcnI6IFRbXSk6IFQge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbiAgICAgICAgcmV0dXJuIGFyclthcnIubGVuZ3RoIC0gMV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAgICogQHBhcmFtIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgc3RhdGljIGlzVm9pY2VFbXB0eShjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuIGNoYW5uZWwgJiYgY2hhbm5lbC5tZW1iZXJzLmZpbHRlcigobWVtYmVyKSA9PiAhbWVtYmVyLnVzZXIuYm90KS5zaXplID09PSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhZmVyIHJlcXVpcmVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgTm9kZSByZXF1aXJlIGlkXG4gICAgICogQHJldHVybnMge2FueX1cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVxdWlyZShpZDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4geyBtb2R1bGU6IHJlcXVpcmUoaWQpLCBlcnJvcjogbnVsbCB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiBudWxsLCBlcnJvciB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGltcG9ydChpZDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoaWQpO1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiBtb2QsIGVycm9yOiBudWxsIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtb2R1bGU6IG51bGwsIGVycm9yIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3luY2hyb25vdXMgdGltZW91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIFRoZSB0aW1lIGluIG1zIHRvIHdhaXRcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn1cbiAgICAgKi9cbiAgICBzdGF0aWMgd2FpdCh0aW1lOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQodGltZSwgdW5kZWZpbmVkLCB7IHJlZjogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIG5vb3AoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gICAgc3RhdGljIGFzeW5jIGdldEZldGNoKCkge1xuICAgICAgICBpZiAoJ2ZldGNoJyBpbiBnbG9iYWxUaGlzKSByZXR1cm4gZ2xvYmFsVGhpcy5mZXRjaDtcbiAgICAgICAgZm9yIChjb25zdCBsaWIgb2YgWydub2RlLWZldGNoJywgJ3VuZGljaSddKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBpbXBvcnQobGliKS50aGVuKChyZXMpID0+IHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHQpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IHJlcXVpcmUobGliKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHQ7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vP1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgY29kZSA9ICdEZXByZWNhdGlvbldhcm5pbmcnLCBkZXRhaWw/OiBzdHJpbmcpIHtcbiAgICAgICAgcHJvY2Vzcy5lbWl0V2FybmluZyhtZXNzYWdlLCB7XG4gICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgZGV0YWlsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyByYW5kb21DaG9pY2U8VD4oc3JjOiBUW10pOiBUIHtcbiAgICAgICAgcmV0dXJuIHNyY1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBzcmMubGVuZ3RoKV07XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgVkFMSURBVEVfUVVFVUVfQ0FQID0gKHF1ZXVlOiBHdWlsZFF1ZXVlLCBpdGVtczogUGxheWxpc3QgfCBUcmFjayB8IFRyYWNrW10pID0+IHtcbiAgICBjb25zdCB0cmFja3MgPSBpdGVtcyBpbnN0YW5jZW9mIFBsYXlsaXN0ID8gaXRlbXMudHJhY2tzIDogQXJyYXkuaXNBcnJheShpdGVtcykgPyBpdGVtcyA6IFtpdGVtc107XG5cbiAgICBpZiAocXVldWUubWF4U2l6ZSA8IDEgfHwgcXVldWUubWF4U2l6ZSA9PT0gSW5maW5pdHkpIHJldHVybjtcblxuICAgIGNvbnN0IG1heENhcCA9IHF1ZXVlLmdldENhcGFjaXR5KCk7XG5cbiAgICBpZiAobWF4Q2FwIDwgdHJhY2tzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9PVVRfT0ZfU1BBQ0UoJ3RyYWNrcyBxdWV1ZScsIG1heENhcCwgdHJhY2tzLmxlbmd0aCk7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgVXRpbCB9O1xuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4vVHJhY2snO1xuaW1wb3J0IHsgUGxheWxpc3RJbml0RGF0YSwgUGxheWxpc3RKU09OLCBUcmFja0pTT04sIFRyYWNrU291cmNlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuXG5leHBvcnQgY2xhc3MgUGxheWxpc3Qge1xuICAgIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcjtcbiAgICBwdWJsaWMgdHJhY2tzOiBUcmFja1tdO1xuICAgIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHB1YmxpYyB0aHVtYm5haWw6IHN0cmluZztcbiAgICBwdWJsaWMgdHlwZTogJ2FsYnVtJyB8ICdwbGF5bGlzdCc7XG4gICAgcHVibGljIHNvdXJjZTogVHJhY2tTb3VyY2U7XG4gICAgcHVibGljIGF1dGhvcjoge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIHVybDogc3RyaW5nO1xuICAgIH07XG4gICAgcHVibGljIGlkOiBzdHJpbmc7XG4gICAgcHVibGljIHVybDogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSByYXdQbGF5bGlzdD86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cbiAgICAvKipcbiAgICAgKiBQbGF5bGlzdCBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIgVGhlIHBsYXllclxuICAgICAqIEBwYXJhbSB7UGxheWxpc3RJbml0RGF0YX0gZGF0YSBUaGUgZGF0YVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyLCBkYXRhOiBQbGF5bGlzdEluaXREYXRhKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcGxheWVyXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3BsYXllclxuICAgICAgICAgKiBAdHlwZSB7UGxheWVyfVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdHJhY2tzIGluIHRoaXMgcGxheWxpc3RcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjdHJhY2tzXG4gICAgICAgICAqIEB0eXBlIHtUcmFja1tdfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50cmFja3MgPSBkYXRhLnRyYWNrcyA/PyBbXTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGF1dGhvciBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I2F1dGhvclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hdXRob3IgPSBkYXRhLmF1dGhvcjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGRlc2NyaXB0aW9uXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I2Rlc2NyaXB0aW9uXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGF0YS5kZXNjcmlwdGlvbjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHRodW1ibmFpbCBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3RodW1ibmFpbFxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50aHVtYm5haWwgPSBkYXRhLnRodW1ibmFpbDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHBsYXlsaXN0IHR5cGU6XG4gICAgICAgICAqIC0gYGFsYnVtYFxuICAgICAgICAgKiAtIGBwbGF5bGlzdGBcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjdHlwZVxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50eXBlID0gZGF0YS50eXBlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgc291cmNlIG9mIHRoaXMgcGxheWxpc3Q6XG4gICAgICAgICAqIC0gYHlvdXR1YmVgXG4gICAgICAgICAqIC0gYHNvdW5kY2xvdWRgXG4gICAgICAgICAqIC0gYHNwb3RpZnlgXG4gICAgICAgICAqIC0gYGFyYml0cmFyeWBcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3Qjc291cmNlXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNvdXJjZSA9IGRhdGEuc291cmNlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcGxheWxpc3QgaWRcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjaWRcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcGxheWxpc3QgdXJsXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3VybFxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51cmwgPSBkYXRhLnVybDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHBsYXlsaXN0IHRpdGxlXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjcmF3UGxheWxpc3RcbiAgICAgICAgICogQHR5cGUge2FueX1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgIH1cblxuICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgeWllbGQqIHRoaXMudHJhY2tzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzdGltYXRlZCBkdXJhdGlvbiBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICovXG4gICAgcHVibGljIGdldCBlc3RpbWF0ZWREdXJhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnJlZHVjZSgocCwgYykgPT4gcCArIGMuZHVyYXRpb25NUywgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9ybWF0dGVkIGVzdGltYXRlZCBkdXJhdGlvbiBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICovXG4gICAgcHVibGljIGdldCBkdXJhdGlvbkZvcm1hdHRlZCgpIHtcbiAgICAgICAgcmV0dXJuIFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVModGhpcy5lc3RpbWF0ZWREdXJhdGlvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwbGF5bGlzdFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3dpdGhUcmFja3M9dHJ1ZV0gSWYgaXQgc2hvdWxkIGJ1aWxkIGpzb24gd2l0aCB0cmFja3NcbiAgICAgKiBAcmV0dXJucyB7UGxheWxpc3RKU09OfVxuICAgICAqL1xuICAgIHRvSlNPTih3aXRoVHJhY2tzID0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHRodW1ibmFpbDogdGhpcy50aHVtYm5haWwsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgICAgICAgIHRyYWNrczogW10gYXMgVHJhY2tKU09OW11cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAod2l0aFRyYWNrcykgcGF5bG9hZC50cmFja3MgPSB0aGlzLnRyYWNrcy5tYXAoKG0pID0+IG0udG9KU09OKHRydWUpKTtcblxuICAgICAgICByZXR1cm4gcGF5bG9hZCBhcyBQbGF5bGlzdEpTT047XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFVzZXIsIGVzY2FwZU1hcmtkb3duLCBTbm93Zmxha2VVdGlsLCBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXllciwgUGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0LCBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFJhd1RyYWNrRGF0YSwgU2VhcmNoUXVlcnlUeXBlLCBUcmFja0pTT04gfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4vUGxheWxpc3QnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL21hbmFnZXIvR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuXG5leHBvcnQgdHlwZSBUcmFja1Jlc29sdmFibGUgPSBUcmFjayB8IHN0cmluZyB8IG51bWJlcjtcblxuZXhwb3J0IHR5cGUgV2l0aE1ldGFkYXRhPFQgZXh0ZW5kcyBvYmplY3QsIE0+ID0gVCAmIHtcbiAgICBtZXRhZGF0YTogTTtcbiAgICByZXF1ZXN0TWV0YWRhdGEoKTogUHJvbWlzZTxNPjtcbn07XG5cbmV4cG9ydCBjbGFzcyBUcmFjazxUID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHB1YmxpYyBhdXRob3I6IHN0cmluZztcbiAgICBwdWJsaWMgdXJsOiBzdHJpbmc7XG4gICAgcHVibGljIHRodW1ibmFpbDogc3RyaW5nO1xuICAgIHB1YmxpYyBkdXJhdGlvbjogc3RyaW5nO1xuICAgIHB1YmxpYyB2aWV3czogbnVtYmVyO1xuICAgIHB1YmxpYyByZXF1ZXN0ZWRCeTogVXNlciB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBwbGF5bGlzdD86IFBsYXlsaXN0O1xuICAgIHB1YmxpYyBxdWVyeVR5cGU6IFNlYXJjaFF1ZXJ5VHlwZSB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsO1xuICAgIHB1YmxpYyByYXc6IFJhd1RyYWNrRGF0YSA9IHtcbiAgICAgICAgc291cmNlOiAnYXJiaXRyYXJ5J1xuICAgIH0gYXMgUmF3VHJhY2tEYXRhO1xuICAgIHB1YmxpYyBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgaWQgPSBTbm93Zmxha2VVdGlsLmdlbmVyYXRlKCkudG9TdHJpbmcoKTtcbiAgICBwcml2YXRlIF9fbWV0YWRhdGE6IFQgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIF9fcmVxTWV0YWRhdGFGbjogKCkgPT4gUHJvbWlzZTxUIHwgbnVsbD47XG5cbiAgICAvKipcbiAgICAgKiBUcmFjayBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSBwbGF5ZXIgVGhlIHBsYXllciB0aGF0IGluc3RhbnRpYXRlZCB0aGlzIFRyYWNrXG4gICAgICogQHBhcmFtIGRhdGEgVHJhY2sgZGF0YVxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgcGxheWVyOiBQbGF5ZXIsIGRhdGE6IFBhcnRpYWw8V2l0aE1ldGFkYXRhPFJhd1RyYWNrRGF0YSwgVD4+KSB7XG4gICAgICAgIHRoaXMudGl0bGUgPSBlc2NhcGVNYXJrZG93bihkYXRhLnRpdGxlID8/ICcnKTtcbiAgICAgICAgdGhpcy5hdXRob3IgPSBkYXRhLmF1dGhvciA/PyAnJztcbiAgICAgICAgdGhpcy51cmwgPSBkYXRhLnVybCA/PyAnJztcbiAgICAgICAgdGhpcy50aHVtYm5haWwgPSBkYXRhLnRodW1ibmFpbCA/PyAnJztcbiAgICAgICAgdGhpcy5kdXJhdGlvbiA9IGRhdGEuZHVyYXRpb24gPz8gJyc7XG4gICAgICAgIHRoaXMudmlld3MgPSBkYXRhLnZpZXdzID8/IDA7XG4gICAgICAgIHRoaXMucXVlcnlUeXBlID0gZGF0YS5xdWVyeVR5cGU7XG4gICAgICAgIHRoaXMucmVxdWVzdGVkQnkgPSBkYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgICAgIHRoaXMucGxheWxpc3QgPSBkYXRhLnBsYXlsaXN0O1xuICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gYCR7dGhpcy50aXRsZX0gYnkgJHt0aGlzLmF1dGhvcn1gO1xuICAgICAgICB0aGlzLnJhdyA9IE9iamVjdC5hc3NpZ24oe30sIHsgc291cmNlOiBkYXRhLnJhdz8uc291cmNlID8/IGRhdGEuc291cmNlIH0sIGRhdGEucmF3ID8/IGRhdGEpO1xuICAgICAgICB0aGlzLl9fbWV0YWRhdGEgPSBkYXRhLm1ldGFkYXRhID8/IG51bGw7XG4gICAgICAgIHRoaXMuX19yZXFNZXRhZGF0YUZuID0gZGF0YS5yZXF1ZXN0TWV0YWRhdGEgfHwgKCgpID0+IFByb21pc2UucmVzb2x2ZTxUIHwgbnVsbD4obnVsbCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3QgbWV0YWRhdGEgZm9yIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVxdWVzdE1ldGFkYXRhKCkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLl9fcmVxTWV0YWRhdGFGbigpO1xuXG4gICAgICAgIHRoaXMuc2V0TWV0YWRhdGEocmVzKTtcblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBtZXRhZGF0YSBmb3IgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBzZXRNZXRhZGF0YShtOiBUIHwgbnVsbCkge1xuICAgICAgICB0aGlzLl9fbWV0YWRhdGEgPSBtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1ldGFkYXRhIG9mIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG1ldGFkYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fX21ldGFkYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoaXMgdHJhY2sgaGFzIG1ldGFkYXRhXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNNZXRhZGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0YWRhdGEgIT0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcXVldWUgaW4gd2hpY2ggdGhpcyB0cmFjayBpcyBsb2NhdGVkXG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWV1ZSgpOiBHdWlsZFF1ZXVlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWVyLm5vZGVzLmNhY2hlLmZpbmQoKHEpID0+IHEudHJhY2tzLnNvbWUoKGFiKSA9PiBhYi5pZCA9PT0gdGhpcy5pZCkpITtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2sgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGR1cmF0aW9uTVMoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdGltZXMgPSAobjogbnVtYmVyLCB0OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGxldCB0biA9IDE7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHQ7IGkrKykgdG4gKj0gbjtcbiAgICAgICAgICAgIHJldHVybiB0IDw9IDAgPyAxMDAwIDogdG4gKiAxMDAwO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLmR1cmF0aW9uXG4gICAgICAgICAgICAuc3BsaXQoJzonKVxuICAgICAgICAgICAgLnJldmVyc2UoKVxuICAgICAgICAgICAgLm1hcCgobSwgaSkgPT4gcGFyc2VJbnQobSkgKiB0aW1lcyg2MCwgaSkpXG4gICAgICAgICAgICAucmVkdWNlKChhLCBjKSA9PiBhICsgYywgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBzb3VyY2Ugb2YgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc291cmNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yYXc/LnNvdXJjZSA/PyAnYXJiaXRyYXJ5JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy50aXRsZX0gYnkgJHt0aGlzLmF1dGhvcn1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJhdyBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9KU09OKGhpZGVQbGF5bGlzdD86IGJvb2xlYW4pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgICAgICAgdGh1bWJuYWlsOiB0aGlzLnRodW1ibmFpbCxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgZHVyYXRpb25NUzogdGhpcy5kdXJhdGlvbk1TLFxuICAgICAgICAgICAgdmlld3M6IHRoaXMudmlld3MsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeT8uaWQgfHwgbnVsbCxcbiAgICAgICAgICAgIHBsYXlsaXN0OiBoaWRlUGxheWxpc3QgPyBudWxsIDogdGhpcy5wbGF5bGlzdD8udG9KU09OKCkgPz8gbnVsbFxuICAgICAgICB9IGFzIFRyYWNrSlNPTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYmVsb25naW5nIHF1ZXVlcyBvZiB0aGlzIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGdldEJlbG9uZ2luZ1F1ZXVlcygpIHtcbiAgICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLnBsYXllci5ub2Rlcy5jYWNoZS5maWx0ZXIoKG5vZGUpID0+IG5vZGUudHJhY2tzLnNvbWUoKHQpID0+IHQuaWQgPT09IHRoaXMuaWQpKTtcblxuICAgICAgICByZXR1cm4gbm9kZXMgYXMgQ29sbGVjdGlvbjxzdHJpbmcsIEd1aWxkUXVldWU8dW5rbm93bj4+O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgdGhpcyB0cmFjayB0byB0aGUgZ2l2ZW4gdm9pY2UgY2hhbm5lbC4gSWYgcXVldWUgZXhpc3RzIGFuZCBhbm90aGVyIHRyYWNrIGlzIGJlaW5nIHBsYXllZCwgdGhpcyB0cmFjayB3aWxsIGJlIGFkZGVkIHRvIHRoZSBxdWV1ZS5cbiAgICAgKiBAcGFyYW0gY2hhbm5lbCBWb2ljZSBjaGFubmVsIG9uIHdoaWNoIHRoaXMgdHJhY2sgc2hhbGwgYmUgcGxheWVkXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTm9kZSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYXk8VCA9IHVua25vd24+KGNoYW5uZWw6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgb3B0aW9ucz86IFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4pOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgICAgICBjb25zdCBmbiA9IHRoaXMucGxheWVyLnBsYXkuYmluZCh0aGlzLnBsYXllcik7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IGZuKGNoYW5uZWwsIHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBTbm93Zmxha2UsIFVzZXIsIFVzZXJSZXNvbHZhYmxlLCBWb2ljZVN0YXRlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4uL2ZhYnJpYy9QbGF5bGlzdCc7XG5pbXBvcnQgeyBkb3dubG9hZE9wdGlvbnMgfSBmcm9tICd5dGRsLWNvcmUnO1xuaW1wb3J0IHsgUXVlcnlDYWNoZSB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5Q2FjaGUnO1xuXG5leHBvcnQgdHlwZSBGaWx0ZXJzTmFtZSA9IGtleW9mIFF1ZXVlRmlsdGVycztcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJTZWFyY2hSZXN1bHQge1xuICAgIHBsYXlsaXN0OiBQbGF5bGlzdCB8IG51bGw7XG4gICAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtBdWRpb0ZpbHRlcnN9IFF1ZXVlRmlsdGVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXVlRmlsdGVycyB7XG4gICAgYmFzc2Jvb3N0X2xvdz86IGJvb2xlYW47XG4gICAgYmFzc2Jvb3N0PzogYm9vbGVhbjtcbiAgICBiYXNzYm9vc3RfaGlnaD86IGJvb2xlYW47XG4gICAgJzhEJz86IGJvb2xlYW47XG4gICAgdmFwb3J3YXZlPzogYm9vbGVhbjtcbiAgICBuaWdodGNvcmU/OiBib29sZWFuO1xuICAgIHBoYXNlcj86IGJvb2xlYW47XG4gICAgdHJlbW9sbz86IGJvb2xlYW47XG4gICAgdmlicmF0bz86IGJvb2xlYW47XG4gICAgcmV2ZXJzZT86IGJvb2xlYW47XG4gICAgdHJlYmxlPzogYm9vbGVhbjtcbiAgICBub3JtYWxpemVyPzogYm9vbGVhbjtcbiAgICBub3JtYWxpemVyMj86IGJvb2xlYW47XG4gICAgc3Vycm91bmRpbmc/OiBib29sZWFuO1xuICAgIHB1bHNhdG9yPzogYm9vbGVhbjtcbiAgICBzdWJib29zdD86IGJvb2xlYW47XG4gICAga2FyYW9rZT86IGJvb2xlYW47XG4gICAgZmxhbmdlcj86IGJvb2xlYW47XG4gICAgZ2F0ZT86IGJvb2xlYW47XG4gICAgaGFhcz86IGJvb2xlYW47XG4gICAgbWNvbXBhbmQ/OiBib29sZWFuO1xuICAgIG1vbm8/OiBib29sZWFuO1xuICAgIG1zdGxyPzogYm9vbGVhbjtcbiAgICBtc3Rycj86IGJvb2xlYW47XG4gICAgY29tcHJlc3Nvcj86IGJvb2xlYW47XG4gICAgZXhwYW5kZXI/OiBib29sZWFuO1xuICAgIHNvZnRsaW1pdGVyPzogYm9vbGVhbjtcbiAgICBjaG9ydXM/OiBib29sZWFuO1xuICAgIGNob3J1czJkPzogYm9vbGVhbjtcbiAgICBjaG9ydXMzZD86IGJvb2xlYW47XG4gICAgZmFkZWluPzogYm9vbGVhbjtcbiAgICBkaW0/OiBib29sZWFuO1xuICAgIGVhcnJhcGU/OiBib29sZWFuO1xuICAgIGxvZmk/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSB0cmFjayBzb3VyY2U6XG4gKiAtIHNvdW5kY2xvdWRcbiAqIC0geW91dHViZVxuICogLSBzcG90aWZ5XG4gKiAtIGFwcGxlX211c2ljXG4gKiAtIGFyYml0cmFyeVxuICogQHR5cGVkZWYge3N0cmluZ30gVHJhY2tTb3VyY2VcbiAqL1xuZXhwb3J0IHR5cGUgVHJhY2tTb3VyY2UgPSAnc291bmRjbG91ZCcgfCAneW91dHViZScgfCAnc3BvdGlmeScgfCAnYXBwbGVfbXVzaWMnIHwgJ2FyYml0cmFyeSc7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmF3VHJhY2tEYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGl0bGUgVGhlIHRpdGxlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXV0aG9yIFRoZSBhdXRob3JcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmwgVGhlIHVybFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRodW1ibmFpbCBUaGUgdGh1bWJuYWlsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZHVyYXRpb24gVGhlIGR1cmF0aW9uXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmlld3MgVGhlIHZpZXdzXG4gKiBAcHJvcGVydHkge1VzZXJ9IHJlcXVlc3RlZEJ5IFRoZSB1c2VyIHdobyByZXF1ZXN0ZWQgdGhpcyB0cmFja1xuICogQHByb3BlcnR5IHtQbGF5bGlzdH0gW3BsYXlsaXN0XSBUaGUgcGxheWxpc3RcbiAqIEBwcm9wZXJ0eSB7VHJhY2tTb3VyY2V9IFtzb3VyY2U9XCJhcmJpdHJhcnlcIl0gVGhlIHNvdXJjZVxuICogQHByb3BlcnR5IHthbnl9IFtlbmdpbmVdIFRoZSBlbmdpbmVcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xpdmVdIElmIHRoaXMgdHJhY2sgaXMgbGl2ZVxuICogQHByb3BlcnR5IHthbnl9IFtyYXddIFRoZSByYXcgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJhd1RyYWNrRGF0YSB7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGF1dGhvcjogc3RyaW5nO1xuICAgIHVybDogc3RyaW5nO1xuICAgIHRodW1ibmFpbDogc3RyaW5nO1xuICAgIGR1cmF0aW9uOiBzdHJpbmc7XG4gICAgdmlld3M6IG51bWJlcjtcbiAgICByZXF1ZXN0ZWRCeT86IFVzZXIgfCBudWxsO1xuICAgIHBsYXlsaXN0PzogUGxheWxpc3Q7XG4gICAgc291cmNlPzogVHJhY2tTb3VyY2U7XG4gICAgZW5naW5lPzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBsaXZlPzogYm9vbGVhbjtcbiAgICByYXc/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBUaW1lRGF0YVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGRheXMgVGltZSBpbiBkYXlzXG4gKiBAcHJvcGVydHkge251bWJlcn0gaG91cnMgVGltZSBpbiBob3Vyc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IG1pbnV0ZXMgVGltZSBpbiBtaW51dGVzXG4gKiBAcHJvcGVydHkge251bWJlcn0gc2Vjb25kcyBUaW1lIGluIHNlY29uZHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaW1lRGF0YSB7XG4gICAgZGF5czogbnVtYmVyO1xuICAgIGhvdXJzOiBudW1iZXI7XG4gICAgbWludXRlczogbnVtYmVyO1xuICAgIHNlY29uZHM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQbGF5ZXJQcm9ncmVzc2Jhck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RpbWVjb2Rlc10gSWYgaXQgc2hvdWxkIHJlbmRlciB0aW1lIGNvZGVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtxdWV1ZV0gSWYgaXQgc2hvdWxkIGNyZWF0ZSBwcm9ncmVzcyBiYXIgZm9yIHRoZSB3aG9sZSBxdWV1ZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtsZW5ndGhdIFRoZSBiYXIgbGVuZ3RoXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2xpbmVdIFRoZSBiYXIgdHJhY2tcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaW5kaWNhdG9yXSBUaGUgaW5kaWNhdG9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zIHtcbiAgICB0aW1lY29kZXM/OiBib29sZWFuO1xuICAgIGxlbmd0aD86IG51bWJlcjtcbiAgICBsaW5lPzogc3RyaW5nO1xuICAgIGluZGljYXRvcj86IHN0cmluZztcbiAgICBxdWV1ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIHNlYXJjaCBxdWVyeSB0eXBlXG4gKiBUaGlzIGNhbiBiZSBvbmUgb2Y6XG4gKiAtIEFVVE9cbiAqIC0gWU9VVFVCRVxuICogLSBZT1VUVUJFX1BMQVlMSVNUXG4gKiAtIFNPVU5EQ0xPVURfVFJBQ0tcbiAqIC0gU09VTkRDTE9VRF9QTEFZTElTVFxuICogLSBTT1VORENMT1VEXG4gKiAtIFNQT1RJRllfU09OR1xuICogLSBTUE9USUZZX0FMQlVNXG4gKiAtIFNQT1RJRllfUExBWUxJU1RcbiAqIC0gU1BPVElGWV9TRUFSQ0hcbiAqIC0gRkFDRUJPT0tcbiAqIC0gVklNRU9cbiAqIC0gQVJCSVRSQVJZXG4gKiAtIFJFVkVSQk5BVElPTlxuICogLSBZT1VUVUJFX1NFQVJDSFxuICogLSBZT1VUVUJFX1ZJREVPXG4gKiAtIFNPVU5EQ0xPVURfU0VBUkNIXG4gKiAtIEFQUExFX01VU0lDX1NPTkdcbiAqIC0gQVBQTEVfTVVTSUNfQUxCVU1cbiAqIC0gQVBQTEVfTVVTSUNfUExBWUxJU1RcbiAqIC0gQVBQTEVfTVVTSUNfU0VBUkNIXG4gKiAtIEZJTEVcbiAqIC0gQVVUT19TRUFSQ0hcbiAqIEB0eXBlZGVmIHtzdHJpbmd9IFF1ZXJ5VHlwZVxuICovXG5leHBvcnQgY29uc3QgUXVlcnlUeXBlID0ge1xuICAgIEFVVE86ICdhdXRvJyxcbiAgICBZT1VUVUJFOiAneW91dHViZScsXG4gICAgWU9VVFVCRV9QTEFZTElTVDogJ3lvdXR1YmVQbGF5bGlzdCcsXG4gICAgU09VTkRDTE9VRF9UUkFDSzogJ3NvdW5kY2xvdWRUcmFjaycsXG4gICAgU09VTkRDTE9VRF9QTEFZTElTVDogJ3NvdW5kY2xvdWRQbGF5bGlzdCcsXG4gICAgU09VTkRDTE9VRDogJ3NvdW5kY2xvdWQnLFxuICAgIFNQT1RJRllfU09ORzogJ3Nwb3RpZnlTb25nJyxcbiAgICBTUE9USUZZX0FMQlVNOiAnc3BvdGlmeUFsYnVtJyxcbiAgICBTUE9USUZZX1BMQVlMSVNUOiAnc3BvdGlmeVBsYXlsaXN0JyxcbiAgICBTUE9USUZZX1NFQVJDSDogJ3Nwb3RpZnlTZWFyY2gnLFxuICAgIEZBQ0VCT09LOiAnZmFjZWJvb2snLFxuICAgIFZJTUVPOiAndmltZW8nLFxuICAgIEFSQklUUkFSWTogJ2FyYml0cmFyeScsXG4gICAgUkVWRVJCTkFUSU9OOiAncmV2ZXJibmF0aW9uJyxcbiAgICBZT1VUVUJFX1NFQVJDSDogJ3lvdXR1YmVTZWFyY2gnLFxuICAgIFlPVVRVQkVfVklERU86ICd5b3V0dWJlVmlkZW8nLFxuICAgIFNPVU5EQ0xPVURfU0VBUkNIOiAnc291bmRjbG91ZFNlYXJjaCcsXG4gICAgQVBQTEVfTVVTSUNfU09ORzogJ2FwcGxlTXVzaWNTb25nJyxcbiAgICBBUFBMRV9NVVNJQ19BTEJVTTogJ2FwcGxlTXVzaWNBbGJ1bScsXG4gICAgQVBQTEVfTVVTSUNfUExBWUxJU1Q6ICdhcHBsZU11c2ljUGxheWxpc3QnLFxuICAgIEFQUExFX01VU0lDX1NFQVJDSDogJ2FwcGxlTXVzaWNTZWFyY2gnLFxuICAgIEZJTEU6ICdmaWxlJyxcbiAgICBBVVRPX1NFQVJDSDogJ2F1dG9TZWFyY2gnXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBTZWFyY2hRdWVyeVR5cGUgPSBrZXlvZiB0eXBlb2YgUXVlcnlUeXBlIHwgKHR5cGVvZiBRdWVyeVR5cGUpW2tleW9mIHR5cGVvZiBRdWVyeVR5cGVdO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllckV2ZW50cyB7XG4gICAgZGVidWc6IChtZXNzYWdlOiBzdHJpbmcpID0+IGFueTtcbiAgICBlcnJvcjogKGVycm9yOiBFcnJvcikgPT4gYW55O1xuICAgIHZvaWNlU3RhdGVVcGRhdGU6IChxdWV1ZTogR3VpbGRRdWV1ZSwgb2xkU3RhdGU6IFZvaWNlU3RhdGUsIG5ld1N0YXRlOiBWb2ljZVN0YXRlKSA9PiBhbnk7XG59XG5cbmV4cG9ydCBlbnVtIFBsYXllckV2ZW50IHtcbiAgICBkZWJ1ZyA9ICdkZWJ1ZycsXG4gICAgZXJyb3IgPSAnZXJyb3InLFxuICAgIHZvaWNlU3RhdGVVcGRhdGUgPSAndm9pY2VTdGF0ZVVwZGF0ZSdcbn1cblxuLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGxheU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZpbHRlcnNVcGRhdGU9ZmFsc2VdIElmIHRoaXMgcGxheSB3YXMgdHJpZ2dlcmVkIGZvciBmaWx0ZXJzIHVwZGF0ZVxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2VuY29kZXJBcmdzPVtdXSBGRm1wZWcgYXJncyBwYXNzZWQgdG8gZW5jb2RlclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtzZWVrXSBUaW1lIHRvIHNlZWsgdG8gYmVmb3JlIHBsYXlpbmdcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ltbWVkaWF0ZT1mYWxzZV0gSWYgaXQgc2hvdWxkIHN0YXJ0IHBsYXlpbmcgdGhlIHByb3ZpZGVkIHRyYWNrIGltbWVkaWF0ZWx5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxheU9wdGlvbnMge1xuICAgIGZpbHRlcnNVcGRhdGU/OiBib29sZWFuO1xuICAgIGVuY29kZXJBcmdzPzogc3RyaW5nW107XG4gICAgc2Vlaz86IG51bWJlcjtcbiAgICBpbW1lZGlhdGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBRdWVyeUV4dHJhY3RvclNlYXJjaCA9IGBleHQ6JHtzdHJpbmd9YDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZWFyY2hPcHRpb25zXG4gKiBAcHJvcGVydHkge1VzZXJSZXNvbHZhYmxlfSByZXF1ZXN0ZWRCeSBUaGUgdXNlciB3aG8gcmVxdWVzdGVkIHRoaXMgc2VhcmNoXG4gKiBAcHJvcGVydHkge3R5cGVvZiBRdWVyeVR5cGV8c3RyaW5nfSBbc2VhcmNoRW5naW5lPSdhdXRvJ10gVGhlIHF1ZXJ5IHNlYXJjaCBlbmdpbmUsIGNhbiBiZSBleHRyYWN0b3IgbmFtZSB0byB0YXJnZXQgc3BlY2lmaWMgb25lIChjdXN0b20pXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbYmxvY2tFeHRyYWN0b3JzW11dIExpc3Qgb2YgdGhlIGV4dHJhY3RvcnMgdG8gYmxvY2tcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZUNhY2hlXSBJZiBpdCBzaG91bGQgaWdub3JlIHF1ZXJ5IGNhY2hlIGxvb2t1cFxuICogQHByb3BlcnR5IHtTZWFyY2hRdWVyeVR5cGV9IFtmYWxsYmFja1NlYXJjaEVuZ2luZT0nYXV0b1NlYXJjaCddIEZhbGxiYWNrIHNlYXJjaCBlbmdpbmUgdG8gdXNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoT3B0aW9ucyB7XG4gICAgcmVxdWVzdGVkQnk/OiBVc2VyUmVzb2x2YWJsZTtcbiAgICBzZWFyY2hFbmdpbmU/OiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaDtcbiAgICBibG9ja0V4dHJhY3RvcnM/OiBzdHJpbmdbXTtcbiAgICBpZ25vcmVDYWNoZT86IGJvb2xlYW47XG4gICAgZmFsbGJhY2tTZWFyY2hFbmdpbmU/OiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG59XG5cbi8qKlxuICogVGhlIHF1ZXVlIHJlcGVhdCBtb2RlLiBUaGlzIGNhbiBiZSBvbmUgb2Y6XG4gKiAtIE9GRlxuICogLSBUUkFDS1xuICogLSBRVUVVRVxuICogLSBBVVRPUExBWVxuICogQHR5cGVkZWYge251bWJlcn0gUXVldWVSZXBlYXRNb2RlXG4gKi9cbmV4cG9ydCBlbnVtIFF1ZXVlUmVwZWF0TW9kZSB7XG4gICAgT0ZGID0gMCxcbiAgICBUUkFDSyA9IDEsXG4gICAgUVVFVUUgPSAyLFxuICAgIEFVVE9QTEFZID0gM1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBsYXlsaXN0SW5pdERhdGFcbiAqIEBwcm9wZXJ0eSB7VHJhY2tbXX0gdHJhY2tzIFRoZSB0cmFja3Mgb2YgdGhpcyBwbGF5bGlzdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlIFRoZSBwbGF5bGlzdCB0aXRsZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRodW1ibmFpbCBUaGUgdGh1bWJuYWlsXG4gKiBAcHJvcGVydHkge2FsYnVtfHBsYXlsaXN0fSB0eXBlIFRoZSBwbGF5bGlzdCB0eXBlOiBgYWxidW1gIHwgYHBsYXlsaXN0YFxuICogQHByb3BlcnR5IHtUcmFja1NvdXJjZX0gc291cmNlIFRoZSBwbGF5bGlzdCBzb3VyY2VcbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBhdXRob3IgVGhlIHBsYXlsaXN0IGF1dGhvclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthdXRob3IubmFtZV0gVGhlIGF1dGhvciBuYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2F1dGhvci51cmxdIFRoZSBhdXRob3IgdXJsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgVGhlIHBsYXlsaXN0IGlkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdXJsIFRoZSBwbGF5bGlzdCB1cmxcbiAqIEBwcm9wZXJ0eSB7YW55fSBbcmF3UGxheWxpc3RdIFRoZSByYXcgcGxheWxpc3QgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlsaXN0SW5pdERhdGEge1xuICAgIHRyYWNrczogVHJhY2tbXTtcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgdHlwZTogJ2FsYnVtJyB8ICdwbGF5bGlzdCc7XG4gICAgc291cmNlOiBUcmFja1NvdXJjZTtcbiAgICBhdXRob3I6IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICB1cmw6IHN0cmluZztcbiAgICB9O1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgcmF3UGxheWxpc3Q/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFRyYWNrSlNPTlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlIFRoZSB0cmFjayB0aXRsZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlc2NyaXB0aW9uIFRoZSB0cmFjayBkZXNjcmlwdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGF1dGhvciBUaGUgYXV0aG9yXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdXJsIFRoZSB1cmxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aHVtYm5haWwgVGhlIHRodW1ibmFpbFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGR1cmF0aW9uIFRoZSBkdXJhdGlvblxuICogQHByb3BlcnR5IHtudW1iZXJ9IGR1cmF0aW9uTVMgVGhlIGR1cmF0aW9uIGluIG1zXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmlld3MgVGhlIHZpZXdzIGNvdW50XG4gKiBAcHJvcGVydHkge1Nub3dmbGFrZX0gcmVxdWVzdGVkQnkgVGhlIGlkIG9mIHRoZSB1c2VyIHdobyByZXF1ZXN0ZWQgdGhpcyB0cmFja1xuICogQHByb3BlcnR5IHtQbGF5bGlzdEpTT059IFtwbGF5bGlzdF0gVGhlIHBsYXlsaXN0IGluZm8gKGlmIGFueSlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFja0pTT04ge1xuICAgIGlkOiBTbm93Zmxha2U7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGF1dGhvcjogc3RyaW5nO1xuICAgIHVybDogc3RyaW5nO1xuICAgIHRodW1ibmFpbDogc3RyaW5nO1xuICAgIGR1cmF0aW9uOiBzdHJpbmc7XG4gICAgZHVyYXRpb25NUzogbnVtYmVyO1xuICAgIHZpZXdzOiBudW1iZXI7XG4gICAgcmVxdWVzdGVkQnk6IFNub3dmbGFrZTtcbiAgICBwbGF5bGlzdD86IFBsYXlsaXN0SlNPTjtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQbGF5bGlzdEpTT05cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCBUaGUgcGxheWxpc3QgaWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmwgVGhlIHBsYXlsaXN0IHVybFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlIFRoZSBwbGF5bGlzdCB0aXRsZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlc2NyaXB0aW9uIFRoZSBwbGF5bGlzdCBkZXNjcmlwdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRodW1ibmFpbCBUaGUgdGh1bWJuYWlsXG4gKiBAcHJvcGVydHkge2FsYnVtfHBsYXlsaXN0fSB0eXBlIFRoZSBwbGF5bGlzdCB0eXBlOiBgYWxidW1gIHwgYHBsYXlsaXN0YFxuICogQHByb3BlcnR5IHtUcmFja1NvdXJjZX0gc291cmNlIFRoZSB0cmFjayBzb3VyY2VcbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBhdXRob3IgVGhlIHBsYXlsaXN0IGF1dGhvclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthdXRob3IubmFtZV0gVGhlIGF1dGhvciBuYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2F1dGhvci51cmxdIFRoZSBhdXRob3IgdXJsXG4gKiBAcHJvcGVydHkge1RyYWNrSlNPTltdfSB0cmFja3MgVGhlIHRyYWNrcyBkYXRhIChpZiBhbnkpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWxpc3RKU09OIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHVybDogc3RyaW5nO1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICB0aHVtYm5haWw6IHN0cmluZztcbiAgICB0eXBlOiAnYWxidW0nIHwgJ3BsYXlsaXN0JztcbiAgICBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAgIGF1dGhvcjoge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIHVybDogc3RyaW5nO1xuICAgIH07XG4gICAgdHJhY2tzOiBUcmFja0pTT05bXTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQbGF5ZXJJbml0T3B0aW9uc1xuICogQHByb3BlcnR5IHtZVERMRG93bmxvYWRPcHRpb25zfSBbeXRkbE9wdGlvbnNdIFRoZSBvcHRpb25zIHBhc3NlZCB0byBgeXRkbC1jb3JlYFxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtjb25uZWN0aW9uVGltZW91dD0yMDAwMF0gVGhlIHZvaWNlIGNvbm5lY3Rpb24gdGltZW91dFxuICogQHByb3BlcnR5IHtib29sZWFufSBbbGFnTW9uaXRvcj0zMDAwMF0gVGltZSBpbiBtcyB0byByZS1tb25pdG9yIGV2ZW50IGxvb3AgbGFnXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsb2NrVm9pY2VTdGF0ZUhhbmRsZXJdIFByZXZlbnQgdm9pY2Ugc3RhdGUgaGFuZGxlciBmcm9tIGJlaW5nIG92ZXJyaWRkZW5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtibG9ja0V4dHJhY3RvcnNdIExpc3Qgb2YgZXh0cmFjdG9ycyB0byBkaXNhYmxlIHF1ZXJ5aW5nIG1ldGFkYXRhIGZyb21cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtibG9ja1N0cmVhbUZyb21dIExpc3Qgb2YgZXh0cmFjdG9ycyB0byBkaXNhYmxlIHN0cmVhbWluZyBmcm9tXG4gKiBAcHJvcGVydHkge1F1ZXJ5Q2FjaGUgfCBudWxsfSBbcXVlcnlDYWNoZV0gUXVlcnkgY2FjaGUgcHJvdmlkZXJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZUluc3RhbmNlXSBJZ25vcmUgcGxheWVyIGluc3RhbmNlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1c2VMZWdhY3lGRm1wZWddIFVzZSBsZWdhY3kgdmVyc2lvbiBvZiBmZm1wZWdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJJbml0T3B0aW9ucyB7XG4gICAgeXRkbE9wdGlvbnM/OiBkb3dubG9hZE9wdGlvbnM7XG4gICAgY29ubmVjdGlvblRpbWVvdXQ/OiBudW1iZXI7XG4gICAgbGFnTW9uaXRvcj86IG51bWJlcjtcbiAgICBsb2NrVm9pY2VTdGF0ZUhhbmRsZXI/OiBib29sZWFuO1xuICAgIGJsb2NrRXh0cmFjdG9ycz86IHN0cmluZ1tdO1xuICAgIGJsb2NrU3RyZWFtRnJvbT86IHN0cmluZ1tdO1xuICAgIHF1ZXJ5Q2FjaGU/OiBRdWVyeUNhY2hlIHwgbnVsbDtcbiAgICBpZ25vcmVJbnN0YW5jZT86IGJvb2xlYW47XG4gICAgdXNlTGVnYWN5RkZtcGVnPzogYm9vbGVhbjtcbn1cbiIsICJpbXBvcnQgeyBVc2VyIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBRdWVyeUV4dHJhY3RvclNlYXJjaCwgUXVlcnlUeXBlLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4vUGxheWxpc3QnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuL1RyYWNrJztcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hSZXN1bHREYXRhIHtcbiAgICBxdWVyeTogc3RyaW5nO1xuICAgIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoIHwgbnVsbDtcbiAgICBleHRyYWN0b3I/OiBCYXNlRXh0cmFjdG9yIHwgbnVsbDtcbiAgICBwbGF5bGlzdD86IFBsYXlsaXN0IHwgbnVsbDtcbiAgICB0cmFja3M/OiBUcmFja1tdO1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hSZXN1bHQge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIsIHByaXZhdGUgX2RhdGE6IFNlYXJjaFJlc3VsdERhdGEpIHtcbiAgICAgICAgdGhpcy5fZGF0YS50cmFja3M/LmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICAgICAgICB0cmFjay5leHRyYWN0b3IgPz89IHRoaXMuX2RhdGEuZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgICAgICAgICB0cmFjay5yZXF1ZXN0ZWRCeSA/Pz0gX2RhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFF1ZXJ5VHlwZSh0eXBlOiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaCkge1xuICAgICAgICB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSA9IHR5cGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRSZXF1ZXN0ZWRCeSh1c2VyOiBVc2VyKSB7XG4gICAgICAgIHRoaXMuX2RhdGEucmVxdWVzdGVkQnkgPSB1c2VyO1xuICAgICAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgICAgICAgIHRyYWNrLnJlcXVlc3RlZEJ5ID0gdXNlcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRFeHRyYWN0b3IoZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSB7XG4gICAgICAgIHRoaXMuX2RhdGEuZXh0cmFjdG9yID0gZXh0cmFjdG9yO1xuICAgICAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgICAgICAgIHRyYWNrLmV4dHJhY3RvciA9IGV4dHJhY3RvcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRUcmFja3ModHJhY2tzOiBUcmFja1tdKSB7XG4gICAgICAgIHRoaXMuX2RhdGEudHJhY2tzID0gdHJhY2tzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0UXVlcnkocXVlcnk6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kYXRhLnF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRQbGF5bGlzdChwbGF5bGlzdDogUGxheWxpc3QpIHtcbiAgICAgICAgdGhpcy5fZGF0YS5wbGF5bGlzdCA9IHBsYXlsaXN0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2VhcmNoIHF1ZXJ5XG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWVyeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEucXVlcnk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHNlYXJjaCBxdWVyeSB0eXBlXG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWVyeVR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSB8fCBRdWVyeVR5cGUuQVVUTztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIGdldCBleHRyYWN0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmV4dHJhY3RvciB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXlsaXN0IHJlc3VsdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGxheWxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnBsYXlsaXN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYWNrcyByZXN1bHRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRyYWNrcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEudHJhY2tzIHx8IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3RlZCBieVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVxdWVzdGVkQnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmUtZXhlY3V0ZSB0aGlzIHNlYXJjaFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIuc2VhcmNoKHRoaXMucXVlcnksIHtcbiAgICAgICAgICAgIHNlYXJjaEVuZ2luZTogdGhpcy5xdWVyeVR5cGUsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeSFcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGlzIGVtcHR5XG4gICAgICovXG4gICAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy50cmFja3MubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgcGxheWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzUGxheWxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXlsaXN0ICE9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGhhcyB0cmFja3NcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzVHJhY2tzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3MubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2VhcmNoXG4gICAgICovXG4gICAgcHVibGljIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJ5LFxuICAgICAgICAgICAgcXVlcnlUeXBlOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIHBsYXlsaXN0OiB0aGlzLnBsYXlsaXN0Py50b0pTT04oZmFsc2UpIHx8IG51bGwsXG4gICAgICAgICAgICB0cmFja3M6IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpLFxuICAgICAgICAgICAgZXh0cmFjdG9yOiB0aGlzLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCBudWxsLFxuICAgICAgICAgICAgcmVxdWVzdGVkQnk6IHRoaXMucmVxdWVzdGVkQnk/LnRvSlNPTigpIHx8IG51bGxcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgRmlsdGVyc05hbWUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5cbmNvbnN0IGJhc3MgPSAoZzogbnVtYmVyKSA9PiBgYmFzcz1nPSR7Z306Zj0xMTA6dz0wLjNgO1xuXG5leHBvcnQgY2xhc3MgQXVkaW9GaWx0ZXJzIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHJldHVybiBBdWRpb0ZpbHRlcnM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmaWx0ZXJzOiBSZWNvcmQ8RmlsdGVyc05hbWUsIHN0cmluZz4gPSB7XG4gICAgICAgIGJhc3Nib29zdF9sb3c6IGJhc3MoMTUpLFxuICAgICAgICBiYXNzYm9vc3Q6IGJhc3MoMjApLFxuICAgICAgICBiYXNzYm9vc3RfaGlnaDogYmFzcygzMCksXG4gICAgICAgICc4RCc6ICdhcHVsc2F0b3I9aHo9MC4wOScsXG4gICAgICAgIHZhcG9yd2F2ZTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCowLjgnLFxuICAgICAgICBuaWdodGNvcmU6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMS4yNScsXG4gICAgICAgIGxvZmk6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMC45LGV4dHJhc3RlcmVvPW09Mi41OmM9ZGlzYWJsZWQnLFxuICAgICAgICBwaGFzZXI6ICdhcGhhc2VyPWluX2dhaW49MC40JyxcbiAgICAgICAgdHJlbW9sbzogJ3RyZW1vbG8nLFxuICAgICAgICB2aWJyYXRvOiAndmlicmF0bz1mPTYuNScsXG4gICAgICAgIHJldmVyc2U6ICdhcmV2ZXJzZScsXG4gICAgICAgIHRyZWJsZTogJ3RyZWJsZT1nPTUnLFxuICAgICAgICBub3JtYWxpemVyMjogJ2R5bmF1ZG5vcm09Zz0xMDEnLFxuICAgICAgICBub3JtYWxpemVyOiAnYWNvbXByZXNzb3InLFxuICAgICAgICBzdXJyb3VuZGluZzogJ3N1cnJvdW5kJyxcbiAgICAgICAgcHVsc2F0b3I6ICdhcHVsc2F0b3I9aHo9MScsXG4gICAgICAgIHN1YmJvb3N0OiAnYXN1YmJvb3N0JyxcbiAgICAgICAga2FyYW9rZTogJ3N0ZXJlb3Rvb2xzPW1sZXY9MC4wMycsXG4gICAgICAgIGZsYW5nZXI6ICdmbGFuZ2VyJyxcbiAgICAgICAgZ2F0ZTogJ2FnYXRlJyxcbiAgICAgICAgaGFhczogJ2hhYXMnLFxuICAgICAgICBtY29tcGFuZDogJ21jb21wYW5kJyxcbiAgICAgICAgbW9ubzogJ3Bhbj1tb25vfGMwPS41KmMwKy41KmMxJyxcbiAgICAgICAgbXN0bHI6ICdzdGVyZW90b29scz1tb2RlPW1zPmxyJyxcbiAgICAgICAgbXN0cnI6ICdzdGVyZW90b29scz1tb2RlPW1zPnJyJyxcbiAgICAgICAgY29tcHJlc3NvcjogJ2NvbXBhbmQ9cG9pbnRzPS04MC8tMTA1fC02Mi8tODB8LTE1LjQvLTE1LjR8MC8tMTJ8MjAvLTcuNicsXG4gICAgICAgIGV4cGFuZGVyOiAnY29tcGFuZD1hdHRhY2tzPTA6cG9pbnRzPS04MC8tMTY5fC01NC8tODB8LTQ5LjUvLTY0LjZ8LTQxLjEvLTQxLjF8LTI1LjgvLTE1fC0xMC44Ly00LjV8MC8wfDIwLzguMycsXG4gICAgICAgIHNvZnRsaW1pdGVyOiAnY29tcGFuZD1hdHRhY2tzPTA6cG9pbnRzPS04MC8tODB8LTEyLjQvLTEyLjR8LTYvLTh8MC8tNi44fDIwLy0yLjgnLFxuICAgICAgICBjaG9ydXM6ICdjaG9ydXM9MC43OjAuOTo1NTowLjQ6MC4yNToyJyxcbiAgICAgICAgY2hvcnVzMmQ6ICdjaG9ydXM9MC42OjAuOTo1MHw2MDowLjR8MC4zMjowLjI1fDAuNDoyfDEuMycsXG4gICAgICAgIGNob3J1czNkOiAnY2hvcnVzPTAuNTowLjk6NTB8NjB8NDA6MC40fDAuMzJ8MC4zOjAuMjV8MC40fDAuMzoyfDIuM3wxLjMnLFxuICAgICAgICBmYWRlaW46ICdhZmFkZT10PWluOnNzPTA6ZD0xMCcsXG4gICAgICAgIGRpbTogYGFmZnRmaWx0PVwiJ3JlYWw9cmUgKiAoMS1jbGlwKChiL25iKSpiLDAsMSkpJzppbWFnPSdpbSAqICgxLWNsaXAoKGIvbmIpKmIsMCwxKSknXCJgLFxuICAgICAgICBlYXJyYXBlOiAnY2hhbm5lbHNwbGl0LHNpZGVjaGFpbmdhdGU9bGV2ZWxfaW49NjQnXG4gICAgfTtcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0PEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4obmFtZTogSykge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJzW25hbWVdID8/IG5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoYXM8SyBleHRlbmRzIEZpbHRlcnNOYW1lPihuYW1lOiBLKSB7XG4gICAgICAgIHJldHVybiBuYW1lIGluIHRoaXMuZmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPHsgbmFtZTogRmlsdGVyc05hbWU7IHZhbHVlOiBzdHJpbmcgfT4ge1xuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmZpbHRlcnMpKSB7XG4gICAgICAgICAgICB5aWVsZCB7IG5hbWU6IGsgYXMgRmlsdGVyc05hbWUsIHZhbHVlOiB2IGFzIHN0cmluZyB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgbmFtZXMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcnMpIGFzIEZpbHRlcnNOYW1lW107XG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBBdWRpb0ZpbHRlcnMubGVuZ3RoXG4gICAgcHVibGljIHN0YXRpYyBnZXQgbGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZXMubWFwKChtKSA9PiAodGhpcyBhcyBhbnkpW21dKS5qb2luKCcsJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBmZm1wZWcgYXJncyBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsdGVycyBuYW1lXG4gICAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIG5hbWVcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlPEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4oZmlsdGVycz86IEtbXSkge1xuICAgICAgICBpZiAoIWZpbHRlcnMgfHwgIUFycmF5LmlzQXJyYXkoZmlsdGVycykpIHJldHVybiB0aGlzLnRvU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiBmaWx0ZXJzXG4gICAgICAgICAgICAuZmlsdGVyKChwcmVkaWNhdGUpID0+IHR5cGVvZiBwcmVkaWNhdGUgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgLm1hcCgobSkgPT4gdGhpcy5nZXQobSkpXG4gICAgICAgICAgICAuam9pbignLCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgYXVkaW8gZmlsdGVyXG4gICAgICogQHBhcmFtIGZpbHRlck5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbHRlclxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgZmZtcGVnIGFyZ3NcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZShmaWx0ZXJOYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJzW2ZpbHRlck5hbWUgYXMgRmlsdGVyc05hbWVdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBtdWx0aXBsZSBhdWRpbyBmaWx0ZXJzXG4gICAgICogQHBhcmFtIGZpbHRlcnNBcnJheSBBcnJheSBvZiBmaWx0ZXJzIGNvbnRhaW5pbmcgdGhlIGZpbHRlciBuYW1lIGFuZCBmZm1wZWcgYXJnc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lQnVsayhmaWx0ZXJzQXJyYXk6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSkge1xuICAgICAgICBmaWx0ZXJzQXJyYXkuZm9yRWFjaCgoYXJyKSA9PiB0aGlzLmRlZmluZShhcnIubmFtZSwgYXJyLnZhbHVlKSk7XG4gICAgfVxufVxuIiwgImNvbnN0IERpc2NvcmRQbGF5ZXJFcnJvcnMgPSB7XG4gICAgRVJSX09VVF9PRl9TUEFDRToge1xuICAgICAgICBuYW1lOiAnRVJSX09VVF9PRl9TUEFDRScsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZywgY2FwYWNpdHk6IG51bWJlciwgdG90YWw6IG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIGBNYXggY2FwYWNpdHkgcmVhY2hlZCBmb3IgJHt0YXJnZXR9IChDYXBhY2l0eSAke2NhcGFjaXR5fS9Ub3RhbCAke3RvdGFsfSlgO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfSU5WQUxJRF9BUkdfVFlQRToge1xuICAgICAgICBuYW1lOiAnRVJSX0lOVkFMSURfQVJHX1RZUEUnLFxuICAgICAgICB0eXBlOiBUeXBlRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKHRhcmdldDogc3RyaW5nLCBleHBlY3RhdGlvbjogc3RyaW5nLCBmb3VuZDogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYEV4cGVjdGVkICR7dGFyZ2V0fSB0byBiZSBcIiR7ZXhwZWN0YXRpb259XCIsIHJlY2VpdmVkIFwiJHtmb3VuZH1cImA7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT19SRVNVTFQ6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19SRVNVTFQnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX05PVF9JTVBMRU1FTlRFRDoge1xuICAgICAgICBuYW1lOiAnRVJSX05PVF9JTVBMRU1FTlRFRCcsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGAke3RhcmdldH0gaXMgbm90IHlldCBpbXBsZW1lbnRlZGA7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT1RfRVhJU1RJTkc6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT1RfRVhJU1RJTkcnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHt0YXJnZXR9IGRvZXMgbm90IGV4aXN0YDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX09VVF9PRl9SQU5HRToge1xuICAgICAgICBuYW1lOiAnRVJSX09VVF9PRl9SQU5HRScsXG4gICAgICAgIHR5cGU6IFJhbmdlRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKHRhcmdldDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBtaW5pbXVtOiBzdHJpbmcsIG1heGltdW06IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGAke3RhcmdldH0gaXMgb3V0IG9mIHJhbmdlIChFeHBlY3RlZCBtaW5pbXVtICR7bWF4aW11bX0gYW5kIG1heGltdW0gJHttYXhpbXVtfSwgZ290ICR7dmFsdWV9KWA7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT19WT0lDRV9DT05ORUNUSU9OOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfTk9fVk9JQ0VfQ09OTkVDVElPTicsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZSB8fCAnTm8gdm9pY2UgY29ubmVjdGlvbiBhdmFpbGFibGUsIG1heWJlIGNvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsIGZpcnN0Pyc7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT19SRUNFSVZFUjoge1xuICAgICAgICBuYW1lOiAnRVJSX05PX1JFQ0VJVkVSJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlIHx8ICdObyB2b2ljZSByZWNlaXZlciBpcyBhdmFpbGFibGUsIG1heWJlIGNvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsIGZpcnN0Pyc7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9GRk1QRUdfTE9DQVRPUjoge1xuICAgICAgICBuYW1lOiAnRVJSX0ZGTVBFR19MT0NBVE9SJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT19BVURJT19SRVNPVVJDRToge1xuICAgICAgICBuYW1lOiAnRVJSX05PX0FVRElPX1JFU09VUkNFJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlIHx8ICdFeHBlY3RlZCBhbiBhdWRpbyByZXNvdXJjZSc7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT19HVUlMRF9RVUVVRToge1xuICAgICAgICBuYW1lOiAnRVJSX05PX0dVSUxEX1FVRVVFJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlIHx8ICdFeHBlY3RlZCBhIGd1aWxkIHF1ZXVlJztcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX05PX0dVSUxEOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfTk9fR1VJTEQnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IobWVzc2FnZT86IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UgfHwgJ0V4cGVjdGVkIGEgZ3VpbGQnO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfSU5GT19SRVFVSVJFRDoge1xuICAgICAgICBuYW1lOiAnRVJSX0lORk9fUkVRVUlSRUQnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcsIGFjdHVhbDogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYEV4cGVjdGVkICR7dGFyZ2V0fSwgZm91bmQgXCIke2FjdHVhbH1cImA7XG4gICAgICAgIH1cbiAgICB9XG59IGFzIGNvbnN0O1xuXG50eXBlIEZpbmFsRXhjZXB0aW9uPE8gZXh0ZW5kcyAodHlwZW9mIERpc2NvcmRQbGF5ZXJFcnJvcnMpW2tleW9mIHR5cGVvZiBEaXNjb3JkUGxheWVyRXJyb3JzXT4gPSB7XG4gICAgbmFtZTogT1snbmFtZSddO1xufSAmIEluc3RhbmNlVHlwZTxPWyd0eXBlJ10+O1xuXG50eXBlIERpc2NvcmRQbGF5ZXJFeGNlcHRpb24gPSB7XG4gICAgW0sgaW4ga2V5b2YgdHlwZW9mIERpc2NvcmRQbGF5ZXJFcnJvcnNdOiAoLi4uYXJnczogUGFyYW1ldGVyczwodHlwZW9mIERpc2NvcmRQbGF5ZXJFcnJvcnMpW0tdWydjcmVhdGVFcnJvciddPikgPT4gRmluYWxFeGNlcHRpb248KHR5cGVvZiBEaXNjb3JkUGxheWVyRXJyb3JzKVtLXT47XG59O1xuXG5jb25zdCB0YXJnZXQgPSB7fSBhcyBEaXNjb3JkUGxheWVyRXhjZXB0aW9uO1xuXG5jb25zdCBoYW5kbGVyOiBQcm94eUhhbmRsZXI8dHlwZW9mIHRhcmdldD4gPSB7XG4gICAgZ2V0KHRhcmdldCwgcDoga2V5b2YgdHlwZW9mIERpc2NvcmRQbGF5ZXJFcnJvcnMsIHJlY2VpdmVyKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IERpc2NvcmRQbGF5ZXJFcnJvcnNbcF07XG5cbiAgICAgICAgaWYgKCFlcnIpIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcblxuICAgICAgICByZXR1cm4gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8KHR5cGVvZiBlcnIpWydjcmVhdGVFcnJvciddPikgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gbmV3IGVyci50eXBlKGVyci5jcmVhdGVFcnJvciguLi5hcmdzKSk7XG4gICAgICAgICAgICBleGNlcHRpb24ubmFtZSA9IGVyci5uYW1lO1xuXG4gICAgICAgICAgICByZXR1cm4gZXhjZXB0aW9uO1xuICAgICAgICB9O1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBFcnJvckNvZGVzID0gKCgpID0+IHtcbiAgICB0eXBlIEVyckNvZGVzID0ge1xuICAgICAgICAtcmVhZG9ubHkgW0sgaW4ga2V5b2YgdHlwZW9mIERpc2NvcmRQbGF5ZXJFcnJvcnNdOiAodHlwZW9mIERpc2NvcmRQbGF5ZXJFcnJvcnMpW0tdWyduYW1lJ107XG4gICAgfTtcblxuICAgIGNvbnN0IGRpY3QgPSB7fSBhcyBFcnJDb2RlcztcblxuICAgIGZvciAoY29uc3QgcHJvcCBpbiBEaXNjb3JkUGxheWVyRXJyb3JzKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgZGljdFtwcm9wXSA9IHByb3A7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyhkaWN0KSBhcyBSZWFkb25seTxFcnJDb2Rlcz47XG59KSgpO1xuZXhwb3J0IGNvbnN0IEV4Y2VwdGlvbnMgPSBuZXcgUHJveHkodGFyZ2V0LCBoYW5kbGVyKTtcbiIsICJpbXBvcnQgeyBVc2VyIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4uL2ZhYnJpYy9QbGF5bGlzdCc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHMsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBjbGFzcyBCYXNlRXh0cmFjdG9yPFQgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+IHtcbiAgICAvKipcbiAgICAgKiBJZGVudGlmaWVyIGZvciB0aGlzIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaWRlbnRpZmllciA9ICdjb20uZGlzY29yZC1wbGF5ZXIuZXh0cmFjdG9yJztcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBicmlkZ2UgcXVlcnkgY3JlYXRpb25cbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGJ1aWxkIHF1ZXJ5IGZvclxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVCcmlkZ2VRdWVyeSA9ICh0cmFjazogVHJhY2spID0+IGAke3RyYWNrLnRpdGxlfSBieSAke3RyYWNrLmF1dGhvcn0gb2ZmaWNpYWwgYXVkaW9gO1xuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdG9yIGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0aGF0IGluc3RhbnRpYXRlZCB0aGlzIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSBvcHRpb25zIEluaXRpYWxpemF0aW9uIG9wdGlvbnMgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBwdWJsaWMgb3B0aW9uczogVCA9IDxUPnt9KSB7fVxuXG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGlzIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaWRlbnRpZmllcigpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBCYXNlRXh0cmFjdG9yKS5pZGVudGlmaWVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY29uZmlndXJlcyB0aGlzIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBuZXcgb3B0aW9ucyB0byBhcHBseVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZWNvbmZpZ3VyZShvcHRpb25zOiBUKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmFjdGl2YXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBhY3RpdmF0ZSgpIHtcbiAgICAgICAgLy8gZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBhY3RpdmF0ZWRcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBkZWFjdGl2YXRlZFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBkZWFjdGl2YXRlKCkge1xuICAgICAgICAvLyBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGRlYWN0aXZhdGVkXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBpbmNvbWluZyBxdWVyeVxuICAgICAqIEBwYXJhbSBxdWVyeSBUaGUgcXVlcnkgdG8gdmFsaWRhdGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdmFsaWRhdGUocXVlcnk6IHN0cmluZywgdHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgdm9pZCB0eXBlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RyZWFtIHRoZSBnaXZlbiB0cmFja1xuICAgICAqIEBwYXJhbSBpbmZvIFRoZSB0cmFjayB0byBzdHJlYW1cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc3RyZWFtKGluZm86IFRyYWNrKTogUHJvbWlzZTxSZWFkYWJsZSB8IHN0cmluZz4ge1xuICAgICAgICB2b2lkIGluZm87XG4gICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PVF9JTVBMRU1FTlRFRChgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LnN0cmVhbSgpYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRoZSBnaXZlbiBxdWVyeVxuICAgICAqIEBwYXJhbSBxdWVyeSBUaGUgcXVlcnkgdG8gaGFuZGxlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZShxdWVyeTogc3RyaW5nLCBjb250ZXh0OiBFeHRyYWN0b3JTZWFyY2hDb250ZXh0KTogUHJvbWlzZTxFeHRyYWN0b3JJbmZvPiB7XG4gICAgICAgIHZvaWQgY29udGV4dDtcbiAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9UX0lNUExFTUVOVEVEKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uaGFuZGxlKClgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgcmVsYXRlZCB0cmFja3MgZm9yIHRoZSBnaXZlbiB0cmFja1xuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgc291cmNlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGdldFJlbGF0ZWRUcmFja3ModHJhY2s6IFRyYWNrKTogUHJvbWlzZTxFeHRyYWN0b3JJbmZvPiB7XG4gICAgICAgIHZvaWQgdHJhY2s7XG4gICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PVF9JTVBMRU1FTlRFRChgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmdldFJlbGF0ZWRUcmFja3MoKWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3RyZWFtIG1pZGRsZXdhcmUgdG8gaGFuZGxlIHN0cmVhbXMgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlIHBsYXllclxuICAgICAqIEBwYXJhbSBzdHJlYW0gVGhlIGluY29taW5nIHN0cmVhbVxuICAgICAqIEBwYXJhbSBuZXh0IFRoZSBuZXh0IGZ1bmN0aW9uXG4gICAgICovXG4gICAgcHVibGljIGhhbmRsZVBvc3RTdHJlYW0oc3RyZWFtOiBSZWFkYWJsZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSB7XG4gICAgICAgIHJldHVybiBuZXh0KG51bGwsIHN0cmVhbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2ggYW4gZXZlbnQgdG8gdGhlIHBsYXllclxuICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gZGlzcGF0Y2hcbiAgICAgKiBAcGFyYW0gYXJncyBUaGUgZGF0YSB0byBkaXNwYXRjaFxuICAgICAqL1xuICAgIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBQbGF5ZXJFdmVudHM+KGV2ZW50OiBLLCAuLi5hcmdzOiBQYXJhbWV0ZXJzPFBsYXllckV2ZW50c1tLXT4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5wbGF5ZXIuZW1pdChldmVudCwgLi4uYXJncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGV4dHJhY3RvciByZXNwb25zZVxuICAgICAqIEBwYXJhbSBwbGF5bGlzdCBUaGUgcGxheWxpc3RcbiAgICAgKiBAcGFyYW0gdHJhY2tzIFRoZSB0cmFjayBhcnJheVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVSZXNwb25zZShwbGF5bGlzdD86IFBsYXlsaXN0IHwgbnVsbCwgdHJhY2tzOiBUcmFja1tdID0gcGxheWxpc3Q/LnRyYWNrcyB8fCBbXSk6IEV4dHJhY3RvckluZm8ge1xuICAgICAgICByZXR1cm4geyBwbGF5bGlzdDogcGxheWxpc3QgfHwgbnVsbCwgdHJhY2tzIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV3JpdGUgZGVidWcgbWVzc2FnZVxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBkZWJ1ZyBtZXNzYWdlXG4gICAgICovXG4gICAgcHVibGljIGRlYnVnKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LnBsYXllci5kZWJ1ZyhtZXNzYWdlKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIE5leHRGdW5jdGlvbiA9IChlcnJvcj86IEVycm9yIHwgbnVsbCwgc3RyZWFtPzogUmVhZGFibGUpID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9ySW5mbyB7XG4gICAgcGxheWxpc3Q6IFBsYXlsaXN0IHwgbnVsbDtcbiAgICB0cmFja3M6IFRyYWNrW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yU2VhcmNoQ29udGV4dCB7XG4gICAgdHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IG51bGw7XG4gICAgcmVxdWVzdGVkQnk/OiBVc2VyIHwgbnVsbDtcbiAgICByZXF1ZXN0T3B0aW9ucz86IFJlcXVlc3RPcHRpb25zO1xufVxuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEJhc2VFeHRyYWN0b3IgfSBmcm9tICcuL0Jhc2VFeHRyYWN0b3InO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgUGxheWVyRXZlbnRzRW1pdHRlciB9IGZyb20gJy4uL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXInO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5cbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3Qga25vd25FeHRyYWN0b3JLZXlzID0gW1xuICAgICdTcG90aWZ5RXh0cmFjdG9yJyxcbiAgICAnQXBwbGVNdXNpY0V4dHJhY3RvcicsXG4gICAgJ1NvdW5kQ2xvdWRFeHRyYWN0b3InLFxuICAgICdZb3VUdWJlRXh0cmFjdG9yJyxcbiAgICAnVmltZW9FeHRyYWN0b3InLFxuICAgICdSZXZlcmJuYXRpb25FeHRyYWN0b3InLFxuICAgICdBdHRhY2htZW50RXh0cmFjdG9yJ1xuXTtcbmNvbnN0IGtub3duRXh0cmFjdG9yTGliID0gJ0BkaXNjb3JkLXBsYXllci9leHRyYWN0b3InO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvckV4ZWN1dGlvbkV2ZW50cyB7XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIHJlZ2lzdGVyZWRcbiAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSBleHRyYWN0b3Igd2FzIHJlZ2lzdGVyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdGhhdCB3YXMgcmVnaXN0ZXJlZFxuICAgICAqL1xuICAgIHJlZ2lzdGVyZWQ6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIHVucmVnaXN0ZXJlZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIGV4dHJhY3RvciB3YXMgdW5yZWdpc3RlcmVkXG4gICAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRoYXQgd2FzIHVucmVnaXN0ZXJlZFxuICAgICAqL1xuICAgIHVucmVnaXN0ZXJlZDogKGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgYWN0aXZhdGVkXG4gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB3aGljaCB3YXMgYWN0aXZhdGVkXG4gICAgICovXG4gICAgYWN0aXZhdGU6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIGRlYWN0aXZhdGVkXG4gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB3aGljaCB3YXMgZGVhY3RpdmF0ZWRcbiAgICAgKi9cbiAgICBkZWFjdGl2YXRlOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBmYWlscyB0byBhY3RpdmF0ZS9kZWFjdGl2YXRlXG4gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB3aGljaCB3YXMgZGVhY3RpdmF0ZWRcbiAgICAgKi9cbiAgICBlcnJvcjogKGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciwgZXJyb3I6IEVycm9yKSA9PiB1bmtub3duO1xufVxuXG5leHBvcnQgY2xhc3MgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCBleHRlbmRzIFBsYXllckV2ZW50c0VtaXR0ZXI8RXh0cmFjdG9yRXhlY3V0aW9uRXZlbnRzPiB7XG4gICAgcHVibGljIHN0b3JlID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCBCYXNlRXh0cmFjdG9yPigpO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIpIHtcbiAgICAgICAgc3VwZXIoWydlcnJvciddKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGRlZmF1bHQgZXh0cmFjdG9ycyBmcm9tIGBAZGlzY29yZC1wbGF5ZXIvZXh0cmFjdG9yYFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBsb2FkRGVmYXVsdCgpIHtcbiAgICAgICAgY29uc3QgbW9kID0gYXdhaXQgVXRpbC5pbXBvcnQoa25vd25FeHRyYWN0b3JMaWIpO1xuICAgICAgICBpZiAobW9kLmVycm9yKSByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IG1vZC5lcnJvciBhcyBFcnJvciB9O1xuXG4gICAgICAgIGtub3duRXh0cmFjdG9yS2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICghbW9kLm1vZHVsZVtrZXldKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyKDx0eXBlb2YgQmFzZUV4dHJhY3Rvcj5tb2QubW9kdWxlW2tleV0sIHt9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZXJyb3I6IG51bGwgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBpZiB0aGUgZ2l2ZW4gZXh0cmFjdG9yIGlzIHJlZ2lzdGVyZWRcbiAgICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgZXh0cmFjdG9yIGlkZW50aWZpZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNSZWdpc3RlcmVkKGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5oYXMoaWRlbnRpZmllcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHNpemUgb2YgcmVnaXN0ZXJlZCBleHRyYWN0b3JzXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5zaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBzaW5nbGUgZXh0cmFjdG9yXG4gICAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGV4dHJhY3RvciB0byBnZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0KGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXQoaWRlbnRpZmllcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgc2luZ2xlIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSBfZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdG8gcmVnaXN0ZXJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHN1cHBsaWVkIHRvIHRoZSBleHRyYWN0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXI8TyBleHRlbmRzIG9iamVjdCwgVCBleHRlbmRzIHR5cGVvZiBCYXNlRXh0cmFjdG9yPE8+PihfZXh0cmFjdG9yOiBULCBvcHRpb25zOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8VD5bJzEnXSkge1xuICAgICAgICBpZiAodHlwZW9mIF9leHRyYWN0b3IuaWRlbnRpZmllciAhPT0gJ3N0cmluZycgfHwgdGhpcy5zdG9yZS5oYXMoX2V4dHJhY3Rvci5pZGVudGlmaWVyKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBleHRyYWN0b3IgPSBuZXcgX2V4dHJhY3Rvcih0aGlzLCBvcHRpb25zKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXQoX2V4dHJhY3Rvci5pZGVudGlmaWVyLCBleHRyYWN0b3IpO1xuICAgICAgICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoYCR7X2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgbG9hZGVkIWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZWdpc3RlcmVkJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICAgICAgICAgIGF3YWl0IGV4dHJhY3Rvci5hY3RpdmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoYCR7X2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgYWN0aXZhdGVkIWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdhY3RpdmF0ZScsIHRoaXMsIGV4dHJhY3Rvcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGVsZXRlKF9leHRyYWN0b3IuaWRlbnRpZmllcik7XG4gICAgICAgICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBmYWlsZWQgdG8gYWN0aXZhdGUhIEVycm9yOiAke2V9YCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgdGhpcywgZXh0cmFjdG9yLCBlIGFzIEVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXIgc2luZ2xlIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSBfZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdG8gdW5yZWdpc3RlclxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyPEsgZXh0ZW5kcyBzdHJpbmcgfCBCYXNlRXh0cmFjdG9yPihfZXh0cmFjdG9yOiBLKSB7XG4gICAgICAgIGNvbnN0IGV4dHJhY3RvciA9IHR5cGVvZiBfZXh0cmFjdG9yID09PSAnc3RyaW5nJyA/IHRoaXMuc3RvcmUuZ2V0KF9leHRyYWN0b3IpIDogdGhpcy5zdG9yZS5maW5kKChyKSA9PiByID09PSBfZXh0cmFjdG9yKTtcbiAgICAgICAgaWYgKCFleHRyYWN0b3IpIHJldHVybjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gZXh0cmFjdG9yLmlkZW50aWZpZXIgfHwgdGhpcy5zdG9yZS5maW5kS2V5KChlKSA9PiBlID09PSBleHRyYWN0b3IpITtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGRpc2FibGVkIWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCd1bnJlZ2lzdGVyZWQnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgICAgICAgYXdhaXQgZXh0cmFjdG9yLmRlYWN0aXZhdGUoKTtcbiAgICAgICAgICAgIHRoaXMucGxheWVyLmRlYnVnKGAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZGVhY3RpdmF0ZWQhYCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2RlYWN0aXZhdGUnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGZhaWxlZCB0byBkZWFjdGl2YXRlIWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHRoaXMsIGV4dHJhY3RvciwgZSBhcyBFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbnJlZ2lzdGVyIGFsbCBleHRyYWN0b3JzXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXJBbGwoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnN0b3JlLm1hcCgoZSkgPT4gdGhpcy51bnJlZ2lzdGVyKGUpKSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVuIGFsbCB0aGUgZXh0cmFjdG9yc1xuICAgICAqIEBwYXJhbSBmbiBUaGUgcnVubmVyIGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIGZpbHRlckJsb2NrZWQgRmlsdGVyIGJsb2NrZWQgZXh0cmFjdG9yc1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBydW48VCA9IHVua25vd24+KGZuOiBFeHRyYWN0b3JFeGVjdXRpb25GTjxUPiwgZmlsdGVyQmxvY2tlZCA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgYmxvY2tlZCA9IHRoaXMucGxheWVyLm9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzID8/IFtdO1xuXG4gICAgICAgIGlmICghdGhpcy5zdG9yZS5zaXplKSB7XG4gICAgICAgICAgICBVdGlsLndhcm4oJ1NraXBwaW5nIGV4dHJhY3RvcnMgZXhlY3V0aW9uIHNpbmNlIHplcm8gZXh0cmFjdG9ycyB3ZXJlIHJlZ2lzdGVyZWQnLCAnTm9FeHRyYWN0b3JzJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZXJyOiBFcnJvciB8IG51bGwgPSBudWxsLFxuICAgICAgICAgICAgbGFzdEV4dDogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIGZvciAoY29uc3QgZXh0IG9mIHRoaXMuc3RvcmUudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChmaWx0ZXJCbG9ja2VkICYmIGJsb2NrZWQuc29tZSgoZSkgPT4gZSA9PT0gZXh0LmlkZW50aWZpZXIpKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRoaXMucGxheWVyLmRlYnVnKGBFeGVjdXRpbmcgZXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9Li4uYCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbihleHQpLnRoZW4oXG4gICAgICAgICAgICAgICAgKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoYEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBmYWlsZWQgd2l0aCBlcnJvcjogJHtlfWApO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBUeXBlVXRpbC5pc0Vycm9yKGUpID8gZSA6IG5ldyBFcnJvcihgJHtlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGxhc3RFeHQgPSBleHQ7XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgIVR5cGVVdGlsLmlzRXJyb3IocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGxheWVyLmRlYnVnKGBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IWApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yOiBleHQsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHRcbiAgICAgICAgICAgICAgICB9IGFzIEV4dHJhY3RvckV4ZWN1dGlvblJlc3VsdDxUPjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoVHlwZVV0aWwuaXNFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgZXJyID0gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycilcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yOiBsYXN0RXh0ISxcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogZmFsc2VcbiAgICAgICAgICAgIH0gYXMgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PGZhbHNlPjtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PFQgPSB1bmtub3duPiB7XG4gICAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yO1xuICAgIGVycm9yOiBFcnJvciB8IG51bGw7XG4gICAgcmVzdWx0OiBUO1xufVxuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JFeGVjdXRpb25GTjxUID0gdW5rbm93bj4gPSAoZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiBQcm9taXNlPFQgfCBib29sZWFuPjtcbiIsICJleHBvcnQgY2xhc3MgVHlwZVV0aWwge1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHJldHVybiBUeXBlVXRpbDtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICAgIHB1YmxpYyBzdGF0aWMgaXNGdW5jdGlvbih0OiB1bmtub3duKTogdCBpcyBGdW5jdGlvbiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzTnVtYmVyKHQ6IHVua25vd24pOiB0IGlzIG51bWJlciB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ251bWJlcicgJiYgIWlzTmFOKHQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNTdHJpbmcodDogdW5rbm93bik6IHQgaXMgc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnc3RyaW5nJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzQm9vbGVhbih0OiB1bmtub3duKTogdCBpcyBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnYm9vbGVhbic7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc051bGxpc2godDogdW5rbm93bik6IHQgaXMgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0ID09IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0FycmF5KHQ6IHVua25vd24pOiB0IGlzIHVua25vd25bXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNFcnJvcih0OiB1bmtub3duKTogdCBpcyBFcnJvciB7XG4gICAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgRXJyb3I7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEVxdWFsaXplckJhbmQsIFBDTUZpbHRlcnMsIEJpcXVhZEZpbHRlcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24sIFF1ZXVlU3RyYXRlZ3kgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgR3VpbGRSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIsIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBGaWx0ZXJzTmFtZSwgUXVldWVSZXBlYXRNb2RlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi91dGlscy9fX2ludGVybmFsX18nO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUID0gdW5rbm93bj4ge1xuICAgIHN0cmF0ZWd5PzogUXVldWVTdHJhdGVneTtcbiAgICB2b2x1bWU/OiBudW1iZXIgfCBib29sZWFuO1xuICAgIGVxdWFsaXplcj86IEVxdWFsaXplckJhbmRbXSB8IGJvb2xlYW47XG4gICAgYV9maWx0ZXI/OiBQQ01GaWx0ZXJzW10gfCBib29sZWFuO1xuICAgIGJpcXVhZD86IEJpcXVhZEZpbHRlcnMgfCBib29sZWFuO1xuICAgIHJlc2FtcGxlcj86IG51bWJlciB8IGJvb2xlYW47XG4gICAgZGlzYWJsZUhpc3Rvcnk/OiBib29sZWFuO1xuICAgIHNraXBPbk5vU3RyZWFtPzogYm9vbGVhbjtcbiAgICBvbkJlZm9yZUNyZWF0ZVN0cmVhbT86IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICBvbkFmdGVyQ3JlYXRlU3RyZWFtPzogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgcmVwZWF0TW9kZT86IFF1ZXVlUmVwZWF0TW9kZTtcbiAgICBsZWF2ZU9uRW1wdHk/OiBib29sZWFuO1xuICAgIGxlYXZlT25FbXB0eUNvb2xkb3duPzogbnVtYmVyO1xuICAgIGxlYXZlT25FbmQ/OiBib29sZWFuO1xuICAgIGxlYXZlT25FbmRDb29sZG93bj86IG51bWJlcjtcbiAgICBsZWF2ZU9uU3RvcD86IGJvb2xlYW47XG4gICAgbGVhdmVPblN0b3BDb29sZG93bj86IG51bWJlcjtcbiAgICBtZXRhZGF0YT86IFQgfCBudWxsO1xuICAgIHNlbGZEZWFmPzogYm9vbGVhbjtcbiAgICBjb25uZWN0aW9uVGltZW91dD86IG51bWJlcjtcbiAgICBkZWZhdWx0RkZtcGVnRmlsdGVycz86IEZpbHRlcnNOYW1lW107XG4gICAgYnVmZmVyaW5nVGltZW91dD86IG51bWJlcjtcbiAgICBub0VtaXRJbnNlcnQ/OiBib29sZWFuO1xuICAgIG1heFNpemU/OiBudW1iZXI7XG4gICAgbWF4SGlzdG9yeVNpemU/OiBudW1iZXI7XG4gICAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgTm9kZVJlc29sdmFibGUgPSBHdWlsZFF1ZXVlIHwgR3VpbGRSZXNvbHZhYmxlO1xuXG5leHBvcnQgY2xhc3MgR3VpbGROb2RlTWFuYWdlcjxNZXRhID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyBjYWNoZSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgR3VpbGRRdWV1ZT4oKTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyKSB7fVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGd1aWxkIHF1ZXVlIGlmIGl0IGRvZXMgbm90IGV4aXN0XG4gICAgICogQHBhcmFtIGd1aWxkIFRoZSBndWlsZCB3aGljaCB3aWxsIGJlIHRoZSBvd25lciBvZiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBRdWV1ZSBpbml0aWFsaXplciBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZTxUID0gTWV0YT4oZ3VpbGQ6IEd1aWxkUmVzb2x2YWJsZSwgb3B0aW9uczogR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUPiA9IHt9KTogR3VpbGRRdWV1ZTxUPiB7XG4gICAgICAgIGNvbnN0IHNlcnZlciA9IHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZShndWlsZCk7XG4gICAgICAgIGlmICghc2VydmVyKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19HVUlMRCgnSW52YWxpZCBvciB1bmtub3duIGd1aWxkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jYWNoZS5oYXMoc2VydmVyLmlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KHNlcnZlci5pZCkgYXMgR3VpbGRRdWV1ZTxUPjtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMuc3RyYXRlZ3kgPz89ICdGSUZPJztcbiAgICAgICAgb3B0aW9ucy52b2x1bWUgPz89IDEwMDtcbiAgICAgICAgb3B0aW9ucy5lcXVhbGl6ZXIgPz89IFtdO1xuICAgICAgICBvcHRpb25zLmFfZmlsdGVyID8/PSBbXTtcbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlSGlzdG9yeSA/Pz0gZmFsc2U7XG4gICAgICAgIG9wdGlvbnMuc2tpcE9uTm9TdHJlYW0gPz89IGZhbHNlO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25FbXB0eSA/Pz0gdHJ1ZTtcbiAgICAgICAgb3B0aW9ucy5sZWF2ZU9uRW1wdHlDb29sZG93biA/Pz0gMDtcbiAgICAgICAgb3B0aW9ucy5sZWF2ZU9uRW5kID8/PSB0cnVlO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25FbmRDb29sZG93biA/Pz0gMDtcbiAgICAgICAgb3B0aW9ucy5sZWF2ZU9uU3RvcCA/Pz0gdHJ1ZTtcbiAgICAgICAgb3B0aW9ucy5sZWF2ZU9uU3RvcENvb2xkb3duID8/PSAwO1xuICAgICAgICBvcHRpb25zLnJlc2FtcGxlciA/Pz0gNDgwMDA7XG4gICAgICAgIG9wdGlvbnMuc2VsZkRlYWYgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQgPz89IHRoaXMucGxheWVyLm9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQ7XG4gICAgICAgIG9wdGlvbnMuYnVmZmVyaW5nVGltZW91dCA/Pz0gMTAwMDtcbiAgICAgICAgb3B0aW9ucy5tYXhTaXplID8/PSBJbmZpbml0eTtcbiAgICAgICAgb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA/Pz0gSW5maW5pdHk7XG4gICAgICAgIG9wdGlvbnMucHJlZmVyQnJpZGdlZE1ldGFkYXRhID0gQm9vbGVhbihvcHRpb25zLnByZWZlckJyaWRnZWRNZXRhZGF0YSk7XG5cbiAgICAgICAgaWYgKGdldEdsb2JhbFJlZ2lzdHJ5KCkuaGFzKCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScpICYmICFvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtKSB7XG4gICAgICAgICAgICBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtID0gZ2V0R2xvYmFsUmVnaXN0cnkoKS5nZXQoJ0Bbb25CZWZvcmVDcmVhdGVTdHJlYW1dJykgYXMgT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGdldEdsb2JhbFJlZ2lzdHJ5KCkuaGFzKCdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJykgJiYgIW9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSkge1xuICAgICAgICAgICAgb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtID0gZ2V0R2xvYmFsUmVnaXN0cnkoKS5nZXQoJ0Bbb25BZnRlckNyZWF0ZVN0cmVhbV0nKSBhcyBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHF1ZXVlID0gbmV3IEd1aWxkUXVldWU8VD4odGhpcy5wbGF5ZXIsIHtcbiAgICAgICAgICAgIGd1aWxkOiBzZXJ2ZXIsXG4gICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5OiBvcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgICAgICAgdm9sdW1lOiBvcHRpb25zLnZvbHVtZSxcbiAgICAgICAgICAgIGVxdWFsaXplcjogb3B0aW9ucy5lcXVhbGl6ZXIsXG4gICAgICAgICAgICBmaWx0ZXJlcjogb3B0aW9ucy5hX2ZpbHRlcixcbiAgICAgICAgICAgIGJpcXVhZDogb3B0aW9ucy5iaXF1YWQsXG4gICAgICAgICAgICByZXNhbXBsZXI6IG9wdGlvbnMucmVzYW1wbGVyLFxuICAgICAgICAgICAgZGlzYWJsZUhpc3Rvcnk6IG9wdGlvbnMuZGlzYWJsZUhpc3RvcnksXG4gICAgICAgICAgICBza2lwT25Ob1N0cmVhbTogb3B0aW9ucy5za2lwT25Ob1N0cmVhbSxcbiAgICAgICAgICAgIG9uQmVmb3JlQ3JlYXRlU3RyZWFtOiBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtLFxuICAgICAgICAgICAgb25BZnRlckNyZWF0ZVN0cmVhbTogb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtLFxuICAgICAgICAgICAgcmVwZWF0TW9kZTogb3B0aW9ucy5yZXBlYXRNb2RlLFxuICAgICAgICAgICAgbGVhdmVPbkVtcHR5OiBvcHRpb25zLmxlYXZlT25FbXB0eSxcbiAgICAgICAgICAgIGxlYXZlT25FbXB0eUNvb2xkb3duOiBvcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duLFxuICAgICAgICAgICAgbGVhdmVPbkVuZDogb3B0aW9ucy5sZWF2ZU9uRW5kLFxuICAgICAgICAgICAgbGVhdmVPbkVuZENvb2xkb3duOiBvcHRpb25zLmxlYXZlT25FbmRDb29sZG93bixcbiAgICAgICAgICAgIGxlYXZlT25TdG9wOiBvcHRpb25zLmxlYXZlT25TdG9wLFxuICAgICAgICAgICAgbGVhdmVPblN0b3BDb29sZG93bjogb3B0aW9ucy5sZWF2ZU9uU3RvcENvb2xkb3duLFxuICAgICAgICAgICAgbWV0YWRhdGE6IG9wdGlvbnMubWV0YWRhdGEsXG4gICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dDogb3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/PyAxMjBfMDAwLFxuICAgICAgICAgICAgc2VsZkRlYWY6IG9wdGlvbnMuc2VsZkRlYWYsXG4gICAgICAgICAgICBmZm1wZWdGaWx0ZXJzOiBvcHRpb25zLmRlZmF1bHRGRm1wZWdGaWx0ZXJzID8/IFtdLFxuICAgICAgICAgICAgYnVmZmVyaW5nVGltZW91dDogb3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0LFxuICAgICAgICAgICAgbm9FbWl0SW5zZXJ0OiBvcHRpb25zLm5vRW1pdEluc2VydCA/PyBmYWxzZSxcbiAgICAgICAgICAgIHByZWZlckJyaWRnZWRNZXRhZGF0YTogb3B0aW9ucy5wcmVmZXJCcmlkZ2VkTWV0YWRhdGEsXG4gICAgICAgICAgICBtYXhIaXN0b3J5U2l6ZTogb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSxcbiAgICAgICAgICAgIG1heFNpemU6IG9wdGlvbnMubWF4U2l6ZVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNhY2hlLnNldChzZXJ2ZXIuaWQsIHF1ZXVlKTtcblxuICAgICAgICByZXR1cm4gcXVldWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGV4aXN0aW5nIHF1ZXVlXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQ8VCA9IE1ldGE+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5yZXNvbHZlKG5vZGUpO1xuICAgICAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gKHRoaXMuY2FjaGUuZ2V0KHF1ZXVlLmlkKSBhcyBHdWlsZFF1ZXVlPFQ+KSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgcXVldWUgZXhpc3RzXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBoYXMobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgaWQgPSBub2RlIGluc3RhbmNlb2YgR3VpbGRRdWV1ZSA/IG5vZGUuaWQgOiB0aGlzLnBsYXllci5jbGllbnQuZ3VpbGRzLnJlc29sdmVJZChub2RlKSE7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmhhcyhpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIHF1ZXVlXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGUobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgcXVldWUgPSB0aGlzLnJlc29sdmUobm9kZSk7XG4gICAgICAgIGlmICghcXVldWUpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX0dVSUxEX1FVRVVFKCdDYW5ub3QgZGVsZXRlIG5vbi1leGlzdGluZyBxdWV1ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUubm9kZS5zdG9wKHRydWUpO1xuICAgICAgICBxdWV1ZS5jb25uZWN0aW9uPy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgcXVldWUuZGlzcGF0Y2hlcj8ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIHF1ZXVlLmRpc3BhdGNoZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgcXVldWUudGltZW91dHMuZm9yRWFjaCgodG0pID0+IGNsZWFyVGltZW91dCh0bSkpO1xuICAgICAgICBxdWV1ZS5oaXN0b3J5LmNsZWFyKCk7XG4gICAgICAgIHF1ZXVlLnRyYWNrcy5jbGVhcigpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmRlbGV0ZShxdWV1ZS5pZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzb2x2ZTxUID0gTWV0YT4obm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBHdWlsZFF1ZXVlKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldCh0aGlzLnBsYXllci5jbGllbnQuZ3VpbGRzLnJlc29sdmVJZChub2RlKSEpIGFzIEd1aWxkUXVldWU8VD4gfCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBxdWV1ZSBpZFxuICAgICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzb2x2ZUlkKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IHEgPSB0aGlzLnJlc29sdmUobm9kZSk7XG4gICAgICAgIHJldHVybiBxPy5pZCB8fCBudWxsO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBQbGF5ZXIsIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnMsIFRyYWNrTGlrZSB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBDaGFubmVsVHlwZSwgR3VpbGQsIEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgVm9pY2VCYXNlZENoYW5uZWwsIFZvaWNlU3RhdGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IENvbGxlY3Rpb24sIFF1ZXVlLCBRdWV1ZVN0cmF0ZWd5IH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEJpcXVhZEZpbHRlcnMsIEVxdWFsaXplckJhbmQsIFBDTUZpbHRlcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IFRyYWNrLCBUcmFja1Jlc29sdmFibGUgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9IGZyb20gJy4uL1ZvaWNlSW50ZXJmYWNlL1N0cmVhbURpc3BhdGNoZXInO1xuaW1wb3J0IHsgdHlwZSBBdWRpb1BsYXllciwgQXVkaW9SZXNvdXJjZSwgU3RyZWFtVHlwZSB9IGZyb20gJ0BkaXNjb3JkanMvdm9pY2UnO1xuaW1wb3J0IHsgVXRpbCwgVkFMSURBVEVfUVVFVUVfQ0FQIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4uL2ZhYnJpYy9QbGF5bGlzdCc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlSGlzdG9yeSB9IGZyb20gJy4vR3VpbGRRdWV1ZUhpc3RvcnknO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZVBsYXllck5vZGUsIFN0cmVhbUNvbmZpZyB9IGZyb20gJy4vR3VpbGRRdWV1ZVBsYXllck5vZGUnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZUF1ZGlvRmlsdGVycyB9IGZyb20gJy4vR3VpbGRRdWV1ZUF1ZGlvRmlsdGVycyc7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBGaWx0ZXJzTmFtZSwgUXVldWVSZXBlYXRNb2RlLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAndGltZXJzJztcbmltcG9ydCB7IEd1aWxkUXVldWVTdGF0aXN0aWNzIH0gZnJvbSAnLi9HdWlsZFF1ZXVlU3RhdGlzdGljcyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IEFzeW5jUXVldWUgfSBmcm9tICcuLi91dGlscy9Bc3luY1F1ZXVlJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkTm9kZUluaXQ8TWV0YSA9IHVua25vd24+IHtcbiAgICBndWlsZDogR3VpbGQ7XG4gICAgcXVldWVTdHJhdGVneTogUXVldWVTdHJhdGVneTtcbiAgICBlcXVhbGl6ZXI6IEVxdWFsaXplckJhbmRbXSB8IGJvb2xlYW47XG4gICAgdm9sdW1lOiBudW1iZXIgfCBib29sZWFuO1xuICAgIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgcmVzYW1wbGVyOiBudW1iZXIgfCBib29sZWFuO1xuICAgIGZpbHRlcmVyOiBQQ01GaWx0ZXJzW10gfCBib29sZWFuO1xuICAgIGZmbXBlZ0ZpbHRlcnM6IEZpbHRlcnNOYW1lW107XG4gICAgZGlzYWJsZUhpc3Rvcnk6IGJvb2xlYW47XG4gICAgc2tpcE9uTm9TdHJlYW06IGJvb2xlYW47XG4gICAgb25CZWZvcmVDcmVhdGVTdHJlYW0/OiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgb25BZnRlckNyZWF0ZVN0cmVhbT86IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgIHJlcGVhdE1vZGU/OiBRdWV1ZVJlcGVhdE1vZGU7XG4gICAgbGVhdmVPbkVtcHR5OiBib29sZWFuO1xuICAgIGxlYXZlT25FbXB0eUNvb2xkb3duOiBudW1iZXI7XG4gICAgbGVhdmVPbkVuZDogYm9vbGVhbjtcbiAgICBsZWF2ZU9uRW5kQ29vbGRvd246IG51bWJlcjtcbiAgICBsZWF2ZU9uU3RvcDogYm9vbGVhbjtcbiAgICBsZWF2ZU9uU3RvcENvb2xkb3duOiBudW1iZXI7XG4gICAgY29ubmVjdGlvblRpbWVvdXQ6IG51bWJlcjtcbiAgICBzZWxmRGVhZj86IGJvb2xlYW47XG4gICAgbWV0YWRhdGE/OiBNZXRhIHwgbnVsbDtcbiAgICBidWZmZXJpbmdUaW1lb3V0OiBudW1iZXI7XG4gICAgbm9FbWl0SW5zZXJ0OiBib29sZWFuO1xuICAgIG1heFNpemU/OiBudW1iZXI7XG4gICAgbWF4SGlzdG9yeVNpemU/OiBudW1iZXI7XG4gICAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZvaWNlQ29ubmVjdENvbmZpZyB7XG4gICAgZGVhZj86IGJvb2xlYW47XG4gICAgdGltZW91dD86IG51bWJlcjtcbiAgICBhdWRpb1BsYXllcj86IEF1ZGlvUGxheWVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBvc3RQcm9jZXNzZWRSZXN1bHQge1xuICAgIHN0cmVhbTogUmVhZGFibGU7XG4gICAgdHlwZTogU3RyZWFtVHlwZTtcbn1cblxuZXhwb3J0IHR5cGUgT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyID0gKHRyYWNrOiBUcmFjaywgcXVlcnlUeXBlOiBTZWFyY2hRdWVyeVR5cGUsIHF1ZXVlOiBHdWlsZFF1ZXVlKSA9PiBQcm9taXNlPFJlYWRhYmxlIHwgbnVsbD47XG5leHBvcnQgdHlwZSBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciA9IChzdHJlYW06IFJlYWRhYmxlLCBxdWV1ZTogR3VpbGRRdWV1ZSkgPT4gUHJvbWlzZTxQb3N0UHJvY2Vzc2VkUmVzdWx0IHwgbnVsbD47XG5cbmV4cG9ydCB0eXBlIFBsYXllclRyaWdnZXJlZFJlYXNvbiA9ICdmaWx0ZXJzJyB8ICdub3JtYWwnO1xuXG5leHBvcnQgY29uc3QgR3VpbGRRdWV1ZUV2ZW50ID0ge1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyBhZGRlZCB0byB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrQWRkOiAnYXVkaW9UcmFja2FkZCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyB3ZXJlIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tzQWRkOiAnYXVkaW9UcmFja3NBZGQnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyByZW1vdmVkIGZyb20gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgYXVkaW9UcmFja1JlbW92ZTogJ2F1ZGlvVHJhY2tSZW1vdmUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3MgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrc1JlbW92ZTogJ2F1ZGlvVHJhY2tzUmVtb3ZlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjb25uZWN0aW9uIGlzIGNyZWF0ZWRcbiAgICAgKi9cbiAgICBjb25uZWN0aW9uOiAnY29ubmVjdGlvbicsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBib3QgaXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIGNoYW5uZWxcbiAgICAgKi9cbiAgICBkaXNjb25uZWN0OiAnZGlzY29ubmVjdCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBzZW5kcyBhIGRlYnVnIGluZm9cbiAgICAgKi9cbiAgICBkZWJ1ZzogJ2RlYnVnJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGVuY291bnRlcnMgZXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcjogJ2Vycm9yJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIGNoYW5uZWwgaXMgZW1wdHlcbiAgICAgKi9cbiAgICBlbXB0eUNoYW5uZWw6ICdlbXB0eUNoYW5uZWwnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgaXMgZW1wdHlcbiAgICAgKi9cbiAgICBlbXB0eVF1ZXVlOiAnZW1wdHlRdWV1ZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc3RhcnRzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgICAqL1xuICAgIHBsYXllclN0YXJ0OiAncGxheWVyU3RhcnQnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGVycm9ycyB3aGlsZSBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICAgKi9cbiAgICBwbGF5ZXJFcnJvcjogJ3BsYXllckVycm9yJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBmaW5pc2hlcyBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICAgKi9cbiAgICBwbGF5ZXJGaW5pc2g6ICdwbGF5ZXJGaW5pc2gnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIHNraXBzIGN1cnJlbnQgdHJhY2tcbiAgICAgKi9cbiAgICBwbGF5ZXJTa2lwOiAncGxheWVyU2tpcCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgaXMgdHJpZ2dlcmVkXG4gICAgICovXG4gICAgcGxheWVyVHJpZ2dlcjogJ3BsYXllclRyaWdnZXInLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgdm9pY2Ugc3RhdGUgaXMgdXBkYXRlZC4gQ29uc3VtaW5nIHRoaXMgZXZlbnQgbWF5IGRpc2FibGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlciBpZiBgUGxheWVyLmlzVm9pY2VTdGF0ZUhhbmRsZXJMb2NrZWQoKWAgcmV0dXJucyBgZmFsc2VgLlxuICAgICAqL1xuICAgIHZvaWNlU3RhdGVVcGRhdGU6ICd2b2ljZVN0YXRlVXBkYXRlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdm9sdW1lIGlzIHVwZGF0ZWRcbiAgICAgKi9cbiAgICB2b2x1bWVDaGFuZ2U6ICd2b2x1bWVDaGFuZ2UnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBwbGF5ZXIgaXMgcGF1c2VkXG4gICAgICovXG4gICAgcGxheWVyUGF1c2U6ICdwbGF5ZXJQYXVzZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHBsYXllciBpcyByZXN1bWVkXG4gICAgICovXG4gICAgcGxheWVyUmVzdW1lOiAncGxheWVyUmVzdW1lJyxcbiAgICAvKipcbiAgICAgKiBCaXF1YWQgRmlsdGVycyBVcGRhdGVcbiAgICAgKi9cbiAgICBiaXF1YWRGaWx0ZXJzVXBkYXRlOiAnYmlxdWFkRmlsdGVyc1VwZGF0ZScsXG4gICAgLyoqXG4gICAgICogRXF1YWxpemVyIFVwZGF0ZVxuICAgICAqL1xuICAgIGVxdWFsaXplclVwZGF0ZTogJ2VxdWFsaXplclVwZGF0ZScsXG4gICAgLyoqXG4gICAgICogRFNQIHVwZGF0ZVxuICAgICAqL1xuICAgIGRzcFVwZGF0ZTogJ2RzcFVwZGF0ZScsXG4gICAgLyoqXG4gICAgICogQXVkaW8gRmlsdGVycyBVcGRhdGVcbiAgICAgKi9cbiAgICBhdWRpb0ZpbHRlcnNVcGRhdGU6ICdhdWRpb0ZpbHRlcnNVcGRhdGUnLFxuICAgIC8qKlxuICAgICAqIEF1ZGlvIHBsYXllciB3aWxsIHBsYXkgbmV4dCB0cmFja1xuICAgICAqL1xuICAgIHdpbGxQbGF5VHJhY2s6ICd3aWxsUGxheVRyYWNrJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlRXZlbnRzPE1ldGEgPSB1bmtub3duPiB7XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrQWRkOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaykgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2tzIHdlcmUgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrcyBUaGUgdHJhY2tzIGFycmF5XG4gICAgICovXG4gICAgYXVkaW9UcmFja3NBZGQ6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrW10pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrXG4gICAgICovXG4gICAgYXVkaW9UcmFja1JlbW92ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2spID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrc1JlbW92ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2tbXSkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjb25uZWN0aW9uIGlzIGNyZWF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBjb25uZWN0aW9uOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBib3QgaXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBkaXNjb25uZWN0OiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBzZW5kcyBhIGRlYnVnIGluZm9cbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZGVidWcgbWVzc2FnZVxuICAgICAqL1xuICAgIGRlYnVnOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG1lc3NhZ2U6IHN0cmluZykgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGVuY291bnRlcnMgZXJyb3JcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yXG4gICAgICovXG4gICAgZXJyb3I6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgZXJyb3I6IEVycm9yKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgdm9pY2UgY2hhbm5lbCBpcyBlbXB0eVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGVtcHR5Q2hhbm5lbDogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgaXMgZW1wdHlcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBlbXB0eVF1ZXVlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc3RhcnRzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCBpcyBiZWluZyBzdHJlYW1lZFxuICAgICAqL1xuICAgIHBsYXllclN0YXJ0OiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaykgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBlcnJvcnMgd2hpbGUgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvclxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCBpcyBiZWluZyBzdHJlYW1lZFxuICAgICAqL1xuICAgIHBsYXllckVycm9yOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIGVycm9yOiBFcnJvciwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGZpbmlzaGVzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCB3YXMgYmVpbmcgc3RyZWFtZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJGaW5pc2g6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIHNraXBzIGN1cnJlbnQgdHJhY2tcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRoYXQgd2FzIHNraXBwZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJTa2lwOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaykgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBpcyB0cmlnZ2VyZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHdoaWNoIHdhcyBwbGF5ZWQgaW4gdGhpcyBldmVudFxuICAgICAqL1xuICAgIHBsYXllclRyaWdnZXI6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrLCByZWFzb246IFBsYXllclRyaWdnZXJlZFJlYXNvbikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIHN0YXRlIGlzIHVwZGF0ZWQuIENvbnN1bWluZyB0aGlzIGV2ZW50IG1heSBkaXNhYmxlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgYFBsYXllci5pc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKClgIHJldHVybnMgYGZhbHNlYC5cbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gb2xkU3RhdGUgVGhlIG9sZCB2b2ljZSBzdGF0ZVxuICAgICAqIEBwYXJhbSBuZXdTdGF0ZSBUaGUgbmV3IHZvaWNlIHN0YXRlXG4gICAgICovXG4gICAgdm9pY2VTdGF0ZVVwZGF0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHBsYXllciBpcyBwYXVzZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJQYXVzZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyBwbGF5ZXIgaXMgcmVzdW1lZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIHBsYXllclJlc3VtZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyBwbGF5ZXIncyB2b2x1bWUgaXMgY2hhbmdlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRWb2x1bWUgVGhlIG9sZCB2b2x1bWVcbiAgICAgKiBAcGFyYW0gbmV3Vm9sdW1lIFRoZSB1cGRhdGVkIHZvbHVtZVxuICAgICAqL1xuICAgIHZvbHVtZUNoYW5nZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRWb2x1bWU6IG51bWJlciwgbmV3Vm9sdW1lOiBudW1iZXIpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGVxdWFsaXplciBjb25maWcgaXMgdXBkYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICAgKi9cbiAgICBlcXVhbGl6ZXJVcGRhdGU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgb2xkRmlsdGVyczogRXF1YWxpemVyQmFuZFtdLCBuZXdGaWx0ZXJzOiBFcXVhbGl6ZXJCYW5kW10pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGJpcXVhZCBmaWx0ZXJzIGlzIHVwZGF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAgICovXG4gICAgYmlxdWFkRmlsdGVyc1VwZGF0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRGaWx0ZXJzOiBCaXF1YWRGaWx0ZXJzIHwgbnVsbCwgbmV3RmlsdGVyczogQmlxdWFkRmlsdGVycyB8IG51bGwpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGRzcCBmaWx0ZXJzIGlzIHVwZGF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAgICovXG4gICAgZHNwVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZEZpbHRlcnM6IFBDTUZpbHRlcnNbXSwgbmV3RmlsdGVyczogUENNRmlsdGVyc1tdKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBmZm1wZWcgYXVkaW8gZmlsdGVycyBpcyB1cGRhdGVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgICAqL1xuICAgIGF1ZGlvRmlsdGVyc1VwZGF0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdLCBuZXdGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdKSA9PiB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgc3RyZWFtaW5nIGFuIGF1ZGlvIHRyYWNrLiBUaGlzIGV2ZW50IGNhbiBiZSB1c2VkIHRvIG1vZGlmeSBzdHJlYW0gY29uZmlnIGJlZm9yZSBwbGF5aW5nIGEgdHJhY2suXG4gICAgICogTGlzdGVuaW5nIHRvIHRoaXMgZXZlbnQgd2lsbCBwYXVzZSB0aGUgZXhlY3V0aW9uIG9mIGF1ZGlvIHBsYXllciB1bnRpbCBgZG9uZSgpYCBpcyBpbnZva2VkLlxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCB3aWxsIGJlIHN0cmVhbWVkXG4gICAgICogQHBhcmFtIGNvbmZpZyBDb25maWd1cmF0aW9ucyBmb3Igc3RyZWFtaW5nXG4gICAgICogQHBhcmFtIGRvbmUgRG9uZSBjYWxsYmFja1xuICAgICAqL1xuICAgIHdpbGxQbGF5VHJhY2s6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrPHVua25vd24+LCBjb25maWc6IFN0cmVhbUNvbmZpZywgZG9uZTogKCkgPT4gdm9pZCkgPT4gdW5rbm93bjtcbn1cblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWU8TWV0YSA9IHVua25vd24+IHtcbiAgICAjdHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgICNkZWxldGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfX2N1cnJlbnQ6IFRyYWNrIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIHRyYWNrczogUXVldWU8VHJhY2s+O1xuICAgIHB1YmxpYyBoaXN0b3J5ID0gbmV3IEd1aWxkUXVldWVIaXN0b3J5PE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyBkaXNwYXRjaGVyOiBTdHJlYW1EaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIG5vZGUgPSBuZXcgR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIGZpbHRlcnMgPSBuZXcgR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPih0aGlzKTtcbiAgICBwdWJsaWMgb25CZWZvcmVDcmVhdGVTdHJlYW06IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciA9IGFzeW5jICgpID0+IG51bGw7XG4gICAgcHVibGljIG9uQWZ0ZXJDcmVhdGVTdHJlYW06IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyID0gYXN5bmMgKHN0cmVhbSkgPT4gKHtcbiAgICAgICAgc3RyZWFtLFxuICAgICAgICB0eXBlOiBTdHJlYW1UeXBlLlJhd1xuICAgIH0pO1xuICAgIHB1YmxpYyByZXBlYXRNb2RlID0gUXVldWVSZXBlYXRNb2RlLk9GRjtcbiAgICBwdWJsaWMgdGltZW91dHMgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIE5vZGVKUy5UaW1lb3V0PigpO1xuICAgIHB1YmxpYyBzdGF0cyA9IG5ldyBHdWlsZFF1ZXVlU3RhdGlzdGljczxNZXRhPih0aGlzKTtcbiAgICBwdWJsaWMgdGFza3NRdWV1ZSA9IG5ldyBBc3luY1F1ZXVlKCk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyLCBwdWJsaWMgb3B0aW9uczogR3VpbGROb2RlSW5pdDxNZXRhPikge1xuICAgICAgICB0aGlzLnRyYWNrcyA9IG5ldyBRdWV1ZTxUcmFjaz4ob3B0aW9ucy5xdWV1ZVN0cmF0ZWd5KTtcbiAgICAgICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24ob3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSkpIHRoaXMub25CZWZvcmVDcmVhdGVTdHJlYW0gPSBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtO1xuICAgICAgICBpZiAoVHlwZVV0aWwuaXNGdW5jdGlvbihvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0pKSB0aGlzLm9uQWZ0ZXJDcmVhdGVTdHJlYW0gPSBvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW07XG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNOdWxsaXNoKG9wdGlvbnMucmVwZWF0TW9kZSkpIHRoaXMucmVwZWF0TW9kZSA9IG9wdGlvbnMucmVwZWF0TW9kZTtcblxuICAgICAgICBvcHRpb25zLnNlbGZEZWFmID8/PSB0cnVlO1xuICAgICAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgICAgICBvcHRpb25zLm1heEhpc3RvcnlTaXplID8/PSBJbmZpbml0eTtcblxuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzTnVsbGlzaCh0aGlzLm9wdGlvbnMuYmlxdWFkKSAmJiAhVHlwZVV0aWwuaXNCb29sZWFuKHRoaXMub3B0aW9ucy5iaXF1YWQpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkID0gdGhpcy5vcHRpb25zLmJpcXVhZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5lcXVhbGl6ZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyID0gdGhpcy5vcHRpb25zLmVxdWFsaXplcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5maWx0ZXJlcikpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzID0gdGhpcy5vcHRpb25zLmZpbHRlcmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFR5cGVVdGlsLmlzTnVtYmVyKHRoaXMub3B0aW9ucy5yZXNhbXBsZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZSA9IHRoaXMub3B0aW9ucy5yZXNhbXBsZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVHlwZVV0aWwuaXNBcnJheSh0aGlzLm9wdGlvbnMuZmZtcGVnRmlsdGVycykpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5mZm1wZWcuc2V0RGVmYXVsdHModGhpcy5vcHRpb25zLmZmbXBlZ0ZpbHRlcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihvcHRpb25zLm1heFNpemUpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdbR3VpbGROb2RlSW5pdC5tYXhTaXplXScsICdudW1iZXInLCB0eXBlb2Ygb3B0aW9ucy5tYXhTaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIob3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSkpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ1tHdWlsZE5vZGVJbml0Lm1heEhpc3RvcnlTaXplXScsICdudW1iZXInLCB0eXBlb2Ygb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5tYXhTaXplIDwgMSkgb3B0aW9ucy5tYXhTaXplID0gSW5maW5pdHk7XG4gICAgICAgIGlmIChvcHRpb25zLm1heEhpc3RvcnlTaXplIDwgMSkgb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA9IEluZmluaXR5O1xuXG4gICAgICAgIHRoaXMuZGVidWcoYEd1aWxkUXVldWUgaW5pdGlhbGl6ZWQgZm9yIGd1aWxkICR7dGhpcy5vcHRpb25zLmd1aWxkLm5hbWV9IChJRDogJHt0aGlzLm9wdGlvbnMuZ3VpbGQuaWR9KWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzdGltYXRlZCBkdXJhdGlvbiBvZiB0aGlzIHF1ZXVlIGluIG1zXG4gICAgICovXG4gICAgcHVibGljIGdldCBlc3RpbWF0ZWREdXJhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnN0b3JlLnJlZHVjZSgoYSwgYykgPT4gYSArIGMuZHVyYXRpb25NUywgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9ybWF0dGVkIGR1cmF0aW9uIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGR1cmF0aW9uRm9ybWF0dGVkKCkge1xuICAgICAgICByZXR1cm4gVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyh0aGlzLmVzdGltYXRlZER1cmF0aW9uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIHJlY2VpdmVyIGZvciB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCB2b2ljZVJlY2VpdmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy5yZWNlaXZlciA/PyBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgZGVidWcgbWVzc2FnZSB0byB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIG0gVGhlIG1lc3NhZ2UgdG8gd3JpdGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVidWcobTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KCdkZWJ1ZycsIHRoaXMsIG0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBtZXRhZGF0YSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBtZXRhZGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tZXRhZGF0YSE7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBtZXRhZGF0YShtOiBNZXRhKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5tZXRhZGF0YSA9IG07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG1ldGFkYXRhIGZvciB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIG0gTWV0YWRhdGEgdG8gc2V0XG4gICAgICovXG4gICAgcHVibGljIHNldE1ldGFkYXRhKG06IE1ldGEpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm1ldGFkYXRhID0gbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgY3VycmVudCB0cmFjayBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBjdXJyZW50VHJhY2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LmF1ZGlvUmVzb3VyY2U/Lm1ldGFkYXRhIHx8IHRoaXMuX19jdXJyZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGlzIHF1ZXVlIHdhcyBkZWxldGVkIHByZXZpb3VzbHlcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRlbGV0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkZWxldGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSBjaGFubmVsIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNoYW5uZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LmNoYW5uZWwgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGNoYW5uZWwoYzogVm9pY2VCYXNlZENoYW5uZWwgfCBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc3BhdGNoZXIpIHtcbiAgICAgICAgICAgIGlmIChjKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmNoYW5uZWwgPSBjO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb24gb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29ubmVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8udm9pY2VDb25uZWN0aW9uIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGd1aWxkIHRoaXMgcXVldWUgYmVsb25ncyB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZ3VpbGQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZ3VpbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ndWlsZC5pZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdHJhbnNpdGlvbiBtb2RlIGZvciB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZSB0byBzZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0VHJhbnNpdGlvbmluZyhzdGF0ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLiN0cmFuc2l0aW9uaW5nID0gc3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogaWYgdGhpcyBxdWV1ZSBpcyBjdXJyZW50bHkgdW5kZXIgdHJhbnNpdGlvbiBtb2RlXG4gICAgICovXG4gICAgcHVibGljIGlzVHJhbnNpdGlvbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RyYW5zaXRpb25pbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHJlcGVhdCBtb2RlIGZvciB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIHJlcGVhdCBtb2RlIHRvIGFwcGx5XG4gICAgICovXG4gICAgcHVibGljIHNldFJlcGVhdE1vZGUobW9kZTogUXVldWVSZXBlYXRNb2RlKSB7XG4gICAgICAgIHRoaXMucmVwZWF0TW9kZSA9IG1vZGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWF4IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWF4U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tYXhTaXplID8/IEluZmluaXR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1heCBzaXplIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TWF4U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF4U2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1heCBoaXN0b3J5IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWF4SGlzdG9yeVNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz8gSW5maW5pdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWF4IGhpc3Rvcnkgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldE1heEhpc3RvcnlTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXhIaXN0b3J5U2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgbWF4IGhpc3Rvcnkgc2l6ZSBmb3IgdGhpcyBxdWV1ZVxuICAgICAqIEBwYXJhbSBzaXplIFRoZSBzaXplIHRvIHNldFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRNYXhIaXN0b3J5U2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihzaXplKSkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnc2l6ZScsICdudW1iZXInLCB0eXBlb2Ygc2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2l6ZSA8IDEpIHNpemUgPSBJbmZpbml0eTtcblxuICAgICAgICB0aGlzLm9wdGlvbnMubWF4SGlzdG9yeVNpemUgPSBzaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBtYXggc2l6ZSBmb3IgdGhpcyBxdWV1ZVxuICAgICAqIEBwYXJhbSBzaXplIFRoZSBzaXplIHRvIHNldFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRNYXhTaXplKHNpemU6IG51bWJlcikge1xuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzTnVtYmVyKHNpemUpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdzaXplJywgJ251bWJlcicsIHR5cGVvZiBzaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaXplIDwgMSkgc2l6ZSA9IEluZmluaXR5O1xuXG4gICAgICAgIHRoaXMub3B0aW9ucy5tYXhTaXplID0gc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyKCkge1xuICAgICAgICB0aGlzLnRyYWNrcy5jbGVhcigpO1xuICAgICAgICB0aGlzLmhpc3RvcnkuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGhhcyBubyB0cmFja3MgbGVmdCBpbiBpdFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZSA8IDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhpcyBxdWV1ZSBpcyBmdWxsXG4gICAgICovXG4gICAgcHVibGljIGlzRnVsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemUgPj0gdGhpcy5tYXhTaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBxdWV1ZSBjYXBhY2l0eVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDYXBhY2l0eSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGdWxsKCkpIHJldHVybiAwO1xuICAgICAgICBjb25zdCBjYXAgPSB0aGlzLm1heFNpemUgLSB0aGlzLnNpemU7XG4gICAgICAgIHJldHVybiBjYXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhpcyBxdWV1ZSBjdXJyZW50bHkgaG9sZHMgYWN0aXZlIGF1ZGlvIHJlc291cmNlXG4gICAgICovXG4gICAgcHVibGljIGlzUGxheWluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZSAhPSBudWxsICYmICF0aGlzLmRpc3BhdGNoZXIuYXVkaW9SZXNvdXJjZS5lbmRlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgdHJhY2sgdG8gdGhlIHF1ZXVlLiBUaGlzIHdpbGwgZW1pdCBgYXVkaW9UcmFja3NBZGRgIHdoZW4gbXVsdGlwbGUgdHJhY2tzIGFyZSBhZGRlZCwgb3RoZXJ3aXNlIGBhdWRpb1RyYWNrQWRkYC5cbiAgICAgKiBAcGFyYW0gdHJhY2sgVHJhY2sgb3IgcGxheWxpc3Qgb3IgYXJyYXkgb2YgdHJhY2tzIHRvIGFkZFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRUcmFjayh0cmFjazogVHJhY2sgfCBUcmFja1tdIHwgUGxheWxpc3QpIHtcbiAgICAgICAgY29uc3QgdG9BZGQgPSB0cmFjayBpbnN0YW5jZW9mIFBsYXlsaXN0ID8gdHJhY2sudHJhY2tzIDogdHJhY2s7XG4gICAgICAgIGNvbnN0IGlzTXVsdGkgPSBBcnJheS5pc0FycmF5KHRvQWRkKTtcblxuICAgICAgICBWQUxJREFURV9RVUVVRV9DQVAodGhpcywgdG9BZGQpO1xuXG4gICAgICAgIHRoaXMudHJhY2tzLmFkZCh0b0FkZCk7XG5cbiAgICAgICAgaWYgKGlzTXVsdGkpIHtcbiAgICAgICAgICAgIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KCdhdWRpb1RyYWNrc0FkZCcsIHRoaXMsIHRvQWRkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KCdhdWRpb1RyYWNrQWRkJywgdGhpcywgdG9BZGQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgdHJhY2sgZnJvbSBxdWV1ZVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gcmVtb3ZlXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZVRyYWNrKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5yZW1vdmUodHJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydHMgdGhlIHRyYWNrIHRvIHRoZSBnaXZlbiBpbmRleFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gaW5zZXJ0XG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB0byBpbnNlcnQgdGhlIHRyYWNrIGF0IChkZWZhdWx0cyB0byAwKVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnNlcnRUcmFjayh0cmFjazogVHJhY2ssIGluZGV4ID0gMCk6IHZvaWQge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLmluc2VydCh0cmFjaywgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIG1vdmVcbiAgICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIG1vdmUgdG9cbiAgICAgKi9cbiAgICBwdWJsaWMgbW92ZVRyYWNrKHRyYWNrOiBUcmFja1Jlc29sdmFibGUsIGluZGV4ID0gMCk6IHZvaWQge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLm1vdmUodHJhY2ssIGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3B5IGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIGNsb25lXG4gICAgICogQHBhcmFtIHRvIFRoZSBwb3NpdGlvbiB0byBjbG9uZSBhdFxuICAgICAqL1xuICAgIHB1YmxpYyBjb3B5VHJhY2sodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSwgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUuY29weSh0cmFjaywgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN3YXAgdHdvIHRyYWNrcyBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gc3JjIFRoZSBmaXJzdCB0cmFjayB0byBzd2FwXG4gICAgICogQHBhcmFtIGRlc3QgVGhlIHNlY29uZCB0cmFjayB0byBzd2FwXG4gICAgICovXG4gICAgcHVibGljIHN3YXBUcmFja3Moc3JjOiBUcmFja1Jlc29sdmFibGUsIGRlc3Q6IFRyYWNrUmVzb2x2YWJsZSk6IHZvaWQge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLnN3YXAoc3JjLCBkZXN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25uZWN0IHRvIGEgdm9pY2UgY2hhbm5lbFxuICAgICAqIEBwYXJhbSBjaGFubmVsUmVzb2x2YWJsZSBUaGUgdm9pY2UgY2hhbm5lbCB0byBjb25uZWN0IHRvXG4gICAgICogQHBhcmFtIG9wdGlvbnMgSm9pbiBjb25maWdcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgY29ubmVjdChjaGFubmVsUmVzb2x2YWJsZTogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLCBvcHRpb25zOiBWb2ljZUNvbm5lY3RDb25maWcgPSB7fSkge1xuICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5wbGF5ZXIuY2xpZW50LmNoYW5uZWxzLnJlc29sdmUoY2hhbm5lbFJlc29sdmFibGUpO1xuICAgICAgICBpZiAoIWNoYW5uZWwgfHwgIWNoYW5uZWwuaXNWb2ljZUJhc2VkKCkpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2NoYW5uZWwnLCBgVm9pY2VCYXNlZENoYW5uZWwgKHR5cGUgJHtDaGFubmVsVHlwZS5HdWlsZFZvaWNlfS8ke0NoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZX0pYCwgU3RyaW5nKGNoYW5uZWw/LnR5cGUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVidWcoYENvbm5lY3RpbmcgdG8gJHtjaGFubmVsLnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZSA/ICdzdGFnZScgOiAndm9pY2UnfSBjaGFubmVsICR7Y2hhbm5lbC5uYW1lfSAoSUQ6ICR7Y2hhbm5lbC5pZH0pYCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGlzcGF0Y2hlcikge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZygnRGVzdHJveWluZyBvbGQgY29ubmVjdGlvbicpO1xuICAgICAgICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gYXdhaXQgdGhpcy5wbGF5ZXIudm9pY2VVdGlscy5jb25uZWN0KGNoYW5uZWwsIHtcbiAgICAgICAgICAgIGRlYWY6IG9wdGlvbnMuZGVhZiA/PyB0aGlzLm9wdGlvbnMuc2VsZkRlYWYgPz8gdHJ1ZSxcbiAgICAgICAgICAgIG1heFRpbWU6IG9wdGlvbnM/LnRpbWVvdXQgPz8gdGhpcy5vcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/IDEyMF8wMDAsXG4gICAgICAgICAgICBxdWV1ZTogdGhpcyxcbiAgICAgICAgICAgIGF1ZGlvUGxheWVyOiBvcHRpb25zPy5hdWRpb1BsYXllclxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnBsYXllci5ldmVudHMuZW1pdCgnY29ubmVjdGlvbicsIHRoaXMpO1xuXG4gICAgICAgIGlmICh0aGlzLmNoYW5uZWwhLnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGFubmVsIS5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXRTdXBwcmVzc2VkKGZhbHNlKS5jYXRjaChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hhbm5lbCEuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsodHJ1ZSkuY2F0Y2goVXRpbC5ub29wKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy4jYXR0YWNoTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb24gbGF0ZW5jeSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uPy5waW5nLnVkcCA/PyAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnBsYXllci5ub2Rlcy5kZWxldGUodGhpcy5pZCkpIHtcbiAgICAgICAgICAgIHRoaXMuI2RlbGV0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2aXZlcyB0aGlzIHF1ZXVlXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwdWJsaWMgcmV2aXZlKCkge1xuICAgICAgICBpZiAoIXRoaXMuZGVsZXRlZCB8fCB0aGlzLnBsYXllci5ub2Rlcy5oYXModGhpcy5pZCkpIHJldHVybjtcbiAgICAgICAgdGhpcy4jZGVsZXRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBsYXllci5ub2Rlcy5jYWNoZS5zZXQodGhpcy5pZCwgdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHNlbGYgZGVhZlxuICAgICAqIEBwYXJhbSBtb2RlIE9uL09mZiBzdGF0ZVxuICAgICAqIEBwYXJhbSByZWFzb24gUmVhc29uXG4gICAgICovXG4gICAgcHVibGljIHNldFNlbGZEZWFmKG1vZGU/OiBib29sZWFuLCByZWFzb24/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0RGVhZihtb2RlLCByZWFzb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBzZWxmIG11dGVcbiAgICAgKiBAcGFyYW0gbW9kZSBPbi9PZmYgc3RhdGVcbiAgICAgKiBAcGFyYW0gcmVhc29uIFJlYXNvblxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRTZWxmTXV0ZShtb2RlPzogYm9vbGVhbiwgcmVhc29uPzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldE11dGUobW9kZSwgcmVhc29uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGF5IGEgdHJhY2sgaW4gdGhpcyBxdWV1ZVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gYmUgcGxheWVkXG4gICAgICogQHBhcmFtIG9wdGlvbnMgUGxheWVyIG5vZGUgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwbGF5KHRyYWNrOiBUcmFja0xpa2UsIG9wdGlvbnM/OiBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPE1ldGE+KSB7XG4gICAgICAgIGlmICghdGhpcy5jaGFubmVsKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19WT0lDRV9DT05ORUNUSU9OKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWVyLnBsYXkodGhpcy5jaGFubmVsLCB0cmFjaywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgI2F0dGFjaExpc3RlbmVycyhkaXNwYXRjaGVyOiBTdHJlYW1EaXNwYXRjaGVyKSB7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2Vycm9yJywgKGUpID0+IHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KCdlcnJvcicsIHRoaXMsIGUpKTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignZGVidWcnLCAobSkgPT4gdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoJ2RlYnVnJywgdGhpcywgbSkpO1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdmaW5pc2gnLCAocikgPT4gdGhpcy4jcGVyZm9ybUZpbmlzaChyKSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ3N0YXJ0JywgKHIpID0+IHRoaXMuI3BlcmZvcm1TdGFydChyKSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2RzcCcsIChmKSA9PiB7XG4gICAgICAgICAgICBpZiAoIU9iamVjdC5pcyh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycywgZikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXllci5ldmVudHMuZW1pdCgnZHNwVXBkYXRlJywgdGhpcywgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMsIGYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMgPSBmO1xuICAgICAgICB9KTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignYmlxdWFkJywgKGYpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkICE9PSBmKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoJ2JpcXVhZEZpbHRlcnNVcGRhdGUnLCB0aGlzLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkLCBmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgPSBmO1xuICAgICAgICB9KTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignZXFCYW5kcycsIChmKSA9PiB7XG4gICAgICAgICAgICBpZiAoIU9iamVjdC5pcyhmLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KCdlcXVhbGl6ZXJVcGRhdGUnLCB0aGlzLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyLCBmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIgPSBmO1xuICAgICAgICB9KTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbigndm9sdW1lJywgKGYpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lICE9PSBmKSB0aGlzLnBsYXllci5ldmVudHMuZW1pdCgndm9sdW1lQ2hhbmdlJywgdGhpcywgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSwgZik7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lID0gZjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgI3JlbW92ZUxpc3RlbmVycyhkaXNwYXRjaGVyOiBTdHJlYW1EaXNwYXRjaGVyKSB7XG4gICAgICAgIGRpc3BhdGNoZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgI3BlcmZvcm1TdGFydChyZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgICAgIGNvbnN0IHRyYWNrID0gcmVzb3VyY2U/Lm1ldGFkYXRhIHx8IHRoaXMuY3VycmVudFRyYWNrO1xuICAgICAgICBjb25zdCByZWFzb24gPSB0aGlzLmlzVHJhbnNpdGlvbmluZygpID8gJ2ZpbHRlcnMnIDogJ25vcm1hbCc7XG5cbiAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgIGBQbGF5ZXIgdHJpZ2dlcmVkIGZvciBUcmFjayAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICB0aXRsZTogdHJhY2s/LnRpdGxlLFxuICAgICAgICAgICAgICAgIHJlYXNvblxuICAgICAgICAgICAgfSl9YFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KCdwbGF5ZXJUcmlnZ2VyJywgdGhpcywgdHJhY2shLCByZWFzb24pO1xuICAgICAgICBpZiAodHJhY2sgJiYgIXRoaXMuaXNUcmFuc2l0aW9uaW5nKCkpIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KCdwbGF5ZXJTdGFydCcsIHRoaXMsIHRyYWNrKTtcbiAgICAgICAgdGhpcy5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgICB9XG5cbiAgICAjcGVyZm9ybUZpbmlzaChyZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgICAgIGNvbnN0IHRyYWNrID0gcmVzb3VyY2U/Lm1ldGFkYXRhIHx8IHRoaXMuY3VycmVudFRyYWNrO1xuXG4gICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgICBgVHJhY2sgJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgdGl0bGU6IHRyYWNrPy50aXRsZSxcbiAgICAgICAgICAgICAgICBpc1RyYW5zaXRpb25Nb2RlOiB0aGlzLmlzVHJhbnNpdGlvbmluZygpXG4gICAgICAgICAgICB9KX0gd2FzIG1hcmtlZCBhcyBmaW5pc2hlZGBcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodHJhY2sgJiYgIXRoaXMuaXNUcmFuc2l0aW9uaW5nKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoJ0FkZGluZyB0cmFjayB0byBoaXN0b3J5IGFuZCBlbWl0dGluZyBmaW5pc2ggZXZlbnQgc2luY2UgdHJhbnNpdGlvbiBtb2RlIGlzIGRpc2FibGVkLi4uJyk7XG4gICAgICAgICAgICB0aGlzLmhpc3RvcnkucHVzaCh0cmFjayk7XG4gICAgICAgICAgICB0aGlzLm5vZGUucmVzZXRQcm9ncmVzcygpO1xuICAgICAgICAgICAgdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoJ3BsYXllckZpbmlzaCcsIHRoaXMsIHRyYWNrKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyYWNrcy5zaXplIDwgMSAmJiB0aGlzLnJlcGVhdE1vZGUgPT09IFF1ZXVlUmVwZWF0TW9kZS5PRkYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKCdObyBtb3JlIHRyYWNrcyBsZWZ0IGluIHRoZSBxdWV1ZSB0byBwbGF5IGFuZCByZXBlYXQgbW9kZSBpcyBvZmYsIGluaXRpYXRpbmcgI2VtaXRFbmQoKScpO1xuICAgICAgICAgICAgICAgIHRoaXMuI2VtaXRFbmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLlRSQUNLKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoJ1JlcGVhdCBtb2RlIGlzIHNldCB0byB0cmFjaywgcmVwZWF0aW5nIGxhc3QgdHJhY2sgZnJvbSB0aGUgaGlzdG9yeS4uLicpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9fY3VycmVudCA9IHRoaXMuaGlzdG9yeS50cmFja3MuZGlzcGF0Y2goKSB8fCB0cmFjaztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5wbGF5KHRoaXMuX19jdXJyZW50ISwgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlcGVhdE1vZGUgPT09IFF1ZXVlUmVwZWF0TW9kZS5RVUVVRSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKCdSZXBlYXQgbW9kZSBpcyBzZXQgdG8gcXVldWUsIG1vdmluZyBsYXN0IHRyYWNrIGZyb20gdGhlIGhpc3RvcnkgdG8gY3VycmVudCBxdWV1ZS4uLicpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYWNrcy5hZGQodGhpcy5oaXN0b3J5LnRyYWNrcy5kaXNwYXRjaCgpIHx8IHRyYWNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnRyYWNrcy5zaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlcGVhdE1vZGUgPT09IFF1ZXVlUmVwZWF0TW9kZS5BVVRPUExBWSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZygnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIGF1dG9wbGF5LCBpbml0aWF0aW5nIGF1dG9wbGF5IGhhbmRsZXIuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2hhbmRsZUF1dG9wbGF5KHRyYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoJ0luaXRpYWxpemluZyBuZXh0IHRyYWNrIG9mIHRoZSBxdWV1ZS4uLicpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9fY3VycmVudCA9IHRoaXMudHJhY2tzLmRpc3BhdGNoKCkhO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUucGxheSh0aGlzLl9fY3VycmVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVldWU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgICNlbWl0RW5kKCkge1xuICAgICAgICB0aGlzLl9fY3VycmVudCA9IG51bGw7XG4gICAgICAgIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KCdlbXB0eVF1ZXVlJywgdGhpcyk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGVhdmVPbkVuZCkge1xuICAgICAgICAgICAgY29uc3QgdG06IE5vZGVKUy5UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKCkpIHJldHVybiBjbGVhclRpbWVvdXQodG0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlcj8uZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgfSwgdGhpcy5vcHRpb25zLmxlYXZlT25FbmRDb29sZG93bikudW5yZWYoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jICNoYW5kbGVBdXRvcGxheSh0cmFjazogVHJhY2spIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IEZpbmRpbmcgcmVsYXRlZCB0cmFja3MgZm9yIFRyYWNrICR7dHJhY2sudGl0bGV9ICgke3RyYWNrLnVybH0pIFtleHQ6JHt0cmFjay5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9XWApO1xuICAgICAgICAgICAgY29uc3QgdHJhY2tzID1cbiAgICAgICAgICAgICAgICAoYXdhaXQgdHJhY2suZXh0cmFjdG9yPy5nZXRSZWxhdGVkVHJhY2tzKHRyYWNrKSk/LnRyYWNrcyB8fFxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbGF5ZXIuZXh0cmFjdG9ycy5ydW4oYXN5bmMgKGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgQXV0b3BsYXkgPj4gUXVlcnlpbmcgZXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBleHQuZ2V0UmVsYXRlZFRyYWNrcyh0cmFjayk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcy50cmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgQXV0b3BsYXkgPj4gRXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9IGZhaWxlZCB0byBwcm92aWRlIHJlc3VsdHMuYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gc3VjY2Vzc2Z1bGx5IHJldHVybmVkIHJlc3VsdHMuYCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXMudHJhY2tzO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk/LnJlc3VsdCB8fFxuICAgICAgICAgICAgICAgIFtdO1xuICAgICAgICAgICAgaWYgKCF0cmFja3M/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IE5vIHJlbGF0ZWQgdHJhY2tzIGZvdW5kLmApO1xuICAgICAgICAgICAgICAgIHRocm93ICdubyByZWxhdGVkIHRyYWNrcyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IFBpY2tpbmcgcmFuZG9tIHRyYWNrIGZyb20gZmlyc3QgNSB0cmFja3MuLi5gKTtcbiAgICAgICAgICAgIGNvbnN0IG5leHRUcmFjayA9IFV0aWwucmFuZG9tQ2hvaWNlKHRyYWNrcy5zbGljZSgwLCA1KSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm5vZGUucGxheShuZXh0VHJhY2ssIHtcbiAgICAgICAgICAgICAgICBxdWV1ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2VlazogMCxcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uTW9kZTogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNlbWl0RW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgUXVldWUgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVIaXN0b3J5PE1ldGEgPSB1bmtub3duPiB7XG4gICAgcHVibGljIHRyYWNrcyA9IG5ldyBRdWV1ZTxUcmFjaz4oJ0xJRk8nKTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gICAgLyoqXG4gICAgICogQ3VycmVudCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRUcmFjaygpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8ubWV0YWRhdGEgfHwgKCh0aGlzLnF1ZXVlIGFzIGFueSkuX19jdXJyZW50IGFzIFRyYWNrIHwgbnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTmV4dCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG5leHRUcmFjaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUudHJhY2tzLmF0KDApIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJldmlvdXMgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBwcmV2aW91c1RyYWNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3MuYXQoMCkgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiBoaXN0b3J5IGlzIGRpc2FibGVkXG4gICAgICovXG4gICAgcHVibGljIGdldCBkaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlSGlzdG9yeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgaGlzdG9yeSBpcyBlbXB0eVxuICAgICAqL1xuICAgIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZSA8IDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIHRyYWNrIHRvIHRyYWNrIGhpc3RvcnlcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGFkZFxuICAgICAqL1xuICAgIHB1YmxpYyBwdXNoKHRyYWNrOiBUcmFjayB8IFRyYWNrW10pIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy50cmFja3MuYWRkKHRyYWNrKTtcblxuICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIGhpc3RvcnlcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMudHJhY2tzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSB0aGUgbmV4dCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgbmV4dCgpIHtcbiAgICAgICAgY29uc3QgdHJhY2sgPSB0aGlzLm5leHRUcmFjaztcbiAgICAgICAgaWYgKCF0cmFjaykge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKCdObyBuZXh0IHRyYWNrIGluIHRoZSBxdWV1ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5xdWV1ZS5ub2RlLnNraXAoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGF5IHRoZSBwcmV2aW91cyB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcHJldmlvdXMocHJlc2VydmVDdXJyZW50ID0gdHJ1ZSkge1xuICAgICAgICBjb25zdCB0cmFjayA9IHRoaXMudHJhY2tzLmRpc3BhdGNoKCk7XG4gICAgICAgIGlmICghdHJhY2spIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVCgnTm8gcHJldmlvdXMgdHJhY2sgaW4gdGhlIHF1ZXVlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50VHJhY2s7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5ub2RlLnBsYXkodHJhY2ssIHsgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICBpZiAoY3VycmVudCAmJiBwcmVzZXJ2ZUN1cnJlbnQpIHRoaXMucXVldWUubm9kZS5pbnNlcnQoY3VycmVudCwgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgdG8gW0d1aWxkUXVldWVIaXN0b3J5XS5wcmV2aW91cygpXG4gICAgICovXG4gICAgcHVibGljIGJhY2socHJlc2VydmVDdXJyZW50ID0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmV2aW91cyhwcmVzZXJ2ZUN1cnJlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2l6ZSBoaXN0b3J5IHN0b3JlXG4gICAgICovXG4gICAgcHVibGljIHJlc2l6ZSgpIHtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodGhpcy5xdWV1ZS5tYXhIaXN0b3J5U2l6ZSkpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMudHJhY2tzLnN0b3JlLmxlbmd0aCA8IHRoaXMucXVldWUubWF4SGlzdG9yeVNpemUpIHJldHVybjtcbiAgICAgICAgdGhpcy50cmFja3Muc3RvcmUuc3BsaWNlKHRoaXMucXVldWUubWF4SGlzdG9yeVNpemUpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBBdWRpb1Jlc291cmNlLCBTdHJlYW1UeXBlIH0gZnJvbSAnQGRpc2NvcmRqcy92b2ljZSc7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBQbGF5ZXJQcm9ncmVzc2Jhck9wdGlvbnMsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IFF1ZXJ5UmVzb2x2ZXIgfSBmcm9tICcuLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFV0aWwsIFZBTElEQVRFX1FVRVVFX0NBUCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgVHJhY2ssIFRyYWNrUmVzb2x2YWJsZSB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcbmltcG9ydCB7IHNldFRpbWVvdXQgYXMgd2FpdEZvciB9IGZyb20gJ3RpbWVycy9wcm9taXNlcyc7XG5pbXBvcnQgeyBBc3luY1F1ZXVlIH0gZnJvbSAnLi4vdXRpbHMvQXN5bmNRdWV1ZSc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgQ3JlYXRlU3RyZWFtT3BzIH0gZnJvbSAnLi4vVm9pY2VJbnRlcmZhY2UvU3RyZWFtRGlzcGF0Y2hlcic7XG5cbmV4cG9ydCBjb25zdCBGRk1QRUdfU1JBVEVfUkVHRVggPSAvYXNldHJhdGU9XFxkK1xcKihcXGQoXFwuXFxkKT8pLztcblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZVBsYXlPcHRpb25zIHtcbiAgICBxdWV1ZT86IGJvb2xlYW47XG4gICAgc2Vlaz86IG51bWJlcjtcbiAgICB0cmFuc2l0aW9uTW9kZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyVGltZXN0YW1wIHtcbiAgICBjdXJyZW50OiB7XG4gICAgICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgICAgIHZhbHVlOiBudW1iZXI7XG4gICAgfTtcbiAgICB0b3RhbDoge1xuICAgICAgICBsYWJlbDogc3RyaW5nO1xuICAgICAgICB2YWx1ZTogbnVtYmVyO1xuICAgIH07XG4gICAgcHJvZ3Jlc3M6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1Db25maWcge1xuICAgIGRpc3BhdGNoZXJDb25maWc6IENyZWF0ZVN0cmVhbU9wcztcbiAgICBwbGF5ZXJDb25maWc6IFJlc291cmNlUGxheU9wdGlvbnM7XG59XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhID0gdW5rbm93bj4ge1xuICAgICNwcm9ncmVzcyA9IDA7XG4gICAgcHVibGljIHRhc2tzUXVldWUgPSBuZXcgQXN5bmNRdWV1ZSgpO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4pIHt9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBpbiBpZGxlIG1vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNJZGxlKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzSWRsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGJ1ZmZlcmluZyB0aGUgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNCdWZmZXJpbmcoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNCdWZmZXJpbmcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBwbGF5aW5nIGEgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNQbGF5aW5nKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzUGxheWluZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBhdXNlZFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1BhdXNlZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc1BhdXNlZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0IHByb2dyZXNzIGhpc3RvcnlcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXRQcm9ncmVzcygpIHtcbiAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBwbGF5ZXIgcHJvZ3Jlc3NcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0UHJvZ3Jlc3MocHJvZ3Jlc3M6IG51bWJlcikge1xuICAgICAgICB0aGlzLiNwcm9ncmVzcyA9IHByb2dyZXNzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBzdHJlYW0gdGltZSBmb3IgY3VycmVudCBzZXNzaW9uXG4gICAgICovXG4gICAgcHVibGljIGdldCBzdHJlYW1UaW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5zdHJlYW1UaW1lID8/IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3VycmVudCBwbGF5YmFjayBkdXJhdGlvbiB3aXRoIGhpc3RvcnkgaW5jbHVkZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBsYXliYWNrVGltZSgpIHtcbiAgICAgICAgY29uc3QgZHVyID0gdGhpcy4jcHJvZ3Jlc3MgKyB0aGlzLnN0cmVhbVRpbWU7XG5cbiAgICAgICAgcmV0dXJuIGR1cjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZHVyYXRpb24gbXVsdGlwbGllclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREdXJhdGlvbk11bHRpcGxpZXIoKSB7XG4gICAgICAgIGNvbnN0IHNyYXRlRmlsdGVycyA9IHRoaXMucXVldWUuZmlsdGVycy5mZm1wZWcudG9BcnJheSgpLmZpbHRlcigoZmYpID0+IEZGTVBFR19TUkFURV9SRUdFWC50ZXN0KGZmKSk7XG4gICAgICAgIGNvbnN0IG11bHRpcGxpZXJzID0gc3JhdGVGaWx0ZXJzXG4gICAgICAgICAgICAubWFwKChtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoRkZNUEVHX1NSQVRFX1JFR0VYLmV4ZWMobSk/LlsxXSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5maWx0ZXIoKGYpID0+ICFpc05hTihmKSk7XG5cbiAgICAgICAgcmV0dXJuICFtdWx0aXBsaWVycy5sZW5ndGggPyAxIDogbXVsdGlwbGllcnMucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4gY3VycmVudCArIGFjY3VtdWxhdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc3RpbWF0ZWQgcHJvZ3Jlc3Mgb2YgdGhlIHBsYXllclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXN0aW1hdGVkUGxheWJhY2tUaW1lKCkge1xuICAgICAgICBjb25zdCBkdXIgPSB0aGlzLnBsYXliYWNrVGltZTtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQodGhpcy5nZXREdXJhdGlvbk11bHRpcGxpZXIoKSAqIGR1cik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXN0aW1hdGVkIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBwbGF5ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgICAgICBjb25zdCBkdXIgPSB0aGlzLnRvdGFsRHVyYXRpb247XG5cbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoZHVyIC8gdGhpcy5nZXREdXJhdGlvbk11bHRpcGxpZXIoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG90YWwgZHVyYXRpb24gb2YgdGhlIGN1cnJlbnQgYXVkaW8gdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRvdGFsRHVyYXRpb24oKSB7XG4gICAgICAgIGNvbnN0IHByZWZlcnNCcmlkZ2VkTWV0YWRhdGEgPSB0aGlzLnF1ZXVlLm9wdGlvbnMucHJlZmVyQnJpZGdlZE1ldGFkYXRhO1xuICAgICAgICBjb25zdCB0cmFjayA9IHRoaXMucXVldWUuY3VycmVudFRyYWNrO1xuXG4gICAgICAgIGlmIChwcmVmZXJzQnJpZGdlZE1ldGFkYXRhICYmIHRyYWNrPy5tZXRhZGF0YSAhPSBudWxsICYmIHR5cGVvZiB0cmFjay5tZXRhZGF0YSA9PT0gJ29iamVjdCcgJiYgJ2JyaWRnZScgaW4gdHJhY2subWV0YWRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uID0gKFxuICAgICAgICAgICAgICAgIHRyYWNrIGFzIFRyYWNrPHtcbiAgICAgICAgICAgICAgICAgICAgYnJpZGdlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0+XG4gICAgICAgICAgICApLm1ldGFkYXRhPy5icmlkZ2UuZHVyYXRpb247XG5cbiAgICAgICAgICAgIGlmIChUeXBlVXRpbC5pc051bWJlcihkdXJhdGlvbikpIHJldHVybiBkdXJhdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cmFjaz8uZHVyYXRpb25NUyA/PyAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBzdHJlYW0gcHJvZ3Jlc3NcbiAgICAgKiBAcGFyYW0gaWdub3JlRmlsdGVycyBJZ25vcmUgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyA9IGZhbHNlKTogUGxheWVyVGltZXN0YW1wIHwgbnVsbCB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2spIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBpZ25vcmVGaWx0ZXJzID8gdGhpcy5wbGF5YmFja1RpbWUgOiB0aGlzLmVzdGltYXRlZFBsYXliYWNrVGltZTtcbiAgICAgICAgY29uc3QgdG90YWwgPSBpZ25vcmVGaWx0ZXJzID8gdGhpcy50b3RhbER1cmF0aW9uIDogdGhpcy5lc3RpbWF0ZWREdXJhdGlvbjtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY3VycmVudDoge1xuICAgICAgICAgICAgICAgIGxhYmVsOiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKGN1cnJlbnQpKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogY3VycmVudFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRvdGFsOiB7XG4gICAgICAgICAgICAgICAgbGFiZWw6IFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVModG90YWwpKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdG90YWxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcm9ncmVzczogTWF0aC5yb3VuZCgoY3VycmVudCAvIHRvdGFsKSAqIDEwMClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgcHJvZ3Jlc3MgYmFyIGZvciBjdXJyZW50IHByb2dyZXNzXG4gICAgICogQHBhcmFtIG9wdGlvbnMgUHJvZ3Jlc3MgYmFyIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlUHJvZ3Jlc3NCYXIob3B0aW9ucz86IFBsYXllclByb2dyZXNzYmFyT3B0aW9ucykge1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSB0aGlzLmdldFRpbWVzdGFtcCgpO1xuICAgICAgICBpZiAoIXRpbWVzdGFtcCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgeyBpbmRpY2F0b3IgPSAnXHVEODNEXHVERDE4JywgbGVuZ3RoID0gMTUsIGxpbmUgPSAnXHUyNUFDJywgdGltZWNvZGVzID0gdHJ1ZSB9ID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICBpZiAoaXNOYU4obGVuZ3RoKSB8fCBsZW5ndGggPCAwIHx8ICFOdW1iZXIuaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfT1VUX09GX1JBTkdFKCdbUGxheWVyUHJvZ3Jlc3NCYXJPcHRpb25zLmxlbmd0aF0nLCBTdHJpbmcobGVuZ3RoKSwgJzAnLCAnRmluaXRlIE51bWJlcicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZGV4ID0gTWF0aC5yb3VuZCgodGltZXN0YW1wLmN1cnJlbnQudmFsdWUgLyB0aW1lc3RhbXAudG90YWwudmFsdWUpICogbGVuZ3RoKTtcblxuICAgICAgICBpZiAoaW5kZXggPj0gMSAmJiBpbmRleCA8PSBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGJhciA9IGxpbmUucmVwZWF0KGxlbmd0aCAtIDEpLnNwbGl0KCcnKTtcbiAgICAgICAgICAgIGJhci5zcGxpY2UoaW5kZXgsIDAsIGluZGljYXRvcik7XG4gICAgICAgICAgICBpZiAodGltZWNvZGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3RpbWVzdGFtcC5jdXJyZW50LmxhYmVsfSBcdTI1MDMgJHtiYXIuam9pbignJyl9IFx1MjUwMyAke3RpbWVzdGFtcC50b3RhbC5sYWJlbH1gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7YmFyLmpvaW4oJycpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGltZWNvZGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3RpbWVzdGFtcC5jdXJyZW50LmxhYmVsfSBcdTI1MDMgJHtpbmRpY2F0b3J9JHtsaW5lLnJlcGVhdChsZW5ndGggLSAxKX0gXHUyNTAzICR7dGltZXN0YW1wLnRvdGFsLmxhYmVsfWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHtpbmRpY2F0b3J9JHtsaW5lLnJlcGVhdChsZW5ndGggLSAxKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VlayB0aGUgcGxheWVyXG4gICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBkdXJhdGlvbiB0byBzZWVrIHRvXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNlZWsoZHVyYXRpb246IG51bWJlcikge1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuY3VycmVudFRyYWNrKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnF1ZXVlLmZpbHRlcnMudHJpZ2dlclJlcGxheShkdXJhdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3VycmVudCB2b2x1bWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8udm9sdW1lID8/IDEwMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdm9sdW1lXG4gICAgICogQHBhcmFtIHZvbCBWb2x1bWUgYW1vdW50IHRvIHNldFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRWb2x1bWUodm9sOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLmRpc3BhdGNoZXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVzID0gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLnNldFZvbHVtZSh2b2wpO1xuICAgICAgICBpZiAocmVzKSB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lID0gdm9sO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBiaXQgcmF0ZVxuICAgICAqIEBwYXJhbSByYXRlIFRoZSBiaXQgcmF0ZSB0byBzZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0Qml0cmF0ZShyYXRlOiBudW1iZXIgfCAnYXV0bycpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5lbmNvZGVyPy5zZXRCaXRyYXRlKHJhdGUgPT09ICdhdXRvJyA/IHRoaXMucXVldWUuY2hhbm5lbD8uYml0cmF0ZSA/PyA2NDAwMCA6IHJhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBwYXVzZWQgc3RhdGVcbiAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlXG4gICAgICovXG4gICAgcHVibGljIHNldFBhdXNlZChzdGF0ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAoc3RhdGUpIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnBhdXNlKHRydWUpIHx8IGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5yZXN1bWUoKSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXVzZSB0aGUgcGxheWJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF1c2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldFBhdXNlZCh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN1bWUgdGhlIHBsYXliYWNrXG4gICAgICovXG4gICAgcHVibGljIHJlc3VtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0UGF1c2VkKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTa2lwIGN1cnJlbnQgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgc2tpcCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLmRpc3BhdGNoZXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5xdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmVuZCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIHRyYWNrIGZyb20gcXVldWVcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlbW92ZVxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmUodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgICAgICBjb25zdCBmb3VuZFRyYWNrID0gdGhpcy5xdWV1ZS50cmFja3MuZmluZCgodCwgaWR4KSA9PiB7XG4gICAgICAgICAgICBpZiAodHJhY2sgaW5zdGFuY2VvZiBUcmFjayB8fCB0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnID8gdHJhY2sgOiB0cmFjay5pZCkgPT09IHQuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykgcmV0dXJuIHRyYWNrID09PSB0LmlkO1xuICAgICAgICAgICAgcmV0dXJuIGlkeCA9PT0gdHJhY2s7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWZvdW5kVHJhY2spIHJldHVybiBudWxsO1xuXG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnJlbW92ZU9uZSgodCkgPT4gdC5pZCA9PT0gZm91bmRUcmFjay5pZCk7XG5cbiAgICAgICAgdGhpcy5xdWV1ZS5wbGF5ZXIuZXZlbnRzLmVtaXQoJ2F1ZGlvVHJhY2tSZW1vdmUnLCB0aGlzLnF1ZXVlLCBmb3VuZFRyYWNrKTtcblxuICAgICAgICByZXR1cm4gZm91bmRUcmFjaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKdW1wIHRvIHNwZWNpZmljIHRyYWNrIG9uIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8ganVtcCB0byB3aXRob3V0IHJlbW92aW5nIG90aGVyIHRyYWNrc1xuICAgICAqL1xuICAgIHB1YmxpYyBqdW1wKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmVtb3ZlKHRyYWNrKTtcbiAgICAgICAgaWYgKCFyZW1vdmVkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnVuc2hpZnQocmVtb3ZlZCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNraXAoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdHJhY2sgcG9zaXRpb25cbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGdldFRyYWNrUG9zaXRpb24odHJhY2s6IFRyYWNrUmVzb2x2YWJsZSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLnRyYWNrcy50b0FycmF5KCkuZmluZEluZGV4KCh0LCBpZHgpID0+IHtcbiAgICAgICAgICAgIGlmICh0cmFjayBpbnN0YW5jZW9mIFRyYWNrIHx8IHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycgPyB0cmFjayA6IHRyYWNrLmlkKSA9PT0gdC5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSByZXR1cm4gdHJhY2sgPT09IHQuaWQ7XG4gICAgICAgICAgICByZXR1cm4gaWR4ID09PSB0cmFjaztcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2tpcCB0byB0aGUgZ2l2ZW4gdHJhY2ssIHJlbW92aW5nIG90aGVycyBvbiB0aGUgd2F5XG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBza2lwIHRvXG4gICAgICovXG4gICAgcHVibGljIHNraXBUbyh0cmFjazogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHRoaXMuZ2V0VHJhY2tQb3NpdGlvbih0cmFjayk7XG4gICAgICAgIGlmIChpZHggPCAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJlbW92ZShpZHgpO1xuICAgICAgICBpZiAoIXJlbW92ZWQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdG9SZW1vdmUgPSB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZS5maWx0ZXIoKF8sIGkpID0+IGkgPD0gaWR4KTtcbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUuc3BsaWNlKDAsIGlkeCwgcmVtb3ZlZCk7XG4gICAgICAgIHRoaXMucXVldWUucGxheWVyLmV2ZW50cy5lbWl0KCdhdWRpb1RyYWNrc1JlbW92ZScsIHRoaXMucXVldWUsIHRvUmVtb3ZlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2tpcCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydCBhIHRyYWNrIG9uIHRoZSBnaXZlbiBwb3NpdGlvbiBpbiBxdWV1ZVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gaW5zZXJ0XG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBwb3NpdGlvbiB0byBpbnNlcnQgdG8sIGRlZmF1bHRzIHRvIDAuXG4gICAgICovXG4gICAgcHVibGljIGluc2VydCh0cmFjazogVHJhY2ssIGluZGV4ID0gMCkge1xuICAgICAgICBpZiAoISh0cmFjayBpbnN0YW5jZW9mIFRyYWNrKSkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgndHJhY2sgdmFsdWUnLCAnaW5zdGFuY2Ugb2YgVHJhY2snLCBTdHJpbmcodHJhY2spKTtcbiAgICAgICAgVkFMSURBVEVfUVVFVUVfQ0FQKHRoaXMucXVldWUsIHRyYWNrKTtcbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUuc3BsaWNlKGluZGV4LCAwLCB0cmFjayk7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5vcHRpb25zLm5vRW1pdEluc2VydCkgdGhpcy5xdWV1ZS5wbGF5ZXIuZXZlbnRzLmVtaXQoJ2F1ZGlvVHJhY2tBZGQnLCB0aGlzLnF1ZXVlLCB0cmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gbW92ZVxuICAgICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gbW92ZSB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBtb3ZlKGZyb206IFRyYWNrUmVzb2x2YWJsZSwgdG86IG51bWJlcikge1xuICAgICAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yZW1vdmUoZnJvbSk7XG4gICAgICAgIGlmICghcmVtb3ZlZCkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKCdpbnZhbGlkIHRyYWNrIHRvIG1vdmUnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluc2VydChyZW1vdmVkLCB0byk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29weSBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBjbG9uZVxuICAgICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gY2xvbmUgYXRcbiAgICAgKi9cbiAgICBwdWJsaWMgY29weShmcm9tOiBUcmFja1Jlc29sdmFibGUsIHRvOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3Qgc3JjID0gdGhpcy5xdWV1ZS50cmFja3MuYXQodGhpcy5nZXRUcmFja1Bvc2l0aW9uKGZyb20pKTtcbiAgICAgICAgaWYgKCFzcmMpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVCgnaW52YWxpZCB0cmFjayB0byBjb3B5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnNlcnQoc3JjLCB0byk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3dhcCB0d28gdHJhY2tzIGluIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBmaXJzdCBUaGUgZmlyc3QgdHJhY2sgdG8gc3dhcFxuICAgICAqIEBwYXJhbSBzZWNvbmQgVGhlIHNlY29uZCB0cmFjayB0byBzd2FwXG4gICAgICovXG4gICAgcHVibGljIHN3YXAoZmlyc3Q6IFRyYWNrUmVzb2x2YWJsZSwgc2Vjb25kOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3Qgc3JjID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKGZpcnN0KTtcbiAgICAgICAgaWYgKHNyYyA8IDApIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVCgnaW52YWxpZCBzcmMgdHJhY2sgdG8gc3dhcCcpO1xuXG4gICAgICAgIGNvbnN0IGRlc3QgPSB0aGlzLmdldFRyYWNrUG9zaXRpb24oc2Vjb25kKTtcbiAgICAgICAgaWYgKGRlc3QgPCAwKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ2ludmFsaWQgZGVzdCB0cmFjayB0byBzd2FwJyk7XG5cbiAgICAgICAgY29uc3Qgc3JjVCA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlW3NyY107XG4gICAgICAgIGNvbnN0IGRlc3RUID0gdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbZGVzdF07XG5cbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbc3JjXSA9IGRlc3RUO1xuICAgICAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtkZXN0XSA9IHNyY1Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RvcCB0aGUgcGxheWJhY2tcbiAgICAgKiBAcGFyYW0gZm9yY2UgV2hldGhlciBvciBub3QgdG8gZm9yY2VmdWxseSBzdG9wIHRoZSBwbGF5YmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBzdG9wKGZvcmNlID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3MuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5oaXN0b3J5LmNsZWFyKCk7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlci5lbmQoKTtcbiAgICAgICAgaWYgKGZvcmNlKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucXVldWUub3B0aW9ucy5sZWF2ZU9uU3RvcCkge1xuICAgICAgICAgICAgY29uc3QgdG06IE5vZGVKUy5UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKCkgfHwgdGhpcy5xdWV1ZS50cmFja3Muc2l6ZSkgcmV0dXJuIGNsZWFyVGltZW91dCh0bSk7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICB9LCB0aGlzLnF1ZXVlLm9wdGlvbnMubGVhdmVPblN0b3BDb29sZG93bikudW5yZWYoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGF5IHJhdyBhdWRpbyByZXNvdXJjZVxuICAgICAqIEBwYXJhbSByZXNvdXJjZSBUaGUgYXVkaW8gcmVzb3VyY2UgdG8gcGxheVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwbGF5UmF3KHJlc291cmNlOiBBdWRpb1Jlc291cmNlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucGxheVN0cmVhbShyZXNvdXJjZSBhcyBBdWRpb1Jlc291cmNlPFRyYWNrPik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSB0aGUgZ2l2ZW4gdHJhY2tcbiAgICAgKiBAcGFyYW0gcmVzIFRoZSB0cmFjayB0byBwbGF5XG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgcGxheWluZyB0aGUgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheShyZXM/OiBUcmFjayB8IG51bGwsIG9wdGlvbnM/OiBSZXNvdXJjZVBsYXlPcHRpb25zKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy52b2ljZUNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1ZPSUNFX0NPTk5FQ1RJT04oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoYFJlY2VpdmVkIHBsYXkgcmVxdWVzdCBmcm9tIGd1aWxkICR7dGhpcy5xdWV1ZS5ndWlsZC5uYW1lfSAoSUQ6ICR7dGhpcy5xdWV1ZS5ndWlsZC5pZH0pYCk7XG5cbiAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBxdWV1ZTogdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2sgIT0gbnVsbCxcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uTW9kZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2VlazogMFxuICAgICAgICAgICAgfSBhcyBSZXNvdXJjZVBsYXlPcHRpb25zLFxuICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICApITtcblxuICAgICAgICBpZiAocmVzICYmIG9wdGlvbnMucXVldWUpIHtcbiAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoJ1JlcXVlc3RlZCBvcHRpb24gcmVxdWlyZXMgdG8gcXVldWUgdGhlIHRyYWNrLCBhZGRpbmcgdGhlIGdpdmVuIHRyYWNrIHRvIHF1ZXVlIGluc3RlYWQuLi4nKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmFkZFRyYWNrKHJlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmFjayA9IHJlcyB8fCB0aGlzLnF1ZXVlLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgICAgICBpZiAoIXRyYWNrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5vcHRpb25zLnNraXBPbk5vU3RyZWFtKSByZXR1cm47XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ1BsYXkgcmVxdWVzdCByZWNlaXZlZCBidXQgdHJhY2sgd2FzIG5vdCBwcm92aWRlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnUmVxdWVzdGVkIG9wdGlvbiByZXF1aXJlcyB0byBwbGF5IHRoZSB0cmFjaywgaW5pdGlhbGl6aW5nLi4uJyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoYEluaXRpYXRpbmcgc3RyZWFtIGV4dHJhY3Rpb24gcHJvY2Vzcy4uLmApO1xuICAgICAgICAgICAgY29uc3Qgc3JjID0gdHJhY2sucmF3Py5zb3VyY2UgfHwgdHJhY2suc291cmNlO1xuICAgICAgICAgICAgY29uc3QgcXQ6IFNlYXJjaFF1ZXJ5VHlwZSA9IHRyYWNrLnF1ZXJ5VHlwZSB8fCAoc3JjID09PSAnc3BvdGlmeScgPyAnc3BvdGlmeVNvbmcnIDogc3JjID09PSAnYXBwbGVfbXVzaWMnID8gJ2FwcGxlTXVzaWNTb25nJyA6IHNyYyk7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBFeGVjdXRpbmcgb25CZWZvcmVDcmVhdGVTdHJlYW0gaG9vayAoUXVlcnlUeXBlOiAke3F0fSkuLi5gKTtcblxuICAgICAgICAgICAgY29uc3Qgc3RyZWFtU3JjID0ge1xuICAgICAgICAgICAgICAgIGVycm9yOiBudWxsIGFzIEVycm9yIHwgbnVsbCxcbiAgICAgICAgICAgICAgICBzdHJlYW06IG51bGwgYXMgUmVhZGFibGUgfCBudWxsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLm9uQmVmb3JlQ3JlYXRlU3RyZWFtPy4odHJhY2ssIHF0IHx8ICdhcmJpdHJhcnknLCB0aGlzLnF1ZXVlKS50aGVuKFxuICAgICAgICAgICAgICAgIChzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGU6IEVycm9yKSA9PiAoc3RyZWFtU3JjLmVycm9yID0gZSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIHRocm93IGlmICdvbkJlZm9yZUNyZWF0ZVN0cmVhbScgcGFuaWNzXG4gICAgICAgICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0gJiYgc3RyZWFtU3JjLmVycm9yKSByZXR1cm4gdGhpcy4jdGhyb3codHJhY2ssIHN0cmVhbVNyYy5lcnJvcik7XG5cbiAgICAgICAgICAgIC8vIGRlZmF1bHQgYmVoYXZpb3Igd2hlbiAnb25CZWZvcmVDcmVhdGVTdHJlYW0nIGRpZCBub3QgcGFuaWNcbiAgICAgICAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSkge1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoJ0ZhaWxlZCB0byBnZXQgc3RyZWFtIGZyb20gb25CZWZvcmVDcmVhdGVTdHJlYW0hJyk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4jY3JlYXRlR2VuZXJpY1N0cmVhbSh0cmFjaykudGhlbihcbiAgICAgICAgICAgICAgICAgICAgKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyPy5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gPFJlYWRhYmxlPnIucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHI/LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU3JjLmVycm9yID0gci5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gPSBzdHJlYW1TcmMuZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAoZTogRXJyb3IpID0+IChzdHJlYW1TcmMuZXJyb3IgPSBlKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSkgcmV0dXJuIHRoaXMuI3Rocm93KHRyYWNrLCBzdHJlYW1TcmMuZXJyb3IpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuc2VlayA9PT0gJ251bWJlcicgJiYgb3B0aW9ucy5zZWVrID49IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNwcm9ncmVzcyA9IG9wdGlvbnMuc2VlaztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgY29uc3QgY29va2llcyA9IHRyYWNrLnJhdz8uc291cmNlID09PSAneW91dHViZScgPyAoPGFueT50aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLnl0ZGxPcHRpb25zPy5yZXF1ZXN0T3B0aW9ucyk/LmhlYWRlcnM/LmNvb2tpZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGNyZWF0ZVN0cmVhbUNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBkaXNhYmxlQmlxdWFkOiB0aGlzLnF1ZXVlLm9wdGlvbnMuYmlxdWFkID09PSBmYWxzZSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlRXF1YWxpemVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZXF1YWxpemVyID09PSBmYWxzZSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlVm9sdW1lOiB0aGlzLnF1ZXVlLm9wdGlvbnMudm9sdW1lID09PSBmYWxzZSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlRmlsdGVyczogdGhpcy5xdWV1ZS5vcHRpb25zLmZpbHRlcmVyID09PSBmYWxzZSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlUmVzYW1wbGVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyID09PSBmYWxzZSxcbiAgICAgICAgICAgICAgICBzYW1wbGVSYXRlOiB0eXBlb2YgdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA9PT0gJ251bWJlcicgJiYgdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA+IDAgPyB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGJpcXVhZEZpbHRlcjogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXE6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIsXG4gICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnM6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzLFxuICAgICAgICAgICAgICAgIHZvbHVtZTogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSxcbiAgICAgICAgICAgICAgICBkYXRhOiB0cmFjayxcbiAgICAgICAgICAgICAgICB0eXBlOiBTdHJlYW1UeXBlLlJhd1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgdHJhY2tTdHJlYW1Db25maWc6IFN0cmVhbUNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaGVyQ29uZmlnOiBjcmVhdGVTdHJlYW1Db25maWcsXG4gICAgICAgICAgICAgICAgcGxheWVyQ29uZmlnOiBvcHRpb25zXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsZXQgcmVzb2x2ZXI6ICgpID0+IHZvaWQgPSBVdGlsLm5vb3A7XG4gICAgICAgICAgICBjb25zdCBkb25lUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiAocmVzb2x2ZXIgPSByZXNvbHZlKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLnF1ZXVlLnBsYXllci5ldmVudHMuZW1pdCgnd2lsbFBsYXlUcmFjaycsIHRoaXMucXVldWUsIHRyYWNrLCB0cmFja1N0cmVhbUNvbmZpZywgcmVzb2x2ZXIhKTtcblxuICAgICAgICAgICAgLy8gcHJldmVudCBkYW5nbGluZyBwcm9taXNlXG4gICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHJlc29sdmVyKCk7XG5cbiAgICAgICAgICAgIGF3YWl0IGRvbmVQcm9taXNlO1xuXG4gICAgICAgICAgICBjb25zdCBwY21TdHJlYW0gPSB0aGlzLiNjcmVhdGVGRm1wZWdTdHJlYW0oc3RyZWFtU3JjLnN0cmVhbSwgdHJhY2ssIG9wdGlvbnMuc2VlayA/PyAwLCBjb29raWVzKTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMudHJhbnNpdGlvbk1vZGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBUcmFuc2l0aW9uIG1vZGUgZGV0ZWN0ZWQsIHBsYXllciB3aWxsIHdhaXQgZm9yIGJ1ZmZlcmluZyB0aW1lb3V0IHRvIGV4cGlyZSAoVGltZW91dDogJHt0aGlzLnF1ZXVlLm9wdGlvbnMuYnVmZmVyaW5nVGltZW91dH1tcylgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB3YWl0Rm9yKHRoaXMucXVldWUub3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKCdCdWZmZXJpbmcgdGltZW91dCBoYXMgZXhwaXJlZCEnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhgUHJlcGFyaW5nIGZpbmFsIHN0cmVhbSBjb25maWc6ICR7SlNPTi5zdHJpbmdpZnkodHJhY2tTdHJlYW1Db25maWcsIG51bGwsIDIpfWApO1xuXG4gICAgICAgICAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IHRoaXMucXVldWUuZGlzcGF0Y2hlci5jcmVhdGVTdHJlYW0ocGNtU3RyZWFtLCBjcmVhdGVTdHJlYW1Db25maWcpO1xuXG4gICAgICAgICAgICB0aGlzLnF1ZXVlLnNldFRyYW5zaXRpb25pbmcoISFvcHRpb25zLnRyYW5zaXRpb25Nb2RlKTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy4jcGVyZm9ybVBsYXkocmVzb3VyY2UpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBhdWRpbyBwbGF5ZXI6ICR7ZX1gKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAjdGhyb3codHJhY2s6IFRyYWNrLCBlcnJvcj86IEVycm9yIHwgbnVsbCkge1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgY29uc3Qgc3RyZWFtRGVmaW5pdGVseUZhaWxlZE15RGVhclRfVFBsZWFzZVRydXN0TWVJdHNOb3RNeUZhdWx0ID0gKFxuICAgICAgICAgICAgRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKGBDb3VsZCBub3QgZXh0cmFjdCBzdHJlYW0gZm9yIHRoaXMgdHJhY2ske2Vycm9yID8gYFxcblxcbiR7ZXJyb3Iuc3RhY2sgfHwgZXJyb3J9YCA6ICcnfWApXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMucXVldWUub3B0aW9ucy5za2lwT25Ob1N0cmVhbSkge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5wbGF5ZXIuZXZlbnRzLmVtaXQoJ3BsYXllclNraXAnLCB0aGlzLnF1ZXVlLCB0cmFjayk7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlLnBsYXllci5ldmVudHMuZW1pdCgncGxheWVyRXJyb3InLCB0aGlzLnF1ZXVlLCBzdHJlYW1EZWZpbml0ZWx5RmFpbGVkTXlEZWFyVF9UUGxlYXNlVHJ1c3RNZUl0c05vdE15RmF1bHQsIHRyYWNrKTtcbiAgICAgICAgICAgIGNvbnN0IG5leHRUcmFjayA9IHRoaXMucXVldWUudHJhY2tzLmRpc3BhdGNoKCk7XG4gICAgICAgICAgICBpZiAobmV4dFRyYWNrKSB0aGlzLnBsYXkobmV4dFRyYWNrLCB7IHF1ZXVlOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IHN0cmVhbURlZmluaXRlbHlGYWlsZWRNeURlYXJUX1RQbGVhc2VUcnVzdE1lSXRzTm90TXlGYXVsdDtcbiAgICB9XG5cbiAgICBhc3luYyAjcGVyZm9ybVBsYXkocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoJ0luaXRpYWxpemluZyBhdWRpbyBwbGF5ZXIuLi4nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyIS5wbGF5U3RyZWFtKHJlc291cmNlKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnRGlzcGF0Y2hpbmcgYXVkaW8uLi4nKTtcbiAgICB9XG5cbiAgICBhc3luYyAjY3JlYXRlR2VuZXJpY1N0cmVhbSh0cmFjazogVHJhY2spIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhgQXR0ZW1wdGluZyB0byBleHRyYWN0IHN0cmVhbSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgcmVnaXN0ZXJlZCBleHRyYWN0b3JzYCk7XG4gICAgICAgIGNvbnN0IHN0cmVhbUluZm8gPSBhd2FpdCB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0cmFjdG9yKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5ibG9ja1N0cmVhbUZyb20/LnNvbWUoKGV4dCkgPT4gZXh0ID09PSBleHRyYWN0b3IuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IGNhblN0cmVhbSA9IGF3YWl0IGV4dHJhY3Rvci52YWxpZGF0ZSh0cmFjay51cmwsIHRyYWNrLnF1ZXJ5VHlwZSB8fCBRdWVyeVJlc29sdmVyLnJlc29sdmUodHJhY2sudXJsKSk7XG4gICAgICAgICAgICBpZiAoIWNhblN0cmVhbSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGV4dHJhY3Rvci5zdHJlYW0odHJhY2spO1xuICAgICAgICB9LCBmYWxzZSk7XG4gICAgICAgIGlmICghc3RyZWFtSW5mbyB8fCAhc3RyZWFtSW5mby5yZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoYEZhaWxlZCB0byBleHRyYWN0IHN0cmVhbSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgcmVnaXN0ZXJlZCBleHRyYWN0b3JzYCk7XG4gICAgICAgICAgICByZXR1cm4gc3RyZWFtSW5mbyB8fCBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhgU3RyZWFtIGV4dHJhY3Rpb24gd2FzIHN1Y2Nlc3NmdWwgZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IChFeHRyYWN0b3I6ICR7c3RyZWFtSW5mby5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9KWApO1xuXG4gICAgICAgIHJldHVybiBzdHJlYW1JbmZvO1xuICAgIH1cblxuICAgICNjcmVhdGVGRm1wZWdTdHJlYW0oc3RyZWFtOiBSZWFkYWJsZSB8IHN0cmluZywgdHJhY2s6IFRyYWNrLCBzZWVrID0gMCwgY29va2llcz86IHN0cmluZykge1xuICAgICAgICBjb25zdCBmZm1wZWdTdHJlYW0gPSB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnXG4gICAgICAgICAgICAuY3JlYXRlU3RyZWFtKHN0cmVhbSwge1xuICAgICAgICAgICAgICAgIGVuY29kZXJBcmdzOiB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLmZpbHRlcnMubGVuZ3RoID8gWyctYWYnLCB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLnRvU3RyaW5nKCldIDogW10sXG4gICAgICAgICAgICAgICAgc2Vlazogc2VlayAvIDEwMDAsXG4gICAgICAgICAgICAgICAgZm10OiAnczE2bGUnLFxuICAgICAgICAgICAgICAgIGNvb2tpZXMsXG4gICAgICAgICAgICAgICAgdXNlTGVnYWN5RkZtcGVnOiAhIXRoaXMucXVldWUucGxheWVyLm9wdGlvbnMudXNlTGVnYWN5RkZtcGVnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtID0gYCR7ZXJyfWAudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoYFN0cmVhbSBjbG9zZWQgZHVlIHRvIGFuIGVycm9yIGZyb20gRkZtcGVnIHN0cmVhbTogJHtlcnIuc3RhY2sgfHwgZXJyLm1lc3NhZ2UgfHwgZXJyfWApO1xuXG4gICAgICAgICAgICAgICAgaWYgKG0uaW5jbHVkZXMoJ3ByZW1hdHVyZSBjbG9zZScpIHx8IG0uaW5jbHVkZXMoJ2VwaXBlJykpIHJldHVybjtcblxuICAgICAgICAgICAgICAgIHRoaXMucXVldWUucGxheWVyLmV2ZW50cy5lbWl0KCdwbGF5ZXJFcnJvcicsIHRoaXMucXVldWUsIGVyciwgdHJhY2spO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZmbXBlZ1N0cmVhbTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgUXVlcnlUeXBlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuL1R5cGVVdGlsJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG4vLyAjcmVnaW9uIHNjYXJ5IHRoaW5ncyBiZWxvdyAqc2lnaCpcbmNvbnN0IHNwb3RpZnlTb25nUmVnZXggPSAvXmh0dHBzPzpcXC9cXC8oPzplbWJlZFxcLnxvcGVuXFwuKSg/OnNwb3RpZnlcXC5jb21cXC8pKGludGwtKFthLXpdfFtBLVpdKStcXC8pPyg/OnRyYWNrXFwvfFxcP3VyaT1zcG90aWZ5OnRyYWNrOikoKFxcd3wtKXsyMn0pKFxcP3NpPS4rKT8kLztcbmNvbnN0IHNwb3RpZnlQbGF5bGlzdFJlZ2V4ID0gL15odHRwcz86XFwvXFwvKD86ZW1iZWRcXC58b3BlblxcLikoPzpzcG90aWZ5XFwuY29tXFwvKShpbnRsLShbYS16XXxbQS1aXSkrXFwvKT8oPzpwbGF5bGlzdFxcL3xcXD91cmk9c3BvdGlmeTpwbGF5bGlzdDopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCBzcG90aWZ5QWxidW1SZWdleCA9IC9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoaW50bC0oW2Etel18W0EtWl0pK1xcLyk/KD86YWxidW1cXC98XFw/dXJpPXNwb3RpZnk6YWxidW06KSgoXFx3fC0pezIyfSkoXFw/c2k9LispPyQvO1xuY29uc3QgdmltZW9SZWdleCA9IC9eKGh0dHB8aHR0cHMpPzpcXC9cXC8od3d3XFwufHBsYXllclxcLik/dmltZW9cXC5jb21cXC8oPzpjaGFubmVsc1xcLyg/OlxcdytcXC8pP3xncm91cHNcXC8oW14vXSopXFwvdmlkZW9zXFwvfHZpZGVvXFwvfCkoXFxkKykoPzp8XFwvXFw/KSQvO1xuY29uc3QgcmV2ZXJibmF0aW9uUmVnZXggPSAvXmh0dHBzOlxcL1xcLyh3d3cuKT9yZXZlcmJuYXRpb24uY29tXFwvKC4rKVxcL3NvbmdcXC8oLispJC87XG5jb25zdCBhdHRhY2htZW50UmVnZXggPSAvXmh0dHBzPzpcXC9cXC8uKyQvO1xuY29uc3QgYXBwbGVNdXNpY1NvbmdSZWdleCA9IC9eaHR0cHM/OlxcL1xcL211c2ljXFwuYXBwbGVcXC5jb21cXC8uKz9cXC8oc29uZ3xhbGJ1bSlcXC8uKz8oXFwvLis/XFw/aT18XFwvKShbMC05XSspJC87XG5jb25zdCBhcHBsZU11c2ljUGxheWxpc3RSZWdleCA9IC9eaHR0cHM/OlxcL1xcL211c2ljXFwuYXBwbGVcXC5jb21cXC8uKz9cXC9wbGF5bGlzdFxcLy4rXFwvcGxcXC4odS0pP1thLXpBLVowLTldKyQvO1xuY29uc3QgYXBwbGVNdXNpY0FsYnVtUmVnZXggPSAvXmh0dHBzPzpcXC9cXC9tdXNpY1xcLmFwcGxlXFwuY29tXFwvLis/XFwvYWxidW1cXC8uK1xcLyhbMC05XSspJC87XG5jb25zdCBzb3VuZGNsb3VkVHJhY2tSZWdleCA9IC9eaHR0cHM/OlxcL1xcLyhtLnx3d3cuKT9zb3VuZGNsb3VkLmNvbVxcLyhcXHd8LSkrXFwvKFxcd3wtKSsoLispPyQvO1xuY29uc3Qgc291bmRjbG91ZFBsYXlsaXN0UmVnZXggPSAvXmh0dHBzPzpcXC9cXC8obS58d3d3Lik/c291bmRjbG91ZC5jb21cXC8oXFx3fC0pK1xcL3NldHNcXC8oXFx3fC0pKyguKyk/JC87XG5jb25zdCB5b3V0dWJlUGxheWxpc3RSZWdleCA9IC9eaHR0cHM/OlxcL1xcLyh3d3cuKT95b3V0dWJlLmNvbVxcL3BsYXlsaXN0XFw/bGlzdD0oKFBMfEZMfFVVfExMfFJEfE9MKVthLXpBLVowLTktX117MTYsNDF9KSQvO1xuY29uc3QgeW91dHViZVZpZGVvVVJMUmVnZXggPSAvXigoPzpodHRwcz86KT9cXC9cXC8pPygoPzp3d3d8bSlcXC4pPygoPzp5b3V0dWJlXFwuY29tfHlvdXR1LmJlKSkoXFwvKD86W1xcdy1dK1xcP3Y9fGVtYmVkXFwvfHZcXC8pPykoW1xcdy1dKykoXFxTKyk/JC87XG5jb25zdCB5b3V0dWJlVmlkZW9JZFJlZ2V4ID0gL15bYS16QS1aMC05LV9dezExfSQvO1xuLy8gI2VuZHJlZ2lvbiBzY2FyeSB0aGluZ3MgYWJvdmUgKnNpZ2gqXG5cbmNsYXNzIFF1ZXJ5UmVzb2x2ZXIge1xuICAgIC8qKlxuICAgICAqIFF1ZXJ5IHJlc29sdmVyXG4gICAgICovXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG5cbiAgICBzdGF0aWMgZ2V0IHJlZ2V4KCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3BvdGlmeUFsYnVtUmVnZXgsXG4gICAgICAgICAgICBzcG90aWZ5UGxheWxpc3RSZWdleCxcbiAgICAgICAgICAgIHNwb3RpZnlTb25nUmVnZXgsXG4gICAgICAgICAgICB2aW1lb1JlZ2V4LFxuICAgICAgICAgICAgcmV2ZXJibmF0aW9uUmVnZXgsXG4gICAgICAgICAgICBhdHRhY2htZW50UmVnZXgsXG4gICAgICAgICAgICBhcHBsZU11c2ljQWxidW1SZWdleCxcbiAgICAgICAgICAgIGFwcGxlTXVzaWNQbGF5bGlzdFJlZ2V4LFxuICAgICAgICAgICAgYXBwbGVNdXNpY1NvbmdSZWdleCxcbiAgICAgICAgICAgIHNvdW5kY2xvdWRUcmFja1JlZ2V4LFxuICAgICAgICAgICAgc291bmRjbG91ZFBsYXlsaXN0UmVnZXgsXG4gICAgICAgICAgICB5b3V0dWJlUGxheWxpc3RSZWdleFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmVzIHRoZSBnaXZlbiBzZWFyY2ggcXVlcnlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgVGhlIHF1ZXJ5XG4gICAgICovXG4gICAgc3RhdGljIHJlc29sdmUocXVlcnk6IHN0cmluZywgZmFsbGJhY2tTZWFyY2hFbmdpbmU6ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXSA9IFF1ZXJ5VHlwZS5BVVRPX1NFQVJDSCk6ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXSB7XG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNTdHJpbmcocXVlcnkpKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKHF1ZXJ5LCAnc3RyaW5nJywgdHlwZW9mIHF1ZXJ5KTtcbiAgICAgICAgaWYgKCFxdWVyeS5sZW5ndGgpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lORk9fUkVRVUlSRUQoJ3F1ZXJ5JywgU3RyaW5nKHF1ZXJ5KSk7XG4gICAgICAgIHF1ZXJ5ID0gIXF1ZXJ5LmluY2x1ZGVzKCd5b3V0dWJlLmNvbScpID8gcXVlcnkudHJpbSgpIDogcXVlcnkucmVwbGFjZSgvKG0odXNpYyk/fGdhbWluZylcXC4vLCAnJykudHJpbSgpO1xuXG4gICAgICAgIGlmIChzb3VuZGNsb3VkUGxheWxpc3RSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIFF1ZXJ5VHlwZS5TT1VORENMT1VEX1BMQVlMSVNUO1xuICAgICAgICBpZiAoc291bmRjbG91ZFRyYWNrUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiBRdWVyeVR5cGUuU09VTkRDTE9VRF9UUkFDSztcbiAgICAgICAgaWYgKHNwb3RpZnlQbGF5bGlzdFJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gUXVlcnlUeXBlLlNQT1RJRllfUExBWUxJU1Q7XG4gICAgICAgIGlmIChzcG90aWZ5QWxidW1SZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIFF1ZXJ5VHlwZS5TUE9USUZZX0FMQlVNO1xuICAgICAgICBpZiAoc3BvdGlmeVNvbmdSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIFF1ZXJ5VHlwZS5TUE9USUZZX1NPTkc7XG4gICAgICAgIGlmICh5b3V0dWJlUGxheWxpc3RSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIFF1ZXJ5VHlwZS5ZT1VUVUJFX1BMQVlMSVNUO1xuICAgICAgICBpZiAoUXVlcnlSZXNvbHZlci52YWxpZGF0ZUlkKHF1ZXJ5KSB8fCBRdWVyeVJlc29sdmVyLnZhbGlkYXRlVVJMKHF1ZXJ5KSkgcmV0dXJuIFF1ZXJ5VHlwZS5ZT1VUVUJFX1ZJREVPO1xuICAgICAgICBpZiAodmltZW9SZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIFF1ZXJ5VHlwZS5WSU1FTztcbiAgICAgICAgaWYgKHJldmVyYm5hdGlvblJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gUXVlcnlUeXBlLlJFVkVSQk5BVElPTjtcbiAgICAgICAgaWYgKGFwcGxlTXVzaWNBbGJ1bVJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gUXVlcnlUeXBlLkFQUExFX01VU0lDX0FMQlVNO1xuICAgICAgICBpZiAoYXBwbGVNdXNpY1BsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpIHJldHVybiBRdWVyeVR5cGUuQVBQTEVfTVVTSUNfUExBWUxJU1Q7XG4gICAgICAgIGlmIChhcHBsZU11c2ljU29uZ1JlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gUXVlcnlUeXBlLkFQUExFX01VU0lDX1NPTkc7XG4gICAgICAgIGlmIChhdHRhY2htZW50UmVnZXgudGVzdChxdWVyeSkpIHJldHVybiBRdWVyeVR5cGUuQVJCSVRSQVJZO1xuXG4gICAgICAgIHJldHVybiBmYWxsYmFja1NlYXJjaEVuZ2luZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgdmltZW8gaWQgZnJvbSB1cmxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgVGhlIHF1ZXJ5XG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0VmltZW9JRChxdWVyeTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBRdWVyeVJlc29sdmVyLnJlc29sdmUocXVlcnkpID09PSBRdWVyeVR5cGUuVklNRU9cbiAgICAgICAgICAgID8gcXVlcnlcbiAgICAgICAgICAgICAgICAgIC5zcGxpdCgnLycpXG4gICAgICAgICAgICAgICAgICAuZmlsdGVyKCh4KSA9PiAhIXgpXG4gICAgICAgICAgICAgICAgICAucG9wKClcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgdmFsaWRhdGVJZChxOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHlvdXR1YmVWaWRlb0lkUmVnZXgudGVzdChxKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgdmFsaWRhdGVVUkwocTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB5b3V0dWJlVmlkZW9VUkxSZWdleC50ZXN0KHEpO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgUXVlcnlSZXNvbHZlciB9O1xuIiwgImltcG9ydCB7IFNub3dmbGFrZVV0aWwgfSBmcm9tICdkaXNjb3JkLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBBc3luY1F1ZXVlQWNxdWlzaXRpb25PcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBYm9ydFNpZ25hbCB0byBjYW5jZWwgdGhpcyBlbnRyeVxuICAgICAqL1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG5leHBvcnQgY2xhc3MgQXN5bmNRdWV1ZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHF1ZXVlZCBlbnRyaWVzXG4gICAgICovXG4gICAgcHVibGljIGVudHJpZXM6IEFycmF5PEFzeW5jUXVldWVFbnRyeT4gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIENsZWFyIGVudHJpZXMgcXVldWVcbiAgICAgKiBAcGFyYW0gY29uc3VtZSBXaGV0aGVyIG9yIG5vdCB0byBjb25zdW1lIGFsbCBlbnRyaWVzIGJlZm9yZSBjbGVhcmluZ1xuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhcihjb25zdW1lID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGNvbnN1bWUpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4gZW50cnkuY29uc3VtZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW50cmllcyA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIHF1ZXVlLiBSZXR1cm5zIGAwYCBpZiBubyBlbnRyaWVzIGFyZSBhdmFpbGFibGUuXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBY3F1aXJlIGFuIGVudHJ5LlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGxvY2sgdGhlIHF1ZXVlXG4gICAgICogY29uc3QgZW50cnkgPSBhc3luY1F1ZXVlLmFjcXVpcmUoKTtcbiAgICAgKiAvLyB3YWl0IHVudGlsIHByZXZpb3VzIHRhc2sgaXMgY29tcGxldGVkXG4gICAgICogYXdhaXQgZW50cnkuZ2V0VGFzaygpO1xuICAgICAqIC8vIGRvIHNvbWV0aGluZyBleHBlbnNpdmVcbiAgICAgKiBhd2FpdCBwZXJmb3JtU29tZXRoaW5nRXhwZW5zaXZlKCk7XG4gICAgICogLy8gbWFrZSBzdXJlIHRvIHJlbGVhc2UgdGhlIGxvY2sgb25jZSBkb25lXG4gICAgICogYXN5bmNRdWV1ZS5yZWxlYXNlKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGFjcXVpcmUob3B0aW9ucz86IEFzeW5jUXVldWVBY3F1aXNpdGlvbk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSBuZXcgQXN5bmNRdWV1ZUVudHJ5KHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmICh0aGlzLmVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgICAgICBlbnRyeS5jb25zdW1lKCk7XG4gICAgICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxlYXNlIHRoZSBjdXJyZW50IGFjcXVpc2l0aW9uIGFuZCBtb3ZlIHRvIG5leHQgZW50cnkuXG4gICAgICovXG4gICAgcHVibGljIHJlbGVhc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5lbnRyaWVzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuZW50cmllcy5zaGlmdCgpO1xuICAgICAgICB0aGlzLmVudHJpZXNbMF0/LmNvbnN1bWUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWwgYWxsIGVudHJpZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FuY2VsQWxsKCkge1xuICAgICAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IGVudHJ5LmNhbmNlbCgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIGVudHJ5IGZyb20gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGVudHJ5IFRoZSBlbnRyeSB0byByZW1vdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlRW50cnkoZW50cnk6IEFzeW5jUXVldWVFbnRyeSkge1xuICAgICAgICBjb25zdCBlbnRyeUlkeCA9IHRoaXMuZW50cmllcy5pbmRleE9mKGVudHJ5KTtcblxuICAgICAgICBpZiAoZW50cnlJZHggIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuc3BsaWNlKGVudHJ5SWR4LCAxKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFzeW5jUXVldWVFbnRyeSB7XG4gICAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuICAgIHB1YmxpYyBzaWduYWw6IEFib3J0U2lnbmFsIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIG9uQWJvcnQ6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcmVzb2x2ZSE6ICgpID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSByZWplY3QhOiAoZXJyOiBFcnJvcikgPT4gdm9pZDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEFzeW5jUXVldWUsIHB1YmxpYyBvcHRpb25zPzogQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucykge1xuICAgICAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgdGhpcy5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnM/LnNpZ25hbCkge1xuICAgICAgICAgICAgdGhpcy5zZXRBYm9ydFNpZ25hbCh0aGlzLm9wdGlvbnMuc2lnbmFsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRBYm9ydFNpZ25hbChzaWduYWw6IEFib3J0U2lnbmFsKSB7XG4gICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnNpZ25hbCA9IHNpZ25hbDtcbiAgICAgICAgdGhpcy5vbkFib3J0ID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5yZW1vdmVFbnRyeSh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCB0aGlzLm9uQWJvcnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25zdW1lKCkge1xuICAgICAgICB0aGlzLmNsZWFudXAoKTtcbiAgICAgICAgdGhpcy5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbGVhc2UoKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpO1xuICAgICAgICB0aGlzLnF1ZXVlLnJlbGVhc2UoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuY2VsKCkge1xuICAgICAgICB0aGlzLmNsZWFudXAoKTtcbiAgICAgICAgdGhpcy5yZWplY3QobmV3IEVycm9yKCdDYW5jZWxsZWQnKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFudXAoKSB7XG4gICAgICAgIGlmICh0aGlzLm9uQWJvcnQpIHRoaXMuc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIHRoaXMub25BYm9ydCk7XG4gICAgICAgIHRoaXMuc2lnbmFsID0gbnVsbDtcbiAgICAgICAgdGhpcy5vbkFib3J0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VGFzaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRmlsdGVyc05hbWUsIFF1ZXVlRmlsdGVycyB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IEF1ZGlvRmlsdGVycyB9IGZyb20gJy4uL3V0aWxzL0F1ZGlvRmlsdGVycyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcbmltcG9ydCB7IEJpcXVhZEZpbHRlcnMsIEVxdWFsaXplciwgRXF1YWxpemVyQmFuZCwgUENNRmlsdGVycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuaW1wb3J0IHsgRkZtcGVnU3RyZWFtT3B0aW9ucywgY3JlYXRlRkZtcGVnU3RyZWFtIH0gZnJvbSAnLi4vdXRpbHMvRkZtcGVnU3RyZWFtJztcblxudHlwZSBGaWx0ZXJzID0ga2V5b2YgdHlwZW9mIEF1ZGlvRmlsdGVycy5maWx0ZXJzO1xuXG5jb25zdCBtYWtlQmFuZHMgPSAoYXJyOiBudW1iZXJbXSkgPT4ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKFxuICAgICAgICB7XG4gICAgICAgICAgICBsZW5ndGg6IEVxdWFsaXplci5CQU5EX0NPVU5UXG4gICAgICAgIH0sXG4gICAgICAgIChfLCBpKSA9PiAoe1xuICAgICAgICAgICAgYmFuZDogaSxcbiAgICAgICAgICAgIGdhaW46IGFycltpXSA/IGFycltpXSAvIDMwIDogMFxuICAgICAgICB9KVxuICAgICkgYXMgRXF1YWxpemVyQmFuZFtdO1xufTtcblxuZXhwb3J0IGNvbnN0IEVxdWFsaXplckNvbmZpZ3VyYXRpb25QcmVzZXQgPSB7XG4gICAgRmxhdDogbWFrZUJhbmRzKFtdKSxcbiAgICBDbGFzc2ljYWw6IG1ha2VCYW5kcyhbLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTcuMiwgLTcuMiwgLTcuMiwgLTkuNl0pLFxuICAgIENsdWI6IG1ha2VCYW5kcyhbLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIDguMCwgNS42LCA1LjYsIDUuNiwgMy4yLCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1XSksXG4gICAgRGFuY2U6IG1ha2VCYW5kcyhbOS42LCA3LjIsIDIuNCwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC01LjYsIC03LjIsIC03LjIsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1XSksXG4gICAgRnVsbEJhc3M6IG1ha2VCYW5kcyhbLTguMCwgOS42LCA5LjYsIDUuNiwgMS42LCAtNC4wLCAtOC4wLCAtMTAuNCwgLTExLjIsIC0xMS4yXSksXG4gICAgRnVsbEJhc3NUcmVibGU6IG1ha2VCYW5kcyhbNy4yLCA1LjYsIC0xLjExMDIyZS0xNSwgLTcuMiwgLTQuOCwgMS42LCA4LjAsIDExLjIsIDEyLjAsIDEyLjBdKSxcbiAgICBGdWxsVHJlYmxlOiBtYWtlQmFuZHMoWy05LjYsIC05LjYsIC05LjYsIC00LjAsIDIuNCwgMTEuMiwgMTYuMCwgMTYuMCwgMTYuMCwgMTYuOF0pLFxuICAgIEhlYWRwaG9uZXM6IG1ha2VCYW5kcyhbNC44LCAxMS4yLCA1LjYsIC0zLjIsIC0yLjQsIDEuNiwgNC44LCA5LjYsIDEyLjgsIDE0LjRdKSxcbiAgICBMYXJnZUhhbGw6IG1ha2VCYW5kcyhbMTAuNCwgMTAuNCwgNS42LCA1LjYsIC0xLjExMDIyZS0xNSwgLTQuOCwgLTQuOCwgLTQuOCwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdKSxcbiAgICBMaXZlOiBtYWtlQmFuZHMoWy00LjgsIC0xLjExMDIyZS0xNSwgNC4wLCA1LjYsIDUuNiwgNS42LCA0LjAsIDIuNCwgMi40LCAyLjRdKSxcbiAgICBQYXJ0eTogbWFrZUJhbmRzKFs3LjIsIDcuMiwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgNy4yLCA3LjJdKSxcbiAgICBQb3A6IG1ha2VCYW5kcyhbLTEuNiwgNC44LCA3LjIsIDguMCwgNS42LCAtMS4xMTAyMmUtMTUsIC0yLjQsIC0yLjQsIC0xLjYsIC0xLjZdKSxcbiAgICBSZWdnYWU6IG1ha2VCYW5kcyhbLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTEuMTEwMjJlLTE1LCA2LjQsIDYuNCwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV0pLFxuICAgIFJvY2s6IG1ha2VCYW5kcyhbOC4wLCA0LjgsIC01LjYsIC04LjAsIC0zLjIsIDQuMCwgOC44LCAxMS4yLCAxMS4yLCAxMS4yXSksXG4gICAgU2thOiBtYWtlQmFuZHMoWy0yLjQsIC00LjgsIC00LjAsIC0xLjExMDIyZS0xNSwgNC4wLCA1LjYsIDguOCwgOS42LCAxMS4yLCA5LjZdKSxcbiAgICBTb2Z0OiBtYWtlQmFuZHMoWzQuOCwgMS42LCAtMS4xMTAyMmUtMTUsIC0yLjQsIC0xLjExMDIyZS0xNSwgNC4wLCA4LjAsIDkuNiwgMTEuMiwgMTIuMF0pLFxuICAgIFNvZnRSb2NrOiBtYWtlQmFuZHMoWzQuMCwgNC4wLCAyLjQsIC0xLjExMDIyZS0xNSwgLTQuMCwgLTUuNiwgLTMuMiwgLTEuMTEwMjJlLTE1LCAyLjQsIDguOF0pLFxuICAgIFRlY2hubzogbWFrZUJhbmRzKFs4LjAsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNS42LCAtNC44LCAtMS4xMTAyMmUtMTUsIDguMCwgOS42LCA5LjYsIDguOF0pXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY2xhc3MgRkZtcGVnRmlsdGVyZXI8TWV0YSA9IHVua25vd24+IHtcbiAgICAjZmZtcGVnRmlsdGVyczogRmlsdGVyc1tdID0gW107XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBhZjogR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPikge31cblxuICAgICNzZXRGaWx0ZXJzKGZpbHRlcnM6IEZpbHRlcnNbXSkge1xuICAgICAgICBjb25zdCB7IHF1ZXVlIH0gPSB0aGlzLmFmO1xuICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy4jZmZtcGVnRmlsdGVycy5zbGljZSgpO1xuICAgICAgICBjb25zdCBpZ25vcmVGaWx0ZXJzID0gdGhpcy5maWx0ZXJzLnNvbWUoKGZmKSA9PiBmZiA9PT0gJ25pZ2h0Y29yZScgfHwgZmYgPT09ICd2YXBvcndhdmUnKSAmJiAhZmlsdGVycy5zb21lKChmZikgPT4gZmYgPT09ICduaWdodGNvcmUnIHx8IGZmID09PSAndmFwb3J3YXZlJyk7XG4gICAgICAgIGNvbnN0IHNlZWtUaW1lID0gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyk/LmN1cnJlbnQudmFsdWUgfHwgMDtcbiAgICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycyA9IFsuLi5uZXcgU2V0KGZpbHRlcnMpXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hZi50cmlnZ2VyUmVwbGF5KHNlZWtUaW1lKS50aGVuKCh0KSA9PiB7XG4gICAgICAgICAgICBxdWV1ZS5wbGF5ZXIuZXZlbnRzLmVtaXQoJ2F1ZGlvRmlsdGVyc1VwZGF0ZScsIHF1ZXVlLCBwcmV2LCB0aGlzLiNmZm1wZWdGaWx0ZXJzLnNsaWNlKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBmZm1wZWcgc3RyZWFtXG4gICAgICogQHBhcmFtIHNvdXJjZSBUaGUgc3RyZWFtIHNvdXJjZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBzdHJlYW0gb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVTdHJlYW0oc291cmNlOiBzdHJpbmcgfCBSZWFkYWJsZSwgb3B0aW9uczogRkZtcGVnU3RyZWFtT3B0aW9ucykge1xuICAgICAgICByZXR1cm4gY3JlYXRlRkZtcGVnU3RyZWFtKHNvdXJjZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGZmbXBlZyBmaWx0ZXJzXG4gICAgICogQHBhcmFtIGZpbHRlcnMgVGhlIGZpbHRlcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RmlsdGVycyhmaWx0ZXJzOiBGaWx0ZXJzW10gfCBSZWNvcmQ8RmlsdGVycywgYm9vbGVhbj4gfCBib29sZWFuKSB7XG4gICAgICAgIGxldCBfZmlsdGVyczogRmlsdGVyc1tdID0gW107XG4gICAgICAgIGlmICh0eXBlb2YgZmlsdGVycyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBfZmlsdGVycyA9ICFmaWx0ZXJzID8gW10gOiAoT2JqZWN0LmtleXMoQXVkaW9GaWx0ZXJzLmZpbHRlcnMpIGFzIEZpbHRlcnNbXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJzKSkge1xuICAgICAgICAgICAgX2ZpbHRlcnMgPSBmaWx0ZXJzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX2ZpbHRlcnMgPSBPYmplY3QuZW50cmllcyhmaWx0ZXJzKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHJlcykgPT4gcmVzWzFdID09PSB0cnVlKVxuICAgICAgICAgICAgICAgIC5tYXAoKG0pID0+IG1bMF0pIGFzIEZpbHRlcnNbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLiNzZXRGaWx0ZXJzKF9maWx0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50bHkgYWN0aXZlIGZmbXBlZyBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZmZtcGVnRmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGZpbHRlcnMoZmlsdGVyczogRmlsdGVyc1tdKSB7XG4gICAgICAgIHRoaXMuc2V0RmlsdGVycyhmaWx0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGUgZ2l2ZW4gZmZtcGVnIGZpbHRlcihzKVxuICAgICAqIEBwYXJhbSBmaWx0ZXJzIFRoZSBmaWx0ZXIocylcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlKGZpbHRlcnM6IEZpbHRlcnNbXSB8IEZpbHRlcnMpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpbHRlcnMpKSBmaWx0ZXJzID0gW2ZpbHRlcnNdO1xuICAgICAgICBjb25zdCBmcmVzaDogRmlsdGVyc1tdID0gW107XG5cbiAgICAgICAgZmlsdGVycy5mb3JFYWNoKChmKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzLmluY2x1ZGVzKGYpKSByZXR1cm47XG4gICAgICAgICAgICBmcmVzaC5wdXNoKGYpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy4jc2V0RmlsdGVycyh0aGlzLiNmZm1wZWdGaWx0ZXJzLmZpbHRlcigocikgPT4gIWZpbHRlcnMuaW5jbHVkZXMocikpLmNvbmNhdChmcmVzaCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBkZWZhdWx0IGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gZmYgRmlsdGVycyBsaXN0XG4gICAgICovXG4gICAgcHVibGljIHNldERlZmF1bHRzKGZmOiBGaWx0ZXJzW10pIHtcbiAgICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycyA9IGZmO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBsaXN0IG9mIGVuYWJsZWQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGaWx0ZXJzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZmbXBlZ0ZpbHRlcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGxpc3Qgb2YgZGlzYWJsZWQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGaWx0ZXJzRGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiBBdWRpb0ZpbHRlcnMubmFtZXMuZmlsdGVyKChmKSA9PiAhdGhpcy4jZmZtcGVnRmlsdGVycy5pbmNsdWRlcyhmKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBlbmFibGVkXG4gICAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyXG4gICAgICovXG4gICAgcHVibGljIGlzRW5hYmxlZDxUIGV4dGVuZHMgRmlsdGVycz4oZmlsdGVyOiBUKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzLmluY2x1ZGVzKGZpbHRlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBkaXNhYmxlZFxuICAgICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlclxuICAgICAqL1xuICAgIHB1YmxpYyBpc0Rpc2FibGVkPFQgZXh0ZW5kcyBGaWx0ZXJzPihmaWx0ZXI6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzRW5hYmxlZChmaWx0ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgYSB2YWxpZCBmaWx0ZXJcbiAgICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gdGVzdFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1ZhbGlkRmlsdGVyKGZpbHRlcjogc3RyaW5nKTogZmlsdGVyIGlzIEZpbHRlcnNOYW1lIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5oYXMoZmlsdGVyIGFzIEZpbHRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgY3VycmVudCBmaWx0ZXJzIHRvIGFycmF5XG4gICAgICovXG4gICAgcHVibGljIHRvQXJyYXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcnMubWFwKChmaWx0ZXIpID0+IEF1ZGlvRmlsdGVycy5nZXQoZmlsdGVyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBjdXJyZW50IGZpbHRlcnMgdG8gSlNPTiBvYmplY3RcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9KU09OKCkge1xuICAgICAgICBjb25zdCBvYmogPSB7fSBhcyBSZWNvcmQ8a2V5b2YgUXVldWVGaWx0ZXJzLCBzdHJpbmc+O1xuXG4gICAgICAgIHRoaXMuZmlsdGVycy5mb3JFYWNoKChmaWx0ZXIpID0+IChvYmpbZmlsdGVyXSA9IEF1ZGlvRmlsdGVycy5nZXQoZmlsdGVyKSkpO1xuXG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGN1cnJlbnQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5jcmVhdGUodGhpcy5maWx0ZXJzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZUFGaWx0ZXJzQ2FjaGUge1xuICAgIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdO1xuICAgIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IG51bGw7XG4gICAgZmlsdGVyczogUENNRmlsdGVyc1tdO1xuICAgIHZvbHVtZTogbnVtYmVyO1xuICAgIHNhbXBsZVJhdGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YSA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgZ3JhcGggPSBuZXcgQUZpbHRlckdyYXBoPE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyBmZm1wZWcgPSBuZXcgRkZtcGVnRmlsdGVyZXI8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIGVxdWFsaXplclByZXNldHMgPSBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0O1xuICAgIHB1YmxpYyBfbGFzdEZpbHRlcnNDYWNoZTogR3VpbGRRdWV1ZUFGaWx0ZXJzQ2FjaGUgPSB7XG4gICAgICAgIGJpcXVhZDogbnVsbCxcbiAgICAgICAgZXF1YWxpemVyOiBbXSxcbiAgICAgICAgZmlsdGVyczogW10sXG4gICAgICAgIHZvbHVtZTogMTAwLFxuICAgICAgICBzYW1wbGVSYXRlOiAtMVxuICAgIH07XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMucXVldWUub3B0aW9ucy52b2x1bWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IHRoaXMucXVldWUub3B0aW9ucy52b2x1bWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWb2x1bWUgdHJhbnNmb3JtZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZHNwPy52b2x1bWUgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAxNSBCYW5kIEVxdWFsaXplclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5lcXVhbGl6ZXIgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaWdpdGFsIGJpcXVhZCBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldCBiaXF1YWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmJpcXVhZCB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERTUCBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5maWx0ZXJzIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXVkaW8gcmVzYW1wbGVyXG4gICAgICovXG4gICAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnJlc2FtcGxlciB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGxheSBjdXJyZW50IHRyYWNrIGluIHRyYW5zaXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSBzZWVrIFRoZSBkdXJhdGlvbiB0byBzZWVrIHRvXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHRyaWdnZXJSZXBsYXkoc2VlayA9IDApIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLmFjcXVpcmUoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucXVldWUubm9kZS5wbGF5KHRoaXMucXVldWUuY3VycmVudFRyYWNrLCB7XG4gICAgICAgICAgICAgICAgcXVldWU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNlZWssXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbk1vZGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5ub2RlLnRhc2tzUXVldWUucmVsZWFzZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5ub2RlLnRhc2tzUXVldWUucmVsZWFzZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQUZpbHRlckdyYXBoPE1ldGEgPSB1bmtub3duPiB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBhZjogR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPikge31cblxuICAgIHB1YmxpYyBnZXQgZmZtcGVnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZi5mZm1wZWcuZmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVxdWFsaXplcigpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmFmLmVxdWFsaXplcj8uYmFuZE11bHRpcGxpZXJzIHx8IFtdKS5tYXAoKG0sIGkpID0+ICh7XG4gICAgICAgICAgICBiYW5kOiBpLFxuICAgICAgICAgICAgZ2FpbjogbVxuICAgICAgICB9KSkgYXMgRXF1YWxpemVyQmFuZFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gcmV0dXJuICh0aGlzLmFmLmJpcXVhZD8uZ2V0RmlsdGVyTmFtZSgpIGFzIEV4Y2x1ZGU8QmlxdWFkRmlsdGVycywgbnVtYmVyPiB8IG51bGwpIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZi5maWx0ZXJzPy5maWx0ZXJzIHx8IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdm9sdW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZi52b2x1bWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFmLnJlc2FtcGxlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZHVtcCgpOiBGaWx0ZXJHcmFwaCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmZm1wZWc6IHRoaXMuZmZtcGVnLFxuICAgICAgICAgICAgZXF1YWxpemVyOiB0aGlzLmVxdWFsaXplcixcbiAgICAgICAgICAgIGJpcXVhZDogdGhpcy5iaXF1YWQsXG4gICAgICAgICAgICBmaWx0ZXJzOiB0aGlzLmZpbHRlcnMsXG4gICAgICAgICAgICBzYW1wbGVSYXRlOiB0aGlzLnJlc2FtcGxlcj8udGFyZ2V0U2FtcGxlUmF0ZSB8fCB0aGlzLnJlc2FtcGxlcj8uc2FtcGxlUmF0ZSB8fCA0ODAwMCxcbiAgICAgICAgICAgIHZvbHVtZTogdGhpcy52b2x1bWU/LnZvbHVtZSA/PyAxMDBcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyR3JhcGgge1xuICAgIGZmbXBlZzogRmlsdGVyc1tdO1xuICAgIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdO1xuICAgIGJpcXVhZDogRXhjbHVkZTxCaXF1YWRGaWx0ZXJzLCBudW1iZXI+IHwgbnVsbDtcbiAgICBmaWx0ZXJzOiBQQ01GaWx0ZXJzW107XG4gICAgdm9sdW1lOiBudW1iZXI7XG4gICAgc2FtcGxlUmF0ZTogbnVtYmVyO1xufVxuIiwgImltcG9ydCB0eXBlIHsgRHVwbGV4LCBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgKiBhcyBwcmlzbSBmcm9tICdwcmlzbS1tZWRpYSc7XG5pbXBvcnQgeyBGRm1wZWcgfSBmcm9tICcuL0ZGbXBlZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRkZtcGVnU3RyZWFtT3B0aW9ucyB7XG4gICAgZm10Pzogc3RyaW5nO1xuICAgIGVuY29kZXJBcmdzPzogc3RyaW5nW107XG4gICAgc2Vlaz86IG51bWJlcjtcbiAgICBza2lwPzogYm9vbGVhbjtcbiAgICBjb29raWVzPzogc3RyaW5nO1xuICAgIHVzZUxlZ2FjeUZGbXBlZz86IGJvb2xlYW47XG59XG5cbmNvbnN0IGdldEZGbXBlZ1Byb3ZpZGVyID0gKGxlZ2FjeSA9IGZhbHNlKSA9PiAobGVnYWN5ID8gKHByaXNtIGFzIHR5cGVvZiBwcmlzbSAmIHsgZGVmYXVsdDogdHlwZW9mIHByaXNtIH0pLmRlZmF1bHQ/LkZGbXBlZyB8fCBwcmlzbS5GRm1wZWcgOiBGRm1wZWcpO1xuXG5leHBvcnQgZnVuY3Rpb24gRkZNUEVHX0FSR1NfU1RSSU5HKHN0cmVhbTogc3RyaW5nLCBmbXQ/OiBzdHJpbmcsIGNvb2tpZXM/OiBzdHJpbmcpIHtcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICBjb25zdCBhcmdzID0gW1xuICAgICAgICBcIi1yZWNvbm5lY3RcIiwgXCIxXCIsXG4gICAgICAgIFwiLXJlY29ubmVjdF9zdHJlYW1lZFwiLCBcIjFcIixcbiAgICAgICAgXCItcmVjb25uZWN0X2RlbGF5X21heFwiLCBcIjVcIixcbiAgICAgICAgXCItaVwiLCBzdHJlYW0sXG4gICAgICAgIFwiLWFuYWx5emVkdXJhdGlvblwiLCBcIjBcIixcbiAgICAgICAgXCItbG9nbGV2ZWxcIiwgXCIwXCIsXG4gICAgICAgIFwiLWZcIiwgYCR7dHlwZW9mIGZtdCA9PT0gXCJzdHJpbmdcIiA/IGZtdCA6IFwiczE2bGVcIn1gLFxuICAgICAgICBcIi1hclwiLCBcIjQ4MDAwXCIsXG4gICAgICAgIFwiLWFjXCIsIFwiMlwiXG4gICAgXTtcblxuICAgIGlmICh0eXBlb2YgY29va2llcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gaHR0cHM6Ly9mZm1wZWcub3JnL2ZmbXBlZy1wcm90b2NvbHMuaHRtbCNIVFRQLUNvb2tpZXNcbiAgICAgICAgYXJncy5wdXNoKCctY29va2llcycsIGNvb2tpZXMuc3RhcnRzV2l0aCgnXCInKSA/IGNvb2tpZXMgOiBgXCIke2Nvb2tpZXN9XCJgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJncztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZGTVBFR19BUkdTX1BJUEVEKGZtdD86IHN0cmluZykge1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIHJldHVybiBbXG4gICAgICAgIFwiLWFuYWx5emVkdXJhdGlvblwiLCBcIjBcIixcbiAgICAgICAgXCItbG9nbGV2ZWxcIiwgXCIwXCIsXG4gICAgICAgIFwiLWZcIiwgYCR7dHlwZW9mIGZtdCA9PT0gXCJzdHJpbmdcIiA/IGZtdCA6IFwiczE2bGVcIn1gLFxuICAgICAgICBcIi1hclwiLCBcIjQ4MDAwXCIsXG4gICAgICAgIFwiLWFjXCIsIFwiMlwiXG4gICAgXTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIEZGbXBlZyBzdHJlYW1cbiAqIEBwYXJhbSBzdHJlYW0gVGhlIHNvdXJjZSBzdHJlYW1cbiAqIEBwYXJhbSBvcHRpb25zIEZGbXBlZyBzdHJlYW0gb3B0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRkZtcGVnU3RyZWFtKHN0cmVhbTogUmVhZGFibGUgfCBEdXBsZXggfCBzdHJpbmcsIG9wdGlvbnM/OiBGRm1wZWdTdHJlYW1PcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnM/LnNraXAgJiYgdHlwZW9mIHN0cmVhbSAhPT0gJ3N0cmluZycpIHJldHVybiBzdHJlYW07XG4gICAgb3B0aW9ucyA/Pz0ge307XG4gICAgY29uc3QgYXJncyA9IHR5cGVvZiBzdHJlYW0gPT09ICdzdHJpbmcnID8gRkZNUEVHX0FSR1NfU1RSSU5HKHN0cmVhbSwgb3B0aW9ucy5mbXQsIG9wdGlvbnMuY29va2llcykgOiBGRk1QRUdfQVJHU19QSVBFRChvcHRpb25zLmZtdCk7XG5cbiAgICBpZiAoIU51bWJlci5pc05hTihvcHRpb25zLnNlZWspKSBhcmdzLnVuc2hpZnQoJy1zcycsIFN0cmluZyhvcHRpb25zLnNlZWspKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLmVuY29kZXJBcmdzKSkgYXJncy5wdXNoKC4uLm9wdGlvbnMuZW5jb2RlckFyZ3MpO1xuXG4gICAgY29uc3QgRkZNUEVHID0gZ2V0RkZtcGVnUHJvdmlkZXIoISFvcHRpb25zLnVzZUxlZ2FjeUZGbXBlZyk7XG5cbiAgICBjb25zdCB0cmFuc2NvZGVyID0gbmV3IEZGTVBFRyh7IHNoZWxsOiBmYWxzZSwgYXJncyB9KTtcblxuICAgIHRyYW5zY29kZXIub24oJ2Nsb3NlJywgKCkgPT4gdHJhbnNjb2Rlci5kZXN0cm95KCkpO1xuXG4gICAgaWYgKHR5cGVvZiBzdHJlYW0gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHN0cmVhbS5vbignZXJyb3InLCAoKSA9PiB0cmFuc2NvZGVyLmRlc3Ryb3koKSk7XG4gICAgICAgIHN0cmVhbS5waXBlKHRyYW5zY29kZXIpO1xuICAgIH1cblxuICAgIHJldHVybiB0cmFuc2NvZGVyO1xufVxuIiwgImltcG9ydCBjaGlsZFByb2Nlc3MgZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBEdXBsZXgsIER1cGxleE9wdGlvbnMgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4vVHlwZVV0aWwnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4vVXRpbCc7XG5cbnR5cGUgQ2FsbGJhY2s8QXJncyBleHRlbmRzIEFycmF5PHVua25vd24+PiA9ICguLi5hcmdzOiBBcmdzKSA9PiB1bmtub3duO1xuXG5jb25zdCB2YWxpZGF0ZVBhdGhQYXJhbSA9ICh0OiB1bmtub3duKSA9PiB7XG4gICAgaWYgKCFUeXBlVXRpbC5pc1N0cmluZyh0KSB8fCAhdCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRShTdHJpbmcodCksICdzdHJpbmcnLCB0eXBlb2YgdCk7XG4gICAgcmV0dXJuIHQ7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEZGbXBlZ0luZm8ge1xuICAgIGNvbW1hbmQ6IHN0cmluZyB8IG51bGw7XG4gICAgbWV0YWRhdGE6IHN0cmluZyB8IG51bGw7XG4gICAgdmVyc2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICBpc1N0YXRpYzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGRm1wZWdPcHRpb25zIGV4dGVuZHMgRHVwbGV4T3B0aW9ucyB7XG4gICAgYXJncz86IHN0cmluZ1tdO1xuICAgIHNoZWxsPzogYm9vbGVhbjtcbn1cblxuY29uc3QgZmZtcGVnSW5mbzogRkZtcGVnSW5mbyA9IHtcbiAgICBjb21tYW5kOiBudWxsLFxuICAgIG1ldGFkYXRhOiBudWxsLFxuICAgIHZlcnNpb246IG51bGwsXG4gICAgaXNTdGF0aWM6IGZhbHNlXG59O1xuXG5pbnRlcmZhY2UgRkZtcGVnTG9jYXRpb24ge1xuICAgIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG4gICAgZ2V0UGF0aDogKCkgPT4gc3RyaW5nO1xufVxuXG5jb25zdCBpc1dpbmRvd3MgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzICovXG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IEZGbXBlZ1Bvc3NpYmxlTG9jYXRpb25zOiBGRm1wZWdMb2NhdGlvbltdID0gW1xuICAgIHtcbiAgICAgICAgZ2V0UGF0aCgpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZVBhdGhQYXJhbShwcm9jZXNzLmVudi5GRk1QRUdfUEFUSCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRpc3BsYXlOYW1lOiAnc3Bhd24gcHJvY2Vzcy5lbnYuRkZNUEVHX1BBVEgnXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGdldFBhdGgoKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2ZmbXBlZyc7XG4gICAgICAgIH0sXG4gICAgICAgIGRpc3BsYXlOYW1lOiAnc3Bhd24gZmZtcGVnJ1xuICAgIH0sXG4gICAge1xuICAgICAgICBnZXRQYXRoKCkge1xuICAgICAgICAgICAgcmV0dXJuICdhdmNvbnYnO1xuICAgICAgICB9LFxuICAgICAgICBkaXNwbGF5TmFtZTogJ3NwYXduIGF2Y29udidcbiAgICB9LFxuICAgIHtcbiAgICAgICAgZ2V0UGF0aCgpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvYyA9ICcuL2ZmbXBlZyc7XG4gICAgICAgICAgICBpZiAoaXNXaW5kb3dzKSByZXR1cm4gbG9jLmNvbmNhdCgnLmV4ZScpO1xuICAgICAgICAgICAgcmV0dXJuIGxvYztcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcGxheU5hbWU6ICdzcGF3biAuL2ZmbXBlZydcbiAgICB9LFxuICAgIHtcbiAgICAgICAgZ2V0UGF0aCgpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvYyA9ICcuL2F2Y29udic7XG4gICAgICAgICAgICBpZiAoaXNXaW5kb3dzKSByZXR1cm4gbG9jLmNvbmNhdCgnLmV4ZScpO1xuICAgICAgICAgICAgcmV0dXJuIGxvYztcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcGxheU5hbWU6ICdzcGF3biAuL2F2Y29udidcbiAgICB9LFxuICAgIHtcbiAgICAgICAgZ2V0UGF0aCgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1vZCA9IHJlcXVpcmUoJ0BmZm1wZWctaW5zdGFsbGVyL2ZmbXBlZycpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlUGF0aFBhcmFtKG1vZC5kZWZhdWx0Py5wYXRoIHx8IG1vZC5wYXRoIHx8IG1vZCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRpc3BsYXlOYW1lOiAncmVxdWlyZShcIkBmZm1wZWctaW5zdGFsbGVyL2ZmbXBlZ1wiKSdcbiAgICB9LFxuICAgIHtcbiAgICAgICAgZ2V0UGF0aCgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1vZCA9IHJlcXVpcmUoJ2ZmbXBlZy1zdGF0aWMnKTtcbiAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZVBhdGhQYXJhbShtb2QuZGVmYXVsdD8ucGF0aCB8fCBtb2QucGF0aCB8fCBtb2QpO1xuICAgICAgICB9LFxuICAgICAgICBkaXNwbGF5TmFtZTogJ3JlcXVpcmUoXCJmZm1wZWctc3RhdGljXCIpJ1xuICAgIH0sXG4gICAge1xuICAgICAgICBnZXRQYXRoKCkge1xuICAgICAgICAgICAgY29uc3QgbW9kID0gcmVxdWlyZSgnQG5vZGUtZmZtcGVnL25vZGUtZmZtcGVnLWluc3RhbGxlcicpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlUGF0aFBhcmFtKG1vZC5kZWZhdWx0Py5wYXRoIHx8IG1vZC5wYXRoIHx8IG1vZCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRpc3BsYXlOYW1lOiAncmVxdWlyZShcIkBub2RlLWZmbXBlZy9ub2RlLWZmbXBlZy1pbnN0YWxsZXJcIiknXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGdldFBhdGgoKSB7XG4gICAgICAgICAgICBjb25zdCBtb2QgPSByZXF1aXJlKCdmZm1wZWctYmluYXJpZXMnKTtcbiAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZVBhdGhQYXJhbShtb2QuZGVmYXVsdCB8fCBtb2QpO1xuICAgICAgICB9LFxuICAgICAgICBkaXNwbGF5TmFtZTogJ3JlcXVpcmUoXCJmZm1wZWctYmluYXJpZXNcIiknXG4gICAgfVxuXTtcbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlcyAqL1xuXG5leHBvcnQgY2xhc3MgRkZtcGVnIGV4dGVuZHMgRHVwbGV4IHtcbiAgICAvKipcbiAgICAgKiBGRm1wZWcgdmVyc2lvbiByZWdleFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgVmVyc2lvblJlZ2V4ID0gL3ZlcnNpb24gKC4rKSBDb3B5cmlnaHQvaW07XG5cbiAgICAvKipcbiAgICAgKiBTcGF3bnMgZmZtcGVnIHByb2Nlc3NcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBTcGF3biBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzcGF3bih7IGFyZ3MgPSBbXSBhcyBzdHJpbmdbXSwgc2hlbGwgPSBmYWxzZSB9ID0ge30pIHtcbiAgICAgICAgaWYgKCFhcmdzLmluY2x1ZGVzKCctaScpKSBhcmdzLnVuc2hpZnQoJy1pJywgJy0nKTtcblxuICAgICAgICByZXR1cm4gY2hpbGRQcm9jZXNzLnNwYXduKHRoaXMubG9jYXRlKCkhLmNvbW1hbmQhLCBhcmdzLmNvbmNhdChbJ3BpcGU6MSddKSwgeyB3aW5kb3dzSGlkZTogdHJ1ZSwgc2hlbGwgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgZmZtcGVnIGlzIGF2YWlsYWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNBdmFpbGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5sb2NhdGVTYWZlKGZhbHNlKT8uY29tbWFuZCA9PT0gJ3N0cmluZyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2FmZSBsb2NhdGUgZmZtcGVnXG4gICAgICogQHBhcmFtIGZvcmNlIGlmIGl0IHNob3VsZCByZWxvY2F0ZSB0aGUgY29tbWFuZFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgbG9jYXRlU2FmZShmb3JjZSA9IGZhbHNlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhdGUoZm9yY2UpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9jYXRlIGZmbXBlZyBjb21tYW5kLiBUaHJvd3MgZXJyb3IgaWYgZmZtcGVnIGlzIG5vdCBmb3VuZC5cbiAgICAgKiBAcGFyYW0gZm9yY2UgRm9yY2VmdWxseSByZWxvYWRcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGxvY2F0ZShmb3JjZSA9IGZhbHNlKTogRkZtcGVnSW5mbyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmIChmZm1wZWdJbmZvLmNvbW1hbmQgJiYgIWZvcmNlKSByZXR1cm4gZmZtcGVnSW5mbztcblxuICAgICAgICBjb25zdCBlcnJTdGFja3M6IEVycm9yW10gPSBuZXcgQXJyYXkoRkZtcGVnUG9zc2libGVMb2NhdGlvbnMubGVuZ3RoKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGxvY2F0b3Igb2YgRkZtcGVnUG9zc2libGVMb2NhdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChsb2NhdG9yID09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tYW5kID0gbG9jYXRvci5nZXRQYXRoKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjaGlsZFByb2Nlc3Muc3Bhd25TeW5jKGNvbW1hbmQsIFsnLWgnXSwge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3dzSGlkZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5lcnJvcikgdGhyb3cgcmVzdWx0LmVycm9yO1xuXG4gICAgICAgICAgICAgICAgZmZtcGVnSW5mby5jb21tYW5kID0gY29tbWFuZDtcbiAgICAgICAgICAgICAgICBmZm1wZWdJbmZvLm1ldGFkYXRhID0gQnVmZmVyLmNvbmNhdChyZXN1bHQub3V0cHV0LmZpbHRlcihCb29sZWFuKSBhcyBCdWZmZXJbXSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBmZm1wZWdJbmZvLmlzU3RhdGljID0gbG9jYXRvci5kaXNwbGF5TmFtZS5zdGFydHNXaXRoKCdyZXF1aXJlKFwiJyk7XG4gICAgICAgICAgICAgICAgZmZtcGVnSW5mby52ZXJzaW9uID0gRkZtcGVnLlZlcnNpb25SZWdleC5leGVjKGZmbXBlZ0luZm8ubWV0YWRhdGEgfHwgJycpPy5bMV0gfHwgbnVsbDtcblxuICAgICAgICAgICAgICAgIGlmIChmZm1wZWdJbmZvLmlzU3RhdGljICYmICEoJ0RQX05PX0ZGTVBFR19XQVJOJyBpbiBwcm9jZXNzLmVudikpIHtcbiAgICAgICAgICAgICAgICAgICAgVXRpbC53YXJuKCdGb3VuZCBmZm1wZWctc3RhdGljIHdoaWNoIGlzIGtub3duIHRvIGJlIHVuc3RhYmxlLicsICdGRm1wZWdTdGF0aWNXYXJuaW5nJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZmbXBlZ0luZm87XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgZXJyU3RhY2tzLnB1c2goZSBhcyBFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfRkZNUEVHX0xPQ0FUT1IoW1xuICAgICAgICAgICAgJ0NvdWxkIG5vdCBsb2NhdGUgZmZtcGVnLiBUcmllZDpcXG4nLFxuICAgICAgICAgICAgLi4uRkZtcGVnUG9zc2libGVMb2NhdGlvbnMubWFwKChsb2MsIGkpID0+IGAgICR7KytpfS4gJHtsb2MuZGlzcGxheU5hbWV9YCksXG4gICAgICAgICAgICAnXFxuJyxcbiAgICAgICAgICAgIGAkeyc9Jy5yZXBlYXQoNSl9RnVsbCBTdGFja3RyYWNlJHsnPScucmVwZWF0KDUpfWAsXG4gICAgICAgICAgICAuLi5lcnJTdGFja3MubWFwKChlKSA9PiBlLnN0YWNrIHx8IGUubWVzc2FnZSlcbiAgICAgICAgXS5qb2luKCdcXG4nKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3VycmVudCBGRm1wZWcgcHJvY2Vzc1xuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzOiBjaGlsZFByb2Nlc3MuQ2hpbGRQcm9jZXNzV2l0aG91dE51bGxTdHJlYW1zO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIEZGbXBlZyBkdXBsZXggc3RyZWFtXG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyB0byBpbml0aWFsaXplIGZmbXBlZ1xuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBmZm1wZWcgPSBuZXcgRkZtcGVnKHtcbiAgICAgKiAgIGFyZ3M6IFtcbiAgICAgKiAgICAgJy1hbmFseXplZHVyYXRpb24nLCAnMCcsXG4gICAgICogICAgICctbG9nbGV2ZWwnLCAnMCcsXG4gICAgICogICAgICctZicsICdzMTZsZScsXG4gICAgICogICAgICctYXInLCAnNDgwMDAnLFxuICAgICAqICAgICAnLWFjJywgJzInLFxuICAgICAqICAgICAnLWFmJywgJ2Jhc3M9Zz0xMCxhY29tcHJlc3NvcidcbiAgICAgKiAgIF1cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIGNvbnN0IHBjbSA9IGlucHV0LnBpcGUoZmZtcGVnKTtcbiAgICAgKlxuICAgICAqIHBjbS5waXBlKGZzLmNyZWF0ZVdyaXRlU3RyZWFtKCcuL2F1ZGlvLnBjbScpKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogRkZtcGVnT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMucHJvY2VzcyA9IEZGbXBlZy5zcGF3bihvcHRpb25zKTtcblxuICAgICAgICBjb25zdCBFVkVOVFMgPSB7XG4gICAgICAgICAgICByZWFkYWJsZTogdGhpcy5fcmVhZGVyLFxuICAgICAgICAgICAgZGF0YTogdGhpcy5fcmVhZGVyLFxuICAgICAgICAgICAgZW5kOiB0aGlzLl9yZWFkZXIsXG4gICAgICAgICAgICB1bnBpcGU6IHRoaXMuX3JlYWRlcixcbiAgICAgICAgICAgIGZpbmlzaDogdGhpcy5fd3JpdGVyLFxuICAgICAgICAgICAgZHJhaW46IHRoaXMuX3dyaXRlclxuICAgICAgICB9IGFzIGNvbnN0O1xuXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IHRoaXMuX3JlYWRlci5fcmVhZGFibGVTdGF0ZTtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICB0aGlzLl93cml0YWJsZVN0YXRlID0gdGhpcy5fd3JpdGVyLl93cml0YWJsZVN0YXRlO1xuXG4gICAgICAgIHRoaXMuX2NvcHkoWyd3cml0ZScsICdlbmQnXSwgdGhpcy5fd3JpdGVyKTtcbiAgICAgICAgdGhpcy5fY29weShbJ3JlYWQnLCAnc2V0RW5jb2RpbmcnLCAncGlwZScsICd1bnBpcGUnXSwgdGhpcy5fcmVhZGVyKTtcblxuICAgICAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBbJ29uJywgJ29uY2UnLCAncmVtb3ZlTGlzdGVuZXInLCAncmVtb3ZlQWxsTGlzdGVuZXJzJywgJ2xpc3RlbmVycyddIGFzIGNvbnN0KSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB0aGlzW21ldGhvZF0gPSAoZXYsIGZuKSA9PiAoRVZFTlRTW2V2XSA/IEVWRU5UU1tldl1bbWV0aG9kXShldiwgZm4pIDogRHVwbGV4LnByb3RvdHlwZVttZXRob2RdLmNhbGwodGhpcywgZXYsIGZuKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcm9jZXNzRXJyb3IgPSAoZXJyb3I6IEVycm9yKSA9PiB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuXG4gICAgICAgIHRoaXMuX3JlYWRlci5vbignZXJyb3InLCBwcm9jZXNzRXJyb3IpO1xuICAgICAgICB0aGlzLl93cml0ZXIub24oJ2Vycm9yJywgcHJvY2Vzc0Vycm9yKTtcbiAgICB9XG5cbiAgICBnZXQgX3JlYWRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2VzcyEuc3Rkb3V0O1xuICAgIH1cbiAgICBnZXQgX3dyaXRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2VzcyEuc3RkaW47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY29weShtZXRob2RzOiBzdHJpbmdbXSwgdGFyZ2V0OiB1bmtub3duKSB7XG4gICAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHRoaXNbbWV0aG9kXSA9IHRhcmdldFttZXRob2RdLmJpbmQodGFyZ2V0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBfZGVzdHJveShlcnI6IEVycm9yIHwgbnVsbCwgY2I6IENhbGxiYWNrPFtFcnJvciB8IG51bGxdPikge1xuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XG4gICAgICAgIGlmIChjYikgcmV0dXJuIGNiKGVycik7XG4gICAgfVxuXG4gICAgcHVibGljIF9maW5hbChjYjogQ2FsbGJhY2s8W10+KSB7XG4gICAgICAgIHRoaXMuX2NsZWFudXAoKTtcbiAgICAgICAgY2IoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jbGVhbnVwKCkge1xuICAgICAgICBpZiAodGhpcy5wcm9jZXNzKSB7XG4gICAgICAgICAgICB0aGlzLm9uY2UoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzcy5raWxsKCdTSUdLSUxMJyk7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3MgPSBudWxsIGFzIHVua25vd24gYXMgY2hpbGRQcm9jZXNzLkNoaWxkUHJvY2Vzc1dpdGhvdXROdWxsU3RyZWFtcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICAgICAgaWYgKCFmZm1wZWdJbmZvLm1ldGFkYXRhKSByZXR1cm4gJ0ZGbXBlZyc7XG5cbiAgICAgICAgcmV0dXJuIGZmbXBlZ0luZm8ubWV0YWRhdGE7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgZmluZEZGbXBlZyA9IEZGbXBlZy5sb2NhdGU7XG4iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSB7XG4gICAgbGF0ZW5jeToge1xuICAgICAgICBldmVudExvb3A6IG51bWJlcjtcbiAgICAgICAgdm9pY2VDb25uZWN0aW9uOiBudW1iZXI7XG4gICAgfTtcbiAgICBzdGF0dXM6IHtcbiAgICAgICAgYnVmZmVyaW5nOiBib29sZWFuO1xuICAgICAgICBwbGF5aW5nOiBib29sZWFuO1xuICAgICAgICBwYXVzZWQ6IGJvb2xlYW47XG4gICAgICAgIGlkbGU6IGJvb2xlYW47XG4gICAgfTtcbiAgICB0cmFja3NDb3VudDogbnVtYmVyO1xuICAgIGhpc3RvcnlTaXplOiBudW1iZXI7XG4gICAgZXh0cmFjdG9yczogbnVtYmVyO1xuICAgIGxpc3RlbmVyczogbnVtYmVyO1xuICAgIG1lbW9yeVVzYWdlOiBOb2RlSlMuTWVtb3J5VXNhZ2U7XG4gICAgdmVyc2lvbnM6IHtcbiAgICAgICAgbm9kZTogc3RyaW5nO1xuICAgICAgICBwbGF5ZXI6IHN0cmluZztcbiAgICB9O1xufVxuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZVN0YXRpc3RpY3M8TWV0YSA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgc3RhdGlzdGljcyBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdlbmVyYXRlKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGF0ZW5jeToge1xuICAgICAgICAgICAgICAgIGV2ZW50TG9vcDogdGhpcy5xdWV1ZS5wbGF5ZXIuZXZlbnRMb29wTGFnLFxuICAgICAgICAgICAgICAgIHZvaWNlQ29ubmVjdGlvbjogdGhpcy5xdWV1ZS5waW5nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RhdHVzOiB7XG4gICAgICAgICAgICAgICAgYnVmZmVyaW5nOiB0aGlzLnF1ZXVlLm5vZGUuaXNCdWZmZXJpbmcoKSxcbiAgICAgICAgICAgICAgICBwbGF5aW5nOiB0aGlzLnF1ZXVlLm5vZGUuaXNQbGF5aW5nKCksXG4gICAgICAgICAgICAgICAgcGF1c2VkOiB0aGlzLnF1ZXVlLm5vZGUuaXNQYXVzZWQoKSxcbiAgICAgICAgICAgICAgICBpZGxlOiB0aGlzLnF1ZXVlLm5vZGUuaXNJZGxlKClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cmFja3NDb3VudDogdGhpcy5xdWV1ZS50cmFja3Muc2l6ZSxcbiAgICAgICAgICAgIGhpc3RvcnlTaXplOiB0aGlzLnF1ZXVlLmhpc3RvcnkudHJhY2tzLnNpemUsXG4gICAgICAgICAgICBleHRyYWN0b3JzOiB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLnNpemUsXG4gICAgICAgICAgICBsaXN0ZW5lcnM6IHRoaXMucXVldWUuZ3VpbGQubWVtYmVycy5tZT8udm9pY2UuY2hhbm5lbD8ubWVtYmVycy5maWx0ZXIoKG0pID0+ICFtLnVzZXIuYm90KS5zaXplIHx8IDAsXG4gICAgICAgICAgICBtZW1vcnlVc2FnZTogcHJvY2Vzcy5tZW1vcnlVc2FnZSgpLFxuICAgICAgICAgICAgdmVyc2lvbnM6IHtcbiAgICAgICAgICAgICAgICBub2RlOiBwcm9jZXNzLnZlcnNpb24sXG4gICAgICAgICAgICAgICAgcGxheWVyOiAnNi41LjAnXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gYXMgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBQbGF5ZXIgfSBmcm9tICcuLi8uLi9QbGF5ZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBpbnN0YW5jZXMgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIFBsYXllcj4oKTtcbmV4cG9ydCBjb25zdCBnbG9iYWxSZWdpc3RyeSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgdW5rbm93bj4oKTtcbiIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi8uLi9QbGF5ZXInO1xuaW1wb3J0IHsgaW5zdGFuY2VzIH0gZnJvbSAnLi9fY29udGFpbmVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFBsYXllcihwbGF5ZXI6IFBsYXllcikge1xuICAgIGlmIChpbnN0YW5jZXMuaGFzKHBsYXllci5pZCkpIHJldHVybiB0cnVlO1xuXG4gICAgaW5zdGFuY2VzLnNldChwbGF5ZXIuaWQsIHBsYXllcik7XG5cbiAgICByZXR1cm4gaW5zdGFuY2VzLmhhcyhwbGF5ZXIuaWQpO1xufVxuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uLy4uL1BsYXllcic7XG5pbXBvcnQgeyBpbnN0YW5jZXMgfSBmcm9tICcuL19jb250YWluZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJQbGF5ZXIocGxheWVyOiBQbGF5ZXIpIHtcbiAgICByZXR1cm4gaW5zdGFuY2VzLmRlbGV0ZShwbGF5ZXIuaWQpO1xufVxuIiwgImltcG9ydCB7IGluc3RhbmNlcyB9IGZyb20gJy4vX2NvbnRhaW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQbGF5ZXJzKCkge1xuICAgIHJldHVybiBpbnN0YW5jZXMuYXJyYXkoKTtcbn1cbiIsICJpbXBvcnQgeyBnbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4vX2NvbnRhaW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxSZWdpc3RyeSgpIHtcbiAgICByZXR1cm4gZ2xvYmFsUmVnaXN0cnk7XG59XG4iLCAiaW1wb3J0IHsgVXNlclJlc29sdmFibGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBhc3NUaHJvdWdoLCB0eXBlIFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IEVuZEJlaGF2aW9yVHlwZSB9IGZyb20gJ0BkaXNjb3JkanMvdm9pY2UnO1xuaW1wb3J0ICogYXMgcHJpc20gZnJvbSAncHJpc20tbWVkaWEnO1xuaW1wb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9IGZyb20gJy4uL1ZvaWNlSW50ZXJmYWNlL1N0cmVhbURpc3BhdGNoZXInO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgUmF3VHJhY2tEYXRhIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9pY2VSZWNlaXZlck9wdGlvbnMge1xuICAgIG1vZGU/OiAnb3B1cycgfCAncGNtJztcbiAgICBlbmQ/OiBFbmRCZWhhdmlvclR5cGU7XG4gICAgc2lsZW5jZUR1cmF0aW9uPzogbnVtYmVyO1xuICAgIGNyYz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFJhd1RyYWNrSW5pdCA9IFBhcnRpYWw8T21pdDxSYXdUcmFja0RhdGEsICdhdXRob3InIHwgJ3BsYXlsaXN0JyB8ICdzb3VyY2UnIHwgJ2VuZ2luZScgfCAncmF3JyB8ICdxdWVyeVR5cGUnIHwgJ2Rlc2NyaXB0aW9uJyB8ICd2aWV3cyc+PjtcblxuZXhwb3J0IGNsYXNzIFZvaWNlUmVjZWl2ZXJOb2RlIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGRpc3BhdGNoZXI6IFN0cmVhbURpc3BhdGNoZXIpIHt9XG5cbiAgICBwdWJsaWMgY3JlYXRlUmF3VHJhY2soc3RyZWFtOiBSZWFkYWJsZSwgZGF0YTogUmF3VHJhY2tJbml0ID0ge30pIHtcbiAgICAgICAgZGF0YS50aXRsZSA/Pz0gYFJlY29yZGluZyAke0RhdGUubm93KCl9YDtcblxuICAgICAgICByZXR1cm4gbmV3IFRyYWNrKHRoaXMuZGlzcGF0Y2hlci5xdWV1ZS5wbGF5ZXIsIHtcbiAgICAgICAgICAgIGF1dGhvcjogJ0Rpc2NvcmQnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGRhdGEudGl0bGUsXG4gICAgICAgICAgICB0aXRsZTogZGF0YS50aXRsZSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiBkYXRhLmR1cmF0aW9uIHx8ICcwOjAwJyxcbiAgICAgICAgICAgIHZpZXdzOiAwLFxuICAgICAgICAgICAgcmVxdWVzdGVkQnk6IGRhdGEucmVxdWVzdGVkQnksXG4gICAgICAgICAgICB0aHVtYm5haWw6IGRhdGEudGh1bWJuYWlsIHx8ICdodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9lbWJlZC9hdmF0YXJzLzAucG5nJyxcbiAgICAgICAgICAgIHVybDogZGF0YS51cmwgfHwgJ2h0dHBzOi8vZGlzY29yZC5jb20nLFxuICAgICAgICAgICAgc291cmNlOiAnYXJiaXRyYXJ5JyxcbiAgICAgICAgICAgIHJhdzoge1xuICAgICAgICAgICAgICAgIGVuZ2luZTogc3RyZWFtLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogJ2FyYml0cmFyeSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWVyZ2UgbXVsdGlwbGUgc3RyZWFtcyB0b2dldGhlclxuICAgICAqIEBwYXJhbSBzdHJlYW1zIFRoZSBhcnJheSBvZiBzdHJlYW1zIHRvIG1lcmdlXG4gICAgICovXG4gICAgcHVibGljIG1lcmdlUmVjb3JkaW5ncyhzdHJlYW1zOiBSZWFkYWJsZVtdKSB7XG4gICAgICAgIC8vIFRPRE9cbiAgICAgICAgdm9pZCBzdHJlYW1zO1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT1RfSU1QTEVNRU5URUQoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5tZXJnZVJlY29yZGluZ3MoKWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY29yZCBhIHVzZXIgaW4gdm9pY2UgY2hhbm5lbFxuICAgICAqIEBwYXJhbSB1c2VyIFRoZSB1c2VyIHRvIHJlY29yZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFJlY29yZGluZyBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIHJlY29yZFVzZXIoXG4gICAgICAgIHVzZXI6IFVzZXJSZXNvbHZhYmxlLFxuICAgICAgICBvcHRpb25zOiBWb2ljZVJlY2VpdmVyT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGVuZDogRW5kQmVoYXZpb3JUeXBlLkFmdGVyU2lsZW5jZSxcbiAgICAgICAgICAgIG1vZGU6ICdwY20nLFxuICAgICAgICAgICAgc2lsZW5jZUR1cmF0aW9uOiAxMDAwXG4gICAgICAgIH1cbiAgICApIHtcbiAgICAgICAgY29uc3QgX3VzZXIgPSB0aGlzLmRpc3BhdGNoZXIucXVldWUucGxheWVyLmNsaWVudC51c2Vycy5yZXNvbHZlSWQodXNlcik7XG5cbiAgICAgICAgY29uc3QgcGFzc1Rocm91Z2ggPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgICAgICAgY29uc3QgcmVjZWl2ZXIgPSB0aGlzLmRpc3BhdGNoZXIudm9pY2VDb25uZWN0aW9uLnJlY2VpdmVyO1xuXG4gICAgICAgIGlmICghcmVjZWl2ZXIpIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFQ0VJVkVSKCk7XG5cbiAgICAgICAgcmVjZWl2ZXIuc3BlYWtpbmcub24oJ3N0YXJ0JywgKHVzZXJJZCkgPT4ge1xuICAgICAgICAgICAgaWYgKHVzZXJJZCA9PT0gX3VzZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWNlaXZlU3RyZWFtID0gcmVjZWl2ZXIuc3Vic2NyaWJlKF91c2VyLCB7XG4gICAgICAgICAgICAgICAgICAgIGVuZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6IG9wdGlvbnMuZW5kIHx8IEVuZEJlaGF2aW9yVHlwZS5BZnRlclNpbGVuY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogb3B0aW9ucy5zaWxlbmNlRHVyYXRpb24gPz8gMTAwMFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5tb2RlID09PSAncGNtJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGNtID0gcmVjZWl2ZVN0cmVhbS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IChwcmlzbS5vcHVzIHx8ICg8YW55PnByaXNtKS5kZWZhdWx0Lm9wdXMpLkRlY29kZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsczogMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplOiA5NjAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGU6IDQ4MDAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGNtLnBpcGUocGFzc1Rocm91Z2gpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlY2VpdmVTdHJlYW0ucGlwZShwYXNzVGhyb3VnaCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KS51bnJlZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcGFzc1Rocm91Z2ggYXMgUmVhZGFibGU7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFZvaWNlQ2hhbm5lbCwgU3RhZ2VDaGFubmVsLCBTbm93Zmxha2UgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IERpc2NvcmRHYXRld2F5QWRhcHRlckNyZWF0b3IsIGpvaW5Wb2ljZUNoYW5uZWwsIFZvaWNlQ29ubmVjdGlvbiwgZ2V0Vm9pY2VDb25uZWN0aW9uLCBWb2ljZUNvbm5lY3Rpb25TdGF0dXMsIEF1ZGlvUGxheWVyIH0gZnJvbSAnQGRpc2NvcmRqcy92b2ljZSc7XG5pbXBvcnQgeyBTdHJlYW1EaXNwYXRjaGVyIH0gZnJvbSAnLi9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHR5cGUgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmNsYXNzIFZvaWNlVXRpbHMge1xuICAgIHB1YmxpYyBjYWNoZTogQ29sbGVjdGlvbjxTbm93Zmxha2UsIFN0cmVhbURpc3BhdGNoZXI+O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIHV0aWxzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBjYWNoZSB3aGVyZSB2b2ljZSB1dGlscyBzdG9yZXMgc3RyZWFtIG1hbmFnZXJzXG4gICAgICAgICAqIEB0eXBlIHtDb2xsZWN0aW9uPFNub3dmbGFrZSwgU3RyZWFtRGlzcGF0Y2hlcj59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNhY2hlID0gbmV3IENvbGxlY3Rpb248U25vd2ZsYWtlLCBTdHJlYW1EaXNwYXRjaGVyPigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEpvaW5zIGEgdm9pY2UgY2hhbm5lbCwgY3JlYXRpbmcgYmFzaWMgc3RyZWFtIGRpc3BhdGNoIG1hbmFnZXJcbiAgICAgKiBAcGFyYW0ge1N0YWdlQ2hhbm5lbHxWb2ljZUNoYW5uZWx9IGNoYW5uZWwgVGhlIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIEpvaW4gb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+fVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBjb25uZWN0KFxuICAgICAgICBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwsXG4gICAgICAgIG9wdGlvbnM/OiB7XG4gICAgICAgICAgICBkZWFmPzogYm9vbGVhbjtcbiAgICAgICAgICAgIG1heFRpbWU/OiBudW1iZXI7XG4gICAgICAgICAgICBxdWV1ZTogR3VpbGRRdWV1ZTtcbiAgICAgICAgICAgIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXI7XG4gICAgICAgIH1cbiAgICApOiBQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+IHtcbiAgICAgICAgaWYgKCFvcHRpb25zPy5xdWV1ZSkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fR1VJTERfUVVFVUUoKTtcbiAgICAgICAgY29uc3QgY29ubiA9IGF3YWl0IHRoaXMuam9pbihjaGFubmVsLCBvcHRpb25zKTtcbiAgICAgICAgY29uc3Qgc3ViID0gbmV3IFN0cmVhbURpc3BhdGNoZXIoY29ubiwgY2hhbm5lbCwgb3B0aW9ucy5xdWV1ZSwgb3B0aW9ucy5tYXhUaW1lLCBvcHRpb25zLmF1ZGlvUGxheWVyKTtcbiAgICAgICAgdGhpcy5jYWNoZS5zZXQoY2hhbm5lbC5ndWlsZC5pZCwgc3ViKTtcbiAgICAgICAgcmV0dXJuIHN1YjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKb2lucyBhIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0ge1N0YWdlQ2hhbm5lbHxWb2ljZUNoYW5uZWx9IFtjaGFubmVsXSBUaGUgdm9pY2Uvc3RhZ2UgY2hhbm5lbCB0byBqb2luXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSBKb2luIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7Vm9pY2VDb25uZWN0aW9ufVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBqb2luKFxuICAgICAgICBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwsXG4gICAgICAgIG9wdGlvbnM/OiB7XG4gICAgICAgICAgICBkZWFmPzogYm9vbGVhbjtcbiAgICAgICAgICAgIG1heFRpbWU/OiBudW1iZXI7XG4gICAgICAgIH1cbiAgICApIHtcbiAgICAgICAgY29uc3QgY29ubiA9IGpvaW5Wb2ljZUNoYW5uZWwoe1xuICAgICAgICAgICAgZ3VpbGRJZDogY2hhbm5lbC5ndWlsZC5pZCxcbiAgICAgICAgICAgIGNoYW5uZWxJZDogY2hhbm5lbC5pZCxcbiAgICAgICAgICAgIGFkYXB0ZXJDcmVhdG9yOiBjaGFubmVsLmd1aWxkLnZvaWNlQWRhcHRlckNyZWF0b3IgYXMgdW5rbm93biBhcyBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yLFxuICAgICAgICAgICAgc2VsZkRlYWY6IEJvb2xlYW4ob3B0aW9ucz8uZGVhZiksXG4gICAgICAgICAgICBkZWJ1ZzogdGhpcy5wbGF5ZXIuZXZlbnRzLmV2ZW50TmFtZXMoKS5pbmNsdWRlcygnZGVidWcnKVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gY29ubjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNjb25uZWN0cyB2b2ljZSBjb25uZWN0aW9uXG4gICAgICogQHBhcmFtIHtWb2ljZUNvbm5lY3Rpb259IGNvbm5lY3Rpb24gVGhlIHZvaWNlIGNvbm5lY3Rpb25cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzY29ubmVjdChjb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb24gfCBTdHJlYW1EaXNwYXRjaGVyKSB7XG4gICAgICAgIGlmIChjb25uZWN0aW9uIGluc3RhbmNlb2YgU3RyZWFtRGlzcGF0Y2hlcikgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24udm9pY2VDb25uZWN0aW9uO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHJldHVybiBjb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvL1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBEaXNjb3JkIFBsYXllciB2b2ljZSBjb25uZWN0aW9uXG4gICAgICogQHBhcmFtIHtTbm93Zmxha2V9IGd1aWxkIFRoZSBndWlsZCBpZFxuICAgICAqIEByZXR1cm5zIHtTdHJlYW1EaXNwYXRjaGVyfVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb25uZWN0aW9uKGd1aWxkOiBTbm93Zmxha2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KGd1aWxkKSB8fCBnZXRWb2ljZUNvbm5lY3Rpb24oZ3VpbGQpO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgVm9pY2VVdGlscyB9O1xuIiwgImltcG9ydCB7XG4gICAgQXVkaW9QbGF5ZXIsXG4gICAgQXVkaW9QbGF5ZXJFcnJvcixcbiAgICBBdWRpb1BsYXllclN0YXR1cyxcbiAgICBBdWRpb1Jlc291cmNlLFxuICAgIGNyZWF0ZUF1ZGlvUGxheWVyLFxuICAgIGNyZWF0ZUF1ZGlvUmVzb3VyY2UsXG4gICAgZW50ZXJzU3RhdGUsXG4gICAgU3RyZWFtVHlwZSxcbiAgICBWb2ljZUNvbm5lY3Rpb24sXG4gICAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLFxuICAgIFZvaWNlQ29ubmVjdGlvbkRpc2Nvbm5lY3RSZWFzb24sXG4gICAgdmVyc2lvblxufSBmcm9tICdAZGlzY29yZGpzL3ZvaWNlJztcbmltcG9ydCB7IFN0YWdlQ2hhbm5lbCwgVm9pY2VDaGFubmVsIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBFcXVhbGl6ZXJCYW5kLCBCaXF1YWRGaWx0ZXJzLCBQQ01GaWx0ZXJzLCBGaWx0ZXJzQ2hhaW4gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIFBvc3RQcm9jZXNzZWRSZXN1bHQgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB7IFZvaWNlUmVjZWl2ZXJOb2RlIH0gZnJvbSAnLi4vbWFuYWdlci9Wb2ljZVJlY2VpdmVyTm9kZSc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuY29uc3QgbmVlZHNLZWVwQWxpdmVQYXRjaCA9ICgoKSA9PiB7XG4gICAgaWYgKCdEUF9OT19LRUVQQUxJVkVfUEFUQ0gnIGluIHByb2Nlc3MuZW52KSByZXR1cm4gZmFsc2U7XG4gICAgLy8gd2UgZG9udCBjYXJlIGFib3V0IGRldiB2ZXJzaW9uIGFuZCBzZW12ZXI6bWFqb3IgPj0gMVxuICAgIGlmICh2ZXJzaW9uLmluY2x1ZGVzKCctZGV2JykgfHwgdmVyc2lvbi5zdGFydHNXaXRoKCcxJykpIHJldHVybiBmYWxzZTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgY29uc3QgWywgbWlub3IsIHBhdGNoXSA9IHZlcnNpb24uc3BsaXQoJy4nKS5tYXAoKG4pID0+IHBhcnNlSW50KG4pKTtcblxuICAgIGlmIChpc05hTihtaW5vcikpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIHdlIG5lZWQgYSBwYXRjaCBpZiBzZW12ZXI6bWlub3IgaXMgPCAxNSBhbmQgc2VtdmVyOnBhdGNoIDwgMVxuICAgIHJldHVybiBtaW5vciA+IDE0ID8gZmFsc2UgOiBtaW5vciA8IDE1ICYmIHBhdGNoIDwgMTtcbn0pKCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlU3RyZWFtT3BzIHtcbiAgICB0eXBlPzogU3RyZWFtVHlwZTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGRhdGE/OiBhbnk7XG4gICAgZGlzYWJsZVZvbHVtZT86IGJvb2xlYW47XG4gICAgZGlzYWJsZUVxdWFsaXplcj86IGJvb2xlYW47XG4gICAgZGlzYWJsZUJpcXVhZD86IGJvb2xlYW47XG4gICAgZXE/OiBFcXVhbGl6ZXJCYW5kW107XG4gICAgYmlxdWFkRmlsdGVyPzogQmlxdWFkRmlsdGVycztcbiAgICBkaXNhYmxlRmlsdGVycz86IGJvb2xlYW47XG4gICAgZGVmYXVsdEZpbHRlcnM/OiBQQ01GaWx0ZXJzW107XG4gICAgdm9sdW1lPzogbnVtYmVyO1xuICAgIGRpc2FibGVSZXNhbXBsZXI/OiBib29sZWFuO1xuICAgIHNhbXBsZVJhdGU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9pY2VFdmVudHMge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbiAgICBlcnJvcjogKGVycm9yOiBBdWRpb1BsYXllckVycm9yKSA9PiBhbnk7XG4gICAgZGVidWc6IChtZXNzYWdlOiBzdHJpbmcpID0+IGFueTtcbiAgICBzdGFydDogKHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPikgPT4gYW55O1xuICAgIGZpbmlzaDogKHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPikgPT4gYW55O1xuICAgIGRzcDogKGZpbHRlcnM6IFBDTUZpbHRlcnNbXSkgPT4gYW55O1xuICAgIGVxQmFuZHM6IChmaWx0ZXJzOiBFcXVhbGl6ZXJCYW5kW10pID0+IGFueTtcbiAgICBzYW1wbGVSYXRlOiAoZmlsdGVyczogbnVtYmVyKSA9PiBhbnk7XG4gICAgYmlxdWFkOiAoZmlsdGVyczogQmlxdWFkRmlsdGVycykgPT4gYW55O1xuICAgIHZvbHVtZTogKHZvbHVtZTogbnVtYmVyKSA9PiBhbnk7XG4gICAgLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG59XG5cbmNsYXNzIFN0cmVhbURpc3BhdGNoZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXI8Vm9pY2VFdmVudHM+IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdm9pY2VDb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb247XG4gICAgcHVibGljIHJlYWRvbmx5IGF1ZGlvUGxheWVyOiBBdWRpb1BsYXllcjtcbiAgICBwdWJsaWMgcmVjZWl2ZXIgPSBuZXcgVm9pY2VSZWNlaXZlck5vZGUodGhpcyk7XG4gICAgcHVibGljIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbDtcbiAgICBwdWJsaWMgYXVkaW9SZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+IHwgbnVsbDtcbiAgICBwcml2YXRlIHJlYWR5TG9jayA9IGZhbHNlO1xuICAgIHB1YmxpYyBkc3AgPSBuZXcgRmlsdGVyc0NoYWluKCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG5ldyBjb25uZWN0aW9uIG9iamVjdFxuICAgICAqIEBwYXJhbSB7Vm9pY2VDb25uZWN0aW9ufSBjb25uZWN0aW9uIFRoZSBjb25uZWN0aW9uXG4gICAgICogQHBhcmFtIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfSBjaGFubmVsIFRoZSBjb25uZWN0ZWQgY2hhbm5lbFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uLCBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwsIHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZSwgcHVibGljIHJlYWRvbmx5IGNvbm5lY3Rpb25UaW1lb3V0OiBudW1iZXIgPSAyMDAwMCwgYXVkaW9QbGF5ZXI/OiBBdWRpb1BsYXllcikge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvblxuICAgICAgICAgKiBAdHlwZSB7Vm9pY2VDb25uZWN0aW9ufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYXVkaW8gcGxheWVyXG4gICAgICAgICAqIEB0eXBlIHtBdWRpb1BsYXllcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIgPVxuICAgICAgICAgICAgYXVkaW9QbGF5ZXIgfHxcbiAgICAgICAgICAgIGNyZWF0ZUF1ZGlvUGxheWVyKHtcbiAgICAgICAgICAgICAgICBkZWJ1ZzogdGhpcy5xdWV1ZS5wbGF5ZXIuZXZlbnRzLmV2ZW50TmFtZXMoKS5pbmNsdWRlcygnZGVidWcnKVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB2b2ljZSBjaGFubmVsXG4gICAgICAgICAqIEB0eXBlIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDtcblxuICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5vbignZGVidWcnLCAobSkgPT4gdm9pZCB0aGlzLmVtaXQoJ2RlYnVnJywgbSkpO1xuICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5vbignZXJyb3InLCAoZXJyb3IpID0+IHZvaWQgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yIGFzIEF1ZGlvUGxheWVyRXJyb3IpKTtcbiAgICAgICAgdGhpcy5hdWRpb1BsYXllci5vbignZGVidWcnLCAobSkgPT4gdm9pZCB0aGlzLmVtaXQoJ2RlYnVnJywgbSkpO1xuICAgICAgICB0aGlzLmF1ZGlvUGxheWVyLm9uKCdlcnJvcicsIChlcnJvcikgPT4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpKTtcblxuICAgICAgICB0aGlzLmRzcC5vblVwZGF0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kc3ApIHJldHVybjtcbiAgICAgICAgICAgIGlmICh0aGlzLmRzcC5maWx0ZXJzPy5maWx0ZXJzKSB0aGlzLmVtaXQoJ2RzcCcsIHRoaXMuZHNwLmZpbHRlcnM/LmZpbHRlcnMpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZHNwLmJpcXVhZD8uZmlsdGVyKSB0aGlzLmVtaXQoJ2JpcXVhZCcsIHRoaXMuZHNwLmJpcXVhZD8uZmlsdGVyKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRzcC5lcXVhbGl6ZXIpIHRoaXMuZW1pdCgnZXFCYW5kcycsIHRoaXMuZHNwLmVxdWFsaXplci5nZXRFUSgpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRzcC52b2x1bWUpIHRoaXMuZW1pdCgndm9sdW1lJywgdGhpcy5kc3Audm9sdW1lLnZvbHVtZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5kc3AucmVzYW1wbGVyKSB0aGlzLmVtaXQoJ3NhbXBsZVJhdGUnLCB0aGlzLmRzcC5yZXNhbXBsZXIudGFyZ2V0U2FtcGxlUmF0ZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5kc3Aub25FcnJvciA9IChlKSA9PiB0aGlzLmVtaXQoJ2Vycm9yJywgZSBhcyBBdWRpb1BsYXllckVycm9yKTtcblxuICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5vbignc3RhdGVDaGFuZ2UnLCBhc3luYyAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICAgICAgICBpZiAobmVlZHNLZWVwQWxpdmVQYXRjaCkge1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoYERldGVjdGVkIEBkaXNjb3JkanMvdm9pY2UgdmVyc2lvbiAke3ZlcnNpb259IHdoaWNoIG5lZWRzIGtlZXBBbGl2ZSBwYXRjaCwgYXBwbHlpbmcgcGF0Y2guLi5gKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvbGROZXR3b3JraW5nID0gUmVmbGVjdC5nZXQob2xkU3RhdGUsICduZXR3b3JraW5nJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3TmV0d29ya2luZyA9IFJlZmxlY3QuZ2V0KG5ld1N0YXRlLCAnbmV0d29ya2luZycpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbmV0d29ya1N0YXRlQ2hhbmdlSGFuZGxlciA9IChfOiBvYmplY3QsIG5ld05ldHdvcmtTdGF0ZTogb2JqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1VkcCA9IFJlZmxlY3QuZ2V0KG5ld05ldHdvcmtTdGF0ZSwgJ3VkcCcpO1xuICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKG5ld1VkcD8ua2VlcEFsaXZlSW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBvbGROZXR3b3JraW5nPy5vZmYoJ3N0YXRlQ2hhbmdlJywgbmV0d29ya1N0YXRlQ2hhbmdlSGFuZGxlcik7XG4gICAgICAgICAgICAgICAgbmV3TmV0d29ya2luZz8ub24oJ3N0YXRlQ2hhbmdlJywgbmV0d29ya1N0YXRlQ2hhbmdlSGFuZGxlcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChuZXdTdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EaXNjb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUucmVhc29uID09PSBWb2ljZUNvbm5lY3Rpb25EaXNjb25uZWN0UmVhc29uLldlYlNvY2tldENsb3NlICYmIG5ld1N0YXRlLmNsb3NlQ29kZSA9PT0gNDAxNCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZW50ZXJzU3RhdGUodGhpcy52b2ljZUNvbm5lY3Rpb24sIFZvaWNlQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nLCB0aGlzLmNvbm5lY3Rpb25UaW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHRoaXMudm9pY2VDb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbkF0dGVtcHRzIDwgNSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBVdGlsLndhaXQoKHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbkF0dGVtcHRzICsgMSkgKiA1MDAwKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ucmVqb2luKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHRoaXMudm9pY2VDb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdTdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5yZWFkeUxvY2sgJiYgKG5ld1N0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcgfHwgbmV3U3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuU2lnbmFsbGluZykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWR5TG9jayA9IHRydWU7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZW50ZXJzU3RhdGUodGhpcy52b2ljZUNvbm5lY3Rpb24sIFZvaWNlQ29ubmVjdGlvblN0YXR1cy5SZWFkeSwgdGhpcy5jb25uZWN0aW9uVGltZW91dCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24uZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVyciBhcyBBdWRpb1BsYXllckVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVhZHlMb2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmF1ZGlvUGxheWVyLm9uKCdzdGF0ZUNoYW5nZScsIChvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICAgICAgICAgIGlmIChvbGRTdGF0ZS5zdGF0dXMgIT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZCAmJiBuZXdTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUucGxheWVyLmV2ZW50cy5lbWl0KCdwbGF5ZXJQYXVzZScsIHRoaXMucXVldWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob2xkU3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQgJiYgbmV3U3RhdGUuc3RhdHVzICE9PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLnBsYXllci5ldmVudHMuZW1pdCgncGxheWVyUmVzdW1lJywgdGhpcy5xdWV1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChuZXdTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBsYXlpbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAob2xkU3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlIHx8IG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQnVmZmVyaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ3N0YXJ0JywgdGhpcy5hdWRpb1Jlc291cmNlISk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGUgJiYgb2xkU3RhdGUuc3RhdHVzICE9PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdmaW5pc2gnLCB0aGlzLmF1ZGlvUmVzb3VyY2UhKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hdWRpb1Jlc291cmNlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24uc3Vic2NyaWJlKHRoaXMuYXVkaW9QbGF5ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBwbGF5ZXIgaGFzIGJlZW4gcGF1c2VkIG1hbnVhbGx5XG4gICAgICovXG4gICAgZ2V0IHBhdXNlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQ7XG4gICAgfVxuXG4gICAgc2V0IHBhdXNlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgdmFsID8gdGhpcy5wYXVzZSh0cnVlKSA6IHRoaXMucmVzdW1lKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGF1c2VkIGF1dG9tYXRpY2FsbHkgb3IgbWFudWFsbHkuXG4gICAgICovXG4gICAgaXNQYXVzZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhdXNlZCB8fCB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQXV0b1BhdXNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBidWZmZXJpbmdcbiAgICAgKi9cbiAgICBpc0J1ZmZlcmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5CdWZmZXJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGxheWluZ1xuICAgICAqL1xuICAgIGlzUGxheWluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QbGF5aW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGlkbGVcbiAgICAgKi9cbiAgICBpc0lkbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBoYXMgYmVlbiBkZXN0cm95ZWRcbiAgICAgKi9cbiAgICBpc0Rlc3Ryb3llZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBoYXMgYmVlbiBkZXN0cm95ZWRcbiAgICAgKi9cbiAgICBpc0Rpc2Nvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRpc2Nvbm5lY3RlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBpcyByZWFkeSB0byBwbGF5XG4gICAgICovXG4gICAgaXNSZWFkeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLlJlYWR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGlzIHNpZ25hbGxpbmdcbiAgICAgKi9cbiAgICBpc1NpZ25hbGxpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5TaWduYWxsaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGlzIGNvbm5lY3RpbmdcbiAgICAgKi9cbiAgICBpc0Nvbm5lY3RpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgc3RyZWFtXG4gICAgICogQHBhcmFtIHtSZWFkYWJsZX0gc3JjIFRoZSBzdHJlYW0gc291cmNlXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHNdIE9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7QXVkaW9SZXNvdXJjZX1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVTdHJlYW0oc3JjOiBSZWFkYWJsZSwgb3BzPzogQ3JlYXRlU3RyZWFtT3BzKSB7XG4gICAgICAgIGlmICghb3BzPy5kaXNhYmxlRmlsdGVycykgdGhpcy5xdWV1ZS5kZWJ1ZygnSW5pdGlhdGluZyBEU1AgZmlsdGVycyBwaXBlbGluZS4uLicpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSAhb3BzPy5kaXNhYmxlRmlsdGVyc1xuICAgICAgICAgICAgPyB0aGlzLmRzcC5jcmVhdGUoc3JjLCB7XG4gICAgICAgICAgICAgICAgICBkc3A6IHtcbiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiBvcHM/LmRlZmF1bHRGaWx0ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVGaWx0ZXJzXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgYmlxdWFkOiBvcHM/LmJpcXVhZEZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcjogb3BzLmJpcXVhZEZpbHRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlQmlxdWFkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICByZXNhbXBsZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRTYW1wbGVSYXRlOiBvcHM/LnNhbXBsZVJhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZVJlc2FtcGxlclxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGVxdWFsaXplcjoge1xuICAgICAgICAgICAgICAgICAgICAgIGJhbmRNdWx0aXBsaWVyOiBvcHM/LmVxLFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVFcXVhbGl6ZXJcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB2b2x1bWU6IHtcbiAgICAgICAgICAgICAgICAgICAgICB2b2x1bWU6IG9wcz8udm9sdW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVWb2x1bWVcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogc3JjO1xuXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoJ0V4ZWN1dGluZyBvbkFmdGVyQ3JlYXRlU3RyZWFtIGhvb2suLi4nKTtcbiAgICAgICAgY29uc3QgcG9zdFN0cmVhbSA9IGF3YWl0IHRoaXMucXVldWUub25BZnRlckNyZWF0ZVN0cmVhbT8uKHN0cmVhbSwgdGhpcy5xdWV1ZSkuY2F0Y2goXG4gICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbTogc3RyZWFtLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBvcHM/LnR5cGUgPz8gU3RyZWFtVHlwZS5BcmJpdHJhcnlcbiAgICAgICAgICAgICAgICB9IGFzIFBvc3RQcm9jZXNzZWRSZXN1bHQpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnUHJlcGFyaW5nIEF1ZGlvUmVzb3VyY2UuLi4nKTtcbiAgICAgICAgdGhpcy5hdWRpb1Jlc291cmNlID0gY3JlYXRlQXVkaW9SZXNvdXJjZShwb3N0U3RyZWFtPy5zdHJlYW0gPz8gc3RyZWFtLCB7XG4gICAgICAgICAgICBpbnB1dFR5cGU6IHBvc3RTdHJlYW0/LnR5cGUgPz8gb3BzPy50eXBlID8/IFN0cmVhbVR5cGUuQXJiaXRyYXJ5LFxuICAgICAgICAgICAgbWV0YWRhdGE6IG9wcz8uZGF0YSxcbiAgICAgICAgICAgIC8vIHZvbHVtZSBjb250cm9scyBoYXBwZW4gZnJvbSBBdWRpb0ZpbHRlciBEU1AgdXRpbGl0eVxuICAgICAgICAgICAgaW5saW5lVm9sdW1lOiBmYWxzZVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hdWRpb1Jlc291cmNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVzYW1wbGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kc3A/LnJlc2FtcGxlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpbHRlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRzcD8uZmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGJpcXVhZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHNwPy5iaXF1YWQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVxdWFsaXplcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHNwPy5lcXVhbGl6ZXIgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWVyIHN0YXR1c1xuICAgICAqIEB0eXBlIHtBdWRpb1BsYXllclN0YXR1c31cbiAgICAgKi9cbiAgICBnZXQgc3RhdHVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzY29ubmVjdHMgZnJvbSB2b2ljZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3QoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hdWRpb1BsYXllcikgdGhpcy5hdWRpb1BsYXllci5zdG9wKHRydWUpO1xuICAgICAgICAgICAgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCkgdGhpcy52b2ljZUNvbm5lY3Rpb24uZGVzdHJveSgpO1xuICAgICAgICB9IGNhdGNoIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdG9wcyB0aGUgcGxheWVyXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZW5kKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5hdWRpb1BsYXllci5zdG9wKCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhdXNlcyB0aGUgc3RyZWFtIHBsYXliYWNrXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaW50ZXJwb2xhdGVTaWxlbmNlPWZhbHNlXSBJZiB0cnVlLCB0aGUgcGxheWVyIHdpbGwgcGxheSA1IHBhY2tldHMgb2Ygc2lsZW5jZSBhZnRlciBwYXVzaW5nIHRvIHByZXZlbnQgYXVkaW8gZ2xpdGNoZXMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgcGF1c2UoaW50ZXJwb2xhdGVTaWxlbmNlPzogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5hdWRpb1BsYXllci5wYXVzZShpbnRlcnBvbGF0ZVNpbGVuY2UpO1xuICAgICAgICByZXR1cm4gc3VjY2VzcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN1bWVzIHRoZSBzdHJlYW0gcGxheWJhY2tcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICByZXN1bWUoKSB7XG4gICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmF1ZGlvUGxheWVyLnVucGF1c2UoKTtcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSBzdHJlYW1cbiAgICAgKiBAcGFyYW0ge0F1ZGlvUmVzb3VyY2U8VHJhY2s+fSBbcmVzb3VyY2U9dGhpcy5hdWRpb1Jlc291cmNlXSBUaGUgYXVkaW8gcmVzb3VyY2UgdG8gcGxheVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+fVxuICAgICAqL1xuICAgIGFzeW5jIHBsYXlTdHJlYW0ocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+ID0gdGhpcy5hdWRpb1Jlc291cmNlISkge1xuICAgICAgICBpZiAoIXJlc291cmNlKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19BVURJT19SRVNPVVJDRSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvdXJjZS5lbmRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5lbWl0KCdmaW5pc2gnLCByZXNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmF1ZGlvUmVzb3VyY2UpIHRoaXMuYXVkaW9SZXNvdXJjZSA9IHJlc291cmNlO1xuICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuUmVhZHkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZW50ZXJzU3RhdGUodGhpcy52b2ljZUNvbm5lY3Rpb24sIFZvaWNlQ29ubmVjdGlvblN0YXR1cy5SZWFkeSwgdGhpcy5jb25uZWN0aW9uVGltZW91dCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIucGxheShyZXNvdXJjZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBwbGF5YmFjayB2b2x1bWVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIHZvbHVtZSBhbW91bnRcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzZXRWb2x1bWUodmFsdWU6IG51bWJlcikge1xuICAgICAgICBpZiAoIXRoaXMuZHNwLnZvbHVtZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5kc3Audm9sdW1lLnNldFZvbHVtZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdm9sdW1lXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgdm9sdW1lKCkge1xuICAgICAgICBpZiAoIXRoaXMuZHNwLnZvbHVtZSkgcmV0dXJuIDEwMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHNwLnZvbHVtZS52b2x1bWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXliYWNrIHRpbWVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBzdHJlYW1UaW1lKCkge1xuICAgICAgICBpZiAoIXRoaXMuYXVkaW9SZXNvdXJjZSkgcmV0dXJuIDA7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUmVzb3VyY2UucGxheWJhY2tEdXJhdGlvbjtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgYXMgU3RyZWFtRGlzcGF0Y2hlciB9O1xuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBTZWFyY2hSZXN1bHQgfSBmcm9tICcuLi9mYWJyaWMvU2VhcmNoUmVzdWx0JztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhY2hlT3B0aW9ucyB7XG4gICAgY2hlY2tJbnRlcnZhbD86IG51bWJlcjtcbn1cblxuLy8gNWhcbmNvbnN0IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQgPSAxOF8wMDBfMDAwO1xuXG5leHBvcnQgY2xhc3MgUXVlcnlDYWNoZSB7XG4gICAgI2RlZmF1bHRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZTxUcmFjaz4+KCk7XG4gICAgcHVibGljIHRpbWVyOiBOb2RlSlMuVGltZXI7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcGxheWVyOiBQbGF5ZXIsXG4gICAgICAgIHB1YmxpYyBvcHRpb25zOiBRdWVyeUNhY2hlT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGNoZWNrSW50ZXJ2YWw6IERFRkFVTFRfRVhQSVJZX1RJTUVPVVRcbiAgICAgICAgfVxuICAgICkge1xuICAgICAgICB0aGlzLnRpbWVyID0gc2V0SW50ZXJ2YWwodGhpcy5jbGVhbnVwLmJpbmQodGhpcyksIHRoaXMuY2hlY2tJbnRlcnZhbCkudW5yZWYoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNoZWNrSW50ZXJ2YWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuY2hlY2tJbnRlcnZhbCA/PyBERUZBVUxUX0VYUElSWV9USU1FT1VUO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjbGVhbnVwKCkge1xuICAgICAgICBmb3IgKGNvbnN0IFtpZCwgdmFsdWVdIG9mIHRoaXMuI2RlZmF1bHRDYWNoZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlLmhhc0V4cGlyZWQoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2RlZmF1bHRDYWNoZS5kZWxldGUoaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNsZWFyKCkge1xuICAgICAgICB0aGlzLiNkZWZhdWx0Q2FjaGUuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0RGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLiNkZWZhdWx0Q2FjaGUudmFsdWVzKCldO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBhZGREYXRhKGRhdGE6IFNlYXJjaFJlc3VsdCkge1xuICAgICAgICBkYXRhLnRyYWNrcy5mb3JFYWNoKChkKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy4jZGVmYXVsdENhY2hlLmhhcyhkLnVybCkpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuI2RlZmF1bHRDYWNoZS5zZXQoZC51cmwsIG5ldyBEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZShkKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXNvbHZlKGNvbnRleHQ6IFF1ZXJ5Q2FjaGVSZXNvbHZlckNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy4jZGVmYXVsdENhY2hlLmdldChjb250ZXh0LnF1ZXJ5KTtcbiAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLnBsYXllciwge1xuICAgICAgICAgICAgICAgIHF1ZXJ5OiBjb250ZXh0LnF1ZXJ5LFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBjb250ZXh0LnJlcXVlc3RlZEJ5LFxuICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZTogY29udGV4dC5xdWVyeVR5cGVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMucGxheWVyLCB7XG4gICAgICAgICAgICBxdWVyeTogY29udGV4dC5xdWVyeSxcbiAgICAgICAgICAgIHRyYWNrczogW3Jlc3VsdC5kYXRhXSxcbiAgICAgICAgICAgIHBsYXlsaXN0OiBudWxsLFxuICAgICAgICAgICAgcXVlcnlUeXBlOiBjb250ZXh0LnF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBjb250ZXh0LnJlcXVlc3RlZEJ5XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlPFQgPSB1bmtub3duPiB7XG4gICAgcHVibGljIGV4cGlyZUFmdGVyID0gREVGQVVMVF9FWFBJUllfVElNRU9VVDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGRhdGE6IFQsIGV4cGlyZUFmdGVyOiBudW1iZXIgPSBERUZBVUxUX0VYUElSWV9USU1FT1VUKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZXhwaXJlQWZ0ZXIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLmV4cGlyZUFmdGVyID0gRGF0ZS5ub3coKSArIGV4cGlyZUFmdGVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGhhc0V4cGlyZWQoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5leHBpcmVBZnRlciAhPT0gJ251bWJlcicgfHwgaXNOYU4odGhpcy5leHBpcmVBZnRlcikgfHwgdGhpcy5leHBpcmVBZnRlciA8IDEpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIERhdGUubm93KCkgPD0gdGhpcy5leHBpcmVBZnRlcjtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlDYWNoZVJlc29sdmVyQ29udGV4dCB7XG4gICAgcXVlcnk6IHN0cmluZztcbiAgICByZXF1ZXN0ZWRCeT86IFVzZXI7XG4gICAgcXVlcnlUeXBlPzogU2VhcmNoUXVlcnlUeXBlIHwgYGV4dDoke3N0cmluZ31gO1xufVxuIiwgImltcG9ydCB7IENsaWVudCwgU25vd2ZsYWtlVXRpbCwgVm9pY2VTdGF0ZSwgSW50ZW50c0JpdEZpZWxkLCBVc2VyLCBDaGFubmVsVHlwZSwgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLCB2ZXJzaW9uIGFzIGRqc1ZlcnNpb24gfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXlsaXN0LCBUcmFjaywgU2VhcmNoUmVzdWx0IH0gZnJvbSAnLi9mYWJyaWMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZUV2ZW50cywgVm9pY2VDb25uZWN0Q29uZmlnLCBHdWlsZE5vZGVDcmVhdGVPcHRpb25zLCBHdWlsZE5vZGVNYW5hZ2VyLCBHdWlsZFF1ZXVlLCBSZXNvdXJjZVBsYXlPcHRpb25zIH0gZnJvbSAnLi9tYW5hZ2VyJztcbmltcG9ydCB7IFZvaWNlVXRpbHMgfSBmcm9tICcuL1ZvaWNlSW50ZXJmYWNlL1ZvaWNlVXRpbHMnO1xuaW1wb3J0IHsgUGxheWVyRXZlbnRzLCBRdWVyeVR5cGUsIFNlYXJjaE9wdGlvbnMsIFBsYXllckluaXRPcHRpb25zLCBQbGF5bGlzdEluaXREYXRhLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IFF1ZXJ5UmVzb2x2ZXIgfSBmcm9tICcuL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBnZW5lcmF0ZURlcGVuZGVuY3lSZXBvcnQsIHZlcnNpb24gYXMgZFZvaWNlVmVyc2lvbiB9IGZyb20gJ0BkaXNjb3JkanMvdm9pY2UnO1xuaW1wb3J0IHsgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gJy4vZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0JztcbmltcG9ydCB7IEJhc2VFeHRyYWN0b3IgfSBmcm9tICcuL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgKiBhcyBfaW50ZXJuYWxzIGZyb20gJy4vdXRpbHMvX19pbnRlcm5hbF9fJztcbmltcG9ydCB7IFF1ZXJ5Q2FjaGUgfSBmcm9tICcuL3V0aWxzL1F1ZXJ5Q2FjaGUnO1xuaW1wb3J0IHsgUGxheWVyRXZlbnRzRW1pdHRlciB9IGZyb20gJy4vdXRpbHMvUGxheWVyRXZlbnRzRW1pdHRlcic7XG5pbXBvcnQgeyBGRm1wZWcgfSBmcm9tICcuL3V0aWxzL0ZGbXBlZyc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi9lcnJvcnMnO1xuXG5jb25zdCBrU2luZ2xldG9uID0gU3ltYm9sKCdJbnN0YW5jZURpc2NvcmRQbGF5ZXJTaW5nbGV0b24nKTtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQ8VCA9IHVua25vd24+IHtcbiAgICB0cmFjazogVHJhY2s7XG4gICAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbDtcbiAgICBzZWFyY2hSZXN1bHQ6IFNlYXJjaFJlc3VsdDtcbiAgICBxdWV1ZTogR3VpbGRRdWV1ZTxUPjtcbn1cblxuZXhwb3J0IHR5cGUgVHJhY2tMaWtlID0gc3RyaW5nIHwgVHJhY2sgfCBTZWFyY2hSZXN1bHQgfCBUcmFja1tdIHwgUGxheWxpc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPiBleHRlbmRzIFNlYXJjaE9wdGlvbnMge1xuICAgIG5vZGVPcHRpb25zPzogR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUPjtcbiAgICBjb25uZWN0aW9uT3B0aW9ucz86IFZvaWNlQ29ubmVjdENvbmZpZztcbiAgICBhdWRpb1BsYXllck9wdGlvbnM/OiBSZXNvdXJjZVBsYXlPcHRpb25zO1xuICAgIGFmdGVyU2VhcmNoPzogKHJlc3VsdDogU2VhcmNoUmVzdWx0KSA9PiBQcm9taXNlPFNlYXJjaFJlc3VsdD47XG59XG5cbmV4cG9ydCBjbGFzcyBQbGF5ZXIgZXh0ZW5kcyBQbGF5ZXJFdmVudHNFbWl0dGVyPFBsYXllckV2ZW50cz4ge1xuICAgICNsYXN0TGF0ZW5jeSA9IC0xO1xuICAgICN2b2ljZVN0YXRlVXBkYXRlTGlzdGVuZXIgPSB0aGlzLmhhbmRsZVZvaWNlU3RhdGUuYmluZCh0aGlzKTtcbiAgICAjbGFnTW9uaXRvclRpbWVvdXQhOiBOb2RlSlMuVGltZW91dDtcbiAgICAjbGFnTW9uaXRvckludGVydmFsITogTm9kZUpTLlRpbWVyO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nID0gJzYuNS4wJztcbiAgICBwdWJsaWMgc3RhdGljIF9zaW5nbGV0b25LZXkgPSBrU2luZ2xldG9uO1xuICAgIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICAgIHB1YmxpYyByZWFkb25seSBjbGllbnQhOiBDbGllbnQ7XG4gICAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnMhOiBQbGF5ZXJJbml0T3B0aW9ucztcbiAgICBwdWJsaWMgbm9kZXMgPSBuZXcgR3VpbGROb2RlTWFuYWdlcih0aGlzKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdm9pY2VVdGlscyA9IG5ldyBWb2ljZVV0aWxzKHRoaXMpO1xuICAgIHB1YmxpYyBleHRyYWN0b3JzID0gbmV3IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQodGhpcyk7XG4gICAgcHVibGljIGV2ZW50cyA9IG5ldyBQbGF5ZXJFdmVudHNFbWl0dGVyPEd1aWxkUXVldWVFdmVudHM+KFsnZXJyb3InLCAncGxheWVyRXJyb3InXSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG5ldyBEaXNjb3JkIFBsYXllclxuICAgICAqIEBwYXJhbSB7Q2xpZW50fSBjbGllbnQgVGhlIERpc2NvcmQgQ2xpZW50XG4gICAgICogQHBhcmFtIHtQbGF5ZXJJbml0T3B0aW9uc30gW29wdGlvbnNdIFRoZSBwbGF5ZXIgaW5pdCBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50LCBvcHRpb25zOiBQbGF5ZXJJbml0T3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVJbnN0YW5jZSAmJiBrU2luZ2xldG9uIGluIFBsYXllcikgcmV0dXJuICg8YW55PlBsYXllcilba1NpbmdsZXRvbl0gYXMgUGxheWVyO1xuXG4gICAgICAgIHN1cGVyKFsnZXJyb3InXSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkaXNjb3JkLmpzIGNsaWVudFxuICAgICAgICAgKiBAdHlwZSB7Q2xpZW50fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG5cbiAgICAgICAgY29uc3QgaWJmID0gdGhpcy5jbGllbnQub3B0aW9ucy5pbnRlbnRzIGluc3RhbmNlb2YgSW50ZW50c0JpdEZpZWxkID8gdGhpcy5jbGllbnQub3B0aW9ucy5pbnRlbnRzIDogbmV3IEludGVudHNCaXRGaWVsZCh0aGlzLmNsaWVudC5vcHRpb25zLmludGVudHMpO1xuXG4gICAgICAgIGlmICghaWJmLmhhcyhJbnRlbnRzQml0RmllbGQuRmxhZ3MuR3VpbGRWb2ljZVN0YXRlcykpIHtcbiAgICAgICAgICAgIFV0aWwud2FybignY2xpZW50IGlzIG1pc3NpbmcgXCJHdWlsZFZvaWNlU3RhdGVzXCIgaW50ZW50JywgJ0ludmFsaWRJbnRlbnRzQml0RmllbGQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGxvY2tWb2ljZVN0YXRlSGFuZGxlcjogZmFsc2UsXG4gICAgICAgICAgICBibG9ja0V4dHJhY3RvcnM6IFtdLFxuICAgICAgICAgICAgYmxvY2tTdHJlYW1Gcm9tOiBbXSxcbiAgICAgICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0OiAyMDAwMCxcbiAgICAgICAgICAgIHNtb290aFZvbHVtZTogdHJ1ZSxcbiAgICAgICAgICAgIGxhZ01vbml0b3I6IDMwMDAwLFxuICAgICAgICAgICAgcXVlcnlDYWNoZTogb3B0aW9ucy5xdWVyeUNhY2hlID09PSBudWxsID8gbnVsbCA6IG9wdGlvbnMucXVlcnlDYWNoZSB8fCBuZXcgUXVlcnlDYWNoZSh0aGlzKSxcbiAgICAgICAgICAgIHVzZUxlZ2FjeUZGbXBlZzogZmFsc2UsXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgeXRkbE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBoaWdoV2F0ZXJNYXJrOiAxIDw8IDI1LFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMueXRkbE9wdGlvbnNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBQbGF5ZXJJbml0T3B0aW9ucztcblxuICAgICAgICB0aGlzLmNsaWVudC5vbigndm9pY2VTdGF0ZVVwZGF0ZScsIHRoaXMuI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lcik7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMubGFnTW9uaXRvciA9PT0gJ251bWJlcicgJiYgdGhpcy5vcHRpb25zLmxhZ01vbml0b3IgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLiNsYWdNb25pdG9yVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNsYXN0TGF0ZW5jeSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoYFtMYWcgTW9uaXRvcl0gRXZlbnQgbG9vcCBsYXRlbmN5OiAke3RoaXMuI2xhc3RMYXRlbmN5fW1zYCk7XG4gICAgICAgICAgICAgICAgfSwgMCkudW5yZWYoKTtcbiAgICAgICAgICAgIH0sIHRoaXMub3B0aW9ucy5sYWdNb25pdG9yKS51bnJlZigpO1xuICAgICAgICB9XG5cbiAgICAgICAgX2ludGVybmFscy5hZGRQbGF5ZXIodGhpcyk7XG5cbiAgICAgICAgaWYgKCEoa1NpbmdsZXRvbiBpbiBQbGF5ZXIpKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUGxheWVyLCBrU2luZ2xldG9uLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBkZWJ1ZyhtOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnZGVidWcnLCBtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGRpc2NvcmQtcGxheWVyIHNpbmdsZXRvbiBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gY2xpZW50IFRoZSBjbGllbnQgdGhhdCBpbnN0YW50aWF0ZWQgcGxheWVyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgUGxheWVyIGluaXRpYWxpemVyIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHNpbmdsZXRvbihjbGllbnQ6IENsaWVudCwgb3B0aW9uczogUGxheWVySW5pdE9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gbmV3IFBsYXllcihjbGllbnQsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBpZ25vcmVJbnN0YW5jZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBhY3RpdmUgbWFzdGVyIHBsYXllciBpbnN0YW5jZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFsbFBsYXllcnMoKSB7XG4gICAgICAgIHJldHVybiBfaW50ZXJuYWxzLmdldFBsYXllcnMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciBhbGwgbWFzdGVyIHBsYXllciBpbnN0YW5jZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyQWxsUGxheWVycygpIHtcbiAgICAgICAgcmV0dXJuIF9pbnRlcm5hbHMuaW5zdGFuY2VzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgcXVlcnkgY2FjaGUgcHJvdmlkZXIgaW4gdXNlXG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWVyeUNhY2hlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnF1ZXJ5Q2FjaGUgPz8gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyB0byBgUGxheWVyLm5vZGVzYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHF1ZXVlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXZlbnQgbG9vcCBsYXRlbmN5IGluIG1zLiBJZiB5b3VyIGJvdCBpcyBsYWdneSBhbmQgdGhpcyByZXR1cm5zIGEgbnVtYmVyIGFib3ZlIDIwbXMgZm9yIGV4YW1wbGUsXG4gICAgICogc29tZSBleHBlbnNpdmUgdGFzayBpcyBiZWluZyBleGVjdXRlZCBvbiB0aGUgY3VycmVudCB0aHJlYWQgd2hpY2ggaXMgc2xvd2luZyBkb3duIHRoZSBldmVudCBsb29wLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgcHVibGljIGdldCBldmVudExvb3BMYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNsYXN0TGF0ZW5jeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgc3RhdGlzdGljcyB0aGF0IGNvdWxkIGJlIHVzZWZ1bC4gU3RhdGlzdGljcyBnZW5lcmF0b3IgaXMgc3RpbGwgZXhwZXJpbWVudGFsLlxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBzdGF0cyA9IHBsYXllci5nZW5lcmF0ZVN0YXRpc3RpY3MoKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHN0YXRzKTtcbiAgICAgKlxuICAgICAqIC8vIG91dHB1dHMgc29tZXRoaW5nIGxpa2VcbiAgICAgKiAvLyB7XG4gICAgICogLy8gICBpbnN0YW5jZXM6IG51bWJlcixcbiAgICAgKiAvLyAgIHF1ZXVlc0NvdW50OiBudW1iZXIsXG4gICAgICogLy8gICBxdWVyeUNhY2hlRW5hYmxlZDogYm9vbGVhbixcbiAgICAgKiAvLyAgIHF1ZXVlczogW1xuICAgICAqIC8vICAgICAgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSxcbiAgICAgKiAvLyAgICAgIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGEsXG4gICAgICogLy8gICAgICBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhLFxuICAgICAqIC8vICAgICAgLi4uXG4gICAgICogLy8gICBdXG4gICAgICogLy8gfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZW5lcmF0ZVN0YXRpc3RpY3MoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbnN0YW5jZXM6IF9pbnRlcm5hbHMuaW5zdGFuY2VzLnNpemUsXG4gICAgICAgICAgICBxdWV1ZXNDb3VudDogdGhpcy5xdWV1ZXMuY2FjaGUuc2l6ZSxcbiAgICAgICAgICAgIHF1ZXJ5Q2FjaGVFbmFibGVkOiB0aGlzLnF1ZXJ5Q2FjaGUgIT0gbnVsbCxcbiAgICAgICAgICAgIHF1ZXVlczogdGhpcy5xdWV1ZXMuY2FjaGUubWFwKChtKSA9PiBtLnN0YXRzLmdlbmVyYXRlKCkpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveSBldmVyeSBzaW5nbGUgcXVldWVzIG1hbmFnZWQgYnkgdGhpcyBtYXN0ZXIgcGxheWVyIGluc3RhbmNlXG4gICAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIHVzZSBtZSB3aGVuIHlvdSB3YW50IHRvIGltbWVkaWF0ZWx5IHRlcm1pbmF0ZSBldmVyeSBzaW5nbGUgcXVldWVzIGluIGV4aXN0ZW5jZSBcdUQ4M0RcdUREMkFcbiAgICAgKiBhd2FpdCBwbGF5ZXIuZGVzdHJveSgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLm5vZGVzLmNhY2hlLmZvckVhY2goKG5vZGUpID0+IG5vZGUuZGVsZXRlKCkpO1xuICAgICAgICB0aGlzLmNsaWVudC5vZmYoJ3ZvaWNlU3RhdGVVcGRhdGUnLCB0aGlzLiN2b2ljZVN0YXRlVXBkYXRlTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLmV2ZW50cy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5leHRyYWN0b3JzLnVucmVnaXN0ZXJBbGwoKTtcbiAgICAgICAgaWYgKHRoaXMuI2xhZ01vbml0b3JJbnRlcnZhbCkgY2xlYXJJbnRlcnZhbCh0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwpO1xuICAgICAgICBpZiAodGhpcy4jbGFnTW9uaXRvclRpbWVvdXQpIGNsZWFySW50ZXJ2YWwodGhpcy4jbGFnTW9uaXRvclRpbWVvdXQpO1xuICAgICAgICBfaW50ZXJuYWxzLmNsZWFyUGxheWVyKHRoaXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhbmRsZVZvaWNlU3RhdGUob2xkU3RhdGU6IFZvaWNlU3RhdGUsIG5ld1N0YXRlOiBWb2ljZVN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5ub2Rlcy5nZXQob2xkU3RhdGUuZ3VpbGQuaWQpO1xuICAgICAgICBpZiAoIXF1ZXVlIHx8ICFxdWV1ZS5jb25uZWN0aW9uIHx8ICFxdWV1ZS5jaGFubmVsKSByZXR1cm47XG5cbiAgICAgICAgLy8gZGlzcGF0Y2ggdm9pY2Ugc3RhdGUgdXBkYXRlXG4gICAgICAgIGNvbnN0IHdhc0hhbmRsZWQgPSB0aGlzLmV2ZW50cy5lbWl0KCd2b2ljZVN0YXRlVXBkYXRlJywgcXVldWUsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gICAgICAgIC8vIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgcmV0dXJuIGFzc3VtaW5nIHRoZSBsaXN0ZW5lciBpbXBsZW1lbnRlZCBhbGwgb2YgdGhlIGxvZ2ljIGJlbG93XG4gICAgICAgIGlmICh3YXNIYW5kbGVkICYmICF0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyKSByZXR1cm47XG5cbiAgICAgICAgaWYgKG9sZFN0YXRlLmNoYW5uZWxJZCAmJiAhbmV3U3RhdGUuY2hhbm5lbElkICYmIG5ld1N0YXRlLm1lbWJlcj8uaWQgPT09IG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LmlkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHF1ZXVlLmRlbGV0ZSgpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgLyogbm9vcCAqL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5ldmVudHMuZW1pdCgnZGlzY29ubmVjdCcsIHF1ZXVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb2xkU3RhdGUuY2hhbm5lbElkICYmIG5ld1N0YXRlLmNoYW5uZWxJZCAmJiBuZXdTdGF0ZS5tZW1iZXI/LmlkID09PSBuZXdTdGF0ZS5ndWlsZC5tZW1iZXJzLm1lPy5pZCkge1xuICAgICAgICAgICAgaWYgKG5ld1N0YXRlLnNlcnZlck11dGUgIT0gbnVsbCAmJiBvbGRTdGF0ZS5zZXJ2ZXJNdXRlICE9PSBuZXdTdGF0ZS5zZXJ2ZXJNdXRlKSB7XG4gICAgICAgICAgICAgICAgcXVldWUubm9kZS5zZXRQYXVzZWQobmV3U3RhdGUuc2VydmVyTXV0ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXRlLmNoYW5uZWw/LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZSAmJiBuZXdTdGF0ZS5zdXBwcmVzcyAhPSBudWxsICYmIG9sZFN0YXRlLnN1cHByZXNzICE9PSBuZXdTdGF0ZS5zdXBwcmVzcykge1xuICAgICAgICAgICAgICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKG5ld1N0YXRlLnN1cHByZXNzKTtcbiAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUuc3VwcHJlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8udm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsodHJ1ZSkuY2F0Y2goVXRpbC5ub29wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW5ld1N0YXRlLmNoYW5uZWxJZCAmJiBvbGRTdGF0ZS5jaGFubmVsSWQgPT09IHF1ZXVlLmNoYW5uZWwuaWQpIHtcbiAgICAgICAgICAgIGlmICghVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCkpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5ub2Rlcy5oYXMocXVldWUuZ3VpbGQuaWQpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5KSBxdWV1ZS5kZWxldGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50cy5lbWl0KCdlbXB0eUNoYW5uZWwnLCBxdWV1ZSk7XG4gICAgICAgICAgICB9LCBxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duIHx8IDApLnVucmVmKCk7XG4gICAgICAgICAgICBxdWV1ZS50aW1lb3V0cy5zZXQoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCwgdGltZW91dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV3U3RhdGUuY2hhbm5lbElkICYmIG5ld1N0YXRlLmNoYW5uZWxJZCA9PT0gcXVldWUuY2hhbm5lbC5pZCkge1xuICAgICAgICAgICAgY29uc3QgZW1wdHlUaW1lb3V0ID0gcXVldWUudGltZW91dHMuZ2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApO1xuICAgICAgICAgICAgY29uc3QgY2hhbm5lbEVtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCk7XG4gICAgICAgICAgICBpZiAoIWNoYW5uZWxFbXB0eSAmJiBlbXB0eVRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZW1wdHlUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICBxdWV1ZS50aW1lb3V0cy5kZWxldGUoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob2xkU3RhdGUuY2hhbm5lbElkICYmIG5ld1N0YXRlLmNoYW5uZWxJZCAmJiBvbGRTdGF0ZS5jaGFubmVsSWQgIT09IG5ld1N0YXRlLmNoYW5uZWxJZCkge1xuICAgICAgICAgICAgaWYgKG5ld1N0YXRlLm1lbWJlcj8uaWQgPT09IG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LmlkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmNvbm5lY3Rpb24gJiYgbmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQpIHF1ZXVlLmNoYW5uZWwgPSBuZXdTdGF0ZS5jaGFubmVsITtcbiAgICAgICAgICAgICAgICBjb25zdCBlbXB0eVRpbWVvdXQgPSBxdWV1ZS50aW1lb3V0cy5nZXQoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhbm5lbEVtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCk7XG4gICAgICAgICAgICAgICAgaWYgKCFjaGFubmVsRW1wdHkgJiYgZW1wdHlUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChlbXB0eVRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZS50aW1lb3V0cy5kZWxldGUoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmNvbm5lY3Rpb24gJiYgIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5vZGVzLmhhcyhxdWV1ZS5ndWlsZC5pZCkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eSkgcXVldWUuZGVsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZW50cy5lbWl0KCdlbXB0eUNoYW5uZWwnLCBxdWV1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24gfHwgMCkudW5yZWYoKTtcbiAgICAgICAgICAgICAgICAgICAgcXVldWUudGltZW91dHMuc2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWAsIHRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlLmNoYW5uZWxJZCAhPT0gcXVldWUuY2hhbm5lbC5pZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmIChxdWV1ZS50aW1lb3V0cy5oYXMoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsISkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5ub2Rlcy5oYXMocXVldWUuZ3VpbGQuaWQpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVldWUub3B0aW9ucy5sZWF2ZU9uRW1wdHkpIHF1ZXVlLmRlbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVudHMuZW1pdCgnZW1wdHlDaGFubmVsJywgcXVldWUpO1xuICAgICAgICAgICAgICAgICAgICB9LCBxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duIHx8IDApLnVucmVmKCk7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLnRpbWVvdXRzLnNldChgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gLCB0aW1lb3V0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbXB0eVRpbWVvdXQgPSBxdWV1ZS50aW1lb3V0cy5nZXQoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGFubmVsRW1wdHkgJiYgZW1wdHlUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZW1wdHlUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLnRpbWVvdXRzLmRlbGV0ZShgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgdm9pY2Ugc3RhdGUgdXBkYXRlXG4gICAgICogQHBhcmFtIHtWb2ljZVN0YXRlfSBvbGRTdGF0ZSBUaGUgb2xkIHZvaWNlIHN0YXRlXG4gICAgICogQHBhcmFtIHtWb2ljZVN0YXRlfSBuZXdTdGF0ZSBUaGUgbmV3IHZvaWNlIHN0YXRlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIHBhc3Npbmcgdm9pY2Ugc3RhdGUgdXBkYXRlIGRhdGEgdG8gdGhpcyBtZXRob2Qgd2lsbCB0cmlnZ2VyIHZvaWNlIHN0YXRlIGhhbmRsZXJcbiAgICAgKlxuICAgICAqIGNsaWVudC5vbigndm9pY2VTdGF0ZVVwZGF0ZScsIChvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICAgKiAgIC8vIHRoaXMgaXMgZGVmaW5pdGVseSBhIHJvY2tldCBzY2llbmNlLCByaWdodCBoZXJlXG4gICAgICogICBwbGF5ZXIuaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBoYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9oYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9jayB2b2ljZSBzdGF0ZSBoYW5kbGVyLiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgZGlzY29yZC1wbGF5ZXIgd2lsbCBrZWVwIHVzaW5nIHRoZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyLCBldmVuIGlmIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBleGlzdHMuXG4gICAgICovXG4gICAgcHVibGljIGxvY2tWb2ljZVN0YXRlSGFuZGxlcigpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmxvY2tWb2ljZVN0YXRlSGFuZGxlciA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5sb2NrIHZvaWNlIHN0YXRlIGhhbmRsZXIuIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBkaXNjb3JkLXBsYXllciB3aWxsIHN0b3AgdXNpbmcgdGhlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgY3VzdG9tIGltcGxlbWVudGF0aW9uIGV4aXN0cy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdW5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdm9pY2Ugc3RhdGUgaGFuZGxlciBpcyBsb2NrZWQuXG4gICAgICovXG4gICAgcHVibGljIGlzVm9pY2VTdGF0ZUhhbmRsZXJMb2NrZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhdGUgYXVkaW8gcGxheWVyXG4gICAgICogQHBhcmFtIGNoYW5uZWwgVGhlIHZvaWNlIGNoYW5uZWwgb24gd2hpY2ggdGhlIG11c2ljIHNob3VsZCBiZSBwbGF5ZWRcbiAgICAgKiBAcGFyYW0gcXVlcnkgVGhlIHRyYWNrIG9yIHNvdXJjZSB0byBwbGF5XG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgcGxheWVyXG4gICAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgcXVldWUgbWFuYWdlbWVudCwganVzdCB1c2UgdGhpcyBtZXRob2QgXHVEODNEXHVERTA0XG4gICAgICogY29uc3QgcXVlcnkgPSAndGhpcyBpcyBteSBzdXBlciBjb29sIHNlYXJjaCBxdWVyeSB0aGF0IEkgd2FudCB0byBwbGF5JztcbiAgICAgKlxuICAgICAqIHRyeSB7XG4gICAgICogICAgY29uc3QgeyB0cmFjayB9ID0gYXdhaXQgcGxheWVyLnBsYXkodm9pY2VDaGFubmVsLCBxdWVyeSk7XG4gICAgICogICBjb25zb2xlLmxvZyhgXHVEODNDXHVERjg5IEkgYW0gcGxheWluZyAke3RyYWNrLnRpdGxlfSBcdUQ4M0NcdURGODlgKTtcbiAgICAgKiB9IGNhdGNoKGUpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBcdUQ4M0RcdURFMkQgRmFpbGVkIHRvIHBsYXkgZXJyb3Igb2ggbm86XFxuXFxuJHtlfWApO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheTxUID0gdW5rbm93bj4oY2hhbm5lbDogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLCBxdWVyeTogVHJhY2tMaWtlLCBvcHRpb25zOiBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPFQ+ID0ge30pOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgICAgICBjb25zdCB2YyA9IHRoaXMuY2xpZW50LmNoYW5uZWxzLnJlc29sdmUoY2hhbm5lbCk7XG4gICAgICAgIGlmICghdmM/LmlzVm9pY2VCYXNlZCgpKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdjaGFubmVsJywgJ1ZvaWNlQmFzZWRDaGFubmVsJywgIXZjID8gJ3VuZGVmaW5lZCcgOiBgY2hhbm5lbCB0eXBlICR7dmMudHlwZX1gKTtcblxuICAgICAgICBjb25zdCBvcmlnaW5hbFJlc3VsdCA9IHF1ZXJ5IGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0ID8gcXVlcnkgOiBhd2FpdCB0aGlzLnNlYXJjaChxdWVyeSwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IChhd2FpdCBvcHRpb25zLmFmdGVyU2VhcmNoPy4ob3JpZ2luYWxSZXN1bHQpKSB8fCBvcmlnaW5hbFJlc3VsdDtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVChgTm8gcmVzdWx0cyBmb3VuZCBmb3IgXCIke3F1ZXJ5fVwiIChFeHRyYWN0b3I6ICR7cmVzdWx0LmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCAnTi9BJ30pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWV1ZSA9IHRoaXMubm9kZXMuY3JlYXRlKHZjLmd1aWxkLCBvcHRpb25zLm5vZGVPcHRpb25zKTtcblxuICAgICAgICB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gQWNxdWlyaW5nIGFuIGVudHJ5Li4uYCk7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gcXVldWUudGFza3NRdWV1ZS5hY3F1aXJlKCk7XG4gICAgICAgIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBFbnRyeSAke2VudHJ5LmlkfSB3YXMgYWNxdWlyZWQgc3VjY2Vzc2Z1bGx5IWApO1xuXG4gICAgICAgIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBXYWl0aW5nIGZvciB0aGUgcXVldWUgdG8gcmVzb2x2ZS4uLmApO1xuICAgICAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAgICAgIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBFbnRyeSAke2VudHJ5LmlkfSB3YXMgcmVzb2x2ZWQhYCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghcXVldWUuY2hhbm5lbCkgYXdhaXQgcXVldWUuY29ubmVjdCh2Yywgb3B0aW9ucy5jb25uZWN0aW9uT3B0aW9ucyk7XG5cbiAgICAgICAgICAgIGlmICghcmVzdWx0LnBsYXlsaXN0KSB7XG4gICAgICAgICAgICAgICAgcXVldWUuYWRkVHJhY2socmVzdWx0LnRyYWNrc1swXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHF1ZXVlLmFkZFRyYWNrKHJlc3VsdC5wbGF5bGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXF1ZXVlLmlzUGxheWluZygpKSBhd2FpdCBxdWV1ZS5ub2RlLnBsYXkobnVsbCwgb3B0aW9ucy5hdWRpb1BsYXllck9wdGlvbnMpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIFJlbGVhc2luZyBhbiBlbnRyeSBmcm9tIHRoZSBxdWV1ZS4uLmApO1xuICAgICAgICAgICAgcXVldWUudGFza3NRdWV1ZS5yZWxlYXNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHJhY2s6IHJlc3VsdC50cmFja3NbMF0sXG4gICAgICAgICAgICBleHRyYWN0b3I6IHJlc3VsdC5leHRyYWN0b3IsXG4gICAgICAgICAgICBzZWFyY2hSZXN1bHQ6IHJlc3VsdCxcbiAgICAgICAgICAgIHF1ZXVlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VhcmNoIHRyYWNrc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgVHJhY2sgfCBUcmFja1tdIHwgUGxheWxpc3QgfCBTZWFyY2hSZXN1bHR9IHF1ZXJ5IFRoZSBzZWFyY2ggcXVlcnlcbiAgICAgKiBAcGFyYW0ge1NlYXJjaE9wdGlvbnN9IG9wdGlvbnMgVGhlIHNlYXJjaCBvcHRpb25zXG4gICAgICogQHJldHVybnMge1Byb21pc2U8U2VhcmNoUmVzdWx0Pn1cbiAgICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgc2VhcmNoUXVlcnkgPSAncGFzcyB1cmwgb3IgdGV4dCBvciBkaXNjb3JkLXBsYXllciB0cmFjayBjb25zdHJ1Y3RhYmxlIG9iamVjdHMsIHdlIGdvdCB5b3UgY292ZXJlZCBcdUQ4M0RcdURFMEUnO1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBsYXllci5zZWFyY2goc2VhcmNoUXVlcnkpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2cocmVzdWx0KTsgLy8gTG9ncyBgU2VhcmNoUmVzdWx0YCBvYmplY3RcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2VhcmNoKHF1ZXJ5OiBzdHJpbmcgfCBUcmFjayB8IFRyYWNrW10gfCBQbGF5bGlzdCB8IFNlYXJjaFJlc3VsdCwgb3B0aW9uczogU2VhcmNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+IHtcbiAgICAgICAgaWYgKHF1ZXJ5IGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0KSByZXR1cm4gcXVlcnk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucmVxdWVzdGVkQnkgIT0gbnVsbCkgb3B0aW9ucy5yZXF1ZXN0ZWRCeSA9IHRoaXMuY2xpZW50LnVzZXJzLnJlc29sdmUob3B0aW9ucy5yZXF1ZXN0ZWRCeSkhO1xuICAgICAgICBvcHRpb25zLmJsb2NrRXh0cmFjdG9ycyA/Pz0gdGhpcy5vcHRpb25zLmJsb2NrRXh0cmFjdG9ycztcbiAgICAgICAgb3B0aW9ucy5mYWxsYmFja1NlYXJjaEVuZ2luZSA/Pz0gUXVlcnlUeXBlLkFVVE9fU0VBUkNIO1xuXG4gICAgICAgIGlmIChxdWVyeSBpbnN0YW5jZW9mIFRyYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcGxheWxpc3Q6IHF1ZXJ5LnBsYXlsaXN0IHx8IG51bGwsXG4gICAgICAgICAgICAgICAgdHJhY2tzOiBbcXVlcnldLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiBxdWVyeS50aXRsZSxcbiAgICAgICAgICAgICAgICBleHRyYWN0b3I6IHF1ZXJ5LmV4dHJhY3RvcixcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGU6IHF1ZXJ5LnF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocXVlcnkgaW5zdGFuY2VvZiBQbGF5bGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgICAgICAgIHBsYXlsaXN0OiBxdWVyeSxcbiAgICAgICAgICAgICAgICB0cmFja3M6IHF1ZXJ5LnRyYWNrcyxcbiAgICAgICAgICAgICAgICBxdWVyeTogcXVlcnkudGl0bGUsXG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yOiBxdWVyeS50cmFja3NbMF0/LmV4dHJhY3RvcixcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGU6IFF1ZXJ5VHlwZS5BVVRPLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHF1ZXJ5KSkge1xuICAgICAgICAgICAgY29uc3QgdHJhY2tzID0gcXVlcnkuZmlsdGVyKCh0KSA9PiB0IGluc3RhbmNlb2YgVHJhY2spO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgICAgICAgIHBsYXlsaXN0OiBudWxsLFxuICAgICAgICAgICAgICAgIHRyYWNrcyxcbiAgICAgICAgICAgICAgICBxdWVyeTogJ0BAIyV7e1VzZXJMb2FkZWRDb250ZW50fX0lI0BAJyxcbiAgICAgICAgICAgICAgICBleHRyYWN0b3I6IG51bGwsXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlOiBRdWVyeVR5cGUuQVVUTyxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRlYnVnKGBTZWFyY2hpbmcgJHtxdWVyeX1gKTtcblxuICAgICAgICBsZXQgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgb3B0aW9ucy5zZWFyY2hFbmdpbmUgPz89IFF1ZXJ5VHlwZS5BVVRPO1xuXG4gICAgICAgIHRoaXMuZGVidWcoYFNlYXJjaCBlbmdpbmUgc2V0IHRvICR7b3B0aW9ucy5zZWFyY2hFbmdpbmV9YCk7XG5cbiAgICAgICAgY29uc3QgcXVlcnlUeXBlID0gb3B0aW9ucy5zZWFyY2hFbmdpbmUgPT09IFF1ZXJ5VHlwZS5BVVRPID8gUXVlcnlSZXNvbHZlci5yZXNvbHZlKHF1ZXJ5LCBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lKSA6IG9wdGlvbnMuc2VhcmNoRW5naW5lO1xuXG4gICAgICAgIHRoaXMuZGVidWcoYFF1ZXJ5IHR5cGUgaWRlbnRpZmllZCBhcyAke3F1ZXJ5VHlwZX1gKTtcblxuICAgICAgICAvLyBmb3JjZSBwYXJ0aWN1bGFyIGV4dHJhY3RvclxuICAgICAgICBpZiAob3B0aW9ucy5zZWFyY2hFbmdpbmUuc3RhcnRzV2l0aCgnZXh0OicpKSB7XG4gICAgICAgICAgICBleHRyYWN0b3IgPSB0aGlzLmV4dHJhY3RvcnMuZ2V0KG9wdGlvbnMuc2VhcmNoRW5naW5lLnN1YnN0cmluZyg0KSkhO1xuICAgICAgICAgICAgaWYgKCFleHRyYWN0b3IpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgICAgICBleHRyYWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBxdWVyeSBhbGwgZXh0cmFjdG9yc1xuICAgICAgICBpZiAoIWV4dHJhY3Rvcikge1xuICAgICAgICAgICAgLy8gY2FjaGUgdmFsaWRhdGlvblxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUNhY2hlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgQ2hlY2tpbmcgY2FjaGUuLi5gKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnF1ZXJ5Q2FjaGU/LnJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIGNhY2hlIGhpdFxuICAgICAgICAgICAgICAgIGlmIChyZXM/Lmhhc1RyYWNrcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoYENhY2hlIGhpdCBmb3IgcXVlcnkgJHtxdWVyeX1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGBDYWNoZSBtaXNzIGZvciBxdWVyeSAke3F1ZXJ5fWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmRlYnVnKGBFeGVjdXRpbmcgZXh0cmFjdG9ycy4uLmApO1xuXG4gICAgICAgICAgICAvLyBjYWNoZSBtaXNzXG4gICAgICAgICAgICBleHRyYWN0b3IgPVxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM/LmluY2x1ZGVzKGV4dC5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4dC52YWxpZGF0ZShxdWVyeSwgcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKT8uZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBubyBleHRyYWN0b3JzIGF2YWlsYWJsZVxuICAgICAgICBpZiAoIWV4dHJhY3Rvcikge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZygnRmFpbGVkIHRvIGZpbmQgYXBwcm9wcmlhdGUgZXh0cmFjdG9yJyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVidWcoYEV4ZWN1dGluZyBtZXRhZGF0YSBxdWVyeSB1c2luZyAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IuLi5gKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZXh0cmFjdG9yXG4gICAgICAgICAgICAuaGFuZGxlKHF1ZXJ5LCB7XG4gICAgICAgICAgICAgICAgdHlwZTogcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeSBhcyBVc2VyXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpO1xuXG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoJ01ldGFkYXRhIHF1ZXJ5IHdhcyBzdWNjZXNzZnVsIScpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHBsYXlsaXN0OiByZXMucGxheWxpc3QsXG4gICAgICAgICAgICAgICAgdHJhY2tzOiByZXMudHJhY2tzLFxuICAgICAgICAgICAgICAgIGV4dHJhY3RvcixcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVDYWNoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoYEFkZGluZyBkYXRhIHRvIGNhY2hlLi4uYCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5xdWVyeUNhY2hlPy5hZGREYXRhKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRlYnVnKCdGYWlsZWQgdG8gZmluZCByZXN1bHQgdXNpbmcgYXBwcm9wcmlhdGUgZXh0cmFjdG9yLiBRdWVyeWluZyBhbGwgZXh0cmFjdG9ycy4uLicpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4dHJhY3RvcnMucnVuKFxuICAgICAgICAgICAgYXN5bmMgKGV4dCkgPT5cbiAgICAgICAgICAgICAgICAhb3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM/LmluY2x1ZGVzKGV4dC5pZGVudGlmaWVyKSAmJlxuICAgICAgICAgICAgICAgIChhd2FpdCBleHQudmFsaWRhdGUocXVlcnkpKSAmJlxuICAgICAgICAgICAgICAgIGV4dC5oYW5kbGUocXVlcnksIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnkgYXMgVXNlclxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIGlmICghcmVzdWx0Py5yZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoYEZhaWxlZCB0byBxdWVyeSBtZXRhZGF0YSBxdWVyeSB1c2luZyAke3Jlc3VsdD8uZXh0cmFjdG9yLmlkZW50aWZpZXIgfHwgJ04vQSd9IGV4dHJhY3Rvci5gKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnksXG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yOiByZXN1bHQ/LmV4dHJhY3RvclxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRlYnVnKGBNZXRhZGF0YSBxdWVyeSB3YXMgc3VjY2Vzc2Z1bCB1c2luZyAke3Jlc3VsdC5leHRyYWN0b3IuaWRlbnRpZmllcn0hYCk7XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgICBwbGF5bGlzdDogcmVzdWx0LnJlc3VsdC5wbGF5bGlzdCxcbiAgICAgICAgICAgIHRyYWNrczogcmVzdWx0LnJlc3VsdC50cmFja3MsXG4gICAgICAgICAgICBleHRyYWN0b3I6IHJlc3VsdC5leHRyYWN0b3IsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMuaWdub3JlQ2FjaGUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoYEFkZGluZyBkYXRhIHRvIGNhY2hlLi4uYCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5Q2FjaGU/LmFkZERhdGEoZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSByZXBvcnQgb2YgdGhlIGRlcGVuZGVuY2llcyB1c2VkIGJ5IHRoZSBgQGRpc2NvcmRqcy92b2ljZWAgbW9kdWxlLiBVc2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc29sZS5sb2cocGxheWVyLnNjYW5EZXBzKCkpO1xuICAgICAqIC8vIC0+IGxvZ3MgZGVwZW5kZW5jaWVzIHJlcG9ydFxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgcHVibGljIHNjYW5EZXBzKCkge1xuICAgICAgICBjb25zdCBsaW5lID0gJy0nLnJlcGVhdCg1MCk7XG4gICAgICAgIGNvbnN0IHJ1bnRpbWUgPSAnQnVuJyBpbiBnbG9iYWxUaGlzID8gJ2J1bicgOiAnRGVubycgaW4gZ2xvYmFsVGhpcyA/ICdkZW5vJyA6ICdub2RlJztcbiAgICAgICAgY29uc3QgZGVwc1JlcG9ydCA9IFtcbiAgICAgICAgICAgICdEaXNjb3JkIFBsYXllcicsXG4gICAgICAgICAgICBsaW5lLFxuICAgICAgICAgICAgYC0gZGlzY29yZC1wbGF5ZXI6ICR7UGxheWVyLnZlcnNpb259YCxcbiAgICAgICAgICAgIGAtIEBkaXNjb3JkanMvdm9pY2U6ICR7ZFZvaWNlVmVyc2lvbn1gLFxuICAgICAgICAgICAgYC0gZGlzY29yZC5qczogJHtkanNWZXJzaW9ufWAsXG4gICAgICAgICAgICBgLSAke3J1bnRpbWV9IHZlcnNpb246ICR7cHJvY2Vzcy52ZXJzaW9ufWAsXG4gICAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudXNlTGVnYWN5RkZtcGVnKSByZXR1cm4gJy0gZmZtcGVnOiBOL0EgKHVzaW5nIGxlZ2FjeSBmZm1wZWcpJztcbiAgICAgICAgICAgICAgICBjb25zdCBpbmZvID0gRkZtcGVnLmxvY2F0ZVNhZmUoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWluZm8pIHJldHVybiAnRkZtcGVnL0F2Y29udiBub3QgZm91bmQnO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtgLSBmZm1wZWc6ICR7aW5mby52ZXJzaW9ufWAsIGAtIGNvbW1hbmQ6ICR7aW5mby5jb21tYW5kfWAsIGAtIGxpYm9wdXM6ICR7aW5mby5tZXRhZGF0YSEuaW5jbHVkZXMoJy0tZW5hYmxlLWxpYm9wdXMnKX1gXS5qb2luKCdcXG4nKTtcbiAgICAgICAgICAgIH0pKCksXG4gICAgICAgICAgICAnXFxuJyxcbiAgICAgICAgICAgICdMb2FkZWQgRXh0cmFjdG9yczonLFxuICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgIHRoaXMuZXh0cmFjdG9ycy5zdG9yZVxuICAgICAgICAgICAgICAgIC5tYXAoKG0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0uaWRlbnRpZmllcjtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKSB8fCAnTi9BJyxcbiAgICAgICAgICAgICdcXG5cXG5AZGlzY29yZGpzL3ZvaWNlJyxcbiAgICAgICAgICAgIGdlbmVyYXRlRGVwZW5kZW5jeVJlcG9ydCgpXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIGRlcHNSZXBvcnQuam9pbignXFxuJyk7XG4gICAgfVxuXG4gICAgcHVibGljICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgeWllbGQqIHRoaXMubm9kZXMuY2FjaGUudmFsdWVzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBgUGxheWxpc3RgIGluc3RhbmNlXG4gICAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gaW5pdGlhbGl6ZSBhIHBsYXlsaXN0XG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVBsYXlsaXN0KGRhdGE6IFBsYXlsaXN0SW5pdERhdGEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQbGF5bGlzdCh0aGlzLCBkYXRhKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZSwgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB7IGluc3RhbmNlcyB9IGZyb20gJy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbmV4cG9ydCBjb25zdCBnZXRQbGF5ZXIgPSAoKSA9PiB7XG4gICAgcmV0dXJuIGluc3RhbmNlcy5maXJzdCgpIHx8IG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UXVldWUgPSA8VCA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSA9PiB7XG4gICAgY29uc3QgcGxheWVyID0gZ2V0UGxheWVyKCk7XG4gICAgaWYgKCFwbGF5ZXIpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIChwbGF5ZXIubm9kZXMucmVzb2x2ZShub2RlKSBhcyBHdWlsZFF1ZXVlPFQ+KSB8fCBudWxsO1xufTtcbiIsICJpbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHsgZ2V0UXVldWUgfSBmcm9tICcuL2NvbW1vbic7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VIaXN0b3J5PE1ldGEgPSB1bmtub3duPihub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IHF1ZXVlID0gZ2V0UXVldWU8TWV0YT4obm9kZSk7XG4gICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gcXVldWUuaGlzdG9yeTtcbn1cbiIsICJpbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHsgZ2V0UXVldWUgfSBmcm9tICcuL2NvbW1vbic7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZTxNZXRhPihub2RlKTtcbiAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBxdWV1ZS5ub2RlO1xufVxuIiwgImltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBnZXRRdWV1ZSB9IGZyb20gJy4vY29tbW9uJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVF1ZXVlPE1ldGEgPSB1bmtub3duPihub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IHF1ZXVlID0gZ2V0UXVldWU8TWV0YT4obm9kZSk7XG4gICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gcXVldWU7XG59XG4iLCAiaW1wb3J0IHsgZ2V0UGxheWVyIH0gZnJvbSAnLi9jb21tb24nO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlTWFzdGVyUGxheWVyKCkge1xuICAgIHJldHVybiBnZXRQbGF5ZXIoKTtcbn1cbiIsICJpbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBnZXRRdWV1ZSB9IGZyb20gJy4vY29tbW9uJztcblxudHlwZSBTZXR0ZXJGTjxULCBQPiA9IChwcmV2aW91czogUCkgPT4gVDtcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZU1ldGFkYXRhPFQgPSB1bmtub3duPihub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IHF1ZXVlID0gZ2V0UXVldWU8VD4obm9kZSk7XG4gICAgY29uc3Qgc2V0dGVyID0gKG1ldGFkYXRhOiBUIHwgU2V0dGVyRk48VCwgVD4pID0+IHtcbiAgICAgICAgaWYgKHF1ZXVlKSB7XG4gICAgICAgICAgICBpZiAoVHlwZVV0aWwuaXNGdW5jdGlvbihtZXRhZGF0YSkpIHJldHVybiBxdWV1ZS5zZXRNZXRhZGF0YShtZXRhZGF0YShxdWV1ZS5tZXRhZGF0YSkpO1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLnNldE1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBnZXR0ZXIgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBxdWV1ZT8ubWV0YWRhdGEgYXMgVDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFtnZXR0ZXIsIHNldHRlcl0gYXMgY29uc3Q7XG59XG4iLCAiaW1wb3J0IHsgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB7IGdldFF1ZXVlIH0gZnJvbSAnLi9jb21tb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVsaW5lRGlzcGF0Y2hlck9wdGlvbnMge1xuICAgIGlnbm9yZUZpbHRlcnM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUaW1lbGluZShub2RlOiBOb2RlUmVzb2x2YWJsZSwgb3B0aW9ucz86IFBhcnRpYWw8VGltZWxpbmVEaXNwYXRjaGVyT3B0aW9ucz4pIHtcbiAgICBjb25zdCBxdWV1ZSA9IGdldFF1ZXVlKG5vZGUpO1xuICAgIGlmICghcXVldWUpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7XG4gICAgICAgIGdldCB0aW1lc3RhbXAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAob3B0aW9ucz8uaWdub3JlRmlsdGVycykhO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgdm9sdW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUudm9sdW1lO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgcGF1c2VkKCkge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuaXNQYXVzZWQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IHRyYWNrKCkge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLmN1cnJlbnRUcmFjaztcbiAgICAgICAgfSxcbiAgICAgICAgcGF1c2UoKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUubm9kZS5wYXVzZSgpO1xuICAgICAgICB9LFxuICAgICAgICByZXN1bWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUubm9kZS5yZXN1bWUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0Vm9sdW1lKHZvbDogbnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUubm9kZS5zZXRWb2x1bWUodm9sKTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgc2V0UG9zaXRpb24odGltZTogbnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUubm9kZS5zZWVrKHRpbWUpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCAiaW1wb3J0IHsgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIgfSBmcm9tICcuLi8uLi9tYW5hZ2VyJztcbmltcG9ydCB7IGdldEdsb2JhbFJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vdXRpbHMvX19pbnRlcm5hbF9fJztcblxuZXhwb3J0IGZ1bmN0aW9uIG9uQWZ0ZXJDcmVhdGVTdHJlYW0oaGFuZGxlcjogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIpIHtcbiAgICBnZXRHbG9iYWxSZWdpc3RyeSgpLnNldCgnQFtvbkFmdGVyQ3JlYXRlU3RyZWFtXScsIGhhbmRsZXIpO1xufVxuIiwgImltcG9ydCB7IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciB9IGZyb20gJy4uLy4uL21hbmFnZXInO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi8uLi91dGlscy9fX2ludGVybmFsX18nO1xuXG5leHBvcnQgZnVuY3Rpb24gb25CZWZvcmVDcmVhdGVTdHJlYW0oaGFuZGxlcjogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyKSB7XG4gICAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5zZXQoJ0Bbb25CZWZvcmVDcmVhdGVTdHJlYW1dJywgaGFuZGxlcik7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsaUJBQUFBO0FBQUE7QUFBQTtBQUFBLElBQUFDLGtCQUFzQzs7O0FDRXRDLG1CQUE2Qjs7O0FDQTdCLHNCQUEyQjs7O0FDR3BCLElBQU0sV0FBTixNQUFlO0FBQUEsRUFxQmxCLFlBQVksUUFBZ0IsTUFBd0I7QUFPaEQsU0FBSyxTQUFTO0FBT2QsU0FBSyxTQUFTLEtBQUssVUFBVSxDQUFDO0FBTzlCLFNBQUssU0FBUyxLQUFLO0FBT25CLFNBQUssY0FBYyxLQUFLO0FBT3hCLFNBQUssWUFBWSxLQUFLO0FBU3RCLFNBQUssT0FBTyxLQUFLO0FBV2pCLFNBQUssU0FBUyxLQUFLO0FBT25CLFNBQUssS0FBSyxLQUFLO0FBT2YsU0FBSyxNQUFNLEtBQUs7QUFNaEIsU0FBSyxRQUFRLEtBQUs7QUFBQSxFQU90QjtBQUFBLEVBRUEsRUFBRSxPQUFPLFlBQVk7QUFDakIsV0FBTyxLQUFLO0FBQUEsRUFDaEI7QUFBQSxFQUtBLElBQVcsb0JBQW9CO0FBQzNCLFdBQU8sS0FBSyxPQUFPLE9BQU8s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LEtBQUssR0FBSyxNQUFNLElBQU0sRUFBSSxDQUFDO0FBQUEsRUFDMUYsWUFBWSxVQUFVLENBQUMsTUFBTSxNQUFNLE1BQU0sSUFBTSxLQUFLLE1BQU0sSUFBTSxJQUFNLElBQU0sSUFBSSxDQUFDO0FBQUEsRUFDakYsWUFBWSxVQUFVLENBQUMsS0FBSyxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssS0FBSyxLQUFLLE1BQU0sSUFBSSxDQUFDO0FBQUEsRUFDN0UsV0FBVyxVQUFVLENBQUMsTUFBTSxNQUFNLEtBQUssS0FBSyxhQUFjLE1BQU0sTUFBTSxNQUFNLGFBQWMsV0FBWSxDQUFDO0FBQUEsRUFDdkcsTUFBTSxVQUFVLENBQUMsTUFBTSxhQUFjLEdBQUssS0FBSyxLQUFLLEtBQUssR0FBSyxLQUFLLEtBQUssR0FBRyxDQUFDO0FBQUEsRUFDNUUsT0FBTyxVQUFVLENBQUMsS0FBSyxLQUFLLGFBQWMsYUFBYyxhQUFjLGFBQWMsYUFBYyxhQUFjLEtBQUssR0FBRyxDQUFDO0FBQUEsRUFDekgsS0FBSyxVQUFVLENBQUMsTUFBTSxLQUFLLEtBQUssR0FBSyxLQUFLLGFBQWMsTUFBTSxNQUFNLE1BQU0sSUFBSSxDQUFDO0FBQUEsRUFDL0UsUUFBUSxVQUFVLENBQUMsYUFBYyxhQUFjLGFBQWMsTUFBTSxhQUFjLEtBQUssS0FBSyxhQUFjLGFBQWMsV0FBWSxDQUFDO0FBQUEsRUFDcEksTUFBTSxVQUFVLENBQUMsR0FBSyxLQUFLLE1BQU0sSUFBTSxNQUFNLEdBQUssS0FBSyxNQUFNLE1BQU0sSUFBSSxDQUFDO0FBQUEsRUFDeEUsS0FBSyxVQUFVLENBQUMsTUFBTSxNQUFNLElBQU0sYUFBYyxHQUFLLEtBQUssS0FBSyxLQUFLLE1BQU0sR0FBRyxDQUFDO0FBQUEsRUFDOUUsTUFBTSxVQUFVLENBQUMsS0FBSyxLQUFLLGFBQWMsTUFBTSxhQUFjLEdBQUssR0FBSyxLQUFLLE1BQU0sRUFBSSxDQUFDO0FBQUEsRUFDdkYsVUFBVSxVQUFVLENBQUMsR0FBSyxHQUFLLEtBQUssYUFBYyxJQUFNLE1BQU0sTUFB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QixhQUFPLE1BQU0sS0FBSyxVQUFVLEdBQUc7QUFBQSxJQUNuQztBQUFBLElBQ0EsTUFBTSxZQUFZLE1BQWM7QUFDNUIsYUFBTyxNQUFNLEtBQUssS0FBSyxJQUFJO0FBQUEsSUFDL0I7QUFBQSxFQUNKLENBQUM7QUFDTDtBQTlCZ0I7OztBQ0pULFNBQVMsb0JBQW9CQyxVQUFxQztBQUNyRSxvQkFBa0IsRUFBRSxJQUFJLDBCQUEwQkEsUUFBTztBQUM3RDtBQUZnQjs7O0FDQVQsU0FBUyxxQkFBcUJDLFVBQXNDO0FBQ3ZFLG9CQUFrQixFQUFFLElBQUksMkJBQTJCQSxRQUFPO0FBQzlEO0FBRmdCOzs7QXhDaUJoQixJQUFBQyxvQkFXTztBQUNQLElBQUFDLGdCQUE4RTtBQUd2RSxJQUFNQyxXQUFrQjtBQUUvQixJQUFJLENBQUMsZ0JBQUFDLFFBQVcsV0FBVyxJQUFJLEdBQUc7QUFDOUIsVUFBUSxZQUFZLGVBQWUsZ0JBQUFBLGdEQUFtREQsNENBQTJDO0FBQ3JJOyIsCiAgIm5hbWVzIjogWyJ2ZXJzaW9uIiwgImltcG9ydF9kaXNjb3JkIiwgIlBsYXllckV2ZW50IiwgIlF1ZXVlUmVwZWF0TW9kZSIsICJ0YXJnZXQiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZGlzY29yZCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X3ZvaWNlIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfcHJvbWlzZXMiLCAiaW1wb3J0X2Rpc2NvcmQiLCAid2FpdEZvciIsICJjaGlsZFByb2Nlc3MiLCAidGFyZ2V0IiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfc3RyZWFtIiwgImltcG9ydF92b2ljZSIsICJwcmlzbSIsICJpbXBvcnRfdm9pY2UiLCAiaW1wb3J0X3ZvaWNlIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZXF1YWxpemVyIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZGlzY29yZCIsICJpbXBvcnRfdm9pY2UiLCAicmVzIiwgInJlc3VsdCIsICJkVm9pY2VWZXJzaW9uIiwgImRqc1ZlcnNpb24iLCAiaGFuZGxlciIsICJoYW5kbGVyIiwgImltcG9ydF9lcXVhbGl6ZXIiLCAiaW1wb3J0X3ZvaWNlIiwgInZlcnNpb24iLCAiZGpzVmVyc2lvbiJdCn0K
3635
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyLnRzIiwgIi4uL3NyYy91dGlscy9VdGlsLnRzIiwgIi4uL3NyYy9mYWJyaWMvUGxheWxpc3QudHMiLCAiLi4vc3JjL2ZhYnJpYy9UcmFjay50cyIsICIuLi9zcmMvdHlwZXMvdHlwZXMudHMiLCAiLi4vc3JjL2ZhYnJpYy9TZWFyY2hSZXN1bHQudHMiLCAiLi4vc3JjL3V0aWxzL0F1ZGlvRmlsdGVycy50cyIsICIuLi9zcmMvZXJyb3JzL2luZGV4LnRzIiwgIi4uL3NyYy9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3IudHMiLCAiLi4vc3JjL2V4dHJhY3RvcnMvRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dC50cyIsICIuLi9zcmMvdXRpbHMvVHlwZVV0aWwudHMiLCAiLi4vc3JjL21hbmFnZXIvR3VpbGROb2RlTWFuYWdlci50cyIsICIuLi9zcmMvbWFuYWdlci9HdWlsZFF1ZXVlLnRzIiwgIi4uL3NyYy9Wb2ljZUludGVyZmFjZS9TdHJlYW1EaXNwYXRjaGVyLnRzIiwgIi4uL3NyYy9tYW5hZ2VyL1ZvaWNlUmVjZWl2ZXJOb2RlLnRzIiwgIi4uL3NyYy9tYW5hZ2VyL0d1aWxkUXVldWVIaXN0b3J5LnRzIiwgIi4uL3NyYy9tYW5hZ2VyL0d1aWxkUXVldWVQbGF5ZXJOb2RlLnRzIiwgIi4uL3NyYy91dGlscy9RdWVyeVJlc29sdmVyLnRzIiwgIi4uL3NyYy91dGlscy9Bc3luY1F1ZXVlLnRzIiwgIi4uL3NyYy9tYW5hZ2VyL0d1aWxkUXVldWVBdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL3V0aWxzL0ZGbXBlZ1N0cmVhbS50cyIsICIuLi9zcmMvbWFuYWdlci9HdWlsZFF1ZXVlU3RhdGlzdGljcy50cyIsICIuLi9zcmMvdXRpbHMvX19pbnRlcm5hbF9fL19jb250YWluZXIudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9hZGRQbGF5ZXIudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9jbGVhclBsYXllci50cyIsICIuLi9zcmMvdXRpbHMvX19pbnRlcm5hbF9fL2dldFBsYXllcnMudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9nZXRHbG9iYWxSZWdpc3RyeS50cyIsICIuLi9zcmMvVm9pY2VJbnRlcmZhY2UvVm9pY2VVdGlscy50cyIsICIuLi9zcmMvdXRpbHMvUXVlcnlDYWNoZS50cyIsICIuLi9zcmMvUGxheWVyLnRzIiwgIi4uL3NyYy9EZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXIudHMiLCAiLi4vc3JjL2hvb2tzL2NvbW1vbi50cyIsICIuLi9zcmMvaG9va3MvdXNlSGlzdG9yeS50cyIsICIuLi9zcmMvaG9va3MvdXNlUGxheWVyLnRzIiwgIi4uL3NyYy9ob29rcy91c2VRdWV1ZS50cyIsICIuLi9zcmMvaG9va3MvdXNlTWFpblBsYXllci50cyIsICIuLi9zcmMvaG9va3MvdXNlTWV0YWRhdGEudHMiLCAiLi4vc3JjL2hvb2tzL3VzZVRpbWVsaW5lLnRzIiwgIi4uL3NyYy9ob29rcy9zdHJlYW0vb25BZnRlckNyZWF0ZVN0cmVhbS50cyIsICIuLi9zcmMvaG9va3Mvc3RyZWFtL29uQmVmb3JlQ3JlYXRlU3RyZWFtLnRzIiwgIi4uL3NyYy9ob29rcy91c2VWb2x1bWUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IHZlcnNpb24gYXMgZGpzVmVyc2lvbiB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9BdWRpb0ZpbHRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9mYWJyaWMnO1xuZXhwb3J0ICogZnJvbSAnLi9tYW5hZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vVm9pY2VJbnRlcmZhY2UvVm9pY2VVdGlscyc7XG5leHBvcnQgKiBmcm9tICcuL1ZvaWNlSW50ZXJmYWNlL1N0cmVhbURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9VdGlsJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvVHlwZVV0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9Bc3luY1F1ZXVlJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9GRm1wZWdTdHJlYW0nO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9RdWVyeUNhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5leHBvcnQgKiBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcbmV4cG9ydCAqIGZyb20gJy4vUGxheWVyJztcbmV4cG9ydCAqIGZyb20gJy4vaG9va3MnO1xuZXhwb3J0IHtcbiAgICBBdWRpb0ZpbHRlcnMgYXMgUENNQXVkaW9GaWx0ZXJzLFxuICAgIHR5cGUgQmlxdWFkRmlsdGVycyxcbiAgICBGaWx0ZXJUeXBlIGFzIEJpcXVhZEZpbHRlclR5cGUsXG4gICAgdHlwZSBQQ01GaWx0ZXJzLFxuICAgIFFfQlVUVEVSV09SVEgsXG4gICAgVm9sdW1lVHJhbnNmb3JtZXIsXG4gICAgQkFTU19FUV9CQU5EUyxcbiAgICBBRl9OSUdIVENPUkVfUkFURSxcbiAgICBBRl9WQVBPUldBVkVfUkFURSxcbiAgICBGaWx0ZXJzQ2hhaW5cbn0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5leHBvcnQgeyBjcmVhdGVBdWRpb1BsYXllciwgQXVkaW9QbGF5ZXIsIHR5cGUgQ3JlYXRlQXVkaW9QbGF5ZXJPcHRpb25zIH0gZnJvbSAnQGRpc2NvcmRqcy92b2ljZSc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW5mZXJyYWJsZS10eXBlc1xuZXhwb3J0IGNvbnN0IHZlcnNpb246IHN0cmluZyA9ICc2LjYuMC1kZXYuMCc7XG5cbmlmICghZGpzVmVyc2lvbi5zdGFydHNXaXRoKCcxNCcpKSB7XG4gICAgcHJvY2Vzcy5lbWl0V2FybmluZyhgRGlzY29yZC5qcyB2JHtkanNWZXJzaW9ufSBpcyBpbmNvbXBhdGlibGUgd2l0aCBEaXNjb3JkIFBsYXllciB2JHt2ZXJzaW9ufSEgUGxlYXNlIHVzZSA+PXYxNC54IG9mIERpc2NvcmQuanNgKTtcbn1cbiIsICJpbXBvcnQgeyBEZWZhdWx0TGlzdGVuZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgTGlzdGVuZXJTaWduYXR1cmUgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgY2xhc3MgUGxheWVyRXZlbnRzRW1pdHRlcjxMIGV4dGVuZHMgTGlzdGVuZXJTaWduYXR1cmU8TD4gPSBEZWZhdWx0TGlzdGVuZXI+IGV4dGVuZHMgRXZlbnRFbWl0dGVyPEw+IHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlcXVpcmVkRXZlbnRzOiBBcnJheTxrZXlvZiBMPiA9IFtdKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIC4uLmFyZ3M6IFBhcmFtZXRlcnM8TFtLXT4pIHtcbiAgICAgICAgaWYgKHRoaXMucmVxdWlyZWRFdmVudHMuaW5jbHVkZXMobmFtZSkgJiYgIXRoaXMuZXZlbnROYW1lcygpLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgY29uc29sZS5lcnJvciguLi5hcmdzKTtcbiAgICAgICAgICAgIFV0aWwud2FybihcbiAgICAgICAgICAgICAgICBgTm8gZXZlbnQgbGlzdGVuZXIgZm91bmQgZm9yIGV2ZW50IFwiJHtTdHJpbmcobmFtZSl9XCIuIEV2ZW50cyAke3RoaXMucmVxdWlyZWRFdmVudHMubWFwKChtKSA9PiBgXCIke1N0cmluZyhtKX1cImApLmpvaW4oJywgJyl9IG11c3QgaGF2ZSBldmVudCBsaXN0ZW5lcnMuYCxcbiAgICAgICAgICAgICAgICAnVW5oYW5kbGVkRXZlbnRzV2FybmluZydcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VwZXIuZW1pdChuYW1lLCAuLi5hcmdzKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgU3RhZ2VDaGFubmVsLCBWb2ljZUNoYW5uZWwgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFRpbWVEYXRhIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ3RpbWVycy9wcm9taXNlcyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBQbGF5bGlzdCwgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmNsYXNzIFV0aWwge1xuICAgIC8qKlxuICAgICAqIFV0aWxzXG4gICAgICovXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGR1cmF0aW9uIHN0cmluZ1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkdXJPYmogVGhlIGR1cmF0aW9uIG9iamVjdFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGR1cmF0aW9uU3RyaW5nKGR1ck9iajogUmVjb3JkPHN0cmluZywgbnVtYmVyPikge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhkdXJPYmopXG4gICAgICAgICAgICAubWFwKChtKSA9PiAoaXNOYU4obSkgPyAwIDogbSkpXG4gICAgICAgICAgICAuam9pbignOicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBtaWxsaXNlY29uZHMgdG8gY29uc3VtYWJsZSB0aW1lIG9iamVjdFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaWxsaXNlY29uZHMgVGhlIHRpbWUgaW4gbXNcbiAgICAgKiBAcmV0dXJucyB7VGltZURhdGF9XG4gICAgICovXG4gICAgc3RhdGljIHBhcnNlTVMobWlsbGlzZWNvbmRzOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKGlzTmFOKG1pbGxpc2Vjb25kcykpIG1pbGxpc2Vjb25kcyA9IDA7XG4gICAgICAgIGNvbnN0IHJvdW5kID0gbWlsbGlzZWNvbmRzID4gMCA/IE1hdGguZmxvb3IgOiBNYXRoLmNlaWw7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRheXM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDg2NDAwMDAwKSxcbiAgICAgICAgICAgIGhvdXJzOiByb3VuZChtaWxsaXNlY29uZHMgLyAzNjAwMDAwKSAlIDI0LFxuICAgICAgICAgICAgbWludXRlczogcm91bmQobWlsbGlzZWNvbmRzIC8gNjAwMDApICUgNjAsXG4gICAgICAgICAgICBzZWNvbmRzOiByb3VuZChtaWxsaXNlY29uZHMgLyAxMDAwKSAlIDYwXG4gICAgICAgIH0gYXMgVGltZURhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIHRpbWUgY29kZVxuICAgICAqIEBwYXJhbSB7VGltZURhdGF9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBvYmplY3RcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBidWlsZFRpbWVDb2RlKGR1cmF0aW9uOiBUaW1lRGF0YSkge1xuICAgICAgICBjb25zdCBpdGVtcyA9IE9iamVjdC5rZXlzKGR1cmF0aW9uKTtcbiAgICAgICAgY29uc3QgcmVxdWlyZWQgPSBbJ2RheXMnLCAnaG91cnMnLCAnbWludXRlcycsICdzZWNvbmRzJ107XG5cbiAgICAgICAgY29uc3QgcGFyc2VkID0gaXRlbXMuZmlsdGVyKCh4KSA9PiByZXF1aXJlZC5pbmNsdWRlcyh4KSkubWFwKChtKSA9PiBkdXJhdGlvblttIGFzIGtleW9mIFRpbWVEYXRhXSk7XG4gICAgICAgIGNvbnN0IGZpbmFsID0gcGFyc2VkXG4gICAgICAgICAgICAuc2xpY2UocGFyc2VkLmZpbmRJbmRleCgoeCkgPT4geCAhPT0gMCkpXG4gICAgICAgICAgICAubWFwKCh4KSA9PiB4LnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSlcbiAgICAgICAgICAgIC5qb2luKCc6Jyk7XG5cbiAgICAgICAgcmV0dXJuIGZpbmFsLmxlbmd0aCA8PSAzID8gYDA6JHtmaW5hbC5wYWRTdGFydCgyLCAnMCcpIHx8IDB9YCA6IGZpbmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBpY2tzIGxhc3QgaXRlbSBvZiB0aGUgZ2l2ZW4gYXJyYXlcbiAgICAgKiBAcGFyYW0ge2FueVtdfSBhcnIgVGhlIGFycmF5XG4gICAgICogQHJldHVybnMge2FueX1cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHN0YXRpYyBsYXN0PFQgPSBhbnk+KGFycjogVFtdKTogVCB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xuICAgICAgICByZXR1cm4gYXJyW2Fyci5sZW5ndGggLSAxXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIHZvaWNlIGNoYW5uZWwgaXMgZW1wdHlcbiAgICAgKiBAcGFyYW0ge1ZvaWNlQ2hhbm5lbHxTdGFnZUNoYW5uZWx9IGNoYW5uZWwgVGhlIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzdGF0aWMgaXNWb2ljZUVtcHR5KGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCkge1xuICAgICAgICByZXR1cm4gY2hhbm5lbCAmJiBjaGFubmVsLm1lbWJlcnMuZmlsdGVyKChtZW1iZXIpID0+ICFtZW1iZXIudXNlci5ib3QpLnNpemUgPT09IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2FmZXIgcmVxdWlyZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBOb2RlIHJlcXVpcmUgaWRcbiAgICAgKiBAcmV0dXJucyB7YW55fVxuICAgICAqL1xuICAgIHN0YXRpYyByZXF1aXJlKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiB7IG1vZHVsZTogcmVxdWlyZShpZCksIGVycm9yOiBudWxsIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtb2R1bGU6IG51bGwsIGVycm9yIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgaW1wb3J0KGlkOiBzdHJpbmcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydChpZCk7XG4gICAgICAgICAgICByZXR1cm4geyBtb2R1bGU6IG1vZCwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG1vZHVsZTogbnVsbCwgZXJyb3IgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzeW5jaHJvbm91cyB0aW1lb3V0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgVGhlIHRpbWUgaW4gbXMgdG8gd2FpdFxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHVua25vd24+fVxuICAgICAqL1xuICAgIHN0YXRpYyB3YWl0KHRpbWU6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dCh0aW1lLCB1bmRlZmluZWQsIHsgcmVmOiBmYWxzZSB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgbm9vcCgpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG5cbiAgICBzdGF0aWMgYXN5bmMgZ2V0RmV0Y2goKSB7XG4gICAgICAgIGlmICgnZmV0Y2gnIGluIGdsb2JhbFRoaXMpIHJldHVybiBnbG9iYWxUaGlzLmZldGNoO1xuICAgICAgICBmb3IgKGNvbnN0IGxpYiBvZiBbJ25vZGUtZmV0Y2gnLCAndW5kaWNpJ10pIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGltcG9ydChsaWIpLnRoZW4oKHJlcykgPT4gcmVzLmZldGNoIHx8IHJlcy5kZWZhdWx0Py5mZXRjaCB8fCByZXMuZGVmYXVsdCk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gcmVxdWlyZShsaWIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzKSByZXR1cm4gcmVzLmZldGNoIHx8IHJlcy5kZWZhdWx0Py5mZXRjaCB8fCByZXMuZGVmYXVsdDtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbm8/XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHdhcm4obWVzc2FnZTogc3RyaW5nLCBjb2RlID0gJ0RlcHJlY2F0aW9uV2FybmluZycsIGRldGFpbD86IHN0cmluZykge1xuICAgICAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKG1lc3NhZ2UsIHtcbiAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICBkZXRhaWxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIHJhbmRvbUNob2ljZTxUPihzcmM6IFRbXSk6IFQge1xuICAgICAgICByZXR1cm4gc3JjW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHNyYy5sZW5ndGgpXTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBWQUxJREFURV9RVUVVRV9DQVAgPSAocXVldWU6IEd1aWxkUXVldWUsIGl0ZW1zOiBQbGF5bGlzdCB8IFRyYWNrIHwgVHJhY2tbXSkgPT4ge1xuICAgIGNvbnN0IHRyYWNrcyA9IGl0ZW1zIGluc3RhbmNlb2YgUGxheWxpc3QgPyBpdGVtcy50cmFja3MgOiBBcnJheS5pc0FycmF5KGl0ZW1zKSA/IGl0ZW1zIDogW2l0ZW1zXTtcblxuICAgIGlmIChxdWV1ZS5tYXhTaXplIDwgMSB8fCBxdWV1ZS5tYXhTaXplID09PSBJbmZpbml0eSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbWF4Q2FwID0gcXVldWUuZ2V0Q2FwYWNpdHkoKTtcblxuICAgIGlmIChtYXhDYXAgPCB0cmFja3MubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX09VVF9PRl9TUEFDRSgndHJhY2tzIHF1ZXVlJywgbWF4Q2FwLCB0cmFja3MubGVuZ3RoKTtcbiAgICB9XG59O1xuXG5leHBvcnQgeyBVdGlsIH07XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi9UcmFjayc7XG5pbXBvcnQgeyBQbGF5bGlzdEluaXREYXRhLCBQbGF5bGlzdEpTT04sIFRyYWNrSlNPTiwgVHJhY2tTb3VyY2UgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBQbGF5bGlzdCB7XG4gICAgcHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyO1xuICAgIHB1YmxpYyB0cmFja3M6IFRyYWNrW107XG4gICAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gICAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcHVibGljIHRodW1ibmFpbDogc3RyaW5nO1xuICAgIHB1YmxpYyB0eXBlOiAnYWxidW0nIHwgJ3BsYXlsaXN0JztcbiAgICBwdWJsaWMgc291cmNlOiBUcmFja1NvdXJjZTtcbiAgICBwdWJsaWMgYXV0aG9yOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgdXJsOiBzdHJpbmc7XG4gICAgfTtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZztcbiAgICBwdWJsaWMgdXJsOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IHJhd1BsYXlsaXN0PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblxuICAgIC8qKlxuICAgICAqIFBsYXlsaXN0IGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllciBUaGUgcGxheWVyXG4gICAgICogQHBhcmFtIHtQbGF5bGlzdEluaXREYXRhfSBkYXRhIFRoZSBkYXRhXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocGxheWVyOiBQbGF5ZXIsIGRhdGE6IFBsYXlsaXN0SW5pdERhdGEpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwbGF5ZXJcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjcGxheWVyXG4gICAgICAgICAqIEB0eXBlIHtQbGF5ZXJ9XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0cmFja3MgaW4gdGhpcyBwbGF5bGlzdFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCN0cmFja3NcbiAgICAgICAgICogQHR5cGUge1RyYWNrW119XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRyYWNrcyA9IGRhdGEudHJhY2tzID8/IFtdO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYXV0aG9yIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjYXV0aG9yXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmF1dGhvciA9IGRhdGEuYXV0aG9yO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZGVzY3JpcHRpb25cbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjZGVzY3JpcHRpb25cbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkYXRhLmRlc2NyaXB0aW9uO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdGh1bWJuYWlsIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjdGh1bWJuYWlsXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRodW1ibmFpbCA9IGRhdGEudGh1bWJuYWlsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcGxheWxpc3QgdHlwZTpcbiAgICAgICAgICogLSBgYWxidW1gXG4gICAgICAgICAqIC0gYHBsYXlsaXN0YFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCN0eXBlXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnR5cGUgPSBkYXRhLnR5cGU7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBzb3VyY2Ugb2YgdGhpcyBwbGF5bGlzdDpcbiAgICAgICAgICogLSBgeW91dHViZWBcbiAgICAgICAgICogLSBgc291bmRjbG91ZGBcbiAgICAgICAgICogLSBgc3BvdGlmeWBcbiAgICAgICAgICogLSBgYXJiaXRyYXJ5YFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNzb3VyY2VcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc291cmNlID0gZGF0YS5zb3VyY2U7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwbGF5bGlzdCBpZFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNpZFxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pZCA9IGRhdGEuaWQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwbGF5bGlzdCB1cmxcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjdXJsXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVybCA9IGRhdGEudXJsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGl0bGUgPSBkYXRhLnRpdGxlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNyYXdQbGF5bGlzdFxuICAgICAgICAgKiBAdHlwZSB7YW55fVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgfVxuXG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICB5aWVsZCogdGhpcy50cmFja3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3MucmVkdWNlKChwLCBjKSA9PiBwICsgYy5kdXJhdGlvbk1TLCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXR0ZWQgZXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGR1cmF0aW9uRm9ybWF0dGVkKCkge1xuICAgICAgICByZXR1cm4gVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyh0aGlzLmVzdGltYXRlZER1cmF0aW9uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICogQHBhcmFtIHtib29sZWFufSBbd2l0aFRyYWNrcz10cnVlXSBJZiBpdCBzaG91bGQgYnVpbGQganNvbiB3aXRoIHRyYWNrc1xuICAgICAqIEByZXR1cm5zIHtQbGF5bGlzdEpTT059XG4gICAgICovXG4gICAgdG9KU09OKHdpdGhUcmFja3MgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAgICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgdGh1bWJuYWlsOiB0aGlzLnRodW1ibmFpbCxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICBhdXRob3I6IHRoaXMuYXV0aG9yLFxuICAgICAgICAgICAgdHJhY2tzOiBbXSBhcyBUcmFja0pTT05bXVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh3aXRoVHJhY2tzKSBwYXlsb2FkLnRyYWNrcyA9IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpO1xuXG4gICAgICAgIHJldHVybiBwYXlsb2FkIGFzIFBsYXlsaXN0SlNPTjtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgVXNlciwgZXNjYXBlTWFya2Rvd24sIFNub3dmbGFrZVV0aWwsIEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUGxheWVyLCBQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQsIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnMgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgUmF3VHJhY2tEYXRhLCBTZWFyY2hRdWVyeVR5cGUsIFRyYWNrSlNPTiB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi9QbGF5bGlzdCc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi4vbWFuYWdlci9HdWlsZFF1ZXVlJztcbmltcG9ydCB7IEJhc2VFeHRyYWN0b3IgfSBmcm9tICcuLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5cbmV4cG9ydCB0eXBlIFRyYWNrUmVzb2x2YWJsZSA9IFRyYWNrIHwgc3RyaW5nIHwgbnVtYmVyO1xuXG5leHBvcnQgdHlwZSBXaXRoTWV0YWRhdGE8VCBleHRlbmRzIG9iamVjdCwgTT4gPSBUICYge1xuICAgIG1ldGFkYXRhOiBNO1xuICAgIHJlcXVlc3RNZXRhZGF0YSgpOiBQcm9taXNlPE0+O1xufTtcblxuZXhwb3J0IGNsYXNzIFRyYWNrPFQgPSB1bmtub3duPiB7XG4gICAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gICAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcHVibGljIGF1dGhvcjogc3RyaW5nO1xuICAgIHB1YmxpYyB1cmw6IHN0cmluZztcbiAgICBwdWJsaWMgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgcHVibGljIGR1cmF0aW9uOiBzdHJpbmc7XG4gICAgcHVibGljIHZpZXdzOiBudW1iZXI7XG4gICAgcHVibGljIHJlcXVlc3RlZEJ5OiBVc2VyIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIHBsYXlsaXN0PzogUGxheWxpc3Q7XG4gICAgcHVibGljIHF1ZXJ5VHlwZTogU2VhcmNoUXVlcnlUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGw7XG4gICAgcHVibGljIHJhdzogUmF3VHJhY2tEYXRhID0ge1xuICAgICAgICBzb3VyY2U6ICdhcmJpdHJhcnknXG4gICAgfSBhcyBSYXdUcmFja0RhdGE7XG4gICAgcHVibGljIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICAgIHByaXZhdGUgX19tZXRhZGF0YTogVCB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX19yZXFNZXRhZGF0YUZuOiAoKSA9PiBQcm9taXNlPFQgfCBudWxsPjtcblxuICAgIC8qKlxuICAgICAqIFRyYWNrIGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgaW5zdGFudGlhdGVkIHRoaXMgVHJhY2tcbiAgICAgKiBAcGFyYW0gZGF0YSBUcmFjayBkYXRhXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllciwgZGF0YTogUGFydGlhbDxXaXRoTWV0YWRhdGE8UmF3VHJhY2tEYXRhLCBUPj4pIHtcbiAgICAgICAgdGhpcy50aXRsZSA9IGVzY2FwZU1hcmtkb3duKGRhdGEudGl0bGUgPz8gJycpO1xuICAgICAgICB0aGlzLmF1dGhvciA9IGRhdGEuYXV0aG9yID8/ICcnO1xuICAgICAgICB0aGlzLnVybCA9IGRhdGEudXJsID8/ICcnO1xuICAgICAgICB0aGlzLnRodW1ibmFpbCA9IGRhdGEudGh1bWJuYWlsID8/ICcnO1xuICAgICAgICB0aGlzLmR1cmF0aW9uID0gZGF0YS5kdXJhdGlvbiA/PyAnJztcbiAgICAgICAgdGhpcy52aWV3cyA9IGRhdGEudmlld3MgPz8gMDtcbiAgICAgICAgdGhpcy5xdWVyeVR5cGUgPSBkYXRhLnF1ZXJ5VHlwZTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0ZWRCeSA9IGRhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5wbGF5bGlzdCA9IGRhdGEucGxheWxpc3Q7XG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBgJHt0aGlzLnRpdGxlfSBieSAke3RoaXMuYXV0aG9yfWA7XG4gICAgICAgIHRoaXMucmF3ID0gT2JqZWN0LmFzc2lnbih7fSwgeyBzb3VyY2U6IGRhdGEucmF3Py5zb3VyY2UgPz8gZGF0YS5zb3VyY2UgfSwgZGF0YS5yYXcgPz8gZGF0YSk7XG4gICAgICAgIHRoaXMuX19tZXRhZGF0YSA9IGRhdGEubWV0YWRhdGEgPz8gbnVsbDtcbiAgICAgICAgdGhpcy5fX3JlcU1ldGFkYXRhRm4gPSBkYXRhLnJlcXVlc3RNZXRhZGF0YSB8fCAoKCkgPT4gUHJvbWlzZS5yZXNvbHZlPFQgfCBudWxsPihudWxsKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBtZXRhZGF0YSBmb3IgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0TWV0YWRhdGEoKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuX19yZXFNZXRhZGF0YUZuKCk7XG5cbiAgICAgICAgdGhpcy5zZXRNZXRhZGF0YShyZXMpO1xuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG1ldGFkYXRhIGZvciB0aGlzIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIHNldE1ldGFkYXRhKG06IFQgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX19tZXRhZGF0YSA9IG07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWV0YWRhdGEgb2YgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWV0YWRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fbWV0YWRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyB0cmFjayBoYXMgbWV0YWRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc01ldGFkYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YSAhPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBxdWV1ZSBpbiB3aGljaCB0aGlzIHRyYWNrIGlzIGxvY2F0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHF1ZXVlKCk6IEd1aWxkUXVldWUge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuZmluZCgocSkgPT4gcS50cmFja3Muc29tZSgoYWIpID0+IGFiLmlkID09PSB0aGlzLmlkKSkhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZHVyYXRpb25NUygpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB0aW1lcyA9IChuOiBudW1iZXIsIHQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgbGV0IHRuID0gMTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdDsgaSsrKSB0biAqPSBuO1xuICAgICAgICAgICAgcmV0dXJuIHQgPD0gMCA/IDEwMDAgOiB0biAqIDEwMDA7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZHVyYXRpb25cbiAgICAgICAgICAgIC5zcGxpdCgnOicpXG4gICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAubWFwKChtLCBpKSA9PiBwYXJzZUludChtKSAqIHRpbWVzKDYwLCBpKSlcbiAgICAgICAgICAgIC5yZWR1Y2UoKGEsIGMpID0+IGEgKyBjLCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHNvdXJjZSBvZiB0aGlzIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGdldCBzb3VyY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJhdz8uc291cmNlID8/ICdhcmJpdHJhcnknO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLnRpdGxlfSBieSAke3RoaXMuYXV0aG9yfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmF3IEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyB0b0pTT04oaGlkZVBsYXlsaXN0PzogYm9vbGVhbikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgICAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAgICAgICB0aHVtYm5haWw6IHRoaXMudGh1bWJuYWlsLFxuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICBkdXJhdGlvbk1TOiB0aGlzLmR1cmF0aW9uTVMsXG4gICAgICAgICAgICB2aWV3czogdGhpcy52aWV3cyxcbiAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiB0aGlzLnJlcXVlc3RlZEJ5Py5pZCB8fCBudWxsLFxuICAgICAgICAgICAgcGxheWxpc3Q6IGhpZGVQbGF5bGlzdCA/IG51bGwgOiB0aGlzLnBsYXlsaXN0Py50b0pTT04oKSA/PyBudWxsXG4gICAgICAgIH0gYXMgVHJhY2tKU09OO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBiZWxvbmdpbmcgcXVldWVzIG9mIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QmVsb25naW5nUXVldWVzKCkge1xuICAgICAgICBjb25zdCBub2RlcyA9IHRoaXMucGxheWVyLm5vZGVzLmNhY2hlLmZpbHRlcigobm9kZSkgPT4gbm9kZS50cmFja3Muc29tZSgodCkgPT4gdC5pZCA9PT0gdGhpcy5pZCkpO1xuXG4gICAgICAgIHJldHVybiBub2RlcyBhcyBDb2xsZWN0aW9uPHN0cmluZywgR3VpbGRRdWV1ZTx1bmtub3duPj47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSB0aGlzIHRyYWNrIHRvIHRoZSBnaXZlbiB2b2ljZSBjaGFubmVsLiBJZiBxdWV1ZSBleGlzdHMgYW5kIGFub3RoZXIgdHJhY2sgaXMgYmVpbmcgcGxheWVkLCB0aGlzIHRyYWNrIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHF1ZXVlLlxuICAgICAqIEBwYXJhbSBjaGFubmVsIFZvaWNlIGNoYW5uZWwgb24gd2hpY2ggdGhpcyB0cmFjayBzaGFsbCBiZSBwbGF5ZWRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBOb2RlIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheTxUID0gdW5rbm93bj4oY2hhbm5lbDogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLCBvcHRpb25zPzogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPik6IFByb21pc2U8UGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgICAgIGNvbnN0IGZuID0gdGhpcy5wbGF5ZXIucGxheS5iaW5kKHRoaXMucGxheWVyKTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgZm4oY2hhbm5lbCwgdGhpcywgb3B0aW9ucyk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFNub3dmbGFrZSwgVXNlciwgVXNlclJlc29sdmFibGUsIFZvaWNlU3RhdGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi4vZmFicmljL1BsYXlsaXN0JztcbmltcG9ydCB7IGRvd25sb2FkT3B0aW9ucyB9IGZyb20gJ3l0ZGwtY29yZSc7XG5pbXBvcnQgeyBRdWVyeUNhY2hlIH0gZnJvbSAnLi4vdXRpbHMvUXVlcnlDYWNoZSc7XG5cbmV4cG9ydCB0eXBlIEZpbHRlcnNOYW1lID0ga2V5b2YgUXVldWVGaWx0ZXJzO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllclNlYXJjaFJlc3VsdCB7XG4gICAgcGxheWxpc3Q6IFBsYXlsaXN0IHwgbnVsbDtcbiAgICB0cmFja3M6IFRyYWNrW107XG59XG5cbi8qKlxuICogQHR5cGVkZWYge0F1ZGlvRmlsdGVyc30gUXVldWVGaWx0ZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVldWVGaWx0ZXJzIHtcbiAgICBiYXNzYm9vc3RfbG93PzogYm9vbGVhbjtcbiAgICBiYXNzYm9vc3Q/OiBib29sZWFuO1xuICAgIGJhc3Nib29zdF9oaWdoPzogYm9vbGVhbjtcbiAgICAnOEQnPzogYm9vbGVhbjtcbiAgICB2YXBvcndhdmU/OiBib29sZWFuO1xuICAgIG5pZ2h0Y29yZT86IGJvb2xlYW47XG4gICAgcGhhc2VyPzogYm9vbGVhbjtcbiAgICB0cmVtb2xvPzogYm9vbGVhbjtcbiAgICB2aWJyYXRvPzogYm9vbGVhbjtcbiAgICByZXZlcnNlPzogYm9vbGVhbjtcbiAgICB0cmVibGU/OiBib29sZWFuO1xuICAgIG5vcm1hbGl6ZXI/OiBib29sZWFuO1xuICAgIG5vcm1hbGl6ZXIyPzogYm9vbGVhbjtcbiAgICBzdXJyb3VuZGluZz86IGJvb2xlYW47XG4gICAgcHVsc2F0b3I/OiBib29sZWFuO1xuICAgIHN1YmJvb3N0PzogYm9vbGVhbjtcbiAgICBrYXJhb2tlPzogYm9vbGVhbjtcbiAgICBmbGFuZ2VyPzogYm9vbGVhbjtcbiAgICBnYXRlPzogYm9vbGVhbjtcbiAgICBoYWFzPzogYm9vbGVhbjtcbiAgICBtY29tcGFuZD86IGJvb2xlYW47XG4gICAgbW9ubz86IGJvb2xlYW47XG4gICAgbXN0bHI/OiBib29sZWFuO1xuICAgIG1zdHJyPzogYm9vbGVhbjtcbiAgICBjb21wcmVzc29yPzogYm9vbGVhbjtcbiAgICBleHBhbmRlcj86IGJvb2xlYW47XG4gICAgc29mdGxpbWl0ZXI/OiBib29sZWFuO1xuICAgIGNob3J1cz86IGJvb2xlYW47XG4gICAgY2hvcnVzMmQ/OiBib29sZWFuO1xuICAgIGNob3J1czNkPzogYm9vbGVhbjtcbiAgICBmYWRlaW4/OiBib29sZWFuO1xuICAgIGRpbT86IGJvb2xlYW47XG4gICAgZWFycmFwZT86IGJvb2xlYW47XG4gICAgbG9maT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIHRyYWNrIHNvdXJjZTpcbiAqIC0gc291bmRjbG91ZFxuICogLSB5b3V0dWJlXG4gKiAtIHNwb3RpZnlcbiAqIC0gYXBwbGVfbXVzaWNcbiAqIC0gYXJiaXRyYXJ5XG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBUcmFja1NvdXJjZVxuICovXG5leHBvcnQgdHlwZSBUcmFja1NvdXJjZSA9ICdzb3VuZGNsb3VkJyB8ICd5b3V0dWJlJyB8ICdzcG90aWZ5JyB8ICdhcHBsZV9tdXNpYycgfCAnYXJiaXRyYXJ5JztcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSYXdUcmFja0RhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aXRsZSBUaGUgdGl0bGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhdXRob3IgVGhlIGF1dGhvclxuICogQHByb3BlcnR5IHtzdHJpbmd9IHVybCBUaGUgdXJsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGh1bWJuYWlsIFRoZSB0aHVtYm5haWxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkdXJhdGlvbiBUaGUgZHVyYXRpb25cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2aWV3cyBUaGUgdmlld3NcbiAqIEBwcm9wZXJ0eSB7VXNlcn0gcmVxdWVzdGVkQnkgVGhlIHVzZXIgd2hvIHJlcXVlc3RlZCB0aGlzIHRyYWNrXG4gKiBAcHJvcGVydHkge1BsYXlsaXN0fSBbcGxheWxpc3RdIFRoZSBwbGF5bGlzdFxuICogQHByb3BlcnR5IHtUcmFja1NvdXJjZX0gW3NvdXJjZT1cImFyYml0cmFyeVwiXSBUaGUgc291cmNlXG4gKiBAcHJvcGVydHkge2FueX0gW2VuZ2luZV0gVGhlIGVuZ2luZVxuICogQHByb3BlcnR5IHtib29sZWFufSBbbGl2ZV0gSWYgdGhpcyB0cmFjayBpcyBsaXZlXG4gKiBAcHJvcGVydHkge2FueX0gW3Jhd10gVGhlIHJhdyBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmF3VHJhY2tEYXRhIHtcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgYXV0aG9yOiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgZHVyYXRpb246IHN0cmluZztcbiAgICB2aWV3czogbnVtYmVyO1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG4gICAgcGxheWxpc3Q/OiBQbGF5bGlzdDtcbiAgICBzb3VyY2U/OiBUcmFja1NvdXJjZTtcbiAgICBlbmdpbmU/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGxpdmU/OiBib29sZWFuO1xuICAgIHJhdz86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcXVlcnlUeXBlPzogU2VhcmNoUXVlcnlUeXBlO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFRpbWVEYXRhXG4gKiBAcHJvcGVydHkge251bWJlcn0gZGF5cyBUaW1lIGluIGRheXNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBob3VycyBUaW1lIGluIGhvdXJzXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWludXRlcyBUaW1lIGluIG1pbnV0ZXNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzZWNvbmRzIFRpbWUgaW4gc2Vjb25kc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVEYXRhIHtcbiAgICBkYXlzOiBudW1iZXI7XG4gICAgaG91cnM6IG51bWJlcjtcbiAgICBtaW51dGVzOiBudW1iZXI7XG4gICAgc2Vjb25kczogbnVtYmVyO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBsYXllclByb2dyZXNzYmFyT3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbdGltZWNvZGVzXSBJZiBpdCBzaG91bGQgcmVuZGVyIHRpbWUgY29kZXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3F1ZXVlXSBJZiBpdCBzaG91bGQgY3JlYXRlIHByb2dyZXNzIGJhciBmb3IgdGhlIHdob2xlIHF1ZXVlXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2xlbmd0aF0gVGhlIGJhciBsZW5ndGhcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbGluZV0gVGhlIGJhciB0cmFja1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpbmRpY2F0b3JdIFRoZSBpbmRpY2F0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJQcm9ncmVzc2Jhck9wdGlvbnMge1xuICAgIHRpbWVjb2Rlcz86IGJvb2xlYW47XG4gICAgbGVuZ3RoPzogbnVtYmVyO1xuICAgIGxpbmU/OiBzdHJpbmc7XG4gICAgaW5kaWNhdG9yPzogc3RyaW5nO1xuICAgIHF1ZXVlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgc2VhcmNoIHF1ZXJ5IHR5cGVcbiAqIFRoaXMgY2FuIGJlIG9uZSBvZjpcbiAqIC0gQVVUT1xuICogLSBZT1VUVUJFXG4gKiAtIFlPVVRVQkVfUExBWUxJU1RcbiAqIC0gU09VTkRDTE9VRF9UUkFDS1xuICogLSBTT1VORENMT1VEX1BMQVlMSVNUXG4gKiAtIFNPVU5EQ0xPVURcbiAqIC0gU1BPVElGWV9TT05HXG4gKiAtIFNQT1RJRllfQUxCVU1cbiAqIC0gU1BPVElGWV9QTEFZTElTVFxuICogLSBTUE9USUZZX1NFQVJDSFxuICogLSBGQUNFQk9PS1xuICogLSBWSU1FT1xuICogLSBBUkJJVFJBUllcbiAqIC0gUkVWRVJCTkFUSU9OXG4gKiAtIFlPVVRVQkVfU0VBUkNIXG4gKiAtIFlPVVRVQkVfVklERU9cbiAqIC0gU09VTkRDTE9VRF9TRUFSQ0hcbiAqIC0gQVBQTEVfTVVTSUNfU09OR1xuICogLSBBUFBMRV9NVVNJQ19BTEJVTVxuICogLSBBUFBMRV9NVVNJQ19QTEFZTElTVFxuICogLSBBUFBMRV9NVVNJQ19TRUFSQ0hcbiAqIC0gRklMRVxuICogLSBBVVRPX1NFQVJDSFxuICogQHR5cGVkZWYge3N0cmluZ30gUXVlcnlUeXBlXG4gKi9cbmV4cG9ydCBjb25zdCBRdWVyeVR5cGUgPSB7XG4gICAgQVVUTzogJ2F1dG8nLFxuICAgIFlPVVRVQkU6ICd5b3V0dWJlJyxcbiAgICBZT1VUVUJFX1BMQVlMSVNUOiAneW91dHViZVBsYXlsaXN0JyxcbiAgICBTT1VORENMT1VEX1RSQUNLOiAnc291bmRjbG91ZFRyYWNrJyxcbiAgICBTT1VORENMT1VEX1BMQVlMSVNUOiAnc291bmRjbG91ZFBsYXlsaXN0JyxcbiAgICBTT1VORENMT1VEOiAnc291bmRjbG91ZCcsXG4gICAgU1BPVElGWV9TT05HOiAnc3BvdGlmeVNvbmcnLFxuICAgIFNQT1RJRllfQUxCVU06ICdzcG90aWZ5QWxidW0nLFxuICAgIFNQT1RJRllfUExBWUxJU1Q6ICdzcG90aWZ5UGxheWxpc3QnLFxuICAgIFNQT1RJRllfU0VBUkNIOiAnc3BvdGlmeVNlYXJjaCcsXG4gICAgRkFDRUJPT0s6ICdmYWNlYm9vaycsXG4gICAgVklNRU86ICd2aW1lbycsXG4gICAgQVJCSVRSQVJZOiAnYXJiaXRyYXJ5JyxcbiAgICBSRVZFUkJOQVRJT046ICdyZXZlcmJuYXRpb24nLFxuICAgIFlPVVRVQkVfU0VBUkNIOiAneW91dHViZVNlYXJjaCcsXG4gICAgWU9VVFVCRV9WSURFTzogJ3lvdXR1YmVWaWRlbycsXG4gICAgU09VTkRDTE9VRF9TRUFSQ0g6ICdzb3VuZGNsb3VkU2VhcmNoJyxcbiAgICBBUFBMRV9NVVNJQ19TT05HOiAnYXBwbGVNdXNpY1NvbmcnLFxuICAgIEFQUExFX01VU0lDX0FMQlVNOiAnYXBwbGVNdXNpY0FsYnVtJyxcbiAgICBBUFBMRV9NVVNJQ19QTEFZTElTVDogJ2FwcGxlTXVzaWNQbGF5bGlzdCcsXG4gICAgQVBQTEVfTVVTSUNfU0VBUkNIOiAnYXBwbGVNdXNpY1NlYXJjaCcsXG4gICAgRklMRTogJ2ZpbGUnLFxuICAgIEFVVE9fU0VBUkNIOiAnYXV0b1NlYXJjaCdcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNlYXJjaFF1ZXJ5VHlwZSA9IGtleW9mIHR5cGVvZiBRdWVyeVR5cGUgfCAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyRXZlbnRzIHtcbiAgICBkZWJ1ZzogKG1lc3NhZ2U6IHN0cmluZykgPT4gYW55O1xuICAgIGVycm9yOiAoZXJyb3I6IEVycm9yKSA9PiBhbnk7XG4gICAgdm9pY2VTdGF0ZVVwZGF0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlLCBvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpID0+IGFueTtcbn1cblxuZXhwb3J0IGVudW0gUGxheWVyRXZlbnQge1xuICAgIGRlYnVnID0gJ2RlYnVnJyxcbiAgICBlcnJvciA9ICdlcnJvcicsXG4gICAgdm9pY2VTdGF0ZVVwZGF0ZSA9ICd2b2ljZVN0YXRlVXBkYXRlJ1xufVxuXG4vKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQbGF5T3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbZmlsdGVyc1VwZGF0ZT1mYWxzZV0gSWYgdGhpcyBwbGF5IHdhcyB0cmlnZ2VyZWQgZm9yIGZpbHRlcnMgdXBkYXRlXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbZW5jb2RlckFyZ3M9W11dIEZGbXBlZyBhcmdzIHBhc3NlZCB0byBlbmNvZGVyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3NlZWtdIFRpbWUgdG8gc2VlayB0byBiZWZvcmUgcGxheWluZ1xuICogQHByb3BlcnR5IHtib29sZWFufSBbaW1tZWRpYXRlPWZhbHNlXSBJZiBpdCBzaG91bGQgc3RhcnQgcGxheWluZyB0aGUgcHJvdmlkZWQgdHJhY2sgaW1tZWRpYXRlbHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF5T3B0aW9ucyB7XG4gICAgZmlsdGVyc1VwZGF0ZT86IGJvb2xlYW47XG4gICAgZW5jb2RlckFyZ3M/OiBzdHJpbmdbXTtcbiAgICBzZWVrPzogbnVtYmVyO1xuICAgIGltbWVkaWF0ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5RXh0cmFjdG9yU2VhcmNoID0gYGV4dDoke3N0cmluZ31gO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlYXJjaE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7VXNlclJlc29sdmFibGV9IHJlcXVlc3RlZEJ5IFRoZSB1c2VyIHdobyByZXF1ZXN0ZWQgdGhpcyBzZWFyY2hcbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIFF1ZXJ5VHlwZXxzdHJpbmd9IFtzZWFyY2hFbmdpbmU9J2F1dG8nXSBUaGUgcXVlcnkgc2VhcmNoIGVuZ2luZSwgY2FuIGJlIGV4dHJhY3RvciBuYW1lIHRvIHRhcmdldCBzcGVjaWZpYyBvbmUgKGN1c3RvbSlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtibG9ja0V4dHJhY3RvcnNbXV0gTGlzdCBvZiB0aGUgZXh0cmFjdG9ycyB0byBibG9ja1xuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlQ2FjaGVdIElmIGl0IHNob3VsZCBpZ25vcmUgcXVlcnkgY2FjaGUgbG9va3VwXG4gKiBAcHJvcGVydHkge1NlYXJjaFF1ZXJ5VHlwZX0gW2ZhbGxiYWNrU2VhcmNoRW5naW5lPSdhdXRvU2VhcmNoJ10gRmFsbGJhY2sgc2VhcmNoIGVuZ2luZSB0byB1c2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hPcHRpb25zIHtcbiAgICByZXF1ZXN0ZWRCeT86IFVzZXJSZXNvbHZhYmxlO1xuICAgIHNlYXJjaEVuZ2luZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoO1xuICAgIGJsb2NrRXh0cmFjdG9ycz86IHN0cmluZ1tdO1xuICAgIGlnbm9yZUNhY2hlPzogYm9vbGVhbjtcbiAgICBmYWxsYmFja1NlYXJjaEVuZ2luZT86ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXTtcbn1cblxuLyoqXG4gKiBUaGUgcXVldWUgcmVwZWF0IG1vZGUuIFRoaXMgY2FuIGJlIG9uZSBvZjpcbiAqIC0gT0ZGXG4gKiAtIFRSQUNLXG4gKiAtIFFVRVVFXG4gKiAtIEFVVE9QTEFZXG4gKiBAdHlwZWRlZiB7bnVtYmVyfSBRdWV1ZVJlcGVhdE1vZGVcbiAqL1xuZXhwb3J0IGVudW0gUXVldWVSZXBlYXRNb2RlIHtcbiAgICBPRkYgPSAwLFxuICAgIFRSQUNLID0gMSxcbiAgICBRVUVVRSA9IDIsXG4gICAgQVVUT1BMQVkgPSAzXG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGxheWxpc3RJbml0RGF0YVxuICogQHByb3BlcnR5IHtUcmFja1tdfSB0cmFja3MgVGhlIHRyYWNrcyBvZiB0aGlzIHBsYXlsaXN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGl0bGUgVGhlIHBsYXlsaXN0IHRpdGxlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGh1bWJuYWlsIFRoZSB0aHVtYm5haWxcbiAqIEBwcm9wZXJ0eSB7YWxidW18cGxheWxpc3R9IHR5cGUgVGhlIHBsYXlsaXN0IHR5cGU6IGBhbGJ1bWAgfCBgcGxheWxpc3RgXG4gKiBAcHJvcGVydHkge1RyYWNrU291cmNlfSBzb3VyY2UgVGhlIHBsYXlsaXN0IHNvdXJjZVxuICogQHByb3BlcnR5IHtvYmplY3R9IGF1dGhvciBUaGUgcGxheWxpc3QgYXV0aG9yXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2F1dGhvci5uYW1lXSBUaGUgYXV0aG9yIG5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYXV0aG9yLnVybF0gVGhlIGF1dGhvciB1cmxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCBUaGUgcGxheWxpc3QgaWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmwgVGhlIHBsYXlsaXN0IHVybFxuICogQHByb3BlcnR5IHthbnl9IFtyYXdQbGF5bGlzdF0gVGhlIHJhdyBwbGF5bGlzdCBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWxpc3RJbml0RGF0YSB7XG4gICAgdHJhY2tzOiBUcmFja1tdO1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICB0aHVtYm5haWw6IHN0cmluZztcbiAgICB0eXBlOiAnYWxidW0nIHwgJ3BsYXlsaXN0JztcbiAgICBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAgIGF1dGhvcjoge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIHVybDogc3RyaW5nO1xuICAgIH07XG4gICAgaWQ6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbiAgICByYXdQbGF5bGlzdD86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVHJhY2tKU09OXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGl0bGUgVGhlIHRyYWNrIHRpdGxlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVzY3JpcHRpb24gVGhlIHRyYWNrIGRlc2NyaXB0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXV0aG9yIFRoZSBhdXRob3JcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmwgVGhlIHVybFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRodW1ibmFpbCBUaGUgdGh1bWJuYWlsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZHVyYXRpb24gVGhlIGR1cmF0aW9uXG4gKiBAcHJvcGVydHkge251bWJlcn0gZHVyYXRpb25NUyBUaGUgZHVyYXRpb24gaW4gbXNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2aWV3cyBUaGUgdmlld3MgY291bnRcbiAqIEBwcm9wZXJ0eSB7U25vd2ZsYWtlfSByZXF1ZXN0ZWRCeSBUaGUgaWQgb2YgdGhlIHVzZXIgd2hvIHJlcXVlc3RlZCB0aGlzIHRyYWNrXG4gKiBAcHJvcGVydHkge1BsYXlsaXN0SlNPTn0gW3BsYXlsaXN0XSBUaGUgcGxheWxpc3QgaW5mbyAoaWYgYW55KVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYWNrSlNPTiB7XG4gICAgaWQ6IFNub3dmbGFrZTtcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgYXV0aG9yOiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgZHVyYXRpb246IHN0cmluZztcbiAgICBkdXJhdGlvbk1TOiBudW1iZXI7XG4gICAgdmlld3M6IG51bWJlcjtcbiAgICByZXF1ZXN0ZWRCeTogU25vd2ZsYWtlO1xuICAgIHBsYXlsaXN0PzogUGxheWxpc3RKU09OO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBsYXlsaXN0SlNPTlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIFRoZSBwbGF5bGlzdCBpZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHVybCBUaGUgcGxheWxpc3QgdXJsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGl0bGUgVGhlIHBsYXlsaXN0IHRpdGxlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVzY3JpcHRpb24gVGhlIHBsYXlsaXN0IGRlc2NyaXB0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGh1bWJuYWlsIFRoZSB0aHVtYm5haWxcbiAqIEBwcm9wZXJ0eSB7YWxidW18cGxheWxpc3R9IHR5cGUgVGhlIHBsYXlsaXN0IHR5cGU6IGBhbGJ1bWAgfCBgcGxheWxpc3RgXG4gKiBAcHJvcGVydHkge1RyYWNrU291cmNlfSBzb3VyY2UgVGhlIHRyYWNrIHNvdXJjZVxuICogQHByb3BlcnR5IHtvYmplY3R9IGF1dGhvciBUaGUgcGxheWxpc3QgYXV0aG9yXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2F1dGhvci5uYW1lXSBUaGUgYXV0aG9yIG5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYXV0aG9yLnVybF0gVGhlIGF1dGhvciB1cmxcbiAqIEBwcm9wZXJ0eSB7VHJhY2tKU09OW119IHRyYWNrcyBUaGUgdHJhY2tzIGRhdGEgKGlmIGFueSlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF5bGlzdEpTT04ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHRodW1ibmFpbDogc3RyaW5nO1xuICAgIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICAgIHNvdXJjZTogVHJhY2tTb3VyY2U7XG4gICAgYXV0aG9yOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgdXJsOiBzdHJpbmc7XG4gICAgfTtcbiAgICB0cmFja3M6IFRyYWNrSlNPTltdO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBsYXllckluaXRPcHRpb25zXG4gKiBAcHJvcGVydHkge1lURExEb3dubG9hZE9wdGlvbnN9IFt5dGRsT3B0aW9uc10gVGhlIG9wdGlvbnMgcGFzc2VkIHRvIGB5dGRsLWNvcmVgXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2Nvbm5lY3Rpb25UaW1lb3V0PTIwMDAwXSBUaGUgdm9pY2UgY29ubmVjdGlvbiB0aW1lb3V0XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsYWdNb25pdG9yPTMwMDAwXSBUaW1lIGluIG1zIHRvIHJlLW1vbml0b3IgZXZlbnQgbG9vcCBsYWdcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvY2tWb2ljZVN0YXRlSGFuZGxlcl0gUHJldmVudCB2b2ljZSBzdGF0ZSBoYW5kbGVyIGZyb20gYmVpbmcgb3ZlcnJpZGRlblxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2Jsb2NrRXh0cmFjdG9yc10gTGlzdCBvZiBleHRyYWN0b3JzIHRvIGRpc2FibGUgcXVlcnlpbmcgbWV0YWRhdGEgZnJvbVxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2Jsb2NrU3RyZWFtRnJvbV0gTGlzdCBvZiBleHRyYWN0b3JzIHRvIGRpc2FibGUgc3RyZWFtaW5nIGZyb21cbiAqIEBwcm9wZXJ0eSB7UXVlcnlDYWNoZSB8IG51bGx9IFtxdWVyeUNhY2hlXSBRdWVyeSBjYWNoZSBwcm92aWRlclxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlSW5zdGFuY2VdIElnbm9yZSBwbGF5ZXIgaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VzZUxlZ2FjeUZGbXBlZ10gVXNlIGxlZ2FjeSB2ZXJzaW9uIG9mIGZmbXBlZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllckluaXRPcHRpb25zIHtcbiAgICB5dGRsT3B0aW9ucz86IGRvd25sb2FkT3B0aW9ucztcbiAgICBjb25uZWN0aW9uVGltZW91dD86IG51bWJlcjtcbiAgICBsYWdNb25pdG9yPzogbnVtYmVyO1xuICAgIGxvY2tWb2ljZVN0YXRlSGFuZGxlcj86IGJvb2xlYW47XG4gICAgYmxvY2tFeHRyYWN0b3JzPzogc3RyaW5nW107XG4gICAgYmxvY2tTdHJlYW1Gcm9tPzogc3RyaW5nW107XG4gICAgcXVlcnlDYWNoZT86IFF1ZXJ5Q2FjaGUgfCBudWxsO1xuICAgIGlnbm9yZUluc3RhbmNlPzogYm9vbGVhbjtcbiAgICB1c2VMZWdhY3lGRm1wZWc/OiBib29sZWFuO1xufVxuIiwgImltcG9ydCB7IFVzZXIgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IEJhc2VFeHRyYWN0b3IgfSBmcm9tICcuLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoLCBRdWVyeVR5cGUsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi9QbGF5bGlzdCc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4vVHJhY2snO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFJlc3VsdERhdGEge1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG4gICAgcXVlcnlUeXBlPzogU2VhcmNoUXVlcnlUeXBlIHwgUXVlcnlFeHRyYWN0b3JTZWFyY2ggfCBudWxsO1xuICAgIGV4dHJhY3Rvcj86IEJhc2VFeHRyYWN0b3IgfCBudWxsO1xuICAgIHBsYXlsaXN0PzogUGxheWxpc3QgfCBudWxsO1xuICAgIHRyYWNrcz86IFRyYWNrW107XG4gICAgcmVxdWVzdGVkQnk/OiBVc2VyIHwgbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIFNlYXJjaFJlc3VsdCB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllciwgcHJpdmF0ZSBfZGF0YTogU2VhcmNoUmVzdWx0RGF0YSkge1xuICAgICAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgICAgICAgIHRyYWNrLmV4dHJhY3RvciA/Pz0gdGhpcy5fZGF0YS5leHRyYWN0b3IgfHwgbnVsbDtcbiAgICAgICAgICAgIHRyYWNrLnJlcXVlc3RlZEJ5ID8/PSBfZGF0YS5yZXF1ZXN0ZWRCeSB8fCBudWxsO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0UXVlcnlUeXBlKHR5cGU6IFNlYXJjaFF1ZXJ5VHlwZSB8IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoKSB7XG4gICAgICAgIHRoaXMuX2RhdGEucXVlcnlUeXBlID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFJlcXVlc3RlZEJ5KHVzZXI6IFVzZXIpIHtcbiAgICAgICAgdGhpcy5fZGF0YS5yZXF1ZXN0ZWRCeSA9IHVzZXI7XG4gICAgICAgIHRoaXMuX2RhdGEudHJhY2tzPy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgICAgICAgdHJhY2sucmVxdWVzdGVkQnkgPSB1c2VyO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldEV4dHJhY3RvcihleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpIHtcbiAgICAgICAgdGhpcy5fZGF0YS5leHRyYWN0b3IgPSBleHRyYWN0b3I7XG4gICAgICAgIHRoaXMuX2RhdGEudHJhY2tzPy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgICAgICAgdHJhY2suZXh0cmFjdG9yID0gZXh0cmFjdG9yO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFRyYWNrcyh0cmFja3M6IFRyYWNrW10pIHtcbiAgICAgICAgdGhpcy5fZGF0YS50cmFja3MgPSB0cmFja3M7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRRdWVyeShxdWVyeTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2RhdGEucXVlcnkgPSBxdWVyeTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFBsYXlsaXN0KHBsYXlsaXN0OiBQbGF5bGlzdCkge1xuICAgICAgICB0aGlzLl9kYXRhLnBsYXlsaXN0ID0gcGxheWxpc3Q7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBzZWFyY2ggcXVlcnlcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHF1ZXJ5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5xdWVyeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2VhcmNoIHF1ZXJ5IHR5cGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHF1ZXJ5VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEucXVlcnlUeXBlIHx8IFF1ZXJ5VHlwZS5BVVRPO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBleHRyYWN0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGV4dHJhY3RvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEuZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheWxpc3QgcmVzdWx0XG4gICAgICovXG4gICAgcHVibGljIGdldCBwbGF5bGlzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEucGxheWxpc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhY2tzIHJlc3VsdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdHJhY2tzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS50cmFja3MgfHwgW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdGVkIGJ5XG4gICAgICovXG4gICAgcHVibGljIGdldCByZXF1ZXN0ZWRCeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZS1leGVjdXRlIHRoaXMgc2VhcmNoXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllci5zZWFyY2godGhpcy5xdWVyeSwge1xuICAgICAgICAgICAgc2VhcmNoRW5naW5lOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiB0aGlzLnJlcXVlc3RlZEJ5IVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGlzIHNlYXJjaCByZXN1bHQgaXMgZW1wdHlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnRyYWNrcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGhhcyBwbGF5bGlzdFxuICAgICAqL1xuICAgIHB1YmxpYyBoYXNQbGF5bGlzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWxpc3QgIT0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGlzIHNlYXJjaCByZXN1bHQgaGFzIHRyYWNrc1xuICAgICAqL1xuICAgIHB1YmxpYyBoYXNUcmFja3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzZWFyY2hcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcXVlcnk6IHRoaXMucXVlcnksXG4gICAgICAgICAgICBxdWVyeVR5cGU6IHRoaXMucXVlcnlUeXBlLFxuICAgICAgICAgICAgcGxheWxpc3Q6IHRoaXMucGxheWxpc3Q/LnRvSlNPTihmYWxzZSkgfHwgbnVsbCxcbiAgICAgICAgICAgIHRyYWNrczogdGhpcy50cmFja3MubWFwKChtKSA9PiBtLnRvSlNPTih0cnVlKSksXG4gICAgICAgICAgICBleHRyYWN0b3I6IHRoaXMuZXh0cmFjdG9yPy5pZGVudGlmaWVyIHx8IG51bGwsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeT8udG9KU09OKCkgfHwgbnVsbFxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBGaWx0ZXJzTmFtZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcblxuY29uc3QgYmFzcyA9IChnOiBudW1iZXIpID0+IGBiYXNzPWc9JHtnfTpmPTExMDp3PTAuM2A7XG5cbmV4cG9ydCBjbGFzcyBBdWRpb0ZpbHRlcnMge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvRmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZpbHRlcnM6IFJlY29yZDxGaWx0ZXJzTmFtZSwgc3RyaW5nPiA9IHtcbiAgICAgICAgYmFzc2Jvb3N0X2xvdzogYmFzcygxNSksXG4gICAgICAgIGJhc3Nib29zdDogYmFzcygyMCksXG4gICAgICAgIGJhc3Nib29zdF9oaWdoOiBiYXNzKDMwKSxcbiAgICAgICAgJzhEJzogJ2FwdWxzYXRvcj1oej0wLjA5JyxcbiAgICAgICAgdmFwb3J3YXZlOiAnYXJlc2FtcGxlPTQ4MDAwLGFzZXRyYXRlPTQ4MDAwKjAuOCcsXG4gICAgICAgIG5pZ2h0Y29yZTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCoxLjI1JyxcbiAgICAgICAgbG9maTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCowLjksZXh0cmFzdGVyZW89bT0yLjU6Yz1kaXNhYmxlZCcsXG4gICAgICAgIHBoYXNlcjogJ2FwaGFzZXI9aW5fZ2Fpbj0wLjQnLFxuICAgICAgICB0cmVtb2xvOiAndHJlbW9sbycsXG4gICAgICAgIHZpYnJhdG86ICd2aWJyYXRvPWY9Ni41JyxcbiAgICAgICAgcmV2ZXJzZTogJ2FyZXZlcnNlJyxcbiAgICAgICAgdHJlYmxlOiAndHJlYmxlPWc9NScsXG4gICAgICAgIG5vcm1hbGl6ZXIyOiAnZHluYXVkbm9ybT1nPTEwMScsXG4gICAgICAgIG5vcm1hbGl6ZXI6ICdhY29tcHJlc3NvcicsXG4gICAgICAgIHN1cnJvdW5kaW5nOiAnc3Vycm91bmQnLFxuICAgICAgICBwdWxzYXRvcjogJ2FwdWxzYXRvcj1oej0xJyxcbiAgICAgICAgc3ViYm9vc3Q6ICdhc3ViYm9vc3QnLFxuICAgICAgICBrYXJhb2tlOiAnc3RlcmVvdG9vbHM9bWxldj0wLjAzJyxcbiAgICAgICAgZmxhbmdlcjogJ2ZsYW5nZXInLFxuICAgICAgICBnYXRlOiAnYWdhdGUnLFxuICAgICAgICBoYWFzOiAnaGFhcycsXG4gICAgICAgIG1jb21wYW5kOiAnbWNvbXBhbmQnLFxuICAgICAgICBtb25vOiAncGFuPW1vbm98YzA9LjUqYzArLjUqYzEnLFxuICAgICAgICBtc3RscjogJ3N0ZXJlb3Rvb2xzPW1vZGU9bXM+bHInLFxuICAgICAgICBtc3RycjogJ3N0ZXJlb3Rvb2xzPW1vZGU9bXM+cnInLFxuICAgICAgICBjb21wcmVzc29yOiAnY29tcGFuZD1wb2ludHM9LTgwLy0xMDV8LTYyLy04MHwtMTUuNC8tMTUuNHwwLy0xMnwyMC8tNy42JyxcbiAgICAgICAgZXhwYW5kZXI6ICdjb21wYW5kPWF0dGFja3M9MDpwb2ludHM9LTgwLy0xNjl8LTU0Ly04MHwtNDkuNS8tNjQuNnwtNDEuMS8tNDEuMXwtMjUuOC8tMTV8LTEwLjgvLTQuNXwwLzB8MjAvOC4zJyxcbiAgICAgICAgc29mdGxpbWl0ZXI6ICdjb21wYW5kPWF0dGFja3M9MDpwb2ludHM9LTgwLy04MHwtMTIuNC8tMTIuNHwtNi8tOHwwLy02Ljh8MjAvLTIuOCcsXG4gICAgICAgIGNob3J1czogJ2Nob3J1cz0wLjc6MC45OjU1OjAuNDowLjI1OjInLFxuICAgICAgICBjaG9ydXMyZDogJ2Nob3J1cz0wLjY6MC45OjUwfDYwOjAuNHwwLjMyOjAuMjV8MC40OjJ8MS4zJyxcbiAgICAgICAgY2hvcnVzM2Q6ICdjaG9ydXM9MC41OjAuOTo1MHw2MHw0MDowLjR8MC4zMnwwLjM6MC4yNXwwLjR8MC4zOjJ8Mi4zfDEuMycsXG4gICAgICAgIGZhZGVpbjogJ2FmYWRlPXQ9aW46c3M9MDpkPTEwJyxcbiAgICAgICAgZGltOiBgYWZmdGZpbHQ9XCIncmVhbD1yZSAqICgxLWNsaXAoKGIvbmIpKmIsMCwxKSknOmltYWc9J2ltICogKDEtY2xpcCgoYi9uYikqYiwwLDEpKSdcImAsXG4gICAgICAgIGVhcnJhcGU6ICdjaGFubmVsc3BsaXQsc2lkZWNoYWluZ2F0ZT1sZXZlbF9pbj02NCdcbiAgICB9O1xuXG4gICAgcHVibGljIHN0YXRpYyBnZXQ8SyBleHRlbmRzIEZpbHRlcnNOYW1lPihuYW1lOiBLKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcnNbbmFtZV0gPz8gbmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGhhczxLIGV4dGVuZHMgRmlsdGVyc05hbWU+KG5hbWU6IEspIHtcbiAgICAgICAgcmV0dXJuIG5hbWUgaW4gdGhpcy5maWx0ZXJzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgKltTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8eyBuYW1lOiBGaWx0ZXJzTmFtZTsgdmFsdWU6IHN0cmluZyB9PiB7XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZmlsdGVycykpIHtcbiAgICAgICAgICAgIHlpZWxkIHsgbmFtZTogayBhcyBGaWx0ZXJzTmFtZSwgdmFsdWU6IHYgYXMgc3RyaW5nIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldCBuYW1lcygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZmlsdGVycykgYXMgRmlsdGVyc05hbWVbXTtcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEF1ZGlvRmlsdGVycy5sZW5ndGhcbiAgICBwdWJsaWMgc3RhdGljIGdldCBsZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWVzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lcy5tYXAoKG0pID0+ICh0aGlzIGFzIGFueSlbbV0pLmpvaW4oJywnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGZmbXBlZyBhcmdzIGZyb20gdGhlIHNwZWNpZmllZCBmaWx0ZXJzIG5hbWVcbiAgICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgbmFtZVxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGU8SyBleHRlbmRzIEZpbHRlcnNOYW1lPihmaWx0ZXJzPzogS1tdKSB7XG4gICAgICAgIGlmICghZmlsdGVycyB8fCAhQXJyYXkuaXNBcnJheShmaWx0ZXJzKSkgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTtcbiAgICAgICAgcmV0dXJuIGZpbHRlcnNcbiAgICAgICAgICAgIC5maWx0ZXIoKHByZWRpY2F0ZSkgPT4gdHlwZW9mIHByZWRpY2F0ZSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAubWFwKChtKSA9PiB0aGlzLmdldChtKSlcbiAgICAgICAgICAgIC5qb2luKCcsJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBhdWRpbyBmaWx0ZXJcbiAgICAgKiBAcGFyYW0gZmlsdGVyTmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsdGVyXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSBmZm1wZWcgYXJnc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lKGZpbHRlck5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLmZpbHRlcnNbZmlsdGVyTmFtZSBhcyBGaWx0ZXJzTmFtZV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIG11bHRpcGxlIGF1ZGlvIGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gZmlsdGVyc0FycmF5IEFycmF5IG9mIGZpbHRlcnMgY29udGFpbmluZyB0aGUgZmlsdGVyIG5hbWUgYW5kIGZmbXBlZyBhcmdzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmVCdWxrKGZpbHRlcnNBcnJheTogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdKSB7XG4gICAgICAgIGZpbHRlcnNBcnJheS5mb3JFYWNoKChhcnIpID0+IHRoaXMuZGVmaW5lKGFyci5uYW1lLCBhcnIudmFsdWUpKTtcbiAgICB9XG59XG4iLCAiY29uc3QgRGlzY29yZFBsYXllckVycm9ycyA9IHtcbiAgICBFUlJfT1VUX09GX1NQQUNFOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfT1VUX09GX1NQQUNFJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKHRhcmdldDogc3RyaW5nLCBjYXBhY2l0eTogbnVtYmVyLCB0b3RhbDogbnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gYE1heCBjYXBhY2l0eSByZWFjaGVkIGZvciAke3RhcmdldH0gKENhcGFjaXR5ICR7Y2FwYWNpdHl9L1RvdGFsICR7dG90YWx9KWA7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9JTlZBTElEX0FSR19UWVBFOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfSU5WQUxJRF9BUkdfVFlQRScsXG4gICAgICAgIHR5cGU6IFR5cGVFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcsIGV4cGVjdGF0aW9uOiBzdHJpbmcsIGZvdW5kOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgRXhwZWN0ZWQgJHt0YXJnZXR9IHRvIGJlIFwiJHtleHBlY3RhdGlvbn1cIiwgcmVjZWl2ZWQgXCIke2ZvdW5kfVwiYDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX05PX1JFU1VMVDoge1xuICAgICAgICBuYW1lOiAnRVJSX05PX1JFU1VMVCcsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9UX0lNUExFTUVOVEVEOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfTk9UX0lNUExFTUVOVEVEJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKHRhcmdldDogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7dGFyZ2V0fSBpcyBub3QgeWV0IGltcGxlbWVudGVkYDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX05PVF9FWElTVElORzoge1xuICAgICAgICBuYW1lOiAnRVJSX05PVF9FWElTVElORycsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGAke3RhcmdldH0gZG9lcyBub3QgZXhpc3RgO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfT1VUX09GX1JBTkdFOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfT1VUX09GX1JBTkdFJyxcbiAgICAgICAgdHlwZTogUmFuZ2VFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIG1pbmltdW06IHN0cmluZywgbWF4aW11bTogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7dGFyZ2V0fSBpcyBvdXQgb2YgcmFuZ2UgKEV4cGVjdGVkIG1pbmltdW0gJHttYXhpbXVtfSBhbmQgbWF4aW11bSAke21heGltdW19LCBnb3QgJHt2YWx1ZX0pYDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX05PX1ZPSUNFX0NPTk5FQ1RJT046IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19WT0lDRV9DT05ORUNUSU9OJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlIHx8ICdObyB2b2ljZSBjb25uZWN0aW9uIGF2YWlsYWJsZSwgbWF5YmUgY29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWwgZmlyc3Q/JztcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX1ZPSUNFX0NPTk5FQ1RJT05fREVTVFJPWUVEOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfVk9JQ0VfQ09OTkVDVElPTl9ERVNUUk9ZRUQnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IoKSB7XG4gICAgICAgICAgICByZXR1cm4gJ0Nhbm5vdCB1c2UgZGVzdHJveWVkIHZvaWNlIGNvbm5lY3Rpb24nO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9fVk9JQ0VfQ0hBTk5FTDoge1xuICAgICAgICBuYW1lOiAnRVJSX05PX1ZPSUNFX0NIQU5ORUwnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IoKSB7XG4gICAgICAgICAgICByZXR1cm4gJ0NvdWxkIG5vdCBnZXQgdGhlIHZvaWNlIGNoYW5uZWwnO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfSU5WQUxJRF9WT0lDRV9DSEFOTkVMOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfSU5WQUxJRF9WT0lDRV9DSEFOTkVMJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgICAgICAgcmV0dXJuICdFeHBlY3RlZCBhIHZvaWNlIGNoYW5uZWwnO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9fUkVDRUlWRVI6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19SRUNFSVZFUicsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZSB8fCAnTm8gdm9pY2UgcmVjZWl2ZXIgaXMgYXZhaWxhYmxlLCBtYXliZSBjb25uZWN0IHRvIGEgdm9pY2UgY2hhbm5lbCBmaXJzdD8nO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfRkZNUEVHX0xPQ0FUT1I6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9GRk1QRUdfTE9DQVRPUicsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9fQVVESU9fUkVTT1VSQ0U6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19BVURJT19SRVNPVVJDRScsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZSB8fCAnRXhwZWN0ZWQgYW4gYXVkaW8gcmVzb3VyY2UnO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9fR1VJTERfUVVFVUU6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19HVUlMRF9RVUVVRScsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZSB8fCAnRXhwZWN0ZWQgYSBndWlsZCBxdWV1ZSc7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT19HVUlMRDoge1xuICAgICAgICBuYW1lOiAnRVJSX05PX0dVSUxEJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlIHx8ICdFeHBlY3RlZCBhIGd1aWxkJztcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX0lORk9fUkVRVUlSRUQ6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9JTkZPX1JFUVVJUkVEJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKHRhcmdldDogc3RyaW5nLCBhY3R1YWw6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBFeHBlY3RlZCAke3RhcmdldH0sIGZvdW5kIFwiJHthY3R1YWx9XCJgO1xuICAgICAgICB9XG4gICAgfVxufSBhcyBjb25zdDtcblxudHlwZSBGaW5hbEV4Y2VwdGlvbjxPIGV4dGVuZHMgKHR5cGVvZiBEaXNjb3JkUGxheWVyRXJyb3JzKVtrZXlvZiB0eXBlb2YgRGlzY29yZFBsYXllckVycm9yc10+ID0ge1xuICAgIG5hbWU6IE9bJ25hbWUnXTtcbn0gJiBJbnN0YW5jZVR5cGU8T1sndHlwZSddPjtcblxudHlwZSBEaXNjb3JkUGxheWVyRXhjZXB0aW9uID0ge1xuICAgIFtLIGluIGtleW9mIHR5cGVvZiBEaXNjb3JkUGxheWVyRXJyb3JzXTogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8KHR5cGVvZiBEaXNjb3JkUGxheWVyRXJyb3JzKVtLXVsnY3JlYXRlRXJyb3InXT4pID0+IEZpbmFsRXhjZXB0aW9uPCh0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycylbS10+O1xufTtcblxuY29uc3QgdGFyZ2V0ID0ge30gYXMgRGlzY29yZFBsYXllckV4Y2VwdGlvbjtcblxuY29uc3QgaGFuZGxlcjogUHJveHlIYW5kbGVyPHR5cGVvZiB0YXJnZXQ+ID0ge1xuICAgIGdldCh0YXJnZXQsIHA6IGtleW9mIHR5cGVvZiBEaXNjb3JkUGxheWVyRXJyb3JzLCByZWNlaXZlcikge1xuICAgICAgICBjb25zdCBlcnIgPSBEaXNjb3JkUGxheWVyRXJyb3JzW3BdO1xuXG4gICAgICAgIGlmICghZXJyKSByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG5cbiAgICAgICAgcmV0dXJuICguLi5hcmdzOiBQYXJhbWV0ZXJzPCh0eXBlb2YgZXJyKVsnY3JlYXRlRXJyb3InXT4pID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIGNvbnN0IGV4Y2VwdGlvbiA9IG5ldyBlcnIudHlwZShlcnIuY3JlYXRlRXJyb3IoLi4uYXJncykpO1xuICAgICAgICAgICAgZXhjZXB0aW9uLm5hbWUgPSBlcnIubmFtZTtcblxuICAgICAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjtcbiAgICAgICAgfTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgRXJyb3JDb2RlcyA9ICgoKSA9PiB7XG4gICAgdHlwZSBFcnJDb2RlcyA9IHtcbiAgICAgICAgLXJlYWRvbmx5IFtLIGluIGtleW9mIHR5cGVvZiBEaXNjb3JkUGxheWVyRXJyb3JzXTogKHR5cGVvZiBEaXNjb3JkUGxheWVyRXJyb3JzKVtLXVsnbmFtZSddO1xuICAgIH07XG5cbiAgICBjb25zdCBkaWN0ID0ge30gYXMgRXJyQ29kZXM7XG5cbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gRGlzY29yZFBsYXllckVycm9ycykge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIGRpY3RbcHJvcF0gPSBwcm9wO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJlZXplKGRpY3QpO1xufSkoKTtcbmV4cG9ydCBjb25zdCBFeGNlcHRpb25zID0gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7XG4iLCAiaW1wb3J0IHsgVXNlciB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgUGxheWxpc3QgfSBmcm9tICcuLi9mYWJyaWMvUGxheWxpc3QnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgUGxheWVyRXZlbnRzLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0IH0gZnJvbSAnLi9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0JztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICdodHRwJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5leHBvcnQgY2xhc3MgQmFzZUV4dHJhY3RvcjxUIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0PiB7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBmb3IgdGhpcyBleHRyYWN0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlkZW50aWZpZXIgPSAnY29tLmRpc2NvcmQtcGxheWVyLmV4dHJhY3Rvcic7XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgYnJpZGdlIHF1ZXJ5IGNyZWF0aW9uXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBidWlsZCBxdWVyeSBmb3JcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlQnJpZGdlUXVlcnkgPSAodHJhY2s6IFRyYWNrKSA9PiBgJHt0cmFjay50aXRsZX0gYnkgJHt0cmFjay5hdXRob3J9IG9mZmljaWFsIGF1ZGlvYDtcblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RvciBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdGhhdCBpbnN0YW50aWF0ZWQgdGhpcyBleHRyYWN0b3JcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBJbml0aWFsaXphdGlvbiBvcHRpb25zIGZvciB0aGlzIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgcHVibGljIG9wdGlvbnM6IFQgPSA8VD57fSkge31cblxuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgb2YgdGhpcyBleHRyYWN0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlkZW50aWZpZXIoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQmFzZUV4dHJhY3RvcikuaWRlbnRpZmllcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWNvbmZpZ3VyZXMgdGhpcyBleHRyYWN0b3JcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgbmV3IG9wdGlvbnMgdG8gYXBwbHlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVjb25maWd1cmUob3B0aW9uczogVCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICBhd2FpdCB0aGlzLmRlYWN0aXZhdGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hY3RpdmF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBhY3RpdmF0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgYWN0aXZhdGUoKSB7XG4gICAgICAgIC8vIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgYWN0aXZhdGVkXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgZGVhY3RpdmF0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZGVhY3RpdmF0ZSgpIHtcbiAgICAgICAgLy8gZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBkZWFjdGl2YXRlZFxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgaW5jb21pbmcgcXVlcnlcbiAgICAgKiBAcGFyYW0gcXVlcnkgVGhlIHF1ZXJ5IHRvIHZhbGlkYXRlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHZhbGlkYXRlKHF1ZXJ5OiBzdHJpbmcsIHR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBudWxsKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHZvaWQgdHlwZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0cmVhbSB0aGUgZ2l2ZW4gdHJhY2tcbiAgICAgKiBAcGFyYW0gaW5mbyBUaGUgdHJhY2sgdG8gc3RyZWFtXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHN0cmVhbShpbmZvOiBUcmFjayk6IFByb21pc2U8UmVhZGFibGUgfCBzdHJpbmc+IHtcbiAgICAgICAgdm9pZCBpbmZvO1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT1RfSU1QTEVNRU5URUQoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5zdHJlYW0oKWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0aGUgZ2l2ZW4gcXVlcnlcbiAgICAgKiBAcGFyYW0gcXVlcnkgVGhlIHF1ZXJ5IHRvIGhhbmRsZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBoYW5kbGUocXVlcnk6IHN0cmluZywgY29udGV4dDogRXh0cmFjdG9yU2VhcmNoQ29udGV4dCk6IFByb21pc2U8RXh0cmFjdG9ySW5mbz4ge1xuICAgICAgICB2b2lkIGNvbnRleHQ7XG4gICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PVF9JTVBMRU1FTlRFRChgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmhhbmRsZSgpYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHJlbGF0ZWQgdHJhY2tzIGZvciB0aGUgZ2l2ZW4gdHJhY2tcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHNvdXJjZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBnZXRSZWxhdGVkVHJhY2tzKHRyYWNrOiBUcmFjayk6IFByb21pc2U8RXh0cmFjdG9ySW5mbz4ge1xuICAgICAgICB2b2lkIHRyYWNrO1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT1RfSU1QTEVNRU5URUQoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5nZXRSZWxhdGVkVHJhY2tzKClgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHN0cmVhbSBtaWRkbGV3YXJlIHRvIGhhbmRsZSBzdHJlYW1zIGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoZSBwbGF5ZXJcbiAgICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBpbmNvbWluZyBzdHJlYW1cbiAgICAgKiBAcGFyYW0gbmV4dCBUaGUgbmV4dCBmdW5jdGlvblxuICAgICAqL1xuICAgIHB1YmxpYyBoYW5kbGVQb3N0U3RyZWFtKHN0cmVhbTogUmVhZGFibGUsIG5leHQ6IE5leHRGdW5jdGlvbikge1xuICAgICAgICByZXR1cm4gbmV4dChudWxsLCBzdHJlYW0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoIGFuIGV2ZW50IHRvIHRoZSBwbGF5ZXJcbiAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIGRpc3BhdGNoXG4gICAgICogQHBhcmFtIGFyZ3MgVGhlIGRhdGEgdG8gZGlzcGF0Y2hcbiAgICAgKi9cbiAgICBwdWJsaWMgZW1pdDxLIGV4dGVuZHMga2V5b2YgUGxheWVyRXZlbnRzPihldmVudDogSywgLi4uYXJnczogUGFyYW1ldGVyczxQbGF5ZXJFdmVudHNbS10+KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQucGxheWVyLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBleHRyYWN0b3IgcmVzcG9uc2VcbiAgICAgKiBAcGFyYW0gcGxheWxpc3QgVGhlIHBsYXlsaXN0XG4gICAgICogQHBhcmFtIHRyYWNrcyBUaGUgdHJhY2sgYXJyYXlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlUmVzcG9uc2UocGxheWxpc3Q/OiBQbGF5bGlzdCB8IG51bGwsIHRyYWNrczogVHJhY2tbXSA9IHBsYXlsaXN0Py50cmFja3MgfHwgW10pOiBFeHRyYWN0b3JJbmZvIHtcbiAgICAgICAgcmV0dXJuIHsgcGxheWxpc3Q6IHBsYXlsaXN0IHx8IG51bGwsIHRyYWNrcyB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdyaXRlIGRlYnVnIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZGVidWcgbWVzc2FnZVxuICAgICAqL1xuICAgIHB1YmxpYyBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5wbGF5ZXIuZGVidWcobWVzc2FnZSk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBOZXh0RnVuY3Rpb24gPSAoZXJyb3I/OiBFcnJvciB8IG51bGwsIHN0cmVhbT86IFJlYWRhYmxlKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvckluZm8ge1xuICAgIHBsYXlsaXN0OiBQbGF5bGlzdCB8IG51bGw7XG4gICAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvclNlYXJjaENvbnRleHQge1xuICAgIHR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBudWxsO1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG4gICAgcmVxdWVzdE9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucztcbn1cbiIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFBsYXllckV2ZW50c0VtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuXG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IGtub3duRXh0cmFjdG9yS2V5cyA9IFtcbiAgICAnU3BvdGlmeUV4dHJhY3RvcicsXG4gICAgJ0FwcGxlTXVzaWNFeHRyYWN0b3InLFxuICAgICdTb3VuZENsb3VkRXh0cmFjdG9yJyxcbiAgICAnWW91VHViZUV4dHJhY3RvcicsXG4gICAgJ1ZpbWVvRXh0cmFjdG9yJyxcbiAgICAnUmV2ZXJibmF0aW9uRXh0cmFjdG9yJyxcbiAgICAnQXR0YWNobWVudEV4dHJhY3Rvcidcbl07XG5jb25zdCBrbm93bkV4dHJhY3RvckxpYiA9ICdAZGlzY29yZC1wbGF5ZXIvZXh0cmFjdG9yJztcblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JFeGVjdXRpb25FdmVudHMge1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyByZWdpc3RlcmVkXG4gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgZXh0cmFjdG9yIHdhcyByZWdpc3RlcmVkXG4gICAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRoYXQgd2FzIHJlZ2lzdGVyZWRcbiAgICAgKi9cbiAgICByZWdpc3RlcmVkOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyB1bnJlZ2lzdGVyZWRcbiAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSBleHRyYWN0b3Igd2FzIHVucmVnaXN0ZXJlZFxuICAgICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0aGF0IHdhcyB1bnJlZ2lzdGVyZWRcbiAgICAgKi9cbiAgICB1bnJlZ2lzdGVyZWQ6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGFjdGl2YXRlZFxuICAgICAqL1xuICAgIGFjdGl2YXRlOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyBkZWFjdGl2YXRlZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGRlYWN0aXZhdGVkXG4gICAgICovXG4gICAgZGVhY3RpdmF0ZTogKGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgZmFpbHMgdG8gYWN0aXZhdGUvZGVhY3RpdmF0ZVxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGRlYWN0aXZhdGVkXG4gICAgICovXG4gICAgZXJyb3I6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IsIGVycm9yOiBFcnJvcikgPT4gdW5rbm93bjtcbn1cblxuZXhwb3J0IGNsYXNzIEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgZXh0ZW5kcyBQbGF5ZXJFdmVudHNFbWl0dGVyPEV4dHJhY3RvckV4ZWN1dGlvbkV2ZW50cz4ge1xuICAgIHB1YmxpYyBzdG9yZSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgQmFzZUV4dHJhY3Rvcj4oKTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyKSB7XG4gICAgICAgIHN1cGVyKFsnZXJyb3InXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBkZWZhdWx0IGV4dHJhY3RvcnMgZnJvbSBgQGRpc2NvcmQtcGxheWVyL2V4dHJhY3RvcmBcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgbG9hZERlZmF1bHQoKSB7XG4gICAgICAgIGNvbnN0IG1vZCA9IGF3YWl0IFV0aWwuaW1wb3J0KGtub3duRXh0cmFjdG9yTGliKTtcbiAgICAgICAgaWYgKG1vZC5lcnJvcikgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBtb2QuZXJyb3IgYXMgRXJyb3IgfTtcblxuICAgICAgICBrbm93bkV4dHJhY3RvcktleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoIW1vZC5tb2R1bGVba2V5XSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5yZWdpc3Rlcig8dHlwZW9mIEJhc2VFeHRyYWN0b3I+bW9kLm1vZHVsZVtrZXldLCB7fSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGVycm9yOiBudWxsIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgaWYgdGhlIGdpdmVuIGV4dHJhY3RvciBpcyByZWdpc3RlcmVkXG4gICAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGV4dHJhY3RvciBpZGVudGlmaWVyXG4gICAgICovXG4gICAgcHVibGljIGlzUmVnaXN0ZXJlZChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuaGFzKGlkZW50aWZpZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBzaXplIG9mIHJlZ2lzdGVyZWQgZXh0cmFjdG9yc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc2luZ2xlIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBleHRyYWN0b3IgdG8gZ2V0XG4gICAgICovXG4gICAgcHVibGljIGdldChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0KGlkZW50aWZpZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIHNpbmdsZSBleHRyYWN0b3JcbiAgICAgKiBAcGFyYW0gX2V4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRvIHJlZ2lzdGVyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBzdXBwbGllZCB0byB0aGUgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHJlZ2lzdGVyPE8gZXh0ZW5kcyBvYmplY3QsIFQgZXh0ZW5kcyB0eXBlb2YgQmFzZUV4dHJhY3RvcjxPPj4oX2V4dHJhY3RvcjogVCwgb3B0aW9uczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFQ+WycxJ10pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBfZXh0cmFjdG9yLmlkZW50aWZpZXIgIT09ICdzdHJpbmcnIHx8IHRoaXMuc3RvcmUuaGFzKF9leHRyYWN0b3IuaWRlbnRpZmllcikpIHJldHVybjtcbiAgICAgICAgY29uc3QgZXh0cmFjdG9yID0gbmV3IF9leHRyYWN0b3IodGhpcywgb3B0aW9ucyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuc2V0KF9leHRyYWN0b3IuaWRlbnRpZmllciwgZXh0cmFjdG9yKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYCR7X2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgbG9hZGVkIWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZWdpc3RlcmVkJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICAgICAgICAgIGF3YWl0IGV4dHJhY3Rvci5hY3RpdmF0ZSgpO1xuICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBhY3RpdmF0ZWQhYCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2FjdGl2YXRlJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5kZWxldGUoX2V4dHJhY3Rvci5pZGVudGlmaWVyKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYCR7X2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZmFpbGVkIHRvIGFjdGl2YXRlISBFcnJvcjogJHtlfWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHRoaXMsIGV4dHJhY3RvciwgZSBhcyBFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbnJlZ2lzdGVyIHNpbmdsZSBleHRyYWN0b3JcbiAgICAgKiBAcGFyYW0gX2V4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRvIHVucmVnaXN0ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdW5yZWdpc3RlcjxLIGV4dGVuZHMgc3RyaW5nIHwgQmFzZUV4dHJhY3Rvcj4oX2V4dHJhY3RvcjogSykge1xuICAgICAgICBjb25zdCBleHRyYWN0b3IgPSB0eXBlb2YgX2V4dHJhY3RvciA9PT0gJ3N0cmluZycgPyB0aGlzLnN0b3JlLmdldChfZXh0cmFjdG9yKSA6IHRoaXMuc3RvcmUuZmluZCgocikgPT4gciA9PT0gX2V4dHJhY3Rvcik7XG4gICAgICAgIGlmICghZXh0cmFjdG9yKSByZXR1cm47XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGV4dHJhY3Rvci5pZGVudGlmaWVyIHx8IHRoaXMuc3RvcmUuZmluZEtleSgoZSkgPT4gZSA9PT0gZXh0cmFjdG9yKSE7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGRpc2FibGVkIWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCd1bnJlZ2lzdGVyZWQnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgICAgICAgYXdhaXQgZXh0cmFjdG9yLmRlYWN0aXZhdGUoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYCR7ZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBkZWFjdGl2YXRlZCFgKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZGVhY3RpdmF0ZScsIHRoaXMsIGV4dHJhY3Rvcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYCR7ZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBmYWlsZWQgdG8gZGVhY3RpdmF0ZSFgKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCB0aGlzLCBleHRyYWN0b3IsIGUgYXMgRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5yZWdpc3RlciBhbGwgZXh0cmFjdG9yc1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyQWxsKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5zdG9yZS5tYXAoKGUpID0+IHRoaXMudW5yZWdpc3RlcihlKSkpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1biBhbGwgdGhlIGV4dHJhY3RvcnNcbiAgICAgKiBAcGFyYW0gZm4gVGhlIHJ1bm5lciBmdW5jdGlvblxuICAgICAqIEBwYXJhbSBmaWx0ZXJCbG9ja2VkIEZpbHRlciBibG9ja2VkIGV4dHJhY3RvcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcnVuPFQgPSB1bmtub3duPihmbjogRXh0cmFjdG9yRXhlY3V0aW9uRk48VD4sIGZpbHRlckJsb2NrZWQgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGJsb2NrZWQgPSB0aGlzLnBsYXllci5vcHRpb25zLmJsb2NrRXh0cmFjdG9ycyA/PyBbXTtcblxuICAgICAgICBpZiAoIXRoaXMuc3RvcmUuc2l6ZSkge1xuICAgICAgICAgICAgVXRpbC53YXJuKCdTa2lwcGluZyBleHRyYWN0b3JzIGV4ZWN1dGlvbiBzaW5jZSB6ZXJvIGV4dHJhY3RvcnMgd2VyZSByZWdpc3RlcmVkJywgJ05vRXh0cmFjdG9ycycpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVycjogRXJyb3IgfCBudWxsID0gbnVsbCxcbiAgICAgICAgICAgIGxhc3RFeHQ6IEJhc2VFeHRyYWN0b3IgfCBudWxsID0gbnVsbDtcblxuICAgICAgICBmb3IgKGNvbnN0IGV4dCBvZiB0aGlzLnN0b3JlLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyQmxvY2tlZCAmJiBibG9ja2VkLnNvbWUoKGUpID0+IGUgPT09IGV4dC5pZGVudGlmaWVyKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGBFeGVjdXRpbmcgZXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9Li4uYCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbihleHQpLnRoZW4oXG4gICAgICAgICAgICAgICAgKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgRXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9IGZhaWxlZCB3aXRoIGVycm9yOiAke2V9YCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR5cGVVdGlsLmlzRXJyb3IoZSkgPyBlIDogbmV3IEVycm9yKGAke2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgbGFzdEV4dCA9IGV4dDtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiAhVHlwZVV0aWwuaXNFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgRXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9IGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSFgKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGV4dHJhY3RvcjogZXh0LFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0XG4gICAgICAgICAgICAgICAgfSBhcyBFeHRyYWN0b3JFeGVjdXRpb25SZXN1bHQ8VD47XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFR5cGVVdGlsLmlzRXJyb3IocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIGVyciA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnIpXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGV4dHJhY3RvcjogbGFzdEV4dCEsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycixcbiAgICAgICAgICAgICAgICByZXN1bHQ6IGZhbHNlXG4gICAgICAgICAgICB9IGFzIEV4dHJhY3RvckV4ZWN1dGlvblJlc3VsdDxmYWxzZT47XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvckV4ZWN1dGlvblJlc3VsdDxUID0gdW5rbm93bj4ge1xuICAgIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcjtcbiAgICBlcnJvcjogRXJyb3IgfCBudWxsO1xuICAgIHJlc3VsdDogVDtcbn1cblxuZXhwb3J0IHR5cGUgRXh0cmFjdG9yRXhlY3V0aW9uRk48VCA9IHVua25vd24+ID0gKGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcikgPT4gUHJvbWlzZTxUIHwgYm9vbGVhbj47XG4iLCAiZXhwb3J0IGNsYXNzIFR5cGVVdGlsIHtcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICByZXR1cm4gVHlwZVV0aWw7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbiAgICBwdWJsaWMgc3RhdGljIGlzRnVuY3Rpb24odDogdW5rbm93bik6IHQgaXMgRnVuY3Rpb24ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdmdW5jdGlvbic7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc051bWJlcih0OiB1bmtub3duKTogdCBpcyBudW1iZXIge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdudW1iZXInICYmICFpc05hTih0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzU3RyaW5nKHQ6IHVua25vd24pOiB0IGlzIHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ3N0cmluZyc7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0Jvb2xlYW4odDogdW5rbm93bik6IHQgaXMgYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ2Jvb2xlYW4nO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNOdWxsaXNoKHQ6IHVua25vd24pOiB0IGlzIG51bGwgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdCA9PSBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNBcnJheSh0OiB1bmtub3duKTogdCBpcyB1bmtub3duW10ge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzRXJyb3IodDogdW5rbm93bik6IHQgaXMgRXJyb3Ige1xuICAgICAgICByZXR1cm4gdCBpbnN0YW5jZW9mIEVycm9yO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBFcXVhbGl6ZXJCYW5kLCBQQ01GaWx0ZXJzLCBCaXF1YWRGaWx0ZXJzIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uLCBRdWV1ZVN0cmF0ZWd5IH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEd1aWxkUmVzb2x2YWJsZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyLCBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgRmlsdGVyc05hbWUsIFF1ZXVlUmVwZWF0TW9kZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IGdldEdsb2JhbFJlZ2lzdHJ5IH0gZnJvbSAnLi4vdXRpbHMvX19pbnRlcm5hbF9fJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkTm9kZUNyZWF0ZU9wdGlvbnM8VCA9IHVua25vd24+IHtcbiAgICBzdHJhdGVneT86IFF1ZXVlU3RyYXRlZ3k7XG4gICAgdm9sdW1lPzogbnVtYmVyIHwgYm9vbGVhbjtcbiAgICBlcXVhbGl6ZXI/OiBFcXVhbGl6ZXJCYW5kW10gfCBib29sZWFuO1xuICAgIGFfZmlsdGVyPzogUENNRmlsdGVyc1tdIHwgYm9vbGVhbjtcbiAgICBiaXF1YWQ/OiBCaXF1YWRGaWx0ZXJzIHwgYm9vbGVhbjtcbiAgICByZXNhbXBsZXI/OiBudW1iZXIgfCBib29sZWFuO1xuICAgIGRpc2FibGVIaXN0b3J5PzogYm9vbGVhbjtcbiAgICBza2lwT25Ob1N0cmVhbT86IGJvb2xlYW47XG4gICAgb25CZWZvcmVDcmVhdGVTdHJlYW0/OiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgb25BZnRlckNyZWF0ZVN0cmVhbT86IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgIHJlcGVhdE1vZGU/OiBRdWV1ZVJlcGVhdE1vZGU7XG4gICAgbGVhdmVPbkVtcHR5PzogYm9vbGVhbjtcbiAgICBsZWF2ZU9uRW1wdHlDb29sZG93bj86IG51bWJlcjtcbiAgICBsZWF2ZU9uRW5kPzogYm9vbGVhbjtcbiAgICBsZWF2ZU9uRW5kQ29vbGRvd24/OiBudW1iZXI7XG4gICAgbGVhdmVPblN0b3A/OiBib29sZWFuO1xuICAgIGxlYXZlT25TdG9wQ29vbGRvd24/OiBudW1iZXI7XG4gICAgbWV0YWRhdGE/OiBUIHwgbnVsbDtcbiAgICBzZWxmRGVhZj86IGJvb2xlYW47XG4gICAgY29ubmVjdGlvblRpbWVvdXQ/OiBudW1iZXI7XG4gICAgZGVmYXVsdEZGbXBlZ0ZpbHRlcnM/OiBGaWx0ZXJzTmFtZVtdO1xuICAgIGJ1ZmZlcmluZ1RpbWVvdXQ/OiBudW1iZXI7XG4gICAgbm9FbWl0SW5zZXJ0PzogYm9vbGVhbjtcbiAgICBtYXhTaXplPzogbnVtYmVyO1xuICAgIG1heEhpc3RvcnlTaXplPzogbnVtYmVyO1xuICAgIHByZWZlckJyaWRnZWRNZXRhZGF0YT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIE5vZGVSZXNvbHZhYmxlID0gR3VpbGRRdWV1ZSB8IEd1aWxkUmVzb2x2YWJsZTtcblxuZXhwb3J0IGNsYXNzIEd1aWxkTm9kZU1hbmFnZXI8TWV0YSA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgY2FjaGUgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIEd1aWxkUXVldWU+KCk7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge31cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBndWlsZCBxdWV1ZSBpZiBpdCBkb2VzIG5vdCBleGlzdFxuICAgICAqIEBwYXJhbSBndWlsZCBUaGUgZ3VpbGQgd2hpY2ggd2lsbCBiZSB0aGUgb3duZXIgb2YgdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgUXVldWUgaW5pdGlhbGl6ZXIgb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGU8VCA9IE1ldGE+KGd1aWxkOiBHdWlsZFJlc29sdmFibGUsIG9wdGlvbnM6IEd1aWxkTm9kZUNyZWF0ZU9wdGlvbnM8VD4gPSB7fSk6IEd1aWxkUXVldWU8VD4ge1xuICAgICAgICBjb25zdCBzZXJ2ZXIgPSB0aGlzLnBsYXllci5jbGllbnQuZ3VpbGRzLnJlc29sdmUoZ3VpbGQpO1xuICAgICAgICBpZiAoIXNlcnZlcikge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fR1VJTEQoJ0ludmFsaWQgb3IgdW5rbm93biBndWlsZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2FjaGUuaGFzKHNlcnZlci5pZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldChzZXJ2ZXIuaWQpIGFzIEd1aWxkUXVldWU8VD47XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zLnN0cmF0ZWd5ID8/PSAnRklGTyc7XG4gICAgICAgIG9wdGlvbnMudm9sdW1lID8/PSAxMDA7XG4gICAgICAgIG9wdGlvbnMuZXF1YWxpemVyID8/PSBbXTtcbiAgICAgICAgb3B0aW9ucy5hX2ZpbHRlciA/Pz0gW107XG4gICAgICAgIG9wdGlvbnMuZGlzYWJsZUhpc3RvcnkgPz89IGZhbHNlO1xuICAgICAgICBvcHRpb25zLnNraXBPbk5vU3RyZWFtID8/PSBmYWxzZTtcbiAgICAgICAgb3B0aW9ucy5sZWF2ZU9uRW1wdHkgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24gPz89IDA7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPbkVuZCA/Pz0gdHJ1ZTtcbiAgICAgICAgb3B0aW9ucy5sZWF2ZU9uRW5kQ29vbGRvd24gPz89IDA7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPblN0b3AgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPblN0b3BDb29sZG93biA/Pz0gMDtcbiAgICAgICAgb3B0aW9ucy5yZXNhbXBsZXIgPz89IDQ4MDAwO1xuICAgICAgICBvcHRpb25zLnNlbGZEZWFmID8/PSB0cnVlO1xuICAgICAgICBvcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/PSB0aGlzLnBsYXllci5vcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0O1xuICAgICAgICBvcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQgPz89IDEwMDA7XG4gICAgICAgIG9wdGlvbnMubWF4U2l6ZSA/Pz0gSW5maW5pdHk7XG4gICAgICAgIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz89IEluZmluaXR5O1xuICAgICAgICBvcHRpb25zLnByZWZlckJyaWRnZWRNZXRhZGF0YSA9IEJvb2xlYW4ob3B0aW9ucy5wcmVmZXJCcmlkZ2VkTWV0YWRhdGEpO1xuXG4gICAgICAgIGlmIChnZXRHbG9iYWxSZWdpc3RyeSgpLmhhcygnQFtvbkJlZm9yZUNyZWF0ZVN0cmVhbV0nKSAmJiAhb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSkge1xuICAgICAgICAgICAgb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSA9IGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScpIGFzIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnZXRHbG9iYWxSZWdpc3RyeSgpLmhhcygnQFtvbkFmdGVyQ3JlYXRlU3RyZWFtXScpICYmICFvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0pIHtcbiAgICAgICAgICAgIG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSA9IGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KCdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJykgYXMgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWV1ZSA9IG5ldyBHdWlsZFF1ZXVlPFQ+KHRoaXMucGxheWVyLCB7XG4gICAgICAgICAgICBndWlsZDogc2VydmVyLFxuICAgICAgICAgICAgcXVldWVTdHJhdGVneTogb3B0aW9ucy5zdHJhdGVneSxcbiAgICAgICAgICAgIHZvbHVtZTogb3B0aW9ucy52b2x1bWUsXG4gICAgICAgICAgICBlcXVhbGl6ZXI6IG9wdGlvbnMuZXF1YWxpemVyLFxuICAgICAgICAgICAgZmlsdGVyZXI6IG9wdGlvbnMuYV9maWx0ZXIsXG4gICAgICAgICAgICBiaXF1YWQ6IG9wdGlvbnMuYmlxdWFkLFxuICAgICAgICAgICAgcmVzYW1wbGVyOiBvcHRpb25zLnJlc2FtcGxlcixcbiAgICAgICAgICAgIGRpc2FibGVIaXN0b3J5OiBvcHRpb25zLmRpc2FibGVIaXN0b3J5LFxuICAgICAgICAgICAgc2tpcE9uTm9TdHJlYW06IG9wdGlvbnMuc2tpcE9uTm9TdHJlYW0sXG4gICAgICAgICAgICBvbkJlZm9yZUNyZWF0ZVN0cmVhbTogb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSxcbiAgICAgICAgICAgIG9uQWZ0ZXJDcmVhdGVTdHJlYW06IG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSxcbiAgICAgICAgICAgIHJlcGVhdE1vZGU6IG9wdGlvbnMucmVwZWF0TW9kZSxcbiAgICAgICAgICAgIGxlYXZlT25FbXB0eTogb3B0aW9ucy5sZWF2ZU9uRW1wdHksXG4gICAgICAgICAgICBsZWF2ZU9uRW1wdHlDb29sZG93bjogb3B0aW9ucy5sZWF2ZU9uRW1wdHlDb29sZG93bixcbiAgICAgICAgICAgIGxlYXZlT25FbmQ6IG9wdGlvbnMubGVhdmVPbkVuZCxcbiAgICAgICAgICAgIGxlYXZlT25FbmRDb29sZG93bjogb3B0aW9ucy5sZWF2ZU9uRW5kQ29vbGRvd24sXG4gICAgICAgICAgICBsZWF2ZU9uU3RvcDogb3B0aW9ucy5sZWF2ZU9uU3RvcCxcbiAgICAgICAgICAgIGxlYXZlT25TdG9wQ29vbGRvd246IG9wdGlvbnMubGVhdmVPblN0b3BDb29sZG93bixcbiAgICAgICAgICAgIG1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhLFxuICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IG9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQgPz8gMTIwXzAwMCxcbiAgICAgICAgICAgIHNlbGZEZWFmOiBvcHRpb25zLnNlbGZEZWFmLFxuICAgICAgICAgICAgZmZtcGVnRmlsdGVyczogb3B0aW9ucy5kZWZhdWx0RkZtcGVnRmlsdGVycyA/PyBbXSxcbiAgICAgICAgICAgIGJ1ZmZlcmluZ1RpbWVvdXQ6IG9wdGlvbnMuYnVmZmVyaW5nVGltZW91dCxcbiAgICAgICAgICAgIG5vRW1pdEluc2VydDogb3B0aW9ucy5ub0VtaXRJbnNlcnQgPz8gZmFsc2UsXG4gICAgICAgICAgICBwcmVmZXJCcmlkZ2VkTWV0YWRhdGE6IG9wdGlvbnMucHJlZmVyQnJpZGdlZE1ldGFkYXRhLFxuICAgICAgICAgICAgbWF4SGlzdG9yeVNpemU6IG9wdGlvbnMubWF4SGlzdG9yeVNpemUsXG4gICAgICAgICAgICBtYXhTaXplOiBvcHRpb25zLm1heFNpemVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jYWNoZS5zZXQoc2VydmVyLmlkLCBxdWV1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHF1ZXVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBleGlzdGluZyBxdWV1ZVxuICAgICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0PFQgPSBNZXRhPihub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgICAgICBjb25zdCBxdWV1ZSA9IHRoaXMucmVzb2x2ZShub2RlKTtcbiAgICAgICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgcmV0dXJuICh0aGlzLmNhY2hlLmdldChxdWV1ZS5pZCkgYXMgR3VpbGRRdWV1ZTxUPikgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIHF1ZXVlIGV4aXN0c1xuICAgICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IGlkID0gbm9kZSBpbnN0YW5jZW9mIEd1aWxkUXVldWUgPyBub2RlLmlkIDogdGhpcy5wbGF5ZXIuY2xpZW50Lmd1aWxkcy5yZXNvbHZlSWQobm9kZSkhO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5oYXMoaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5yZXNvbHZlKG5vZGUpO1xuICAgICAgICBpZiAoIXF1ZXVlKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19HVUlMRF9RVUVVRSgnQ2Fubm90IGRlbGV0ZSBub24tZXhpc3RpbmcgcXVldWUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlLnNldFRyYW5zaXRpb25pbmcodHJ1ZSk7XG4gICAgICAgIHF1ZXVlLm5vZGUuc3RvcCh0cnVlKTtcbiAgICAgICAgcXVldWUuY29ubmVjdGlvbj8ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIHF1ZXVlLmRpc3BhdGNoZXI/LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICBxdWV1ZS5kaXNwYXRjaGVyPy5kaXNjb25uZWN0KCk7XG4gICAgICAgIHF1ZXVlLnRpbWVvdXRzLmZvckVhY2goKHRtKSA9PiBjbGVhclRpbWVvdXQodG0pKTtcbiAgICAgICAgcXVldWUuaGlzdG9yeS5jbGVhcigpO1xuICAgICAgICBxdWV1ZS50cmFja3MuY2xlYXIoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5kZWxldGUocXVldWUuaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgcXVldWVcbiAgICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAgICovXG4gICAgcHVibGljIHJlc29sdmU8VCA9IE1ldGE+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgR3VpbGRRdWV1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQodGhpcy5wbGF5ZXIuY2xpZW50Lmd1aWxkcy5yZXNvbHZlSWQobm9kZSkhKSBhcyBHdWlsZFF1ZXVlPFQ+IHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgcXVldWUgaWRcbiAgICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAgICovXG4gICAgcHVibGljIHJlc29sdmVJZChub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgICAgICBjb25zdCBxID0gdGhpcy5yZXNvbHZlKG5vZGUpO1xuICAgICAgICByZXR1cm4gcT8uaWQgfHwgbnVsbDtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgUGxheWVyLCBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zLCBUcmFja0xpa2UgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgQ2hhbm5lbFR5cGUsIEd1aWxkLCBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsIFZvaWNlQmFzZWRDaGFubmVsLCBWb2ljZVN0YXRlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uLCBRdWV1ZSwgUXVldWVTdHJhdGVneSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBCaXF1YWRGaWx0ZXJzLCBFcXVhbGl6ZXJCYW5kLCBQQ01GaWx0ZXJzIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBUcmFjaywgVHJhY2tSZXNvbHZhYmxlIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgfSBmcm9tICcuLi9Wb2ljZUludGVyZmFjZS9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7IHR5cGUgQXVkaW9QbGF5ZXIsIEF1ZGlvUmVzb3VyY2UsIFN0cmVhbVR5cGUsIFZvaWNlQ29ubmVjdGlvbiwgVm9pY2VDb25uZWN0aW9uU3RhdHVzIH0gZnJvbSAnQGRpc2NvcmRqcy92b2ljZSc7XG5pbXBvcnQgeyBVdGlsLCBWQUxJREFURV9RVUVVRV9DQVAgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi4vZmFicmljL1BsYXlsaXN0JztcbmltcG9ydCB7IEd1aWxkUXVldWVIaXN0b3J5IH0gZnJvbSAnLi9HdWlsZFF1ZXVlSGlzdG9yeSc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlUGxheWVyTm9kZSwgU3RyZWFtQ29uZmlnIH0gZnJvbSAnLi9HdWlsZFF1ZXVlUGxheWVyTm9kZSc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzIH0gZnJvbSAnLi9HdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IEZpbHRlcnNOYW1lLCBRdWV1ZVJlcGVhdE1vZGUsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICd0aW1lcnMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZVN0YXRpc3RpY3MgfSBmcm9tICcuL0d1aWxkUXVldWVTdGF0aXN0aWNzJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgQXN5bmNRdWV1ZSB9IGZyb20gJy4uL3V0aWxzL0FzeW5jUXVldWUnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGROb2RlSW5pdDxNZXRhID0gdW5rbm93bj4ge1xuICAgIGd1aWxkOiBHdWlsZDtcbiAgICBxdWV1ZVN0cmF0ZWd5OiBRdWV1ZVN0cmF0ZWd5O1xuICAgIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdIHwgYm9vbGVhbjtcbiAgICB2b2x1bWU6IG51bWJlciB8IGJvb2xlYW47XG4gICAgYmlxdWFkOiBCaXF1YWRGaWx0ZXJzIHwgYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICByZXNhbXBsZXI6IG51bWJlciB8IGJvb2xlYW47XG4gICAgZmlsdGVyZXI6IFBDTUZpbHRlcnNbXSB8IGJvb2xlYW47XG4gICAgZmZtcGVnRmlsdGVyczogRmlsdGVyc05hbWVbXTtcbiAgICBkaXNhYmxlSGlzdG9yeTogYm9vbGVhbjtcbiAgICBza2lwT25Ob1N0cmVhbTogYm9vbGVhbjtcbiAgICBvbkJlZm9yZUNyZWF0ZVN0cmVhbT86IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICBvbkFmdGVyQ3JlYXRlU3RyZWFtPzogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgcmVwZWF0TW9kZT86IFF1ZXVlUmVwZWF0TW9kZTtcbiAgICBsZWF2ZU9uRW1wdHk6IGJvb2xlYW47XG4gICAgbGVhdmVPbkVtcHR5Q29vbGRvd246IG51bWJlcjtcbiAgICBsZWF2ZU9uRW5kOiBib29sZWFuO1xuICAgIGxlYXZlT25FbmRDb29sZG93bjogbnVtYmVyO1xuICAgIGxlYXZlT25TdG9wOiBib29sZWFuO1xuICAgIGxlYXZlT25TdG9wQ29vbGRvd246IG51bWJlcjtcbiAgICBjb25uZWN0aW9uVGltZW91dDogbnVtYmVyO1xuICAgIHNlbGZEZWFmPzogYm9vbGVhbjtcbiAgICBtZXRhZGF0YT86IE1ldGEgfCBudWxsO1xuICAgIGJ1ZmZlcmluZ1RpbWVvdXQ6IG51bWJlcjtcbiAgICBub0VtaXRJbnNlcnQ6IGJvb2xlYW47XG4gICAgbWF4U2l6ZT86IG51bWJlcjtcbiAgICBtYXhIaXN0b3J5U2l6ZT86IG51bWJlcjtcbiAgICBwcmVmZXJCcmlkZ2VkTWV0YWRhdGE6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9pY2VDb25uZWN0Q29uZmlnIHtcbiAgICBkZWFmPzogYm9vbGVhbjtcbiAgICB0aW1lb3V0PzogbnVtYmVyO1xuICAgIGdyb3VwPzogc3RyaW5nO1xuICAgIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdFByb2Nlc3NlZFJlc3VsdCB7XG4gICAgc3RyZWFtOiBSZWFkYWJsZTtcbiAgICB0eXBlOiBTdHJlYW1UeXBlO1xufVxuXG5leHBvcnQgdHlwZSBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgPSAodHJhY2s6IFRyYWNrLCBxdWVyeVR5cGU6IFNlYXJjaFF1ZXJ5VHlwZSwgcXVldWU6IEd1aWxkUXVldWUpID0+IFByb21pc2U8UmVhZGFibGUgfCBudWxsPjtcbmV4cG9ydCB0eXBlIE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyID0gKHN0cmVhbTogUmVhZGFibGUsIHF1ZXVlOiBHdWlsZFF1ZXVlKSA9PiBQcm9taXNlPFBvc3RQcm9jZXNzZWRSZXN1bHQgfCBudWxsPjtcblxuZXhwb3J0IHR5cGUgUGxheWVyVHJpZ2dlcmVkUmVhc29uID0gJ2ZpbHRlcnMnIHwgJ25vcm1hbCc7XG5cbmV4cG9ydCBjb25zdCBHdWlsZFF1ZXVlRXZlbnQgPSB7XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tBZGQ6ICdhdWRpb1RyYWNrQWRkJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2tzIHdlcmUgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgYXVkaW9UcmFja3NBZGQ6ICdhdWRpb1RyYWNrc0FkZCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrUmVtb3ZlOiAnYXVkaW9UcmFja1JlbW92ZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tzUmVtb3ZlOiAnYXVkaW9UcmFja3NSZW1vdmUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgY3JlYXRlZFxuICAgICAqL1xuICAgIGNvbm5lY3Rpb246ICdjb25uZWN0aW9uJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjb25uZWN0aW9uIGlzIGRlc3Ryb3llZFxuICAgICAqL1xuICAgIGNvbm5lY3Rpb25EZXN0cm95ZWQ6ICdjb25uZWN0aW9uRGVzdHJveWVkJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGJvdCBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY2hhbm5lbFxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3Q6ICdkaXNjb25uZWN0JyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIHNlbmRzIGEgZGVidWcgaW5mb1xuICAgICAqL1xuICAgIGRlYnVnOiAnZGVidWcnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgZW5jb3VudGVycyBlcnJvclxuICAgICAqL1xuICAgIGVycm9yOiAnZXJyb3InLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgdm9pY2UgY2hhbm5lbCBpcyBlbXB0eVxuICAgICAqL1xuICAgIGVtcHR5Q2hhbm5lbDogJ2VtcHR5Q2hhbm5lbCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBpcyBlbXB0eVxuICAgICAqL1xuICAgIGVtcHR5UXVldWU6ICdlbXB0eVF1ZXVlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBzdGFydHMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICovXG4gICAgcGxheWVyU3RhcnQ6ICdwbGF5ZXJTdGFydCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZXJyb3JzIHdoaWxlIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgICAqL1xuICAgIHBsYXllckVycm9yOiAncGxheWVyRXJyb3InLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGZpbmlzaGVzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgICAqL1xuICAgIHBsYXllckZpbmlzaDogJ3BsYXllckZpbmlzaCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc2tpcHMgY3VycmVudCB0cmFja1xuICAgICAqL1xuICAgIHBsYXllclNraXA6ICdwbGF5ZXJTa2lwJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBpcyB0cmlnZ2VyZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJUcmlnZ2VyOiAncGxheWVyVHJpZ2dlcicsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBzdGF0ZSBpcyB1cGRhdGVkLiBDb25zdW1pbmcgdGhpcyBldmVudCBtYXkgZGlzYWJsZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGBQbGF5ZXIuaXNWb2ljZVN0YXRlSGFuZGxlckxvY2tlZCgpYCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICovXG4gICAgdm9pY2VTdGF0ZVVwZGF0ZTogJ3ZvaWNlU3RhdGVVcGRhdGUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB2b2x1bWUgaXMgdXBkYXRlZFxuICAgICAqL1xuICAgIHZvbHVtZUNoYW5nZTogJ3ZvbHVtZUNoYW5nZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHBsYXllciBpcyBwYXVzZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJQYXVzZTogJ3BsYXllclBhdXNlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gcGxheWVyIGlzIHJlc3VtZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJSZXN1bWU6ICdwbGF5ZXJSZXN1bWUnLFxuICAgIC8qKlxuICAgICAqIEJpcXVhZCBGaWx0ZXJzIFVwZGF0ZVxuICAgICAqL1xuICAgIGJpcXVhZEZpbHRlcnNVcGRhdGU6ICdiaXF1YWRGaWx0ZXJzVXBkYXRlJyxcbiAgICAvKipcbiAgICAgKiBFcXVhbGl6ZXIgVXBkYXRlXG4gICAgICovXG4gICAgZXF1YWxpemVyVXBkYXRlOiAnZXF1YWxpemVyVXBkYXRlJyxcbiAgICAvKipcbiAgICAgKiBEU1AgdXBkYXRlXG4gICAgICovXG4gICAgZHNwVXBkYXRlOiAnZHNwVXBkYXRlJyxcbiAgICAvKipcbiAgICAgKiBBdWRpbyBGaWx0ZXJzIFVwZGF0ZVxuICAgICAqL1xuICAgIGF1ZGlvRmlsdGVyc1VwZGF0ZTogJ2F1ZGlvRmlsdGVyc1VwZGF0ZScsXG4gICAgLyoqXG4gICAgICogQXVkaW8gcGxheWVyIHdpbGwgcGxheSBuZXh0IHRyYWNrXG4gICAgICovXG4gICAgd2lsbFBsYXlUcmFjazogJ3dpbGxQbGF5VHJhY2snLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHZvaWNlIGNoYW5uZWwgaXMgcmVwb3B1bGF0ZWRcbiAgICAgKi9cbiAgICBjaGFubmVsUG9wdWxhdGU6ICdjaGFubmVsUG9wdWxhdGUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXG4gICAgICovXG4gICAgcXVldWVDcmVhdGU6ICdxdWV1ZUNyZWF0ZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgZGVsZXRlZFxuICAgICAqL1xuICAgIHF1ZXVlRGVsZXRlOiAncXVldWVEZWxldGUnXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkUXVldWVFdmVudHM8TWV0YSA9IHVua25vd24+IHtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tBZGQ6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3Mgd2VyZSBhZGRlZCB0byB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2tzIFRoZSB0cmFja3MgYXJyYXlcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrc0FkZDogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2tbXSkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrUmVtb3ZlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaykgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2tzIGFyZSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tzUmVtb3ZlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFja1tdKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgY3JlYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGNvbm5lY3Rpb246IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjb25uZWN0aW9uIGlzIGRlc3Ryb3llZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGNvbm5lY3Rpb25EZXN0cm95ZWQ6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGJvdCBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY2hhbm5lbFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3Q6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIHNlbmRzIGEgZGVidWcgaW5mb1xuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBkZWJ1ZyBtZXNzYWdlXG4gICAgICovXG4gICAgZGVidWc6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgbWVzc2FnZTogc3RyaW5nKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgZW5jb3VudGVycyBlcnJvclxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcjogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBlcnJvcjogRXJyb3IpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgZW1wdHlDaGFubmVsOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBpcyBlbXB0eVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGVtcHR5UXVldWU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBzdGFydHMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAgICovXG4gICAgcGxheWVyU3RhcnQ6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGVycm9ycyB3aGlsZSBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAgICovXG4gICAgcGxheWVyRXJyb3I6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgZXJyb3I6IEVycm9yLCB0cmFjazogVHJhY2spID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZmluaXNoZXMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdhcyBiZWluZyBzdHJlYW1lZFxuICAgICAqL1xuICAgIHBsYXllckZpbmlzaDogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2spID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc2tpcHMgY3VycmVudCB0cmFja1xuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCB3YXMgc2tpcHBlZFxuICAgICAqL1xuICAgIHBsYXllclNraXA6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGlzIHRyaWdnZXJlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgd2hpY2ggd2FzIHBsYXllZCBpbiB0aGlzIGV2ZW50XG4gICAgICovXG4gICAgcGxheWVyVHJpZ2dlcjogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2ssIHJlYXNvbjogUGxheWVyVHJpZ2dlcmVkUmVhc29uKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgdm9pY2Ugc3RhdGUgaXMgdXBkYXRlZC4gQ29uc3VtaW5nIHRoaXMgZXZlbnQgbWF5IGRpc2FibGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlciBpZiBgUGxheWVyLmlzVm9pY2VTdGF0ZUhhbmRsZXJMb2NrZWQoKWAgcmV0dXJucyBgZmFsc2VgLlxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRTdGF0ZSBUaGUgb2xkIHZvaWNlIHN0YXRlXG4gICAgICogQHBhcmFtIG5ld1N0YXRlIFRoZSBuZXcgdm9pY2Ugc3RhdGVcbiAgICAgKi9cbiAgICB2b2ljZVN0YXRlVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyIGlzIHBhdXNlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIHBsYXllclBhdXNlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHBsYXllciBpcyByZXN1bWVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgcGxheWVyUmVzdW1lOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHBsYXllcidzIHZvbHVtZSBpcyBjaGFuZ2VkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIG9sZFZvbHVtZSBUaGUgb2xkIHZvbHVtZVxuICAgICAqIEBwYXJhbSBuZXdWb2x1bWUgVGhlIHVwZGF0ZWQgdm9sdW1lXG4gICAgICovXG4gICAgdm9sdW1lQ2hhbmdlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZFZvbHVtZTogbnVtYmVyLCBuZXdWb2x1bWU6IG51bWJlcikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gZXF1YWxpemVyIGNvbmZpZyBpcyB1cGRhdGVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgICAqL1xuICAgIGVxdWFsaXplclVwZGF0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRGaWx0ZXJzOiBFcXVhbGl6ZXJCYW5kW10sIG5ld0ZpbHRlcnM6IEVxdWFsaXplckJhbmRbXSkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYmlxdWFkIGZpbHRlcnMgaXMgdXBkYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICAgKi9cbiAgICBiaXF1YWRGaWx0ZXJzVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZEZpbHRlcnM6IEJpcXVhZEZpbHRlcnMgfCBudWxsLCBuZXdGaWx0ZXJzOiBCaXF1YWRGaWx0ZXJzIHwgbnVsbCkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gZHNwIGZpbHRlcnMgaXMgdXBkYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICAgKi9cbiAgICBkc3BVcGRhdGU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgb2xkRmlsdGVyczogUENNRmlsdGVyc1tdLCBuZXdGaWx0ZXJzOiBQQ01GaWx0ZXJzW10pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGZmbXBlZyBhdWRpbyBmaWx0ZXJzIGlzIHVwZGF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAgICovXG4gICAgYXVkaW9GaWx0ZXJzVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZEZpbHRlcnM6IEZpbHRlcnNOYW1lW10sIG5ld0ZpbHRlcnM6IEZpbHRlcnNOYW1lW10pID0+IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGJlZm9yZSBzdHJlYW1pbmcgYW4gYXVkaW8gdHJhY2suIFRoaXMgZXZlbnQgY2FuIGJlIHVzZWQgdG8gbW9kaWZ5IHN0cmVhbSBjb25maWcgYmVmb3JlIHBsYXlpbmcgYSB0cmFjay5cbiAgICAgKiBMaXN0ZW5pbmcgdG8gdGhpcyBldmVudCB3aWxsIHBhdXNlIHRoZSBleGVjdXRpb24gb2YgYXVkaW8gcGxheWVyIHVudGlsIGBkb25lKClgIGlzIGludm9rZWQuXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdpbGwgYmUgc3RyZWFtZWRcbiAgICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb25zIGZvciBzdHJlYW1pbmdcbiAgICAgKiBAcGFyYW0gZG9uZSBEb25lIGNhbGxiYWNrXG4gICAgICovXG4gICAgd2lsbFBsYXlUcmFjazogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2s8dW5rbm93bj4sIGNvbmZpZzogU3RyZWFtQ29uZmlnLCBkb25lOiAoKSA9PiB2b2lkKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHZvaWNlIGNoYW5uZWwgaXMgcG9wdWxhdGVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgY2hhbm5lbFBvcHVsYXRlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBxdWV1ZUNyZWF0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHN1Y2Nlc3NmdWxseSBkZWxldGVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgcXVldWVEZWxldGU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbn1cblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWU8TWV0YSA9IHVua25vd24+IHtcbiAgICAjdHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgICNkZWxldGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfX2N1cnJlbnQ6IFRyYWNrIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIHRyYWNrczogUXVldWU8VHJhY2s+O1xuICAgIHB1YmxpYyBoaXN0b3J5ID0gbmV3IEd1aWxkUXVldWVIaXN0b3J5PE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyBkaXNwYXRjaGVyOiBTdHJlYW1EaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIG5vZGUgPSBuZXcgR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIGZpbHRlcnMgPSBuZXcgR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPih0aGlzKTtcbiAgICBwdWJsaWMgb25CZWZvcmVDcmVhdGVTdHJlYW06IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciA9IGFzeW5jICgpID0+IG51bGw7XG4gICAgcHVibGljIG9uQWZ0ZXJDcmVhdGVTdHJlYW06IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyID0gYXN5bmMgKHN0cmVhbSkgPT4gKHtcbiAgICAgICAgc3RyZWFtLFxuICAgICAgICB0eXBlOiBTdHJlYW1UeXBlLlJhd1xuICAgIH0pO1xuICAgIHB1YmxpYyByZXBlYXRNb2RlID0gUXVldWVSZXBlYXRNb2RlLk9GRjtcbiAgICBwdWJsaWMgdGltZW91dHMgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIE5vZGVKUy5UaW1lb3V0PigpO1xuICAgIHB1YmxpYyBzdGF0cyA9IG5ldyBHdWlsZFF1ZXVlU3RhdGlzdGljczxNZXRhPih0aGlzKTtcbiAgICBwdWJsaWMgdGFza3NRdWV1ZSA9IG5ldyBBc3luY1F1ZXVlKCk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyLCBwdWJsaWMgb3B0aW9uczogR3VpbGROb2RlSW5pdDxNZXRhPikge1xuICAgICAgICB0aGlzLnRyYWNrcyA9IG5ldyBRdWV1ZTxUcmFjaz4ob3B0aW9ucy5xdWV1ZVN0cmF0ZWd5KTtcbiAgICAgICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24ob3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSkpIHRoaXMub25CZWZvcmVDcmVhdGVTdHJlYW0gPSBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtO1xuICAgICAgICBpZiAoVHlwZVV0aWwuaXNGdW5jdGlvbihvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0pKSB0aGlzLm9uQWZ0ZXJDcmVhdGVTdHJlYW0gPSBvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW07XG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNOdWxsaXNoKG9wdGlvbnMucmVwZWF0TW9kZSkpIHRoaXMucmVwZWF0TW9kZSA9IG9wdGlvbnMucmVwZWF0TW9kZTtcblxuICAgICAgICBvcHRpb25zLnNlbGZEZWFmID8/PSB0cnVlO1xuICAgICAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgICAgICBvcHRpb25zLm1heEhpc3RvcnlTaXplID8/PSBJbmZpbml0eTtcblxuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzTnVsbGlzaCh0aGlzLm9wdGlvbnMuYmlxdWFkKSAmJiAhVHlwZVV0aWwuaXNCb29sZWFuKHRoaXMub3B0aW9ucy5iaXF1YWQpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkID0gdGhpcy5vcHRpb25zLmJpcXVhZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5lcXVhbGl6ZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyID0gdGhpcy5vcHRpb25zLmVxdWFsaXplcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5maWx0ZXJlcikpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzID0gdGhpcy5vcHRpb25zLmZpbHRlcmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFR5cGVVdGlsLmlzTnVtYmVyKHRoaXMub3B0aW9ucy5yZXNhbXBsZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZSA9IHRoaXMub3B0aW9ucy5yZXNhbXBsZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVHlwZVV0aWwuaXNBcnJheSh0aGlzLm9wdGlvbnMuZmZtcGVnRmlsdGVycykpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5mZm1wZWcuc2V0RGVmYXVsdHModGhpcy5vcHRpb25zLmZmbXBlZ0ZpbHRlcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihvcHRpb25zLm1heFNpemUpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdbR3VpbGROb2RlSW5pdC5tYXhTaXplXScsICdudW1iZXInLCB0eXBlb2Ygb3B0aW9ucy5tYXhTaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIob3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSkpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ1tHdWlsZE5vZGVJbml0Lm1heEhpc3RvcnlTaXplXScsICdudW1iZXInLCB0eXBlb2Ygb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5tYXhTaXplIDwgMSkgb3B0aW9ucy5tYXhTaXplID0gSW5maW5pdHk7XG4gICAgICAgIGlmIChvcHRpb25zLm1heEhpc3RvcnlTaXplIDwgMSkgb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA9IEluZmluaXR5O1xuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBHdWlsZFF1ZXVlIGluaXRpYWxpemVkIGZvciBndWlsZCAke3RoaXMub3B0aW9ucy5ndWlsZC5uYW1lfSAoSUQ6ICR7dGhpcy5vcHRpb25zLmd1aWxkLmlkfSlgKTtcbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5xdWV1ZUNyZWF0ZSwgdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcXVldWUgaW4gbXNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc3RvcmUucmVkdWNlKChhLCBjKSA9PiBhICsgYy5kdXJhdGlvbk1TLCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXR0ZWQgZHVyYXRpb24gb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZHVyYXRpb25Gb3JtYXR0ZWQoKSB7XG4gICAgICAgIHJldHVybiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRoaXMuZXN0aW1hdGVkRHVyYXRpb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgcmVjZWl2ZXIgZm9yIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZvaWNlUmVjZWl2ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LnJlY2VpdmVyID8/IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBkZWJ1ZyBtZXNzYWdlIHRvIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gbSBUaGUgbWVzc2FnZSB0byB3cml0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBkZWJ1ZyhtOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5kZWJ1ZywgdGhpcywgbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG1ldGFkYXRhIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG1ldGFkYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1ldGFkYXRhITtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IG1ldGFkYXRhKG06IE1ldGEpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm1ldGFkYXRhID0gbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgbWV0YWRhdGEgZm9yIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gbSBNZXRhZGF0YSB0byBzZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0TWV0YWRhdGEobTogTWV0YSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMubWV0YWRhdGEgPSBtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBjdXJyZW50IHRyYWNrIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRUcmFjaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5fX2N1cnJlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoaXMgcXVldWUgd2FzIGRlbGV0ZWQgcHJldmlvdXNseVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGVsZXRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2RlbGV0ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNoYW5uZWwgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY2hhbm5lbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8uY2hhbm5lbCB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY2hhbm5lbChjOiBWb2ljZUJhc2VkQ2hhbm5lbCB8IG51bGwpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcGF0Y2hlcikge1xuICAgICAgICAgICAgaWYgKGMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuY2hhbm5lbCA9IGM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvbiBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb25uZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy52b2ljZUNvbm5lY3Rpb24gfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZ3VpbGQgdGhpcyBxdWV1ZSBiZWxvbmdzIHRvXG4gICAgICovXG4gICAgcHVibGljIGdldCBndWlsZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5ndWlsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1aWxkLmlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0cmFuc2l0aW9uIG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlIHRvIHNldFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRUcmFuc2l0aW9uaW5nKHN0YXRlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuI3RyYW5zaXRpb25pbmcgPSBzdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBpZiB0aGlzIHF1ZXVlIGlzIGN1cnJlbnRseSB1bmRlciB0cmFuc2l0aW9uIG1vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNUcmFuc2l0aW9uaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdHJhbnNpdGlvbmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcmVwZWF0IG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gbW9kZSBUaGUgcmVwZWF0IG1vZGUgdG8gYXBwbHlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0UmVwZWF0TW9kZShtb2RlOiBRdWV1ZVJlcGVhdE1vZGUpIHtcbiAgICAgICAgdGhpcy5yZXBlYXRNb2RlID0gbW9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXggc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBtYXhTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1heFNpemUgPz8gSW5maW5pdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWF4IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRNYXhTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXhTaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHNpemUgb2YgdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWF4IGhpc3Rvcnkgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBtYXhIaXN0b3J5U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA/PyBJbmZpbml0eTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXggaGlzdG9yeSBzaXplIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TWF4SGlzdG9yeVNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1heEhpc3RvcnlTaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBtYXggaGlzdG9yeSBzaXplIGZvciB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgdG8gc2V0XG4gICAgICovXG4gICAgcHVibGljIHNldE1heEhpc3RvcnlTaXplKHNpemU6IG51bWJlcikge1xuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzTnVtYmVyKHNpemUpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdzaXplJywgJ251bWJlcicsIHR5cGVvZiBzaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaXplIDwgMSkgc2l6ZSA9IEluZmluaXR5O1xuXG4gICAgICAgIHRoaXMub3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA9IHNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG1heCBzaXplIGZvciB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgdG8gc2V0XG4gICAgICovXG4gICAgcHVibGljIHNldE1heFNpemUoc2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIoc2l6ZSkpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ3NpemUnLCAnbnVtYmVyJywgdHlwZW9mIHNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNpemUgPCAxKSBzaXplID0gSW5maW5pdHk7XG5cbiAgICAgICAgdGhpcy5vcHRpb25zLm1heFNpemUgPSBzaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMudHJhY2tzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoaXMgcXVldWUgaGFzIG5vIHRyYWNrcyBsZWZ0IGluIGl0XG4gICAgICovXG4gICAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplIDwgMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGlzIGZ1bGxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNGdWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZSA+PSB0aGlzLm1heFNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHF1ZXVlIGNhcGFjaXR5XG4gICAgICovXG4gICAgcHVibGljIGdldENhcGFjaXR5KCkge1xuICAgICAgICBpZiAodGhpcy5pc0Z1bGwoKSkgcmV0dXJuIDA7XG4gICAgICAgIGNvbnN0IGNhcCA9IHRoaXMubWF4U2l6ZSAtIHRoaXMuc2l6ZTtcbiAgICAgICAgcmV0dXJuIGNhcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGN1cnJlbnRseSBob2xkcyBhY3RpdmUgYXVkaW8gcmVzb3VyY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNQbGF5aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlICE9IG51bGwgJiYgIXRoaXMuZGlzcGF0Y2hlci5hdWRpb1Jlc291cmNlLmVuZGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCB0cmFjayB0byB0aGUgcXVldWUuIFRoaXMgd2lsbCBlbWl0IGBhdWRpb1RyYWNrc0FkZGAgd2hlbiBtdWx0aXBsZSB0cmFja3MgYXJlIGFkZGVkLCBvdGhlcndpc2UgYGF1ZGlvVHJhY2tBZGRgLlxuICAgICAqIEBwYXJhbSB0cmFjayBUcmFjayBvciBwbGF5bGlzdCBvciBhcnJheSBvZiB0cmFja3MgdG8gYWRkXG4gICAgICovXG4gICAgcHVibGljIGFkZFRyYWNrKHRyYWNrOiBUcmFjayB8IFRyYWNrW10gfCBQbGF5bGlzdCkge1xuICAgICAgICBjb25zdCB0b0FkZCA9IHRyYWNrIGluc3RhbmNlb2YgUGxheWxpc3QgPyB0cmFjay50cmFja3MgOiB0cmFjaztcbiAgICAgICAgY29uc3QgaXNNdWx0aSA9IEFycmF5LmlzQXJyYXkodG9BZGQpO1xuXG4gICAgICAgIFZBTElEQVRFX1FVRVVFX0NBUCh0aGlzLCB0b0FkZCk7XG5cbiAgICAgICAgdGhpcy50cmFja3MuYWRkKHRvQWRkKTtcblxuICAgICAgICBpZiAoaXNNdWx0aSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5hdWRpb1RyYWNrc0FkZCwgdGhpcywgdG9BZGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5hdWRpb1RyYWNrQWRkLCB0aGlzLCB0b0FkZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSB0cmFjayBmcm9tIHF1ZXVlXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byByZW1vdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlVHJhY2sodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLnJlbW92ZSh0cmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyB0aGUgdHJhY2sgdG8gdGhlIGdpdmVuIGluZGV4XG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBpbnNlcnRcbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRvIGluc2VydCB0aGUgdHJhY2sgYXQgKGRlZmF1bHRzIHRvIDApXG4gICAgICovXG4gICAgcHVibGljIGluc2VydFRyYWNrKHRyYWNrOiBUcmFjaywgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUuaW5zZXJ0KHRyYWNrLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gbW92ZVxuICAgICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gbW92ZSB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBtb3ZlVHJhY2sodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSwgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUubW92ZSh0cmFjaywgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcHkgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gY2xvbmVcbiAgICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIGNsb25lIGF0XG4gICAgICovXG4gICAgcHVibGljIGNvcHlUcmFjayh0cmFjazogVHJhY2tSZXNvbHZhYmxlLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5jb3B5KHRyYWNrLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3dhcCB0d28gdHJhY2tzIGluIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBzcmMgVGhlIGZpcnN0IHRyYWNrIHRvIHN3YXBcbiAgICAgKiBAcGFyYW0gZGVzdCBUaGUgc2Vjb25kIHRyYWNrIHRvIHN3YXBcbiAgICAgKi9cbiAgICBwdWJsaWMgc3dhcFRyYWNrcyhzcmM6IFRyYWNrUmVzb2x2YWJsZSwgZGVzdDogVHJhY2tSZXNvbHZhYmxlKTogdm9pZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUuc3dhcChzcmMsIGRlc3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBzdHJlYW0gZGlzcGF0Y2hlciBmcm9tIHRoZSBnaXZlbiBjb25uZWN0aW9uXG4gICAgICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24gdG8gdXNlXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZURpc3BhdGNoZXIoY29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uLCBvcHRpb25zOiBQaWNrPFZvaWNlQ29ubmVjdENvbmZpZywgJ2F1ZGlvUGxheWVyJyB8ICd0aW1lb3V0Jz4gPSB7fSkge1xuICAgICAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX1ZPSUNFX0NPTk5FQ1RJT05fREVTVFJPWUVEKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5wbGF5ZXIuY2xpZW50LmNoYW5uZWxzLmNhY2hlLmdldChjb25uZWN0aW9uLmpvaW5Db25maWcuY2hhbm5lbElkISk7XG4gICAgICAgIGlmICghY2hhbm5lbCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fVk9JQ0VfQ0hBTk5FTCgpO1xuICAgICAgICBpZiAoIWNoYW5uZWwuaXNWb2ljZUJhc2VkKCkpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2NoYW5uZWwnLCBgVm9pY2VCYXNlZENoYW5uZWwgKHR5cGUgJHtDaGFubmVsVHlwZS5HdWlsZFZvaWNlfS8ke0NoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZX0pYCwgU3RyaW5nKGNoYW5uZWw/LnR5cGUpKTtcblxuICAgICAgICBpZiAodGhpcy5kaXNwYXRjaGVyKSB7XG4gICAgICAgICAgICB0aGlzLiNyZW1vdmVMaXN0ZW5lcnModGhpcy5kaXNwYXRjaGVyKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlci5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbmV3IFN0cmVhbURpc3BhdGNoZXIoY29ubmVjdGlvbiwgY2hhbm5lbCwgdGhpcywgb3B0aW9ucy50aW1lb3V0ID8/IHRoaXMub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCwgb3B0aW9ucy5hdWRpb1BsYXllcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0gY2hhbm5lbFJlc29sdmFibGUgVGhlIHZvaWNlIGNoYW5uZWwgdG8gY29ubmVjdCB0b1xuICAgICAqIEBwYXJhbSBvcHRpb25zIEpvaW4gY29uZmlnXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGNvbm5lY3QoY2hhbm5lbFJlc29sdmFibGU6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgb3B0aW9uczogVm9pY2VDb25uZWN0Q29uZmlnID0ge30pIHtcbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucGxheWVyLmNsaWVudC5jaGFubmVscy5yZXNvbHZlKGNoYW5uZWxSZXNvbHZhYmxlKTtcbiAgICAgICAgaWYgKCFjaGFubmVsIHx8ICFjaGFubmVsLmlzVm9pY2VCYXNlZCgpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdjaGFubmVsJywgYFZvaWNlQmFzZWRDaGFubmVsICh0eXBlICR7Q2hhbm5lbFR5cGUuR3VpbGRWb2ljZX0vJHtDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2V9KWAsIFN0cmluZyhjaGFubmVsPy50eXBlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ29ubmVjdGluZyB0byAke2NoYW5uZWwudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlID8gJ3N0YWdlJyA6ICd2b2ljZSd9IGNoYW5uZWwgJHtjaGFubmVsLm5hbWV9IChJRDogJHtjaGFubmVsLmlkfSlgKTtcblxuICAgICAgICBpZiAodGhpcy5kaXNwYXRjaGVyICYmIGNoYW5uZWwuaWQgIT09IHRoaXMuZGlzcGF0Y2hlci5jaGFubmVsLmlkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRGVzdHJveWluZyBvbGQgY29ubmVjdGlvbicpO1xuICAgICAgICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IGF3YWl0IHRoaXMucGxheWVyLnZvaWNlVXRpbHMuY29ubmVjdChjaGFubmVsLCB7XG4gICAgICAgICAgICBkZWFmOiBvcHRpb25zLmRlYWYgPz8gdGhpcy5vcHRpb25zLnNlbGZEZWFmID8/IHRydWUsXG4gICAgICAgICAgICBtYXhUaW1lOiBvcHRpb25zPy50aW1lb3V0ID8/IHRoaXMub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/PyAxMjBfMDAwLFxuICAgICAgICAgICAgcXVldWU6IHRoaXMsXG4gICAgICAgICAgICBhdWRpb1BsYXllcjogb3B0aW9ucz8uYXVkaW9QbGF5ZXIsXG4gICAgICAgICAgICBncm91cDogb3B0aW9ucy5ncm91cFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmNvbm5lY3Rpb24sIHRoaXMpO1xuXG4gICAgICAgIGlmICh0aGlzLmNoYW5uZWwhLnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGFubmVsIS5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXRTdXBwcmVzc2VkKGZhbHNlKS5jYXRjaChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hhbm5lbCEuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsodHJ1ZSkuY2F0Y2goVXRpbC5ub29wKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy4jYXR0YWNoTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb24gbGF0ZW5jeSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uPy5waW5nLnVkcCA/PyAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnBsYXllci5ub2Rlcy5kZWxldGUodGhpcy5pZCkpIHtcbiAgICAgICAgICAgIHRoaXMuI2RlbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5xdWV1ZURlbGV0ZSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZpdmVzIHRoaXMgcXVldWVcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIHB1YmxpYyByZXZpdmUoKSB7XG4gICAgICAgIGlmICghdGhpcy5kZWxldGVkIHx8IHRoaXMucGxheWVyLm5vZGVzLmhhcyh0aGlzLmlkKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLiNkZWxldGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2V0VHJhbnNpdGlvbmluZyhmYWxzZSk7XG4gICAgICAgIHRoaXMucGxheWVyLm5vZGVzLmNhY2hlLnNldCh0aGlzLmlkLCB0aGlzKTtcbiAgICAgICAgdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnF1ZXVlQ3JlYXRlLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgc2VsZiBkZWFmXG4gICAgICogQHBhcmFtIG1vZGUgT24vT2ZmIHN0YXRlXG4gICAgICogQHBhcmFtIHJlYXNvbiBSZWFzb25cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0U2VsZkRlYWYobW9kZT86IGJvb2xlYW4sIHJlYXNvbj86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXREZWFmKG1vZGUsIHJlYXNvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHNlbGYgbXV0ZVxuICAgICAqIEBwYXJhbSBtb2RlIE9uL09mZiBzdGF0ZVxuICAgICAqIEBwYXJhbSByZWFzb24gUmVhc29uXG4gICAgICovXG4gICAgcHVibGljIHNldFNlbGZNdXRlKG1vZGU/OiBib29sZWFuLCByZWFzb24/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0TXV0ZShtb2RlLCByZWFzb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgYSB0cmFjayBpbiB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBiZSBwbGF5ZWRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBQbGF5ZXIgbm9kZSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYXkodHJhY2s6IFRyYWNrTGlrZSwgb3B0aW9ucz86IFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8TWV0YT4pIHtcbiAgICAgICAgaWYgKCF0aGlzLmNoYW5uZWwpIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1ZPSUNFX0NPTk5FQ1RJT04oKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIucGxheSh0aGlzLmNoYW5uZWwsIHRyYWNrLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbWl0IGFuIGV2ZW50IG9uIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIGVtaXRcbiAgICAgKiBAcGFyYW0gYXJncyBUaGUgYXJncyBmb3IgdGhlIGV2ZW50XG4gICAgICovXG4gICAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIEd1aWxkUXVldWVFdmVudHM8TWV0YT4+KGV2ZW50OiBLLCAuLi5hcmdzOiBQYXJhbWV0ZXJzPEd1aWxkUXVldWVFdmVudHM8TWV0YT5bS10+KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmRlbGV0ZWQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgICB9XG5cbiAgICAjYXR0YWNoTGlzdGVuZXJzKGRpc3BhdGNoZXI6IFN0cmVhbURpc3BhdGNoZXIpIHtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignZXJyb3InLCAoZSkgPT4gdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5lcnJvciwgdGhpcywgZSkpO1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdkZWJ1ZycsIChtKSA9PiB0aGlzLmhhc0RlYnVnZ2VyICYmIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZGVidWcsIHRoaXMsIG0pKTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignZmluaXNoJywgKHIpID0+IHRoaXMuI3BlcmZvcm1GaW5pc2gocikpO1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdzdGFydCcsIChyKSA9PiB0aGlzLiNwZXJmb3JtU3RhcnQocikpO1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdkZXN0cm95ZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiNyZW1vdmVMaXN0ZW5lcnMoZGlzcGF0Y2hlcik7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBudWxsO1xuICAgICAgICB9KTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignZHNwJywgKGYpID0+IHtcbiAgICAgICAgICAgIGlmICghT2JqZWN0LmlzKHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzLCBmKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZHNwVXBkYXRlLCB0aGlzLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycywgZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyA9IGY7XG4gICAgICAgIH0pO1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdiaXF1YWQnLCAoZikgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgIT09IGYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmJpcXVhZEZpbHRlcnNVcGRhdGUsIHRoaXMsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQsIGYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCA9IGY7XG4gICAgICAgIH0pO1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdlcUJhbmRzJywgKGYpID0+IHtcbiAgICAgICAgICAgIGlmICghT2JqZWN0LmlzKGYsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5lcXVhbGl6ZXJVcGRhdGUsIHRoaXMsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIsIGYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplciA9IGY7XG4gICAgICAgIH0pO1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCd2b2x1bWUnLCAoZikgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUgIT09IGYpIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQudm9sdW1lQ2hhbmdlLCB0aGlzLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lLCBmKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUgPSBmO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhhc0RlYnVnZ2VyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIuZXZlbnRzLmxpc3RlbmVyQ291bnQoR3VpbGRRdWV1ZUV2ZW50LmRlYnVnKSA+IDA7XG4gICAgfVxuXG4gICAgI3JlbW92ZUxpc3RlbmVyczxUIGV4dGVuZHMgeyByZW1vdmVBbGxMaXN0ZW5lcnM6ICgpID0+IHVua25vd24gfT4odGFyZ2V0OiBUKSB7XG4gICAgICAgIHRhcmdldC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICAjcGVyZm9ybVN0YXJ0KHJlc291cmNlPzogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICAgICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5jdXJyZW50VHJhY2s7XG4gICAgICAgIGNvbnN0IHJlYXNvbiA9IHRoaXMuaXNUcmFuc2l0aW9uaW5nKCkgPyAnZmlsdGVycycgOiAnbm9ybWFsJztcblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgICAgICAgYFBsYXllciB0cmlnZ2VyZWQgZm9yIFRyYWNrICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdHJhY2s/LnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICByZWFzb25cbiAgICAgICAgICAgICAgICB9KX1gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyVHJpZ2dlciwgdGhpcywgdHJhY2shLCByZWFzb24pO1xuICAgICAgICBpZiAodHJhY2sgJiYgIXRoaXMuaXNUcmFuc2l0aW9uaW5nKCkpIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyU3RhcnQsIHRoaXMsIHRyYWNrKTtcbiAgICAgICAgdGhpcy5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgICB9XG5cbiAgICAjcGVyZm9ybUZpbmlzaChyZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgICAgIGNvbnN0IHRyYWNrID0gcmVzb3VyY2U/Lm1ldGFkYXRhIHx8IHRoaXMuY3VycmVudFRyYWNrO1xuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgVHJhY2sgJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0cmFjaz8udGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIGlzVHJhbnNpdGlvbk1vZGU6IHRoaXMuaXNUcmFuc2l0aW9uaW5nKClcbiAgICAgICAgICAgICAgICB9KX0gd2FzIG1hcmtlZCBhcyBmaW5pc2hlZGBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRyYWNrICYmICF0aGlzLmlzVHJhbnNpdGlvbmluZygpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnQWRkaW5nIHRyYWNrIHRvIGhpc3RvcnkgYW5kIGVtaXR0aW5nIGZpbmlzaCBldmVudCBzaW5jZSB0cmFuc2l0aW9uIG1vZGUgaXMgZGlzYWJsZWQuLi4nKTtcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKHRyYWNrKTtcbiAgICAgICAgICAgIHRoaXMubm9kZS5yZXNldFByb2dyZXNzKCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnBsYXllckZpbmlzaCwgdGhpcywgdHJhY2spO1xuICAgICAgICAgICAgaWYgKHRoaXMudHJhY2tzLnNpemUgPCAxICYmIHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLk9GRikge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdObyBtb3JlIHRyYWNrcyBsZWZ0IGluIHRoZSBxdWV1ZSB0byBwbGF5IGFuZCByZXBlYXQgbW9kZSBpcyBvZmYsIGluaXRpYXRpbmcgI2VtaXRFbmQoKScpO1xuICAgICAgICAgICAgICAgIHRoaXMuI2VtaXRFbmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLlRSQUNLKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdSZXBlYXQgbW9kZSBpcyBzZXQgdG8gdHJhY2ssIHJlcGVhdGluZyBsYXN0IHRyYWNrIGZyb20gdGhlIGhpc3RvcnkuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2s7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5vZGUucGxheSh0aGlzLl9fY3VycmVudCEsIHsgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuUVVFVUUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ1JlcGVhdCBtb2RlIGlzIHNldCB0byBxdWV1ZSwgbW92aW5nIGxhc3QgdHJhY2sgZnJvbSB0aGUgaGlzdG9yeSB0byBjdXJyZW50IHF1ZXVlLi4uJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhY2tzLmFkZCh0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudHJhY2tzLnNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLkFVVE9QTEFZKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIGF1dG9wbGF5LCBpbml0aWF0aW5nIGF1dG9wbGF5IGhhbmRsZXIuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2hhbmRsZUF1dG9wbGF5KHRyYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdJbml0aWFsaXppbmcgbmV4dCB0cmFjayBvZiB0aGUgcXVldWUuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLnRyYWNrcy5kaXNwYXRjaCgpITtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlLnBsYXkodGhpcy5fX2N1cnJlbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAjZW1pdEVuZCgpIHtcbiAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmVtcHR5UXVldWUsIHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxlYXZlT25FbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRtOiBOb2RlSlMuVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUGxheWluZygpKSByZXR1cm4gY2xlYXJUaW1lb3V0KHRtKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIH0sIHRoaXMub3B0aW9ucy5sZWF2ZU9uRW5kQ29vbGRvd24pLnVucmVmKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyAjaGFuZGxlQXV0b3BsYXkodHJhY2s6IFRyYWNrKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQXV0b3BsYXkgPj4gRmluZGluZyByZWxhdGVkIHRyYWNrcyBmb3IgVHJhY2sgJHt0cmFjay50aXRsZX0gKCR7dHJhY2sudXJsfSkgW2V4dDoke3RyYWNrLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCAnTi9BJ31dYCk7XG4gICAgICAgICAgICBjb25zdCB0cmFja3MgPVxuICAgICAgICAgICAgICAgIChhd2FpdCB0cmFjay5leHRyYWN0b3I/LmdldFJlbGF0ZWRUcmFja3ModHJhY2spKT8udHJhY2tzIHx8XG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsYXllci5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQXV0b3BsYXkgPj4gUXVlcnlpbmcgZXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBleHQuZ2V0UmVsYXRlZFRyYWNrcyh0cmFjayk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcy50cmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBmYWlsZWQgdG8gcHJvdmlkZSByZXN1bHRzLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBzdWNjZXNzZnVsbHkgcmV0dXJuZWQgcmVzdWx0cy5gKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcy50cmFja3M7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKT8ucmVzdWx0IHx8XG4gICAgICAgICAgICAgICAgW107XG4gICAgICAgICAgICBpZiAoIXRyYWNrcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IE5vIHJlbGF0ZWQgdHJhY2tzIGZvdW5kLmApO1xuICAgICAgICAgICAgICAgIHRocm93ICdubyByZWxhdGVkIHRyYWNrcyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBQaWNraW5nIHJhbmRvbSB0cmFjayBmcm9tIGZpcnN0IDUgdHJhY2tzLi4uYCk7XG4gICAgICAgICAgICBjb25zdCBuZXh0VHJhY2sgPSBVdGlsLnJhbmRvbUNob2ljZSh0cmFja3Muc2xpY2UoMCwgNSkpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ub2RlLnBsYXkobmV4dFRyYWNrLCB7XG4gICAgICAgICAgICAgICAgcXVldWU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNlZWs6IDAsXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbk1vZGU6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jZW1pdEVuZCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7XG4gICAgQXVkaW9QbGF5ZXIsXG4gICAgQXVkaW9QbGF5ZXJFcnJvcixcbiAgICBBdWRpb1BsYXllclN0YXR1cyxcbiAgICBBdWRpb1Jlc291cmNlLFxuICAgIGNyZWF0ZUF1ZGlvUGxheWVyLFxuICAgIGNyZWF0ZUF1ZGlvUmVzb3VyY2UsXG4gICAgZW50ZXJzU3RhdGUsXG4gICAgU3RyZWFtVHlwZSxcbiAgICBWb2ljZUNvbm5lY3Rpb24sXG4gICAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLFxuICAgIFZvaWNlQ29ubmVjdGlvbkRpc2Nvbm5lY3RSZWFzb25cbn0gZnJvbSAnQGRpc2NvcmRqcy92b2ljZSc7XG5pbXBvcnQgeyBTdGFnZUNoYW5uZWwsIFZvaWNlQ2hhbm5lbCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgRXF1YWxpemVyQmFuZCwgQmlxdWFkRmlsdGVycywgUENNRmlsdGVycywgRmlsdGVyc0NoYWluIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQsIFBvc3RQcm9jZXNzZWRSZXN1bHQgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB7IFZvaWNlUmVjZWl2ZXJOb2RlIH0gZnJvbSAnLi4vbWFuYWdlci9Wb2ljZVJlY2VpdmVyTm9kZSc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVTdHJlYW1PcHMge1xuICAgIHR5cGU/OiBTdHJlYW1UeXBlO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZGF0YT86IGFueTtcbiAgICBkaXNhYmxlVm9sdW1lPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlRXF1YWxpemVyPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlQmlxdWFkPzogYm9vbGVhbjtcbiAgICBlcT86IEVxdWFsaXplckJhbmRbXTtcbiAgICBiaXF1YWRGaWx0ZXI/OiBCaXF1YWRGaWx0ZXJzO1xuICAgIGRpc2FibGVGaWx0ZXJzPzogYm9vbGVhbjtcbiAgICBkZWZhdWx0RmlsdGVycz86IFBDTUZpbHRlcnNbXTtcbiAgICB2b2x1bWU/OiBudW1iZXI7XG4gICAgZGlzYWJsZVJlc2FtcGxlcj86IGJvb2xlYW47XG4gICAgc2FtcGxlUmF0ZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWb2ljZUV2ZW50cyB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuICAgIGVycm9yOiAoZXJyb3I6IEF1ZGlvUGxheWVyRXJyb3IpID0+IGFueTtcbiAgICBkZWJ1ZzogKG1lc3NhZ2U6IHN0cmluZykgPT4gYW55O1xuICAgIHN0YXJ0OiAocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSA9PiBhbnk7XG4gICAgZmluaXNoOiAocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSA9PiBhbnk7XG4gICAgZHNwOiAoZmlsdGVyczogUENNRmlsdGVyc1tdKSA9PiBhbnk7XG4gICAgZXFCYW5kczogKGZpbHRlcnM6IEVxdWFsaXplckJhbmRbXSkgPT4gYW55O1xuICAgIHNhbXBsZVJhdGU6IChmaWx0ZXJzOiBudW1iZXIpID0+IGFueTtcbiAgICBiaXF1YWQ6IChmaWx0ZXJzOiBCaXF1YWRGaWx0ZXJzKSA9PiBhbnk7XG4gICAgdm9sdW1lOiAodm9sdW1lOiBudW1iZXIpID0+IGFueTtcbiAgICBkZXN0cm95ZWQ6ICgpID0+IGFueTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbn1cblxuY2xhc3MgU3RyZWFtRGlzcGF0Y2hlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxWb2ljZUV2ZW50cz4ge1xuICAgIHB1YmxpYyB2b2ljZUNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbjtcbiAgICBwdWJsaWMgYXVkaW9QbGF5ZXI6IEF1ZGlvUGxheWVyO1xuICAgIHB1YmxpYyByZWNlaXZlciA9IG5ldyBWb2ljZVJlY2VpdmVyTm9kZSh0aGlzKTtcbiAgICBwdWJsaWMgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsO1xuICAgIHB1YmxpYyBhdWRpb1Jlc291cmNlPzogQXVkaW9SZXNvdXJjZTxUcmFjaz4gfCBudWxsO1xuICAgIHB1YmxpYyBkc3AgPSBuZXcgRmlsdGVyc0NoYWluKCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG5ldyBjb25uZWN0aW9uIG9iamVjdFxuICAgICAqIEBwYXJhbSB7Vm9pY2VDb25uZWN0aW9ufSBjb25uZWN0aW9uIFRoZSBjb25uZWN0aW9uXG4gICAgICogQHBhcmFtIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfSBjaGFubmVsIFRoZSBjb25uZWN0ZWQgY2hhbm5lbFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uLCBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwsIHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZSwgcHVibGljIHJlYWRvbmx5IGNvbm5lY3Rpb25UaW1lb3V0OiBudW1iZXIgPSAyMDAwMCwgYXVkaW9QbGF5ZXI/OiBBdWRpb1BsYXllcikge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvblxuICAgICAgICAgKiBAdHlwZSB7Vm9pY2VDb25uZWN0aW9ufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYXVkaW8gcGxheWVyXG4gICAgICAgICAqIEB0eXBlIHtBdWRpb1BsYXllcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIgPVxuICAgICAgICAgICAgYXVkaW9QbGF5ZXIgfHxcbiAgICAgICAgICAgIGNyZWF0ZUF1ZGlvUGxheWVyKHtcbiAgICAgICAgICAgICAgICBkZWJ1ZzogdGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlclxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB2b2ljZSBjaGFubmVsXG4gICAgICAgICAqIEB0eXBlIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDtcblxuICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5vbignZGVidWcnLCAobSkgPT4gdm9pZCB0aGlzLmVtaXQoJ2RlYnVnJywgbSkpO1xuICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5vbignZXJyb3InLCAoZXJyb3IpID0+IHZvaWQgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yIGFzIEF1ZGlvUGxheWVyRXJyb3IpKTtcbiAgICAgICAgdGhpcy5hdWRpb1BsYXllci5vbignZGVidWcnLCAobSkgPT4gdm9pZCB0aGlzLmVtaXQoJ2RlYnVnJywgbSkpO1xuICAgICAgICB0aGlzLmF1ZGlvUGxheWVyLm9uKCdlcnJvcicsIChlcnJvcikgPT4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpKTtcblxuICAgICAgICB0aGlzLmRzcC5vblVwZGF0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kc3ApIHJldHVybjtcbiAgICAgICAgICAgIGlmICh0aGlzLmRzcC5maWx0ZXJzPy5maWx0ZXJzKSB0aGlzLmVtaXQoJ2RzcCcsIHRoaXMuZHNwLmZpbHRlcnM/LmZpbHRlcnMpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZHNwLmJpcXVhZD8uZmlsdGVyKSB0aGlzLmVtaXQoJ2JpcXVhZCcsIHRoaXMuZHNwLmJpcXVhZD8uZmlsdGVyKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRzcC5lcXVhbGl6ZXIpIHRoaXMuZW1pdCgnZXFCYW5kcycsIHRoaXMuZHNwLmVxdWFsaXplci5nZXRFUSgpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRzcC52b2x1bWUpIHRoaXMuZW1pdCgndm9sdW1lJywgdGhpcy5kc3Audm9sdW1lLnZvbHVtZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5kc3AucmVzYW1wbGVyKSB0aGlzLmVtaXQoJ3NhbXBsZVJhdGUnLCB0aGlzLmRzcC5yZXNhbXBsZXIudGFyZ2V0U2FtcGxlUmF0ZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5kc3Aub25FcnJvciA9IChlKSA9PiB0aGlzLmVtaXQoJ2Vycm9yJywgZSBhcyBBdWRpb1BsYXllckVycm9yKTtcblxuICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvblxuICAgICAgICAgICAgLm9uKFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EaXNjb25uZWN0ZWQsIGFzeW5jIChvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUucmVhc29uID09PSBWb2ljZUNvbm5lY3Rpb25EaXNjb25uZWN0UmVhc29uLk1hbnVhbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZS5yZWFzb24gPT09IFZvaWNlQ29ubmVjdGlvbkRpc2Nvbm5lY3RSZWFzb24uV2ViU29ja2V0Q2xvc2UgJiYgbmV3U3RhdGUuY2xvc2VDb2RlID09PSA0MDE0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbnRlcnNTdGF0ZSh0aGlzLnZvaWNlQ29ubmVjdGlvbiwgVm9pY2VDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcsIHRoaXMuY29ubmVjdGlvblRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCkgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZWpvaW5BdHRlbXB0cyA8IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgVXRpbC53YWl0KCh0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZWpvaW5BdHRlbXB0cyArIDEpICogNTAwMCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbigpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vbihWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmNvbm5lY3Rpb25EZXN0cm95ZWQsIHRoaXMucXVldWUpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hdWRpb1BsYXllci5vbignc3RhdGVDaGFuZ2UnLCAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICAgICAgICBpZiAob2xkU3RhdGUuc3RhdHVzICE9PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQgJiYgbmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnBsYXllclBhdXNlLCB0aGlzLnF1ZXVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkICYmIG5ld1N0YXRlLnN0YXR1cyAhPT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5wbGF5ZXJSZXN1bWUsIHRoaXMucXVldWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QbGF5aW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZSB8fCBvbGRTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLkJ1ZmZlcmluZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdzdGFydCcsIHRoaXMuYXVkaW9SZXNvdXJjZSEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlICYmIG9sZFN0YXRlLnN0YXR1cyAhPT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZmluaXNoJywgdGhpcy5hdWRpb1Jlc291cmNlISk7XG4gICAgICAgICAgICAgICAgdGhpcy5kc3AuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9SZXNvdXJjZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN1YnNjcmliZSh0aGlzLmF1ZGlvUGxheWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgcGxheWVyIGhhcyBiZWVuIHBhdXNlZCBtYW51YWxseVxuICAgICAqL1xuICAgIGdldCBwYXVzZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkO1xuICAgIH1cblxuICAgIHNldCBwYXVzZWQodmFsOiBib29sZWFuKSB7XG4gICAgICAgIHZhbCA/IHRoaXMucGF1c2UodHJ1ZSkgOiB0aGlzLnJlc3VtZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBhdXNlZCBhdXRvbWF0aWNhbGx5IG9yIG1hbnVhbGx5LlxuICAgICAqL1xuICAgIGlzUGF1c2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXVzZWQgfHwgdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLkF1dG9QYXVzZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgYnVmZmVyaW5nXG4gICAgICovXG4gICAgaXNCdWZmZXJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQnVmZmVyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBsYXlpbmdcbiAgICAgKi9cbiAgICBpc1BsYXlpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGxheWluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBpZGxlXG4gICAgICovXG4gICAgaXNJZGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZGVzdHJveWVkXG4gICAgICovXG4gICAgaXNEZXN0cm95ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZGVzdHJveWVkXG4gICAgICovXG4gICAgaXNEaXNjb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EaXNjb25uZWN0ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaXMgcmVhZHkgdG8gcGxheVxuICAgICAqL1xuICAgIGlzUmVhZHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5SZWFkeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBpcyBzaWduYWxsaW5nXG4gICAgICovXG4gICAgaXNTaWduYWxsaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuU2lnbmFsbGluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBpcyBjb25uZWN0aW5nXG4gICAgICovXG4gICAgaXNDb25uZWN0aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHN0cmVhbVxuICAgICAqIEBwYXJhbSB7UmVhZGFibGV9IHNyYyBUaGUgc3RyZWFtIHNvdXJjZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3BzXSBPcHRpb25zXG4gICAgICogQHJldHVybnMge0F1ZGlvUmVzb3VyY2V9XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlU3RyZWFtKHNyYzogUmVhZGFibGUsIG9wcz86IENyZWF0ZVN0cmVhbU9wcykge1xuICAgICAgICBpZiAoIW9wcz8uZGlzYWJsZUZpbHRlcnMgJiYgdGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnSW5pdGlhdGluZyBEU1AgZmlsdGVycyBwaXBlbGluZS4uLicpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSAhb3BzPy5kaXNhYmxlRmlsdGVyc1xuICAgICAgICAgICAgPyB0aGlzLmRzcC5jcmVhdGUoc3JjLCB7XG4gICAgICAgICAgICAgICAgICBkc3A6IHtcbiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiBvcHM/LmRlZmF1bHRGaWx0ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVGaWx0ZXJzXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgYmlxdWFkOiBvcHM/LmJpcXVhZEZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcjogb3BzLmJpcXVhZEZpbHRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlQmlxdWFkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICByZXNhbXBsZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRTYW1wbGVSYXRlOiBvcHM/LnNhbXBsZVJhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZVJlc2FtcGxlclxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGVxdWFsaXplcjoge1xuICAgICAgICAgICAgICAgICAgICAgIGJhbmRNdWx0aXBsaWVyOiBvcHM/LmVxLFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVFcXVhbGl6ZXJcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB2b2x1bWU6IHtcbiAgICAgICAgICAgICAgICAgICAgICB2b2x1bWU6IG9wcz8udm9sdW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVWb2x1bWVcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogc3JjO1xuXG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdFeGVjdXRpbmcgb25BZnRlckNyZWF0ZVN0cmVhbSBob29rLi4uJyk7XG4gICAgICAgIGNvbnN0IHBvc3RTdHJlYW0gPSBhd2FpdCB0aGlzLnF1ZXVlLm9uQWZ0ZXJDcmVhdGVTdHJlYW0/LihzdHJlYW0sIHRoaXMucXVldWUpLmNhdGNoKFxuICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW06IHN0cmVhbSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogb3BzPy50eXBlID8/IFN0cmVhbVR5cGUuQXJiaXRyYXJ5XG4gICAgICAgICAgICAgICAgfSBhcyBQb3N0UHJvY2Vzc2VkUmVzdWx0KVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdQcmVwYXJpbmcgQXVkaW9SZXNvdXJjZS4uLicpO1xuICAgICAgICB0aGlzLmF1ZGlvUmVzb3VyY2UgPSBjcmVhdGVBdWRpb1Jlc291cmNlKHBvc3RTdHJlYW0/LnN0cmVhbSA/PyBzdHJlYW0sIHtcbiAgICAgICAgICAgIGlucHV0VHlwZTogcG9zdFN0cmVhbT8udHlwZSA/PyBvcHM/LnR5cGUgPz8gU3RyZWFtVHlwZS5BcmJpdHJhcnksXG4gICAgICAgICAgICBtZXRhZGF0YTogb3BzPy5kYXRhLFxuICAgICAgICAgICAgLy8gdm9sdW1lIGNvbnRyb2xzIGhhcHBlbiBmcm9tIEF1ZGlvRmlsdGVyIERTUCB1dGlsaXR5XG4gICAgICAgICAgICBpbmxpbmVWb2x1bWU6IGZhbHNlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUmVzb3VyY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRzcD8ucmVzYW1wbGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHNwPy5maWx0ZXJzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kc3A/LmJpcXVhZCB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kc3A/LmVxdWFsaXplciB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5ZXIgc3RhdHVzXG4gICAgICogQHR5cGUge0F1ZGlvUGxheWVyU3RhdHVzfVxuICAgICAqL1xuICAgIGdldCBzdGF0dXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNjb25uZWN0cyBmcm9tIHZvaWNlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZGlzY29ubmVjdCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmF1ZGlvUGxheWVyKSB0aGlzLmF1ZGlvUGxheWVyLnN0b3AodHJ1ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB0aGlzLnZvaWNlQ29ubmVjdGlvbi5kZXN0cm95KCk7XG4gICAgICAgIH0gY2F0Y2gge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoaXMgZGlzcGF0Y2hlclxuICAgICAqL1xuICAgIHB1YmxpYyBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgdGhpcy5hdWRpb1BsYXllci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMuZHNwLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5hdWRpb1Jlc291cmNlID0gbnVsbDtcbiAgICAgICAgdGhpcy5lbWl0KCdkZXN0cm95ZWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdG9wcyB0aGUgcGxheWVyXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZW5kKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5hdWRpb1BsYXllci5zdG9wKCk7XG4gICAgICAgICAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhdXNlcyB0aGUgc3RyZWFtIHBsYXliYWNrXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaW50ZXJwb2xhdGVTaWxlbmNlPWZhbHNlXSBJZiB0cnVlLCB0aGUgcGxheWVyIHdpbGwgcGxheSA1IHBhY2tldHMgb2Ygc2lsZW5jZSBhZnRlciBwYXVzaW5nIHRvIHByZXZlbnQgYXVkaW8gZ2xpdGNoZXMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgcGF1c2UoaW50ZXJwb2xhdGVTaWxlbmNlPzogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5hdWRpb1BsYXllci5wYXVzZShpbnRlcnBvbGF0ZVNpbGVuY2UpO1xuICAgICAgICByZXR1cm4gc3VjY2VzcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN1bWVzIHRoZSBzdHJlYW0gcGxheWJhY2tcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICByZXN1bWUoKSB7XG4gICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmF1ZGlvUGxheWVyLnVucGF1c2UoKTtcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSBzdHJlYW1cbiAgICAgKiBAcGFyYW0ge0F1ZGlvUmVzb3VyY2U8VHJhY2s+fSBbcmVzb3VyY2U9dGhpcy5hdWRpb1Jlc291cmNlXSBUaGUgYXVkaW8gcmVzb3VyY2UgdG8gcGxheVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+fVxuICAgICAqL1xuICAgIGFzeW5jIHBsYXlTdHJlYW0ocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+ID0gdGhpcy5hdWRpb1Jlc291cmNlISkge1xuICAgICAgICBpZiAoIXJlc291cmNlKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19BVURJT19SRVNPVVJDRSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvdXJjZS5lbmRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5lbWl0KCdmaW5pc2gnLCByZXNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmF1ZGlvUmVzb3VyY2UpIHRoaXMuYXVkaW9SZXNvdXJjZSA9IHJlc291cmNlO1xuICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuUmVhZHkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZW50ZXJzU3RhdGUodGhpcy52b2ljZUNvbm5lY3Rpb24sIFZvaWNlQ29ubmVjdGlvblN0YXR1cy5SZWFkeSwgdGhpcy5jb25uZWN0aW9uVGltZW91dCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIucGxheShyZXNvdXJjZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBwbGF5YmFjayB2b2x1bWVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIHZvbHVtZSBhbW91bnRcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzZXRWb2x1bWUodmFsdWU6IG51bWJlcikge1xuICAgICAgICBpZiAoIXRoaXMuZHNwLnZvbHVtZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5kc3Audm9sdW1lLnNldFZvbHVtZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdm9sdW1lXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgdm9sdW1lKCkge1xuICAgICAgICBpZiAoIXRoaXMuZHNwLnZvbHVtZSkgcmV0dXJuIDEwMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHNwLnZvbHVtZS52b2x1bWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXliYWNrIHRpbWVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBzdHJlYW1UaW1lKCkge1xuICAgICAgICBpZiAoIXRoaXMuYXVkaW9SZXNvdXJjZSkgcmV0dXJuIDA7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUmVzb3VyY2UucGxheWJhY2tEdXJhdGlvbjtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgYXMgU3RyZWFtRGlzcGF0Y2hlciB9O1xuIiwgImltcG9ydCB7IFVzZXJSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBQYXNzVGhyb3VnaCwgdHlwZSBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBFbmRCZWhhdmlvclR5cGUgfSBmcm9tICdAZGlzY29yZGpzL3ZvaWNlJztcbmltcG9ydCAqIGFzIHByaXNtIGZyb20gJ3ByaXNtLW1lZGlhJztcbmltcG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgfSBmcm9tICcuLi9Wb2ljZUludGVyZmFjZS9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFJhd1RyYWNrRGF0YSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZvaWNlUmVjZWl2ZXJPcHRpb25zIHtcbiAgICBtb2RlPzogJ29wdXMnIHwgJ3BjbSc7XG4gICAgZW5kPzogRW5kQmVoYXZpb3JUeXBlO1xuICAgIHNpbGVuY2VEdXJhdGlvbj86IG51bWJlcjtcbiAgICBjcmM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBSYXdUcmFja0luaXQgPSBQYXJ0aWFsPE9taXQ8UmF3VHJhY2tEYXRhLCAnYXV0aG9yJyB8ICdwbGF5bGlzdCcgfCAnc291cmNlJyB8ICdlbmdpbmUnIHwgJ3JhdycgfCAncXVlcnlUeXBlJyB8ICdkZXNjcmlwdGlvbicgfCAndmlld3MnPj47XG5cbmV4cG9ydCBjbGFzcyBWb2ljZVJlY2VpdmVyTm9kZSB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBkaXNwYXRjaGVyOiBTdHJlYW1EaXNwYXRjaGVyKSB7fVxuXG4gICAgcHVibGljIGNyZWF0ZVJhd1RyYWNrKHN0cmVhbTogUmVhZGFibGUsIGRhdGE6IFJhd1RyYWNrSW5pdCA9IHt9KSB7XG4gICAgICAgIGRhdGEudGl0bGUgPz89IGBSZWNvcmRpbmcgJHtEYXRlLm5vdygpfWA7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBUcmFjayh0aGlzLmRpc3BhdGNoZXIucXVldWUucGxheWVyLCB7XG4gICAgICAgICAgICBhdXRob3I6ICdEaXNjb3JkJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBkYXRhLnRpdGxlLFxuICAgICAgICAgICAgdGl0bGU6IGRhdGEudGl0bGUsXG4gICAgICAgICAgICBkdXJhdGlvbjogZGF0YS5kdXJhdGlvbiB8fCAnMDowMCcsXG4gICAgICAgICAgICB2aWV3czogMCxcbiAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBkYXRhLnJlcXVlc3RlZEJ5LFxuICAgICAgICAgICAgdGh1bWJuYWlsOiBkYXRhLnRodW1ibmFpbCB8fCAnaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vZW1iZWQvYXZhdGFycy8wLnBuZycsXG4gICAgICAgICAgICB1cmw6IGRhdGEudXJsIHx8ICdodHRwczovL2Rpc2NvcmQuY29tJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ2FyYml0cmFyeScsXG4gICAgICAgICAgICByYXc6IHtcbiAgICAgICAgICAgICAgICBlbmdpbmU6IHN0cmVhbSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6ICdhcmJpdHJhcnknXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlIG11bHRpcGxlIHN0cmVhbXMgdG9nZXRoZXJcbiAgICAgKiBAcGFyYW0gc3RyZWFtcyBUaGUgYXJyYXkgb2Ygc3RyZWFtcyB0byBtZXJnZVxuICAgICAqL1xuICAgIHB1YmxpYyBtZXJnZVJlY29yZGluZ3Moc3RyZWFtczogUmVhZGFibGVbXSkge1xuICAgICAgICAvLyBUT0RPXG4gICAgICAgIHZvaWQgc3RyZWFtcztcbiAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9UX0lNUExFTUVOVEVEKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0ubWVyZ2VSZWNvcmRpbmdzKClgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWNvcmQgYSB1c2VyIGluIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0gdXNlciBUaGUgdXNlciB0byByZWNvcmRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBSZWNvcmRpbmcgb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyByZWNvcmRVc2VyKFxuICAgICAgICB1c2VyOiBVc2VyUmVzb2x2YWJsZSxcbiAgICAgICAgb3B0aW9uczogVm9pY2VSZWNlaXZlck9wdGlvbnMgPSB7XG4gICAgICAgICAgICBlbmQ6IEVuZEJlaGF2aW9yVHlwZS5BZnRlclNpbGVuY2UsXG4gICAgICAgICAgICBtb2RlOiAncGNtJyxcbiAgICAgICAgICAgIHNpbGVuY2VEdXJhdGlvbjogMTAwMFxuICAgICAgICB9XG4gICAgKSB7XG4gICAgICAgIGNvbnN0IF91c2VyID0gdGhpcy5kaXNwYXRjaGVyLnF1ZXVlLnBsYXllci5jbGllbnQudXNlcnMucmVzb2x2ZUlkKHVzZXIpO1xuXG4gICAgICAgIGNvbnN0IHBhc3NUaHJvdWdoID0gbmV3IFBhc3NUaHJvdWdoKCk7XG4gICAgICAgIGNvbnN0IHJlY2VpdmVyID0gdGhpcy5kaXNwYXRjaGVyLnZvaWNlQ29ubmVjdGlvbi5yZWNlaXZlcjtcblxuICAgICAgICBpZiAoIXJlY2VpdmVyKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRUNFSVZFUigpO1xuXG4gICAgICAgIHJlY2VpdmVyLnNwZWFraW5nLm9uKCdzdGFydCcsICh1c2VySWQpID0+IHtcbiAgICAgICAgICAgIGlmICh1c2VySWQgPT09IF91c2VyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVjZWl2ZVN0cmVhbSA9IHJlY2VpdmVyLnN1YnNjcmliZShfdXNlciwge1xuICAgICAgICAgICAgICAgICAgICBlbmQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiBvcHRpb25zLmVuZCB8fCBFbmRCZWhhdmlvclR5cGUuQWZ0ZXJTaWxlbmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IG9wdGlvbnMuc2lsZW5jZUR1cmF0aW9uID8/IDEwMDBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubW9kZSA9PT0gJ3BjbScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBjbSA9IHJlY2VpdmVTdHJlYW0ucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyAocHJpc20ub3B1cyB8fCAoPGFueT5wcmlzbSkuZGVmYXVsdC5vcHVzKS5EZWNvZGVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHM6IDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZTogOTYwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlOiA0ODAwMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBjbS5waXBlKHBhc3NUaHJvdWdoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWNlaXZlU3RyZWFtLnBpcGUocGFzc1Rocm91Z2gpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkudW5yZWYoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHBhc3NUaHJvdWdoIGFzIFJlYWRhYmxlO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBRdWV1ZSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgdHJhY2tzID0gbmV3IFF1ZXVlPFRyYWNrPignTElGTycpO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4pIHt9XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY3VycmVudFRyYWNrKCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5tZXRhZGF0YSB8fCAoKHRoaXMucXVldWUgYXMgYW55KS5fX2N1cnJlbnQgYXMgVHJhY2sgfCBudWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOZXh0IHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbmV4dFRyYWNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS50cmFja3MuYXQoMCkgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmV2aW91cyB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHByZXZpb3VzVHJhY2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5hdCgwKSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIGhpc3RvcnkgaXMgZGlzYWJsZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVIaXN0b3J5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHNpemUgb2YgdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiBoaXN0b3J5IGlzIGVtcHR5XG4gICAgICovXG4gICAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplIDwgMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgdHJhY2sgdG8gdHJhY2sgaGlzdG9yeVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gYWRkXG4gICAgICovXG4gICAgcHVibGljIHB1c2godHJhY2s6IFRyYWNrIHwgVHJhY2tbXSkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnRyYWNrcy5hZGQodHJhY2spO1xuXG4gICAgICAgIHRoaXMucmVzaXplKCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgaGlzdG9yeVxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhcigpIHtcbiAgICAgICAgdGhpcy50cmFja3MuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGF5IHRoZSBuZXh0IHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBuZXh0KCkge1xuICAgICAgICBjb25zdCB0cmFjayA9IHRoaXMubmV4dFRyYWNrO1xuICAgICAgICBpZiAoIXRyYWNrKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ05vIG5leHQgdHJhY2sgaW4gdGhlIHF1ZXVlJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnF1ZXVlLm5vZGUuc2tpcCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgdGhlIHByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwcmV2aW91cyhwcmVzZXJ2ZUN1cnJlbnQgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IHRyYWNrID0gdGhpcy50cmFja3MuZGlzcGF0Y2goKTtcbiAgICAgICAgaWYgKCF0cmFjaykge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKCdObyBwcmV2aW91cyB0cmFjayBpbiB0aGUgcXVldWUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnRUcmFjaztcblxuICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLm5vZGUucGxheSh0cmFjaywgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgIGlmIChjdXJyZW50ICYmIHByZXNlcnZlQ3VycmVudCkgdGhpcy5xdWV1ZS5ub2RlLmluc2VydChjdXJyZW50LCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyB0byBbR3VpbGRRdWV1ZUhpc3RvcnldLnByZXZpb3VzKClcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFjayhwcmVzZXJ2ZUN1cnJlbnQgPSB0cnVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXZpb3VzKHByZXNlcnZlQ3VycmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzaXplIGhpc3Rvcnkgc3RvcmVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzaXplKCkge1xuICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh0aGlzLnF1ZXVlLm1heEhpc3RvcnlTaXplKSkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy50cmFja3Muc3RvcmUubGVuZ3RoIDwgdGhpcy5xdWV1ZS5tYXhIaXN0b3J5U2l6ZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLnRyYWNrcy5zdG9yZS5zcGxpY2UodGhpcy5xdWV1ZS5tYXhIaXN0b3J5U2l6ZSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEF1ZGlvUmVzb3VyY2UsIFN0cmVhbVR5cGUgfSBmcm9tICdAZGlzY29yZGpzL3ZvaWNlJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFBsYXllclByb2dyZXNzYmFyT3B0aW9ucywgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgUXVlcnlSZXNvbHZlciB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuaW1wb3J0IHsgVXRpbCwgVkFMSURBVEVfUVVFVUVfQ0FQIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBUcmFjaywgVHJhY2tSZXNvbHZhYmxlIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIEd1aWxkUXVldWVFdmVudCB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IGFzIHdhaXRGb3IgfSBmcm9tICd0aW1lcnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgQXN5bmNRdWV1ZSB9IGZyb20gJy4uL3V0aWxzL0FzeW5jUXVldWUnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IENyZWF0ZVN0cmVhbU9wcyB9IGZyb20gJy4uL1ZvaWNlSW50ZXJmYWNlL1N0cmVhbURpc3BhdGNoZXInO1xuXG5leHBvcnQgY29uc3QgRkZNUEVHX1NSQVRFX1JFR0VYID0gL2FzZXRyYXRlPVxcZCtcXCooXFxkKFxcLlxcZCk/KS87XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VQbGF5T3B0aW9ucyB7XG4gICAgcXVldWU/OiBib29sZWFuO1xuICAgIHNlZWs/OiBudW1iZXI7XG4gICAgdHJhbnNpdGlvbk1vZGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllclRpbWVzdGFtcCB7XG4gICAgY3VycmVudDoge1xuICAgICAgICBsYWJlbDogc3RyaW5nO1xuICAgICAgICB2YWx1ZTogbnVtYmVyO1xuICAgIH07XG4gICAgdG90YWw6IHtcbiAgICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgICAgdmFsdWU6IG51bWJlcjtcbiAgICB9O1xuICAgIHByb2dyZXNzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtQ29uZmlnIHtcbiAgICBkaXNwYXRjaGVyQ29uZmlnOiBDcmVhdGVTdHJlYW1PcHM7XG4gICAgcGxheWVyQ29uZmlnOiBSZXNvdXJjZVBsYXlPcHRpb25zO1xufVxuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YSA9IHVua25vd24+IHtcbiAgICAjcHJvZ3Jlc3MgPSAwO1xuICAgIHB1YmxpYyB0YXNrc1F1ZXVlID0gbmV3IEFzeW5jUXVldWUoKTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgaW4gaWRsZSBtb2RlXG4gICAgICovXG4gICAgcHVibGljIGlzSWRsZSgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc0lkbGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBidWZmZXJpbmcgdGhlIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGlzQnVmZmVyaW5nKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzQnVmZmVyaW5nKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGxheWluZyBhIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGlzUGxheWluZygpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc1BsYXlpbmcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBwYXVzZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNQYXVzZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNQYXVzZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldCBwcm9ncmVzcyBoaXN0b3J5XG4gICAgICovXG4gICAgcHVibGljIHJlc2V0UHJvZ3Jlc3MoKSB7XG4gICAgICAgIHRoaXMuI3Byb2dyZXNzID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcGxheWVyIHByb2dyZXNzXG4gICAgICovXG4gICAgcHVibGljIHNldFByb2dyZXNzKHByb2dyZXNzOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSBwcm9ncmVzcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RyZWFtIHRpbWUgZm9yIGN1cnJlbnQgc2Vzc2lvblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc3RyZWFtVGltZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uc3RyZWFtVGltZSA/PyAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgcGxheWJhY2sgZHVyYXRpb24gd2l0aCBoaXN0b3J5IGluY2x1ZGVkXG4gICAgICovXG4gICAgcHVibGljIGdldCBwbGF5YmFja1RpbWUoKSB7XG4gICAgICAgIGNvbnN0IGR1ciA9IHRoaXMuI3Byb2dyZXNzICsgdGhpcy5zdHJlYW1UaW1lO1xuXG4gICAgICAgIHJldHVybiBkdXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGR1cmF0aW9uIG11bHRpcGxpZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkge1xuICAgICAgICBjb25zdCBzcmF0ZUZpbHRlcnMgPSB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLnRvQXJyYXkoKS5maWx0ZXIoKGZmKSA9PiBGRk1QRUdfU1JBVEVfUkVHRVgudGVzdChmZikpO1xuICAgICAgICBjb25zdCBtdWx0aXBsaWVycyA9IHNyYXRlRmlsdGVyc1xuICAgICAgICAgICAgLm1hcCgobSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KEZGTVBFR19TUkFURV9SRUdFWC5leGVjKG0pPy5bMV0gYXMgc3RyaW5nKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZmlsdGVyKChmKSA9PiAhaXNOYU4oZikpO1xuXG4gICAgICAgIHJldHVybiAhbXVsdGlwbGllcnMubGVuZ3RoID8gMSA6IG11bHRpcGxpZXJzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnQpID0+IGN1cnJlbnQgKyBhY2N1bXVsYXRvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXN0aW1hdGVkIHByb2dyZXNzIG9mIHRoZSBwbGF5ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVzdGltYXRlZFBsYXliYWNrVGltZSgpIHtcbiAgICAgICAgY29uc3QgZHVyID0gdGhpcy5wbGF5YmFja1RpbWU7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHRoaXMuZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkgKiBkdXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzdGltYXRlZCB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgcGxheWVyXG4gICAgICovXG4gICAgcHVibGljIGdldCBlc3RpbWF0ZWREdXJhdGlvbigpIHtcbiAgICAgICAgY29uc3QgZHVyID0gdGhpcy50b3RhbER1cmF0aW9uO1xuXG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGR1ciAvIHRoaXMuZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvdGFsIGR1cmF0aW9uIG9mIHRoZSBjdXJyZW50IGF1ZGlvIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGdldCB0b3RhbER1cmF0aW9uKCkge1xuICAgICAgICBjb25zdCBwcmVmZXJzQnJpZGdlZE1ldGFkYXRhID0gdGhpcy5xdWV1ZS5vcHRpb25zLnByZWZlckJyaWRnZWRNZXRhZGF0YTtcbiAgICAgICAgY29uc3QgdHJhY2sgPSB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaztcblxuICAgICAgICBpZiAocHJlZmVyc0JyaWRnZWRNZXRhZGF0YSAmJiB0cmFjaz8ubWV0YWRhdGEgIT0gbnVsbCAmJiB0eXBlb2YgdHJhY2subWV0YWRhdGEgPT09ICdvYmplY3QnICYmICdicmlkZ2UnIGluIHRyYWNrLm1ldGFkYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IChcbiAgICAgICAgICAgICAgICB0cmFjayBhcyBUcmFjazx7XG4gICAgICAgICAgICAgICAgICAgIGJyaWRnZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IG51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9PlxuICAgICAgICAgICAgKS5tZXRhZGF0YT8uYnJpZGdlLmR1cmF0aW9uO1xuXG4gICAgICAgICAgICBpZiAoVHlwZVV0aWwuaXNOdW1iZXIoZHVyYXRpb24pKSByZXR1cm4gZHVyYXRpb247XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJhY2s/LmR1cmF0aW9uTVMgPz8gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc3RyZWFtIHByb2dyZXNzXG4gICAgICogQHBhcmFtIGlnbm9yZUZpbHRlcnMgSWdub3JlIGZpbHRlcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VGltZXN0YW1wKGlnbm9yZUZpbHRlcnMgPSBmYWxzZSk6IFBsYXllclRpbWVzdGFtcCB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuY3VycmVudFRyYWNrKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBjdXJyZW50ID0gaWdub3JlRmlsdGVycyA/IHRoaXMucGxheWJhY2tUaW1lIDogdGhpcy5lc3RpbWF0ZWRQbGF5YmFja1RpbWU7XG4gICAgICAgIGNvbnN0IHRvdGFsID0gaWdub3JlRmlsdGVycyA/IHRoaXMudG90YWxEdXJhdGlvbiA6IHRoaXMuZXN0aW1hdGVkRHVyYXRpb247XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGN1cnJlbnQ6IHtcbiAgICAgICAgICAgICAgICBsYWJlbDogVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyhjdXJyZW50KSksXG4gICAgICAgICAgICAgICAgdmFsdWU6IGN1cnJlbnRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0b3RhbDoge1xuICAgICAgICAgICAgICAgIGxhYmVsOiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRvdGFsKSksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRvdGFsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJvZ3Jlc3M6IE1hdGgucm91bmQoKGN1cnJlbnQgLyB0b3RhbCkgKiAxMDApXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHByb2dyZXNzIGJhciBmb3IgY3VycmVudCBwcm9ncmVzc1xuICAgICAqIEBwYXJhbSBvcHRpb25zIFByb2dyZXNzIGJhciBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVByb2dyZXNzQmFyKG9wdGlvbnM/OiBQbGF5ZXJQcm9ncmVzc2Jhck9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gdGhpcy5nZXRUaW1lc3RhbXAoKTtcbiAgICAgICAgaWYgKCF0aW1lc3RhbXApIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHsgaW5kaWNhdG9yID0gJ1x1RDgzRFx1REQxOCcsIGxlbmd0aCA9IDE1LCBsaW5lID0gJ1x1MjVBQycsIHRpbWVjb2RlcyA9IHRydWUgfSA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkgfHwgbGVuZ3RoIDwgMCB8fCAhTnVtYmVyLmlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX09VVF9PRl9SQU5HRSgnW1BsYXllclByb2dyZXNzQmFyT3B0aW9ucy5sZW5ndGhdJywgU3RyaW5nKGxlbmd0aCksICcwJywgJ0Zpbml0ZSBOdW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleCA9IE1hdGgucm91bmQoKHRpbWVzdGFtcC5jdXJyZW50LnZhbHVlIC8gdGltZXN0YW1wLnRvdGFsLnZhbHVlKSAqIGxlbmd0aCk7XG5cbiAgICAgICAgaWYgKGluZGV4ID49IDEgJiYgaW5kZXggPD0gbGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBiYXIgPSBsaW5lLnJlcGVhdChsZW5ndGggLSAxKS5zcGxpdCgnJyk7XG4gICAgICAgICAgICBiYXIuc3BsaWNlKGluZGV4LCAwLCBpbmRpY2F0b3IpO1xuICAgICAgICAgICAgaWYgKHRpbWVjb2Rlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHt0aW1lc3RhbXAuY3VycmVudC5sYWJlbH0gXHUyNTAzICR7YmFyLmpvaW4oJycpfSBcdTI1MDMgJHt0aW1lc3RhbXAudG90YWwubGFiZWx9YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke2Jhci5qb2luKCcnKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRpbWVjb2Rlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHt0aW1lc3RhbXAuY3VycmVudC5sYWJlbH0gXHUyNTAzICR7aW5kaWNhdG9yfSR7bGluZS5yZXBlYXQobGVuZ3RoIC0gMSl9IFx1MjUwMyAke3RpbWVzdGFtcC50b3RhbC5sYWJlbH1gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7aW5kaWNhdG9yfSR7bGluZS5yZXBlYXQobGVuZ3RoIC0gMSl9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlZWsgdGhlIHBsYXllclxuICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gdG8gc2VlayB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZWVrKGR1cmF0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5xdWV1ZS5maWx0ZXJzLnRyaWdnZXJSZXBsYXkoZHVyYXRpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgdm9sdW1lXG4gICAgICovXG4gICAgcHVibGljIGdldCB2b2x1bWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnZvbHVtZSA/PyAxMDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHZvbHVtZVxuICAgICAqIEBwYXJhbSB2b2wgVm9sdW1lIGFtb3VudCB0byBzZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0Vm9sdW1lKHZvbDogbnVtYmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlcyA9IHRoaXMucXVldWUuZGlzcGF0Y2hlci5zZXRWb2x1bWUodm9sKTtcbiAgICAgICAgaWYgKHJlcykgdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IHZvbDtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgYml0IHJhdGVcbiAgICAgKiBAcGFyYW0gcmF0ZSBUaGUgYml0IHJhdGUgdG8gc2V0XG4gICAgICovXG4gICAgcHVibGljIHNldEJpdHJhdGUocmF0ZTogbnVtYmVyIHwgJ2F1dG8nKSB7XG4gICAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8uZW5jb2Rlcj8uc2V0Qml0cmF0ZShyYXRlID09PSAnYXV0bycgPyB0aGlzLnF1ZXVlLmNoYW5uZWw/LmJpdHJhdGUgPz8gNjQwMDAgOiByYXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcGF1c2VkIHN0YXRlXG4gICAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRQYXVzZWQoc3RhdGU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHN0YXRlKSByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5wYXVzZSh0cnVlKSB8fCBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucmVzdW1lKCkgfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGF1c2UgdGhlIHBsYXliYWNrXG4gICAgICovXG4gICAgcHVibGljIHBhdXNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRQYXVzZWQodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzdW1lIHRoZSBwbGF5YmFja1xuICAgICAqL1xuICAgIHB1YmxpYyByZXN1bWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldFBhdXNlZChmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2tpcCBjdXJyZW50IHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIHNraXAoKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMucXVldWUuc2V0VHJhbnNpdGlvbmluZyhmYWxzZSk7XG4gICAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlci5lbmQoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoZSBnaXZlbiB0cmFjayBmcm9tIHF1ZXVlXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byByZW1vdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgZm91bmRUcmFjayA9IHRoaXMucXVldWUudHJhY2tzLmZpbmQoKHQsIGlkeCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRyYWNrIGluc3RhbmNlb2YgVHJhY2sgfHwgdHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJyA/IHRyYWNrIDogdHJhY2suaWQpID09PSB0LmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHJldHVybiB0cmFjayA9PT0gdC5pZDtcbiAgICAgICAgICAgIHJldHVybiBpZHggPT09IHRyYWNrO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFmb3VuZFRyYWNrKSByZXR1cm4gbnVsbDtcblxuICAgICAgICB0aGlzLnF1ZXVlLnRyYWNrcy5yZW1vdmVPbmUoKHQpID0+IHQuaWQgPT09IGZvdW5kVHJhY2suaWQpO1xuXG4gICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuYXVkaW9UcmFja1JlbW92ZSwgdGhpcy5xdWV1ZSwgZm91bmRUcmFjayk7XG5cbiAgICAgICAgcmV0dXJuIGZvdW5kVHJhY2s7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSnVtcCB0byBzcGVjaWZpYyB0cmFjayBvbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGp1bXAgdG8gd2l0aG91dCByZW1vdmluZyBvdGhlciB0cmFja3NcbiAgICAgKi9cbiAgICBwdWJsaWMganVtcCh0cmFjazogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJlbW92ZSh0cmFjayk7XG4gICAgICAgIGlmICghcmVtb3ZlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZS51bnNoaWZ0KHJlbW92ZWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5za2lwKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRyYWNrIHBvc2l0aW9uXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRUcmFja1Bvc2l0aW9uKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS50cmFja3MudG9BcnJheSgpLmZpbmRJbmRleCgodCwgaWR4KSA9PiB7XG4gICAgICAgICAgICBpZiAodHJhY2sgaW5zdGFuY2VvZiBUcmFjayB8fCB0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnID8gdHJhY2sgOiB0cmFjay5pZCkgPT09IHQuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykgcmV0dXJuIHRyYWNrID09PSB0LmlkO1xuICAgICAgICAgICAgcmV0dXJuIGlkeCA9PT0gdHJhY2s7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNraXAgdG8gdGhlIGdpdmVuIHRyYWNrLCByZW1vdmluZyBvdGhlcnMgb24gdGhlIHdheVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gc2tpcCB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBza2lwVG8odHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgICAgICBjb25zdCBpZHggPSB0aGlzLmdldFRyYWNrUG9zaXRpb24odHJhY2spO1xuICAgICAgICBpZiAoaWR4IDwgMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yZW1vdmUoaWR4KTtcbiAgICAgICAgaWYgKCFyZW1vdmVkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHRvUmVtb3ZlID0gdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUuZmlsdGVyKChfLCBpKSA9PiBpIDw9IGlkeCk7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnNwbGljZSgwLCBpZHgsIHJlbW92ZWQpO1xuICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmF1ZGlvVHJhY2tzUmVtb3ZlLCB0aGlzLnF1ZXVlLCB0b1JlbW92ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLnNraXAoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnNlcnQgYSB0cmFjayBvbiB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gcXVldWVcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGluc2VydFxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRvLCBkZWZhdWx0cyB0byAwLlxuICAgICAqL1xuICAgIHB1YmxpYyBpbnNlcnQodHJhY2s6IFRyYWNrLCBpbmRleCA9IDApIHtcbiAgICAgICAgaWYgKCEodHJhY2sgaW5zdGFuY2VvZiBUcmFjaykpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ3RyYWNrIHZhbHVlJywgJ2luc3RhbmNlIG9mIFRyYWNrJywgU3RyaW5nKHRyYWNrKSk7XG4gICAgICAgIFZBTElEQVRFX1FVRVVFX0NBUCh0aGlzLnF1ZXVlLCB0cmFjayk7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnNwbGljZShpbmRleCwgMCwgdHJhY2spO1xuICAgICAgICBpZiAoIXRoaXMucXVldWUub3B0aW9ucy5ub0VtaXRJbnNlcnQpIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuYXVkaW9UcmFja0FkZCwgdGhpcy5xdWV1ZSwgdHJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIG1vdmVcbiAgICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIG1vdmUgdG9cbiAgICAgKi9cbiAgICBwdWJsaWMgbW92ZShmcm9tOiBUcmFja1Jlc29sdmFibGUsIHRvOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmVtb3ZlKGZyb20pO1xuICAgICAgICBpZiAoIXJlbW92ZWQpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVCgnaW52YWxpZCB0cmFjayB0byBtb3ZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnNlcnQocmVtb3ZlZCwgdG8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcHkgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gY2xvbmVcbiAgICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIGNsb25lIGF0XG4gICAgICovXG4gICAgcHVibGljIGNvcHkoZnJvbTogVHJhY2tSZXNvbHZhYmxlLCB0bzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHNyYyA9IHRoaXMucXVldWUudHJhY2tzLmF0KHRoaXMuZ2V0VHJhY2tQb3NpdGlvbihmcm9tKSk7XG4gICAgICAgIGlmICghc3JjKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ2ludmFsaWQgdHJhY2sgdG8gY29weScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5zZXJ0KHNyYywgdG8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN3YXAgdHdvIHRyYWNrcyBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gZmlyc3QgVGhlIGZpcnN0IHRyYWNrIHRvIHN3YXBcbiAgICAgKiBAcGFyYW0gc2Vjb25kIFRoZSBzZWNvbmQgdHJhY2sgdG8gc3dhcFxuICAgICAqL1xuICAgIHB1YmxpYyBzd2FwKGZpcnN0OiBUcmFja1Jlc29sdmFibGUsIHNlY29uZDogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IHNyYyA9IHRoaXMuZ2V0VHJhY2tQb3NpdGlvbihmaXJzdCk7XG4gICAgICAgIGlmIChzcmMgPCAwKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ2ludmFsaWQgc3JjIHRyYWNrIHRvIHN3YXAnKTtcblxuICAgICAgICBjb25zdCBkZXN0ID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKHNlY29uZCk7XG4gICAgICAgIGlmIChkZXN0IDwgMCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKCdpbnZhbGlkIGRlc3QgdHJhY2sgdG8gc3dhcCcpO1xuXG4gICAgICAgIGNvbnN0IHNyY1QgPSB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtzcmNdO1xuICAgICAgICBjb25zdCBkZXN0VCA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlW2Rlc3RdO1xuXG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlW3NyY10gPSBkZXN0VDtcbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbZGVzdF0gPSBzcmNUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0b3AgdGhlIHBsYXliYWNrXG4gICAgICogQHBhcmFtIGZvcmNlIFdoZXRoZXIgb3Igbm90IHRvIGZvcmNlZnVsbHkgc3RvcCB0aGUgcGxheWJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RvcChmb3JjZSA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMucXVldWUuaGlzdG9yeS5jbGVhcigpO1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuZW5kKCk7XG4gICAgICAgIGlmIChmb3JjZSkge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLm9wdGlvbnMubGVhdmVPblN0b3ApIHtcbiAgICAgICAgICAgIGNvbnN0IHRtOiBOb2RlSlMuVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUGxheWluZygpIHx8IHRoaXMucXVldWUudHJhY2tzLnNpemUpIHJldHVybiBjbGVhclRpbWVvdXQodG0pO1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZGVzdHJveSgpO1xuICAgICAgICAgICAgfSwgdGhpcy5xdWV1ZS5vcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24pLnVucmVmKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSByYXcgYXVkaW8gcmVzb3VyY2VcbiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGF1ZGlvIHJlc291cmNlIHRvIHBsYXlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheVJhdyhyZXNvdXJjZTogQXVkaW9SZXNvdXJjZSkge1xuICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnBsYXlTdHJlYW0ocmVzb3VyY2UgYXMgQXVkaW9SZXNvdXJjZTxUcmFjaz4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgdGhlIGdpdmVuIHRyYWNrXG4gICAgICogQHBhcmFtIHJlcyBUaGUgdHJhY2sgdG8gcGxheVxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHBsYXlpbmcgdGhlIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYXkocmVzPzogVHJhY2sgfCBudWxsLCBvcHRpb25zPzogUmVzb3VyY2VQbGF5T3B0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8udm9pY2VDb25uZWN0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19WT0lDRV9DT05ORUNUSU9OKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgUmVjZWl2ZWQgcGxheSByZXF1ZXN0IGZyb20gZ3VpbGQgJHt0aGlzLnF1ZXVlLmd1aWxkLm5hbWV9IChJRDogJHt0aGlzLnF1ZXVlLmd1aWxkLmlkfSlgKTtcblxuICAgICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHF1ZXVlOiB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjayAhPSBudWxsLFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25Nb2RlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzZWVrOiAwXG4gICAgICAgICAgICB9IGFzIFJlc291cmNlUGxheU9wdGlvbnMsXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICkhO1xuXG4gICAgICAgIGlmIChyZXMgJiYgb3B0aW9ucy5xdWV1ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ1JlcXVlc3RlZCBvcHRpb24gcmVxdWlyZXMgdG8gcXVldWUgdGhlIHRyYWNrLCBhZGRpbmcgdGhlIGdpdmVuIHRyYWNrIHRvIHF1ZXVlIGluc3RlYWQuLi4nKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmFkZFRyYWNrKHJlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmFjayA9IHJlcyB8fCB0aGlzLnF1ZXVlLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgICAgICBpZiAoIXRyYWNrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5vcHRpb25zLnNraXBPbk5vU3RyZWFtKSByZXR1cm47XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ1BsYXkgcmVxdWVzdCByZWNlaXZlZCBidXQgdHJhY2sgd2FzIG5vdCBwcm92aWRlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ1JlcXVlc3RlZCBvcHRpb24gcmVxdWlyZXMgdG8gcGxheSB0aGUgdHJhY2ssIGluaXRpYWxpemluZy4uLicpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgSW5pdGlhdGluZyBzdHJlYW0gZXh0cmFjdGlvbiBwcm9jZXNzLi4uYCk7XG4gICAgICAgICAgICBjb25zdCBzcmMgPSB0cmFjay5yYXc/LnNvdXJjZSB8fCB0cmFjay5zb3VyY2U7XG4gICAgICAgICAgICBjb25zdCBxdDogU2VhcmNoUXVlcnlUeXBlID0gdHJhY2sucXVlcnlUeXBlIHx8IChzcmMgPT09ICdzcG90aWZ5JyA/ICdzcG90aWZ5U29uZycgOiBzcmMgPT09ICdhcHBsZV9tdXNpYycgPyAnYXBwbGVNdXNpY1NvbmcnIDogc3JjKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBFeGVjdXRpbmcgb25CZWZvcmVDcmVhdGVTdHJlYW0gaG9vayAoUXVlcnlUeXBlOiAke3F0fSkuLi5gKTtcblxuICAgICAgICAgICAgY29uc3Qgc3RyZWFtU3JjID0ge1xuICAgICAgICAgICAgICAgIGVycm9yOiBudWxsIGFzIEVycm9yIHwgbnVsbCxcbiAgICAgICAgICAgICAgICBzdHJlYW06IG51bGwgYXMgUmVhZGFibGUgfCBudWxsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLm9uQmVmb3JlQ3JlYXRlU3RyZWFtPy4odHJhY2ssIHF0IHx8ICdhcmJpdHJhcnknLCB0aGlzLnF1ZXVlKS50aGVuKFxuICAgICAgICAgICAgICAgIChzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGU6IEVycm9yKSA9PiAoc3RyZWFtU3JjLmVycm9yID0gZSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIHRocm93IGlmICdvbkJlZm9yZUNyZWF0ZVN0cmVhbScgcGFuaWNzXG4gICAgICAgICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0gJiYgc3RyZWFtU3JjLmVycm9yKSByZXR1cm4gdGhpcy4jdGhyb3codHJhY2ssIHN0cmVhbVNyYy5lcnJvcik7XG5cbiAgICAgICAgICAgIC8vIGRlZmF1bHQgYmVoYXZpb3Igd2hlbiAnb25CZWZvcmVDcmVhdGVTdHJlYW0nIGRpZCBub3QgcGFuaWNcbiAgICAgICAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdGYWlsZWQgdG8gZ2V0IHN0cmVhbSBmcm9tIG9uQmVmb3JlQ3JlYXRlU3RyZWFtIScpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI2NyZWF0ZUdlbmVyaWNTdHJlYW0odHJhY2spLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgIChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocj8ucmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA9IDxSZWFkYWJsZT5yLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyPy5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNyYy5lcnJvciA9IHIuZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gc3RyZWFtU3JjLmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKGU6IEVycm9yKSA9PiAoc3RyZWFtU3JjLmVycm9yID0gZSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0pIHJldHVybiB0aGlzLiN0aHJvdyh0cmFjaywgc3RyZWFtU3JjLmVycm9yKTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnNlZWsgPT09ICdudW1iZXInICYmIG9wdGlvbnMuc2VlayA+PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSBvcHRpb25zLnNlZWs7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuI3Byb2dyZXNzID0gMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIGNvbnN0IGNvb2tpZXMgPSB0cmFjay5yYXc/LnNvdXJjZSA9PT0gJ3lvdXR1YmUnID8gKDxhbnk+dGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy55dGRsT3B0aW9ucz8ucmVxdWVzdE9wdGlvbnMpPy5oZWFkZXJzPy5jb29raWUgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBjcmVhdGVTdHJlYW1Db25maWcgPSB7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUJpcXVhZDogdGhpcy5xdWV1ZS5vcHRpb25zLmJpcXVhZCA9PT0gZmFsc2UsXG4gICAgICAgICAgICAgICAgZGlzYWJsZUVxdWFsaXplcjogdGhpcy5xdWV1ZS5vcHRpb25zLmVxdWFsaXplciA9PT0gZmFsc2UsXG4gICAgICAgICAgICAgICAgZGlzYWJsZVZvbHVtZTogdGhpcy5xdWV1ZS5vcHRpb25zLnZvbHVtZSA9PT0gZmFsc2UsXG4gICAgICAgICAgICAgICAgZGlzYWJsZUZpbHRlcnM6IHRoaXMucXVldWUub3B0aW9ucy5maWx0ZXJlciA9PT0gZmFsc2UsXG4gICAgICAgICAgICAgICAgZGlzYWJsZVJlc2FtcGxlcjogdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA9PT0gZmFsc2UsXG4gICAgICAgICAgICAgICAgc2FtcGxlUmF0ZTogdHlwZW9mIHRoaXMucXVldWUub3B0aW9ucy5yZXNhbXBsZXIgPT09ICdudW1iZXInICYmIHRoaXMucXVldWUub3B0aW9ucy5yZXNhbXBsZXIgPiAwID8gdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBiaXF1YWRGaWx0ZXI6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGVxOiB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzOiB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyxcbiAgICAgICAgICAgICAgICB2b2x1bWU6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUsXG4gICAgICAgICAgICAgICAgZGF0YTogdHJhY2ssXG4gICAgICAgICAgICAgICAgdHlwZTogU3RyZWFtVHlwZS5SYXdcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IHRyYWNrU3RyZWFtQ29uZmlnOiBTdHJlYW1Db25maWcgPSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hlckNvbmZpZzogY3JlYXRlU3RyZWFtQ29uZmlnLFxuICAgICAgICAgICAgICAgIHBsYXllckNvbmZpZzogb3B0aW9uc1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbGV0IHJlc29sdmVyOiAoKSA9PiB2b2lkID0gVXRpbC5ub29wO1xuICAgICAgICAgICAgY29uc3QgZG9uZVByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gKHJlc29sdmVyID0gcmVzb2x2ZSkpO1xuXG4gICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC53aWxsUGxheVRyYWNrLCB0aGlzLnF1ZXVlLCB0cmFjaywgdHJhY2tTdHJlYW1Db25maWcsIHJlc29sdmVyISk7XG5cbiAgICAgICAgICAgIC8vIHByZXZlbnQgZGFuZ2xpbmcgcHJvbWlzZVxuICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSByZXNvbHZlcigpO1xuXG4gICAgICAgICAgICBhd2FpdCBkb25lUHJvbWlzZTtcblxuICAgICAgICAgICAgY29uc3QgcGNtU3RyZWFtID0gdGhpcy4jY3JlYXRlRkZtcGVnU3RyZWFtKHN0cmVhbVNyYy5zdHJlYW0sIHRyYWNrLCBvcHRpb25zLnNlZWsgPz8gMCwgY29va2llcyk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnRyYW5zaXRpb25Nb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYFRyYW5zaXRpb24gbW9kZSBkZXRlY3RlZCwgcGxheWVyIHdpbGwgd2FpdCBmb3IgYnVmZmVyaW5nIHRpbWVvdXQgdG8gZXhwaXJlIChUaW1lb3V0OiAke3RoaXMucXVldWUub3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0fW1zKWApO1xuICAgICAgICAgICAgICAgIGF3YWl0IHdhaXRGb3IodGhpcy5xdWV1ZS5vcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdCdWZmZXJpbmcgdGltZW91dCBoYXMgZXhwaXJlZCEnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYFByZXBhcmluZyBmaW5hbCBzdHJlYW0gY29uZmlnOiAke0pTT04uc3RyaW5naWZ5KHRyYWNrU3RyZWFtQ29uZmlnLCBudWxsLCAyKX1gKTtcblxuICAgICAgICAgICAgY29uc3QgcmVzb3VyY2UgPSBhd2FpdCB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuY3JlYXRlU3RyZWFtKHBjbVN0cmVhbSwgY3JlYXRlU3RyZWFtQ29uZmlnKTtcblxuICAgICAgICAgICAgdGhpcy5xdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKCEhb3B0aW9ucy50cmFuc2l0aW9uTW9kZSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3BlcmZvcm1QbGF5KHJlc291cmNlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYEZhaWxlZCB0byBpbml0aWFsaXplIGF1ZGlvIHBsYXllcjogJHtlfWApO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgICN0aHJvdyh0cmFjazogVHJhY2ssIGVycm9yPzogRXJyb3IgfCBudWxsKSB7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICBjb25zdCBzdHJlYW1EZWZpbml0ZWx5RmFpbGVkTXlEZWFyVF9UUGxlYXNlVHJ1c3RNZUl0c05vdE15RmF1bHQgPSAoXG4gICAgICAgICAgICBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoYENvdWxkIG5vdCBleHRyYWN0IHN0cmVhbSBmb3IgdGhpcyB0cmFjayR7ZXJyb3IgPyBgXFxuXFxuJHtlcnJvci5zdGFjayB8fCBlcnJvcn1gIDogJyd9YClcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhpcy5xdWV1ZS5vcHRpb25zLnNraXBPbk5vU3RyZWFtKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnBsYXllclNraXAsIHRoaXMucXVldWUsIHRyYWNrKTtcbiAgICAgICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyRXJyb3IsIHRoaXMucXVldWUsIHN0cmVhbURlZmluaXRlbHlGYWlsZWRNeURlYXJUX1RQbGVhc2VUcnVzdE1lSXRzTm90TXlGYXVsdCwgdHJhY2spO1xuICAgICAgICAgICAgY29uc3QgbmV4dFRyYWNrID0gdGhpcy5xdWV1ZS50cmFja3MuZGlzcGF0Y2goKTtcbiAgICAgICAgICAgIGlmIChuZXh0VHJhY2spIHRoaXMucGxheShuZXh0VHJhY2ssIHsgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgc3RyZWFtRGVmaW5pdGVseUZhaWxlZE15RGVhclRfVFBsZWFzZVRydXN0TWVJdHNOb3RNeUZhdWx0O1xuICAgIH1cblxuICAgIGFzeW5jICNwZXJmb3JtUGxheShyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0luaXRpYWxpemluZyBhdWRpbyBwbGF5ZXIuLi4nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyIS5wbGF5U3RyZWFtKHJlc291cmNlKTtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0Rpc3BhdGNoaW5nIGF1ZGlvLi4uJyk7XG4gICAgfVxuXG4gICAgYXN5bmMgI2NyZWF0ZUdlbmVyaWNTdHJlYW0odHJhY2s6IFRyYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBBdHRlbXB0aW5nIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyByZWdpc3RlcmVkIGV4dHJhY3RvcnNgKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtSW5mbyA9IGF3YWl0IHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHRyYWN0b3IpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLmJsb2NrU3RyZWFtRnJvbT8uc29tZSgoZXh0KSA9PiBleHQgPT09IGV4dHJhY3Rvci5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgY2FuU3RyZWFtID0gYXdhaXQgZXh0cmFjdG9yLnZhbGlkYXRlKHRyYWNrLnVybCwgdHJhY2sucXVlcnlUeXBlIHx8IFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZSh0cmFjay51cmwpKTtcbiAgICAgICAgICAgIGlmICghY2FuU3RyZWFtKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZXh0cmFjdG9yLnN0cmVhbSh0cmFjayk7XG4gICAgICAgIH0sIGZhbHNlKTtcbiAgICAgICAgaWYgKCFzdHJlYW1JbmZvIHx8ICFzdHJlYW1JbmZvLnJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYEZhaWxlZCB0byBleHRyYWN0IHN0cmVhbSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgcmVnaXN0ZXJlZCBleHRyYWN0b3JzYCk7XG4gICAgICAgICAgICByZXR1cm4gc3RyZWFtSW5mbyB8fCBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBTdHJlYW0gZXh0cmFjdGlvbiB3YXMgc3VjY2Vzc2Z1bCBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gKEV4dHJhY3RvcjogJHtzdHJlYW1JbmZvLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCAnTi9BJ30pYCk7XG5cbiAgICAgICAgcmV0dXJuIHN0cmVhbUluZm87XG4gICAgfVxuXG4gICAgI2NyZWF0ZUZGbXBlZ1N0cmVhbShzdHJlYW06IFJlYWRhYmxlIHwgc3RyaW5nLCB0cmFjazogVHJhY2ssIHNlZWsgPSAwLCBjb29raWVzPzogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGZmbXBlZ1N0cmVhbSA9IHRoaXMucXVldWUuZmlsdGVycy5mZm1wZWdcbiAgICAgICAgICAgIC5jcmVhdGVTdHJlYW0oc3RyZWFtLCB7XG4gICAgICAgICAgICAgICAgZW5jb2RlckFyZ3M6IHRoaXMucXVldWUuZmlsdGVycy5mZm1wZWcuYXJncyxcbiAgICAgICAgICAgICAgICBzZWVrOiBzZWVrIC8gMTAwMCxcbiAgICAgICAgICAgICAgICBmbXQ6ICdzMTZsZScsXG4gICAgICAgICAgICAgICAgY29va2llcyxcbiAgICAgICAgICAgICAgICB1c2VMZWdhY3lGRm1wZWc6ICEhdGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy51c2VMZWdhY3lGRm1wZWdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG0gPSBgJHtlcnJ9YC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYFN0cmVhbSBjbG9zZWQgZHVlIHRvIGFuIGVycm9yIGZyb20gRkZtcGVnIHN0cmVhbTogJHtlcnIuc3RhY2sgfHwgZXJyLm1lc3NhZ2UgfHwgZXJyfWApO1xuXG4gICAgICAgICAgICAgICAgaWYgKG0uaW5jbHVkZXMoJ3ByZW1hdHVyZSBjbG9zZScpIHx8IG0uaW5jbHVkZXMoJ2VwaXBlJykpIHJldHVybjtcblxuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyRXJyb3IsIHRoaXMucXVldWUsIGVyciwgdHJhY2spO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZmbXBlZ1N0cmVhbTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgUXVlcnlUeXBlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuL1R5cGVVdGlsJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG4vLyAjcmVnaW9uIHNjYXJ5IHRoaW5ncyBiZWxvdyAqc2lnaCpcbmNvbnN0IHNwb3RpZnlTb25nUmVnZXggPSAvXmh0dHBzPzpcXC9cXC8oPzplbWJlZFxcLnxvcGVuXFwuKSg/OnNwb3RpZnlcXC5jb21cXC8pKGludGwtKFthLXpdfFtBLVpdKStcXC8pPyg/OnRyYWNrXFwvfFxcP3VyaT1zcG90aWZ5OnRyYWNrOikoKFxcd3wtKXsyMn0pKFxcP3NpPS4rKT8kLztcbmNvbnN0IHNwb3RpZnlQbGF5bGlzdFJlZ2V4ID0gL15odHRwcz86XFwvXFwvKD86ZW1iZWRcXC58b3BlblxcLikoPzpzcG90aWZ5XFwuY29tXFwvKShpbnRsLShbYS16XXxbQS1aXSkrXFwvKT8oPzpwbGF5bGlzdFxcL3xcXD91cmk9c3BvdGlmeTpwbGF5bGlzdDopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCBzcG90aWZ5QWxidW1SZWdleCA9IC9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoaW50bC0oW2Etel18W0EtWl0pK1xcLyk/KD86YWxidW1cXC98XFw/dXJpPXNwb3RpZnk6YWxidW06KSgoXFx3fC0pezIyfSkoXFw/c2k9LispPyQvO1xuY29uc3QgdmltZW9SZWdleCA9IC9eKGh0dHB8aHR0cHMpPzpcXC9cXC8od3d3XFwufHBsYXllclxcLik/dmltZW9cXC5jb21cXC8oPzpjaGFubmVsc1xcLyg/OlxcdytcXC8pP3xncm91cHNcXC8oW14vXSopXFwvdmlkZW9zXFwvfHZpZGVvXFwvfCkoXFxkKykoPzp8XFwvXFw/KSQvO1xuY29uc3QgcmV2ZXJibmF0aW9uUmVnZXggPSAvXmh0dHBzOlxcL1xcLyh3d3cuKT9yZXZlcmJuYXRpb24uY29tXFwvKC4rKVxcL3NvbmdcXC8oLispJC87XG5jb25zdCBhdHRhY2htZW50UmVnZXggPSAvXmh0dHBzPzpcXC9cXC8uKyQvO1xuY29uc3QgYXBwbGVNdXNpY1NvbmdSZWdleCA9IC9eaHR0cHM/OlxcL1xcL211c2ljXFwuYXBwbGVcXC5jb21cXC8uKz9cXC8oc29uZ3xhbGJ1bSlcXC8uKz8oXFwvLis/XFw/aT18XFwvKShbMC05XSspJC87XG5jb25zdCBhcHBsZU11c2ljUGxheWxpc3RSZWdleCA9IC9eaHR0cHM/OlxcL1xcL211c2ljXFwuYXBwbGVcXC5jb21cXC8uKz9cXC9wbGF5bGlzdFxcLy4rXFwvcGxcXC4odS0pP1thLXpBLVowLTldKyQvO1xuY29uc3QgYXBwbGVNdXNpY0FsYnVtUmVnZXggPSAvXmh0dHBzPzpcXC9cXC9tdXNpY1xcLmFwcGxlXFwuY29tXFwvLis/XFwvYWxidW1cXC8uK1xcLyhbMC05XSspJC87XG5jb25zdCBzb3VuZGNsb3VkVHJhY2tSZWdleCA9IC9eaHR0cHM/OlxcL1xcLyhtLnx3d3cuKT9zb3VuZGNsb3VkLmNvbVxcLyhcXHd8LSkrXFwvKFxcd3wtKSsoLispPyQvO1xuY29uc3Qgc291bmRjbG91ZFBsYXlsaXN0UmVnZXggPSAvXmh0dHBzPzpcXC9cXC8obS58d3d3Lik/c291bmRjbG91ZC5jb21cXC8oXFx3fC0pK1xcL3NldHNcXC8oXFx3fC0pKyguKyk/JC87XG5jb25zdCB5b3V0dWJlUGxheWxpc3RSZWdleCA9IC9eaHR0cHM/OlxcL1xcLyh3d3cuKT95b3V0dWJlLmNvbVxcL3BsYXlsaXN0XFw/bGlzdD0oKFBMfEZMfFVVfExMfFJEfE9MKVthLXpBLVowLTktX117MTYsNDF9KSQvO1xuY29uc3QgeW91dHViZVZpZGVvVVJMUmVnZXggPSAvXigoPzpodHRwcz86KT9cXC9cXC8pPygoPzp3d3d8bSlcXC4pPygoPzp5b3V0dWJlXFwuY29tfHlvdXR1LmJlKSkoXFwvKD86W1xcdy1dK1xcP3Y9fGVtYmVkXFwvfHZcXC8pPykoW1xcdy1dKykoXFxTKyk/JC87XG5jb25zdCB5b3V0dWJlVmlkZW9JZFJlZ2V4ID0gL15bYS16QS1aMC05LV9dezExfSQvO1xuLy8gI2VuZHJlZ2lvbiBzY2FyeSB0aGluZ3MgYWJvdmUgKnNpZ2gqXG5cbmNsYXNzIFF1ZXJ5UmVzb2x2ZXIge1xuICAgIC8qKlxuICAgICAqIFF1ZXJ5IHJlc29sdmVyXG4gICAgICovXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG5cbiAgICBzdGF0aWMgZ2V0IHJlZ2V4KCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3BvdGlmeUFsYnVtUmVnZXgsXG4gICAgICAgICAgICBzcG90aWZ5UGxheWxpc3RSZWdleCxcbiAgICAgICAgICAgIHNwb3RpZnlTb25nUmVnZXgsXG4gICAgICAgICAgICB2aW1lb1JlZ2V4LFxuICAgICAgICAgICAgcmV2ZXJibmF0aW9uUmVnZXgsXG4gICAgICAgICAgICBhdHRhY2htZW50UmVnZXgsXG4gICAgICAgICAgICBhcHBsZU11c2ljQWxidW1SZWdleCxcbiAgICAgICAgICAgIGFwcGxlTXVzaWNQbGF5bGlzdFJlZ2V4LFxuICAgICAgICAgICAgYXBwbGVNdXNpY1NvbmdSZWdleCxcbiAgICAgICAgICAgIHNvdW5kY2xvdWRUcmFja1JlZ2V4LFxuICAgICAgICAgICAgc291bmRjbG91ZFBsYXlsaXN0UmVnZXgsXG4gICAgICAgICAgICB5b3V0dWJlUGxheWxpc3RSZWdleFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmVzIHRoZSBnaXZlbiBzZWFyY2ggcXVlcnlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgVGhlIHF1ZXJ5XG4gICAgICovXG4gICAgc3RhdGljIHJlc29sdmUocXVlcnk6IHN0cmluZywgZmFsbGJhY2tTZWFyY2hFbmdpbmU6ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXSA9IFF1ZXJ5VHlwZS5BVVRPX1NFQVJDSCk6ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXSB7XG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNTdHJpbmcocXVlcnkpKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKHF1ZXJ5LCAnc3RyaW5nJywgdHlwZW9mIHF1ZXJ5KTtcbiAgICAgICAgaWYgKCFxdWVyeS5sZW5ndGgpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lORk9fUkVRVUlSRUQoJ3F1ZXJ5JywgU3RyaW5nKHF1ZXJ5KSk7XG4gICAgICAgIHF1ZXJ5ID0gIXF1ZXJ5LmluY2x1ZGVzKCd5b3V0dWJlLmNvbScpID8gcXVlcnkudHJpbSgpIDogcXVlcnkucmVwbGFjZSgvKG0odXNpYyk/fGdhbWluZylcXC4vLCAnJykudHJpbSgpO1xuXG4gICAgICAgIGlmIChzb3VuZGNsb3VkUGxheWxpc3RSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIFF1ZXJ5VHlwZS5TT1VORENMT1VEX1BMQVlMSVNUO1xuICAgICAgICBpZiAoc291bmRjbG91ZFRyYWNrUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiBRdWVyeVR5cGUuU09VTkRDTE9VRF9UUkFDSztcbiAgICAgICAgaWYgKHNwb3RpZnlQbGF5bGlzdFJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gUXVlcnlUeXBlLlNQT1RJRllfUExBWUxJU1Q7XG4gICAgICAgIGlmIChzcG90aWZ5QWxidW1SZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIFF1ZXJ5VHlwZS5TUE9USUZZX0FMQlVNO1xuICAgICAgICBpZiAoc3BvdGlmeVNvbmdSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIFF1ZXJ5VHlwZS5TUE9USUZZX1NPTkc7XG4gICAgICAgIGlmICh5b3V0dWJlUGxheWxpc3RSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIFF1ZXJ5VHlwZS5ZT1VUVUJFX1BMQVlMSVNUO1xuICAgICAgICBpZiAoUXVlcnlSZXNvbHZlci52YWxpZGF0ZUlkKHF1ZXJ5KSB8fCBRdWVyeVJlc29sdmVyLnZhbGlkYXRlVVJMKHF1ZXJ5KSkgcmV0dXJuIFF1ZXJ5VHlwZS5ZT1VUVUJFX1ZJREVPO1xuICAgICAgICBpZiAodmltZW9SZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIFF1ZXJ5VHlwZS5WSU1FTztcbiAgICAgICAgaWYgKHJldmVyYm5hdGlvblJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gUXVlcnlUeXBlLlJFVkVSQk5BVElPTjtcbiAgICAgICAgaWYgKGFwcGxlTXVzaWNBbGJ1bVJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gUXVlcnlUeXBlLkFQUExFX01VU0lDX0FMQlVNO1xuICAgICAgICBpZiAoYXBwbGVNdXNpY1BsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpIHJldHVybiBRdWVyeVR5cGUuQVBQTEVfTVVTSUNfUExBWUxJU1Q7XG4gICAgICAgIGlmIChhcHBsZU11c2ljU29uZ1JlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gUXVlcnlUeXBlLkFQUExFX01VU0lDX1NPTkc7XG4gICAgICAgIGlmIChhdHRhY2htZW50UmVnZXgudGVzdChxdWVyeSkpIHJldHVybiBRdWVyeVR5cGUuQVJCSVRSQVJZO1xuXG4gICAgICAgIHJldHVybiBmYWxsYmFja1NlYXJjaEVuZ2luZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgdmltZW8gaWQgZnJvbSB1cmxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgVGhlIHF1ZXJ5XG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0VmltZW9JRChxdWVyeTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBRdWVyeVJlc29sdmVyLnJlc29sdmUocXVlcnkpID09PSBRdWVyeVR5cGUuVklNRU9cbiAgICAgICAgICAgID8gcXVlcnlcbiAgICAgICAgICAgICAgICAgIC5zcGxpdCgnLycpXG4gICAgICAgICAgICAgICAgICAuZmlsdGVyKCh4KSA9PiAhIXgpXG4gICAgICAgICAgICAgICAgICAucG9wKClcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgdmFsaWRhdGVJZChxOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHlvdXR1YmVWaWRlb0lkUmVnZXgudGVzdChxKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgdmFsaWRhdGVVUkwocTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB5b3V0dWJlVmlkZW9VUkxSZWdleC50ZXN0KHEpO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgUXVlcnlSZXNvbHZlciB9O1xuIiwgImltcG9ydCB7IFNub3dmbGFrZVV0aWwgfSBmcm9tICdkaXNjb3JkLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBBc3luY1F1ZXVlQWNxdWlzaXRpb25PcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBYm9ydFNpZ25hbCB0byBjYW5jZWwgdGhpcyBlbnRyeVxuICAgICAqL1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG5leHBvcnQgY2xhc3MgQXN5bmNRdWV1ZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHF1ZXVlZCBlbnRyaWVzXG4gICAgICovXG4gICAgcHVibGljIGVudHJpZXM6IEFycmF5PEFzeW5jUXVldWVFbnRyeT4gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIENsZWFyIGVudHJpZXMgcXVldWVcbiAgICAgKiBAcGFyYW0gY29uc3VtZSBXaGV0aGVyIG9yIG5vdCB0byBjb25zdW1lIGFsbCBlbnRyaWVzIGJlZm9yZSBjbGVhcmluZ1xuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhcihjb25zdW1lID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGNvbnN1bWUpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4gZW50cnkuY29uc3VtZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW50cmllcyA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIHF1ZXVlLiBSZXR1cm5zIGAwYCBpZiBubyBlbnRyaWVzIGFyZSBhdmFpbGFibGUuXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBY3F1aXJlIGFuIGVudHJ5LlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGxvY2sgdGhlIHF1ZXVlXG4gICAgICogY29uc3QgZW50cnkgPSBhc3luY1F1ZXVlLmFjcXVpcmUoKTtcbiAgICAgKiAvLyB3YWl0IHVudGlsIHByZXZpb3VzIHRhc2sgaXMgY29tcGxldGVkXG4gICAgICogYXdhaXQgZW50cnkuZ2V0VGFzaygpO1xuICAgICAqIC8vIGRvIHNvbWV0aGluZyBleHBlbnNpdmVcbiAgICAgKiBhd2FpdCBwZXJmb3JtU29tZXRoaW5nRXhwZW5zaXZlKCk7XG4gICAgICogLy8gbWFrZSBzdXJlIHRvIHJlbGVhc2UgdGhlIGxvY2sgb25jZSBkb25lXG4gICAgICogYXN5bmNRdWV1ZS5yZWxlYXNlKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGFjcXVpcmUob3B0aW9ucz86IEFzeW5jUXVldWVBY3F1aXNpdGlvbk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSBuZXcgQXN5bmNRdWV1ZUVudHJ5KHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmICh0aGlzLmVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgICAgICBlbnRyeS5jb25zdW1lKCk7XG4gICAgICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxlYXNlIHRoZSBjdXJyZW50IGFjcXVpc2l0aW9uIGFuZCBtb3ZlIHRvIG5leHQgZW50cnkuXG4gICAgICovXG4gICAgcHVibGljIHJlbGVhc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5lbnRyaWVzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuZW50cmllcy5zaGlmdCgpO1xuICAgICAgICB0aGlzLmVudHJpZXNbMF0/LmNvbnN1bWUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWwgYWxsIGVudHJpZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FuY2VsQWxsKCkge1xuICAgICAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IGVudHJ5LmNhbmNlbCgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIGVudHJ5IGZyb20gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGVudHJ5IFRoZSBlbnRyeSB0byByZW1vdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlRW50cnkoZW50cnk6IEFzeW5jUXVldWVFbnRyeSkge1xuICAgICAgICBjb25zdCBlbnRyeUlkeCA9IHRoaXMuZW50cmllcy5pbmRleE9mKGVudHJ5KTtcblxuICAgICAgICBpZiAoZW50cnlJZHggIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuc3BsaWNlKGVudHJ5SWR4LCAxKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFzeW5jUXVldWVFbnRyeSB7XG4gICAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuICAgIHB1YmxpYyBzaWduYWw6IEFib3J0U2lnbmFsIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIG9uQWJvcnQ6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcmVzb2x2ZSE6ICgpID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSByZWplY3QhOiAoZXJyOiBFcnJvcikgPT4gdm9pZDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEFzeW5jUXVldWUsIHB1YmxpYyBvcHRpb25zPzogQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucykge1xuICAgICAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgdGhpcy5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnM/LnNpZ25hbCkge1xuICAgICAgICAgICAgdGhpcy5zZXRBYm9ydFNpZ25hbCh0aGlzLm9wdGlvbnMuc2lnbmFsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRBYm9ydFNpZ25hbChzaWduYWw6IEFib3J0U2lnbmFsKSB7XG4gICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnNpZ25hbCA9IHNpZ25hbDtcbiAgICAgICAgdGhpcy5vbkFib3J0ID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5yZW1vdmVFbnRyeSh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCB0aGlzLm9uQWJvcnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25zdW1lKCkge1xuICAgICAgICB0aGlzLmNsZWFudXAoKTtcbiAgICAgICAgdGhpcy5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbGVhc2UoKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpO1xuICAgICAgICB0aGlzLnF1ZXVlLnJlbGVhc2UoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuY2VsKCkge1xuICAgICAgICB0aGlzLmNsZWFudXAoKTtcbiAgICAgICAgdGhpcy5yZWplY3QobmV3IEVycm9yKCdDYW5jZWxsZWQnKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFudXAoKSB7XG4gICAgICAgIGlmICh0aGlzLm9uQWJvcnQpIHRoaXMuc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIHRoaXMub25BYm9ydCk7XG4gICAgICAgIHRoaXMuc2lnbmFsID0gbnVsbDtcbiAgICAgICAgdGhpcy5vbkFib3J0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VGFzaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRmlsdGVyc05hbWUsIFF1ZXVlRmlsdGVycyB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IEF1ZGlvRmlsdGVycyB9IGZyb20gJy4uL3V0aWxzL0F1ZGlvRmlsdGVycyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQgfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgQmlxdWFkRmlsdGVycywgRXF1YWxpemVyLCBFcXVhbGl6ZXJCYW5kLCBQQ01GaWx0ZXJzIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBGRm1wZWdTdHJlYW1PcHRpb25zLCBjcmVhdGVGRm1wZWdTdHJlYW0gfSBmcm9tICcuLi91dGlscy9GRm1wZWdTdHJlYW0nO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbnR5cGUgRmlsdGVycyA9IGtleW9mIHR5cGVvZiBBdWRpb0ZpbHRlcnMuZmlsdGVycztcblxuY29uc3QgbWFrZUJhbmRzID0gKGFycjogbnVtYmVyW10pID0+IHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgICAge1xuICAgICAgICAgICAgbGVuZ3RoOiBFcXVhbGl6ZXIuQkFORF9DT1VOVFxuICAgICAgICB9LFxuICAgICAgICAoXywgaSkgPT4gKHtcbiAgICAgICAgICAgIGJhbmQ6IGksXG4gICAgICAgICAgICBnYWluOiBhcnJbaV0gPyBhcnJbaV0gLyAzMCA6IDBcbiAgICAgICAgfSlcbiAgICApIGFzIEVxdWFsaXplckJhbmRbXTtcbn07XG5cbmV4cG9ydCBjb25zdCBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0ID0ge1xuICAgIEZsYXQ6IG1ha2VCYW5kcyhbXSksXG4gICAgQ2xhc3NpY2FsOiBtYWtlQmFuZHMoWy0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC03LjIsIC03LjIsIC03LjIsIC05LjZdKSxcbiAgICBDbHViOiBtYWtlQmFuZHMoWy0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCA4LjAsIDUuNiwgNS42LCA1LjYsIDMuMiwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV0pLFxuICAgIERhbmNlOiBtYWtlQmFuZHMoWzkuNiwgNy4yLCAyLjQsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtNS42LCAtNy4yLCAtNy4yLCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV0pLFxuICAgIEZ1bGxCYXNzOiBtYWtlQmFuZHMoWy04LjAsIDkuNiwgOS42LCA1LjYsIDEuNiwgLTQuMCwgLTguMCwgLTEwLjQsIC0xMS4yLCAtMTEuMl0pLFxuICAgIEZ1bGxCYXNzVHJlYmxlOiBtYWtlQmFuZHMoWzcuMiwgNS42LCAtMS4xMTAyMmUtMTUsIC03LjIsIC00LjgsIDEuNiwgOC4wLCAxMS4yLCAxMi4wLCAxMi4wXSksXG4gICAgRnVsbFRyZWJsZTogbWFrZUJhbmRzKFstOS42LCAtOS42LCAtOS42LCAtNC4wLCAyLjQsIDExLjIsIDE2LjAsIDE2LjAsIDE2LjAsIDE2LjhdKSxcbiAgICBIZWFkcGhvbmVzOiBtYWtlQmFuZHMoWzQuOCwgMTEuMiwgNS42LCAtMy4yLCAtMi40LCAxLjYsIDQuOCwgOS42LCAxMi44LCAxNC40XSksXG4gICAgTGFyZ2VIYWxsOiBtYWtlQmFuZHMoWzEwLjQsIDEwLjQsIDUuNiwgNS42LCAtMS4xMTAyMmUtMTUsIC00LjgsIC00LjgsIC00LjgsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1XSksXG4gICAgTGl2ZTogbWFrZUJhbmRzKFstNC44LCAtMS4xMTAyMmUtMTUsIDQuMCwgNS42LCA1LjYsIDUuNiwgNC4wLCAyLjQsIDIuNCwgMi40XSksXG4gICAgUGFydHk6IG1ha2VCYW5kcyhbNy4yLCA3LjIsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIDcuMiwgNy4yXSksXG4gICAgUG9wOiBtYWtlQmFuZHMoWy0xLjYsIDQuOCwgNy4yLCA4LjAsIDUuNiwgLTEuMTEwMjJlLTE1LCAtMi40LCAtMi40LCAtMS42LCAtMS42XSksXG4gICAgUmVnZ2FlOiBtYWtlQmFuZHMoWy0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC01LjYsIC0xLjExMDIyZS0xNSwgNi40LCA2LjQsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdKSxcbiAgICBSb2NrOiBtYWtlQmFuZHMoWzguMCwgNC44LCAtNS42LCAtOC4wLCAtMy4yLCA0LjAsIDguOCwgMTEuMiwgMTEuMiwgMTEuMl0pLFxuICAgIFNrYTogbWFrZUJhbmRzKFstMi40LCAtNC44LCAtNC4wLCAtMS4xMTAyMmUtMTUsIDQuMCwgNS42LCA4LjgsIDkuNiwgMTEuMiwgOS42XSksXG4gICAgU29mdDogbWFrZUJhbmRzKFs0LjgsIDEuNiwgLTEuMTEwMjJlLTE1LCAtMi40LCAtMS4xMTAyMmUtMTUsIDQuMCwgOC4wLCA5LjYsIDExLjIsIDEyLjBdKSxcbiAgICBTb2Z0Um9jazogbWFrZUJhbmRzKFs0LjAsIDQuMCwgMi40LCAtMS4xMTAyMmUtMTUsIC00LjAsIC01LjYsIC0zLjIsIC0xLjExMDIyZS0xNSwgMi40LCA4LjhdKSxcbiAgICBUZWNobm86IG1ha2VCYW5kcyhbOC4wLCA1LjYsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTQuOCwgLTEuMTEwMjJlLTE1LCA4LjAsIDkuNiwgOS42LCA4LjhdKVxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNsYXNzIEZGbXBlZ0ZpbHRlcmVyPE1ldGEgPSB1bmtub3duPiB7XG4gICAgI2ZmbXBlZ0ZpbHRlcnM6IEZpbHRlcnNbXSA9IFtdO1xuICAgICNpbnB1dEFyZ3M6IHN0cmluZ1tdID0gW107XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBhZjogR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPikge31cblxuICAgICNzZXRGaWx0ZXJzKGZpbHRlcnM6IEZpbHRlcnNbXSkge1xuICAgICAgICBjb25zdCB7IHF1ZXVlIH0gPSB0aGlzLmFmO1xuICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy4jZmZtcGVnRmlsdGVycy5zbGljZSgpO1xuICAgICAgICBjb25zdCBpZ25vcmVGaWx0ZXJzID0gdGhpcy5maWx0ZXJzLnNvbWUoKGZmKSA9PiBmZiA9PT0gJ25pZ2h0Y29yZScgfHwgZmYgPT09ICd2YXBvcndhdmUnKSAmJiAhZmlsdGVycy5zb21lKChmZikgPT4gZmYgPT09ICduaWdodGNvcmUnIHx8IGZmID09PSAndmFwb3J3YXZlJyk7XG4gICAgICAgIGNvbnN0IHNlZWtUaW1lID0gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyk/LmN1cnJlbnQudmFsdWUgfHwgMDtcbiAgICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycyA9IFsuLi5uZXcgU2V0KGZpbHRlcnMpXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hZi50cmlnZ2VyUmVwbGF5KHNlZWtUaW1lKS50aGVuKCh0KSA9PiB7XG4gICAgICAgICAgICBxdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5hdWRpb0ZpbHRlcnNVcGRhdGUsIHF1ZXVlLCBwcmV2LCB0aGlzLiNmZm1wZWdGaWx0ZXJzLnNsaWNlKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBpbnB1dCBhcmdzIGZvciBGRm1wZWdcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0SW5wdXRBcmdzKGFyZ3M6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghYXJncy5ldmVyeSgoYXJnKSA9PiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJykpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2FyZ3MnLCAnQXJyYXk8c3RyaW5nPicsICdpbnZhbGlkIGl0ZW0ocyknKTtcbiAgICAgICAgdGhpcy4jaW5wdXRBcmdzID0gYXJncztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgaW5wdXQgYXJnc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaW5wdXRBcmdzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaW5wdXRBcmdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBlbmNvZGVyIGFyZ3NcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVuY29kZXJBcmdzKCkge1xuICAgICAgICBpZiAoIXRoaXMuZmlsdGVycy5sZW5ndGgpIHJldHVybiBbXTtcblxuICAgICAgICByZXR1cm4gWyctYWYnLCB0aGlzLnRvU3RyaW5nKCldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBmaW5hbCBmZm1wZWcgYXJnc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYXJncygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRBcmdzLmNvbmNhdCh0aGlzLmVuY29kZXJBcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgZmZtcGVnIHN0cmVhbVxuICAgICAqIEBwYXJhbSBzb3VyY2UgVGhlIHN0cmVhbSBzb3VyY2VcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgc3RyZWFtIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlU3RyZWFtKHNvdXJjZTogc3RyaW5nIHwgUmVhZGFibGUsIG9wdGlvbnM6IEZGbXBlZ1N0cmVhbU9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRoaXMuI2lucHV0QXJncy5sZW5ndGgpIG9wdGlvbnMuZW5jb2RlckFyZ3MgPSBbLi4udGhpcy4jaW5wdXRBcmdzLCAuLi4ob3B0aW9ucy5lbmNvZGVyQXJncyB8fCBbXSldO1xuICAgICAgICByZXR1cm4gY3JlYXRlRkZtcGVnU3RyZWFtKHNvdXJjZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGZmbXBlZyBmaWx0ZXJzXG4gICAgICogQHBhcmFtIGZpbHRlcnMgVGhlIGZpbHRlcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RmlsdGVycyhmaWx0ZXJzOiBGaWx0ZXJzW10gfCBSZWNvcmQ8RmlsdGVycywgYm9vbGVhbj4gfCBib29sZWFuKSB7XG4gICAgICAgIGxldCBfZmlsdGVyczogRmlsdGVyc1tdID0gW107XG4gICAgICAgIGlmICh0eXBlb2YgZmlsdGVycyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBfZmlsdGVycyA9ICFmaWx0ZXJzID8gW10gOiAoT2JqZWN0LmtleXMoQXVkaW9GaWx0ZXJzLmZpbHRlcnMpIGFzIEZpbHRlcnNbXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJzKSkge1xuICAgICAgICAgICAgX2ZpbHRlcnMgPSBmaWx0ZXJzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX2ZpbHRlcnMgPSBPYmplY3QuZW50cmllcyhmaWx0ZXJzKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHJlcykgPT4gcmVzWzFdID09PSB0cnVlKVxuICAgICAgICAgICAgICAgIC5tYXAoKG0pID0+IG1bMF0pIGFzIEZpbHRlcnNbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLiNzZXRGaWx0ZXJzKF9maWx0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50bHkgYWN0aXZlIGZmbXBlZyBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZmZtcGVnRmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGZpbHRlcnMoZmlsdGVyczogRmlsdGVyc1tdKSB7XG4gICAgICAgIHRoaXMuc2V0RmlsdGVycyhmaWx0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGUgZ2l2ZW4gZmZtcGVnIGZpbHRlcihzKVxuICAgICAqIEBwYXJhbSBmaWx0ZXJzIFRoZSBmaWx0ZXIocylcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlKGZpbHRlcnM6IEZpbHRlcnNbXSB8IEZpbHRlcnMpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpbHRlcnMpKSBmaWx0ZXJzID0gW2ZpbHRlcnNdO1xuICAgICAgICBjb25zdCBmcmVzaDogRmlsdGVyc1tdID0gW107XG5cbiAgICAgICAgZmlsdGVycy5mb3JFYWNoKChmKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzLmluY2x1ZGVzKGYpKSByZXR1cm47XG4gICAgICAgICAgICBmcmVzaC5wdXNoKGYpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy4jc2V0RmlsdGVycyh0aGlzLiNmZm1wZWdGaWx0ZXJzLmZpbHRlcigocikgPT4gIWZpbHRlcnMuaW5jbHVkZXMocikpLmNvbmNhdChmcmVzaCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBkZWZhdWx0IGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gZmYgRmlsdGVycyBsaXN0XG4gICAgICovXG4gICAgcHVibGljIHNldERlZmF1bHRzKGZmOiBGaWx0ZXJzW10pIHtcbiAgICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycyA9IGZmO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBsaXN0IG9mIGVuYWJsZWQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGaWx0ZXJzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZmbXBlZ0ZpbHRlcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGxpc3Qgb2YgZGlzYWJsZWQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGaWx0ZXJzRGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiBBdWRpb0ZpbHRlcnMubmFtZXMuZmlsdGVyKChmKSA9PiAhdGhpcy4jZmZtcGVnRmlsdGVycy5pbmNsdWRlcyhmKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBlbmFibGVkXG4gICAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyXG4gICAgICovXG4gICAgcHVibGljIGlzRW5hYmxlZDxUIGV4dGVuZHMgRmlsdGVycz4oZmlsdGVyOiBUKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzLmluY2x1ZGVzKGZpbHRlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBkaXNhYmxlZFxuICAgICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlclxuICAgICAqL1xuICAgIHB1YmxpYyBpc0Rpc2FibGVkPFQgZXh0ZW5kcyBGaWx0ZXJzPihmaWx0ZXI6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzRW5hYmxlZChmaWx0ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgYSB2YWxpZCBmaWx0ZXJcbiAgICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gdGVzdFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1ZhbGlkRmlsdGVyKGZpbHRlcjogc3RyaW5nKTogZmlsdGVyIGlzIEZpbHRlcnNOYW1lIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5oYXMoZmlsdGVyIGFzIEZpbHRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgY3VycmVudCBmaWx0ZXJzIHRvIGFycmF5XG4gICAgICovXG4gICAgcHVibGljIHRvQXJyYXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcnMubWFwKChmaWx0ZXIpID0+IEF1ZGlvRmlsdGVycy5nZXQoZmlsdGVyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBjdXJyZW50IGZpbHRlcnMgdG8gSlNPTiBvYmplY3RcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9KU09OKCkge1xuICAgICAgICBjb25zdCBvYmogPSB7fSBhcyBSZWNvcmQ8a2V5b2YgUXVldWVGaWx0ZXJzLCBzdHJpbmc+O1xuXG4gICAgICAgIHRoaXMuZmlsdGVycy5mb3JFYWNoKChmaWx0ZXIpID0+IChvYmpbZmlsdGVyXSA9IEF1ZGlvRmlsdGVycy5nZXQoZmlsdGVyKSkpO1xuXG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGN1cnJlbnQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5jcmVhdGUodGhpcy5maWx0ZXJzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZUFGaWx0ZXJzQ2FjaGUge1xuICAgIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdO1xuICAgIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IG51bGw7XG4gICAgZmlsdGVyczogUENNRmlsdGVyc1tdO1xuICAgIHZvbHVtZTogbnVtYmVyO1xuICAgIHNhbXBsZVJhdGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YSA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgZ3JhcGggPSBuZXcgQUZpbHRlckdyYXBoPE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyBmZm1wZWcgPSBuZXcgRkZtcGVnRmlsdGVyZXI8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIGVxdWFsaXplclByZXNldHMgPSBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0O1xuICAgIHB1YmxpYyBfbGFzdEZpbHRlcnNDYWNoZTogR3VpbGRRdWV1ZUFGaWx0ZXJzQ2FjaGUgPSB7XG4gICAgICAgIGJpcXVhZDogbnVsbCxcbiAgICAgICAgZXF1YWxpemVyOiBbXSxcbiAgICAgICAgZmlsdGVyczogW10sXG4gICAgICAgIHZvbHVtZTogMTAwLFxuICAgICAgICBzYW1wbGVSYXRlOiAtMVxuICAgIH07XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMucXVldWUub3B0aW9ucy52b2x1bWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IHRoaXMucXVldWUub3B0aW9ucy52b2x1bWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWb2x1bWUgdHJhbnNmb3JtZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZHNwPy52b2x1bWUgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAxNSBCYW5kIEVxdWFsaXplclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5lcXVhbGl6ZXIgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaWdpdGFsIGJpcXVhZCBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldCBiaXF1YWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmJpcXVhZCB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERTUCBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5maWx0ZXJzIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXVkaW8gcmVzYW1wbGVyXG4gICAgICovXG4gICAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnJlc2FtcGxlciB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGxheSBjdXJyZW50IHRyYWNrIGluIHRyYW5zaXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSBzZWVrIFRoZSBkdXJhdGlvbiB0byBzZWVrIHRvXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHRyaWdnZXJSZXBsYXkoc2VlayA9IDApIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLmFjcXVpcmUoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucXVldWUubm9kZS5wbGF5KHRoaXMucXVldWUuY3VycmVudFRyYWNrLCB7XG4gICAgICAgICAgICAgICAgcXVldWU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNlZWssXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbk1vZGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5ub2RlLnRhc2tzUXVldWUucmVsZWFzZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5ub2RlLnRhc2tzUXVldWUucmVsZWFzZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQUZpbHRlckdyYXBoPE1ldGEgPSB1bmtub3duPiB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBhZjogR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPikge31cblxuICAgIHB1YmxpYyBnZXQgZmZtcGVnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZi5mZm1wZWcuZmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVxdWFsaXplcigpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmFmLmVxdWFsaXplcj8uYmFuZE11bHRpcGxpZXJzIHx8IFtdKS5tYXAoKG0sIGkpID0+ICh7XG4gICAgICAgICAgICBiYW5kOiBpLFxuICAgICAgICAgICAgZ2FpbjogbVxuICAgICAgICB9KSkgYXMgRXF1YWxpemVyQmFuZFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gcmV0dXJuICh0aGlzLmFmLmJpcXVhZD8uZ2V0RmlsdGVyTmFtZSgpIGFzIEV4Y2x1ZGU8QmlxdWFkRmlsdGVycywgbnVtYmVyPiB8IG51bGwpIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZi5maWx0ZXJzPy5maWx0ZXJzIHx8IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdm9sdW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZi52b2x1bWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFmLnJlc2FtcGxlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZHVtcCgpOiBGaWx0ZXJHcmFwaCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmZm1wZWc6IHRoaXMuZmZtcGVnLFxuICAgICAgICAgICAgZXF1YWxpemVyOiB0aGlzLmVxdWFsaXplcixcbiAgICAgICAgICAgIGJpcXVhZDogdGhpcy5iaXF1YWQsXG4gICAgICAgICAgICBmaWx0ZXJzOiB0aGlzLmZpbHRlcnMsXG4gICAgICAgICAgICBzYW1wbGVSYXRlOiB0aGlzLnJlc2FtcGxlcj8udGFyZ2V0U2FtcGxlUmF0ZSB8fCB0aGlzLnJlc2FtcGxlcj8uc2FtcGxlUmF0ZSB8fCA0ODAwMCxcbiAgICAgICAgICAgIHZvbHVtZTogdGhpcy52b2x1bWU/LnZvbHVtZSA/PyAxMDBcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyR3JhcGgge1xuICAgIGZmbXBlZzogRmlsdGVyc1tdO1xuICAgIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdO1xuICAgIGJpcXVhZDogRXhjbHVkZTxCaXF1YWRGaWx0ZXJzLCBudW1iZXI+IHwgbnVsbDtcbiAgICBmaWx0ZXJzOiBQQ01GaWx0ZXJzW107XG4gICAgdm9sdW1lOiBudW1iZXI7XG4gICAgc2FtcGxlUmF0ZTogbnVtYmVyO1xufVxuIiwgImltcG9ydCB0eXBlIHsgRHVwbGV4LCBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgKiBhcyBwcmlzbSBmcm9tICdwcmlzbS1tZWRpYSc7XG5pbXBvcnQgeyBGRm1wZWcgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcblxuZXhwb3J0IGludGVyZmFjZSBGRm1wZWdTdHJlYW1PcHRpb25zIHtcbiAgICBmbXQ/OiBzdHJpbmc7XG4gICAgZW5jb2RlckFyZ3M/OiBzdHJpbmdbXTtcbiAgICBzZWVrPzogbnVtYmVyO1xuICAgIHNraXA/OiBib29sZWFuO1xuICAgIGNvb2tpZXM/OiBzdHJpbmc7XG4gICAgdXNlTGVnYWN5RkZtcGVnPzogYm9vbGVhbjtcbn1cblxuY29uc3QgZ2V0RkZtcGVnUHJvdmlkZXIgPSAobGVnYWN5ID0gZmFsc2UpID0+IChsZWdhY3kgPyAocHJpc20gYXMgdHlwZW9mIHByaXNtICYgeyBkZWZhdWx0OiB0eXBlb2YgcHJpc20gfSkuZGVmYXVsdD8uRkZtcGVnIHx8IHByaXNtLkZGbXBlZyA6IEZGbXBlZyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBGRk1QRUdfQVJHU19TVFJJTkcoc3RyZWFtOiBzdHJpbmcsIGZtdD86IHN0cmluZywgY29va2llcz86IHN0cmluZykge1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIGNvbnN0IGFyZ3MgPSBbXG4gICAgICAgIFwiLXJlY29ubmVjdFwiLCBcIjFcIixcbiAgICAgICAgXCItcmVjb25uZWN0X3N0cmVhbWVkXCIsIFwiMVwiLFxuICAgICAgICBcIi1yZWNvbm5lY3RfZGVsYXlfbWF4XCIsIFwiNVwiLFxuICAgICAgICBcIi1pXCIsIHN0cmVhbSxcbiAgICAgICAgXCItYW5hbHl6ZWR1cmF0aW9uXCIsIFwiMFwiLFxuICAgICAgICBcIi1sb2dsZXZlbFwiLCBcIjBcIixcbiAgICAgICAgXCItZlwiLCBgJHt0eXBlb2YgZm10ID09PSBcInN0cmluZ1wiID8gZm10IDogXCJzMTZsZVwifWAsXG4gICAgICAgIFwiLWFyXCIsIFwiNDgwMDBcIixcbiAgICAgICAgXCItYWNcIiwgXCIyXCJcbiAgICBdO1xuXG4gICAgaWYgKHR5cGVvZiBjb29raWVzID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBodHRwczovL2ZmbXBlZy5vcmcvZmZtcGVnLXByb3RvY29scy5odG1sI0hUVFAtQ29va2llc1xuICAgICAgICBhcmdzLnB1c2goJy1jb29raWVzJywgY29va2llcy5zdGFydHNXaXRoKCdcIicpID8gY29va2llcyA6IGBcIiR7Y29va2llc31cImApO1xuICAgIH1cblxuICAgIHJldHVybiBhcmdzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRkZNUEVHX0FSR1NfUElQRUQoZm10Pzogc3RyaW5nKSB7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgcmV0dXJuIFtcbiAgICAgICAgXCItYW5hbHl6ZWR1cmF0aW9uXCIsIFwiMFwiLFxuICAgICAgICBcIi1sb2dsZXZlbFwiLCBcIjBcIixcbiAgICAgICAgXCItZlwiLCBgJHt0eXBlb2YgZm10ID09PSBcInN0cmluZ1wiID8gZm10IDogXCJzMTZsZVwifWAsXG4gICAgICAgIFwiLWFyXCIsIFwiNDgwMDBcIixcbiAgICAgICAgXCItYWNcIiwgXCIyXCJcbiAgICBdO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgRkZtcGVnIHN0cmVhbVxuICogQHBhcmFtIHN0cmVhbSBUaGUgc291cmNlIHN0cmVhbVxuICogQHBhcmFtIG9wdGlvbnMgRkZtcGVnIHN0cmVhbSBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGRm1wZWdTdHJlYW0oc3RyZWFtOiBSZWFkYWJsZSB8IER1cGxleCB8IHN0cmluZywgb3B0aW9ucz86IEZGbXBlZ1N0cmVhbU9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucz8uc2tpcCAmJiB0eXBlb2Ygc3RyZWFtICE9PSAnc3RyaW5nJykgcmV0dXJuIHN0cmVhbTtcbiAgICBvcHRpb25zID8/PSB7fTtcbiAgICBjb25zdCBhcmdzID0gdHlwZW9mIHN0cmVhbSA9PT0gJ3N0cmluZycgPyBGRk1QRUdfQVJHU19TVFJJTkcoc3RyZWFtLCBvcHRpb25zLmZtdCwgb3B0aW9ucy5jb29raWVzKSA6IEZGTVBFR19BUkdTX1BJUEVEKG9wdGlvbnMuZm10KTtcblxuICAgIGlmICghTnVtYmVyLmlzTmFOKG9wdGlvbnMuc2VlaykpIGFyZ3MudW5zaGlmdCgnLXNzJywgU3RyaW5nKG9wdGlvbnMuc2VlaykpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuZW5jb2RlckFyZ3MpKSBhcmdzLnB1c2goLi4ub3B0aW9ucy5lbmNvZGVyQXJncyk7XG5cbiAgICBjb25zdCBGRk1QRUcgPSBnZXRGRm1wZWdQcm92aWRlcighIW9wdGlvbnMudXNlTGVnYWN5RkZtcGVnKTtcblxuICAgIGNvbnN0IHRyYW5zY29kZXIgPSBuZXcgRkZNUEVHKHsgc2hlbGw6IGZhbHNlLCBhcmdzIH0pO1xuXG4gICAgdHJhbnNjb2Rlci5vbignY2xvc2UnLCAoKSA9PiB0cmFuc2NvZGVyLmRlc3Ryb3koKSk7XG5cbiAgICBpZiAodHlwZW9mIHN0cmVhbSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3RyZWFtLm9uKCdlcnJvcicsICgpID0+IHRyYW5zY29kZXIuZGVzdHJveSgpKTtcbiAgICAgICAgc3RyZWFtLnBpcGUodHJhbnNjb2Rlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zY29kZXI7XG59XG4iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSB7XG4gICAgbGF0ZW5jeToge1xuICAgICAgICBldmVudExvb3A6IG51bWJlcjtcbiAgICAgICAgdm9pY2VDb25uZWN0aW9uOiBudW1iZXI7XG4gICAgfTtcbiAgICBzdGF0dXM6IHtcbiAgICAgICAgYnVmZmVyaW5nOiBib29sZWFuO1xuICAgICAgICBwbGF5aW5nOiBib29sZWFuO1xuICAgICAgICBwYXVzZWQ6IGJvb2xlYW47XG4gICAgICAgIGlkbGU6IGJvb2xlYW47XG4gICAgfTtcbiAgICB0cmFja3NDb3VudDogbnVtYmVyO1xuICAgIGhpc3RvcnlTaXplOiBudW1iZXI7XG4gICAgZXh0cmFjdG9yczogbnVtYmVyO1xuICAgIGxpc3RlbmVyczogbnVtYmVyO1xuICAgIG1lbW9yeVVzYWdlOiBOb2RlSlMuTWVtb3J5VXNhZ2U7XG4gICAgdmVyc2lvbnM6IHtcbiAgICAgICAgbm9kZTogc3RyaW5nO1xuICAgICAgICBwbGF5ZXI6IHN0cmluZztcbiAgICB9O1xufVxuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZVN0YXRpc3RpY3M8TWV0YSA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgc3RhdGlzdGljcyBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdlbmVyYXRlKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGF0ZW5jeToge1xuICAgICAgICAgICAgICAgIGV2ZW50TG9vcDogdGhpcy5xdWV1ZS5wbGF5ZXIuZXZlbnRMb29wTGFnLFxuICAgICAgICAgICAgICAgIHZvaWNlQ29ubmVjdGlvbjogdGhpcy5xdWV1ZS5waW5nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RhdHVzOiB7XG4gICAgICAgICAgICAgICAgYnVmZmVyaW5nOiB0aGlzLnF1ZXVlLm5vZGUuaXNCdWZmZXJpbmcoKSxcbiAgICAgICAgICAgICAgICBwbGF5aW5nOiB0aGlzLnF1ZXVlLm5vZGUuaXNQbGF5aW5nKCksXG4gICAgICAgICAgICAgICAgcGF1c2VkOiB0aGlzLnF1ZXVlLm5vZGUuaXNQYXVzZWQoKSxcbiAgICAgICAgICAgICAgICBpZGxlOiB0aGlzLnF1ZXVlLm5vZGUuaXNJZGxlKClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cmFja3NDb3VudDogdGhpcy5xdWV1ZS50cmFja3Muc2l6ZSxcbiAgICAgICAgICAgIGhpc3RvcnlTaXplOiB0aGlzLnF1ZXVlLmhpc3RvcnkudHJhY2tzLnNpemUsXG4gICAgICAgICAgICBleHRyYWN0b3JzOiB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLnNpemUsXG4gICAgICAgICAgICBsaXN0ZW5lcnM6IHRoaXMucXVldWUuZ3VpbGQubWVtYmVycy5tZT8udm9pY2UuY2hhbm5lbD8ubWVtYmVycy5maWx0ZXIoKG0pID0+ICFtLnVzZXIuYm90KS5zaXplIHx8IDAsXG4gICAgICAgICAgICBtZW1vcnlVc2FnZTogcHJvY2Vzcy5tZW1vcnlVc2FnZSgpLFxuICAgICAgICAgICAgdmVyc2lvbnM6IHtcbiAgICAgICAgICAgICAgICBub2RlOiBwcm9jZXNzLnZlcnNpb24sXG4gICAgICAgICAgICAgICAgcGxheWVyOiAnNi42LjAtZGV2LjAnXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gYXMgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBQbGF5ZXIgfSBmcm9tICcuLi8uLi9QbGF5ZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBpbnN0YW5jZXMgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIFBsYXllcj4oKTtcbmV4cG9ydCBjb25zdCBnbG9iYWxSZWdpc3RyeSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgdW5rbm93bj4oKTtcbiIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi8uLi9QbGF5ZXInO1xuaW1wb3J0IHsgaW5zdGFuY2VzIH0gZnJvbSAnLi9fY29udGFpbmVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFBsYXllcihwbGF5ZXI6IFBsYXllcikge1xuICAgIGlmIChpbnN0YW5jZXMuaGFzKHBsYXllci5pZCkpIHJldHVybiB0cnVlO1xuXG4gICAgaW5zdGFuY2VzLnNldChwbGF5ZXIuaWQsIHBsYXllcik7XG5cbiAgICByZXR1cm4gaW5zdGFuY2VzLmhhcyhwbGF5ZXIuaWQpO1xufVxuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uLy4uL1BsYXllcic7XG5pbXBvcnQgeyBpbnN0YW5jZXMgfSBmcm9tICcuL19jb250YWluZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJQbGF5ZXIocGxheWVyOiBQbGF5ZXIpIHtcbiAgICByZXR1cm4gaW5zdGFuY2VzLmRlbGV0ZShwbGF5ZXIuaWQpO1xufVxuIiwgImltcG9ydCB7IGluc3RhbmNlcyB9IGZyb20gJy4vX2NvbnRhaW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQbGF5ZXJzKCkge1xuICAgIHJldHVybiBpbnN0YW5jZXMuYXJyYXkoKTtcbn1cbiIsICJpbXBvcnQgeyBnbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4vX2NvbnRhaW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxSZWdpc3RyeSgpIHtcbiAgICByZXR1cm4gZ2xvYmFsUmVnaXN0cnk7XG59XG4iLCAiaW1wb3J0IHsgVm9pY2VDaGFubmVsLCBTdGFnZUNoYW5uZWwsIFNub3dmbGFrZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvciwgam9pblZvaWNlQ2hhbm5lbCwgVm9pY2VDb25uZWN0aW9uLCBnZXRWb2ljZUNvbm5lY3Rpb24sIFZvaWNlQ29ubmVjdGlvblN0YXR1cywgQXVkaW9QbGF5ZXIgfSBmcm9tICdAZGlzY29yZGpzL3ZvaWNlJztcbmltcG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgfSBmcm9tICcuL1N0cmVhbURpc3BhdGNoZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgdHlwZSB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuY2xhc3MgVm9pY2VVdGlscyB7XG4gICAgcHVibGljIGNhY2hlOiBDb2xsZWN0aW9uPFNub3dmbGFrZSwgU3RyZWFtRGlzcGF0Y2hlcj47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgdXRpbHNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGNhY2hlIHdoZXJlIHZvaWNlIHV0aWxzIHN0b3JlcyBzdHJlYW0gbWFuYWdlcnNcbiAgICAgICAgICogQHR5cGUge0NvbGxlY3Rpb248U25vd2ZsYWtlLCBTdHJlYW1EaXNwYXRjaGVyPn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2FjaGUgPSBuZXcgQ29sbGVjdGlvbjxTbm93Zmxha2UsIFN0cmVhbURpc3BhdGNoZXI+KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSm9pbnMgYSB2b2ljZSBjaGFubmVsLCBjcmVhdGluZyBiYXNpYyBzdHJlYW0gZGlzcGF0Y2ggbWFuYWdlclxuICAgICAqIEBwYXJhbSB7U3RhZ2VDaGFubmVsfFZvaWNlQ2hhbm5lbH0gY2hhbm5lbCBUaGUgdm9pY2UgY2hhbm5lbFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gSm9pbiBvcHRpb25zXG4gICAgICogQHJldHVybnMge1Byb21pc2U8U3RyZWFtRGlzcGF0Y2hlcj59XG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGNvbm5lY3QoXG4gICAgICAgIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCxcbiAgICAgICAgb3B0aW9ucz86IHtcbiAgICAgICAgICAgIGRlYWY/OiBib29sZWFuO1xuICAgICAgICAgICAgbWF4VGltZT86IG51bWJlcjtcbiAgICAgICAgICAgIHF1ZXVlOiBHdWlsZFF1ZXVlO1xuICAgICAgICAgICAgYXVkaW9QbGF5ZXI/OiBBdWRpb1BsYXllcjtcbiAgICAgICAgICAgIGdyb3VwPzogc3RyaW5nO1xuICAgICAgICB9XG4gICAgKTogUHJvbWlzZTxTdHJlYW1EaXNwYXRjaGVyPiB7XG4gICAgICAgIGlmICghb3B0aW9ucz8ucXVldWUpIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX0dVSUxEX1FVRVVFKCk7XG4gICAgICAgIGNvbnN0IGNvbm4gPSBhd2FpdCB0aGlzLmpvaW4oY2hhbm5lbCwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHN1YiA9IG5ldyBTdHJlYW1EaXNwYXRjaGVyKGNvbm4sIGNoYW5uZWwsIG9wdGlvbnMucXVldWUsIG9wdGlvbnMubWF4VGltZSwgb3B0aW9ucy5hdWRpb1BsYXllcik7XG4gICAgICAgIHRoaXMuY2FjaGUuc2V0KGNoYW5uZWwuZ3VpbGQuaWQsIHN1Yik7XG4gICAgICAgIHJldHVybiBzdWI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSm9pbnMgYSB2b2ljZSBjaGFubmVsXG4gICAgICogQHBhcmFtIHtTdGFnZUNoYW5uZWx8Vm9pY2VDaGFubmVsfSBbY2hhbm5lbF0gVGhlIHZvaWNlL3N0YWdlIGNoYW5uZWwgdG8gam9pblxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gSm9pbiBvcHRpb25zXG4gICAgICogQHJldHVybnMge1ZvaWNlQ29ubmVjdGlvbn1cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgam9pbihcbiAgICAgICAgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsLFxuICAgICAgICBvcHRpb25zPzoge1xuICAgICAgICAgICAgZGVhZj86IGJvb2xlYW47XG4gICAgICAgICAgICBtYXhUaW1lPzogbnVtYmVyO1xuICAgICAgICAgICAgZ3JvdXA/OiBzdHJpbmc7XG4gICAgICAgIH1cbiAgICApIHtcbiAgICAgICAgY29uc3QgY29ubiA9IGpvaW5Wb2ljZUNoYW5uZWwoe1xuICAgICAgICAgICAgZ3VpbGRJZDogY2hhbm5lbC5ndWlsZC5pZCxcbiAgICAgICAgICAgIGNoYW5uZWxJZDogY2hhbm5lbC5pZCxcbiAgICAgICAgICAgIGFkYXB0ZXJDcmVhdG9yOiBjaGFubmVsLmd1aWxkLnZvaWNlQWRhcHRlckNyZWF0b3IgYXMgdW5rbm93biBhcyBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yLFxuICAgICAgICAgICAgc2VsZkRlYWY6IEJvb2xlYW4ob3B0aW9ucz8uZGVhZiksXG4gICAgICAgICAgICBkZWJ1ZzogdGhpcy5wbGF5ZXIuZXZlbnRzLmxpc3RlbmVyQ291bnQoJ2RlYnVnJykgPiAwLFxuICAgICAgICAgICAgZ3JvdXA6IG9wdGlvbnM/Lmdyb3VwXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjb25uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2Nvbm5lY3RzIHZvaWNlIGNvbm5lY3Rpb25cbiAgICAgKiBAcGFyYW0ge1ZvaWNlQ29ubmVjdGlvbn0gY29ubmVjdGlvbiBUaGUgdm9pY2UgY29ubmVjdGlvblxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHB1YmxpYyBkaXNjb25uZWN0KGNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbiB8IFN0cmVhbURpc3BhdGNoZXIpIHtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24gaW5zdGFuY2VvZiBTdHJlYW1EaXNwYXRjaGVyKSBjb25uZWN0aW9uID0gY29ubmVjdGlvbi52b2ljZUNvbm5lY3Rpb247XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCkgcmV0dXJuIGNvbm5lY3Rpb24uZGVzdHJveSgpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIERpc2NvcmQgUGxheWVyIHZvaWNlIGNvbm5lY3Rpb25cbiAgICAgKiBAcGFyYW0ge1Nub3dmbGFrZX0gZ3VpbGQgVGhlIGd1aWxkIGlkXG4gICAgICogQHJldHVybnMge1N0cmVhbURpc3BhdGNoZXJ9XG4gICAgICovXG4gICAgcHVibGljIGdldENvbm5lY3Rpb24oZ3VpbGQ6IFNub3dmbGFrZSwgZ3JvdXA/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KGd1aWxkKSB8fCBnZXRWb2ljZUNvbm5lY3Rpb24oZ3VpbGQsIGdyb3VwKTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFZvaWNlVXRpbHMgfTtcbiIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgU2VhcmNoUmVzdWx0IH0gZnJvbSAnLi4vZmFicmljL1NlYXJjaFJlc3VsdCc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlDYWNoZU9wdGlvbnMge1xuICAgIGNoZWNrSW50ZXJ2YWw/OiBudW1iZXI7XG59XG5cbi8vIDVoXG5jb25zdCBERUZBVUxUX0VYUElSWV9USU1FT1VUID0gMThfMDAwXzAwMDtcblxuZXhwb3J0IGNsYXNzIFF1ZXJ5Q2FjaGUge1xuICAgICNkZWZhdWx0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgRGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGU8VHJhY2s+PigpO1xuICAgIHB1YmxpYyB0aW1lcjogTm9kZUpTLlRpbWVyO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHBsYXllcjogUGxheWVyLFxuICAgICAgICBwdWJsaWMgb3B0aW9uczogUXVlcnlDYWNoZU9wdGlvbnMgPSB7XG4gICAgICAgICAgICBjaGVja0ludGVydmFsOiBERUZBVUxUX0VYUElSWV9USU1FT1VUXG4gICAgICAgIH1cbiAgICApIHtcbiAgICAgICAgdGhpcy50aW1lciA9IHNldEludGVydmFsKHRoaXMuY2xlYW51cC5iaW5kKHRoaXMpLCB0aGlzLmNoZWNrSW50ZXJ2YWwpLnVucmVmKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjaGVja0ludGVydmFsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNoZWNrSW50ZXJ2YWwgPz8gREVGQVVMVF9FWFBJUllfVElNRU9VVDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2xlYW51cCgpIHtcbiAgICAgICAgZm9yIChjb25zdCBbaWQsIHZhbHVlXSBvZiB0aGlzLiNkZWZhdWx0Q2FjaGUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5oYXNFeHBpcmVkKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkZWZhdWx0Q2FjaGUuZGVsZXRlKGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjbGVhcigpIHtcbiAgICAgICAgdGhpcy4jZGVmYXVsdENhY2hlLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldERhdGEoKSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy4jZGVmYXVsdENhY2hlLnZhbHVlcygpXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYWRkRGF0YShkYXRhOiBTZWFyY2hSZXN1bHQpIHtcbiAgICAgICAgZGF0YS50cmFja3MuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2RlZmF1bHRDYWNoZS5oYXMoZC51cmwpKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLiNkZWZhdWx0Q2FjaGUuc2V0KGQudXJsLCBuZXcgRGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGUoZCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVzb2x2ZShjb250ZXh0OiBRdWVyeUNhY2hlUmVzb2x2ZXJDb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI2RlZmF1bHRDYWNoZS5nZXQoY29udGV4dC5xdWVyeSk7XG4gICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcy5wbGF5ZXIsIHtcbiAgICAgICAgICAgICAgICBxdWVyeTogY29udGV4dC5xdWVyeSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogY29udGV4dC5yZXF1ZXN0ZWRCeSxcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGU6IGNvbnRleHQucXVlcnlUeXBlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLnBsYXllciwge1xuICAgICAgICAgICAgcXVlcnk6IGNvbnRleHQucXVlcnksXG4gICAgICAgICAgICB0cmFja3M6IFtyZXN1bHQuZGF0YV0sXG4gICAgICAgICAgICBwbGF5bGlzdDogbnVsbCxcbiAgICAgICAgICAgIHF1ZXJ5VHlwZTogY29udGV4dC5xdWVyeVR5cGUsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogY29udGV4dC5yZXF1ZXN0ZWRCeVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZTxUID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyBleHBpcmVBZnRlciA9IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQ7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBkYXRhOiBULCBleHBpcmVBZnRlcjogbnVtYmVyID0gREVGQVVMVF9FWFBJUllfVElNRU9VVCkge1xuICAgICAgICBpZiAodHlwZW9mIGV4cGlyZUFmdGVyID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5leHBpcmVBZnRlciA9IERhdGUubm93KCkgKyBleHBpcmVBZnRlcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBoYXNFeHBpcmVkKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZXhwaXJlQWZ0ZXIgIT09ICdudW1iZXInIHx8IGlzTmFOKHRoaXMuZXhwaXJlQWZ0ZXIpIHx8IHRoaXMuZXhwaXJlQWZ0ZXIgPCAxKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBEYXRlLm5vdygpIDw9IHRoaXMuZXhwaXJlQWZ0ZXI7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FjaGVSZXNvbHZlckNvbnRleHQge1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG4gICAgcmVxdWVzdGVkQnk/OiBVc2VyO1xuICAgIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IGBleHQ6JHtzdHJpbmd9YDtcbn1cbiIsICJpbXBvcnQgeyBGRm1wZWcgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcbmltcG9ydCB7IENsaWVudCwgU25vd2ZsYWtlVXRpbCwgVm9pY2VTdGF0ZSwgSW50ZW50c0JpdEZpZWxkLCBVc2VyLCBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsIHZlcnNpb24gYXMgZGpzVmVyc2lvbiB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUGxheWxpc3QsIFRyYWNrLCBTZWFyY2hSZXN1bHQgfSBmcm9tICcuL2ZhYnJpYyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlRXZlbnRzLCBWb2ljZUNvbm5lY3RDb25maWcsIEd1aWxkTm9kZUNyZWF0ZU9wdGlvbnMsIEd1aWxkTm9kZU1hbmFnZXIsIEd1aWxkUXVldWUsIFJlc291cmNlUGxheU9wdGlvbnMsIEd1aWxkUXVldWVFdmVudCB9IGZyb20gJy4vbWFuYWdlcic7XG5pbXBvcnQgeyBWb2ljZVV0aWxzIH0gZnJvbSAnLi9Wb2ljZUludGVyZmFjZS9Wb2ljZVV0aWxzJztcbmltcG9ydCB7IFBsYXllckV2ZW50cywgUXVlcnlUeXBlLCBTZWFyY2hPcHRpb25zLCBQbGF5ZXJJbml0T3B0aW9ucywgUGxheWxpc3RJbml0RGF0YSwgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBRdWVyeVJlc29sdmVyIH0gZnJvbSAnLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEZXBlbmRlbmN5UmVwb3J0LCB2ZXJzaW9uIGFzIGRWb2ljZVZlcnNpb24gfSBmcm9tICdAZGlzY29yZGpzL3ZvaWNlJztcbmltcG9ydCB7IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuL2V4dHJhY3RvcnMvRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuaW1wb3J0ICogYXMgX2ludGVybmFscyBmcm9tICcuL3V0aWxzL19faW50ZXJuYWxfXyc7XG5pbXBvcnQgeyBRdWVyeUNhY2hlIH0gZnJvbSAnLi91dGlscy9RdWVyeUNhY2hlJztcbmltcG9ydCB7IFBsYXllckV2ZW50c0VtaXR0ZXIgfSBmcm9tICcuL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXInO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IGRlZmF1bHRWb2ljZVN0YXRlSGFuZGxlciB9IGZyb20gJy4vRGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyJztcblxuY29uc3Qga1NpbmdsZXRvbiA9IFN5bWJvbCgnSW5zdGFuY2VEaXNjb3JkUGxheWVyU2luZ2xldG9uJyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQgPSB1bmtub3duPiB7XG4gICAgdHJhY2s6IFRyYWNrO1xuICAgIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGw7XG4gICAgc2VhcmNoUmVzdWx0OiBTZWFyY2hSZXN1bHQ7XG4gICAgcXVldWU6IEd1aWxkUXVldWU8VD47XG59XG5cbmV4cG9ydCB0eXBlIFRyYWNrTGlrZSA9IHN0cmluZyB8IFRyYWNrIHwgU2VhcmNoUmVzdWx0IHwgVHJhY2tbXSB8IFBsYXlsaXN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4gZXh0ZW5kcyBTZWFyY2hPcHRpb25zIHtcbiAgICBub2RlT3B0aW9ucz86IEd1aWxkTm9kZUNyZWF0ZU9wdGlvbnM8VD47XG4gICAgY29ubmVjdGlvbk9wdGlvbnM/OiBWb2ljZUNvbm5lY3RDb25maWc7XG4gICAgYXVkaW9QbGF5ZXJPcHRpb25zPzogUmVzb3VyY2VQbGF5T3B0aW9ucztcbiAgICBhZnRlclNlYXJjaD86IChyZXN1bHQ6IFNlYXJjaFJlc3VsdCkgPT4gUHJvbWlzZTxTZWFyY2hSZXN1bHQ+O1xufVxuXG5leHBvcnQgdHlwZSBWb2ljZVN0YXRlSGFuZGxlciA9IChwbGF5ZXI6IFBsYXllciwgcXVldWU6IEd1aWxkUXVldWUsIG9sZFZvaWNlU3RhdGU6IFZvaWNlU3RhdGUsIG5ld1ZvaWNlU3RhdGU6IFZvaWNlU3RhdGUpID0+IEF3YWl0ZWQ8dm9pZD47XG5cbmV4cG9ydCBjbGFzcyBQbGF5ZXIgZXh0ZW5kcyBQbGF5ZXJFdmVudHNFbWl0dGVyPFBsYXllckV2ZW50cz4ge1xuICAgICNsYXN0TGF0ZW5jeSA9IC0xO1xuICAgICN2b2ljZVN0YXRlVXBkYXRlTGlzdGVuZXIgPSB0aGlzLmhhbmRsZVZvaWNlU3RhdGUuYmluZCh0aGlzKTtcbiAgICAjbGFnTW9uaXRvclRpbWVvdXQhOiBOb2RlSlMuVGltZW91dDtcbiAgICAjbGFnTW9uaXRvckludGVydmFsITogTm9kZUpTLlRpbWVyO1xuICAgICNvblZvaWNlU3RhdGVVcGRhdGU6IFZvaWNlU3RhdGVIYW5kbGVyID0gZGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nID0gJzYuNi4wLWRldi4wJztcbiAgICBwdWJsaWMgc3RhdGljIF9zaW5nbGV0b25LZXkgPSBrU2luZ2xldG9uO1xuICAgIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICAgIHB1YmxpYyByZWFkb25seSBjbGllbnQhOiBDbGllbnQ7XG4gICAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnMhOiBQbGF5ZXJJbml0T3B0aW9ucztcbiAgICBwdWJsaWMgbm9kZXMgPSBuZXcgR3VpbGROb2RlTWFuYWdlcih0aGlzKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdm9pY2VVdGlscyA9IG5ldyBWb2ljZVV0aWxzKHRoaXMpO1xuICAgIHB1YmxpYyBleHRyYWN0b3JzID0gbmV3IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQodGhpcyk7XG4gICAgcHVibGljIGV2ZW50cyA9IG5ldyBQbGF5ZXJFdmVudHNFbWl0dGVyPEd1aWxkUXVldWVFdmVudHM+KFsnZXJyb3InLCAncGxheWVyRXJyb3InXSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG5ldyBEaXNjb3JkIFBsYXllclxuICAgICAqIEBwYXJhbSB7Q2xpZW50fSBjbGllbnQgVGhlIERpc2NvcmQgQ2xpZW50XG4gICAgICogQHBhcmFtIHtQbGF5ZXJJbml0T3B0aW9uc30gW29wdGlvbnNdIFRoZSBwbGF5ZXIgaW5pdCBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50LCBvcHRpb25zOiBQbGF5ZXJJbml0T3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVJbnN0YW5jZSAmJiBrU2luZ2xldG9uIGluIFBsYXllcikgcmV0dXJuICg8YW55PlBsYXllcilba1NpbmdsZXRvbl0gYXMgUGxheWVyO1xuXG4gICAgICAgIHN1cGVyKFsnZXJyb3InXSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkaXNjb3JkLmpzIGNsaWVudFxuICAgICAgICAgKiBAdHlwZSB7Q2xpZW50fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG5cbiAgICAgICAgY29uc3QgaWJmID0gdGhpcy5jbGllbnQub3B0aW9ucy5pbnRlbnRzIGluc3RhbmNlb2YgSW50ZW50c0JpdEZpZWxkID8gdGhpcy5jbGllbnQub3B0aW9ucy5pbnRlbnRzIDogbmV3IEludGVudHNCaXRGaWVsZCh0aGlzLmNsaWVudC5vcHRpb25zLmludGVudHMpO1xuXG4gICAgICAgIGlmICghaWJmLmhhcyhJbnRlbnRzQml0RmllbGQuRmxhZ3MuR3VpbGRWb2ljZVN0YXRlcykpIHtcbiAgICAgICAgICAgIFV0aWwud2FybignY2xpZW50IGlzIG1pc3NpbmcgXCJHdWlsZFZvaWNlU3RhdGVzXCIgaW50ZW50JywgJ0ludmFsaWRJbnRlbnRzQml0RmllbGQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGxvY2tWb2ljZVN0YXRlSGFuZGxlcjogZmFsc2UsXG4gICAgICAgICAgICBibG9ja0V4dHJhY3RvcnM6IFtdLFxuICAgICAgICAgICAgYmxvY2tTdHJlYW1Gcm9tOiBbXSxcbiAgICAgICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0OiAyMDAwMCxcbiAgICAgICAgICAgIHNtb290aFZvbHVtZTogdHJ1ZSxcbiAgICAgICAgICAgIGxhZ01vbml0b3I6IDMwMDAwLFxuICAgICAgICAgICAgcXVlcnlDYWNoZTogb3B0aW9ucy5xdWVyeUNhY2hlID09PSBudWxsID8gbnVsbCA6IG9wdGlvbnMucXVlcnlDYWNoZSB8fCBuZXcgUXVlcnlDYWNoZSh0aGlzKSxcbiAgICAgICAgICAgIHVzZUxlZ2FjeUZGbXBlZzogZmFsc2UsXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgeXRkbE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBoaWdoV2F0ZXJNYXJrOiAxIDw8IDI1LFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMueXRkbE9wdGlvbnNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBQbGF5ZXJJbml0T3B0aW9ucztcblxuICAgICAgICB0aGlzLmNsaWVudC5vbigndm9pY2VTdGF0ZVVwZGF0ZScsIHRoaXMuI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lcik7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMubGFnTW9uaXRvciA9PT0gJ251bWJlcicgJiYgdGhpcy5vcHRpb25zLmxhZ01vbml0b3IgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLiNsYWdNb25pdG9yVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNsYXN0TGF0ZW5jeSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbTGFnIE1vbml0b3JdIEV2ZW50IGxvb3AgbGF0ZW5jeTogJHt0aGlzLiNsYXN0TGF0ZW5jeX1tc2ApO1xuICAgICAgICAgICAgICAgIH0sIDApLnVucmVmKCk7XG4gICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMubGFnTW9uaXRvcikudW5yZWYoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF9pbnRlcm5hbHMuYWRkUGxheWVyKHRoaXMpO1xuXG4gICAgICAgIGlmICghKGtTaW5nbGV0b24gaW4gUGxheWVyKSkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFBsYXllciwga1NpbmdsZXRvbiwge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLFxuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhhc0RlYnVnZ2VyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lckNvdW50KCdkZWJ1ZycpID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyXG4gICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgY2FsbGJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgb25Wb2ljZVN0YXRlVXBkYXRlKGhhbmRsZXI6IFZvaWNlU3RhdGVIYW5kbGVyKSB7XG4gICAgICAgIHRoaXMuI29uVm9pY2VTdGF0ZVVwZGF0ZSA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGRlYnVnKG06IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdkZWJ1ZycsIG0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZGlzY29yZC1wbGF5ZXIgc2luZ2xldG9uIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBjbGllbnQgVGhlIGNsaWVudCB0aGF0IGluc3RhbnRpYXRlZCBwbGF5ZXJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBQbGF5ZXIgaW5pdGlhbGl6ZXIgb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgc2luZ2xldG9uKGNsaWVudDogQ2xpZW50LCBvcHRpb25zOiBQbGF5ZXJJbml0T3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBuZXcgUGxheWVyKGNsaWVudCwge1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIGlnbm9yZUluc3RhbmNlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIGFjdGl2ZSBtYXN0ZXIgcGxheWVyIGluc3RhbmNlc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QWxsUGxheWVycygpIHtcbiAgICAgICAgcmV0dXJuIF9pbnRlcm5hbHMuZ2V0UGxheWVycygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIGFsbCBtYXN0ZXIgcGxheWVyIGluc3RhbmNlc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXJBbGxQbGF5ZXJzKCkge1xuICAgICAgICByZXR1cm4gX2ludGVybmFscy5pbnN0YW5jZXMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBxdWVyeSBjYWNoZSBwcm92aWRlciBpbiB1c2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHF1ZXJ5Q2FjaGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMucXVlcnlDYWNoZSA/PyBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsaWFzIHRvIGBQbGF5ZXIubm9kZXNgLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcXVldWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBsb29wIGxhdGVuY3kgaW4gbXMuIElmIHlvdXIgYm90IGlzIGxhZ2d5IGFuZCB0aGlzIHJldHVybnMgYSBudW1iZXIgYWJvdmUgMjBtcyBmb3IgZXhhbXBsZSxcbiAgICAgKiBzb21lIGV4cGVuc2l2ZSB0YXNrIGlzIGJlaW5nIGV4ZWN1dGVkIG9uIHRoZSBjdXJyZW50IHRocmVhZCB3aGljaCBpcyBzbG93aW5nIGRvd24gdGhlIGV2ZW50IGxvb3AuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGV2ZW50TG9vcExhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2xhc3RMYXRlbmN5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBzdGF0aXN0aWNzIHRoYXQgY291bGQgYmUgdXNlZnVsLiBTdGF0aXN0aWNzIGdlbmVyYXRvciBpcyBzdGlsbCBleHBlcmltZW50YWwuXG4gICAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHN0YXRzID0gcGxheWVyLmdlbmVyYXRlU3RhdGlzdGljcygpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coc3RhdHMpO1xuICAgICAqXG4gICAgICogLy8gb3V0cHV0cyBzb21ldGhpbmcgbGlrZVxuICAgICAqIC8vIHtcbiAgICAgKiAvLyAgIGluc3RhbmNlczogbnVtYmVyLFxuICAgICAqIC8vICAgcXVldWVzQ291bnQ6IG51bWJlcixcbiAgICAgKiAvLyAgIHF1ZXJ5Q2FjaGVFbmFibGVkOiBib29sZWFuLFxuICAgICAqIC8vICAgcXVldWVzOiBbXG4gICAgICogLy8gICAgICBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhLFxuICAgICAqIC8vICAgICAgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSxcbiAgICAgKiAvLyAgICAgIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGEsXG4gICAgICogLy8gICAgICAuLi5cbiAgICAgKiAvLyAgIF1cbiAgICAgKiAvLyB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdlbmVyYXRlU3RhdGlzdGljcygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluc3RhbmNlczogX2ludGVybmFscy5pbnN0YW5jZXMuc2l6ZSxcbiAgICAgICAgICAgIHF1ZXVlc0NvdW50OiB0aGlzLnF1ZXVlcy5jYWNoZS5zaXplLFxuICAgICAgICAgICAgcXVlcnlDYWNoZUVuYWJsZWQ6IHRoaXMucXVlcnlDYWNoZSAhPSBudWxsLFxuICAgICAgICAgICAgcXVldWVzOiB0aGlzLnF1ZXVlcy5jYWNoZS5tYXAoKG0pID0+IG0uc3RhdHMuZ2VuZXJhdGUoKSlcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95IGV2ZXJ5IHNpbmdsZSBxdWV1ZXMgbWFuYWdlZCBieSB0aGlzIG1hc3RlciBwbGF5ZXIgaW5zdGFuY2VcbiAgICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gdXNlIG1lIHdoZW4geW91IHdhbnQgdG8gaW1tZWRpYXRlbHkgdGVybWluYXRlIGV2ZXJ5IHNpbmdsZSBxdWV1ZXMgaW4gZXhpc3RlbmNlIFx1RDgzRFx1REQyQVxuICAgICAqIGF3YWl0IHBsYXllci5kZXN0cm95KCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMubm9kZXMuY2FjaGUuZm9yRWFjaCgobm9kZSkgPT4gbm9kZS5kZWxldGUoKSk7XG4gICAgICAgIHRoaXMuY2xpZW50Lm9mZigndm9pY2VTdGF0ZVVwZGF0ZScsIHRoaXMuI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lcik7XG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMuZXZlbnRzLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICBhd2FpdCB0aGlzLmV4dHJhY3RvcnMudW5yZWdpc3RlckFsbCgpO1xuICAgICAgICBpZiAodGhpcy4jbGFnTW9uaXRvckludGVydmFsKSBjbGVhckludGVydmFsKHRoaXMuI2xhZ01vbml0b3JJbnRlcnZhbCk7XG4gICAgICAgIGlmICh0aGlzLiNsYWdNb25pdG9yVGltZW91dCkgY2xlYXJJbnRlcnZhbCh0aGlzLiNsYWdNb25pdG9yVGltZW91dCk7XG4gICAgICAgIF9pbnRlcm5hbHMuY2xlYXJQbGF5ZXIodGhpcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpIHtcbiAgICAgICAgY29uc3QgcXVldWUgPSB0aGlzLm5vZGVzLmdldChvbGRTdGF0ZS5ndWlsZC5pZCk7XG4gICAgICAgIGlmICghcXVldWUgfHwgIXF1ZXVlLmNvbm5lY3Rpb24gfHwgIXF1ZXVlLmNoYW5uZWwpIHJldHVybjtcblxuICAgICAgICAvLyBkaXNwYXRjaCB2b2ljZSBzdGF0ZSB1cGRhdGVcbiAgICAgICAgY29uc3Qgd2FzSGFuZGxlZCA9IHRoaXMuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnZvaWNlU3RhdGVVcGRhdGUsIHF1ZXVlLCBvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgICAgICAvLyBpZiB0aGUgZXZlbnQgd2FzIGhhbmRsZWQsIHJldHVybiBhc3N1bWluZyB0aGUgbGlzdGVuZXIgaW1wbGVtZW50ZWQgYWxsIG9mIHRoZSBsb2dpYyBiZWxvd1xuICAgICAgICBpZiAod2FzSGFuZGxlZCAmJiAhdGhpcy5vcHRpb25zLmxvY2tWb2ljZVN0YXRlSGFuZGxlcikgcmV0dXJuO1xuXG4gICAgICAgIHJldHVybiB0aGlzLiNvblZvaWNlU3RhdGVVcGRhdGUodGhpcywgcXVldWUsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB2b2ljZSBzdGF0ZSB1cGRhdGVcbiAgICAgKiBAcGFyYW0ge1ZvaWNlU3RhdGV9IG9sZFN0YXRlIFRoZSBvbGQgdm9pY2Ugc3RhdGVcbiAgICAgKiBAcGFyYW0ge1ZvaWNlU3RhdGV9IG5ld1N0YXRlIFRoZSBuZXcgdm9pY2Ugc3RhdGVcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gcGFzc2luZyB2b2ljZSBzdGF0ZSB1cGRhdGUgZGF0YSB0byB0aGlzIG1ldGhvZCB3aWxsIHRyaWdnZXIgdm9pY2Ugc3RhdGUgaGFuZGxlclxuICAgICAqXG4gICAgICogY2xpZW50Lm9uKCd2b2ljZVN0YXRlVXBkYXRlJywgKG9sZFN0YXRlLCBuZXdTdGF0ZSkgPT4ge1xuICAgICAqICAgLy8gdGhpcyBpcyBkZWZpbml0ZWx5IGEgcm9ja2V0IHNjaWVuY2UsIHJpZ2h0IGhlcmVcbiAgICAgKiAgIHBsYXllci5oYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gICAgICogfSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGhhbmRsZVZvaWNlU3RhdGUob2xkU3RhdGU6IFZvaWNlU3RhdGUsIG5ld1N0YXRlOiBWb2ljZVN0YXRlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2hhbmRsZVZvaWNlU3RhdGUob2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2NrIHZvaWNlIHN0YXRlIGhhbmRsZXIuIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBkaXNjb3JkLXBsYXllciB3aWxsIGtlZXAgdXNpbmcgdGhlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIsIGV2ZW4gaWYgY3VzdG9tIGltcGxlbWVudGF0aW9uIGV4aXN0cy5cbiAgICAgKi9cbiAgICBwdWJsaWMgbG9ja1ZvaWNlU3RhdGVIYW5kbGVyKCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbmxvY2sgdm9pY2Ugc3RhdGUgaGFuZGxlci4gV2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGRpc2NvcmQtcGxheWVyIHdpbGwgc3RvcCB1c2luZyB0aGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlciBpZiBjdXN0b20gaW1wbGVtZW50YXRpb24gZXhpc3RzLlxuICAgICAqL1xuICAgIHB1YmxpYyB1bmxvY2tWb2ljZVN0YXRlSGFuZGxlcigpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmxvY2tWb2ljZVN0YXRlSGFuZGxlciA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB2b2ljZSBzdGF0ZSBoYW5kbGVyIGlzIGxvY2tlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNWb2ljZVN0YXRlSGFuZGxlckxvY2tlZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5vcHRpb25zLmxvY2tWb2ljZVN0YXRlSGFuZGxlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWF0ZSBhdWRpbyBwbGF5ZXJcbiAgICAgKiBAcGFyYW0gY2hhbm5lbCBUaGUgdm9pY2UgY2hhbm5lbCBvbiB3aGljaCB0aGUgbXVzaWMgc2hvdWxkIGJlIHBsYXllZFxuICAgICAqIEBwYXJhbSBxdWVyeSBUaGUgdHJhY2sgb3Igc291cmNlIHRvIHBsYXlcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciBwbGF5ZXJcbiAgICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gbm8gbmVlZCB0byB3b3JyeSBhYm91dCBxdWV1ZSBtYW5hZ2VtZW50LCBqdXN0IHVzZSB0aGlzIG1ldGhvZCBcdUQ4M0RcdURFMDRcbiAgICAgKiBjb25zdCBxdWVyeSA9ICd0aGlzIGlzIG15IHN1cGVyIGNvb2wgc2VhcmNoIHF1ZXJ5IHRoYXQgSSB3YW50IHRvIHBsYXknO1xuICAgICAqXG4gICAgICogdHJ5IHtcbiAgICAgKiAgICBjb25zdCB7IHRyYWNrIH0gPSBhd2FpdCBwbGF5ZXIucGxheSh2b2ljZUNoYW5uZWwsIHF1ZXJ5KTtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBcdUQ4M0NcdURGODkgSSBhbSBwbGF5aW5nICR7dHJhY2sudGl0bGV9IFx1RDgzQ1x1REY4OWApO1xuICAgICAqIH0gY2F0Y2goZSkge1xuICAgICAqICAgY29uc29sZS5sb2coYFx1RDgzRFx1REUyRCBGYWlsZWQgdG8gcGxheSBlcnJvciBvaCBubzpcXG5cXG4ke2V9YCk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwbGF5PFQgPSB1bmtub3duPihjaGFubmVsOiBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsIHF1ZXJ5OiBUcmFja0xpa2UsIG9wdGlvbnM6IFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4gPSB7fSk6IFByb21pc2U8UGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgICAgIGNvbnN0IHZjID0gdGhpcy5jbGllbnQuY2hhbm5lbHMucmVzb2x2ZShjaGFubmVsKTtcbiAgICAgICAgaWYgKCF2Yz8uaXNWb2ljZUJhc2VkKCkpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2NoYW5uZWwnLCAnVm9pY2VCYXNlZENoYW5uZWwnLCAhdmMgPyAndW5kZWZpbmVkJyA6IGBjaGFubmVsIHR5cGUgJHt2Yy50eXBlfWApO1xuXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVzdWx0ID0gcXVlcnkgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHQgPyBxdWVyeSA6IGF3YWl0IHRoaXMuc2VhcmNoKHF1ZXJ5LCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gKGF3YWl0IG9wdGlvbnMuYWZ0ZXJTZWFyY2g/LihvcmlnaW5hbFJlc3VsdCkpIHx8IG9yaWdpbmFsUmVzdWx0O1xuICAgICAgICBpZiAocmVzdWx0LmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKGBObyByZXN1bHRzIGZvdW5kIGZvciBcIiR7cXVlcnl9XCIgKEV4dHJhY3RvcjogJHtyZXN1bHQuZXh0cmFjdG9yPy5pZGVudGlmaWVyIHx8ICdOL0EnfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5ub2Rlcy5jcmVhdGUodmMuZ3VpbGQsIG9wdGlvbnMubm9kZU9wdGlvbnMpO1xuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gQWNxdWlyaW5nIGFuIGVudHJ5Li4uYCk7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gcXVldWUudGFza3NRdWV1ZS5hY3F1aXJlKCk7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gRW50cnkgJHtlbnRyeS5pZH0gd2FzIGFjcXVpcmVkIHN1Y2Nlc3NmdWxseSFgKTtcblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIFdhaXRpbmcgZm9yIHRoZSBxdWV1ZSB0byByZXNvbHZlLi4uYCk7XG4gICAgICAgIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBFbnRyeSAke2VudHJ5LmlkfSB3YXMgcmVzb2x2ZWQhYCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghcXVldWUuY2hhbm5lbCkgYXdhaXQgcXVldWUuY29ubmVjdCh2Yywgb3B0aW9ucy5jb25uZWN0aW9uT3B0aW9ucyk7XG5cbiAgICAgICAgICAgIGlmICghcmVzdWx0LnBsYXlsaXN0KSB7XG4gICAgICAgICAgICAgICAgcXVldWUuYWRkVHJhY2socmVzdWx0LnRyYWNrc1swXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHF1ZXVlLmFkZFRyYWNrKHJlc3VsdC5wbGF5bGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXF1ZXVlLmlzUGxheWluZygpKSBhd2FpdCBxdWV1ZS5ub2RlLnBsYXkobnVsbCwgb3B0aW9ucy5hdWRpb1BsYXllck9wdGlvbnMpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBSZWxlYXNpbmcgYW4gZW50cnkgZnJvbSB0aGUgcXVldWUuLi5gKTtcbiAgICAgICAgICAgIHF1ZXVlLnRhc2tzUXVldWUucmVsZWFzZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRyYWNrOiByZXN1bHQudHJhY2tzWzBdLFxuICAgICAgICAgICAgZXh0cmFjdG9yOiByZXN1bHQuZXh0cmFjdG9yLFxuICAgICAgICAgICAgc2VhcmNoUmVzdWx0OiByZXN1bHQsXG4gICAgICAgICAgICBxdWV1ZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlYXJjaCB0cmFja3NcbiAgICAgKiBAcGFyYW0ge3N0cmluZyB8IFRyYWNrIHwgVHJhY2tbXSB8IFBsYXlsaXN0IHwgU2VhcmNoUmVzdWx0fSBxdWVyeSBUaGUgc2VhcmNoIHF1ZXJ5XG4gICAgICogQHBhcmFtIHtTZWFyY2hPcHRpb25zfSBvcHRpb25zIFRoZSBzZWFyY2ggb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFNlYXJjaFJlc3VsdD59XG4gICAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHNlYXJjaFF1ZXJ5ID0gJ3Bhc3MgdXJsIG9yIHRleHQgb3IgZGlzY29yZC1wbGF5ZXIgdHJhY2sgY29uc3RydWN0YWJsZSBvYmplY3RzLCB3ZSBnb3QgeW91IGNvdmVyZWQgXHVEODNEXHVERTBFJztcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBwbGF5ZXIuc2VhcmNoKHNlYXJjaFF1ZXJ5KTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHJlc3VsdCk7IC8vIExvZ3MgYFNlYXJjaFJlc3VsdGAgb2JqZWN0XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNlYXJjaChxdWVyeTogc3RyaW5nIHwgVHJhY2sgfCBUcmFja1tdIHwgUGxheWxpc3QgfCBTZWFyY2hSZXN1bHQsIG9wdGlvbnM6IFNlYXJjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2VhcmNoUmVzdWx0PiB7XG4gICAgICAgIGlmIChxdWVyeSBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdCkgcmV0dXJuIHF1ZXJ5O1xuXG4gICAgICAgIGlmIChvcHRpb25zLnJlcXVlc3RlZEJ5ICE9IG51bGwpIG9wdGlvbnMucmVxdWVzdGVkQnkgPSB0aGlzLmNsaWVudC51c2Vycy5yZXNvbHZlKG9wdGlvbnMucmVxdWVzdGVkQnkpITtcbiAgICAgICAgb3B0aW9ucy5ibG9ja0V4dHJhY3RvcnMgPz89IHRoaXMub3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM7XG4gICAgICAgIG9wdGlvbnMuZmFsbGJhY2tTZWFyY2hFbmdpbmUgPz89IFF1ZXJ5VHlwZS5BVVRPX1NFQVJDSDtcblxuICAgICAgICBpZiAocXVlcnkgaW5zdGFuY2VvZiBUcmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgICAgICAgIHBsYXlsaXN0OiBxdWVyeS5wbGF5bGlzdCB8fCBudWxsLFxuICAgICAgICAgICAgICAgIHRyYWNrczogW3F1ZXJ5XSxcbiAgICAgICAgICAgICAgICBxdWVyeTogcXVlcnkudGl0bGUsXG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yOiBxdWVyeS5leHRyYWN0b3IsXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlOiBxdWVyeS5xdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHF1ZXJ5IGluc3RhbmNlb2YgUGxheWxpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBwbGF5bGlzdDogcXVlcnksXG4gICAgICAgICAgICAgICAgdHJhY2tzOiBxdWVyeS50cmFja3MsXG4gICAgICAgICAgICAgICAgcXVlcnk6IHF1ZXJ5LnRpdGxlLFxuICAgICAgICAgICAgICAgIGV4dHJhY3RvcjogcXVlcnkudHJhY2tzWzBdPy5leHRyYWN0b3IsXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlOiBRdWVyeVR5cGUuQVVUTyxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShxdWVyeSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYWNrcyA9IHF1ZXJ5LmZpbHRlcigodCkgPT4gdCBpbnN0YW5jZW9mIFRyYWNrKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBwbGF5bGlzdDogbnVsbCxcbiAgICAgICAgICAgICAgICB0cmFja3MsXG4gICAgICAgICAgICAgICAgcXVlcnk6ICdAQCMle3tVc2VyTG9hZGVkQ29udGVudH19JSNAQCcsXG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yOiBudWxsLFxuICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZTogUXVlcnlUeXBlLkFVVE8sXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFNlYXJjaGluZyAke3F1ZXJ5fWApO1xuXG4gICAgICAgIGxldCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsID0gbnVsbDtcblxuICAgICAgICBvcHRpb25zLnNlYXJjaEVuZ2luZSA/Pz0gUXVlcnlUeXBlLkFVVE87XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFNlYXJjaCBlbmdpbmUgc2V0IHRvICR7b3B0aW9ucy5zZWFyY2hFbmdpbmV9YCk7XG5cbiAgICAgICAgY29uc3QgcXVlcnlUeXBlID0gb3B0aW9ucy5zZWFyY2hFbmdpbmUgPT09IFF1ZXJ5VHlwZS5BVVRPID8gUXVlcnlSZXNvbHZlci5yZXNvbHZlKHF1ZXJ5LCBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lKSA6IG9wdGlvbnMuc2VhcmNoRW5naW5lO1xuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBRdWVyeSB0eXBlIGlkZW50aWZpZWQgYXMgJHtxdWVyeVR5cGV9YCk7XG5cbiAgICAgICAgLy8gZm9yY2UgcGFydGljdWxhciBleHRyYWN0b3JcbiAgICAgICAgaWYgKG9wdGlvbnMuc2VhcmNoRW5naW5lLnN0YXJ0c1dpdGgoJ2V4dDonKSkge1xuICAgICAgICAgICAgZXh0cmFjdG9yID0gdGhpcy5leHRyYWN0b3JzLmdldChvcHRpb25zLnNlYXJjaEVuZ2luZS5zdWJzdHJpbmcoNCkpITtcbiAgICAgICAgICAgIGlmICghZXh0cmFjdG9yKVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcXVlcnkgYWxsIGV4dHJhY3RvcnNcbiAgICAgICAgaWYgKCFleHRyYWN0b3IpIHtcbiAgICAgICAgICAgIC8vIGNhY2hlIHZhbGlkYXRpb25cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVDYWNoZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBDaGVja2luZyBjYWNoZS4uLmApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMucXVlcnlDYWNoZT8ucmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gY2FjaGUgaGl0XG4gICAgICAgICAgICAgICAgaWYgKHJlcz8uaGFzVHJhY2tzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYENhY2hlIGhpdCBmb3IgcXVlcnkgJHtxdWVyeX1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2FjaGUgbWlzcyBmb3IgcXVlcnkgJHtxdWVyeX1gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEV4ZWN1dGluZyBleHRyYWN0b3JzLi4uYCk7XG5cbiAgICAgICAgICAgIC8vIGNhY2hlIG1pc3NcbiAgICAgICAgICAgIGV4dHJhY3RvciA9XG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2NrRXh0cmFjdG9ycz8uaW5jbHVkZXMoZXh0LmlkZW50aWZpZXIpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXh0LnZhbGlkYXRlKHF1ZXJ5LCBxdWVyeVR5cGUgYXMgU2VhcmNoUXVlcnlUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApPy5leHRyYWN0b3IgfHwgbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5vIGV4dHJhY3RvcnMgYXZhaWxhYmxlXG4gICAgICAgIGlmICghZXh0cmFjdG9yKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRmFpbGVkIHRvIGZpbmQgYXBwcm9wcmlhdGUgZXh0cmFjdG9yJyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBFeGVjdXRpbmcgbWV0YWRhdGEgcXVlcnkgdXNpbmcgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yLi4uYCk7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGV4dHJhY3RvclxuICAgICAgICAgICAgLmhhbmRsZShxdWVyeSwge1xuICAgICAgICAgICAgICAgIHR5cGU6IHF1ZXJ5VHlwZSBhcyBTZWFyY2hRdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnkgYXMgVXNlclxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKTtcblxuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnTWV0YWRhdGEgcXVlcnkgd2FzIHN1Y2Nlc3NmdWwhJyk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgcGxheWxpc3Q6IHJlcy5wbGF5bGlzdCxcbiAgICAgICAgICAgICAgICB0cmFja3M6IHJlcy50cmFja3MsXG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUNhY2hlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEFkZGluZyBkYXRhIHRvIGNhY2hlLi4uYCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5xdWVyeUNhY2hlPy5hZGREYXRhKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRmFpbGVkIHRvIGZpbmQgcmVzdWx0IHVzaW5nIGFwcHJvcHJpYXRlIGV4dHJhY3Rvci4gUXVlcnlpbmcgYWxsIGV4dHJhY3RvcnMuLi4nKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leHRyYWN0b3JzLnJ1bihcbiAgICAgICAgICAgIGFzeW5jIChleHQpID0+XG4gICAgICAgICAgICAgICAgIW9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzPy5pbmNsdWRlcyhleHQuaWRlbnRpZmllcikgJiZcbiAgICAgICAgICAgICAgICAoYXdhaXQgZXh0LnZhbGlkYXRlKHF1ZXJ5KSkgJiZcbiAgICAgICAgICAgICAgICBleHQuaGFuZGxlKHF1ZXJ5LCB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHF1ZXJ5VHlwZSBhcyBTZWFyY2hRdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5IGFzIFVzZXJcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICBpZiAoIXJlc3VsdD8ucmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgRmFpbGVkIHRvIHF1ZXJ5IG1ldGFkYXRhIHF1ZXJ5IHVzaW5nICR7cmVzdWx0Py5leHRyYWN0b3IuaWRlbnRpZmllciB8fCAnTi9BJ30gZXh0cmFjdG9yLmApO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeSxcbiAgICAgICAgICAgICAgICBleHRyYWN0b3I6IHJlc3VsdD8uZXh0cmFjdG9yXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBNZXRhZGF0YSBxdWVyeSB3YXMgc3VjY2Vzc2Z1bCB1c2luZyAke3Jlc3VsdC5leHRyYWN0b3IuaWRlbnRpZmllcn0hYCk7XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgICBwbGF5bGlzdDogcmVzdWx0LnJlc3VsdC5wbGF5bGlzdCxcbiAgICAgICAgICAgIHRyYWNrczogcmVzdWx0LnJlc3VsdC50cmFja3MsXG4gICAgICAgICAgICBleHRyYWN0b3I6IHJlc3VsdC5leHRyYWN0b3IsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMuaWdub3JlQ2FjaGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBBZGRpbmcgZGF0YSB0byBjYWNoZS4uLmApO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5xdWVyeUNhY2hlPy5hZGREYXRhKGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGEgcmVwb3J0IG9mIHRoZSBkZXBlbmRlbmNpZXMgdXNlZCBieSB0aGUgYEBkaXNjb3JkanMvdm9pY2VgIG1vZHVsZS4gVXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnNvbGUubG9nKHBsYXllci5zY2FuRGVwcygpKTtcbiAgICAgKiAvLyAtPiBsb2dzIGRlcGVuZGVuY2llcyByZXBvcnRcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHB1YmxpYyBzY2FuRGVwcygpIHtcbiAgICAgICAgY29uc3QgbGluZSA9ICctJy5yZXBlYXQoNTApO1xuICAgICAgICBjb25zdCBydW50aW1lID0gJ0J1bicgaW4gZ2xvYmFsVGhpcyA/ICdidW4nIDogJ0Rlbm8nIGluIGdsb2JhbFRoaXMgPyAnZGVubycgOiAnbm9kZSc7XG4gICAgICAgIGNvbnN0IGRlcHNSZXBvcnQgPSBbXG4gICAgICAgICAgICAnRGlzY29yZCBQbGF5ZXInLFxuICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgIGAtIGRpc2NvcmQtcGxheWVyOiAke1BsYXllci52ZXJzaW9ufWAsXG4gICAgICAgICAgICBgLSBAZGlzY29yZGpzL3ZvaWNlOiAke2RWb2ljZVZlcnNpb259YCxcbiAgICAgICAgICAgIGAtIGRpc2NvcmQuanM6ICR7ZGpzVmVyc2lvbn1gLFxuICAgICAgICAgICAgYC0gJHtydW50aW1lfSB2ZXJzaW9uOiAke3Byb2Nlc3MudmVyc2lvbn1gLFxuICAgICAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnVzZUxlZ2FjeUZGbXBlZykgcmV0dXJuICctIGZmbXBlZzogTi9BICh1c2luZyBsZWdhY3kgZmZtcGVnKSc7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5mbyA9IEZGbXBlZy5sb2NhdGVTYWZlKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFpbmZvKSByZXR1cm4gJ0ZGbXBlZy9BdmNvbnYgbm90IGZvdW5kJztcblxuICAgICAgICAgICAgICAgIHJldHVybiBbYC0gZmZtcGVnOiAke2luZm8udmVyc2lvbn1gLCBgLSBjb21tYW5kOiAke2luZm8uY29tbWFuZH1gLCBgLSBzdGF0aWM6ICR7aW5mby5pc1N0YXRpY31gLCBgLSBsaWJvcHVzOiAke2luZm8ubWV0YWRhdGEhLmluY2x1ZGVzKCctLWVuYWJsZS1saWJvcHVzJyl9YF0uam9pbignXFxuJyk7XG4gICAgICAgICAgICB9KSgpLFxuICAgICAgICAgICAgJ1xcbicsXG4gICAgICAgICAgICAnTG9hZGVkIEV4dHJhY3RvcnM6JyxcbiAgICAgICAgICAgIGxpbmUsXG4gICAgICAgICAgICB0aGlzLmV4dHJhY3RvcnMuc3RvcmVcbiAgICAgICAgICAgICAgICAubWFwKChtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtLmlkZW50aWZpZXI7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJykgfHwgJ04vQScsXG4gICAgICAgICAgICAnXFxuXFxuQGRpc2NvcmRqcy92b2ljZScsXG4gICAgICAgICAgICBnZW5lcmF0ZURlcGVuZGVuY3lSZXBvcnQoKVxuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiBkZXBzUmVwb3J0LmpvaW4oJ1xcbicpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHlpZWxkKiB0aGlzLm5vZGVzLmNhY2hlLnZhbHVlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYFBsYXlsaXN0YCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGluaXRpYWxpemUgYSBwbGF5bGlzdFxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVQbGF5bGlzdChkYXRhOiBQbGF5bGlzdEluaXREYXRhKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGxheWxpc3QodGhpcywgZGF0YSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IENoYW5uZWxUeXBlLCBWb2ljZVN0YXRlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQgfSBmcm9tICcuL21hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi9QbGF5ZXInO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4vdXRpbHMvVXRpbCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXIocGxheWVyOiBQbGF5ZXIsIHF1ZXVlOiBHdWlsZFF1ZXVlLCBvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpIHtcbiAgICBpZiAoIXF1ZXVlIHx8ICFxdWV1ZS5jb25uZWN0aW9uIHx8ICFxdWV1ZS5jaGFubmVsKSByZXR1cm47XG5cbiAgICBpZiAob2xkU3RhdGUuY2hhbm5lbElkICYmICFuZXdTdGF0ZS5jaGFubmVsSWQgJiYgbmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHF1ZXVlLmRlbGV0ZSgpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8qIG5vb3AgKi9cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdm9pZCBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmRpc2Nvbm5lY3QsIHF1ZXVlKTtcbiAgICB9XG5cbiAgICBpZiAoIW9sZFN0YXRlLmNoYW5uZWxJZCAmJiBuZXdTdGF0ZS5jaGFubmVsSWQgJiYgbmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQpIHtcbiAgICAgICAgaWYgKG5ld1N0YXRlLnNlcnZlck11dGUgIT0gbnVsbCAmJiBvbGRTdGF0ZS5zZXJ2ZXJNdXRlICE9PSBuZXdTdGF0ZS5zZXJ2ZXJNdXRlKSB7XG4gICAgICAgICAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZChuZXdTdGF0ZS5zZXJ2ZXJNdXRlKTtcbiAgICAgICAgfSBlbHNlIGlmIChuZXdTdGF0ZS5jaGFubmVsPy50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2UgJiYgbmV3U3RhdGUuc3VwcHJlc3MgIT0gbnVsbCAmJiBvbGRTdGF0ZS5zdXBwcmVzcyAhPT0gbmV3U3RhdGUuc3VwcHJlc3MpIHtcbiAgICAgICAgICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKG5ld1N0YXRlLnN1cHByZXNzKTtcbiAgICAgICAgICAgIGlmIChuZXdTdGF0ZS5zdXBwcmVzcykge1xuICAgICAgICAgICAgICAgIG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LnZvaWNlLnNldFJlcXVlc3RUb1NwZWFrKHRydWUpLmNhdGNoKFV0aWwubm9vcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW5ld1N0YXRlLmNoYW5uZWxJZCAmJiBvbGRTdGF0ZS5jaGFubmVsSWQgPT09IHF1ZXVlLmNoYW5uZWwuaWQpIHtcbiAgICAgICAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCFwbGF5ZXIubm9kZXMuaGFzKHF1ZXVlLmd1aWxkLmlkKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5KSBxdWV1ZS5kZWxldGUoKTtcbiAgICAgICAgICAgIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZW1wdHlDaGFubmVsLCBxdWV1ZSk7XG4gICAgICAgIH0sIHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24gfHwgMCkudW5yZWYoKTtcbiAgICAgICAgcXVldWUudGltZW91dHMuc2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWAsIHRpbWVvdXQpO1xuICAgIH1cblxuICAgIGlmIChuZXdTdGF0ZS5jaGFubmVsSWQgJiYgbmV3U3RhdGUuY2hhbm5lbElkID09PSBxdWV1ZS5jaGFubmVsLmlkKSB7XG4gICAgICAgIGNvbnN0IGVtcHR5VGltZW91dCA9IHF1ZXVlLnRpbWVvdXRzLmdldChgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gKTtcbiAgICAgICAgY29uc3QgY2hhbm5lbEVtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCk7XG4gICAgICAgIGlmICghY2hhbm5lbEVtcHR5ICYmIGVtcHR5VGltZW91dCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGVtcHR5VGltZW91dCk7XG4gICAgICAgICAgICBxdWV1ZS50aW1lb3V0cy5kZWxldGUoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmNoYW5uZWxQb3B1bGF0ZSwgcXVldWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9sZFN0YXRlLmNoYW5uZWxJZCAmJiBuZXdTdGF0ZS5jaGFubmVsSWQgJiYgb2xkU3RhdGUuY2hhbm5lbElkICE9PSBuZXdTdGF0ZS5jaGFubmVsSWQpIHtcbiAgICAgICAgaWYgKG5ld1N0YXRlLm1lbWJlcj8uaWQgPT09IG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LmlkKSB7XG4gICAgICAgICAgICBpZiAocXVldWUuY29ubmVjdGlvbiAmJiBuZXdTdGF0ZS5tZW1iZXI/LmlkID09PSBuZXdTdGF0ZS5ndWlsZC5tZW1iZXJzLm1lPy5pZCkgcXVldWUuY2hhbm5lbCA9IG5ld1N0YXRlLmNoYW5uZWwhO1xuICAgICAgICAgICAgY29uc3QgZW1wdHlUaW1lb3V0ID0gcXVldWUudGltZW91dHMuZ2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApO1xuICAgICAgICAgICAgY29uc3QgY2hhbm5lbEVtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCk7XG4gICAgICAgICAgICBpZiAoIWNoYW5uZWxFbXB0eSAmJiBlbXB0eVRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZW1wdHlUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICBxdWV1ZS50aW1lb3V0cy5kZWxldGUoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICAgICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5jaGFubmVsUG9wdWxhdGUsIHF1ZXVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocXVldWUuY29ubmVjdGlvbiAmJiAhVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGxheWVyLm5vZGVzLmhhcyhxdWV1ZS5ndWlsZC5pZCkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5KSBxdWV1ZS5kZWxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5lbXB0eUNoYW5uZWwsIHF1ZXVlKTtcbiAgICAgICAgICAgICAgICB9LCBxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duIHx8IDApLnVucmVmKCk7XG4gICAgICAgICAgICAgICAgcXVldWUudGltZW91dHMuc2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWAsIHRpbWVvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG5ld1N0YXRlLmNoYW5uZWxJZCAhPT0gcXVldWUuY2hhbm5lbC5pZCkge1xuICAgICAgICAgICAgICAgIGlmICghVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCkpIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAocXVldWUudGltZW91dHMuaGFzKGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApKSByZXR1cm47XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYXllci5ub2Rlcy5oYXMocXVldWUuZ3VpbGQuaWQpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eSkgcXVldWUuZGVsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZW1wdHlDaGFubmVsLCBxdWV1ZSk7XG4gICAgICAgICAgICAgICAgfSwgcXVldWUub3B0aW9ucy5sZWF2ZU9uRW1wdHlDb29sZG93biB8fCAwKS51bnJlZigpO1xuICAgICAgICAgICAgICAgIHF1ZXVlLnRpbWVvdXRzLnNldChgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gLCB0aW1lb3V0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW1wdHlUaW1lb3V0ID0gcXVldWUudGltZW91dHMuZ2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNoYW5uZWxFbXB0eSAmJiBlbXB0eVRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGVtcHR5VGltZW91dCk7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLnRpbWVvdXRzLmRlbGV0ZShgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5jaGFubmVsUG9wdWxhdGUsIHF1ZXVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZSwgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB7IGluc3RhbmNlcyB9IGZyb20gJy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbmV4cG9ydCBjb25zdCBnZXRQbGF5ZXIgPSAoKSA9PiB7XG4gICAgcmV0dXJuIGluc3RhbmNlcy5maXJzdCgpIHx8IG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UXVldWUgPSA8VCA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSA9PiB7XG4gICAgY29uc3QgcGxheWVyID0gZ2V0UGxheWVyKCk7XG4gICAgaWYgKCFwbGF5ZXIpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIChwbGF5ZXIubm9kZXMucmVzb2x2ZShub2RlKSBhcyBHdWlsZFF1ZXVlPFQ+KSB8fCBudWxsO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBIb29rRGVjbGFyYXRpb25Db250ZXh0IHtcbiAgICBnZXRRdWV1ZTogdHlwZW9mIGdldFF1ZXVlO1xuICAgIGdldFBsYXllcjogdHlwZW9mIGdldFBsYXllcjtcbiAgICBpbnN0YW5jZXM6IHR5cGVvZiBpbnN0YW5jZXM7XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmV4cG9ydCB0eXBlIEhvb2tEZWNsYXJhdGlvbjxUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+ID0gKGNvbnRleHQ6IEhvb2tEZWNsYXJhdGlvbkNvbnRleHQpID0+IFQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIb29rPFQgZXh0ZW5kcyBIb29rRGVjbGFyYXRpb248KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+Pihob29rOiBUKTogUmV0dXJuVHlwZTxUPiB7XG4gICAgcmV0dXJuIGhvb2soe1xuICAgICAgICBnZXRRdWV1ZSxcbiAgICAgICAgZ2V0UGxheWVyLFxuICAgICAgICBpbnN0YW5jZXNcbiAgICB9KSBhcyBSZXR1cm5UeXBlPFQ+O1xufVxuXG4vKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbiIsICJpbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHsgZ2V0UXVldWUgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggZ3VpbGQgcXVldWUgaGlzdG9yeVxuICogQHBhcmFtIG5vZGUgZ3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VIaXN0b3J5PE1ldGEgPSB1bmtub3duPihub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IHF1ZXVlID0gZ2V0UXVldWU8TWV0YT4obm9kZSk7XG4gICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gcXVldWUuaGlzdG9yeTtcbn1cbiIsICJpbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHsgZ2V0UXVldWUgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggZ3VpbGQgcXVldWUgcGxheWVyIG5vZGVcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUGxheWVyPE1ldGEgPSB1bmtub3duPihub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IHF1ZXVlID0gZ2V0UXVldWU8TWV0YT4obm9kZSk7XG4gICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gcXVldWUubm9kZTtcbn1cbiIsICJpbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHsgZ2V0UXVldWUgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggZ3VpbGQgcXVldWVcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUXVldWU8TWV0YSA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZTxNZXRhPihub2RlKTtcbiAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBxdWV1ZTtcbn1cbiIsICJpbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBnZXRQbGF5ZXIgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggbWFpbiBwbGF5ZXIgaW5zdGFuY2VcbiAqIEBkZXByZWNhdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VNYXN0ZXJQbGF5ZXIoKSB7XG4gICAgVXRpbC53YXJuKCd1c2VNYXN0ZXJQbGF5ZXIoKSBob29rIGlzIGRlcHJlY2F0ZWQsIHVzZSB1c2VNYWluUGxheWVyKCkgaW5zdGVhZC4nLCAnRGVwcmVjYXRpb25XYXJuaW5nJyk7XG4gICAgcmV0dXJuIGdldFBsYXllcigpO1xufVxuXG4vKipcbiAqIEZldGNoIG1haW4gcGxheWVyIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VNYWluUGxheWVyKCkge1xuICAgIHJldHVybiBnZXRQbGF5ZXIoKTtcbn1cbiIsICJpbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBnZXRRdWV1ZSB9IGZyb20gJy4vY29tbW9uJztcblxudHlwZSBTZXR0ZXJGTjxULCBQPiA9IChwcmV2aW91czogUCkgPT4gVDtcblxuLyoqXG4gKiBGZXRjaCBvciBtYW5pcHVsYXRlIGd1aWxkIHF1ZXVlIG1ldGFkYXRhXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1ldGFkYXRhPFQgPSB1bmtub3duPihub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IHF1ZXVlID0gZ2V0UXVldWU8VD4obm9kZSk7XG4gICAgY29uc3Qgc2V0dGVyID0gKG1ldGFkYXRhOiBUIHwgU2V0dGVyRk48VCwgVD4pID0+IHtcbiAgICAgICAgaWYgKHF1ZXVlKSB7XG4gICAgICAgICAgICBpZiAoVHlwZVV0aWwuaXNGdW5jdGlvbihtZXRhZGF0YSkpIHJldHVybiBxdWV1ZS5zZXRNZXRhZGF0YShtZXRhZGF0YShxdWV1ZS5tZXRhZGF0YSkpO1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLnNldE1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBnZXR0ZXIgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBxdWV1ZT8ubWV0YWRhdGEgYXMgVDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFtnZXR0ZXIsIHNldHRlcl0gYXMgY29uc3Q7XG59XG4iLCAiaW1wb3J0IHsgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB7IGdldFF1ZXVlIH0gZnJvbSAnLi9jb21tb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVsaW5lRGlzcGF0Y2hlck9wdGlvbnMge1xuICAgIGlnbm9yZUZpbHRlcnM6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRmV0Y2ggb3IgbWFuaXB1bGF0ZSBjdXJyZW50IHRyYWNrXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRpbWVsaW5lIGRpc3BhdGNoZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVRpbWVsaW5lKG5vZGU6IE5vZGVSZXNvbHZhYmxlLCBvcHRpb25zPzogUGFydGlhbDxUaW1lbGluZURpc3BhdGNoZXJPcHRpb25zPikge1xuICAgIGNvbnN0IHF1ZXVlID0gZ2V0UXVldWUobm9kZSk7XG4gICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHtcbiAgICAgICAgZ2V0IHRpbWVzdGFtcCgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLmdldFRpbWVzdGFtcChvcHRpb25zPy5pZ25vcmVGaWx0ZXJzKSE7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCB2b2x1bWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUubm9kZS52b2x1bWU7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCBwYXVzZWQoKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUubm9kZS5pc1BhdXNlZCgpO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgdHJhY2soKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUuY3VycmVudFRyYWNrO1xuICAgICAgICB9LFxuICAgICAgICBwYXVzZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnBhdXNlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlc3VtZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnJlc3VtZSgpO1xuICAgICAgICB9LFxuICAgICAgICBzZXRWb2x1bWUodm9sOiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2wpO1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBzZXRQb3NpdGlvbih0aW1lOiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNlZWsodGltZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsICJpbXBvcnQgeyBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciB9IGZyb20gJy4uLy4uL21hbmFnZXInO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi8uLi91dGlscy9fX2ludGVybmFsX18nO1xuXG4vKipcbiAqIEdsb2JhbCBvbkFmdGVyQ3JlYXRlU3RyZWFtIGhhbmRsZXJcbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkFmdGVyQ3JlYXRlU3RyZWFtKGhhbmRsZXI6IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyKSB7XG4gICAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5zZXQoJ0Bbb25BZnRlckNyZWF0ZVN0cmVhbV0nLCBoYW5kbGVyKTtcbn1cbiIsICJpbXBvcnQgeyBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgfSBmcm9tICcuLi8uLi9tYW5hZ2VyJztcbmltcG9ydCB7IGdldEdsb2JhbFJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vdXRpbHMvX19pbnRlcm5hbF9fJztcblxuLyoqXG4gKiBHbG9iYWwgb25CZWZvcmVDcmVhdGVTdHJlYW0gaGFuZGxlclxuICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uQmVmb3JlQ3JlYXRlU3RyZWFtKGhhbmRsZXI6IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcikge1xuICAgIGdldEdsb2JhbFJlZ2lzdHJ5KCkuc2V0KCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScsIGhhbmRsZXIpO1xufVxuIiwgImltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB7IGdldFF1ZXVlIH0gZnJvbSAnLi9jb21tb24nO1xuXG50eXBlIFNldHRlckZOID0gKHByZXZpb3VzOiBudW1iZXIpID0+IG51bWJlcjtcblxuLyoqXG4gKiBGZXRjaCBvciBtYW5pcHVsYXRlIHBsYXllciB2b2x1bWVcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVm9sdW1lKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZShub2RlKTtcbiAgICBjb25zdCBzZXR0ZXIgPSAodm9sdW1lOiBudW1iZXIgfCBTZXR0ZXJGTikgPT4ge1xuICAgICAgICBpZiAocXVldWUpIHtcbiAgICAgICAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKHZvbHVtZSkpIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2x1bWUocXVldWUubm9kZS52b2x1bWUpKTtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2x1bWUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGdldHRlciA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHF1ZXVlPy5ub2RlLnZvbHVtZSBhcyBudW1iZXI7XG4gICAgfTtcblxuICAgIHJldHVybiBbZ2V0dGVyLCBzZXR0ZXJdIGFzIGNvbnN0O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkFBQUE7QUFBQSxFQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQUFDLGtCQUFzQzs7O0FDRXRDLG1CQUE2Qjs7O0FDQTdCLHNCQUEyQjs7O0FDR3BCLElBQU0sV0FBTixNQUFlO0FBQUEsRUFxQmxCLFlBQVksUUFBZ0IsTUFBd0I7QUFPaEQsU0FBSyxTQUFTO0FBT2QsU0FBSyxTQUFTLEtBQUssVUFBVSxDQUFDO0FBTzlCLFNBQUssU0FBUyxLQUFLO0FBT25CLFNBQUssY0FBYyxLQUFLO0FBT3hCLFNBQUssWUFBWSxLQUFLO0FBU3RCLFNBQUssT0FBTyxLQUFLO0FBV2pCLFNBQUssU0FBUyxLQUFLO0FBT25CLFNBQUssS0FBSyxLQUFLO0FBT2YsU0FBSyxNQUFNLEtBQUs7QUFNaEIsU0FBSyxRQUFRLEtBQUs7QUFBQSxFQU90QjtBQUFBLEVBRUEsRUFBRSxPQUFPLFlBQVk7QUFDakIsV0FBTyxLQUFLO0FBQUEsRUFDaEI7QUFBQSxFQUtBLElBQVcsb0JBQW9CO0FBQzNCLFdBQU8sS0FBSyxPQUFPLE9BQU8sQ0FBQyxHQUFHLE1B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LFVBQVUsTUFBc0I7QUFDNUMsUUFBTSxRQUFRLFNBQVMsSUFBSTtBQUMzQixRQUFNLFNBQVMsd0JBQUMsV0FBOEI7QUFDMUMsUUFBSSxPQUFPO0FBQ1AsVUFBSSxTQUFTLFdBQVcsTUFBTTtBQUFHLGVBQU8sTUFBTSxLQUFLLFVBQVUsT0FBTyxNQUFNLEtBQUssTUFBTSxDQUFDO0FBQ3RGLGFBQU8sTUFBTSxLQUFLLFVBQVUsTUFBTTtBQUFBLElBQ3RDO0FBQUEsRUFDSixHQUxlO0FBT2YsUUFBTSxTQUFTLDZCQUFNO0FBQ2pCLFdBQU8sT0FBTyxLQUFLO0FBQUEsRUFDdkIsR0FGZTtBQUlmLFNBQU8sQ0FBQyxRQUFRLE1BQU07QUFDMUI7QUFkZ0I7OztBekNVaEIsSUFBQUMsb0JBV087QUFDUCxJQUFBQyxnQkFBOEU7QUFHdkUsSUFBTSxVQUFrQjtBQUUvQixJQUFJLENBQUMsZ0JBQUFDLFFBQVcsV0FBVyxJQUFJLEdBQUc7QUFDOUIsVUFBUSxZQUFZLGVBQWUsZ0JBQUFBLGdEQUFtRCwyQ0FBMkM7QUFDckk7IiwKICAibmFtZXMiOiBbIkd1aWxkUXVldWUiLCAiaW1wb3J0X2Rpc2NvcmQiLCAiUGxheWVyRXZlbnQiLCAiUXVldWVSZXBlYXRNb2RlIiwgInRhcmdldCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9kaXNjb3JkIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfdm9pY2UiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF92b2ljZSIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X3ZvaWNlIiwgImltcG9ydF9wcm9taXNlcyIsICJpbXBvcnRfZGlzY29yZCIsICJ3YWl0Rm9yIiwgImltcG9ydF9lcXVhbGl6ZXIiLCAicHJpc20iLCAiR3VpbGRRdWV1ZSIsICJ0YXJnZXQiLCAiaW1wb3J0X3V0aWxzIiwgIkd1aWxkUXVldWUiLCAiaW1wb3J0X3ZvaWNlIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZmZtcGVnIiwgImltcG9ydF9kaXNjb3JkIiwgImltcG9ydF92b2ljZSIsICJpbXBvcnRfZGlzY29yZCIsICJoYW5kbGVyIiwgInJlcyIsICJyZXN1bHQiLCAiZFZvaWNlVmVyc2lvbiIsICJkanNWZXJzaW9uIiwgImhhbmRsZXIiLCAiaGFuZGxlciIsICJpbXBvcnRfZXF1YWxpemVyIiwgImltcG9ydF92b2ljZSIsICJkanNWZXJzaW9uIl0KfQo=