@discordeno/gateway 19.0.0-next.97be09d → 19.0.0-next.985801c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -13
- package/dist/cjs/Shard.cjs +66 -67
- package/dist/cjs/manager.cjs +209 -34
- package/dist/cjs/types.cjs +1 -1
- package/dist/esm/Shard.js +66 -67
- package/dist/esm/manager.js +209 -34
- package/dist/esm/types.js +1 -1
- package/dist/types/Shard.d.ts +13 -9
- package/dist/types/Shard.d.ts.map +1 -1
- package/dist/types/manager.d.ts +74 -8
- package/dist/types/manager.d.ts.map +1 -1
- package/dist/types/types.d.ts +1 -2
- package/dist/types/types.d.ts.map +1 -1
- package/package.json +23 -24
package/README.md
CHANGED
|
@@ -1,8 +1,17 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Discordeno WS
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
<img align="right" src="https://raw.githubusercontent.com/discordeno/discordeno/main/website/static/img/logo.png" height="150px" />
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Discord API library for [Node.JS](https://nodejs.org), [Deno](https://deno.land) & [Bun](https://bun.sh/)
|
|
6
|
+
|
|
7
|
+
[](https://discord.com/invite/5vBgXk3UcZ)
|
|
8
|
+
[](https://codecov.io/gh/discordeno/discordeno)
|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
> [!WARNING]
|
|
12
|
+
> Using a Standalone / Proxy WS is mean for advanced developers only
|
|
13
|
+
|
|
14
|
+
Standalone WebSocket to connect to the Discord API.
|
|
6
15
|
|
|
7
16
|
- **Zero Downtime Updates**:
|
|
8
17
|
|
|
@@ -48,14 +57,8 @@ This WS service is meant for ADVANCED DEVELOPERS ONLY!
|
|
|
48
57
|
- Take full advantage of all your CPU cores by using workers to spread the load. Control how many shards per worker
|
|
49
58
|
and how many workers to maximize efficiency!
|
|
50
59
|
|
|
51
|
-
##
|
|
52
|
-
|
|
53
|
-
```ts
|
|
54
|
-
createGatewayManager({
|
|
55
|
-
// TODO: (docs) Fill this out
|
|
56
|
-
})
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
## API/Docs
|
|
60
|
+
## Links
|
|
60
61
|
|
|
61
|
-
|
|
62
|
+
- [Website](https://discordeno.js.org/)
|
|
63
|
+
- [Documentation](https://doc.deno.land/https/deno.land/x/discordeno/mod.ts)
|
|
64
|
+
- [Discord](https://discord.com/invite/5vBgXk3UcZ)
|
package/dist/cjs/Shard.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
@@ -16,9 +16,9 @@ _export(exports, {
|
|
|
16
16
|
return _default;
|
|
17
17
|
}
|
|
18
18
|
});
|
|
19
|
+
const _nodezlib = require("node:zlib");
|
|
19
20
|
const _types = require("@discordeno/types");
|
|
20
21
|
const _utils = require("@discordeno/utils");
|
|
21
|
-
const _nodezlib = require("node:zlib");
|
|
22
22
|
const _ws = /*#__PURE__*/ _interop_require_default(require("ws"));
|
|
23
23
|
const _types1 = require("./types.cjs");
|
|
24
24
|
function _interop_require_default(obj) {
|
|
@@ -39,6 +39,7 @@ let DiscordenoShard = class DiscordenoShard {
|
|
|
39
39
|
this.id = options.id;
|
|
40
40
|
this.connection = options.connection;
|
|
41
41
|
this.events = options.events;
|
|
42
|
+
this.logger = options.logger ?? _utils.logger;
|
|
42
43
|
this.heart = {
|
|
43
44
|
acknowledged: false,
|
|
44
45
|
interval: 45000
|
|
@@ -48,7 +49,8 @@ let DiscordenoShard = class DiscordenoShard {
|
|
|
48
49
|
this.bucket = new _utils.LeakyBucket({
|
|
49
50
|
max: this.calculateSafeRequests(),
|
|
50
51
|
refillAmount: this.calculateSafeRequests(),
|
|
51
|
-
refillInterval: 60000
|
|
52
|
+
refillInterval: 60000,
|
|
53
|
+
logger: this.logger
|
|
52
54
|
});
|
|
53
55
|
}
|
|
54
56
|
/** The gateway configuration which is used to connect to Discord. */ get gatewayConfig() {
|
|
@@ -64,13 +66,12 @@ let DiscordenoShard = class DiscordenoShard {
|
|
|
64
66
|
return safeRequests < 0 ? 0 : safeRequests;
|
|
65
67
|
}
|
|
66
68
|
async checkOffline(highPriority) {
|
|
67
|
-
if (
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
}
|
|
69
|
+
if (this.isOpen()) return;
|
|
70
|
+
return await new Promise((resolve)=>{
|
|
71
|
+
// Higher priority requests get added at the beginning of the array.
|
|
72
|
+
if (highPriority) this.offlineSendQueue.unshift(resolve);
|
|
73
|
+
else this.offlineSendQueue.push(resolve);
|
|
74
|
+
});
|
|
74
75
|
}
|
|
75
76
|
/** Close the socket connection to discord if present. */ close(code, reason) {
|
|
76
77
|
if (this.socket?.readyState !== _ws.default.OPEN) return;
|
|
@@ -89,20 +90,17 @@ let DiscordenoShard = class DiscordenoShard {
|
|
|
89
90
|
const url = new URL(this.connectionUrl);
|
|
90
91
|
url.searchParams.set('v', this.gatewayConfig.version.toString());
|
|
91
92
|
url.searchParams.set('encoding', 'json');
|
|
92
|
-
|
|
93
|
-
|
|
93
|
+
// 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
|
|
94
|
+
const shouldUseBuiltin = Reflect.has(globalThis, 'WebSocket') && (Reflect.has(globalThis, 'Bun') || Reflect.has(globalThis, 'Deno'));
|
|
95
|
+
// @ts-expect-error NodeWebSocket doesn't support "dispatchEvent", and while we don't use it, it is required on the "WebSocket" type
|
|
96
|
+
const socket = shouldUseBuiltin ? new WebSocket(url) : new _ws.default(url);
|
|
94
97
|
this.socket = socket;
|
|
95
|
-
|
|
96
|
-
socket.
|
|
97
|
-
|
|
98
|
-
shardId: this.id
|
|
99
|
-
});
|
|
100
|
-
socket.onclose = async (event)=>await this.handleClose(event);
|
|
101
|
-
socket.onmessage = async (message)=>await this.handleMessage(message);
|
|
98
|
+
socket.onerror = (event)=>this.handleError(event);
|
|
99
|
+
socket.onclose = async (closeEvent)=>await this.handleClose(closeEvent);
|
|
100
|
+
socket.onmessage = async (messageEvent)=>await this.handleMessage(messageEvent);
|
|
102
101
|
return await new Promise((resolve)=>{
|
|
103
102
|
socket.onopen = ()=>{
|
|
104
|
-
// Only set the shard to `Unidentified` state
|
|
105
|
-
// if the connection request does not come from an identify or resume action.
|
|
103
|
+
// Only set the shard to `Unidentified` state if the connection request does not come from an identify or resume action.
|
|
106
104
|
if (![
|
|
107
105
|
_types1.ShardState.Identifying,
|
|
108
106
|
_types1.ShardState.Resuming
|
|
@@ -118,7 +116,7 @@ let DiscordenoShard = class DiscordenoShard {
|
|
|
118
116
|
// A new identify has been requested even though there is already a connection open.
|
|
119
117
|
// Therefore we need to close the old connection and heartbeating before creating a new one.
|
|
120
118
|
if (this.isOpen()) {
|
|
121
|
-
|
|
119
|
+
this.logger.debug(`CLOSING EXISTING SHARD: #${this.id}`);
|
|
122
120
|
this.close(_types1.ShardSocketCloseCodes.ReIdentifying, 'Re-identifying closure of old connection.');
|
|
123
121
|
}
|
|
124
122
|
this.state = _types1.ShardState.Identifying;
|
|
@@ -163,24 +161,23 @@ let DiscordenoShard = class DiscordenoShard {
|
|
|
163
161
|
return this.socket?.readyState === _ws.default.OPEN;
|
|
164
162
|
}
|
|
165
163
|
/** Attempt to resume the previous shards session with the gateway. */ async resume() {
|
|
166
|
-
|
|
164
|
+
this.logger.debug(`[Gateway] Resuming Shard #${this.id}`);
|
|
167
165
|
// It has been requested to resume the Shards session.
|
|
168
166
|
// It's possible that the shard is still connected with Discord's gateway therefore we need to forcefully close it.
|
|
169
167
|
if (this.isOpen()) {
|
|
170
|
-
|
|
168
|
+
this.logger.debug(`[Gateway] Resuming Shard #${this.id} in isOpen`);
|
|
171
169
|
this.close(_types1.ShardSocketCloseCodes.ResumeClosingOldConnection, 'Reconnecting the shard, closing old connection.');
|
|
172
170
|
}
|
|
173
171
|
// Shard has never identified, so we cannot resume.
|
|
174
172
|
if (!this.sessionId) {
|
|
175
|
-
|
|
173
|
+
this.logger.debug(`[Shard] Trying to resume a shard #${this.id} that was NOT first identified. (No session id found)`);
|
|
176
174
|
return await this.identify();
|
|
177
175
|
}
|
|
178
176
|
this.state = _types1.ShardState.Resuming;
|
|
179
|
-
|
|
177
|
+
this.logger.debug(`[Gateway] Resuming Shard #${this.id}, before connecting`);
|
|
180
178
|
// Before we can resume, we need to create a new connection with Discord's gateway.
|
|
181
179
|
await this.connect();
|
|
182
|
-
|
|
183
|
-
`[Gateway] Resuming Shard #${this.id}, after connecting. ${this.gatewayConfig.token} | ${this.sessionId} | ${this.previousSequenceNumber}`);
|
|
180
|
+
this.logger.debug(`[Gateway] Resuming Shard #${this.id}, after connecting. ${this.sessionId} | ${this.previousSequenceNumber}`);
|
|
184
181
|
this.send({
|
|
185
182
|
op: _types.GatewayOpcodes.Resume,
|
|
186
183
|
d: {
|
|
@@ -189,7 +186,7 @@ let DiscordenoShard = class DiscordenoShard {
|
|
|
189
186
|
seq: this.previousSequenceNumber ?? 0
|
|
190
187
|
}
|
|
191
188
|
}, true);
|
|
192
|
-
|
|
189
|
+
this.logger.debug(`[Shard] Resuming Shard #${this.id} after send resume`);
|
|
193
190
|
return await new Promise((resolve)=>{
|
|
194
191
|
this.resolves.set('RESUMED', ()=>resolve());
|
|
195
192
|
// If it is attempted to resume with an invalid session id,
|
|
@@ -216,9 +213,12 @@ let DiscordenoShard = class DiscordenoShard {
|
|
|
216
213
|
this.close(_types1.ShardSocketCloseCodes.Shutdown, 'Shard shutting down.');
|
|
217
214
|
this.state = _types1.ShardState.Offline;
|
|
218
215
|
}
|
|
216
|
+
/** Handle a gateway connection error */ handleError(error) {
|
|
217
|
+
this.logger.error(`[Shard] There was an error connecting shard ${this.id}.`, error);
|
|
218
|
+
}
|
|
219
219
|
/** Handle a gateway connection close. */ async handleClose(close) {
|
|
220
|
-
// gateway.debug("GW CLOSED", { shardId, payload: event });
|
|
221
220
|
this.stopHeartbeating();
|
|
221
|
+
this.logger.debug(`[Shard] Gateway connection closed with code ${close.code} (${close.reason || '<No reason provided>'}).`);
|
|
222
222
|
switch(close.code){
|
|
223
223
|
case _types1.ShardSocketCloseCodes.TestingFinished:
|
|
224
224
|
{
|
|
@@ -245,7 +245,7 @@ let DiscordenoShard = class DiscordenoShard {
|
|
|
245
245
|
case _types.GatewayCloseEventCodes.RateLimited:
|
|
246
246
|
case _types.GatewayCloseEventCodes.SessionTimedOut:
|
|
247
247
|
{
|
|
248
|
-
|
|
248
|
+
this.logger.debug('[Shard] Gateway connection closing requiring re-identify.');
|
|
249
249
|
this.state = _types1.ShardState.Identifying;
|
|
250
250
|
this.events.disconnected?.(this);
|
|
251
251
|
return await this.identify();
|
|
@@ -269,20 +269,26 @@ let DiscordenoShard = class DiscordenoShard {
|
|
|
269
269
|
case _types.GatewayCloseEventCodes.AlreadyAuthenticated:
|
|
270
270
|
default:
|
|
271
271
|
{
|
|
272
|
-
|
|
272
|
+
this.logger.info(`[Shard] Closed shard #${this.id} with code ${close.code}. Attempting to resume...`);
|
|
273
273
|
this.state = _types1.ShardState.Resuming;
|
|
274
274
|
this.events.disconnected?.(this);
|
|
275
275
|
return await this.resume();
|
|
276
276
|
}
|
|
277
277
|
}
|
|
278
278
|
}
|
|
279
|
+
/** Handle an incoming gateway message. */ async handleMessage(message) {
|
|
280
|
+
let preProcessMessage = message.data;
|
|
281
|
+
// If message compression is enabled, Discord might send zlib compressed payloads.
|
|
282
|
+
if (this.gatewayConfig.compress && preProcessMessage instanceof Blob) {
|
|
283
|
+
preProcessMessage = (0, _nodezlib.inflateSync)(await preProcessMessage.arrayBuffer()).toString();
|
|
284
|
+
}
|
|
285
|
+
// Safeguard incase decompression failed to make a string.
|
|
286
|
+
if (typeof preProcessMessage !== 'string') return;
|
|
287
|
+
return await this.handleDiscordPacket(JSON.parse(preProcessMessage));
|
|
288
|
+
}
|
|
279
289
|
/** Handles a incoming gateway packet. */ async handleDiscordPacket(packet) {
|
|
280
290
|
// Edge case start: https://github.com/discordeno/discordeno/issues/2311
|
|
281
291
|
this.heart.lastAck = Date.now();
|
|
282
|
-
// Manually calculating the round trip time for users who need it.
|
|
283
|
-
if (this.heart.lastBeat && !this.heart.acknowledged) {
|
|
284
|
-
this.heart.rtt = this.heart.lastAck - this.heart.lastBeat;
|
|
285
|
-
}
|
|
286
292
|
this.heart.acknowledged = true;
|
|
287
293
|
// Edge case end!
|
|
288
294
|
switch(packet.op){
|
|
@@ -303,7 +309,7 @@ let DiscordenoShard = class DiscordenoShard {
|
|
|
303
309
|
case _types.GatewayOpcodes.Hello:
|
|
304
310
|
{
|
|
305
311
|
const interval = packet.d.heartbeat_interval;
|
|
306
|
-
|
|
312
|
+
this.logger.debug(`[Gateway] Hello on Shard #${this.id}`);
|
|
307
313
|
this.startHeartbeating(interval);
|
|
308
314
|
if (this.state !== _types1.ShardState.Resuming) {
|
|
309
315
|
const currentQueue = [
|
|
@@ -325,6 +331,10 @@ let DiscordenoShard = class DiscordenoShard {
|
|
|
325
331
|
}
|
|
326
332
|
case _types.GatewayOpcodes.HeartbeatACK:
|
|
327
333
|
{
|
|
334
|
+
// Manually calculating the round trip time for users who need it.
|
|
335
|
+
if (this.heart.lastBeat) {
|
|
336
|
+
this.heart.rtt = this.heart.lastAck - this.heart.lastBeat;
|
|
337
|
+
}
|
|
328
338
|
this.events.heartbeatAck?.(this);
|
|
329
339
|
break;
|
|
330
340
|
}
|
|
@@ -338,7 +348,7 @@ let DiscordenoShard = class DiscordenoShard {
|
|
|
338
348
|
case _types.GatewayOpcodes.InvalidSession:
|
|
339
349
|
{
|
|
340
350
|
const resumable = packet.d;
|
|
341
|
-
|
|
351
|
+
this.logger.debug(`[Shard] Received Invalid Session for Shard #${this.id} with resumeable as ${resumable.toString()}`);
|
|
342
352
|
this.events.invalidSession?.(this, resumable);
|
|
343
353
|
// We need to wait for a random amount of time between 1 and 5
|
|
344
354
|
// Reference: https://discord.com/developers/docs/topics/gateway#resuming
|
|
@@ -360,7 +370,9 @@ let DiscordenoShard = class DiscordenoShard {
|
|
|
360
370
|
this.state = _types1.ShardState.Connected;
|
|
361
371
|
this.events.resumed?.(this);
|
|
362
372
|
// Continue the requests which have been queued since the shard went offline.
|
|
363
|
-
this.offlineSendQueue.
|
|
373
|
+
this.offlineSendQueue.forEach((resolve)=>resolve());
|
|
374
|
+
// Setting the length to 0 will delete the elements in it
|
|
375
|
+
this.offlineSendQueue.length = 0;
|
|
364
376
|
this.resolves.get('RESUMED')?.(packet);
|
|
365
377
|
this.resolves.delete('RESUMED');
|
|
366
378
|
break;
|
|
@@ -373,7 +385,9 @@ let DiscordenoShard = class DiscordenoShard {
|
|
|
373
385
|
this.state = _types1.ShardState.Connected;
|
|
374
386
|
// Continue the requests which have been queued since the shard went offline.
|
|
375
387
|
// Important when this is a re-identify
|
|
376
|
-
this.offlineSendQueue.
|
|
388
|
+
this.offlineSendQueue.forEach((resolve)=>resolve());
|
|
389
|
+
// Setting the length to 0 will delete the elements in it
|
|
390
|
+
this.offlineSendQueue.length = 0;
|
|
377
391
|
this.resolves.get('READY')?.(packet);
|
|
378
392
|
this.resolves.delete('READY');
|
|
379
393
|
break;
|
|
@@ -392,29 +406,17 @@ let DiscordenoShard = class DiscordenoShard {
|
|
|
392
406
|
// Now the event can be safely forwarded.
|
|
393
407
|
this.events.message?.(this, (0, _utils.camelize)(packet));
|
|
394
408
|
}
|
|
395
|
-
/** Handle an incoming gateway message. */ async handleMessage(message) {
|
|
396
|
-
let preProcessMessage = message.data;
|
|
397
|
-
// If message compression is enabled,
|
|
398
|
-
// Discord might send zlib compressed payloads.
|
|
399
|
-
if (this.gatewayConfig.compress && preProcessMessage instanceof Blob) {
|
|
400
|
-
preProcessMessage = (0, _nodezlib.inflateSync)(await preProcessMessage.arrayBuffer()).toString();
|
|
401
|
-
}
|
|
402
|
-
// Safeguard incase decompression failed to make a string.
|
|
403
|
-
if (typeof preProcessMessage !== 'string') return;
|
|
404
|
-
return await this.handleDiscordPacket(JSON.parse(preProcessMessage));
|
|
405
|
-
}
|
|
406
409
|
/**
|
|
407
410
|
* Override in order to make the shards presence.
|
|
408
411
|
* async in case devs create the presence based on eg. database values.
|
|
409
412
|
* Passing the shard's id there to make it easier for the dev to use this function.
|
|
410
413
|
*/ async makePresence() {
|
|
411
|
-
// eslint-disable-next-line no-useless-return
|
|
412
414
|
return;
|
|
413
415
|
}
|
|
414
416
|
/** This function communicates with the management process, in order to know whether its free to identify. When this function resolves, this means that the shard is allowed to send an identify payload to discord. */ async requestIdentify() {}
|
|
415
417
|
/** This function communicates with the management process, in order to tell it can identify the next shard. */ async shardIsReady() {}
|
|
416
418
|
/** Start sending heartbeat payloads to Discord in the provided interval. */ startHeartbeating(interval) {
|
|
417
|
-
|
|
419
|
+
this.logger.debug(`[Shard] Start heartbeating on shard #${this.id}`);
|
|
418
420
|
// If old heartbeast exist like after resume, clear the old ones.
|
|
419
421
|
if (this.heart.intervalId) clearInterval(this.heart.intervalId);
|
|
420
422
|
if (this.heart.timeoutId) clearTimeout(this.heart.timeoutId);
|
|
@@ -425,7 +427,7 @@ let DiscordenoShard = class DiscordenoShard {
|
|
|
425
427
|
_types1.ShardState.Disconnected,
|
|
426
428
|
_types1.ShardState.Offline
|
|
427
429
|
].includes(this.state)) {
|
|
428
|
-
|
|
430
|
+
this.logger.debug(`[Shard] Shard is disconnected or offline but the heartbeat was started #${this.id}`);
|
|
429
431
|
this.state = _types1.ShardState.Unidentified;
|
|
430
432
|
}
|
|
431
433
|
// The first heartbeat needs to be send with a random delay between `0` and `interval`
|
|
@@ -434,42 +436,39 @@ let DiscordenoShard = class DiscordenoShard {
|
|
|
434
436
|
// Reference: https://discord.com/developers/docs/topics/gateway#heartbeating
|
|
435
437
|
const jitter = Math.ceil(this.heart.interval * (Math.random() || 0.5));
|
|
436
438
|
this.heart.timeoutId = setTimeout(()=>{
|
|
437
|
-
|
|
439
|
+
this.logger.debug(`[Shard] Beginning heartbeating process for shard #${this.id}`);
|
|
438
440
|
if (!this.isOpen()) return;
|
|
439
|
-
|
|
441
|
+
this.logger.debug(`[Shard] Heartbeating on #${this.id}. Previous sequence number: ${this.previousSequenceNumber}`);
|
|
440
442
|
// Using a direct socket.send call here because heartbeat requests are reserved by us.
|
|
441
443
|
this.socket?.send(JSON.stringify({
|
|
442
444
|
op: _types.GatewayOpcodes.Heartbeat,
|
|
443
445
|
d: this.previousSequenceNumber
|
|
444
446
|
}));
|
|
445
|
-
_utils.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} d`);
|
|
446
447
|
this.heart.lastBeat = Date.now();
|
|
447
448
|
this.heart.acknowledged = false;
|
|
448
449
|
// After the random heartbeat jitter we can start a normal interval.
|
|
449
450
|
this.heart.intervalId = setInterval(async ()=>{
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
// gateway.debug("GW HEARTBEATING", { shardId, shard: currentShard });
|
|
451
|
+
if (!this.isOpen()) {
|
|
452
|
+
this.logger.debug(`[Shard] Shard #${this.id} is not open, but attempted heartbeat, ignoring.`);
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
455
455
|
// The Shard did not receive a heartbeat ACK from Discord in time,
|
|
456
456
|
// therefore we have to assume that the connection has failed or got "zombied".
|
|
457
457
|
// The Shard needs to start a re-identify action accordingly.
|
|
458
458
|
// Reference: https://discord.com/developers/docs/topics/gateway#heartbeating-example-gateway-heartbeat-ack
|
|
459
459
|
if (!this.heart.acknowledged) {
|
|
460
|
-
|
|
460
|
+
this.logger.debug(`[Shard] Heartbeat not acknowledged for shard #${this.id}. Assuming zombied connection.`);
|
|
461
461
|
this.close(_types1.ShardSocketCloseCodes.ZombiedConnection, 'Zombied connection, did not receive an heartbeat ACK in time.');
|
|
462
462
|
return await this.identify();
|
|
463
463
|
}
|
|
464
|
-
this.
|
|
465
|
-
_utils.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} g`);
|
|
464
|
+
this.logger.debug(`[Shard] Heartbeating on #${this.id}. Previous sequence number: ${this.previousSequenceNumber}`);
|
|
466
465
|
// Using a direct socket.send call here because heartbeat requests are reserved by us.
|
|
467
466
|
this.socket?.send(JSON.stringify({
|
|
468
467
|
op: _types.GatewayOpcodes.Heartbeat,
|
|
469
468
|
d: this.previousSequenceNumber
|
|
470
469
|
}));
|
|
471
|
-
_utils.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} h`);
|
|
472
470
|
this.heart.lastBeat = Date.now();
|
|
471
|
+
this.heart.acknowledged = false;
|
|
473
472
|
this.events.heartbeat?.(this);
|
|
474
473
|
}, this.heart.interval);
|
|
475
474
|
}, jitter);
|
|
@@ -484,4 +483,4 @@ let DiscordenoShard = class DiscordenoShard {
|
|
|
484
483
|
};
|
|
485
484
|
const _default = DiscordenoShard;
|
|
486
485
|
|
|
487
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TaGFyZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tY29uZnVzaW5nLXZvaWQtZXhwcmVzc2lvbiAqL1xuaW1wb3J0IHR5cGUgeyBEaXNjb3JkR2F0ZXdheVBheWxvYWQsIERpc2NvcmRIZWxsbywgRGlzY29yZFJlYWR5IH0gZnJvbSAnQGRpc2NvcmRlbm8vdHlwZXMnXG5pbXBvcnQgeyBHYXRld2F5Q2xvc2VFdmVudENvZGVzLCBHYXRld2F5T3Bjb2RlcyB9IGZyb20gJ0BkaXNjb3JkZW5vL3R5cGVzJ1xuaW1wb3J0IHsgY2FtZWxpemUsIGRlbGF5LCBMZWFreUJ1Y2tldCwgbG9nZ2VyIH0gZnJvbSAnQGRpc2NvcmRlbm8vdXRpbHMnXG5pbXBvcnQgeyBpbmZsYXRlU3luYyB9IGZyb20gJ25vZGU6emxpYidcbmltcG9ydCBOb2RlV2ViU29ja2V0IGZyb20gJ3dzJ1xuaW1wb3J0IHR5cGUgeyBCb3RTdGF0dXNVcGRhdGUsIFNoYXJkRXZlbnRzLCBTaGFyZEdhdGV3YXlDb25maWcsIFNoYXJkSGVhcnQsIFNoYXJkU29ja2V0UmVxdWVzdCB9IGZyb20gJy4vdHlwZXMuanMnXG5pbXBvcnQgeyBTaGFyZFNvY2tldENsb3NlQ29kZXMsIFNoYXJkU3RhdGUgfSBmcm9tICcuL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIGxldCBXZWJTb2NrZXQ6IGFueVxuXG5leHBvcnQgY2xhc3MgRGlzY29yZGVub1NoYXJkIHtcbiAgLyoqIFRoZSBpZCBvZiB0aGUgc2hhcmQgKi9cbiAgaWQ6IG51bWJlclxuICAvKiogVGhlIGNvbm5lY3Rpb24gY29uZmlnIGRldGFpbHMgdGhhdCB0aGlzIHNoYXJkIHdpbGwgdXNlZCB0byBjb25uZWN0IHRvIGRpc2NvcmQuICovXG4gIGNvbm5lY3Rpb246IFNoYXJkR2F0ZXdheUNvbmZpZ1xuICAvKiogVGhpcyBjb250YWlucyBhbGwgdGhlIGhlYXJ0YmVhdCBpbmZvcm1hdGlvbiAqL1xuICBoZWFydDogU2hhcmRIZWFydFxuICAvKiogVGhlIG1heGltdW0gb2YgcmVxdWVzdHMgd2hpY2ggY2FuIGJlIHNlbmQgdG8gZGlzY29yZCBwZXIgcmF0ZSBsaW1pdCB0aWNrLiBUeXBpY2FsbHkgdGhpcyB2YWx1ZSBzaG91bGQgbm90IGJlIGNoYW5nZWQuICovXG4gIG1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljazogbnVtYmVyID0gMTIwXG4gIC8qKiBUaGUgcHJldmlvdXMgcGF5bG9hZCBzZXF1ZW5jZSBudW1iZXIuICovXG4gIHByZXZpb3VzU2VxdWVuY2VOdW1iZXI6IG51bWJlciB8IG51bGwgPSBudWxsXG4gIC8qKiBJbiB3aGljaCBpbnRlcnZhbCAoaW4gbWlsbGlzZWNvbmRzKSB0aGUgZ2F0ZXdheSByZXNldHMgaXQncyByYXRlIGxpbWl0LiAqL1xuICByYXRlTGltaXRSZXNldEludGVydmFsOiBudW1iZXIgPSA2MDAwMFxuICAvKiogQ3VycmVudCBzZXNzaW9uIGlkIG9mIHRoZSBzaGFyZCBpZiBwcmVzZW50LiAqL1xuICBzZXNzaW9uSWQ/OiBzdHJpbmdcbiAgLyoqIFRoaXMgY29udGFpbnMgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIERpc2NvcmQsIGlmIGN1cnJlbnRseSBjb25uZWN0ZWQuICovXG4gIHNvY2tldD86IE5vZGVXZWJTb2NrZXRcbiAgLyoqIEN1cnJlbnQgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIHRoaXMuICovXG4gIHN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lXG4gIC8qKiBUaGUgdXJsIHByb3ZpZGVkIGJ5IGRpc2NvcmQgdG8gdXNlIHdoZW4gcmVzdW1pbmcgYSBjb25uZWN0aW9uIGZvciB0aGlzIHRoaXMuICovXG4gIHJlc3VtZUdhdGV3YXlVcmw6IHN0cmluZyA9ICcnXG4gIC8qKiBUaGUgc2hhcmQgcmVsYXRlZCBldmVudCBoYW5kbGVycy4gKi9cbiAgZXZlbnRzOiBTaGFyZEV2ZW50cyA9IHt9XG4gIC8qKiBDYWNoZSBmb3IgcGVuZGluZyBnYXRld2F5IHJlcXVlc3RzIHdoaWNoIHNob3VsZCBoYXZlIGJlZW4gc2VuZCB3aGlsZSB0aGUgZ2F0ZXdheSB3ZW50IG9mZmxpbmUuICovXG4gIG9mZmxpbmVTZW5kUXVldWU6IEFycmF5PChfPzogdW5rbm93bikgPT4gdm9pZD4gPSBbXVxuICAvKiogUmVzb2x2ZSBpbnRlcm5hbCB3YWl0aW5nIHN0YXRlcy4gTWFwcGVkIGJ5IFNlbGVjdGVkRXZlbnRzID0+IFJlc29sdmVGdW5jdGlvbiAqL1xuICByZXNvbHZlcyA9IG5ldyBNYXA8J1JFQURZJyB8ICdSRVNVTUVEJyB8ICdJTlZBTElEX1NFU1NJT04nLCAocGF5bG9hZDogRGlzY29yZEdhdGV3YXlQYXlsb2FkKSA9PiB2b2lkPigpXG4gIC8qKiBTaGFyZCBidWNrZXQuIE9ubHkgYWNjZXNzIHRoaXMgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLiBCdWNrZXQgZm9yIGhhbmRsaW5nIHNoYXJkIHJlcXVlc3QgcmF0ZSBsaW1pdHMuICovXG4gIGJ1Y2tldDogTGVha3lCdWNrZXRcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBTaGFyZENyZWF0ZU9wdGlvbnMpIHtcbiAgICB0aGlzLmlkID0gb3B0aW9ucy5pZFxuICAgIHRoaXMuY29ubmVjdGlvbiA9IG9wdGlvbnMuY29ubmVjdGlvblxuICAgIHRoaXMuZXZlbnRzID0gb3B0aW9ucy5ldmVudHNcblxuICAgIHRoaXMuaGVhcnQgPSB7XG4gICAgICBhY2tub3dsZWRnZWQ6IGZhbHNlLFxuICAgICAgaW50ZXJ2YWw6IDQ1MDAwLFxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnJlcXVlc3RJZGVudGlmeSkgdGhpcy5yZXF1ZXN0SWRlbnRpZnkgPSBvcHRpb25zLnJlcXVlc3RJZGVudGlmeVxuICAgIGlmIChvcHRpb25zLnNoYXJkSXNSZWFkeSkgdGhpcy5zaGFyZElzUmVhZHkgPSBvcHRpb25zLnNoYXJkSXNSZWFkeVxuXG4gICAgdGhpcy5idWNrZXQgPSBuZXcgTGVha3lCdWNrZXQoe1xuICAgICAgbWF4OiB0aGlzLmNhbGN1bGF0ZVNhZmVSZXF1ZXN0cygpLFxuICAgICAgcmVmaWxsQW1vdW50OiB0aGlzLmNhbGN1bGF0ZVNhZmVSZXF1ZXN0cygpLFxuICAgICAgcmVmaWxsSW50ZXJ2YWw6IDYwMDAwLFxuICAgIH0pXG4gIH1cblxuICAvKiogVGhlIGdhdGV3YXkgY29uZmlndXJhdGlvbiB3aGljaCBpcyB1c2VkIHRvIGNvbm5lY3QgdG8gRGlzY29yZC4gKi9cbiAgZ2V0IGdhdGV3YXlDb25maWcoKTogU2hhcmRHYXRld2F5Q29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uXG4gIH1cblxuICAvKiogVGhlIHVybCB0byBjb25uZWN0IHRvLiBJbml0aWFsbHkgdGhpcyBpcyB0aGUgZGlzY29yZCBnYXRld2F5IHVybCwgYW5kIHRoZW4gaXMgc3dpdGNoZWQgdG8gcmVzdW1lIGdhdGV3YXkgdXJsIG9uY2UgYSBSRUFEWSBpcyByZWNlaXZlZC4gKi9cbiAgZ2V0IGNvbm5lY3Rpb25VcmwoKTogc3RyaW5nIHtcbiAgICAvLyBVc2UgfHwgYW5kIG5vdCA/PyBoZXJlLiA/PyB3aWxsIGNhdXNlIGEgYnVnLlxuICAgIHJldHVybiB0aGlzLnJlc3VtZUdhdGV3YXlVcmwgfHwgdGhpcy5nYXRld2F5Q29uZmlnLnVybFxuICB9XG5cbiAgLyoqIENhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIHJlcXVlc3RzIHdoaWNoIGNhbiBzYWZlbHkgYmUgbWFkZSBwZXIgcmF0ZSBsaW1pdCBpbnRlcnZhbCwgYmVmb3JlIHRoZSBnYXRld2F5IGdldHMgZGlzY29ubmVjdGVkIGR1ZSB0byBhbiBleGNlZWRlZCByYXRlIGxpbWl0LiAqL1xuICBjYWxjdWxhdGVTYWZlUmVxdWVzdHMoKTogbnVtYmVyIHtcbiAgICAvLyAqIDIgYWRkcyBleHRyYSBzYWZldHkgbGF5ZXIgZm9yIGRpc2NvcmRzIE9QIDEgcmVxdWVzdHMgdGhhdCB3ZSBuZWVkIHRvIHJlc3BvbmQgdG9cbiAgICBjb25zdCBzYWZlUmVxdWVzdHMgPSB0aGlzLm1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljayAtIE1hdGguY2VpbCh0aGlzLnJhdGVMaW1pdFJlc2V0SW50ZXJ2YWwgLyB0aGlzLmhlYXJ0LmludGVydmFsKSAqIDJcblxuICAgIHJldHVybiBzYWZlUmVxdWVzdHMgPCAwID8gMCA6IHNhZmVSZXF1ZXN0c1xuICB9XG5cbiAgYXN5bmMgY2hlY2tPZmZsaW5lKGhpZ2hQcmlvcml0eTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5pc09wZW4oKSkge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgLy8gSGlnaGVyIHByaW9yaXR5IHJlcXVlc3RzIGdldCBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS5cbiAgICAgICAgaWYgKGhpZ2hQcmlvcml0eSkgdGhpcy5vZmZsaW5lU2VuZFF1ZXVlLnVuc2hpZnQocmVzb2x2ZSlcbiAgICAgICAgZWxzZSB0aGlzLm9mZmxpbmVTZW5kUXVldWUucHVzaChyZXNvbHZlKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKiogQ2xvc2UgdGhlIHNvY2tldCBjb25uZWN0aW9uIHRvIGRpc2NvcmQgaWYgcHJlc2VudC4gKi9cbiAgY2xvc2UoY29kZTogbnVtYmVyLCByZWFzb246IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNvY2tldD8ucmVhZHlTdGF0ZSAhPT0gTm9kZVdlYlNvY2tldC5PUEVOKSByZXR1cm5cblxuICAgIHRoaXMuc29ja2V0Py5jbG9zZShjb2RlLCByZWFzb24pXG4gIH1cblxuICAvKiogQ29ubmVjdCB0aGUgc2hhcmQgd2l0aCB0aGUgZ2F0ZXdheSBhbmQgc3RhcnQgaGVhcnRiZWF0aW5nLiBUaGlzIHdpbGwgbm90IGlkZW50aWZ5IHRoZSBzaGFyZCB0byB0aGUgZ2F0ZXdheS4gKi9cbiAgYXN5bmMgY29ubmVjdCgpOiBQcm9taXNlPERpc2NvcmRlbm9TaGFyZD4ge1xuICAgIC8vIE9ubHkgc2V0IHRoZSBzaGFyZCB0byBgQ29ubmVjdGluZ2Agc3RhdGUsXG4gICAgLy8gaWYgdGhlIGNvbm5lY3Rpb24gcmVxdWVzdCBkb2VzIG5vdCBjb21lIGZyb20gYW4gaWRlbnRpZnkgb3IgcmVzdW1lIGFjdGlvbi5cbiAgICBpZiAoIVtTaGFyZFN0YXRlLklkZW50aWZ5aW5nLCBTaGFyZFN0YXRlLlJlc3VtaW5nXS5pbmNsdWRlcyh0aGlzLnN0YXRlKSkge1xuICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuQ29ubmVjdGluZ1xuICAgIH1cbiAgICB0aGlzLmV2ZW50cy5jb25uZWN0aW5nPy4odGhpcylcblxuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwodGhpcy5jb25uZWN0aW9uVXJsKVxuICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCd2JywgdGhpcy5nYXRld2F5Q29uZmlnLnZlcnNpb24udG9TdHJpbmcoKSlcbiAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnZW5jb2RpbmcnLCAnanNvbicpXG5cbiAgICBjb25zdCBzb2NrZXQ6IE5vZGVXZWJTb2NrZXQgPVxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBEZW5vXG4gICAgICBnbG9iYWxUaGlzLkRlbm8gIT09IHVuZGVmaW5lZCAmJiBSZWZsZWN0LmhhcyhnbG9iYWxUaGlzLCAnRGVubycpID8gbmV3IFdlYlNvY2tldCh1cmwudG9TdHJpbmcoKSkgOiBuZXcgTm9kZVdlYlNvY2tldCh1cmwudG9TdHJpbmcoKSlcbiAgICB0aGlzLnNvY2tldCA9IHNvY2tldFxuXG4gICAgLy8gVE9ETzogcHJvcGVyIGV2ZW50IGhhbmRsaW5nXG4gICAgc29ja2V0Lm9uZXJyb3IgPSAoZXZlbnQ6IE5vZGVXZWJTb2NrZXQuRXJyb3JFdmVudCkgPT4gY29uc29sZS5sb2coeyBlcnJvcjogZXZlbnQsIHNoYXJkSWQ6IHRoaXMuaWQgfSlcbiAgICBzb2NrZXQub25jbG9zZSA9IGFzeW5jIChldmVudDogTm9kZVdlYlNvY2tldC5DbG9zZUV2ZW50KSA9PiBhd2FpdCB0aGlzLmhhbmRsZUNsb3NlKGV2ZW50KVxuICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBhc3luYyAobWVzc2FnZTogTm9kZVdlYlNvY2tldC5NZXNzYWdlRXZlbnQpID0+IGF3YWl0IHRoaXMuaGFuZGxlTWVzc2FnZShtZXNzYWdlKVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBzb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICAvLyBPbmx5IHNldCB0aGUgc2hhcmQgdG8gYFVuaWRlbnRpZmllZGAgc3RhdGUsXG4gICAgICAgIC8vIGlmIHRoZSBjb25uZWN0aW9uIHJlcXVlc3QgZG9lcyBub3QgY29tZSBmcm9tIGFuIGlkZW50aWZ5IG9yIHJlc3VtZSBhY3Rpb24uXG4gICAgICAgIGlmICghW1NoYXJkU3RhdGUuSWRlbnRpZnlpbmcsIFNoYXJkU3RhdGUuUmVzdW1pbmddLmluY2x1ZGVzKHRoaXMuc3RhdGUpKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuVW5pZGVudGlmaWVkXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ldmVudHMuY29ubmVjdGVkPy4odGhpcylcblxuICAgICAgICByZXNvbHZlKHRoaXMpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKiBJZGVudGlmeSB0aGUgc2hhcmQgdG8gdGhlIGdhdGV3YXkuIElmIG5vdCBjb25uZWN0ZWQsIHRoaXMgd2lsbCBhbHNvIGNvbm5lY3QgdGhlIHNoYXJkIHRvIHRoZSBnYXRld2F5LiAqL1xuICBhc3luYyBpZGVudGlmeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBBIG5ldyBpZGVudGlmeSBoYXMgYmVlbiByZXF1ZXN0ZWQgZXZlbiB0aG91Z2ggdGhlcmUgaXMgYWxyZWFkeSBhIGNvbm5lY3Rpb24gb3Blbi5cbiAgICAvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBjbG9zZSB0aGUgb2xkIGNvbm5lY3Rpb24gYW5kIGhlYXJ0YmVhdGluZyBiZWZvcmUgY3JlYXRpbmcgYSBuZXcgb25lLlxuICAgIGlmICh0aGlzLmlzT3BlbigpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYENMT1NJTkcgRVhJU1RJTkcgU0hBUkQ6ICMke3RoaXMuaWR9YClcbiAgICAgIHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlSWRlbnRpZnlpbmcsICdSZS1pZGVudGlmeWluZyBjbG9zdXJlIG9mIG9sZCBjb25uZWN0aW9uLicpXG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuSWRlbnRpZnlpbmdcbiAgICB0aGlzLmV2ZW50cy5pZGVudGlmeWluZz8uKHRoaXMpXG5cbiAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBzaGFyZCBpcyBpbiBIZWFydGJlYXRpbmcgc3RhdGUgYnV0IG5vdCBpZGVudGlmaWVkLFxuICAgIC8vIHNvIGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYWxyZWFkeSBhIGdhdGV3YXkgY29ubmVjdGlvbiBleGlzdGluZy5cbiAgICAvLyBJZiBub3Qgd2UgbmVlZCB0byBjcmVhdGUgb25lIGJlZm9yZSB3ZSBpZGVudGlmeS5cbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpXG4gICAgfVxuXG4gICAgdGhpcy5zZW5kKFxuICAgICAge1xuICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuSWRlbnRpZnksXG4gICAgICAgIGQ6IHtcbiAgICAgICAgICB0b2tlbjogYEJvdCAke3RoaXMuZ2F0ZXdheUNvbmZpZy50b2tlbn1gLFxuICAgICAgICAgIGNvbXByZXNzOiB0aGlzLmdhdGV3YXlDb25maWcuY29tcHJlc3MsXG4gICAgICAgICAgcHJvcGVydGllczogdGhpcy5nYXRld2F5Q29uZmlnLnByb3BlcnRpZXMsXG4gICAgICAgICAgaW50ZW50czogdGhpcy5nYXRld2F5Q29uZmlnLmludGVudHMsXG4gICAgICAgICAgc2hhcmQ6IFt0aGlzLmlkLCB0aGlzLmdhdGV3YXlDb25maWcudG90YWxTaGFyZHNdLFxuICAgICAgICAgIHByZXNlbmNlOiBhd2FpdCB0aGlzLm1ha2VQcmVzZW5jZT8uKCksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICApXG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdSRUFEWScsICgpID0+IHtcbiAgICAgICAgdGhpcy5ldmVudHMuaWRlbnRpZmllZD8uKHRoaXMpXG4gICAgICAgIC8vIFRlbGxzIHRoZSBtYW5hZ2VyIHRoYXQgdGhpcyBzaGFyZCBpcyByZWFkeVxuICAgICAgICB0aGlzLnNoYXJkSXNSZWFkeSgpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSlcbiAgICAgIC8vIFdoZW4gaWRlbnRpZnlpbmcgdG9vIGZhc3QsXG4gICAgICAvLyBEaXNjb3JkIHNlbmRzIGFuIGludmFsaWQgc2Vzc2lvbiBwYXlsb2FkLlxuICAgICAgLy8gVGhpcyBjYW4gc2FmZWx5IGJlIGlnbm9yZWQgdGhvdWdoIGFuZCB0aGUgc2hhcmQgc3RhcnRzIGEgbmV3IGlkZW50aWZ5IGFjdGlvbi5cbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdJTlZBTElEX1NFU1NJT04nLCAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdSRUFEWScpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqIENoZWNrIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gdG8gRGlzY29yZCBpcyBjdXJyZW50bHkgb3Blbi4gKi9cbiAgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNvY2tldD8ucmVhZHlTdGF0ZSA9PT0gTm9kZVdlYlNvY2tldC5PUEVOXG4gIH1cblxuICAvKiogQXR0ZW1wdCB0byByZXN1bWUgdGhlIHByZXZpb3VzIHNoYXJkcyBzZXNzaW9uIHdpdGggdGhlIGdhdGV3YXkuICovXG4gIGFzeW5jIHJlc3VtZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2dnZXIuZGVidWcoYFtHYXRld2F5XSBSZXN1bWluZyBTaGFyZCAjJHt0aGlzLmlkfWApXG4gICAgLy8gSXQgaGFzIGJlZW4gcmVxdWVzdGVkIHRvIHJlc3VtZSB0aGUgU2hhcmRzIHNlc3Npb24uXG4gICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBzaGFyZCBpcyBzdGlsbCBjb25uZWN0ZWQgd2l0aCBEaXNjb3JkJ3MgZ2F0ZXdheSB0aGVyZWZvcmUgd2UgbmVlZCB0byBmb3JjZWZ1bGx5IGNsb3NlIGl0LlxuICAgIGlmICh0aGlzLmlzT3BlbigpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYFtHYXRld2F5XSBSZXN1bWluZyBTaGFyZCAjJHt0aGlzLmlkfSBpbiBpc09wZW5gKVxuICAgICAgdGhpcy5jbG9zZShTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVzdW1lQ2xvc2luZ09sZENvbm5lY3Rpb24sICdSZWNvbm5lY3RpbmcgdGhlIHNoYXJkLCBjbG9zaW5nIG9sZCBjb25uZWN0aW9uLicpXG4gICAgfVxuXG4gICAgLy8gU2hhcmQgaGFzIG5ldmVyIGlkZW50aWZpZWQsIHNvIHdlIGNhbm5vdCByZXN1bWUuXG4gICAgaWYgKCF0aGlzLnNlc3Npb25JZCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFRyeWluZyB0byByZXN1bWUgYSBzaGFyZCAjJHt0aGlzLmlkfSB0aGF0IHdhcyBOT1QgZmlyc3QgaWRlbnRpZmllZC4gKE5vIHNlc3Npb24gaWQgZm91bmQpYClcblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaWRlbnRpZnkoKVxuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLlJlc3VtaW5nXG5cbiAgICBsb2dnZXIuZGVidWcoYFtHYXRld2F5XSBSZXN1bWluZyBTaGFyZCAjJHt0aGlzLmlkfSwgYmVmb3JlIGNvbm5lY3RpbmdgKVxuICAgIC8vIEJlZm9yZSB3ZSBjYW4gcmVzdW1lLCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIHdpdGggRGlzY29yZCdzIGdhdGV3YXkuXG4gICAgYXdhaXQgdGhpcy5jb25uZWN0KClcbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICBgW0dhdGV3YXldIFJlc3VtaW5nIFNoYXJkICMke3RoaXMuaWR9LCBhZnRlciBjb25uZWN0aW5nLiAke3RoaXMuZ2F0ZXdheUNvbmZpZy50b2tlbn0gfCAke3RoaXMuc2Vzc2lvbklkfSB8ICR7dGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyfWAsXG4gICAgKVxuXG4gICAgdGhpcy5zZW5kKFxuICAgICAge1xuICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuUmVzdW1lLFxuICAgICAgICBkOiB7XG4gICAgICAgICAgdG9rZW46IGBCb3QgJHt0aGlzLmdhdGV3YXlDb25maWcudG9rZW59YCxcbiAgICAgICAgICBzZXNzaW9uX2lkOiB0aGlzLnNlc3Npb25JZCxcbiAgICAgICAgICBzZXE6IHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlciA/PyAwLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRydWUsXG4gICAgKVxuICAgIGxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFJlc3VtaW5nIFNoYXJkICMke3RoaXMuaWR9IGFmdGVyIHNlbmQgcmVzdW1nYClcblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5yZXNvbHZlcy5zZXQoJ1JFU1VNRUQnLCAoKSA9PiByZXNvbHZlKCkpXG4gICAgICAvLyBJZiBpdCBpcyBhdHRlbXB0ZWQgdG8gcmVzdW1lIHdpdGggYW4gaW52YWxpZCBzZXNzaW9uIGlkLFxuICAgICAgLy8gRGlzY29yZCBzZW5kcyBhbiBpbnZhbGlkIHNlc3Npb24gcGF5bG9hZFxuICAgICAgLy8gTm90IGVycm9yaW5nIGhlcmUgc2luY2UgaXQgaXMgZWFzeSB0aGF0IHRoaXMgaGFwcGVucywgYWxzbyBpdCB3b3VsZCBiZSBub3QgY2F0Y2hhYmxlXG4gICAgICB0aGlzLnJlc29sdmVzLnNldCgnSU5WQUxJRF9TRVNTSU9OJywgKCkgPT4ge1xuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnUkVTVU1FRCcpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqIFNlbmQgYSBtZXNzYWdlIHRvIERpc2NvcmQuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2hpZ2hQcmlvcml0eT1mYWxzZV0gLSBXaGV0aGVyIHRoaXMgbWVzc2FnZSBzaG91bGQgYmUgc2VuZCBhc2FwLlxuICAgKi9cbiAgYXN5bmMgc2VuZChtZXNzYWdlOiBTaGFyZFNvY2tldFJlcXVlc3QsIGhpZ2hQcmlvcml0eTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQmVmb3JlIGFjcXVpcmluZyBhIHRva2VuIGZyb20gdGhlIGJ1Y2tldCwgY2hlY2sgd2hldGhlciB0aGUgc2hhcmQgaXMgY3VycmVudGx5IG9mZmxpbmUgb3Igbm90LlxuICAgIC8vIEVsc2UgYnVja2V0IGFuZCB0b2tlbiB3YWl0IHRpbWUganVzdCBnZXQgd2FzdGVkLlxuICAgIGF3YWl0IHRoaXMuY2hlY2tPZmZsaW5lKGhpZ2hQcmlvcml0eSlcblxuICAgIGF3YWl0IHRoaXMuYnVja2V0LmFjcXVpcmUoaGlnaFByaW9yaXR5KVxuXG4gICAgLy8gSXQncyBwb3NzaWJsZSwgdGhhdCB0aGUgc2hhcmQgd2VudCBvZmZsaW5lIGFmdGVyIGEgdG9rZW4gaGFzIGJlZW4gYWNxdWlyZWQgZnJvbSB0aGUgYnVja2V0LlxuICAgIGF3YWl0IHRoaXMuY2hlY2tPZmZsaW5lKGhpZ2hQcmlvcml0eSlcblxuICAgIHRoaXMuc29ja2V0Py5zZW5kKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKVxuICB9XG5cbiAgLyoqIFNodXRkb3duIHRoZSB0aGlzLiBGb3JjZWZ1bGx5IGRpc2Nvbm5lY3QgdGhlIHNoYXJkIGZyb20gRGlzY29yZC4gVGhlIHNoYXJkIG1heSBub3QgYXR0ZW1wdCB0byByZWNvbm5lY3Qgd2l0aCBEaXNjb3JkLiAqL1xuICBhc3luYyBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNsb3NlKFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5TaHV0ZG93biwgJ1NoYXJkIHNodXR0aW5nIGRvd24uJylcbiAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lXG4gIH1cblxuICAvKiogSGFuZGxlIGEgZ2F0ZXdheSBjb25uZWN0aW9uIGNsb3NlLiAqL1xuICBhc3luYyBoYW5kbGVDbG9zZShjbG9zZTogTm9kZVdlYlNvY2tldC5DbG9zZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gICBnYXRld2F5LmRlYnVnKFwiR1cgQ0xPU0VEXCIsIHsgc2hhcmRJZCwgcGF5bG9hZDogZXZlbnQgfSk7XG5cbiAgICB0aGlzLnN0b3BIZWFydGJlYXRpbmcoKVxuXG4gICAgc3dpdGNoIChjbG9zZS5jb2RlKSB7XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5UZXN0aW5nRmluaXNoZWQ6IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuT2ZmbGluZVxuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgLy8gT24gdGhlc2UgY29kZXMgYSBtYW51YWwgc3RhcnQgd2lsbCBiZSBkb25lLlxuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuU2h1dGRvd246XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZUlkZW50aWZ5aW5nOlxuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVzaGFyZGVkOlxuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVzdW1lQ2xvc2luZ09sZENvbm5lY3Rpb246XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5ab21iaWVkQ29ubmVjdGlvbjoge1xuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5EaXNjb25uZWN0ZWRcbiAgICAgICAgdGhpcy5ldmVudHMuZGlzY29ubmVjdGVkPy4odGhpcylcblxuICAgICAgICAvLyBnYXRld2F5LmRlYnVnKFwiR1cgQ0xPU0VEX1JFQ09OTkVDVFwiLCB7IHNoYXJkSWQsIHBheWxvYWQ6IGV2ZW50IH0pO1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIC8vIEdhdGV3YXkgY29ubmVjdGlvbiBjbG9zZXMgd2hpY2ggcmVxdWlyZSBhIG5ldyBpZGVudGlmeS5cbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5Vbmtub3duT3Bjb2RlOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLk5vdEF1dGhlbnRpY2F0ZWQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZFNlcTpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5SYXRlTGltaXRlZDpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5TZXNzaW9uVGltZWRPdXQ6IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbU2hhcmRdIEdhdGV3YXkgY29ubmVjdGlvbiBjbG9zaW5nIHJlcXVpcmluZyByZS1pZGVudGlmeS4gQ29kZTogJHtjbG9zZS5jb2RlfWApXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLklkZW50aWZ5aW5nXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaWRlbnRpZnkoKVxuICAgICAgfVxuICAgICAgLy8gV2hlbiB0aGVzZSBjb2RlcyBhcmUgcmVjZWl2ZWQgc29tZXRoaW5nIHdlbnQgcmVhbGx5IHdyb25nLlxuICAgICAgLy8gT24gdGhvc2Ugd2UgY2Fubm90IHN0YXJ0IGEgcmVjb25uZWN0IGF0dGVtcHQuXG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuQXV0aGVudGljYXRpb25GYWlsZWQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZFNoYXJkOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlNoYXJkaW5nUmVxdWlyZWQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZEFwaVZlcnNpb246XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZEludGVudHM6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuRGlzYWxsb3dlZEludGVudHM6IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuT2ZmbGluZVxuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihjbG9zZS5yZWFzb24gfHwgJ0Rpc2NvcmQgZ2F2ZSBubyByZWFzb24hIEdHISBZb3UgYnJva2UgRGlzY29yZCEnKVxuICAgICAgfVxuICAgICAgLy8gR2F0ZXdheSBjb25uZWN0aW9uIGNsb3NlcyBvbiB3aGljaCBhIHJlc3VtZSBpcyBhbGxvd2VkLlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlVua25vd25FcnJvcjpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5EZWNvZGVFcnJvcjpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5BbHJlYWR5QXV0aGVudGljYXRlZDpcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtTaGFyZF0gY2xvc2VkIHNoYXJkICMke3RoaXMuaWR9LiBSZXN1bWluZy4uLmApXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLlJlc3VtaW5nXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVzdW1lKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogSGFuZGxlcyBhIGluY29taW5nIGdhdGV3YXkgcGFja2V0LiAqL1xuICBhc3luYyBoYW5kbGVEaXNjb3JkUGFja2V0KHBhY2tldDogRGlzY29yZEdhdGV3YXlQYXlsb2FkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gRWRnZSBjYXNlIHN0YXJ0OiBodHRwczovL2dpdGh1Yi5jb20vZGlzY29yZGVuby9kaXNjb3JkZW5vL2lzc3Vlcy8yMzExXG4gICAgdGhpcy5oZWFydC5sYXN0QWNrID0gRGF0ZS5ub3coKVxuICAgIC8vIE1hbnVhbGx5IGNhbGN1bGF0aW5nIHRoZSByb3VuZCB0cmlwIHRpbWUgZm9yIHVzZXJzIHdobyBuZWVkIGl0LlxuICAgIGlmICh0aGlzLmhlYXJ0Lmxhc3RCZWF0ICYmICF0aGlzLmhlYXJ0LmFja25vd2xlZGdlZCkge1xuICAgICAgdGhpcy5oZWFydC5ydHQgPSB0aGlzLmhlYXJ0Lmxhc3RBY2sgLSB0aGlzLmhlYXJ0Lmxhc3RCZWF0XG4gICAgfVxuICAgIHRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkID0gdHJ1ZVxuICAgIC8vIEVkZ2UgY2FzZSBlbmQhXG5cbiAgICBzd2l0Y2ggKHBhY2tldC5vcCkge1xuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXQ6IHtcbiAgICAgICAgLy8gVE9ETzogY2FuIHRoaXMgYWN0dWFsbHkgaGFwcGVuXG4gICAgICAgIGlmICghdGhpcy5pc09wZW4oKSkgcmV0dXJuXG5cbiAgICAgICAgdGhpcy5oZWFydC5sYXN0QmVhdCA9IERhdGUubm93KClcbiAgICAgICAgLy8gRGlzY29yZCByYW5kb21seSBzZW5kcyB0aGlzIHJlcXVpcmluZyBhbiBpbW1lZGlhdGUgaGVhcnRiZWF0IGJhY2suXG4gICAgICAgIC8vIFVzaW5nIGEgZGlyZWN0IHNvY2tldC5zZW5kIGNhbGwgaGVyZSBiZWNhdXNlIGhlYXJ0YmVhdCByZXF1ZXN0cyBhcmUgcmVzZXJ2ZWQgYnkgdXMuXG4gICAgICAgIHRoaXMuc29ja2V0Py5zZW5kKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXQsXG4gICAgICAgICAgICBkOiB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIsXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICAgdGhpcy5ldmVudHMuaGVhcnRiZWF0Py4odGhpcylcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5IZWxsbzoge1xuICAgICAgICBjb25zdCBpbnRlcnZhbCA9IChwYWNrZXQuZCBhcyBEaXNjb3JkSGVsbG8pLmhlYXJ0YmVhdF9pbnRlcnZhbFxuICAgICAgICBsb2dnZXIuZGVidWcoYFtHYXRld2F5XSBIZWxsbyBvbiBTaGFyZCAjJHt0aGlzLmlkfWApXG4gICAgICAgIHRoaXMuc3RhcnRIZWFydGJlYXRpbmcoaW50ZXJ2YWwpXG5cbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT09IFNoYXJkU3RhdGUuUmVzdW1pbmcpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50UXVldWUgPSBbLi4udGhpcy5idWNrZXQucXVldWVdXG4gICAgICAgICAgLy8gSEVMTE8gaGFzIGJlZW4gc2VuZCBvbiBhIG5vbiByZXN1bWUgYWN0aW9uLlxuICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgc2hhcmQgc3RhcnRzIGEgbmV3IHNlc3Npb24sXG4gICAgICAgICAgLy8gdGhlcmVmb3JlIHRoZSByYXRlIGxpbWl0IGludGVydmFsIGhhcyBiZWVuIHJlc2V0IHRvby5cbiAgICAgICAgICB0aGlzLmJ1Y2tldCA9IG5ldyBMZWFreUJ1Y2tldCh7XG4gICAgICAgICAgICBtYXg6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICAgICAgICByZWZpbGxJbnRlcnZhbDogNjAwMDAsXG4gICAgICAgICAgICByZWZpbGxBbW91bnQ6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIC8vIFF1ZXVlIHNob3VsZCBub3QgYmUgbG9zdCBvbiBhIHJlLWlkZW50aWZ5LlxuICAgICAgICAgIHRoaXMuYnVja2V0LnF1ZXVlLnVuc2hpZnQoLi4uY3VycmVudFF1ZXVlKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ldmVudHMuaGVsbG8/Lih0aGlzKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdEFDSzoge1xuICAgICAgICB0aGlzLmV2ZW50cy5oZWFydGJlYXRBY2s/Lih0aGlzKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLlJlY29ubmVjdDoge1xuICAgICAgICAvLyAgIGdhdGV3YXkuZGVidWcoXCJHVyBSRUNPTk5FQ1RcIiwgeyBzaGFyZElkIH0pO1xuXG4gICAgICAgIHRoaXMuZXZlbnRzLnJlcXVlc3RlZFJlY29ubmVjdD8uKHRoaXMpXG5cbiAgICAgICAgYXdhaXQgdGhpcy5yZXN1bWUoKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLkludmFsaWRTZXNzaW9uOiB7XG4gICAgICAgIGNvbnN0IHJlc3VtYWJsZSA9IHBhY2tldC5kIGFzIGJvb2xlYW5cbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFJlY2VpdmVkIEludmFsaWQgU2Vzc2lvbiBmb3IgU2hhcmQgIyR7dGhpcy5pZH0gd2l0aCByZXN1bWVhYmxlIGFzICR7cmVzdW1hYmxlLnRvU3RyaW5nKCl9YClcblxuICAgICAgICB0aGlzLmV2ZW50cy5pbnZhbGlkU2Vzc2lvbj8uKHRoaXMsIHJlc3VtYWJsZSlcblxuICAgICAgICAvLyBXZSBuZWVkIHRvIHdhaXQgZm9yIGEgcmFuZG9tIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gMSBhbmQgNVxuICAgICAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I3Jlc3VtaW5nXG4gICAgICAgIGF3YWl0IGRlbGF5KE1hdGguZmxvb3IoKE1hdGgucmFuZG9tKCkgKiA0ICsgMSkgKiAxMDAwKSlcblxuICAgICAgICB0aGlzLnJlc29sdmVzLmdldCgnSU5WQUxJRF9TRVNTSU9OJyk/LihwYWNrZXQpXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdJTlZBTElEX1NFU1NJT04nKVxuXG4gICAgICAgIC8vIFdoZW4gcmVzdW1hYmxlIGlzIGZhbHNlIHdlIG5lZWQgdG8gcmUtaWRlbnRpZnlcbiAgICAgICAgaWYgKCFyZXN1bWFibGUpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3RJZGVudGlmeSgpXG5cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHNlc3Npb24gaXMgaW52YWxpZCBidXQgYXBwYXJlbnRseSBpdCBpcyByZXN1bWFibGVcbiAgICAgICAgYXdhaXQgdGhpcy5yZXN1bWUoKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChwYWNrZXQudCkge1xuICAgICAgY2FzZSAnUkVTVU1FRCc6XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLkNvbm5lY3RlZFxuICAgICAgICB0aGlzLmV2ZW50cy5yZXN1bWVkPy4odGhpcylcblxuICAgICAgICAvLyBDb250aW51ZSB0aGUgcmVxdWVzdHMgd2hpY2ggaGF2ZSBiZWVuIHF1ZXVlZCBzaW5jZSB0aGUgc2hhcmQgd2VudCBvZmZsaW5lLlxuICAgICAgICB0aGlzLm9mZmxpbmVTZW5kUXVldWUubWFwKChyZXNvbHZlKSA9PiByZXNvbHZlKCkpXG5cbiAgICAgICAgdGhpcy5yZXNvbHZlcy5nZXQoJ1JFU1VNRUQnKT8uKHBhY2tldClcbiAgICAgICAgdGhpcy5yZXNvbHZlcy5kZWxldGUoJ1JFU1VNRUQnKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnUkVBRFknOiB7XG4gICAgICAgIC8vIEltcG9ydGFudCBmb3IgZnV0dXJlIHJlc3VtZXMuXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBwYWNrZXQuZCBhcyBEaXNjb3JkUmVhZHlcblxuICAgICAgICB0aGlzLnJlc3VtZUdhdGV3YXlVcmwgPSBwYXlsb2FkLnJlc3VtZV9nYXRld2F5X3VybFxuXG4gICAgICAgIHRoaXMuc2Vzc2lvbklkID0gcGF5bG9hZC5zZXNzaW9uX2lkXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLkNvbm5lY3RlZFxuXG4gICAgICAgIC8vIENvbnRpbnVlIHRoZSByZXF1ZXN0cyB3aGljaCBoYXZlIGJlZW4gcXVldWVkIHNpbmNlIHRoZSBzaGFyZCB3ZW50IG9mZmxpbmUuXG4gICAgICAgIC8vIEltcG9ydGFudCB3aGVuIHRoaXMgaXMgYSByZS1pZGVudGlmeVxuICAgICAgICB0aGlzLm9mZmxpbmVTZW5kUXVldWUubWFwKChyZXNvbHZlKSA9PiByZXNvbHZlKCkpXG5cbiAgICAgICAgdGhpcy5yZXNvbHZlcy5nZXQoJ1JFQURZJyk/LihwYWNrZXQpXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdSRUFEWScpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBzZXF1ZW5jZSBudW1iZXIgaWYgaXQgaXMgcHJlc2VudFxuICAgIC8vIGBzYCBjYW4gYmUgZWl0aGVyIGBudWxsYCBvciBhIGBudW1iZXJgLlxuICAgIC8vIEluIG9yZGVyIHRvIHByZXZlbnQgdXBkYXRlIG1pc3NlcyB3aGVuIGBzYCBpcyBgMGAgd2UgY2hlY2sgYWdhaW5zdCBudWxsLlxuICAgIGlmIChwYWNrZXQucyAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyID0gcGFja2V0LnNcbiAgICB9XG5cbiAgICB0aGlzLmZvcndhcmRUb0JvdChwYWNrZXQpXG4gIH1cblxuICBmb3J3YXJkVG9Cb3QocGFja2V0OiBEaXNjb3JkR2F0ZXdheVBheWxvYWQpOiB2b2lkIHtcbiAgICAvLyBUaGUgbmVjZXNzYXJ5IGhhbmRsaW5nIHJlcXVpcmVkIGZvciB0aGUgU2hhcmRzIGNvbm5lY3Rpb24gaGFzIGJlZW4gZmluaXNoZWQuXG4gICAgLy8gTm93IHRoZSBldmVudCBjYW4gYmUgc2FmZWx5IGZvcndhcmRlZC5cbiAgICB0aGlzLmV2ZW50cy5tZXNzYWdlPy4odGhpcywgY2FtZWxpemUocGFja2V0KSlcbiAgfVxuXG4gIC8qKiBIYW5kbGUgYW4gaW5jb21pbmcgZ2F0ZXdheSBtZXNzYWdlLiAqL1xuICBhc3luYyBoYW5kbGVNZXNzYWdlKG1lc3NhZ2U6IE5vZGVXZWJTb2NrZXQuTWVzc2FnZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHByZVByb2Nlc3NNZXNzYWdlID0gbWVzc2FnZS5kYXRhXG5cbiAgICAvLyBJZiBtZXNzYWdlIGNvbXByZXNzaW9uIGlzIGVuYWJsZWQsXG4gICAgLy8gRGlzY29yZCBtaWdodCBzZW5kIHpsaWIgY29tcHJlc3NlZCBwYXlsb2Fkcy5cbiAgICBpZiAodGhpcy5nYXRld2F5Q29uZmlnLmNvbXByZXNzICYmIHByZVByb2Nlc3NNZXNzYWdlIGluc3RhbmNlb2YgQmxvYikge1xuICAgICAgcHJlUHJvY2Vzc01lc3NhZ2UgPSBpbmZsYXRlU3luYyhhd2FpdCBwcmVQcm9jZXNzTWVzc2FnZS5hcnJheUJ1ZmZlcigpKS50b1N0cmluZygpXG4gICAgfVxuXG4gICAgLy8gU2FmZWd1YXJkIGluY2FzZSBkZWNvbXByZXNzaW9uIGZhaWxlZCB0byBtYWtlIGEgc3RyaW5nLlxuICAgIGlmICh0eXBlb2YgcHJlUHJvY2Vzc01lc3NhZ2UgIT09ICdzdHJpbmcnKSByZXR1cm5cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZURpc2NvcmRQYWNrZXQoSlNPTi5wYXJzZShwcmVQcm9jZXNzTWVzc2FnZSkgYXMgRGlzY29yZEdhdGV3YXlQYXlsb2FkKVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGluIG9yZGVyIHRvIG1ha2UgdGhlIHNoYXJkcyBwcmVzZW5jZS5cbiAgICogYXN5bmMgaW4gY2FzZSBkZXZzIGNyZWF0ZSB0aGUgcHJlc2VuY2UgYmFzZWQgb24gZWcuIGRhdGFiYXNlIHZhbHVlcy5cbiAgICogUGFzc2luZyB0aGUgc2hhcmQncyBpZCB0aGVyZSB0byBtYWtlIGl0IGVhc2llciBmb3IgdGhlIGRldiB0byB1c2UgdGhpcyBmdW5jdGlvbi5cbiAgICovXG4gIGFzeW5jIG1ha2VQcmVzZW5jZSgpOiBQcm9taXNlPEJvdFN0YXR1c1VwZGF0ZSB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLXJldHVyblxuICAgIHJldHVyblxuICB9XG5cbiAgLyoqIFRoaXMgZnVuY3Rpb24gY29tbXVuaWNhdGVzIHdpdGggdGhlIG1hbmFnZW1lbnQgcHJvY2VzcywgaW4gb3JkZXIgdG8ga25vdyB3aGV0aGVyIGl0cyBmcmVlIHRvIGlkZW50aWZ5LiBXaGVuIHRoaXMgZnVuY3Rpb24gcmVzb2x2ZXMsIHRoaXMgbWVhbnMgdGhhdCB0aGUgc2hhcmQgaXMgYWxsb3dlZCB0byBzZW5kIGFuIGlkZW50aWZ5IHBheWxvYWQgdG8gZGlzY29yZC4gKi9cbiAgYXN5bmMgcmVxdWVzdElkZW50aWZ5KCk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogVGhpcyBmdW5jdGlvbiBjb21tdW5pY2F0ZXMgd2l0aCB0aGUgbWFuYWdlbWVudCBwcm9jZXNzLCBpbiBvcmRlciB0byB0ZWxsIGl0IGNhbiBpZGVudGlmeSB0aGUgbmV4dCBzaGFyZC4gKi9cbiAgYXN5bmMgc2hhcmRJc1JlYWR5KCk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogU3RhcnQgc2VuZGluZyBoZWFydGJlYXQgcGF5bG9hZHMgdG8gRGlzY29yZCBpbiB0aGUgcHJvdmlkZWQgaW50ZXJ2YWwuICovXG4gIHN0YXJ0SGVhcnRiZWF0aW5nKGludGVydmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICBsb2dnZXIuZGVidWcoYFtHYXRld2F5XSBTdGFydCBIZWFydGJlYXRpbmcgU2hhcmQgIyR7dGhpcy5pZH1gKVxuICAgIC8vIElmIG9sZCBoZWFydGJlYXN0IGV4aXN0IGxpa2UgYWZ0ZXIgcmVzdW1lLCBjbGVhciB0aGUgb2xkIG9uZXMuXG4gICAgaWYgKHRoaXMuaGVhcnQuaW50ZXJ2YWxJZCkgY2xlYXJJbnRlcnZhbCh0aGlzLmhlYXJ0LmludGVydmFsSWQpXG4gICAgaWYgKHRoaXMuaGVhcnQudGltZW91dElkKSBjbGVhclRpbWVvdXQodGhpcy5oZWFydC50aW1lb3V0SWQpXG5cbiAgICB0aGlzLmhlYXJ0LmludGVydmFsID0gaW50ZXJ2YWxcblxuICAgIC8vIE9ubHkgc2V0IHRoZSBzaGFyZCdzIHN0YXRlIHRvIGBVbmlkZW50aWZpZWRgXG4gICAgLy8gaWYgaGVhcnRiZWF0aW5nIGhhcyBub3QgYmVlbiBzdGFydGVkIGR1ZSB0byBhbiBpZGVudGlmeSBvciByZXN1bWUgYWN0aW9uLlxuICAgIGlmIChbU2hhcmRTdGF0ZS5EaXNjb25uZWN0ZWQsIFNoYXJkU3RhdGUuT2ZmbGluZV0uaW5jbHVkZXModGhpcy5zdGF0ZSkpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFN0YXJ0IEhlYXJ0YmVhdGluZyBTaGFyZCAjJHt0aGlzLmlkfSBhYClcbiAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLlVuaWRlbnRpZmllZFxuICAgIH1cblxuICAgIC8vIFRoZSBmaXJzdCBoZWFydGJlYXQgbmVlZHMgdG8gYmUgc2VuZCB3aXRoIGEgcmFuZG9tIGRlbGF5IGJldHdlZW4gYDBgIGFuZCBgaW50ZXJ2YWxgXG4gICAgLy8gVXNpbmcgYSBgc2V0VGltZW91dChfLCBqaXR0ZXIpYCBoZXJlIHRvIGFjY29tcGxpc2ggdGhhdC5cbiAgICAvLyBgTWF0aC5yYW5kb20oKWAgY2FuIGJlIGAwYCBzbyB3ZSB1c2UgYDAuNWAgaWYgdGhpcyBoYXBwZW5zXG4gICAgLy8gUmVmZXJlbmNlOiBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheSNoZWFydGJlYXRpbmdcbiAgICBjb25zdCBqaXR0ZXIgPSBNYXRoLmNlaWwodGhpcy5oZWFydC5pbnRlcnZhbCAqIChNYXRoLnJhbmRvbSgpIHx8IDAuNSkpXG4gICAgdGhpcy5oZWFydC50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFN0YXJ0IEhlYXJ0YmVhdGluZyBTaGFyZCAjJHt0aGlzLmlkfSBiYClcbiAgICAgIGlmICghdGhpcy5pc09wZW4oKSkgcmV0dXJuXG4gICAgICBsb2dnZXIuZGVidWcoYFtHYXRld2F5XSBTdGFydCBIZWFydGJlYXRpbmcgU2hhcmQgIyR7dGhpcy5pZH0gYyAke3RoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlciF9YClcblxuICAgICAgLy8gVXNpbmcgYSBkaXJlY3Qgc29ja2V0LnNlbmQgY2FsbCBoZXJlIGJlY2F1c2UgaGVhcnRiZWF0IHJlcXVlc3RzIGFyZSByZXNlcnZlZCBieSB1cy5cbiAgICAgIHRoaXMuc29ja2V0Py5zZW5kKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdCxcbiAgICAgICAgICBkOiB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIsXG4gICAgICAgIH0pLFxuICAgICAgKVxuXG4gICAgICBsb2dnZXIuZGVidWcoYFtHYXRld2F5XSBTdGFydCBIZWFydGJlYXRpbmcgU2hhcmQgIyR7dGhpcy5pZH0gZGApXG4gICAgICB0aGlzLmhlYXJ0Lmxhc3RCZWF0ID0gRGF0ZS5ub3coKVxuICAgICAgdGhpcy5oZWFydC5hY2tub3dsZWRnZWQgPSBmYWxzZVxuXG4gICAgICAvLyBBZnRlciB0aGUgcmFuZG9tIGhlYXJ0YmVhdCBqaXR0ZXIgd2UgY2FuIHN0YXJ0IGEgbm9ybWFsIGludGVydmFsLlxuICAgICAgdGhpcy5oZWFydC5pbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoYXN5bmMgKCkgPT4ge1xuICAgICAgICBsb2dnZXIuZGVidWcoYFtHYXRld2F5XSBTdGFydCBIZWFydGJlYXRpbmcgU2hhcmQgIyR7dGhpcy5pZH0gZWApXG4gICAgICAgIGlmICghdGhpcy5pc09wZW4oKSkgcmV0dXJuXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFN0YXJ0IEhlYXJ0YmVhdGluZyBTaGFyZCAjJHt0aGlzLmlkfSBmYClcbiAgICAgICAgLy8gZ2F0ZXdheS5kZWJ1ZyhcIkdXIERFQlVHXCIsIGBSdW5uaW5nIHNldEludGVydmFsIGluIGhlYXJ0YmVhdCBmaWxlLiBTaGFyZDogJHtzaGFyZElkfWApO1xuXG4gICAgICAgIC8vIGdhdGV3YXkuZGVidWcoXCJHVyBIRUFSVEJFQVRJTkdcIiwgeyBzaGFyZElkLCBzaGFyZDogY3VycmVudFNoYXJkIH0pO1xuXG4gICAgICAgIC8vIFRoZSBTaGFyZCBkaWQgbm90IHJlY2VpdmUgYSBoZWFydGJlYXQgQUNLIGZyb20gRGlzY29yZCBpbiB0aW1lLFxuICAgICAgICAvLyB0aGVyZWZvcmUgd2UgaGF2ZSB0byBhc3N1bWUgdGhhdCB0aGUgY29ubmVjdGlvbiBoYXMgZmFpbGVkIG9yIGdvdCBcInpvbWJpZWRcIi5cbiAgICAgICAgLy8gVGhlIFNoYXJkIG5lZWRzIHRvIHN0YXJ0IGEgcmUtaWRlbnRpZnkgYWN0aW9uIGFjY29yZGluZ2x5LlxuICAgICAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I2hlYXJ0YmVhdGluZy1leGFtcGxlLWdhdGV3YXktaGVhcnRiZWF0LWFja1xuICAgICAgICBpZiAoIXRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbU2hhcmRdIEhlYXJ0YmVhdCBub3QgYWNrbm93bGVkZ2VkIGZvciBzaGFyZCAjJHt0aGlzLmlkfS5gKVxuICAgICAgICAgIHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlpvbWJpZWRDb25uZWN0aW9uLCAnWm9tYmllZCBjb25uZWN0aW9uLCBkaWQgbm90IHJlY2VpdmUgYW4gaGVhcnRiZWF0IEFDSyBpbiB0aW1lLicpXG5cbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5pZGVudGlmeSgpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhlYXJ0LmFja25vd2xlZGdlZCA9IGZhbHNlXG5cbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gU3RhcnQgSGVhcnRiZWF0aW5nIFNoYXJkICMke3RoaXMuaWR9IGdgKVxuICAgICAgICAvLyBVc2luZyBhIGRpcmVjdCBzb2NrZXQuc2VuZCBjYWxsIGhlcmUgYmVjYXVzZSBoZWFydGJlYXQgcmVxdWVzdHMgYXJlIHJlc2VydmVkIGJ5IHVzLlxuICAgICAgICB0aGlzLnNvY2tldD8uc2VuZChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0LFxuICAgICAgICAgICAgZDogdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFN0YXJ0IEhlYXJ0YmVhdGluZyBTaGFyZCAjJHt0aGlzLmlkfSBoYClcblxuICAgICAgICB0aGlzLmhlYXJ0Lmxhc3RCZWF0ID0gRGF0ZS5ub3coKVxuXG4gICAgICAgIHRoaXMuZXZlbnRzLmhlYXJ0YmVhdD8uKHRoaXMpXG4gICAgICB9LCB0aGlzLmhlYXJ0LmludGVydmFsKVxuICAgIH0sIGppdHRlcilcbiAgfVxuXG4gIC8qKiBTdG9wIHRoZSBoZWFydGJlYXRpbmcgcHJvY2VzcyB3aXRoIGRpc2NvcmQuICovXG4gIHN0b3BIZWFydGJlYXRpbmcoKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgdGhlIHJlZ3VsYXIgaGVhcnRiZWF0IGludGVydmFsLlxuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5oZWFydC5pbnRlcnZhbElkKVxuICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgU2hhcmQgZ290IGNsb3NlZCBiZWZvcmUgdGhlIGZpcnN0IGppdHRlcmVkIGhlYXJ0YmVhdC5cbiAgICAvLyBUbyBnbyBzYWZlIHdlIHNob3VsZCBjbGVhciB0aGUgcmVsYXRlZCB0aW1lb3V0IHRvby5cbiAgICBjbGVhclRpbWVvdXQodGhpcy5oZWFydC50aW1lb3V0SWQpXG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaGFyZENyZWF0ZU9wdGlvbnMge1xuICAvKiogVGhlIHNoYXJkIGlkICovXG4gIGlkOiBudW1iZXJcbiAgLyoqIFRoZSBjb25uZWN0aW9uIGRldGFpbHMgKi9cbiAgY29ubmVjdGlvbjogU2hhcmRHYXRld2F5Q29uZmlnXG4gIC8qKiBUaGUgZXZlbnQgaGFuZGxlcnMgZm9yIGV2ZW50cyBvbiB0aGUgc2hhcmQuICovXG4gIGV2ZW50czogU2hhcmRFdmVudHNcbiAgLyoqIFRoZSBoYW5kbGVyIHRvIHJlcXVlc3QgYSBzcGFjZSB0byBtYWtlIGFuIGlkZW50aWZ5IHJlcXVlc3QuICovXG4gIHJlcXVlc3RJZGVudGlmeT86ICgpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIFRoZSBoYW5kbGVyIHRvIGFsZXJ0IHRoZSBnYXRld2F5IG1hbmFnZXIgdGhhdCB0aGlzIHNoYXJkIGhhcyByZWNlaXZlZCBhIFJFQURZIGV2ZW50LiAqL1xuICBzaGFyZElzUmVhZHk/OiAoKSA9PiBQcm9taXNlPHZvaWQ+XG59XG5cbmV4cG9ydCBkZWZhdWx0IERpc2NvcmRlbm9TaGFyZFxuIl0sIm5hbWVzIjpbIkRpc2NvcmRlbm9TaGFyZCIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsIm1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljayIsInByZXZpb3VzU2VxdWVuY2VOdW1iZXIiLCJyYXRlTGltaXRSZXNldEludGVydmFsIiwic3RhdGUiLCJTaGFyZFN0YXRlIiwiT2ZmbGluZSIsInJlc3VtZUdhdGV3YXlVcmwiLCJldmVudHMiLCJvZmZsaW5lU2VuZFF1ZXVlIiwicmVzb2x2ZXMiLCJNYXAiLCJpZCIsImNvbm5lY3Rpb24iLCJoZWFydCIsImFja25vd2xlZGdlZCIsImludGVydmFsIiwicmVxdWVzdElkZW50aWZ5Iiwic2hhcmRJc1JlYWR5IiwiYnVja2V0IiwiTGVha3lCdWNrZXQiLCJtYXgiLCJjYWxjdWxhdGVTYWZlUmVxdWVzdHMiLCJyZWZpbGxBbW91bnQiLCJyZWZpbGxJbnRlcnZhbCIsImdhdGV3YXlDb25maWciLCJjb25uZWN0aW9uVXJsIiwidXJsIiwic2FmZVJlcXVlc3RzIiwiTWF0aCIsImNlaWwiLCJjaGVja09mZmxpbmUiLCJoaWdoUHJpb3JpdHkiLCJpc09wZW4iLCJQcm9taXNlIiwicmVzb2x2ZSIsInVuc2hpZnQiLCJwdXNoIiwiY2xvc2UiLCJjb2RlIiwicmVhc29uIiwic29ja2V0IiwicmVhZHlTdGF0ZSIsIk5vZGVXZWJTb2NrZXQiLCJPUEVOIiwiY29ubmVjdCIsIklkZW50aWZ5aW5nIiwiUmVzdW1pbmciLCJpbmNsdWRlcyIsIkNvbm5lY3RpbmciLCJjb25uZWN0aW5nIiwiVVJMIiwic2VhcmNoUGFyYW1zIiwic2V0IiwidmVyc2lvbiIsInRvU3RyaW5nIiwiZ2xvYmFsVGhpcyIsIkRlbm8iLCJ1bmRlZmluZWQiLCJSZWZsZWN0IiwiaGFzIiwiV2ViU29ja2V0Iiwib25lcnJvciIsImV2ZW50IiwiY29uc29sZSIsImxvZyIsImVycm9yIiwic2hhcmRJZCIsIm9uY2xvc2UiLCJoYW5kbGVDbG9zZSIsIm9ubWVzc2FnZSIsIm1lc3NhZ2UiLCJoYW5kbGVNZXNzYWdlIiwib25vcGVuIiwiVW5pZGVudGlmaWVkIiwiY29ubmVjdGVkIiwiaWRlbnRpZnkiLCJsb2dnZXIiLCJkZWJ1ZyIsIlNoYXJkU29ja2V0Q2xvc2VDb2RlcyIsIlJlSWRlbnRpZnlpbmciLCJpZGVudGlmeWluZyIsInNlbmQiLCJvcCIsIkdhdGV3YXlPcGNvZGVzIiwiSWRlbnRpZnkiLCJkIiwidG9rZW4iLCJjb21wcmVzcyIsInByb3BlcnRpZXMiLCJpbnRlbnRzIiwic2hhcmQiLCJ0b3RhbFNoYXJkcyIsInByZXNlbmNlIiwibWFrZVByZXNlbmNlIiwiaWRlbnRpZmllZCIsImRlbGV0ZSIsInJlc3VtZSIsIlJlc3VtZUNsb3NpbmdPbGRDb25uZWN0aW9uIiwic2Vzc2lvbklkIiwiUmVzdW1lIiwic2Vzc2lvbl9pZCIsInNlcSIsImFjcXVpcmUiLCJKU09OIiwic3RyaW5naWZ5Iiwic2h1dGRvd24iLCJTaHV0ZG93biIsInN0b3BIZWFydGJlYXRpbmciLCJUZXN0aW5nRmluaXNoZWQiLCJkaXNjb25uZWN0ZWQiLCJSZXNoYXJkZWQiLCJab21iaWVkQ29ubmVjdGlvbiIsIkRpc2Nvbm5lY3RlZCIsIkdhdGV3YXlDbG9zZUV2ZW50Q29kZXMiLCJVbmtub3duT3Bjb2RlIiwiTm90QXV0aGVudGljYXRlZCIsIkludmFsaWRTZXEiLCJSYXRlTGltaXRlZCIsIlNlc3Npb25UaW1lZE91dCIsIkF1dGhlbnRpY2F0aW9uRmFpbGVkIiwiSW52YWxpZFNoYXJkIiwiU2hhcmRpbmdSZXF1aXJlZCIsIkludmFsaWRBcGlWZXJzaW9uIiwiSW52YWxpZEludGVudHMiLCJEaXNhbGxvd2VkSW50ZW50cyIsIkVycm9yIiwiVW5rbm93bkVycm9yIiwiRGVjb2RlRXJyb3IiLCJBbHJlYWR5QXV0aGVudGljYXRlZCIsImluZm8iLCJoYW5kbGVEaXNjb3JkUGFja2V0IiwicGFja2V0IiwibGFzdEFjayIsIkRhdGUiLCJub3ciLCJsYXN0QmVhdCIsInJ0dCIsIkhlYXJ0YmVhdCIsImhlYXJ0YmVhdCIsIkhlbGxvIiwiaGVhcnRiZWF0X2ludGVydmFsIiwic3RhcnRIZWFydGJlYXRpbmciLCJjdXJyZW50UXVldWUiLCJxdWV1ZSIsImhlbGxvIiwiSGVhcnRiZWF0QUNLIiwiaGVhcnRiZWF0QWNrIiwiUmVjb25uZWN0IiwicmVxdWVzdGVkUmVjb25uZWN0IiwiSW52YWxpZFNlc3Npb24iLCJyZXN1bWFibGUiLCJpbnZhbGlkU2Vzc2lvbiIsImRlbGF5IiwiZmxvb3IiLCJyYW5kb20iLCJnZXQiLCJ0IiwiQ29ubmVjdGVkIiwicmVzdW1lZCIsIm1hcCIsInBheWxvYWQiLCJyZXN1bWVfZ2F0ZXdheV91cmwiLCJzIiwiZm9yd2FyZFRvQm90IiwiY2FtZWxpemUiLCJwcmVQcm9jZXNzTWVzc2FnZSIsImRhdGEiLCJCbG9iIiwiaW5mbGF0ZVN5bmMiLCJhcnJheUJ1ZmZlciIsInBhcnNlIiwiaW50ZXJ2YWxJZCIsImNsZWFySW50ZXJ2YWwiLCJ0aW1lb3V0SWQiLCJjbGVhclRpbWVvdXQiLCJqaXR0ZXIiLCJzZXRUaW1lb3V0Iiwic2V0SW50ZXJ2YWwiXSwibWFwcGluZ3MiOiJBQUFBLGtFQUFrRTs7Ozs7Ozs7Ozs7SUFXckRBLGVBQWU7ZUFBZkE7O0lBNmtCYixPQUE4QjtlQUE5Qjs7O3VCQXRsQnVEO3VCQUNGOzBCQUN6QjsyREFDRjt3QkFFd0I7Ozs7OztBQUkzQyxJQUFBLEFBQU1BLGtCQUFOLE1BQU1BO0lBOEJYQyxZQUFZQyxPQUEyQixDQUFFO1FBdkJ6QywwSEFBMEgsUUFDMUhDLDhCQUFzQztRQUN0QywwQ0FBMEMsUUFDMUNDLHlCQUF3QztRQUN4Qyw0RUFBNEUsUUFDNUVDLHlCQUFpQztRQUtqQyx3Q0FBd0MsUUFDeENDLFFBQVFDLGtCQUFVLENBQUNDLE9BQU87UUFDMUIsaUZBQWlGLFFBQ2pGQyxtQkFBMkI7UUFDM0Isc0NBQXNDLFFBQ3RDQyxTQUFzQixDQUFDO1FBQ3ZCLG1HQUFtRyxRQUNuR0MsbUJBQWlELEVBQUU7UUFDbkQsaUZBQWlGLFFBQ2pGQyxXQUFXLElBQUlDO1FBS2IsSUFBSSxDQUFDQyxFQUFFLEdBQUdaLFFBQVFZLEVBQUU7UUFDcEIsSUFBSSxDQUFDQyxVQUFV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
|
|
486
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TaGFyZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmZsYXRlU3luYyB9IGZyb20gJ25vZGU6emxpYidcbmltcG9ydCB0eXBlIHsgRGlzY29yZEdhdGV3YXlQYXlsb2FkLCBEaXNjb3JkSGVsbG8sIERpc2NvcmRSZWFkeSB9IGZyb20gJ0BkaXNjb3JkZW5vL3R5cGVzJ1xuaW1wb3J0IHsgR2F0ZXdheUNsb3NlRXZlbnRDb2RlcywgR2F0ZXdheU9wY29kZXMgfSBmcm9tICdAZGlzY29yZGVuby90eXBlcydcbmltcG9ydCB7IExlYWt5QnVja2V0LCBjYW1lbGl6ZSwgZGVsYXksIGxvZ2dlciB9IGZyb20gJ0BkaXNjb3JkZW5vL3V0aWxzJ1xuaW1wb3J0IE5vZGVXZWJTb2NrZXQgZnJvbSAnd3MnXG5pbXBvcnQge1xuICB0eXBlIEJvdFN0YXR1c1VwZGF0ZSxcbiAgdHlwZSBTaGFyZEV2ZW50cyxcbiAgdHlwZSBTaGFyZEdhdGV3YXlDb25maWcsXG4gIHR5cGUgU2hhcmRIZWFydCxcbiAgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLFxuICB0eXBlIFNoYXJkU29ja2V0UmVxdWVzdCxcbiAgU2hhcmRTdGF0ZSxcbn0gZnJvbSAnLi90eXBlcy5qcydcblxuZXhwb3J0IGNsYXNzIERpc2NvcmRlbm9TaGFyZCB7XG4gIC8qKiBUaGUgaWQgb2YgdGhlIHNoYXJkICovXG4gIGlkOiBudW1iZXJcbiAgLyoqIFRoZSBjb25uZWN0aW9uIGNvbmZpZyBkZXRhaWxzIHRoYXQgdGhpcyBzaGFyZCB3aWxsIHVzZWQgdG8gY29ubmVjdCB0byBkaXNjb3JkLiAqL1xuICBjb25uZWN0aW9uOiBTaGFyZEdhdGV3YXlDb25maWdcbiAgLyoqIFRoaXMgY29udGFpbnMgYWxsIHRoZSBoZWFydGJlYXQgaW5mb3JtYXRpb24gKi9cbiAgaGVhcnQ6IFNoYXJkSGVhcnRcbiAgLyoqIFRoZSBtYXhpbXVtIG9mIHJlcXVlc3RzIHdoaWNoIGNhbiBiZSBzZW5kIHRvIGRpc2NvcmQgcGVyIHJhdGUgbGltaXQgdGljay4gVHlwaWNhbGx5IHRoaXMgdmFsdWUgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkLiAqL1xuICBtYXhSZXF1ZXN0c1BlclJhdGVMaW1pdFRpY2s6IG51bWJlciA9IDEyMFxuICAvKiogVGhlIHByZXZpb3VzIHBheWxvYWQgc2VxdWVuY2UgbnVtYmVyLiAqL1xuICBwcmV2aW91c1NlcXVlbmNlTnVtYmVyOiBudW1iZXIgfCBudWxsID0gbnVsbFxuICAvKiogSW4gd2hpY2ggaW50ZXJ2YWwgKGluIG1pbGxpc2Vjb25kcykgdGhlIGdhdGV3YXkgcmVzZXRzIGl0J3MgcmF0ZSBsaW1pdC4gKi9cbiAgcmF0ZUxpbWl0UmVzZXRJbnRlcnZhbDogbnVtYmVyID0gNjAwMDBcbiAgLyoqIEN1cnJlbnQgc2Vzc2lvbiBpZCBvZiB0aGUgc2hhcmQgaWYgcHJlc2VudC4gKi9cbiAgc2Vzc2lvbklkPzogc3RyaW5nXG4gIC8qKiBUaGlzIGNvbnRhaW5zIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byBEaXNjb3JkLCBpZiBjdXJyZW50bHkgY29ubmVjdGVkLiAqL1xuICBzb2NrZXQ/OiBXZWJTb2NrZXRcbiAgLyoqIEN1cnJlbnQgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIHRoaXMuICovXG4gIHN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lXG4gIC8qKiBUaGUgdXJsIHByb3ZpZGVkIGJ5IGRpc2NvcmQgdG8gdXNlIHdoZW4gcmVzdW1pbmcgYSBjb25uZWN0aW9uIGZvciB0aGlzIHRoaXMuICovXG4gIHJlc3VtZUdhdGV3YXlVcmw6IHN0cmluZyA9ICcnXG4gIC8qKiBUaGUgc2hhcmQgcmVsYXRlZCBldmVudCBoYW5kbGVycy4gKi9cbiAgZXZlbnRzOiBTaGFyZEV2ZW50cyA9IHt9XG4gIC8qKiBDYWNoZSBmb3IgcGVuZGluZyBnYXRld2F5IHJlcXVlc3RzIHdoaWNoIHNob3VsZCBoYXZlIGJlZW4gc2VuZCB3aGlsZSB0aGUgZ2F0ZXdheSB3ZW50IG9mZmxpbmUuICovXG4gIG9mZmxpbmVTZW5kUXVldWU6ICgoKSA9PiB2b2lkKVtdID0gW11cbiAgLyoqIFJlc29sdmUgaW50ZXJuYWwgd2FpdGluZyBzdGF0ZXMuIE1hcHBlZCBieSBTZWxlY3RlZEV2ZW50cyA9PiBSZXNvbHZlRnVuY3Rpb24gKi9cbiAgcmVzb2x2ZXMgPSBuZXcgTWFwPCdSRUFEWScgfCAnUkVTVU1FRCcgfCAnSU5WQUxJRF9TRVNTSU9OJywgKHBheWxvYWQ6IERpc2NvcmRHYXRld2F5UGF5bG9hZCkgPT4gdm9pZD4oKVxuICAvKiogU2hhcmQgYnVja2V0LiBPbmx5IGFjY2VzcyB0aGlzIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4gQnVja2V0IGZvciBoYW5kbGluZyBzaGFyZCByZXF1ZXN0IHJhdGUgbGltaXRzLiAqL1xuICBidWNrZXQ6IExlYWt5QnVja2V0XG4gIC8qKiBMb2dnZXIgZm9yIHRoZSBidWNrZXQgKi9cbiAgbG9nZ2VyOiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz5cblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBTaGFyZENyZWF0ZU9wdGlvbnMpIHtcbiAgICB0aGlzLmlkID0gb3B0aW9ucy5pZFxuICAgIHRoaXMuY29ubmVjdGlvbiA9IG9wdGlvbnMuY29ubmVjdGlvblxuICAgIHRoaXMuZXZlbnRzID0gb3B0aW9ucy5ldmVudHNcbiAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyID8/IGxvZ2dlclxuXG4gICAgdGhpcy5oZWFydCA9IHtcbiAgICAgIGFja25vd2xlZGdlZDogZmFsc2UsXG4gICAgICBpbnRlcnZhbDogNDUwMDAsXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucmVxdWVzdElkZW50aWZ5KSB0aGlzLnJlcXVlc3RJZGVudGlmeSA9IG9wdGlvbnMucmVxdWVzdElkZW50aWZ5XG4gICAgaWYgKG9wdGlvbnMuc2hhcmRJc1JlYWR5KSB0aGlzLnNoYXJkSXNSZWFkeSA9IG9wdGlvbnMuc2hhcmRJc1JlYWR5XG5cbiAgICB0aGlzLmJ1Y2tldCA9IG5ldyBMZWFreUJ1Y2tldCh7XG4gICAgICBtYXg6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICByZWZpbGxBbW91bnQ6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICByZWZpbGxJbnRlcnZhbDogNjAwMDAsXG4gICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgIH0pXG4gIH1cblxuICAvKiogVGhlIGdhdGV3YXkgY29uZmlndXJhdGlvbiB3aGljaCBpcyB1c2VkIHRvIGNvbm5lY3QgdG8gRGlzY29yZC4gKi9cbiAgZ2V0IGdhdGV3YXlDb25maWcoKTogU2hhcmRHYXRld2F5Q29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uXG4gIH1cblxuICAvKiogVGhlIHVybCB0byBjb25uZWN0IHRvLiBJbml0aWFsbHkgdGhpcyBpcyB0aGUgZGlzY29yZCBnYXRld2F5IHVybCwgYW5kIHRoZW4gaXMgc3dpdGNoZWQgdG8gcmVzdW1lIGdhdGV3YXkgdXJsIG9uY2UgYSBSRUFEWSBpcyByZWNlaXZlZC4gKi9cbiAgZ2V0IGNvbm5lY3Rpb25VcmwoKTogc3RyaW5nIHtcbiAgICAvLyBVc2UgfHwgYW5kIG5vdCA/PyBoZXJlLiA/PyB3aWxsIGNhdXNlIGEgYnVnLlxuICAgIHJldHVybiB0aGlzLnJlc3VtZUdhdGV3YXlVcmwgfHwgdGhpcy5nYXRld2F5Q29uZmlnLnVybFxuICB9XG5cbiAgLyoqIENhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIHJlcXVlc3RzIHdoaWNoIGNhbiBzYWZlbHkgYmUgbWFkZSBwZXIgcmF0ZSBsaW1pdCBpbnRlcnZhbCwgYmVmb3JlIHRoZSBnYXRld2F5IGdldHMgZGlzY29ubmVjdGVkIGR1ZSB0byBhbiBleGNlZWRlZCByYXRlIGxpbWl0LiAqL1xuICBjYWxjdWxhdGVTYWZlUmVxdWVzdHMoKTogbnVtYmVyIHtcbiAgICAvLyAqIDIgYWRkcyBleHRyYSBzYWZldHkgbGF5ZXIgZm9yIGRpc2NvcmRzIE9QIDEgcmVxdWVzdHMgdGhhdCB3ZSBuZWVkIHRvIHJlc3BvbmQgdG9cbiAgICBjb25zdCBzYWZlUmVxdWVzdHMgPSB0aGlzLm1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljayAtIE1hdGguY2VpbCh0aGlzLnJhdGVMaW1pdFJlc2V0SW50ZXJ2YWwgLyB0aGlzLmhlYXJ0LmludGVydmFsKSAqIDJcblxuICAgIHJldHVybiBzYWZlUmVxdWVzdHMgPCAwID8gMCA6IHNhZmVSZXF1ZXN0c1xuICB9XG5cbiAgYXN5bmMgY2hlY2tPZmZsaW5lKGhpZ2hQcmlvcml0eTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzT3BlbigpKSByZXR1cm5cblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gSGlnaGVyIHByaW9yaXR5IHJlcXVlc3RzIGdldCBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS5cbiAgICAgIGlmIChoaWdoUHJpb3JpdHkpIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS51bnNoaWZ0KHJlc29sdmUpXG4gICAgICBlbHNlIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5wdXNoKHJlc29sdmUpXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBDbG9zZSB0aGUgc29ja2V0IGNvbm5lY3Rpb24gdG8gZGlzY29yZCBpZiBwcmVzZW50LiAqL1xuICBjbG9zZShjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc29ja2V0Py5yZWFkeVN0YXRlICE9PSBOb2RlV2ViU29ja2V0Lk9QRU4pIHJldHVyblxuXG4gICAgdGhpcy5zb2NrZXQ/LmNsb3NlKGNvZGUsIHJlYXNvbilcbiAgfVxuXG4gIC8qKiBDb25uZWN0IHRoZSBzaGFyZCB3aXRoIHRoZSBnYXRld2F5IGFuZCBzdGFydCBoZWFydGJlYXRpbmcuIFRoaXMgd2lsbCBub3QgaWRlbnRpZnkgdGhlIHNoYXJkIHRvIHRoZSBnYXRld2F5LiAqL1xuICBhc3luYyBjb25uZWN0KCk6IFByb21pc2U8RGlzY29yZGVub1NoYXJkPiB7XG4gICAgLy8gT25seSBzZXQgdGhlIHNoYXJkIHRvIGBDb25uZWN0aW5nYCBzdGF0ZSxcbiAgICAvLyBpZiB0aGUgY29ubmVjdGlvbiByZXF1ZXN0IGRvZXMgbm90IGNvbWUgZnJvbSBhbiBpZGVudGlmeSBvciByZXN1bWUgYWN0aW9uLlxuICAgIGlmICghW1NoYXJkU3RhdGUuSWRlbnRpZnlpbmcsIFNoYXJkU3RhdGUuUmVzdW1pbmddLmluY2x1ZGVzKHRoaXMuc3RhdGUpKSB7XG4gICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5Db25uZWN0aW5nXG4gICAgfVxuXG4gICAgdGhpcy5ldmVudHMuY29ubmVjdGluZz8uKHRoaXMpXG5cbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHRoaXMuY29ubmVjdGlvblVybClcbiAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgndicsIHRoaXMuZ2F0ZXdheUNvbmZpZy52ZXJzaW9uLnRvU3RyaW5nKCkpXG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2VuY29kaW5nJywgJ2pzb24nKVxuXG4gICAgLy8gV2UgY2hlY2sgZm9yIGJ1aWx0LWluIFdlYlNvY2tldCBpbXBsZW1lbnRhdGlvbnMgaW4gQnVuIG9yIERlbm8sIE5vZGVKUyB2MjIgaGFzIGFuIGltcGxlbWVudGF0aW9uIHRvbyBidXQgaXQgc2VlbXMgdG8gYmUgbGVzcyBvcHRpbWl6ZWQgc28gZm9yIG5vdyBpdCBpcyBiZXR0ZXIgdG8gdXNlIHRoZSB3cyBucG0gcGFja2FnZVxuICAgIGNvbnN0IHNob3VsZFVzZUJ1aWx0aW4gPSBSZWZsZWN0LmhhcyhnbG9iYWxUaGlzLCAnV2ViU29ja2V0JykgJiYgKFJlZmxlY3QuaGFzKGdsb2JhbFRoaXMsICdCdW4nKSB8fCBSZWZsZWN0LmhhcyhnbG9iYWxUaGlzLCAnRGVubycpKVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBOb2RlV2ViU29ja2V0IGRvZXNuJ3Qgc3VwcG9ydCBcImRpc3BhdGNoRXZlbnRcIiwgYW5kIHdoaWxlIHdlIGRvbid0IHVzZSBpdCwgaXQgaXMgcmVxdWlyZWQgb24gdGhlIFwiV2ViU29ja2V0XCIgdHlwZVxuICAgIGNvbnN0IHNvY2tldDogV2ViU29ja2V0ID0gc2hvdWxkVXNlQnVpbHRpbiA/IG5ldyBXZWJTb2NrZXQodXJsKSA6IG5ldyBOb2RlV2ViU29ja2V0KHVybClcbiAgICB0aGlzLnNvY2tldCA9IHNvY2tldFxuXG4gICAgc29ja2V0Lm9uZXJyb3IgPSAoZXZlbnQpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXZlbnQpXG4gICAgc29ja2V0Lm9uY2xvc2UgPSBhc3luYyAoY2xvc2VFdmVudCkgPT4gYXdhaXQgdGhpcy5oYW5kbGVDbG9zZShjbG9zZUV2ZW50KVxuICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBhc3luYyAobWVzc2FnZUV2ZW50KSA9PiBhd2FpdCB0aGlzLmhhbmRsZU1lc3NhZ2UobWVzc2FnZUV2ZW50KVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBzb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICAvLyBPbmx5IHNldCB0aGUgc2hhcmQgdG8gYFVuaWRlbnRpZmllZGAgc3RhdGUgaWYgdGhlIGNvbm5lY3Rpb24gcmVxdWVzdCBkb2VzIG5vdCBjb21lIGZyb20gYW4gaWRlbnRpZnkgb3IgcmVzdW1lIGFjdGlvbi5cbiAgICAgICAgaWYgKCFbU2hhcmRTdGF0ZS5JZGVudGlmeWluZywgU2hhcmRTdGF0ZS5SZXN1bWluZ10uaW5jbHVkZXModGhpcy5zdGF0ZSkpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5VbmlkZW50aWZpZWRcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXZlbnRzLmNvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgcmVzb2x2ZSh0aGlzKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKiogSWRlbnRpZnkgdGhlIHNoYXJkIHRvIHRoZSBnYXRld2F5LiBJZiBub3QgY29ubmVjdGVkLCB0aGlzIHdpbGwgYWxzbyBjb25uZWN0IHRoZSBzaGFyZCB0byB0aGUgZ2F0ZXdheS4gKi9cbiAgYXN5bmMgaWRlbnRpZnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQSBuZXcgaWRlbnRpZnkgaGFzIGJlZW4gcmVxdWVzdGVkIGV2ZW4gdGhvdWdoIHRoZXJlIGlzIGFscmVhZHkgYSBjb25uZWN0aW9uIG9wZW4uXG4gICAgLy8gVGhlcmVmb3JlIHdlIG5lZWQgdG8gY2xvc2UgdGhlIG9sZCBjb25uZWN0aW9uIGFuZCBoZWFydGJlYXRpbmcgYmVmb3JlIGNyZWF0aW5nIGEgbmV3IG9uZS5cbiAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYENMT1NJTkcgRVhJU1RJTkcgU0hBUkQ6ICMke3RoaXMuaWR9YClcbiAgICAgIHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlSWRlbnRpZnlpbmcsICdSZS1pZGVudGlmeWluZyBjbG9zdXJlIG9mIG9sZCBjb25uZWN0aW9uLicpXG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuSWRlbnRpZnlpbmdcbiAgICB0aGlzLmV2ZW50cy5pZGVudGlmeWluZz8uKHRoaXMpXG5cbiAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBzaGFyZCBpcyBpbiBIZWFydGJlYXRpbmcgc3RhdGUgYnV0IG5vdCBpZGVudGlmaWVkLFxuICAgIC8vIHNvIGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYWxyZWFkeSBhIGdhdGV3YXkgY29ubmVjdGlvbiBleGlzdGluZy5cbiAgICAvLyBJZiBub3Qgd2UgbmVlZCB0byBjcmVhdGUgb25lIGJlZm9yZSB3ZSBpZGVudGlmeS5cbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpXG4gICAgfVxuXG4gICAgdGhpcy5zZW5kKFxuICAgICAge1xuICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuSWRlbnRpZnksXG4gICAgICAgIGQ6IHtcbiAgICAgICAgICB0b2tlbjogYEJvdCAke3RoaXMuZ2F0ZXdheUNvbmZpZy50b2tlbn1gLFxuICAgICAgICAgIGNvbXByZXNzOiB0aGlzLmdhdGV3YXlDb25maWcuY29tcHJlc3MsXG4gICAgICAgICAgcHJvcGVydGllczogdGhpcy5nYXRld2F5Q29uZmlnLnByb3BlcnRpZXMsXG4gICAgICAgICAgaW50ZW50czogdGhpcy5nYXRld2F5Q29uZmlnLmludGVudHMsXG4gICAgICAgICAgc2hhcmQ6IFt0aGlzLmlkLCB0aGlzLmdhdGV3YXlDb25maWcudG90YWxTaGFyZHNdLFxuICAgICAgICAgIHByZXNlbmNlOiBhd2FpdCB0aGlzLm1ha2VQcmVzZW5jZT8uKCksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICApXG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdSRUFEWScsICgpID0+IHtcbiAgICAgICAgdGhpcy5ldmVudHMuaWRlbnRpZmllZD8uKHRoaXMpXG4gICAgICAgIC8vIFRlbGxzIHRoZSBtYW5hZ2VyIHRoYXQgdGhpcyBzaGFyZCBpcyByZWFkeVxuICAgICAgICB0aGlzLnNoYXJkSXNSZWFkeSgpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSlcbiAgICAgIC8vIFdoZW4gaWRlbnRpZnlpbmcgdG9vIGZhc3QsXG4gICAgICAvLyBEaXNjb3JkIHNlbmRzIGFuIGludmFsaWQgc2Vzc2lvbiBwYXlsb2FkLlxuICAgICAgLy8gVGhpcyBjYW4gc2FmZWx5IGJlIGlnbm9yZWQgdGhvdWdoIGFuZCB0aGUgc2hhcmQgc3RhcnRzIGEgbmV3IGlkZW50aWZ5IGFjdGlvbi5cbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdJTlZBTElEX1NFU1NJT04nLCAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdSRUFEWScpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqIENoZWNrIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gdG8gRGlzY29yZCBpcyBjdXJyZW50bHkgb3Blbi4gKi9cbiAgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNvY2tldD8ucmVhZHlTdGF0ZSA9PT0gTm9kZVdlYlNvY2tldC5PUEVOXG4gIH1cblxuICAvKiogQXR0ZW1wdCB0byByZXN1bWUgdGhlIHByZXZpb3VzIHNoYXJkcyBzZXNzaW9uIHdpdGggdGhlIGdhdGV3YXkuICovXG4gIGFzeW5jIHJlc3VtZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFJlc3VtaW5nIFNoYXJkICMke3RoaXMuaWR9YClcbiAgICAvLyBJdCBoYXMgYmVlbiByZXF1ZXN0ZWQgdG8gcmVzdW1lIHRoZSBTaGFyZHMgc2Vzc2lvbi5cbiAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHNoYXJkIGlzIHN0aWxsIGNvbm5lY3RlZCB3aXRoIERpc2NvcmQncyBnYXRld2F5IHRoZXJlZm9yZSB3ZSBuZWVkIHRvIGZvcmNlZnVsbHkgY2xvc2UgaXQuXG4gICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gUmVzdW1pbmcgU2hhcmQgIyR7dGhpcy5pZH0gaW4gaXNPcGVuYClcbiAgICAgIHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlc3VtZUNsb3NpbmdPbGRDb25uZWN0aW9uLCAnUmVjb25uZWN0aW5nIHRoZSBzaGFyZCwgY2xvc2luZyBvbGQgY29ubmVjdGlvbi4nKVxuICAgIH1cblxuICAgIC8vIFNoYXJkIGhhcyBuZXZlciBpZGVudGlmaWVkLCBzbyB3ZSBjYW5ub3QgcmVzdW1lLlxuICAgIGlmICghdGhpcy5zZXNzaW9uSWQpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFRyeWluZyB0byByZXN1bWUgYSBzaGFyZCAjJHt0aGlzLmlkfSB0aGF0IHdhcyBOT1QgZmlyc3QgaWRlbnRpZmllZC4gKE5vIHNlc3Npb24gaWQgZm91bmQpYClcblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaWRlbnRpZnkoKVxuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLlJlc3VtaW5nXG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFJlc3VtaW5nIFNoYXJkICMke3RoaXMuaWR9LCBiZWZvcmUgY29ubmVjdGluZ2ApXG4gICAgLy8gQmVmb3JlIHdlIGNhbiByZXN1bWUsIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gd2l0aCBEaXNjb3JkJ3MgZ2F0ZXdheS5cbiAgICBhd2FpdCB0aGlzLmNvbm5lY3QoKVxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gUmVzdW1pbmcgU2hhcmQgIyR7dGhpcy5pZH0sIGFmdGVyIGNvbm5lY3RpbmcuICR7dGhpcy5zZXNzaW9uSWR9IHwgJHt0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXJ9YClcblxuICAgIHRoaXMuc2VuZChcbiAgICAgIHtcbiAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLlJlc3VtZSxcbiAgICAgICAgZDoge1xuICAgICAgICAgIHRva2VuOiBgQm90ICR7dGhpcy5nYXRld2F5Q29uZmlnLnRva2VufWAsXG4gICAgICAgICAgc2Vzc2lvbl9pZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICAgICAgc2VxOiB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIgPz8gMCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgIClcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBSZXN1bWluZyBTaGFyZCAjJHt0aGlzLmlkfSBhZnRlciBzZW5kIHJlc3VtZWApXG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdSRVNVTUVEJywgKCkgPT4gcmVzb2x2ZSgpKVxuICAgICAgLy8gSWYgaXQgaXMgYXR0ZW1wdGVkIHRvIHJlc3VtZSB3aXRoIGFuIGludmFsaWQgc2Vzc2lvbiBpZCxcbiAgICAgIC8vIERpc2NvcmQgc2VuZHMgYW4gaW52YWxpZCBzZXNzaW9uIHBheWxvYWRcbiAgICAgIC8vIE5vdCBlcnJvcmluZyBoZXJlIHNpbmNlIGl0IGlzIGVhc3kgdGhhdCB0aGlzIGhhcHBlbnMsIGFsc28gaXQgd291bGQgYmUgbm90IGNhdGNoYWJsZVxuICAgICAgdGhpcy5yZXNvbHZlcy5zZXQoJ0lOVkFMSURfU0VTU0lPTicsICgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNvbHZlcy5kZWxldGUoJ1JFU1VNRUQnKVxuICAgICAgICByZXNvbHZlKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBTZW5kIGEgbWVzc2FnZSB0byBEaXNjb3JkLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtoaWdoUHJpb3JpdHk9ZmFsc2VdIC0gV2hldGhlciB0aGlzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNlbmQgYXNhcC5cbiAgICovXG4gIGFzeW5jIHNlbmQobWVzc2FnZTogU2hhcmRTb2NrZXRSZXF1ZXN0LCBoaWdoUHJpb3JpdHk6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEJlZm9yZSBhY3F1aXJpbmcgYSB0b2tlbiBmcm9tIHRoZSBidWNrZXQsIGNoZWNrIHdoZXRoZXIgdGhlIHNoYXJkIGlzIGN1cnJlbnRseSBvZmZsaW5lIG9yIG5vdC5cbiAgICAvLyBFbHNlIGJ1Y2tldCBhbmQgdG9rZW4gd2FpdCB0aW1lIGp1c3QgZ2V0IHdhc3RlZC5cbiAgICBhd2FpdCB0aGlzLmNoZWNrT2ZmbGluZShoaWdoUHJpb3JpdHkpXG5cbiAgICBhd2FpdCB0aGlzLmJ1Y2tldC5hY3F1aXJlKGhpZ2hQcmlvcml0eSlcblxuICAgIC8vIEl0J3MgcG9zc2libGUsIHRoYXQgdGhlIHNoYXJkIHdlbnQgb2ZmbGluZSBhZnRlciBhIHRva2VuIGhhcyBiZWVuIGFjcXVpcmVkIGZyb20gdGhlIGJ1Y2tldC5cbiAgICBhd2FpdCB0aGlzLmNoZWNrT2ZmbGluZShoaWdoUHJpb3JpdHkpXG5cbiAgICB0aGlzLnNvY2tldD8uc2VuZChKU09OLnN0cmluZ2lmeShtZXNzYWdlKSlcbiAgfVxuXG4gIC8qKiBTaHV0ZG93biB0aGUgdGhpcy4gRm9yY2VmdWxseSBkaXNjb25uZWN0IHRoZSBzaGFyZCBmcm9tIERpc2NvcmQuIFRoZSBzaGFyZCBtYXkgbm90IGF0dGVtcHQgdG8gcmVjb25uZWN0IHdpdGggRGlzY29yZC4gKi9cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jbG9zZShTaGFyZFNvY2tldENsb3NlQ29kZXMuU2h1dGRvd24sICdTaGFyZCBzaHV0dGluZyBkb3duLicpXG4gICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuT2ZmbGluZVxuICB9XG5cbiAgLyoqIEhhbmRsZSBhIGdhdGV3YXkgY29ubmVjdGlvbiBlcnJvciAqL1xuICBoYW5kbGVFcnJvcihlcnJvcjogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlci5lcnJvcihgW1NoYXJkXSBUaGVyZSB3YXMgYW4gZXJyb3IgY29ubmVjdGluZyBzaGFyZCAke3RoaXMuaWR9LmAsIGVycm9yKVxuICB9XG5cbiAgLyoqIEhhbmRsZSBhIGdhdGV3YXkgY29ubmVjdGlvbiBjbG9zZS4gKi9cbiAgYXN5bmMgaGFuZGxlQ2xvc2UoY2xvc2U6IENsb3NlRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0b3BIZWFydGJlYXRpbmcoKVxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIEdhdGV3YXkgY29ubmVjdGlvbiBjbG9zZWQgd2l0aCBjb2RlICR7Y2xvc2UuY29kZX0gKCR7Y2xvc2UucmVhc29uIHx8ICc8Tm8gcmVhc29uIHByb3ZpZGVkPid9KS5gKVxuXG4gICAgc3dpdGNoIChjbG9zZS5jb2RlKSB7XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5UZXN0aW5nRmluaXNoZWQ6IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuT2ZmbGluZVxuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgLy8gT24gdGhlc2UgY29kZXMgYSBtYW51YWwgc3RhcnQgd2lsbCBiZSBkb25lLlxuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuU2h1dGRvd246XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZUlkZW50aWZ5aW5nOlxuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVzaGFyZGVkOlxuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVzdW1lQ2xvc2luZ09sZENvbm5lY3Rpb246XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5ab21iaWVkQ29ubmVjdGlvbjoge1xuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5EaXNjb25uZWN0ZWRcbiAgICAgICAgdGhpcy5ldmVudHMuZGlzY29ubmVjdGVkPy4odGhpcylcblxuICAgICAgICAvLyBnYXRld2F5LmRlYnVnKFwiR1cgQ0xPU0VEX1JFQ09OTkVDVFwiLCB7IHNoYXJkSWQsIHBheWxvYWQ6IGV2ZW50IH0pO1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIC8vIEdhdGV3YXkgY29ubmVjdGlvbiBjbG9zZXMgd2hpY2ggcmVxdWlyZSBhIG5ldyBpZGVudGlmeS5cbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5Vbmtub3duT3Bjb2RlOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLk5vdEF1dGhlbnRpY2F0ZWQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZFNlcTpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5SYXRlTGltaXRlZDpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5TZXNzaW9uVGltZWRPdXQ6IHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ1tTaGFyZF0gR2F0ZXdheSBjb25uZWN0aW9uIGNsb3NpbmcgcmVxdWlyaW5nIHJlLWlkZW50aWZ5LicpXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLklkZW50aWZ5aW5nXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaWRlbnRpZnkoKVxuICAgICAgfVxuICAgICAgLy8gV2hlbiB0aGVzZSBjb2RlcyBhcmUgcmVjZWl2ZWQgc29tZXRoaW5nIHdlbnQgcmVhbGx5IHdyb25nLlxuICAgICAgLy8gT24gdGhvc2Ugd2UgY2Fubm90IHN0YXJ0IGEgcmVjb25uZWN0IGF0dGVtcHQuXG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuQXV0aGVudGljYXRpb25GYWlsZWQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZFNoYXJkOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlNoYXJkaW5nUmVxdWlyZWQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZEFwaVZlcnNpb246XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZEludGVudHM6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuRGlzYWxsb3dlZEludGVudHM6IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuT2ZmbGluZVxuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihjbG9zZS5yZWFzb24gfHwgJ0Rpc2NvcmQgZ2F2ZSBubyByZWFzb24hIEdHISBZb3UgYnJva2UgRGlzY29yZCEnKVxuICAgICAgfVxuICAgICAgLy8gR2F0ZXdheSBjb25uZWN0aW9uIGNsb3NlcyBvbiB3aGljaCBhIHJlc3VtZSBpcyBhbGxvd2VkLlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlVua25vd25FcnJvcjpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5EZWNvZGVFcnJvcjpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5BbHJlYWR5QXV0aGVudGljYXRlZDpcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgW1NoYXJkXSBDbG9zZWQgc2hhcmQgIyR7dGhpcy5pZH0gd2l0aCBjb2RlICR7Y2xvc2UuY29kZX0uIEF0dGVtcHRpbmcgdG8gcmVzdW1lLi4uYClcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuUmVzdW1pbmdcbiAgICAgICAgdGhpcy5ldmVudHMuZGlzY29ubmVjdGVkPy4odGhpcylcblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXN1bWUoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBIYW5kbGUgYW4gaW5jb21pbmcgZ2F0ZXdheSBtZXNzYWdlLiAqL1xuICBhc3luYyBoYW5kbGVNZXNzYWdlKG1lc3NhZ2U6IE1lc3NhZ2VFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBwcmVQcm9jZXNzTWVzc2FnZSA9IG1lc3NhZ2UuZGF0YVxuXG4gICAgLy8gSWYgbWVzc2FnZSBjb21wcmVzc2lvbiBpcyBlbmFibGVkLCBEaXNjb3JkIG1pZ2h0IHNlbmQgemxpYiBjb21wcmVzc2VkIHBheWxvYWRzLlxuICAgIGlmICh0aGlzLmdhdGV3YXlDb25maWcuY29tcHJlc3MgJiYgcHJlUHJvY2Vzc01lc3NhZ2UgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgICBwcmVQcm9jZXNzTWVzc2FnZSA9IGluZmxhdGVTeW5jKGF3YWl0IHByZVByb2Nlc3NNZXNzYWdlLmFycmF5QnVmZmVyKCkpLnRvU3RyaW5nKClcbiAgICB9XG5cbiAgICAvLyBTYWZlZ3VhcmQgaW5jYXNlIGRlY29tcHJlc3Npb24gZmFpbGVkIHRvIG1ha2UgYSBzdHJpbmcuXG4gICAgaWYgKHR5cGVvZiBwcmVQcm9jZXNzTWVzc2FnZSAhPT0gJ3N0cmluZycpIHJldHVyblxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlRGlzY29yZFBhY2tldChKU09OLnBhcnNlKHByZVByb2Nlc3NNZXNzYWdlKSBhcyBEaXNjb3JkR2F0ZXdheVBheWxvYWQpXG4gIH1cblxuICAvKiogSGFuZGxlcyBhIGluY29taW5nIGdhdGV3YXkgcGFja2V0LiAqL1xuICBhc3luYyBoYW5kbGVEaXNjb3JkUGFja2V0KHBhY2tldDogRGlzY29yZEdhdGV3YXlQYXlsb2FkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gRWRnZSBjYXNlIHN0YXJ0OiBodHRwczovL2dpdGh1Yi5jb20vZGlzY29yZGVuby9kaXNjb3JkZW5vL2lzc3Vlcy8yMzExXG4gICAgdGhpcy5oZWFydC5sYXN0QWNrID0gRGF0ZS5ub3coKVxuICAgIHRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkID0gdHJ1ZVxuICAgIC8vIEVkZ2UgY2FzZSBlbmQhXG5cbiAgICBzd2l0Y2ggKHBhY2tldC5vcCkge1xuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXQ6IHtcbiAgICAgICAgLy8gVE9ETzogY2FuIHRoaXMgYWN0dWFsbHkgaGFwcGVuXG4gICAgICAgIGlmICghdGhpcy5pc09wZW4oKSkgcmV0dXJuXG5cbiAgICAgICAgdGhpcy5oZWFydC5sYXN0QmVhdCA9IERhdGUubm93KClcbiAgICAgICAgLy8gRGlzY29yZCByYW5kb21seSBzZW5kcyB0aGlzIHJlcXVpcmluZyBhbiBpbW1lZGlhdGUgaGVhcnRiZWF0IGJhY2suXG4gICAgICAgIC8vIFVzaW5nIGEgZGlyZWN0IHNvY2tldC5zZW5kIGNhbGwgaGVyZSBiZWNhdXNlIGhlYXJ0YmVhdCByZXF1ZXN0cyBhcmUgcmVzZXJ2ZWQgYnkgdXMuXG4gICAgICAgIHRoaXMuc29ja2V0Py5zZW5kKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXQsXG4gICAgICAgICAgICBkOiB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIsXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICAgdGhpcy5ldmVudHMuaGVhcnRiZWF0Py4odGhpcylcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5IZWxsbzoge1xuICAgICAgICBjb25zdCBpbnRlcnZhbCA9IChwYWNrZXQuZCBhcyBEaXNjb3JkSGVsbG8pLmhlYXJ0YmVhdF9pbnRlcnZhbFxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIEhlbGxvIG9uIFNoYXJkICMke3RoaXMuaWR9YClcbiAgICAgICAgdGhpcy5zdGFydEhlYXJ0YmVhdGluZyhpbnRlcnZhbClcblxuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gU2hhcmRTdGF0ZS5SZXN1bWluZykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRRdWV1ZSA9IFsuLi50aGlzLmJ1Y2tldC5xdWV1ZV1cbiAgICAgICAgICAvLyBIRUxMTyBoYXMgYmVlbiBzZW5kIG9uIGEgbm9uIHJlc3VtZSBhY3Rpb24uXG4gICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBzaGFyZCBzdGFydHMgYSBuZXcgc2Vzc2lvbixcbiAgICAgICAgICAvLyB0aGVyZWZvcmUgdGhlIHJhdGUgbGltaXQgaW50ZXJ2YWwgaGFzIGJlZW4gcmVzZXQgdG9vLlxuICAgICAgICAgIHRoaXMuYnVja2V0ID0gbmV3IExlYWt5QnVja2V0KHtcbiAgICAgICAgICAgIG1heDogdGhpcy5jYWxjdWxhdGVTYWZlUmVxdWVzdHMoKSxcbiAgICAgICAgICAgIHJlZmlsbEludGVydmFsOiA2MDAwMCxcbiAgICAgICAgICAgIHJlZmlsbEFtb3VudDogdGhpcy5jYWxjdWxhdGVTYWZlUmVxdWVzdHMoKSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgLy8gUXVldWUgc2hvdWxkIG5vdCBiZSBsb3N0IG9uIGEgcmUtaWRlbnRpZnkuXG4gICAgICAgICAgdGhpcy5idWNrZXQucXVldWUudW5zaGlmdCguLi5jdXJyZW50UXVldWUpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV2ZW50cy5oZWxsbz8uKHRoaXMpXG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0QUNLOiB7XG4gICAgICAgIC8vIE1hbnVhbGx5IGNhbGN1bGF0aW5nIHRoZSByb3VuZCB0cmlwIHRpbWUgZm9yIHVzZXJzIHdobyBuZWVkIGl0LlxuICAgICAgICBpZiAodGhpcy5oZWFydC5sYXN0QmVhdCkge1xuICAgICAgICAgIHRoaXMuaGVhcnQucnR0ID0gdGhpcy5oZWFydC5sYXN0QWNrIC0gdGhpcy5oZWFydC5sYXN0QmVhdFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ldmVudHMuaGVhcnRiZWF0QWNrPy4odGhpcylcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5SZWNvbm5lY3Q6IHtcbiAgICAgICAgLy8gICBnYXRld2F5LmRlYnVnKFwiR1cgUkVDT05ORUNUXCIsIHsgc2hhcmRJZCB9KTtcblxuICAgICAgICB0aGlzLmV2ZW50cy5yZXF1ZXN0ZWRSZWNvbm5lY3Q/Lih0aGlzKVxuXG4gICAgICAgIGF3YWl0IHRoaXMucmVzdW1lKClcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5JbnZhbGlkU2Vzc2lvbjoge1xuICAgICAgICBjb25zdCByZXN1bWFibGUgPSBwYWNrZXQuZCBhcyBib29sZWFuXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFJlY2VpdmVkIEludmFsaWQgU2Vzc2lvbiBmb3IgU2hhcmQgIyR7dGhpcy5pZH0gd2l0aCByZXN1bWVhYmxlIGFzICR7cmVzdW1hYmxlLnRvU3RyaW5nKCl9YClcblxuICAgICAgICB0aGlzLmV2ZW50cy5pbnZhbGlkU2Vzc2lvbj8uKHRoaXMsIHJlc3VtYWJsZSlcblxuICAgICAgICAvLyBXZSBuZWVkIHRvIHdhaXQgZm9yIGEgcmFuZG9tIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gMSBhbmQgNVxuICAgICAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I3Jlc3VtaW5nXG4gICAgICAgIGF3YWl0IGRlbGF5KE1hdGguZmxvb3IoKE1hdGgucmFuZG9tKCkgKiA0ICsgMSkgKiAxMDAwKSlcblxuICAgICAgICB0aGlzLnJlc29sdmVzLmdldCgnSU5WQUxJRF9TRVNTSU9OJyk/LihwYWNrZXQpXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdJTlZBTElEX1NFU1NJT04nKVxuXG4gICAgICAgIC8vIFdoZW4gcmVzdW1hYmxlIGlzIGZhbHNlIHdlIG5lZWQgdG8gcmUtaWRlbnRpZnlcbiAgICAgICAgaWYgKCFyZXN1bWFibGUpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3RJZGVudGlmeSgpXG5cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHNlc3Npb24gaXMgaW52YWxpZCBidXQgYXBwYXJlbnRseSBpdCBpcyByZXN1bWFibGVcbiAgICAgICAgYXdhaXQgdGhpcy5yZXN1bWUoKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChwYWNrZXQudCkge1xuICAgICAgY2FzZSAnUkVTVU1FRCc6XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLkNvbm5lY3RlZFxuICAgICAgICB0aGlzLmV2ZW50cy5yZXN1bWVkPy4odGhpcylcblxuICAgICAgICAvLyBDb250aW51ZSB0aGUgcmVxdWVzdHMgd2hpY2ggaGF2ZSBiZWVuIHF1ZXVlZCBzaW5jZSB0aGUgc2hhcmQgd2VudCBvZmZsaW5lLlxuICAgICAgICB0aGlzLm9mZmxpbmVTZW5kUXVldWUuZm9yRWFjaCgocmVzb2x2ZSkgPT4gcmVzb2x2ZSgpKVxuICAgICAgICAvLyBTZXR0aW5nIHRoZSBsZW5ndGggdG8gMCB3aWxsIGRlbGV0ZSB0aGUgZWxlbWVudHMgaW4gaXRcbiAgICAgICAgdGhpcy5vZmZsaW5lU2VuZFF1ZXVlLmxlbmd0aCA9IDBcblxuICAgICAgICB0aGlzLnJlc29sdmVzLmdldCgnUkVTVU1FRCcpPy4ocGFja2V0KVxuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnUkVTVU1FRCcpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdSRUFEWSc6IHtcbiAgICAgICAgLy8gSW1wb3J0YW50IGZvciBmdXR1cmUgcmVzdW1lcy5cbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHBhY2tldC5kIGFzIERpc2NvcmRSZWFkeVxuXG4gICAgICAgIHRoaXMucmVzdW1lR2F0ZXdheVVybCA9IHBheWxvYWQucmVzdW1lX2dhdGV3YXlfdXJsXG5cbiAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSBwYXlsb2FkLnNlc3Npb25faWRcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuQ29ubmVjdGVkXG5cbiAgICAgICAgLy8gQ29udGludWUgdGhlIHJlcXVlc3RzIHdoaWNoIGhhdmUgYmVlbiBxdWV1ZWQgc2luY2UgdGhlIHNoYXJkIHdlbnQgb2ZmbGluZS5cbiAgICAgICAgLy8gSW1wb3J0YW50IHdoZW4gdGhpcyBpcyBhIHJlLWlkZW50aWZ5XG4gICAgICAgIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5mb3JFYWNoKChyZXNvbHZlKSA9PiByZXNvbHZlKCkpXG4gICAgICAgIC8vIFNldHRpbmcgdGhlIGxlbmd0aCB0byAwIHdpbGwgZGVsZXRlIHRoZSBlbGVtZW50cyBpbiBpdFxuICAgICAgICB0aGlzLm9mZmxpbmVTZW5kUXVldWUubGVuZ3RoID0gMFxuXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZ2V0KCdSRUFEWScpPy4ocGFja2V0KVxuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnUkVBRFknKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgc2VxdWVuY2UgbnVtYmVyIGlmIGl0IGlzIHByZXNlbnRcbiAgICAvLyBgc2AgY2FuIGJlIGVpdGhlciBgbnVsbGAgb3IgYSBgbnVtYmVyYC5cbiAgICAvLyBJbiBvcmRlciB0byBwcmV2ZW50IHVwZGF0ZSBtaXNzZXMgd2hlbiBgc2AgaXMgYDBgIHdlIGNoZWNrIGFnYWluc3QgbnVsbC5cbiAgICBpZiAocGFja2V0LnMgIT09IG51bGwpIHtcbiAgICAgIHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlciA9IHBhY2tldC5zXG4gICAgfVxuXG4gICAgdGhpcy5mb3J3YXJkVG9Cb3QocGFja2V0KVxuICB9XG5cbiAgZm9yd2FyZFRvQm90KHBhY2tldDogRGlzY29yZEdhdGV3YXlQYXlsb2FkKTogdm9pZCB7XG4gICAgLy8gVGhlIG5lY2Vzc2FyeSBoYW5kbGluZyByZXF1aXJlZCBmb3IgdGhlIFNoYXJkcyBjb25uZWN0aW9uIGhhcyBiZWVuIGZpbmlzaGVkLlxuICAgIC8vIE5vdyB0aGUgZXZlbnQgY2FuIGJlIHNhZmVseSBmb3J3YXJkZWQuXG4gICAgdGhpcy5ldmVudHMubWVzc2FnZT8uKHRoaXMsIGNhbWVsaXplKHBhY2tldCkpXG4gIH1cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGluIG9yZGVyIHRvIG1ha2UgdGhlIHNoYXJkcyBwcmVzZW5jZS5cbiAgICogYXN5bmMgaW4gY2FzZSBkZXZzIGNyZWF0ZSB0aGUgcHJlc2VuY2UgYmFzZWQgb24gZWcuIGRhdGFiYXNlIHZhbHVlcy5cbiAgICogUGFzc2luZyB0aGUgc2hhcmQncyBpZCB0aGVyZSB0byBtYWtlIGl0IGVhc2llciBmb3IgdGhlIGRldiB0byB1c2UgdGhpcyBmdW5jdGlvbi5cbiAgICovXG4gIGFzeW5jIG1ha2VQcmVzZW5jZSgpOiBQcm9taXNlPEJvdFN0YXR1c1VwZGF0ZSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVyblxuICB9XG5cbiAgLyoqIFRoaXMgZnVuY3Rpb24gY29tbXVuaWNhdGVzIHdpdGggdGhlIG1hbmFnZW1lbnQgcHJvY2VzcywgaW4gb3JkZXIgdG8ga25vdyB3aGV0aGVyIGl0cyBmcmVlIHRvIGlkZW50aWZ5LiBXaGVuIHRoaXMgZnVuY3Rpb24gcmVzb2x2ZXMsIHRoaXMgbWVhbnMgdGhhdCB0aGUgc2hhcmQgaXMgYWxsb3dlZCB0byBzZW5kIGFuIGlkZW50aWZ5IHBheWxvYWQgdG8gZGlzY29yZC4gKi9cbiAgYXN5bmMgcmVxdWVzdElkZW50aWZ5KCk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogVGhpcyBmdW5jdGlvbiBjb21tdW5pY2F0ZXMgd2l0aCB0aGUgbWFuYWdlbWVudCBwcm9jZXNzLCBpbiBvcmRlciB0byB0ZWxsIGl0IGNhbiBpZGVudGlmeSB0aGUgbmV4dCBzaGFyZC4gKi9cbiAgYXN5bmMgc2hhcmRJc1JlYWR5KCk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogU3RhcnQgc2VuZGluZyBoZWFydGJlYXQgcGF5bG9hZHMgdG8gRGlzY29yZCBpbiB0aGUgcHJvdmlkZWQgaW50ZXJ2YWwuICovXG4gIHN0YXJ0SGVhcnRiZWF0aW5nKGludGVydmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBTdGFydCBoZWFydGJlYXRpbmcgb24gc2hhcmQgIyR7dGhpcy5pZH1gKVxuXG4gICAgLy8gSWYgb2xkIGhlYXJ0YmVhc3QgZXhpc3QgbGlrZSBhZnRlciByZXN1bWUsIGNsZWFyIHRoZSBvbGQgb25lcy5cbiAgICBpZiAodGhpcy5oZWFydC5pbnRlcnZhbElkKSBjbGVhckludGVydmFsKHRoaXMuaGVhcnQuaW50ZXJ2YWxJZClcbiAgICBpZiAodGhpcy5oZWFydC50aW1lb3V0SWQpIGNsZWFyVGltZW91dCh0aGlzLmhlYXJ0LnRpbWVvdXRJZClcblxuICAgIHRoaXMuaGVhcnQuaW50ZXJ2YWwgPSBpbnRlcnZhbFxuXG4gICAgLy8gT25seSBzZXQgdGhlIHNoYXJkJ3Mgc3RhdGUgdG8gYFVuaWRlbnRpZmllZGBcbiAgICAvLyBpZiBoZWFydGJlYXRpbmcgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgZHVlIHRvIGFuIGlkZW50aWZ5IG9yIHJlc3VtZSBhY3Rpb24uXG4gICAgaWYgKFtTaGFyZFN0YXRlLkRpc2Nvbm5lY3RlZCwgU2hhcmRTdGF0ZS5PZmZsaW5lXS5pbmNsdWRlcyh0aGlzLnN0YXRlKSkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gU2hhcmQgaXMgZGlzY29ubmVjdGVkIG9yIG9mZmxpbmUgYnV0IHRoZSBoZWFydGJlYXQgd2FzIHN0YXJ0ZWQgIyR7dGhpcy5pZH1gKVxuICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuVW5pZGVudGlmaWVkXG4gICAgfVxuXG4gICAgLy8gVGhlIGZpcnN0IGhlYXJ0YmVhdCBuZWVkcyB0byBiZSBzZW5kIHdpdGggYSByYW5kb20gZGVsYXkgYmV0d2VlbiBgMGAgYW5kIGBpbnRlcnZhbGBcbiAgICAvLyBVc2luZyBhIGBzZXRUaW1lb3V0KF8sIGppdHRlcilgIGhlcmUgdG8gYWNjb21wbGlzaCB0aGF0LlxuICAgIC8vIGBNYXRoLnJhbmRvbSgpYCBjYW4gYmUgYDBgIHNvIHdlIHVzZSBgMC41YCBpZiB0aGlzIGhhcHBlbnNcbiAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I2hlYXJ0YmVhdGluZ1xuICAgIGNvbnN0IGppdHRlciA9IE1hdGguY2VpbCh0aGlzLmhlYXJ0LmludGVydmFsICogKE1hdGgucmFuZG9tKCkgfHwgMC41KSlcblxuICAgIHRoaXMuaGVhcnQudGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBCZWdpbm5pbmcgaGVhcnRiZWF0aW5nIHByb2Nlc3MgZm9yIHNoYXJkICMke3RoaXMuaWR9YClcblxuICAgICAgaWYgKCF0aGlzLmlzT3BlbigpKSByZXR1cm5cblxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gSGVhcnRiZWF0aW5nIG9uICMke3RoaXMuaWR9LiBQcmV2aW91cyBzZXF1ZW5jZSBudW1iZXI6ICR7dGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyfWApXG5cbiAgICAgIC8vIFVzaW5nIGEgZGlyZWN0IHNvY2tldC5zZW5kIGNhbGwgaGVyZSBiZWNhdXNlIGhlYXJ0YmVhdCByZXF1ZXN0cyBhcmUgcmVzZXJ2ZWQgYnkgdXMuXG4gICAgICB0aGlzLnNvY2tldD8uc2VuZChcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXQsXG4gICAgICAgICAgZDogdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyLFxuICAgICAgICB9KSxcbiAgICAgIClcblxuICAgICAgdGhpcy5oZWFydC5sYXN0QmVhdCA9IERhdGUubm93KClcbiAgICAgIHRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkID0gZmFsc2VcblxuICAgICAgLy8gQWZ0ZXIgdGhlIHJhbmRvbSBoZWFydGJlYXQgaml0dGVyIHdlIGNhbiBzdGFydCBhIG5vcm1hbCBpbnRlcnZhbC5cbiAgICAgIHRoaXMuaGVhcnQuaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmlzT3BlbigpKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gU2hhcmQgIyR7dGhpcy5pZH0gaXMgbm90IG9wZW4sIGJ1dCBhdHRlbXB0ZWQgaGVhcnRiZWF0LCBpZ25vcmluZy5gKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIFNoYXJkIGRpZCBub3QgcmVjZWl2ZSBhIGhlYXJ0YmVhdCBBQ0sgZnJvbSBEaXNjb3JkIGluIHRpbWUsXG4gICAgICAgIC8vIHRoZXJlZm9yZSB3ZSBoYXZlIHRvIGFzc3VtZSB0aGF0IHRoZSBjb25uZWN0aW9uIGhhcyBmYWlsZWQgb3IgZ290IFwiem9tYmllZFwiLlxuICAgICAgICAvLyBUaGUgU2hhcmQgbmVlZHMgdG8gc3RhcnQgYSByZS1pZGVudGlmeSBhY3Rpb24gYWNjb3JkaW5nbHkuXG4gICAgICAgIC8vIFJlZmVyZW5jZTogaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL2dhdGV3YXkjaGVhcnRiZWF0aW5nLWV4YW1wbGUtZ2F0ZXdheS1oZWFydGJlYXQtYWNrXG4gICAgICAgIGlmICghdGhpcy5oZWFydC5hY2tub3dsZWRnZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBIZWFydGJlYXQgbm90IGFja25vd2xlZGdlZCBmb3Igc2hhcmQgIyR7dGhpcy5pZH0uIEFzc3VtaW5nIHpvbWJpZWQgY29ubmVjdGlvbi5gKVxuICAgICAgICAgIHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlpvbWJpZWRDb25uZWN0aW9uLCAnWm9tYmllZCBjb25uZWN0aW9uLCBkaWQgbm90IHJlY2VpdmUgYW4gaGVhcnRiZWF0IEFDSyBpbiB0aW1lLicpXG5cbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5pZGVudGlmeSgpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBIZWFydGJlYXRpbmcgb24gIyR7dGhpcy5pZH0uIFByZXZpb3VzIHNlcXVlbmNlIG51bWJlcjogJHt0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXJ9YClcblxuICAgICAgICAvLyBVc2luZyBhIGRpcmVjdCBzb2NrZXQuc2VuZCBjYWxsIGhlcmUgYmVjYXVzZSBoZWFydGJlYXQgcmVxdWVzdHMgYXJlIHJlc2VydmVkIGJ5IHVzLlxuICAgICAgICB0aGlzLnNvY2tldD8uc2VuZChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0LFxuICAgICAgICAgICAgZDogdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG5cbiAgICAgICAgdGhpcy5oZWFydC5sYXN0QmVhdCA9IERhdGUubm93KClcbiAgICAgICAgdGhpcy5oZWFydC5hY2tub3dsZWRnZWQgPSBmYWxzZVxuXG4gICAgICAgIHRoaXMuZXZlbnRzLmhlYXJ0YmVhdD8uKHRoaXMpXG4gICAgICB9LCB0aGlzLmhlYXJ0LmludGVydmFsKVxuICAgIH0sIGppdHRlcilcbiAgfVxuXG4gIC8qKiBTdG9wIHRoZSBoZWFydGJlYXRpbmcgcHJvY2VzcyB3aXRoIGRpc2NvcmQuICovXG4gIHN0b3BIZWFydGJlYXRpbmcoKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgdGhlIHJlZ3VsYXIgaGVhcnRiZWF0IGludGVydmFsLlxuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5oZWFydC5pbnRlcnZhbElkKVxuICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgU2hhcmQgZ290IGNsb3NlZCBiZWZvcmUgdGhlIGZpcnN0IGppdHRlcmVkIGhlYXJ0YmVhdC5cbiAgICAvLyBUbyBnbyBzYWZlIHdlIHNob3VsZCBjbGVhciB0aGUgcmVsYXRlZCB0aW1lb3V0IHRvby5cbiAgICBjbGVhclRpbWVvdXQodGhpcy5oZWFydC50aW1lb3V0SWQpXG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaGFyZENyZWF0ZU9wdGlvbnMge1xuICAvKiogVGhlIHNoYXJkIGlkICovXG4gIGlkOiBudW1iZXJcbiAgLyoqIFRoZSBjb25uZWN0aW9uIGRldGFpbHMgKi9cbiAgY29ubmVjdGlvbjogU2hhcmRHYXRld2F5Q29uZmlnXG4gIC8qKiBUaGUgZXZlbnQgaGFuZGxlcnMgZm9yIGV2ZW50cyBvbiB0aGUgc2hhcmQuICovXG4gIGV2ZW50czogU2hhcmRFdmVudHNcbiAgLyoqIFRoZSBsb2dnZXIgZm9yIHRoZSBzaGFyZCAqL1xuICBsb2dnZXI/OiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz5cbiAgLyoqIFRoZSBoYW5kbGVyIHRvIHJlcXVlc3QgYSBzcGFjZSB0byBtYWtlIGFuIGlkZW50aWZ5IHJlcXVlc3QuICovXG4gIHJlcXVlc3RJZGVudGlmeT86ICgpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIFRoZSBoYW5kbGVyIHRvIGFsZXJ0IHRoZSBnYXRld2F5IG1hbmFnZXIgdGhhdCB0aGlzIHNoYXJkIGhhcyByZWNlaXZlZCBhIFJFQURZIGV2ZW50LiAqL1xuICBzaGFyZElzUmVhZHk/OiAoKSA9PiBQcm9taXNlPHZvaWQ+XG59XG5cbmV4cG9ydCBkZWZhdWx0IERpc2NvcmRlbm9TaGFyZFxuIl0sIm5hbWVzIjpbIkRpc2NvcmRlbm9TaGFyZCIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsIm1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljayIsInByZXZpb3VzU2VxdWVuY2VOdW1iZXIiLCJyYXRlTGltaXRSZXNldEludGVydmFsIiwic3RhdGUiLCJTaGFyZFN0YXRlIiwiT2ZmbGluZSIsInJlc3VtZUdhdGV3YXlVcmwiLCJldmVudHMiLCJvZmZsaW5lU2VuZFF1ZXVlIiwicmVzb2x2ZXMiLCJNYXAiLCJpZCIsImNvbm5lY3Rpb24iLCJsb2dnZXIiLCJoZWFydCIsImFja25vd2xlZGdlZCIsImludGVydmFsIiwicmVxdWVzdElkZW50aWZ5Iiwic2hhcmRJc1JlYWR5IiwiYnVja2V0IiwiTGVha3lCdWNrZXQiLCJtYXgiLCJjYWxjdWxhdGVTYWZlUmVxdWVzdHMiLCJyZWZpbGxBbW91bnQiLCJyZWZpbGxJbnRlcnZhbCIsImdhdGV3YXlDb25maWciLCJjb25uZWN0aW9uVXJsIiwidXJsIiwic2FmZVJlcXVlc3RzIiwiTWF0aCIsImNlaWwiLCJjaGVja09mZmxpbmUiLCJoaWdoUHJpb3JpdHkiLCJpc09wZW4iLCJQcm9taXNlIiwicmVzb2x2ZSIsInVuc2hpZnQiLCJwdXNoIiwiY2xvc2UiLCJjb2RlIiwicmVhc29uIiwic29ja2V0IiwicmVhZHlTdGF0ZSIsIk5vZGVXZWJTb2NrZXQiLCJPUEVOIiwiY29ubmVjdCIsIklkZW50aWZ5aW5nIiwiUmVzdW1pbmciLCJpbmNsdWRlcyIsIkNvbm5lY3RpbmciLCJjb25uZWN0aW5nIiwiVVJMIiwic2VhcmNoUGFyYW1zIiwic2V0IiwidmVyc2lvbiIsInRvU3RyaW5nIiwic2hvdWxkVXNlQnVpbHRpbiIsIlJlZmxlY3QiLCJoYXMiLCJnbG9iYWxUaGlzIiwiV2ViU29ja2V0Iiwib25lcnJvciIsImV2ZW50IiwiaGFuZGxlRXJyb3IiLCJvbmNsb3NlIiwiY2xvc2VFdmVudCIsImhhbmRsZUNsb3NlIiwib25tZXNzYWdlIiwibWVzc2FnZUV2ZW50IiwiaGFuZGxlTWVzc2FnZSIsIm9ub3BlbiIsIlVuaWRlbnRpZmllZCIsImNvbm5lY3RlZCIsImlkZW50aWZ5IiwiZGVidWciLCJTaGFyZFNvY2tldENsb3NlQ29kZXMiLCJSZUlkZW50aWZ5aW5nIiwiaWRlbnRpZnlpbmciLCJzZW5kIiwib3AiLCJHYXRld2F5T3Bjb2RlcyIsIklkZW50aWZ5IiwiZCIsInRva2VuIiwiY29tcHJlc3MiLCJwcm9wZXJ0aWVzIiwiaW50ZW50cyIsInNoYXJkIiwidG90YWxTaGFyZHMiLCJwcmVzZW5jZSIsIm1ha2VQcmVzZW5jZSIsImlkZW50aWZpZWQiLCJkZWxldGUiLCJyZXN1bWUiLCJSZXN1bWVDbG9zaW5nT2xkQ29ubmVjdGlvbiIsInNlc3Npb25JZCIsIlJlc3VtZSIsInNlc3Npb25faWQiLCJzZXEiLCJtZXNzYWdlIiwiYWNxdWlyZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJzaHV0ZG93biIsIlNodXRkb3duIiwiZXJyb3IiLCJzdG9wSGVhcnRiZWF0aW5nIiwiVGVzdGluZ0ZpbmlzaGVkIiwiZGlzY29ubmVjdGVkIiwiUmVzaGFyZGVkIiwiWm9tYmllZENvbm5lY3Rpb24iLCJEaXNjb25uZWN0ZWQiLCJHYXRld2F5Q2xvc2VFdmVudENvZGVzIiwiVW5rbm93bk9wY29kZSIsIk5vdEF1dGhlbnRpY2F0ZWQiLCJJbnZhbGlkU2VxIiwiUmF0ZUxpbWl0ZWQiLCJTZXNzaW9uVGltZWRPdXQiLCJBdXRoZW50aWNhdGlvbkZhaWxlZCIsIkludmFsaWRTaGFyZCIsIlNoYXJkaW5nUmVxdWlyZWQiLCJJbnZhbGlkQXBpVmVyc2lvbiIsIkludmFsaWRJbnRlbnRzIiwiRGlzYWxsb3dlZEludGVudHMiLCJFcnJvciIsIlVua25vd25FcnJvciIsIkRlY29kZUVycm9yIiwiQWxyZWFkeUF1dGhlbnRpY2F0ZWQiLCJpbmZvIiwicHJlUHJvY2Vzc01lc3NhZ2UiLCJkYXRhIiwiQmxvYiIsImluZmxhdGVTeW5jIiwiYXJyYXlCdWZmZXIiLCJoYW5kbGVEaXNjb3JkUGFja2V0IiwicGFyc2UiLCJwYWNrZXQiLCJsYXN0QWNrIiwiRGF0ZSIsIm5vdyIsIkhlYXJ0YmVhdCIsImxhc3RCZWF0IiwiaGVhcnRiZWF0IiwiSGVsbG8iLCJoZWFydGJlYXRfaW50ZXJ2YWwiLCJzdGFydEhlYXJ0YmVhdGluZyIsImN1cnJlbnRRdWV1ZSIsInF1ZXVlIiwiaGVsbG8iLCJIZWFydGJlYXRBQ0siLCJydHQiLCJoZWFydGJlYXRBY2siLCJSZWNvbm5lY3QiLCJyZXF1ZXN0ZWRSZWNvbm5lY3QiLCJJbnZhbGlkU2Vzc2lvbiIsInJlc3VtYWJsZSIsImludmFsaWRTZXNzaW9uIiwiZGVsYXkiLCJmbG9vciIsInJhbmRvbSIsImdldCIsInQiLCJDb25uZWN0ZWQiLCJyZXN1bWVkIiwiZm9yRWFjaCIsImxlbmd0aCIsInBheWxvYWQiLCJyZXN1bWVfZ2F0ZXdheV91cmwiLCJzIiwiZm9yd2FyZFRvQm90IiwiY2FtZWxpemUiLCJpbnRlcnZhbElkIiwiY2xlYXJJbnRlcnZhbCIsInRpbWVvdXRJZCIsImNsZWFyVGltZW91dCIsImppdHRlciIsInNldFRpbWVvdXQiLCJzZXRJbnRlcnZhbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7SUFlYUEsZUFBZTtlQUFmQTs7SUF3bEJiLE9BQThCO2VBQTlCOzs7MEJBdm1CNEI7dUJBRTJCO3VCQUNGOzJEQUMzQjt3QkFTbkI7Ozs7OztBQUVBLElBQUEsQUFBTUEsa0JBQU4sTUFBTUE7SUFnQ1hDLFlBQVlDLE9BQTJCLENBQUU7UUF6QnpDLDBIQUEwSCxRQUMxSEMsOEJBQXNDO1FBQ3RDLDBDQUEwQyxRQUMxQ0MseUJBQXdDO1FBQ3hDLDRFQUE0RSxRQUM1RUMseUJBQWlDO1FBS2pDLHdDQUF3QyxRQUN4Q0MsUUFBUUMsa0JBQVUsQ0FBQ0MsT0FBTztRQUMxQixpRkFBaUYsUUFDakZDLG1CQUEyQjtRQUMzQixzQ0FBc0MsUUFDdENDLFNBQXNCLENBQUM7UUFDdkIsbUdBQW1HLFFBQ25HQyxtQkFBbUMsRUFBRTtRQUNyQyxpRkFBaUYsUUFDakZDLFdBQVcsSUFBSUM7UUFPYixJQUFJLENBQUNDLEVBQUUsR0FBR1osUUFBUVksRUFBRTtRQUNwQixJQUFJLENBQUNDLFVBQVUsR0FBR2IsUUFBUWEsVUFBVTtRQUNwQyxJQUFJLENBQUNMLE1BQU0sR0FBR1IsUUFBUVEsTUFBTTtRQUM1QixJQUFJLENBQUNNLE1BQU0sR0FBR2QsUUFBUWMsTUFBTSxJQUFJQSxhQUFNO1FBRXRDLElBQUksQ0FBQ0MsS0FBSyxHQUFHO1lBQ1hDLGNBQWM7WUFDZEMsVUFBVTtRQUNaO1FBRUEsSUFBSWpCLFFBQVFrQixlQUFlLEVBQUUsSUFBSSxDQUFDQSxlQUFlLEdBQUdsQixRQUFRa0IsZUFBZTtRQUMzRSxJQUFJbEIsUUFBUW1CLFlBQVksRUFBRSxJQUFJLENBQUNBLFlBQVksR0FBR25CLFFBQVFtQixZQUFZO1FBRWxFLElBQUksQ0FBQ0MsTUFBTSxHQUFHLElBQUlDLGtCQUFXLENB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
|