superagent 10.3.0 → 10.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/node/index.js CHANGED
@@ -6,13 +6,13 @@
6
6
 
7
7
  const {
8
8
  format
9
- } = require('url');
10
- const Stream = require('stream');
11
- const https = require('https');
12
- const http = require('http');
13
- const fs = require('fs');
14
- const zlib = require('zlib');
15
- const util = require('util');
9
+ } = require('node:url');
10
+ const Stream = require('node:stream');
11
+ const https = require('node:https');
12
+ const http = require('node:http');
13
+ const fs = require('node:fs');
14
+ const zlib = require('node:zlib');
15
+ const util = require('node:util');
16
16
  const qs = require('qs');
17
17
  const mime = require('mime');
18
18
  let methods = require('methods');
@@ -70,6 +70,143 @@ exports.agent = require('./agent');
70
70
 
71
71
  function noop() {}
72
72
 
73
+ /**
74
+ * Close an underlying Node request/session created during setup.
75
+ *
76
+ * Used when header application or later request-path work throws after
77
+ * `http.request()` / `http2.connect()` has already allocated a socket.
78
+ *
79
+ * @param {Request} request_
80
+ * @api private
81
+ */
82
+ function disposeNodeRequest(request_) {
83
+ const {
84
+ req
85
+ } = request_;
86
+ if (!req || request_._requestDisposed) {
87
+ return;
88
+ }
89
+ request_._requestDisposed = true;
90
+ if (request_._streamResponseListener) {
91
+ req.removeListener('response', request_._streamResponseListener);
92
+ request_._streamResponseListener = undefined;
93
+ request_._streamResponse = undefined;
94
+ }
95
+ try {
96
+ // HTTP/2 wrapper keeps a session open as soon as request() is called.
97
+ // Prefer destroying that session so we never call abort() → getFrame()
98
+ // with invalid headers (which would emit a late protocol error).
99
+ if (req.session && typeof req.session.destroy === 'function') {
100
+ req.session.destroy();
101
+ }
102
+ if (req.socket && typeof req.socket.destroy === 'function') {
103
+ req.socket.destroy();
104
+ }
105
+ if (typeof req.destroy === 'function') {
106
+ req.destroy();
107
+ return;
108
+ }
109
+ if (typeof req.abort === 'function') {
110
+ req.abort();
111
+ return;
112
+ }
113
+ if (typeof req.end === 'function') {
114
+ req.end();
115
+ }
116
+ } catch (err) {
117
+ debug('error disposing request after setup failure', err);
118
+ }
119
+ }
120
+
121
+ /**
122
+ * Preserve dot-only path segments that WHATWG URL normalizes away.
123
+ *
124
+ * @param {String} urlString
125
+ * @returns {{urlString: String, restorePath: Function}}
126
+ * @api private
127
+ */
128
+ function preserveDotSegments(urlString) {
129
+ const parts = urlString.match(/^([a-z][a-z\d+.-]*:\/\/[^/?#]*)([^?#]*)(.*)$/i);
130
+ if (!parts) {
131
+ return {
132
+ urlString,
133
+ restorePath(path) {
134
+ return path;
135
+ }
136
+ };
137
+ }
138
+ const segments = [];
139
+ const prefix = '__superagent_dot_segment_';
140
+ const path = parts[2].replace(/\/((?:\.|%2e){1,2})(?=\/|$)/gi, (_, segment) => {
141
+ const marker = `${prefix}${segments.length}__`;
142
+ segments.push(segment);
143
+ return `/${marker}`;
144
+ });
145
+ return {
146
+ urlString: `${parts[1]}${path}${parts[3]}`,
147
+ restorePath(requestPath) {
148
+ let restoredPath = requestPath;
149
+ for (const [index, segment] of segments.entries()) {
150
+ restoredPath = restoredPath.replace(`${prefix}${index}__`, segment);
151
+ }
152
+ return restoredPath;
153
+ }
154
+ };
155
+ }
156
+
157
+ /**
158
+ * Default a scheme-less URL string to http://.
159
+ *
160
+ * @param {String} urlString
161
+ * @return {String}
162
+ * @api private
163
+ */
164
+ function withDefaultProtocol(urlString) {
165
+ return urlString.indexOf('http') === 0 ? urlString : `http://${urlString}`;
166
+ }
167
+
168
+ /**
169
+ * Protocols a redirect may lead to. A request made over a Unix domain socket
170
+ * may additionally be redirected within that same socket (see
171
+ * `isAllowedRedirectTarget`).
172
+ */
173
+ const REDIRECT_PROTOCOLS = new Set(['http:', 'https:']);
174
+ const UNIX_SOCKET_PROTOCOLS = new Set(['http+unix:', 'https+unix:']);
175
+
176
+ /**
177
+ * Whether a redirect from `current` to `target` may be followed.
178
+ *
179
+ * Only http(s) targets are followed. A remote server must never be able to
180
+ * steer the client into a local Unix domain socket (`http+unix://`) or any
181
+ * other scheme through a Location header; a request that was itself made over
182
+ * a Unix domain socket may only be redirected within that same socket.
183
+ *
184
+ * @param {URL} current
185
+ * @param {URL} target
186
+ * @return {Boolean}
187
+ * @api private
188
+ */
189
+ function isAllowedRedirectTarget(current, target) {
190
+ if (REDIRECT_PROTOCOLS.has(target.protocol)) return true;
191
+ return UNIX_SOCKET_PROTOCOLS.has(target.protocol) && target.protocol === current.protocol && target.hostname !== '' && target.hostname === current.hostname;
192
+ }
193
+
194
+ /**
195
+ * Whether two URLs share an origin. Unix socket URLs have an opaque (`null`)
196
+ * WHATWG origin, so they are compared by protocol and socket path instead.
197
+ *
198
+ * @param {URL} current
199
+ * @param {URL} target
200
+ * @return {Boolean}
201
+ * @api private
202
+ */
203
+ function isSameOrigin(current, target) {
204
+ if (current.origin !== 'null' && target.origin !== 'null') {
205
+ return current.origin === target.origin;
206
+ }
207
+ return current.protocol === target.protocol && current.hostname === target.hostname && current.port === target.port;
208
+ }
209
+
73
210
  /**
74
211
  * Expose `Response`.
75
212
  */
@@ -104,13 +241,15 @@ exports.protocols = {
104
241
  */
105
242
 
106
243
  exports.serialize = {
107
- 'application/x-www-form-urlencoded': obj => {
108
- return qs.stringify(obj, {
244
+ 'application/x-www-form-urlencoded'(object) {
245
+ return qs.stringify(object, {
109
246
  indices: false,
110
247
  strictNullHandling: true
111
248
  });
112
249
  },
113
- 'application/json': safeStringify
250
+ 'application/json': safeStringify,
251
+ // CSP reports carry JSON bodies but use a distinct registered media type.
252
+ 'application/csp-report': safeStringify
114
253
  };
115
254
 
116
255
  /**
@@ -124,6 +263,19 @@ exports.serialize = {
124
263
 
125
264
  exports.parse = require('./parsers');
126
265
 
266
+ /**
267
+ * The default parsers as shipped; they only accumulate a buffered body, so
268
+ * they are skipped for unbuffered responses (see `_end`). Captured here so
269
+ * that a parser a user installs under the same key is still honoured.
270
+ */
271
+ const BUILT_IN_PARSERS = {
272
+ 'application/x-www-form-urlencoded': exports.parse['application/x-www-form-urlencoded'],
273
+ 'application/json': exports.parse['application/json'],
274
+ text: exports.parse.text,
275
+ image: exports.parse.image
276
+ };
277
+ const BUFFERING_PARSERS = new Set(Object.keys(BUILT_IN_PARSERS).map(key => BUILT_IN_PARSERS[key]));
278
+
127
279
  /**
128
280
  * Default buffering map. Can be used to set certain
129
281
  * response types to buffer/not buffer.
@@ -299,6 +451,9 @@ Request.prototype._getFormData = function () {
299
451
  */
300
452
 
301
453
  Request.prototype.agent = function (agent) {
454
+ if (arguments.length > 0 && agent && typeof agent === 'object' && typeof agent.addRequest !== 'function') {
455
+ throw new TypeError('.agent() expects an http(s).Agent-compatible object. Did you mean to use .cert() and .key()?');
456
+ }
302
457
  if (arguments.length === 0) return this._agent;
303
458
  this._agent = agent;
304
459
  return this;
@@ -407,6 +562,10 @@ Request.prototype.write = function (data, encoding) {
407
562
  const request_ = this.request();
408
563
  if (!this._streamRequest) {
409
564
  this._streamRequest = true;
565
+ this._streamResponseListener = res => {
566
+ this._streamResponse = res;
567
+ };
568
+ request_.once('response', this._streamResponseListener);
410
569
  }
411
570
  return request_.write(data, encoding);
412
571
  };
@@ -436,7 +595,7 @@ Request.prototype._pipeContinue = function (stream, options) {
436
595
  this._emitResponse();
437
596
  if (this._aborted) return;
438
597
  if (this._shouldDecompress(res)) {
439
- let decompresser = chooseDecompresser(res);
598
+ const decompresser = chooseDecompresser(res);
440
599
  decompresser.on('error', error => {
441
600
  if (error && error.code === 'Z_BUF_ERROR') {
442
601
  // unexpected end of file is ignored by browsers and curl
@@ -484,14 +643,39 @@ Request.prototype._redirect = function (res) {
484
643
  }
485
644
  debug('redirect %s -> %s', this.url, url);
486
645
 
487
- // location
488
- url = new URL(url, this.url).href;
489
-
490
646
  // ensure the response is being consumed
491
647
  // this is required for Node v0.10+
492
648
  res.resume();
649
+
650
+ // location
651
+ //
652
+ // The Location header is attacker controlled: a malformed value must not
653
+ // throw out of the response event (which would crash the process), and only
654
+ // http(s) targets may be followed. A remote server must never be able to
655
+ // steer the client into a local Unix domain socket or another scheme.
656
+ let target;
657
+ let current;
658
+ try {
659
+ current = new URL(withDefaultProtocol(this.url));
660
+ target = new URL(url, current);
661
+ } catch (err) {
662
+ const error = new Error(`Invalid redirect location: ${url}`);
663
+ error.code = 'EINVALIDREDIRECT';
664
+ error.status = res.statusCode;
665
+ error.location = url;
666
+ return this.callback(error, res);
667
+ }
668
+ if (!isAllowedRedirectTarget(current, target)) {
669
+ const error = new Error(`Unsupported protocol in redirect location: ${target.href}`);
670
+ error.code = 'EUNSUPPORTEDREDIRECT';
671
+ error.status = res.statusCode;
672
+ error.location = url;
673
+ return this.callback(error, res);
674
+ }
675
+ url = target.href;
676
+ this._emitPreRedirect(res);
493
677
  let headers = this.req.getHeaders ? this.req.getHeaders() : this.req._headers;
494
- const changesOrigin = new URL(url).host !== new URL(this.url).host;
678
+ const changesOrigin = !isSameOrigin(current, target);
495
679
 
496
680
  // implementation of 302 following defacto standard
497
681
  if (res.statusCode === 301 || res.statusCode === 302) {
@@ -521,6 +705,18 @@ Request.prototype._redirect = function (res) {
521
705
 
522
706
  // 307 preserves method
523
707
  // 308 preserves method
708
+ if ((res.statusCode === 307 || res.statusCode === 308) && changesOrigin) {
709
+ delete headers.authorization;
710
+ delete headers.cookie;
711
+ }
712
+
713
+ // credentials given with `.auth(user, pass, { type: 'auto' })` are turned
714
+ // into an Authorization header by every `request()` call, so they must be
715
+ // dropped as well or they would be re-sent to the new origin
716
+ if (changesOrigin) {
717
+ this.username = undefined;
718
+ this.password = undefined;
719
+ }
524
720
  delete headers.host;
525
721
  delete this.req;
526
722
  delete this._formData;
@@ -668,23 +864,22 @@ Request.prototype.request = function () {
668
864
  } catch (err) {
669
865
  return this.emit('error', err);
670
866
  }
671
- let {
672
- url: urlString
673
- } = this;
867
+ const urlString = withDefaultProtocol(this.url);
674
868
  const retries = this._retries;
675
-
676
- // default to http://
677
- if (urlString.indexOf('http') !== 0) urlString = `http://${urlString}`;
678
- const url = new URL(urlString);
869
+ const protectedUrl = preserveDotSegments(urlString);
870
+ const url = new URL(protectedUrl.urlString);
679
871
  let {
680
872
  protocol
681
873
  } = url;
682
- let path = `${url.pathname}${url.search}`;
874
+ const path = protectedUrl.restorePath(`${url.pathname}${url.search}`);
683
875
 
684
876
  // support unix sockets
685
877
  if (/^https?\+unix:/.test(protocol) === true) {
686
878
  // get the protocol
687
879
  protocol = `${protocol.split('+')[0]}:`;
880
+ if (!url.hostname) {
881
+ throw new Error('Invalid unix socket URL: percent-encode the socket path by replacing "/" with "%2F".');
882
+ }
688
883
 
689
884
  // get the socket path
690
885
  options.socketPath = url.hostname.replace(/%2F/g, '/');
@@ -697,7 +892,9 @@ Request.prototype.request = function () {
697
892
  const {
698
893
  hostname
699
894
  } = url;
700
- const match = hostname in this._connectOverride ? this._connectOverride[hostname] : this._connectOverride['*'];
895
+ // the hostname may come from a redirect, so never let an inherited key
896
+ // such as "constructor" act as an override entry
897
+ const match = hasOwn(this._connectOverride, hostname) ? this._connectOverride[hostname] : this._connectOverride['*'];
701
898
  if (match) {
702
899
  // backup the real host
703
900
  if (!this._header.host) {
@@ -728,6 +925,15 @@ Request.prototype.request = function () {
728
925
  options.port = url.port;
729
926
  options.path = path;
730
927
  options.host = utils.normalizeHostname(url.hostname); // ex: [::1] -> ::1
928
+ // Apply user headers before connecting so invalid values (e.g. undefined)
929
+ // throw without allocating a TCP handle. See #1827.
930
+ // HTTP/2's wrapper forwards leftover options to http2.connect(), so only
931
+ // do this on HTTP/1.
932
+ if (!this._enableHttp2) {
933
+ options.headers = {
934
+ ...this.header
935
+ };
936
+ }
731
937
  options.ca = this._ca;
732
938
  options.key = this._key;
733
939
  options.pfx = this._pfx;
@@ -754,23 +960,13 @@ Request.prototype.request = function () {
754
960
  req
755
961
  } = this;
756
962
 
757
- // set tcp no delay
758
- req.setNoDelay(true);
759
- if (options.method !== 'HEAD') {
760
- req.setHeader('Accept-Encoding', 'gzip, deflate');
761
- }
762
- this.protocol = protocol;
763
- this.host = url.host;
764
-
765
- // expose events
766
- req.once('drain', () => {
767
- this.emit('drain');
768
- });
963
+ // Attach this before header setup so destroy() during a setup exception
964
+ // cannot emit an unhandled 'error' (or a second callback).
769
965
  req.on('error', error => {
770
966
  // flag abortion here for out timeouts
771
967
  // because node will emit a faux-error "socket hang up"
772
968
  // when request is aborted before a connection is made
773
- if (this._aborted) return;
969
+ if (this._aborted || this._requestDisposed) return;
774
970
  // if not the same, we are in the **old** (cancelled) request,
775
971
  // so need to continue (same as for above)
776
972
  if (this._retries !== retries) return;
@@ -779,31 +975,76 @@ Request.prototype.request = function () {
779
975
  if (this.response) return;
780
976
  this.callback(error);
781
977
  });
978
+ try {
979
+ // set tcp no delay
980
+ req.setNoDelay(true);
981
+ if (options.method !== 'HEAD') {
982
+ req.setHeader('Accept-Encoding', 'gzip, deflate');
983
+ }
984
+ this.protocol = protocol;
985
+ this.host = url.host;
782
986
 
783
- // auth
784
- if (url.username || url.password) {
785
- this.auth(url.username, url.password);
786
- }
787
- if (this.username && this.password) {
788
- this.auth(this.username, this.password);
789
- }
790
- for (const key in this.header) {
791
- if (hasOwn(this.header, key)) req.setHeader(key, this.header[key]);
792
- }
987
+ // expose events
988
+ const emitDrain = () => {
989
+ this.emit('drain');
990
+ };
991
+ req.on('drain', emitDrain);
992
+ req.once('close', () => {
993
+ req.removeListener('drain', emitDrain);
994
+ });
793
995
 
794
- // add cookies
795
- if (this.cookies) {
796
- if (hasOwn(this._header, 'cookie')) {
797
- // merge
798
- const temporaryJar = new CookieJar.CookieJar();
799
- temporaryJar.setCookies(this._header.cookie.split('; '));
800
- temporaryJar.setCookies(this.cookies.split('; '));
801
- req.setHeader('Cookie', temporaryJar.getCookies(CookieJar.CookieAccessInfo.All).toValueString());
802
- } else {
803
- req.setHeader('Cookie', this.cookies);
996
+ // auth
997
+ if (url.username || url.password) {
998
+ this.auth(url.username, url.password);
999
+ }
1000
+ if (this.username && this.password) {
1001
+ this.auth(this.username, this.password);
1002
+ }
1003
+ for (const key in this.header) {
1004
+ if (hasOwn(this.header, key)) req.setHeader(key, this.header[key]);
1005
+ }
1006
+
1007
+ // add cookies
1008
+ if (this.cookies) {
1009
+ if (hasOwn(this._header, 'cookie')) {
1010
+ // merge
1011
+ const temporaryJar = new CookieJar.CookieJar();
1012
+ temporaryJar.setCookies(this._header.cookie.split('; '));
1013
+ temporaryJar.setCookies(this.cookies.split('; '));
1014
+ req.setHeader('Cookie', temporaryJar.getCookies(CookieJar.CookieAccessInfo.All).toValueString());
1015
+ } else {
1016
+ req.setHeader('Cookie', this.cookies);
1017
+ }
804
1018
  }
1019
+ return req;
1020
+ } catch (err) {
1021
+ disposeNodeRequest(this);
1022
+ throw err;
805
1023
  }
806
- return req;
1024
+ };
1025
+
1026
+ /**
1027
+ * Abort/end the Node request if it was created.
1028
+ *
1029
+ * @api private
1030
+ */
1031
+ Request.prototype._disposeRequest = function () {
1032
+ disposeNodeRequest(this);
1033
+ };
1034
+
1035
+ /**
1036
+ * Report a setup/request-path error without leaving the socket open.
1037
+ *
1038
+ * @param {Error} error
1039
+ * @api private
1040
+ */
1041
+ Request.prototype._failRequest = function (error) {
1042
+ this._disposeRequest();
1043
+ if (typeof this._callback === 'function' && this._callback !== noop) {
1044
+ this.callback(error);
1045
+ return;
1046
+ }
1047
+ throw error;
807
1048
  };
808
1049
 
809
1050
  /**
@@ -823,7 +1064,10 @@ Request.prototype.callback = function (error, res) {
823
1064
  // Avoid the error which is emitted from 'socket hang up' to cause the fn undefined error on JS runtime.
824
1065
  const fn = this._callback || noop;
825
1066
  this.clearTimeout();
826
- if (this.called) return console.warn('superagent: double callback bug');
1067
+ if (this.called) {
1068
+ if (this.timedout) return;
1069
+ return console.warn('superagent: double callback bug');
1070
+ }
827
1071
  this.called = true;
828
1072
  if (!error) {
829
1073
  try {
@@ -905,8 +1149,32 @@ Request.prototype._emitRedirect = function () {
905
1149
  response.redirects = this._redirectList;
906
1150
  this.emit('redirect', response);
907
1151
  };
1152
+
1153
+ /**
1154
+ * Emit a redirect response before the request URL is changed.
1155
+ *
1156
+ * @param {IncomingMessage} res
1157
+ * @api private
1158
+ */
1159
+
1160
+ Request.prototype._emitPreRedirect = function (res) {
1161
+ this.res = res;
1162
+ const response = new Response(this);
1163
+ response.redirects = this._redirectList;
1164
+ this.emit('pre-redirect', response);
1165
+ };
908
1166
  Request.prototype.end = function (fn) {
909
- this.request();
1167
+ try {
1168
+ this.request();
1169
+ } catch (err) {
1170
+ this._endCalled = true;
1171
+ if (typeof fn === 'function') {
1172
+ this._callback = fn;
1173
+ this.callback(err);
1174
+ return;
1175
+ }
1176
+ throw err;
1177
+ }
910
1178
  debug('%s %s', this.method, this.url);
911
1179
  if (this._endCalled) {
912
1180
  throw new Error('.end() was called twice. This is not supported in superagent');
@@ -930,27 +1198,38 @@ Request.prototype._end = function () {
930
1198
 
931
1199
  // body
932
1200
  if (method !== 'HEAD' && !req._headerSent) {
933
- // serialize stuff
934
- if (typeof data !== 'string') {
935
- let contentType = req.getHeader('Content-Type');
936
- // Parse out just the content type from the header (ignore the charset)
937
- if (contentType) contentType = contentType.split(';')[0];
938
- let serialize = this._serializer || exports.serialize[contentType];
939
- if (!serialize && isJSON(contentType)) {
940
- serialize = exports.serialize['application/json'];
1201
+ try {
1202
+ // serialize stuff
1203
+ if (typeof data !== 'string') {
1204
+ let contentType = req.getHeader('Content-Type');
1205
+ // Parse out just the content type from the header (ignore the charset)
1206
+ if (contentType) contentType = contentType.split(';')[0];
1207
+ let serialize = this._serializer || (hasOwn(exports.serialize, contentType) ? exports.serialize[contentType] : undefined);
1208
+ if (!serialize && isJSON(contentType)) {
1209
+ serialize = exports.serialize['application/json'];
1210
+ }
1211
+ if (serialize) data = serialize(data);
941
1212
  }
942
- if (serialize) data = serialize(data);
943
- }
944
1213
 
945
- // content-length
946
- if (data && !req.getHeader('Content-Length')) {
947
- req.setHeader('Content-Length', Buffer.isBuffer(data) ? data.length : Buffer.byteLength(data));
1214
+ // content-length
1215
+ if (data && !req.getHeader('Content-Length')) {
1216
+ req.setHeader('Content-Length', Buffer.isBuffer(data) ? data.length : Buffer.byteLength(data));
1217
+ }
1218
+ } catch (err) {
1219
+ return this._failRequest(err);
948
1220
  }
949
1221
  }
1222
+ let streamResponse;
1223
+ if (this._streamResponseListener) {
1224
+ req.removeListener('response', this._streamResponseListener);
1225
+ this._streamResponseListener = undefined;
1226
+ streamResponse = this._streamResponse;
1227
+ this._streamResponse = undefined;
1228
+ }
950
1229
 
951
1230
  // response
952
1231
  // eslint-disable-next-line complexity
953
- req.once('response', res => {
1232
+ const handleResponse = res => {
954
1233
  debug('%s %s -> %s', this.method, this.url, res.statusCode);
955
1234
  if (this._responseTimeoutTimer) {
956
1235
  clearTimeout(this._responseTimeoutTimer);
@@ -978,11 +1257,12 @@ Request.prototype._end = function () {
978
1257
  }
979
1258
 
980
1259
  // zlib support
1260
+ let decompresser = null;
981
1261
  if (this._shouldDecompress(res)) {
982
- decompress(req, res);
1262
+ decompresser = decompress(req, res);
983
1263
  }
984
1264
  let buffer = this._buffer;
985
- if (buffer === undefined && mime in exports.buffer) {
1265
+ if (buffer === undefined && hasOwn(exports.buffer, mime)) {
986
1266
  buffer = Boolean(exports.buffer[mime]);
987
1267
  }
988
1268
  let parser = this._parser;
@@ -1019,6 +1299,7 @@ Request.prototype._end = function () {
1019
1299
  const flattenedFields = {};
1020
1300
  if (fields) {
1021
1301
  for (const key in fields) {
1302
+ if (!Object.prototype.hasOwnProperty.call(fields, key)) continue;
1022
1303
  const value = fields[key];
1023
1304
  flattenedFields[key] = Array.isArray(value) && value.length === 1 ? value[0] : value;
1024
1305
  }
@@ -1026,6 +1307,7 @@ Request.prototype._end = function () {
1026
1307
  const flattenedFiles = {};
1027
1308
  if (files) {
1028
1309
  for (const key in files) {
1310
+ if (!Object.prototype.hasOwnProperty.call(files, key)) continue;
1029
1311
  const value = files[key];
1030
1312
  flattenedFiles[key] = Array.isArray(value) && value.length === 1 ? value[0] : value;
1031
1313
  }
@@ -1038,8 +1320,10 @@ Request.prototype._end = function () {
1038
1320
  buffer = true;
1039
1321
  } else if (isBinary(mime)) {
1040
1322
  parser = exports.parse.image;
1041
- buffer = true; // For backwards-compatibility buffering default is ad-hoc MIME-dependent
1042
- } else if (exports.parse[mime]) {
1323
+ buffer = buffer !== false; // For backwards-compatibility buffering default is ad-hoc MIME-dependent
1324
+ } else if (hasOwn(exports.parse, mime)) {
1325
+ // `mime` is attacker controlled; an inherited key such as
1326
+ // "constructor" must not resolve to a parser
1043
1327
  parser = exports.parse[mime];
1044
1328
  } else if (type === 'text') {
1045
1329
  parser = exports.parse.text;
@@ -1063,32 +1347,55 @@ Request.prototype._end = function () {
1063
1347
  this._resBuffered = buffer;
1064
1348
  let parserHandlesEnd = false;
1065
1349
  if (buffer) {
1066
- // Protectiona against zip bombs and other nuisance
1350
+ // Protection against zip bombs and other nuisance
1067
1351
  let responseBytesLeft = this._maxResponseSize || 200000000;
1352
+ let exceeded = false;
1068
1353
  res.on('data', buf => {
1069
- responseBytesLeft -= buf.byteLength || buf.length > 0 ? buf.length : 0;
1354
+ if (exceeded) return;
1355
+ // Parsers may have called `setEncoding()`, in which case chunks are
1356
+ // strings: count their encoded size rather than their UTF-16 length
1357
+ responseBytesLeft -= Buffer.isBuffer(buf) ? buf.length : Buffer.byteLength(String(buf));
1070
1358
  if (responseBytesLeft < 0) {
1071
- // This will propagate through error event
1359
+ exceeded = true;
1072
1360
  const error = new Error('Maximum response size reached');
1073
1361
  error.code = 'ETOOLARGE';
1074
1362
  // Parsers aren't required to observe error event,
1075
1363
  // so would incorrectly report success
1076
1364
  parserHandlesEnd = false;
1077
- // Will not emit error event
1078
- res.destroy(error);
1079
- // so we do callback now
1365
+ // A decompression bomb keeps inflating (and emitting) long after
1366
+ // the compressed input was consumed; stop it here so the limit
1367
+ // also bounds CPU and avoids a flood of late callbacks.
1368
+ if (decompresser) decompresser.destroy();
1369
+ // Destroy without an error: IncomingMessage.destroy(err) emits
1370
+ // 'error', and the parser may also fail, each of which would
1371
+ // call callback() again ("superagent: double callback bug").
1372
+ res.destroy();
1080
1373
  this.callback(error, null);
1081
1374
  }
1082
1375
  });
1083
1376
  }
1377
+ if (parser && !buffer && BUFFERING_PARSERS.has(parser)) {
1378
+ // The built-in parsers exist only to accumulate the body. When the
1379
+ // response is not buffered (`.buffer(false)`, or an unbuffered default
1380
+ // such as application/octet-stream) they would still collect the entire
1381
+ // stream in memory, without any size limit, while the response has
1382
+ // already been handed out to the caller. Keep only the encoding they
1383
+ // would have applied so `res.on('data')` consumers see the same chunks.
1384
+ if (parser === BUILT_IN_PARSERS['application/x-www-form-urlencoded']) {
1385
+ res.setEncoding('ascii');
1386
+ } else if (parser !== BUILT_IN_PARSERS.image) {
1387
+ res.setEncoding('utf8');
1388
+ }
1389
+ parser = null;
1390
+ }
1084
1391
  if (parser) {
1085
1392
  try {
1086
1393
  // Unbuffered parsers are supposed to emit response early,
1087
1394
  // which is weird BTW, because response.body won't be there.
1088
1395
  parserHandlesEnd = buffer;
1089
1396
  parser(res, (error, object, files) => {
1090
- if (this.timedout) {
1091
- // Timeout has already handled all callbacks
1397
+ if (this.timedout || this.called) {
1398
+ // Timeout or maxResponseSize has already handled all callbacks
1092
1399
  return;
1093
1400
  }
1094
1401
 
@@ -1120,19 +1427,40 @@ Request.prototype._end = function () {
1120
1427
  });
1121
1428
  return;
1122
1429
  }
1430
+ const completeAbortedResponse = () => {
1431
+ if (!this._aborted) {
1432
+ return false;
1433
+ }
1434
+ parserHandlesEnd = false;
1435
+ if (!this.called) {
1436
+ this.emit('end');
1437
+ const response = this._emitResponse();
1438
+ response.on('error', noop);
1439
+ this.callback(null, response);
1440
+ }
1441
+ return true;
1442
+ };
1123
1443
 
1124
1444
  // terminating events
1125
1445
  res.once('error', error => {
1446
+ if (completeAbortedResponse()) return;
1126
1447
  parserHandlesEnd = false;
1127
1448
  this.callback(error, null);
1128
1449
  });
1450
+ res.once('aborted', completeAbortedResponse);
1451
+ res.once('close', completeAbortedResponse);
1129
1452
  if (!parserHandlesEnd) res.once('end', () => {
1130
1453
  debug('end %s %s', this.method, this.url);
1131
1454
  // TODO: unless buffering emit earlier to stream
1132
1455
  this.emit('end');
1133
1456
  this.callback(null, this._emitResponse());
1134
1457
  });
1135
- });
1458
+ };
1459
+ if (streamResponse) {
1460
+ process.nextTick(handleResponse, streamResponse);
1461
+ } else {
1462
+ req.once('response', handleResponse);
1463
+ }
1136
1464
  this.emit('request', this);
1137
1465
  const getProgressMonitor = () => {
1138
1466
  const lengthComputable = true;
@@ -1169,33 +1497,40 @@ Request.prototype._end = function () {
1169
1497
 
1170
1498
  return chunking;
1171
1499
  };
1172
-
1173
- // if a FormData instance got created, then we send that as the request body
1174
- const formData = this._formData;
1175
- if (formData) {
1176
- // set headers
1177
- const headers = formData.getHeaders();
1178
- for (const i in headers) {
1179
- if (hasOwn(headers, i)) {
1180
- debug('setting FormData header: "%s: %s"', i, headers[i]);
1181
- req.setHeader(i, headers[i]);
1500
+ try {
1501
+ // if a FormData instance got created, then we send that as the request body
1502
+ const formData = this._formData;
1503
+ if (formData) {
1504
+ // set headers
1505
+ const headers = formData.getHeaders();
1506
+ for (const i in headers) {
1507
+ if (hasOwn(headers, i)) {
1508
+ debug('setting FormData header: "%s: %s"', i, headers[i]);
1509
+ req.setHeader(i, headers[i]);
1510
+ }
1182
1511
  }
1183
- }
1184
1512
 
1185
- // attempt to get "Content-Length" header
1186
- formData.getLength((error, length) => {
1187
- // TODO: Add chunked encoding when no length (if err)
1188
- if (error) debug('formData.getLength had error', error, length);
1189
- debug('got FormData Content-Length: %s', length);
1190
- if (typeof length === 'number') {
1191
- req.setHeader('Content-Length', length);
1192
- }
1193
- formData.pipe(getProgressMonitor()).pipe(req);
1194
- });
1195
- } else if (Buffer.isBuffer(data)) {
1196
- bufferToChunks(data).pipe(getProgressMonitor()).pipe(req);
1197
- } else {
1198
- req.end(data);
1513
+ // attempt to get "Content-Length" header
1514
+ formData.getLength((error, length) => {
1515
+ // Unknown stream lengths can use chunked encoding, but filesystem
1516
+ // errors must fail before a partial multipart request is sent.
1517
+ if (error && error !== 'Unknown stream') {
1518
+ this._failRequest(error);
1519
+ return;
1520
+ }
1521
+ debug('got FormData Content-Length: %s', length);
1522
+ if (typeof length === 'number') {
1523
+ req.setHeader('Content-Length', length);
1524
+ }
1525
+ formData.pipe(getProgressMonitor()).pipe(req);
1526
+ });
1527
+ } else if (Buffer.isBuffer(data)) {
1528
+ bufferToChunks(data).pipe(getProgressMonitor()).pipe(req);
1529
+ } else {
1530
+ req.end(data);
1531
+ }
1532
+ } catch (err) {
1533
+ this._failRequest(err);
1199
1534
  }
1200
1535
  };
1201
1536
 
@@ -1329,4 +1664,4 @@ function hasNonEmptyResponseContent(res) {
1329
1664
  }
1330
1665
  return true;
1331
1666
  }
1332
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmb3JtYXQiLCJyZXF1aXJlIiwiU3RyZWFtIiwiaHR0cHMiLCJodHRwIiwiZnMiLCJ6bGliIiwidXRpbCIsInFzIiwibWltZSIsIm1ldGhvZHMiLCJGb3JtRGF0YSIsImZvcm1pZGFibGUiLCJkZWJ1ZyIsIkNvb2tpZUphciIsInNhZmVTdHJpbmdpZnkiLCJ1dGlscyIsIlJlcXVlc3RCYXNlIiwiaHR0cDIiLCJkZWNvbXByZXNzIiwiUmVzcG9uc2UiLCJtaXhpbiIsImhhc093biIsImlzQnJvdGxpRW5jb2RpbmciLCJpc0d6aXBPckRlZmxhdGVFbmNvZGluZyIsImNob29zZURlY29tcHJlc3NlciIsInJlcXVlc3QiLCJtZXRob2QiLCJ1cmwiLCJleHBvcnRzIiwiUmVxdWVzdCIsImVuZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsIm1vZHVsZSIsImFnZW50Iiwibm9vcCIsImRlZmluZSIsInByb3RvY29scyIsInNlcmlhbGl6ZSIsIm9iaiIsInN0cmluZ2lmeSIsImluZGljZXMiLCJzdHJpY3ROdWxsSGFuZGxpbmciLCJwYXJzZSIsImJ1ZmZlciIsIl9pbml0SGVhZGVycyIsInJlcXVlc3RfIiwiX2hlYWRlciIsImhlYWRlciIsImNhbGwiLCJfZW5hYmxlSHR0cDIiLCJCb29sZWFuIiwicHJvY2VzcyIsImVudiIsIkhUVFAyX1RFU1QiLCJfYWdlbnQiLCJfZm9ybURhdGEiLCJ3cml0YWJsZSIsIl9yZWRpcmVjdHMiLCJyZWRpcmVjdHMiLCJjb29raWVzIiwiX3F1ZXJ5IiwicXNSYXciLCJfcmVkaXJlY3RMaXN0IiwiX3N0cmVhbVJlcXVlc3QiLCJfbG9va3VwIiwidW5kZWZpbmVkIiwib25jZSIsImNsZWFyVGltZW91dCIsImJpbmQiLCJpbmhlcml0cyIsInByb3RvdHlwZSIsImJvb2wiLCJFcnJvciIsImF0dGFjaCIsImZpZWxkIiwiZmlsZSIsIm9wdGlvbnMiLCJfZGF0YSIsIm8iLCJmaWxlbmFtZSIsImNyZWF0ZVJlYWRTdHJlYW0iLCJvbiIsImVycm9yIiwiZm9ybURhdGEiLCJfZ2V0Rm9ybURhdGEiLCJlbWl0IiwicGF0aCIsImFwcGVuZCIsImNhbGxlZCIsImNhbGxiYWNrIiwiYWJvcnQiLCJsb29rdXAiLCJ0eXBlIiwic2V0IiwiaW5jbHVkZXMiLCJnZXRUeXBlIiwiYWNjZXB0IiwicXVlcnkiLCJ2YWx1ZSIsInB1c2giLCJPYmplY3QiLCJhc3NpZ24iLCJ3cml0ZSIsImRhdGEiLCJlbmNvZGluZyIsInBpcGUiLCJzdHJlYW0iLCJwaXBlZCIsIl9waXBlQ29udGludWUiLCJyZXEiLCJyZXMiLCJpc1JlZGlyZWN0Iiwic3RhdHVzQ29kZSIsIl9tYXhSZWRpcmVjdHMiLCJfcmVkaXJlY3QiLCJfZW1pdFJlc3BvbnNlIiwiX2Fib3J0ZWQiLCJfc2hvdWxkRGVjb21wcmVzcyIsImRlY29tcHJlc3NlciIsImNvZGUiLCJfYnVmZmVyIiwiaGVhZGVycyIsImxvY2F0aW9uIiwiVVJMIiwiaHJlZiIsInJlc3VtZSIsImdldEhlYWRlcnMiLCJfaGVhZGVycyIsImNoYW5nZXNPcmlnaW4iLCJob3N0IiwiY2xlYW5IZWFkZXIiLCJfZW5kQ2FsbGVkIiwiX2VtaXRSZWRpcmVjdCIsIl9jYWxsYmFjayIsImF1dGgiLCJ1c2VyIiwicGFzcyIsImVuY29kZXIiLCJzdHJpbmciLCJCdWZmZXIiLCJmcm9tIiwidG9TdHJpbmciLCJfYXV0aCIsImNhIiwiY2VydCIsIl9jYSIsImtleSIsIl9rZXkiLCJwZngiLCJpc0J1ZmZlciIsIl9wZngiLCJfcGFzc3BocmFzZSIsInBhc3NwaHJhc2UiLCJfY2VydCIsImRpc2FibGVUTFNDZXJ0cyIsIl9kaXNhYmxlVExTQ2VydHMiLCJfZmluYWxpemVRdWVyeVN0cmluZyIsImVyciIsInVybFN0cmluZyIsInJldHJpZXMiLCJfcmV0cmllcyIsImluZGV4T2YiLCJwcm90b2NvbCIsInBhdGhuYW1lIiwic2VhcmNoIiwidGVzdCIsInNwbGl0Iiwic29ja2V0UGF0aCIsImhvc3RuYW1lIiwicmVwbGFjZSIsIl9jb25uZWN0T3ZlcnJpZGUiLCJtYXRjaCIsIm5ld0hvc3QiLCJuZXdQb3J0IiwicG9ydCIsIm5vcm1hbGl6ZUhvc3RuYW1lIiwicmVqZWN0VW5hdXRob3JpemVkIiwiTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRCIsInNlcnZlcm5hbWUiLCJfdHJ1c3RMb2NhbGhvc3QiLCJtb2R1bGVfIiwic2V0UHJvdG9jb2wiLCJzZXROb0RlbGF5Iiwic2V0SGVhZGVyIiwicmVzcG9uc2UiLCJ1c2VybmFtZSIsInBhc3N3b3JkIiwidGVtcG9yYXJ5SmFyIiwic2V0Q29va2llcyIsImNvb2tpZSIsImdldENvb2tpZXMiLCJDb29raWVBY2Nlc3NJbmZvIiwiQWxsIiwidG9WYWx1ZVN0cmluZyIsIl9zaG91bGRSZXRyeSIsIl9yZXRyeSIsImZuIiwiY29uc29sZSIsIndhcm4iLCJfaXNSZXNwb25zZU9LIiwibWVzc2FnZSIsIlNUQVRVU19DT0RFUyIsInN0YXR1cyIsIl9tYXhSZXRyaWVzIiwibGlzdGVuZXJzIiwiX2lzSG9zdCIsIm9iamVjdCIsImJvZHkiLCJmaWxlcyIsIl9lbmQiLCJfc2V0VGltZW91dHMiLCJfaGVhZGVyU2VudCIsImNvbnRlbnRUeXBlIiwiZ2V0SGVhZGVyIiwiX3NlcmlhbGl6ZXIiLCJpc0pTT04iLCJieXRlTGVuZ3RoIiwiX3Jlc3BvbnNlVGltZW91dFRpbWVyIiwibWF4IiwidG9Mb3dlckNhc2UiLCJ0cmltIiwibXVsdGlwYXJ0IiwicmVkaXJlY3QiLCJyZXNwb25zZVR5cGUiLCJfcmVzcG9uc2VUeXBlIiwicGFyc2VyIiwiX3BhcnNlciIsImltYWdlIiwiZm9ybSIsImJyaWRnZVN0cmVhbSIsIlBhc3NUaHJvdWdoIiwiaHR0cFZlcnNpb24iLCJzb2NrZXQiLCJyZWFkYWJsZSIsImZpZWxkcyIsImZsYXR0ZW5lZEZpZWxkcyIsIkFycmF5IiwiaXNBcnJheSIsImZsYXR0ZW5lZEZpbGVzIiwiaXNCaW5hcnkiLCJ0ZXh0IiwiaXNUZXh0IiwiX3Jlc0J1ZmZlcmVkIiwicGFyc2VySGFuZGxlc0VuZCIsInJlc3BvbnNlQnl0ZXNMZWZ0IiwiX21heFJlc3BvbnNlU2l6ZSIsImJ1ZiIsImRlc3Ryb3kiLCJ0aW1lZG91dCIsImdldFByb2dyZXNzTW9uaXRvciIsImxlbmd0aENvbXB1dGFibGUiLCJ0b3RhbCIsImxvYWRlZCIsInByb2dyZXNzIiwiVHJhbnNmb3JtIiwiX3RyYW5zZm9ybSIsImNodW5rIiwiZGlyZWN0aW9uIiwiYnVmZmVyVG9DaHVua3MiLCJjaHVua1NpemUiLCJjaHVua2luZyIsIlJlYWRhYmxlIiwidG90YWxMZW5ndGgiLCJyZW1haW5kZXIiLCJjdXRvZmYiLCJpIiwic2xpY2UiLCJyZW1haW5kZXJCdWZmZXIiLCJnZXRMZW5ndGgiLCJoYXNOb25FbXB0eVJlc3BvbnNlQ29udGVudCIsImNvbm5lY3QiLCJjb25uZWN0T3ZlcnJpZGUiLCJ0cnVzdExvY2FsaG9zdCIsInRvZ2dsZSIsIm5hbWUiLCJ0b1VwcGVyQ2FzZSIsInNlbmQiLCJwYXJ0cyIsInN1YnR5cGUiLCJyZWdpc3RyeSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ub2RlL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG5jb25zdCB7IGZvcm1hdCB9ID0gcmVxdWlyZSgndXJsJyk7XG5jb25zdCBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKTtcbmNvbnN0IGh0dHBzID0gcmVxdWlyZSgnaHR0cHMnKTtcbmNvbnN0IGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCB6bGliID0gcmVxdWlyZSgnemxpYicpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbmNvbnN0IHFzID0gcmVxdWlyZSgncXMnKTtcbmNvbnN0IG1pbWUgPSByZXF1aXJlKCdtaW1lJyk7XG5sZXQgbWV0aG9kcyA9IHJlcXVpcmUoJ21ldGhvZHMnKTtcbmNvbnN0IEZvcm1EYXRhID0gcmVxdWlyZSgnZm9ybS1kYXRhJyk7XG5jb25zdCBmb3JtaWRhYmxlID0gcmVxdWlyZSgnZm9ybWlkYWJsZScpO1xuY29uc3QgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdzdXBlcmFnZW50Jyk7XG5jb25zdCBDb29raWVKYXIgPSByZXF1aXJlKCdjb29raWVqYXInKTtcbmNvbnN0IHNhZmVTdHJpbmdpZnkgPSByZXF1aXJlKCdmYXN0LXNhZmUtc3RyaW5naWZ5Jyk7XG5cbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbmNvbnN0IFJlcXVlc3RCYXNlID0gcmVxdWlyZSgnLi4vcmVxdWVzdC1iYXNlJyk7XG5jb25zdCBodHRwMiA9IHJlcXVpcmUoJy4vaHR0cDJ3cmFwcGVyJyk7XG5jb25zdCB7IGRlY29tcHJlc3MgfSA9IHJlcXVpcmUoJy4vdW56aXAnKTtcbmNvbnN0IFJlc3BvbnNlID0gcmVxdWlyZSgnLi9yZXNwb25zZScpO1xuXG5jb25zdCB7IG1peGluLCBoYXNPd24sIGlzQnJvdGxpRW5jb2RpbmcsIGlzR3ppcE9yRGVmbGF0ZUVuY29kaW5nIH0gPSB1dGlscztcbmNvbnN0IHsgY2hvb3NlRGVjb21wcmVzc2VyIH0gPSByZXF1aXJlKCcuL2RlY29tcHJlc3MnKTtcblxuZnVuY3Rpb24gcmVxdWVzdChtZXRob2QsIHVybCkge1xuICAvLyBjYWxsYmFja1xuICBpZiAodHlwZW9mIHVybCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBuZXcgZXhwb3J0cy5SZXF1ZXN0KCdHRVQnLCBtZXRob2QpLmVuZCh1cmwpO1xuICB9XG5cbiAgLy8gdXJsIGZpcnN0XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIG5ldyBleHBvcnRzLlJlcXVlc3QoJ0dFVCcsIG1ldGhvZCk7XG4gIH1cblxuICByZXR1cm4gbmV3IGV4cG9ydHMuUmVxdWVzdChtZXRob2QsIHVybCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWVzdDtcbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBFeHBvc2UgYFJlcXVlc3RgLlxuICovXG5cbmV4cG9ydHMuUmVxdWVzdCA9IFJlcXVlc3Q7XG5cbi8qKlxuICogRXhwb3NlIHRoZSBhZ2VudCBmdW5jdGlvblxuICovXG5cbmV4cG9ydHMuYWdlbnQgPSByZXF1aXJlKCcuL2FnZW50Jyk7XG5cbi8qKlxuICogTm9vcC5cbiAqL1xuXG5mdW5jdGlvbiBub29wKCkge31cblxuLyoqXG4gKiBFeHBvc2UgYFJlc3BvbnNlYC5cbiAqL1xuXG5leHBvcnRzLlJlc3BvbnNlID0gUmVzcG9uc2U7XG5cbi8qKlxuICogRGVmaW5lIFwiZm9ybVwiIG1pbWUgdHlwZS5cbiAqL1xuXG5taW1lLmRlZmluZShcbiAge1xuICAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOiBbJ2Zvcm0nLCAndXJsZW5jb2RlZCcsICdmb3JtLWRhdGEnXVxuICB9LFxuICB0cnVlXG4pO1xuXG4vKipcbiAqIFByb3RvY29sIG1hcC5cbiAqL1xuXG5leHBvcnRzLnByb3RvY29scyA9IHtcbiAgJ2h0dHA6JzogaHR0cCxcbiAgJ2h0dHBzOic6IGh0dHBzLFxuICAnaHR0cDI6JzogaHR0cDJcbn07XG5cbi8qKlxuICogRGVmYXVsdCBzZXJpYWxpemF0aW9uIG1hcC5cbiAqXG4gKiAgICAgc3VwZXJhZ2VudC5zZXJpYWxpemVbJ2FwcGxpY2F0aW9uL3htbCddID0gZnVuY3Rpb24ob2JqKXtcbiAqICAgICAgIHJldHVybiAnZ2VuZXJhdGVkIHhtbCBoZXJlJztcbiAqICAgICB9O1xuICpcbiAqL1xuXG5leHBvcnRzLnNlcmlhbGl6ZSA9IHtcbiAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc6IChvYmopID0+IHtcbiAgICByZXR1cm4gcXMuc3RyaW5naWZ5KG9iaiwgeyBpbmRpY2VzOiBmYWxzZSwgc3RyaWN0TnVsbEhhbmRsaW5nOiB0cnVlIH0pO1xuICB9LFxuICAnYXBwbGljYXRpb24vanNvbic6IHNhZmVTdHJpbmdpZnlcbn07XG5cbi8qKlxuICogRGVmYXVsdCBwYXJzZXJzLlxuICpcbiAqICAgICBzdXBlcmFnZW50LnBhcnNlWydhcHBsaWNhdGlvbi94bWwnXSA9IGZ1bmN0aW9uKHJlcywgZm4pe1xuICogICAgICAgZm4obnVsbCwgcmVzKTtcbiAqICAgICB9O1xuICpcbiAqL1xuXG5leHBvcnRzLnBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZXJzJyk7XG5cbi8qKlxuICogRGVmYXVsdCBidWZmZXJpbmcgbWFwLiBDYW4gYmUgdXNlZCB0byBzZXQgY2VydGFpblxuICogcmVzcG9uc2UgdHlwZXMgdG8gYnVmZmVyL25vdCBidWZmZXIuXG4gKlxuICogICAgIHN1cGVyYWdlbnQuYnVmZmVyWydhcHBsaWNhdGlvbi94bWwnXSA9IHRydWU7XG4gKi9cbmV4cG9ydHMuYnVmZmVyID0ge307XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBpbnRlcm5hbCBoZWFkZXIgdHJhY2tpbmcgcHJvcGVydGllcyBvbiBhIHJlcXVlc3QgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHJlcSB0aGUgaW5zdGFuY2VcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfaW5pdEhlYWRlcnMocmVxdWVzdF8pIHtcbiAgcmVxdWVzdF8uX2hlYWRlciA9IHtcbiAgICAvLyBjb2VyY2VzIGhlYWRlciBuYW1lcyB0byBsb3dlcmNhc2VcbiAgfTtcbiAgcmVxdWVzdF8uaGVhZGVyID0ge1xuICAgIC8vIHByZXNlcnZlcyBoZWFkZXIgbmFtZSBjYXNlXG4gIH07XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBgUmVxdWVzdGAgd2l0aCB0aGUgZ2l2ZW4gYG1ldGhvZGAgYW5kIGB1cmxgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXRob2RcbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gdXJsXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIFJlcXVlc3QobWV0aG9kLCB1cmwpIHtcbiAgU3RyZWFtLmNhbGwodGhpcyk7XG4gIGlmICh0eXBlb2YgdXJsICE9PSAnc3RyaW5nJykgdXJsID0gZm9ybWF0KHVybCk7XG4gIHRoaXMuX2VuYWJsZUh0dHAyID0gQm9vbGVhbihwcm9jZXNzLmVudi5IVFRQMl9URVNUKTsgLy8gaW50ZXJuYWwgb25seVxuICB0aGlzLl9hZ2VudCA9IGZhbHNlO1xuICB0aGlzLl9mb3JtRGF0YSA9IG51bGw7XG4gIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICB0aGlzLnVybCA9IHVybDtcbiAgX2luaXRIZWFkZXJzKHRoaXMpO1xuICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcbiAgdGhpcy5fcmVkaXJlY3RzID0gMDtcbiAgdGhpcy5yZWRpcmVjdHMobWV0aG9kID09PSAnSEVBRCcgPyAwIDogNSk7XG4gIHRoaXMuY29va2llcyA9ICcnO1xuICB0aGlzLnFzID0ge307XG4gIHRoaXMuX3F1ZXJ5ID0gW107XG4gIHRoaXMucXNSYXcgPSB0aGlzLl9xdWVyeTsgLy8gVW51c2VkLCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seVxuICB0aGlzLl9yZWRpcmVjdExpc3QgPSBbXTtcbiAgdGhpcy5fc3RyZWFtUmVxdWVzdCA9IGZhbHNlO1xuICB0aGlzLl9sb29rdXAgPSB1bmRlZmluZWQ7XG4gIHRoaXMub25jZSgnZW5kJywgdGhpcy5jbGVhclRpbWVvdXQuYmluZCh0aGlzKSk7XG59XG5cbi8qKlxuICogSW5oZXJpdCBmcm9tIGBTdHJlYW1gICh3aGljaCBpbmhlcml0cyBmcm9tIGBFdmVudEVtaXR0ZXJgKS5cbiAqIE1peGluIGBSZXF1ZXN0QmFzZWAuXG4gKi9cbnV0aWwuaW5oZXJpdHMoUmVxdWVzdCwgU3RyZWFtKTtcblxubWl4aW4oUmVxdWVzdC5wcm90b3R5cGUsIFJlcXVlc3RCYXNlLnByb3RvdHlwZSk7XG5cbi8qKlxuICogRW5hYmxlIG9yIERpc2FibGUgaHR0cDIuXG4gKlxuICogRW5hYmxlIGh0dHAyLlxuICpcbiAqIGBgYCBqc1xuICogcmVxdWVzdC5nZXQoJ2h0dHA6Ly9sb2NhbGhvc3QvJylcbiAqICAgLmh0dHAyKClcbiAqICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogcmVxdWVzdC5nZXQoJ2h0dHA6Ly9sb2NhbGhvc3QvJylcbiAqICAgLmh0dHAyKHRydWUpXG4gKiAgIC5lbmQoY2FsbGJhY2spO1xuICogYGBgXG4gKlxuICogRGlzYWJsZSBodHRwMi5cbiAqXG4gKiBgYGAganNcbiAqIHJlcXVlc3QgPSByZXF1ZXN0Lmh0dHAyKCk7XG4gKiByZXF1ZXN0LmdldCgnaHR0cDovL2xvY2FsaG9zdC8nKVxuICogICAuaHR0cDIoZmFsc2UpXG4gKiAgIC5lbmQoY2FsbGJhY2spO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5odHRwMiA9IGZ1bmN0aW9uIChib29sKSB7XG4gIGlmIChleHBvcnRzLnByb3RvY29sc1snaHR0cDI6J10gPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdzdXBlcmFnZW50OiB0aGlzIHZlcnNpb24gb2YgTm9kZS5qcyBkb2VzIG5vdCBzdXBwb3J0IGh0dHAyJ1xuICAgICk7XG4gIH1cblxuICB0aGlzLl9lbmFibGVIdHRwMiA9IGJvb2wgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBib29sO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUXVldWUgdGhlIGdpdmVuIGBmaWxlYCBhcyBhbiBhdHRhY2htZW50IHRvIHRoZSBzcGVjaWZpZWQgYGZpZWxkYCxcbiAqIHdpdGggb3B0aW9uYWwgYG9wdGlvbnNgIChvciBmaWxlbmFtZSkuXG4gKlxuICogYGBgIGpzXG4gKiByZXF1ZXN0LnBvc3QoJ2h0dHA6Ly9sb2NhbGhvc3QvdXBsb2FkJylcbiAqICAgLmF0dGFjaCgnZmllbGQnLCBCdWZmZXIuZnJvbSgnPGI+SGVsbG8gd29ybGQ8L2I+JyksICdoZWxsby5odG1sJylcbiAqICAgLmVuZChjYWxsYmFjayk7XG4gKiBgYGBcbiAqXG4gKiBBIGZpbGVuYW1lIG1heSBhbHNvIGJlIHVzZWQ6XG4gKlxuICogYGBgIGpzXG4gKiByZXF1ZXN0LnBvc3QoJ2h0dHA6Ly9sb2NhbGhvc3QvdXBsb2FkJylcbiAqICAgLmF0dGFjaCgnZmlsZXMnLCAnaW1hZ2UuanBnJylcbiAqICAgLmVuZChjYWxsYmFjayk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmllbGRcbiAqIEBwYXJhbSB7U3RyaW5nfGZzLlJlYWRTdHJlYW18QnVmZmVyfSBmaWxlXG4gKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5hdHRhY2ggPSBmdW5jdGlvbiAoZmllbGQsIGZpbGUsIG9wdGlvbnMpIHtcbiAgaWYgKGZpbGUpIHtcbiAgICBpZiAodGhpcy5fZGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwic3VwZXJhZ2VudCBjYW4ndCBtaXggLnNlbmQoKSBhbmQgLmF0dGFjaCgpXCIpO1xuICAgIH1cblxuICAgIGxldCBvID0gb3B0aW9ucyB8fCB7fTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBvID0geyBmaWxlbmFtZTogb3B0aW9ucyB9O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZmlsZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICghby5maWxlbmFtZSkgby5maWxlbmFtZSA9IGZpbGU7XG4gICAgICBkZWJ1ZygnY3JlYXRpbmcgYGZzLlJlYWRTdHJlYW1gIGluc3RhbmNlIGZvciBmaWxlOiAlcycsIGZpbGUpO1xuICAgICAgZmlsZSA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0oZmlsZSk7XG4gICAgICBmaWxlLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IHRoaXMuX2dldEZvcm1EYXRhKCk7XG4gICAgICAgIGZvcm1EYXRhLmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghby5maWxlbmFtZSAmJiBmaWxlLnBhdGgpIHtcbiAgICAgIG8uZmlsZW5hbWUgPSBmaWxlLnBhdGg7XG4gICAgfVxuXG4gICAgdGhpcy5fZ2V0Rm9ybURhdGEoKS5hcHBlbmQoZmllbGQsIGZpbGUsIG8pO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5fZ2V0Rm9ybURhdGEgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5fZm9ybURhdGEpIHtcbiAgICB0aGlzLl9mb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIHRoaXMuX2Zvcm1EYXRhLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgZGVidWcoJ0Zvcm1EYXRhIGVycm9yJywgZXJyb3IpO1xuICAgICAgaWYgKHRoaXMuY2FsbGVkKSB7XG4gICAgICAgIC8vIFRoZSByZXF1ZXN0IGhhcyBhbHJlYWR5IGZpbmlzaGVkIGFuZCB0aGUgY2FsbGJhY2sgd2FzIGNhbGxlZC5cbiAgICAgICAgLy8gU2lsZW50bHkgaWdub3JlIHRoZSBlcnJvci5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNhbGxiYWNrKGVycm9yKTtcbiAgICAgIHRoaXMuYWJvcnQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9mb3JtRGF0YTtcbn07XG5cbi8qKlxuICogR2V0cy9zZXRzIHRoZSBgQWdlbnRgIHRvIHVzZSBmb3IgdGhpcyBIVFRQIHJlcXVlc3QuIFRoZSBkZWZhdWx0IChpZiB0aGlzXG4gKiBmdW5jdGlvbiBpcyBub3QgY2FsbGVkKSBpcyB0byBvcHQgb3V0IG9mIGNvbm5lY3Rpb24gcG9vbGluZyAoYGFnZW50OiBmYWxzZWApLlxuICpcbiAqIEBwYXJhbSB7aHR0cC5BZ2VudH0gYWdlbnRcbiAqIEByZXR1cm4ge2h0dHAuQWdlbnR9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmFnZW50ID0gZnVuY3Rpb24gKGFnZW50KSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5fYWdlbnQ7XG4gIHRoaXMuX2FnZW50ID0gYWdlbnQ7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBHZXRzL3NldHMgdGhlIGBsb29rdXBgIGZ1bmN0aW9uIHRvIHVzZSBjdXN0b20gRE5TIHJlc29sdmVyLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGxvb2t1cFxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmxvb2t1cCA9IGZ1bmN0aW9uIChsb29rdXApIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB0aGlzLl9sb29rdXA7XG4gIHRoaXMuX2xvb2t1cCA9IGxvb2t1cDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBfQ29udGVudC1UeXBlXyByZXNwb25zZSBoZWFkZXIgcGFzc2VkIHRocm91Z2ggYG1pbWUuZ2V0VHlwZSgpYC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgIHJlcXVlc3QucG9zdCgnLycpXG4gKiAgICAgICAgLnR5cGUoJ3htbCcpXG4gKiAgICAgICAgLnNlbmQoeG1sc3RyaW5nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqICAgICAgcmVxdWVzdC5wb3N0KCcvJylcbiAqICAgICAgICAudHlwZSgnanNvbicpXG4gKiAgICAgICAgLnNlbmQoanNvbnN0cmluZylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiAgICAgIHJlcXVlc3QucG9zdCgnLycpXG4gKiAgICAgICAgLnR5cGUoJ2FwcGxpY2F0aW9uL2pzb24nKVxuICogICAgICAgIC5zZW5kKGpzb25zdHJpbmcpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS50eXBlID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgcmV0dXJuIHRoaXMuc2V0KFxuICAgICdDb250ZW50LVR5cGUnLFxuICAgIHR5cGUuaW5jbHVkZXMoJy8nKSA/IHR5cGUgOiBtaW1lLmdldFR5cGUodHlwZSlcbiAgKTtcbn07XG5cbi8qKlxuICogU2V0IF9BY2NlcHRfIHJlc3BvbnNlIGhlYWRlciBwYXNzZWQgdGhyb3VnaCBgbWltZS5nZXRUeXBlKClgLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgc3VwZXJhZ2VudC50eXBlcy5qc29uID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuICpcbiAqICAgICAgcmVxdWVzdC5nZXQoJy9hZ2VudCcpXG4gKiAgICAgICAgLmFjY2VwdCgnanNvbicpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogICAgICByZXF1ZXN0LmdldCgnL2FnZW50JylcbiAqICAgICAgICAuYWNjZXB0KCdhcHBsaWNhdGlvbi9qc29uJylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYWNjZXB0XG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuYWNjZXB0ID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgcmV0dXJuIHRoaXMuc2V0KCdBY2NlcHQnLCB0eXBlLmluY2x1ZGVzKCcvJykgPyB0eXBlIDogbWltZS5nZXRUeXBlKHR5cGUpKTtcbn07XG5cbi8qKlxuICogQWRkIHF1ZXJ5LXN0cmluZyBgdmFsYC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgIHJlcXVlc3QuZ2V0KCcvc2hvZXMnKVxuICogICAgIC5xdWVyeSgnc2l6ZT0xMCcpXG4gKiAgICAgLnF1ZXJ5KHsgY29sb3I6ICdibHVlJyB9KVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gdmFsXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUucXVlcnkgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICB0aGlzLl9xdWVyeS5wdXNoKHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMucXMsIHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBXcml0ZSByYXcgYGRhdGFgIC8gYGVuY29kaW5nYCB0byB0aGUgc29ja2V0LlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfFN0cmluZ30gZGF0YVxuICogQHBhcmFtIHtTdHJpbmd9IGVuY29kaW5nXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChkYXRhLCBlbmNvZGluZykge1xuICBjb25zdCByZXF1ZXN0XyA9IHRoaXMucmVxdWVzdCgpO1xuICBpZiAoIXRoaXMuX3N0cmVhbVJlcXVlc3QpIHtcbiAgICB0aGlzLl9zdHJlYW1SZXF1ZXN0ID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiByZXF1ZXN0Xy53cml0ZShkYXRhLCBlbmNvZGluZyk7XG59O1xuXG4vKipcbiAqIFBpcGUgdGhlIHJlcXVlc3QgYm9keSB0byBgc3RyZWFtYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7U3RyZWFtfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKHN0cmVhbSwgb3B0aW9ucykge1xuICB0aGlzLnBpcGVkID0gdHJ1ZTsgLy8gSEFDSy4uLlxuICB0aGlzLmJ1ZmZlcihmYWxzZSk7XG4gIHRoaXMuZW5kKCk7XG4gIHJldHVybiB0aGlzLl9waXBlQ29udGludWUoc3RyZWFtLCBvcHRpb25zKTtcbn07XG5cblJlcXVlc3QucHJvdG90eXBlLl9waXBlQ29udGludWUgPSBmdW5jdGlvbiAoc3RyZWFtLCBvcHRpb25zKSB7XG4gIHRoaXMucmVxLm9uY2UoJ3Jlc3BvbnNlJywgKHJlcykgPT4ge1xuICAgIC8vIHJlZGlyZWN0XG4gICAgaWYgKFxuICAgICAgaXNSZWRpcmVjdChyZXMuc3RhdHVzQ29kZSkgJiZcbiAgICAgIHRoaXMuX3JlZGlyZWN0cysrICE9PSB0aGlzLl9tYXhSZWRpcmVjdHNcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWRpcmVjdChyZXMpID09PSB0aGlzXG4gICAgICAgID8gdGhpcy5fcGlwZUNvbnRpbnVlKHN0cmVhbSwgb3B0aW9ucylcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdGhpcy5yZXMgPSByZXM7XG4gICAgdGhpcy5fZW1pdFJlc3BvbnNlKCk7XG4gICAgaWYgKHRoaXMuX2Fib3J0ZWQpIHJldHVybjtcblxuICAgIGlmICh0aGlzLl9zaG91bGREZWNvbXByZXNzKHJlcykpIHtcblxuICAgICAgbGV0IGRlY29tcHJlc3NlciA9IGNob29zZURlY29tcHJlc3NlcihyZXMpO1xuXG4gICAgICBkZWNvbXByZXNzZXIub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5jb2RlID09PSAnWl9CVUZfRVJST1InKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpcyBpZ25vcmVkIGJ5IGJyb3dzZXJzIGFuZCBjdXJsXG4gICAgICAgICAgc3RyZWFtLmVtaXQoJ2VuZCcpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgICAgIH0pO1xuICAgICAgcmVzLnBpcGUoZGVjb21wcmVzc2VyKS5waXBlKHN0cmVhbSwgb3B0aW9ucyk7XG4gICAgICAvLyBkb24ndCBlbWl0ICdlbmQnIHVudGlsIGRlY29tcHJlc3NlciBoYXMgY29tcGxldGVkIHdyaXRpbmcgYWxsIGl0cyBkYXRhLlxuICAgICAgZGVjb21wcmVzc2VyLm9uY2UoJ2VuZCcsICgpID0+IHRoaXMuZW1pdCgnZW5kJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMucGlwZShzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgcmVzLm9uY2UoJ2VuZCcsICgpID0+IHRoaXMuZW1pdCgnZW5kJykpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBzdHJlYW07XG59O1xuXG4vKipcbiAqIEVuYWJsZSAvIGRpc2FibGUgYnVmZmVyaW5nLlxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59IFt2YWxdXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuYnVmZmVyID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHRoaXMuX2J1ZmZlciA9IHZhbHVlICE9PSBmYWxzZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJlZGlyZWN0IHRvIGB1cmxcbiAqXG4gKiBAcGFyYW0ge0luY29taW5nTWVzc2FnZX0gcmVzXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlcXVlc3QucHJvdG90eXBlLl9yZWRpcmVjdCA9IGZ1bmN0aW9uIChyZXMpIHtcbiAgbGV0IHVybCA9IHJlcy5oZWFkZXJzLmxvY2F0aW9uO1xuICBpZiAoIXVybCkge1xuICAgIHJldHVybiB0aGlzLmNhbGxiYWNrKG5ldyBFcnJvcignTm8gbG9jYXRpb24gaGVhZGVyIGZvciByZWRpcmVjdCcpLCByZXMpO1xuICB9XG5cbiAgZGVidWcoJ3JlZGlyZWN0ICVzIC0+ICVzJywgdGhpcy51cmwsIHVybCk7XG5cbiAgLy8gbG9jYXRpb25cbiAgdXJsID0gbmV3IFVSTCh1cmwsIHRoaXMudXJsKS5ocmVmO1xuXG4gIC8vIGVuc3VyZSB0aGUgcmVzcG9uc2UgaXMgYmVpbmcgY29uc3VtZWRcbiAgLy8gdGhpcyBpcyByZXF1aXJlZCBmb3IgTm9kZSB2MC4xMCtcbiAgcmVzLnJlc3VtZSgpO1xuXG4gIGxldCBoZWFkZXJzID0gdGhpcy5yZXEuZ2V0SGVhZGVycyA/IHRoaXMucmVxLmdldEhlYWRlcnMoKSA6IHRoaXMucmVxLl9oZWFkZXJzO1xuXG4gIGNvbnN0IGNoYW5nZXNPcmlnaW4gPSBuZXcgVVJMKHVybCkuaG9zdCAhPT0gbmV3IFVSTCh0aGlzLnVybCkuaG9zdDtcblxuICAvLyBpbXBsZW1lbnRhdGlvbiBvZiAzMDIgZm9sbG93aW5nIGRlZmFjdG8gc3RhbmRhcmRcbiAgaWYgKHJlcy5zdGF0dXNDb2RlID09PSAzMDEgfHwgcmVzLnN0YXR1c0NvZGUgPT09IDMwMikge1xuICAgIC8vIHN0cmlwIENvbnRlbnQtKiByZWxhdGVkIGZpZWxkc1xuICAgIC8vIGluIGNhc2Ugb2YgUE9TVCBldGNcbiAgICBoZWFkZXJzID0gdXRpbHMuY2xlYW5IZWFkZXIoaGVhZGVycywgY2hhbmdlc09yaWdpbik7XG5cbiAgICAvLyBmb3JjZSBHRVRcbiAgICB0aGlzLm1ldGhvZCA9IHRoaXMubWV0aG9kID09PSAnSEVBRCcgPyAnSEVBRCcgOiAnR0VUJztcblxuICAgIC8vIGNsZWFyIGRhdGFcbiAgICB0aGlzLl9kYXRhID0gbnVsbDtcbiAgfVxuXG4gIC8vIDMwMyBpcyBhbHdheXMgR0VUXG4gIGlmIChyZXMuc3RhdHVzQ29kZSA9PT0gMzAzKSB7XG4gICAgLy8gc3RyaXAgQ29udGVudC0qIHJlbGF0ZWQgZmllbGRzXG4gICAgLy8gaW4gY2FzZSBvZiBQT1NUIGV0Y1xuICAgIGhlYWRlcnMgPSB1dGlscy5jbGVhbkhlYWRlcihoZWFkZXJzLCBjaGFuZ2VzT3JpZ2luKTtcblxuICAgIC8vIGZvcmNlIG1ldGhvZFxuICAgIHRoaXMubWV0aG9kID0gJ0dFVCc7XG5cbiAgICAvLyBjbGVhciBkYXRhXG4gICAgdGhpcy5fZGF0YSA9IG51bGw7XG4gIH1cblxuICAvLyAzMDcgcHJlc2VydmVzIG1ldGhvZFxuICAvLyAzMDggcHJlc2VydmVzIG1ldGhvZFxuICBkZWxldGUgaGVhZGVycy5ob3N0O1xuXG4gIGRlbGV0ZSB0aGlzLnJlcTtcbiAgZGVsZXRlIHRoaXMuX2Zvcm1EYXRhO1xuXG4gIC8vIHJlbW92ZSBhbGwgYWRkIGhlYWRlciBleGNlcHQgVXNlci1BZ2VudFxuICBfaW5pdEhlYWRlcnModGhpcyk7XG5cbiAgLy8gcmVkaXJlY3RcbiAgdGhpcy5yZXMgPSByZXM7XG4gIHRoaXMuX2VuZENhbGxlZCA9IGZhbHNlO1xuICB0aGlzLnVybCA9IHVybDtcbiAgdGhpcy5xcyA9IHt9O1xuICB0aGlzLl9xdWVyeS5sZW5ndGggPSAwO1xuICB0aGlzLnNldChoZWFkZXJzKTtcbiAgdGhpcy5fZW1pdFJlZGlyZWN0KCk7XG4gIHRoaXMuX3JlZGlyZWN0TGlzdC5wdXNoKHRoaXMudXJsKTtcbiAgdGhpcy5lbmQodGhpcy5fY2FsbGJhY2spO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IEF1dGhvcml6YXRpb24gZmllbGQgdmFsdWUgd2l0aCBgdXNlcmAgYW5kIGBwYXNzYC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgIC5hdXRoKCd0b2JpJywgJ2xlYXJuYm9vc3QnKVxuICogICAuYXV0aCgndG9iaTpsZWFybmJvb3N0JylcbiAqICAgLmF1dGgoJ3RvYmknKVxuICogICAuYXV0aChhY2Nlc3NUb2tlbiwgeyB0eXBlOiAnYmVhcmVyJyB9KVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1c2VyXG4gKiBAcGFyYW0ge1N0cmluZ30gW3Bhc3NdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIG9wdGlvbnMgd2l0aCBhdXRob3JpemF0aW9uIHR5cGUgJ2Jhc2ljJyBvciAnYmVhcmVyJyAoJ2Jhc2ljJyBpcyBkZWZhdWx0KVxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmF1dGggPSBmdW5jdGlvbiAodXNlciwgcGFzcywgb3B0aW9ucykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgcGFzcyA9ICcnO1xuICBpZiAodHlwZW9mIHBhc3MgPT09ICdvYmplY3QnICYmIHBhc3MgIT09IG51bGwpIHtcbiAgICAvLyBwYXNzIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvcHRpb25zXG4gICAgb3B0aW9ucyA9IHBhc3M7XG4gICAgcGFzcyA9ICcnO1xuICB9XG5cbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHsgdHlwZTogJ2Jhc2ljJyB9O1xuICB9XG5cbiAgY29uc3QgZW5jb2RlciA9IChzdHJpbmcpID0+IEJ1ZmZlci5mcm9tKHN0cmluZykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gIHJldHVybiB0aGlzLl9hdXRoKHVzZXIsIHBhc3MsIG9wdGlvbnMsIGVuY29kZXIpO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGNlcnRpZmljYXRlIGF1dGhvcml0eSBvcHRpb24gZm9yIGh0dHBzIHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIHtCdWZmZXIgfCBBcnJheX0gY2VydFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmNhID0gZnVuY3Rpb24gKGNlcnQpIHtcbiAgdGhpcy5fY2EgPSBjZXJ0O1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBjbGllbnQgY2VydGlmaWNhdGUga2V5IG9wdGlvbiBmb3IgaHR0cHMgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlciB8IFN0cmluZ30gY2VydFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmtleSA9IGZ1bmN0aW9uIChjZXJ0KSB7XG4gIHRoaXMuX2tleSA9IGNlcnQ7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGtleSwgY2VydGlmaWNhdGUsIGFuZCBDQSBjZXJ0cyBvZiB0aGUgY2xpZW50IGluIFBGWCBvciBQS0NTMTIgZm9ybWF0LlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyIHwgU3RyaW5nfSBjZXJ0XG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUucGZ4ID0gZnVuY3Rpb24gKGNlcnQpIHtcbiAgaWYgKHR5cGVvZiBjZXJ0ID09PSAnb2JqZWN0JyAmJiAhQnVmZmVyLmlzQnVmZmVyKGNlcnQpKSB7XG4gICAgdGhpcy5fcGZ4ID0gY2VydC5wZng7XG4gICAgdGhpcy5fcGFzc3BocmFzZSA9IGNlcnQucGFzc3BocmFzZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9wZnggPSBjZXJ0O1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgY2xpZW50IGNlcnRpZmljYXRlIG9wdGlvbiBmb3IgaHR0cHMgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlciB8IFN0cmluZ30gY2VydFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmNlcnQgPSBmdW5jdGlvbiAoY2VydCkge1xuICB0aGlzLl9jZXJ0ID0gY2VydDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIERvIG5vdCByZWplY3QgZXhwaXJlZCBvciBpbnZhbGlkIFRMUyBjZXJ0cy5cbiAqIHNldHMgYHJlamVjdFVuYXV0aG9yaXplZD10cnVlYC4gQmUgd2FybmVkIHRoYXQgdGhpcyBhbGxvd3MgTUlUTSBhdHRhY2tzLlxuICpcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5kaXNhYmxlVExTQ2VydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2Rpc2FibGVUTFNDZXJ0cyA9IHRydWU7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gYW4gaHR0cFtzXSByZXF1ZXN0LlxuICpcbiAqIEByZXR1cm4ge091dGdvaW5nTWVzc2FnZX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5SZXF1ZXN0LnByb3RvdHlwZS5yZXF1ZXN0ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5yZXEpIHJldHVybiB0aGlzLnJlcTtcblxuICBjb25zdCBvcHRpb25zID0ge307XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBxdWVyeSA9IHFzLnN0cmluZ2lmeSh0aGlzLnFzLCB7XG4gICAgICBpbmRpY2VzOiBmYWxzZSxcbiAgICAgIHN0cmljdE51bGxIYW5kbGluZzogdHJ1ZVxuICAgIH0pO1xuICAgIGlmIChxdWVyeSkge1xuICAgICAgdGhpcy5xcyA9IHt9O1xuICAgICAgdGhpcy5fcXVlcnkucHVzaChxdWVyeSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZmluYWxpemVRdWVyeVN0cmluZygpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gIH1cblxuICBsZXQgeyB1cmw6IHVybFN0cmluZyB9ID0gdGhpcztcbiAgY29uc3QgcmV0cmllcyA9IHRoaXMuX3JldHJpZXM7XG5cbiAgLy8gZGVmYXVsdCB0byBodHRwOi8vXG4gIGlmICh1cmxTdHJpbmcuaW5kZXhPZignaHR0cCcpICE9PSAwKSB1cmxTdHJpbmcgPSBgaHR0cDovLyR7dXJsU3RyaW5nfWA7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwodXJsU3RyaW5nKTtcbiAgbGV0IHsgcHJvdG9jb2wgfSA9IHVybDtcbiAgbGV0IHBhdGggPSBgJHt1cmwucGF0aG5hbWV9JHt1cmwuc2VhcmNofWA7XG5cbiAgLy8gc3VwcG9ydCB1bml4IHNvY2tldHNcbiAgaWYgKC9eaHR0cHM/XFwrdW5peDovLnRlc3QocHJvdG9jb2wpID09PSB0cnVlKSB7XG4gICAgLy8gZ2V0IHRoZSBwcm90b2NvbFxuICAgIHByb3RvY29sID0gYCR7cHJvdG9jb2wuc3BsaXQoJysnKVswXX06YDtcblxuICAgIC8vIGdldCB0aGUgc29ja2V0IHBhdGhcbiAgICBvcHRpb25zLnNvY2tldFBhdGggPSB1cmwuaG9zdG5hbWUucmVwbGFjZSgvJTJGL2csICcvJyk7XG4gICAgdXJsLmhvc3QgPSAnJztcbiAgICB1cmwuaG9zdG5hbWUgPSAnJztcbiAgfVxuXG4gIC8vIE92ZXJyaWRlIElQIGFkZHJlc3Mgb2YgYSBob3N0bmFtZVxuICBpZiAodGhpcy5fY29ubmVjdE92ZXJyaWRlKSB7XG4gICAgY29uc3QgeyBob3N0bmFtZSB9ID0gdXJsO1xuICAgIGNvbnN0IG1hdGNoID1cbiAgICAgIGhvc3RuYW1lIGluIHRoaXMuX2Nvbm5lY3RPdmVycmlkZVxuICAgICAgICA/IHRoaXMuX2Nvbm5lY3RPdmVycmlkZVtob3N0bmFtZV1cbiAgICAgICAgOiB0aGlzLl9jb25uZWN0T3ZlcnJpZGVbJyonXTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIC8vIGJhY2t1cCB0aGUgcmVhbCBob3N0XG4gICAgICBpZiAoIXRoaXMuX2hlYWRlci5ob3N0KSB7XG4gICAgICAgIHRoaXMuc2V0KCdob3N0JywgdXJsLmhvc3QpO1xuICAgICAgfVxuXG4gICAgICBsZXQgbmV3SG9zdDtcbiAgICAgIGxldCBuZXdQb3J0O1xuXG4gICAgICBpZiAodHlwZW9mIG1hdGNoID09PSAnb2JqZWN0Jykge1xuICAgICAgICBuZXdIb3N0ID0gbWF0Y2guaG9zdDtcbiAgICAgICAgbmV3UG9ydCA9IG1hdGNoLnBvcnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdIb3N0ID0gbWF0Y2g7XG4gICAgICAgIG5ld1BvcnQgPSB1cmwucG9ydDtcbiAgICAgIH1cblxuICAgICAgLy8gd3JhcCBbaXB2Nl1cbiAgICAgIHVybC5ob3N0ID0gLzovLnRlc3QobmV3SG9zdCkgPyBgWyR7bmV3SG9zdH1dYCA6IG5ld0hvc3Q7XG4gICAgICBpZiAobmV3UG9ydCkge1xuICAgICAgICB1cmwuaG9zdCArPSBgOiR7bmV3UG9ydH1gO1xuICAgICAgICB1cmwucG9ydCA9IG5ld1BvcnQ7XG4gICAgICB9XG5cbiAgICAgIHVybC5ob3N0bmFtZSA9IG5ld0hvc3Q7XG4gICAgfVxuICB9XG5cbiAgLy8gb3B0aW9uc1xuICBvcHRpb25zLm1ldGhvZCA9IHRoaXMubWV0aG9kO1xuICBvcHRpb25zLnBvcnQgPSB1cmwucG9ydDtcbiAgb3B0aW9ucy5wYXRoID0gcGF0aDtcbiAgb3B0aW9ucy5ob3N0ID0gdXRpbHMubm9ybWFsaXplSG9zdG5hbWUodXJsLmhvc3RuYW1lKTsgLy8gZXg6IFs6OjFdIC0+IDo6MVxuICBvcHRpb25zLmNhID0gdGhpcy5fY2E7XG4gIG9wdGlvbnMua2V5ID0gdGhpcy5fa2V5O1xuICBvcHRpb25zLnBmeCA9IHRoaXMuX3BmeDtcbiAgb3B0aW9ucy5jZXJ0ID0gdGhpcy5fY2VydDtcbiAgb3B0aW9ucy5wYXNzcGhyYXNlID0gdGhpcy5fcGFzc3BocmFzZTtcbiAgb3B0aW9ucy5hZ2VudCA9IHRoaXMuX2FnZW50O1xuICBvcHRpb25zLmxvb2t1cCA9IHRoaXMuX2xvb2t1cDtcbiAgb3B0aW9ucy5yZWplY3RVbmF1dGhvcml6ZWQgPVxuICAgIHR5cGVvZiB0aGlzLl9kaXNhYmxlVExTQ2VydHMgPT09ICdib29sZWFuJ1xuICAgICAgPyAhdGhpcy5fZGlzYWJsZVRMU0NlcnRzXG4gICAgICA6IHByb2Nlc3MuZW52Lk5PREVfVExTX1JFSkVDVF9VTkFVVEhPUklaRUQgIT09ICcwJztcblxuICAvLyBBbGxvd3MgcmVxdWVzdC5nZXQoJ2h0dHBzOi8vMS4yLjMuNC8nKS5zZXQoJ0hvc3QnLCAnZXhhbXBsZS5jb20nKVxuICBpZiAodGhpcy5faGVhZGVyLmhvc3QpIHtcbiAgICBvcHRpb25zLnNlcnZlcm5hbWUgPSB0aGlzLl9oZWFkZXIuaG9zdC5yZXBsYWNlKC86XFxkKyQvLCAnJyk7XG4gIH1cblxuICBpZiAoXG4gICAgdGhpcy5fdHJ1c3RMb2NhbGhvc3QgJiZcbiAgICAvXig/OmxvY2FsaG9zdHwxMjdcXC4wXFwuMFxcLlxcZCt8KDAqOikrOjAqMSkkLy50ZXN0KHVybC5ob3N0bmFtZSlcbiAgKSB7XG4gICAgb3B0aW9ucy5yZWplY3RVbmF1dGhvcml6ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIGluaXRpYXRlIHJlcXVlc3RcbiAgY29uc3QgbW9kdWxlXyA9IHRoaXMuX2VuYWJsZUh0dHAyXG4gICAgPyBleHBvcnRzLnByb3RvY29sc1snaHR0cDI6J10uc2V0UHJvdG9jb2wocHJvdG9jb2wpXG4gICAgOiBleHBvcnRzLnByb3RvY29sc1twcm90b2NvbF07XG5cbiAgLy8gcmVxdWVzdFxuICB0aGlzLnJlcSA9IG1vZHVsZV8ucmVxdWVzdChvcHRpb25zKTtcbiAgY29uc3QgeyByZXEgfSA9IHRoaXM7XG5cbiAgLy8gc2V0IHRjcCBubyBkZWxheVxuICByZXEuc2V0Tm9EZWxheSh0cnVlKTtcblxuICBpZiAob3B0aW9ucy5tZXRob2QgIT09ICdIRUFEJykge1xuICAgIHJlcS5zZXRIZWFkZXIoJ0FjY2VwdC1FbmNvZGluZycsICdnemlwLCBkZWZsYXRlJyk7XG4gIH1cblxuICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7XG4gIHRoaXMuaG9zdCA9IHVybC5ob3N0O1xuXG4gIC8vIGV4cG9zZSBldmVudHNcbiAgcmVxLm9uY2UoJ2RyYWluJywgKCkgPT4ge1xuICAgIHRoaXMuZW1pdCgnZHJhaW4nKTtcbiAgfSk7XG5cbiAgcmVxLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgIC8vIGZsYWcgYWJvcnRpb24gaGVyZSBmb3Igb3V0IHRpbWVvdXRzXG4gICAgLy8gYmVjYXVzZSBub2RlIHdpbGwgZW1pdCBhIGZhdXgtZXJyb3IgXCJzb2NrZXQgaGFuZyB1cFwiXG4gICAgLy8gd2hlbiByZXF1ZXN0IGlzIGFib3J0ZWQgYmVmb3JlIGEgY29ubmVjdGlvbiBpcyBtYWRlXG4gICAgaWYgKHRoaXMuX2Fib3J0ZWQpIHJldHVybjtcbiAgICAvLyBpZiBub3QgdGhlIHNhbWUsIHdlIGFyZSBpbiB0aGUgKipvbGQqKiAoY2FuY2VsbGVkKSByZXF1ZXN0LFxuICAgIC8vIHNvIG5lZWQgdG8gY29udGludWUgKHNhbWUgYXMgZm9yIGFib3ZlKVxuICAgIGlmICh0aGlzLl9yZXRyaWVzICE9PSByZXRyaWVzKSByZXR1cm47XG4gICAgLy8gaWYgd2UndmUgcmVjZWl2ZWQgYSByZXNwb25zZSB0aGVuIHdlIGRvbid0IHdhbnQgdG8gbGV0XG4gICAgLy8gYW4gZXJyb3IgaW4gdGhlIHJlcXVlc3QgYmxvdyB1cCB0aGUgcmVzcG9uc2VcbiAgICBpZiAodGhpcy5yZXNwb25zZSkgcmV0dXJuO1xuICAgIHRoaXMuY2FsbGJhY2soZXJyb3IpO1xuICB9KTtcblxuICAvLyBhdXRoXG4gIGlmICh1cmwudXNlcm5hbWUgfHwgdXJsLnBhc3N3b3JkKSB7XG4gICAgdGhpcy5hdXRoKHVybC51c2VybmFtZSwgdXJsLnBhc3N3b3JkKTtcbiAgfVxuXG4gIGlmICh0aGlzLnVzZXJuYW1lICYmIHRoaXMucGFzc3dvcmQpIHtcbiAgICB0aGlzLmF1dGgodGhpcy51c2VybmFtZSwgdGhpcy5wYXNzd29yZCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmhlYWRlcikge1xuICAgIGlmIChoYXNPd24odGhpcy5oZWFkZXIsIGtleSkpIHJlcS5zZXRIZWFkZXIoa2V5LCB0aGlzLmhlYWRlcltrZXldKTtcbiAgfVxuXG4gIC8vIGFkZCBjb29raWVzXG4gIGlmICh0aGlzLmNvb2tpZXMpIHtcbiAgICBpZiAoaGFzT3duKHRoaXMuX2hlYWRlciwgJ2Nvb2tpZScpKSB7XG4gICAgICAvLyBtZXJnZVxuICAgICAgY29uc3QgdGVtcG9yYXJ5SmFyID0gbmV3IENvb2tpZUphci5Db29raWVKYXIoKTtcbiAgICAgIHRlbXBvcmFyeUphci5zZXRDb29raWVzKHRoaXMuX2hlYWRlci5jb29raWUuc3BsaXQoJzsgJykpO1xuICAgICAgdGVtcG9yYXJ5SmFyLnNldENvb2tpZXModGhpcy5jb29raWVzLnNwbGl0KCc7ICcpKTtcbiAgICAgIHJlcS5zZXRIZWFkZXIoXG4gICAgICAgICdDb29raWUnLFxuICAgICAgICB0ZW1wb3JhcnlKYXIuZ2V0Q29va2llcyhDb29raWVKYXIuQ29va2llQWNjZXNzSW5mby5BbGwpLnRvVmFsdWVTdHJpbmcoKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxLnNldEhlYWRlcignQ29va2llJywgdGhpcy5jb29raWVzKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBJbnZva2UgdGhlIGNhbGxiYWNrIHdpdGggYGVycmAgYW5kIGByZXNgXG4gKiBhbmQgaGFuZGxlIGFyaXR5IGNoZWNrLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHtSZXNwb25zZX0gcmVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5jYWxsYmFjayA9IGZ1bmN0aW9uIChlcnJvciwgcmVzKSB7XG4gIGlmICh0aGlzLl9zaG91bGRSZXRyeShlcnJvciwgcmVzKSkge1xuICAgIHJldHVybiB0aGlzLl9yZXRyeSgpO1xuICB9XG5cbiAgLy8gQXZvaWQgdGhlIGVycm9yIHdoaWNoIGlzIGVtaXR0ZWQgZnJvbSAnc29ja2V0IGhhbmcgdXAnIHRvIGNhdXNlIHRoZSBmbiB1bmRlZmluZWQgZXJyb3Igb24gSlMgcnVudGltZS5cbiAgY29uc3QgZm4gPSB0aGlzLl9jYWxsYmFjayB8fCBub29wO1xuICB0aGlzLmNsZWFyVGltZW91dCgpO1xuICBpZiAodGhpcy5jYWxsZWQpIHJldHVybiBjb25zb2xlLndhcm4oJ3N1cGVyYWdlbnQ6IGRvdWJsZSBjYWxsYmFjayBidWcnKTtcbiAgdGhpcy5jYWxsZWQgPSB0cnVlO1xuXG4gIGlmICghZXJyb3IpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLl9pc1Jlc3BvbnNlT0socmVzKSkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9ICdVbnN1Y2Nlc3NmdWwgSFRUUCByZXNwb25zZSc7XG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICBtZXNzYWdlID0gaHR0cC5TVEFUVVNfQ09ERVNbcmVzLnN0YXR1c10gfHwgbWVzc2FnZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICBlcnJvci5zdGF0dXMgPSByZXMgPyByZXMuc3RhdHVzIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICBlcnJvci5zdGF0dXMgPSBlcnJvci5zdGF0dXMgfHwgKHJlcyA/IHJlcy5zdGF0dXMgOiB1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIGNhbGxiYWNrIGlzIGNhbGxlZCBvdXRzaWRlIHRyeS9jYXRjaFxuICAvLyB0byBhdm9pZCBkb3VibGUgY2FsbGJhY2tcbiAgaWYgKCFlcnJvcikge1xuICAgIHJldHVybiBmbihudWxsLCByZXMpO1xuICB9XG5cbiAgZXJyb3IucmVzcG9uc2UgPSByZXM7XG4gIGlmICh0aGlzLl9tYXhSZXRyaWVzKSBlcnJvci5yZXRyaWVzID0gdGhpcy5fcmV0cmllcyAtIDE7XG5cbiAgLy8gb25seSBlbWl0IGVycm9yIGV2ZW50IGlmIHRoZXJlIGlzIGEgbGlzdGVuZXJcbiAgLy8gb3RoZXJ3aXNlIHdlIGFzc3VtZSB0aGUgY2FsbGJhY2sgdG8gYC5lbmQoKWAgd2lsbCBnZXQgdGhlIGVycm9yXG4gIGlmIChlcnJvciAmJiB0aGlzLmxpc3RlbmVycygnZXJyb3InKS5sZW5ndGggPiAwKSB7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgfVxuXG4gIGZuKGVycm9yLCByZXMpO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBgb2JqYCBpcyBhIGhvc3Qgb2JqZWN0LFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogaG9zdCBvYmplY3RcbiAqIEByZXR1cm4ge0Jvb2xlYW59IGlzIGEgaG9zdCBvYmplY3RcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5SZXF1ZXN0LnByb3RvdHlwZS5faXNIb3N0ID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICByZXR1cm4gKFxuICAgIEJ1ZmZlci5pc0J1ZmZlcihvYmplY3QpIHx8XG4gICAgb2JqZWN0IGluc3RhbmNlb2YgU3RyZWFtIHx8XG4gICAgb2JqZWN0IGluc3RhbmNlb2YgRm9ybURhdGFcbiAgKTtcbn07XG5cbi8qKlxuICogSW5pdGlhdGUgcmVxdWVzdCwgaW52b2tpbmcgY2FsbGJhY2sgYGZuKGVyciwgcmVzKWBcbiAqIHdpdGggYW4gaW5zdGFuY2VvZiBgUmVzcG9uc2VgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuX2VtaXRSZXNwb25zZSA9IGZ1bmN0aW9uIChib2R5LCBmaWxlcykge1xuICBjb25zdCByZXNwb25zZSA9IG5ldyBSZXNwb25zZSh0aGlzKTtcbiAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICByZXNwb25zZS5yZWRpcmVjdHMgPSB0aGlzLl9yZWRpcmVjdExpc3Q7XG4gIGlmICh1bmRlZmluZWQgIT09IGJvZHkpIHtcbiAgICByZXNwb25zZS5ib2R5ID0gYm9keTtcbiAgfVxuXG4gIHJlc3BvbnNlLmZpbGVzID0gZmlsZXM7XG4gIGlmICh0aGlzLl9lbmRDYWxsZWQpIHtcbiAgICByZXNwb25zZS5waXBlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcImVuZCgpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkLCBzbyBpdCdzIHRvbyBsYXRlIHRvIHN0YXJ0IHBpcGluZ1wiXG4gICAgICApO1xuICAgIH07XG4gIH1cblxuICB0aGlzLmVtaXQoJ3Jlc3BvbnNlJywgcmVzcG9uc2UpO1xuICByZXR1cm4gcmVzcG9uc2U7XG59O1xuXG4vKipcbiAqIEVtaXQgYHJlZGlyZWN0YCBldmVudCwgcGFzc2luZyBhbiBpbnN0YW5jZW9mIGBSZXNwb25zZWAuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuX2VtaXRSZWRpcmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UodGhpcyk7XG4gIHJlc3BvbnNlLnJlZGlyZWN0cyA9IHRoaXMuX3JlZGlyZWN0TGlzdDtcbiAgdGhpcy5lbWl0KCdyZWRpcmVjdCcsIHJlc3BvbnNlKTtcbn07XG5cblJlcXVlc3QucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChmbikge1xuICB0aGlzLnJlcXVlc3QoKTtcbiAgZGVidWcoJyVzICVzJywgdGhpcy5tZXRob2QsIHRoaXMudXJsKTtcblxuICBpZiAodGhpcy5fZW5kQ2FsbGVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJy5lbmQoKSB3YXMgY2FsbGVkIHR3aWNlLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gc3VwZXJhZ2VudCdcbiAgICApO1xuICB9XG5cbiAgdGhpcy5fZW5kQ2FsbGVkID0gdHJ1ZTtcblxuICAvLyBzdG9yZSBjYWxsYmFja1xuICB0aGlzLl9jYWxsYmFjayA9IGZuIHx8IG5vb3A7XG5cbiAgdGhpcy5fZW5kKCk7XG59O1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5fZW5kID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5fYWJvcnRlZClcbiAgICByZXR1cm4gdGhpcy5jYWxsYmFjayhcbiAgICAgIG5ldyBFcnJvcignVGhlIHJlcXVlc3QgaGFzIGJlZW4gYWJvcnRlZCBldmVuIGJlZm9yZSAuZW5kKCkgd2FzIGNhbGxlZCcpXG4gICAgKTtcblxuICBsZXQgZGF0YSA9IHRoaXMuX2RhdGE7XG4gIGNvbnN0IHsgcmVxIH0gPSB0aGlzO1xuICBjb25zdCB7IG1ldGhvZCB9ID0gdGhpcztcblxuICB0aGlzLl9zZXRUaW1lb3V0cygpO1xuXG4gIC8vIGJvZHlcbiAgaWYgKG1ldGhvZCAhPT0gJ0hFQUQnICYmICFyZXEuX2hlYWRlclNlbnQpIHtcbiAgICAvLyBzZXJpYWxpemUgc3R1ZmZcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09ICdzdHJpbmcnKSB7XG4gICAgICBsZXQgY29udGVudFR5cGUgPSByZXEuZ2V0SGVhZGVyKCdDb250ZW50LVR5cGUnKTtcbiAgICAgIC8vIFBhcnNlIG91dCBqdXN0IHRoZSBjb250ZW50IHR5cGUgZnJvbSB0aGUgaGVhZGVyIChpZ25vcmUgdGhlIGNoYXJzZXQpXG4gICAgICBpZiAoY29udGVudFR5cGUpIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGUuc3BsaXQoJzsnKVswXTtcbiAgICAgIGxldCBzZXJpYWxpemUgPSB0aGlzLl9zZXJpYWxpemVyIHx8IGV4cG9ydHMuc2VyaWFsaXplW2NvbnRlbnRUeXBlXTtcbiAgICAgIGlmICghc2VyaWFsaXplICYmIGlzSlNPTihjb250ZW50VHlwZSkpIHtcbiAgICAgICAgc2VyaWFsaXplID0gZXhwb3J0cy5zZXJpYWxpemVbJ2FwcGxpY2F0aW9uL2pzb24nXTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlcmlhbGl6ZSkgZGF0YSA9IHNlcmlhbGl6ZShkYXRhKTtcbiAgICB9XG5cbiAgICAvLyBjb250ZW50LWxlbmd0aFxuICAgIGlmIChkYXRhICYmICFyZXEuZ2V0SGVhZGVyKCdDb250ZW50LUxlbmd0aCcpKSB7XG4gICAgICByZXEuc2V0SGVhZGVyKFxuICAgICAgICAnQ29udGVudC1MZW5ndGgnLFxuICAgICAgICBCdWZmZXIuaXNCdWZmZXIoZGF0YSkgPyBkYXRhLmxlbmd0aCA6IEJ1ZmZlci5ieXRlTGVuZ3RoKGRhdGEpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlc3BvbnNlXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gIHJlcS5vbmNlKCdyZXNwb25zZScsIChyZXMpID0+IHtcbiAgICBkZWJ1ZygnJXMgJXMgLT4gJXMnLCB0aGlzLm1ldGhvZCwgdGhpcy51cmwsIHJlcy5zdGF0dXNDb2RlKTtcblxuICAgIGlmICh0aGlzLl9yZXNwb25zZVRpbWVvdXRUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3Jlc3BvbnNlVGltZW91dFRpbWVyKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5waXBlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1heCA9IHRoaXMuX21heFJlZGlyZWN0cztcbiAgICBjb25zdCBtaW1lID0gdXRpbHMudHlwZShyZXMuaGVhZGVyc1snY29udGVudC10eXBlJ10gfHwgJycpIHx8ICd0ZXh0L3BsYWluJztcbiAgICBsZXQgdHlwZSA9IG1pbWUuc3BsaXQoJy8nKVswXTtcbiAgICBpZiAodHlwZSkgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgY29uc3QgbXVsdGlwYXJ0ID0gdHlwZSA9PT0gJ211bHRpcGFydCc7XG4gICAgY29uc3QgcmVkaXJlY3QgPSBpc1JlZGlyZWN0KHJlcy5zdGF0dXNDb2RlKTtcbiAgICBjb25zdCByZXNwb25zZVR5cGUgPSB0aGlzLl9yZXNwb25zZVR5cGU7XG5cbiAgICB0aGlzLnJlcyA9IHJlcztcblxuICAgIC8vIHJlZGlyZWN0XG4gICAgaWYgKHJlZGlyZWN0ICYmIHRoaXMuX3JlZGlyZWN0cysrICE9PSBtYXgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWRpcmVjdChyZXMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gJ0hFQUQnKSB7XG4gICAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICAgICAgdGhpcy5jYWxsYmFjayhudWxsLCB0aGlzLl9lbWl0UmVzcG9uc2UoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gemxpYiBzdXBwb3J0XG4gICAgaWYgKHRoaXMuX3Nob3VsZERlY29tcHJlc3MocmVzKSkge1xuICAgICAgZGVjb21wcmVzcyhyZXEsIHJlcyk7XG4gICAgfVxuXG4gICAgbGV0IGJ1ZmZlciA9IHRoaXMuX2J1ZmZlcjtcbiAgICBpZiAoYnVmZmVyID09PSB1bmRlZmluZWQgJiYgbWltZSBpbiBleHBvcnRzLmJ1ZmZlcikge1xuICAgICAgYnVmZmVyID0gQm9vbGVhbihleHBvcnRzLmJ1ZmZlclttaW1lXSk7XG4gICAgfVxuXG4gICAgbGV0IHBhcnNlciA9IHRoaXMuX3BhcnNlcjtcbiAgICBpZiAodW5kZWZpbmVkID09PSBidWZmZXIgJiYgcGFyc2VyKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiQSBjdXN0b20gc3VwZXJhZ2VudCBwYXJzZXIgaGFzIGJlZW4gc2V0LCBidXQgYnVmZmVyaW5nIHN0cmF0ZWd5IGZvciB0aGUgcGFyc2VyIGhhc24ndCBiZWVuIGNvbmZpZ3VyZWQuIENhbGwgYHJlcS5idWZmZXIodHJ1ZSBvciBmYWxzZSlgIG9yIHNldCBgc3VwZXJhZ2VudC5idWZmZXJbbWltZV0gPSB0cnVlIG9yIGZhbHNlYFwiXG4gICAgICApO1xuICAgICAgYnVmZmVyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcnNlcikge1xuICAgICAgaWYgKHJlc3BvbnNlVHlwZSkge1xuICAgICAgICBwYXJzZXIgPSBleHBvcnRzLnBhcnNlLmltYWdlOyAvLyBJdCdzIGFjdHVhbGx5IGEgZ2VuZXJpYyBCdWZmZXJcbiAgICAgICAgYnVmZmVyID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAobXVsdGlwYXJ0KSB7XG4gICAgICAgIGNvbnN0IGZvcm0gPSBmb3JtaWRhYmxlLmZvcm1pZGFibGUoKTtcbiAgICAgICAgcGFyc2VyID0gKHJlcywgY2FsbGJhY2spID0+IHtcbiAgICAgICAgICAvLyBDcmVhdGUgYSBQYXNzVGhyb3VnaCBzdHJlYW0gdGhhdCBhY3RzIGFzIGEgcHJvcGVyIEhUVFAgcmVxdWVzdFxuICAgICAgICAgIGNvbnN0IGJyaWRnZVN0cmVhbSA9IG5ldyBTdHJlYW0uUGFzc1Rocm91Z2goKTtcblxuICAgICAgICAgIC8vIEFkZCBIVFRQIHJlcXVlc3QgcHJvcGVydGllcyBmcm9tIHRoZSBjdXJyZW50IHJlcXVlc3QgY29udGV4dFxuICAgICAgICAgIGJyaWRnZVN0cmVhbS5tZXRob2QgPSB0aGlzLm1ldGhvZCB8fCAnUE9TVCc7XG4gICAgICAgICAgYnJpZGdlU3RyZWFtLnVybCA9IHRoaXMudXJsIHx8ICcvJztcbiAgICAgICAgICBicmlkZ2VTdHJlYW0uaHR0cFZlcnNpb24gPSByZXMuaHR0cFZlcnNpb24gfHwgJzEuMSc7XG4gICAgICAgICAgYnJpZGdlU3RyZWFtLmhlYWRlcnMgPSByZXMuaGVhZGVycyB8fCB7fTtcbiAgICAgICAgICBicmlkZ2VTdHJlYW0uc29ja2V0ID0gcmVzLnNvY2tldCB8fCB7IHJlYWRhYmxlOiB0cnVlIH07XG5cbiAgICAgICAgICAvLyBQaXBlIHRoZSByZXNwb25zZSBkYXRhIHRocm91Z2ggdGhlIGJyaWRnZSBzdHJlYW1cbiAgICAgICAgICByZXMucGlwZShicmlkZ2VTdHJlYW0pO1xuXG4gICAgICAgICAgZm9ybS5wYXJzZShicmlkZ2VTdHJlYW0sIChlcnIsIGZpZWxkcywgZmlsZXMpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xuXG4gICAgICAgICAgICAvLyBGb3JtaWRhYmxlIHYzIGFsd2F5cyByZXR1cm5zIGFycmF5cywgYnV0IFN1cGVyQWdlbnQgZXhwZWN0cyBzaW5nbGUgdmFsdWVzXG4gICAgICAgICAgICAvLyBGbGF0dGVuIHNpbmdsZS1pdGVtIGFycmF5cyB0byBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgICBjb25zdCBmbGF0dGVuZWRGaWVsZHMgPSB7fTtcbiAgICAgICAgICAgIGlmIChmaWVsZHMpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZHNba2V5XTtcbiAgICAgICAgICAgICAgICBmbGF0dGVuZWRGaWVsZHNba2V5XSA9IEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMSA/IHZhbHVlWzBdIDogdmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmxhdHRlbmVkRmlsZXMgPSB7fTtcbiAgICAgICAgICAgIGlmIChmaWxlcykge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmaWxlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZmlsZXNba2V5XTtcbiAgICAgICAgICAgICAgICBmbGF0dGVuZWRGaWxlc1trZXldID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAxID8gdmFsdWVbMF0gOiB2YWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZXR1cm4gZmxhdHRlbmVkIGZpZWxkcyBhcyB0aGUgb2JqZWN0IHBhcmFtZXRlciB0byBtYXRjaCBTdXBlckFnZW50J3MgZXhwZWN0ZWQgZm9ybWF0XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCBmbGF0dGVuZWRGaWVsZHMsIGZsYXR0ZW5lZEZpbGVzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgYnVmZmVyID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoaXNCaW5hcnkobWltZSkpIHtcbiAgICAgICAgcGFyc2VyID0gZXhwb3J0cy5wYXJzZS5pbWFnZTtcbiAgICAgICAgYnVmZmVyID0gdHJ1ZTsgLy8gRm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IGJ1ZmZlcmluZyBkZWZhdWx0IGlzIGFkLWhvYyBNSU1FLWRlcGVuZGVudFxuICAgICAgfSBlbHNlIGlmIChleHBvcnRzLnBhcnNlW21pbWVdKSB7XG4gICAgICAgIHBhcnNlciA9IGV4cG9ydHMucGFyc2VbbWltZV07XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICBwYXJzZXIgPSBleHBvcnRzLnBhcnNlLnRleHQ7XG4gICAgICAgIGJ1ZmZlciA9IGJ1ZmZlciAhPT0gZmFsc2U7XG4gICAgICAgIC8vIGV2ZXJ5b25lIHdhbnRzIHRoZWlyIG93biB3aGl0ZS1sYWJlbGVkIGpzb25cbiAgICAgIH0gZWxzZSBpZiAoaXNKU09OKG1pbWUpKSB7XG4gICAgICAgIHBhcnNlciA9IGV4cG9ydHMucGFyc2VbJ2FwcGxpY2F0aW9uL2pzb24nXTtcbiAgICAgICAgYnVmZmVyID0gYnVmZmVyICE9PSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoYnVmZmVyKSB7XG4gICAgICAgIHBhcnNlciA9IGV4cG9ydHMucGFyc2UudGV4dDtcbiAgICAgIH0gZWxzZSBpZiAodW5kZWZpbmVkID09PSBidWZmZXIpIHtcbiAgICAgICAgcGFyc2VyID0gZXhwb3J0cy5wYXJzZS5pbWFnZTsgLy8gSXQncyBhY3R1YWxseSBhIGdlbmVyaWMgQnVmZmVyXG4gICAgICAgIGJ1ZmZlciA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYnkgZGVmYXVsdCBvbmx5IGJ1ZmZlciB0ZXh0LyosIGpzb24gYW5kIG1lc3NlZCB1cCB0aGluZyBmcm9tIGhlbGxcbiAgICBpZiAoKHVuZGVmaW5lZCA9PT0gYnVmZmVyICYmIGlzVGV4dChtaW1lKSkgfHwgaXNKU09OKG1pbWUpKSB7XG4gICAgICBidWZmZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuX3Jlc0J1ZmZlcmVkID0gYnVmZmVyO1xuICAgIGxldCBwYXJzZXJIYW5kbGVzRW5kID0gZmFsc2U7XG4gICAgaWYgKGJ1ZmZlcikge1xuICAgICAgLy8gUHJvdGVjdGlvbmEgYWdhaW5zdCB6aXAgYm9tYnMgYW5kIG90aGVyIG51aXNhbmNlXG4gICAgICBsZXQgcmVzcG9uc2VCeXRlc0xlZnQgPSB0aGlzLl9tYXhSZXNwb25zZVNpemUgfHwgMjAwMDAwMDAwO1xuICAgICAgcmVzLm9uKCdkYXRhJywgKGJ1ZikgPT4ge1xuICAgICAgICByZXNwb25zZUJ5dGVzTGVmdCAtPSBidWYuYnl0ZUxlbmd0aCB8fCBidWYubGVuZ3RoID4gMCA/IGJ1Zi5sZW5ndGggOiAwO1xuICAgICAgICBpZiAocmVzcG9uc2VCeXRlc0xlZnQgPCAwKSB7XG4gICAgICAgICAgLy8gVGhpcyB3aWxsIHByb3BhZ2F0ZSB0aHJvdWdoIGVycm9yIGV2ZW50XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ01heGltdW0gcmVzcG9uc2Ugc2l6ZSByZWFjaGVkJyk7XG4gICAgICAgICAgZXJyb3IuY29kZSA9ICdFVE9PTEFSR0UnO1xuICAgICAgICAgIC8vIFBhcnNlcnMgYXJlbid0IHJlcXVpcmVkIHRvIG9ic2VydmUgZXJyb3IgZXZlbnQsXG4gICAgICAgICAgLy8gc28gd291bGQgaW5jb3JyZWN0bHkgcmVwb3J0IHN1Y2Nlc3NcbiAgICAgICAgICBwYXJzZXJIYW5kbGVzRW5kID0gZmFsc2U7XG4gICAgICAgICAgLy8gV2lsbCBub3QgZW1pdCBlcnJvciBldmVudFxuICAgICAgICAgIHJlcy5kZXN0cm95KGVycm9yKTtcbiAgICAgICAgICAvLyBzbyB3ZSBkbyBjYWxsYmFjayBub3dcbiAgICAgICAgICB0aGlzLmNhbGxiYWNrKGVycm9yLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcnNlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVW5idWZmZXJlZCBwYXJzZXJzIGFyZSBzdXBwb3NlZCB0byBlbWl0IHJlc3BvbnNlIGVhcmx5LFxuICAgICAgICAvLyB3aGljaCBpcyB3ZWlyZCBCVFcsIGJlY2F1c2UgcmVzcG9uc2UuYm9keSB3b24ndCBiZSB0aGVyZS5cbiAgICAgICAgcGFyc2VySGFuZGxlc0VuZCA9IGJ1ZmZlcjtcblxuICAgICAgICBwYXJzZXIocmVzLCAoZXJyb3IsIG9iamVjdCwgZmlsZXMpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy50aW1lZG91dCkge1xuICAgICAgICAgICAgLy8gVGltZW91dCBoYXMgYWxyZWFkeSBoYW5kbGVkIGFsbCBjYWxsYmFja3NcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJbnRlbnRpb25hbCAobm9uLXRpbWVvdXQpIGFib3J0IGlzIHN1cHBvc2VkIHRvIHByZXNlcnZlIHBhcnRpYWwgcmVzcG9uc2UsXG4gICAgICAgICAgLy8gZXZlbiBpZiBpdCBkb2Vzbid0IHBhcnNlLlxuICAgICAgICAgIGlmIChlcnJvciAmJiAhdGhpcy5fYWJvcnRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FsbGJhY2soZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwYXJzZXJIYW5kbGVzRW5kKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhudWxsLCB0aGlzLl9lbWl0UmVzcG9uc2Uob2JqZWN0LCBmaWxlcykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5jYWxsYmFjayhlcnIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5yZXMgPSByZXM7XG5cbiAgICAvLyB1bmJ1ZmZlcmVkXG4gICAgaWYgKCFidWZmZXIpIHtcbiAgICAgIGRlYnVnKCd1bmJ1ZmZlcmVkICVzICVzJywgdGhpcy5tZXRob2QsIHRoaXMudXJsKTtcbiAgICAgIHRoaXMuY2FsbGJhY2sobnVsbCwgdGhpcy5fZW1pdFJlc3BvbnNlKCkpO1xuICAgICAgaWYgKG11bHRpcGFydCkgcmV0dXJuOyAvLyBhbGxvdyBtdWx0aXBhcnQgdG8gaGFuZGxlIGVuZCBldmVudFxuICAgICAgcmVzLm9uY2UoJ2VuZCcsICgpID0+IHtcbiAgICAgICAgZGVidWcoJ2VuZCAlcyAlcycsIHRoaXMubWV0aG9kLCB0aGlzLnVybCk7XG4gICAgICAgIHRoaXMuZW1pdCgnZW5kJyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB0ZXJtaW5hdGluZyBldmVudHNcbiAgICByZXMub25jZSgnZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIHBhcnNlckhhbmRsZXNFbmQgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2FsbGJhY2soZXJyb3IsIG51bGwpO1xuICAgIH0pO1xuICAgIGlmICghcGFyc2VySGFuZGxlc0VuZClcbiAgICAgIHJlcy5vbmNlKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgIGRlYnVnKCdlbmQgJXMgJXMnLCB0aGlzLm1ldGhvZCwgdGhpcy51cmwpO1xuICAgICAgICAvLyBUT0RPOiB1bmxlc3MgYnVmZmVyaW5nIGVtaXQgZWFybGllciB0byBzdHJlYW1cbiAgICAgICAgdGhpcy5lbWl0KCdlbmQnKTtcbiAgICAgICAgdGhpcy5jYWxsYmFjayhudWxsLCB0aGlzLl9lbWl0UmVzcG9uc2UoKSk7XG4gICAgICB9KTtcbiAgfSk7XG5cbiAgdGhpcy5lbWl0KCdyZXF1ZXN0JywgdGhpcyk7XG5cbiAgY29uc3QgZ2V0UHJvZ3Jlc3NNb25pdG9yID0gKCkgPT4ge1xuICAgIGNvbnN0IGxlbmd0aENvbXB1dGFibGUgPSB0cnVlO1xuICAgIGNvbnN0IHRvdGFsID0gcmVxLmdldEhlYWRlcignQ29udGVudC1MZW5ndGgnKTtcbiAgICBsZXQgbG9hZGVkID0gMDtcblxuICAgIGNvbnN0IHByb2dyZXNzID0gbmV3IFN0cmVhbS5UcmFuc2Zvcm0oKTtcbiAgICBwcm9ncmVzcy5fdHJhbnNmb3JtID0gKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spID0+IHtcbiAgICAgIGxvYWRlZCArPSBjaHVuay5sZW5ndGg7XG4gICAgICB0aGlzLmVtaXQoJ3Byb2dyZXNzJywge1xuICAgICAgICBkaXJlY3Rpb246ICd1cGxvYWQnLFxuICAgICAgICBsZW5ndGhDb21wdXRhYmxlLFxuICAgICAgICBsb2FkZWQsXG4gICAgICAgIHRvdGFsXG4gICAgICB9KTtcbiAgICAgIGNhbGxiYWNrKG51bGwsIGNodW5rKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHByb2dyZXNzO1xuICB9O1xuXG4gIGNvbnN0IGJ1ZmZlclRvQ2h1bmtzID0gKGJ1ZmZlcikgPT4ge1xuICAgIGNvbnN0IGNodW5rU2l6ZSA9IDE2ICogMTAyNDsgLy8gZGVmYXVsdCBoaWdoV2F0ZXJNYXJrIHZhbHVlXG4gICAgY29uc3QgY2h1bmtpbmcgPSBuZXcgU3RyZWFtLlJlYWRhYmxlKCk7XG4gICAgY29uc3QgdG90YWxMZW5ndGggPSBidWZmZXIubGVuZ3RoO1xuICAgIGNvbnN0IHJlbWFpbmRlciA9IHRvdGFsTGVuZ3RoICUgY2h1bmtTaXplO1xuICAgIGNvbnN0IGN1dG9mZiA9IHRvdGFsTGVuZ3RoIC0gcmVtYWluZGVyO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXRvZmY7IGkgKz0gY2h1bmtTaXplKSB7XG4gICAgICBjb25zdCBjaHVuayA9IGJ1ZmZlci5zbGljZShpLCBpICsgY2h1bmtTaXplKTtcbiAgICAgIGNodW5raW5nLnB1c2goY2h1bmspO1xuICAgIH1cblxuICAgIGlmIChyZW1haW5kZXIgPiAwKSB7XG4gICAgICBjb25zdCByZW1haW5kZXJCdWZmZXIgPSBidWZmZXIuc2xpY2UoLXJlbWFpbmRlcik7XG4gICAgICBjaHVua2luZy5wdXNoKHJlbWFpbmRlckJ1ZmZlcik7XG4gICAgfVxuXG4gICAgY2h1bmtpbmcucHVzaChudWxsKTsgLy8gbm8gbW9yZSBkYXRhXG5cbiAgICByZXR1cm4gY2h1bmtpbmc7XG4gIH07XG5cbiAgLy8gaWYgYSBGb3JtRGF0YSBpbnN0YW5jZSBnb3QgY3JlYXRlZCwgdGhlbiB3ZSBzZW5kIHRoYXQgYXMgdGhlIHJlcXVlc3QgYm9keVxuICBjb25zdCBmb3JtRGF0YSA9IHRoaXMuX2Zvcm1EYXRhO1xuICBpZiAoZm9ybURhdGEpIHtcbiAgICAvLyBzZXQgaGVhZGVyc1xuICAgIGNvbnN0IGhlYWRlcnMgPSBmb3JtRGF0YS5nZXRIZWFkZXJzKCk7XG4gICAgZm9yIChjb25zdCBpIGluIGhlYWRlcnMpIHtcbiAgICAgIGlmIChoYXNPd24oaGVhZGVycywgaSkpIHtcbiAgICAgICAgZGVidWcoJ3NldHRpbmcgRm9ybURhdGEgaGVhZGVyOiBcIiVzOiAlc1wiJywgaSwgaGVhZGVyc1tpXSk7XG4gICAgICAgIHJlcS5zZXRIZWFkZXIoaSwgaGVhZGVyc1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYXR0ZW1wdCB0byBnZXQgXCJDb250ZW50LUxlbmd0aFwiIGhlYWRlclxuICAgIGZvcm1EYXRhLmdldExlbmd0aCgoZXJyb3IsIGxlbmd0aCkgPT4ge1xuICAgICAgLy8gVE9ETzogQWRkIGNodW5rZWQgZW5jb2Rpbmcgd2hlbiBubyBsZW5ndGggKGlmIGVycilcbiAgICAgIGlmIChlcnJvcikgZGVidWcoJ2Zvcm1EYXRhLmdldExlbmd0aCBoYWQgZXJyb3InLCBlcnJvciwgbGVuZ3RoKTtcblxuICAgICAgZGVidWcoJ2dvdCBGb3JtRGF0YSBDb250ZW50LUxlbmd0aDogJXMnLCBsZW5ndGgpO1xuICAgICAgaWYgKHR5cGVvZiBsZW5ndGggPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJlcS5zZXRIZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJywgbGVuZ3RoKTtcbiAgICAgIH1cblxuICAgICAgZm9ybURhdGEucGlwZShnZXRQcm9ncmVzc01vbml0b3IoKSkucGlwZShyZXEpO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkge1xuICAgIGJ1ZmZlclRvQ2h1bmtzKGRhdGEpLnBpcGUoZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpLnBpcGUocmVxKTtcbiAgfSBlbHNlIHtcbiAgICByZXEuZW5kKGRhdGEpO1xuICB9XG59O1xuXG4vLyBDaGVjayB3aGV0aGVyIHJlc3BvbnNlIGhhcyBhIG5vbi0wLXNpemVkIGd6aXAtZW5jb2RlZCBib2R5XG5SZXF1ZXN0LnByb3RvdHlwZS5fc2hvdWxkRGVjb21wcmVzcyA9IChyZXMpID0+IHtcbiAgcmV0dXJuIGhhc05vbkVtcHR5UmVzcG9uc2VDb250ZW50KHJlcykgJiYgKGlzR3ppcE9yRGVmbGF0ZUVuY29kaW5nKHJlcykgfHwgaXNCcm90bGlFbmNvZGluZyhyZXMpKTtcbn07XG5cblxuLyoqXG4gKiBPdmVycmlkZXMgRE5TIGZvciBzZWxlY3RlZCBob3N0bmFtZXMuIFRha2VzIG9iamVjdCBtYXBwaW5nIGhvc3RuYW1lcyB0byBJUCBhZGRyZXNzZXMuXG4gKlxuICogV2hlbiBtYWtpbmcgYSByZXF1ZXN0IHRvIGEgVVJMIHdpdGggYSBob3N0bmFtZSBleGFjdGx5IG1hdGNoaW5nIGEga2V5IGluIHRoZSBvYmplY3QsXG4gKiB1c2UgdGhlIGdpdmVuIElQIGFkZHJlc3MgdG8gY29ubmVjdCwgaW5zdGVhZCBvZiB1c2luZyBETlMgdG8gcmVzb2x2ZSB0aGUgaG9zdG5hbWUuXG4gKlxuICogQSBzcGVjaWFsIGhvc3QgYCpgIG1hdGNoZXMgZXZlcnkgaG9zdG5hbWUgKGtlZXAgcmVkaXJlY3RzIGluIG1pbmQhKVxuICpcbiAqICAgICAgcmVxdWVzdC5jb25uZWN0KHtcbiAqICAgICAgICAndGVzdC5leGFtcGxlLmNvbSc6ICcxMjcuMC4wLjEnLFxuICogICAgICAgICdpcHY2LmV4YW1wbGUuY29tJzogJzo6MScsXG4gKiAgICAgIH0pXG4gKi9cblJlcXVlc3QucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbiAoY29ubmVjdE92ZXJyaWRlKSB7XG4gIGlmICh0eXBlb2YgY29ubmVjdE92ZXJyaWRlID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMuX2Nvbm5lY3RPdmVycmlkZSA9IHsgJyonOiBjb25uZWN0T3ZlcnJpZGUgfTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY29ubmVjdE92ZXJyaWRlID09PSAnb2JqZWN0Jykge1xuICAgIHRoaXMuX2Nvbm5lY3RPdmVycmlkZSA9IGNvbm5lY3RPdmVycmlkZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9jb25uZWN0T3ZlcnJpZGUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cblJlcXVlc3QucHJvdG90eXBlLnRydXN0TG9jYWxob3N0ID0gZnVuY3Rpb24gKHRvZ2dsZSkge1xuICB0aGlzLl90cnVzdExvY2FsaG9zdCA9IHRvZ2dsZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHRvZ2dsZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBnZW5lcmF0ZSBIVFRQIHZlcmIgbWV0aG9kc1xuaWYgKCFtZXRob2RzLmluY2x1ZGVzKCdkZWwnKSkge1xuICAvLyBjcmVhdGUgYSBjb3B5IHNvIHdlIGRvbid0IGNhdXNlIGNvbmZsaWN0cyB3aXRoXG4gIC8vIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBtZXRob2RzIHBhY2thZ2UgYW5kXG4gIC8vIG5wbSAzLnhcbiAgbWV0aG9kcyA9IFsuLi5tZXRob2RzXTtcbiAgbWV0aG9kcy5wdXNoKCdkZWwnKTtcbn1cblxuZm9yIChsZXQgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgY29uc3QgbmFtZSA9IG1ldGhvZDtcbiAgbWV0aG9kID0gbWV0aG9kID09PSAnZGVsJyA/ICdkZWxldGUnIDogbWV0aG9kO1xuXG4gIG1ldGhvZCA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuICByZXF1ZXN0W25hbWVdID0gKHVybCwgZGF0YSwgZm4pID0+IHtcbiAgICBjb25zdCByZXF1ZXN0XyA9IHJlcXVlc3QobWV0aG9kLCB1cmwpO1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZm4gPSBkYXRhO1xuICAgICAgZGF0YSA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIGlmIChtZXRob2QgPT09ICdHRVQnIHx8IG1ldGhvZCA9PT0gJ0hFQUQnKSB7XG4gICAgICAgIHJlcXVlc3RfLnF1ZXJ5KGRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVxdWVzdF8uc2VuZChkYXRhKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZm4pIHJlcXVlc3RfLmVuZChmbik7XG4gICAgcmV0dXJuIHJlcXVlc3RfO1xuICB9O1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGBtaW1lYCBpcyB0ZXh0IGFuZCBzaG91bGQgYmUgYnVmZmVyZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1pbWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGlzVGV4dChtaW1lKSB7XG4gIGNvbnN0IHBhcnRzID0gbWltZS5zcGxpdCgnLycpO1xuICBsZXQgdHlwZSA9IHBhcnRzWzBdO1xuICBpZiAodHlwZSkgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gIGxldCBzdWJ0eXBlID0gcGFydHNbMV07XG4gIGlmIChzdWJ0eXBlKSBzdWJ0eXBlID0gc3VidHlwZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcblxuICByZXR1cm4gdHlwZSA9PT0gJ3RleHQnIHx8IHN1YnR5cGUgPT09ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnO1xufVxuXG4vLyBUaGlzIGlzIG5vdCBhIGNhdGNoYWxsLCBidXQgYSBzdGFydC4gSXQgbWlnaHQgYmUgdXNlZnVsXG4vLyBpbiB0aGUgbG9uZyBydW4gdG8gaGF2ZSBmaWxlIHRoYXQgaW5jbHVkZXMgYWxsIGJpbmFyeVxuLy8gY29udGVudCB0eXBlcyBmcm9tIGh0dHBzOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL21lZGlhLXR5cGVzL21lZGlhLXR5cGVzLnhodG1sXG5mdW5jdGlvbiBpc0JpbmFyeShtaW1lKSB7XG4gIGxldCBbcmVnaXN0cnksIG5hbWVdID0gbWltZS5zcGxpdCgnLycpO1xuICBpZiAocmVnaXN0cnkpIHJlZ2lzdHJ5ID0gcmVnaXN0cnkudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gIGlmIChuYW1lKSBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgcmV0dXJuIChcbiAgICBbJ2F1ZGlvJywgJ2ZvbnQnLCAnaW1hZ2UnLCAndmlkZW8nXS5pbmNsdWRlcyhyZWdpc3RyeSkgfHxcbiAgICBbJ2d6JywgJ2d6aXAnXS5pbmNsdWRlcyhuYW1lKVxuICApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGBtaW1lYCBpcyBqc29uIG9yIGhhcyAranNvbiBzdHJ1Y3R1cmVkIHN5bnRheCBzdWZmaXguXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1pbWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc0pTT04obWltZSkge1xuICAvLyBzaG91bGQgbWF0Y2ggL2pzb24gb3IgK2pzb25cbiAgLy8gYnV0IG5vdCAvanNvbi1zZXFcbiAgcmV0dXJuIC9bLytdanNvbigkfFteLVxcd10pL2kudGVzdChtaW1lKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB3ZSBzaG91bGQgZm9sbG93IHRoZSByZWRpcmVjdCBgY29kZWAuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGNvZGVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc1JlZGlyZWN0KGNvZGUpIHtcbiAgcmV0dXJuIFszMDEsIDMwMiwgMzAzLCAzMDUsIDMwNywgMzA4XS5pbmNsdWRlcyhjb2RlKTtcbn1cblxuZnVuY3Rpb24gaGFzTm9uRW1wdHlSZXNwb25zZUNvbnRlbnQocmVzKSB7XG4gIGlmIChyZXMuc3RhdHVzQ29kZSA9PT0gMjA0IHx8IHJlcy5zdGF0dXNDb2RlID09PSAzMDQpIHtcbiAgICAvLyBUaGVzZSBhcmVuJ3Qgc3VwcG9zZWQgdG8gaGF2ZSBhbnkgYm9keVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGhlYWRlciBjb250ZW50IGlzIGEgc3RyaW5nLCBhbmQgZGlzdGluY3Rpb24gYmV0d2VlbiAwIGFuZCBubyBpbmZvcm1hdGlvbiBpcyBjcnVjaWFsXG4gIGlmIChyZXMuaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA9PT0gJzAnKSB7XG4gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBib2R5IGlzIGVtcHR5ICh1bmZvcnR1bmF0ZWx5LCB0aGlzIGNoZWNrIGRvZXMgbm90IGNvdmVyIGNodW5rZWQgZW5jb2RpbmcpXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBOztBQUVBLE1BQU07RUFBRUE7QUFBTyxDQUFDLEdBQUdDLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFDakMsTUFBTUMsTUFBTSxHQUFHRCxPQUFPLENBQUMsUUFBUSxDQUFDO0FBQ2hDLE1BQU1FLEtBQUssR0FBR0YsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUM5QixNQUFNRyxJQUFJLEdBQUdILE9BQU8sQ0FBQyxNQUFNLENBQUM7QUFDNUIsTUFBTUksRUFBRSxHQUFHSixPQUFPLENBQUMsSUFBSSxDQUFDO0FBQ3hCLE1BQU1LLElBQUksR0FBR0wsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUM1QixNQUFNTSxJQUFJLEdBQUdOLE9BQU8sQ0FBQyxNQUFNLENBQUM7QUFDNUIsTUFBTU8sRUFBRSxHQUFHUCxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQ3hCLE1BQU1RLElBQUksR0FBR1IsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUM1QixJQUFJUyxPQUFPLEdBQUdULE9BQU8sQ0FBQyxTQUFTLENBQUM7QUFDaEMsTUFBTVUsUUFBUSxHQUFHVixPQUFPLENBQUMsV0FBVyxDQUFDO0FBQ3JDLE1BQU1X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
1667
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmb3JtYXQiLCJyZXF1aXJlIiwiU3RyZWFtIiwiaHR0cHMiLCJodHRwIiwiZnMiLCJ6bGliIiwidXRpbCIsInFzIiwibWltZSIsIm1ldGhvZHMiLCJGb3JtRGF0YSIsImZvcm1pZGFibGUiLCJkZWJ1ZyIsIkNvb2tpZUphciIsInNhZmVTdHJpbmdpZnkiLCJ1dGlscyIsIlJlcXVlc3RCYXNlIiwiaHR0cDIiLCJkZWNvbXByZXNzIiwiUmVzcG9uc2UiLCJtaXhpbiIsImhhc093biIsImlzQnJvdGxpRW5jb2RpbmciLCJpc0d6aXBPckRlZmxhdGVFbmNvZGluZyIsImNob29zZURlY29tcHJlc3NlciIsInJlcXVlc3QiLCJtZXRob2QiLCJ1cmwiLCJleHBvcnRzIiwiUmVxdWVzdCIsImVuZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsIm1vZHVsZSIsImFnZW50Iiwibm9vcCIsImRpc3Bvc2VOb2RlUmVxdWVzdCIsInJlcXVlc3RfIiwicmVxIiwiX3JlcXVlc3REaXNwb3NlZCIsIl9zdHJlYW1SZXNwb25zZUxpc3RlbmVyIiwicmVtb3ZlTGlzdGVuZXIiLCJ1bmRlZmluZWQiLCJfc3RyZWFtUmVzcG9uc2UiLCJzZXNzaW9uIiwiZGVzdHJveSIsInNvY2tldCIsImFib3J0IiwiZXJyIiwicHJlc2VydmVEb3RTZWdtZW50cyIsInVybFN0cmluZyIsInBhcnRzIiwibWF0Y2giLCJyZXN0b3JlUGF0aCIsInBhdGgiLCJzZWdtZW50cyIsInByZWZpeCIsInJlcGxhY2UiLCJfIiwic2VnbWVudCIsIm1hcmtlciIsInB1c2giLCJyZXF1ZXN0UGF0aCIsInJlc3RvcmVkUGF0aCIsImluZGV4IiwiZW50cmllcyIsIndpdGhEZWZhdWx0UHJvdG9jb2wiLCJpbmRleE9mIiwiUkVESVJFQ1RfUFJPVE9DT0xTIiwiU2V0IiwiVU5JWF9TT0NLRVRfUFJPVE9DT0xTIiwiaXNBbGxvd2VkUmVkaXJlY3RUYXJnZXQiLCJjdXJyZW50IiwidGFyZ2V0IiwiaGFzIiwicHJvdG9jb2wiLCJob3N0bmFtZSIsImlzU2FtZU9yaWdpbiIsIm9yaWdpbiIsInBvcnQiLCJkZWZpbmUiLCJwcm90b2NvbHMiLCJzZXJpYWxpemUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLCJvYmplY3QiLCJzdHJpbmdpZnkiLCJpbmRpY2VzIiwic3RyaWN0TnVsbEhhbmRsaW5nIiwicGFyc2UiLCJCVUlMVF9JTl9QQVJTRVJTIiwidGV4dCIsImltYWdlIiwiQlVGRkVSSU5HX1BBUlNFUlMiLCJPYmplY3QiLCJrZXlzIiwibWFwIiwia2V5IiwiYnVmZmVyIiwiX2luaXRIZWFkZXJzIiwiX2hlYWRlciIsImhlYWRlciIsImNhbGwiLCJfZW5hYmxlSHR0cDIiLCJCb29sZWFuIiwicHJvY2VzcyIsImVudiIsIkhUVFAyX1RFU1QiLCJfYWdlbnQiLCJfZm9ybURhdGEiLCJ3cml0YWJsZSIsIl9yZWRpcmVjdHMiLCJyZWRpcmVjdHMiLCJjb29raWVzIiwiX3F1ZXJ5IiwicXNSYXciLCJfcmVkaXJlY3RMaXN0IiwiX3N0cmVhbVJlcXVlc3QiLCJfbG9va3VwIiwib25jZSIsImNsZWFyVGltZW91dCIsImJpbmQiLCJpbmhlcml0cyIsInByb3RvdHlwZSIsImJvb2wiLCJFcnJvciIsImF0dGFjaCIsImZpZWxkIiwiZmlsZSIsIm9wdGlvbnMiLCJfZGF0YSIsIm8iLCJmaWxlbmFtZSIsImNyZWF0ZVJlYWRTdHJlYW0iLCJvbiIsImVycm9yIiwiZm9ybURhdGEiLCJfZ2V0Rm9ybURhdGEiLCJlbWl0IiwiYXBwZW5kIiwiY2FsbGVkIiwiY2FsbGJhY2siLCJhZGRSZXF1ZXN0IiwiVHlwZUVycm9yIiwibG9va3VwIiwidHlwZSIsInNldCIsImluY2x1ZGVzIiwiZ2V0VHlwZSIsImFjY2VwdCIsInF1ZXJ5IiwidmFsdWUiLCJhc3NpZ24iLCJ3cml0ZSIsImRhdGEiLCJlbmNvZGluZyIsInJlcyIsInBpcGUiLCJzdHJlYW0iLCJwaXBlZCIsIl9waXBlQ29udGludWUiLCJpc1JlZGlyZWN0Iiwic3RhdHVzQ29kZSIsIl9tYXhSZWRpcmVjdHMiLCJfcmVkaXJlY3QiLCJfZW1pdFJlc3BvbnNlIiwiX2Fib3J0ZWQiLCJfc2hvdWxkRGVjb21wcmVzcyIsImRlY29tcHJlc3NlciIsImNvZGUiLCJfYnVmZmVyIiwiaGVhZGVycyIsImxvY2F0aW9uIiwicmVzdW1lIiwiVVJMIiwic3RhdHVzIiwiaHJlZiIsIl9lbWl0UHJlUmVkaXJlY3QiLCJnZXRIZWFkZXJzIiwiX2hlYWRlcnMiLCJjaGFuZ2VzT3JpZ2luIiwiY2xlYW5IZWFkZXIiLCJhdXRob3JpemF0aW9uIiwiY29va2llIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsImhvc3QiLCJfZW5kQ2FsbGVkIiwiX2VtaXRSZWRpcmVjdCIsIl9jYWxsYmFjayIsImF1dGgiLCJ1c2VyIiwicGFzcyIsImVuY29kZXIiLCJzdHJpbmciLCJCdWZmZXIiLCJmcm9tIiwidG9TdHJpbmciLCJfYXV0aCIsImNhIiwiY2VydCIsIl9jYSIsIl9rZXkiLCJwZngiLCJpc0J1ZmZlciIsIl9wZngiLCJfcGFzc3BocmFzZSIsInBhc3NwaHJhc2UiLCJfY2VydCIsImRpc2FibGVUTFNDZXJ0cyIsIl9kaXNhYmxlVExTQ2VydHMiLCJfZmluYWxpemVRdWVyeVN0cmluZyIsInJldHJpZXMiLCJfcmV0cmllcyIsInByb3RlY3RlZFVybCIsInBhdGhuYW1lIiwic2VhcmNoIiwidGVzdCIsInNwbGl0Iiwic29ja2V0UGF0aCIsIl9jb25uZWN0T3ZlcnJpZGUiLCJuZXdIb3N0IiwibmV3UG9ydCIsIm5vcm1hbGl6ZUhvc3RuYW1lIiwicmVqZWN0VW5hdXRob3JpemVkIiwiTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRCIsInNlcnZlcm5hbWUiLCJfdHJ1c3RMb2NhbGhvc3QiLCJtb2R1bGVfIiwic2V0UHJvdG9jb2wiLCJyZXNwb25zZSIsInNldE5vRGVsYXkiLCJzZXRIZWFkZXIiLCJlbWl0RHJhaW4iLCJ0ZW1wb3JhcnlKYXIiLCJzZXRDb29raWVzIiwiZ2V0Q29va2llcyIsIkNvb2tpZUFjY2Vzc0luZm8iLCJBbGwiLCJ0b1ZhbHVlU3RyaW5nIiwiX2Rpc3Bvc2VSZXF1ZXN0IiwiX2ZhaWxSZXF1ZXN0IiwiX3Nob3VsZFJldHJ5IiwiX3JldHJ5IiwiZm4iLCJ0aW1lZG91dCIsImNvbnNvbGUiLCJ3YXJuIiwiX2lzUmVzcG9uc2VPSyIsIm1lc3NhZ2UiLCJTVEFUVVNfQ09ERVMiLCJfbWF4UmV0cmllcyIsImxpc3RlbmVycyIsIl9pc0hvc3QiLCJib2R5IiwiZmlsZXMiLCJfZW5kIiwiX3NldFRpbWVvdXRzIiwiX2hlYWRlclNlbnQiLCJjb250ZW50VHlwZSIsImdldEhlYWRlciIsIl9zZXJpYWxpemVyIiwiaXNKU09OIiwiYnl0ZUxlbmd0aCIsInN0cmVhbVJlc3BvbnNlIiwiaGFuZGxlUmVzcG9uc2UiLCJfcmVzcG9uc2VUaW1lb3V0VGltZXIiLCJtYXgiLCJ0b0xvd2VyQ2FzZSIsInRyaW0iLCJtdWx0aXBhcnQiLCJyZWRpcmVjdCIsInJlc3BvbnNlVHlwZSIsIl9yZXNwb25zZVR5cGUiLCJwYXJzZXIiLCJfcGFyc2VyIiwiZm9ybSIsImJyaWRnZVN0cmVhbSIsIlBhc3NUaHJvdWdoIiwiaHR0cFZlcnNpb24iLCJyZWFkYWJsZSIsImZpZWxkcyIsImZsYXR0ZW5lZEZpZWxkcyIsImhhc093blByb3BlcnR5IiwiQXJyYXkiLCJpc0FycmF5IiwiZmxhdHRlbmVkRmlsZXMiLCJpc0JpbmFyeSIsImlzVGV4dCIsIl9yZXNCdWZmZXJlZCIsInBhcnNlckhhbmRsZXNFbmQiLCJyZXNwb25zZUJ5dGVzTGVmdCIsIl9tYXhSZXNwb25zZVNpemUiLCJleGNlZWRlZCIsImJ1ZiIsIlN0cmluZyIsInNldEVuY29kaW5nIiwiY29tcGxldGVBYm9ydGVkUmVzcG9uc2UiLCJuZXh0VGljayIsImdldFByb2dyZXNzTW9uaXRvciIsImxlbmd0aENvbXB1dGFibGUiLCJ0b3RhbCIsImxvYWRlZCIsInByb2dyZXNzIiwiVHJhbnNmb3JtIiwiX3RyYW5zZm9ybSIsImNodW5rIiwiZGlyZWN0aW9uIiwiYnVmZmVyVG9DaHVua3MiLCJjaHVua1NpemUiLCJjaHVua2luZyIsIlJlYWRhYmxlIiwidG90YWxMZW5ndGgiLCJyZW1haW5kZXIiLCJjdXRvZmYiLCJpIiwic2xpY2UiLCJyZW1haW5kZXJCdWZmZXIiLCJnZXRMZW5ndGgiLCJoYXNOb25FbXB0eVJlc3BvbnNlQ29udGVudCIsImNvbm5lY3QiLCJjb25uZWN0T3ZlcnJpZGUiLCJ0cnVzdExvY2FsaG9zdCIsInRvZ2dsZSIsIm5hbWUiLCJ0b1VwcGVyQ2FzZSIsInNlbmQiLCJzdWJ0eXBlIiwicmVnaXN0cnkiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbm9kZS9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxuY29uc3QgeyBmb3JtYXQgfSA9IHJlcXVpcmUoJ25vZGU6dXJsJyk7XG5jb25zdCBTdHJlYW0gPSByZXF1aXJlKCdub2RlOnN0cmVhbScpO1xuY29uc3QgaHR0cHMgPSByZXF1aXJlKCdub2RlOmh0dHBzJyk7XG5jb25zdCBodHRwID0gcmVxdWlyZSgnbm9kZTpodHRwJyk7XG5jb25zdCBmcyA9IHJlcXVpcmUoJ25vZGU6ZnMnKTtcbmNvbnN0IHpsaWIgPSByZXF1aXJlKCdub2RlOnpsaWInKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCdub2RlOnV0aWwnKTtcbmNvbnN0IHFzID0gcmVxdWlyZSgncXMnKTtcbmNvbnN0IG1pbWUgPSByZXF1aXJlKCdtaW1lJyk7XG5sZXQgbWV0aG9kcyA9IHJlcXVpcmUoJ21ldGhvZHMnKTtcbmNvbnN0IEZvcm1EYXRhID0gcmVxdWlyZSgnZm9ybS1kYXRhJyk7XG5jb25zdCBmb3JtaWRhYmxlID0gcmVxdWlyZSgnZm9ybWlkYWJsZScpO1xuY29uc3QgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdzdXBlcmFnZW50Jyk7XG5jb25zdCBDb29raWVKYXIgPSByZXF1aXJlKCdjb29raWVqYXInKTtcbmNvbnN0IHNhZmVTdHJpbmdpZnkgPSByZXF1aXJlKCdmYXN0LXNhZmUtc3RyaW5naWZ5Jyk7XG5cbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbmNvbnN0IFJlcXVlc3RCYXNlID0gcmVxdWlyZSgnLi4vcmVxdWVzdC1iYXNlJyk7XG5jb25zdCBodHRwMiA9IHJlcXVpcmUoJy4vaHR0cDJ3cmFwcGVyJyk7XG5jb25zdCB7IGRlY29tcHJlc3MgfSA9IHJlcXVpcmUoJy4vdW56aXAnKTtcbmNvbnN0IFJlc3BvbnNlID0gcmVxdWlyZSgnLi9yZXNwb25zZScpO1xuXG5jb25zdCB7IG1peGluLCBoYXNPd24sIGlzQnJvdGxpRW5jb2RpbmcsIGlzR3ppcE9yRGVmbGF0ZUVuY29kaW5nIH0gPSB1dGlscztcbmNvbnN0IHsgY2hvb3NlRGVjb21wcmVzc2VyIH0gPSByZXF1aXJlKCcuL2RlY29tcHJlc3MnKTtcblxuZnVuY3Rpb24gcmVxdWVzdChtZXRob2QsIHVybCkge1xuICAvLyBjYWxsYmFja1xuICBpZiAodHlwZW9mIHVybCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBuZXcgZXhwb3J0cy5SZXF1ZXN0KCdHRVQnLCBtZXRob2QpLmVuZCh1cmwpO1xuICB9XG5cbiAgLy8gdXJsIGZpcnN0XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIG5ldyBleHBvcnRzLlJlcXVlc3QoJ0dFVCcsIG1ldGhvZCk7XG4gIH1cblxuICByZXR1cm4gbmV3IGV4cG9ydHMuUmVxdWVzdChtZXRob2QsIHVybCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWVzdDtcbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBFeHBvc2UgYFJlcXVlc3RgLlxuICovXG5cbmV4cG9ydHMuUmVxdWVzdCA9IFJlcXVlc3Q7XG5cbi8qKlxuICogRXhwb3NlIHRoZSBhZ2VudCBmdW5jdGlvblxuICovXG5cbmV4cG9ydHMuYWdlbnQgPSByZXF1aXJlKCcuL2FnZW50Jyk7XG5cbi8qKlxuICogTm9vcC5cbiAqL1xuXG5mdW5jdGlvbiBub29wKCkge31cblxuLyoqXG4gKiBDbG9zZSBhbiB1bmRlcmx5aW5nIE5vZGUgcmVxdWVzdC9zZXNzaW9uIGNyZWF0ZWQgZHVyaW5nIHNldHVwLlxuICpcbiAqIFVzZWQgd2hlbiBoZWFkZXIgYXBwbGljYXRpb24gb3IgbGF0ZXIgcmVxdWVzdC1wYXRoIHdvcmsgdGhyb3dzIGFmdGVyXG4gKiBgaHR0cC5yZXF1ZXN0KClgIC8gYGh0dHAyLmNvbm5lY3QoKWAgaGFzIGFscmVhZHkgYWxsb2NhdGVkIGEgc29ja2V0LlxuICpcbiAqIEBwYXJhbSB7UmVxdWVzdH0gcmVxdWVzdF9cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkaXNwb3NlTm9kZVJlcXVlc3QocmVxdWVzdF8pIHtcbiAgY29uc3QgeyByZXEgfSA9IHJlcXVlc3RfO1xuICBpZiAoIXJlcSB8fCByZXF1ZXN0Xy5fcmVxdWVzdERpc3Bvc2VkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmVxdWVzdF8uX3JlcXVlc3REaXNwb3NlZCA9IHRydWU7XG4gIGlmIChyZXF1ZXN0Xy5fc3RyZWFtUmVzcG9uc2VMaXN0ZW5lcikge1xuICAgIHJlcS5yZW1vdmVMaXN0ZW5lcigncmVzcG9uc2UnLCByZXF1ZXN0Xy5fc3RyZWFtUmVzcG9uc2VMaXN0ZW5lcik7XG4gICAgcmVxdWVzdF8uX3N0cmVhbVJlc3BvbnNlTGlzdGVuZXIgPSB1bmRlZmluZWQ7XG4gICAgcmVxdWVzdF8uX3N0cmVhbVJlc3BvbnNlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBIVFRQLzIgd3JhcHBlciBrZWVwcyBhIHNlc3Npb24gb3BlbiBhcyBzb29uIGFzIHJlcXVlc3QoKSBpcyBjYWxsZWQuXG4gICAgLy8gUHJlZmVyIGRlc3Ryb3lpbmcgdGhhdCBzZXNzaW9uIHNvIHdlIG5ldmVyIGNhbGwgYWJvcnQoKSDihpIgZ2V0RnJhbWUoKVxuICAgIC8vIHdpdGggaW52YWxpZCBoZWFkZXJzICh3aGljaCB3b3VsZCBlbWl0IGEgbGF0ZSBwcm90b2NvbCBlcnJvcikuXG4gICAgaWYgKHJlcS5zZXNzaW9uICYmIHR5cGVvZiByZXEuc2Vzc2lvbi5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXEuc2Vzc2lvbi5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgaWYgKHJlcS5zb2NrZXQgJiYgdHlwZW9mIHJlcS5zb2NrZXQuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVxLnNvY2tldC5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZXEuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVxLmRlc3Ryb3koKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlcS5hYm9ydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVxLmFib3J0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZXEuZW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXEuZW5kKCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBkZWJ1ZygnZXJyb3IgZGlzcG9zaW5nIHJlcXVlc3QgYWZ0ZXIgc2V0dXAgZmFpbHVyZScsIGVycik7XG4gIH1cbn1cblxuLyoqXG4gKiBQcmVzZXJ2ZSBkb3Qtb25seSBwYXRoIHNlZ21lbnRzIHRoYXQgV0hBVFdHIFVSTCBub3JtYWxpemVzIGF3YXkuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFN0cmluZ1xuICogQHJldHVybnMge3t1cmxTdHJpbmc6IFN0cmluZywgcmVzdG9yZVBhdGg6IEZ1bmN0aW9ufX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBwcmVzZXJ2ZURvdFNlZ21lbnRzKHVybFN0cmluZykge1xuICBjb25zdCBwYXJ0cyA9IHVybFN0cmluZy5tYXRjaChcbiAgICAvXihbYS16XVthLXpcXGQrLi1dKjpcXC9cXC9bXi8/I10qKShbXj8jXSopKC4qKSQvaVxuICApO1xuICBpZiAoIXBhcnRzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVybFN0cmluZyxcbiAgICAgIHJlc3RvcmVQYXRoKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHNlZ21lbnRzID0gW107XG4gIGNvbnN0IHByZWZpeCA9ICdfX3N1cGVyYWdlbnRfZG90X3NlZ21lbnRfJztcbiAgY29uc3QgcGF0aCA9IHBhcnRzWzJdLnJlcGxhY2UoXG4gICAgL1xcLygoPzpcXC58JTJlKXsxLDJ9KSg/PVxcL3wkKS9naSxcbiAgICAoXywgc2VnbWVudCkgPT4ge1xuICAgICAgY29uc3QgbWFya2VyID0gYCR7cHJlZml4fSR7c2VnbWVudHMubGVuZ3RofV9fYDtcbiAgICAgIHNlZ21lbnRzLnB1c2goc2VnbWVudCk7XG4gICAgICByZXR1cm4gYC8ke21hcmtlcn1gO1xuICAgIH1cbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHVybFN0cmluZzogYCR7cGFydHNbMV19JHtwYXRofSR7cGFydHNbM119YCxcbiAgICByZXN0b3JlUGF0aChyZXF1ZXN0UGF0aCkge1xuICAgICAgbGV0IHJlc3RvcmVkUGF0aCA9IHJlcXVlc3RQYXRoO1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIHNlZ21lbnRdIG9mIHNlZ21lbnRzLmVudHJpZXMoKSkge1xuICAgICAgICByZXN0b3JlZFBhdGggPSByZXN0b3JlZFBhdGgucmVwbGFjZShgJHtwcmVmaXh9JHtpbmRleH1fX2AsIHNlZ21lbnQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdG9yZWRQYXRoO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGEgc2NoZW1lLWxlc3MgVVJMIHN0cmluZyB0byBodHRwOi8vLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxTdHJpbmdcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB3aXRoRGVmYXVsdFByb3RvY29sKHVybFN0cmluZykge1xuICByZXR1cm4gdXJsU3RyaW5nLmluZGV4T2YoJ2h0dHAnKSA9PT0gMCA/IHVybFN0cmluZyA6IGBodHRwOi8vJHt1cmxTdHJpbmd9YDtcbn1cblxuLyoqXG4gKiBQcm90b2NvbHMgYSByZWRpcmVjdCBtYXkgbGVhZCB0by4gQSByZXF1ZXN0IG1hZGUgb3ZlciBhIFVuaXggZG9tYWluIHNvY2tldFxuICogbWF5IGFkZGl0aW9uYWxseSBiZSByZWRpcmVjdGVkIHdpdGhpbiB0aGF0IHNhbWUgc29ja2V0IChzZWVcbiAqIGBpc0FsbG93ZWRSZWRpcmVjdFRhcmdldGApLlxuICovXG5jb25zdCBSRURJUkVDVF9QUk9UT0NPTFMgPSBuZXcgU2V0KFsnaHR0cDonLCAnaHR0cHM6J10pO1xuY29uc3QgVU5JWF9TT0NLRVRfUFJPVE9DT0xTID0gbmV3IFNldChbJ2h0dHArdW5peDonLCAnaHR0cHMrdW5peDonXSk7XG5cbi8qKlxuICogV2hldGhlciBhIHJlZGlyZWN0IGZyb20gYGN1cnJlbnRgIHRvIGB0YXJnZXRgIG1heSBiZSBmb2xsb3dlZC5cbiAqXG4gKiBPbmx5IGh0dHAocykgdGFyZ2V0cyBhcmUgZm9sbG93ZWQuIEEgcmVtb3RlIHNlcnZlciBtdXN0IG5ldmVyIGJlIGFibGUgdG9cbiAqIHN0ZWVyIHRoZSBjbGllbnQgaW50byBhIGxvY2FsIFVuaXggZG9tYWluIHNvY2tldCAoYGh0dHArdW5peDovL2ApIG9yIGFueVxuICogb3RoZXIgc2NoZW1lIHRocm91Z2ggYSBMb2NhdGlvbiBoZWFkZXI7IGEgcmVxdWVzdCB0aGF0IHdhcyBpdHNlbGYgbWFkZSBvdmVyXG4gKiBhIFVuaXggZG9tYWluIHNvY2tldCBtYXkgb25seSBiZSByZWRpcmVjdGVkIHdpdGhpbiB0aGF0IHNhbWUgc29ja2V0LlxuICpcbiAqIEBwYXJhbSB7VVJMfSBjdXJyZW50XG4gKiBAcGFyYW0ge1VSTH0gdGFyZ2V0XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGlzQWxsb3dlZFJlZGlyZWN0VGFyZ2V0KGN1cnJlbnQsIHRhcmdldCkge1xuICBpZiAoUkVESVJFQ1RfUFJPVE9DT0xTLmhhcyh0YXJnZXQucHJvdG9jb2wpKSByZXR1cm4gdHJ1ZTtcblxuICByZXR1cm4gKFxuICAgIFVOSVhfU09DS0VUX1BST1RPQ09MUy5oYXModGFyZ2V0LnByb3RvY29sKSAmJlxuICAgIHRhcmdldC5wcm90b2NvbCA9PT0gY3VycmVudC5wcm90b2NvbCAmJlxuICAgIHRhcmdldC5ob3N0bmFtZSAhPT0gJycgJiZcbiAgICB0YXJnZXQuaG9zdG5hbWUgPT09IGN1cnJlbnQuaG9zdG5hbWVcbiAgKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHR3byBVUkxzIHNoYXJlIGFuIG9yaWdpbi4gVW5peCBzb2NrZXQgVVJMcyBoYXZlIGFuIG9wYXF1ZSAoYG51bGxgKVxuICogV0hBVFdHIG9yaWdpbiwgc28gdGhleSBhcmUgY29tcGFyZWQgYnkgcHJvdG9jb2wgYW5kIHNvY2tldCBwYXRoIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHtVUkx9IGN1cnJlbnRcbiAqIEBwYXJhbSB7VVJMfSB0YXJnZXRcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaXNTYW1lT3JpZ2luKGN1cnJlbnQsIHRhcmdldCkge1xuICBpZiAoY3VycmVudC5vcmlnaW4gIT09ICdudWxsJyAmJiB0YXJnZXQub3JpZ2luICE9PSAnbnVsbCcpIHtcbiAgICByZXR1cm4gY3VycmVudC5vcmlnaW4gPT09IHRhcmdldC5vcmlnaW47XG4gIH1cblxuICByZXR1cm4gKFxuICAgIGN1cnJlbnQucHJvdG9jb2wgPT09IHRhcmdldC5wcm90b2NvbCAmJlxuICAgIGN1cnJlbnQuaG9zdG5hbWUgPT09IHRhcmdldC5ob3N0bmFtZSAmJlxuICAgIGN1cnJlbnQucG9ydCA9PT0gdGFyZ2V0LnBvcnRcbiAgKTtcbn1cblxuLyoqXG4gKiBFeHBvc2UgYFJlc3BvbnNlYC5cbiAqL1xuXG5leHBvcnRzLlJlc3BvbnNlID0gUmVzcG9uc2U7XG5cbi8qKlxuICogRGVmaW5lIFwiZm9ybVwiIG1pbWUgdHlwZS5cbiAqL1xuXG5taW1lLmRlZmluZShcbiAge1xuICAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOiBbJ2Zvcm0nLCAndXJsZW5jb2RlZCcsICdmb3JtLWRhdGEnXVxuICB9LFxuICB0cnVlXG4pO1xuXG4vKipcbiAqIFByb3RvY29sIG1hcC5cbiAqL1xuXG5leHBvcnRzLnByb3RvY29scyA9IHtcbiAgJ2h0dHA6JzogaHR0cCxcbiAgJ2h0dHBzOic6IGh0dHBzLFxuICAnaHR0cDI6JzogaHR0cDJcbn07XG5cbi8qKlxuICogRGVmYXVsdCBzZXJpYWxpemF0aW9uIG1hcC5cbiAqXG4gKiAgICAgc3VwZXJhZ2VudC5zZXJpYWxpemVbJ2FwcGxpY2F0aW9uL3htbCddID0gZnVuY3Rpb24ob2JqKXtcbiAqICAgICAgIHJldHVybiAnZ2VuZXJhdGVkIHhtbCBoZXJlJztcbiAqICAgICB9O1xuICpcbiAqL1xuXG5leHBvcnRzLnNlcmlhbGl6ZSA9IHtcbiAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcob2JqZWN0KSB7XG4gICAgcmV0dXJuIHFzLnN0cmluZ2lmeShvYmplY3QsIHsgaW5kaWNlczogZmFsc2UsIHN0cmljdE51bGxIYW5kbGluZzogdHJ1ZSB9KTtcbiAgfSxcbiAgJ2FwcGxpY2F0aW9uL2pzb24nOiBzYWZlU3RyaW5naWZ5LFxuICAvLyBDU1AgcmVwb3J0cyBjYXJyeSBKU09OIGJvZGllcyBidXQgdXNlIGEgZGlzdGluY3QgcmVnaXN0ZXJlZCBtZWRpYSB0eXBlLlxuICAnYXBwbGljYXRpb24vY3NwLXJlcG9ydCc6IHNhZmVTdHJpbmdpZnlcbn07XG5cbi8qKlxuICogRGVmYXVsdCBwYXJzZXJzLlxuICpcbiAqICAgICBzdXBlcmFnZW50LnBhcnNlWydhcHBsaWNhdGlvbi94bWwnXSA9IGZ1bmN0aW9uKHJlcywgZm4pe1xuICogICAgICAgZm4obnVsbCwgcmVzKTtcbiAqICAgICB9O1xuICpcbiAqL1xuXG5leHBvcnRzLnBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZXJzJyk7XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgcGFyc2VycyBhcyBzaGlwcGVkOyB0aGV5IG9ubHkgYWNjdW11bGF0ZSBhIGJ1ZmZlcmVkIGJvZHksIHNvXG4gKiB0aGV5IGFyZSBza2lwcGVkIGZvciB1bmJ1ZmZlcmVkIHJlc3BvbnNlcyAoc2VlIGBfZW5kYCkuIENhcHR1cmVkIGhlcmUgc29cbiAqIHRoYXQgYSBwYXJzZXIgYSB1c2VyIGluc3RhbGxzIHVuZGVyIHRoZSBzYW1lIGtleSBpcyBzdGlsbCBob25vdXJlZC5cbiAqL1xuY29uc3QgQlVJTFRfSU5fUEFSU0VSUyA9IHtcbiAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc6XG4gICAgZXhwb3J0cy5wYXJzZVsnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ10sXG4gICdhcHBsaWNhdGlvbi9qc29uJzogZXhwb3J0cy5wYXJzZVsnYXBwbGljYXRpb24vanNvbiddLFxuICB0ZXh0OiBleHBvcnRzLnBhcnNlLnRleHQsXG4gIGltYWdlOiBleHBvcnRzLnBhcnNlLmltYWdlXG59O1xuY29uc3QgQlVGRkVSSU5HX1BBUlNFUlMgPSBuZXcgU2V0KFxuICBPYmplY3Qua2V5cyhCVUlMVF9JTl9QQVJTRVJTKS5tYXAoKGtleSkgPT4gQlVJTFRfSU5fUEFSU0VSU1trZXldKVxuKTtcblxuLyoqXG4gKiBEZWZhdWx0IGJ1ZmZlcmluZyBtYXAuIENhbiBiZSB1c2VkIHRvIHNldCBjZXJ0YWluXG4gKiByZXNwb25zZSB0eXBlcyB0byBidWZmZXIvbm90IGJ1ZmZlci5cbiAqXG4gKiAgICAgc3VwZXJhZ2VudC5idWZmZXJbJ2FwcGxpY2F0aW9uL3htbCddID0gdHJ1ZTtcbiAqL1xuZXhwb3J0cy5idWZmZXIgPSB7fTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGludGVybmFsIGhlYWRlciB0cmFja2luZyBwcm9wZXJ0aWVzIG9uIGEgcmVxdWVzdCBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcmVxIHRoZSBpbnN0YW5jZVxuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIF9pbml0SGVhZGVycyhyZXF1ZXN0Xykge1xuICByZXF1ZXN0Xy5faGVhZGVyID0ge1xuICAgIC8vIGNvZXJjZXMgaGVhZGVyIG5hbWVzIHRvIGxvd2VyY2FzZVxuICB9O1xuICByZXF1ZXN0Xy5oZWFkZXIgPSB7XG4gICAgLy8gcHJlc2VydmVzIGhlYWRlciBuYW1lIGNhc2VcbiAgfTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBSZXF1ZXN0YCB3aXRoIHRoZSBnaXZlbiBgbWV0aG9kYCBhbmQgYHVybGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZFxuICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSB1cmxcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gUmVxdWVzdChtZXRob2QsIHVybCkge1xuICBTdHJlYW0uY2FsbCh0aGlzKTtcbiAgaWYgKHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnKSB1cmwgPSBmb3JtYXQodXJsKTtcbiAgdGhpcy5fZW5hYmxlSHR0cDIgPSBCb29sZWFuKHByb2Nlc3MuZW52LkhUVFAyX1RFU1QpOyAvLyBpbnRlcm5hbCBvbmx5XG4gIHRoaXMuX2FnZW50ID0gZmFsc2U7XG4gIHRoaXMuX2Zvcm1EYXRhID0gbnVsbDtcbiAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gIHRoaXMudXJsID0gdXJsO1xuICBfaW5pdEhlYWRlcnModGhpcyk7XG4gIHRoaXMud3JpdGFibGUgPSB0cnVlO1xuICB0aGlzLl9yZWRpcmVjdHMgPSAwO1xuICB0aGlzLnJlZGlyZWN0cyhtZXRob2QgPT09ICdIRUFEJyA/IDAgOiA1KTtcbiAgdGhpcy5jb29raWVzID0gJyc7XG4gIHRoaXMucXMgPSB7fTtcbiAgdGhpcy5fcXVlcnkgPSBbXTtcbiAgdGhpcy5xc1JhdyA9IHRoaXMuX3F1ZXJ5OyAvLyBVbnVzZWQsIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5XG4gIHRoaXMuX3JlZGlyZWN0TGlzdCA9IFtdO1xuICB0aGlzLl9zdHJlYW1SZXF1ZXN0ID0gZmFsc2U7XG4gIHRoaXMuX2xvb2t1cCA9IHVuZGVmaW5lZDtcbiAgdGhpcy5vbmNlKCdlbmQnLCB0aGlzLmNsZWFyVGltZW91dC5iaW5kKHRoaXMpKTtcbn1cblxuLyoqXG4gKiBJbmhlcml0IGZyb20gYFN0cmVhbWAgKHdoaWNoIGluaGVyaXRzIGZyb20gYEV2ZW50RW1pdHRlcmApLlxuICogTWl4aW4gYFJlcXVlc3RCYXNlYC5cbiAqL1xudXRpbC5pbmhlcml0cyhSZXF1ZXN0LCBTdHJlYW0pO1xuXG5taXhpbihSZXF1ZXN0LnByb3RvdHlwZSwgUmVxdWVzdEJhc2UucHJvdG90eXBlKTtcblxuLyoqXG4gKiBFbmFibGUgb3IgRGlzYWJsZSBodHRwMi5cbiAqXG4gKiBFbmFibGUgaHR0cDIuXG4gKlxuICogYGBgIGpzXG4gKiByZXF1ZXN0LmdldCgnaHR0cDovL2xvY2FsaG9zdC8nKVxuICogICAuaHR0cDIoKVxuICogICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiByZXF1ZXN0LmdldCgnaHR0cDovL2xvY2FsaG9zdC8nKVxuICogICAuaHR0cDIodHJ1ZSlcbiAqICAgLmVuZChjYWxsYmFjayk7XG4gKiBgYGBcbiAqXG4gKiBEaXNhYmxlIGh0dHAyLlxuICpcbiAqIGBgYCBqc1xuICogcmVxdWVzdCA9IHJlcXVlc3QuaHR0cDIoKTtcbiAqIHJlcXVlc3QuZ2V0KCdodHRwOi8vbG9jYWxob3N0LycpXG4gKiAgIC5odHRwMihmYWxzZSlcbiAqICAgLmVuZChjYWxsYmFjayk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZVxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmh0dHAyID0gZnVuY3Rpb24gKGJvb2wpIHtcbiAgaWYgKGV4cG9ydHMucHJvdG9jb2xzWydodHRwMjonXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ3N1cGVyYWdlbnQ6IHRoaXMgdmVyc2lvbiBvZiBOb2RlLmpzIGRvZXMgbm90IHN1cHBvcnQgaHR0cDInXG4gICAgKTtcbiAgfVxuXG4gIHRoaXMuX2VuYWJsZUh0dHAyID0gYm9vbCA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGJvb2w7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBRdWV1ZSB0aGUgZ2l2ZW4gYGZpbGVgIGFzIGFuIGF0dGFjaG1lbnQgdG8gdGhlIHNwZWNpZmllZCBgZmllbGRgLFxuICogd2l0aCBvcHRpb25hbCBgb3B0aW9uc2AgKG9yIGZpbGVuYW1lKS5cbiAqXG4gKiBgYGAganNcbiAqIHJlcXVlc3QucG9zdCgnaHR0cDovL2xvY2FsaG9zdC91cGxvYWQnKVxuICogICAuYXR0YWNoKCdmaWVsZCcsIEJ1ZmZlci5mcm9tKCc8Yj5IZWxsbyB3b3JsZDwvYj4nKSwgJ2hlbGxvLmh0bWwnKVxuICogICAuZW5kKGNhbGxiYWNrKTtcbiAqIGBgYFxuICpcbiAqIEEgZmlsZW5hbWUgbWF5IGFsc28gYmUgdXNlZDpcbiAqXG4gKiBgYGAganNcbiAqIHJlcXVlc3QucG9zdCgnaHR0cDovL2xvY2FsaG9zdC91cGxvYWQnKVxuICogICAuYXR0YWNoKCdmaWxlcycsICdpbWFnZS5qcGcnKVxuICogICAuZW5kKGNhbGxiYWNrKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFxuICogQHBhcmFtIHtTdHJpbmd8ZnMuUmVhZFN0cmVhbXxCdWZmZXJ9IGZpbGVcbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmF0dGFjaCA9IGZ1bmN0aW9uIChmaWVsZCwgZmlsZSwgb3B0aW9ucykge1xuICBpZiAoZmlsZSkge1xuICAgIGlmICh0aGlzLl9kYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdXBlcmFnZW50IGNhbid0IG1peCAuc2VuZCgpIGFuZCAuYXR0YWNoKClcIik7XG4gICAgfVxuXG4gICAgbGV0IG8gPSBvcHRpb25zIHx8IHt9O1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG8gPSB7IGZpbGVuYW1lOiBvcHRpb25zIH07XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmaWxlID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKCFvLmZpbGVuYW1lKSBvLmZpbGVuYW1lID0gZmlsZTtcbiAgICAgIGRlYnVnKCdjcmVhdGluZyBgZnMuUmVhZFN0cmVhbWAgaW5zdGFuY2UgZm9yIGZpbGU6ICVzJywgZmlsZSk7XG4gICAgICBmaWxlID0gZnMuY3JlYXRlUmVhZFN0cmVhbShmaWxlKTtcbiAgICAgIGZpbGUub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gdGhpcy5fZ2V0Rm9ybURhdGEoKTtcbiAgICAgICAgZm9ybURhdGEuZW1pdCgnZXJyb3InLCBlcnJvcik7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKCFvLmZpbGVuYW1lICYmIGZpbGUucGF0aCkge1xuICAgICAgby5maWxlbmFtZSA9IGZpbGUucGF0aDtcbiAgICB9XG5cbiAgICB0aGlzLl9nZXRGb3JtRGF0YSgpLmFwcGVuZChmaWVsZCwgZmlsZSwgbyk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cblJlcXVlc3QucHJvdG90eXBlLl9nZXRGb3JtRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLl9mb3JtRGF0YSkge1xuICAgIHRoaXMuX2Zvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgdGhpcy5fZm9ybURhdGEub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICBkZWJ1ZygnRm9ybURhdGEgZXJyb3InLCBlcnJvcik7XG4gICAgICBpZiAodGhpcy5jYWxsZWQpIHtcbiAgICAgICAgLy8gVGhlIHJlcXVlc3QgaGFzIGFscmVhZHkgZmluaXNoZWQgYW5kIHRoZSBjYWxsYmFjayB3YXMgY2FsbGVkLlxuICAgICAgICAvLyBTaWxlbnRseSBpZ25vcmUgdGhlIGVycm9yLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2FsbGJhY2soZXJyb3IpO1xuICAgICAgdGhpcy5hYm9ydCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX2Zvcm1EYXRhO1xufTtcblxuLyoqXG4gKiBHZXRzL3NldHMgdGhlIGBBZ2VudGAgdG8gdXNlIGZvciB0aGlzIEhUVFAgcmVxdWVzdC4gVGhlIGRlZmF1bHQgKGlmIHRoaXNcbiAqIGZ1bmN0aW9uIGlzIG5vdCBjYWxsZWQpIGlzIHRvIG9wdCBvdXQgb2YgY29ubmVjdGlvbiBwb29saW5nIChgYWdlbnQ6IGZhbHNlYCkuXG4gKlxuICogQHBhcmFtIHtodHRwLkFnZW50fSBhZ2VudFxuICogQHJldHVybiB7aHR0cC5BZ2VudH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuYWdlbnQgPSBmdW5jdGlvbiAoYWdlbnQpIHtcbiAgaWYgKFxuICAgIGFyZ3VtZW50cy5sZW5ndGggPiAwICYmXG4gICAgYWdlbnQgJiZcbiAgICB0eXBlb2YgYWdlbnQgPT09ICdvYmplY3QnICYmXG4gICAgdHlwZW9mIGFnZW50LmFkZFJlcXVlc3QgIT09ICdmdW5jdGlvbidcbiAgKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICcuYWdlbnQoKSBleHBlY3RzIGFuIGh0dHAocykuQWdlbnQtY29tcGF0aWJsZSBvYmplY3QuIERpZCB5b3UgbWVhbiB0byB1c2UgLmNlcnQoKSBhbmQgLmtleSgpPydcbiAgICApO1xuICB9XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB0aGlzLl9hZ2VudDtcbiAgdGhpcy5fYWdlbnQgPSBhZ2VudDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEdldHMvc2V0cyB0aGUgYGxvb2t1cGAgZnVuY3Rpb24gdG8gdXNlIGN1c3RvbSBETlMgcmVzb2x2ZXIuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gbG9va3VwXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUubG9va3VwID0gZnVuY3Rpb24gKGxvb2t1cCkge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRoaXMuX2xvb2t1cDtcbiAgdGhpcy5fbG9va3VwID0gbG9va3VwO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IF9Db250ZW50LVR5cGVfIHJlc3BvbnNlIGhlYWRlciBwYXNzZWQgdGhyb3VnaCBgbWltZS5nZXRUeXBlKClgLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgcmVxdWVzdC5wb3N0KCcvJylcbiAqICAgICAgICAudHlwZSgneG1sJylcbiAqICAgICAgICAuc2VuZCh4bWxzdHJpbmcpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogICAgICByZXF1ZXN0LnBvc3QoJy8nKVxuICogICAgICAgIC50eXBlKCdqc29uJylcbiAqICAgICAgICAuc2VuZChqc29uc3RyaW5nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqICAgICAgcmVxdWVzdC5wb3N0KCcvJylcbiAqICAgICAgICAudHlwZSgnYXBwbGljYXRpb24vanNvbicpXG4gKiAgICAgICAgLnNlbmQoanNvbnN0cmluZylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLnR5cGUgPSBmdW5jdGlvbiAodHlwZSkge1xuICByZXR1cm4gdGhpcy5zZXQoXG4gICAgJ0NvbnRlbnQtVHlwZScsXG4gICAgdHlwZS5pbmNsdWRlcygnLycpID8gdHlwZSA6IG1pbWUuZ2V0VHlwZSh0eXBlKVxuICApO1xufTtcblxuLyoqXG4gKiBTZXQgX0FjY2VwdF8gcmVzcG9uc2UgaGVhZGVyIHBhc3NlZCB0aHJvdWdoIGBtaW1lLmdldFR5cGUoKWAuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgICBzdXBlcmFnZW50LnR5cGVzLmpzb24gPSAnYXBwbGljYXRpb24vanNvbic7XG4gKlxuICogICAgICByZXF1ZXN0LmdldCgnL2FnZW50JylcbiAqICAgICAgICAuYWNjZXB0KCdqc29uJylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiAgICAgIHJlcXVlc3QuZ2V0KCcvYWdlbnQnKVxuICogICAgICAgIC5hY2NlcHQoJ2FwcGxpY2F0aW9uL2pzb24nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY2NlcHRcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5hY2NlcHQgPSBmdW5jdGlvbiAodHlwZSkge1xuICByZXR1cm4gdGhpcy5zZXQoJ0FjY2VwdCcsIHR5cGUuaW5jbHVkZXMoJy8nKSA/IHR5cGUgOiBtaW1lLmdldFR5cGUodHlwZSkpO1xufTtcblxuLyoqXG4gKiBBZGQgcXVlcnktc3RyaW5nIGB2YWxgLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgcmVxdWVzdC5nZXQoJy9zaG9lcycpXG4gKiAgICAgLnF1ZXJ5KCdzaXplPTEwJylcbiAqICAgICAucXVlcnkoeyBjb2xvcjogJ2JsdWUnIH0pXG4gKlxuICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2YWxcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5xdWVyeSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMuX3F1ZXJ5LnB1c2godmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5xcywgdmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFdyaXRlIHJhdyBgZGF0YWAgLyBgZW5jb2RpbmdgIHRvIHRoZSBzb2NrZXQuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ8U3RyaW5nfSBkYXRhXG4gKiBAcGFyYW0ge1N0cmluZ30gZW5jb2RpbmdcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGRhdGEsIGVuY29kaW5nKSB7XG4gIGNvbnN0IHJlcXVlc3RfID0gdGhpcy5yZXF1ZXN0KCk7XG4gIGlmICghdGhpcy5fc3RyZWFtUmVxdWVzdCkge1xuICAgIHRoaXMuX3N0cmVhbVJlcXVlc3QgPSB0cnVlO1xuICAgIHRoaXMuX3N0cmVhbVJlc3BvbnNlTGlzdGVuZXIgPSAocmVzKSA9PiB7XG4gICAgICB0aGlzLl9zdHJlYW1SZXNwb25zZSA9IHJlcztcbiAgICB9O1xuICAgIHJlcXVlc3RfLm9uY2UoJ3Jlc3BvbnNlJywgdGhpcy5fc3RyZWFtUmVzcG9uc2VMaXN0ZW5lcik7XG4gIH1cblxuICByZXR1cm4gcmVxdWVzdF8ud3JpdGUoZGF0YSwgZW5jb2RpbmcpO1xufTtcblxuLyoqXG4gKiBQaXBlIHRoZSByZXF1ZXN0IGJvZHkgdG8gYHN0cmVhbWAuXG4gKlxuICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge1N0cmVhbX1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uIChzdHJlYW0sIG9wdGlvbnMpIHtcbiAgdGhpcy5waXBlZCA9IHRydWU7IC8vIEhBQ0suLi5cbiAgdGhpcy5idWZmZXIoZmFsc2UpO1xuICB0aGlzLmVuZCgpO1xuICByZXR1cm4gdGhpcy5fcGlwZUNvbnRpbnVlKHN0cmVhbSwgb3B0aW9ucyk7XG59O1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5fcGlwZUNvbnRpbnVlID0gZnVuY3Rpb24gKHN0cmVhbSwgb3B0aW9ucykge1xuICB0aGlzLnJlcS5vbmNlKCdyZXNwb25zZScsIChyZXMpID0+IHtcbiAgICAvLyByZWRpcmVjdFxuICAgIGlmIChcbiAgICAgIGlzUmVkaXJlY3QocmVzLnN0YXR1c0NvZGUpICYmXG4gICAgICB0aGlzLl9yZWRpcmVjdHMrKyAhPT0gdGhpcy5fbWF4UmVkaXJlY3RzXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVkaXJlY3QocmVzKSA9PT0gdGhpc1xuICAgICAgICA/IHRoaXMuX3BpcGVDb250aW51ZShzdHJlYW0sIG9wdGlvbnMpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRoaXMucmVzID0gcmVzO1xuICAgIHRoaXMuX2VtaXRSZXNwb25zZSgpO1xuICAgIGlmICh0aGlzLl9hYm9ydGVkKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5fc2hvdWxkRGVjb21wcmVzcyhyZXMpKSB7XG4gICAgICBjb25zdCBkZWNvbXByZXNzZXIgPSBjaG9vc2VEZWNvbXByZXNzZXIocmVzKTtcblxuICAgICAgZGVjb21wcmVzc2VyLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ1pfQlVGX0VSUk9SJykge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaXMgaWdub3JlZCBieSBicm93c2VycyBhbmQgY3VybFxuICAgICAgICAgIHN0cmVhbS5lbWl0KCdlbmQnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcnJvcik7XG4gICAgICB9KTtcbiAgICAgIHJlcy5waXBlKGRlY29tcHJlc3NlcikucGlwZShzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgLy8gZG9uJ3QgZW1pdCAnZW5kJyB1bnRpbCBkZWNvbXByZXNzZXIgaGFzIGNvbXBsZXRlZCB3cml0aW5nIGFsbCBpdHMgZGF0YS5cbiAgICAgIGRlY29tcHJlc3Nlci5vbmNlKCdlbmQnLCAoKSA9PiB0aGlzLmVtaXQoJ2VuZCcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzLnBpcGUoc3RyZWFtLCBvcHRpb25zKTtcbiAgICAgIHJlcy5vbmNlKCdlbmQnLCAoKSA9PiB0aGlzLmVtaXQoJ2VuZCcpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gc3RyZWFtO1xufTtcblxuLyoqXG4gKiBFbmFibGUgLyBkaXNhYmxlIGJ1ZmZlcmluZy5cbiAqXG4gKiBAcmV0dXJuIHtCb29sZWFufSBbdmFsXVxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmJ1ZmZlciA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB0aGlzLl9idWZmZXIgPSB2YWx1ZSAhPT0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZWRpcmVjdCB0byBgdXJsXG4gKlxuICogQHBhcmFtIHtJbmNvbWluZ01lc3NhZ2V9IHJlc1xuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5fcmVkaXJlY3QgPSBmdW5jdGlvbiAocmVzKSB7XG4gIGxldCB1cmwgPSByZXMuaGVhZGVycy5sb2NhdGlvbjtcbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4gdGhpcy5jYWxsYmFjayhuZXcgRXJyb3IoJ05vIGxvY2F0aW9uIGhlYWRlciBmb3IgcmVkaXJlY3QnKSwgcmVzKTtcbiAgfVxuXG4gIGRlYnVnKCdyZWRpcmVjdCAlcyAtPiAlcycsIHRoaXMudXJsLCB1cmwpO1xuXG4gIC8vIGVuc3VyZSB0aGUgcmVzcG9uc2UgaXMgYmVpbmcgY29uc3VtZWRcbiAgLy8gdGhpcyBpcyByZXF1aXJlZCBmb3IgTm9kZSB2MC4xMCtcbiAgcmVzLnJlc3VtZSgpO1xuXG4gIC8vIGxvY2F0aW9uXG4gIC8vXG4gIC8vIFRoZSBMb2NhdGlvbiBoZWFkZXIgaXMgYXR0YWNrZXIgY29udHJvbGxlZDogYSBtYWxmb3JtZWQgdmFsdWUgbXVzdCBub3RcbiAgLy8gdGhyb3cgb3V0IG9mIHRoZSByZXNwb25zZSBldmVudCAod2hpY2ggd291bGQgY3Jhc2ggdGhlIHByb2Nlc3MpLCBhbmQgb25seVxuICAvLyBodHRwKHMpIHRhcmdldHMgbWF5IGJlIGZvbGxvd2VkLiBBIHJlbW90ZSBzZXJ2ZXIgbXVzdCBuZXZlciBiZSBhYmxlIHRvXG4gIC8vIHN0ZWVyIHRoZSBjbGllbnQgaW50byBhIGxvY2FsIFVuaXggZG9tYWluIHNvY2tldCBvciBhbm90aGVyIHNjaGVtZS5cbiAgbGV0IHRhcmdldDtcbiAgbGV0IGN1cnJlbnQ7XG4gIHRyeSB7XG4gICAgY3VycmVudCA9IG5ldyBVUkwod2l0aERlZmF1bHRQcm90b2NvbCh0aGlzLnVybCkpO1xuICAgIHRhcmdldCA9IG5ldyBVUkwodXJsLCBjdXJyZW50KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYEludmFsaWQgcmVkaXJlY3QgbG9jYXRpb246ICR7dXJsfWApO1xuICAgIGVycm9yLmNvZGUgPSAnRUlOVkFMSURSRURJUkVDVCc7XG4gICAgZXJyb3Iuc3RhdHVzID0gcmVzLnN0YXR1c0NvZGU7XG4gICAgZXJyb3IubG9jYXRpb24gPSB1cmw7XG4gICAgcmV0dXJuIHRoaXMuY2FsbGJhY2soZXJyb3IsIHJlcyk7XG4gIH1cblxuICBpZiAoIWlzQWxsb3dlZFJlZGlyZWN0VGFyZ2V0KGN1cnJlbnQsIHRhcmdldCkpIHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgIGBVbnN1cHBvcnRlZCBwcm90b2NvbCBpbiByZWRpcmVjdCBsb2NhdGlvbjogJHt0YXJnZXQuaHJlZn1gXG4gICAgKTtcbiAgICBlcnJvci5jb2RlID0gJ0VVTlNVUFBPUlRFRFJFRElSRUNUJztcbiAgICBlcnJvci5zdGF0dXMgPSByZXMuc3RhdHVzQ29kZTtcbiAgICBlcnJvci5sb2NhdGlvbiA9IHVybDtcbiAgICByZXR1cm4gdGhpcy5jYWxsYmFjayhlcnJvciwgcmVzKTtcbiAgfVxuXG4gIHVybCA9IHRhcmdldC5ocmVmO1xuXG4gIHRoaXMuX2VtaXRQcmVSZWRpcmVjdChyZXMpO1xuXG4gIGxldCBoZWFkZXJzID0gdGhpcy5yZXEuZ2V0SGVhZGVycyA/IHRoaXMucmVxLmdldEhlYWRlcnMoKSA6IHRoaXMucmVxLl9oZWFkZXJzO1xuXG4gIGNvbnN0IGNoYW5nZXNPcmlnaW4gPSAhaXNTYW1lT3JpZ2luKGN1cnJlbnQsIHRhcmdldCk7XG5cbiAgLy8gaW1wbGVtZW50YXRpb24gb2YgMzAyIGZvbGxvd2luZyBkZWZhY3RvIHN0YW5kYXJkXG4gIGlmIChyZXMuc3RhdHVzQ29kZSA9PT0gMzAxIHx8IHJlcy5zdGF0dXNDb2RlID09PSAzMDIpIHtcbiAgICAvLyBzdHJpcCBDb250ZW50LSogcmVsYXRlZCBmaWVsZHNcbiAgICAvLyBpbiBjYXNlIG9mIFBPU1QgZXRjXG4gICAgaGVhZGVycyA9IHV0aWxzLmNsZWFuSGVhZGVyKGhlYWRlcnMsIGNoYW5nZXNPcmlnaW4pO1xuXG4gICAgLy8gZm9yY2UgR0VUXG4gICAgdGhpcy5tZXRob2QgPSB0aGlzLm1ldGhvZCA9PT0gJ0hFQUQnID8gJ0hFQUQnIDogJ0dFVCc7XG5cbiAgICAvLyBjbGVhciBkYXRhXG4gICAgdGhpcy5fZGF0YSA9IG51bGw7XG4gIH1cblxuICAvLyAzMDMgaXMgYWx3YXlzIEdFVFxuICBpZiAocmVzLnN0YXR1c0NvZGUgPT09IDMwMykge1xuICAgIC8vIHN0cmlwIENvbnRlbnQtKiByZWxhdGVkIGZpZWxkc1xuICAgIC8vIGluIGNhc2Ugb2YgUE9TVCBldGNcbiAgICBoZWFkZXJzID0gdXRpbHMuY2xlYW5IZWFkZXIoaGVhZGVycywgY2hhbmdlc09yaWdpbik7XG5cbiAgICAvLyBmb3JjZSBtZXRob2RcbiAgICB0aGlzLm1ldGhvZCA9ICdHRVQnO1xuXG4gICAgLy8gY2xlYXIgZGF0YVxuICAgIHRoaXMuX2RhdGEgPSBudWxsO1xuICB9XG5cbiAgLy8gMzA3IHByZXNlcnZlcyBtZXRob2RcbiAgLy8gMzA4IHByZXNlcnZlcyBtZXRob2RcbiAgaWYgKChyZXMuc3RhdHVzQ29kZSA9PT0gMzA3IHx8IHJlcy5zdGF0dXNDb2RlID09PSAzMDgpICYmIGNoYW5nZXNPcmlnaW4pIHtcbiAgICBkZWxldGUgaGVhZGVycy5hdXRob3JpemF0aW9uO1xuICAgIGRlbGV0ZSBoZWFkZXJzLmNvb2tpZTtcbiAgfVxuXG4gIC8vIGNyZWRlbnRpYWxzIGdpdmVuIHdpdGggYC5hdXRoKHVzZXIsIHBhc3MsIHsgdHlwZTogJ2F1dG8nIH0pYCBhcmUgdHVybmVkXG4gIC8vIGludG8gYW4gQXV0aG9yaXphdGlvbiBoZWFkZXIgYnkgZXZlcnkgYHJlcXVlc3QoKWAgY2FsbCwgc28gdGhleSBtdXN0IGJlXG4gIC8vIGRyb3BwZWQgYXMgd2VsbCBvciB0aGV5IHdvdWxkIGJlIHJlLXNlbnQgdG8gdGhlIG5ldyBvcmlnaW5cbiAgaWYgKGNoYW5nZXNPcmlnaW4pIHtcbiAgICB0aGlzLnVzZXJuYW1lID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucGFzc3dvcmQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBkZWxldGUgaGVhZGVycy5ob3N0O1xuXG4gIGRlbGV0ZSB0aGlzLnJlcTtcbiAgZGVsZXRlIHRoaXMuX2Zvcm1EYXRhO1xuXG4gIC8vIHJlbW92ZSBhbGwgYWRkIGhlYWRlciBleGNlcHQgVXNlci1BZ2VudFxuICBfaW5pdEhlYWRlcnModGhpcyk7XG5cbiAgLy8gcmVkaXJlY3RcbiAgdGhpcy5yZXMgPSByZXM7XG4gIHRoaXMuX2VuZENhbGxlZCA9IGZhbHNlO1xuICB0aGlzLnVybCA9IHVybDtcbiAgdGhpcy5xcyA9IHt9O1xuICB0aGlzLl9xdWVyeS5sZW5ndGggPSAwO1xuICB0aGlzLnNldChoZWFkZXJzKTtcbiAgdGhpcy5fZW1pdFJlZGlyZWN0KCk7XG4gIHRoaXMuX3JlZGlyZWN0TGlzdC5wdXNoKHRoaXMudXJsKTtcbiAgdGhpcy5lbmQodGhpcy5fY2FsbGJhY2spO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IEF1dGhvcml6YXRpb24gZmllbGQgdmFsdWUgd2l0aCBgdXNlcmAgYW5kIGBwYXNzYC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgIC5hdXRoKCd0b2JpJywgJ2xlYXJuYm9vc3QnKVxuICogICAuYXV0aCgndG9iaTpsZWFybmJvb3N0JylcbiAqICAgLmF1dGgoJ3RvYmknKVxuICogICAuYXV0aChhY2Nlc3NUb2tlbiwgeyB0eXBlOiAnYmVhcmVyJyB9KVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1c2VyXG4gKiBAcGFyYW0ge1N0cmluZ30gW3Bhc3NdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIG9wdGlvbnMgd2l0aCBhdXRob3JpemF0aW9uIHR5cGUgJ2Jhc2ljJyBvciAnYmVhcmVyJyAoJ2Jhc2ljJyBpcyBkZWZhdWx0KVxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmF1dGggPSBmdW5jdGlvbiAodXNlciwgcGFzcywgb3B0aW9ucykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgcGFzcyA9ICcnO1xuICBpZiAodHlwZW9mIHBhc3MgPT09ICdvYmplY3QnICYmIHBhc3MgIT09IG51bGwpIHtcbiAgICAvLyBwYXNzIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvcHRpb25zXG4gICAgb3B0aW9ucyA9IHBhc3M7XG4gICAgcGFzcyA9ICcnO1xuICB9XG5cbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHsgdHlwZTogJ2Jhc2ljJyB9O1xuICB9XG5cbiAgY29uc3QgZW5jb2RlciA9IChzdHJpbmcpID0+IEJ1ZmZlci5mcm9tKHN0cmluZykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gIHJldHVybiB0aGlzLl9hdXRoKHVzZXIsIHBhc3MsIG9wdGlvbnMsIGVuY29kZXIpO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGNlcnRpZmljYXRlIGF1dGhvcml0eSBvcHRpb24gZm9yIGh0dHBzIHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIHtCdWZmZXIgfCBBcnJheX0gY2VydFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmNhID0gZnVuY3Rpb24gKGNlcnQpIHtcbiAgdGhpcy5fY2EgPSBjZXJ0O1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBjbGllbnQgY2VydGlmaWNhdGUga2V5IG9wdGlvbiBmb3IgaHR0cHMgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlciB8IFN0cmluZ30gY2VydFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmtleSA9IGZ1bmN0aW9uIChjZXJ0KSB7XG4gIHRoaXMuX2tleSA9IGNlcnQ7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGtleSwgY2VydGlmaWNhdGUsIGFuZCBDQSBjZXJ0cyBvZiB0aGUgY2xpZW50IGluIFBGWCBvciBQS0NTMTIgZm9ybWF0LlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyIHwgU3RyaW5nfSBjZXJ0XG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUucGZ4ID0gZnVuY3Rpb24gKGNlcnQpIHtcbiAgaWYgKHR5cGVvZiBjZXJ0ID09PSAnb2JqZWN0JyAmJiAhQnVmZmVyLmlzQnVmZmVyKGNlcnQpKSB7XG4gICAgdGhpcy5fcGZ4ID0gY2VydC5wZng7XG4gICAgdGhpcy5fcGFzc3BocmFzZSA9IGNlcnQucGFzc3BocmFzZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9wZnggPSBjZXJ0O1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgY2xpZW50IGNlcnRpZmljYXRlIG9wdGlvbiBmb3IgaHR0cHMgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlciB8IFN0cmluZ30gY2VydFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmNlcnQgPSBmdW5jdGlvbiAoY2VydCkge1xuICB0aGlzLl9jZXJ0ID0gY2VydDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIERvIG5vdCByZWplY3QgZXhwaXJlZCBvciBpbnZhbGlkIFRMUyBjZXJ0cy5cbiAqIHNldHMgYHJlamVjdFVuYXV0aG9yaXplZD10cnVlYC4gQmUgd2FybmVkIHRoYXQgdGhpcyBhbGxvd3MgTUlUTSBhdHRhY2tzLlxuICpcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5kaXNhYmxlVExTQ2VydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2Rpc2FibGVUTFNDZXJ0cyA9IHRydWU7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gYW4gaHR0cFtzXSByZXF1ZXN0LlxuICpcbiAqIEByZXR1cm4ge091dGdvaW5nTWVzc2FnZX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5SZXF1ZXN0LnByb3RvdHlwZS5yZXF1ZXN0ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5yZXEpIHJldHVybiB0aGlzLnJlcTtcblxuICBjb25zdCBvcHRpb25zID0ge307XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBxdWVyeSA9IHFzLnN0cmluZ2lmeSh0aGlzLnFzLCB7XG4gICAgICBpbmRpY2VzOiBmYWxzZSxcbiAgICAgIHN0cmljdE51bGxIYW5kbGluZzogdHJ1ZVxuICAgIH0pO1xuICAgIGlmIChxdWVyeSkge1xuICAgICAgdGhpcy5xcyA9IHt9O1xuICAgICAgdGhpcy5fcXVlcnkucHVzaChxdWVyeSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZmluYWxpemVRdWVyeVN0cmluZygpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gIH1cblxuICBjb25zdCB1cmxTdHJpbmcgPSB3aXRoRGVmYXVsdFByb3RvY29sKHRoaXMudXJsKTtcbiAgY29uc3QgcmV0cmllcyA9IHRoaXMuX3JldHJpZXM7XG5cbiAgY29uc3QgcHJvdGVjdGVkVXJsID0gcHJlc2VydmVEb3RTZWdtZW50cyh1cmxTdHJpbmcpO1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKHByb3RlY3RlZFVybC51cmxTdHJpbmcpO1xuICBsZXQgeyBwcm90b2NvbCB9ID0gdXJsO1xuICBjb25zdCBwYXRoID0gcHJvdGVjdGVkVXJsLnJlc3RvcmVQYXRoKGAke3VybC5wYXRobmFtZX0ke3VybC5zZWFyY2h9YCk7XG5cbiAgLy8gc3VwcG9ydCB1bml4IHNvY2tldHNcbiAgaWYgKC9eaHR0cHM/XFwrdW5peDovLnRlc3QocHJvdG9jb2wpID09PSB0cnVlKSB7XG4gICAgLy8gZ2V0IHRoZSBwcm90b2NvbFxuICAgIHByb3RvY29sID0gYCR7cHJvdG9jb2wuc3BsaXQoJysnKVswXX06YDtcblxuICAgIGlmICghdXJsLmhvc3RuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdJbnZhbGlkIHVuaXggc29ja2V0IFVSTDogcGVyY2VudC1lbmNvZGUgdGhlIHNvY2tldCBwYXRoIGJ5IHJlcGxhY2luZyBcIi9cIiB3aXRoIFwiJTJGXCIuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBnZXQgdGhlIHNvY2tldCBwYXRoXG4gICAgb3B0aW9ucy5zb2NrZXRQYXRoID0gdXJsLmhvc3RuYW1lLnJlcGxhY2UoLyUyRi9nLCAnLycpO1xuICAgIHVybC5ob3N0ID0gJyc7XG4gICAgdXJsLmhvc3RuYW1lID0gJyc7XG4gIH1cblxuICAvLyBPdmVycmlkZSBJUCBhZGRyZXNzIG9mIGEgaG9zdG5hbWVcbiAgaWYgKHRoaXMuX2Nvbm5lY3RPdmVycmlkZSkge1xuICAgIGNvbnN0IHsgaG9zdG5hbWUgfSA9IHVybDtcbiAgICAvLyB0aGUgaG9zdG5hbWUgbWF5IGNvbWUgZnJvbSBhIHJlZGlyZWN0LCBzbyBuZXZlciBsZXQgYW4gaW5oZXJpdGVkIGtleVxuICAgIC8vIHN1Y2ggYXMgXCJjb25zdHJ1Y3RvclwiIGFjdCBhcyBhbiBvdmVycmlkZSBlbnRyeVxuICAgIGNvbnN0IG1hdGNoID0gaGFzT3duKHRoaXMuX2Nvbm5lY3RPdmVycmlkZSwgaG9zdG5hbWUpXG4gICAgICA/IHRoaXMuX2Nvbm5lY3RPdmVycmlkZVtob3N0bmFtZV1cbiAgICAgIDogdGhpcy5fY29ubmVjdE92ZXJyaWRlWycqJ107XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAvLyBiYWNrdXAgdGhlIHJlYWwgaG9zdFxuICAgICAgaWYgKCF0aGlzLl9oZWFkZXIuaG9zdCkge1xuICAgICAgICB0aGlzLnNldCgnaG9zdCcsIHVybC5ob3N0KTtcbiAgICAgIH1cblxuICAgICAgbGV0IG5ld0hvc3Q7XG4gICAgICBsZXQgbmV3UG9ydDtcblxuICAgICAgaWYgKHR5cGVvZiBtYXRjaCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgbmV3SG9zdCA9IG1hdGNoLmhvc3Q7XG4gICAgICAgIG5ld1BvcnQgPSBtYXRjaC5wb3J0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3SG9zdCA9IG1hdGNoO1xuICAgICAgICBuZXdQb3J0ID0gdXJsLnBvcnQ7XG4gICAgICB9XG5cbiAgICAgIC8vIHdyYXAgW2lwdjZdXG4gICAgICB1cmwuaG9zdCA9IC86Ly50ZXN0KG5ld0hvc3QpID8gYFske25ld0hvc3R9XWAgOiBuZXdIb3N0O1xuICAgICAgaWYgKG5ld1BvcnQpIHtcbiAgICAgICAgdXJsLmhvc3QgKz0gYDoke25ld1BvcnR9YDtcbiAgICAgICAgdXJsLnBvcnQgPSBuZXdQb3J0O1xuICAgICAgfVxuXG4gICAgICB1cmwuaG9zdG5hbWUgPSBuZXdIb3N0O1xuICAgIH1cbiAgfVxuXG4gIC8vIG9wdGlvbnNcbiAgb3B0aW9ucy5tZXRob2QgPSB0aGlzLm1ldGhvZDtcbiAgb3B0aW9ucy5wb3J0ID0gdXJsLnBvcnQ7XG4gIG9wdGlvbnMucGF0aCA9IHBhdGg7XG4gIG9wdGlvbnMuaG9zdCA9IHV0aWxzLm5vcm1hbGl6ZUhvc3RuYW1lKHVybC5ob3N0bmFtZSk7IC8vIGV4OiBbOjoxXSAtPiA6OjFcbiAgLy8gQXBwbHkgdXNlciBoZWFkZXJzIGJlZm9yZSBjb25uZWN0aW5nIHNvIGludmFsaWQgdmFsdWVzIChlLmcuIHVuZGVmaW5lZClcbiAgLy8gdGhyb3cgd2l0aG91dCBhbGxvY2F0aW5nIGEgVENQIGhhbmRsZS4gU2VlICMxODI3LlxuICAvLyBIVFRQLzIncyB3cmFwcGVyIGZvcndhcmRzIGxlZnRvdmVyIG9wdGlvbnMgdG8gaHR0cDIuY29ubmVjdCgpLCBzbyBvbmx5XG4gIC8vIGRvIHRoaXMgb24gSFRUUC8xLlxuICBpZiAoIXRoaXMuX2VuYWJsZUh0dHAyKSB7XG4gICAgb3B0aW9ucy5oZWFkZXJzID0geyAuLi50aGlzLmhlYWRlciB9O1xuICB9XG5cbiAgb3B0aW9ucy5jYSA9IHRoaXMuX2NhO1xuICBvcHRpb25zLmtleSA9IHRoaXMuX2tleTtcbiAgb3B0aW9ucy5wZnggPSB0aGlzLl9wZng7XG4gIG9wdGlvbnMuY2VydCA9IHRoaXMuX2NlcnQ7XG4gIG9wdGlvbnMucGFzc3BocmFzZSA9IHRoaXMuX3Bhc3NwaHJhc2U7XG4gIG9wdGlvbnMuYWdlbnQgPSB0aGlzLl9hZ2VudDtcbiAgb3B0aW9ucy5sb29rdXAgPSB0aGlzLl9sb29rdXA7XG4gIG9wdGlvbnMucmVqZWN0VW5hdXRob3JpemVkID1cbiAgICB0eXBlb2YgdGhpcy5fZGlzYWJsZVRMU0NlcnRzID09PSAnYm9vbGVhbidcbiAgICAgID8gIXRoaXMuX2Rpc2FibGVUTFNDZXJ0c1xuICAgICAgOiBwcm9jZXNzLmVudi5OT0RFX1RMU19SRUpFQ1RfVU5BVVRIT1JJWkVEICE9PSAnMCc7XG5cbiAgLy8gQWxsb3dzIHJlcXVlc3QuZ2V0KCdodHRwczovLzEuMi4zLjQvJykuc2V0KCdIb3N0JywgJ2V4YW1wbGUuY29tJylcbiAgaWYgKHRoaXMuX2hlYWRlci5ob3N0KSB7XG4gICAgb3B0aW9ucy5zZXJ2ZXJuYW1lID0gdGhpcy5faGVhZGVyLmhvc3QucmVwbGFjZSgvOlxcZCskLywgJycpO1xuICB9XG5cbiAgaWYgKFxuICAgIHRoaXMuX3RydXN0TG9jYWxob3N0ICYmXG4gICAgL14oPzpsb2NhbGhvc3R8MTI3XFwuMFxcLjBcXC5cXGQrfCgwKjopKzowKjEpJC8udGVzdCh1cmwuaG9zdG5hbWUpXG4gICkge1xuICAgIG9wdGlvbnMucmVqZWN0VW5hdXRob3JpemVkID0gZmFsc2U7XG4gIH1cblxuICAvLyBpbml0aWF0ZSByZXF1ZXN0XG4gIGNvbnN0IG1vZHVsZV8gPSB0aGlzLl9lbmFibGVIdHRwMlxuICAgID8gZXhwb3J0cy5wcm90b2NvbHNbJ2h0dHAyOiddLnNldFByb3RvY29sKHByb3RvY29sKVxuICAgIDogZXhwb3J0cy5wcm90b2NvbHNbcHJvdG9jb2xdO1xuXG4gIC8vIHJlcXVlc3RcbiAgdGhpcy5yZXEgPSBtb2R1bGVfLnJlcXVlc3Qob3B0aW9ucyk7XG4gIGNvbnN0IHsgcmVxIH0gPSB0aGlzO1xuXG4gIC8vIEF0dGFjaCB0aGlzIGJlZm9yZSBoZWFkZXIgc2V0dXAgc28gZGVzdHJveSgpIGR1cmluZyBhIHNldHVwIGV4Y2VwdGlvblxuICAvLyBjYW5ub3QgZW1pdCBhbiB1bmhhbmRsZWQgJ2Vycm9yJyAob3IgYSBzZWNvbmQgY2FsbGJhY2spLlxuICByZXEub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgLy8gZmxhZyBhYm9ydGlvbiBoZXJlIGZvciBvdXQgdGltZW91dHNcbiAgICAvLyBiZWNhdXNlIG5vZGUgd2lsbCBlbWl0IGEgZmF1eC1lcnJvciBcInNvY2tldCBoYW5nIHVwXCJcbiAgICAvLyB3aGVuIHJlcXVlc3QgaXMgYWJvcnRlZCBiZWZvcmUgYSBjb25uZWN0aW9uIGlzIG1hZGVcbiAgICBpZiAodGhpcy5fYWJvcnRlZCB8fCB0aGlzLl9yZXF1ZXN0RGlzcG9zZWQpIHJldHVybjtcbiAgICAvLyBpZiBub3QgdGhlIHNhbWUsIHdlIGFyZSBpbiB0aGUgKipvbGQqKiAoY2FuY2VsbGVkKSByZXF1ZXN0LFxuICAgIC8vIHNvIG5lZWQgdG8gY29udGludWUgKHNhbWUgYXMgZm9yIGFib3ZlKVxuICAgIGlmICh0aGlzLl9yZXRyaWVzICE9PSByZXRyaWVzKSByZXR1cm47XG4gICAgLy8gaWYgd2UndmUgcmVjZWl2ZWQgYSByZXNwb25zZSB0aGVuIHdlIGRvbid0IHdhbnQgdG8gbGV0XG4gICAgLy8gYW4gZXJyb3IgaW4gdGhlIHJlcXVlc3QgYmxvdyB1cCB0aGUgcmVzcG9uc2VcbiAgICBpZiAodGhpcy5yZXNwb25zZSkgcmV0dXJuO1xuICAgIHRoaXMuY2FsbGJhY2soZXJyb3IpO1xuICB9KTtcblxuICB0cnkge1xuICAgIC8vIHNldCB0Y3Agbm8gZGVsYXlcbiAgICByZXEuc2V0Tm9EZWxheSh0cnVlKTtcblxuICAgIGlmIChvcHRpb25zLm1ldGhvZCAhPT0gJ0hFQUQnKSB7XG4gICAgICByZXEuc2V0SGVhZGVyKCdBY2NlcHQtRW5jb2RpbmcnLCAnZ3ppcCwgZGVmbGF0ZScpO1xuICAgIH1cblxuICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbDtcbiAgICB0aGlzLmhvc3QgPSB1cmwuaG9zdDtcblxuICAgIC8vIGV4cG9zZSBldmVudHNcbiAgICBjb25zdCBlbWl0RHJhaW4gPSAoKSA9PiB7XG4gICAgICB0aGlzLmVtaXQoJ2RyYWluJyk7XG4gICAgfTtcblxuICAgIHJlcS5vbignZHJhaW4nLCBlbWl0RHJhaW4pO1xuICAgIHJlcS5vbmNlKCdjbG9zZScsICgpID0+IHtcbiAgICAgIHJlcS5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBlbWl0RHJhaW4pO1xuICAgIH0pO1xuXG4gICAgLy8gYXV0aFxuICAgIGlmICh1cmwudXNlcm5hbWUgfHwgdXJsLnBhc3N3b3JkKSB7XG4gICAgICB0aGlzLmF1dGgodXJsLnVzZXJuYW1lLCB1cmwucGFzc3dvcmQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnVzZXJuYW1lICYmIHRoaXMucGFzc3dvcmQpIHtcbiAgICAgIHRoaXMuYXV0aCh0aGlzLnVzZXJuYW1lLCB0aGlzLnBhc3N3b3JkKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmhlYWRlcikge1xuICAgICAgaWYgKGhhc093bih0aGlzLmhlYWRlciwga2V5KSkgcmVxLnNldEhlYWRlcihrZXksIHRoaXMuaGVhZGVyW2tleV0pO1xuICAgIH1cblxuICAgIC8vIGFkZCBjb29raWVzXG4gICAgaWYgKHRoaXMuY29va2llcykge1xuICAgICAgaWYgKGhhc093bih0aGlzLl9oZWFkZXIsICdjb29raWUnKSkge1xuICAgICAgICAvLyBtZXJnZVxuICAgICAgICBjb25zdCB0ZW1wb3JhcnlKYXIgPSBuZXcgQ29va2llSmFyLkNvb2tpZUphcigpO1xuICAgICAgICB0ZW1wb3JhcnlKYXIuc2V0Q29va2llcyh0aGlzLl9oZWFkZXIuY29va2llLnNwbGl0KCc7ICcpKTtcbiAgICAgICAgdGVtcG9yYXJ5SmFyLnNldENvb2tpZXModGhpcy5jb29raWVzLnNwbGl0KCc7ICcpKTtcbiAgICAgICAgcmVxLnNldEhlYWRlcihcbiAgICAgICAgICAnQ29va2llJyxcbiAgICAgICAgICB0ZW1wb3JhcnlKYXJcbiAgICAgICAgICAgIC5nZXRDb29raWVzKENvb2tpZUphci5Db29raWVBY2Nlc3NJbmZvLkFsbClcbiAgICAgICAgICAgIC50b1ZhbHVlU3RyaW5nKClcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcS5zZXRIZWFkZXIoJ0Nvb2tpZScsIHRoaXMuY29va2llcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZGlzcG9zZU5vZGVSZXF1ZXN0KHRoaXMpO1xuICAgIHRocm93IGVycjtcbiAgfVxufTtcblxuLyoqXG4gKiBBYm9ydC9lbmQgdGhlIE5vZGUgcmVxdWVzdCBpZiBpdCB3YXMgY3JlYXRlZC5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuUmVxdWVzdC5wcm90b3R5cGUuX2Rpc3Bvc2VSZXF1ZXN0ID0gZnVuY3Rpb24gKCkge1xuICBkaXNwb3NlTm9kZVJlcXVlc3QodGhpcyk7XG59O1xuXG4vKipcbiAqIFJlcG9ydCBhIHNldHVwL3JlcXVlc3QtcGF0aCBlcnJvciB3aXRob3V0IGxlYXZpbmcgdGhlIHNvY2tldCBvcGVuLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuUmVxdWVzdC5wcm90b3R5cGUuX2ZhaWxSZXF1ZXN0ID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gIHRoaXMuX2Rpc3Bvc2VSZXF1ZXN0KCk7XG4gIGlmICh0eXBlb2YgdGhpcy5fY2FsbGJhY2sgPT09ICdmdW5jdGlvbicgJiYgdGhpcy5fY2FsbGJhY2sgIT09IG5vb3ApIHtcbiAgICB0aGlzLmNhbGxiYWNrKGVycm9yKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aHJvdyBlcnJvcjtcbn07XG5cbi8qKlxuICogSW52b2tlIHRoZSBjYWxsYmFjayB3aXRoIGBlcnJgIGFuZCBgcmVzYFxuICogYW5kIGhhbmRsZSBhcml0eSBjaGVjay5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7UmVzcG9uc2V9IHJlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuY2FsbGJhY2sgPSBmdW5jdGlvbiAoZXJyb3IsIHJlcykge1xuICBpZiAodGhpcy5fc2hvdWxkUmV0cnkoZXJyb3IsIHJlcykpIHtcbiAgICByZXR1cm4gdGhpcy5fcmV0cnkoKTtcbiAgfVxuXG4gIC8vIEF2b2lkIHRoZSBlcnJvciB3aGljaCBpcyBlbWl0dGVkIGZyb20gJ3NvY2tldCBoYW5nIHVwJyB0byBjYXVzZSB0aGUgZm4gdW5kZWZpbmVkIGVycm9yIG9uIEpTIHJ1bnRpbWUuXG4gIGNvbnN0IGZuID0gdGhpcy5fY2FsbGJhY2sgfHwgbm9vcDtcbiAgdGhpcy5jbGVhclRpbWVvdXQoKTtcbiAgaWYgKHRoaXMuY2FsbGVkKSB7XG4gICAgaWYgKHRoaXMudGltZWRvdXQpIHJldHVybjtcbiAgICByZXR1cm4gY29uc29sZS53YXJuKCdzdXBlcmFnZW50OiBkb3VibGUgY2FsbGJhY2sgYnVnJyk7XG4gIH1cblxuICB0aGlzLmNhbGxlZCA9IHRydWU7XG5cbiAgaWYgKCFlcnJvcikge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuX2lzUmVzcG9uc2VPSyhyZXMpKSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gJ1Vuc3VjY2Vzc2Z1bCBIVFRQIHJlc3BvbnNlJztcbiAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgIG1lc3NhZ2UgPSBodHRwLlNUQVRVU19DT0RFU1tyZXMuc3RhdHVzXSB8fCBtZXNzYWdlO1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgIGVycm9yLnN0YXR1cyA9IHJlcyA/IHJlcy5zdGF0dXMgOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBlcnJvciA9IGVycjtcbiAgICAgIGVycm9yLnN0YXR1cyA9IGVycm9yLnN0YXR1cyB8fCAocmVzID8gcmVzLnN0YXR1cyA6IHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gSXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkIG91dHNpZGUgdHJ5L2NhdGNoXG4gIC8vIHRvIGF2b2lkIGRvdWJsZSBjYWxsYmFja1xuICBpZiAoIWVycm9yKSB7XG4gICAgcmV0dXJuIGZuKG51bGwsIHJlcyk7XG4gIH1cblxuICBlcnJvci5yZXNwb25zZSA9IHJlcztcbiAgaWYgKHRoaXMuX21heFJldHJpZXMpIGVycm9yLnJldHJpZXMgPSB0aGlzLl9yZXRyaWVzIC0gMTtcblxuICAvLyBvbmx5IGVtaXQgZXJyb3IgZXZlbnQgaWYgdGhlcmUgaXMgYSBsaXN0ZW5lclxuICAvLyBvdGhlcndpc2Ugd2UgYXNzdW1lIHRoZSBjYWxsYmFjayB0byBgLmVuZCgpYCB3aWxsIGdldCB0aGUgZXJyb3JcbiAgaWYgKGVycm9yICYmIHRoaXMubGlzdGVuZXJzKCdlcnJvcicpLmxlbmd0aCA+IDApIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICB9XG5cbiAgZm4oZXJyb3IsIHJlcyk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGBvYmpgIGlzIGEgaG9zdCBvYmplY3QsXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBob3N0IG9iamVjdFxuICogQHJldHVybiB7Qm9vbGVhbn0gaXMgYSBob3N0IG9iamVjdFxuICogQGFwaSBwcml2YXRlXG4gKi9cblJlcXVlc3QucHJvdG90eXBlLl9pc0hvc3QgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gIHJldHVybiAoXG4gICAgQnVmZmVyLmlzQnVmZmVyKG9iamVjdCkgfHxcbiAgICBvYmplY3QgaW5zdGFuY2VvZiBTdHJlYW0gfHxcbiAgICBvYmplY3QgaW5zdGFuY2VvZiBGb3JtRGF0YVxuICApO1xufTtcblxuLyoqXG4gKiBJbml0aWF0ZSByZXF1ZXN0LCBpbnZva2luZyBjYWxsYmFjayBgZm4oZXJyLCByZXMpYFxuICogd2l0aCBhbiBpbnN0YW5jZW9mIGBSZXNwb25zZWAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5fZW1pdFJlc3BvbnNlID0gZnVuY3Rpb24gKGJvZHksIGZpbGVzKSB7XG4gIGNvbnN0IHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKHRoaXMpO1xuICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gIHJlc3BvbnNlLnJlZGlyZWN0cyA9IHRoaXMuX3JlZGlyZWN0TGlzdDtcbiAgaWYgKHVuZGVmaW5lZCAhPT0gYm9keSkge1xuICAgIHJlc3BvbnNlLmJvZHkgPSBib2R5O1xuICB9XG5cbiAgcmVzcG9uc2UuZmlsZXMgPSBmaWxlcztcbiAgaWYgKHRoaXMuX2VuZENhbGxlZCkge1xuICAgIHJlc3BvbnNlLnBpcGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiZW5kKCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQsIHNvIGl0J3MgdG9vIGxhdGUgdG8gc3RhcnQgcGlwaW5nXCJcbiAgICAgICk7XG4gICAgfTtcbiAgfVxuXG4gIHRoaXMuZW1pdCgncmVzcG9uc2UnLCByZXNwb25zZSk7XG4gIHJldHVybiByZXNwb25zZTtcbn07XG5cbi8qKlxuICogRW1pdCBgcmVkaXJlY3RgIGV2ZW50LCBwYXNzaW5nIGFuIGluc3RhbmNlb2YgYFJlc3BvbnNlYC5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5fZW1pdFJlZGlyZWN0ID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCByZXNwb25zZSA9IG5ldyBSZXNwb25zZSh0aGlzKTtcbiAgcmVzcG9uc2UucmVkaXJlY3RzID0gdGhpcy5fcmVkaXJlY3RMaXN0O1xuICB0aGlzLmVtaXQoJ3JlZGlyZWN0JywgcmVzcG9uc2UpO1xufTtcblxuLyoqXG4gKiBFbWl0IGEgcmVkaXJlY3QgcmVzcG9uc2UgYmVmb3JlIHRoZSByZXF1ZXN0IFVSTCBpcyBjaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSB7SW5jb21pbmdNZXNzYWdlfSByZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlcXVlc3QucHJvdG90eXBlLl9lbWl0UHJlUmVkaXJlY3QgPSBmdW5jdGlvbiAocmVzKSB7XG4gIHRoaXMucmVzID0gcmVzO1xuICBjb25zdCByZXNwb25zZSA9IG5ldyBSZXNwb25zZSh0aGlzKTtcbiAgcmVzcG9uc2UucmVkaXJlY3RzID0gdGhpcy5fcmVkaXJlY3RMaXN0O1xuICB0aGlzLmVtaXQoJ3ByZS1yZWRpcmVjdCcsIHJlc3BvbnNlKTtcbn07XG5cblJlcXVlc3QucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChmbikge1xuICB0cnkge1xuICAgIHRoaXMucmVxdWVzdCgpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aGlzLl9lbmRDYWxsZWQgPSB0cnVlO1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuX2NhbGxiYWNrID0gZm47XG4gICAgICB0aGlzLmNhbGxiYWNrKGVycik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyO1xuICB9XG5cbiAgZGVidWcoJyVzICVzJywgdGhpcy5tZXRob2QsIHRoaXMudXJsKTtcblxuICBpZiAodGhpcy5fZW5kQ2FsbGVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJy5lbmQoKSB3YXMgY2FsbGVkIHR3aWNlLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gc3VwZXJhZ2VudCdcbiAgICApO1xuICB9XG5cbiAgdGhpcy5fZW5kQ2FsbGVkID0gdHJ1ZTtcblxuICAvLyBzdG9yZSBjYWxsYmFja1xuICB0aGlzLl9jYWxsYmFjayA9IGZuIHx8IG5vb3A7XG5cbiAgdGhpcy5fZW5kKCk7XG59O1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5fZW5kID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5fYWJvcnRlZClcbiAgICByZXR1cm4gdGhpcy5jYWxsYmFjayhcbiAgICAgIG5ldyBFcnJvcignVGhlIHJlcXVlc3QgaGFzIGJlZW4gYWJvcnRlZCBldmVuIGJlZm9yZSAuZW5kKCkgd2FzIGNhbGxlZCcpXG4gICAgKTtcblxuICBsZXQgZGF0YSA9IHRoaXMuX2RhdGE7XG4gIGNvbnN0IHsgcmVxIH0gPSB0aGlzO1xuICBjb25zdCB7IG1ldGhvZCB9ID0gdGhpcztcblxuICB0aGlzLl9zZXRUaW1lb3V0cygpO1xuXG4gIC8vIGJvZHlcbiAgaWYgKG1ldGhvZCAhPT0gJ0hFQUQnICYmICFyZXEuX2hlYWRlclNlbnQpIHtcbiAgICB0cnkge1xuICAgICAgLy8gc2VyaWFsaXplIHN0dWZmXG4gICAgICBpZiAodHlwZW9mIGRhdGEgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGxldCBjb250ZW50VHlwZSA9IHJlcS5nZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScpO1xuICAgICAgICAvLyBQYXJzZSBvdXQganVzdCB0aGUgY29udGVudCB0eXBlIGZyb20gdGhlIGhlYWRlciAoaWdub3JlIHRoZSBjaGFyc2V0KVxuICAgICAgICBpZiAoY29udGVudFR5cGUpIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGUuc3BsaXQoJzsnKVswXTtcbiAgICAgICAgbGV0IHNlcmlhbGl6ZSA9XG4gICAgICAgICAgdGhpcy5fc2VyaWFsaXplciB8fFxuICAgICAgICAgIChoYXNPd24oZXhwb3J0cy5zZXJpYWxpemUsIGNvbnRlbnRUeXBlKVxuICAgICAgICAgICAgPyBleHBvcnRzLnNlcmlhbGl6ZVtjb250ZW50VHlwZV1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKCFzZXJpYWxpemUgJiYgaXNKU09OKGNvbnRlbnRUeXBlKSkge1xuICAgICAgICAgIHNlcmlhbGl6ZSA9IGV4cG9ydHMuc2VyaWFsaXplWydhcHBsaWNhdGlvbi9qc29uJ107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VyaWFsaXplKSBkYXRhID0gc2VyaWFsaXplKGRhdGEpO1xuICAgICAgfVxuXG4gICAgICAvLyBjb250ZW50LWxlbmd0aFxuICAgICAgaWYgKGRhdGEgJiYgIXJlcS5nZXRIZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJykpIHtcbiAgICAgICAgcmVxLnNldEhlYWRlcihcbiAgICAgICAgICAnQ29udGVudC1MZW5ndGgnLFxuICAgICAgICAgIEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSA/IGRhdGEubGVuZ3RoIDogQnVmZmVyLmJ5dGVMZW5ndGgoZGF0YSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB0aGlzLl9mYWlsUmVxdWVzdChlcnIpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBzdHJlYW1SZXNwb25zZTtcbiAgaWYgKHRoaXMuX3N0cmVhbVJlc3BvbnNlTGlzdGVuZXIpIHtcbiAgICByZXEucmVtb3ZlTGlzdGVuZXIoJ3Jlc3BvbnNlJywgdGhpcy5fc3RyZWFtUmVzcG9uc2VMaXN0ZW5lcik7XG4gICAgdGhpcy5fc3RyZWFtUmVzcG9uc2VMaXN0ZW5lciA9IHVuZGVmaW5lZDtcbiAgICBzdHJlYW1SZXNwb25zZSA9IHRoaXMuX3N0cmVhbVJlc3BvbnNlO1xuICAgIHRoaXMuX3N0cmVhbVJlc3BvbnNlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gcmVzcG9uc2VcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgY29uc3QgaGFuZGxlUmVzcG9uc2UgPSAocmVzKSA9PiB7XG4gICAgZGVidWcoJyVzICVzIC0+ICVzJywgdGhpcy5tZXRob2QsIHRoaXMudXJsLCByZXMuc3RhdHVzQ29kZSk7XG5cbiAgICBpZiAodGhpcy5fcmVzcG9uc2VUaW1lb3V0VGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9yZXNwb25zZVRpbWVvdXRUaW1lcik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGlwZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtYXggPSB0aGlzLl9tYXhSZWRpcmVjdHM7XG4gICAgY29uc3QgbWltZSA9IHV0aWxzLnR5cGUocmVzLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddIHx8ICcnKSB8fCAndGV4dC9wbGFpbic7XG4gICAgbGV0IHR5cGUgPSBtaW1lLnNwbGl0KCcvJylbMF07XG4gICAgaWYgKHR5cGUpIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIGNvbnN0IG11bHRpcGFydCA9IHR5cGUgPT09ICdtdWx0aXBhcnQnO1xuICAgIGNvbnN0IHJlZGlyZWN0ID0gaXNSZWRpcmVjdChyZXMuc3RhdHVzQ29kZSk7XG4gICAgY29uc3QgcmVzcG9uc2VUeXBlID0gdGhpcy5fcmVzcG9uc2VUeXBlO1xuXG4gICAgdGhpcy5yZXMgPSByZXM7XG5cbiAgICAvLyByZWRpcmVjdFxuICAgIGlmIChyZWRpcmVjdCAmJiB0aGlzLl9yZWRpcmVjdHMrKyAhPT0gbWF4KSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVkaXJlY3QocmVzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tZXRob2QgPT09ICdIRUFEJykge1xuICAgICAgdGhpcy5lbWl0KCdlbmQnKTtcbiAgICAgIHRoaXMuY2FsbGJhY2sobnVsbCwgdGhpcy5fZW1pdFJlc3BvbnNlKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHpsaWIgc3VwcG9ydFxuICAgIGxldCBkZWNvbXByZXNzZXIgPSBudWxsO1xuICAgIGlmICh0aGlzLl9zaG91bGREZWNvbXByZXNzKHJlcykpIHtcbiAgICAgIGRlY29tcHJlc3NlciA9IGRlY29tcHJlc3MocmVxLCByZXMpO1xuICAgIH1cblxuICAgIGxldCBidWZmZXIgPSB0aGlzLl9idWZmZXI7XG4gICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkICYmIGhhc093bihleHBvcnRzLmJ1ZmZlciwgbWltZSkpIHtcbiAgICAgIGJ1ZmZlciA9IEJvb2xlYW4oZXhwb3J0cy5idWZmZXJbbWltZV0pO1xuICAgIH1cblxuICAgIGxldCBwYXJzZXIgPSB0aGlzLl9wYXJzZXI7XG4gICAgaWYgKHVuZGVmaW5lZCA9PT0gYnVmZmVyICYmIHBhcnNlcikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkEgY3VzdG9tIHN1cGVyYWdlbnQgcGFyc2VyIGhhcyBiZWVuIHNldCwgYnV0IGJ1ZmZlcmluZyBzdHJhdGVneSBmb3IgdGhlIHBhcnNlciBoYXNuJ3QgYmVlbiBjb25maWd1cmVkLiBDYWxsIGByZXEuYnVmZmVyKHRydWUgb3IgZmFsc2UpYCBvciBzZXQgYHN1cGVyYWdlbnQuYnVmZmVyW21pbWVdID0gdHJ1ZSBvciBmYWxzZWBcIlxuICAgICAgKTtcbiAgICAgIGJ1ZmZlciA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJzZXIpIHtcbiAgICAgIGlmIChyZXNwb25zZVR5cGUpIHtcbiAgICAgICAgcGFyc2VyID0gZXhwb3J0cy5wYXJzZS5pbWFnZTsgLy8gSXQncyBhY3R1YWxseSBhIGdlbmVyaWMgQnVmZmVyXG4gICAgICAgIGJ1ZmZlciA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKG11bHRpcGFydCkge1xuICAgICAgICBjb25zdCBmb3JtID0gZm9ybWlkYWJsZS5mb3JtaWRhYmxlKCk7XG4gICAgICAgIHBhcnNlciA9IChyZXMsIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGEgUGFzc1Rocm91Z2ggc3RyZWFtIHRoYXQgYWN0cyBhcyBhIHByb3BlciBIVFRQIHJlcXVlc3RcbiAgICAgICAgICBjb25zdCBicmlkZ2VTdHJlYW0gPSBuZXcgU3RyZWFtLlBhc3NUaHJvdWdoKCk7XG5cbiAgICAgICAgICAvLyBBZGQgSFRUUCByZXF1ZXN0IHByb3BlcnRpZXMgZnJvbSB0aGUgY3VycmVudCByZXF1ZXN0IGNvbnRleHRcbiAgICAgICAgICBicmlkZ2VTdHJlYW0ubWV0aG9kID0gdGhpcy5tZXRob2QgfHwgJ1BPU1QnO1xuICAgICAgICAgIGJyaWRnZVN0cmVhbS51cmwgPSB0aGlzLnVybCB8fCAnLyc7XG4gICAgICAgICAgYnJpZGdlU3RyZWFtLmh0dHBWZXJzaW9uID0gcmVzLmh0dHBWZXJzaW9uIHx8ICcxLjEnO1xuICAgICAgICAgIGJyaWRnZVN0cmVhbS5oZWFkZXJzID0gcmVzLmhlYWRlcnMgfHwge307XG4gICAgICAgICAgYnJpZGdlU3RyZWFtLnNvY2tldCA9IHJlcy5zb2NrZXQgfHwgeyByZWFkYWJsZTogdHJ1ZSB9O1xuXG4gICAgICAgICAgLy8gUGlwZSB0aGUgcmVzcG9uc2UgZGF0YSB0aHJvdWdoIHRoZSBicmlkZ2Ugc3RyZWFtXG4gICAgICAgICAgcmVzLnBpcGUoYnJpZGdlU3RyZWFtKTtcblxuICAgICAgICAgIGZvcm0ucGFyc2UoYnJpZGdlU3RyZWFtLCAoZXJyLCBmaWVsZHMsIGZpbGVzKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcblxuICAgICAgICAgICAgLy8gRm9ybWlkYWJsZSB2MyBhbHdheXMgcmV0dXJucyBhcnJheXMsIGJ1dCBTdXBlckFnZW50IGV4cGVjdHMgc2luZ2xlIHZhbHVlc1xuICAgICAgICAgICAgLy8gRmxhdHRlbiBzaW5nbGUtaXRlbSBhcnJheXMgdG8gbWFpbnRhaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgY29uc3QgZmxhdHRlbmVkRmllbGRzID0ge307XG4gICAgICAgICAgICBpZiAoZmllbGRzKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZpZWxkcykge1xuICAgICAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZpZWxkcywga2V5KSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZHNba2V5XTtcbiAgICAgICAgICAgICAgICBmbGF0dGVuZWRGaWVsZHNba2V5XSA9XG4gICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDEgPyB2YWx1ZVswXSA6IHZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZsYXR0ZW5lZEZpbGVzID0ge307XG4gICAgICAgICAgICBpZiAoZmlsZXMpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZmlsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmaWxlcywga2V5KSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWxlc1trZXldO1xuICAgICAgICAgICAgICAgIGZsYXR0ZW5lZEZpbGVzW2tleV0gPVxuICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAxID8gdmFsdWVbMF0gOiB2YWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZXR1cm4gZmxhdHRlbmVkIGZpZWxkcyBhcyB0aGUgb2JqZWN0IHBhcmFtZXRlciB0byBtYXRjaCBTdXBlckFnZW50J3MgZXhwZWN0ZWQgZm9ybWF0XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCBmbGF0dGVuZWRGaWVsZHMsIGZsYXR0ZW5lZEZpbGVzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBidWZmZXIgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChpc0JpbmFyeShtaW1lKSkge1xuICAgICAgICBwYXJzZXIgPSBleHBvcnRzLnBhcnNlLmltYWdlO1xuICAgICAgICBidWZmZXIgPSBidWZmZXIgIT09IGZhbHNlOyAvLyBGb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgYnVmZmVyaW5nIGRlZmF1bHQgaXMgYWQtaG9jIE1JTUUtZGVwZW5kZW50XG4gICAgICB9IGVsc2UgaWYgKGhhc093bihleHBvcnRzLnBhcnNlLCBtaW1lKSkge1xuICAgICAgICAvLyBgbWltZWAgaXMgYXR0YWNrZXIgY29udHJvbGxlZDsgYW4gaW5oZXJpdGVkIGtleSBzdWNoIGFzXG4gICAgICAgIC8vIFwiY29uc3RydWN0b3JcIiBtdXN0IG5vdCByZXNvbHZlIHRvIGEgcGFyc2VyXG4gICAgICAgIHBhcnNlciA9IGV4cG9ydHMucGFyc2VbbWltZV07XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICBwYXJzZXIgPSBleHBvcnRzLnBhcnNlLnRleHQ7XG4gICAgICAgIGJ1ZmZlciA9IGJ1ZmZlciAhPT0gZmFsc2U7XG4gICAgICAgIC8vIGV2ZXJ5b25lIHdhbnRzIHRoZWlyIG93biB3aGl0ZS1sYWJlbGVkIGpzb25cbiAgICAgIH0gZWxzZSBpZiAoaXNKU09OKG1pbWUpKSB7XG4gICAgICAgIHBhcnNlciA9IGV4cG9ydHMucGFyc2VbJ2FwcGxpY2F0aW9uL2pzb24nXTtcbiAgICAgICAgYnVmZmVyID0gYnVmZmVyICE9PSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoYnVmZmVyKSB7XG4gICAgICAgIHBhcnNlciA9IGV4cG9ydHMucGFyc2UudGV4dDtcbiAgICAgIH0gZWxzZSBpZiAodW5kZWZpbmVkID09PSBidWZmZXIpIHtcbiAgICAgICAgcGFyc2VyID0gZXhwb3J0cy5wYXJzZS5pbWFnZTsgLy8gSXQncyBhY3R1YWxseSBhIGdlbmVyaWMgQnVmZmVyXG4gICAgICAgIGJ1ZmZlciA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYnkgZGVmYXVsdCBvbmx5IGJ1ZmZlciB0ZXh0LyosIGpzb24gYW5kIG1lc3NlZCB1cCB0aGluZyBmcm9tIGhlbGxcbiAgICBpZiAoKHVuZGVmaW5lZCA9PT0gYnVmZmVyICYmIGlzVGV4dChtaW1lKSkgfHwgaXNKU09OKG1pbWUpKSB7XG4gICAgICBidWZmZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuX3Jlc0J1ZmZlcmVkID0gYnVmZmVyO1xuICAgIGxldCBwYXJzZXJIYW5kbGVzRW5kID0gZmFsc2U7XG4gICAgaWYgKGJ1ZmZlcikge1xuICAgICAgLy8gUHJvdGVjdGlvbiBhZ2FpbnN0IHppcCBib21icyBhbmQgb3RoZXIgbnVpc2FuY2VcbiAgICAgIGxldCByZXNwb25zZUJ5dGVzTGVmdCA9IHRoaXMuX21heFJlc3BvbnNlU2l6ZSB8fCAyMDAwMDAwMDA7XG4gICAgICBsZXQgZXhjZWVkZWQgPSBmYWxzZTtcbiAgICAgIHJlcy5vbignZGF0YScsIChidWYpID0+IHtcbiAgICAgICAgaWYgKGV4Y2VlZGVkKSByZXR1cm47XG4gICAgICAgIC8vIFBhcnNlcnMgbWF5IGhhdmUgY2FsbGVkIGBzZXRFbmNvZGluZygpYCwgaW4gd2hpY2ggY2FzZSBjaHVua3MgYXJlXG4gICAgICAgIC8vIHN0cmluZ3M6IGNvdW50IHRoZWlyIGVuY29kZWQgc2l6ZSByYXRoZXIgdGhhbiB0aGVpciBVVEYtMTYgbGVuZ3RoXG4gICAgICAgIHJlc3BvbnNlQnl0ZXNMZWZ0IC09IEJ1ZmZlci5pc0J1ZmZlcihidWYpXG4gICAgICAgICAgPyBidWYubGVuZ3RoXG4gICAgICAgICAgOiBCdWZmZXIuYnl0ZUxlbmd0aChTdHJpbmcoYnVmKSk7XG4gICAgICAgIGlmIChyZXNwb25zZUJ5dGVzTGVmdCA8IDApIHtcbiAgICAgICAgICBleGNlZWRlZCA9IHRydWU7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ01heGltdW0gcmVzcG9uc2Ugc2l6ZSByZWFjaGVkJyk7XG4gICAgICAgICAgZXJyb3IuY29kZSA9ICdFVE9PTEFSR0UnO1xuICAgICAgICAgIC8vIFBhcnNlcnMgYXJlbid0IHJlcXVpcmVkIHRvIG9ic2VydmUgZXJyb3IgZXZlbnQsXG4gICAgICAgICAgLy8gc28gd291bGQgaW5jb3JyZWN0bHkgcmVwb3J0IHN1Y2Nlc3NcbiAgICAgICAgICBwYXJzZXJIYW5kbGVzRW5kID0gZmFsc2U7XG4gICAgICAgICAgLy8gQSBkZWNvbXByZXNzaW9uIGJvbWIga2VlcHMgaW5mbGF0aW5nIChhbmQgZW1pdHRpbmcpIGxvbmcgYWZ0ZXJcbiAgICAgICAgICAvLyB0aGUgY29tcHJlc3NlZCBpbnB1dCB3YXMgY29uc3VtZWQ7IHN0b3AgaXQgaGVyZSBzbyB0aGUgbGltaXRcbiAgICAgICAgICAvLyBhbHNvIGJvdW5kcyBDUFUgYW5kIGF2b2lkcyBhIGZsb29kIG9mIGxhdGUgY2FsbGJhY2tzLlxuICAgICAgICAgIGlmIChkZWNvbXByZXNzZXIpIGRlY29tcHJlc3Nlci5kZXN0cm95KCk7XG4gICAgICAgICAgLy8gRGVzdHJveSB3aXRob3V0IGFuIGVycm9yOiBJbmNvbWluZ01lc3NhZ2UuZGVzdHJveShlcnIpIGVtaXRzXG4gICAgICAgICAgLy8gJ2Vycm9yJywgYW5kIHRoZSBwYXJzZXIgbWF5IGFsc28gZmFpbCwgZWFjaCBvZiB3aGljaCB3b3VsZFxuICAgICAgICAgIC8vIGNhbGwgY2FsbGJhY2soKSBhZ2FpbiAoXCJzdXBlcmFnZW50OiBkb3VibGUgY2FsbGJhY2sgYnVnXCIpLlxuICAgICAgICAgIHJlcy5kZXN0cm95KCk7XG4gICAgICAgICAgdGhpcy5jYWxsYmFjayhlcnJvciwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChwYXJzZXIgJiYgIWJ1ZmZlciAmJiBCVUZGRVJJTkdfUEFSU0VSUy5oYXMocGFyc2VyKSkge1xuICAgICAgLy8gVGhlIGJ1aWx0LWluIHBhcnNlcnMgZXhpc3Qgb25seSB0byBhY2N1bXVsYXRlIHRoZSBib2R5LiBXaGVuIHRoZVxuICAgICAgLy8gcmVzcG9uc2UgaXMgbm90IGJ1ZmZlcmVkIChgLmJ1ZmZlcihmYWxzZSlgLCBvciBhbiB1bmJ1ZmZlcmVkIGRlZmF1bHRcbiAgICAgIC8vIHN1Y2ggYXMgYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtKSB0aGV5IHdvdWxkIHN0aWxsIGNvbGxlY3QgdGhlIGVudGlyZVxuICAgICAgLy8gc3RyZWFtIGluIG1lbW9yeSwgd2l0aG91dCBhbnkgc2l6ZSBsaW1pdCwgd2hpbGUgdGhlIHJlc3BvbnNlIGhhc1xuICAgICAgLy8gYWxyZWFkeSBiZWVuIGhhbmRlZCBvdXQgdG8gdGhlIGNhbGxlci4gS2VlcCBvbmx5IHRoZSBlbmNvZGluZyB0aGV5XG4gICAgICAvLyB3b3VsZCBoYXZlIGFwcGxpZWQgc28gYHJlcy5vbignZGF0YScpYCBjb25zdW1lcnMgc2VlIHRoZSBzYW1lIGNodW5rcy5cbiAgICAgIGlmIChwYXJzZXIgPT09IEJVSUxUX0lOX1BBUlNFUlNbJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCddKSB7XG4gICAgICAgIHJlcy5zZXRFbmNvZGluZygnYXNjaWknKTtcbiAgICAgIH0gZWxzZSBpZiAocGFyc2VyICE9PSBCVUlMVF9JTl9QQVJTRVJTLmltYWdlKSB7XG4gICAgICAgIHJlcy5zZXRFbmNvZGluZygndXRmOCcpO1xuICAgICAgfVxuXG4gICAgICBwYXJzZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmIChwYXJzZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFVuYnVmZmVyZWQgcGFyc2VycyBhcmUgc3VwcG9zZWQgdG8gZW1pdCByZXNwb25zZSBlYXJseSxcbiAgICAgICAgLy8gd2hpY2ggaXMgd2VpcmQgQlRXLCBiZWNhdXNlIHJlc3BvbnNlLmJvZHkgd29uJ3QgYmUgdGhlcmUuXG4gICAgICAgIHBhcnNlckhhbmRsZXNFbmQgPSBidWZmZXI7XG5cbiAgICAgICAgcGFyc2VyKHJlcywgKGVycm9yLCBvYmplY3QsIGZpbGVzKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMudGltZWRvdXQgfHwgdGhpcy5jYWxsZWQpIHtcbiAgICAgICAgICAgIC8vIFRpbWVvdXQgb3IgbWF4UmVzcG9uc2VTaXplIGhhcyBhbHJlYWR5IGhhbmRsZWQgYWxsIGNhbGxiYWNrc1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEludGVudGlvbmFsIChub24tdGltZW91dCkgYWJvcnQgaXMgc3VwcG9zZWQgdG8gcHJlc2VydmUgcGFydGlhbCByZXNwb25zZSxcbiAgICAgICAgICAvLyBldmVuIGlmIGl0IGRvZXNuJ3QgcGFyc2UuXG4gICAgICAgICAgaWYgKGVycm9yICYmICF0aGlzLl9hYm9ydGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYWxsYmFjayhlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHBhcnNlckhhbmRsZXNFbmQpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZW5kJyk7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrKG51bGwsIHRoaXMuX2VtaXRSZXNwb25zZShvYmplY3QsIGZpbGVzKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmNhbGxiYWNrKGVycik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnJlcyA9IHJlcztcblxuICAgIC8vIHVuYnVmZmVyZWRcbiAgICBpZiAoIWJ1ZmZlcikge1xuICAgICAgZGVidWcoJ3VuYnVmZmVyZWQgJXMgJXMnLCB0aGlzLm1ldGhvZCwgdGhpcy51cmwpO1xuICAgICAgdGhpcy5jYWxsYmFjayhudWxsLCB0aGlzLl9lbWl0UmVzcG9uc2UoKSk7XG4gICAgICBpZiAobXVsdGlwYXJ0KSByZXR1cm47IC8vIGFsbG93IG11bHRpcGFydCB0byBoYW5kbGUgZW5kIGV2ZW50XG4gICAgICByZXMub25jZSgnZW5kJywgKCkgPT4ge1xuICAgICAgICBkZWJ1ZygnZW5kICVzICVzJywgdGhpcy5tZXRob2QsIHRoaXMudXJsKTtcbiAgICAgICAgdGhpcy5lbWl0KCdlbmQnKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBsZXRlQWJvcnRlZFJlc3BvbnNlID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9hYm9ydGVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcGFyc2VySGFuZGxlc0VuZCA9IGZhbHNlO1xuICAgICAgaWYgKCF0aGlzLmNhbGxlZCkge1xuICAgICAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMuX2VtaXRSZXNwb25zZSgpO1xuICAgICAgICByZXNwb25zZS5vbignZXJyb3InLCBub29wKTtcbiAgICAgICAgdGhpcy5jYWxsYmFjayhudWxsLCByZXNwb25zZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICAvLyB0ZXJtaW5hdGluZyBldmVudHNcbiAgICByZXMub25jZSgnZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIGlmIChjb21wbGV0ZUFib3J0ZWRSZXNwb25zZSgpKSByZXR1cm47XG4gICAgICBwYXJzZXJIYW5kbGVzRW5kID0gZmFsc2U7XG4gICAgICB0aGlzLmNhbGxiYWNrKGVycm9yLCBudWxsKTtcbiAgICB9KTtcbiAgICByZXMub25jZSgnYWJvcnRlZCcsIGNvbXBsZXRlQWJvcnRlZFJlc3BvbnNlKTtcbiAgICByZXMub25jZSgnY2xvc2UnLCBjb21wbGV0ZUFib3J0ZWRSZXNwb25zZSk7XG4gICAgaWYgKCFwYXJzZXJIYW5kbGVzRW5kKVxuICAgICAgcmVzLm9uY2UoJ2VuZCcsICgpID0+IHtcbiAgICAgICAgZGVidWcoJ2VuZCAlcyAlcycsIHRoaXMubWV0aG9kLCB0aGlzLnVybCk7XG4gICAgICAgIC8vIFRPRE86IHVubGVzcyBidWZmZXJpbmcgZW1pdCBlYXJsaWVyIHRvIHN0cmVhbVxuICAgICAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICAgICAgICB0aGlzLmNhbGxiYWNrKG51bGwsIHRoaXMuX2VtaXRSZXNwb25zZSgpKTtcbiAgICAgIH0pO1xuICB9O1xuXG4gIGlmIChzdHJlYW1SZXNwb25zZSkge1xuICAgIHByb2Nlc3MubmV4dFRpY2soaGFuZGxlUmVzcG9uc2UsIHN0cmVhbVJlc3BvbnNlKTtcbiAgfSBlbHNlIHtcbiAgICByZXEub25jZSgncmVzcG9uc2UnLCBoYW5kbGVSZXNwb25zZSk7XG4gIH1cblxuICB0aGlzLmVtaXQoJ3JlcXVlc3QnLCB0aGlzKTtcblxuICBjb25zdCBnZXRQcm9ncmVzc01vbml0b3IgPSAoKSA9PiB7XG4gICAgY29uc3QgbGVuZ3RoQ29tcHV0YWJsZSA9IHRydWU7XG4gICAgY29uc3QgdG90YWwgPSByZXEuZ2V0SGVhZGVyKCdDb250ZW50LUxlbmd0aCcpO1xuICAgIGxldCBsb2FkZWQgPSAwO1xuXG4gICAgY29uc3QgcHJvZ3Jlc3MgPSBuZXcgU3RyZWFtLlRyYW5zZm9ybSgpO1xuICAgIHByb2dyZXNzLl90cmFuc2Zvcm0gPSAoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykgPT4ge1xuICAgICAgbG9hZGVkICs9IGNodW5rLmxlbmd0aDtcbiAgICAgIHRoaXMuZW1pdCgncHJvZ3Jlc3MnLCB7XG4gICAgICAgIGRpcmVjdGlvbjogJ3VwbG9hZCcsXG4gICAgICAgIGxlbmd0aENvbXB1dGFibGUsXG4gICAgICAgIGxvYWRlZCxcbiAgICAgICAgdG90YWxcbiAgICAgIH0pO1xuICAgICAgY2FsbGJhY2sobnVsbCwgY2h1bmspO1xuICAgIH07XG5cbiAgICByZXR1cm4gcHJvZ3Jlc3M7XG4gIH07XG5cbiAgY29uc3QgYnVmZmVyVG9DaHVua3MgPSAoYnVmZmVyKSA9PiB7XG4gICAgY29uc3QgY2h1bmtTaXplID0gMTYgKiAxMDI0OyAvLyBkZWZhdWx0IGhpZ2hXYXRlck1hcmsgdmFsdWVcbiAgICBjb25zdCBjaHVua2luZyA9IG5ldyBTdHJlYW0uUmVhZGFibGUoKTtcbiAgICBjb25zdCB0b3RhbExlbmd0aCA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgY29uc3QgcmVtYWluZGVyID0gdG90YWxMZW5ndGggJSBjaHVua1NpemU7XG4gICAgY29uc3QgY3V0b2ZmID0gdG90YWxMZW5ndGggLSByZW1haW5kZXI7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1dG9mZjsgaSArPSBjaHVua1NpemUpIHtcbiAgICAgIGNvbnN0IGNodW5rID0gYnVmZmVyLnNsaWNlKGksIGkgKyBjaHVua1NpemUpO1xuICAgICAgY2h1bmtpbmcucHVzaChjaHVuayk7XG4gICAgfVxuXG4gICAgaWYgKHJlbWFpbmRlciA+IDApIHtcbiAgICAgIGNvbnN0IHJlbWFpbmRlckJ1ZmZlciA9IGJ1ZmZlci5zbGljZSgtcmVtYWluZGVyKTtcbiAgICAgIGNodW5raW5nLnB1c2gocmVtYWluZGVyQnVmZmVyKTtcbiAgICB9XG5cbiAgICBjaHVua2luZy5wdXNoKG51bGwpOyAvLyBubyBtb3JlIGRhdGFcblxuICAgIHJldHVybiBjaHVua2luZztcbiAgfTtcblxuICB0cnkge1xuICAgIC8vIGlmIGEgRm9ybURhdGEgaW5zdGFuY2UgZ290IGNyZWF0ZWQsIHRoZW4gd2Ugc2VuZCB0aGF0IGFzIHRoZSByZXF1ZXN0IGJvZHlcbiAgICBjb25zdCBmb3JtRGF0YSA9IHRoaXMuX2Zvcm1EYXRhO1xuICAgIGlmIChmb3JtRGF0YSkge1xuICAgICAgLy8gc2V0IGhlYWRlcnNcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBmb3JtRGF0YS5nZXRIZWFkZXJzKCk7XG4gICAgICBmb3IgKGNvbnN0IGkgaW4gaGVhZGVycykge1xuICAgICAgICBpZiAoaGFzT3duKGhlYWRlcnMsIGkpKSB7XG4gICAgICAgICAgZGVidWcoJ3NldHRpbmcgRm9ybURhdGEgaGVhZGVyOiBcIiVzOiAlc1wiJywgaSwgaGVhZGVyc1tpXSk7XG4gICAgICAgICAgcmVxLnNldEhlYWRlcihpLCBoZWFkZXJzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBhdHRlbXB0IHRvIGdldCBcIkNvbnRlbnQtTGVuZ3RoXCIgaGVhZGVyXG4gICAgICBmb3JtRGF0YS5nZXRMZW5ndGgoKGVycm9yLCBsZW5ndGgpID0+IHtcbiAgICAgICAgLy8gVW5rbm93biBzdHJlYW0gbGVuZ3RocyBjYW4gdXNlIGNodW5rZWQgZW5jb2RpbmcsIGJ1dCBmaWxlc3lzdGVtXG4gICAgICAgIC8vIGVycm9ycyBtdXN0IGZhaWwgYmVmb3JlIGEgcGFydGlhbCBtdWx0aXBhcnQgcmVxdWVzdCBpcyBzZW50LlxuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IgIT09ICdVbmtub3duIHN0cmVhbScpIHtcbiAgICAgICAgICB0aGlzLl9mYWlsUmVxdWVzdChlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVidWcoJ2dvdCBGb3JtRGF0YSBDb250ZW50LUxlbmd0aDogJXMnLCBsZW5ndGgpO1xuICAgICAgICBpZiAodHlwZW9mIGxlbmd0aCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXEuc2V0SGVhZGVyKCdDb250ZW50LUxlbmd0aCcsIGxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtRGF0YS5waXBlKGdldFByb2dyZXNzTW9uaXRvcigpKS5waXBlKHJlcSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkge1xuICAgICAgYnVmZmVyVG9DaHVua3MoZGF0YSkucGlwZShnZXRQcm9ncmVzc01vbml0b3IoKSkucGlwZShyZXEpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXEuZW5kKGRhdGEpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5fZmFpbFJlcXVlc3QoZXJyKTtcbiAgfVxufTtcblxuLy8gQ2hlY2sgd2hldGhlciByZXNwb25zZSBoYXMgYSBub24tMC1zaXplZCBnemlwLWVuY29kZWQgYm9keVxuUmVxdWVzdC5wcm90b3R5cGUuX3Nob3VsZERlY29tcHJlc3MgPSAocmVzKSA9PiB7XG4gIHJldHVybiAoXG4gICAgaGFzTm9uRW1wdHlSZXNwb25zZUNvbnRlbnQocmVzKSAmJlxuICAgIChpc0d6aXBPckRlZmxhdGVFbmNvZGluZyhyZXMpIHx8IGlzQnJvdGxpRW5jb2RpbmcocmVzKSlcbiAgKTtcbn07XG5cbi8qKlxuICogT3ZlcnJpZGVzIEROUyBmb3Igc2VsZWN0ZWQgaG9zdG5hbWVzLiBUYWtlcyBvYmplY3QgbWFwcGluZyBob3N0bmFtZXMgdG8gSVAgYWRkcmVzc2VzLlxuICpcbiAqIFdoZW4gbWFraW5nIGEgcmVxdWVzdCB0byBhIFVSTCB3aXRoIGEgaG9zdG5hbWUgZXhhY3RseSBtYXRjaGluZyBhIGtleSBpbiB0aGUgb2JqZWN0LFxuICogdXNlIHRoZSBnaXZlbiBJUCBhZGRyZXNzIHRvIGNvbm5lY3QsIGluc3RlYWQgb2YgdXNpbmcgRE5TIHRvIHJlc29sdmUgdGhlIGhvc3RuYW1lLlxuICpcbiAqIEEgc3BlY2lhbCBob3N0IGAqYCBtYXRjaGVzIGV2ZXJ5IGhvc3RuYW1lIChrZWVwIHJlZGlyZWN0cyBpbiBtaW5kISlcbiAqXG4gKiAgICAgIHJlcXVlc3QuY29ubmVjdCh7XG4gKiAgICAgICAgJ3Rlc3QuZXhhbXBsZS5jb20nOiAnMTI3LjAuMC4xJyxcbiAqICAgICAgICAnaXB2Ni5leGFtcGxlLmNvbSc6ICc6OjEnLFxuICogICAgICB9KVxuICovXG5SZXF1ZXN0LnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKGNvbm5lY3RPdmVycmlkZSkge1xuICBpZiAodHlwZW9mIGNvbm5lY3RPdmVycmlkZSA9PT0gJ3N0cmluZycpIHtcbiAgICB0aGlzLl9jb25uZWN0T3ZlcnJpZGUgPSB7ICcqJzogY29ubmVjdE92ZXJyaWRlIH07XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNvbm5lY3RPdmVycmlkZSA9PT0gJ29iamVjdCcpIHtcbiAgICB0aGlzLl9jb25uZWN0T3ZlcnJpZGUgPSBjb25uZWN0T3ZlcnJpZGU7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fY29ubmVjdE92ZXJyaWRlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5SZXF1ZXN0LnByb3RvdHlwZS50cnVzdExvY2FsaG9zdCA9IGZ1bmN0aW9uICh0b2dnbGUpIHtcbiAgdGhpcy5fdHJ1c3RMb2NhbGhvc3QgPSB0b2dnbGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiB0b2dnbGU7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gZ2VuZXJhdGUgSFRUUCB2ZXJiIG1ldGhvZHNcbmlmICghbWV0aG9kcy5pbmNsdWRlcygnZGVsJykpIHtcbiAgLy8gY3JlYXRlIGEgY29weSBzbyB3ZSBkb24ndCBjYXVzZSBjb25mbGljdHMgd2l0aFxuICAvLyBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgbWV0aG9kcyBwYWNrYWdlIGFuZFxuICAvLyBucG0gMy54XG4gIG1ldGhvZHMgPSBbLi4ubWV0aG9kc107XG4gIG1ldGhvZHMucHVzaCgnZGVsJyk7XG59XG5cbmZvciAobGV0IG1ldGhvZCBvZiBtZXRob2RzKSB7XG4gIGNvbnN0IG5hbWUgPSBtZXRob2Q7XG4gIG1ldGhvZCA9IG1ldGhvZCA9PT0gJ2RlbCcgPyAnZGVsZXRlJyA6IG1ldGhvZDtcblxuICBtZXRob2QgPSBtZXRob2QudG9VcHBlckNhc2UoKTtcbiAgcmVxdWVzdFtuYW1lXSA9ICh1cmwsIGRhdGEsIGZuKSA9PiB7XG4gICAgY29uc3QgcmVxdWVzdF8gPSByZXF1ZXN0KG1ldGhvZCwgdXJsKTtcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZuID0gZGF0YTtcbiAgICAgIGRhdGEgPSBudWxsO1xuICAgIH1cblxuICAgIGlmIChkYXRhKSB7XG4gICAgICBpZiAobWV0aG9kID09PSAnR0VUJyB8fCBtZXRob2QgPT09ICdIRUFEJykge1xuICAgICAgICByZXF1ZXN0Xy5xdWVyeShkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcXVlc3RfLnNlbmQoZGF0YSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZuKSByZXF1ZXN0Xy5lbmQoZm4pO1xuICAgIHJldHVybiByZXF1ZXN0XztcbiAgfTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBgbWltZWAgaXMgdGV4dCBhbmQgc2hvdWxkIGJlIGJ1ZmZlcmVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtaW1lXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBpc1RleHQobWltZSkge1xuICBjb25zdCBwYXJ0cyA9IG1pbWUuc3BsaXQoJy8nKTtcbiAgbGV0IHR5cGUgPSBwYXJ0c1swXTtcbiAgaWYgKHR5cGUpIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICBsZXQgc3VidHlwZSA9IHBhcnRzWzFdO1xuICBpZiAoc3VidHlwZSkgc3VidHlwZSA9IHN1YnR5cGUudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgcmV0dXJuIHR5cGUgPT09ICd0ZXh0JyB8fCBzdWJ0eXBlID09PSAneC13d3ctZm9ybS11cmxlbmNvZGVkJztcbn1cblxuLy8gVGhpcyBpcyBub3QgYSBjYXRjaGFsbCwgYnV0IGEgc3RhcnQuIEl0IG1pZ2h0IGJlIHVzZWZ1bFxuLy8gaW4gdGhlIGxvbmcgcnVuIHRvIGhhdmUgZmlsZSB0aGF0IGluY2x1ZGVzIGFsbCBiaW5hcnlcbi8vIGNvbnRlbnQgdHlwZXMgZnJvbSBodHRwczovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy9tZWRpYS10eXBlcy54aHRtbFxuZnVuY3Rpb24gaXNCaW5hcnkobWltZSkge1xuICBsZXQgW3JlZ2lzdHJ5LCBuYW1lXSA9IG1pbWUuc3BsaXQoJy8nKTtcbiAgaWYgKHJlZ2lzdHJ5KSByZWdpc3RyeSA9IHJlZ2lzdHJ5LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICBpZiAobmFtZSkgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gIHJldHVybiAoXG4gICAgWydhdWRpbycsICdmb250JywgJ2ltYWdlJywgJ3ZpZGVvJ10uaW5jbHVkZXMocmVnaXN0cnkpIHx8XG4gICAgWydneicsICdnemlwJ10uaW5jbHVkZXMobmFtZSlcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBgbWltZWAgaXMganNvbiBvciBoYXMgK2pzb24gc3RydWN0dXJlZCBzeW50YXggc3VmZml4LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtaW1lXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNKU09OKG1pbWUpIHtcbiAgLy8gc2hvdWxkIG1hdGNoIC9qc29uIG9yICtqc29uXG4gIC8vIGJ1dCBub3QgL2pzb24tc2VxXG4gIHJldHVybiAvWy8rXWpzb24oJHxbXi1cXHddKS9pLnRlc3QobWltZSk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgd2Ugc2hvdWxkIGZvbGxvdyB0aGUgcmVkaXJlY3QgYGNvZGVgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb2RlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNSZWRpcmVjdChjb2RlKSB7XG4gIHJldHVybiBbMzAxLCAzMDIsIDMwMywgMzA1LCAzMDcsIDMwOF0uaW5jbHVkZXMoY29kZSk7XG59XG5cbmZ1bmN0aW9uIGhhc05vbkVtcHR5UmVzcG9uc2VDb250ZW50KHJlcykge1xuICBpZiAocmVzLnN0YXR1c0NvZGUgPT09IDIwNCB8fCByZXMuc3RhdHVzQ29kZSA9PT0gMzA0KSB7XG4gICAgLy8gVGhlc2UgYXJlbid0IHN1cHBvc2VkIHRvIGhhdmUgYW55IGJvZHlcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBoZWFkZXIgY29udGVudCBpcyBhIHN0cmluZywgYW5kIGRpc3RpbmN0aW9uIGJldHdlZW4gMCBhbmQgbm8gaW5mb3JtYXRpb24gaXMgY3J1Y2lhbFxuICBpZiAocmVzLmhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10gPT09ICcwJykge1xuICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgYm9keSBpcyBlbXB0eSAodW5mb3J0dW5hdGVseSwgdGhpcyBjaGVjayBkb2VzIG5vdCBjb3ZlciBjaHVua2VkIGVuY29kaW5nKVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7QUFDQTs7QUFFQSxNQUFNO0VBQUVBO0FBQU8sQ0FBQyxHQUFHQyxPQUFPLENBQUMsVUFBVSxDQUFDO0FBQ3RDLE1BQU1DLE1BQU0sR0FBR0QsT0FBTyxDQUFDLGFBQWEsQ0FBQztBQUNyQyxNQUFNRSxLQUFLLEdBQUdGLE9BQU8sQ0FBQyxZQUFZLENBQUM7QUFDbkMsTUFBTUcsSUFBSSxHQUFHSCxPQUFPLENBQUMsV0FBVyxDQUFDO0FBQ2pDLE1BQU1JLEVBQUUsR0FBR0osT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUM3QixNQUFNSyxJQUFJLEdBQUdMLE9BQU8sQ0FBQyxXQUFXLENBQUM7QUFDakMsTUFBTU0sSUFBSSxHQUFHTixPQUFPLENBQUMsV0FBVyxDQUFDO0FBQ2pDLE1BQU1PLEVBQUUsR0FBR1AsT0FBTyxDQUFDLElBQUksQ0FBQztBQUN4QixNQUFNUSxJQUFJLEdBQUdSLE9BQU8sQ0FBQyxNQUFNLENBQUM7QUFDNUIsSUFBSVMsT0FBTyxHQUFHVCxPQUFPLENBQUMsU0FBUyxDQUFDO0FBQ2hDLE1BQU1VLFFBQVEsR0FBR1YsT0FBTyxDQUFDLFdBQVcsQ0FBQztBQUNyQyxNQUFNVyxVQUFVLEdBQUdYLE9BQU8sQ0FBQyxZQUFZLENBQUM7QUFDeEMsTUFBTVksS0FBSyxHQUFHWixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDO0FBQzVDLE1BQU1hLFNBQVMsR0FBR2IsT0FBTyxDQUFDLFdBQVcsQ0FBQztBQUN0QyxNQUFNYyxhQUFhLEdBQUdkLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztBQUVwRCxNQUFNZSxLQUFLLEdBQUdmLE9BQU8sQ0FBQyxVQUFVLENBQUM7QUFDakMsTUFBTWdCLFdBQVcsR0FBR2hCLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztB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QUVuRCxPQUFPNUgsSUFBSSxLQUFLLE1BQU0sSUFBSXNMLE9BQU8sS0FBSyx1QkFBdUI7QUFDL0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBU3hDLFFBQVFBLENBQUN0UixJQUFJLEVBQUU7RUFDdEIsSUFBSSxDQUFDK1QsUUFBUSxFQUFFSixJQUFJLENBQUMsR0FBRzNULElBQUksQ0FBQ2lOLEtBQUssQ0FBQyxHQUFHLENBQUM7RUFDdEMsSUFBSThHLFFBQVEsRUFBRUEsUUFBUSxHQUFHQSxRQUFRLENBQUM1RCxXQUFXLENBQUMsQ0FBQyxDQUFDQyxJQUFJLENBQUMsQ0FBQztFQUN0RCxJQUFJdUQsSUFBSSxFQUFFQSxJQUFJLEdBQUdBLElBQUksQ0FBQ3hELFdBQVcsQ0FBQyxDQUFDLENBQUNDLElBQUksQ0FBQyxDQUFDO0VBQzFDLE9BQ0UsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQzFILFFBQVEsQ0FBQ3FMLFFBQVEsQ0FBQyxJQUN0RCxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQ3JMLFFBQVEsQ0FBQ2lMLElBQUksQ0FBQztBQUVqQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTOUQsTUFBTUEsQ0FBQzdQLElBQUksRUFBRTtFQUNwQjtFQUNBO0VBQ0EsT0FBTyxxQkFBcUIsQ0FBQ2dOLElBQUksQ0FBQ2hOLElBQUksQ0FBQztBQUN6Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTd0osVUFBVUEsQ0FBQ1EsSUFBSSxFQUFFO0VBQ3hCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDdEIsUUFBUSxDQUFDc0IsSUFBSSxDQUFDO0FBQ3REO0FBRUEsU0FBU3NKLDBCQUEwQkEsQ0FBQ25LLEdBQUcsRUFBRTtFQUN2QyxJQUFJQSxHQUFHLENBQUNNLFVBQVUsS0FBSyxHQUFHLElBQUlOLEdBQUcsQ0FBQ00sVUFBVSxLQUFLLEdBQUcsRUFBRTtJQUNwRDtJQUNBLE9BQU8sS0FBSztFQUNkOztFQUVBO0VBQ0EsSUFBSU4sR0FBRyxDQUFDZSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLEVBQUU7SUFDekM7SUFDQSxPQUFPLEtBQUs7RUFDZDtFQUVBLE9BQU8sSUFBSTtBQUNiIiwiaWdub3JlTGlzdCI6W119