@discordeno/gateway 19.0.0-next.b3a8c86 → 19.0.0-next.b42de2e

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.
@@ -16,6 +16,7 @@ _export(exports, {
16
16
  return _default;
17
17
  }
18
18
  });
19
+ const _nodebuffer = require("node:buffer");
19
20
  const _nodezlib = require("node:zlib");
20
21
  const _types = require("@discordeno/types");
21
22
  const _utils = require("@discordeno/utils");
@@ -26,6 +27,57 @@ function _interop_require_default(obj) {
26
27
  default: obj
27
28
  };
28
29
  }
30
+ function _getRequireWildcardCache(nodeInterop) {
31
+ if (typeof WeakMap !== "function") return null;
32
+ var cacheBabelInterop = new WeakMap();
33
+ var cacheNodeInterop = new WeakMap();
34
+ return (_getRequireWildcardCache = function(nodeInterop) {
35
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
36
+ })(nodeInterop);
37
+ }
38
+ function _interop_require_wildcard(obj, nodeInterop) {
39
+ if (!nodeInterop && obj && obj.__esModule) {
40
+ return obj;
41
+ }
42
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
43
+ return {
44
+ default: obj
45
+ };
46
+ }
47
+ var cache = _getRequireWildcardCache(nodeInterop);
48
+ if (cache && cache.has(obj)) {
49
+ return cache.get(obj);
50
+ }
51
+ var newObj = {
52
+ __proto__: null
53
+ };
54
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
55
+ for(var key in obj){
56
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
57
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
58
+ if (desc && (desc.get || desc.set)) {
59
+ Object.defineProperty(newObj, key, desc);
60
+ } else {
61
+ newObj[key] = obj[key];
62
+ }
63
+ }
64
+ }
65
+ newObj.default = obj;
66
+ if (cache) {
67
+ cache.set(obj, newObj);
68
+ }
69
+ return newObj;
70
+ }
71
+ const ZLIB_SYNC_FLUSH = new Uint8Array([
72
+ 0x0,
73
+ 0x0,
74
+ 0xff,
75
+ 0xff
76
+ ]);
77
+ let fzstd;
78
+ /** Since fzstd is an optional dependency, we need to import it lazily */ async function getFZStd() {
79
+ return fzstd ??= await Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("fzstd")));
80
+ }
29
81
  let DiscordenoShard = class DiscordenoShard {
30
82
  constructor(options){
31
83
  /** The maximum of requests which can be send to discord per rate limit tick. Typically this value should not be changed. */ this.maxRequestsPerRateLimitTick = 120;
@@ -36,6 +88,9 @@ let DiscordenoShard = class DiscordenoShard {
36
88
  /** The shard related event handlers. */ this.events = {};
37
89
  /** Cache for pending gateway requests which should have been send while the gateway went offline. */ this.offlineSendQueue = [];
38
90
  /** Resolve internal waiting states. Mapped by SelectedEvents => ResolveFunction */ this.resolves = new Map();
91
+ /** Text decoder used for compressed payloads */ this.textDecoder = new TextDecoder();
92
+ /** ZLib inflate buffer */ this.inflateBuffer = null;
93
+ /** Queue for compressed payloads for Zstd Decompress */ this.decompressionPromisesQueue = [];
39
94
  this.id = options.id;
40
95
  this.connection = options.connection;
41
96
  this.events = options.events;
@@ -91,14 +146,59 @@ let DiscordenoShard = class DiscordenoShard {
91
146
  const url = new URL(this.connectionUrl);
92
147
  url.searchParams.set('v', this.gatewayConfig.version.toString());
93
148
  url.searchParams.set('encoding', 'json');
149
+ // Set the compress url param and initialize the decompression contexts
150
+ if (this.gatewayConfig.transportCompression) {
151
+ url.searchParams.set('compress', this.gatewayConfig.transportCompression);
152
+ if (this.gatewayConfig.transportCompression === _types1.TransportCompression.zlib) {
153
+ this.inflateBuffer = null;
154
+ this.inflate = (0, _nodezlib.createInflate)({
155
+ finishFlush: _nodezlib.constants.Z_SYNC_FLUSH,
156
+ chunkSize: 64 * 1024
157
+ });
158
+ this.inflate.on('error', (e)=>{
159
+ this.logger.error('The was an error in decompressing a ZLib compressed payload', e);
160
+ });
161
+ this.inflate.on('data', (data)=>{
162
+ if (!(data instanceof Uint8Array)) return;
163
+ if (this.inflateBuffer) {
164
+ const newBuffer = new Uint8Array(this.inflateBuffer.byteLength + data.byteLength);
165
+ newBuffer.set(this.inflateBuffer);
166
+ newBuffer.set(data, this.inflateBuffer.byteLength);
167
+ this.inflateBuffer = newBuffer;
168
+ return;
169
+ }
170
+ this.inflateBuffer = data;
171
+ });
172
+ }
173
+ if (this.gatewayConfig.transportCompression === _types1.TransportCompression.zstd) {
174
+ const fzstd = await getFZStd().catch(()=>{
175
+ this.logger.warn('[Shard] "fzstd" is not installed. Disabled transport compression.');
176
+ url.searchParams.delete('compress');
177
+ return null;
178
+ });
179
+ if (fzstd) {
180
+ this.zstdDecompress = new fzstd.Decompress((data)=>{
181
+ const decodedData = this.textDecoder.decode(data);
182
+ const parsedData = JSON.parse(decodedData);
183
+ this.decompressionPromisesQueue.shift()?.(parsedData);
184
+ });
185
+ }
186
+ }
187
+ }
188
+ if (this.gatewayConfig.compress && this.gatewayConfig.transportCompression) {
189
+ this.logger.warn('[Shard] Payload compression has been disabled since transport compression is enabled as well.');
190
+ this.gatewayConfig.compress = false;
191
+ }
94
192
  // We check for built-in WebSocket implementations in Bun or Deno, NodeJS v22 has an implementation too but it seems to be less optimized so for now it is better to use the ws npm package
95
193
  const shouldUseBuiltin = Reflect.has(globalThis, 'WebSocket') && (Reflect.has(globalThis, 'Bun') || Reflect.has(globalThis, 'Deno'));
96
194
  // @ts-expect-error NodeWebSocket doesn't support "dispatchEvent", and while we don't use it, it is required on the "WebSocket" type
97
195
  const socket = shouldUseBuiltin ? new WebSocket(url) : new _ws.default(url);
98
196
  this.socket = socket;
197
+ // By default WebSocket will give us a Blob, this changes it so that it gives us an ArrayBuffer
198
+ socket.binaryType = 'arraybuffer';
99
199
  socket.onerror = (event)=>this.handleError(event);
100
- socket.onclose = async (closeEvent)=>await this.handleClose(closeEvent);
101
- socket.onmessage = async (messageEvent)=>await this.handleMessage(messageEvent);
200
+ socket.onclose = (closeEvent)=>this.handleClose(closeEvent);
201
+ socket.onmessage = (messageEvent)=>this.handleMessage(messageEvent);
102
202
  return await new Promise((resolve)=>{
103
203
  socket.onopen = ()=>{
104
204
  // Only set the shard to `Unidentified` state if the connection request does not come from an identify or resume action.
@@ -219,6 +319,11 @@ let DiscordenoShard = class DiscordenoShard {
219
319
  }
220
320
  /** Handle a gateway connection close. */ async handleClose(close) {
221
321
  this.stopHeartbeating();
322
+ // Clear the zlib/zstd data
323
+ this.inflate = undefined;
324
+ this.zstdDecompress = undefined;
325
+ this.inflateBuffer = null;
326
+ this.decompressionPromisesQueue = [];
222
327
  this.logger.debug(`[Shard] Gateway connection closed with code ${close.code} (${close.reason || '<No reason provided>'}).`);
223
328
  switch(close.code){
224
329
  case _types1.ShardSocketCloseCodes.TestingFinished:
@@ -278,14 +383,55 @@ let DiscordenoShard = class DiscordenoShard {
278
383
  }
279
384
  }
280
385
  /** Handle an incoming gateway message. */ async handleMessage(message) {
281
- let preProcessMessage = message.data;
282
- // If message compression is enabled, Discord might send zlib compressed payloads.
283
- if (this.gatewayConfig.compress && preProcessMessage instanceof Blob) {
284
- preProcessMessage = (0, _nodezlib.inflateSync)(await preProcessMessage.arrayBuffer()).toString();
386
+ // The ws npm package will use a Buffer, while the global built-in will use ArrayBuffer
387
+ const isCompressed = message.data instanceof ArrayBuffer || message.data instanceof _nodebuffer.Buffer;
388
+ const data = isCompressed ? await this.decompressPacket(message.data) : JSON.parse(message.data);
389
+ // Check if the decompression was not successful
390
+ if (!data) return;
391
+ await this.handleDiscordPacket(data);
392
+ }
393
+ /**
394
+ * Decompress a zlib/zstd compressed packet
395
+ *
396
+ * @private
397
+ */ async decompressPacket(data) {
398
+ // A buffer is a Uint8Array under the hood. An ArrayBuffer is generic, so we need to create the Uint8Array that uses the whole ArrayBuffer
399
+ const compressedData = data instanceof _nodebuffer.Buffer ? data : new Uint8Array(data);
400
+ if (this.gatewayConfig.transportCompression === _types1.TransportCompression.zlib) {
401
+ if (!this.inflate) {
402
+ this.logger.fatal('[Shard] zlib-stream transport compression was enabled but no instance of Inflate was found.');
403
+ return null;
404
+ }
405
+ // Alias, used to avoid some null checks in the Promise constructor
406
+ const inflate = this.inflate;
407
+ const writePromise = new Promise((resolve, reject)=>{
408
+ inflate.write(compressedData, 'binary', (error)=>error ? reject(error) : resolve());
409
+ });
410
+ if (!endsWithMarker(compressedData, ZLIB_SYNC_FLUSH)) return null;
411
+ await writePromise;
412
+ if (!this.inflateBuffer) {
413
+ this.logger.warn('[Shard] The ZLib inflate buffer was cleared at an unexpected moment.');
414
+ return null;
415
+ }
416
+ const decodedData = this.textDecoder.decode(this.inflateBuffer);
417
+ this.inflateBuffer = null;
418
+ return JSON.parse(decodedData);
419
+ }
420
+ if (this.gatewayConfig.transportCompression === _types1.TransportCompression.zstd) {
421
+ if (!this.zstdDecompress) {
422
+ this.logger.fatal('[Shard] zstd-stream transport compression was enabled but no instance of Decompress was found.');
423
+ return null;
424
+ }
425
+ this.zstdDecompress.push(compressedData);
426
+ const decompressionPromise = new Promise((r)=>this.decompressionPromisesQueue.push(r));
427
+ return await decompressionPromise;
285
428
  }
286
- // Safeguard incase decompression failed to make a string.
287
- if (typeof preProcessMessage !== 'string') return;
288
- return await this.handleDiscordPacket(JSON.parse(preProcessMessage));
429
+ if (this.gatewayConfig.compress) {
430
+ const decompressed = (0, _nodezlib.inflateSync)(compressedData);
431
+ const decodedData = this.textDecoder.decode(decompressed);
432
+ return JSON.parse(decodedData);
433
+ }
434
+ return null;
289
435
  }
290
436
  /** Handles a incoming gateway packet. */ async handleDiscordPacket(packet) {
291
437
  // Edge case start: https://github.com/discordeno/discordeno/issues/2311
@@ -482,6 +628,13 @@ let DiscordenoShard = class DiscordenoShard {
482
628
  clearTimeout(this.heart.timeoutId);
483
629
  }
484
630
  };
631
+ /** Check if the buffer ends with the marker */ function endsWithMarker(buffer, marker) {
632
+ if (buffer.length < marker.length) return false;
633
+ for(let i = 0; i < marker.length; i++){
634
+ if (buffer[buffer.length - marker.length + i] !== marker[i]) return false;
635
+ }
636
+ return true;
637
+ }
485
638
  const _default = DiscordenoShard;
486
639
 
487
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TaGFyZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmZsYXRlU3luYyB9IGZyb20gJ25vZGU6emxpYidcbmltcG9ydCB0eXBlIHsgRGlzY29yZEdhdGV3YXlQYXlsb2FkLCBEaXNjb3JkSGVsbG8sIERpc2NvcmRSZWFkeSB9IGZyb20gJ0BkaXNjb3JkZW5vL3R5cGVzJ1xuaW1wb3J0IHsgR2F0ZXdheUNsb3NlRXZlbnRDb2RlcywgR2F0ZXdheU9wY29kZXMgfSBmcm9tICdAZGlzY29yZGVuby90eXBlcydcbmltcG9ydCB7IExlYWt5QnVja2V0LCBjYW1lbGl6ZSwgZGVsYXksIGxvZ2dlciB9IGZyb20gJ0BkaXNjb3JkZW5vL3V0aWxzJ1xuaW1wb3J0IE5vZGVXZWJTb2NrZXQgZnJvbSAnd3MnXG5pbXBvcnQge1xuICB0eXBlIEJvdFN0YXR1c1VwZGF0ZSxcbiAgdHlwZSBTaGFyZEV2ZW50cyxcbiAgdHlwZSBTaGFyZEdhdGV3YXlDb25maWcsXG4gIHR5cGUgU2hhcmRIZWFydCxcbiAgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLFxuICB0eXBlIFNoYXJkU29ja2V0UmVxdWVzdCxcbiAgU2hhcmRTdGF0ZSxcbn0gZnJvbSAnLi90eXBlcy5qcydcblxuZXhwb3J0IGNsYXNzIERpc2NvcmRlbm9TaGFyZCB7XG4gIC8qKiBUaGUgaWQgb2YgdGhlIHNoYXJkICovXG4gIGlkOiBudW1iZXJcbiAgLyoqIFRoZSBjb25uZWN0aW9uIGNvbmZpZyBkZXRhaWxzIHRoYXQgdGhpcyBzaGFyZCB3aWxsIHVzZWQgdG8gY29ubmVjdCB0byBkaXNjb3JkLiAqL1xuICBjb25uZWN0aW9uOiBTaGFyZEdhdGV3YXlDb25maWdcbiAgLyoqIFRoaXMgY29udGFpbnMgYWxsIHRoZSBoZWFydGJlYXQgaW5mb3JtYXRpb24gKi9cbiAgaGVhcnQ6IFNoYXJkSGVhcnRcbiAgLyoqIFRoZSBtYXhpbXVtIG9mIHJlcXVlc3RzIHdoaWNoIGNhbiBiZSBzZW5kIHRvIGRpc2NvcmQgcGVyIHJhdGUgbGltaXQgdGljay4gVHlwaWNhbGx5IHRoaXMgdmFsdWUgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkLiAqL1xuICBtYXhSZXF1ZXN0c1BlclJhdGVMaW1pdFRpY2s6IG51bWJlciA9IDEyMFxuICAvKiogVGhlIHByZXZpb3VzIHBheWxvYWQgc2VxdWVuY2UgbnVtYmVyLiAqL1xuICBwcmV2aW91c1NlcXVlbmNlTnVtYmVyOiBudW1iZXIgfCBudWxsID0gbnVsbFxuICAvKiogSW4gd2hpY2ggaW50ZXJ2YWwgKGluIG1pbGxpc2Vjb25kcykgdGhlIGdhdGV3YXkgcmVzZXRzIGl0J3MgcmF0ZSBsaW1pdC4gKi9cbiAgcmF0ZUxpbWl0UmVzZXRJbnRlcnZhbDogbnVtYmVyID0gNjAwMDBcbiAgLyoqIEN1cnJlbnQgc2Vzc2lvbiBpZCBvZiB0aGUgc2hhcmQgaWYgcHJlc2VudC4gKi9cbiAgc2Vzc2lvbklkPzogc3RyaW5nXG4gIC8qKiBUaGlzIGNvbnRhaW5zIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byBEaXNjb3JkLCBpZiBjdXJyZW50bHkgY29ubmVjdGVkLiAqL1xuICBzb2NrZXQ/OiBXZWJTb2NrZXRcbiAgLyoqIEN1cnJlbnQgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIHRoaXMuICovXG4gIHN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lXG4gIC8qKiBUaGUgdXJsIHByb3ZpZGVkIGJ5IGRpc2NvcmQgdG8gdXNlIHdoZW4gcmVzdW1pbmcgYSBjb25uZWN0aW9uIGZvciB0aGlzIHRoaXMuICovXG4gIHJlc3VtZUdhdGV3YXlVcmw6IHN0cmluZyA9ICcnXG4gIC8qKiBUaGUgc2hhcmQgcmVsYXRlZCBldmVudCBoYW5kbGVycy4gKi9cbiAgZXZlbnRzOiBTaGFyZEV2ZW50cyA9IHt9XG4gIC8qKiBDYWNoZSBmb3IgcGVuZGluZyBnYXRld2F5IHJlcXVlc3RzIHdoaWNoIHNob3VsZCBoYXZlIGJlZW4gc2VuZCB3aGlsZSB0aGUgZ2F0ZXdheSB3ZW50IG9mZmxpbmUuICovXG4gIG9mZmxpbmVTZW5kUXVldWU6ICgoKSA9PiB2b2lkKVtdID0gW11cbiAgLyoqIFJlc29sdmUgaW50ZXJuYWwgd2FpdGluZyBzdGF0ZXMuIE1hcHBlZCBieSBTZWxlY3RlZEV2ZW50cyA9PiBSZXNvbHZlRnVuY3Rpb24gKi9cbiAgcmVzb2x2ZXMgPSBuZXcgTWFwPCdSRUFEWScgfCAnUkVTVU1FRCcgfCAnSU5WQUxJRF9TRVNTSU9OJywgKHBheWxvYWQ6IERpc2NvcmRHYXRld2F5UGF5bG9hZCkgPT4gdm9pZD4oKVxuICAvKiogU2hhcmQgYnVja2V0LiBPbmx5IGFjY2VzcyB0aGlzIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4gQnVja2V0IGZvciBoYW5kbGluZyBzaGFyZCByZXF1ZXN0IHJhdGUgbGltaXRzLiAqL1xuICBidWNrZXQ6IExlYWt5QnVja2V0XG4gIC8qKiBMb2dnZXIgZm9yIHRoZSBidWNrZXQgKi9cbiAgbG9nZ2VyOiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz5cblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBTaGFyZENyZWF0ZU9wdGlvbnMpIHtcbiAgICB0aGlzLmlkID0gb3B0aW9ucy5pZFxuICAgIHRoaXMuY29ubmVjdGlvbiA9IG9wdGlvbnMuY29ubmVjdGlvblxuICAgIHRoaXMuZXZlbnRzID0gb3B0aW9ucy5ldmVudHNcbiAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyID8/IGxvZ2dlclxuXG4gICAgdGhpcy5oZWFydCA9IHtcbiAgICAgIGFja25vd2xlZGdlZDogZmFsc2UsXG4gICAgICBpbnRlcnZhbDogNDUwMDAsXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucmVxdWVzdElkZW50aWZ5KSB0aGlzLnJlcXVlc3RJZGVudGlmeSA9IG9wdGlvbnMucmVxdWVzdElkZW50aWZ5XG4gICAgaWYgKG9wdGlvbnMuc2hhcmRJc1JlYWR5KSB0aGlzLnNoYXJkSXNSZWFkeSA9IG9wdGlvbnMuc2hhcmRJc1JlYWR5XG4gICAgaWYgKG9wdGlvbnMubWFrZVByZXNlbmNlKSB0aGlzLm1ha2VQcmVzZW5jZSA9IG9wdGlvbnMubWFrZVByZXNlbmNlXG5cbiAgICB0aGlzLmJ1Y2tldCA9IG5ldyBMZWFreUJ1Y2tldCh7XG4gICAgICBtYXg6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICByZWZpbGxBbW91bnQ6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICByZWZpbGxJbnRlcnZhbDogNjAwMDAsXG4gICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgIH0pXG4gIH1cblxuICAvKiogVGhlIGdhdGV3YXkgY29uZmlndXJhdGlvbiB3aGljaCBpcyB1c2VkIHRvIGNvbm5lY3QgdG8gRGlzY29yZC4gKi9cbiAgZ2V0IGdhdGV3YXlDb25maWcoKTogU2hhcmRHYXRld2F5Q29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uXG4gIH1cblxuICAvKiogVGhlIHVybCB0byBjb25uZWN0IHRvLiBJbml0aWFsbHkgdGhpcyBpcyB0aGUgZGlzY29yZCBnYXRld2F5IHVybCwgYW5kIHRoZW4gaXMgc3dpdGNoZWQgdG8gcmVzdW1lIGdhdGV3YXkgdXJsIG9uY2UgYSBSRUFEWSBpcyByZWNlaXZlZC4gKi9cbiAgZ2V0IGNvbm5lY3Rpb25VcmwoKTogc3RyaW5nIHtcbiAgICAvLyBVc2UgfHwgYW5kIG5vdCA/PyBoZXJlLiA/PyB3aWxsIGNhdXNlIGEgYnVnLlxuICAgIHJldHVybiB0aGlzLnJlc3VtZUdhdGV3YXlVcmwgfHwgdGhpcy5nYXRld2F5Q29uZmlnLnVybFxuICB9XG5cbiAgLyoqIENhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIHJlcXVlc3RzIHdoaWNoIGNhbiBzYWZlbHkgYmUgbWFkZSBwZXIgcmF0ZSBsaW1pdCBpbnRlcnZhbCwgYmVmb3JlIHRoZSBnYXRld2F5IGdldHMgZGlzY29ubmVjdGVkIGR1ZSB0byBhbiBleGNlZWRlZCByYXRlIGxpbWl0LiAqL1xuICBjYWxjdWxhdGVTYWZlUmVxdWVzdHMoKTogbnVtYmVyIHtcbiAgICAvLyAqIDIgYWRkcyBleHRyYSBzYWZldHkgbGF5ZXIgZm9yIGRpc2NvcmRzIE9QIDEgcmVxdWVzdHMgdGhhdCB3ZSBuZWVkIHRvIHJlc3BvbmQgdG9cbiAgICBjb25zdCBzYWZlUmVxdWVzdHMgPSB0aGlzLm1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljayAtIE1hdGguY2VpbCh0aGlzLnJhdGVMaW1pdFJlc2V0SW50ZXJ2YWwgLyB0aGlzLmhlYXJ0LmludGVydmFsKSAqIDJcblxuICAgIHJldHVybiBzYWZlUmVxdWVzdHMgPCAwID8gMCA6IHNhZmVSZXF1ZXN0c1xuICB9XG5cbiAgYXN5bmMgY2hlY2tPZmZsaW5lKGhpZ2hQcmlvcml0eTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzT3BlbigpKSByZXR1cm5cblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gSGlnaGVyIHByaW9yaXR5IHJlcXVlc3RzIGdldCBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS5cbiAgICAgIGlmIChoaWdoUHJpb3JpdHkpIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS51bnNoaWZ0KHJlc29sdmUpXG4gICAgICBlbHNlIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5wdXNoKHJlc29sdmUpXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBDbG9zZSB0aGUgc29ja2V0IGNvbm5lY3Rpb24gdG8gZGlzY29yZCBpZiBwcmVzZW50LiAqL1xuICBjbG9zZShjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc29ja2V0Py5yZWFkeVN0YXRlICE9PSBOb2RlV2ViU29ja2V0Lk9QRU4pIHJldHVyblxuXG4gICAgdGhpcy5zb2NrZXQ/LmNsb3NlKGNvZGUsIHJlYXNvbilcbiAgfVxuXG4gIC8qKiBDb25uZWN0IHRoZSBzaGFyZCB3aXRoIHRoZSBnYXRld2F5IGFuZCBzdGFydCBoZWFydGJlYXRpbmcuIFRoaXMgd2lsbCBub3QgaWRlbnRpZnkgdGhlIHNoYXJkIHRvIHRoZSBnYXRld2F5LiAqL1xuICBhc3luYyBjb25uZWN0KCk6IFByb21pc2U8RGlzY29yZGVub1NoYXJkPiB7XG4gICAgLy8gT25seSBzZXQgdGhlIHNoYXJkIHRvIGBDb25uZWN0aW5nYCBzdGF0ZSxcbiAgICAvLyBpZiB0aGUgY29ubmVjdGlvbiByZXF1ZXN0IGRvZXMgbm90IGNvbWUgZnJvbSBhbiBpZGVudGlmeSBvciByZXN1bWUgYWN0aW9uLlxuICAgIGlmICghW1NoYXJkU3RhdGUuSWRlbnRpZnlpbmcsIFNoYXJkU3RhdGUuUmVzdW1pbmddLmluY2x1ZGVzKHRoaXMuc3RhdGUpKSB7XG4gICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5Db25uZWN0aW5nXG4gICAgfVxuXG4gICAgdGhpcy5ldmVudHMuY29ubmVjdGluZz8uKHRoaXMpXG5cbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHRoaXMuY29ubmVjdGlvblVybClcbiAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgndicsIHRoaXMuZ2F0ZXdheUNvbmZpZy52ZXJzaW9uLnRvU3RyaW5nKCkpXG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2VuY29kaW5nJywgJ2pzb24nKVxuXG4gICAgLy8gV2UgY2hlY2sgZm9yIGJ1aWx0LWluIFdlYlNvY2tldCBpbXBsZW1lbnRhdGlvbnMgaW4gQnVuIG9yIERlbm8sIE5vZGVKUyB2MjIgaGFzIGFuIGltcGxlbWVudGF0aW9uIHRvbyBidXQgaXQgc2VlbXMgdG8gYmUgbGVzcyBvcHRpbWl6ZWQgc28gZm9yIG5vdyBpdCBpcyBiZXR0ZXIgdG8gdXNlIHRoZSB3cyBucG0gcGFja2FnZVxuICAgIGNvbnN0IHNob3VsZFVzZUJ1aWx0aW4gPSBSZWZsZWN0LmhhcyhnbG9iYWxUaGlzLCAnV2ViU29ja2V0JykgJiYgKFJlZmxlY3QuaGFzKGdsb2JhbFRoaXMsICdCdW4nKSB8fCBSZWZsZWN0LmhhcyhnbG9iYWxUaGlzLCAnRGVubycpKVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBOb2RlV2ViU29ja2V0IGRvZXNuJ3Qgc3VwcG9ydCBcImRpc3BhdGNoRXZlbnRcIiwgYW5kIHdoaWxlIHdlIGRvbid0IHVzZSBpdCwgaXQgaXMgcmVxdWlyZWQgb24gdGhlIFwiV2ViU29ja2V0XCIgdHlwZVxuICAgIGNvbnN0IHNvY2tldDogV2ViU29ja2V0ID0gc2hvdWxkVXNlQnVpbHRpbiA/IG5ldyBXZWJTb2NrZXQodXJsKSA6IG5ldyBOb2RlV2ViU29ja2V0KHVybClcbiAgICB0aGlzLnNvY2tldCA9IHNvY2tldFxuXG4gICAgc29ja2V0Lm9uZXJyb3IgPSAoZXZlbnQpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXZlbnQpXG4gICAgc29ja2V0Lm9uY2xvc2UgPSBhc3luYyAoY2xvc2VFdmVudCkgPT4gYXdhaXQgdGhpcy5oYW5kbGVDbG9zZShjbG9zZUV2ZW50KVxuICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBhc3luYyAobWVzc2FnZUV2ZW50KSA9PiBhd2FpdCB0aGlzLmhhbmRsZU1lc3NhZ2UobWVzc2FnZUV2ZW50KVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBzb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICAvLyBPbmx5IHNldCB0aGUgc2hhcmQgdG8gYFVuaWRlbnRpZmllZGAgc3RhdGUgaWYgdGhlIGNvbm5lY3Rpb24gcmVxdWVzdCBkb2VzIG5vdCBjb21lIGZyb20gYW4gaWRlbnRpZnkgb3IgcmVzdW1lIGFjdGlvbi5cbiAgICAgICAgaWYgKCFbU2hhcmRTdGF0ZS5JZGVudGlmeWluZywgU2hhcmRTdGF0ZS5SZXN1bWluZ10uaW5jbHVkZXModGhpcy5zdGF0ZSkpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5VbmlkZW50aWZpZWRcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXZlbnRzLmNvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgcmVzb2x2ZSh0aGlzKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKiogSWRlbnRpZnkgdGhlIHNoYXJkIHRvIHRoZSBnYXRld2F5LiBJZiBub3QgY29ubmVjdGVkLCB0aGlzIHdpbGwgYWxzbyBjb25uZWN0IHRoZSBzaGFyZCB0byB0aGUgZ2F0ZXdheS4gKi9cbiAgYXN5bmMgaWRlbnRpZnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQSBuZXcgaWRlbnRpZnkgaGFzIGJlZW4gcmVxdWVzdGVkIGV2ZW4gdGhvdWdoIHRoZXJlIGlzIGFscmVhZHkgYSBjb25uZWN0aW9uIG9wZW4uXG4gICAgLy8gVGhlcmVmb3JlIHdlIG5lZWQgdG8gY2xvc2UgdGhlIG9sZCBjb25uZWN0aW9uIGFuZCBoZWFydGJlYXRpbmcgYmVmb3JlIGNyZWF0aW5nIGEgbmV3IG9uZS5cbiAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYENMT1NJTkcgRVhJU1RJTkcgU0hBUkQ6ICMke3RoaXMuaWR9YClcbiAgICAgIHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlSWRlbnRpZnlpbmcsICdSZS1pZGVudGlmeWluZyBjbG9zdXJlIG9mIG9sZCBjb25uZWN0aW9uLicpXG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuSWRlbnRpZnlpbmdcbiAgICB0aGlzLmV2ZW50cy5pZGVudGlmeWluZz8uKHRoaXMpXG5cbiAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBzaGFyZCBpcyBpbiBIZWFydGJlYXRpbmcgc3RhdGUgYnV0IG5vdCBpZGVudGlmaWVkLFxuICAgIC8vIHNvIGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYWxyZWFkeSBhIGdhdGV3YXkgY29ubmVjdGlvbiBleGlzdGluZy5cbiAgICAvLyBJZiBub3Qgd2UgbmVlZCB0byBjcmVhdGUgb25lIGJlZm9yZSB3ZSBpZGVudGlmeS5cbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpXG4gICAgfVxuXG4gICAgdGhpcy5zZW5kKFxuICAgICAge1xuICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuSWRlbnRpZnksXG4gICAgICAgIGQ6IHtcbiAgICAgICAgICB0b2tlbjogYEJvdCAke3RoaXMuZ2F0ZXdheUNvbmZpZy50b2tlbn1gLFxuICAgICAgICAgIGNvbXByZXNzOiB0aGlzLmdhdGV3YXlDb25maWcuY29tcHJlc3MsXG4gICAgICAgICAgcHJvcGVydGllczogdGhpcy5nYXRld2F5Q29uZmlnLnByb3BlcnRpZXMsXG4gICAgICAgICAgaW50ZW50czogdGhpcy5nYXRld2F5Q29uZmlnLmludGVudHMsXG4gICAgICAgICAgc2hhcmQ6IFt0aGlzLmlkLCB0aGlzLmdhdGV3YXlDb25maWcudG90YWxTaGFyZHNdLFxuICAgICAgICAgIHByZXNlbmNlOiBhd2FpdCB0aGlzLm1ha2VQcmVzZW5jZT8uKCksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICApXG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdSRUFEWScsICgpID0+IHtcbiAgICAgICAgdGhpcy5ldmVudHMuaWRlbnRpZmllZD8uKHRoaXMpXG4gICAgICAgIC8vIFRlbGxzIHRoZSBtYW5hZ2VyIHRoYXQgdGhpcyBzaGFyZCBpcyByZWFkeVxuICAgICAgICB0aGlzLnNoYXJkSXNSZWFkeSgpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSlcbiAgICAgIC8vIFdoZW4gaWRlbnRpZnlpbmcgdG9vIGZhc3QsXG4gICAgICAvLyBEaXNjb3JkIHNlbmRzIGFuIGludmFsaWQgc2Vzc2lvbiBwYXlsb2FkLlxuICAgICAgLy8gVGhpcyBjYW4gc2FmZWx5IGJlIGlnbm9yZWQgdGhvdWdoIGFuZCB0aGUgc2hhcmQgc3RhcnRzIGEgbmV3IGlkZW50aWZ5IGFjdGlvbi5cbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdJTlZBTElEX1NFU1NJT04nLCAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdSRUFEWScpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqIENoZWNrIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gdG8gRGlzY29yZCBpcyBjdXJyZW50bHkgb3Blbi4gKi9cbiAgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNvY2tldD8ucmVhZHlTdGF0ZSA9PT0gTm9kZVdlYlNvY2tldC5PUEVOXG4gIH1cblxuICAvKiogQXR0ZW1wdCB0byByZXN1bWUgdGhlIHByZXZpb3VzIHNoYXJkcyBzZXNzaW9uIHdpdGggdGhlIGdhdGV3YXkuICovXG4gIGFzeW5jIHJlc3VtZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFJlc3VtaW5nIFNoYXJkICMke3RoaXMuaWR9YClcbiAgICAvLyBJdCBoYXMgYmVlbiByZXF1ZXN0ZWQgdG8gcmVzdW1lIHRoZSBTaGFyZHMgc2Vzc2lvbi5cbiAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHNoYXJkIGlzIHN0aWxsIGNvbm5lY3RlZCB3aXRoIERpc2NvcmQncyBnYXRld2F5IHRoZXJlZm9yZSB3ZSBuZWVkIHRvIGZvcmNlZnVsbHkgY2xvc2UgaXQuXG4gICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gUmVzdW1pbmcgU2hhcmQgIyR7dGhpcy5pZH0gaW4gaXNPcGVuYClcbiAgICAgIHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlc3VtZUNsb3NpbmdPbGRDb25uZWN0aW9uLCAnUmVjb25uZWN0aW5nIHRoZSBzaGFyZCwgY2xvc2luZyBvbGQgY29ubmVjdGlvbi4nKVxuICAgIH1cblxuICAgIC8vIFNoYXJkIGhhcyBuZXZlciBpZGVudGlmaWVkLCBzbyB3ZSBjYW5ub3QgcmVzdW1lLlxuICAgIGlmICghdGhpcy5zZXNzaW9uSWQpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFRyeWluZyB0byByZXN1bWUgYSBzaGFyZCAjJHt0aGlzLmlkfSB0aGF0IHdhcyBOT1QgZmlyc3QgaWRlbnRpZmllZC4gKE5vIHNlc3Npb24gaWQgZm91bmQpYClcblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaWRlbnRpZnkoKVxuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLlJlc3VtaW5nXG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFJlc3VtaW5nIFNoYXJkICMke3RoaXMuaWR9LCBiZWZvcmUgY29ubmVjdGluZ2ApXG4gICAgLy8gQmVmb3JlIHdlIGNhbiByZXN1bWUsIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gd2l0aCBEaXNjb3JkJ3MgZ2F0ZXdheS5cbiAgICBhd2FpdCB0aGlzLmNvbm5lY3QoKVxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gUmVzdW1pbmcgU2hhcmQgIyR7dGhpcy5pZH0sIGFmdGVyIGNvbm5lY3RpbmcuICR7dGhpcy5zZXNzaW9uSWR9IHwgJHt0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXJ9YClcblxuICAgIHRoaXMuc2VuZChcbiAgICAgIHtcbiAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLlJlc3VtZSxcbiAgICAgICAgZDoge1xuICAgICAgICAgIHRva2VuOiBgQm90ICR7dGhpcy5nYXRld2F5Q29uZmlnLnRva2VufWAsXG4gICAgICAgICAgc2Vzc2lvbl9pZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICAgICAgc2VxOiB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIgPz8gMCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgIClcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBSZXN1bWluZyBTaGFyZCAjJHt0aGlzLmlkfSBhZnRlciBzZW5kIHJlc3VtZWApXG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdSRVNVTUVEJywgKCkgPT4gcmVzb2x2ZSgpKVxuICAgICAgLy8gSWYgaXQgaXMgYXR0ZW1wdGVkIHRvIHJlc3VtZSB3aXRoIGFuIGludmFsaWQgc2Vzc2lvbiBpZCxcbiAgICAgIC8vIERpc2NvcmQgc2VuZHMgYW4gaW52YWxpZCBzZXNzaW9uIHBheWxvYWRcbiAgICAgIC8vIE5vdCBlcnJvcmluZyBoZXJlIHNpbmNlIGl0IGlzIGVhc3kgdGhhdCB0aGlzIGhhcHBlbnMsIGFsc28gaXQgd291bGQgYmUgbm90IGNhdGNoYWJsZVxuICAgICAgdGhpcy5yZXNvbHZlcy5zZXQoJ0lOVkFMSURfU0VTU0lPTicsICgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNvbHZlcy5kZWxldGUoJ1JFU1VNRUQnKVxuICAgICAgICByZXNvbHZlKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBTZW5kIGEgbWVzc2FnZSB0byBEaXNjb3JkLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtoaWdoUHJpb3JpdHk9ZmFsc2VdIC0gV2hldGhlciB0aGlzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNlbmQgYXNhcC5cbiAgICovXG4gIGFzeW5jIHNlbmQobWVzc2FnZTogU2hhcmRTb2NrZXRSZXF1ZXN0LCBoaWdoUHJpb3JpdHk6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEJlZm9yZSBhY3F1aXJpbmcgYSB0b2tlbiBmcm9tIHRoZSBidWNrZXQsIGNoZWNrIHdoZXRoZXIgdGhlIHNoYXJkIGlzIGN1cnJlbnRseSBvZmZsaW5lIG9yIG5vdC5cbiAgICAvLyBFbHNlIGJ1Y2tldCBhbmQgdG9rZW4gd2FpdCB0aW1lIGp1c3QgZ2V0IHdhc3RlZC5cbiAgICBhd2FpdCB0aGlzLmNoZWNrT2ZmbGluZShoaWdoUHJpb3JpdHkpXG5cbiAgICBhd2FpdCB0aGlzLmJ1Y2tldC5hY3F1aXJlKGhpZ2hQcmlvcml0eSlcblxuICAgIC8vIEl0J3MgcG9zc2libGUsIHRoYXQgdGhlIHNoYXJkIHdlbnQgb2ZmbGluZSBhZnRlciBhIHRva2VuIGhhcyBiZWVuIGFjcXVpcmVkIGZyb20gdGhlIGJ1Y2tldC5cbiAgICBhd2FpdCB0aGlzLmNoZWNrT2ZmbGluZShoaWdoUHJpb3JpdHkpXG5cbiAgICB0aGlzLnNvY2tldD8uc2VuZChKU09OLnN0cmluZ2lmeShtZXNzYWdlKSlcbiAgfVxuXG4gIC8qKiBTaHV0ZG93biB0aGUgdGhpcy4gRm9yY2VmdWxseSBkaXNjb25uZWN0IHRoZSBzaGFyZCBmcm9tIERpc2NvcmQuIFRoZSBzaGFyZCBtYXkgbm90IGF0dGVtcHQgdG8gcmVjb25uZWN0IHdpdGggRGlzY29yZC4gKi9cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jbG9zZShTaGFyZFNvY2tldENsb3NlQ29kZXMuU2h1dGRvd24sICdTaGFyZCBzaHV0dGluZyBkb3duLicpXG4gICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuT2ZmbGluZVxuICB9XG5cbiAgLyoqIEhhbmRsZSBhIGdhdGV3YXkgY29ubmVjdGlvbiBlcnJvciAqL1xuICBoYW5kbGVFcnJvcihlcnJvcjogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlci5lcnJvcihgW1NoYXJkXSBUaGVyZSB3YXMgYW4gZXJyb3IgY29ubmVjdGluZyBzaGFyZCAke3RoaXMuaWR9LmAsIGVycm9yKVxuICB9XG5cbiAgLyoqIEhhbmRsZSBhIGdhdGV3YXkgY29ubmVjdGlvbiBjbG9zZS4gKi9cbiAgYXN5bmMgaGFuZGxlQ2xvc2UoY2xvc2U6IENsb3NlRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0b3BIZWFydGJlYXRpbmcoKVxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIEdhdGV3YXkgY29ubmVjdGlvbiBjbG9zZWQgd2l0aCBjb2RlICR7Y2xvc2UuY29kZX0gKCR7Y2xvc2UucmVhc29uIHx8ICc8Tm8gcmVhc29uIHByb3ZpZGVkPid9KS5gKVxuXG4gICAgc3dpdGNoIChjbG9zZS5jb2RlKSB7XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5UZXN0aW5nRmluaXNoZWQ6IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuT2ZmbGluZVxuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgLy8gT24gdGhlc2UgY29kZXMgYSBtYW51YWwgc3RhcnQgd2lsbCBiZSBkb25lLlxuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuU2h1dGRvd246XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZUlkZW50aWZ5aW5nOlxuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVzaGFyZGVkOlxuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVzdW1lQ2xvc2luZ09sZENvbm5lY3Rpb246XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5ab21iaWVkQ29ubmVjdGlvbjoge1xuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5EaXNjb25uZWN0ZWRcbiAgICAgICAgdGhpcy5ldmVudHMuZGlzY29ubmVjdGVkPy4odGhpcylcblxuICAgICAgICAvLyBnYXRld2F5LmRlYnVnKFwiR1cgQ0xPU0VEX1JFQ09OTkVDVFwiLCB7IHNoYXJkSWQsIHBheWxvYWQ6IGV2ZW50IH0pO1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIC8vIEdhdGV3YXkgY29ubmVjdGlvbiBjbG9zZXMgd2hpY2ggcmVxdWlyZSBhIG5ldyBpZGVudGlmeS5cbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5Vbmtub3duT3Bjb2RlOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLk5vdEF1dGhlbnRpY2F0ZWQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZFNlcTpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5SYXRlTGltaXRlZDpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5TZXNzaW9uVGltZWRPdXQ6IHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ1tTaGFyZF0gR2F0ZXdheSBjb25uZWN0aW9uIGNsb3NpbmcgcmVxdWlyaW5nIHJlLWlkZW50aWZ5LicpXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLklkZW50aWZ5aW5nXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaWRlbnRpZnkoKVxuICAgICAgfVxuICAgICAgLy8gV2hlbiB0aGVzZSBjb2RlcyBhcmUgcmVjZWl2ZWQgc29tZXRoaW5nIHdlbnQgcmVhbGx5IHdyb25nLlxuICAgICAgLy8gT24gdGhvc2Ugd2UgY2Fubm90IHN0YXJ0IGEgcmVjb25uZWN0IGF0dGVtcHQuXG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuQXV0aGVudGljYXRpb25GYWlsZWQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZFNoYXJkOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlNoYXJkaW5nUmVxdWlyZWQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZEFwaVZlcnNpb246XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZEludGVudHM6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuRGlzYWxsb3dlZEludGVudHM6IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuT2ZmbGluZVxuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihjbG9zZS5yZWFzb24gfHwgJ0Rpc2NvcmQgZ2F2ZSBubyByZWFzb24hIEdHISBZb3UgYnJva2UgRGlzY29yZCEnKVxuICAgICAgfVxuICAgICAgLy8gR2F0ZXdheSBjb25uZWN0aW9uIGNsb3NlcyBvbiB3aGljaCBhIHJlc3VtZSBpcyBhbGxvd2VkLlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlVua25vd25FcnJvcjpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5EZWNvZGVFcnJvcjpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5BbHJlYWR5QXV0aGVudGljYXRlZDpcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgW1NoYXJkXSBDbG9zZWQgc2hhcmQgIyR7dGhpcy5pZH0gd2l0aCBjb2RlICR7Y2xvc2UuY29kZX0uIEF0dGVtcHRpbmcgdG8gcmVzdW1lLi4uYClcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuUmVzdW1pbmdcbiAgICAgICAgdGhpcy5ldmVudHMuZGlzY29ubmVjdGVkPy4odGhpcylcblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXN1bWUoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBIYW5kbGUgYW4gaW5jb21pbmcgZ2F0ZXdheSBtZXNzYWdlLiAqL1xuICBhc3luYyBoYW5kbGVNZXNzYWdlKG1lc3NhZ2U6IE1lc3NhZ2VFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBwcmVQcm9jZXNzTWVzc2FnZSA9IG1lc3NhZ2UuZGF0YVxuXG4gICAgLy8gSWYgbWVzc2FnZSBjb21wcmVzc2lvbiBpcyBlbmFibGVkLCBEaXNjb3JkIG1pZ2h0IHNlbmQgemxpYiBjb21wcmVzc2VkIHBheWxvYWRzLlxuICAgIGlmICh0aGlzLmdhdGV3YXlDb25maWcuY29tcHJlc3MgJiYgcHJlUHJvY2Vzc01lc3NhZ2UgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgICBwcmVQcm9jZXNzTWVzc2FnZSA9IGluZmxhdGVTeW5jKGF3YWl0IHByZVByb2Nlc3NNZXNzYWdlLmFycmF5QnVmZmVyKCkpLnRvU3RyaW5nKClcbiAgICB9XG5cbiAgICAvLyBTYWZlZ3VhcmQgaW5jYXNlIGRlY29tcHJlc3Npb24gZmFpbGVkIHRvIG1ha2UgYSBzdHJpbmcuXG4gICAgaWYgKHR5cGVvZiBwcmVQcm9jZXNzTWVzc2FnZSAhPT0gJ3N0cmluZycpIHJldHVyblxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlRGlzY29yZFBhY2tldChKU09OLnBhcnNlKHByZVByb2Nlc3NNZXNzYWdlKSBhcyBEaXNjb3JkR2F0ZXdheVBheWxvYWQpXG4gIH1cblxuICAvKiogSGFuZGxlcyBhIGluY29taW5nIGdhdGV3YXkgcGFja2V0LiAqL1xuICBhc3luYyBoYW5kbGVEaXNjb3JkUGFja2V0KHBhY2tldDogRGlzY29yZEdhdGV3YXlQYXlsb2FkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gRWRnZSBjYXNlIHN0YXJ0OiBodHRwczovL2dpdGh1Yi5jb20vZGlzY29yZGVuby9kaXNjb3JkZW5vL2lzc3Vlcy8yMzExXG4gICAgdGhpcy5oZWFydC5sYXN0QWNrID0gRGF0ZS5ub3coKVxuICAgIHRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkID0gdHJ1ZVxuICAgIC8vIEVkZ2UgY2FzZSBlbmQhXG5cbiAgICBzd2l0Y2ggKHBhY2tldC5vcCkge1xuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXQ6IHtcbiAgICAgICAgLy8gVE9ETzogY2FuIHRoaXMgYWN0dWFsbHkgaGFwcGVuXG4gICAgICAgIGlmICghdGhpcy5pc09wZW4oKSkgcmV0dXJuXG5cbiAgICAgICAgdGhpcy5oZWFydC5sYXN0QmVhdCA9IERhdGUubm93KClcbiAgICAgICAgLy8gRGlzY29yZCByYW5kb21seSBzZW5kcyB0aGlzIHJlcXVpcmluZyBhbiBpbW1lZGlhdGUgaGVhcnRiZWF0IGJhY2suXG4gICAgICAgIC8vIFVzaW5nIGEgZGlyZWN0IHNvY2tldC5zZW5kIGNhbGwgaGVyZSBiZWNhdXNlIGhlYXJ0YmVhdCByZXF1ZXN0cyBhcmUgcmVzZXJ2ZWQgYnkgdXMuXG4gICAgICAgIHRoaXMuc29ja2V0Py5zZW5kKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXQsXG4gICAgICAgICAgICBkOiB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIsXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICAgdGhpcy5ldmVudHMuaGVhcnRiZWF0Py4odGhpcylcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5IZWxsbzoge1xuICAgICAgICBjb25zdCBpbnRlcnZhbCA9IChwYWNrZXQuZCBhcyBEaXNjb3JkSGVsbG8pLmhlYXJ0YmVhdF9pbnRlcnZhbFxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIEhlbGxvIG9uIFNoYXJkICMke3RoaXMuaWR9YClcbiAgICAgICAgdGhpcy5zdGFydEhlYXJ0YmVhdGluZyhpbnRlcnZhbClcblxuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gU2hhcmRTdGF0ZS5SZXN1bWluZykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRRdWV1ZSA9IFsuLi50aGlzLmJ1Y2tldC5xdWV1ZV1cbiAgICAgICAgICAvLyBIRUxMTyBoYXMgYmVlbiBzZW5kIG9uIGEgbm9uIHJlc3VtZSBhY3Rpb24uXG4gICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBzaGFyZCBzdGFydHMgYSBuZXcgc2Vzc2lvbixcbiAgICAgICAgICAvLyB0aGVyZWZvcmUgdGhlIHJhdGUgbGltaXQgaW50ZXJ2YWwgaGFzIGJlZW4gcmVzZXQgdG9vLlxuICAgICAgICAgIHRoaXMuYnVja2V0ID0gbmV3IExlYWt5QnVja2V0KHtcbiAgICAgICAgICAgIG1heDogdGhpcy5jYWxjdWxhdGVTYWZlUmVxdWVzdHMoKSxcbiAgICAgICAgICAgIHJlZmlsbEludGVydmFsOiA2MDAwMCxcbiAgICAgICAgICAgIHJlZmlsbEFtb3VudDogdGhpcy5jYWxjdWxhdGVTYWZlUmVxdWVzdHMoKSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgLy8gUXVldWUgc2hvdWxkIG5vdCBiZSBsb3N0IG9uIGEgcmUtaWRlbnRpZnkuXG4gICAgICAgICAgdGhpcy5idWNrZXQucXVldWUudW5zaGlmdCguLi5jdXJyZW50UXVldWUpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV2ZW50cy5oZWxsbz8uKHRoaXMpXG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0QUNLOiB7XG4gICAgICAgIC8vIE1hbnVhbGx5IGNhbGN1bGF0aW5nIHRoZSByb3VuZCB0cmlwIHRpbWUgZm9yIHVzZXJzIHdobyBuZWVkIGl0LlxuICAgICAgICBpZiAodGhpcy5oZWFydC5sYXN0QmVhdCkge1xuICAgICAgICAgIHRoaXMuaGVhcnQucnR0ID0gdGhpcy5oZWFydC5sYXN0QWNrIC0gdGhpcy5oZWFydC5sYXN0QmVhdFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ldmVudHMuaGVhcnRiZWF0QWNrPy4odGhpcylcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5SZWNvbm5lY3Q6IHtcbiAgICAgICAgLy8gICBnYXRld2F5LmRlYnVnKFwiR1cgUkVDT05ORUNUXCIsIHsgc2hhcmRJZCB9KTtcblxuICAgICAgICB0aGlzLmV2ZW50cy5yZXF1ZXN0ZWRSZWNvbm5lY3Q/Lih0aGlzKVxuXG4gICAgICAgIGF3YWl0IHRoaXMucmVzdW1lKClcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5JbnZhbGlkU2Vzc2lvbjoge1xuICAgICAgICBjb25zdCByZXN1bWFibGUgPSBwYWNrZXQuZCBhcyBib29sZWFuXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFJlY2VpdmVkIEludmFsaWQgU2Vzc2lvbiBmb3IgU2hhcmQgIyR7dGhpcy5pZH0gd2l0aCByZXN1bWVhYmxlIGFzICR7cmVzdW1hYmxlLnRvU3RyaW5nKCl9YClcblxuICAgICAgICB0aGlzLmV2ZW50cy5pbnZhbGlkU2Vzc2lvbj8uKHRoaXMsIHJlc3VtYWJsZSlcblxuICAgICAgICAvLyBXZSBuZWVkIHRvIHdhaXQgZm9yIGEgcmFuZG9tIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gMSBhbmQgNVxuICAgICAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I3Jlc3VtaW5nXG4gICAgICAgIGF3YWl0IGRlbGF5KE1hdGguZmxvb3IoKE1hdGgucmFuZG9tKCkgKiA0ICsgMSkgKiAxMDAwKSlcblxuICAgICAgICB0aGlzLnJlc29sdmVzLmdldCgnSU5WQUxJRF9TRVNTSU9OJyk/LihwYWNrZXQpXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdJTlZBTElEX1NFU1NJT04nKVxuXG4gICAgICAgIC8vIFdoZW4gcmVzdW1hYmxlIGlzIGZhbHNlIHdlIG5lZWQgdG8gcmUtaWRlbnRpZnlcbiAgICAgICAgaWYgKCFyZXN1bWFibGUpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3RJZGVudGlmeSgpXG5cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHNlc3Npb24gaXMgaW52YWxpZCBidXQgYXBwYXJlbnRseSBpdCBpcyByZXN1bWFibGVcbiAgICAgICAgYXdhaXQgdGhpcy5yZXN1bWUoKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChwYWNrZXQudCkge1xuICAgICAgY2FzZSAnUkVTVU1FRCc6XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLkNvbm5lY3RlZFxuICAgICAgICB0aGlzLmV2ZW50cy5yZXN1bWVkPy4odGhpcylcblxuICAgICAgICAvLyBDb250aW51ZSB0aGUgcmVxdWVzdHMgd2hpY2ggaGF2ZSBiZWVuIHF1ZXVlZCBzaW5jZSB0aGUgc2hhcmQgd2VudCBvZmZsaW5lLlxuICAgICAgICB0aGlzLm9mZmxpbmVTZW5kUXVldWUuZm9yRWFjaCgocmVzb2x2ZSkgPT4gcmVzb2x2ZSgpKVxuICAgICAgICAvLyBTZXR0aW5nIHRoZSBsZW5ndGggdG8gMCB3aWxsIGRlbGV0ZSB0aGUgZWxlbWVudHMgaW4gaXRcbiAgICAgICAgdGhpcy5vZmZsaW5lU2VuZFF1ZXVlLmxlbmd0aCA9IDBcblxuICAgICAgICB0aGlzLnJlc29sdmVzLmdldCgnUkVTVU1FRCcpPy4ocGFja2V0KVxuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnUkVTVU1FRCcpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdSRUFEWSc6IHtcbiAgICAgICAgLy8gSW1wb3J0YW50IGZvciBmdXR1cmUgcmVzdW1lcy5cbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHBhY2tldC5kIGFzIERpc2NvcmRSZWFkeVxuXG4gICAgICAgIHRoaXMucmVzdW1lR2F0ZXdheVVybCA9IHBheWxvYWQucmVzdW1lX2dhdGV3YXlfdXJsXG5cbiAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSBwYXlsb2FkLnNlc3Npb25faWRcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuQ29ubmVjdGVkXG5cbiAgICAgICAgLy8gQ29udGludWUgdGhlIHJlcXVlc3RzIHdoaWNoIGhhdmUgYmVlbiBxdWV1ZWQgc2luY2UgdGhlIHNoYXJkIHdlbnQgb2ZmbGluZS5cbiAgICAgICAgLy8gSW1wb3J0YW50IHdoZW4gdGhpcyBpcyBhIHJlLWlkZW50aWZ5XG4gICAgICAgIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5mb3JFYWNoKChyZXNvbHZlKSA9PiByZXNvbHZlKCkpXG4gICAgICAgIC8vIFNldHRpbmcgdGhlIGxlbmd0aCB0byAwIHdpbGwgZGVsZXRlIHRoZSBlbGVtZW50cyBpbiBpdFxuICAgICAgICB0aGlzLm9mZmxpbmVTZW5kUXVldWUubGVuZ3RoID0gMFxuXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZ2V0KCdSRUFEWScpPy4ocGFja2V0KVxuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnUkVBRFknKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgc2VxdWVuY2UgbnVtYmVyIGlmIGl0IGlzIHByZXNlbnRcbiAgICAvLyBgc2AgY2FuIGJlIGVpdGhlciBgbnVsbGAgb3IgYSBgbnVtYmVyYC5cbiAgICAvLyBJbiBvcmRlciB0byBwcmV2ZW50IHVwZGF0ZSBtaXNzZXMgd2hlbiBgc2AgaXMgYDBgIHdlIGNoZWNrIGFnYWluc3QgbnVsbC5cbiAgICBpZiAocGFja2V0LnMgIT09IG51bGwpIHtcbiAgICAgIHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlciA9IHBhY2tldC5zXG4gICAgfVxuXG4gICAgdGhpcy5mb3J3YXJkVG9Cb3QocGFja2V0KVxuICB9XG5cbiAgZm9yd2FyZFRvQm90KHBhY2tldDogRGlzY29yZEdhdGV3YXlQYXlsb2FkKTogdm9pZCB7XG4gICAgLy8gVGhlIG5lY2Vzc2FyeSBoYW5kbGluZyByZXF1aXJlZCBmb3IgdGhlIFNoYXJkcyBjb25uZWN0aW9uIGhhcyBiZWVuIGZpbmlzaGVkLlxuICAgIC8vIE5vdyB0aGUgZXZlbnQgY2FuIGJlIHNhZmVseSBmb3J3YXJkZWQuXG4gICAgdGhpcy5ldmVudHMubWVzc2FnZT8uKHRoaXMsIGNhbWVsaXplKHBhY2tldCkpXG4gIH1cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGluIG9yZGVyIHRvIG1ha2UgdGhlIHNoYXJkcyBwcmVzZW5jZS5cbiAgICogYXN5bmMgaW4gY2FzZSBkZXZzIGNyZWF0ZSB0aGUgcHJlc2VuY2UgYmFzZWQgb24gZWcuIGRhdGFiYXNlIHZhbHVlcy5cbiAgICogUGFzc2luZyB0aGUgc2hhcmQncyBpZCB0aGVyZSB0byBtYWtlIGl0IGVhc2llciBmb3IgdGhlIGRldiB0byB1c2UgdGhpcyBmdW5jdGlvbi5cbiAgICovXG4gIGFzeW5jIG1ha2VQcmVzZW5jZSgpOiBQcm9taXNlPEJvdFN0YXR1c1VwZGF0ZSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVyblxuICB9XG5cbiAgLyoqIFRoaXMgZnVuY3Rpb24gY29tbXVuaWNhdGVzIHdpdGggdGhlIG1hbmFnZW1lbnQgcHJvY2VzcywgaW4gb3JkZXIgdG8ga25vdyB3aGV0aGVyIGl0cyBmcmVlIHRvIGlkZW50aWZ5LiBXaGVuIHRoaXMgZnVuY3Rpb24gcmVzb2x2ZXMsIHRoaXMgbWVhbnMgdGhhdCB0aGUgc2hhcmQgaXMgYWxsb3dlZCB0byBzZW5kIGFuIGlkZW50aWZ5IHBheWxvYWQgdG8gZGlzY29yZC4gKi9cbiAgYXN5bmMgcmVxdWVzdElkZW50aWZ5KCk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogVGhpcyBmdW5jdGlvbiBjb21tdW5pY2F0ZXMgd2l0aCB0aGUgbWFuYWdlbWVudCBwcm9jZXNzLCBpbiBvcmRlciB0byB0ZWxsIGl0IGNhbiBpZGVudGlmeSB0aGUgbmV4dCBzaGFyZC4gKi9cbiAgYXN5bmMgc2hhcmRJc1JlYWR5KCk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogU3RhcnQgc2VuZGluZyBoZWFydGJlYXQgcGF5bG9hZHMgdG8gRGlzY29yZCBpbiB0aGUgcHJvdmlkZWQgaW50ZXJ2YWwuICovXG4gIHN0YXJ0SGVhcnRiZWF0aW5nKGludGVydmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBTdGFydCBoZWFydGJlYXRpbmcgb24gc2hhcmQgIyR7dGhpcy5pZH1gKVxuXG4gICAgLy8gSWYgb2xkIGhlYXJ0YmVhc3QgZXhpc3QgbGlrZSBhZnRlciByZXN1bWUsIGNsZWFyIHRoZSBvbGQgb25lcy5cbiAgICBpZiAodGhpcy5oZWFydC5pbnRlcnZhbElkKSBjbGVhckludGVydmFsKHRoaXMuaGVhcnQuaW50ZXJ2YWxJZClcbiAgICBpZiAodGhpcy5oZWFydC50aW1lb3V0SWQpIGNsZWFyVGltZW91dCh0aGlzLmhlYXJ0LnRpbWVvdXRJZClcblxuICAgIHRoaXMuaGVhcnQuaW50ZXJ2YWwgPSBpbnRlcnZhbFxuXG4gICAgLy8gT25seSBzZXQgdGhlIHNoYXJkJ3Mgc3RhdGUgdG8gYFVuaWRlbnRpZmllZGBcbiAgICAvLyBpZiBoZWFydGJlYXRpbmcgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgZHVlIHRvIGFuIGlkZW50aWZ5IG9yIHJlc3VtZSBhY3Rpb24uXG4gICAgaWYgKFtTaGFyZFN0YXRlLkRpc2Nvbm5lY3RlZCwgU2hhcmRTdGF0ZS5PZmZsaW5lXS5pbmNsdWRlcyh0aGlzLnN0YXRlKSkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gU2hhcmQgaXMgZGlzY29ubmVjdGVkIG9yIG9mZmxpbmUgYnV0IHRoZSBoZWFydGJlYXQgd2FzIHN0YXJ0ZWQgIyR7dGhpcy5pZH1gKVxuICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuVW5pZGVudGlmaWVkXG4gICAgfVxuXG4gICAgLy8gVGhlIGZpcnN0IGhlYXJ0YmVhdCBuZWVkcyB0byBiZSBzZW5kIHdpdGggYSByYW5kb20gZGVsYXkgYmV0d2VlbiBgMGAgYW5kIGBpbnRlcnZhbGBcbiAgICAvLyBVc2luZyBhIGBzZXRUaW1lb3V0KF8sIGppdHRlcilgIGhlcmUgdG8gYWNjb21wbGlzaCB0aGF0LlxuICAgIC8vIGBNYXRoLnJhbmRvbSgpYCBjYW4gYmUgYDBgIHNvIHdlIHVzZSBgMC41YCBpZiB0aGlzIGhhcHBlbnNcbiAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I2hlYXJ0YmVhdGluZ1xuICAgIGNvbnN0IGppdHRlciA9IE1hdGguY2VpbCh0aGlzLmhlYXJ0LmludGVydmFsICogKE1hdGgucmFuZG9tKCkgfHwgMC41KSlcblxuICAgIHRoaXMuaGVhcnQudGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBCZWdpbm5pbmcgaGVhcnRiZWF0aW5nIHByb2Nlc3MgZm9yIHNoYXJkICMke3RoaXMuaWR9YClcblxuICAgICAgaWYgKCF0aGlzLmlzT3BlbigpKSByZXR1cm5cblxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gSGVhcnRiZWF0aW5nIG9uICMke3RoaXMuaWR9LiBQcmV2aW91cyBzZXF1ZW5jZSBudW1iZXI6ICR7dGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyfWApXG5cbiAgICAgIC8vIFVzaW5nIGEgZGlyZWN0IHNvY2tldC5zZW5kIGNhbGwgaGVyZSBiZWNhdXNlIGhlYXJ0YmVhdCByZXF1ZXN0cyBhcmUgcmVzZXJ2ZWQgYnkgdXMuXG4gICAgICB0aGlzLnNvY2tldD8uc2VuZChcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXQsXG4gICAgICAgICAgZDogdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyLFxuICAgICAgICB9KSxcbiAgICAgIClcblxuICAgICAgdGhpcy5oZWFydC5sYXN0QmVhdCA9IERhdGUubm93KClcbiAgICAgIHRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkID0gZmFsc2VcblxuICAgICAgLy8gQWZ0ZXIgdGhlIHJhbmRvbSBoZWFydGJlYXQgaml0dGVyIHdlIGNhbiBzdGFydCBhIG5vcm1hbCBpbnRlcnZhbC5cbiAgICAgIHRoaXMuaGVhcnQuaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmlzT3BlbigpKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gU2hhcmQgIyR7dGhpcy5pZH0gaXMgbm90IG9wZW4sIGJ1dCBhdHRlbXB0ZWQgaGVhcnRiZWF0LCBpZ25vcmluZy5gKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIFNoYXJkIGRpZCBub3QgcmVjZWl2ZSBhIGhlYXJ0YmVhdCBBQ0sgZnJvbSBEaXNjb3JkIGluIHRpbWUsXG4gICAgICAgIC8vIHRoZXJlZm9yZSB3ZSBoYXZlIHRvIGFzc3VtZSB0aGF0IHRoZSBjb25uZWN0aW9uIGhhcyBmYWlsZWQgb3IgZ290IFwiem9tYmllZFwiLlxuICAgICAgICAvLyBUaGUgU2hhcmQgbmVlZHMgdG8gc3RhcnQgYSByZS1pZGVudGlmeSBhY3Rpb24gYWNjb3JkaW5nbHkuXG4gICAgICAgIC8vIFJlZmVyZW5jZTogaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL2dhdGV3YXkjaGVhcnRiZWF0aW5nLWV4YW1wbGUtZ2F0ZXdheS1oZWFydGJlYXQtYWNrXG4gICAgICAgIGlmICghdGhpcy5oZWFydC5hY2tub3dsZWRnZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBIZWFydGJlYXQgbm90IGFja25vd2xlZGdlZCBmb3Igc2hhcmQgIyR7dGhpcy5pZH0uIEFzc3VtaW5nIHpvbWJpZWQgY29ubmVjdGlvbi5gKVxuICAgICAgICAgIHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlpvbWJpZWRDb25uZWN0aW9uLCAnWm9tYmllZCBjb25uZWN0aW9uLCBkaWQgbm90IHJlY2VpdmUgYW4gaGVhcnRiZWF0IEFDSyBpbiB0aW1lLicpXG5cbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5pZGVudGlmeSgpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBIZWFydGJlYXRpbmcgb24gIyR7dGhpcy5pZH0uIFByZXZpb3VzIHNlcXVlbmNlIG51bWJlcjogJHt0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXJ9YClcblxuICAgICAgICAvLyBVc2luZyBhIGRpcmVjdCBzb2NrZXQuc2VuZCBjYWxsIGhlcmUgYmVjYXVzZSBoZWFydGJlYXQgcmVxdWVzdHMgYXJlIHJlc2VydmVkIGJ5IHVzLlxuICAgICAgICB0aGlzLnNvY2tldD8uc2VuZChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0LFxuICAgICAgICAgICAgZDogdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG5cbiAgICAgICAgdGhpcy5oZWFydC5sYXN0QmVhdCA9IERhdGUubm93KClcbiAgICAgICAgdGhpcy5oZWFydC5hY2tub3dsZWRnZWQgPSBmYWxzZVxuXG4gICAgICAgIHRoaXMuZXZlbnRzLmhlYXJ0YmVhdD8uKHRoaXMpXG4gICAgICB9LCB0aGlzLmhlYXJ0LmludGVydmFsKVxuICAgIH0sIGppdHRlcilcbiAgfVxuXG4gIC8qKiBTdG9wIHRoZSBoZWFydGJlYXRpbmcgcHJvY2VzcyB3aXRoIGRpc2NvcmQuICovXG4gIHN0b3BIZWFydGJlYXRpbmcoKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgdGhlIHJlZ3VsYXIgaGVhcnRiZWF0IGludGVydmFsLlxuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5oZWFydC5pbnRlcnZhbElkKVxuICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgU2hhcmQgZ290IGNsb3NlZCBiZWZvcmUgdGhlIGZpcnN0IGppdHRlcmVkIGhlYXJ0YmVhdC5cbiAgICAvLyBUbyBnbyBzYWZlIHdlIHNob3VsZCBjbGVhciB0aGUgcmVsYXRlZCB0aW1lb3V0IHRvby5cbiAgICBjbGVhclRpbWVvdXQodGhpcy5oZWFydC50aW1lb3V0SWQpXG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaGFyZENyZWF0ZU9wdGlvbnMge1xuICAvKiogVGhlIHNoYXJkIGlkICovXG4gIGlkOiBudW1iZXJcbiAgLyoqIFRoZSBjb25uZWN0aW9uIGRldGFpbHMgKi9cbiAgY29ubmVjdGlvbjogU2hhcmRHYXRld2F5Q29uZmlnXG4gIC8qKiBUaGUgZXZlbnQgaGFuZGxlcnMgZm9yIGV2ZW50cyBvbiB0aGUgc2hhcmQuICovXG4gIGV2ZW50czogU2hhcmRFdmVudHNcbiAgLyoqIFRoZSBsb2dnZXIgZm9yIHRoZSBzaGFyZCAqL1xuICBsb2dnZXI/OiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz5cbiAgLyoqIFRoZSBoYW5kbGVyIHRvIHJlcXVlc3QgYSBzcGFjZSB0byBtYWtlIGFuIGlkZW50aWZ5IHJlcXVlc3QuICovXG4gIHJlcXVlc3RJZGVudGlmeT86ICgpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIFRoZSBoYW5kbGVyIHRvIGFsZXJ0IHRoZSBnYXRld2F5IG1hbmFnZXIgdGhhdCB0aGlzIHNoYXJkIGhhcyByZWNlaXZlZCBhIFJFQURZIGV2ZW50LiAqL1xuICBzaGFyZElzUmVhZHk/OiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBGdW5jdGlvbiB0byBjcmVhdGUgdGhlIGJvdCBzdGF0dXMgdG8gc2VuZCBvbiBJZGVudGlmeSByZXF1ZXN0cyAqL1xuICBtYWtlUHJlc2VuY2U/OiAoKSA9PiBQcm9taXNlPEJvdFN0YXR1c1VwZGF0ZSB8IHVuZGVmaW5lZD5cbn1cblxuZXhwb3J0IGRlZmF1bHQgRGlzY29yZGVub1NoYXJkXG4iXSwibmFtZXMiOlsiRGlzY29yZGVub1NoYXJkIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwibWF4UmVxdWVzdHNQZXJSYXRlTGltaXRUaWNrIiwicHJldmlvdXNTZXF1ZW5jZU51bWJlciIsInJhdGVMaW1pdFJlc2V0SW50ZXJ2YWwiLCJzdGF0ZSIsIlNoYXJkU3RhdGUiLCJPZmZsaW5lIiwicmVzdW1lR2F0ZXdheVVybCIsImV2ZW50cyIsIm9mZmxpbmVTZW5kUXVldWUiLCJyZXNvbHZlcyIsIk1hcCIsImlkIiwiY29ubmVjdGlvbiIsImxvZ2dlciIsImhlYXJ0IiwiYWNrbm93bGVkZ2VkIiwiaW50ZXJ2YWwiLCJyZXF1ZXN0SWRlbnRpZnkiLCJzaGFyZElzUmVhZHkiLCJtYWtlUHJlc2VuY2UiLCJidWNrZXQiLCJMZWFreUJ1Y2tldCIsIm1heCIsImNhbGN1bGF0ZVNhZmVSZXF1ZXN0cyIsInJlZmlsbEFtb3VudCIsInJlZmlsbEludGVydmFsIiwiZ2F0ZXdheUNvbmZpZyIsImNvbm5lY3Rpb25VcmwiLCJ1cmwiLCJzYWZlUmVxdWVzdHMiLCJNYXRoIiwiY2VpbCIsImNoZWNrT2ZmbGluZSIsImhpZ2hQcmlvcml0eSIsImlzT3BlbiIsIlByb21pc2UiLCJyZXNvbHZlIiwidW5zaGlmdCIsInB1c2giLCJjbG9zZSIsImNvZGUiLCJyZWFzb24iLCJzb2NrZXQiLCJyZWFkeVN0YXRlIiwiTm9kZVdlYlNvY2tldCIsIk9QRU4iLCJjb25uZWN0IiwiSWRlbnRpZnlpbmciLCJSZXN1bWluZyIsImluY2x1ZGVzIiwiQ29ubmVjdGluZyIsImNvbm5lY3RpbmciLCJVUkwiLCJzZWFyY2hQYXJhbXMiLCJzZXQiLCJ2ZXJzaW9uIiwidG9TdHJpbmciLCJzaG91bGRVc2VCdWlsdGluIiwiUmVmbGVjdCIsImhhcyIsImdsb2JhbFRoaXMiLCJXZWJTb2NrZXQiLCJvbmVycm9yIiwiZXZlbnQiLCJoYW5kbGVFcnJvciIsIm9uY2xvc2UiLCJjbG9zZUV2ZW50IiwiaGFuZGxlQ2xvc2UiLCJvbm1lc3NhZ2UiLCJtZXNzYWdlRXZlbnQiLCJoYW5kbGVNZXNzYWdlIiwib25vcGVuIiwiVW5pZGVudGlmaWVkIiwiY29ubmVjdGVkIiwiaWRlbnRpZnkiLCJkZWJ1ZyIsIlNoYXJkU29ja2V0Q2xvc2VDb2RlcyIsIlJlSWRlbnRpZnlpbmciLCJpZGVudGlmeWluZyIsInNlbmQiLCJvcCIsIkdhdGV3YXlPcGNvZGVzIiwiSWRlbnRpZnkiLCJkIiwidG9rZW4iLCJjb21wcmVzcyIsInByb3BlcnRpZXMiLCJpbnRlbnRzIiwic2hhcmQiLCJ0b3RhbFNoYXJkcyIsInByZXNlbmNlIiwiaWRlbnRpZmllZCIsImRlbGV0ZSIsInJlc3VtZSIsIlJlc3VtZUNsb3NpbmdPbGRDb25uZWN0aW9uIiwic2Vzc2lvbklkIiwiUmVzdW1lIiwic2Vzc2lvbl9pZCIsInNlcSIsIm1lc3NhZ2UiLCJhY3F1aXJlIiwiSlNPTiIsInN0cmluZ2lmeSIsInNodXRkb3duIiwiU2h1dGRvd24iLCJlcnJvciIsInN0b3BIZWFydGJlYXRpbmciLCJUZXN0aW5nRmluaXNoZWQiLCJkaXNjb25uZWN0ZWQiLCJSZXNoYXJkZWQiLCJab21iaWVkQ29ubmVjdGlvbiIsIkRpc2Nvbm5lY3RlZCIsIkdhdGV3YXlDbG9zZUV2ZW50Q29kZXMiLCJVbmtub3duT3Bjb2RlIiwiTm90QXV0aGVudGljYXRlZCIsIkludmFsaWRTZXEiLCJSYXRlTGltaXRlZCIsIlNlc3Npb25UaW1lZE91dCIsIkF1dGhlbnRpY2F0aW9uRmFpbGVkIiwiSW52YWxpZFNoYXJkIiwiU2hhcmRpbmdSZXF1aXJlZCIsIkludmFsaWRBcGlWZXJzaW9uIiwiSW52YWxpZEludGVudHMiLCJEaXNhbGxvd2VkSW50ZW50cyIsIkVycm9yIiwiVW5rbm93bkVycm9yIiwiRGVjb2RlRXJyb3IiLCJBbHJlYWR5QXV0aGVudGljYXRlZCIsImluZm8iLCJwcmVQcm9jZXNzTWVzc2FnZSIsImRhdGEiLCJCbG9iIiwiaW5mbGF0ZVN5bmMiLCJhcnJheUJ1ZmZlciIsImhhbmRsZURpc2NvcmRQYWNrZXQiLCJwYXJzZSIsInBhY2tldCIsImxhc3RBY2siLCJEYXRlIiwibm93IiwiSGVhcnRiZWF0IiwibGFzdEJlYXQiLCJoZWFydGJlYXQiLCJIZWxsbyIsImhlYXJ0YmVhdF9pbnRlcnZhbCIsInN0YXJ0SGVhcnRiZWF0aW5nIiwiY3VycmVudFF1ZXVlIiwicXVldWUiLCJoZWxsbyIsIkhlYXJ0YmVhdEFDSyIsInJ0dCIsImhlYXJ0YmVhdEFjayIsIlJlY29ubmVjdCIsInJlcXVlc3RlZFJlY29ubmVjdCIsIkludmFsaWRTZXNzaW9uIiwicmVzdW1hYmxlIiwiaW52YWxpZFNlc3Npb24iLCJkZWxheSIsImZsb29yIiwicmFuZG9tIiwiZ2V0IiwidCIsIkNvbm5lY3RlZCIsInJlc3VtZWQiLCJmb3JFYWNoIiwibGVuZ3RoIiwicGF5bG9hZCIsInJlc3VtZV9nYXRld2F5X3VybCIsInMiLCJmb3J3YXJkVG9Cb3QiLCJjYW1lbGl6ZSIsImludGVydmFsSWQiLCJjbGVhckludGVydmFsIiwidGltZW91dElkIiwiY2xlYXJUaW1lb3V0Iiwiaml0dGVyIiwic2V0VGltZW91dCIsInNldEludGVydmFsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztJQWVhQSxlQUFlO2VBQWZBOztJQTJsQmIsT0FBOEI7ZUFBOUI7OzswQkExbUI0Qjt1QkFFMkI7dUJBQ0Y7MkRBQzNCO3dCQVNuQjs7Ozs7O0FBRUEsSUFBQSxBQUFNQSxrQkFBTixNQUFNQTtJQWdDWEMsWUFBWUMsT0FBMkIsQ0FBRTtRQXpCekMsMEhBQTBILFFBQzFIQyw4QkFBc0M7UUFDdEMsMENBQTBDLFFBQzFDQyx5QkFBd0M7UUFDeEMsNEVBQTRFLFFBQzVFQyx5QkFBaUM7UUFLakMsd0NBQXdDLFFBQ3hDQyxRQUFRQyxrQkFBVSxDQUFDQyxPQUFPO1FBQzFCLGlGQUFpRixRQUNqRkMsbUJBQTJCO1FBQzNCLHNDQUFzQyxRQUN0Q0MsU0FBc0IsQ0FBQztRQUN2QixtR0FBbUcsUUFDbkdDLG1CQUFtQyxFQUFFO1FBQ3JDLGlGQUFpRixRQUNqRkMsV0FBVyxJQUFJQztRQU9iLElBQUksQ0FBQ0MsRUFBRSxHQUFHWixRQUFRWSxFQUFFO1FBQ3BCLElBQUksQ0FBQ0MsVUFBVSxHQUFHYixRQUFRYSxVQUFVO1FBQ3BDLElBQUksQ0FBQ0wsTUFBTSxHQUFHUixRQUFRUSxNQUFNO1FBQzVCLElBQUksQ0FBQ00sTUFBTSxHQUFHZCxRQUFRYyxNQUFNLElBQUlBLGFBQU07UUFFdEMsSUFBSSxDQUFDQyxL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
640
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TaGFyZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdub2RlOmJ1ZmZlcidcbmltcG9ydCB7IEluZmxhdGUsIGNyZWF0ZUluZmxhdGUsIGluZmxhdGVTeW5jLCBjb25zdGFudHMgYXMgemxpYkNvbnN0YW50cyB9IGZyb20gJ25vZGU6emxpYidcbmltcG9ydCB0eXBlIHsgRGlzY29yZEdhdGV3YXlQYXlsb2FkLCBEaXNjb3JkSGVsbG8sIERpc2NvcmRSZWFkeSB9IGZyb20gJ0BkaXNjb3JkZW5vL3R5cGVzJ1xuaW1wb3J0IHsgR2F0ZXdheUNsb3NlRXZlbnRDb2RlcywgR2F0ZXdheU9wY29kZXMgfSBmcm9tICdAZGlzY29yZGVuby90eXBlcydcbmltcG9ydCB7IExlYWt5QnVja2V0LCBjYW1lbGl6ZSwgZGVsYXksIGxvZ2dlciB9IGZyb20gJ0BkaXNjb3JkZW5vL3V0aWxzJ1xuaW1wb3J0IHR5cGUgeyBEZWNvbXByZXNzIGFzIFpzdGREZWNvbXByZXNzIH0gZnJvbSAnZnpzdGQnXG5pbXBvcnQgTm9kZVdlYlNvY2tldCBmcm9tICd3cydcbmltcG9ydCB7XG4gIHR5cGUgQm90U3RhdHVzVXBkYXRlLFxuICB0eXBlIFNoYXJkRXZlbnRzLFxuICB0eXBlIFNoYXJkR2F0ZXdheUNvbmZpZyxcbiAgdHlwZSBTaGFyZEhlYXJ0LFxuICBTaGFyZFNvY2tldENsb3NlQ29kZXMsXG4gIHR5cGUgU2hhcmRTb2NrZXRSZXF1ZXN0LFxuICBTaGFyZFN0YXRlLFxuICBUcmFuc3BvcnRDb21wcmVzc2lvbixcbn0gZnJvbSAnLi90eXBlcy5qcydcblxuY29uc3QgWkxJQl9TWU5DX0ZMVVNIID0gbmV3IFVpbnQ4QXJyYXkoWzB4MCwgMHgwLCAweGZmLCAweGZmXSlcblxubGV0IGZ6c3RkOiB0eXBlb2YgaW1wb3J0KCdmenN0ZCcpXG5cbi8qKiBTaW5jZSBmenN0ZCBpcyBhbiBvcHRpb25hbCBkZXBlbmRlbmN5LCB3ZSBuZWVkIHRvIGltcG9ydCBpdCBsYXppbHkgKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEZaU3RkKCkge1xuICByZXR1cm4gKGZ6c3RkID8/PSBhd2FpdCBpbXBvcnQoJ2Z6c3RkJykpXG59XG5cbmV4cG9ydCBjbGFzcyBEaXNjb3JkZW5vU2hhcmQge1xuICAvKiogVGhlIGlkIG9mIHRoZSBzaGFyZCAqL1xuICBpZDogbnVtYmVyXG4gIC8qKiBUaGUgY29ubmVjdGlvbiBjb25maWcgZGV0YWlscyB0aGF0IHRoaXMgc2hhcmQgd2lsbCB1c2VkIHRvIGNvbm5lY3QgdG8gZGlzY29yZC4gKi9cbiAgY29ubmVjdGlvbjogU2hhcmRHYXRld2F5Q29uZmlnXG4gIC8qKiBUaGlzIGNvbnRhaW5zIGFsbCB0aGUgaGVhcnRiZWF0IGluZm9ybWF0aW9uICovXG4gIGhlYXJ0OiBTaGFyZEhlYXJ0XG4gIC8qKiBUaGUgbWF4aW11bSBvZiByZXF1ZXN0cyB3aGljaCBjYW4gYmUgc2VuZCB0byBkaXNjb3JkIHBlciByYXRlIGxpbWl0IHRpY2suIFR5cGljYWxseSB0aGlzIHZhbHVlIHNob3VsZCBub3QgYmUgY2hhbmdlZC4gKi9cbiAgbWF4UmVxdWVzdHNQZXJSYXRlTGltaXRUaWNrOiBudW1iZXIgPSAxMjBcbiAgLyoqIFRoZSBwcmV2aW91cyBwYXlsb2FkIHNlcXVlbmNlIG51bWJlci4gKi9cbiAgcHJldmlvdXNTZXF1ZW5jZU51bWJlcjogbnVtYmVyIHwgbnVsbCA9IG51bGxcbiAgLyoqIEluIHdoaWNoIGludGVydmFsIChpbiBtaWxsaXNlY29uZHMpIHRoZSBnYXRld2F5IHJlc2V0cyBpdCdzIHJhdGUgbGltaXQuICovXG4gIHJhdGVMaW1pdFJlc2V0SW50ZXJ2YWw6IG51bWJlciA9IDYwMDAwXG4gIC8qKiBDdXJyZW50IHNlc3Npb24gaWQgb2YgdGhlIHNoYXJkIGlmIHByZXNlbnQuICovXG4gIHNlc3Npb25JZD86IHN0cmluZ1xuICAvKiogVGhpcyBjb250YWlucyB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gdG8gRGlzY29yZCwgaWYgY3VycmVudGx5IGNvbm5lY3RlZC4gKi9cbiAgc29ja2V0PzogV2ViU29ja2V0XG4gIC8qKiBDdXJyZW50IGludGVybmFsIHN0YXRlIG9mIHRoZSB0aGlzLiAqL1xuICBzdGF0ZSA9IFNoYXJkU3RhdGUuT2ZmbGluZVxuICAvKiogVGhlIHVybCBwcm92aWRlZCBieSBkaXNjb3JkIHRvIHVzZSB3aGVuIHJlc3VtaW5nIGEgY29ubmVjdGlvbiBmb3IgdGhpcyB0aGlzLiAqL1xuICByZXN1bWVHYXRld2F5VXJsOiBzdHJpbmcgPSAnJ1xuICAvKiogVGhlIHNoYXJkIHJlbGF0ZWQgZXZlbnQgaGFuZGxlcnMuICovXG4gIGV2ZW50czogU2hhcmRFdmVudHMgPSB7fVxuICAvKiogQ2FjaGUgZm9yIHBlbmRpbmcgZ2F0ZXdheSByZXF1ZXN0cyB3aGljaCBzaG91bGQgaGF2ZSBiZWVuIHNlbmQgd2hpbGUgdGhlIGdhdGV3YXkgd2VudCBvZmZsaW5lLiAqL1xuICBvZmZsaW5lU2VuZFF1ZXVlOiAoKCkgPT4gdm9pZClbXSA9IFtdXG4gIC8qKiBSZXNvbHZlIGludGVybmFsIHdhaXRpbmcgc3RhdGVzLiBNYXBwZWQgYnkgU2VsZWN0ZWRFdmVudHMgPT4gUmVzb2x2ZUZ1bmN0aW9uICovXG4gIHJlc29sdmVzID0gbmV3IE1hcDwnUkVBRFknIHwgJ1JFU1VNRUQnIHwgJ0lOVkFMSURfU0VTU0lPTicsIChwYXlsb2FkOiBEaXNjb3JkR2F0ZXdheVBheWxvYWQpID0+IHZvaWQ+KClcbiAgLyoqIFNoYXJkIGJ1Y2tldC4gT25seSBhY2Nlc3MgdGhpcyBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuIEJ1Y2tldCBmb3IgaGFuZGxpbmcgc2hhcmQgcmVxdWVzdCByYXRlIGxpbWl0cy4gKi9cbiAgYnVja2V0OiBMZWFreUJ1Y2tldFxuICAvKiogTG9nZ2VyIGZvciB0aGUgYnVja2V0ICovXG4gIGxvZ2dlcjogUGljazx0eXBlb2YgbG9nZ2VyLCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdmYXRhbCc+XG4gIC8qKiBUZXh0IGRlY29kZXIgdXNlZCBmb3IgY29tcHJlc3NlZCBwYXlsb2FkcyAqL1xuICB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpXG4gIC8qKiBaTGliIEluZmxhdGUgaW5zdGFuY2UgZm9yIFpMaWItc3RyZWFtIHRyYW5zcG9ydCBwYXlsb2FkcyAqL1xuICBpbmZsYXRlPzogSW5mbGF0ZVxuICAvKiogWkxpYiBpbmZsYXRlIGJ1ZmZlciAqL1xuICBpbmZsYXRlQnVmZmVyOiBVaW50OEFycmF5IHwgbnVsbCA9IG51bGxcbiAgLyoqIFpTdGQgRGVjb21wcmVzcyBpbnN0YW5jZSBmb3IgWlN0ZC1zdHJlYW0gdHJhbnNwb3J0IHBheWxvYWRzICovXG4gIHpzdGREZWNvbXByZXNzPzogWnN0ZERlY29tcHJlc3NcbiAgLyoqIFF1ZXVlIGZvciBjb21wcmVzc2VkIHBheWxvYWRzIGZvciBac3RkIERlY29tcHJlc3MgKi9cbiAgZGVjb21wcmVzc2lvblByb21pc2VzUXVldWU6ICgoZGF0YTogRGlzY29yZEdhdGV3YXlQYXlsb2FkKSA9PiB2b2lkKVtdID0gW11cblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBTaGFyZENyZWF0ZU9wdGlvbnMpIHtcbiAgICB0aGlzLmlkID0gb3B0aW9ucy5pZFxuICAgIHRoaXMuY29ubmVjdGlvbiA9IG9wdGlvbnMuY29ubmVjdGlvblxuICAgIHRoaXMuZXZlbnRzID0gb3B0aW9ucy5ldmVudHNcbiAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyID8/IGxvZ2dlclxuXG4gICAgdGhpcy5oZWFydCA9IHtcbiAgICAgIGFja25vd2xlZGdlZDogZmFsc2UsXG4gICAgICBpbnRlcnZhbDogNDUwMDAsXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucmVxdWVzdElkZW50aWZ5KSB0aGlzLnJlcXVlc3RJZGVudGlmeSA9IG9wdGlvbnMucmVxdWVzdElkZW50aWZ5XG4gICAgaWYgKG9wdGlvbnMuc2hhcmRJc1JlYWR5KSB0aGlzLnNoYXJkSXNSZWFkeSA9IG9wdGlvbnMuc2hhcmRJc1JlYWR5XG4gICAgaWYgKG9wdGlvbnMubWFrZVByZXNlbmNlKSB0aGlzLm1ha2VQcmVzZW5jZSA9IG9wdGlvbnMubWFrZVByZXNlbmNlXG5cbiAgICB0aGlzLmJ1Y2tldCA9IG5ldyBMZWFreUJ1Y2tldCh7XG4gICAgICBtYXg6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICByZWZpbGxBbW91bnQ6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICByZWZpbGxJbnRlcnZhbDogNjAwMDAsXG4gICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgIH0pXG4gIH1cblxuICAvKiogVGhlIGdhdGV3YXkgY29uZmlndXJhdGlvbiB3aGljaCBpcyB1c2VkIHRvIGNvbm5lY3QgdG8gRGlzY29yZC4gKi9cbiAgZ2V0IGdhdGV3YXlDb25maWcoKTogU2hhcmRHYXRld2F5Q29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uXG4gIH1cblxuICAvKiogVGhlIHVybCB0byBjb25uZWN0IHRvLiBJbml0aWFsbHkgdGhpcyBpcyB0aGUgZGlzY29yZCBnYXRld2F5IHVybCwgYW5kIHRoZW4gaXMgc3dpdGNoZWQgdG8gcmVzdW1lIGdhdGV3YXkgdXJsIG9uY2UgYSBSRUFEWSBpcyByZWNlaXZlZC4gKi9cbiAgZ2V0IGNvbm5lY3Rpb25VcmwoKTogc3RyaW5nIHtcbiAgICAvLyBVc2UgfHwgYW5kIG5vdCA/PyBoZXJlLiA/PyB3aWxsIGNhdXNlIGEgYnVnLlxuICAgIHJldHVybiB0aGlzLnJlc3VtZUdhdGV3YXlVcmwgfHwgdGhpcy5nYXRld2F5Q29uZmlnLnVybFxuICB9XG5cbiAgLyoqIENhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIHJlcXVlc3RzIHdoaWNoIGNhbiBzYWZlbHkgYmUgbWFkZSBwZXIgcmF0ZSBsaW1pdCBpbnRlcnZhbCwgYmVmb3JlIHRoZSBnYXRld2F5IGdldHMgZGlzY29ubmVjdGVkIGR1ZSB0byBhbiBleGNlZWRlZCByYXRlIGxpbWl0LiAqL1xuICBjYWxjdWxhdGVTYWZlUmVxdWVzdHMoKTogbnVtYmVyIHtcbiAgICAvLyAqIDIgYWRkcyBleHRyYSBzYWZldHkgbGF5ZXIgZm9yIGRpc2NvcmRzIE9QIDEgcmVxdWVzdHMgdGhhdCB3ZSBuZWVkIHRvIHJlc3BvbmQgdG9cbiAgICBjb25zdCBzYWZlUmVxdWVzdHMgPSB0aGlzLm1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljayAtIE1hdGguY2VpbCh0aGlzLnJhdGVMaW1pdFJlc2V0SW50ZXJ2YWwgLyB0aGlzLmhlYXJ0LmludGVydmFsKSAqIDJcblxuICAgIHJldHVybiBzYWZlUmVxdWVzdHMgPCAwID8gMCA6IHNhZmVSZXF1ZXN0c1xuICB9XG5cbiAgYXN5bmMgY2hlY2tPZmZsaW5lKGhpZ2hQcmlvcml0eTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzT3BlbigpKSByZXR1cm5cblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gSGlnaGVyIHByaW9yaXR5IHJlcXVlc3RzIGdldCBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS5cbiAgICAgIGlmIChoaWdoUHJpb3JpdHkpIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS51bnNoaWZ0KHJlc29sdmUpXG4gICAgICBlbHNlIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5wdXNoKHJlc29sdmUpXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBDbG9zZSB0aGUgc29ja2V0IGNvbm5lY3Rpb24gdG8gZGlzY29yZCBpZiBwcmVzZW50LiAqL1xuICBjbG9zZShjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc29ja2V0Py5yZWFkeVN0YXRlICE9PSBOb2RlV2ViU29ja2V0Lk9QRU4pIHJldHVyblxuXG4gICAgdGhpcy5zb2NrZXQ/LmNsb3NlKGNvZGUsIHJlYXNvbilcbiAgfVxuXG4gIC8qKiBDb25uZWN0IHRoZSBzaGFyZCB3aXRoIHRoZSBnYXRld2F5IGFuZCBzdGFydCBoZWFydGJlYXRpbmcuIFRoaXMgd2lsbCBub3QgaWRlbnRpZnkgdGhlIHNoYXJkIHRvIHRoZSBnYXRld2F5LiAqL1xuICBhc3luYyBjb25uZWN0KCk6IFByb21pc2U8RGlzY29yZGVub1NoYXJkPiB7XG4gICAgLy8gT25seSBzZXQgdGhlIHNoYXJkIHRvIGBDb25uZWN0aW5nYCBzdGF0ZSxcbiAgICAvLyBpZiB0aGUgY29ubmVjdGlvbiByZXF1ZXN0IGRvZXMgbm90IGNvbWUgZnJvbSBhbiBpZGVudGlmeSBvciByZXN1bWUgYWN0aW9uLlxuICAgIGlmICghW1NoYXJkU3RhdGUuSWRlbnRpZnlpbmcsIFNoYXJkU3RhdGUuUmVzdW1pbmddLmluY2x1ZGVzKHRoaXMuc3RhdGUpKSB7XG4gICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5Db25uZWN0aW5nXG4gICAgfVxuXG4gICAgdGhpcy5ldmVudHMuY29ubmVjdGluZz8uKHRoaXMpXG5cbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHRoaXMuY29ubmVjdGlvblVybClcbiAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgndicsIHRoaXMuZ2F0ZXdheUNvbmZpZy52ZXJzaW9uLnRvU3RyaW5nKCkpXG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2VuY29kaW5nJywgJ2pzb24nKVxuXG4gICAgLy8gU2V0IHRoZSBjb21wcmVzcyB1cmwgcGFyYW0gYW5kIGluaXRpYWxpemUgdGhlIGRlY29tcHJlc3Npb24gY29udGV4dHNcbiAgICBpZiAodGhpcy5nYXRld2F5Q29uZmlnLnRyYW5zcG9ydENvbXByZXNzaW9uKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnY29tcHJlc3MnLCB0aGlzLmdhdGV3YXlDb25maWcudHJhbnNwb3J0Q29tcHJlc3Npb24pXG5cbiAgICAgIGlmICh0aGlzLmdhdGV3YXlDb25maWcudHJhbnNwb3J0Q29tcHJlc3Npb24gPT09IFRyYW5zcG9ydENvbXByZXNzaW9uLnpsaWIpIHtcbiAgICAgICAgdGhpcy5pbmZsYXRlQnVmZmVyID0gbnVsbFxuICAgICAgICB0aGlzLmluZmxhdGUgPSBjcmVhdGVJbmZsYXRlKHtcbiAgICAgICAgICBmaW5pc2hGbHVzaDogemxpYkNvbnN0YW50cy5aX1NZTkNfRkxVU0gsXG4gICAgICAgICAgY2h1bmtTaXplOiA2NCAqIDEwMjQsXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5pbmZsYXRlLm9uKCdlcnJvcicsIChlKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ1RoZSB3YXMgYW4gZXJyb3IgaW4gZGVjb21wcmVzc2luZyBhIFpMaWIgY29tcHJlc3NlZCBwYXlsb2FkJywgZSlcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmluZmxhdGUub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgIGlmICghKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkgcmV0dXJuXG5cbiAgICAgICAgICBpZiAodGhpcy5pbmZsYXRlQnVmZmVyKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdCdWZmZXIgPSBuZXcgVWludDhBcnJheSh0aGlzLmluZmxhdGVCdWZmZXIuYnl0ZUxlbmd0aCArIGRhdGEuYnl0ZUxlbmd0aClcbiAgICAgICAgICAgIG5ld0J1ZmZlci5zZXQodGhpcy5pbmZsYXRlQnVmZmVyKVxuICAgICAgICAgICAgbmV3QnVmZmVyLnNldChkYXRhLCB0aGlzLmluZmxhdGVCdWZmZXIuYnl0ZUxlbmd0aClcbiAgICAgICAgICAgIHRoaXMuaW5mbGF0ZUJ1ZmZlciA9IG5ld0J1ZmZlclxuXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmluZmxhdGVCdWZmZXIgPSBkYXRhXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmdhdGV3YXlDb25maWcudHJhbnNwb3J0Q29tcHJlc3Npb24gPT09IFRyYW5zcG9ydENvbXByZXNzaW9uLnpzdGQpIHtcbiAgICAgICAgY29uc3QgZnpzdGQgPSBhd2FpdCBnZXRGWlN0ZCgpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdbU2hhcmRdIFwiZnpzdGRcIiBpcyBub3QgaW5zdGFsbGVkLiBEaXNhYmxlZCB0cmFuc3BvcnQgY29tcHJlc3Npb24uJylcbiAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLmRlbGV0ZSgnY29tcHJlc3MnKVxuXG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoZnpzdGQpIHtcbiAgICAgICAgICB0aGlzLnpzdGREZWNvbXByZXNzID0gbmV3IGZ6c3RkLkRlY29tcHJlc3MoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRlY29kZWREYXRhID0gdGhpcy50ZXh0RGVjb2Rlci5kZWNvZGUoZGF0YSlcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSBKU09OLnBhcnNlKGRlY29kZWREYXRhKVxuICAgICAgICAgICAgdGhpcy5kZWNvbXByZXNzaW9uUHJvbWlzZXNRdWV1ZS5zaGlmdCgpPy4ocGFyc2VkRGF0YSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZ2F0ZXdheUNvbmZpZy5jb21wcmVzcyAmJiB0aGlzLmdhdGV3YXlDb25maWcudHJhbnNwb3J0Q29tcHJlc3Npb24pIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ1tTaGFyZF0gUGF5bG9hZCBjb21wcmVzc2lvbiBoYXMgYmVlbiBkaXNhYmxlZCBzaW5jZSB0cmFuc3BvcnQgY29tcHJlc3Npb24gaXMgZW5hYmxlZCBhcyB3ZWxsLicpXG4gICAgICB0aGlzLmdhdGV3YXlDb25maWcuY29tcHJlc3MgPSBmYWxzZVxuICAgIH1cblxuICAgIC8vIFdlIGNoZWNrIGZvciBidWlsdC1pbiBXZWJTb2NrZXQgaW1wbGVtZW50YXRpb25zIGluIEJ1biBvciBEZW5vLCBOb2RlSlMgdjIyIGhhcyBhbiBpbXBsZW1lbnRhdGlvbiB0b28gYnV0IGl0IHNlZW1zIHRvIGJlIGxlc3Mgb3B0aW1pemVkIHNvIGZvciBub3cgaXQgaXMgYmV0dGVyIHRvIHVzZSB0aGUgd3MgbnBtIHBhY2thZ2VcbiAgICBjb25zdCBzaG91bGRVc2VCdWlsdGluID0gUmVmbGVjdC5oYXMoZ2xvYmFsVGhpcywgJ1dlYlNvY2tldCcpICYmIChSZWZsZWN0LmhhcyhnbG9iYWxUaGlzLCAnQnVuJykgfHwgUmVmbGVjdC5oYXMoZ2xvYmFsVGhpcywgJ0Rlbm8nKSlcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgTm9kZVdlYlNvY2tldCBkb2Vzbid0IHN1cHBvcnQgXCJkaXNwYXRjaEV2ZW50XCIsIGFuZCB3aGlsZSB3ZSBkb24ndCB1c2UgaXQsIGl0IGlzIHJlcXVpcmVkIG9uIHRoZSBcIldlYlNvY2tldFwiIHR5cGVcbiAgICBjb25zdCBzb2NrZXQ6IFdlYlNvY2tldCA9IHNob3VsZFVzZUJ1aWx0aW4gPyBuZXcgV2ViU29ja2V0KHVybCkgOiBuZXcgTm9kZVdlYlNvY2tldCh1cmwpXG4gICAgdGhpcy5zb2NrZXQgPSBzb2NrZXRcblxuICAgIC8vIEJ5IGRlZmF1bHQgV2ViU29ja2V0IHdpbGwgZ2l2ZSB1cyBhIEJsb2IsIHRoaXMgY2hhbmdlcyBpdCBzbyB0aGF0IGl0IGdpdmVzIHVzIGFuIEFycmF5QnVmZmVyXG4gICAgc29ja2V0LmJpbmFyeVR5cGUgPSAnYXJyYXlidWZmZXInXG5cbiAgICBzb2NrZXQub25lcnJvciA9IChldmVudCkgPT4gdGhpcy5oYW5kbGVFcnJvcihldmVudClcbiAgICBzb2NrZXQub25jbG9zZSA9IChjbG9zZUV2ZW50KSA9PiB0aGlzLmhhbmRsZUNsb3NlKGNsb3NlRXZlbnQpXG4gICAgc29ja2V0Lm9ubWVzc2FnZSA9IChtZXNzYWdlRXZlbnQpID0+IHRoaXMuaGFuZGxlTWVzc2FnZShtZXNzYWdlRXZlbnQpXG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgIC8vIE9ubHkgc2V0IHRoZSBzaGFyZCB0byBgVW5pZGVudGlmaWVkYCBzdGF0ZSBpZiB0aGUgY29ubmVjdGlvbiByZXF1ZXN0IGRvZXMgbm90IGNvbWUgZnJvbSBhbiBpZGVudGlmeSBvciByZXN1bWUgYWN0aW9uLlxuICAgICAgICBpZiAoIVtTaGFyZFN0YXRlLklkZW50aWZ5aW5nLCBTaGFyZFN0YXRlLlJlc3VtaW5nXS5pbmNsdWRlcyh0aGlzLnN0YXRlKSkge1xuICAgICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLlVuaWRlbnRpZmllZFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ldmVudHMuY29ubmVjdGVkPy4odGhpcylcblxuICAgICAgICByZXNvbHZlKHRoaXMpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKiBJZGVudGlmeSB0aGUgc2hhcmQgdG8gdGhlIGdhdGV3YXkuIElmIG5vdCBjb25uZWN0ZWQsIHRoaXMgd2lsbCBhbHNvIGNvbm5lY3QgdGhlIHNoYXJkIHRvIHRoZSBnYXRld2F5LiAqL1xuICBhc3luYyBpZGVudGlmeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBBIG5ldyBpZGVudGlmeSBoYXMgYmVlbiByZXF1ZXN0ZWQgZXZlbiB0aG91Z2ggdGhlcmUgaXMgYWxyZWFkeSBhIGNvbm5lY3Rpb24gb3Blbi5cbiAgICAvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBjbG9zZSB0aGUgb2xkIGNvbm5lY3Rpb24gYW5kIGhlYXJ0YmVhdGluZyBiZWZvcmUgY3JlYXRpbmcgYSBuZXcgb25lLlxuICAgIGlmICh0aGlzLmlzT3BlbigpKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgQ0xPU0lORyBFWElTVElORyBTSEFSRDogIyR7dGhpcy5pZH1gKVxuICAgICAgdGhpcy5jbG9zZShTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVJZGVudGlmeWluZywgJ1JlLWlkZW50aWZ5aW5nIGNsb3N1cmUgb2Ygb2xkIGNvbm5lY3Rpb24uJylcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5JZGVudGlmeWluZ1xuICAgIHRoaXMuZXZlbnRzLmlkZW50aWZ5aW5nPy4odGhpcylcblxuICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHNoYXJkIGlzIGluIEhlYXJ0YmVhdGluZyBzdGF0ZSBidXQgbm90IGlkZW50aWZpZWQsXG4gICAgLy8gc28gY2hlY2sgd2hldGhlciB0aGVyZSBpcyBhbHJlYWR5IGEgZ2F0ZXdheSBjb25uZWN0aW9uIGV4aXN0aW5nLlxuICAgIC8vIElmIG5vdCB3ZSBuZWVkIHRvIGNyZWF0ZSBvbmUgYmVmb3JlIHdlIGlkZW50aWZ5LlxuICAgIGlmICghdGhpcy5pc09wZW4oKSkge1xuICAgICAgYXdhaXQgdGhpcy5jb25uZWN0KClcbiAgICB9XG5cbiAgICB0aGlzLnNlbmQoXG4gICAgICB7XG4gICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5JZGVudGlmeSxcbiAgICAgICAgZDoge1xuICAgICAgICAgIHRva2VuOiBgQm90ICR7dGhpcy5nYXRld2F5Q29uZmlnLnRva2VufWAsXG4gICAgICAgICAgY29tcHJlc3M6IHRoaXMuZ2F0ZXdheUNvbmZpZy5jb21wcmVzcyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB0aGlzLmdhdGV3YXlDb25maWcucHJvcGVydGllcyxcbiAgICAgICAgICBpbnRlbnRzOiB0aGlzLmdhdGV3YXlDb25maWcuaW50ZW50cyxcbiAgICAgICAgICBzaGFyZDogW3RoaXMuaWQsIHRoaXMuZ2F0ZXdheUNvbmZpZy50b3RhbFNoYXJkc10sXG4gICAgICAgICAgcHJlc2VuY2U6IGF3YWl0IHRoaXMubWFrZVByZXNlbmNlPy4oKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgIClcblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5yZXNvbHZlcy5zZXQoJ1JFQURZJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmV2ZW50cy5pZGVudGlmaWVkPy4odGhpcylcbiAgICAgICAgLy8gVGVsbHMgdGhlIG1hbmFnZXIgdGhhdCB0aGlzIHNoYXJkIGlzIHJlYWR5XG4gICAgICAgIHRoaXMuc2hhcmRJc1JlYWR5KClcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9KVxuICAgICAgLy8gV2hlbiBpZGVudGlmeWluZyB0b28gZmFzdCxcbiAgICAgIC8vIERpc2NvcmQgc2VuZHMgYW4gaW52YWxpZCBzZXNzaW9uIHBheWxvYWQuXG4gICAgICAvLyBUaGlzIGNhbiBzYWZlbHkgYmUgaWdub3JlZCB0aG91Z2ggYW5kIHRoZSBzaGFyZCBzdGFydHMgYSBuZXcgaWRlbnRpZnkgYWN0aW9uLlxuICAgICAgdGhpcy5yZXNvbHZlcy5zZXQoJ0lOVkFMSURfU0VTU0lPTicsICgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNvbHZlcy5kZWxldGUoJ1JFQURZJylcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKiogQ2hlY2sgd2hldGhlciB0aGUgY29ubmVjdGlvbiB0byBEaXNjb3JkIGlzIGN1cnJlbnRseSBvcGVuLiAqL1xuICBpc09wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc29ja2V0Py5yZWFkeVN0YXRlID09PSBOb2RlV2ViU29ja2V0Lk9QRU5cbiAgfVxuXG4gIC8qKiBBdHRlbXB0IHRvIHJlc3VtZSB0aGUgcHJldmlvdXMgc2hhcmRzIHNlc3Npb24gd2l0aCB0aGUgZ2F0ZXdheS4gKi9cbiAgYXN5bmMgcmVzdW1lKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gUmVzdW1pbmcgU2hhcmQgIyR7dGhpcy5pZH1gKVxuICAgIC8vIEl0IGhhcyBiZWVuIHJlcXVlc3RlZCB0byByZXN1bWUgdGhlIFNoYXJkcyBzZXNzaW9uLlxuICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgc2hhcmQgaXMgc3RpbGwgY29ubmVjdGVkIHdpdGggRGlzY29yZCdzIGdhdGV3YXkgdGhlcmVmb3JlIHdlIG5lZWQgdG8gZm9yY2VmdWxseSBjbG9zZSBpdC5cbiAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBSZXN1bWluZyBTaGFyZCAjJHt0aGlzLmlkfSBpbiBpc09wZW5gKVxuICAgICAgdGhpcy5jbG9zZShTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVzdW1lQ2xvc2luZ09sZENvbm5lY3Rpb24sICdSZWNvbm5lY3RpbmcgdGhlIHNoYXJkLCBjbG9zaW5nIG9sZCBjb25uZWN0aW9uLicpXG4gICAgfVxuXG4gICAgLy8gU2hhcmQgaGFzIG5ldmVyIGlkZW50aWZpZWQsIHNvIHdlIGNhbm5vdCByZXN1bWUuXG4gICAgaWYgKCF0aGlzLnNlc3Npb25JZCkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gVHJ5aW5nIHRvIHJlc3VtZSBhIHNoYXJkICMke3RoaXMuaWR9IHRoYXQgd2FzIE5PVCBmaXJzdCBpZGVudGlmaWVkLiAoTm8gc2Vzc2lvbiBpZCBmb3VuZClgKVxuXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5pZGVudGlmeSgpXG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuUmVzdW1pbmdcblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gUmVzdW1pbmcgU2hhcmQgIyR7dGhpcy5pZH0sIGJlZm9yZSBjb25uZWN0aW5nYClcbiAgICAvLyBCZWZvcmUgd2UgY2FuIHJlc3VtZSwgd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbiB3aXRoIERpc2NvcmQncyBnYXRld2F5LlxuICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBSZXN1bWluZyBTaGFyZCAjJHt0aGlzLmlkfSwgYWZ0ZXIgY29ubmVjdGluZy4gJHt0aGlzLnNlc3Npb25JZH0gfCAke3RoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlcn1gKVxuXG4gICAgdGhpcy5zZW5kKFxuICAgICAge1xuICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuUmVzdW1lLFxuICAgICAgICBkOiB7XG4gICAgICAgICAgdG9rZW46IGBCb3QgJHt0aGlzLmdhdGV3YXlDb25maWcudG9rZW59YCxcbiAgICAgICAgICBzZXNzaW9uX2lkOiB0aGlzLnNlc3Npb25JZCxcbiAgICAgICAgICBzZXE6IHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlciA/PyAwLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRydWUsXG4gICAgKVxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFJlc3VtaW5nIFNoYXJkICMke3RoaXMuaWR9IGFmdGVyIHNlbmQgcmVzdW1lYClcblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5yZXNvbHZlcy5zZXQoJ1JFU1VNRUQnLCAoKSA9PiByZXNvbHZlKCkpXG4gICAgICAvLyBJZiBpdCBpcyBhdHRlbXB0ZWQgdG8gcmVzdW1lIHdpdGggYW4gaW52YWxpZCBzZXNzaW9uIGlkLFxuICAgICAgLy8gRGlzY29yZCBzZW5kcyBhbiBpbnZhbGlkIHNlc3Npb24gcGF5bG9hZFxuICAgICAgLy8gTm90IGVycm9yaW5nIGhlcmUgc2luY2UgaXQgaXMgZWFzeSB0aGF0IHRoaXMgaGFwcGVucywgYWxzbyBpdCB3b3VsZCBiZSBub3QgY2F0Y2hhYmxlXG4gICAgICB0aGlzLnJlc29sdmVzLnNldCgnSU5WQUxJRF9TRVNTSU9OJywgKCkgPT4ge1xuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnUkVTVU1FRCcpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqIFNlbmQgYSBtZXNzYWdlIHRvIERpc2NvcmQuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2hpZ2hQcmlvcml0eT1mYWxzZV0gLSBXaGV0aGVyIHRoaXMgbWVzc2FnZSBzaG91bGQgYmUgc2VuZCBhc2FwLlxuICAgKi9cbiAgYXN5bmMgc2VuZChtZXNzYWdlOiBTaGFyZFNvY2tldFJlcXVlc3QsIGhpZ2hQcmlvcml0eTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQmVmb3JlIGFjcXVpcmluZyBhIHRva2VuIGZyb20gdGhlIGJ1Y2tldCwgY2hlY2sgd2hldGhlciB0aGUgc2hhcmQgaXMgY3VycmVudGx5IG9mZmxpbmUgb3Igbm90LlxuICAgIC8vIEVsc2UgYnVja2V0IGFuZCB0b2tlbiB3YWl0IHRpbWUganVzdCBnZXQgd2FzdGVkLlxuICAgIGF3YWl0IHRoaXMuY2hlY2tPZmZsaW5lKGhpZ2hQcmlvcml0eSlcblxuICAgIGF3YWl0IHRoaXMuYnVja2V0LmFjcXVpcmUoaGlnaFByaW9yaXR5KVxuXG4gICAgLy8gSXQncyBwb3NzaWJsZSwgdGhhdCB0aGUgc2hhcmQgd2VudCBvZmZsaW5lIGFmdGVyIGEgdG9rZW4gaGFzIGJlZW4gYWNxdWlyZWQgZnJvbSB0aGUgYnVja2V0LlxuICAgIGF3YWl0IHRoaXMuY2hlY2tPZmZsaW5lKGhpZ2hQcmlvcml0eSlcblxuICAgIHRoaXMuc29ja2V0Py5zZW5kKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKVxuICB9XG5cbiAgLyoqIFNodXRkb3duIHRoZSB0aGlzLiBGb3JjZWZ1bGx5IGRpc2Nvbm5lY3QgdGhlIHNoYXJkIGZyb20gRGlzY29yZC4gVGhlIHNoYXJkIG1heSBub3QgYXR0ZW1wdCB0byByZWNvbm5lY3Qgd2l0aCBEaXNjb3JkLiAqL1xuICBhc3luYyBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNsb3NlKFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5TaHV0ZG93biwgJ1NoYXJkIHNodXR0aW5nIGRvd24uJylcbiAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lXG4gIH1cblxuICAvKiogSGFuZGxlIGEgZ2F0ZXdheSBjb25uZWN0aW9uIGVycm9yICovXG4gIGhhbmRsZUVycm9yKGVycm9yOiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMubG9nZ2VyLmVycm9yKGBbU2hhcmRdIFRoZXJlIHdhcyBhbiBlcnJvciBjb25uZWN0aW5nIHNoYXJkICR7dGhpcy5pZH0uYCwgZXJyb3IpXG4gIH1cblxuICAvKiogSGFuZGxlIGEgZ2F0ZXdheSBjb25uZWN0aW9uIGNsb3NlLiAqL1xuICBhc3luYyBoYW5kbGVDbG9zZShjbG9zZTogQ2xvc2VFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RvcEhlYXJ0YmVhdGluZygpXG5cbiAgICAvLyBDbGVhciB0aGUgemxpYi96c3RkIGRhdGFcbiAgICB0aGlzLmluZmxhdGUgPSB1bmRlZmluZWRcbiAgICB0aGlzLnpzdGREZWNvbXByZXNzID0gdW5kZWZpbmVkXG4gICAgdGhpcy5pbmZsYXRlQnVmZmVyID0gbnVsbFxuICAgIHRoaXMuZGVjb21wcmVzc2lvblByb21pc2VzUXVldWUgPSBbXVxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBgW1NoYXJkXSBHYXRld2F5IGNvbm5lY3Rpb24gY2xvc2VkIHdpdGggY29kZSAke2Nsb3NlLmNvZGV9ICgke2Nsb3NlLnJlYXNvbiB8fCAnPE5vIHJlYXNvbiBwcm92aWRlZD4nfSkuYCxcbiAgICApXG5cbiAgICBzd2l0Y2ggKGNsb3NlLmNvZGUpIHtcbiAgICAgIGNhc2UgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlRlc3RpbmdGaW5pc2hlZDoge1xuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICAvLyBPbiB0aGVzZSBjb2RlcyBhIG1hbnVhbCBzdGFydCB3aWxsIGJlIGRvbmUuXG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5TaHV0ZG93bjpcbiAgICAgIGNhc2UgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlSWRlbnRpZnlpbmc6XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZXNoYXJkZWQ6XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZXN1bWVDbG9zaW5nT2xkQ29ubmVjdGlvbjpcbiAgICAgIGNhc2UgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlpvbWJpZWRDb25uZWN0aW9uOiB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLkRpc2Nvbm5lY3RlZFxuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIC8vIGdhdGV3YXkuZGVidWcoXCJHVyBDTE9TRURfUkVDT05ORUNUXCIsIHsgc2hhcmRJZCwgcGF5bG9hZDogZXZlbnQgfSk7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgLy8gR2F0ZXdheSBjb25uZWN0aW9uIGNsb3NlcyB3aGljaCByZXF1aXJlIGEgbmV3IGlkZW50aWZ5LlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlVua25vd25PcGNvZGU6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuTm90QXV0aGVudGljYXRlZDpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5JbnZhbGlkU2VxOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlJhdGVMaW1pdGVkOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlNlc3Npb25UaW1lZE91dDoge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnW1NoYXJkXSBHYXRld2F5IGNvbm5lY3Rpb24gY2xvc2luZyByZXF1aXJpbmcgcmUtaWRlbnRpZnkuJylcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuSWRlbnRpZnlpbmdcbiAgICAgICAgdGhpcy5ldmVudHMuZGlzY29ubmVjdGVkPy4odGhpcylcblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5pZGVudGlmeSgpXG4gICAgICB9XG4gICAgICAvLyBXaGVuIHRoZXNlIGNvZGVzIGFyZSByZWNlaXZlZCBzb21ldGhpbmcgd2VudCByZWFsbHkgd3JvbmcuXG4gICAgICAvLyBPbiB0aG9zZSB3ZSBjYW5ub3Qgc3RhcnQgYSByZWNvbm5lY3QgYXR0ZW1wdC5cbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5BdXRoZW50aWNhdGlvbkZhaWxlZDpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5JbnZhbGlkU2hhcmQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuU2hhcmRpbmdSZXF1aXJlZDpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5JbnZhbGlkQXBpVmVyc2lvbjpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5JbnZhbGlkSW50ZW50czpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5EaXNhbGxvd2VkSW50ZW50czoge1xuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNsb3NlLnJlYXNvbiB8fCAnRGlzY29yZCBnYXZlIG5vIHJlYXNvbiEgR0chIFlvdSBicm9rZSBEaXNjb3JkIScpXG4gICAgICB9XG4gICAgICAvLyBHYXRld2F5IGNvbm5lY3Rpb24gY2xvc2VzIG9uIHdoaWNoIGEgcmVzdW1lIGlzIGFsbG93ZWQuXG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuVW5rbm93bkVycm9yOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkRlY29kZUVycm9yOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkFscmVhZHlBdXRoZW50aWNhdGVkOlxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKGBbU2hhcmRdIENsb3NlZCBzaGFyZCAjJHt0aGlzLmlkfSB3aXRoIGNvZGUgJHtjbG9zZS5jb2RlfS4gQXR0ZW1wdGluZyB0byByZXN1bWUuLi5gKVxuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5SZXN1bWluZ1xuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlc3VtZSgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEhhbmRsZSBhbiBpbmNvbWluZyBnYXRld2F5IG1lc3NhZ2UuICovXG4gIGFzeW5jIGhhbmRsZU1lc3NhZ2UobWVzc2FnZTogTWVzc2FnZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gVGhlIHdzIG5wbSBwYWNrYWdlIHdpbGwgdXNlIGEgQnVmZmVyLCB3aGlsZSB0aGUgZ2xvYmFsIGJ1aWx0LWluIHdpbGwgdXNlIEFycmF5QnVmZmVyXG4gICAgY29uc3QgaXNDb21wcmVzc2VkID0gbWVzc2FnZS5kYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgbWVzc2FnZS5kYXRhIGluc3RhbmNlb2YgQnVmZmVyXG5cbiAgICBjb25zdCBkYXRhID0gaXNDb21wcmVzc2VkID8gYXdhaXQgdGhpcy5kZWNvbXByZXNzUGFja2V0KG1lc3NhZ2UuZGF0YSkgOiAoSlNPTi5wYXJzZShtZXNzYWdlLmRhdGEpIGFzIERpc2NvcmRHYXRld2F5UGF5bG9hZClcblxuICAgIC8vIENoZWNrIGlmIHRoZSBkZWNvbXByZXNzaW9uIHdhcyBub3Qgc3VjY2Vzc2Z1bFxuICAgIGlmICghZGF0YSkgcmV0dXJuXG5cbiAgICBhd2FpdCB0aGlzLmhhbmRsZURpc2NvcmRQYWNrZXQoZGF0YSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvbXByZXNzIGEgemxpYi96c3RkIGNvbXByZXNzZWQgcGFja2V0XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBhc3luYyBkZWNvbXByZXNzUGFja2V0KGRhdGE6IEFycmF5QnVmZmVyIHwgQnVmZmVyKTogUHJvbWlzZTxEaXNjb3JkR2F0ZXdheVBheWxvYWQgfCBudWxsPiB7XG4gICAgLy8gQSBidWZmZXIgaXMgYSBVaW50OEFycmF5IHVuZGVyIHRoZSBob29kLiBBbiBBcnJheUJ1ZmZlciBpcyBnZW5lcmljLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgVWludDhBcnJheSB0aGF0IHVzZXMgdGhlIHdob2xlIEFycmF5QnVmZmVyXG4gICAgY29uc3QgY29tcHJlc3NlZERhdGE6IFVpbnQ4QXJyYXkgPSBkYXRhIGluc3RhbmNlb2YgQnVmZmVyID8gZGF0YSA6IG5ldyBVaW50OEFycmF5KGRhdGEpXG5cbiAgICBpZiAodGhpcy5nYXRld2F5Q29uZmlnLnRyYW5zcG9ydENvbXByZXNzaW9uID09PSBUcmFuc3BvcnRDb21wcmVzc2lvbi56bGliKSB7XG4gICAgICBpZiAoIXRoaXMuaW5mbGF0ZSkge1xuICAgICAgICB0aGlzLmxvZ2dlci5mYXRhbCgnW1NoYXJkXSB6bGliLXN0cmVhbSB0cmFuc3BvcnQgY29tcHJlc3Npb24gd2FzIGVuYWJsZWQgYnV0IG5vIGluc3RhbmNlIG9mIEluZmxhdGUgd2FzIGZvdW5kLicpXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG5cbiAgICAgIC8vIEFsaWFzLCB1c2VkIHRvIGF2b2lkIHNvbWUgbnVsbCBjaGVja3MgaW4gdGhlIFByb21pc2UgY29uc3RydWN0b3JcbiAgICAgIGNvbnN0IGluZmxhdGUgPSB0aGlzLmluZmxhdGVcblxuICAgICAgY29uc3Qgd3JpdGVQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBpbmZsYXRlLndyaXRlKGNvbXByZXNzZWREYXRhLCAnYmluYXJ5JywgKGVycm9yKSA9PiAoZXJyb3IgPyByZWplY3QoZXJyb3IpIDogcmVzb2x2ZSgpKSlcbiAgICAgIH0pXG5cbiAgICAgIGlmICghZW5kc1dpdGhNYXJrZXIoY29tcHJlc3NlZERhdGEsIFpMSUJfU1lOQ19GTFVTSCkpIHJldHVybiBudWxsXG5cbiAgICAgIGF3YWl0IHdyaXRlUHJvbWlzZVxuXG4gICAgICBpZiAoIXRoaXMuaW5mbGF0ZUJ1ZmZlcikge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdbU2hhcmRdIFRoZSBaTGliIGluZmxhdGUgYnVmZmVyIHdhcyBjbGVhcmVkIGF0IGFuIHVuZXhwZWN0ZWQgbW9tZW50LicpXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlY29kZWREYXRhID0gdGhpcy50ZXh0RGVjb2Rlci5kZWNvZGUodGhpcy5pbmZsYXRlQnVmZmVyKVxuICAgICAgdGhpcy5pbmZsYXRlQnVmZmVyID0gbnVsbFxuXG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShkZWNvZGVkRGF0YSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5nYXRld2F5Q29uZmlnLnRyYW5zcG9ydENvbXByZXNzaW9uID09PSBUcmFuc3BvcnRDb21wcmVzc2lvbi56c3RkKSB7XG4gICAgICBpZiAoIXRoaXMuenN0ZERlY29tcHJlc3MpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZmF0YWwoJ1tTaGFyZF0genN0ZC1zdHJlYW0gdHJhbnNwb3J0IGNvbXByZXNzaW9uIHdhcyBlbmFibGVkIGJ1dCBubyBpbnN0YW5jZSBvZiBEZWNvbXByZXNzIHdhcyBmb3VuZC4nKVxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuXG4gICAgICB0aGlzLnpzdGREZWNvbXByZXNzLnB1c2goY29tcHJlc3NlZERhdGEpXG5cbiAgICAgIGNvbnN0IGRlY29tcHJlc3Npb25Qcm9taXNlID0gbmV3IFByb21pc2U8RGlzY29yZEdhdGV3YXlQYXlsb2FkPigocikgPT4gdGhpcy5kZWNvbXByZXNzaW9uUHJvbWlzZXNRdWV1ZS5wdXNoKHIpKVxuICAgICAgcmV0dXJuIGF3YWl0IGRlY29tcHJlc3Npb25Qcm9taXNlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZ2F0ZXdheUNvbmZpZy5jb21wcmVzcykge1xuICAgICAgY29uc3QgZGVjb21wcmVzc2VkID0gaW5mbGF0ZVN5bmMoY29tcHJlc3NlZERhdGEpXG4gICAgICBjb25zdCBkZWNvZGVkRGF0YSA9IHRoaXMudGV4dERlY29kZXIuZGVjb2RlKGRlY29tcHJlc3NlZClcblxuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlZERhdGEpXG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKiBIYW5kbGVzIGEgaW5jb21pbmcgZ2F0ZXdheSBwYWNrZXQuICovXG4gIGFzeW5jIGhhbmRsZURpc2NvcmRQYWNrZXQocGFja2V0OiBEaXNjb3JkR2F0ZXdheVBheWxvYWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBFZGdlIGNhc2Ugc3RhcnQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9kaXNjb3JkZW5vL2Rpc2NvcmRlbm8vaXNzdWVzLzIzMTFcbiAgICB0aGlzLmhlYXJ0Lmxhc3RBY2sgPSBEYXRlLm5vdygpXG4gICAgdGhpcy5oZWFydC5hY2tub3dsZWRnZWQgPSB0cnVlXG4gICAgLy8gRWRnZSBjYXNlIGVuZCFcblxuICAgIHN3aXRjaCAocGFja2V0Lm9wKSB7XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdDoge1xuICAgICAgICAvLyBUT0RPOiBjYW4gdGhpcyBhY3R1YWxseSBoYXBwZW5cbiAgICAgICAgaWYgKCF0aGlzLmlzT3BlbigpKSByZXR1cm5cblxuICAgICAgICB0aGlzLmhlYXJ0Lmxhc3RCZWF0ID0gRGF0ZS5ub3coKVxuICAgICAgICAvLyBEaXNjb3JkIHJhbmRvbWx5IHNlbmRzIHRoaXMgcmVxdWlyaW5nIGFuIGltbWVkaWF0ZSBoZWFydGJlYXQgYmFjay5cbiAgICAgICAgLy8gVXNpbmcgYSBkaXJlY3Qgc29ja2V0LnNlbmQgY2FsbCBoZXJlIGJlY2F1c2UgaGVhcnRiZWF0IHJlcXVlc3RzIGFyZSByZXNlcnZlZCBieSB1cy5cbiAgICAgICAgdGhpcy5zb2NrZXQ/LnNlbmQoXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdCxcbiAgICAgICAgICAgIGQ6IHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlcixcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgICB0aGlzLmV2ZW50cy5oZWFydGJlYXQ/Lih0aGlzKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLkhlbGxvOiB7XG4gICAgICAgIGNvbnN0IGludGVydmFsID0gKHBhY2tldC5kIGFzIERpc2NvcmRIZWxsbykuaGVhcnRiZWF0X2ludGVydmFsXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gSGVsbG8gb24gU2hhcmQgIyR7dGhpcy5pZH1gKVxuICAgICAgICB0aGlzLnN0YXJ0SGVhcnRiZWF0aW5nKGludGVydmFsKVxuXG4gICAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBTaGFyZFN0YXRlLlJlc3VtaW5nKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFF1ZXVlID0gWy4uLnRoaXMuYnVja2V0LnF1ZXVlXVxuICAgICAgICAgIC8vIEhFTExPIGhhcyBiZWVuIHNlbmQgb24gYSBub24gcmVzdW1lIGFjdGlvbi5cbiAgICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgdGhlIHNoYXJkIHN0YXJ0cyBhIG5ldyBzZXNzaW9uLFxuICAgICAgICAgIC8vIHRoZXJlZm9yZSB0aGUgcmF0ZSBsaW1pdCBpbnRlcnZhbCBoYXMgYmVlbiByZXNldCB0b28uXG4gICAgICAgICAgdGhpcy5idWNrZXQgPSBuZXcgTGVha3lCdWNrZXQoe1xuICAgICAgICAgICAgbWF4OiB0aGlzLmNhbGN1bGF0ZVNhZmVSZXF1ZXN0cygpLFxuICAgICAgICAgICAgcmVmaWxsSW50ZXJ2YWw6IDYwMDAwLFxuICAgICAgICAgICAgcmVmaWxsQW1vdW50OiB0aGlzLmNhbGN1bGF0ZVNhZmVSZXF1ZXN0cygpLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICAvLyBRdWV1ZSBzaG91bGQgbm90IGJlIGxvc3Qgb24gYSByZS1pZGVudGlmeS5cbiAgICAgICAgICB0aGlzLmJ1Y2tldC5xdWV1ZS51bnNoaWZ0KC4uLmN1cnJlbnRRdWV1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXZlbnRzLmhlbGxvPy4odGhpcylcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXRBQ0s6IHtcbiAgICAgICAgLy8gTWFudWFsbHkgY2FsY3VsYXRpbmcgdGhlIHJvdW5kIHRyaXAgdGltZSBmb3IgdXNlcnMgd2hvIG5lZWQgaXQuXG4gICAgICAgIGlmICh0aGlzLmhlYXJ0Lmxhc3RCZWF0KSB7XG4gICAgICAgICAgdGhpcy5oZWFydC5ydHQgPSB0aGlzLmhlYXJ0Lmxhc3RBY2sgLSB0aGlzLmhlYXJ0Lmxhc3RCZWF0XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV2ZW50cy5oZWFydGJlYXRBY2s/Lih0aGlzKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLlJlY29ubmVjdDoge1xuICAgICAgICAvLyAgIGdhdGV3YXkuZGVidWcoXCJHVyBSRUNPTk5FQ1RcIiwgeyBzaGFyZElkIH0pO1xuXG4gICAgICAgIHRoaXMuZXZlbnRzLnJlcXVlc3RlZFJlY29ubmVjdD8uKHRoaXMpXG5cbiAgICAgICAgYXdhaXQgdGhpcy5yZXN1bWUoKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLkludmFsaWRTZXNzaW9uOiB7XG4gICAgICAgIGNvbnN0IHJlc3VtYWJsZSA9IHBhY2tldC5kIGFzIGJvb2xlYW5cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gUmVjZWl2ZWQgSW52YWxpZCBTZXNzaW9uIGZvciBTaGFyZCAjJHt0aGlzLmlkfSB3aXRoIHJlc3VtZWFibGUgYXMgJHtyZXN1bWFibGUudG9TdHJpbmcoKX1gKVxuXG4gICAgICAgIHRoaXMuZXZlbnRzLmludmFsaWRTZXNzaW9uPy4odGhpcywgcmVzdW1hYmxlKVxuXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gd2FpdCBmb3IgYSByYW5kb20gYW1vdW50IG9mIHRpbWUgYmV0d2VlbiAxIGFuZCA1XG4gICAgICAgIC8vIFJlZmVyZW5jZTogaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL2dhdGV3YXkjcmVzdW1pbmdcbiAgICAgICAgYXdhaXQgZGVsYXkoTWF0aC5mbG9vcigoTWF0aC5yYW5kb20oKSAqIDQgKyAxKSAqIDEwMDApKVxuXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZ2V0KCdJTlZBTElEX1NFU1NJT04nKT8uKHBhY2tldClcbiAgICAgICAgdGhpcy5yZXNvbHZlcy5kZWxldGUoJ0lOVkFMSURfU0VTU0lPTicpXG5cbiAgICAgICAgLy8gV2hlbiByZXN1bWFibGUgaXMgZmFsc2Ugd2UgbmVlZCB0byByZS1pZGVudGlmeVxuICAgICAgICBpZiAoIXJlc3VtYWJsZSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdElkZW50aWZ5KClcblxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgc2Vzc2lvbiBpcyBpbnZhbGlkIGJ1dCBhcHBhcmVudGx5IGl0IGlzIHJlc3VtYWJsZVxuICAgICAgICBhd2FpdCB0aGlzLnJlc3VtZSgpXG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2ggKHBhY2tldC50KSB7XG4gICAgICBjYXNlICdSRVNVTUVEJzpcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuQ29ubmVjdGVkXG4gICAgICAgIHRoaXMuZXZlbnRzLnJlc3VtZWQ/Lih0aGlzKVxuXG4gICAgICAgIC8vIENvbnRpbnVlIHRoZSByZXF1ZXN0cyB3aGljaCBoYXZlIGJlZW4gcXVldWVkIHNpbmNlIHRoZSBzaGFyZCB3ZW50IG9mZmxpbmUuXG4gICAgICAgIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5mb3JFYWNoKChyZXNvbHZlKSA9PiByZXNvbHZlKCkpXG4gICAgICAgIC8vIFNldHRpbmcgdGhlIGxlbmd0aCB0byAwIHdpbGwgZGVsZXRlIHRoZSBlbGVtZW50cyBpbiBpdFxuICAgICAgICB0aGlzLm9mZmxpbmVTZW5kUXVldWUubGVuZ3RoID0gMFxuXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZ2V0KCdSRVNVTUVEJyk/LihwYWNrZXQpXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdSRVNVTUVEJylcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ1JFQURZJzoge1xuICAgICAgICAvLyBJbXBvcnRhbnQgZm9yIGZ1dHVyZSByZXN1bWVzLlxuICAgICAgICBjb25zdCBwYXlsb2FkID0gcGFja2V0LmQgYXMgRGlzY29yZFJlYWR5XG5cbiAgICAgICAgdGhpcy5yZXN1bWVHYXRld2F5VXJsID0gcGF5bG9hZC5yZXN1bWVfZ2F0ZXdheV91cmxcblxuICAgICAgICB0aGlzLnNlc3Npb25JZCA9IHBheWxvYWQuc2Vzc2lvbl9pZFxuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5Db25uZWN0ZWRcblxuICAgICAgICAvLyBDb250aW51ZSB0aGUgcmVxdWVzdHMgd2hpY2ggaGF2ZSBiZWVuIHF1ZXVlZCBzaW5jZSB0aGUgc2hhcmQgd2VudCBvZmZsaW5lLlxuICAgICAgICAvLyBJbXBvcnRhbnQgd2hlbiB0aGlzIGlzIGEgcmUtaWRlbnRpZnlcbiAgICAgICAgdGhpcy5vZmZsaW5lU2VuZFF1ZXVlLmZvckVhY2goKHJlc29sdmUpID0+IHJlc29sdmUoKSlcbiAgICAgICAgLy8gU2V0dGluZyB0aGUgbGVuZ3RoIHRvIDAgd2lsbCBkZWxldGUgdGhlIGVsZW1lbnRzIGluIGl0XG4gICAgICAgIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5sZW5ndGggPSAwXG5cbiAgICAgICAgdGhpcy5yZXNvbHZlcy5nZXQoJ1JFQURZJyk/LihwYWNrZXQpXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdSRUFEWScpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBzZXF1ZW5jZSBudW1iZXIgaWYgaXQgaXMgcHJlc2VudFxuICAgIC8vIGBzYCBjYW4gYmUgZWl0aGVyIGBudWxsYCBvciBhIGBudW1iZXJgLlxuICAgIC8vIEluIG9yZGVyIHRvIHByZXZlbnQgdXBkYXRlIG1pc3NlcyB3aGVuIGBzYCBpcyBgMGAgd2UgY2hlY2sgYWdhaW5zdCBudWxsLlxuICAgIGlmIChwYWNrZXQucyAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyID0gcGFja2V0LnNcbiAgICB9XG5cbiAgICB0aGlzLmZvcndhcmRUb0JvdChwYWNrZXQpXG4gIH1cblxuICBmb3J3YXJkVG9Cb3QocGFja2V0OiBEaXNjb3JkR2F0ZXdheVBheWxvYWQpOiB2b2lkIHtcbiAgICAvLyBUaGUgbmVjZXNzYXJ5IGhhbmRsaW5nIHJlcXVpcmVkIGZvciB0aGUgU2hhcmRzIGNvbm5lY3Rpb24gaGFzIGJlZW4gZmluaXNoZWQuXG4gICAgLy8gTm93IHRoZSBldmVudCBjYW4gYmUgc2FmZWx5IGZvcndhcmRlZC5cbiAgICB0aGlzLmV2ZW50cy5tZXNzYWdlPy4odGhpcywgY2FtZWxpemUocGFja2V0KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBpbiBvcmRlciB0byBtYWtlIHRoZSBzaGFyZHMgcHJlc2VuY2UuXG4gICAqIGFzeW5jIGluIGNhc2UgZGV2cyBjcmVhdGUgdGhlIHByZXNlbmNlIGJhc2VkIG9uIGVnLiBkYXRhYmFzZSB2YWx1ZXMuXG4gICAqIFBhc3NpbmcgdGhlIHNoYXJkJ3MgaWQgdGhlcmUgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIHRoZSBkZXYgdG8gdXNlIHRoaXMgZnVuY3Rpb24uXG4gICAqL1xuICBhc3luYyBtYWtlUHJlc2VuY2UoKTogUHJvbWlzZTxCb3RTdGF0dXNVcGRhdGUgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8qKiBUaGlzIGZ1bmN0aW9uIGNvbW11bmljYXRlcyB3aXRoIHRoZSBtYW5hZ2VtZW50IHByb2Nlc3MsIGluIG9yZGVyIHRvIGtub3cgd2hldGhlciBpdHMgZnJlZSB0byBpZGVudGlmeS4gV2hlbiB0aGlzIGZ1bmN0aW9uIHJlc29sdmVzLCB0aGlzIG1lYW5zIHRoYXQgdGhlIHNoYXJkIGlzIGFsbG93ZWQgdG8gc2VuZCBhbiBpZGVudGlmeSBwYXlsb2FkIHRvIGRpc2NvcmQuICovXG4gIGFzeW5jIHJlcXVlc3RJZGVudGlmeSgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIFRoaXMgZnVuY3Rpb24gY29tbXVuaWNhdGVzIHdpdGggdGhlIG1hbmFnZW1lbnQgcHJvY2VzcywgaW4gb3JkZXIgdG8gdGVsbCBpdCBjYW4gaWRlbnRpZnkgdGhlIG5leHQgc2hhcmQuICovXG4gIGFzeW5jIHNoYXJkSXNSZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIFN0YXJ0IHNlbmRpbmcgaGVhcnRiZWF0IHBheWxvYWRzIHRvIERpc2NvcmQgaW4gdGhlIHByb3ZpZGVkIGludGVydmFsLiAqL1xuICBzdGFydEhlYXJ0YmVhdGluZyhpbnRlcnZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gU3RhcnQgaGVhcnRiZWF0aW5nIG9uIHNoYXJkICMke3RoaXMuaWR9YClcblxuICAgIC8vIElmIG9sZCBoZWFydGJlYXN0IGV4aXN0IGxpa2UgYWZ0ZXIgcmVzdW1lLCBjbGVhciB0aGUgb2xkIG9uZXMuXG4gICAgaWYgKHRoaXMuaGVhcnQuaW50ZXJ2YWxJZCkgY2xlYXJJbnRlcnZhbCh0aGlzLmhlYXJ0LmludGVydmFsSWQpXG4gICAgaWYgKHRoaXMuaGVhcnQudGltZW91dElkKSBjbGVhclRpbWVvdXQodGhpcy5oZWFydC50aW1lb3V0SWQpXG5cbiAgICB0aGlzLmhlYXJ0LmludGVydmFsID0gaW50ZXJ2YWxcblxuICAgIC8vIE9ubHkgc2V0IHRoZSBzaGFyZCdzIHN0YXRlIHRvIGBVbmlkZW50aWZpZWRgXG4gICAgLy8gaWYgaGVhcnRiZWF0aW5nIGhhcyBub3QgYmVlbiBzdGFydGVkIGR1ZSB0byBhbiBpZGVudGlmeSBvciByZXN1bWUgYWN0aW9uLlxuICAgIGlmIChbU2hhcmRTdGF0ZS5EaXNjb25uZWN0ZWQsIFNoYXJkU3RhdGUuT2ZmbGluZV0uaW5jbHVkZXModGhpcy5zdGF0ZSkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkIGlzIGRpc2Nvbm5lY3RlZCBvciBvZmZsaW5lIGJ1dCB0aGUgaGVhcnRiZWF0IHdhcyBzdGFydGVkICMke3RoaXMuaWR9YClcbiAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLlVuaWRlbnRpZmllZFxuICAgIH1cblxuICAgIC8vIFRoZSBmaXJzdCBoZWFydGJlYXQgbmVlZHMgdG8gYmUgc2VuZCB3aXRoIGEgcmFuZG9tIGRlbGF5IGJldHdlZW4gYDBgIGFuZCBgaW50ZXJ2YWxgXG4gICAgLy8gVXNpbmcgYSBgc2V0VGltZW91dChfLCBqaXR0ZXIpYCBoZXJlIHRvIGFjY29tcGxpc2ggdGhhdC5cbiAgICAvLyBgTWF0aC5yYW5kb20oKWAgY2FuIGJlIGAwYCBzbyB3ZSB1c2UgYDAuNWAgaWYgdGhpcyBoYXBwZW5zXG4gICAgLy8gUmVmZXJlbmNlOiBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheSNoZWFydGJlYXRpbmdcbiAgICBjb25zdCBqaXR0ZXIgPSBNYXRoLmNlaWwodGhpcy5oZWFydC5pbnRlcnZhbCAqIChNYXRoLnJhbmRvbSgpIHx8IDAuNSkpXG5cbiAgICB0aGlzLmhlYXJ0LnRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gQmVnaW5uaW5nIGhlYXJ0YmVhdGluZyBwcm9jZXNzIGZvciBzaGFyZCAjJHt0aGlzLmlkfWApXG5cbiAgICAgIGlmICghdGhpcy5pc09wZW4oKSkgcmV0dXJuXG5cbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIEhlYXJ0YmVhdGluZyBvbiAjJHt0aGlzLmlkfS4gUHJldmlvdXMgc2VxdWVuY2UgbnVtYmVyOiAke3RoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlcn1gKVxuXG4gICAgICAvLyBVc2luZyBhIGRpcmVjdCBzb2NrZXQuc2VuZCBjYWxsIGhlcmUgYmVjYXVzZSBoZWFydGJlYXQgcmVxdWVzdHMgYXJlIHJlc2VydmVkIGJ5IHVzLlxuICAgICAgdGhpcy5zb2NrZXQ/LnNlbmQoXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0LFxuICAgICAgICAgIGQ6IHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlcixcbiAgICAgICAgfSksXG4gICAgICApXG5cbiAgICAgIHRoaXMuaGVhcnQubGFzdEJlYXQgPSBEYXRlLm5vdygpXG4gICAgICB0aGlzLmhlYXJ0LmFja25vd2xlZGdlZCA9IGZhbHNlXG5cbiAgICAgIC8vIEFmdGVyIHRoZSByYW5kb20gaGVhcnRiZWF0IGppdHRlciB3ZSBjYW4gc3RhcnQgYSBub3JtYWwgaW50ZXJ2YWwuXG4gICAgICB0aGlzLmhlYXJ0LmludGVydmFsSWQgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5pc09wZW4oKSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkICMke3RoaXMuaWR9IGlzIG5vdCBvcGVuLCBidXQgYXR0ZW1wdGVkIGhlYXJ0YmVhdCwgaWdub3JpbmcuYClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBTaGFyZCBkaWQgbm90IHJlY2VpdmUgYSBoZWFydGJlYXQgQUNLIGZyb20gRGlzY29yZCBpbiB0aW1lLFxuICAgICAgICAvLyB0aGVyZWZvcmUgd2UgaGF2ZSB0byBhc3N1bWUgdGhhdCB0aGUgY29ubmVjdGlvbiBoYXMgZmFpbGVkIG9yIGdvdCBcInpvbWJpZWRcIi5cbiAgICAgICAgLy8gVGhlIFNoYXJkIG5lZWRzIHRvIHN0YXJ0IGEgcmUtaWRlbnRpZnkgYWN0aW9uIGFjY29yZGluZ2x5LlxuICAgICAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I2hlYXJ0YmVhdGluZy1leGFtcGxlLWdhdGV3YXktaGVhcnRiZWF0LWFja1xuICAgICAgICBpZiAoIXRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gSGVhcnRiZWF0IG5vdCBhY2tub3dsZWRnZWQgZm9yIHNoYXJkICMke3RoaXMuaWR9LiBBc3N1bWluZyB6b21iaWVkIGNvbm5lY3Rpb24uYClcbiAgICAgICAgICB0aGlzLmNsb3NlKFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5ab21iaWVkQ29ubmVjdGlvbiwgJ1pvbWJpZWQgY29ubmVjdGlvbiwgZGlkIG5vdCByZWNlaXZlIGFuIGhlYXJ0YmVhdCBBQ0sgaW4gdGltZS4nKVxuXG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaWRlbnRpZnkoKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gSGVhcnRiZWF0aW5nIG9uICMke3RoaXMuaWR9LiBQcmV2aW91cyBzZXF1ZW5jZSBudW1iZXI6ICR7dGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyfWApXG5cbiAgICAgICAgLy8gVXNpbmcgYSBkaXJlY3Qgc29ja2V0LnNlbmQgY2FsbCBoZXJlIGJlY2F1c2UgaGVhcnRiZWF0IHJlcXVlc3RzIGFyZSByZXNlcnZlZCBieSB1cy5cbiAgICAgICAgdGhpcy5zb2NrZXQ/LnNlbmQoXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdCxcbiAgICAgICAgICAgIGQ6IHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlcixcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuXG4gICAgICAgIHRoaXMuaGVhcnQubGFzdEJlYXQgPSBEYXRlLm5vdygpXG4gICAgICAgIHRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkID0gZmFsc2VcblxuICAgICAgICB0aGlzLmV2ZW50cy5oZWFydGJlYXQ/Lih0aGlzKVxuICAgICAgfSwgdGhpcy5oZWFydC5pbnRlcnZhbClcbiAgICB9LCBqaXR0ZXIpXG4gIH1cblxuICAvKiogU3RvcCB0aGUgaGVhcnRiZWF0aW5nIHByb2Nlc3Mgd2l0aCBkaXNjb3JkLiAqL1xuICBzdG9wSGVhcnRiZWF0aW5nKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIHRoZSByZWd1bGFyIGhlYXJ0YmVhdCBpbnRlcnZhbC5cbiAgICBjbGVhckludGVydmFsKHRoaXMuaGVhcnQuaW50ZXJ2YWxJZClcbiAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIFNoYXJkIGdvdCBjbG9zZWQgYmVmb3JlIHRoZSBmaXJzdCBqaXR0ZXJlZCBoZWFydGJlYXQuXG4gICAgLy8gVG8gZ28gc2FmZSB3ZSBzaG91bGQgY2xlYXIgdGhlIHJlbGF0ZWQgdGltZW91dCB0b28uXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuaGVhcnQudGltZW91dElkKVxuICB9XG59XG5cbi8qKiBDaGVjayBpZiB0aGUgYnVmZmVyIGVuZHMgd2l0aCB0aGUgbWFya2VyICovXG5mdW5jdGlvbiBlbmRzV2l0aE1hcmtlcihidWZmZXI6IFVpbnQ4QXJyYXksIG1hcmtlcjogVWludDhBcnJheSkge1xuICBpZiAoYnVmZmVyLmxlbmd0aCA8IG1hcmtlci5sZW5ndGgpIHJldHVybiBmYWxzZVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWFya2VyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gbWFya2VyLmxlbmd0aCArIGldICE9PSBtYXJrZXJbaV0pIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaGFyZENyZWF0ZU9wdGlvbnMge1xuICAvKiogVGhlIHNoYXJkIGlkICovXG4gIGlkOiBudW1iZXJcbiAgLyoqIFRoZSBjb25uZWN0aW9uIGRldGFpbHMgKi9cbiAgY29ubmVjdGlvbjogU2hhcmRHYXRld2F5Q29uZmlnXG4gIC8qKiBUaGUgZXZlbnQgaGFuZGxlcnMgZm9yIGV2ZW50cyBvbiB0aGUgc2hhcmQuICovXG4gIGV2ZW50czogU2hhcmRFdmVudHNcbiAgLyoqIFRoZSBsb2dnZXIgZm9yIHRoZSBzaGFyZCAqL1xuICBsb2dnZXI/OiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz5cbiAgLyoqIFRoZSBoYW5kbGVyIHRvIHJlcXVlc3QgYSBzcGFjZSB0byBtYWtlIGFuIGlkZW50aWZ5IHJlcXVlc3QuICovXG4gIHJlcXVlc3RJZGVudGlmeT86ICgpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIFRoZSBoYW5kbGVyIHRvIGFsZXJ0IHRoZSBnYXRld2F5IG1hbmFnZXIgdGhhdCB0aGlzIHNoYXJkIGhhcyByZWNlaXZlZCBhIFJFQURZIGV2ZW50LiAqL1xuICBzaGFyZElzUmVhZHk/OiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBGdW5jdGlvbiB0byBjcmVhdGUgdGhlIGJvdCBzdGF0dXMgdG8gc2VuZCBvbiBJZGVudGlmeSByZXF1ZXN0cyAqL1xuICBtYWtlUHJlc2VuY2U/OiAoKSA9PiBQcm9taXNlPEJvdFN0YXR1c1VwZGF0ZSB8IHVuZGVmaW5lZD5cbn1cblxuZXhwb3J0IGRlZmF1bHQgRGlzY29yZGVub1NoYXJkXG4iXSwibmFtZXMiOlsiRGlzY29yZGVub1NoYXJkIiwiWkxJQl9TWU5DX0ZMVVNIIiwiVWludDhBcnJheSIsImZ6c3RkIiwiZ2V0RlpTdGQiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJtYXhSZXF1ZXN0c1BlclJhdGVMaW1pdFRpY2siLCJwcmV2aW91c1NlcXVlbmNlTnVtYmVyIiwicmF0ZUxpbWl0UmVzZXRJbnRlcnZhbCIsInN0YXRlIiwiU2hhcmRTdGF0ZSIsIk9mZmxpbmUiLCJyZXN1bWVHYXRld2F5VXJsIiwiZXZlbnRzIiwib2ZmbGluZVNlbmRRdWV1ZSIsInJlc29sdmVzIiwiTWFwIiwidGV4dERlY29kZXIiLCJUZXh0RGVjb2RlciIsImluZmxhdGVCdWZmZXIiLCJkZWNvbXByZXNzaW9uUHJvbWlzZXNRdWV1ZSIsImlkIiwiY29ubmVjdGlvbiIsImxvZ2dlciIsImhlYXJ0IiwiYWNrbm93bGVkZ2VkIiwiaW50ZXJ2YWwiLCJyZXF1ZXN0SWRlbnRpZnkiLCJzaGFyZElzUmVhZHkiLCJtYWtlUHJlc2VuY2UiLCJidWNrZXQiLCJMZWFreUJ1Y2tldCIsIm1heCIsImNhbGN1bGF0ZVNhZmVSZXF1ZXN0cyIsInJlZmlsbEFtb3VudCIsInJlZmlsbEludGVydmFsIiwiZ2F0ZXdheUNvbmZpZyIsImNvbm5lY3Rpb25VcmwiLCJ1cmwiLCJzYWZlUmVxdWVzdHMiLCJNYXRoIiwiY2VpbCIsImNoZWNrT2ZmbGluZSIsImhpZ2hQcmlvcml0eSIsImlzT3BlbiIsIlByb21pc2UiLCJyZXNvbHZlIiwidW5zaGlmdCIsInB1c2giLCJjbG9zZSIsImNvZGUiLCJyZWFzb24iLCJzb2NrZXQiLCJyZWFkeVN0YXRlIiwiTm9kZVdlYlNvY2tldCIsIk9QRU4iLCJjb25uZWN0IiwiSWRlbnRpZnlpbmciLCJSZXN1bWluZyIsImluY2x1ZGVzIiwiQ29ubmVjdGluZyIsImNvbm5lY3RpbmciLCJVUkwiLCJzZWFyY2hQYXJhbXMiLCJzZXQiLCJ2ZXJzaW9uIiwidG9TdHJpbmciLCJ0cmFuc3BvcnRDb21wcmVzc2lvbiIsIlRyYW5zcG9ydENvbXByZXNzaW9uIiwiemxpYiIsImluZmxhdGUiLCJjcmVhdGVJbmZsYXRlIiwiZmluaXNoRmx1c2giLCJ6bGliQ29uc3RhbnRzIiwiWl9TWU5DX0ZMVVNIIiwiY2h1bmtTaXplIiwib24iLCJlIiwiZXJyb3IiLCJkYXRhIiwibmV3QnVmZmVyIiwiYnl0ZUxlbmd0aCIsInpzdGQiLCJjYXRjaCIsIndhcm4iLCJkZWxldGUiLCJ6c3RkRGVjb21wcmVzcyIsIkRlY29tcHJlc3MiLCJkZWNvZGVkRGF0YSIsImRlY29kZSIsInBhcnNlZERhdGEiLCJKU09OIiwicGFyc2UiLCJzaGlmdCIsImNvbXByZXNzIiwic2hvdWxkVXNlQnVpbHRpbiIsIlJlZmxlY3QiLCJoYXMiLCJnbG9iYWxUaGlzIiwiV2ViU29ja2V0IiwiYmluYXJ5VHlwZSIsIm9uZXJyb3IiLCJldmVudCIsImhhbmRsZUVycm9yIiwib25jbG9zZSIsImNsb3NlRXZlbnQiLCJoYW5kbGVDbG9zZSIsIm9ubWVzc2FnZSIsIm1lc3NhZ2VFdmVudCIsImhhbmRsZU1lc3NhZ2UiLCJvbm9wZW4iLCJVbmlkZW50aWZpZWQiLCJjb25uZWN0ZWQiLCJpZGVudGlmeSIsImRlYnVnIiwiU2hhcmRTb2NrZXRDbG9zZUNvZGVzIiwiUmVJZGVudGlmeWluZyIsImlkZW50aWZ5aW5nIiwic2VuZCIsIm9wIiwiR2F0ZXdheU9wY29kZXMiLCJJZGVudGlmeSIsImQiLCJ0b2tlbiIsInByb3BlcnRpZXMiLCJpbnRlbnRzIiwic2hhcmQiLCJ0b3RhbFNoYXJkcyIsInByZXNlbmNlIiwiaWRlbnRpZmllZCIsInJlc3VtZSIsIlJlc3VtZUNsb3NpbmdPbGRDb25uZWN0aW9uIiwic2Vzc2lvbklkIiwiUmVzdW1lIiwic2Vzc2lvbl9pZCIsInNlcSIsIm1lc3NhZ2UiLCJhY3F1aXJlIiwic3RyaW5naWZ5Iiwic2h1dGRvd24iLCJTaHV0ZG93biIsInN0b3BIZWFydGJlYXRpbmciLCJ1bmRlZmluZWQiLCJUZXN0aW5nRmluaXNoZWQiLCJkaXNjb25uZWN0ZWQiLCJSZXNoYXJkZWQiLCJab21iaWVkQ29ubmVjdGlvbiIsIkRpc2Nvbm5lY3RlZCIsIkdhdGV3YXlDbG9zZUV2ZW50Q29kZXMiLCJVbmtub3duT3Bjb2RlIiwiTm90QXV0aGVudGljYXRlZCIsIkludmFsaWRTZXEiLCJSYXRlTGltaXRlZCIsIlNlc3Npb25UaW1lZE91dCIsIkF1dGhlbnRpY2F0aW9uRmFpbGVkIiwiSW52YWxpZFNoYXJkIiwiU2hhcmRpbmdSZXF1aXJlZCIsIkludmFsaWRBcGlWZXJzaW9uIiwiSW52YWxpZEludGVudHMiLCJEaXNhbGxvd2VkSW50ZW50cyIsIkVycm9yIiwiVW5rbm93bkVycm9yIiwiRGVjb2RlRXJyb3IiLCJBbHJlYWR5QXV0aGVudGljYXRlZCIsImluZm8iLCJpc0NvbXByZXNzZWQiLCJBcnJheUJ1ZmZlciIsIkJ1ZmZlciIsImRlY29tcHJlc3NQYWNrZXQiLCJoYW5kbGVEaXNjb3JkUGFja2V0IiwiY29tcHJlc3NlZERhdGEiLCJmYXRhbCIsIndyaXRlUHJvbWlzZSIsInJlamVjdCIsIndyaXRlIiwiZW5kc1dpdGhNYXJrZXIiLCJkZWNvbXByZXNzaW9uUHJvbWlzZSIsInIiLCJkZWNvbXByZXNzZWQiLCJpbmZsYXRlU3luYyIsInBhY2tldCIsImxhc3RBY2siLCJEYXRlIiwibm93IiwiSGVhcnRiZWF0IiwibGFzdEJlYXQiLCJoZWFydGJlYXQiLCJIZWxsbyIsImhlYXJ0YmVhdF9pbnRlcnZhbCIsInN0YXJ0SGVhcnRiZWF0aW5nIiwiY3VycmVudFF1ZXVlIiwicXVldWUiLCJoZWxsbyIsIkhlYXJ0YmVhdEFDSyIsInJ0dCIsImhlYXJ0YmVhdEFjayIsIlJlY29ubmVjdCIsInJlcXVlc3RlZFJlY29ubmVjdCIsIkludmFsaWRTZXNzaW9uIiwicmVzdW1hYmxlIiwiaW52YWxpZFNlc3Npb24iLCJkZWxheSIsImZsb29yIiwicmFuZG9tIiwiZ2V0IiwidCIsIkNvbm5lY3RlZCIsInJlc3VtZWQiLCJmb3JFYWNoIiwibGVuZ3RoIiwicGF5bG9hZCIsInJlc3VtZV9nYXRld2F5X3VybCIsInMiLCJmb3J3YXJkVG9Cb3QiLCJjYW1lbGl6ZSIsImludGVydmFsSWQiLCJjbGVhckludGVydmFsIiwidGltZW91dElkIiwiY2xlYXJUaW1lb3V0Iiwiaml0dGVyIiwic2V0VGltZW91dCIsInNldEludGVydmFsIiwiYnVmZmVyIiwibWFya2VyIiwiaSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7SUEyQmFBLGVBQWU7ZUFBZkE7O0lBNHVCYixPQUE4QjtlQUE5Qjs7OzRCQXZ3QnVCOzBCQUN5RDt1QkFFekI7dUJBQ0Y7MkRBRTNCO3dCQVVuQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFUCxNQUFNQyxrQkFBa0IsSUFBSUMsV0FBVztJQUFDO0lBQUs7SUFBSztJQUFNO0NBQUs7QUFFN0QsSUFBSUM7QUFFSix1RUFBdUUsR0FDdkUsZUFBZUM7SUFDYixPQUFRRCxVQUFVLE1BQU0sbUVBQUEsUUFBTztBQUNqQztBQUVPLElBQUEsQUFBTUgsa0JBQU4sTUFBTUE7SUEwQ1hLLFlBQVlDLE9BQTJCLENBQUU7UUFuQ3pDLDBIQUEwSCxRQUMxSEMsOEJBQXNDO1FBQ3RDLDBDQUEwQyxRQUMxQ0MseUJBQXdDO1FBQ3hDLDRFQUE0RSxRQUM1RUMseUJBQWlDO1FBS2pDLHdDQUF3QyxRQUN4Q0MsUUFBUUMsa0JBQVUsQ0FBQ0MsT0FBTztRQUMxQixpRkFBaUYsUUFDakZDLG1CQUEyQjtRQUMzQixzQ0FBc0MsUUFDdENDLFNBQXNCLENBQUM7UUFDdkIsbUdBQW1HLFFBQ25HQyxtQkFBbUMsRUFBRTtRQUNyQyxpRkFBaUYsUUFDakZDLFdBQVcsSUFBSUM7UUFLZiw4Q0FBOEMsUUFDOUNDLGNBQWMsSUFBSUM7UUFHbEIsd0JBQXdCLFFBQ3hCQyxnQkFBbUM7UUFHbkMsc0RBQXNELFFBQ3REQyw2QkFBd0UsRUFBRTtRQUd4RSxJQUFJLENBQUNDLEVBQUUsR0FBR2hCLFFBQVFnQixFQUFFO1FBQ3BCLElBQUksQ0FBQ0MsVUFB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